From 71b0e7a455a9a99c1109287cc550012039de5988 Mon Sep 17 00:00:00 2001 From: David Stone Date: Sun, 2 Feb 2025 01:22:03 -0700 Subject: [PATCH] Use jetpack autoloader and composer instead of namespace rewrite --- composer.json | 144 +- composer.lock | 4130 ++- dependencies/amphp/amp/lib/CallableMaker.php | 75 - .../amphp/amp/lib/CancellationToken.php | 46 - .../amphp/amp/lib/CancellationTokenSource.php | 142 - .../amphp/amp/lib/CancelledException.php | 17 - dependencies/amphp/amp/lib/Coroutine.php | 132 - dependencies/amphp/amp/lib/Deferred.php | 70 - dependencies/amphp/amp/lib/Delayed.php | 52 - dependencies/amphp/amp/lib/Emitter.php | 78 - dependencies/amphp/amp/lib/Failure.php | 46 - .../amphp/amp/lib/Internal/Placeholder.php | 159 - .../amp/lib/Internal/PrivateIterator.php | 41 - .../amphp/amp/lib/Internal/PrivatePromise.php | 22 - .../amphp/amp/lib/Internal/Producer.php | 173 - .../amp/lib/Internal/ResolutionQueue.php | 82 - .../amphp/amp/lib/Internal/functions.php | 94 - .../amphp/amp/lib/InvalidYieldError.php | 27 - dependencies/amphp/amp/lib/Iterator.php | 33 - dependencies/amphp/amp/lib/LazyPromise.php | 38 - dependencies/amphp/amp/lib/Loop.php | 425 - dependencies/amphp/amp/lib/Loop/Driver.php | 649 - .../amphp/amp/lib/Loop/DriverFactory.php | 55 - dependencies/amphp/amp/lib/Loop/EvDriver.php | 258 - .../amphp/amp/lib/Loop/EventDriver.php | 281 - .../amp/lib/Loop/Internal/TimerQueue.php | 147 - .../amp/lib/Loop/InvalidWatcherError.php | 30 - .../amphp/amp/lib/Loop/NativeDriver.php | 365 - .../amphp/amp/lib/Loop/TracingDriver.php | 197 - .../lib/Loop/UnsupportedFeatureException.php | 12 - dependencies/amphp/amp/lib/Loop/UvDriver.php | 285 - dependencies/amphp/amp/lib/Loop/Watcher.php | 47 - .../amphp/amp/lib/MultiReasonException.php | 25 - .../amphp/amp/lib/NullCancellationToken.php | 50 - dependencies/amphp/amp/lib/Producer.php | 38 - dependencies/amphp/amp/lib/Promise.php | 37 - dependencies/amphp/amp/lib/Struct.php | 68 - dependencies/amphp/amp/lib/Success.php | 53 - .../amp/lib/TimeoutCancellationToken.php | 65 - .../amphp/amp/lib/TimeoutException.php | 19 - dependencies/amphp/amp/lib/functions.php | 725 - .../lib/Base64/Base64DecodingInputStream.php | 51 - .../lib/Base64/Base64DecodingOutputStream.php | 43 - .../lib/Base64/Base64EncodingInputStream.php | 37 - .../lib/Base64/Base64EncodingOutputStream.php | 31 - .../amphp/byte-stream/lib/ClosedException.php | 7 - .../amphp/byte-stream/lib/InMemoryStream.php | 34 - .../amphp/byte-stream/lib/InputStream.php | 37 - .../byte-stream/lib/InputStreamChain.php | 44 - .../amphp/byte-stream/lib/IteratorStream.php | 55 - .../amphp/byte-stream/lib/LineReader.php | 59 - .../amphp/byte-stream/lib/Message.php | 151 - .../amphp/byte-stream/lib/OutputBuffer.php | 43 - .../amphp/byte-stream/lib/OutputStream.php | 35 - .../amphp/byte-stream/lib/Payload.php | 80 - .../byte-stream/lib/PendingReadError.php | 14 - .../byte-stream/lib/ResourceInputStream.php | 211 - .../byte-stream/lib/ResourceOutputStream.php | 270 - .../amphp/byte-stream/lib/StreamException.php | 7 - .../amphp/byte-stream/lib/ZlibInputStream.php | 96 - .../byte-stream/lib/ZlibOutputStream.php | 101 - .../amphp/byte-stream/lib/functions.php | 154 - dependencies/amphp/byte-stream/psalm.xml | 53 - dependencies/amphp/cache/lib/ArrayCache.php | 99 - dependencies/amphp/cache/lib/AtomicCache.php | 237 - dependencies/amphp/cache/lib/Cache.php | 48 - .../amphp/cache/lib/CacheException.php | 10 - dependencies/amphp/cache/lib/FileCache.php | 147 - dependencies/amphp/cache/lib/NullCache.php | 28 - dependencies/amphp/cache/lib/PrefixCache.php | 39 - .../amphp/cache/lib/SerializedCache.php | 86 - dependencies/amphp/cache/psalm.xml | 43 - dependencies/amphp/dns/appveyor.yml | 38 - .../dns/lib/BlockingFallbackResolver.php | 35 - dependencies/amphp/dns/lib/Config.php | 137 - .../amphp/dns/lib/ConfigException.php | 15 - dependencies/amphp/dns/lib/ConfigLoader.php | 9 - dependencies/amphp/dns/lib/DnsException.php | 7 - dependencies/amphp/dns/lib/HostLoader.php | 70 - .../amphp/dns/lib/Internal/Socket.php | 217 - .../amphp/dns/lib/Internal/TcpSocket.php | 97 - .../amphp/dns/lib/Internal/UdpSocket.php | 51 - .../amphp/dns/lib/InvalidNameException.php | 7 - .../amphp/dns/lib/NoRecordException.php | 7 - dependencies/amphp/dns/lib/Record.php | 98 - dependencies/amphp/dns/lib/Resolver.php | 32 - .../amphp/dns/lib/Rfc1035StubResolver.php | 414 - .../amphp/dns/lib/TimeoutException.php | 7 - .../amphp/dns/lib/UnixConfigLoader.php | 158 - .../amphp/dns/lib/WindowsConfigLoader.php | 68 - dependencies/amphp/dns/lib/functions.php | 92 - dependencies/amphp/hpack/src/HPack.php | 44 - .../amphp/hpack/src/HPackException.php | 8 - .../amphp/hpack/src/Internal/HPackNative.php | 1082 - .../amphp/hpack/src/Internal/HPackNghttp2.php | 203 - .../amphp/hpack/src/Internal/amp-hpack.h | 29 - .../hpack/src/Internal/huffman-codes.php | 6 - .../hpack/src/Internal/huffman-lookup.php | 6 - dependencies/amphp/hpack/tools/compress.php | 114 - .../hpack/tools/php-fuzzer/decode-crash.php | 7 - .../hpack/tools/php-fuzzer/decode-oracle.php | 17 - .../amphp/hpack/tools/php-fuzzer/decode.php | 10 - dependencies/amphp/http-client/psalm.xml | 51 - .../src/ApplicationInterceptor.php | 34 - .../amphp/http-client/src/Body/FileBody.php | 69 - .../amphp/http-client/src/Body/FormBody.php | 218 - .../amphp/http-client/src/Body/JsonBody.php | 44 - .../amphp/http-client/src/Body/StringBody.php | 29 - .../http-client/src/Connection/Connection.php | 28 - .../src/Connection/ConnectionFactory.php | 26 - .../src/Connection/ConnectionLimitingPool.php | 282 - .../src/Connection/ConnectionPool.php | 19 - .../Connection/DefaultConnectionFactory.php | 149 - .../src/Connection/Http1Connection.php | 546 - .../src/Connection/Http2Connection.php | 78 - .../Connection/Http2ConnectionException.php | 15 - .../src/Connection/Http2StreamException.php | 22 - .../http-client/src/Connection/HttpStream.php | 74 - .../src/Connection/InterceptedStream.php | 53 - .../src/Connection/Internal/Http1Parser.php | 344 - .../Internal/Http2ConnectionProcessor.php | 1143 - .../src/Connection/Internal/Http2Stream.php | 107 - .../Connection/Internal/RequestNormalizer.php | 71 - .../src/Connection/LimitedConnectionPool.php | 6 - .../http-client/src/Connection/Stream.php | 37 - .../src/Connection/StreamLimitingPool.php | 72 - .../Connection/UnlimitedConnectionPool.php | 38 - .../UnprocessedRequestException.php | 12 - .../src/Connection/UpgradedSocket.php | 91 - .../http-client/src/DelegateHttpClient.php | 31 - .../amphp/http-client/src/EventListener.php | 117 - .../src/EventListener/RecordHarAttributes.php | 81 - .../amphp/http-client/src/HttpClient.php | 31 - .../http-client/src/HttpClientBuilder.php | 204 - .../amphp/http-client/src/HttpException.php | 7 - .../http-client/src/InterceptedHttpClient.php | 32 - .../src/Interceptor/AddRequestHeader.php | 15 - .../src/Interceptor/AddResponseHeader.php | 15 - .../src/Interceptor/DecompressResponse.php | 76 - .../src/Interceptor/FollowRedirects.php | 245 - .../src/Interceptor/ForbidUriUserInfo.php | 17 - .../src/Interceptor/LogHttpArchive.php | 148 - .../src/Interceptor/MatchOrigin.php | 80 - .../src/Interceptor/ModifyRequest.php | 52 - .../src/Interceptor/ModifyResponse.php | 48 - .../src/Interceptor/RemoveRequestHeader.php | 15 - .../src/Interceptor/RemoveResponseHeader.php | 15 - .../src/Interceptor/RetryRequests.php | 45 - .../src/Interceptor/SetRequestHeader.php | 16 - .../Interceptor/SetRequestHeaderIfUnset.php | 18 - .../src/Interceptor/SetRequestTimeout.php | 17 - .../src/Interceptor/SetResponseHeader.php | 16 - .../Interceptor/SetResponseHeaderIfUnset.php | 18 - .../Interceptor/TooManyRedirectsException.php | 20 - .../src/Internal/ForbidCloning.php | 13 - .../src/Internal/ForbidSerialization.php | 12 - .../src/Internal/HarAttributes.php | 19 - .../src/Internal/ResponseBodyStream.php | 40 - .../src/Internal/SizeLimitingInputStream.php | 46 - .../http-client/src/Internal/functions.php | 26 - .../src/InvalidRequestException.php | 18 - .../http-client/src/MissingAttributeError.php | 11 - .../http-client/src/NetworkInterceptor.php | 30 - .../amphp/http-client/src/ParseException.php | 16 - .../http-client/src/PooledHttpClient.php | 60 - .../amphp/http-client/src/Request.php | 468 - .../amphp/http-client/src/RequestBody.php | 34 - .../amphp/http-client/src/Response.php | 227 - .../amphp/http-client/src/SocketException.php | 7 - .../http-client/src/TimeoutException.php | 7 - .../amphp/http-client/src/Trailers.php | 27 - .../http/src/Cookie/CookieAttributes.php | 322 - .../src/Cookie/InvalidCookieException.php | 11 - .../amphp/http/src/Cookie/RequestCookie.php | 107 - .../amphp/http/src/Cookie/ResponseCookie.php | 306 - .../src/Http2/Http2ConnectionException.php | 11 - .../amphp/http/src/Http2/Http2Parser.php | 485 - .../amphp/http/src/Http2/Http2Processor.php | 21 - .../http/src/Http2/Http2StreamException.php | 18 - .../amphp/http/src/InvalidHeaderException.php | 16 - dependencies/amphp/http/src/Message.php | 174 - dependencies/amphp/http/src/Rfc7230.php | 121 - dependencies/amphp/http/src/Status.php | 80 - dependencies/amphp/http/src/functions.php | 74 - dependencies/amphp/parser/psalm.xml | 34 - .../parser/src/InvalidDelimiterError.php | 23 - dependencies/amphp/parser/src/Parser.php | 122 - .../process/lib/Internal/Posix/Handle.php | 48 - .../process/lib/Internal/Posix/Runner.php | 207 - .../process/lib/Internal/ProcessHandle.php | 22 - .../process/lib/Internal/ProcessRunner.php | 53 - .../process/lib/Internal/ProcessStatus.php | 14 - .../process/lib/Internal/Windows/Handle.php | 40 - .../lib/Internal/Windows/HandshakeStatus.php | 21 - .../Internal/Windows/PendingSocketClient.php | 18 - .../process/lib/Internal/Windows/Runner.php | 179 - .../lib/Internal/Windows/SignalCode.php | 19 - .../lib/Internal/Windows/SocketConnector.php | 273 - dependencies/amphp/process/lib/Process.php | 233 - .../amphp/process/lib/ProcessException.php | 7 - .../amphp/process/lib/ProcessInputStream.php | 102 - .../amphp/process/lib/ProcessOutputStream.php | 94 - .../amphp/process/lib/StatusError.php | 7 - dependencies/amphp/process/lib/functions.php | 35 - .../src/CompressingSerializer.php | 42 - .../serialization/src/JsonSerializer.php | 71 - .../serialization/src/NativeSerializer.php | 36 - .../src/PassthroughSerializer.php | 18 - .../src/SerializationException.php | 7 - .../amphp/serialization/src/Serializer.php | 23 - .../amphp/serialization/src/functions.php | 15 - dependencies/amphp/socket/psalm.xml | 45 - dependencies/amphp/socket/src/BindContext.php | 136 - dependencies/amphp/socket/src/Certificate.php | 38 - .../amphp/socket/src/ClientTlsContext.php | 388 - .../amphp/socket/src/ConnectContext.php | 121 - .../amphp/socket/src/ConnectException.php | 10 - dependencies/amphp/socket/src/Connector.php | 23 - .../amphp/socket/src/DatagramSocket.php | 213 - .../amphp/socket/src/DnsConnector.php | 108 - .../amphp/socket/src/EncryptableSocket.php | 37 - .../amphp/socket/src/Internal/functions.php | 213 - .../amphp/socket/src/PendingAcceptError.php | 14 - .../amphp/socket/src/PendingReceiveError.php | 14 - .../amphp/socket/src/ResourceSocket.php | 190 - dependencies/amphp/socket/src/Server.php | 179 - .../amphp/socket/src/ServerTlsContext.php | 394 - dependencies/amphp/socket/src/Socket.php | 39 - .../amphp/socket/src/SocketAddress.php | 108 - .../amphp/socket/src/SocketException.php | 8 - dependencies/amphp/socket/src/SocketPool.php | 50 - .../amphp/socket/src/StaticConnector.php | 23 - .../amphp/socket/src/TlsException.php | 10 - dependencies/amphp/socket/src/TlsInfo.php | 106 - .../amphp/socket/src/UnlimitedSocketPool.php | 203 - dependencies/amphp/socket/src/functions.php | 97 - .../amphp/sync/composer-require-check.json | 41 - dependencies/amphp/sync/src/Barrier.php | 71 - .../sync/src/ConcurrentIterator/functions.php | 146 - dependencies/amphp/sync/src/FileMutex.php | 73 - .../amphp/sync/src/Internal/MutexStorage.php | 33 - .../sync/src/Internal/SemaphoreStorage.php | 55 - dependencies/amphp/sync/src/KeyedMutex.php | 23 - .../amphp/sync/src/KeyedSemaphore.php | 24 - .../amphp/sync/src/LocalKeyedMutex.php | 31 - .../amphp/sync/src/LocalKeyedSemaphore.php | 37 - dependencies/amphp/sync/src/LocalMutex.php | 36 - .../amphp/sync/src/LocalSemaphore.php | 43 - dependencies/amphp/sync/src/Lock.php | 68 - dependencies/amphp/sync/src/Mutex.php | 21 - .../amphp/sync/src/PosixSemaphore.php | 211 - .../amphp/sync/src/PrefixedKeyedMutex.php | 21 - .../amphp/sync/src/PrefixedKeyedSemaphore.php | 21 - dependencies/amphp/sync/src/Semaphore.php | 22 - .../amphp/sync/src/SemaphoreMutex.php | 31 - .../amphp/sync/src/StaticKeyMutex.php | 21 - dependencies/amphp/sync/src/SyncException.php | 7 - dependencies/amphp/sync/src/ThreadedMutex.php | 31 - .../amphp/sync/src/ThreadedSemaphore.php | 39 - dependencies/amphp/sync/src/functions.php | 29 - .../lib/KeyNotFoundException.php | 7 - .../windows-registry/lib/WindowsRegistry.php | 68 - dependencies/autoload.php | 25 - dependencies/berlindb/core/autoloader.php | 44 - .../berlindb/core/src/Database/Base.php | 298 - .../berlindb/core/src/Database/Column.php | 803 - .../core/src/Database/Queries/Compare.php | 131 - .../core/src/Database/Queries/Date.php | 1017 - .../core/src/Database/Queries/Meta.php | 28 - .../berlindb/core/src/Database/Query.php | 2589 -- .../berlindb/core/src/Database/Row.php | 66 - .../berlindb/core/src/Database/Schema.php | 81 - .../berlindb/core/src/Database/Table.php | 836 - dependencies/composer/ClassLoader.php | 579 - dependencies/composer/InstalledVersions.php | 313 - dependencies/composer/LICENSE | 21 - dependencies/composer/autoload_classmap.php | 2149 -- dependencies/composer/autoload_files.php | 38 - dependencies/composer/autoload_namespaces.php | 9 - dependencies/composer/autoload_psr4.php | 81 - dependencies/composer/autoload_real.php | 48 - dependencies/composer/autoload_static.php | 2577 -- dependencies/composer/installed.json | 5605 ---- dependencies/composer/installed.php | 5 - .../daverandom/libdns/src/Decoder/Decoder.php | 445 - .../libdns/src/Decoder/DecoderFactory.php | 52 - .../libdns/src/Decoder/DecodingContext.php | 154 - .../src/Decoder/DecodingContextFactory.php | 39 - .../daverandom/libdns/src/Encoder/Encoder.php | 324 - .../libdns/src/Encoder/EncoderFactory.php | 37 - .../libdns/src/Encoder/EncodingContext.php | 99 - .../src/Encoder/EncodingContextFactory.php | 40 - .../daverandom/libdns/src/Enumeration.php | 31 - .../libdns/src/Messages/Message.php | 275 - .../libdns/src/Messages/MessageFactory.php | 38 - .../libdns/src/Messages/MessageOpCodes.php | 31 - .../src/Messages/MessageResponseCodes.php | 34 - .../libdns/src/Messages/MessageTypes.php | 30 - .../libdns/src/Packets/LabelRegistry.php | 76 - .../daverandom/libdns/src/Packets/Packet.php | 120 - .../libdns/src/Packets/PacketFactory.php | 37 - .../libdns/src/Records/Question.php | 39 - .../libdns/src/Records/QuestionFactory.php | 38 - .../daverandom/libdns/src/Records/RData.php | 138 - .../libdns/src/Records/RDataBuilder.php | 62 - .../libdns/src/Records/RDataFactory.php | 38 - .../daverandom/libdns/src/Records/Record.php | 97 - .../libdns/src/Records/RecordCollection.php | 219 - .../src/Records/RecordCollectionFactory.php | 38 - .../libdns/src/Records/RecordTypes.php | 30 - .../libdns/src/Records/Resource.php | 80 - .../libdns/src/Records/ResourceBuilder.php | 65 - .../src/Records/ResourceBuilderFactory.php | 42 - .../libdns/src/Records/ResourceClasses.php | 32 - .../libdns/src/Records/ResourceFactory.php | 39 - .../libdns/src/Records/ResourceQClasses.php | 28 - .../libdns/src/Records/ResourceQTypes.php | 31 - .../libdns/src/Records/ResourceTypes.php | 71 - .../TypeDefinitions/FieldDefinition.php | 130 - .../FieldDefinitionFactory.php | 41 - .../TypeDefinitions/TypeDefinition.php | 177 - .../TypeDefinitions/TypeDefinitionFactory.php | 39 - .../TypeDefinitions/TypeDefinitionManager.php | 264 - .../TypeDefinitionManagerFactory.php | 36 - .../libdns/src/Records/Types/Anything.php | 45 - .../libdns/src/Records/Types/BitMap.php | 63 - .../libdns/src/Records/Types/Char.php | 50 - .../src/Records/Types/CharacterString.php | 45 - .../libdns/src/Records/Types/DomainName.php | 104 - .../libdns/src/Records/Types/IPv4Address.php | 88 - .../libdns/src/Records/Types/IPv6Address.php | 152 - .../libdns/src/Records/Types/Long.php | 52 - .../libdns/src/Records/Types/Short.php | 50 - .../libdns/src/Records/Types/Type.php | 68 - .../libdns/src/Records/Types/TypeBuilder.php | 54 - .../libdns/src/Records/Types/TypeFactory.php | 117 - .../libdns/src/Records/Types/Types.php | 37 - .../daverandom/libdns/src/functions.php | 22 - .../libdns/tools/autoload_generator.php | 81 - dependencies/delight-im/cookie/src/Cookie.php | 522 - .../delight-im/cookie/src/Session.php | 158 - .../delight-im/http/src/ResponseHeader.php | 147 - .../lib/Doctrine/Deprecations/Deprecation.php | 245 - .../PHPUnit/VerifyDeprecations.php | 43 - .../guzzlehttp/guzzle/src/BodySummarizer.php | 23 - .../guzzle/src/BodySummarizerInterface.php | 12 - dependencies/guzzlehttp/guzzle/src/Client.php | 402 - .../guzzlehttp/guzzle/src/ClientInterface.php | 78 - .../guzzlehttp/guzzle/src/ClientTrait.php | 227 - .../guzzle/src/Cookie/CookieJar.php | 240 - .../guzzle/src/Cookie/CookieJarInterface.php | 74 - .../guzzle/src/Cookie/FileCookieJar.php | 92 - .../guzzle/src/Cookie/SessionCookieJar.php | 71 - .../guzzle/src/Cookie/SetCookie.php | 407 - .../src/Exception/BadResponseException.php | 31 - .../guzzle/src/Exception/ClientException.php | 10 - .../guzzle/src/Exception/ConnectException.php | 47 - .../guzzle/src/Exception/GuzzleException.php | 8 - .../Exception/InvalidArgumentException.php | 7 - .../guzzle/src/Exception/RequestException.php | 124 - .../guzzle/src/Exception/ServerException.php | 10 - .../Exception/TooManyRedirectsException.php | 7 - .../src/Exception/TransferException.php | 7 - .../guzzle/src/Handler/CurlFactory.php | 496 - .../src/Handler/CurlFactoryInterface.php | 23 - .../guzzle/src/Handler/CurlHandler.php | 43 - .../guzzle/src/Handler/CurlMultiHandler.php | 220 - .../guzzle/src/Handler/EasyHandle.php | 91 - .../guzzle/src/Handler/HeaderProcessor.php | 36 - .../guzzle/src/Handler/MockHandler.php | 174 - .../guzzlehttp/guzzle/src/Handler/Proxy.php | 49 - .../guzzle/src/Handler/StreamHandler.php | 455 - .../guzzlehttp/guzzle/src/HandlerStack.php | 238 - .../guzzle/src/MessageFormatter.php | 168 - .../guzzle/src/MessageFormatterInterface.php | 17 - .../guzzlehttp/guzzle/src/Middleware.php | 227 - dependencies/guzzlehttp/guzzle/src/Pool.php | 116 - .../guzzle/src/PrepareBodyMiddleware.php | 86 - .../guzzle/src/RedirectMiddleware.php | 162 - .../guzzlehttp/guzzle/src/RequestOptions.php | 246 - .../guzzlehttp/guzzle/src/RetryMiddleware.php | 91 - .../guzzlehttp/guzzle/src/TransferStats.php | 114 - dependencies/guzzlehttp/guzzle/src/Utils.php | 340 - .../guzzlehttp/guzzle/src/functions.php | 158 - .../guzzle/src/functions_include.php | 8 - .../promises/src/AggregateException.php | 14 - .../promises/src/CancellationException.php | 10 - .../guzzlehttp/promises/src/Coroutine.php | 151 - .../guzzlehttp/promises/src/Create.php | 75 - dependencies/guzzlehttp/promises/src/Each.php | 66 - .../guzzlehttp/promises/src/EachPromise.php | 200 - .../promises/src/FulfilledPromise.php | 69 - dependencies/guzzlehttp/promises/src/Is.php | 43 - .../guzzlehttp/promises/src/Promise.php | 237 - .../promises/src/PromiseInterface.php | 87 - .../promises/src/PromisorInterface.php | 16 - .../promises/src/RejectedPromise.php | 75 - .../promises/src/RejectionException.php | 40 - .../guzzlehttp/promises/src/TaskQueue.php | 62 - .../promises/src/TaskQueueInterface.php | 22 - .../guzzlehttp/promises/src/Utils.php | 239 - .../guzzlehttp/promises/src/functions.php | 334 - .../promises/src/functions_include.php | 8 - .../guzzlehttp/psr7/src/AppendStream.php | 203 - .../guzzlehttp/psr7/src/BufferStream.php | 121 - .../guzzlehttp/psr7/src/CachingStream.php | 125 - .../guzzlehttp/psr7/src/DroppingStream.php | 40 - .../src/Exception/MalformedUriException.php | 12 - dependencies/guzzlehttp/psr7/src/FnStream.php | 148 - dependencies/guzzlehttp/psr7/src/Header.php | 117 - .../guzzlehttp/psr7/src/HttpFactory.php | 76 - .../guzzlehttp/psr7/src/InflateStream.php | 33 - .../guzzlehttp/psr7/src/LazyOpenStream.php | 41 - .../guzzlehttp/psr7/src/LimitStream.php | 128 - dependencies/guzzlehttp/psr7/src/Message.php | 189 - .../guzzlehttp/psr7/src/MessageTrait.php | 212 - dependencies/guzzlehttp/psr7/src/MimeType.php | 27 - .../guzzlehttp/psr7/src/MultipartStream.php | 122 - .../guzzlehttp/psr7/src/NoSeekStream.php | 23 - .../guzzlehttp/psr7/src/PumpStream.php | 149 - dependencies/guzzlehttp/psr7/src/Query.php | 104 - dependencies/guzzlehttp/psr7/src/Request.php | 124 - dependencies/guzzlehttp/psr7/src/Response.php | 78 - dependencies/guzzlehttp/psr7/src/Rfc7230.php | 22 - .../guzzlehttp/psr7/src/ServerRequest.php | 266 - dependencies/guzzlehttp/psr7/src/Stream.php | 235 - .../psr7/src/StreamDecoratorTrait.php | 131 - .../guzzlehttp/psr7/src/StreamWrapper.php | 114 - .../guzzlehttp/psr7/src/UploadedFile.php | 152 - dependencies/guzzlehttp/psr7/src/Uri.php | 570 - .../guzzlehttp/psr7/src/UriComparator.php | 43 - .../guzzlehttp/psr7/src/UriNormalizer.php | 175 - .../guzzlehttp/psr7/src/UriResolver.php | 180 - dependencies/guzzlehttp/psr7/src/Utils.php | 375 - dependencies/hashids/hashids/src/Hashids.php | 353 - .../hashids/hashids/src/HashidsException.php | 17 - .../hashids/hashids/src/HashidsInterface.php | 47 - dependencies/hashids/hashids/src/Math/Bc.php | 108 - dependencies/hashids/hashids/src/Math/Gmp.php | 108 - .../hashids/src/Math/MathInterface.php | 84 - .../src/Ifsnop/Mysqldump/Mysqldump.php | 1837 -- dependencies/jasny/immutable/phpcs.xml | 12 - dependencies/jasny/immutable/phpstan.neon | 10 - .../immutable/src/NoDynamicProperties.php | 22 - dependencies/jasny/immutable/src/With.php | 154 - dependencies/jasny/sso/codeception.yml | 14 - dependencies/jasny/sso/phpcs.xml | 12 - dependencies/jasny/sso/src/Broker/Broker.php | 281 - dependencies/jasny/sso/src/Broker/Cookies.php | 73 - dependencies/jasny/sso/src/Broker/Curl.php | 56 - .../sso/src/Broker/NotAttachedException.php | 11 - .../jasny/sso/src/Broker/RequestException.php | 11 - dependencies/jasny/sso/src/Broker/Session.php | 42 - .../jasny/sso/src/Server/BrokerException.php | 12 - .../sso/src/Server/ExceptionInterface.php | 20 - .../jasny/sso/src/Server/GlobalSession.php | 70 - dependencies/jasny/sso/src/Server/Server.php | 273 - .../jasny/sso/src/Server/ServerException.php | 12 - .../jasny/sso/src/Server/SessionInterface.php | 34 - .../kelunik/certificate/src/Certificate.php | 122 - .../src/FieldNotSupportedException.php | 8 - .../src/InvalidCertificateException.php | 8 - .../kelunik/certificate/src/Profile.php | 29 - .../Contracts/AuthorityInterface.php | 84 - .../Contracts/DataPathInterface.php | 84 - .../Contracts/DomainHostInterface.php | 103 - .../Contracts/FragmentInterface.php | 20 - .../Contracts/HostInterface.php | 48 - .../Contracts/IpHostInterface.php | 43 - .../Contracts/PathInterface.php | 80 - .../Contracts/PortInterface.php | 20 - .../Contracts/QueryInterface.php | 227 - .../Contracts/SegmentedPathInterface.php | 131 - .../uri-interfaces/Contracts/UriAccess.php | 19 - .../Contracts/UriComponentInterface.php | 68 - .../uri-interfaces/Contracts/UriException.php | 17 - .../uri-interfaces/Contracts/UriInterface.php | 289 - .../Contracts/UserInfoInterface.php | 55 - .../league/uri-interfaces/Encoder.php | 148 - .../Exceptions/ConversionFailed.php | 36 - .../Exceptions/MissingFeature.php | 18 - .../Exceptions/OffsetOutOfBounds.php | 16 - .../uri-interfaces/Exceptions/SyntaxError.php | 18 - .../uri-interfaces/FeatureDetection.php | 47 - .../uri-interfaces/IPv4/BCMathCalculator.php | 67 - .../league/uri-interfaces/IPv4/Calculator.php | 86 - .../league/uri-interfaces/IPv4/Converter.php | 178 - .../uri-interfaces/IPv4/GMPCalculator.php | 58 - .../uri-interfaces/IPv4/NativeCalculator.php | 50 - .../league/uri-interfaces/Idna/Converter.php | 177 - .../league/uri-interfaces/Idna/Error.php | 56 - .../league/uri-interfaces/Idna/Option.php | 137 - .../league/uri-interfaces/Idna/Result.php | 57 - .../uri-interfaces/KeyValuePair/Converter.php | 178 - .../league/uri-interfaces/QueryString.php | 231 - .../league/uri-interfaces/UriString.php | 367 - .../league/uri-parser/src/Exception.php | 84 - .../uri-parser/src/MissingIdnSupport.php | 28 - dependencies/league/uri-parser/src/Parser.php | 539 - .../league/uri-parser/src/functions.php | 107 - .../uri-parser/src/functions_include.php | 18 - dependencies/league/uri/BaseUri.php | 417 - dependencies/league/uri/Http.php | 237 - dependencies/league/uri/HttpFactory.php | 22 - dependencies/league/uri/Uri.php | 1028 - dependencies/league/uri/UriInfo.php | 87 - dependencies/league/uri/UriResolver.php | 49 - dependencies/league/uri/UriTemplate.php | 101 - .../league/uri/UriTemplate/Expression.php | 67 - .../league/uri/UriTemplate/Operator.php | 193 - .../league/uri/UriTemplate/Template.php | 111 - .../UriTemplate/TemplateCanNotBeExpanded.php | 36 - .../league/uri/UriTemplate/VarSpecifier.php | 57 - .../league/uri/UriTemplate/VariableBag.php | 130 - dependencies/mexitek/phpcolors/demo/demo.php | 135 - .../mexitek/phpcolors/demo/phpColor-demo.png | Bin 27634 -> 0 bytes .../phpcolors/src/Mexitek/PHPColors/Color.php | 558 - dependencies/mpdf/mpdf/CREDITS.txt | 91 - dependencies/mpdf/mpdf/data/CJKdata.php | 38 - .../collations/Afrikaans_South_Africa.php | 5 - .../mpdf/data/collations/Albanian_Albania.php | 5 - .../mpdf/data/collations/Alsatian_France.php | 5 - .../mpdf/data/collations/Arabic_Algeria.php | 5 - .../mpdf/data/collations/Arabic_Bahrain.php | 5 - .../mpdf/data/collations/Arabic_Egypt.php | 5 - .../mpdf/mpdf/data/collations/Arabic_Iraq.php | 5 - .../mpdf/data/collations/Arabic_Jordan.php | 5 - .../mpdf/data/collations/Arabic_Kuwait.php | 5 - .../mpdf/data/collations/Arabic_Lebanon.php | 5 - .../mpdf/data/collations/Arabic_Libya.php | 5 - .../mpdf/data/collations/Arabic_Morocco.php | 5 - .../mpdf/mpdf/data/collations/Arabic_Oman.php | 5 - .../data/collations/Arabic_Pseudo_RTL.php | 5 - .../mpdf/data/collations/Arabic_Qatar.php | 5 - .../data/collations/Arabic_Saudi_Arabia.php | 5 - .../mpdf/data/collations/Arabic_Syria.php | 5 - .../mpdf/data/collations/Arabic_Tunisia.php | 5 - .../mpdf/data/collations/Arabic_Yemen.php | 5 - .../Azeri_(Cyrillic)_Azerbaijan.php | 5 - .../collations/Azeri_(Latin)_Azerbaijan.php | 5 - .../mpdf/data/collations/Bashkir_Russia.php | 5 - .../mpdf/data/collations/Basque_Spain.php | 5 - .../data/collations/Belarusian_Belarus.php | 5 - ...nian_(Cyrillic)_Bosnia_and_Herzegovina.php | 5 - ...Bosnian_(Latin)_Bosnia_and_Herzegovina.php | 5 - .../mpdf/data/collations/Breton_France.php | 5 - .../data/collations/Bulgarian_Bulgaria.php | 5 - .../mpdf/data/collations/Catalan_Spain.php | 5 - .../mpdf/data/collations/Corsican_France.php | 5 - ...roatian_(Latin)_Bosnia_and_Herzegovina.php | 5 - .../mpdf/data/collations/Croatian_Croatia.php | 5 - .../data/collations/Czech_Czech_Republic.php | 5 - .../mpdf/data/collations/Danish_Denmark.php | 5 - .../mpdf/data/collations/Dari_Afghanistan.php | 5 - .../mpdf/data/collations/Dutch_Belgium.php | 5 - .../data/collations/Dutch_Netherlands.php | 5 - .../data/collations/English_Australia.php | 5 - .../mpdf/data/collations/English_Belize.php | 5 - .../mpdf/data/collations/English_Canada.php | 5 - .../data/collations/English_Caribbean.php | 5 - .../mpdf/data/collations/English_India.php | 5 - .../mpdf/data/collations/English_Ireland.php | 5 - .../mpdf/data/collations/English_Jamaica.php | 5 - .../mpdf/data/collations/English_Malaysia.php | 5 - .../data/collations/English_New_Zealand.php | 5 - .../English_Republic_of_the_Philippines.php | 5 - .../data/collations/English_Singapore.php | 5 - .../data/collations/English_South_Africa.php | 5 - .../English_Trinidad_and_Tobago.php | 5 - .../collations/English_United_Kingdom.php | 5 - .../data/collations/English_United_States.php | 5 - .../mpdf/data/collations/English_Zimbabwe.php | 5 - .../mpdf/data/collations/Estonian_Estonia.php | 5 - .../data/collations/Faroese_Faroe_Islands.php | 5 - .../data/collations/Filipino_Philippines.php | 5 - .../mpdf/data/collations/Finnish_Finland.php | 5 - .../mpdf/data/collations/French_Belgium.php | 5 - .../mpdf/data/collations/French_Canada.php | 5 - .../mpdf/data/collations/French_France.php | 5 - .../data/collations/French_Luxembourg.php | 5 - .../French_Principality_of_Monaco.php | 5 - .../data/collations/French_Switzerland.php | 5 - .../data/collations/Frisian_Netherlands.php | 5 - .../mpdf/data/collations/Galician_Spain.php | 5 - .../mpdf/data/collations/German_Austria.php | 5 - .../mpdf/data/collations/German_Germany.php | 5 - .../data/collations/German_Liechtenstein.php | 5 - .../data/collations/German_Luxembourg.php | 5 - .../data/collations/German_Switzerland.php | 5 - .../mpdf/data/collations/Greek_Greece.php | 5 - .../data/collations/Greenlandic_Greenland.php | 5 - .../data/collations/Hausa_(Latin)_Nigeria.php | 5 - .../mpdf/data/collations/Hebrew_Israel.php | 5 - .../data/collations/Hungarian_Hungary.php | 5 - .../data/collations/Icelandic_Iceland.php | 5 - .../mpdf/data/collations/Igbo_Nigeria.php | 5 - .../data/collations/Indonesian_Indonesia.php | 5 - .../collations/Inuktitut_(Latin)_Canada.php | 5 - .../Invariant_Language_Invariant_Country.php | 5 - .../mpdf/data/collations/Irish_Ireland.php | 5 - .../mpdf/data/collations/Italian_Italy.php | 5 - .../data/collations/Italian_Switzerland.php | 5 - .../data/collations/Kinyarwanda_Rwanda.php | 5 - .../mpdf/data/collations/Kiswahili_Kenya.php | 5 - .../data/collations/Kyrgyz_Kyrgyzstan.php | 5 - .../mpdf/data/collations/Latvian_Latvia.php | 5 - .../data/collations/Lithuanian_Lithuania.php | 5 - .../data/collations/Lower_Sorbian_Germany.php | 5 - .../collations/Luxembourgish_Luxembourg.php | 5 - .../Macedonian_(FYROM)_Macedonia_(FYROM).php | 5 - .../collations/Malay_Brunei_Darussalam.php | 5 - .../mpdf/data/collations/Malay_Malaysia.php | 5 - .../mpdf/data/collations/Mapudungun_Chile.php | 5 - .../mpdf/data/collations/Mohawk_Canada.php | 5 - .../Mongolian_(Cyrillic)_Mongolia.php | 5 - .../collations/Norwegian_(Nynorsk)_Norway.php | 5 - .../mpdf/data/collations/Occitan_France.php | 5 - .../mpdf/data/collations/Persian_Iran.php | 5 - .../mpdf/data/collations/Polish_Poland.php | 5 - .../data/collations/Portuguese_Brazil.php | 5 - .../data/collations/Portuguese_Portugal.php | 5 - .../mpdf/data/collations/Quechua_Bolivia.php | 5 - .../mpdf/data/collations/Quechua_Ecuador.php | 5 - .../mpdf/data/collations/Quechua_Peru.php | 5 - .../mpdf/data/collations/Romanian_Romania.php | 5 - .../data/collations/Romansh_Switzerland.php | 5 - .../mpdf/data/collations/Russian_Russia.php | 5 - .../data/collations/Sami_(Inari)_Finland.php | 5 - .../data/collations/Sami_(Lule)_Norway.php | 5 - .../data/collations/Sami_(Lule)_Sweden.php | 5 - .../collations/Sami_(Northern)_Finland.php | 5 - .../collations/Sami_(Northern)_Norway.php | 5 - .../collations/Sami_(Northern)_Sweden.php | 5 - .../data/collations/Sami_(Skolt)_Finland.php | 5 - .../collations/Sami_(Southern)_Norway.php | 5 - .../collations/Sami_(Southern)_Sweden.php | 5 - ...bian_(Cyrillic)_Bosnia_and_Herzegovina.php | 5 - .../collations/Serbian_(Cyrillic)_Serbia.php | 5 - ...Serbian_(Latin)_Bosnia_and_Herzegovina.php | 5 - .../collations/Serbian_(Latin)_Serbia.php | 5 - .../Sesotho_sa_Leboa_South_Africa.php | 5 - .../data/collations/Setswana_South_Africa.php | 5 - .../mpdf/data/collations/Slovak_Slovakia.php | 5 - .../data/collations/Slovenian_Slovenia.php | 5 - .../data/collations/Spanish_Argentina.php | 5 - .../mpdf/data/collations/Spanish_Bolivia.php | 5 - .../mpdf/data/collations/Spanish_Chile.php | 5 - .../mpdf/data/collations/Spanish_Colombia.php | 5 - .../data/collations/Spanish_Costa_Rica.php | 5 - .../collations/Spanish_Dominican_Republic.php | 5 - .../mpdf/data/collations/Spanish_Ecuador.php | 5 - .../data/collations/Spanish_El_Salvador.php | 5 - .../data/collations/Spanish_Guatemala.php | 5 - .../mpdf/data/collations/Spanish_Honduras.php | 5 - .../mpdf/data/collations/Spanish_Mexico.php | 5 - .../data/collations/Spanish_Nicaragua.php | 5 - .../mpdf/data/collations/Spanish_Panama.php | 5 - .../mpdf/data/collations/Spanish_Paraguay.php | 5 - .../mpdf/data/collations/Spanish_Peru.php | 5 - .../data/collations/Spanish_Puerto_Rico.php | 5 - .../mpdf/data/collations/Spanish_Spain.php | 5 - .../data/collations/Spanish_United_States.php | 5 - .../mpdf/data/collations/Spanish_Uruguay.php | 5 - .../data/collations/Spanish_Venezuela.php | 5 - .../mpdf/data/collations/Swedish_Finland.php | 5 - .../mpdf/data/collations/Swedish_Sweden.php | 5 - .../Tajik_(Cyrillic)_Tajikistan.php | 5 - .../collations/Tamazight_(Latin)_Algeria.php | 5 - .../mpdf/data/collations/Tatar_Russia.php | 5 - .../mpdf/data/collations/Turkish_Turkey.php | 5 - .../data/collations/Turkmen_Turkmenistan.php | 5 - .../data/collations/Ukrainian_Ukraine.php | 5 - .../data/collations/Upper_Sorbian_Germany.php | 5 - .../Urdu_Islamic_Republic_of_Pakistan.php | 5 - .../Uzbek_(Cyrillic)_Uzbekistan.php | 5 - .../collations/Uzbek_(Latin)_Uzbekistan.php | 5 - .../data/collations/Vietnamese_Vietnam.php | 5 - .../data/collations/Welsh_United_Kingdom.php | 5 - .../mpdf/data/collations/Wolof_Senegal.php | 5 - .../mpdf/data/collations/Yakut_Russia.php | 5 - .../mpdf/data/collations/Yoruba_Nigeria.php | 5 - .../data/collations/isiXhosa_South_Africa.php | 5 - .../data/collations/isiZulu_South_Africa.php | 5 - .../mpdf/mpdf/data/entity_substitutions.php | 5 - dependencies/mpdf/mpdf/data/font/ccourier.php | 11 - .../mpdf/mpdf/data/font/ccourierb.php | 11 - .../mpdf/mpdf/data/font/ccourierbi.php | 11 - .../mpdf/mpdf/data/font/ccourieri.php | 11 - .../mpdf/mpdf/data/font/chelvetica.php | 10 - .../mpdf/mpdf/data/font/chelveticab.php | 10 - .../mpdf/mpdf/data/font/chelveticabi.php | 10 - .../mpdf/mpdf/data/font/chelveticai.php | 10 - dependencies/mpdf/mpdf/data/font/csymbol.php | 9 - dependencies/mpdf/mpdf/data/font/ctimes.php | 10 - dependencies/mpdf/mpdf/data/font/ctimesb.php | 10 - dependencies/mpdf/mpdf/data/font/ctimesbi.php | 10 - dependencies/mpdf/mpdf/data/font/ctimesi.php | 10 - .../mpdf/mpdf/data/font/czapfdingbats.php | 9 - .../data/iccprofiles/sRGB_IEC61966-2-1.icc | Bin 3052 -> 0 bytes dependencies/mpdf/mpdf/data/lang2fonts.css | 394 - dependencies/mpdf/mpdf/data/linebrdictK.dat | Bin 1053144 -> 0 bytes dependencies/mpdf/mpdf/data/linebrdictL.dat | Bin 126932 -> 0 bytes dependencies/mpdf/mpdf/data/linebrdictT.dat | Bin 301751 -> 0 bytes dependencies/mpdf/mpdf/data/mpdf.css | 94 - dependencies/mpdf/mpdf/data/no_image.jpg | Bin 7888 -> 0 bytes dependencies/mpdf/mpdf/data/out.php | 60 - .../mpdf/mpdf/data/patterns/NOTES.txt | 5 - dependencies/mpdf/mpdf/data/patterns/de.php | 9 - .../mpdf/mpdf/data/patterns/dictionary.txt | 1 - dependencies/mpdf/mpdf/data/patterns/en.php | 9 - dependencies/mpdf/mpdf/data/patterns/es.php | 11 - dependencies/mpdf/mpdf/data/patterns/fi.php | 9 - dependencies/mpdf/mpdf/data/patterns/fr.php | 12 - dependencies/mpdf/mpdf/data/patterns/it.php | 11 - dependencies/mpdf/mpdf/data/patterns/nl.php | 11 - dependencies/mpdf/mpdf/data/patterns/pl.php | 9 - dependencies/mpdf/mpdf/data/patterns/ru.php | 12 - dependencies/mpdf/mpdf/data/patterns/sv.php | 12 - dependencies/mpdf/mpdf/data/subs_core.php | 7 - dependencies/mpdf/mpdf/data/subs_win-1252.php | 5 - dependencies/mpdf/mpdf/data/upperCase.php | 5 - dependencies/mpdf/mpdf/phpunit.xml | 23 - dependencies/mpdf/mpdf/ruleset.xml | 43 - dependencies/mpdf/mpdf/src/AssetFetcher.php | 88 - dependencies/mpdf/mpdf/src/Barcode.php | 159 - .../mpdf/mpdf/src/Barcode/AbstractBarcode.php | 65 - .../mpdf/src/Barcode/BarcodeException.php | 7 - .../mpdf/src/Barcode/BarcodeInterface.php | 25 - .../mpdf/mpdf/src/Barcode/Codabar.php | 70 - dependencies/mpdf/mpdf/src/Barcode/Code11.php | 109 - .../mpdf/mpdf/src/Barcode/Code128.php | 378 - dependencies/mpdf/mpdf/src/Barcode/Code39.php | 135 - dependencies/mpdf/mpdf/src/Barcode/Code93.php | 222 - dependencies/mpdf/mpdf/src/Barcode/EanExt.php | 97 - dependencies/mpdf/mpdf/src/Barcode/EanUpc.php | 229 - dependencies/mpdf/mpdf/src/Barcode/I25.php | 121 - dependencies/mpdf/mpdf/src/Barcode/Imb.php | 320 - dependencies/mpdf/mpdf/src/Barcode/Msi.php | 80 - .../mpdf/mpdf/src/Barcode/Postnet.php | 92 - dependencies/mpdf/mpdf/src/Barcode/Rm4Scc.php | 111 - dependencies/mpdf/mpdf/src/Barcode/S25.php | 93 - dependencies/mpdf/mpdf/src/Cache.php | 93 - .../mpdf/mpdf/src/Color/ColorConverter.php | 285 - .../mpdf/src/Color/ColorModeConverter.php | 170 - .../mpdf/src/Color/ColorSpaceRestrictor.php | 190 - .../mpdf/mpdf/src/Color/NamedColors.php | 8 - .../mpdf/mpdf/src/Config/ConfigVariables.php | 447 - .../mpdf/mpdf/src/Config/FontVariables.php | 231 - .../mpdf/src/Container/ContainerInterface.php | 9 - .../mpdf/src/Container/NotFoundException.php | 7 - .../mpdf/src/Container/SimpleContainer.php | 27 - .../mpdf/mpdf/src/Conversion/DecToAlpha.php | 43 - .../mpdf/mpdf/src/Conversion/DecToCjk.php | 19 - .../mpdf/mpdf/src/Conversion/DecToHebrew.php | 61 - .../mpdf/mpdf/src/Conversion/DecToOther.php | 42 - .../mpdf/mpdf/src/Conversion/DecToRoman.php | 105 - dependencies/mpdf/mpdf/src/Css/Border.php | 12 - dependencies/mpdf/mpdf/src/Css/DefaultCss.php | 17 - dependencies/mpdf/mpdf/src/Css/TextVars.php | 21 - dependencies/mpdf/mpdf/src/CssManager.php | 2078 -- dependencies/mpdf/mpdf/src/DirectWrite.php | 474 - .../src/Exception/AssetFetchingException.php | 7 - .../mpdf/mpdf/src/Exception/FontException.php | 7 - .../Exception/InvalidArgumentException.php | 7 - .../mpdf/mpdf/src/File/LocalContentLoader.php | 11 - .../src/File/LocalContentLoaderInterface.php | 11 - .../mpdf/src/File/StreamWrapperChecker.php | 39 - .../mpdf/mpdf/src/Fonts/FontCache.php | 61 - .../mpdf/mpdf/src/Fonts/FontFileFinder.php | 29 - .../mpdf/mpdf/src/Fonts/GlyphOperator.php | 12 - .../mpdf/mpdf/src/Fonts/MetricsGenerator.php | 97 - dependencies/mpdf/mpdf/src/Form.php | 1603 - dependencies/mpdf/mpdf/src/FpdiTrait.php | 341 - dependencies/mpdf/mpdf/src/Gif/ColorTable.php | 66 - dependencies/mpdf/mpdf/src/Gif/FileHeader.php | 76 - dependencies/mpdf/mpdf/src/Gif/Gif.php | 59 - dependencies/mpdf/mpdf/src/Gif/Image.php | 156 - .../mpdf/mpdf/src/Gif/ImageHeader.php | 70 - dependencies/mpdf/mpdf/src/Gif/Lzw.php | 196 - dependencies/mpdf/mpdf/src/Gradient.php | 955 - dependencies/mpdf/mpdf/src/HTMLParserMode.php | 35 - .../mpdf/mpdf/src/Http/ClientInterface.php | 9 - .../mpdf/mpdf/src/Http/CurlHttpClient.php | 87 - .../src/Http/Exception/ClientException.php | 7 - .../Exception/ForbiddenRequestException.php | 7 - .../src/Http/Exception/NetworkException.php | 7 - .../src/Http/Exception/RequestException.php | 7 - .../mpdf/mpdf/src/Http/SocketHttpClient.php | 82 - dependencies/mpdf/mpdf/src/Hyphenator.php | 166 - dependencies/mpdf/mpdf/src/Image/Bmp.php | 299 - .../mpdf/mpdf/src/Image/ImageProcessor.php | 1272 - .../mpdf/mpdf/src/Image/ImageTypeGuesser.php | 38 - dependencies/mpdf/mpdf/src/Image/Svg.php | 3690 --- dependencies/mpdf/mpdf/src/Image/Wmf.php | 304 - .../mpdf/mpdf/src/Language/LanguageToFont.php | 662 - .../src/Language/LanguageToFontInterface.php | 27 - .../mpdf/src/Language/ScriptToLanguage.php | 139 - .../Language/ScriptToLanguageInterface.php | 9 - dependencies/mpdf/mpdf/src/Log/Context.php | 14 - dependencies/mpdf/mpdf/src/Mpdf.php | 24817 ---------------- dependencies/mpdf/mpdf/src/MpdfException.php | 7 - .../mpdf/mpdf/src/MpdfImageException.php | 7 - dependencies/mpdf/mpdf/src/Otl.php | 6220 ---- dependencies/mpdf/mpdf/src/OtlDump.php | 3993 --- .../mpdf/mpdf/src/Output/Destination.php | 11 - dependencies/mpdf/mpdf/src/PageBox.php | 41 - dependencies/mpdf/mpdf/src/PageFormat.php | 83 - dependencies/mpdf/mpdf/src/Pdf/Protection.php | 309 - .../src/Pdf/Protection/UniqidGenerator.php | 25 - dependencies/mpdf/mpdf/src/ServiceFactory.php | 85 - dependencies/mpdf/mpdf/src/Shaper/Indic.php | 3194 -- dependencies/mpdf/mpdf/src/Shaper/Myanmar.php | 711 - dependencies/mpdf/mpdf/src/Shaper/Sea.php | 652 - dependencies/mpdf/mpdf/src/SizeConverter.php | 125 - dependencies/mpdf/mpdf/src/Strict.php | 60 - dependencies/mpdf/mpdf/src/TTFontFile.php | 4514 --- .../mpdf/mpdf/src/TTFontFileAnalysis.php | 441 - .../mpdf/mpdf/src/TableOfContents.php | 800 - dependencies/mpdf/mpdf/src/Tag.php | 176 - dependencies/mpdf/mpdf/src/Tag/A.php | 54 - dependencies/mpdf/mpdf/src/Tag/Acronym.php | 7 - dependencies/mpdf/mpdf/src/Tag/Address.php | 7 - dependencies/mpdf/mpdf/src/Tag/Annotation.php | 98 - dependencies/mpdf/mpdf/src/Tag/Article.php | 7 - dependencies/mpdf/mpdf/src/Tag/Aside.php | 7 - dependencies/mpdf/mpdf/src/Tag/B.php | 7 - dependencies/mpdf/mpdf/src/Tag/BarCode.php | 205 - dependencies/mpdf/mpdf/src/Tag/Bdi.php | 7 - dependencies/mpdf/mpdf/src/Tag/Bdo.php | 7 - dependencies/mpdf/mpdf/src/Tag/Big.php | 7 - dependencies/mpdf/mpdf/src/Tag/BlockQuote.php | 7 - dependencies/mpdf/mpdf/src/Tag/BlockTag.php | 1058 - dependencies/mpdf/mpdf/src/Tag/Bookmark.php | 32 - dependencies/mpdf/mpdf/src/Tag/Br.php | 81 - dependencies/mpdf/mpdf/src/Tag/Caption.php | 7 - dependencies/mpdf/mpdf/src/Tag/Center.php | 7 - dependencies/mpdf/mpdf/src/Tag/Cite.php | 7 - dependencies/mpdf/mpdf/src/Tag/Code.php | 7 - .../mpdf/mpdf/src/Tag/ColumnBreak.php | 7 - dependencies/mpdf/mpdf/src/Tag/Columns.php | 53 - dependencies/mpdf/mpdf/src/Tag/Dd.php | 7 - dependencies/mpdf/mpdf/src/Tag/Del.php | 7 - dependencies/mpdf/mpdf/src/Tag/Details.php | 7 - dependencies/mpdf/mpdf/src/Tag/Div.php | 7 - dependencies/mpdf/mpdf/src/Tag/Dl.php | 7 - dependencies/mpdf/mpdf/src/Tag/DotTab.php | 58 - dependencies/mpdf/mpdf/src/Tag/Dt.php | 7 - dependencies/mpdf/mpdf/src/Tag/Em.php | 7 - dependencies/mpdf/mpdf/src/Tag/FieldSet.php | 7 - dependencies/mpdf/mpdf/src/Tag/FigCaption.php | 7 - dependencies/mpdf/mpdf/src/Tag/Figure.php | 7 - dependencies/mpdf/mpdf/src/Tag/Font.php | 7 - dependencies/mpdf/mpdf/src/Tag/Footer.php | 7 - dependencies/mpdf/mpdf/src/Tag/Form.php | 7 - dependencies/mpdf/mpdf/src/Tag/FormFeed.php | 164 - dependencies/mpdf/mpdf/src/Tag/H1.php | 7 - dependencies/mpdf/mpdf/src/Tag/H2.php | 7 - dependencies/mpdf/mpdf/src/Tag/H3.php | 7 - dependencies/mpdf/mpdf/src/Tag/H4.php | 7 - dependencies/mpdf/mpdf/src/Tag/H5.php | 7 - dependencies/mpdf/mpdf/src/Tag/H6.php | 7 - dependencies/mpdf/mpdf/src/Tag/HGroup.php | 7 - dependencies/mpdf/mpdf/src/Tag/Header.php | 7 - dependencies/mpdf/mpdf/src/Tag/Hr.php | 105 - dependencies/mpdf/mpdf/src/Tag/I.php | 7 - dependencies/mpdf/mpdf/src/Tag/Img.php | 341 - dependencies/mpdf/mpdf/src/Tag/IndexEntry.php | 32 - .../mpdf/mpdf/src/Tag/IndexInsert.php | 27 - dependencies/mpdf/mpdf/src/Tag/InlineTag.php | 232 - dependencies/mpdf/mpdf/src/Tag/Input.php | 388 - dependencies/mpdf/mpdf/src/Tag/Ins.php | 7 - dependencies/mpdf/mpdf/src/Tag/Kbd.php | 7 - dependencies/mpdf/mpdf/src/Tag/Legend.php | 33 - dependencies/mpdf/mpdf/src/Tag/Li.php | 7 - dependencies/mpdf/mpdf/src/Tag/Main.php | 7 - dependencies/mpdf/mpdf/src/Tag/Mark.php | 7 - dependencies/mpdf/mpdf/src/Tag/Meter.php | 426 - dependencies/mpdf/mpdf/src/Tag/Nav.php | 7 - dependencies/mpdf/mpdf/src/Tag/NewColumn.php | 17 - dependencies/mpdf/mpdf/src/Tag/NewPage.php | 7 - dependencies/mpdf/mpdf/src/Tag/Ol.php | 7 - dependencies/mpdf/mpdf/src/Tag/Option.php | 35 - dependencies/mpdf/mpdf/src/Tag/P.php | 7 - dependencies/mpdf/mpdf/src/Tag/PageBreak.php | 7 - dependencies/mpdf/mpdf/src/Tag/PageFooter.php | 151 - dependencies/mpdf/mpdf/src/Tag/PageHeader.php | 7 - dependencies/mpdf/mpdf/src/Tag/Pre.php | 14 - dependencies/mpdf/mpdf/src/Tag/Progress.php | 62 - dependencies/mpdf/mpdf/src/Tag/Q.php | 7 - dependencies/mpdf/mpdf/src/Tag/S.php | 7 - dependencies/mpdf/mpdf/src/Tag/Samp.php | 7 - dependencies/mpdf/mpdf/src/Tag/Section.php | 7 - dependencies/mpdf/mpdf/src/Tag/Select.php | 144 - .../mpdf/mpdf/src/Tag/SetHtmlPageFooter.php | 72 - .../mpdf/mpdf/src/Tag/SetHtmlPageHeader.php | 7 - .../mpdf/mpdf/src/Tag/SetPageFooter.php | 7 - .../mpdf/mpdf/src/Tag/SetPageHeader.php | 7 - dependencies/mpdf/mpdf/src/Tag/Small.php | 7 - dependencies/mpdf/mpdf/src/Tag/Span.php | 7 - dependencies/mpdf/mpdf/src/Tag/Strike.php | 7 - dependencies/mpdf/mpdf/src/Tag/Strong.php | 7 - dependencies/mpdf/mpdf/src/Tag/Sub.php | 7 - .../mpdf/mpdf/src/Tag/SubstituteTag.php | 17 - dependencies/mpdf/mpdf/src/Tag/Summary.php | 7 - dependencies/mpdf/mpdf/src/Tag/Sup.php | 7 - dependencies/mpdf/mpdf/src/Tag/TBody.php | 22 - dependencies/mpdf/mpdf/src/Tag/TFoot.php | 54 - dependencies/mpdf/mpdf/src/Tag/THead.php | 54 - dependencies/mpdf/mpdf/src/Tag/Table.php | 1147 - dependencies/mpdf/mpdf/src/Tag/Tag.php | 85 - dependencies/mpdf/mpdf/src/Tag/Td.php | 418 - dependencies/mpdf/mpdf/src/Tag/TextArea.php | 144 - dependencies/mpdf/mpdf/src/Tag/TextCircle.php | 189 - dependencies/mpdf/mpdf/src/Tag/Th.php | 12 - dependencies/mpdf/mpdf/src/Tag/Time.php | 7 - dependencies/mpdf/mpdf/src/Tag/Toc.php | 15 - dependencies/mpdf/mpdf/src/Tag/TocEntry.php | 38 - .../mpdf/mpdf/src/Tag/TocPageBreak.php | 16 - dependencies/mpdf/mpdf/src/Tag/Tr.php | 92 - dependencies/mpdf/mpdf/src/Tag/Tt.php | 7 - dependencies/mpdf/mpdf/src/Tag/Tta.php | 19 - dependencies/mpdf/mpdf/src/Tag/Tts.php | 13 - dependencies/mpdf/mpdf/src/Tag/Ttz.php | 13 - dependencies/mpdf/mpdf/src/Tag/U.php | 7 - dependencies/mpdf/mpdf/src/Tag/Ul.php | 7 - dependencies/mpdf/mpdf/src/Tag/VarTag.php | 7 - .../mpdf/mpdf/src/Tag/WatermarkImage.php | 37 - .../mpdf/mpdf/src/Tag/WatermarkText.php | 22 - dependencies/mpdf/mpdf/src/Ucdn.php | 1195 - dependencies/mpdf/mpdf/src/Utils/Arrays.php | 89 - .../mpdf/mpdf/src/Utils/NumericString.php | 15 - dependencies/mpdf/mpdf/src/Utils/PdfDate.php | 30 - .../mpdf/mpdf/src/Utils/UtfString.php | 57 - dependencies/mpdf/mpdf/src/Watermark.php | 7 - dependencies/mpdf/mpdf/src/WatermarkImage.php | 57 - dependencies/mpdf/mpdf/src/WatermarkText.php | 52 - .../mpdf/mpdf/src/Writer/BackgroundWriter.php | 382 - .../mpdf/mpdf/src/Writer/BaseWriter.php | 216 - .../mpdf/mpdf/src/Writer/BookmarkWriter.php | 123 - .../mpdf/mpdf/src/Writer/ColorWriter.php | 36 - .../mpdf/mpdf/src/Writer/FontWriter.php | 605 - .../mpdf/mpdf/src/Writer/FormWriter.php | 48 - .../mpdf/mpdf/src/Writer/ImageWriter.php | 100 - .../mpdf/mpdf/src/Writer/JavaScriptWriter.php | 38 - .../mpdf/mpdf/src/Writer/MetadataWriter.php | 699 - .../mpdf/mpdf/src/Writer/ObjectWriter.php | 48 - .../mpdf/src/Writer/OptionalContentWriter.php | 57 - .../mpdf/mpdf/src/Writer/PageWriter.php | 238 - .../mpdf/mpdf/src/Writer/ResourceWriter.php | 193 - dependencies/mpdf/mpdf/src/functions-dev.php | 15 - dependencies/mpdf/mpdf/src/functions.php | 23 - .../mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf | Bin 676456 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSansCondensed.ttf | Bin 690388 -> 0 bytes .../mpdf/ttfonts/DejaVuSerifCondensed.ttf | Bin 334040 -> 0 bytes dependencies/mpdf/mpdf/ttfonts/DejaVuinfo.txt | 99 - dependencies/mpdf/mpdf/ttfonts/FreeMono.ttf | Bin 584424 -> 0 bytes .../mpdf/mpdf/ttfonts/FreeMonoBold.ttf | Bin 296284 -> 0 bytes dependencies/mpdf/mpdf/ttfonts/FreeSerif.ttf | Bin 3303588 -> 0 bytes .../mpdf/mpdf/ttfonts/FreeSerifBold.ttf | Bin 1310828 -> 0 bytes .../psr-http-message-shim/src/Request.php | 253 - .../psr-http-message-shim/src/Response.php | 207 - .../mpdf/psr-http-message-shim/src/Stream.php | 209 - .../mpdf/psr-http-message-shim/src/Uri.php | 240 - .../src/MpdfPsrLogAwareTrait.php | 23 - .../src/PsrLogAwareTrait.php | 16 - .../deep-copy/src/DeepCopy/DeepCopy.php | 240 - .../src/DeepCopy/Exception/CloneException.php | 8 - .../DeepCopy/Exception/PropertyException.php | 8 - .../src/DeepCopy/Filter/ChainableFilter.php | 22 - .../Doctrine/DoctrineCollectionFilter.php | 27 - .../DoctrineEmptyCollectionFilter.php | 26 - .../Filter/Doctrine/DoctrineProxyFilter.php | 21 - .../deep-copy/src/DeepCopy/Filter/Filter.php | 18 - .../src/DeepCopy/Filter/KeepFilter.php | 16 - .../src/DeepCopy/Filter/ReplaceFilter.php | 34 - .../src/DeepCopy/Filter/SetNullFilter.php | 22 - .../Matcher/Doctrine/DoctrineProxyMatcher.php | 21 - .../src/DeepCopy/Matcher/Matcher.php | 14 - .../src/DeepCopy/Matcher/PropertyMatcher.php | 36 - .../DeepCopy/Matcher/PropertyNameMatcher.php | 30 - .../DeepCopy/Matcher/PropertyTypeMatcher.php | 46 - .../DeepCopy/Reflection/ReflectionHelper.php | 63 - .../TypeFilter/Date/DateIntervalFilter.php | 29 - .../src/DeepCopy/TypeFilter/ReplaceFilter.php | 28 - .../DeepCopy/TypeFilter/ShallowCopyFilter.php | 17 - .../TypeFilter/Spl/ArrayObjectFilter.php | 32 - .../TypeFilter/Spl/SplDoublyLinkedList.php | 10 - .../Spl/SplDoublyLinkedListFilter.php | 41 - .../src/DeepCopy/TypeFilter/TypeFilter.php | 13 - .../src/DeepCopy/TypeMatcher/TypeMatcher.php | 27 - .../deep-copy/src/DeepCopy/deep_copy.php | 19 - dependencies/nesbot/carbon/extension.neon | 5 - .../MessageFormatterMapperStrongType.php | 22 - .../MessageFormatterMapperWeakType.php | 28 - .../Carbon/PHPStan/AbstractMacroBuiltin.php | 30 - .../Carbon/PHPStan/AbstractMacroStatic.php | 33 - .../lazy/Carbon/PHPStan/MacroStrongType.php | 40 - .../lazy/Carbon/PHPStan/MacroWeakType.php | 46 - .../lazy/Carbon/TranslatorStrongType.php | 43 - .../carbon/lazy/Carbon/TranslatorWeakType.php | 31 - dependencies/nesbot/carbon/sponsors.php | 62 - .../carbon/src/Carbon/AbstractTranslator.php | 323 - .../nesbot/carbon/src/Carbon/Carbon.php | 520 - .../src/Carbon/CarbonConverterInterface.php | 17 - .../carbon/src/Carbon/CarbonImmutable.php | 569 - .../carbon/src/Carbon/CarbonInterface.php | 4763 --- .../carbon/src/Carbon/CarbonInterval.php | 2443 -- .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 2269 -- .../src/Carbon/CarbonPeriodImmutable.php | 31 - .../carbon/src/Carbon/CarbonTimeZone.php | 271 - .../nesbot/carbon/src/Carbon/Cli/Invoker.php | 31 - .../Carbon/Doctrine/CarbonDoctrineType.php | 19 - .../Carbon/Doctrine/CarbonImmutableType.php | 34 - .../carbon/src/Carbon/Doctrine/CarbonType.php | 34 - .../Carbon/Doctrine/CarbonTypeConverter.php | 94 - .../Doctrine/DateTimeDefaultPrecision.php | 34 - .../Carbon/Doctrine/DateTimeImmutableType.php | 22 - .../src/Carbon/Doctrine/DateTimeType.php | 15 - .../Exceptions/BadComparisonUnitException.php | 43 - .../BadFluentConstructorException.php | 44 - .../Exceptions/BadFluentSetterException.php | 44 - .../Exceptions/BadMethodCallException.php | 16 - .../Exceptions/EndLessPeriodException.php | 17 - .../src/Carbon/Exceptions/Exception.php | 16 - .../Carbon/Exceptions/ImmutableException.php | 44 - .../Exceptions/InvalidArgumentException.php | 16 - .../Exceptions/InvalidCastException.php | 17 - .../Exceptions/InvalidDateException.php | 61 - .../Exceptions/InvalidFormatException.php | 17 - .../Exceptions/InvalidIntervalException.php | 17 - .../Exceptions/InvalidPeriodDateException.php | 17 - .../InvalidPeriodParameterException.php | 17 - .../Exceptions/InvalidTimeZoneException.php | 17 - .../Exceptions/InvalidTypeException.php | 17 - .../Exceptions/NotACarbonClassException.php | 45 - .../Carbon/Exceptions/NotAPeriodException.php | 17 - .../Exceptions/NotLocaleAwareException.php | 29 - .../Carbon/Exceptions/OutOfRangeException.php | 89 - .../Carbon/Exceptions/ParseErrorException.php | 78 - .../Carbon/Exceptions/RuntimeException.php | 16 - .../src/Carbon/Exceptions/UnitException.php | 17 - .../Exceptions/UnitNotConfiguredException.php | 43 - .../Exceptions/UnknownGetterException.php | 44 - .../Exceptions/UnknownMethodException.php | 44 - .../Exceptions/UnknownSetterException.php | 44 - .../Exceptions/UnknownUnitException.php | 43 - .../Exceptions/UnreachableException.php | 17 - .../nesbot/carbon/src/Carbon/Factory.php | 304 - .../carbon/src/Carbon/FactoryImmutable.php | 255 - .../nesbot/carbon/src/Carbon/Lang/aa.php | 15 - .../nesbot/carbon/src/Carbon/Lang/aa_DJ.php | 44 - .../nesbot/carbon/src/Carbon/Lang/aa_ER.php | 28 - .../carbon/src/Carbon/Lang/aa_ER@saaho.php | 28 - .../nesbot/carbon/src/Carbon/Lang/aa_ET.php | 27 - .../nesbot/carbon/src/Carbon/Lang/af.php | 79 - .../nesbot/carbon/src/Carbon/Lang/af_NA.php | 28 - .../nesbot/carbon/src/Carbon/Lang/af_ZA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/agq.php | 28 - .../nesbot/carbon/src/Carbon/Lang/agr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/agr_PE.php | 44 - .../nesbot/carbon/src/Carbon/Lang/ak.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ak_GH.php | 40 - .../nesbot/carbon/src/Carbon/Lang/am.php | 15 - .../nesbot/carbon/src/Carbon/Lang/am_ET.php | 58 - .../nesbot/carbon/src/Carbon/Lang/an.php | 15 - .../nesbot/carbon/src/Carbon/Lang/an_ES.php | 55 - .../nesbot/carbon/src/Carbon/Lang/anp.php | 15 - .../nesbot/carbon/src/Carbon/Lang/anp_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ar.php | 93 - .../nesbot/carbon/src/Carbon/Lang/ar_AE.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_BH.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_DJ.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_DZ.php | 92 - .../nesbot/carbon/src/Carbon/Lang/ar_EG.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_EH.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_ER.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_IL.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/ar_IQ.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_JO.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_KM.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_KW.php | 95 - .../nesbot/carbon/src/Carbon/Lang/ar_LB.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_LY.php | 92 - .../nesbot/carbon/src/Carbon/Lang/ar_MA.php | 92 - .../nesbot/carbon/src/Carbon/Lang/ar_MR.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_OM.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_PS.php | 18 - .../nesbot/carbon/src/Carbon/Lang/ar_QA.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_SA.php | 94 - .../nesbot/carbon/src/Carbon/Lang/ar_SD.php | 29 - .../nesbot/carbon/src/Carbon/Lang/ar_SO.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_SS.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ar_SY.php | 29 - .../carbon/src/Carbon/Lang/ar_Shakl.php | 95 - .../nesbot/carbon/src/Carbon/Lang/ar_TD.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ar_TN.php | 91 - .../nesbot/carbon/src/Carbon/Lang/ar_YE.php | 28 - .../nesbot/carbon/src/Carbon/Lang/as.php | 15 - .../nesbot/carbon/src/Carbon/Lang/as_IN.php | 55 - .../nesbot/carbon/src/Carbon/Lang/asa.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ast.php | 59 - .../nesbot/carbon/src/Carbon/Lang/ast_ES.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ayc.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ayc_PE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/az.php | 128 - .../nesbot/carbon/src/Carbon/Lang/az_AZ.php | 21 - .../nesbot/carbon/src/Carbon/Lang/az_Cyrl.php | 20 - .../nesbot/carbon/src/Carbon/Lang/az_IR.php | 27 - .../nesbot/carbon/src/Carbon/Lang/az_Latn.php | 29 - .../nesbot/carbon/src/Carbon/Lang/bas.php | 32 - .../nesbot/carbon/src/Carbon/Lang/be.php | 172 - .../nesbot/carbon/src/Carbon/Lang/be_BY.php | 22 - .../carbon/src/Carbon/Lang/be_BY@latin.php | 27 - .../nesbot/carbon/src/Carbon/Lang/bem.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bem_ZM.php | 56 - .../nesbot/carbon/src/Carbon/Lang/ber.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ber_DZ.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ber_MA.php | 27 - .../nesbot/carbon/src/Carbon/Lang/bez.php | 28 - .../nesbot/carbon/src/Carbon/Lang/bg.php | 114 - .../nesbot/carbon/src/Carbon/Lang/bg_BG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/bhb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bhb_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/bho.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bho_IN.php | 55 - .../nesbot/carbon/src/Carbon/Lang/bi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/bi_VU.php | 53 - .../nesbot/carbon/src/Carbon/Lang/bm.php | 70 - .../nesbot/carbon/src/Carbon/Lang/bn.php | 100 - .../nesbot/carbon/src/Carbon/Lang/bn_BD.php | 27 - .../nesbot/carbon/src/Carbon/Lang/bn_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/bo.php | 71 - .../nesbot/carbon/src/Carbon/Lang/bo_CN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/bo_IN.php | 29 - .../nesbot/carbon/src/Carbon/Lang/br.php | 76 - .../nesbot/carbon/src/Carbon/Lang/br_FR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/brx.php | 15 - .../nesbot/carbon/src/Carbon/Lang/brx_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/bs.php | 97 - .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php | 28 - .../nesbot/carbon/src/Carbon/Lang/bs_Latn.php | 13 - .../nesbot/carbon/src/Carbon/Lang/byn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/byn_ER.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ca.php | 117 - .../nesbot/carbon/src/Carbon/Lang/ca_AD.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ca_ES.php | 12 - .../carbon/src/Carbon/Lang/ca_ES_Valencia.php | 23 - .../nesbot/carbon/src/Carbon/Lang/ca_FR.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ca_IT.php | 13 - .../nesbot/carbon/src/Carbon/Lang/ccp.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ccp_IN.php | 14 - .../nesbot/carbon/src/Carbon/Lang/ce.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ce_RU.php | 55 - .../nesbot/carbon/src/Carbon/Lang/cgg.php | 31 - .../nesbot/carbon/src/Carbon/Lang/chr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/chr_US.php | 58 - .../nesbot/carbon/src/Carbon/Lang/ckb.php | 89 - .../nesbot/carbon/src/Carbon/Lang/cmn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/cmn_TW.php | 54 - .../nesbot/carbon/src/Carbon/Lang/crh.php | 15 - .../nesbot/carbon/src/Carbon/Lang/crh_UA.php | 56 - .../nesbot/carbon/src/Carbon/Lang/cs.php | 123 - .../nesbot/carbon/src/Carbon/Lang/cs_CZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/csb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/csb_PL.php | 41 - .../nesbot/carbon/src/Carbon/Lang/cu.php | 52 - .../nesbot/carbon/src/Carbon/Lang/cv.php | 65 - .../nesbot/carbon/src/Carbon/Lang/cv_RU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/cy.php | 79 - .../nesbot/carbon/src/Carbon/Lang/cy_GB.php | 12 - .../nesbot/carbon/src/Carbon/Lang/da.php | 81 - .../nesbot/carbon/src/Carbon/Lang/da_DK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/da_GL.php | 19 - .../nesbot/carbon/src/Carbon/Lang/dav.php | 27 - .../nesbot/carbon/src/Carbon/Lang/de.php | 117 - .../nesbot/carbon/src/Carbon/Lang/de_AT.php | 27 - .../nesbot/carbon/src/Carbon/Lang/de_BE.php | 20 - .../nesbot/carbon/src/Carbon/Lang/de_CH.php | 20 - .../nesbot/carbon/src/Carbon/Lang/de_DE.php | 16 - .../nesbot/carbon/src/Carbon/Lang/de_IT.php | 16 - .../nesbot/carbon/src/Carbon/Lang/de_LI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/de_LU.php | 20 - .../nesbot/carbon/src/Carbon/Lang/dje.php | 40 - .../nesbot/carbon/src/Carbon/Lang/doi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/doi_IN.php | 31 - .../nesbot/carbon/src/Carbon/Lang/dsb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/dsb_DE.php | 60 - .../nesbot/carbon/src/Carbon/Lang/dua.php | 56 - .../nesbot/carbon/src/Carbon/Lang/dv.php | 89 - .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 87 - .../nesbot/carbon/src/Carbon/Lang/dyo.php | 27 - .../nesbot/carbon/src/Carbon/Lang/dz.php | 15 - .../nesbot/carbon/src/Carbon/Lang/dz_BT.php | 43 - .../nesbot/carbon/src/Carbon/Lang/ebu.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ee.php | 56 - .../nesbot/carbon/src/Carbon/Lang/ee_TG.php | 19 - .../nesbot/carbon/src/Carbon/Lang/el.php | 93 - .../nesbot/carbon/src/Carbon/Lang/el_CY.php | 19 - .../nesbot/carbon/src/Carbon/Lang/el_GR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/en.php | 87 - .../nesbot/carbon/src/Carbon/Lang/en_001.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_150.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_AG.php | 21 - .../nesbot/carbon/src/Carbon/Lang/en_AI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_AS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_AT.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_AU.php | 31 - .../nesbot/carbon/src/Carbon/Lang/en_BB.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_BE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_BI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_BM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_BS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_BW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_BZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_CA.php | 29 - .../nesbot/carbon/src/Carbon/Lang/en_CC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_CH.php | 22 - .../nesbot/carbon/src/Carbon/Lang/en_CK.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_CM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_CX.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_CY.php | 28 - .../nesbot/carbon/src/Carbon/Lang/en_DE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_DG.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_DK.php | 22 - .../nesbot/carbon/src/Carbon/Lang/en_DM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_ER.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_FI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_FJ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_FK.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_FM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GB.php | 30 - .../nesbot/carbon/src/Carbon/Lang/en_GD.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GG.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GH.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_GU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_GY.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_HK.php | 18 - .../nesbot/carbon/src/Carbon/Lang/en_IE.php | 31 - .../nesbot/carbon/src/Carbon/Lang/en_IL.php | 29 - .../nesbot/carbon/src/Carbon/Lang/en_IM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/en_IO.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_ISO.php | 21 - .../nesbot/carbon/src/Carbon/Lang/en_JE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_JM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_KE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_KI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_KN.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_KY.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_LC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_LR.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_LS.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MG.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MP.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MS.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_MU.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MW.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_MY.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_NA.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_NF.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_NG.php | 18 - .../nesbot/carbon/src/Carbon/Lang/en_NL.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_NR.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_NU.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_NZ.php | 31 - .../nesbot/carbon/src/Carbon/Lang/en_PG.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_PH.php | 18 - .../nesbot/carbon/src/Carbon/Lang/en_PK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_PN.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_PR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_PW.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_RW.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SB.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SD.php | 15 - .../nesbot/carbon/src/Carbon/Lang/en_SE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SG.php | 24 - .../nesbot/carbon/src/Carbon/Lang/en_SH.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SI.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SL.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SS.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SX.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_SZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_TC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_TK.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_TO.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_TT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_TV.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_TZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_UG.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_UM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_US.php | 12 - .../carbon/src/Carbon/Lang/en_US_Posix.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_VC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_VG.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_VI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_VU.php | 14 - .../nesbot/carbon/src/Carbon/Lang/en_WS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/en_ZA.php | 26 - .../nesbot/carbon/src/Carbon/Lang/en_ZM.php | 22 - .../nesbot/carbon/src/Carbon/Lang/en_ZW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/eo.php | 77 - .../nesbot/carbon/src/Carbon/Lang/es.php | 121 - .../nesbot/carbon/src/Carbon/Lang/es_419.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_AR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_BO.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_BR.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_BZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_CL.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_CO.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_CR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_CU.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_DO.php | 31 - .../nesbot/carbon/src/Carbon/Lang/es_EA.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_EC.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_ES.php | 16 - .../nesbot/carbon/src/Carbon/Lang/es_GQ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_GT.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_HN.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_IC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/es_MX.php | 20 - .../nesbot/carbon/src/Carbon/Lang/es_NI.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PA.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PE.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PH.php | 22 - .../nesbot/carbon/src/Carbon/Lang/es_PR.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_PY.php | 19 - .../nesbot/carbon/src/Carbon/Lang/es_SV.php | 20 - .../nesbot/carbon/src/Carbon/Lang/es_US.php | 38 - .../nesbot/carbon/src/Carbon/Lang/es_UY.php | 21 - .../nesbot/carbon/src/Carbon/Lang/es_VE.php | 19 - .../nesbot/carbon/src/Carbon/Lang/et.php | 93 - .../nesbot/carbon/src/Carbon/Lang/et_EE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/eu.php | 67 - .../nesbot/carbon/src/Carbon/Lang/eu_ES.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ewo.php | 55 - .../nesbot/carbon/src/Carbon/Lang/fa.php | 84 - .../nesbot/carbon/src/Carbon/Lang/fa_AF.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fa_IR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ff.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ff_CM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ff_GN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ff_MR.php | 21 - .../nesbot/carbon/src/Carbon/Lang/ff_SN.php | 16 - .../nesbot/carbon/src/Carbon/Lang/fi.php | 88 - .../nesbot/carbon/src/Carbon/Lang/fi_FI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fil.php | 15 - .../nesbot/carbon/src/Carbon/Lang/fil_PH.php | 62 - .../nesbot/carbon/src/Carbon/Lang/fo.php | 69 - .../nesbot/carbon/src/Carbon/Lang/fo_DK.php | 19 - .../nesbot/carbon/src/Carbon/Lang/fo_FO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr.php | 123 - .../nesbot/carbon/src/Carbon/Lang/fr_BE.php | 18 - .../nesbot/carbon/src/Carbon/Lang/fr_BF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_BI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_BJ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_BL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CA.php | 25 - .../nesbot/carbon/src/Carbon/Lang/fr_CD.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CH.php | 24 - .../nesbot/carbon/src/Carbon/Lang/fr_CI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_CM.php | 14 - .../nesbot/carbon/src/Carbon/Lang/fr_DJ.php | 22 - .../nesbot/carbon/src/Carbon/Lang/fr_DZ.php | 23 - .../nesbot/carbon/src/Carbon/Lang/fr_FR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GP.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_GQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_HT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_KM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_LU.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_MA.php | 15 - .../nesbot/carbon/src/Carbon/Lang/fr_MC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_ML.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_MR.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_MU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_NC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_NE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_PF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_PM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_RE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_RW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_SC.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_SN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_SY.php | 23 - .../nesbot/carbon/src/Carbon/Lang/fr_TD.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_TG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_TN.php | 22 - .../nesbot/carbon/src/Carbon/Lang/fr_VU.php | 21 - .../nesbot/carbon/src/Carbon/Lang/fr_WF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fr_YT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/fur.php | 15 - .../nesbot/carbon/src/Carbon/Lang/fur_IT.php | 39 - .../nesbot/carbon/src/Carbon/Lang/fy.php | 76 - .../nesbot/carbon/src/Carbon/Lang/fy_DE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/fy_NL.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ga.php | 77 - .../nesbot/carbon/src/Carbon/Lang/ga_IE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/gd.php | 75 - .../nesbot/carbon/src/Carbon/Lang/gd_GB.php | 12 - .../nesbot/carbon/src/Carbon/Lang/gez.php | 15 - .../nesbot/carbon/src/Carbon/Lang/gez_ER.php | 56 - .../nesbot/carbon/src/Carbon/Lang/gez_ET.php | 27 - .../nesbot/carbon/src/Carbon/Lang/gl.php | 98 - .../nesbot/carbon/src/Carbon/Lang/gl_ES.php | 12 - .../nesbot/carbon/src/Carbon/Lang/gom.php | 15 - .../carbon/src/Carbon/Lang/gom_Latn.php | 79 - .../nesbot/carbon/src/Carbon/Lang/gsw.php | 49 - .../nesbot/carbon/src/Carbon/Lang/gsw_CH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/gsw_FR.php | 20 - .../nesbot/carbon/src/Carbon/Lang/gsw_LI.php | 20 - .../nesbot/carbon/src/Carbon/Lang/gu.php | 82 - .../nesbot/carbon/src/Carbon/Lang/gu_IN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/guz.php | 47 - .../nesbot/carbon/src/Carbon/Lang/gv.php | 15 - .../nesbot/carbon/src/Carbon/Lang/gv_GB.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ha.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ha_GH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ha_NE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ha_NG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/hak.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hak_TW.php | 55 - .../nesbot/carbon/src/Carbon/Lang/haw.php | 54 - .../nesbot/carbon/src/Carbon/Lang/he.php | 86 - .../nesbot/carbon/src/Carbon/Lang/he_IL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/hi.php | 82 - .../nesbot/carbon/src/Carbon/Lang/hi_IN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/hif.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hif_FJ.php | 54 - .../nesbot/carbon/src/Carbon/Lang/hne.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hne_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/hr.php | 111 - .../nesbot/carbon/src/Carbon/Lang/hr_BA.php | 32 - .../nesbot/carbon/src/Carbon/Lang/hr_HR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/hsb.php | 15 - .../nesbot/carbon/src/Carbon/Lang/hsb_DE.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ht.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ht_HT.php | 55 - .../nesbot/carbon/src/Carbon/Lang/hu.php | 118 - .../nesbot/carbon/src/Carbon/Lang/hu_HU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/hy.php | 95 - .../nesbot/carbon/src/Carbon/Lang/hy_AM.php | 24 - .../nesbot/carbon/src/Carbon/Lang/i18n.php | 23 - .../nesbot/carbon/src/Carbon/Lang/ia.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ia_FR.php | 55 - .../nesbot/carbon/src/Carbon/Lang/id.php | 92 - .../nesbot/carbon/src/Carbon/Lang/id_ID.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ig.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ig_NG.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ii.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ik.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ik_CA.php | 50 - .../nesbot/carbon/src/Carbon/Lang/in.php | 12 - .../nesbot/carbon/src/Carbon/Lang/is.php | 55 - .../nesbot/carbon/src/Carbon/Lang/is_IS.php | 12 - .../nesbot/carbon/src/Carbon/Lang/it.php | 115 - .../nesbot/carbon/src/Carbon/Lang/it_CH.php | 20 - .../nesbot/carbon/src/Carbon/Lang/it_IT.php | 16 - .../nesbot/carbon/src/Carbon/Lang/it_SM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/it_VA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/iu.php | 15 - .../nesbot/carbon/src/Carbon/Lang/iu_CA.php | 54 - .../nesbot/carbon/src/Carbon/Lang/iw.php | 58 - .../nesbot/carbon/src/Carbon/Lang/ja.php | 102 - .../nesbot/carbon/src/Carbon/Lang/ja_JP.php | 12 - .../nesbot/carbon/src/Carbon/Lang/jgo.php | 13 - .../nesbot/carbon/src/Carbon/Lang/jmc.php | 28 - .../nesbot/carbon/src/Carbon/Lang/jv.php | 71 - .../nesbot/carbon/src/Carbon/Lang/ka.php | 204 - .../nesbot/carbon/src/Carbon/Lang/ka_GE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/kab.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kab_DZ.php | 56 - .../nesbot/carbon/src/Carbon/Lang/kam.php | 50 - .../nesbot/carbon/src/Carbon/Lang/kde.php | 28 - .../nesbot/carbon/src/Carbon/Lang/kea.php | 49 - .../nesbot/carbon/src/Carbon/Lang/khq.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ki.php | 55 - .../nesbot/carbon/src/Carbon/Lang/kk.php | 103 - .../nesbot/carbon/src/Carbon/Lang/kk_KZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/kkj.php | 13 - .../nesbot/carbon/src/Carbon/Lang/kl.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kl_GL.php | 64 - .../nesbot/carbon/src/Carbon/Lang/kln.php | 31 - .../nesbot/carbon/src/Carbon/Lang/km.php | 71 - .../nesbot/carbon/src/Carbon/Lang/km_KH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/kn.php | 75 - .../nesbot/carbon/src/Carbon/Lang/kn_IN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ko.php | 91 - .../nesbot/carbon/src/Carbon/Lang/ko_KP.php | 14 - .../nesbot/carbon/src/Carbon/Lang/ko_KR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/kok.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kok_IN.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ks.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ks_IN.php | 51 - .../src/Carbon/Lang/ks_IN@devanagari.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ksb.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ksf.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ksh.php | 57 - .../nesbot/carbon/src/Carbon/Lang/ku.php | 40 - .../nesbot/carbon/src/Carbon/Lang/ku_TR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/kw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/kw_GB.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ky.php | 106 - .../nesbot/carbon/src/Carbon/Lang/ky_KG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/lag.php | 28 - .../nesbot/carbon/src/Carbon/Lang/lb.php | 88 - .../nesbot/carbon/src/Carbon/Lang/lb_LU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/lg.php | 15 - .../nesbot/carbon/src/Carbon/Lang/lg_UG.php | 55 - .../nesbot/carbon/src/Carbon/Lang/li.php | 15 - .../nesbot/carbon/src/Carbon/Lang/li_NL.php | 55 - .../nesbot/carbon/src/Carbon/Lang/lij.php | 15 - .../nesbot/carbon/src/Carbon/Lang/lij_IT.php | 55 - .../nesbot/carbon/src/Carbon/Lang/lkt.php | 41 - .../nesbot/carbon/src/Carbon/Lang/ln.php | 60 - .../nesbot/carbon/src/Carbon/Lang/ln_AO.php | 17 - .../nesbot/carbon/src/Carbon/Lang/ln_CD.php | 16 - .../nesbot/carbon/src/Carbon/Lang/ln_CF.php | 17 - .../nesbot/carbon/src/Carbon/Lang/ln_CG.php | 17 - .../nesbot/carbon/src/Carbon/Lang/lo.php | 62 - .../nesbot/carbon/src/Carbon/Lang/lo_LA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/lrc.php | 17 - .../nesbot/carbon/src/Carbon/Lang/lrc_IQ.php | 13 - .../nesbot/carbon/src/Carbon/Lang/lt.php | 135 - .../nesbot/carbon/src/Carbon/Lang/lt_LT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/lu.php | 28 - .../nesbot/carbon/src/Carbon/Lang/luo.php | 55 - .../nesbot/carbon/src/Carbon/Lang/luy.php | 57 - .../nesbot/carbon/src/Carbon/Lang/lv.php | 183 - .../nesbot/carbon/src/Carbon/Lang/lv_LV.php | 12 - .../nesbot/carbon/src/Carbon/Lang/lzh.php | 15 - .../nesbot/carbon/src/Carbon/Lang/lzh_TW.php | 56 - .../nesbot/carbon/src/Carbon/Lang/mag.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mag_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/mai.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mai_IN.php | 51 - .../nesbot/carbon/src/Carbon/Lang/mas.php | 51 - .../nesbot/carbon/src/Carbon/Lang/mas_TZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/mer.php | 43 - .../nesbot/carbon/src/Carbon/Lang/mfe.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mfe_MU.php | 53 - .../nesbot/carbon/src/Carbon/Lang/mg.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mg_MG.php | 55 - .../nesbot/carbon/src/Carbon/Lang/mgh.php | 27 - .../nesbot/carbon/src/Carbon/Lang/mgo.php | 27 - .../nesbot/carbon/src/Carbon/Lang/mhr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mhr_RU.php | 55 - .../nesbot/carbon/src/Carbon/Lang/mi.php | 66 - .../nesbot/carbon/src/Carbon/Lang/mi_NZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/miq.php | 15 - .../nesbot/carbon/src/Carbon/Lang/miq_NI.php | 28 - .../nesbot/carbon/src/Carbon/Lang/mjw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mjw_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/mk.php | 116 - .../nesbot/carbon/src/Carbon/Lang/mk_MK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ml.php | 76 - .../nesbot/carbon/src/Carbon/Lang/ml_IN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/mn.php | 116 - .../nesbot/carbon/src/Carbon/Lang/mn_MN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/mni.php | 15 - .../nesbot/carbon/src/Carbon/Lang/mni_IN.php | 35 - .../nesbot/carbon/src/Carbon/Lang/mo.php | 12 - .../nesbot/carbon/src/Carbon/Lang/mr.php | 86 - .../nesbot/carbon/src/Carbon/Lang/mr_IN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ms.php | 104 - .../nesbot/carbon/src/Carbon/Lang/ms_BN.php | 22 - .../nesbot/carbon/src/Carbon/Lang/ms_MY.php | 18 - .../nesbot/carbon/src/Carbon/Lang/ms_SG.php | 22 - .../nesbot/carbon/src/Carbon/Lang/mt.php | 65 - .../nesbot/carbon/src/Carbon/Lang/mt_MT.php | 12 - .../nesbot/carbon/src/Carbon/Lang/mua.php | 28 - .../nesbot/carbon/src/Carbon/Lang/my.php | 70 - .../nesbot/carbon/src/Carbon/Lang/my_MM.php | 12 - .../nesbot/carbon/src/Carbon/Lang/mzn.php | 25 - .../nesbot/carbon/src/Carbon/Lang/nan.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nan_TW.php | 55 - .../carbon/src/Carbon/Lang/nan_TW@latin.php | 27 - .../nesbot/carbon/src/Carbon/Lang/naq.php | 52 - .../nesbot/carbon/src/Carbon/Lang/nb.php | 84 - .../nesbot/carbon/src/Carbon/Lang/nb_NO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nb_SJ.php | 18 - .../nesbot/carbon/src/Carbon/Lang/nd.php | 54 - .../nesbot/carbon/src/Carbon/Lang/nds.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nds_DE.php | 60 - .../nesbot/carbon/src/Carbon/Lang/nds_NL.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ne.php | 82 - .../nesbot/carbon/src/Carbon/Lang/ne_IN.php | 25 - .../nesbot/carbon/src/Carbon/Lang/ne_NP.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nhn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nhn_MX.php | 50 - .../nesbot/carbon/src/Carbon/Lang/niu.php | 15 - .../nesbot/carbon/src/Carbon/Lang/niu_NU.php | 55 - .../nesbot/carbon/src/Carbon/Lang/nl.php | 113 - .../nesbot/carbon/src/Carbon/Lang/nl_AW.php | 27 - .../nesbot/carbon/src/Carbon/Lang/nl_BE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/nl_BQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nl_CW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nl_NL.php | 24 - .../nesbot/carbon/src/Carbon/Lang/nl_SR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nl_SX.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nmg.php | 28 - .../nesbot/carbon/src/Carbon/Lang/nn.php | 78 - .../nesbot/carbon/src/Carbon/Lang/nn_NO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/nnh.php | 28 - .../nesbot/carbon/src/Carbon/Lang/no.php | 28 - .../nesbot/carbon/src/Carbon/Lang/nr.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nr_ZA.php | 26 - .../nesbot/carbon/src/Carbon/Lang/nso.php | 15 - .../nesbot/carbon/src/Carbon/Lang/nso_ZA.php | 54 - .../nesbot/carbon/src/Carbon/Lang/nus.php | 36 - .../nesbot/carbon/src/Carbon/Lang/nyn.php | 27 - .../nesbot/carbon/src/Carbon/Lang/oc.php | 100 - .../nesbot/carbon/src/Carbon/Lang/oc_FR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/om.php | 60 - .../nesbot/carbon/src/Carbon/Lang/om_ET.php | 12 - .../nesbot/carbon/src/Carbon/Lang/om_KE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/or.php | 15 - .../nesbot/carbon/src/Carbon/Lang/or_IN.php | 51 - .../nesbot/carbon/src/Carbon/Lang/os.php | 15 - .../nesbot/carbon/src/Carbon/Lang/os_RU.php | 55 - .../nesbot/carbon/src/Carbon/Lang/pa.php | 76 - .../nesbot/carbon/src/Carbon/Lang/pa_Arab.php | 26 - .../nesbot/carbon/src/Carbon/Lang/pa_Guru.php | 27 - .../nesbot/carbon/src/Carbon/Lang/pa_IN.php | 19 - .../nesbot/carbon/src/Carbon/Lang/pa_PK.php | 27 - .../nesbot/carbon/src/Carbon/Lang/pap.php | 39 - .../nesbot/carbon/src/Carbon/Lang/pap_AW.php | 16 - .../nesbot/carbon/src/Carbon/Lang/pap_CW.php | 16 - .../nesbot/carbon/src/Carbon/Lang/pl.php | 126 - .../nesbot/carbon/src/Carbon/Lang/pl_PL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/prg.php | 52 - .../nesbot/carbon/src/Carbon/Lang/ps.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ps_AF.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt.php | 116 - .../nesbot/carbon/src/Carbon/Lang/pt_AO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 39 - .../nesbot/carbon/src/Carbon/Lang/pt_CH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_CV.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_GQ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_GW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_LU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_MO.php | 20 - .../nesbot/carbon/src/Carbon/Lang/pt_MZ.php | 14 - .../nesbot/carbon/src/Carbon/Lang/pt_PT.php | 27 - .../nesbot/carbon/src/Carbon/Lang/pt_ST.php | 12 - .../nesbot/carbon/src/Carbon/Lang/pt_TL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/qu.php | 22 - .../nesbot/carbon/src/Carbon/Lang/qu_BO.php | 14 - .../nesbot/carbon/src/Carbon/Lang/qu_EC.php | 14 - .../nesbot/carbon/src/Carbon/Lang/quz.php | 15 - .../nesbot/carbon/src/Carbon/Lang/quz_PE.php | 54 - .../nesbot/carbon/src/Carbon/Lang/raj.php | 15 - .../nesbot/carbon/src/Carbon/Lang/raj_IN.php | 47 - .../nesbot/carbon/src/Carbon/Lang/rm.php | 51 - .../nesbot/carbon/src/Carbon/Lang/rn.php | 56 - .../nesbot/carbon/src/Carbon/Lang/ro.php | 77 - .../nesbot/carbon/src/Carbon/Lang/ro_MD.php | 21 - .../nesbot/carbon/src/Carbon/Lang/ro_RO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/rof.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ru.php | 191 - .../nesbot/carbon/src/Carbon/Lang/ru_BY.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_KG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_KZ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_MD.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_RU.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ru_UA.php | 20 - .../nesbot/carbon/src/Carbon/Lang/rw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/rw_RW.php | 55 - .../nesbot/carbon/src/Carbon/Lang/rwk.php | 28 - .../nesbot/carbon/src/Carbon/Lang/sa.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sa_IN.php | 55 - .../nesbot/carbon/src/Carbon/Lang/sah.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sah_RU.php | 27 - .../nesbot/carbon/src/Carbon/Lang/saq.php | 27 - .../nesbot/carbon/src/Carbon/Lang/sat.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sat_IN.php | 54 - .../nesbot/carbon/src/Carbon/Lang/sbp.php | 28 - .../nesbot/carbon/src/Carbon/Lang/sc.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sc_IT.php | 55 - .../nesbot/carbon/src/Carbon/Lang/sd.php | 81 - .../nesbot/carbon/src/Carbon/Lang/sd_IN.php | 26 - .../src/Carbon/Lang/sd_IN@devanagari.php | 27 - .../nesbot/carbon/src/Carbon/Lang/se.php | 73 - .../nesbot/carbon/src/Carbon/Lang/se_FI.php | 27 - .../nesbot/carbon/src/Carbon/Lang/se_NO.php | 12 - .../nesbot/carbon/src/Carbon/Lang/se_SE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/seh.php | 26 - .../nesbot/carbon/src/Carbon/Lang/ses.php | 56 - .../nesbot/carbon/src/Carbon/Lang/sg.php | 52 - .../nesbot/carbon/src/Carbon/Lang/sgs.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sgs_LT.php | 55 - .../nesbot/carbon/src/Carbon/Lang/sh.php | 68 - .../nesbot/carbon/src/Carbon/Lang/shi.php | 57 - .../carbon/src/Carbon/Lang/shi_Latn.php | 33 - .../carbon/src/Carbon/Lang/shi_Tfng.php | 12 - .../nesbot/carbon/src/Carbon/Lang/shn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/shn_MM.php | 55 - .../nesbot/carbon/src/Carbon/Lang/shs.php | 15 - .../nesbot/carbon/src/Carbon/Lang/shs_CA.php | 38 - .../nesbot/carbon/src/Carbon/Lang/si.php | 78 - .../nesbot/carbon/src/Carbon/Lang/si_LK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sid.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sid_ET.php | 27 - .../nesbot/carbon/src/Carbon/Lang/sk.php | 83 - .../nesbot/carbon/src/Carbon/Lang/sk_SK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sl.php | 129 - .../nesbot/carbon/src/Carbon/Lang/sl_SI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sm.php | 15 - .../nesbot/carbon/src/Carbon/Lang/sm_WS.php | 53 - .../nesbot/carbon/src/Carbon/Lang/smn.php | 57 - .../nesbot/carbon/src/Carbon/Lang/sn.php | 55 - .../nesbot/carbon/src/Carbon/Lang/so.php | 74 - .../nesbot/carbon/src/Carbon/Lang/so_DJ.php | 20 - .../nesbot/carbon/src/Carbon/Lang/so_ET.php | 16 - .../nesbot/carbon/src/Carbon/Lang/so_KE.php | 16 - .../nesbot/carbon/src/Carbon/Lang/so_SO.php | 16 - .../nesbot/carbon/src/Carbon/Lang/sq.php | 79 - .../nesbot/carbon/src/Carbon/Lang/sq_AL.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sq_MK.php | 19 - .../nesbot/carbon/src/Carbon/Lang/sq_XK.php | 19 - .../nesbot/carbon/src/Carbon/Lang/sr.php | 112 - .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 112 - .../carbon/src/Carbon/Lang/sr_Cyrl_BA.php | 33 - .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 118 - .../carbon/src/Carbon/Lang/sr_Cyrl_XK.php | 24 - .../nesbot/carbon/src/Carbon/Lang/sr_Latn.php | 12 - .../carbon/src/Carbon/Lang/sr_Latn_BA.php | 33 - .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 76 - .../carbon/src/Carbon/Lang/sr_Latn_XK.php | 24 - .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sr_RS.php | 16 - .../carbon/src/Carbon/Lang/sr_RS@latin.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ss.php | 78 - .../nesbot/carbon/src/Carbon/Lang/ss_ZA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/st.php | 15 - .../nesbot/carbon/src/Carbon/Lang/st_ZA.php | 54 - .../nesbot/carbon/src/Carbon/Lang/sv.php | 87 - .../nesbot/carbon/src/Carbon/Lang/sv_AX.php | 19 - .../nesbot/carbon/src/Carbon/Lang/sv_FI.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sv_SE.php | 12 - .../nesbot/carbon/src/Carbon/Lang/sw.php | 74 - .../nesbot/carbon/src/Carbon/Lang/sw_CD.php | 17 - .../nesbot/carbon/src/Carbon/Lang/sw_KE.php | 27 - .../nesbot/carbon/src/Carbon/Lang/sw_TZ.php | 28 - .../nesbot/carbon/src/Carbon/Lang/sw_UG.php | 17 - .../nesbot/carbon/src/Carbon/Lang/szl.php | 15 - .../nesbot/carbon/src/Carbon/Lang/szl_PL.php | 55 - .../nesbot/carbon/src/Carbon/Lang/ta.php | 97 - .../nesbot/carbon/src/Carbon/Lang/ta_IN.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ta_LK.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ta_MY.php | 28 - .../nesbot/carbon/src/Carbon/Lang/ta_SG.php | 27 - .../nesbot/carbon/src/Carbon/Lang/tcy.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tcy_IN.php | 39 - .../nesbot/carbon/src/Carbon/Lang/te.php | 89 - .../nesbot/carbon/src/Carbon/Lang/te_IN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/teo.php | 28 - .../nesbot/carbon/src/Carbon/Lang/teo_KE.php | 14 - .../nesbot/carbon/src/Carbon/Lang/tet.php | 64 - .../nesbot/carbon/src/Carbon/Lang/tg.php | 104 - .../nesbot/carbon/src/Carbon/Lang/tg_TJ.php | 12 - .../nesbot/carbon/src/Carbon/Lang/th.php | 73 - .../nesbot/carbon/src/Carbon/Lang/th_TH.php | 12 - .../nesbot/carbon/src/Carbon/Lang/the.php | 15 - .../nesbot/carbon/src/Carbon/Lang/the_NP.php | 27 - .../nesbot/carbon/src/Carbon/Lang/ti.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ti_ER.php | 56 - .../nesbot/carbon/src/Carbon/Lang/ti_ET.php | 27 - .../nesbot/carbon/src/Carbon/Lang/tig.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tig_ER.php | 56 - .../nesbot/carbon/src/Carbon/Lang/tk.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tk_TM.php | 77 - .../nesbot/carbon/src/Carbon/Lang/tl.php | 61 - .../nesbot/carbon/src/Carbon/Lang/tl_PH.php | 18 - .../nesbot/carbon/src/Carbon/Lang/tlh.php | 72 - .../nesbot/carbon/src/Carbon/Lang/tn.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tn_ZA.php | 54 - .../nesbot/carbon/src/Carbon/Lang/to.php | 15 - .../nesbot/carbon/src/Carbon/Lang/to_TO.php | 54 - .../nesbot/carbon/src/Carbon/Lang/tpi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tpi_PG.php | 55 - .../nesbot/carbon/src/Carbon/Lang/tr.php | 121 - .../nesbot/carbon/src/Carbon/Lang/tr_CY.php | 23 - .../nesbot/carbon/src/Carbon/Lang/tr_TR.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ts.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ts_ZA.php | 54 - .../nesbot/carbon/src/Carbon/Lang/tt.php | 15 - .../nesbot/carbon/src/Carbon/Lang/tt_RU.php | 39 - .../carbon/src/Carbon/Lang/tt_RU@iqtelif.php | 28 - .../nesbot/carbon/src/Carbon/Lang/twq.php | 14 - .../nesbot/carbon/src/Carbon/Lang/tzl.php | 65 - .../nesbot/carbon/src/Carbon/Lang/tzm.php | 57 - .../carbon/src/Carbon/Lang/tzm_Latn.php | 64 - .../nesbot/carbon/src/Carbon/Lang/ug.php | 90 - .../nesbot/carbon/src/Carbon/Lang/ug_CN.php | 17 - .../nesbot/carbon/src/Carbon/Lang/uk.php | 212 - .../nesbot/carbon/src/Carbon/Lang/uk_UA.php | 12 - .../nesbot/carbon/src/Carbon/Lang/unm.php | 15 - .../nesbot/carbon/src/Carbon/Lang/unm_US.php | 57 - .../nesbot/carbon/src/Carbon/Lang/ur.php | 94 - .../nesbot/carbon/src/Carbon/Lang/ur_IN.php | 26 - .../nesbot/carbon/src/Carbon/Lang/ur_PK.php | 27 - .../nesbot/carbon/src/Carbon/Lang/uz.php | 85 - .../nesbot/carbon/src/Carbon/Lang/uz_Arab.php | 28 - .../nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php | 20 - .../nesbot/carbon/src/Carbon/Lang/uz_Latn.php | 74 - .../nesbot/carbon/src/Carbon/Lang/uz_UZ.php | 27 - .../carbon/src/Carbon/Lang/uz_UZ@cyrillic.php | 27 - .../nesbot/carbon/src/Carbon/Lang/vai.php | 35 - .../carbon/src/Carbon/Lang/vai_Latn.php | 27 - .../carbon/src/Carbon/Lang/vai_Vaii.php | 12 - .../nesbot/carbon/src/Carbon/Lang/ve.php | 15 - .../nesbot/carbon/src/Carbon/Lang/ve_ZA.php | 49 - .../nesbot/carbon/src/Carbon/Lang/vi.php | 76 - .../nesbot/carbon/src/Carbon/Lang/vi_VN.php | 12 - .../nesbot/carbon/src/Carbon/Lang/vo.php | 52 - .../nesbot/carbon/src/Carbon/Lang/vun.php | 28 - .../nesbot/carbon/src/Carbon/Lang/wa.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wa_BE.php | 55 - .../nesbot/carbon/src/Carbon/Lang/wae.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wae_CH.php | 31 - .../nesbot/carbon/src/Carbon/Lang/wal.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wal_ET.php | 27 - .../nesbot/carbon/src/Carbon/Lang/wo.php | 15 - .../nesbot/carbon/src/Carbon/Lang/wo_SN.php | 39 - .../nesbot/carbon/src/Carbon/Lang/xh.php | 15 - .../nesbot/carbon/src/Carbon/Lang/xh_ZA.php | 54 - .../nesbot/carbon/src/Carbon/Lang/xog.php | 28 - .../nesbot/carbon/src/Carbon/Lang/yav.php | 28 - .../nesbot/carbon/src/Carbon/Lang/yi.php | 15 - .../nesbot/carbon/src/Carbon/Lang/yi_US.php | 54 - .../nesbot/carbon/src/Carbon/Lang/yo.php | 65 - .../nesbot/carbon/src/Carbon/Lang/yo_BJ.php | 28 - .../nesbot/carbon/src/Carbon/Lang/yo_NG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/yue.php | 15 - .../nesbot/carbon/src/Carbon/Lang/yue_HK.php | 28 - .../carbon/src/Carbon/Lang/yue_Hans.php | 12 - .../carbon/src/Carbon/Lang/yue_Hant.php | 12 - .../nesbot/carbon/src/Carbon/Lang/yuw.php | 15 - .../nesbot/carbon/src/Carbon/Lang/yuw_PG.php | 26 - .../nesbot/carbon/src/Carbon/Lang/zgh.php | 80 - .../nesbot/carbon/src/Carbon/Lang/zh.php | 29 - .../nesbot/carbon/src/Carbon/Lang/zh_CN.php | 33 - .../nesbot/carbon/src/Carbon/Lang/zh_HK.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_Hans.php | 109 - .../carbon/src/Carbon/Lang/zh_Hans_HK.php | 12 - .../carbon/src/Carbon/Lang/zh_Hans_MO.php | 12 - .../carbon/src/Carbon/Lang/zh_Hans_SG.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_Hant.php | 111 - .../carbon/src/Carbon/Lang/zh_Hant_HK.php | 12 - .../carbon/src/Carbon/Lang/zh_Hant_MO.php | 12 - .../carbon/src/Carbon/Lang/zh_Hant_TW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_MO.php | 21 - .../nesbot/carbon/src/Carbon/Lang/zh_SG.php | 26 - .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 12 - .../nesbot/carbon/src/Carbon/Lang/zh_YUE.php | 20 - .../nesbot/carbon/src/Carbon/Lang/zu.php | 15 - .../nesbot/carbon/src/Carbon/Lang/zu_ZA.php | 54 - .../src/Carbon/Laravel/ServiceProvider.php | 101 - .../carbon/src/Carbon/List/languages.php | 325 - .../nesbot/carbon/src/Carbon/List/regions.php | 16 - .../MessageFormatterMapper.php | 36 - .../src/Carbon/PHPStan/AbstractMacro.php | 239 - .../carbon/src/Carbon/PHPStan/Macro.php | 23 - .../src/Carbon/PHPStan/MacroExtension.php | 62 - .../src/Carbon/PHPStan/MacroScanner.php | 70 - .../carbon/src/Carbon/Traits/Boundaries.php | 409 - .../nesbot/carbon/src/Carbon/Traits/Cast.php | 39 - .../carbon/src/Carbon/Traits/Comparison.php | 1024 - .../carbon/src/Carbon/Traits/Converter.php | 566 - .../carbon/src/Carbon/Traits/Creator.php | 740 - .../nesbot/carbon/src/Carbon/Traits/Date.php | 2279 -- .../Carbon/Traits/DeprecatedProperties.php | 56 - .../carbon/src/Carbon/Traits/Difference.php | 1044 - .../src/Carbon/Traits/IntervalRounding.php | 47 - .../carbon/src/Carbon/Traits/IntervalStep.php | 83 - .../carbon/src/Carbon/Traits/Localization.php | 677 - .../nesbot/carbon/src/Carbon/Traits/Macro.php | 125 - .../src/Carbon/Traits/MagicParameter.php | 30 - .../nesbot/carbon/src/Carbon/Traits/Mixin.php | 188 - .../carbon/src/Carbon/Traits/Modifiers.php | 419 - .../carbon/src/Carbon/Traits/Mutability.php | 63 - .../Carbon/Traits/ObjectInitialisation.php | 21 - .../carbon/src/Carbon/Traits/Options.php | 400 - .../carbon/src/Carbon/Traits/Rounding.php | 214 - .../src/Carbon/Traits/Serialization.php | 269 - .../nesbot/carbon/src/Carbon/Traits/Test.php | 186 - .../carbon/src/Carbon/Traits/Timestamp.php | 180 - .../src/Carbon/Traits/ToStringFormat.php | 52 - .../nesbot/carbon/src/Carbon/Traits/Units.php | 335 - .../nesbot/carbon/src/Carbon/Traits/Week.php | 185 - .../nesbot/carbon/src/Carbon/Translator.php | 21 - .../carbon/src/Carbon/TranslatorImmutable.php | 81 - .../Carbon/TranslatorStrongTypeInterface.php | 20 - .../nyholm/psr7/phpstan-baseline.neon | 36 - dependencies/nyholm/psr7/psalm.baseline.xml | 8 - .../psr7/src/Factory/HttplugFactory.php | 50 - .../nyholm/psr7/src/Factory/Psr17Factory.php | 80 - dependencies/nyholm/psr7/src/MessageTrait.php | 195 - dependencies/nyholm/psr7/src/Request.php | 43 - dependencies/nyholm/psr7/src/RequestTrait.php | 103 - dependencies/nyholm/psr7/src/Response.php | 74 - .../nyholm/psr7/src/ServerRequest.php | 166 - dependencies/nyholm/psr7/src/Stream.php | 304 - dependencies/nyholm/psr7/src/StreamTrait.php | 51 - dependencies/nyholm/psr7/src/UploadedFile.php | 138 - dependencies/nyholm/psr7/src/Uri.php | 286 - .../wp-namespace-autoloader/phpcs.xml | 24 - .../wp-namespace-autoloader/phpunit.xml | 9 - .../src/WP_Namespace_Autoloader.php | 334 - .../constant_time_encoding/src/Base32.php | 404 - .../constant_time_encoding/src/Base32Hex.php | 98 - .../constant_time_encoding/src/Base64.php | 257 - .../src/Base64DotSlash.php | 78 - .../src/Base64DotSlashOrdered.php | 74 - .../src/Base64UrlSafe.php | 82 - .../constant_time_encoding/src/Binary.php | 85 - .../src/EncoderInterface.php | 51 - .../constant_time_encoding/src/Encoding.php | 244 - .../constant_time_encoding/src/Hex.php | 124 - .../constant_time_encoding/src/RFC4648.php | 176 - .../paragonie/random_compat/build-phar.sh | 5 - .../dist/random_compat.phar.pubkey | 5 - .../dist/random_compat.phar.pubkey.asc | 11 - .../paragonie/random_compat/lib/random.php | 34 - .../random_compat/other/build_phar.php | 44 - .../random_compat/psalm-autoload.php | 10 - .../paragonie/random_compat/psalm.xml | 19 - .../reflection-common/src/Element.php | 27 - .../reflection-common/src/File.php | 31 - .../reflection-common/src/Fqsen.php | 76 - .../reflection-common/src/Location.php | 47 - .../reflection-common/src/Project.php | 23 - .../reflection-common/src/ProjectFactory.php | 26 - .../reflection-docblock/src/DocBlock.php | 189 - .../src/DocBlock/Description.php | 103 - .../src/DocBlock/DescriptionFactory.php | 154 - .../src/DocBlock/ExampleFinder.php | 133 - .../src/DocBlock/Serializer.php | 109 - .../src/DocBlock/StandardTagFactory.php | 294 - .../reflection-docblock/src/DocBlock/Tag.php | 25 - .../src/DocBlock/TagFactory.php | 78 - .../src/DocBlock/Tags/Author.php | 85 - .../src/DocBlock/Tags/BaseTag.php | 45 - .../src/DocBlock/Tags/Covers.php | 78 - .../src/DocBlock/Tags/Deprecated.php | 84 - .../src/DocBlock/Tags/Example.php | 147 - .../DocBlock/Tags/Factory/StaticMethod.php | 23 - .../src/DocBlock/Tags/Formatter.php | 21 - .../Tags/Formatter/AlignFormatter.php | 39 - .../Tags/Formatter/PassthroughFormatter.php | 26 - .../src/DocBlock/Tags/Generic.php | 71 - .../src/DocBlock/Tags/InvalidTag.php | 117 - .../src/DocBlock/Tags/Link.php | 63 - .../src/DocBlock/Tags/Method.php | 220 - .../src/DocBlock/Tags/Param.php | 132 - .../src/DocBlock/Tags/Property.php | 95 - .../src/DocBlock/Tags/PropertyRead.php | 95 - .../src/DocBlock/Tags/PropertyWrite.php | 95 - .../src/DocBlock/Tags/Reference/Fqsen.php | 33 - .../src/DocBlock/Tags/Reference/Reference.php | 20 - .../src/DocBlock/Tags/Reference/Url.php | 31 - .../src/DocBlock/Tags/Return_.php | 50 - .../src/DocBlock/Tags/See.php | 85 - .../src/DocBlock/Tags/Since.php | 81 - .../src/DocBlock/Tags/Source.php | 90 - .../src/DocBlock/Tags/TagWithType.php | 55 - .../src/DocBlock/Tags/Throws.php | 50 - .../src/DocBlock/Tags/Uses.php | 77 - .../src/DocBlock/Tags/Var_.php | 95 - .../src/DocBlock/Tags/Version.php | 84 - .../src/DocBlockFactory.php | 239 - .../src/DocBlockFactoryInterface.php | 20 - .../src/Exception/PcreException.php | 35 - .../reflection-docblock/src/Utils.php | 56 - .../type-resolver/src/FqsenResolver.php | 66 - .../type-resolver/src/PseudoType.php | 17 - .../src/PseudoTypes/ArrayShape.php | 38 - .../src/PseudoTypes/ArrayShapeItem.php | 48 - .../src/PseudoTypes/CallableString.php | 35 - .../src/PseudoTypes/ConstExpression.php | 45 - .../type-resolver/src/PseudoTypes/False_.php | 34 - .../src/PseudoTypes/FloatValue.php | 38 - .../src/PseudoTypes/HtmlEscapedString.php | 35 - .../src/PseudoTypes/IntegerRange.php | 50 - .../src/PseudoTypes/IntegerValue.php | 38 - .../type-resolver/src/PseudoTypes/List_.php | 44 - .../src/PseudoTypes/LiteralString.php | 35 - .../src/PseudoTypes/LowercaseString.php | 35 - .../src/PseudoTypes/NegativeInteger.php | 35 - .../src/PseudoTypes/NonEmptyList.php | 44 - .../PseudoTypes/NonEmptyLowercaseString.php | 35 - .../src/PseudoTypes/NonEmptyString.php | 35 - .../src/PseudoTypes/NumericString.php | 35 - .../src/PseudoTypes/Numeric_.php | 42 - .../src/PseudoTypes/PositiveInteger.php | 35 - .../src/PseudoTypes/StringValue.php | 39 - .../src/PseudoTypes/TraitString.php | 35 - .../type-resolver/src/PseudoTypes/True_.php | 34 - .../phpdocumentor/type-resolver/src/Type.php | 23 - .../type-resolver/src/TypeResolver.php | 417 - .../type-resolver/src/Types/AbstractList.php | 70 - .../src/Types/AggregatedType.php | 107 - .../type-resolver/src/Types/ArrayKey.php | 37 - .../type-resolver/src/Types/Array_.php | 27 - .../type-resolver/src/Types/Boolean.php | 29 - .../src/Types/CallableParameter.php | 55 - .../type-resolver/src/Types/Callable_.php | 49 - .../type-resolver/src/Types/ClassString.php | 53 - .../type-resolver/src/Types/Collection.php | 58 - .../type-resolver/src/Types/Compound.php | 35 - .../type-resolver/src/Types/Context.php | 82 - .../src/Types/ContextFactory.php | 359 - .../type-resolver/src/Types/Expression.php | 44 - .../type-resolver/src/Types/Float_.php | 29 - .../type-resolver/src/Types/Integer.php | 29 - .../src/Types/InterfaceString.php | 48 - .../type-resolver/src/Types/Intersection.php | 35 - .../type-resolver/src/Types/Iterable_.php | 34 - .../type-resolver/src/Types/Mixed_.php | 29 - .../type-resolver/src/Types/Never_.php | 32 - .../type-resolver/src/Types/Null_.php | 29 - .../type-resolver/src/Types/Nullable.php | 45 - .../type-resolver/src/Types/Object_.php | 56 - .../type-resolver/src/Types/Parent_.php | 31 - .../type-resolver/src/Types/Resource_.php | 29 - .../type-resolver/src/Types/Scalar.php | 29 - .../type-resolver/src/Types/Self_.php | 31 - .../type-resolver/src/Types/Static_.php | 36 - .../type-resolver/src/Types/String_.php | 29 - .../type-resolver/src/Types/This.php | 32 - .../type-resolver/src/Types/Void_.php | 32 - .../phpseclib/bcmath_compat/lib/bcmath.php | 185 - .../phpseclib/bcmath_compat/src/BCMath.php | 494 - dependencies/phpseclib/phpseclib/AUTHORS | 7 - .../phpseclib/Common/Functions/Strings.php | 454 - .../phpseclib/phpseclib/Crypt/AES.php | 112 - .../phpseclib/phpseclib/Crypt/Blowfish.php | 660 - .../phpseclib/phpseclib/Crypt/ChaCha20.php | 999 - .../phpseclib/Crypt/Common/AsymmetricKey.php | 511 - .../phpseclib/Crypt/Common/BlockCipher.php | 23 - .../Crypt/Common/Formats/Keys/JWK.php | 62 - .../Crypt/Common/Formats/Keys/OpenSSH.php | 195 - .../Crypt/Common/Formats/Keys/PKCS.php | 67 - .../Crypt/Common/Formats/Keys/PKCS1.php | 187 - .../Crypt/Common/Formats/Keys/PKCS8.php | 598 - .../Crypt/Common/Formats/Keys/PuTTY.php | 324 - .../Crypt/Common/Formats/Signature/Raw.php | 53 - .../phpseclib/Crypt/Common/PrivateKey.php | 29 - .../phpseclib/Crypt/Common/PublicKey.php | 24 - .../phpseclib/Crypt/Common/StreamCipher.php | 51 - .../phpseclib/Crypt/Common/SymmetricKey.php | 3094 -- .../Crypt/Common/Traits/Fingerprint.php | 55 - .../Crypt/Common/Traits/PasswordProtected.php | 44 - .../phpseclib/phpseclib/Crypt/DES.php | 522 - .../phpseclib/phpseclib/Crypt/DH.php | 295 - .../phpseclib/Crypt/DH/Formats/Keys/PKCS1.php | 65 - .../phpseclib/Crypt/DH/Formats/Keys/PKCS8.php | 115 - .../phpseclib/Crypt/DH/Parameters.php | 33 - .../phpseclib/Crypt/DH/PrivateKey.php | 64 - .../phpseclib/Crypt/DH/PublicKey.php | 44 - .../phpseclib/phpseclib/Crypt/DSA.php | 292 - .../Crypt/DSA/Formats/Keys/OpenSSH.php | 102 - .../Crypt/DSA/Formats/Keys/PKCS1.php | 115 - .../Crypt/DSA/Formats/Keys/PKCS8.php | 125 - .../Crypt/DSA/Formats/Keys/PuTTY.php | 98 - .../phpseclib/Crypt/DSA/Formats/Keys/Raw.php | 78 - .../phpseclib/Crypt/DSA/Formats/Keys/XML.php | 123 - .../Crypt/DSA/Formats/Signature/ASN1.php | 57 - .../Crypt/DSA/Formats/Signature/Raw.php | 23 - .../Crypt/DSA/Formats/Signature/SSH2.php | 61 - .../phpseclib/Crypt/DSA/Parameters.php | 33 - .../phpseclib/Crypt/DSA/PrivateKey.php | 131 - .../phpseclib/Crypt/DSA/PublicKey.php | 74 - .../phpseclib/phpseclib/Crypt/EC.php | 414 - .../phpseclib/Crypt/EC/BaseCurves/Base.php | 192 - .../phpseclib/Crypt/EC/BaseCurves/Binary.php | 324 - .../Crypt/EC/BaseCurves/KoblitzPrime.php | 273 - .../Crypt/EC/BaseCurves/Montgomery.php | 246 - .../phpseclib/Crypt/EC/BaseCurves/Prime.php | 695 - .../Crypt/EC/BaseCurves/TwistedEdwards.php | 190 - .../phpseclib/Crypt/EC/Curves/Curve25519.php | 73 - .../phpseclib/Crypt/EC/Curves/Curve448.php | 76 - .../phpseclib/Crypt/EC/Curves/Ed25519.php | 295 - .../phpseclib/Crypt/EC/Curves/Ed448.php | 222 - .../Crypt/EC/Curves/brainpoolP160r1.php | 26 - .../Crypt/EC/Curves/brainpoolP160t1.php | 43 - .../Crypt/EC/Curves/brainpoolP192r1.php | 26 - .../Crypt/EC/Curves/brainpoolP192t1.php | 30 - .../Crypt/EC/Curves/brainpoolP224r1.php | 26 - .../Crypt/EC/Curves/brainpoolP224t1.php | 30 - .../Crypt/EC/Curves/brainpoolP256r1.php | 26 - .../Crypt/EC/Curves/brainpoolP256t1.php | 30 - .../Crypt/EC/Curves/brainpoolP320r1.php | 26 - .../Crypt/EC/Curves/brainpoolP320t1.php | 30 - .../Crypt/EC/Curves/brainpoolP384r1.php | 26 - .../Crypt/EC/Curves/brainpoolP384t1.php | 30 - .../Crypt/EC/Curves/brainpoolP512r1.php | 26 - .../Crypt/EC/Curves/brainpoolP512t1.php | 30 - .../phpseclib/Crypt/EC/Curves/nistb233.php | 17 - .../phpseclib/Crypt/EC/Curves/nistb409.php | 17 - .../phpseclib/Crypt/EC/Curves/nistk163.php | 17 - .../phpseclib/Crypt/EC/Curves/nistk233.php | 17 - .../phpseclib/Crypt/EC/Curves/nistk283.php | 17 - .../phpseclib/Crypt/EC/Curves/nistk409.php | 17 - .../phpseclib/Crypt/EC/Curves/nistp192.php | 17 - .../phpseclib/Crypt/EC/Curves/nistp224.php | 17 - .../phpseclib/Crypt/EC/Curves/nistp256.php | 17 - .../phpseclib/Crypt/EC/Curves/nistp384.php | 17 - .../phpseclib/Crypt/EC/Curves/nistp521.php | 17 - .../phpseclib/Crypt/EC/Curves/nistt571.php | 17 - .../phpseclib/Crypt/EC/Curves/prime192v1.php | 17 - .../phpseclib/Crypt/EC/Curves/prime192v2.php | 26 - .../phpseclib/Crypt/EC/Curves/prime192v3.php | 26 - .../phpseclib/Crypt/EC/Curves/prime239v1.php | 26 - .../phpseclib/Crypt/EC/Curves/prime239v2.php | 26 - .../phpseclib/Crypt/EC/Curves/prime239v3.php | 26 - .../phpseclib/Crypt/EC/Curves/prime256v1.php | 17 - .../phpseclib/Crypt/EC/Curves/secp112r1.php | 26 - .../phpseclib/Crypt/EC/Curves/secp112r2.php | 27 - .../phpseclib/Crypt/EC/Curves/secp128r1.php | 26 - .../phpseclib/Crypt/EC/Curves/secp128r2.php | 27 - .../phpseclib/Crypt/EC/Curves/secp160k1.php | 31 - .../phpseclib/Crypt/EC/Curves/secp160r1.php | 26 - .../phpseclib/Crypt/EC/Curves/secp160r2.php | 27 - .../phpseclib/Crypt/EC/Curves/secp192k1.php | 30 - .../phpseclib/Crypt/EC/Curves/secp192r1.php | 68 - .../phpseclib/Crypt/EC/Curves/secp224k1.php | 30 - .../phpseclib/Crypt/EC/Curves/secp224r1.php | 26 - .../phpseclib/Crypt/EC/Curves/secp256k1.php | 34 - .../phpseclib/Crypt/EC/Curves/secp256r1.php | 26 - .../phpseclib/Crypt/EC/Curves/secp384r1.php | 26 - .../phpseclib/Crypt/EC/Curves/secp521r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect113r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect113r2.php | 26 - .../phpseclib/Crypt/EC/Curves/sect131r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect131r2.php | 26 - .../phpseclib/Crypt/EC/Curves/sect163k1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect163r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect163r2.php | 26 - .../phpseclib/Crypt/EC/Curves/sect193r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect193r2.php | 26 - .../phpseclib/Crypt/EC/Curves/sect233k1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect233r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect239k1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect283k1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect283r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect409k1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect409r1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect571k1.php | 26 - .../phpseclib/Crypt/EC/Curves/sect571r1.php | 26 - .../Crypt/EC/Formats/Keys/Common.php | 489 - .../phpseclib/Crypt/EC/Formats/Keys/JWK.php | 155 - .../EC/Formats/Keys/MontgomeryPrivate.php | 93 - .../EC/Formats/Keys/MontgomeryPublic.php | 65 - .../Crypt/EC/Formats/Keys/OpenSSH.php | 163 - .../phpseclib/Crypt/EC/Formats/Keys/PKCS1.php | 154 - .../phpseclib/Crypt/EC/Formats/Keys/PKCS8.php | 186 - .../phpseclib/Crypt/EC/Formats/Keys/PuTTY.php | 115 - .../phpseclib/Crypt/EC/Formats/Keys/XML.php | 373 - .../Crypt/EC/Formats/Keys/libsodium.php | 106 - .../Crypt/EC/Formats/Signature/ASN1.php | 57 - .../Crypt/EC/Formats/Signature/Raw.php | 23 - .../Crypt/EC/Formats/Signature/SSH2.php | 83 - .../phpseclib/Crypt/EC/Parameters.php | 33 - .../phpseclib/Crypt/EC/PrivateKey.php | 226 - .../phpseclib/Crypt/EC/PublicKey.php | 136 - .../phpseclib/phpseclib/Crypt/Hash.php | 1134 - .../phpseclib/Crypt/PublicKeyLoader.php | 102 - .../phpseclib/phpseclib/Crypt/RC2.php | 478 - .../phpseclib/phpseclib/Crypt/RC4.php | 258 - .../phpseclib/phpseclib/Crypt/RSA.php | 823 - .../phpseclib/Crypt/RSA/Formats/Keys/JWK.php | 116 - .../Crypt/RSA/Formats/Keys/MSBLOB.php | 207 - .../Crypt/RSA/Formats/Keys/OpenSSH.php | 101 - .../Crypt/RSA/Formats/Keys/PKCS1.php | 120 - .../Crypt/RSA/Formats/Keys/PKCS8.php | 111 - .../phpseclib/Crypt/RSA/Formats/Keys/PSS.php | 193 - .../Crypt/RSA/Formats/Keys/PuTTY.php | 107 - .../phpseclib/Crypt/RSA/Formats/Keys/Raw.php | 153 - .../phpseclib/Crypt/RSA/Formats/Keys/XML.php | 140 - .../phpseclib/Crypt/RSA/PrivateKey.php | 441 - .../phpseclib/Crypt/RSA/PublicKey.php | 439 - .../phpseclib/phpseclib/Crypt/Random.php | 202 - .../phpseclib/phpseclib/Crypt/Rijndael.php | 1050 - .../phpseclib/phpseclib/Crypt/Salsa20.php | 454 - .../phpseclib/phpseclib/Crypt/TripleDES.php | 384 - .../phpseclib/phpseclib/Crypt/Twofish.php | 506 - .../Exception/BadConfigurationException.php | 22 - .../Exception/BadDecryptionException.php | 22 - .../phpseclib/Exception/BadModeException.php | 22 - .../Exception/ConnectionClosedException.php | 22 - .../Exception/FileNotFoundException.php | 22 - .../Exception/InconsistentSetupException.php | 22 - .../Exception/InsufficientSetupException.php | 22 - .../Exception/NoKeyLoadedException.php | 22 - .../NoSupportedAlgorithmsException.php | 22 - .../Exception/UnableToConnectException.php | 22 - .../UnsupportedAlgorithmException.php | 22 - .../Exception/UnsupportedCurveException.php | 22 - .../Exception/UnsupportedFormatException.php | 22 - .../UnsupportedOperationException.php | 22 - .../phpseclib/phpseclib/File/ANSI.php | 553 - .../phpseclib/phpseclib/File/ASN1.php | 1393 - .../phpseclib/phpseclib/File/ASN1/Element.php | 41 - .../File/ASN1/Maps/AccessDescription.php | 24 - .../ASN1/Maps/AdministrationDomainName.php | 31 - .../File/ASN1/Maps/AlgorithmIdentifier.php | 24 - .../phpseclib/File/ASN1/Maps/AnotherName.php | 24 - .../phpseclib/File/ASN1/Maps/Attribute.php | 24 - .../File/ASN1/Maps/AttributeType.php | 24 - .../File/ASN1/Maps/AttributeTypeAndValue.php | 24 - .../File/ASN1/Maps/AttributeValue.php | 24 - .../phpseclib/File/ASN1/Maps/Attributes.php | 24 - .../ASN1/Maps/AuthorityInfoAccessSyntax.php | 24 - .../File/ASN1/Maps/AuthorityKeyIdentifier.php | 24 - .../phpseclib/File/ASN1/Maps/BaseDistance.php | 24 - .../File/ASN1/Maps/BasicConstraints.php | 24 - .../Maps/BuiltInDomainDefinedAttribute.php | 24 - .../Maps/BuiltInDomainDefinedAttributes.php | 30 - .../ASN1/Maps/BuiltInStandardAttributes.php | 24 - .../phpseclib/File/ASN1/Maps/CPSuri.php | 24 - .../File/ASN1/Maps/CRLDistributionPoints.php | 24 - .../phpseclib/File/ASN1/Maps/CRLNumber.php | 24 - .../phpseclib/File/ASN1/Maps/CRLReason.php | 36 - .../phpseclib/File/ASN1/Maps/CertPolicyId.php | 24 - .../phpseclib/File/ASN1/Maps/Certificate.php | 24 - .../File/ASN1/Maps/CertificateIssuer.php | 23 - .../File/ASN1/Maps/CertificateList.php | 24 - .../File/ASN1/Maps/CertificatePolicies.php | 24 - .../ASN1/Maps/CertificateSerialNumber.php | 24 - .../File/ASN1/Maps/CertificationRequest.php | 24 - .../ASN1/Maps/CertificationRequestInfo.php | 24 - .../File/ASN1/Maps/Characteristic_two.php | 29 - .../phpseclib/File/ASN1/Maps/CountryName.php | 31 - .../phpseclib/File/ASN1/Maps/Curve.php | 24 - .../phpseclib/File/ASN1/Maps/DHParameter.php | 26 - .../phpseclib/File/ASN1/Maps/DSAParams.php | 24 - .../File/ASN1/Maps/DSAPrivateKey.php | 24 - .../phpseclib/File/ASN1/Maps/DSAPublicKey.php | 24 - .../phpseclib/File/ASN1/Maps/DigestInfo.php | 26 - .../File/ASN1/Maps/DirectoryString.php | 24 - .../phpseclib/File/ASN1/Maps/DisplayText.php | 24 - .../File/ASN1/Maps/DistributionPoint.php | 24 - .../File/ASN1/Maps/DistributionPointName.php | 24 - .../phpseclib/File/ASN1/Maps/DssSigValue.php | 24 - .../phpseclib/File/ASN1/Maps/ECParameters.php | 36 - .../phpseclib/File/ASN1/Maps/ECPoint.php | 24 - .../phpseclib/File/ASN1/Maps/ECPrivateKey.php | 26 - .../phpseclib/File/ASN1/Maps/EDIPartyName.php | 29 - .../File/ASN1/Maps/EcdsaSigValue.php | 24 - .../File/ASN1/Maps/EncryptedData.php | 24 - .../ASN1/Maps/EncryptedPrivateKeyInfo.php | 24 - .../File/ASN1/Maps/ExtKeyUsageSyntax.php | 24 - .../phpseclib/File/ASN1/Maps/Extension.php | 30 - .../File/ASN1/Maps/ExtensionAttribute.php | 24 - .../File/ASN1/Maps/ExtensionAttributes.php | 30 - .../phpseclib/File/ASN1/Maps/Extensions.php | 31 - .../phpseclib/File/ASN1/Maps/FieldElement.php | 24 - .../phpseclib/File/ASN1/Maps/FieldID.php | 24 - .../phpseclib/File/ASN1/Maps/GeneralName.php | 24 - .../phpseclib/File/ASN1/Maps/GeneralNames.php | 24 - .../File/ASN1/Maps/GeneralSubtree.php | 24 - .../File/ASN1/Maps/GeneralSubtrees.php | 24 - .../File/ASN1/Maps/HashAlgorithm.php | 23 - .../File/ASN1/Maps/HoldInstructionCode.php | 24 - .../File/ASN1/Maps/InvalidityDate.php | 24 - .../File/ASN1/Maps/IssuerAltName.php | 23 - .../ASN1/Maps/IssuingDistributionPoint.php | 24 - .../File/ASN1/Maps/KeyIdentifier.php | 24 - .../phpseclib/File/ASN1/Maps/KeyPurposeId.php | 24 - .../phpseclib/File/ASN1/Maps/KeyUsage.php | 24 - .../File/ASN1/Maps/MaskGenAlgorithm.php | 23 - .../phpseclib/File/ASN1/Maps/Name.php | 24 - .../File/ASN1/Maps/NameConstraints.php | 24 - .../File/ASN1/Maps/NetworkAddress.php | 24 - .../File/ASN1/Maps/NoticeReference.php | 24 - .../File/ASN1/Maps/NumericUserIdentifier.php | 24 - .../phpseclib/File/ASN1/Maps/ORAddress.php | 24 - .../File/ASN1/Maps/OneAsymmetricKey.php | 26 - .../File/ASN1/Maps/OrganizationName.php | 24 - .../ASN1/Maps/OrganizationalUnitNames.php | 30 - .../File/ASN1/Maps/OtherPrimeInfo.php | 31 - .../File/ASN1/Maps/OtherPrimeInfos.php | 25 - .../phpseclib/File/ASN1/Maps/PBEParameter.php | 26 - .../phpseclib/File/ASN1/Maps/PBES2params.php | 26 - .../phpseclib/File/ASN1/Maps/PBKDF2params.php | 33 - .../phpseclib/File/ASN1/Maps/PBMAC1params.php | 26 - .../phpseclib/File/ASN1/Maps/PKCS9String.php | 24 - .../phpseclib/File/ASN1/Maps/Pentanomial.php | 30 - .../phpseclib/File/ASN1/Maps/PersonalName.php | 24 - .../File/ASN1/Maps/PolicyInformation.php | 24 - .../File/ASN1/Maps/PolicyMappings.php | 24 - .../File/ASN1/Maps/PolicyQualifierId.php | 24 - .../File/ASN1/Maps/PolicyQualifierInfo.php | 24 - .../File/ASN1/Maps/PostalAddress.php | 24 - .../phpseclib/File/ASN1/Maps/Prime_p.php | 24 - .../File/ASN1/Maps/PrivateDomainName.php | 24 - .../phpseclib/File/ASN1/Maps/PrivateKey.php | 24 - .../File/ASN1/Maps/PrivateKeyInfo.php | 24 - .../File/ASN1/Maps/PrivateKeyUsagePeriod.php | 24 - .../phpseclib/File/ASN1/Maps/PublicKey.php | 24 - .../File/ASN1/Maps/PublicKeyAndChallenge.php | 24 - .../File/ASN1/Maps/PublicKeyInfo.php | 27 - .../File/ASN1/Maps/RC2CBCParameter.php | 26 - .../phpseclib/File/ASN1/Maps/RDNSequence.php | 36 - .../File/ASN1/Maps/RSAPrivateKey.php | 44 - .../phpseclib/File/ASN1/Maps/RSAPublicKey.php | 24 - .../File/ASN1/Maps/RSASSA_PSS_params.php | 26 - .../phpseclib/File/ASN1/Maps/ReasonFlags.php | 24 - .../ASN1/Maps/RelativeDistinguishedName.php | 30 - .../File/ASN1/Maps/RevokedCertificate.php | 24 - .../ASN1/Maps/SignedPublicKeyAndChallenge.php | 24 - .../File/ASN1/Maps/SpecifiedECDomain.php | 26 - .../File/ASN1/Maps/SubjectAltName.php | 23 - .../ASN1/Maps/SubjectDirectoryAttributes.php | 24 - .../ASN1/Maps/SubjectInfoAccessSyntax.php | 24 - .../File/ASN1/Maps/SubjectPublicKeyInfo.php | 24 - .../phpseclib/File/ASN1/Maps/TBSCertList.php | 24 - .../File/ASN1/Maps/TBSCertificate.php | 41 - .../File/ASN1/Maps/TerminalIdentifier.php | 24 - .../phpseclib/File/ASN1/Maps/Time.php | 24 - .../phpseclib/File/ASN1/Maps/Trinomial.php | 24 - .../File/ASN1/Maps/UniqueIdentifier.php | 24 - .../phpseclib/File/ASN1/Maps/UserNotice.php | 24 - .../phpseclib/File/ASN1/Maps/Validity.php | 24 - .../File/ASN1/Maps/netscape_ca_policy_url.php | 24 - .../File/ASN1/Maps/netscape_cert_type.php | 26 - .../File/ASN1/Maps/netscape_comment.php | 24 - .../phpseclib/phpseclib/File/X509.php | 3504 --- .../phpseclib/phpseclib/Math/BigInteger.php | 801 - .../Math/BigInteger/Engines/BCMath.php | 601 - .../Math/BigInteger/Engines/BCMath/Base.php | 102 - .../BigInteger/Engines/BCMath/BuiltIn.php | 37 - .../Engines/BCMath/DefaultEngine.php | 23 - .../BigInteger/Engines/BCMath/OpenSSL.php | 23 - .../Engines/BCMath/Reductions/Barrett.php | 157 - .../Engines/BCMath/Reductions/EvalBarrett.php | 96 - .../Math/BigInteger/Engines/Engine.php | 1148 - .../phpseclib/Math/BigInteger/Engines/GMP.php | 612 - .../BigInteger/Engines/GMP/DefaultEngine.php | 37 - .../Math/BigInteger/Engines/OpenSSL.php | 58 - .../phpseclib/Math/BigInteger/Engines/PHP.php | 1086 - .../Math/BigInteger/Engines/PHP/Base.php | 133 - .../BigInteger/Engines/PHP/DefaultEngine.php | 23 - .../BigInteger/Engines/PHP/Montgomery.php | 78 - .../Math/BigInteger/Engines/PHP/OpenSSL.php | 23 - .../Engines/PHP/Reductions/Barrett.php | 239 - .../Engines/PHP/Reductions/Classic.php | 40 - .../Engines/PHP/Reductions/EvalBarrett.php | 412 - .../Engines/PHP/Reductions/Montgomery.php | 113 - .../Engines/PHP/Reductions/MontgomeryMult.php | 68 - .../Engines/PHP/Reductions/PowerOfTwo.php | 54 - .../Math/BigInteger/Engines/PHP32.php | 341 - .../Math/BigInteger/Engines/PHP64.php | 342 - .../phpseclib/phpseclib/Math/BinaryField.php | 174 - .../phpseclib/Math/BinaryField/Integer.php | 442 - .../phpseclib/Math/Common/FiniteField.php | 21 - .../Math/Common/FiniteField/Integer.php | 42 - .../phpseclib/phpseclib/Math/PrimeField.php | 106 - .../phpseclib/Math/PrimeField/Integer.php | 370 - .../phpseclib/phpseclib/Net/SFTP.php | 3057 -- .../phpseclib/phpseclib/Net/SFTP/Stream.php | 697 - .../phpseclib/phpseclib/Net/SSH2.php | 4482 --- .../phpseclib/phpseclib/System/SSH/Agent.php | 253 - .../phpseclib/System/SSH/Agent/Identity.php | 280 - .../System/SSH/Common/Traits/ReadBytes.php | 36 - .../phpseclib/phpseclib/bootstrap.php | 27 - .../phpseclib/phpseclib/phpseclib/openssl.cnf | 6 - .../phpdoc-parser/phpstan-baseline.neon | 26 - .../src/Ast/AbstractNodeVisitor.php | 30 - .../phpdoc-parser/src/Ast/Attribute.php | 13 - .../Ast/ConstExpr/ConstExprArrayItemNode.php | 27 - .../src/Ast/ConstExpr/ConstExprArrayNode.php | 24 - .../src/Ast/ConstExpr/ConstExprFalseNode.php | 14 - .../src/Ast/ConstExpr/ConstExprFloatNode.php | 20 - .../Ast/ConstExpr/ConstExprIntegerNode.php | 20 - .../src/Ast/ConstExpr/ConstExprNode.php | 9 - .../src/Ast/ConstExpr/ConstExprNullNode.php | 14 - .../src/Ast/ConstExpr/ConstExprStringNode.php | 20 - .../src/Ast/ConstExpr/ConstExprTrueNode.php | 14 - .../src/Ast/ConstExpr/ConstFetchNode.php | 26 - .../ConstExpr/DoctrineConstExprStringNode.php | 35 - .../QuoteAwareConstExprStringNode.php | 67 - .../phpstan/phpdoc-parser/src/Ast/Node.php | 18 - .../phpdoc-parser/src/Ast/NodeAttributes.php | 32 - .../phpdoc-parser/src/Ast/NodeTraverser.php | 263 - .../phpdoc-parser/src/Ast/NodeVisitor.php | 83 - .../src/Ast/NodeVisitor/CloningVisitor.php | 17 - .../Ast/PhpDoc/AssertTagMethodValueNode.php | 39 - .../Ast/PhpDoc/AssertTagPropertyValueNode.php | 39 - .../src/Ast/PhpDoc/AssertTagValueNode.php | 36 - .../src/Ast/PhpDoc/DeprecatedTagValueNode.php | 21 - .../PhpDoc/Doctrine/DoctrineAnnotation.php | 29 - .../Ast/PhpDoc/Doctrine/DoctrineArgument.php | 35 - .../src/Ast/PhpDoc/Doctrine/DoctrineArray.php | 26 - .../Ast/PhpDoc/Doctrine/DoctrineArrayItem.php | 39 - .../PhpDoc/Doctrine/DoctrineTagValueNode.php | 25 - .../src/Ast/PhpDoc/ExtendsTagValueNode.php | 25 - .../src/Ast/PhpDoc/GenericTagValueNode.php | 20 - .../src/Ast/PhpDoc/ImplementsTagValueNode.php | 25 - .../src/Ast/PhpDoc/InvalidTagValueNode.php | 38 - .../src/Ast/PhpDoc/MethodTagValueNode.php | 47 - .../PhpDoc/MethodTagValueParameterNode.php | 39 - .../src/Ast/PhpDoc/MixinTagValueNode.php | 25 - .../src/Ast/PhpDoc/ParamOutTagValueNode.php | 28 - .../src/Ast/PhpDoc/ParamTagValueNode.php | 36 - .../src/Ast/PhpDoc/PhpDocChildNode.php | 9 - .../src/Ast/PhpDoc/PhpDocNode.php | 248 - .../src/Ast/PhpDoc/PhpDocTagNode.php | 28 - .../src/Ast/PhpDoc/PhpDocTagValueNode.php | 9 - .../src/Ast/PhpDoc/PhpDocTextNode.php | 20 - .../src/Ast/PhpDoc/PropertyTagValueNode.php | 28 - .../src/Ast/PhpDoc/ReturnTagValueNode.php | 25 - .../src/Ast/PhpDoc/SelfOutTagValueNode.php | 25 - .../src/Ast/PhpDoc/TemplateTagValueNode.php | 33 - .../src/Ast/PhpDoc/ThrowsTagValueNode.php | 25 - .../PhpDoc/TypeAliasImportTagValueNode.php | 28 - .../src/Ast/PhpDoc/TypeAliasTagValueNode.php | 25 - .../Ast/PhpDoc/TypelessParamTagValueNode.php | 32 - .../src/Ast/PhpDoc/UsesTagValueNode.php | 25 - .../src/Ast/PhpDoc/VarTagValueNode.php | 28 - .../src/Ast/Type/ArrayShapeItemNode.php | 35 - .../src/Ast/Type/ArrayShapeNode.php | 37 - .../src/Ast/Type/ArrayTypeNode.php | 23 - .../src/Ast/Type/CallableTypeNode.php | 35 - .../Ast/Type/CallableTypeParameterNode.php | 38 - .../Type/ConditionalTypeForParameterNode.php | 33 - .../src/Ast/Type/ConditionalTypeNode.php | 33 - .../src/Ast/Type/ConstTypeNode.php | 21 - .../src/Ast/Type/GenericTypeNode.php | 47 - .../src/Ast/Type/IdentifierTypeNode.php | 20 - .../src/Ast/Type/IntersectionTypeNode.php | 30 - .../src/Ast/Type/InvalidTypeNode.php | 25 - .../src/Ast/Type/NullableTypeNode.php | 20 - .../src/Ast/Type/ObjectShapeItemNode.php | 34 - .../src/Ast/Type/ObjectShapeNode.php | 25 - .../src/Ast/Type/OffsetAccessTypeNode.php | 26 - .../src/Ast/Type/ThisTypeNode.php | 14 - .../phpdoc-parser/src/Ast/Type/TypeNode.php | 9 - .../src/Ast/Type/UnionTypeNode.php | 30 - .../phpstan/phpdoc-parser/src/Lexer/Lexer.php | 134 - .../src/Parser/ConstExprParser.php | 188 - .../src/Parser/ParserException.php | 68 - .../phpdoc-parser/src/Parser/PhpDocParser.php | 854 - .../src/Parser/StringUnescaper.php | 63 - .../src/Parser/TokenIterator.php | 287 - .../phpdoc-parser/src/Parser/TypeParser.php | 624 - .../phpdoc-parser/src/Printer/DiffElem.php | 39 - .../phpdoc-parser/src/Printer/Differ.php | 173 - .../phpdoc-parser/src/Printer/Printer.php | 633 - dependencies/psr/cache/src/CacheException.php | 10 - .../psr/cache/src/CacheItemInterface.php | 100 - .../psr/cache/src/CacheItemPoolInterface.php | 130 - .../cache/src/InvalidArgumentException.php | 13 - dependencies/psr/clock/src/ClockInterface.php | 12 - .../src/ContainerExceptionInterface.php | 11 - .../psr/container/src/ContainerInterface.php | 34 - .../src/NotFoundExceptionInterface.php | 10 - .../src/EventDispatcherInterface.php | 21 - .../src/ListenerProviderInterface.php | 19 - .../src/StoppableEventInterface.php | 26 - .../src/ClientExceptionInterface.php | 10 - .../psr/http-client/src/ClientInterface.php | 19 - .../src/NetworkExceptionInterface.php | 23 - .../src/RequestExceptionInterface.php | 23 - .../src/RequestFactoryInterface.php | 18 - .../src/ResponseFactoryInterface.php | 18 - .../src/ServerRequestFactoryInterface.php | 24 - .../src/StreamFactoryInterface.php | 43 - .../src/UploadedFileFactoryInterface.php | 28 - .../http-factory/src/UriFactoryInterface.php | 17 - .../psr/http-message/src/MessageInterface.php | 177 - .../psr/http-message/src/RequestInterface.php | 124 - .../http-message/src/ResponseInterface.php | 66 - .../src/ServerRequestInterface.php | 249 - .../psr/http-message/src/StreamInterface.php | 144 - .../src/UploadedFileInterface.php | 118 - .../psr/http-message/src/UriInterface.php | 309 - dependencies/psr/log/src/AbstractLogger.php | 15 - .../psr/log/src/InvalidArgumentException.php | 7 - dependencies/psr/log/src/LogLevel.php | 18 - .../psr/log/src/LoggerAwareInterface.php | 18 - dependencies/psr/log/src/LoggerAwareTrait.php | 25 - dependencies/psr/log/src/LoggerInterface.php | 117 - dependencies/psr/log/src/LoggerTrait.php | 134 - dependencies/psr/log/src/NullLogger.php | 30 - .../psr/simple-cache/src/CacheException.php | 10 - .../psr/simple-cache/src/CacheInterface.php | 107 - .../src/InvalidArgumentException.php | 13 - dependencies/rakit/validation/phpcs.xml | 17 - .../rakit/validation/src/Attribute.php | 271 - .../rakit/validation/src/ErrorBag.php | 224 - dependencies/rakit/validation/src/Helper.php | 226 - .../rakit/validation/src/MimeTypeGuesser.php | 30 - .../src/MissingRequiredParameterException.php | 7 - dependencies/rakit/validation/src/Rule.php | 206 - .../validation/src/RuleNotFoundException.php | 8 - .../validation/src/RuleQuashException.php | 7 - .../rakit/validation/src/Rules/Accepted.php | 23 - .../rakit/validation/src/Rules/After.php | 32 - .../rakit/validation/src/Rules/Alpha.php | 20 - .../rakit/validation/src/Rules/AlphaDash.php | 23 - .../rakit/validation/src/Rules/AlphaNum.php | 23 - .../validation/src/Rules/AlphaSpaces.php | 23 - .../rakit/validation/src/Rules/Before.php | 32 - .../rakit/validation/src/Rules/Between.php | 30 - .../rakit/validation/src/Rules/Boolean.php | 21 - .../rakit/validation/src/Rules/Callback.php | 49 - .../rakit/validation/src/Rules/Date.php | 26 - .../rakit/validation/src/Rules/Defaults.php | 43 - .../rakit/validation/src/Rules/Different.php | 25 - .../rakit/validation/src/Rules/Digits.php | 24 - .../validation/src/Rules/DigitsBetween.php | 26 - .../rakit/validation/src/Rules/Email.php | 20 - .../rakit/validation/src/Rules/Extension.php | 44 - .../rakit/validation/src/Rules/In.php | 52 - .../rakit/validation/src/Rules/Integer.php | 20 - .../src/Rules/Interfaces/BeforeValidate.php | 13 - .../src/Rules/Interfaces/ModifyValue.php | 15 - .../rakit/validation/src/Rules/Ip.php | 20 - .../rakit/validation/src/Rules/Ipv4.php | 20 - .../rakit/validation/src/Rules/Ipv6.php | 20 - .../rakit/validation/src/Rules/Json.php | 27 - .../rakit/validation/src/Rules/Lowercase.php | 20 - .../rakit/validation/src/Rules/Max.php | 29 - .../rakit/validation/src/Rules/Mimes.php | 78 - .../rakit/validation/src/Rules/Min.php | 29 - .../rakit/validation/src/Rules/NotIn.php | 52 - .../rakit/validation/src/Rules/Nullable.php | 18 - .../rakit/validation/src/Rules/Numeric.php | 20 - .../rakit/validation/src/Rules/Present.php | 34 - .../rakit/validation/src/Rules/Regex.php | 24 - .../rakit/validation/src/Rules/Required.php | 44 - .../rakit/validation/src/Rules/RequiredIf.php | 44 - .../validation/src/Rules/RequiredUnless.php | 44 - .../validation/src/Rules/RequiredWith.php | 43 - .../validation/src/Rules/RequiredWithAll.php | 43 - .../validation/src/Rules/RequiredWithout.php | 43 - .../src/Rules/RequiredWithoutAll.php | 43 - .../rakit/validation/src/Rules/Same.php | 25 - .../src/Rules/Traits/DateUtilsTrait.php | 39 - .../validation/src/Rules/Traits/FileTrait.php | 76 - .../validation/src/Rules/Traits/SizeTrait.php | 90 - .../rakit/validation/src/Rules/TypeArray.php | 20 - .../validation/src/Rules/UploadedFile.php | 154 - .../rakit/validation/src/Rules/Uppercase.php | 20 - .../rakit/validation/src/Rules/Url.php | 104 - .../validation/src/Traits/MessagesTrait.php | 49 - .../src/Traits/TranslationsTrait.php | 49 - .../rakit/validation/src/Validation.php | 608 - .../rakit/validation/src/Validator.php | 200 - .../getallheaders/src/getallheaders.php | 38 - .../remotelyliving/php-dns/_config.yml | 1 - .../remotelyliving/php-dns/bootstrap/repl.php | 37 - dependencies/remotelyliving/php-dns/churn.yml | 56 - .../remotelyliving/php-dns/phpstan.neon | 4 - dependencies/remotelyliving/php-dns/psalm.xml | 61 - .../remotelyliving/php-dns/rector.php | 20 - .../php-dns/src/Entities/CAAData.php | 64 - .../php-dns/src/Entities/CNAMEData.php | 39 - .../php-dns/src/Entities/DNSRecord.php | 103 - .../src/Entities/DNSRecordCollection.php | 151 - .../php-dns/src/Entities/DNSRecordType.php | 124 - .../php-dns/src/Entities/DataAbstract.php | 59 - .../php-dns/src/Entities/EntityAbstract.php | 7 - .../php-dns/src/Entities/Hostname.php | 66 - .../php-dns/src/Entities/IPAddress.php | 50 - .../src/Entities/Interfaces/Arrayable.php | 8 - .../Interfaces/DNSRecordInterface.php | 20 - .../src/Entities/Interfaces/Serializable.php | 11 - .../php-dns/src/Entities/MXData.php | 45 - .../php-dns/src/Entities/NSData.php | 38 - .../php-dns/src/Entities/PTRData.php | 38 - .../php-dns/src/Entities/SOAData.php | 106 - .../php-dns/src/Entities/SRVData.php | 59 - .../php-dns/src/Entities/TXTData.php | 38 - .../php-dns/src/Exceptions/Exception.php | 12 - .../Exceptions/InvalidArgumentException.php | 7 - .../php-dns/src/Factories/SpatieDNS.php | 13 - .../php-dns/src/Mappers/CloudFlare.php | 23 - .../php-dns/src/Mappers/Dig.php | 18 - .../php-dns/src/Mappers/GoogleDNS.php | 24 - .../php-dns/src/Mappers/LocalSystem.php | 76 - .../php-dns/src/Mappers/MapperAbstract.php | 18 - .../php-dns/src/Mappers/MapperInterface.php | 10 - .../src/Observability/Events/DNSQueried.php | 58 - .../Observability/Events/DNSQueryFailed.php | 48 - .../Observability/Events/DNSQueryProfiled.php | 28 - .../Events/ObservableEventAbstract.php | 15 - .../Observability/Interfaces/Observable.php | 10 - .../Interfaces/ProfileInterface.php | 13 - .../Performance/Interfaces/Time.php | 10 - .../src/Observability/Performance/Profile.php | 44 - .../Performance/ProfileFactory.php | 11 - .../src/Observability/Performance/Timer.php | 19 - .../Subscribers/STDIOSubscriber.php | 37 - .../src/Observability/Traits/Dispatcher.php | 53 - .../src/Observability/Traits/Logger.php | 21 - .../src/Observability/Traits/Profileable.php | 25 - .../php-dns/src/Resolvers/Cached.php | 94 - .../php-dns/src/Resolvers/Chain.php | 119 - .../php-dns/src/Resolvers/CloudFlare.php | 83 - .../php-dns/src/Resolvers/Dig.php | 73 - .../src/Resolvers/Exceptions/QueryFailure.php | 8 - .../Exceptions/ReverseLookupFailure.php | 7 - .../php-dns/src/Resolvers/GoogleDNS.php | 73 - .../src/Resolvers/Interfaces/Chain.php | 26 - .../src/Resolvers/Interfaces/DNSQuery.php | 44 - .../Interfaces/ObservableResolver.php | 9 - .../src/Resolvers/Interfaces/Resolver.php | 8 - .../Resolvers/Interfaces/ReverseDNSQuery.php | 13 - .../php-dns/src/Resolvers/LocalSystem.php | 40 - .../src/Resolvers/ResolverAbstract.php | 115 - .../php-dns/src/Resolvers/Traits/Time.php | 24 - .../Services/Interfaces/LocalSystemDNS.php | 23 - .../php-dns/src/Services/LocalSystemDNS.php | 37 - dependencies/rpnzl/arrch/license.txt | 7 - dependencies/rpnzl/arrch/src/Arrch/Arrch.php | 319 - dependencies/scoper-autoload.php | 95 - dependencies/scssphp/scssphp/scss.inc.php | 20 - .../scssphp/scssphp/src/Base/Range.php | 53 - dependencies/scssphp/scssphp/src/Block.php | 63 - .../scssphp/scssphp/src/Block/AtRootBlock.php | 33 - .../scssphp/src/Block/CallableBlock.php | 40 - .../scssphp/src/Block/ContentBlock.php | 34 - .../scssphp/src/Block/DirectiveBlock.php | 33 - .../scssphp/scssphp/src/Block/EachBlock.php | 33 - .../scssphp/scssphp/src/Block/ElseBlock.php | 25 - .../scssphp/scssphp/src/Block/ElseifBlock.php | 29 - .../scssphp/scssphp/src/Block/ForBlock.php | 41 - .../scssphp/scssphp/src/Block/IfBlock.php | 33 - .../scssphp/scssphp/src/Block/MediaBlock.php | 33 - .../scssphp/src/Block/NestedPropertyBlock.php | 33 - .../scssphp/scssphp/src/Block/WhileBlock.php | 29 - dependencies/scssphp/scssphp/src/Cache.php | 215 - dependencies/scssphp/scssphp/src/Colors.php | 81 - .../scssphp/scssphp/src/CompilationResult.php | 62 - dependencies/scssphp/scssphp/src/Compiler.php | 8372 ------ .../scssphp/src/Compiler/CachedResult.php | 69 - .../scssphp/src/Compiler/Environment.php | 59 - .../src/Exception/CompilerException.php | 23 - .../scssphp/src/Exception/ParserException.php | 55 - .../scssphp/src/Exception/RangeException.php | 23 - .../scssphp/src/Exception/SassException.php | 7 - .../src/Exception/SassScriptException.php | 31 - .../scssphp/src/Exception/ServerException.php | 24 - .../scssphp/scssphp/src/Formatter.php | 313 - .../scssphp/scssphp/src/Formatter/Compact.php | 48 - .../scssphp/src/Formatter/Compressed.php | 66 - .../scssphp/src/Formatter/Crunched.php | 69 - .../scssphp/scssphp/src/Formatter/Debug.php | 104 - .../scssphp/src/Formatter/Expanded.php | 64 - .../scssphp/scssphp/src/Formatter/Nested.php | 192 - .../scssphp/src/Formatter/OutputBlock.php | 59 - .../scssphp/src/Logger/LoggerInterface.php | 46 - .../scssphp/src/Logger/QuietLogger.php | 27 - .../scssphp/src/Logger/StreamLogger.php | 56 - dependencies/scssphp/scssphp/src/Node.php | 39 - .../scssphp/scssphp/src/Node/Number.php | 682 - .../scssphp/scssphp/src/OutputStyle.php | 9 - dependencies/scssphp/scssphp/src/Parser.php | 3075 -- .../scssphp/scssphp/src/SourceMap/Base64.php | 53 - .../scssphp/src/SourceMap/Base64VLQ.php | 133 - .../src/SourceMap/SourceMapGenerator.php | 315 - dependencies/scssphp/scssphp/src/Type.php | 207 - dependencies/scssphp/scssphp/src/Util.php | 160 - .../scssphp/scssphp/src/Util/Path.php | 64 - .../scssphp/scssphp/src/ValueConverter.php | 81 - dependencies/scssphp/scssphp/src/Version.php | 22 - dependencies/scssphp/scssphp/src/Warn.php | 77 - dependencies/setasign/fpdi/src/FpdfTpl.php | 20 - .../setasign/fpdi/src/FpdfTplTrait.php | 360 - dependencies/setasign/fpdi/src/FpdfTrait.php | 168 - dependencies/setasign/fpdi/src/Fpdi.php | 31 - .../setasign/fpdi/src/FpdiException.php | 17 - dependencies/setasign/fpdi/src/FpdiTrait.php | 524 - .../setasign/fpdi/src/GraphicsState.php | 85 - .../setasign/fpdi/src/Math/Matrix.php | 79 - .../setasign/fpdi/src/Math/Vector.php | 59 - .../CrossReference/AbstractReader.php | 73 - .../CrossReference/CrossReference.php | 254 - .../CrossReferenceException.php | 66 - .../PdfParser/CrossReference/FixedReader.php | 167 - .../PdfParser/CrossReference/LineReader.php | 138 - .../CrossReference/ReaderInterface.php | 31 - .../fpdi/src/PdfParser/Filter/Ascii85.php | 81 - .../src/PdfParser/Filter/Ascii85Exception.php | 25 - .../fpdi/src/PdfParser/Filter/AsciiHex.php | 43 - .../src/PdfParser/Filter/FilterException.php | 20 - .../src/PdfParser/Filter/FilterInterface.php | 24 - .../fpdi/src/PdfParser/Filter/Flate.php | 74 - .../src/PdfParser/Filter/FlateException.php | 25 - .../fpdi/src/PdfParser/Filter/Lzw.php | 144 - .../src/PdfParser/Filter/LzwException.php | 21 - .../setasign/fpdi/src/PdfParser/PdfParser.php | 341 - .../fpdi/src/PdfParser/PdfParserException.php | 42 - .../fpdi/src/PdfParser/StreamReader.php | 401 - .../setasign/fpdi/src/PdfParser/Tokenizer.php | 126 - .../fpdi/src/PdfParser/Type/PdfArray.php | 71 - .../fpdi/src/PdfParser/Type/PdfBoolean.php | 40 - .../fpdi/src/PdfParser/Type/PdfDictionary.php | 112 - .../fpdi/src/PdfParser/Type/PdfHexString.php | 67 - .../src/PdfParser/Type/PdfIndirectObject.php | 88 - .../Type/PdfIndirectObjectReference.php | 48 - .../fpdi/src/PdfParser/Type/PdfName.php | 74 - .../fpdi/src/PdfParser/Type/PdfNull.php | 18 - .../fpdi/src/PdfParser/Type/PdfNumeric.php | 40 - .../fpdi/src/PdfParser/Type/PdfStream.php | 284 - .../fpdi/src/PdfParser/Type/PdfString.php | 158 - .../fpdi/src/PdfParser/Type/PdfToken.php | 40 - .../fpdi/src/PdfParser/Type/PdfType.php | 67 - .../src/PdfParser/Type/PdfTypeException.php | 22 - .../src/PdfReader/DataStructure/Rectangle.php | 156 - .../setasign/fpdi/src/PdfReader/Page.php | 325 - .../fpdi/src/PdfReader/PageBoundaries.php | 81 - .../setasign/fpdi/src/PdfReader/PdfReader.php | 196 - .../fpdi/src/PdfReader/PdfReaderException.php | 30 - dependencies/setasign/fpdi/src/Tcpdf/Fpdi.php | 345 - dependencies/setasign/fpdi/src/TcpdfFpdi.php | 22 - .../setasign/fpdi/src/Tfpdf/FpdfTpl.php | 21 - dependencies/setasign/fpdi/src/Tfpdf/Fpdi.php | 29 - dependencies/setasign/fpdi/src/autoload.php | 21 - dependencies/spatie/dns/src/Dns.php | 84 - .../dns/src/Exceptions/CouldNotFetchDns.php | 11 - .../dns/src/Exceptions/InvalidArgument.php | 17 - .../spatie/macroable/src/Macroable.php | 61 - .../spatie/ssl-certificate/src/Downloader.php | 132 - .../CouldNotDownloadCertificate.php | 23 - .../HostDoesNotExist.php | 12 - .../NoCertificateInstalled.php | 12 - .../UnknownError.php | 12 - .../src/Exceptions/InvalidIpAddress.php | 12 - .../src/Exceptions/InvalidUrl.php | 16 - .../ssl-certificate/src/SslCertificate.php | 225 - .../spatie/ssl-certificate/src/Url.php | 37 - .../spatie/ssl-certificate/src/helpers.php | 71 - .../stripe/stripe-php/OPENAPI_VERSION | 1 - dependencies/stripe/stripe-php/VERSION | 1 - .../stripe-php/data/ca-certificates.crt | 3347 --- dependencies/stripe/stripe-php/init.php | 294 - .../stripe/stripe-php/lib/Account.php | 352 - .../stripe/stripe-php/lib/AccountLink.php | 21 - .../stripe-php/lib/ApiOperations/All.php | 33 - .../stripe-php/lib/ApiOperations/Create.php | 29 - .../stripe-php/lib/ApiOperations/Delete.php | 28 - .../lib/ApiOperations/NestedResource.php | 121 - .../stripe-php/lib/ApiOperations/Request.php | 90 - .../stripe-php/lib/ApiOperations/Retrieve.php | 29 - .../stripe-php/lib/ApiOperations/Search.php | 33 - .../lib/ApiOperations/SingletonRetrieve.php | 28 - .../stripe-php/lib/ApiOperations/Update.php | 52 - .../stripe/stripe-php/lib/ApiRequestor.php | 482 - .../stripe/stripe-php/lib/ApiResource.php | 101 - .../stripe/stripe-php/lib/ApiResponse.php | 40 - .../stripe/stripe-php/lib/ApplePayDomain.php | 28 - .../stripe/stripe-php/lib/ApplicationFee.php | 83 - .../stripe-php/lib/ApplicationFeeRefund.php | 54 - .../stripe/stripe-php/lib/Apps/Secret.php | 64 - .../stripe/stripe-php/lib/Balance.php | 31 - .../stripe-php/lib/BalanceTransaction.php | 66 - .../stripe/stripe-php/lib/BankAccount.php | 110 - .../stripe-php/lib/BaseStripeClient.php | 252 - .../lib/BaseStripeClientInterface.php | 40 - .../lib/BillingPortal/Configuration.php | 30 - .../stripe-php/lib/BillingPortal/Session.php | 38 - .../stripe/stripe-php/lib/Capability.php | 68 - dependencies/stripe/stripe-php/lib/Card.php | 118 - .../stripe/stripe-php/lib/CashBalance.php | 52 - dependencies/stripe/stripe-php/lib/Charge.php | 155 - .../stripe-php/lib/Checkout/Session.php | 129 - .../stripe/stripe-php/lib/Collection.php | 259 - .../stripe/stripe-php/lib/CountrySpec.php | 28 - dependencies/stripe/stripe-php/lib/Coupon.php | 40 - .../stripe/stripe-php/lib/CreditNote.php | 119 - .../stripe-php/lib/CreditNoteLineItem.php | 29 - .../stripe/stripe-php/lib/Customer.php | 357 - .../lib/CustomerBalanceTransaction.php | 80 - .../lib/CustomerCashBalanceTransaction.php | 40 - .../stripe/stripe-php/lib/Discount.php | 23 - .../stripe/stripe-php/lib/Dispute.php | 75 - .../stripe/stripe-php/lib/EphemeralKey.php | 37 - .../stripe/stripe-php/lib/ErrorObject.php | 218 - dependencies/stripe/stripe-php/lib/Event.php | 279 - .../lib/Exception/ApiConnectionException.php | 12 - .../lib/Exception/ApiErrorException.php | 191 - .../lib/Exception/AuthenticationException.php | 11 - .../lib/Exception/BadMethodCallException.php | 7 - .../lib/Exception/CardException.php | 70 - .../lib/Exception/ExceptionInterface.php | 22 - .../lib/Exception/IdempotencyException.php | 11 - .../Exception/InvalidArgumentException.php | 7 - .../lib/Exception/InvalidRequestException.php | 49 - .../Exception/OAuth/ExceptionInterface.php | 10 - .../OAuth/InvalidClientException.php | 12 - .../Exception/OAuth/InvalidGrantException.php | 13 - .../OAuth/InvalidRequestException.php | 11 - .../Exception/OAuth/InvalidScopeException.php | 10 - .../Exception/OAuth/OAuthErrorException.php | 18 - .../OAuth/UnknownOAuthErrorException.php | 12 - .../OAuth/UnsupportedGrantTypeException.php | 11 - .../UnsupportedResponseTypeException.php | 11 - .../lib/Exception/PermissionException.php | 11 - .../lib/Exception/RateLimitException.php | 12 - .../SignatureVerificationException.php | 65 - .../Exception/UnexpectedValueException.php | 7 - .../Exception/UnknownApiErrorException.php | 12 - .../stripe/stripe-php/lib/ExchangeRate.php | 28 - dependencies/stripe/stripe-php/lib/File.php | 74 - .../stripe/stripe-php/lib/FileLink.php | 28 - .../lib/FinancialConnections/Account.php | 92 - .../lib/FinancialConnections/AccountOwner.php | 21 - .../FinancialConnections/AccountOwnership.php | 17 - .../lib/FinancialConnections/Session.php | 24 - .../stripe-php/lib/FundingInstructions.php | 23 - .../lib/HttpClient/ClientInterface.php | 22 - .../stripe-php/lib/HttpClient/CurlClient.php | 597 - .../HttpClient/StreamingClientInterface.php | 23 - .../lib/Identity/VerificationReport.php | 37 - .../lib/Identity/VerificationSession.php | 77 - .../stripe/stripe-php/lib/Invoice.php | 289 - .../stripe/stripe-php/lib/InvoiceItem.php | 51 - .../stripe/stripe-php/lib/InvoiceLineItem.php | 35 - .../stripe-php/lib/Issuing/Authorization.php | 82 - .../stripe/stripe-php/lib/Issuing/Card.php | 52 - .../stripe-php/lib/Issuing/CardDetails.php | 19 - .../stripe-php/lib/Issuing/Cardholder.php | 40 - .../stripe/stripe-php/lib/Issuing/Dispute.php | 51 - .../stripe-php/lib/Issuing/Transaction.php | 45 - .../stripe/stripe-php/lib/LineItem.php | 25 - .../stripe/stripe-php/lib/LoginLink.php | 16 - .../stripe/stripe-php/lib/Mandate.php | 30 - dependencies/stripe/stripe-php/lib/OAuth.php | 75 - .../stripe-php/lib/OAuthErrorObject.php | 28 - .../stripe/stripe-php/lib/PaymentIntent.php | 191 - .../stripe/stripe-php/lib/PaymentLink.php | 78 - .../stripe/stripe-php/lib/PaymentMethod.php | 126 - dependencies/stripe/stripe-php/lib/Payout.php | 104 - dependencies/stripe/stripe-php/lib/Person.php | 97 - dependencies/stripe/stripe-php/lib/Plan.php | 59 - dependencies/stripe/stripe-php/lib/Price.php | 66 - .../stripe/stripe-php/lib/Product.php | 62 - .../stripe/stripe-php/lib/PromotionCode.php | 31 - dependencies/stripe/stripe-php/lib/Quote.php | 156 - .../lib/Radar/EarlyFraudWarning.php | 33 - .../stripe/stripe-php/lib/Radar/ValueList.php | 40 - .../stripe-php/lib/Radar/ValueListItem.php | 26 - .../stripe-php/lib/RecipientTransfer.php | 36 - dependencies/stripe/stripe-php/lib/Refund.php | 67 - .../stripe-php/lib/Reporting/ReportRun.php | 33 - .../stripe-php/lib/Reporting/ReportType.php | 31 - .../stripe-php/lib/RequestTelemetry.php | 25 - dependencies/stripe/stripe-php/lib/Review.php | 67 - .../stripe/stripe-php/lib/SearchResult.php | 202 - .../lib/Service/AbstractService.php | 98 - .../lib/Service/AbstractServiceFactory.php | 61 - .../lib/Service/AccountLinkService.php | 24 - .../stripe-php/lib/Service/AccountService.php | 371 - .../lib/Service/ApplePayDomainService.php | 66 - .../lib/Service/ApplicationFeeService.php | 119 - .../lib/Service/Apps/AppsServiceFactory.php | 21 - .../lib/Service/Apps/SecretService.php | 64 - .../stripe-php/lib/Service/BalanceService.php | 25 - .../lib/Service/BalanceTransactionService.php | 45 - .../BillingPortalServiceFactory.php | 22 - .../BillingPortal/ConfigurationService.php | 69 - .../Service/BillingPortal/SessionService.php | 22 - .../stripe-php/lib/Service/ChargeService.php | 116 - .../Checkout/CheckoutServiceFactory.php | 21 - .../lib/Service/Checkout/SessionService.php | 87 - .../lib/Service/CoreServiceFactory.php | 78 - .../lib/Service/CountrySpecService.php | 37 - .../stripe-php/lib/Service/CouponService.php | 99 - .../lib/Service/CreditNoteService.php | 148 - .../lib/Service/CustomerService.php | 470 - .../stripe-php/lib/Service/DisputeService.php | 79 - .../lib/Service/EphemeralKeyService.php | 40 - .../stripe-php/lib/Service/EventService.php | 42 - .../lib/Service/ExchangeRateService.php | 39 - .../lib/Service/FileLinkService.php | 66 - .../stripe-php/lib/Service/FileService.php | 61 - .../FinancialConnections/AccountService.php | 84 - .../FinancialConnectionsServiceFactory.php | 22 - .../FinancialConnections/SessionService.php | 39 - .../Identity/IdentityServiceFactory.php | 22 - .../Identity/VerificationReportService.php | 37 - .../Identity/VerificationSessionService.php | 140 - .../lib/Service/InvoiceItemService.php | 88 - .../stripe-php/lib/Service/InvoiceService.php | 276 - .../Service/Issuing/AuthorizationService.php | 96 - .../lib/Service/Issuing/CardService.php | 69 - .../lib/Service/Issuing/CardholderService.php | 70 - .../lib/Service/Issuing/DisputeService.php | 94 - .../Service/Issuing/IssuingServiceFactory.php | 25 - .../Service/Issuing/TransactionService.php | 56 - .../stripe-php/lib/Service/MandateService.php | 23 - .../stripe-php/lib/Service/OAuthService.php | 124 - .../lib/Service/PaymentIntentService.php | 265 - .../lib/Service/PaymentLinkService.php | 84 - .../lib/Service/PaymentMethodService.php | 129 - .../stripe-php/lib/Service/PayoutService.php | 121 - .../stripe-php/lib/Service/PlanService.php | 86 - .../stripe-php/lib/Service/PriceService.php | 87 - .../stripe-php/lib/Service/ProductService.php | 106 - .../lib/Service/PromotionCodeService.php | 71 - .../stripe-php/lib/Service/QuoteService.php | 169 - .../Radar/EarlyFraudWarningService.php | 41 - .../lib/Service/Radar/RadarServiceFactory.php | 23 - .../Service/Radar/ValueListItemService.php | 70 - .../lib/Service/Radar/ValueListService.php | 88 - .../stripe-php/lib/Service/RefundService.php | 90 - .../Service/Reporting/ReportRunService.php | 52 - .../Service/Reporting/ReportTypeService.php | 38 - .../Reporting/ReportingServiceFactory.php | 22 - .../stripe-php/lib/Service/ReviewService.php | 55 - .../lib/Service/SetupAttemptService.php | 22 - .../lib/Service/SetupIntentService.php | 137 - .../lib/Service/ShippingRateService.php | 66 - .../Sigma/ScheduledQueryRunService.php | 37 - .../lib/Service/Sigma/SigmaServiceFactory.php | 21 - .../stripe-php/lib/Service/SourceService.php | 106 - .../lib/Service/SubscriptionItemService.php | 144 - .../Service/SubscriptionScheduleService.php | 107 - .../lib/Service/SubscriptionService.php | 168 - .../lib/Service/Tax/CalculationService.php | 37 - .../lib/Service/Tax/SettingsService.php | 37 - .../lib/Service/Tax/TaxServiceFactory.php | 23 - .../lib/Service/Tax/TransactionService.php | 66 - .../stripe-php/lib/Service/TaxCodeService.php | 39 - .../stripe-php/lib/Service/TaxRateService.php | 67 - .../Service/Terminal/ConfigurationService.php | 81 - .../Terminal/ConnectionTokenService.php | 24 - .../lib/Service/Terminal/LocationService.php | 84 - .../lib/Service/Terminal/ReaderService.php | 157 - .../Terminal/TerminalServiceFactory.php | 24 - .../Service/TestHelpers/CustomerService.php | 23 - .../TestHelpers/Issuing/CardService.php | 72 - .../Issuing/IssuingServiceFactory.php | 21 - .../lib/Service/TestHelpers/RefundService.php | 23 - .../TestHelpers/Terminal/ReaderService.php | 24 - .../Terminal/TerminalServiceFactory.php | 21 - .../Service/TestHelpers/TestClockService.php | 82 - .../TestHelpers/TestHelpersServiceFactory.php | 26 - .../Treasury/InboundTransferService.php | 59 - .../Treasury/OutboundPaymentService.php | 59 - .../Treasury/OutboundTransferService.php | 59 - .../Treasury/ReceivedCreditService.php | 24 - .../Treasury/ReceivedDebitService.php | 24 - .../Treasury/TreasuryServiceFactory.php | 25 - .../stripe-php/lib/Service/TokenService.php | 40 - .../stripe-php/lib/Service/TopupService.php | 84 - .../lib/Service/TransferService.php | 153 - .../Treasury/CreditReversalService.php | 53 - .../Service/Treasury/DebitReversalService.php | 51 - .../Treasury/FinancialAccountService.php | 97 - .../Treasury/InboundTransferService.php | 66 - .../Treasury/OutboundPaymentService.php | 68 - .../Treasury/OutboundTransferService.php | 68 - .../Treasury/ReceivedCreditService.php | 38 - .../Service/Treasury/ReceivedDebitService.php | 38 - .../Treasury/TransactionEntryService.php | 37 - .../Service/Treasury/TransactionService.php | 37 - .../Treasury/TreasuryServiceFactory.php | 30 - .../lib/Service/WebhookEndpointService.php | 92 - .../stripe/stripe-php/lib/SetupAttempt.php | 32 - .../stripe/stripe-php/lib/SetupIntent.php | 116 - .../stripe/stripe-php/lib/ShippingRate.php | 34 - .../lib/Sigma/ScheduledQueryRun.php | 33 - .../stripe-php/lib/SingletonApiResource.php | 28 - dependencies/stripe/stripe-php/lib/Source.php | 156 - .../stripe-php/lib/SourceTransaction.php | 20 - dependencies/stripe/stripe-php/lib/Stripe.php | 237 - .../stripe/stripe-php/lib/StripeClient.php | 85 - .../stripe-php/lib/StripeClientInterface.php | 21 - .../stripe/stripe-php/lib/StripeObject.php | 516 - .../lib/StripeStreamingClientInterface.php | 11 - .../stripe/stripe-php/lib/Subscription.php | 149 - .../stripe-php/lib/SubscriptionItem.php | 58 - .../stripe-php/lib/SubscriptionSchedule.php | 76 - .../stripe/stripe-php/lib/Tax/Calculation.php | 47 - .../lib/Tax/CalculationLineItem.php | 24 - .../stripe/stripe-php/lib/Tax/Settings.php | 25 - .../stripe/stripe-php/lib/Tax/Transaction.php | 81 - .../lib/Tax/TransactionLineItem.php | 28 - .../stripe/stripe-php/lib/TaxCode.php | 19 - dependencies/stripe/stripe-php/lib/TaxId.php | 125 - .../stripe/stripe-php/lib/TaxRate.php | 47 - .../stripe-php/lib/Terminal/Configuration.php | 25 - .../lib/Terminal/ConnectionToken.php | 19 - .../stripe-php/lib/Terminal/Location.php | 27 - .../stripe/stripe-php/lib/Terminal/Reader.php | 113 - .../stripe-php/lib/TestHelpers/TestClock.php | 45 - dependencies/stripe/stripe-php/lib/Token.php | 47 - dependencies/stripe/stripe-php/lib/Topup.php | 57 - .../stripe/stripe-php/lib/Transfer.php | 102 - .../stripe-php/lib/TransferReversal.php | 66 - .../lib/Treasury/CreditReversal.php | 35 - .../stripe-php/lib/Treasury/DebitReversal.php | 36 - .../lib/Treasury/FinancialAccount.php | 67 - .../lib/Treasury/FinancialAccountFeatures.php | 22 - .../lib/Treasury/InboundTransfer.php | 55 - .../lib/Treasury/OutboundPayment.php | 59 - .../lib/Treasury/OutboundTransfer.php | 57 - .../lib/Treasury/ReceivedCredit.php | 40 - .../stripe-php/lib/Treasury/ReceivedDebit.php | 40 - .../stripe-php/lib/Treasury/Transaction.php | 42 - .../lib/Treasury/TransactionEntry.php | 57 - .../stripe/stripe-php/lib/UsageRecord.php | 22 - .../stripe-php/lib/UsageRecordSummary.php | 18 - .../stripe/stripe-php/lib/Util/ApiVersion.php | 9 - .../lib/Util/CaseInsensitiveArray.php | 85 - .../stripe-php/lib/Util/DefaultLogger.php | 26 - .../stripe-php/lib/Util/LoggerInterface.php | 34 - .../stripe-php/lib/Util/ObjectTypes.php | 12 - .../stripe-php/lib/Util/RandomGenerator.php | 34 - .../stripe-php/lib/Util/RequestOptions.php | 137 - .../stripe/stripe-php/lib/Util/Set.php | 41 - .../stripe/stripe-php/lib/Util/Util.php | 228 - .../stripe/stripe-php/lib/Webhook.php | 37 - .../stripe/stripe-php/lib/WebhookEndpoint.php | 36 - .../stripe-php/lib/WebhookSignature.php | 111 - .../cache-contracts/CacheInterface.php | 54 - .../symfony/cache-contracts/CacheTrait.php | 69 - .../cache-contracts/CallbackInterface.php | 28 - .../symfony/cache-contracts/ItemInterface.php | 58 - .../TagAwareCacheInterface.php | 36 - .../symfony/cache/Adapter/AbstractAdapter.php | 180 - .../cache/Adapter/AbstractTagAwareAdapter.php | 287 - .../cache/Adapter/AdapterInterface.php | 42 - .../symfony/cache/Adapter/ApcuAdapter.php | 118 - .../symfony/cache/Adapter/ArrayAdapter.php | 346 - .../symfony/cache/Adapter/ChainAdapter.php | 287 - .../cache/Adapter/CouchbaseBucketAdapter.php | 196 - .../Adapter/CouchbaseCollectionAdapter.php | 181 - .../symfony/cache/Adapter/DoctrineAdapter.php | 94 - .../cache/Adapter/DoctrineDbalAdapter.php | 356 - .../cache/Adapter/FilesystemAdapter.php | 26 - .../Adapter/FilesystemTagAwareAdapter.php | 205 - .../cache/Adapter/MemcachedAdapter.php | 303 - .../symfony/cache/Adapter/NullAdapter.php | 130 - .../cache/Adapter/ParameterNormalizer.php | 32 - .../symfony/cache/Adapter/PdoAdapter.php | 512 - .../symfony/cache/Adapter/PhpArrayAdapter.php | 372 - .../symfony/cache/Adapter/PhpFilesAdapter.php | 284 - .../symfony/cache/Adapter/ProxyAdapter.php | 230 - .../symfony/cache/Adapter/Psr16Adapter.php | 75 - .../symfony/cache/Adapter/RedisAdapter.php | 29 - .../cache/Adapter/RedisTagAwareAdapter.php | 278 - .../symfony/cache/Adapter/TagAwareAdapter.php | 350 - .../Adapter/TagAwareAdapterInterface.php | 31 - .../cache/Adapter/TraceableAdapter.php | 266 - .../Adapter/TraceableTagAwareAdapter.php | 35 - dependencies/symfony/cache/CacheItem.php | 174 - .../DataCollector/CacheDataCollector.php | 152 - .../CacheCollectorPass.php | 81 - .../CachePoolClearerPass.php | 46 - .../DependencyInjection/CachePoolPass.php | 223 - .../CachePoolPrunerPass.php | 54 - .../symfony/cache/DoctrineProvider.php | 108 - .../cache/Exception/CacheException.php | 23 - .../Exception/InvalidArgumentException.php | 23 - .../cache/Exception/LogicException.php | 23 - dependencies/symfony/cache/LockRegistry.php | 120 - .../cache/Marshaller/DefaultMarshaller.php | 95 - .../cache/Marshaller/DeflateMarshaller.php | 46 - .../cache/Marshaller/MarshallerInterface.php | 38 - .../cache/Marshaller/SodiumMarshaller.php | 69 - .../cache/Marshaller/TagAwareMarshaller.php | 73 - .../Messenger/EarlyExpirationDispatcher.php | 52 - .../Messenger/EarlyExpirationHandler.php | 64 - .../Messenger/EarlyExpirationMessage.php | 82 - .../symfony/cache/PruneableInterface.php | 22 - dependencies/symfony/cache/Psr16Cache.php | 255 - .../symfony/cache/ResettableInterface.php | 19 - .../cache/Traits/AbstractAdapterTrait.php | 372 - .../symfony/cache/Traits/ContractsTrait.php | 89 - .../cache/Traits/FilesystemCommonTrait.php | 168 - .../symfony/cache/Traits/FilesystemTrait.php | 106 - .../symfony/cache/Traits/ProxyTrait.php | 39 - .../cache/Traits/RedisClusterNodeProxy.php | 48 - .../cache/Traits/RedisClusterProxy.php | 51 - .../symfony/cache/Traits/RedisProxy.php | 53 - .../symfony/cache/Traits/RedisTrait.php | 557 - .../deprecation-contracts/function.php | 28 - .../event-dispatcher-contracts/Event.php | 47 - .../EventDispatcherInterface.php | 31 - .../Attribute/AsEventListener.php | 24 - .../Debug/TraceableEventDispatcher.php | 315 - .../Debug/WrappedListener.php | 107 - .../AddEventAliasesPass.php | 37 - .../RegisterListenersPass.php | 189 - .../event-dispatcher/EventDispatcher.php | 247 - .../EventDispatcherInterface.php | 62 - .../EventSubscriberInterface.php | 48 - .../symfony/event-dispatcher/GenericEvent.php | 165 - .../ImmutableEventDispatcher.php | 81 - .../LegacyEventDispatcherProxy.php | 28 - .../symfony/polyfill-mbstring/Mbstring.php | 753 - .../Resources/unidata/caseFolding.php | 5 - .../Resources/unidata/lowerCase.php | 5 - .../Resources/unidata/titleCaseRegexp.php | 6 - .../Resources/unidata/upperCase.php | 5 - .../symfony/polyfill-mbstring/bootstrap.php | 151 - .../symfony/polyfill-mbstring/bootstrap80.php | 261 - dependencies/symfony/polyfill-php73/Php73.php | 38 - .../Resources/stubs/JsonException.php | 17 - .../symfony/polyfill-php73/bootstrap.php | 44 - dependencies/symfony/polyfill-php80/Php80.php | 107 - .../symfony/polyfill-php80/PhpToken.php | 90 - .../Resources/stubs/Attribute.php | 39 - .../Resources/stubs/PhpToken.php | 17 - .../Resources/stubs/Stringable.php | 21 - .../Resources/stubs/UnhandledMatchError.php | 17 - .../Resources/stubs/ValueError.php | 17 - .../symfony/polyfill-php80/bootstrap.php | 42 - dependencies/symfony/polyfill-php81/Php81.php | 33 - .../Resources/stubs/CURLStringFile.php | 45 - .../Resources/stubs/ReturnTypeWillChange.php | 21 - .../symfony/polyfill-php81/bootstrap.php | 28 - .../process/Exception/ExceptionInterface.php | 20 - .../Exception/InvalidArgumentException.php | 20 - .../process/Exception/LogicException.php | 20 - .../Exception/ProcessFailedException.php | 38 - .../Exception/ProcessSignaledException.php | 35 - .../Exception/ProcessTimedOutException.php | 54 - .../process/Exception/RuntimeException.php | 20 - .../symfony/process/ExecutableFinder.php | 77 - dependencies/symfony/process/InputStream.php | 87 - .../symfony/process/PhpExecutableFinder.php | 88 - dependencies/symfony/process/PhpProcess.php | 66 - .../symfony/process/Pipes/AbstractPipes.php | 160 - .../symfony/process/Pipes/PipesInterface.php | 54 - .../symfony/process/Pipes/UnixPipes.php | 128 - .../symfony/process/Pipes/WindowsPipes.php | 171 - dependencies/symfony/process/Process.php | 1431 - dependencies/symfony/process/ProcessUtils.php | 64 - .../service-contracts/Attribute/Required.php | 24 - .../Attribute/SubscribedService.php | 40 - .../service-contracts/ResetInterface.php | 32 - .../service-contracts/ServiceLocatorTrait.php | 100 - .../ServiceProviderInterface.php | 41 - .../ServiceSubscriberInterface.php | 60 - .../ServiceSubscriberTrait.php | 65 - .../Test/ServiceLocatorTest.php | 21 - .../Test/ServiceLocatorTestCase.php | 83 - .../LocaleAwareInterface.php | 27 - .../Test/TranslatorTest.php | 306 - .../TranslatableInterface.php | 19 - .../TranslatorInterface.php | 66 - .../translation-contracts/TranslatorTrait.php | 133 - .../Catalogue/AbstractOperation.php | 163 - .../translation/Catalogue/MergeOperation.php | 62 - .../Catalogue/OperationInterface.php | 55 - .../translation/Catalogue/TargetOperation.php | 75 - .../CatalogueMetadataAwareInterface.php | 45 - .../Command/TranslationPullCommand.php | 138 - .../Command/TranslationPushCommand.php | 139 - .../translation/Command/TranslationTrait.php | 66 - .../translation/Command/XliffLintCommand.php | 225 - .../TranslationDataCollector.php | 118 - .../translation/DataCollectorTranslator.php | 116 - .../TranslationDumperPass.php | 34 - .../TranslationExtractorPass.php | 38 - .../DependencyInjection/TranslatorPass.php | 78 - .../TranslatorPathsPass.php | 123 - .../translation/Dumper/CsvFileDumper.php | 48 - .../translation/Dumper/DumperInterface.php | 30 - .../symfony/translation/Dumper/FileDumper.php | 93 - .../translation/Dumper/IcuResFileDumper.php | 96 - .../translation/Dumper/IniFileDumper.php | 34 - .../translation/Dumper/JsonFileDumper.php | 30 - .../translation/Dumper/MoFileDumper.php | 51 - .../translation/Dumper/PhpFileDumper.php | 29 - .../translation/Dumper/PoFileDumper.php | 115 - .../translation/Dumper/QtFileDumper.php | 50 - .../translation/Dumper/XliffFileDumper.php | 180 - .../translation/Dumper/YamlFileDumper.php | 47 - .../Exception/ExceptionInterface.php | 20 - .../Exception/IncompleteDsnException.php | 22 - .../Exception/InvalidArgumentException.php | 20 - .../Exception/InvalidResourceException.php | 20 - .../translation/Exception/LogicException.php | 20 - .../MissingRequiredOptionException.php | 23 - .../Exception/NotFoundResourceException.php | 20 - .../Exception/ProviderException.php | 35 - .../Exception/ProviderExceptionInterface.php | 22 - .../Exception/RuntimeException.php | 20 - .../Exception/UnsupportedSchemeException.php | 35 - .../Extractor/AbstractFileExtractor.php | 59 - .../translation/Extractor/ChainExtractor.php | 54 - .../Extractor/ExtractorInterface.php | 36 - .../translation/Extractor/PhpAstExtractor.php | 69 - .../translation/Extractor/PhpExtractor.php | 207 - .../Extractor/PhpStringTokenParser.php | 112 - .../Extractor/Visitor/AbstractVisitor.php | 101 - .../Extractor/Visitor/ConstraintVisitor.php | 90 - .../Extractor/Visitor/TransMethodVisitor.php | 53 - .../Visitor/TranslatableMessageVisitor.php | 53 - .../translation/Formatter/IntlFormatter.php | 50 - .../Formatter/IntlFormatterInterface.php | 26 - .../Formatter/MessageFormatter.php | 43 - .../Formatter/MessageFormatterInterface.php | 27 - .../translation/IdentityTranslator.php | 24 - .../translation/Loader/ArrayLoader.php | 52 - .../translation/Loader/CsvFileLoader.php | 55 - .../symfony/translation/Loader/FileLoader.php | 47 - .../translation/Loader/IcuDatFileLoader.php | 50 - .../translation/Loader/IcuResFileLoader.php | 76 - .../translation/Loader/IniFileLoader.php | 24 - .../translation/Loader/JsonFileLoader.php | 46 - .../translation/Loader/LoaderInterface.php | 30 - .../translation/Loader/MoFileLoader.php | 112 - .../translation/Loader/PhpFileLoader.php | 31 - .../translation/Loader/PoFileLoader.php | 134 - .../translation/Loader/QtFileLoader.php | 62 - .../translation/Loader/XliffFileLoader.php | 185 - .../translation/Loader/YamlFileLoader.php | 44 - .../symfony/translation/LocaleSwitcher.php | 66 - .../symfony/translation/LoggingTranslator.php | 98 - .../symfony/translation/MessageCatalogue.php | 286 - .../translation/MessageCatalogueInterface.php | 118 - .../translation/MetadataAwareInterface.php | 45 - .../Provider/AbstractProviderFactory.php | 32 - .../symfony/translation/Provider/Dsn.php | 92 - .../Provider/FilteringProvider.php | 53 - .../translation/Provider/NullProvider.php | 34 - .../Provider/NullProviderFactory.php | 30 - .../Provider/ProviderFactoryInterface.php | 23 - .../Provider/ProviderInterface.php | 27 - .../TranslationProviderCollection.php | 49 - .../TranslationProviderCollectionFactory.php | 46 - .../PseudoLocalizationTranslator.php | 209 - .../translation/Reader/TranslationReader.php | 59 - .../Reader/TranslationReaderInterface.php | 27 - .../translation/Resources/data/parents.json | 141 - .../translation/Resources/functions.php | 21 - .../schemas/xliff-core-1.2-transitional.xsd | 2261 -- .../Resources/schemas/xliff-core-2.0.xsd | 411 - .../translation/Resources/schemas/xml.xsd | 309 - .../Test/ProviderFactoryTestCase.php | 130 - .../translation/Test/ProviderTestCase.php | 73 - .../translation/TranslatableMessage.php | 49 - .../symfony/translation/Translator.php | 384 - .../symfony/translation/TranslatorBag.php | 78 - .../translation/TranslatorBagInterface.php | 33 - .../translation/Util/ArrayConverter.php | 86 - .../symfony/translation/Util/XliffUtils.php | 154 - .../translation/Writer/TranslationWriter.php | 67 - .../Writer/TranslationWriterInterface.php | 33 - .../Exception/ClassNotFoundException.php | 19 - .../Exception/ExceptionInterface.php | 15 - .../var-exporter/Exception/LogicException.php | 15 - .../NotInstantiableTypeException.php | 19 - .../symfony/var-exporter/Hydrator.php | 73 - .../symfony/var-exporter/Instantiator.php | 55 - .../var-exporter/Internal/Exporter.php | 362 - .../var-exporter/Internal/Hydrator.php | 260 - .../Internal/LazyObjectRegistry.php | 119 - .../var-exporter/Internal/LazyObjectState.php | 107 - .../var-exporter/Internal/LazyObjectTrait.php | 29 - .../var-exporter/Internal/Reference.php | 28 - .../var-exporter/Internal/Registry.php | 120 - .../symfony/var-exporter/Internal/Values.php | 25 - .../symfony/var-exporter/LazyGhostTrait.php | 313 - .../var-exporter/LazyObjectInterface.php | 29 - .../symfony/var-exporter/LazyProxyTrait.php | 281 - .../symfony/var-exporter/ProxyHelper.php | 316 - .../symfony/var-exporter/VarExporter.php | 101 - dependencies/webmozart/assert/src/Assert.php | 1606 - .../assert/src/InvalidArgumentException.php | 15 - dependencies/webmozart/assert/src/Mixin.php | 4630 --- .../action-scheduler/action-scheduler.php | 68 - .../classes/ActionScheduler_ActionClaim.php | 23 - .../classes/ActionScheduler_ActionFactory.php | 342 - .../classes/ActionScheduler_AdminView.php | 252 - ...tionScheduler_AsyncRequest_QueueRunner.php | 97 - .../classes/ActionScheduler_Compatibility.php | 105 - .../ActionScheduler_DataController.php | 187 - .../classes/ActionScheduler_DateTime.php | 79 - .../classes/ActionScheduler_Exception.php | 11 - .../ActionScheduler_FatalErrorMonitor.php | 55 - ...ActionScheduler_InvalidActionException.php | 47 - .../classes/ActionScheduler_ListTable.php | 670 - .../classes/ActionScheduler_LogEntry.php | 67 - .../classes/ActionScheduler_NullLogEntry.php | 11 - .../classes/ActionScheduler_OptionLock.php | 135 - .../classes/ActionScheduler_QueueCleaner.php | 233 - .../classes/ActionScheduler_QueueRunner.php | 229 - .../classes/ActionScheduler_Versions.php | 62 - .../ActionScheduler_WPCommentCleaner.php | 115 - .../ActionScheduler_wcSystemStatus.php | 166 - .../ActionScheduler_WPCLI_Clean_Command.php | 125 - .../ActionScheduler_WPCLI_QueueRunner.php | 197 - ...ctionScheduler_WPCLI_Scheduler_command.php | 210 - .../classes/WP_CLI/Migration_Command.php | 148 - .../classes/WP_CLI/ProgressBar.php | 119 - .../classes/abstracts/ActionScheduler.php | 337 - .../ActionScheduler_Abstract_ListTable.php | 776 - .../ActionScheduler_Abstract_QueueRunner.php | 372 - ...onScheduler_Abstract_RecurringSchedule.php | 102 - .../ActionScheduler_Abstract_Schedule.php | 83 - .../ActionScheduler_Abstract_Schema.php | 177 - .../abstracts/ActionScheduler_Lock.php | 64 - .../abstracts/ActionScheduler_Logger.php | 176 - .../abstracts/ActionScheduler_Store.php | 450 - .../ActionScheduler_TimezoneHelper.php | 152 - .../actions/ActionScheduler_Action.php | 135 - .../ActionScheduler_CanceledAction.php | 23 - .../ActionScheduler_FinishedAction.php | 16 - .../actions/ActionScheduler_NullAction.php | 16 - .../data-stores/ActionScheduler_DBLogger.php | 154 - .../data-stores/ActionScheduler_DBStore.php | 1180 - .../ActionScheduler_HybridStore.php | 426 - .../ActionScheduler_wpCommentLogger.php | 240 - .../ActionScheduler_wpPostStore.php | 1088 - ...eduler_wpPostStore_PostStatusRegistrar.php | 58 - ...cheduler_wpPostStore_PostTypeRegistrar.php | 50 - ...cheduler_wpPostStore_TaxonomyRegistrar.php | 26 - .../classes/migration/ActionMigrator.php | 109 - .../ActionScheduler_DBStoreMigrator.php | 47 - .../classes/migration/BatchFetcher.php | 86 - .../classes/migration/Config.php | 168 - .../classes/migration/Controller.php | 226 - .../migration/DryRun_ActionMigrator.php | 28 - .../classes/migration/DryRun_LogMigrator.php | 23 - .../classes/migration/LogMigrator.php | 49 - .../classes/migration/Runner.php | 136 - .../classes/migration/Scheduler.php | 128 - .../ActionScheduler_CanceledSchedule.php | 57 - .../ActionScheduler_CronSchedule.php | 102 - .../ActionScheduler_IntervalSchedule.php | 81 - .../ActionScheduler_NullSchedule.php | 31 - .../schedules/ActionScheduler_Schedule.php | 18 - .../ActionScheduler_SimpleSchedule.php | 71 - .../schema/ActionScheduler_LoggerSchema.php | 90 - .../schema/ActionScheduler_StoreSchema.php | 130 - ...eduler_Abstract_QueueRunner_Deprecated.php | 27 - .../ActionScheduler_AdminView_Deprecated.php | 147 - .../ActionScheduler_Schedule_Deprecated.php | 29 - .../ActionScheduler_Store_Deprecated.php | 49 - .../action-scheduler/deprecated/functions.php | 126 - .../action-scheduler/functions.php | 492 - .../action-scheduler/lib/WP_Async_Request.php | 191 - .../lib/cron-expression/CronExpression.php | 318 - .../CronExpression_AbstractField.php | 100 - .../CronExpression_DayOfMonthField.php | 110 - .../CronExpression_DayOfWeekField.php | 124 - .../CronExpression_FieldFactory.php | 55 - .../CronExpression_FieldInterface.php | 39 - .../CronExpression_HoursField.php | 47 - .../CronExpression_MinutesField.php | 39 - .../CronExpression_MonthField.php | 55 - .../CronExpression_YearField.php | 43 - .../plugin-update-checker/Puc/v4/Factory.php | 6 - .../Puc/v4p11/Autoloader.php | 63 - .../Puc/v4p11/DebugBar/Extension.php | 190 - .../Puc/v4p11/DebugBar/Panel.php | 165 - .../Puc/v4p11/DebugBar/PluginExtension.php | 33 - .../Puc/v4p11/DebugBar/PluginPanel.php | 38 - .../Puc/v4p11/DebugBar/ThemePanel.php | 21 - .../Puc/v4p11/Factory.php | 365 - .../Puc/v4p11/InstalledPackage.php | 103 - .../Puc/v4p11/Metadata.php | 132 - .../Puc/v4p11/OAuthSignature.php | 100 - .../Puc/v4p11/Plugin/Info.php | 132 - .../Puc/v4p11/Plugin/Package.php | 184 - .../Puc/v4p11/Plugin/Ui.php | 278 - .../Puc/v4p11/Plugin/Update.php | 112 - .../Puc/v4p11/Plugin/UpdateChecker.php | 414 - .../Puc/v4p11/Scheduler.php | 266 - .../Puc/v4p11/StateStore.php | 207 - .../Puc/v4p11/Theme/Package.php | 65 - .../Puc/v4p11/Theme/Update.php | 84 - .../Puc/v4p11/Theme/UpdateChecker.php | 152 - .../Puc/v4p11/Update.php | 34 - .../Puc/v4p11/UpdateChecker.php | 997 - .../Puc/v4p11/UpgraderStatus.php | 199 - .../plugin-update-checker/Puc/v4p11/Utils.php | 69 - .../Puc/v4p11/Vcs/Api.php | 302 - .../Puc/v4p11/Vcs/BaseChecker.php | 27 - .../Puc/v4p11/Vcs/BitBucketApi.php | 265 - .../Puc/v4p11/Vcs/GitHubApi.php | 441 - .../Puc/v4p11/Vcs/GitLabApi.php | 309 - .../Puc/v4p11/Vcs/PluginUpdateChecker.php | 218 - .../Puc/v4p11/Vcs/Reference.php | 49 - .../Puc/v4p11/Vcs/ThemeUpdateChecker.php | 118 - .../css/puc-debug-bar.css | 70 - .../plugin-update-checker/js/debug-bar.js | 52 - .../plugin-update-checker/load-v4p11.php | 28 - .../plugin-update-checker.php | 10 - .../vendor/Parsedown.php | 9 - .../vendor/ParsedownLegacy.php | 1535 - .../vendor/ParsedownModern.php | 1538 - .../vendor/PucReadmeParser.php | 348 - .../class-checkout-form-edit-admin-page.php | 2 +- inc/checkout/class-cart.php | 2 +- inc/checkout/class-checkout.php | 2 +- inc/class-ajax.php | 2 +- inc/class-async-calls.php | 22 +- inc/class-autoloader.php | 2 +- inc/class-dashboard-widgets.php | 2 +- inc/class-logger.php | 4 +- inc/class-session-cookie.php | 2 +- inc/class-sunrise.php | 2 +- inc/database/engine/class-base.php | 2 +- inc/database/engine/class-column.php | 2 +- inc/database/engine/class-compare.php | 2 +- inc/database/engine/class-date.php | 2 +- inc/database/engine/class-meta.php | 2 +- inc/database/engine/class-query.php | 2 +- inc/database/engine/class-row.php | 2 +- inc/database/engine/class-schema.php | 2 +- inc/database/engine/class-table.php | 2 +- inc/deprecated/deprecated.php | 2 +- inc/domain-mapping/class-helper.php | 4 +- inc/duplication/data.php | 2 +- inc/functions/color.php | 4 +- inc/functions/date.php | 4 +- inc/functions/helper.php | 2 +- inc/functions/reflection.php | 2 +- inc/gateways/class-base-stripe-gateway.php | 6 +- .../class-stripe-checkout-gateway.php | 2 +- inc/gateways/class-stripe-gateway.php | 2 +- inc/helpers/class-hash.php | 2 +- inc/helpers/class-screenshot.php | 2 +- inc/helpers/class-site-duplicator.php | 2 +- inc/helpers/class-validator.php | 2 +- .../validation-rules/class-checkout-steps.php | 4 +- inc/helpers/validation-rules/class-city.php | 2 +- .../validation-rules/class-country.php | 2 +- inc/helpers/validation-rules/class-domain.php | 2 +- inc/helpers/validation-rules/class-exists.php | 2 +- .../class-price-variations.php | 2 +- .../validation-rules/class-products.php | 2 +- .../validation-rules/class-site-template.php | 2 +- inc/helpers/validation-rules/class-state.php | 2 +- .../validation-rules/class-unique-site.php | 2 +- inc/helpers/validation-rules/class-unique.php | 2 +- inc/installers/class-migrator.php | 4 +- .../class-cloudflare-host-provider.php | 2 +- .../class-cloudways-host-provider.php | 2 +- .../class-cpanel-host-provider.php | 2 +- .../class-runcloud-host-provider.php | 2 +- .../class-serverpilot-host-provider.php | 2 +- .../class-wpmudev-host-provider.php | 2 +- inc/invoices/class-invoice.php | 4 +- inc/limitations/class-limit-plugins.php | 2 +- inc/managers/class-domain-manager.php | 10 +- inc/managers/class-email-manager.php | 2 +- inc/managers/class-gateway-manager.php | 2 +- inc/managers/class-limitation-manager.php | 2 +- inc/managers/class-membership-manager.php | 2 +- inc/models/class-checkout-form.php | 2 +- inc/models/class-site.php | 2 +- inc/sso/auth-functions.php | 2 +- inc/sso/class-sso-broker.php | 2 +- inc/sso/class-sso-session-handler.php | 4 +- inc/sso/class-sso.php | 16 +- inc/tax/class-tax.php | 2 +- inc/ui/class-checkout-element.php | 2 +- inc/ui/class-template-switching-element.php | 2 +- ...erlindb-core-src-database-column-php.patch | 26 + ...berlindb-core-src-database-query-php.patch | 11 + .../jasny-sso-src-broker-cookies-php.patch | 32 + wp-multisite-waas.php | 2 + 3479 files changed, 4128 insertions(+), 379511 deletions(-) delete mode 100644 dependencies/amphp/amp/lib/CallableMaker.php delete mode 100644 dependencies/amphp/amp/lib/CancellationToken.php delete mode 100644 dependencies/amphp/amp/lib/CancellationTokenSource.php delete mode 100644 dependencies/amphp/amp/lib/CancelledException.php delete mode 100644 dependencies/amphp/amp/lib/Coroutine.php delete mode 100644 dependencies/amphp/amp/lib/Deferred.php delete mode 100644 dependencies/amphp/amp/lib/Delayed.php delete mode 100644 dependencies/amphp/amp/lib/Emitter.php delete mode 100644 dependencies/amphp/amp/lib/Failure.php delete mode 100644 dependencies/amphp/amp/lib/Internal/Placeholder.php delete mode 100644 dependencies/amphp/amp/lib/Internal/PrivateIterator.php delete mode 100644 dependencies/amphp/amp/lib/Internal/PrivatePromise.php delete mode 100644 dependencies/amphp/amp/lib/Internal/Producer.php delete mode 100644 dependencies/amphp/amp/lib/Internal/ResolutionQueue.php delete mode 100644 dependencies/amphp/amp/lib/Internal/functions.php delete mode 100644 dependencies/amphp/amp/lib/InvalidYieldError.php delete mode 100644 dependencies/amphp/amp/lib/Iterator.php delete mode 100644 dependencies/amphp/amp/lib/LazyPromise.php delete mode 100644 dependencies/amphp/amp/lib/Loop.php delete mode 100644 dependencies/amphp/amp/lib/Loop/Driver.php delete mode 100644 dependencies/amphp/amp/lib/Loop/DriverFactory.php delete mode 100644 dependencies/amphp/amp/lib/Loop/EvDriver.php delete mode 100644 dependencies/amphp/amp/lib/Loop/EventDriver.php delete mode 100644 dependencies/amphp/amp/lib/Loop/Internal/TimerQueue.php delete mode 100644 dependencies/amphp/amp/lib/Loop/InvalidWatcherError.php delete mode 100644 dependencies/amphp/amp/lib/Loop/NativeDriver.php delete mode 100644 dependencies/amphp/amp/lib/Loop/TracingDriver.php delete mode 100644 dependencies/amphp/amp/lib/Loop/UnsupportedFeatureException.php delete mode 100644 dependencies/amphp/amp/lib/Loop/UvDriver.php delete mode 100644 dependencies/amphp/amp/lib/Loop/Watcher.php delete mode 100644 dependencies/amphp/amp/lib/MultiReasonException.php delete mode 100644 dependencies/amphp/amp/lib/NullCancellationToken.php delete mode 100644 dependencies/amphp/amp/lib/Producer.php delete mode 100644 dependencies/amphp/amp/lib/Promise.php delete mode 100644 dependencies/amphp/amp/lib/Struct.php delete mode 100644 dependencies/amphp/amp/lib/Success.php delete mode 100644 dependencies/amphp/amp/lib/TimeoutCancellationToken.php delete mode 100644 dependencies/amphp/amp/lib/TimeoutException.php delete mode 100644 dependencies/amphp/amp/lib/functions.php delete mode 100644 dependencies/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/ClosedException.php delete mode 100644 dependencies/amphp/byte-stream/lib/InMemoryStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/InputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/InputStreamChain.php delete mode 100644 dependencies/amphp/byte-stream/lib/IteratorStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/LineReader.php delete mode 100644 dependencies/amphp/byte-stream/lib/Message.php delete mode 100644 dependencies/amphp/byte-stream/lib/OutputBuffer.php delete mode 100644 dependencies/amphp/byte-stream/lib/OutputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/Payload.php delete mode 100644 dependencies/amphp/byte-stream/lib/PendingReadError.php delete mode 100644 dependencies/amphp/byte-stream/lib/ResourceInputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/ResourceOutputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/StreamException.php delete mode 100644 dependencies/amphp/byte-stream/lib/ZlibInputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/ZlibOutputStream.php delete mode 100644 dependencies/amphp/byte-stream/lib/functions.php delete mode 100644 dependencies/amphp/byte-stream/psalm.xml delete mode 100644 dependencies/amphp/cache/lib/ArrayCache.php delete mode 100644 dependencies/amphp/cache/lib/AtomicCache.php delete mode 100644 dependencies/amphp/cache/lib/Cache.php delete mode 100644 dependencies/amphp/cache/lib/CacheException.php delete mode 100644 dependencies/amphp/cache/lib/FileCache.php delete mode 100644 dependencies/amphp/cache/lib/NullCache.php delete mode 100644 dependencies/amphp/cache/lib/PrefixCache.php delete mode 100644 dependencies/amphp/cache/lib/SerializedCache.php delete mode 100644 dependencies/amphp/cache/psalm.xml delete mode 100644 dependencies/amphp/dns/appveyor.yml delete mode 100644 dependencies/amphp/dns/lib/BlockingFallbackResolver.php delete mode 100644 dependencies/amphp/dns/lib/Config.php delete mode 100644 dependencies/amphp/dns/lib/ConfigException.php delete mode 100644 dependencies/amphp/dns/lib/ConfigLoader.php delete mode 100644 dependencies/amphp/dns/lib/DnsException.php delete mode 100644 dependencies/amphp/dns/lib/HostLoader.php delete mode 100644 dependencies/amphp/dns/lib/Internal/Socket.php delete mode 100644 dependencies/amphp/dns/lib/Internal/TcpSocket.php delete mode 100644 dependencies/amphp/dns/lib/Internal/UdpSocket.php delete mode 100644 dependencies/amphp/dns/lib/InvalidNameException.php delete mode 100644 dependencies/amphp/dns/lib/NoRecordException.php delete mode 100644 dependencies/amphp/dns/lib/Record.php delete mode 100644 dependencies/amphp/dns/lib/Resolver.php delete mode 100644 dependencies/amphp/dns/lib/Rfc1035StubResolver.php delete mode 100644 dependencies/amphp/dns/lib/TimeoutException.php delete mode 100644 dependencies/amphp/dns/lib/UnixConfigLoader.php delete mode 100644 dependencies/amphp/dns/lib/WindowsConfigLoader.php delete mode 100644 dependencies/amphp/dns/lib/functions.php delete mode 100644 dependencies/amphp/hpack/src/HPack.php delete mode 100644 dependencies/amphp/hpack/src/HPackException.php delete mode 100644 dependencies/amphp/hpack/src/Internal/HPackNative.php delete mode 100644 dependencies/amphp/hpack/src/Internal/HPackNghttp2.php delete mode 100644 dependencies/amphp/hpack/src/Internal/amp-hpack.h delete mode 100644 dependencies/amphp/hpack/src/Internal/huffman-codes.php delete mode 100644 dependencies/amphp/hpack/src/Internal/huffman-lookup.php delete mode 100644 dependencies/amphp/hpack/tools/compress.php delete mode 100644 dependencies/amphp/hpack/tools/php-fuzzer/decode-crash.php delete mode 100644 dependencies/amphp/hpack/tools/php-fuzzer/decode-oracle.php delete mode 100644 dependencies/amphp/hpack/tools/php-fuzzer/decode.php delete mode 100644 dependencies/amphp/http-client/psalm.xml delete mode 100644 dependencies/amphp/http-client/src/ApplicationInterceptor.php delete mode 100644 dependencies/amphp/http-client/src/Body/FileBody.php delete mode 100644 dependencies/amphp/http-client/src/Body/FormBody.php delete mode 100644 dependencies/amphp/http-client/src/Body/JsonBody.php delete mode 100644 dependencies/amphp/http-client/src/Body/StringBody.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Connection.php delete mode 100644 dependencies/amphp/http-client/src/Connection/ConnectionFactory.php delete mode 100644 dependencies/amphp/http-client/src/Connection/ConnectionLimitingPool.php delete mode 100644 dependencies/amphp/http-client/src/Connection/ConnectionPool.php delete mode 100644 dependencies/amphp/http-client/src/Connection/DefaultConnectionFactory.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Http1Connection.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Http2Connection.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Http2ConnectionException.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Http2StreamException.php delete mode 100644 dependencies/amphp/http-client/src/Connection/HttpStream.php delete mode 100644 dependencies/amphp/http-client/src/Connection/InterceptedStream.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Internal/Http1Parser.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Internal/Http2ConnectionProcessor.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Internal/Http2Stream.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Internal/RequestNormalizer.php delete mode 100644 dependencies/amphp/http-client/src/Connection/LimitedConnectionPool.php delete mode 100644 dependencies/amphp/http-client/src/Connection/Stream.php delete mode 100644 dependencies/amphp/http-client/src/Connection/StreamLimitingPool.php delete mode 100644 dependencies/amphp/http-client/src/Connection/UnlimitedConnectionPool.php delete mode 100644 dependencies/amphp/http-client/src/Connection/UnprocessedRequestException.php delete mode 100644 dependencies/amphp/http-client/src/Connection/UpgradedSocket.php delete mode 100644 dependencies/amphp/http-client/src/DelegateHttpClient.php delete mode 100644 dependencies/amphp/http-client/src/EventListener.php delete mode 100644 dependencies/amphp/http-client/src/EventListener/RecordHarAttributes.php delete mode 100644 dependencies/amphp/http-client/src/HttpClient.php delete mode 100644 dependencies/amphp/http-client/src/HttpClientBuilder.php delete mode 100644 dependencies/amphp/http-client/src/HttpException.php delete mode 100644 dependencies/amphp/http-client/src/InterceptedHttpClient.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/AddRequestHeader.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/AddResponseHeader.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/DecompressResponse.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/FollowRedirects.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/ForbidUriUserInfo.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/LogHttpArchive.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/MatchOrigin.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/ModifyRequest.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/ModifyResponse.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/RemoveRequestHeader.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/RemoveResponseHeader.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/RetryRequests.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/SetRequestHeader.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/SetRequestHeaderIfUnset.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/SetRequestTimeout.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/SetResponseHeader.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/SetResponseHeaderIfUnset.php delete mode 100644 dependencies/amphp/http-client/src/Interceptor/TooManyRedirectsException.php delete mode 100644 dependencies/amphp/http-client/src/Internal/ForbidCloning.php delete mode 100644 dependencies/amphp/http-client/src/Internal/ForbidSerialization.php delete mode 100644 dependencies/amphp/http-client/src/Internal/HarAttributes.php delete mode 100644 dependencies/amphp/http-client/src/Internal/ResponseBodyStream.php delete mode 100644 dependencies/amphp/http-client/src/Internal/SizeLimitingInputStream.php delete mode 100644 dependencies/amphp/http-client/src/Internal/functions.php delete mode 100644 dependencies/amphp/http-client/src/InvalidRequestException.php delete mode 100644 dependencies/amphp/http-client/src/MissingAttributeError.php delete mode 100644 dependencies/amphp/http-client/src/NetworkInterceptor.php delete mode 100644 dependencies/amphp/http-client/src/ParseException.php delete mode 100644 dependencies/amphp/http-client/src/PooledHttpClient.php delete mode 100644 dependencies/amphp/http-client/src/Request.php delete mode 100644 dependencies/amphp/http-client/src/RequestBody.php delete mode 100644 dependencies/amphp/http-client/src/Response.php delete mode 100644 dependencies/amphp/http-client/src/SocketException.php delete mode 100644 dependencies/amphp/http-client/src/TimeoutException.php delete mode 100644 dependencies/amphp/http-client/src/Trailers.php delete mode 100644 dependencies/amphp/http/src/Cookie/CookieAttributes.php delete mode 100644 dependencies/amphp/http/src/Cookie/InvalidCookieException.php delete mode 100644 dependencies/amphp/http/src/Cookie/RequestCookie.php delete mode 100644 dependencies/amphp/http/src/Cookie/ResponseCookie.php delete mode 100644 dependencies/amphp/http/src/Http2/Http2ConnectionException.php delete mode 100644 dependencies/amphp/http/src/Http2/Http2Parser.php delete mode 100644 dependencies/amphp/http/src/Http2/Http2Processor.php delete mode 100644 dependencies/amphp/http/src/Http2/Http2StreamException.php delete mode 100644 dependencies/amphp/http/src/InvalidHeaderException.php delete mode 100644 dependencies/amphp/http/src/Message.php delete mode 100644 dependencies/amphp/http/src/Rfc7230.php delete mode 100644 dependencies/amphp/http/src/Status.php delete mode 100644 dependencies/amphp/http/src/functions.php delete mode 100644 dependencies/amphp/parser/psalm.xml delete mode 100644 dependencies/amphp/parser/src/InvalidDelimiterError.php delete mode 100644 dependencies/amphp/parser/src/Parser.php delete mode 100644 dependencies/amphp/process/lib/Internal/Posix/Handle.php delete mode 100644 dependencies/amphp/process/lib/Internal/Posix/Runner.php delete mode 100644 dependencies/amphp/process/lib/Internal/ProcessHandle.php delete mode 100644 dependencies/amphp/process/lib/Internal/ProcessRunner.php delete mode 100644 dependencies/amphp/process/lib/Internal/ProcessStatus.php delete mode 100644 dependencies/amphp/process/lib/Internal/Windows/Handle.php delete mode 100644 dependencies/amphp/process/lib/Internal/Windows/HandshakeStatus.php delete mode 100644 dependencies/amphp/process/lib/Internal/Windows/PendingSocketClient.php delete mode 100644 dependencies/amphp/process/lib/Internal/Windows/Runner.php delete mode 100644 dependencies/amphp/process/lib/Internal/Windows/SignalCode.php delete mode 100644 dependencies/amphp/process/lib/Internal/Windows/SocketConnector.php delete mode 100644 dependencies/amphp/process/lib/Process.php delete mode 100644 dependencies/amphp/process/lib/ProcessException.php delete mode 100644 dependencies/amphp/process/lib/ProcessInputStream.php delete mode 100644 dependencies/amphp/process/lib/ProcessOutputStream.php delete mode 100644 dependencies/amphp/process/lib/StatusError.php delete mode 100644 dependencies/amphp/process/lib/functions.php delete mode 100644 dependencies/amphp/serialization/src/CompressingSerializer.php delete mode 100644 dependencies/amphp/serialization/src/JsonSerializer.php delete mode 100644 dependencies/amphp/serialization/src/NativeSerializer.php delete mode 100644 dependencies/amphp/serialization/src/PassthroughSerializer.php delete mode 100644 dependencies/amphp/serialization/src/SerializationException.php delete mode 100644 dependencies/amphp/serialization/src/Serializer.php delete mode 100644 dependencies/amphp/serialization/src/functions.php delete mode 100644 dependencies/amphp/socket/psalm.xml delete mode 100644 dependencies/amphp/socket/src/BindContext.php delete mode 100644 dependencies/amphp/socket/src/Certificate.php delete mode 100644 dependencies/amphp/socket/src/ClientTlsContext.php delete mode 100644 dependencies/amphp/socket/src/ConnectContext.php delete mode 100644 dependencies/amphp/socket/src/ConnectException.php delete mode 100644 dependencies/amphp/socket/src/Connector.php delete mode 100644 dependencies/amphp/socket/src/DatagramSocket.php delete mode 100644 dependencies/amphp/socket/src/DnsConnector.php delete mode 100644 dependencies/amphp/socket/src/EncryptableSocket.php delete mode 100644 dependencies/amphp/socket/src/Internal/functions.php delete mode 100644 dependencies/amphp/socket/src/PendingAcceptError.php delete mode 100644 dependencies/amphp/socket/src/PendingReceiveError.php delete mode 100644 dependencies/amphp/socket/src/ResourceSocket.php delete mode 100644 dependencies/amphp/socket/src/Server.php delete mode 100644 dependencies/amphp/socket/src/ServerTlsContext.php delete mode 100644 dependencies/amphp/socket/src/Socket.php delete mode 100644 dependencies/amphp/socket/src/SocketAddress.php delete mode 100644 dependencies/amphp/socket/src/SocketException.php delete mode 100644 dependencies/amphp/socket/src/SocketPool.php delete mode 100644 dependencies/amphp/socket/src/StaticConnector.php delete mode 100644 dependencies/amphp/socket/src/TlsException.php delete mode 100644 dependencies/amphp/socket/src/TlsInfo.php delete mode 100644 dependencies/amphp/socket/src/UnlimitedSocketPool.php delete mode 100644 dependencies/amphp/socket/src/functions.php delete mode 100644 dependencies/amphp/sync/composer-require-check.json delete mode 100644 dependencies/amphp/sync/src/Barrier.php delete mode 100644 dependencies/amphp/sync/src/ConcurrentIterator/functions.php delete mode 100644 dependencies/amphp/sync/src/FileMutex.php delete mode 100644 dependencies/amphp/sync/src/Internal/MutexStorage.php delete mode 100644 dependencies/amphp/sync/src/Internal/SemaphoreStorage.php delete mode 100644 dependencies/amphp/sync/src/KeyedMutex.php delete mode 100644 dependencies/amphp/sync/src/KeyedSemaphore.php delete mode 100644 dependencies/amphp/sync/src/LocalKeyedMutex.php delete mode 100644 dependencies/amphp/sync/src/LocalKeyedSemaphore.php delete mode 100644 dependencies/amphp/sync/src/LocalMutex.php delete mode 100644 dependencies/amphp/sync/src/LocalSemaphore.php delete mode 100644 dependencies/amphp/sync/src/Lock.php delete mode 100644 dependencies/amphp/sync/src/Mutex.php delete mode 100644 dependencies/amphp/sync/src/PosixSemaphore.php delete mode 100644 dependencies/amphp/sync/src/PrefixedKeyedMutex.php delete mode 100644 dependencies/amphp/sync/src/PrefixedKeyedSemaphore.php delete mode 100644 dependencies/amphp/sync/src/Semaphore.php delete mode 100644 dependencies/amphp/sync/src/SemaphoreMutex.php delete mode 100644 dependencies/amphp/sync/src/StaticKeyMutex.php delete mode 100644 dependencies/amphp/sync/src/SyncException.php delete mode 100644 dependencies/amphp/sync/src/ThreadedMutex.php delete mode 100644 dependencies/amphp/sync/src/ThreadedSemaphore.php delete mode 100644 dependencies/amphp/sync/src/functions.php delete mode 100644 dependencies/amphp/windows-registry/lib/KeyNotFoundException.php delete mode 100644 dependencies/amphp/windows-registry/lib/WindowsRegistry.php delete mode 100644 dependencies/autoload.php delete mode 100644 dependencies/berlindb/core/autoloader.php delete mode 100644 dependencies/berlindb/core/src/Database/Base.php delete mode 100644 dependencies/berlindb/core/src/Database/Column.php delete mode 100644 dependencies/berlindb/core/src/Database/Queries/Compare.php delete mode 100644 dependencies/berlindb/core/src/Database/Queries/Date.php delete mode 100644 dependencies/berlindb/core/src/Database/Queries/Meta.php delete mode 100644 dependencies/berlindb/core/src/Database/Query.php delete mode 100644 dependencies/berlindb/core/src/Database/Row.php delete mode 100644 dependencies/berlindb/core/src/Database/Schema.php delete mode 100644 dependencies/berlindb/core/src/Database/Table.php delete mode 100644 dependencies/composer/ClassLoader.php delete mode 100644 dependencies/composer/InstalledVersions.php delete mode 100644 dependencies/composer/LICENSE delete mode 100644 dependencies/composer/autoload_classmap.php delete mode 100644 dependencies/composer/autoload_files.php delete mode 100644 dependencies/composer/autoload_namespaces.php delete mode 100644 dependencies/composer/autoload_psr4.php delete mode 100644 dependencies/composer/autoload_real.php delete mode 100644 dependencies/composer/autoload_static.php delete mode 100644 dependencies/composer/installed.json delete mode 100644 dependencies/composer/installed.php delete mode 100644 dependencies/daverandom/libdns/src/Decoder/Decoder.php delete mode 100644 dependencies/daverandom/libdns/src/Decoder/DecoderFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Decoder/DecodingContext.php delete mode 100644 dependencies/daverandom/libdns/src/Decoder/DecodingContextFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Encoder/Encoder.php delete mode 100644 dependencies/daverandom/libdns/src/Encoder/EncoderFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Encoder/EncodingContext.php delete mode 100644 dependencies/daverandom/libdns/src/Encoder/EncodingContextFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Enumeration.php delete mode 100644 dependencies/daverandom/libdns/src/Messages/Message.php delete mode 100644 dependencies/daverandom/libdns/src/Messages/MessageFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Messages/MessageOpCodes.php delete mode 100644 dependencies/daverandom/libdns/src/Messages/MessageResponseCodes.php delete mode 100644 dependencies/daverandom/libdns/src/Messages/MessageTypes.php delete mode 100644 dependencies/daverandom/libdns/src/Packets/LabelRegistry.php delete mode 100644 dependencies/daverandom/libdns/src/Packets/Packet.php delete mode 100644 dependencies/daverandom/libdns/src/Packets/PacketFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Question.php delete mode 100644 dependencies/daverandom/libdns/src/Records/QuestionFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/RData.php delete mode 100644 dependencies/daverandom/libdns/src/Records/RDataBuilder.php delete mode 100644 dependencies/daverandom/libdns/src/Records/RDataFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Record.php delete mode 100644 dependencies/daverandom/libdns/src/Records/RecordCollection.php delete mode 100644 dependencies/daverandom/libdns/src/Records/RecordCollectionFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/RecordTypes.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Resource.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceBuilder.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceBuilderFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceClasses.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceQClasses.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceQTypes.php delete mode 100644 dependencies/daverandom/libdns/src/Records/ResourceTypes.php delete mode 100644 dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinition.php delete mode 100644 dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinitionFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinition.php delete mode 100644 dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManager.php delete mode 100644 dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManagerFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/Anything.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/BitMap.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/Char.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/CharacterString.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/DomainName.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/IPv4Address.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/IPv6Address.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/Long.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/Short.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/Type.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/TypeBuilder.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/TypeFactory.php delete mode 100644 dependencies/daverandom/libdns/src/Records/Types/Types.php delete mode 100644 dependencies/daverandom/libdns/src/functions.php delete mode 100644 dependencies/daverandom/libdns/tools/autoload_generator.php delete mode 100644 dependencies/delight-im/cookie/src/Cookie.php delete mode 100644 dependencies/delight-im/cookie/src/Session.php delete mode 100644 dependencies/delight-im/http/src/ResponseHeader.php delete mode 100644 dependencies/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php delete mode 100644 dependencies/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/BodySummarizer.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/BodySummarizerInterface.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Client.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/ClientInterface.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/ClientTrait.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Cookie/CookieJar.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Cookie/SetCookie.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/BadResponseException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/ClientException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/ConnectException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/GuzzleException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/RequestException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/ServerException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Exception/TransferException.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/CurlFactory.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/CurlHandler.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/EasyHandle.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/MockHandler.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/Proxy.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Handler/StreamHandler.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/HandlerStack.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/MessageFormatter.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/MessageFormatterInterface.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Middleware.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Pool.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/RedirectMiddleware.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/RequestOptions.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/RetryMiddleware.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/TransferStats.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/Utils.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/functions.php delete mode 100644 dependencies/guzzlehttp/guzzle/src/functions_include.php delete mode 100644 dependencies/guzzlehttp/promises/src/AggregateException.php delete mode 100644 dependencies/guzzlehttp/promises/src/CancellationException.php delete mode 100644 dependencies/guzzlehttp/promises/src/Coroutine.php delete mode 100644 dependencies/guzzlehttp/promises/src/Create.php delete mode 100644 dependencies/guzzlehttp/promises/src/Each.php delete mode 100644 dependencies/guzzlehttp/promises/src/EachPromise.php delete mode 100644 dependencies/guzzlehttp/promises/src/FulfilledPromise.php delete mode 100644 dependencies/guzzlehttp/promises/src/Is.php delete mode 100644 dependencies/guzzlehttp/promises/src/Promise.php delete mode 100644 dependencies/guzzlehttp/promises/src/PromiseInterface.php delete mode 100644 dependencies/guzzlehttp/promises/src/PromisorInterface.php delete mode 100644 dependencies/guzzlehttp/promises/src/RejectedPromise.php delete mode 100644 dependencies/guzzlehttp/promises/src/RejectionException.php delete mode 100644 dependencies/guzzlehttp/promises/src/TaskQueue.php delete mode 100644 dependencies/guzzlehttp/promises/src/TaskQueueInterface.php delete mode 100644 dependencies/guzzlehttp/promises/src/Utils.php delete mode 100644 dependencies/guzzlehttp/promises/src/functions.php delete mode 100644 dependencies/guzzlehttp/promises/src/functions_include.php delete mode 100644 dependencies/guzzlehttp/psr7/src/AppendStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/BufferStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/CachingStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/DroppingStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Exception/MalformedUriException.php delete mode 100644 dependencies/guzzlehttp/psr7/src/FnStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Header.php delete mode 100644 dependencies/guzzlehttp/psr7/src/HttpFactory.php delete mode 100644 dependencies/guzzlehttp/psr7/src/InflateStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/LazyOpenStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/LimitStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Message.php delete mode 100644 dependencies/guzzlehttp/psr7/src/MessageTrait.php delete mode 100644 dependencies/guzzlehttp/psr7/src/MimeType.php delete mode 100644 dependencies/guzzlehttp/psr7/src/MultipartStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/NoSeekStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/PumpStream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Query.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Request.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Response.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Rfc7230.php delete mode 100644 dependencies/guzzlehttp/psr7/src/ServerRequest.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Stream.php delete mode 100644 dependencies/guzzlehttp/psr7/src/StreamDecoratorTrait.php delete mode 100644 dependencies/guzzlehttp/psr7/src/StreamWrapper.php delete mode 100644 dependencies/guzzlehttp/psr7/src/UploadedFile.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Uri.php delete mode 100644 dependencies/guzzlehttp/psr7/src/UriComparator.php delete mode 100644 dependencies/guzzlehttp/psr7/src/UriNormalizer.php delete mode 100644 dependencies/guzzlehttp/psr7/src/UriResolver.php delete mode 100644 dependencies/guzzlehttp/psr7/src/Utils.php delete mode 100644 dependencies/hashids/hashids/src/Hashids.php delete mode 100644 dependencies/hashids/hashids/src/HashidsException.php delete mode 100644 dependencies/hashids/hashids/src/HashidsInterface.php delete mode 100644 dependencies/hashids/hashids/src/Math/Bc.php delete mode 100644 dependencies/hashids/hashids/src/Math/Gmp.php delete mode 100644 dependencies/hashids/hashids/src/Math/MathInterface.php delete mode 100644 dependencies/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php delete mode 100644 dependencies/jasny/immutable/phpcs.xml delete mode 100644 dependencies/jasny/immutable/phpstan.neon delete mode 100644 dependencies/jasny/immutable/src/NoDynamicProperties.php delete mode 100644 dependencies/jasny/immutable/src/With.php delete mode 100644 dependencies/jasny/sso/codeception.yml delete mode 100644 dependencies/jasny/sso/phpcs.xml delete mode 100644 dependencies/jasny/sso/src/Broker/Broker.php delete mode 100644 dependencies/jasny/sso/src/Broker/Cookies.php delete mode 100644 dependencies/jasny/sso/src/Broker/Curl.php delete mode 100644 dependencies/jasny/sso/src/Broker/NotAttachedException.php delete mode 100644 dependencies/jasny/sso/src/Broker/RequestException.php delete mode 100644 dependencies/jasny/sso/src/Broker/Session.php delete mode 100644 dependencies/jasny/sso/src/Server/BrokerException.php delete mode 100644 dependencies/jasny/sso/src/Server/ExceptionInterface.php delete mode 100644 dependencies/jasny/sso/src/Server/GlobalSession.php delete mode 100644 dependencies/jasny/sso/src/Server/Server.php delete mode 100644 dependencies/jasny/sso/src/Server/ServerException.php delete mode 100644 dependencies/jasny/sso/src/Server/SessionInterface.php delete mode 100644 dependencies/kelunik/certificate/src/Certificate.php delete mode 100644 dependencies/kelunik/certificate/src/FieldNotSupportedException.php delete mode 100644 dependencies/kelunik/certificate/src/InvalidCertificateException.php delete mode 100644 dependencies/kelunik/certificate/src/Profile.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/AuthorityInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/DataPathInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/DomainHostInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/FragmentInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/HostInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/IpHostInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/PathInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/PortInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/QueryInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/SegmentedPathInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/UriAccess.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/UriComponentInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/UriException.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/UriInterface.php delete mode 100644 dependencies/league/uri-interfaces/Contracts/UserInfoInterface.php delete mode 100644 dependencies/league/uri-interfaces/Encoder.php delete mode 100644 dependencies/league/uri-interfaces/Exceptions/ConversionFailed.php delete mode 100644 dependencies/league/uri-interfaces/Exceptions/MissingFeature.php delete mode 100644 dependencies/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php delete mode 100644 dependencies/league/uri-interfaces/Exceptions/SyntaxError.php delete mode 100644 dependencies/league/uri-interfaces/FeatureDetection.php delete mode 100644 dependencies/league/uri-interfaces/IPv4/BCMathCalculator.php delete mode 100644 dependencies/league/uri-interfaces/IPv4/Calculator.php delete mode 100644 dependencies/league/uri-interfaces/IPv4/Converter.php delete mode 100644 dependencies/league/uri-interfaces/IPv4/GMPCalculator.php delete mode 100644 dependencies/league/uri-interfaces/IPv4/NativeCalculator.php delete mode 100644 dependencies/league/uri-interfaces/Idna/Converter.php delete mode 100644 dependencies/league/uri-interfaces/Idna/Error.php delete mode 100644 dependencies/league/uri-interfaces/Idna/Option.php delete mode 100644 dependencies/league/uri-interfaces/Idna/Result.php delete mode 100644 dependencies/league/uri-interfaces/KeyValuePair/Converter.php delete mode 100644 dependencies/league/uri-interfaces/QueryString.php delete mode 100644 dependencies/league/uri-interfaces/UriString.php delete mode 100644 dependencies/league/uri-parser/src/Exception.php delete mode 100644 dependencies/league/uri-parser/src/MissingIdnSupport.php delete mode 100644 dependencies/league/uri-parser/src/Parser.php delete mode 100644 dependencies/league/uri-parser/src/functions.php delete mode 100644 dependencies/league/uri-parser/src/functions_include.php delete mode 100644 dependencies/league/uri/BaseUri.php delete mode 100644 dependencies/league/uri/Http.php delete mode 100644 dependencies/league/uri/HttpFactory.php delete mode 100644 dependencies/league/uri/Uri.php delete mode 100644 dependencies/league/uri/UriInfo.php delete mode 100644 dependencies/league/uri/UriResolver.php delete mode 100644 dependencies/league/uri/UriTemplate.php delete mode 100644 dependencies/league/uri/UriTemplate/Expression.php delete mode 100644 dependencies/league/uri/UriTemplate/Operator.php delete mode 100644 dependencies/league/uri/UriTemplate/Template.php delete mode 100644 dependencies/league/uri/UriTemplate/TemplateCanNotBeExpanded.php delete mode 100644 dependencies/league/uri/UriTemplate/VarSpecifier.php delete mode 100644 dependencies/league/uri/UriTemplate/VariableBag.php delete mode 100644 dependencies/mexitek/phpcolors/demo/demo.php delete mode 100644 dependencies/mexitek/phpcolors/demo/phpColor-demo.png delete mode 100644 dependencies/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php delete mode 100644 dependencies/mpdf/mpdf/CREDITS.txt delete mode 100644 dependencies/mpdf/mpdf/data/CJKdata.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Afrikaans_South_Africa.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Albanian_Albania.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Alsatian_France.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Algeria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Bahrain.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Egypt.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Iraq.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Jordan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Kuwait.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Lebanon.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Libya.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Morocco.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Oman.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Pseudo_RTL.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Qatar.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Saudi_Arabia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Syria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Tunisia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Arabic_Yemen.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Azeri_(Cyrillic)_Azerbaijan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Azeri_(Latin)_Azerbaijan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Bashkir_Russia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Basque_Spain.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Belarusian_Belarus.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Bosnian_(Cyrillic)_Bosnia_and_Herzegovina.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Bosnian_(Latin)_Bosnia_and_Herzegovina.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Breton_France.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Bulgarian_Bulgaria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Catalan_Spain.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Corsican_France.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Croatian_(Latin)_Bosnia_and_Herzegovina.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Croatian_Croatia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Czech_Czech_Republic.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Danish_Denmark.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Dari_Afghanistan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Dutch_Belgium.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Dutch_Netherlands.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Australia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Belize.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Canada.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Caribbean.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_India.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Ireland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Jamaica.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Malaysia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_New_Zealand.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Republic_of_the_Philippines.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Singapore.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_South_Africa.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Trinidad_and_Tobago.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_United_Kingdom.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_United_States.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/English_Zimbabwe.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Estonian_Estonia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Faroese_Faroe_Islands.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Filipino_Philippines.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Finnish_Finland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/French_Belgium.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/French_Canada.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/French_France.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/French_Luxembourg.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/French_Principality_of_Monaco.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/French_Switzerland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Frisian_Netherlands.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Galician_Spain.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/German_Austria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/German_Germany.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/German_Liechtenstein.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/German_Luxembourg.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/German_Switzerland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Greek_Greece.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Greenlandic_Greenland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Hausa_(Latin)_Nigeria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Hebrew_Israel.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Hungarian_Hungary.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Icelandic_Iceland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Igbo_Nigeria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Indonesian_Indonesia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Inuktitut_(Latin)_Canada.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Invariant_Language_Invariant_Country.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Irish_Ireland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Italian_Italy.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Italian_Switzerland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Kinyarwanda_Rwanda.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Kiswahili_Kenya.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Kyrgyz_Kyrgyzstan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Latvian_Latvia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Lithuanian_Lithuania.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Lower_Sorbian_Germany.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Luxembourgish_Luxembourg.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Macedonian_(FYROM)_Macedonia_(FYROM).php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Malay_Brunei_Darussalam.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Malay_Malaysia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Mapudungun_Chile.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Mohawk_Canada.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Mongolian_(Cyrillic)_Mongolia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Norwegian_(Nynorsk)_Norway.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Occitan_France.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Persian_Iran.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Polish_Poland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Portuguese_Brazil.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Portuguese_Portugal.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Quechua_Bolivia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Quechua_Ecuador.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Quechua_Peru.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Romanian_Romania.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Romansh_Switzerland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Russian_Russia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Inari)_Finland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Norway.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Sweden.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Finland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Norway.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Sweden.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Skolt)_Finland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Norway.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Sweden.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Bosnia_and_Herzegovina.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Serbia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Bosnia_and_Herzegovina.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Serbia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Sesotho_sa_Leboa_South_Africa.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Setswana_South_Africa.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Slovak_Slovakia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Slovenian_Slovenia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Argentina.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Bolivia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Chile.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Colombia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Costa_Rica.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Dominican_Republic.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Ecuador.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_El_Salvador.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Guatemala.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Honduras.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Mexico.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Nicaragua.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Panama.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Paraguay.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Peru.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Puerto_Rico.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Spain.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_United_States.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Uruguay.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Spanish_Venezuela.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Swedish_Finland.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Swedish_Sweden.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Tajik_(Cyrillic)_Tajikistan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Tamazight_(Latin)_Algeria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Tatar_Russia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Turkish_Turkey.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Turkmen_Turkmenistan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Ukrainian_Ukraine.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Upper_Sorbian_Germany.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Urdu_Islamic_Republic_of_Pakistan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Uzbek_(Cyrillic)_Uzbekistan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Uzbek_(Latin)_Uzbekistan.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Vietnamese_Vietnam.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Welsh_United_Kingdom.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Wolof_Senegal.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Yakut_Russia.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/Yoruba_Nigeria.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/isiXhosa_South_Africa.php delete mode 100644 dependencies/mpdf/mpdf/data/collations/isiZulu_South_Africa.php delete mode 100644 dependencies/mpdf/mpdf/data/entity_substitutions.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ccourier.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ccourierb.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ccourierbi.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ccourieri.php delete mode 100644 dependencies/mpdf/mpdf/data/font/chelvetica.php delete mode 100644 dependencies/mpdf/mpdf/data/font/chelveticab.php delete mode 100644 dependencies/mpdf/mpdf/data/font/chelveticabi.php delete mode 100644 dependencies/mpdf/mpdf/data/font/chelveticai.php delete mode 100644 dependencies/mpdf/mpdf/data/font/csymbol.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ctimes.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ctimesb.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ctimesbi.php delete mode 100644 dependencies/mpdf/mpdf/data/font/ctimesi.php delete mode 100644 dependencies/mpdf/mpdf/data/font/czapfdingbats.php delete mode 100644 dependencies/mpdf/mpdf/data/iccprofiles/sRGB_IEC61966-2-1.icc delete mode 100644 dependencies/mpdf/mpdf/data/lang2fonts.css delete mode 100644 dependencies/mpdf/mpdf/data/linebrdictK.dat delete mode 100644 dependencies/mpdf/mpdf/data/linebrdictL.dat delete mode 100644 dependencies/mpdf/mpdf/data/linebrdictT.dat delete mode 100644 dependencies/mpdf/mpdf/data/mpdf.css delete mode 100644 dependencies/mpdf/mpdf/data/no_image.jpg delete mode 100644 dependencies/mpdf/mpdf/data/out.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/NOTES.txt delete mode 100644 dependencies/mpdf/mpdf/data/patterns/de.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/dictionary.txt delete mode 100644 dependencies/mpdf/mpdf/data/patterns/en.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/es.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/fi.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/fr.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/it.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/nl.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/pl.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/ru.php delete mode 100644 dependencies/mpdf/mpdf/data/patterns/sv.php delete mode 100644 dependencies/mpdf/mpdf/data/subs_core.php delete mode 100644 dependencies/mpdf/mpdf/data/subs_win-1252.php delete mode 100644 dependencies/mpdf/mpdf/data/upperCase.php delete mode 100644 dependencies/mpdf/mpdf/phpunit.xml delete mode 100644 dependencies/mpdf/mpdf/ruleset.xml delete mode 100644 dependencies/mpdf/mpdf/src/AssetFetcher.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/AbstractBarcode.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/BarcodeException.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/BarcodeInterface.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Codabar.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Code11.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Code128.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Code39.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Code93.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/EanExt.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/EanUpc.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/I25.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Imb.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Msi.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Postnet.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/Rm4Scc.php delete mode 100644 dependencies/mpdf/mpdf/src/Barcode/S25.php delete mode 100644 dependencies/mpdf/mpdf/src/Cache.php delete mode 100644 dependencies/mpdf/mpdf/src/Color/ColorConverter.php delete mode 100644 dependencies/mpdf/mpdf/src/Color/ColorModeConverter.php delete mode 100644 dependencies/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php delete mode 100644 dependencies/mpdf/mpdf/src/Color/NamedColors.php delete mode 100644 dependencies/mpdf/mpdf/src/Config/ConfigVariables.php delete mode 100644 dependencies/mpdf/mpdf/src/Config/FontVariables.php delete mode 100644 dependencies/mpdf/mpdf/src/Container/ContainerInterface.php delete mode 100644 dependencies/mpdf/mpdf/src/Container/NotFoundException.php delete mode 100644 dependencies/mpdf/mpdf/src/Container/SimpleContainer.php delete mode 100644 dependencies/mpdf/mpdf/src/Conversion/DecToAlpha.php delete mode 100644 dependencies/mpdf/mpdf/src/Conversion/DecToCjk.php delete mode 100644 dependencies/mpdf/mpdf/src/Conversion/DecToHebrew.php delete mode 100644 dependencies/mpdf/mpdf/src/Conversion/DecToOther.php delete mode 100644 dependencies/mpdf/mpdf/src/Conversion/DecToRoman.php delete mode 100644 dependencies/mpdf/mpdf/src/Css/Border.php delete mode 100644 dependencies/mpdf/mpdf/src/Css/DefaultCss.php delete mode 100644 dependencies/mpdf/mpdf/src/Css/TextVars.php delete mode 100644 dependencies/mpdf/mpdf/src/CssManager.php delete mode 100644 dependencies/mpdf/mpdf/src/DirectWrite.php delete mode 100644 dependencies/mpdf/mpdf/src/Exception/AssetFetchingException.php delete mode 100644 dependencies/mpdf/mpdf/src/Exception/FontException.php delete mode 100644 dependencies/mpdf/mpdf/src/Exception/InvalidArgumentException.php delete mode 100644 dependencies/mpdf/mpdf/src/File/LocalContentLoader.php delete mode 100644 dependencies/mpdf/mpdf/src/File/LocalContentLoaderInterface.php delete mode 100644 dependencies/mpdf/mpdf/src/File/StreamWrapperChecker.php delete mode 100644 dependencies/mpdf/mpdf/src/Fonts/FontCache.php delete mode 100644 dependencies/mpdf/mpdf/src/Fonts/FontFileFinder.php delete mode 100644 dependencies/mpdf/mpdf/src/Fonts/GlyphOperator.php delete mode 100644 dependencies/mpdf/mpdf/src/Fonts/MetricsGenerator.php delete mode 100644 dependencies/mpdf/mpdf/src/Form.php delete mode 100644 dependencies/mpdf/mpdf/src/FpdiTrait.php delete mode 100644 dependencies/mpdf/mpdf/src/Gif/ColorTable.php delete mode 100644 dependencies/mpdf/mpdf/src/Gif/FileHeader.php delete mode 100644 dependencies/mpdf/mpdf/src/Gif/Gif.php delete mode 100644 dependencies/mpdf/mpdf/src/Gif/Image.php delete mode 100644 dependencies/mpdf/mpdf/src/Gif/ImageHeader.php delete mode 100644 dependencies/mpdf/mpdf/src/Gif/Lzw.php delete mode 100644 dependencies/mpdf/mpdf/src/Gradient.php delete mode 100644 dependencies/mpdf/mpdf/src/HTMLParserMode.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/ClientInterface.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/CurlHttpClient.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/Exception/ClientException.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/Exception/NetworkException.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/Exception/RequestException.php delete mode 100644 dependencies/mpdf/mpdf/src/Http/SocketHttpClient.php delete mode 100644 dependencies/mpdf/mpdf/src/Hyphenator.php delete mode 100644 dependencies/mpdf/mpdf/src/Image/Bmp.php delete mode 100644 dependencies/mpdf/mpdf/src/Image/ImageProcessor.php delete mode 100644 dependencies/mpdf/mpdf/src/Image/ImageTypeGuesser.php delete mode 100644 dependencies/mpdf/mpdf/src/Image/Svg.php delete mode 100644 dependencies/mpdf/mpdf/src/Image/Wmf.php delete mode 100644 dependencies/mpdf/mpdf/src/Language/LanguageToFont.php delete mode 100644 dependencies/mpdf/mpdf/src/Language/LanguageToFontInterface.php delete mode 100644 dependencies/mpdf/mpdf/src/Language/ScriptToLanguage.php delete mode 100644 dependencies/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php delete mode 100644 dependencies/mpdf/mpdf/src/Log/Context.php delete mode 100644 dependencies/mpdf/mpdf/src/Mpdf.php delete mode 100644 dependencies/mpdf/mpdf/src/MpdfException.php delete mode 100644 dependencies/mpdf/mpdf/src/MpdfImageException.php delete mode 100644 dependencies/mpdf/mpdf/src/Otl.php delete mode 100644 dependencies/mpdf/mpdf/src/OtlDump.php delete mode 100644 dependencies/mpdf/mpdf/src/Output/Destination.php delete mode 100644 dependencies/mpdf/mpdf/src/PageBox.php delete mode 100644 dependencies/mpdf/mpdf/src/PageFormat.php delete mode 100644 dependencies/mpdf/mpdf/src/Pdf/Protection.php delete mode 100644 dependencies/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php delete mode 100644 dependencies/mpdf/mpdf/src/ServiceFactory.php delete mode 100644 dependencies/mpdf/mpdf/src/Shaper/Indic.php delete mode 100644 dependencies/mpdf/mpdf/src/Shaper/Myanmar.php delete mode 100644 dependencies/mpdf/mpdf/src/Shaper/Sea.php delete mode 100644 dependencies/mpdf/mpdf/src/SizeConverter.php delete mode 100644 dependencies/mpdf/mpdf/src/Strict.php delete mode 100644 dependencies/mpdf/mpdf/src/TTFontFile.php delete mode 100644 dependencies/mpdf/mpdf/src/TTFontFileAnalysis.php delete mode 100644 dependencies/mpdf/mpdf/src/TableOfContents.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/A.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Acronym.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Address.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Annotation.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Article.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Aside.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/B.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/BarCode.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Bdi.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Bdo.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Big.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/BlockQuote.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/BlockTag.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Bookmark.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Br.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Caption.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Center.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Cite.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Code.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/ColumnBreak.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Columns.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Dd.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Del.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Details.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Div.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Dl.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/DotTab.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Dt.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Em.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/FieldSet.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/FigCaption.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Figure.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Font.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Footer.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Form.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/FormFeed.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/H1.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/H2.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/H3.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/H4.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/H5.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/H6.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/HGroup.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Header.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Hr.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/I.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Img.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/IndexEntry.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/IndexInsert.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/InlineTag.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Input.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Ins.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Kbd.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Legend.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Li.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Main.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Mark.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Meter.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Nav.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/NewColumn.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/NewPage.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Ol.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Option.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/P.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/PageBreak.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/PageFooter.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/PageHeader.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Pre.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Progress.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Q.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/S.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Samp.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Section.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Select.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/SetPageFooter.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/SetPageHeader.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Small.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Span.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Strike.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Strong.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Sub.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/SubstituteTag.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Summary.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Sup.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/TBody.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/TFoot.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/THead.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Table.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Tag.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Td.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/TextArea.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/TextCircle.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Th.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Time.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Toc.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/TocEntry.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/TocPageBreak.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Tr.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Tt.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Tta.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Tts.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Ttz.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/U.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/Ul.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/VarTag.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/WatermarkImage.php delete mode 100644 dependencies/mpdf/mpdf/src/Tag/WatermarkText.php delete mode 100644 dependencies/mpdf/mpdf/src/Ucdn.php delete mode 100644 dependencies/mpdf/mpdf/src/Utils/Arrays.php delete mode 100644 dependencies/mpdf/mpdf/src/Utils/NumericString.php delete mode 100644 dependencies/mpdf/mpdf/src/Utils/PdfDate.php delete mode 100644 dependencies/mpdf/mpdf/src/Utils/UtfString.php delete mode 100644 dependencies/mpdf/mpdf/src/Watermark.php delete mode 100644 dependencies/mpdf/mpdf/src/WatermarkImage.php delete mode 100644 dependencies/mpdf/mpdf/src/WatermarkText.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/BackgroundWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/BaseWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/BookmarkWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/ColorWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/FontWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/FormWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/ImageWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/JavaScriptWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/MetadataWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/ObjectWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/OptionalContentWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/PageWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/Writer/ResourceWriter.php delete mode 100644 dependencies/mpdf/mpdf/src/functions-dev.php delete mode 100644 dependencies/mpdf/mpdf/src/functions.php delete mode 100644 dependencies/mpdf/mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf delete mode 100644 dependencies/mpdf/mpdf/ttfonts/DejaVuSansCondensed.ttf delete mode 100644 dependencies/mpdf/mpdf/ttfonts/DejaVuSerifCondensed.ttf delete mode 100644 dependencies/mpdf/mpdf/ttfonts/DejaVuinfo.txt delete mode 100644 dependencies/mpdf/mpdf/ttfonts/FreeMono.ttf delete mode 100644 dependencies/mpdf/mpdf/ttfonts/FreeMonoBold.ttf delete mode 100644 dependencies/mpdf/mpdf/ttfonts/FreeSerif.ttf delete mode 100644 dependencies/mpdf/mpdf/ttfonts/FreeSerifBold.ttf delete mode 100644 dependencies/mpdf/psr-http-message-shim/src/Request.php delete mode 100644 dependencies/mpdf/psr-http-message-shim/src/Response.php delete mode 100644 dependencies/mpdf/psr-http-message-shim/src/Stream.php delete mode 100644 dependencies/mpdf/psr-http-message-shim/src/Uri.php delete mode 100644 dependencies/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php delete mode 100644 dependencies/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/DeepCopy.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php delete mode 100644 dependencies/myclabs/deep-copy/src/DeepCopy/deep_copy.php delete mode 100644 dependencies/nesbot/carbon/extension.neon delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php delete mode 100644 dependencies/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php delete mode 100644 dependencies/nesbot/carbon/sponsors.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/AbstractTranslator.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Carbon.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonConverterInterface.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonImmutable.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonInterface.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonInterval.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonPeriod.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/CarbonTimeZone.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Cli/Invoker.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/Exception.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Factory.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/FactoryImmutable.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/aa.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/aa_DJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/aa_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/af.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/af_NA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/af_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/agq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/agr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/agr_PE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ak.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ak_GH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/am.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/am_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/an.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/an_ES.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/anp.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/anp_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_AE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_BH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_DJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_DZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_EG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_EH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_IL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_IQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_JO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_KM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_KW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_LB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_LY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_MA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_MR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_OM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_PS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_QA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_SA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_SD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_SO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_SS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_SY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_TD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_TN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ar_YE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/as.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/as_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/asa.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ast.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ast_ES.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ayc.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ayc_PE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/az.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/az_AZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/az_IR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/az_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bas.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/be.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/be_BY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bem.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bem_ZM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ber.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ber_DZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ber_MA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bez.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bg_BG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bhb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bhb_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bho.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bho_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bi_VU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bm.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bn_BD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bn_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bo_CN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bo_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/br.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/br_FR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/brx.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/brx_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bs.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bs_BA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/bs_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/byn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/byn_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ca.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ca_AD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ca_FR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ca_IT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ccp.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ccp_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ce.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ce_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cgg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/chr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/chr_US.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ckb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cmn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cmn_TW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/crh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/crh_UA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cs.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cs_CZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/csb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/csb_PL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cv.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cv_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cy.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/cy_GB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/da.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/da_DK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/da_GL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dav.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_AT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_BE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_DE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_IT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_LI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/de_LU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dje.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/doi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/doi_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dsb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dsb_DE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dua.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dv.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dv_MV.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dyo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dz.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/dz_BT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ebu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ee.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ee_TG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/el.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/el_CY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/el_GR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_001.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_150.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_AG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_AI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_AS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_AT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_AU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_BZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CX.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_CY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_DE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_DG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_DK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_DM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_FI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_FJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_FK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_FM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_GY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_HK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_IE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_IL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_IM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_IO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_ISO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_JE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_JM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_KE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_KI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_KN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_KY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_LC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_LR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_LS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MP.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_MY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_NZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_PG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_PH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_PK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_PN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_PR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_PW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_RW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SX.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_SZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_TC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_TK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_TO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_TT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_TV.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_TZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_UG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_UM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_US.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_VC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_VG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_VI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_VU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_WS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_ZM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/en_ZW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/eo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_419.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_AR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_BO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_BR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_BZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_CL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_CO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_CR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_CU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_DO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_EA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_EC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_ES.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_GQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_GT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_HN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_IC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_MX.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_NI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_PA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_PE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_PH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_PR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_PY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_SV.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_US.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_UY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/es_VE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/et.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/et_EE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/eu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/eu_ES.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ewo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fa.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fa_AF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fa_IR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ff.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ff_CM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ff_GN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ff_MR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ff_SN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fi_FI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fil.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fil_PH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fo_DK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fo_FO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_BE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_BF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_BI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_BJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_BL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_CM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_DJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_DZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_FR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_GA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_GF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_GN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_GP.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_GQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_HT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_KM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_LU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_ML.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_MU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_NC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_NE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_PF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_PM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_RE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_RW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_SC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_SN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_SY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_TD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_TG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_TN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_VU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_WF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fr_YT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fur.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fur_IT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fy.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fy_DE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/fy_NL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ga.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ga_IE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gd.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gd_GB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gez.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gez_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gez_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gl_ES.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gom.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gom_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gsw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gsw_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gsw_FR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gsw_LI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gu_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/guz.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gv.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/gv_GB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ha.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ha_GH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ha_NE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ha_NG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hak.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hak_TW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/haw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/he.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/he_IL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hi_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hif.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hif_FJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hne.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hne_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hr_BA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hr_HR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hsb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hsb_DE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ht.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ht_HT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hu_HU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hy.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/hy_AM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/i18n.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ia.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ia_FR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/id.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/id_ID.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ig.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ig_NG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ii.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ik.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ik_CA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/in.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/is.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/is_IS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/it.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/it_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/it_IT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/it_SM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/it_VA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/iu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/iu_CA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/iw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ja.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ja_JP.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/jgo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/jmc.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/jv.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ka.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ka_GE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kab.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kab_DZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kam.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kde.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kea.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/khq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ki.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kk.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kk_KZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kkj.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kl_GL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kln.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/km.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/km_KH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kn_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ko.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ko_KP.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ko_KR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kok.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kok_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ks.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ksb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ksf.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ksh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ku.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ku_TR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/kw_GB.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ky.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ky_KG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lag.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lb_LU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lg_UG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/li.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/li_NL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lij.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lij_IT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lkt.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ln.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ln_AO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ln_CD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ln_CF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ln_CG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lo_LA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lrc.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lt.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lt_LT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/luo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/luy.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lv.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lv_LV.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lzh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/lzh_TW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mag.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mag_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mai.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mai_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mas.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mas_TZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mer.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mfe.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mfe_MU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mg_MG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mgh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mgo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mhr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mhr_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mi_NZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/miq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/miq_NI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mjw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mjw_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mk.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mk_MK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ml.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ml_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mn_MN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mni.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mni_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mr_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ms.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ms_BN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ms_MY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ms_SG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mt.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mt_MT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mua.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/my.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/my_MM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/mzn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nan.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/naq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nb.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nb_NO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nb_SJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nd.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nds.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nds_DE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nds_NL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ne.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ne_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ne_NP.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nhn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nhn_MX.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/niu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/niu_NU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_AW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_BE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_BQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_CW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_NL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_SR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nl_SX.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nmg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nn_NO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nnh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/no.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nr_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nso.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nso_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nus.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/nyn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/oc.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/oc_FR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/om.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/om_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/om_KE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/or.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/or_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/os.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/os_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pa.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pa_Arab.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pa_Guru.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pa_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pa_PK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pap.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pap_AW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pap_CW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pl_PL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/prg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ps.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ps_AF.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_AO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_BR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_CV.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_GQ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_GW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_LU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_MO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_MZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_PT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_ST.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/pt_TL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/qu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/qu_BO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/qu_EC.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/quz.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/quz_PE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/raj.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/raj_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/rm.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/rn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ro.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ro_MD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ro_RO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/rof.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru_BY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru_KG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru_KZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru_MD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ru_UA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/rw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/rw_RW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/rwk.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sa.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sa_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sah.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sah_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/saq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sat.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sat_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sbp.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sc.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sc_IT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sd.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/se.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/se_FI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/se_NO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/se_SE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/seh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ses.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sgs.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sgs_LT.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shi_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shn_MM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shs.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/shs_CA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/si.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/si_LK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sid.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sid_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sk.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sk_SK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sl_SI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sm.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sm_WS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/smn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/so.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/so_DJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/so_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/so_KE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/so_SO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sq_AL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sq_MK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sq_XK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_ME.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ss.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ss_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/st.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/st_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sv.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sv_AX.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sv_FI.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sv_SE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sw_CD.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sw_KE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sw_TZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/sw_UG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/szl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/szl_PL.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ta.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ta_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ta_LK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ta_MY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ta_SG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tcy.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tcy_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/te.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/te_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/teo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/teo_KE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tet.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tg.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tg_TJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/th.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/th_TH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/the.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/the_NP.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ti.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ti_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ti_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tig.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tig_ER.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tk.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tk_TM.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tl_PH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tlh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tn_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/to.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/to_TO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tpi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tpi_PG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tr.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tr_CY.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tr_TR.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ts.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ts_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tt.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/twq.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tzl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tzm.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ug.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ug_CN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uk.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uk_UA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/unm.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/unm_US.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ur.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ur_IN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ur_PK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uz.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uz_Arab.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uz_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vai.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vai_Latn.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ve.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/ve_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vi_VN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/vun.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wa.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wa_BE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wae.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wae_CH.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wal.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wal_ET.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/wo_SN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/xh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/xh_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/xog.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yav.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yi.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yi_US.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yo.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yo_BJ.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yo_NG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yue.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yue_HK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hans.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hant.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yuw.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/yuw_PG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zgh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_CN.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_HK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_MO.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_SG.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_TW.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zh_YUE.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zu.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Lang/zu_ZA.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/List/languages.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/List/regions.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/PHPStan/Macro.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Boundaries.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Cast.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Comparison.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Converter.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Creator.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Date.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Difference.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/IntervalStep.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Localization.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Macro.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/MagicParameter.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Mixin.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Modifiers.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Mutability.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Options.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Rounding.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Serialization.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Test.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Timestamp.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Units.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Traits/Week.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/Translator.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/TranslatorImmutable.php delete mode 100644 dependencies/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php delete mode 100644 dependencies/nyholm/psr7/phpstan-baseline.neon delete mode 100644 dependencies/nyholm/psr7/psalm.baseline.xml delete mode 100644 dependencies/nyholm/psr7/src/Factory/HttplugFactory.php delete mode 100644 dependencies/nyholm/psr7/src/Factory/Psr17Factory.php delete mode 100644 dependencies/nyholm/psr7/src/MessageTrait.php delete mode 100644 dependencies/nyholm/psr7/src/Request.php delete mode 100644 dependencies/nyholm/psr7/src/RequestTrait.php delete mode 100644 dependencies/nyholm/psr7/src/Response.php delete mode 100644 dependencies/nyholm/psr7/src/ServerRequest.php delete mode 100644 dependencies/nyholm/psr7/src/Stream.php delete mode 100644 dependencies/nyholm/psr7/src/StreamTrait.php delete mode 100644 dependencies/nyholm/psr7/src/UploadedFile.php delete mode 100644 dependencies/nyholm/psr7/src/Uri.php delete mode 100644 dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpcs.xml delete mode 100644 dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpunit.xml delete mode 100644 dependencies/pablo-sg-pacheco/wp-namespace-autoloader/src/WP_Namespace_Autoloader.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Base32.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Base32Hex.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Base64.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Base64DotSlash.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Base64UrlSafe.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Binary.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/EncoderInterface.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Encoding.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/Hex.php delete mode 100644 dependencies/paragonie/constant_time_encoding/src/RFC4648.php delete mode 100644 dependencies/paragonie/random_compat/build-phar.sh delete mode 100644 dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey delete mode 100644 dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey.asc delete mode 100644 dependencies/paragonie/random_compat/lib/random.php delete mode 100644 dependencies/paragonie/random_compat/other/build_phar.php delete mode 100644 dependencies/paragonie/random_compat/psalm-autoload.php delete mode 100644 dependencies/paragonie/random_compat/psalm.xml delete mode 100644 dependencies/phpdocumentor/reflection-common/src/Element.php delete mode 100644 dependencies/phpdocumentor/reflection-common/src/File.php delete mode 100644 dependencies/phpdocumentor/reflection-common/src/Fqsen.php delete mode 100644 dependencies/phpdocumentor/reflection-common/src/Location.php delete mode 100644 dependencies/phpdocumentor/reflection-common/src/Project.php delete mode 100644 dependencies/phpdocumentor/reflection-common/src/ProjectFactory.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Description.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactory.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/Exception/PcreException.php delete mode 100644 dependencies/phpdocumentor/reflection-docblock/src/Utils.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/FqsenResolver.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoType.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/False_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/List_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/PseudoTypes/True_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Type.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/TypeResolver.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/AbstractList.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/AggregatedType.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/ArrayKey.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Array_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Boolean.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/CallableParameter.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Callable_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/ClassString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Collection.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Compound.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Context.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/ContextFactory.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Expression.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Float_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Integer.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/InterfaceString.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Intersection.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Iterable_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Mixed_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Never_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Null_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Nullable.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Object_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Parent_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Resource_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Scalar.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Self_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Static_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/String_.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/This.php delete mode 100644 dependencies/phpdocumentor/type-resolver/src/Types/Void_.php delete mode 100644 dependencies/phpseclib/bcmath_compat/lib/bcmath.php delete mode 100644 dependencies/phpseclib/bcmath_compat/src/BCMath.php delete mode 100644 dependencies/phpseclib/phpseclib/AUTHORS delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/AES.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DES.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Hash.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC4.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Random.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ANSI.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/File/X509.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/Net/SSH2.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/bootstrap.php delete mode 100644 dependencies/phpseclib/phpseclib/phpseclib/openssl.cnf delete mode 100644 dependencies/phpstan/phpdoc-parser/phpstan-baseline.neon delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Attribute.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Node.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Lexer/Lexer.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Parser/ParserException.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Parser/TokenIterator.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Parser/TypeParser.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Printer/DiffElem.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Printer/Differ.php delete mode 100644 dependencies/phpstan/phpdoc-parser/src/Printer/Printer.php delete mode 100644 dependencies/psr/cache/src/CacheException.php delete mode 100644 dependencies/psr/cache/src/CacheItemInterface.php delete mode 100644 dependencies/psr/cache/src/CacheItemPoolInterface.php delete mode 100644 dependencies/psr/cache/src/InvalidArgumentException.php delete mode 100644 dependencies/psr/clock/src/ClockInterface.php delete mode 100644 dependencies/psr/container/src/ContainerExceptionInterface.php delete mode 100644 dependencies/psr/container/src/ContainerInterface.php delete mode 100644 dependencies/psr/container/src/NotFoundExceptionInterface.php delete mode 100644 dependencies/psr/event-dispatcher/src/EventDispatcherInterface.php delete mode 100644 dependencies/psr/event-dispatcher/src/ListenerProviderInterface.php delete mode 100644 dependencies/psr/event-dispatcher/src/StoppableEventInterface.php delete mode 100644 dependencies/psr/http-client/src/ClientExceptionInterface.php delete mode 100644 dependencies/psr/http-client/src/ClientInterface.php delete mode 100644 dependencies/psr/http-client/src/NetworkExceptionInterface.php delete mode 100644 dependencies/psr/http-client/src/RequestExceptionInterface.php delete mode 100644 dependencies/psr/http-factory/src/RequestFactoryInterface.php delete mode 100644 dependencies/psr/http-factory/src/ResponseFactoryInterface.php delete mode 100644 dependencies/psr/http-factory/src/ServerRequestFactoryInterface.php delete mode 100644 dependencies/psr/http-factory/src/StreamFactoryInterface.php delete mode 100644 dependencies/psr/http-factory/src/UploadedFileFactoryInterface.php delete mode 100644 dependencies/psr/http-factory/src/UriFactoryInterface.php delete mode 100644 dependencies/psr/http-message/src/MessageInterface.php delete mode 100644 dependencies/psr/http-message/src/RequestInterface.php delete mode 100644 dependencies/psr/http-message/src/ResponseInterface.php delete mode 100644 dependencies/psr/http-message/src/ServerRequestInterface.php delete mode 100644 dependencies/psr/http-message/src/StreamInterface.php delete mode 100644 dependencies/psr/http-message/src/UploadedFileInterface.php delete mode 100644 dependencies/psr/http-message/src/UriInterface.php delete mode 100644 dependencies/psr/log/src/AbstractLogger.php delete mode 100644 dependencies/psr/log/src/InvalidArgumentException.php delete mode 100644 dependencies/psr/log/src/LogLevel.php delete mode 100644 dependencies/psr/log/src/LoggerAwareInterface.php delete mode 100644 dependencies/psr/log/src/LoggerAwareTrait.php delete mode 100644 dependencies/psr/log/src/LoggerInterface.php delete mode 100644 dependencies/psr/log/src/LoggerTrait.php delete mode 100644 dependencies/psr/log/src/NullLogger.php delete mode 100644 dependencies/psr/simple-cache/src/CacheException.php delete mode 100644 dependencies/psr/simple-cache/src/CacheInterface.php delete mode 100644 dependencies/psr/simple-cache/src/InvalidArgumentException.php delete mode 100644 dependencies/rakit/validation/phpcs.xml delete mode 100644 dependencies/rakit/validation/src/Attribute.php delete mode 100644 dependencies/rakit/validation/src/ErrorBag.php delete mode 100644 dependencies/rakit/validation/src/Helper.php delete mode 100644 dependencies/rakit/validation/src/MimeTypeGuesser.php delete mode 100644 dependencies/rakit/validation/src/MissingRequiredParameterException.php delete mode 100644 dependencies/rakit/validation/src/Rule.php delete mode 100644 dependencies/rakit/validation/src/RuleNotFoundException.php delete mode 100644 dependencies/rakit/validation/src/RuleQuashException.php delete mode 100644 dependencies/rakit/validation/src/Rules/Accepted.php delete mode 100644 dependencies/rakit/validation/src/Rules/After.php delete mode 100644 dependencies/rakit/validation/src/Rules/Alpha.php delete mode 100644 dependencies/rakit/validation/src/Rules/AlphaDash.php delete mode 100644 dependencies/rakit/validation/src/Rules/AlphaNum.php delete mode 100644 dependencies/rakit/validation/src/Rules/AlphaSpaces.php delete mode 100644 dependencies/rakit/validation/src/Rules/Before.php delete mode 100644 dependencies/rakit/validation/src/Rules/Between.php delete mode 100644 dependencies/rakit/validation/src/Rules/Boolean.php delete mode 100644 dependencies/rakit/validation/src/Rules/Callback.php delete mode 100644 dependencies/rakit/validation/src/Rules/Date.php delete mode 100644 dependencies/rakit/validation/src/Rules/Defaults.php delete mode 100644 dependencies/rakit/validation/src/Rules/Different.php delete mode 100644 dependencies/rakit/validation/src/Rules/Digits.php delete mode 100644 dependencies/rakit/validation/src/Rules/DigitsBetween.php delete mode 100644 dependencies/rakit/validation/src/Rules/Email.php delete mode 100644 dependencies/rakit/validation/src/Rules/Extension.php delete mode 100644 dependencies/rakit/validation/src/Rules/In.php delete mode 100644 dependencies/rakit/validation/src/Rules/Integer.php delete mode 100644 dependencies/rakit/validation/src/Rules/Interfaces/BeforeValidate.php delete mode 100644 dependencies/rakit/validation/src/Rules/Interfaces/ModifyValue.php delete mode 100644 dependencies/rakit/validation/src/Rules/Ip.php delete mode 100644 dependencies/rakit/validation/src/Rules/Ipv4.php delete mode 100644 dependencies/rakit/validation/src/Rules/Ipv6.php delete mode 100644 dependencies/rakit/validation/src/Rules/Json.php delete mode 100644 dependencies/rakit/validation/src/Rules/Lowercase.php delete mode 100644 dependencies/rakit/validation/src/Rules/Max.php delete mode 100644 dependencies/rakit/validation/src/Rules/Mimes.php delete mode 100644 dependencies/rakit/validation/src/Rules/Min.php delete mode 100644 dependencies/rakit/validation/src/Rules/NotIn.php delete mode 100644 dependencies/rakit/validation/src/Rules/Nullable.php delete mode 100644 dependencies/rakit/validation/src/Rules/Numeric.php delete mode 100644 dependencies/rakit/validation/src/Rules/Present.php delete mode 100644 dependencies/rakit/validation/src/Rules/Regex.php delete mode 100644 dependencies/rakit/validation/src/Rules/Required.php delete mode 100644 dependencies/rakit/validation/src/Rules/RequiredIf.php delete mode 100644 dependencies/rakit/validation/src/Rules/RequiredUnless.php delete mode 100644 dependencies/rakit/validation/src/Rules/RequiredWith.php delete mode 100644 dependencies/rakit/validation/src/Rules/RequiredWithAll.php delete mode 100644 dependencies/rakit/validation/src/Rules/RequiredWithout.php delete mode 100644 dependencies/rakit/validation/src/Rules/RequiredWithoutAll.php delete mode 100644 dependencies/rakit/validation/src/Rules/Same.php delete mode 100644 dependencies/rakit/validation/src/Rules/Traits/DateUtilsTrait.php delete mode 100644 dependencies/rakit/validation/src/Rules/Traits/FileTrait.php delete mode 100644 dependencies/rakit/validation/src/Rules/Traits/SizeTrait.php delete mode 100644 dependencies/rakit/validation/src/Rules/TypeArray.php delete mode 100644 dependencies/rakit/validation/src/Rules/UploadedFile.php delete mode 100644 dependencies/rakit/validation/src/Rules/Uppercase.php delete mode 100644 dependencies/rakit/validation/src/Rules/Url.php delete mode 100644 dependencies/rakit/validation/src/Traits/MessagesTrait.php delete mode 100644 dependencies/rakit/validation/src/Traits/TranslationsTrait.php delete mode 100644 dependencies/rakit/validation/src/Validation.php delete mode 100644 dependencies/rakit/validation/src/Validator.php delete mode 100644 dependencies/ralouphie/getallheaders/src/getallheaders.php delete mode 100644 dependencies/remotelyliving/php-dns/_config.yml delete mode 100644 dependencies/remotelyliving/php-dns/bootstrap/repl.php delete mode 100644 dependencies/remotelyliving/php-dns/churn.yml delete mode 100644 dependencies/remotelyliving/php-dns/phpstan.neon delete mode 100644 dependencies/remotelyliving/php-dns/psalm.xml delete mode 100644 dependencies/remotelyliving/php-dns/rector.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/CAAData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/CNAMEData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/DNSRecord.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/DNSRecordCollection.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/DNSRecordType.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/DataAbstract.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/EntityAbstract.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/Hostname.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/IPAddress.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/Interfaces/Arrayable.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/Interfaces/DNSRecordInterface.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/Interfaces/Serializable.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/MXData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/NSData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/PTRData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/SOAData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/SRVData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Entities/TXTData.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Exceptions/Exception.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Exceptions/InvalidArgumentException.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Factories/SpatieDNS.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Mappers/CloudFlare.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Mappers/Dig.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Mappers/GoogleDNS.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Mappers/LocalSystem.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Mappers/MapperAbstract.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Mappers/MapperInterface.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueried.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryFailed.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryProfiled.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Events/ObservableEventAbstract.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Interfaces/Observable.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Performance/Interfaces/ProfileInterface.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Performance/Interfaces/Time.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Performance/Profile.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Performance/ProfileFactory.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Performance/Timer.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Subscribers/STDIOSubscriber.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Traits/Dispatcher.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Traits/Logger.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Observability/Traits/Profileable.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Cached.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Chain.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/CloudFlare.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Dig.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Exceptions/QueryFailure.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Exceptions/ReverseLookupFailure.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/GoogleDNS.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/Chain.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/DNSQuery.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/ObservableResolver.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/Resolver.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/ReverseDNSQuery.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/LocalSystem.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/ResolverAbstract.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Resolvers/Traits/Time.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Services/Interfaces/LocalSystemDNS.php delete mode 100644 dependencies/remotelyliving/php-dns/src/Services/LocalSystemDNS.php delete mode 100644 dependencies/rpnzl/arrch/license.txt delete mode 100644 dependencies/rpnzl/arrch/src/Arrch/Arrch.php delete mode 100644 dependencies/scoper-autoload.php delete mode 100644 dependencies/scssphp/scssphp/scss.inc.php delete mode 100644 dependencies/scssphp/scssphp/src/Base/Range.php delete mode 100644 dependencies/scssphp/scssphp/src/Block.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/AtRootBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/CallableBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/ContentBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/DirectiveBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/EachBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/ElseBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/ElseifBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/ForBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/IfBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/MediaBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/NestedPropertyBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Block/WhileBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Cache.php delete mode 100644 dependencies/scssphp/scssphp/src/Colors.php delete mode 100644 dependencies/scssphp/scssphp/src/CompilationResult.php delete mode 100644 dependencies/scssphp/scssphp/src/Compiler.php delete mode 100644 dependencies/scssphp/scssphp/src/Compiler/CachedResult.php delete mode 100644 dependencies/scssphp/scssphp/src/Compiler/Environment.php delete mode 100644 dependencies/scssphp/scssphp/src/Exception/CompilerException.php delete mode 100644 dependencies/scssphp/scssphp/src/Exception/ParserException.php delete mode 100644 dependencies/scssphp/scssphp/src/Exception/RangeException.php delete mode 100644 dependencies/scssphp/scssphp/src/Exception/SassException.php delete mode 100644 dependencies/scssphp/scssphp/src/Exception/SassScriptException.php delete mode 100644 dependencies/scssphp/scssphp/src/Exception/ServerException.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/Compact.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/Compressed.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/Crunched.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/Debug.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/Expanded.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/Nested.php delete mode 100644 dependencies/scssphp/scssphp/src/Formatter/OutputBlock.php delete mode 100644 dependencies/scssphp/scssphp/src/Logger/LoggerInterface.php delete mode 100644 dependencies/scssphp/scssphp/src/Logger/QuietLogger.php delete mode 100644 dependencies/scssphp/scssphp/src/Logger/StreamLogger.php delete mode 100644 dependencies/scssphp/scssphp/src/Node.php delete mode 100644 dependencies/scssphp/scssphp/src/Node/Number.php delete mode 100644 dependencies/scssphp/scssphp/src/OutputStyle.php delete mode 100644 dependencies/scssphp/scssphp/src/Parser.php delete mode 100644 dependencies/scssphp/scssphp/src/SourceMap/Base64.php delete mode 100644 dependencies/scssphp/scssphp/src/SourceMap/Base64VLQ.php delete mode 100644 dependencies/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php delete mode 100644 dependencies/scssphp/scssphp/src/Type.php delete mode 100644 dependencies/scssphp/scssphp/src/Util.php delete mode 100644 dependencies/scssphp/scssphp/src/Util/Path.php delete mode 100644 dependencies/scssphp/scssphp/src/ValueConverter.php delete mode 100644 dependencies/scssphp/scssphp/src/Version.php delete mode 100644 dependencies/scssphp/scssphp/src/Warn.php delete mode 100644 dependencies/setasign/fpdi/src/FpdfTpl.php delete mode 100644 dependencies/setasign/fpdi/src/FpdfTplTrait.php delete mode 100644 dependencies/setasign/fpdi/src/FpdfTrait.php delete mode 100644 dependencies/setasign/fpdi/src/Fpdi.php delete mode 100644 dependencies/setasign/fpdi/src/FpdiException.php delete mode 100644 dependencies/setasign/fpdi/src/FpdiTrait.php delete mode 100644 dependencies/setasign/fpdi/src/GraphicsState.php delete mode 100644 dependencies/setasign/fpdi/src/Math/Matrix.php delete mode 100644 dependencies/setasign/fpdi/src/Math/Vector.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/Ascii85.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/FilterException.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/Flate.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/FlateException.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/Lzw.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Filter/LzwException.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/PdfParser.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/PdfParserException.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/StreamReader.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Tokenizer.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfArray.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfHexString.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfName.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfNull.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfStream.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfString.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfToken.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfType.php delete mode 100644 dependencies/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php delete mode 100644 dependencies/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php delete mode 100644 dependencies/setasign/fpdi/src/PdfReader/Page.php delete mode 100644 dependencies/setasign/fpdi/src/PdfReader/PageBoundaries.php delete mode 100644 dependencies/setasign/fpdi/src/PdfReader/PdfReader.php delete mode 100644 dependencies/setasign/fpdi/src/PdfReader/PdfReaderException.php delete mode 100644 dependencies/setasign/fpdi/src/Tcpdf/Fpdi.php delete mode 100644 dependencies/setasign/fpdi/src/TcpdfFpdi.php delete mode 100644 dependencies/setasign/fpdi/src/Tfpdf/FpdfTpl.php delete mode 100644 dependencies/setasign/fpdi/src/Tfpdf/Fpdi.php delete mode 100644 dependencies/setasign/fpdi/src/autoload.php delete mode 100644 dependencies/spatie/dns/src/Dns.php delete mode 100644 dependencies/spatie/dns/src/Exceptions/CouldNotFetchDns.php delete mode 100644 dependencies/spatie/dns/src/Exceptions/InvalidArgument.php delete mode 100644 dependencies/spatie/macroable/src/Macroable.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Downloader.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/HostDoesNotExist.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/NoCertificateInstalled.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/UnknownError.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Exceptions/InvalidIpAddress.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Exceptions/InvalidUrl.php delete mode 100644 dependencies/spatie/ssl-certificate/src/SslCertificate.php delete mode 100644 dependencies/spatie/ssl-certificate/src/Url.php delete mode 100644 dependencies/spatie/ssl-certificate/src/helpers.php delete mode 100644 dependencies/stripe/stripe-php/OPENAPI_VERSION delete mode 100644 dependencies/stripe/stripe-php/VERSION delete mode 100644 dependencies/stripe/stripe-php/data/ca-certificates.crt delete mode 100644 dependencies/stripe/stripe-php/init.php delete mode 100644 dependencies/stripe/stripe-php/lib/Account.php delete mode 100644 dependencies/stripe/stripe-php/lib/AccountLink.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/All.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/Create.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/Delete.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/NestedResource.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/Request.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/Retrieve.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/Search.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiOperations/Update.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiRequestor.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiResource.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApiResponse.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApplePayDomain.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApplicationFee.php delete mode 100644 dependencies/stripe/stripe-php/lib/ApplicationFeeRefund.php delete mode 100644 dependencies/stripe/stripe-php/lib/Apps/Secret.php delete mode 100644 dependencies/stripe/stripe-php/lib/Balance.php delete mode 100644 dependencies/stripe/stripe-php/lib/BalanceTransaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/BankAccount.php delete mode 100644 dependencies/stripe/stripe-php/lib/BaseStripeClient.php delete mode 100644 dependencies/stripe/stripe-php/lib/BaseStripeClientInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/BillingPortal/Configuration.php delete mode 100644 dependencies/stripe/stripe-php/lib/BillingPortal/Session.php delete mode 100644 dependencies/stripe/stripe-php/lib/Capability.php delete mode 100644 dependencies/stripe/stripe-php/lib/Card.php delete mode 100644 dependencies/stripe/stripe-php/lib/CashBalance.php delete mode 100644 dependencies/stripe/stripe-php/lib/Charge.php delete mode 100644 dependencies/stripe/stripe-php/lib/Checkout/Session.php delete mode 100644 dependencies/stripe/stripe-php/lib/Collection.php delete mode 100644 dependencies/stripe/stripe-php/lib/CountrySpec.php delete mode 100644 dependencies/stripe/stripe-php/lib/Coupon.php delete mode 100644 dependencies/stripe/stripe-php/lib/CreditNote.php delete mode 100644 dependencies/stripe/stripe-php/lib/CreditNoteLineItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/Customer.php delete mode 100644 dependencies/stripe/stripe-php/lib/CustomerBalanceTransaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/Discount.php delete mode 100644 dependencies/stripe/stripe-php/lib/Dispute.php delete mode 100644 dependencies/stripe/stripe-php/lib/EphemeralKey.php delete mode 100644 dependencies/stripe/stripe-php/lib/ErrorObject.php delete mode 100644 dependencies/stripe/stripe-php/lib/Event.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/ApiConnectionException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/ApiErrorException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/AuthenticationException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/BadMethodCallException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/CardException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/ExceptionInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/IdempotencyException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/InvalidArgumentException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/InvalidRequestException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/InvalidClientException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/InvalidGrantException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/InvalidRequestException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/InvalidScopeException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/OAuthErrorException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/PermissionException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/RateLimitException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/SignatureVerificationException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/UnexpectedValueException.php delete mode 100644 dependencies/stripe/stripe-php/lib/Exception/UnknownApiErrorException.php delete mode 100644 dependencies/stripe/stripe-php/lib/ExchangeRate.php delete mode 100644 dependencies/stripe/stripe-php/lib/File.php delete mode 100644 dependencies/stripe/stripe-php/lib/FileLink.php delete mode 100644 dependencies/stripe/stripe-php/lib/FinancialConnections/Account.php delete mode 100644 dependencies/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php delete mode 100644 dependencies/stripe/stripe-php/lib/FinancialConnections/AccountOwnership.php delete mode 100644 dependencies/stripe/stripe-php/lib/FinancialConnections/Session.php delete mode 100644 dependencies/stripe/stripe-php/lib/FundingInstructions.php delete mode 100644 dependencies/stripe/stripe-php/lib/HttpClient/ClientInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/HttpClient/CurlClient.php delete mode 100644 dependencies/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/Identity/VerificationReport.php delete mode 100644 dependencies/stripe/stripe-php/lib/Identity/VerificationSession.php delete mode 100644 dependencies/stripe/stripe-php/lib/Invoice.php delete mode 100644 dependencies/stripe/stripe-php/lib/InvoiceItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/InvoiceLineItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/Issuing/Authorization.php delete mode 100644 dependencies/stripe/stripe-php/lib/Issuing/Card.php delete mode 100644 dependencies/stripe/stripe-php/lib/Issuing/CardDetails.php delete mode 100644 dependencies/stripe/stripe-php/lib/Issuing/Cardholder.php delete mode 100644 dependencies/stripe/stripe-php/lib/Issuing/Dispute.php delete mode 100644 dependencies/stripe/stripe-php/lib/Issuing/Transaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/LineItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/LoginLink.php delete mode 100644 dependencies/stripe/stripe-php/lib/Mandate.php delete mode 100644 dependencies/stripe/stripe-php/lib/OAuth.php delete mode 100644 dependencies/stripe/stripe-php/lib/OAuthErrorObject.php delete mode 100644 dependencies/stripe/stripe-php/lib/PaymentIntent.php delete mode 100644 dependencies/stripe/stripe-php/lib/PaymentLink.php delete mode 100644 dependencies/stripe/stripe-php/lib/PaymentMethod.php delete mode 100644 dependencies/stripe/stripe-php/lib/Payout.php delete mode 100644 dependencies/stripe/stripe-php/lib/Person.php delete mode 100644 dependencies/stripe/stripe-php/lib/Plan.php delete mode 100644 dependencies/stripe/stripe-php/lib/Price.php delete mode 100644 dependencies/stripe/stripe-php/lib/Product.php delete mode 100644 dependencies/stripe/stripe-php/lib/PromotionCode.php delete mode 100644 dependencies/stripe/stripe-php/lib/Quote.php delete mode 100644 dependencies/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php delete mode 100644 dependencies/stripe/stripe-php/lib/Radar/ValueList.php delete mode 100644 dependencies/stripe/stripe-php/lib/Radar/ValueListItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/RecipientTransfer.php delete mode 100644 dependencies/stripe/stripe-php/lib/Refund.php delete mode 100644 dependencies/stripe/stripe-php/lib/Reporting/ReportRun.php delete mode 100644 dependencies/stripe/stripe-php/lib/Reporting/ReportType.php delete mode 100644 dependencies/stripe/stripe-php/lib/RequestTelemetry.php delete mode 100644 dependencies/stripe/stripe-php/lib/Review.php delete mode 100644 dependencies/stripe/stripe-php/lib/SearchResult.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/AbstractService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/AbstractServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/AccountLinkService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/AccountService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ApplePayDomainService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ApplicationFeeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Apps/SecretService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/BalanceService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/BalanceTransactionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ChargeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Checkout/SessionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/CoreServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/CountrySpecService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/CouponService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/CreditNoteService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/CustomerService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/DisputeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/EphemeralKeyService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/EventService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ExchangeRateService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/FileLinkService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/FileService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/InvoiceItemService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/InvoiceService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Issuing/CardService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Issuing/CardholderService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Issuing/DisputeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Issuing/TransactionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/MandateService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/OAuthService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PaymentIntentService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PaymentLinkService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PaymentMethodService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PayoutService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PlanService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PriceService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ProductService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/PromotionCodeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/QuoteService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Radar/ValueListService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/RefundService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ReviewService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/SetupAttemptService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/SetupIntentService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/ShippingRateService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/SourceService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/SubscriptionItemService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/SubscriptionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Tax/CalculationService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Tax/SettingsService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Tax/TransactionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TaxCodeService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TaxRateService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Terminal/LocationService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Terminal/ReaderService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TokenService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TopupService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/TransferService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionService.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php delete mode 100644 dependencies/stripe/stripe-php/lib/Service/WebhookEndpointService.php delete mode 100644 dependencies/stripe/stripe-php/lib/SetupAttempt.php delete mode 100644 dependencies/stripe/stripe-php/lib/SetupIntent.php delete mode 100644 dependencies/stripe/stripe-php/lib/ShippingRate.php delete mode 100644 dependencies/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php delete mode 100644 dependencies/stripe/stripe-php/lib/SingletonApiResource.php delete mode 100644 dependencies/stripe/stripe-php/lib/Source.php delete mode 100644 dependencies/stripe/stripe-php/lib/SourceTransaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/Stripe.php delete mode 100644 dependencies/stripe/stripe-php/lib/StripeClient.php delete mode 100644 dependencies/stripe/stripe-php/lib/StripeClientInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/StripeObject.php delete mode 100644 dependencies/stripe/stripe-php/lib/StripeStreamingClientInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/Subscription.php delete mode 100644 dependencies/stripe/stripe-php/lib/SubscriptionItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/SubscriptionSchedule.php delete mode 100644 dependencies/stripe/stripe-php/lib/Tax/Calculation.php delete mode 100644 dependencies/stripe/stripe-php/lib/Tax/CalculationLineItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/Tax/Settings.php delete mode 100644 dependencies/stripe/stripe-php/lib/Tax/Transaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/Tax/TransactionLineItem.php delete mode 100644 dependencies/stripe/stripe-php/lib/TaxCode.php delete mode 100644 dependencies/stripe/stripe-php/lib/TaxId.php delete mode 100644 dependencies/stripe/stripe-php/lib/TaxRate.php delete mode 100644 dependencies/stripe/stripe-php/lib/Terminal/Configuration.php delete mode 100644 dependencies/stripe/stripe-php/lib/Terminal/ConnectionToken.php delete mode 100644 dependencies/stripe/stripe-php/lib/Terminal/Location.php delete mode 100644 dependencies/stripe/stripe-php/lib/Terminal/Reader.php delete mode 100644 dependencies/stripe/stripe-php/lib/TestHelpers/TestClock.php delete mode 100644 dependencies/stripe/stripe-php/lib/Token.php delete mode 100644 dependencies/stripe/stripe-php/lib/Topup.php delete mode 100644 dependencies/stripe/stripe-php/lib/Transfer.php delete mode 100644 dependencies/stripe/stripe-php/lib/TransferReversal.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/CreditReversal.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/DebitReversal.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/FinancialAccount.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/InboundTransfer.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/OutboundPayment.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/OutboundTransfer.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/ReceivedCredit.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/ReceivedDebit.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/Transaction.php delete mode 100644 dependencies/stripe/stripe-php/lib/Treasury/TransactionEntry.php delete mode 100644 dependencies/stripe/stripe-php/lib/UsageRecord.php delete mode 100644 dependencies/stripe/stripe-php/lib/UsageRecordSummary.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/ApiVersion.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/CaseInsensitiveArray.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/DefaultLogger.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/LoggerInterface.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/ObjectTypes.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/RandomGenerator.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/RequestOptions.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/Set.php delete mode 100644 dependencies/stripe/stripe-php/lib/Util/Util.php delete mode 100644 dependencies/stripe/stripe-php/lib/Webhook.php delete mode 100644 dependencies/stripe/stripe-php/lib/WebhookEndpoint.php delete mode 100644 dependencies/stripe/stripe-php/lib/WebhookSignature.php delete mode 100644 dependencies/symfony/cache-contracts/CacheInterface.php delete mode 100644 dependencies/symfony/cache-contracts/CacheTrait.php delete mode 100644 dependencies/symfony/cache-contracts/CallbackInterface.php delete mode 100644 dependencies/symfony/cache-contracts/ItemInterface.php delete mode 100644 dependencies/symfony/cache-contracts/TagAwareCacheInterface.php delete mode 100644 dependencies/symfony/cache/Adapter/AbstractAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/AbstractTagAwareAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/AdapterInterface.php delete mode 100644 dependencies/symfony/cache/Adapter/ApcuAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/ArrayAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/ChainAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/CouchbaseBucketAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/CouchbaseCollectionAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/DoctrineAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/DoctrineDbalAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/FilesystemAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/FilesystemTagAwareAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/MemcachedAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/NullAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/ParameterNormalizer.php delete mode 100644 dependencies/symfony/cache/Adapter/PdoAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/PhpArrayAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/PhpFilesAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/ProxyAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/Psr16Adapter.php delete mode 100644 dependencies/symfony/cache/Adapter/RedisAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/RedisTagAwareAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/TagAwareAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/TagAwareAdapterInterface.php delete mode 100644 dependencies/symfony/cache/Adapter/TraceableAdapter.php delete mode 100644 dependencies/symfony/cache/Adapter/TraceableTagAwareAdapter.php delete mode 100644 dependencies/symfony/cache/CacheItem.php delete mode 100644 dependencies/symfony/cache/DataCollector/CacheDataCollector.php delete mode 100644 dependencies/symfony/cache/DependencyInjection/CacheCollectorPass.php delete mode 100644 dependencies/symfony/cache/DependencyInjection/CachePoolClearerPass.php delete mode 100644 dependencies/symfony/cache/DependencyInjection/CachePoolPass.php delete mode 100644 dependencies/symfony/cache/DependencyInjection/CachePoolPrunerPass.php delete mode 100644 dependencies/symfony/cache/DoctrineProvider.php delete mode 100644 dependencies/symfony/cache/Exception/CacheException.php delete mode 100644 dependencies/symfony/cache/Exception/InvalidArgumentException.php delete mode 100644 dependencies/symfony/cache/Exception/LogicException.php delete mode 100644 dependencies/symfony/cache/LockRegistry.php delete mode 100644 dependencies/symfony/cache/Marshaller/DefaultMarshaller.php delete mode 100644 dependencies/symfony/cache/Marshaller/DeflateMarshaller.php delete mode 100644 dependencies/symfony/cache/Marshaller/MarshallerInterface.php delete mode 100644 dependencies/symfony/cache/Marshaller/SodiumMarshaller.php delete mode 100644 dependencies/symfony/cache/Marshaller/TagAwareMarshaller.php delete mode 100644 dependencies/symfony/cache/Messenger/EarlyExpirationDispatcher.php delete mode 100644 dependencies/symfony/cache/Messenger/EarlyExpirationHandler.php delete mode 100644 dependencies/symfony/cache/Messenger/EarlyExpirationMessage.php delete mode 100644 dependencies/symfony/cache/PruneableInterface.php delete mode 100644 dependencies/symfony/cache/Psr16Cache.php delete mode 100644 dependencies/symfony/cache/ResettableInterface.php delete mode 100644 dependencies/symfony/cache/Traits/AbstractAdapterTrait.php delete mode 100644 dependencies/symfony/cache/Traits/ContractsTrait.php delete mode 100644 dependencies/symfony/cache/Traits/FilesystemCommonTrait.php delete mode 100644 dependencies/symfony/cache/Traits/FilesystemTrait.php delete mode 100644 dependencies/symfony/cache/Traits/ProxyTrait.php delete mode 100644 dependencies/symfony/cache/Traits/RedisClusterNodeProxy.php delete mode 100644 dependencies/symfony/cache/Traits/RedisClusterProxy.php delete mode 100644 dependencies/symfony/cache/Traits/RedisProxy.php delete mode 100644 dependencies/symfony/cache/Traits/RedisTrait.php delete mode 100644 dependencies/symfony/deprecation-contracts/function.php delete mode 100644 dependencies/symfony/event-dispatcher-contracts/Event.php delete mode 100644 dependencies/symfony/event-dispatcher-contracts/EventDispatcherInterface.php delete mode 100644 dependencies/symfony/event-dispatcher/Attribute/AsEventListener.php delete mode 100644 dependencies/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php delete mode 100644 dependencies/symfony/event-dispatcher/Debug/WrappedListener.php delete mode 100644 dependencies/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php delete mode 100644 dependencies/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php delete mode 100644 dependencies/symfony/event-dispatcher/EventDispatcher.php delete mode 100644 dependencies/symfony/event-dispatcher/EventDispatcherInterface.php delete mode 100644 dependencies/symfony/event-dispatcher/EventSubscriberInterface.php delete mode 100644 dependencies/symfony/event-dispatcher/GenericEvent.php delete mode 100644 dependencies/symfony/event-dispatcher/ImmutableEventDispatcher.php delete mode 100644 dependencies/symfony/event-dispatcher/LegacyEventDispatcherProxy.php delete mode 100644 dependencies/symfony/polyfill-mbstring/Mbstring.php delete mode 100644 dependencies/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php delete mode 100644 dependencies/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php delete mode 100644 dependencies/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php delete mode 100644 dependencies/symfony/polyfill-mbstring/Resources/unidata/upperCase.php delete mode 100644 dependencies/symfony/polyfill-mbstring/bootstrap.php delete mode 100644 dependencies/symfony/polyfill-mbstring/bootstrap80.php delete mode 100644 dependencies/symfony/polyfill-php73/Php73.php delete mode 100644 dependencies/symfony/polyfill-php73/Resources/stubs/JsonException.php delete mode 100644 dependencies/symfony/polyfill-php73/bootstrap.php delete mode 100644 dependencies/symfony/polyfill-php80/Php80.php delete mode 100644 dependencies/symfony/polyfill-php80/PhpToken.php delete mode 100644 dependencies/symfony/polyfill-php80/Resources/stubs/Attribute.php delete mode 100644 dependencies/symfony/polyfill-php80/Resources/stubs/PhpToken.php delete mode 100644 dependencies/symfony/polyfill-php80/Resources/stubs/Stringable.php delete mode 100644 dependencies/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php delete mode 100644 dependencies/symfony/polyfill-php80/Resources/stubs/ValueError.php delete mode 100644 dependencies/symfony/polyfill-php80/bootstrap.php delete mode 100644 dependencies/symfony/polyfill-php81/Php81.php delete mode 100644 dependencies/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php delete mode 100644 dependencies/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php delete mode 100644 dependencies/symfony/polyfill-php81/bootstrap.php delete mode 100644 dependencies/symfony/process/Exception/ExceptionInterface.php delete mode 100644 dependencies/symfony/process/Exception/InvalidArgumentException.php delete mode 100644 dependencies/symfony/process/Exception/LogicException.php delete mode 100644 dependencies/symfony/process/Exception/ProcessFailedException.php delete mode 100644 dependencies/symfony/process/Exception/ProcessSignaledException.php delete mode 100644 dependencies/symfony/process/Exception/ProcessTimedOutException.php delete mode 100644 dependencies/symfony/process/Exception/RuntimeException.php delete mode 100644 dependencies/symfony/process/ExecutableFinder.php delete mode 100644 dependencies/symfony/process/InputStream.php delete mode 100644 dependencies/symfony/process/PhpExecutableFinder.php delete mode 100644 dependencies/symfony/process/PhpProcess.php delete mode 100644 dependencies/symfony/process/Pipes/AbstractPipes.php delete mode 100644 dependencies/symfony/process/Pipes/PipesInterface.php delete mode 100644 dependencies/symfony/process/Pipes/UnixPipes.php delete mode 100644 dependencies/symfony/process/Pipes/WindowsPipes.php delete mode 100644 dependencies/symfony/process/Process.php delete mode 100644 dependencies/symfony/process/ProcessUtils.php delete mode 100644 dependencies/symfony/service-contracts/Attribute/Required.php delete mode 100644 dependencies/symfony/service-contracts/Attribute/SubscribedService.php delete mode 100644 dependencies/symfony/service-contracts/ResetInterface.php delete mode 100644 dependencies/symfony/service-contracts/ServiceLocatorTrait.php delete mode 100644 dependencies/symfony/service-contracts/ServiceProviderInterface.php delete mode 100644 dependencies/symfony/service-contracts/ServiceSubscriberInterface.php delete mode 100644 dependencies/symfony/service-contracts/ServiceSubscriberTrait.php delete mode 100644 dependencies/symfony/service-contracts/Test/ServiceLocatorTest.php delete mode 100644 dependencies/symfony/service-contracts/Test/ServiceLocatorTestCase.php delete mode 100644 dependencies/symfony/translation-contracts/LocaleAwareInterface.php delete mode 100644 dependencies/symfony/translation-contracts/Test/TranslatorTest.php delete mode 100644 dependencies/symfony/translation-contracts/TranslatableInterface.php delete mode 100644 dependencies/symfony/translation-contracts/TranslatorInterface.php delete mode 100644 dependencies/symfony/translation-contracts/TranslatorTrait.php delete mode 100644 dependencies/symfony/translation/Catalogue/AbstractOperation.php delete mode 100644 dependencies/symfony/translation/Catalogue/MergeOperation.php delete mode 100644 dependencies/symfony/translation/Catalogue/OperationInterface.php delete mode 100644 dependencies/symfony/translation/Catalogue/TargetOperation.php delete mode 100644 dependencies/symfony/translation/CatalogueMetadataAwareInterface.php delete mode 100644 dependencies/symfony/translation/Command/TranslationPullCommand.php delete mode 100644 dependencies/symfony/translation/Command/TranslationPushCommand.php delete mode 100644 dependencies/symfony/translation/Command/TranslationTrait.php delete mode 100644 dependencies/symfony/translation/Command/XliffLintCommand.php delete mode 100644 dependencies/symfony/translation/DataCollector/TranslationDataCollector.php delete mode 100644 dependencies/symfony/translation/DataCollectorTranslator.php delete mode 100644 dependencies/symfony/translation/DependencyInjection/TranslationDumperPass.php delete mode 100644 dependencies/symfony/translation/DependencyInjection/TranslationExtractorPass.php delete mode 100644 dependencies/symfony/translation/DependencyInjection/TranslatorPass.php delete mode 100644 dependencies/symfony/translation/DependencyInjection/TranslatorPathsPass.php delete mode 100644 dependencies/symfony/translation/Dumper/CsvFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/DumperInterface.php delete mode 100644 dependencies/symfony/translation/Dumper/FileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/IcuResFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/IniFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/JsonFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/MoFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/PhpFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/PoFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/QtFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/XliffFileDumper.php delete mode 100644 dependencies/symfony/translation/Dumper/YamlFileDumper.php delete mode 100644 dependencies/symfony/translation/Exception/ExceptionInterface.php delete mode 100644 dependencies/symfony/translation/Exception/IncompleteDsnException.php delete mode 100644 dependencies/symfony/translation/Exception/InvalidArgumentException.php delete mode 100644 dependencies/symfony/translation/Exception/InvalidResourceException.php delete mode 100644 dependencies/symfony/translation/Exception/LogicException.php delete mode 100644 dependencies/symfony/translation/Exception/MissingRequiredOptionException.php delete mode 100644 dependencies/symfony/translation/Exception/NotFoundResourceException.php delete mode 100644 dependencies/symfony/translation/Exception/ProviderException.php delete mode 100644 dependencies/symfony/translation/Exception/ProviderExceptionInterface.php delete mode 100644 dependencies/symfony/translation/Exception/RuntimeException.php delete mode 100644 dependencies/symfony/translation/Exception/UnsupportedSchemeException.php delete mode 100644 dependencies/symfony/translation/Extractor/AbstractFileExtractor.php delete mode 100644 dependencies/symfony/translation/Extractor/ChainExtractor.php delete mode 100644 dependencies/symfony/translation/Extractor/ExtractorInterface.php delete mode 100644 dependencies/symfony/translation/Extractor/PhpAstExtractor.php delete mode 100644 dependencies/symfony/translation/Extractor/PhpExtractor.php delete mode 100644 dependencies/symfony/translation/Extractor/PhpStringTokenParser.php delete mode 100644 dependencies/symfony/translation/Extractor/Visitor/AbstractVisitor.php delete mode 100644 dependencies/symfony/translation/Extractor/Visitor/ConstraintVisitor.php delete mode 100644 dependencies/symfony/translation/Extractor/Visitor/TransMethodVisitor.php delete mode 100644 dependencies/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php delete mode 100644 dependencies/symfony/translation/Formatter/IntlFormatter.php delete mode 100644 dependencies/symfony/translation/Formatter/IntlFormatterInterface.php delete mode 100644 dependencies/symfony/translation/Formatter/MessageFormatter.php delete mode 100644 dependencies/symfony/translation/Formatter/MessageFormatterInterface.php delete mode 100644 dependencies/symfony/translation/IdentityTranslator.php delete mode 100644 dependencies/symfony/translation/Loader/ArrayLoader.php delete mode 100644 dependencies/symfony/translation/Loader/CsvFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/FileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/IcuDatFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/IcuResFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/IniFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/JsonFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/LoaderInterface.php delete mode 100644 dependencies/symfony/translation/Loader/MoFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/PhpFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/PoFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/QtFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/XliffFileLoader.php delete mode 100644 dependencies/symfony/translation/Loader/YamlFileLoader.php delete mode 100644 dependencies/symfony/translation/LocaleSwitcher.php delete mode 100644 dependencies/symfony/translation/LoggingTranslator.php delete mode 100644 dependencies/symfony/translation/MessageCatalogue.php delete mode 100644 dependencies/symfony/translation/MessageCatalogueInterface.php delete mode 100644 dependencies/symfony/translation/MetadataAwareInterface.php delete mode 100644 dependencies/symfony/translation/Provider/AbstractProviderFactory.php delete mode 100644 dependencies/symfony/translation/Provider/Dsn.php delete mode 100644 dependencies/symfony/translation/Provider/FilteringProvider.php delete mode 100644 dependencies/symfony/translation/Provider/NullProvider.php delete mode 100644 dependencies/symfony/translation/Provider/NullProviderFactory.php delete mode 100644 dependencies/symfony/translation/Provider/ProviderFactoryInterface.php delete mode 100644 dependencies/symfony/translation/Provider/ProviderInterface.php delete mode 100644 dependencies/symfony/translation/Provider/TranslationProviderCollection.php delete mode 100644 dependencies/symfony/translation/Provider/TranslationProviderCollectionFactory.php delete mode 100644 dependencies/symfony/translation/PseudoLocalizationTranslator.php delete mode 100644 dependencies/symfony/translation/Reader/TranslationReader.php delete mode 100644 dependencies/symfony/translation/Reader/TranslationReaderInterface.php delete mode 100644 dependencies/symfony/translation/Resources/data/parents.json delete mode 100644 dependencies/symfony/translation/Resources/functions.php delete mode 100644 dependencies/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd delete mode 100644 dependencies/symfony/translation/Resources/schemas/xliff-core-2.0.xsd delete mode 100644 dependencies/symfony/translation/Resources/schemas/xml.xsd delete mode 100644 dependencies/symfony/translation/Test/ProviderFactoryTestCase.php delete mode 100644 dependencies/symfony/translation/Test/ProviderTestCase.php delete mode 100644 dependencies/symfony/translation/TranslatableMessage.php delete mode 100644 dependencies/symfony/translation/Translator.php delete mode 100644 dependencies/symfony/translation/TranslatorBag.php delete mode 100644 dependencies/symfony/translation/TranslatorBagInterface.php delete mode 100644 dependencies/symfony/translation/Util/ArrayConverter.php delete mode 100644 dependencies/symfony/translation/Util/XliffUtils.php delete mode 100644 dependencies/symfony/translation/Writer/TranslationWriter.php delete mode 100644 dependencies/symfony/translation/Writer/TranslationWriterInterface.php delete mode 100644 dependencies/symfony/var-exporter/Exception/ClassNotFoundException.php delete mode 100644 dependencies/symfony/var-exporter/Exception/ExceptionInterface.php delete mode 100644 dependencies/symfony/var-exporter/Exception/LogicException.php delete mode 100644 dependencies/symfony/var-exporter/Exception/NotInstantiableTypeException.php delete mode 100644 dependencies/symfony/var-exporter/Hydrator.php delete mode 100644 dependencies/symfony/var-exporter/Instantiator.php delete mode 100644 dependencies/symfony/var-exporter/Internal/Exporter.php delete mode 100644 dependencies/symfony/var-exporter/Internal/Hydrator.php delete mode 100644 dependencies/symfony/var-exporter/Internal/LazyObjectRegistry.php delete mode 100644 dependencies/symfony/var-exporter/Internal/LazyObjectState.php delete mode 100644 dependencies/symfony/var-exporter/Internal/LazyObjectTrait.php delete mode 100644 dependencies/symfony/var-exporter/Internal/Reference.php delete mode 100644 dependencies/symfony/var-exporter/Internal/Registry.php delete mode 100644 dependencies/symfony/var-exporter/Internal/Values.php delete mode 100644 dependencies/symfony/var-exporter/LazyGhostTrait.php delete mode 100644 dependencies/symfony/var-exporter/LazyObjectInterface.php delete mode 100644 dependencies/symfony/var-exporter/LazyProxyTrait.php delete mode 100644 dependencies/symfony/var-exporter/ProxyHelper.php delete mode 100644 dependencies/symfony/var-exporter/VarExporter.php delete mode 100644 dependencies/webmozart/assert/src/Assert.php delete mode 100644 dependencies/webmozart/assert/src/InvalidArgumentException.php delete mode 100644 dependencies/webmozart/assert/src/Mixin.php delete mode 100644 dependencies/woocommerce/action-scheduler/action-scheduler.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionClaim.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AdminView.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Compatibility.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DataController.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Exception.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_FatalErrorMonitor.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_InvalidActionException.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ListTable.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_LogEntry.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_NullLogEntry.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_OptionLock.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Versions.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/ActionScheduler_wcSystemStatus.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Clean_Command.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/WP_CLI/Migration_Command.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/WP_CLI/ProgressBar.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Lock.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_Action.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_NullAction.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/ActionMigrator.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/BatchFetcher.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/Config.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/Controller.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/DryRun_ActionMigrator.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/DryRun_LogMigrator.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/LogMigrator.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/Runner.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/migration/Scheduler.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_Schedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_SimpleSchedule.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php delete mode 100644 dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php delete mode 100644 dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php delete mode 100644 dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_AdminView_Deprecated.php delete mode 100644 dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Schedule_Deprecated.php delete mode 100644 dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php delete mode 100644 dependencies/woocommerce/action-scheduler/deprecated/functions.php delete mode 100644 dependencies/woocommerce/action-scheduler/functions.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/WP_Async_Request.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_HoursField.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MonthField.php delete mode 100644 dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_YearField.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Autoloader.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Extension.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Panel.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginExtension.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginPanel.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/ThemePanel.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Factory.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/InstalledPackage.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Metadata.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/OAuthSignature.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Info.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Package.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Ui.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Update.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/UpdateChecker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Scheduler.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/StateStore.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Package.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Update.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/UpdateChecker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Update.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpdateChecker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpgraderStatus.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Utils.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Api.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/BaseChecker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/BitBucketApi.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitHubApi.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitLabApi.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/PluginUpdateChecker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Reference.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/ThemeUpdateChecker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/css/puc-debug-bar.css delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/js/debug-bar.js delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/load-v4p11.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/plugin-update-checker.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/vendor/Parsedown.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownLegacy.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownModern.php delete mode 100644 dependencies/yahnis-elsts/plugin-update-checker/vendor/PucReadmeParser.php create mode 100644 patches/berlindb-core-src-database-column-php.patch create mode 100644 patches/berlindb-core-src-database-query-php.patch create mode 100644 patches/jasny-sso-src-broker-cookies-php.patch diff --git a/composer.json b/composer.json index 1061b5a..652ae1e 100644 --- a/composer.json +++ b/composer.json @@ -1,57 +1,93 @@ { - "name": "devstone/wp-multisite-waas", - "url": "https://wpmultisitewaas.org", - "description": "The WordPress Multisite Website as a Service (WaaS) plugin.", - "version": "2.3.3", - "authors": [ - { - "name": "Arindo Duque", - "email": "arindo@wpultimo.com", - "homepage": "https://wpultimo.com" + "name": "devstone/wp-multisite-waas", + "url": "https://wpmultisitewaas.org", + "description": "The WordPress Multisite Website as a Service (WaaS) plugin.", + "version": "2.3.3", + "authors": [ + { + "name": "Arindo Duque", + "email": "arindo@wpultimo.com", + "homepage": "https://wpultimo.com" + }, + { + "name": "David Stone", + "homepage": "https://github.com/superdav42" + } + ], + "license": [ + "GPL-3.0-or-later" + ], + "type": "wordpress-plugin", + "require": { + "php": ">=7.4.30", + "automattic/jetpack-autoloader": "^5.0.0", + "rpnzl/arrch": "dev-master#994258bbefb7722243211654c4f78813312cd5ed", + "amphp/amp": "v2.6.2", + "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master#069163f215743c83381613749ace0c5a642720b4", + "psr/log": "2.0.0", + "delight-im/cookie": "v3.4.0", + "berlindb/core": "2.0.1", + "spatie/ssl-certificate": "1.22.1", + "mexitek/phpcolors": "v1.0.4", + "nesbot/carbon": "2.71.0", + "phpdocumentor/reflection-docblock": "5.3.0", + "stripe/stripe-php": "v10.21.0", + "hashids/hashids": "4.1.0", + "rakit/validation": "dev-master#ff003a35cdf5030a5f2482299f4c93f344a35b29", + "ifsnop/mysqldump-php": "v2.12", + "mpdf/mpdf": "v8.2.0", + "remotelyliving/php-dns": "4.3.0", + "jasny/sso": "v0.4.2", + "nyholm/psr7": "1.8.0", + "symfony/cache": "v5.4.29", + "scssphp/scssphp": "v1.11.1", + "cweagans/composer-patches": "^1.7" }, - { - "name": "David Stone", - "homepage": "https://github.com/superdav42" + "require-dev": { + "composer/installers": "1.9.0", + "phpunit/phpunit": "^9.6.22", + "yoast/phpunit-polyfills": "^1.1.3", + "woocommerce/woocommerce-sniffs": "^1.0.0", + "symplify/vendor-patches": "^11.3" + }, + "config": { + "allow-plugins": { + "composer/installers": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "automattic/jetpack-autoloader": true, + "cweagans/composer-patches": true + } + }, + "archive": { + "exclude": [ + "tests", + "bin", + "phpunit.xml.dist", + "composer.lock", + ".phpcs.xml.dist", + ".circleci", + "vendor", + "addons", + ".idea", + "node_modules", + ".gitignore", + ".phpcs.xml.dist", + ".phpunit.result.cache", + "build.sh", + "package.json", + "package-lock.json", + "setuptest.sh" + ] + }, + "extra": { + "patches": { + "jasny/sso": [ + "patches/jasny-sso-src-broker-cookies-php.patch" + ], + "berlindb/core": [ + "patches/berlindb-core-src-database-query-php.patch", + "patches/berlindb-core-src-database-column-php.patch" + ] + } } - ], - "license": [ - "GPL-3.0-or-later" - ], - "type": "wordpress-plugin", - "require": { - "php": ">=7.4.30" - }, - "require-dev": { - "composer/installers": "1.9.0", - "phpunit/phpunit": "^9.6.22", - "yoast/phpunit-polyfills": "^1.1.3", - "woocommerce/woocommerce-sniffs": "^1.0.0" - }, - "config": { - "allow-plugins": { - "composer/installers": true, - "dealerdirect/phpcodesniffer-composer-installer": true - } - }, - "archive": { - "exclude": [ - "tests", - "bin", - "phpunit.xml.dist", - "composer.lock", - ".phpcs.xml.dist", - ".circleci", - "vendor", - "addons", - ".idea", - "node_modules", - ".gitignore", - ".phpcs.xml.dist", - ".phpunit.result.cache", - "build.sh", - "package.json", - "package-lock.json", - "setuptest.sh" - ] - } -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index d8181bf..610ecd4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,82 +4,1480 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d6f0a8bb3b133fd90db3039d7b73a2be", - "packages": [], - "packages-dev": [ + "content-hash": "7a7141c5e0cdde9ed25f89f257d99c49", + "packages": [ { - "name": "10up/wp_mock", - "version": "1.0.1", + "name": "amphp/amp", + "version": "v2.6.2", "source": { "type": "git", - "url": "https://github.com/10up/wp_mock.git", - "reference": "48b7f22934a4351e45e336f09263ee27fc9ddcbe" + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/10up/wp_mock/zipball/48b7f22934a4351e45e336f09263ee27fc9ddcbe", - "reference": "48b7f22934a4351e45e336f09263ee27fc9ddcbe", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", "shasum": "" }, "require": { - "antecedent/patchwork": "^2.1", - "mockery/mockery": "^1.6", - "php": ">=7.4 < 9", - "phpunit/phpunit": "^9.6" + "php": ">=7.1" }, "require-dev": { - "behat/behat": "^v3.11.0", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7", - "friendsofphp/php-cs-fixer": "^3.4", - "php-coveralls/php-coveralls": "^v2.7", - "php-stubs/wordpress-globals": "^0.2", - "php-stubs/wordpress-stubs": "^6.3", - "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "sebastian/comparator": "^4.0.8", - "sempro/phpunit-pretty-print": "^1.4" + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "automattic/jetpack-autoloader", + "version": "v5.0.1", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-autoloader.git", + "reference": "ba3f5146426367c718312a0da87ebd596ed9cf33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-autoloader/zipball/ba3f5146426367c718312a0da87ebd596ed9cf33", + "reference": "ba3f5146426367c718312a0da87ebd596ed9cf33", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.2", + "php": ">=7.2" + }, + "require-dev": { + "automattic/jetpack-changelogger": "^5.1.0", + "composer/composer": "^2.2", + "yoast/phpunit-polyfills": "^1.1.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Automattic\\Jetpack\\Autoloader\\CustomAutoloaderPlugin", + "autotagger": true, + "mirror-repo": "Automattic/jetpack-autoloader", + "branch-alias": { + "dev-trunk": "5.0.x-dev" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-autoloader/compare/v${old}...v${new}" + }, + "version-constants": { + "::VERSION": "src/AutoloadGenerator.php" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Autoloader\\": "src" + }, + "classmap": [ + "src/AutoloadGenerator.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Creates a custom autoloader for a plugin or theme.", + "keywords": [ + "autoload", + "autoloader", + "composer", + "jetpack", + "plugin", + "wordpress" + ], + "support": { + "source": "https://github.com/Automattic/jetpack-autoloader/tree/v5.0.1" + }, + "time": "2025-01-20T16:46:39+00:00" + }, + { + "name": "berlindb/core", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/berlindb/core.git", + "reference": "7dcddaddcffb69c58800d2fb3f6f169791cab1f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/berlindb/core/zipball/7dcddaddcffb69c58800d2fb3f6f169791cab1f7", + "reference": "7dcddaddcffb69c58800d2fb3f6f169791cab1f7", + "shasum": "" }, "type": "library", "autoload": { "psr-4": { - "WP_Mock\\": "./php/WP_Mock" - }, - "classmap": [ - "php/WP_Mock.php" - ] + "BerlinDB\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A collection of PHP classes and functions that aims to provide an ORM-like experience and interface to WordPress database tables.", + "support": { + "issues": "https://github.com/berlindb/core/issues", + "source": "https://github.com/berlindb/core/tree/2.0.1" + }, + "time": "2022-03-10T21:12:11+00:00" + }, + { + "name": "cweagans/composer-patches", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/cweagans/composer-patches.git", + "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db", + "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3.0" + }, + "require-dev": { + "composer/composer": "~1.0 || ~2.0", + "phpunit/phpunit": "~4.6" + }, + "type": "composer-plugin", + "extra": { + "class": "cweagans\\Composer\\Patches" + }, + "autoload": { + "psr-4": { + "cweagans\\Composer\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "description": "A mocking library to take the pain out of unit testing for WordPress", + "authors": [ + { + "name": "Cameron Eagans", + "email": "me@cweagans.net" + } + ], + "description": "Provides a way to patch Composer packages.", "support": { - "issues": "https://github.com/10up/wp_mock/issues", - "source": "https://github.com/10up/wp_mock/tree/1.0.1" + "issues": "https://github.com/cweagans/composer-patches/issues", + "source": "https://github.com/cweagans/composer-patches/tree/1.7.3" }, - "time": "2024-01-22T02:22:57+00:00" + "time": "2022-12-20T22:53:13+00:00" }, { - "name": "antecedent/patchwork", - "version": "2.2.1", + "name": "delight-im/cookie", + "version": "v3.4.0", "source": { "type": "git", - "url": "https://github.com/antecedent/patchwork.git", - "reference": "1bf183a3e1bd094f231a2128b9ecc5363c269245" + "url": "https://github.com/delight-im/PHP-Cookie.git", + "reference": "67065d34272377d63bab0bd58f984f9b228c803f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antecedent/patchwork/zipball/1bf183a3e1bd094f231a2128b9ecc5363c269245", - "reference": "1bf183a3e1bd094f231a2128b9ecc5363c269245", + "url": "https://api.github.com/repos/delight-im/PHP-Cookie/zipball/67065d34272377d63bab0bd58f984f9b228c803f", + "reference": "67065d34272377d63bab0bd58f984f9b228c803f", "shasum": "" }, "require": { - "php": ">=7.1.0" + "delight-im/http": "^2.0", + "php": ">=5.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Delight\\Cookie\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Modern cookie management for PHP", + "homepage": "https://github.com/delight-im/PHP-Cookie", + "keywords": [ + "cookie", + "cookies", + "csrf", + "http", + "same-site", + "samesite", + "xss" + ], + "support": { + "issues": "https://github.com/delight-im/PHP-Cookie/issues", + "source": "https://github.com/delight-im/PHP-Cookie/tree/v3.4.0" + }, + "time": "2020-04-16T11:01:26+00:00" + }, + { + "name": "delight-im/http", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/delight-im/PHP-HTTP.git", + "reference": "a5c2c4eae1dd3207f797984e8f64f2d71ed889dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/delight-im/PHP-HTTP/zipball/a5c2c4eae1dd3207f797984e8f64f2d71ed889dd", + "reference": "a5c2c4eae1dd3207f797984e8f64f2d71ed889dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Delight\\Http\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hypertext Transfer Protocol (HTTP) utilities for PHP", + "homepage": "https://github.com/delight-im/PHP-HTTP", + "keywords": [ + "headers", + "http", + "https" + ], + "support": { + "issues": "https://github.com/delight-im/PHP-HTTP/issues", + "source": "https://github.com/delight-im/PHP-HTTP/tree/v2.1.0" + }, + "time": "2021-10-12T18:52:29+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": ">=4" + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-05-21T12:31:43+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "hashids/hashids", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/vinkla/hashids.git", + "reference": "8cab111f78e0bd9c76953b082919fc9e251761be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vinkla/hashids/zipball/8cab111f78e0bd9c76953b082919fc9e251761be", + "reference": "8cab111f78e0bd9c76953b082919fc9e251761be", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0 || ^9.4", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-bcmath": "Required to use BC Math arbitrary precision mathematics (*).", + "ext-gmp": "Required to use GNU multiple precision mathematics (*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hashids\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivan Akimov", + "email": "ivan@barreleye.com" + }, + { + "name": "Vincent Klaiber", + "email": "hello@doubledip.se" + } + ], + "description": "Generate short, unique, non-sequential ids (like YouTube and Bitly) from numbers", + "homepage": "https://hashids.org/php", + "keywords": [ + "bitly", + "decode", + "encode", + "hash", + "hashid", + "hashids", + "ids", + "obfuscate", + "youtube" + ], + "support": { + "issues": "https://github.com/vinkla/hashids/issues", + "source": "https://github.com/vinkla/hashids/tree/4.1.0" + }, + "time": "2020-11-26T19:24:33+00:00" + }, + { + "name": "ifsnop/mysqldump-php", + "version": "v2.12", + "source": { + "type": "git", + "url": "https://github.com/ifsnop/mysqldump-php.git", + "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ifsnop/mysqldump-php/zipball/2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", + "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8.36", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ifsnop\\": "src/Ifsnop/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Diego Torres", + "homepage": "https://github.com/ifsnop", + "role": "Developer" + } + ], + "description": "PHP version of mysqldump cli that comes with MySQL", + "homepage": "https://github.com/ifsnop/mysqldump-php", + "keywords": [ + "PHP7", + "database", + "hhvm", + "mariadb", + "mysql", + "mysql-backup", + "mysqldump", + "pdo", + "php", + "php5", + "sql" + ], + "support": { + "issues": "https://github.com/ifsnop/mysqldump-php/issues", + "source": "https://github.com/ifsnop/mysqldump-php/tree/v2.12" + }, + "time": "2023-04-12T07:43:14+00:00" + }, + { + "name": "jasny/immutable", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/jasny/immutable.git", + "reference": "1a4ffb42bea73ea5d318f39b3a5dd283aec063f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jasny/immutable/zipball/1a4ffb42bea73ea5d318f39b3a5dd283aec063f9", + "reference": "1a4ffb42bea73ea5d318f39b3a5dd283aec063f9", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "jasny/php-code-quality": "^2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jasny\\Immutable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arnold Daniels", + "email": "arnold@jasny.net", + "homepage": "http://www.jasny.net" + } + ], + "description": "Helper methods for immutable objects", + "support": { + "issues": "https://github.com/jasny/immutable/issues", + "source": "https://github.com/jasny/immutable" + }, + "time": "2020-01-27T09:41:29+00:00" + }, + { + "name": "jasny/sso", + "version": "v0.4.2", + "source": { + "type": "git", + "url": "https://github.com/jasny/sso.git", + "reference": "fb4f0916911b00797425237abfb073ffee8cba1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jasny/sso/zipball/fb4f0916911b00797425237abfb073ffee8cba1c", + "reference": "fb4f0916911b00797425237abfb073ffee8cba1c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "jasny/immutable": "^2.1", + "php": ">=7.3.0", + "psr/log": "*", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "codeception/codeception": "^4.1", + "codeception/module-phpbrowser": "^1.0", + "codeception/module-rest": "^1.2", + "desarrolla2/cache": "^3.0", + "jasny/http-message": "^1.3", + "jasny/php-code-quality": "^2.6.0", + "jasny/phpunit-extension": "^0.3.2", + "phpstan/phpstan": "^0.12.59", + "yubb/loggy": "^2.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jasny\\SSO\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arnold Daniels", + "email": "arnold@jasny.net", + "homepage": "http://www.jasny.net" + } + ], + "description": "Simple Single Sign-On", + "homepage": "https://github.com/jasny/sso/wiki", + "keywords": [ + "SSO", + "auth" + ], + "support": { + "issues": "https://github.com/jasny/sso/issues", + "source": "https://github.com/jasny/sso" + }, + "time": "2022-04-30T18:31:10+00:00" + }, + { + "name": "mexitek/phpcolors", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/mexitek/phpColors.git", + "reference": "4043974240ca7dc3c2bec3c158588148b605b206" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mexitek/phpColors/zipball/4043974240ca7dc3c2bec3c158588148b605b206", + "reference": "4043974240ca7dc3c2bec3c158588148b605b206", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "nette/tester": "^2.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arlo Carreon", + "homepage": "http://arlocarreon.com", + "role": "creator" + } + ], + "description": "A series of methods that let you manipulate colors. Just incase you ever need different shades of one color on the fly.", + "homepage": "http://mexitek.github.com/phpColors/", + "keywords": [ + "color", + "css", + "design", + "frontend", + "ui" + ], + "support": { + "issues": "https://github.com/mexitek/phpColors/issues", + "source": "https://github.com/mexitek/phpColors" + }, + "time": "2021-11-26T13:19:08+00:00" + }, + { + "name": "mpdf/mpdf", + "version": "v8.2.0", + "source": { + "type": "git", + "url": "https://github.com/mpdf/mpdf.git", + "reference": "170a236a588d177c2aa7447ce490a030ca68e6f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/170a236a588d177c2aa7447ce490a030ca68e6f4", + "reference": "170a236a588d177c2aa7447ce490a030ca68e6f4", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "mpdf/psr-http-message-shim": "^1.0 || ^2.0", + "mpdf/psr-log-aware-trait": "^2.0 || ^3.0", + "myclabs/deep-copy": "^1.7", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "setasign/fpdi": "^2.1" + }, + "require-dev": { + "mockery/mockery": "^1.3.0", + "mpdf/qrcode": "^1.1.0", + "squizlabs/php_codesniffer": "^3.5.0", + "tracy/tracy": "~2.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-bcmath": "Needed for generation of some types of barcodes", + "ext-xml": "Needed mainly for SVG manipulation", + "ext-zlib": "Needed for compression of embedded resources, such as fonts" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Mpdf\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Matěj Humpál", + "role": "Developer, maintainer" + }, + { + "name": "Ian Back", + "role": "Developer (retired)" + } + ], + "description": "PHP library generating PDF files from UTF-8 encoded HTML", + "homepage": "https://mpdf.github.io", + "keywords": [ + "pdf", + "php", + "utf-8" + ], + "support": { + "docs": "http://mpdf.github.io", + "issues": "https://github.com/mpdf/mpdf/issues", + "source": "https://github.com/mpdf/mpdf" + }, + "funding": [ + { + "url": "https://www.paypal.me/mpdf", + "type": "custom" + } + ], + "time": "2023-09-01T11:44:52+00:00" + }, + { + "name": "mpdf/psr-http-message-shim", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-http-message-shim.git", + "reference": "f25a0153d645e234f9db42e5433b16d9b113920f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f", + "reference": "f25a0153d645e234f9db42e5433b16d9b113920f", + "shasum": "" + }, + "require": { + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrHttpMessageShim\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + }, + { + "name": "Nigel Cunningham", + "email": "nigel.cunningham@technocrat.com.au" + } + ], + "description": "Shim to allow support of different psr/message versions.", + "support": { + "issues": "https://github.com/mpdf/psr-http-message-shim/issues", + "source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1" + }, + "time": "2023-10-02T14:34:03+00:00" + }, + { + "name": "mpdf/psr-log-aware-trait", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-log-aware-trait.git", + "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/7a077416e8f39eb626dee4246e0af99dd9ace275", + "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275", + "shasum": "" + }, + "require": { + "psr/log": "^1.0 || ^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrLogAwareTrait\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + } + ], + "description": "Trait to allow support of different psr/log versions.", + "support": { + "issues": "https://github.com/mpdf/psr-log-aware-trait/issues", + "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v2.0.0" + }, + "time": "2023-05-03T06:18:28+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.71.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "98276233188583f2ff845a0f992a235472d9466a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-09-25T11:31:05+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2023-05-02T11:26:24+00:00" + }, + { + "name": "pablo-sg-pacheco/wp-namespace-autoloader", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader.git", + "reference": "069163f215743c83381613749ace0c5a642720b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pablo-sg-pacheco/wp-namespace-autoloader/zipball/069163f215743c83381613749ace0c5a642720b4", + "reference": "069163f215743c83381613749ace0c5a642720b4", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "require-dev": { + "cweagans/composer-patches": "^1.0", + "dealerdirect/phpcodesniffer-composer-installer": "0.7.0", + "phpunit/phpunit": "^7", + "squizlabs/php_codesniffer": "dev-master", + "wp-coding-standards/wpcs": "^2.3" + }, + "default-branch": true, + "type": "library", + "extra": { + "patches": { + "squizlabs/php_codesniffer": { + "Add GitHub Actions Annotations report type": "https://github.com/squizlabs/PHP_CodeSniffer/pull/2918.patch" + } + } + }, + "autoload": { + "psr-4": { + "Pablo_Pacheco\\WP_Namespace_Autoloader\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPLv2" + ], + "authors": [ + { + "name": "Pablo dos S G Pacheco", + "email": "pablo.sg.pacheco@gmail.com" + } + ], + "description": "A PHP autoloader class that follows the WordPress coding standards 2.0 and proposed 3.0 for class/interface/trait names and filenames", + "homepage": "https://github.com/pablo-pacheco/wp-namespace-autoloader", + "keywords": [ + "autoload", + "namespace", + "wordpress", + "wp" + ], + "support": { + "issues": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader/issues", + "source": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader/tree/master" + }, + "time": "2022-12-02T14:49:51+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", "notification-url": "https://packagist.org/downloads/", @@ -88,27 +1486,2380 @@ ], "authors": [ { - "name": "Ignas Rudaitis", - "email": "ignas.rudaitis@gmail.com" + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" } ], - "description": "Method redefinition (monkey-patching) functionality for PHP.", - "homepage": "https://antecedent.github.io/patchwork/", + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ - "aop", - "aspect", - "interception", - "monkeypatching", - "redefinition", - "runkit", - "testing" + "csprng", + "polyfill", + "pseudorandom", + "random" ], "support": { - "issues": "https://github.com/antecedent/patchwork/issues", - "source": "https://github.com/antecedent/patchwork/tree/2.2.1" + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" }, - "time": "2024-12-11T10:19:54+00:00" + "time": "2020-10-15T08:29:30+00:00" }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", + "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" + }, + "time": "2024-10-13T11:29:49+00:00" + }, + { + "name": "psr/cache", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/2.0.0" + }, + "time": "2021-02-03T23:23:37+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+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": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "rakit/validation", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/rakit/validation.git", + "reference": "ff003a35cdf5030a5f2482299f4c93f344a35b29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rakit/validation/zipball/ff003a35cdf5030a5f2482299f4c93f344a35b29", + "reference": "ff003a35cdf5030a5f2482299f4c93f344a35b29", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^6.5", + "squizlabs/php_codesniffer": "^3" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Rakit\\Validation\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Muhammad Syifa", + "email": "emsifa@gmail.com" + } + ], + "description": "PHP Laravel like standalone validation library", + "support": { + "issues": "https://github.com/rakit/validation/issues", + "source": "https://github.com/rakit/validation/tree/master" + }, + "time": "2020-08-27T05:07:01+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "remotelyliving/php-dns", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/remotelyliving/php-dns.git", + "reference": "fa1eebebe6275487e947cd2109874ce960dd7717" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/remotelyliving/php-dns/zipball/fa1eebebe6275487e947cd2109874ce960dd7717", + "reference": "fa1eebebe6275487e947cd2109874ce960dd7717", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/guzzle": "^7.0 || ^6.0", + "guzzlehttp/promises": "^1.3", + "php": ">=7.4", + "psr/cache": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "spatie/dns": "^1.5", + "symfony/event-dispatcher": "^6.0 || ^5.0 || ^4.0 || ^3.0" + }, + "require-dev": { + "bmitch/churn-php": "^1.5", + "maglnet/composer-require-checker": "@stable", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^9.0", + "psy/psysh": "^0.9.9", + "rector/rector": "^0.12.8", + "squizlabs/php_codesniffer": "^3.3", + "symfony/cache": "^4.3", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "RemotelyLiving\\PHPDNS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "chthomas", + "email": "christian.h.thomas@me.com" + } + ], + "description": "A php library for abstracting DNS querying", + "support": { + "issues": "https://github.com/remotelyliving/php-dns/issues", + "source": "https://github.com/remotelyliving/php-dns/tree/4.3.0" + }, + "time": "2021-12-22T02:56:43+00:00" + }, + { + "name": "rpnzl/arrch", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/rpnzl/arrch.git", + "reference": "994258bbefb7722243211654c4f78813312cd5ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rpnzl/arrch/zipball/994258bbefb7722243211654c4f78813312cd5ed", + "reference": "994258bbefb7722243211654c4f78813312cd5ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-0": { + "Arrch": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Giuliana", + "email": "mike@rpnzl.com", + "homepage": "http://rpnzl.com", + "role": "Developer" + } + ], + "description": "Array queries for PHP 5.3", + "homepage": "https://github.com/rpnzl/arrch", + "keywords": [ + "array", + "query", + "search" + ], + "support": { + "issues": "https://github.com/rpnzl/arrch/issues", + "source": "https://github.com/rpnzl/arrch/tree/master" + }, + "time": "2014-08-26T16:32:28+00:00" + }, + { + "name": "scssphp/scssphp", + "version": "v1.11.1", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "ace2503684bab0dcc817d7614c8a54b865122414" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/ace2503684bab0dcc817d7614c8a54b865122414", + "reference": "ace2503684bab0dcc817d7614c8a54b865122414", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^5.1", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "~5.0", + "twbs/bootstrap4": "4.6.1", + "zurb/foundation": "~6.7.0" + }, + "suggest": { + "ext-iconv": "Can be used as fallback when ext-mbstring is not available", + "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" + }, + "bin": [ + "bin/pscss" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "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": "http://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/v1.11.1" + }, + "time": "2023-09-24T13:38:17+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "9e013b376939c0d4029f54150d2a16f3c67a5797" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/9e013b376939c0d4029f54150d2a16f3c67a5797", + "reference": "9e013b376939c0d4029f54150d2a16f3c67a5797", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "~5.7", + "setasign/fpdf": "~1.8.6", + "setasign/tfpdf": "~1.33", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "~6.2" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2024-12-10T13:12:19+00:00" + }, + { + "name": "spatie/dns", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/dns.git", + "reference": "2ca388f359323364aaf438a5fa28da74bc55c6f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/dns/zipball/2ca388f359323364aaf438a5fa28da74bc55c6f4", + "reference": "2ca388f359323364aaf438a5fa28da74bc55c6f4", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/process": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Harish Toshniwal", + "email": "harish@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Retrieve DNS records", + "homepage": "https://github.com/spatie/dns", + "keywords": [ + "dns", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/dns/issues", + "source": "https://github.com/spatie/dns/tree/1.6.0" + }, + "time": "2020-12-02T19:24:48+00:00" + }, + { + "name": "spatie/macroable", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "7a99549fc001c925714b329220dea680c04bfa48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/7a99549fc001c925714b329220dea680c04bfa48", + "reference": "7a99549fc001c925714b329220dea680c04bfa48", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/1.0.1" + }, + "time": "2020-11-03T10:15:05+00:00" + }, + { + "name": "spatie/ssl-certificate", + "version": "1.22.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ssl-certificate.git", + "reference": "c4756c3f18f9abeea62cfe99fc841229d9fead2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ssl-certificate/zipball/c4756c3f18f9abeea62cfe99fc841229d9fead2c", + "reference": "c4756c3f18f9abeea62cfe99fc841229d9fead2c", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "ext-json": "*", + "nesbot/carbon": "^2.23", + "php": "^7.4|^8.0", + "spatie/macroable": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0", + "spatie/phpunit-snapshot-assertions": "^4.2.3" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\SslCertificate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A class to easily query the properties of an ssl certificate", + "homepage": "https://github.com/spatie/ssl-certificate", + "keywords": [ + "spatie", + "ssl-certificate" + ], + "support": { + "issues": "https://github.com/spatie/ssl-certificate/issues", + "source": "https://github.com/spatie/ssl-certificate/tree/1.22.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2021-02-15T15:42:15+00:00" + }, + { + "name": "stripe/stripe-php", + "version": "v10.21.0", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "b4ab319731958077227fad1874a3671458c5d593" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/b4ab319731958077227fad1874a3671458c5d593", + "reference": "b4ab319731958077227fad1874a3671458c5d593", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.5.0", + "php-coveralls/php-coveralls": "^2.5", + "phpstan/phpstan": "^1.2", + "phpunit/phpunit": "^5.7 || ^9.0", + "squizlabs/php_codesniffer": "^3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Stripe\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "support": { + "issues": "https://github.com/stripe/stripe-php/issues", + "source": "https://github.com/stripe/stripe-php/tree/v10.21.0" + }, + "time": "2023-08-11T00:23:24+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.4.29", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151", + "reference": "e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.4.29" + }, + "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": "2023-09-19T13:25:51+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e", + "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4" + }, + "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-25T14:11:13+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + }, + "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-25T14:20:29+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" + }, + "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-25T14:18:03+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + }, + "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-25T14:20:29+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-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/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.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/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/process", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.47" + }, + "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-11-06T11:36:42+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + }, + "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-25T14:20:29+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.13" + }, + "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-27T18:14:25+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + }, + "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-25T14:20:29+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" + }, + "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-25T14:18:03+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ { "name": "composer/installers", "version": "v1.9.0", @@ -398,200 +4149,6 @@ ], "time": "2022-12-30T00:23:10+00:00" }, - { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "shasum": "" - }, - "require": { - "php": "^5.3|^7.0|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" - }, - "time": "2020-07-09T08:09:16+00:00" - }, - { - "name": "mockery/mockery", - "version": "1.6.12", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "shasum": "" - }, - "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": ">=7.3" - }, - "conflict": { - "phpunit/phpunit": "<8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.17", - "symplify/easy-coding-standard": "^12.1.14" - }, - "type": "library", - "autoload": { - "files": [ - "library/helpers.php", - "library/Mockery.php" - ], - "psr-4": { - "Mockery\\": "library/Mockery" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "https://github.com/padraic", - "role": "Author" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "https://davedevelopment.co.uk", - "role": "Developer" - }, - { - "name": "Nathanael Esayeas", - "email": "nathanael.esayeas@protonmail.com", - "homepage": "https://github.com/ghostwriter", - "role": "Lead Developer" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "support": { - "docs": "https://docs.mockery.io/", - "issues": "https://github.com/mockery/mockery/issues", - "rss": "https://github.com/mockery/mockery/releases.atom", - "security": "https://github.com/mockery/mockery/security/advisories", - "source": "https://github.com/mockery/mockery" - }, - "time": "2024-05-16T03:13:13+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.12.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-11-08T17:47:46+00:00" - }, { "name": "nikic/php-parser", "version": "v5.4.0", @@ -904,16 +4461,16 @@ }, { "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "01c1ff2704a58e46f0cb1ca9d06aee07b3589082" + "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/01c1ff2704a58e46f0cb1ca9d06aee07b3589082", - "reference": "01c1ff2704a58e46f0cb1ca9d06aee07b3589082", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/80ccb1a7640995edf1b87a4409fa584cd5869469", + "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469", "shasum": "" }, "require": { @@ -970,7 +4527,7 @@ "type": "open_collective" } ], - "time": "2024-04-24T21:37:59+00:00" + "time": "2025-01-16T22:34:19+00:00" }, { "name": "phpcsstandards/phpcsextra", @@ -2525,16 +6082,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.11.2", + "version": "3.11.3", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079" + "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/1368f4a58c3c52114b86b1abe8f4098869cb0079", - "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", + "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", "shasum": "" }, "require": { @@ -2599,9 +6156,56 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-12-11T16:04:26+00:00" + "time": "2025-01-23T17:04:15+00:00" + }, + { + "name": "symplify/vendor-patches", + "version": "11.3.7", + "source": { + "type": "git", + "url": "https://github.com/symplify/vendor-patches.git", + "reference": "dec8ec588192a3ee0d886288395b5cd6a768126e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symplify/vendor-patches/zipball/dec8ec588192a3ee0d886288395b5cd6a768126e", + "reference": "dec8ec588192a3ee0d886288395b5cd6a768126e", + "shasum": "" + }, + "require": { + "cweagans/composer-patches": "^1.7", + "php": ">=7.2" + }, + "bin": [ + "bin/vendor-patches" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generate vendor patches for packages with single command", + "support": { + "issues": "https://github.com/symplify/vendor-patches/issues", + "source": "https://github.com/symplify/vendor-patches/tree/11.3.7" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-01-23T17:12:30+00:00" }, { "name": "theseer/tokenizer", @@ -2824,7 +6428,11 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": { + "pablo-sg-pacheco/wp-namespace-autoloader": 20, + "rakit/validation": 20, + "rpnzl/arrch": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/dependencies/amphp/amp/lib/CallableMaker.php b/dependencies/amphp/amp/lib/CallableMaker.php deleted file mode 100644 index 85beaba..0000000 --- a/dependencies/amphp/amp/lib/CallableMaker.php +++ /dev/null @@ -1,75 +0,0 @@ -getMethod($method); - } - return self::$__reflectionMethods[$method]->getClosure($this); - } - /** - * Creates a callable from a protected or private static method that may be invoked by methods requiring a - * publicly invokable callback. - * - * @param string $method Static method name. - * - * @return callable - * - * @psalm-suppress MixedInferredReturnType - */ - private static function callableFromStaticMethod(string $method) : callable - { - if (!isset(self::$__reflectionMethods[$method])) { - if (self::$__reflectionClass === null) { - self::$__reflectionClass = new \ReflectionClass(self::class); - } - self::$__reflectionMethods[$method] = self::$__reflectionClass->getMethod($method); - } - return self::$__reflectionMethods[$method]->getClosure(); - } - } -} else { - /** @psalm-suppress DuplicateClass */ - trait CallableMaker - { - /** - * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. - */ - private function callableFromInstanceMethod(string $method) : callable - { - return \Closure::fromCallable([$this, $method]); - } - /** - * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. - */ - private static function callableFromStaticMethod(string $method) : callable - { - return \Closure::fromCallable([self::class, $method]); - } - } -} -// @codeCoverageIgnoreEnd diff --git a/dependencies/amphp/amp/lib/CancellationToken.php b/dependencies/amphp/amp/lib/CancellationToken.php deleted file mode 100644 index 02fe92e..0000000 --- a/dependencies/amphp/amp/lib/CancellationToken.php +++ /dev/null @@ -1,46 +0,0 @@ -getToken(); - * - * $response = yield $httpClient->request("https://example.com/stream", $token); - * $responseBody = $response->getBody(); - * - * while (($chunk = yield $response->read()) !== null) { - * // consume $chunk - * - * if ($noLongerInterested) { - * $cancellationTokenSource->cancel(); - * break; - * } - * } - * ``` - * - * @see CancellationToken - * @see CancelledException - */ -final class CancellationTokenSource -{ - /** @var CancellationToken */ - private $token; - /** @var callable|null */ - private $onCancel; - public function __construct() - { - $onCancel = null; - $this->token = new class($onCancel) implements CancellationToken - { - /** @var string */ - private $nextId = "a"; - /** @var callable[] */ - private $callbacks = []; - /** @var \Throwable|null */ - private $exception; - /** - * @param mixed $onCancel - * @param-out callable $onCancel - */ - public function __construct(&$onCancel) - { - /** @psalm-suppress MissingClosureReturnType We still support PHP 7.0 */ - $onCancel = function (\Throwable $exception) { - $this->exception = $exception; - $callbacks = $this->callbacks; - $this->callbacks = []; - foreach ($callbacks as $callback) { - $this->invokeCallback($callback); - } - }; - } - /** - * @param callable $callback - * - * @return void - */ - private function invokeCallback(callable $callback) - { - // No type declaration to prevent exception outside the try! - try { - /** @var mixed $result */ - $result = $callback($this->exception); - if ($result instanceof \Generator) { - /** @psalm-var \Generator $result */ - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use($exception) { - throw $exception; - }); - } - } - public function subscribe(callable $callback) : string - { - $id = $this->nextId++; - if ($this->exception) { - $this->invokeCallback($callback); - } else { - $this->callbacks[$id] = $callback; - } - return $id; - } - public function unsubscribe(string $id) - { - unset($this->callbacks[$id]); - } - public function isRequested() : bool - { - return isset($this->exception); - } - public function throwIfRequested() - { - if (isset($this->exception)) { - throw $this->exception; - } - } - }; - $this->onCancel = $onCancel; - } - public function getToken() : CancellationToken - { - return $this->token; - } - /** - * @param \Throwable|null $previous Exception to be used as the previous exception to CancelledException. - * - * @return void - */ - public function cancel(\Throwable $previous = null) - { - if ($this->onCancel === null) { - return; - } - $onCancel = $this->onCancel; - $this->onCancel = null; - $onCancel(new CancelledException($previous)); - } -} diff --git a/dependencies/amphp/amp/lib/CancelledException.php b/dependencies/amphp/amp/lib/CancelledException.php deleted file mode 100644 index 9263cc2..0000000 --- a/dependencies/amphp/amp/lib/CancelledException.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ -final class Coroutine implements Promise -{ - use Internal\Placeholder; - /** - * Attempts to transform the non-promise yielded from the generator into a promise, otherwise returns an instance - * `Amp\Failure` failed with an instance of `Amp\InvalidYieldError`. - * - * @param mixed $yielded Non-promise yielded from generator. - * @param \Generator $generator No type for performance, we already know the type. - * - * @return Promise - */ - private static function transform($yielded, $generator) : Promise - { - $exception = null; - // initialize here, see https://github.com/vimeo/psalm/issues/2951 - try { - if (\is_array($yielded)) { - return Promise\all($yielded); - } - if ($yielded instanceof ReactPromise) { - return Promise\adapt($yielded); - } - // No match, continue to returning Failure below. - } catch (\Throwable $exception) { - // Conversion to promise failed, fall-through to returning Failure below. - } - return new Failure(new InvalidYieldError($generator, \sprintf("Unexpected yield; Expected an instance of %s or %s or an array of such instances", Promise::class, ReactPromise::class), $exception)); - } - /** - * @param \Generator $generator - * @psalm-param \Generator,mixed,Promise|ReactPromise|TReturn> $generator - */ - public function __construct(\Generator $generator) - { - try { - $yielded = $generator->current(); - if (!$yielded instanceof Promise) { - if (!$generator->valid()) { - $this->resolve($generator->getReturn()); - return; - } - $yielded = self::transform($yielded, $generator); - } - } catch (\Throwable $exception) { - $this->fail($exception); - return; - } - /** - * @param \Throwable|null $e Exception to be thrown into the generator. - * @param mixed $v Value to be sent into the generator. - * - * @return void - * - * @psalm-suppress MissingClosureParamType - * @psalm-suppress MissingClosureReturnType - */ - $onResolve = function (\Throwable $e = null, $v) use($generator, &$onResolve) { - /** @var bool $immediate Used to control iterative coroutine continuation. */ - static $immediate = \true; - /** @var \Throwable|null $exception Promise failure reason when executing next coroutine step, null at all other times. */ - static $exception; - /** @var mixed $value Promise success value when executing next coroutine step, null at all other times. */ - static $value; - $exception = $e; - /** @psalm-suppress MixedAssignment */ - $value = $v; - if (!$immediate) { - $immediate = \true; - return; - } - try { - try { - do { - if ($exception) { - // Throw exception at current execution point. - $yielded = $generator->throw($exception); - } else { - // Send the new value and execute to next yield statement. - $yielded = $generator->send($value); - } - if (!$yielded instanceof Promise) { - if (!$generator->valid()) { - $this->resolve($generator->getReturn()); - $onResolve = null; - return; - } - $yielded = self::transform($yielded, $generator); - } - $immediate = \false; - $yielded->onResolve($onResolve); - } while ($immediate); - $immediate = \true; - } catch (\Throwable $exception) { - $this->fail($exception); - $onResolve = null; - } finally { - $exception = null; - $value = null; - } - } catch (\Throwable $e) { - Loop::defer(static function () use($e) { - throw $e; - }); - } - }; - try { - $yielded->onResolve($onResolve); - unset($generator, $yielded, $onResolve); - } catch (\Throwable $e) { - Loop::defer(static function () use($e) { - throw $e; - }); - } - } -} diff --git a/dependencies/amphp/amp/lib/Deferred.php b/dependencies/amphp/amp/lib/Deferred.php deleted file mode 100644 index a334b03..0000000 --- a/dependencies/amphp/amp/lib/Deferred.php +++ /dev/null @@ -1,70 +0,0 @@ - Has public resolve and fail methods. */ - private $resolver; - /** @var Promise Hides placeholder methods */ - private $promise; - public function __construct() - { - $this->resolver = new class implements Promise - { - use Internal\Placeholder { - resolve as public; - fail as public; - isResolved as public; - } - }; - $this->promise = new Internal\PrivatePromise($this->resolver); - } - /** - * @return Promise - */ - public function promise() : Promise - { - return $this->promise; - } - /** - * Fulfill the promise with the given value. - * - * @param mixed $value - * - * @psalm-param TValue|Promise $value - * - * @return void - */ - public function resolve($value = null) - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->resolver->resolve($value); - } - /** - * Fails the promise the the given reason. - * - * @param \Throwable $reason - * - * @return void - */ - public function fail(\Throwable $reason) - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->resolver->fail($reason); - } - /** - * @return bool True if the promise has been resolved. - */ - public function isResolved() : bool - { - return $this->resolver->isResolved(); - } -} diff --git a/dependencies/amphp/amp/lib/Delayed.php b/dependencies/amphp/amp/lib/Delayed.php deleted file mode 100644 index 2b71a42..0000000 --- a/dependencies/amphp/amp/lib/Delayed.php +++ /dev/null @@ -1,52 +0,0 @@ - - */ -final class Delayed implements Promise -{ - use Internal\Placeholder; - /** @var string|null Event loop watcher identifier. */ - private $watcher; - /** - * @param int $time Milliseconds before succeeding the promise. - * @param TReturn $value Succeed the promise with this value. - */ - public function __construct(int $time, $value = null) - { - $this->watcher = Loop::delay($time, function () use($value) { - $this->watcher = null; - $this->resolve($value); - }); - } - /** - * References the internal watcher in the event loop, keeping the loop running while this promise is pending. - * - * @return self - */ - public function reference() : self - { - if ($this->watcher !== null) { - Loop::reference($this->watcher); - } - return $this; - } - /** - * Unreferences the internal watcher in the event loop, allowing the loop to stop while this promise is pending if - * no other events are pending in the loop. - * - * @return self - */ - public function unreference() : self - { - if ($this->watcher !== null) { - Loop::unreference($this->watcher); - } - return $this; - } -} diff --git a/dependencies/amphp/amp/lib/Emitter.php b/dependencies/amphp/amp/lib/Emitter.php deleted file mode 100644 index 15e6762..0000000 --- a/dependencies/amphp/amp/lib/Emitter.php +++ /dev/null @@ -1,78 +0,0 @@ - Has public emit, complete, and fail methods. */ - private $emitter; - /** @var Iterator Hides producer methods. */ - private $iterator; - public function __construct() - { - $this->emitter = new class implements Iterator - { - use Internal\Producer { - emit as public; - complete as public; - fail as public; - } - }; - $this->iterator = new Internal\PrivateIterator($this->emitter); - } - /** - * @return Iterator - * @psalm-return Iterator - */ - public function iterate() : Iterator - { - return $this->iterator; - } - /** - * Emits a value to the iterator. - * - * @param mixed $value - * - * @psalm-param TValue $value - * - * @return Promise - * @psalm-return Promise - * @psalm-suppress MixedInferredReturnType - * @psalm-suppress MixedReturnStatement - */ - public function emit($value) : Promise - { - /** @psalm-suppress UndefinedInterfaceMethod */ - return $this->emitter->emit($value); - } - /** - * Completes the iterator. - * - * @return void - */ - public function complete() - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->emitter->complete(); - } - /** - * Fails the iterator with the given reason. - * - * @param \Throwable $reason - * - * @return void - */ - public function fail(\Throwable $reason) - { - /** @psalm-suppress UndefinedInterfaceMethod */ - $this->emitter->fail($reason); - } -} diff --git a/dependencies/amphp/amp/lib/Failure.php b/dependencies/amphp/amp/lib/Failure.php deleted file mode 100644 index 78dce59..0000000 --- a/dependencies/amphp/amp/lib/Failure.php +++ /dev/null @@ -1,46 +0,0 @@ - - */ -final class Failure implements Promise -{ - /** @var \Throwable $exception */ - private $exception; - /** - * @param \Throwable $exception Rejection reason. - */ - public function __construct(\Throwable $exception) - { - $this->exception = $exception; - } - /** - * {@inheritdoc} - */ - public function onResolve(callable $onResolved) - { - try { - /** @var mixed $result */ - $result = $onResolved($this->exception, null); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use($exception) { - throw $exception; - }); - } - } -} diff --git a/dependencies/amphp/amp/lib/Internal/Placeholder.php b/dependencies/amphp/amp/lib/Internal/Placeholder.php deleted file mode 100644 index 0ae8d97..0000000 --- a/dependencies/amphp/amp/lib/Internal/Placeholder.php +++ /dev/null @@ -1,159 +0,0 @@ -, mixed, - * mixed>|null)|callable(\Throwable|null, mixed): void */ - private $onResolved; - /** @var null|array */ - private $resolutionTrace; - /** - * @inheritdoc - */ - public function onResolve(callable $onResolved) - { - if ($this->resolved) { - if ($this->result instanceof Promise) { - $this->result->onResolve($onResolved); - return; - } - try { - /** @var mixed $result */ - $result = $onResolved(null, $this->result); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use($exception) { - throw $exception; - }); - } - return; - } - if (null === $this->onResolved) { - $this->onResolved = $onResolved; - return; - } - if (!$this->onResolved instanceof ResolutionQueue) { - /** @psalm-suppress InternalClass */ - $this->onResolved = new ResolutionQueue($this->onResolved); - } - /** @psalm-suppress InternalMethod */ - $this->onResolved->push($onResolved); - } - public function __destruct() - { - try { - $this->result = null; - } catch (\Throwable $e) { - Loop::defer(static function () use($e) { - throw $e; - }); - } - } - /** - * @param mixed $value - * - * @return void - * - * @throws \Error Thrown if the promise has already been resolved. - */ - private function resolve($value = null) - { - if ($this->resolved) { - $message = "Promise has already been resolved"; - if (isset($this->resolutionTrace)) { - $trace = formatStacktrace($this->resolutionTrace); - $message .= ". Previous resolution trace:\n\n{$trace}\n\n"; - } else { - // @codeCoverageIgnoreStart - $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " . "for a stacktrace of the previous resolution."; - // @codeCoverageIgnoreEnd - } - throw new \Error($message); - } - \assert((function () { - $env = \getenv("AMP_DEBUG") ?: "0"; - if ($env !== "0" && $env !== "false" || \defined("AMP_DEBUG") && \AMP_DEBUG) { - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - \array_shift($trace); - // remove current closure - $this->resolutionTrace = $trace; - } - return \true; - })()); - if ($value instanceof ReactPromise) { - $value = Promise\adapt($value); - } - $this->resolved = \true; - $this->result = $value; - if ($this->onResolved === null) { - return; - } - $onResolved = $this->onResolved; - $this->onResolved = null; - if ($this->result instanceof Promise) { - $this->result->onResolve($onResolved); - return; - } - try { - /** @var mixed $result */ - $result = $onResolved(null, $this->result); - $onResolved = null; - // allow garbage collection of $onResolved, to catch any exceptions from destructors - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use($exception) { - throw $exception; - }); - } - } - /** - * @param \Throwable $reason Failure reason. - * - * @return void - */ - private function fail(\Throwable $reason) - { - $this->resolve(new Failure($reason)); - } - /** - * @return bool True if the placeholder has been resolved. - */ - private function isResolved() : bool - { - return $this->resolved; - } -} diff --git a/dependencies/amphp/amp/lib/Internal/PrivateIterator.php b/dependencies/amphp/amp/lib/Internal/PrivateIterator.php deleted file mode 100644 index 3f2f1ff..0000000 --- a/dependencies/amphp/amp/lib/Internal/PrivateIterator.php +++ /dev/null @@ -1,41 +0,0 @@ - - */ -final class PrivateIterator implements Iterator -{ - /** @var Iterator */ - private $iterator; - /** - * @param Iterator $iterator - * - * @psalm-param Iterator $iterator - */ - public function __construct(Iterator $iterator) - { - $this->iterator = $iterator; - } - /** - * @return Promise - */ - public function advance() : Promise - { - return $this->iterator->advance(); - } - /** - * @psalm-return TValue - */ - public function getCurrent() - { - return $this->iterator->getCurrent(); - } -} diff --git a/dependencies/amphp/amp/lib/Internal/PrivatePromise.php b/dependencies/amphp/amp/lib/Internal/PrivatePromise.php deleted file mode 100644 index 777ed5d..0000000 --- a/dependencies/amphp/amp/lib/Internal/PrivatePromise.php +++ /dev/null @@ -1,22 +0,0 @@ -promise = $promise; - } - public function onResolve(callable $onResolved) - { - $this->promise->onResolve($onResolved); - } -} diff --git a/dependencies/amphp/amp/lib/Internal/Producer.php b/dependencies/amphp/amp/lib/Internal/Producer.php deleted file mode 100644 index 757499f..0000000 --- a/dependencies/amphp/amp/lib/Internal/Producer.php +++ /dev/null @@ -1,173 +0,0 @@ - - */ - public function advance() : Promise - { - if ($this->waiting !== null) { - throw new \Error("The prior promise returned must resolve before invoking this method again"); - } - unset($this->values[$this->consumePosition]); - $position = ++$this->consumePosition; - if (\array_key_exists($position, $this->values)) { - \assert(isset($this->backPressure[$position])); - $deferred = $this->backPressure[$position]; - unset($this->backPressure[$position]); - $deferred->resolve(); - return new Success(\true); - } - if ($this->complete) { - return $this->complete; - } - $this->waiting = new Deferred(); - return $this->waiting->promise(); - } - /** - * {@inheritdoc} - * - * @return TValue - */ - public function getCurrent() - { - if (empty($this->values) && $this->complete) { - throw new \Error("The iterator has completed"); - } - if (!\array_key_exists($this->consumePosition, $this->values)) { - throw new \Error("Promise returned from advance() must resolve before calling this method"); - } - return $this->values[$this->consumePosition]; - } - /** - * Emits a value from the iterator. The returned promise is resolved once the emitted value has been consumed. - * - * @param mixed $value - * - * @return Promise - * @psalm-return Promise - * - * @throws \Error If the iterator has completed. - */ - private function emit($value) : Promise - { - if ($this->complete) { - throw new \Error("Iterators cannot emit values after calling complete"); - } - if ($value instanceof ReactPromise) { - $value = Promise\adapt($value); - } - if ($value instanceof Promise) { - $deferred = new Deferred(); - $value->onResolve(function ($e, $v) use($deferred) { - if ($this->complete) { - $deferred->fail(new \Error("The iterator was completed before the promise result could be emitted")); - return; - } - if ($e) { - $this->fail($e); - $deferred->fail($e); - return; - } - $deferred->resolve($this->emit($v)); - }); - return $deferred->promise(); - } - $position = ++$this->emitPosition; - $this->values[$position] = $value; - if ($this->waiting !== null) { - $waiting = $this->waiting; - $this->waiting = null; - $waiting->resolve(\true); - return new Success(); - // Consumer was already waiting for a new value, so back-pressure is unnecessary. - } - $this->backPressure[$position] = $pressure = new Deferred(); - return $pressure->promise(); - } - /** - * Completes the iterator. - * - * @return void - * - * @throws \Error If the iterator has already been completed. - */ - private function complete() - { - if ($this->complete) { - $message = "Iterator has already been completed"; - if (isset($this->resolutionTrace)) { - $trace = formatStacktrace($this->resolutionTrace); - $message .= ". Previous completion trace:\n\n{$trace}\n\n"; - } else { - // @codeCoverageIgnoreStart - $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " . "for a stacktrace of the previous resolution."; - // @codeCoverageIgnoreEnd - } - throw new \Error($message); - } - \assert((function () { - $env = \getenv("AMP_DEBUG") ?: "0"; - if ($env !== "0" && $env !== "false" || \defined("AMP_DEBUG") && \AMP_DEBUG) { - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - \array_shift($trace); - // remove current closure - $this->resolutionTrace = $trace; - } - return \true; - })()); - $this->complete = new Success(\false); - if ($this->waiting !== null) { - $waiting = $this->waiting; - $this->waiting = null; - $waiting->resolve($this->complete); - } - } - /** - * @param \Throwable $exception - * - * @return void - */ - private function fail(\Throwable $exception) - { - $this->complete = new Failure($exception); - if ($this->waiting !== null) { - $waiting = $this->waiting; - $this->waiting = null; - $waiting->resolve($this->complete); - } - } -} diff --git a/dependencies/amphp/amp/lib/Internal/ResolutionQueue.php b/dependencies/amphp/amp/lib/Internal/ResolutionQueue.php deleted file mode 100644 index 8de8b44..0000000 --- a/dependencies/amphp/amp/lib/Internal/ResolutionQueue.php +++ /dev/null @@ -1,82 +0,0 @@ -, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void> */ - private $queue = []; - /** - * @param callable|null $callback Initial callback to add to queue. - * - * @psalm-param null|callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void $callback - */ - public function __construct(callable $callback = null) - { - if ($callback !== null) { - $this->push($callback); - } - } - /** - * Unrolls instances of self to avoid blowing up the call stack on resolution. - * - * @param callable $callback - * - * @psalm-param callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void $callback - * - * @return void - */ - public function push(callable $callback) - { - if ($callback instanceof self) { - $this->queue = \array_merge($this->queue, $callback->queue); - return; - } - $this->queue[] = $callback; - } - /** - * Calls each callback in the queue, passing the provided values to the function. - * - * @param \Throwable|null $exception - * @param mixed $value - * - * @return void - */ - public function __invoke($exception, $value) - { - foreach ($this->queue as $callback) { - try { - $result = $callback($exception, $value); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use($exception) { - throw $exception; - }); - } - } - } -} diff --git a/dependencies/amphp/amp/lib/Internal/functions.php b/dependencies/amphp/amp/lib/Internal/functions.php deleted file mode 100644 index 0fe4db3..0000000 --- a/dependencies/amphp/amp/lib/Internal/functions.php +++ /dev/null @@ -1,94 +0,0 @@ - $trace Output of - * `debug_backtrace()`. - * - * @return string Formatted stacktrace. - * - * @codeCoverageIgnore - * @internal - */ -function formatStacktrace(array $trace) : string -{ - return \implode("\n", \array_map(static function ($e, $i) { - $line = "#{$i} "; - if (isset($e["file"])) { - $line .= "{$e['file']}:{$e['line']} "; - } - if (isset($e["type"])) { - $line .= $e["class"] . $e["type"]; - } - return $line . $e["function"] . "()"; - }, $trace, \array_keys($trace))); -} -/** - * Creates a `TypeError` with a standardized error message. - * - * @param string[] $expected Expected types. - * @param mixed $given Given value. - * - * @return \TypeError - * - * @internal - */ -function createTypeError(array $expected, $given) : \TypeError -{ - $givenType = \is_object($given) ? \sprintf("instance of %s", \get_class($given)) : \gettype($given); - if (\count($expected) === 1) { - $expectedType = "Expected the following type: " . \array_pop($expected); - } else { - $expectedType = "Expected one of the following types: " . \implode(", ", $expected); - } - return new \TypeError("{$expectedType}; {$givenType} given"); -} -/** - * Returns the current time relative to an arbitrary point in time. - * - * @return int Time in milliseconds. - */ -function getCurrentTime() : int -{ - /** @var int|null $startTime */ - static $startTime; - /** @var int|null $nextWarning */ - static $nextWarning; - if (\PHP_INT_SIZE === 4) { - // @codeCoverageIgnoreStart - if ($startTime === null) { - $startTime = \PHP_VERSION_ID >= 70300 ? \hrtime(\false)[0] : \time(); - $nextWarning = \PHP_INT_MAX - 86400 * 7; - } - if (\PHP_VERSION_ID >= 70300) { - list($seconds, $nanoseconds) = \hrtime(\false); - $seconds -= $startTime; - if ($seconds >= $nextWarning) { - $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; - \trigger_error("getCurrentTime() will overflow in {$timeToOverflow} seconds, please restart the process before that. " . "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", \E_USER_WARNING); - /** @psalm-suppress PossiblyNullOperand */ - $nextWarning += 600; - // every 10 minutes - } - return (int) ($seconds * 1000 + $nanoseconds / 1000000); - } - $seconds = \microtime(\true) - $startTime; - if ($seconds >= $nextWarning) { - $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; - \trigger_error("getCurrentTime() will overflow in {$timeToOverflow} seconds, please restart the process before that. " . "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", \E_USER_WARNING); - /** @psalm-suppress PossiblyNullOperand */ - $nextWarning += 600; - // every 10 minutes - } - return (int) ($seconds * 1000); - // @codeCoverageIgnoreEnd - } - if (\PHP_VERSION_ID >= 70300) { - list($seconds, $nanoseconds) = \hrtime(\false); - return (int) ($seconds * 1000 + $nanoseconds / 1000000); - } - return (int) (\microtime(\true) * 1000); -} diff --git a/dependencies/amphp/amp/lib/InvalidYieldError.php b/dependencies/amphp/amp/lib/InvalidYieldError.php deleted file mode 100644 index 0be1b46..0000000 --- a/dependencies/amphp/amp/lib/InvalidYieldError.php +++ /dev/null @@ -1,27 +0,0 @@ -current(); - $prefix .= \sprintf("; %s yielded at key %s", \is_object($yielded) ? \get_class($yielded) : \gettype($yielded), \var_export($generator->key(), \true)); - if (!$generator->valid()) { - parent::__construct($prefix, 0, $previous); - return; - } - $reflGen = new \ReflectionGenerator($generator); - $exeGen = $reflGen->getExecutingGenerator(); - if ($isSubgenerator = $exeGen !== $generator) { - $reflGen = new \ReflectionGenerator($exeGen); - } - parent::__construct(\sprintf("%s on line %s in %s", $prefix, $reflGen->getExecutingLine(), $reflGen->getExecutingFile()), 0, $previous); - } -} diff --git a/dependencies/amphp/amp/lib/Iterator.php b/dependencies/amphp/amp/lib/Iterator.php deleted file mode 100644 index a6ff499..0000000 --- a/dependencies/amphp/amp/lib/Iterator.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * @throws \Error If the prior promise returned from this method has not resolved. - * @throws \Throwable The exception used to fail the iterator. - */ - public function advance() : Promise; - /** - * Gets the last emitted value or throws an exception if the iterator has completed. - * - * @return mixed Value emitted from the iterator. - * @psalm-return TValue - * - * @throws \Error If the iterator has resolved or advance() was not called before calling this method. - * @throws \Throwable The exception used to fail the iterator. - */ - public function getCurrent(); -} diff --git a/dependencies/amphp/amp/lib/LazyPromise.php b/dependencies/amphp/amp/lib/LazyPromise.php deleted file mode 100644 index 8ab0ceb..0000000 --- a/dependencies/amphp/amp/lib/LazyPromise.php +++ /dev/null @@ -1,38 +0,0 @@ -promisor = $promisor; - } - /** - * {@inheritdoc} - */ - public function onResolve(callable $onResolved) - { - if ($this->promise === null) { - \assert($this->promisor !== null); - $provider = $this->promisor; - $this->promisor = null; - $this->promise = call($provider); - } - \assert($this->promise !== null); - $this->promise->onResolve($onResolved); - } -} diff --git a/dependencies/amphp/amp/lib/Loop.php b/dependencies/amphp/amp/lib/Loop.php deleted file mode 100644 index b0ab435..0000000 --- a/dependencies/amphp/amp/lib/Loop.php +++ /dev/null @@ -1,425 +0,0 @@ -defer($callback); - } - self::$driver->run(); - } - /** - * Stop the event loop. - * - * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls - * to stop MUST be ignored and MUST NOT raise an exception. - * - * @return void - */ - public static function stop() - { - self::$driver->stop(); - } - /** - * Defer the execution of a callback. - * - * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be - * preserved when executing the callbacks. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param callable(string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function defer(callable $callback, $data = null) : string - { - return self::$driver->defer($callback, $data); - } - /** - * Delay the execution of a callback. - * - * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which - * timers expire first, but timers with the same expiration time MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $delay The amount of time, in milliseconds, to delay the execution for. - * @param callable(string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function delay(int $delay, callable $callback, $data = null) : string - { - return self::$driver->delay($delay, $callback, $data); - } - /** - * Repeatedly execute a callback. - * - * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be - * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. - * The first execution is scheduled after the first interval period. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $interval The time interval, in milliseconds, to wait between executions. - * @param callable(string $watcherId, mixed $data) $callback The callback to repeat. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function repeat(int $interval, callable $callback, $data = null) : string - { - return self::$driver->repeat($interval, $callback, $data); - } - /** - * Execute a callback when a stream resource becomes readable or is closed for reading. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function onReadable($stream, callable $callback, $data = null) : string - { - return self::$driver->onReadable($stream, $callback, $data); - } - /** - * Execute a callback when a stream resource becomes writable or is closed for writing. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public static function onWritable($stream, callable $callback, $data = null) : string - { - return self::$driver->onWritable($stream, $callback, $data); - } - /** - * Execute a callback when a signal is received. - * - * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. - * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical - * limitations of the signals being registered globally per process. - * - * Multiple watchers on the same signal MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $signo The signal number to monitor. - * @param callable(string $watcherId, int $signo, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the $data parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - * - * @throws UnsupportedFeatureException If signal handling is not supported. - */ - public static function onSignal(int $signo, callable $callback, $data = null) : string - { - return self::$driver->onSignal($signo, $callback, $data); - } - /** - * Enable a watcher to be active starting in the next tick. - * - * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before - * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public static function enable(string $watcherId) - { - self::$driver->enable($watcherId); - } - /** - * Disable a watcher immediately. - * - * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer - * watcher isn't executed in this tick. - * - * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an - * invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public static function disable(string $watcherId) - { - if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { - // Prior to PHP 7.2, self::$driver may be unset during destruct. - // See https://github.com/amphp/amp/issues/212. - return; - } - self::$driver->disable($watcherId); - } - /** - * Cancel a watcher. - * - * This will detatch the event loop from all resources that are associated to the watcher. After this operation the - * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public static function cancel(string $watcherId) - { - if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { - // Prior to PHP 7.2, self::$driver may be unset during destruct. - // See https://github.com/amphp/amp/issues/212. - return; - } - self::$driver->cancel($watcherId); - } - /** - * Reference a watcher. - * - * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by - * default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public static function reference(string $watcherId) - { - self::$driver->reference($watcherId); - } - /** - * Unreference a watcher. - * - * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers - * are all referenced by default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public static function unreference(string $watcherId) - { - if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { - // Prior to PHP 7.2, self::$driver may be unset during destruct. - // See https://github.com/amphp/amp/issues/212. - return; - } - self::$driver->unreference($watcherId); - } - /** - * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to - * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned - * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. - * - * @return int - */ - public static function now() : int - { - return self::$driver->now(); - } - /** - * Stores information in the loop bound registry. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * @param mixed $value The value to be stored. - * - * @return void - */ - public static function setState(string $key, $value) - { - self::$driver->setState($key, $value); - } - /** - * Gets information stored bound to the loop. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * - * @return mixed The previously stored value or `null` if it doesn't exist. - */ - public static function getState(string $key) - { - return self::$driver->getState($key); - } - /** - * Set a callback to be executed when an error occurs. - * - * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. - * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation - * MUST be thrown into the `run` loop and stop the driver. - * - * Subsequent calls to this method will overwrite the previous handler. - * - * @param callable(\Throwable $error)|null $callback The callback to execute. `null` will clear the - * current handler. - * - * @return callable(\Throwable $error)|null The previous handler, `null` if there was none. - */ - public static function setErrorHandler(callable $callback = null) - { - return self::$driver->setErrorHandler($callback); - } - /** - * Retrieve an associative array of information about the event loop driver. - * - * The returned array MUST contain the following data describing the driver's currently registered watchers: - * - * [ - * "defer" => ["enabled" => int, "disabled" => int], - * "delay" => ["enabled" => int, "disabled" => int], - * "repeat" => ["enabled" => int, "disabled" => int], - * "on_readable" => ["enabled" => int, "disabled" => int], - * "on_writable" => ["enabled" => int, "disabled" => int], - * "on_signal" => ["enabled" => int, "disabled" => int], - * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], - * "running" => bool - * ]; - * - * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format - * MUST always be provided. - * - * @return array Statistics about the loop in the described format. - */ - public static function getInfo() : array - { - return self::$driver->getInfo(); - } - /** - * Retrieve the event loop driver that is in scope. - * - * @return Driver - */ - public static function get() : Driver - { - return self::$driver; - } -} -// Default factory, don't move this to a file loaded by the composer "files" autoload mechanism, otherwise custom -// implementations might have issues setting a default loop, because it's overridden by us then. -// @codeCoverageIgnoreStart -Loop::set((new DriverFactory())->create()); -// @codeCoverageIgnoreEnd diff --git a/dependencies/amphp/amp/lib/Loop/Driver.php b/dependencies/amphp/amp/lib/Loop/Driver.php deleted file mode 100644 index 0a9488c..0000000 --- a/dependencies/amphp/amp/lib/Loop/Driver.php +++ /dev/null @@ -1,649 +0,0 @@ -running = \true; - try { - while ($this->running) { - if ($this->isEmpty()) { - return; - } - $this->tick(); - } - } finally { - $this->stop(); - } - } - /** - * @return bool True if no enabled and referenced watchers remain in the loop. - */ - private function isEmpty() : bool - { - foreach ($this->watchers as $watcher) { - if ($watcher->enabled && $watcher->referenced) { - return \false; - } - } - return \true; - } - /** - * Executes a single tick of the event loop. - * - * @return void - */ - private function tick() - { - if (empty($this->deferQueue)) { - $this->deferQueue = $this->nextTickQueue; - } else { - $this->deferQueue = \array_merge($this->deferQueue, $this->nextTickQueue); - } - $this->nextTickQueue = []; - $this->activate($this->enableQueue); - $this->enableQueue = []; - foreach ($this->deferQueue as $watcher) { - if (!isset($this->deferQueue[$watcher->id])) { - continue; - // Watcher disabled by another defer watcher. - } - unset($this->watchers[$watcher->id], $this->deferQueue[$watcher->id]); - try { - /** @var mixed $result */ - $result = ($watcher->callback)($watcher->id, $watcher->data); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - /** @psalm-suppress RedundantCondition */ - $this->dispatch(empty($this->nextTickQueue) && empty($this->enableQueue) && $this->running && !$this->isEmpty()); - } - /** - * Activates (enables) all the given watchers. - * - * @param Watcher[] $watchers - * - * @return void - */ - protected abstract function activate(array $watchers); - /** - * Dispatches any pending read/write, timer, and signal events. - * - * @param bool $blocking - * - * @return void - */ - protected abstract function dispatch(bool $blocking); - /** - * Stop the event loop. - * - * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls - * to stop MUST be ignored and MUST NOT raise an exception. - * - * @return void - */ - public function stop() - { - $this->running = \false; - } - /** - * Defer the execution of a callback. - * - * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be - * preserved when executing the callbacks. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param callable (string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function defer(callable $callback, $data = null) : string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher(); - $watcher->type = Watcher::DEFER; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->data = $data; - $this->watchers[$watcher->id] = $watcher; - $this->nextTickQueue[$watcher->id] = $watcher; - return $watcher->id; - } - /** - * Delay the execution of a callback. - * - * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which - * timers expire first, but timers with the same expiration time MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $delay The amount of time, in milliseconds, to delay the execution for. - * @param callable (string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be - * invalidated before the callback call. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function delay(int $delay, callable $callback, $data = null) : string - { - if ($delay < 0) { - throw new \Error("Delay must be greater than or equal to zero"); - } - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher(); - $watcher->type = Watcher::DELAY; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $delay; - $watcher->expiration = $this->now() + $delay; - $watcher->data = $data; - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - return $watcher->id; - } - /** - * Repeatedly execute a callback. - * - * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be - * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. - * The first execution is scheduled after the first interval period. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $interval The time interval, in milliseconds, to wait between executions. - * @param callable (string $watcherId, mixed $data) $callback The callback to repeat. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function repeat(int $interval, callable $callback, $data = null) : string - { - if ($interval < 0) { - throw new \Error("Interval must be greater than or equal to zero"); - } - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher(); - $watcher->type = Watcher::REPEAT; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $interval; - $watcher->expiration = $this->now() + $interval; - $watcher->data = $data; - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - return $watcher->id; - } - /** - * Execute a callback when a stream resource becomes readable or is closed for reading. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function onReadable($stream, callable $callback, $data = null) : string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher(); - $watcher->type = Watcher::READABLE; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $stream; - $watcher->data = $data; - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - return $watcher->id; - } - /** - * Execute a callback when a stream resource becomes writable or is closed for writing. - * - * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the - * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid - * resources, but are not required to, due to the high performance impact. Watchers on closed resources are - * therefore undefined behavior. - * - * Multiple watchers on the same stream MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param resource $stream The stream to monitor. - * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - */ - public function onWritable($stream, callable $callback, $data = null) : string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher(); - $watcher->type = Watcher::WRITABLE; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $stream; - $watcher->data = $data; - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - return $watcher->id; - } - /** - * Execute a callback when a signal is received. - * - * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. - * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical - * limitations of the signals being registered globally per process. - * - * Multiple watchers on the same signal MAY be executed in any order. - * - * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) - * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param int $signo The signal number to monitor. - * @param callable (string $watcherId, int $signo, mixed $data) $callback The callback to execute. - * @param mixed $data Arbitrary data given to the callback function as the $data parameter. - * - * @return string An unique identifier that can be used to cancel, enable or disable the watcher. - * - * @throws UnsupportedFeatureException If signal handling is not supported. - */ - public function onSignal(int $signo, callable $callback, $data = null) : string - { - /** @psalm-var Watcher $watcher */ - $watcher = new Watcher(); - $watcher->type = Watcher::SIGNAL; - $watcher->id = $this->nextId++; - $watcher->callback = $callback; - $watcher->value = $signo; - $watcher->data = $data; - $this->watchers[$watcher->id] = $watcher; - $this->enableQueue[$watcher->id] = $watcher; - return $watcher->id; - } - /** - * Enable a watcher to be active starting in the next tick. - * - * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before - * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public function enable(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - throw new InvalidWatcherError($watcherId, "Cannot enable an invalid watcher identifier: '{$watcherId}'"); - } - $watcher = $this->watchers[$watcherId]; - if ($watcher->enabled) { - return; - // Watcher already enabled. - } - $watcher->enabled = \true; - switch ($watcher->type) { - case Watcher::DEFER: - $this->nextTickQueue[$watcher->id] = $watcher; - break; - case Watcher::REPEAT: - case Watcher::DELAY: - \assert(\is_int($watcher->value)); - $watcher->expiration = $this->now() + $watcher->value; - $this->enableQueue[$watcher->id] = $watcher; - break; - default: - $this->enableQueue[$watcher->id] = $watcher; - break; - } - } - /** - * Cancel a watcher. - * - * This will detach the event loop from all resources that are associated to the watcher. After this operation the - * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public function cancel(string $watcherId) - { - $this->disable($watcherId); - unset($this->watchers[$watcherId]); - } - /** - * Disable a watcher immediately. - * - * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer - * watcher isn't executed in this tick. - * - * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an - * invalid watcher. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public function disable(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - return; - } - $watcher = $this->watchers[$watcherId]; - if (!$watcher->enabled) { - return; - // Watcher already disabled. - } - $watcher->enabled = \false; - $id = $watcher->id; - switch ($watcher->type) { - case Watcher::DEFER: - if (isset($this->nextTickQueue[$id])) { - // Watcher was only queued to be enabled. - unset($this->nextTickQueue[$id]); - } else { - unset($this->deferQueue[$id]); - } - break; - default: - if (isset($this->enableQueue[$id])) { - // Watcher was only queued to be enabled. - unset($this->enableQueue[$id]); - } else { - $this->deactivate($watcher); - } - break; - } - } - /** - * Deactivates (disables) the given watcher. - * - * @param Watcher $watcher - * - * @return void - */ - protected abstract function deactivate(Watcher $watcher); - /** - * Reference a watcher. - * - * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by - * default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - * - * @throws InvalidWatcherError If the watcher identifier is invalid. - */ - public function reference(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - throw new InvalidWatcherError($watcherId, "Cannot reference an invalid watcher identifier: '{$watcherId}'"); - } - $this->watchers[$watcherId]->referenced = \true; - } - /** - * Unreference a watcher. - * - * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers - * are all referenced by default. - * - * @param string $watcherId The watcher identifier. - * - * @return void - */ - public function unreference(string $watcherId) - { - if (!isset($this->watchers[$watcherId])) { - return; - } - $this->watchers[$watcherId]->referenced = \false; - } - /** - * Stores information in the loop bound registry. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * @param mixed $value The value to be stored. - * - * @return void - */ - public final function setState(string $key, $value) - { - if ($value === null) { - unset($this->registry[$key]); - } else { - $this->registry[$key] = $value; - } - } - /** - * Gets information stored bound to the loop. - * - * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages - * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. - * - * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated - * interface for that purpose instead of sharing the storage key. - * - * @param string $key The namespaced storage key. - * - * @return mixed The previously stored value or `null` if it doesn't exist. - */ - public final function getState(string $key) - { - return isset($this->registry[$key]) ? $this->registry[$key] : null; - } - /** - * Set a callback to be executed when an error occurs. - * - * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. - * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation - * MUST be thrown into the `run` loop and stop the driver. - * - * Subsequent calls to this method will overwrite the previous handler. - * - * @param callable(\Throwable $error):void|null $callback The callback to execute. `null` will clear the - * current handler. - * - * @return callable(\Throwable $error):void|null The previous handler, `null` if there was none. - */ - public function setErrorHandler(callable $callback = null) - { - $previous = $this->errorHandler; - $this->errorHandler = $callback; - return $previous; - } - /** - * Invokes the error handler with the given exception. - * - * @param \Throwable $exception The exception thrown from a watcher callback. - * - * @return void - * @throws \Throwable If no error handler has been set. - */ - protected function error(\Throwable $exception) - { - if ($this->errorHandler === null) { - throw $exception; - } - ($this->errorHandler)($exception); - } - /** - * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to - * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned - * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. - * - * Extending classes should override this function to return a value cached once per loop tick. - * - * @return int - */ - public function now() : int - { - return (int) (\microtime(\true) * self::MILLISEC_PER_SEC); - } - /** - * Get the underlying loop handle. - * - * Example: the `uv_loop` resource for `libuv` or the `EvLoop` object for `libev` or `null` for a native driver. - * - * Note: This function is *not* exposed in the `Loop` class. Users shall access it directly on the respective loop - * instance. - * - * @return null|object|resource The loop handle the event loop operates on. `null` if there is none. - */ - public abstract function getHandle(); - /** - * Returns the same array of data as getInfo(). - * - * @return array - */ - public function __debugInfo() - { - // @codeCoverageIgnoreStart - return $this->getInfo(); - // @codeCoverageIgnoreEnd - } - /** - * Retrieve an associative array of information about the event loop driver. - * - * The returned array MUST contain the following data describing the driver's currently registered watchers: - * - * [ - * "defer" => ["enabled" => int, "disabled" => int], - * "delay" => ["enabled" => int, "disabled" => int], - * "repeat" => ["enabled" => int, "disabled" => int], - * "on_readable" => ["enabled" => int, "disabled" => int], - * "on_writable" => ["enabled" => int, "disabled" => int], - * "on_signal" => ["enabled" => int, "disabled" => int], - * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], - * "running" => bool - * ]; - * - * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format - * MUST always be provided. - * - * @return array Statistics about the loop in the described format. - */ - public function getInfo() : array - { - $watchers = ["referenced" => 0, "unreferenced" => 0]; - $defer = $delay = $repeat = $onReadable = $onWritable = $onSignal = ["enabled" => 0, "disabled" => 0]; - foreach ($this->watchers as $watcher) { - switch ($watcher->type) { - case Watcher::READABLE: - $array =& $onReadable; - break; - case Watcher::WRITABLE: - $array =& $onWritable; - break; - case Watcher::SIGNAL: - $array =& $onSignal; - break; - case Watcher::DEFER: - $array =& $defer; - break; - case Watcher::DELAY: - $array =& $delay; - break; - case Watcher::REPEAT: - $array =& $repeat; - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - if ($watcher->enabled) { - ++$array["enabled"]; - if ($watcher->referenced) { - ++$watchers["referenced"]; - } else { - ++$watchers["unreferenced"]; - } - } else { - ++$array["disabled"]; - } - } - return ["enabled_watchers" => $watchers, "defer" => $defer, "delay" => $delay, "repeat" => $repeat, "on_readable" => $onReadable, "on_writable" => $onWritable, "on_signal" => $onSignal, "running" => (bool) $this->running]; - } -} diff --git a/dependencies/amphp/amp/lib/Loop/DriverFactory.php b/dependencies/amphp/amp/lib/Loop/DriverFactory.php deleted file mode 100644 index a5a44ca..0000000 --- a/dependencies/amphp/amp/lib/Loop/DriverFactory.php +++ /dev/null @@ -1,55 +0,0 @@ -createDriverFromEnv()) { - return $driver; - } - if (UvDriver::isSupported()) { - return new UvDriver(); - } - if (EvDriver::isSupported()) { - return new EvDriver(); - } - if (EventDriver::isSupported()) { - return new EventDriver(); - } - return new NativeDriver(); - })(); - if (\getenv("AMP_DEBUG_TRACE_WATCHERS")) { - return new TracingDriver($driver); - } - return $driver; - } - /** - * @return Driver|null - */ - private function createDriverFromEnv() - { - $driver = \getenv("AMP_LOOP_DRIVER"); - if (!$driver) { - return null; - } - if (!\class_exists($driver)) { - throw new \Error(\sprintf("Driver '%s' does not exist.", $driver)); - } - if (!\is_subclass_of($driver, Driver::class)) { - throw new \Error(\sprintf("Driver '%s' is not a subclass of '%s'.", $driver, Driver::class)); - } - return new $driver(); - } -} -// @codeCoverageIgnoreEnd diff --git a/dependencies/amphp/amp/lib/Loop/EvDriver.php b/dependencies/amphp/amp/lib/Loop/EvDriver.php deleted file mode 100644 index 82358fe..0000000 --- a/dependencies/amphp/amp/lib/Loop/EvDriver.php +++ /dev/null @@ -1,258 +0,0 @@ -handle = new \EvLoop(); - $this->nowOffset = getCurrentTime(); - $this->now = \random_int(0, $this->nowOffset); - $this->nowOffset -= $this->now; - if (self::$activeSignals === null) { - self::$activeSignals =& $this->signals; - } - /** - * @param \EvIO $event - * - * @return void - */ - $this->ioCallback = function (\EvIO $event) { - /** @var Watcher $watcher */ - $watcher = $event->data; - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - /** - * @param \EvTimer $event - * - * @return void - */ - $this->timerCallback = function (\EvTimer $event) { - /** @var Watcher $watcher */ - $watcher = $event->data; - if ($watcher->type & Watcher::DELAY) { - $this->cancel($watcher->id); - } elseif ($watcher->value === 0) { - // Disable and re-enable so it's not executed repeatedly in the same tick - // See https://github.com/amphp/amp/issues/131 - $this->disable($watcher->id); - $this->enable($watcher->id); - } - try { - $result = ($watcher->callback)($watcher->id, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - /** - * @param \EvSignal $event - * - * @return void - */ - $this->signalCallback = function (\EvSignal $event) { - /** @var Watcher $watcher */ - $watcher = $event->data; - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - } - /** - * {@inheritdoc} - */ - public function cancel(string $watcherId) - { - parent::cancel($watcherId); - unset($this->events[$watcherId]); - } - public function __destruct() - { - foreach ($this->events as $event) { - /** @psalm-suppress all */ - if ($event !== null) { - // Events may have been nulled in extension depending on destruct order. - $event->stop(); - } - } - // We need to clear all references to events manually, see - // https://bitbucket.org/osmanov/pecl-ev/issues/31/segfault-in-ev_timer_stop - $this->events = []; - } - /** - * {@inheritdoc} - */ - public function run() - { - $active = self::$activeSignals; - \assert($active !== null); - foreach ($active as $event) { - $event->stop(); - } - self::$activeSignals =& $this->signals; - foreach ($this->signals as $event) { - $event->start(); - } - try { - parent::run(); - } finally { - foreach ($this->signals as $event) { - $event->stop(); - } - self::$activeSignals =& $active; - foreach ($active as $event) { - $event->start(); - } - } - } - /** - * {@inheritdoc} - */ - public function stop() - { - $this->handle->stop(); - parent::stop(); - } - /** - * {@inheritdoc} - */ - public function now() : int - { - $this->now = getCurrentTime() - $this->nowOffset; - return $this->now; - } - /** - * {@inheritdoc} - */ - public function getHandle() : \EvLoop - { - return $this->handle; - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function dispatch(bool $blocking) - { - $this->handle->run($blocking ? \Ev::RUN_ONCE : \Ev::RUN_ONCE | \Ev::RUN_NOWAIT); - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - $this->handle->nowUpdate(); - $now = $this->now(); - foreach ($watchers as $watcher) { - if (!isset($this->events[$id = $watcher->id])) { - switch ($watcher->type) { - case Watcher::READABLE: - \assert(\is_resource($watcher->value)); - $this->events[$id] = $this->handle->io($watcher->value, \Ev::READ, $this->ioCallback, $watcher); - break; - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - $this->events[$id] = $this->handle->io($watcher->value, \Ev::WRITE, $this->ioCallback, $watcher); - break; - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - $interval = $watcher->value / self::MILLISEC_PER_SEC; - $this->events[$id] = $this->handle->timer(\max(0, ($watcher->expiration - $now) / self::MILLISEC_PER_SEC), $watcher->type & Watcher::REPEAT ? $interval : 0, $this->timerCallback, $watcher); - break; - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - $this->events[$id] = $this->handle->signal($watcher->value, $this->signalCallback, $watcher); - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - } else { - $this->events[$id]->start(); - } - if ($watcher->type === Watcher::SIGNAL) { - /** @psalm-suppress PropertyTypeCoercion */ - $this->signals[$id] = $this->events[$id]; - } - } - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - if (isset($this->events[$id = $watcher->id])) { - $this->events[$id]->stop(); - if ($watcher->type === Watcher::SIGNAL) { - unset($this->signals[$id]); - } - } - } -} diff --git a/dependencies/amphp/amp/lib/Loop/EventDriver.php b/dependencies/amphp/amp/lib/Loop/EventDriver.php deleted file mode 100644 index 7a6ec9e..0000000 --- a/dependencies/amphp/amp/lib/Loop/EventDriver.php +++ /dev/null @@ -1,281 +0,0 @@ -requireFeatures(\EventConfig::FEATURE_FDS); - } - $this->handle = new \EventBase($config); - $this->nowOffset = getCurrentTime(); - $this->now = \random_int(0, $this->nowOffset); - $this->nowOffset -= $this->now; - if (self::$activeSignals === null) { - self::$activeSignals =& $this->signals; - } - /** - * @param $resource - * @param $what - * @param Watcher $watcher - * - * @return void - */ - $this->ioCallback = function ($resource, $what, Watcher $watcher) { - \assert(\is_resource($watcher->value)); - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - /** - * @param $resource - * @param $what - * @param Watcher $watcher - * - * @return void - */ - $this->timerCallback = function ($resource, $what, Watcher $watcher) { - \assert(\is_int($watcher->value)); - if ($watcher->type & Watcher::DELAY) { - $this->cancel($watcher->id); - } else { - $this->events[$watcher->id]->add($watcher->value / self::MILLISEC_PER_SEC); - } - try { - $result = ($watcher->callback)($watcher->id, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - /** - * @param $signum - * @param $what - * @param Watcher $watcher - * - * @return void - */ - $this->signalCallback = function ($signum, $what, Watcher $watcher) { - try { - $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - } - /** - * {@inheritdoc} - */ - public function cancel(string $watcherId) - { - parent::cancel($watcherId); - if (isset($this->events[$watcherId])) { - $this->events[$watcherId]->free(); - unset($this->events[$watcherId]); - } - } - public static function isSupported() : bool - { - return \extension_loaded("event"); - } - /** - * @codeCoverageIgnore - */ - public function __destruct() - { - // Unset here, otherwise $event->del() in the loop may fail with a warning, because __destruct order isn't defined. - // Related https://github.com/amphp/amp/issues/159. - $events = $this->events; - $this->events = []; - foreach ($events as $event) { - if ($event !== null) { - // Events may have been nulled in extension depending on destruct order. - $event->free(); - } - } - // Manually free the loop handle to fully release loop resources. - // See https://github.com/amphp/amp/issues/177. - if ($this->handle !== null) { - $this->handle->free(); - $this->handle = null; - } - } - /** - * {@inheritdoc} - */ - public function run() - { - $active = self::$activeSignals; - \assert($active !== null); - foreach ($active as $event) { - $event->del(); - } - self::$activeSignals =& $this->signals; - foreach ($this->signals as $event) { - /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ - $event->add(); - } - try { - parent::run(); - } finally { - foreach ($this->signals as $event) { - $event->del(); - } - self::$activeSignals =& $active; - foreach ($active as $event) { - /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ - $event->add(); - } - } - } - /** - * {@inheritdoc} - */ - public function stop() - { - $this->handle->stop(); - parent::stop(); - } - /** - * {@inheritdoc} - */ - public function now() : int - { - $this->now = getCurrentTime() - $this->nowOffset; - return $this->now; - } - /** - * {@inheritdoc} - */ - public function getHandle() : \EventBase - { - return $this->handle; - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function dispatch(bool $blocking) - { - $this->handle->loop($blocking ? \EventBase::LOOP_ONCE : \EventBase::LOOP_ONCE | \EventBase::LOOP_NONBLOCK); - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - $now = $this->now(); - foreach ($watchers as $watcher) { - if (!isset($this->events[$id = $watcher->id])) { - switch ($watcher->type) { - case Watcher::READABLE: - \assert(\is_resource($watcher->value)); - $this->events[$id] = new \Event($this->handle, $watcher->value, \Event::READ | \Event::PERSIST, $this->ioCallback, $watcher); - break; - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - $this->events[$id] = new \Event($this->handle, $watcher->value, \Event::WRITE | \Event::PERSIST, $this->ioCallback, $watcher); - break; - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - $this->events[$id] = new \Event($this->handle, -1, \Event::TIMEOUT, $this->timerCallback, $watcher); - break; - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - $this->events[$id] = new \Event($this->handle, $watcher->value, \Event::SIGNAL | \Event::PERSIST, $this->signalCallback, $watcher); - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - } - switch ($watcher->type) { - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - $interval = \max(0, $watcher->expiration - $now); - $this->events[$id]->add($interval > 0 ? $interval / self::MILLISEC_PER_SEC : 0); - break; - case Watcher::SIGNAL: - $this->signals[$id] = $this->events[$id]; - // no break - default: - /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ - $this->events[$id]->add(); - break; - } - } - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - if (isset($this->events[$id = $watcher->id])) { - $this->events[$id]->del(); - if ($watcher->type === Watcher::SIGNAL) { - unset($this->signals[$id]); - } - } - } -} diff --git a/dependencies/amphp/amp/lib/Loop/Internal/TimerQueue.php b/dependencies/amphp/amp/lib/Loop/Internal/TimerQueue.php deleted file mode 100644 index 258622e..0000000 --- a/dependencies/amphp/amp/lib/Loop/Internal/TimerQueue.php +++ /dev/null @@ -1,147 +0,0 @@ -data[$node]; - while ($node !== 0 && $entry->expiration < $this->data[$parent = $node - 1 >> 1]->expiration) { - $this->swap($node, $parent); - $node = $parent; - } - } - /** - * @param int $node Rebuild the data array from the given node downward. - * - * @return void - */ - private function heapifyDown(int $node) - { - $length = \count($this->data); - while (($child = ($node << 1) + 1) < $length) { - if ($this->data[$child]->expiration < $this->data[$node]->expiration && ($child + 1 >= $length || $this->data[$child]->expiration < $this->data[$child + 1]->expiration)) { - // Left child is less than parent and right child. - $swap = $child; - } elseif ($child + 1 < $length && $this->data[$child + 1]->expiration < $this->data[$node]->expiration) { - // Right child is less than parent and left child. - $swap = $child + 1; - } else { - // Left and right child are greater than parent. - break; - } - $this->swap($node, $swap); - $node = $swap; - } - } - private function swap(int $left, int $right) - { - $temp = $this->data[$left]; - $this->data[$left] = $this->data[$right]; - $this->pointers[$this->data[$right]->id] = $left; - $this->data[$right] = $temp; - $this->pointers[$temp->id] = $right; - } - /** - * Inserts the watcher into the queue. Time complexity: O(log(n)). - * - * @param Watcher $watcher - * - * @psalm-param Watcher $watcher - * - * @return void - */ - public function insert(Watcher $watcher) - { - \assert($watcher->expiration !== null); - \assert(!isset($this->pointers[$watcher->id])); - $node = \count($this->data); - $this->data[$node] = $watcher; - $this->pointers[$watcher->id] = $node; - $this->heapifyUp($node); - } - /** - * Removes the given watcher from the queue. Time complexity: O(log(n)). - * - * @param Watcher $watcher - * - * @psalm-param Watcher $watcher - * - * @return void - */ - public function remove(Watcher $watcher) - { - $id = $watcher->id; - if (!isset($this->pointers[$id])) { - return; - } - $this->removeAndRebuild($this->pointers[$id]); - } - /** - * Deletes and returns the Watcher on top of the heap if it has expired, otherwise null is returned. - * Time complexity: O(log(n)). - * - * @param int $now Current loop time. - * - * @return Watcher|null Expired watcher at the top of the heap or null if the watcher has not expired. - * - * @psalm-return Watcher|null - */ - public function extract(int $now) - { - if (empty($this->data)) { - return null; - } - $watcher = $this->data[0]; - if ($watcher->expiration > $now) { - return null; - } - $this->removeAndRebuild(0); - return $watcher; - } - /** - * Returns the expiration time value at the top of the heap. Time complexity: O(1). - * - * @return int|null Expiration time of the watcher at the top of the heap or null if the heap is empty. - */ - public function peek() - { - return isset($this->data[0]) ? $this->data[0]->expiration : null; - } - /** - * @param int $node Remove the given node and then rebuild the data array. - * - * @return void - */ - private function removeAndRebuild(int $node) - { - $length = \count($this->data) - 1; - $id = $this->data[$node]->id; - $left = $this->data[$node] = $this->data[$length]; - $this->pointers[$left->id] = $node; - unset($this->data[$length], $this->pointers[$id]); - if ($node < $length) { - // don't need to do anything if we removed the last element - $parent = $node - 1 >> 1; - if ($parent >= 0 && $this->data[$node]->expiration < $this->data[$parent]->expiration) { - $this->heapifyUp($node); - } else { - $this->heapifyDown($node); - } - } - } -} diff --git a/dependencies/amphp/amp/lib/Loop/InvalidWatcherError.php b/dependencies/amphp/amp/lib/Loop/InvalidWatcherError.php deleted file mode 100644 index 6c18766..0000000 --- a/dependencies/amphp/amp/lib/Loop/InvalidWatcherError.php +++ /dev/null @@ -1,30 +0,0 @@ -watcherId = $watcherId; - parent::__construct($message); - } - /** - * @return string The watcher identifier. - */ - public function getWatcherId() - { - return $this->watcherId; - } -} diff --git a/dependencies/amphp/amp/lib/Loop/NativeDriver.php b/dependencies/amphp/amp/lib/Loop/NativeDriver.php deleted file mode 100644 index 2607775..0000000 --- a/dependencies/amphp/amp/lib/Loop/NativeDriver.php +++ /dev/null @@ -1,365 +0,0 @@ -timerQueue = new Internal\TimerQueue(); - $this->signalHandling = \extension_loaded("pcntl"); - $this->nowOffset = getCurrentTime(); - $this->now = \random_int(0, $this->nowOffset); - $this->nowOffset -= $this->now; - $this->streamSelectErrorHandler = function ($errno, $message) { - // Casing changed in PHP 8 from 'unable' to 'Unable' - if (\stripos($message, "stream_select(): unable to select [4]: ") === 0) { - // EINTR - $this->streamSelectIgnoreResult = \true; - return; - } - if (\strpos($message, 'FD_SETSIZE') !== \false) { - $message = \str_replace(["\r\n", "\n", "\r"], " ", $message); - $pattern = '(stream_select\\(\\): You MUST recompile PHP with a larger value of FD_SETSIZE. It is set to (\\d+), but you have descriptors numbered at least as high as (\\d+)\\.)'; - if (\preg_match($pattern, $message, $match)) { - $helpLink = 'https://amphp.org/amp/event-loop/#implementations'; - $message = 'You have reached the limits of stream_select(). It has a FD_SETSIZE of ' . $match[1] . ', but you have file descriptors numbered at least as high as ' . $match[2] . '. ' . "You can install one of the extensions listed on {$helpLink} to support a higher number of " . "concurrent file descriptors. If a large number of open file descriptors is unexpected, you " . "might be leaking file descriptors that aren't closed correctly."; - } - } - throw new \Exception($message, $errno); - }; - } - /** - * {@inheritdoc} - * - * @throws \Amp\Loop\UnsupportedFeatureException If the pcntl extension is not available. - */ - public function onSignal(int $signo, callable $callback, $data = null) : string - { - if (!$this->signalHandling) { - throw new UnsupportedFeatureException("Signal handling requires the pcntl extension"); - } - return parent::onSignal($signo, $callback, $data); - } - /** - * {@inheritdoc} - */ - public function now() : int - { - $this->now = getCurrentTime() - $this->nowOffset; - return $this->now; - } - /** - * {@inheritdoc} - */ - public function getHandle() - { - return null; - } - /** - * @param bool $blocking - * - * @return void - * - * @throws \Throwable - */ - protected function dispatch(bool $blocking) - { - $this->selectStreams($this->readStreams, $this->writeStreams, $blocking ? $this->getTimeout() : 0); - $now = $this->now(); - while ($watcher = $this->timerQueue->extract($now)) { - if ($watcher->type & Watcher::REPEAT) { - $watcher->enabled = \false; - // Trick base class into adding to enable queue when calling enable() - $this->enable($watcher->id); - } else { - $this->cancel($watcher->id); - } - try { - // Execute the timer. - $result = ($watcher->callback)($watcher->id, $watcher->data); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - if ($this->signalHandling) { - \pcntl_signal_dispatch(); - } - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - foreach ($watchers as $watcher) { - switch ($watcher->type) { - case Watcher::READABLE: - \assert(\is_resource($watcher->value)); - $streamId = (int) $watcher->value; - $this->readWatchers[$streamId][$watcher->id] = $watcher; - $this->readStreams[$streamId] = $watcher->value; - break; - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - $streamId = (int) $watcher->value; - $this->writeWatchers[$streamId][$watcher->id] = $watcher; - $this->writeStreams[$streamId] = $watcher->value; - break; - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - $this->timerQueue->insert($watcher); - break; - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - if (!isset($this->signalWatchers[$watcher->value])) { - if (!@\pcntl_signal($watcher->value, $this->callableFromInstanceMethod('handleSignal'))) { - $message = "Failed to register signal handler"; - if ($error = \error_get_last()) { - $message .= \sprintf("; Errno: %d; %s", $error["type"], $error["message"]); - } - throw new \Error($message); - } - } - $this->signalWatchers[$watcher->value][$watcher->id] = $watcher; - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - } - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - switch ($watcher->type) { - case Watcher::READABLE: - $streamId = (int) $watcher->value; - unset($this->readWatchers[$streamId][$watcher->id]); - if (empty($this->readWatchers[$streamId])) { - unset($this->readWatchers[$streamId], $this->readStreams[$streamId]); - } - break; - case Watcher::WRITABLE: - $streamId = (int) $watcher->value; - unset($this->writeWatchers[$streamId][$watcher->id]); - if (empty($this->writeWatchers[$streamId])) { - unset($this->writeWatchers[$streamId], $this->writeStreams[$streamId]); - } - break; - case Watcher::DELAY: - case Watcher::REPEAT: - $this->timerQueue->remove($watcher); - break; - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - if (isset($this->signalWatchers[$watcher->value])) { - unset($this->signalWatchers[$watcher->value][$watcher->id]); - if (empty($this->signalWatchers[$watcher->value])) { - unset($this->signalWatchers[$watcher->value]); - @\pcntl_signal($watcher->value, \SIG_DFL); - } - } - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - } - /** - * @param resource[] $read - * @param resource[] $write - * @param int $timeout - * - * @return void - */ - private function selectStreams(array $read, array $write, int $timeout) - { - $timeout /= self::MILLISEC_PER_SEC; - if (!empty($read) || !empty($write)) { - // Use stream_select() if there are any streams in the loop. - if ($timeout >= 0) { - $seconds = (int) $timeout; - $microseconds = (int) (($timeout - $seconds) * self::MICROSEC_PER_SEC); - } else { - $seconds = null; - $microseconds = null; - } - // Failed connection attempts are indicated via except on Windows - // @link https://github.com/reactphp/event-loop/blob/8bd064ce23c26c4decf186c2a5a818c9a8209eb0/src/StreamSelectLoop.php#L279-L287 - // @link https://docs.microsoft.com/de-de/windows/win32/api/winsock2/nf-winsock2-select - $except = null; - if (\DIRECTORY_SEPARATOR === '\\') { - $except = $write; - } - \set_error_handler($this->streamSelectErrorHandler); - try { - $result = \stream_select($read, $write, $except, $seconds, $microseconds); - } finally { - \restore_error_handler(); - } - if ($this->streamSelectIgnoreResult || $result === 0) { - $this->streamSelectIgnoreResult = \false; - return; - } - if (!$result) { - $this->error(new \Exception('Unknown error during stream_select')); - return; - } - foreach ($read as $stream) { - $streamId = (int) $stream; - if (!isset($this->readWatchers[$streamId])) { - continue; - // All read watchers disabled. - } - foreach ($this->readWatchers[$streamId] as $watcher) { - if (!isset($this->readWatchers[$streamId][$watcher->id])) { - continue; - // Watcher disabled by another IO watcher. - } - try { - $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - } - \assert(\is_array($write)); - // See https://github.com/vimeo/psalm/issues/3036 - if ($except) { - foreach ($except as $key => $socket) { - $write[$key] = $socket; - } - } - foreach ($write as $stream) { - $streamId = (int) $stream; - if (!isset($this->writeWatchers[$streamId])) { - continue; - // All write watchers disabled. - } - foreach ($this->writeWatchers[$streamId] as $watcher) { - if (!isset($this->writeWatchers[$streamId][$watcher->id])) { - continue; - // Watcher disabled by another IO watcher. - } - try { - $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - } - return; - } - if ($timeout < 0) { - // Only signal watchers are enabled, so sleep indefinitely. - \usleep(\PHP_INT_MAX); - return; - } - if ($timeout > 0) { - // Sleep until next timer expires. - \usleep((int) ($timeout * self::MICROSEC_PER_SEC)); - } - } - /** - * @return int Milliseconds until next timer expires or -1 if there are no pending times. - */ - private function getTimeout() : int - { - $expiration = $this->timerQueue->peek(); - if ($expiration === null) { - return -1; - } - $expiration -= getCurrentTime() - $this->nowOffset; - return $expiration > 0 ? $expiration : 0; - } - /** - * @param int $signo - * - * @return void - */ - private function handleSignal(int $signo) - { - foreach ($this->signalWatchers[$signo] as $watcher) { - if (!isset($this->signalWatchers[$signo][$watcher->id])) { - continue; - } - try { - $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - } -} diff --git a/dependencies/amphp/amp/lib/Loop/TracingDriver.php b/dependencies/amphp/amp/lib/Loop/TracingDriver.php deleted file mode 100644 index b9516f4..0000000 --- a/dependencies/amphp/amp/lib/Loop/TracingDriver.php +++ /dev/null @@ -1,197 +0,0 @@ -driver = $driver; - } - public function run() - { - $this->driver->run(); - } - public function stop() - { - $this->driver->stop(); - } - public function defer(callable $callback, $data = null) : string - { - $id = $this->driver->defer(function (...$args) use($callback) { - $this->cancel($args[0]); - return $callback(...$args); - }, $data); - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = \true; - return $id; - } - public function delay(int $delay, callable $callback, $data = null) : string - { - $id = $this->driver->delay($delay, function (...$args) use($callback) { - $this->cancel($args[0]); - return $callback(...$args); - }, $data); - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = \true; - return $id; - } - public function repeat(int $interval, callable $callback, $data = null) : string - { - $id = $this->driver->repeat($interval, $callback, $data); - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = \true; - return $id; - } - public function onReadable($stream, callable $callback, $data = null) : string - { - $id = $this->driver->onReadable($stream, $callback, $data); - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = \true; - return $id; - } - public function onWritable($stream, callable $callback, $data = null) : string - { - $id = $this->driver->onWritable($stream, $callback, $data); - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = \true; - return $id; - } - public function onSignal(int $signo, callable $callback, $data = null) : string - { - $id = $this->driver->onSignal($signo, $callback, $data); - $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $this->enabledWatchers[$id] = \true; - return $id; - } - public function enable(string $watcherId) - { - try { - $this->driver->enable($watcherId); - $this->enabledWatchers[$watcherId] = \true; - } catch (InvalidWatcherError $e) { - throw new InvalidWatcherError($watcherId, $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId)); - } - } - public function cancel(string $watcherId) - { - $this->driver->cancel($watcherId); - if (!isset($this->cancelTraces[$watcherId])) { - $this->cancelTraces[$watcherId] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - } - unset($this->enabledWatchers[$watcherId], $this->unreferencedWatchers[$watcherId]); - } - public function disable(string $watcherId) - { - $this->driver->disable($watcherId); - unset($this->enabledWatchers[$watcherId]); - } - public function reference(string $watcherId) - { - try { - $this->driver->reference($watcherId); - unset($this->unreferencedWatchers[$watcherId]); - } catch (InvalidWatcherError $e) { - throw new InvalidWatcherError($watcherId, $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId)); - } - } - public function unreference(string $watcherId) - { - $this->driver->unreference($watcherId); - $this->unreferencedWatchers[$watcherId] = \true; - } - public function setErrorHandler(callable $callback = null) - { - return $this->driver->setErrorHandler($callback); - } - /** @inheritdoc */ - public function getHandle() - { - $this->driver->getHandle(); - } - public function dump() : string - { - $dump = "Enabled, referenced watchers keeping the loop running: "; - foreach ($this->enabledWatchers as $watcher => $_) { - if (isset($this->unreferencedWatchers[$watcher])) { - continue; - } - $dump .= "Watcher ID: " . $watcher . "\r\n"; - $dump .= $this->getCreationTrace($watcher); - $dump .= "\r\n\r\n"; - } - return \rtrim($dump); - } - public function getInfo() : array - { - return $this->driver->getInfo(); - } - public function __debugInfo() - { - return $this->driver->__debugInfo(); - } - public function now() : int - { - return $this->driver->now(); - } - protected function error(\Throwable $exception) - { - $this->driver->error($exception); - } - /** - * @inheritdoc - * - * @return void - */ - protected function activate(array $watchers) - { - // nothing to do in a decorator - } - /** - * @inheritdoc - * - * @return void - */ - protected function dispatch(bool $blocking) - { - // nothing to do in a decorator - } - /** - * @inheritdoc - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - // nothing to do in a decorator - } - private function getTraces(string $watcherId) : string - { - return "Creation Trace:\r\n" . $this->getCreationTrace($watcherId) . "\r\n\r\n" . "Cancellation Trace:\r\n" . $this->getCancelTrace($watcherId); - } - private function getCreationTrace(string $watcher) : string - { - if (!isset($this->creationTraces[$watcher])) { - return 'No creation trace, yet.'; - } - return $this->creationTraces[$watcher]; - } - private function getCancelTrace(string $watcher) : string - { - if (!isset($this->cancelTraces[$watcher])) { - return 'No cancellation trace, yet.'; - } - return $this->cancelTraces[$watcher]; - } -} diff --git a/dependencies/amphp/amp/lib/Loop/UnsupportedFeatureException.php b/dependencies/amphp/amp/lib/Loop/UnsupportedFeatureException.php deleted file mode 100644 index e233166..0000000 --- a/dependencies/amphp/amp/lib/Loop/UnsupportedFeatureException.php +++ /dev/null @@ -1,12 +0,0 @@ -handle = \uv_loop_new(); - /** - * @param $event - * @param $status - * @param $events - * @param $resource - * - * @return void - */ - $this->ioCallback = function ($event, $status, $events, $resource) { - $watchers = $this->watchers[(int) $event]; - switch ($status) { - case 0: - // OK - break; - default: - // Invoke the callback on errors, as this matches behavior with other loop back-ends. - // Re-enable watcher as libuv disables the watcher on non-zero status. - $flags = 0; - foreach ($watchers as $watcher) { - $flags |= $watcher->enabled ? $watcher->type : 0; - } - \uv_poll_start($event, $flags, $this->ioCallback); - break; - } - foreach ($watchers as $watcher) { - // $events is OR'ed with 4 to trigger watcher if no events are indicated (0) or on UV_DISCONNECT (4). - // http://docs.libuv.org/en/v1.x/poll.html - if (!($watcher->enabled && ($watcher->type & $events || ($events | 4) === 4))) { - continue; - } - try { - $result = ($watcher->callback)($watcher->id, $resource, $watcher->data); - if ($result === null) { - continue; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - } - }; - /** - * @param $event - * - * @return void - */ - $this->timerCallback = function ($event) { - $watcher = $this->watchers[(int) $event][0]; - if ($watcher->type & Watcher::DELAY) { - unset($this->events[$watcher->id], $this->watchers[(int) $event]); - // Avoid call to uv_is_active(). - $this->cancel($watcher->id); - // Remove reference to watcher in parent. - } elseif ($watcher->value === 0) { - // Disable and re-enable so it's not executed repeatedly in the same tick - // See https://github.com/amphp/amp/issues/131 - $this->disable($watcher->id); - $this->enable($watcher->id); - } - try { - $result = ($watcher->callback)($watcher->id, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - /** - * @param $event - * @param $signo - * - * @return void - */ - $this->signalCallback = function ($event, $signo) { - $watcher = $this->watchers[(int) $event][0]; - try { - $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - rethrow($result); - } - } catch (\Throwable $exception) { - $this->error($exception); - } - }; - } - /** - * {@inheritdoc} - */ - public function cancel(string $watcherId) - { - parent::cancel($watcherId); - if (!isset($this->events[$watcherId])) { - return; - } - $event = $this->events[$watcherId]; - $eventId = (int) $event; - if (isset($this->watchers[$eventId][0])) { - // All except IO watchers. - unset($this->watchers[$eventId]); - } elseif (isset($this->watchers[$eventId][$watcherId])) { - $watcher = $this->watchers[$eventId][$watcherId]; - unset($this->watchers[$eventId][$watcherId]); - if (empty($this->watchers[$eventId])) { - unset($this->watchers[$eventId], $this->streams[(int) $watcher->value]); - } - } - unset($this->events[$watcherId]); - } - public static function isSupported() : bool - { - return \extension_loaded("uv"); - } - /** - * {@inheritdoc} - */ - public function now() : int - { - \uv_update_time($this->handle); - /** @psalm-suppress TooManyArguments */ - return \uv_now($this->handle); - } - /** - * {@inheritdoc} - */ - public function getHandle() - { - return $this->handle; - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function dispatch(bool $blocking) - { - /** @psalm-suppress TooManyArguments */ - \uv_run($this->handle, $blocking ? \UV::RUN_ONCE : \UV::RUN_NOWAIT); - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function activate(array $watchers) - { - $now = $this->now(); - foreach ($watchers as $watcher) { - $id = $watcher->id; - switch ($watcher->type) { - case Watcher::READABLE: - case Watcher::WRITABLE: - \assert(\is_resource($watcher->value)); - $streamId = (int) $watcher->value; - if (isset($this->streams[$streamId])) { - $event = $this->streams[$streamId]; - } elseif (isset($this->events[$id])) { - $event = $this->streams[$streamId] = $this->events[$id]; - } else { - /** @psalm-suppress UndefinedFunction */ - $event = $this->streams[$streamId] = \WP_Ultimo\Dependencies\uv_poll_init_socket($this->handle, $watcher->value); - } - $eventId = (int) $event; - $this->events[$id] = $event; - $this->watchers[$eventId][$id] = $watcher; - $flags = 0; - foreach ($this->watchers[$eventId] as $w) { - $flags |= $w->enabled ? $w->type : 0; - } - \uv_poll_start($event, $flags, $this->ioCallback); - break; - case Watcher::DELAY: - case Watcher::REPEAT: - \assert(\is_int($watcher->value)); - if (isset($this->events[$id])) { - $event = $this->events[$id]; - } else { - $event = $this->events[$id] = \uv_timer_init($this->handle); - } - $this->watchers[(int) $event] = [$watcher]; - \uv_timer_start($event, \max(0, $watcher->expiration - $now), $watcher->type & Watcher::REPEAT ? $watcher->value : 0, $this->timerCallback); - break; - case Watcher::SIGNAL: - \assert(\is_int($watcher->value)); - if (isset($this->events[$id])) { - $event = $this->events[$id]; - } else { - /** @psalm-suppress UndefinedFunction */ - $event = $this->events[$id] = \WP_Ultimo\Dependencies\uv_signal_init($this->handle); - } - $this->watchers[(int) $event] = [$watcher]; - /** @psalm-suppress UndefinedFunction */ - \WP_Ultimo\Dependencies\uv_signal_start($event, $this->signalCallback, $watcher->value); - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - } - } - /** - * {@inheritdoc} - * - * @return void - */ - protected function deactivate(Watcher $watcher) - { - $id = $watcher->id; - if (!isset($this->events[$id])) { - return; - } - $event = $this->events[$id]; - if (!\uv_is_active($event)) { - return; - } - switch ($watcher->type) { - case Watcher::READABLE: - case Watcher::WRITABLE: - $flags = 0; - foreach ($this->watchers[(int) $event] as $w) { - $flags |= $w->enabled ? $w->type : 0; - } - if ($flags) { - \uv_poll_start($event, $flags, $this->ioCallback); - } else { - \uv_poll_stop($event); - } - break; - case Watcher::DELAY: - case Watcher::REPEAT: - \uv_timer_stop($event); - break; - case Watcher::SIGNAL: - \uv_signal_stop($event); - break; - default: - // @codeCoverageIgnoreStart - throw new \Error("Unknown watcher type"); - } - } -} diff --git a/dependencies/amphp/amp/lib/Loop/Watcher.php b/dependencies/amphp/amp/lib/Loop/Watcher.php deleted file mode 100644 index 54a4e25..0000000 --- a/dependencies/amphp/amp/lib/Loop/Watcher.php +++ /dev/null @@ -1,47 +0,0 @@ -reasons = $reasons; - } - /** - * @return \Throwable[] - */ - public function getReasons() : array - { - return $this->reasons; - } -} diff --git a/dependencies/amphp/amp/lib/NullCancellationToken.php b/dependencies/amphp/amp/lib/NullCancellationToken.php deleted file mode 100644 index 5244cfb..0000000 --- a/dependencies/amphp/amp/lib/NullCancellationToken.php +++ /dev/null @@ -1,50 +0,0 @@ -throwIfRequested(); - * } - * ``` - * - * potentially multiple times, it allows writing - * - * ```php - * $token = $token ?? new NullCancellationToken; - * - * // ... - * - * $token->throwIfRequested(); - * ``` - * - * instead. - */ -final class NullCancellationToken implements CancellationToken -{ - /** @inheritdoc */ - public function subscribe(callable $callback) : string - { - return "null-token"; - } - /** @inheritdoc */ - public function unsubscribe(string $id) - { - // nothing to do - } - /** @inheritdoc */ - public function isRequested() : bool - { - return \false; - } - /** @inheritdoc */ - public function throwIfRequested() - { - // nothing to do - } -} diff --git a/dependencies/amphp/amp/lib/Producer.php b/dependencies/amphp/amp/lib/Producer.php deleted file mode 100644 index dd37c34..0000000 --- a/dependencies/amphp/amp/lib/Producer.php +++ /dev/null @@ -1,38 +0,0 @@ - - */ -final class Producer implements Iterator -{ - /** - * @use Internal\Producer - */ - use CallableMaker, Internal\Producer; - /** - * @param callable(callable(TValue):Promise):\Generator $producer - * - * @throws \Error Thrown if the callable does not return a Generator. - */ - public function __construct(callable $producer) - { - $result = $producer($this->callableFromInstanceMethod("emit")); - if (!$result instanceof \Generator) { - throw new \Error("The callable did not return a Generator"); - } - $coroutine = new Coroutine($result); - $coroutine->onResolve(function ($exception) { - if ($this->complete) { - return; - } - if ($exception) { - $this->fail($exception); - return; - } - $this->complete(); - }); - } -} diff --git a/dependencies/amphp/amp/lib/Promise.php b/dependencies/amphp/amp/lib/Promise.php deleted file mode 100644 index e5ce163..0000000 --- a/dependencies/amphp/amp/lib/Promise.php +++ /dev/null @@ -1,37 +0,0 @@ -, mixed, - * mixed>|null) | callable(\Throwable|null, mixed): void $onResolved - * - * @return void - */ - public function onResolve(callable $onResolved); -} diff --git a/dependencies/amphp/amp/lib/Struct.php b/dependencies/amphp/amp/lib/Struct.php deleted file mode 100644 index 9a89a13..0000000 --- a/dependencies/amphp/amp/lib/Struct.php +++ /dev/null @@ -1,68 +0,0 @@ -generateStructPropertyError($property)); - } - /** - * @param string $property - * @param mixed $value - * - * @psalm-return no-return - */ - public function __set(string $property, $value) - { - throw new \Error($this->generateStructPropertyError($property)); - } - private function generateStructPropertyError(string $property) : string - { - $suggestion = $this->suggestPropertyName($property); - $suggestStr = $suggestion == "" ? "" : " ... did you mean \"{$suggestion}?\""; - return \sprintf( - "%s property \"%s\" does not exist%s", - \str_replace("\x00", "@", \get_class($this)), - // Handle anonymous class names. - $property, - $suggestStr - ); - } - private function suggestPropertyName(string $badProperty) : string - { - $badProperty = \strtolower($badProperty); - $bestMatch = ""; - $bestMatchPercentage = 0; - /** @psalm-suppress RawObjectIteration */ - foreach ($this as $property => $value) { - // Never suggest properties that begin with an underscore - if ($property[0] === "_") { - continue; - } - \similar_text($badProperty, \strtolower($property), $byRefPercentage); - if ($byRefPercentage > $bestMatchPercentage) { - $bestMatchPercentage = $byRefPercentage; - $bestMatch = $property; - } - } - return $bestMatchPercentage >= $this->__propertySuggestThreshold ? $bestMatch : ""; - } -} diff --git a/dependencies/amphp/amp/lib/Success.php b/dependencies/amphp/amp/lib/Success.php deleted file mode 100644 index 0383ce5..0000000 --- a/dependencies/amphp/amp/lib/Success.php +++ /dev/null @@ -1,53 +0,0 @@ - - */ -final class Success implements Promise -{ - /** @var mixed */ - private $value; - /** - * @param mixed $value Anything other than a Promise object. - * - * @psalm-param TValue $value - * - * @throws \Error If a promise is given as the value. - */ - public function __construct($value = null) - { - if ($value instanceof Promise || $value instanceof ReactPromise) { - throw new \Error("Cannot use a promise as success value"); - } - $this->value = $value; - } - /** - * {@inheritdoc} - */ - public function onResolve(callable $onResolved) - { - try { - $result = $onResolved(null, $this->value); - if ($result === null) { - return; - } - if ($result instanceof \Generator) { - $result = new Coroutine($result); - } - if ($result instanceof Promise || $result instanceof ReactPromise) { - Promise\rethrow($result); - } - } catch (\Throwable $exception) { - Loop::defer(static function () use($exception) { - throw $exception; - }); - } - } -} diff --git a/dependencies/amphp/amp/lib/TimeoutCancellationToken.php b/dependencies/amphp/amp/lib/TimeoutCancellationToken.php deleted file mode 100644 index fa5ba0d..0000000 --- a/dependencies/amphp/amp/lib/TimeoutCancellationToken.php +++ /dev/null @@ -1,65 +0,0 @@ -token = $source->getToken(); - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - $this->watcher = Loop::delay($timeout, static function () use($source, $message, $trace) { - $trace = formatStacktrace($trace); - $source->cancel(new TimeoutException("{$message}\r\nTimeoutCancellationToken was created here:\r\n{$trace}")); - }); - Loop::unreference($this->watcher); - } - /** - * Cancels the delay watcher. - */ - public function __destruct() - { - Loop::cancel($this->watcher); - } - /** - * {@inheritdoc} - */ - public function subscribe(callable $callback) : string - { - return $this->token->subscribe($callback); - } - /** - * {@inheritdoc} - */ - public function unsubscribe(string $id) - { - $this->token->unsubscribe($id); - } - /** - * {@inheritdoc} - */ - public function isRequested() : bool - { - return $this->token->isRequested(); - } - /** - * {@inheritdoc} - */ - public function throwIfRequested() - { - $this->token->throwIfRequested(); - } -} diff --git a/dependencies/amphp/amp/lib/TimeoutException.php b/dependencies/amphp/amp/lib/TimeoutException.php deleted file mode 100644 index b457126..0000000 --- a/dependencies/amphp/amp/lib/TimeoutException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * @template T as TReturn|Promise|\Generator - * - * @formatter:off - * - * @param callable(...mixed): T $callback - * - * @return callable - * @psalm-return (T is Promise ? (callable(mixed...): Promise) : (T is \Generator ? (TGenerator is Promise ? (callable(mixed...): Promise) : (callable(mixed...): Promise)) : (callable(mixed...): Promise))) - * - * @formatter:on - * - * @see asyncCoroutine() - * - * @psalm-suppress InvalidReturnType - */ -function coroutine(callable $callback) : callable -{ - /** @psalm-suppress InvalidReturnStatement */ - return static function (...$args) use($callback) : Promise { - return call($callback, ...$args); - }; -} -/** - * Returns a new function that wraps $callback in a promise/coroutine-aware function that automatically runs - * Generators as coroutines. The returned function always returns void when invoked. Errors are forwarded to the - * loop's error handler using `Amp\Promise\rethrow()`. - * - * Use this function to create a coroutine-aware callable for a non-promise-aware callback caller. - * - * @param callable(...mixed): mixed $callback - * - * @return callable - * @psalm-return callable(mixed...): void - * - * @see coroutine() - */ -function asyncCoroutine(callable $callback) : callable -{ - return static function (...$args) use($callback) { - Promise\rethrow(call($callback, ...$args)); - }; -} -/** - * Calls the given function, always returning a promise. If the function returns a Generator, it will be run as a - * coroutine. If the function throws, a failed promise will be returned. - * - * @template TReturn - * @template TPromise - * @template TGeneratorReturn - * @template TGeneratorPromise - * - * @template TGenerator as TGeneratorReturn|Promise - * @template T as TReturn|Promise|\Generator - * - * @formatter:off - * - * @param callable(...mixed): T $callback - * @param mixed ...$args Arguments to pass to the function. - * - * @return Promise - * @psalm-return (T is Promise ? Promise : (T is \Generator ? (TGenerator is Promise ? Promise : Promise) : Promise)) - * - * @formatter:on - */ -function call(callable $callback, ...$args) : Promise -{ - try { - $result = $callback(...$args); - } catch (\Throwable $exception) { - return new Failure($exception); - } - if ($result instanceof \Generator) { - return new Coroutine($result); - } - if ($result instanceof Promise) { - return $result; - } - if ($result instanceof ReactPromise) { - return Promise\adapt($result); - } - return new Success($result); -} -/** - * Calls the given function. If the function returns a Generator, it will be run as a coroutine. If the function - * throws or returns a failing promise, the failure is forwarded to the loop error handler. - * - * @param callable(...mixed): mixed $callback - * @param mixed ...$args Arguments to pass to the function. - * - * @return void - */ -function asyncCall(callable $callback, ...$args) -{ - Promise\rethrow(call($callback, ...$args)); -} -/** - * Sleeps for the specified number of milliseconds. - * - * @param int $milliseconds - * - * @return Delayed - */ -function delay(int $milliseconds) : Delayed -{ - return new Delayed($milliseconds); -} -/** - * Returns the current time relative to an arbitrary point in time. - * - * @return int Time in milliseconds. - */ -function getCurrentTime() : int -{ - return Internal\getCurrentTime(); -} -namespace WP_Ultimo\Dependencies\Amp\Promise; - -use WP_Ultimo\Dependencies\Amp\Deferred; -use WP_Ultimo\Dependencies\Amp\Loop; -use WP_Ultimo\Dependencies\Amp\MultiReasonException; -use WP_Ultimo\Dependencies\Amp\Promise; -use WP_Ultimo\Dependencies\Amp\Success; -use WP_Ultimo\Dependencies\Amp\TimeoutException; -use WP_Ultimo\Dependencies\React\Promise\PromiseInterface as ReactPromise; -use function WP_Ultimo\Dependencies\Amp\call; -use function WP_Ultimo\Dependencies\Amp\Internal\createTypeError; -/** - * Registers a callback that will forward the failure reason to the event loop's error handler if the promise fails. - * - * Use this function if you neither return the promise nor handle a possible error yourself to prevent errors from - * going entirely unnoticed. - * - * @param Promise|ReactPromise $promise Promise to register the handler on. - * - * @return void - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - * - */ -function rethrow($promise) -{ - if (!$promise instanceof Promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } else { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - } - $promise->onResolve(static function ($exception) { - if ($exception) { - throw $exception; - } - }); -} -/** - * Runs the event loop until the promise is resolved. Should not be called within a running event loop. - * - * Use this function only in synchronous contexts to wait for an asynchronous operation. Use coroutines and yield to - * await promise resolution in a fully asynchronous application instead. - * - * @template TPromise - * @template T as Promise|ReactPromise - * - * @param Promise|ReactPromise $promise Promise to wait for. - * - * @return mixed Promise success value. - * - * @psalm-param T $promise - * @psalm-return (T is Promise ? TPromise : mixed) - * - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - * @throws \Error If the event loop stopped without the $promise being resolved. - * @throws \Throwable Promise failure reason. - */ -function wait($promise) -{ - if (!$promise instanceof Promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } else { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - } - $resolved = \false; - try { - Loop::run(function () use(&$resolved, &$value, &$exception, $promise) { - $promise->onResolve(function ($e, $v) use(&$resolved, &$value, &$exception) { - Loop::stop(); - $resolved = \true; - $exception = $e; - $value = $v; - }); - }); - } catch (\Throwable $throwable) { - throw new \Error("Loop exceptionally stopped without resolving the promise", 0, $throwable); - } - if (!$resolved) { - throw new \Error("Loop stopped without resolving the promise"); - } - if ($exception) { - throw $exception; - } - return $value; -} -/** - * Creates an artificial timeout for any `Promise`. - * - * If the timeout expires before the promise is resolved, the returned promise fails with an instance of - * `Amp\TimeoutException`. - * - * @template TReturn - * - * @param Promise|ReactPromise $promise Promise to which the timeout is applied. - * @param int $timeout Timeout in milliseconds. - * - * @return Promise - * - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - */ -function timeout($promise, int $timeout) : Promise -{ - if (!$promise instanceof Promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } else { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - } - $deferred = new Deferred(); - $watcher = Loop::delay($timeout, static function () use(&$deferred) { - $temp = $deferred; - // prevent double resolve - $deferred = null; - $temp->fail(new TimeoutException()); - }); - Loop::unreference($watcher); - $promise->onResolve(function () use(&$deferred, $promise, $watcher) { - if ($deferred !== null) { - Loop::cancel($watcher); - $deferred->resolve($promise); - } - }); - return $deferred->promise(); -} -/** - * Creates an artificial timeout for any `Promise`. - * - * If the promise is resolved before the timeout expires, the result is returned - * - * If the timeout expires before the promise is resolved, a default value is returned - * - * @template TReturn - * - * @param Promise|ReactPromise $promise Promise to which the timeout is applied. - * @param int $timeout Timeout in milliseconds. - * @param TReturn $default - * - * @return Promise - * - * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. - */ -function timeoutWithDefault($promise, int $timeout, $default = null) : Promise -{ - $promise = timeout($promise, $timeout); - return call(static function () use($promise, $default) { - try { - return (yield $promise); - } catch (TimeoutException $exception) { - return $default; - } - }); -} -/** - * Adapts any object with a done(callable $onFulfilled, callable $onRejected) or then(callable $onFulfilled, - * callable $onRejected) method to a promise usable by components depending on placeholders implementing - * \AsyncInterop\Promise. - * - * @param object $promise Object with a done() or then() method. - * - * @return Promise Promise resolved by the $thenable object. - * - * @throws \Error If the provided object does not have a then() method. - */ -function adapt($promise) : Promise -{ - if (!\is_object($promise)) { - throw new \Error("Object must be provided"); - } - $deferred = new Deferred(); - if (\method_exists($promise, 'done')) { - $promise->done([$deferred, 'resolve'], [$deferred, 'fail']); - } elseif (\method_exists($promise, 'then')) { - $promise->then([$deferred, 'resolve'], [$deferred, 'fail']); - } else { - throw new \Error("Object must have a 'then' or 'done' method"); - } - return $deferred->promise(); -} -/** - * Returns a promise that is resolved when all promises are resolved. The returned promise will not fail. - * Returned promise succeeds with a two-item array delineating successful and failed promise results, - * with keys identical and corresponding to the original given array. - * - * This function is the same as some() with the notable exception that it will never fail even - * if all promises in the array resolve unsuccessfully. - * - * @template TValue - * - * @param Promise[]|ReactPromise[] $promises - * - * @return Promise - * - * @throws \Error If a non-Promise is in the array. - */ -function any(array $promises) : Promise -{ - return some($promises, 0); -} -/** - * Returns a promise that succeeds when all promises succeed, and fails if any promise fails. Returned - * promise succeeds with an array of values used to succeed each contained promise, with keys corresponding to - * the array of promises. - * - * @param Promise[]|ReactPromise[] $promises Array of only promises. - * - * @return Promise - * - * @throws \Error If a non-Promise is in the array. - * - * @template TValue - * - * @psalm-param array|ReactPromise> $promises - * @psalm-assert array|ReactPromise> $promises $promises - * @psalm-return Promise> - */ -function all(array $promises) : Promise -{ - if (empty($promises)) { - return new Success([]); - } - $deferred = new Deferred(); - $result = $deferred->promise(); - $pending = \count($promises); - $values = []; - foreach ($promises as $key => $promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - $values[$key] = null; - // add entry to array to preserve order - $promise->onResolve(function ($exception, $value) use(&$deferred, &$values, &$pending, $key) { - if ($pending === 0) { - return; - } - if ($exception) { - $pending = 0; - $deferred->fail($exception); - $deferred = null; - return; - } - $values[$key] = $value; - if (0 === --$pending) { - $deferred->resolve($values); - } - }); - } - return $result; -} -/** - * Returns a promise that succeeds when the first promise succeeds, and fails only if all promises fail. - * - * @template TValue - * - * @param Promise[]|ReactPromise[] $promises Array of only promises. - * - * @return Promise - * - * @throws \Error If the array is empty or a non-Promise is in the array. - */ -function first(array $promises) : Promise -{ - if (empty($promises)) { - throw new \Error("No promises provided"); - } - $deferred = new Deferred(); - $result = $deferred->promise(); - $pending = \count($promises); - $exceptions = []; - foreach ($promises as $key => $promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - $exceptions[$key] = null; - // add entry to array to preserve order - $promise->onResolve(function ($error, $value) use(&$deferred, &$exceptions, &$pending, $key) { - if ($pending === 0) { - return; - } - if (!$error) { - $pending = 0; - $deferred->resolve($value); - $deferred = null; - return; - } - $exceptions[$key] = $error; - if (0 === --$pending) { - $deferred->fail(new MultiReasonException($exceptions)); - } - }); - } - return $result; -} -/** - * Resolves with a two-item array delineating successful and failed Promise results. - * - * The returned promise will only fail if the given number of required promises fail. - * - * @template TValue - * - * @param Promise[]|ReactPromise[] $promises Array of only promises. - * @param int $required Number of promises that must succeed for the - * returned promise to succeed. - * - * @return Promise - * - * @throws \Error If a non-Promise is in the array. - */ -function some(array $promises, int $required = 1) : Promise -{ - if ($required < 0) { - throw new \Error("Number of promises required must be non-negative"); - } - $pending = \count($promises); - if ($required > $pending) { - throw new \Error("Too few promises provided"); - } - if (empty($promises)) { - return new Success([[], []]); - } - $deferred = new Deferred(); - $result = $deferred->promise(); - $values = []; - $exceptions = []; - foreach ($promises as $key => $promise) { - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - $values[$key] = $exceptions[$key] = null; - // add entry to arrays to preserve order - $promise->onResolve(static function ($exception, $value) use(&$values, &$exceptions, &$pending, $key, $required, $deferred) { - if ($exception) { - $exceptions[$key] = $exception; - unset($values[$key]); - } else { - $values[$key] = $value; - unset($exceptions[$key]); - } - if (0 === --$pending) { - if (\count($values) < $required) { - $deferred->fail(new MultiReasonException($exceptions)); - } else { - $deferred->resolve([$exceptions, $values]); - } - } - }); - } - return $result; -} -/** - * Wraps a promise into another promise, altering the exception or result. - * - * @param Promise|ReactPromise $promise - * @param callable $callback - * - * @return Promise - */ -function wrap($promise, callable $callback) : Promise -{ - if ($promise instanceof ReactPromise) { - $promise = adapt($promise); - } elseif (!$promise instanceof Promise) { - throw createTypeError([Promise::class, ReactPromise::class], $promise); - } - $deferred = new Deferred(); - $promise->onResolve(static function (\Throwable $exception = null, $result) use($deferred, $callback) { - try { - $result = $callback($exception, $result); - } catch (\Throwable $exception) { - $deferred->fail($exception); - return; - } - $deferred->resolve($result); - }); - return $deferred->promise(); -} -namespace WP_Ultimo\Dependencies\Amp\Iterator; - -use WP_Ultimo\Dependencies\Amp\Delayed; -use WP_Ultimo\Dependencies\Amp\Emitter; -use WP_Ultimo\Dependencies\Amp\Iterator; -use WP_Ultimo\Dependencies\Amp\Producer; -use WP_Ultimo\Dependencies\Amp\Promise; -use function WP_Ultimo\Dependencies\Amp\call; -use function WP_Ultimo\Dependencies\Amp\coroutine; -use function WP_Ultimo\Dependencies\Amp\Internal\createTypeError; -/** - * Creates an iterator from the given iterable, emitting the each value. The iterable may contain promises. If any - * promise fails, the iterator will fail with the same reason. - * - * @param array|\Traversable $iterable Elements to emit. - * @param int $delay Delay between element emissions in milliseconds. - * - * @return Iterator - * - * @throws \TypeError If the argument is not an array or instance of \Traversable. - */ -function fromIterable($iterable, int $delay = 0) : Iterator -{ - if (!$iterable instanceof \Traversable && !\is_array($iterable)) { - throw createTypeError(["array", "Traversable"], $iterable); - } - if ($delay) { - return new Producer(static function (callable $emit) use($iterable, $delay) { - foreach ($iterable as $value) { - (yield new Delayed($delay)); - (yield $emit($value)); - } - }); - } - return new Producer(static function (callable $emit) use($iterable) { - foreach ($iterable as $value) { - (yield $emit($value)); - } - }); -} -/** - * @template TValue - * @template TReturn - * - * @param Iterator $iterator - * @param callable (TValue $value): TReturn $onEmit - * - * @return Iterator - */ -function map(Iterator $iterator, callable $onEmit) : Iterator -{ - return new Producer(static function (callable $emit) use($iterator, $onEmit) { - while ((yield $iterator->advance())) { - (yield $emit($onEmit($iterator->getCurrent()))); - } - }); -} -/** - * @template TValue - * - * @param Iterator $iterator - * @param callable(TValue $value):bool $filter - * - * @return Iterator - */ -function filter(Iterator $iterator, callable $filter) : Iterator -{ - return new Producer(static function (callable $emit) use($iterator, $filter) { - while ((yield $iterator->advance())) { - if ($filter($iterator->getCurrent())) { - (yield $emit($iterator->getCurrent())); - } - } - }); -} -/** - * Creates an iterator that emits values emitted from any iterator in the array of iterators. - * - * @param Iterator[] $iterators - * - * @return Iterator - */ -function merge(array $iterators) : Iterator -{ - $emitter = new Emitter(); - $result = $emitter->iterate(); - $coroutine = coroutine(static function (Iterator $iterator) use(&$emitter) { - while ((yield $iterator->advance()) && $emitter !== null) { - (yield $emitter->emit($iterator->getCurrent())); - } - }); - $coroutines = []; - foreach ($iterators as $iterator) { - if (!$iterator instanceof Iterator) { - throw createTypeError([Iterator::class], $iterator); - } - $coroutines[] = $coroutine($iterator); - } - Promise\all($coroutines)->onResolve(static function ($exception) use(&$emitter) { - if ($exception) { - $emitter->fail($exception); - $emitter = null; - } else { - $emitter->complete(); - } - }); - return $result; -} -/** - * Concatenates the given iterators into a single iterator, emitting values from a single iterator at a time. The - * prior iterator must complete before values are emitted from any subsequent iterators. Iterators are concatenated - * in the order given (iteration order of the array). - * - * @param Iterator[] $iterators - * - * @return Iterator - */ -function concat(array $iterators) : Iterator -{ - foreach ($iterators as $iterator) { - if (!$iterator instanceof Iterator) { - throw createTypeError([Iterator::class], $iterator); - } - } - $emitter = new Emitter(); - $previous = []; - $promise = Promise\all($previous); - $coroutine = coroutine(static function (Iterator $iterator, callable $emit) { - while ((yield $iterator->advance())) { - (yield $emit($iterator->getCurrent())); - } - }); - foreach ($iterators as $iterator) { - $emit = coroutine(static function ($value) use($emitter, $promise) { - static $pending = \true, $failed = \false; - if ($failed) { - return; - } - if ($pending) { - try { - (yield $promise); - $pending = \false; - } catch (\Throwable $exception) { - $failed = \true; - return; - // Prior iterator failed. - } - } - (yield $emitter->emit($value)); - }); - $previous[] = $coroutine($iterator, $emit); - $promise = Promise\all($previous); - } - $promise->onResolve(static function ($exception) use($emitter) { - if ($exception) { - $emitter->fail($exception); - return; - } - $emitter->complete(); - }); - return $emitter->iterate(); -} -/** - * Discards all remaining items and returns the number of discarded items. - * - * @template TValue - * - * @param Iterator $iterator - * - * @return Promise - * - * @psalm-param Iterator $iterator - * @psalm-return Promise - */ -function discard(Iterator $iterator) : Promise -{ - return call(static function () use($iterator) : \Generator { - $count = 0; - while ((yield $iterator->advance())) { - $count++; - } - return $count; - }); -} -/** - * Collects all items from an iterator into an array. - * - * @template TValue - * - * @param Iterator $iterator - * - * @psalm-param Iterator $iterator - * - * @return Promise - * @psalm-return Promise> - */ -function toArray(Iterator $iterator) : Promise -{ - return call(static function () use($iterator) { - /** @psalm-var list $array */ - $array = []; - while ((yield $iterator->advance())) { - $array[] = $iterator->getCurrent(); - } - return $array; - }); -} diff --git a/dependencies/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php b/dependencies/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php deleted file mode 100644 index aa8c610..0000000 --- a/dependencies/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php +++ /dev/null @@ -1,51 +0,0 @@ -source = $source; - } - public function read() : Promise - { - return call(function () { - if ($this->source === null) { - throw new StreamException('Failed to read stream chunk due to invalid base64 data'); - } - $chunk = (yield $this->source->read()); - if ($chunk === null) { - if ($this->buffer === null) { - return null; - } - $chunk = \base64_decode($this->buffer, \true); - if ($chunk === \false) { - $this->source = null; - $this->buffer = null; - throw new StreamException('Failed to read stream chunk due to invalid base64 data'); - } - $this->buffer = null; - return $chunk; - } - $this->buffer .= $chunk; - $length = \strlen($this->buffer); - $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), \true); - if ($chunk === \false) { - $this->source = null; - $this->buffer = null; - throw new StreamException('Failed to read stream chunk due to invalid base64 data'); - } - $this->buffer = \substr($this->buffer, $length - $length % 4); - return $chunk; - }); - } -} diff --git a/dependencies/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php b/dependencies/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php deleted file mode 100644 index a670f42..0000000 --- a/dependencies/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php +++ /dev/null @@ -1,43 +0,0 @@ -destination = $destination; - } - public function write(string $data) : Promise - { - $this->buffer .= $data; - $length = \strlen($this->buffer); - $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), \true); - if ($chunk === \false) { - return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); - } - $this->offset += $length - $length % 4; - $this->buffer = \substr($this->buffer, $length - $length % 4); - return $this->destination->write($chunk); - } - public function end(string $finalData = "") : Promise - { - $this->offset += \strlen($this->buffer); - $chunk = \base64_decode($this->buffer . $finalData, \true); - if ($chunk === \false) { - return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); - } - $this->buffer = ''; - return $this->destination->end($chunk); - } -} diff --git a/dependencies/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php b/dependencies/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php deleted file mode 100644 index 0cf4399..0000000 --- a/dependencies/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php +++ /dev/null @@ -1,37 +0,0 @@ -source = $source; - } - public function read() : Promise - { - return call(function () { - $chunk = (yield $this->source->read()); - if ($chunk === null) { - if ($this->buffer === null) { - return null; - } - $chunk = \base64_encode($this->buffer); - $this->buffer = null; - return $chunk; - } - $this->buffer .= $chunk; - $length = \strlen($this->buffer); - $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); - $this->buffer = \substr($this->buffer, $length - $length % 3); - return $chunk; - }); - } -} diff --git a/dependencies/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php b/dependencies/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php deleted file mode 100644 index 5ad5e27..0000000 --- a/dependencies/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php +++ /dev/null @@ -1,31 +0,0 @@ -destination = $destination; - } - public function write(string $data) : Promise - { - $this->buffer .= $data; - $length = \strlen($this->buffer); - $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); - $this->buffer = \substr($this->buffer, $length - $length % 3); - return $this->destination->write($chunk); - } - public function end(string $finalData = "") : Promise - { - $chunk = \base64_encode($this->buffer . $finalData); - $this->buffer = ''; - return $this->destination->end($chunk); - } -} diff --git a/dependencies/amphp/byte-stream/lib/ClosedException.php b/dependencies/amphp/byte-stream/lib/ClosedException.php deleted file mode 100644 index 5b28160..0000000 --- a/dependencies/amphp/byte-stream/lib/ClosedException.php +++ /dev/null @@ -1,7 +0,0 @@ -contents = $contents; - } - /** - * Reads data from the stream. - * - * @return Promise Resolves with the full contents or `null` if the stream has closed / already been consumed. - */ - public function read() : Promise - { - if ($this->contents === null) { - return new Success(); - } - $promise = new Success($this->contents); - $this->contents = null; - return $promise; - } -} diff --git a/dependencies/amphp/byte-stream/lib/InputStream.php b/dependencies/amphp/byte-stream/lib/InputStream.php deleted file mode 100644 index df0bff3..0000000 --- a/dependencies/amphp/byte-stream/lib/InputStream.php +++ /dev/null @@ -1,37 +0,0 @@ -read()) !== null) { - * $buffer .= $chunk; - * } - * - * return $buffer; - * }); - * } - * ``` - */ -interface InputStream -{ - /** - * Reads data from the stream. - * - * @return Promise Resolves with a string when new data is available or `null` if the stream has closed. - * - * @psalm-return Promise - * - * @throws PendingReadError Thrown if another read operation is still pending. - */ - public function read() : Promise; -} diff --git a/dependencies/amphp/byte-stream/lib/InputStreamChain.php b/dependencies/amphp/byte-stream/lib/InputStreamChain.php deleted file mode 100644 index 9c0137d..0000000 --- a/dependencies/amphp/byte-stream/lib/InputStreamChain.php +++ /dev/null @@ -1,44 +0,0 @@ -streams = $streams; - } - /** @inheritDoc */ - public function read() : Promise - { - if ($this->reading) { - throw new PendingReadError(); - } - if (!$this->streams) { - return new Success(null); - } - return call(function () { - $this->reading = \true; - try { - while ($this->streams) { - $chunk = (yield $this->streams[0]->read()); - if ($chunk === null) { - \array_shift($this->streams); - continue; - } - return $chunk; - } - return null; - } finally { - $this->reading = \false; - } - }); - } -} diff --git a/dependencies/amphp/byte-stream/lib/IteratorStream.php b/dependencies/amphp/byte-stream/lib/IteratorStream.php deleted file mode 100644 index ac51e50..0000000 --- a/dependencies/amphp/byte-stream/lib/IteratorStream.php +++ /dev/null @@ -1,55 +0,0 @@ - */ - private $iterator; - /** @var \Throwable|null */ - private $exception; - /** @var bool */ - private $pending = \false; - /** - * @psam-param Iterator $iterator - */ - public function __construct(Iterator $iterator) - { - $this->iterator = $iterator; - } - /** @inheritdoc */ - public function read() : Promise - { - if ($this->exception) { - return new Failure($this->exception); - } - if ($this->pending) { - throw new PendingReadError(); - } - $this->pending = \true; - /** @var Deferred $deferred */ - $deferred = new Deferred(); - $this->iterator->advance()->onResolve(function ($error, $hasNextElement) use($deferred) { - $this->pending = \false; - if ($error) { - $this->exception = $error; - $deferred->fail($error); - } elseif ($hasNextElement) { - $chunk = $this->iterator->getCurrent(); - if (!\is_string($chunk)) { - $this->exception = new StreamException(\sprintf("Unexpected iterator value of type '%s', expected string", \is_object($chunk) ? \get_class($chunk) : \gettype($chunk))); - $deferred->fail($this->exception); - return; - } - $deferred->resolve($chunk); - } else { - $deferred->resolve(); - } - }); - return $deferred->promise(); - } -} diff --git a/dependencies/amphp/byte-stream/lib/LineReader.php b/dependencies/amphp/byte-stream/lib/LineReader.php deleted file mode 100644 index 696b357..0000000 --- a/dependencies/amphp/byte-stream/lib/LineReader.php +++ /dev/null @@ -1,59 +0,0 @@ -source = $inputStream; - $this->delimiter = $delimiter === null ? "\n" : $delimiter; - $this->lineMode = $delimiter === null; - } - /** - * @return Promise - */ - public function readLine() : Promise - { - return call(function () { - if (\false !== \strpos($this->buffer, $this->delimiter)) { - list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); - return $this->lineMode ? \rtrim($line, "\r") : $line; - } - while (null !== ($chunk = (yield $this->source->read()))) { - $this->buffer .= $chunk; - if (\false !== \strpos($this->buffer, $this->delimiter)) { - list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); - return $this->lineMode ? \rtrim($line, "\r") : $line; - } - } - if ($this->buffer === "") { - return null; - } - $line = $this->buffer; - $this->buffer = ""; - return $this->lineMode ? \rtrim($line, "\r") : $line; - }); - } - public function getBuffer() : string - { - return $this->buffer; - } - /** - * @return void - */ - public function clearBuffer() - { - $this->buffer = ""; - } -} diff --git a/dependencies/amphp/byte-stream/lib/Message.php b/dependencies/amphp/byte-stream/lib/Message.php deleted file mode 100644 index b7e18e6..0000000 --- a/dependencies/amphp/byte-stream/lib/Message.php +++ /dev/null @@ -1,151 +0,0 @@ -read()) !== null) { - * // Immediately use $chunk, reducing memory consumption since the entire message is never buffered. - * } - * - * @deprecated Use Amp\ByteStream\Payload instead. - */ -class Message implements InputStream, Promise -{ - /** @var InputStream */ - private $source; - /** @var string */ - private $buffer = ""; - /** @var Deferred|null */ - private $pendingRead; - /** @var Coroutine|null */ - private $coroutine; - /** @var bool True if onResolve() has been called. */ - private $buffering = \false; - /** @var Deferred|null */ - private $backpressure; - /** @var bool True if the iterator has completed. */ - private $complete = \false; - /** @var \Throwable|null Used to fail future reads on failure. */ - private $error; - /** - * @param InputStream $source An iterator that only emits strings. - */ - public function __construct(InputStream $source) - { - $this->source = $source; - } - private function consume() : \Generator - { - while (($chunk = (yield $this->source->read())) !== null) { - $buffer = $this->buffer .= $chunk; - if ($buffer === "") { - continue; - // Do not succeed reads with empty string. - } elseif ($this->pendingRead) { - $deferred = $this->pendingRead; - $this->pendingRead = null; - $this->buffer = ""; - $deferred->resolve($buffer); - $buffer = ""; - // Destroy last emitted chunk to free memory. - } elseif (!$this->buffering) { - $buffer = ""; - // Destroy last emitted chunk to free memory. - $this->backpressure = new Deferred(); - (yield $this->backpressure->promise()); - } - } - $this->complete = \true; - if ($this->pendingRead) { - $deferred = $this->pendingRead; - $this->pendingRead = null; - $deferred->resolve($this->buffer !== "" ? $this->buffer : null); - $this->buffer = ""; - } - return $this->buffer; - } - /** @inheritdoc */ - public final function read() : Promise - { - if ($this->pendingRead) { - throw new PendingReadError(); - } - if ($this->coroutine === null) { - $this->coroutine = new Coroutine($this->consume()); - $this->coroutine->onResolve(function ($error) { - if ($error) { - $this->error = $error; - } - if ($this->pendingRead) { - $deferred = $this->pendingRead; - $this->pendingRead = null; - $deferred->fail($error); - } - }); - } - if ($this->error) { - return new Failure($this->error); - } - if ($this->buffer !== "") { - $buffer = $this->buffer; - $this->buffer = ""; - if ($this->backpressure) { - $backpressure = $this->backpressure; - $this->backpressure = null; - $backpressure->resolve(); - } - return new Success($buffer); - } - if ($this->complete) { - return new Success(); - } - $this->pendingRead = new Deferred(); - return $this->pendingRead->promise(); - } - /** @inheritdoc */ - public final function onResolve(callable $onResolved) - { - $this->buffering = \true; - if ($this->coroutine === null) { - $this->coroutine = new Coroutine($this->consume()); - } - if ($this->backpressure) { - $backpressure = $this->backpressure; - $this->backpressure = null; - $backpressure->resolve(); - } - $this->coroutine->onResolve($onResolved); - } - /** - * Exposes the source input stream. - * - * This might be required to resolve a promise with an InputStream, because promises in Amp can't be resolved with - * other promises. - * - * @return InputStream - */ - public final function getInputStream() : InputStream - { - return $this->source; - } -} diff --git a/dependencies/amphp/byte-stream/lib/OutputBuffer.php b/dependencies/amphp/byte-stream/lib/OutputBuffer.php deleted file mode 100644 index 3d73648..0000000 --- a/dependencies/amphp/byte-stream/lib/OutputBuffer.php +++ /dev/null @@ -1,43 +0,0 @@ -deferred = new Deferred(); - } - public function write(string $data) : Promise - { - if ($this->closed) { - throw new ClosedException("The stream has already been closed."); - } - $this->contents .= $data; - return new Success(\strlen($data)); - } - public function end(string $finalData = "") : Promise - { - if ($this->closed) { - throw new ClosedException("The stream has already been closed."); - } - $this->contents .= $finalData; - $this->closed = \true; - $this->deferred->resolve($this->contents); - $this->contents = ""; - return new Success(\strlen($finalData)); - } - public function onResolve(callable $onResolved) - { - $this->deferred->promise()->onResolve($onResolved); - } -} diff --git a/dependencies/amphp/byte-stream/lib/OutputStream.php b/dependencies/amphp/byte-stream/lib/OutputStream.php deleted file mode 100644 index ec84165..0000000 --- a/dependencies/amphp/byte-stream/lib/OutputStream.php +++ /dev/null @@ -1,35 +0,0 @@ -stream = $stream; - } - public function __destruct() - { - if (!$this->promise) { - Promise\rethrow(new Coroutine($this->consume())); - } - } - private function consume() : \Generator - { - try { - if ($this->lastRead && null === (yield $this->lastRead)) { - return; - } - while (null !== (yield $this->stream->read())) { - // Discard unread bytes from message. - } - } catch (\Throwable $exception) { - // If exception is thrown here the connection closed anyway. - } - } - /** - * @inheritdoc - * - * @throws \Error If a buffered message was requested by calling buffer(). - */ - public final function read() : Promise - { - if ($this->promise) { - throw new \Error("Cannot stream message data once a buffered message has been requested"); - } - return $this->lastRead = $this->stream->read(); - } - /** - * Buffers the entire message and resolves the returned promise then. - * - * @return Promise Resolves with the entire message contents. - */ - public final function buffer() : Promise - { - if ($this->promise) { - return $this->promise; - } - return $this->promise = call(function () { - $buffer = ''; - if ($this->lastRead && null === (yield $this->lastRead)) { - return $buffer; - } - while (null !== ($chunk = (yield $this->stream->read()))) { - $buffer .= $chunk; - } - return $buffer; - }); - } -} diff --git a/dependencies/amphp/byte-stream/lib/PendingReadError.php b/dependencies/amphp/byte-stream/lib/PendingReadError.php deleted file mode 100644 index e103c9f..0000000 --- a/dependencies/amphp/byte-stream/lib/PendingReadError.php +++ /dev/null @@ -1,14 +0,0 @@ -useSingleRead = $useSingleRead; - if (\strpos($meta["mode"], "r") === \false && \strpos($meta["mode"], "+") === \false) { - throw new \Error("Expected a readable stream"); - } - \stream_set_blocking($stream, \false); - \stream_set_read_buffer($stream, 0); - $this->resource =& $stream; - $this->chunkSize =& $chunkSize; - $deferred =& $this->deferred; - $readable =& $this->readable; - $this->watcher = Loop::onReadable($this->resource, static function ($watcher) use(&$deferred, &$readable, &$stream, &$chunkSize, $useSingleRead) { - if ($useSingleRead) { - $data = @\fread($stream, $chunkSize); - } else { - $data = @\stream_get_contents($stream, $chunkSize); - } - \assert($data !== \false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); - // Error suppression, because pthreads does crazy things with resources, - // which might be closed during two operations. - // See https://github.com/amphp/byte-stream/issues/32 - if ($data === '' && @\feof($stream)) { - $readable = \false; - $stream = null; - $data = null; - // Stream closed, resolve read with null. - Loop::cancel($watcher); - } else { - Loop::disable($watcher); - } - $temp = $deferred; - $deferred = null; - \assert($temp instanceof Deferred); - $temp->resolve($data); - }); - $this->immediateCallable = static function ($watcherId, $data) use(&$deferred) { - $temp = $deferred; - $deferred = null; - \assert($temp instanceof Deferred); - $temp->resolve($data); - }; - Loop::disable($this->watcher); - } - /** @inheritdoc */ - public function read() : Promise - { - if ($this->deferred !== null) { - throw new PendingReadError(); - } - if (!$this->readable) { - return new Success(); - // Resolve with null on closed stream. - } - \assert($this->resource !== null); - // Attempt a direct read, because Windows suffers from slow I/O on STDIN otherwise. - if ($this->useSingleRead) { - $data = @\fread($this->resource, $this->chunkSize); - } else { - $data = @\stream_get_contents($this->resource, $this->chunkSize); - } - \assert($data !== \false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); - if ($data === '') { - // Error suppression, because pthreads does crazy things with resources, - // which might be closed during two operations. - // See https://github.com/amphp/byte-stream/issues/32 - if (@\feof($this->resource)) { - $this->readable = \false; - $this->resource = null; - Loop::cancel($this->watcher); - return new Success(); - // Stream closed, resolve read with null. - } - $this->deferred = new Deferred(); - Loop::enable($this->watcher); - return $this->deferred->promise(); - } - // Prevent an immediate read → write loop from blocking everything - // See e.g. examples/benchmark-throughput.php - $this->deferred = new Deferred(); - $this->immediateWatcher = Loop::defer($this->immediateCallable, $data); - return $this->deferred->promise(); - } - /** - * Closes the stream forcefully. Multiple `close()` calls are ignored. - * - * @return void - */ - public function close() - { - if (\is_resource($this->resource)) { - // Error suppression, as resource might already be closed - $meta = @\stream_get_meta_data($this->resource); - if ($meta && \strpos($meta["mode"], "+") !== \false) { - @\stream_socket_shutdown($this->resource, \STREAM_SHUT_RD); - } else { - /** @psalm-suppress InvalidPropertyAssignmentValue */ - @\fclose($this->resource); - } - } - $this->free(); - } - /** - * Nulls reference to resource, marks stream unreadable, and succeeds any pending read with null. - * - * @return void - */ - private function free() - { - $this->readable = \false; - $this->resource = null; - if ($this->deferred !== null) { - $deferred = $this->deferred; - $this->deferred = null; - $deferred->resolve(); - } - Loop::cancel($this->watcher); - if ($this->immediateWatcher !== null) { - Loop::cancel($this->immediateWatcher); - } - } - /** - * @return resource|null The stream resource or null if the stream has closed. - */ - public function getResource() - { - return $this->resource; - } - /** - * @return void - */ - public function setChunkSize(int $chunkSize) - { - $this->chunkSize = $chunkSize; - } - /** - * References the read watcher, so the loop keeps running in case there's an active read. - * - * @return void - * - * @see Loop::reference() - */ - public function reference() - { - if (!$this->resource) { - throw new \Error("Resource has already been freed"); - } - Loop::reference($this->watcher); - } - /** - * Unreferences the read watcher, so the loop doesn't keep running even if there are active reads. - * - * @return void - * - * @see Loop::unreference() - */ - public function unreference() - { - if (!$this->resource) { - throw new \Error("Resource has already been freed"); - } - Loop::unreference($this->watcher); - } - public function __destruct() - { - if ($this->resource !== null) { - $this->free(); - } - } -} diff --git a/dependencies/amphp/byte-stream/lib/ResourceOutputStream.php b/dependencies/amphp/byte-stream/lib/ResourceOutputStream.php deleted file mode 100644 index 5fa7459..0000000 --- a/dependencies/amphp/byte-stream/lib/ResourceOutputStream.php +++ /dev/null @@ -1,270 +0,0 @@ - */ - private $writes; - /** @var bool */ - private $writable = \true; - /** @var int|null */ - private $chunkSize; - /** - * @param resource $stream Stream resource. - * @param int|null $chunkSize Chunk size per `fwrite()` operation. - */ - public function __construct($stream, int $chunkSize = null) - { - if (!\is_resource($stream) || \get_resource_type($stream) !== 'stream') { - throw new \Error("Expected a valid stream"); - } - $meta = \stream_get_meta_data($stream); - if (\strpos($meta["mode"], "r") !== \false && \strpos($meta["mode"], "+") === \false) { - throw new \Error("Expected a writable stream"); - } - \stream_set_blocking($stream, \false); - \stream_set_write_buffer($stream, 0); - $this->resource = $stream; - $this->chunkSize =& $chunkSize; - $writes = $this->writes = new \SplQueue(); - $writable =& $this->writable; - $resource =& $this->resource; - $this->watcher = Loop::onWritable($stream, static function ($watcher, $stream) use($writes, &$chunkSize, &$writable, &$resource) { - static $emptyWrites = 0; - try { - while (!$writes->isEmpty()) { - /** @var Deferred $deferred */ - list($data, $previous, $deferred) = $writes->shift(); - $length = \strlen($data); - if ($length === 0) { - $deferred->resolve(0); - continue; - } - if (!\is_resource($stream) || ($metaData = @\stream_get_meta_data($stream)) && $metaData['eof']) { - throw new ClosedException("The stream was closed by the peer"); - } - // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. - // Use conditional, because PHP doesn't like getting null passed - if ($chunkSize) { - $written = @\fwrite($stream, $data, $chunkSize); - } else { - $written = @\fwrite($stream, $data); - } - \assert( - $written !== \false || \PHP_VERSION_ID >= 70400, - // PHP 7.4+ returns false on EPIPE. - "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." - ); - // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. - if ($written === \false && \PHP_VERSION_ID >= 70402) { - $message = "Failed to write to stream"; - if ($error = \error_get_last()) { - $message .= \sprintf("; %s", $error["message"]); - } - throw new StreamException($message); - } - // Broken pipes between processes on macOS/FreeBSD do not detect EOF properly. - if ($written === 0 || $written === \false) { - if ($emptyWrites++ > self::MAX_CONSECUTIVE_EMPTY_WRITES) { - $message = "Failed to write to stream after multiple attempts"; - if ($error = \error_get_last()) { - $message .= \sprintf("; %s", $error["message"]); - } - throw new StreamException($message); - } - $writes->unshift([$data, $previous, $deferred]); - return; - } - $emptyWrites = 0; - if ($length > $written) { - $data = \substr($data, $written); - $writes->unshift([$data, $written + $previous, $deferred]); - return; - } - $deferred->resolve($written + $previous); - } - } catch (\Throwable $exception) { - $resource = null; - $writable = \false; - /** @psalm-suppress PossiblyUndefinedVariable */ - $deferred->fail($exception); - while (!$writes->isEmpty()) { - list(, , $deferred) = $writes->shift(); - $deferred->fail($exception); - } - Loop::cancel($watcher); - } finally { - if ($writes->isEmpty()) { - Loop::disable($watcher); - } - } - }); - Loop::disable($this->watcher); - } - /** - * Writes data to the stream. - * - * @param string $data Bytes to write. - * - * @return Promise Succeeds once the data has been successfully written to the stream. - * - * @throws ClosedException If the stream has already been closed. - */ - public function write(string $data) : Promise - { - return $this->send($data, \false); - } - /** - * Closes the stream after all pending writes have been completed. Optionally writes a final data chunk before. - * - * @param string $finalData Bytes to write. - * - * @return Promise Succeeds once the data has been successfully written to the stream. - * - * @throws ClosedException If the stream has already been closed. - */ - public function end(string $finalData = "") : Promise - { - return $this->send($finalData, \true); - } - private function send(string $data, bool $end = \false) : Promise - { - if (!$this->writable) { - return new Failure(new ClosedException("The stream is not writable")); - } - $length = \strlen($data); - $written = 0; - if ($end) { - $this->writable = \false; - } - if ($this->writes->isEmpty()) { - if ($length === 0) { - if ($end) { - $this->close(); - } - return new Success(0); - } - if (!\is_resource($this->resource) || ($metaData = @\stream_get_meta_data($this->resource)) && $metaData['eof']) { - return new Failure(new ClosedException("The stream was closed by the peer")); - } - // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. - // Use conditional, because PHP doesn't like getting null passed. - if ($this->chunkSize) { - $written = @\fwrite($this->resource, $data, $this->chunkSize); - } else { - $written = @\fwrite($this->resource, $data); - } - \assert( - $written !== \false || \PHP_VERSION_ID >= 70400, - // PHP 7.4+ returns false on EPIPE. - "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." - ); - // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. - if ($written === \false && \PHP_VERSION_ID >= 70402) { - $message = "Failed to write to stream"; - if ($error = \error_get_last()) { - $message .= \sprintf("; %s", $error["message"]); - } - return new Failure(new StreamException($message)); - } - $written = (int) $written; - // Cast potential false to 0. - if ($length === $written) { - if ($end) { - $this->close(); - } - return new Success($written); - } - $data = \substr($data, $written); - } - $deferred = new Deferred(); - if ($length - $written > self::LARGE_CHUNK_SIZE) { - $chunks = \str_split($data, self::LARGE_CHUNK_SIZE); - $data = \array_pop($chunks); - foreach ($chunks as $chunk) { - $this->writes->push([$chunk, $written, new Deferred()]); - $written += self::LARGE_CHUNK_SIZE; - } - } - $this->writes->push([$data, $written, $deferred]); - Loop::enable($this->watcher); - $promise = $deferred->promise(); - if ($end) { - $promise->onResolve([$this, "close"]); - } - return $promise; - } - /** - * Closes the stream forcefully. Multiple `close()` calls are ignored. - * - * @return void - */ - public function close() - { - if (\is_resource($this->resource)) { - // Error suppression, as resource might already be closed - $meta = @\stream_get_meta_data($this->resource); - if ($meta && \strpos($meta["mode"], "+") !== \false) { - @\stream_socket_shutdown($this->resource, \STREAM_SHUT_WR); - } else { - /** @psalm-suppress InvalidPropertyAssignmentValue psalm reports this as closed-resource */ - @\fclose($this->resource); - } - } - $this->free(); - } - /** - * Nulls reference to resource, marks stream unwritable, and fails any pending write. - * - * @return void - */ - private function free() - { - $this->resource = null; - $this->writable = \false; - if (!$this->writes->isEmpty()) { - $exception = new ClosedException("The socket was closed before writing completed"); - do { - /** @var Deferred $deferred */ - list(, , $deferred) = $this->writes->shift(); - $deferred->fail($exception); - } while (!$this->writes->isEmpty()); - } - Loop::cancel($this->watcher); - } - /** - * @return resource|null Stream resource or null if end() has been called or the stream closed. - */ - public function getResource() - { - return $this->resource; - } - /** - * @return void - */ - public function setChunkSize(int $chunkSize) - { - $this->chunkSize = $chunkSize; - } - public function __destruct() - { - if ($this->resource !== null) { - $this->free(); - } - } -} diff --git a/dependencies/amphp/byte-stream/lib/StreamException.php b/dependencies/amphp/byte-stream/lib/StreamException.php deleted file mode 100644 index 5baf1bc..0000000 --- a/dependencies/amphp/byte-stream/lib/StreamException.php +++ /dev/null @@ -1,7 +0,0 @@ -source = $source; - $this->encoding = $encoding; - $this->options = $options; - $this->resource = @\inflate_init($encoding, $options); - if ($this->resource === \false) { - throw new StreamException("Failed initializing deflate context"); - } - } - /** @inheritdoc */ - public function read() : Promise - { - return call(function () { - if ($this->resource === null) { - return null; - } - \assert($this->source !== null); - $data = (yield $this->source->read()); - // Needs a double guard, as stream might have been closed while reading - /** @psalm-suppress ParadoxicalCondition */ - if ($this->resource === null) { - return null; - } - if ($data === null) { - $decompressed = @\inflate_add($this->resource, "", \ZLIB_FINISH); - if ($decompressed === \false) { - throw new StreamException("Failed adding data to deflate context"); - } - $this->close(); - return $decompressed; - } - $decompressed = @\inflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); - if ($decompressed === \false) { - throw new StreamException("Failed adding data to deflate context"); - } - return $decompressed; - }); - } - /** - * @internal - * @return void - */ - private function close() - { - $this->resource = null; - $this->source = null; - } - /** - * Gets the used compression encoding. - * - * @return int Encoding specified on construction time. - */ - public function getEncoding() : int - { - return $this->encoding; - } - /** - * Gets the used compression options. - * - * @return array Options array passed on construction time. - */ - public function getOptions() : array - { - return $this->options; - } -} diff --git a/dependencies/amphp/byte-stream/lib/ZlibOutputStream.php b/dependencies/amphp/byte-stream/lib/ZlibOutputStream.php deleted file mode 100644 index 9066418..0000000 --- a/dependencies/amphp/byte-stream/lib/ZlibOutputStream.php +++ /dev/null @@ -1,101 +0,0 @@ -destination = $destination; - $this->encoding = $encoding; - $this->options = $options; - $this->resource = @\deflate_init($encoding, $options); - if ($this->resource === \false) { - throw new StreamException("Failed initializing deflate context"); - } - } - /** @inheritdoc */ - public function write(string $data) : Promise - { - if ($this->resource === null) { - throw new ClosedException("The stream has already been closed"); - } - \assert($this->destination !== null); - $compressed = \deflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); - if ($compressed === \false) { - throw new StreamException("Failed adding data to deflate context"); - } - $promise = $this->destination->write($compressed); - $promise->onResolve(function ($error) { - if ($error) { - $this->close(); - } - }); - return $promise; - } - /** @inheritdoc */ - public function end(string $finalData = "") : Promise - { - if ($this->resource === null) { - throw new ClosedException("The stream has already been closed"); - } - \assert($this->destination !== null); - $compressed = \deflate_add($this->resource, $finalData, \ZLIB_FINISH); - if ($compressed === \false) { - throw new StreamException("Failed adding data to deflate context"); - } - $promise = $this->destination->end($compressed); - $promise->onResolve(function () { - $this->close(); - }); - return $promise; - } - /** - * @internal - * @return void - */ - private function close() - { - $this->resource = null; - $this->destination = null; - } - /** - * Gets the used compression encoding. - * - * @return int Encoding specified on construction time. - */ - public function getEncoding() : int - { - return $this->encoding; - } - /** - * Gets the used compression options. - * - * @return array Options array passed on construction time. - */ - public function getOptions() : array - { - return $this->options; - } -} diff --git a/dependencies/amphp/byte-stream/lib/functions.php b/dependencies/amphp/byte-stream/lib/functions.php deleted file mode 100644 index 98101b2..0000000 --- a/dependencies/amphp/byte-stream/lib/functions.php +++ /dev/null @@ -1,154 +0,0 @@ -read())) !== null) { - $written += \strlen($chunk); - $writePromise = $destination->write($chunk); - $chunk = null; - // free memory - (yield $writePromise); - } - return $written; - }); -} -/** - * @param \Amp\ByteStream\InputStream $source - * - * @return \Amp\Promise - */ -function buffer(InputStream $source) : Promise -{ - return call(function () use($source) : \Generator { - $buffer = ""; - while (($chunk = (yield $source->read())) !== null) { - $buffer .= $chunk; - $chunk = null; - // free memory - } - return $buffer; - }); -} -/** - * The php://input input buffer stream for the process associated with the currently active event loop. - * - * @return ResourceInputStream - */ -function getInputBufferStream() : ResourceInputStream -{ - static $key = InputStream::class . '\\input'; - $stream = Loop::getState($key); - if (!$stream) { - $stream = new ResourceInputStream(\fopen('php://input', 'rb')); - Loop::setState($key, $stream); - } - return $stream; -} -/** - * The php://output output buffer stream for the process associated with the currently active event loop. - * - * @return ResourceOutputStream - */ -function getOutputBufferStream() : ResourceOutputStream -{ - static $key = OutputStream::class . '\\output'; - $stream = Loop::getState($key); - if (!$stream) { - $stream = new ResourceOutputStream(\fopen('php://output', 'wb')); - Loop::setState($key, $stream); - } - return $stream; -} -/** - * The STDIN stream for the process associated with the currently active event loop. - * - * @return ResourceInputStream - */ -function getStdin() : ResourceInputStream -{ - static $key = InputStream::class . '\\stdin'; - $stream = Loop::getState($key); - if (!$stream) { - $stream = new ResourceInputStream(\STDIN); - Loop::setState($key, $stream); - } - return $stream; -} -/** - * The STDOUT stream for the process associated with the currently active event loop. - * - * @return ResourceOutputStream - */ -function getStdout() : ResourceOutputStream -{ - static $key = OutputStream::class . '\\stdout'; - $stream = Loop::getState($key); - if (!$stream) { - $stream = new ResourceOutputStream(\STDOUT); - Loop::setState($key, $stream); - } - return $stream; -} -/** - * The STDERR stream for the process associated with the currently active event loop. - * - * @return ResourceOutputStream - */ -function getStderr() : ResourceOutputStream -{ - static $key = OutputStream::class . '\\stderr'; - $stream = Loop::getState($key); - if (!$stream) { - $stream = new ResourceOutputStream(\STDERR); - Loop::setState($key, $stream); - } - return $stream; -} -function parseLineDelimitedJson(InputStream $stream, bool $assoc = \false, int $depth = 512, int $options = 0) : Iterator -{ - return new Producer(static function (callable $emit) use($stream, $assoc, $depth, $options) { - $reader = new LineReader($stream); - while (null !== ($line = (yield $reader->readLine()))) { - $line = \trim($line); - if ($line === '') { - continue; - } - /** @noinspection PhpComposerExtensionStubsInspection */ - $data = \json_decode($line, $assoc, $depth, $options); - /** @noinspection PhpComposerExtensionStubsInspection */ - $error = \json_last_error(); - /** @noinspection PhpComposerExtensionStubsInspection */ - if ($error !== \JSON_ERROR_NONE) { - /** @noinspection PhpComposerExtensionStubsInspection */ - throw new StreamException('Failed to parse JSON: ' . \json_last_error_msg(), $error); - } - (yield $emit($data)); - } - }); -} diff --git a/dependencies/amphp/byte-stream/psalm.xml b/dependencies/amphp/byte-stream/psalm.xml deleted file mode 100644 index 9684f55..0000000 --- a/dependencies/amphp/byte-stream/psalm.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/amphp/cache/lib/ArrayCache.php b/dependencies/amphp/cache/lib/ArrayCache.php deleted file mode 100644 index 49cee3d..0000000 --- a/dependencies/amphp/cache/lib/ArrayCache.php +++ /dev/null @@ -1,99 +0,0 @@ -sharedState = $sharedState = new class - { - use Struct; - /** @var string[] */ - public $cache = []; - /** @var int[] */ - public $cacheTimeouts = []; - /** @var bool */ - public $isSortNeeded = \false; - public function collectGarbage() : void - { - $now = \time(); - if ($this->isSortNeeded) { - \asort($this->cacheTimeouts); - $this->isSortNeeded = \false; - } - foreach ($this->cacheTimeouts as $key => $expiry) { - if ($now <= $expiry) { - break; - } - unset($this->cache[$key], $this->cacheTimeouts[$key]); - } - } - }; - $this->ttlWatcherId = Loop::repeat($gcInterval, [$sharedState, "collectGarbage"]); - $this->maxSize = $maxSize; - Loop::unreference($this->ttlWatcherId); - } - public function __destruct() - { - $this->sharedState->cache = []; - $this->sharedState->cacheTimeouts = []; - Loop::cancel($this->ttlWatcherId); - } - /** @inheritdoc */ - public function get(string $key) : Promise - { - if (!isset($this->sharedState->cache[$key])) { - return new Success(null); - } - if (isset($this->sharedState->cacheTimeouts[$key]) && \time() > $this->sharedState->cacheTimeouts[$key]) { - unset($this->sharedState->cache[$key], $this->sharedState->cacheTimeouts[$key]); - return new Success(null); - } - return new Success($this->sharedState->cache[$key]); - } - /** @inheritdoc */ - public function set(string $key, string $value, int $ttl = null) : Promise - { - if ($ttl === null) { - unset($this->sharedState->cacheTimeouts[$key]); - } elseif ($ttl >= 0) { - $expiry = \time() + $ttl; - $this->sharedState->cacheTimeouts[$key] = $expiry; - $this->sharedState->isSortNeeded = \true; - } else { - throw new \Error("Invalid cache TTL ({$ttl}; integer >= 0 or null required"); - } - unset($this->sharedState->cache[$key]); - if (\count($this->sharedState->cache) === $this->maxSize) { - \array_shift($this->sharedState->cache); - } - $this->sharedState->cache[$key] = $value; - /** @var Promise */ - return new Success(); - } - /** @inheritdoc */ - public function delete(string $key) : Promise - { - $exists = isset($this->sharedState->cache[$key]); - unset($this->sharedState->cache[$key], $this->sharedState->cacheTimeouts[$key]); - return new Success($exists); - } -} diff --git a/dependencies/amphp/cache/lib/AtomicCache.php b/dependencies/amphp/cache/lib/AtomicCache.php deleted file mode 100644 index 01c471a..0000000 --- a/dependencies/amphp/cache/lib/AtomicCache.php +++ /dev/null @@ -1,237 +0,0 @@ - */ - private $cache; - /** @var KeyedMutex */ - private $mutex; - /** - * @param SerializedCache $cache - * @param KeyedMutex $mutex - */ - public function __construct(SerializedCache $cache, KeyedMutex $mutex) - { - $this->cache = $cache; - $this->mutex = $mutex; - } - /** - * Obtains the lock for the given key, then invokes the $create callback with the current cached value (which may - * be null if the key did not exist in the cache). The value returned from the callback is stored in the cache and - * the promise returned from this method is resolved with the value. - * - * @param string $key - * @param callable(string, mixed|null): mixed $create Receives $key and $value as parameters. - * @param int|null $ttl Timeout in seconds. The default `null` $ttl value indicates no timeout. - * - * @return Promise - * - * @psalm-param callable(string, TValue|null):(TValue|Promise|\Generator) - * $create - * @psalm-return Promise - * - * @throws CacheException If the $create callback throws an exception while generating the value. - * @throws SerializationException If serializing the value returned from the callback fails. - */ - public function compute(string $key, callable $create, ?int $ttl = null) : Promise - { - return call(function () use($key, $create, $ttl) : \Generator { - $lock = (yield from $this->lock($key)); - \assert($lock instanceof Lock); - try { - $value = (yield $this->cache->get($key)); - return yield from $this->create($create, $key, $value, $ttl); - } finally { - $lock->release(); - } - }); - } - /** - * Attempts to get the value for the given key. If the key is not found, the key is locked, the $create callback - * is invoked with the key as the first parameter. The value returned from the callback is stored in the cache and - * the promise returned from this method is resolved with the value. - * - * @param string $key Cache key. - * @param callable(string): mixed $create Receives $key as parameter. - * @param int|null $ttl Timeout in seconds. The default `null` $ttl value indicates no timeout. - * - * @return Promise - * - * @psalm-param callable(string, TValue|null):(TValue|Promise|\Generator) - * $create - * @psalm-return Promise - * - * @throws CacheException If the $create callback throws an exception while generating the value. - * @throws SerializationException If serializing the value returned from the callback fails. - */ - public function computeIfAbsent(string $key, callable $create, ?int $ttl = null) : Promise - { - return call(function () use($key, $create, $ttl) : \Generator { - $value = (yield $this->cache->get($key)); - if ($value !== null) { - return $value; - } - $lock = (yield from $this->lock($key)); - \assert($lock instanceof Lock); - try { - // Attempt to get the value again, since it may have been set while obtaining the lock. - $value = (yield $this->cache->get($key)); - if ($value !== null) { - return $value; - } - return yield from $this->create($create, $key, null, $ttl); - } finally { - $lock->release(); - } - }); - } - /** - * Attempts to get the value for the given key. If the key exists, the key is locked, the $create callback - * is invoked with the key as the first parameter and the current key value as the second parameter. The value - * returned from the callback is stored in the cache and the promise returned from this method is resolved with - * the value. - * - * @param string $key Cache key. - * @param callable(string, mixed): mixed $create Receives $key and $value as parameters. - * @param int|null $ttl Timeout in seconds. The default `null` $ttl value indicates no timeout. - * - * @return Promise - * - * @psalm-param callable(string, TValue|null): (TValue|Promise|\Generator) $create - * @psalm-return Promise - * - * @throws CacheException If the $create callback throws an exception while generating the value. - * @throws SerializationException If serializing the value returned from the callback fails. - */ - public function computeIfPresent(string $key, callable $create, ?int $ttl = null) : Promise - { - return call(function () use($key, $create, $ttl) : \Generator { - $value = (yield $this->cache->get($key)); - if ($value === null) { - return null; - } - $lock = (yield from $this->lock($key)); - \assert($lock instanceof Lock); - try { - // Attempt to get the value again, since it may have been set while obtaining the lock. - $value = (yield $this->cache->get($key)); - if ($value === null) { - return null; - } - return yield from $this->create($create, $key, $value, $ttl); - } finally { - $lock->release(); - } - }); - } - /** - * The lock is obtained for the key before setting the value. - * - * @param string $key Cache key. - * @param mixed $value Value to cache. - * @param int|null $ttl Timeout in seconds. The default `null` $ttl value indicates no timeout. - * - * @return Promise Resolves either successfully or fails with a CacheException on failure. - * - * @psalm-param TValue $value - * @psalm-return Promise - * - * @throws CacheException - * @throws SerializationException - * - * @see SerializedCache::set() - */ - public function set(string $key, $value, ?int $ttl = null) : Promise - { - return call(function () use($key, $value, $ttl) : \Generator { - $lock = (yield from $this->lock($key)); - \assert($lock instanceof Lock); - try { - (yield $this->cache->set($key, $value, $ttl)); - } finally { - $lock->release(); - } - }); - } - /** - * Returns the cached value for the key or the given default value if the key does not exist. - * - * @template TDefault - * - * @param string $key Cache key. - * @param mixed $default Default value returned if the key does not exist. Null by default. - * - * @return Promise Resolved with null iff $default is null. - * - * @psalm-param TDefault $default - * @psalm-return Promise - * - * @throws CacheException - * @throws SerializationException - * - * @see SerializedCache::get() - */ - public function get(string $key, $default = null) : Promise - { - return call(function () use($key, $default) : \Generator { - $value = (yield $this->cache->get($key)); - if ($value === null) { - return $default; - } - return $value; - }); - } - /** - * The lock is obtained for the key before deleting the key. - * - * @param string $key - * - * @return Promise - * - * @see SerializedCache::delete() - */ - public function delete(string $key) : Promise - { - return call(function () use($key) : \Generator { - $lock = (yield from $this->lock($key)); - \assert($lock instanceof Lock); - try { - return (yield $this->cache->delete($key)); - } finally { - $lock->release(); - } - }); - } - private function lock(string $key) : \Generator - { - try { - return (yield $this->mutex->acquire($key)); - } catch (\Throwable $exception) { - throw new CacheException(\sprintf('Exception thrown when obtaining the lock for key "%s"', $key), 0, $exception); - } - } - /** - * @psalm-param TValue|null $value - * @psalm-return \Generator - */ - private function create(callable $create, string $key, $value, ?int $ttl) : \Generator - { - try { - $value = (yield call($create, $key, $value)); - } catch (\Throwable $exception) { - throw new CacheException(\sprintf('Exception thrown while creating the value for key "%s"', $key), 0, $exception); - } - (yield $this->cache->set($key, $value, $ttl)); - return $value; - } -} diff --git a/dependencies/amphp/cache/lib/Cache.php b/dependencies/amphp/cache/lib/Cache.php deleted file mode 100644 index 9379d68..0000000 --- a/dependencies/amphp/cache/lib/Cache.php +++ /dev/null @@ -1,48 +0,0 @@ - Resolves to the cached value nor `null` if it doesn't exist or fails with a - * CacheException on failure. - */ - public function get(string $key) : Promise; - /** - * Sets a value associated with the given key. Overrides existing values (if they exist). - * - * The eventual resolution value of the resulting promise is unimportant. The success or failure of the promise - * indicates the operation's success. - * - * @param $key string Cache key. - * @param $value string Value to cache. - * @param $ttl int Timeout in seconds. The default `null` $ttl value indicates no timeout. Values less than 0 MUST - * throw an \Error. - * - * @return Promise Resolves either successfully or fails with a CacheException on failure. - */ - public function set(string $key, string $value, int $ttl = null) : Promise; - /** - * Deletes a value associated with the given key if it exists. - * - * Implementations SHOULD return boolean `true` or `false` to indicate whether the specified key existed at the time - * the delete operation was requested. If such information is not available, the implementation MUST resolve the - * promise with `null`. - * - * Implementations MUST transparently succeed operations for non-existent keys. - * - * @param $key string Cache key. - * - * @return Promise Resolves to `true` / `false` to indicate whether the key existed or fails with a - * CacheException on failure. May also resolve with `null` if that information is not available. - */ - public function delete(string $key) : Promise; -} diff --git a/dependencies/amphp/cache/lib/CacheException.php b/dependencies/amphp/cache/lib/CacheException.php deleted file mode 100644 index 7aad9d8..0000000 --- a/dependencies/amphp/cache/lib/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ -directory = $directory = \rtrim($directory, "/\\"); - $this->mutex = $mutex; - if (!\interface_exists(Driver::class)) { - throw new \Error(__CLASS__ . ' requires amphp/file to be installed'); - } - $this->ampFileVersion2 = $ampFileVersion2 = \function_exists('WP_Ultimo\\Dependencies\\Amp\\File\\listFiles'); - $gcWatcher = static function () use($directory, $mutex, $ampFileVersion2) : \Generator { - try { - /** @psalm-suppress UndefinedFunction */ - $files = (yield $ampFileVersion2 ? File\listFiles($directory) : File\scandir($directory)); - foreach ($files as $file) { - if (\strlen($file) !== 70 || \substr($file, -\strlen('.cache')) !== '.cache') { - continue; - } - /** @var Lock $lock */ - $lock = (yield $mutex->acquire($file)); - try { - /** @var File\File $handle */ - /** @psalm-suppress UndefinedFunction */ - $handle = (yield $ampFileVersion2 ? File\openFile($directory . '/' . $file, 'r') : File\open($directory . '/' . $file, 'r')); - $ttl = (yield $handle->read(4)); - if ($ttl === null || \strlen($ttl) !== 4) { - (yield $handle->close()); - continue; - } - $ttl = \unpack('Nttl', $ttl)['ttl']; - if ($ttl < \time()) { - /** @psalm-suppress UndefinedFunction */ - (yield $ampFileVersion2 ? File\deleteFile($directory . '/' . $file) : File\unlink($directory . '/' . $file)); - } - } catch (\Throwable $e) { - // ignore - } finally { - $lock->release(); - } - } - } catch (\Throwable $e) { - // ignore - } - }; - // trigger once, so short running scripts also GC and don't grow forever - Loop::defer($gcWatcher); - $this->gcWatcher = Loop::repeat(300000, $gcWatcher); - } - public function __destruct() - { - if ($this->gcWatcher !== null) { - Loop::cancel($this->gcWatcher); - } - } - /** @inheritdoc */ - public function get(string $key) : Promise - { - return call(function () use($key) { - $filename = $this->getFilename($key); - /** @var Lock $lock */ - $lock = (yield $this->mutex->acquire($filename)); - try { - /** @psalm-suppress UndefinedFunction */ - $cacheContent = (yield $this->ampFileVersion2 ? File\read($this->directory . '/' . $filename) : File\get($this->directory . '/' . $filename)); - if (\strlen($cacheContent) < 4) { - return null; - } - $ttl = \unpack('Nttl', \substr($cacheContent, 0, 4))['ttl']; - if ($ttl < \time()) { - /** @psalm-suppress UndefinedFunction */ - (yield $this->ampFileVersion2 ? File\deleteFile($this->directory . '/' . $filename) : File\unlink($this->directory . '/' . $filename)); - return null; - } - $value = \substr($cacheContent, 4); - \assert(\is_string($value)); - return $value; - } catch (\Throwable $e) { - return null; - } finally { - $lock->release(); - } - }); - } - /** @inheritdoc */ - public function set(string $key, string $value, int $ttl = null) : Promise - { - if ($ttl < 0) { - throw new \Error("Invalid cache TTL ({$ttl}); integer >= 0 or null required"); - } - return call(function () use($key, $value, $ttl) { - $filename = $this->getFilename($key); - /** @var Lock $lock */ - $lock = (yield $this->mutex->acquire($filename)); - if ($ttl === null) { - $ttl = \PHP_INT_MAX; - } else { - $ttl = \time() + $ttl; - } - $encodedTtl = \pack('N', $ttl); - try { - /** @psalm-suppress UndefinedFunction */ - (yield $this->ampFileVersion2 ? File\write($this->directory . '/' . $filename, $encodedTtl . $value) : File\put($this->directory . '/' . $filename, $encodedTtl . $value)); - } finally { - $lock->release(); - } - }); - } - /** @inheritdoc */ - public function delete(string $key) : Promise - { - return call(function () use($key) { - $filename = $this->getFilename($key); - /** @var Lock $lock */ - $lock = (yield $this->mutex->acquire($filename)); - try { - /** @psalm-suppress UndefinedFunction */ - return (yield $this->ampFileVersion2 ? File\deleteFile($this->directory . '/' . $filename) : File\unlink($this->directory . '/' . $filename)); - } finally { - $lock->release(); - } - }); - } -} diff --git a/dependencies/amphp/cache/lib/NullCache.php b/dependencies/amphp/cache/lib/NullCache.php deleted file mode 100644 index af27c1d..0000000 --- a/dependencies/amphp/cache/lib/NullCache.php +++ /dev/null @@ -1,28 +0,0 @@ - */ - return new Success(); - } - /** @inheritdoc */ - public function delete(string $key) : Promise - { - return new Success(\false); - } -} diff --git a/dependencies/amphp/cache/lib/PrefixCache.php b/dependencies/amphp/cache/lib/PrefixCache.php deleted file mode 100644 index 79ee5ca..0000000 --- a/dependencies/amphp/cache/lib/PrefixCache.php +++ /dev/null @@ -1,39 +0,0 @@ -cache = $cache; - $this->keyPrefix = $keyPrefix; - } - /** - * Gets the specified key prefix. - * - * @return string - */ - public function getKeyPrefix() : string - { - return $this->keyPrefix; - } - /** @inheritdoc */ - public function get(string $key) : Promise - { - return $this->cache->get($this->keyPrefix . $key); - } - /** @inheritdoc */ - public function set(string $key, string $value, int $ttl = null) : Promise - { - return $this->cache->set($this->keyPrefix . $key, $value, $ttl); - } - /** @inheritdoc */ - public function delete(string $key) : Promise - { - return $this->cache->delete($this->keyPrefix . $key); - } -} diff --git a/dependencies/amphp/cache/lib/SerializedCache.php b/dependencies/amphp/cache/lib/SerializedCache.php deleted file mode 100644 index 4cdc024..0000000 --- a/dependencies/amphp/cache/lib/SerializedCache.php +++ /dev/null @@ -1,86 +0,0 @@ -cache = $cache; - $this->serializer = $serializer; - } - /** - * Fetch a value from the cache and unserialize it. - * - * @param $key string Cache key. - * - * @return Promise Resolves to the cached value or `null` if it doesn't exist. Fails with a - * CacheException or SerializationException on failure. - * - * @psalm-return Promise - * - * @see Cache::get() - */ - public function get(string $key) : Promise - { - return call(function () use($key) { - $data = (yield $this->cache->get($key)); - if ($data === null) { - return null; - } - return $this->serializer->unserialize($data); - }); - } - /** - * Serializes a value and stores its serialization to the cache. - * - * @param $key string Cache key. - * @param $value mixed Value to cache. - * @param $ttl int Timeout in seconds. The default `null` $ttl value indicates no timeout. Values less than 0 MUST - * throw an \Error. - * - * @psalm-param TValue $value - * - * @return Promise Resolves either successfully or fails with a CacheException or SerializationException. - * - * @see Cache::set() - */ - public function set(string $key, $value, int $ttl = null) : Promise - { - if ($value === null) { - return new Failure(new CacheException('Cannot store NULL in serialized cache')); - } - try { - $value = $this->serializer->serialize($value); - } catch (SerializationException $exception) { - return new Failure($exception); - } - return $this->cache->set($key, $value, $ttl); - } - /** - * Deletes a value associated with the given key if it exists. - * - * @param $key string Cache key. - * - * @return Promise Resolves to `true` / `false` to indicate whether the key existed or fails with a - * CacheException on failure. May also resolve with `null` if that information is not available. - * - * @see Cache::delete() - */ - public function delete(string $key) : Promise - { - return $this->cache->delete($key); - } -} diff --git a/dependencies/amphp/cache/psalm.xml b/dependencies/amphp/cache/psalm.xml deleted file mode 100644 index 0c95021..0000000 --- a/dependencies/amphp/cache/psalm.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/amphp/dns/appveyor.yml b/dependencies/amphp/dns/appveyor.yml deleted file mode 100644 index ebff23d..0000000 --- a/dependencies/amphp/dns/appveyor.yml +++ /dev/null @@ -1,38 +0,0 @@ -build: false -shallow_clone: false - -platform: - - x86 - - x64 - -clone_folder: c:\WP_Ultimo\Dependencies\projects\amphp - -cache: - - c:\WP_Ultimo\Dependencies\tools\php74 -> appveyor.yml - -init: - - SET PATH=C:\Program WP_Ultimo\Dependencies\Files\OpenSSL;c:\WP_Ultimo\Dependencies\tools\php74;%PATH% - - SET COMPOSER_NO_INTERACTION=1 - - SET PHP=1 - - SET ANSICON=121x90 (121x90) - -install: - - IF EXIST c:\WP_Ultimo\Dependencies\tools\php74 (SET PHP=0) - - IF %PHP%==1 sc config wuauserv start= auto - - IF %PHP%==1 net start wuauserv - - IF %PHP%==1 cinst -y OpenSSL.Light - - IF %PHP%==1 cinst -y php - - cd c:\WP_Ultimo\Dependencies\tools\php74 - - IF %PHP%==1 copy php.ini-production php.ini /Y - - IF %PHP%==1 echo date.timezone="UTC" >> php.ini - - IF %PHP%==1 echo extension_dir=ext >> php.ini - - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini - - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini - - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini - - cd c:\WP_Ultimo\Dependencies\projects\amphp - - appveyor DownloadFile https://getcomposer.org/composer.phar - - php composer.phar install --prefer-dist --no-progress - -test_script: - - cd c:\WP_Ultimo\Dependencies\projects\amphp - - vendor/bin/phpunit --colors=always diff --git a/dependencies/amphp/dns/lib/BlockingFallbackResolver.php b/dependencies/amphp/dns/lib/BlockingFallbackResolver.php deleted file mode 100644 index b5e5e29..0000000 --- a/dependencies/amphp/dns/lib/BlockingFallbackResolver.php +++ /dev/null @@ -1,35 +0,0 @@ -query($name, Record::A); - } - public function query(string $name, int $type) : Promise - { - if ($type !== Record::A) { - return new Failure(new DnsException("Query for '{$name}' failed, because loading the system's DNS configuration failed and querying records other than A records isn't supported in blocking fallback mode.")); - } - $result = \gethostbynamel($name); - if ($result === \false) { - return new Failure(new DnsException("Query for '{$name}' failed, because loading the system's DNS configuration failed and blocking fallback via gethostbynamel() failed, too.")); - } - if ($result === []) { - return new Failure(new NoRecordException("No records returned for '{$name}' using blocking fallback mode.")); - } - $records = []; - foreach ($result as $record) { - $records[] = new Record($record, Record::A, null); - } - return new Success($records); - } -} diff --git a/dependencies/amphp/dns/lib/Config.php b/dependencies/amphp/dns/lib/Config.php deleted file mode 100644 index 36e0e03..0000000 --- a/dependencies/amphp/dns/lib/Config.php +++ /dev/null @@ -1,137 +0,0 @@ -validateNameserver($nameserver); - } - if ($timeout < 0) { - throw new ConfigException("Invalid timeout ({$timeout}), must be 0 or greater"); - } - if ($attempts < 1) { - throw new ConfigException("Invalid attempt count ({$attempts}), must be 1 or greater"); - } - // Windows does not include localhost in its host file. Fetch it from the system instead - if (!isset($knownHosts[Record::A]["localhost"]) && !isset($knownHosts[Record::AAAA]["localhost"])) { - // PHP currently provides no way to **resolve** IPv6 hostnames (not even with fallback) - $local = \gethostbyname("localhost"); - if ($local !== "localhost") { - $knownHosts[Record::A]["localhost"] = $local; - } else { - $knownHosts[Record::AAAA]["localhost"] = '::1'; - } - } - $this->nameservers = $nameservers; - $this->knownHosts = $knownHosts; - $this->timeout = $timeout; - $this->attempts = $attempts; - } - public function withSearchList(array $searchList) : self - { - $self = clone $this; - $self->searchList = $searchList; - return $self; - } - /** - * @throws ConfigException - */ - public function withNdots(int $ndots) : self - { - if ($ndots < 0) { - throw new ConfigException("Invalid ndots ({$ndots}), must be greater or equal to 0"); - } - if ($ndots > 15) { - $ndots = 15; - } - $self = clone $this; - $self->ndots = $ndots; - return $self; - } - public function withRotationEnabled(bool $enabled = \true) : self - { - $self = clone $this; - $self->rotation = $enabled; - return $self; - } - private function validateNameserver($nameserver) - { - if (!$nameserver || !\is_string($nameserver)) { - throw new ConfigException("Invalid nameserver: {$nameserver}"); - } - if ($nameserver[0] === "[") { - // IPv6 - $addr = \strstr(\substr($nameserver, 1), "]", \true); - $port = \substr($nameserver, \strrpos($nameserver, "]") + 1); - if ($port !== "" && !\preg_match("(^:(\\d+)\$)", $port, $match)) { - throw new ConfigException("Invalid nameserver: {$nameserver}"); - } - $port = $port === "" ? 53 : \substr($port, 1); - } else { - // IPv4 - $arr = \explode(":", $nameserver, 2); - if (\count($arr) === 2) { - list($addr, $port) = $arr; - } else { - $addr = $arr[0]; - $port = 53; - } - } - $addr = \trim($addr, "[]"); - $port = (int) $port; - if (!($inAddr = @\inet_pton($addr))) { - throw new ConfigException("Invalid server IP: {$addr}"); - } - if ($port < 1 || $port > 65535) { - throw new ConfigException("Invalid server port: {$port}"); - } - } - public function getNameservers() : array - { - return $this->nameservers; - } - public function getKnownHosts() : array - { - return $this->knownHosts; - } - public function getTimeout() : int - { - return $this->timeout; - } - public function getAttempts() : int - { - return $this->attempts; - } - public function getSearchList() : array - { - return $this->searchList; - } - public function getNdots() : int - { - return $this->ndots; - } - public function isRotationEnabled() : bool - { - return $this->rotation; - } -} diff --git a/dependencies/amphp/dns/lib/ConfigException.php b/dependencies/amphp/dns/lib/ConfigException.php deleted file mode 100644 index 40db16f..0000000 --- a/dependencies/amphp/dns/lib/ConfigException.php +++ /dev/null @@ -1,15 +0,0 @@ -path = $path ?? $this->getDefaultPath(); - } - private function getDefaultPath() : string - { - return \stripos(\PHP_OS, "win") === 0 ? 'C:\\Windows\\system32\\drivers\\etc\\hosts' : '/etc/hosts'; - } - protected function readFile(string $path) : Promise - { - \set_error_handler(function (int $errno, string $message) use($path) { - throw new ConfigException("Could not read configuration file '{$path}' ({$errno}) {$message}"); - }); - try { - // Blocking file access, but this file should be local and usually loaded only once. - $fileContent = \file_get_contents($path); - } catch (ConfigException $exception) { - return new Failure($exception); - } finally { - \restore_error_handler(); - } - return new Success($fileContent); - } - public function loadHosts() : Promise - { - return call(function () { - try { - $contents = (yield $this->readFile($this->path)); - } catch (ConfigException $exception) { - return []; - } - $data = []; - $lines = \array_filter(\array_map("trim", \explode("\n", $contents))); - foreach ($lines as $line) { - if ($line[0] === "#") { - // Skip comments - continue; - } - $parts = \preg_split('/\\s+/', $line); - if (!($ip = @\inet_pton($parts[0]))) { - continue; - } elseif (isset($ip[4])) { - $key = Record::AAAA; - } else { - $key = Record::A; - } - for ($i = 1, $l = \count($parts); $i < $l; $i++) { - try { - $normalizedName = normalizeName($parts[$i]); - $data[$key][$normalizedName] = $parts[0]; - } catch (InvalidNameException $e) { - // ignore invalid entries - } - } - } - return $data; - }); - } -} diff --git a/dependencies/amphp/dns/lib/Internal/Socket.php b/dependencies/amphp/dns/lib/Internal/Socket.php deleted file mode 100644 index 3fb8b02..0000000 --- a/dependencies/amphp/dns/lib/Internal/Socket.php +++ /dev/null @@ -1,217 +0,0 @@ - - */ - public static abstract function connect(string $uri) : Promise; - /** - * @param Message $message - * - * @return Promise - */ - protected abstract function send(Message $message) : Promise; - /** - * @return Promise - */ - protected abstract function receive() : Promise; - /** - * @return bool - */ - public abstract function isAlive() : bool; - public function getLastActivity() : int - { - return $this->lastActivity; - } - protected function __construct($socket) - { - $this->input = new ResourceInputStream($socket); - $this->output = new ResourceOutputStream($socket); - $this->messageFactory = new MessageFactory(); - $this->lastActivity = \time(); - $this->onResolve = function (\Throwable $exception = null, Message $message = null) { - $this->lastActivity = \time(); - $this->receiving = \false; - if ($exception) { - $this->error($exception); - return; - } - \assert($message instanceof Message); - $id = $message->getId(); - // Ignore duplicate and invalid responses. - if (isset($this->pending[$id]) && $this->matchesQuestion($message, $this->pending[$id]->question)) { - /** @var Deferred $deferred */ - $deferred = $this->pending[$id]->deferred; - unset($this->pending[$id]); - $deferred->resolve($message); - } - if (empty($this->pending)) { - $this->input->unreference(); - } elseif (!$this->receiving) { - $this->input->reference(); - $this->receiving = \true; - $this->receive()->onResolve($this->onResolve); - } - }; - } - /** - * @param \LibDNS\Records\Question $question - * @param int $timeout - * - * @return \Amp\Promise<\LibDNS\Messages\Message> - */ - public final function ask(Question $question, int $timeout) : Promise - { - return call(function () use($question, $timeout) { - $this->lastActivity = \time(); - if (\count($this->pending) > self::MAX_CONCURRENT_REQUESTS) { - $deferred = new Deferred(); - $this->queue[] = $deferred; - (yield $deferred->promise()); - } - do { - $id = \random_int(0, 0xffff); - } while (isset($this->pending[$id])); - $deferred = new Deferred(); - $pending = new class - { - use Amp\Struct; - public $deferred; - public $question; - }; - $pending->deferred = $deferred; - $pending->question = $question; - $this->pending[$id] = $pending; - $message = $this->createMessage($question, $id); - try { - (yield $this->send($message)); - } catch (StreamException $exception) { - $exception = new DnsException("Sending the request failed", 0, $exception); - $this->error($exception); - throw $exception; - } - $this->input->reference(); - if (!$this->receiving) { - $this->receiving = \true; - $this->receive()->onResolve($this->onResolve); - } - try { - // Work around an OPCache issue that returns an empty array with "return yield ...", - // so assign to a variable first and return after the try block. - // - // See https://github.com/amphp/dns/issues/58. - // See https://bugs.php.net/bug.php?id=74840. - $result = (yield Promise\timeout($deferred->promise(), $timeout)); - } catch (Amp\TimeoutException $exception) { - unset($this->pending[$id]); - if (empty($this->pending)) { - $this->input->unreference(); - } - throw new TimeoutException("Didn't receive a response within {$timeout} milliseconds."); - } finally { - if ($this->queue) { - $deferred = \array_shift($this->queue); - $deferred->resolve(); - } - } - return $result; - }); - } - public final function close() - { - $this->input->close(); - $this->output->close(); - } - private function error(\Throwable $exception) - { - $this->close(); - if (empty($this->pending)) { - return; - } - if (!$exception instanceof DnsException) { - $message = "Unexpected error during resolution: " . $exception->getMessage(); - $exception = new DnsException($message, 0, $exception); - } - $pending = $this->pending; - $this->pending = []; - foreach ($pending as $pendingQuestion) { - /** @var Deferred $deferred */ - $deferred = $pendingQuestion->deferred; - $deferred->fail($exception); - } - } - protected final function read() : Promise - { - return $this->input->read(); - } - protected final function write(string $data) : Promise - { - return $this->output->write($data); - } - protected final function createMessage(Question $question, int $id) : Message - { - $request = $this->messageFactory->create(MessageTypes::QUERY); - $request->getQuestionRecords()->add($question); - $request->isRecursionDesired(\true); - $request->setID($id); - return $request; - } - private function matchesQuestion(Message $message, Question $question) : bool - { - if ($message->getType() !== MessageTypes::RESPONSE) { - return \false; - } - $questionRecords = $message->getQuestionRecords(); - // We only ever ask one question at a time - if (\count($questionRecords) !== 1) { - return \false; - } - $questionRecord = $questionRecords->getIterator()->current(); - if ($questionRecord->getClass() !== $question->getClass()) { - return \false; - } - if ($questionRecord->getType() !== $question->getType()) { - return \false; - } - if ($questionRecord->getName()->getValue() !== $question->getName()->getValue()) { - return \false; - } - return \true; - } -} diff --git a/dependencies/amphp/dns/lib/Internal/TcpSocket.php b/dependencies/amphp/dns/lib/Internal/TcpSocket.php deleted file mode 100644 index 09d5f7c..0000000 --- a/dependencies/amphp/dns/lib/Internal/TcpSocket.php +++ /dev/null @@ -1,97 +0,0 @@ -resolve(new self($socket)); - }); - try { - return (yield Promise\timeout($deferred->promise(), $timeout)); - } catch (Amp\TimeoutException $e) { - throw new TimeoutException("Name resolution timed out, could not connect to server at {$uri}"); - } finally { - Loop::cancel($watcher); - } - }); - } - public static function parser(callable $callback) : \Generator - { - $decoder = (new DecoderFactory())->create(); - while (\true) { - $length = (yield 2); - $length = \unpack("n", $length)[1]; - $rawData = (yield $length); - $callback($decoder->decode($rawData)); - } - } - protected function __construct($socket) - { - parent::__construct($socket); - $this->encoder = (new EncoderFactory())->create(); - $this->queue = new \SplQueue(); - $this->parser = new Parser(self::parser([$this->queue, 'push'])); - } - protected function send(Message $message) : Promise - { - $data = $this->encoder->encode($message); - $promise = $this->write(\pack("n", \strlen($data)) . $data); - $promise->onResolve(function ($error) { - if ($error) { - $this->isAlive = \false; - } - }); - return $promise; - } - protected function receive() : Promise - { - if ($this->queue->isEmpty()) { - return call(function () { - do { - $chunk = (yield $this->read()); - if ($chunk === null) { - $this->isAlive = \false; - throw new DnsException("Reading from the server failed"); - } - $this->parser->push($chunk); - } while ($this->queue->isEmpty()); - return $this->queue->shift(); - }); - } - return new Success($this->queue->shift()); - } - public function isAlive() : bool - { - return $this->isAlive; - } -} diff --git a/dependencies/amphp/dns/lib/Internal/UdpSocket.php b/dependencies/amphp/dns/lib/Internal/UdpSocket.php deleted file mode 100644 index 5f8725e..0000000 --- a/dependencies/amphp/dns/lib/Internal/UdpSocket.php +++ /dev/null @@ -1,51 +0,0 @@ -encoder = (new EncoderFactory())->create(); - $this->decoder = (new DecoderFactory())->create(); - } - protected function send(Message $message) : Promise - { - $data = $this->encoder->encode($message); - return $this->write($data); - } - protected function receive() : Promise - { - return call(function () { - $data = (yield $this->read()); - if ($data === null) { - throw new DnsException("Reading from the server failed"); - } - return $this->decoder->decode($data); - }); - } - public function isAlive() : bool - { - return \true; - } -} diff --git a/dependencies/amphp/dns/lib/InvalidNameException.php b/dependencies/amphp/dns/lib/InvalidNameException.php deleted file mode 100644 index eb03874..0000000 --- a/dependencies/amphp/dns/lib/InvalidNameException.php +++ /dev/null @@ -1,7 +0,0 @@ -value = $value; - $this->type = $type; - $this->ttl = $ttl; - } - public function getValue() : string - { - return $this->value; - } - public function getType() : int - { - return $this->type; - } - public function getTtl() - { - return $this->ttl; - } - /** - * Converts an record type integer back into its name as defined in this class. - * - * Returns "unknown ()" in case a name for this record is not known. - * - * @param int $type Record type as integer. - * - * @return string Name of the constant for this record in this class. - */ - public static function getName(int $type) : string - { - static $types; - if (0 > $type || 0xffff < $type) { - $message = \sprintf('%d does not correspond to a valid record type (must be between 0 and 65535).', $type); - throw new \Error($message); - } - if ($types === null) { - $types = \array_flip((new \ReflectionClass(self::class))->getConstants()); - } - return $types[$type] ?? "unknown ({$type})"; - } -} diff --git a/dependencies/amphp/dns/lib/Resolver.php b/dependencies/amphp/dns/lib/Resolver.php deleted file mode 100644 index 90c3c66..0000000 --- a/dependencies/amphp/dns/lib/Resolver.php +++ /dev/null @@ -1,32 +0,0 @@ -cache = $cache ?? new ArrayCache(5000, 256); - $this->configLoader = $configLoader ?? (\stripos(\PHP_OS, "win") === 0 ? new WindowsConfigLoader() : new UnixConfigLoader()); - $this->questionFactory = new QuestionFactory(); - $this->blockingFallbackResolver = new BlockingFallbackResolver(); - $sockets =& $this->sockets; - $this->gcWatcher = Loop::repeat(5000, static function () use(&$sockets) { - if (!$sockets) { - return; - } - $now = \time(); - foreach ($sockets as $key => $server) { - if ($server->getLastActivity() < $now - 60) { - $server->close(); - unset($sockets[$key]); - } - } - }); - Loop::unreference($this->gcWatcher); - } - public function __destruct() - { - Loop::cancel($this->gcWatcher); - } - /** @inheritdoc */ - public function resolve(string $name, int $typeRestriction = null) : Promise - { - if ($typeRestriction !== null && $typeRestriction !== Record::A && $typeRestriction !== Record::AAAA) { - throw new \Error("Invalid value for parameter 2: null|Record::A|Record::AAAA expected"); - } - return call(function () use($name, $typeRestriction) { - if ($this->configStatus === self::CONFIG_NOT_LOADED) { - (yield $this->reloadConfig()); - } - if ($this->configStatus === self::CONFIG_FAILED) { - return $this->blockingFallbackResolver->resolve($name, $typeRestriction); - } - switch ($typeRestriction) { - case Record::A: - if (\filter_var($name, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - return [new Record($name, Record::A, null)]; - } - if (\filter_var($name, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - throw new DnsException("Got an IPv6 address, but type is restricted to IPv4"); - } - break; - case Record::AAAA: - if (\filter_var($name, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return [new Record($name, Record::AAAA, null)]; - } - if (\filter_var($name, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - throw new DnsException("Got an IPv4 address, but type is restricted to IPv6"); - } - break; - default: - if (\filter_var($name, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - return [new Record($name, Record::A, null)]; - } - if (\filter_var($name, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return [new Record($name, Record::AAAA, null)]; - } - break; - } - $dots = \substr_count($name, "."); - // Should be replaced with $name[-1] from 7.1 - $trailingDot = \substr($name, -1, 1) === "."; - $name = normalizeName($name); - if ($records = $this->queryHosts($name, $typeRestriction)) { - return $records; - } - // Follow RFC 6761 and never send queries for localhost to the caching DNS server - // Usually, these queries are already resolved via queryHosts() - if ($name === 'localhost') { - return $typeRestriction === Record::AAAA ? [new Record('::1', Record::AAAA, null)] : [new Record('127.0.0.1', Record::A, null)]; - } - $searchList = [null]; - if (!$trailingDot && $dots < $this->config->getNdots()) { - $searchList = \array_merge($this->config->getSearchList(), $searchList); - } - foreach ($searchList as $searchIndex => $search) { - for ($redirects = 0; $redirects < 5; $redirects++) { - $searchName = $name; - if ($search !== null) { - $searchName = $name . "." . $search; - } - try { - if ($typeRestriction) { - return (yield $this->query($searchName, $typeRestriction)); - } - try { - list(, $records) = (yield Promise\some([$this->query($searchName, Record::A), $this->query($searchName, Record::AAAA)])); - return \array_merge(...$records); - } catch (MultiReasonException $e) { - $errors = []; - foreach ($e->getReasons() as $reason) { - if ($reason instanceof NoRecordException) { - throw $reason; - } - if ($searchIndex < \count($searchList) - 1 && \in_array($reason->getCode(), [2, 3], \true)) { - continue 2; - } - $errors[] = $reason->getMessage(); - } - throw new DnsException("All query attempts failed for {$searchName}: " . \implode(", ", $errors), 0, $e); - } - } catch (NoRecordException $e) { - try { - /** @var Record[] $cnameRecords */ - $cnameRecords = (yield $this->query($searchName, Record::CNAME)); - $name = $cnameRecords[0]->getValue(); - continue; - } catch (NoRecordException $e) { - /** @var Record[] $dnameRecords */ - $dnameRecords = (yield $this->query($searchName, Record::DNAME)); - $name = $dnameRecords[0]->getValue(); - continue; - } - } catch (DnsException $e) { - if ($searchIndex < \count($searchList) - 1 && \in_array($e->getCode(), [2, 3], \true)) { - continue 2; - } - throw $e; - } - } - } - throw new DnsException("Giving up resolution of '{$searchName}', too many redirects"); - }); - } - /** - * Reloads the configuration in the background. - * - * Once it's finished, the configuration will be used for new requests. - * - * @return Promise - */ - public function reloadConfig() : Promise - { - if ($this->pendingConfig) { - return $this->pendingConfig; - } - $promise = call(function () { - try { - $this->config = (yield $this->configLoader->loadConfig()); - $this->configStatus = self::CONFIG_LOADED; - } catch (ConfigException $e) { - $this->configStatus = self::CONFIG_FAILED; - try { - \trigger_error("Could not load the system's DNS configuration, using synchronous, blocking fallback", \E_USER_WARNING); - } catch (\Throwable $triggerException) { - \set_error_handler(null); - \trigger_error("Could not load the system's DNS configuration, using synchronous, blocking fallback", \E_USER_WARNING); - \restore_error_handler(); - } - } - }); - $this->pendingConfig = $promise; - $promise->onResolve(function () { - $this->pendingConfig = null; - }); - return $promise; - } - /** @inheritdoc */ - public function query(string $name, int $type) : Promise - { - $pendingQueryKey = $type . " " . $name; - if (isset($this->pendingQueries[$pendingQueryKey])) { - return $this->pendingQueries[$pendingQueryKey]; - } - $promise = call(function () use($name, $type) { - if ($this->configStatus === self::CONFIG_NOT_LOADED) { - (yield $this->reloadConfig()); - } - if ($this->configStatus === self::CONFIG_FAILED) { - return $this->blockingFallbackResolver->query($name, $type); - } - $name = $this->normalizeName($name, $type); - $question = $this->createQuestion($name, $type); - if (null !== ($cachedValue = (yield $this->cache->get($this->getCacheKey($name, $type))))) { - return $this->decodeCachedResult($name, $type, $cachedValue); - } - $nameservers = $this->selectNameservers(); - $nameserversCount = \count($nameservers); - $attempts = $this->config->getAttempts(); - $protocol = "udp"; - $attempt = 0; - /** @var Socket $socket */ - $uri = $protocol . "://" . $nameservers[0]; - $socket = (yield $this->getSocket($uri)); - $attemptDescription = []; - while ($attempt < $attempts) { - try { - if (!$socket->isAlive()) { - unset($this->sockets[$uri]); - $socket->close(); - $uri = $protocol . "://" . $nameservers[$attempt % $nameserversCount]; - $socket = (yield $this->getSocket($uri)); - } - $attemptDescription[] = $uri; - /** @var Message $response */ - $response = (yield $socket->ask($question, $this->config->getTimeout())); - $this->assertAcceptableResponse($response, $name); - // UDP sockets are never reused, they're not in the $this->sockets map - if ($protocol === "udp") { - // Defer call, because it interferes with the unreference() call in Internal\Socket otherwise - Loop::defer(static function () use($socket) { - $socket->close(); - }); - } - if ($response->isTruncated()) { - if ($protocol !== "tcp") { - // Retry with TCP, don't count attempt - $protocol = "tcp"; - $uri = $protocol . "://" . $nameservers[$attempt % $nameserversCount]; - $socket = (yield $this->getSocket($uri)); - continue; - } - throw new DnsException("Server returned a truncated response for '{$name}' (" . Record::getName($type) . ")"); - } - $answers = $response->getAnswerRecords(); - $result = []; - $ttls = []; - /** @var \LibDNS\Records\Resource $record */ - foreach ($answers as $record) { - $recordType = $record->getType(); - $result[$recordType][] = (string) $record->getData(); - // Cache for max one day - $ttls[$recordType] = \min($ttls[$recordType] ?? 86400, $record->getTTL()); - } - foreach ($result as $recordType => $records) { - // We don't care here whether storing in the cache fails - $this->cache->set($this->getCacheKey($name, $recordType), \json_encode($records), $ttls[$recordType]); - } - if (!isset($result[$type])) { - // "it MUST NOT cache it for longer than five (5) minutes" per RFC 2308 section 7.1 - $this->cache->set($this->getCacheKey($name, $type), \json_encode([]), 300); - throw new NoRecordException("No records returned for '{$name}' (" . Record::getName($type) . ")"); - } - return \array_map(static function ($data) use($type, $ttls) { - return new Record($data, $type, $ttls[$type]); - }, $result[$type]); - } catch (TimeoutException $e) { - // Defer call, because it might interfere with the unreference() call in Internal\Socket otherwise - Loop::defer(function () use($socket, $uri) { - unset($this->sockets[$uri]); - $socket->close(); - }); - $uri = $protocol . "://" . $nameservers[++$attempt % $nameserversCount]; - $socket = (yield $this->getSocket($uri)); - continue; - } - } - throw new TimeoutException(\sprintf("No response for '%s' (%s) from any nameserver within %d ms after %d attempts, tried %s", $name, Record::getName($type), $this->config->getTimeout(), $attempts, \implode(", ", $attemptDescription))); - }); - $this->pendingQueries[$type . " " . $name] = $promise; - $promise->onResolve(function () use($name, $type) { - unset($this->pendingQueries[$type . " " . $name]); - }); - return $promise; - } - private function queryHosts(string $name, int $typeRestriction = null) : array - { - $hosts = $this->config->getKnownHosts(); - $records = []; - $returnIPv4 = $typeRestriction === null || $typeRestriction === Record::A; - $returnIPv6 = $typeRestriction === null || $typeRestriction === Record::AAAA; - if ($returnIPv4 && isset($hosts[Record::A][$name])) { - $records[] = new Record($hosts[Record::A][$name], Record::A, null); - } - if ($returnIPv6 && isset($hosts[Record::AAAA][$name])) { - $records[] = new Record($hosts[Record::AAAA][$name], Record::AAAA, null); - } - return $records; - } - private function normalizeName(string $name, int $type) - { - if ($type === Record::PTR) { - if (($packedIp = @\inet_pton($name)) !== \false) { - if (isset($packedIp[4])) { - // IPv6 - $name = \wordwrap(\strrev(\bin2hex($packedIp)), 1, ".", \true) . ".ip6.arpa"; - } else { - // IPv4 - $name = \inet_ntop(\strrev($packedIp)) . ".in-addr.arpa"; - } - } - } elseif (\in_array($type, [Record::A, Record::AAAA], \true)) { - $name = normalizeName($name); - } - return $name; - } - /** - * @param string $name - * @param int $type - * - * @return Question - */ - private function createQuestion(string $name, int $type) : Question - { - if (0 > $type || 0xffff < $type) { - $message = \sprintf('%d does not correspond to a valid record type (must be between 0 and 65535).', $type); - throw new \Error($message); - } - $question = $this->questionFactory->create($type); - $question->setName($name); - return $question; - } - private function getCacheKey(string $name, int $type) : string - { - return self::CACHE_PREFIX . $name . "#" . $type; - } - private function decodeCachedResult(string $name, int $type, string $encoded) : array - { - $decoded = \json_decode($encoded, \true); - if (!$decoded) { - throw new NoRecordException("No records returned for {$name} (cached result)"); - } - $result = []; - foreach ($decoded as $data) { - $result[] = new Record($data, $type); - } - return $result; - } - private function getSocket($uri) : Promise - { - // We use a new socket for each UDP request, as that increases the entropy and mitigates response forgery. - if (\substr($uri, 0, 3) === "udp") { - return UdpSocket::connect($uri); - } - // Over TCP we might reuse sockets if the server allows to keep them open. Sequence IDs in TCP are already - // better than a random port. Additionally, a TCP connection is more expensive. - if (isset($this->sockets[$uri])) { - return new Success($this->sockets[$uri]); - } - if (isset($this->pendingSockets[$uri])) { - return $this->pendingSockets[$uri]; - } - $server = TcpSocket::connect($uri); - $server->onResolve(function ($error, $server) use($uri) { - unset($this->pendingSockets[$uri]); - if (!$error) { - $this->sockets[$uri] = $server; - } - }); - return $server; - } - /** - * @throws DnsException - */ - private function assertAcceptableResponse(Message $response, string $name) - { - if ($response->getResponseCode() !== 0) { - // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml - $errors = [1 => 'FormErr', 2 => 'ServFail', 3 => 'NXDomain', 4 => 'NotImp', 5 => 'Refused', 6 => 'YXDomain', 7 => 'YXRRSet', 8 => 'NXRRSet', 9 => 'NotAuth', 10 => 'NotZone', 11 => 'DSOTYPENI', 16 => 'BADVERS', 17 => 'BADKEY', 18 => 'BADTIME', 19 => 'BADMODE', 20 => 'BADNAME', 21 => 'BADALG', 22 => 'BADTRUNC', 23 => 'BADCOOKIE']; - throw new DnsException(\sprintf("Name resolution failed for '%s'; server returned error code: %d (%s)", $name, $response->getResponseCode(), $errors[$response->getResponseCode()] ?? 'UNKNOWN'), $response->getResponseCode()); - } - } - private function selectNameservers() : array - { - $nameservers = $this->config->getNameservers(); - if ($this->config->isRotationEnabled() && ($nameserversCount = \count($nameservers)) > 1) { - $nameservers = \array_merge(\array_slice($nameservers, $this->nextNameserver), \array_slice($nameservers, 0, $this->nextNameserver)); - $this->nextNameserver = ++$this->nextNameserver % $nameserversCount; - } - return $nameservers; - } -} diff --git a/dependencies/amphp/dns/lib/TimeoutException.php b/dependencies/amphp/dns/lib/TimeoutException.php deleted file mode 100644 index 6679ebb..0000000 --- a/dependencies/amphp/dns/lib/TimeoutException.php +++ /dev/null @@ -1,7 +0,0 @@ - self::DEFAULT_TIMEOUT, "attempts" => self::DEFAULT_ATTEMPTS, "ndots" => self::DEFAULT_NDOTS, "rotate" => \false]; - private $path; - private $hostLoader; - public function __construct(string $path = "/etc/resolv.conf", HostLoader $hostLoader = null) - { - $this->path = $path; - $this->hostLoader = $hostLoader ?? new HostLoader(); - } - protected function readFile(string $path) : Promise - { - \set_error_handler(function (int $errno, string $message) use($path) { - throw new ConfigException("Could not read configuration file '{$path}' ({$errno}) {$message}"); - }); - try { - // Blocking file access, but this file should be local and usually loaded only once. - $fileContent = \file_get_contents($path); - } catch (ConfigException $exception) { - return new Failure($exception); - } finally { - \restore_error_handler(); - } - return new Success($fileContent); - } - public final function loadConfig() : Promise - { - return call(function () { - $nameservers = []; - $searchList = []; - $options = self::DEFAULT_OPTIONS; - $haveLocaldomainEnv = \false; - /* Allow user to override the local domain definition. */ - if ($localdomain = \getenv("LOCALDOMAIN")) { - /* Set search list to be blank-separated strings from rest of - env value. Permits users of LOCALDOMAIN to still have a - search list, and anyone to set the one that they want to use - as an individual (even more important now that the rfc1535 - stuff restricts searches). */ - $searchList = $this->splitOnWhitespace($localdomain); - $haveLocaldomainEnv = \true; - } - $fileContent = (yield $this->readFile($this->path)); - $lines = \explode("\n", $fileContent); - foreach ($lines as $line) { - $line = \preg_split('#\\s+#', $line, 2); - if (\count($line) !== 2) { - continue; - } - list($type, $value) = $line; - if ($type === "nameserver") { - if (\count($nameservers) === self::MAX_NAMESERVERS) { - continue; - } - $value = \trim($value); - $ip = @\inet_pton($value); - if ($ip === \false) { - continue; - } - if (isset($ip[15])) { - // IPv6 - $nameservers[] = "[" . $value . "]:53"; - } else { - // IPv4 - $nameservers[] = $value . ":53"; - } - } elseif ($type === "domain" && !$haveLocaldomainEnv) { - // LOCALDOMAIN env overrides config - $searchList = $this->splitOnWhitespace($value); - } elseif ($type === "search" && !$haveLocaldomainEnv) { - // LOCALDOMAIN env overrides config - $searchList = $this->splitOnWhitespace($value); - } elseif ($type === "options") { - $option = $this->parseOption($value); - if (\count($option) === 2) { - $options[$option[0]] = $option[1]; - } - } - } - $hosts = (yield $this->hostLoader->loadHosts()); - if (\count($searchList) === 0) { - $hostname = \gethostname(); - $dot = \strpos(".", $hostname); - if ($dot !== \false && $dot < \strlen($hostname)) { - $searchList = [\substr($hostname, $dot)]; - } - } - if (\count($searchList) > self::MAX_DNS_SEARCH) { - $searchList = \array_slice($searchList, 0, self::MAX_DNS_SEARCH); - } - $resOptions = \getenv("RES_OPTIONS"); - if ($resOptions) { - foreach ($this->splitOnWhitespace($resOptions) as $option) { - $option = $this->parseOption($option); - if (\count($option) === 2) { - $options[$option[0]] = $option[1]; - } - } - } - $config = new Config($nameservers, $hosts, $options["timeout"], $options["attempts"]); - return $config->withSearchList($searchList)->withNdots($options["ndots"])->withRotationEnabled($options["rotate"]); - }); - } - private function splitOnWhitespace(string $names) : array - { - return \preg_split("#\\s+#", \trim($names)); - } - private function parseOption(string $option) : array - { - $optline = \explode(':', $option, 2); - list($name, $value) = $optline + [1 => null]; - switch ($name) { - case "timeout": - $value = (int) $value; - if ($value < 0) { - return []; - // don't overwrite option value - } - // The value for this option is silently capped to 30s - return ["timeout", (int) \min($value * 1000, self::MAX_TIMEOUT)]; - case "attempts": - $value = (int) $value; - if ($value < 0) { - return []; - // don't overwrite option value - } - // The value for this option is silently capped to 5 - return ["attempts", (int) \min($value, self::MAX_ATTEMPTS)]; - case "ndots": - $value = (int) $value; - if ($value < 0) { - return []; - // don't overwrite option value - } - // The value for this option is silently capped to 15 - return ["ndots", (int) \min($value, self::MAX_NDOTS)]; - case "rotate": - return ["rotate", \true]; - } - return []; - } -} diff --git a/dependencies/amphp/dns/lib/WindowsConfigLoader.php b/dependencies/amphp/dns/lib/WindowsConfigLoader.php deleted file mode 100644 index 626b329..0000000 --- a/dependencies/amphp/dns/lib/WindowsConfigLoader.php +++ /dev/null @@ -1,68 +0,0 @@ -hostLoader = $hostLoader ?? new HostLoader(); - } - public function loadConfig() : Promise - { - return call(function () { - $keys = ["WP_Ultimo\\Dependencies\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\NameServer", "WP_Ultimo\\Dependencies\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\DhcpNameServer"]; - $reader = new WindowsRegistry(); - $nameserver = ""; - while ($nameserver === "" && ($key = \array_shift($keys))) { - try { - $nameserver = (yield $reader->read($key)); - } catch (KeyNotFoundException $e) { - // retry other possible locations - } - } - if ($nameserver === "") { - $interfaces = "WP_Ultimo\\Dependencies\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces"; - $subKeys = (yield $reader->listKeys($interfaces)); - foreach ($subKeys as $key) { - foreach (["NameServer", "DhcpNameServer"] as $property) { - try { - $nameserver = (yield $reader->read("{$key}\\{$property}")); - if ($nameserver !== "") { - break 2; - } - } catch (KeyNotFoundException $e) { - // retry other possible locations - } - } - } - } - if ($nameserver === "") { - throw new ConfigException("Could not find a nameserver in the Windows Registry"); - } - $nameservers = []; - // Microsoft documents space as delimiter, AppVeyor uses comma, we just accept both - foreach (\explode(" ", \strtr($nameserver, ",", " ")) as $nameserver) { - $nameserver = \trim($nameserver); - $ip = @\inet_pton($nameserver); - if ($ip === \false) { - continue; - } - if (isset($ip[15])) { - // IPv6 - $nameservers[] = "[" . $nameserver . "]:53"; - } else { - // IPv4 - $nameservers[] = $nameserver . ":53"; - } - } - $hosts = (yield $this->hostLoader->loadHosts()); - return new Config($nameservers, $hosts); - }); - } -} diff --git a/dependencies/amphp/dns/lib/functions.php b/dependencies/amphp/dns/lib/functions.php deleted file mode 100644 index 0722d38..0000000 --- a/dependencies/amphp/dns/lib/functions.php +++ /dev/null @@ -1,92 +0,0 @@ -resolve($name, $typeRestriction); -} -/** - * @see Resolver::query() - */ -function query(string $name, int $type) : Promise -{ - return resolver()->query($name, $type); -} -/** - * Checks whether a string is a valid DNS name. - * - * @param string $name String to check. - * - * @return bool - */ -function isValidName(string $name) -{ - try { - normalizeName($name); - return \true; - } catch (InvalidNameException $e) { - return \false; - } -} -/** - * Normalizes a DNS name and automatically checks it for validity. - * - * @param string $name DNS name. - * - * @return string Normalized DNS name. - * @throws InvalidNameException If an invalid name or an IDN name without ext/intl being installed has been passed. - */ -function normalizeName(string $name) : string -{ - static $pattern = '/^(?[a-z0-9]([a-z0-9-_]{0,61}[a-z0-9])?)(\\.(?&name))*\\.?$/i'; - if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) { - if (\false === ($result = \idn_to_ascii($name, 0, \INTL_IDNA_VARIANT_UTS46))) { - throw new InvalidNameException("Name '{$name}' could not be processed for IDN."); - } - $name = $result; - } elseif (\preg_match('/[\\x80-\\xff]/', $name)) { - throw new InvalidNameException("Name '{$name}' contains non-ASCII characters and IDN support is not available. " . "Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6."); - } - if (isset($name[253]) || !\preg_match($pattern, $name)) { - throw new InvalidNameException("Name '{$name}' is not a valid hostname."); - } - if ($name[\strlen($name) - 1] === '.') { - $name = \substr($name, 0, -1); - } - return $name; -} diff --git a/dependencies/amphp/hpack/src/HPack.php b/dependencies/amphp/hpack/src/HPack.php deleted file mode 100644 index ec551f9..0000000 --- a/dependencies/amphp/hpack/src/HPack.php +++ /dev/null @@ -1,44 +0,0 @@ - - */ -final class HPack -{ - /** @var HPackNative|HPackNghttp2 */ - private $implementation; - public function __construct(int $tableSizeLimit = 4096) - { - if (HPackNghttp2::isSupported()) { - $this->implementation = new HPackNghttp2($tableSizeLimit); - } else { - $this->implementation = new HPackNative($tableSizeLimit); - } - } - /** - * @param string $input Input to decode. - * @param int $maxSize Maximum deflated size. - * - * @return array|null Decoded headers. - */ - public function decode(string $input, int $maxSize) : ?array - { - return $this->implementation->decode($input, $maxSize); - } - /** - * @param HeaderArray $headers Headers to encode. - * - * @return string Encoded headers. - * - * @throws HPackException If encoding fails. - */ - public function encode(array $headers) : string - { - return $this->implementation->encode($headers); - } -} diff --git a/dependencies/amphp/hpack/src/HPackException.php b/dependencies/amphp/hpack/src/HPackException.php deleted file mode 100644 index 305c8ae..0000000 --- a/dependencies/amphp/hpack/src/HPackException.php +++ /dev/null @@ -1,8 +0,0 @@ - $name) { - if (isset(self::$indexMap[$name])) { - continue; - } - self::$indexMap[$name] = $index + 1; - } - } - // (micro-)optimized decode - private static function huffmanLookupInit() : array - { - if ('cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI || \filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { - return require __DIR__ . '/huffman-lookup.php'; - } - \gc_disable(); - $encodingAccess = []; - $terminals = []; - $index = 7; - foreach (self::HUFFMAN_CODE as $chr => $bits) { - $len = self::HUFFMAN_CODE_LENGTHS[$chr]; - for ($bit = 0; $bit < 8; $bit++) { - $offlen = $len + $bit; - $next = $bit; - for ($byte = $offlen - 1 >> 3; $byte > 0; $byte--) { - $cur = \str_pad(\decbin($bits >> $byte * 8 - (0x30 - $offlen & 7) & 0xff), 8, "0", \STR_PAD_LEFT); - if (($encodingAccess[$next][$cur][0] ?? 0) !== 0) { - $next = $encodingAccess[$next][$cur][0]; - } else { - $encodingAccess[$next][$cur] = [++$index, null]; - $next = $index; - } - } - $key = \str_pad(\decbin($bits & (1 << ($offlen - 1 & 7) + 1) - 1), ($offlen - 1 & 7) + 1, "0", \STR_PAD_LEFT); - $encodingAccess[$next][$key] = [null, $chr > 0xff ? "" : \chr($chr)]; - if ($offlen & 7) { - $terminals[$offlen & 7][] = [$key, $next]; - } else { - $encodingAccess[$next][$key][0] = 0; - } - } - } - $memoize = []; - for ($off = 7; $off > 0; $off--) { - foreach ($terminals[$off] as [$key, $next]) { - if ($encodingAccess[$next][$key][0] === null) { - foreach ($encodingAccess[$off] as $chr => $cur) { - $encodingAccess[$next][($memoize[$key] ?? ($memoize[$key] = \str_pad($key, 8, "0", \STR_PAD_RIGHT))) | $chr] = [$cur[0], $encodingAccess[$next][$key][1] != "" ? $encodingAccess[$next][$key][1] . $cur[1] : ""]; - } - unset($encodingAccess[$next][$key]); - } - } - } - $memoize = []; - for ($off = 7; $off > 0; $off--) { - foreach ($terminals[$off] as [$key, $next]) { - foreach ($encodingAccess[$next] as $k => $v) { - if (\strlen((string) $k) !== 1) { - $encodingAccess[$next][$memoize[$k] ?? ($memoize[$k] = \chr(\bindec((string) $k)))] = $v; - unset($encodingAccess[$next][$k]); - } - } - } - unset($encodingAccess[$off]); - } - \gc_enable(); - return $encodingAccess; - } - /** - * - * @return string|null Returns null if decoding fails. - */ - public static function huffmanDecode(string $input) - { - $huffmanLookup = self::$huffmanLookup; - $lookup = 0; - $lengths = self::$huffmanLengths; - $length = \strlen($input); - $out = \str_repeat("\x00", (int) \floor($length / 5 * 8 + 1)); - // max length - // Fail if EOS symbol is found. - if (\strpos($input, "?\xff\xff\xff") !== \false) { - return null; - } - for ($bitCount = $off = $i = 0; $i < $length; $i++) { - [$lookup, $chr] = $huffmanLookup[$lookup][$input[$i]]; - if ($chr === null) { - continue; - } - if ($chr === "") { - return null; - } - $out[$off++] = $chr[0]; - $bitCount += $lengths[$chr[0]]; - if (isset($chr[1])) { - $out[$off++] = $chr[1]; - $bitCount += $lengths[$chr[1]]; - } - } - // Padding longer than 7-bits - if ($i && $chr === null) { - return null; - } - // Check for 0's in padding - if ($bitCount & 7) { - $mask = 0xff >> ($bitCount & 7); - if ((\ord($input[$i - 1]) & $mask) !== $mask) { - return null; - } - } - return \substr($out, 0, $off); - } - private static function huffmanCodesInit() : array - { - if ('cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI || \filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { - return require __DIR__ . '/huffman-codes.php'; - } - $lookup = []; - for ($chr = 0; $chr <= 0xff; $chr++) { - $bits = self::HUFFMAN_CODE[$chr]; - $length = self::HUFFMAN_CODE_LENGTHS[$chr]; - for ($bit = 0; $bit < 8; $bit++) { - $bytes = $length + $bit - 1 >> 3; - $codes = []; - for ($byte = $bytes; $byte >= 0; $byte--) { - $codes[] = \chr($byte ? $bits >> $length - ($bytes - $byte + 1) * 8 + $bit : $bits << (0x30 - $length - $bit & 7)); - } - $lookup[$bit][\chr($chr)] = $codes; - } - } - return $lookup; - } - private static function huffmanLengthsInit() : array - { - $lengths = []; - for ($chr = 0; $chr <= 0xff; $chr++) { - $lengths[\chr($chr)] = self::HUFFMAN_CODE_LENGTHS[$chr]; - } - return $lengths; - } - public static function huffmanEncode(string $input) : string - { - $codes = self::$huffmanCodes; - $lengths = self::$huffmanLengths; - $length = \strlen($input); - $out = \str_repeat("\x00", $length * 5 + 1); - // max length - for ($bitCount = $i = 0; $i < $length; $i++) { - $chr = $input[$i]; - $byte = $bitCount >> 3; - foreach ($codes[$bitCount & 7][$chr] as $bits) { - // Note: |= can't be used with strings in PHP - $out[$byte] = $out[$byte] | $bits; - $byte++; - } - $bitCount += $lengths[$chr]; - } - if ($bitCount & 7) { - // Note: |= can't be used with strings in PHP - $out[$byte - 1] = $out[$byte - 1] | \chr(0xff >> ($bitCount & 7)); - } - return $i ? \substr($out, 0, $byte) : ''; - } - /** @see RFC 7541 Appendix A */ - const LAST_INDEX = 61; - const TABLE = [ - // starts at 1 - [":authority", ""], - [":method", "GET"], - [":method", "POST"], - [":path", "/"], - [":path", "/index.html"], - [":scheme", "http"], - [":scheme", "https"], - [":status", "200"], - [":status", "204"], - [":status", "206"], - [":status", "304"], - [":status", "400"], - [":status", "404"], - [":status", "500"], - ["accept-charset", ""], - ["accept-encoding", "gzip, deflate"], - ["accept-language", ""], - ["accept-ranges", ""], - ["accept", ""], - ["access-control-allow-origin", ""], - ["age", ""], - ["allow", ""], - ["authorization", ""], - ["cache-control", ""], - ["content-disposition", ""], - ["content-encoding", ""], - ["content-language", ""], - ["content-length", ""], - ["content-location", ""], - ["content-range", ""], - ["content-type", ""], - ["cookie", ""], - ["date", ""], - ["etag", ""], - ["expect", ""], - ["expires", ""], - ["from", ""], - ["host", ""], - ["if-match", ""], - ["if-modified-since", ""], - ["if-none-match", ""], - ["if-range", ""], - ["if-unmodified-since", ""], - ["last-modified", ""], - ["link", ""], - ["location", ""], - ["max-forwards", ""], - ["proxy-authenticate", ""], - ["proxy-authorization", ""], - ["range", ""], - ["referer", ""], - ["refresh", ""], - ["retry-after", ""], - ["server", ""], - ["set-cookie", ""], - ["strict-transport-security", ""], - ["transfer-encoding", ""], - ["user-agent", ""], - ["vary", ""], - ["via", ""], - ["www-authenticate", ""], - ]; - private static function decodeDynamicInteger(string $input, int &$off) : int - { - if (!isset($input[$off])) { - throw new HPackException('Invalid input data, too short for dynamic integer'); - } - $c = \ord($input[$off++]); - $int = $c & 0x7f; - $i = 0; - while ($c & 0x80) { - if (!isset($input[$off])) { - return -0x80; - } - $c = \ord($input[$off++]); - $int += ($c & 0x7f) << ++$i * 7; - if ($int > 2147483647) { - throw new HPackException('Invalid integer, too large'); - } - } - return $int; - } - /** - * @param int $maxSize Upper limit on table size. - */ - public function __construct(int $maxSize = self::DEFAULT_MAX_SIZE) - { - $this->hardMaxSize = $maxSize; - } - /** - * Sets the upper limit on table size. Dynamic table updates requesting a size above this size will result in a - * decoding error (i.e., returning null from decode()). - * - */ - public function setTableSizeLimit(int $maxSize) - { - $this->hardMaxSize = $maxSize; - } - /** - * Resizes the table to the given size, removing old entries as per section 4.4 if necessary. - * - */ - public function resizeTable(int $size = null) - { - if ($size !== null) { - $this->currentMaxSize = \max(0, \min($size, $this->hardMaxSize)); - } - while ($this->size > $this->currentMaxSize) { - [$name, $value] = \array_pop($this->headers); - $this->size -= 32 + \strlen($name) + \strlen($value); - } - } - /** - * @param string $input Encoded headers. - * @param int $maxSize Maximum length of the decoded header string. - * - * @return string[][]|null Returns null if decoding fails or if $maxSize is exceeded. - */ - public function decode(string $input, int $maxSize) - { - $headers = []; - $off = 0; - $inputLength = \strlen($input); - $size = 0; - try { - // dynamic $table as per 2.3.2 - while ($off < $inputLength) { - $index = \ord($input[$off++]); - if ($index & 0x80) { - // range check - if ($index <= self::LAST_INDEX + 0x80) { - if ($index === 0x80) { - return null; - } - [$name, $value] = $headers[] = self::TABLE[$index - 0x81]; - } else { - if ($index == 0xff) { - $index = self::decodeDynamicInteger($input, $off) + 0xff; - } - $index -= 0x81 + self::LAST_INDEX; - if (!isset($this->headers[$index])) { - return null; - } - [$name, $value] = $headers[] = $this->headers[$index]; - } - } elseif (($index & 0x60) !== 0x20) { - // (($index & 0x40) || !($index & 0x20)): bit 4: never index is ignored - $dynamic = (bool) ($index & 0x40); - if ($index & ($dynamic ? 0x3f : 0xf)) { - // separate length - if ($dynamic) { - if ($index === 0x7f) { - $index = self::decodeDynamicInteger($input, $off) + 0x3f; - } else { - $index &= 0x3f; - } - } else { - $index &= 0xf; - if ($index === 0xf) { - $index = self::decodeDynamicInteger($input, $off) + 0xf; - } - } - if ($index < 0) { - return null; - } - if ($index <= self::LAST_INDEX) { - $header = self::TABLE[$index - 1]; - } elseif (!isset($this->headers[$index - 1 - self::LAST_INDEX])) { - return null; - } else { - $header = $this->headers[$index - 1 - self::LAST_INDEX]; - } - } else { - if ($off >= $inputLength) { - return null; - } - $length = \ord($input[$off++]); - $huffman = $length & 0x80; - $length &= 0x7f; - if ($length === 0x7f) { - $length = self::decodeDynamicInteger($input, $off) + 0x7f; - } - if ($inputLength - $off < $length || $length <= 0) { - return null; - } - if ($huffman) { - $header = [self::huffmanDecode(\substr($input, $off, $length))]; - if ($header[0] === null) { - return null; - } - } else { - $header = [\substr($input, $off, $length)]; - } - $off += $length; - } - if ($off >= $inputLength) { - return null; - } - $length = \ord($input[$off++]); - $huffman = $length & 0x80; - $length &= 0x7f; - if ($length === 0x7f) { - $length = self::decodeDynamicInteger($input, $off) + 0x7f; - } - if ($inputLength - $off < $length || $length < 0) { - return null; - } - if ($huffman) { - $header[1] = self::huffmanDecode(\substr($input, $off, $length)); - if ($header[1] === null) { - return null; - } - } else { - $header[1] = \substr($input, $off, $length); - } - $off += $length; - if ($dynamic) { - \array_unshift($this->headers, $header); - $this->size += 32 + \strlen($header[0]) + \strlen($header[1]); - if ($this->currentMaxSize < $this->size) { - $this->resizeTable(); - } - } - [$name, $value] = $headers[] = $header; - } else { - // if ($index & 0x20) { - if ($off >= $inputLength) { - return null; - // Dynamic table size update must not be the last entry in header block. - } - $index &= 0x1f; - if ($index === 0x1f) { - $index = self::decodeDynamicInteger($input, $off) + 0x1f; - } - if ($index > $this->hardMaxSize) { - return null; - } - $this->resizeTable($index); - continue; - } - $size += \strlen($name) + \strlen($value); - if ($size > $maxSize) { - return null; - } - } - } catch (HPackException $e) { - return null; - } - return $headers; - } - private static function encodeDynamicInteger(int $int) : string - { - $out = ""; - for ($i = 0; $int >> $i >= 0x80; $i += 7) { - $out .= \chr(0x80 | $int >> $i & 0x7f); - } - return $out . \chr($int >> $i); - } - /** - * @param HeaderArray $headers - * @param int $compressionThreshold Compress strings whose length is at least the number of bytes given. - * - */ - public function encode(array $headers, int $compressionThreshold = self::DEFAULT_COMPRESSION_THRESHOLD) : string - { - // @TODO implementation is deliberately primitive... [doesn't use any dynamic table...] - $output = ""; - foreach ($headers as [$name, $value]) { - $name = (string) $name; - $value = (string) $value; - if (isset(self::$indexMap[$name])) { - $index = self::$indexMap[$name]; - if ($index < 0x10) { - $output .= \chr($index); - } else { - $output .= "\x0f" . \chr($index - 0xf); - } - } else { - $output .= "\x00" . $this->encodeString($name, $compressionThreshold); - } - $output .= $this->encodeString($value, $compressionThreshold); - } - return $output; - } - private function encodeString(string $value, int $compressionThreshold) : string - { - $prefix = "\x00"; - if (\strlen($value) >= $compressionThreshold) { - $value = self::huffmanEncode($value); - $prefix = "\x80"; - } - if (\strlen($value) < 0x7f) { - return ($prefix | \chr(\strlen($value))) . $value; - } - return ($prefix | "") . self::encodeDynamicInteger(\strlen($value) - 0x7f) . $value; - } -} -(function () { - static::init(); -})->bindTo(null, HPackNative::class)(); diff --git a/dependencies/amphp/hpack/src/Internal/HPackNghttp2.php b/dependencies/amphp/hpack/src/Internal/HPackNghttp2.php deleted file mode 100644 index 2815f44..0000000 --- a/dependencies/amphp/hpack/src/Internal/HPackNghttp2.php +++ /dev/null @@ -1,203 +0,0 @@ - self::FLAG_NO_COPY_SENSITIVE, 'cookie' => self::FLAG_NO_COPY_SENSITIVE, 'proxy-authorization' => self::FLAG_NO_COPY_SENSITIVE, 'set-cookie' => self::FLAG_NO_COPY_SENSITIVE]; - private static $ffi; - private static $deflatePtrType; - private static $inflatePtrType; - private static $nvType; - private static $nvSize; - private static $charType; - private static $uint8Type; - private static $uint8PtrType; - private static $decodeNv; - private static $decodeNvPtr; - private static $decodeFlags; - private static $decodeFlagsPtr; - private static $supported; - public static function isSupported() : bool - { - if (isset(self::$supported)) { - return self::$supported; - } - if (!\extension_loaded('ffi')) { - return self::$supported = \false; - } - if (!\class_exists(FFI::class)) { - return self::$supported = \false; - } - try { - self::init(); - return self::$supported = \true; - } catch (\Throwable $e) { - return self::$supported = \false; - } - } - private static function init() : void - { - if (self::$ffi !== null) { - return; - } - $header = \file_get_contents(__DIR__ . '/amp-hpack.h'); - $files = ['libnghttp2.so.14', 'libnghttp2.so', 'libnghttp2.dylib', '/opt/homebrew/lib/libnghttp2.dylib']; - $error = null; - foreach ($files as $file) { - try { - self::$ffi = FFI::cdef($header, $file); - $error = null; - break; - } catch (\Throwable $exception) { - $error = $error ?? $exception; - } - } - if ($error) { - throw $error; - } - self::$deflatePtrType = self::$ffi->type('nghttp2_hd_deflater*'); - self::$inflatePtrType = self::$ffi->type('nghttp2_hd_inflater*'); - self::$nvType = self::$ffi->type('nghttp2_nv'); - self::$nvSize = FFI::sizeof(self::$nvType); - self::$charType = self::$ffi->type('char'); - self::$uint8Type = self::$ffi->type('uint8_t'); - self::$uint8PtrType = self::$ffi->type('uint8_t*'); - self::$decodeNv = self::$ffi->new(self::$nvType); - self::$decodeNvPtr = FFI::addr(self::$decodeNv); - self::$decodeFlags = self::$ffi->new('int'); - self::$decodeFlagsPtr = FFI::addr(self::$decodeFlags); - } - private static function createBufferFromString(string $value) : ?FFI\CData - { - $length = \strlen($value); - if (!$length) { - return null; - } - $buffer = self::$ffi->new(FFI::arrayType(self::$uint8Type, [$length])); - FFI::memcpy($buffer, $value, $length); - return $buffer; - } - private $deflatePtr; - private $inflatePtr; - /** - * @param int $maxSize Upper limit on table size. - */ - public function __construct(int $maxSize = 4096) - { - self::init(); - $this->deflatePtr = self::$ffi->new(self::$deflatePtrType); - $this->inflatePtr = self::$ffi->new(self::$inflatePtrType); - $return = self::$ffi->nghttp2_hd_deflate_new(FFI::addr($this->deflatePtr), $maxSize); - if ($return !== 0) { - throw new \RuntimeException('Failed to init deflate context'); - } - $return = self::$ffi->nghttp2_hd_inflate_new(FFI::addr($this->inflatePtr)); - if ($return !== 0) { - throw new \RuntimeException('Failed to init inflate context'); - } - } - /** - * @param string $input Encoded headers. - * @param int $maxSize Maximum length of the decoded header string. - * - * @return string[][]|null Returns null if decoding fails or if $maxSize is exceeded. - */ - public function decode(string $input, int $maxSize) : ?array - { - $ffi = self::$ffi; - $pair = self::$decodeNv; - $pairPtr = self::$decodeNvPtr; - $flags = self::$decodeFlags; - $flagsPtr = self::$decodeFlagsPtr; - $inflate = $this->inflatePtr; - $size = 0; - $bufferLength = \strlen($input); - $buffer = self::createBufferFromString($input); - if ($buffer === null) { - return []; - } - $offset = 0; - $bufferPtr = $ffi->cast(self::$uint8PtrType, $buffer); - $headers = []; - while (\true) { - $read = $ffi->nghttp2_hd_inflate_hd2($inflate, $pairPtr, $flagsPtr, $bufferPtr, $bufferLength - $offset, 1); - if ($read < 0) { - return null; - } - $offset += $read; - $bufferPtr += $read; - $cFlags = $flags->cdata; - if ($cFlags & 0x2) { - // NGHTTP2_HD_INFLATE_EMIT - $nameLength = $pair->namelen; - $valueLength = $pair->valuelen; - $headers[] = [FFI::string($pair->name, $nameLength), FFI::string($pair->value, $valueLength)]; - $size += $nameLength + $valueLength; - if ($size > $maxSize) { - return null; - } - } - if ($cFlags & 0x1) { - // NGHTTP2_HD_INFLATE_FINAL - $ffi->nghttp2_hd_inflate_end_headers($inflate); - FFI::memset($pair, 0, self::$nvSize); - return $headers; - } - if ($read === 0 || $offset > $bufferLength) { - return null; - } - } - return null; - } - /** - * @param HeaderArray $headers - * - * @return string Encoded headers. - */ - public function encode(array $headers) : string - { - $ffi = self::$ffi; - // To keep memory buffers - $buffers = []; - $headerCount = \count($headers); - $current = 0; - $pairs = $ffi->new(FFI::arrayType(self::$nvType, [$headerCount])); - foreach ($headers as $index => [$name, $value]) { - \assert($index === $current); - $name = (string) $name; - $value = (string) $value; - $pair = $pairs[$current]; - $nameBuffer = self::createBufferFromString($name); - $valueBuffer = self::createBufferFromString($value); - $pair->name = $ffi->cast(self::$uint8PtrType, $nameBuffer); - $pair->namelen = \strlen($name); - $pair->value = $ffi->cast(self::$uint8PtrType, $valueBuffer); - $pair->valuelen = \strlen($value); - $pair->flags = self::SENSITIVE_HEADERS[$name] ?? self::FLAG_NO_COPY; - $buffers[] = $nameBuffer; - $buffers[] = $valueBuffer; - $current++; - } - $bufferLength = $ffi->nghttp2_hd_deflate_bound($this->deflatePtr, $pairs, $headerCount); - $buffer = $ffi->new(FFI::arrayType(self::$uint8Type, [$bufferLength])); - $bufferLength = $ffi->nghttp2_hd_deflate_hd($this->deflatePtr, $buffer, $bufferLength, $pairs, $headerCount); - if ($bufferLength < 0) { - throw new HPackException('Failed to compress headers using nghttp2'); - } - return FFI::string($buffer, $bufferLength); - } -} diff --git a/dependencies/amphp/hpack/src/Internal/amp-hpack.h b/dependencies/amphp/hpack/src/Internal/amp-hpack.h deleted file mode 100644 index d5846ac..0000000 --- a/dependencies/amphp/hpack/src/Internal/amp-hpack.h +++ /dev/null @@ -1,29 +0,0 @@ - -#define FFI_SCOPE "amphp-hpack-nghttp2" -#define FFI_LIB "libnghttp2.so" - -typedef struct nghttp2_hd_deflater nghttp2_hd_deflater; - -typedef struct nghttp2_hd_inflater nghttp2_hd_inflater; - -typedef struct { - uint8_t *name; - uint8_t *value; - - size_t namelen; - size_t valuelen; - - uint8_t flags; -} nghttp2_nv; - -int nghttp2_hd_deflate_new(nghttp2_hd_deflater **deflater_ptr, size_t deflate_hd_table_bufsize_max); - -ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater, uint8_t *buf, size_t buflen, const nghttp2_nv *nva, size_t nvlen); - -size_t nghttp2_hd_deflate_bound(nghttp2_hd_deflater *deflater, const nghttp2_nv *nva, size_t nvlen); - -int nghttp2_hd_inflate_new(nghttp2_hd_inflater **inflater_ptr); - -ssize_t nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags, const uint8_t *in, size_t inlen, int in_final); - -int nghttp2_hd_inflate_end_headers(nghttp2_hd_inflater *inflater); diff --git a/dependencies/amphp/hpack/src/Internal/huffman-codes.php b/dependencies/amphp/hpack/src/Internal/huffman-codes.php deleted file mode 100644 index d0aa6a2..0000000 --- a/dependencies/amphp/hpack/src/Internal/huffman-codes.php +++ /dev/null @@ -1,6 +0,0 @@ - ["\xff", "\xc0"], "\x01" => ["\xff", "\xff", "\xb0"], "\x02" => ["\xff", "\xff", "\xfe", " "], "\x03" => ["\xff", "\xff", "\xfe", "0"], "\x04" => ["\xff", "\xff", "\xfe", "@"], "\x05" => ["\xff", "\xff", "\xfe", "P"], "\x06" => ["\xff", "\xff", "\xfe", "`"], "\x07" => ["\xff", "\xff", "\xfe", "p"], "\x08" => ["\xff", "\xff", "\xfe", "\x80"], "\t" => ["\xff", "\xff", "\xea"], "\n" => ["\xff", "\xff", "\xff", "\xf0"], "\v" => ["\xff", "\xff", "\xfe", "\x90"], "\f" => ["\xff", "\xff", "\xfe", "\xa0"], "\r" => ["\xff", "\xff", "\xff", "\xf4"], "\x0e" => ["\xff", "\xff", "\xfe", "\xb0"], "\x0f" => ["\xff", "\xff", "\xfe", "\xc0"], "\x10" => ["\xff", "\xff", "\xfe", "\xd0"], "\x11" => ["\xff", "\xff", "\xfe", "\xe0"], "\x12" => ["\xff", "\xff", "\xfe", "\xf0"], "\x13" => ["\xff", "\xff", "\xff", "\x00"], "\x14" => ["\xff", "\xff", "\xff", "\x10"], "\x15" => ["\xff", "\xff", "\xff", " "], "\x16" => ["\xff", "\xff", "\xff", "\xf8"], "\x17" => ["\xff", "\xff", "\xff", "0"], "\x18" => ["\xff", "\xff", "\xff", "@"], "\x19" => ["\xff", "\xff", "\xff", "P"], "\x1a" => ["\xff", "\xff", "\xff", "`"], "\x1b" => ["\xff", "\xff", "\xff", "p"], "\x1c" => ["\xff", "\xff", "\xff", "\x80"], "\x1d" => ["\xff", "\xff", "\xff", "\x90"], "\x1e" => ["\xff", "\xff", "\xff", "\xa0"], "\x1f" => ["\xff", "\xff", "\xff", "\xb0"], " " => ["P"], "!" => ["\xfe", "\x00"], "\"" => ["\xfe", "@"], "#" => ["\xff", "\xa0"], "\$" => ["\xff", "\xc8"], "%" => ["T"], "&" => ["\xf8"], "'" => ["\xff", "@"], "(" => ["\xfe", "\x80"], ")" => ["\xfe", "\xc0"], "*" => ["\xf9"], "+" => ["\xff", "`"], "," => ["\xfa"], "-" => ["X"], "." => ["\\"], "/" => ["`"], ["\x00"], ["\x08"], ["\x10"], ["d"], ["h"], ["l"], ["p"], ["t"], ["x"], ["|"], ":" => ["\xb8"], ";" => ["\xfb"], "<" => ["\xff", "\xf8"], "=" => ["\x80"], ">" => ["\xff", "\xb0"], "?" => ["\xff", "\x00"], "@" => ["\xff", "\xd0"], "A" => ["\x84"], "B" => ["\xba"], "C" => ["\xbc"], "D" => ["\xbe"], "E" => ["\xc0"], "F" => ["\xc2"], "G" => ["\xc4"], "H" => ["\xc6"], "I" => ["\xc8"], "J" => ["\xca"], "K" => ["\xcc"], "L" => ["\xce"], "M" => ["\xd0"], "N" => ["\xd2"], "O" => ["\xd4"], "P" => ["\xd6"], "Q" => ["\xd8"], "R" => ["\xda"], "S" => ["\xdc"], "T" => ["\xde"], "U" => ["\xe0"], "V" => ["\xe2"], "W" => ["\xe4"], "X" => ["\xfc"], "Y" => ["\xe6"], "Z" => ["\xfd"], "[" => ["\xff", "\xd8"], "\\" => ["\xff", "\xfe", "\x00"], "]" => ["\xff", "\xe0"], "^" => ["\xff", "\xf0"], "_" => ["\x88"], "`" => ["\xff", "\xfa"], "a" => ["\x18"], "b" => ["\x8c"], "c" => [" "], "d" => ["\x90"], "e" => ["("], "f" => ["\x94"], "g" => ["\x98"], "h" => ["\x9c"], "i" => ["0"], "j" => ["\xe8"], "k" => ["\xea"], "l" => ["\xa0"], "m" => ["\xa4"], "n" => ["\xa8"], "o" => ["8"], "p" => ["\xac"], "q" => ["\xec"], "r" => ["\xb0"], "s" => ["@"], "t" => ["H"], "u" => ["\xb4"], "v" => ["\xee"], "w" => ["\xf0"], "x" => ["\xf2"], "y" => ["\xf4"], "z" => ["\xf6"], "{" => ["\xff", "\xfc"], "|" => ["\xff", "\x80"], "}" => ["\xff", "\xf4"], "~" => ["\xff", "\xe8"], "" => ["\xff", "\xff", "\xff", "\xc0"], "\x80" => ["\xff", "\xfe", "`"], "\x81" => ["\xff", "\xff", "H"], "\x82" => ["\xff", "\xfe", "p"], "\x83" => ["\xff", "\xfe", "\x80"], "\x84" => ["\xff", "\xff", "L"], "\x85" => ["\xff", "\xff", "P"], "\x86" => ["\xff", "\xff", "T"], "\x87" => ["\xff", "\xff", "\xb2"], "\x88" => ["\xff", "\xff", "X"], "\x89" => ["\xff", "\xff", "\xb4"], "\x8a" => ["\xff", "\xff", "\xb6"], "\x8b" => ["\xff", "\xff", "\xb8"], "\x8c" => ["\xff", "\xff", "\xba"], "\x8d" => ["\xff", "\xff", "\xbc"], "\x8e" => ["\xff", "\xff", "\xeb"], "\x8f" => ["\xff", "\xff", "\xbe"], "\x90" => ["\xff", "\xff", "\xec"], "\x91" => ["\xff", "\xff", "\xed"], "\x92" => ["\xff", "\xff", "\\"], "\x93" => ["\xff", "\xff", "\xc0"], "\x94" => ["\xff", "\xff", "\xee"], "\x95" => ["\xff", "\xff", "\xc2"], "\x96" => ["\xff", "\xff", "\xc4"], "\x97" => ["\xff", "\xff", "\xc6"], "\x98" => ["\xff", "\xff", "\xc8"], "\x99" => ["\xff", "\xfe", "\xe0"], "\x9a" => ["\xff", "\xff", "`"], "\x9b" => ["\xff", "\xff", "\xca"], "\x9c" => ["\xff", "\xff", "d"], "\x9d" => ["\xff", "\xff", "\xcc"], "\x9e" => ["\xff", "\xff", "\xce"], "\x9f" => ["\xff", "\xff", "\xef"], "\xa0" => ["\xff", "\xff", "h"], "\xa1" => ["\xff", "\xfe", "\xe8"], "\xa2" => ["\xff", "\xfe", "\x90"], "\xa3" => ["\xff", "\xff", "l"], "\xa4" => ["\xff", "\xff", "p"], "\xa5" => ["\xff", "\xff", "\xd0"], "\xa6" => ["\xff", "\xff", "\xd2"], "\xa7" => ["\xff", "\xfe", "\xf0"], "\xa8" => ["\xff", "\xff", "\xd4"], "\xa9" => ["\xff", "\xff", "t"], "\xaa" => ["\xff", "\xff", "x"], "\xab" => ["\xff", "\xff", "\xf0"], "\xac" => ["\xff", "\xfe", "\xf8"], "\xad" => ["\xff", "\xff", "|"], "\xae" => ["\xff", "\xff", "\xd6"], "\xaf" => ["\xff", "\xff", "\xd8"], "\xb0" => ["\xff", "\xff", "\x00"], "\xb1" => ["\xff", "\xff", "\x08"], "\xb2" => ["\xff", "\xff", "\x80"], "\xb3" => ["\xff", "\xff", "\x10"], "\xb4" => ["\xff", "\xff", "\xda"], "\xb5" => ["\xff", "\xff", "\x84"], "\xb6" => ["\xff", "\xff", "\xdc"], "\xb7" => ["\xff", "\xff", "\xde"], "\xb8" => ["\xff", "\xfe", "\xa0"], "\xb9" => ["\xff", "\xff", "\x88"], "\xba" => ["\xff", "\xff", "\x8c"], "\xbb" => ["\xff", "\xff", "\x90"], "\xbc" => ["\xff", "\xff", "\xe0"], "\xbd" => ["\xff", "\xff", "\x94"], "\xbe" => ["\xff", "\xff", "\x98"], "\xbf" => ["\xff", "\xff", "\xe2"], "\xc0" => ["\xff", "\xff", "\xf8", "\x00"], "\xc1" => ["\xff", "\xff", "\xf8", "@"], "\xc2" => ["\xff", "\xfe", "\xb0"], "\xc3" => ["\xff", "\xfe", " "], "\xc4" => ["\xff", "\xff", "\x9c"], "\xc5" => ["\xff", "\xff", "\xe4"], "\xc6" => ["\xff", "\xff", "\xa0"], "\xc7" => ["\xff", "\xff", "\xf6", "\x00"], "\xc8" => ["\xff", "\xff", "\xf8", "\x80"], "\xc9" => ["\xff", "\xff", "\xf8", "\xc0"], "\xca" => ["\xff", "\xff", "\xf9", "\x00"], "\xcb" => ["\xff", "\xff", "\xfb", "\xc0"], "\xcc" => ["\xff", "\xff", "\xfb", "\xe0"], "\xcd" => ["\xff", "\xff", "\xf9", "@"], "\xce" => ["\xff", "\xff", "\xf1"], "\xcf" => ["\xff", "\xff", "\xf6", "\x80"], "\xd0" => ["\xff", "\xfe", "@"], "\xd1" => ["\xff", "\xff", "\x18"], "\xd2" => ["\xff", "\xff", "\xf9", "\x80"], "\xd3" => ["\xff", "\xff", "\xfc", "\x00"], "\xd4" => ["\xff", "\xff", "\xfc", " "], "\xd5" => ["\xff", "\xff", "\xf9", "\xc0"], "\xd6" => ["\xff", "\xff", "\xfc", "@"], "\xd7" => ["\xff", "\xff", "\xf2"], "\xd8" => ["\xff", "\xff", " "], "\xd9" => ["\xff", "\xff", "("], "\xda" => ["\xff", "\xff", "\xfa", "\x00"], "\xdb" => ["\xff", "\xff", "\xfa", "@"], "\xdc" => ["\xff", "\xff", "\xff", "\xd0"], "\xdd" => ["\xff", "\xff", "\xfc", "`"], "\xde" => ["\xff", "\xff", "\xfc", "\x80"], "\xdf" => ["\xff", "\xff", "\xfc", "\xa0"], "\xe0" => ["\xff", "\xfe", "\xc0"], "\xe1" => ["\xff", "\xff", "\xf3"], "\xe2" => ["\xff", "\xfe", "\xd0"], "\xe3" => ["\xff", "\xff", "0"], "\xe4" => ["\xff", "\xff", "\xa4"], "\xe5" => ["\xff", "\xff", "8"], "\xe6" => ["\xff", "\xff", "@"], "\xe7" => ["\xff", "\xff", "\xe6"], "\xe8" => ["\xff", "\xff", "\xa8"], "\xe9" => ["\xff", "\xff", "\xac"], "\xea" => ["\xff", "\xff", "\xf7", "\x00"], "\xeb" => ["\xff", "\xff", "\xf7", "\x80"], "\xec" => ["\xff", "\xff", "\xf4"], "\xed" => ["\xff", "\xff", "\xf5"], "\xee" => ["\xff", "\xff", "\xfa", "\x80"], "\xef" => ["\xff", "\xff", "\xe8"], "\xf0" => ["\xff", "\xff", "\xfa", "\xc0"], "\xf1" => ["\xff", "\xff", "\xfc", "\xc0"], "\xf2" => ["\xff", "\xff", "\xfb", "\x00"], "\xf3" => ["\xff", "\xff", "\xfb", "@"], "\xf4" => ["\xff", "\xff", "\xfc", "\xe0"], "\xf5" => ["\xff", "\xff", "\xfd", "\x00"], "\xf6" => ["\xff", "\xff", "\xfd", " "], "\xf7" => ["\xff", "\xff", "\xfd", "@"], "\xf8" => ["\xff", "\xff", "\xfd", "`"], "\xf9" => ["\xff", "\xff", "\xff", "\xe0"], "\xfa" => ["\xff", "\xff", "\xfd", "\x80"], "\xfb" => ["\xff", "\xff", "\xfd", "\xa0"], "\xfc" => ["\xff", "\xff", "\xfd", "\xc0"], "\xfd" => ["\xff", "\xff", "\xfd", "\xe0"], "\xfe" => ["\xff", "\xff", "\xfe", "\x00"], "\xff" => ["\xff", "\xff", "\xfb", "\x80"]], ["\x00" => ["", "\xe0"], "\x01" => ["", "\xff", "\xd8"], "\x02" => ["", "\xff", "\xff", "\x10"], "\x03" => ["", "\xff", "\xff", "\x18"], "\x04" => ["", "\xff", "\xff", " "], "\x05" => ["", "\xff", "\xff", "("], "\x06" => ["", "\xff", "\xff", "0"], "\x07" => ["", "\xff", "\xff", "8"], "\x08" => ["", "\xff", "\xff", "@"], "\t" => ["", "\xff", "\xf5", "\x00"], "\n" => ["", "\xff", "\xff", "\xf8"], "\v" => ["", "\xff", "\xff", "H"], "\f" => ["", "\xff", "\xff", "P"], "\r" => ["", "\xff", "\xff", "\xfa"], "\x0e" => ["", "\xff", "\xff", "X"], "\x0f" => ["", "\xff", "\xff", "`"], "\x10" => ["", "\xff", "\xff", "h"], "\x11" => ["", "\xff", "\xff", "p"], "\x12" => ["", "\xff", "\xff", "x"], "\x13" => ["", "\xff", "\xff", "\x80"], "\x14" => ["", "\xff", "\xff", "\x88"], "\x15" => ["", "\xff", "\xff", "\x90"], "\x16" => ["", "\xff", "\xff", "\xfc"], "\x17" => ["", "\xff", "\xff", "\x98"], "\x18" => ["", "\xff", "\xff", "\xa0"], "\x19" => ["", "\xff", "\xff", "\xa8"], "\x1a" => ["", "\xff", "\xff", "\xb0"], "\x1b" => ["", "\xff", "\xff", "\xb8"], "\x1c" => ["", "\xff", "\xff", "\xc0"], "\x1d" => ["", "\xff", "\xff", "\xc8"], "\x1e" => ["", "\xff", "\xff", "\xd0"], "\x1f" => ["", "\xff", "\xff", "\xd8"], " " => ["("], "!" => ["", "\x00"], "\"" => ["", " "], "#" => ["", "\xd0"], "\$" => ["", "\xe4"], "%" => ["*"], "&" => ["|", "\x00"], "'" => ["", "\xa0"], "(" => ["", "@"], ")" => ["", "`"], "*" => ["|", "\x80"], "+" => ["", "\xb0"], "," => ["}", "\x00"], "-" => [","], "." => ["."], "/" => ["0"], ["\x00"], ["\x04"], ["\x08"], ["2"], ["4"], ["6"], ["8"], [":"], ["<"], [">"], ":" => ["\\"], ";" => ["}", "\x80"], "<" => ["", "\xfc"], "=" => ["@"], ">" => ["", "\xd8"], "?" => ["", "\x80"], "@" => ["", "\xe8"], "A" => ["B"], "B" => ["]"], "C" => ["^"], "D" => ["_"], "E" => ["`"], "F" => ["a"], "G" => ["b"], "H" => ["c"], "I" => ["d"], "J" => ["e"], "K" => ["f"], "L" => ["g"], "M" => ["h"], "N" => ["i"], "O" => ["j"], "P" => ["k"], "Q" => ["l"], "R" => ["m"], "S" => ["n"], "T" => ["o"], "U" => ["p"], "V" => ["q"], "W" => ["r"], "X" => ["~", "\x00"], "Y" => ["s"], "Z" => ["~", "\x80"], "[" => ["", "\xec"], "\\" => ["", "\xff", "\x00"], "]" => ["", "\xf0"], "^" => ["", "\xf8"], "_" => ["D"], "`" => ["", "\xfd"], "a" => ["\f"], "b" => ["F"], "c" => ["\x10"], "d" => ["H"], "e" => ["\x14"], "f" => ["J"], "g" => ["L"], "h" => ["N"], "i" => ["\x18"], "j" => ["t"], "k" => ["u"], "l" => ["P"], "m" => ["R"], "n" => ["T"], "o" => ["\x1c"], "p" => ["V"], "q" => ["v"], "r" => ["X"], "s" => [" "], "t" => ["\$"], "u" => ["Z"], "v" => ["w"], "w" => ["x"], "x" => ["y"], "y" => ["z"], "z" => ["{"], "{" => ["", "\xfe"], "|" => ["", "\xc0"], "}" => ["", "\xfa"], "~" => ["", "\xf4"], "" => ["", "\xff", "\xff", "\xe0"], "\x80" => ["", "\xff", "0"], "\x81" => ["", "\xff", "\xa4"], "\x82" => ["", "\xff", "8"], "\x83" => ["", "\xff", "@"], "\x84" => ["", "\xff", "\xa6"], "\x85" => ["", "\xff", "\xa8"], "\x86" => ["", "\xff", "\xaa"], "\x87" => ["", "\xff", "\xd9"], "\x88" => ["", "\xff", "\xac"], "\x89" => ["", "\xff", "\xda"], "\x8a" => ["", "\xff", "\xdb"], "\x8b" => ["", "\xff", "\xdc"], "\x8c" => ["", "\xff", "\xdd"], "\x8d" => ["", "\xff", "\xde"], "\x8e" => ["", "\xff", "\xf5", "\x80"], "\x8f" => ["", "\xff", "\xdf"], "\x90" => ["", "\xff", "\xf6", "\x00"], "\x91" => ["", "\xff", "\xf6", "\x80"], "\x92" => ["", "\xff", "\xae"], "\x93" => ["", "\xff", "\xe0"], "\x94" => ["", "\xff", "\xf7", "\x00"], "\x95" => ["", "\xff", "\xe1"], "\x96" => ["", "\xff", "\xe2"], "\x97" => ["", "\xff", "\xe3"], "\x98" => ["", "\xff", "\xe4"], "\x99" => ["", "\xff", "p"], "\x9a" => ["", "\xff", "\xb0"], "\x9b" => ["", "\xff", "\xe5"], "\x9c" => ["", "\xff", "\xb2"], "\x9d" => ["", "\xff", "\xe6"], "\x9e" => ["", "\xff", "\xe7"], "\x9f" => ["", "\xff", "\xf7", "\x80"], "\xa0" => ["", "\xff", "\xb4"], "\xa1" => ["", "\xff", "t"], "\xa2" => ["", "\xff", "H"], "\xa3" => ["", "\xff", "\xb6"], "\xa4" => ["", "\xff", "\xb8"], "\xa5" => ["", "\xff", "\xe8"], "\xa6" => ["", "\xff", "\xe9"], "\xa7" => ["", "\xff", "x"], "\xa8" => ["", "\xff", "\xea"], "\xa9" => ["", "\xff", "\xba"], "\xaa" => ["", "\xff", "\xbc"], "\xab" => ["", "\xff", "\xf8", "\x00"], "\xac" => ["", "\xff", "|"], "\xad" => ["", "\xff", "\xbe"], "\xae" => ["", "\xff", "\xeb"], "\xaf" => ["", "\xff", "\xec"], "\xb0" => ["", "\xff", "\x80"], "\xb1" => ["", "\xff", "\x84"], "\xb2" => ["", "\xff", "\xc0"], "\xb3" => ["", "\xff", "\x88"], "\xb4" => ["", "\xff", "\xed"], "\xb5" => ["", "\xff", "\xc2"], "\xb6" => ["", "\xff", "\xee"], "\xb7" => ["", "\xff", "\xef"], "\xb8" => ["", "\xff", "P"], "\xb9" => ["", "\xff", "\xc4"], "\xba" => ["", "\xff", "\xc6"], "\xbb" => ["", "\xff", "\xc8"], "\xbc" => ["", "\xff", "\xf0"], "\xbd" => ["", "\xff", "\xca"], "\xbe" => ["", "\xff", "\xcc"], "\xbf" => ["", "\xff", "\xf1"], "\xc0" => ["", "\xff", "\xfc", "\x00"], "\xc1" => ["", "\xff", "\xfc", " "], "\xc2" => ["", "\xff", "X"], "\xc3" => ["", "\xff", "\x10"], "\xc4" => ["", "\xff", "\xce"], "\xc5" => ["", "\xff", "\xf2"], "\xc6" => ["", "\xff", "\xd0"], "\xc7" => ["", "\xff", "\xfb", "\x00"], "\xc8" => ["", "\xff", "\xfc", "@"], "\xc9" => ["", "\xff", "\xfc", "`"], "\xca" => ["", "\xff", "\xfc", "\x80"], "\xcb" => ["", "\xff", "\xfd", "\xe0"], "\xcc" => ["", "\xff", "\xfd", "\xf0"], "\xcd" => ["", "\xff", "\xfc", "\xa0"], "\xce" => ["", "\xff", "\xf8", "\x80"], "\xcf" => ["", "\xff", "\xfb", "@"], "\xd0" => ["", "\xff", " "], "\xd1" => ["", "\xff", "\x8c"], "\xd2" => ["", "\xff", "\xfc", "\xc0"], "\xd3" => ["", "\xff", "\xfe", "\x00"], "\xd4" => ["", "\xff", "\xfe", "\x10"], "\xd5" => ["", "\xff", "\xfc", "\xe0"], "\xd6" => ["", "\xff", "\xfe", " "], "\xd7" => ["", "\xff", "\xf9", "\x00"], "\xd8" => ["", "\xff", "\x90"], "\xd9" => ["", "\xff", "\x94"], "\xda" => ["", "\xff", "\xfd", "\x00"], "\xdb" => ["", "\xff", "\xfd", " "], "\xdc" => ["", "\xff", "\xff", "\xe8"], "\xdd" => ["", "\xff", "\xfe", "0"], "\xde" => ["", "\xff", "\xfe", "@"], "\xdf" => ["", "\xff", "\xfe", "P"], "\xe0" => ["", "\xff", "`"], "\xe1" => ["", "\xff", "\xf9", "\x80"], "\xe2" => ["", "\xff", "h"], "\xe3" => ["", "\xff", "\x98"], "\xe4" => ["", "\xff", "\xd2"], "\xe5" => ["", "\xff", "\x9c"], "\xe6" => ["", "\xff", "\xa0"], "\xe7" => ["", "\xff", "\xf3"], "\xe8" => ["", "\xff", "\xd4"], "\xe9" => ["", "\xff", "\xd6"], "\xea" => ["", "\xff", "\xfb", "\x80"], "\xeb" => ["", "\xff", "\xfb", "\xc0"], "\xec" => ["", "\xff", "\xfa", "\x00"], "\xed" => ["", "\xff", "\xfa", "\x80"], "\xee" => ["", "\xff", "\xfd", "@"], "\xef" => ["", "\xff", "\xf4"], "\xf0" => ["", "\xff", "\xfd", "`"], "\xf1" => ["", "\xff", "\xfe", "`"], "\xf2" => ["", "\xff", "\xfd", "\x80"], "\xf3" => ["", "\xff", "\xfd", "\xa0"], "\xf4" => ["", "\xff", "\xfe", "p"], "\xf5" => ["", "\xff", "\xfe", "\x80"], "\xf6" => ["", "\xff", "\xfe", "\x90"], "\xf7" => ["", "\xff", "\xfe", "\xa0"], "\xf8" => ["", "\xff", "\xfe", "\xb0"], "\xf9" => ["", "\xff", "\xff", "\xf0"], "\xfa" => ["", "\xff", "\xfe", "\xc0"], "\xfb" => ["", "\xff", "\xfe", "\xd0"], "\xfc" => ["", "\xff", "\xfe", "\xe0"], "\xfd" => ["", "\xff", "\xfe", "\xf0"], "\xfe" => ["", "\xff", "\xff", "\x00"], "\xff" => ["", "\xff", "\xfd", "\xc0"]], ["\x00" => ["?", "\xf0"], "\x01" => ["?", "\xff", "\xec", "\x00"], "\x02" => ["?", "\xff", "\xff", "\x88"], "\x03" => ["?", "\xff", "\xff", "\x8c"], "\x04" => ["?", "\xff", "\xff", "\x90"], "\x05" => ["?", "\xff", "\xff", "\x94"], "\x06" => ["?", "\xff", "\xff", "\x98"], "\x07" => ["?", "\xff", "\xff", "\x9c"], "\x08" => ["?", "\xff", "\xff", "\xa0"], "\t" => ["?", "\xff", "\xfa", "\x80"], "\n" => ["?", "\xff", "\xff", "\xfc"], "\v" => ["?", "\xff", "\xff", "\xa4"], "\f" => ["?", "\xff", "\xff", "\xa8"], "\r" => ["?", "\xff", "\xff", "\xfd"], "\x0e" => ["?", "\xff", "\xff", "\xac"], "\x0f" => ["?", "\xff", "\xff", "\xb0"], "\x10" => ["?", "\xff", "\xff", "\xb4"], "\x11" => ["?", "\xff", "\xff", "\xb8"], "\x12" => ["?", "\xff", "\xff", "\xbc"], "\x13" => ["?", "\xff", "\xff", "\xc0"], "\x14" => ["?", "\xff", "\xff", "\xc4"], "\x15" => ["?", "\xff", "\xff", "\xc8"], "\x16" => ["?", "\xff", "\xff", "\xfe"], "\x17" => ["?", "\xff", "\xff", "\xcc"], "\x18" => ["?", "\xff", "\xff", "\xd0"], "\x19" => ["?", "\xff", "\xff", "\xd4"], "\x1a" => ["?", "\xff", "\xff", "\xd8"], "\x1b" => ["?", "\xff", "\xff", "\xdc"], "\x1c" => ["?", "\xff", "\xff", "\xe0"], "\x1d" => ["?", "\xff", "\xff", "\xe4"], "\x1e" => ["?", "\xff", "\xff", "\xe8"], "\x1f" => ["?", "\xff", "\xff", "\xec"], " " => ["\x14"], "!" => ["?", "\x80"], "\"" => ["?", "\x90"], "#" => ["?", "\xe8"], "\$" => ["?", "\xf2"], "%" => ["\x15"], "&" => [">", "\x00"], "'" => ["?", "\xd0"], "(" => ["?", "\xa0"], ")" => ["?", "\xb0"], "*" => [">", "@"], "+" => ["?", "\xd8"], "," => [">", "\x80"], "-" => ["\x16"], "." => ["\x17"], "/" => ["\x18"], ["\x00"], ["\x02"], ["\x04"], ["\x19"], ["\x1a"], ["\x1b"], ["\x1c"], ["\x1d"], ["\x1e"], ["\x1f"], ":" => [".", "\x00"], ";" => [">", "\xc0"], "<" => ["?", "\xfe", "\x00"], "=" => [" "], ">" => ["?", "\xec"], "?" => ["?", "\xc0"], "@" => ["?", "\xf4"], "A" => ["!"], "B" => [".", "\x80"], "C" => ["/", "\x00"], "D" => ["/", "\x80"], "E" => ["0", "\x00"], "F" => ["0", "\x80"], "G" => ["1", "\x00"], "H" => ["1", "\x80"], "I" => ["2", "\x00"], "J" => ["2", "\x80"], "K" => ["3", "\x00"], "L" => ["3", "\x80"], "M" => ["4", "\x00"], "N" => ["4", "\x80"], "O" => ["5", "\x00"], "P" => ["5", "\x80"], "Q" => ["6", "\x00"], "R" => ["6", "\x80"], "S" => ["7", "\x00"], "T" => ["7", "\x80"], "U" => ["8", "\x00"], "V" => ["8", "\x80"], "W" => ["9", "\x00"], "X" => ["?", "\x00"], "Y" => ["9", "\x80"], "Z" => ["?", "@"], "[" => ["?", "\xf6"], "\\" => ["?", "\xff", "\x80"], "]" => ["?", "\xf8"], "^" => ["?", "\xfc"], "_" => ["\""], "`" => ["?", "\xfe", "\x80"], "a" => ["\x06"], "b" => ["#"], "c" => ["\x08"], "d" => ["\$"], "e" => ["\n"], "f" => ["%"], "g" => ["&"], "h" => ["'"], "i" => ["\f"], "j" => [":", "\x00"], "k" => [":", "\x80"], "l" => ["("], "m" => [")"], "n" => ["*"], "o" => ["\x0e"], "p" => ["+"], "q" => [";", "\x00"], "r" => [","], "s" => ["\x10"], "t" => ["\x12"], "u" => ["-"], "v" => [";", "\x80"], "w" => ["<", "\x00"], "x" => ["<", "\x80"], "y" => ["=", "\x00"], "z" => ["=", "\x80"], "{" => ["?", "\xff", "\x00"], "|" => ["?", "\xe0"], "}" => ["?", "\xfd"], "~" => ["?", "\xfa"], "" => ["?", "\xff", "\xff", "\xf0"], "\x80" => ["?", "\xff", "\x98"], "\x81" => ["?", "\xff", "\xd2"], "\x82" => ["?", "\xff", "\x9c"], "\x83" => ["?", "\xff", "\xa0"], "\x84" => ["?", "\xff", "\xd3"], "\x85" => ["?", "\xff", "\xd4"], "\x86" => ["?", "\xff", "\xd5"], "\x87" => ["?", "\xff", "\xec", "\x80"], "\x88" => ["?", "\xff", "\xd6"], "\x89" => ["?", "\xff", "\xed", "\x00"], "\x8a" => ["?", "\xff", "\xed", "\x80"], "\x8b" => ["?", "\xff", "\xee", "\x00"], "\x8c" => ["?", "\xff", "\xee", "\x80"], "\x8d" => ["?", "\xff", "\xef", "\x00"], "\x8e" => ["?", "\xff", "\xfa", "\xc0"], "\x8f" => ["?", "\xff", "\xef", "\x80"], "\x90" => ["?", "\xff", "\xfb", "\x00"], "\x91" => ["?", "\xff", "\xfb", "@"], "\x92" => ["?", "\xff", "\xd7"], "\x93" => ["?", "\xff", "\xf0", "\x00"], "\x94" => ["?", "\xff", "\xfb", "\x80"], "\x95" => ["?", "\xff", "\xf0", "\x80"], "\x96" => ["?", "\xff", "\xf1", "\x00"], "\x97" => ["?", "\xff", "\xf1", "\x80"], "\x98" => ["?", "\xff", "\xf2", "\x00"], "\x99" => ["?", "\xff", "\xb8"], "\x9a" => ["?", "\xff", "\xd8"], "\x9b" => ["?", "\xff", "\xf2", "\x80"], "\x9c" => ["?", "\xff", "\xd9"], "\x9d" => ["?", "\xff", "\xf3", "\x00"], "\x9e" => ["?", "\xff", "\xf3", "\x80"], "\x9f" => ["?", "\xff", "\xfb", "\xc0"], "\xa0" => ["?", "\xff", "\xda"], "\xa1" => ["?", "\xff", "\xba"], "\xa2" => ["?", "\xff", "\xa4"], "\xa3" => ["?", "\xff", "\xdb"], "\xa4" => ["?", "\xff", "\xdc"], "\xa5" => ["?", "\xff", "\xf4", "\x00"], "\xa6" => ["?", "\xff", "\xf4", "\x80"], "\xa7" => ["?", "\xff", "\xbc"], "\xa8" => ["?", "\xff", "\xf5", "\x00"], "\xa9" => ["?", "\xff", "\xdd"], "\xaa" => ["?", "\xff", "\xde"], "\xab" => ["?", "\xff", "\xfc", "\x00"], "\xac" => ["?", "\xff", "\xbe"], "\xad" => ["?", "\xff", "\xdf"], "\xae" => ["?", "\xff", "\xf5", "\x80"], "\xaf" => ["?", "\xff", "\xf6", "\x00"], "\xb0" => ["?", "\xff", "\xc0"], "\xb1" => ["?", "\xff", "\xc2"], "\xb2" => ["?", "\xff", "\xe0"], "\xb3" => ["?", "\xff", "\xc4"], "\xb4" => ["?", "\xff", "\xf6", "\x80"], "\xb5" => ["?", "\xff", "\xe1"], "\xb6" => ["?", "\xff", "\xf7", "\x00"], "\xb7" => ["?", "\xff", "\xf7", "\x80"], "\xb8" => ["?", "\xff", "\xa8"], "\xb9" => ["?", "\xff", "\xe2"], "\xba" => ["?", "\xff", "\xe3"], "\xbb" => ["?", "\xff", "\xe4"], "\xbc" => ["?", "\xff", "\xf8", "\x00"], "\xbd" => ["?", "\xff", "\xe5"], "\xbe" => ["?", "\xff", "\xe6"], "\xbf" => ["?", "\xff", "\xf8", "\x80"], "\xc0" => ["?", "\xff", "\xfe", "\x00"], "\xc1" => ["?", "\xff", "\xfe", "\x10"], "\xc2" => ["?", "\xff", "\xac"], "\xc3" => ["?", "\xff", "\x88"], "\xc4" => ["?", "\xff", "\xe7"], "\xc5" => ["?", "\xff", "\xf9", "\x00"], "\xc6" => ["?", "\xff", "\xe8"], "\xc7" => ["?", "\xff", "\xfd", "\x80"], "\xc8" => ["?", "\xff", "\xfe", " "], "\xc9" => ["?", "\xff", "\xfe", "0"], "\xca" => ["?", "\xff", "\xfe", "@"], "\xcb" => ["?", "\xff", "\xfe", "\xf0"], "\xcc" => ["?", "\xff", "\xfe", "\xf8"], "\xcd" => ["?", "\xff", "\xfe", "P"], "\xce" => ["?", "\xff", "\xfc", "@"], "\xcf" => ["?", "\xff", "\xfd", "\xa0"], "\xd0" => ["?", "\xff", "\x90"], "\xd1" => ["?", "\xff", "\xc6"], "\xd2" => ["?", "\xff", "\xfe", "`"], "\xd3" => ["?", "\xff", "\xff", "\x00"], "\xd4" => ["?", "\xff", "\xff", "\x08"], "\xd5" => ["?", "\xff", "\xfe", "p"], "\xd6" => ["?", "\xff", "\xff", "\x10"], "\xd7" => ["?", "\xff", "\xfc", "\x80"], "\xd8" => ["?", "\xff", "\xc8"], "\xd9" => ["?", "\xff", "\xca"], "\xda" => ["?", "\xff", "\xfe", "\x80"], "\xdb" => ["?", "\xff", "\xfe", "\x90"], "\xdc" => ["?", "\xff", "\xff", "\xf4"], "\xdd" => ["?", "\xff", "\xff", "\x18"], "\xde" => ["?", "\xff", "\xff", " "], "\xdf" => ["?", "\xff", "\xff", "("], "\xe0" => ["?", "\xff", "\xb0"], "\xe1" => ["?", "\xff", "\xfc", "\xc0"], "\xe2" => ["?", "\xff", "\xb4"], "\xe3" => ["?", "\xff", "\xcc"], "\xe4" => ["?", "\xff", "\xe9"], "\xe5" => ["?", "\xff", "\xce"], "\xe6" => ["?", "\xff", "\xd0"], "\xe7" => ["?", "\xff", "\xf9", "\x80"], "\xe8" => ["?", "\xff", "\xea"], "\xe9" => ["?", "\xff", "\xeb"], "\xea" => ["?", "\xff", "\xfd", "\xc0"], "\xeb" => ["?", "\xff", "\xfd", "\xe0"], "\xec" => ["?", "\xff", "\xfd", "\x00"], "\xed" => ["?", "\xff", "\xfd", "@"], "\xee" => ["?", "\xff", "\xfe", "\xa0"], "\xef" => ["?", "\xff", "\xfa", "\x00"], "\xf0" => ["?", "\xff", "\xfe", "\xb0"], "\xf1" => ["?", "\xff", "\xff", "0"], "\xf2" => ["?", "\xff", "\xfe", "\xc0"], "\xf3" => ["?", "\xff", "\xfe", "\xd0"], "\xf4" => ["?", "\xff", "\xff", "8"], "\xf5" => ["?", "\xff", "\xff", "@"], "\xf6" => ["?", "\xff", "\xff", "H"], "\xf7" => ["?", "\xff", "\xff", "P"], "\xf8" => ["?", "\xff", "\xff", "X"], "\xf9" => ["?", "\xff", "\xff", "\xf8"], "\xfa" => ["?", "\xff", "\xff", "`"], "\xfb" => ["?", "\xff", "\xff", "h"], "\xfc" => ["?", "\xff", "\xff", "p"], "\xfd" => ["?", "\xff", "\xff", "x"], "\xfe" => ["?", "\xff", "\xff", "\x80"], "\xff" => ["?", "\xff", "\xfe", "\xe0"]], ["\x00" => ["\x1f", "\xf8"], "\x01" => ["\x1f", "\xff", "\xf6", "\x00"], "\x02" => ["\x1f", "\xff", "\xff", "\xc4"], "\x03" => ["\x1f", "\xff", "\xff", "\xc6"], "\x04" => ["\x1f", "\xff", "\xff", "\xc8"], "\x05" => ["\x1f", "\xff", "\xff", "\xca"], "\x06" => ["\x1f", "\xff", "\xff", "\xcc"], "\x07" => ["\x1f", "\xff", "\xff", "\xce"], "\x08" => ["\x1f", "\xff", "\xff", "\xd0"], "\t" => ["\x1f", "\xff", "\xfd", "@"], "\n" => ["\x1f", "\xff", "\xff", "\xfe", "\x00"], "\v" => ["\x1f", "\xff", "\xff", "\xd2"], "\f" => ["\x1f", "\xff", "\xff", "\xd4"], "\r" => ["\x1f", "\xff", "\xff", "\xfe", "\x80"], "\x0e" => ["\x1f", "\xff", "\xff", "\xd6"], "\x0f" => ["\x1f", "\xff", "\xff", "\xd8"], "\x10" => ["\x1f", "\xff", "\xff", "\xda"], "\x11" => ["\x1f", "\xff", "\xff", "\xdc"], "\x12" => ["\x1f", "\xff", "\xff", "\xde"], "\x13" => ["\x1f", "\xff", "\xff", "\xe0"], "\x14" => ["\x1f", "\xff", "\xff", "\xe2"], "\x15" => ["\x1f", "\xff", "\xff", "\xe4"], "\x16" => ["\x1f", "\xff", "\xff", "\xff", "\x00"], "\x17" => ["\x1f", "\xff", "\xff", "\xe6"], "\x18" => ["\x1f", "\xff", "\xff", "\xe8"], "\x19" => ["\x1f", "\xff", "\xff", "\xea"], "\x1a" => ["\x1f", "\xff", "\xff", "\xec"], "\x1b" => ["\x1f", "\xff", "\xff", "\xee"], "\x1c" => ["\x1f", "\xff", "\xff", "\xf0"], "\x1d" => ["\x1f", "\xff", "\xff", "\xf2"], "\x1e" => ["\x1f", "\xff", "\xff", "\xf4"], "\x1f" => ["\x1f", "\xff", "\xff", "\xf6"], " " => ["\n", "\x00"], "!" => ["\x1f", "\xc0"], "\"" => ["\x1f", "\xc8"], "#" => ["\x1f", "\xf4"], "\$" => ["\x1f", "\xf9"], "%" => ["\n", "\x80"], "&" => ["\x1f", "\x00"], "'" => ["\x1f", "\xe8"], "(" => ["\x1f", "\xd0"], ")" => ["\x1f", "\xd8"], "*" => ["\x1f", " "], "+" => ["\x1f", "\xec"], "," => ["\x1f", "@"], "-" => ["\v", "\x00"], "." => ["\v", "\x80"], "/" => ["\f", "\x00"], ["\x00"], ["\x01"], ["\x02"], ["\f", "\x80"], ["\r", "\x00"], ["\r", "\x80"], ["\x0e", "\x00"], ["\x0e", "\x80"], ["\x0f", "\x00"], ["\x0f", "\x80"], ":" => ["\x17", "\x00"], ";" => ["\x1f", "`"], "<" => ["\x1f", "\xff", "\x00"], "=" => ["\x10", "\x00"], ">" => ["\x1f", "\xf6"], "?" => ["\x1f", "\xe0"], "@" => ["\x1f", "\xfa"], "A" => ["\x10", "\x80"], "B" => ["\x17", "@"], "C" => ["\x17", "\x80"], "D" => ["\x17", "\xc0"], "E" => ["\x18", "\x00"], "F" => ["\x18", "@"], "G" => ["\x18", "\x80"], "H" => ["\x18", "\xc0"], "I" => ["\x19", "\x00"], "J" => ["\x19", "@"], "K" => ["\x19", "\x80"], "L" => ["\x19", "\xc0"], "M" => ["\x1a", "\x00"], "N" => ["\x1a", "@"], "O" => ["\x1a", "\x80"], "P" => ["\x1a", "\xc0"], "Q" => ["\x1b", "\x00"], "R" => ["\x1b", "@"], "S" => ["\x1b", "\x80"], "T" => ["\x1b", "\xc0"], "U" => ["\x1c", "\x00"], "V" => ["\x1c", "@"], "W" => ["\x1c", "\x80"], "X" => ["\x1f", "\x80"], "Y" => ["\x1c", "\xc0"], "Z" => ["\x1f", "\xa0"], "[" => ["\x1f", "\xfb"], "\\" => ["\x1f", "\xff", "\xc0"], "]" => ["\x1f", "\xfc"], "^" => ["\x1f", "\xfe", "\x00"], "_" => ["\x11", "\x00"], "`" => ["\x1f", "\xff", "@"], "a" => ["\x03"], "b" => ["\x11", "\x80"], "c" => ["\x04"], "d" => ["\x12", "\x00"], "e" => ["\x05"], "f" => ["\x12", "\x80"], "g" => ["\x13", "\x00"], "h" => ["\x13", "\x80"], "i" => ["\x06"], "j" => ["\x1d", "\x00"], "k" => ["\x1d", "@"], "l" => ["\x14", "\x00"], "m" => ["\x14", "\x80"], "n" => ["\x15", "\x00"], "o" => ["\x07"], "p" => ["\x15", "\x80"], "q" => ["\x1d", "\x80"], "r" => ["\x16", "\x00"], "s" => ["\x08"], "t" => ["\t"], "u" => ["\x16", "\x80"], "v" => ["\x1d", "\xc0"], "w" => ["\x1e", "\x00"], "x" => ["\x1e", "@"], "y" => ["\x1e", "\x80"], "z" => ["\x1e", "\xc0"], "{" => ["\x1f", "\xff", "\x80"], "|" => ["\x1f", "\xf0"], "}" => ["\x1f", "\xfe", "\x80"], "~" => ["\x1f", "\xfd"], "" => ["\x1f", "\xff", "\xff", "\xf8"], "\x80" => ["\x1f", "\xff", "\xcc"], "\x81" => ["\x1f", "\xff", "\xe9", "\x00"], "\x82" => ["\x1f", "\xff", "\xce"], "\x83" => ["\x1f", "\xff", "\xd0"], "\x84" => ["\x1f", "\xff", "\xe9", "\x80"], "\x85" => ["\x1f", "\xff", "\xea", "\x00"], "\x86" => ["\x1f", "\xff", "\xea", "\x80"], "\x87" => ["\x1f", "\xff", "\xf6", "@"], "\x88" => ["\x1f", "\xff", "\xeb", "\x00"], "\x89" => ["\x1f", "\xff", "\xf6", "\x80"], "\x8a" => ["\x1f", "\xff", "\xf6", "\xc0"], "\x8b" => ["\x1f", "\xff", "\xf7", "\x00"], "\x8c" => ["\x1f", "\xff", "\xf7", "@"], "\x8d" => ["\x1f", "\xff", "\xf7", "\x80"], "\x8e" => ["\x1f", "\xff", "\xfd", "`"], "\x8f" => ["\x1f", "\xff", "\xf7", "\xc0"], "\x90" => ["\x1f", "\xff", "\xfd", "\x80"], "\x91" => ["\x1f", "\xff", "\xfd", "\xa0"], "\x92" => ["\x1f", "\xff", "\xeb", "\x80"], "\x93" => ["\x1f", "\xff", "\xf8", "\x00"], "\x94" => ["\x1f", "\xff", "\xfd", "\xc0"], "\x95" => ["\x1f", "\xff", "\xf8", "@"], "\x96" => ["\x1f", "\xff", "\xf8", "\x80"], "\x97" => ["\x1f", "\xff", "\xf8", "\xc0"], "\x98" => ["\x1f", "\xff", "\xf9", "\x00"], "\x99" => ["\x1f", "\xff", "\xdc"], "\x9a" => ["\x1f", "\xff", "\xec", "\x00"], "\x9b" => ["\x1f", "\xff", "\xf9", "@"], "\x9c" => ["\x1f", "\xff", "\xec", "\x80"], "\x9d" => ["\x1f", "\xff", "\xf9", "\x80"], "\x9e" => ["\x1f", "\xff", "\xf9", "\xc0"], "\x9f" => ["\x1f", "\xff", "\xfd", "\xe0"], "\xa0" => ["\x1f", "\xff", "\xed", "\x00"], "\xa1" => ["\x1f", "\xff", "\xdd"], "\xa2" => ["\x1f", "\xff", "\xd2"], "\xa3" => ["\x1f", "\xff", "\xed", "\x80"], "\xa4" => ["\x1f", "\xff", "\xee", "\x00"], "\xa5" => ["\x1f", "\xff", "\xfa", "\x00"], "\xa6" => ["\x1f", "\xff", "\xfa", "@"], "\xa7" => ["\x1f", "\xff", "\xde"], "\xa8" => ["\x1f", "\xff", "\xfa", "\x80"], "\xa9" => ["\x1f", "\xff", "\xee", "\x80"], "\xaa" => ["\x1f", "\xff", "\xef", "\x00"], "\xab" => ["\x1f", "\xff", "\xfe", "\x00"], "\xac" => ["\x1f", "\xff", "\xdf"], "\xad" => ["\x1f", "\xff", "\xef", "\x80"], "\xae" => ["\x1f", "\xff", "\xfa", "\xc0"], "\xaf" => ["\x1f", "\xff", "\xfb", "\x00"], "\xb0" => ["\x1f", "\xff", "\xe0"], "\xb1" => ["\x1f", "\xff", "\xe1"], "\xb2" => ["\x1f", "\xff", "\xf0", "\x00"], "\xb3" => ["\x1f", "\xff", "\xe2"], "\xb4" => ["\x1f", "\xff", "\xfb", "@"], "\xb5" => ["\x1f", "\xff", "\xf0", "\x80"], "\xb6" => ["\x1f", "\xff", "\xfb", "\x80"], "\xb7" => ["\x1f", "\xff", "\xfb", "\xc0"], "\xb8" => ["\x1f", "\xff", "\xd4"], "\xb9" => ["\x1f", "\xff", "\xf1", "\x00"], "\xba" => ["\x1f", "\xff", "\xf1", "\x80"], "\xbb" => ["\x1f", "\xff", "\xf2", "\x00"], "\xbc" => ["\x1f", "\xff", "\xfc", "\x00"], "\xbd" => ["\x1f", "\xff", "\xf2", "\x80"], "\xbe" => ["\x1f", "\xff", "\xf3", "\x00"], "\xbf" => ["\x1f", "\xff", "\xfc", "@"], "\xc0" => ["\x1f", "\xff", "\xff", "\x00"], "\xc1" => ["\x1f", "\xff", "\xff", "\x08"], "\xc2" => ["\x1f", "\xff", "\xd6"], "\xc3" => ["\x1f", "\xff", "\xc4"], "\xc4" => ["\x1f", "\xff", "\xf3", "\x80"], "\xc5" => ["\x1f", "\xff", "\xfc", "\x80"], "\xc6" => ["\x1f", "\xff", "\xf4", "\x00"], "\xc7" => ["\x1f", "\xff", "\xfe", "\xc0"], "\xc8" => ["\x1f", "\xff", "\xff", "\x10"], "\xc9" => ["\x1f", "\xff", "\xff", "\x18"], "\xca" => ["\x1f", "\xff", "\xff", " "], "\xcb" => ["\x1f", "\xff", "\xff", "x"], "\xcc" => ["\x1f", "\xff", "\xff", "|"], "\xcd" => ["\x1f", "\xff", "\xff", "("], "\xce" => ["\x1f", "\xff", "\xfe", " "], "\xcf" => ["\x1f", "\xff", "\xfe", "\xd0"], "\xd0" => ["\x1f", "\xff", "\xc8"], "\xd1" => ["\x1f", "\xff", "\xe3"], "\xd2" => ["\x1f", "\xff", "\xff", "0"], "\xd3" => ["\x1f", "\xff", "\xff", "\x80"], "\xd4" => ["\x1f", "\xff", "\xff", "\x84"], "\xd5" => ["\x1f", "\xff", "\xff", "8"], "\xd6" => ["\x1f", "\xff", "\xff", "\x88"], "\xd7" => ["\x1f", "\xff", "\xfe", "@"], "\xd8" => ["\x1f", "\xff", "\xe4"], "\xd9" => ["\x1f", "\xff", "\xe5"], "\xda" => ["\x1f", "\xff", "\xff", "@"], "\xdb" => ["\x1f", "\xff", "\xff", "H"], "\xdc" => ["\x1f", "\xff", "\xff", "\xfa"], "\xdd" => ["\x1f", "\xff", "\xff", "\x8c"], "\xde" => ["\x1f", "\xff", "\xff", "\x90"], "\xdf" => ["\x1f", "\xff", "\xff", "\x94"], "\xe0" => ["\x1f", "\xff", "\xd8"], "\xe1" => ["\x1f", "\xff", "\xfe", "`"], "\xe2" => ["\x1f", "\xff", "\xda"], "\xe3" => ["\x1f", "\xff", "\xe6"], "\xe4" => ["\x1f", "\xff", "\xf4", "\x80"], "\xe5" => ["\x1f", "\xff", "\xe7"], "\xe6" => ["\x1f", "\xff", "\xe8"], "\xe7" => ["\x1f", "\xff", "\xfc", "\xc0"], "\xe8" => ["\x1f", "\xff", "\xf5", "\x00"], "\xe9" => ["\x1f", "\xff", "\xf5", "\x80"], "\xea" => ["\x1f", "\xff", "\xfe", "\xe0"], "\xeb" => ["\x1f", "\xff", "\xfe", "\xf0"], "\xec" => ["\x1f", "\xff", "\xfe", "\x80"], "\xed" => ["\x1f", "\xff", "\xfe", "\xa0"], "\xee" => ["\x1f", "\xff", "\xff", "P"], "\xef" => ["\x1f", "\xff", "\xfd", "\x00"], "\xf0" => ["\x1f", "\xff", "\xff", "X"], "\xf1" => ["\x1f", "\xff", "\xff", "\x98"], "\xf2" => ["\x1f", "\xff", "\xff", "`"], "\xf3" => ["\x1f", "\xff", "\xff", "h"], "\xf4" => ["\x1f", "\xff", "\xff", "\x9c"], "\xf5" => ["\x1f", "\xff", "\xff", "\xa0"], "\xf6" => ["\x1f", "\xff", "\xff", "\xa4"], "\xf7" => ["\x1f", "\xff", "\xff", "\xa8"], "\xf8" => ["\x1f", "\xff", "\xff", "\xac"], "\xf9" => ["\x1f", "\xff", "\xff", "\xfc"], "\xfa" => ["\x1f", "\xff", "\xff", "\xb0"], "\xfb" => ["\x1f", "\xff", "\xff", "\xb4"], "\xfc" => ["\x1f", "\xff", "\xff", "\xb8"], "\xfd" => ["\x1f", "\xff", "\xff", "\xbc"], "\xfe" => ["\x1f", "\xff", "\xff", "\xc0"], "\xff" => ["\x1f", "\xff", "\xff", "p"]], ["\x00" => ["\x0f", "\xfc", "\x00"], "\x01" => ["\x0f", "\xff", "\xfb", "\x00"], "\x02" => ["\x0f", "\xff", "\xff", "\xe2"], "\x03" => ["\x0f", "\xff", "\xff", "\xe3"], "\x04" => ["\x0f", "\xff", "\xff", "\xe4"], "\x05" => ["\x0f", "\xff", "\xff", "\xe5"], "\x06" => ["\x0f", "\xff", "\xff", "\xe6"], "\x07" => ["\x0f", "\xff", "\xff", "\xe7"], "\x08" => ["\x0f", "\xff", "\xff", "\xe8"], "\t" => ["\x0f", "\xff", "\xfe", "\xa0"], "\n" => ["\x0f", "\xff", "\xff", "\xff", "\x00"], "\v" => ["\x0f", "\xff", "\xff", "\xe9"], "\f" => ["\x0f", "\xff", "\xff", "\xea"], "\r" => ["\x0f", "\xff", "\xff", "\xff", "@"], "\x0e" => ["\x0f", "\xff", "\xff", "\xeb"], "\x0f" => ["\x0f", "\xff", "\xff", "\xec"], "\x10" => ["\x0f", "\xff", "\xff", "\xed"], "\x11" => ["\x0f", "\xff", "\xff", "\xee"], "\x12" => ["\x0f", "\xff", "\xff", "\xef"], "\x13" => ["\x0f", "\xff", "\xff", "\xf0"], "\x14" => ["\x0f", "\xff", "\xff", "\xf1"], "\x15" => ["\x0f", "\xff", "\xff", "\xf2"], "\x16" => ["\x0f", "\xff", "\xff", "\xff", "\x80"], "\x17" => ["\x0f", "\xff", "\xff", "\xf3"], "\x18" => ["\x0f", "\xff", "\xff", "\xf4"], "\x19" => ["\x0f", "\xff", "\xff", "\xf5"], "\x1a" => ["\x0f", "\xff", "\xff", "\xf6"], "\x1b" => ["\x0f", "\xff", "\xff", "\xf7"], "\x1c" => ["\x0f", "\xff", "\xff", "\xf8"], "\x1d" => ["\x0f", "\xff", "\xff", "\xf9"], "\x1e" => ["\x0f", "\xff", "\xff", "\xfa"], "\x1f" => ["\x0f", "\xff", "\xff", "\xfb"], " " => ["\x05", "\x00"], "!" => ["\x0f", "\xe0"], "\"" => ["\x0f", "\xe4"], "#" => ["\x0f", "\xfa"], "\$" => ["\x0f", "\xfc", "\x80"], "%" => ["\x05", "@"], "&" => ["\x0f", "\x80"], "'" => ["\x0f", "\xf4"], "(" => ["\x0f", "\xe8"], ")" => ["\x0f", "\xec"], "*" => ["\x0f", "\x90"], "+" => ["\x0f", "\xf6"], "," => ["\x0f", "\xa0"], "-" => ["\x05", "\x80"], "." => ["\x05", "\xc0"], "/" => ["\x06", "\x00"], ["\x00", "\x00"], ["\x00", "\x80"], ["\x01", "\x00"], ["\x06", "@"], ["\x06", "\x80"], ["\x06", "\xc0"], ["\x07", "\x00"], ["\x07", "@"], ["\x07", "\x80"], ["\x07", "\xc0"], ":" => ["\v", "\x80"], ";" => ["\x0f", "\xb0"], "<" => ["\x0f", "\xff", "\x80"], "=" => ["\x08", "\x00"], ">" => ["\x0f", "\xfb"], "?" => ["\x0f", "\xf0"], "@" => ["\x0f", "\xfd", "\x00"], "A" => ["\x08", "@"], "B" => ["\v", "\xa0"], "C" => ["\v", "\xc0"], "D" => ["\v", "\xe0"], "E" => ["\f", "\x00"], "F" => ["\f", " "], "G" => ["\f", "@"], "H" => ["\f", "`"], "I" => ["\f", "\x80"], "J" => ["\f", "\xa0"], "K" => ["\f", "\xc0"], "L" => ["\f", "\xe0"], "M" => ["\r", "\x00"], "N" => ["\r", " "], "O" => ["\r", "@"], "P" => ["\r", "`"], "Q" => ["\r", "\x80"], "R" => ["\r", "\xa0"], "S" => ["\r", "\xc0"], "T" => ["\r", "\xe0"], "U" => ["\x0e", "\x00"], "V" => ["\x0e", " "], "W" => ["\x0e", "@"], "X" => ["\x0f", "\xc0"], "Y" => ["\x0e", "`"], "Z" => ["\x0f", "\xd0"], "[" => ["\x0f", "\xfd", "\x80"], "\\" => ["\x0f", "\xff", "\xe0"], "]" => ["\x0f", "\xfe", "\x00"], "^" => ["\x0f", "\xff", "\x00"], "_" => ["\x08", "\x80"], "`" => ["\x0f", "\xff", "\xa0"], "a" => ["\x01", "\x80"], "b" => ["\x08", "\xc0"], "c" => ["\x02", "\x00"], "d" => ["\t", "\x00"], "e" => ["\x02", "\x80"], "f" => ["\t", "@"], "g" => ["\t", "\x80"], "h" => ["\t", "\xc0"], "i" => ["\x03", "\x00"], "j" => ["\x0e", "\x80"], "k" => ["\x0e", "\xa0"], "l" => ["\n", "\x00"], "m" => ["\n", "@"], "n" => ["\n", "\x80"], "o" => ["\x03", "\x80"], "p" => ["\n", "\xc0"], "q" => ["\x0e", "\xc0"], "r" => ["\v", "\x00"], "s" => ["\x04", "\x00"], "t" => ["\x04", "\x80"], "u" => ["\v", "@"], "v" => ["\x0e", "\xe0"], "w" => ["\x0f", "\x00"], "x" => ["\x0f", " "], "y" => ["\x0f", "@"], "z" => ["\x0f", "`"], "{" => ["\x0f", "\xff", "\xc0"], "|" => ["\x0f", "\xf8"], "}" => ["\x0f", "\xff", "@"], "~" => ["\x0f", "\xfe", "\x80"], "" => ["\x0f", "\xff", "\xff", "\xfc"], "\x80" => ["\x0f", "\xff", "\xe6"], "\x81" => ["\x0f", "\xff", "\xf4", "\x80"], "\x82" => ["\x0f", "\xff", "\xe7"], "\x83" => ["\x0f", "\xff", "\xe8"], "\x84" => ["\x0f", "\xff", "\xf4", "\xc0"], "\x85" => ["\x0f", "\xff", "\xf5", "\x00"], "\x86" => ["\x0f", "\xff", "\xf5", "@"], "\x87" => ["\x0f", "\xff", "\xfb", " "], "\x88" => ["\x0f", "\xff", "\xf5", "\x80"], "\x89" => ["\x0f", "\xff", "\xfb", "@"], "\x8a" => ["\x0f", "\xff", "\xfb", "`"], "\x8b" => ["\x0f", "\xff", "\xfb", "\x80"], "\x8c" => ["\x0f", "\xff", "\xfb", "\xa0"], "\x8d" => ["\x0f", "\xff", "\xfb", "\xc0"], "\x8e" => ["\x0f", "\xff", "\xfe", "\xb0"], "\x8f" => ["\x0f", "\xff", "\xfb", "\xe0"], "\x90" => ["\x0f", "\xff", "\xfe", "\xc0"], "\x91" => ["\x0f", "\xff", "\xfe", "\xd0"], "\x92" => ["\x0f", "\xff", "\xf5", "\xc0"], "\x93" => ["\x0f", "\xff", "\xfc", "\x00"], "\x94" => ["\x0f", "\xff", "\xfe", "\xe0"], "\x95" => ["\x0f", "\xff", "\xfc", " "], "\x96" => ["\x0f", "\xff", "\xfc", "@"], "\x97" => ["\x0f", "\xff", "\xfc", "`"], "\x98" => ["\x0f", "\xff", "\xfc", "\x80"], "\x99" => ["\x0f", "\xff", "\xee", "\x00"], "\x9a" => ["\x0f", "\xff", "\xf6", "\x00"], "\x9b" => ["\x0f", "\xff", "\xfc", "\xa0"], "\x9c" => ["\x0f", "\xff", "\xf6", "@"], "\x9d" => ["\x0f", "\xff", "\xfc", "\xc0"], "\x9e" => ["\x0f", "\xff", "\xfc", "\xe0"], "\x9f" => ["\x0f", "\xff", "\xfe", "\xf0"], "\xa0" => ["\x0f", "\xff", "\xf6", "\x80"], "\xa1" => ["\x0f", "\xff", "\xee", "\x80"], "\xa2" => ["\x0f", "\xff", "\xe9"], "\xa3" => ["\x0f", "\xff", "\xf6", "\xc0"], "\xa4" => ["\x0f", "\xff", "\xf7", "\x00"], "\xa5" => ["\x0f", "\xff", "\xfd", "\x00"], "\xa6" => ["\x0f", "\xff", "\xfd", " "], "\xa7" => ["\x0f", "\xff", "\xef", "\x00"], "\xa8" => ["\x0f", "\xff", "\xfd", "@"], "\xa9" => ["\x0f", "\xff", "\xf7", "@"], "\xaa" => ["\x0f", "\xff", "\xf7", "\x80"], "\xab" => ["\x0f", "\xff", "\xff", "\x00"], "\xac" => ["\x0f", "\xff", "\xef", "\x80"], "\xad" => ["\x0f", "\xff", "\xf7", "\xc0"], "\xae" => ["\x0f", "\xff", "\xfd", "`"], "\xaf" => ["\x0f", "\xff", "\xfd", "\x80"], "\xb0" => ["\x0f", "\xff", "\xf0", "\x00"], "\xb1" => ["\x0f", "\xff", "\xf0", "\x80"], "\xb2" => ["\x0f", "\xff", "\xf8", "\x00"], "\xb3" => ["\x0f", "\xff", "\xf1", "\x00"], "\xb4" => ["\x0f", "\xff", "\xfd", "\xa0"], "\xb5" => ["\x0f", "\xff", "\xf8", "@"], "\xb6" => ["\x0f", "\xff", "\xfd", "\xc0"], "\xb7" => ["\x0f", "\xff", "\xfd", "\xe0"], "\xb8" => ["\x0f", "\xff", "\xea"], "\xb9" => ["\x0f", "\xff", "\xf8", "\x80"], "\xba" => ["\x0f", "\xff", "\xf8", "\xc0"], "\xbb" => ["\x0f", "\xff", "\xf9", "\x00"], "\xbc" => ["\x0f", "\xff", "\xfe", "\x00"], "\xbd" => ["\x0f", "\xff", "\xf9", "@"], "\xbe" => ["\x0f", "\xff", "\xf9", "\x80"], "\xbf" => ["\x0f", "\xff", "\xfe", " "], "\xc0" => ["\x0f", "\xff", "\xff", "\x80"], "\xc1" => ["\x0f", "\xff", "\xff", "\x84"], "\xc2" => ["\x0f", "\xff", "\xeb"], "\xc3" => ["\x0f", "\xff", "\xe2"], "\xc4" => ["\x0f", "\xff", "\xf9", "\xc0"], "\xc5" => ["\x0f", "\xff", "\xfe", "@"], "\xc6" => ["\x0f", "\xff", "\xfa", "\x00"], "\xc7" => ["\x0f", "\xff", "\xff", "`"], "\xc8" => ["\x0f", "\xff", "\xff", "\x88"], "\xc9" => ["\x0f", "\xff", "\xff", "\x8c"], "\xca" => ["\x0f", "\xff", "\xff", "\x90"], "\xcb" => ["\x0f", "\xff", "\xff", "\xbc"], "\xcc" => ["\x0f", "\xff", "\xff", "\xbe"], "\xcd" => ["\x0f", "\xff", "\xff", "\x94"], "\xce" => ["\x0f", "\xff", "\xff", "\x10"], "\xcf" => ["\x0f", "\xff", "\xff", "h"], "\xd0" => ["\x0f", "\xff", "\xe4"], "\xd1" => ["\x0f", "\xff", "\xf1", "\x80"], "\xd2" => ["\x0f", "\xff", "\xff", "\x98"], "\xd3" => ["\x0f", "\xff", "\xff", "\xc0"], "\xd4" => ["\x0f", "\xff", "\xff", "\xc2"], "\xd5" => ["\x0f", "\xff", "\xff", "\x9c"], "\xd6" => ["\x0f", "\xff", "\xff", "\xc4"], "\xd7" => ["\x0f", "\xff", "\xff", " "], "\xd8" => ["\x0f", "\xff", "\xf2", "\x00"], "\xd9" => ["\x0f", "\xff", "\xf2", "\x80"], "\xda" => ["\x0f", "\xff", "\xff", "\xa0"], "\xdb" => ["\x0f", "\xff", "\xff", "\xa4"], "\xdc" => ["\x0f", "\xff", "\xff", "\xfd"], "\xdd" => ["\x0f", "\xff", "\xff", "\xc6"], "\xde" => ["\x0f", "\xff", "\xff", "\xc8"], "\xdf" => ["\x0f", "\xff", "\xff", "\xca"], "\xe0" => ["\x0f", "\xff", "\xec"], "\xe1" => ["\x0f", "\xff", "\xff", "0"], "\xe2" => ["\x0f", "\xff", "\xed"], "\xe3" => ["\x0f", "\xff", "\xf3", "\x00"], "\xe4" => ["\x0f", "\xff", "\xfa", "@"], "\xe5" => ["\x0f", "\xff", "\xf3", "\x80"], "\xe6" => ["\x0f", "\xff", "\xf4", "\x00"], "\xe7" => ["\x0f", "\xff", "\xfe", "`"], "\xe8" => ["\x0f", "\xff", "\xfa", "\x80"], "\xe9" => ["\x0f", "\xff", "\xfa", "\xc0"], "\xea" => ["\x0f", "\xff", "\xff", "p"], "\xeb" => ["\x0f", "\xff", "\xff", "x"], "\xec" => ["\x0f", "\xff", "\xff", "@"], "\xed" => ["\x0f", "\xff", "\xff", "P"], "\xee" => ["\x0f", "\xff", "\xff", "\xa8"], "\xef" => ["\x0f", "\xff", "\xfe", "\x80"], "\xf0" => ["\x0f", "\xff", "\xff", "\xac"], "\xf1" => ["\x0f", "\xff", "\xff", "\xcc"], "\xf2" => ["\x0f", "\xff", "\xff", "\xb0"], "\xf3" => ["\x0f", "\xff", "\xff", "\xb4"], "\xf4" => ["\x0f", "\xff", "\xff", "\xce"], "\xf5" => ["\x0f", "\xff", "\xff", "\xd0"], "\xf6" => ["\x0f", "\xff", "\xff", "\xd2"], "\xf7" => ["\x0f", "\xff", "\xff", "\xd4"], "\xf8" => ["\x0f", "\xff", "\xff", "\xd6"], "\xf9" => ["\x0f", "\xff", "\xff", "\xfe"], "\xfa" => ["\x0f", "\xff", "\xff", "\xd8"], "\xfb" => ["\x0f", "\xff", "\xff", "\xda"], "\xfc" => ["\x0f", "\xff", "\xff", "\xdc"], "\xfd" => ["\x0f", "\xff", "\xff", "\xde"], "\xfe" => ["\x0f", "\xff", "\xff", "\xe0"], "\xff" => ["\x0f", "\xff", "\xff", "\xb8"]], ["\x00" => ["\x07", "\xfe", "\x00"], "\x01" => ["\x07", "\xff", "\xfd", "\x80"], "\x02" => ["\x07", "\xff", "\xff", "\xf1", "\x00"], "\x03" => ["\x07", "\xff", "\xff", "\xf1", "\x80"], "\x04" => ["\x07", "\xff", "\xff", "\xf2", "\x00"], "\x05" => ["\x07", "\xff", "\xff", "\xf2", "\x80"], "\x06" => ["\x07", "\xff", "\xff", "\xf3", "\x00"], "\x07" => ["\x07", "\xff", "\xff", "\xf3", "\x80"], "\x08" => ["\x07", "\xff", "\xff", "\xf4", "\x00"], "\t" => ["\x07", "\xff", "\xff", "P"], "\n" => ["\x07", "\xff", "\xff", "\xff", "\x80"], "\v" => ["\x07", "\xff", "\xff", "\xf4", "\x80"], "\f" => ["\x07", "\xff", "\xff", "\xf5", "\x00"], "\r" => ["\x07", "\xff", "\xff", "\xff", "\xa0"], "\x0e" => ["\x07", "\xff", "\xff", "\xf5", "\x80"], "\x0f" => ["\x07", "\xff", "\xff", "\xf6", "\x00"], "\x10" => ["\x07", "\xff", "\xff", "\xf6", "\x80"], "\x11" => ["\x07", "\xff", "\xff", "\xf7", "\x00"], "\x12" => ["\x07", "\xff", "\xff", "\xf7", "\x80"], "\x13" => ["\x07", "\xff", "\xff", "\xf8", "\x00"], "\x14" => ["\x07", "\xff", "\xff", "\xf8", "\x80"], "\x15" => ["\x07", "\xff", "\xff", "\xf9", "\x00"], "\x16" => ["\x07", "\xff", "\xff", "\xff", "\xc0"], "\x17" => ["\x07", "\xff", "\xff", "\xf9", "\x80"], "\x18" => ["\x07", "\xff", "\xff", "\xfa", "\x00"], "\x19" => ["\x07", "\xff", "\xff", "\xfa", "\x80"], "\x1a" => ["\x07", "\xff", "\xff", "\xfb", "\x00"], "\x1b" => ["\x07", "\xff", "\xff", "\xfb", "\x80"], "\x1c" => ["\x07", "\xff", "\xff", "\xfc", "\x00"], "\x1d" => ["\x07", "\xff", "\xff", "\xfc", "\x80"], "\x1e" => ["\x07", "\xff", "\xff", "\xfd", "\x00"], "\x1f" => ["\x07", "\xff", "\xff", "\xfd", "\x80"], " " => ["\x02", "\x80"], "!" => ["\x07", "\xf0"], "\"" => ["\x07", "\xf2"], "#" => ["\x07", "\xfd", "\x00"], "\$" => ["\x07", "\xfe", "@"], "%" => ["\x02", "\xa0"], "&" => ["\x07", "\xc0"], "'" => ["\x07", "\xfa"], "(" => ["\x07", "\xf4"], ")" => ["\x07", "\xf6"], "*" => ["\x07", "\xc8"], "+" => ["\x07", "\xfb"], "," => ["\x07", "\xd0"], "-" => ["\x02", "\xc0"], "." => ["\x02", "\xe0"], "/" => ["\x03", "\x00"], ["\x00", "\x00"], ["\x00", "@"], ["\x00", "\x80"], ["\x03", " "], ["\x03", "@"], ["\x03", "`"], ["\x03", "\x80"], ["\x03", "\xa0"], ["\x03", "\xc0"], ["\x03", "\xe0"], ":" => ["\x05", "\xc0"], ";" => ["\x07", "\xd8"], "<" => ["\x07", "\xff", "\xc0"], "=" => ["\x04", "\x00"], ">" => ["\x07", "\xfd", "\x80"], "?" => ["\x07", "\xf8"], "@" => ["\x07", "\xfe", "\x80"], "A" => ["\x04", " "], "B" => ["\x05", "\xd0"], "C" => ["\x05", "\xe0"], "D" => ["\x05", "\xf0"], "E" => ["\x06", "\x00"], "F" => ["\x06", "\x10"], "G" => ["\x06", " "], "H" => ["\x06", "0"], "I" => ["\x06", "@"], "J" => ["\x06", "P"], "K" => ["\x06", "`"], "L" => ["\x06", "p"], "M" => ["\x06", "\x80"], "N" => ["\x06", "\x90"], "O" => ["\x06", "\xa0"], "P" => ["\x06", "\xb0"], "Q" => ["\x06", "\xc0"], "R" => ["\x06", "\xd0"], "S" => ["\x06", "\xe0"], "T" => ["\x06", "\xf0"], "U" => ["\x07", "\x00"], "V" => ["\x07", "\x10"], "W" => ["\x07", " "], "X" => ["\x07", "\xe0"], "Y" => ["\x07", "0"], "Z" => ["\x07", "\xe8"], "[" => ["\x07", "\xfe", "\xc0"], "\\" => ["\x07", "\xff", "\xf0"], "]" => ["\x07", "\xff", "\x00"], "^" => ["\x07", "\xff", "\x80"], "_" => ["\x04", "@"], "`" => ["\x07", "\xff", "\xd0"], "a" => ["\x00", "\xc0"], "b" => ["\x04", "`"], "c" => ["\x01", "\x00"], "d" => ["\x04", "\x80"], "e" => ["\x01", "@"], "f" => ["\x04", "\xa0"], "g" => ["\x04", "\xc0"], "h" => ["\x04", "\xe0"], "i" => ["\x01", "\x80"], "j" => ["\x07", "@"], "k" => ["\x07", "P"], "l" => ["\x05", "\x00"], "m" => ["\x05", " "], "n" => ["\x05", "@"], "o" => ["\x01", "\xc0"], "p" => ["\x05", "`"], "q" => ["\x07", "`"], "r" => ["\x05", "\x80"], "s" => ["\x02", "\x00"], "t" => ["\x02", "@"], "u" => ["\x05", "\xa0"], "v" => ["\x07", "p"], "w" => ["\x07", "\x80"], "x" => ["\x07", "\x90"], "y" => ["\x07", "\xa0"], "z" => ["\x07", "\xb0"], "{" => ["\x07", "\xff", "\xe0"], "|" => ["\x07", "\xfc"], "}" => ["\x07", "\xff", "\xa0"], "~" => ["\x07", "\xff", "@"], "" => ["\x07", "\xff", "\xff", "\xfe", "\x00"], "\x80" => ["\x07", "\xff", "\xf3", "\x00"], "\x81" => ["\x07", "\xff", "\xfa", "@"], "\x82" => ["\x07", "\xff", "\xf3", "\x80"], "\x83" => ["\x07", "\xff", "\xf4", "\x00"], "\x84" => ["\x07", "\xff", "\xfa", "`"], "\x85" => ["\x07", "\xff", "\xfa", "\x80"], "\x86" => ["\x07", "\xff", "\xfa", "\xa0"], "\x87" => ["\x07", "\xff", "\xfd", "\x90"], "\x88" => ["\x07", "\xff", "\xfa", "\xc0"], "\x89" => ["\x07", "\xff", "\xfd", "\xa0"], "\x8a" => ["\x07", "\xff", "\xfd", "\xb0"], "\x8b" => ["\x07", "\xff", "\xfd", "\xc0"], "\x8c" => ["\x07", "\xff", "\xfd", "\xd0"], "\x8d" => ["\x07", "\xff", "\xfd", "\xe0"], "\x8e" => ["\x07", "\xff", "\xff", "X"], "\x8f" => ["\x07", "\xff", "\xfd", "\xf0"], "\x90" => ["\x07", "\xff", "\xff", "`"], "\x91" => ["\x07", "\xff", "\xff", "h"], "\x92" => ["\x07", "\xff", "\xfa", "\xe0"], "\x93" => ["\x07", "\xff", "\xfe", "\x00"], "\x94" => ["\x07", "\xff", "\xff", "p"], "\x95" => ["\x07", "\xff", "\xfe", "\x10"], "\x96" => ["\x07", "\xff", "\xfe", " "], "\x97" => ["\x07", "\xff", "\xfe", "0"], "\x98" => ["\x07", "\xff", "\xfe", "@"], "\x99" => ["\x07", "\xff", "\xf7", "\x00"], "\x9a" => ["\x07", "\xff", "\xfb", "\x00"], "\x9b" => ["\x07", "\xff", "\xfe", "P"], "\x9c" => ["\x07", "\xff", "\xfb", " "], "\x9d" => ["\x07", "\xff", "\xfe", "`"], "\x9e" => ["\x07", "\xff", "\xfe", "p"], "\x9f" => ["\x07", "\xff", "\xff", "x"], "\xa0" => ["\x07", "\xff", "\xfb", "@"], "\xa1" => ["\x07", "\xff", "\xf7", "@"], "\xa2" => ["\x07", "\xff", "\xf4", "\x80"], "\xa3" => ["\x07", "\xff", "\xfb", "`"], "\xa4" => ["\x07", "\xff", "\xfb", "\x80"], "\xa5" => ["\x07", "\xff", "\xfe", "\x80"], "\xa6" => ["\x07", "\xff", "\xfe", "\x90"], "\xa7" => ["\x07", "\xff", "\xf7", "\x80"], "\xa8" => ["\x07", "\xff", "\xfe", "\xa0"], "\xa9" => ["\x07", "\xff", "\xfb", "\xa0"], "\xaa" => ["\x07", "\xff", "\xfb", "\xc0"], "\xab" => ["\x07", "\xff", "\xff", "\x80"], "\xac" => ["\x07", "\xff", "\xf7", "\xc0"], "\xad" => ["\x07", "\xff", "\xfb", "\xe0"], "\xae" => ["\x07", "\xff", "\xfe", "\xb0"], "\xaf" => ["\x07", "\xff", "\xfe", "\xc0"], "\xb0" => ["\x07", "\xff", "\xf8", "\x00"], "\xb1" => ["\x07", "\xff", "\xf8", "@"], "\xb2" => ["\x07", "\xff", "\xfc", "\x00"], "\xb3" => ["\x07", "\xff", "\xf8", "\x80"], "\xb4" => ["\x07", "\xff", "\xfe", "\xd0"], "\xb5" => ["\x07", "\xff", "\xfc", " "], "\xb6" => ["\x07", "\xff", "\xfe", "\xe0"], "\xb7" => ["\x07", "\xff", "\xfe", "\xf0"], "\xb8" => ["\x07", "\xff", "\xf5", "\x00"], "\xb9" => ["\x07", "\xff", "\xfc", "@"], "\xba" => ["\x07", "\xff", "\xfc", "`"], "\xbb" => ["\x07", "\xff", "\xfc", "\x80"], "\xbc" => ["\x07", "\xff", "\xff", "\x00"], "\xbd" => ["\x07", "\xff", "\xfc", "\xa0"], "\xbe" => ["\x07", "\xff", "\xfc", "\xc0"], "\xbf" => ["\x07", "\xff", "\xff", "\x10"], "\xc0" => ["\x07", "\xff", "\xff", "\xc0"], "\xc1" => ["\x07", "\xff", "\xff", "\xc2"], "\xc2" => ["\x07", "\xff", "\xf5", "\x80"], "\xc3" => ["\x07", "\xff", "\xf1"], "\xc4" => ["\x07", "\xff", "\xfc", "\xe0"], "\xc5" => ["\x07", "\xff", "\xff", " "], "\xc6" => ["\x07", "\xff", "\xfd", "\x00"], "\xc7" => ["\x07", "\xff", "\xff", "\xb0"], "\xc8" => ["\x07", "\xff", "\xff", "\xc4"], "\xc9" => ["\x07", "\xff", "\xff", "\xc6"], "\xca" => ["\x07", "\xff", "\xff", "\xc8"], "\xcb" => ["\x07", "\xff", "\xff", "\xde"], "\xcc" => ["\x07", "\xff", "\xff", "\xdf"], "\xcd" => ["\x07", "\xff", "\xff", "\xca"], "\xce" => ["\x07", "\xff", "\xff", "\x88"], "\xcf" => ["\x07", "\xff", "\xff", "\xb4"], "\xd0" => ["\x07", "\xff", "\xf2"], "\xd1" => ["\x07", "\xff", "\xf8", "\xc0"], "\xd2" => ["\x07", "\xff", "\xff", "\xcc"], "\xd3" => ["\x07", "\xff", "\xff", "\xe0"], "\xd4" => ["\x07", "\xff", "\xff", "\xe1"], "\xd5" => ["\x07", "\xff", "\xff", "\xce"], "\xd6" => ["\x07", "\xff", "\xff", "\xe2"], "\xd7" => ["\x07", "\xff", "\xff", "\x90"], "\xd8" => ["\x07", "\xff", "\xf9", "\x00"], "\xd9" => ["\x07", "\xff", "\xf9", "@"], "\xda" => ["\x07", "\xff", "\xff", "\xd0"], "\xdb" => ["\x07", "\xff", "\xff", "\xd2"], "\xdc" => ["\x07", "\xff", "\xff", "\xfe", "\x80"], "\xdd" => ["\x07", "\xff", "\xff", "\xe3"], "\xde" => ["\x07", "\xff", "\xff", "\xe4"], "\xdf" => ["\x07", "\xff", "\xff", "\xe5"], "\xe0" => ["\x07", "\xff", "\xf6", "\x00"], "\xe1" => ["\x07", "\xff", "\xff", "\x98"], "\xe2" => ["\x07", "\xff", "\xf6", "\x80"], "\xe3" => ["\x07", "\xff", "\xf9", "\x80"], "\xe4" => ["\x07", "\xff", "\xfd", " "], "\xe5" => ["\x07", "\xff", "\xf9", "\xc0"], "\xe6" => ["\x07", "\xff", "\xfa", "\x00"], "\xe7" => ["\x07", "\xff", "\xff", "0"], "\xe8" => ["\x07", "\xff", "\xfd", "@"], "\xe9" => ["\x07", "\xff", "\xfd", "`"], "\xea" => ["\x07", "\xff", "\xff", "\xb8"], "\xeb" => ["\x07", "\xff", "\xff", "\xbc"], "\xec" => ["\x07", "\xff", "\xff", "\xa0"], "\xed" => ["\x07", "\xff", "\xff", "\xa8"], "\xee" => ["\x07", "\xff", "\xff", "\xd4"], "\xef" => ["\x07", "\xff", "\xff", "@"], "\xf0" => ["\x07", "\xff", "\xff", "\xd6"], "\xf1" => ["\x07", "\xff", "\xff", "\xe6"], "\xf2" => ["\x07", "\xff", "\xff", "\xd8"], "\xf3" => ["\x07", "\xff", "\xff", "\xda"], "\xf4" => ["\x07", "\xff", "\xff", "\xe7"], "\xf5" => ["\x07", "\xff", "\xff", "\xe8"], "\xf6" => ["\x07", "\xff", "\xff", "\xe9"], "\xf7" => ["\x07", "\xff", "\xff", "\xea"], "\xf8" => ["\x07", "\xff", "\xff", "\xeb"], "\xf9" => ["\x07", "\xff", "\xff", "\xff", "\x00"], "\xfa" => ["\x07", "\xff", "\xff", "\xec"], "\xfb" => ["\x07", "\xff", "\xff", "\xed"], "\xfc" => ["\x07", "\xff", "\xff", "\xee"], "\xfd" => ["\x07", "\xff", "\xff", "\xef"], "\xfe" => ["\x07", "\xff", "\xff", "\xf0"], "\xff" => ["\x07", "\xff", "\xff", "\xdc"]], ["\x00" => ["\x03", "\xff", "\x00"], "\x01" => ["\x03", "\xff", "\xfe", "\xc0"], "\x02" => ["\x03", "\xff", "\xff", "\xf8", "\x80"], "\x03" => ["\x03", "\xff", "\xff", "\xf8", "\xc0"], "\x04" => ["\x03", "\xff", "\xff", "\xf9", "\x00"], "\x05" => ["\x03", "\xff", "\xff", "\xf9", "@"], "\x06" => ["\x03", "\xff", "\xff", "\xf9", "\x80"], "\x07" => ["\x03", "\xff", "\xff", "\xf9", "\xc0"], "\x08" => ["\x03", "\xff", "\xff", "\xfa", "\x00"], "\t" => ["\x03", "\xff", "\xff", "\xa8"], "\n" => ["\x03", "\xff", "\xff", "\xff", "\xc0"], "\v" => ["\x03", "\xff", "\xff", "\xfa", "@"], "\f" => ["\x03", "\xff", "\xff", "\xfa", "\x80"], "\r" => ["\x03", "\xff", "\xff", "\xff", "\xd0"], "\x0e" => ["\x03", "\xff", "\xff", "\xfa", "\xc0"], "\x0f" => ["\x03", "\xff", "\xff", "\xfb", "\x00"], "\x10" => ["\x03", "\xff", "\xff", "\xfb", "@"], "\x11" => ["\x03", "\xff", "\xff", "\xfb", "\x80"], "\x12" => ["\x03", "\xff", "\xff", "\xfb", "\xc0"], "\x13" => ["\x03", "\xff", "\xff", "\xfc", "\x00"], "\x14" => ["\x03", "\xff", "\xff", "\xfc", "@"], "\x15" => ["\x03", "\xff", "\xff", "\xfc", "\x80"], "\x16" => ["\x03", "\xff", "\xff", "\xff", "\xe0"], "\x17" => ["\x03", "\xff", "\xff", "\xfc", "\xc0"], "\x18" => ["\x03", "\xff", "\xff", "\xfd", "\x00"], "\x19" => ["\x03", "\xff", "\xff", "\xfd", "@"], "\x1a" => ["\x03", "\xff", "\xff", "\xfd", "\x80"], "\x1b" => ["\x03", "\xff", "\xff", "\xfd", "\xc0"], "\x1c" => ["\x03", "\xff", "\xff", "\xfe", "\x00"], "\x1d" => ["\x03", "\xff", "\xff", "\xfe", "@"], "\x1e" => ["\x03", "\xff", "\xff", "\xfe", "\x80"], "\x1f" => ["\x03", "\xff", "\xff", "\xfe", "\xc0"], " " => ["\x01", "@"], "!" => ["\x03", "\xf8"], "\"" => ["\x03", "\xf9"], "#" => ["\x03", "\xfe", "\x80"], "\$" => ["\x03", "\xff", " "], "%" => ["\x01", "P"], "&" => ["\x03", "\xe0"], "'" => ["\x03", "\xfd", "\x00"], "(" => ["\x03", "\xfa"], ")" => ["\x03", "\xfb"], "*" => ["\x03", "\xe4"], "+" => ["\x03", "\xfd", "\x80"], "," => ["\x03", "\xe8"], "-" => ["\x01", "`"], "." => ["\x01", "p"], "/" => ["\x01", "\x80"], ["\x00", "\x00"], ["\x00", " "], ["\x00", "@"], ["\x01", "\x90"], ["\x01", "\xa0"], ["\x01", "\xb0"], ["\x01", "\xc0"], ["\x01", "\xd0"], ["\x01", "\xe0"], ["\x01", "\xf0"], ":" => ["\x02", "\xe0"], ";" => ["\x03", "\xec"], "<" => ["\x03", "\xff", "\xe0"], "=" => ["\x02", "\x00"], ">" => ["\x03", "\xfe", "\xc0"], "?" => ["\x03", "\xfc"], "@" => ["\x03", "\xff", "@"], "A" => ["\x02", "\x10"], "B" => ["\x02", "\xe8"], "C" => ["\x02", "\xf0"], "D" => ["\x02", "\xf8"], "E" => ["\x03", "\x00"], "F" => ["\x03", "\x08"], "G" => ["\x03", "\x10"], "H" => ["\x03", "\x18"], "I" => ["\x03", " "], "J" => ["\x03", "("], "K" => ["\x03", "0"], "L" => ["\x03", "8"], "M" => ["\x03", "@"], "N" => ["\x03", "H"], "O" => ["\x03", "P"], "P" => ["\x03", "X"], "Q" => ["\x03", "`"], "R" => ["\x03", "h"], "S" => ["\x03", "p"], "T" => ["\x03", "x"], "U" => ["\x03", "\x80"], "V" => ["\x03", "\x88"], "W" => ["\x03", "\x90"], "X" => ["\x03", "\xf0"], "Y" => ["\x03", "\x98"], "Z" => ["\x03", "\xf4"], "[" => ["\x03", "\xff", "`"], "\\" => ["\x03", "\xff", "\xf8", "\x00"], "]" => ["\x03", "\xff", "\x80"], "^" => ["\x03", "\xff", "\xc0"], "_" => ["\x02", " "], "`" => ["\x03", "\xff", "\xe8"], "a" => ["\x00", "`"], "b" => ["\x02", "0"], "c" => ["\x00", "\x80"], "d" => ["\x02", "@"], "e" => ["\x00", "\xa0"], "f" => ["\x02", "P"], "g" => ["\x02", "`"], "h" => ["\x02", "p"], "i" => ["\x00", "\xc0"], "j" => ["\x03", "\xa0"], "k" => ["\x03", "\xa8"], "l" => ["\x02", "\x80"], "m" => ["\x02", "\x90"], "n" => ["\x02", "\xa0"], "o" => ["\x00", "\xe0"], "p" => ["\x02", "\xb0"], "q" => ["\x03", "\xb0"], "r" => ["\x02", "\xc0"], "s" => ["\x01", "\x00"], "t" => ["\x01", " "], "u" => ["\x02", "\xd0"], "v" => ["\x03", "\xb8"], "w" => ["\x03", "\xc0"], "x" => ["\x03", "\xc8"], "y" => ["\x03", "\xd0"], "z" => ["\x03", "\xd8"], "{" => ["\x03", "\xff", "\xf0"], "|" => ["\x03", "\xfe", "\x00"], "}" => ["\x03", "\xff", "\xd0"], "~" => ["\x03", "\xff", "\xa0"], "" => ["\x03", "\xff", "\xff", "\xff", "\x00"], "\x80" => ["\x03", "\xff", "\xf9", "\x80"], "\x81" => ["\x03", "\xff", "\xfd", " "], "\x82" => ["\x03", "\xff", "\xf9", "\xc0"], "\x83" => ["\x03", "\xff", "\xfa", "\x00"], "\x84" => ["\x03", "\xff", "\xfd", "0"], "\x85" => ["\x03", "\xff", "\xfd", "@"], "\x86" => ["\x03", "\xff", "\xfd", "P"], "\x87" => ["\x03", "\xff", "\xfe", "\xc8"], "\x88" => ["\x03", "\xff", "\xfd", "`"], "\x89" => ["\x03", "\xff", "\xfe", "\xd0"], "\x8a" => ["\x03", "\xff", "\xfe", "\xd8"], "\x8b" => ["\x03", "\xff", "\xfe", "\xe0"], "\x8c" => ["\x03", "\xff", "\xfe", "\xe8"], "\x8d" => ["\x03", "\xff", "\xfe", "\xf0"], "\x8e" => ["\x03", "\xff", "\xff", "\xac"], "\x8f" => ["\x03", "\xff", "\xfe", "\xf8"], "\x90" => ["\x03", "\xff", "\xff", "\xb0"], "\x91" => ["\x03", "\xff", "\xff", "\xb4"], "\x92" => ["\x03", "\xff", "\xfd", "p"], "\x93" => ["\x03", "\xff", "\xff", "\x00"], "\x94" => ["\x03", "\xff", "\xff", "\xb8"], "\x95" => ["\x03", "\xff", "\xff", "\x08"], "\x96" => ["\x03", "\xff", "\xff", "\x10"], "\x97" => ["\x03", "\xff", "\xff", "\x18"], "\x98" => ["\x03", "\xff", "\xff", " "], "\x99" => ["\x03", "\xff", "\xfb", "\x80"], "\x9a" => ["\x03", "\xff", "\xfd", "\x80"], "\x9b" => ["\x03", "\xff", "\xff", "("], "\x9c" => ["\x03", "\xff", "\xfd", "\x90"], "\x9d" => ["\x03", "\xff", "\xff", "0"], "\x9e" => ["\x03", "\xff", "\xff", "8"], "\x9f" => ["\x03", "\xff", "\xff", "\xbc"], "\xa0" => ["\x03", "\xff", "\xfd", "\xa0"], "\xa1" => ["\x03", "\xff", "\xfb", "\xa0"], "\xa2" => ["\x03", "\xff", "\xfa", "@"], "\xa3" => ["\x03", "\xff", "\xfd", "\xb0"], "\xa4" => ["\x03", "\xff", "\xfd", "\xc0"], "\xa5" => ["\x03", "\xff", "\xff", "@"], "\xa6" => ["\x03", "\xff", "\xff", "H"], "\xa7" => ["\x03", "\xff", "\xfb", "\xc0"], "\xa8" => ["\x03", "\xff", "\xff", "P"], "\xa9" => ["\x03", "\xff", "\xfd", "\xd0"], "\xaa" => ["\x03", "\xff", "\xfd", "\xe0"], "\xab" => ["\x03", "\xff", "\xff", "\xc0"], "\xac" => ["\x03", "\xff", "\xfb", "\xe0"], "\xad" => ["\x03", "\xff", "\xfd", "\xf0"], "\xae" => ["\x03", "\xff", "\xff", "X"], "\xaf" => ["\x03", "\xff", "\xff", "`"], "\xb0" => ["\x03", "\xff", "\xfc", "\x00"], "\xb1" => ["\x03", "\xff", "\xfc", " "], "\xb2" => ["\x03", "\xff", "\xfe", "\x00"], "\xb3" => ["\x03", "\xff", "\xfc", "@"], "\xb4" => ["\x03", "\xff", "\xff", "h"], "\xb5" => ["\x03", "\xff", "\xfe", "\x10"], "\xb6" => ["\x03", "\xff", "\xff", "p"], "\xb7" => ["\x03", "\xff", "\xff", "x"], "\xb8" => ["\x03", "\xff", "\xfa", "\x80"], "\xb9" => ["\x03", "\xff", "\xfe", " "], "\xba" => ["\x03", "\xff", "\xfe", "0"], "\xbb" => ["\x03", "\xff", "\xfe", "@"], "\xbc" => ["\x03", "\xff", "\xff", "\x80"], "\xbd" => ["\x03", "\xff", "\xfe", "P"], "\xbe" => ["\x03", "\xff", "\xfe", "`"], "\xbf" => ["\x03", "\xff", "\xff", "\x88"], "\xc0" => ["\x03", "\xff", "\xff", "\xe0"], "\xc1" => ["\x03", "\xff", "\xff", "\xe1"], "\xc2" => ["\x03", "\xff", "\xfa", "\xc0"], "\xc3" => ["\x03", "\xff", "\xf8", "\x80"], "\xc4" => ["\x03", "\xff", "\xfe", "p"], "\xc5" => ["\x03", "\xff", "\xff", "\x90"], "\xc6" => ["\x03", "\xff", "\xfe", "\x80"], "\xc7" => ["\x03", "\xff", "\xff", "\xd8"], "\xc8" => ["\x03", "\xff", "\xff", "\xe2"], "\xc9" => ["\x03", "\xff", "\xff", "\xe3"], "\xca" => ["\x03", "\xff", "\xff", "\xe4"], "\xcb" => ["\x03", "\xff", "\xff", "\xef", "\x00"], "\xcc" => ["\x03", "\xff", "\xff", "\xef", "\x80"], "\xcd" => ["\x03", "\xff", "\xff", "\xe5"], "\xce" => ["\x03", "\xff", "\xff", "\xc4"], "\xcf" => ["\x03", "\xff", "\xff", "\xda"], "\xd0" => ["\x03", "\xff", "\xf9", "\x00"], "\xd1" => ["\x03", "\xff", "\xfc", "`"], "\xd2" => ["\x03", "\xff", "\xff", "\xe6"], "\xd3" => ["\x03", "\xff", "\xff", "\xf0", "\x00"], "\xd4" => ["\x03", "\xff", "\xff", "\xf0", "\x80"], "\xd5" => ["\x03", "\xff", "\xff", "\xe7"], "\xd6" => ["\x03", "\xff", "\xff", "\xf1", "\x00"], "\xd7" => ["\x03", "\xff", "\xff", "\xc8"], "\xd8" => ["\x03", "\xff", "\xfc", "\x80"], "\xd9" => ["\x03", "\xff", "\xfc", "\xa0"], "\xda" => ["\x03", "\xff", "\xff", "\xe8"], "\xdb" => ["\x03", "\xff", "\xff", "\xe9"], "\xdc" => ["\x03", "\xff", "\xff", "\xff", "@"], "\xdd" => ["\x03", "\xff", "\xff", "\xf1", "\x80"], "\xde" => ["\x03", "\xff", "\xff", "\xf2", "\x00"], "\xdf" => ["\x03", "\xff", "\xff", "\xf2", "\x80"], "\xe0" => ["\x03", "\xff", "\xfb", "\x00"], "\xe1" => ["\x03", "\xff", "\xff", "\xcc"], "\xe2" => ["\x03", "\xff", "\xfb", "@"], "\xe3" => ["\x03", "\xff", "\xfc", "\xc0"], "\xe4" => ["\x03", "\xff", "\xfe", "\x90"], "\xe5" => ["\x03", "\xff", "\xfc", "\xe0"], "\xe6" => ["\x03", "\xff", "\xfd", "\x00"], "\xe7" => ["\x03", "\xff", "\xff", "\x98"], "\xe8" => ["\x03", "\xff", "\xfe", "\xa0"], "\xe9" => ["\x03", "\xff", "\xfe", "\xb0"], "\xea" => ["\x03", "\xff", "\xff", "\xdc"], "\xeb" => ["\x03", "\xff", "\xff", "\xde"], "\xec" => ["\x03", "\xff", "\xff", "\xd0"], "\xed" => ["\x03", "\xff", "\xff", "\xd4"], "\xee" => ["\x03", "\xff", "\xff", "\xea"], "\xef" => ["\x03", "\xff", "\xff", "\xa0"], "\xf0" => ["\x03", "\xff", "\xff", "\xeb"], "\xf1" => ["\x03", "\xff", "\xff", "\xf3", "\x00"], "\xf2" => ["\x03", "\xff", "\xff", "\xec"], "\xf3" => ["\x03", "\xff", "\xff", "\xed"], "\xf4" => ["\x03", "\xff", "\xff", "\xf3", "\x80"], "\xf5" => ["\x03", "\xff", "\xff", "\xf4", "\x00"], "\xf6" => ["\x03", "\xff", "\xff", "\xf4", "\x80"], "\xf7" => ["\x03", "\xff", "\xff", "\xf5", "\x00"], "\xf8" => ["\x03", "\xff", "\xff", "\xf5", "\x80"], "\xf9" => ["\x03", "\xff", "\xff", "\xff", "\x80"], "\xfa" => ["\x03", "\xff", "\xff", "\xf6", "\x00"], "\xfb" => ["\x03", "\xff", "\xff", "\xf6", "\x80"], "\xfc" => ["\x03", "\xff", "\xff", "\xf7", "\x00"], "\xfd" => ["\x03", "\xff", "\xff", "\xf7", "\x80"], "\xfe" => ["\x03", "\xff", "\xff", "\xf8", "\x00"], "\xff" => ["\x03", "\xff", "\xff", "\xee"]], ["\x00" => ["\x01", "\xff", "\x80"], "\x01" => ["\x01", "\xff", "\xff", "`"], "\x02" => ["\x01", "\xff", "\xff", "\xfc", "@"], "\x03" => ["\x01", "\xff", "\xff", "\xfc", "`"], "\x04" => ["\x01", "\xff", "\xff", "\xfc", "\x80"], "\x05" => ["\x01", "\xff", "\xff", "\xfc", "\xa0"], "\x06" => ["\x01", "\xff", "\xff", "\xfc", "\xc0"], "\x07" => ["\x01", "\xff", "\xff", "\xfc", "\xe0"], "\x08" => ["\x01", "\xff", "\xff", "\xfd", "\x00"], "\t" => ["\x01", "\xff", "\xff", "\xd4"], "\n" => ["\x01", "\xff", "\xff", "\xff", "\xe0"], "\v" => ["\x01", "\xff", "\xff", "\xfd", " "], "\f" => ["\x01", "\xff", "\xff", "\xfd", "@"], "\r" => ["\x01", "\xff", "\xff", "\xff", "\xe8"], "\x0e" => ["\x01", "\xff", "\xff", "\xfd", "`"], "\x0f" => ["\x01", "\xff", "\xff", "\xfd", "\x80"], "\x10" => ["\x01", "\xff", "\xff", "\xfd", "\xa0"], "\x11" => ["\x01", "\xff", "\xff", "\xfd", "\xc0"], "\x12" => ["\x01", "\xff", "\xff", "\xfd", "\xe0"], "\x13" => ["\x01", "\xff", "\xff", "\xfe", "\x00"], "\x14" => ["\x01", "\xff", "\xff", "\xfe", " "], "\x15" => ["\x01", "\xff", "\xff", "\xfe", "@"], "\x16" => ["\x01", "\xff", "\xff", "\xff", "\xf0"], "\x17" => ["\x01", "\xff", "\xff", "\xfe", "`"], "\x18" => ["\x01", "\xff", "\xff", "\xfe", "\x80"], "\x19" => ["\x01", "\xff", "\xff", "\xfe", "\xa0"], "\x1a" => ["\x01", "\xff", "\xff", "\xfe", "\xc0"], "\x1b" => ["\x01", "\xff", "\xff", "\xfe", "\xe0"], "\x1c" => ["\x01", "\xff", "\xff", "\xff", "\x00"], "\x1d" => ["\x01", "\xff", "\xff", "\xff", " "], "\x1e" => ["\x01", "\xff", "\xff", "\xff", "@"], "\x1f" => ["\x01", "\xff", "\xff", "\xff", "`"], " " => ["\x00", "\xa0"], "!" => ["\x01", "\xfc", "\x00"], "\"" => ["\x01", "\xfc", "\x80"], "#" => ["\x01", "\xff", "@"], "\$" => ["\x01", "\xff", "\x90"], "%" => ["\x00", "\xa8"], "&" => ["\x01", "\xf0"], "'" => ["\x01", "\xfe", "\x80"], "(" => ["\x01", "\xfd", "\x00"], ")" => ["\x01", "\xfd", "\x80"], "*" => ["\x01", "\xf2"], "+" => ["\x01", "\xfe", "\xc0"], "," => ["\x01", "\xf4"], "-" => ["\x00", "\xb0"], "." => ["\x00", "\xb8"], "/" => ["\x00", "\xc0"], ["\x00", "\x00"], ["\x00", "\x10"], ["\x00", " "], ["\x00", "\xc8"], ["\x00", "\xd0"], ["\x00", "\xd8"], ["\x00", "\xe0"], ["\x00", "\xe8"], ["\x00", "\xf0"], ["\x00", "\xf8"], ":" => ["\x01", "p"], ";" => ["\x01", "\xf6"], "<" => ["\x01", "\xff", "\xf0"], "=" => ["\x01", "\x00"], ">" => ["\x01", "\xff", "`"], "?" => ["\x01", "\xfe", "\x00"], "@" => ["\x01", "\xff", "\xa0"], "A" => ["\x01", "\x08"], "B" => ["\x01", "t"], "C" => ["\x01", "x"], "D" => ["\x01", "|"], "E" => ["\x01", "\x80"], "F" => ["\x01", "\x84"], "G" => ["\x01", "\x88"], "H" => ["\x01", "\x8c"], "I" => ["\x01", "\x90"], "J" => ["\x01", "\x94"], "K" => ["\x01", "\x98"], "L" => ["\x01", "\x9c"], "M" => ["\x01", "\xa0"], "N" => ["\x01", "\xa4"], "O" => ["\x01", "\xa8"], "P" => ["\x01", "\xac"], "Q" => ["\x01", "\xb0"], "R" => ["\x01", "\xb4"], "S" => ["\x01", "\xb8"], "T" => ["\x01", "\xbc"], "U" => ["\x01", "\xc0"], "V" => ["\x01", "\xc4"], "W" => ["\x01", "\xc8"], "X" => ["\x01", "\xf8"], "Y" => ["\x01", "\xcc"], "Z" => ["\x01", "\xfa"], "[" => ["\x01", "\xff", "\xb0"], "\\" => ["\x01", "\xff", "\xfc", "\x00"], "]" => ["\x01", "\xff", "\xc0"], "^" => ["\x01", "\xff", "\xe0"], "_" => ["\x01", "\x10"], "`" => ["\x01", "\xff", "\xf4"], "a" => ["\x00", "0"], "b" => ["\x01", "\x18"], "c" => ["\x00", "@"], "d" => ["\x01", " "], "e" => ["\x00", "P"], "f" => ["\x01", "("], "g" => ["\x01", "0"], "h" => ["\x01", "8"], "i" => ["\x00", "`"], "j" => ["\x01", "\xd0"], "k" => ["\x01", "\xd4"], "l" => ["\x01", "@"], "m" => ["\x01", "H"], "n" => ["\x01", "P"], "o" => ["\x00", "p"], "p" => ["\x01", "X"], "q" => ["\x01", "\xd8"], "r" => ["\x01", "`"], "s" => ["\x00", "\x80"], "t" => ["\x00", "\x90"], "u" => ["\x01", "h"], "v" => ["\x01", "\xdc"], "w" => ["\x01", "\xe0"], "x" => ["\x01", "\xe4"], "y" => ["\x01", "\xe8"], "z" => ["\x01", "\xec"], "{" => ["\x01", "\xff", "\xf8"], "|" => ["\x01", "\xff", "\x00"], "}" => ["\x01", "\xff", "\xe8"], "~" => ["\x01", "\xff", "\xd0"], "" => ["\x01", "\xff", "\xff", "\xff", "\x80"], "\x80" => ["\x01", "\xff", "\xfc", "\xc0"], "\x81" => ["\x01", "\xff", "\xfe", "\x90"], "\x82" => ["\x01", "\xff", "\xfc", "\xe0"], "\x83" => ["\x01", "\xff", "\xfd", "\x00"], "\x84" => ["\x01", "\xff", "\xfe", "\x98"], "\x85" => ["\x01", "\xff", "\xfe", "\xa0"], "\x86" => ["\x01", "\xff", "\xfe", "\xa8"], "\x87" => ["\x01", "\xff", "\xff", "d"], "\x88" => ["\x01", "\xff", "\xfe", "\xb0"], "\x89" => ["\x01", "\xff", "\xff", "h"], "\x8a" => ["\x01", "\xff", "\xff", "l"], "\x8b" => ["\x01", "\xff", "\xff", "p"], "\x8c" => ["\x01", "\xff", "\xff", "t"], "\x8d" => ["\x01", "\xff", "\xff", "x"], "\x8e" => ["\x01", "\xff", "\xff", "\xd6"], "\x8f" => ["\x01", "\xff", "\xff", "|"], "\x90" => ["\x01", "\xff", "\xff", "\xd8"], "\x91" => ["\x01", "\xff", "\xff", "\xda"], "\x92" => ["\x01", "\xff", "\xfe", "\xb8"], "\x93" => ["\x01", "\xff", "\xff", "\x80"], "\x94" => ["\x01", "\xff", "\xff", "\xdc"], "\x95" => ["\x01", "\xff", "\xff", "\x84"], "\x96" => ["\x01", "\xff", "\xff", "\x88"], "\x97" => ["\x01", "\xff", "\xff", "\x8c"], "\x98" => ["\x01", "\xff", "\xff", "\x90"], "\x99" => ["\x01", "\xff", "\xfd", "\xc0"], "\x9a" => ["\x01", "\xff", "\xfe", "\xc0"], "\x9b" => ["\x01", "\xff", "\xff", "\x94"], "\x9c" => ["\x01", "\xff", "\xfe", "\xc8"], "\x9d" => ["\x01", "\xff", "\xff", "\x98"], "\x9e" => ["\x01", "\xff", "\xff", "\x9c"], "\x9f" => ["\x01", "\xff", "\xff", "\xde"], "\xa0" => ["\x01", "\xff", "\xfe", "\xd0"], "\xa1" => ["\x01", "\xff", "\xfd", "\xd0"], "\xa2" => ["\x01", "\xff", "\xfd", " "], "\xa3" => ["\x01", "\xff", "\xfe", "\xd8"], "\xa4" => ["\x01", "\xff", "\xfe", "\xe0"], "\xa5" => ["\x01", "\xff", "\xff", "\xa0"], "\xa6" => ["\x01", "\xff", "\xff", "\xa4"], "\xa7" => ["\x01", "\xff", "\xfd", "\xe0"], "\xa8" => ["\x01", "\xff", "\xff", "\xa8"], "\xa9" => ["\x01", "\xff", "\xfe", "\xe8"], "\xaa" => ["\x01", "\xff", "\xfe", "\xf0"], "\xab" => ["\x01", "\xff", "\xff", "\xe0"], "\xac" => ["\x01", "\xff", "\xfd", "\xf0"], "\xad" => ["\x01", "\xff", "\xfe", "\xf8"], "\xae" => ["\x01", "\xff", "\xff", "\xac"], "\xaf" => ["\x01", "\xff", "\xff", "\xb0"], "\xb0" => ["\x01", "\xff", "\xfe", "\x00"], "\xb1" => ["\x01", "\xff", "\xfe", "\x10"], "\xb2" => ["\x01", "\xff", "\xff", "\x00"], "\xb3" => ["\x01", "\xff", "\xfe", " "], "\xb4" => ["\x01", "\xff", "\xff", "\xb4"], "\xb5" => ["\x01", "\xff", "\xff", "\x08"], "\xb6" => ["\x01", "\xff", "\xff", "\xb8"], "\xb7" => ["\x01", "\xff", "\xff", "\xbc"], "\xb8" => ["\x01", "\xff", "\xfd", "@"], "\xb9" => ["\x01", "\xff", "\xff", "\x10"], "\xba" => ["\x01", "\xff", "\xff", "\x18"], "\xbb" => ["\x01", "\xff", "\xff", " "], "\xbc" => ["\x01", "\xff", "\xff", "\xc0"], "\xbd" => ["\x01", "\xff", "\xff", "("], "\xbe" => ["\x01", "\xff", "\xff", "0"], "\xbf" => ["\x01", "\xff", "\xff", "\xc4"], "\xc0" => ["\x01", "\xff", "\xff", "\xf0", "\x00"], "\xc1" => ["\x01", "\xff", "\xff", "\xf0", "\x80"], "\xc2" => ["\x01", "\xff", "\xfd", "`"], "\xc3" => ["\x01", "\xff", "\xfc", "@"], "\xc4" => ["\x01", "\xff", "\xff", "8"], "\xc5" => ["\x01", "\xff", "\xff", "\xc8"], "\xc6" => ["\x01", "\xff", "\xff", "@"], "\xc7" => ["\x01", "\xff", "\xff", "\xec"], "\xc8" => ["\x01", "\xff", "\xff", "\xf1", "\x00"], "\xc9" => ["\x01", "\xff", "\xff", "\xf1", "\x80"], "\xca" => ["\x01", "\xff", "\xff", "\xf2", "\x00"], "\xcb" => ["\x01", "\xff", "\xff", "\xf7", "\x80"], "\xcc" => ["\x01", "\xff", "\xff", "\xf7", "\xc0"], "\xcd" => ["\x01", "\xff", "\xff", "\xf2", "\x80"], "\xce" => ["\x01", "\xff", "\xff", "\xe2"], "\xcf" => ["\x01", "\xff", "\xff", "\xed"], "\xd0" => ["\x01", "\xff", "\xfc", "\x80"], "\xd1" => ["\x01", "\xff", "\xfe", "0"], "\xd2" => ["\x01", "\xff", "\xff", "\xf3", "\x00"], "\xd3" => ["\x01", "\xff", "\xff", "\xf8", "\x00"], "\xd4" => ["\x01", "\xff", "\xff", "\xf8", "@"], "\xd5" => ["\x01", "\xff", "\xff", "\xf3", "\x80"], "\xd6" => ["\x01", "\xff", "\xff", "\xf8", "\x80"], "\xd7" => ["\x01", "\xff", "\xff", "\xe4"], "\xd8" => ["\x01", "\xff", "\xfe", "@"], "\xd9" => ["\x01", "\xff", "\xfe", "P"], "\xda" => ["\x01", "\xff", "\xff", "\xf4", "\x00"], "\xdb" => ["\x01", "\xff", "\xff", "\xf4", "\x80"], "\xdc" => ["\x01", "\xff", "\xff", "\xff", "\xa0"], "\xdd" => ["\x01", "\xff", "\xff", "\xf8", "\xc0"], "\xde" => ["\x01", "\xff", "\xff", "\xf9", "\x00"], "\xdf" => ["\x01", "\xff", "\xff", "\xf9", "@"], "\xe0" => ["\x01", "\xff", "\xfd", "\x80"], "\xe1" => ["\x01", "\xff", "\xff", "\xe6"], "\xe2" => ["\x01", "\xff", "\xfd", "\xa0"], "\xe3" => ["\x01", "\xff", "\xfe", "`"], "\xe4" => ["\x01", "\xff", "\xff", "H"], "\xe5" => ["\x01", "\xff", "\xfe", "p"], "\xe6" => ["\x01", "\xff", "\xfe", "\x80"], "\xe7" => ["\x01", "\xff", "\xff", "\xcc"], "\xe8" => ["\x01", "\xff", "\xff", "P"], "\xe9" => ["\x01", "\xff", "\xff", "X"], "\xea" => ["\x01", "\xff", "\xff", "\xee"], "\xeb" => ["\x01", "\xff", "\xff", "\xef"], "\xec" => ["\x01", "\xff", "\xff", "\xe8"], "\xed" => ["\x01", "\xff", "\xff", "\xea"], "\xee" => ["\x01", "\xff", "\xff", "\xf5", "\x00"], "\xef" => ["\x01", "\xff", "\xff", "\xd0"], "\xf0" => ["\x01", "\xff", "\xff", "\xf5", "\x80"], "\xf1" => ["\x01", "\xff", "\xff", "\xf9", "\x80"], "\xf2" => ["\x01", "\xff", "\xff", "\xf6", "\x00"], "\xf3" => ["\x01", "\xff", "\xff", "\xf6", "\x80"], "\xf4" => ["\x01", "\xff", "\xff", "\xf9", "\xc0"], "\xf5" => ["\x01", "\xff", "\xff", "\xfa", "\x00"], "\xf6" => ["\x01", "\xff", "\xff", "\xfa", "@"], "\xf7" => ["\x01", "\xff", "\xff", "\xfa", "\x80"], "\xf8" => ["\x01", "\xff", "\xff", "\xfa", "\xc0"], "\xf9" => ["\x01", "\xff", "\xff", "\xff", "\xc0"], "\xfa" => ["\x01", "\xff", "\xff", "\xfb", "\x00"], "\xfb" => ["\x01", "\xff", "\xff", "\xfb", "@"], "\xfc" => ["\x01", "\xff", "\xff", "\xfb", "\x80"], "\xfd" => ["\x01", "\xff", "\xff", "\xfb", "\xc0"], "\xfe" => ["\x01", "\xff", "\xff", "\xfc", "\x00"], "\xff" => ["\x01", "\xff", "\xff", "\xf7", "\x00"]]]; diff --git a/dependencies/amphp/hpack/src/Internal/huffman-lookup.php b/dependencies/amphp/hpack/src/Internal/huffman-lookup.php deleted file mode 100644 index 0e249a5..0000000 --- a/dependencies/amphp/hpack/src/Internal/huffman-lookup.php +++ /dev/null @@ -1,6 +0,0 @@ - [93, "0"], "\x01" => [138, "0"], "\x02" => [75, "0"], "\x03" => [91, "0"], "\x04" => [108, "0"], "\x05" => [103, "0"], "\x06" => [114, "0"], "\x07" => [14, "0"], "\x08" => [93, "1"], "\t" => [138, "1"], "\n" => [75, "1"], "\v" => [91, "1"], "\f" => [108, "1"], "\r" => [103, "1"], "\x0e" => [114, "1"], "\x0f" => [14, "1"], "\x10" => [93, "2"], "\x11" => [138, "2"], "\x12" => [75, "2"], "\x13" => [91, "2"], "\x14" => [108, "2"], "\x15" => [103, "2"], "\x16" => [114, "2"], "\x17" => [14, "2"], "\x18" => [93, "a"], "\x19" => [138, "a"], "\x1a" => [75, "a"], "\x1b" => [91, "a"], "\x1c" => [108, "a"], "\x1d" => [103, "a"], "\x1e" => [114, "a"], "\x1f" => [14, "a"], " " => [93, "c"], "!" => [138, "c"], "\"" => [75, "c"], "#" => [91, "c"], "\$" => [108, "c"], "%" => [103, "c"], "&" => [114, "c"], "'" => [14, "c"], "(" => [93, "e"], ")" => [138, "e"], "*" => [75, "e"], "+" => [91, "e"], "," => [108, "e"], "-" => [103, "e"], "." => [114, "e"], "/" => [14, "e"], [93, "i"], [138, "i"], [75, "i"], [91, "i"], [108, "i"], [103, "i"], [114, "i"], [14, "i"], [93, "o"], [138, "o"], ":" => [75, "o"], ";" => [91, "o"], "<" => [108, "o"], "=" => [103, "o"], ">" => [114, "o"], "?" => [14, "o"], "@" => [93, "s"], "A" => [138, "s"], "B" => [75, "s"], "C" => [91, "s"], "D" => [108, "s"], "E" => [103, "s"], "F" => [114, "s"], "G" => [14, "s"], "H" => [93, "t"], "I" => [138, "t"], "J" => [75, "t"], "K" => [91, "t"], "L" => [108, "t"], "M" => [103, "t"], "N" => [114, "t"], "O" => [14, "t"], "P" => [94, " "], "Q" => [76, " "], "R" => [104, " "], "S" => [16, " "], "T" => [94, "%"], "U" => [76, "%"], "V" => [104, "%"], "W" => [16, "%"], "X" => [94, "-"], "Y" => [76, "-"], "Z" => [104, "-"], "[" => [16, "-"], "\\" => [94, "."], "]" => [76, "."], "^" => [104, "."], "_" => [16, "."], "`" => [94, "/"], "a" => [76, "/"], "b" => [104, "/"], "c" => [16, "/"], "d" => [94, "3"], "e" => [76, "3"], "f" => [104, "3"], "g" => [16, "3"], "h" => [94, "4"], "i" => [76, "4"], "j" => [104, "4"], "k" => [16, "4"], "l" => [94, "5"], "m" => [76, "5"], "n" => [104, "5"], "o" => [16, "5"], "p" => [94, "6"], "q" => [76, "6"], "r" => [104, "6"], "s" => [16, "6"], "t" => [94, "7"], "u" => [76, "7"], "v" => [104, "7"], "w" => [16, "7"], "x" => [94, "8"], "y" => [76, "8"], "z" => [104, "8"], "{" => [16, "8"], "|" => [94, "9"], "}" => [76, "9"], "~" => [104, "9"], "" => [16, "9"], "\x80" => [94, "="], "\x81" => [76, "="], "\x82" => [104, "="], "\x83" => [16, "="], "\x84" => [94, "A"], "\x85" => [76, "A"], "\x86" => [104, "A"], "\x87" => [16, "A"], "\x88" => [94, "_"], "\x89" => [76, "_"], "\x8a" => [104, "_"], "\x8b" => [16, "_"], "\x8c" => [94, "b"], "\x8d" => [76, "b"], "\x8e" => [104, "b"], "\x8f" => [16, "b"], "\x90" => [94, "d"], "\x91" => [76, "d"], "\x92" => [104, "d"], "\x93" => [16, "d"], "\x94" => [94, "f"], "\x95" => [76, "f"], "\x96" => [104, "f"], "\x97" => [16, "f"], "\x98" => [94, "g"], "\x99" => [76, "g"], "\x9a" => [104, "g"], "\x9b" => [16, "g"], "\x9c" => [94, "h"], "\x9d" => [76, "h"], "\x9e" => [104, "h"], "\x9f" => [16, "h"], "\xa0" => [94, "l"], "\xa1" => [76, "l"], "\xa2" => [104, "l"], "\xa3" => [16, "l"], "\xa4" => [94, "m"], "\xa5" => [76, "m"], "\xa6" => [104, "m"], "\xa7" => [16, "m"], "\xa8" => [94, "n"], "\xa9" => [76, "n"], "\xaa" => [104, "n"], "\xab" => [16, "n"], "\xac" => [94, "p"], "\xad" => [76, "p"], "\xae" => [104, "p"], "\xaf" => [16, "p"], "\xb0" => [94, "r"], "\xb1" => [76, "r"], "\xb2" => [104, "r"], "\xb3" => [16, "r"], "\xb4" => [94, "u"], "\xb5" => [76, "u"], "\xb6" => [104, "u"], "\xb7" => [16, "u"], "\xb8" => [77, ":"], "\xb9" => [18, ":"], "\xba" => [77, "B"], "\xbb" => [18, "B"], "\xbc" => [77, "C"], "\xbd" => [18, "C"], "\xbe" => [77, "D"], "\xbf" => [18, "D"], "\xc0" => [77, "E"], "\xc1" => [18, "E"], "\xc2" => [77, "F"], "\xc3" => [18, "F"], "\xc4" => [77, "G"], "\xc5" => [18, "G"], "\xc6" => [77, "H"], "\xc7" => [18, "H"], "\xc8" => [77, "I"], "\xc9" => [18, "I"], "\xca" => [77, "J"], "\xcb" => [18, "J"], "\xcc" => [77, "K"], "\xcd" => [18, "K"], "\xce" => [77, "L"], "\xcf" => [18, "L"], "\xd0" => [77, "M"], "\xd1" => [18, "M"], "\xd2" => [77, "N"], "\xd3" => [18, "N"], "\xd4" => [77, "O"], "\xd5" => [18, "O"], "\xd6" => [77, "P"], "\xd7" => [18, "P"], "\xd8" => [77, "Q"], "\xd9" => [18, "Q"], "\xda" => [77, "R"], "\xdb" => [18, "R"], "\xdc" => [77, "S"], "\xdd" => [18, "S"], "\xde" => [77, "T"], "\xdf" => [18, "T"], "\xe0" => [77, "U"], "\xe1" => [18, "U"], "\xe2" => [77, "V"], "\xe3" => [18, "V"], "\xe4" => [77, "W"], "\xe5" => [18, "W"], "\xe6" => [77, "Y"], "\xe7" => [18, "Y"], "\xe8" => [77, "j"], "\xe9" => [18, "j"], "\xea" => [77, "k"], "\xeb" => [18, "k"], "\xec" => [77, "q"], "\xed" => [18, "q"], "\xee" => [77, "v"], "\xef" => [18, "v"], "\xf0" => [77, "w"], "\xf1" => [18, "w"], "\xf2" => [77, "x"], "\xf3" => [18, "x"], "\xf4" => [77, "y"], "\xf5" => [18, "y"], "\xf6" => [77, "z"], "\xf7" => [18, "z"], "\xf8" => [0, "&"], "\xf9" => [0, "*"], "\xfa" => [0, ","], "\xfb" => [0, ";"], "\xfc" => [0, "X"], "\xfd" => [0, "Z"], "\xfe" => [78, null], "\xff" => [8, null]], 8 => ["\x00" => [77, "?0"], "\x01" => [18, "?0"], "\x02" => [77, "?1"], "\x03" => [18, "?1"], "\x04" => [77, "?2"], "\x05" => [18, "?2"], "\x06" => [77, "?a"], "\x07" => [18, "?a"], "\x08" => [77, "?c"], "\t" => [18, "?c"], "\n" => [77, "?e"], "\v" => [18, "?e"], "\f" => [77, "?i"], "\r" => [18, "?i"], "\x0e" => [77, "?o"], "\x0f" => [18, "?o"], "\x10" => [77, "?s"], "\x11" => [18, "?s"], "\x12" => [77, "?t"], "\x13" => [18, "?t"], "\x14" => [0, "? "], "\x15" => [0, "?%"], "\x16" => [0, "?-"], "\x17" => [0, "?."], "\x18" => [0, "?/"], "\x19" => [0, "?3"], "\x1a" => [0, "?4"], "\x1b" => [0, "?5"], "\x1c" => [0, "?6"], "\x1d" => [0, "?7"], "\x1e" => [0, "?8"], "\x1f" => [0, "?9"], " " => [0, "?="], "!" => [0, "?A"], "\"" => [0, "?_"], "#" => [0, "?b"], "\$" => [0, "?d"], "%" => [0, "?f"], "&" => [0, "?g"], "'" => [0, "?h"], "(" => [0, "?l"], ")" => [0, "?m"], "*" => [0, "?n"], "+" => [0, "?p"], "," => [0, "?r"], "-" => [0, "?u"], "." => [100, "?"], "/" => [110, "?"], [111, "?"], [115, "?"], [116, "?"], [118, "?"], [119, "?"], [122, "?"], [123, "?"], [125, "?"], [126, "?"], [129, "?"], ":" => [143, "?"], ";" => [148, "?"], "<" => [151, "?"], "=" => [153, "?"], ">" => [83, "?"], "?" => [10, "?"], "@" => [0, "'0"], "A" => [0, "'1"], "B" => [0, "'2"], "C" => [0, "'a"], "D" => [0, "'c"], "E" => [0, "'e"], "F" => [0, "'i"], "G" => [0, "'o"], "H" => [0, "'s"], "I" => [0, "'t"], "J" => [73, "'"], "K" => [88, "'"], "L" => [89, "'"], "M" => [96, "'"], "N" => [97, "'"], "O" => [99, "'"], "P" => [106, "'"], "Q" => [136, "'"], "R" => [139, "'"], "S" => [141, "'"], "T" => [145, "'"], "U" => [147, "'"], "V" => [149, "'"], "W" => [101, "'"], "X" => [112, "'"], "Y" => [117, "'"], "Z" => [120, "'"], "[" => [124, "'"], "\\" => [127, "'"], "]" => [144, "'"], "^" => [152, "'"], "_" => [11, "'"], "`" => [0, "+0"], "a" => [0, "+1"], "b" => [0, "+2"], "c" => [0, "+a"], "d" => [0, "+c"], "e" => [0, "+e"], "f" => [0, "+i"], "g" => [0, "+o"], "h" => [0, "+s"], "i" => [0, "+t"], "j" => [73, "+"], "k" => [88, "+"], "l" => [89, "+"], "m" => [96, "+"], "n" => [97, "+"], "o" => [99, "+"], "p" => [106, "+"], "q" => [136, "+"], "r" => [139, "+"], "s" => [141, "+"], "t" => [145, "+"], "u" => [147, "+"], "v" => [149, "+"], "w" => [101, "+"], "x" => [112, "+"], "y" => [117, "+"], "z" => [120, "+"], "{" => [124, "+"], "|" => [127, "+"], "}" => [144, "+"], "~" => [152, "+"], "" => [11, "+"], "\x80" => [0, "|0"], "\x81" => [0, "|1"], "\x82" => [0, "|2"], "\x83" => [0, "|a"], "\x84" => [0, "|c"], "\x85" => [0, "|e"], "\x86" => [0, "|i"], "\x87" => [0, "|o"], "\x88" => [0, "|s"], "\x89" => [0, "|t"], "\x8a" => [73, "|"], "\x8b" => [88, "|"], "\x8c" => [89, "|"], "\x8d" => [96, "|"], "\x8e" => [97, "|"], "\x8f" => [99, "|"], "\x90" => [106, "|"], "\x91" => [136, "|"], "\x92" => [139, "|"], "\x93" => [141, "|"], "\x94" => [145, "|"], "\x95" => [147, "|"], "\x96" => [149, "|"], "\x97" => [101, "|"], "\x98" => [112, "|"], "\x99" => [117, "|"], "\x9a" => [120, "|"], "\x9b" => [124, "|"], "\x9c" => [127, "|"], "\x9d" => [144, "|"], "\x9e" => [152, "|"], "\x9f" => [11, "|"], "\xa0" => [92, "#"], "\xa1" => [95, "#"], "\xa2" => [137, "#"], "\xa3" => [142, "#"], "\xa4" => [150, "#"], "\xa5" => [74, "#"], "\xa6" => [90, "#"], "\xa7" => [98, "#"], "\xa8" => [107, "#"], "\xa9" => [140, "#"], "\xaa" => [146, "#"], "\xab" => [102, "#"], "\xac" => [113, "#"], "\xad" => [121, "#"], "\xae" => [128, "#"], "\xaf" => [12, "#"], "\xb0" => [92, ">"], "\xb1" => [95, ">"], "\xb2" => [137, ">"], "\xb3" => [142, ">"], "\xb4" => [150, ">"], "\xb5" => [74, ">"], "\xb6" => [90, ">"], "\xb7" => [98, ">"], "\xb8" => [107, ">"], "\xb9" => [140, ">"], "\xba" => [146, ">"], "\xbb" => [102, ">"], "\xbc" => [113, ">"], "\xbd" => [121, ">"], "\xbe" => [128, ">"], "\xbf" => [12, ">"], "\xc0" => [93, "\x00"], "\xc1" => [138, "\x00"], "\xc2" => [75, "\x00"], "\xc3" => [91, "\x00"], "\xc4" => [108, "\x00"], "\xc5" => [103, "\x00"], "\xc6" => [114, "\x00"], "\xc7" => [14, "\x00"], "\xc8" => [93, "\$"], "\xc9" => [138, "\$"], "\xca" => [75, "\$"], "\xcb" => [91, "\$"], "\xcc" => [108, "\$"], "\xcd" => [103, "\$"], "\xce" => [114, "\$"], "\xcf" => [14, "\$"], "\xd0" => [93, "@"], "\xd1" => [138, "@"], "\xd2" => [75, "@"], "\xd3" => [91, "@"], "\xd4" => [108, "@"], "\xd5" => [103, "@"], "\xd6" => [114, "@"], "\xd7" => [14, "@"], "\xd8" => [93, "["], "\xd9" => [138, "["], "\xda" => [75, "["], "\xdb" => [91, "["], "\xdc" => [108, "["], "\xdd" => [103, "["], "\xde" => [114, "["], "\xdf" => [14, "["], "\xe0" => [93, "]"], "\xe1" => [138, "]"], "\xe2" => [75, "]"], "\xe3" => [91, "]"], "\xe4" => [108, "]"], "\xe5" => [103, "]"], "\xe6" => [114, "]"], "\xe7" => [14, "]"], "\xe8" => [93, "~"], "\xe9" => [138, "~"], "\xea" => [75, "~"], "\xeb" => [91, "~"], "\xec" => [108, "~"], "\xed" => [103, "~"], "\xee" => [114, "~"], "\xef" => [14, "~"], "\xf0" => [94, "^"], "\xf1" => [76, "^"], "\xf2" => [104, "^"], "\xf3" => [16, "^"], "\xf4" => [94, "}"], "\xf5" => [76, "}"], "\xf6" => [104, "}"], "\xf7" => [16, "}"], "\xf8" => [77, "<"], "\xf9" => [18, "<"], "\xfa" => [77, "`"], "\xfb" => [18, "`"], "\xfc" => [77, "{"], "\xfd" => [18, "{"], "\xfe" => [131, null], "\xff" => [20, null]], ["\x00" => [0, "!0"], "\x01" => [0, "!1"], "\x02" => [0, "!2"], "\x03" => [0, "!a"], "\x04" => [0, "!c"], "\x05" => [0, "!e"], "\x06" => [0, "!i"], "\x07" => [0, "!o"], "\x08" => [0, "!s"], "\t" => [0, "!t"], "\n" => [73, "!"], "\v" => [88, "!"], "\f" => [89, "!"], "\r" => [96, "!"], "\x0e" => [97, "!"], "\x0f" => [99, "!"], "\x10" => [106, "!"], "\x11" => [136, "!"], "\x12" => [139, "!"], "\x13" => [141, "!"], "\x14" => [145, "!"], "\x15" => [147, "!"], "\x16" => [149, "!"], "\x17" => [101, "!"], "\x18" => [112, "!"], "\x19" => [117, "!"], "\x1a" => [120, "!"], "\x1b" => [124, "!"], "\x1c" => [127, "!"], "\x1d" => [144, "!"], "\x1e" => [152, "!"], "\x1f" => [11, "!"], " " => [0, "\"0"], "!" => [0, "\"1"], "\"" => [0, "\"2"], "#" => [0, "\"a"], "\$" => [0, "\"c"], "%" => [0, "\"e"], "&" => [0, "\"i"], "'" => [0, "\"o"], "(" => [0, "\"s"], ")" => [0, "\"t"], "*" => [73, "\""], "+" => [88, "\""], "," => [89, "\""], "-" => [96, "\""], "." => [97, "\""], "/" => [99, "\""], [106, "\""], [136, "\""], [139, "\""], [141, "\""], [145, "\""], [147, "\""], [149, "\""], [101, "\""], [112, "\""], [117, "\""], ":" => [120, "\""], ";" => [124, "\""], "<" => [127, "\""], "=" => [144, "\""], ">" => [152, "\""], "?" => [11, "\""], "@" => [0, "(0"], "A" => [0, "(1"], "B" => [0, "(2"], "C" => [0, "(a"], "D" => [0, "(c"], "E" => [0, "(e"], "F" => [0, "(i"], "G" => [0, "(o"], "H" => [0, "(s"], "I" => [0, "(t"], "J" => [73, "("], "K" => [88, "("], "L" => [89, "("], "M" => [96, "("], "N" => [97, "("], "O" => [99, "("], "P" => [106, "("], "Q" => [136, "("], "R" => [139, "("], "S" => [141, "("], "T" => [145, "("], "U" => [147, "("], "V" => [149, "("], "W" => [101, "("], "X" => [112, "("], "Y" => [117, "("], "Z" => [120, "("], "[" => [124, "("], "\\" => [127, "("], "]" => [144, "("], "^" => [152, "("], "_" => [11, "("], "`" => [0, ")0"], "a" => [0, ")1"], "b" => [0, ")2"], "c" => [0, ")a"], "d" => [0, ")c"], "e" => [0, ")e"], "f" => [0, ")i"], "g" => [0, ")o"], "h" => [0, ")s"], "i" => [0, ")t"], "j" => [73, ")"], "k" => [88, ")"], "l" => [89, ")"], "m" => [96, ")"], "n" => [97, ")"], "o" => [99, ")"], "p" => [106, ")"], "q" => [136, ")"], "r" => [139, ")"], "s" => [141, ")"], "t" => [145, ")"], "u" => [147, ")"], "v" => [149, ")"], "w" => [101, ")"], "x" => [112, ")"], "y" => [117, ")"], "z" => [120, ")"], "{" => [124, ")"], "|" => [127, ")"], "}" => [144, ")"], "~" => [152, ")"], "" => [11, ")"], "\x80" => [0, "?0"], "\x81" => [0, "?1"], "\x82" => [0, "?2"], "\x83" => [0, "?a"], "\x84" => [0, "?c"], "\x85" => [0, "?e"], "\x86" => [0, "?i"], "\x87" => [0, "?o"], "\x88" => [0, "?s"], "\x89" => [0, "?t"], "\x8a" => [73, "?"], "\x8b" => [88, "?"], "\x8c" => [89, "?"], "\x8d" => [96, "?"], "\x8e" => [97, "?"], "\x8f" => [99, "?"], "\x90" => [106, "?"], "\x91" => [136, "?"], "\x92" => [139, "?"], "\x93" => [141, "?"], "\x94" => [145, "?"], "\x95" => [147, "?"], "\x96" => [149, "?"], "\x97" => [101, "?"], "\x98" => [112, "?"], "\x99" => [117, "?"], "\x9a" => [120, "?"], "\x9b" => [124, "?"], "\x9c" => [127, "?"], "\x9d" => [144, "?"], "\x9e" => [152, "?"], "\x9f" => [11, "?"], "\xa0" => [92, "'"], "\xa1" => [95, "'"], "\xa2" => [137, "'"], "\xa3" => [142, "'"], "\xa4" => [150, "'"], "\xa5" => [74, "'"], "\xa6" => [90, "'"], "\xa7" => [98, "'"], "\xa8" => [107, "'"], "\xa9" => [140, "'"], "\xaa" => [146, "'"], "\xab" => [102, "'"], "\xac" => [113, "'"], "\xad" => [121, "'"], "\xae" => [128, "'"], "\xaf" => [12, "'"], "\xb0" => [92, "+"], "\xb1" => [95, "+"], "\xb2" => [137, "+"], "\xb3" => [142, "+"], "\xb4" => [150, "+"], "\xb5" => [74, "+"], "\xb6" => [90, "+"], "\xb7" => [98, "+"], "\xb8" => [107, "+"], "\xb9" => [140, "+"], "\xba" => [146, "+"], "\xbb" => [102, "+"], "\xbc" => [113, "+"], "\xbd" => [121, "+"], "\xbe" => [128, "+"], "\xbf" => [12, "+"], "\xc0" => [92, "|"], "\xc1" => [95, "|"], "\xc2" => [137, "|"], "\xc3" => [142, "|"], "\xc4" => [150, "|"], "\xc5" => [74, "|"], "\xc6" => [90, "|"], "\xc7" => [98, "|"], "\xc8" => [107, "|"], "\xc9" => [140, "|"], "\xca" => [146, "|"], "\xcb" => [102, "|"], "\xcc" => [113, "|"], "\xcd" => [121, "|"], "\xce" => [128, "|"], "\xcf" => [12, "|"], "\xd0" => [93, "#"], "\xd1" => [138, "#"], "\xd2" => [75, "#"], "\xd3" => [91, "#"], "\xd4" => [108, "#"], "\xd5" => [103, "#"], "\xd6" => [114, "#"], "\xd7" => [14, "#"], "\xd8" => [93, ">"], "\xd9" => [138, ">"], "\xda" => [75, ">"], "\xdb" => [91, ">"], "\xdc" => [108, ">"], "\xdd" => [103, ">"], "\xde" => [114, ">"], "\xdf" => [14, ">"], "\xe0" => [94, "\x00"], "\xe1" => [76, "\x00"], "\xe2" => [104, "\x00"], "\xe3" => [16, "\x00"], "\xe4" => [94, "\$"], "\xe5" => [76, "\$"], "\xe6" => [104, "\$"], "\xe7" => [16, "\$"], "\xe8" => [94, "@"], "\xe9" => [76, "@"], "\xea" => [104, "@"], "\xeb" => [16, "@"], "\xec" => [94, "["], "\xed" => [76, "["], "\xee" => [104, "["], "\xef" => [16, "["], "\xf0" => [94, "]"], "\xf1" => [76, "]"], "\xf2" => [104, "]"], "\xf3" => [16, "]"], "\xf4" => [94, "~"], "\xf5" => [76, "~"], "\xf6" => [104, "~"], "\xf7" => [16, "~"], "\xf8" => [77, "^"], "\xf9" => [18, "^"], "\xfa" => [77, "}"], "\xfb" => [18, "}"], "\xfc" => [0, "<"], "\xfd" => [0, "`"], "\xfe" => [0, "{"], "\xff" => [21, null]], ["\x00" => [77, "X0"], "\x01" => [18, "X0"], "\x02" => [77, "X1"], "\x03" => [18, "X1"], "\x04" => [77, "X2"], "\x05" => [18, "X2"], "\x06" => [77, "Xa"], "\x07" => [18, "Xa"], "\x08" => [77, "Xc"], "\t" => [18, "Xc"], "\n" => [77, "Xe"], "\v" => [18, "Xe"], "\f" => [77, "Xi"], "\r" => [18, "Xi"], "\x0e" => [77, "Xo"], "\x0f" => [18, "Xo"], "\x10" => [77, "Xs"], "\x11" => [18, "Xs"], "\x12" => [77, "Xt"], "\x13" => [18, "Xt"], "\x14" => [0, "X "], "\x15" => [0, "X%"], "\x16" => [0, "X-"], "\x17" => [0, "X."], "\x18" => [0, "X/"], "\x19" => [0, "X3"], "\x1a" => [0, "X4"], "\x1b" => [0, "X5"], "\x1c" => [0, "X6"], "\x1d" => [0, "X7"], "\x1e" => [0, "X8"], "\x1f" => [0, "X9"], " " => [0, "X="], "!" => [0, "XA"], "\"" => [0, "X_"], "#" => [0, "Xb"], "\$" => [0, "Xd"], "%" => [0, "Xf"], "&" => [0, "Xg"], "'" => [0, "Xh"], "(" => [0, "Xl"], ")" => [0, "Xm"], "*" => [0, "Xn"], "+" => [0, "Xp"], "," => [0, "Xr"], "-" => [0, "Xu"], "." => [100, "X"], "/" => [110, "X"], [111, "X"], [115, "X"], [116, "X"], [118, "X"], [119, "X"], [122, "X"], [123, "X"], [125, "X"], [126, "X"], [129, "X"], ":" => [143, "X"], ";" => [148, "X"], "<" => [151, "X"], "=" => [153, "X"], ">" => [83, "X"], "?" => [10, "X"], "@" => [77, "Z0"], "A" => [18, "Z0"], "B" => [77, "Z1"], "C" => [18, "Z1"], "D" => [77, "Z2"], "E" => [18, "Z2"], "F" => [77, "Za"], "G" => [18, "Za"], "H" => [77, "Zc"], "I" => [18, "Zc"], "J" => [77, "Ze"], "K" => [18, "Ze"], "L" => [77, "Zi"], "M" => [18, "Zi"], "N" => [77, "Zo"], "O" => [18, "Zo"], "P" => [77, "Zs"], "Q" => [18, "Zs"], "R" => [77, "Zt"], "S" => [18, "Zt"], "T" => [0, "Z "], "U" => [0, "Z%"], "V" => [0, "Z-"], "W" => [0, "Z."], "X" => [0, "Z/"], "Y" => [0, "Z3"], "Z" => [0, "Z4"], "[" => [0, "Z5"], "\\" => [0, "Z6"], "]" => [0, "Z7"], "^" => [0, "Z8"], "_" => [0, "Z9"], "`" => [0, "Z="], "a" => [0, "ZA"], "b" => [0, "Z_"], "c" => [0, "Zb"], "d" => [0, "Zd"], "e" => [0, "Zf"], "f" => [0, "Zg"], "g" => [0, "Zh"], "h" => [0, "Zl"], "i" => [0, "Zm"], "j" => [0, "Zn"], "k" => [0, "Zp"], "l" => [0, "Zr"], "m" => [0, "Zu"], "n" => [100, "Z"], "o" => [110, "Z"], "p" => [111, "Z"], "q" => [115, "Z"], "r" => [116, "Z"], "s" => [118, "Z"], "t" => [119, "Z"], "u" => [122, "Z"], "v" => [123, "Z"], "w" => [125, "Z"], "x" => [126, "Z"], "y" => [129, "Z"], "z" => [143, "Z"], "{" => [148, "Z"], "|" => [151, "Z"], "}" => [153, "Z"], "~" => [83, "Z"], "" => [10, "Z"], "\x80" => [92, "!"], "\x81" => [95, "!"], "\x82" => [137, "!"], "\x83" => [142, "!"], "\x84" => [150, "!"], "\x85" => [74, "!"], "\x86" => [90, "!"], "\x87" => [98, "!"], "\x88" => [107, "!"], "\x89" => [140, "!"], "\x8a" => [146, "!"], "\x8b" => [102, "!"], "\x8c" => [113, "!"], "\x8d" => [121, "!"], "\x8e" => [128, "!"], "\x8f" => [12, "!"], "\x90" => [92, "\""], "\x91" => [95, "\""], "\x92" => [137, "\""], "\x93" => [142, "\""], "\x94" => [150, "\""], "\x95" => [74, "\""], "\x96" => [90, "\""], "\x97" => [98, "\""], "\x98" => [107, "\""], "\x99" => [140, "\""], "\x9a" => [146, "\""], "\x9b" => [102, "\""], "\x9c" => [113, "\""], "\x9d" => [121, "\""], "\x9e" => [128, "\""], "\x9f" => [12, "\""], "\xa0" => [92, "("], "\xa1" => [95, "("], "\xa2" => [137, "("], "\xa3" => [142, "("], "\xa4" => [150, "("], "\xa5" => [74, "("], "\xa6" => [90, "("], "\xa7" => [98, "("], "\xa8" => [107, "("], "\xa9" => [140, "("], "\xaa" => [146, "("], "\xab" => [102, "("], "\xac" => [113, "("], "\xad" => [121, "("], "\xae" => [128, "("], "\xaf" => [12, "("], "\xb0" => [92, ")"], "\xb1" => [95, ")"], "\xb2" => [137, ")"], "\xb3" => [142, ")"], "\xb4" => [150, ")"], "\xb5" => [74, ")"], "\xb6" => [90, ")"], "\xb7" => [98, ")"], "\xb8" => [107, ")"], "\xb9" => [140, ")"], "\xba" => [146, ")"], "\xbb" => [102, ")"], "\xbc" => [113, ")"], "\xbd" => [121, ")"], "\xbe" => [128, ")"], "\xbf" => [12, ")"], "\xc0" => [92, "?"], "\xc1" => [95, "?"], "\xc2" => [137, "?"], "\xc3" => [142, "?"], "\xc4" => [150, "?"], "\xc5" => [74, "?"], "\xc6" => [90, "?"], "\xc7" => [98, "?"], "\xc8" => [107, "?"], "\xc9" => [140, "?"], "\xca" => [146, "?"], "\xcb" => [102, "?"], "\xcc" => [113, "?"], "\xcd" => [121, "?"], "\xce" => [128, "?"], "\xcf" => [12, "?"], "\xd0" => [93, "'"], "\xd1" => [138, "'"], "\xd2" => [75, "'"], "\xd3" => [91, "'"], "\xd4" => [108, "'"], "\xd5" => [103, "'"], "\xd6" => [114, "'"], "\xd7" => [14, "'"], "\xd8" => [93, "+"], "\xd9" => [138, "+"], "\xda" => [75, "+"], "\xdb" => [91, "+"], "\xdc" => [108, "+"], "\xdd" => [103, "+"], "\xde" => [114, "+"], "\xdf" => [14, "+"], "\xe0" => [93, "|"], "\xe1" => [138, "|"], "\xe2" => [75, "|"], "\xe3" => [91, "|"], "\xe4" => [108, "|"], "\xe5" => [103, "|"], "\xe6" => [114, "|"], "\xe7" => [14, "|"], "\xe8" => [94, "#"], "\xe9" => [76, "#"], "\xea" => [104, "#"], "\xeb" => [16, "#"], "\xec" => [94, ">"], "\xed" => [76, ">"], "\xee" => [104, ">"], "\xef" => [16, ">"], "\xf0" => [77, "\x00"], "\xf1" => [18, "\x00"], "\xf2" => [77, "\$"], "\xf3" => [18, "\$"], "\xf4" => [77, "@"], "\xf5" => [18, "@"], "\xf6" => [77, "["], "\xf7" => [18, "["], "\xf8" => [77, "]"], "\xf9" => [18, "]"], "\xfa" => [77, "~"], "\xfb" => [18, "~"], "\xfc" => [0, "^"], "\xfd" => [0, "}"], "\xfe" => [105, null], "\xff" => [22, null]], ["\x00" => [0, "&0"], "\x01" => [0, "&1"], "\x02" => [0, "&2"], "\x03" => [0, "&a"], "\x04" => [0, "&c"], "\x05" => [0, "&e"], "\x06" => [0, "&i"], "\x07" => [0, "&o"], "\x08" => [0, "&s"], "\t" => [0, "&t"], "\n" => [73, "&"], "\v" => [88, "&"], "\f" => [89, "&"], "\r" => [96, "&"], "\x0e" => [97, "&"], "\x0f" => [99, "&"], "\x10" => [106, "&"], "\x11" => [136, "&"], "\x12" => [139, "&"], "\x13" => [141, "&"], "\x14" => [145, "&"], "\x15" => [147, "&"], "\x16" => [149, "&"], "\x17" => [101, "&"], "\x18" => [112, "&"], "\x19" => [117, "&"], "\x1a" => [120, "&"], "\x1b" => [124, "&"], "\x1c" => [127, "&"], "\x1d" => [144, "&"], "\x1e" => [152, "&"], "\x1f" => [11, "&"], " " => [0, "*0"], "!" => [0, "*1"], "\"" => [0, "*2"], "#" => [0, "*a"], "\$" => [0, "*c"], "%" => [0, "*e"], "&" => [0, "*i"], "'" => [0, "*o"], "(" => [0, "*s"], ")" => [0, "*t"], "*" => [73, "*"], "+" => [88, "*"], "," => [89, "*"], "-" => [96, "*"], "." => [97, "*"], "/" => [99, "*"], [106, "*"], [136, "*"], [139, "*"], [141, "*"], [145, "*"], [147, "*"], [149, "*"], [101, "*"], [112, "*"], [117, "*"], ":" => [120, "*"], ";" => [124, "*"], "<" => [127, "*"], "=" => [144, "*"], ">" => [152, "*"], "?" => [11, "*"], "@" => [0, ",0"], "A" => [0, ",1"], "B" => [0, ",2"], "C" => [0, ",a"], "D" => [0, ",c"], "E" => [0, ",e"], "F" => [0, ",i"], "G" => [0, ",o"], "H" => [0, ",s"], "I" => [0, ",t"], "J" => [73, ","], "K" => [88, ","], "L" => [89, ","], "M" => [96, ","], "N" => [97, ","], "O" => [99, ","], "P" => [106, ","], "Q" => [136, ","], "R" => [139, ","], "S" => [141, ","], "T" => [145, ","], "U" => [147, ","], "V" => [149, ","], "W" => [101, ","], "X" => [112, ","], "Y" => [117, ","], "Z" => [120, ","], "[" => [124, ","], "\\" => [127, ","], "]" => [144, ","], "^" => [152, ","], "_" => [11, ","], "`" => [0, ";0"], "a" => [0, ";1"], "b" => [0, ";2"], "c" => [0, ";a"], "d" => [0, ";c"], "e" => [0, ";e"], "f" => [0, ";i"], "g" => [0, ";o"], "h" => [0, ";s"], "i" => [0, ";t"], "j" => [73, ";"], "k" => [88, ";"], "l" => [89, ";"], "m" => [96, ";"], "n" => [97, ";"], "o" => [99, ";"], "p" => [106, ";"], "q" => [136, ";"], "r" => [139, ";"], "s" => [141, ";"], "t" => [145, ";"], "u" => [147, ";"], "v" => [149, ";"], "w" => [101, ";"], "x" => [112, ";"], "y" => [117, ";"], "z" => [120, ";"], "{" => [124, ";"], "|" => [127, ";"], "}" => [144, ";"], "~" => [152, ";"], "" => [11, ";"], "\x80" => [0, "X0"], "\x81" => [0, "X1"], "\x82" => [0, "X2"], "\x83" => [0, "Xa"], "\x84" => [0, "Xc"], "\x85" => [0, "Xe"], "\x86" => [0, "Xi"], "\x87" => [0, "Xo"], "\x88" => [0, "Xs"], "\x89" => [0, "Xt"], "\x8a" => [73, "X"], "\x8b" => [88, "X"], "\x8c" => [89, "X"], "\x8d" => [96, "X"], "\x8e" => [97, "X"], "\x8f" => [99, "X"], "\x90" => [106, "X"], "\x91" => [136, "X"], "\x92" => [139, "X"], "\x93" => [141, "X"], "\x94" => [145, "X"], "\x95" => [147, "X"], "\x96" => [149, "X"], "\x97" => [101, "X"], "\x98" => [112, "X"], "\x99" => [117, "X"], "\x9a" => [120, "X"], "\x9b" => [124, "X"], "\x9c" => [127, "X"], "\x9d" => [144, "X"], "\x9e" => [152, "X"], "\x9f" => [11, "X"], "\xa0" => [0, "Z0"], "\xa1" => [0, "Z1"], "\xa2" => [0, "Z2"], "\xa3" => [0, "Za"], "\xa4" => [0, "Zc"], "\xa5" => [0, "Ze"], "\xa6" => [0, "Zi"], "\xa7" => [0, "Zo"], "\xa8" => [0, "Zs"], "\xa9" => [0, "Zt"], "\xaa" => [73, "Z"], "\xab" => [88, "Z"], "\xac" => [89, "Z"], "\xad" => [96, "Z"], "\xae" => [97, "Z"], "\xaf" => [99, "Z"], "\xb0" => [106, "Z"], "\xb1" => [136, "Z"], "\xb2" => [139, "Z"], "\xb3" => [141, "Z"], "\xb4" => [145, "Z"], "\xb5" => [147, "Z"], "\xb6" => [149, "Z"], "\xb7" => [101, "Z"], "\xb8" => [112, "Z"], "\xb9" => [117, "Z"], "\xba" => [120, "Z"], "\xbb" => [124, "Z"], "\xbc" => [127, "Z"], "\xbd" => [144, "Z"], "\xbe" => [152, "Z"], "\xbf" => [11, "Z"], "\xc0" => [93, "!"], "\xc1" => [138, "!"], "\xc2" => [75, "!"], "\xc3" => [91, "!"], "\xc4" => [108, "!"], "\xc5" => [103, "!"], "\xc6" => [114, "!"], "\xc7" => [14, "!"], "\xc8" => [93, "\""], "\xc9" => [138, "\""], "\xca" => [75, "\""], "\xcb" => [91, "\""], "\xcc" => [108, "\""], "\xcd" => [103, "\""], "\xce" => [114, "\""], "\xcf" => [14, "\""], "\xd0" => [93, "("], "\xd1" => [138, "("], "\xd2" => [75, "("], "\xd3" => [91, "("], "\xd4" => [108, "("], "\xd5" => [103, "("], "\xd6" => [114, "("], "\xd7" => [14, "("], "\xd8" => [93, ")"], "\xd9" => [138, ")"], "\xda" => [75, ")"], "\xdb" => [91, ")"], "\xdc" => [108, ")"], "\xdd" => [103, ")"], "\xde" => [114, ")"], "\xdf" => [14, ")"], "\xe0" => [93, "?"], "\xe1" => [138, "?"], "\xe2" => [75, "?"], "\xe3" => [91, "?"], "\xe4" => [108, "?"], "\xe5" => [103, "?"], "\xe6" => [114, "?"], "\xe7" => [14, "?"], "\xe8" => [94, "'"], "\xe9" => [76, "'"], "\xea" => [104, "'"], "\xeb" => [16, "'"], "\xec" => [94, "+"], "\xed" => [76, "+"], "\xee" => [104, "+"], "\xef" => [16, "+"], "\xf0" => [94, "|"], "\xf1" => [76, "|"], "\xf2" => [104, "|"], "\xf3" => [16, "|"], "\xf4" => [77, "#"], "\xf5" => [18, "#"], "\xf6" => [77, ">"], "\xf7" => [18, ">"], "\xf8" => [0, "\x00"], "\xf9" => [0, "\$"], "\xfa" => [0, "@"], "\xfb" => [0, "["], "\xfc" => [0, "]"], "\xfd" => [0, "~"], "\xfe" => [135, null], "\xff" => [24, null]], ["\x00" => [0, "w0"], "\x01" => [0, "w1"], "\x02" => [0, "w2"], "\x03" => [0, "wa"], "\x04" => [0, "wc"], "\x05" => [0, "we"], "\x06" => [0, "wi"], "\x07" => [0, "wo"], "\x08" => [0, "ws"], "\t" => [0, "wt"], "\n" => [73, "w"], "\v" => [88, "w"], "\f" => [89, "w"], "\r" => [96, "w"], "\x0e" => [97, "w"], "\x0f" => [99, "w"], "\x10" => [106, "w"], "\x11" => [136, "w"], "\x12" => [139, "w"], "\x13" => [141, "w"], "\x14" => [145, "w"], "\x15" => [147, "w"], "\x16" => [149, "w"], "\x17" => [101, "w"], "\x18" => [112, "w"], "\x19" => [117, "w"], "\x1a" => [120, "w"], "\x1b" => [124, "w"], "\x1c" => [127, "w"], "\x1d" => [144, "w"], "\x1e" => [152, "w"], "\x1f" => [11, "w"], " " => [0, "x0"], "!" => [0, "x1"], "\"" => [0, "x2"], "#" => [0, "xa"], "\$" => [0, "xc"], "%" => [0, "xe"], "&" => [0, "xi"], "'" => [0, "xo"], "(" => [0, "xs"], ")" => [0, "xt"], "*" => [73, "x"], "+" => [88, "x"], "," => [89, "x"], "-" => [96, "x"], "." => [97, "x"], "/" => [99, "x"], [106, "x"], [136, "x"], [139, "x"], [141, "x"], [145, "x"], [147, "x"], [149, "x"], [101, "x"], [112, "x"], [117, "x"], ":" => [120, "x"], ";" => [124, "x"], "<" => [127, "x"], "=" => [144, "x"], ">" => [152, "x"], "?" => [11, "x"], "@" => [0, "y0"], "A" => [0, "y1"], "B" => [0, "y2"], "C" => [0, "ya"], "D" => [0, "yc"], "E" => [0, "ye"], "F" => [0, "yi"], "G" => [0, "yo"], "H" => [0, "ys"], "I" => [0, "yt"], "J" => [73, "y"], "K" => [88, "y"], "L" => [89, "y"], "M" => [96, "y"], "N" => [97, "y"], "O" => [99, "y"], "P" => [106, "y"], "Q" => [136, "y"], "R" => [139, "y"], "S" => [141, "y"], "T" => [145, "y"], "U" => [147, "y"], "V" => [149, "y"], "W" => [101, "y"], "X" => [112, "y"], "Y" => [117, "y"], "Z" => [120, "y"], "[" => [124, "y"], "\\" => [127, "y"], "]" => [144, "y"], "^" => [152, "y"], "_" => [11, "y"], "`" => [0, "z0"], "a" => [0, "z1"], "b" => [0, "z2"], "c" => [0, "za"], "d" => [0, "zc"], "e" => [0, "ze"], "f" => [0, "zi"], "g" => [0, "zo"], "h" => [0, "zs"], "i" => [0, "zt"], "j" => [73, "z"], "k" => [88, "z"], "l" => [89, "z"], "m" => [96, "z"], "n" => [97, "z"], "o" => [99, "z"], "p" => [106, "z"], "q" => [136, "z"], "r" => [139, "z"], "s" => [141, "z"], "t" => [145, "z"], "u" => [147, "z"], "v" => [149, "z"], "w" => [101, "z"], "x" => [112, "z"], "y" => [117, "z"], "z" => [120, "z"], "{" => [124, "z"], "|" => [127, "z"], "}" => [144, "z"], "~" => [152, "z"], "" => [11, "z"], "\x80" => [92, "&"], "\x81" => [95, "&"], "\x82" => [137, "&"], "\x83" => [142, "&"], "\x84" => [150, "&"], "\x85" => [74, "&"], "\x86" => [90, "&"], "\x87" => [98, "&"], "\x88" => [107, "&"], "\x89" => [140, "&"], "\x8a" => [146, "&"], "\x8b" => [102, "&"], "\x8c" => [113, "&"], "\x8d" => [121, "&"], "\x8e" => [128, "&"], "\x8f" => [12, "&"], "\x90" => [92, "*"], "\x91" => [95, "*"], "\x92" => [137, "*"], "\x93" => [142, "*"], "\x94" => [150, "*"], "\x95" => [74, "*"], "\x96" => [90, "*"], "\x97" => [98, "*"], "\x98" => [107, "*"], "\x99" => [140, "*"], "\x9a" => [146, "*"], "\x9b" => [102, "*"], "\x9c" => [113, "*"], "\x9d" => [121, "*"], "\x9e" => [128, "*"], "\x9f" => [12, "*"], "\xa0" => [92, ","], "\xa1" => [95, ","], "\xa2" => [137, ","], "\xa3" => [142, ","], "\xa4" => [150, ","], "\xa5" => [74, ","], "\xa6" => [90, ","], "\xa7" => [98, ","], "\xa8" => [107, ","], "\xa9" => [140, ","], "\xaa" => [146, ","], "\xab" => [102, ","], "\xac" => [113, ","], "\xad" => [121, ","], "\xae" => [128, ","], "\xaf" => [12, ","], "\xb0" => [92, ";"], "\xb1" => [95, ";"], "\xb2" => [137, ";"], "\xb3" => [142, ";"], "\xb4" => [150, ";"], "\xb5" => [74, ";"], "\xb6" => [90, ";"], "\xb7" => [98, ";"], "\xb8" => [107, ";"], "\xb9" => [140, ";"], "\xba" => [146, ";"], "\xbb" => [102, ";"], "\xbc" => [113, ";"], "\xbd" => [121, ";"], "\xbe" => [128, ";"], "\xbf" => [12, ";"], "\xc0" => [92, "X"], "\xc1" => [95, "X"], "\xc2" => [137, "X"], "\xc3" => [142, "X"], "\xc4" => [150, "X"], "\xc5" => [74, "X"], "\xc6" => [90, "X"], "\xc7" => [98, "X"], "\xc8" => [107, "X"], "\xc9" => [140, "X"], "\xca" => [146, "X"], "\xcb" => [102, "X"], "\xcc" => [113, "X"], "\xcd" => [121, "X"], "\xce" => [128, "X"], "\xcf" => [12, "X"], "\xd0" => [92, "Z"], "\xd1" => [95, "Z"], "\xd2" => [137, "Z"], "\xd3" => [142, "Z"], "\xd4" => [150, "Z"], "\xd5" => [74, "Z"], "\xd6" => [90, "Z"], "\xd7" => [98, "Z"], "\xd8" => [107, "Z"], "\xd9" => [140, "Z"], "\xda" => [146, "Z"], "\xdb" => [102, "Z"], "\xdc" => [113, "Z"], "\xdd" => [121, "Z"], "\xde" => [128, "Z"], "\xdf" => [12, "Z"], "\xe0" => [94, "!"], "\xe1" => [76, "!"], "\xe2" => [104, "!"], "\xe3" => [16, "!"], "\xe4" => [94, "\""], "\xe5" => [76, "\""], "\xe6" => [104, "\""], "\xe7" => [16, "\""], "\xe8" => [94, "("], "\xe9" => [76, "("], "\xea" => [104, "("], "\xeb" => [16, "("], "\xec" => [94, ")"], "\xed" => [76, ")"], "\xee" => [104, ")"], "\xef" => [16, ")"], "\xf0" => [94, "?"], "\xf1" => [76, "?"], "\xf2" => [104, "?"], "\xf3" => [16, "?"], "\xf4" => [77, "'"], "\xf5" => [18, "'"], "\xf6" => [77, "+"], "\xf7" => [18, "+"], "\xf8" => [77, "|"], "\xf9" => [18, "|"], "\xfa" => [0, "#"], "\xfb" => [0, ">"], "\xfc" => [13, null], "\xfd" => [109, null], "\xfe" => [134, null], "\xff" => [26, null]], ["\x00" => [94, "\x000"], "\x01" => [76, "\x000"], "\x02" => [104, "\x000"], "\x03" => [16, "\x000"], "\x04" => [94, "\x001"], "\x05" => [76, "\x001"], "\x06" => [104, "\x001"], "\x07" => [16, "\x001"], "\x08" => [94, "\x002"], "\t" => [76, "\x002"], "\n" => [104, "\x002"], "\v" => [16, "\x002"], "\f" => [94, "\x00a"], "\r" => [76, "\x00a"], "\x0e" => [104, "\x00a"], "\x0f" => [16, "\x00a"], "\x10" => [94, "\x00c"], "\x11" => [76, "\x00c"], "\x12" => [104, "\x00c"], "\x13" => [16, "\x00c"], "\x14" => [94, "\x00e"], "\x15" => [76, "\x00e"], "\x16" => [104, "\x00e"], "\x17" => [16, "\x00e"], "\x18" => [94, "\x00i"], "\x19" => [76, "\x00i"], "\x1a" => [104, "\x00i"], "\x1b" => [16, "\x00i"], "\x1c" => [94, "\x00o"], "\x1d" => [76, "\x00o"], "\x1e" => [104, "\x00o"], "\x1f" => [16, "\x00o"], " " => [94, "\x00s"], "!" => [76, "\x00s"], "\"" => [104, "\x00s"], "#" => [16, "\x00s"], "\$" => [94, "\x00t"], "%" => [76, "\x00t"], "&" => [104, "\x00t"], "'" => [16, "\x00t"], "(" => [77, "\x00 "], ")" => [18, "\x00 "], "*" => [77, "\x00%"], "+" => [18, "\x00%"], "," => [77, "\x00-"], "-" => [18, "\x00-"], "." => [77, "\x00."], "/" => [18, "\x00."], [77, "\x00/"], [18, "\x00/"], [77, "\x003"], [18, "\x003"], [77, "\x004"], [18, "\x004"], [77, "\x005"], [18, "\x005"], [77, "\x006"], [18, "\x006"], ":" => [77, "\x007"], ";" => [18, "\x007"], "<" => [77, "\x008"], "=" => [18, "\x008"], ">" => [77, "\x009"], "?" => [18, "\x009"], "@" => [77, "\x00="], "A" => [18, "\x00="], "B" => [77, "\x00A"], "C" => [18, "\x00A"], "D" => [77, "\x00_"], "E" => [18, "\x00_"], "F" => [77, "\x00b"], "G" => [18, "\x00b"], "H" => [77, "\x00d"], "I" => [18, "\x00d"], "J" => [77, "\x00f"], "K" => [18, "\x00f"], "L" => [77, "\x00g"], "M" => [18, "\x00g"], "N" => [77, "\x00h"], "O" => [18, "\x00h"], "P" => [77, "\x00l"], "Q" => [18, "\x00l"], "R" => [77, "\x00m"], "S" => [18, "\x00m"], "T" => [77, "\x00n"], "U" => [18, "\x00n"], "V" => [77, "\x00p"], "W" => [18, "\x00p"], "X" => [77, "\x00r"], "Y" => [18, "\x00r"], "Z" => [77, "\x00u"], "[" => [18, "\x00u"], "\\" => [0, "\x00:"], "]" => [0, "\x00B"], "^" => [0, "\x00C"], "_" => [0, "\x00D"], "`" => [0, "\x00E"], "a" => [0, "\x00F"], "b" => [0, "\x00G"], "c" => [0, "\x00H"], "d" => [0, "\x00I"], "e" => [0, "\x00J"], "f" => [0, "\x00K"], "g" => [0, "\x00L"], "h" => [0, "\x00M"], "i" => [0, "\x00N"], "j" => [0, "\x00O"], "k" => [0, "\x00P"], "l" => [0, "\x00Q"], "m" => [0, "\x00R"], "n" => [0, "\x00S"], "o" => [0, "\x00T"], "p" => [0, "\x00U"], "q" => [0, "\x00V"], "r" => [0, "\x00W"], "s" => [0, "\x00Y"], "t" => [0, "\x00j"], "u" => [0, "\x00k"], "v" => [0, "\x00q"], "w" => [0, "\x00v"], "x" => [0, "\x00w"], "y" => [0, "\x00x"], "z" => [0, "\x00y"], "{" => [0, "\x00z"], "|" => [82, "\x00"], "}" => [87, "\x00"], "~" => [130, "\x00"], "" => [9, "\x00"], "\x80" => [94, "\$0"], "\x81" => [76, "\$0"], "\x82" => [104, "\$0"], "\x83" => [16, "\$0"], "\x84" => [94, "\$1"], "\x85" => [76, "\$1"], "\x86" => [104, "\$1"], "\x87" => [16, "\$1"], "\x88" => [94, "\$2"], "\x89" => [76, "\$2"], "\x8a" => [104, "\$2"], "\x8b" => [16, "\$2"], "\x8c" => [94, "\$a"], "\x8d" => [76, "\$a"], "\x8e" => [104, "\$a"], "\x8f" => [16, "\$a"], "\x90" => [94, "\$c"], "\x91" => [76, "\$c"], "\x92" => [104, "\$c"], "\x93" => [16, "\$c"], "\x94" => [94, "\$e"], "\x95" => [76, "\$e"], "\x96" => [104, "\$e"], "\x97" => [16, "\$e"], "\x98" => [94, "\$i"], "\x99" => [76, "\$i"], "\x9a" => [104, "\$i"], "\x9b" => [16, "\$i"], "\x9c" => [94, "\$o"], "\x9d" => [76, "\$o"], "\x9e" => [104, "\$o"], "\x9f" => [16, "\$o"], "\xa0" => [94, "\$s"], "\xa1" => [76, "\$s"], "\xa2" => [104, "\$s"], "\xa3" => [16, "\$s"], "\xa4" => [94, "\$t"], "\xa5" => [76, "\$t"], "\xa6" => [104, "\$t"], "\xa7" => [16, "\$t"], "\xa8" => [77, "\$ "], "\xa9" => [18, "\$ "], "\xaa" => [77, "\$%"], "\xab" => [18, "\$%"], "\xac" => [77, "\$-"], "\xad" => [18, "\$-"], "\xae" => [77, "\$."], "\xaf" => [18, "\$."], "\xb0" => [77, "\$/"], "\xb1" => [18, "\$/"], "\xb2" => [77, "\$3"], "\xb3" => [18, "\$3"], "\xb4" => [77, "\$4"], "\xb5" => [18, "\$4"], "\xb6" => [77, "\$5"], "\xb7" => [18, "\$5"], "\xb8" => [77, "\$6"], "\xb9" => [18, "\$6"], "\xba" => [77, "\$7"], "\xbb" => [18, "\$7"], "\xbc" => [77, "\$8"], "\xbd" => [18, "\$8"], "\xbe" => [77, "\$9"], "\xbf" => [18, "\$9"], "\xc0" => [77, "\$="], "\xc1" => [18, "\$="], "\xc2" => [77, "\$A"], "\xc3" => [18, "\$A"], "\xc4" => [77, "\$_"], "\xc5" => [18, "\$_"], "\xc6" => [77, "\$b"], "\xc7" => [18, "\$b"], "\xc8" => [77, "\$d"], "\xc9" => [18, "\$d"], "\xca" => [77, "\$f"], "\xcb" => [18, "\$f"], "\xcc" => [77, "\$g"], "\xcd" => [18, "\$g"], "\xce" => [77, "\$h"], "\xcf" => [18, "\$h"], "\xd0" => [77, "\$l"], "\xd1" => [18, "\$l"], "\xd2" => [77, "\$m"], "\xd3" => [18, "\$m"], "\xd4" => [77, "\$n"], "\xd5" => [18, "\$n"], "\xd6" => [77, "\$p"], "\xd7" => [18, "\$p"], "\xd8" => [77, "\$r"], "\xd9" => [18, "\$r"], "\xda" => [77, "\$u"], "\xdb" => [18, "\$u"], "\xdc" => [0, "\$:"], "\xdd" => [0, "\$B"], "\xde" => [0, "\$C"], "\xdf" => [0, "\$D"], "\xe0" => [0, "\$E"], "\xe1" => [0, "\$F"], "\xe2" => [0, "\$G"], "\xe3" => [0, "\$H"], "\xe4" => [0, "\$I"], "\xe5" => [0, "\$J"], "\xe6" => [0, "\$K"], "\xe7" => [0, "\$L"], "\xe8" => [0, "\$M"], "\xe9" => [0, "\$N"], "\xea" => [0, "\$O"], "\xeb" => [0, "\$P"], "\xec" => [0, "\$Q"], "\xed" => [0, "\$R"], "\xee" => [0, "\$S"], "\xef" => [0, "\$T"], "\xf0" => [0, "\$U"], "\xf1" => [0, "\$V"], "\xf2" => [0, "\$W"], "\xf3" => [0, "\$Y"], "\xf4" => [0, "\$j"], "\xf5" => [0, "\$k"], "\xf6" => [0, "\$q"], "\xf7" => [0, "\$v"], "\xf8" => [0, "\$w"], "\xf9" => [0, "\$x"], "\xfa" => [0, "\$y"], "\xfb" => [0, "\$z"], "\xfc" => [82, "\$"], "\xfd" => [87, "\$"], "\xfe" => [130, "\$"], "\xff" => [9, "\$"]], ["\x00" => [92, "U"], "\x01" => [95, "U"], "\x02" => [137, "U"], "\x03" => [142, "U"], "\x04" => [150, "U"], "\x05" => [74, "U"], "\x06" => [90, "U"], "\x07" => [98, "U"], "\x08" => [107, "U"], "\t" => [140, "U"], "\n" => [146, "U"], "\v" => [102, "U"], "\f" => [113, "U"], "\r" => [121, "U"], "\x0e" => [128, "U"], "\x0f" => [12, "U"], "\x10" => [92, "V"], "\x11" => [95, "V"], "\x12" => [137, "V"], "\x13" => [142, "V"], "\x14" => [150, "V"], "\x15" => [74, "V"], "\x16" => [90, "V"], "\x17" => [98, "V"], "\x18" => [107, "V"], "\x19" => [140, "V"], "\x1a" => [146, "V"], "\x1b" => [102, "V"], "\x1c" => [113, "V"], "\x1d" => [121, "V"], "\x1e" => [128, "V"], "\x1f" => [12, "V"], " " => [92, "W"], "!" => [95, "W"], "\"" => [137, "W"], "#" => [142, "W"], "\$" => [150, "W"], "%" => [74, "W"], "&" => [90, "W"], "'" => [98, "W"], "(" => [107, "W"], ")" => [140, "W"], "*" => [146, "W"], "+" => [102, "W"], "," => [113, "W"], "-" => [121, "W"], "." => [128, "W"], "/" => [12, "W"], [92, "Y"], [95, "Y"], [137, "Y"], [142, "Y"], [150, "Y"], [74, "Y"], [90, "Y"], [98, "Y"], [107, "Y"], [140, "Y"], ":" => [146, "Y"], ";" => [102, "Y"], "<" => [113, "Y"], "=" => [121, "Y"], ">" => [128, "Y"], "?" => [12, "Y"], "@" => [92, "j"], "A" => [95, "j"], "B" => [137, "j"], "C" => [142, "j"], "D" => [150, "j"], "E" => [74, "j"], "F" => [90, "j"], "G" => [98, "j"], "H" => [107, "j"], "I" => [140, "j"], "J" => [146, "j"], "K" => [102, "j"], "L" => [113, "j"], "M" => [121, "j"], "N" => [128, "j"], "O" => [12, "j"], "P" => [92, "k"], "Q" => [95, "k"], "R" => [137, "k"], "S" => [142, "k"], "T" => [150, "k"], "U" => [74, "k"], "V" => [90, "k"], "W" => [98, "k"], "X" => [107, "k"], "Y" => [140, "k"], "Z" => [146, "k"], "[" => [102, "k"], "\\" => [113, "k"], "]" => [121, "k"], "^" => [128, "k"], "_" => [12, "k"], "`" => [92, "q"], "a" => [95, "q"], "b" => [137, "q"], "c" => [142, "q"], "d" => [150, "q"], "e" => [74, "q"], "f" => [90, "q"], "g" => [98, "q"], "h" => [107, "q"], "i" => [140, "q"], "j" => [146, "q"], "k" => [102, "q"], "l" => [113, "q"], "m" => [121, "q"], "n" => [128, "q"], "o" => [12, "q"], "p" => [92, "v"], "q" => [95, "v"], "r" => [137, "v"], "s" => [142, "v"], "t" => [150, "v"], "u" => [74, "v"], "v" => [90, "v"], "w" => [98, "v"], "x" => [107, "v"], "y" => [140, "v"], "z" => [146, "v"], "{" => [102, "v"], "|" => [113, "v"], "}" => [121, "v"], "~" => [128, "v"], "" => [12, "v"], "\x80" => [92, "w"], "\x81" => [95, "w"], "\x82" => [137, "w"], "\x83" => [142, "w"], "\x84" => [150, "w"], "\x85" => [74, "w"], "\x86" => [90, "w"], "\x87" => [98, "w"], "\x88" => [107, "w"], "\x89" => [140, "w"], "\x8a" => [146, "w"], "\x8b" => [102, "w"], "\x8c" => [113, "w"], "\x8d" => [121, "w"], "\x8e" => [128, "w"], "\x8f" => [12, "w"], "\x90" => [92, "x"], "\x91" => [95, "x"], "\x92" => [137, "x"], "\x93" => [142, "x"], "\x94" => [150, "x"], "\x95" => [74, "x"], "\x96" => [90, "x"], "\x97" => [98, "x"], "\x98" => [107, "x"], "\x99" => [140, "x"], "\x9a" => [146, "x"], "\x9b" => [102, "x"], "\x9c" => [113, "x"], "\x9d" => [121, "x"], "\x9e" => [128, "x"], "\x9f" => [12, "x"], "\xa0" => [92, "y"], "\xa1" => [95, "y"], "\xa2" => [137, "y"], "\xa3" => [142, "y"], "\xa4" => [150, "y"], "\xa5" => [74, "y"], "\xa6" => [90, "y"], "\xa7" => [98, "y"], "\xa8" => [107, "y"], "\xa9" => [140, "y"], "\xaa" => [146, "y"], "\xab" => [102, "y"], "\xac" => [113, "y"], "\xad" => [121, "y"], "\xae" => [128, "y"], "\xaf" => [12, "y"], "\xb0" => [92, "z"], "\xb1" => [95, "z"], "\xb2" => [137, "z"], "\xb3" => [142, "z"], "\xb4" => [150, "z"], "\xb5" => [74, "z"], "\xb6" => [90, "z"], "\xb7" => [98, "z"], "\xb8" => [107, "z"], "\xb9" => [140, "z"], "\xba" => [146, "z"], "\xbb" => [102, "z"], "\xbc" => [113, "z"], "\xbd" => [121, "z"], "\xbe" => [128, "z"], "\xbf" => [12, "z"], "\xc0" => [93, "&"], "\xc1" => [138, "&"], "\xc2" => [75, "&"], "\xc3" => [91, "&"], "\xc4" => [108, "&"], "\xc5" => [103, "&"], "\xc6" => [114, "&"], "\xc7" => [14, "&"], "\xc8" => [93, "*"], "\xc9" => [138, "*"], "\xca" => [75, "*"], "\xcb" => [91, "*"], "\xcc" => [108, "*"], "\xcd" => [103, "*"], "\xce" => [114, "*"], "\xcf" => [14, "*"], "\xd0" => [93, ","], "\xd1" => [138, ","], "\xd2" => [75, ","], "\xd3" => [91, ","], "\xd4" => [108, ","], "\xd5" => [103, ","], "\xd6" => [114, ","], "\xd7" => [14, ","], "\xd8" => [93, ";"], "\xd9" => [138, ";"], "\xda" => [75, ";"], "\xdb" => [91, ";"], "\xdc" => [108, ";"], "\xdd" => [103, ";"], "\xde" => [114, ";"], "\xdf" => [14, ";"], "\xe0" => [93, "X"], "\xe1" => [138, "X"], "\xe2" => [75, "X"], "\xe3" => [91, "X"], "\xe4" => [108, "X"], "\xe5" => [103, "X"], "\xe6" => [114, "X"], "\xe7" => [14, "X"], "\xe8" => [93, "Z"], "\xe9" => [138, "Z"], "\xea" => [75, "Z"], "\xeb" => [91, "Z"], "\xec" => [108, "Z"], "\xed" => [103, "Z"], "\xee" => [114, "Z"], "\xef" => [14, "Z"], "\xf0" => [77, "!"], "\xf1" => [18, "!"], "\xf2" => [77, "\""], "\xf3" => [18, "\""], "\xf4" => [77, "("], "\xf5" => [18, "("], "\xf6" => [77, ")"], "\xf7" => [18, ")"], "\xf8" => [77, "?"], "\xf9" => [18, "?"], "\xfa" => [0, "'"], "\xfb" => [0, "+"], "\xfc" => [0, "|"], "\xfd" => [80, null], "\xfe" => [15, null], "\xff" => [28, null]], ["\x00" => [77, "\x000"], "\x01" => [18, "\x000"], "\x02" => [77, "\x001"], "\x03" => [18, "\x001"], "\x04" => [77, "\x002"], "\x05" => [18, "\x002"], "\x06" => [77, "\x00a"], "\x07" => [18, "\x00a"], "\x08" => [77, "\x00c"], "\t" => [18, "\x00c"], "\n" => [77, "\x00e"], "\v" => [18, "\x00e"], "\f" => [77, "\x00i"], "\r" => [18, "\x00i"], "\x0e" => [77, "\x00o"], "\x0f" => [18, "\x00o"], "\x10" => [77, "\x00s"], "\x11" => [18, "\x00s"], "\x12" => [77, "\x00t"], "\x13" => [18, "\x00t"], "\x14" => [0, "\x00 "], "\x15" => [0, "\x00%"], "\x16" => [0, "\x00-"], "\x17" => [0, "\x00."], "\x18" => [0, "\x00/"], "\x19" => [0, "\x003"], "\x1a" => [0, "\x004"], "\x1b" => [0, "\x005"], "\x1c" => [0, "\x006"], "\x1d" => [0, "\x007"], "\x1e" => [0, "\x008"], "\x1f" => [0, "\x009"], " " => [0, "\x00="], "!" => [0, "\x00A"], "\"" => [0, "\x00_"], "#" => [0, "\x00b"], "\$" => [0, "\x00d"], "%" => [0, "\x00f"], "&" => [0, "\x00g"], "'" => [0, "\x00h"], "(" => [0, "\x00l"], ")" => [0, "\x00m"], "*" => [0, "\x00n"], "+" => [0, "\x00p"], "," => [0, "\x00r"], "-" => [0, "\x00u"], "." => [100, "\x00"], "/" => [110, "\x00"], [111, "\x00"], [115, "\x00"], [116, "\x00"], [118, "\x00"], [119, "\x00"], [122, "\x00"], [123, "\x00"], [125, "\x00"], [126, "\x00"], [129, "\x00"], ":" => [143, "\x00"], ";" => [148, "\x00"], "<" => [151, "\x00"], "=" => [153, "\x00"], ">" => [83, "\x00"], "?" => [10, "\x00"], "@" => [77, "\$0"], "A" => [18, "\$0"], "B" => [77, "\$1"], "C" => [18, "\$1"], "D" => [77, "\$2"], "E" => [18, "\$2"], "F" => [77, "\$a"], "G" => [18, "\$a"], "H" => [77, "\$c"], "I" => [18, "\$c"], "J" => [77, "\$e"], "K" => [18, "\$e"], "L" => [77, "\$i"], "M" => [18, "\$i"], "N" => [77, "\$o"], "O" => [18, "\$o"], "P" => [77, "\$s"], "Q" => [18, "\$s"], "R" => [77, "\$t"], "S" => [18, "\$t"], "T" => [0, "\$ "], "U" => [0, "\$%"], "V" => [0, "\$-"], "W" => [0, "\$."], "X" => [0, "\$/"], "Y" => [0, "\$3"], "Z" => [0, "\$4"], "[" => [0, "\$5"], "\\" => [0, "\$6"], "]" => [0, "\$7"], "^" => [0, "\$8"], "_" => [0, "\$9"], "`" => [0, "\$="], "a" => [0, "\$A"], "b" => [0, "\$_"], "c" => [0, "\$b"], "d" => [0, "\$d"], "e" => [0, "\$f"], "f" => [0, "\$g"], "g" => [0, "\$h"], "h" => [0, "\$l"], "i" => [0, "\$m"], "j" => [0, "\$n"], "k" => [0, "\$p"], "l" => [0, "\$r"], "m" => [0, "\$u"], "n" => [100, "\$"], "o" => [110, "\$"], "p" => [111, "\$"], "q" => [115, "\$"], "r" => [116, "\$"], "s" => [118, "\$"], "t" => [119, "\$"], "u" => [122, "\$"], "v" => [123, "\$"], "w" => [125, "\$"], "x" => [126, "\$"], "y" => [129, "\$"], "z" => [143, "\$"], "{" => [148, "\$"], "|" => [151, "\$"], "}" => [153, "\$"], "~" => [83, "\$"], "" => [10, "\$"], "\x80" => [77, "@0"], "\x81" => [18, "@0"], "\x82" => [77, "@1"], "\x83" => [18, "@1"], "\x84" => [77, "@2"], "\x85" => [18, "@2"], "\x86" => [77, "@a"], "\x87" => [18, "@a"], "\x88" => [77, "@c"], "\x89" => [18, "@c"], "\x8a" => [77, "@e"], "\x8b" => [18, "@e"], "\x8c" => [77, "@i"], "\x8d" => [18, "@i"], "\x8e" => [77, "@o"], "\x8f" => [18, "@o"], "\x90" => [77, "@s"], "\x91" => [18, "@s"], "\x92" => [77, "@t"], "\x93" => [18, "@t"], "\x94" => [0, "@ "], "\x95" => [0, "@%"], "\x96" => [0, "@-"], "\x97" => [0, "@."], "\x98" => [0, "@/"], "\x99" => [0, "@3"], "\x9a" => [0, "@4"], "\x9b" => [0, "@5"], "\x9c" => [0, "@6"], "\x9d" => [0, "@7"], "\x9e" => [0, "@8"], "\x9f" => [0, "@9"], "\xa0" => [0, "@="], "\xa1" => [0, "@A"], "\xa2" => [0, "@_"], "\xa3" => [0, "@b"], "\xa4" => [0, "@d"], "\xa5" => [0, "@f"], "\xa6" => [0, "@g"], "\xa7" => [0, "@h"], "\xa8" => [0, "@l"], "\xa9" => [0, "@m"], "\xaa" => [0, "@n"], "\xab" => [0, "@p"], "\xac" => [0, "@r"], "\xad" => [0, "@u"], "\xae" => [100, "@"], "\xaf" => [110, "@"], "\xb0" => [111, "@"], "\xb1" => [115, "@"], "\xb2" => [116, "@"], "\xb3" => [118, "@"], "\xb4" => [119, "@"], "\xb5" => [122, "@"], "\xb6" => [123, "@"], "\xb7" => [125, "@"], "\xb8" => [126, "@"], "\xb9" => [129, "@"], "\xba" => [143, "@"], "\xbb" => [148, "@"], "\xbc" => [151, "@"], "\xbd" => [153, "@"], "\xbe" => [83, "@"], "\xbf" => [10, "@"], "\xc0" => [77, "[0"], "\xc1" => [18, "[0"], "\xc2" => [77, "[1"], "\xc3" => [18, "[1"], "\xc4" => [77, "[2"], "\xc5" => [18, "[2"], "\xc6" => [77, "[a"], "\xc7" => [18, "[a"], "\xc8" => [77, "[c"], "\xc9" => [18, "[c"], "\xca" => [77, "[e"], "\xcb" => [18, "[e"], "\xcc" => [77, "[i"], "\xcd" => [18, "[i"], "\xce" => [77, "[o"], "\xcf" => [18, "[o"], "\xd0" => [77, "[s"], "\xd1" => [18, "[s"], "\xd2" => [77, "[t"], "\xd3" => [18, "[t"], "\xd4" => [0, "[ "], "\xd5" => [0, "[%"], "\xd6" => [0, "[-"], "\xd7" => [0, "[."], "\xd8" => [0, "[/"], "\xd9" => [0, "[3"], "\xda" => [0, "[4"], "\xdb" => [0, "[5"], "\xdc" => [0, "[6"], "\xdd" => [0, "[7"], "\xde" => [0, "[8"], "\xdf" => [0, "[9"], "\xe0" => [0, "[="], "\xe1" => [0, "[A"], "\xe2" => [0, "[_"], "\xe3" => [0, "[b"], "\xe4" => [0, "[d"], "\xe5" => [0, "[f"], "\xe6" => [0, "[g"], "\xe7" => [0, "[h"], "\xe8" => [0, "[l"], "\xe9" => [0, "[m"], "\xea" => [0, "[n"], "\xeb" => [0, "[p"], "\xec" => [0, "[r"], "\xed" => [0, "[u"], "\xee" => [100, "["], "\xef" => [110, "["], "\xf0" => [111, "["], "\xf1" => [115, "["], "\xf2" => [116, "["], "\xf3" => [118, "["], "\xf4" => [119, "["], "\xf5" => [122, "["], "\xf6" => [123, "["], "\xf7" => [125, "["], "\xf8" => [126, "["], "\xf9" => [129, "["], "\xfa" => [143, "["], "\xfb" => [148, "["], "\xfc" => [151, "["], "\xfd" => [153, "["], "\xfe" => [83, "["], "\xff" => [10, "["]], ["\x00" => [93, "E"], "\x01" => [138, "E"], "\x02" => [75, "E"], "\x03" => [91, "E"], "\x04" => [108, "E"], "\x05" => [103, "E"], "\x06" => [114, "E"], "\x07" => [14, "E"], "\x08" => [93, "F"], "\t" => [138, "F"], "\n" => [75, "F"], "\v" => [91, "F"], "\f" => [108, "F"], "\r" => [103, "F"], "\x0e" => [114, "F"], "\x0f" => [14, "F"], "\x10" => [93, "G"], "\x11" => [138, "G"], "\x12" => [75, "G"], "\x13" => [91, "G"], "\x14" => [108, "G"], "\x15" => [103, "G"], "\x16" => [114, "G"], "\x17" => [14, "G"], "\x18" => [93, "H"], "\x19" => [138, "H"], "\x1a" => [75, "H"], "\x1b" => [91, "H"], "\x1c" => [108, "H"], "\x1d" => [103, "H"], "\x1e" => [114, "H"], "\x1f" => [14, "H"], " " => [93, "I"], "!" => [138, "I"], "\"" => [75, "I"], "#" => [91, "I"], "\$" => [108, "I"], "%" => [103, "I"], "&" => [114, "I"], "'" => [14, "I"], "(" => [93, "J"], ")" => [138, "J"], "*" => [75, "J"], "+" => [91, "J"], "," => [108, "J"], "-" => [103, "J"], "." => [114, "J"], "/" => [14, "J"], [93, "K"], [138, "K"], [75, "K"], [91, "K"], [108, "K"], [103, "K"], [114, "K"], [14, "K"], [93, "L"], [138, "L"], ":" => [75, "L"], ";" => [91, "L"], "<" => [108, "L"], "=" => [103, "L"], ">" => [114, "L"], "?" => [14, "L"], "@" => [93, "M"], "A" => [138, "M"], "B" => [75, "M"], "C" => [91, "M"], "D" => [108, "M"], "E" => [103, "M"], "F" => [114, "M"], "G" => [14, "M"], "H" => [93, "N"], "I" => [138, "N"], "J" => [75, "N"], "K" => [91, "N"], "L" => [108, "N"], "M" => [103, "N"], "N" => [114, "N"], "O" => [14, "N"], "P" => [93, "O"], "Q" => [138, "O"], "R" => [75, "O"], "S" => [91, "O"], "T" => [108, "O"], "U" => [103, "O"], "V" => [114, "O"], "W" => [14, "O"], "X" => [93, "P"], "Y" => [138, "P"], "Z" => [75, "P"], "[" => [91, "P"], "\\" => [108, "P"], "]" => [103, "P"], "^" => [114, "P"], "_" => [14, "P"], "`" => [93, "Q"], "a" => [138, "Q"], "b" => [75, "Q"], "c" => [91, "Q"], "d" => [108, "Q"], "e" => [103, "Q"], "f" => [114, "Q"], "g" => [14, "Q"], "h" => [93, "R"], "i" => [138, "R"], "j" => [75, "R"], "k" => [91, "R"], "l" => [108, "R"], "m" => [103, "R"], "n" => [114, "R"], "o" => [14, "R"], "p" => [93, "S"], "q" => [138, "S"], "r" => [75, "S"], "s" => [91, "S"], "t" => [108, "S"], "u" => [103, "S"], "v" => [114, "S"], "w" => [14, "S"], "x" => [93, "T"], "y" => [138, "T"], "z" => [75, "T"], "{" => [91, "T"], "|" => [108, "T"], "}" => [103, "T"], "~" => [114, "T"], "" => [14, "T"], "\x80" => [93, "U"], "\x81" => [138, "U"], "\x82" => [75, "U"], "\x83" => [91, "U"], "\x84" => [108, "U"], "\x85" => [103, "U"], "\x86" => [114, "U"], "\x87" => [14, "U"], "\x88" => [93, "V"], "\x89" => [138, "V"], "\x8a" => [75, "V"], "\x8b" => [91, "V"], "\x8c" => [108, "V"], "\x8d" => [103, "V"], "\x8e" => [114, "V"], "\x8f" => [14, "V"], "\x90" => [93, "W"], "\x91" => [138, "W"], "\x92" => [75, "W"], "\x93" => [91, "W"], "\x94" => [108, "W"], "\x95" => [103, "W"], "\x96" => [114, "W"], "\x97" => [14, "W"], "\x98" => [93, "Y"], "\x99" => [138, "Y"], "\x9a" => [75, "Y"], "\x9b" => [91, "Y"], "\x9c" => [108, "Y"], "\x9d" => [103, "Y"], "\x9e" => [114, "Y"], "\x9f" => [14, "Y"], "\xa0" => [93, "j"], "\xa1" => [138, "j"], "\xa2" => [75, "j"], "\xa3" => [91, "j"], "\xa4" => [108, "j"], "\xa5" => [103, "j"], "\xa6" => [114, "j"], "\xa7" => [14, "j"], "\xa8" => [93, "k"], "\xa9" => [138, "k"], "\xaa" => [75, "k"], "\xab" => [91, "k"], "\xac" => [108, "k"], "\xad" => [103, "k"], "\xae" => [114, "k"], "\xaf" => [14, "k"], "\xb0" => [93, "q"], "\xb1" => [138, "q"], "\xb2" => [75, "q"], "\xb3" => [91, "q"], "\xb4" => [108, "q"], "\xb5" => [103, "q"], "\xb6" => [114, "q"], "\xb7" => [14, "q"], "\xb8" => [93, "v"], "\xb9" => [138, "v"], "\xba" => [75, "v"], "\xbb" => [91, "v"], "\xbc" => [108, "v"], "\xbd" => [103, "v"], "\xbe" => [114, "v"], "\xbf" => [14, "v"], "\xc0" => [93, "w"], "\xc1" => [138, "w"], "\xc2" => [75, "w"], "\xc3" => [91, "w"], "\xc4" => [108, "w"], "\xc5" => [103, "w"], "\xc6" => [114, "w"], "\xc7" => [14, "w"], "\xc8" => [93, "x"], "\xc9" => [138, "x"], "\xca" => [75, "x"], "\xcb" => [91, "x"], "\xcc" => [108, "x"], "\xcd" => [103, "x"], "\xce" => [114, "x"], "\xcf" => [14, "x"], "\xd0" => [93, "y"], "\xd1" => [138, "y"], "\xd2" => [75, "y"], "\xd3" => [91, "y"], "\xd4" => [108, "y"], "\xd5" => [103, "y"], "\xd6" => [114, "y"], "\xd7" => [14, "y"], "\xd8" => [93, "z"], "\xd9" => [138, "z"], "\xda" => [75, "z"], "\xdb" => [91, "z"], "\xdc" => [108, "z"], "\xdd" => [103, "z"], "\xde" => [114, "z"], "\xdf" => [14, "z"], "\xe0" => [94, "&"], "\xe1" => [76, "&"], "\xe2" => [104, "&"], "\xe3" => [16, "&"], "\xe4" => [94, "*"], "\xe5" => [76, "*"], "\xe6" => [104, "*"], "\xe7" => [16, "*"], "\xe8" => [94, ","], "\xe9" => [76, ","], "\xea" => [104, ","], "\xeb" => [16, ","], "\xec" => [94, ";"], "\xed" => [76, ";"], "\xee" => [104, ";"], "\xef" => [16, ";"], "\xf0" => [94, "X"], "\xf1" => [76, "X"], "\xf2" => [104, "X"], "\xf3" => [16, "X"], "\xf4" => [94, "Z"], "\xf5" => [76, "Z"], "\xf6" => [104, "Z"], "\xf7" => [16, "Z"], "\xf8" => [0, "!"], "\xf9" => [0, "\""], "\xfa" => [0, "("], "\xfb" => [0, ")"], "\xfc" => [0, "?"], "\xfd" => [84, null], "\xfe" => [81, null], "\xff" => [17, null]], ["\x00" => [0, "\x000"], "\x01" => [0, "\x001"], "\x02" => [0, "\x002"], "\x03" => [0, "\x00a"], "\x04" => [0, "\x00c"], "\x05" => [0, "\x00e"], "\x06" => [0, "\x00i"], "\x07" => [0, "\x00o"], "\x08" => [0, "\x00s"], "\t" => [0, "\x00t"], "\n" => [73, "\x00"], "\v" => [88, "\x00"], "\f" => [89, "\x00"], "\r" => [96, "\x00"], "\x0e" => [97, "\x00"], "\x0f" => [99, "\x00"], "\x10" => [106, "\x00"], "\x11" => [136, "\x00"], "\x12" => [139, "\x00"], "\x13" => [141, "\x00"], "\x14" => [145, "\x00"], "\x15" => [147, "\x00"], "\x16" => [149, "\x00"], "\x17" => [101, "\x00"], "\x18" => [112, "\x00"], "\x19" => [117, "\x00"], "\x1a" => [120, "\x00"], "\x1b" => [124, "\x00"], "\x1c" => [127, "\x00"], "\x1d" => [144, "\x00"], "\x1e" => [152, "\x00"], "\x1f" => [11, "\x00"], " " => [0, "\$0"], "!" => [0, "\$1"], "\"" => [0, "\$2"], "#" => [0, "\$a"], "\$" => [0, "\$c"], "%" => [0, "\$e"], "&" => [0, "\$i"], "'" => [0, "\$o"], "(" => [0, "\$s"], ")" => [0, "\$t"], "*" => [73, "\$"], "+" => [88, "\$"], "," => [89, "\$"], "-" => [96, "\$"], "." => [97, "\$"], "/" => [99, "\$"], [106, "\$"], [136, "\$"], [139, "\$"], [141, "\$"], [145, "\$"], [147, "\$"], [149, "\$"], [101, "\$"], [112, "\$"], [117, "\$"], ":" => [120, "\$"], ";" => [124, "\$"], "<" => [127, "\$"], "=" => [144, "\$"], ">" => [152, "\$"], "?" => [11, "\$"], "@" => [0, "@0"], "A" => [0, "@1"], "B" => [0, "@2"], "C" => [0, "@a"], "D" => [0, "@c"], "E" => [0, "@e"], "F" => [0, "@i"], "G" => [0, "@o"], "H" => [0, "@s"], "I" => [0, "@t"], "J" => [73, "@"], "K" => [88, "@"], "L" => [89, "@"], "M" => [96, "@"], "N" => [97, "@"], "O" => [99, "@"], "P" => [106, "@"], "Q" => [136, "@"], "R" => [139, "@"], "S" => [141, "@"], "T" => [145, "@"], "U" => [147, "@"], "V" => [149, "@"], "W" => [101, "@"], "X" => [112, "@"], "Y" => [117, "@"], "Z" => [120, "@"], "[" => [124, "@"], "\\" => [127, "@"], "]" => [144, "@"], "^" => [152, "@"], "_" => [11, "@"], "`" => [0, "[0"], "a" => [0, "[1"], "b" => [0, "[2"], "c" => [0, "[a"], "d" => [0, "[c"], "e" => [0, "[e"], "f" => [0, "[i"], "g" => [0, "[o"], "h" => [0, "[s"], "i" => [0, "[t"], "j" => [73, "["], "k" => [88, "["], "l" => [89, "["], "m" => [96, "["], "n" => [97, "["], "o" => [99, "["], "p" => [106, "["], "q" => [136, "["], "r" => [139, "["], "s" => [141, "["], "t" => [145, "["], "u" => [147, "["], "v" => [149, "["], "w" => [101, "["], "x" => [112, "["], "y" => [117, "["], "z" => [120, "["], "{" => [124, "["], "|" => [127, "["], "}" => [144, "["], "~" => [152, "["], "" => [11, "["], "\x80" => [0, "]0"], "\x81" => [0, "]1"], "\x82" => [0, "]2"], "\x83" => [0, "]a"], "\x84" => [0, "]c"], "\x85" => [0, "]e"], "\x86" => [0, "]i"], "\x87" => [0, "]o"], "\x88" => [0, "]s"], "\x89" => [0, "]t"], "\x8a" => [73, "]"], "\x8b" => [88, "]"], "\x8c" => [89, "]"], "\x8d" => [96, "]"], "\x8e" => [97, "]"], "\x8f" => [99, "]"], "\x90" => [106, "]"], "\x91" => [136, "]"], "\x92" => [139, "]"], "\x93" => [141, "]"], "\x94" => [145, "]"], "\x95" => [147, "]"], "\x96" => [149, "]"], "\x97" => [101, "]"], "\x98" => [112, "]"], "\x99" => [117, "]"], "\x9a" => [120, "]"], "\x9b" => [124, "]"], "\x9c" => [127, "]"], "\x9d" => [144, "]"], "\x9e" => [152, "]"], "\x9f" => [11, "]"], "\xa0" => [0, "~0"], "\xa1" => [0, "~1"], "\xa2" => [0, "~2"], "\xa3" => [0, "~a"], "\xa4" => [0, "~c"], "\xa5" => [0, "~e"], "\xa6" => [0, "~i"], "\xa7" => [0, "~o"], "\xa8" => [0, "~s"], "\xa9" => [0, "~t"], "\xaa" => [73, "~"], "\xab" => [88, "~"], "\xac" => [89, "~"], "\xad" => [96, "~"], "\xae" => [97, "~"], "\xaf" => [99, "~"], "\xb0" => [106, "~"], "\xb1" => [136, "~"], "\xb2" => [139, "~"], "\xb3" => [141, "~"], "\xb4" => [145, "~"], "\xb5" => [147, "~"], "\xb6" => [149, "~"], "\xb7" => [101, "~"], "\xb8" => [112, "~"], "\xb9" => [117, "~"], "\xba" => [120, "~"], "\xbb" => [124, "~"], "\xbc" => [127, "~"], "\xbd" => [144, "~"], "\xbe" => [152, "~"], "\xbf" => [11, "~"], "\xc0" => [92, "^"], "\xc1" => [95, "^"], "\xc2" => [137, "^"], "\xc3" => [142, "^"], "\xc4" => [150, "^"], "\xc5" => [74, "^"], "\xc6" => [90, "^"], "\xc7" => [98, "^"], "\xc8" => [107, "^"], "\xc9" => [140, "^"], "\xca" => [146, "^"], "\xcb" => [102, "^"], "\xcc" => [113, "^"], "\xcd" => [121, "^"], "\xce" => [128, "^"], "\xcf" => [12, "^"], "\xd0" => [92, "}"], "\xd1" => [95, "}"], "\xd2" => [137, "}"], "\xd3" => [142, "}"], "\xd4" => [150, "}"], "\xd5" => [74, "}"], "\xd6" => [90, "}"], "\xd7" => [98, "}"], "\xd8" => [107, "}"], "\xd9" => [140, "}"], "\xda" => [146, "}"], "\xdb" => [102, "}"], "\xdc" => [113, "}"], "\xdd" => [121, "}"], "\xde" => [128, "}"], "\xdf" => [12, "}"], "\xe0" => [93, "<"], "\xe1" => [138, "<"], "\xe2" => [75, "<"], "\xe3" => [91, "<"], "\xe4" => [108, "<"], "\xe5" => [103, "<"], "\xe6" => [114, "<"], "\xe7" => [14, "<"], "\xe8" => [93, "`"], "\xe9" => [138, "`"], "\xea" => [75, "`"], "\xeb" => [91, "`"], "\xec" => [108, "`"], "\xed" => [103, "`"], "\xee" => [114, "`"], "\xef" => [14, "`"], "\xf0" => [93, "{"], "\xf1" => [138, "{"], "\xf2" => [75, "{"], "\xf3" => [91, "{"], "\xf4" => [108, "{"], "\xf5" => [103, "{"], "\xf6" => [114, "{"], "\xf7" => [14, "{"], "\xf8" => [132, null], "\xf9" => [156, null], "\xfa" => [163, null], "\xfb" => [184, null], "\xfc" => [205, null], "\xfd" => [160, null], "\xfe" => [30, null], "\xff" => [39, null]], ["\x00" => [93, "="], "\x01" => [138, "="], "\x02" => [75, "="], "\x03" => [91, "="], "\x04" => [108, "="], "\x05" => [103, "="], "\x06" => [114, "="], "\x07" => [14, "="], "\x08" => [93, "A"], "\t" => [138, "A"], "\n" => [75, "A"], "\v" => [91, "A"], "\f" => [108, "A"], "\r" => [103, "A"], "\x0e" => [114, "A"], "\x0f" => [14, "A"], "\x10" => [93, "_"], "\x11" => [138, "_"], "\x12" => [75, "_"], "\x13" => [91, "_"], "\x14" => [108, "_"], "\x15" => [103, "_"], "\x16" => [114, "_"], "\x17" => [14, "_"], "\x18" => [93, "b"], "\x19" => [138, "b"], "\x1a" => [75, "b"], "\x1b" => [91, "b"], "\x1c" => [108, "b"], "\x1d" => [103, "b"], "\x1e" => [114, "b"], "\x1f" => [14, "b"], " " => [93, "d"], "!" => [138, "d"], "\"" => [75, "d"], "#" => [91, "d"], "\$" => [108, "d"], "%" => [103, "d"], "&" => [114, "d"], "'" => [14, "d"], "(" => [93, "f"], ")" => [138, "f"], "*" => [75, "f"], "+" => [91, "f"], "," => [108, "f"], "-" => [103, "f"], "." => [114, "f"], "/" => [14, "f"], [93, "g"], [138, "g"], [75, "g"], [91, "g"], [108, "g"], [103, "g"], [114, "g"], [14, "g"], [93, "h"], [138, "h"], ":" => [75, "h"], ";" => [91, "h"], "<" => [108, "h"], "=" => [103, "h"], ">" => [114, "h"], "?" => [14, "h"], "@" => [93, "l"], "A" => [138, "l"], "B" => [75, "l"], "C" => [91, "l"], "D" => [108, "l"], "E" => [103, "l"], "F" => [114, "l"], "G" => [14, "l"], "H" => [93, "m"], "I" => [138, "m"], "J" => [75, "m"], "K" => [91, "m"], "L" => [108, "m"], "M" => [103, "m"], "N" => [114, "m"], "O" => [14, "m"], "P" => [93, "n"], "Q" => [138, "n"], "R" => [75, "n"], "S" => [91, "n"], "T" => [108, "n"], "U" => [103, "n"], "V" => [114, "n"], "W" => [14, "n"], "X" => [93, "p"], "Y" => [138, "p"], "Z" => [75, "p"], "[" => [91, "p"], "\\" => [108, "p"], "]" => [103, "p"], "^" => [114, "p"], "_" => [14, "p"], "`" => [93, "r"], "a" => [138, "r"], "b" => [75, "r"], "c" => [91, "r"], "d" => [108, "r"], "e" => [103, "r"], "f" => [114, "r"], "g" => [14, "r"], "h" => [93, "u"], "i" => [138, "u"], "j" => [75, "u"], "k" => [91, "u"], "l" => [108, "u"], "m" => [103, "u"], "n" => [114, "u"], "o" => [14, "u"], "p" => [94, ":"], "q" => [76, ":"], "r" => [104, ":"], "s" => [16, ":"], "t" => [94, "B"], "u" => [76, "B"], "v" => [104, "B"], "w" => [16, "B"], "x" => [94, "C"], "y" => [76, "C"], "z" => [104, "C"], "{" => [16, "C"], "|" => [94, "D"], "}" => [76, "D"], "~" => [104, "D"], "" => [16, "D"], "\x80" => [94, "E"], "\x81" => [76, "E"], "\x82" => [104, "E"], "\x83" => [16, "E"], "\x84" => [94, "F"], "\x85" => [76, "F"], "\x86" => [104, "F"], "\x87" => [16, "F"], "\x88" => [94, "G"], "\x89" => [76, "G"], "\x8a" => [104, "G"], "\x8b" => [16, "G"], "\x8c" => [94, "H"], "\x8d" => [76, "H"], "\x8e" => [104, "H"], "\x8f" => [16, "H"], "\x90" => [94, "I"], "\x91" => [76, "I"], "\x92" => [104, "I"], "\x93" => [16, "I"], "\x94" => [94, "J"], "\x95" => [76, "J"], "\x96" => [104, "J"], "\x97" => [16, "J"], "\x98" => [94, "K"], "\x99" => [76, "K"], "\x9a" => [104, "K"], "\x9b" => [16, "K"], "\x9c" => [94, "L"], "\x9d" => [76, "L"], "\x9e" => [104, "L"], "\x9f" => [16, "L"], "\xa0" => [94, "M"], "\xa1" => [76, "M"], "\xa2" => [104, "M"], "\xa3" => [16, "M"], "\xa4" => [94, "N"], "\xa5" => [76, "N"], "\xa6" => [104, "N"], "\xa7" => [16, "N"], "\xa8" => [94, "O"], "\xa9" => [76, "O"], "\xaa" => [104, "O"], "\xab" => [16, "O"], "\xac" => [94, "P"], "\xad" => [76, "P"], "\xae" => [104, "P"], "\xaf" => [16, "P"], "\xb0" => [94, "Q"], "\xb1" => [76, "Q"], "\xb2" => [104, "Q"], "\xb3" => [16, "Q"], "\xb4" => [94, "R"], "\xb5" => [76, "R"], "\xb6" => [104, "R"], "\xb7" => [16, "R"], "\xb8" => [94, "S"], "\xb9" => [76, "S"], "\xba" => [104, "S"], "\xbb" => [16, "S"], "\xbc" => [94, "T"], "\xbd" => [76, "T"], "\xbe" => [104, "T"], "\xbf" => [16, "T"], "\xc0" => [94, "U"], "\xc1" => [76, "U"], "\xc2" => [104, "U"], "\xc3" => [16, "U"], "\xc4" => [94, "V"], "\xc5" => [76, "V"], "\xc6" => [104, "V"], "\xc7" => [16, "V"], "\xc8" => [94, "W"], "\xc9" => [76, "W"], "\xca" => [104, "W"], "\xcb" => [16, "W"], "\xcc" => [94, "Y"], "\xcd" => [76, "Y"], "\xce" => [104, "Y"], "\xcf" => [16, "Y"], "\xd0" => [94, "j"], "\xd1" => [76, "j"], "\xd2" => [104, "j"], "\xd3" => [16, "j"], "\xd4" => [94, "k"], "\xd5" => [76, "k"], "\xd6" => [104, "k"], "\xd7" => [16, "k"], "\xd8" => [94, "q"], "\xd9" => [76, "q"], "\xda" => [104, "q"], "\xdb" => [16, "q"], "\xdc" => [94, "v"], "\xdd" => [76, "v"], "\xde" => [104, "v"], "\xdf" => [16, "v"], "\xe0" => [94, "w"], "\xe1" => [76, "w"], "\xe2" => [104, "w"], "\xe3" => [16, "w"], "\xe4" => [94, "x"], "\xe5" => [76, "x"], "\xe6" => [104, "x"], "\xe7" => [16, "x"], "\xe8" => [94, "y"], "\xe9" => [76, "y"], "\xea" => [104, "y"], "\xeb" => [16, "y"], "\xec" => [94, "z"], "\xed" => [76, "z"], "\xee" => [104, "z"], "\xef" => [16, "z"], "\xf0" => [77, "&"], "\xf1" => [18, "&"], "\xf2" => [77, "*"], "\xf3" => [18, "*"], "\xf4" => [77, ","], "\xf5" => [18, ","], "\xf6" => [77, ";"], "\xf7" => [18, ";"], "\xf8" => [77, "X"], "\xf9" => [18, "X"], "\xfa" => [77, "Z"], "\xfb" => [18, "Z"], "\xfc" => [79, null], "\xfd" => [86, null], "\xfe" => [85, null], "\xff" => [19, null]], ["\x00" => [77, "|0"], "\x01" => [18, "|0"], "\x02" => [77, "|1"], "\x03" => [18, "|1"], "\x04" => [77, "|2"], "\x05" => [18, "|2"], "\x06" => [77, "|a"], "\x07" => [18, "|a"], "\x08" => [77, "|c"], "\t" => [18, "|c"], "\n" => [77, "|e"], "\v" => [18, "|e"], "\f" => [77, "|i"], "\r" => [18, "|i"], "\x0e" => [77, "|o"], "\x0f" => [18, "|o"], "\x10" => [77, "|s"], "\x11" => [18, "|s"], "\x12" => [77, "|t"], "\x13" => [18, "|t"], "\x14" => [0, "| "], "\x15" => [0, "|%"], "\x16" => [0, "|-"], "\x17" => [0, "|."], "\x18" => [0, "|/"], "\x19" => [0, "|3"], "\x1a" => [0, "|4"], "\x1b" => [0, "|5"], "\x1c" => [0, "|6"], "\x1d" => [0, "|7"], "\x1e" => [0, "|8"], "\x1f" => [0, "|9"], " " => [0, "|="], "!" => [0, "|A"], "\"" => [0, "|_"], "#" => [0, "|b"], "\$" => [0, "|d"], "%" => [0, "|f"], "&" => [0, "|g"], "'" => [0, "|h"], "(" => [0, "|l"], ")" => [0, "|m"], "*" => [0, "|n"], "+" => [0, "|p"], "," => [0, "|r"], "-" => [0, "|u"], "." => [100, "|"], "/" => [110, "|"], [111, "|"], [115, "|"], [116, "|"], [118, "|"], [119, "|"], [122, "|"], [123, "|"], [125, "|"], [126, "|"], [129, "|"], ":" => [143, "|"], ";" => [148, "|"], "<" => [151, "|"], "=" => [153, "|"], ">" => [83, "|"], "?" => [10, "|"], "@" => [0, "#0"], "A" => [0, "#1"], "B" => [0, "#2"], "C" => [0, "#a"], "D" => [0, "#c"], "E" => [0, "#e"], "F" => [0, "#i"], "G" => [0, "#o"], "H" => [0, "#s"], "I" => [0, "#t"], "J" => [73, "#"], "K" => [88, "#"], "L" => [89, "#"], "M" => [96, "#"], "N" => [97, "#"], "O" => [99, "#"], "P" => [106, "#"], "Q" => [136, "#"], "R" => [139, "#"], "S" => [141, "#"], "T" => [145, "#"], "U" => [147, "#"], "V" => [149, "#"], "W" => [101, "#"], "X" => [112, "#"], "Y" => [117, "#"], "Z" => [120, "#"], "[" => [124, "#"], "\\" => [127, "#"], "]" => [144, "#"], "^" => [152, "#"], "_" => [11, "#"], "`" => [0, ">0"], "a" => [0, ">1"], "b" => [0, ">2"], "c" => [0, ">a"], "d" => [0, ">c"], "e" => [0, ">e"], "f" => [0, ">i"], "g" => [0, ">o"], "h" => [0, ">s"], "i" => [0, ">t"], "j" => [73, ">"], "k" => [88, ">"], "l" => [89, ">"], "m" => [96, ">"], "n" => [97, ">"], "o" => [99, ">"], "p" => [106, ">"], "q" => [136, ">"], "r" => [139, ">"], "s" => [141, ">"], "t" => [145, ">"], "u" => [147, ">"], "v" => [149, ">"], "w" => [101, ">"], "x" => [112, ">"], "y" => [117, ">"], "z" => [120, ">"], "{" => [124, ">"], "|" => [127, ">"], "}" => [144, ">"], "~" => [152, ">"], "" => [11, ">"], "\x80" => [92, "\x00"], "\x81" => [95, "\x00"], "\x82" => [137, "\x00"], "\x83" => [142, "\x00"], "\x84" => [150, "\x00"], "\x85" => [74, "\x00"], "\x86" => [90, "\x00"], "\x87" => [98, "\x00"], "\x88" => [107, "\x00"], "\x89" => [140, "\x00"], "\x8a" => [146, "\x00"], "\x8b" => [102, "\x00"], "\x8c" => [113, "\x00"], "\x8d" => [121, "\x00"], "\x8e" => [128, "\x00"], "\x8f" => [12, "\x00"], "\x90" => [92, "\$"], "\x91" => [95, "\$"], "\x92" => [137, "\$"], "\x93" => [142, "\$"], "\x94" => [150, "\$"], "\x95" => [74, "\$"], "\x96" => [90, "\$"], "\x97" => [98, "\$"], "\x98" => [107, "\$"], "\x99" => [140, "\$"], "\x9a" => [146, "\$"], "\x9b" => [102, "\$"], "\x9c" => [113, "\$"], "\x9d" => [121, "\$"], "\x9e" => [128, "\$"], "\x9f" => [12, "\$"], "\xa0" => [92, "@"], "\xa1" => [95, "@"], "\xa2" => [137, "@"], "\xa3" => [142, "@"], "\xa4" => [150, "@"], "\xa5" => [74, "@"], "\xa6" => [90, "@"], "\xa7" => [98, "@"], "\xa8" => [107, "@"], "\xa9" => [140, "@"], "\xaa" => [146, "@"], "\xab" => [102, "@"], "\xac" => [113, "@"], "\xad" => [121, "@"], "\xae" => [128, "@"], "\xaf" => [12, "@"], "\xb0" => [92, "["], "\xb1" => [95, "["], "\xb2" => [137, "["], "\xb3" => [142, "["], "\xb4" => [150, "["], "\xb5" => [74, "["], "\xb6" => [90, "["], "\xb7" => [98, "["], "\xb8" => [107, "["], "\xb9" => [140, "["], "\xba" => [146, "["], "\xbb" => [102, "["], "\xbc" => [113, "["], "\xbd" => [121, "["], "\xbe" => [128, "["], "\xbf" => [12, "["], "\xc0" => [92, "]"], "\xc1" => [95, "]"], "\xc2" => [137, "]"], "\xc3" => [142, "]"], "\xc4" => [150, "]"], "\xc5" => [74, "]"], "\xc6" => [90, "]"], "\xc7" => [98, "]"], "\xc8" => [107, "]"], "\xc9" => [140, "]"], "\xca" => [146, "]"], "\xcb" => [102, "]"], "\xcc" => [113, "]"], "\xcd" => [121, "]"], "\xce" => [128, "]"], "\xcf" => [12, "]"], "\xd0" => [92, "~"], "\xd1" => [95, "~"], "\xd2" => [137, "~"], "\xd3" => [142, "~"], "\xd4" => [150, "~"], "\xd5" => [74, "~"], "\xd6" => [90, "~"], "\xd7" => [98, "~"], "\xd8" => [107, "~"], "\xd9" => [140, "~"], "\xda" => [146, "~"], "\xdb" => [102, "~"], "\xdc" => [113, "~"], "\xdd" => [121, "~"], "\xde" => [128, "~"], "\xdf" => [12, "~"], "\xe0" => [93, "^"], "\xe1" => [138, "^"], "\xe2" => [75, "^"], "\xe3" => [91, "^"], "\xe4" => [108, "^"], "\xe5" => [103, "^"], "\xe6" => [114, "^"], "\xe7" => [14, "^"], "\xe8" => [93, "}"], "\xe9" => [138, "}"], "\xea" => [75, "}"], "\xeb" => [91, "}"], "\xec" => [108, "}"], "\xed" => [103, "}"], "\xee" => [114, "}"], "\xef" => [14, "}"], "\xf0" => [94, "<"], "\xf1" => [76, "<"], "\xf2" => [104, "<"], "\xf3" => [16, "<"], "\xf4" => [94, "`"], "\xf5" => [76, "`"], "\xf6" => [104, "`"], "\xf7" => [16, "`"], "\xf8" => [94, "{"], "\xf9" => [76, "{"], "\xfa" => [104, "{"], "\xfb" => [16, "{"], "\xfc" => [133, null], "\xfd" => [164, null], "\xfe" => [161, null], "\xff" => [31, null]], ["\x00" => [93, "\xb0"], "\x01" => [138, "\xb0"], "\x02" => [75, "\xb0"], "\x03" => [91, "\xb0"], "\x04" => [108, "\xb0"], "\x05" => [103, "\xb0"], "\x06" => [114, "\xb0"], "\x07" => [14, "\xb0"], "\x08" => [93, "\xb1"], "\t" => [138, "\xb1"], "\n" => [75, "\xb1"], "\v" => [91, "\xb1"], "\f" => [108, "\xb1"], "\r" => [103, "\xb1"], "\x0e" => [114, "\xb1"], "\x0f" => [14, "\xb1"], "\x10" => [93, "\xb3"], "\x11" => [138, "\xb3"], "\x12" => [75, "\xb3"], "\x13" => [91, "\xb3"], "\x14" => [108, "\xb3"], "\x15" => [103, "\xb3"], "\x16" => [114, "\xb3"], "\x17" => [14, "\xb3"], "\x18" => [93, "\xd1"], "\x19" => [138, "\xd1"], "\x1a" => [75, "\xd1"], "\x1b" => [91, "\xd1"], "\x1c" => [108, "\xd1"], "\x1d" => [103, "\xd1"], "\x1e" => [114, "\xd1"], "\x1f" => [14, "\xd1"], " " => [93, "\xd8"], "!" => [138, "\xd8"], "\"" => [75, "\xd8"], "#" => [91, "\xd8"], "\$" => [108, "\xd8"], "%" => [103, "\xd8"], "&" => [114, "\xd8"], "'" => [14, "\xd8"], "(" => [93, "\xd9"], ")" => [138, "\xd9"], "*" => [75, "\xd9"], "+" => [91, "\xd9"], "," => [108, "\xd9"], "-" => [103, "\xd9"], "." => [114, "\xd9"], "/" => [14, "\xd9"], [93, "\xe3"], [138, "\xe3"], [75, "\xe3"], [91, "\xe3"], [108, "\xe3"], [103, "\xe3"], [114, "\xe3"], [14, "\xe3"], [93, "\xe5"], [138, "\xe5"], ":" => [75, "\xe5"], ";" => [91, "\xe5"], "<" => [108, "\xe5"], "=" => [103, "\xe5"], ">" => [114, "\xe5"], "?" => [14, "\xe5"], "@" => [93, "\xe6"], "A" => [138, "\xe6"], "B" => [75, "\xe6"], "C" => [91, "\xe6"], "D" => [108, "\xe6"], "E" => [103, "\xe6"], "F" => [114, "\xe6"], "G" => [14, "\xe6"], "H" => [94, "\x81"], "I" => [76, "\x81"], "J" => [104, "\x81"], "K" => [16, "\x81"], "L" => [94, "\x84"], "M" => [76, "\x84"], "N" => [104, "\x84"], "O" => [16, "\x84"], "P" => [94, "\x85"], "Q" => [76, "\x85"], "R" => [104, "\x85"], "S" => [16, "\x85"], "T" => [94, "\x86"], "U" => [76, "\x86"], "V" => [104, "\x86"], "W" => [16, "\x86"], "X" => [94, "\x88"], "Y" => [76, "\x88"], "Z" => [104, "\x88"], "[" => [16, "\x88"], "\\" => [94, "\x92"], "]" => [76, "\x92"], "^" => [104, "\x92"], "_" => [16, "\x92"], "`" => [94, "\x9a"], "a" => [76, "\x9a"], "b" => [104, "\x9a"], "c" => [16, "\x9a"], "d" => [94, "\x9c"], "e" => [76, "\x9c"], "f" => [104, "\x9c"], "g" => [16, "\x9c"], "h" => [94, "\xa0"], "i" => [76, "\xa0"], "j" => [104, "\xa0"], "k" => [16, "\xa0"], "l" => [94, "\xa3"], "m" => [76, "\xa3"], "n" => [104, "\xa3"], "o" => [16, "\xa3"], "p" => [94, "\xa4"], "q" => [76, "\xa4"], "r" => [104, "\xa4"], "s" => [16, "\xa4"], "t" => [94, "\xa9"], "u" => [76, "\xa9"], "v" => [104, "\xa9"], "w" => [16, "\xa9"], "x" => [94, "\xaa"], "y" => [76, "\xaa"], "z" => [104, "\xaa"], "{" => [16, "\xaa"], "|" => [94, "\xad"], "}" => [76, "\xad"], "~" => [104, "\xad"], "" => [16, "\xad"], "\x80" => [94, "\xb2"], "\x81" => [76, "\xb2"], "\x82" => [104, "\xb2"], "\x83" => [16, "\xb2"], "\x84" => [94, "\xb5"], "\x85" => [76, "\xb5"], "\x86" => [104, "\xb5"], "\x87" => [16, "\xb5"], "\x88" => [94, "\xb9"], "\x89" => [76, "\xb9"], "\x8a" => [104, "\xb9"], "\x8b" => [16, "\xb9"], "\x8c" => [94, "\xba"], "\x8d" => [76, "\xba"], "\x8e" => [104, "\xba"], "\x8f" => [16, "\xba"], "\x90" => [94, "\xbb"], "\x91" => [76, "\xbb"], "\x92" => [104, "\xbb"], "\x93" => [16, "\xbb"], "\x94" => [94, "\xbd"], "\x95" => [76, "\xbd"], "\x96" => [104, "\xbd"], "\x97" => [16, "\xbd"], "\x98" => [94, "\xbe"], "\x99" => [76, "\xbe"], "\x9a" => [104, "\xbe"], "\x9b" => [16, "\xbe"], "\x9c" => [94, "\xc4"], "\x9d" => [76, "\xc4"], "\x9e" => [104, "\xc4"], "\x9f" => [16, "\xc4"], "\xa0" => [94, "\xc6"], "\xa1" => [76, "\xc6"], "\xa2" => [104, "\xc6"], "\xa3" => [16, "\xc6"], "\xa4" => [94, "\xe4"], "\xa5" => [76, "\xe4"], "\xa6" => [104, "\xe4"], "\xa7" => [16, "\xe4"], "\xa8" => [94, "\xe8"], "\xa9" => [76, "\xe8"], "\xaa" => [104, "\xe8"], "\xab" => [16, "\xe8"], "\xac" => [94, "\xe9"], "\xad" => [76, "\xe9"], "\xae" => [104, "\xe9"], "\xaf" => [16, "\xe9"], "\xb0" => [77, "\x01"], "\xb1" => [18, "\x01"], "\xb2" => [77, "\x87"], "\xb3" => [18, "\x87"], "\xb4" => [77, "\x89"], "\xb5" => [18, "\x89"], "\xb6" => [77, "\x8a"], "\xb7" => [18, "\x8a"], "\xb8" => [77, "\x8b"], "\xb9" => [18, "\x8b"], "\xba" => [77, "\x8c"], "\xbb" => [18, "\x8c"], "\xbc" => [77, "\x8d"], "\xbd" => [18, "\x8d"], "\xbe" => [77, "\x8f"], "\xbf" => [18, "\x8f"], "\xc0" => [77, "\x93"], "\xc1" => [18, "\x93"], "\xc2" => [77, "\x95"], "\xc3" => [18, "\x95"], "\xc4" => [77, "\x96"], "\xc5" => [18, "\x96"], "\xc6" => [77, "\x97"], "\xc7" => [18, "\x97"], "\xc8" => [77, "\x98"], "\xc9" => [18, "\x98"], "\xca" => [77, "\x9b"], "\xcb" => [18, "\x9b"], "\xcc" => [77, "\x9d"], "\xcd" => [18, "\x9d"], "\xce" => [77, "\x9e"], "\xcf" => [18, "\x9e"], "\xd0" => [77, "\xa5"], "\xd1" => [18, "\xa5"], "\xd2" => [77, "\xa6"], "\xd3" => [18, "\xa6"], "\xd4" => [77, "\xa8"], "\xd5" => [18, "\xa8"], "\xd6" => [77, "\xae"], "\xd7" => [18, "\xae"], "\xd8" => [77, "\xaf"], "\xd9" => [18, "\xaf"], "\xda" => [77, "\xb4"], "\xdb" => [18, "\xb4"], "\xdc" => [77, "\xb6"], "\xdd" => [18, "\xb6"], "\xde" => [77, "\xb7"], "\xdf" => [18, "\xb7"], "\xe0" => [77, "\xbc"], "\xe1" => [18, "\xbc"], "\xe2" => [77, "\xbf"], "\xe3" => [18, "\xbf"], "\xe4" => [77, "\xc5"], "\xe5" => [18, "\xc5"], "\xe6" => [77, "\xe7"], "\xe7" => [18, "\xe7"], "\xe8" => [77, "\xef"], "\xe9" => [18, "\xef"], "\xea" => [0, "\t"], "\xeb" => [0, "\x8e"], "\xec" => [0, "\x90"], "\xed" => [0, "\x91"], "\xee" => [0, "\x94"], "\xef" => [0, "\x9f"], "\xf0" => [0, "\xab"], "\xf1" => [0, "\xce"], "\xf2" => [0, "\xd7"], "\xf3" => [0, "\xe1"], "\xf4" => [0, "\xec"], "\xf5" => [0, "\xed"], "\xf6" => [225, null], "\xf7" => [251, null], "\xf8" => [218, null], "\xf9" => [229, null], "\xfa" => [244, null], "\xfb" => [231, null], "\xfc" => [236, null], "\xfd" => [256, null], "\xfe" => [32, null], "\xff" => [52, null]], ["\x00" => [92, "\\"], "\x01" => [95, "\\"], "\x02" => [137, "\\"], "\x03" => [142, "\\"], "\x04" => [150, "\\"], "\x05" => [74, "\\"], "\x06" => [90, "\\"], "\x07" => [98, "\\"], "\x08" => [107, "\\"], "\t" => [140, "\\"], "\n" => [146, "\\"], "\v" => [102, "\\"], "\f" => [113, "\\"], "\r" => [121, "\\"], "\x0e" => [128, "\\"], "\x0f" => [12, "\\"], "\x10" => [92, "\xc3"], "\x11" => [95, "\xc3"], "\x12" => [137, "\xc3"], "\x13" => [142, "\xc3"], "\x14" => [150, "\xc3"], "\x15" => [74, "\xc3"], "\x16" => [90, "\xc3"], "\x17" => [98, "\xc3"], "\x18" => [107, "\xc3"], "\x19" => [140, "\xc3"], "\x1a" => [146, "\xc3"], "\x1b" => [102, "\xc3"], "\x1c" => [113, "\xc3"], "\x1d" => [121, "\xc3"], "\x1e" => [128, "\xc3"], "\x1f" => [12, "\xc3"], " " => [92, "\xd0"], "!" => [95, "\xd0"], "\"" => [137, "\xd0"], "#" => [142, "\xd0"], "\$" => [150, "\xd0"], "%" => [74, "\xd0"], "&" => [90, "\xd0"], "'" => [98, "\xd0"], "(" => [107, "\xd0"], ")" => [140, "\xd0"], "*" => [146, "\xd0"], "+" => [102, "\xd0"], "," => [113, "\xd0"], "-" => [121, "\xd0"], "." => [128, "\xd0"], "/" => [12, "\xd0"], [93, "\x80"], [138, "\x80"], [75, "\x80"], [91, "\x80"], [108, "\x80"], [103, "\x80"], [114, "\x80"], [14, "\x80"], [93, "\x82"], [138, "\x82"], ":" => [75, "\x82"], ";" => [91, "\x82"], "<" => [108, "\x82"], "=" => [103, "\x82"], ">" => [114, "\x82"], "?" => [14, "\x82"], "@" => [93, "\x83"], "A" => [138, "\x83"], "B" => [75, "\x83"], "C" => [91, "\x83"], "D" => [108, "\x83"], "E" => [103, "\x83"], "F" => [114, "\x83"], "G" => [14, "\x83"], "H" => [93, "\xa2"], "I" => [138, "\xa2"], "J" => [75, "\xa2"], "K" => [91, "\xa2"], "L" => [108, "\xa2"], "M" => [103, "\xa2"], "N" => [114, "\xa2"], "O" => [14, "\xa2"], "P" => [93, "\xb8"], "Q" => [138, "\xb8"], "R" => [75, "\xb8"], "S" => [91, "\xb8"], "T" => [108, "\xb8"], "U" => [103, "\xb8"], "V" => [114, "\xb8"], "W" => [14, "\xb8"], "X" => [93, "\xc2"], "Y" => [138, "\xc2"], "Z" => [75, "\xc2"], "[" => [91, "\xc2"], "\\" => [108, "\xc2"], "]" => [103, "\xc2"], "^" => [114, "\xc2"], "_" => [14, "\xc2"], "`" => [93, "\xe0"], "a" => [138, "\xe0"], "b" => [75, "\xe0"], "c" => [91, "\xe0"], "d" => [108, "\xe0"], "e" => [103, "\xe0"], "f" => [114, "\xe0"], "g" => [14, "\xe0"], "h" => [93, "\xe2"], "i" => [138, "\xe2"], "j" => [75, "\xe2"], "k" => [91, "\xe2"], "l" => [108, "\xe2"], "m" => [103, "\xe2"], "n" => [114, "\xe2"], "o" => [14, "\xe2"], "p" => [94, "\x99"], "q" => [76, "\x99"], "r" => [104, "\x99"], "s" => [16, "\x99"], "t" => [94, "\xa1"], "u" => [76, "\xa1"], "v" => [104, "\xa1"], "w" => [16, "\xa1"], "x" => [94, "\xa7"], "y" => [76, "\xa7"], "z" => [104, "\xa7"], "{" => [16, "\xa7"], "|" => [94, "\xac"], "}" => [76, "\xac"], "~" => [104, "\xac"], "" => [16, "\xac"], "\x80" => [94, "\xb0"], "\x81" => [76, "\xb0"], "\x82" => [104, "\xb0"], "\x83" => [16, "\xb0"], "\x84" => [94, "\xb1"], "\x85" => [76, "\xb1"], "\x86" => [104, "\xb1"], "\x87" => [16, "\xb1"], "\x88" => [94, "\xb3"], "\x89" => [76, "\xb3"], "\x8a" => [104, "\xb3"], "\x8b" => [16, "\xb3"], "\x8c" => [94, "\xd1"], "\x8d" => [76, "\xd1"], "\x8e" => [104, "\xd1"], "\x8f" => [16, "\xd1"], "\x90" => [94, "\xd8"], "\x91" => [76, "\xd8"], "\x92" => [104, "\xd8"], "\x93" => [16, "\xd8"], "\x94" => [94, "\xd9"], "\x95" => [76, "\xd9"], "\x96" => [104, "\xd9"], "\x97" => [16, "\xd9"], "\x98" => [94, "\xe3"], "\x99" => [76, "\xe3"], "\x9a" => [104, "\xe3"], "\x9b" => [16, "\xe3"], "\x9c" => [94, "\xe5"], "\x9d" => [76, "\xe5"], "\x9e" => [104, "\xe5"], "\x9f" => [16, "\xe5"], "\xa0" => [94, "\xe6"], "\xa1" => [76, "\xe6"], "\xa2" => [104, "\xe6"], "\xa3" => [16, "\xe6"], "\xa4" => [77, "\x81"], "\xa5" => [18, "\x81"], "\xa6" => [77, "\x84"], "\xa7" => [18, "\x84"], "\xa8" => [77, "\x85"], "\xa9" => [18, "\x85"], "\xaa" => [77, "\x86"], "\xab" => [18, "\x86"], "\xac" => [77, "\x88"], "\xad" => [18, "\x88"], "\xae" => [77, "\x92"], "\xaf" => [18, "\x92"], "\xb0" => [77, "\x9a"], "\xb1" => [18, "\x9a"], "\xb2" => [77, "\x9c"], "\xb3" => [18, "\x9c"], "\xb4" => [77, "\xa0"], "\xb5" => [18, "\xa0"], "\xb6" => [77, "\xa3"], "\xb7" => [18, "\xa3"], "\xb8" => [77, "\xa4"], "\xb9" => [18, "\xa4"], "\xba" => [77, "\xa9"], "\xbb" => [18, "\xa9"], "\xbc" => [77, "\xaa"], "\xbd" => [18, "\xaa"], "\xbe" => [77, "\xad"], "\xbf" => [18, "\xad"], "\xc0" => [77, "\xb2"], "\xc1" => [18, "\xb2"], "\xc2" => [77, "\xb5"], "\xc3" => [18, "\xb5"], "\xc4" => [77, "\xb9"], "\xc5" => [18, "\xb9"], "\xc6" => [77, "\xba"], "\xc7" => [18, "\xba"], "\xc8" => [77, "\xbb"], "\xc9" => [18, "\xbb"], "\xca" => [77, "\xbd"], "\xcb" => [18, "\xbd"], "\xcc" => [77, "\xbe"], "\xcd" => [18, "\xbe"], "\xce" => [77, "\xc4"], "\xcf" => [18, "\xc4"], "\xd0" => [77, "\xc6"], "\xd1" => [18, "\xc6"], "\xd2" => [77, "\xe4"], "\xd3" => [18, "\xe4"], "\xd4" => [77, "\xe8"], "\xd5" => [18, "\xe8"], "\xd6" => [77, "\xe9"], "\xd7" => [18, "\xe9"], "\xd8" => [0, "\x01"], "\xd9" => [0, "\x87"], "\xda" => [0, "\x89"], "\xdb" => [0, "\x8a"], "\xdc" => [0, "\x8b"], "\xdd" => [0, "\x8c"], "\xde" => [0, "\x8d"], "\xdf" => [0, "\x8f"], "\xe0" => [0, "\x93"], "\xe1" => [0, "\x95"], "\xe2" => [0, "\x96"], "\xe3" => [0, "\x97"], "\xe4" => [0, "\x98"], "\xe5" => [0, "\x9b"], "\xe6" => [0, "\x9d"], "\xe7" => [0, "\x9e"], "\xe8" => [0, "\xa5"], "\xe9" => [0, "\xa6"], "\xea" => [0, "\xa8"], "\xeb" => [0, "\xae"], "\xec" => [0, "\xaf"], "\xed" => [0, "\xb4"], "\xee" => [0, "\xb6"], "\xef" => [0, "\xb7"], "\xf0" => [0, "\xbc"], "\xf1" => [0, "\xbf"], "\xf2" => [0, "\xc5"], "\xf3" => [0, "\xe7"], "\xf4" => [0, "\xef"], "\xf5" => [48, null], "\xf6" => [172, null], "\xf7" => [178, null], "\xf8" => [198, null], "\xf9" => [241, null], "\xfa" => [252, null], "\xfb" => [226, null], "\xfc" => [219, null], "\xfd" => [232, null], "\xfe" => [237, null], "\xff" => [33, null]], ["\x00" => [94, "{0"], "\x01" => [76, "{0"], "\x02" => [104, "{0"], "\x03" => [16, "{0"], "\x04" => [94, "{1"], "\x05" => [76, "{1"], "\x06" => [104, "{1"], "\x07" => [16, "{1"], "\x08" => [94, "{2"], "\t" => [76, "{2"], "\n" => [104, "{2"], "\v" => [16, "{2"], "\f" => [94, "{a"], "\r" => [76, "{a"], "\x0e" => [104, "{a"], "\x0f" => [16, "{a"], "\x10" => [94, "{c"], "\x11" => [76, "{c"], "\x12" => [104, "{c"], "\x13" => [16, "{c"], "\x14" => [94, "{e"], "\x15" => [76, "{e"], "\x16" => [104, "{e"], "\x17" => [16, "{e"], "\x18" => [94, "{i"], "\x19" => [76, "{i"], "\x1a" => [104, "{i"], "\x1b" => [16, "{i"], "\x1c" => [94, "{o"], "\x1d" => [76, "{o"], "\x1e" => [104, "{o"], "\x1f" => [16, "{o"], " " => [94, "{s"], "!" => [76, "{s"], "\"" => [104, "{s"], "#" => [16, "{s"], "\$" => [94, "{t"], "%" => [76, "{t"], "&" => [104, "{t"], "'" => [16, "{t"], "(" => [77, "{ "], ")" => [18, "{ "], "*" => [77, "{%"], "+" => [18, "{%"], "," => [77, "{-"], "-" => [18, "{-"], "." => [77, "{."], "/" => [18, "{."], [77, "{/"], [18, "{/"], [77, "{3"], [18, "{3"], [77, "{4"], [18, "{4"], [77, "{5"], [18, "{5"], [77, "{6"], [18, "{6"], ":" => [77, "{7"], ";" => [18, "{7"], "<" => [77, "{8"], "=" => [18, "{8"], ">" => [77, "{9"], "?" => [18, "{9"], "@" => [77, "{="], "A" => [18, "{="], "B" => [77, "{A"], "C" => [18, "{A"], "D" => [77, "{_"], "E" => [18, "{_"], "F" => [77, "{b"], "G" => [18, "{b"], "H" => [77, "{d"], "I" => [18, "{d"], "J" => [77, "{f"], "K" => [18, "{f"], "L" => [77, "{g"], "M" => [18, "{g"], "N" => [77, "{h"], "O" => [18, "{h"], "P" => [77, "{l"], "Q" => [18, "{l"], "R" => [77, "{m"], "S" => [18, "{m"], "T" => [77, "{n"], "U" => [18, "{n"], "V" => [77, "{p"], "W" => [18, "{p"], "X" => [77, "{r"], "Y" => [18, "{r"], "Z" => [77, "{u"], "[" => [18, "{u"], "\\" => [0, "{:"], "]" => [0, "{B"], "^" => [0, "{C"], "_" => [0, "{D"], "`" => [0, "{E"], "a" => [0, "{F"], "b" => [0, "{G"], "c" => [0, "{H"], "d" => [0, "{I"], "e" => [0, "{J"], "f" => [0, "{K"], "g" => [0, "{L"], "h" => [0, "{M"], "i" => [0, "{N"], "j" => [0, "{O"], "k" => [0, "{P"], "l" => [0, "{Q"], "m" => [0, "{R"], "n" => [0, "{S"], "o" => [0, "{T"], "p" => [0, "{U"], "q" => [0, "{V"], "r" => [0, "{W"], "s" => [0, "{Y"], "t" => [0, "{j"], "u" => [0, "{k"], "v" => [0, "{q"], "w" => [0, "{v"], "x" => [0, "{w"], "y" => [0, "{x"], "z" => [0, "{y"], "{" => [0, "{z"], "|" => [82, "{"], "}" => [87, "{"], "~" => [130, "{"], "" => [9, "{"], "\x80" => [93, "\\"], "\x81" => [138, "\\"], "\x82" => [75, "\\"], "\x83" => [91, "\\"], "\x84" => [108, "\\"], "\x85" => [103, "\\"], "\x86" => [114, "\\"], "\x87" => [14, "\\"], "\x88" => [93, "\xc3"], "\x89" => [138, "\xc3"], "\x8a" => [75, "\xc3"], "\x8b" => [91, "\xc3"], "\x8c" => [108, "\xc3"], "\x8d" => [103, "\xc3"], "\x8e" => [114, "\xc3"], "\x8f" => [14, "\xc3"], "\x90" => [93, "\xd0"], "\x91" => [138, "\xd0"], "\x92" => [75, "\xd0"], "\x93" => [91, "\xd0"], "\x94" => [108, "\xd0"], "\x95" => [103, "\xd0"], "\x96" => [114, "\xd0"], "\x97" => [14, "\xd0"], "\x98" => [94, "\x80"], "\x99" => [76, "\x80"], "\x9a" => [104, "\x80"], "\x9b" => [16, "\x80"], "\x9c" => [94, "\x82"], "\x9d" => [76, "\x82"], "\x9e" => [104, "\x82"], "\x9f" => [16, "\x82"], "\xa0" => [94, "\x83"], "\xa1" => [76, "\x83"], "\xa2" => [104, "\x83"], "\xa3" => [16, "\x83"], "\xa4" => [94, "\xa2"], "\xa5" => [76, "\xa2"], "\xa6" => [104, "\xa2"], "\xa7" => [16, "\xa2"], "\xa8" => [94, "\xb8"], "\xa9" => [76, "\xb8"], "\xaa" => [104, "\xb8"], "\xab" => [16, "\xb8"], "\xac" => [94, "\xc2"], "\xad" => [76, "\xc2"], "\xae" => [104, "\xc2"], "\xaf" => [16, "\xc2"], "\xb0" => [94, "\xe0"], "\xb1" => [76, "\xe0"], "\xb2" => [104, "\xe0"], "\xb3" => [16, "\xe0"], "\xb4" => [94, "\xe2"], "\xb5" => [76, "\xe2"], "\xb6" => [104, "\xe2"], "\xb7" => [16, "\xe2"], "\xb8" => [77, "\x99"], "\xb9" => [18, "\x99"], "\xba" => [77, "\xa1"], "\xbb" => [18, "\xa1"], "\xbc" => [77, "\xa7"], "\xbd" => [18, "\xa7"], "\xbe" => [77, "\xac"], "\xbf" => [18, "\xac"], "\xc0" => [77, "\xb0"], "\xc1" => [18, "\xb0"], "\xc2" => [77, "\xb1"], "\xc3" => [18, "\xb1"], "\xc4" => [77, "\xb3"], "\xc5" => [18, "\xb3"], "\xc6" => [77, "\xd1"], "\xc7" => [18, "\xd1"], "\xc8" => [77, "\xd8"], "\xc9" => [18, "\xd8"], "\xca" => [77, "\xd9"], "\xcb" => [18, "\xd9"], "\xcc" => [77, "\xe3"], "\xcd" => [18, "\xe3"], "\xce" => [77, "\xe5"], "\xcf" => [18, "\xe5"], "\xd0" => [77, "\xe6"], "\xd1" => [18, "\xe6"], "\xd2" => [0, "\x81"], "\xd3" => [0, "\x84"], "\xd4" => [0, "\x85"], "\xd5" => [0, "\x86"], "\xd6" => [0, "\x88"], "\xd7" => [0, "\x92"], "\xd8" => [0, "\x9a"], "\xd9" => [0, "\x9c"], "\xda" => [0, "\xa0"], "\xdb" => [0, "\xa3"], "\xdc" => [0, "\xa4"], "\xdd" => [0, "\xa9"], "\xde" => [0, "\xaa"], "\xdf" => [0, "\xad"], "\xe0" => [0, "\xb2"], "\xe1" => [0, "\xb5"], "\xe2" => [0, "\xb9"], "\xe3" => [0, "\xba"], "\xe4" => [0, "\xbb"], "\xe5" => [0, "\xbd"], "\xe6" => [0, "\xbe"], "\xe7" => [0, "\xc4"], "\xe8" => [0, "\xc6"], "\xe9" => [0, "\xe4"], "\xea" => [0, "\xe8"], "\xeb" => [0, "\xe9"], "\xec" => [23, null], "\xed" => [168, null], "\xee" => [169, null], "\xef" => [171, null], "\xf0" => [174, null], "\xf1" => [179, null], "\xf2" => [180, null], "\xf3" => [188, null], "\xf4" => [192, null], "\xf5" => [196, null], "\xf6" => [201, null], "\xf7" => [210, null], "\xf8" => [215, null], "\xf9" => [222, null], "\xfa" => [49, null], "\xfb" => [173, null], "\xfc" => [199, null], "\xfd" => [227, null], "\xfe" => [220, null], "\xff" => [34, null]], ["\x00" => [94, "\x010"], "\x01" => [76, "\x010"], "\x02" => [104, "\x010"], "\x03" => [16, "\x010"], "\x04" => [94, "\x011"], "\x05" => [76, "\x011"], "\x06" => [104, "\x011"], "\x07" => [16, "\x011"], "\x08" => [94, "\x012"], "\t" => [76, "\x012"], "\n" => [104, "\x012"], "\v" => [16, "\x012"], "\f" => [94, "\x01a"], "\r" => [76, "\x01a"], "\x0e" => [104, "\x01a"], "\x0f" => [16, "\x01a"], "\x10" => [94, "\x01c"], "\x11" => [76, "\x01c"], "\x12" => [104, "\x01c"], "\x13" => [16, "\x01c"], "\x14" => [94, "\x01e"], "\x15" => [76, "\x01e"], "\x16" => [104, "\x01e"], "\x17" => [16, "\x01e"], "\x18" => [94, "\x01i"], "\x19" => [76, "\x01i"], "\x1a" => [104, "\x01i"], "\x1b" => [16, "\x01i"], "\x1c" => [94, "\x01o"], "\x1d" => [76, "\x01o"], "\x1e" => [104, "\x01o"], "\x1f" => [16, "\x01o"], " " => [94, "\x01s"], "!" => [76, "\x01s"], "\"" => [104, "\x01s"], "#" => [16, "\x01s"], "\$" => [94, "\x01t"], "%" => [76, "\x01t"], "&" => [104, "\x01t"], "'" => [16, "\x01t"], "(" => [77, "\x01 "], ")" => [18, "\x01 "], "*" => [77, "\x01%"], "+" => [18, "\x01%"], "," => [77, "\x01-"], "-" => [18, "\x01-"], "." => [77, "\x01."], "/" => [18, "\x01."], [77, "\x01/"], [18, "\x01/"], [77, "\x013"], [18, "\x013"], [77, "\x014"], [18, "\x014"], [77, "\x015"], [18, "\x015"], [77, "\x016"], [18, "\x016"], ":" => [77, "\x017"], ";" => [18, "\x017"], "<" => [77, "\x018"], "=" => [18, "\x018"], ">" => [77, "\x019"], "?" => [18, "\x019"], "@" => [77, "\x01="], "A" => [18, "\x01="], "B" => [77, "\x01A"], "C" => [18, "\x01A"], "D" => [77, "\x01_"], "E" => [18, "\x01_"], "F" => [77, "\x01b"], "G" => [18, "\x01b"], "H" => [77, "\x01d"], "I" => [18, "\x01d"], "J" => [77, "\x01f"], "K" => [18, "\x01f"], "L" => [77, "\x01g"], "M" => [18, "\x01g"], "N" => [77, "\x01h"], "O" => [18, "\x01h"], "P" => [77, "\x01l"], "Q" => [18, "\x01l"], "R" => [77, "\x01m"], "S" => [18, "\x01m"], "T" => [77, "\x01n"], "U" => [18, "\x01n"], "V" => [77, "\x01p"], "W" => [18, "\x01p"], "X" => [77, "\x01r"], "Y" => [18, "\x01r"], "Z" => [77, "\x01u"], "[" => [18, "\x01u"], "\\" => [0, "\x01:"], "]" => [0, "\x01B"], "^" => [0, "\x01C"], "_" => [0, "\x01D"], "`" => [0, "\x01E"], "a" => [0, "\x01F"], "b" => [0, "\x01G"], "c" => [0, "\x01H"], "d" => [0, "\x01I"], "e" => [0, "\x01J"], "f" => [0, "\x01K"], "g" => [0, "\x01L"], "h" => [0, "\x01M"], "i" => [0, "\x01N"], "j" => [0, "\x01O"], "k" => [0, "\x01P"], "l" => [0, "\x01Q"], "m" => [0, "\x01R"], "n" => [0, "\x01S"], "o" => [0, "\x01T"], "p" => [0, "\x01U"], "q" => [0, "\x01V"], "r" => [0, "\x01W"], "s" => [0, "\x01Y"], "t" => [0, "\x01j"], "u" => [0, "\x01k"], "v" => [0, "\x01q"], "w" => [0, "\x01v"], "x" => [0, "\x01w"], "y" => [0, "\x01x"], "z" => [0, "\x01y"], "{" => [0, "\x01z"], "|" => [82, "\x01"], "}" => [87, "\x01"], "~" => [130, "\x01"], "" => [9, "\x01"], "\x80" => [94, "\x870"], "\x81" => [76, "\x870"], "\x82" => [104, "\x870"], "\x83" => [16, "\x870"], "\x84" => [94, "\x871"], "\x85" => [76, "\x871"], "\x86" => [104, "\x871"], "\x87" => [16, "\x871"], "\x88" => [94, "\x872"], "\x89" => [76, "\x872"], "\x8a" => [104, "\x872"], "\x8b" => [16, "\x872"], "\x8c" => [94, "\x87a"], "\x8d" => [76, "\x87a"], "\x8e" => [104, "\x87a"], "\x8f" => [16, "\x87a"], "\x90" => [94, "\x87c"], "\x91" => [76, "\x87c"], "\x92" => [104, "\x87c"], "\x93" => [16, "\x87c"], "\x94" => [94, "\x87e"], "\x95" => [76, "\x87e"], "\x96" => [104, "\x87e"], "\x97" => [16, "\x87e"], "\x98" => [94, "\x87i"], "\x99" => [76, "\x87i"], "\x9a" => [104, "\x87i"], "\x9b" => [16, "\x87i"], "\x9c" => [94, "\x87o"], "\x9d" => [76, "\x87o"], "\x9e" => [104, "\x87o"], "\x9f" => [16, "\x87o"], "\xa0" => [94, "\x87s"], "\xa1" => [76, "\x87s"], "\xa2" => [104, "\x87s"], "\xa3" => [16, "\x87s"], "\xa4" => [94, "\x87t"], "\xa5" => [76, "\x87t"], "\xa6" => [104, "\x87t"], "\xa7" => [16, "\x87t"], "\xa8" => [77, "\x87 "], "\xa9" => [18, "\x87 "], "\xaa" => [77, "\x87%"], "\xab" => [18, "\x87%"], "\xac" => [77, "\x87-"], "\xad" => [18, "\x87-"], "\xae" => [77, "\x87."], "\xaf" => [18, "\x87."], "\xb0" => [77, "\x87/"], "\xb1" => [18, "\x87/"], "\xb2" => [77, "\x873"], "\xb3" => [18, "\x873"], "\xb4" => [77, "\x874"], "\xb5" => [18, "\x874"], "\xb6" => [77, "\x875"], "\xb7" => [18, "\x875"], "\xb8" => [77, "\x876"], "\xb9" => [18, "\x876"], "\xba" => [77, "\x877"], "\xbb" => [18, "\x877"], "\xbc" => [77, "\x878"], "\xbd" => [18, "\x878"], "\xbe" => [77, "\x879"], "\xbf" => [18, "\x879"], "\xc0" => [77, "\x87="], "\xc1" => [18, "\x87="], "\xc2" => [77, "\x87A"], "\xc3" => [18, "\x87A"], "\xc4" => [77, "\x87_"], "\xc5" => [18, "\x87_"], "\xc6" => [77, "\x87b"], "\xc7" => [18, "\x87b"], "\xc8" => [77, "\x87d"], "\xc9" => [18, "\x87d"], "\xca" => [77, "\x87f"], "\xcb" => [18, "\x87f"], "\xcc" => [77, "\x87g"], "\xcd" => [18, "\x87g"], "\xce" => [77, "\x87h"], "\xcf" => [18, "\x87h"], "\xd0" => [77, "\x87l"], "\xd1" => [18, "\x87l"], "\xd2" => [77, "\x87m"], "\xd3" => [18, "\x87m"], "\xd4" => [77, "\x87n"], "\xd5" => [18, "\x87n"], "\xd6" => [77, "\x87p"], "\xd7" => [18, "\x87p"], "\xd8" => [77, "\x87r"], "\xd9" => [18, "\x87r"], "\xda" => [77, "\x87u"], "\xdb" => [18, "\x87u"], "\xdc" => [0, "\x87:"], "\xdd" => [0, "\x87B"], "\xde" => [0, "\x87C"], "\xdf" => [0, "\x87D"], "\xe0" => [0, "\x87E"], "\xe1" => [0, "\x87F"], "\xe2" => [0, "\x87G"], "\xe3" => [0, "\x87H"], "\xe4" => [0, "\x87I"], "\xe5" => [0, "\x87J"], "\xe6" => [0, "\x87K"], "\xe7" => [0, "\x87L"], "\xe8" => [0, "\x87M"], "\xe9" => [0, "\x87N"], "\xea" => [0, "\x87O"], "\xeb" => [0, "\x87P"], "\xec" => [0, "\x87Q"], "\xed" => [0, "\x87R"], "\xee" => [0, "\x87S"], "\xef" => [0, "\x87T"], "\xf0" => [0, "\x87U"], "\xf1" => [0, "\x87V"], "\xf2" => [0, "\x87W"], "\xf3" => [0, "\x87Y"], "\xf4" => [0, "\x87j"], "\xf5" => [0, "\x87k"], "\xf6" => [0, "\x87q"], "\xf7" => [0, "\x87v"], "\xf8" => [0, "\x87w"], "\xf9" => [0, "\x87x"], "\xfa" => [0, "\x87y"], "\xfb" => [0, "\x87z"], "\xfc" => [82, "\x87"], "\xfd" => [87, "\x87"], "\xfe" => [130, "\x87"], "\xff" => [9, "\x87"]], ["\x00" => [77, "<0"], "\x01" => [18, "<0"], "\x02" => [77, "<1"], "\x03" => [18, "<1"], "\x04" => [77, "<2"], "\x05" => [18, "<2"], "\x06" => [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [0, "< "], "\x15" => [0, "<%"], "\x16" => [0, "<-"], "\x17" => [0, "<."], "\x18" => [0, " [0, "<3"], "\x1a" => [0, "<4"], "\x1b" => [0, "<5"], "\x1c" => [0, "<6"], "\x1d" => [0, "<7"], "\x1e" => [0, "<8"], "\x1f" => [0, "<9"], " " => [0, "<="], "!" => [0, " [0, "<_"], "#" => [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [100, "<"], "/" => [110, "<"], [111, "<"], [115, "<"], [116, "<"], [118, "<"], [119, "<"], [122, "<"], [123, "<"], [125, "<"], [126, "<"], [129, "<"], ":" => [143, "<"], ";" => [148, "<"], "<" => [151, "<"], "=" => [153, "<"], ">" => [83, "<"], "?" => [10, "<"], "@" => [77, "`0"], "A" => [18, "`0"], "B" => [77, "`1"], "C" => [18, "`1"], "D" => [77, "`2"], "E" => [18, "`2"], "F" => [77, "`a"], "G" => [18, "`a"], "H" => [77, "`c"], "I" => [18, "`c"], "J" => [77, "`e"], "K" => [18, "`e"], "L" => [77, "`i"], "M" => [18, "`i"], "N" => [77, "`o"], "O" => [18, "`o"], "P" => [77, "`s"], "Q" => [18, "`s"], "R" => [77, "`t"], "S" => [18, "`t"], "T" => [0, "` "], "U" => [0, "`%"], "V" => [0, "`-"], "W" => [0, "`."], "X" => [0, "`/"], "Y" => [0, "`3"], "Z" => [0, "`4"], "[" => [0, "`5"], "\\" => [0, "`6"], "]" => [0, "`7"], "^" => [0, "`8"], "_" => [0, "`9"], "`" => [0, "`="], "a" => [0, "`A"], "b" => [0, "`_"], "c" => [0, "`b"], "d" => [0, "`d"], "e" => [0, "`f"], "f" => [0, "`g"], "g" => [0, "`h"], "h" => [0, "`l"], "i" => [0, "`m"], "j" => [0, "`n"], "k" => [0, "`p"], "l" => [0, "`r"], "m" => [0, "`u"], "n" => [100, "`"], "o" => [110, "`"], "p" => [111, "`"], "q" => [115, "`"], "r" => [116, "`"], "s" => [118, "`"], "t" => [119, "`"], "u" => [122, "`"], "v" => [123, "`"], "w" => [125, "`"], "x" => [126, "`"], "y" => [129, "`"], "z" => [143, "`"], "{" => [148, "`"], "|" => [151, "`"], "}" => [153, "`"], "~" => [83, "`"], "" => [10, "`"], "\x80" => [77, "{0"], "\x81" => [18, "{0"], "\x82" => [77, "{1"], "\x83" => [18, "{1"], "\x84" => [77, "{2"], "\x85" => [18, "{2"], "\x86" => [77, "{a"], "\x87" => [18, "{a"], "\x88" => [77, "{c"], "\x89" => [18, "{c"], "\x8a" => [77, "{e"], "\x8b" => [18, "{e"], "\x8c" => [77, "{i"], "\x8d" => [18, "{i"], "\x8e" => [77, "{o"], "\x8f" => [18, "{o"], "\x90" => [77, "{s"], "\x91" => [18, "{s"], "\x92" => [77, "{t"], "\x93" => [18, "{t"], "\x94" => [0, "{ "], "\x95" => [0, "{%"], "\x96" => [0, "{-"], "\x97" => [0, "{."], "\x98" => [0, "{/"], "\x99" => [0, "{3"], "\x9a" => [0, "{4"], "\x9b" => [0, "{5"], "\x9c" => [0, "{6"], "\x9d" => [0, "{7"], "\x9e" => [0, "{8"], "\x9f" => [0, "{9"], "\xa0" => [0, "{="], "\xa1" => [0, "{A"], "\xa2" => [0, "{_"], "\xa3" => [0, "{b"], "\xa4" => [0, "{d"], "\xa5" => [0, "{f"], "\xa6" => [0, "{g"], "\xa7" => [0, "{h"], "\xa8" => [0, "{l"], "\xa9" => [0, "{m"], "\xaa" => [0, "{n"], "\xab" => [0, "{p"], "\xac" => [0, "{r"], "\xad" => [0, "{u"], "\xae" => [100, "{"], "\xaf" => [110, "{"], "\xb0" => [111, "{"], "\xb1" => [115, "{"], "\xb2" => [116, "{"], "\xb3" => [118, "{"], "\xb4" => [119, "{"], "\xb5" => [122, "{"], "\xb6" => [123, "{"], "\xb7" => [125, "{"], "\xb8" => [126, "{"], "\xb9" => [129, "{"], "\xba" => [143, "{"], "\xbb" => [148, "{"], "\xbc" => [151, "{"], "\xbd" => [153, "{"], "\xbe" => [83, "{"], "\xbf" => [10, "{"], "\xc0" => [94, "\\"], "\xc1" => [76, "\\"], "\xc2" => [104, "\\"], "\xc3" => [16, "\\"], "\xc4" => [94, "\xc3"], "\xc5" => [76, "\xc3"], "\xc6" => [104, "\xc3"], "\xc7" => [16, "\xc3"], "\xc8" => [94, "\xd0"], "\xc9" => [76, "\xd0"], "\xca" => [104, "\xd0"], "\xcb" => [16, "\xd0"], "\xcc" => [77, "\x80"], "\xcd" => [18, "\x80"], "\xce" => [77, "\x82"], "\xcf" => [18, "\x82"], "\xd0" => [77, "\x83"], "\xd1" => [18, "\x83"], "\xd2" => [77, "\xa2"], "\xd3" => [18, "\xa2"], "\xd4" => [77, "\xb8"], "\xd5" => [18, "\xb8"], "\xd6" => [77, "\xc2"], "\xd7" => [18, "\xc2"], "\xd8" => [77, "\xe0"], "\xd9" => [18, "\xe0"], "\xda" => [77, "\xe2"], "\xdb" => [18, "\xe2"], "\xdc" => [0, "\x99"], "\xdd" => [0, "\xa1"], "\xde" => [0, "\xa7"], "\xdf" => [0, "\xac"], "\xe0" => [0, "\xb0"], "\xe1" => [0, "\xb1"], "\xe2" => [0, "\xb3"], "\xe3" => [0, "\xd1"], "\xe4" => [0, "\xd8"], "\xe5" => [0, "\xd9"], "\xe6" => [0, "\xe3"], "\xe7" => [0, "\xe5"], "\xe8" => [0, "\xe6"], "\xe9" => [157, null], "\xea" => [165, null], "\xeb" => [167, null], "\xec" => [185, null], "\xed" => [189, null], "\xee" => [190, null], "\xef" => [197, null], "\xf0" => [206, null], "\xf1" => [212, null], "\xf2" => [213, null], "\xf3" => [217, null], "\xf4" => [223, null], "\xf5" => [250, null], "\xf6" => [25, null], "\xf7" => [170, null], "\xf8" => [175, null], "\xf9" => [181, null], "\xfa" => [193, null], "\xfb" => [202, null], "\xfc" => [216, null], "\xfd" => [50, null], "\xfe" => [200, null], "\xff" => [35, null]], ["\x00" => [77, "\x010"], "\x01" => [18, "\x010"], "\x02" => [77, "\x011"], "\x03" => [18, "\x011"], "\x04" => [77, "\x012"], "\x05" => [18, "\x012"], "\x06" => [77, "\x01a"], "\x07" => [18, "\x01a"], "\x08" => [77, "\x01c"], "\t" => [18, "\x01c"], "\n" => [77, "\x01e"], "\v" => [18, "\x01e"], "\f" => [77, "\x01i"], "\r" => [18, "\x01i"], "\x0e" => [77, "\x01o"], "\x0f" => [18, "\x01o"], "\x10" => [77, "\x01s"], "\x11" => [18, "\x01s"], "\x12" => [77, "\x01t"], "\x13" => [18, "\x01t"], "\x14" => [0, "\x01 "], "\x15" => [0, "\x01%"], "\x16" => [0, "\x01-"], "\x17" => [0, "\x01."], "\x18" => [0, "\x01/"], "\x19" => [0, "\x013"], "\x1a" => [0, "\x014"], "\x1b" => [0, "\x015"], "\x1c" => [0, "\x016"], "\x1d" => [0, "\x017"], "\x1e" => [0, "\x018"], "\x1f" => [0, "\x019"], " " => [0, "\x01="], "!" => [0, "\x01A"], "\"" => [0, "\x01_"], "#" => [0, "\x01b"], "\$" => [0, "\x01d"], "%" => [0, "\x01f"], "&" => [0, "\x01g"], "'" => [0, "\x01h"], "(" => [0, "\x01l"], ")" => [0, "\x01m"], "*" => [0, "\x01n"], "+" => [0, "\x01p"], "," => [0, "\x01r"], "-" => [0, "\x01u"], "." => [100, "\x01"], "/" => [110, "\x01"], [111, "\x01"], [115, "\x01"], [116, "\x01"], [118, "\x01"], [119, "\x01"], [122, "\x01"], [123, "\x01"], [125, "\x01"], [126, "\x01"], [129, "\x01"], ":" => [143, "\x01"], ";" => [148, "\x01"], "<" => [151, "\x01"], "=" => [153, "\x01"], ">" => [83, "\x01"], "?" => [10, "\x01"], "@" => [77, "\x870"], "A" => [18, "\x870"], "B" => [77, "\x871"], "C" => [18, "\x871"], "D" => [77, "\x872"], "E" => [18, "\x872"], "F" => [77, "\x87a"], "G" => [18, "\x87a"], "H" => [77, "\x87c"], "I" => [18, "\x87c"], "J" => [77, "\x87e"], "K" => [18, "\x87e"], "L" => [77, "\x87i"], "M" => [18, "\x87i"], "N" => [77, "\x87o"], "O" => [18, "\x87o"], "P" => [77, "\x87s"], "Q" => [18, "\x87s"], "R" => [77, "\x87t"], "S" => [18, "\x87t"], "T" => [0, "\x87 "], "U" => [0, "\x87%"], "V" => [0, "\x87-"], "W" => [0, "\x87."], "X" => [0, "\x87/"], "Y" => [0, "\x873"], "Z" => [0, "\x874"], "[" => [0, "\x875"], "\\" => [0, "\x876"], "]" => [0, "\x877"], "^" => [0, "\x878"], "_" => [0, "\x879"], "`" => [0, "\x87="], "a" => [0, "\x87A"], "b" => [0, "\x87_"], "c" => [0, "\x87b"], "d" => [0, "\x87d"], "e" => [0, "\x87f"], "f" => [0, "\x87g"], "g" => [0, "\x87h"], "h" => [0, "\x87l"], "i" => [0, "\x87m"], "j" => [0, "\x87n"], "k" => [0, "\x87p"], "l" => [0, "\x87r"], "m" => [0, "\x87u"], "n" => [100, "\x87"], "o" => [110, "\x87"], "p" => [111, "\x87"], "q" => [115, "\x87"], "r" => [116, "\x87"], "s" => [118, "\x87"], "t" => [119, "\x87"], "u" => [122, "\x87"], "v" => [123, "\x87"], "w" => [125, "\x87"], "x" => [126, "\x87"], "y" => [129, "\x87"], "z" => [143, "\x87"], "{" => [148, "\x87"], "|" => [151, "\x87"], "}" => [153, "\x87"], "~" => [83, "\x87"], "" => [10, "\x87"], "\x80" => [77, "\x890"], "\x81" => [18, "\x890"], "\x82" => [77, "\x891"], "\x83" => [18, "\x891"], "\x84" => [77, "\x892"], "\x85" => [18, "\x892"], "\x86" => [77, "\x89a"], "\x87" => [18, "\x89a"], "\x88" => [77, "\x89c"], "\x89" => [18, "\x89c"], "\x8a" => [77, "\x89e"], "\x8b" => [18, "\x89e"], "\x8c" => [77, "\x89i"], "\x8d" => [18, "\x89i"], "\x8e" => [77, "\x89o"], "\x8f" => [18, "\x89o"], "\x90" => [77, "\x89s"], "\x91" => [18, "\x89s"], "\x92" => [77, "\x89t"], "\x93" => [18, "\x89t"], "\x94" => [0, "\x89 "], "\x95" => [0, "\x89%"], "\x96" => [0, "\x89-"], "\x97" => [0, "\x89."], "\x98" => [0, "\x89/"], "\x99" => [0, "\x893"], "\x9a" => [0, "\x894"], "\x9b" => [0, "\x895"], "\x9c" => [0, "\x896"], "\x9d" => [0, "\x897"], "\x9e" => [0, "\x898"], "\x9f" => [0, "\x899"], "\xa0" => [0, "\x89="], "\xa1" => [0, "\x89A"], "\xa2" => [0, "\x89_"], "\xa3" => [0, "\x89b"], "\xa4" => [0, "\x89d"], "\xa5" => [0, "\x89f"], "\xa6" => [0, "\x89g"], "\xa7" => [0, "\x89h"], "\xa8" => [0, "\x89l"], "\xa9" => [0, "\x89m"], "\xaa" => [0, "\x89n"], "\xab" => [0, "\x89p"], "\xac" => [0, "\x89r"], "\xad" => [0, "\x89u"], "\xae" => [100, "\x89"], "\xaf" => [110, "\x89"], "\xb0" => [111, "\x89"], "\xb1" => [115, "\x89"], "\xb2" => [116, "\x89"], "\xb3" => [118, "\x89"], "\xb4" => [119, "\x89"], "\xb5" => [122, "\x89"], "\xb6" => [123, "\x89"], "\xb7" => [125, "\x89"], "\xb8" => [126, "\x89"], "\xb9" => [129, "\x89"], "\xba" => [143, "\x89"], "\xbb" => [148, "\x89"], "\xbc" => [151, "\x89"], "\xbd" => [153, "\x89"], "\xbe" => [83, "\x89"], "\xbf" => [10, "\x89"], "\xc0" => [77, "\x8a0"], "\xc1" => [18, "\x8a0"], "\xc2" => [77, "\x8a1"], "\xc3" => [18, "\x8a1"], "\xc4" => [77, "\x8a2"], "\xc5" => [18, "\x8a2"], "\xc6" => [77, "\x8aa"], "\xc7" => [18, "\x8aa"], "\xc8" => [77, "\x8ac"], "\xc9" => [18, "\x8ac"], "\xca" => [77, "\x8ae"], "\xcb" => [18, "\x8ae"], "\xcc" => [77, "\x8ai"], "\xcd" => [18, "\x8ai"], "\xce" => [77, "\x8ao"], "\xcf" => [18, "\x8ao"], "\xd0" => [77, "\x8as"], "\xd1" => [18, "\x8as"], "\xd2" => [77, "\x8at"], "\xd3" => [18, "\x8at"], "\xd4" => [0, "\x8a "], "\xd5" => [0, "\x8a%"], "\xd6" => [0, "\x8a-"], "\xd7" => [0, "\x8a."], "\xd8" => [0, "\x8a/"], "\xd9" => [0, "\x8a3"], "\xda" => [0, "\x8a4"], "\xdb" => [0, "\x8a5"], "\xdc" => [0, "\x8a6"], "\xdd" => [0, "\x8a7"], "\xde" => [0, "\x8a8"], "\xdf" => [0, "\x8a9"], "\xe0" => [0, "\x8a="], "\xe1" => [0, "\x8aA"], "\xe2" => [0, "\x8a_"], "\xe3" => [0, "\x8ab"], "\xe4" => [0, "\x8ad"], "\xe5" => [0, "\x8af"], "\xe6" => [0, "\x8ag"], "\xe7" => [0, "\x8ah"], "\xe8" => [0, "\x8al"], "\xe9" => [0, "\x8am"], "\xea" => [0, "\x8an"], "\xeb" => [0, "\x8ap"], "\xec" => [0, "\x8ar"], "\xed" => [0, "\x8au"], "\xee" => [100, "\x8a"], "\xef" => [110, "\x8a"], "\xf0" => [111, "\x8a"], "\xf1" => [115, "\x8a"], "\xf2" => [116, "\x8a"], "\xf3" => [118, "\x8a"], "\xf4" => [119, "\x8a"], "\xf5" => [122, "\x8a"], "\xf6" => [123, "\x8a"], "\xf7" => [125, "\x8a"], "\xf8" => [126, "\x8a"], "\xf9" => [129, "\x8a"], "\xfa" => [143, "\x8a"], "\xfb" => [148, "\x8a"], "\xfc" => [151, "\x8a"], "\xfd" => [153, "\x8a"], "\xfe" => [83, "\x8a"], "\xff" => [10, "\x8a"]], ["\x00" => [77, "^0"], "\x01" => [18, "^0"], "\x02" => [77, "^1"], "\x03" => [18, "^1"], "\x04" => [77, "^2"], "\x05" => [18, "^2"], "\x06" => [77, "^a"], "\x07" => [18, "^a"], "\x08" => [77, "^c"], "\t" => [18, "^c"], "\n" => [77, "^e"], "\v" => [18, "^e"], "\f" => [77, "^i"], "\r" => [18, "^i"], "\x0e" => [77, "^o"], "\x0f" => [18, "^o"], "\x10" => [77, "^s"], "\x11" => [18, "^s"], "\x12" => [77, "^t"], "\x13" => [18, "^t"], "\x14" => [0, "^ "], "\x15" => [0, "^%"], "\x16" => [0, "^-"], "\x17" => [0, "^."], "\x18" => [0, "^/"], "\x19" => [0, "^3"], "\x1a" => [0, "^4"], "\x1b" => [0, "^5"], "\x1c" => [0, "^6"], "\x1d" => [0, "^7"], "\x1e" => [0, "^8"], "\x1f" => [0, "^9"], " " => [0, "^="], "!" => [0, "^A"], "\"" => [0, "^_"], "#" => [0, "^b"], "\$" => [0, "^d"], "%" => [0, "^f"], "&" => [0, "^g"], "'" => [0, "^h"], "(" => [0, "^l"], ")" => [0, "^m"], "*" => [0, "^n"], "+" => [0, "^p"], "," => [0, "^r"], "-" => [0, "^u"], "." => [100, "^"], "/" => [110, "^"], [111, "^"], [115, "^"], [116, "^"], [118, "^"], [119, "^"], [122, "^"], [123, "^"], [125, "^"], [126, "^"], [129, "^"], ":" => [143, "^"], ";" => [148, "^"], "<" => [151, "^"], "=" => [153, "^"], ">" => [83, "^"], "?" => [10, "^"], "@" => [77, "}0"], "A" => [18, "}0"], "B" => [77, "}1"], "C" => [18, "}1"], "D" => [77, "}2"], "E" => [18, "}2"], "F" => [77, "}a"], "G" => [18, "}a"], "H" => [77, "}c"], "I" => [18, "}c"], "J" => [77, "}e"], "K" => [18, "}e"], "L" => [77, "}i"], "M" => [18, "}i"], "N" => [77, "}o"], "O" => [18, "}o"], "P" => [77, "}s"], "Q" => [18, "}s"], "R" => [77, "}t"], "S" => [18, "}t"], "T" => [0, "} "], "U" => [0, "}%"], "V" => [0, "}-"], "W" => [0, "}."], "X" => [0, "}/"], "Y" => [0, "}3"], "Z" => [0, "}4"], "[" => [0, "}5"], "\\" => [0, "}6"], "]" => [0, "}7"], "^" => [0, "}8"], "_" => [0, "}9"], "`" => [0, "}="], "a" => [0, "}A"], "b" => [0, "}_"], "c" => [0, "}b"], "d" => [0, "}d"], "e" => [0, "}f"], "f" => [0, "}g"], "g" => [0, "}h"], "h" => [0, "}l"], "i" => [0, "}m"], "j" => [0, "}n"], "k" => [0, "}p"], "l" => [0, "}r"], "m" => [0, "}u"], "n" => [100, "}"], "o" => [110, "}"], "p" => [111, "}"], "q" => [115, "}"], "r" => [116, "}"], "s" => [118, "}"], "t" => [119, "}"], "u" => [122, "}"], "v" => [123, "}"], "w" => [125, "}"], "x" => [126, "}"], "y" => [129, "}"], "z" => [143, "}"], "{" => [148, "}"], "|" => [151, "}"], "}" => [153, "}"], "~" => [83, "}"], "" => [10, "}"], "\x80" => [0, "<0"], "\x81" => [0, "<1"], "\x82" => [0, "<2"], "\x83" => [0, " [0, " [0, " [0, " [0, " [0, " [0, " [73, "<"], "\x8b" => [88, "<"], "\x8c" => [89, "<"], "\x8d" => [96, "<"], "\x8e" => [97, "<"], "\x8f" => [99, "<"], "\x90" => [106, "<"], "\x91" => [136, "<"], "\x92" => [139, "<"], "\x93" => [141, "<"], "\x94" => [145, "<"], "\x95" => [147, "<"], "\x96" => [149, "<"], "\x97" => [101, "<"], "\x98" => [112, "<"], "\x99" => [117, "<"], "\x9a" => [120, "<"], "\x9b" => [124, "<"], "\x9c" => [127, "<"], "\x9d" => [144, "<"], "\x9e" => [152, "<"], "\x9f" => [11, "<"], "\xa0" => [0, "`0"], "\xa1" => [0, "`1"], "\xa2" => [0, "`2"], "\xa3" => [0, "`a"], "\xa4" => [0, "`c"], "\xa5" => [0, "`e"], "\xa6" => [0, "`i"], "\xa7" => [0, "`o"], "\xa8" => [0, "`s"], "\xa9" => [0, "`t"], "\xaa" => [73, "`"], "\xab" => [88, "`"], "\xac" => [89, "`"], "\xad" => [96, "`"], "\xae" => [97, "`"], "\xaf" => [99, "`"], "\xb0" => [106, "`"], "\xb1" => [136, "`"], "\xb2" => [139, "`"], "\xb3" => [141, "`"], "\xb4" => [145, "`"], "\xb5" => [147, "`"], "\xb6" => [149, "`"], "\xb7" => [101, "`"], "\xb8" => [112, "`"], "\xb9" => [117, "`"], "\xba" => [120, "`"], "\xbb" => [124, "`"], "\xbc" => [127, "`"], "\xbd" => [144, "`"], "\xbe" => [152, "`"], "\xbf" => [11, "`"], "\xc0" => [0, "{0"], "\xc1" => [0, "{1"], "\xc2" => [0, "{2"], "\xc3" => [0, "{a"], "\xc4" => [0, "{c"], "\xc5" => [0, "{e"], "\xc6" => [0, "{i"], "\xc7" => [0, "{o"], "\xc8" => [0, "{s"], "\xc9" => [0, "{t"], "\xca" => [73, "{"], "\xcb" => [88, "{"], "\xcc" => [89, "{"], "\xcd" => [96, "{"], "\xce" => [97, "{"], "\xcf" => [99, "{"], "\xd0" => [106, "{"], "\xd1" => [136, "{"], "\xd2" => [139, "{"], "\xd3" => [141, "{"], "\xd4" => [145, "{"], "\xd5" => [147, "{"], "\xd6" => [149, "{"], "\xd7" => [101, "{"], "\xd8" => [112, "{"], "\xd9" => [117, "{"], "\xda" => [120, "{"], "\xdb" => [124, "{"], "\xdc" => [127, "{"], "\xdd" => [144, "{"], "\xde" => [152, "{"], "\xdf" => [11, "{"], "\xe0" => [77, "\\"], "\xe1" => [18, "\\"], "\xe2" => [77, "\xc3"], "\xe3" => [18, "\xc3"], "\xe4" => [77, "\xd0"], "\xe5" => [18, "\xd0"], "\xe6" => [0, "\x80"], "\xe7" => [0, "\x82"], "\xe8" => [0, "\x83"], "\xe9" => [0, "\xa2"], "\xea" => [0, "\xb8"], "\xeb" => [0, "\xc2"], "\xec" => [0, "\xe0"], "\xed" => [0, "\xe2"], "\xee" => [182, null], "\xef" => [195, null], "\xf0" => [203, null], "\xf1" => [209, null], "\xf2" => [242, null], "\xf3" => [249, null], "\xf4" => [158, null], "\xf5" => [166, null], "\xf6" => [186, null], "\xf7" => [191, null], "\xf8" => [207, null], "\xf9" => [214, null], "\xfa" => [224, null], "\xfb" => [27, null], "\xfc" => [176, null], "\xfd" => [194, null], "\xfe" => [51, null], "\xff" => [36, null]], ["\x00" => [0, "\x010"], "\x01" => [0, "\x011"], "\x02" => [0, "\x012"], "\x03" => [0, "\x01a"], "\x04" => [0, "\x01c"], "\x05" => [0, "\x01e"], "\x06" => [0, "\x01i"], "\x07" => [0, "\x01o"], "\x08" => [0, "\x01s"], "\t" => [0, "\x01t"], "\n" => [73, "\x01"], "\v" => [88, "\x01"], "\f" => [89, "\x01"], "\r" => [96, "\x01"], "\x0e" => [97, "\x01"], "\x0f" => [99, "\x01"], "\x10" => [106, "\x01"], "\x11" => [136, "\x01"], "\x12" => [139, "\x01"], "\x13" => [141, "\x01"], "\x14" => [145, "\x01"], "\x15" => [147, "\x01"], "\x16" => [149, "\x01"], "\x17" => [101, "\x01"], "\x18" => [112, "\x01"], "\x19" => [117, "\x01"], "\x1a" => [120, "\x01"], "\x1b" => [124, "\x01"], "\x1c" => [127, "\x01"], "\x1d" => [144, "\x01"], "\x1e" => [152, "\x01"], "\x1f" => [11, "\x01"], " " => [0, "\x870"], "!" => [0, "\x871"], "\"" => [0, "\x872"], "#" => [0, "\x87a"], "\$" => [0, "\x87c"], "%" => [0, "\x87e"], "&" => [0, "\x87i"], "'" => [0, "\x87o"], "(" => [0, "\x87s"], ")" => [0, "\x87t"], "*" => [73, "\x87"], "+" => [88, "\x87"], "," => [89, "\x87"], "-" => [96, "\x87"], "." => [97, "\x87"], "/" => [99, "\x87"], [106, "\x87"], [136, "\x87"], [139, "\x87"], [141, "\x87"], [145, "\x87"], [147, "\x87"], [149, "\x87"], [101, "\x87"], [112, "\x87"], [117, "\x87"], ":" => [120, "\x87"], ";" => [124, "\x87"], "<" => [127, "\x87"], "=" => [144, "\x87"], ">" => [152, "\x87"], "?" => [11, "\x87"], "@" => [0, "\x890"], "A" => [0, "\x891"], "B" => [0, "\x892"], "C" => [0, "\x89a"], "D" => [0, "\x89c"], "E" => [0, "\x89e"], "F" => [0, "\x89i"], "G" => [0, "\x89o"], "H" => [0, "\x89s"], "I" => [0, "\x89t"], "J" => [73, "\x89"], "K" => [88, "\x89"], "L" => [89, "\x89"], "M" => [96, "\x89"], "N" => [97, "\x89"], "O" => [99, "\x89"], "P" => [106, "\x89"], "Q" => [136, "\x89"], "R" => [139, "\x89"], "S" => [141, "\x89"], "T" => [145, "\x89"], "U" => [147, "\x89"], "V" => [149, "\x89"], "W" => [101, "\x89"], "X" => [112, "\x89"], "Y" => [117, "\x89"], "Z" => [120, "\x89"], "[" => [124, "\x89"], "\\" => [127, "\x89"], "]" => [144, "\x89"], "^" => [152, "\x89"], "_" => [11, "\x89"], "`" => [0, "\x8a0"], "a" => [0, "\x8a1"], "b" => [0, "\x8a2"], "c" => [0, "\x8aa"], "d" => [0, "\x8ac"], "e" => [0, "\x8ae"], "f" => [0, "\x8ai"], "g" => [0, "\x8ao"], "h" => [0, "\x8as"], "i" => [0, "\x8at"], "j" => [73, "\x8a"], "k" => [88, "\x8a"], "l" => [89, "\x8a"], "m" => [96, "\x8a"], "n" => [97, "\x8a"], "o" => [99, "\x8a"], "p" => [106, "\x8a"], "q" => [136, "\x8a"], "r" => [139, "\x8a"], "s" => [141, "\x8a"], "t" => [145, "\x8a"], "u" => [147, "\x8a"], "v" => [149, "\x8a"], "w" => [101, "\x8a"], "x" => [112, "\x8a"], "y" => [117, "\x8a"], "z" => [120, "\x8a"], "{" => [124, "\x8a"], "|" => [127, "\x8a"], "}" => [144, "\x8a"], "~" => [152, "\x8a"], "" => [11, "\x8a"], "\x80" => [0, "\x8b0"], "\x81" => [0, "\x8b1"], "\x82" => [0, "\x8b2"], "\x83" => [0, "\x8ba"], "\x84" => [0, "\x8bc"], "\x85" => [0, "\x8be"], "\x86" => [0, "\x8bi"], "\x87" => [0, "\x8bo"], "\x88" => [0, "\x8bs"], "\x89" => [0, "\x8bt"], "\x8a" => [73, "\x8b"], "\x8b" => [88, "\x8b"], "\x8c" => [89, "\x8b"], "\x8d" => [96, "\x8b"], "\x8e" => [97, "\x8b"], "\x8f" => [99, "\x8b"], "\x90" => [106, "\x8b"], "\x91" => [136, "\x8b"], "\x92" => [139, "\x8b"], "\x93" => [141, "\x8b"], "\x94" => [145, "\x8b"], "\x95" => [147, "\x8b"], "\x96" => [149, "\x8b"], "\x97" => [101, "\x8b"], "\x98" => [112, "\x8b"], "\x99" => [117, "\x8b"], "\x9a" => [120, "\x8b"], "\x9b" => [124, "\x8b"], "\x9c" => [127, "\x8b"], "\x9d" => [144, "\x8b"], "\x9e" => [152, "\x8b"], "\x9f" => [11, "\x8b"], "\xa0" => [0, "\x8c0"], "\xa1" => [0, "\x8c1"], "\xa2" => [0, "\x8c2"], "\xa3" => [0, "\x8ca"], "\xa4" => [0, "\x8cc"], "\xa5" => [0, "\x8ce"], "\xa6" => [0, "\x8ci"], "\xa7" => [0, "\x8co"], "\xa8" => [0, "\x8cs"], "\xa9" => [0, "\x8ct"], "\xaa" => [73, "\x8c"], "\xab" => [88, "\x8c"], "\xac" => [89, "\x8c"], "\xad" => [96, "\x8c"], "\xae" => [97, "\x8c"], "\xaf" => [99, "\x8c"], "\xb0" => [106, "\x8c"], "\xb1" => [136, "\x8c"], "\xb2" => [139, "\x8c"], "\xb3" => [141, "\x8c"], "\xb4" => [145, "\x8c"], "\xb5" => [147, "\x8c"], "\xb6" => [149, "\x8c"], "\xb7" => [101, "\x8c"], "\xb8" => [112, "\x8c"], "\xb9" => [117, "\x8c"], "\xba" => [120, "\x8c"], "\xbb" => [124, "\x8c"], "\xbc" => [127, "\x8c"], "\xbd" => [144, "\x8c"], "\xbe" => [152, "\x8c"], "\xbf" => [11, "\x8c"], "\xc0" => [0, "\x8d0"], "\xc1" => [0, "\x8d1"], "\xc2" => [0, "\x8d2"], "\xc3" => [0, "\x8da"], "\xc4" => [0, "\x8dc"], "\xc5" => [0, "\x8de"], "\xc6" => [0, "\x8di"], "\xc7" => [0, "\x8do"], "\xc8" => [0, "\x8ds"], "\xc9" => [0, "\x8dt"], "\xca" => [73, "\x8d"], "\xcb" => [88, "\x8d"], "\xcc" => [89, "\x8d"], "\xcd" => [96, "\x8d"], "\xce" => [97, "\x8d"], "\xcf" => [99, "\x8d"], "\xd0" => [106, "\x8d"], "\xd1" => [136, "\x8d"], "\xd2" => [139, "\x8d"], "\xd3" => [141, "\x8d"], "\xd4" => [145, "\x8d"], "\xd5" => [147, "\x8d"], "\xd6" => [149, "\x8d"], "\xd7" => [101, "\x8d"], "\xd8" => [112, "\x8d"], "\xd9" => [117, "\x8d"], "\xda" => [120, "\x8d"], "\xdb" => [124, "\x8d"], "\xdc" => [127, "\x8d"], "\xdd" => [144, "\x8d"], "\xde" => [152, "\x8d"], "\xdf" => [11, "\x8d"], "\xe0" => [0, "\x8f0"], "\xe1" => [0, "\x8f1"], "\xe2" => [0, "\x8f2"], "\xe3" => [0, "\x8fa"], "\xe4" => [0, "\x8fc"], "\xe5" => [0, "\x8fe"], "\xe6" => [0, "\x8fi"], "\xe7" => [0, "\x8fo"], "\xe8" => [0, "\x8fs"], "\xe9" => [0, "\x8ft"], "\xea" => [73, "\x8f"], "\xeb" => [88, "\x8f"], "\xec" => [89, "\x8f"], "\xed" => [96, "\x8f"], "\xee" => [97, "\x8f"], "\xef" => [99, "\x8f"], "\xf0" => [106, "\x8f"], "\xf1" => [136, "\x8f"], "\xf2" => [139, "\x8f"], "\xf3" => [141, "\x8f"], "\xf4" => [145, "\x8f"], "\xf5" => [147, "\x8f"], "\xf6" => [149, "\x8f"], "\xf7" => [101, "\x8f"], "\xf8" => [112, "\x8f"], "\xf9" => [117, "\x8f"], "\xfa" => [120, "\x8f"], "\xfb" => [124, "\x8f"], "\xfc" => [127, "\x8f"], "\xfd" => [144, "\x8f"], "\xfe" => [152, "\x8f"], "\xff" => [11, "\x8f"]], ["\x00" => [77, "]0"], "\x01" => [18, "]0"], "\x02" => [77, "]1"], "\x03" => [18, "]1"], "\x04" => [77, "]2"], "\x05" => [18, "]2"], "\x06" => [77, "]a"], "\x07" => [18, "]a"], "\x08" => [77, "]c"], "\t" => [18, "]c"], "\n" => [77, "]e"], "\v" => [18, "]e"], "\f" => [77, "]i"], "\r" => [18, "]i"], "\x0e" => [77, "]o"], "\x0f" => [18, "]o"], "\x10" => [77, "]s"], "\x11" => [18, "]s"], "\x12" => [77, "]t"], "\x13" => [18, "]t"], "\x14" => [0, "] "], "\x15" => [0, "]%"], "\x16" => [0, "]-"], "\x17" => [0, "]."], "\x18" => [0, "]/"], "\x19" => [0, "]3"], "\x1a" => [0, "]4"], "\x1b" => [0, "]5"], "\x1c" => [0, "]6"], "\x1d" => [0, "]7"], "\x1e" => [0, "]8"], "\x1f" => [0, "]9"], " " => [0, "]="], "!" => [0, "]A"], "\"" => [0, "]_"], "#" => [0, "]b"], "\$" => [0, "]d"], "%" => [0, "]f"], "&" => [0, "]g"], "'" => [0, "]h"], "(" => [0, "]l"], ")" => [0, "]m"], "*" => [0, "]n"], "+" => [0, "]p"], "," => [0, "]r"], "-" => [0, "]u"], "." => [100, "]"], "/" => [110, "]"], [111, "]"], [115, "]"], [116, "]"], [118, "]"], [119, "]"], [122, "]"], [123, "]"], [125, "]"], [126, "]"], [129, "]"], ":" => [143, "]"], ";" => [148, "]"], "<" => [151, "]"], "=" => [153, "]"], ">" => [83, "]"], "?" => [10, "]"], "@" => [77, "~0"], "A" => [18, "~0"], "B" => [77, "~1"], "C" => [18, "~1"], "D" => [77, "~2"], "E" => [18, "~2"], "F" => [77, "~a"], "G" => [18, "~a"], "H" => [77, "~c"], "I" => [18, "~c"], "J" => [77, "~e"], "K" => [18, "~e"], "L" => [77, "~i"], "M" => [18, "~i"], "N" => [77, "~o"], "O" => [18, "~o"], "P" => [77, "~s"], "Q" => [18, "~s"], "R" => [77, "~t"], "S" => [18, "~t"], "T" => [0, "~ "], "U" => [0, "~%"], "V" => [0, "~-"], "W" => [0, "~."], "X" => [0, "~/"], "Y" => [0, "~3"], "Z" => [0, "~4"], "[" => [0, "~5"], "\\" => [0, "~6"], "]" => [0, "~7"], "^" => [0, "~8"], "_" => [0, "~9"], "`" => [0, "~="], "a" => [0, "~A"], "b" => [0, "~_"], "c" => [0, "~b"], "d" => [0, "~d"], "e" => [0, "~f"], "f" => [0, "~g"], "g" => [0, "~h"], "h" => [0, "~l"], "i" => [0, "~m"], "j" => [0, "~n"], "k" => [0, "~p"], "l" => [0, "~r"], "m" => [0, "~u"], "n" => [100, "~"], "o" => [110, "~"], "p" => [111, "~"], "q" => [115, "~"], "r" => [116, "~"], "s" => [118, "~"], "t" => [119, "~"], "u" => [122, "~"], "v" => [123, "~"], "w" => [125, "~"], "x" => [126, "~"], "y" => [129, "~"], "z" => [143, "~"], "{" => [148, "~"], "|" => [151, "~"], "}" => [153, "~"], "~" => [83, "~"], "" => [10, "~"], "\x80" => [0, "^0"], "\x81" => [0, "^1"], "\x82" => [0, "^2"], "\x83" => [0, "^a"], "\x84" => [0, "^c"], "\x85" => [0, "^e"], "\x86" => [0, "^i"], "\x87" => [0, "^o"], "\x88" => [0, "^s"], "\x89" => [0, "^t"], "\x8a" => [73, "^"], "\x8b" => [88, "^"], "\x8c" => [89, "^"], "\x8d" => [96, "^"], "\x8e" => [97, "^"], "\x8f" => [99, "^"], "\x90" => [106, "^"], "\x91" => [136, "^"], "\x92" => [139, "^"], "\x93" => [141, "^"], "\x94" => [145, "^"], "\x95" => [147, "^"], "\x96" => [149, "^"], "\x97" => [101, "^"], "\x98" => [112, "^"], "\x99" => [117, "^"], "\x9a" => [120, "^"], "\x9b" => [124, "^"], "\x9c" => [127, "^"], "\x9d" => [144, "^"], "\x9e" => [152, "^"], "\x9f" => [11, "^"], "\xa0" => [0, "}0"], "\xa1" => [0, "}1"], "\xa2" => [0, "}2"], "\xa3" => [0, "}a"], "\xa4" => [0, "}c"], "\xa5" => [0, "}e"], "\xa6" => [0, "}i"], "\xa7" => [0, "}o"], "\xa8" => [0, "}s"], "\xa9" => [0, "}t"], "\xaa" => [73, "}"], "\xab" => [88, "}"], "\xac" => [89, "}"], "\xad" => [96, "}"], "\xae" => [97, "}"], "\xaf" => [99, "}"], "\xb0" => [106, "}"], "\xb1" => [136, "}"], "\xb2" => [139, "}"], "\xb3" => [141, "}"], "\xb4" => [145, "}"], "\xb5" => [147, "}"], "\xb6" => [149, "}"], "\xb7" => [101, "}"], "\xb8" => [112, "}"], "\xb9" => [117, "}"], "\xba" => [120, "}"], "\xbb" => [124, "}"], "\xbc" => [127, "}"], "\xbd" => [144, "}"], "\xbe" => [152, "}"], "\xbf" => [11, "}"], "\xc0" => [92, "<"], "\xc1" => [95, "<"], "\xc2" => [137, "<"], "\xc3" => [142, "<"], "\xc4" => [150, "<"], "\xc5" => [74, "<"], "\xc6" => [90, "<"], "\xc7" => [98, "<"], "\xc8" => [107, "<"], "\xc9" => [140, "<"], "\xca" => [146, "<"], "\xcb" => [102, "<"], "\xcc" => [113, "<"], "\xcd" => [121, "<"], "\xce" => [128, "<"], "\xcf" => [12, "<"], "\xd0" => [92, "`"], "\xd1" => [95, "`"], "\xd2" => [137, "`"], "\xd3" => [142, "`"], "\xd4" => [150, "`"], "\xd5" => [74, "`"], "\xd6" => [90, "`"], "\xd7" => [98, "`"], "\xd8" => [107, "`"], "\xd9" => [140, "`"], "\xda" => [146, "`"], "\xdb" => [102, "`"], "\xdc" => [113, "`"], "\xdd" => [121, "`"], "\xde" => [128, "`"], "\xdf" => [12, "`"], "\xe0" => [92, "{"], "\xe1" => [95, "{"], "\xe2" => [137, "{"], "\xe3" => [142, "{"], "\xe4" => [150, "{"], "\xe5" => [74, "{"], "\xe6" => [90, "{"], "\xe7" => [98, "{"], "\xe8" => [107, "{"], "\xe9" => [140, "{"], "\xea" => [146, "{"], "\xeb" => [102, "{"], "\xec" => [113, "{"], "\xed" => [121, "{"], "\xee" => [128, "{"], "\xef" => [12, "{"], "\xf0" => [0, "\\"], "\xf1" => [0, "\xc3"], "\xf2" => [0, "\xd0"], "\xf3" => [155, null], "\xf4" => [162, null], "\xf5" => [211, null], "\xf6" => [248, null], "\xf7" => [183, null], "\xf8" => [204, null], "\xf9" => [243, null], "\xfa" => [159, null], "\xfb" => [187, null], "\xfc" => [208, null], "\xfd" => [29, null], "\xfe" => [177, null], "\xff" => [37, null]], ["\x00" => [0, "\xc60"], "\x01" => [0, "\xc61"], "\x02" => [0, "\xc62"], "\x03" => [0, "\xc6a"], "\x04" => [0, "\xc6c"], "\x05" => [0, "\xc6e"], "\x06" => [0, "\xc6i"], "\x07" => [0, "\xc6o"], "\x08" => [0, "\xc6s"], "\t" => [0, "\xc6t"], "\n" => [73, "\xc6"], "\v" => [88, "\xc6"], "\f" => [89, "\xc6"], "\r" => [96, "\xc6"], "\x0e" => [97, "\xc6"], "\x0f" => [99, "\xc6"], "\x10" => [106, "\xc6"], "\x11" => [136, "\xc6"], "\x12" => [139, "\xc6"], "\x13" => [141, "\xc6"], "\x14" => [145, "\xc6"], "\x15" => [147, "\xc6"], "\x16" => [149, "\xc6"], "\x17" => [101, "\xc6"], "\x18" => [112, "\xc6"], "\x19" => [117, "\xc6"], "\x1a" => [120, "\xc6"], "\x1b" => [124, "\xc6"], "\x1c" => [127, "\xc6"], "\x1d" => [144, "\xc6"], "\x1e" => [152, "\xc6"], "\x1f" => [11, "\xc6"], " " => [0, "\xe40"], "!" => [0, "\xe41"], "\"" => [0, "\xe42"], "#" => [0, "\xe4a"], "\$" => [0, "\xe4c"], "%" => [0, "\xe4e"], "&" => [0, "\xe4i"], "'" => [0, "\xe4o"], "(" => [0, "\xe4s"], ")" => [0, "\xe4t"], "*" => [73, "\xe4"], "+" => [88, "\xe4"], "," => [89, "\xe4"], "-" => [96, "\xe4"], "." => [97, "\xe4"], "/" => [99, "\xe4"], [106, "\xe4"], [136, "\xe4"], [139, "\xe4"], [141, "\xe4"], [145, "\xe4"], [147, "\xe4"], [149, "\xe4"], [101, "\xe4"], [112, "\xe4"], [117, "\xe4"], ":" => [120, "\xe4"], ";" => [124, "\xe4"], "<" => [127, "\xe4"], "=" => [144, "\xe4"], ">" => [152, "\xe4"], "?" => [11, "\xe4"], "@" => [0, "\xe80"], "A" => [0, "\xe81"], "B" => [0, "\xe82"], "C" => [0, "\xe8a"], "D" => [0, "\xe8c"], "E" => [0, "\xe8e"], "F" => [0, "\xe8i"], "G" => [0, "\xe8o"], "H" => [0, "\xe8s"], "I" => [0, "\xe8t"], "J" => [73, "\xe8"], "K" => [88, "\xe8"], "L" => [89, "\xe8"], "M" => [96, "\xe8"], "N" => [97, "\xe8"], "O" => [99, "\xe8"], "P" => [106, "\xe8"], "Q" => [136, "\xe8"], "R" => [139, "\xe8"], "S" => [141, "\xe8"], "T" => [145, "\xe8"], "U" => [147, "\xe8"], "V" => [149, "\xe8"], "W" => [101, "\xe8"], "X" => [112, "\xe8"], "Y" => [117, "\xe8"], "Z" => [120, "\xe8"], "[" => [124, "\xe8"], "\\" => [127, "\xe8"], "]" => [144, "\xe8"], "^" => [152, "\xe8"], "_" => [11, "\xe8"], "`" => [0, "\xe90"], "a" => [0, "\xe91"], "b" => [0, "\xe92"], "c" => [0, "\xe9a"], "d" => [0, "\xe9c"], "e" => [0, "\xe9e"], "f" => [0, "\xe9i"], "g" => [0, "\xe9o"], "h" => [0, "\xe9s"], "i" => [0, "\xe9t"], "j" => [73, "\xe9"], "k" => [88, "\xe9"], "l" => [89, "\xe9"], "m" => [96, "\xe9"], "n" => [97, "\xe9"], "o" => [99, "\xe9"], "p" => [106, "\xe9"], "q" => [136, "\xe9"], "r" => [139, "\xe9"], "s" => [141, "\xe9"], "t" => [145, "\xe9"], "u" => [147, "\xe9"], "v" => [149, "\xe9"], "w" => [101, "\xe9"], "x" => [112, "\xe9"], "y" => [117, "\xe9"], "z" => [120, "\xe9"], "{" => [124, "\xe9"], "|" => [127, "\xe9"], "}" => [144, "\xe9"], "~" => [152, "\xe9"], "" => [11, "\xe9"], "\x80" => [92, "\x01"], "\x81" => [95, "\x01"], "\x82" => [137, "\x01"], "\x83" => [142, "\x01"], "\x84" => [150, "\x01"], "\x85" => [74, "\x01"], "\x86" => [90, "\x01"], "\x87" => [98, "\x01"], "\x88" => [107, "\x01"], "\x89" => [140, "\x01"], "\x8a" => [146, "\x01"], "\x8b" => [102, "\x01"], "\x8c" => [113, "\x01"], "\x8d" => [121, "\x01"], "\x8e" => [128, "\x01"], "\x8f" => [12, "\x01"], "\x90" => [92, "\x87"], "\x91" => [95, "\x87"], "\x92" => [137, "\x87"], "\x93" => [142, "\x87"], "\x94" => [150, "\x87"], "\x95" => [74, "\x87"], "\x96" => [90, "\x87"], "\x97" => [98, "\x87"], "\x98" => [107, "\x87"], "\x99" => [140, "\x87"], "\x9a" => [146, "\x87"], "\x9b" => [102, "\x87"], "\x9c" => [113, "\x87"], "\x9d" => [121, "\x87"], "\x9e" => [128, "\x87"], "\x9f" => [12, "\x87"], "\xa0" => [92, "\x89"], "\xa1" => [95, "\x89"], "\xa2" => [137, "\x89"], "\xa3" => [142, "\x89"], "\xa4" => [150, "\x89"], "\xa5" => [74, "\x89"], "\xa6" => [90, "\x89"], "\xa7" => [98, "\x89"], "\xa8" => [107, "\x89"], "\xa9" => [140, "\x89"], "\xaa" => [146, "\x89"], "\xab" => [102, "\x89"], "\xac" => [113, "\x89"], "\xad" => [121, "\x89"], "\xae" => [128, "\x89"], "\xaf" => [12, "\x89"], "\xb0" => [92, "\x8a"], "\xb1" => [95, "\x8a"], "\xb2" => [137, "\x8a"], "\xb3" => [142, "\x8a"], "\xb4" => [150, "\x8a"], "\xb5" => [74, "\x8a"], "\xb6" => [90, "\x8a"], "\xb7" => [98, "\x8a"], "\xb8" => [107, "\x8a"], "\xb9" => [140, "\x8a"], "\xba" => [146, "\x8a"], "\xbb" => [102, "\x8a"], "\xbc" => [113, "\x8a"], "\xbd" => [121, "\x8a"], "\xbe" => [128, "\x8a"], "\xbf" => [12, "\x8a"], "\xc0" => [92, "\x8b"], "\xc1" => [95, "\x8b"], "\xc2" => [137, "\x8b"], "\xc3" => [142, "\x8b"], "\xc4" => [150, "\x8b"], "\xc5" => [74, "\x8b"], "\xc6" => [90, "\x8b"], "\xc7" => [98, "\x8b"], "\xc8" => [107, "\x8b"], "\xc9" => [140, "\x8b"], "\xca" => [146, "\x8b"], "\xcb" => [102, "\x8b"], "\xcc" => [113, "\x8b"], "\xcd" => [121, "\x8b"], "\xce" => [128, "\x8b"], "\xcf" => [12, "\x8b"], "\xd0" => [92, "\x8c"], "\xd1" => [95, "\x8c"], "\xd2" => [137, "\x8c"], "\xd3" => [142, "\x8c"], "\xd4" => [150, "\x8c"], "\xd5" => [74, "\x8c"], "\xd6" => [90, "\x8c"], "\xd7" => [98, "\x8c"], "\xd8" => [107, "\x8c"], "\xd9" => [140, "\x8c"], "\xda" => [146, "\x8c"], "\xdb" => [102, "\x8c"], "\xdc" => [113, "\x8c"], "\xdd" => [121, "\x8c"], "\xde" => [128, "\x8c"], "\xdf" => [12, "\x8c"], "\xe0" => [92, "\x8d"], "\xe1" => [95, "\x8d"], "\xe2" => [137, "\x8d"], "\xe3" => [142, "\x8d"], "\xe4" => [150, "\x8d"], "\xe5" => [74, "\x8d"], "\xe6" => [90, "\x8d"], "\xe7" => [98, "\x8d"], "\xe8" => [107, "\x8d"], "\xe9" => [140, "\x8d"], "\xea" => [146, "\x8d"], "\xeb" => [102, "\x8d"], "\xec" => [113, "\x8d"], "\xed" => [121, "\x8d"], "\xee" => [128, "\x8d"], "\xef" => [12, "\x8d"], "\xf0" => [92, "\x8f"], "\xf1" => [95, "\x8f"], "\xf2" => [137, "\x8f"], "\xf3" => [142, "\x8f"], "\xf4" => [150, "\x8f"], "\xf5" => [74, "\x8f"], "\xf6" => [90, "\x8f"], "\xf7" => [98, "\x8f"], "\xf8" => [107, "\x8f"], "\xf9" => [140, "\x8f"], "\xfa" => [146, "\x8f"], "\xfb" => [102, "\x8f"], "\xfc" => [113, "\x8f"], "\xfd" => [121, "\x8f"], "\xfe" => [128, "\x8f"], "\xff" => [12, "\x8f"]], ["\x00" => [92, "\xb2"], "\x01" => [95, "\xb2"], "\x02" => [137, "\xb2"], "\x03" => [142, "\xb2"], "\x04" => [150, "\xb2"], "\x05" => [74, "\xb2"], "\x06" => [90, "\xb2"], "\x07" => [98, "\xb2"], "\x08" => [107, "\xb2"], "\t" => [140, "\xb2"], "\n" => [146, "\xb2"], "\v" => [102, "\xb2"], "\f" => [113, "\xb2"], "\r" => [121, "\xb2"], "\x0e" => [128, "\xb2"], "\x0f" => [12, "\xb2"], "\x10" => [92, "\xb5"], "\x11" => [95, "\xb5"], "\x12" => [137, "\xb5"], "\x13" => [142, "\xb5"], "\x14" => [150, "\xb5"], "\x15" => [74, "\xb5"], "\x16" => [90, "\xb5"], "\x17" => [98, "\xb5"], "\x18" => [107, "\xb5"], "\x19" => [140, "\xb5"], "\x1a" => [146, "\xb5"], "\x1b" => [102, "\xb5"], "\x1c" => [113, "\xb5"], "\x1d" => [121, "\xb5"], "\x1e" => [128, "\xb5"], "\x1f" => [12, "\xb5"], " " => [92, "\xb9"], "!" => [95, "\xb9"], "\"" => [137, "\xb9"], "#" => [142, "\xb9"], "\$" => [150, "\xb9"], "%" => [74, "\xb9"], "&" => [90, "\xb9"], "'" => [98, "\xb9"], "(" => [107, "\xb9"], ")" => [140, "\xb9"], "*" => [146, "\xb9"], "+" => [102, "\xb9"], "," => [113, "\xb9"], "-" => [121, "\xb9"], "." => [128, "\xb9"], "/" => [12, "\xb9"], [92, "\xba"], [95, "\xba"], [137, "\xba"], [142, "\xba"], [150, "\xba"], [74, "\xba"], [90, "\xba"], [98, "\xba"], [107, "\xba"], [140, "\xba"], ":" => [146, "\xba"], ";" => [102, "\xba"], "<" => [113, "\xba"], "=" => [121, "\xba"], ">" => [128, "\xba"], "?" => [12, "\xba"], "@" => [92, "\xbb"], "A" => [95, "\xbb"], "B" => [137, "\xbb"], "C" => [142, "\xbb"], "D" => [150, "\xbb"], "E" => [74, "\xbb"], "F" => [90, "\xbb"], "G" => [98, "\xbb"], "H" => [107, "\xbb"], "I" => [140, "\xbb"], "J" => [146, "\xbb"], "K" => [102, "\xbb"], "L" => [113, "\xbb"], "M" => [121, "\xbb"], "N" => [128, "\xbb"], "O" => [12, "\xbb"], "P" => [92, "\xbd"], "Q" => [95, "\xbd"], "R" => [137, "\xbd"], "S" => [142, "\xbd"], "T" => [150, "\xbd"], "U" => [74, "\xbd"], "V" => [90, "\xbd"], "W" => [98, "\xbd"], "X" => [107, "\xbd"], "Y" => [140, "\xbd"], "Z" => [146, "\xbd"], "[" => [102, "\xbd"], "\\" => [113, "\xbd"], "]" => [121, "\xbd"], "^" => [128, "\xbd"], "_" => [12, "\xbd"], "`" => [92, "\xbe"], "a" => [95, "\xbe"], "b" => [137, "\xbe"], "c" => [142, "\xbe"], "d" => [150, "\xbe"], "e" => [74, "\xbe"], "f" => [90, "\xbe"], "g" => [98, "\xbe"], "h" => [107, "\xbe"], "i" => [140, "\xbe"], "j" => [146, "\xbe"], "k" => [102, "\xbe"], "l" => [113, "\xbe"], "m" => [121, "\xbe"], "n" => [128, "\xbe"], "o" => [12, "\xbe"], "p" => [92, "\xc4"], "q" => [95, "\xc4"], "r" => [137, "\xc4"], "s" => [142, "\xc4"], "t" => [150, "\xc4"], "u" => [74, "\xc4"], "v" => [90, "\xc4"], "w" => [98, "\xc4"], "x" => [107, "\xc4"], "y" => [140, "\xc4"], "z" => [146, "\xc4"], "{" => [102, "\xc4"], "|" => [113, "\xc4"], "}" => [121, "\xc4"], "~" => [128, "\xc4"], "" => [12, "\xc4"], "\x80" => [92, "\xc6"], "\x81" => [95, "\xc6"], "\x82" => [137, "\xc6"], "\x83" => [142, "\xc6"], "\x84" => [150, "\xc6"], "\x85" => [74, "\xc6"], "\x86" => [90, "\xc6"], "\x87" => [98, "\xc6"], "\x88" => [107, "\xc6"], "\x89" => [140, "\xc6"], "\x8a" => [146, "\xc6"], "\x8b" => [102, "\xc6"], "\x8c" => [113, "\xc6"], "\x8d" => [121, "\xc6"], "\x8e" => [128, "\xc6"], "\x8f" => [12, "\xc6"], "\x90" => [92, "\xe4"], "\x91" => [95, "\xe4"], "\x92" => [137, "\xe4"], "\x93" => [142, "\xe4"], "\x94" => [150, "\xe4"], "\x95" => [74, "\xe4"], "\x96" => [90, "\xe4"], "\x97" => [98, "\xe4"], "\x98" => [107, "\xe4"], "\x99" => [140, "\xe4"], "\x9a" => [146, "\xe4"], "\x9b" => [102, "\xe4"], "\x9c" => [113, "\xe4"], "\x9d" => [121, "\xe4"], "\x9e" => [128, "\xe4"], "\x9f" => [12, "\xe4"], "\xa0" => [92, "\xe8"], "\xa1" => [95, "\xe8"], "\xa2" => [137, "\xe8"], "\xa3" => [142, "\xe8"], "\xa4" => [150, "\xe8"], "\xa5" => [74, "\xe8"], "\xa6" => [90, "\xe8"], "\xa7" => [98, "\xe8"], "\xa8" => [107, "\xe8"], "\xa9" => [140, "\xe8"], "\xaa" => [146, "\xe8"], "\xab" => [102, "\xe8"], "\xac" => [113, "\xe8"], "\xad" => [121, "\xe8"], "\xae" => [128, "\xe8"], "\xaf" => [12, "\xe8"], "\xb0" => [92, "\xe9"], "\xb1" => [95, "\xe9"], "\xb2" => [137, "\xe9"], "\xb3" => [142, "\xe9"], "\xb4" => [150, "\xe9"], "\xb5" => [74, "\xe9"], "\xb6" => [90, "\xe9"], "\xb7" => [98, "\xe9"], "\xb8" => [107, "\xe9"], "\xb9" => [140, "\xe9"], "\xba" => [146, "\xe9"], "\xbb" => [102, "\xe9"], "\xbc" => [113, "\xe9"], "\xbd" => [121, "\xe9"], "\xbe" => [128, "\xe9"], "\xbf" => [12, "\xe9"], "\xc0" => [93, "\x01"], "\xc1" => [138, "\x01"], "\xc2" => [75, "\x01"], "\xc3" => [91, "\x01"], "\xc4" => [108, "\x01"], "\xc5" => [103, "\x01"], "\xc6" => [114, "\x01"], "\xc7" => [14, "\x01"], "\xc8" => [93, "\x87"], "\xc9" => [138, "\x87"], "\xca" => [75, "\x87"], "\xcb" => [91, "\x87"], "\xcc" => [108, "\x87"], "\xcd" => [103, "\x87"], "\xce" => [114, "\x87"], "\xcf" => [14, "\x87"], "\xd0" => [93, "\x89"], "\xd1" => [138, "\x89"], "\xd2" => [75, "\x89"], "\xd3" => [91, "\x89"], "\xd4" => [108, "\x89"], "\xd5" => [103, "\x89"], "\xd6" => [114, "\x89"], "\xd7" => [14, "\x89"], "\xd8" => [93, "\x8a"], "\xd9" => [138, "\x8a"], "\xda" => [75, "\x8a"], "\xdb" => [91, "\x8a"], "\xdc" => [108, "\x8a"], "\xdd" => [103, "\x8a"], "\xde" => [114, "\x8a"], "\xdf" => [14, "\x8a"], "\xe0" => [93, "\x8b"], "\xe1" => [138, "\x8b"], "\xe2" => [75, "\x8b"], "\xe3" => [91, "\x8b"], "\xe4" => [108, "\x8b"], "\xe5" => [103, "\x8b"], "\xe6" => [114, "\x8b"], "\xe7" => [14, "\x8b"], "\xe8" => [93, "\x8c"], "\xe9" => [138, "\x8c"], "\xea" => [75, "\x8c"], "\xeb" => [91, "\x8c"], "\xec" => [108, "\x8c"], "\xed" => [103, "\x8c"], "\xee" => [114, "\x8c"], "\xef" => [14, "\x8c"], "\xf0" => [93, "\x8d"], "\xf1" => [138, "\x8d"], "\xf2" => [75, "\x8d"], "\xf3" => [91, "\x8d"], "\xf4" => [108, "\x8d"], "\xf5" => [103, "\x8d"], "\xf6" => [114, "\x8d"], "\xf7" => [14, "\x8d"], "\xf8" => [93, "\x8f"], "\xf9" => [138, "\x8f"], "\xfa" => [75, "\x8f"], "\xfb" => [91, "\x8f"], "\xfc" => [108, "\x8f"], "\xfd" => [103, "\x8f"], "\xfe" => [114, "\x8f"], "\xff" => [14, "\x8f"]], ["\x00" => [93, "\xb2"], "\x01" => [138, "\xb2"], "\x02" => [75, "\xb2"], "\x03" => [91, "\xb2"], "\x04" => [108, "\xb2"], "\x05" => [103, "\xb2"], "\x06" => [114, "\xb2"], "\x07" => [14, "\xb2"], "\x08" => [93, "\xb5"], "\t" => [138, "\xb5"], "\n" => [75, "\xb5"], "\v" => [91, "\xb5"], "\f" => [108, "\xb5"], "\r" => [103, "\xb5"], "\x0e" => [114, "\xb5"], "\x0f" => [14, "\xb5"], "\x10" => [93, "\xb9"], "\x11" => [138, "\xb9"], "\x12" => [75, "\xb9"], "\x13" => [91, "\xb9"], "\x14" => [108, "\xb9"], "\x15" => [103, "\xb9"], "\x16" => [114, "\xb9"], "\x17" => [14, "\xb9"], "\x18" => [93, "\xba"], "\x19" => [138, "\xba"], "\x1a" => [75, "\xba"], "\x1b" => [91, "\xba"], "\x1c" => [108, "\xba"], "\x1d" => [103, "\xba"], "\x1e" => [114, "\xba"], "\x1f" => [14, "\xba"], " " => [93, "\xbb"], "!" => [138, "\xbb"], "\"" => [75, "\xbb"], "#" => [91, "\xbb"], "\$" => [108, "\xbb"], "%" => [103, "\xbb"], "&" => [114, "\xbb"], "'" => [14, "\xbb"], "(" => [93, "\xbd"], ")" => [138, "\xbd"], "*" => [75, "\xbd"], "+" => [91, "\xbd"], "," => [108, "\xbd"], "-" => [103, "\xbd"], "." => [114, "\xbd"], "/" => [14, "\xbd"], [93, "\xbe"], [138, "\xbe"], [75, "\xbe"], [91, "\xbe"], [108, "\xbe"], [103, "\xbe"], [114, "\xbe"], [14, "\xbe"], [93, "\xc4"], [138, "\xc4"], ":" => [75, "\xc4"], ";" => [91, "\xc4"], "<" => [108, "\xc4"], "=" => [103, "\xc4"], ">" => [114, "\xc4"], "?" => [14, "\xc4"], "@" => [93, "\xc6"], "A" => [138, "\xc6"], "B" => [75, "\xc6"], "C" => [91, "\xc6"], "D" => [108, "\xc6"], "E" => [103, "\xc6"], "F" => [114, "\xc6"], "G" => [14, "\xc6"], "H" => [93, "\xe4"], "I" => [138, "\xe4"], "J" => [75, "\xe4"], "K" => [91, "\xe4"], "L" => [108, "\xe4"], "M" => [103, "\xe4"], "N" => [114, "\xe4"], "O" => [14, "\xe4"], "P" => [93, "\xe8"], "Q" => [138, "\xe8"], "R" => [75, "\xe8"], "S" => [91, "\xe8"], "T" => [108, "\xe8"], "U" => [103, "\xe8"], "V" => [114, "\xe8"], "W" => [14, "\xe8"], "X" => [93, "\xe9"], "Y" => [138, "\xe9"], "Z" => [75, "\xe9"], "[" => [91, "\xe9"], "\\" => [108, "\xe9"], "]" => [103, "\xe9"], "^" => [114, "\xe9"], "_" => [14, "\xe9"], "`" => [94, "\x01"], "a" => [76, "\x01"], "b" => [104, "\x01"], "c" => [16, "\x01"], "d" => [94, "\x87"], "e" => [76, "\x87"], "f" => [104, "\x87"], "g" => [16, "\x87"], "h" => [94, "\x89"], "i" => [76, "\x89"], "j" => [104, "\x89"], "k" => [16, "\x89"], "l" => [94, "\x8a"], "m" => [76, "\x8a"], "n" => [104, "\x8a"], "o" => [16, "\x8a"], "p" => [94, "\x8b"], "q" => [76, "\x8b"], "r" => [104, "\x8b"], "s" => [16, "\x8b"], "t" => [94, "\x8c"], "u" => [76, "\x8c"], "v" => [104, "\x8c"], "w" => [16, "\x8c"], "x" => [94, "\x8d"], "y" => [76, "\x8d"], "z" => [104, "\x8d"], "{" => [16, "\x8d"], "|" => [94, "\x8f"], "}" => [76, "\x8f"], "~" => [104, "\x8f"], "" => [16, "\x8f"], "\x80" => [94, "\x93"], "\x81" => [76, "\x93"], "\x82" => [104, "\x93"], "\x83" => [16, "\x93"], "\x84" => [94, "\x95"], "\x85" => [76, "\x95"], "\x86" => [104, "\x95"], "\x87" => [16, "\x95"], "\x88" => [94, "\x96"], "\x89" => [76, "\x96"], "\x8a" => [104, "\x96"], "\x8b" => [16, "\x96"], "\x8c" => [94, "\x97"], "\x8d" => [76, "\x97"], "\x8e" => [104, "\x97"], "\x8f" => [16, "\x97"], "\x90" => [94, "\x98"], "\x91" => [76, "\x98"], "\x92" => [104, "\x98"], "\x93" => [16, "\x98"], "\x94" => [94, "\x9b"], "\x95" => [76, "\x9b"], "\x96" => [104, "\x9b"], "\x97" => [16, "\x9b"], "\x98" => [94, "\x9d"], "\x99" => [76, "\x9d"], "\x9a" => [104, "\x9d"], "\x9b" => [16, "\x9d"], "\x9c" => [94, "\x9e"], "\x9d" => [76, "\x9e"], "\x9e" => [104, "\x9e"], "\x9f" => [16, "\x9e"], "\xa0" => [94, "\xa5"], "\xa1" => [76, "\xa5"], "\xa2" => [104, "\xa5"], "\xa3" => [16, "\xa5"], "\xa4" => [94, "\xa6"], "\xa5" => [76, "\xa6"], "\xa6" => [104, "\xa6"], "\xa7" => [16, "\xa6"], "\xa8" => [94, "\xa8"], "\xa9" => [76, "\xa8"], "\xaa" => [104, "\xa8"], "\xab" => [16, "\xa8"], "\xac" => [94, "\xae"], "\xad" => [76, "\xae"], "\xae" => [104, "\xae"], "\xaf" => [16, "\xae"], "\xb0" => [94, "\xaf"], "\xb1" => [76, "\xaf"], "\xb2" => [104, "\xaf"], "\xb3" => [16, "\xaf"], "\xb4" => [94, "\xb4"], "\xb5" => [76, "\xb4"], "\xb6" => [104, "\xb4"], "\xb7" => [16, "\xb4"], "\xb8" => [94, "\xb6"], "\xb9" => [76, "\xb6"], "\xba" => [104, "\xb6"], "\xbb" => [16, "\xb6"], "\xbc" => [94, "\xb7"], "\xbd" => [76, "\xb7"], "\xbe" => [104, "\xb7"], "\xbf" => [16, "\xb7"], "\xc0" => [94, "\xbc"], "\xc1" => [76, "\xbc"], "\xc2" => [104, "\xbc"], "\xc3" => [16, "\xbc"], "\xc4" => [94, "\xbf"], "\xc5" => [76, "\xbf"], "\xc6" => [104, "\xbf"], "\xc7" => [16, "\xbf"], "\xc8" => [94, "\xc5"], "\xc9" => [76, "\xc5"], "\xca" => [104, "\xc5"], "\xcb" => [16, "\xc5"], "\xcc" => [94, "\xe7"], "\xcd" => [76, "\xe7"], "\xce" => [104, "\xe7"], "\xcf" => [16, "\xe7"], "\xd0" => [94, "\xef"], "\xd1" => [76, "\xef"], "\xd2" => [104, "\xef"], "\xd3" => [16, "\xef"], "\xd4" => [77, "\t"], "\xd5" => [18, "\t"], "\xd6" => [77, "\x8e"], "\xd7" => [18, "\x8e"], "\xd8" => [77, "\x90"], "\xd9" => [18, "\x90"], "\xda" => [77, "\x91"], "\xdb" => [18, "\x91"], "\xdc" => [77, "\x94"], "\xdd" => [18, "\x94"], "\xde" => [77, "\x9f"], "\xdf" => [18, "\x9f"], "\xe0" => [77, "\xab"], "\xe1" => [18, "\xab"], "\xe2" => [77, "\xce"], "\xe3" => [18, "\xce"], "\xe4" => [77, "\xd7"], "\xe5" => [18, "\xd7"], "\xe6" => [77, "\xe1"], "\xe7" => [18, "\xe1"], "\xe8" => [77, "\xec"], "\xe9" => [18, "\xec"], "\xea" => [77, "\xed"], "\xeb" => [18, "\xed"], "\xec" => [0, "\xc7"], "\xed" => [0, "\xcf"], "\xee" => [0, "\xea"], "\xef" => [0, "\xeb"], "\xf0" => [221, null], "\xf1" => [228, null], "\xf2" => [230, null], "\xf3" => [235, null], "\xf4" => [245, null], "\xf5" => [253, null], "\xf6" => [255, null], "\xf7" => [234, null], "\xf8" => [239, null], "\xf9" => [247, null], "\xfa" => [258, null], "\xfb" => [261, null], "\xfc" => [41, null], "\xfd" => [47, null], "\xfe" => [64, null], "\xff" => [57, null]], ["\x00" => [0, "\xfe0"], "\x01" => [0, "\xfe1"], "\x02" => [0, "\xfe2"], "\x03" => [0, "\xfea"], "\x04" => [0, "\xfec"], "\x05" => [0, "\xfee"], "\x06" => [0, "\xfei"], "\x07" => [0, "\xfeo"], "\x08" => [0, "\xfes"], "\t" => [0, "\xfet"], "\n" => [73, "\xfe"], "\v" => [88, "\xfe"], "\f" => [89, "\xfe"], "\r" => [96, "\xfe"], "\x0e" => [97, "\xfe"], "\x0f" => [99, "\xfe"], "\x10" => [106, "\xfe"], "\x11" => [136, "\xfe"], "\x12" => [139, "\xfe"], "\x13" => [141, "\xfe"], "\x14" => [145, "\xfe"], "\x15" => [147, "\xfe"], "\x16" => [149, "\xfe"], "\x17" => [101, "\xfe"], "\x18" => [112, "\xfe"], "\x19" => [117, "\xfe"], "\x1a" => [120, "\xfe"], "\x1b" => [124, "\xfe"], "\x1c" => [127, "\xfe"], "\x1d" => [144, "\xfe"], "\x1e" => [152, "\xfe"], "\x1f" => [11, "\xfe"], " " => [92, "\x02"], "!" => [95, "\x02"], "\"" => [137, "\x02"], "#" => [142, "\x02"], "\$" => [150, "\x02"], "%" => [74, "\x02"], "&" => [90, "\x02"], "'" => [98, "\x02"], "(" => [107, "\x02"], ")" => [140, "\x02"], "*" => [146, "\x02"], "+" => [102, "\x02"], "," => [113, "\x02"], "-" => [121, "\x02"], "." => [128, "\x02"], "/" => [12, "\x02"], [92, "\x03"], [95, "\x03"], [137, "\x03"], [142, "\x03"], [150, "\x03"], [74, "\x03"], [90, "\x03"], [98, "\x03"], [107, "\x03"], [140, "\x03"], ":" => [146, "\x03"], ";" => [102, "\x03"], "<" => [113, "\x03"], "=" => [121, "\x03"], ">" => [128, "\x03"], "?" => [12, "\x03"], "@" => [92, "\x04"], "A" => [95, "\x04"], "B" => [137, "\x04"], "C" => [142, "\x04"], "D" => [150, "\x04"], "E" => [74, "\x04"], "F" => [90, "\x04"], "G" => [98, "\x04"], "H" => [107, "\x04"], "I" => [140, "\x04"], "J" => [146, "\x04"], "K" => [102, "\x04"], "L" => [113, "\x04"], "M" => [121, "\x04"], "N" => [128, "\x04"], "O" => [12, "\x04"], "P" => [92, "\x05"], "Q" => [95, "\x05"], "R" => [137, "\x05"], "S" => [142, "\x05"], "T" => [150, "\x05"], "U" => [74, "\x05"], "V" => [90, "\x05"], "W" => [98, "\x05"], "X" => [107, "\x05"], "Y" => [140, "\x05"], "Z" => [146, "\x05"], "[" => [102, "\x05"], "\\" => [113, "\x05"], "]" => [121, "\x05"], "^" => [128, "\x05"], "_" => [12, "\x05"], "`" => [92, "\x06"], "a" => [95, "\x06"], "b" => [137, "\x06"], "c" => [142, "\x06"], "d" => [150, "\x06"], "e" => [74, "\x06"], "f" => [90, "\x06"], "g" => [98, "\x06"], "h" => [107, "\x06"], "i" => [140, "\x06"], "j" => [146, "\x06"], "k" => [102, "\x06"], "l" => [113, "\x06"], "m" => [121, "\x06"], "n" => [128, "\x06"], "o" => [12, "\x06"], "p" => [92, "\x07"], "q" => [95, "\x07"], "r" => [137, "\x07"], "s" => [142, "\x07"], "t" => [150, "\x07"], "u" => [74, "\x07"], "v" => [90, "\x07"], "w" => [98, "\x07"], "x" => [107, "\x07"], "y" => [140, "\x07"], "z" => [146, "\x07"], "{" => [102, "\x07"], "|" => [113, "\x07"], "}" => [121, "\x07"], "~" => [128, "\x07"], "" => [12, "\x07"], "\x80" => [92, "\x08"], "\x81" => [95, "\x08"], "\x82" => [137, "\x08"], "\x83" => [142, "\x08"], "\x84" => [150, "\x08"], "\x85" => [74, "\x08"], "\x86" => [90, "\x08"], "\x87" => [98, "\x08"], "\x88" => [107, "\x08"], "\x89" => [140, "\x08"], "\x8a" => [146, "\x08"], "\x8b" => [102, "\x08"], "\x8c" => [113, "\x08"], "\x8d" => [121, "\x08"], "\x8e" => [128, "\x08"], "\x8f" => [12, "\x08"], "\x90" => [92, "\v"], "\x91" => [95, "\v"], "\x92" => [137, "\v"], "\x93" => [142, "\v"], "\x94" => [150, "\v"], "\x95" => [74, "\v"], "\x96" => [90, "\v"], "\x97" => [98, "\v"], "\x98" => [107, "\v"], "\x99" => [140, "\v"], "\x9a" => [146, "\v"], "\x9b" => [102, "\v"], "\x9c" => [113, "\v"], "\x9d" => [121, "\v"], "\x9e" => [128, "\v"], "\x9f" => [12, "\v"], "\xa0" => [92, "\f"], "\xa1" => [95, "\f"], "\xa2" => [137, "\f"], "\xa3" => [142, "\f"], "\xa4" => [150, "\f"], "\xa5" => [74, "\f"], "\xa6" => [90, "\f"], "\xa7" => [98, "\f"], "\xa8" => [107, "\f"], "\xa9" => [140, "\f"], "\xaa" => [146, "\f"], "\xab" => [102, "\f"], "\xac" => [113, "\f"], "\xad" => [121, "\f"], "\xae" => [128, "\f"], "\xaf" => [12, "\f"], "\xb0" => [92, "\x0e"], "\xb1" => [95, "\x0e"], "\xb2" => [137, "\x0e"], "\xb3" => [142, "\x0e"], "\xb4" => [150, "\x0e"], "\xb5" => [74, "\x0e"], "\xb6" => [90, "\x0e"], "\xb7" => [98, "\x0e"], "\xb8" => [107, "\x0e"], "\xb9" => [140, "\x0e"], "\xba" => [146, "\x0e"], "\xbb" => [102, "\x0e"], "\xbc" => [113, "\x0e"], "\xbd" => [121, "\x0e"], "\xbe" => [128, "\x0e"], "\xbf" => [12, "\x0e"], "\xc0" => [92, "\x0f"], "\xc1" => [95, "\x0f"], "\xc2" => [137, "\x0f"], "\xc3" => [142, "\x0f"], "\xc4" => [150, "\x0f"], "\xc5" => [74, "\x0f"], "\xc6" => [90, "\x0f"], "\xc7" => [98, "\x0f"], "\xc8" => [107, "\x0f"], "\xc9" => [140, "\x0f"], "\xca" => [146, "\x0f"], "\xcb" => [102, "\x0f"], "\xcc" => [113, "\x0f"], "\xcd" => [121, "\x0f"], "\xce" => [128, "\x0f"], "\xcf" => [12, "\x0f"], "\xd0" => [92, "\x10"], "\xd1" => [95, "\x10"], "\xd2" => [137, "\x10"], "\xd3" => [142, "\x10"], "\xd4" => [150, "\x10"], "\xd5" => [74, "\x10"], "\xd6" => [90, "\x10"], "\xd7" => [98, "\x10"], "\xd8" => [107, "\x10"], "\xd9" => [140, "\x10"], "\xda" => [146, "\x10"], "\xdb" => [102, "\x10"], "\xdc" => [113, "\x10"], "\xdd" => [121, "\x10"], "\xde" => [128, "\x10"], "\xdf" => [12, "\x10"], "\xe0" => [92, "\x11"], "\xe1" => [95, "\x11"], "\xe2" => [137, "\x11"], "\xe3" => [142, "\x11"], "\xe4" => [150, "\x11"], "\xe5" => [74, "\x11"], "\xe6" => [90, "\x11"], "\xe7" => [98, "\x11"], "\xe8" => [107, "\x11"], "\xe9" => [140, "\x11"], "\xea" => [146, "\x11"], "\xeb" => [102, "\x11"], "\xec" => [113, "\x11"], "\xed" => [121, "\x11"], "\xee" => [128, "\x11"], "\xef" => [12, "\x11"], "\xf0" => [92, "\x12"], "\xf1" => [95, "\x12"], "\xf2" => [137, "\x12"], "\xf3" => [142, "\x12"], "\xf4" => [150, "\x12"], "\xf5" => [74, "\x12"], "\xf6" => [90, "\x12"], "\xf7" => [98, "\x12"], "\xf8" => [107, "\x12"], "\xf9" => [140, "\x12"], "\xfa" => [146, "\x12"], "\xfb" => [102, "\x12"], "\xfc" => [113, "\x12"], "\xfd" => [121, "\x12"], "\xfe" => [128, "\x12"], "\xff" => [12, "\x12"]], ["\x00" => [92, "\xfe"], "\x01" => [95, "\xfe"], "\x02" => [137, "\xfe"], "\x03" => [142, "\xfe"], "\x04" => [150, "\xfe"], "\x05" => [74, "\xfe"], "\x06" => [90, "\xfe"], "\x07" => [98, "\xfe"], "\x08" => [107, "\xfe"], "\t" => [140, "\xfe"], "\n" => [146, "\xfe"], "\v" => [102, "\xfe"], "\f" => [113, "\xfe"], "\r" => [121, "\xfe"], "\x0e" => [128, "\xfe"], "\x0f" => [12, "\xfe"], "\x10" => [93, "\x02"], "\x11" => [138, "\x02"], "\x12" => [75, "\x02"], "\x13" => [91, "\x02"], "\x14" => [108, "\x02"], "\x15" => [103, "\x02"], "\x16" => [114, "\x02"], "\x17" => [14, "\x02"], "\x18" => [93, "\x03"], "\x19" => [138, "\x03"], "\x1a" => [75, "\x03"], "\x1b" => [91, "\x03"], "\x1c" => [108, "\x03"], "\x1d" => [103, "\x03"], "\x1e" => [114, "\x03"], "\x1f" => [14, "\x03"], " " => [93, "\x04"], "!" => [138, "\x04"], "\"" => [75, "\x04"], "#" => [91, "\x04"], "\$" => [108, "\x04"], "%" => [103, "\x04"], "&" => [114, "\x04"], "'" => [14, "\x04"], "(" => [93, "\x05"], ")" => [138, "\x05"], "*" => [75, "\x05"], "+" => [91, "\x05"], "," => [108, "\x05"], "-" => [103, "\x05"], "." => [114, "\x05"], "/" => [14, "\x05"], [93, "\x06"], [138, "\x06"], [75, "\x06"], [91, "\x06"], [108, "\x06"], [103, "\x06"], [114, "\x06"], [14, "\x06"], [93, "\x07"], [138, "\x07"], ":" => [75, "\x07"], ";" => [91, "\x07"], "<" => [108, "\x07"], "=" => [103, "\x07"], ">" => [114, "\x07"], "?" => [14, "\x07"], "@" => [93, "\x08"], "A" => [138, "\x08"], "B" => [75, "\x08"], "C" => [91, "\x08"], "D" => [108, "\x08"], "E" => [103, "\x08"], "F" => [114, "\x08"], "G" => [14, "\x08"], "H" => [93, "\v"], "I" => [138, "\v"], "J" => [75, "\v"], "K" => [91, "\v"], "L" => [108, "\v"], "M" => [103, "\v"], "N" => [114, "\v"], "O" => [14, "\v"], "P" => [93, "\f"], "Q" => [138, "\f"], "R" => [75, "\f"], "S" => [91, "\f"], "T" => [108, "\f"], "U" => [103, "\f"], "V" => [114, "\f"], "W" => [14, "\f"], "X" => [93, "\x0e"], "Y" => [138, "\x0e"], "Z" => [75, "\x0e"], "[" => [91, "\x0e"], "\\" => [108, "\x0e"], "]" => [103, "\x0e"], "^" => [114, "\x0e"], "_" => [14, "\x0e"], "`" => [93, "\x0f"], "a" => [138, "\x0f"], "b" => [75, "\x0f"], "c" => [91, "\x0f"], "d" => [108, "\x0f"], "e" => [103, "\x0f"], "f" => [114, "\x0f"], "g" => [14, "\x0f"], "h" => [93, "\x10"], "i" => [138, "\x10"], "j" => [75, "\x10"], "k" => [91, "\x10"], "l" => [108, "\x10"], "m" => [103, "\x10"], "n" => [114, "\x10"], "o" => [14, "\x10"], "p" => [93, "\x11"], "q" => [138, "\x11"], "r" => [75, "\x11"], "s" => [91, "\x11"], "t" => [108, "\x11"], "u" => [103, "\x11"], "v" => [114, "\x11"], "w" => [14, "\x11"], "x" => [93, "\x12"], "y" => [138, "\x12"], "z" => [75, "\x12"], "{" => [91, "\x12"], "|" => [108, "\x12"], "}" => [103, "\x12"], "~" => [114, "\x12"], "" => [14, "\x12"], "\x80" => [93, "\x13"], "\x81" => [138, "\x13"], "\x82" => [75, "\x13"], "\x83" => [91, "\x13"], "\x84" => [108, "\x13"], "\x85" => [103, "\x13"], "\x86" => [114, "\x13"], "\x87" => [14, "\x13"], "\x88" => [93, "\x14"], "\x89" => [138, "\x14"], "\x8a" => [75, "\x14"], "\x8b" => [91, "\x14"], "\x8c" => [108, "\x14"], "\x8d" => [103, "\x14"], "\x8e" => [114, "\x14"], "\x8f" => [14, "\x14"], "\x90" => [93, "\x15"], "\x91" => [138, "\x15"], "\x92" => [75, "\x15"], "\x93" => [91, "\x15"], "\x94" => [108, "\x15"], "\x95" => [103, "\x15"], "\x96" => [114, "\x15"], "\x97" => [14, "\x15"], "\x98" => [93, "\x17"], "\x99" => [138, "\x17"], "\x9a" => [75, "\x17"], "\x9b" => [91, "\x17"], "\x9c" => [108, "\x17"], "\x9d" => [103, "\x17"], "\x9e" => [114, "\x17"], "\x9f" => [14, "\x17"], "\xa0" => [93, "\x18"], "\xa1" => [138, "\x18"], "\xa2" => [75, "\x18"], "\xa3" => [91, "\x18"], "\xa4" => [108, "\x18"], "\xa5" => [103, "\x18"], "\xa6" => [114, "\x18"], "\xa7" => [14, "\x18"], "\xa8" => [93, "\x19"], "\xa9" => [138, "\x19"], "\xaa" => [75, "\x19"], "\xab" => [91, "\x19"], "\xac" => [108, "\x19"], "\xad" => [103, "\x19"], "\xae" => [114, "\x19"], "\xaf" => [14, "\x19"], "\xb0" => [93, "\x1a"], "\xb1" => [138, "\x1a"], "\xb2" => [75, "\x1a"], "\xb3" => [91, "\x1a"], "\xb4" => [108, "\x1a"], "\xb5" => [103, "\x1a"], "\xb6" => [114, "\x1a"], "\xb7" => [14, "\x1a"], "\xb8" => [93, "\x1b"], "\xb9" => [138, "\x1b"], "\xba" => [75, "\x1b"], "\xbb" => [91, "\x1b"], "\xbc" => [108, "\x1b"], "\xbd" => [103, "\x1b"], "\xbe" => [114, "\x1b"], "\xbf" => [14, "\x1b"], "\xc0" => [93, "\x1c"], "\xc1" => [138, "\x1c"], "\xc2" => [75, "\x1c"], "\xc3" => [91, "\x1c"], "\xc4" => [108, "\x1c"], "\xc5" => [103, "\x1c"], "\xc6" => [114, "\x1c"], "\xc7" => [14, "\x1c"], "\xc8" => [93, "\x1d"], "\xc9" => [138, "\x1d"], "\xca" => [75, "\x1d"], "\xcb" => [91, "\x1d"], "\xcc" => [108, "\x1d"], "\xcd" => [103, "\x1d"], "\xce" => [114, "\x1d"], "\xcf" => [14, "\x1d"], "\xd0" => [93, "\x1e"], "\xd1" => [138, "\x1e"], "\xd2" => [75, "\x1e"], "\xd3" => [91, "\x1e"], "\xd4" => [108, "\x1e"], "\xd5" => [103, "\x1e"], "\xd6" => [114, "\x1e"], "\xd7" => [14, "\x1e"], "\xd8" => [93, "\x1f"], "\xd9" => [138, "\x1f"], "\xda" => [75, "\x1f"], "\xdb" => [91, "\x1f"], "\xdc" => [108, "\x1f"], "\xdd" => [103, "\x1f"], "\xde" => [114, "\x1f"], "\xdf" => [14, "\x1f"], "\xe0" => [93, ""], "\xe1" => [138, ""], "\xe2" => [75, ""], "\xe3" => [91, ""], "\xe4" => [108, ""], "\xe5" => [103, ""], "\xe6" => [114, ""], "\xe7" => [14, ""], "\xe8" => [93, "\xdc"], "\xe9" => [138, "\xdc"], "\xea" => [75, "\xdc"], "\xeb" => [91, "\xdc"], "\xec" => [108, "\xdc"], "\xed" => [103, "\xdc"], "\xee" => [114, "\xdc"], "\xef" => [14, "\xdc"], "\xf0" => [93, "\xf9"], "\xf1" => [138, "\xf9"], "\xf2" => [75, "\xf9"], "\xf3" => [91, "\xf9"], "\xf4" => [108, "\xf9"], "\xf5" => [103, "\xf9"], "\xf6" => [114, "\xf9"], "\xf7" => [14, "\xf9"], "\xf8" => [77, "\n"], "\xf9" => [18, "\n"], "\xfa" => [77, "\r"], "\xfb" => [18, "\r"], "\xfc" => [77, "\x16"], "\xfd" => [18, "\x16"], "\xfe" => [77, ""], "\xff" => [18, ""]], ["\x00" => [93, "\xd3"], "\x01" => [138, "\xd3"], "\x02" => [75, "\xd3"], "\x03" => [91, "\xd3"], "\x04" => [108, "\xd3"], "\x05" => [103, "\xd3"], "\x06" => [114, "\xd3"], "\x07" => [14, "\xd3"], "\x08" => [93, "\xd4"], "\t" => [138, "\xd4"], "\n" => [75, "\xd4"], "\v" => [91, "\xd4"], "\f" => [108, "\xd4"], "\r" => [103, "\xd4"], "\x0e" => [114, "\xd4"], "\x0f" => [14, "\xd4"], "\x10" => [93, "\xd6"], "\x11" => [138, "\xd6"], "\x12" => [75, "\xd6"], "\x13" => [91, "\xd6"], "\x14" => [108, "\xd6"], "\x15" => [103, "\xd6"], "\x16" => [114, "\xd6"], "\x17" => [14, "\xd6"], "\x18" => [93, "\xdd"], "\x19" => [138, "\xdd"], "\x1a" => [75, "\xdd"], "\x1b" => [91, "\xdd"], "\x1c" => [108, "\xdd"], "\x1d" => [103, "\xdd"], "\x1e" => [114, "\xdd"], "\x1f" => [14, "\xdd"], " " => [93, "\xde"], "!" => [138, "\xde"], "\"" => [75, "\xde"], "#" => [91, "\xde"], "\$" => [108, "\xde"], "%" => [103, "\xde"], "&" => [114, "\xde"], "'" => [14, "\xde"], "(" => [93, "\xdf"], ")" => [138, "\xdf"], "*" => [75, "\xdf"], "+" => [91, "\xdf"], "," => [108, "\xdf"], "-" => [103, "\xdf"], "." => [114, "\xdf"], "/" => [14, "\xdf"], [93, "\xf1"], [138, "\xf1"], [75, "\xf1"], [91, "\xf1"], [108, "\xf1"], [103, "\xf1"], [114, "\xf1"], [14, "\xf1"], [93, "\xf4"], [138, "\xf4"], ":" => [75, "\xf4"], ";" => [91, "\xf4"], "<" => [108, "\xf4"], "=" => [103, "\xf4"], ">" => [114, "\xf4"], "?" => [14, "\xf4"], "@" => [93, "\xf5"], "A" => [138, "\xf5"], "B" => [75, "\xf5"], "C" => [91, "\xf5"], "D" => [108, "\xf5"], "E" => [103, "\xf5"], "F" => [114, "\xf5"], "G" => [14, "\xf5"], "H" => [93, "\xf6"], "I" => [138, "\xf6"], "J" => [75, "\xf6"], "K" => [91, "\xf6"], "L" => [108, "\xf6"], "M" => [103, "\xf6"], "N" => [114, "\xf6"], "O" => [14, "\xf6"], "P" => [93, "\xf7"], "Q" => [138, "\xf7"], "R" => [75, "\xf7"], "S" => [91, "\xf7"], "T" => [108, "\xf7"], "U" => [103, "\xf7"], "V" => [114, "\xf7"], "W" => [14, "\xf7"], "X" => [93, "\xf8"], "Y" => [138, "\xf8"], "Z" => [75, "\xf8"], "[" => [91, "\xf8"], "\\" => [108, "\xf8"], "]" => [103, "\xf8"], "^" => [114, "\xf8"], "_" => [14, "\xf8"], "`" => [93, "\xfa"], "a" => [138, "\xfa"], "b" => [75, "\xfa"], "c" => [91, "\xfa"], "d" => [108, "\xfa"], "e" => [103, "\xfa"], "f" => [114, "\xfa"], "g" => [14, "\xfa"], "h" => [93, "\xfb"], "i" => [138, "\xfb"], "j" => [75, "\xfb"], "k" => [91, "\xfb"], "l" => [108, "\xfb"], "m" => [103, "\xfb"], "n" => [114, "\xfb"], "o" => [14, "\xfb"], "p" => [93, "\xfc"], "q" => [138, "\xfc"], "r" => [75, "\xfc"], "s" => [91, "\xfc"], "t" => [108, "\xfc"], "u" => [103, "\xfc"], "v" => [114, "\xfc"], "w" => [14, "\xfc"], "x" => [93, "\xfd"], "y" => [138, "\xfd"], "z" => [75, "\xfd"], "{" => [91, "\xfd"], "|" => [108, "\xfd"], "}" => [103, "\xfd"], "~" => [114, "\xfd"], "" => [14, "\xfd"], "\x80" => [93, "\xfe"], "\x81" => [138, "\xfe"], "\x82" => [75, "\xfe"], "\x83" => [91, "\xfe"], "\x84" => [108, "\xfe"], "\x85" => [103, "\xfe"], "\x86" => [114, "\xfe"], "\x87" => [14, "\xfe"], "\x88" => [94, "\x02"], "\x89" => [76, "\x02"], "\x8a" => [104, "\x02"], "\x8b" => [16, "\x02"], "\x8c" => [94, "\x03"], "\x8d" => [76, "\x03"], "\x8e" => [104, "\x03"], "\x8f" => [16, "\x03"], "\x90" => [94, "\x04"], "\x91" => [76, "\x04"], "\x92" => [104, "\x04"], "\x93" => [16, "\x04"], "\x94" => [94, "\x05"], "\x95" => [76, "\x05"], "\x96" => [104, "\x05"], "\x97" => [16, "\x05"], "\x98" => [94, "\x06"], "\x99" => [76, "\x06"], "\x9a" => [104, "\x06"], "\x9b" => [16, "\x06"], "\x9c" => [94, "\x07"], "\x9d" => [76, "\x07"], "\x9e" => [104, "\x07"], "\x9f" => [16, "\x07"], "\xa0" => [94, "\x08"], "\xa1" => [76, "\x08"], "\xa2" => [104, "\x08"], "\xa3" => [16, "\x08"], "\xa4" => [94, "\v"], "\xa5" => [76, "\v"], "\xa6" => [104, "\v"], "\xa7" => [16, "\v"], "\xa8" => [94, "\f"], "\xa9" => [76, "\f"], "\xaa" => [104, "\f"], "\xab" => [16, "\f"], "\xac" => [94, "\x0e"], "\xad" => [76, "\x0e"], "\xae" => [104, "\x0e"], "\xaf" => [16, "\x0e"], "\xb0" => [94, "\x0f"], "\xb1" => [76, "\x0f"], "\xb2" => [104, "\x0f"], "\xb3" => [16, "\x0f"], "\xb4" => [94, "\x10"], "\xb5" => [76, "\x10"], "\xb6" => [104, "\x10"], "\xb7" => [16, "\x10"], "\xb8" => [94, "\x11"], "\xb9" => [76, "\x11"], "\xba" => [104, "\x11"], "\xbb" => [16, "\x11"], "\xbc" => [94, "\x12"], "\xbd" => [76, "\x12"], "\xbe" => [104, "\x12"], "\xbf" => [16, "\x12"], "\xc0" => [94, "\x13"], "\xc1" => [76, "\x13"], "\xc2" => [104, "\x13"], "\xc3" => [16, "\x13"], "\xc4" => [94, "\x14"], "\xc5" => [76, "\x14"], "\xc6" => [104, "\x14"], "\xc7" => [16, "\x14"], "\xc8" => [94, "\x15"], "\xc9" => [76, "\x15"], "\xca" => [104, "\x15"], "\xcb" => [16, "\x15"], "\xcc" => [94, "\x17"], "\xcd" => [76, "\x17"], "\xce" => [104, "\x17"], "\xcf" => [16, "\x17"], "\xd0" => [94, "\x18"], "\xd1" => [76, "\x18"], "\xd2" => [104, "\x18"], "\xd3" => [16, "\x18"], "\xd4" => [94, "\x19"], "\xd5" => [76, "\x19"], "\xd6" => [104, "\x19"], "\xd7" => [16, "\x19"], "\xd8" => [94, "\x1a"], "\xd9" => [76, "\x1a"], "\xda" => [104, "\x1a"], "\xdb" => [16, "\x1a"], "\xdc" => [94, "\x1b"], "\xdd" => [76, "\x1b"], "\xde" => [104, "\x1b"], "\xdf" => [16, "\x1b"], "\xe0" => [94, "\x1c"], "\xe1" => [76, "\x1c"], "\xe2" => [104, "\x1c"], "\xe3" => [16, "\x1c"], "\xe4" => [94, "\x1d"], "\xe5" => [76, "\x1d"], "\xe6" => [104, "\x1d"], "\xe7" => [16, "\x1d"], "\xe8" => [94, "\x1e"], "\xe9" => [76, "\x1e"], "\xea" => [104, "\x1e"], "\xeb" => [16, "\x1e"], "\xec" => [94, "\x1f"], "\xed" => [76, "\x1f"], "\xee" => [104, "\x1f"], "\xef" => [16, "\x1f"], "\xf0" => [94, ""], "\xf1" => [76, ""], "\xf2" => [104, ""], "\xf3" => [16, ""], "\xf4" => [94, "\xdc"], "\xf5" => [76, "\xdc"], "\xf6" => [104, "\xdc"], "\xf7" => [16, "\xdc"], "\xf8" => [94, "\xf9"], "\xf9" => [76, "\xf9"], "\xfa" => [104, "\xf9"], "\xfb" => [16, "\xf9"], "\xfc" => [0, "\n"], "\xfd" => [0, "\r"], "\xfe" => [0, "\x16"], "\xff" => [0, ""]], ["\x00" => [93, "\xc0"], "\x01" => [138, "\xc0"], "\x02" => [75, "\xc0"], "\x03" => [91, "\xc0"], "\x04" => [108, "\xc0"], "\x05" => [103, "\xc0"], "\x06" => [114, "\xc0"], "\x07" => [14, "\xc0"], "\x08" => [93, "\xc1"], "\t" => [138, "\xc1"], "\n" => [75, "\xc1"], "\v" => [91, "\xc1"], "\f" => [108, "\xc1"], "\r" => [103, "\xc1"], "\x0e" => [114, "\xc1"], "\x0f" => [14, "\xc1"], "\x10" => [93, "\xc8"], "\x11" => [138, "\xc8"], "\x12" => [75, "\xc8"], "\x13" => [91, "\xc8"], "\x14" => [108, "\xc8"], "\x15" => [103, "\xc8"], "\x16" => [114, "\xc8"], "\x17" => [14, "\xc8"], "\x18" => [93, "\xc9"], "\x19" => [138, "\xc9"], "\x1a" => [75, "\xc9"], "\x1b" => [91, "\xc9"], "\x1c" => [108, "\xc9"], "\x1d" => [103, "\xc9"], "\x1e" => [114, "\xc9"], "\x1f" => [14, "\xc9"], " " => [93, "\xca"], "!" => [138, "\xca"], "\"" => [75, "\xca"], "#" => [91, "\xca"], "\$" => [108, "\xca"], "%" => [103, "\xca"], "&" => [114, "\xca"], "'" => [14, "\xca"], "(" => [93, "\xcd"], ")" => [138, "\xcd"], "*" => [75, "\xcd"], "+" => [91, "\xcd"], "," => [108, "\xcd"], "-" => [103, "\xcd"], "." => [114, "\xcd"], "/" => [14, "\xcd"], [93, "\xd2"], [138, "\xd2"], [75, "\xd2"], [91, "\xd2"], [108, "\xd2"], [103, "\xd2"], [114, "\xd2"], [14, "\xd2"], [93, "\xd5"], [138, "\xd5"], ":" => [75, "\xd5"], ";" => [91, "\xd5"], "<" => [108, "\xd5"], "=" => [103, "\xd5"], ">" => [114, "\xd5"], "?" => [14, "\xd5"], "@" => [93, "\xda"], "A" => [138, "\xda"], "B" => [75, "\xda"], "C" => [91, "\xda"], "D" => [108, "\xda"], "E" => [103, "\xda"], "F" => [114, "\xda"], "G" => [14, "\xda"], "H" => [93, "\xdb"], "I" => [138, "\xdb"], "J" => [75, "\xdb"], "K" => [91, "\xdb"], "L" => [108, "\xdb"], "M" => [103, "\xdb"], "N" => [114, "\xdb"], "O" => [14, "\xdb"], "P" => [93, "\xee"], "Q" => [138, "\xee"], "R" => [75, "\xee"], "S" => [91, "\xee"], "T" => [108, "\xee"], "U" => [103, "\xee"], "V" => [114, "\xee"], "W" => [14, "\xee"], "X" => [93, "\xf0"], "Y" => [138, "\xf0"], "Z" => [75, "\xf0"], "[" => [91, "\xf0"], "\\" => [108, "\xf0"], "]" => [103, "\xf0"], "^" => [114, "\xf0"], "_" => [14, "\xf0"], "`" => [93, "\xf2"], "a" => [138, "\xf2"], "b" => [75, "\xf2"], "c" => [91, "\xf2"], "d" => [108, "\xf2"], "e" => [103, "\xf2"], "f" => [114, "\xf2"], "g" => [14, "\xf2"], "h" => [93, "\xf3"], "i" => [138, "\xf3"], "j" => [75, "\xf3"], "k" => [91, "\xf3"], "l" => [108, "\xf3"], "m" => [103, "\xf3"], "n" => [114, "\xf3"], "o" => [14, "\xf3"], "p" => [93, "\xff"], "q" => [138, "\xff"], "r" => [75, "\xff"], "s" => [91, "\xff"], "t" => [108, "\xff"], "u" => [103, "\xff"], "v" => [114, "\xff"], "w" => [14, "\xff"], "x" => [94, "\xcb"], "y" => [76, "\xcb"], "z" => [104, "\xcb"], "{" => [16, "\xcb"], "|" => [94, "\xcc"], "}" => [76, "\xcc"], "~" => [104, "\xcc"], "" => [16, "\xcc"], "\x80" => [94, "\xd3"], "\x81" => [76, "\xd3"], "\x82" => [104, "\xd3"], "\x83" => [16, "\xd3"], "\x84" => [94, "\xd4"], "\x85" => [76, "\xd4"], "\x86" => [104, "\xd4"], "\x87" => [16, "\xd4"], "\x88" => [94, "\xd6"], "\x89" => [76, "\xd6"], "\x8a" => [104, "\xd6"], "\x8b" => [16, "\xd6"], "\x8c" => [94, "\xdd"], "\x8d" => [76, "\xdd"], "\x8e" => [104, "\xdd"], "\x8f" => [16, "\xdd"], "\x90" => [94, "\xde"], "\x91" => [76, "\xde"], "\x92" => [104, "\xde"], "\x93" => [16, "\xde"], "\x94" => [94, "\xdf"], "\x95" => [76, "\xdf"], "\x96" => [104, "\xdf"], "\x97" => [16, "\xdf"], "\x98" => [94, "\xf1"], "\x99" => [76, "\xf1"], "\x9a" => [104, "\xf1"], "\x9b" => [16, "\xf1"], "\x9c" => [94, "\xf4"], "\x9d" => [76, "\xf4"], "\x9e" => [104, "\xf4"], "\x9f" => [16, "\xf4"], "\xa0" => [94, "\xf5"], "\xa1" => [76, "\xf5"], "\xa2" => [104, "\xf5"], "\xa3" => [16, "\xf5"], "\xa4" => [94, "\xf6"], "\xa5" => [76, "\xf6"], "\xa6" => [104, "\xf6"], "\xa7" => [16, "\xf6"], "\xa8" => [94, "\xf7"], "\xa9" => [76, "\xf7"], "\xaa" => [104, "\xf7"], "\xab" => [16, "\xf7"], "\xac" => [94, "\xf8"], "\xad" => [76, "\xf8"], "\xae" => [104, "\xf8"], "\xaf" => [16, "\xf8"], "\xb0" => [94, "\xfa"], "\xb1" => [76, "\xfa"], "\xb2" => [104, "\xfa"], "\xb3" => [16, "\xfa"], "\xb4" => [94, "\xfb"], "\xb5" => [76, "\xfb"], "\xb6" => [104, "\xfb"], "\xb7" => [16, "\xfb"], "\xb8" => [94, "\xfc"], "\xb9" => [76, "\xfc"], "\xba" => [104, "\xfc"], "\xbb" => [16, "\xfc"], "\xbc" => [94, "\xfd"], "\xbd" => [76, "\xfd"], "\xbe" => [104, "\xfd"], "\xbf" => [16, "\xfd"], "\xc0" => [94, "\xfe"], "\xc1" => [76, "\xfe"], "\xc2" => [104, "\xfe"], "\xc3" => [16, "\xfe"], "\xc4" => [77, "\x02"], "\xc5" => [18, "\x02"], "\xc6" => [77, "\x03"], "\xc7" => [18, "\x03"], "\xc8" => [77, "\x04"], "\xc9" => [18, "\x04"], "\xca" => [77, "\x05"], "\xcb" => [18, "\x05"], "\xcc" => [77, "\x06"], "\xcd" => [18, "\x06"], "\xce" => [77, "\x07"], "\xcf" => [18, "\x07"], "\xd0" => [77, "\x08"], "\xd1" => [18, "\x08"], "\xd2" => [77, "\v"], "\xd3" => [18, "\v"], "\xd4" => [77, "\f"], "\xd5" => [18, "\f"], "\xd6" => [77, "\x0e"], "\xd7" => [18, "\x0e"], "\xd8" => [77, "\x0f"], "\xd9" => [18, "\x0f"], "\xda" => [77, "\x10"], "\xdb" => [18, "\x10"], "\xdc" => [77, "\x11"], "\xdd" => [18, "\x11"], "\xde" => [77, "\x12"], "\xdf" => [18, "\x12"], "\xe0" => [77, "\x13"], "\xe1" => [18, "\x13"], "\xe2" => [77, "\x14"], "\xe3" => [18, "\x14"], "\xe4" => [77, "\x15"], "\xe5" => [18, "\x15"], "\xe6" => [77, "\x17"], "\xe7" => [18, "\x17"], "\xe8" => [77, "\x18"], "\xe9" => [18, "\x18"], "\xea" => [77, "\x19"], "\xeb" => [18, "\x19"], "\xec" => [77, "\x1a"], "\xed" => [18, "\x1a"], "\xee" => [77, "\x1b"], "\xef" => [18, "\x1b"], "\xf0" => [77, "\x1c"], "\xf1" => [18, "\x1c"], "\xf2" => [77, "\x1d"], "\xf3" => [18, "\x1d"], "\xf4" => [77, "\x1e"], "\xf5" => [18, "\x1e"], "\xf6" => [77, "\x1f"], "\xf7" => [18, "\x1f"], "\xf8" => [77, ""], "\xf9" => [18, ""], "\xfa" => [77, "\xdc"], "\xfb" => [18, "\xdc"], "\xfc" => [77, "\xf9"], "\xfd" => [18, "\xf9"], "\xfe" => [53, null], "\xff" => [66, null]], ["\x00" => [92, "\xab"], "\x01" => [95, "\xab"], "\x02" => [137, "\xab"], "\x03" => [142, "\xab"], "\x04" => [150, "\xab"], "\x05" => [74, "\xab"], "\x06" => [90, "\xab"], "\x07" => [98, "\xab"], "\x08" => [107, "\xab"], "\t" => [140, "\xab"], "\n" => [146, "\xab"], "\v" => [102, "\xab"], "\f" => [113, "\xab"], "\r" => [121, "\xab"], "\x0e" => [128, "\xab"], "\x0f" => [12, "\xab"], "\x10" => [92, "\xce"], "\x11" => [95, "\xce"], "\x12" => [137, "\xce"], "\x13" => [142, "\xce"], "\x14" => [150, "\xce"], "\x15" => [74, "\xce"], "\x16" => [90, "\xce"], "\x17" => [98, "\xce"], "\x18" => [107, "\xce"], "\x19" => [140, "\xce"], "\x1a" => [146, "\xce"], "\x1b" => [102, "\xce"], "\x1c" => [113, "\xce"], "\x1d" => [121, "\xce"], "\x1e" => [128, "\xce"], "\x1f" => [12, "\xce"], " " => [92, "\xd7"], "!" => [95, "\xd7"], "\"" => [137, "\xd7"], "#" => [142, "\xd7"], "\$" => [150, "\xd7"], "%" => [74, "\xd7"], "&" => [90, "\xd7"], "'" => [98, "\xd7"], "(" => [107, "\xd7"], ")" => [140, "\xd7"], "*" => [146, "\xd7"], "+" => [102, "\xd7"], "," => [113, "\xd7"], "-" => [121, "\xd7"], "." => [128, "\xd7"], "/" => [12, "\xd7"], [92, "\xe1"], [95, "\xe1"], [137, "\xe1"], [142, "\xe1"], [150, "\xe1"], [74, "\xe1"], [90, "\xe1"], [98, "\xe1"], [107, "\xe1"], [140, "\xe1"], ":" => [146, "\xe1"], ";" => [102, "\xe1"], "<" => [113, "\xe1"], "=" => [121, "\xe1"], ">" => [128, "\xe1"], "?" => [12, "\xe1"], "@" => [92, "\xec"], "A" => [95, "\xec"], "B" => [137, "\xec"], "C" => [142, "\xec"], "D" => [150, "\xec"], "E" => [74, "\xec"], "F" => [90, "\xec"], "G" => [98, "\xec"], "H" => [107, "\xec"], "I" => [140, "\xec"], "J" => [146, "\xec"], "K" => [102, "\xec"], "L" => [113, "\xec"], "M" => [121, "\xec"], "N" => [128, "\xec"], "O" => [12, "\xec"], "P" => [92, "\xed"], "Q" => [95, "\xed"], "R" => [137, "\xed"], "S" => [142, "\xed"], "T" => [150, "\xed"], "U" => [74, "\xed"], "V" => [90, "\xed"], "W" => [98, "\xed"], "X" => [107, "\xed"], "Y" => [140, "\xed"], "Z" => [146, "\xed"], "[" => [102, "\xed"], "\\" => [113, "\xed"], "]" => [121, "\xed"], "^" => [128, "\xed"], "_" => [12, "\xed"], "`" => [93, "\xc7"], "a" => [138, "\xc7"], "b" => [75, "\xc7"], "c" => [91, "\xc7"], "d" => [108, "\xc7"], "e" => [103, "\xc7"], "f" => [114, "\xc7"], "g" => [14, "\xc7"], "h" => [93, "\xcf"], "i" => [138, "\xcf"], "j" => [75, "\xcf"], "k" => [91, "\xcf"], "l" => [108, "\xcf"], "m" => [103, "\xcf"], "n" => [114, "\xcf"], "o" => [14, "\xcf"], "p" => [93, "\xea"], "q" => [138, "\xea"], "r" => [75, "\xea"], "s" => [91, "\xea"], "t" => [108, "\xea"], "u" => [103, "\xea"], "v" => [114, "\xea"], "w" => [14, "\xea"], "x" => [93, "\xeb"], "y" => [138, "\xeb"], "z" => [75, "\xeb"], "{" => [91, "\xeb"], "|" => [108, "\xeb"], "}" => [103, "\xeb"], "~" => [114, "\xeb"], "" => [14, "\xeb"], "\x80" => [94, "\xc0"], "\x81" => [76, "\xc0"], "\x82" => [104, "\xc0"], "\x83" => [16, "\xc0"], "\x84" => [94, "\xc1"], "\x85" => [76, "\xc1"], "\x86" => [104, "\xc1"], "\x87" => [16, "\xc1"], "\x88" => [94, "\xc8"], "\x89" => [76, "\xc8"], "\x8a" => [104, "\xc8"], "\x8b" => [16, "\xc8"], "\x8c" => [94, "\xc9"], "\x8d" => [76, "\xc9"], "\x8e" => [104, "\xc9"], "\x8f" => [16, "\xc9"], "\x90" => [94, "\xca"], "\x91" => [76, "\xca"], "\x92" => [104, "\xca"], "\x93" => [16, "\xca"], "\x94" => [94, "\xcd"], "\x95" => [76, "\xcd"], "\x96" => [104, "\xcd"], "\x97" => [16, "\xcd"], "\x98" => [94, "\xd2"], "\x99" => [76, "\xd2"], "\x9a" => [104, "\xd2"], "\x9b" => [16, "\xd2"], "\x9c" => [94, "\xd5"], "\x9d" => [76, "\xd5"], "\x9e" => [104, "\xd5"], "\x9f" => [16, "\xd5"], "\xa0" => [94, "\xda"], "\xa1" => [76, "\xda"], "\xa2" => [104, "\xda"], "\xa3" => [16, "\xda"], "\xa4" => [94, "\xdb"], "\xa5" => [76, "\xdb"], "\xa6" => [104, "\xdb"], "\xa7" => [16, "\xdb"], "\xa8" => [94, "\xee"], "\xa9" => [76, "\xee"], "\xaa" => [104, "\xee"], "\xab" => [16, "\xee"], "\xac" => [94, "\xf0"], "\xad" => [76, "\xf0"], "\xae" => [104, "\xf0"], "\xaf" => [16, "\xf0"], "\xb0" => [94, "\xf2"], "\xb1" => [76, "\xf2"], "\xb2" => [104, "\xf2"], "\xb3" => [16, "\xf2"], "\xb4" => [94, "\xf3"], "\xb5" => [76, "\xf3"], "\xb6" => [104, "\xf3"], "\xb7" => [16, "\xf3"], "\xb8" => [94, "\xff"], "\xb9" => [76, "\xff"], "\xba" => [104, "\xff"], "\xbb" => [16, "\xff"], "\xbc" => [77, "\xcb"], "\xbd" => [18, "\xcb"], "\xbe" => [77, "\xcc"], "\xbf" => [18, "\xcc"], "\xc0" => [77, "\xd3"], "\xc1" => [18, "\xd3"], "\xc2" => [77, "\xd4"], "\xc3" => [18, "\xd4"], "\xc4" => [77, "\xd6"], "\xc5" => [18, "\xd6"], "\xc6" => [77, "\xdd"], "\xc7" => [18, "\xdd"], "\xc8" => [77, "\xde"], "\xc9" => [18, "\xde"], "\xca" => [77, "\xdf"], "\xcb" => [18, "\xdf"], "\xcc" => [77, "\xf1"], "\xcd" => [18, "\xf1"], "\xce" => [77, "\xf4"], "\xcf" => [18, "\xf4"], "\xd0" => [77, "\xf5"], "\xd1" => [18, "\xf5"], "\xd2" => [77, "\xf6"], "\xd3" => [18, "\xf6"], "\xd4" => [77, "\xf7"], "\xd5" => [18, "\xf7"], "\xd6" => [77, "\xf8"], "\xd7" => [18, "\xf8"], "\xd8" => [77, "\xfa"], "\xd9" => [18, "\xfa"], "\xda" => [77, "\xfb"], "\xdb" => [18, "\xfb"], "\xdc" => [77, "\xfc"], "\xdd" => [18, "\xfc"], "\xde" => [77, "\xfd"], "\xdf" => [18, "\xfd"], "\xe0" => [77, "\xfe"], "\xe1" => [18, "\xfe"], "\xe2" => [0, "\x02"], "\xe3" => [0, "\x03"], "\xe4" => [0, "\x04"], "\xe5" => [0, "\x05"], "\xe6" => [0, "\x06"], "\xe7" => [0, "\x07"], "\xe8" => [0, "\x08"], "\xe9" => [0, "\v"], "\xea" => [0, "\f"], "\xeb" => [0, "\x0e"], "\xec" => [0, "\x0f"], "\xed" => [0, "\x10"], "\xee" => [0, "\x11"], "\xef" => [0, "\x12"], "\xf0" => [0, "\x13"], "\xf1" => [0, "\x14"], "\xf2" => [0, "\x15"], "\xf3" => [0, "\x17"], "\xf4" => [0, "\x18"], "\xf5" => [0, "\x19"], "\xf6" => [0, "\x1a"], "\xf7" => [0, "\x1b"], "\xf8" => [0, "\x1c"], "\xf9" => [0, "\x1d"], "\xfa" => [0, "\x1e"], "\xfb" => [0, "\x1f"], "\xfc" => [0, ""], "\xfd" => [0, "\xdc"], "\xfe" => [0, "\xf9"], "\xff" => [54, null]], ["\x00" => [92, "\xbc"], "\x01" => [95, "\xbc"], "\x02" => [137, "\xbc"], "\x03" => [142, "\xbc"], "\x04" => [150, "\xbc"], "\x05" => [74, "\xbc"], "\x06" => [90, "\xbc"], "\x07" => [98, "\xbc"], "\x08" => [107, "\xbc"], "\t" => [140, "\xbc"], "\n" => [146, "\xbc"], "\v" => [102, "\xbc"], "\f" => [113, "\xbc"], "\r" => [121, "\xbc"], "\x0e" => [128, "\xbc"], "\x0f" => [12, "\xbc"], "\x10" => [92, "\xbf"], "\x11" => [95, "\xbf"], "\x12" => [137, "\xbf"], "\x13" => [142, "\xbf"], "\x14" => [150, "\xbf"], "\x15" => [74, "\xbf"], "\x16" => [90, "\xbf"], "\x17" => [98, "\xbf"], "\x18" => [107, "\xbf"], "\x19" => [140, "\xbf"], "\x1a" => [146, "\xbf"], "\x1b" => [102, "\xbf"], "\x1c" => [113, "\xbf"], "\x1d" => [121, "\xbf"], "\x1e" => [128, "\xbf"], "\x1f" => [12, "\xbf"], " " => [92, "\xc5"], "!" => [95, "\xc5"], "\"" => [137, "\xc5"], "#" => [142, "\xc5"], "\$" => [150, "\xc5"], "%" => [74, "\xc5"], "&" => [90, "\xc5"], "'" => [98, "\xc5"], "(" => [107, "\xc5"], ")" => [140, "\xc5"], "*" => [146, "\xc5"], "+" => [102, "\xc5"], "," => [113, "\xc5"], "-" => [121, "\xc5"], "." => [128, "\xc5"], "/" => [12, "\xc5"], [92, "\xe7"], [95, "\xe7"], [137, "\xe7"], [142, "\xe7"], [150, "\xe7"], [74, "\xe7"], [90, "\xe7"], [98, "\xe7"], [107, "\xe7"], [140, "\xe7"], ":" => [146, "\xe7"], ";" => [102, "\xe7"], "<" => [113, "\xe7"], "=" => [121, "\xe7"], ">" => [128, "\xe7"], "?" => [12, "\xe7"], "@" => [92, "\xef"], "A" => [95, "\xef"], "B" => [137, "\xef"], "C" => [142, "\xef"], "D" => [150, "\xef"], "E" => [74, "\xef"], "F" => [90, "\xef"], "G" => [98, "\xef"], "H" => [107, "\xef"], "I" => [140, "\xef"], "J" => [146, "\xef"], "K" => [102, "\xef"], "L" => [113, "\xef"], "M" => [121, "\xef"], "N" => [128, "\xef"], "O" => [12, "\xef"], "P" => [93, "\t"], "Q" => [138, "\t"], "R" => [75, "\t"], "S" => [91, "\t"], "T" => [108, "\t"], "U" => [103, "\t"], "V" => [114, "\t"], "W" => [14, "\t"], "X" => [93, "\x8e"], "Y" => [138, "\x8e"], "Z" => [75, "\x8e"], "[" => [91, "\x8e"], "\\" => [108, "\x8e"], "]" => [103, "\x8e"], "^" => [114, "\x8e"], "_" => [14, "\x8e"], "`" => [93, "\x90"], "a" => [138, "\x90"], "b" => [75, "\x90"], "c" => [91, "\x90"], "d" => [108, "\x90"], "e" => [103, "\x90"], "f" => [114, "\x90"], "g" => [14, "\x90"], "h" => [93, "\x91"], "i" => [138, "\x91"], "j" => [75, "\x91"], "k" => [91, "\x91"], "l" => [108, "\x91"], "m" => [103, "\x91"], "n" => [114, "\x91"], "o" => [14, "\x91"], "p" => [93, "\x94"], "q" => [138, "\x94"], "r" => [75, "\x94"], "s" => [91, "\x94"], "t" => [108, "\x94"], "u" => [103, "\x94"], "v" => [114, "\x94"], "w" => [14, "\x94"], "x" => [93, "\x9f"], "y" => [138, "\x9f"], "z" => [75, "\x9f"], "{" => [91, "\x9f"], "|" => [108, "\x9f"], "}" => [103, "\x9f"], "~" => [114, "\x9f"], "" => [14, "\x9f"], "\x80" => [93, "\xab"], "\x81" => [138, "\xab"], "\x82" => [75, "\xab"], "\x83" => [91, "\xab"], "\x84" => [108, "\xab"], "\x85" => [103, "\xab"], "\x86" => [114, "\xab"], "\x87" => [14, "\xab"], "\x88" => [93, "\xce"], "\x89" => [138, "\xce"], "\x8a" => [75, "\xce"], "\x8b" => [91, "\xce"], "\x8c" => [108, "\xce"], "\x8d" => [103, "\xce"], "\x8e" => [114, "\xce"], "\x8f" => [14, "\xce"], "\x90" => [93, "\xd7"], "\x91" => [138, "\xd7"], "\x92" => [75, "\xd7"], "\x93" => [91, "\xd7"], "\x94" => [108, "\xd7"], "\x95" => [103, "\xd7"], "\x96" => [114, "\xd7"], "\x97" => [14, "\xd7"], "\x98" => [93, "\xe1"], "\x99" => [138, "\xe1"], "\x9a" => [75, "\xe1"], "\x9b" => [91, "\xe1"], "\x9c" => [108, "\xe1"], "\x9d" => [103, "\xe1"], "\x9e" => [114, "\xe1"], "\x9f" => [14, "\xe1"], "\xa0" => [93, "\xec"], "\xa1" => [138, "\xec"], "\xa2" => [75, "\xec"], "\xa3" => [91, "\xec"], "\xa4" => [108, "\xec"], "\xa5" => [103, "\xec"], "\xa6" => [114, "\xec"], "\xa7" => [14, "\xec"], "\xa8" => [93, "\xed"], "\xa9" => [138, "\xed"], "\xaa" => [75, "\xed"], "\xab" => [91, "\xed"], "\xac" => [108, "\xed"], "\xad" => [103, "\xed"], "\xae" => [114, "\xed"], "\xaf" => [14, "\xed"], "\xb0" => [94, "\xc7"], "\xb1" => [76, "\xc7"], "\xb2" => [104, "\xc7"], "\xb3" => [16, "\xc7"], "\xb4" => [94, "\xcf"], "\xb5" => [76, "\xcf"], "\xb6" => [104, "\xcf"], "\xb7" => [16, "\xcf"], "\xb8" => [94, "\xea"], "\xb9" => [76, "\xea"], "\xba" => [104, "\xea"], "\xbb" => [16, "\xea"], "\xbc" => [94, "\xeb"], "\xbd" => [76, "\xeb"], "\xbe" => [104, "\xeb"], "\xbf" => [16, "\xeb"], "\xc0" => [77, "\xc0"], "\xc1" => [18, "\xc0"], "\xc2" => [77, "\xc1"], "\xc3" => [18, "\xc1"], "\xc4" => [77, "\xc8"], "\xc5" => [18, "\xc8"], "\xc6" => [77, "\xc9"], "\xc7" => [18, "\xc9"], "\xc8" => [77, "\xca"], "\xc9" => [18, "\xca"], "\xca" => [77, "\xcd"], "\xcb" => [18, "\xcd"], "\xcc" => [77, "\xd2"], "\xcd" => [18, "\xd2"], "\xce" => [77, "\xd5"], "\xcf" => [18, "\xd5"], "\xd0" => [77, "\xda"], "\xd1" => [18, "\xda"], "\xd2" => [77, "\xdb"], "\xd3" => [18, "\xdb"], "\xd4" => [77, "\xee"], "\xd5" => [18, "\xee"], "\xd6" => [77, "\xf0"], "\xd7" => [18, "\xf0"], "\xd8" => [77, "\xf2"], "\xd9" => [18, "\xf2"], "\xda" => [77, "\xf3"], "\xdb" => [18, "\xf3"], "\xdc" => [77, "\xff"], "\xdd" => [18, "\xff"], "\xde" => [0, "\xcb"], "\xdf" => [0, "\xcc"], "\xe0" => [0, "\xd3"], "\xe1" => [0, "\xd4"], "\xe2" => [0, "\xd6"], "\xe3" => [0, "\xdd"], "\xe4" => [0, "\xde"], "\xe5" => [0, "\xdf"], "\xe6" => [0, "\xf1"], "\xe7" => [0, "\xf4"], "\xe8" => [0, "\xf5"], "\xe9" => [0, "\xf6"], "\xea" => [0, "\xf7"], "\xeb" => [0, "\xf8"], "\xec" => [0, "\xfa"], "\xed" => [0, "\xfb"], "\xee" => [0, "\xfc"], "\xef" => [0, "\xfd"], "\xf0" => [0, "\xfe"], "\xf1" => [38, null], "\xf2" => [42, null], "\xf3" => [44, null], "\xf4" => [45, null], "\xf5" => [58, null], "\xf6" => [59, null], "\xf7" => [61, null], "\xf8" => [62, null], "\xf9" => [65, null], "\xfa" => [67, null], "\xfb" => [69, null], "\xfc" => [70, null], "\xfd" => [72, null], "\xfe" => [154, null], "\xff" => [55, null]], ["\x00" => [94, "\x020"], "\x01" => [76, "\x020"], "\x02" => [104, "\x020"], "\x03" => [16, "\x020"], "\x04" => [94, "\x021"], "\x05" => [76, "\x021"], "\x06" => [104, "\x021"], "\x07" => [16, "\x021"], "\x08" => [94, "\x022"], "\t" => [76, "\x022"], "\n" => [104, "\x022"], "\v" => [16, "\x022"], "\f" => [94, "\x02a"], "\r" => [76, "\x02a"], "\x0e" => [104, "\x02a"], "\x0f" => [16, "\x02a"], "\x10" => [94, "\x02c"], "\x11" => [76, "\x02c"], "\x12" => [104, "\x02c"], "\x13" => [16, "\x02c"], "\x14" => [94, "\x02e"], "\x15" => [76, "\x02e"], "\x16" => [104, "\x02e"], "\x17" => [16, "\x02e"], "\x18" => [94, "\x02i"], "\x19" => [76, "\x02i"], "\x1a" => [104, "\x02i"], "\x1b" => [16, "\x02i"], "\x1c" => [94, "\x02o"], "\x1d" => [76, "\x02o"], "\x1e" => [104, "\x02o"], "\x1f" => [16, "\x02o"], " " => [94, "\x02s"], "!" => [76, "\x02s"], "\"" => [104, "\x02s"], "#" => [16, "\x02s"], "\$" => [94, "\x02t"], "%" => [76, "\x02t"], "&" => [104, "\x02t"], "'" => [16, "\x02t"], "(" => [77, "\x02 "], ")" => [18, "\x02 "], "*" => [77, "\x02%"], "+" => [18, "\x02%"], "," => [77, "\x02-"], "-" => [18, "\x02-"], "." => [77, "\x02."], "/" => [18, "\x02."], [77, "\x02/"], [18, "\x02/"], [77, "\x023"], [18, "\x023"], [77, "\x024"], [18, "\x024"], [77, "\x025"], [18, "\x025"], [77, "\x026"], [18, "\x026"], ":" => [77, "\x027"], ";" => [18, "\x027"], "<" => [77, "\x028"], "=" => [18, "\x028"], ">" => [77, "\x029"], "?" => [18, "\x029"], "@" => [77, "\x02="], "A" => [18, "\x02="], "B" => [77, "\x02A"], "C" => [18, "\x02A"], "D" => [77, "\x02_"], "E" => [18, "\x02_"], "F" => [77, "\x02b"], "G" => [18, "\x02b"], "H" => [77, "\x02d"], "I" => [18, "\x02d"], "J" => [77, "\x02f"], "K" => [18, "\x02f"], "L" => [77, "\x02g"], "M" => [18, "\x02g"], "N" => [77, "\x02h"], "O" => [18, "\x02h"], "P" => [77, "\x02l"], "Q" => [18, "\x02l"], "R" => [77, "\x02m"], "S" => [18, "\x02m"], "T" => [77, "\x02n"], "U" => [18, "\x02n"], "V" => [77, "\x02p"], "W" => [18, "\x02p"], "X" => [77, "\x02r"], "Y" => [18, "\x02r"], "Z" => [77, "\x02u"], "[" => [18, "\x02u"], "\\" => [0, "\x02:"], "]" => [0, "\x02B"], "^" => [0, "\x02C"], "_" => [0, "\x02D"], "`" => [0, "\x02E"], "a" => [0, "\x02F"], "b" => [0, "\x02G"], "c" => [0, "\x02H"], "d" => [0, "\x02I"], "e" => [0, "\x02J"], "f" => [0, "\x02K"], "g" => [0, "\x02L"], "h" => [0, "\x02M"], "i" => [0, "\x02N"], "j" => [0, "\x02O"], "k" => [0, "\x02P"], "l" => [0, "\x02Q"], "m" => [0, "\x02R"], "n" => [0, "\x02S"], "o" => [0, "\x02T"], "p" => [0, "\x02U"], "q" => [0, "\x02V"], "r" => [0, "\x02W"], "s" => [0, "\x02Y"], "t" => [0, "\x02j"], "u" => [0, "\x02k"], "v" => [0, "\x02q"], "w" => [0, "\x02v"], "x" => [0, "\x02w"], "y" => [0, "\x02x"], "z" => [0, "\x02y"], "{" => [0, "\x02z"], "|" => [82, "\x02"], "}" => [87, "\x02"], "~" => [130, "\x02"], "" => [9, "\x02"], "\x80" => [94, "\x030"], "\x81" => [76, "\x030"], "\x82" => [104, "\x030"], "\x83" => [16, "\x030"], "\x84" => [94, "\x031"], "\x85" => [76, "\x031"], "\x86" => [104, "\x031"], "\x87" => [16, "\x031"], "\x88" => [94, "\x032"], "\x89" => [76, "\x032"], "\x8a" => [104, "\x032"], "\x8b" => [16, "\x032"], "\x8c" => [94, "\x03a"], "\x8d" => [76, "\x03a"], "\x8e" => [104, "\x03a"], "\x8f" => [16, "\x03a"], "\x90" => [94, "\x03c"], "\x91" => [76, "\x03c"], "\x92" => [104, "\x03c"], "\x93" => [16, "\x03c"], "\x94" => [94, "\x03e"], "\x95" => [76, "\x03e"], "\x96" => [104, "\x03e"], "\x97" => [16, "\x03e"], "\x98" => [94, "\x03i"], "\x99" => [76, "\x03i"], "\x9a" => [104, "\x03i"], "\x9b" => [16, "\x03i"], "\x9c" => [94, "\x03o"], "\x9d" => [76, "\x03o"], "\x9e" => [104, "\x03o"], "\x9f" => [16, "\x03o"], "\xa0" => [94, "\x03s"], "\xa1" => [76, "\x03s"], "\xa2" => [104, "\x03s"], "\xa3" => [16, "\x03s"], "\xa4" => [94, "\x03t"], "\xa5" => [76, "\x03t"], "\xa6" => [104, "\x03t"], "\xa7" => [16, "\x03t"], "\xa8" => [77, "\x03 "], "\xa9" => [18, "\x03 "], "\xaa" => [77, "\x03%"], "\xab" => [18, "\x03%"], "\xac" => [77, "\x03-"], "\xad" => [18, "\x03-"], "\xae" => [77, "\x03."], "\xaf" => [18, "\x03."], "\xb0" => [77, "\x03/"], "\xb1" => [18, "\x03/"], "\xb2" => [77, "\x033"], "\xb3" => [18, "\x033"], "\xb4" => [77, "\x034"], "\xb5" => [18, "\x034"], "\xb6" => [77, "\x035"], "\xb7" => [18, "\x035"], "\xb8" => [77, "\x036"], "\xb9" => [18, "\x036"], "\xba" => [77, "\x037"], "\xbb" => [18, "\x037"], "\xbc" => [77, "\x038"], "\xbd" => [18, "\x038"], "\xbe" => [77, "\x039"], "\xbf" => [18, "\x039"], "\xc0" => [77, "\x03="], "\xc1" => [18, "\x03="], "\xc2" => [77, "\x03A"], "\xc3" => [18, "\x03A"], "\xc4" => [77, "\x03_"], "\xc5" => [18, "\x03_"], "\xc6" => [77, "\x03b"], "\xc7" => [18, "\x03b"], "\xc8" => [77, "\x03d"], "\xc9" => [18, "\x03d"], "\xca" => [77, "\x03f"], "\xcb" => [18, "\x03f"], "\xcc" => [77, "\x03g"], "\xcd" => [18, "\x03g"], "\xce" => [77, "\x03h"], "\xcf" => [18, "\x03h"], "\xd0" => [77, "\x03l"], "\xd1" => [18, "\x03l"], "\xd2" => [77, "\x03m"], "\xd3" => [18, "\x03m"], "\xd4" => [77, "\x03n"], "\xd5" => [18, "\x03n"], "\xd6" => [77, "\x03p"], "\xd7" => [18, "\x03p"], "\xd8" => [77, "\x03r"], "\xd9" => [18, "\x03r"], "\xda" => [77, "\x03u"], "\xdb" => [18, "\x03u"], "\xdc" => [0, "\x03:"], "\xdd" => [0, "\x03B"], "\xde" => [0, "\x03C"], "\xdf" => [0, "\x03D"], "\xe0" => [0, "\x03E"], "\xe1" => [0, "\x03F"], "\xe2" => [0, "\x03G"], "\xe3" => [0, "\x03H"], "\xe4" => [0, "\x03I"], "\xe5" => [0, "\x03J"], "\xe6" => [0, "\x03K"], "\xe7" => [0, "\x03L"], "\xe8" => [0, "\x03M"], "\xe9" => [0, "\x03N"], "\xea" => [0, "\x03O"], "\xeb" => [0, "\x03P"], "\xec" => [0, "\x03Q"], "\xed" => [0, "\x03R"], "\xee" => [0, "\x03S"], "\xef" => [0, "\x03T"], "\xf0" => [0, "\x03U"], "\xf1" => [0, "\x03V"], "\xf2" => [0, "\x03W"], "\xf3" => [0, "\x03Y"], "\xf4" => [0, "\x03j"], "\xf5" => [0, "\x03k"], "\xf6" => [0, "\x03q"], "\xf7" => [0, "\x03v"], "\xf8" => [0, "\x03w"], "\xf9" => [0, "\x03x"], "\xfa" => [0, "\x03y"], "\xfb" => [0, "\x03z"], "\xfc" => [82, "\x03"], "\xfd" => [87, "\x03"], "\xfe" => [130, "\x03"], "\xff" => [9, "\x03"]], ["\x00" => [93, "\x93"], "\x01" => [138, "\x93"], "\x02" => [75, "\x93"], "\x03" => [91, "\x93"], "\x04" => [108, "\x93"], "\x05" => [103, "\x93"], "\x06" => [114, "\x93"], "\x07" => [14, "\x93"], "\x08" => [93, "\x95"], "\t" => [138, "\x95"], "\n" => [75, "\x95"], "\v" => [91, "\x95"], "\f" => [108, "\x95"], "\r" => [103, "\x95"], "\x0e" => [114, "\x95"], "\x0f" => [14, "\x95"], "\x10" => [93, "\x96"], "\x11" => [138, "\x96"], "\x12" => [75, "\x96"], "\x13" => [91, "\x96"], "\x14" => [108, "\x96"], "\x15" => [103, "\x96"], "\x16" => [114, "\x96"], "\x17" => [14, "\x96"], "\x18" => [93, "\x97"], "\x19" => [138, "\x97"], "\x1a" => [75, "\x97"], "\x1b" => [91, "\x97"], "\x1c" => [108, "\x97"], "\x1d" => [103, "\x97"], "\x1e" => [114, "\x97"], "\x1f" => [14, "\x97"], " " => [93, "\x98"], "!" => [138, "\x98"], "\"" => [75, "\x98"], "#" => [91, "\x98"], "\$" => [108, "\x98"], "%" => [103, "\x98"], "&" => [114, "\x98"], "'" => [14, "\x98"], "(" => [93, "\x9b"], ")" => [138, "\x9b"], "*" => [75, "\x9b"], "+" => [91, "\x9b"], "," => [108, "\x9b"], "-" => [103, "\x9b"], "." => [114, "\x9b"], "/" => [14, "\x9b"], [93, "\x9d"], [138, "\x9d"], [75, "\x9d"], [91, "\x9d"], [108, "\x9d"], [103, "\x9d"], [114, "\x9d"], [14, "\x9d"], [93, "\x9e"], [138, "\x9e"], ":" => [75, "\x9e"], ";" => [91, "\x9e"], "<" => [108, "\x9e"], "=" => [103, "\x9e"], ">" => [114, "\x9e"], "?" => [14, "\x9e"], "@" => [93, "\xa5"], "A" => [138, "\xa5"], "B" => [75, "\xa5"], "C" => [91, "\xa5"], "D" => [108, "\xa5"], "E" => [103, "\xa5"], "F" => [114, "\xa5"], "G" => [14, "\xa5"], "H" => [93, "\xa6"], "I" => [138, "\xa6"], "J" => [75, "\xa6"], "K" => [91, "\xa6"], "L" => [108, "\xa6"], "M" => [103, "\xa6"], "N" => [114, "\xa6"], "O" => [14, "\xa6"], "P" => [93, "\xa8"], "Q" => [138, "\xa8"], "R" => [75, "\xa8"], "S" => [91, "\xa8"], "T" => [108, "\xa8"], "U" => [103, "\xa8"], "V" => [114, "\xa8"], "W" => [14, "\xa8"], "X" => [93, "\xae"], "Y" => [138, "\xae"], "Z" => [75, "\xae"], "[" => [91, "\xae"], "\\" => [108, "\xae"], "]" => [103, "\xae"], "^" => [114, "\xae"], "_" => [14, "\xae"], "`" => [93, "\xaf"], "a" => [138, "\xaf"], "b" => [75, "\xaf"], "c" => [91, "\xaf"], "d" => [108, "\xaf"], "e" => [103, "\xaf"], "f" => [114, "\xaf"], "g" => [14, "\xaf"], "h" => [93, "\xb4"], "i" => [138, "\xb4"], "j" => [75, "\xb4"], "k" => [91, "\xb4"], "l" => [108, "\xb4"], "m" => [103, "\xb4"], "n" => [114, "\xb4"], "o" => [14, "\xb4"], "p" => [93, "\xb6"], "q" => [138, "\xb6"], "r" => [75, "\xb6"], "s" => [91, "\xb6"], "t" => [108, "\xb6"], "u" => [103, "\xb6"], "v" => [114, "\xb6"], "w" => [14, "\xb6"], "x" => [93, "\xb7"], "y" => [138, "\xb7"], "z" => [75, "\xb7"], "{" => [91, "\xb7"], "|" => [108, "\xb7"], "}" => [103, "\xb7"], "~" => [114, "\xb7"], "" => [14, "\xb7"], "\x80" => [93, "\xbc"], "\x81" => [138, "\xbc"], "\x82" => [75, "\xbc"], "\x83" => [91, "\xbc"], "\x84" => [108, "\xbc"], "\x85" => [103, "\xbc"], "\x86" => [114, "\xbc"], "\x87" => [14, "\xbc"], "\x88" => [93, "\xbf"], "\x89" => [138, "\xbf"], "\x8a" => [75, "\xbf"], "\x8b" => [91, "\xbf"], "\x8c" => [108, "\xbf"], "\x8d" => [103, "\xbf"], "\x8e" => [114, "\xbf"], "\x8f" => [14, "\xbf"], "\x90" => [93, "\xc5"], "\x91" => [138, "\xc5"], "\x92" => [75, "\xc5"], "\x93" => [91, "\xc5"], "\x94" => [108, "\xc5"], "\x95" => [103, "\xc5"], "\x96" => [114, "\xc5"], "\x97" => [14, "\xc5"], "\x98" => [93, "\xe7"], "\x99" => [138, "\xe7"], "\x9a" => [75, "\xe7"], "\x9b" => [91, "\xe7"], "\x9c" => [108, "\xe7"], "\x9d" => [103, "\xe7"], "\x9e" => [114, "\xe7"], "\x9f" => [14, "\xe7"], "\xa0" => [93, "\xef"], "\xa1" => [138, "\xef"], "\xa2" => [75, "\xef"], "\xa3" => [91, "\xef"], "\xa4" => [108, "\xef"], "\xa5" => [103, "\xef"], "\xa6" => [114, "\xef"], "\xa7" => [14, "\xef"], "\xa8" => [94, "\t"], "\xa9" => [76, "\t"], "\xaa" => [104, "\t"], "\xab" => [16, "\t"], "\xac" => [94, "\x8e"], "\xad" => [76, "\x8e"], "\xae" => [104, "\x8e"], "\xaf" => [16, "\x8e"], "\xb0" => [94, "\x90"], "\xb1" => [76, "\x90"], "\xb2" => [104, "\x90"], "\xb3" => [16, "\x90"], "\xb4" => [94, "\x91"], "\xb5" => [76, "\x91"], "\xb6" => [104, "\x91"], "\xb7" => [16, "\x91"], "\xb8" => [94, "\x94"], "\xb9" => [76, "\x94"], "\xba" => [104, "\x94"], "\xbb" => [16, "\x94"], "\xbc" => [94, "\x9f"], "\xbd" => [76, "\x9f"], "\xbe" => [104, "\x9f"], "\xbf" => [16, "\x9f"], "\xc0" => [94, "\xab"], "\xc1" => [76, "\xab"], "\xc2" => [104, "\xab"], "\xc3" => [16, "\xab"], "\xc4" => [94, "\xce"], "\xc5" => [76, "\xce"], "\xc6" => [104, "\xce"], "\xc7" => [16, "\xce"], "\xc8" => [94, "\xd7"], "\xc9" => [76, "\xd7"], "\xca" => [104, "\xd7"], "\xcb" => [16, "\xd7"], "\xcc" => [94, "\xe1"], "\xcd" => [76, "\xe1"], "\xce" => [104, "\xe1"], "\xcf" => [16, "\xe1"], "\xd0" => [94, "\xec"], "\xd1" => [76, "\xec"], "\xd2" => [104, "\xec"], "\xd3" => [16, "\xec"], "\xd4" => [94, "\xed"], "\xd5" => [76, "\xed"], "\xd6" => [104, "\xed"], "\xd7" => [16, "\xed"], "\xd8" => [77, "\xc7"], "\xd9" => [18, "\xc7"], "\xda" => [77, "\xcf"], "\xdb" => [18, "\xcf"], "\xdc" => [77, "\xea"], "\xdd" => [18, "\xea"], "\xde" => [77, "\xeb"], "\xdf" => [18, "\xeb"], "\xe0" => [0, "\xc0"], "\xe1" => [0, "\xc1"], "\xe2" => [0, "\xc8"], "\xe3" => [0, "\xc9"], "\xe4" => [0, "\xca"], "\xe5" => [0, "\xcd"], "\xe6" => [0, "\xd2"], "\xe7" => [0, "\xd5"], "\xe8" => [0, "\xda"], "\xe9" => [0, "\xdb"], "\xea" => [0, "\xee"], "\xeb" => [0, "\xf0"], "\xec" => [0, "\xf2"], "\xed" => [0, "\xf3"], "\xee" => [0, "\xff"], "\xef" => [233, null], "\xf0" => [238, null], "\xf1" => [240, null], "\xf2" => [246, null], "\xf3" => [254, null], "\xf4" => [257, null], "\xf5" => [259, null], "\xf6" => [260, null], "\xf7" => [262, null], "\xf8" => [40, null], "\xf9" => [43, null], "\xfa" => [46, null], "\xfb" => [60, null], "\xfc" => [63, null], "\xfd" => [68, null], "\xfe" => [71, null], "\xff" => [56, null]], ["\x00" => [94, "\xfe0"], "\x01" => [76, "\xfe0"], "\x02" => [104, "\xfe0"], "\x03" => [16, "\xfe0"], "\x04" => [94, "\xfe1"], "\x05" => [76, "\xfe1"], "\x06" => [104, "\xfe1"], "\x07" => [16, "\xfe1"], "\x08" => [94, "\xfe2"], "\t" => [76, "\xfe2"], "\n" => [104, "\xfe2"], "\v" => [16, "\xfe2"], "\f" => [94, "\xfea"], "\r" => [76, "\xfea"], "\x0e" => [104, "\xfea"], "\x0f" => [16, "\xfea"], "\x10" => [94, "\xfec"], "\x11" => [76, "\xfec"], "\x12" => [104, "\xfec"], "\x13" => [16, "\xfec"], "\x14" => [94, "\xfee"], "\x15" => [76, "\xfee"], "\x16" => [104, "\xfee"], "\x17" => [16, "\xfee"], "\x18" => [94, "\xfei"], "\x19" => [76, "\xfei"], "\x1a" => [104, "\xfei"], "\x1b" => [16, "\xfei"], "\x1c" => [94, "\xfeo"], "\x1d" => [76, "\xfeo"], "\x1e" => [104, "\xfeo"], "\x1f" => [16, "\xfeo"], " " => [94, "\xfes"], "!" => [76, "\xfes"], "\"" => [104, "\xfes"], "#" => [16, "\xfes"], "\$" => [94, "\xfet"], "%" => [76, "\xfet"], "&" => [104, "\xfet"], "'" => [16, "\xfet"], "(" => [77, "\xfe "], ")" => [18, "\xfe "], "*" => [77, "\xfe%"], "+" => [18, "\xfe%"], "," => [77, "\xfe-"], "-" => [18, "\xfe-"], "." => [77, "\xfe."], "/" => [18, "\xfe."], [77, "\xfe/"], [18, "\xfe/"], [77, "\xfe3"], [18, "\xfe3"], [77, "\xfe4"], [18, "\xfe4"], [77, "\xfe5"], [18, "\xfe5"], [77, "\xfe6"], [18, "\xfe6"], ":" => [77, "\xfe7"], ";" => [18, "\xfe7"], "<" => [77, "\xfe8"], "=" => [18, "\xfe8"], ">" => [77, "\xfe9"], "?" => [18, "\xfe9"], "@" => [77, "\xfe="], "A" => [18, "\xfe="], "B" => [77, "\xfeA"], "C" => [18, "\xfeA"], "D" => [77, "\xfe_"], "E" => [18, "\xfe_"], "F" => [77, "\xfeb"], "G" => [18, "\xfeb"], "H" => [77, "\xfed"], "I" => [18, "\xfed"], "J" => [77, "\xfef"], "K" => [18, "\xfef"], "L" => [77, "\xfeg"], "M" => [18, "\xfeg"], "N" => [77, "\xfeh"], "O" => [18, "\xfeh"], "P" => [77, "\xfel"], "Q" => [18, "\xfel"], "R" => [77, "\xfem"], "S" => [18, "\xfem"], "T" => [77, "\xfen"], "U" => [18, "\xfen"], "V" => [77, "\xfep"], "W" => [18, "\xfep"], "X" => [77, "\xfer"], "Y" => [18, "\xfer"], "Z" => [77, "\xfeu"], "[" => [18, "\xfeu"], "\\" => [0, "\xfe:"], "]" => [0, "\xfeB"], "^" => [0, "\xfeC"], "_" => [0, "\xfeD"], "`" => [0, "\xfeE"], "a" => [0, "\xfeF"], "b" => [0, "\xfeG"], "c" => [0, "\xfeH"], "d" => [0, "\xfeI"], "e" => [0, "\xfeJ"], "f" => [0, "\xfeK"], "g" => [0, "\xfeL"], "h" => [0, "\xfeM"], "i" => [0, "\xfeN"], "j" => [0, "\xfeO"], "k" => [0, "\xfeP"], "l" => [0, "\xfeQ"], "m" => [0, "\xfeR"], "n" => [0, "\xfeS"], "o" => [0, "\xfeT"], "p" => [0, "\xfeU"], "q" => [0, "\xfeV"], "r" => [0, "\xfeW"], "s" => [0, "\xfeY"], "t" => [0, "\xfej"], "u" => [0, "\xfek"], "v" => [0, "\xfeq"], "w" => [0, "\xfev"], "x" => [0, "\xfew"], "y" => [0, "\xfex"], "z" => [0, "\xfey"], "{" => [0, "\xfez"], "|" => [82, "\xfe"], "}" => [87, "\xfe"], "~" => [130, "\xfe"], "" => [9, "\xfe"], "\x80" => [77, "\x020"], "\x81" => [18, "\x020"], "\x82" => [77, "\x021"], "\x83" => [18, "\x021"], "\x84" => [77, "\x022"], "\x85" => [18, "\x022"], "\x86" => [77, "\x02a"], "\x87" => [18, "\x02a"], "\x88" => [77, "\x02c"], "\x89" => [18, "\x02c"], "\x8a" => [77, "\x02e"], "\x8b" => [18, "\x02e"], "\x8c" => [77, "\x02i"], "\x8d" => [18, "\x02i"], "\x8e" => [77, "\x02o"], "\x8f" => [18, "\x02o"], "\x90" => [77, "\x02s"], "\x91" => [18, "\x02s"], "\x92" => [77, "\x02t"], "\x93" => [18, "\x02t"], "\x94" => [0, "\x02 "], "\x95" => [0, "\x02%"], "\x96" => [0, "\x02-"], "\x97" => [0, "\x02."], "\x98" => [0, "\x02/"], "\x99" => [0, "\x023"], "\x9a" => [0, "\x024"], "\x9b" => [0, "\x025"], "\x9c" => [0, "\x026"], "\x9d" => [0, "\x027"], "\x9e" => [0, "\x028"], "\x9f" => [0, "\x029"], "\xa0" => [0, "\x02="], "\xa1" => [0, "\x02A"], "\xa2" => [0, "\x02_"], "\xa3" => [0, "\x02b"], "\xa4" => [0, "\x02d"], "\xa5" => [0, "\x02f"], "\xa6" => [0, "\x02g"], "\xa7" => [0, "\x02h"], "\xa8" => [0, "\x02l"], "\xa9" => [0, "\x02m"], "\xaa" => [0, "\x02n"], "\xab" => [0, "\x02p"], "\xac" => [0, "\x02r"], "\xad" => [0, "\x02u"], "\xae" => [100, "\x02"], "\xaf" => [110, "\x02"], "\xb0" => [111, "\x02"], "\xb1" => [115, "\x02"], "\xb2" => [116, "\x02"], "\xb3" => [118, "\x02"], "\xb4" => [119, "\x02"], "\xb5" => [122, "\x02"], "\xb6" => [123, "\x02"], "\xb7" => [125, "\x02"], "\xb8" => [126, "\x02"], "\xb9" => [129, "\x02"], "\xba" => [143, "\x02"], "\xbb" => [148, "\x02"], "\xbc" => [151, "\x02"], "\xbd" => [153, "\x02"], "\xbe" => [83, "\x02"], "\xbf" => [10, "\x02"], "\xc0" => [77, "\x030"], "\xc1" => [18, "\x030"], "\xc2" => [77, "\x031"], "\xc3" => [18, "\x031"], "\xc4" => [77, "\x032"], "\xc5" => [18, "\x032"], "\xc6" => [77, "\x03a"], "\xc7" => [18, "\x03a"], "\xc8" => [77, "\x03c"], "\xc9" => [18, "\x03c"], "\xca" => [77, "\x03e"], "\xcb" => [18, "\x03e"], "\xcc" => [77, "\x03i"], "\xcd" => [18, "\x03i"], "\xce" => [77, "\x03o"], "\xcf" => [18, "\x03o"], "\xd0" => [77, "\x03s"], "\xd1" => [18, "\x03s"], "\xd2" => [77, "\x03t"], "\xd3" => [18, "\x03t"], "\xd4" => [0, "\x03 "], "\xd5" => [0, "\x03%"], "\xd6" => [0, "\x03-"], "\xd7" => [0, "\x03."], "\xd8" => [0, "\x03/"], "\xd9" => [0, "\x033"], "\xda" => [0, "\x034"], "\xdb" => [0, "\x035"], "\xdc" => [0, "\x036"], "\xdd" => [0, "\x037"], "\xde" => [0, "\x038"], "\xdf" => [0, "\x039"], "\xe0" => [0, "\x03="], "\xe1" => [0, "\x03A"], "\xe2" => [0, "\x03_"], "\xe3" => [0, "\x03b"], "\xe4" => [0, "\x03d"], "\xe5" => [0, "\x03f"], "\xe6" => [0, "\x03g"], "\xe7" => [0, "\x03h"], "\xe8" => [0, "\x03l"], "\xe9" => [0, "\x03m"], "\xea" => [0, "\x03n"], "\xeb" => [0, "\x03p"], "\xec" => [0, "\x03r"], "\xed" => [0, "\x03u"], "\xee" => [100, "\x03"], "\xef" => [110, "\x03"], "\xf0" => [111, "\x03"], "\xf1" => [115, "\x03"], "\xf2" => [116, "\x03"], "\xf3" => [118, "\x03"], "\xf4" => [119, "\x03"], "\xf5" => [122, "\x03"], "\xf6" => [123, "\x03"], "\xf7" => [125, "\x03"], "\xf8" => [126, "\x03"], "\xf9" => [129, "\x03"], "\xfa" => [143, "\x03"], "\xfb" => [148, "\x03"], "\xfc" => [151, "\x03"], "\xfd" => [153, "\x03"], "\xfe" => [83, "\x03"], "\xff" => [10, "\x03"]], ["\x00" => [77, "\xfe0"], "\x01" => [18, "\xfe0"], "\x02" => [77, "\xfe1"], "\x03" => [18, "\xfe1"], "\x04" => [77, "\xfe2"], "\x05" => [18, "\xfe2"], "\x06" => [77, "\xfea"], "\x07" => [18, "\xfea"], "\x08" => [77, "\xfec"], "\t" => [18, "\xfec"], "\n" => [77, "\xfee"], "\v" => [18, "\xfee"], "\f" => [77, "\xfei"], "\r" => [18, "\xfei"], "\x0e" => [77, "\xfeo"], "\x0f" => [18, "\xfeo"], "\x10" => [77, "\xfes"], "\x11" => [18, "\xfes"], "\x12" => [77, "\xfet"], "\x13" => [18, "\xfet"], "\x14" => [0, "\xfe "], "\x15" => [0, "\xfe%"], "\x16" => [0, "\xfe-"], "\x17" => [0, "\xfe."], "\x18" => [0, "\xfe/"], "\x19" => [0, "\xfe3"], "\x1a" => [0, "\xfe4"], "\x1b" => [0, "\xfe5"], "\x1c" => [0, "\xfe6"], "\x1d" => [0, "\xfe7"], "\x1e" => [0, "\xfe8"], "\x1f" => [0, "\xfe9"], " " => [0, "\xfe="], "!" => [0, "\xfeA"], "\"" => [0, "\xfe_"], "#" => [0, "\xfeb"], "\$" => [0, "\xfed"], "%" => [0, "\xfef"], "&" => [0, "\xfeg"], "'" => [0, "\xfeh"], "(" => [0, "\xfel"], ")" => [0, "\xfem"], "*" => [0, "\xfen"], "+" => [0, "\xfep"], "," => [0, "\xfer"], "-" => [0, "\xfeu"], "." => [100, "\xfe"], "/" => [110, "\xfe"], [111, "\xfe"], [115, "\xfe"], [116, "\xfe"], [118, "\xfe"], [119, "\xfe"], [122, "\xfe"], [123, "\xfe"], [125, "\xfe"], [126, "\xfe"], [129, "\xfe"], ":" => [143, "\xfe"], ";" => [148, "\xfe"], "<" => [151, "\xfe"], "=" => [153, "\xfe"], ">" => [83, "\xfe"], "?" => [10, "\xfe"], "@" => [0, "\x020"], "A" => [0, "\x021"], "B" => [0, "\x022"], "C" => [0, "\x02a"], "D" => [0, "\x02c"], "E" => [0, "\x02e"], "F" => [0, "\x02i"], "G" => [0, "\x02o"], "H" => [0, "\x02s"], "I" => [0, "\x02t"], "J" => [73, "\x02"], "K" => [88, "\x02"], "L" => [89, "\x02"], "M" => [96, "\x02"], "N" => [97, "\x02"], "O" => [99, "\x02"], "P" => [106, "\x02"], "Q" => [136, "\x02"], "R" => [139, "\x02"], "S" => [141, "\x02"], "T" => [145, "\x02"], "U" => [147, "\x02"], "V" => [149, "\x02"], "W" => [101, "\x02"], "X" => [112, "\x02"], "Y" => [117, "\x02"], "Z" => [120, "\x02"], "[" => [124, "\x02"], "\\" => [127, "\x02"], "]" => [144, "\x02"], "^" => [152, "\x02"], "_" => [11, "\x02"], "`" => [0, "\x030"], "a" => [0, "\x031"], "b" => [0, "\x032"], "c" => [0, "\x03a"], "d" => [0, "\x03c"], "e" => [0, "\x03e"], "f" => [0, "\x03i"], "g" => [0, "\x03o"], "h" => [0, "\x03s"], "i" => [0, "\x03t"], "j" => [73, "\x03"], "k" => [88, "\x03"], "l" => [89, "\x03"], "m" => [96, "\x03"], "n" => [97, "\x03"], "o" => [99, "\x03"], "p" => [106, "\x03"], "q" => [136, "\x03"], "r" => [139, "\x03"], "s" => [141, "\x03"], "t" => [145, "\x03"], "u" => [147, "\x03"], "v" => [149, "\x03"], "w" => [101, "\x03"], "x" => [112, "\x03"], "y" => [117, "\x03"], "z" => [120, "\x03"], "{" => [124, "\x03"], "|" => [127, "\x03"], "}" => [144, "\x03"], "~" => [152, "\x03"], "" => [11, "\x03"], "\x80" => [0, "\x040"], "\x81" => [0, "\x041"], "\x82" => [0, "\x042"], "\x83" => [0, "\x04a"], "\x84" => [0, "\x04c"], "\x85" => [0, "\x04e"], "\x86" => [0, "\x04i"], "\x87" => [0, "\x04o"], "\x88" => [0, "\x04s"], "\x89" => [0, "\x04t"], "\x8a" => [73, "\x04"], "\x8b" => [88, "\x04"], "\x8c" => [89, "\x04"], "\x8d" => [96, "\x04"], "\x8e" => [97, "\x04"], "\x8f" => [99, "\x04"], "\x90" => [106, "\x04"], "\x91" => [136, "\x04"], "\x92" => [139, "\x04"], "\x93" => [141, "\x04"], "\x94" => [145, "\x04"], "\x95" => [147, "\x04"], "\x96" => [149, "\x04"], "\x97" => [101, "\x04"], "\x98" => [112, "\x04"], "\x99" => [117, "\x04"], "\x9a" => [120, "\x04"], "\x9b" => [124, "\x04"], "\x9c" => [127, "\x04"], "\x9d" => [144, "\x04"], "\x9e" => [152, "\x04"], "\x9f" => [11, "\x04"], "\xa0" => [0, "\x050"], "\xa1" => [0, "\x051"], "\xa2" => [0, "\x052"], "\xa3" => [0, "\x05a"], "\xa4" => [0, "\x05c"], "\xa5" => [0, "\x05e"], "\xa6" => [0, "\x05i"], "\xa7" => [0, "\x05o"], "\xa8" => [0, "\x05s"], "\xa9" => [0, "\x05t"], "\xaa" => [73, "\x05"], "\xab" => [88, "\x05"], "\xac" => [89, "\x05"], "\xad" => [96, "\x05"], "\xae" => [97, "\x05"], "\xaf" => [99, "\x05"], "\xb0" => [106, "\x05"], "\xb1" => [136, "\x05"], "\xb2" => [139, "\x05"], "\xb3" => [141, "\x05"], "\xb4" => [145, "\x05"], "\xb5" => [147, "\x05"], "\xb6" => [149, "\x05"], "\xb7" => [101, "\x05"], "\xb8" => [112, "\x05"], "\xb9" => [117, "\x05"], "\xba" => [120, "\x05"], "\xbb" => [124, "\x05"], "\xbc" => [127, "\x05"], "\xbd" => [144, "\x05"], "\xbe" => [152, "\x05"], "\xbf" => [11, "\x05"], "\xc0" => [0, "\x060"], "\xc1" => [0, "\x061"], "\xc2" => [0, "\x062"], "\xc3" => [0, "\x06a"], "\xc4" => [0, "\x06c"], "\xc5" => [0, "\x06e"], "\xc6" => [0, "\x06i"], "\xc7" => [0, "\x06o"], "\xc8" => [0, "\x06s"], "\xc9" => [0, "\x06t"], "\xca" => [73, "\x06"], "\xcb" => [88, "\x06"], "\xcc" => [89, "\x06"], "\xcd" => [96, "\x06"], "\xce" => [97, "\x06"], "\xcf" => [99, "\x06"], "\xd0" => [106, "\x06"], "\xd1" => [136, "\x06"], "\xd2" => [139, "\x06"], "\xd3" => [141, "\x06"], "\xd4" => [145, "\x06"], "\xd5" => [147, "\x06"], "\xd6" => [149, "\x06"], "\xd7" => [101, "\x06"], "\xd8" => [112, "\x06"], "\xd9" => [117, "\x06"], "\xda" => [120, "\x06"], "\xdb" => [124, "\x06"], "\xdc" => [127, "\x06"], "\xdd" => [144, "\x06"], "\xde" => [152, "\x06"], "\xdf" => [11, "\x06"], "\xe0" => [0, "\x070"], "\xe1" => [0, "\x071"], "\xe2" => [0, "\x072"], "\xe3" => [0, "\x07a"], "\xe4" => [0, "\x07c"], "\xe5" => [0, "\x07e"], "\xe6" => [0, "\x07i"], "\xe7" => [0, "\x07o"], "\xe8" => [0, "\x07s"], "\xe9" => [0, "\x07t"], "\xea" => [73, "\x07"], "\xeb" => [88, "\x07"], "\xec" => [89, "\x07"], "\xed" => [96, "\x07"], "\xee" => [97, "\x07"], "\xef" => [99, "\x07"], "\xf0" => [106, "\x07"], "\xf1" => [136, "\x07"], "\xf2" => [139, "\x07"], "\xf3" => [141, "\x07"], "\xf4" => [145, "\x07"], "\xf5" => [147, "\x07"], "\xf6" => [149, "\x07"], "\xf7" => [101, "\x07"], "\xf8" => [112, "\x07"], "\xf9" => [117, "\x07"], "\xfa" => [120, "\x07"], "\xfb" => [124, "\x07"], "\xfc" => [127, "\x07"], "\xfd" => [144, "\x07"], "\xfe" => [152, "\x07"], "\xff" => [11, "\x07"]], ["\x00" => [94, "\x040"], "\x01" => [76, "\x040"], "\x02" => [104, "\x040"], "\x03" => [16, "\x040"], "\x04" => [94, "\x041"], "\x05" => [76, "\x041"], "\x06" => [104, "\x041"], "\x07" => [16, "\x041"], "\x08" => [94, "\x042"], "\t" => [76, "\x042"], "\n" => [104, "\x042"], "\v" => [16, "\x042"], "\f" => [94, "\x04a"], "\r" => [76, "\x04a"], "\x0e" => [104, "\x04a"], "\x0f" => [16, "\x04a"], "\x10" => [94, "\x04c"], "\x11" => [76, "\x04c"], "\x12" => [104, "\x04c"], "\x13" => [16, "\x04c"], "\x14" => [94, "\x04e"], "\x15" => [76, "\x04e"], "\x16" => [104, "\x04e"], "\x17" => [16, "\x04e"], "\x18" => [94, "\x04i"], "\x19" => [76, "\x04i"], "\x1a" => [104, "\x04i"], "\x1b" => [16, "\x04i"], "\x1c" => [94, "\x04o"], "\x1d" => [76, "\x04o"], "\x1e" => [104, "\x04o"], "\x1f" => [16, "\x04o"], " " => [94, "\x04s"], "!" => [76, "\x04s"], "\"" => [104, "\x04s"], "#" => [16, "\x04s"], "\$" => [94, "\x04t"], "%" => [76, "\x04t"], "&" => [104, "\x04t"], "'" => [16, "\x04t"], "(" => [77, "\x04 "], ")" => [18, "\x04 "], "*" => [77, "\x04%"], "+" => [18, "\x04%"], "," => [77, "\x04-"], "-" => [18, "\x04-"], "." => [77, "\x04."], "/" => [18, "\x04."], [77, "\x04/"], [18, "\x04/"], [77, "\x043"], [18, "\x043"], [77, "\x044"], [18, "\x044"], [77, "\x045"], [18, "\x045"], [77, "\x046"], [18, "\x046"], ":" => [77, "\x047"], ";" => [18, "\x047"], "<" => [77, "\x048"], "=" => [18, "\x048"], ">" => [77, "\x049"], "?" => [18, "\x049"], "@" => [77, "\x04="], "A" => [18, "\x04="], "B" => [77, "\x04A"], "C" => [18, "\x04A"], "D" => [77, "\x04_"], "E" => [18, "\x04_"], "F" => [77, "\x04b"], "G" => [18, "\x04b"], "H" => [77, "\x04d"], "I" => [18, "\x04d"], "J" => [77, "\x04f"], "K" => [18, "\x04f"], "L" => [77, "\x04g"], "M" => [18, "\x04g"], "N" => [77, "\x04h"], "O" => [18, "\x04h"], "P" => [77, "\x04l"], "Q" => [18, "\x04l"], "R" => [77, "\x04m"], "S" => [18, "\x04m"], "T" => [77, "\x04n"], "U" => [18, "\x04n"], "V" => [77, "\x04p"], "W" => [18, "\x04p"], "X" => [77, "\x04r"], "Y" => [18, "\x04r"], "Z" => [77, "\x04u"], "[" => [18, "\x04u"], "\\" => [0, "\x04:"], "]" => [0, "\x04B"], "^" => [0, "\x04C"], "_" => [0, "\x04D"], "`" => [0, "\x04E"], "a" => [0, "\x04F"], "b" => [0, "\x04G"], "c" => [0, "\x04H"], "d" => [0, "\x04I"], "e" => [0, "\x04J"], "f" => [0, "\x04K"], "g" => [0, "\x04L"], "h" => [0, "\x04M"], "i" => [0, "\x04N"], "j" => [0, "\x04O"], "k" => [0, "\x04P"], "l" => [0, "\x04Q"], "m" => [0, "\x04R"], "n" => [0, "\x04S"], "o" => [0, "\x04T"], "p" => [0, "\x04U"], "q" => [0, "\x04V"], "r" => [0, "\x04W"], "s" => [0, "\x04Y"], "t" => [0, "\x04j"], "u" => [0, "\x04k"], "v" => [0, "\x04q"], "w" => [0, "\x04v"], "x" => [0, "\x04w"], "y" => [0, "\x04x"], "z" => [0, "\x04y"], "{" => [0, "\x04z"], "|" => [82, "\x04"], "}" => [87, "\x04"], "~" => [130, "\x04"], "" => [9, "\x04"], "\x80" => [94, "\x050"], "\x81" => [76, "\x050"], "\x82" => [104, "\x050"], "\x83" => [16, "\x050"], "\x84" => [94, "\x051"], "\x85" => [76, "\x051"], "\x86" => [104, "\x051"], "\x87" => [16, "\x051"], "\x88" => [94, "\x052"], "\x89" => [76, "\x052"], "\x8a" => [104, "\x052"], "\x8b" => [16, "\x052"], "\x8c" => [94, "\x05a"], "\x8d" => [76, "\x05a"], "\x8e" => [104, "\x05a"], "\x8f" => [16, "\x05a"], "\x90" => [94, "\x05c"], "\x91" => [76, "\x05c"], "\x92" => [104, "\x05c"], "\x93" => [16, "\x05c"], "\x94" => [94, "\x05e"], "\x95" => [76, "\x05e"], "\x96" => [104, "\x05e"], "\x97" => [16, "\x05e"], "\x98" => [94, "\x05i"], "\x99" => [76, "\x05i"], "\x9a" => [104, "\x05i"], "\x9b" => [16, "\x05i"], "\x9c" => [94, "\x05o"], "\x9d" => [76, "\x05o"], "\x9e" => [104, "\x05o"], "\x9f" => [16, "\x05o"], "\xa0" => [94, "\x05s"], "\xa1" => [76, "\x05s"], "\xa2" => [104, "\x05s"], "\xa3" => [16, "\x05s"], "\xa4" => [94, "\x05t"], "\xa5" => [76, "\x05t"], "\xa6" => [104, "\x05t"], "\xa7" => [16, "\x05t"], "\xa8" => [77, "\x05 "], "\xa9" => [18, "\x05 "], "\xaa" => [77, "\x05%"], "\xab" => [18, "\x05%"], "\xac" => [77, "\x05-"], "\xad" => [18, "\x05-"], "\xae" => [77, "\x05."], "\xaf" => [18, "\x05."], "\xb0" => [77, "\x05/"], "\xb1" => [18, "\x05/"], "\xb2" => [77, "\x053"], "\xb3" => [18, "\x053"], "\xb4" => [77, "\x054"], "\xb5" => [18, "\x054"], "\xb6" => [77, "\x055"], "\xb7" => [18, "\x055"], "\xb8" => [77, "\x056"], "\xb9" => [18, "\x056"], "\xba" => [77, "\x057"], "\xbb" => [18, "\x057"], "\xbc" => [77, "\x058"], "\xbd" => [18, "\x058"], "\xbe" => [77, "\x059"], "\xbf" => [18, "\x059"], "\xc0" => [77, "\x05="], "\xc1" => [18, "\x05="], "\xc2" => [77, "\x05A"], "\xc3" => [18, "\x05A"], "\xc4" => [77, "\x05_"], "\xc5" => [18, "\x05_"], "\xc6" => [77, "\x05b"], "\xc7" => [18, "\x05b"], "\xc8" => [77, "\x05d"], "\xc9" => [18, "\x05d"], "\xca" => [77, "\x05f"], "\xcb" => [18, "\x05f"], "\xcc" => [77, "\x05g"], "\xcd" => [18, "\x05g"], "\xce" => [77, "\x05h"], "\xcf" => [18, "\x05h"], "\xd0" => [77, "\x05l"], "\xd1" => [18, "\x05l"], "\xd2" => [77, "\x05m"], "\xd3" => [18, "\x05m"], "\xd4" => [77, "\x05n"], "\xd5" => [18, "\x05n"], "\xd6" => [77, "\x05p"], "\xd7" => [18, "\x05p"], "\xd8" => [77, "\x05r"], "\xd9" => [18, "\x05r"], "\xda" => [77, "\x05u"], "\xdb" => [18, "\x05u"], "\xdc" => [0, "\x05:"], "\xdd" => [0, "\x05B"], "\xde" => [0, "\x05C"], "\xdf" => [0, "\x05D"], "\xe0" => [0, "\x05E"], "\xe1" => [0, "\x05F"], "\xe2" => [0, "\x05G"], "\xe3" => [0, "\x05H"], "\xe4" => [0, "\x05I"], "\xe5" => [0, "\x05J"], "\xe6" => [0, "\x05K"], "\xe7" => [0, "\x05L"], "\xe8" => [0, "\x05M"], "\xe9" => [0, "\x05N"], "\xea" => [0, "\x05O"], "\xeb" => [0, "\x05P"], "\xec" => [0, "\x05Q"], "\xed" => [0, "\x05R"], "\xee" => [0, "\x05S"], "\xef" => [0, "\x05T"], "\xf0" => [0, "\x05U"], "\xf1" => [0, "\x05V"], "\xf2" => [0, "\x05W"], "\xf3" => [0, "\x05Y"], "\xf4" => [0, "\x05j"], "\xf5" => [0, "\x05k"], "\xf6" => [0, "\x05q"], "\xf7" => [0, "\x05v"], "\xf8" => [0, "\x05w"], "\xf9" => [0, "\x05x"], "\xfa" => [0, "\x05y"], "\xfb" => [0, "\x05z"], "\xfc" => [82, "\x05"], "\xfd" => [87, "\x05"], "\xfe" => [130, "\x05"], "\xff" => [9, "\x05"]], ["\x00" => [77, "\x040"], "\x01" => [18, "\x040"], "\x02" => [77, "\x041"], "\x03" => [18, "\x041"], "\x04" => [77, "\x042"], "\x05" => [18, "\x042"], "\x06" => [77, "\x04a"], "\x07" => [18, "\x04a"], "\x08" => [77, "\x04c"], "\t" => [18, "\x04c"], "\n" => [77, "\x04e"], "\v" => [18, "\x04e"], "\f" => [77, "\x04i"], "\r" => [18, "\x04i"], "\x0e" => [77, "\x04o"], "\x0f" => [18, "\x04o"], "\x10" => [77, "\x04s"], "\x11" => [18, "\x04s"], "\x12" => [77, "\x04t"], "\x13" => [18, "\x04t"], "\x14" => [0, "\x04 "], "\x15" => [0, "\x04%"], "\x16" => [0, "\x04-"], "\x17" => [0, "\x04."], "\x18" => [0, "\x04/"], "\x19" => [0, "\x043"], "\x1a" => [0, "\x044"], "\x1b" => [0, "\x045"], "\x1c" => [0, "\x046"], "\x1d" => [0, "\x047"], "\x1e" => [0, "\x048"], "\x1f" => [0, "\x049"], " " => [0, "\x04="], "!" => [0, "\x04A"], "\"" => [0, "\x04_"], "#" => [0, "\x04b"], "\$" => [0, "\x04d"], "%" => [0, "\x04f"], "&" => [0, "\x04g"], "'" => [0, "\x04h"], "(" => [0, "\x04l"], ")" => [0, "\x04m"], "*" => [0, "\x04n"], "+" => [0, "\x04p"], "," => [0, "\x04r"], "-" => [0, "\x04u"], "." => [100, "\x04"], "/" => [110, "\x04"], [111, "\x04"], [115, "\x04"], [116, "\x04"], [118, "\x04"], [119, "\x04"], [122, "\x04"], [123, "\x04"], [125, "\x04"], [126, "\x04"], [129, "\x04"], ":" => [143, "\x04"], ";" => [148, "\x04"], "<" => [151, "\x04"], "=" => [153, "\x04"], ">" => [83, "\x04"], "?" => [10, "\x04"], "@" => [77, "\x050"], "A" => [18, "\x050"], "B" => [77, "\x051"], "C" => [18, "\x051"], "D" => [77, "\x052"], "E" => [18, "\x052"], "F" => [77, "\x05a"], "G" => [18, "\x05a"], "H" => [77, "\x05c"], "I" => [18, "\x05c"], "J" => [77, "\x05e"], "K" => [18, "\x05e"], "L" => [77, "\x05i"], "M" => [18, "\x05i"], "N" => [77, "\x05o"], "O" => [18, "\x05o"], "P" => [77, "\x05s"], "Q" => [18, "\x05s"], "R" => [77, "\x05t"], "S" => [18, "\x05t"], "T" => [0, "\x05 "], "U" => [0, "\x05%"], "V" => [0, "\x05-"], "W" => [0, "\x05."], "X" => [0, "\x05/"], "Y" => [0, "\x053"], "Z" => [0, "\x054"], "[" => [0, "\x055"], "\\" => [0, "\x056"], "]" => [0, "\x057"], "^" => [0, "\x058"], "_" => [0, "\x059"], "`" => [0, "\x05="], "a" => [0, "\x05A"], "b" => [0, "\x05_"], "c" => [0, "\x05b"], "d" => [0, "\x05d"], "e" => [0, "\x05f"], "f" => [0, "\x05g"], "g" => [0, "\x05h"], "h" => [0, "\x05l"], "i" => [0, "\x05m"], "j" => [0, "\x05n"], "k" => [0, "\x05p"], "l" => [0, "\x05r"], "m" => [0, "\x05u"], "n" => [100, "\x05"], "o" => [110, "\x05"], "p" => [111, "\x05"], "q" => [115, "\x05"], "r" => [116, "\x05"], "s" => [118, "\x05"], "t" => [119, "\x05"], "u" => [122, "\x05"], "v" => [123, "\x05"], "w" => [125, "\x05"], "x" => [126, "\x05"], "y" => [129, "\x05"], "z" => [143, "\x05"], "{" => [148, "\x05"], "|" => [151, "\x05"], "}" => [153, "\x05"], "~" => [83, "\x05"], "" => [10, "\x05"], "\x80" => [77, "\x060"], "\x81" => [18, "\x060"], "\x82" => [77, "\x061"], "\x83" => [18, "\x061"], "\x84" => [77, "\x062"], "\x85" => [18, "\x062"], "\x86" => [77, "\x06a"], "\x87" => [18, "\x06a"], "\x88" => [77, "\x06c"], "\x89" => [18, "\x06c"], "\x8a" => [77, "\x06e"], "\x8b" => [18, "\x06e"], "\x8c" => [77, "\x06i"], "\x8d" => [18, "\x06i"], "\x8e" => [77, "\x06o"], "\x8f" => [18, "\x06o"], "\x90" => [77, "\x06s"], "\x91" => [18, "\x06s"], "\x92" => [77, "\x06t"], "\x93" => [18, "\x06t"], "\x94" => [0, "\x06 "], "\x95" => [0, "\x06%"], "\x96" => [0, "\x06-"], "\x97" => [0, "\x06."], "\x98" => [0, "\x06/"], "\x99" => [0, "\x063"], "\x9a" => [0, "\x064"], "\x9b" => [0, "\x065"], "\x9c" => [0, "\x066"], "\x9d" => [0, "\x067"], "\x9e" => [0, "\x068"], "\x9f" => [0, "\x069"], "\xa0" => [0, "\x06="], "\xa1" => [0, "\x06A"], "\xa2" => [0, "\x06_"], "\xa3" => [0, "\x06b"], "\xa4" => [0, "\x06d"], "\xa5" => [0, "\x06f"], "\xa6" => [0, "\x06g"], "\xa7" => [0, "\x06h"], "\xa8" => [0, "\x06l"], "\xa9" => [0, "\x06m"], "\xaa" => [0, "\x06n"], "\xab" => [0, "\x06p"], "\xac" => [0, "\x06r"], "\xad" => [0, "\x06u"], "\xae" => [100, "\x06"], "\xaf" => [110, "\x06"], "\xb0" => [111, "\x06"], "\xb1" => [115, "\x06"], "\xb2" => [116, "\x06"], "\xb3" => [118, "\x06"], "\xb4" => [119, "\x06"], "\xb5" => [122, "\x06"], "\xb6" => [123, "\x06"], "\xb7" => [125, "\x06"], "\xb8" => [126, "\x06"], "\xb9" => [129, "\x06"], "\xba" => [143, "\x06"], "\xbb" => [148, "\x06"], "\xbc" => [151, "\x06"], "\xbd" => [153, "\x06"], "\xbe" => [83, "\x06"], "\xbf" => [10, "\x06"], "\xc0" => [77, "\x070"], "\xc1" => [18, "\x070"], "\xc2" => [77, "\x071"], "\xc3" => [18, "\x071"], "\xc4" => [77, "\x072"], "\xc5" => [18, "\x072"], "\xc6" => [77, "\x07a"], "\xc7" => [18, "\x07a"], "\xc8" => [77, "\x07c"], "\xc9" => [18, "\x07c"], "\xca" => [77, "\x07e"], "\xcb" => [18, "\x07e"], "\xcc" => [77, "\x07i"], "\xcd" => [18, "\x07i"], "\xce" => [77, "\x07o"], "\xcf" => [18, "\x07o"], "\xd0" => [77, "\x07s"], "\xd1" => [18, "\x07s"], "\xd2" => [77, "\x07t"], "\xd3" => [18, "\x07t"], "\xd4" => [0, "\x07 "], "\xd5" => [0, "\x07%"], "\xd6" => [0, "\x07-"], "\xd7" => [0, "\x07."], "\xd8" => [0, "\x07/"], "\xd9" => [0, "\x073"], "\xda" => [0, "\x074"], "\xdb" => [0, "\x075"], "\xdc" => [0, "\x076"], "\xdd" => [0, "\x077"], "\xde" => [0, "\x078"], "\xdf" => [0, "\x079"], "\xe0" => [0, "\x07="], "\xe1" => [0, "\x07A"], "\xe2" => [0, "\x07_"], "\xe3" => [0, "\x07b"], "\xe4" => [0, "\x07d"], "\xe5" => [0, "\x07f"], "\xe6" => [0, "\x07g"], "\xe7" => [0, "\x07h"], "\xe8" => [0, "\x07l"], "\xe9" => [0, "\x07m"], "\xea" => [0, "\x07n"], "\xeb" => [0, "\x07p"], "\xec" => [0, "\x07r"], "\xed" => [0, "\x07u"], "\xee" => [100, "\x07"], "\xef" => [110, "\x07"], "\xf0" => [111, "\x07"], "\xf1" => [115, "\x07"], "\xf2" => [116, "\x07"], "\xf3" => [118, "\x07"], "\xf4" => [119, "\x07"], "\xf5" => [122, "\x07"], "\xf6" => [123, "\x07"], "\xf7" => [125, "\x07"], "\xf8" => [126, "\x07"], "\xf9" => [129, "\x07"], "\xfa" => [143, "\x07"], "\xfb" => [148, "\x07"], "\xfc" => [151, "\x07"], "\xfd" => [153, "\x07"], "\xfe" => [83, "\x07"], "\xff" => [10, "\x07"]], ["\x00" => [94, "\x060"], "\x01" => [76, "\x060"], "\x02" => [104, "\x060"], "\x03" => [16, "\x060"], "\x04" => [94, "\x061"], "\x05" => [76, "\x061"], "\x06" => [104, "\x061"], "\x07" => [16, "\x061"], "\x08" => [94, "\x062"], "\t" => [76, "\x062"], "\n" => [104, "\x062"], "\v" => [16, "\x062"], "\f" => [94, "\x06a"], "\r" => [76, "\x06a"], "\x0e" => [104, "\x06a"], "\x0f" => [16, "\x06a"], "\x10" => [94, "\x06c"], "\x11" => [76, "\x06c"], "\x12" => [104, "\x06c"], "\x13" => [16, "\x06c"], "\x14" => [94, "\x06e"], "\x15" => [76, "\x06e"], "\x16" => [104, "\x06e"], "\x17" => [16, "\x06e"], "\x18" => [94, "\x06i"], "\x19" => [76, "\x06i"], "\x1a" => [104, "\x06i"], "\x1b" => [16, "\x06i"], "\x1c" => [94, "\x06o"], "\x1d" => [76, "\x06o"], "\x1e" => [104, "\x06o"], "\x1f" => [16, "\x06o"], " " => [94, "\x06s"], "!" => [76, "\x06s"], "\"" => [104, "\x06s"], "#" => [16, "\x06s"], "\$" => [94, "\x06t"], "%" => [76, "\x06t"], "&" => [104, "\x06t"], "'" => [16, "\x06t"], "(" => [77, "\x06 "], ")" => [18, "\x06 "], "*" => [77, "\x06%"], "+" => [18, "\x06%"], "," => [77, "\x06-"], "-" => [18, "\x06-"], "." => [77, "\x06."], "/" => [18, "\x06."], [77, "\x06/"], [18, "\x06/"], [77, "\x063"], [18, "\x063"], [77, "\x064"], [18, "\x064"], [77, "\x065"], [18, "\x065"], [77, "\x066"], [18, "\x066"], ":" => [77, "\x067"], ";" => [18, "\x067"], "<" => [77, "\x068"], "=" => [18, "\x068"], ">" => [77, "\x069"], "?" => [18, "\x069"], "@" => [77, "\x06="], "A" => [18, "\x06="], "B" => [77, "\x06A"], "C" => [18, "\x06A"], "D" => [77, "\x06_"], "E" => [18, "\x06_"], "F" => [77, "\x06b"], "G" => [18, "\x06b"], "H" => [77, "\x06d"], "I" => [18, "\x06d"], "J" => [77, "\x06f"], "K" => [18, "\x06f"], "L" => [77, "\x06g"], "M" => [18, "\x06g"], "N" => [77, "\x06h"], "O" => [18, "\x06h"], "P" => [77, "\x06l"], "Q" => [18, "\x06l"], "R" => [77, "\x06m"], "S" => [18, "\x06m"], "T" => [77, "\x06n"], "U" => [18, "\x06n"], "V" => [77, "\x06p"], "W" => [18, "\x06p"], "X" => [77, "\x06r"], "Y" => [18, "\x06r"], "Z" => [77, "\x06u"], "[" => [18, "\x06u"], "\\" => [0, "\x06:"], "]" => [0, "\x06B"], "^" => [0, "\x06C"], "_" => [0, "\x06D"], "`" => [0, "\x06E"], "a" => [0, "\x06F"], "b" => [0, "\x06G"], "c" => [0, "\x06H"], "d" => [0, "\x06I"], "e" => [0, "\x06J"], "f" => [0, "\x06K"], "g" => [0, "\x06L"], "h" => [0, "\x06M"], "i" => [0, "\x06N"], "j" => [0, "\x06O"], "k" => [0, "\x06P"], "l" => [0, "\x06Q"], "m" => [0, "\x06R"], "n" => [0, "\x06S"], "o" => [0, "\x06T"], "p" => [0, "\x06U"], "q" => [0, "\x06V"], "r" => [0, "\x06W"], "s" => [0, "\x06Y"], "t" => [0, "\x06j"], "u" => [0, "\x06k"], "v" => [0, "\x06q"], "w" => [0, "\x06v"], "x" => [0, "\x06w"], "y" => [0, "\x06x"], "z" => [0, "\x06y"], "{" => [0, "\x06z"], "|" => [82, "\x06"], "}" => [87, "\x06"], "~" => [130, "\x06"], "" => [9, "\x06"], "\x80" => [94, "\x070"], "\x81" => [76, "\x070"], "\x82" => [104, "\x070"], "\x83" => [16, "\x070"], "\x84" => [94, "\x071"], "\x85" => [76, "\x071"], "\x86" => [104, "\x071"], "\x87" => [16, "\x071"], "\x88" => [94, "\x072"], "\x89" => [76, "\x072"], "\x8a" => [104, "\x072"], "\x8b" => [16, "\x072"], "\x8c" => [94, "\x07a"], "\x8d" => [76, "\x07a"], "\x8e" => [104, "\x07a"], "\x8f" => [16, "\x07a"], "\x90" => [94, "\x07c"], "\x91" => [76, "\x07c"], "\x92" => [104, "\x07c"], "\x93" => [16, "\x07c"], "\x94" => [94, "\x07e"], "\x95" => [76, "\x07e"], "\x96" => [104, "\x07e"], "\x97" => [16, "\x07e"], "\x98" => [94, "\x07i"], "\x99" => [76, "\x07i"], "\x9a" => [104, "\x07i"], "\x9b" => [16, "\x07i"], "\x9c" => [94, "\x07o"], "\x9d" => [76, "\x07o"], "\x9e" => [104, "\x07o"], "\x9f" => [16, "\x07o"], "\xa0" => [94, "\x07s"], "\xa1" => [76, "\x07s"], "\xa2" => [104, "\x07s"], "\xa3" => [16, "\x07s"], "\xa4" => [94, "\x07t"], "\xa5" => [76, "\x07t"], "\xa6" => [104, "\x07t"], "\xa7" => [16, "\x07t"], "\xa8" => [77, "\x07 "], "\xa9" => [18, "\x07 "], "\xaa" => [77, "\x07%"], "\xab" => [18, "\x07%"], "\xac" => [77, "\x07-"], "\xad" => [18, "\x07-"], "\xae" => [77, "\x07."], "\xaf" => [18, "\x07."], "\xb0" => [77, "\x07/"], "\xb1" => [18, "\x07/"], "\xb2" => [77, "\x073"], "\xb3" => [18, "\x073"], "\xb4" => [77, "\x074"], "\xb5" => [18, "\x074"], "\xb6" => [77, "\x075"], "\xb7" => [18, "\x075"], "\xb8" => [77, "\x076"], "\xb9" => [18, "\x076"], "\xba" => [77, "\x077"], "\xbb" => [18, "\x077"], "\xbc" => [77, "\x078"], "\xbd" => [18, "\x078"], "\xbe" => [77, "\x079"], "\xbf" => [18, "\x079"], "\xc0" => [77, "\x07="], "\xc1" => [18, "\x07="], "\xc2" => [77, "\x07A"], "\xc3" => [18, "\x07A"], "\xc4" => [77, "\x07_"], "\xc5" => [18, "\x07_"], "\xc6" => [77, "\x07b"], "\xc7" => [18, "\x07b"], "\xc8" => [77, "\x07d"], "\xc9" => [18, "\x07d"], "\xca" => [77, "\x07f"], "\xcb" => [18, "\x07f"], "\xcc" => [77, "\x07g"], "\xcd" => [18, "\x07g"], "\xce" => [77, "\x07h"], "\xcf" => [18, "\x07h"], "\xd0" => [77, "\x07l"], "\xd1" => [18, "\x07l"], "\xd2" => [77, "\x07m"], "\xd3" => [18, "\x07m"], "\xd4" => [77, "\x07n"], "\xd5" => [18, "\x07n"], "\xd6" => [77, "\x07p"], "\xd7" => [18, "\x07p"], "\xd8" => [77, "\x07r"], "\xd9" => [18, "\x07r"], "\xda" => [77, "\x07u"], "\xdb" => [18, "\x07u"], "\xdc" => [0, "\x07:"], "\xdd" => [0, "\x07B"], "\xde" => [0, "\x07C"], "\xdf" => [0, "\x07D"], "\xe0" => [0, "\x07E"], "\xe1" => [0, "\x07F"], "\xe2" => [0, "\x07G"], "\xe3" => [0, "\x07H"], "\xe4" => [0, "\x07I"], "\xe5" => [0, "\x07J"], "\xe6" => [0, "\x07K"], "\xe7" => [0, "\x07L"], "\xe8" => [0, "\x07M"], "\xe9" => [0, "\x07N"], "\xea" => [0, "\x07O"], "\xeb" => [0, "\x07P"], "\xec" => [0, "\x07Q"], "\xed" => [0, "\x07R"], "\xee" => [0, "\x07S"], "\xef" => [0, "\x07T"], "\xf0" => [0, "\x07U"], "\xf1" => [0, "\x07V"], "\xf2" => [0, "\x07W"], "\xf3" => [0, "\x07Y"], "\xf4" => [0, "\x07j"], "\xf5" => [0, "\x07k"], "\xf6" => [0, "\x07q"], "\xf7" => [0, "\x07v"], "\xf8" => [0, "\x07w"], "\xf9" => [0, "\x07x"], "\xfa" => [0, "\x07y"], "\xfb" => [0, "\x07z"], "\xfc" => [82, "\x07"], "\xfd" => [87, "\x07"], "\xfe" => [130, "\x07"], "\xff" => [9, "\x07"]], ["\x00" => [94, "\x080"], "\x01" => [76, "\x080"], "\x02" => [104, "\x080"], "\x03" => [16, "\x080"], "\x04" => [94, "\x081"], "\x05" => [76, "\x081"], "\x06" => [104, "\x081"], "\x07" => [16, "\x081"], "\x08" => [94, "\x082"], "\t" => [76, "\x082"], "\n" => [104, "\x082"], "\v" => [16, "\x082"], "\f" => [94, "\x08a"], "\r" => [76, "\x08a"], "\x0e" => [104, "\x08a"], "\x0f" => [16, "\x08a"], "\x10" => [94, "\x08c"], "\x11" => [76, "\x08c"], "\x12" => [104, "\x08c"], "\x13" => [16, "\x08c"], "\x14" => [94, "\x08e"], "\x15" => [76, "\x08e"], "\x16" => [104, "\x08e"], "\x17" => [16, "\x08e"], "\x18" => [94, "\x08i"], "\x19" => [76, "\x08i"], "\x1a" => [104, "\x08i"], "\x1b" => [16, "\x08i"], "\x1c" => [94, "\x08o"], "\x1d" => [76, "\x08o"], "\x1e" => [104, "\x08o"], "\x1f" => [16, "\x08o"], " " => [94, "\x08s"], "!" => [76, "\x08s"], "\"" => [104, "\x08s"], "#" => [16, "\x08s"], "\$" => [94, "\x08t"], "%" => [76, "\x08t"], "&" => [104, "\x08t"], "'" => [16, "\x08t"], "(" => [77, "\x08 "], ")" => [18, "\x08 "], "*" => [77, "\x08%"], "+" => [18, "\x08%"], "," => [77, "\x08-"], "-" => [18, "\x08-"], "." => [77, "\x08."], "/" => [18, "\x08."], [77, "\x08/"], [18, "\x08/"], [77, "\x083"], [18, "\x083"], [77, "\x084"], [18, "\x084"], [77, "\x085"], [18, "\x085"], [77, "\x086"], [18, "\x086"], ":" => [77, "\x087"], ";" => [18, "\x087"], "<" => [77, "\x088"], "=" => [18, "\x088"], ">" => [77, "\x089"], "?" => [18, "\x089"], "@" => [77, "\x08="], "A" => [18, "\x08="], "B" => [77, "\x08A"], "C" => [18, "\x08A"], "D" => [77, "\x08_"], "E" => [18, "\x08_"], "F" => [77, "\x08b"], "G" => [18, "\x08b"], "H" => [77, "\x08d"], "I" => [18, "\x08d"], "J" => [77, "\x08f"], "K" => [18, "\x08f"], "L" => [77, "\x08g"], "M" => [18, "\x08g"], "N" => [77, "\x08h"], "O" => [18, "\x08h"], "P" => [77, "\x08l"], "Q" => [18, "\x08l"], "R" => [77, "\x08m"], "S" => [18, "\x08m"], "T" => [77, "\x08n"], "U" => [18, "\x08n"], "V" => [77, "\x08p"], "W" => [18, "\x08p"], "X" => [77, "\x08r"], "Y" => [18, "\x08r"], "Z" => [77, "\x08u"], "[" => [18, "\x08u"], "\\" => [0, "\x08:"], "]" => [0, "\x08B"], "^" => [0, "\x08C"], "_" => [0, "\x08D"], "`" => [0, "\x08E"], "a" => [0, "\x08F"], "b" => [0, "\x08G"], "c" => [0, "\x08H"], "d" => [0, "\x08I"], "e" => [0, "\x08J"], "f" => [0, "\x08K"], "g" => [0, "\x08L"], "h" => [0, "\x08M"], "i" => [0, "\x08N"], "j" => [0, "\x08O"], "k" => [0, "\x08P"], "l" => [0, "\x08Q"], "m" => [0, "\x08R"], "n" => [0, "\x08S"], "o" => [0, "\x08T"], "p" => [0, "\x08U"], "q" => [0, "\x08V"], "r" => [0, "\x08W"], "s" => [0, "\x08Y"], "t" => [0, "\x08j"], "u" => [0, "\x08k"], "v" => [0, "\x08q"], "w" => [0, "\x08v"], "x" => [0, "\x08w"], "y" => [0, "\x08x"], "z" => [0, "\x08y"], "{" => [0, "\x08z"], "|" => [82, "\x08"], "}" => [87, "\x08"], "~" => [130, "\x08"], "" => [9, "\x08"], "\x80" => [94, "\v0"], "\x81" => [76, "\v0"], "\x82" => [104, "\v0"], "\x83" => [16, "\v0"], "\x84" => [94, "\v1"], "\x85" => [76, "\v1"], "\x86" => [104, "\v1"], "\x87" => [16, "\v1"], "\x88" => [94, "\v2"], "\x89" => [76, "\v2"], "\x8a" => [104, "\v2"], "\x8b" => [16, "\v2"], "\x8c" => [94, "\va"], "\x8d" => [76, "\va"], "\x8e" => [104, "\va"], "\x8f" => [16, "\va"], "\x90" => [94, "\vc"], "\x91" => [76, "\vc"], "\x92" => [104, "\vc"], "\x93" => [16, "\vc"], "\x94" => [94, "\ve"], "\x95" => [76, "\ve"], "\x96" => [104, "\ve"], "\x97" => [16, "\ve"], "\x98" => [94, "\vi"], "\x99" => [76, "\vi"], "\x9a" => [104, "\vi"], "\x9b" => [16, "\vi"], "\x9c" => [94, "\vo"], "\x9d" => [76, "\vo"], "\x9e" => [104, "\vo"], "\x9f" => [16, "\vo"], "\xa0" => [94, "\vs"], "\xa1" => [76, "\vs"], "\xa2" => [104, "\vs"], "\xa3" => [16, "\vs"], "\xa4" => [94, "\vt"], "\xa5" => [76, "\vt"], "\xa6" => [104, "\vt"], "\xa7" => [16, "\vt"], "\xa8" => [77, "\v "], "\xa9" => [18, "\v "], "\xaa" => [77, "\v%"], "\xab" => [18, "\v%"], "\xac" => [77, "\v-"], "\xad" => [18, "\v-"], "\xae" => [77, "\v."], "\xaf" => [18, "\v."], "\xb0" => [77, "\v/"], "\xb1" => [18, "\v/"], "\xb2" => [77, "\v3"], "\xb3" => [18, "\v3"], "\xb4" => [77, "\v4"], "\xb5" => [18, "\v4"], "\xb6" => [77, "\v5"], "\xb7" => [18, "\v5"], "\xb8" => [77, "\v6"], "\xb9" => [18, "\v6"], "\xba" => [77, "\v7"], "\xbb" => [18, "\v7"], "\xbc" => [77, "\v8"], "\xbd" => [18, "\v8"], "\xbe" => [77, "\v9"], "\xbf" => [18, "\v9"], "\xc0" => [77, "\v="], "\xc1" => [18, "\v="], "\xc2" => [77, "\vA"], "\xc3" => [18, "\vA"], "\xc4" => [77, "\v_"], "\xc5" => [18, "\v_"], "\xc6" => [77, "\vb"], "\xc7" => [18, "\vb"], "\xc8" => [77, "\vd"], "\xc9" => [18, "\vd"], "\xca" => [77, "\vf"], "\xcb" => [18, "\vf"], "\xcc" => [77, "\vg"], "\xcd" => [18, "\vg"], "\xce" => [77, "\vh"], "\xcf" => [18, "\vh"], "\xd0" => [77, "\vl"], "\xd1" => [18, "\vl"], "\xd2" => [77, "\vm"], "\xd3" => [18, "\vm"], "\xd4" => [77, "\vn"], "\xd5" => [18, "\vn"], "\xd6" => [77, "\vp"], "\xd7" => [18, "\vp"], "\xd8" => [77, "\vr"], "\xd9" => [18, "\vr"], "\xda" => [77, "\vu"], "\xdb" => [18, "\vu"], "\xdc" => [0, "\v:"], "\xdd" => [0, "\vB"], "\xde" => [0, "\vC"], "\xdf" => [0, "\vD"], "\xe0" => [0, "\vE"], "\xe1" => [0, "\vF"], "\xe2" => [0, "\vG"], "\xe3" => [0, "\vH"], "\xe4" => [0, "\vI"], "\xe5" => [0, "\vJ"], "\xe6" => [0, "\vK"], "\xe7" => [0, "\vL"], "\xe8" => [0, "\vM"], "\xe9" => [0, "\vN"], "\xea" => [0, "\vO"], "\xeb" => [0, "\vP"], "\xec" => [0, "\vQ"], "\xed" => [0, "\vR"], "\xee" => [0, "\vS"], "\xef" => [0, "\vT"], "\xf0" => [0, "\vU"], "\xf1" => [0, "\vV"], "\xf2" => [0, "\vW"], "\xf3" => [0, "\vY"], "\xf4" => [0, "\vj"], "\xf5" => [0, "\vk"], "\xf6" => [0, "\vq"], "\xf7" => [0, "\vv"], "\xf8" => [0, "\vw"], "\xf9" => [0, "\vx"], "\xfa" => [0, "\vy"], "\xfb" => [0, "\vz"], "\xfc" => [82, "\v"], "\xfd" => [87, "\v"], "\xfe" => [130, "\v"], "\xff" => [9, "\v"]], ["\x00" => [77, "\x080"], "\x01" => [18, "\x080"], "\x02" => [77, "\x081"], "\x03" => [18, "\x081"], "\x04" => [77, "\x082"], "\x05" => [18, "\x082"], "\x06" => [77, "\x08a"], "\x07" => [18, "\x08a"], "\x08" => [77, "\x08c"], "\t" => [18, "\x08c"], "\n" => [77, "\x08e"], "\v" => [18, "\x08e"], "\f" => [77, "\x08i"], "\r" => [18, "\x08i"], "\x0e" => [77, "\x08o"], "\x0f" => [18, "\x08o"], "\x10" => [77, "\x08s"], "\x11" => [18, "\x08s"], "\x12" => [77, "\x08t"], "\x13" => [18, "\x08t"], "\x14" => [0, "\x08 "], "\x15" => [0, "\x08%"], "\x16" => [0, "\x08-"], "\x17" => [0, "\x08."], "\x18" => [0, "\x08/"], "\x19" => [0, "\x083"], "\x1a" => [0, "\x084"], "\x1b" => [0, "\x085"], "\x1c" => [0, "\x086"], "\x1d" => [0, "\x087"], "\x1e" => [0, "\x088"], "\x1f" => [0, "\x089"], " " => [0, "\x08="], "!" => [0, "\x08A"], "\"" => [0, "\x08_"], "#" => [0, "\x08b"], "\$" => [0, "\x08d"], "%" => [0, "\x08f"], "&" => [0, "\x08g"], "'" => [0, "\x08h"], "(" => [0, "\x08l"], ")" => [0, "\x08m"], "*" => [0, "\x08n"], "+" => [0, "\x08p"], "," => [0, "\x08r"], "-" => [0, "\x08u"], "." => [100, "\x08"], "/" => [110, "\x08"], [111, "\x08"], [115, "\x08"], [116, "\x08"], [118, "\x08"], [119, "\x08"], [122, "\x08"], [123, "\x08"], [125, "\x08"], [126, "\x08"], [129, "\x08"], ":" => [143, "\x08"], ";" => [148, "\x08"], "<" => [151, "\x08"], "=" => [153, "\x08"], ">" => [83, "\x08"], "?" => [10, "\x08"], "@" => [77, "\v0"], "A" => [18, "\v0"], "B" => [77, "\v1"], "C" => [18, "\v1"], "D" => [77, "\v2"], "E" => [18, "\v2"], "F" => [77, "\va"], "G" => [18, "\va"], "H" => [77, "\vc"], "I" => [18, "\vc"], "J" => [77, "\ve"], "K" => [18, "\ve"], "L" => [77, "\vi"], "M" => [18, "\vi"], "N" => [77, "\vo"], "O" => [18, "\vo"], "P" => [77, "\vs"], "Q" => [18, "\vs"], "R" => [77, "\vt"], "S" => [18, "\vt"], "T" => [0, "\v "], "U" => [0, "\v%"], "V" => [0, "\v-"], "W" => [0, "\v."], "X" => [0, "\v/"], "Y" => [0, "\v3"], "Z" => [0, "\v4"], "[" => [0, "\v5"], "\\" => [0, "\v6"], "]" => [0, "\v7"], "^" => [0, "\v8"], "_" => [0, "\v9"], "`" => [0, "\v="], "a" => [0, "\vA"], "b" => [0, "\v_"], "c" => [0, "\vb"], "d" => [0, "\vd"], "e" => [0, "\vf"], "f" => [0, "\vg"], "g" => [0, "\vh"], "h" => [0, "\vl"], "i" => [0, "\vm"], "j" => [0, "\vn"], "k" => [0, "\vp"], "l" => [0, "\vr"], "m" => [0, "\vu"], "n" => [100, "\v"], "o" => [110, "\v"], "p" => [111, "\v"], "q" => [115, "\v"], "r" => [116, "\v"], "s" => [118, "\v"], "t" => [119, "\v"], "u" => [122, "\v"], "v" => [123, "\v"], "w" => [125, "\v"], "x" => [126, "\v"], "y" => [129, "\v"], "z" => [143, "\v"], "{" => [148, "\v"], "|" => [151, "\v"], "}" => [153, "\v"], "~" => [83, "\v"], "" => [10, "\v"], "\x80" => [77, "\f0"], "\x81" => [18, "\f0"], "\x82" => [77, "\f1"], "\x83" => [18, "\f1"], "\x84" => [77, "\f2"], "\x85" => [18, "\f2"], "\x86" => [77, "\fa"], "\x87" => [18, "\fa"], "\x88" => [77, "\fc"], "\x89" => [18, "\fc"], "\x8a" => [77, "\fe"], "\x8b" => [18, "\fe"], "\x8c" => [77, "\fi"], "\x8d" => [18, "\fi"], "\x8e" => [77, "\fo"], "\x8f" => [18, "\fo"], "\x90" => [77, "\fs"], "\x91" => [18, "\fs"], "\x92" => [77, "\ft"], "\x93" => [18, "\ft"], "\x94" => [0, "\f "], "\x95" => [0, "\f%"], "\x96" => [0, "\f-"], "\x97" => [0, "\f."], "\x98" => [0, "\f/"], "\x99" => [0, "\f3"], "\x9a" => [0, "\f4"], "\x9b" => [0, "\f5"], "\x9c" => [0, "\f6"], "\x9d" => [0, "\f7"], "\x9e" => [0, "\f8"], "\x9f" => [0, "\f9"], "\xa0" => [0, "\f="], "\xa1" => [0, "\fA"], "\xa2" => [0, "\f_"], "\xa3" => [0, "\fb"], "\xa4" => [0, "\fd"], "\xa5" => [0, "\ff"], "\xa6" => [0, "\fg"], "\xa7" => [0, "\fh"], "\xa8" => [0, "\fl"], "\xa9" => [0, "\fm"], "\xaa" => [0, "\fn"], "\xab" => [0, "\fp"], "\xac" => [0, "\fr"], "\xad" => [0, "\fu"], "\xae" => [100, "\f"], "\xaf" => [110, "\f"], "\xb0" => [111, "\f"], "\xb1" => [115, "\f"], "\xb2" => [116, "\f"], "\xb3" => [118, "\f"], "\xb4" => [119, "\f"], "\xb5" => [122, "\f"], "\xb6" => [123, "\f"], "\xb7" => [125, "\f"], "\xb8" => [126, "\f"], "\xb9" => [129, "\f"], "\xba" => [143, "\f"], "\xbb" => [148, "\f"], "\xbc" => [151, "\f"], "\xbd" => [153, "\f"], "\xbe" => [83, "\f"], "\xbf" => [10, "\f"], "\xc0" => [77, "\x0e0"], "\xc1" => [18, "\x0e0"], "\xc2" => [77, "\x0e1"], "\xc3" => [18, "\x0e1"], "\xc4" => [77, "\x0e2"], "\xc5" => [18, "\x0e2"], "\xc6" => [77, "\x0ea"], "\xc7" => [18, "\x0ea"], "\xc8" => [77, "\x0ec"], "\xc9" => [18, "\x0ec"], "\xca" => [77, "\x0ee"], "\xcb" => [18, "\x0ee"], "\xcc" => [77, "\x0ei"], "\xcd" => [18, "\x0ei"], "\xce" => [77, "\x0eo"], "\xcf" => [18, "\x0eo"], "\xd0" => [77, "\x0es"], "\xd1" => [18, "\x0es"], "\xd2" => [77, "\x0et"], "\xd3" => [18, "\x0et"], "\xd4" => [0, "\x0e "], "\xd5" => [0, "\x0e%"], "\xd6" => [0, "\x0e-"], "\xd7" => [0, "\x0e."], "\xd8" => [0, "\x0e/"], "\xd9" => [0, "\x0e3"], "\xda" => [0, "\x0e4"], "\xdb" => [0, "\x0e5"], "\xdc" => [0, "\x0e6"], "\xdd" => [0, "\x0e7"], "\xde" => [0, "\x0e8"], "\xdf" => [0, "\x0e9"], "\xe0" => [0, "\x0e="], "\xe1" => [0, "\x0eA"], "\xe2" => [0, "\x0e_"], "\xe3" => [0, "\x0eb"], "\xe4" => [0, "\x0ed"], "\xe5" => [0, "\x0ef"], "\xe6" => [0, "\x0eg"], "\xe7" => [0, "\x0eh"], "\xe8" => [0, "\x0el"], "\xe9" => [0, "\x0em"], "\xea" => [0, "\x0en"], "\xeb" => [0, "\x0ep"], "\xec" => [0, "\x0er"], "\xed" => [0, "\x0eu"], "\xee" => [100, "\x0e"], "\xef" => [110, "\x0e"], "\xf0" => [111, "\x0e"], "\xf1" => [115, "\x0e"], "\xf2" => [116, "\x0e"], "\xf3" => [118, "\x0e"], "\xf4" => [119, "\x0e"], "\xf5" => [122, "\x0e"], "\xf6" => [123, "\x0e"], "\xf7" => [125, "\x0e"], "\xf8" => [126, "\x0e"], "\xf9" => [129, "\x0e"], "\xfa" => [143, "\x0e"], "\xfb" => [148, "\x0e"], "\xfc" => [151, "\x0e"], "\xfd" => [153, "\x0e"], "\xfe" => [83, "\x0e"], "\xff" => [10, "\x0e"]], ["\x00" => [0, "\x080"], "\x01" => [0, "\x081"], "\x02" => [0, "\x082"], "\x03" => [0, "\x08a"], "\x04" => [0, "\x08c"], "\x05" => [0, "\x08e"], "\x06" => [0, "\x08i"], "\x07" => [0, "\x08o"], "\x08" => [0, "\x08s"], "\t" => [0, "\x08t"], "\n" => [73, "\x08"], "\v" => [88, "\x08"], "\f" => [89, "\x08"], "\r" => [96, "\x08"], "\x0e" => [97, "\x08"], "\x0f" => [99, "\x08"], "\x10" => [106, "\x08"], "\x11" => [136, "\x08"], "\x12" => [139, "\x08"], "\x13" => [141, "\x08"], "\x14" => [145, "\x08"], "\x15" => [147, "\x08"], "\x16" => [149, "\x08"], "\x17" => [101, "\x08"], "\x18" => [112, "\x08"], "\x19" => [117, "\x08"], "\x1a" => [120, "\x08"], "\x1b" => [124, "\x08"], "\x1c" => [127, "\x08"], "\x1d" => [144, "\x08"], "\x1e" => [152, "\x08"], "\x1f" => [11, "\x08"], " " => [0, "\v0"], "!" => [0, "\v1"], "\"" => [0, "\v2"], "#" => [0, "\va"], "\$" => [0, "\vc"], "%" => [0, "\ve"], "&" => [0, "\vi"], "'" => [0, "\vo"], "(" => [0, "\vs"], ")" => [0, "\vt"], "*" => [73, "\v"], "+" => [88, "\v"], "," => [89, "\v"], "-" => [96, "\v"], "." => [97, "\v"], "/" => [99, "\v"], [106, "\v"], [136, "\v"], [139, "\v"], [141, "\v"], [145, "\v"], [147, "\v"], [149, "\v"], [101, "\v"], [112, "\v"], [117, "\v"], ":" => [120, "\v"], ";" => [124, "\v"], "<" => [127, "\v"], "=" => [144, "\v"], ">" => [152, "\v"], "?" => [11, "\v"], "@" => [0, "\f0"], "A" => [0, "\f1"], "B" => [0, "\f2"], "C" => [0, "\fa"], "D" => [0, "\fc"], "E" => [0, "\fe"], "F" => [0, "\fi"], "G" => [0, "\fo"], "H" => [0, "\fs"], "I" => [0, "\ft"], "J" => [73, "\f"], "K" => [88, "\f"], "L" => [89, "\f"], "M" => [96, "\f"], "N" => [97, "\f"], "O" => [99, "\f"], "P" => [106, "\f"], "Q" => [136, "\f"], "R" => [139, "\f"], "S" => [141, "\f"], "T" => [145, "\f"], "U" => [147, "\f"], "V" => [149, "\f"], "W" => [101, "\f"], "X" => [112, "\f"], "Y" => [117, "\f"], "Z" => [120, "\f"], "[" => [124, "\f"], "\\" => [127, "\f"], "]" => [144, "\f"], "^" => [152, "\f"], "_" => [11, "\f"], "`" => [0, "\x0e0"], "a" => [0, "\x0e1"], "b" => [0, "\x0e2"], "c" => [0, "\x0ea"], "d" => [0, "\x0ec"], "e" => [0, "\x0ee"], "f" => [0, "\x0ei"], "g" => [0, "\x0eo"], "h" => [0, "\x0es"], "i" => [0, "\x0et"], "j" => [73, "\x0e"], "k" => [88, "\x0e"], "l" => [89, "\x0e"], "m" => [96, "\x0e"], "n" => [97, "\x0e"], "o" => [99, "\x0e"], "p" => [106, "\x0e"], "q" => [136, "\x0e"], "r" => [139, "\x0e"], "s" => [141, "\x0e"], "t" => [145, "\x0e"], "u" => [147, "\x0e"], "v" => [149, "\x0e"], "w" => [101, "\x0e"], "x" => [112, "\x0e"], "y" => [117, "\x0e"], "z" => [120, "\x0e"], "{" => [124, "\x0e"], "|" => [127, "\x0e"], "}" => [144, "\x0e"], "~" => [152, "\x0e"], "" => [11, "\x0e"], "\x80" => [0, "\x0f0"], "\x81" => [0, "\x0f1"], "\x82" => [0, "\x0f2"], "\x83" => [0, "\x0fa"], "\x84" => [0, "\x0fc"], "\x85" => [0, "\x0fe"], "\x86" => [0, "\x0fi"], "\x87" => [0, "\x0fo"], "\x88" => [0, "\x0fs"], "\x89" => [0, "\x0ft"], "\x8a" => [73, "\x0f"], "\x8b" => [88, "\x0f"], "\x8c" => [89, "\x0f"], "\x8d" => [96, "\x0f"], "\x8e" => [97, "\x0f"], "\x8f" => [99, "\x0f"], "\x90" => [106, "\x0f"], "\x91" => [136, "\x0f"], "\x92" => [139, "\x0f"], "\x93" => [141, "\x0f"], "\x94" => [145, "\x0f"], "\x95" => [147, "\x0f"], "\x96" => [149, "\x0f"], "\x97" => [101, "\x0f"], "\x98" => [112, "\x0f"], "\x99" => [117, "\x0f"], "\x9a" => [120, "\x0f"], "\x9b" => [124, "\x0f"], "\x9c" => [127, "\x0f"], "\x9d" => [144, "\x0f"], "\x9e" => [152, "\x0f"], "\x9f" => [11, "\x0f"], "\xa0" => [0, "\x100"], "\xa1" => [0, "\x101"], "\xa2" => [0, "\x102"], "\xa3" => [0, "\x10a"], "\xa4" => [0, "\x10c"], "\xa5" => [0, "\x10e"], "\xa6" => [0, "\x10i"], "\xa7" => [0, "\x10o"], "\xa8" => [0, "\x10s"], "\xa9" => [0, "\x10t"], "\xaa" => [73, "\x10"], "\xab" => [88, "\x10"], "\xac" => [89, "\x10"], "\xad" => [96, "\x10"], "\xae" => [97, "\x10"], "\xaf" => [99, "\x10"], "\xb0" => [106, "\x10"], "\xb1" => [136, "\x10"], "\xb2" => [139, "\x10"], "\xb3" => [141, "\x10"], "\xb4" => [145, "\x10"], "\xb5" => [147, "\x10"], "\xb6" => [149, "\x10"], "\xb7" => [101, "\x10"], "\xb8" => [112, "\x10"], "\xb9" => [117, "\x10"], "\xba" => [120, "\x10"], "\xbb" => [124, "\x10"], "\xbc" => [127, "\x10"], "\xbd" => [144, "\x10"], "\xbe" => [152, "\x10"], "\xbf" => [11, "\x10"], "\xc0" => [0, "\x110"], "\xc1" => [0, "\x111"], "\xc2" => [0, "\x112"], "\xc3" => [0, "\x11a"], "\xc4" => [0, "\x11c"], "\xc5" => [0, "\x11e"], "\xc6" => [0, "\x11i"], "\xc7" => [0, "\x11o"], "\xc8" => [0, "\x11s"], "\xc9" => [0, "\x11t"], "\xca" => [73, "\x11"], "\xcb" => [88, "\x11"], "\xcc" => [89, "\x11"], "\xcd" => [96, "\x11"], "\xce" => [97, "\x11"], "\xcf" => [99, "\x11"], "\xd0" => [106, "\x11"], "\xd1" => [136, "\x11"], "\xd2" => [139, "\x11"], "\xd3" => [141, "\x11"], "\xd4" => [145, "\x11"], "\xd5" => [147, "\x11"], "\xd6" => [149, "\x11"], "\xd7" => [101, "\x11"], "\xd8" => [112, "\x11"], "\xd9" => [117, "\x11"], "\xda" => [120, "\x11"], "\xdb" => [124, "\x11"], "\xdc" => [127, "\x11"], "\xdd" => [144, "\x11"], "\xde" => [152, "\x11"], "\xdf" => [11, "\x11"], "\xe0" => [0, "\x120"], "\xe1" => [0, "\x121"], "\xe2" => [0, "\x122"], "\xe3" => [0, "\x12a"], "\xe4" => [0, "\x12c"], "\xe5" => [0, "\x12e"], "\xe6" => [0, "\x12i"], "\xe7" => [0, "\x12o"], "\xe8" => [0, "\x12s"], "\xe9" => [0, "\x12t"], "\xea" => [73, "\x12"], "\xeb" => [88, "\x12"], "\xec" => [89, "\x12"], "\xed" => [96, "\x12"], "\xee" => [97, "\x12"], "\xef" => [99, "\x12"], "\xf0" => [106, "\x12"], "\xf1" => [136, "\x12"], "\xf2" => [139, "\x12"], "\xf3" => [141, "\x12"], "\xf4" => [145, "\x12"], "\xf5" => [147, "\x12"], "\xf6" => [149, "\x12"], "\xf7" => [101, "\x12"], "\xf8" => [112, "\x12"], "\xf9" => [117, "\x12"], "\xfa" => [120, "\x12"], "\xfb" => [124, "\x12"], "\xfc" => [127, "\x12"], "\xfd" => [144, "\x12"], "\xfe" => [152, "\x12"], "\xff" => [11, "\x12"]], ["\x00" => [94, "\t0"], "\x01" => [76, "\t0"], "\x02" => [104, "\t0"], "\x03" => [16, "\t0"], "\x04" => [94, "\t1"], "\x05" => [76, "\t1"], "\x06" => [104, "\t1"], "\x07" => [16, "\t1"], "\x08" => [94, "\t2"], "\t" => [76, "\t2"], "\n" => [104, "\t2"], "\v" => [16, "\t2"], "\f" => [94, "\ta"], "\r" => [76, "\ta"], "\x0e" => [104, "\ta"], "\x0f" => [16, "\ta"], "\x10" => [94, "\tc"], "\x11" => [76, "\tc"], "\x12" => [104, "\tc"], "\x13" => [16, "\tc"], "\x14" => [94, "\te"], "\x15" => [76, "\te"], "\x16" => [104, "\te"], "\x17" => [16, "\te"], "\x18" => [94, "\ti"], "\x19" => [76, "\ti"], "\x1a" => [104, "\ti"], "\x1b" => [16, "\ti"], "\x1c" => [94, "\to"], "\x1d" => [76, "\to"], "\x1e" => [104, "\to"], "\x1f" => [16, "\to"], " " => [94, "\ts"], "!" => [76, "\ts"], "\"" => [104, "\ts"], "#" => [16, "\ts"], "\$" => [94, "\tt"], "%" => [76, "\tt"], "&" => [104, "\tt"], "'" => [16, "\tt"], "(" => [77, "\t "], ")" => [18, "\t "], "*" => [77, "\t%"], "+" => [18, "\t%"], "," => [77, "\t-"], "-" => [18, "\t-"], "." => [77, "\t."], "/" => [18, "\t."], [77, "\t/"], [18, "\t/"], [77, "\t3"], [18, "\t3"], [77, "\t4"], [18, "\t4"], [77, "\t5"], [18, "\t5"], [77, "\t6"], [18, "\t6"], ":" => [77, "\t7"], ";" => [18, "\t7"], "<" => [77, "\t8"], "=" => [18, "\t8"], ">" => [77, "\t9"], "?" => [18, "\t9"], "@" => [77, "\t="], "A" => [18, "\t="], "B" => [77, "\tA"], "C" => [18, "\tA"], "D" => [77, "\t_"], "E" => [18, "\t_"], "F" => [77, "\tb"], "G" => [18, "\tb"], "H" => [77, "\td"], "I" => [18, "\td"], "J" => [77, "\tf"], "K" => [18, "\tf"], "L" => [77, "\tg"], "M" => [18, "\tg"], "N" => [77, "\th"], "O" => [18, "\th"], "P" => [77, "\tl"], "Q" => [18, "\tl"], "R" => [77, "\tm"], "S" => [18, "\tm"], "T" => [77, "\tn"], "U" => [18, "\tn"], "V" => [77, "\tp"], "W" => [18, "\tp"], "X" => [77, "\tr"], "Y" => [18, "\tr"], "Z" => [77, "\tu"], "[" => [18, "\tu"], "\\" => [0, "\t:"], "]" => [0, "\tB"], "^" => [0, "\tC"], "_" => [0, "\tD"], "`" => [0, "\tE"], "a" => [0, "\tF"], "b" => [0, "\tG"], "c" => [0, "\tH"], "d" => [0, "\tI"], "e" => [0, "\tJ"], "f" => [0, "\tK"], "g" => [0, "\tL"], "h" => [0, "\tM"], "i" => [0, "\tN"], "j" => [0, "\tO"], "k" => [0, "\tP"], "l" => [0, "\tQ"], "m" => [0, "\tR"], "n" => [0, "\tS"], "o" => [0, "\tT"], "p" => [0, "\tU"], "q" => [0, "\tV"], "r" => [0, "\tW"], "s" => [0, "\tY"], "t" => [0, "\tj"], "u" => [0, "\tk"], "v" => [0, "\tq"], "w" => [0, "\tv"], "x" => [0, "\tw"], "y" => [0, "\tx"], "z" => [0, "\ty"], "{" => [0, "\tz"], "|" => [82, "\t"], "}" => [87, "\t"], "~" => [130, "\t"], "" => [9, "\t"], "\x80" => [94, "\x8e0"], "\x81" => [76, "\x8e0"], "\x82" => [104, "\x8e0"], "\x83" => [16, "\x8e0"], "\x84" => [94, "\x8e1"], "\x85" => [76, "\x8e1"], "\x86" => [104, "\x8e1"], "\x87" => [16, "\x8e1"], "\x88" => [94, "\x8e2"], "\x89" => [76, "\x8e2"], "\x8a" => [104, "\x8e2"], "\x8b" => [16, "\x8e2"], "\x8c" => [94, "\x8ea"], "\x8d" => [76, "\x8ea"], "\x8e" => [104, "\x8ea"], "\x8f" => [16, "\x8ea"], "\x90" => [94, "\x8ec"], "\x91" => [76, "\x8ec"], "\x92" => [104, "\x8ec"], "\x93" => [16, "\x8ec"], "\x94" => [94, "\x8ee"], "\x95" => [76, "\x8ee"], "\x96" => [104, "\x8ee"], "\x97" => [16, "\x8ee"], "\x98" => [94, "\x8ei"], "\x99" => [76, "\x8ei"], "\x9a" => [104, "\x8ei"], "\x9b" => [16, "\x8ei"], "\x9c" => [94, "\x8eo"], "\x9d" => [76, "\x8eo"], "\x9e" => [104, "\x8eo"], "\x9f" => [16, "\x8eo"], "\xa0" => [94, "\x8es"], "\xa1" => [76, "\x8es"], "\xa2" => [104, "\x8es"], "\xa3" => [16, "\x8es"], "\xa4" => [94, "\x8et"], "\xa5" => [76, "\x8et"], "\xa6" => [104, "\x8et"], "\xa7" => [16, "\x8et"], "\xa8" => [77, "\x8e "], "\xa9" => [18, "\x8e "], "\xaa" => [77, "\x8e%"], "\xab" => [18, "\x8e%"], "\xac" => [77, "\x8e-"], "\xad" => [18, "\x8e-"], "\xae" => [77, "\x8e."], "\xaf" => [18, "\x8e."], "\xb0" => [77, "\x8e/"], "\xb1" => [18, "\x8e/"], "\xb2" => [77, "\x8e3"], "\xb3" => [18, "\x8e3"], "\xb4" => [77, "\x8e4"], "\xb5" => [18, "\x8e4"], "\xb6" => [77, "\x8e5"], "\xb7" => [18, "\x8e5"], "\xb8" => [77, "\x8e6"], "\xb9" => [18, "\x8e6"], "\xba" => [77, "\x8e7"], "\xbb" => [18, "\x8e7"], "\xbc" => [77, "\x8e8"], "\xbd" => [18, "\x8e8"], "\xbe" => [77, "\x8e9"], "\xbf" => [18, "\x8e9"], "\xc0" => [77, "\x8e="], "\xc1" => [18, "\x8e="], "\xc2" => [77, "\x8eA"], "\xc3" => [18, "\x8eA"], "\xc4" => [77, "\x8e_"], "\xc5" => [18, "\x8e_"], "\xc6" => [77, "\x8eb"], "\xc7" => [18, "\x8eb"], "\xc8" => [77, "\x8ed"], "\xc9" => [18, "\x8ed"], "\xca" => [77, "\x8ef"], "\xcb" => [18, "\x8ef"], "\xcc" => [77, "\x8eg"], "\xcd" => [18, "\x8eg"], "\xce" => [77, "\x8eh"], "\xcf" => [18, "\x8eh"], "\xd0" => [77, "\x8el"], "\xd1" => [18, "\x8el"], "\xd2" => [77, "\x8em"], "\xd3" => [18, "\x8em"], "\xd4" => [77, "\x8en"], "\xd5" => [18, "\x8en"], "\xd6" => [77, "\x8ep"], "\xd7" => [18, "\x8ep"], "\xd8" => [77, "\x8er"], "\xd9" => [18, "\x8er"], "\xda" => [77, "\x8eu"], "\xdb" => [18, "\x8eu"], "\xdc" => [0, "\x8e:"], "\xdd" => [0, "\x8eB"], "\xde" => [0, "\x8eC"], "\xdf" => [0, "\x8eD"], "\xe0" => [0, "\x8eE"], "\xe1" => [0, "\x8eF"], "\xe2" => [0, "\x8eG"], "\xe3" => [0, "\x8eH"], "\xe4" => [0, "\x8eI"], "\xe5" => [0, "\x8eJ"], "\xe6" => [0, "\x8eK"], "\xe7" => [0, "\x8eL"], "\xe8" => [0, "\x8eM"], "\xe9" => [0, "\x8eN"], "\xea" => [0, "\x8eO"], "\xeb" => [0, "\x8eP"], "\xec" => [0, "\x8eQ"], "\xed" => [0, "\x8eR"], "\xee" => [0, "\x8eS"], "\xef" => [0, "\x8eT"], "\xf0" => [0, "\x8eU"], "\xf1" => [0, "\x8eV"], "\xf2" => [0, "\x8eW"], "\xf3" => [0, "\x8eY"], "\xf4" => [0, "\x8ej"], "\xf5" => [0, "\x8ek"], "\xf6" => [0, "\x8eq"], "\xf7" => [0, "\x8ev"], "\xf8" => [0, "\x8ew"], "\xf9" => [0, "\x8ex"], "\xfa" => [0, "\x8ey"], "\xfb" => [0, "\x8ez"], "\xfc" => [82, "\x8e"], "\xfd" => [87, "\x8e"], "\xfe" => [130, "\x8e"], "\xff" => [9, "\x8e"]], ["\x00" => [94, "\xef0"], "\x01" => [76, "\xef0"], "\x02" => [104, "\xef0"], "\x03" => [16, "\xef0"], "\x04" => [94, "\xef1"], "\x05" => [76, "\xef1"], "\x06" => [104, "\xef1"], "\x07" => [16, "\xef1"], "\x08" => [94, "\xef2"], "\t" => [76, "\xef2"], "\n" => [104, "\xef2"], "\v" => [16, "\xef2"], "\f" => [94, "\xefa"], "\r" => [76, "\xefa"], "\x0e" => [104, "\xefa"], "\x0f" => [16, "\xefa"], "\x10" => [94, "\xefc"], "\x11" => [76, "\xefc"], "\x12" => [104, "\xefc"], "\x13" => [16, "\xefc"], "\x14" => [94, "\xefe"], "\x15" => [76, "\xefe"], "\x16" => [104, "\xefe"], "\x17" => [16, "\xefe"], "\x18" => [94, "\xefi"], "\x19" => [76, "\xefi"], "\x1a" => [104, "\xefi"], "\x1b" => [16, "\xefi"], "\x1c" => [94, "\xefo"], "\x1d" => [76, "\xefo"], "\x1e" => [104, "\xefo"], "\x1f" => [16, "\xefo"], " " => [94, "\xefs"], "!" => [76, "\xefs"], "\"" => [104, "\xefs"], "#" => [16, "\xefs"], "\$" => [94, "\xeft"], "%" => [76, "\xeft"], "&" => [104, "\xeft"], "'" => [16, "\xeft"], "(" => [77, "\xef "], ")" => [18, "\xef "], "*" => [77, "\xef%"], "+" => [18, "\xef%"], "," => [77, "\xef-"], "-" => [18, "\xef-"], "." => [77, "\xef."], "/" => [18, "\xef."], [77, "\xef/"], [18, "\xef/"], [77, "\xef3"], [18, "\xef3"], [77, "\xef4"], [18, "\xef4"], [77, "\xef5"], [18, "\xef5"], [77, "\xef6"], [18, "\xef6"], ":" => [77, "\xef7"], ";" => [18, "\xef7"], "<" => [77, "\xef8"], "=" => [18, "\xef8"], ">" => [77, "\xef9"], "?" => [18, "\xef9"], "@" => [77, "\xef="], "A" => [18, "\xef="], "B" => [77, "\xefA"], "C" => [18, "\xefA"], "D" => [77, "\xef_"], "E" => [18, "\xef_"], "F" => [77, "\xefb"], "G" => [18, "\xefb"], "H" => [77, "\xefd"], "I" => [18, "\xefd"], "J" => [77, "\xeff"], "K" => [18, "\xeff"], "L" => [77, "\xefg"], "M" => [18, "\xefg"], "N" => [77, "\xefh"], "O" => [18, "\xefh"], "P" => [77, "\xefl"], "Q" => [18, "\xefl"], "R" => [77, "\xefm"], "S" => [18, "\xefm"], "T" => [77, "\xefn"], "U" => [18, "\xefn"], "V" => [77, "\xefp"], "W" => [18, "\xefp"], "X" => [77, "\xefr"], "Y" => [18, "\xefr"], "Z" => [77, "\xefu"], "[" => [18, "\xefu"], "\\" => [0, "\xef:"], "]" => [0, "\xefB"], "^" => [0, "\xefC"], "_" => [0, "\xefD"], "`" => [0, "\xefE"], "a" => [0, "\xefF"], "b" => [0, "\xefG"], "c" => [0, "\xefH"], "d" => [0, "\xefI"], "e" => [0, "\xefJ"], "f" => [0, "\xefK"], "g" => [0, "\xefL"], "h" => [0, "\xefM"], "i" => [0, "\xefN"], "j" => [0, "\xefO"], "k" => [0, "\xefP"], "l" => [0, "\xefQ"], "m" => [0, "\xefR"], "n" => [0, "\xefS"], "o" => [0, "\xefT"], "p" => [0, "\xefU"], "q" => [0, "\xefV"], "r" => [0, "\xefW"], "s" => [0, "\xefY"], "t" => [0, "\xefj"], "u" => [0, "\xefk"], "v" => [0, "\xefq"], "w" => [0, "\xefv"], "x" => [0, "\xefw"], "y" => [0, "\xefx"], "z" => [0, "\xefy"], "{" => [0, "\xefz"], "|" => [82, "\xef"], "}" => [87, "\xef"], "~" => [130, "\xef"], "" => [9, "\xef"], "\x80" => [77, "\t0"], "\x81" => [18, "\t0"], "\x82" => [77, "\t1"], "\x83" => [18, "\t1"], "\x84" => [77, "\t2"], "\x85" => [18, "\t2"], "\x86" => [77, "\ta"], "\x87" => [18, "\ta"], "\x88" => [77, "\tc"], "\x89" => [18, "\tc"], "\x8a" => [77, "\te"], "\x8b" => [18, "\te"], "\x8c" => [77, "\ti"], "\x8d" => [18, "\ti"], "\x8e" => [77, "\to"], "\x8f" => [18, "\to"], "\x90" => [77, "\ts"], "\x91" => [18, "\ts"], "\x92" => [77, "\tt"], "\x93" => [18, "\tt"], "\x94" => [0, "\t "], "\x95" => [0, "\t%"], "\x96" => [0, "\t-"], "\x97" => [0, "\t."], "\x98" => [0, "\t/"], "\x99" => [0, "\t3"], "\x9a" => [0, "\t4"], "\x9b" => [0, "\t5"], "\x9c" => [0, "\t6"], "\x9d" => [0, "\t7"], "\x9e" => [0, "\t8"], "\x9f" => [0, "\t9"], "\xa0" => [0, "\t="], "\xa1" => [0, "\tA"], "\xa2" => [0, "\t_"], "\xa3" => [0, "\tb"], "\xa4" => [0, "\td"], "\xa5" => [0, "\tf"], "\xa6" => [0, "\tg"], "\xa7" => [0, "\th"], "\xa8" => [0, "\tl"], "\xa9" => [0, "\tm"], "\xaa" => [0, "\tn"], "\xab" => [0, "\tp"], "\xac" => [0, "\tr"], "\xad" => [0, "\tu"], "\xae" => [100, "\t"], "\xaf" => [110, "\t"], "\xb0" => [111, "\t"], "\xb1" => [115, "\t"], "\xb2" => [116, "\t"], "\xb3" => [118, "\t"], "\xb4" => [119, "\t"], "\xb5" => [122, "\t"], "\xb6" => [123, "\t"], "\xb7" => [125, "\t"], "\xb8" => [126, "\t"], "\xb9" => [129, "\t"], "\xba" => [143, "\t"], "\xbb" => [148, "\t"], "\xbc" => [151, "\t"], "\xbd" => [153, "\t"], "\xbe" => [83, "\t"], "\xbf" => [10, "\t"], "\xc0" => [77, "\x8e0"], "\xc1" => [18, "\x8e0"], "\xc2" => [77, "\x8e1"], "\xc3" => [18, "\x8e1"], "\xc4" => [77, "\x8e2"], "\xc5" => [18, "\x8e2"], "\xc6" => [77, "\x8ea"], "\xc7" => [18, "\x8ea"], "\xc8" => [77, "\x8ec"], "\xc9" => [18, "\x8ec"], "\xca" => [77, "\x8ee"], "\xcb" => [18, "\x8ee"], "\xcc" => [77, "\x8ei"], "\xcd" => [18, "\x8ei"], "\xce" => [77, "\x8eo"], "\xcf" => [18, "\x8eo"], "\xd0" => [77, "\x8es"], "\xd1" => [18, "\x8es"], "\xd2" => [77, "\x8et"], "\xd3" => [18, "\x8et"], "\xd4" => [0, "\x8e "], "\xd5" => [0, "\x8e%"], "\xd6" => [0, "\x8e-"], "\xd7" => [0, "\x8e."], "\xd8" => [0, "\x8e/"], "\xd9" => [0, "\x8e3"], "\xda" => [0, "\x8e4"], "\xdb" => [0, "\x8e5"], "\xdc" => [0, "\x8e6"], "\xdd" => [0, "\x8e7"], "\xde" => [0, "\x8e8"], "\xdf" => [0, "\x8e9"], "\xe0" => [0, "\x8e="], "\xe1" => [0, "\x8eA"], "\xe2" => [0, "\x8e_"], "\xe3" => [0, "\x8eb"], "\xe4" => [0, "\x8ed"], "\xe5" => [0, "\x8ef"], "\xe6" => [0, "\x8eg"], "\xe7" => [0, "\x8eh"], "\xe8" => [0, "\x8el"], "\xe9" => [0, "\x8em"], "\xea" => [0, "\x8en"], "\xeb" => [0, "\x8ep"], "\xec" => [0, "\x8er"], "\xed" => [0, "\x8eu"], "\xee" => [100, "\x8e"], "\xef" => [110, "\x8e"], "\xf0" => [111, "\x8e"], "\xf1" => [115, "\x8e"], "\xf2" => [116, "\x8e"], "\xf3" => [118, "\x8e"], "\xf4" => [119, "\x8e"], "\xf5" => [122, "\x8e"], "\xf6" => [123, "\x8e"], "\xf7" => [125, "\x8e"], "\xf8" => [126, "\x8e"], "\xf9" => [129, "\x8e"], "\xfa" => [143, "\x8e"], "\xfb" => [148, "\x8e"], "\xfc" => [151, "\x8e"], "\xfd" => [153, "\x8e"], "\xfe" => [83, "\x8e"], "\xff" => [10, "\x8e"]], ["\x00" => [77, "\xef0"], "\x01" => [18, "\xef0"], "\x02" => [77, "\xef1"], "\x03" => [18, "\xef1"], "\x04" => [77, "\xef2"], "\x05" => [18, "\xef2"], "\x06" => [77, "\xefa"], "\x07" => [18, "\xefa"], "\x08" => [77, "\xefc"], "\t" => [18, "\xefc"], "\n" => [77, "\xefe"], "\v" => [18, "\xefe"], "\f" => [77, "\xefi"], "\r" => [18, "\xefi"], "\x0e" => [77, "\xefo"], "\x0f" => [18, "\xefo"], "\x10" => [77, "\xefs"], "\x11" => [18, "\xefs"], "\x12" => [77, "\xeft"], "\x13" => [18, "\xeft"], "\x14" => [0, "\xef "], "\x15" => [0, "\xef%"], "\x16" => [0, "\xef-"], "\x17" => [0, "\xef."], "\x18" => [0, "\xef/"], "\x19" => [0, "\xef3"], "\x1a" => [0, "\xef4"], "\x1b" => [0, "\xef5"], "\x1c" => [0, "\xef6"], "\x1d" => [0, "\xef7"], "\x1e" => [0, "\xef8"], "\x1f" => [0, "\xef9"], " " => [0, "\xef="], "!" => [0, "\xefA"], "\"" => [0, "\xef_"], "#" => [0, "\xefb"], "\$" => [0, "\xefd"], "%" => [0, "\xeff"], "&" => [0, "\xefg"], "'" => [0, "\xefh"], "(" => [0, "\xefl"], ")" => [0, "\xefm"], "*" => [0, "\xefn"], "+" => [0, "\xefp"], "," => [0, "\xefr"], "-" => [0, "\xefu"], "." => [100, "\xef"], "/" => [110, "\xef"], [111, "\xef"], [115, "\xef"], [116, "\xef"], [118, "\xef"], [119, "\xef"], [122, "\xef"], [123, "\xef"], [125, "\xef"], [126, "\xef"], [129, "\xef"], ":" => [143, "\xef"], ";" => [148, "\xef"], "<" => [151, "\xef"], "=" => [153, "\xef"], ">" => [83, "\xef"], "?" => [10, "\xef"], "@" => [0, "\t0"], "A" => [0, "\t1"], "B" => [0, "\t2"], "C" => [0, "\ta"], "D" => [0, "\tc"], "E" => [0, "\te"], "F" => [0, "\ti"], "G" => [0, "\to"], "H" => [0, "\ts"], "I" => [0, "\tt"], "J" => [73, "\t"], "K" => [88, "\t"], "L" => [89, "\t"], "M" => [96, "\t"], "N" => [97, "\t"], "O" => [99, "\t"], "P" => [106, "\t"], "Q" => [136, "\t"], "R" => [139, "\t"], "S" => [141, "\t"], "T" => [145, "\t"], "U" => [147, "\t"], "V" => [149, "\t"], "W" => [101, "\t"], "X" => [112, "\t"], "Y" => [117, "\t"], "Z" => [120, "\t"], "[" => [124, "\t"], "\\" => [127, "\t"], "]" => [144, "\t"], "^" => [152, "\t"], "_" => [11, "\t"], "`" => [0, "\x8e0"], "a" => [0, "\x8e1"], "b" => [0, "\x8e2"], "c" => [0, "\x8ea"], "d" => [0, "\x8ec"], "e" => [0, "\x8ee"], "f" => [0, "\x8ei"], "g" => [0, "\x8eo"], "h" => [0, "\x8es"], "i" => [0, "\x8et"], "j" => [73, "\x8e"], "k" => [88, "\x8e"], "l" => [89, "\x8e"], "m" => [96, "\x8e"], "n" => [97, "\x8e"], "o" => [99, "\x8e"], "p" => [106, "\x8e"], "q" => [136, "\x8e"], "r" => [139, "\x8e"], "s" => [141, "\x8e"], "t" => [145, "\x8e"], "u" => [147, "\x8e"], "v" => [149, "\x8e"], "w" => [101, "\x8e"], "x" => [112, "\x8e"], "y" => [117, "\x8e"], "z" => [120, "\x8e"], "{" => [124, "\x8e"], "|" => [127, "\x8e"], "}" => [144, "\x8e"], "~" => [152, "\x8e"], "" => [11, "\x8e"], "\x80" => [0, "\x900"], "\x81" => [0, "\x901"], "\x82" => [0, "\x902"], "\x83" => [0, "\x90a"], "\x84" => [0, "\x90c"], "\x85" => [0, "\x90e"], "\x86" => [0, "\x90i"], "\x87" => [0, "\x90o"], "\x88" => [0, "\x90s"], "\x89" => [0, "\x90t"], "\x8a" => [73, "\x90"], "\x8b" => [88, "\x90"], "\x8c" => [89, "\x90"], "\x8d" => [96, "\x90"], "\x8e" => [97, "\x90"], "\x8f" => [99, "\x90"], "\x90" => [106, "\x90"], "\x91" => [136, "\x90"], "\x92" => [139, "\x90"], "\x93" => [141, "\x90"], "\x94" => [145, "\x90"], "\x95" => [147, "\x90"], "\x96" => [149, "\x90"], "\x97" => [101, "\x90"], "\x98" => [112, "\x90"], "\x99" => [117, "\x90"], "\x9a" => [120, "\x90"], "\x9b" => [124, "\x90"], "\x9c" => [127, "\x90"], "\x9d" => [144, "\x90"], "\x9e" => [152, "\x90"], "\x9f" => [11, "\x90"], "\xa0" => [0, "\x910"], "\xa1" => [0, "\x911"], "\xa2" => [0, "\x912"], "\xa3" => [0, "\x91a"], "\xa4" => [0, "\x91c"], "\xa5" => [0, "\x91e"], "\xa6" => [0, "\x91i"], "\xa7" => [0, "\x91o"], "\xa8" => [0, "\x91s"], "\xa9" => [0, "\x91t"], "\xaa" => [73, "\x91"], "\xab" => [88, "\x91"], "\xac" => [89, "\x91"], "\xad" => [96, "\x91"], "\xae" => [97, "\x91"], "\xaf" => [99, "\x91"], "\xb0" => [106, "\x91"], "\xb1" => [136, "\x91"], "\xb2" => [139, "\x91"], "\xb3" => [141, "\x91"], "\xb4" => [145, "\x91"], "\xb5" => [147, "\x91"], "\xb6" => [149, "\x91"], "\xb7" => [101, "\x91"], "\xb8" => [112, "\x91"], "\xb9" => [117, "\x91"], "\xba" => [120, "\x91"], "\xbb" => [124, "\x91"], "\xbc" => [127, "\x91"], "\xbd" => [144, "\x91"], "\xbe" => [152, "\x91"], "\xbf" => [11, "\x91"], "\xc0" => [0, "\x940"], "\xc1" => [0, "\x941"], "\xc2" => [0, "\x942"], "\xc3" => [0, "\x94a"], "\xc4" => [0, "\x94c"], "\xc5" => [0, "\x94e"], "\xc6" => [0, "\x94i"], "\xc7" => [0, "\x94o"], "\xc8" => [0, "\x94s"], "\xc9" => [0, "\x94t"], "\xca" => [73, "\x94"], "\xcb" => [88, "\x94"], "\xcc" => [89, "\x94"], "\xcd" => [96, "\x94"], "\xce" => [97, "\x94"], "\xcf" => [99, "\x94"], "\xd0" => [106, "\x94"], "\xd1" => [136, "\x94"], "\xd2" => [139, "\x94"], "\xd3" => [141, "\x94"], "\xd4" => [145, "\x94"], "\xd5" => [147, "\x94"], "\xd6" => [149, "\x94"], "\xd7" => [101, "\x94"], "\xd8" => [112, "\x94"], "\xd9" => [117, "\x94"], "\xda" => [120, "\x94"], "\xdb" => [124, "\x94"], "\xdc" => [127, "\x94"], "\xdd" => [144, "\x94"], "\xde" => [152, "\x94"], "\xdf" => [11, "\x94"], "\xe0" => [0, "\x9f0"], "\xe1" => [0, "\x9f1"], "\xe2" => [0, "\x9f2"], "\xe3" => [0, "\x9fa"], "\xe4" => [0, "\x9fc"], "\xe5" => [0, "\x9fe"], "\xe6" => [0, "\x9fi"], "\xe7" => [0, "\x9fo"], "\xe8" => [0, "\x9fs"], "\xe9" => [0, "\x9ft"], "\xea" => [73, "\x9f"], "\xeb" => [88, "\x9f"], "\xec" => [89, "\x9f"], "\xed" => [96, "\x9f"], "\xee" => [97, "\x9f"], "\xef" => [99, "\x9f"], "\xf0" => [106, "\x9f"], "\xf1" => [136, "\x9f"], "\xf2" => [139, "\x9f"], "\xf3" => [141, "\x9f"], "\xf4" => [145, "\x9f"], "\xf5" => [147, "\x9f"], "\xf6" => [149, "\x9f"], "\xf7" => [101, "\x9f"], "\xf8" => [112, "\x9f"], "\xf9" => [117, "\x9f"], "\xfa" => [120, "\x9f"], "\xfb" => [124, "\x9f"], "\xfc" => [127, "\x9f"], "\xfd" => [144, "\x9f"], "\xfe" => [152, "\x9f"], "\xff" => [11, "\x9f"]], ["\x00" => [0, "\xbc0"], "\x01" => [0, "\xbc1"], "\x02" => [0, "\xbc2"], "\x03" => [0, "\xbca"], "\x04" => [0, "\xbcc"], "\x05" => [0, "\xbce"], "\x06" => [0, "\xbci"], "\x07" => [0, "\xbco"], "\x08" => [0, "\xbcs"], "\t" => [0, "\xbct"], "\n" => [73, "\xbc"], "\v" => [88, "\xbc"], "\f" => [89, "\xbc"], "\r" => [96, "\xbc"], "\x0e" => [97, "\xbc"], "\x0f" => [99, "\xbc"], "\x10" => [106, "\xbc"], "\x11" => [136, "\xbc"], "\x12" => [139, "\xbc"], "\x13" => [141, "\xbc"], "\x14" => [145, "\xbc"], "\x15" => [147, "\xbc"], "\x16" => [149, "\xbc"], "\x17" => [101, "\xbc"], "\x18" => [112, "\xbc"], "\x19" => [117, "\xbc"], "\x1a" => [120, "\xbc"], "\x1b" => [124, "\xbc"], "\x1c" => [127, "\xbc"], "\x1d" => [144, "\xbc"], "\x1e" => [152, "\xbc"], "\x1f" => [11, "\xbc"], " " => [0, "\xbf0"], "!" => [0, "\xbf1"], "\"" => [0, "\xbf2"], "#" => [0, "\xbfa"], "\$" => [0, "\xbfc"], "%" => [0, "\xbfe"], "&" => [0, "\xbfi"], "'" => [0, "\xbfo"], "(" => [0, "\xbfs"], ")" => [0, "\xbft"], "*" => [73, "\xbf"], "+" => [88, "\xbf"], "," => [89, "\xbf"], "-" => [96, "\xbf"], "." => [97, "\xbf"], "/" => [99, "\xbf"], [106, "\xbf"], [136, "\xbf"], [139, "\xbf"], [141, "\xbf"], [145, "\xbf"], [147, "\xbf"], [149, "\xbf"], [101, "\xbf"], [112, "\xbf"], [117, "\xbf"], ":" => [120, "\xbf"], ";" => [124, "\xbf"], "<" => [127, "\xbf"], "=" => [144, "\xbf"], ">" => [152, "\xbf"], "?" => [11, "\xbf"], "@" => [0, "\xc50"], "A" => [0, "\xc51"], "B" => [0, "\xc52"], "C" => [0, "\xc5a"], "D" => [0, "\xc5c"], "E" => [0, "\xc5e"], "F" => [0, "\xc5i"], "G" => [0, "\xc5o"], "H" => [0, "\xc5s"], "I" => [0, "\xc5t"], "J" => [73, "\xc5"], "K" => [88, "\xc5"], "L" => [89, "\xc5"], "M" => [96, "\xc5"], "N" => [97, "\xc5"], "O" => [99, "\xc5"], "P" => [106, "\xc5"], "Q" => [136, "\xc5"], "R" => [139, "\xc5"], "S" => [141, "\xc5"], "T" => [145, "\xc5"], "U" => [147, "\xc5"], "V" => [149, "\xc5"], "W" => [101, "\xc5"], "X" => [112, "\xc5"], "Y" => [117, "\xc5"], "Z" => [120, "\xc5"], "[" => [124, "\xc5"], "\\" => [127, "\xc5"], "]" => [144, "\xc5"], "^" => [152, "\xc5"], "_" => [11, "\xc5"], "`" => [0, "\xe70"], "a" => [0, "\xe71"], "b" => [0, "\xe72"], "c" => [0, "\xe7a"], "d" => [0, "\xe7c"], "e" => [0, "\xe7e"], "f" => [0, "\xe7i"], "g" => [0, "\xe7o"], "h" => [0, "\xe7s"], "i" => [0, "\xe7t"], "j" => [73, "\xe7"], "k" => [88, "\xe7"], "l" => [89, "\xe7"], "m" => [96, "\xe7"], "n" => [97, "\xe7"], "o" => [99, "\xe7"], "p" => [106, "\xe7"], "q" => [136, "\xe7"], "r" => [139, "\xe7"], "s" => [141, "\xe7"], "t" => [145, "\xe7"], "u" => [147, "\xe7"], "v" => [149, "\xe7"], "w" => [101, "\xe7"], "x" => [112, "\xe7"], "y" => [117, "\xe7"], "z" => [120, "\xe7"], "{" => [124, "\xe7"], "|" => [127, "\xe7"], "}" => [144, "\xe7"], "~" => [152, "\xe7"], "" => [11, "\xe7"], "\x80" => [0, "\xef0"], "\x81" => [0, "\xef1"], "\x82" => [0, "\xef2"], "\x83" => [0, "\xefa"], "\x84" => [0, "\xefc"], "\x85" => [0, "\xefe"], "\x86" => [0, "\xefi"], "\x87" => [0, "\xefo"], "\x88" => [0, "\xefs"], "\x89" => [0, "\xeft"], "\x8a" => [73, "\xef"], "\x8b" => [88, "\xef"], "\x8c" => [89, "\xef"], "\x8d" => [96, "\xef"], "\x8e" => [97, "\xef"], "\x8f" => [99, "\xef"], "\x90" => [106, "\xef"], "\x91" => [136, "\xef"], "\x92" => [139, "\xef"], "\x93" => [141, "\xef"], "\x94" => [145, "\xef"], "\x95" => [147, "\xef"], "\x96" => [149, "\xef"], "\x97" => [101, "\xef"], "\x98" => [112, "\xef"], "\x99" => [117, "\xef"], "\x9a" => [120, "\xef"], "\x9b" => [124, "\xef"], "\x9c" => [127, "\xef"], "\x9d" => [144, "\xef"], "\x9e" => [152, "\xef"], "\x9f" => [11, "\xef"], "\xa0" => [92, "\t"], "\xa1" => [95, "\t"], "\xa2" => [137, "\t"], "\xa3" => [142, "\t"], "\xa4" => [150, "\t"], "\xa5" => [74, "\t"], "\xa6" => [90, "\t"], "\xa7" => [98, "\t"], "\xa8" => [107, "\t"], "\xa9" => [140, "\t"], "\xaa" => [146, "\t"], "\xab" => [102, "\t"], "\xac" => [113, "\t"], "\xad" => [121, "\t"], "\xae" => [128, "\t"], "\xaf" => [12, "\t"], "\xb0" => [92, "\x8e"], "\xb1" => [95, "\x8e"], "\xb2" => [137, "\x8e"], "\xb3" => [142, "\x8e"], "\xb4" => [150, "\x8e"], "\xb5" => [74, "\x8e"], "\xb6" => [90, "\x8e"], "\xb7" => [98, "\x8e"], "\xb8" => [107, "\x8e"], "\xb9" => [140, "\x8e"], "\xba" => [146, "\x8e"], "\xbb" => [102, "\x8e"], "\xbc" => [113, "\x8e"], "\xbd" => [121, "\x8e"], "\xbe" => [128, "\x8e"], "\xbf" => [12, "\x8e"], "\xc0" => [92, "\x90"], "\xc1" => [95, "\x90"], "\xc2" => [137, "\x90"], "\xc3" => [142, "\x90"], "\xc4" => [150, "\x90"], "\xc5" => [74, "\x90"], "\xc6" => [90, "\x90"], "\xc7" => [98, "\x90"], "\xc8" => [107, "\x90"], "\xc9" => [140, "\x90"], "\xca" => [146, "\x90"], "\xcb" => [102, "\x90"], "\xcc" => [113, "\x90"], "\xcd" => [121, "\x90"], "\xce" => [128, "\x90"], "\xcf" => [12, "\x90"], "\xd0" => [92, "\x91"], "\xd1" => [95, "\x91"], "\xd2" => [137, "\x91"], "\xd3" => [142, "\x91"], "\xd4" => [150, "\x91"], "\xd5" => [74, "\x91"], "\xd6" => [90, "\x91"], "\xd7" => [98, "\x91"], "\xd8" => [107, "\x91"], "\xd9" => [140, "\x91"], "\xda" => [146, "\x91"], "\xdb" => [102, "\x91"], "\xdc" => [113, "\x91"], "\xdd" => [121, "\x91"], "\xde" => [128, "\x91"], "\xdf" => [12, "\x91"], "\xe0" => [92, "\x94"], "\xe1" => [95, "\x94"], "\xe2" => [137, "\x94"], "\xe3" => [142, "\x94"], "\xe4" => [150, "\x94"], "\xe5" => [74, "\x94"], "\xe6" => [90, "\x94"], "\xe7" => [98, "\x94"], "\xe8" => [107, "\x94"], "\xe9" => [140, "\x94"], "\xea" => [146, "\x94"], "\xeb" => [102, "\x94"], "\xec" => [113, "\x94"], "\xed" => [121, "\x94"], "\xee" => [128, "\x94"], "\xef" => [12, "\x94"], "\xf0" => [92, "\x9f"], "\xf1" => [95, "\x9f"], "\xf2" => [137, "\x9f"], "\xf3" => [142, "\x9f"], "\xf4" => [150, "\x9f"], "\xf5" => [74, "\x9f"], "\xf6" => [90, "\x9f"], "\xf7" => [98, "\x9f"], "\xf8" => [107, "\x9f"], "\xf9" => [140, "\x9f"], "\xfa" => [146, "\x9f"], "\xfb" => [102, "\x9f"], "\xfc" => [113, "\x9f"], "\xfd" => [121, "\x9f"], "\xfe" => [128, "\x9f"], "\xff" => [12, "\x9f"]], ["\x00" => [92, "\x13"], "\x01" => [95, "\x13"], "\x02" => [137, "\x13"], "\x03" => [142, "\x13"], "\x04" => [150, "\x13"], "\x05" => [74, "\x13"], "\x06" => [90, "\x13"], "\x07" => [98, "\x13"], "\x08" => [107, "\x13"], "\t" => [140, "\x13"], "\n" => [146, "\x13"], "\v" => [102, "\x13"], "\f" => [113, "\x13"], "\r" => [121, "\x13"], "\x0e" => [128, "\x13"], "\x0f" => [12, "\x13"], "\x10" => [92, "\x14"], "\x11" => [95, "\x14"], "\x12" => [137, "\x14"], "\x13" => [142, "\x14"], "\x14" => [150, "\x14"], "\x15" => [74, "\x14"], "\x16" => [90, "\x14"], "\x17" => [98, "\x14"], "\x18" => [107, "\x14"], "\x19" => [140, "\x14"], "\x1a" => [146, "\x14"], "\x1b" => [102, "\x14"], "\x1c" => [113, "\x14"], "\x1d" => [121, "\x14"], "\x1e" => [128, "\x14"], "\x1f" => [12, "\x14"], " " => [92, "\x15"], "!" => [95, "\x15"], "\"" => [137, "\x15"], "#" => [142, "\x15"], "\$" => [150, "\x15"], "%" => [74, "\x15"], "&" => [90, "\x15"], "'" => [98, "\x15"], "(" => [107, "\x15"], ")" => [140, "\x15"], "*" => [146, "\x15"], "+" => [102, "\x15"], "," => [113, "\x15"], "-" => [121, "\x15"], "." => [128, "\x15"], "/" => [12, "\x15"], [92, "\x17"], [95, "\x17"], [137, "\x17"], [142, "\x17"], [150, "\x17"], [74, "\x17"], [90, "\x17"], [98, "\x17"], [107, "\x17"], [140, "\x17"], ":" => [146, "\x17"], ";" => [102, "\x17"], "<" => [113, "\x17"], "=" => [121, "\x17"], ">" => [128, "\x17"], "?" => [12, "\x17"], "@" => [92, "\x18"], "A" => [95, "\x18"], "B" => [137, "\x18"], "C" => [142, "\x18"], "D" => [150, "\x18"], "E" => [74, "\x18"], "F" => [90, "\x18"], "G" => [98, "\x18"], "H" => [107, "\x18"], "I" => [140, "\x18"], "J" => [146, "\x18"], "K" => [102, "\x18"], "L" => [113, "\x18"], "M" => [121, "\x18"], "N" => [128, "\x18"], "O" => [12, "\x18"], "P" => [92, "\x19"], "Q" => [95, "\x19"], "R" => [137, "\x19"], "S" => [142, "\x19"], "T" => [150, "\x19"], "U" => [74, "\x19"], "V" => [90, "\x19"], "W" => [98, "\x19"], "X" => [107, "\x19"], "Y" => [140, "\x19"], "Z" => [146, "\x19"], "[" => [102, "\x19"], "\\" => [113, "\x19"], "]" => [121, "\x19"], "^" => [128, "\x19"], "_" => [12, "\x19"], "`" => [92, "\x1a"], "a" => [95, "\x1a"], "b" => [137, "\x1a"], "c" => [142, "\x1a"], "d" => [150, "\x1a"], "e" => [74, "\x1a"], "f" => [90, "\x1a"], "g" => [98, "\x1a"], "h" => [107, "\x1a"], "i" => [140, "\x1a"], "j" => [146, "\x1a"], "k" => [102, "\x1a"], "l" => [113, "\x1a"], "m" => [121, "\x1a"], "n" => [128, "\x1a"], "o" => [12, "\x1a"], "p" => [92, "\x1b"], "q" => [95, "\x1b"], "r" => [137, "\x1b"], "s" => [142, "\x1b"], "t" => [150, "\x1b"], "u" => [74, "\x1b"], "v" => [90, "\x1b"], "w" => [98, "\x1b"], "x" => [107, "\x1b"], "y" => [140, "\x1b"], "z" => [146, "\x1b"], "{" => [102, "\x1b"], "|" => [113, "\x1b"], "}" => [121, "\x1b"], "~" => [128, "\x1b"], "" => [12, "\x1b"], "\x80" => [92, "\x1c"], "\x81" => [95, "\x1c"], "\x82" => [137, "\x1c"], "\x83" => [142, "\x1c"], "\x84" => [150, "\x1c"], "\x85" => [74, "\x1c"], "\x86" => [90, "\x1c"], "\x87" => [98, "\x1c"], "\x88" => [107, "\x1c"], "\x89" => [140, "\x1c"], "\x8a" => [146, "\x1c"], "\x8b" => [102, "\x1c"], "\x8c" => [113, "\x1c"], "\x8d" => [121, "\x1c"], "\x8e" => [128, "\x1c"], "\x8f" => [12, "\x1c"], "\x90" => [92, "\x1d"], "\x91" => [95, "\x1d"], "\x92" => [137, "\x1d"], "\x93" => [142, "\x1d"], "\x94" => [150, "\x1d"], "\x95" => [74, "\x1d"], "\x96" => [90, "\x1d"], "\x97" => [98, "\x1d"], "\x98" => [107, "\x1d"], "\x99" => [140, "\x1d"], "\x9a" => [146, "\x1d"], "\x9b" => [102, "\x1d"], "\x9c" => [113, "\x1d"], "\x9d" => [121, "\x1d"], "\x9e" => [128, "\x1d"], "\x9f" => [12, "\x1d"], "\xa0" => [92, "\x1e"], "\xa1" => [95, "\x1e"], "\xa2" => [137, "\x1e"], "\xa3" => [142, "\x1e"], "\xa4" => [150, "\x1e"], "\xa5" => [74, "\x1e"], "\xa6" => [90, "\x1e"], "\xa7" => [98, "\x1e"], "\xa8" => [107, "\x1e"], "\xa9" => [140, "\x1e"], "\xaa" => [146, "\x1e"], "\xab" => [102, "\x1e"], "\xac" => [113, "\x1e"], "\xad" => [121, "\x1e"], "\xae" => [128, "\x1e"], "\xaf" => [12, "\x1e"], "\xb0" => [92, "\x1f"], "\xb1" => [95, "\x1f"], "\xb2" => [137, "\x1f"], "\xb3" => [142, "\x1f"], "\xb4" => [150, "\x1f"], "\xb5" => [74, "\x1f"], "\xb6" => [90, "\x1f"], "\xb7" => [98, "\x1f"], "\xb8" => [107, "\x1f"], "\xb9" => [140, "\x1f"], "\xba" => [146, "\x1f"], "\xbb" => [102, "\x1f"], "\xbc" => [113, "\x1f"], "\xbd" => [121, "\x1f"], "\xbe" => [128, "\x1f"], "\xbf" => [12, "\x1f"], "\xc0" => [92, ""], "\xc1" => [95, ""], "\xc2" => [137, ""], "\xc3" => [142, ""], "\xc4" => [150, ""], "\xc5" => [74, ""], "\xc6" => [90, ""], "\xc7" => [98, ""], "\xc8" => [107, ""], "\xc9" => [140, ""], "\xca" => [146, ""], "\xcb" => [102, ""], "\xcc" => [113, ""], "\xcd" => [121, ""], "\xce" => [128, ""], "\xcf" => [12, ""], "\xd0" => [92, "\xdc"], "\xd1" => [95, "\xdc"], "\xd2" => [137, "\xdc"], "\xd3" => [142, "\xdc"], "\xd4" => [150, "\xdc"], "\xd5" => [74, "\xdc"], "\xd6" => [90, "\xdc"], "\xd7" => [98, "\xdc"], "\xd8" => [107, "\xdc"], "\xd9" => [140, "\xdc"], "\xda" => [146, "\xdc"], "\xdb" => [102, "\xdc"], "\xdc" => [113, "\xdc"], "\xdd" => [121, "\xdc"], "\xde" => [128, "\xdc"], "\xdf" => [12, "\xdc"], "\xe0" => [92, "\xf9"], "\xe1" => [95, "\xf9"], "\xe2" => [137, "\xf9"], "\xe3" => [142, "\xf9"], "\xe4" => [150, "\xf9"], "\xe5" => [74, "\xf9"], "\xe6" => [90, "\xf9"], "\xe7" => [98, "\xf9"], "\xe8" => [107, "\xf9"], "\xe9" => [140, "\xf9"], "\xea" => [146, "\xf9"], "\xeb" => [102, "\xf9"], "\xec" => [113, "\xf9"], "\xed" => [121, "\xf9"], "\xee" => [128, "\xf9"], "\xef" => [12, "\xf9"], "\xf0" => [94, "\n"], "\xf1" => [76, "\n"], "\xf2" => [104, "\n"], "\xf3" => [16, "\n"], "\xf4" => [94, "\r"], "\xf5" => [76, "\r"], "\xf6" => [104, "\r"], "\xf7" => [16, "\r"], "\xf8" => [94, "\x16"], "\xf9" => [76, "\x16"], "\xfa" => [104, "\x16"], "\xfb" => [16, "\x16"], "\xfc" => [94, ""], "\xfd" => [76, ""], "\xfe" => [104, ""], "\xff" => [16, ""]], ["\x00" => [94, "\n0"], "\x01" => [76, "\n0"], "\x02" => [104, "\n0"], "\x03" => [16, "\n0"], "\x04" => [94, "\n1"], "\x05" => [76, "\n1"], "\x06" => [104, "\n1"], "\x07" => [16, "\n1"], "\x08" => [94, "\n2"], "\t" => [76, "\n2"], "\n" => [104, "\n2"], "\v" => [16, "\n2"], "\f" => [94, "\na"], "\r" => [76, "\na"], "\x0e" => [104, "\na"], "\x0f" => [16, "\na"], "\x10" => [94, "\nc"], "\x11" => [76, "\nc"], "\x12" => [104, "\nc"], "\x13" => [16, "\nc"], "\x14" => [94, "\ne"], "\x15" => [76, "\ne"], "\x16" => [104, "\ne"], "\x17" => [16, "\ne"], "\x18" => [94, "\ni"], "\x19" => [76, "\ni"], "\x1a" => [104, "\ni"], "\x1b" => [16, "\ni"], "\x1c" => [94, "\no"], "\x1d" => [76, "\no"], "\x1e" => [104, "\no"], "\x1f" => [16, "\no"], " " => [94, "\ns"], "!" => [76, "\ns"], "\"" => [104, "\ns"], "#" => [16, "\ns"], "\$" => [94, "\nt"], "%" => [76, "\nt"], "&" => [104, "\nt"], "'" => [16, "\nt"], "(" => [77, "\n "], ")" => [18, "\n "], "*" => [77, "\n%"], "+" => [18, "\n%"], "," => [77, "\n-"], "-" => [18, "\n-"], "." => [77, "\n."], "/" => [18, "\n."], [77, "\n/"], [18, "\n/"], [77, "\n3"], [18, "\n3"], [77, "\n4"], [18, "\n4"], [77, "\n5"], [18, "\n5"], [77, "\n6"], [18, "\n6"], ":" => [77, "\n7"], ";" => [18, "\n7"], "<" => [77, "\n8"], "=" => [18, "\n8"], ">" => [77, "\n9"], "?" => [18, "\n9"], "@" => [77, "\n="], "A" => [18, "\n="], "B" => [77, "\nA"], "C" => [18, "\nA"], "D" => [77, "\n_"], "E" => [18, "\n_"], "F" => [77, "\nb"], "G" => [18, "\nb"], "H" => [77, "\nd"], "I" => [18, "\nd"], "J" => [77, "\nf"], "K" => [18, "\nf"], "L" => [77, "\ng"], "M" => [18, "\ng"], "N" => [77, "\nh"], "O" => [18, "\nh"], "P" => [77, "\nl"], "Q" => [18, "\nl"], "R" => [77, "\nm"], "S" => [18, "\nm"], "T" => [77, "\nn"], "U" => [18, "\nn"], "V" => [77, "\np"], "W" => [18, "\np"], "X" => [77, "\nr"], "Y" => [18, "\nr"], "Z" => [77, "\nu"], "[" => [18, "\nu"], "\\" => [0, "\n:"], "]" => [0, "\nB"], "^" => [0, "\nC"], "_" => [0, "\nD"], "`" => [0, "\nE"], "a" => [0, "\nF"], "b" => [0, "\nG"], "c" => [0, "\nH"], "d" => [0, "\nI"], "e" => [0, "\nJ"], "f" => [0, "\nK"], "g" => [0, "\nL"], "h" => [0, "\nM"], "i" => [0, "\nN"], "j" => [0, "\nO"], "k" => [0, "\nP"], "l" => [0, "\nQ"], "m" => [0, "\nR"], "n" => [0, "\nS"], "o" => [0, "\nT"], "p" => [0, "\nU"], "q" => [0, "\nV"], "r" => [0, "\nW"], "s" => [0, "\nY"], "t" => [0, "\nj"], "u" => [0, "\nk"], "v" => [0, "\nq"], "w" => [0, "\nv"], "x" => [0, "\nw"], "y" => [0, "\nx"], "z" => [0, "\ny"], "{" => [0, "\nz"], "|" => [82, "\n"], "}" => [87, "\n"], "~" => [130, "\n"], "" => [9, "\n"], "\x80" => [94, "\r0"], "\x81" => [76, "\r0"], "\x82" => [104, "\r0"], "\x83" => [16, "\r0"], "\x84" => [94, "\r1"], "\x85" => [76, "\r1"], "\x86" => [104, "\r1"], "\x87" => [16, "\r1"], "\x88" => [94, "\r2"], "\x89" => [76, "\r2"], "\x8a" => [104, "\r2"], "\x8b" => [16, "\r2"], "\x8c" => [94, "\ra"], "\x8d" => [76, "\ra"], "\x8e" => [104, "\ra"], "\x8f" => [16, "\ra"], "\x90" => [94, "\rc"], "\x91" => [76, "\rc"], "\x92" => [104, "\rc"], "\x93" => [16, "\rc"], "\x94" => [94, "\re"], "\x95" => [76, "\re"], "\x96" => [104, "\re"], "\x97" => [16, "\re"], "\x98" => [94, "\ri"], "\x99" => [76, "\ri"], "\x9a" => [104, "\ri"], "\x9b" => [16, "\ri"], "\x9c" => [94, "\ro"], "\x9d" => [76, "\ro"], "\x9e" => [104, "\ro"], "\x9f" => [16, "\ro"], "\xa0" => [94, "\rs"], "\xa1" => [76, "\rs"], "\xa2" => [104, "\rs"], "\xa3" => [16, "\rs"], "\xa4" => [94, "\rt"], "\xa5" => [76, "\rt"], "\xa6" => [104, "\rt"], "\xa7" => [16, "\rt"], "\xa8" => [77, "\r "], "\xa9" => [18, "\r "], "\xaa" => [77, "\r%"], "\xab" => [18, "\r%"], "\xac" => [77, "\r-"], "\xad" => [18, "\r-"], "\xae" => [77, "\r."], "\xaf" => [18, "\r."], "\xb0" => [77, "\r/"], "\xb1" => [18, "\r/"], "\xb2" => [77, "\r3"], "\xb3" => [18, "\r3"], "\xb4" => [77, "\r4"], "\xb5" => [18, "\r4"], "\xb6" => [77, "\r5"], "\xb7" => [18, "\r5"], "\xb8" => [77, "\r6"], "\xb9" => [18, "\r6"], "\xba" => [77, "\r7"], "\xbb" => [18, "\r7"], "\xbc" => [77, "\r8"], "\xbd" => [18, "\r8"], "\xbe" => [77, "\r9"], "\xbf" => [18, "\r9"], "\xc0" => [77, "\r="], "\xc1" => [18, "\r="], "\xc2" => [77, "\rA"], "\xc3" => [18, "\rA"], "\xc4" => [77, "\r_"], "\xc5" => [18, "\r_"], "\xc6" => [77, "\rb"], "\xc7" => [18, "\rb"], "\xc8" => [77, "\rd"], "\xc9" => [18, "\rd"], "\xca" => [77, "\rf"], "\xcb" => [18, "\rf"], "\xcc" => [77, "\rg"], "\xcd" => [18, "\rg"], "\xce" => [77, "\rh"], "\xcf" => [18, "\rh"], "\xd0" => [77, "\rl"], "\xd1" => [18, "\rl"], "\xd2" => [77, "\rm"], "\xd3" => [18, "\rm"], "\xd4" => [77, "\rn"], "\xd5" => [18, "\rn"], "\xd6" => [77, "\rp"], "\xd7" => [18, "\rp"], "\xd8" => [77, "\rr"], "\xd9" => [18, "\rr"], "\xda" => [77, "\ru"], "\xdb" => [18, "\ru"], "\xdc" => [0, "\r:"], "\xdd" => [0, "\rB"], "\xde" => [0, "\rC"], "\xdf" => [0, "\rD"], "\xe0" => [0, "\rE"], "\xe1" => [0, "\rF"], "\xe2" => [0, "\rG"], "\xe3" => [0, "\rH"], "\xe4" => [0, "\rI"], "\xe5" => [0, "\rJ"], "\xe6" => [0, "\rK"], "\xe7" => [0, "\rL"], "\xe8" => [0, "\rM"], "\xe9" => [0, "\rN"], "\xea" => [0, "\rO"], "\xeb" => [0, "\rP"], "\xec" => [0, "\rQ"], "\xed" => [0, "\rR"], "\xee" => [0, "\rS"], "\xef" => [0, "\rT"], "\xf0" => [0, "\rU"], "\xf1" => [0, "\rV"], "\xf2" => [0, "\rW"], "\xf3" => [0, "\rY"], "\xf4" => [0, "\rj"], "\xf5" => [0, "\rk"], "\xf6" => [0, "\rq"], "\xf7" => [0, "\rv"], "\xf8" => [0, "\rw"], "\xf9" => [0, "\rx"], "\xfa" => [0, "\ry"], "\xfb" => [0, "\rz"], "\xfc" => [82, "\r"], "\xfd" => [87, "\r"], "\xfe" => [130, "\r"], "\xff" => [9, "\r"]], ["\x00" => [77, "\n0"], "\x01" => [18, "\n0"], "\x02" => [77, "\n1"], "\x03" => [18, "\n1"], "\x04" => [77, "\n2"], "\x05" => [18, "\n2"], "\x06" => [77, "\na"], "\x07" => [18, "\na"], "\x08" => [77, "\nc"], "\t" => [18, "\nc"], "\n" => [77, "\ne"], "\v" => [18, "\ne"], "\f" => [77, "\ni"], "\r" => [18, "\ni"], "\x0e" => [77, "\no"], "\x0f" => [18, "\no"], "\x10" => [77, "\ns"], "\x11" => [18, "\ns"], "\x12" => [77, "\nt"], "\x13" => [18, "\nt"], "\x14" => [0, "\n "], "\x15" => [0, "\n%"], "\x16" => [0, "\n-"], "\x17" => [0, "\n."], "\x18" => [0, "\n/"], "\x19" => [0, "\n3"], "\x1a" => [0, "\n4"], "\x1b" => [0, "\n5"], "\x1c" => [0, "\n6"], "\x1d" => [0, "\n7"], "\x1e" => [0, "\n8"], "\x1f" => [0, "\n9"], " " => [0, "\n="], "!" => [0, "\nA"], "\"" => [0, "\n_"], "#" => [0, "\nb"], "\$" => [0, "\nd"], "%" => [0, "\nf"], "&" => [0, "\ng"], "'" => [0, "\nh"], "(" => [0, "\nl"], ")" => [0, "\nm"], "*" => [0, "\nn"], "+" => [0, "\np"], "," => [0, "\nr"], "-" => [0, "\nu"], "." => [100, "\n"], "/" => [110, "\n"], [111, "\n"], [115, "\n"], [116, "\n"], [118, "\n"], [119, "\n"], [122, "\n"], [123, "\n"], [125, "\n"], [126, "\n"], [129, "\n"], ":" => [143, "\n"], ";" => [148, "\n"], "<" => [151, "\n"], "=" => [153, "\n"], ">" => [83, "\n"], "?" => [10, "\n"], "@" => [77, "\r0"], "A" => [18, "\r0"], "B" => [77, "\r1"], "C" => [18, "\r1"], "D" => [77, "\r2"], "E" => [18, "\r2"], "F" => [77, "\ra"], "G" => [18, "\ra"], "H" => [77, "\rc"], "I" => [18, "\rc"], "J" => [77, "\re"], "K" => [18, "\re"], "L" => [77, "\ri"], "M" => [18, "\ri"], "N" => [77, "\ro"], "O" => [18, "\ro"], "P" => [77, "\rs"], "Q" => [18, "\rs"], "R" => [77, "\rt"], "S" => [18, "\rt"], "T" => [0, "\r "], "U" => [0, "\r%"], "V" => [0, "\r-"], "W" => [0, "\r."], "X" => [0, "\r/"], "Y" => [0, "\r3"], "Z" => [0, "\r4"], "[" => [0, "\r5"], "\\" => [0, "\r6"], "]" => [0, "\r7"], "^" => [0, "\r8"], "_" => [0, "\r9"], "`" => [0, "\r="], "a" => [0, "\rA"], "b" => [0, "\r_"], "c" => [0, "\rb"], "d" => [0, "\rd"], "e" => [0, "\rf"], "f" => [0, "\rg"], "g" => [0, "\rh"], "h" => [0, "\rl"], "i" => [0, "\rm"], "j" => [0, "\rn"], "k" => [0, "\rp"], "l" => [0, "\rr"], "m" => [0, "\ru"], "n" => [100, "\r"], "o" => [110, "\r"], "p" => [111, "\r"], "q" => [115, "\r"], "r" => [116, "\r"], "s" => [118, "\r"], "t" => [119, "\r"], "u" => [122, "\r"], "v" => [123, "\r"], "w" => [125, "\r"], "x" => [126, "\r"], "y" => [129, "\r"], "z" => [143, "\r"], "{" => [148, "\r"], "|" => [151, "\r"], "}" => [153, "\r"], "~" => [83, "\r"], "" => [10, "\r"], "\x80" => [77, "\x160"], "\x81" => [18, "\x160"], "\x82" => [77, "\x161"], "\x83" => [18, "\x161"], "\x84" => [77, "\x162"], "\x85" => [18, "\x162"], "\x86" => [77, "\x16a"], "\x87" => [18, "\x16a"], "\x88" => [77, "\x16c"], "\x89" => [18, "\x16c"], "\x8a" => [77, "\x16e"], "\x8b" => [18, "\x16e"], "\x8c" => [77, "\x16i"], "\x8d" => [18, "\x16i"], "\x8e" => [77, "\x16o"], "\x8f" => [18, "\x16o"], "\x90" => [77, "\x16s"], "\x91" => [18, "\x16s"], "\x92" => [77, "\x16t"], "\x93" => [18, "\x16t"], "\x94" => [0, "\x16 "], "\x95" => [0, "\x16%"], "\x96" => [0, "\x16-"], "\x97" => [0, "\x16."], "\x98" => [0, "\x16/"], "\x99" => [0, "\x163"], "\x9a" => [0, "\x164"], "\x9b" => [0, "\x165"], "\x9c" => [0, "\x166"], "\x9d" => [0, "\x167"], "\x9e" => [0, "\x168"], "\x9f" => [0, "\x169"], "\xa0" => [0, "\x16="], "\xa1" => [0, "\x16A"], "\xa2" => [0, "\x16_"], "\xa3" => [0, "\x16b"], "\xa4" => [0, "\x16d"], "\xa5" => [0, "\x16f"], "\xa6" => [0, "\x16g"], "\xa7" => [0, "\x16h"], "\xa8" => [0, "\x16l"], "\xa9" => [0, "\x16m"], "\xaa" => [0, "\x16n"], "\xab" => [0, "\x16p"], "\xac" => [0, "\x16r"], "\xad" => [0, "\x16u"], "\xae" => [100, "\x16"], "\xaf" => [110, "\x16"], "\xb0" => [111, "\x16"], "\xb1" => [115, "\x16"], "\xb2" => [116, "\x16"], "\xb3" => [118, "\x16"], "\xb4" => [119, "\x16"], "\xb5" => [122, "\x16"], "\xb6" => [123, "\x16"], "\xb7" => [125, "\x16"], "\xb8" => [126, "\x16"], "\xb9" => [129, "\x16"], "\xba" => [143, "\x16"], "\xbb" => [148, "\x16"], "\xbc" => [151, "\x16"], "\xbd" => [153, "\x16"], "\xbe" => [83, "\x16"], "\xbf" => [10, "\x16"], "\xc0" => [77, ""], "\xc1" => [18, ""], "\xc2" => [77, ""], "\xc3" => [18, ""], "\xc4" => [77, ""], "\xc5" => [18, ""], "\xc6" => [77, ""], "\xc7" => [18, ""], "\xc8" => [77, ""], "\xc9" => [18, ""], "\xca" => [77, ""], "\xcb" => [18, ""], "\xcc" => [77, ""], "\xcd" => [18, ""], "\xce" => [77, ""], "\xcf" => [18, ""], "\xd0" => [77, ""], "\xd1" => [18, ""], "\xd2" => [77, ""], "\xd3" => [18, ""], "\xd4" => [0, ""], "\xd5" => [0, ""], "\xd6" => [0, ""], "\xd7" => [0, ""], "\xd8" => [0, ""], "\xd9" => [0, ""], "\xda" => [0, ""], "\xdb" => [0, ""], "\xdc" => [0, ""], "\xdd" => [0, ""], "\xde" => [0, ""], "\xdf" => [0, ""], "\xe0" => [0, ""], "\xe1" => [0, ""], "\xe2" => [0, ""], "\xe3" => [0, ""], "\xe4" => [0, ""], "\xe5" => [0, ""], "\xe6" => [0, ""], "\xe7" => [0, ""], "\xe8" => [0, ""], "\xe9" => [0, ""], "\xea" => [0, ""], "\xeb" => [0, ""], "\xec" => [0, ""], "\xed" => [0, ""], "\xee" => [100, ""], "\xef" => [110, ""], "\xf0" => [111, ""], "\xf1" => [115, ""], "\xf2" => [116, ""], "\xf3" => [118, ""], "\xf4" => [119, ""], "\xf5" => [122, ""], "\xf6" => [123, ""], "\xf7" => [125, ""], "\xf8" => [126, ""], "\xf9" => [129, ""], "\xfa" => [143, ""], "\xfb" => [148, ""], "\xfc" => [151, ""], "\xfd" => [153, ""], "\xfe" => [83, ""], "\xff" => [10, ""]], ["\x00" => [94, "\xf90"], "\x01" => [76, "\xf90"], "\x02" => [104, "\xf90"], "\x03" => [16, "\xf90"], "\x04" => [94, "\xf91"], "\x05" => [76, "\xf91"], "\x06" => [104, "\xf91"], "\x07" => [16, "\xf91"], "\x08" => [94, "\xf92"], "\t" => [76, "\xf92"], "\n" => [104, "\xf92"], "\v" => [16, "\xf92"], "\f" => [94, "\xf9a"], "\r" => [76, "\xf9a"], "\x0e" => [104, "\xf9a"], "\x0f" => [16, "\xf9a"], "\x10" => [94, "\xf9c"], "\x11" => [76, "\xf9c"], "\x12" => [104, "\xf9c"], "\x13" => [16, "\xf9c"], "\x14" => [94, "\xf9e"], "\x15" => [76, "\xf9e"], "\x16" => [104, "\xf9e"], "\x17" => [16, "\xf9e"], "\x18" => [94, "\xf9i"], "\x19" => [76, "\xf9i"], "\x1a" => [104, "\xf9i"], "\x1b" => [16, "\xf9i"], "\x1c" => [94, "\xf9o"], "\x1d" => [76, "\xf9o"], "\x1e" => [104, "\xf9o"], "\x1f" => [16, "\xf9o"], " " => [94, "\xf9s"], "!" => [76, "\xf9s"], "\"" => [104, "\xf9s"], "#" => [16, "\xf9s"], "\$" => [94, "\xf9t"], "%" => [76, "\xf9t"], "&" => [104, "\xf9t"], "'" => [16, "\xf9t"], "(" => [77, "\xf9 "], ")" => [18, "\xf9 "], "*" => [77, "\xf9%"], "+" => [18, "\xf9%"], "," => [77, "\xf9-"], "-" => [18, "\xf9-"], "." => [77, "\xf9."], "/" => [18, "\xf9."], [77, "\xf9/"], [18, "\xf9/"], [77, "\xf93"], [18, "\xf93"], [77, "\xf94"], [18, "\xf94"], [77, "\xf95"], [18, "\xf95"], [77, "\xf96"], [18, "\xf96"], ":" => [77, "\xf97"], ";" => [18, "\xf97"], "<" => [77, "\xf98"], "=" => [18, "\xf98"], ">" => [77, "\xf99"], "?" => [18, "\xf99"], "@" => [77, "\xf9="], "A" => [18, "\xf9="], "B" => [77, "\xf9A"], "C" => [18, "\xf9A"], "D" => [77, "\xf9_"], "E" => [18, "\xf9_"], "F" => [77, "\xf9b"], "G" => [18, "\xf9b"], "H" => [77, "\xf9d"], "I" => [18, "\xf9d"], "J" => [77, "\xf9f"], "K" => [18, "\xf9f"], "L" => [77, "\xf9g"], "M" => [18, "\xf9g"], "N" => [77, "\xf9h"], "O" => [18, "\xf9h"], "P" => [77, "\xf9l"], "Q" => [18, "\xf9l"], "R" => [77, "\xf9m"], "S" => [18, "\xf9m"], "T" => [77, "\xf9n"], "U" => [18, "\xf9n"], "V" => [77, "\xf9p"], "W" => [18, "\xf9p"], "X" => [77, "\xf9r"], "Y" => [18, "\xf9r"], "Z" => [77, "\xf9u"], "[" => [18, "\xf9u"], "\\" => [0, "\xf9:"], "]" => [0, "\xf9B"], "^" => [0, "\xf9C"], "_" => [0, "\xf9D"], "`" => [0, "\xf9E"], "a" => [0, "\xf9F"], "b" => [0, "\xf9G"], "c" => [0, "\xf9H"], "d" => [0, "\xf9I"], "e" => [0, "\xf9J"], "f" => [0, "\xf9K"], "g" => [0, "\xf9L"], "h" => [0, "\xf9M"], "i" => [0, "\xf9N"], "j" => [0, "\xf9O"], "k" => [0, "\xf9P"], "l" => [0, "\xf9Q"], "m" => [0, "\xf9R"], "n" => [0, "\xf9S"], "o" => [0, "\xf9T"], "p" => [0, "\xf9U"], "q" => [0, "\xf9V"], "r" => [0, "\xf9W"], "s" => [0, "\xf9Y"], "t" => [0, "\xf9j"], "u" => [0, "\xf9k"], "v" => [0, "\xf9q"], "w" => [0, "\xf9v"], "x" => [0, "\xf9w"], "y" => [0, "\xf9x"], "z" => [0, "\xf9y"], "{" => [0, "\xf9z"], "|" => [82, "\xf9"], "}" => [87, "\xf9"], "~" => [130, "\xf9"], "" => [9, "\xf9"], "\x80" => [0, "\n0"], "\x81" => [0, "\n1"], "\x82" => [0, "\n2"], "\x83" => [0, "\na"], "\x84" => [0, "\nc"], "\x85" => [0, "\ne"], "\x86" => [0, "\ni"], "\x87" => [0, "\no"], "\x88" => [0, "\ns"], "\x89" => [0, "\nt"], "\x8a" => [73, "\n"], "\x8b" => [88, "\n"], "\x8c" => [89, "\n"], "\x8d" => [96, "\n"], "\x8e" => [97, "\n"], "\x8f" => [99, "\n"], "\x90" => [106, "\n"], "\x91" => [136, "\n"], "\x92" => [139, "\n"], "\x93" => [141, "\n"], "\x94" => [145, "\n"], "\x95" => [147, "\n"], "\x96" => [149, "\n"], "\x97" => [101, "\n"], "\x98" => [112, "\n"], "\x99" => [117, "\n"], "\x9a" => [120, "\n"], "\x9b" => [124, "\n"], "\x9c" => [127, "\n"], "\x9d" => [144, "\n"], "\x9e" => [152, "\n"], "\x9f" => [11, "\n"], "\xa0" => [0, "\r0"], "\xa1" => [0, "\r1"], "\xa2" => [0, "\r2"], "\xa3" => [0, "\ra"], "\xa4" => [0, "\rc"], "\xa5" => [0, "\re"], "\xa6" => [0, "\ri"], "\xa7" => [0, "\ro"], "\xa8" => [0, "\rs"], "\xa9" => [0, "\rt"], "\xaa" => [73, "\r"], "\xab" => [88, "\r"], "\xac" => [89, "\r"], "\xad" => [96, "\r"], "\xae" => [97, "\r"], "\xaf" => [99, "\r"], "\xb0" => [106, "\r"], "\xb1" => [136, "\r"], "\xb2" => [139, "\r"], "\xb3" => [141, "\r"], "\xb4" => [145, "\r"], "\xb5" => [147, "\r"], "\xb6" => [149, "\r"], "\xb7" => [101, "\r"], "\xb8" => [112, "\r"], "\xb9" => [117, "\r"], "\xba" => [120, "\r"], "\xbb" => [124, "\r"], "\xbc" => [127, "\r"], "\xbd" => [144, "\r"], "\xbe" => [152, "\r"], "\xbf" => [11, "\r"], "\xc0" => [0, "\x160"], "\xc1" => [0, "\x161"], "\xc2" => [0, "\x162"], "\xc3" => [0, "\x16a"], "\xc4" => [0, "\x16c"], "\xc5" => [0, "\x16e"], "\xc6" => [0, "\x16i"], "\xc7" => [0, "\x16o"], "\xc8" => [0, "\x16s"], "\xc9" => [0, "\x16t"], "\xca" => [73, "\x16"], "\xcb" => [88, "\x16"], "\xcc" => [89, "\x16"], "\xcd" => [96, "\x16"], "\xce" => [97, "\x16"], "\xcf" => [99, "\x16"], "\xd0" => [106, "\x16"], "\xd1" => [136, "\x16"], "\xd2" => [139, "\x16"], "\xd3" => [141, "\x16"], "\xd4" => [145, "\x16"], "\xd5" => [147, "\x16"], "\xd6" => [149, "\x16"], "\xd7" => [101, "\x16"], "\xd8" => [112, "\x16"], "\xd9" => [117, "\x16"], "\xda" => [120, "\x16"], "\xdb" => [124, "\x16"], "\xdc" => [127, "\x16"], "\xdd" => [144, "\x16"], "\xde" => [152, "\x16"], "\xdf" => [11, "\x16"], "\xe0" => [0, ""], "\xe1" => [0, ""], "\xe2" => [0, ""], "\xe3" => [0, ""], "\xe4" => [0, ""], "\xe5" => [0, ""], "\xe6" => [0, ""], "\xe7" => [0, ""], "\xe8" => [0, ""], "\xe9" => [0, ""], "\xea" => [73, ""], "\xeb" => [88, ""], "\xec" => [89, ""], "\xed" => [96, ""], "\xee" => [97, ""], "\xef" => [99, ""], "\xf0" => [106, ""], "\xf1" => [136, ""], "\xf2" => [139, ""], "\xf3" => [141, ""], "\xf4" => [145, ""], "\xf5" => [147, ""], "\xf6" => [149, ""], "\xf7" => [101, ""], "\xf8" => [112, ""], "\xf9" => [117, ""], "\xfa" => [120, ""], "\xfb" => [124, ""], "\xfc" => [127, ""], "\xfd" => [144, ""], "\xfe" => [152, ""], "\xff" => [11, ""]], ["\x00" => [77, "0"], "\x01" => [18, "0"], "\x02" => [77, "1"], "\x03" => [18, "1"], "\x04" => [77, "2"], "\x05" => [18, "2"], "\x06" => [77, "a"], "\x07" => [18, "a"], "\x08" => [77, "c"], "\t" => [18, "c"], "\n" => [77, "e"], "\v" => [18, "e"], "\f" => [77, "i"], "\r" => [18, "i"], "\x0e" => [77, "o"], "\x0f" => [18, "o"], "\x10" => [77, "s"], "\x11" => [18, "s"], "\x12" => [77, "t"], "\x13" => [18, "t"], "\x14" => [0, " "], "\x15" => [0, "%"], "\x16" => [0, "-"], "\x17" => [0, "."], "\x18" => [0, "/"], "\x19" => [0, "3"], "\x1a" => [0, "4"], "\x1b" => [0, "5"], "\x1c" => [0, "6"], "\x1d" => [0, "7"], "\x1e" => [0, "8"], "\x1f" => [0, "9"], " " => [0, "="], "!" => [0, "A"], "\"" => [0, "_"], "#" => [0, "b"], "\$" => [0, "d"], "%" => [0, "f"], "&" => [0, "g"], "'" => [0, "h"], "(" => [0, "l"], ")" => [0, "m"], "*" => [0, "n"], "+" => [0, "p"], "," => [0, "r"], "-" => [0, "u"], "." => [100, ""], "/" => [110, ""], [111, ""], [115, ""], [116, ""], [118, ""], [119, ""], [122, ""], [123, ""], [125, ""], [126, ""], [129, ""], ":" => [143, ""], ";" => [148, ""], "<" => [151, ""], "=" => [153, ""], ">" => [83, ""], "?" => [10, ""], "@" => [77, "\xdc0"], "A" => [18, "\xdc0"], "B" => [77, "\xdc1"], "C" => [18, "\xdc1"], "D" => [77, "\xdc2"], "E" => [18, "\xdc2"], "F" => [77, "\xdca"], "G" => [18, "\xdca"], "H" => [77, "\xdcc"], "I" => [18, "\xdcc"], "J" => [77, "\xdce"], "K" => [18, "\xdce"], "L" => [77, "\xdci"], "M" => [18, "\xdci"], "N" => [77, "\xdco"], "O" => [18, "\xdco"], "P" => [77, "\xdcs"], "Q" => [18, "\xdcs"], "R" => [77, "\xdct"], "S" => [18, "\xdct"], "T" => [0, "\xdc "], "U" => [0, "\xdc%"], "V" => [0, "\xdc-"], "W" => [0, "\xdc."], "X" => [0, "\xdc/"], "Y" => [0, "\xdc3"], "Z" => [0, "\xdc4"], "[" => [0, "\xdc5"], "\\" => [0, "\xdc6"], "]" => [0, "\xdc7"], "^" => [0, "\xdc8"], "_" => [0, "\xdc9"], "`" => [0, "\xdc="], "a" => [0, "\xdcA"], "b" => [0, "\xdc_"], "c" => [0, "\xdcb"], "d" => [0, "\xdcd"], "e" => [0, "\xdcf"], "f" => [0, "\xdcg"], "g" => [0, "\xdch"], "h" => [0, "\xdcl"], "i" => [0, "\xdcm"], "j" => [0, "\xdcn"], "k" => [0, "\xdcp"], "l" => [0, "\xdcr"], "m" => [0, "\xdcu"], "n" => [100, "\xdc"], "o" => [110, "\xdc"], "p" => [111, "\xdc"], "q" => [115, "\xdc"], "r" => [116, "\xdc"], "s" => [118, "\xdc"], "t" => [119, "\xdc"], "u" => [122, "\xdc"], "v" => [123, "\xdc"], "w" => [125, "\xdc"], "x" => [126, "\xdc"], "y" => [129, "\xdc"], "z" => [143, "\xdc"], "{" => [148, "\xdc"], "|" => [151, "\xdc"], "}" => [153, "\xdc"], "~" => [83, "\xdc"], "" => [10, "\xdc"], "\x80" => [77, "\xf90"], "\x81" => [18, "\xf90"], "\x82" => [77, "\xf91"], "\x83" => [18, "\xf91"], "\x84" => [77, "\xf92"], "\x85" => [18, "\xf92"], "\x86" => [77, "\xf9a"], "\x87" => [18, "\xf9a"], "\x88" => [77, "\xf9c"], "\x89" => [18, "\xf9c"], "\x8a" => [77, "\xf9e"], "\x8b" => [18, "\xf9e"], "\x8c" => [77, "\xf9i"], "\x8d" => [18, "\xf9i"], "\x8e" => [77, "\xf9o"], "\x8f" => [18, "\xf9o"], "\x90" => [77, "\xf9s"], "\x91" => [18, "\xf9s"], "\x92" => [77, "\xf9t"], "\x93" => [18, "\xf9t"], "\x94" => [0, "\xf9 "], "\x95" => [0, "\xf9%"], "\x96" => [0, "\xf9-"], "\x97" => [0, "\xf9."], "\x98" => [0, "\xf9/"], "\x99" => [0, "\xf93"], "\x9a" => [0, "\xf94"], "\x9b" => [0, "\xf95"], "\x9c" => [0, "\xf96"], "\x9d" => [0, "\xf97"], "\x9e" => [0, "\xf98"], "\x9f" => [0, "\xf99"], "\xa0" => [0, "\xf9="], "\xa1" => [0, "\xf9A"], "\xa2" => [0, "\xf9_"], "\xa3" => [0, "\xf9b"], "\xa4" => [0, "\xf9d"], "\xa5" => [0, "\xf9f"], "\xa6" => [0, "\xf9g"], "\xa7" => [0, "\xf9h"], "\xa8" => [0, "\xf9l"], "\xa9" => [0, "\xf9m"], "\xaa" => [0, "\xf9n"], "\xab" => [0, "\xf9p"], "\xac" => [0, "\xf9r"], "\xad" => [0, "\xf9u"], "\xae" => [100, "\xf9"], "\xaf" => [110, "\xf9"], "\xb0" => [111, "\xf9"], "\xb1" => [115, "\xf9"], "\xb2" => [116, "\xf9"], "\xb3" => [118, "\xf9"], "\xb4" => [119, "\xf9"], "\xb5" => [122, "\xf9"], "\xb6" => [123, "\xf9"], "\xb7" => [125, "\xf9"], "\xb8" => [126, "\xf9"], "\xb9" => [129, "\xf9"], "\xba" => [143, "\xf9"], "\xbb" => [148, "\xf9"], "\xbc" => [151, "\xf9"], "\xbd" => [153, "\xf9"], "\xbe" => [83, "\xf9"], "\xbf" => [10, "\xf9"], "\xc0" => [92, "\n"], "\xc1" => [95, "\n"], "\xc2" => [137, "\n"], "\xc3" => [142, "\n"], "\xc4" => [150, "\n"], "\xc5" => [74, "\n"], "\xc6" => [90, "\n"], "\xc7" => [98, "\n"], "\xc8" => [107, "\n"], "\xc9" => [140, "\n"], "\xca" => [146, "\n"], "\xcb" => [102, "\n"], "\xcc" => [113, "\n"], "\xcd" => [121, "\n"], "\xce" => [128, "\n"], "\xcf" => [12, "\n"], "\xd0" => [92, "\r"], "\xd1" => [95, "\r"], "\xd2" => [137, "\r"], "\xd3" => [142, "\r"], "\xd4" => [150, "\r"], "\xd5" => [74, "\r"], "\xd6" => [90, "\r"], "\xd7" => [98, "\r"], "\xd8" => [107, "\r"], "\xd9" => [140, "\r"], "\xda" => [146, "\r"], "\xdb" => [102, "\r"], "\xdc" => [113, "\r"], "\xdd" => [121, "\r"], "\xde" => [128, "\r"], "\xdf" => [12, "\r"], "\xe0" => [92, "\x16"], "\xe1" => [95, "\x16"], "\xe2" => [137, "\x16"], "\xe3" => [142, "\x16"], "\xe4" => [150, "\x16"], "\xe5" => [74, "\x16"], "\xe6" => [90, "\x16"], "\xe7" => [98, "\x16"], "\xe8" => [107, "\x16"], "\xe9" => [140, "\x16"], "\xea" => [146, "\x16"], "\xeb" => [102, "\x16"], "\xec" => [113, "\x16"], "\xed" => [121, "\x16"], "\xee" => [128, "\x16"], "\xef" => [12, "\x16"], "\xf0" => [92, ""], "\xf1" => [95, ""], "\xf2" => [137, ""], "\xf3" => [142, ""], "\xf4" => [150, ""], "\xf5" => [74, ""], "\xf6" => [90, ""], "\xf7" => [98, ""], "\xf8" => [107, ""], "\xf9" => [140, ""], "\xfa" => [146, ""], "\xfb" => [102, ""], "\xfc" => [113, ""], "\xfd" => [121, ""], "\xfe" => [128, ""], "\xff" => [12, ""]], ["\x00" => [0, "\x1c0"], "\x01" => [0, "\x1c1"], "\x02" => [0, "\x1c2"], "\x03" => [0, "\x1ca"], "\x04" => [0, "\x1cc"], "\x05" => [0, "\x1ce"], "\x06" => [0, "\x1ci"], "\x07" => [0, "\x1co"], "\x08" => [0, "\x1cs"], "\t" => [0, "\x1ct"], "\n" => [73, "\x1c"], "\v" => [88, "\x1c"], "\f" => [89, "\x1c"], "\r" => [96, "\x1c"], "\x0e" => [97, "\x1c"], "\x0f" => [99, "\x1c"], "\x10" => [106, "\x1c"], "\x11" => [136, "\x1c"], "\x12" => [139, "\x1c"], "\x13" => [141, "\x1c"], "\x14" => [145, "\x1c"], "\x15" => [147, "\x1c"], "\x16" => [149, "\x1c"], "\x17" => [101, "\x1c"], "\x18" => [112, "\x1c"], "\x19" => [117, "\x1c"], "\x1a" => [120, "\x1c"], "\x1b" => [124, "\x1c"], "\x1c" => [127, "\x1c"], "\x1d" => [144, "\x1c"], "\x1e" => [152, "\x1c"], "\x1f" => [11, "\x1c"], " " => [0, "\x1d0"], "!" => [0, "\x1d1"], "\"" => [0, "\x1d2"], "#" => [0, "\x1da"], "\$" => [0, "\x1dc"], "%" => [0, "\x1de"], "&" => [0, "\x1di"], "'" => [0, "\x1do"], "(" => [0, "\x1ds"], ")" => [0, "\x1dt"], "*" => [73, "\x1d"], "+" => [88, "\x1d"], "," => [89, "\x1d"], "-" => [96, "\x1d"], "." => [97, "\x1d"], "/" => [99, "\x1d"], [106, "\x1d"], [136, "\x1d"], [139, "\x1d"], [141, "\x1d"], [145, "\x1d"], [147, "\x1d"], [149, "\x1d"], [101, "\x1d"], [112, "\x1d"], [117, "\x1d"], ":" => [120, "\x1d"], ";" => [124, "\x1d"], "<" => [127, "\x1d"], "=" => [144, "\x1d"], ">" => [152, "\x1d"], "?" => [11, "\x1d"], "@" => [0, "\x1e0"], "A" => [0, "\x1e1"], "B" => [0, "\x1e2"], "C" => [0, "\x1ea"], "D" => [0, "\x1ec"], "E" => [0, "\x1ee"], "F" => [0, "\x1ei"], "G" => [0, "\x1eo"], "H" => [0, "\x1es"], "I" => [0, "\x1et"], "J" => [73, "\x1e"], "K" => [88, "\x1e"], "L" => [89, "\x1e"], "M" => [96, "\x1e"], "N" => [97, "\x1e"], "O" => [99, "\x1e"], "P" => [106, "\x1e"], "Q" => [136, "\x1e"], "R" => [139, "\x1e"], "S" => [141, "\x1e"], "T" => [145, "\x1e"], "U" => [147, "\x1e"], "V" => [149, "\x1e"], "W" => [101, "\x1e"], "X" => [112, "\x1e"], "Y" => [117, "\x1e"], "Z" => [120, "\x1e"], "[" => [124, "\x1e"], "\\" => [127, "\x1e"], "]" => [144, "\x1e"], "^" => [152, "\x1e"], "_" => [11, "\x1e"], "`" => [0, "\x1f0"], "a" => [0, "\x1f1"], "b" => [0, "\x1f2"], "c" => [0, "\x1fa"], "d" => [0, "\x1fc"], "e" => [0, "\x1fe"], "f" => [0, "\x1fi"], "g" => [0, "\x1fo"], "h" => [0, "\x1fs"], "i" => [0, "\x1ft"], "j" => [73, "\x1f"], "k" => [88, "\x1f"], "l" => [89, "\x1f"], "m" => [96, "\x1f"], "n" => [97, "\x1f"], "o" => [99, "\x1f"], "p" => [106, "\x1f"], "q" => [136, "\x1f"], "r" => [139, "\x1f"], "s" => [141, "\x1f"], "t" => [145, "\x1f"], "u" => [147, "\x1f"], "v" => [149, "\x1f"], "w" => [101, "\x1f"], "x" => [112, "\x1f"], "y" => [117, "\x1f"], "z" => [120, "\x1f"], "{" => [124, "\x1f"], "|" => [127, "\x1f"], "}" => [144, "\x1f"], "~" => [152, "\x1f"], "" => [11, "\x1f"], "\x80" => [0, "0"], "\x81" => [0, "1"], "\x82" => [0, "2"], "\x83" => [0, "a"], "\x84" => [0, "c"], "\x85" => [0, "e"], "\x86" => [0, "i"], "\x87" => [0, "o"], "\x88" => [0, "s"], "\x89" => [0, "t"], "\x8a" => [73, ""], "\x8b" => [88, ""], "\x8c" => [89, ""], "\x8d" => [96, ""], "\x8e" => [97, ""], "\x8f" => [99, ""], "\x90" => [106, ""], "\x91" => [136, ""], "\x92" => [139, ""], "\x93" => [141, ""], "\x94" => [145, ""], "\x95" => [147, ""], "\x96" => [149, ""], "\x97" => [101, ""], "\x98" => [112, ""], "\x99" => [117, ""], "\x9a" => [120, ""], "\x9b" => [124, ""], "\x9c" => [127, ""], "\x9d" => [144, ""], "\x9e" => [152, ""], "\x9f" => [11, ""], "\xa0" => [0, "\xdc0"], "\xa1" => [0, "\xdc1"], "\xa2" => [0, "\xdc2"], "\xa3" => [0, "\xdca"], "\xa4" => [0, "\xdcc"], "\xa5" => [0, "\xdce"], "\xa6" => [0, "\xdci"], "\xa7" => [0, "\xdco"], "\xa8" => [0, "\xdcs"], "\xa9" => [0, "\xdct"], "\xaa" => [73, "\xdc"], "\xab" => [88, "\xdc"], "\xac" => [89, "\xdc"], "\xad" => [96, "\xdc"], "\xae" => [97, "\xdc"], "\xaf" => [99, "\xdc"], "\xb0" => [106, "\xdc"], "\xb1" => [136, "\xdc"], "\xb2" => [139, "\xdc"], "\xb3" => [141, "\xdc"], "\xb4" => [145, "\xdc"], "\xb5" => [147, "\xdc"], "\xb6" => [149, "\xdc"], "\xb7" => [101, "\xdc"], "\xb8" => [112, "\xdc"], "\xb9" => [117, "\xdc"], "\xba" => [120, "\xdc"], "\xbb" => [124, "\xdc"], "\xbc" => [127, "\xdc"], "\xbd" => [144, "\xdc"], "\xbe" => [152, "\xdc"], "\xbf" => [11, "\xdc"], "\xc0" => [0, "\xf90"], "\xc1" => [0, "\xf91"], "\xc2" => [0, "\xf92"], "\xc3" => [0, "\xf9a"], "\xc4" => [0, "\xf9c"], "\xc5" => [0, "\xf9e"], "\xc6" => [0, "\xf9i"], "\xc7" => [0, "\xf9o"], "\xc8" => [0, "\xf9s"], "\xc9" => [0, "\xf9t"], "\xca" => [73, "\xf9"], "\xcb" => [88, "\xf9"], "\xcc" => [89, "\xf9"], "\xcd" => [96, "\xf9"], "\xce" => [97, "\xf9"], "\xcf" => [99, "\xf9"], "\xd0" => [106, "\xf9"], "\xd1" => [136, "\xf9"], "\xd2" => [139, "\xf9"], "\xd3" => [141, "\xf9"], "\xd4" => [145, "\xf9"], "\xd5" => [147, "\xf9"], "\xd6" => [149, "\xf9"], "\xd7" => [101, "\xf9"], "\xd8" => [112, "\xf9"], "\xd9" => [117, "\xf9"], "\xda" => [120, "\xf9"], "\xdb" => [124, "\xf9"], "\xdc" => [127, "\xf9"], "\xdd" => [144, "\xf9"], "\xde" => [152, "\xf9"], "\xdf" => [11, "\xf9"], "\xe0" => [93, "\n"], "\xe1" => [138, "\n"], "\xe2" => [75, "\n"], "\xe3" => [91, "\n"], "\xe4" => [108, "\n"], "\xe5" => [103, "\n"], "\xe6" => [114, "\n"], "\xe7" => [14, "\n"], "\xe8" => [93, "\r"], "\xe9" => [138, "\r"], "\xea" => [75, "\r"], "\xeb" => [91, "\r"], "\xec" => [108, "\r"], "\xed" => [103, "\r"], "\xee" => [114, "\r"], "\xef" => [14, "\r"], "\xf0" => [93, "\x16"], "\xf1" => [138, "\x16"], "\xf2" => [75, "\x16"], "\xf3" => [91, "\x16"], "\xf4" => [108, "\x16"], "\xf5" => [103, "\x16"], "\xf6" => [114, "\x16"], "\xf7" => [14, "\x16"], "\xf8" => [93, ""], "\xf9" => [138, ""], "\xfa" => [75, ""], "\xfb" => [91, ""], "\xfc" => [108, ""], "\xfd" => [103, ""], "\xfe" => [114, ""], "\xff" => [14, ""]], ["\x00" => [94, "\f0"], "\x01" => [76, "\f0"], "\x02" => [104, "\f0"], "\x03" => [16, "\f0"], "\x04" => [94, "\f1"], "\x05" => [76, "\f1"], "\x06" => [104, "\f1"], "\x07" => [16, "\f1"], "\x08" => [94, "\f2"], "\t" => [76, "\f2"], "\n" => [104, "\f2"], "\v" => [16, "\f2"], "\f" => [94, "\fa"], "\r" => [76, "\fa"], "\x0e" => [104, "\fa"], "\x0f" => [16, "\fa"], "\x10" => [94, "\fc"], "\x11" => [76, "\fc"], "\x12" => [104, "\fc"], "\x13" => [16, "\fc"], "\x14" => [94, "\fe"], "\x15" => [76, "\fe"], "\x16" => [104, "\fe"], "\x17" => [16, "\fe"], "\x18" => [94, "\fi"], "\x19" => [76, "\fi"], "\x1a" => [104, "\fi"], "\x1b" => [16, "\fi"], "\x1c" => [94, "\fo"], "\x1d" => [76, "\fo"], "\x1e" => [104, "\fo"], "\x1f" => [16, "\fo"], " " => [94, "\fs"], "!" => [76, "\fs"], "\"" => [104, "\fs"], "#" => [16, "\fs"], "\$" => [94, "\ft"], "%" => [76, "\ft"], "&" => [104, "\ft"], "'" => [16, "\ft"], "(" => [77, "\f "], ")" => [18, "\f "], "*" => [77, "\f%"], "+" => [18, "\f%"], "," => [77, "\f-"], "-" => [18, "\f-"], "." => [77, "\f."], "/" => [18, "\f."], [77, "\f/"], [18, "\f/"], [77, "\f3"], [18, "\f3"], [77, "\f4"], [18, "\f4"], [77, "\f5"], [18, "\f5"], [77, "\f6"], [18, "\f6"], ":" => [77, "\f7"], ";" => [18, "\f7"], "<" => [77, "\f8"], "=" => [18, "\f8"], ">" => [77, "\f9"], "?" => [18, "\f9"], "@" => [77, "\f="], "A" => [18, "\f="], "B" => [77, "\fA"], "C" => [18, "\fA"], "D" => [77, "\f_"], "E" => [18, "\f_"], "F" => [77, "\fb"], "G" => [18, "\fb"], "H" => [77, "\fd"], "I" => [18, "\fd"], "J" => [77, "\ff"], "K" => [18, "\ff"], "L" => [77, "\fg"], "M" => [18, "\fg"], "N" => [77, "\fh"], "O" => [18, "\fh"], "P" => [77, "\fl"], "Q" => [18, "\fl"], "R" => [77, "\fm"], "S" => [18, "\fm"], "T" => [77, "\fn"], "U" => [18, "\fn"], "V" => [77, "\fp"], "W" => [18, "\fp"], "X" => [77, "\fr"], "Y" => [18, "\fr"], "Z" => [77, "\fu"], "[" => [18, "\fu"], "\\" => [0, "\f:"], "]" => [0, "\fB"], "^" => [0, "\fC"], "_" => [0, "\fD"], "`" => [0, "\fE"], "a" => [0, "\fF"], "b" => [0, "\fG"], "c" => [0, "\fH"], "d" => [0, "\fI"], "e" => [0, "\fJ"], "f" => [0, "\fK"], "g" => [0, "\fL"], "h" => [0, "\fM"], "i" => [0, "\fN"], "j" => [0, "\fO"], "k" => [0, "\fP"], "l" => [0, "\fQ"], "m" => [0, "\fR"], "n" => [0, "\fS"], "o" => [0, "\fT"], "p" => [0, "\fU"], "q" => [0, "\fV"], "r" => [0, "\fW"], "s" => [0, "\fY"], "t" => [0, "\fj"], "u" => [0, "\fk"], "v" => [0, "\fq"], "w" => [0, "\fv"], "x" => [0, "\fw"], "y" => [0, "\fx"], "z" => [0, "\fy"], "{" => [0, "\fz"], "|" => [82, "\f"], "}" => [87, "\f"], "~" => [130, "\f"], "" => [9, "\f"], "\x80" => [94, "\x0e0"], "\x81" => [76, "\x0e0"], "\x82" => [104, "\x0e0"], "\x83" => [16, "\x0e0"], "\x84" => [94, "\x0e1"], "\x85" => [76, "\x0e1"], "\x86" => [104, "\x0e1"], "\x87" => [16, "\x0e1"], "\x88" => [94, "\x0e2"], "\x89" => [76, "\x0e2"], "\x8a" => [104, "\x0e2"], "\x8b" => [16, "\x0e2"], "\x8c" => [94, "\x0ea"], "\x8d" => [76, "\x0ea"], "\x8e" => [104, "\x0ea"], "\x8f" => [16, "\x0ea"], "\x90" => [94, "\x0ec"], "\x91" => [76, "\x0ec"], "\x92" => [104, "\x0ec"], "\x93" => [16, "\x0ec"], "\x94" => [94, "\x0ee"], "\x95" => [76, "\x0ee"], "\x96" => [104, "\x0ee"], "\x97" => [16, "\x0ee"], "\x98" => [94, "\x0ei"], "\x99" => [76, "\x0ei"], "\x9a" => [104, "\x0ei"], "\x9b" => [16, "\x0ei"], "\x9c" => [94, "\x0eo"], "\x9d" => [76, "\x0eo"], "\x9e" => [104, "\x0eo"], "\x9f" => [16, "\x0eo"], "\xa0" => [94, "\x0es"], "\xa1" => [76, "\x0es"], "\xa2" => [104, "\x0es"], "\xa3" => [16, "\x0es"], "\xa4" => [94, "\x0et"], "\xa5" => [76, "\x0et"], "\xa6" => [104, "\x0et"], "\xa7" => [16, "\x0et"], "\xa8" => [77, "\x0e "], "\xa9" => [18, "\x0e "], "\xaa" => [77, "\x0e%"], "\xab" => [18, "\x0e%"], "\xac" => [77, "\x0e-"], "\xad" => [18, "\x0e-"], "\xae" => [77, "\x0e."], "\xaf" => [18, "\x0e."], "\xb0" => [77, "\x0e/"], "\xb1" => [18, "\x0e/"], "\xb2" => [77, "\x0e3"], "\xb3" => [18, "\x0e3"], "\xb4" => [77, "\x0e4"], "\xb5" => [18, "\x0e4"], "\xb6" => [77, "\x0e5"], "\xb7" => [18, "\x0e5"], "\xb8" => [77, "\x0e6"], "\xb9" => [18, "\x0e6"], "\xba" => [77, "\x0e7"], "\xbb" => [18, "\x0e7"], "\xbc" => [77, "\x0e8"], "\xbd" => [18, "\x0e8"], "\xbe" => [77, "\x0e9"], "\xbf" => [18, "\x0e9"], "\xc0" => [77, "\x0e="], "\xc1" => [18, "\x0e="], "\xc2" => [77, "\x0eA"], "\xc3" => [18, "\x0eA"], "\xc4" => [77, "\x0e_"], "\xc5" => [18, "\x0e_"], "\xc6" => [77, "\x0eb"], "\xc7" => [18, "\x0eb"], "\xc8" => [77, "\x0ed"], "\xc9" => [18, "\x0ed"], "\xca" => [77, "\x0ef"], "\xcb" => [18, "\x0ef"], "\xcc" => [77, "\x0eg"], "\xcd" => [18, "\x0eg"], "\xce" => [77, "\x0eh"], "\xcf" => [18, "\x0eh"], "\xd0" => [77, "\x0el"], "\xd1" => [18, "\x0el"], "\xd2" => [77, "\x0em"], "\xd3" => [18, "\x0em"], "\xd4" => [77, "\x0en"], "\xd5" => [18, "\x0en"], "\xd6" => [77, "\x0ep"], "\xd7" => [18, "\x0ep"], "\xd8" => [77, "\x0er"], "\xd9" => [18, "\x0er"], "\xda" => [77, "\x0eu"], "\xdb" => [18, "\x0eu"], "\xdc" => [0, "\x0e:"], "\xdd" => [0, "\x0eB"], "\xde" => [0, "\x0eC"], "\xdf" => [0, "\x0eD"], "\xe0" => [0, "\x0eE"], "\xe1" => [0, "\x0eF"], "\xe2" => [0, "\x0eG"], "\xe3" => [0, "\x0eH"], "\xe4" => [0, "\x0eI"], "\xe5" => [0, "\x0eJ"], "\xe6" => [0, "\x0eK"], "\xe7" => [0, "\x0eL"], "\xe8" => [0, "\x0eM"], "\xe9" => [0, "\x0eN"], "\xea" => [0, "\x0eO"], "\xeb" => [0, "\x0eP"], "\xec" => [0, "\x0eQ"], "\xed" => [0, "\x0eR"], "\xee" => [0, "\x0eS"], "\xef" => [0, "\x0eT"], "\xf0" => [0, "\x0eU"], "\xf1" => [0, "\x0eV"], "\xf2" => [0, "\x0eW"], "\xf3" => [0, "\x0eY"], "\xf4" => [0, "\x0ej"], "\xf5" => [0, "\x0ek"], "\xf6" => [0, "\x0eq"], "\xf7" => [0, "\x0ev"], "\xf8" => [0, "\x0ew"], "\xf9" => [0, "\x0ex"], "\xfa" => [0, "\x0ey"], "\xfb" => [0, "\x0ez"], "\xfc" => [82, "\x0e"], "\xfd" => [87, "\x0e"], "\xfe" => [130, "\x0e"], "\xff" => [9, "\x0e"]], ["\x00" => [94, "\x0f0"], "\x01" => [76, "\x0f0"], "\x02" => [104, "\x0f0"], "\x03" => [16, "\x0f0"], "\x04" => [94, "\x0f1"], "\x05" => [76, "\x0f1"], "\x06" => [104, "\x0f1"], "\x07" => [16, "\x0f1"], "\x08" => [94, "\x0f2"], "\t" => [76, "\x0f2"], "\n" => [104, "\x0f2"], "\v" => [16, "\x0f2"], "\f" => [94, "\x0fa"], "\r" => [76, "\x0fa"], "\x0e" => [104, "\x0fa"], "\x0f" => [16, "\x0fa"], "\x10" => [94, "\x0fc"], "\x11" => [76, "\x0fc"], "\x12" => [104, "\x0fc"], "\x13" => [16, "\x0fc"], "\x14" => [94, "\x0fe"], "\x15" => [76, "\x0fe"], "\x16" => [104, "\x0fe"], "\x17" => [16, "\x0fe"], "\x18" => [94, "\x0fi"], "\x19" => [76, "\x0fi"], "\x1a" => [104, "\x0fi"], "\x1b" => [16, "\x0fi"], "\x1c" => [94, "\x0fo"], "\x1d" => [76, "\x0fo"], "\x1e" => [104, "\x0fo"], "\x1f" => [16, "\x0fo"], " " => [94, "\x0fs"], "!" => [76, "\x0fs"], "\"" => [104, "\x0fs"], "#" => [16, "\x0fs"], "\$" => [94, "\x0ft"], "%" => [76, "\x0ft"], "&" => [104, "\x0ft"], "'" => [16, "\x0ft"], "(" => [77, "\x0f "], ")" => [18, "\x0f "], "*" => [77, "\x0f%"], "+" => [18, "\x0f%"], "," => [77, "\x0f-"], "-" => [18, "\x0f-"], "." => [77, "\x0f."], "/" => [18, "\x0f."], [77, "\x0f/"], [18, "\x0f/"], [77, "\x0f3"], [18, "\x0f3"], [77, "\x0f4"], [18, "\x0f4"], [77, "\x0f5"], [18, "\x0f5"], [77, "\x0f6"], [18, "\x0f6"], ":" => [77, "\x0f7"], ";" => [18, "\x0f7"], "<" => [77, "\x0f8"], "=" => [18, "\x0f8"], ">" => [77, "\x0f9"], "?" => [18, "\x0f9"], "@" => [77, "\x0f="], "A" => [18, "\x0f="], "B" => [77, "\x0fA"], "C" => [18, "\x0fA"], "D" => [77, "\x0f_"], "E" => [18, "\x0f_"], "F" => [77, "\x0fb"], "G" => [18, "\x0fb"], "H" => [77, "\x0fd"], "I" => [18, "\x0fd"], "J" => [77, "\x0ff"], "K" => [18, "\x0ff"], "L" => [77, "\x0fg"], "M" => [18, "\x0fg"], "N" => [77, "\x0fh"], "O" => [18, "\x0fh"], "P" => [77, "\x0fl"], "Q" => [18, "\x0fl"], "R" => [77, "\x0fm"], "S" => [18, "\x0fm"], "T" => [77, "\x0fn"], "U" => [18, "\x0fn"], "V" => [77, "\x0fp"], "W" => [18, "\x0fp"], "X" => [77, "\x0fr"], "Y" => [18, "\x0fr"], "Z" => [77, "\x0fu"], "[" => [18, "\x0fu"], "\\" => [0, "\x0f:"], "]" => [0, "\x0fB"], "^" => [0, "\x0fC"], "_" => [0, "\x0fD"], "`" => [0, "\x0fE"], "a" => [0, "\x0fF"], "b" => [0, "\x0fG"], "c" => [0, "\x0fH"], "d" => [0, "\x0fI"], "e" => [0, "\x0fJ"], "f" => [0, "\x0fK"], "g" => [0, "\x0fL"], "h" => [0, "\x0fM"], "i" => [0, "\x0fN"], "j" => [0, "\x0fO"], "k" => [0, "\x0fP"], "l" => [0, "\x0fQ"], "m" => [0, "\x0fR"], "n" => [0, "\x0fS"], "o" => [0, "\x0fT"], "p" => [0, "\x0fU"], "q" => [0, "\x0fV"], "r" => [0, "\x0fW"], "s" => [0, "\x0fY"], "t" => [0, "\x0fj"], "u" => [0, "\x0fk"], "v" => [0, "\x0fq"], "w" => [0, "\x0fv"], "x" => [0, "\x0fw"], "y" => [0, "\x0fx"], "z" => [0, "\x0fy"], "{" => [0, "\x0fz"], "|" => [82, "\x0f"], "}" => [87, "\x0f"], "~" => [130, "\x0f"], "" => [9, "\x0f"], "\x80" => [94, "\x100"], "\x81" => [76, "\x100"], "\x82" => [104, "\x100"], "\x83" => [16, "\x100"], "\x84" => [94, "\x101"], "\x85" => [76, "\x101"], "\x86" => [104, "\x101"], "\x87" => [16, "\x101"], "\x88" => [94, "\x102"], "\x89" => [76, "\x102"], "\x8a" => [104, "\x102"], "\x8b" => [16, "\x102"], "\x8c" => [94, "\x10a"], "\x8d" => [76, "\x10a"], "\x8e" => [104, "\x10a"], "\x8f" => [16, "\x10a"], "\x90" => [94, "\x10c"], "\x91" => [76, "\x10c"], "\x92" => [104, "\x10c"], "\x93" => [16, "\x10c"], "\x94" => [94, "\x10e"], "\x95" => [76, "\x10e"], "\x96" => [104, "\x10e"], "\x97" => [16, "\x10e"], "\x98" => [94, "\x10i"], "\x99" => [76, "\x10i"], "\x9a" => [104, "\x10i"], "\x9b" => [16, "\x10i"], "\x9c" => [94, "\x10o"], "\x9d" => [76, "\x10o"], "\x9e" => [104, "\x10o"], "\x9f" => [16, "\x10o"], "\xa0" => [94, "\x10s"], "\xa1" => [76, "\x10s"], "\xa2" => [104, "\x10s"], "\xa3" => [16, "\x10s"], "\xa4" => [94, "\x10t"], "\xa5" => [76, "\x10t"], "\xa6" => [104, "\x10t"], "\xa7" => [16, "\x10t"], "\xa8" => [77, "\x10 "], "\xa9" => [18, "\x10 "], "\xaa" => [77, "\x10%"], "\xab" => [18, "\x10%"], "\xac" => [77, "\x10-"], "\xad" => [18, "\x10-"], "\xae" => [77, "\x10."], "\xaf" => [18, "\x10."], "\xb0" => [77, "\x10/"], "\xb1" => [18, "\x10/"], "\xb2" => [77, "\x103"], "\xb3" => [18, "\x103"], "\xb4" => [77, "\x104"], "\xb5" => [18, "\x104"], "\xb6" => [77, "\x105"], "\xb7" => [18, "\x105"], "\xb8" => [77, "\x106"], "\xb9" => [18, "\x106"], "\xba" => [77, "\x107"], "\xbb" => [18, "\x107"], "\xbc" => [77, "\x108"], "\xbd" => [18, "\x108"], "\xbe" => [77, "\x109"], "\xbf" => [18, "\x109"], "\xc0" => [77, "\x10="], "\xc1" => [18, "\x10="], "\xc2" => [77, "\x10A"], "\xc3" => [18, "\x10A"], "\xc4" => [77, "\x10_"], "\xc5" => [18, "\x10_"], "\xc6" => [77, "\x10b"], "\xc7" => [18, "\x10b"], "\xc8" => [77, "\x10d"], "\xc9" => [18, "\x10d"], "\xca" => [77, "\x10f"], "\xcb" => [18, "\x10f"], "\xcc" => [77, "\x10g"], "\xcd" => [18, "\x10g"], "\xce" => [77, "\x10h"], "\xcf" => [18, "\x10h"], "\xd0" => [77, "\x10l"], "\xd1" => [18, "\x10l"], "\xd2" => [77, "\x10m"], "\xd3" => [18, "\x10m"], "\xd4" => [77, "\x10n"], "\xd5" => [18, "\x10n"], "\xd6" => [77, "\x10p"], "\xd7" => [18, "\x10p"], "\xd8" => [77, "\x10r"], "\xd9" => [18, "\x10r"], "\xda" => [77, "\x10u"], "\xdb" => [18, "\x10u"], "\xdc" => [0, "\x10:"], "\xdd" => [0, "\x10B"], "\xde" => [0, "\x10C"], "\xdf" => [0, "\x10D"], "\xe0" => [0, "\x10E"], "\xe1" => [0, "\x10F"], "\xe2" => [0, "\x10G"], "\xe3" => [0, "\x10H"], "\xe4" => [0, "\x10I"], "\xe5" => [0, "\x10J"], "\xe6" => [0, "\x10K"], "\xe7" => [0, "\x10L"], "\xe8" => [0, "\x10M"], "\xe9" => [0, "\x10N"], "\xea" => [0, "\x10O"], "\xeb" => [0, "\x10P"], "\xec" => [0, "\x10Q"], "\xed" => [0, "\x10R"], "\xee" => [0, "\x10S"], "\xef" => [0, "\x10T"], "\xf0" => [0, "\x10U"], "\xf1" => [0, "\x10V"], "\xf2" => [0, "\x10W"], "\xf3" => [0, "\x10Y"], "\xf4" => [0, "\x10j"], "\xf5" => [0, "\x10k"], "\xf6" => [0, "\x10q"], "\xf7" => [0, "\x10v"], "\xf8" => [0, "\x10w"], "\xf9" => [0, "\x10x"], "\xfa" => [0, "\x10y"], "\xfb" => [0, "\x10z"], "\xfc" => [82, "\x10"], "\xfd" => [87, "\x10"], "\xfe" => [130, "\x10"], "\xff" => [9, "\x10"]], ["\x00" => [77, "\x0f0"], "\x01" => [18, "\x0f0"], "\x02" => [77, "\x0f1"], "\x03" => [18, "\x0f1"], "\x04" => [77, "\x0f2"], "\x05" => [18, "\x0f2"], "\x06" => [77, "\x0fa"], "\x07" => [18, "\x0fa"], "\x08" => [77, "\x0fc"], "\t" => [18, "\x0fc"], "\n" => [77, "\x0fe"], "\v" => [18, "\x0fe"], "\f" => [77, "\x0fi"], "\r" => [18, "\x0fi"], "\x0e" => [77, "\x0fo"], "\x0f" => [18, "\x0fo"], "\x10" => [77, "\x0fs"], "\x11" => [18, "\x0fs"], "\x12" => [77, "\x0ft"], "\x13" => [18, "\x0ft"], "\x14" => [0, "\x0f "], "\x15" => [0, "\x0f%"], "\x16" => [0, "\x0f-"], "\x17" => [0, "\x0f."], "\x18" => [0, "\x0f/"], "\x19" => [0, "\x0f3"], "\x1a" => [0, "\x0f4"], "\x1b" => [0, "\x0f5"], "\x1c" => [0, "\x0f6"], "\x1d" => [0, "\x0f7"], "\x1e" => [0, "\x0f8"], "\x1f" => [0, "\x0f9"], " " => [0, "\x0f="], "!" => [0, "\x0fA"], "\"" => [0, "\x0f_"], "#" => [0, "\x0fb"], "\$" => [0, "\x0fd"], "%" => [0, "\x0ff"], "&" => [0, "\x0fg"], "'" => [0, "\x0fh"], "(" => [0, "\x0fl"], ")" => [0, "\x0fm"], "*" => [0, "\x0fn"], "+" => [0, "\x0fp"], "," => [0, "\x0fr"], "-" => [0, "\x0fu"], "." => [100, "\x0f"], "/" => [110, "\x0f"], [111, "\x0f"], [115, "\x0f"], [116, "\x0f"], [118, "\x0f"], [119, "\x0f"], [122, "\x0f"], [123, "\x0f"], [125, "\x0f"], [126, "\x0f"], [129, "\x0f"], ":" => [143, "\x0f"], ";" => [148, "\x0f"], "<" => [151, "\x0f"], "=" => [153, "\x0f"], ">" => [83, "\x0f"], "?" => [10, "\x0f"], "@" => [77, "\x100"], "A" => [18, "\x100"], "B" => [77, "\x101"], "C" => [18, "\x101"], "D" => [77, "\x102"], "E" => [18, "\x102"], "F" => [77, "\x10a"], "G" => [18, "\x10a"], "H" => [77, "\x10c"], "I" => [18, "\x10c"], "J" => [77, "\x10e"], "K" => [18, "\x10e"], "L" => [77, "\x10i"], "M" => [18, "\x10i"], "N" => [77, "\x10o"], "O" => [18, "\x10o"], "P" => [77, "\x10s"], "Q" => [18, "\x10s"], "R" => [77, "\x10t"], "S" => [18, "\x10t"], "T" => [0, "\x10 "], "U" => [0, "\x10%"], "V" => [0, "\x10-"], "W" => [0, "\x10."], "X" => [0, "\x10/"], "Y" => [0, "\x103"], "Z" => [0, "\x104"], "[" => [0, "\x105"], "\\" => [0, "\x106"], "]" => [0, "\x107"], "^" => [0, "\x108"], "_" => [0, "\x109"], "`" => [0, "\x10="], "a" => [0, "\x10A"], "b" => [0, "\x10_"], "c" => [0, "\x10b"], "d" => [0, "\x10d"], "e" => [0, "\x10f"], "f" => [0, "\x10g"], "g" => [0, "\x10h"], "h" => [0, "\x10l"], "i" => [0, "\x10m"], "j" => [0, "\x10n"], "k" => [0, "\x10p"], "l" => [0, "\x10r"], "m" => [0, "\x10u"], "n" => [100, "\x10"], "o" => [110, "\x10"], "p" => [111, "\x10"], "q" => [115, "\x10"], "r" => [116, "\x10"], "s" => [118, "\x10"], "t" => [119, "\x10"], "u" => [122, "\x10"], "v" => [123, "\x10"], "w" => [125, "\x10"], "x" => [126, "\x10"], "y" => [129, "\x10"], "z" => [143, "\x10"], "{" => [148, "\x10"], "|" => [151, "\x10"], "}" => [153, "\x10"], "~" => [83, "\x10"], "" => [10, "\x10"], "\x80" => [77, "\x110"], "\x81" => [18, "\x110"], "\x82" => [77, "\x111"], "\x83" => [18, "\x111"], "\x84" => [77, "\x112"], "\x85" => [18, "\x112"], "\x86" => [77, "\x11a"], "\x87" => [18, "\x11a"], "\x88" => [77, "\x11c"], "\x89" => [18, "\x11c"], "\x8a" => [77, "\x11e"], "\x8b" => [18, "\x11e"], "\x8c" => [77, "\x11i"], "\x8d" => [18, "\x11i"], "\x8e" => [77, "\x11o"], "\x8f" => [18, "\x11o"], "\x90" => [77, "\x11s"], "\x91" => [18, "\x11s"], "\x92" => [77, "\x11t"], "\x93" => [18, "\x11t"], "\x94" => [0, "\x11 "], "\x95" => [0, "\x11%"], "\x96" => [0, "\x11-"], "\x97" => [0, "\x11."], "\x98" => [0, "\x11/"], "\x99" => [0, "\x113"], "\x9a" => [0, "\x114"], "\x9b" => [0, "\x115"], "\x9c" => [0, "\x116"], "\x9d" => [0, "\x117"], "\x9e" => [0, "\x118"], "\x9f" => [0, "\x119"], "\xa0" => [0, "\x11="], "\xa1" => [0, "\x11A"], "\xa2" => [0, "\x11_"], "\xa3" => [0, "\x11b"], "\xa4" => [0, "\x11d"], "\xa5" => [0, "\x11f"], "\xa6" => [0, "\x11g"], "\xa7" => [0, "\x11h"], "\xa8" => [0, "\x11l"], "\xa9" => [0, "\x11m"], "\xaa" => [0, "\x11n"], "\xab" => [0, "\x11p"], "\xac" => [0, "\x11r"], "\xad" => [0, "\x11u"], "\xae" => [100, "\x11"], "\xaf" => [110, "\x11"], "\xb0" => [111, "\x11"], "\xb1" => [115, "\x11"], "\xb2" => [116, "\x11"], "\xb3" => [118, "\x11"], "\xb4" => [119, "\x11"], "\xb5" => [122, "\x11"], "\xb6" => [123, "\x11"], "\xb7" => [125, "\x11"], "\xb8" => [126, "\x11"], "\xb9" => [129, "\x11"], "\xba" => [143, "\x11"], "\xbb" => [148, "\x11"], "\xbc" => [151, "\x11"], "\xbd" => [153, "\x11"], "\xbe" => [83, "\x11"], "\xbf" => [10, "\x11"], "\xc0" => [77, "\x120"], "\xc1" => [18, "\x120"], "\xc2" => [77, "\x121"], "\xc3" => [18, "\x121"], "\xc4" => [77, "\x122"], "\xc5" => [18, "\x122"], "\xc6" => [77, "\x12a"], "\xc7" => [18, "\x12a"], "\xc8" => [77, "\x12c"], "\xc9" => [18, "\x12c"], "\xca" => [77, "\x12e"], "\xcb" => [18, "\x12e"], "\xcc" => [77, "\x12i"], "\xcd" => [18, "\x12i"], "\xce" => [77, "\x12o"], "\xcf" => [18, "\x12o"], "\xd0" => [77, "\x12s"], "\xd1" => [18, "\x12s"], "\xd2" => [77, "\x12t"], "\xd3" => [18, "\x12t"], "\xd4" => [0, "\x12 "], "\xd5" => [0, "\x12%"], "\xd6" => [0, "\x12-"], "\xd7" => [0, "\x12."], "\xd8" => [0, "\x12/"], "\xd9" => [0, "\x123"], "\xda" => [0, "\x124"], "\xdb" => [0, "\x125"], "\xdc" => [0, "\x126"], "\xdd" => [0, "\x127"], "\xde" => [0, "\x128"], "\xdf" => [0, "\x129"], "\xe0" => [0, "\x12="], "\xe1" => [0, "\x12A"], "\xe2" => [0, "\x12_"], "\xe3" => [0, "\x12b"], "\xe4" => [0, "\x12d"], "\xe5" => [0, "\x12f"], "\xe6" => [0, "\x12g"], "\xe7" => [0, "\x12h"], "\xe8" => [0, "\x12l"], "\xe9" => [0, "\x12m"], "\xea" => [0, "\x12n"], "\xeb" => [0, "\x12p"], "\xec" => [0, "\x12r"], "\xed" => [0, "\x12u"], "\xee" => [100, "\x12"], "\xef" => [110, "\x12"], "\xf0" => [111, "\x12"], "\xf1" => [115, "\x12"], "\xf2" => [116, "\x12"], "\xf3" => [118, "\x12"], "\xf4" => [119, "\x12"], "\xf5" => [122, "\x12"], "\xf6" => [123, "\x12"], "\xf7" => [125, "\x12"], "\xf8" => [126, "\x12"], "\xf9" => [129, "\x12"], "\xfa" => [143, "\x12"], "\xfb" => [148, "\x12"], "\xfc" => [151, "\x12"], "\xfd" => [153, "\x12"], "\xfe" => [83, "\x12"], "\xff" => [10, "\x12"]], ["\x00" => [94, "\x110"], "\x01" => [76, "\x110"], "\x02" => [104, "\x110"], "\x03" => [16, "\x110"], "\x04" => [94, "\x111"], "\x05" => [76, "\x111"], "\x06" => [104, "\x111"], "\x07" => [16, "\x111"], "\x08" => [94, "\x112"], "\t" => [76, "\x112"], "\n" => [104, "\x112"], "\v" => [16, "\x112"], "\f" => [94, "\x11a"], "\r" => [76, "\x11a"], "\x0e" => [104, "\x11a"], "\x0f" => [16, "\x11a"], "\x10" => [94, "\x11c"], "\x11" => [76, "\x11c"], "\x12" => [104, "\x11c"], "\x13" => [16, "\x11c"], "\x14" => [94, "\x11e"], "\x15" => [76, "\x11e"], "\x16" => [104, "\x11e"], "\x17" => [16, "\x11e"], "\x18" => [94, "\x11i"], "\x19" => [76, "\x11i"], "\x1a" => [104, "\x11i"], "\x1b" => [16, "\x11i"], "\x1c" => [94, "\x11o"], "\x1d" => [76, "\x11o"], "\x1e" => [104, "\x11o"], "\x1f" => [16, "\x11o"], " " => [94, "\x11s"], "!" => [76, "\x11s"], "\"" => [104, "\x11s"], "#" => [16, "\x11s"], "\$" => [94, "\x11t"], "%" => [76, "\x11t"], "&" => [104, "\x11t"], "'" => [16, "\x11t"], "(" => [77, "\x11 "], ")" => [18, "\x11 "], "*" => [77, "\x11%"], "+" => [18, "\x11%"], "," => [77, "\x11-"], "-" => [18, "\x11-"], "." => [77, "\x11."], "/" => [18, "\x11."], [77, "\x11/"], [18, "\x11/"], [77, "\x113"], [18, "\x113"], [77, "\x114"], [18, "\x114"], [77, "\x115"], [18, "\x115"], [77, "\x116"], [18, "\x116"], ":" => [77, "\x117"], ";" => [18, "\x117"], "<" => [77, "\x118"], "=" => [18, "\x118"], ">" => [77, "\x119"], "?" => [18, "\x119"], "@" => [77, "\x11="], "A" => [18, "\x11="], "B" => [77, "\x11A"], "C" => [18, "\x11A"], "D" => [77, "\x11_"], "E" => [18, "\x11_"], "F" => [77, "\x11b"], "G" => [18, "\x11b"], "H" => [77, "\x11d"], "I" => [18, "\x11d"], "J" => [77, "\x11f"], "K" => [18, "\x11f"], "L" => [77, "\x11g"], "M" => [18, "\x11g"], "N" => [77, "\x11h"], "O" => [18, "\x11h"], "P" => [77, "\x11l"], "Q" => [18, "\x11l"], "R" => [77, "\x11m"], "S" => [18, "\x11m"], "T" => [77, "\x11n"], "U" => [18, "\x11n"], "V" => [77, "\x11p"], "W" => [18, "\x11p"], "X" => [77, "\x11r"], "Y" => [18, "\x11r"], "Z" => [77, "\x11u"], "[" => [18, "\x11u"], "\\" => [0, "\x11:"], "]" => [0, "\x11B"], "^" => [0, "\x11C"], "_" => [0, "\x11D"], "`" => [0, "\x11E"], "a" => [0, "\x11F"], "b" => [0, "\x11G"], "c" => [0, "\x11H"], "d" => [0, "\x11I"], "e" => [0, "\x11J"], "f" => [0, "\x11K"], "g" => [0, "\x11L"], "h" => [0, "\x11M"], "i" => [0, "\x11N"], "j" => [0, "\x11O"], "k" => [0, "\x11P"], "l" => [0, "\x11Q"], "m" => [0, "\x11R"], "n" => [0, "\x11S"], "o" => [0, "\x11T"], "p" => [0, "\x11U"], "q" => [0, "\x11V"], "r" => [0, "\x11W"], "s" => [0, "\x11Y"], "t" => [0, "\x11j"], "u" => [0, "\x11k"], "v" => [0, "\x11q"], "w" => [0, "\x11v"], "x" => [0, "\x11w"], "y" => [0, "\x11x"], "z" => [0, "\x11y"], "{" => [0, "\x11z"], "|" => [82, "\x11"], "}" => [87, "\x11"], "~" => [130, "\x11"], "" => [9, "\x11"], "\x80" => [94, "\x120"], "\x81" => [76, "\x120"], "\x82" => [104, "\x120"], "\x83" => [16, "\x120"], "\x84" => [94, "\x121"], "\x85" => [76, "\x121"], "\x86" => [104, "\x121"], "\x87" => [16, "\x121"], "\x88" => [94, "\x122"], "\x89" => [76, "\x122"], "\x8a" => [104, "\x122"], "\x8b" => [16, "\x122"], "\x8c" => [94, "\x12a"], "\x8d" => [76, "\x12a"], "\x8e" => [104, "\x12a"], "\x8f" => [16, "\x12a"], "\x90" => [94, "\x12c"], "\x91" => [76, "\x12c"], "\x92" => [104, "\x12c"], "\x93" => [16, "\x12c"], "\x94" => [94, "\x12e"], "\x95" => [76, "\x12e"], "\x96" => [104, "\x12e"], "\x97" => [16, "\x12e"], "\x98" => [94, "\x12i"], "\x99" => [76, "\x12i"], "\x9a" => [104, "\x12i"], "\x9b" => [16, "\x12i"], "\x9c" => [94, "\x12o"], "\x9d" => [76, "\x12o"], "\x9e" => [104, "\x12o"], "\x9f" => [16, "\x12o"], "\xa0" => [94, "\x12s"], "\xa1" => [76, "\x12s"], "\xa2" => [104, "\x12s"], "\xa3" => [16, "\x12s"], "\xa4" => [94, "\x12t"], "\xa5" => [76, "\x12t"], "\xa6" => [104, "\x12t"], "\xa7" => [16, "\x12t"], "\xa8" => [77, "\x12 "], "\xa9" => [18, "\x12 "], "\xaa" => [77, "\x12%"], "\xab" => [18, "\x12%"], "\xac" => [77, "\x12-"], "\xad" => [18, "\x12-"], "\xae" => [77, "\x12."], "\xaf" => [18, "\x12."], "\xb0" => [77, "\x12/"], "\xb1" => [18, "\x12/"], "\xb2" => [77, "\x123"], "\xb3" => [18, "\x123"], "\xb4" => [77, "\x124"], "\xb5" => [18, "\x124"], "\xb6" => [77, "\x125"], "\xb7" => [18, "\x125"], "\xb8" => [77, "\x126"], "\xb9" => [18, "\x126"], "\xba" => [77, "\x127"], "\xbb" => [18, "\x127"], "\xbc" => [77, "\x128"], "\xbd" => [18, "\x128"], "\xbe" => [77, "\x129"], "\xbf" => [18, "\x129"], "\xc0" => [77, "\x12="], "\xc1" => [18, "\x12="], "\xc2" => [77, "\x12A"], "\xc3" => [18, "\x12A"], "\xc4" => [77, "\x12_"], "\xc5" => [18, "\x12_"], "\xc6" => [77, "\x12b"], "\xc7" => [18, "\x12b"], "\xc8" => [77, "\x12d"], "\xc9" => [18, "\x12d"], "\xca" => [77, "\x12f"], "\xcb" => [18, "\x12f"], "\xcc" => [77, "\x12g"], "\xcd" => [18, "\x12g"], "\xce" => [77, "\x12h"], "\xcf" => [18, "\x12h"], "\xd0" => [77, "\x12l"], "\xd1" => [18, "\x12l"], "\xd2" => [77, "\x12m"], "\xd3" => [18, "\x12m"], "\xd4" => [77, "\x12n"], "\xd5" => [18, "\x12n"], "\xd6" => [77, "\x12p"], "\xd7" => [18, "\x12p"], "\xd8" => [77, "\x12r"], "\xd9" => [18, "\x12r"], "\xda" => [77, "\x12u"], "\xdb" => [18, "\x12u"], "\xdc" => [0, "\x12:"], "\xdd" => [0, "\x12B"], "\xde" => [0, "\x12C"], "\xdf" => [0, "\x12D"], "\xe0" => [0, "\x12E"], "\xe1" => [0, "\x12F"], "\xe2" => [0, "\x12G"], "\xe3" => [0, "\x12H"], "\xe4" => [0, "\x12I"], "\xe5" => [0, "\x12J"], "\xe6" => [0, "\x12K"], "\xe7" => [0, "\x12L"], "\xe8" => [0, "\x12M"], "\xe9" => [0, "\x12N"], "\xea" => [0, "\x12O"], "\xeb" => [0, "\x12P"], "\xec" => [0, "\x12Q"], "\xed" => [0, "\x12R"], "\xee" => [0, "\x12S"], "\xef" => [0, "\x12T"], "\xf0" => [0, "\x12U"], "\xf1" => [0, "\x12V"], "\xf2" => [0, "\x12W"], "\xf3" => [0, "\x12Y"], "\xf4" => [0, "\x12j"], "\xf5" => [0, "\x12k"], "\xf6" => [0, "\x12q"], "\xf7" => [0, "\x12v"], "\xf8" => [0, "\x12w"], "\xf9" => [0, "\x12x"], "\xfa" => [0, "\x12y"], "\xfb" => [0, "\x12z"], "\xfc" => [82, "\x12"], "\xfd" => [87, "\x12"], "\xfe" => [130, "\x12"], "\xff" => [9, "\x12"]], ["\x00" => [94, "\x130"], "\x01" => [76, "\x130"], "\x02" => [104, "\x130"], "\x03" => [16, "\x130"], "\x04" => [94, "\x131"], "\x05" => [76, "\x131"], "\x06" => [104, "\x131"], "\x07" => [16, "\x131"], "\x08" => [94, "\x132"], "\t" => [76, "\x132"], "\n" => [104, "\x132"], "\v" => [16, "\x132"], "\f" => [94, "\x13a"], "\r" => [76, "\x13a"], "\x0e" => [104, "\x13a"], "\x0f" => [16, "\x13a"], "\x10" => [94, "\x13c"], "\x11" => [76, "\x13c"], "\x12" => [104, "\x13c"], "\x13" => [16, "\x13c"], "\x14" => [94, "\x13e"], "\x15" => [76, "\x13e"], "\x16" => [104, "\x13e"], "\x17" => [16, "\x13e"], "\x18" => [94, "\x13i"], "\x19" => [76, "\x13i"], "\x1a" => [104, "\x13i"], "\x1b" => [16, "\x13i"], "\x1c" => [94, "\x13o"], "\x1d" => [76, "\x13o"], "\x1e" => [104, "\x13o"], "\x1f" => [16, "\x13o"], " " => [94, "\x13s"], "!" => [76, "\x13s"], "\"" => [104, "\x13s"], "#" => [16, "\x13s"], "\$" => [94, "\x13t"], "%" => [76, "\x13t"], "&" => [104, "\x13t"], "'" => [16, "\x13t"], "(" => [77, "\x13 "], ")" => [18, "\x13 "], "*" => [77, "\x13%"], "+" => [18, "\x13%"], "," => [77, "\x13-"], "-" => [18, "\x13-"], "." => [77, "\x13."], "/" => [18, "\x13."], [77, "\x13/"], [18, "\x13/"], [77, "\x133"], [18, "\x133"], [77, "\x134"], [18, "\x134"], [77, "\x135"], [18, "\x135"], [77, "\x136"], [18, "\x136"], ":" => [77, "\x137"], ";" => [18, "\x137"], "<" => [77, "\x138"], "=" => [18, "\x138"], ">" => [77, "\x139"], "?" => [18, "\x139"], "@" => [77, "\x13="], "A" => [18, "\x13="], "B" => [77, "\x13A"], "C" => [18, "\x13A"], "D" => [77, "\x13_"], "E" => [18, "\x13_"], "F" => [77, "\x13b"], "G" => [18, "\x13b"], "H" => [77, "\x13d"], "I" => [18, "\x13d"], "J" => [77, "\x13f"], "K" => [18, "\x13f"], "L" => [77, "\x13g"], "M" => [18, "\x13g"], "N" => [77, "\x13h"], "O" => [18, "\x13h"], "P" => [77, "\x13l"], "Q" => [18, "\x13l"], "R" => [77, "\x13m"], "S" => [18, "\x13m"], "T" => [77, "\x13n"], "U" => [18, "\x13n"], "V" => [77, "\x13p"], "W" => [18, "\x13p"], "X" => [77, "\x13r"], "Y" => [18, "\x13r"], "Z" => [77, "\x13u"], "[" => [18, "\x13u"], "\\" => [0, "\x13:"], "]" => [0, "\x13B"], "^" => [0, "\x13C"], "_" => [0, "\x13D"], "`" => [0, "\x13E"], "a" => [0, "\x13F"], "b" => [0, "\x13G"], "c" => [0, "\x13H"], "d" => [0, "\x13I"], "e" => [0, "\x13J"], "f" => [0, "\x13K"], "g" => [0, "\x13L"], "h" => [0, "\x13M"], "i" => [0, "\x13N"], "j" => [0, "\x13O"], "k" => [0, "\x13P"], "l" => [0, "\x13Q"], "m" => [0, "\x13R"], "n" => [0, "\x13S"], "o" => [0, "\x13T"], "p" => [0, "\x13U"], "q" => [0, "\x13V"], "r" => [0, "\x13W"], "s" => [0, "\x13Y"], "t" => [0, "\x13j"], "u" => [0, "\x13k"], "v" => [0, "\x13q"], "w" => [0, "\x13v"], "x" => [0, "\x13w"], "y" => [0, "\x13x"], "z" => [0, "\x13y"], "{" => [0, "\x13z"], "|" => [82, "\x13"], "}" => [87, "\x13"], "~" => [130, "\x13"], "" => [9, "\x13"], "\x80" => [94, "\x140"], "\x81" => [76, "\x140"], "\x82" => [104, "\x140"], "\x83" => [16, "\x140"], "\x84" => [94, "\x141"], "\x85" => [76, "\x141"], "\x86" => [104, "\x141"], "\x87" => [16, "\x141"], "\x88" => [94, "\x142"], "\x89" => [76, "\x142"], "\x8a" => [104, "\x142"], "\x8b" => [16, "\x142"], "\x8c" => [94, "\x14a"], "\x8d" => [76, "\x14a"], "\x8e" => [104, "\x14a"], "\x8f" => [16, "\x14a"], "\x90" => [94, "\x14c"], "\x91" => [76, "\x14c"], "\x92" => [104, "\x14c"], "\x93" => [16, "\x14c"], "\x94" => [94, "\x14e"], "\x95" => [76, "\x14e"], "\x96" => [104, "\x14e"], "\x97" => [16, "\x14e"], "\x98" => [94, "\x14i"], "\x99" => [76, "\x14i"], "\x9a" => [104, "\x14i"], "\x9b" => [16, "\x14i"], "\x9c" => [94, "\x14o"], "\x9d" => [76, "\x14o"], "\x9e" => [104, "\x14o"], "\x9f" => [16, "\x14o"], "\xa0" => [94, "\x14s"], "\xa1" => [76, "\x14s"], "\xa2" => [104, "\x14s"], "\xa3" => [16, "\x14s"], "\xa4" => [94, "\x14t"], "\xa5" => [76, "\x14t"], "\xa6" => [104, "\x14t"], "\xa7" => [16, "\x14t"], "\xa8" => [77, "\x14 "], "\xa9" => [18, "\x14 "], "\xaa" => [77, "\x14%"], "\xab" => [18, "\x14%"], "\xac" => [77, "\x14-"], "\xad" => [18, "\x14-"], "\xae" => [77, "\x14."], "\xaf" => [18, "\x14."], "\xb0" => [77, "\x14/"], "\xb1" => [18, "\x14/"], "\xb2" => [77, "\x143"], "\xb3" => [18, "\x143"], "\xb4" => [77, "\x144"], "\xb5" => [18, "\x144"], "\xb6" => [77, "\x145"], "\xb7" => [18, "\x145"], "\xb8" => [77, "\x146"], "\xb9" => [18, "\x146"], "\xba" => [77, "\x147"], "\xbb" => [18, "\x147"], "\xbc" => [77, "\x148"], "\xbd" => [18, "\x148"], "\xbe" => [77, "\x149"], "\xbf" => [18, "\x149"], "\xc0" => [77, "\x14="], "\xc1" => [18, "\x14="], "\xc2" => [77, "\x14A"], "\xc3" => [18, "\x14A"], "\xc4" => [77, "\x14_"], "\xc5" => [18, "\x14_"], "\xc6" => [77, "\x14b"], "\xc7" => [18, "\x14b"], "\xc8" => [77, "\x14d"], "\xc9" => [18, "\x14d"], "\xca" => [77, "\x14f"], "\xcb" => [18, "\x14f"], "\xcc" => [77, "\x14g"], "\xcd" => [18, "\x14g"], "\xce" => [77, "\x14h"], "\xcf" => [18, "\x14h"], "\xd0" => [77, "\x14l"], "\xd1" => [18, "\x14l"], "\xd2" => [77, "\x14m"], "\xd3" => [18, "\x14m"], "\xd4" => [77, "\x14n"], "\xd5" => [18, "\x14n"], "\xd6" => [77, "\x14p"], "\xd7" => [18, "\x14p"], "\xd8" => [77, "\x14r"], "\xd9" => [18, "\x14r"], "\xda" => [77, "\x14u"], "\xdb" => [18, "\x14u"], "\xdc" => [0, "\x14:"], "\xdd" => [0, "\x14B"], "\xde" => [0, "\x14C"], "\xdf" => [0, "\x14D"], "\xe0" => [0, "\x14E"], "\xe1" => [0, "\x14F"], "\xe2" => [0, "\x14G"], "\xe3" => [0, "\x14H"], "\xe4" => [0, "\x14I"], "\xe5" => [0, "\x14J"], "\xe6" => [0, "\x14K"], "\xe7" => [0, "\x14L"], "\xe8" => [0, "\x14M"], "\xe9" => [0, "\x14N"], "\xea" => [0, "\x14O"], "\xeb" => [0, "\x14P"], "\xec" => [0, "\x14Q"], "\xed" => [0, "\x14R"], "\xee" => [0, "\x14S"], "\xef" => [0, "\x14T"], "\xf0" => [0, "\x14U"], "\xf1" => [0, "\x14V"], "\xf2" => [0, "\x14W"], "\xf3" => [0, "\x14Y"], "\xf4" => [0, "\x14j"], "\xf5" => [0, "\x14k"], "\xf6" => [0, "\x14q"], "\xf7" => [0, "\x14v"], "\xf8" => [0, "\x14w"], "\xf9" => [0, "\x14x"], "\xfa" => [0, "\x14y"], "\xfb" => [0, "\x14z"], "\xfc" => [82, "\x14"], "\xfd" => [87, "\x14"], "\xfe" => [130, "\x14"], "\xff" => [9, "\x14"]], ["\x00" => [77, "\x130"], "\x01" => [18, "\x130"], "\x02" => [77, "\x131"], "\x03" => [18, "\x131"], "\x04" => [77, "\x132"], "\x05" => [18, "\x132"], "\x06" => [77, "\x13a"], "\x07" => [18, "\x13a"], "\x08" => [77, "\x13c"], "\t" => [18, "\x13c"], "\n" => [77, "\x13e"], "\v" => [18, "\x13e"], "\f" => [77, "\x13i"], "\r" => [18, "\x13i"], "\x0e" => [77, "\x13o"], "\x0f" => [18, "\x13o"], "\x10" => [77, "\x13s"], "\x11" => [18, "\x13s"], "\x12" => [77, "\x13t"], "\x13" => [18, "\x13t"], "\x14" => [0, "\x13 "], "\x15" => [0, "\x13%"], "\x16" => [0, "\x13-"], "\x17" => [0, "\x13."], "\x18" => [0, "\x13/"], "\x19" => [0, "\x133"], "\x1a" => [0, "\x134"], "\x1b" => [0, "\x135"], "\x1c" => [0, "\x136"], "\x1d" => [0, "\x137"], "\x1e" => [0, "\x138"], "\x1f" => [0, "\x139"], " " => [0, "\x13="], "!" => [0, "\x13A"], "\"" => [0, "\x13_"], "#" => [0, "\x13b"], "\$" => [0, "\x13d"], "%" => [0, "\x13f"], "&" => [0, "\x13g"], "'" => [0, "\x13h"], "(" => [0, "\x13l"], ")" => [0, "\x13m"], "*" => [0, "\x13n"], "+" => [0, "\x13p"], "," => [0, "\x13r"], "-" => [0, "\x13u"], "." => [100, "\x13"], "/" => [110, "\x13"], [111, "\x13"], [115, "\x13"], [116, "\x13"], [118, "\x13"], [119, "\x13"], [122, "\x13"], [123, "\x13"], [125, "\x13"], [126, "\x13"], [129, "\x13"], ":" => [143, "\x13"], ";" => [148, "\x13"], "<" => [151, "\x13"], "=" => [153, "\x13"], ">" => [83, "\x13"], "?" => [10, "\x13"], "@" => [77, "\x140"], "A" => [18, "\x140"], "B" => [77, "\x141"], "C" => [18, "\x141"], "D" => [77, "\x142"], "E" => [18, "\x142"], "F" => [77, "\x14a"], "G" => [18, "\x14a"], "H" => [77, "\x14c"], "I" => [18, "\x14c"], "J" => [77, "\x14e"], "K" => [18, "\x14e"], "L" => [77, "\x14i"], "M" => [18, "\x14i"], "N" => [77, "\x14o"], "O" => [18, "\x14o"], "P" => [77, "\x14s"], "Q" => [18, "\x14s"], "R" => [77, "\x14t"], "S" => [18, "\x14t"], "T" => [0, "\x14 "], "U" => [0, "\x14%"], "V" => [0, "\x14-"], "W" => [0, "\x14."], "X" => [0, "\x14/"], "Y" => [0, "\x143"], "Z" => [0, "\x144"], "[" => [0, "\x145"], "\\" => [0, "\x146"], "]" => [0, "\x147"], "^" => [0, "\x148"], "_" => [0, "\x149"], "`" => [0, "\x14="], "a" => [0, "\x14A"], "b" => [0, "\x14_"], "c" => [0, "\x14b"], "d" => [0, "\x14d"], "e" => [0, "\x14f"], "f" => [0, "\x14g"], "g" => [0, "\x14h"], "h" => [0, "\x14l"], "i" => [0, "\x14m"], "j" => [0, "\x14n"], "k" => [0, "\x14p"], "l" => [0, "\x14r"], "m" => [0, "\x14u"], "n" => [100, "\x14"], "o" => [110, "\x14"], "p" => [111, "\x14"], "q" => [115, "\x14"], "r" => [116, "\x14"], "s" => [118, "\x14"], "t" => [119, "\x14"], "u" => [122, "\x14"], "v" => [123, "\x14"], "w" => [125, "\x14"], "x" => [126, "\x14"], "y" => [129, "\x14"], "z" => [143, "\x14"], "{" => [148, "\x14"], "|" => [151, "\x14"], "}" => [153, "\x14"], "~" => [83, "\x14"], "" => [10, "\x14"], "\x80" => [77, "\x150"], "\x81" => [18, "\x150"], "\x82" => [77, "\x151"], "\x83" => [18, "\x151"], "\x84" => [77, "\x152"], "\x85" => [18, "\x152"], "\x86" => [77, "\x15a"], "\x87" => [18, "\x15a"], "\x88" => [77, "\x15c"], "\x89" => [18, "\x15c"], "\x8a" => [77, "\x15e"], "\x8b" => [18, "\x15e"], "\x8c" => [77, "\x15i"], "\x8d" => [18, "\x15i"], "\x8e" => [77, "\x15o"], "\x8f" => [18, "\x15o"], "\x90" => [77, "\x15s"], "\x91" => [18, "\x15s"], "\x92" => [77, "\x15t"], "\x93" => [18, "\x15t"], "\x94" => [0, "\x15 "], "\x95" => [0, "\x15%"], "\x96" => [0, "\x15-"], "\x97" => [0, "\x15."], "\x98" => [0, "\x15/"], "\x99" => [0, "\x153"], "\x9a" => [0, "\x154"], "\x9b" => [0, "\x155"], "\x9c" => [0, "\x156"], "\x9d" => [0, "\x157"], "\x9e" => [0, "\x158"], "\x9f" => [0, "\x159"], "\xa0" => [0, "\x15="], "\xa1" => [0, "\x15A"], "\xa2" => [0, "\x15_"], "\xa3" => [0, "\x15b"], "\xa4" => [0, "\x15d"], "\xa5" => [0, "\x15f"], "\xa6" => [0, "\x15g"], "\xa7" => [0, "\x15h"], "\xa8" => [0, "\x15l"], "\xa9" => [0, "\x15m"], "\xaa" => [0, "\x15n"], "\xab" => [0, "\x15p"], "\xac" => [0, "\x15r"], "\xad" => [0, "\x15u"], "\xae" => [100, "\x15"], "\xaf" => [110, "\x15"], "\xb0" => [111, "\x15"], "\xb1" => [115, "\x15"], "\xb2" => [116, "\x15"], "\xb3" => [118, "\x15"], "\xb4" => [119, "\x15"], "\xb5" => [122, "\x15"], "\xb6" => [123, "\x15"], "\xb7" => [125, "\x15"], "\xb8" => [126, "\x15"], "\xb9" => [129, "\x15"], "\xba" => [143, "\x15"], "\xbb" => [148, "\x15"], "\xbc" => [151, "\x15"], "\xbd" => [153, "\x15"], "\xbe" => [83, "\x15"], "\xbf" => [10, "\x15"], "\xc0" => [77, "\x170"], "\xc1" => [18, "\x170"], "\xc2" => [77, "\x171"], "\xc3" => [18, "\x171"], "\xc4" => [77, "\x172"], "\xc5" => [18, "\x172"], "\xc6" => [77, "\x17a"], "\xc7" => [18, "\x17a"], "\xc8" => [77, "\x17c"], "\xc9" => [18, "\x17c"], "\xca" => [77, "\x17e"], "\xcb" => [18, "\x17e"], "\xcc" => [77, "\x17i"], "\xcd" => [18, "\x17i"], "\xce" => [77, "\x17o"], "\xcf" => [18, "\x17o"], "\xd0" => [77, "\x17s"], "\xd1" => [18, "\x17s"], "\xd2" => [77, "\x17t"], "\xd3" => [18, "\x17t"], "\xd4" => [0, "\x17 "], "\xd5" => [0, "\x17%"], "\xd6" => [0, "\x17-"], "\xd7" => [0, "\x17."], "\xd8" => [0, "\x17/"], "\xd9" => [0, "\x173"], "\xda" => [0, "\x174"], "\xdb" => [0, "\x175"], "\xdc" => [0, "\x176"], "\xdd" => [0, "\x177"], "\xde" => [0, "\x178"], "\xdf" => [0, "\x179"], "\xe0" => [0, "\x17="], "\xe1" => [0, "\x17A"], "\xe2" => [0, "\x17_"], "\xe3" => [0, "\x17b"], "\xe4" => [0, "\x17d"], "\xe5" => [0, "\x17f"], "\xe6" => [0, "\x17g"], "\xe7" => [0, "\x17h"], "\xe8" => [0, "\x17l"], "\xe9" => [0, "\x17m"], "\xea" => [0, "\x17n"], "\xeb" => [0, "\x17p"], "\xec" => [0, "\x17r"], "\xed" => [0, "\x17u"], "\xee" => [100, "\x17"], "\xef" => [110, "\x17"], "\xf0" => [111, "\x17"], "\xf1" => [115, "\x17"], "\xf2" => [116, "\x17"], "\xf3" => [118, "\x17"], "\xf4" => [119, "\x17"], "\xf5" => [122, "\x17"], "\xf6" => [123, "\x17"], "\xf7" => [125, "\x17"], "\xf8" => [126, "\x17"], "\xf9" => [129, "\x17"], "\xfa" => [143, "\x17"], "\xfb" => [148, "\x17"], "\xfc" => [151, "\x17"], "\xfd" => [153, "\x17"], "\xfe" => [83, "\x17"], "\xff" => [10, "\x17"]], ["\x00" => [0, "\x130"], "\x01" => [0, "\x131"], "\x02" => [0, "\x132"], "\x03" => [0, "\x13a"], "\x04" => [0, "\x13c"], "\x05" => [0, "\x13e"], "\x06" => [0, "\x13i"], "\x07" => [0, "\x13o"], "\x08" => [0, "\x13s"], "\t" => [0, "\x13t"], "\n" => [73, "\x13"], "\v" => [88, "\x13"], "\f" => [89, "\x13"], "\r" => [96, "\x13"], "\x0e" => [97, "\x13"], "\x0f" => [99, "\x13"], "\x10" => [106, "\x13"], "\x11" => [136, "\x13"], "\x12" => [139, "\x13"], "\x13" => [141, "\x13"], "\x14" => [145, "\x13"], "\x15" => [147, "\x13"], "\x16" => [149, "\x13"], "\x17" => [101, "\x13"], "\x18" => [112, "\x13"], "\x19" => [117, "\x13"], "\x1a" => [120, "\x13"], "\x1b" => [124, "\x13"], "\x1c" => [127, "\x13"], "\x1d" => [144, "\x13"], "\x1e" => [152, "\x13"], "\x1f" => [11, "\x13"], " " => [0, "\x140"], "!" => [0, "\x141"], "\"" => [0, "\x142"], "#" => [0, "\x14a"], "\$" => [0, "\x14c"], "%" => [0, "\x14e"], "&" => [0, "\x14i"], "'" => [0, "\x14o"], "(" => [0, "\x14s"], ")" => [0, "\x14t"], "*" => [73, "\x14"], "+" => [88, "\x14"], "," => [89, "\x14"], "-" => [96, "\x14"], "." => [97, "\x14"], "/" => [99, "\x14"], [106, "\x14"], [136, "\x14"], [139, "\x14"], [141, "\x14"], [145, "\x14"], [147, "\x14"], [149, "\x14"], [101, "\x14"], [112, "\x14"], [117, "\x14"], ":" => [120, "\x14"], ";" => [124, "\x14"], "<" => [127, "\x14"], "=" => [144, "\x14"], ">" => [152, "\x14"], "?" => [11, "\x14"], "@" => [0, "\x150"], "A" => [0, "\x151"], "B" => [0, "\x152"], "C" => [0, "\x15a"], "D" => [0, "\x15c"], "E" => [0, "\x15e"], "F" => [0, "\x15i"], "G" => [0, "\x15o"], "H" => [0, "\x15s"], "I" => [0, "\x15t"], "J" => [73, "\x15"], "K" => [88, "\x15"], "L" => [89, "\x15"], "M" => [96, "\x15"], "N" => [97, "\x15"], "O" => [99, "\x15"], "P" => [106, "\x15"], "Q" => [136, "\x15"], "R" => [139, "\x15"], "S" => [141, "\x15"], "T" => [145, "\x15"], "U" => [147, "\x15"], "V" => [149, "\x15"], "W" => [101, "\x15"], "X" => [112, "\x15"], "Y" => [117, "\x15"], "Z" => [120, "\x15"], "[" => [124, "\x15"], "\\" => [127, "\x15"], "]" => [144, "\x15"], "^" => [152, "\x15"], "_" => [11, "\x15"], "`" => [0, "\x170"], "a" => [0, "\x171"], "b" => [0, "\x172"], "c" => [0, "\x17a"], "d" => [0, "\x17c"], "e" => [0, "\x17e"], "f" => [0, "\x17i"], "g" => [0, "\x17o"], "h" => [0, "\x17s"], "i" => [0, "\x17t"], "j" => [73, "\x17"], "k" => [88, "\x17"], "l" => [89, "\x17"], "m" => [96, "\x17"], "n" => [97, "\x17"], "o" => [99, "\x17"], "p" => [106, "\x17"], "q" => [136, "\x17"], "r" => [139, "\x17"], "s" => [141, "\x17"], "t" => [145, "\x17"], "u" => [147, "\x17"], "v" => [149, "\x17"], "w" => [101, "\x17"], "x" => [112, "\x17"], "y" => [117, "\x17"], "z" => [120, "\x17"], "{" => [124, "\x17"], "|" => [127, "\x17"], "}" => [144, "\x17"], "~" => [152, "\x17"], "" => [11, "\x17"], "\x80" => [0, "\x180"], "\x81" => [0, "\x181"], "\x82" => [0, "\x182"], "\x83" => [0, "\x18a"], "\x84" => [0, "\x18c"], "\x85" => [0, "\x18e"], "\x86" => [0, "\x18i"], "\x87" => [0, "\x18o"], "\x88" => [0, "\x18s"], "\x89" => [0, "\x18t"], "\x8a" => [73, "\x18"], "\x8b" => [88, "\x18"], "\x8c" => [89, "\x18"], "\x8d" => [96, "\x18"], "\x8e" => [97, "\x18"], "\x8f" => [99, "\x18"], "\x90" => [106, "\x18"], "\x91" => [136, "\x18"], "\x92" => [139, "\x18"], "\x93" => [141, "\x18"], "\x94" => [145, "\x18"], "\x95" => [147, "\x18"], "\x96" => [149, "\x18"], "\x97" => [101, "\x18"], "\x98" => [112, "\x18"], "\x99" => [117, "\x18"], "\x9a" => [120, "\x18"], "\x9b" => [124, "\x18"], "\x9c" => [127, "\x18"], "\x9d" => [144, "\x18"], "\x9e" => [152, "\x18"], "\x9f" => [11, "\x18"], "\xa0" => [0, "\x190"], "\xa1" => [0, "\x191"], "\xa2" => [0, "\x192"], "\xa3" => [0, "\x19a"], "\xa4" => [0, "\x19c"], "\xa5" => [0, "\x19e"], "\xa6" => [0, "\x19i"], "\xa7" => [0, "\x19o"], "\xa8" => [0, "\x19s"], "\xa9" => [0, "\x19t"], "\xaa" => [73, "\x19"], "\xab" => [88, "\x19"], "\xac" => [89, "\x19"], "\xad" => [96, "\x19"], "\xae" => [97, "\x19"], "\xaf" => [99, "\x19"], "\xb0" => [106, "\x19"], "\xb1" => [136, "\x19"], "\xb2" => [139, "\x19"], "\xb3" => [141, "\x19"], "\xb4" => [145, "\x19"], "\xb5" => [147, "\x19"], "\xb6" => [149, "\x19"], "\xb7" => [101, "\x19"], "\xb8" => [112, "\x19"], "\xb9" => [117, "\x19"], "\xba" => [120, "\x19"], "\xbb" => [124, "\x19"], "\xbc" => [127, "\x19"], "\xbd" => [144, "\x19"], "\xbe" => [152, "\x19"], "\xbf" => [11, "\x19"], "\xc0" => [0, "\x1a0"], "\xc1" => [0, "\x1a1"], "\xc2" => [0, "\x1a2"], "\xc3" => [0, "\x1aa"], "\xc4" => [0, "\x1ac"], "\xc5" => [0, "\x1ae"], "\xc6" => [0, "\x1ai"], "\xc7" => [0, "\x1ao"], "\xc8" => [0, "\x1as"], "\xc9" => [0, "\x1at"], "\xca" => [73, "\x1a"], "\xcb" => [88, "\x1a"], "\xcc" => [89, "\x1a"], "\xcd" => [96, "\x1a"], "\xce" => [97, "\x1a"], "\xcf" => [99, "\x1a"], "\xd0" => [106, "\x1a"], "\xd1" => [136, "\x1a"], "\xd2" => [139, "\x1a"], "\xd3" => [141, "\x1a"], "\xd4" => [145, "\x1a"], "\xd5" => [147, "\x1a"], "\xd6" => [149, "\x1a"], "\xd7" => [101, "\x1a"], "\xd8" => [112, "\x1a"], "\xd9" => [117, "\x1a"], "\xda" => [120, "\x1a"], "\xdb" => [124, "\x1a"], "\xdc" => [127, "\x1a"], "\xdd" => [144, "\x1a"], "\xde" => [152, "\x1a"], "\xdf" => [11, "\x1a"], "\xe0" => [0, "\x1b0"], "\xe1" => [0, "\x1b1"], "\xe2" => [0, "\x1b2"], "\xe3" => [0, "\x1ba"], "\xe4" => [0, "\x1bc"], "\xe5" => [0, "\x1be"], "\xe6" => [0, "\x1bi"], "\xe7" => [0, "\x1bo"], "\xe8" => [0, "\x1bs"], "\xe9" => [0, "\x1bt"], "\xea" => [73, "\x1b"], "\xeb" => [88, "\x1b"], "\xec" => [89, "\x1b"], "\xed" => [96, "\x1b"], "\xee" => [97, "\x1b"], "\xef" => [99, "\x1b"], "\xf0" => [106, "\x1b"], "\xf1" => [136, "\x1b"], "\xf2" => [139, "\x1b"], "\xf3" => [141, "\x1b"], "\xf4" => [145, "\x1b"], "\xf5" => [147, "\x1b"], "\xf6" => [149, "\x1b"], "\xf7" => [101, "\x1b"], "\xf8" => [112, "\x1b"], "\xf9" => [117, "\x1b"], "\xfa" => [120, "\x1b"], "\xfb" => [124, "\x1b"], "\xfc" => [127, "\x1b"], "\xfd" => [144, "\x1b"], "\xfe" => [152, "\x1b"], "\xff" => [11, "\x1b"]], ["\x00" => [94, "\x150"], "\x01" => [76, "\x150"], "\x02" => [104, "\x150"], "\x03" => [16, "\x150"], "\x04" => [94, "\x151"], "\x05" => [76, "\x151"], "\x06" => [104, "\x151"], "\x07" => [16, "\x151"], "\x08" => [94, "\x152"], "\t" => [76, "\x152"], "\n" => [104, "\x152"], "\v" => [16, "\x152"], "\f" => [94, "\x15a"], "\r" => [76, "\x15a"], "\x0e" => [104, "\x15a"], "\x0f" => [16, "\x15a"], "\x10" => [94, "\x15c"], "\x11" => [76, "\x15c"], "\x12" => [104, "\x15c"], "\x13" => [16, "\x15c"], "\x14" => [94, "\x15e"], "\x15" => [76, "\x15e"], "\x16" => [104, "\x15e"], "\x17" => [16, "\x15e"], "\x18" => [94, "\x15i"], "\x19" => [76, "\x15i"], "\x1a" => [104, "\x15i"], "\x1b" => [16, "\x15i"], "\x1c" => [94, "\x15o"], "\x1d" => [76, "\x15o"], "\x1e" => [104, "\x15o"], "\x1f" => [16, "\x15o"], " " => [94, "\x15s"], "!" => [76, "\x15s"], "\"" => [104, "\x15s"], "#" => [16, "\x15s"], "\$" => [94, "\x15t"], "%" => [76, "\x15t"], "&" => [104, "\x15t"], "'" => [16, "\x15t"], "(" => [77, "\x15 "], ")" => [18, "\x15 "], "*" => [77, "\x15%"], "+" => [18, "\x15%"], "," => [77, "\x15-"], "-" => [18, "\x15-"], "." => [77, "\x15."], "/" => [18, "\x15."], [77, "\x15/"], [18, "\x15/"], [77, "\x153"], [18, "\x153"], [77, "\x154"], [18, "\x154"], [77, "\x155"], [18, "\x155"], [77, "\x156"], [18, "\x156"], ":" => [77, "\x157"], ";" => [18, "\x157"], "<" => [77, "\x158"], "=" => [18, "\x158"], ">" => [77, "\x159"], "?" => [18, "\x159"], "@" => [77, "\x15="], "A" => [18, "\x15="], "B" => [77, "\x15A"], "C" => [18, "\x15A"], "D" => [77, "\x15_"], "E" => [18, "\x15_"], "F" => [77, "\x15b"], "G" => [18, "\x15b"], "H" => [77, "\x15d"], "I" => [18, "\x15d"], "J" => [77, "\x15f"], "K" => [18, "\x15f"], "L" => [77, "\x15g"], "M" => [18, "\x15g"], "N" => [77, "\x15h"], "O" => [18, "\x15h"], "P" => [77, "\x15l"], "Q" => [18, "\x15l"], "R" => [77, "\x15m"], "S" => [18, "\x15m"], "T" => [77, "\x15n"], "U" => [18, "\x15n"], "V" => [77, "\x15p"], "W" => [18, "\x15p"], "X" => [77, "\x15r"], "Y" => [18, "\x15r"], "Z" => [77, "\x15u"], "[" => [18, "\x15u"], "\\" => [0, "\x15:"], "]" => [0, "\x15B"], "^" => [0, "\x15C"], "_" => [0, "\x15D"], "`" => [0, "\x15E"], "a" => [0, "\x15F"], "b" => [0, "\x15G"], "c" => [0, "\x15H"], "d" => [0, "\x15I"], "e" => [0, "\x15J"], "f" => [0, "\x15K"], "g" => [0, "\x15L"], "h" => [0, "\x15M"], "i" => [0, "\x15N"], "j" => [0, "\x15O"], "k" => [0, "\x15P"], "l" => [0, "\x15Q"], "m" => [0, "\x15R"], "n" => [0, "\x15S"], "o" => [0, "\x15T"], "p" => [0, "\x15U"], "q" => [0, "\x15V"], "r" => [0, "\x15W"], "s" => [0, "\x15Y"], "t" => [0, "\x15j"], "u" => [0, "\x15k"], "v" => [0, "\x15q"], "w" => [0, "\x15v"], "x" => [0, "\x15w"], "y" => [0, "\x15x"], "z" => [0, "\x15y"], "{" => [0, "\x15z"], "|" => [82, "\x15"], "}" => [87, "\x15"], "~" => [130, "\x15"], "" => [9, "\x15"], "\x80" => [94, "\x170"], "\x81" => [76, "\x170"], "\x82" => [104, "\x170"], "\x83" => [16, "\x170"], "\x84" => [94, "\x171"], "\x85" => [76, "\x171"], "\x86" => [104, "\x171"], "\x87" => [16, "\x171"], "\x88" => [94, "\x172"], "\x89" => [76, "\x172"], "\x8a" => [104, "\x172"], "\x8b" => [16, "\x172"], "\x8c" => [94, "\x17a"], "\x8d" => [76, "\x17a"], "\x8e" => [104, "\x17a"], "\x8f" => [16, "\x17a"], "\x90" => [94, "\x17c"], "\x91" => [76, "\x17c"], "\x92" => [104, "\x17c"], "\x93" => [16, "\x17c"], "\x94" => [94, "\x17e"], "\x95" => [76, "\x17e"], "\x96" => [104, "\x17e"], "\x97" => [16, "\x17e"], "\x98" => [94, "\x17i"], "\x99" => [76, "\x17i"], "\x9a" => [104, "\x17i"], "\x9b" => [16, "\x17i"], "\x9c" => [94, "\x17o"], "\x9d" => [76, "\x17o"], "\x9e" => [104, "\x17o"], "\x9f" => [16, "\x17o"], "\xa0" => [94, "\x17s"], "\xa1" => [76, "\x17s"], "\xa2" => [104, "\x17s"], "\xa3" => [16, "\x17s"], "\xa4" => [94, "\x17t"], "\xa5" => [76, "\x17t"], "\xa6" => [104, "\x17t"], "\xa7" => [16, "\x17t"], "\xa8" => [77, "\x17 "], "\xa9" => [18, "\x17 "], "\xaa" => [77, "\x17%"], "\xab" => [18, "\x17%"], "\xac" => [77, "\x17-"], "\xad" => [18, "\x17-"], "\xae" => [77, "\x17."], "\xaf" => [18, "\x17."], "\xb0" => [77, "\x17/"], "\xb1" => [18, "\x17/"], "\xb2" => [77, "\x173"], "\xb3" => [18, "\x173"], "\xb4" => [77, "\x174"], "\xb5" => [18, "\x174"], "\xb6" => [77, "\x175"], "\xb7" => [18, "\x175"], "\xb8" => [77, "\x176"], "\xb9" => [18, "\x176"], "\xba" => [77, "\x177"], "\xbb" => [18, "\x177"], "\xbc" => [77, "\x178"], "\xbd" => [18, "\x178"], "\xbe" => [77, "\x179"], "\xbf" => [18, "\x179"], "\xc0" => [77, "\x17="], "\xc1" => [18, "\x17="], "\xc2" => [77, "\x17A"], "\xc3" => [18, "\x17A"], "\xc4" => [77, "\x17_"], "\xc5" => [18, "\x17_"], "\xc6" => [77, "\x17b"], "\xc7" => [18, "\x17b"], "\xc8" => [77, "\x17d"], "\xc9" => [18, "\x17d"], "\xca" => [77, "\x17f"], "\xcb" => [18, "\x17f"], "\xcc" => [77, "\x17g"], "\xcd" => [18, "\x17g"], "\xce" => [77, "\x17h"], "\xcf" => [18, "\x17h"], "\xd0" => [77, "\x17l"], "\xd1" => [18, "\x17l"], "\xd2" => [77, "\x17m"], "\xd3" => [18, "\x17m"], "\xd4" => [77, "\x17n"], "\xd5" => [18, "\x17n"], "\xd6" => [77, "\x17p"], "\xd7" => [18, "\x17p"], "\xd8" => [77, "\x17r"], "\xd9" => [18, "\x17r"], "\xda" => [77, "\x17u"], "\xdb" => [18, "\x17u"], "\xdc" => [0, "\x17:"], "\xdd" => [0, "\x17B"], "\xde" => [0, "\x17C"], "\xdf" => [0, "\x17D"], "\xe0" => [0, "\x17E"], "\xe1" => [0, "\x17F"], "\xe2" => [0, "\x17G"], "\xe3" => [0, "\x17H"], "\xe4" => [0, "\x17I"], "\xe5" => [0, "\x17J"], "\xe6" => [0, "\x17K"], "\xe7" => [0, "\x17L"], "\xe8" => [0, "\x17M"], "\xe9" => [0, "\x17N"], "\xea" => [0, "\x17O"], "\xeb" => [0, "\x17P"], "\xec" => [0, "\x17Q"], "\xed" => [0, "\x17R"], "\xee" => [0, "\x17S"], "\xef" => [0, "\x17T"], "\xf0" => [0, "\x17U"], "\xf1" => [0, "\x17V"], "\xf2" => [0, "\x17W"], "\xf3" => [0, "\x17Y"], "\xf4" => [0, "\x17j"], "\xf5" => [0, "\x17k"], "\xf6" => [0, "\x17q"], "\xf7" => [0, "\x17v"], "\xf8" => [0, "\x17w"], "\xf9" => [0, "\x17x"], "\xfa" => [0, "\x17y"], "\xfb" => [0, "\x17z"], "\xfc" => [82, "\x17"], "\xfd" => [87, "\x17"], "\xfe" => [130, "\x17"], "\xff" => [9, "\x17"]], ["\x00" => [94, "\x160"], "\x01" => [76, "\x160"], "\x02" => [104, "\x160"], "\x03" => [16, "\x160"], "\x04" => [94, "\x161"], "\x05" => [76, "\x161"], "\x06" => [104, "\x161"], "\x07" => [16, "\x161"], "\x08" => [94, "\x162"], "\t" => [76, "\x162"], "\n" => [104, "\x162"], "\v" => [16, "\x162"], "\f" => [94, "\x16a"], "\r" => [76, "\x16a"], "\x0e" => [104, "\x16a"], "\x0f" => [16, "\x16a"], "\x10" => [94, "\x16c"], "\x11" => [76, "\x16c"], "\x12" => [104, "\x16c"], "\x13" => [16, "\x16c"], "\x14" => [94, "\x16e"], "\x15" => [76, "\x16e"], "\x16" => [104, "\x16e"], "\x17" => [16, "\x16e"], "\x18" => [94, "\x16i"], "\x19" => [76, "\x16i"], "\x1a" => [104, "\x16i"], "\x1b" => [16, "\x16i"], "\x1c" => [94, "\x16o"], "\x1d" => [76, "\x16o"], "\x1e" => [104, "\x16o"], "\x1f" => [16, "\x16o"], " " => [94, "\x16s"], "!" => [76, "\x16s"], "\"" => [104, "\x16s"], "#" => [16, "\x16s"], "\$" => [94, "\x16t"], "%" => [76, "\x16t"], "&" => [104, "\x16t"], "'" => [16, "\x16t"], "(" => [77, "\x16 "], ")" => [18, "\x16 "], "*" => [77, "\x16%"], "+" => [18, "\x16%"], "," => [77, "\x16-"], "-" => [18, "\x16-"], "." => [77, "\x16."], "/" => [18, "\x16."], [77, "\x16/"], [18, "\x16/"], [77, "\x163"], [18, "\x163"], [77, "\x164"], [18, "\x164"], [77, "\x165"], [18, "\x165"], [77, "\x166"], [18, "\x166"], ":" => [77, "\x167"], ";" => [18, "\x167"], "<" => [77, "\x168"], "=" => [18, "\x168"], ">" => [77, "\x169"], "?" => [18, "\x169"], "@" => [77, "\x16="], "A" => [18, "\x16="], "B" => [77, "\x16A"], "C" => [18, "\x16A"], "D" => [77, "\x16_"], "E" => [18, "\x16_"], "F" => [77, "\x16b"], "G" => [18, "\x16b"], "H" => [77, "\x16d"], "I" => [18, "\x16d"], "J" => [77, "\x16f"], "K" => [18, "\x16f"], "L" => [77, "\x16g"], "M" => [18, "\x16g"], "N" => [77, "\x16h"], "O" => [18, "\x16h"], "P" => [77, "\x16l"], "Q" => [18, "\x16l"], "R" => [77, "\x16m"], "S" => [18, "\x16m"], "T" => [77, "\x16n"], "U" => [18, "\x16n"], "V" => [77, "\x16p"], "W" => [18, "\x16p"], "X" => [77, "\x16r"], "Y" => [18, "\x16r"], "Z" => [77, "\x16u"], "[" => [18, "\x16u"], "\\" => [0, "\x16:"], "]" => [0, "\x16B"], "^" => [0, "\x16C"], "_" => [0, "\x16D"], "`" => [0, "\x16E"], "a" => [0, "\x16F"], "b" => [0, "\x16G"], "c" => [0, "\x16H"], "d" => [0, "\x16I"], "e" => [0, "\x16J"], "f" => [0, "\x16K"], "g" => [0, "\x16L"], "h" => [0, "\x16M"], "i" => [0, "\x16N"], "j" => [0, "\x16O"], "k" => [0, "\x16P"], "l" => [0, "\x16Q"], "m" => [0, "\x16R"], "n" => [0, "\x16S"], "o" => [0, "\x16T"], "p" => [0, "\x16U"], "q" => [0, "\x16V"], "r" => [0, "\x16W"], "s" => [0, "\x16Y"], "t" => [0, "\x16j"], "u" => [0, "\x16k"], "v" => [0, "\x16q"], "w" => [0, "\x16v"], "x" => [0, "\x16w"], "y" => [0, "\x16x"], "z" => [0, "\x16y"], "{" => [0, "\x16z"], "|" => [82, "\x16"], "}" => [87, "\x16"], "~" => [130, "\x16"], "" => [9, "\x16"], "\x80" => [94, ""], "\x81" => [76, ""], "\x82" => [104, ""], "\x83" => [16, ""], "\x84" => [94, ""], "\x85" => [76, ""], "\x86" => [104, ""], "\x87" => [16, ""], "\x88" => [94, ""], "\x89" => [76, ""], "\x8a" => [104, ""], "\x8b" => [16, ""], "\x8c" => [94, ""], "\x8d" => [76, ""], "\x8e" => [104, ""], "\x8f" => [16, ""], "\x90" => [94, ""], "\x91" => [76, ""], "\x92" => [104, ""], "\x93" => [16, ""], "\x94" => [94, ""], "\x95" => [76, ""], "\x96" => [104, ""], "\x97" => [16, ""], "\x98" => [94, ""], "\x99" => [76, ""], "\x9a" => [104, ""], "\x9b" => [16, ""], "\x9c" => [94, ""], "\x9d" => [76, ""], "\x9e" => [104, ""], "\x9f" => [16, ""], "\xa0" => [94, ""], "\xa1" => [76, ""], "\xa2" => [104, ""], "\xa3" => [16, ""], "\xa4" => [94, ""], "\xa5" => [76, ""], "\xa6" => [104, ""], "\xa7" => [16, ""], "\xa8" => [77, ""], "\xa9" => [18, ""], "\xaa" => [77, ""], "\xab" => [18, ""], "\xac" => [77, ""], "\xad" => [18, ""], "\xae" => [77, ""], "\xaf" => [18, ""], "\xb0" => [77, ""], "\xb1" => [18, ""], "\xb2" => [77, ""], "\xb3" => [18, ""], "\xb4" => [77, ""], "\xb5" => [18, ""], "\xb6" => [77, ""], "\xb7" => [18, ""], "\xb8" => [77, ""], "\xb9" => [18, ""], "\xba" => [77, ""], "\xbb" => [18, ""], "\xbc" => [77, ""], "\xbd" => [18, ""], "\xbe" => [77, ""], "\xbf" => [18, ""], "\xc0" => [77, ""], "\xc1" => [18, ""], "\xc2" => [77, ""], "\xc3" => [18, ""], "\xc4" => [77, ""], "\xc5" => [18, ""], "\xc6" => [77, ""], "\xc7" => [18, ""], "\xc8" => [77, ""], "\xc9" => [18, ""], "\xca" => [77, ""], "\xcb" => [18, ""], "\xcc" => [77, ""], "\xcd" => [18, ""], "\xce" => [77, ""], "\xcf" => [18, ""], "\xd0" => [77, ""], "\xd1" => [18, ""], "\xd2" => [77, ""], "\xd3" => [18, ""], "\xd4" => [77, ""], "\xd5" => [18, ""], "\xd6" => [77, ""], "\xd7" => [18, ""], "\xd8" => [77, ""], "\xd9" => [18, ""], "\xda" => [77, ""], "\xdb" => [18, ""], "\xdc" => [0, ""], "\xdd" => [0, ""], "\xde" => [0, ""], "\xdf" => [0, ""], "\xe0" => [0, ""], "\xe1" => [0, ""], "\xe2" => [0, ""], "\xe3" => [0, ""], "\xe4" => [0, ""], "\xe5" => [0, ""], "\xe6" => [0, ""], "\xe7" => [0, ""], "\xe8" => [0, ""], "\xe9" => [0, ""], "\xea" => [0, ""], "\xeb" => [0, ""], "\xec" => [0, ""], "\xed" => [0, ""], "\xee" => [0, ""], "\xef" => [0, ""], "\xf0" => [0, ""], "\xf1" => [0, ""], "\xf2" => [0, ""], "\xf3" => [0, ""], "\xf4" => [0, ""], "\xf5" => [0, ""], "\xf6" => [0, ""], "\xf7" => [0, ""], "\xf8" => [0, ""], "\xf9" => [0, ""], "\xfa" => [0, ""], "\xfb" => [0, ""], "\xfc" => [82, ""], "\xfd" => [87, ""], "\xfe" => [130, ""], "\xff" => [9, ""]], ["\x00" => [94, "\x180"], "\x01" => [76, "\x180"], "\x02" => [104, "\x180"], "\x03" => [16, "\x180"], "\x04" => [94, "\x181"], "\x05" => [76, "\x181"], "\x06" => [104, "\x181"], "\x07" => [16, "\x181"], "\x08" => [94, "\x182"], "\t" => [76, "\x182"], "\n" => [104, "\x182"], "\v" => [16, "\x182"], "\f" => [94, "\x18a"], "\r" => [76, "\x18a"], "\x0e" => [104, "\x18a"], "\x0f" => [16, "\x18a"], "\x10" => [94, "\x18c"], "\x11" => [76, "\x18c"], "\x12" => [104, "\x18c"], "\x13" => [16, "\x18c"], "\x14" => [94, "\x18e"], "\x15" => [76, "\x18e"], "\x16" => [104, "\x18e"], "\x17" => [16, "\x18e"], "\x18" => [94, "\x18i"], "\x19" => [76, "\x18i"], "\x1a" => [104, "\x18i"], "\x1b" => [16, "\x18i"], "\x1c" => [94, "\x18o"], "\x1d" => [76, "\x18o"], "\x1e" => [104, "\x18o"], "\x1f" => [16, "\x18o"], " " => [94, "\x18s"], "!" => [76, "\x18s"], "\"" => [104, "\x18s"], "#" => [16, "\x18s"], "\$" => [94, "\x18t"], "%" => [76, "\x18t"], "&" => [104, "\x18t"], "'" => [16, "\x18t"], "(" => [77, "\x18 "], ")" => [18, "\x18 "], "*" => [77, "\x18%"], "+" => [18, "\x18%"], "," => [77, "\x18-"], "-" => [18, "\x18-"], "." => [77, "\x18."], "/" => [18, "\x18."], [77, "\x18/"], [18, "\x18/"], [77, "\x183"], [18, "\x183"], [77, "\x184"], [18, "\x184"], [77, "\x185"], [18, "\x185"], [77, "\x186"], [18, "\x186"], ":" => [77, "\x187"], ";" => [18, "\x187"], "<" => [77, "\x188"], "=" => [18, "\x188"], ">" => [77, "\x189"], "?" => [18, "\x189"], "@" => [77, "\x18="], "A" => [18, "\x18="], "B" => [77, "\x18A"], "C" => [18, "\x18A"], "D" => [77, "\x18_"], "E" => [18, "\x18_"], "F" => [77, "\x18b"], "G" => [18, "\x18b"], "H" => [77, "\x18d"], "I" => [18, "\x18d"], "J" => [77, "\x18f"], "K" => [18, "\x18f"], "L" => [77, "\x18g"], "M" => [18, "\x18g"], "N" => [77, "\x18h"], "O" => [18, "\x18h"], "P" => [77, "\x18l"], "Q" => [18, "\x18l"], "R" => [77, "\x18m"], "S" => [18, "\x18m"], "T" => [77, "\x18n"], "U" => [18, "\x18n"], "V" => [77, "\x18p"], "W" => [18, "\x18p"], "X" => [77, "\x18r"], "Y" => [18, "\x18r"], "Z" => [77, "\x18u"], "[" => [18, "\x18u"], "\\" => [0, "\x18:"], "]" => [0, "\x18B"], "^" => [0, "\x18C"], "_" => [0, "\x18D"], "`" => [0, "\x18E"], "a" => [0, "\x18F"], "b" => [0, "\x18G"], "c" => [0, "\x18H"], "d" => [0, "\x18I"], "e" => [0, "\x18J"], "f" => [0, "\x18K"], "g" => [0, "\x18L"], "h" => [0, "\x18M"], "i" => [0, "\x18N"], "j" => [0, "\x18O"], "k" => [0, "\x18P"], "l" => [0, "\x18Q"], "m" => [0, "\x18R"], "n" => [0, "\x18S"], "o" => [0, "\x18T"], "p" => [0, "\x18U"], "q" => [0, "\x18V"], "r" => [0, "\x18W"], "s" => [0, "\x18Y"], "t" => [0, "\x18j"], "u" => [0, "\x18k"], "v" => [0, "\x18q"], "w" => [0, "\x18v"], "x" => [0, "\x18w"], "y" => [0, "\x18x"], "z" => [0, "\x18y"], "{" => [0, "\x18z"], "|" => [82, "\x18"], "}" => [87, "\x18"], "~" => [130, "\x18"], "" => [9, "\x18"], "\x80" => [94, "\x190"], "\x81" => [76, "\x190"], "\x82" => [104, "\x190"], "\x83" => [16, "\x190"], "\x84" => [94, "\x191"], "\x85" => [76, "\x191"], "\x86" => [104, "\x191"], "\x87" => [16, "\x191"], "\x88" => [94, "\x192"], "\x89" => [76, "\x192"], "\x8a" => [104, "\x192"], "\x8b" => [16, "\x192"], "\x8c" => [94, "\x19a"], "\x8d" => [76, "\x19a"], "\x8e" => [104, "\x19a"], "\x8f" => [16, "\x19a"], "\x90" => [94, "\x19c"], "\x91" => [76, "\x19c"], "\x92" => [104, "\x19c"], "\x93" => [16, "\x19c"], "\x94" => [94, "\x19e"], "\x95" => [76, "\x19e"], "\x96" => [104, "\x19e"], "\x97" => [16, "\x19e"], "\x98" => [94, "\x19i"], "\x99" => [76, "\x19i"], "\x9a" => [104, "\x19i"], "\x9b" => [16, "\x19i"], "\x9c" => [94, "\x19o"], "\x9d" => [76, "\x19o"], "\x9e" => [104, "\x19o"], "\x9f" => [16, "\x19o"], "\xa0" => [94, "\x19s"], "\xa1" => [76, "\x19s"], "\xa2" => [104, "\x19s"], "\xa3" => [16, "\x19s"], "\xa4" => [94, "\x19t"], "\xa5" => [76, "\x19t"], "\xa6" => [104, "\x19t"], "\xa7" => [16, "\x19t"], "\xa8" => [77, "\x19 "], "\xa9" => [18, "\x19 "], "\xaa" => [77, "\x19%"], "\xab" => [18, "\x19%"], "\xac" => [77, "\x19-"], "\xad" => [18, "\x19-"], "\xae" => [77, "\x19."], "\xaf" => [18, "\x19."], "\xb0" => [77, "\x19/"], "\xb1" => [18, "\x19/"], "\xb2" => [77, "\x193"], "\xb3" => [18, "\x193"], "\xb4" => [77, "\x194"], "\xb5" => [18, "\x194"], "\xb6" => [77, "\x195"], "\xb7" => [18, "\x195"], "\xb8" => [77, "\x196"], "\xb9" => [18, "\x196"], "\xba" => [77, "\x197"], "\xbb" => [18, "\x197"], "\xbc" => [77, "\x198"], "\xbd" => [18, "\x198"], "\xbe" => [77, "\x199"], "\xbf" => [18, "\x199"], "\xc0" => [77, "\x19="], "\xc1" => [18, "\x19="], "\xc2" => [77, "\x19A"], "\xc3" => [18, "\x19A"], "\xc4" => [77, "\x19_"], "\xc5" => [18, "\x19_"], "\xc6" => [77, "\x19b"], "\xc7" => [18, "\x19b"], "\xc8" => [77, "\x19d"], "\xc9" => [18, "\x19d"], "\xca" => [77, "\x19f"], "\xcb" => [18, "\x19f"], "\xcc" => [77, "\x19g"], "\xcd" => [18, "\x19g"], "\xce" => [77, "\x19h"], "\xcf" => [18, "\x19h"], "\xd0" => [77, "\x19l"], "\xd1" => [18, "\x19l"], "\xd2" => [77, "\x19m"], "\xd3" => [18, "\x19m"], "\xd4" => [77, "\x19n"], "\xd5" => [18, "\x19n"], "\xd6" => [77, "\x19p"], "\xd7" => [18, "\x19p"], "\xd8" => [77, "\x19r"], "\xd9" => [18, "\x19r"], "\xda" => [77, "\x19u"], "\xdb" => [18, "\x19u"], "\xdc" => [0, "\x19:"], "\xdd" => [0, "\x19B"], "\xde" => [0, "\x19C"], "\xdf" => [0, "\x19D"], "\xe0" => [0, "\x19E"], "\xe1" => [0, "\x19F"], "\xe2" => [0, "\x19G"], "\xe3" => [0, "\x19H"], "\xe4" => [0, "\x19I"], "\xe5" => [0, "\x19J"], "\xe6" => [0, "\x19K"], "\xe7" => [0, "\x19L"], "\xe8" => [0, "\x19M"], "\xe9" => [0, "\x19N"], "\xea" => [0, "\x19O"], "\xeb" => [0, "\x19P"], "\xec" => [0, "\x19Q"], "\xed" => [0, "\x19R"], "\xee" => [0, "\x19S"], "\xef" => [0, "\x19T"], "\xf0" => [0, "\x19U"], "\xf1" => [0, "\x19V"], "\xf2" => [0, "\x19W"], "\xf3" => [0, "\x19Y"], "\xf4" => [0, "\x19j"], "\xf5" => [0, "\x19k"], "\xf6" => [0, "\x19q"], "\xf7" => [0, "\x19v"], "\xf8" => [0, "\x19w"], "\xf9" => [0, "\x19x"], "\xfa" => [0, "\x19y"], "\xfb" => [0, "\x19z"], "\xfc" => [82, "\x19"], "\xfd" => [87, "\x19"], "\xfe" => [130, "\x19"], "\xff" => [9, "\x19"]], ["\x00" => [77, "\x180"], "\x01" => [18, "\x180"], "\x02" => [77, "\x181"], "\x03" => [18, "\x181"], "\x04" => [77, "\x182"], "\x05" => [18, "\x182"], "\x06" => [77, "\x18a"], "\x07" => [18, "\x18a"], "\x08" => [77, "\x18c"], "\t" => [18, "\x18c"], "\n" => [77, "\x18e"], "\v" => [18, "\x18e"], "\f" => [77, "\x18i"], "\r" => [18, "\x18i"], "\x0e" => [77, "\x18o"], "\x0f" => [18, "\x18o"], "\x10" => [77, "\x18s"], "\x11" => [18, "\x18s"], "\x12" => [77, "\x18t"], "\x13" => [18, "\x18t"], "\x14" => [0, "\x18 "], "\x15" => [0, "\x18%"], "\x16" => [0, "\x18-"], "\x17" => [0, "\x18."], "\x18" => [0, "\x18/"], "\x19" => [0, "\x183"], "\x1a" => [0, "\x184"], "\x1b" => [0, "\x185"], "\x1c" => [0, "\x186"], "\x1d" => [0, "\x187"], "\x1e" => [0, "\x188"], "\x1f" => [0, "\x189"], " " => [0, "\x18="], "!" => [0, "\x18A"], "\"" => [0, "\x18_"], "#" => [0, "\x18b"], "\$" => [0, "\x18d"], "%" => [0, "\x18f"], "&" => [0, "\x18g"], "'" => [0, "\x18h"], "(" => [0, "\x18l"], ")" => [0, "\x18m"], "*" => [0, "\x18n"], "+" => [0, "\x18p"], "," => [0, "\x18r"], "-" => [0, "\x18u"], "." => [100, "\x18"], "/" => [110, "\x18"], [111, "\x18"], [115, "\x18"], [116, "\x18"], [118, "\x18"], [119, "\x18"], [122, "\x18"], [123, "\x18"], [125, "\x18"], [126, "\x18"], [129, "\x18"], ":" => [143, "\x18"], ";" => [148, "\x18"], "<" => [151, "\x18"], "=" => [153, "\x18"], ">" => [83, "\x18"], "?" => [10, "\x18"], "@" => [77, "\x190"], "A" => [18, "\x190"], "B" => [77, "\x191"], "C" => [18, "\x191"], "D" => [77, "\x192"], "E" => [18, "\x192"], "F" => [77, "\x19a"], "G" => [18, "\x19a"], "H" => [77, "\x19c"], "I" => [18, "\x19c"], "J" => [77, "\x19e"], "K" => [18, "\x19e"], "L" => [77, "\x19i"], "M" => [18, "\x19i"], "N" => [77, "\x19o"], "O" => [18, "\x19o"], "P" => [77, "\x19s"], "Q" => [18, "\x19s"], "R" => [77, "\x19t"], "S" => [18, "\x19t"], "T" => [0, "\x19 "], "U" => [0, "\x19%"], "V" => [0, "\x19-"], "W" => [0, "\x19."], "X" => [0, "\x19/"], "Y" => [0, "\x193"], "Z" => [0, "\x194"], "[" => [0, "\x195"], "\\" => [0, "\x196"], "]" => [0, "\x197"], "^" => [0, "\x198"], "_" => [0, "\x199"], "`" => [0, "\x19="], "a" => [0, "\x19A"], "b" => [0, "\x19_"], "c" => [0, "\x19b"], "d" => [0, "\x19d"], "e" => [0, "\x19f"], "f" => [0, "\x19g"], "g" => [0, "\x19h"], "h" => [0, "\x19l"], "i" => [0, "\x19m"], "j" => [0, "\x19n"], "k" => [0, "\x19p"], "l" => [0, "\x19r"], "m" => [0, "\x19u"], "n" => [100, "\x19"], "o" => [110, "\x19"], "p" => [111, "\x19"], "q" => [115, "\x19"], "r" => [116, "\x19"], "s" => [118, "\x19"], "t" => [119, "\x19"], "u" => [122, "\x19"], "v" => [123, "\x19"], "w" => [125, "\x19"], "x" => [126, "\x19"], "y" => [129, "\x19"], "z" => [143, "\x19"], "{" => [148, "\x19"], "|" => [151, "\x19"], "}" => [153, "\x19"], "~" => [83, "\x19"], "" => [10, "\x19"], "\x80" => [77, "\x1a0"], "\x81" => [18, "\x1a0"], "\x82" => [77, "\x1a1"], "\x83" => [18, "\x1a1"], "\x84" => [77, "\x1a2"], "\x85" => [18, "\x1a2"], "\x86" => [77, "\x1aa"], "\x87" => [18, "\x1aa"], "\x88" => [77, "\x1ac"], "\x89" => [18, "\x1ac"], "\x8a" => [77, "\x1ae"], "\x8b" => [18, "\x1ae"], "\x8c" => [77, "\x1ai"], "\x8d" => [18, "\x1ai"], "\x8e" => [77, "\x1ao"], "\x8f" => [18, "\x1ao"], "\x90" => [77, "\x1as"], "\x91" => [18, "\x1as"], "\x92" => [77, "\x1at"], "\x93" => [18, "\x1at"], "\x94" => [0, "\x1a "], "\x95" => [0, "\x1a%"], "\x96" => [0, "\x1a-"], "\x97" => [0, "\x1a."], "\x98" => [0, "\x1a/"], "\x99" => [0, "\x1a3"], "\x9a" => [0, "\x1a4"], "\x9b" => [0, "\x1a5"], "\x9c" => [0, "\x1a6"], "\x9d" => [0, "\x1a7"], "\x9e" => [0, "\x1a8"], "\x9f" => [0, "\x1a9"], "\xa0" => [0, "\x1a="], "\xa1" => [0, "\x1aA"], "\xa2" => [0, "\x1a_"], "\xa3" => [0, "\x1ab"], "\xa4" => [0, "\x1ad"], "\xa5" => [0, "\x1af"], "\xa6" => [0, "\x1ag"], "\xa7" => [0, "\x1ah"], "\xa8" => [0, "\x1al"], "\xa9" => [0, "\x1am"], "\xaa" => [0, "\x1an"], "\xab" => [0, "\x1ap"], "\xac" => [0, "\x1ar"], "\xad" => [0, "\x1au"], "\xae" => [100, "\x1a"], "\xaf" => [110, "\x1a"], "\xb0" => [111, "\x1a"], "\xb1" => [115, "\x1a"], "\xb2" => [116, "\x1a"], "\xb3" => [118, "\x1a"], "\xb4" => [119, "\x1a"], "\xb5" => [122, "\x1a"], "\xb6" => [123, "\x1a"], "\xb7" => [125, "\x1a"], "\xb8" => [126, "\x1a"], "\xb9" => [129, "\x1a"], "\xba" => [143, "\x1a"], "\xbb" => [148, "\x1a"], "\xbc" => [151, "\x1a"], "\xbd" => [153, "\x1a"], "\xbe" => [83, "\x1a"], "\xbf" => [10, "\x1a"], "\xc0" => [77, "\x1b0"], "\xc1" => [18, "\x1b0"], "\xc2" => [77, "\x1b1"], "\xc3" => [18, "\x1b1"], "\xc4" => [77, "\x1b2"], "\xc5" => [18, "\x1b2"], "\xc6" => [77, "\x1ba"], "\xc7" => [18, "\x1ba"], "\xc8" => [77, "\x1bc"], "\xc9" => [18, "\x1bc"], "\xca" => [77, "\x1be"], "\xcb" => [18, "\x1be"], "\xcc" => [77, "\x1bi"], "\xcd" => [18, "\x1bi"], "\xce" => [77, "\x1bo"], "\xcf" => [18, "\x1bo"], "\xd0" => [77, "\x1bs"], "\xd1" => [18, "\x1bs"], "\xd2" => [77, "\x1bt"], "\xd3" => [18, "\x1bt"], "\xd4" => [0, "\x1b "], "\xd5" => [0, "\x1b%"], "\xd6" => [0, "\x1b-"], "\xd7" => [0, "\x1b."], "\xd8" => [0, "\x1b/"], "\xd9" => [0, "\x1b3"], "\xda" => [0, "\x1b4"], "\xdb" => [0, "\x1b5"], "\xdc" => [0, "\x1b6"], "\xdd" => [0, "\x1b7"], "\xde" => [0, "\x1b8"], "\xdf" => [0, "\x1b9"], "\xe0" => [0, "\x1b="], "\xe1" => [0, "\x1bA"], "\xe2" => [0, "\x1b_"], "\xe3" => [0, "\x1bb"], "\xe4" => [0, "\x1bd"], "\xe5" => [0, "\x1bf"], "\xe6" => [0, "\x1bg"], "\xe7" => [0, "\x1bh"], "\xe8" => [0, "\x1bl"], "\xe9" => [0, "\x1bm"], "\xea" => [0, "\x1bn"], "\xeb" => [0, "\x1bp"], "\xec" => [0, "\x1br"], "\xed" => [0, "\x1bu"], "\xee" => [100, "\x1b"], "\xef" => [110, "\x1b"], "\xf0" => [111, "\x1b"], "\xf1" => [115, "\x1b"], "\xf2" => [116, "\x1b"], "\xf3" => [118, "\x1b"], "\xf4" => [119, "\x1b"], "\xf5" => [122, "\x1b"], "\xf6" => [123, "\x1b"], "\xf7" => [125, "\x1b"], "\xf8" => [126, "\x1b"], "\xf9" => [129, "\x1b"], "\xfa" => [143, "\x1b"], "\xfb" => [148, "\x1b"], "\xfc" => [151, "\x1b"], "\xfd" => [153, "\x1b"], "\xfe" => [83, "\x1b"], "\xff" => [10, "\x1b"]], ["\x00" => [94, "\x1a0"], "\x01" => [76, "\x1a0"], "\x02" => [104, "\x1a0"], "\x03" => [16, "\x1a0"], "\x04" => [94, "\x1a1"], "\x05" => [76, "\x1a1"], "\x06" => [104, "\x1a1"], "\x07" => [16, "\x1a1"], "\x08" => [94, "\x1a2"], "\t" => [76, "\x1a2"], "\n" => [104, "\x1a2"], "\v" => [16, "\x1a2"], "\f" => [94, "\x1aa"], "\r" => [76, "\x1aa"], "\x0e" => [104, "\x1aa"], "\x0f" => [16, "\x1aa"], "\x10" => [94, "\x1ac"], "\x11" => [76, "\x1ac"], "\x12" => [104, "\x1ac"], "\x13" => [16, "\x1ac"], "\x14" => [94, "\x1ae"], "\x15" => [76, "\x1ae"], "\x16" => [104, "\x1ae"], "\x17" => [16, "\x1ae"], "\x18" => [94, "\x1ai"], "\x19" => [76, "\x1ai"], "\x1a" => [104, "\x1ai"], "\x1b" => [16, "\x1ai"], "\x1c" => [94, "\x1ao"], "\x1d" => [76, "\x1ao"], "\x1e" => [104, "\x1ao"], "\x1f" => [16, "\x1ao"], " " => [94, "\x1as"], "!" => [76, "\x1as"], "\"" => [104, "\x1as"], "#" => [16, "\x1as"], "\$" => [94, "\x1at"], "%" => [76, "\x1at"], "&" => [104, "\x1at"], "'" => [16, "\x1at"], "(" => [77, "\x1a "], ")" => [18, "\x1a "], "*" => [77, "\x1a%"], "+" => [18, "\x1a%"], "," => [77, "\x1a-"], "-" => [18, "\x1a-"], "." => [77, "\x1a."], "/" => [18, "\x1a."], [77, "\x1a/"], [18, "\x1a/"], [77, "\x1a3"], [18, "\x1a3"], [77, "\x1a4"], [18, "\x1a4"], [77, "\x1a5"], [18, "\x1a5"], [77, "\x1a6"], [18, "\x1a6"], ":" => [77, "\x1a7"], ";" => [18, "\x1a7"], "<" => [77, "\x1a8"], "=" => [18, "\x1a8"], ">" => [77, "\x1a9"], "?" => [18, "\x1a9"], "@" => [77, "\x1a="], "A" => [18, "\x1a="], "B" => [77, "\x1aA"], "C" => [18, "\x1aA"], "D" => [77, "\x1a_"], "E" => [18, "\x1a_"], "F" => [77, "\x1ab"], "G" => [18, "\x1ab"], "H" => [77, "\x1ad"], "I" => [18, "\x1ad"], "J" => [77, "\x1af"], "K" => [18, "\x1af"], "L" => [77, "\x1ag"], "M" => [18, "\x1ag"], "N" => [77, "\x1ah"], "O" => [18, "\x1ah"], "P" => [77, "\x1al"], "Q" => [18, "\x1al"], "R" => [77, "\x1am"], "S" => [18, "\x1am"], "T" => [77, "\x1an"], "U" => [18, "\x1an"], "V" => [77, "\x1ap"], "W" => [18, "\x1ap"], "X" => [77, "\x1ar"], "Y" => [18, "\x1ar"], "Z" => [77, "\x1au"], "[" => [18, "\x1au"], "\\" => [0, "\x1a:"], "]" => [0, "\x1aB"], "^" => [0, "\x1aC"], "_" => [0, "\x1aD"], "`" => [0, "\x1aE"], "a" => [0, "\x1aF"], "b" => [0, "\x1aG"], "c" => [0, "\x1aH"], "d" => [0, "\x1aI"], "e" => [0, "\x1aJ"], "f" => [0, "\x1aK"], "g" => [0, "\x1aL"], "h" => [0, "\x1aM"], "i" => [0, "\x1aN"], "j" => [0, "\x1aO"], "k" => [0, "\x1aP"], "l" => [0, "\x1aQ"], "m" => [0, "\x1aR"], "n" => [0, "\x1aS"], "o" => [0, "\x1aT"], "p" => [0, "\x1aU"], "q" => [0, "\x1aV"], "r" => [0, "\x1aW"], "s" => [0, "\x1aY"], "t" => [0, "\x1aj"], "u" => [0, "\x1ak"], "v" => [0, "\x1aq"], "w" => [0, "\x1av"], "x" => [0, "\x1aw"], "y" => [0, "\x1ax"], "z" => [0, "\x1ay"], "{" => [0, "\x1az"], "|" => [82, "\x1a"], "}" => [87, "\x1a"], "~" => [130, "\x1a"], "" => [9, "\x1a"], "\x80" => [94, "\x1b0"], "\x81" => [76, "\x1b0"], "\x82" => [104, "\x1b0"], "\x83" => [16, "\x1b0"], "\x84" => [94, "\x1b1"], "\x85" => [76, "\x1b1"], "\x86" => [104, "\x1b1"], "\x87" => [16, "\x1b1"], "\x88" => [94, "\x1b2"], "\x89" => [76, "\x1b2"], "\x8a" => [104, "\x1b2"], "\x8b" => [16, "\x1b2"], "\x8c" => [94, "\x1ba"], "\x8d" => [76, "\x1ba"], "\x8e" => [104, "\x1ba"], "\x8f" => [16, "\x1ba"], "\x90" => [94, "\x1bc"], "\x91" => [76, "\x1bc"], "\x92" => [104, "\x1bc"], "\x93" => [16, "\x1bc"], "\x94" => [94, "\x1be"], "\x95" => [76, "\x1be"], "\x96" => [104, "\x1be"], "\x97" => [16, "\x1be"], "\x98" => [94, "\x1bi"], "\x99" => [76, "\x1bi"], "\x9a" => [104, "\x1bi"], "\x9b" => [16, "\x1bi"], "\x9c" => [94, "\x1bo"], "\x9d" => [76, "\x1bo"], "\x9e" => [104, "\x1bo"], "\x9f" => [16, "\x1bo"], "\xa0" => [94, "\x1bs"], "\xa1" => [76, "\x1bs"], "\xa2" => [104, "\x1bs"], "\xa3" => [16, "\x1bs"], "\xa4" => [94, "\x1bt"], "\xa5" => [76, "\x1bt"], "\xa6" => [104, "\x1bt"], "\xa7" => [16, "\x1bt"], "\xa8" => [77, "\x1b "], "\xa9" => [18, "\x1b "], "\xaa" => [77, "\x1b%"], "\xab" => [18, "\x1b%"], "\xac" => [77, "\x1b-"], "\xad" => [18, "\x1b-"], "\xae" => [77, "\x1b."], "\xaf" => [18, "\x1b."], "\xb0" => [77, "\x1b/"], "\xb1" => [18, "\x1b/"], "\xb2" => [77, "\x1b3"], "\xb3" => [18, "\x1b3"], "\xb4" => [77, "\x1b4"], "\xb5" => [18, "\x1b4"], "\xb6" => [77, "\x1b5"], "\xb7" => [18, "\x1b5"], "\xb8" => [77, "\x1b6"], "\xb9" => [18, "\x1b6"], "\xba" => [77, "\x1b7"], "\xbb" => [18, "\x1b7"], "\xbc" => [77, "\x1b8"], "\xbd" => [18, "\x1b8"], "\xbe" => [77, "\x1b9"], "\xbf" => [18, "\x1b9"], "\xc0" => [77, "\x1b="], "\xc1" => [18, "\x1b="], "\xc2" => [77, "\x1bA"], "\xc3" => [18, "\x1bA"], "\xc4" => [77, "\x1b_"], "\xc5" => [18, "\x1b_"], "\xc6" => [77, "\x1bb"], "\xc7" => [18, "\x1bb"], "\xc8" => [77, "\x1bd"], "\xc9" => [18, "\x1bd"], "\xca" => [77, "\x1bf"], "\xcb" => [18, "\x1bf"], "\xcc" => [77, "\x1bg"], "\xcd" => [18, "\x1bg"], "\xce" => [77, "\x1bh"], "\xcf" => [18, "\x1bh"], "\xd0" => [77, "\x1bl"], "\xd1" => [18, "\x1bl"], "\xd2" => [77, "\x1bm"], "\xd3" => [18, "\x1bm"], "\xd4" => [77, "\x1bn"], "\xd5" => [18, "\x1bn"], "\xd6" => [77, "\x1bp"], "\xd7" => [18, "\x1bp"], "\xd8" => [77, "\x1br"], "\xd9" => [18, "\x1br"], "\xda" => [77, "\x1bu"], "\xdb" => [18, "\x1bu"], "\xdc" => [0, "\x1b:"], "\xdd" => [0, "\x1bB"], "\xde" => [0, "\x1bC"], "\xdf" => [0, "\x1bD"], "\xe0" => [0, "\x1bE"], "\xe1" => [0, "\x1bF"], "\xe2" => [0, "\x1bG"], "\xe3" => [0, "\x1bH"], "\xe4" => [0, "\x1bI"], "\xe5" => [0, "\x1bJ"], "\xe6" => [0, "\x1bK"], "\xe7" => [0, "\x1bL"], "\xe8" => [0, "\x1bM"], "\xe9" => [0, "\x1bN"], "\xea" => [0, "\x1bO"], "\xeb" => [0, "\x1bP"], "\xec" => [0, "\x1bQ"], "\xed" => [0, "\x1bR"], "\xee" => [0, "\x1bS"], "\xef" => [0, "\x1bT"], "\xf0" => [0, "\x1bU"], "\xf1" => [0, "\x1bV"], "\xf2" => [0, "\x1bW"], "\xf3" => [0, "\x1bY"], "\xf4" => [0, "\x1bj"], "\xf5" => [0, "\x1bk"], "\xf6" => [0, "\x1bq"], "\xf7" => [0, "\x1bv"], "\xf8" => [0, "\x1bw"], "\xf9" => [0, "\x1bx"], "\xfa" => [0, "\x1by"], "\xfb" => [0, "\x1bz"], "\xfc" => [82, "\x1b"], "\xfd" => [87, "\x1b"], "\xfe" => [130, "\x1b"], "\xff" => [9, "\x1b"]], ["\x00" => [94, "\x1c0"], "\x01" => [76, "\x1c0"], "\x02" => [104, "\x1c0"], "\x03" => [16, "\x1c0"], "\x04" => [94, "\x1c1"], "\x05" => [76, "\x1c1"], "\x06" => [104, "\x1c1"], "\x07" => [16, "\x1c1"], "\x08" => [94, "\x1c2"], "\t" => [76, "\x1c2"], "\n" => [104, "\x1c2"], "\v" => [16, "\x1c2"], "\f" => [94, "\x1ca"], "\r" => [76, "\x1ca"], "\x0e" => [104, "\x1ca"], "\x0f" => [16, "\x1ca"], "\x10" => [94, "\x1cc"], "\x11" => [76, "\x1cc"], "\x12" => [104, "\x1cc"], "\x13" => [16, "\x1cc"], "\x14" => [94, "\x1ce"], "\x15" => [76, "\x1ce"], "\x16" => [104, "\x1ce"], "\x17" => [16, "\x1ce"], "\x18" => [94, "\x1ci"], "\x19" => [76, "\x1ci"], "\x1a" => [104, "\x1ci"], "\x1b" => [16, "\x1ci"], "\x1c" => [94, "\x1co"], "\x1d" => [76, "\x1co"], "\x1e" => [104, "\x1co"], "\x1f" => [16, "\x1co"], " " => [94, "\x1cs"], "!" => [76, "\x1cs"], "\"" => [104, "\x1cs"], "#" => [16, "\x1cs"], "\$" => [94, "\x1ct"], "%" => [76, "\x1ct"], "&" => [104, "\x1ct"], "'" => [16, "\x1ct"], "(" => [77, "\x1c "], ")" => [18, "\x1c "], "*" => [77, "\x1c%"], "+" => [18, "\x1c%"], "," => [77, "\x1c-"], "-" => [18, "\x1c-"], "." => [77, "\x1c."], "/" => [18, "\x1c."], [77, "\x1c/"], [18, "\x1c/"], [77, "\x1c3"], [18, "\x1c3"], [77, "\x1c4"], [18, "\x1c4"], [77, "\x1c5"], [18, "\x1c5"], [77, "\x1c6"], [18, "\x1c6"], ":" => [77, "\x1c7"], ";" => [18, "\x1c7"], "<" => [77, "\x1c8"], "=" => [18, "\x1c8"], ">" => [77, "\x1c9"], "?" => [18, "\x1c9"], "@" => [77, "\x1c="], "A" => [18, "\x1c="], "B" => [77, "\x1cA"], "C" => [18, "\x1cA"], "D" => [77, "\x1c_"], "E" => [18, "\x1c_"], "F" => [77, "\x1cb"], "G" => [18, "\x1cb"], "H" => [77, "\x1cd"], "I" => [18, "\x1cd"], "J" => [77, "\x1cf"], "K" => [18, "\x1cf"], "L" => [77, "\x1cg"], "M" => [18, "\x1cg"], "N" => [77, "\x1ch"], "O" => [18, "\x1ch"], "P" => [77, "\x1cl"], "Q" => [18, "\x1cl"], "R" => [77, "\x1cm"], "S" => [18, "\x1cm"], "T" => [77, "\x1cn"], "U" => [18, "\x1cn"], "V" => [77, "\x1cp"], "W" => [18, "\x1cp"], "X" => [77, "\x1cr"], "Y" => [18, "\x1cr"], "Z" => [77, "\x1cu"], "[" => [18, "\x1cu"], "\\" => [0, "\x1c:"], "]" => [0, "\x1cB"], "^" => [0, "\x1cC"], "_" => [0, "\x1cD"], "`" => [0, "\x1cE"], "a" => [0, "\x1cF"], "b" => [0, "\x1cG"], "c" => [0, "\x1cH"], "d" => [0, "\x1cI"], "e" => [0, "\x1cJ"], "f" => [0, "\x1cK"], "g" => [0, "\x1cL"], "h" => [0, "\x1cM"], "i" => [0, "\x1cN"], "j" => [0, "\x1cO"], "k" => [0, "\x1cP"], "l" => [0, "\x1cQ"], "m" => [0, "\x1cR"], "n" => [0, "\x1cS"], "o" => [0, "\x1cT"], "p" => [0, "\x1cU"], "q" => [0, "\x1cV"], "r" => [0, "\x1cW"], "s" => [0, "\x1cY"], "t" => [0, "\x1cj"], "u" => [0, "\x1ck"], "v" => [0, "\x1cq"], "w" => [0, "\x1cv"], "x" => [0, "\x1cw"], "y" => [0, "\x1cx"], "z" => [0, "\x1cy"], "{" => [0, "\x1cz"], "|" => [82, "\x1c"], "}" => [87, "\x1c"], "~" => [130, "\x1c"], "" => [9, "\x1c"], "\x80" => [94, "\x1d0"], "\x81" => [76, "\x1d0"], "\x82" => [104, "\x1d0"], "\x83" => [16, "\x1d0"], "\x84" => [94, "\x1d1"], "\x85" => [76, "\x1d1"], "\x86" => [104, "\x1d1"], "\x87" => [16, "\x1d1"], "\x88" => [94, "\x1d2"], "\x89" => [76, "\x1d2"], "\x8a" => [104, "\x1d2"], "\x8b" => [16, "\x1d2"], "\x8c" => [94, "\x1da"], "\x8d" => [76, "\x1da"], "\x8e" => [104, "\x1da"], "\x8f" => [16, "\x1da"], "\x90" => [94, "\x1dc"], "\x91" => [76, "\x1dc"], "\x92" => [104, "\x1dc"], "\x93" => [16, "\x1dc"], "\x94" => [94, "\x1de"], "\x95" => [76, "\x1de"], "\x96" => [104, "\x1de"], "\x97" => [16, "\x1de"], "\x98" => [94, "\x1di"], "\x99" => [76, "\x1di"], "\x9a" => [104, "\x1di"], "\x9b" => [16, "\x1di"], "\x9c" => [94, "\x1do"], "\x9d" => [76, "\x1do"], "\x9e" => [104, "\x1do"], "\x9f" => [16, "\x1do"], "\xa0" => [94, "\x1ds"], "\xa1" => [76, "\x1ds"], "\xa2" => [104, "\x1ds"], "\xa3" => [16, "\x1ds"], "\xa4" => [94, "\x1dt"], "\xa5" => [76, "\x1dt"], "\xa6" => [104, "\x1dt"], "\xa7" => [16, "\x1dt"], "\xa8" => [77, "\x1d "], "\xa9" => [18, "\x1d "], "\xaa" => [77, "\x1d%"], "\xab" => [18, "\x1d%"], "\xac" => [77, "\x1d-"], "\xad" => [18, "\x1d-"], "\xae" => [77, "\x1d."], "\xaf" => [18, "\x1d."], "\xb0" => [77, "\x1d/"], "\xb1" => [18, "\x1d/"], "\xb2" => [77, "\x1d3"], "\xb3" => [18, "\x1d3"], "\xb4" => [77, "\x1d4"], "\xb5" => [18, "\x1d4"], "\xb6" => [77, "\x1d5"], "\xb7" => [18, "\x1d5"], "\xb8" => [77, "\x1d6"], "\xb9" => [18, "\x1d6"], "\xba" => [77, "\x1d7"], "\xbb" => [18, "\x1d7"], "\xbc" => [77, "\x1d8"], "\xbd" => [18, "\x1d8"], "\xbe" => [77, "\x1d9"], "\xbf" => [18, "\x1d9"], "\xc0" => [77, "\x1d="], "\xc1" => [18, "\x1d="], "\xc2" => [77, "\x1dA"], "\xc3" => [18, "\x1dA"], "\xc4" => [77, "\x1d_"], "\xc5" => [18, "\x1d_"], "\xc6" => [77, "\x1db"], "\xc7" => [18, "\x1db"], "\xc8" => [77, "\x1dd"], "\xc9" => [18, "\x1dd"], "\xca" => [77, "\x1df"], "\xcb" => [18, "\x1df"], "\xcc" => [77, "\x1dg"], "\xcd" => [18, "\x1dg"], "\xce" => [77, "\x1dh"], "\xcf" => [18, "\x1dh"], "\xd0" => [77, "\x1dl"], "\xd1" => [18, "\x1dl"], "\xd2" => [77, "\x1dm"], "\xd3" => [18, "\x1dm"], "\xd4" => [77, "\x1dn"], "\xd5" => [18, "\x1dn"], "\xd6" => [77, "\x1dp"], "\xd7" => [18, "\x1dp"], "\xd8" => [77, "\x1dr"], "\xd9" => [18, "\x1dr"], "\xda" => [77, "\x1du"], "\xdb" => [18, "\x1du"], "\xdc" => [0, "\x1d:"], "\xdd" => [0, "\x1dB"], "\xde" => [0, "\x1dC"], "\xdf" => [0, "\x1dD"], "\xe0" => [0, "\x1dE"], "\xe1" => [0, "\x1dF"], "\xe2" => [0, "\x1dG"], "\xe3" => [0, "\x1dH"], "\xe4" => [0, "\x1dI"], "\xe5" => [0, "\x1dJ"], "\xe6" => [0, "\x1dK"], "\xe7" => [0, "\x1dL"], "\xe8" => [0, "\x1dM"], "\xe9" => [0, "\x1dN"], "\xea" => [0, "\x1dO"], "\xeb" => [0, "\x1dP"], "\xec" => [0, "\x1dQ"], "\xed" => [0, "\x1dR"], "\xee" => [0, "\x1dS"], "\xef" => [0, "\x1dT"], "\xf0" => [0, "\x1dU"], "\xf1" => [0, "\x1dV"], "\xf2" => [0, "\x1dW"], "\xf3" => [0, "\x1dY"], "\xf4" => [0, "\x1dj"], "\xf5" => [0, "\x1dk"], "\xf6" => [0, "\x1dq"], "\xf7" => [0, "\x1dv"], "\xf8" => [0, "\x1dw"], "\xf9" => [0, "\x1dx"], "\xfa" => [0, "\x1dy"], "\xfb" => [0, "\x1dz"], "\xfc" => [82, "\x1d"], "\xfd" => [87, "\x1d"], "\xfe" => [130, "\x1d"], "\xff" => [9, "\x1d"]], ["\x00" => [77, "\x1c0"], "\x01" => [18, "\x1c0"], "\x02" => [77, "\x1c1"], "\x03" => [18, "\x1c1"], "\x04" => [77, "\x1c2"], "\x05" => [18, "\x1c2"], "\x06" => [77, "\x1ca"], "\x07" => [18, "\x1ca"], "\x08" => [77, "\x1cc"], "\t" => [18, "\x1cc"], "\n" => [77, "\x1ce"], "\v" => [18, "\x1ce"], "\f" => [77, "\x1ci"], "\r" => [18, "\x1ci"], "\x0e" => [77, "\x1co"], "\x0f" => [18, "\x1co"], "\x10" => [77, "\x1cs"], "\x11" => [18, "\x1cs"], "\x12" => [77, "\x1ct"], "\x13" => [18, "\x1ct"], "\x14" => [0, "\x1c "], "\x15" => [0, "\x1c%"], "\x16" => [0, "\x1c-"], "\x17" => [0, "\x1c."], "\x18" => [0, "\x1c/"], "\x19" => [0, "\x1c3"], "\x1a" => [0, "\x1c4"], "\x1b" => [0, "\x1c5"], "\x1c" => [0, "\x1c6"], "\x1d" => [0, "\x1c7"], "\x1e" => [0, "\x1c8"], "\x1f" => [0, "\x1c9"], " " => [0, "\x1c="], "!" => [0, "\x1cA"], "\"" => [0, "\x1c_"], "#" => [0, "\x1cb"], "\$" => [0, "\x1cd"], "%" => [0, "\x1cf"], "&" => [0, "\x1cg"], "'" => [0, "\x1ch"], "(" => [0, "\x1cl"], ")" => [0, "\x1cm"], "*" => [0, "\x1cn"], "+" => [0, "\x1cp"], "," => [0, "\x1cr"], "-" => [0, "\x1cu"], "." => [100, "\x1c"], "/" => [110, "\x1c"], [111, "\x1c"], [115, "\x1c"], [116, "\x1c"], [118, "\x1c"], [119, "\x1c"], [122, "\x1c"], [123, "\x1c"], [125, "\x1c"], [126, "\x1c"], [129, "\x1c"], ":" => [143, "\x1c"], ";" => [148, "\x1c"], "<" => [151, "\x1c"], "=" => [153, "\x1c"], ">" => [83, "\x1c"], "?" => [10, "\x1c"], "@" => [77, "\x1d0"], "A" => [18, "\x1d0"], "B" => [77, "\x1d1"], "C" => [18, "\x1d1"], "D" => [77, "\x1d2"], "E" => [18, "\x1d2"], "F" => [77, "\x1da"], "G" => [18, "\x1da"], "H" => [77, "\x1dc"], "I" => [18, "\x1dc"], "J" => [77, "\x1de"], "K" => [18, "\x1de"], "L" => [77, "\x1di"], "M" => [18, "\x1di"], "N" => [77, "\x1do"], "O" => [18, "\x1do"], "P" => [77, "\x1ds"], "Q" => [18, "\x1ds"], "R" => [77, "\x1dt"], "S" => [18, "\x1dt"], "T" => [0, "\x1d "], "U" => [0, "\x1d%"], "V" => [0, "\x1d-"], "W" => [0, "\x1d."], "X" => [0, "\x1d/"], "Y" => [0, "\x1d3"], "Z" => [0, "\x1d4"], "[" => [0, "\x1d5"], "\\" => [0, "\x1d6"], "]" => [0, "\x1d7"], "^" => [0, "\x1d8"], "_" => [0, "\x1d9"], "`" => [0, "\x1d="], "a" => [0, "\x1dA"], "b" => [0, "\x1d_"], "c" => [0, "\x1db"], "d" => [0, "\x1dd"], "e" => [0, "\x1df"], "f" => [0, "\x1dg"], "g" => [0, "\x1dh"], "h" => [0, "\x1dl"], "i" => [0, "\x1dm"], "j" => [0, "\x1dn"], "k" => [0, "\x1dp"], "l" => [0, "\x1dr"], "m" => [0, "\x1du"], "n" => [100, "\x1d"], "o" => [110, "\x1d"], "p" => [111, "\x1d"], "q" => [115, "\x1d"], "r" => [116, "\x1d"], "s" => [118, "\x1d"], "t" => [119, "\x1d"], "u" => [122, "\x1d"], "v" => [123, "\x1d"], "w" => [125, "\x1d"], "x" => [126, "\x1d"], "y" => [129, "\x1d"], "z" => [143, "\x1d"], "{" => [148, "\x1d"], "|" => [151, "\x1d"], "}" => [153, "\x1d"], "~" => [83, "\x1d"], "" => [10, "\x1d"], "\x80" => [77, "\x1e0"], "\x81" => [18, "\x1e0"], "\x82" => [77, "\x1e1"], "\x83" => [18, "\x1e1"], "\x84" => [77, "\x1e2"], "\x85" => [18, "\x1e2"], "\x86" => [77, "\x1ea"], "\x87" => [18, "\x1ea"], "\x88" => [77, "\x1ec"], "\x89" => [18, "\x1ec"], "\x8a" => [77, "\x1ee"], "\x8b" => [18, "\x1ee"], "\x8c" => [77, "\x1ei"], "\x8d" => [18, "\x1ei"], "\x8e" => [77, "\x1eo"], "\x8f" => [18, "\x1eo"], "\x90" => [77, "\x1es"], "\x91" => [18, "\x1es"], "\x92" => [77, "\x1et"], "\x93" => [18, "\x1et"], "\x94" => [0, "\x1e "], "\x95" => [0, "\x1e%"], "\x96" => [0, "\x1e-"], "\x97" => [0, "\x1e."], "\x98" => [0, "\x1e/"], "\x99" => [0, "\x1e3"], "\x9a" => [0, "\x1e4"], "\x9b" => [0, "\x1e5"], "\x9c" => [0, "\x1e6"], "\x9d" => [0, "\x1e7"], "\x9e" => [0, "\x1e8"], "\x9f" => [0, "\x1e9"], "\xa0" => [0, "\x1e="], "\xa1" => [0, "\x1eA"], "\xa2" => [0, "\x1e_"], "\xa3" => [0, "\x1eb"], "\xa4" => [0, "\x1ed"], "\xa5" => [0, "\x1ef"], "\xa6" => [0, "\x1eg"], "\xa7" => [0, "\x1eh"], "\xa8" => [0, "\x1el"], "\xa9" => [0, "\x1em"], "\xaa" => [0, "\x1en"], "\xab" => [0, "\x1ep"], "\xac" => [0, "\x1er"], "\xad" => [0, "\x1eu"], "\xae" => [100, "\x1e"], "\xaf" => [110, "\x1e"], "\xb0" => [111, "\x1e"], "\xb1" => [115, "\x1e"], "\xb2" => [116, "\x1e"], "\xb3" => [118, "\x1e"], "\xb4" => [119, "\x1e"], "\xb5" => [122, "\x1e"], "\xb6" => [123, "\x1e"], "\xb7" => [125, "\x1e"], "\xb8" => [126, "\x1e"], "\xb9" => [129, "\x1e"], "\xba" => [143, "\x1e"], "\xbb" => [148, "\x1e"], "\xbc" => [151, "\x1e"], "\xbd" => [153, "\x1e"], "\xbe" => [83, "\x1e"], "\xbf" => [10, "\x1e"], "\xc0" => [77, "\x1f0"], "\xc1" => [18, "\x1f0"], "\xc2" => [77, "\x1f1"], "\xc3" => [18, "\x1f1"], "\xc4" => [77, "\x1f2"], "\xc5" => [18, "\x1f2"], "\xc6" => [77, "\x1fa"], "\xc7" => [18, "\x1fa"], "\xc8" => [77, "\x1fc"], "\xc9" => [18, "\x1fc"], "\xca" => [77, "\x1fe"], "\xcb" => [18, "\x1fe"], "\xcc" => [77, "\x1fi"], "\xcd" => [18, "\x1fi"], "\xce" => [77, "\x1fo"], "\xcf" => [18, "\x1fo"], "\xd0" => [77, "\x1fs"], "\xd1" => [18, "\x1fs"], "\xd2" => [77, "\x1ft"], "\xd3" => [18, "\x1ft"], "\xd4" => [0, "\x1f "], "\xd5" => [0, "\x1f%"], "\xd6" => [0, "\x1f-"], "\xd7" => [0, "\x1f."], "\xd8" => [0, "\x1f/"], "\xd9" => [0, "\x1f3"], "\xda" => [0, "\x1f4"], "\xdb" => [0, "\x1f5"], "\xdc" => [0, "\x1f6"], "\xdd" => [0, "\x1f7"], "\xde" => [0, "\x1f8"], "\xdf" => [0, "\x1f9"], "\xe0" => [0, "\x1f="], "\xe1" => [0, "\x1fA"], "\xe2" => [0, "\x1f_"], "\xe3" => [0, "\x1fb"], "\xe4" => [0, "\x1fd"], "\xe5" => [0, "\x1ff"], "\xe6" => [0, "\x1fg"], "\xe7" => [0, "\x1fh"], "\xe8" => [0, "\x1fl"], "\xe9" => [0, "\x1fm"], "\xea" => [0, "\x1fn"], "\xeb" => [0, "\x1fp"], "\xec" => [0, "\x1fr"], "\xed" => [0, "\x1fu"], "\xee" => [100, "\x1f"], "\xef" => [110, "\x1f"], "\xf0" => [111, "\x1f"], "\xf1" => [115, "\x1f"], "\xf2" => [116, "\x1f"], "\xf3" => [118, "\x1f"], "\xf4" => [119, "\x1f"], "\xf5" => [122, "\x1f"], "\xf6" => [123, "\x1f"], "\xf7" => [125, "\x1f"], "\xf8" => [126, "\x1f"], "\xf9" => [129, "\x1f"], "\xfa" => [143, "\x1f"], "\xfb" => [148, "\x1f"], "\xfc" => [151, "\x1f"], "\xfd" => [153, "\x1f"], "\xfe" => [83, "\x1f"], "\xff" => [10, "\x1f"]], ["\x00" => [94, "\x1e0"], "\x01" => [76, "\x1e0"], "\x02" => [104, "\x1e0"], "\x03" => [16, "\x1e0"], "\x04" => [94, "\x1e1"], "\x05" => [76, "\x1e1"], "\x06" => [104, "\x1e1"], "\x07" => [16, "\x1e1"], "\x08" => [94, "\x1e2"], "\t" => [76, "\x1e2"], "\n" => [104, "\x1e2"], "\v" => [16, "\x1e2"], "\f" => [94, "\x1ea"], "\r" => [76, "\x1ea"], "\x0e" => [104, "\x1ea"], "\x0f" => [16, "\x1ea"], "\x10" => [94, "\x1ec"], "\x11" => [76, "\x1ec"], "\x12" => [104, "\x1ec"], "\x13" => [16, "\x1ec"], "\x14" => [94, "\x1ee"], "\x15" => [76, "\x1ee"], "\x16" => [104, "\x1ee"], "\x17" => [16, "\x1ee"], "\x18" => [94, "\x1ei"], "\x19" => [76, "\x1ei"], "\x1a" => [104, "\x1ei"], "\x1b" => [16, "\x1ei"], "\x1c" => [94, "\x1eo"], "\x1d" => [76, "\x1eo"], "\x1e" => [104, "\x1eo"], "\x1f" => [16, "\x1eo"], " " => [94, "\x1es"], "!" => [76, "\x1es"], "\"" => [104, "\x1es"], "#" => [16, "\x1es"], "\$" => [94, "\x1et"], "%" => [76, "\x1et"], "&" => [104, "\x1et"], "'" => [16, "\x1et"], "(" => [77, "\x1e "], ")" => [18, "\x1e "], "*" => [77, "\x1e%"], "+" => [18, "\x1e%"], "," => [77, "\x1e-"], "-" => [18, "\x1e-"], "." => [77, "\x1e."], "/" => [18, "\x1e."], [77, "\x1e/"], [18, "\x1e/"], [77, "\x1e3"], [18, "\x1e3"], [77, "\x1e4"], [18, "\x1e4"], [77, "\x1e5"], [18, "\x1e5"], [77, "\x1e6"], [18, "\x1e6"], ":" => [77, "\x1e7"], ";" => [18, "\x1e7"], "<" => [77, "\x1e8"], "=" => [18, "\x1e8"], ">" => [77, "\x1e9"], "?" => [18, "\x1e9"], "@" => [77, "\x1e="], "A" => [18, "\x1e="], "B" => [77, "\x1eA"], "C" => [18, "\x1eA"], "D" => [77, "\x1e_"], "E" => [18, "\x1e_"], "F" => [77, "\x1eb"], "G" => [18, "\x1eb"], "H" => [77, "\x1ed"], "I" => [18, "\x1ed"], "J" => [77, "\x1ef"], "K" => [18, "\x1ef"], "L" => [77, "\x1eg"], "M" => [18, "\x1eg"], "N" => [77, "\x1eh"], "O" => [18, "\x1eh"], "P" => [77, "\x1el"], "Q" => [18, "\x1el"], "R" => [77, "\x1em"], "S" => [18, "\x1em"], "T" => [77, "\x1en"], "U" => [18, "\x1en"], "V" => [77, "\x1ep"], "W" => [18, "\x1ep"], "X" => [77, "\x1er"], "Y" => [18, "\x1er"], "Z" => [77, "\x1eu"], "[" => [18, "\x1eu"], "\\" => [0, "\x1e:"], "]" => [0, "\x1eB"], "^" => [0, "\x1eC"], "_" => [0, "\x1eD"], "`" => [0, "\x1eE"], "a" => [0, "\x1eF"], "b" => [0, "\x1eG"], "c" => [0, "\x1eH"], "d" => [0, "\x1eI"], "e" => [0, "\x1eJ"], "f" => [0, "\x1eK"], "g" => [0, "\x1eL"], "h" => [0, "\x1eM"], "i" => [0, "\x1eN"], "j" => [0, "\x1eO"], "k" => [0, "\x1eP"], "l" => [0, "\x1eQ"], "m" => [0, "\x1eR"], "n" => [0, "\x1eS"], "o" => [0, "\x1eT"], "p" => [0, "\x1eU"], "q" => [0, "\x1eV"], "r" => [0, "\x1eW"], "s" => [0, "\x1eY"], "t" => [0, "\x1ej"], "u" => [0, "\x1ek"], "v" => [0, "\x1eq"], "w" => [0, "\x1ev"], "x" => [0, "\x1ew"], "y" => [0, "\x1ex"], "z" => [0, "\x1ey"], "{" => [0, "\x1ez"], "|" => [82, "\x1e"], "}" => [87, "\x1e"], "~" => [130, "\x1e"], "" => [9, "\x1e"], "\x80" => [94, "\x1f0"], "\x81" => [76, "\x1f0"], "\x82" => [104, "\x1f0"], "\x83" => [16, "\x1f0"], "\x84" => [94, "\x1f1"], "\x85" => [76, "\x1f1"], "\x86" => [104, "\x1f1"], "\x87" => [16, "\x1f1"], "\x88" => [94, "\x1f2"], "\x89" => [76, "\x1f2"], "\x8a" => [104, "\x1f2"], "\x8b" => [16, "\x1f2"], "\x8c" => [94, "\x1fa"], "\x8d" => [76, "\x1fa"], "\x8e" => [104, "\x1fa"], "\x8f" => [16, "\x1fa"], "\x90" => [94, "\x1fc"], "\x91" => [76, "\x1fc"], "\x92" => [104, "\x1fc"], "\x93" => [16, "\x1fc"], "\x94" => [94, "\x1fe"], "\x95" => [76, "\x1fe"], "\x96" => [104, "\x1fe"], "\x97" => [16, "\x1fe"], "\x98" => [94, "\x1fi"], "\x99" => [76, "\x1fi"], "\x9a" => [104, "\x1fi"], "\x9b" => [16, "\x1fi"], "\x9c" => [94, "\x1fo"], "\x9d" => [76, "\x1fo"], "\x9e" => [104, "\x1fo"], "\x9f" => [16, "\x1fo"], "\xa0" => [94, "\x1fs"], "\xa1" => [76, "\x1fs"], "\xa2" => [104, "\x1fs"], "\xa3" => [16, "\x1fs"], "\xa4" => [94, "\x1ft"], "\xa5" => [76, "\x1ft"], "\xa6" => [104, "\x1ft"], "\xa7" => [16, "\x1ft"], "\xa8" => [77, "\x1f "], "\xa9" => [18, "\x1f "], "\xaa" => [77, "\x1f%"], "\xab" => [18, "\x1f%"], "\xac" => [77, "\x1f-"], "\xad" => [18, "\x1f-"], "\xae" => [77, "\x1f."], "\xaf" => [18, "\x1f."], "\xb0" => [77, "\x1f/"], "\xb1" => [18, "\x1f/"], "\xb2" => [77, "\x1f3"], "\xb3" => [18, "\x1f3"], "\xb4" => [77, "\x1f4"], "\xb5" => [18, "\x1f4"], "\xb6" => [77, "\x1f5"], "\xb7" => [18, "\x1f5"], "\xb8" => [77, "\x1f6"], "\xb9" => [18, "\x1f6"], "\xba" => [77, "\x1f7"], "\xbb" => [18, "\x1f7"], "\xbc" => [77, "\x1f8"], "\xbd" => [18, "\x1f8"], "\xbe" => [77, "\x1f9"], "\xbf" => [18, "\x1f9"], "\xc0" => [77, "\x1f="], "\xc1" => [18, "\x1f="], "\xc2" => [77, "\x1fA"], "\xc3" => [18, "\x1fA"], "\xc4" => [77, "\x1f_"], "\xc5" => [18, "\x1f_"], "\xc6" => [77, "\x1fb"], "\xc7" => [18, "\x1fb"], "\xc8" => [77, "\x1fd"], "\xc9" => [18, "\x1fd"], "\xca" => [77, "\x1ff"], "\xcb" => [18, "\x1ff"], "\xcc" => [77, "\x1fg"], "\xcd" => [18, "\x1fg"], "\xce" => [77, "\x1fh"], "\xcf" => [18, "\x1fh"], "\xd0" => [77, "\x1fl"], "\xd1" => [18, "\x1fl"], "\xd2" => [77, "\x1fm"], "\xd3" => [18, "\x1fm"], "\xd4" => [77, "\x1fn"], "\xd5" => [18, "\x1fn"], "\xd6" => [77, "\x1fp"], "\xd7" => [18, "\x1fp"], "\xd8" => [77, "\x1fr"], "\xd9" => [18, "\x1fr"], "\xda" => [77, "\x1fu"], "\xdb" => [18, "\x1fu"], "\xdc" => [0, "\x1f:"], "\xdd" => [0, "\x1fB"], "\xde" => [0, "\x1fC"], "\xdf" => [0, "\x1fD"], "\xe0" => [0, "\x1fE"], "\xe1" => [0, "\x1fF"], "\xe2" => [0, "\x1fG"], "\xe3" => [0, "\x1fH"], "\xe4" => [0, "\x1fI"], "\xe5" => [0, "\x1fJ"], "\xe6" => [0, "\x1fK"], "\xe7" => [0, "\x1fL"], "\xe8" => [0, "\x1fM"], "\xe9" => [0, "\x1fN"], "\xea" => [0, "\x1fO"], "\xeb" => [0, "\x1fP"], "\xec" => [0, "\x1fQ"], "\xed" => [0, "\x1fR"], "\xee" => [0, "\x1fS"], "\xef" => [0, "\x1fT"], "\xf0" => [0, "\x1fU"], "\xf1" => [0, "\x1fV"], "\xf2" => [0, "\x1fW"], "\xf3" => [0, "\x1fY"], "\xf4" => [0, "\x1fj"], "\xf5" => [0, "\x1fk"], "\xf6" => [0, "\x1fq"], "\xf7" => [0, "\x1fv"], "\xf8" => [0, "\x1fw"], "\xf9" => [0, "\x1fx"], "\xfa" => [0, "\x1fy"], "\xfb" => [0, "\x1fz"], "\xfc" => [82, "\x1f"], "\xfd" => [87, "\x1f"], "\xfe" => [130, "\x1f"], "\xff" => [9, "\x1f"]], ["\x00" => [94, " 0"], "\x01" => [76, " 0"], "\x02" => [104, " 0"], "\x03" => [16, " 0"], "\x04" => [94, " 1"], "\x05" => [76, " 1"], "\x06" => [104, " 1"], "\x07" => [16, " 1"], "\x08" => [94, " 2"], "\t" => [76, " 2"], "\n" => [104, " 2"], "\v" => [16, " 2"], "\f" => [94, " a"], "\r" => [76, " a"], "\x0e" => [104, " a"], "\x0f" => [16, " a"], "\x10" => [94, " c"], "\x11" => [76, " c"], "\x12" => [104, " c"], "\x13" => [16, " c"], "\x14" => [94, " e"], "\x15" => [76, " e"], "\x16" => [104, " e"], "\x17" => [16, " e"], "\x18" => [94, " i"], "\x19" => [76, " i"], "\x1a" => [104, " i"], "\x1b" => [16, " i"], "\x1c" => [94, " o"], "\x1d" => [76, " o"], "\x1e" => [104, " o"], "\x1f" => [16, " o"], " " => [94, " s"], "!" => [76, " s"], "\"" => [104, " s"], "#" => [16, " s"], "\$" => [94, " t"], "%" => [76, " t"], "&" => [104, " t"], "'" => [16, " t"], "(" => [77, " "], ")" => [18, " "], "*" => [77, " %"], "+" => [18, " %"], "," => [77, " -"], "-" => [18, " -"], "." => [77, " ."], "/" => [18, " ."], [77, " /"], [18, " /"], [77, " 3"], [18, " 3"], [77, " 4"], [18, " 4"], [77, " 5"], [18, " 5"], [77, " 6"], [18, " 6"], ":" => [77, " 7"], ";" => [18, " 7"], "<" => [77, " 8"], "=" => [18, " 8"], ">" => [77, " 9"], "?" => [18, " 9"], "@" => [77, " ="], "A" => [18, " ="], "B" => [77, " A"], "C" => [18, " A"], "D" => [77, " _"], "E" => [18, " _"], "F" => [77, " b"], "G" => [18, " b"], "H" => [77, " d"], "I" => [18, " d"], "J" => [77, " f"], "K" => [18, " f"], "L" => [77, " g"], "M" => [18, " g"], "N" => [77, " h"], "O" => [18, " h"], "P" => [77, " l"], "Q" => [18, " l"], "R" => [77, " m"], "S" => [18, " m"], "T" => [77, " n"], "U" => [18, " n"], "V" => [77, " p"], "W" => [18, " p"], "X" => [77, " r"], "Y" => [18, " r"], "Z" => [77, " u"], "[" => [18, " u"], "\\" => [0, " :"], "]" => [0, " B"], "^" => [0, " C"], "_" => [0, " D"], "`" => [0, " E"], "a" => [0, " F"], "b" => [0, " G"], "c" => [0, " H"], "d" => [0, " I"], "e" => [0, " J"], "f" => [0, " K"], "g" => [0, " L"], "h" => [0, " M"], "i" => [0, " N"], "j" => [0, " O"], "k" => [0, " P"], "l" => [0, " Q"], "m" => [0, " R"], "n" => [0, " S"], "o" => [0, " T"], "p" => [0, " U"], "q" => [0, " V"], "r" => [0, " W"], "s" => [0, " Y"], "t" => [0, " j"], "u" => [0, " k"], "v" => [0, " q"], "w" => [0, " v"], "x" => [0, " w"], "y" => [0, " x"], "z" => [0, " y"], "{" => [0, " z"], "|" => [82, " "], "}" => [87, " "], "~" => [130, " "], "" => [9, " "], "\x80" => [94, "%0"], "\x81" => [76, "%0"], "\x82" => [104, "%0"], "\x83" => [16, "%0"], "\x84" => [94, "%1"], "\x85" => [76, "%1"], "\x86" => [104, "%1"], "\x87" => [16, "%1"], "\x88" => [94, "%2"], "\x89" => [76, "%2"], "\x8a" => [104, "%2"], "\x8b" => [16, "%2"], "\x8c" => [94, "%a"], "\x8d" => [76, "%a"], "\x8e" => [104, "%a"], "\x8f" => [16, "%a"], "\x90" => [94, "%c"], "\x91" => [76, "%c"], "\x92" => [104, "%c"], "\x93" => [16, "%c"], "\x94" => [94, "%e"], "\x95" => [76, "%e"], "\x96" => [104, "%e"], "\x97" => [16, "%e"], "\x98" => [94, "%i"], "\x99" => [76, "%i"], "\x9a" => [104, "%i"], "\x9b" => [16, "%i"], "\x9c" => [94, "%o"], "\x9d" => [76, "%o"], "\x9e" => [104, "%o"], "\x9f" => [16, "%o"], "\xa0" => [94, "%s"], "\xa1" => [76, "%s"], "\xa2" => [104, "%s"], "\xa3" => [16, "%s"], "\xa4" => [94, "%t"], "\xa5" => [76, "%t"], "\xa6" => [104, "%t"], "\xa7" => [16, "%t"], "\xa8" => [77, "% "], "\xa9" => [18, "% "], "\xaa" => [77, "%%"], "\xab" => [18, "%%"], "\xac" => [77, "%-"], "\xad" => [18, "%-"], "\xae" => [77, "%."], "\xaf" => [18, "%."], "\xb0" => [77, "%/"], "\xb1" => [18, "%/"], "\xb2" => [77, "%3"], "\xb3" => [18, "%3"], "\xb4" => [77, "%4"], "\xb5" => [18, "%4"], "\xb6" => [77, "%5"], "\xb7" => [18, "%5"], "\xb8" => [77, "%6"], "\xb9" => [18, "%6"], "\xba" => [77, "%7"], "\xbb" => [18, "%7"], "\xbc" => [77, "%8"], "\xbd" => [18, "%8"], "\xbe" => [77, "%9"], "\xbf" => [18, "%9"], "\xc0" => [77, "%="], "\xc1" => [18, "%="], "\xc2" => [77, "%A"], "\xc3" => [18, "%A"], "\xc4" => [77, "%_"], "\xc5" => [18, "%_"], "\xc6" => [77, "%b"], "\xc7" => [18, "%b"], "\xc8" => [77, "%d"], "\xc9" => [18, "%d"], "\xca" => [77, "%f"], "\xcb" => [18, "%f"], "\xcc" => [77, "%g"], "\xcd" => [18, "%g"], "\xce" => [77, "%h"], "\xcf" => [18, "%h"], "\xd0" => [77, "%l"], "\xd1" => [18, "%l"], "\xd2" => [77, "%m"], "\xd3" => [18, "%m"], "\xd4" => [77, "%n"], "\xd5" => [18, "%n"], "\xd6" => [77, "%p"], "\xd7" => [18, "%p"], "\xd8" => [77, "%r"], "\xd9" => [18, "%r"], "\xda" => [77, "%u"], "\xdb" => [18, "%u"], "\xdc" => [0, "%:"], "\xdd" => [0, "%B"], "\xde" => [0, "%C"], "\xdf" => [0, "%D"], "\xe0" => [0, "%E"], "\xe1" => [0, "%F"], "\xe2" => [0, "%G"], "\xe3" => [0, "%H"], "\xe4" => [0, "%I"], "\xe5" => [0, "%J"], "\xe6" => [0, "%K"], "\xe7" => [0, "%L"], "\xe8" => [0, "%M"], "\xe9" => [0, "%N"], "\xea" => [0, "%O"], "\xeb" => [0, "%P"], "\xec" => [0, "%Q"], "\xed" => [0, "%R"], "\xee" => [0, "%S"], "\xef" => [0, "%T"], "\xf0" => [0, "%U"], "\xf1" => [0, "%V"], "\xf2" => [0, "%W"], "\xf3" => [0, "%Y"], "\xf4" => [0, "%j"], "\xf5" => [0, "%k"], "\xf6" => [0, "%q"], "\xf7" => [0, "%v"], "\xf8" => [0, "%w"], "\xf9" => [0, "%x"], "\xfa" => [0, "%y"], "\xfb" => [0, "%z"], "\xfc" => [82, "%"], "\xfd" => [87, "%"], "\xfe" => [130, "%"], "\xff" => [9, "%"]], ["\x00" => [77, " 0"], "\x01" => [18, " 0"], "\x02" => [77, " 1"], "\x03" => [18, " 1"], "\x04" => [77, " 2"], "\x05" => [18, " 2"], "\x06" => [77, " a"], "\x07" => [18, " a"], "\x08" => [77, " c"], "\t" => [18, " c"], "\n" => [77, " e"], "\v" => [18, " e"], "\f" => [77, " i"], "\r" => [18, " i"], "\x0e" => [77, " o"], "\x0f" => [18, " o"], "\x10" => [77, " s"], "\x11" => [18, " s"], "\x12" => [77, " t"], "\x13" => [18, " t"], "\x14" => [0, " "], "\x15" => [0, " %"], "\x16" => [0, " -"], "\x17" => [0, " ."], "\x18" => [0, " /"], "\x19" => [0, " 3"], "\x1a" => [0, " 4"], "\x1b" => [0, " 5"], "\x1c" => [0, " 6"], "\x1d" => [0, " 7"], "\x1e" => [0, " 8"], "\x1f" => [0, " 9"], " " => [0, " ="], "!" => [0, " A"], "\"" => [0, " _"], "#" => [0, " b"], "\$" => [0, " d"], "%" => [0, " f"], "&" => [0, " g"], "'" => [0, " h"], "(" => [0, " l"], ")" => [0, " m"], "*" => [0, " n"], "+" => [0, " p"], "," => [0, " r"], "-" => [0, " u"], "." => [100, " "], "/" => [110, " "], [111, " "], [115, " "], [116, " "], [118, " "], [119, " "], [122, " "], [123, " "], [125, " "], [126, " "], [129, " "], ":" => [143, " "], ";" => [148, " "], "<" => [151, " "], "=" => [153, " "], ">" => [83, " "], "?" => [10, " "], "@" => [77, "%0"], "A" => [18, "%0"], "B" => [77, "%1"], "C" => [18, "%1"], "D" => [77, "%2"], "E" => [18, "%2"], "F" => [77, "%a"], "G" => [18, "%a"], "H" => [77, "%c"], "I" => [18, "%c"], "J" => [77, "%e"], "K" => [18, "%e"], "L" => [77, "%i"], "M" => [18, "%i"], "N" => [77, "%o"], "O" => [18, "%o"], "P" => [77, "%s"], "Q" => [18, "%s"], "R" => [77, "%t"], "S" => [18, "%t"], "T" => [0, "% "], "U" => [0, "%%"], "V" => [0, "%-"], "W" => [0, "%."], "X" => [0, "%/"], "Y" => [0, "%3"], "Z" => [0, "%4"], "[" => [0, "%5"], "\\" => [0, "%6"], "]" => [0, "%7"], "^" => [0, "%8"], "_" => [0, "%9"], "`" => [0, "%="], "a" => [0, "%A"], "b" => [0, "%_"], "c" => [0, "%b"], "d" => [0, "%d"], "e" => [0, "%f"], "f" => [0, "%g"], "g" => [0, "%h"], "h" => [0, "%l"], "i" => [0, "%m"], "j" => [0, "%n"], "k" => [0, "%p"], "l" => [0, "%r"], "m" => [0, "%u"], "n" => [100, "%"], "o" => [110, "%"], "p" => [111, "%"], "q" => [115, "%"], "r" => [116, "%"], "s" => [118, "%"], "t" => [119, "%"], "u" => [122, "%"], "v" => [123, "%"], "w" => [125, "%"], "x" => [126, "%"], "y" => [129, "%"], "z" => [143, "%"], "{" => [148, "%"], "|" => [151, "%"], "}" => [153, "%"], "~" => [83, "%"], "" => [10, "%"], "\x80" => [77, "-0"], "\x81" => [18, "-0"], "\x82" => [77, "-1"], "\x83" => [18, "-1"], "\x84" => [77, "-2"], "\x85" => [18, "-2"], "\x86" => [77, "-a"], "\x87" => [18, "-a"], "\x88" => [77, "-c"], "\x89" => [18, "-c"], "\x8a" => [77, "-e"], "\x8b" => [18, "-e"], "\x8c" => [77, "-i"], "\x8d" => [18, "-i"], "\x8e" => [77, "-o"], "\x8f" => [18, "-o"], "\x90" => [77, "-s"], "\x91" => [18, "-s"], "\x92" => [77, "-t"], "\x93" => [18, "-t"], "\x94" => [0, "- "], "\x95" => [0, "-%"], "\x96" => [0, "--"], "\x97" => [0, "-."], "\x98" => [0, "-/"], "\x99" => [0, "-3"], "\x9a" => [0, "-4"], "\x9b" => [0, "-5"], "\x9c" => [0, "-6"], "\x9d" => [0, "-7"], "\x9e" => [0, "-8"], "\x9f" => [0, "-9"], "\xa0" => [0, "-="], "\xa1" => [0, "-A"], "\xa2" => [0, "-_"], "\xa3" => [0, "-b"], "\xa4" => [0, "-d"], "\xa5" => [0, "-f"], "\xa6" => [0, "-g"], "\xa7" => [0, "-h"], "\xa8" => [0, "-l"], "\xa9" => [0, "-m"], "\xaa" => [0, "-n"], "\xab" => [0, "-p"], "\xac" => [0, "-r"], "\xad" => [0, "-u"], "\xae" => [100, "-"], "\xaf" => [110, "-"], "\xb0" => [111, "-"], "\xb1" => [115, "-"], "\xb2" => [116, "-"], "\xb3" => [118, "-"], "\xb4" => [119, "-"], "\xb5" => [122, "-"], "\xb6" => [123, "-"], "\xb7" => [125, "-"], "\xb8" => [126, "-"], "\xb9" => [129, "-"], "\xba" => [143, "-"], "\xbb" => [148, "-"], "\xbc" => [151, "-"], "\xbd" => [153, "-"], "\xbe" => [83, "-"], "\xbf" => [10, "-"], "\xc0" => [77, ".0"], "\xc1" => [18, ".0"], "\xc2" => [77, ".1"], "\xc3" => [18, ".1"], "\xc4" => [77, ".2"], "\xc5" => [18, ".2"], "\xc6" => [77, ".a"], "\xc7" => [18, ".a"], "\xc8" => [77, ".c"], "\xc9" => [18, ".c"], "\xca" => [77, ".e"], "\xcb" => [18, ".e"], "\xcc" => [77, ".i"], "\xcd" => [18, ".i"], "\xce" => [77, ".o"], "\xcf" => [18, ".o"], "\xd0" => [77, ".s"], "\xd1" => [18, ".s"], "\xd2" => [77, ".t"], "\xd3" => [18, ".t"], "\xd4" => [0, ". "], "\xd5" => [0, ".%"], "\xd6" => [0, ".-"], "\xd7" => [0, ".."], "\xd8" => [0, "./"], "\xd9" => [0, ".3"], "\xda" => [0, ".4"], "\xdb" => [0, ".5"], "\xdc" => [0, ".6"], "\xdd" => [0, ".7"], "\xde" => [0, ".8"], "\xdf" => [0, ".9"], "\xe0" => [0, ".="], "\xe1" => [0, ".A"], "\xe2" => [0, "._"], "\xe3" => [0, ".b"], "\xe4" => [0, ".d"], "\xe5" => [0, ".f"], "\xe6" => [0, ".g"], "\xe7" => [0, ".h"], "\xe8" => [0, ".l"], "\xe9" => [0, ".m"], "\xea" => [0, ".n"], "\xeb" => [0, ".p"], "\xec" => [0, ".r"], "\xed" => [0, ".u"], "\xee" => [100, "."], "\xef" => [110, "."], "\xf0" => [111, "."], "\xf1" => [115, "."], "\xf2" => [116, "."], "\xf3" => [118, "."], "\xf4" => [119, "."], "\xf5" => [122, "."], "\xf6" => [123, "."], "\xf7" => [125, "."], "\xf8" => [126, "."], "\xf9" => [129, "."], "\xfa" => [143, "."], "\xfb" => [148, "."], "\xfc" => [151, "."], "\xfd" => [153, "."], "\xfe" => [83, "."], "\xff" => [10, "."]], ["\x00" => [77, "s0"], "\x01" => [18, "s0"], "\x02" => [77, "s1"], "\x03" => [18, "s1"], "\x04" => [77, "s2"], "\x05" => [18, "s2"], "\x06" => [77, "sa"], "\x07" => [18, "sa"], "\x08" => [77, "sc"], "\t" => [18, "sc"], "\n" => [77, "se"], "\v" => [18, "se"], "\f" => [77, "si"], "\r" => [18, "si"], "\x0e" => [77, "so"], "\x0f" => [18, "so"], "\x10" => [77, "ss"], "\x11" => [18, "ss"], "\x12" => [77, "st"], "\x13" => [18, "st"], "\x14" => [0, "s "], "\x15" => [0, "s%"], "\x16" => [0, "s-"], "\x17" => [0, "s."], "\x18" => [0, "s/"], "\x19" => [0, "s3"], "\x1a" => [0, "s4"], "\x1b" => [0, "s5"], "\x1c" => [0, "s6"], "\x1d" => [0, "s7"], "\x1e" => [0, "s8"], "\x1f" => [0, "s9"], " " => [0, "s="], "!" => [0, "sA"], "\"" => [0, "s_"], "#" => [0, "sb"], "\$" => [0, "sd"], "%" => [0, "sf"], "&" => [0, "sg"], "'" => [0, "sh"], "(" => [0, "sl"], ")" => [0, "sm"], "*" => [0, "sn"], "+" => [0, "sp"], "," => [0, "sr"], "-" => [0, "su"], "." => [100, "s"], "/" => [110, "s"], [111, "s"], [115, "s"], [116, "s"], [118, "s"], [119, "s"], [122, "s"], [123, "s"], [125, "s"], [126, "s"], [129, "s"], ":" => [143, "s"], ";" => [148, "s"], "<" => [151, "s"], "=" => [153, "s"], ">" => [83, "s"], "?" => [10, "s"], "@" => [77, "t0"], "A" => [18, "t0"], "B" => [77, "t1"], "C" => [18, "t1"], "D" => [77, "t2"], "E" => [18, "t2"], "F" => [77, "ta"], "G" => [18, "ta"], "H" => [77, "tc"], "I" => [18, "tc"], "J" => [77, "te"], "K" => [18, "te"], "L" => [77, "ti"], "M" => [18, "ti"], "N" => [77, "to"], "O" => [18, "to"], "P" => [77, "ts"], "Q" => [18, "ts"], "R" => [77, "tt"], "S" => [18, "tt"], "T" => [0, "t "], "U" => [0, "t%"], "V" => [0, "t-"], "W" => [0, "t."], "X" => [0, "t/"], "Y" => [0, "t3"], "Z" => [0, "t4"], "[" => [0, "t5"], "\\" => [0, "t6"], "]" => [0, "t7"], "^" => [0, "t8"], "_" => [0, "t9"], "`" => [0, "t="], "a" => [0, "tA"], "b" => [0, "t_"], "c" => [0, "tb"], "d" => [0, "td"], "e" => [0, "tf"], "f" => [0, "tg"], "g" => [0, "th"], "h" => [0, "tl"], "i" => [0, "tm"], "j" => [0, "tn"], "k" => [0, "tp"], "l" => [0, "tr"], "m" => [0, "tu"], "n" => [100, "t"], "o" => [110, "t"], "p" => [111, "t"], "q" => [115, "t"], "r" => [116, "t"], "s" => [118, "t"], "t" => [119, "t"], "u" => [122, "t"], "v" => [123, "t"], "w" => [125, "t"], "x" => [126, "t"], "y" => [129, "t"], "z" => [143, "t"], "{" => [148, "t"], "|" => [151, "t"], "}" => [153, "t"], "~" => [83, "t"], "" => [10, "t"], "\x80" => [0, " 0"], "\x81" => [0, " 1"], "\x82" => [0, " 2"], "\x83" => [0, " a"], "\x84" => [0, " c"], "\x85" => [0, " e"], "\x86" => [0, " i"], "\x87" => [0, " o"], "\x88" => [0, " s"], "\x89" => [0, " t"], "\x8a" => [73, " "], "\x8b" => [88, " "], "\x8c" => [89, " "], "\x8d" => [96, " "], "\x8e" => [97, " "], "\x8f" => [99, " "], "\x90" => [106, " "], "\x91" => [136, " "], "\x92" => [139, " "], "\x93" => [141, " "], "\x94" => [145, " "], "\x95" => [147, " "], "\x96" => [149, " "], "\x97" => [101, " "], "\x98" => [112, " "], "\x99" => [117, " "], "\x9a" => [120, " "], "\x9b" => [124, " "], "\x9c" => [127, " "], "\x9d" => [144, " "], "\x9e" => [152, " "], "\x9f" => [11, " "], "\xa0" => [0, "%0"], "\xa1" => [0, "%1"], "\xa2" => [0, "%2"], "\xa3" => [0, "%a"], "\xa4" => [0, "%c"], "\xa5" => [0, "%e"], "\xa6" => [0, "%i"], "\xa7" => [0, "%o"], "\xa8" => [0, "%s"], "\xa9" => [0, "%t"], "\xaa" => [73, "%"], "\xab" => [88, "%"], "\xac" => [89, "%"], "\xad" => [96, "%"], "\xae" => [97, "%"], "\xaf" => [99, "%"], "\xb0" => [106, "%"], "\xb1" => [136, "%"], "\xb2" => [139, "%"], "\xb3" => [141, "%"], "\xb4" => [145, "%"], "\xb5" => [147, "%"], "\xb6" => [149, "%"], "\xb7" => [101, "%"], "\xb8" => [112, "%"], "\xb9" => [117, "%"], "\xba" => [120, "%"], "\xbb" => [124, "%"], "\xbc" => [127, "%"], "\xbd" => [144, "%"], "\xbe" => [152, "%"], "\xbf" => [11, "%"], "\xc0" => [0, "-0"], "\xc1" => [0, "-1"], "\xc2" => [0, "-2"], "\xc3" => [0, "-a"], "\xc4" => [0, "-c"], "\xc5" => [0, "-e"], "\xc6" => [0, "-i"], "\xc7" => [0, "-o"], "\xc8" => [0, "-s"], "\xc9" => [0, "-t"], "\xca" => [73, "-"], "\xcb" => [88, "-"], "\xcc" => [89, "-"], "\xcd" => [96, "-"], "\xce" => [97, "-"], "\xcf" => [99, "-"], "\xd0" => [106, "-"], "\xd1" => [136, "-"], "\xd2" => [139, "-"], "\xd3" => [141, "-"], "\xd4" => [145, "-"], "\xd5" => [147, "-"], "\xd6" => [149, "-"], "\xd7" => [101, "-"], "\xd8" => [112, "-"], "\xd9" => [117, "-"], "\xda" => [120, "-"], "\xdb" => [124, "-"], "\xdc" => [127, "-"], "\xdd" => [144, "-"], "\xde" => [152, "-"], "\xdf" => [11, "-"], "\xe0" => [0, ".0"], "\xe1" => [0, ".1"], "\xe2" => [0, ".2"], "\xe3" => [0, ".a"], "\xe4" => [0, ".c"], "\xe5" => [0, ".e"], "\xe6" => [0, ".i"], "\xe7" => [0, ".o"], "\xe8" => [0, ".s"], "\xe9" => [0, ".t"], "\xea" => [73, "."], "\xeb" => [88, "."], "\xec" => [89, "."], "\xed" => [96, "."], "\xee" => [97, "."], "\xef" => [99, "."], "\xf0" => [106, "."], "\xf1" => [136, "."], "\xf2" => [139, "."], "\xf3" => [141, "."], "\xf4" => [145, "."], "\xf5" => [147, "."], "\xf6" => [149, "."], "\xf7" => [101, "."], "\xf8" => [112, "."], "\xf9" => [117, "."], "\xfa" => [120, "."], "\xfb" => [124, "."], "\xfc" => [127, "."], "\xfd" => [144, "."], "\xfe" => [152, "."], "\xff" => [11, "."]], ["\x00" => [0, "s0"], "\x01" => [0, "s1"], "\x02" => [0, "s2"], "\x03" => [0, "sa"], "\x04" => [0, "sc"], "\x05" => [0, "se"], "\x06" => [0, "si"], "\x07" => [0, "so"], "\x08" => [0, "ss"], "\t" => [0, "st"], "\n" => [73, "s"], "\v" => [88, "s"], "\f" => [89, "s"], "\r" => [96, "s"], "\x0e" => [97, "s"], "\x0f" => [99, "s"], "\x10" => [106, "s"], "\x11" => [136, "s"], "\x12" => [139, "s"], "\x13" => [141, "s"], "\x14" => [145, "s"], "\x15" => [147, "s"], "\x16" => [149, "s"], "\x17" => [101, "s"], "\x18" => [112, "s"], "\x19" => [117, "s"], "\x1a" => [120, "s"], "\x1b" => [124, "s"], "\x1c" => [127, "s"], "\x1d" => [144, "s"], "\x1e" => [152, "s"], "\x1f" => [11, "s"], " " => [0, "t0"], "!" => [0, "t1"], "\"" => [0, "t2"], "#" => [0, "ta"], "\$" => [0, "tc"], "%" => [0, "te"], "&" => [0, "ti"], "'" => [0, "to"], "(" => [0, "ts"], ")" => [0, "tt"], "*" => [73, "t"], "+" => [88, "t"], "," => [89, "t"], "-" => [96, "t"], "." => [97, "t"], "/" => [99, "t"], [106, "t"], [136, "t"], [139, "t"], [141, "t"], [145, "t"], [147, "t"], [149, "t"], [101, "t"], [112, "t"], [117, "t"], ":" => [120, "t"], ";" => [124, "t"], "<" => [127, "t"], "=" => [144, "t"], ">" => [152, "t"], "?" => [11, "t"], "@" => [92, " "], "A" => [95, " "], "B" => [137, " "], "C" => [142, " "], "D" => [150, " "], "E" => [74, " "], "F" => [90, " "], "G" => [98, " "], "H" => [107, " "], "I" => [140, " "], "J" => [146, " "], "K" => [102, " "], "L" => [113, " "], "M" => [121, " "], "N" => [128, " "], "O" => [12, " "], "P" => [92, "%"], "Q" => [95, "%"], "R" => [137, "%"], "S" => [142, "%"], "T" => [150, "%"], "U" => [74, "%"], "V" => [90, "%"], "W" => [98, "%"], "X" => [107, "%"], "Y" => [140, "%"], "Z" => [146, "%"], "[" => [102, "%"], "\\" => [113, "%"], "]" => [121, "%"], "^" => [128, "%"], "_" => [12, "%"], "`" => [92, "-"], "a" => [95, "-"], "b" => [137, "-"], "c" => [142, "-"], "d" => [150, "-"], "e" => [74, "-"], "f" => [90, "-"], "g" => [98, "-"], "h" => [107, "-"], "i" => [140, "-"], "j" => [146, "-"], "k" => [102, "-"], "l" => [113, "-"], "m" => [121, "-"], "n" => [128, "-"], "o" => [12, "-"], "p" => [92, "."], "q" => [95, "."], "r" => [137, "."], "s" => [142, "."], "t" => [150, "."], "u" => [74, "."], "v" => [90, "."], "w" => [98, "."], "x" => [107, "."], "y" => [140, "."], "z" => [146, "."], "{" => [102, "."], "|" => [113, "."], "}" => [121, "."], "~" => [128, "."], "" => [12, "."], "\x80" => [92, "/"], "\x81" => [95, "/"], "\x82" => [137, "/"], "\x83" => [142, "/"], "\x84" => [150, "/"], "\x85" => [74, "/"], "\x86" => [90, "/"], "\x87" => [98, "/"], "\x88" => [107, "/"], "\x89" => [140, "/"], "\x8a" => [146, "/"], "\x8b" => [102, "/"], "\x8c" => [113, "/"], "\x8d" => [121, "/"], "\x8e" => [128, "/"], "\x8f" => [12, "/"], "\x90" => [92, "3"], "\x91" => [95, "3"], "\x92" => [137, "3"], "\x93" => [142, "3"], "\x94" => [150, "3"], "\x95" => [74, "3"], "\x96" => [90, "3"], "\x97" => [98, "3"], "\x98" => [107, "3"], "\x99" => [140, "3"], "\x9a" => [146, "3"], "\x9b" => [102, "3"], "\x9c" => [113, "3"], "\x9d" => [121, "3"], "\x9e" => [128, "3"], "\x9f" => [12, "3"], "\xa0" => [92, "4"], "\xa1" => [95, "4"], "\xa2" => [137, "4"], "\xa3" => [142, "4"], "\xa4" => [150, "4"], "\xa5" => [74, "4"], "\xa6" => [90, "4"], "\xa7" => [98, "4"], "\xa8" => [107, "4"], "\xa9" => [140, "4"], "\xaa" => [146, "4"], "\xab" => [102, "4"], "\xac" => [113, "4"], "\xad" => [121, "4"], "\xae" => [128, "4"], "\xaf" => [12, "4"], "\xb0" => [92, "5"], "\xb1" => [95, "5"], "\xb2" => [137, "5"], "\xb3" => [142, "5"], "\xb4" => [150, "5"], "\xb5" => [74, "5"], "\xb6" => [90, "5"], "\xb7" => [98, "5"], "\xb8" => [107, "5"], "\xb9" => [140, "5"], "\xba" => [146, "5"], "\xbb" => [102, "5"], "\xbc" => [113, "5"], "\xbd" => [121, "5"], "\xbe" => [128, "5"], "\xbf" => [12, "5"], "\xc0" => [92, "6"], "\xc1" => [95, "6"], "\xc2" => [137, "6"], "\xc3" => [142, "6"], "\xc4" => [150, "6"], "\xc5" => [74, "6"], "\xc6" => [90, "6"], "\xc7" => [98, "6"], "\xc8" => [107, "6"], "\xc9" => [140, "6"], "\xca" => [146, "6"], "\xcb" => [102, "6"], "\xcc" => [113, "6"], "\xcd" => [121, "6"], "\xce" => [128, "6"], "\xcf" => [12, "6"], "\xd0" => [92, "7"], "\xd1" => [95, "7"], "\xd2" => [137, "7"], "\xd3" => [142, "7"], "\xd4" => [150, "7"], "\xd5" => [74, "7"], "\xd6" => [90, "7"], "\xd7" => [98, "7"], "\xd8" => [107, "7"], "\xd9" => [140, "7"], "\xda" => [146, "7"], "\xdb" => [102, "7"], "\xdc" => [113, "7"], "\xdd" => [121, "7"], "\xde" => [128, "7"], "\xdf" => [12, "7"], "\xe0" => [92, "8"], "\xe1" => [95, "8"], "\xe2" => [137, "8"], "\xe3" => [142, "8"], "\xe4" => [150, "8"], "\xe5" => [74, "8"], "\xe6" => [90, "8"], "\xe7" => [98, "8"], "\xe8" => [107, "8"], "\xe9" => [140, "8"], "\xea" => [146, "8"], "\xeb" => [102, "8"], "\xec" => [113, "8"], "\xed" => [121, "8"], "\xee" => [128, "8"], "\xef" => [12, "8"], "\xf0" => [92, "9"], "\xf1" => [95, "9"], "\xf2" => [137, "9"], "\xf3" => [142, "9"], "\xf4" => [150, "9"], "\xf5" => [74, "9"], "\xf6" => [90, "9"], "\xf7" => [98, "9"], "\xf8" => [107, "9"], "\xf9" => [140, "9"], "\xfa" => [146, "9"], "\xfb" => [102, "9"], "\xfc" => [113, "9"], "\xfd" => [121, "9"], "\xfe" => [128, "9"], "\xff" => [12, "9"]], ["\x00" => [92, "0"], "\x01" => [95, "0"], "\x02" => [137, "0"], "\x03" => [142, "0"], "\x04" => [150, "0"], "\x05" => [74, "0"], "\x06" => [90, "0"], "\x07" => [98, "0"], "\x08" => [107, "0"], "\t" => [140, "0"], "\n" => [146, "0"], "\v" => [102, "0"], "\f" => [113, "0"], "\r" => [121, "0"], "\x0e" => [128, "0"], "\x0f" => [12, "0"], "\x10" => [92, "1"], "\x11" => [95, "1"], "\x12" => [137, "1"], "\x13" => [142, "1"], "\x14" => [150, "1"], "\x15" => [74, "1"], "\x16" => [90, "1"], "\x17" => [98, "1"], "\x18" => [107, "1"], "\x19" => [140, "1"], "\x1a" => [146, "1"], "\x1b" => [102, "1"], "\x1c" => [113, "1"], "\x1d" => [121, "1"], "\x1e" => [128, "1"], "\x1f" => [12, "1"], " " => [92, "2"], "!" => [95, "2"], "\"" => [137, "2"], "#" => [142, "2"], "\$" => [150, "2"], "%" => [74, "2"], "&" => [90, "2"], "'" => [98, "2"], "(" => [107, "2"], ")" => [140, "2"], "*" => [146, "2"], "+" => [102, "2"], "," => [113, "2"], "-" => [121, "2"], "." => [128, "2"], "/" => [12, "2"], [92, "a"], [95, "a"], [137, "a"], [142, "a"], [150, "a"], [74, "a"], [90, "a"], [98, "a"], [107, "a"], [140, "a"], ":" => [146, "a"], ";" => [102, "a"], "<" => [113, "a"], "=" => [121, "a"], ">" => [128, "a"], "?" => [12, "a"], "@" => [92, "c"], "A" => [95, "c"], "B" => [137, "c"], "C" => [142, "c"], "D" => [150, "c"], "E" => [74, "c"], "F" => [90, "c"], "G" => [98, "c"], "H" => [107, "c"], "I" => [140, "c"], "J" => [146, "c"], "K" => [102, "c"], "L" => [113, "c"], "M" => [121, "c"], "N" => [128, "c"], "O" => [12, "c"], "P" => [92, "e"], "Q" => [95, "e"], "R" => [137, "e"], "S" => [142, "e"], "T" => [150, "e"], "U" => [74, "e"], "V" => [90, "e"], "W" => [98, "e"], "X" => [107, "e"], "Y" => [140, "e"], "Z" => [146, "e"], "[" => [102, "e"], "\\" => [113, "e"], "]" => [121, "e"], "^" => [128, "e"], "_" => [12, "e"], "`" => [92, "i"], "a" => [95, "i"], "b" => [137, "i"], "c" => [142, "i"], "d" => [150, "i"], "e" => [74, "i"], "f" => [90, "i"], "g" => [98, "i"], "h" => [107, "i"], "i" => [140, "i"], "j" => [146, "i"], "k" => [102, "i"], "l" => [113, "i"], "m" => [121, "i"], "n" => [128, "i"], "o" => [12, "i"], "p" => [92, "o"], "q" => [95, "o"], "r" => [137, "o"], "s" => [142, "o"], "t" => [150, "o"], "u" => [74, "o"], "v" => [90, "o"], "w" => [98, "o"], "x" => [107, "o"], "y" => [140, "o"], "z" => [146, "o"], "{" => [102, "o"], "|" => [113, "o"], "}" => [121, "o"], "~" => [128, "o"], "" => [12, "o"], "\x80" => [92, "s"], "\x81" => [95, "s"], "\x82" => [137, "s"], "\x83" => [142, "s"], "\x84" => [150, "s"], "\x85" => [74, "s"], "\x86" => [90, "s"], "\x87" => [98, "s"], "\x88" => [107, "s"], "\x89" => [140, "s"], "\x8a" => [146, "s"], "\x8b" => [102, "s"], "\x8c" => [113, "s"], "\x8d" => [121, "s"], "\x8e" => [128, "s"], "\x8f" => [12, "s"], "\x90" => [92, "t"], "\x91" => [95, "t"], "\x92" => [137, "t"], "\x93" => [142, "t"], "\x94" => [150, "t"], "\x95" => [74, "t"], "\x96" => [90, "t"], "\x97" => [98, "t"], "\x98" => [107, "t"], "\x99" => [140, "t"], "\x9a" => [146, "t"], "\x9b" => [102, "t"], "\x9c" => [113, "t"], "\x9d" => [121, "t"], "\x9e" => [128, "t"], "\x9f" => [12, "t"], "\xa0" => [93, " "], "\xa1" => [138, " "], "\xa2" => [75, " "], "\xa3" => [91, " "], "\xa4" => [108, " "], "\xa5" => [103, " "], "\xa6" => [114, " "], "\xa7" => [14, " "], "\xa8" => [93, "%"], "\xa9" => [138, "%"], "\xaa" => [75, "%"], "\xab" => [91, "%"], "\xac" => [108, "%"], "\xad" => [103, "%"], "\xae" => [114, "%"], "\xaf" => [14, "%"], "\xb0" => [93, "-"], "\xb1" => [138, "-"], "\xb2" => [75, "-"], "\xb3" => [91, "-"], "\xb4" => [108, "-"], "\xb5" => [103, "-"], "\xb6" => [114, "-"], "\xb7" => [14, "-"], "\xb8" => [93, "."], "\xb9" => [138, "."], "\xba" => [75, "."], "\xbb" => [91, "."], "\xbc" => [108, "."], "\xbd" => [103, "."], "\xbe" => [114, "."], "\xbf" => [14, "."], "\xc0" => [93, "/"], "\xc1" => [138, "/"], "\xc2" => [75, "/"], "\xc3" => [91, "/"], "\xc4" => [108, "/"], "\xc5" => [103, "/"], "\xc6" => [114, "/"], "\xc7" => [14, "/"], "\xc8" => [93, "3"], "\xc9" => [138, "3"], "\xca" => [75, "3"], "\xcb" => [91, "3"], "\xcc" => [108, "3"], "\xcd" => [103, "3"], "\xce" => [114, "3"], "\xcf" => [14, "3"], "\xd0" => [93, "4"], "\xd1" => [138, "4"], "\xd2" => [75, "4"], "\xd3" => [91, "4"], "\xd4" => [108, "4"], "\xd5" => [103, "4"], "\xd6" => [114, "4"], "\xd7" => [14, "4"], "\xd8" => [93, "5"], "\xd9" => [138, "5"], "\xda" => [75, "5"], "\xdb" => [91, "5"], "\xdc" => [108, "5"], "\xdd" => [103, "5"], "\xde" => [114, "5"], "\xdf" => [14, "5"], "\xe0" => [93, "6"], "\xe1" => [138, "6"], "\xe2" => [75, "6"], "\xe3" => [91, "6"], "\xe4" => [108, "6"], "\xe5" => [103, "6"], "\xe6" => [114, "6"], "\xe7" => [14, "6"], "\xe8" => [93, "7"], "\xe9" => [138, "7"], "\xea" => [75, "7"], "\xeb" => [91, "7"], "\xec" => [108, "7"], "\xed" => [103, "7"], "\xee" => [114, "7"], "\xef" => [14, "7"], "\xf0" => [93, "8"], "\xf1" => [138, "8"], "\xf2" => [75, "8"], "\xf3" => [91, "8"], "\xf4" => [108, "8"], "\xf5" => [103, "8"], "\xf6" => [114, "8"], "\xf7" => [14, "8"], "\xf8" => [93, "9"], "\xf9" => [138, "9"], "\xfa" => [75, "9"], "\xfb" => [91, "9"], "\xfc" => [108, "9"], "\xfd" => [103, "9"], "\xfe" => [114, "9"], "\xff" => [14, "9"]], ["\x00" => [77, "!0"], "\x01" => [18, "!0"], "\x02" => [77, "!1"], "\x03" => [18, "!1"], "\x04" => [77, "!2"], "\x05" => [18, "!2"], "\x06" => [77, "!a"], "\x07" => [18, "!a"], "\x08" => [77, "!c"], "\t" => [18, "!c"], "\n" => [77, "!e"], "\v" => [18, "!e"], "\f" => [77, "!i"], "\r" => [18, "!i"], "\x0e" => [77, "!o"], "\x0f" => [18, "!o"], "\x10" => [77, "!s"], "\x11" => [18, "!s"], "\x12" => [77, "!t"], "\x13" => [18, "!t"], "\x14" => [0, "! "], "\x15" => [0, "!%"], "\x16" => [0, "!-"], "\x17" => [0, "!."], "\x18" => [0, "!/"], "\x19" => [0, "!3"], "\x1a" => [0, "!4"], "\x1b" => [0, "!5"], "\x1c" => [0, "!6"], "\x1d" => [0, "!7"], "\x1e" => [0, "!8"], "\x1f" => [0, "!9"], " " => [0, "!="], "!" => [0, "!A"], "\"" => [0, "!_"], "#" => [0, "!b"], "\$" => [0, "!d"], "%" => [0, "!f"], "&" => [0, "!g"], "'" => [0, "!h"], "(" => [0, "!l"], ")" => [0, "!m"], "*" => [0, "!n"], "+" => [0, "!p"], "," => [0, "!r"], "-" => [0, "!u"], "." => [100, "!"], "/" => [110, "!"], [111, "!"], [115, "!"], [116, "!"], [118, "!"], [119, "!"], [122, "!"], [123, "!"], [125, "!"], [126, "!"], [129, "!"], ":" => [143, "!"], ";" => [148, "!"], "<" => [151, "!"], "=" => [153, "!"], ">" => [83, "!"], "?" => [10, "!"], "@" => [77, "\"0"], "A" => [18, "\"0"], "B" => [77, "\"1"], "C" => [18, "\"1"], "D" => [77, "\"2"], "E" => [18, "\"2"], "F" => [77, "\"a"], "G" => [18, "\"a"], "H" => [77, "\"c"], "I" => [18, "\"c"], "J" => [77, "\"e"], "K" => [18, "\"e"], "L" => [77, "\"i"], "M" => [18, "\"i"], "N" => [77, "\"o"], "O" => [18, "\"o"], "P" => [77, "\"s"], "Q" => [18, "\"s"], "R" => [77, "\"t"], "S" => [18, "\"t"], "T" => [0, "\" "], "U" => [0, "\"%"], "V" => [0, "\"-"], "W" => [0, "\"."], "X" => [0, "\"/"], "Y" => [0, "\"3"], "Z" => [0, "\"4"], "[" => [0, "\"5"], "\\" => [0, "\"6"], "]" => [0, "\"7"], "^" => [0, "\"8"], "_" => [0, "\"9"], "`" => [0, "\"="], "a" => [0, "\"A"], "b" => [0, "\"_"], "c" => [0, "\"b"], "d" => [0, "\"d"], "e" => [0, "\"f"], "f" => [0, "\"g"], "g" => [0, "\"h"], "h" => [0, "\"l"], "i" => [0, "\"m"], "j" => [0, "\"n"], "k" => [0, "\"p"], "l" => [0, "\"r"], "m" => [0, "\"u"], "n" => [100, "\""], "o" => [110, "\""], "p" => [111, "\""], "q" => [115, "\""], "r" => [116, "\""], "s" => [118, "\""], "t" => [119, "\""], "u" => [122, "\""], "v" => [123, "\""], "w" => [125, "\""], "x" => [126, "\""], "y" => [129, "\""], "z" => [143, "\""], "{" => [148, "\""], "|" => [151, "\""], "}" => [153, "\""], "~" => [83, "\""], "" => [10, "\""], "\x80" => [77, "(0"], "\x81" => [18, "(0"], "\x82" => [77, "(1"], "\x83" => [18, "(1"], "\x84" => [77, "(2"], "\x85" => [18, "(2"], "\x86" => [77, "(a"], "\x87" => [18, "(a"], "\x88" => [77, "(c"], "\x89" => [18, "(c"], "\x8a" => [77, "(e"], "\x8b" => [18, "(e"], "\x8c" => [77, "(i"], "\x8d" => [18, "(i"], "\x8e" => [77, "(o"], "\x8f" => [18, "(o"], "\x90" => [77, "(s"], "\x91" => [18, "(s"], "\x92" => [77, "(t"], "\x93" => [18, "(t"], "\x94" => [0, "( "], "\x95" => [0, "(%"], "\x96" => [0, "(-"], "\x97" => [0, "(."], "\x98" => [0, "(/"], "\x99" => [0, "(3"], "\x9a" => [0, "(4"], "\x9b" => [0, "(5"], "\x9c" => [0, "(6"], "\x9d" => [0, "(7"], "\x9e" => [0, "(8"], "\x9f" => [0, "(9"], "\xa0" => [0, "(="], "\xa1" => [0, "(A"], "\xa2" => [0, "(_"], "\xa3" => [0, "(b"], "\xa4" => [0, "(d"], "\xa5" => [0, "(f"], "\xa6" => [0, "(g"], "\xa7" => [0, "(h"], "\xa8" => [0, "(l"], "\xa9" => [0, "(m"], "\xaa" => [0, "(n"], "\xab" => [0, "(p"], "\xac" => [0, "(r"], "\xad" => [0, "(u"], "\xae" => [100, "("], "\xaf" => [110, "("], "\xb0" => [111, "("], "\xb1" => [115, "("], "\xb2" => [116, "("], "\xb3" => [118, "("], "\xb4" => [119, "("], "\xb5" => [122, "("], "\xb6" => [123, "("], "\xb7" => [125, "("], "\xb8" => [126, "("], "\xb9" => [129, "("], "\xba" => [143, "("], "\xbb" => [148, "("], "\xbc" => [151, "("], "\xbd" => [153, "("], "\xbe" => [83, "("], "\xbf" => [10, "("], "\xc0" => [77, ")0"], "\xc1" => [18, ")0"], "\xc2" => [77, ")1"], "\xc3" => [18, ")1"], "\xc4" => [77, ")2"], "\xc5" => [18, ")2"], "\xc6" => [77, ")a"], "\xc7" => [18, ")a"], "\xc8" => [77, ")c"], "\xc9" => [18, ")c"], "\xca" => [77, ")e"], "\xcb" => [18, ")e"], "\xcc" => [77, ")i"], "\xcd" => [18, ")i"], "\xce" => [77, ")o"], "\xcf" => [18, ")o"], "\xd0" => [77, ")s"], "\xd1" => [18, ")s"], "\xd2" => [77, ")t"], "\xd3" => [18, ")t"], "\xd4" => [0, ") "], "\xd5" => [0, ")%"], "\xd6" => [0, ")-"], "\xd7" => [0, ")."], "\xd8" => [0, ")/"], "\xd9" => [0, ")3"], "\xda" => [0, ")4"], "\xdb" => [0, ")5"], "\xdc" => [0, ")6"], "\xdd" => [0, ")7"], "\xde" => [0, ")8"], "\xdf" => [0, ")9"], "\xe0" => [0, ")="], "\xe1" => [0, ")A"], "\xe2" => [0, ")_"], "\xe3" => [0, ")b"], "\xe4" => [0, ")d"], "\xe5" => [0, ")f"], "\xe6" => [0, ")g"], "\xe7" => [0, ")h"], "\xe8" => [0, ")l"], "\xe9" => [0, ")m"], "\xea" => [0, ")n"], "\xeb" => [0, ")p"], "\xec" => [0, ")r"], "\xed" => [0, ")u"], "\xee" => [100, ")"], "\xef" => [110, ")"], "\xf0" => [111, ")"], "\xf1" => [115, ")"], "\xf2" => [116, ")"], "\xf3" => [118, ")"], "\xf4" => [119, ")"], "\xf5" => [122, ")"], "\xf6" => [123, ")"], "\xf7" => [125, ")"], "\xf8" => [126, ")"], "\xf9" => [129, ")"], "\xfa" => [143, ")"], "\xfb" => [148, ")"], "\xfc" => [151, ")"], "\xfd" => [153, ")"], "\xfe" => [83, ")"], "\xff" => [10, ")"]], ["\x00" => [94, "!0"], "\x01" => [76, "!0"], "\x02" => [104, "!0"], "\x03" => [16, "!0"], "\x04" => [94, "!1"], "\x05" => [76, "!1"], "\x06" => [104, "!1"], "\x07" => [16, "!1"], "\x08" => [94, "!2"], "\t" => [76, "!2"], "\n" => [104, "!2"], "\v" => [16, "!2"], "\f" => [94, "!a"], "\r" => [76, "!a"], "\x0e" => [104, "!a"], "\x0f" => [16, "!a"], "\x10" => [94, "!c"], "\x11" => [76, "!c"], "\x12" => [104, "!c"], "\x13" => [16, "!c"], "\x14" => [94, "!e"], "\x15" => [76, "!e"], "\x16" => [104, "!e"], "\x17" => [16, "!e"], "\x18" => [94, "!i"], "\x19" => [76, "!i"], "\x1a" => [104, "!i"], "\x1b" => [16, "!i"], "\x1c" => [94, "!o"], "\x1d" => [76, "!o"], "\x1e" => [104, "!o"], "\x1f" => [16, "!o"], " " => [94, "!s"], "!" => [76, "!s"], "\"" => [104, "!s"], "#" => [16, "!s"], "\$" => [94, "!t"], "%" => [76, "!t"], "&" => [104, "!t"], "'" => [16, "!t"], "(" => [77, "! "], ")" => [18, "! "], "*" => [77, "!%"], "+" => [18, "!%"], "," => [77, "!-"], "-" => [18, "!-"], "." => [77, "!."], "/" => [18, "!."], [77, "!/"], [18, "!/"], [77, "!3"], [18, "!3"], [77, "!4"], [18, "!4"], [77, "!5"], [18, "!5"], [77, "!6"], [18, "!6"], ":" => [77, "!7"], ";" => [18, "!7"], "<" => [77, "!8"], "=" => [18, "!8"], ">" => [77, "!9"], "?" => [18, "!9"], "@" => [77, "!="], "A" => [18, "!="], "B" => [77, "!A"], "C" => [18, "!A"], "D" => [77, "!_"], "E" => [18, "!_"], "F" => [77, "!b"], "G" => [18, "!b"], "H" => [77, "!d"], "I" => [18, "!d"], "J" => [77, "!f"], "K" => [18, "!f"], "L" => [77, "!g"], "M" => [18, "!g"], "N" => [77, "!h"], "O" => [18, "!h"], "P" => [77, "!l"], "Q" => [18, "!l"], "R" => [77, "!m"], "S" => [18, "!m"], "T" => [77, "!n"], "U" => [18, "!n"], "V" => [77, "!p"], "W" => [18, "!p"], "X" => [77, "!r"], "Y" => [18, "!r"], "Z" => [77, "!u"], "[" => [18, "!u"], "\\" => [0, "!:"], "]" => [0, "!B"], "^" => [0, "!C"], "_" => [0, "!D"], "`" => [0, "!E"], "a" => [0, "!F"], "b" => [0, "!G"], "c" => [0, "!H"], "d" => [0, "!I"], "e" => [0, "!J"], "f" => [0, "!K"], "g" => [0, "!L"], "h" => [0, "!M"], "i" => [0, "!N"], "j" => [0, "!O"], "k" => [0, "!P"], "l" => [0, "!Q"], "m" => [0, "!R"], "n" => [0, "!S"], "o" => [0, "!T"], "p" => [0, "!U"], "q" => [0, "!V"], "r" => [0, "!W"], "s" => [0, "!Y"], "t" => [0, "!j"], "u" => [0, "!k"], "v" => [0, "!q"], "w" => [0, "!v"], "x" => [0, "!w"], "y" => [0, "!x"], "z" => [0, "!y"], "{" => [0, "!z"], "|" => [82, "!"], "}" => [87, "!"], "~" => [130, "!"], "" => [9, "!"], "\x80" => [94, "\"0"], "\x81" => [76, "\"0"], "\x82" => [104, "\"0"], "\x83" => [16, "\"0"], "\x84" => [94, "\"1"], "\x85" => [76, "\"1"], "\x86" => [104, "\"1"], "\x87" => [16, "\"1"], "\x88" => [94, "\"2"], "\x89" => [76, "\"2"], "\x8a" => [104, "\"2"], "\x8b" => [16, "\"2"], "\x8c" => [94, "\"a"], "\x8d" => [76, "\"a"], "\x8e" => [104, "\"a"], "\x8f" => [16, "\"a"], "\x90" => [94, "\"c"], "\x91" => [76, "\"c"], "\x92" => [104, "\"c"], "\x93" => [16, "\"c"], "\x94" => [94, "\"e"], "\x95" => [76, "\"e"], "\x96" => [104, "\"e"], "\x97" => [16, "\"e"], "\x98" => [94, "\"i"], "\x99" => [76, "\"i"], "\x9a" => [104, "\"i"], "\x9b" => [16, "\"i"], "\x9c" => [94, "\"o"], "\x9d" => [76, "\"o"], "\x9e" => [104, "\"o"], "\x9f" => [16, "\"o"], "\xa0" => [94, "\"s"], "\xa1" => [76, "\"s"], "\xa2" => [104, "\"s"], "\xa3" => [16, "\"s"], "\xa4" => [94, "\"t"], "\xa5" => [76, "\"t"], "\xa6" => [104, "\"t"], "\xa7" => [16, "\"t"], "\xa8" => [77, "\" "], "\xa9" => [18, "\" "], "\xaa" => [77, "\"%"], "\xab" => [18, "\"%"], "\xac" => [77, "\"-"], "\xad" => [18, "\"-"], "\xae" => [77, "\"."], "\xaf" => [18, "\"."], "\xb0" => [77, "\"/"], "\xb1" => [18, "\"/"], "\xb2" => [77, "\"3"], "\xb3" => [18, "\"3"], "\xb4" => [77, "\"4"], "\xb5" => [18, "\"4"], "\xb6" => [77, "\"5"], "\xb7" => [18, "\"5"], "\xb8" => [77, "\"6"], "\xb9" => [18, "\"6"], "\xba" => [77, "\"7"], "\xbb" => [18, "\"7"], "\xbc" => [77, "\"8"], "\xbd" => [18, "\"8"], "\xbe" => [77, "\"9"], "\xbf" => [18, "\"9"], "\xc0" => [77, "\"="], "\xc1" => [18, "\"="], "\xc2" => [77, "\"A"], "\xc3" => [18, "\"A"], "\xc4" => [77, "\"_"], "\xc5" => [18, "\"_"], "\xc6" => [77, "\"b"], "\xc7" => [18, "\"b"], "\xc8" => [77, "\"d"], "\xc9" => [18, "\"d"], "\xca" => [77, "\"f"], "\xcb" => [18, "\"f"], "\xcc" => [77, "\"g"], "\xcd" => [18, "\"g"], "\xce" => [77, "\"h"], "\xcf" => [18, "\"h"], "\xd0" => [77, "\"l"], "\xd1" => [18, "\"l"], "\xd2" => [77, "\"m"], "\xd3" => [18, "\"m"], "\xd4" => [77, "\"n"], "\xd5" => [18, "\"n"], "\xd6" => [77, "\"p"], "\xd7" => [18, "\"p"], "\xd8" => [77, "\"r"], "\xd9" => [18, "\"r"], "\xda" => [77, "\"u"], "\xdb" => [18, "\"u"], "\xdc" => [0, "\":"], "\xdd" => [0, "\"B"], "\xde" => [0, "\"C"], "\xdf" => [0, "\"D"], "\xe0" => [0, "\"E"], "\xe1" => [0, "\"F"], "\xe2" => [0, "\"G"], "\xe3" => [0, "\"H"], "\xe4" => [0, "\"I"], "\xe5" => [0, "\"J"], "\xe6" => [0, "\"K"], "\xe7" => [0, "\"L"], "\xe8" => [0, "\"M"], "\xe9" => [0, "\"N"], "\xea" => [0, "\"O"], "\xeb" => [0, "\"P"], "\xec" => [0, "\"Q"], "\xed" => [0, "\"R"], "\xee" => [0, "\"S"], "\xef" => [0, "\"T"], "\xf0" => [0, "\"U"], "\xf1" => [0, "\"V"], "\xf2" => [0, "\"W"], "\xf3" => [0, "\"Y"], "\xf4" => [0, "\"j"], "\xf5" => [0, "\"k"], "\xf6" => [0, "\"q"], "\xf7" => [0, "\"v"], "\xf8" => [0, "\"w"], "\xf9" => [0, "\"x"], "\xfa" => [0, "\"y"], "\xfb" => [0, "\"z"], "\xfc" => [82, "\""], "\xfd" => [87, "\""], "\xfe" => [130, "\""], "\xff" => [9, "\""]], ["\x00" => [94, "#0"], "\x01" => [76, "#0"], "\x02" => [104, "#0"], "\x03" => [16, "#0"], "\x04" => [94, "#1"], "\x05" => [76, "#1"], "\x06" => [104, "#1"], "\x07" => [16, "#1"], "\x08" => [94, "#2"], "\t" => [76, "#2"], "\n" => [104, "#2"], "\v" => [16, "#2"], "\f" => [94, "#a"], "\r" => [76, "#a"], "\x0e" => [104, "#a"], "\x0f" => [16, "#a"], "\x10" => [94, "#c"], "\x11" => [76, "#c"], "\x12" => [104, "#c"], "\x13" => [16, "#c"], "\x14" => [94, "#e"], "\x15" => [76, "#e"], "\x16" => [104, "#e"], "\x17" => [16, "#e"], "\x18" => [94, "#i"], "\x19" => [76, "#i"], "\x1a" => [104, "#i"], "\x1b" => [16, "#i"], "\x1c" => [94, "#o"], "\x1d" => [76, "#o"], "\x1e" => [104, "#o"], "\x1f" => [16, "#o"], " " => [94, "#s"], "!" => [76, "#s"], "\"" => [104, "#s"], "#" => [16, "#s"], "\$" => [94, "#t"], "%" => [76, "#t"], "&" => [104, "#t"], "'" => [16, "#t"], "(" => [77, "# "], ")" => [18, "# "], "*" => [77, "#%"], "+" => [18, "#%"], "," => [77, "#-"], "-" => [18, "#-"], "." => [77, "#."], "/" => [18, "#."], [77, "#/"], [18, "#/"], [77, "#3"], [18, "#3"], [77, "#4"], [18, "#4"], [77, "#5"], [18, "#5"], [77, "#6"], [18, "#6"], ":" => [77, "#7"], ";" => [18, "#7"], "<" => [77, "#8"], "=" => [18, "#8"], ">" => [77, "#9"], "?" => [18, "#9"], "@" => [77, "#="], "A" => [18, "#="], "B" => [77, "#A"], "C" => [18, "#A"], "D" => [77, "#_"], "E" => [18, "#_"], "F" => [77, "#b"], "G" => [18, "#b"], "H" => [77, "#d"], "I" => [18, "#d"], "J" => [77, "#f"], "K" => [18, "#f"], "L" => [77, "#g"], "M" => [18, "#g"], "N" => [77, "#h"], "O" => [18, "#h"], "P" => [77, "#l"], "Q" => [18, "#l"], "R" => [77, "#m"], "S" => [18, "#m"], "T" => [77, "#n"], "U" => [18, "#n"], "V" => [77, "#p"], "W" => [18, "#p"], "X" => [77, "#r"], "Y" => [18, "#r"], "Z" => [77, "#u"], "[" => [18, "#u"], "\\" => [0, "#:"], "]" => [0, "#B"], "^" => [0, "#C"], "_" => [0, "#D"], "`" => [0, "#E"], "a" => [0, "#F"], "b" => [0, "#G"], "c" => [0, "#H"], "d" => [0, "#I"], "e" => [0, "#J"], "f" => [0, "#K"], "g" => [0, "#L"], "h" => [0, "#M"], "i" => [0, "#N"], "j" => [0, "#O"], "k" => [0, "#P"], "l" => [0, "#Q"], "m" => [0, "#R"], "n" => [0, "#S"], "o" => [0, "#T"], "p" => [0, "#U"], "q" => [0, "#V"], "r" => [0, "#W"], "s" => [0, "#Y"], "t" => [0, "#j"], "u" => [0, "#k"], "v" => [0, "#q"], "w" => [0, "#v"], "x" => [0, "#w"], "y" => [0, "#x"], "z" => [0, "#y"], "{" => [0, "#z"], "|" => [82, "#"], "}" => [87, "#"], "~" => [130, "#"], "" => [9, "#"], "\x80" => [94, ">0"], "\x81" => [76, ">0"], "\x82" => [104, ">0"], "\x83" => [16, ">0"], "\x84" => [94, ">1"], "\x85" => [76, ">1"], "\x86" => [104, ">1"], "\x87" => [16, ">1"], "\x88" => [94, ">2"], "\x89" => [76, ">2"], "\x8a" => [104, ">2"], "\x8b" => [16, ">2"], "\x8c" => [94, ">a"], "\x8d" => [76, ">a"], "\x8e" => [104, ">a"], "\x8f" => [16, ">a"], "\x90" => [94, ">c"], "\x91" => [76, ">c"], "\x92" => [104, ">c"], "\x93" => [16, ">c"], "\x94" => [94, ">e"], "\x95" => [76, ">e"], "\x96" => [104, ">e"], "\x97" => [16, ">e"], "\x98" => [94, ">i"], "\x99" => [76, ">i"], "\x9a" => [104, ">i"], "\x9b" => [16, ">i"], "\x9c" => [94, ">o"], "\x9d" => [76, ">o"], "\x9e" => [104, ">o"], "\x9f" => [16, ">o"], "\xa0" => [94, ">s"], "\xa1" => [76, ">s"], "\xa2" => [104, ">s"], "\xa3" => [16, ">s"], "\xa4" => [94, ">t"], "\xa5" => [76, ">t"], "\xa6" => [104, ">t"], "\xa7" => [16, ">t"], "\xa8" => [77, "> "], "\xa9" => [18, "> "], "\xaa" => [77, ">%"], "\xab" => [18, ">%"], "\xac" => [77, ">-"], "\xad" => [18, ">-"], "\xae" => [77, ">."], "\xaf" => [18, ">."], "\xb0" => [77, ">/"], "\xb1" => [18, ">/"], "\xb2" => [77, ">3"], "\xb3" => [18, ">3"], "\xb4" => [77, ">4"], "\xb5" => [18, ">4"], "\xb6" => [77, ">5"], "\xb7" => [18, ">5"], "\xb8" => [77, ">6"], "\xb9" => [18, ">6"], "\xba" => [77, ">7"], "\xbb" => [18, ">7"], "\xbc" => [77, ">8"], "\xbd" => [18, ">8"], "\xbe" => [77, ">9"], "\xbf" => [18, ">9"], "\xc0" => [77, ">="], "\xc1" => [18, ">="], "\xc2" => [77, ">A"], "\xc3" => [18, ">A"], "\xc4" => [77, ">_"], "\xc5" => [18, ">_"], "\xc6" => [77, ">b"], "\xc7" => [18, ">b"], "\xc8" => [77, ">d"], "\xc9" => [18, ">d"], "\xca" => [77, ">f"], "\xcb" => [18, ">f"], "\xcc" => [77, ">g"], "\xcd" => [18, ">g"], "\xce" => [77, ">h"], "\xcf" => [18, ">h"], "\xd0" => [77, ">l"], "\xd1" => [18, ">l"], "\xd2" => [77, ">m"], "\xd3" => [18, ">m"], "\xd4" => [77, ">n"], "\xd5" => [18, ">n"], "\xd6" => [77, ">p"], "\xd7" => [18, ">p"], "\xd8" => [77, ">r"], "\xd9" => [18, ">r"], "\xda" => [77, ">u"], "\xdb" => [18, ">u"], "\xdc" => [0, ">:"], "\xdd" => [0, ">B"], "\xde" => [0, ">C"], "\xdf" => [0, ">D"], "\xe0" => [0, ">E"], "\xe1" => [0, ">F"], "\xe2" => [0, ">G"], "\xe3" => [0, ">H"], "\xe4" => [0, ">I"], "\xe5" => [0, ">J"], "\xe6" => [0, ">K"], "\xe7" => [0, ">L"], "\xe8" => [0, ">M"], "\xe9" => [0, ">N"], "\xea" => [0, ">O"], "\xeb" => [0, ">P"], "\xec" => [0, ">Q"], "\xed" => [0, ">R"], "\xee" => [0, ">S"], "\xef" => [0, ">T"], "\xf0" => [0, ">U"], "\xf1" => [0, ">V"], "\xf2" => [0, ">W"], "\xf3" => [0, ">Y"], "\xf4" => [0, ">j"], "\xf5" => [0, ">k"], "\xf6" => [0, ">q"], "\xf7" => [0, ">v"], "\xf8" => [0, ">w"], "\xf9" => [0, ">x"], "\xfa" => [0, ">y"], "\xfb" => [0, ">z"], "\xfc" => [82, ">"], "\xfd" => [87, ">"], "\xfe" => [130, ">"], "\xff" => [9, ">"]], ["\x00" => [94, "|0"], "\x01" => [76, "|0"], "\x02" => [104, "|0"], "\x03" => [16, "|0"], "\x04" => [94, "|1"], "\x05" => [76, "|1"], "\x06" => [104, "|1"], "\x07" => [16, "|1"], "\x08" => [94, "|2"], "\t" => [76, "|2"], "\n" => [104, "|2"], "\v" => [16, "|2"], "\f" => [94, "|a"], "\r" => [76, "|a"], "\x0e" => [104, "|a"], "\x0f" => [16, "|a"], "\x10" => [94, "|c"], "\x11" => [76, "|c"], "\x12" => [104, "|c"], "\x13" => [16, "|c"], "\x14" => [94, "|e"], "\x15" => [76, "|e"], "\x16" => [104, "|e"], "\x17" => [16, "|e"], "\x18" => [94, "|i"], "\x19" => [76, "|i"], "\x1a" => [104, "|i"], "\x1b" => [16, "|i"], "\x1c" => [94, "|o"], "\x1d" => [76, "|o"], "\x1e" => [104, "|o"], "\x1f" => [16, "|o"], " " => [94, "|s"], "!" => [76, "|s"], "\"" => [104, "|s"], "#" => [16, "|s"], "\$" => [94, "|t"], "%" => [76, "|t"], "&" => [104, "|t"], "'" => [16, "|t"], "(" => [77, "| "], ")" => [18, "| "], "*" => [77, "|%"], "+" => [18, "|%"], "," => [77, "|-"], "-" => [18, "|-"], "." => [77, "|."], "/" => [18, "|."], [77, "|/"], [18, "|/"], [77, "|3"], [18, "|3"], [77, "|4"], [18, "|4"], [77, "|5"], [18, "|5"], [77, "|6"], [18, "|6"], ":" => [77, "|7"], ";" => [18, "|7"], "<" => [77, "|8"], "=" => [18, "|8"], ">" => [77, "|9"], "?" => [18, "|9"], "@" => [77, "|="], "A" => [18, "|="], "B" => [77, "|A"], "C" => [18, "|A"], "D" => [77, "|_"], "E" => [18, "|_"], "F" => [77, "|b"], "G" => [18, "|b"], "H" => [77, "|d"], "I" => [18, "|d"], "J" => [77, "|f"], "K" => [18, "|f"], "L" => [77, "|g"], "M" => [18, "|g"], "N" => [77, "|h"], "O" => [18, "|h"], "P" => [77, "|l"], "Q" => [18, "|l"], "R" => [77, "|m"], "S" => [18, "|m"], "T" => [77, "|n"], "U" => [18, "|n"], "V" => [77, "|p"], "W" => [18, "|p"], "X" => [77, "|r"], "Y" => [18, "|r"], "Z" => [77, "|u"], "[" => [18, "|u"], "\\" => [0, "|:"], "]" => [0, "|B"], "^" => [0, "|C"], "_" => [0, "|D"], "`" => [0, "|E"], "a" => [0, "|F"], "b" => [0, "|G"], "c" => [0, "|H"], "d" => [0, "|I"], "e" => [0, "|J"], "f" => [0, "|K"], "g" => [0, "|L"], "h" => [0, "|M"], "i" => [0, "|N"], "j" => [0, "|O"], "k" => [0, "|P"], "l" => [0, "|Q"], "m" => [0, "|R"], "n" => [0, "|S"], "o" => [0, "|T"], "p" => [0, "|U"], "q" => [0, "|V"], "r" => [0, "|W"], "s" => [0, "|Y"], "t" => [0, "|j"], "u" => [0, "|k"], "v" => [0, "|q"], "w" => [0, "|v"], "x" => [0, "|w"], "y" => [0, "|x"], "z" => [0, "|y"], "{" => [0, "|z"], "|" => [82, "|"], "}" => [87, "|"], "~" => [130, "|"], "" => [9, "|"], "\x80" => [77, "#0"], "\x81" => [18, "#0"], "\x82" => [77, "#1"], "\x83" => [18, "#1"], "\x84" => [77, "#2"], "\x85" => [18, "#2"], "\x86" => [77, "#a"], "\x87" => [18, "#a"], "\x88" => [77, "#c"], "\x89" => [18, "#c"], "\x8a" => [77, "#e"], "\x8b" => [18, "#e"], "\x8c" => [77, "#i"], "\x8d" => [18, "#i"], "\x8e" => [77, "#o"], "\x8f" => [18, "#o"], "\x90" => [77, "#s"], "\x91" => [18, "#s"], "\x92" => [77, "#t"], "\x93" => [18, "#t"], "\x94" => [0, "# "], "\x95" => [0, "#%"], "\x96" => [0, "#-"], "\x97" => [0, "#."], "\x98" => [0, "#/"], "\x99" => [0, "#3"], "\x9a" => [0, "#4"], "\x9b" => [0, "#5"], "\x9c" => [0, "#6"], "\x9d" => [0, "#7"], "\x9e" => [0, "#8"], "\x9f" => [0, "#9"], "\xa0" => [0, "#="], "\xa1" => [0, "#A"], "\xa2" => [0, "#_"], "\xa3" => [0, "#b"], "\xa4" => [0, "#d"], "\xa5" => [0, "#f"], "\xa6" => [0, "#g"], "\xa7" => [0, "#h"], "\xa8" => [0, "#l"], "\xa9" => [0, "#m"], "\xaa" => [0, "#n"], "\xab" => [0, "#p"], "\xac" => [0, "#r"], "\xad" => [0, "#u"], "\xae" => [100, "#"], "\xaf" => [110, "#"], "\xb0" => [111, "#"], "\xb1" => [115, "#"], "\xb2" => [116, "#"], "\xb3" => [118, "#"], "\xb4" => [119, "#"], "\xb5" => [122, "#"], "\xb6" => [123, "#"], "\xb7" => [125, "#"], "\xb8" => [126, "#"], "\xb9" => [129, "#"], "\xba" => [143, "#"], "\xbb" => [148, "#"], "\xbc" => [151, "#"], "\xbd" => [153, "#"], "\xbe" => [83, "#"], "\xbf" => [10, "#"], "\xc0" => [77, ">0"], "\xc1" => [18, ">0"], "\xc2" => [77, ">1"], "\xc3" => [18, ">1"], "\xc4" => [77, ">2"], "\xc5" => [18, ">2"], "\xc6" => [77, ">a"], "\xc7" => [18, ">a"], "\xc8" => [77, ">c"], "\xc9" => [18, ">c"], "\xca" => [77, ">e"], "\xcb" => [18, ">e"], "\xcc" => [77, ">i"], "\xcd" => [18, ">i"], "\xce" => [77, ">o"], "\xcf" => [18, ">o"], "\xd0" => [77, ">s"], "\xd1" => [18, ">s"], "\xd2" => [77, ">t"], "\xd3" => [18, ">t"], "\xd4" => [0, "> "], "\xd5" => [0, ">%"], "\xd6" => [0, ">-"], "\xd7" => [0, ">."], "\xd8" => [0, ">/"], "\xd9" => [0, ">3"], "\xda" => [0, ">4"], "\xdb" => [0, ">5"], "\xdc" => [0, ">6"], "\xdd" => [0, ">7"], "\xde" => [0, ">8"], "\xdf" => [0, ">9"], "\xe0" => [0, ">="], "\xe1" => [0, ">A"], "\xe2" => [0, ">_"], "\xe3" => [0, ">b"], "\xe4" => [0, ">d"], "\xe5" => [0, ">f"], "\xe6" => [0, ">g"], "\xe7" => [0, ">h"], "\xe8" => [0, ">l"], "\xe9" => [0, ">m"], "\xea" => [0, ">n"], "\xeb" => [0, ">p"], "\xec" => [0, ">r"], "\xed" => [0, ">u"], "\xee" => [100, ">"], "\xef" => [110, ">"], "\xf0" => [111, ">"], "\xf1" => [115, ">"], "\xf2" => [116, ">"], "\xf3" => [118, ">"], "\xf4" => [119, ">"], "\xf5" => [122, ">"], "\xf6" => [123, ">"], "\xf7" => [125, ">"], "\xf8" => [126, ">"], "\xf9" => [129, ">"], "\xfa" => [143, ">"], "\xfb" => [148, ">"], "\xfc" => [151, ">"], "\xfd" => [153, ">"], "\xfe" => [83, ">"], "\xff" => [10, ">"]], ["\x00" => [94, "&0"], "\x01" => [76, "&0"], "\x02" => [104, "&0"], "\x03" => [16, "&0"], "\x04" => [94, "&1"], "\x05" => [76, "&1"], "\x06" => [104, "&1"], "\x07" => [16, "&1"], "\x08" => [94, "&2"], "\t" => [76, "&2"], "\n" => [104, "&2"], "\v" => [16, "&2"], "\f" => [94, "&a"], "\r" => [76, "&a"], "\x0e" => [104, "&a"], "\x0f" => [16, "&a"], "\x10" => [94, "&c"], "\x11" => [76, "&c"], "\x12" => [104, "&c"], "\x13" => [16, "&c"], "\x14" => [94, "&e"], "\x15" => [76, "&e"], "\x16" => [104, "&e"], "\x17" => [16, "&e"], "\x18" => [94, "&i"], "\x19" => [76, "&i"], "\x1a" => [104, "&i"], "\x1b" => [16, "&i"], "\x1c" => [94, "&o"], "\x1d" => [76, "&o"], "\x1e" => [104, "&o"], "\x1f" => [16, "&o"], " " => [94, "&s"], "!" => [76, "&s"], "\"" => [104, "&s"], "#" => [16, "&s"], "\$" => [94, "&t"], "%" => [76, "&t"], "&" => [104, "&t"], "'" => [16, "&t"], "(" => [77, "& "], ")" => [18, "& "], "*" => [77, "&%"], "+" => [18, "&%"], "," => [77, "&-"], "-" => [18, "&-"], "." => [77, "&."], "/" => [18, "&."], [77, "&/"], [18, "&/"], [77, "&3"], [18, "&3"], [77, "&4"], [18, "&4"], [77, "&5"], [18, "&5"], [77, "&6"], [18, "&6"], ":" => [77, "&7"], ";" => [18, "&7"], "<" => [77, "&8"], "=" => [18, "&8"], ">" => [77, "&9"], "?" => [18, "&9"], "@" => [77, "&="], "A" => [18, "&="], "B" => [77, "&A"], "C" => [18, "&A"], "D" => [77, "&_"], "E" => [18, "&_"], "F" => [77, "&b"], "G" => [18, "&b"], "H" => [77, "&d"], "I" => [18, "&d"], "J" => [77, "&f"], "K" => [18, "&f"], "L" => [77, "&g"], "M" => [18, "&g"], "N" => [77, "&h"], "O" => [18, "&h"], "P" => [77, "&l"], "Q" => [18, "&l"], "R" => [77, "&m"], "S" => [18, "&m"], "T" => [77, "&n"], "U" => [18, "&n"], "V" => [77, "&p"], "W" => [18, "&p"], "X" => [77, "&r"], "Y" => [18, "&r"], "Z" => [77, "&u"], "[" => [18, "&u"], "\\" => [0, "&:"], "]" => [0, "&B"], "^" => [0, "&C"], "_" => [0, "&D"], "`" => [0, "&E"], "a" => [0, "&F"], "b" => [0, "&G"], "c" => [0, "&H"], "d" => [0, "&I"], "e" => [0, "&J"], "f" => [0, "&K"], "g" => [0, "&L"], "h" => [0, "&M"], "i" => [0, "&N"], "j" => [0, "&O"], "k" => [0, "&P"], "l" => [0, "&Q"], "m" => [0, "&R"], "n" => [0, "&S"], "o" => [0, "&T"], "p" => [0, "&U"], "q" => [0, "&V"], "r" => [0, "&W"], "s" => [0, "&Y"], "t" => [0, "&j"], "u" => [0, "&k"], "v" => [0, "&q"], "w" => [0, "&v"], "x" => [0, "&w"], "y" => [0, "&x"], "z" => [0, "&y"], "{" => [0, "&z"], "|" => [82, "&"], "}" => [87, "&"], "~" => [130, "&"], "" => [9, "&"], "\x80" => [94, "*0"], "\x81" => [76, "*0"], "\x82" => [104, "*0"], "\x83" => [16, "*0"], "\x84" => [94, "*1"], "\x85" => [76, "*1"], "\x86" => [104, "*1"], "\x87" => [16, "*1"], "\x88" => [94, "*2"], "\x89" => [76, "*2"], "\x8a" => [104, "*2"], "\x8b" => [16, "*2"], "\x8c" => [94, "*a"], "\x8d" => [76, "*a"], "\x8e" => [104, "*a"], "\x8f" => [16, "*a"], "\x90" => [94, "*c"], "\x91" => [76, "*c"], "\x92" => [104, "*c"], "\x93" => [16, "*c"], "\x94" => [94, "*e"], "\x95" => [76, "*e"], "\x96" => [104, "*e"], "\x97" => [16, "*e"], "\x98" => [94, "*i"], "\x99" => [76, "*i"], "\x9a" => [104, "*i"], "\x9b" => [16, "*i"], "\x9c" => [94, "*o"], "\x9d" => [76, "*o"], "\x9e" => [104, "*o"], "\x9f" => [16, "*o"], "\xa0" => [94, "*s"], "\xa1" => [76, "*s"], "\xa2" => [104, "*s"], "\xa3" => [16, "*s"], "\xa4" => [94, "*t"], "\xa5" => [76, "*t"], "\xa6" => [104, "*t"], "\xa7" => [16, "*t"], "\xa8" => [77, "* "], "\xa9" => [18, "* "], "\xaa" => [77, "*%"], "\xab" => [18, "*%"], "\xac" => [77, "*-"], "\xad" => [18, "*-"], "\xae" => [77, "*."], "\xaf" => [18, "*."], "\xb0" => [77, "*/"], "\xb1" => [18, "*/"], "\xb2" => [77, "*3"], "\xb3" => [18, "*3"], "\xb4" => [77, "*4"], "\xb5" => [18, "*4"], "\xb6" => [77, "*5"], "\xb7" => [18, "*5"], "\xb8" => [77, "*6"], "\xb9" => [18, "*6"], "\xba" => [77, "*7"], "\xbb" => [18, "*7"], "\xbc" => [77, "*8"], "\xbd" => [18, "*8"], "\xbe" => [77, "*9"], "\xbf" => [18, "*9"], "\xc0" => [77, "*="], "\xc1" => [18, "*="], "\xc2" => [77, "*A"], "\xc3" => [18, "*A"], "\xc4" => [77, "*_"], "\xc5" => [18, "*_"], "\xc6" => [77, "*b"], "\xc7" => [18, "*b"], "\xc8" => [77, "*d"], "\xc9" => [18, "*d"], "\xca" => [77, "*f"], "\xcb" => [18, "*f"], "\xcc" => [77, "*g"], "\xcd" => [18, "*g"], "\xce" => [77, "*h"], "\xcf" => [18, "*h"], "\xd0" => [77, "*l"], "\xd1" => [18, "*l"], "\xd2" => [77, "*m"], "\xd3" => [18, "*m"], "\xd4" => [77, "*n"], "\xd5" => [18, "*n"], "\xd6" => [77, "*p"], "\xd7" => [18, "*p"], "\xd8" => [77, "*r"], "\xd9" => [18, "*r"], "\xda" => [77, "*u"], "\xdb" => [18, "*u"], "\xdc" => [0, "*:"], "\xdd" => [0, "*B"], "\xde" => [0, "*C"], "\xdf" => [0, "*D"], "\xe0" => [0, "*E"], "\xe1" => [0, "*F"], "\xe2" => [0, "*G"], "\xe3" => [0, "*H"], "\xe4" => [0, "*I"], "\xe5" => [0, "*J"], "\xe6" => [0, "*K"], "\xe7" => [0, "*L"], "\xe8" => [0, "*M"], "\xe9" => [0, "*N"], "\xea" => [0, "*O"], "\xeb" => [0, "*P"], "\xec" => [0, "*Q"], "\xed" => [0, "*R"], "\xee" => [0, "*S"], "\xef" => [0, "*T"], "\xf0" => [0, "*U"], "\xf1" => [0, "*V"], "\xf2" => [0, "*W"], "\xf3" => [0, "*Y"], "\xf4" => [0, "*j"], "\xf5" => [0, "*k"], "\xf6" => [0, "*q"], "\xf7" => [0, "*v"], "\xf8" => [0, "*w"], "\xf9" => [0, "*x"], "\xfa" => [0, "*y"], "\xfb" => [0, "*z"], "\xfc" => [82, "*"], "\xfd" => [87, "*"], "\xfe" => [130, "*"], "\xff" => [9, "*"]], ["\x00" => [77, "&0"], "\x01" => [18, "&0"], "\x02" => [77, "&1"], "\x03" => [18, "&1"], "\x04" => [77, "&2"], "\x05" => [18, "&2"], "\x06" => [77, "&a"], "\x07" => [18, "&a"], "\x08" => [77, "&c"], "\t" => [18, "&c"], "\n" => [77, "&e"], "\v" => [18, "&e"], "\f" => [77, "&i"], "\r" => [18, "&i"], "\x0e" => [77, "&o"], "\x0f" => [18, "&o"], "\x10" => [77, "&s"], "\x11" => [18, "&s"], "\x12" => [77, "&t"], "\x13" => [18, "&t"], "\x14" => [0, "& "], "\x15" => [0, "&%"], "\x16" => [0, "&-"], "\x17" => [0, "&."], "\x18" => [0, "&/"], "\x19" => [0, "&3"], "\x1a" => [0, "&4"], "\x1b" => [0, "&5"], "\x1c" => [0, "&6"], "\x1d" => [0, "&7"], "\x1e" => [0, "&8"], "\x1f" => [0, "&9"], " " => [0, "&="], "!" => [0, "&A"], "\"" => [0, "&_"], "#" => [0, "&b"], "\$" => [0, "&d"], "%" => [0, "&f"], "&" => [0, "&g"], "'" => [0, "&h"], "(" => [0, "&l"], ")" => [0, "&m"], "*" => [0, "&n"], "+" => [0, "&p"], "," => [0, "&r"], "-" => [0, "&u"], "." => [100, "&"], "/" => [110, "&"], [111, "&"], [115, "&"], [116, "&"], [118, "&"], [119, "&"], [122, "&"], [123, "&"], [125, "&"], [126, "&"], [129, "&"], ":" => [143, "&"], ";" => [148, "&"], "<" => [151, "&"], "=" => [153, "&"], ">" => [83, "&"], "?" => [10, "&"], "@" => [77, "*0"], "A" => [18, "*0"], "B" => [77, "*1"], "C" => [18, "*1"], "D" => [77, "*2"], "E" => [18, "*2"], "F" => [77, "*a"], "G" => [18, "*a"], "H" => [77, "*c"], "I" => [18, "*c"], "J" => [77, "*e"], "K" => [18, "*e"], "L" => [77, "*i"], "M" => [18, "*i"], "N" => [77, "*o"], "O" => [18, "*o"], "P" => [77, "*s"], "Q" => [18, "*s"], "R" => [77, "*t"], "S" => [18, "*t"], "T" => [0, "* "], "U" => [0, "*%"], "V" => [0, "*-"], "W" => [0, "*."], "X" => [0, "*/"], "Y" => [0, "*3"], "Z" => [0, "*4"], "[" => [0, "*5"], "\\" => [0, "*6"], "]" => [0, "*7"], "^" => [0, "*8"], "_" => [0, "*9"], "`" => [0, "*="], "a" => [0, "*A"], "b" => [0, "*_"], "c" => [0, "*b"], "d" => [0, "*d"], "e" => [0, "*f"], "f" => [0, "*g"], "g" => [0, "*h"], "h" => [0, "*l"], "i" => [0, "*m"], "j" => [0, "*n"], "k" => [0, "*p"], "l" => [0, "*r"], "m" => [0, "*u"], "n" => [100, "*"], "o" => [110, "*"], "p" => [111, "*"], "q" => [115, "*"], "r" => [116, "*"], "s" => [118, "*"], "t" => [119, "*"], "u" => [122, "*"], "v" => [123, "*"], "w" => [125, "*"], "x" => [126, "*"], "y" => [129, "*"], "z" => [143, "*"], "{" => [148, "*"], "|" => [151, "*"], "}" => [153, "*"], "~" => [83, "*"], "" => [10, "*"], "\x80" => [77, ",0"], "\x81" => [18, ",0"], "\x82" => [77, ",1"], "\x83" => [18, ",1"], "\x84" => [77, ",2"], "\x85" => [18, ",2"], "\x86" => [77, ",a"], "\x87" => [18, ",a"], "\x88" => [77, ",c"], "\x89" => [18, ",c"], "\x8a" => [77, ",e"], "\x8b" => [18, ",e"], "\x8c" => [77, ",i"], "\x8d" => [18, ",i"], "\x8e" => [77, ",o"], "\x8f" => [18, ",o"], "\x90" => [77, ",s"], "\x91" => [18, ",s"], "\x92" => [77, ",t"], "\x93" => [18, ",t"], "\x94" => [0, ", "], "\x95" => [0, ",%"], "\x96" => [0, ",-"], "\x97" => [0, ",."], "\x98" => [0, ",/"], "\x99" => [0, ",3"], "\x9a" => [0, ",4"], "\x9b" => [0, ",5"], "\x9c" => [0, ",6"], "\x9d" => [0, ",7"], "\x9e" => [0, ",8"], "\x9f" => [0, ",9"], "\xa0" => [0, ",="], "\xa1" => [0, ",A"], "\xa2" => [0, ",_"], "\xa3" => [0, ",b"], "\xa4" => [0, ",d"], "\xa5" => [0, ",f"], "\xa6" => [0, ",g"], "\xa7" => [0, ",h"], "\xa8" => [0, ",l"], "\xa9" => [0, ",m"], "\xaa" => [0, ",n"], "\xab" => [0, ",p"], "\xac" => [0, ",r"], "\xad" => [0, ",u"], "\xae" => [100, ","], "\xaf" => [110, ","], "\xb0" => [111, ","], "\xb1" => [115, ","], "\xb2" => [116, ","], "\xb3" => [118, ","], "\xb4" => [119, ","], "\xb5" => [122, ","], "\xb6" => [123, ","], "\xb7" => [125, ","], "\xb8" => [126, ","], "\xb9" => [129, ","], "\xba" => [143, ","], "\xbb" => [148, ","], "\xbc" => [151, ","], "\xbd" => [153, ","], "\xbe" => [83, ","], "\xbf" => [10, ","], "\xc0" => [77, ";0"], "\xc1" => [18, ";0"], "\xc2" => [77, ";1"], "\xc3" => [18, ";1"], "\xc4" => [77, ";2"], "\xc5" => [18, ";2"], "\xc6" => [77, ";a"], "\xc7" => [18, ";a"], "\xc8" => [77, ";c"], "\xc9" => [18, ";c"], "\xca" => [77, ";e"], "\xcb" => [18, ";e"], "\xcc" => [77, ";i"], "\xcd" => [18, ";i"], "\xce" => [77, ";o"], "\xcf" => [18, ";o"], "\xd0" => [77, ";s"], "\xd1" => [18, ";s"], "\xd2" => [77, ";t"], "\xd3" => [18, ";t"], "\xd4" => [0, "; "], "\xd5" => [0, ";%"], "\xd6" => [0, ";-"], "\xd7" => [0, ";."], "\xd8" => [0, ";/"], "\xd9" => [0, ";3"], "\xda" => [0, ";4"], "\xdb" => [0, ";5"], "\xdc" => [0, ";6"], "\xdd" => [0, ";7"], "\xde" => [0, ";8"], "\xdf" => [0, ";9"], "\xe0" => [0, ";="], "\xe1" => [0, ";A"], "\xe2" => [0, ";_"], "\xe3" => [0, ";b"], "\xe4" => [0, ";d"], "\xe5" => [0, ";f"], "\xe6" => [0, ";g"], "\xe7" => [0, ";h"], "\xe8" => [0, ";l"], "\xe9" => [0, ";m"], "\xea" => [0, ";n"], "\xeb" => [0, ";p"], "\xec" => [0, ";r"], "\xed" => [0, ";u"], "\xee" => [100, ";"], "\xef" => [110, ";"], "\xf0" => [111, ";"], "\xf1" => [115, ";"], "\xf2" => [116, ";"], "\xf3" => [118, ";"], "\xf4" => [119, ";"], "\xf5" => [122, ";"], "\xf6" => [123, ";"], "\xf7" => [125, ";"], "\xf8" => [126, ";"], "\xf9" => [129, ";"], "\xfa" => [143, ";"], "\xfb" => [148, ";"], "\xfc" => [151, ";"], "\xfd" => [153, ";"], "\xfe" => [83, ";"], "\xff" => [10, ";"]], ["\x00" => [94, "'0"], "\x01" => [76, "'0"], "\x02" => [104, "'0"], "\x03" => [16, "'0"], "\x04" => [94, "'1"], "\x05" => [76, "'1"], "\x06" => [104, "'1"], "\x07" => [16, "'1"], "\x08" => [94, "'2"], "\t" => [76, "'2"], "\n" => [104, "'2"], "\v" => [16, "'2"], "\f" => [94, "'a"], "\r" => [76, "'a"], "\x0e" => [104, "'a"], "\x0f" => [16, "'a"], "\x10" => [94, "'c"], "\x11" => [76, "'c"], "\x12" => [104, "'c"], "\x13" => [16, "'c"], "\x14" => [94, "'e"], "\x15" => [76, "'e"], "\x16" => [104, "'e"], "\x17" => [16, "'e"], "\x18" => [94, "'i"], "\x19" => [76, "'i"], "\x1a" => [104, "'i"], "\x1b" => [16, "'i"], "\x1c" => [94, "'o"], "\x1d" => [76, "'o"], "\x1e" => [104, "'o"], "\x1f" => [16, "'o"], " " => [94, "'s"], "!" => [76, "'s"], "\"" => [104, "'s"], "#" => [16, "'s"], "\$" => [94, "'t"], "%" => [76, "'t"], "&" => [104, "'t"], "'" => [16, "'t"], "(" => [77, "' "], ")" => [18, "' "], "*" => [77, "'%"], "+" => [18, "'%"], "," => [77, "'-"], "-" => [18, "'-"], "." => [77, "'."], "/" => [18, "'."], [77, "'/"], [18, "'/"], [77, "'3"], [18, "'3"], [77, "'4"], [18, "'4"], [77, "'5"], [18, "'5"], [77, "'6"], [18, "'6"], ":" => [77, "'7"], ";" => [18, "'7"], "<" => [77, "'8"], "=" => [18, "'8"], ">" => [77, "'9"], "?" => [18, "'9"], "@" => [77, "'="], "A" => [18, "'="], "B" => [77, "'A"], "C" => [18, "'A"], "D" => [77, "'_"], "E" => [18, "'_"], "F" => [77, "'b"], "G" => [18, "'b"], "H" => [77, "'d"], "I" => [18, "'d"], "J" => [77, "'f"], "K" => [18, "'f"], "L" => [77, "'g"], "M" => [18, "'g"], "N" => [77, "'h"], "O" => [18, "'h"], "P" => [77, "'l"], "Q" => [18, "'l"], "R" => [77, "'m"], "S" => [18, "'m"], "T" => [77, "'n"], "U" => [18, "'n"], "V" => [77, "'p"], "W" => [18, "'p"], "X" => [77, "'r"], "Y" => [18, "'r"], "Z" => [77, "'u"], "[" => [18, "'u"], "\\" => [0, "':"], "]" => [0, "'B"], "^" => [0, "'C"], "_" => [0, "'D"], "`" => [0, "'E"], "a" => [0, "'F"], "b" => [0, "'G"], "c" => [0, "'H"], "d" => [0, "'I"], "e" => [0, "'J"], "f" => [0, "'K"], "g" => [0, "'L"], "h" => [0, "'M"], "i" => [0, "'N"], "j" => [0, "'O"], "k" => [0, "'P"], "l" => [0, "'Q"], "m" => [0, "'R"], "n" => [0, "'S"], "o" => [0, "'T"], "p" => [0, "'U"], "q" => [0, "'V"], "r" => [0, "'W"], "s" => [0, "'Y"], "t" => [0, "'j"], "u" => [0, "'k"], "v" => [0, "'q"], "w" => [0, "'v"], "x" => [0, "'w"], "y" => [0, "'x"], "z" => [0, "'y"], "{" => [0, "'z"], "|" => [82, "'"], "}" => [87, "'"], "~" => [130, "'"], "" => [9, "'"], "\x80" => [94, "+0"], "\x81" => [76, "+0"], "\x82" => [104, "+0"], "\x83" => [16, "+0"], "\x84" => [94, "+1"], "\x85" => [76, "+1"], "\x86" => [104, "+1"], "\x87" => [16, "+1"], "\x88" => [94, "+2"], "\x89" => [76, "+2"], "\x8a" => [104, "+2"], "\x8b" => [16, "+2"], "\x8c" => [94, "+a"], "\x8d" => [76, "+a"], "\x8e" => [104, "+a"], "\x8f" => [16, "+a"], "\x90" => [94, "+c"], "\x91" => [76, "+c"], "\x92" => [104, "+c"], "\x93" => [16, "+c"], "\x94" => [94, "+e"], "\x95" => [76, "+e"], "\x96" => [104, "+e"], "\x97" => [16, "+e"], "\x98" => [94, "+i"], "\x99" => [76, "+i"], "\x9a" => [104, "+i"], "\x9b" => [16, "+i"], "\x9c" => [94, "+o"], "\x9d" => [76, "+o"], "\x9e" => [104, "+o"], "\x9f" => [16, "+o"], "\xa0" => [94, "+s"], "\xa1" => [76, "+s"], "\xa2" => [104, "+s"], "\xa3" => [16, "+s"], "\xa4" => [94, "+t"], "\xa5" => [76, "+t"], "\xa6" => [104, "+t"], "\xa7" => [16, "+t"], "\xa8" => [77, "+ "], "\xa9" => [18, "+ "], "\xaa" => [77, "+%"], "\xab" => [18, "+%"], "\xac" => [77, "+-"], "\xad" => [18, "+-"], "\xae" => [77, "+."], "\xaf" => [18, "+."], "\xb0" => [77, "+/"], "\xb1" => [18, "+/"], "\xb2" => [77, "+3"], "\xb3" => [18, "+3"], "\xb4" => [77, "+4"], "\xb5" => [18, "+4"], "\xb6" => [77, "+5"], "\xb7" => [18, "+5"], "\xb8" => [77, "+6"], "\xb9" => [18, "+6"], "\xba" => [77, "+7"], "\xbb" => [18, "+7"], "\xbc" => [77, "+8"], "\xbd" => [18, "+8"], "\xbe" => [77, "+9"], "\xbf" => [18, "+9"], "\xc0" => [77, "+="], "\xc1" => [18, "+="], "\xc2" => [77, "+A"], "\xc3" => [18, "+A"], "\xc4" => [77, "+_"], "\xc5" => [18, "+_"], "\xc6" => [77, "+b"], "\xc7" => [18, "+b"], "\xc8" => [77, "+d"], "\xc9" => [18, "+d"], "\xca" => [77, "+f"], "\xcb" => [18, "+f"], "\xcc" => [77, "+g"], "\xcd" => [18, "+g"], "\xce" => [77, "+h"], "\xcf" => [18, "+h"], "\xd0" => [77, "+l"], "\xd1" => [18, "+l"], "\xd2" => [77, "+m"], "\xd3" => [18, "+m"], "\xd4" => [77, "+n"], "\xd5" => [18, "+n"], "\xd6" => [77, "+p"], "\xd7" => [18, "+p"], "\xd8" => [77, "+r"], "\xd9" => [18, "+r"], "\xda" => [77, "+u"], "\xdb" => [18, "+u"], "\xdc" => [0, "+:"], "\xdd" => [0, "+B"], "\xde" => [0, "+C"], "\xdf" => [0, "+D"], "\xe0" => [0, "+E"], "\xe1" => [0, "+F"], "\xe2" => [0, "+G"], "\xe3" => [0, "+H"], "\xe4" => [0, "+I"], "\xe5" => [0, "+J"], "\xe6" => [0, "+K"], "\xe7" => [0, "+L"], "\xe8" => [0, "+M"], "\xe9" => [0, "+N"], "\xea" => [0, "+O"], "\xeb" => [0, "+P"], "\xec" => [0, "+Q"], "\xed" => [0, "+R"], "\xee" => [0, "+S"], "\xef" => [0, "+T"], "\xf0" => [0, "+U"], "\xf1" => [0, "+V"], "\xf2" => [0, "+W"], "\xf3" => [0, "+Y"], "\xf4" => [0, "+j"], "\xf5" => [0, "+k"], "\xf6" => [0, "+q"], "\xf7" => [0, "+v"], "\xf8" => [0, "+w"], "\xf9" => [0, "+x"], "\xfa" => [0, "+y"], "\xfb" => [0, "+z"], "\xfc" => [82, "+"], "\xfd" => [87, "+"], "\xfe" => [130, "+"], "\xff" => [9, "+"]], ["\x00" => [94, "?0"], "\x01" => [76, "?0"], "\x02" => [104, "?0"], "\x03" => [16, "?0"], "\x04" => [94, "?1"], "\x05" => [76, "?1"], "\x06" => [104, "?1"], "\x07" => [16, "?1"], "\x08" => [94, "?2"], "\t" => [76, "?2"], "\n" => [104, "?2"], "\v" => [16, "?2"], "\f" => [94, "?a"], "\r" => [76, "?a"], "\x0e" => [104, "?a"], "\x0f" => [16, "?a"], "\x10" => [94, "?c"], "\x11" => [76, "?c"], "\x12" => [104, "?c"], "\x13" => [16, "?c"], "\x14" => [94, "?e"], "\x15" => [76, "?e"], "\x16" => [104, "?e"], "\x17" => [16, "?e"], "\x18" => [94, "?i"], "\x19" => [76, "?i"], "\x1a" => [104, "?i"], "\x1b" => [16, "?i"], "\x1c" => [94, "?o"], "\x1d" => [76, "?o"], "\x1e" => [104, "?o"], "\x1f" => [16, "?o"], " " => [94, "?s"], "!" => [76, "?s"], "\"" => [104, "?s"], "#" => [16, "?s"], "\$" => [94, "?t"], "%" => [76, "?t"], "&" => [104, "?t"], "'" => [16, "?t"], "(" => [77, "? "], ")" => [18, "? "], "*" => [77, "?%"], "+" => [18, "?%"], "," => [77, "?-"], "-" => [18, "?-"], "." => [77, "?."], "/" => [18, "?."], [77, "?/"], [18, "?/"], [77, "?3"], [18, "?3"], [77, "?4"], [18, "?4"], [77, "?5"], [18, "?5"], [77, "?6"], [18, "?6"], ":" => [77, "?7"], ";" => [18, "?7"], "<" => [77, "?8"], "=" => [18, "?8"], ">" => [77, "?9"], "?" => [18, "?9"], "@" => [77, "?="], "A" => [18, "?="], "B" => [77, "?A"], "C" => [18, "?A"], "D" => [77, "?_"], "E" => [18, "?_"], "F" => [77, "?b"], "G" => [18, "?b"], "H" => [77, "?d"], "I" => [18, "?d"], "J" => [77, "?f"], "K" => [18, "?f"], "L" => [77, "?g"], "M" => [18, "?g"], "N" => [77, "?h"], "O" => [18, "?h"], "P" => [77, "?l"], "Q" => [18, "?l"], "R" => [77, "?m"], "S" => [18, "?m"], "T" => [77, "?n"], "U" => [18, "?n"], "V" => [77, "?p"], "W" => [18, "?p"], "X" => [77, "?r"], "Y" => [18, "?r"], "Z" => [77, "?u"], "[" => [18, "?u"], "\\" => [0, "?:"], "]" => [0, "?B"], "^" => [0, "?C"], "_" => [0, "?D"], "`" => [0, "?E"], "a" => [0, "?F"], "b" => [0, "?G"], "c" => [0, "?H"], "d" => [0, "?I"], "e" => [0, "?J"], "f" => [0, "?K"], "g" => [0, "?L"], "h" => [0, "?M"], "i" => [0, "?N"], "j" => [0, "?O"], "k" => [0, "?P"], "l" => [0, "?Q"], "m" => [0, "?R"], "n" => [0, "?S"], "o" => [0, "?T"], "p" => [0, "?U"], "q" => [0, "?V"], "r" => [0, "?W"], "s" => [0, "?Y"], "t" => [0, "?j"], "u" => [0, "?k"], "v" => [0, "?q"], "w" => [0, "?v"], "x" => [0, "?w"], "y" => [0, "?x"], "z" => [0, "?y"], "{" => [0, "?z"], "|" => [82, "?"], "}" => [87, "?"], "~" => [130, "?"], "" => [9, "?"], "\x80" => [77, "'0"], "\x81" => [18, "'0"], "\x82" => [77, "'1"], "\x83" => [18, "'1"], "\x84" => [77, "'2"], "\x85" => [18, "'2"], "\x86" => [77, "'a"], "\x87" => [18, "'a"], "\x88" => [77, "'c"], "\x89" => [18, "'c"], "\x8a" => [77, "'e"], "\x8b" => [18, "'e"], "\x8c" => [77, "'i"], "\x8d" => [18, "'i"], "\x8e" => [77, "'o"], "\x8f" => [18, "'o"], "\x90" => [77, "'s"], "\x91" => [18, "'s"], "\x92" => [77, "'t"], "\x93" => [18, "'t"], "\x94" => [0, "' "], "\x95" => [0, "'%"], "\x96" => [0, "'-"], "\x97" => [0, "'."], "\x98" => [0, "'/"], "\x99" => [0, "'3"], "\x9a" => [0, "'4"], "\x9b" => [0, "'5"], "\x9c" => [0, "'6"], "\x9d" => [0, "'7"], "\x9e" => [0, "'8"], "\x9f" => [0, "'9"], "\xa0" => [0, "'="], "\xa1" => [0, "'A"], "\xa2" => [0, "'_"], "\xa3" => [0, "'b"], "\xa4" => [0, "'d"], "\xa5" => [0, "'f"], "\xa6" => [0, "'g"], "\xa7" => [0, "'h"], "\xa8" => [0, "'l"], "\xa9" => [0, "'m"], "\xaa" => [0, "'n"], "\xab" => [0, "'p"], "\xac" => [0, "'r"], "\xad" => [0, "'u"], "\xae" => [100, "'"], "\xaf" => [110, "'"], "\xb0" => [111, "'"], "\xb1" => [115, "'"], "\xb2" => [116, "'"], "\xb3" => [118, "'"], "\xb4" => [119, "'"], "\xb5" => [122, "'"], "\xb6" => [123, "'"], "\xb7" => [125, "'"], "\xb8" => [126, "'"], "\xb9" => [129, "'"], "\xba" => [143, "'"], "\xbb" => [148, "'"], "\xbc" => [151, "'"], "\xbd" => [153, "'"], "\xbe" => [83, "'"], "\xbf" => [10, "'"], "\xc0" => [77, "+0"], "\xc1" => [18, "+0"], "\xc2" => [77, "+1"], "\xc3" => [18, "+1"], "\xc4" => [77, "+2"], "\xc5" => [18, "+2"], "\xc6" => [77, "+a"], "\xc7" => [18, "+a"], "\xc8" => [77, "+c"], "\xc9" => [18, "+c"], "\xca" => [77, "+e"], "\xcb" => [18, "+e"], "\xcc" => [77, "+i"], "\xcd" => [18, "+i"], "\xce" => [77, "+o"], "\xcf" => [18, "+o"], "\xd0" => [77, "+s"], "\xd1" => [18, "+s"], "\xd2" => [77, "+t"], "\xd3" => [18, "+t"], "\xd4" => [0, "+ "], "\xd5" => [0, "+%"], "\xd6" => [0, "+-"], "\xd7" => [0, "+."], "\xd8" => [0, "+/"], "\xd9" => [0, "+3"], "\xda" => [0, "+4"], "\xdb" => [0, "+5"], "\xdc" => [0, "+6"], "\xdd" => [0, "+7"], "\xde" => [0, "+8"], "\xdf" => [0, "+9"], "\xe0" => [0, "+="], "\xe1" => [0, "+A"], "\xe2" => [0, "+_"], "\xe3" => [0, "+b"], "\xe4" => [0, "+d"], "\xe5" => [0, "+f"], "\xe6" => [0, "+g"], "\xe7" => [0, "+h"], "\xe8" => [0, "+l"], "\xe9" => [0, "+m"], "\xea" => [0, "+n"], "\xeb" => [0, "+p"], "\xec" => [0, "+r"], "\xed" => [0, "+u"], "\xee" => [100, "+"], "\xef" => [110, "+"], "\xf0" => [111, "+"], "\xf1" => [115, "+"], "\xf2" => [116, "+"], "\xf3" => [118, "+"], "\xf4" => [119, "+"], "\xf5" => [122, "+"], "\xf6" => [123, "+"], "\xf7" => [125, "+"], "\xf8" => [126, "+"], "\xf9" => [129, "+"], "\xfa" => [143, "+"], "\xfb" => [148, "+"], "\xfc" => [151, "+"], "\xfd" => [153, "+"], "\xfe" => [83, "+"], "\xff" => [10, "+"]], ["\x00" => [94, "(0"], "\x01" => [76, "(0"], "\x02" => [104, "(0"], "\x03" => [16, "(0"], "\x04" => [94, "(1"], "\x05" => [76, "(1"], "\x06" => [104, "(1"], "\x07" => [16, "(1"], "\x08" => [94, "(2"], "\t" => [76, "(2"], "\n" => [104, "(2"], "\v" => [16, "(2"], "\f" => [94, "(a"], "\r" => [76, "(a"], "\x0e" => [104, "(a"], "\x0f" => [16, "(a"], "\x10" => [94, "(c"], "\x11" => [76, "(c"], "\x12" => [104, "(c"], "\x13" => [16, "(c"], "\x14" => [94, "(e"], "\x15" => [76, "(e"], "\x16" => [104, "(e"], "\x17" => [16, "(e"], "\x18" => [94, "(i"], "\x19" => [76, "(i"], "\x1a" => [104, "(i"], "\x1b" => [16, "(i"], "\x1c" => [94, "(o"], "\x1d" => [76, "(o"], "\x1e" => [104, "(o"], "\x1f" => [16, "(o"], " " => [94, "(s"], "!" => [76, "(s"], "\"" => [104, "(s"], "#" => [16, "(s"], "\$" => [94, "(t"], "%" => [76, "(t"], "&" => [104, "(t"], "'" => [16, "(t"], "(" => [77, "( "], ")" => [18, "( "], "*" => [77, "(%"], "+" => [18, "(%"], "," => [77, "(-"], "-" => [18, "(-"], "." => [77, "(."], "/" => [18, "(."], [77, "(/"], [18, "(/"], [77, "(3"], [18, "(3"], [77, "(4"], [18, "(4"], [77, "(5"], [18, "(5"], [77, "(6"], [18, "(6"], ":" => [77, "(7"], ";" => [18, "(7"], "<" => [77, "(8"], "=" => [18, "(8"], ">" => [77, "(9"], "?" => [18, "(9"], "@" => [77, "(="], "A" => [18, "(="], "B" => [77, "(A"], "C" => [18, "(A"], "D" => [77, "(_"], "E" => [18, "(_"], "F" => [77, "(b"], "G" => [18, "(b"], "H" => [77, "(d"], "I" => [18, "(d"], "J" => [77, "(f"], "K" => [18, "(f"], "L" => [77, "(g"], "M" => [18, "(g"], "N" => [77, "(h"], "O" => [18, "(h"], "P" => [77, "(l"], "Q" => [18, "(l"], "R" => [77, "(m"], "S" => [18, "(m"], "T" => [77, "(n"], "U" => [18, "(n"], "V" => [77, "(p"], "W" => [18, "(p"], "X" => [77, "(r"], "Y" => [18, "(r"], "Z" => [77, "(u"], "[" => [18, "(u"], "\\" => [0, "(:"], "]" => [0, "(B"], "^" => [0, "(C"], "_" => [0, "(D"], "`" => [0, "(E"], "a" => [0, "(F"], "b" => [0, "(G"], "c" => [0, "(H"], "d" => [0, "(I"], "e" => [0, "(J"], "f" => [0, "(K"], "g" => [0, "(L"], "h" => [0, "(M"], "i" => [0, "(N"], "j" => [0, "(O"], "k" => [0, "(P"], "l" => [0, "(Q"], "m" => [0, "(R"], "n" => [0, "(S"], "o" => [0, "(T"], "p" => [0, "(U"], "q" => [0, "(V"], "r" => [0, "(W"], "s" => [0, "(Y"], "t" => [0, "(j"], "u" => [0, "(k"], "v" => [0, "(q"], "w" => [0, "(v"], "x" => [0, "(w"], "y" => [0, "(x"], "z" => [0, "(y"], "{" => [0, "(z"], "|" => [82, "("], "}" => [87, "("], "~" => [130, "("], "" => [9, "("], "\x80" => [94, ")0"], "\x81" => [76, ")0"], "\x82" => [104, ")0"], "\x83" => [16, ")0"], "\x84" => [94, ")1"], "\x85" => [76, ")1"], "\x86" => [104, ")1"], "\x87" => [16, ")1"], "\x88" => [94, ")2"], "\x89" => [76, ")2"], "\x8a" => [104, ")2"], "\x8b" => [16, ")2"], "\x8c" => [94, ")a"], "\x8d" => [76, ")a"], "\x8e" => [104, ")a"], "\x8f" => [16, ")a"], "\x90" => [94, ")c"], "\x91" => [76, ")c"], "\x92" => [104, ")c"], "\x93" => [16, ")c"], "\x94" => [94, ")e"], "\x95" => [76, ")e"], "\x96" => [104, ")e"], "\x97" => [16, ")e"], "\x98" => [94, ")i"], "\x99" => [76, ")i"], "\x9a" => [104, ")i"], "\x9b" => [16, ")i"], "\x9c" => [94, ")o"], "\x9d" => [76, ")o"], "\x9e" => [104, ")o"], "\x9f" => [16, ")o"], "\xa0" => [94, ")s"], "\xa1" => [76, ")s"], "\xa2" => [104, ")s"], "\xa3" => [16, ")s"], "\xa4" => [94, ")t"], "\xa5" => [76, ")t"], "\xa6" => [104, ")t"], "\xa7" => [16, ")t"], "\xa8" => [77, ") "], "\xa9" => [18, ") "], "\xaa" => [77, ")%"], "\xab" => [18, ")%"], "\xac" => [77, ")-"], "\xad" => [18, ")-"], "\xae" => [77, ")."], "\xaf" => [18, ")."], "\xb0" => [77, ")/"], "\xb1" => [18, ")/"], "\xb2" => [77, ")3"], "\xb3" => [18, ")3"], "\xb4" => [77, ")4"], "\xb5" => [18, ")4"], "\xb6" => [77, ")5"], "\xb7" => [18, ")5"], "\xb8" => [77, ")6"], "\xb9" => [18, ")6"], "\xba" => [77, ")7"], "\xbb" => [18, ")7"], "\xbc" => [77, ")8"], "\xbd" => [18, ")8"], "\xbe" => [77, ")9"], "\xbf" => [18, ")9"], "\xc0" => [77, ")="], "\xc1" => [18, ")="], "\xc2" => [77, ")A"], "\xc3" => [18, ")A"], "\xc4" => [77, ")_"], "\xc5" => [18, ")_"], "\xc6" => [77, ")b"], "\xc7" => [18, ")b"], "\xc8" => [77, ")d"], "\xc9" => [18, ")d"], "\xca" => [77, ")f"], "\xcb" => [18, ")f"], "\xcc" => [77, ")g"], "\xcd" => [18, ")g"], "\xce" => [77, ")h"], "\xcf" => [18, ")h"], "\xd0" => [77, ")l"], "\xd1" => [18, ")l"], "\xd2" => [77, ")m"], "\xd3" => [18, ")m"], "\xd4" => [77, ")n"], "\xd5" => [18, ")n"], "\xd6" => [77, ")p"], "\xd7" => [18, ")p"], "\xd8" => [77, ")r"], "\xd9" => [18, ")r"], "\xda" => [77, ")u"], "\xdb" => [18, ")u"], "\xdc" => [0, "):"], "\xdd" => [0, ")B"], "\xde" => [0, ")C"], "\xdf" => [0, ")D"], "\xe0" => [0, ")E"], "\xe1" => [0, ")F"], "\xe2" => [0, ")G"], "\xe3" => [0, ")H"], "\xe4" => [0, ")I"], "\xe5" => [0, ")J"], "\xe6" => [0, ")K"], "\xe7" => [0, ")L"], "\xe8" => [0, ")M"], "\xe9" => [0, ")N"], "\xea" => [0, ")O"], "\xeb" => [0, ")P"], "\xec" => [0, ")Q"], "\xed" => [0, ")R"], "\xee" => [0, ")S"], "\xef" => [0, ")T"], "\xf0" => [0, ")U"], "\xf1" => [0, ")V"], "\xf2" => [0, ")W"], "\xf3" => [0, ")Y"], "\xf4" => [0, ")j"], "\xf5" => [0, ")k"], "\xf6" => [0, ")q"], "\xf7" => [0, ")v"], "\xf8" => [0, ")w"], "\xf9" => [0, ")x"], "\xfa" => [0, ")y"], "\xfb" => [0, ")z"], "\xfc" => [82, ")"], "\xfd" => [87, ")"], "\xfe" => [130, ")"], "\xff" => [9, ")"]], ["\x00" => [94, ",0"], "\x01" => [76, ",0"], "\x02" => [104, ",0"], "\x03" => [16, ",0"], "\x04" => [94, ",1"], "\x05" => [76, ",1"], "\x06" => [104, ",1"], "\x07" => [16, ",1"], "\x08" => [94, ",2"], "\t" => [76, ",2"], "\n" => [104, ",2"], "\v" => [16, ",2"], "\f" => [94, ",a"], "\r" => [76, ",a"], "\x0e" => [104, ",a"], "\x0f" => [16, ",a"], "\x10" => [94, ",c"], "\x11" => [76, ",c"], "\x12" => [104, ",c"], "\x13" => [16, ",c"], "\x14" => [94, ",e"], "\x15" => [76, ",e"], "\x16" => [104, ",e"], "\x17" => [16, ",e"], "\x18" => [94, ",i"], "\x19" => [76, ",i"], "\x1a" => [104, ",i"], "\x1b" => [16, ",i"], "\x1c" => [94, ",o"], "\x1d" => [76, ",o"], "\x1e" => [104, ",o"], "\x1f" => [16, ",o"], " " => [94, ",s"], "!" => [76, ",s"], "\"" => [104, ",s"], "#" => [16, ",s"], "\$" => [94, ",t"], "%" => [76, ",t"], "&" => [104, ",t"], "'" => [16, ",t"], "(" => [77, ", "], ")" => [18, ", "], "*" => [77, ",%"], "+" => [18, ",%"], "," => [77, ",-"], "-" => [18, ",-"], "." => [77, ",."], "/" => [18, ",."], [77, ",/"], [18, ",/"], [77, ",3"], [18, ",3"], [77, ",4"], [18, ",4"], [77, ",5"], [18, ",5"], [77, ",6"], [18, ",6"], ":" => [77, ",7"], ";" => [18, ",7"], "<" => [77, ",8"], "=" => [18, ",8"], ">" => [77, ",9"], "?" => [18, ",9"], "@" => [77, ",="], "A" => [18, ",="], "B" => [77, ",A"], "C" => [18, ",A"], "D" => [77, ",_"], "E" => [18, ",_"], "F" => [77, ",b"], "G" => [18, ",b"], "H" => [77, ",d"], "I" => [18, ",d"], "J" => [77, ",f"], "K" => [18, ",f"], "L" => [77, ",g"], "M" => [18, ",g"], "N" => [77, ",h"], "O" => [18, ",h"], "P" => [77, ",l"], "Q" => [18, ",l"], "R" => [77, ",m"], "S" => [18, ",m"], "T" => [77, ",n"], "U" => [18, ",n"], "V" => [77, ",p"], "W" => [18, ",p"], "X" => [77, ",r"], "Y" => [18, ",r"], "Z" => [77, ",u"], "[" => [18, ",u"], "\\" => [0, ",:"], "]" => [0, ",B"], "^" => [0, ",C"], "_" => [0, ",D"], "`" => [0, ",E"], "a" => [0, ",F"], "b" => [0, ",G"], "c" => [0, ",H"], "d" => [0, ",I"], "e" => [0, ",J"], "f" => [0, ",K"], "g" => [0, ",L"], "h" => [0, ",M"], "i" => [0, ",N"], "j" => [0, ",O"], "k" => [0, ",P"], "l" => [0, ",Q"], "m" => [0, ",R"], "n" => [0, ",S"], "o" => [0, ",T"], "p" => [0, ",U"], "q" => [0, ",V"], "r" => [0, ",W"], "s" => [0, ",Y"], "t" => [0, ",j"], "u" => [0, ",k"], "v" => [0, ",q"], "w" => [0, ",v"], "x" => [0, ",w"], "y" => [0, ",x"], "z" => [0, ",y"], "{" => [0, ",z"], "|" => [82, ","], "}" => [87, ","], "~" => [130, ","], "" => [9, ","], "\x80" => [94, ";0"], "\x81" => [76, ";0"], "\x82" => [104, ";0"], "\x83" => [16, ";0"], "\x84" => [94, ";1"], "\x85" => [76, ";1"], "\x86" => [104, ";1"], "\x87" => [16, ";1"], "\x88" => [94, ";2"], "\x89" => [76, ";2"], "\x8a" => [104, ";2"], "\x8b" => [16, ";2"], "\x8c" => [94, ";a"], "\x8d" => [76, ";a"], "\x8e" => [104, ";a"], "\x8f" => [16, ";a"], "\x90" => [94, ";c"], "\x91" => [76, ";c"], "\x92" => [104, ";c"], "\x93" => [16, ";c"], "\x94" => [94, ";e"], "\x95" => [76, ";e"], "\x96" => [104, ";e"], "\x97" => [16, ";e"], "\x98" => [94, ";i"], "\x99" => [76, ";i"], "\x9a" => [104, ";i"], "\x9b" => [16, ";i"], "\x9c" => [94, ";o"], "\x9d" => [76, ";o"], "\x9e" => [104, ";o"], "\x9f" => [16, ";o"], "\xa0" => [94, ";s"], "\xa1" => [76, ";s"], "\xa2" => [104, ";s"], "\xa3" => [16, ";s"], "\xa4" => [94, ";t"], "\xa5" => [76, ";t"], "\xa6" => [104, ";t"], "\xa7" => [16, ";t"], "\xa8" => [77, "; "], "\xa9" => [18, "; "], "\xaa" => [77, ";%"], "\xab" => [18, ";%"], "\xac" => [77, ";-"], "\xad" => [18, ";-"], "\xae" => [77, ";."], "\xaf" => [18, ";."], "\xb0" => [77, ";/"], "\xb1" => [18, ";/"], "\xb2" => [77, ";3"], "\xb3" => [18, ";3"], "\xb4" => [77, ";4"], "\xb5" => [18, ";4"], "\xb6" => [77, ";5"], "\xb7" => [18, ";5"], "\xb8" => [77, ";6"], "\xb9" => [18, ";6"], "\xba" => [77, ";7"], "\xbb" => [18, ";7"], "\xbc" => [77, ";8"], "\xbd" => [18, ";8"], "\xbe" => [77, ";9"], "\xbf" => [18, ";9"], "\xc0" => [77, ";="], "\xc1" => [18, ";="], "\xc2" => [77, ";A"], "\xc3" => [18, ";A"], "\xc4" => [77, ";_"], "\xc5" => [18, ";_"], "\xc6" => [77, ";b"], "\xc7" => [18, ";b"], "\xc8" => [77, ";d"], "\xc9" => [18, ";d"], "\xca" => [77, ";f"], "\xcb" => [18, ";f"], "\xcc" => [77, ";g"], "\xcd" => [18, ";g"], "\xce" => [77, ";h"], "\xcf" => [18, ";h"], "\xd0" => [77, ";l"], "\xd1" => [18, ";l"], "\xd2" => [77, ";m"], "\xd3" => [18, ";m"], "\xd4" => [77, ";n"], "\xd5" => [18, ";n"], "\xd6" => [77, ";p"], "\xd7" => [18, ";p"], "\xd8" => [77, ";r"], "\xd9" => [18, ";r"], "\xda" => [77, ";u"], "\xdb" => [18, ";u"], "\xdc" => [0, ";:"], "\xdd" => [0, ";B"], "\xde" => [0, ";C"], "\xdf" => [0, ";D"], "\xe0" => [0, ";E"], "\xe1" => [0, ";F"], "\xe2" => [0, ";G"], "\xe3" => [0, ";H"], "\xe4" => [0, ";I"], "\xe5" => [0, ";J"], "\xe6" => [0, ";K"], "\xe7" => [0, ";L"], "\xe8" => [0, ";M"], "\xe9" => [0, ";N"], "\xea" => [0, ";O"], "\xeb" => [0, ";P"], "\xec" => [0, ";Q"], "\xed" => [0, ";R"], "\xee" => [0, ";S"], "\xef" => [0, ";T"], "\xf0" => [0, ";U"], "\xf1" => [0, ";V"], "\xf2" => [0, ";W"], "\xf3" => [0, ";Y"], "\xf4" => [0, ";j"], "\xf5" => [0, ";k"], "\xf6" => [0, ";q"], "\xf7" => [0, ";v"], "\xf8" => [0, ";w"], "\xf9" => [0, ";x"], "\xfa" => [0, ";y"], "\xfb" => [0, ";z"], "\xfc" => [82, ";"], "\xfd" => [87, ";"], "\xfe" => [130, ";"], "\xff" => [9, ";"]], ["\x00" => [94, "-0"], "\x01" => [76, "-0"], "\x02" => [104, "-0"], "\x03" => [16, "-0"], "\x04" => [94, "-1"], "\x05" => [76, "-1"], "\x06" => [104, "-1"], "\x07" => [16, "-1"], "\x08" => [94, "-2"], "\t" => [76, "-2"], "\n" => [104, "-2"], "\v" => [16, "-2"], "\f" => [94, "-a"], "\r" => [76, "-a"], "\x0e" => [104, "-a"], "\x0f" => [16, "-a"], "\x10" => [94, "-c"], "\x11" => [76, "-c"], "\x12" => [104, "-c"], "\x13" => [16, "-c"], "\x14" => [94, "-e"], "\x15" => [76, "-e"], "\x16" => [104, "-e"], "\x17" => [16, "-e"], "\x18" => [94, "-i"], "\x19" => [76, "-i"], "\x1a" => [104, "-i"], "\x1b" => [16, "-i"], "\x1c" => [94, "-o"], "\x1d" => [76, "-o"], "\x1e" => [104, "-o"], "\x1f" => [16, "-o"], " " => [94, "-s"], "!" => [76, "-s"], "\"" => [104, "-s"], "#" => [16, "-s"], "\$" => [94, "-t"], "%" => [76, "-t"], "&" => [104, "-t"], "'" => [16, "-t"], "(" => [77, "- "], ")" => [18, "- "], "*" => [77, "-%"], "+" => [18, "-%"], "," => [77, "--"], "-" => [18, "--"], "." => [77, "-."], "/" => [18, "-."], [77, "-/"], [18, "-/"], [77, "-3"], [18, "-3"], [77, "-4"], [18, "-4"], [77, "-5"], [18, "-5"], [77, "-6"], [18, "-6"], ":" => [77, "-7"], ";" => [18, "-7"], "<" => [77, "-8"], "=" => [18, "-8"], ">" => [77, "-9"], "?" => [18, "-9"], "@" => [77, "-="], "A" => [18, "-="], "B" => [77, "-A"], "C" => [18, "-A"], "D" => [77, "-_"], "E" => [18, "-_"], "F" => [77, "-b"], "G" => [18, "-b"], "H" => [77, "-d"], "I" => [18, "-d"], "J" => [77, "-f"], "K" => [18, "-f"], "L" => [77, "-g"], "M" => [18, "-g"], "N" => [77, "-h"], "O" => [18, "-h"], "P" => [77, "-l"], "Q" => [18, "-l"], "R" => [77, "-m"], "S" => [18, "-m"], "T" => [77, "-n"], "U" => [18, "-n"], "V" => [77, "-p"], "W" => [18, "-p"], "X" => [77, "-r"], "Y" => [18, "-r"], "Z" => [77, "-u"], "[" => [18, "-u"], "\\" => [0, "-:"], "]" => [0, "-B"], "^" => [0, "-C"], "_" => [0, "-D"], "`" => [0, "-E"], "a" => [0, "-F"], "b" => [0, "-G"], "c" => [0, "-H"], "d" => [0, "-I"], "e" => [0, "-J"], "f" => [0, "-K"], "g" => [0, "-L"], "h" => [0, "-M"], "i" => [0, "-N"], "j" => [0, "-O"], "k" => [0, "-P"], "l" => [0, "-Q"], "m" => [0, "-R"], "n" => [0, "-S"], "o" => [0, "-T"], "p" => [0, "-U"], "q" => [0, "-V"], "r" => [0, "-W"], "s" => [0, "-Y"], "t" => [0, "-j"], "u" => [0, "-k"], "v" => [0, "-q"], "w" => [0, "-v"], "x" => [0, "-w"], "y" => [0, "-x"], "z" => [0, "-y"], "{" => [0, "-z"], "|" => [82, "-"], "}" => [87, "-"], "~" => [130, "-"], "" => [9, "-"], "\x80" => [94, ".0"], "\x81" => [76, ".0"], "\x82" => [104, ".0"], "\x83" => [16, ".0"], "\x84" => [94, ".1"], "\x85" => [76, ".1"], "\x86" => [104, ".1"], "\x87" => [16, ".1"], "\x88" => [94, ".2"], "\x89" => [76, ".2"], "\x8a" => [104, ".2"], "\x8b" => [16, ".2"], "\x8c" => [94, ".a"], "\x8d" => [76, ".a"], "\x8e" => [104, ".a"], "\x8f" => [16, ".a"], "\x90" => [94, ".c"], "\x91" => [76, ".c"], "\x92" => [104, ".c"], "\x93" => [16, ".c"], "\x94" => [94, ".e"], "\x95" => [76, ".e"], "\x96" => [104, ".e"], "\x97" => [16, ".e"], "\x98" => [94, ".i"], "\x99" => [76, ".i"], "\x9a" => [104, ".i"], "\x9b" => [16, ".i"], "\x9c" => [94, ".o"], "\x9d" => [76, ".o"], "\x9e" => [104, ".o"], "\x9f" => [16, ".o"], "\xa0" => [94, ".s"], "\xa1" => [76, ".s"], "\xa2" => [104, ".s"], "\xa3" => [16, ".s"], "\xa4" => [94, ".t"], "\xa5" => [76, ".t"], "\xa6" => [104, ".t"], "\xa7" => [16, ".t"], "\xa8" => [77, ". "], "\xa9" => [18, ". "], "\xaa" => [77, ".%"], "\xab" => [18, ".%"], "\xac" => [77, ".-"], "\xad" => [18, ".-"], "\xae" => [77, ".."], "\xaf" => [18, ".."], "\xb0" => [77, "./"], "\xb1" => [18, "./"], "\xb2" => [77, ".3"], "\xb3" => [18, ".3"], "\xb4" => [77, ".4"], "\xb5" => [18, ".4"], "\xb6" => [77, ".5"], "\xb7" => [18, ".5"], "\xb8" => [77, ".6"], "\xb9" => [18, ".6"], "\xba" => [77, ".7"], "\xbb" => [18, ".7"], "\xbc" => [77, ".8"], "\xbd" => [18, ".8"], "\xbe" => [77, ".9"], "\xbf" => [18, ".9"], "\xc0" => [77, ".="], "\xc1" => [18, ".="], "\xc2" => [77, ".A"], "\xc3" => [18, ".A"], "\xc4" => [77, "._"], "\xc5" => [18, "._"], "\xc6" => [77, ".b"], "\xc7" => [18, ".b"], "\xc8" => [77, ".d"], "\xc9" => [18, ".d"], "\xca" => [77, ".f"], "\xcb" => [18, ".f"], "\xcc" => [77, ".g"], "\xcd" => [18, ".g"], "\xce" => [77, ".h"], "\xcf" => [18, ".h"], "\xd0" => [77, ".l"], "\xd1" => [18, ".l"], "\xd2" => [77, ".m"], "\xd3" => [18, ".m"], "\xd4" => [77, ".n"], "\xd5" => [18, ".n"], "\xd6" => [77, ".p"], "\xd7" => [18, ".p"], "\xd8" => [77, ".r"], "\xd9" => [18, ".r"], "\xda" => [77, ".u"], "\xdb" => [18, ".u"], "\xdc" => [0, ".:"], "\xdd" => [0, ".B"], "\xde" => [0, ".C"], "\xdf" => [0, ".D"], "\xe0" => [0, ".E"], "\xe1" => [0, ".F"], "\xe2" => [0, ".G"], "\xe3" => [0, ".H"], "\xe4" => [0, ".I"], "\xe5" => [0, ".J"], "\xe6" => [0, ".K"], "\xe7" => [0, ".L"], "\xe8" => [0, ".M"], "\xe9" => [0, ".N"], "\xea" => [0, ".O"], "\xeb" => [0, ".P"], "\xec" => [0, ".Q"], "\xed" => [0, ".R"], "\xee" => [0, ".S"], "\xef" => [0, ".T"], "\xf0" => [0, ".U"], "\xf1" => [0, ".V"], "\xf2" => [0, ".W"], "\xf3" => [0, ".Y"], "\xf4" => [0, ".j"], "\xf5" => [0, ".k"], "\xf6" => [0, ".q"], "\xf7" => [0, ".v"], "\xf8" => [0, ".w"], "\xf9" => [0, ".x"], "\xfa" => [0, ".y"], "\xfb" => [0, ".z"], "\xfc" => [82, "."], "\xfd" => [87, "."], "\xfe" => [130, "."], "\xff" => [9, "."]], ["\x00" => [94, "/0"], "\x01" => [76, "/0"], "\x02" => [104, "/0"], "\x03" => [16, "/0"], "\x04" => [94, "/1"], "\x05" => [76, "/1"], "\x06" => [104, "/1"], "\x07" => [16, "/1"], "\x08" => [94, "/2"], "\t" => [76, "/2"], "\n" => [104, "/2"], "\v" => [16, "/2"], "\f" => [94, "/a"], "\r" => [76, "/a"], "\x0e" => [104, "/a"], "\x0f" => [16, "/a"], "\x10" => [94, "/c"], "\x11" => [76, "/c"], "\x12" => [104, "/c"], "\x13" => [16, "/c"], "\x14" => [94, "/e"], "\x15" => [76, "/e"], "\x16" => [104, "/e"], "\x17" => [16, "/e"], "\x18" => [94, "/i"], "\x19" => [76, "/i"], "\x1a" => [104, "/i"], "\x1b" => [16, "/i"], "\x1c" => [94, "/o"], "\x1d" => [76, "/o"], "\x1e" => [104, "/o"], "\x1f" => [16, "/o"], " " => [94, "/s"], "!" => [76, "/s"], "\"" => [104, "/s"], "#" => [16, "/s"], "\$" => [94, "/t"], "%" => [76, "/t"], "&" => [104, "/t"], "'" => [16, "/t"], "(" => [77, "/ "], ")" => [18, "/ "], "*" => [77, "/%"], "+" => [18, "/%"], "," => [77, "/-"], "-" => [18, "/-"], "." => [77, "/."], "/" => [18, "/."], [77, "//"], [18, "//"], [77, "/3"], [18, "/3"], [77, "/4"], [18, "/4"], [77, "/5"], [18, "/5"], [77, "/6"], [18, "/6"], ":" => [77, "/7"], ";" => [18, "/7"], "<" => [77, "/8"], "=" => [18, "/8"], ">" => [77, "/9"], "?" => [18, "/9"], "@" => [77, "/="], "A" => [18, "/="], "B" => [77, "/A"], "C" => [18, "/A"], "D" => [77, "/_"], "E" => [18, "/_"], "F" => [77, "/b"], "G" => [18, "/b"], "H" => [77, "/d"], "I" => [18, "/d"], "J" => [77, "/f"], "K" => [18, "/f"], "L" => [77, "/g"], "M" => [18, "/g"], "N" => [77, "/h"], "O" => [18, "/h"], "P" => [77, "/l"], "Q" => [18, "/l"], "R" => [77, "/m"], "S" => [18, "/m"], "T" => [77, "/n"], "U" => [18, "/n"], "V" => [77, "/p"], "W" => [18, "/p"], "X" => [77, "/r"], "Y" => [18, "/r"], "Z" => [77, "/u"], "[" => [18, "/u"], "\\" => [0, "/:"], "]" => [0, "/B"], "^" => [0, "/C"], "_" => [0, "/D"], "`" => [0, "/E"], "a" => [0, "/F"], "b" => [0, "/G"], "c" => [0, "/H"], "d" => [0, "/I"], "e" => [0, "/J"], "f" => [0, "/K"], "g" => [0, "/L"], "h" => [0, "/M"], "i" => [0, "/N"], "j" => [0, "/O"], "k" => [0, "/P"], "l" => [0, "/Q"], "m" => [0, "/R"], "n" => [0, "/S"], "o" => [0, "/T"], "p" => [0, "/U"], "q" => [0, "/V"], "r" => [0, "/W"], "s" => [0, "/Y"], "t" => [0, "/j"], "u" => [0, "/k"], "v" => [0, "/q"], "w" => [0, "/v"], "x" => [0, "/w"], "y" => [0, "/x"], "z" => [0, "/y"], "{" => [0, "/z"], "|" => [82, "/"], "}" => [87, "/"], "~" => [130, "/"], "" => [9, "/"], "\x80" => [94, "30"], "\x81" => [76, "30"], "\x82" => [104, "30"], "\x83" => [16, "30"], "\x84" => [94, "31"], "\x85" => [76, "31"], "\x86" => [104, "31"], "\x87" => [16, "31"], "\x88" => [94, "32"], "\x89" => [76, "32"], "\x8a" => [104, "32"], "\x8b" => [16, "32"], "\x8c" => [94, "3a"], "\x8d" => [76, "3a"], "\x8e" => [104, "3a"], "\x8f" => [16, "3a"], "\x90" => [94, "3c"], "\x91" => [76, "3c"], "\x92" => [104, "3c"], "\x93" => [16, "3c"], "\x94" => [94, "3e"], "\x95" => [76, "3e"], "\x96" => [104, "3e"], "\x97" => [16, "3e"], "\x98" => [94, "3i"], "\x99" => [76, "3i"], "\x9a" => [104, "3i"], "\x9b" => [16, "3i"], "\x9c" => [94, "3o"], "\x9d" => [76, "3o"], "\x9e" => [104, "3o"], "\x9f" => [16, "3o"], "\xa0" => [94, "3s"], "\xa1" => [76, "3s"], "\xa2" => [104, "3s"], "\xa3" => [16, "3s"], "\xa4" => [94, "3t"], "\xa5" => [76, "3t"], "\xa6" => [104, "3t"], "\xa7" => [16, "3t"], "\xa8" => [77, "3 "], "\xa9" => [18, "3 "], "\xaa" => [77, "3%"], "\xab" => [18, "3%"], "\xac" => [77, "3-"], "\xad" => [18, "3-"], "\xae" => [77, "3."], "\xaf" => [18, "3."], "\xb0" => [77, "3/"], "\xb1" => [18, "3/"], "\xb2" => [77, "33"], "\xb3" => [18, "33"], "\xb4" => [77, "34"], "\xb5" => [18, "34"], "\xb6" => [77, "35"], "\xb7" => [18, "35"], "\xb8" => [77, "36"], "\xb9" => [18, "36"], "\xba" => [77, "37"], "\xbb" => [18, "37"], "\xbc" => [77, "38"], "\xbd" => [18, "38"], "\xbe" => [77, "39"], "\xbf" => [18, "39"], "\xc0" => [77, "3="], "\xc1" => [18, "3="], "\xc2" => [77, "3A"], "\xc3" => [18, "3A"], "\xc4" => [77, "3_"], "\xc5" => [18, "3_"], "\xc6" => [77, "3b"], "\xc7" => [18, "3b"], "\xc8" => [77, "3d"], "\xc9" => [18, "3d"], "\xca" => [77, "3f"], "\xcb" => [18, "3f"], "\xcc" => [77, "3g"], "\xcd" => [18, "3g"], "\xce" => [77, "3h"], "\xcf" => [18, "3h"], "\xd0" => [77, "3l"], "\xd1" => [18, "3l"], "\xd2" => [77, "3m"], "\xd3" => [18, "3m"], "\xd4" => [77, "3n"], "\xd5" => [18, "3n"], "\xd6" => [77, "3p"], "\xd7" => [18, "3p"], "\xd8" => [77, "3r"], "\xd9" => [18, "3r"], "\xda" => [77, "3u"], "\xdb" => [18, "3u"], "\xdc" => [0, "3:"], "\xdd" => [0, "3B"], "\xde" => [0, "3C"], "\xdf" => [0, "3D"], "\xe0" => [0, "3E"], "\xe1" => [0, "3F"], "\xe2" => [0, "3G"], "\xe3" => [0, "3H"], "\xe4" => [0, "3I"], "\xe5" => [0, "3J"], "\xe6" => [0, "3K"], "\xe7" => [0, "3L"], "\xe8" => [0, "3M"], "\xe9" => [0, "3N"], "\xea" => [0, "3O"], "\xeb" => [0, "3P"], "\xec" => [0, "3Q"], "\xed" => [0, "3R"], "\xee" => [0, "3S"], "\xef" => [0, "3T"], "\xf0" => [0, "3U"], "\xf1" => [0, "3V"], "\xf2" => [0, "3W"], "\xf3" => [0, "3Y"], "\xf4" => [0, "3j"], "\xf5" => [0, "3k"], "\xf6" => [0, "3q"], "\xf7" => [0, "3v"], "\xf8" => [0, "3w"], "\xf9" => [0, "3x"], "\xfa" => [0, "3y"], "\xfb" => [0, "3z"], "\xfc" => [82, "3"], "\xfd" => [87, "3"], "\xfe" => [130, "3"], "\xff" => [9, "3"]], ["\x00" => [77, "/0"], "\x01" => [18, "/0"], "\x02" => [77, "/1"], "\x03" => [18, "/1"], "\x04" => [77, "/2"], "\x05" => [18, "/2"], "\x06" => [77, "/a"], "\x07" => [18, "/a"], "\x08" => [77, "/c"], "\t" => [18, "/c"], "\n" => [77, "/e"], "\v" => [18, "/e"], "\f" => [77, "/i"], "\r" => [18, "/i"], "\x0e" => [77, "/o"], "\x0f" => [18, "/o"], "\x10" => [77, "/s"], "\x11" => [18, "/s"], "\x12" => [77, "/t"], "\x13" => [18, "/t"], "\x14" => [0, "/ "], "\x15" => [0, "/%"], "\x16" => [0, "/-"], "\x17" => [0, "/."], "\x18" => [0, "//"], "\x19" => [0, "/3"], "\x1a" => [0, "/4"], "\x1b" => [0, "/5"], "\x1c" => [0, "/6"], "\x1d" => [0, "/7"], "\x1e" => [0, "/8"], "\x1f" => [0, "/9"], " " => [0, "/="], "!" => [0, "/A"], "\"" => [0, "/_"], "#" => [0, "/b"], "\$" => [0, "/d"], "%" => [0, "/f"], "&" => [0, "/g"], "'" => [0, "/h"], "(" => [0, "/l"], ")" => [0, "/m"], "*" => [0, "/n"], "+" => [0, "/p"], "," => [0, "/r"], "-" => [0, "/u"], "." => [100, "/"], "/" => [110, "/"], [111, "/"], [115, "/"], [116, "/"], [118, "/"], [119, "/"], [122, "/"], [123, "/"], [125, "/"], [126, "/"], [129, "/"], ":" => [143, "/"], ";" => [148, "/"], "<" => [151, "/"], "=" => [153, "/"], ">" => [83, "/"], "?" => [10, "/"], "@" => [77, "30"], "A" => [18, "30"], "B" => [77, "31"], "C" => [18, "31"], "D" => [77, "32"], "E" => [18, "32"], "F" => [77, "3a"], "G" => [18, "3a"], "H" => [77, "3c"], "I" => [18, "3c"], "J" => [77, "3e"], "K" => [18, "3e"], "L" => [77, "3i"], "M" => [18, "3i"], "N" => [77, "3o"], "O" => [18, "3o"], "P" => [77, "3s"], "Q" => [18, "3s"], "R" => [77, "3t"], "S" => [18, "3t"], "T" => [0, "3 "], "U" => [0, "3%"], "V" => [0, "3-"], "W" => [0, "3."], "X" => [0, "3/"], "Y" => [0, "33"], "Z" => [0, "34"], "[" => [0, "35"], "\\" => [0, "36"], "]" => [0, "37"], "^" => [0, "38"], "_" => [0, "39"], "`" => [0, "3="], "a" => [0, "3A"], "b" => [0, "3_"], "c" => [0, "3b"], "d" => [0, "3d"], "e" => [0, "3f"], "f" => [0, "3g"], "g" => [0, "3h"], "h" => [0, "3l"], "i" => [0, "3m"], "j" => [0, "3n"], "k" => [0, "3p"], "l" => [0, "3r"], "m" => [0, "3u"], "n" => [100, "3"], "o" => [110, "3"], "p" => [111, "3"], "q" => [115, "3"], "r" => [116, "3"], "s" => [118, "3"], "t" => [119, "3"], "u" => [122, "3"], "v" => [123, "3"], "w" => [125, "3"], "x" => [126, "3"], "y" => [129, "3"], "z" => [143, "3"], "{" => [148, "3"], "|" => [151, "3"], "}" => [153, "3"], "~" => [83, "3"], "" => [10, "3"], "\x80" => [77, "40"], "\x81" => [18, "40"], "\x82" => [77, "41"], "\x83" => [18, "41"], "\x84" => [77, "42"], "\x85" => [18, "42"], "\x86" => [77, "4a"], "\x87" => [18, "4a"], "\x88" => [77, "4c"], "\x89" => [18, "4c"], "\x8a" => [77, "4e"], "\x8b" => [18, "4e"], "\x8c" => [77, "4i"], "\x8d" => [18, "4i"], "\x8e" => [77, "4o"], "\x8f" => [18, "4o"], "\x90" => [77, "4s"], "\x91" => [18, "4s"], "\x92" => [77, "4t"], "\x93" => [18, "4t"], "\x94" => [0, "4 "], "\x95" => [0, "4%"], "\x96" => [0, "4-"], "\x97" => [0, "4."], "\x98" => [0, "4/"], "\x99" => [0, "43"], "\x9a" => [0, "44"], "\x9b" => [0, "45"], "\x9c" => [0, "46"], "\x9d" => [0, "47"], "\x9e" => [0, "48"], "\x9f" => [0, "49"], "\xa0" => [0, "4="], "\xa1" => [0, "4A"], "\xa2" => [0, "4_"], "\xa3" => [0, "4b"], "\xa4" => [0, "4d"], "\xa5" => [0, "4f"], "\xa6" => [0, "4g"], "\xa7" => [0, "4h"], "\xa8" => [0, "4l"], "\xa9" => [0, "4m"], "\xaa" => [0, "4n"], "\xab" => [0, "4p"], "\xac" => [0, "4r"], "\xad" => [0, "4u"], "\xae" => [100, "4"], "\xaf" => [110, "4"], "\xb0" => [111, "4"], "\xb1" => [115, "4"], "\xb2" => [116, "4"], "\xb3" => [118, "4"], "\xb4" => [119, "4"], "\xb5" => [122, "4"], "\xb6" => [123, "4"], "\xb7" => [125, "4"], "\xb8" => [126, "4"], "\xb9" => [129, "4"], "\xba" => [143, "4"], "\xbb" => [148, "4"], "\xbc" => [151, "4"], "\xbd" => [153, "4"], "\xbe" => [83, "4"], "\xbf" => [10, "4"], "\xc0" => [77, "50"], "\xc1" => [18, "50"], "\xc2" => [77, "51"], "\xc3" => [18, "51"], "\xc4" => [77, "52"], "\xc5" => [18, "52"], "\xc6" => [77, "5a"], "\xc7" => [18, "5a"], "\xc8" => [77, "5c"], "\xc9" => [18, "5c"], "\xca" => [77, "5e"], "\xcb" => [18, "5e"], "\xcc" => [77, "5i"], "\xcd" => [18, "5i"], "\xce" => [77, "5o"], "\xcf" => [18, "5o"], "\xd0" => [77, "5s"], "\xd1" => [18, "5s"], "\xd2" => [77, "5t"], "\xd3" => [18, "5t"], "\xd4" => [0, "5 "], "\xd5" => [0, "5%"], "\xd6" => [0, "5-"], "\xd7" => [0, "5."], "\xd8" => [0, "5/"], "\xd9" => [0, "53"], "\xda" => [0, "54"], "\xdb" => [0, "55"], "\xdc" => [0, "56"], "\xdd" => [0, "57"], "\xde" => [0, "58"], "\xdf" => [0, "59"], "\xe0" => [0, "5="], "\xe1" => [0, "5A"], "\xe2" => [0, "5_"], "\xe3" => [0, "5b"], "\xe4" => [0, "5d"], "\xe5" => [0, "5f"], "\xe6" => [0, "5g"], "\xe7" => [0, "5h"], "\xe8" => [0, "5l"], "\xe9" => [0, "5m"], "\xea" => [0, "5n"], "\xeb" => [0, "5p"], "\xec" => [0, "5r"], "\xed" => [0, "5u"], "\xee" => [100, "5"], "\xef" => [110, "5"], "\xf0" => [111, "5"], "\xf1" => [115, "5"], "\xf2" => [116, "5"], "\xf3" => [118, "5"], "\xf4" => [119, "5"], "\xf5" => [122, "5"], "\xf6" => [123, "5"], "\xf7" => [125, "5"], "\xf8" => [126, "5"], "\xf9" => [129, "5"], "\xfa" => [143, "5"], "\xfb" => [148, "5"], "\xfc" => [151, "5"], "\xfd" => [153, "5"], "\xfe" => [83, "5"], "\xff" => [10, "5"]], ["\x00" => [0, "/0"], "\x01" => [0, "/1"], "\x02" => [0, "/2"], "\x03" => [0, "/a"], "\x04" => [0, "/c"], "\x05" => [0, "/e"], "\x06" => [0, "/i"], "\x07" => [0, "/o"], "\x08" => [0, "/s"], "\t" => [0, "/t"], "\n" => [73, "/"], "\v" => [88, "/"], "\f" => [89, "/"], "\r" => [96, "/"], "\x0e" => [97, "/"], "\x0f" => [99, "/"], "\x10" => [106, "/"], "\x11" => [136, "/"], "\x12" => [139, "/"], "\x13" => [141, "/"], "\x14" => [145, "/"], "\x15" => [147, "/"], "\x16" => [149, "/"], "\x17" => [101, "/"], "\x18" => [112, "/"], "\x19" => [117, "/"], "\x1a" => [120, "/"], "\x1b" => [124, "/"], "\x1c" => [127, "/"], "\x1d" => [144, "/"], "\x1e" => [152, "/"], "\x1f" => [11, "/"], " " => [0, "30"], "!" => [0, "31"], "\"" => [0, "32"], "#" => [0, "3a"], "\$" => [0, "3c"], "%" => [0, "3e"], "&" => [0, "3i"], "'" => [0, "3o"], "(" => [0, "3s"], ")" => [0, "3t"], "*" => [73, "3"], "+" => [88, "3"], "," => [89, "3"], "-" => [96, "3"], "." => [97, "3"], "/" => [99, "3"], [106, "3"], [136, "3"], [139, "3"], [141, "3"], [145, "3"], [147, "3"], [149, "3"], [101, "3"], [112, "3"], [117, "3"], ":" => [120, "3"], ";" => [124, "3"], "<" => [127, "3"], "=" => [144, "3"], ">" => [152, "3"], "?" => [11, "3"], "@" => [0, "40"], "A" => [0, "41"], "B" => [0, "42"], "C" => [0, "4a"], "D" => [0, "4c"], "E" => [0, "4e"], "F" => [0, "4i"], "G" => [0, "4o"], "H" => [0, "4s"], "I" => [0, "4t"], "J" => [73, "4"], "K" => [88, "4"], "L" => [89, "4"], "M" => [96, "4"], "N" => [97, "4"], "O" => [99, "4"], "P" => [106, "4"], "Q" => [136, "4"], "R" => [139, "4"], "S" => [141, "4"], "T" => [145, "4"], "U" => [147, "4"], "V" => [149, "4"], "W" => [101, "4"], "X" => [112, "4"], "Y" => [117, "4"], "Z" => [120, "4"], "[" => [124, "4"], "\\" => [127, "4"], "]" => [144, "4"], "^" => [152, "4"], "_" => [11, "4"], "`" => [0, "50"], "a" => [0, "51"], "b" => [0, "52"], "c" => [0, "5a"], "d" => [0, "5c"], "e" => [0, "5e"], "f" => [0, "5i"], "g" => [0, "5o"], "h" => [0, "5s"], "i" => [0, "5t"], "j" => [73, "5"], "k" => [88, "5"], "l" => [89, "5"], "m" => [96, "5"], "n" => [97, "5"], "o" => [99, "5"], "p" => [106, "5"], "q" => [136, "5"], "r" => [139, "5"], "s" => [141, "5"], "t" => [145, "5"], "u" => [147, "5"], "v" => [149, "5"], "w" => [101, "5"], "x" => [112, "5"], "y" => [117, "5"], "z" => [120, "5"], "{" => [124, "5"], "|" => [127, "5"], "}" => [144, "5"], "~" => [152, "5"], "" => [11, "5"], "\x80" => [0, "60"], "\x81" => [0, "61"], "\x82" => [0, "62"], "\x83" => [0, "6a"], "\x84" => [0, "6c"], "\x85" => [0, "6e"], "\x86" => [0, "6i"], "\x87" => [0, "6o"], "\x88" => [0, "6s"], "\x89" => [0, "6t"], "\x8a" => [73, "6"], "\x8b" => [88, "6"], "\x8c" => [89, "6"], "\x8d" => [96, "6"], "\x8e" => [97, "6"], "\x8f" => [99, "6"], "\x90" => [106, "6"], "\x91" => [136, "6"], "\x92" => [139, "6"], "\x93" => [141, "6"], "\x94" => [145, "6"], "\x95" => [147, "6"], "\x96" => [149, "6"], "\x97" => [101, "6"], "\x98" => [112, "6"], "\x99" => [117, "6"], "\x9a" => [120, "6"], "\x9b" => [124, "6"], "\x9c" => [127, "6"], "\x9d" => [144, "6"], "\x9e" => [152, "6"], "\x9f" => [11, "6"], "\xa0" => [0, "70"], "\xa1" => [0, "71"], "\xa2" => [0, "72"], "\xa3" => [0, "7a"], "\xa4" => [0, "7c"], "\xa5" => [0, "7e"], "\xa6" => [0, "7i"], "\xa7" => [0, "7o"], "\xa8" => [0, "7s"], "\xa9" => [0, "7t"], "\xaa" => [73, "7"], "\xab" => [88, "7"], "\xac" => [89, "7"], "\xad" => [96, "7"], "\xae" => [97, "7"], "\xaf" => [99, "7"], "\xb0" => [106, "7"], "\xb1" => [136, "7"], "\xb2" => [139, "7"], "\xb3" => [141, "7"], "\xb4" => [145, "7"], "\xb5" => [147, "7"], "\xb6" => [149, "7"], "\xb7" => [101, "7"], "\xb8" => [112, "7"], "\xb9" => [117, "7"], "\xba" => [120, "7"], "\xbb" => [124, "7"], "\xbc" => [127, "7"], "\xbd" => [144, "7"], "\xbe" => [152, "7"], "\xbf" => [11, "7"], "\xc0" => [0, "80"], "\xc1" => [0, "81"], "\xc2" => [0, "82"], "\xc3" => [0, "8a"], "\xc4" => [0, "8c"], "\xc5" => [0, "8e"], "\xc6" => [0, "8i"], "\xc7" => [0, "8o"], "\xc8" => [0, "8s"], "\xc9" => [0, "8t"], "\xca" => [73, "8"], "\xcb" => [88, "8"], "\xcc" => [89, "8"], "\xcd" => [96, "8"], "\xce" => [97, "8"], "\xcf" => [99, "8"], "\xd0" => [106, "8"], "\xd1" => [136, "8"], "\xd2" => [139, "8"], "\xd3" => [141, "8"], "\xd4" => [145, "8"], "\xd5" => [147, "8"], "\xd6" => [149, "8"], "\xd7" => [101, "8"], "\xd8" => [112, "8"], "\xd9" => [117, "8"], "\xda" => [120, "8"], "\xdb" => [124, "8"], "\xdc" => [127, "8"], "\xdd" => [144, "8"], "\xde" => [152, "8"], "\xdf" => [11, "8"], "\xe0" => [0, "90"], "\xe1" => [0, "91"], "\xe2" => [0, "92"], "\xe3" => [0, "9a"], "\xe4" => [0, "9c"], "\xe5" => [0, "9e"], "\xe6" => [0, "9i"], "\xe7" => [0, "9o"], "\xe8" => [0, "9s"], "\xe9" => [0, "9t"], "\xea" => [73, "9"], "\xeb" => [88, "9"], "\xec" => [89, "9"], "\xed" => [96, "9"], "\xee" => [97, "9"], "\xef" => [99, "9"], "\xf0" => [106, "9"], "\xf1" => [136, "9"], "\xf2" => [139, "9"], "\xf3" => [141, "9"], "\xf4" => [145, "9"], "\xf5" => [147, "9"], "\xf6" => [149, "9"], "\xf7" => [101, "9"], "\xf8" => [112, "9"], "\xf9" => [117, "9"], "\xfa" => [120, "9"], "\xfb" => [124, "9"], "\xfc" => [127, "9"], "\xfd" => [144, "9"], "\xfe" => [152, "9"], "\xff" => [11, "9"]], ["\x00" => [94, "00"], "\x01" => [76, "00"], "\x02" => [104, "00"], "\x03" => [16, "00"], "\x04" => [94, "01"], "\x05" => [76, "01"], "\x06" => [104, "01"], "\x07" => [16, "01"], "\x08" => [94, "02"], "\t" => [76, "02"], "\n" => [104, "02"], "\v" => [16, "02"], "\f" => [94, "0a"], "\r" => [76, "0a"], "\x0e" => [104, "0a"], "\x0f" => [16, "0a"], "\x10" => [94, "0c"], "\x11" => [76, "0c"], "\x12" => [104, "0c"], "\x13" => [16, "0c"], "\x14" => [94, "0e"], "\x15" => [76, "0e"], "\x16" => [104, "0e"], "\x17" => [16, "0e"], "\x18" => [94, "0i"], "\x19" => [76, "0i"], "\x1a" => [104, "0i"], "\x1b" => [16, "0i"], "\x1c" => [94, "0o"], "\x1d" => [76, "0o"], "\x1e" => [104, "0o"], "\x1f" => [16, "0o"], " " => [94, "0s"], "!" => [76, "0s"], "\"" => [104, "0s"], "#" => [16, "0s"], "\$" => [94, "0t"], "%" => [76, "0t"], "&" => [104, "0t"], "'" => [16, "0t"], "(" => [77, "0 "], ")" => [18, "0 "], "*" => [77, "0%"], "+" => [18, "0%"], "," => [77, "0-"], "-" => [18, "0-"], "." => [77, "0."], "/" => [18, "0."], [77, "0/"], [18, "0/"], [77, "03"], [18, "03"], [77, "04"], [18, "04"], [77, "05"], [18, "05"], [77, "06"], [18, "06"], ":" => [77, "07"], ";" => [18, "07"], "<" => [77, "08"], "=" => [18, "08"], ">" => [77, "09"], "?" => [18, "09"], "@" => [77, "0="], "A" => [18, "0="], "B" => [77, "0A"], "C" => [18, "0A"], "D" => [77, "0_"], "E" => [18, "0_"], "F" => [77, "0b"], "G" => [18, "0b"], "H" => [77, "0d"], "I" => [18, "0d"], "J" => [77, "0f"], "K" => [18, "0f"], "L" => [77, "0g"], "M" => [18, "0g"], "N" => [77, "0h"], "O" => [18, "0h"], "P" => [77, "0l"], "Q" => [18, "0l"], "R" => [77, "0m"], "S" => [18, "0m"], "T" => [77, "0n"], "U" => [18, "0n"], "V" => [77, "0p"], "W" => [18, "0p"], "X" => [77, "0r"], "Y" => [18, "0r"], "Z" => [77, "0u"], "[" => [18, "0u"], "\\" => [0, "0:"], "]" => [0, "0B"], "^" => [0, "0C"], "_" => [0, "0D"], "`" => [0, "0E"], "a" => [0, "0F"], "b" => [0, "0G"], "c" => [0, "0H"], "d" => [0, "0I"], "e" => [0, "0J"], "f" => [0, "0K"], "g" => [0, "0L"], "h" => [0, "0M"], "i" => [0, "0N"], "j" => [0, "0O"], "k" => [0, "0P"], "l" => [0, "0Q"], "m" => [0, "0R"], "n" => [0, "0S"], "o" => [0, "0T"], "p" => [0, "0U"], "q" => [0, "0V"], "r" => [0, "0W"], "s" => [0, "0Y"], "t" => [0, "0j"], "u" => [0, "0k"], "v" => [0, "0q"], "w" => [0, "0v"], "x" => [0, "0w"], "y" => [0, "0x"], "z" => [0, "0y"], "{" => [0, "0z"], "|" => [82, "0"], "}" => [87, "0"], "~" => [130, "0"], "" => [9, "0"], "\x80" => [94, "10"], "\x81" => [76, "10"], "\x82" => [104, "10"], "\x83" => [16, "10"], "\x84" => [94, "11"], "\x85" => [76, "11"], "\x86" => [104, "11"], "\x87" => [16, "11"], "\x88" => [94, "12"], "\x89" => [76, "12"], "\x8a" => [104, "12"], "\x8b" => [16, "12"], "\x8c" => [94, "1a"], "\x8d" => [76, "1a"], "\x8e" => [104, "1a"], "\x8f" => [16, "1a"], "\x90" => [94, "1c"], "\x91" => [76, "1c"], "\x92" => [104, "1c"], "\x93" => [16, "1c"], "\x94" => [94, "1e"], "\x95" => [76, "1e"], "\x96" => [104, "1e"], "\x97" => [16, "1e"], "\x98" => [94, "1i"], "\x99" => [76, "1i"], "\x9a" => [104, "1i"], "\x9b" => [16, "1i"], "\x9c" => [94, "1o"], "\x9d" => [76, "1o"], "\x9e" => [104, "1o"], "\x9f" => [16, "1o"], "\xa0" => [94, "1s"], "\xa1" => [76, "1s"], "\xa2" => [104, "1s"], "\xa3" => [16, "1s"], "\xa4" => [94, "1t"], "\xa5" => [76, "1t"], "\xa6" => [104, "1t"], "\xa7" => [16, "1t"], "\xa8" => [77, "1 "], "\xa9" => [18, "1 "], "\xaa" => [77, "1%"], "\xab" => [18, "1%"], "\xac" => [77, "1-"], "\xad" => [18, "1-"], "\xae" => [77, "1."], "\xaf" => [18, "1."], "\xb0" => [77, "1/"], "\xb1" => [18, "1/"], "\xb2" => [77, "13"], "\xb3" => [18, "13"], "\xb4" => [77, "14"], "\xb5" => [18, "14"], "\xb6" => [77, "15"], "\xb7" => [18, "15"], "\xb8" => [77, "16"], "\xb9" => [18, "16"], "\xba" => [77, "17"], "\xbb" => [18, "17"], "\xbc" => [77, "18"], "\xbd" => [18, "18"], "\xbe" => [77, "19"], "\xbf" => [18, "19"], "\xc0" => [77, "1="], "\xc1" => [18, "1="], "\xc2" => [77, "1A"], "\xc3" => [18, "1A"], "\xc4" => [77, "1_"], "\xc5" => [18, "1_"], "\xc6" => [77, "1b"], "\xc7" => [18, "1b"], "\xc8" => [77, "1d"], "\xc9" => [18, "1d"], "\xca" => [77, "1f"], "\xcb" => [18, "1f"], "\xcc" => [77, "1g"], "\xcd" => [18, "1g"], "\xce" => [77, "1h"], "\xcf" => [18, "1h"], "\xd0" => [77, "1l"], "\xd1" => [18, "1l"], "\xd2" => [77, "1m"], "\xd3" => [18, "1m"], "\xd4" => [77, "1n"], "\xd5" => [18, "1n"], "\xd6" => [77, "1p"], "\xd7" => [18, "1p"], "\xd8" => [77, "1r"], "\xd9" => [18, "1r"], "\xda" => [77, "1u"], "\xdb" => [18, "1u"], "\xdc" => [0, "1:"], "\xdd" => [0, "1B"], "\xde" => [0, "1C"], "\xdf" => [0, "1D"], "\xe0" => [0, "1E"], "\xe1" => [0, "1F"], "\xe2" => [0, "1G"], "\xe3" => [0, "1H"], "\xe4" => [0, "1I"], "\xe5" => [0, "1J"], "\xe6" => [0, "1K"], "\xe7" => [0, "1L"], "\xe8" => [0, "1M"], "\xe9" => [0, "1N"], "\xea" => [0, "1O"], "\xeb" => [0, "1P"], "\xec" => [0, "1Q"], "\xed" => [0, "1R"], "\xee" => [0, "1S"], "\xef" => [0, "1T"], "\xf0" => [0, "1U"], "\xf1" => [0, "1V"], "\xf2" => [0, "1W"], "\xf3" => [0, "1Y"], "\xf4" => [0, "1j"], "\xf5" => [0, "1k"], "\xf6" => [0, "1q"], "\xf7" => [0, "1v"], "\xf8" => [0, "1w"], "\xf9" => [0, "1x"], "\xfa" => [0, "1y"], "\xfb" => [0, "1z"], "\xfc" => [82, "1"], "\xfd" => [87, "1"], "\xfe" => [130, "1"], "\xff" => [9, "1"]], ["\x00" => [77, "00"], "\x01" => [18, "00"], "\x02" => [77, "01"], "\x03" => [18, "01"], "\x04" => [77, "02"], "\x05" => [18, "02"], "\x06" => [77, "0a"], "\x07" => [18, "0a"], "\x08" => [77, "0c"], "\t" => [18, "0c"], "\n" => [77, "0e"], "\v" => [18, "0e"], "\f" => [77, "0i"], "\r" => [18, "0i"], "\x0e" => [77, "0o"], "\x0f" => [18, "0o"], "\x10" => [77, "0s"], "\x11" => [18, "0s"], "\x12" => [77, "0t"], "\x13" => [18, "0t"], "\x14" => [0, "0 "], "\x15" => [0, "0%"], "\x16" => [0, "0-"], "\x17" => [0, "0."], "\x18" => [0, "0/"], "\x19" => [0, "03"], "\x1a" => [0, "04"], "\x1b" => [0, "05"], "\x1c" => [0, "06"], "\x1d" => [0, "07"], "\x1e" => [0, "08"], "\x1f" => [0, "09"], " " => [0, "0="], "!" => [0, "0A"], "\"" => [0, "0_"], "#" => [0, "0b"], "\$" => [0, "0d"], "%" => [0, "0f"], "&" => [0, "0g"], "'" => [0, "0h"], "(" => [0, "0l"], ")" => [0, "0m"], "*" => [0, "0n"], "+" => [0, "0p"], "," => [0, "0r"], "-" => [0, "0u"], "." => [100, "0"], "/" => [110, "0"], [111, "0"], [115, "0"], [116, "0"], [118, "0"], [119, "0"], [122, "0"], [123, "0"], [125, "0"], [126, "0"], [129, "0"], ":" => [143, "0"], ";" => [148, "0"], "<" => [151, "0"], "=" => [153, "0"], ">" => [83, "0"], "?" => [10, "0"], "@" => [77, "10"], "A" => [18, "10"], "B" => [77, "11"], "C" => [18, "11"], "D" => [77, "12"], "E" => [18, "12"], "F" => [77, "1a"], "G" => [18, "1a"], "H" => [77, "1c"], "I" => [18, "1c"], "J" => [77, "1e"], "K" => [18, "1e"], "L" => [77, "1i"], "M" => [18, "1i"], "N" => [77, "1o"], "O" => [18, "1o"], "P" => [77, "1s"], "Q" => [18, "1s"], "R" => [77, "1t"], "S" => [18, "1t"], "T" => [0, "1 "], "U" => [0, "1%"], "V" => [0, "1-"], "W" => [0, "1."], "X" => [0, "1/"], "Y" => [0, "13"], "Z" => [0, "14"], "[" => [0, "15"], "\\" => [0, "16"], "]" => [0, "17"], "^" => [0, "18"], "_" => [0, "19"], "`" => [0, "1="], "a" => [0, "1A"], "b" => [0, "1_"], "c" => [0, "1b"], "d" => [0, "1d"], "e" => [0, "1f"], "f" => [0, "1g"], "g" => [0, "1h"], "h" => [0, "1l"], "i" => [0, "1m"], "j" => [0, "1n"], "k" => [0, "1p"], "l" => [0, "1r"], "m" => [0, "1u"], "n" => [100, "1"], "o" => [110, "1"], "p" => [111, "1"], "q" => [115, "1"], "r" => [116, "1"], "s" => [118, "1"], "t" => [119, "1"], "u" => [122, "1"], "v" => [123, "1"], "w" => [125, "1"], "x" => [126, "1"], "y" => [129, "1"], "z" => [143, "1"], "{" => [148, "1"], "|" => [151, "1"], "}" => [153, "1"], "~" => [83, "1"], "" => [10, "1"], "\x80" => [77, "20"], "\x81" => [18, "20"], "\x82" => [77, "21"], "\x83" => [18, "21"], "\x84" => [77, "22"], "\x85" => [18, "22"], "\x86" => [77, "2a"], "\x87" => [18, "2a"], "\x88" => [77, "2c"], "\x89" => [18, "2c"], "\x8a" => [77, "2e"], "\x8b" => [18, "2e"], "\x8c" => [77, "2i"], "\x8d" => [18, "2i"], "\x8e" => [77, "2o"], "\x8f" => [18, "2o"], "\x90" => [77, "2s"], "\x91" => [18, "2s"], "\x92" => [77, "2t"], "\x93" => [18, "2t"], "\x94" => [0, "2 "], "\x95" => [0, "2%"], "\x96" => [0, "2-"], "\x97" => [0, "2."], "\x98" => [0, "2/"], "\x99" => [0, "23"], "\x9a" => [0, "24"], "\x9b" => [0, "25"], "\x9c" => [0, "26"], "\x9d" => [0, "27"], "\x9e" => [0, "28"], "\x9f" => [0, "29"], "\xa0" => [0, "2="], "\xa1" => [0, "2A"], "\xa2" => [0, "2_"], "\xa3" => [0, "2b"], "\xa4" => [0, "2d"], "\xa5" => [0, "2f"], "\xa6" => [0, "2g"], "\xa7" => [0, "2h"], "\xa8" => [0, "2l"], "\xa9" => [0, "2m"], "\xaa" => [0, "2n"], "\xab" => [0, "2p"], "\xac" => [0, "2r"], "\xad" => [0, "2u"], "\xae" => [100, "2"], "\xaf" => [110, "2"], "\xb0" => [111, "2"], "\xb1" => [115, "2"], "\xb2" => [116, "2"], "\xb3" => [118, "2"], "\xb4" => [119, "2"], "\xb5" => [122, "2"], "\xb6" => [123, "2"], "\xb7" => [125, "2"], "\xb8" => [126, "2"], "\xb9" => [129, "2"], "\xba" => [143, "2"], "\xbb" => [148, "2"], "\xbc" => [151, "2"], "\xbd" => [153, "2"], "\xbe" => [83, "2"], "\xbf" => [10, "2"], "\xc0" => [77, "a0"], "\xc1" => [18, "a0"], "\xc2" => [77, "a1"], "\xc3" => [18, "a1"], "\xc4" => [77, "a2"], "\xc5" => [18, "a2"], "\xc6" => [77, "aa"], "\xc7" => [18, "aa"], "\xc8" => [77, "ac"], "\xc9" => [18, "ac"], "\xca" => [77, "ae"], "\xcb" => [18, "ae"], "\xcc" => [77, "ai"], "\xcd" => [18, "ai"], "\xce" => [77, "ao"], "\xcf" => [18, "ao"], "\xd0" => [77, "as"], "\xd1" => [18, "as"], "\xd2" => [77, "at"], "\xd3" => [18, "at"], "\xd4" => [0, "a "], "\xd5" => [0, "a%"], "\xd6" => [0, "a-"], "\xd7" => [0, "a."], "\xd8" => [0, "a/"], "\xd9" => [0, "a3"], "\xda" => [0, "a4"], "\xdb" => [0, "a5"], "\xdc" => [0, "a6"], "\xdd" => [0, "a7"], "\xde" => [0, "a8"], "\xdf" => [0, "a9"], "\xe0" => [0, "a="], "\xe1" => [0, "aA"], "\xe2" => [0, "a_"], "\xe3" => [0, "ab"], "\xe4" => [0, "ad"], "\xe5" => [0, "af"], "\xe6" => [0, "ag"], "\xe7" => [0, "ah"], "\xe8" => [0, "al"], "\xe9" => [0, "am"], "\xea" => [0, "an"], "\xeb" => [0, "ap"], "\xec" => [0, "ar"], "\xed" => [0, "au"], "\xee" => [100, "a"], "\xef" => [110, "a"], "\xf0" => [111, "a"], "\xf1" => [115, "a"], "\xf2" => [116, "a"], "\xf3" => [118, "a"], "\xf4" => [119, "a"], "\xf5" => [122, "a"], "\xf6" => [123, "a"], "\xf7" => [125, "a"], "\xf8" => [126, "a"], "\xf9" => [129, "a"], "\xfa" => [143, "a"], "\xfb" => [148, "a"], "\xfc" => [151, "a"], "\xfd" => [153, "a"], "\xfe" => [83, "a"], "\xff" => [10, "a"]], ["\x00" => [0, "00"], "\x01" => [0, "01"], "\x02" => [0, "02"], "\x03" => [0, "0a"], "\x04" => [0, "0c"], "\x05" => [0, "0e"], "\x06" => [0, "0i"], "\x07" => [0, "0o"], "\x08" => [0, "0s"], "\t" => [0, "0t"], "\n" => [73, "0"], "\v" => [88, "0"], "\f" => [89, "0"], "\r" => [96, "0"], "\x0e" => [97, "0"], "\x0f" => [99, "0"], "\x10" => [106, "0"], "\x11" => [136, "0"], "\x12" => [139, "0"], "\x13" => [141, "0"], "\x14" => [145, "0"], "\x15" => [147, "0"], "\x16" => [149, "0"], "\x17" => [101, "0"], "\x18" => [112, "0"], "\x19" => [117, "0"], "\x1a" => [120, "0"], "\x1b" => [124, "0"], "\x1c" => [127, "0"], "\x1d" => [144, "0"], "\x1e" => [152, "0"], "\x1f" => [11, "0"], " " => [0, "10"], "!" => [0, "11"], "\"" => [0, "12"], "#" => [0, "1a"], "\$" => [0, "1c"], "%" => [0, "1e"], "&" => [0, "1i"], "'" => [0, "1o"], "(" => [0, "1s"], ")" => [0, "1t"], "*" => [73, "1"], "+" => [88, "1"], "," => [89, "1"], "-" => [96, "1"], "." => [97, "1"], "/" => [99, "1"], [106, "1"], [136, "1"], [139, "1"], [141, "1"], [145, "1"], [147, "1"], [149, "1"], [101, "1"], [112, "1"], [117, "1"], ":" => [120, "1"], ";" => [124, "1"], "<" => [127, "1"], "=" => [144, "1"], ">" => [152, "1"], "?" => [11, "1"], "@" => [0, "20"], "A" => [0, "21"], "B" => [0, "22"], "C" => [0, "2a"], "D" => [0, "2c"], "E" => [0, "2e"], "F" => [0, "2i"], "G" => [0, "2o"], "H" => [0, "2s"], "I" => [0, "2t"], "J" => [73, "2"], "K" => [88, "2"], "L" => [89, "2"], "M" => [96, "2"], "N" => [97, "2"], "O" => [99, "2"], "P" => [106, "2"], "Q" => [136, "2"], "R" => [139, "2"], "S" => [141, "2"], "T" => [145, "2"], "U" => [147, "2"], "V" => [149, "2"], "W" => [101, "2"], "X" => [112, "2"], "Y" => [117, "2"], "Z" => [120, "2"], "[" => [124, "2"], "\\" => [127, "2"], "]" => [144, "2"], "^" => [152, "2"], "_" => [11, "2"], "`" => [0, "a0"], "a" => [0, "a1"], "b" => [0, "a2"], "c" => [0, "aa"], "d" => [0, "ac"], "e" => [0, "ae"], "f" => [0, "ai"], "g" => [0, "ao"], "h" => [0, "as"], "i" => [0, "at"], "j" => [73, "a"], "k" => [88, "a"], "l" => [89, "a"], "m" => [96, "a"], "n" => [97, "a"], "o" => [99, "a"], "p" => [106, "a"], "q" => [136, "a"], "r" => [139, "a"], "s" => [141, "a"], "t" => [145, "a"], "u" => [147, "a"], "v" => [149, "a"], "w" => [101, "a"], "x" => [112, "a"], "y" => [117, "a"], "z" => [120, "a"], "{" => [124, "a"], "|" => [127, "a"], "}" => [144, "a"], "~" => [152, "a"], "" => [11, "a"], "\x80" => [0, "c0"], "\x81" => [0, "c1"], "\x82" => [0, "c2"], "\x83" => [0, "ca"], "\x84" => [0, "cc"], "\x85" => [0, "ce"], "\x86" => [0, "ci"], "\x87" => [0, "co"], "\x88" => [0, "cs"], "\x89" => [0, "ct"], "\x8a" => [73, "c"], "\x8b" => [88, "c"], "\x8c" => [89, "c"], "\x8d" => [96, "c"], "\x8e" => [97, "c"], "\x8f" => [99, "c"], "\x90" => [106, "c"], "\x91" => [136, "c"], "\x92" => [139, "c"], "\x93" => [141, "c"], "\x94" => [145, "c"], "\x95" => [147, "c"], "\x96" => [149, "c"], "\x97" => [101, "c"], "\x98" => [112, "c"], "\x99" => [117, "c"], "\x9a" => [120, "c"], "\x9b" => [124, "c"], "\x9c" => [127, "c"], "\x9d" => [144, "c"], "\x9e" => [152, "c"], "\x9f" => [11, "c"], "\xa0" => [0, "e0"], "\xa1" => [0, "e1"], "\xa2" => [0, "e2"], "\xa3" => [0, "ea"], "\xa4" => [0, "ec"], "\xa5" => [0, "ee"], "\xa6" => [0, "ei"], "\xa7" => [0, "eo"], "\xa8" => [0, "es"], "\xa9" => [0, "et"], "\xaa" => [73, "e"], "\xab" => [88, "e"], "\xac" => [89, "e"], "\xad" => [96, "e"], "\xae" => [97, "e"], "\xaf" => [99, "e"], "\xb0" => [106, "e"], "\xb1" => [136, "e"], "\xb2" => [139, "e"], "\xb3" => [141, "e"], "\xb4" => [145, "e"], "\xb5" => [147, "e"], "\xb6" => [149, "e"], "\xb7" => [101, "e"], "\xb8" => [112, "e"], "\xb9" => [117, "e"], "\xba" => [120, "e"], "\xbb" => [124, "e"], "\xbc" => [127, "e"], "\xbd" => [144, "e"], "\xbe" => [152, "e"], "\xbf" => [11, "e"], "\xc0" => [0, "i0"], "\xc1" => [0, "i1"], "\xc2" => [0, "i2"], "\xc3" => [0, "ia"], "\xc4" => [0, "ic"], "\xc5" => [0, "ie"], "\xc6" => [0, "ii"], "\xc7" => [0, "io"], "\xc8" => [0, "is"], "\xc9" => [0, "it"], "\xca" => [73, "i"], "\xcb" => [88, "i"], "\xcc" => [89, "i"], "\xcd" => [96, "i"], "\xce" => [97, "i"], "\xcf" => [99, "i"], "\xd0" => [106, "i"], "\xd1" => [136, "i"], "\xd2" => [139, "i"], "\xd3" => [141, "i"], "\xd4" => [145, "i"], "\xd5" => [147, "i"], "\xd6" => [149, "i"], "\xd7" => [101, "i"], "\xd8" => [112, "i"], "\xd9" => [117, "i"], "\xda" => [120, "i"], "\xdb" => [124, "i"], "\xdc" => [127, "i"], "\xdd" => [144, "i"], "\xde" => [152, "i"], "\xdf" => [11, "i"], "\xe0" => [0, "o0"], "\xe1" => [0, "o1"], "\xe2" => [0, "o2"], "\xe3" => [0, "oa"], "\xe4" => [0, "oc"], "\xe5" => [0, "oe"], "\xe6" => [0, "oi"], "\xe7" => [0, "oo"], "\xe8" => [0, "os"], "\xe9" => [0, "ot"], "\xea" => [73, "o"], "\xeb" => [88, "o"], "\xec" => [89, "o"], "\xed" => [96, "o"], "\xee" => [97, "o"], "\xef" => [99, "o"], "\xf0" => [106, "o"], "\xf1" => [136, "o"], "\xf2" => [139, "o"], "\xf3" => [141, "o"], "\xf4" => [145, "o"], "\xf5" => [147, "o"], "\xf6" => [149, "o"], "\xf7" => [101, "o"], "\xf8" => [112, "o"], "\xf9" => [117, "o"], "\xfa" => [120, "o"], "\xfb" => [124, "o"], "\xfc" => [127, "o"], "\xfd" => [144, "o"], "\xfe" => [152, "o"], "\xff" => [11, "o"]], ["\x00" => [94, "20"], "\x01" => [76, "20"], "\x02" => [104, "20"], "\x03" => [16, "20"], "\x04" => [94, "21"], "\x05" => [76, "21"], "\x06" => [104, "21"], "\x07" => [16, "21"], "\x08" => [94, "22"], "\t" => [76, "22"], "\n" => [104, "22"], "\v" => [16, "22"], "\f" => [94, "2a"], "\r" => [76, "2a"], "\x0e" => [104, "2a"], "\x0f" => [16, "2a"], "\x10" => [94, "2c"], "\x11" => [76, "2c"], "\x12" => [104, "2c"], "\x13" => [16, "2c"], "\x14" => [94, "2e"], "\x15" => [76, "2e"], "\x16" => [104, "2e"], "\x17" => [16, "2e"], "\x18" => [94, "2i"], "\x19" => [76, "2i"], "\x1a" => [104, "2i"], "\x1b" => [16, "2i"], "\x1c" => [94, "2o"], "\x1d" => [76, "2o"], "\x1e" => [104, "2o"], "\x1f" => [16, "2o"], " " => [94, "2s"], "!" => [76, "2s"], "\"" => [104, "2s"], "#" => [16, "2s"], "\$" => [94, "2t"], "%" => [76, "2t"], "&" => [104, "2t"], "'" => [16, "2t"], "(" => [77, "2 "], ")" => [18, "2 "], "*" => [77, "2%"], "+" => [18, "2%"], "," => [77, "2-"], "-" => [18, "2-"], "." => [77, "2."], "/" => [18, "2."], [77, "2/"], [18, "2/"], [77, "23"], [18, "23"], [77, "24"], [18, "24"], [77, "25"], [18, "25"], [77, "26"], [18, "26"], ":" => [77, "27"], ";" => [18, "27"], "<" => [77, "28"], "=" => [18, "28"], ">" => [77, "29"], "?" => [18, "29"], "@" => [77, "2="], "A" => [18, "2="], "B" => [77, "2A"], "C" => [18, "2A"], "D" => [77, "2_"], "E" => [18, "2_"], "F" => [77, "2b"], "G" => [18, "2b"], "H" => [77, "2d"], "I" => [18, "2d"], "J" => [77, "2f"], "K" => [18, "2f"], "L" => [77, "2g"], "M" => [18, "2g"], "N" => [77, "2h"], "O" => [18, "2h"], "P" => [77, "2l"], "Q" => [18, "2l"], "R" => [77, "2m"], "S" => [18, "2m"], "T" => [77, "2n"], "U" => [18, "2n"], "V" => [77, "2p"], "W" => [18, "2p"], "X" => [77, "2r"], "Y" => [18, "2r"], "Z" => [77, "2u"], "[" => [18, "2u"], "\\" => [0, "2:"], "]" => [0, "2B"], "^" => [0, "2C"], "_" => [0, "2D"], "`" => [0, "2E"], "a" => [0, "2F"], "b" => [0, "2G"], "c" => [0, "2H"], "d" => [0, "2I"], "e" => [0, "2J"], "f" => [0, "2K"], "g" => [0, "2L"], "h" => [0, "2M"], "i" => [0, "2N"], "j" => [0, "2O"], "k" => [0, "2P"], "l" => [0, "2Q"], "m" => [0, "2R"], "n" => [0, "2S"], "o" => [0, "2T"], "p" => [0, "2U"], "q" => [0, "2V"], "r" => [0, "2W"], "s" => [0, "2Y"], "t" => [0, "2j"], "u" => [0, "2k"], "v" => [0, "2q"], "w" => [0, "2v"], "x" => [0, "2w"], "y" => [0, "2x"], "z" => [0, "2y"], "{" => [0, "2z"], "|" => [82, "2"], "}" => [87, "2"], "~" => [130, "2"], "" => [9, "2"], "\x80" => [94, "a0"], "\x81" => [76, "a0"], "\x82" => [104, "a0"], "\x83" => [16, "a0"], "\x84" => [94, "a1"], "\x85" => [76, "a1"], "\x86" => [104, "a1"], "\x87" => [16, "a1"], "\x88" => [94, "a2"], "\x89" => [76, "a2"], "\x8a" => [104, "a2"], "\x8b" => [16, "a2"], "\x8c" => [94, "aa"], "\x8d" => [76, "aa"], "\x8e" => [104, "aa"], "\x8f" => [16, "aa"], "\x90" => [94, "ac"], "\x91" => [76, "ac"], "\x92" => [104, "ac"], "\x93" => [16, "ac"], "\x94" => [94, "ae"], "\x95" => [76, "ae"], "\x96" => [104, "ae"], "\x97" => [16, "ae"], "\x98" => [94, "ai"], "\x99" => [76, "ai"], "\x9a" => [104, "ai"], "\x9b" => [16, "ai"], "\x9c" => [94, "ao"], "\x9d" => [76, "ao"], "\x9e" => [104, "ao"], "\x9f" => [16, "ao"], "\xa0" => [94, "as"], "\xa1" => [76, "as"], "\xa2" => [104, "as"], "\xa3" => [16, "as"], "\xa4" => [94, "at"], "\xa5" => [76, "at"], "\xa6" => [104, "at"], "\xa7" => [16, "at"], "\xa8" => [77, "a "], "\xa9" => [18, "a "], "\xaa" => [77, "a%"], "\xab" => [18, "a%"], "\xac" => [77, "a-"], "\xad" => [18, "a-"], "\xae" => [77, "a."], "\xaf" => [18, "a."], "\xb0" => [77, "a/"], "\xb1" => [18, "a/"], "\xb2" => [77, "a3"], "\xb3" => [18, "a3"], "\xb4" => [77, "a4"], "\xb5" => [18, "a4"], "\xb6" => [77, "a5"], "\xb7" => [18, "a5"], "\xb8" => [77, "a6"], "\xb9" => [18, "a6"], "\xba" => [77, "a7"], "\xbb" => [18, "a7"], "\xbc" => [77, "a8"], "\xbd" => [18, "a8"], "\xbe" => [77, "a9"], "\xbf" => [18, "a9"], "\xc0" => [77, "a="], "\xc1" => [18, "a="], "\xc2" => [77, "aA"], "\xc3" => [18, "aA"], "\xc4" => [77, "a_"], "\xc5" => [18, "a_"], "\xc6" => [77, "ab"], "\xc7" => [18, "ab"], "\xc8" => [77, "ad"], "\xc9" => [18, "ad"], "\xca" => [77, "af"], "\xcb" => [18, "af"], "\xcc" => [77, "ag"], "\xcd" => [18, "ag"], "\xce" => [77, "ah"], "\xcf" => [18, "ah"], "\xd0" => [77, "al"], "\xd1" => [18, "al"], "\xd2" => [77, "am"], "\xd3" => [18, "am"], "\xd4" => [77, "an"], "\xd5" => [18, "an"], "\xd6" => [77, "ap"], "\xd7" => [18, "ap"], "\xd8" => [77, "ar"], "\xd9" => [18, "ar"], "\xda" => [77, "au"], "\xdb" => [18, "au"], "\xdc" => [0, "a:"], "\xdd" => [0, "aB"], "\xde" => [0, "aC"], "\xdf" => [0, "aD"], "\xe0" => [0, "aE"], "\xe1" => [0, "aF"], "\xe2" => [0, "aG"], "\xe3" => [0, "aH"], "\xe4" => [0, "aI"], "\xe5" => [0, "aJ"], "\xe6" => [0, "aK"], "\xe7" => [0, "aL"], "\xe8" => [0, "aM"], "\xe9" => [0, "aN"], "\xea" => [0, "aO"], "\xeb" => [0, "aP"], "\xec" => [0, "aQ"], "\xed" => [0, "aR"], "\xee" => [0, "aS"], "\xef" => [0, "aT"], "\xf0" => [0, "aU"], "\xf1" => [0, "aV"], "\xf2" => [0, "aW"], "\xf3" => [0, "aY"], "\xf4" => [0, "aj"], "\xf5" => [0, "ak"], "\xf6" => [0, "aq"], "\xf7" => [0, "av"], "\xf8" => [0, "aw"], "\xf9" => [0, "ax"], "\xfa" => [0, "ay"], "\xfb" => [0, "az"], "\xfc" => [82, "a"], "\xfd" => [87, "a"], "\xfe" => [130, "a"], "\xff" => [9, "a"]], ["\x00" => [94, "40"], "\x01" => [76, "40"], "\x02" => [104, "40"], "\x03" => [16, "40"], "\x04" => [94, "41"], "\x05" => [76, "41"], "\x06" => [104, "41"], "\x07" => [16, "41"], "\x08" => [94, "42"], "\t" => [76, "42"], "\n" => [104, "42"], "\v" => [16, "42"], "\f" => [94, "4a"], "\r" => [76, "4a"], "\x0e" => [104, "4a"], "\x0f" => [16, "4a"], "\x10" => [94, "4c"], "\x11" => [76, "4c"], "\x12" => [104, "4c"], "\x13" => [16, "4c"], "\x14" => [94, "4e"], "\x15" => [76, "4e"], "\x16" => [104, "4e"], "\x17" => [16, "4e"], "\x18" => [94, "4i"], "\x19" => [76, "4i"], "\x1a" => [104, "4i"], "\x1b" => [16, "4i"], "\x1c" => [94, "4o"], "\x1d" => [76, "4o"], "\x1e" => [104, "4o"], "\x1f" => [16, "4o"], " " => [94, "4s"], "!" => [76, "4s"], "\"" => [104, "4s"], "#" => [16, "4s"], "\$" => [94, "4t"], "%" => [76, "4t"], "&" => [104, "4t"], "'" => [16, "4t"], "(" => [77, "4 "], ")" => [18, "4 "], "*" => [77, "4%"], "+" => [18, "4%"], "," => [77, "4-"], "-" => [18, "4-"], "." => [77, "4."], "/" => [18, "4."], [77, "4/"], [18, "4/"], [77, "43"], [18, "43"], [77, "44"], [18, "44"], [77, "45"], [18, "45"], [77, "46"], [18, "46"], ":" => [77, "47"], ";" => [18, "47"], "<" => [77, "48"], "=" => [18, "48"], ">" => [77, "49"], "?" => [18, "49"], "@" => [77, "4="], "A" => [18, "4="], "B" => [77, "4A"], "C" => [18, "4A"], "D" => [77, "4_"], "E" => [18, "4_"], "F" => [77, "4b"], "G" => [18, "4b"], "H" => [77, "4d"], "I" => [18, "4d"], "J" => [77, "4f"], "K" => [18, "4f"], "L" => [77, "4g"], "M" => [18, "4g"], "N" => [77, "4h"], "O" => [18, "4h"], "P" => [77, "4l"], "Q" => [18, "4l"], "R" => [77, "4m"], "S" => [18, "4m"], "T" => [77, "4n"], "U" => [18, "4n"], "V" => [77, "4p"], "W" => [18, "4p"], "X" => [77, "4r"], "Y" => [18, "4r"], "Z" => [77, "4u"], "[" => [18, "4u"], "\\" => [0, "4:"], "]" => [0, "4B"], "^" => [0, "4C"], "_" => [0, "4D"], "`" => [0, "4E"], "a" => [0, "4F"], "b" => [0, "4G"], "c" => [0, "4H"], "d" => [0, "4I"], "e" => [0, "4J"], "f" => [0, "4K"], "g" => [0, "4L"], "h" => [0, "4M"], "i" => [0, "4N"], "j" => [0, "4O"], "k" => [0, "4P"], "l" => [0, "4Q"], "m" => [0, "4R"], "n" => [0, "4S"], "o" => [0, "4T"], "p" => [0, "4U"], "q" => [0, "4V"], "r" => [0, "4W"], "s" => [0, "4Y"], "t" => [0, "4j"], "u" => [0, "4k"], "v" => [0, "4q"], "w" => [0, "4v"], "x" => [0, "4w"], "y" => [0, "4x"], "z" => [0, "4y"], "{" => [0, "4z"], "|" => [82, "4"], "}" => [87, "4"], "~" => [130, "4"], "" => [9, "4"], "\x80" => [94, "50"], "\x81" => [76, "50"], "\x82" => [104, "50"], "\x83" => [16, "50"], "\x84" => [94, "51"], "\x85" => [76, "51"], "\x86" => [104, "51"], "\x87" => [16, "51"], "\x88" => [94, "52"], "\x89" => [76, "52"], "\x8a" => [104, "52"], "\x8b" => [16, "52"], "\x8c" => [94, "5a"], "\x8d" => [76, "5a"], "\x8e" => [104, "5a"], "\x8f" => [16, "5a"], "\x90" => [94, "5c"], "\x91" => [76, "5c"], "\x92" => [104, "5c"], "\x93" => [16, "5c"], "\x94" => [94, "5e"], "\x95" => [76, "5e"], "\x96" => [104, "5e"], "\x97" => [16, "5e"], "\x98" => [94, "5i"], "\x99" => [76, "5i"], "\x9a" => [104, "5i"], "\x9b" => [16, "5i"], "\x9c" => [94, "5o"], "\x9d" => [76, "5o"], "\x9e" => [104, "5o"], "\x9f" => [16, "5o"], "\xa0" => [94, "5s"], "\xa1" => [76, "5s"], "\xa2" => [104, "5s"], "\xa3" => [16, "5s"], "\xa4" => [94, "5t"], "\xa5" => [76, "5t"], "\xa6" => [104, "5t"], "\xa7" => [16, "5t"], "\xa8" => [77, "5 "], "\xa9" => [18, "5 "], "\xaa" => [77, "5%"], "\xab" => [18, "5%"], "\xac" => [77, "5-"], "\xad" => [18, "5-"], "\xae" => [77, "5."], "\xaf" => [18, "5."], "\xb0" => [77, "5/"], "\xb1" => [18, "5/"], "\xb2" => [77, "53"], "\xb3" => [18, "53"], "\xb4" => [77, "54"], "\xb5" => [18, "54"], "\xb6" => [77, "55"], "\xb7" => [18, "55"], "\xb8" => [77, "56"], "\xb9" => [18, "56"], "\xba" => [77, "57"], "\xbb" => [18, "57"], "\xbc" => [77, "58"], "\xbd" => [18, "58"], "\xbe" => [77, "59"], "\xbf" => [18, "59"], "\xc0" => [77, "5="], "\xc1" => [18, "5="], "\xc2" => [77, "5A"], "\xc3" => [18, "5A"], "\xc4" => [77, "5_"], "\xc5" => [18, "5_"], "\xc6" => [77, "5b"], "\xc7" => [18, "5b"], "\xc8" => [77, "5d"], "\xc9" => [18, "5d"], "\xca" => [77, "5f"], "\xcb" => [18, "5f"], "\xcc" => [77, "5g"], "\xcd" => [18, "5g"], "\xce" => [77, "5h"], "\xcf" => [18, "5h"], "\xd0" => [77, "5l"], "\xd1" => [18, "5l"], "\xd2" => [77, "5m"], "\xd3" => [18, "5m"], "\xd4" => [77, "5n"], "\xd5" => [18, "5n"], "\xd6" => [77, "5p"], "\xd7" => [18, "5p"], "\xd8" => [77, "5r"], "\xd9" => [18, "5r"], "\xda" => [77, "5u"], "\xdb" => [18, "5u"], "\xdc" => [0, "5:"], "\xdd" => [0, "5B"], "\xde" => [0, "5C"], "\xdf" => [0, "5D"], "\xe0" => [0, "5E"], "\xe1" => [0, "5F"], "\xe2" => [0, "5G"], "\xe3" => [0, "5H"], "\xe4" => [0, "5I"], "\xe5" => [0, "5J"], "\xe6" => [0, "5K"], "\xe7" => [0, "5L"], "\xe8" => [0, "5M"], "\xe9" => [0, "5N"], "\xea" => [0, "5O"], "\xeb" => [0, "5P"], "\xec" => [0, "5Q"], "\xed" => [0, "5R"], "\xee" => [0, "5S"], "\xef" => [0, "5T"], "\xf0" => [0, "5U"], "\xf1" => [0, "5V"], "\xf2" => [0, "5W"], "\xf3" => [0, "5Y"], "\xf4" => [0, "5j"], "\xf5" => [0, "5k"], "\xf6" => [0, "5q"], "\xf7" => [0, "5v"], "\xf8" => [0, "5w"], "\xf9" => [0, "5x"], "\xfa" => [0, "5y"], "\xfb" => [0, "5z"], "\xfc" => [82, "5"], "\xfd" => [87, "5"], "\xfe" => [130, "5"], "\xff" => [9, "5"]], ["\x00" => [94, "60"], "\x01" => [76, "60"], "\x02" => [104, "60"], "\x03" => [16, "60"], "\x04" => [94, "61"], "\x05" => [76, "61"], "\x06" => [104, "61"], "\x07" => [16, "61"], "\x08" => [94, "62"], "\t" => [76, "62"], "\n" => [104, "62"], "\v" => [16, "62"], "\f" => [94, "6a"], "\r" => [76, "6a"], "\x0e" => [104, "6a"], "\x0f" => [16, "6a"], "\x10" => [94, "6c"], "\x11" => [76, "6c"], "\x12" => [104, "6c"], "\x13" => [16, "6c"], "\x14" => [94, "6e"], "\x15" => [76, "6e"], "\x16" => [104, "6e"], "\x17" => [16, "6e"], "\x18" => [94, "6i"], "\x19" => [76, "6i"], "\x1a" => [104, "6i"], "\x1b" => [16, "6i"], "\x1c" => [94, "6o"], "\x1d" => [76, "6o"], "\x1e" => [104, "6o"], "\x1f" => [16, "6o"], " " => [94, "6s"], "!" => [76, "6s"], "\"" => [104, "6s"], "#" => [16, "6s"], "\$" => [94, "6t"], "%" => [76, "6t"], "&" => [104, "6t"], "'" => [16, "6t"], "(" => [77, "6 "], ")" => [18, "6 "], "*" => [77, "6%"], "+" => [18, "6%"], "," => [77, "6-"], "-" => [18, "6-"], "." => [77, "6."], "/" => [18, "6."], [77, "6/"], [18, "6/"], [77, "63"], [18, "63"], [77, "64"], [18, "64"], [77, "65"], [18, "65"], [77, "66"], [18, "66"], ":" => [77, "67"], ";" => [18, "67"], "<" => [77, "68"], "=" => [18, "68"], ">" => [77, "69"], "?" => [18, "69"], "@" => [77, "6="], "A" => [18, "6="], "B" => [77, "6A"], "C" => [18, "6A"], "D" => [77, "6_"], "E" => [18, "6_"], "F" => [77, "6b"], "G" => [18, "6b"], "H" => [77, "6d"], "I" => [18, "6d"], "J" => [77, "6f"], "K" => [18, "6f"], "L" => [77, "6g"], "M" => [18, "6g"], "N" => [77, "6h"], "O" => [18, "6h"], "P" => [77, "6l"], "Q" => [18, "6l"], "R" => [77, "6m"], "S" => [18, "6m"], "T" => [77, "6n"], "U" => [18, "6n"], "V" => [77, "6p"], "W" => [18, "6p"], "X" => [77, "6r"], "Y" => [18, "6r"], "Z" => [77, "6u"], "[" => [18, "6u"], "\\" => [0, "6:"], "]" => [0, "6B"], "^" => [0, "6C"], "_" => [0, "6D"], "`" => [0, "6E"], "a" => [0, "6F"], "b" => [0, "6G"], "c" => [0, "6H"], "d" => [0, "6I"], "e" => [0, "6J"], "f" => [0, "6K"], "g" => [0, "6L"], "h" => [0, "6M"], "i" => [0, "6N"], "j" => [0, "6O"], "k" => [0, "6P"], "l" => [0, "6Q"], "m" => [0, "6R"], "n" => [0, "6S"], "o" => [0, "6T"], "p" => [0, "6U"], "q" => [0, "6V"], "r" => [0, "6W"], "s" => [0, "6Y"], "t" => [0, "6j"], "u" => [0, "6k"], "v" => [0, "6q"], "w" => [0, "6v"], "x" => [0, "6w"], "y" => [0, "6x"], "z" => [0, "6y"], "{" => [0, "6z"], "|" => [82, "6"], "}" => [87, "6"], "~" => [130, "6"], "" => [9, "6"], "\x80" => [94, "70"], "\x81" => [76, "70"], "\x82" => [104, "70"], "\x83" => [16, "70"], "\x84" => [94, "71"], "\x85" => [76, "71"], "\x86" => [104, "71"], "\x87" => [16, "71"], "\x88" => [94, "72"], "\x89" => [76, "72"], "\x8a" => [104, "72"], "\x8b" => [16, "72"], "\x8c" => [94, "7a"], "\x8d" => [76, "7a"], "\x8e" => [104, "7a"], "\x8f" => [16, "7a"], "\x90" => [94, "7c"], "\x91" => [76, "7c"], "\x92" => [104, "7c"], "\x93" => [16, "7c"], "\x94" => [94, "7e"], "\x95" => [76, "7e"], "\x96" => [104, "7e"], "\x97" => [16, "7e"], "\x98" => [94, "7i"], "\x99" => [76, "7i"], "\x9a" => [104, "7i"], "\x9b" => [16, "7i"], "\x9c" => [94, "7o"], "\x9d" => [76, "7o"], "\x9e" => [104, "7o"], "\x9f" => [16, "7o"], "\xa0" => [94, "7s"], "\xa1" => [76, "7s"], "\xa2" => [104, "7s"], "\xa3" => [16, "7s"], "\xa4" => [94, "7t"], "\xa5" => [76, "7t"], "\xa6" => [104, "7t"], "\xa7" => [16, "7t"], "\xa8" => [77, "7 "], "\xa9" => [18, "7 "], "\xaa" => [77, "7%"], "\xab" => [18, "7%"], "\xac" => [77, "7-"], "\xad" => [18, "7-"], "\xae" => [77, "7."], "\xaf" => [18, "7."], "\xb0" => [77, "7/"], "\xb1" => [18, "7/"], "\xb2" => [77, "73"], "\xb3" => [18, "73"], "\xb4" => [77, "74"], "\xb5" => [18, "74"], "\xb6" => [77, "75"], "\xb7" => [18, "75"], "\xb8" => [77, "76"], "\xb9" => [18, "76"], "\xba" => [77, "77"], "\xbb" => [18, "77"], "\xbc" => [77, "78"], "\xbd" => [18, "78"], "\xbe" => [77, "79"], "\xbf" => [18, "79"], "\xc0" => [77, "7="], "\xc1" => [18, "7="], "\xc2" => [77, "7A"], "\xc3" => [18, "7A"], "\xc4" => [77, "7_"], "\xc5" => [18, "7_"], "\xc6" => [77, "7b"], "\xc7" => [18, "7b"], "\xc8" => [77, "7d"], "\xc9" => [18, "7d"], "\xca" => [77, "7f"], "\xcb" => [18, "7f"], "\xcc" => [77, "7g"], "\xcd" => [18, "7g"], "\xce" => [77, "7h"], "\xcf" => [18, "7h"], "\xd0" => [77, "7l"], "\xd1" => [18, "7l"], "\xd2" => [77, "7m"], "\xd3" => [18, "7m"], "\xd4" => [77, "7n"], "\xd5" => [18, "7n"], "\xd6" => [77, "7p"], "\xd7" => [18, "7p"], "\xd8" => [77, "7r"], "\xd9" => [18, "7r"], "\xda" => [77, "7u"], "\xdb" => [18, "7u"], "\xdc" => [0, "7:"], "\xdd" => [0, "7B"], "\xde" => [0, "7C"], "\xdf" => [0, "7D"], "\xe0" => [0, "7E"], "\xe1" => [0, "7F"], "\xe2" => [0, "7G"], "\xe3" => [0, "7H"], "\xe4" => [0, "7I"], "\xe5" => [0, "7J"], "\xe6" => [0, "7K"], "\xe7" => [0, "7L"], "\xe8" => [0, "7M"], "\xe9" => [0, "7N"], "\xea" => [0, "7O"], "\xeb" => [0, "7P"], "\xec" => [0, "7Q"], "\xed" => [0, "7R"], "\xee" => [0, "7S"], "\xef" => [0, "7T"], "\xf0" => [0, "7U"], "\xf1" => [0, "7V"], "\xf2" => [0, "7W"], "\xf3" => [0, "7Y"], "\xf4" => [0, "7j"], "\xf5" => [0, "7k"], "\xf6" => [0, "7q"], "\xf7" => [0, "7v"], "\xf8" => [0, "7w"], "\xf9" => [0, "7x"], "\xfa" => [0, "7y"], "\xfb" => [0, "7z"], "\xfc" => [82, "7"], "\xfd" => [87, "7"], "\xfe" => [130, "7"], "\xff" => [9, "7"]], ["\x00" => [77, "60"], "\x01" => [18, "60"], "\x02" => [77, "61"], "\x03" => [18, "61"], "\x04" => [77, "62"], "\x05" => [18, "62"], "\x06" => [77, "6a"], "\x07" => [18, "6a"], "\x08" => [77, "6c"], "\t" => [18, "6c"], "\n" => [77, "6e"], "\v" => [18, "6e"], "\f" => [77, "6i"], "\r" => [18, "6i"], "\x0e" => [77, "6o"], "\x0f" => [18, "6o"], "\x10" => [77, "6s"], "\x11" => [18, "6s"], "\x12" => [77, "6t"], "\x13" => [18, "6t"], "\x14" => [0, "6 "], "\x15" => [0, "6%"], "\x16" => [0, "6-"], "\x17" => [0, "6."], "\x18" => [0, "6/"], "\x19" => [0, "63"], "\x1a" => [0, "64"], "\x1b" => [0, "65"], "\x1c" => [0, "66"], "\x1d" => [0, "67"], "\x1e" => [0, "68"], "\x1f" => [0, "69"], " " => [0, "6="], "!" => [0, "6A"], "\"" => [0, "6_"], "#" => [0, "6b"], "\$" => [0, "6d"], "%" => [0, "6f"], "&" => [0, "6g"], "'" => [0, "6h"], "(" => [0, "6l"], ")" => [0, "6m"], "*" => [0, "6n"], "+" => [0, "6p"], "," => [0, "6r"], "-" => [0, "6u"], "." => [100, "6"], "/" => [110, "6"], [111, "6"], [115, "6"], [116, "6"], [118, "6"], [119, "6"], [122, "6"], [123, "6"], [125, "6"], [126, "6"], [129, "6"], ":" => [143, "6"], ";" => [148, "6"], "<" => [151, "6"], "=" => [153, "6"], ">" => [83, "6"], "?" => [10, "6"], "@" => [77, "70"], "A" => [18, "70"], "B" => [77, "71"], "C" => [18, "71"], "D" => [77, "72"], "E" => [18, "72"], "F" => [77, "7a"], "G" => [18, "7a"], "H" => [77, "7c"], "I" => [18, "7c"], "J" => [77, "7e"], "K" => [18, "7e"], "L" => [77, "7i"], "M" => [18, "7i"], "N" => [77, "7o"], "O" => [18, "7o"], "P" => [77, "7s"], "Q" => [18, "7s"], "R" => [77, "7t"], "S" => [18, "7t"], "T" => [0, "7 "], "U" => [0, "7%"], "V" => [0, "7-"], "W" => [0, "7."], "X" => [0, "7/"], "Y" => [0, "73"], "Z" => [0, "74"], "[" => [0, "75"], "\\" => [0, "76"], "]" => [0, "77"], "^" => [0, "78"], "_" => [0, "79"], "`" => [0, "7="], "a" => [0, "7A"], "b" => [0, "7_"], "c" => [0, "7b"], "d" => [0, "7d"], "e" => [0, "7f"], "f" => [0, "7g"], "g" => [0, "7h"], "h" => [0, "7l"], "i" => [0, "7m"], "j" => [0, "7n"], "k" => [0, "7p"], "l" => [0, "7r"], "m" => [0, "7u"], "n" => [100, "7"], "o" => [110, "7"], "p" => [111, "7"], "q" => [115, "7"], "r" => [116, "7"], "s" => [118, "7"], "t" => [119, "7"], "u" => [122, "7"], "v" => [123, "7"], "w" => [125, "7"], "x" => [126, "7"], "y" => [129, "7"], "z" => [143, "7"], "{" => [148, "7"], "|" => [151, "7"], "}" => [153, "7"], "~" => [83, "7"], "" => [10, "7"], "\x80" => [77, "80"], "\x81" => [18, "80"], "\x82" => [77, "81"], "\x83" => [18, "81"], "\x84" => [77, "82"], "\x85" => [18, "82"], "\x86" => [77, "8a"], "\x87" => [18, "8a"], "\x88" => [77, "8c"], "\x89" => [18, "8c"], "\x8a" => [77, "8e"], "\x8b" => [18, "8e"], "\x8c" => [77, "8i"], "\x8d" => [18, "8i"], "\x8e" => [77, "8o"], "\x8f" => [18, "8o"], "\x90" => [77, "8s"], "\x91" => [18, "8s"], "\x92" => [77, "8t"], "\x93" => [18, "8t"], "\x94" => [0, "8 "], "\x95" => [0, "8%"], "\x96" => [0, "8-"], "\x97" => [0, "8."], "\x98" => [0, "8/"], "\x99" => [0, "83"], "\x9a" => [0, "84"], "\x9b" => [0, "85"], "\x9c" => [0, "86"], "\x9d" => [0, "87"], "\x9e" => [0, "88"], "\x9f" => [0, "89"], "\xa0" => [0, "8="], "\xa1" => [0, "8A"], "\xa2" => [0, "8_"], "\xa3" => [0, "8b"], "\xa4" => [0, "8d"], "\xa5" => [0, "8f"], "\xa6" => [0, "8g"], "\xa7" => [0, "8h"], "\xa8" => [0, "8l"], "\xa9" => [0, "8m"], "\xaa" => [0, "8n"], "\xab" => [0, "8p"], "\xac" => [0, "8r"], "\xad" => [0, "8u"], "\xae" => [100, "8"], "\xaf" => [110, "8"], "\xb0" => [111, "8"], "\xb1" => [115, "8"], "\xb2" => [116, "8"], "\xb3" => [118, "8"], "\xb4" => [119, "8"], "\xb5" => [122, "8"], "\xb6" => [123, "8"], "\xb7" => [125, "8"], "\xb8" => [126, "8"], "\xb9" => [129, "8"], "\xba" => [143, "8"], "\xbb" => [148, "8"], "\xbc" => [151, "8"], "\xbd" => [153, "8"], "\xbe" => [83, "8"], "\xbf" => [10, "8"], "\xc0" => [77, "90"], "\xc1" => [18, "90"], "\xc2" => [77, "91"], "\xc3" => [18, "91"], "\xc4" => [77, "92"], "\xc5" => [18, "92"], "\xc6" => [77, "9a"], "\xc7" => [18, "9a"], "\xc8" => [77, "9c"], "\xc9" => [18, "9c"], "\xca" => [77, "9e"], "\xcb" => [18, "9e"], "\xcc" => [77, "9i"], "\xcd" => [18, "9i"], "\xce" => [77, "9o"], "\xcf" => [18, "9o"], "\xd0" => [77, "9s"], "\xd1" => [18, "9s"], "\xd2" => [77, "9t"], "\xd3" => [18, "9t"], "\xd4" => [0, "9 "], "\xd5" => [0, "9%"], "\xd6" => [0, "9-"], "\xd7" => [0, "9."], "\xd8" => [0, "9/"], "\xd9" => [0, "93"], "\xda" => [0, "94"], "\xdb" => [0, "95"], "\xdc" => [0, "96"], "\xdd" => [0, "97"], "\xde" => [0, "98"], "\xdf" => [0, "99"], "\xe0" => [0, "9="], "\xe1" => [0, "9A"], "\xe2" => [0, "9_"], "\xe3" => [0, "9b"], "\xe4" => [0, "9d"], "\xe5" => [0, "9f"], "\xe6" => [0, "9g"], "\xe7" => [0, "9h"], "\xe8" => [0, "9l"], "\xe9" => [0, "9m"], "\xea" => [0, "9n"], "\xeb" => [0, "9p"], "\xec" => [0, "9r"], "\xed" => [0, "9u"], "\xee" => [100, "9"], "\xef" => [110, "9"], "\xf0" => [111, "9"], "\xf1" => [115, "9"], "\xf2" => [116, "9"], "\xf3" => [118, "9"], "\xf4" => [119, "9"], "\xf5" => [122, "9"], "\xf6" => [123, "9"], "\xf7" => [125, "9"], "\xf8" => [126, "9"], "\xf9" => [129, "9"], "\xfa" => [143, "9"], "\xfb" => [148, "9"], "\xfc" => [151, "9"], "\xfd" => [153, "9"], "\xfe" => [83, "9"], "\xff" => [10, "9"]], ["\x00" => [94, "80"], "\x01" => [76, "80"], "\x02" => [104, "80"], "\x03" => [16, "80"], "\x04" => [94, "81"], "\x05" => [76, "81"], "\x06" => [104, "81"], "\x07" => [16, "81"], "\x08" => [94, "82"], "\t" => [76, "82"], "\n" => [104, "82"], "\v" => [16, "82"], "\f" => [94, "8a"], "\r" => [76, "8a"], "\x0e" => [104, "8a"], "\x0f" => [16, "8a"], "\x10" => [94, "8c"], "\x11" => [76, "8c"], "\x12" => [104, "8c"], "\x13" => [16, "8c"], "\x14" => [94, "8e"], "\x15" => [76, "8e"], "\x16" => [104, "8e"], "\x17" => [16, "8e"], "\x18" => [94, "8i"], "\x19" => [76, "8i"], "\x1a" => [104, "8i"], "\x1b" => [16, "8i"], "\x1c" => [94, "8o"], "\x1d" => [76, "8o"], "\x1e" => [104, "8o"], "\x1f" => [16, "8o"], " " => [94, "8s"], "!" => [76, "8s"], "\"" => [104, "8s"], "#" => [16, "8s"], "\$" => [94, "8t"], "%" => [76, "8t"], "&" => [104, "8t"], "'" => [16, "8t"], "(" => [77, "8 "], ")" => [18, "8 "], "*" => [77, "8%"], "+" => [18, "8%"], "," => [77, "8-"], "-" => [18, "8-"], "." => [77, "8."], "/" => [18, "8."], [77, "8/"], [18, "8/"], [77, "83"], [18, "83"], [77, "84"], [18, "84"], [77, "85"], [18, "85"], [77, "86"], [18, "86"], ":" => [77, "87"], ";" => [18, "87"], "<" => [77, "88"], "=" => [18, "88"], ">" => [77, "89"], "?" => [18, "89"], "@" => [77, "8="], "A" => [18, "8="], "B" => [77, "8A"], "C" => [18, "8A"], "D" => [77, "8_"], "E" => [18, "8_"], "F" => [77, "8b"], "G" => [18, "8b"], "H" => [77, "8d"], "I" => [18, "8d"], "J" => [77, "8f"], "K" => [18, "8f"], "L" => [77, "8g"], "M" => [18, "8g"], "N" => [77, "8h"], "O" => [18, "8h"], "P" => [77, "8l"], "Q" => [18, "8l"], "R" => [77, "8m"], "S" => [18, "8m"], "T" => [77, "8n"], "U" => [18, "8n"], "V" => [77, "8p"], "W" => [18, "8p"], "X" => [77, "8r"], "Y" => [18, "8r"], "Z" => [77, "8u"], "[" => [18, "8u"], "\\" => [0, "8:"], "]" => [0, "8B"], "^" => [0, "8C"], "_" => [0, "8D"], "`" => [0, "8E"], "a" => [0, "8F"], "b" => [0, "8G"], "c" => [0, "8H"], "d" => [0, "8I"], "e" => [0, "8J"], "f" => [0, "8K"], "g" => [0, "8L"], "h" => [0, "8M"], "i" => [0, "8N"], "j" => [0, "8O"], "k" => [0, "8P"], "l" => [0, "8Q"], "m" => [0, "8R"], "n" => [0, "8S"], "o" => [0, "8T"], "p" => [0, "8U"], "q" => [0, "8V"], "r" => [0, "8W"], "s" => [0, "8Y"], "t" => [0, "8j"], "u" => [0, "8k"], "v" => [0, "8q"], "w" => [0, "8v"], "x" => [0, "8w"], "y" => [0, "8x"], "z" => [0, "8y"], "{" => [0, "8z"], "|" => [82, "8"], "}" => [87, "8"], "~" => [130, "8"], "" => [9, "8"], "\x80" => [94, "90"], "\x81" => [76, "90"], "\x82" => [104, "90"], "\x83" => [16, "90"], "\x84" => [94, "91"], "\x85" => [76, "91"], "\x86" => [104, "91"], "\x87" => [16, "91"], "\x88" => [94, "92"], "\x89" => [76, "92"], "\x8a" => [104, "92"], "\x8b" => [16, "92"], "\x8c" => [94, "9a"], "\x8d" => [76, "9a"], "\x8e" => [104, "9a"], "\x8f" => [16, "9a"], "\x90" => [94, "9c"], "\x91" => [76, "9c"], "\x92" => [104, "9c"], "\x93" => [16, "9c"], "\x94" => [94, "9e"], "\x95" => [76, "9e"], "\x96" => [104, "9e"], "\x97" => [16, "9e"], "\x98" => [94, "9i"], "\x99" => [76, "9i"], "\x9a" => [104, "9i"], "\x9b" => [16, "9i"], "\x9c" => [94, "9o"], "\x9d" => [76, "9o"], "\x9e" => [104, "9o"], "\x9f" => [16, "9o"], "\xa0" => [94, "9s"], "\xa1" => [76, "9s"], "\xa2" => [104, "9s"], "\xa3" => [16, "9s"], "\xa4" => [94, "9t"], "\xa5" => [76, "9t"], "\xa6" => [104, "9t"], "\xa7" => [16, "9t"], "\xa8" => [77, "9 "], "\xa9" => [18, "9 "], "\xaa" => [77, "9%"], "\xab" => [18, "9%"], "\xac" => [77, "9-"], "\xad" => [18, "9-"], "\xae" => [77, "9."], "\xaf" => [18, "9."], "\xb0" => [77, "9/"], "\xb1" => [18, "9/"], "\xb2" => [77, "93"], "\xb3" => [18, "93"], "\xb4" => [77, "94"], "\xb5" => [18, "94"], "\xb6" => [77, "95"], "\xb7" => [18, "95"], "\xb8" => [77, "96"], "\xb9" => [18, "96"], "\xba" => [77, "97"], "\xbb" => [18, "97"], "\xbc" => [77, "98"], "\xbd" => [18, "98"], "\xbe" => [77, "99"], "\xbf" => [18, "99"], "\xc0" => [77, "9="], "\xc1" => [18, "9="], "\xc2" => [77, "9A"], "\xc3" => [18, "9A"], "\xc4" => [77, "9_"], "\xc5" => [18, "9_"], "\xc6" => [77, "9b"], "\xc7" => [18, "9b"], "\xc8" => [77, "9d"], "\xc9" => [18, "9d"], "\xca" => [77, "9f"], "\xcb" => [18, "9f"], "\xcc" => [77, "9g"], "\xcd" => [18, "9g"], "\xce" => [77, "9h"], "\xcf" => [18, "9h"], "\xd0" => [77, "9l"], "\xd1" => [18, "9l"], "\xd2" => [77, "9m"], "\xd3" => [18, "9m"], "\xd4" => [77, "9n"], "\xd5" => [18, "9n"], "\xd6" => [77, "9p"], "\xd7" => [18, "9p"], "\xd8" => [77, "9r"], "\xd9" => [18, "9r"], "\xda" => [77, "9u"], "\xdb" => [18, "9u"], "\xdc" => [0, "9:"], "\xdd" => [0, "9B"], "\xde" => [0, "9C"], "\xdf" => [0, "9D"], "\xe0" => [0, "9E"], "\xe1" => [0, "9F"], "\xe2" => [0, "9G"], "\xe3" => [0, "9H"], "\xe4" => [0, "9I"], "\xe5" => [0, "9J"], "\xe6" => [0, "9K"], "\xe7" => [0, "9L"], "\xe8" => [0, "9M"], "\xe9" => [0, "9N"], "\xea" => [0, "9O"], "\xeb" => [0, "9P"], "\xec" => [0, "9Q"], "\xed" => [0, "9R"], "\xee" => [0, "9S"], "\xef" => [0, "9T"], "\xf0" => [0, "9U"], "\xf1" => [0, "9V"], "\xf2" => [0, "9W"], "\xf3" => [0, "9Y"], "\xf4" => [0, "9j"], "\xf5" => [0, "9k"], "\xf6" => [0, "9q"], "\xf7" => [0, "9v"], "\xf8" => [0, "9w"], "\xf9" => [0, "9x"], "\xfa" => [0, "9y"], "\xfb" => [0, "9z"], "\xfc" => [82, "9"], "\xfd" => [87, "9"], "\xfe" => [130, "9"], "\xff" => [9, "9"]], ["\x00" => [94, ":0"], "\x01" => [76, ":0"], "\x02" => [104, ":0"], "\x03" => [16, ":0"], "\x04" => [94, ":1"], "\x05" => [76, ":1"], "\x06" => [104, ":1"], "\x07" => [16, ":1"], "\x08" => [94, ":2"], "\t" => [76, ":2"], "\n" => [104, ":2"], "\v" => [16, ":2"], "\f" => [94, ":a"], "\r" => [76, ":a"], "\x0e" => [104, ":a"], "\x0f" => [16, ":a"], "\x10" => [94, ":c"], "\x11" => [76, ":c"], "\x12" => [104, ":c"], "\x13" => [16, ":c"], "\x14" => [94, ":e"], "\x15" => [76, ":e"], "\x16" => [104, ":e"], "\x17" => [16, ":e"], "\x18" => [94, ":i"], "\x19" => [76, ":i"], "\x1a" => [104, ":i"], "\x1b" => [16, ":i"], "\x1c" => [94, ":o"], "\x1d" => [76, ":o"], "\x1e" => [104, ":o"], "\x1f" => [16, ":o"], " " => [94, ":s"], "!" => [76, ":s"], "\"" => [104, ":s"], "#" => [16, ":s"], "\$" => [94, ":t"], "%" => [76, ":t"], "&" => [104, ":t"], "'" => [16, ":t"], "(" => [77, ": "], ")" => [18, ": "], "*" => [77, ":%"], "+" => [18, ":%"], "," => [77, ":-"], "-" => [18, ":-"], "." => [77, ":."], "/" => [18, ":."], [77, ":/"], [18, ":/"], [77, ":3"], [18, ":3"], [77, ":4"], [18, ":4"], [77, ":5"], [18, ":5"], [77, ":6"], [18, ":6"], ":" => [77, ":7"], ";" => [18, ":7"], "<" => [77, ":8"], "=" => [18, ":8"], ">" => [77, ":9"], "?" => [18, ":9"], "@" => [77, ":="], "A" => [18, ":="], "B" => [77, ":A"], "C" => [18, ":A"], "D" => [77, ":_"], "E" => [18, ":_"], "F" => [77, ":b"], "G" => [18, ":b"], "H" => [77, ":d"], "I" => [18, ":d"], "J" => [77, ":f"], "K" => [18, ":f"], "L" => [77, ":g"], "M" => [18, ":g"], "N" => [77, ":h"], "O" => [18, ":h"], "P" => [77, ":l"], "Q" => [18, ":l"], "R" => [77, ":m"], "S" => [18, ":m"], "T" => [77, ":n"], "U" => [18, ":n"], "V" => [77, ":p"], "W" => [18, ":p"], "X" => [77, ":r"], "Y" => [18, ":r"], "Z" => [77, ":u"], "[" => [18, ":u"], "\\" => [0, "::"], "]" => [0, ":B"], "^" => [0, ":C"], "_" => [0, ":D"], "`" => [0, ":E"], "a" => [0, ":F"], "b" => [0, ":G"], "c" => [0, ":H"], "d" => [0, ":I"], "e" => [0, ":J"], "f" => [0, ":K"], "g" => [0, ":L"], "h" => [0, ":M"], "i" => [0, ":N"], "j" => [0, ":O"], "k" => [0, ":P"], "l" => [0, ":Q"], "m" => [0, ":R"], "n" => [0, ":S"], "o" => [0, ":T"], "p" => [0, ":U"], "q" => [0, ":V"], "r" => [0, ":W"], "s" => [0, ":Y"], "t" => [0, ":j"], "u" => [0, ":k"], "v" => [0, ":q"], "w" => [0, ":v"], "x" => [0, ":w"], "y" => [0, ":x"], "z" => [0, ":y"], "{" => [0, ":z"], "|" => [82, ":"], "}" => [87, ":"], "~" => [130, ":"], "" => [9, ":"], "\x80" => [94, "B0"], "\x81" => [76, "B0"], "\x82" => [104, "B0"], "\x83" => [16, "B0"], "\x84" => [94, "B1"], "\x85" => [76, "B1"], "\x86" => [104, "B1"], "\x87" => [16, "B1"], "\x88" => [94, "B2"], "\x89" => [76, "B2"], "\x8a" => [104, "B2"], "\x8b" => [16, "B2"], "\x8c" => [94, "Ba"], "\x8d" => [76, "Ba"], "\x8e" => [104, "Ba"], "\x8f" => [16, "Ba"], "\x90" => [94, "Bc"], "\x91" => [76, "Bc"], "\x92" => [104, "Bc"], "\x93" => [16, "Bc"], "\x94" => [94, "Be"], "\x95" => [76, "Be"], "\x96" => [104, "Be"], "\x97" => [16, "Be"], "\x98" => [94, "Bi"], "\x99" => [76, "Bi"], "\x9a" => [104, "Bi"], "\x9b" => [16, "Bi"], "\x9c" => [94, "Bo"], "\x9d" => [76, "Bo"], "\x9e" => [104, "Bo"], "\x9f" => [16, "Bo"], "\xa0" => [94, "Bs"], "\xa1" => [76, "Bs"], "\xa2" => [104, "Bs"], "\xa3" => [16, "Bs"], "\xa4" => [94, "Bt"], "\xa5" => [76, "Bt"], "\xa6" => [104, "Bt"], "\xa7" => [16, "Bt"], "\xa8" => [77, "B "], "\xa9" => [18, "B "], "\xaa" => [77, "B%"], "\xab" => [18, "B%"], "\xac" => [77, "B-"], "\xad" => [18, "B-"], "\xae" => [77, "B."], "\xaf" => [18, "B."], "\xb0" => [77, "B/"], "\xb1" => [18, "B/"], "\xb2" => [77, "B3"], "\xb3" => [18, "B3"], "\xb4" => [77, "B4"], "\xb5" => [18, "B4"], "\xb6" => [77, "B5"], "\xb7" => [18, "B5"], "\xb8" => [77, "B6"], "\xb9" => [18, "B6"], "\xba" => [77, "B7"], "\xbb" => [18, "B7"], "\xbc" => [77, "B8"], "\xbd" => [18, "B8"], "\xbe" => [77, "B9"], "\xbf" => [18, "B9"], "\xc0" => [77, "B="], "\xc1" => [18, "B="], "\xc2" => [77, "BA"], "\xc3" => [18, "BA"], "\xc4" => [77, "B_"], "\xc5" => [18, "B_"], "\xc6" => [77, "Bb"], "\xc7" => [18, "Bb"], "\xc8" => [77, "Bd"], "\xc9" => [18, "Bd"], "\xca" => [77, "Bf"], "\xcb" => [18, "Bf"], "\xcc" => [77, "Bg"], "\xcd" => [18, "Bg"], "\xce" => [77, "Bh"], "\xcf" => [18, "Bh"], "\xd0" => [77, "Bl"], "\xd1" => [18, "Bl"], "\xd2" => [77, "Bm"], "\xd3" => [18, "Bm"], "\xd4" => [77, "Bn"], "\xd5" => [18, "Bn"], "\xd6" => [77, "Bp"], "\xd7" => [18, "Bp"], "\xd8" => [77, "Br"], "\xd9" => [18, "Br"], "\xda" => [77, "Bu"], "\xdb" => [18, "Bu"], "\xdc" => [0, "B:"], "\xdd" => [0, "BB"], "\xde" => [0, "BC"], "\xdf" => [0, "BD"], "\xe0" => [0, "BE"], "\xe1" => [0, "BF"], "\xe2" => [0, "BG"], "\xe3" => [0, "BH"], "\xe4" => [0, "BI"], "\xe5" => [0, "BJ"], "\xe6" => [0, "BK"], "\xe7" => [0, "BL"], "\xe8" => [0, "BM"], "\xe9" => [0, "BN"], "\xea" => [0, "BO"], "\xeb" => [0, "BP"], "\xec" => [0, "BQ"], "\xed" => [0, "BR"], "\xee" => [0, "BS"], "\xef" => [0, "BT"], "\xf0" => [0, "BU"], "\xf1" => [0, "BV"], "\xf2" => [0, "BW"], "\xf3" => [0, "BY"], "\xf4" => [0, "Bj"], "\xf5" => [0, "Bk"], "\xf6" => [0, "Bq"], "\xf7" => [0, "Bv"], "\xf8" => [0, "Bw"], "\xf9" => [0, "Bx"], "\xfa" => [0, "By"], "\xfb" => [0, "Bz"], "\xfc" => [82, "B"], "\xfd" => [87, "B"], "\xfe" => [130, "B"], "\xff" => [9, "B"]], ["\x00" => [77, ":0"], "\x01" => [18, ":0"], "\x02" => [77, ":1"], "\x03" => [18, ":1"], "\x04" => [77, ":2"], "\x05" => [18, ":2"], "\x06" => [77, ":a"], "\x07" => [18, ":a"], "\x08" => [77, ":c"], "\t" => [18, ":c"], "\n" => [77, ":e"], "\v" => [18, ":e"], "\f" => [77, ":i"], "\r" => [18, ":i"], "\x0e" => [77, ":o"], "\x0f" => [18, ":o"], "\x10" => [77, ":s"], "\x11" => [18, ":s"], "\x12" => [77, ":t"], "\x13" => [18, ":t"], "\x14" => [0, ": "], "\x15" => [0, ":%"], "\x16" => [0, ":-"], "\x17" => [0, ":."], "\x18" => [0, ":/"], "\x19" => [0, ":3"], "\x1a" => [0, ":4"], "\x1b" => [0, ":5"], "\x1c" => [0, ":6"], "\x1d" => [0, ":7"], "\x1e" => [0, ":8"], "\x1f" => [0, ":9"], " " => [0, ":="], "!" => [0, ":A"], "\"" => [0, ":_"], "#" => [0, ":b"], "\$" => [0, ":d"], "%" => [0, ":f"], "&" => [0, ":g"], "'" => [0, ":h"], "(" => [0, ":l"], ")" => [0, ":m"], "*" => [0, ":n"], "+" => [0, ":p"], "," => [0, ":r"], "-" => [0, ":u"], "." => [100, ":"], "/" => [110, ":"], [111, ":"], [115, ":"], [116, ":"], [118, ":"], [119, ":"], [122, ":"], [123, ":"], [125, ":"], [126, ":"], [129, ":"], ":" => [143, ":"], ";" => [148, ":"], "<" => [151, ":"], "=" => [153, ":"], ">" => [83, ":"], "?" => [10, ":"], "@" => [77, "B0"], "A" => [18, "B0"], "B" => [77, "B1"], "C" => [18, "B1"], "D" => [77, "B2"], "E" => [18, "B2"], "F" => [77, "Ba"], "G" => [18, "Ba"], "H" => [77, "Bc"], "I" => [18, "Bc"], "J" => [77, "Be"], "K" => [18, "Be"], "L" => [77, "Bi"], "M" => [18, "Bi"], "N" => [77, "Bo"], "O" => [18, "Bo"], "P" => [77, "Bs"], "Q" => [18, "Bs"], "R" => [77, "Bt"], "S" => [18, "Bt"], "T" => [0, "B "], "U" => [0, "B%"], "V" => [0, "B-"], "W" => [0, "B."], "X" => [0, "B/"], "Y" => [0, "B3"], "Z" => [0, "B4"], "[" => [0, "B5"], "\\" => [0, "B6"], "]" => [0, "B7"], "^" => [0, "B8"], "_" => [0, "B9"], "`" => [0, "B="], "a" => [0, "BA"], "b" => [0, "B_"], "c" => [0, "Bb"], "d" => [0, "Bd"], "e" => [0, "Bf"], "f" => [0, "Bg"], "g" => [0, "Bh"], "h" => [0, "Bl"], "i" => [0, "Bm"], "j" => [0, "Bn"], "k" => [0, "Bp"], "l" => [0, "Br"], "m" => [0, "Bu"], "n" => [100, "B"], "o" => [110, "B"], "p" => [111, "B"], "q" => [115, "B"], "r" => [116, "B"], "s" => [118, "B"], "t" => [119, "B"], "u" => [122, "B"], "v" => [123, "B"], "w" => [125, "B"], "x" => [126, "B"], "y" => [129, "B"], "z" => [143, "B"], "{" => [148, "B"], "|" => [151, "B"], "}" => [153, "B"], "~" => [83, "B"], "" => [10, "B"], "\x80" => [77, "C0"], "\x81" => [18, "C0"], "\x82" => [77, "C1"], "\x83" => [18, "C1"], "\x84" => [77, "C2"], "\x85" => [18, "C2"], "\x86" => [77, "Ca"], "\x87" => [18, "Ca"], "\x88" => [77, "Cc"], "\x89" => [18, "Cc"], "\x8a" => [77, "Ce"], "\x8b" => [18, "Ce"], "\x8c" => [77, "Ci"], "\x8d" => [18, "Ci"], "\x8e" => [77, "Co"], "\x8f" => [18, "Co"], "\x90" => [77, "Cs"], "\x91" => [18, "Cs"], "\x92" => [77, "Ct"], "\x93" => [18, "Ct"], "\x94" => [0, "C "], "\x95" => [0, "C%"], "\x96" => [0, "C-"], "\x97" => [0, "C."], "\x98" => [0, "C/"], "\x99" => [0, "C3"], "\x9a" => [0, "C4"], "\x9b" => [0, "C5"], "\x9c" => [0, "C6"], "\x9d" => [0, "C7"], "\x9e" => [0, "C8"], "\x9f" => [0, "C9"], "\xa0" => [0, "C="], "\xa1" => [0, "CA"], "\xa2" => [0, "C_"], "\xa3" => [0, "Cb"], "\xa4" => [0, "Cd"], "\xa5" => [0, "Cf"], "\xa6" => [0, "Cg"], "\xa7" => [0, "Ch"], "\xa8" => [0, "Cl"], "\xa9" => [0, "Cm"], "\xaa" => [0, "Cn"], "\xab" => [0, "Cp"], "\xac" => [0, "Cr"], "\xad" => [0, "Cu"], "\xae" => [100, "C"], "\xaf" => [110, "C"], "\xb0" => [111, "C"], "\xb1" => [115, "C"], "\xb2" => [116, "C"], "\xb3" => [118, "C"], "\xb4" => [119, "C"], "\xb5" => [122, "C"], "\xb6" => [123, "C"], "\xb7" => [125, "C"], "\xb8" => [126, "C"], "\xb9" => [129, "C"], "\xba" => [143, "C"], "\xbb" => [148, "C"], "\xbc" => [151, "C"], "\xbd" => [153, "C"], "\xbe" => [83, "C"], "\xbf" => [10, "C"], "\xc0" => [77, "D0"], "\xc1" => [18, "D0"], "\xc2" => [77, "D1"], "\xc3" => [18, "D1"], "\xc4" => [77, "D2"], "\xc5" => [18, "D2"], "\xc6" => [77, "Da"], "\xc7" => [18, "Da"], "\xc8" => [77, "Dc"], "\xc9" => [18, "Dc"], "\xca" => [77, "De"], "\xcb" => [18, "De"], "\xcc" => [77, "Di"], "\xcd" => [18, "Di"], "\xce" => [77, "Do"], "\xcf" => [18, "Do"], "\xd0" => [77, "Ds"], "\xd1" => [18, "Ds"], "\xd2" => [77, "Dt"], "\xd3" => [18, "Dt"], "\xd4" => [0, "D "], "\xd5" => [0, "D%"], "\xd6" => [0, "D-"], "\xd7" => [0, "D."], "\xd8" => [0, "D/"], "\xd9" => [0, "D3"], "\xda" => [0, "D4"], "\xdb" => [0, "D5"], "\xdc" => [0, "D6"], "\xdd" => [0, "D7"], "\xde" => [0, "D8"], "\xdf" => [0, "D9"], "\xe0" => [0, "D="], "\xe1" => [0, "DA"], "\xe2" => [0, "D_"], "\xe3" => [0, "Db"], "\xe4" => [0, "Dd"], "\xe5" => [0, "Df"], "\xe6" => [0, "Dg"], "\xe7" => [0, "Dh"], "\xe8" => [0, "Dl"], "\xe9" => [0, "Dm"], "\xea" => [0, "Dn"], "\xeb" => [0, "Dp"], "\xec" => [0, "Dr"], "\xed" => [0, "Du"], "\xee" => [100, "D"], "\xef" => [110, "D"], "\xf0" => [111, "D"], "\xf1" => [115, "D"], "\xf2" => [116, "D"], "\xf3" => [118, "D"], "\xf4" => [119, "D"], "\xf5" => [122, "D"], "\xf6" => [123, "D"], "\xf7" => [125, "D"], "\xf8" => [126, "D"], "\xf9" => [129, "D"], "\xfa" => [143, "D"], "\xfb" => [148, "D"], "\xfc" => [151, "D"], "\xfd" => [153, "D"], "\xfe" => [83, "D"], "\xff" => [10, "D"]], ["\x00" => [77, "r0"], "\x01" => [18, "r0"], "\x02" => [77, "r1"], "\x03" => [18, "r1"], "\x04" => [77, "r2"], "\x05" => [18, "r2"], "\x06" => [77, "ra"], "\x07" => [18, "ra"], "\x08" => [77, "rc"], "\t" => [18, "rc"], "\n" => [77, "re"], "\v" => [18, "re"], "\f" => [77, "ri"], "\r" => [18, "ri"], "\x0e" => [77, "ro"], "\x0f" => [18, "ro"], "\x10" => [77, "rs"], "\x11" => [18, "rs"], "\x12" => [77, "rt"], "\x13" => [18, "rt"], "\x14" => [0, "r "], "\x15" => [0, "r%"], "\x16" => [0, "r-"], "\x17" => [0, "r."], "\x18" => [0, "r/"], "\x19" => [0, "r3"], "\x1a" => [0, "r4"], "\x1b" => [0, "r5"], "\x1c" => [0, "r6"], "\x1d" => [0, "r7"], "\x1e" => [0, "r8"], "\x1f" => [0, "r9"], " " => [0, "r="], "!" => [0, "rA"], "\"" => [0, "r_"], "#" => [0, "rb"], "\$" => [0, "rd"], "%" => [0, "rf"], "&" => [0, "rg"], "'" => [0, "rh"], "(" => [0, "rl"], ")" => [0, "rm"], "*" => [0, "rn"], "+" => [0, "rp"], "," => [0, "rr"], "-" => [0, "ru"], "." => [100, "r"], "/" => [110, "r"], [111, "r"], [115, "r"], [116, "r"], [118, "r"], [119, "r"], [122, "r"], [123, "r"], [125, "r"], [126, "r"], [129, "r"], ":" => [143, "r"], ";" => [148, "r"], "<" => [151, "r"], "=" => [153, "r"], ">" => [83, "r"], "?" => [10, "r"], "@" => [77, "u0"], "A" => [18, "u0"], "B" => [77, "u1"], "C" => [18, "u1"], "D" => [77, "u2"], "E" => [18, "u2"], "F" => [77, "ua"], "G" => [18, "ua"], "H" => [77, "uc"], "I" => [18, "uc"], "J" => [77, "ue"], "K" => [18, "ue"], "L" => [77, "ui"], "M" => [18, "ui"], "N" => [77, "uo"], "O" => [18, "uo"], "P" => [77, "us"], "Q" => [18, "us"], "R" => [77, "ut"], "S" => [18, "ut"], "T" => [0, "u "], "U" => [0, "u%"], "V" => [0, "u-"], "W" => [0, "u."], "X" => [0, "u/"], "Y" => [0, "u3"], "Z" => [0, "u4"], "[" => [0, "u5"], "\\" => [0, "u6"], "]" => [0, "u7"], "^" => [0, "u8"], "_" => [0, "u9"], "`" => [0, "u="], "a" => [0, "uA"], "b" => [0, "u_"], "c" => [0, "ub"], "d" => [0, "ud"], "e" => [0, "uf"], "f" => [0, "ug"], "g" => [0, "uh"], "h" => [0, "ul"], "i" => [0, "um"], "j" => [0, "un"], "k" => [0, "up"], "l" => [0, "ur"], "m" => [0, "uu"], "n" => [100, "u"], "o" => [110, "u"], "p" => [111, "u"], "q" => [115, "u"], "r" => [116, "u"], "s" => [118, "u"], "t" => [119, "u"], "u" => [122, "u"], "v" => [123, "u"], "w" => [125, "u"], "x" => [126, "u"], "y" => [129, "u"], "z" => [143, "u"], "{" => [148, "u"], "|" => [151, "u"], "}" => [153, "u"], "~" => [83, "u"], "" => [10, "u"], "\x80" => [0, ":0"], "\x81" => [0, ":1"], "\x82" => [0, ":2"], "\x83" => [0, ":a"], "\x84" => [0, ":c"], "\x85" => [0, ":e"], "\x86" => [0, ":i"], "\x87" => [0, ":o"], "\x88" => [0, ":s"], "\x89" => [0, ":t"], "\x8a" => [73, ":"], "\x8b" => [88, ":"], "\x8c" => [89, ":"], "\x8d" => [96, ":"], "\x8e" => [97, ":"], "\x8f" => [99, ":"], "\x90" => [106, ":"], "\x91" => [136, ":"], "\x92" => [139, ":"], "\x93" => [141, ":"], "\x94" => [145, ":"], "\x95" => [147, ":"], "\x96" => [149, ":"], "\x97" => [101, ":"], "\x98" => [112, ":"], "\x99" => [117, ":"], "\x9a" => [120, ":"], "\x9b" => [124, ":"], "\x9c" => [127, ":"], "\x9d" => [144, ":"], "\x9e" => [152, ":"], "\x9f" => [11, ":"], "\xa0" => [0, "B0"], "\xa1" => [0, "B1"], "\xa2" => [0, "B2"], "\xa3" => [0, "Ba"], "\xa4" => [0, "Bc"], "\xa5" => [0, "Be"], "\xa6" => [0, "Bi"], "\xa7" => [0, "Bo"], "\xa8" => [0, "Bs"], "\xa9" => [0, "Bt"], "\xaa" => [73, "B"], "\xab" => [88, "B"], "\xac" => [89, "B"], "\xad" => [96, "B"], "\xae" => [97, "B"], "\xaf" => [99, "B"], "\xb0" => [106, "B"], "\xb1" => [136, "B"], "\xb2" => [139, "B"], "\xb3" => [141, "B"], "\xb4" => [145, "B"], "\xb5" => [147, "B"], "\xb6" => [149, "B"], "\xb7" => [101, "B"], "\xb8" => [112, "B"], "\xb9" => [117, "B"], "\xba" => [120, "B"], "\xbb" => [124, "B"], "\xbc" => [127, "B"], "\xbd" => [144, "B"], "\xbe" => [152, "B"], "\xbf" => [11, "B"], "\xc0" => [0, "C0"], "\xc1" => [0, "C1"], "\xc2" => [0, "C2"], "\xc3" => [0, "Ca"], "\xc4" => [0, "Cc"], "\xc5" => [0, "Ce"], "\xc6" => [0, "Ci"], "\xc7" => [0, "Co"], "\xc8" => [0, "Cs"], "\xc9" => [0, "Ct"], "\xca" => [73, "C"], "\xcb" => [88, "C"], "\xcc" => [89, "C"], "\xcd" => [96, "C"], "\xce" => [97, "C"], "\xcf" => [99, "C"], "\xd0" => [106, "C"], "\xd1" => [136, "C"], "\xd2" => [139, "C"], "\xd3" => [141, "C"], "\xd4" => [145, "C"], "\xd5" => [147, "C"], "\xd6" => [149, "C"], "\xd7" => [101, "C"], "\xd8" => [112, "C"], "\xd9" => [117, "C"], "\xda" => [120, "C"], "\xdb" => [124, "C"], "\xdc" => [127, "C"], "\xdd" => [144, "C"], "\xde" => [152, "C"], "\xdf" => [11, "C"], "\xe0" => [0, "D0"], "\xe1" => [0, "D1"], "\xe2" => [0, "D2"], "\xe3" => [0, "Da"], "\xe4" => [0, "Dc"], "\xe5" => [0, "De"], "\xe6" => [0, "Di"], "\xe7" => [0, "Do"], "\xe8" => [0, "Ds"], "\xe9" => [0, "Dt"], "\xea" => [73, "D"], "\xeb" => [88, "D"], "\xec" => [89, "D"], "\xed" => [96, "D"], "\xee" => [97, "D"], "\xef" => [99, "D"], "\xf0" => [106, "D"], "\xf1" => [136, "D"], "\xf2" => [139, "D"], "\xf3" => [141, "D"], "\xf4" => [145, "D"], "\xf5" => [147, "D"], "\xf6" => [149, "D"], "\xf7" => [101, "D"], "\xf8" => [112, "D"], "\xf9" => [117, "D"], "\xfa" => [120, "D"], "\xfb" => [124, "D"], "\xfc" => [127, "D"], "\xfd" => [144, "D"], "\xfe" => [152, "D"], "\xff" => [11, "D"]], ["\x00" => [0, "l0"], "\x01" => [0, "l1"], "\x02" => [0, "l2"], "\x03" => [0, "la"], "\x04" => [0, "lc"], "\x05" => [0, "le"], "\x06" => [0, "li"], "\x07" => [0, "lo"], "\x08" => [0, "ls"], "\t" => [0, "lt"], "\n" => [73, "l"], "\v" => [88, "l"], "\f" => [89, "l"], "\r" => [96, "l"], "\x0e" => [97, "l"], "\x0f" => [99, "l"], "\x10" => [106, "l"], "\x11" => [136, "l"], "\x12" => [139, "l"], "\x13" => [141, "l"], "\x14" => [145, "l"], "\x15" => [147, "l"], "\x16" => [149, "l"], "\x17" => [101, "l"], "\x18" => [112, "l"], "\x19" => [117, "l"], "\x1a" => [120, "l"], "\x1b" => [124, "l"], "\x1c" => [127, "l"], "\x1d" => [144, "l"], "\x1e" => [152, "l"], "\x1f" => [11, "l"], " " => [0, "m0"], "!" => [0, "m1"], "\"" => [0, "m2"], "#" => [0, "ma"], "\$" => [0, "mc"], "%" => [0, "me"], "&" => [0, "mi"], "'" => [0, "mo"], "(" => [0, "ms"], ")" => [0, "mt"], "*" => [73, "m"], "+" => [88, "m"], "," => [89, "m"], "-" => [96, "m"], "." => [97, "m"], "/" => [99, "m"], [106, "m"], [136, "m"], [139, "m"], [141, "m"], [145, "m"], [147, "m"], [149, "m"], [101, "m"], [112, "m"], [117, "m"], ":" => [120, "m"], ";" => [124, "m"], "<" => [127, "m"], "=" => [144, "m"], ">" => [152, "m"], "?" => [11, "m"], "@" => [0, "n0"], "A" => [0, "n1"], "B" => [0, "n2"], "C" => [0, "na"], "D" => [0, "nc"], "E" => [0, "ne"], "F" => [0, "ni"], "G" => [0, "no"], "H" => [0, "ns"], "I" => [0, "nt"], "J" => [73, "n"], "K" => [88, "n"], "L" => [89, "n"], "M" => [96, "n"], "N" => [97, "n"], "O" => [99, "n"], "P" => [106, "n"], "Q" => [136, "n"], "R" => [139, "n"], "S" => [141, "n"], "T" => [145, "n"], "U" => [147, "n"], "V" => [149, "n"], "W" => [101, "n"], "X" => [112, "n"], "Y" => [117, "n"], "Z" => [120, "n"], "[" => [124, "n"], "\\" => [127, "n"], "]" => [144, "n"], "^" => [152, "n"], "_" => [11, "n"], "`" => [0, "p0"], "a" => [0, "p1"], "b" => [0, "p2"], "c" => [0, "pa"], "d" => [0, "pc"], "e" => [0, "pe"], "f" => [0, "pi"], "g" => [0, "po"], "h" => [0, "ps"], "i" => [0, "pt"], "j" => [73, "p"], "k" => [88, "p"], "l" => [89, "p"], "m" => [96, "p"], "n" => [97, "p"], "o" => [99, "p"], "p" => [106, "p"], "q" => [136, "p"], "r" => [139, "p"], "s" => [141, "p"], "t" => [145, "p"], "u" => [147, "p"], "v" => [149, "p"], "w" => [101, "p"], "x" => [112, "p"], "y" => [117, "p"], "z" => [120, "p"], "{" => [124, "p"], "|" => [127, "p"], "}" => [144, "p"], "~" => [152, "p"], "" => [11, "p"], "\x80" => [0, "r0"], "\x81" => [0, "r1"], "\x82" => [0, "r2"], "\x83" => [0, "ra"], "\x84" => [0, "rc"], "\x85" => [0, "re"], "\x86" => [0, "ri"], "\x87" => [0, "ro"], "\x88" => [0, "rs"], "\x89" => [0, "rt"], "\x8a" => [73, "r"], "\x8b" => [88, "r"], "\x8c" => [89, "r"], "\x8d" => [96, "r"], "\x8e" => [97, "r"], "\x8f" => [99, "r"], "\x90" => [106, "r"], "\x91" => [136, "r"], "\x92" => [139, "r"], "\x93" => [141, "r"], "\x94" => [145, "r"], "\x95" => [147, "r"], "\x96" => [149, "r"], "\x97" => [101, "r"], "\x98" => [112, "r"], "\x99" => [117, "r"], "\x9a" => [120, "r"], "\x9b" => [124, "r"], "\x9c" => [127, "r"], "\x9d" => [144, "r"], "\x9e" => [152, "r"], "\x9f" => [11, "r"], "\xa0" => [0, "u0"], "\xa1" => [0, "u1"], "\xa2" => [0, "u2"], "\xa3" => [0, "ua"], "\xa4" => [0, "uc"], "\xa5" => [0, "ue"], "\xa6" => [0, "ui"], "\xa7" => [0, "uo"], "\xa8" => [0, "us"], "\xa9" => [0, "ut"], "\xaa" => [73, "u"], "\xab" => [88, "u"], "\xac" => [89, "u"], "\xad" => [96, "u"], "\xae" => [97, "u"], "\xaf" => [99, "u"], "\xb0" => [106, "u"], "\xb1" => [136, "u"], "\xb2" => [139, "u"], "\xb3" => [141, "u"], "\xb4" => [145, "u"], "\xb5" => [147, "u"], "\xb6" => [149, "u"], "\xb7" => [101, "u"], "\xb8" => [112, "u"], "\xb9" => [117, "u"], "\xba" => [120, "u"], "\xbb" => [124, "u"], "\xbc" => [127, "u"], "\xbd" => [144, "u"], "\xbe" => [152, "u"], "\xbf" => [11, "u"], "\xc0" => [92, ":"], "\xc1" => [95, ":"], "\xc2" => [137, ":"], "\xc3" => [142, ":"], "\xc4" => [150, ":"], "\xc5" => [74, ":"], "\xc6" => [90, ":"], "\xc7" => [98, ":"], "\xc8" => [107, ":"], "\xc9" => [140, ":"], "\xca" => [146, ":"], "\xcb" => [102, ":"], "\xcc" => [113, ":"], "\xcd" => [121, ":"], "\xce" => [128, ":"], "\xcf" => [12, ":"], "\xd0" => [92, "B"], "\xd1" => [95, "B"], "\xd2" => [137, "B"], "\xd3" => [142, "B"], "\xd4" => [150, "B"], "\xd5" => [74, "B"], "\xd6" => [90, "B"], "\xd7" => [98, "B"], "\xd8" => [107, "B"], "\xd9" => [140, "B"], "\xda" => [146, "B"], "\xdb" => [102, "B"], "\xdc" => [113, "B"], "\xdd" => [121, "B"], "\xde" => [128, "B"], "\xdf" => [12, "B"], "\xe0" => [92, "C"], "\xe1" => [95, "C"], "\xe2" => [137, "C"], "\xe3" => [142, "C"], "\xe4" => [150, "C"], "\xe5" => [74, "C"], "\xe6" => [90, "C"], "\xe7" => [98, "C"], "\xe8" => [107, "C"], "\xe9" => [140, "C"], "\xea" => [146, "C"], "\xeb" => [102, "C"], "\xec" => [113, "C"], "\xed" => [121, "C"], "\xee" => [128, "C"], "\xef" => [12, "C"], "\xf0" => [92, "D"], "\xf1" => [95, "D"], "\xf2" => [137, "D"], "\xf3" => [142, "D"], "\xf4" => [150, "D"], "\xf5" => [74, "D"], "\xf6" => [90, "D"], "\xf7" => [98, "D"], "\xf8" => [107, "D"], "\xf9" => [140, "D"], "\xfa" => [146, "D"], "\xfb" => [102, "D"], "\xfc" => [113, "D"], "\xfd" => [121, "D"], "\xfe" => [128, "D"], "\xff" => [12, "D"]], ["\x00" => [92, "="], "\x01" => [95, "="], "\x02" => [137, "="], "\x03" => [142, "="], "\x04" => [150, "="], "\x05" => [74, "="], "\x06" => [90, "="], "\x07" => [98, "="], "\x08" => [107, "="], "\t" => [140, "="], "\n" => [146, "="], "\v" => [102, "="], "\f" => [113, "="], "\r" => [121, "="], "\x0e" => [128, "="], "\x0f" => [12, "="], "\x10" => [92, "A"], "\x11" => [95, "A"], "\x12" => [137, "A"], "\x13" => [142, "A"], "\x14" => [150, "A"], "\x15" => [74, "A"], "\x16" => [90, "A"], "\x17" => [98, "A"], "\x18" => [107, "A"], "\x19" => [140, "A"], "\x1a" => [146, "A"], "\x1b" => [102, "A"], "\x1c" => [113, "A"], "\x1d" => [121, "A"], "\x1e" => [128, "A"], "\x1f" => [12, "A"], " " => [92, "_"], "!" => [95, "_"], "\"" => [137, "_"], "#" => [142, "_"], "\$" => [150, "_"], "%" => [74, "_"], "&" => [90, "_"], "'" => [98, "_"], "(" => [107, "_"], ")" => [140, "_"], "*" => [146, "_"], "+" => [102, "_"], "," => [113, "_"], "-" => [121, "_"], "." => [128, "_"], "/" => [12, "_"], [92, "b"], [95, "b"], [137, "b"], [142, "b"], [150, "b"], [74, "b"], [90, "b"], [98, "b"], [107, "b"], [140, "b"], ":" => [146, "b"], ";" => [102, "b"], "<" => [113, "b"], "=" => [121, "b"], ">" => [128, "b"], "?" => [12, "b"], "@" => [92, "d"], "A" => [95, "d"], "B" => [137, "d"], "C" => [142, "d"], "D" => [150, "d"], "E" => [74, "d"], "F" => [90, "d"], "G" => [98, "d"], "H" => [107, "d"], "I" => [140, "d"], "J" => [146, "d"], "K" => [102, "d"], "L" => [113, "d"], "M" => [121, "d"], "N" => [128, "d"], "O" => [12, "d"], "P" => [92, "f"], "Q" => [95, "f"], "R" => [137, "f"], "S" => [142, "f"], "T" => [150, "f"], "U" => [74, "f"], "V" => [90, "f"], "W" => [98, "f"], "X" => [107, "f"], "Y" => [140, "f"], "Z" => [146, "f"], "[" => [102, "f"], "\\" => [113, "f"], "]" => [121, "f"], "^" => [128, "f"], "_" => [12, "f"], "`" => [92, "g"], "a" => [95, "g"], "b" => [137, "g"], "c" => [142, "g"], "d" => [150, "g"], "e" => [74, "g"], "f" => [90, "g"], "g" => [98, "g"], "h" => [107, "g"], "i" => [140, "g"], "j" => [146, "g"], "k" => [102, "g"], "l" => [113, "g"], "m" => [121, "g"], "n" => [128, "g"], "o" => [12, "g"], "p" => [92, "h"], "q" => [95, "h"], "r" => [137, "h"], "s" => [142, "h"], "t" => [150, "h"], "u" => [74, "h"], "v" => [90, "h"], "w" => [98, "h"], "x" => [107, "h"], "y" => [140, "h"], "z" => [146, "h"], "{" => [102, "h"], "|" => [113, "h"], "}" => [121, "h"], "~" => [128, "h"], "" => [12, "h"], "\x80" => [92, "l"], "\x81" => [95, "l"], "\x82" => [137, "l"], "\x83" => [142, "l"], "\x84" => [150, "l"], "\x85" => [74, "l"], "\x86" => [90, "l"], "\x87" => [98, "l"], "\x88" => [107, "l"], "\x89" => [140, "l"], "\x8a" => [146, "l"], "\x8b" => [102, "l"], "\x8c" => [113, "l"], "\x8d" => [121, "l"], "\x8e" => [128, "l"], "\x8f" => [12, "l"], "\x90" => [92, "m"], "\x91" => [95, "m"], "\x92" => [137, "m"], "\x93" => [142, "m"], "\x94" => [150, "m"], "\x95" => [74, "m"], "\x96" => [90, "m"], "\x97" => [98, "m"], "\x98" => [107, "m"], "\x99" => [140, "m"], "\x9a" => [146, "m"], "\x9b" => [102, "m"], "\x9c" => [113, "m"], "\x9d" => [121, "m"], "\x9e" => [128, "m"], "\x9f" => [12, "m"], "\xa0" => [92, "n"], "\xa1" => [95, "n"], "\xa2" => [137, "n"], "\xa3" => [142, "n"], "\xa4" => [150, "n"], "\xa5" => [74, "n"], "\xa6" => [90, "n"], "\xa7" => [98, "n"], "\xa8" => [107, "n"], "\xa9" => [140, "n"], "\xaa" => [146, "n"], "\xab" => [102, "n"], "\xac" => [113, "n"], "\xad" => [121, "n"], "\xae" => [128, "n"], "\xaf" => [12, "n"], "\xb0" => [92, "p"], "\xb1" => [95, "p"], "\xb2" => [137, "p"], "\xb3" => [142, "p"], "\xb4" => [150, "p"], "\xb5" => [74, "p"], "\xb6" => [90, "p"], "\xb7" => [98, "p"], "\xb8" => [107, "p"], "\xb9" => [140, "p"], "\xba" => [146, "p"], "\xbb" => [102, "p"], "\xbc" => [113, "p"], "\xbd" => [121, "p"], "\xbe" => [128, "p"], "\xbf" => [12, "p"], "\xc0" => [92, "r"], "\xc1" => [95, "r"], "\xc2" => [137, "r"], "\xc3" => [142, "r"], "\xc4" => [150, "r"], "\xc5" => [74, "r"], "\xc6" => [90, "r"], "\xc7" => [98, "r"], "\xc8" => [107, "r"], "\xc9" => [140, "r"], "\xca" => [146, "r"], "\xcb" => [102, "r"], "\xcc" => [113, "r"], "\xcd" => [121, "r"], "\xce" => [128, "r"], "\xcf" => [12, "r"], "\xd0" => [92, "u"], "\xd1" => [95, "u"], "\xd2" => [137, "u"], "\xd3" => [142, "u"], "\xd4" => [150, "u"], "\xd5" => [74, "u"], "\xd6" => [90, "u"], "\xd7" => [98, "u"], "\xd8" => [107, "u"], "\xd9" => [140, "u"], "\xda" => [146, "u"], "\xdb" => [102, "u"], "\xdc" => [113, "u"], "\xdd" => [121, "u"], "\xde" => [128, "u"], "\xdf" => [12, "u"], "\xe0" => [93, ":"], "\xe1" => [138, ":"], "\xe2" => [75, ":"], "\xe3" => [91, ":"], "\xe4" => [108, ":"], "\xe5" => [103, ":"], "\xe6" => [114, ":"], "\xe7" => [14, ":"], "\xe8" => [93, "B"], "\xe9" => [138, "B"], "\xea" => [75, "B"], "\xeb" => [91, "B"], "\xec" => [108, "B"], "\xed" => [103, "B"], "\xee" => [114, "B"], "\xef" => [14, "B"], "\xf0" => [93, "C"], "\xf1" => [138, "C"], "\xf2" => [75, "C"], "\xf3" => [91, "C"], "\xf4" => [108, "C"], "\xf5" => [103, "C"], "\xf6" => [114, "C"], "\xf7" => [14, "C"], "\xf8" => [93, "D"], "\xf9" => [138, "D"], "\xfa" => [75, "D"], "\xfb" => [91, "D"], "\xfc" => [108, "D"], "\xfd" => [103, "D"], "\xfe" => [114, "D"], "\xff" => [14, "D"]], ["\x00" => [94, "<0"], "\x01" => [76, "<0"], "\x02" => [104, "<0"], "\x03" => [16, "<0"], "\x04" => [94, "<1"], "\x05" => [76, "<1"], "\x06" => [104, "<1"], "\x07" => [16, "<1"], "\x08" => [94, "<2"], "\t" => [76, "<2"], "\n" => [104, "<2"], "\v" => [16, "<2"], "\f" => [94, " [76, " [104, " [16, " [94, " [76, " [104, " [16, " [94, " [76, " [104, " [16, " [94, " [76, " [104, " [16, " [94, " [76, " [104, " [16, " [94, " [76, " [104, " [16, " [94, " [76, " [104, " [16, " [77, "< "], ")" => [18, "< "], "*" => [77, "<%"], "+" => [18, "<%"], "," => [77, "<-"], "-" => [18, "<-"], "." => [77, "<."], "/" => [18, "<."], [77, " [77, "<7"], ";" => [18, "<7"], "<" => [77, "<8"], "=" => [18, "<8"], ">" => [77, "<9"], "?" => [18, "<9"], "@" => [77, "<="], "A" => [18, "<="], "B" => [77, " [18, " [77, "<_"], "E" => [18, "<_"], "F" => [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [77, " [18, " [0, "<:"], "]" => [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [0, " [82, "<"], "}" => [87, "<"], "~" => [130, "<"], "" => [9, "<"], "\x80" => [94, "`0"], "\x81" => [76, "`0"], "\x82" => [104, "`0"], "\x83" => [16, "`0"], "\x84" => [94, "`1"], "\x85" => [76, "`1"], "\x86" => [104, "`1"], "\x87" => [16, "`1"], "\x88" => [94, "`2"], "\x89" => [76, "`2"], "\x8a" => [104, "`2"], "\x8b" => [16, "`2"], "\x8c" => [94, "`a"], "\x8d" => [76, "`a"], "\x8e" => [104, "`a"], "\x8f" => [16, "`a"], "\x90" => [94, "`c"], "\x91" => [76, "`c"], "\x92" => [104, "`c"], "\x93" => [16, "`c"], "\x94" => [94, "`e"], "\x95" => [76, "`e"], "\x96" => [104, "`e"], "\x97" => [16, "`e"], "\x98" => [94, "`i"], "\x99" => [76, "`i"], "\x9a" => [104, "`i"], "\x9b" => [16, "`i"], "\x9c" => [94, "`o"], "\x9d" => [76, "`o"], "\x9e" => [104, "`o"], "\x9f" => [16, "`o"], "\xa0" => [94, "`s"], "\xa1" => [76, "`s"], "\xa2" => [104, "`s"], "\xa3" => [16, "`s"], "\xa4" => [94, "`t"], "\xa5" => [76, "`t"], "\xa6" => [104, "`t"], "\xa7" => [16, "`t"], "\xa8" => [77, "` "], "\xa9" => [18, "` "], "\xaa" => [77, "`%"], "\xab" => [18, "`%"], "\xac" => [77, "`-"], "\xad" => [18, "`-"], "\xae" => [77, "`."], "\xaf" => [18, "`."], "\xb0" => [77, "`/"], "\xb1" => [18, "`/"], "\xb2" => [77, "`3"], "\xb3" => [18, "`3"], "\xb4" => [77, "`4"], "\xb5" => [18, "`4"], "\xb6" => [77, "`5"], "\xb7" => [18, "`5"], "\xb8" => [77, "`6"], "\xb9" => [18, "`6"], "\xba" => [77, "`7"], "\xbb" => [18, "`7"], "\xbc" => [77, "`8"], "\xbd" => [18, "`8"], "\xbe" => [77, "`9"], "\xbf" => [18, "`9"], "\xc0" => [77, "`="], "\xc1" => [18, "`="], "\xc2" => [77, "`A"], "\xc3" => [18, "`A"], "\xc4" => [77, "`_"], "\xc5" => [18, "`_"], "\xc6" => [77, "`b"], "\xc7" => [18, "`b"], "\xc8" => [77, "`d"], "\xc9" => [18, "`d"], "\xca" => [77, "`f"], "\xcb" => [18, "`f"], "\xcc" => [77, "`g"], "\xcd" => [18, "`g"], "\xce" => [77, "`h"], "\xcf" => [18, "`h"], "\xd0" => [77, "`l"], "\xd1" => [18, "`l"], "\xd2" => [77, "`m"], "\xd3" => [18, "`m"], "\xd4" => [77, "`n"], "\xd5" => [18, "`n"], "\xd6" => [77, "`p"], "\xd7" => [18, "`p"], "\xd8" => [77, "`r"], "\xd9" => [18, "`r"], "\xda" => [77, "`u"], "\xdb" => [18, "`u"], "\xdc" => [0, "`:"], "\xdd" => [0, "`B"], "\xde" => [0, "`C"], "\xdf" => [0, "`D"], "\xe0" => [0, "`E"], "\xe1" => [0, "`F"], "\xe2" => [0, "`G"], "\xe3" => [0, "`H"], "\xe4" => [0, "`I"], "\xe5" => [0, "`J"], "\xe6" => [0, "`K"], "\xe7" => [0, "`L"], "\xe8" => [0, "`M"], "\xe9" => [0, "`N"], "\xea" => [0, "`O"], "\xeb" => [0, "`P"], "\xec" => [0, "`Q"], "\xed" => [0, "`R"], "\xee" => [0, "`S"], "\xef" => [0, "`T"], "\xf0" => [0, "`U"], "\xf1" => [0, "`V"], "\xf2" => [0, "`W"], "\xf3" => [0, "`Y"], "\xf4" => [0, "`j"], "\xf5" => [0, "`k"], "\xf6" => [0, "`q"], "\xf7" => [0, "`v"], "\xf8" => [0, "`w"], "\xf9" => [0, "`x"], "\xfa" => [0, "`y"], "\xfb" => [0, "`z"], "\xfc" => [82, "`"], "\xfd" => [87, "`"], "\xfe" => [130, "`"], "\xff" => [9, "`"]], ["\x00" => [94, "=0"], "\x01" => [76, "=0"], "\x02" => [104, "=0"], "\x03" => [16, "=0"], "\x04" => [94, "=1"], "\x05" => [76, "=1"], "\x06" => [104, "=1"], "\x07" => [16, "=1"], "\x08" => [94, "=2"], "\t" => [76, "=2"], "\n" => [104, "=2"], "\v" => [16, "=2"], "\f" => [94, "=a"], "\r" => [76, "=a"], "\x0e" => [104, "=a"], "\x0f" => [16, "=a"], "\x10" => [94, "=c"], "\x11" => [76, "=c"], "\x12" => [104, "=c"], "\x13" => [16, "=c"], "\x14" => [94, "=e"], "\x15" => [76, "=e"], "\x16" => [104, "=e"], "\x17" => [16, "=e"], "\x18" => [94, "=i"], "\x19" => [76, "=i"], "\x1a" => [104, "=i"], "\x1b" => [16, "=i"], "\x1c" => [94, "=o"], "\x1d" => [76, "=o"], "\x1e" => [104, "=o"], "\x1f" => [16, "=o"], " " => [94, "=s"], "!" => [76, "=s"], "\"" => [104, "=s"], "#" => [16, "=s"], "\$" => [94, "=t"], "%" => [76, "=t"], "&" => [104, "=t"], "'" => [16, "=t"], "(" => [77, "= "], ")" => [18, "= "], "*" => [77, "=%"], "+" => [18, "=%"], "," => [77, "=-"], "-" => [18, "=-"], "." => [77, "=."], "/" => [18, "=."], [77, "=/"], [18, "=/"], [77, "=3"], [18, "=3"], [77, "=4"], [18, "=4"], [77, "=5"], [18, "=5"], [77, "=6"], [18, "=6"], ":" => [77, "=7"], ";" => [18, "=7"], "<" => [77, "=8"], "=" => [18, "=8"], ">" => [77, "=9"], "?" => [18, "=9"], "@" => [77, "=="], "A" => [18, "=="], "B" => [77, "=A"], "C" => [18, "=A"], "D" => [77, "=_"], "E" => [18, "=_"], "F" => [77, "=b"], "G" => [18, "=b"], "H" => [77, "=d"], "I" => [18, "=d"], "J" => [77, "=f"], "K" => [18, "=f"], "L" => [77, "=g"], "M" => [18, "=g"], "N" => [77, "=h"], "O" => [18, "=h"], "P" => [77, "=l"], "Q" => [18, "=l"], "R" => [77, "=m"], "S" => [18, "=m"], "T" => [77, "=n"], "U" => [18, "=n"], "V" => [77, "=p"], "W" => [18, "=p"], "X" => [77, "=r"], "Y" => [18, "=r"], "Z" => [77, "=u"], "[" => [18, "=u"], "\\" => [0, "=:"], "]" => [0, "=B"], "^" => [0, "=C"], "_" => [0, "=D"], "`" => [0, "=E"], "a" => [0, "=F"], "b" => [0, "=G"], "c" => [0, "=H"], "d" => [0, "=I"], "e" => [0, "=J"], "f" => [0, "=K"], "g" => [0, "=L"], "h" => [0, "=M"], "i" => [0, "=N"], "j" => [0, "=O"], "k" => [0, "=P"], "l" => [0, "=Q"], "m" => [0, "=R"], "n" => [0, "=S"], "o" => [0, "=T"], "p" => [0, "=U"], "q" => [0, "=V"], "r" => [0, "=W"], "s" => [0, "=Y"], "t" => [0, "=j"], "u" => [0, "=k"], "v" => [0, "=q"], "w" => [0, "=v"], "x" => [0, "=w"], "y" => [0, "=x"], "z" => [0, "=y"], "{" => [0, "=z"], "|" => [82, "="], "}" => [87, "="], "~" => [130, "="], "" => [9, "="], "\x80" => [94, "A0"], "\x81" => [76, "A0"], "\x82" => [104, "A0"], "\x83" => [16, "A0"], "\x84" => [94, "A1"], "\x85" => [76, "A1"], "\x86" => [104, "A1"], "\x87" => [16, "A1"], "\x88" => [94, "A2"], "\x89" => [76, "A2"], "\x8a" => [104, "A2"], "\x8b" => [16, "A2"], "\x8c" => [94, "Aa"], "\x8d" => [76, "Aa"], "\x8e" => [104, "Aa"], "\x8f" => [16, "Aa"], "\x90" => [94, "Ac"], "\x91" => [76, "Ac"], "\x92" => [104, "Ac"], "\x93" => [16, "Ac"], "\x94" => [94, "Ae"], "\x95" => [76, "Ae"], "\x96" => [104, "Ae"], "\x97" => [16, "Ae"], "\x98" => [94, "Ai"], "\x99" => [76, "Ai"], "\x9a" => [104, "Ai"], "\x9b" => [16, "Ai"], "\x9c" => [94, "Ao"], "\x9d" => [76, "Ao"], "\x9e" => [104, "Ao"], "\x9f" => [16, "Ao"], "\xa0" => [94, "As"], "\xa1" => [76, "As"], "\xa2" => [104, "As"], "\xa3" => [16, "As"], "\xa4" => [94, "At"], "\xa5" => [76, "At"], "\xa6" => [104, "At"], "\xa7" => [16, "At"], "\xa8" => [77, "A "], "\xa9" => [18, "A "], "\xaa" => [77, "A%"], "\xab" => [18, "A%"], "\xac" => [77, "A-"], "\xad" => [18, "A-"], "\xae" => [77, "A."], "\xaf" => [18, "A."], "\xb0" => [77, "A/"], "\xb1" => [18, "A/"], "\xb2" => [77, "A3"], "\xb3" => [18, "A3"], "\xb4" => [77, "A4"], "\xb5" => [18, "A4"], "\xb6" => [77, "A5"], "\xb7" => [18, "A5"], "\xb8" => [77, "A6"], "\xb9" => [18, "A6"], "\xba" => [77, "A7"], "\xbb" => [18, "A7"], "\xbc" => [77, "A8"], "\xbd" => [18, "A8"], "\xbe" => [77, "A9"], "\xbf" => [18, "A9"], "\xc0" => [77, "A="], "\xc1" => [18, "A="], "\xc2" => [77, "AA"], "\xc3" => [18, "AA"], "\xc4" => [77, "A_"], "\xc5" => [18, "A_"], "\xc6" => [77, "Ab"], "\xc7" => [18, "Ab"], "\xc8" => [77, "Ad"], "\xc9" => [18, "Ad"], "\xca" => [77, "Af"], "\xcb" => [18, "Af"], "\xcc" => [77, "Ag"], "\xcd" => [18, "Ag"], "\xce" => [77, "Ah"], "\xcf" => [18, "Ah"], "\xd0" => [77, "Al"], "\xd1" => [18, "Al"], "\xd2" => [77, "Am"], "\xd3" => [18, "Am"], "\xd4" => [77, "An"], "\xd5" => [18, "An"], "\xd6" => [77, "Ap"], "\xd7" => [18, "Ap"], "\xd8" => [77, "Ar"], "\xd9" => [18, "Ar"], "\xda" => [77, "Au"], "\xdb" => [18, "Au"], "\xdc" => [0, "A:"], "\xdd" => [0, "AB"], "\xde" => [0, "AC"], "\xdf" => [0, "AD"], "\xe0" => [0, "AE"], "\xe1" => [0, "AF"], "\xe2" => [0, "AG"], "\xe3" => [0, "AH"], "\xe4" => [0, "AI"], "\xe5" => [0, "AJ"], "\xe6" => [0, "AK"], "\xe7" => [0, "AL"], "\xe8" => [0, "AM"], "\xe9" => [0, "AN"], "\xea" => [0, "AO"], "\xeb" => [0, "AP"], "\xec" => [0, "AQ"], "\xed" => [0, "AR"], "\xee" => [0, "AS"], "\xef" => [0, "AT"], "\xf0" => [0, "AU"], "\xf1" => [0, "AV"], "\xf2" => [0, "AW"], "\xf3" => [0, "AY"], "\xf4" => [0, "Aj"], "\xf5" => [0, "Ak"], "\xf6" => [0, "Aq"], "\xf7" => [0, "Av"], "\xf8" => [0, "Aw"], "\xf9" => [0, "Ax"], "\xfa" => [0, "Ay"], "\xfb" => [0, "Az"], "\xfc" => [82, "A"], "\xfd" => [87, "A"], "\xfe" => [130, "A"], "\xff" => [9, "A"]], ["\x00" => [77, "=0"], "\x01" => [18, "=0"], "\x02" => [77, "=1"], "\x03" => [18, "=1"], "\x04" => [77, "=2"], "\x05" => [18, "=2"], "\x06" => [77, "=a"], "\x07" => [18, "=a"], "\x08" => [77, "=c"], "\t" => [18, "=c"], "\n" => [77, "=e"], "\v" => [18, "=e"], "\f" => [77, "=i"], "\r" => [18, "=i"], "\x0e" => [77, "=o"], "\x0f" => [18, "=o"], "\x10" => [77, "=s"], "\x11" => [18, "=s"], "\x12" => [77, "=t"], "\x13" => [18, "=t"], "\x14" => [0, "= "], "\x15" => [0, "=%"], "\x16" => [0, "=-"], "\x17" => [0, "=."], "\x18" => [0, "=/"], "\x19" => [0, "=3"], "\x1a" => [0, "=4"], "\x1b" => [0, "=5"], "\x1c" => [0, "=6"], "\x1d" => [0, "=7"], "\x1e" => [0, "=8"], "\x1f" => [0, "=9"], " " => [0, "=="], "!" => [0, "=A"], "\"" => [0, "=_"], "#" => [0, "=b"], "\$" => [0, "=d"], "%" => [0, "=f"], "&" => [0, "=g"], "'" => [0, "=h"], "(" => [0, "=l"], ")" => [0, "=m"], "*" => [0, "=n"], "+" => [0, "=p"], "," => [0, "=r"], "-" => [0, "=u"], "." => [100, "="], "/" => [110, "="], [111, "="], [115, "="], [116, "="], [118, "="], [119, "="], [122, "="], [123, "="], [125, "="], [126, "="], [129, "="], ":" => [143, "="], ";" => [148, "="], "<" => [151, "="], "=" => [153, "="], ">" => [83, "="], "?" => [10, "="], "@" => [77, "A0"], "A" => [18, "A0"], "B" => [77, "A1"], "C" => [18, "A1"], "D" => [77, "A2"], "E" => [18, "A2"], "F" => [77, "Aa"], "G" => [18, "Aa"], "H" => [77, "Ac"], "I" => [18, "Ac"], "J" => [77, "Ae"], "K" => [18, "Ae"], "L" => [77, "Ai"], "M" => [18, "Ai"], "N" => [77, "Ao"], "O" => [18, "Ao"], "P" => [77, "As"], "Q" => [18, "As"], "R" => [77, "At"], "S" => [18, "At"], "T" => [0, "A "], "U" => [0, "A%"], "V" => [0, "A-"], "W" => [0, "A."], "X" => [0, "A/"], "Y" => [0, "A3"], "Z" => [0, "A4"], "[" => [0, "A5"], "\\" => [0, "A6"], "]" => [0, "A7"], "^" => [0, "A8"], "_" => [0, "A9"], "`" => [0, "A="], "a" => [0, "AA"], "b" => [0, "A_"], "c" => [0, "Ab"], "d" => [0, "Ad"], "e" => [0, "Af"], "f" => [0, "Ag"], "g" => [0, "Ah"], "h" => [0, "Al"], "i" => [0, "Am"], "j" => [0, "An"], "k" => [0, "Ap"], "l" => [0, "Ar"], "m" => [0, "Au"], "n" => [100, "A"], "o" => [110, "A"], "p" => [111, "A"], "q" => [115, "A"], "r" => [116, "A"], "s" => [118, "A"], "t" => [119, "A"], "u" => [122, "A"], "v" => [123, "A"], "w" => [125, "A"], "x" => [126, "A"], "y" => [129, "A"], "z" => [143, "A"], "{" => [148, "A"], "|" => [151, "A"], "}" => [153, "A"], "~" => [83, "A"], "" => [10, "A"], "\x80" => [77, "_0"], "\x81" => [18, "_0"], "\x82" => [77, "_1"], "\x83" => [18, "_1"], "\x84" => [77, "_2"], "\x85" => [18, "_2"], "\x86" => [77, "_a"], "\x87" => [18, "_a"], "\x88" => [77, "_c"], "\x89" => [18, "_c"], "\x8a" => [77, "_e"], "\x8b" => [18, "_e"], "\x8c" => [77, "_i"], "\x8d" => [18, "_i"], "\x8e" => [77, "_o"], "\x8f" => [18, "_o"], "\x90" => [77, "_s"], "\x91" => [18, "_s"], "\x92" => [77, "_t"], "\x93" => [18, "_t"], "\x94" => [0, "_ "], "\x95" => [0, "_%"], "\x96" => [0, "_-"], "\x97" => [0, "_."], "\x98" => [0, "_/"], "\x99" => [0, "_3"], "\x9a" => [0, "_4"], "\x9b" => [0, "_5"], "\x9c" => [0, "_6"], "\x9d" => [0, "_7"], "\x9e" => [0, "_8"], "\x9f" => [0, "_9"], "\xa0" => [0, "_="], "\xa1" => [0, "_A"], "\xa2" => [0, "__"], "\xa3" => [0, "_b"], "\xa4" => [0, "_d"], "\xa5" => [0, "_f"], "\xa6" => [0, "_g"], "\xa7" => [0, "_h"], "\xa8" => [0, "_l"], "\xa9" => [0, "_m"], "\xaa" => [0, "_n"], "\xab" => [0, "_p"], "\xac" => [0, "_r"], "\xad" => [0, "_u"], "\xae" => [100, "_"], "\xaf" => [110, "_"], "\xb0" => [111, "_"], "\xb1" => [115, "_"], "\xb2" => [116, "_"], "\xb3" => [118, "_"], "\xb4" => [119, "_"], "\xb5" => [122, "_"], "\xb6" => [123, "_"], "\xb7" => [125, "_"], "\xb8" => [126, "_"], "\xb9" => [129, "_"], "\xba" => [143, "_"], "\xbb" => [148, "_"], "\xbc" => [151, "_"], "\xbd" => [153, "_"], "\xbe" => [83, "_"], "\xbf" => [10, "_"], "\xc0" => [77, "b0"], "\xc1" => [18, "b0"], "\xc2" => [77, "b1"], "\xc3" => [18, "b1"], "\xc4" => [77, "b2"], "\xc5" => [18, "b2"], "\xc6" => [77, "ba"], "\xc7" => [18, "ba"], "\xc8" => [77, "bc"], "\xc9" => [18, "bc"], "\xca" => [77, "be"], "\xcb" => [18, "be"], "\xcc" => [77, "bi"], "\xcd" => [18, "bi"], "\xce" => [77, "bo"], "\xcf" => [18, "bo"], "\xd0" => [77, "bs"], "\xd1" => [18, "bs"], "\xd2" => [77, "bt"], "\xd3" => [18, "bt"], "\xd4" => [0, "b "], "\xd5" => [0, "b%"], "\xd6" => [0, "b-"], "\xd7" => [0, "b."], "\xd8" => [0, "b/"], "\xd9" => [0, "b3"], "\xda" => [0, "b4"], "\xdb" => [0, "b5"], "\xdc" => [0, "b6"], "\xdd" => [0, "b7"], "\xde" => [0, "b8"], "\xdf" => [0, "b9"], "\xe0" => [0, "b="], "\xe1" => [0, "bA"], "\xe2" => [0, "b_"], "\xe3" => [0, "bb"], "\xe4" => [0, "bd"], "\xe5" => [0, "bf"], "\xe6" => [0, "bg"], "\xe7" => [0, "bh"], "\xe8" => [0, "bl"], "\xe9" => [0, "bm"], "\xea" => [0, "bn"], "\xeb" => [0, "bp"], "\xec" => [0, "br"], "\xed" => [0, "bu"], "\xee" => [100, "b"], "\xef" => [110, "b"], "\xf0" => [111, "b"], "\xf1" => [115, "b"], "\xf2" => [116, "b"], "\xf3" => [118, "b"], "\xf4" => [119, "b"], "\xf5" => [122, "b"], "\xf6" => [123, "b"], "\xf7" => [125, "b"], "\xf8" => [126, "b"], "\xf9" => [129, "b"], "\xfa" => [143, "b"], "\xfb" => [148, "b"], "\xfc" => [151, "b"], "\xfd" => [153, "b"], "\xfe" => [83, "b"], "\xff" => [10, "b"]], ["\x00" => [0, "=0"], "\x01" => [0, "=1"], "\x02" => [0, "=2"], "\x03" => [0, "=a"], "\x04" => [0, "=c"], "\x05" => [0, "=e"], "\x06" => [0, "=i"], "\x07" => [0, "=o"], "\x08" => [0, "=s"], "\t" => [0, "=t"], "\n" => [73, "="], "\v" => [88, "="], "\f" => [89, "="], "\r" => [96, "="], "\x0e" => [97, "="], "\x0f" => [99, "="], "\x10" => [106, "="], "\x11" => [136, "="], "\x12" => [139, "="], "\x13" => [141, "="], "\x14" => [145, "="], "\x15" => [147, "="], "\x16" => [149, "="], "\x17" => [101, "="], "\x18" => [112, "="], "\x19" => [117, "="], "\x1a" => [120, "="], "\x1b" => [124, "="], "\x1c" => [127, "="], "\x1d" => [144, "="], "\x1e" => [152, "="], "\x1f" => [11, "="], " " => [0, "A0"], "!" => [0, "A1"], "\"" => [0, "A2"], "#" => [0, "Aa"], "\$" => [0, "Ac"], "%" => [0, "Ae"], "&" => [0, "Ai"], "'" => [0, "Ao"], "(" => [0, "As"], ")" => [0, "At"], "*" => [73, "A"], "+" => [88, "A"], "," => [89, "A"], "-" => [96, "A"], "." => [97, "A"], "/" => [99, "A"], [106, "A"], [136, "A"], [139, "A"], [141, "A"], [145, "A"], [147, "A"], [149, "A"], [101, "A"], [112, "A"], [117, "A"], ":" => [120, "A"], ";" => [124, "A"], "<" => [127, "A"], "=" => [144, "A"], ">" => [152, "A"], "?" => [11, "A"], "@" => [0, "_0"], "A" => [0, "_1"], "B" => [0, "_2"], "C" => [0, "_a"], "D" => [0, "_c"], "E" => [0, "_e"], "F" => [0, "_i"], "G" => [0, "_o"], "H" => [0, "_s"], "I" => [0, "_t"], "J" => [73, "_"], "K" => [88, "_"], "L" => [89, "_"], "M" => [96, "_"], "N" => [97, "_"], "O" => [99, "_"], "P" => [106, "_"], "Q" => [136, "_"], "R" => [139, "_"], "S" => [141, "_"], "T" => [145, "_"], "U" => [147, "_"], "V" => [149, "_"], "W" => [101, "_"], "X" => [112, "_"], "Y" => [117, "_"], "Z" => [120, "_"], "[" => [124, "_"], "\\" => [127, "_"], "]" => [144, "_"], "^" => [152, "_"], "_" => [11, "_"], "`" => [0, "b0"], "a" => [0, "b1"], "b" => [0, "b2"], "c" => [0, "ba"], "d" => [0, "bc"], "e" => [0, "be"], "f" => [0, "bi"], "g" => [0, "bo"], "h" => [0, "bs"], "i" => [0, "bt"], "j" => [73, "b"], "k" => [88, "b"], "l" => [89, "b"], "m" => [96, "b"], "n" => [97, "b"], "o" => [99, "b"], "p" => [106, "b"], "q" => [136, "b"], "r" => [139, "b"], "s" => [141, "b"], "t" => [145, "b"], "u" => [147, "b"], "v" => [149, "b"], "w" => [101, "b"], "x" => [112, "b"], "y" => [117, "b"], "z" => [120, "b"], "{" => [124, "b"], "|" => [127, "b"], "}" => [144, "b"], "~" => [152, "b"], "" => [11, "b"], "\x80" => [0, "d0"], "\x81" => [0, "d1"], "\x82" => [0, "d2"], "\x83" => [0, "da"], "\x84" => [0, "dc"], "\x85" => [0, "de"], "\x86" => [0, "di"], "\x87" => [0, "do"], "\x88" => [0, "ds"], "\x89" => [0, "dt"], "\x8a" => [73, "d"], "\x8b" => [88, "d"], "\x8c" => [89, "d"], "\x8d" => [96, "d"], "\x8e" => [97, "d"], "\x8f" => [99, "d"], "\x90" => [106, "d"], "\x91" => [136, "d"], "\x92" => [139, "d"], "\x93" => [141, "d"], "\x94" => [145, "d"], "\x95" => [147, "d"], "\x96" => [149, "d"], "\x97" => [101, "d"], "\x98" => [112, "d"], "\x99" => [117, "d"], "\x9a" => [120, "d"], "\x9b" => [124, "d"], "\x9c" => [127, "d"], "\x9d" => [144, "d"], "\x9e" => [152, "d"], "\x9f" => [11, "d"], "\xa0" => [0, "f0"], "\xa1" => [0, "f1"], "\xa2" => [0, "f2"], "\xa3" => [0, "fa"], "\xa4" => [0, "fc"], "\xa5" => [0, "fe"], "\xa6" => [0, "fi"], "\xa7" => [0, "fo"], "\xa8" => [0, "fs"], "\xa9" => [0, "ft"], "\xaa" => [73, "f"], "\xab" => [88, "f"], "\xac" => [89, "f"], "\xad" => [96, "f"], "\xae" => [97, "f"], "\xaf" => [99, "f"], "\xb0" => [106, "f"], "\xb1" => [136, "f"], "\xb2" => [139, "f"], "\xb3" => [141, "f"], "\xb4" => [145, "f"], "\xb5" => [147, "f"], "\xb6" => [149, "f"], "\xb7" => [101, "f"], "\xb8" => [112, "f"], "\xb9" => [117, "f"], "\xba" => [120, "f"], "\xbb" => [124, "f"], "\xbc" => [127, "f"], "\xbd" => [144, "f"], "\xbe" => [152, "f"], "\xbf" => [11, "f"], "\xc0" => [0, "g0"], "\xc1" => [0, "g1"], "\xc2" => [0, "g2"], "\xc3" => [0, "ga"], "\xc4" => [0, "gc"], "\xc5" => [0, "ge"], "\xc6" => [0, "gi"], "\xc7" => [0, "go"], "\xc8" => [0, "gs"], "\xc9" => [0, "gt"], "\xca" => [73, "g"], "\xcb" => [88, "g"], "\xcc" => [89, "g"], "\xcd" => [96, "g"], "\xce" => [97, "g"], "\xcf" => [99, "g"], "\xd0" => [106, "g"], "\xd1" => [136, "g"], "\xd2" => [139, "g"], "\xd3" => [141, "g"], "\xd4" => [145, "g"], "\xd5" => [147, "g"], "\xd6" => [149, "g"], "\xd7" => [101, "g"], "\xd8" => [112, "g"], "\xd9" => [117, "g"], "\xda" => [120, "g"], "\xdb" => [124, "g"], "\xdc" => [127, "g"], "\xdd" => [144, "g"], "\xde" => [152, "g"], "\xdf" => [11, "g"], "\xe0" => [0, "h0"], "\xe1" => [0, "h1"], "\xe2" => [0, "h2"], "\xe3" => [0, "ha"], "\xe4" => [0, "hc"], "\xe5" => [0, "he"], "\xe6" => [0, "hi"], "\xe7" => [0, "ho"], "\xe8" => [0, "hs"], "\xe9" => [0, "ht"], "\xea" => [73, "h"], "\xeb" => [88, "h"], "\xec" => [89, "h"], "\xed" => [96, "h"], "\xee" => [97, "h"], "\xef" => [99, "h"], "\xf0" => [106, "h"], "\xf1" => [136, "h"], "\xf2" => [139, "h"], "\xf3" => [141, "h"], "\xf4" => [145, "h"], "\xf5" => [147, "h"], "\xf6" => [149, "h"], "\xf7" => [101, "h"], "\xf8" => [112, "h"], "\xf9" => [117, "h"], "\xfa" => [120, "h"], "\xfb" => [124, "h"], "\xfc" => [127, "h"], "\xfd" => [144, "h"], "\xfe" => [152, "h"], "\xff" => [11, "h"]], ["\x00" => [94, "@0"], "\x01" => [76, "@0"], "\x02" => [104, "@0"], "\x03" => [16, "@0"], "\x04" => [94, "@1"], "\x05" => [76, "@1"], "\x06" => [104, "@1"], "\x07" => [16, "@1"], "\x08" => [94, "@2"], "\t" => [76, "@2"], "\n" => [104, "@2"], "\v" => [16, "@2"], "\f" => [94, "@a"], "\r" => [76, "@a"], "\x0e" => [104, "@a"], "\x0f" => [16, "@a"], "\x10" => [94, "@c"], "\x11" => [76, "@c"], "\x12" => [104, "@c"], "\x13" => [16, "@c"], "\x14" => [94, "@e"], "\x15" => [76, "@e"], "\x16" => [104, "@e"], "\x17" => [16, "@e"], "\x18" => [94, "@i"], "\x19" => [76, "@i"], "\x1a" => [104, "@i"], "\x1b" => [16, "@i"], "\x1c" => [94, "@o"], "\x1d" => [76, "@o"], "\x1e" => [104, "@o"], "\x1f" => [16, "@o"], " " => [94, "@s"], "!" => [76, "@s"], "\"" => [104, "@s"], "#" => [16, "@s"], "\$" => [94, "@t"], "%" => [76, "@t"], "&" => [104, "@t"], "'" => [16, "@t"], "(" => [77, "@ "], ")" => [18, "@ "], "*" => [77, "@%"], "+" => [18, "@%"], "," => [77, "@-"], "-" => [18, "@-"], "." => [77, "@."], "/" => [18, "@."], [77, "@/"], [18, "@/"], [77, "@3"], [18, "@3"], [77, "@4"], [18, "@4"], [77, "@5"], [18, "@5"], [77, "@6"], [18, "@6"], ":" => [77, "@7"], ";" => [18, "@7"], "<" => [77, "@8"], "=" => [18, "@8"], ">" => [77, "@9"], "?" => [18, "@9"], "@" => [77, "@="], "A" => [18, "@="], "B" => [77, "@A"], "C" => [18, "@A"], "D" => [77, "@_"], "E" => [18, "@_"], "F" => [77, "@b"], "G" => [18, "@b"], "H" => [77, "@d"], "I" => [18, "@d"], "J" => [77, "@f"], "K" => [18, "@f"], "L" => [77, "@g"], "M" => [18, "@g"], "N" => [77, "@h"], "O" => [18, "@h"], "P" => [77, "@l"], "Q" => [18, "@l"], "R" => [77, "@m"], "S" => [18, "@m"], "T" => [77, "@n"], "U" => [18, "@n"], "V" => [77, "@p"], "W" => [18, "@p"], "X" => [77, "@r"], "Y" => [18, "@r"], "Z" => [77, "@u"], "[" => [18, "@u"], "\\" => [0, "@:"], "]" => [0, "@B"], "^" => [0, "@C"], "_" => [0, "@D"], "`" => [0, "@E"], "a" => [0, "@F"], "b" => [0, "@G"], "c" => [0, "@H"], "d" => [0, "@I"], "e" => [0, "@J"], "f" => [0, "@K"], "g" => [0, "@L"], "h" => [0, "@M"], "i" => [0, "@N"], "j" => [0, "@O"], "k" => [0, "@P"], "l" => [0, "@Q"], "m" => [0, "@R"], "n" => [0, "@S"], "o" => [0, "@T"], "p" => [0, "@U"], "q" => [0, "@V"], "r" => [0, "@W"], "s" => [0, "@Y"], "t" => [0, "@j"], "u" => [0, "@k"], "v" => [0, "@q"], "w" => [0, "@v"], "x" => [0, "@w"], "y" => [0, "@x"], "z" => [0, "@y"], "{" => [0, "@z"], "|" => [82, "@"], "}" => [87, "@"], "~" => [130, "@"], "" => [9, "@"], "\x80" => [94, "[0"], "\x81" => [76, "[0"], "\x82" => [104, "[0"], "\x83" => [16, "[0"], "\x84" => [94, "[1"], "\x85" => [76, "[1"], "\x86" => [104, "[1"], "\x87" => [16, "[1"], "\x88" => [94, "[2"], "\x89" => [76, "[2"], "\x8a" => [104, "[2"], "\x8b" => [16, "[2"], "\x8c" => [94, "[a"], "\x8d" => [76, "[a"], "\x8e" => [104, "[a"], "\x8f" => [16, "[a"], "\x90" => [94, "[c"], "\x91" => [76, "[c"], "\x92" => [104, "[c"], "\x93" => [16, "[c"], "\x94" => [94, "[e"], "\x95" => [76, "[e"], "\x96" => [104, "[e"], "\x97" => [16, "[e"], "\x98" => [94, "[i"], "\x99" => [76, "[i"], "\x9a" => [104, "[i"], "\x9b" => [16, "[i"], "\x9c" => [94, "[o"], "\x9d" => [76, "[o"], "\x9e" => [104, "[o"], "\x9f" => [16, "[o"], "\xa0" => [94, "[s"], "\xa1" => [76, "[s"], "\xa2" => [104, "[s"], "\xa3" => [16, "[s"], "\xa4" => [94, "[t"], "\xa5" => [76, "[t"], "\xa6" => [104, "[t"], "\xa7" => [16, "[t"], "\xa8" => [77, "[ "], "\xa9" => [18, "[ "], "\xaa" => [77, "[%"], "\xab" => [18, "[%"], "\xac" => [77, "[-"], "\xad" => [18, "[-"], "\xae" => [77, "[."], "\xaf" => [18, "[."], "\xb0" => [77, "[/"], "\xb1" => [18, "[/"], "\xb2" => [77, "[3"], "\xb3" => [18, "[3"], "\xb4" => [77, "[4"], "\xb5" => [18, "[4"], "\xb6" => [77, "[5"], "\xb7" => [18, "[5"], "\xb8" => [77, "[6"], "\xb9" => [18, "[6"], "\xba" => [77, "[7"], "\xbb" => [18, "[7"], "\xbc" => [77, "[8"], "\xbd" => [18, "[8"], "\xbe" => [77, "[9"], "\xbf" => [18, "[9"], "\xc0" => [77, "[="], "\xc1" => [18, "[="], "\xc2" => [77, "[A"], "\xc3" => [18, "[A"], "\xc4" => [77, "[_"], "\xc5" => [18, "[_"], "\xc6" => [77, "[b"], "\xc7" => [18, "[b"], "\xc8" => [77, "[d"], "\xc9" => [18, "[d"], "\xca" => [77, "[f"], "\xcb" => [18, "[f"], "\xcc" => [77, "[g"], "\xcd" => [18, "[g"], "\xce" => [77, "[h"], "\xcf" => [18, "[h"], "\xd0" => [77, "[l"], "\xd1" => [18, "[l"], "\xd2" => [77, "[m"], "\xd3" => [18, "[m"], "\xd4" => [77, "[n"], "\xd5" => [18, "[n"], "\xd6" => [77, "[p"], "\xd7" => [18, "[p"], "\xd8" => [77, "[r"], "\xd9" => [18, "[r"], "\xda" => [77, "[u"], "\xdb" => [18, "[u"], "\xdc" => [0, "[:"], "\xdd" => [0, "[B"], "\xde" => [0, "[C"], "\xdf" => [0, "[D"], "\xe0" => [0, "[E"], "\xe1" => [0, "[F"], "\xe2" => [0, "[G"], "\xe3" => [0, "[H"], "\xe4" => [0, "[I"], "\xe5" => [0, "[J"], "\xe6" => [0, "[K"], "\xe7" => [0, "[L"], "\xe8" => [0, "[M"], "\xe9" => [0, "[N"], "\xea" => [0, "[O"], "\xeb" => [0, "[P"], "\xec" => [0, "[Q"], "\xed" => [0, "[R"], "\xee" => [0, "[S"], "\xef" => [0, "[T"], "\xf0" => [0, "[U"], "\xf1" => [0, "[V"], "\xf2" => [0, "[W"], "\xf3" => [0, "[Y"], "\xf4" => [0, "[j"], "\xf5" => [0, "[k"], "\xf6" => [0, "[q"], "\xf7" => [0, "[v"], "\xf8" => [0, "[w"], "\xf9" => [0, "[x"], "\xfa" => [0, "[y"], "\xfb" => [0, "[z"], "\xfc" => [82, "["], "\xfd" => [87, "["], "\xfe" => [130, "["], "\xff" => [9, "["]], ["\x00" => [94, "C0"], "\x01" => [76, "C0"], "\x02" => [104, "C0"], "\x03" => [16, "C0"], "\x04" => [94, "C1"], "\x05" => [76, "C1"], "\x06" => [104, "C1"], "\x07" => [16, "C1"], "\x08" => [94, "C2"], "\t" => [76, "C2"], "\n" => [104, "C2"], "\v" => [16, "C2"], "\f" => [94, "Ca"], "\r" => [76, "Ca"], "\x0e" => [104, "Ca"], "\x0f" => [16, "Ca"], "\x10" => [94, "Cc"], "\x11" => [76, "Cc"], "\x12" => [104, "Cc"], "\x13" => [16, "Cc"], "\x14" => [94, "Ce"], "\x15" => [76, "Ce"], "\x16" => [104, "Ce"], "\x17" => [16, "Ce"], "\x18" => [94, "Ci"], "\x19" => [76, "Ci"], "\x1a" => [104, "Ci"], "\x1b" => [16, "Ci"], "\x1c" => [94, "Co"], "\x1d" => [76, "Co"], "\x1e" => [104, "Co"], "\x1f" => [16, "Co"], " " => [94, "Cs"], "!" => [76, "Cs"], "\"" => [104, "Cs"], "#" => [16, "Cs"], "\$" => [94, "Ct"], "%" => [76, "Ct"], "&" => [104, "Ct"], "'" => [16, "Ct"], "(" => [77, "C "], ")" => [18, "C "], "*" => [77, "C%"], "+" => [18, "C%"], "," => [77, "C-"], "-" => [18, "C-"], "." => [77, "C."], "/" => [18, "C."], [77, "C/"], [18, "C/"], [77, "C3"], [18, "C3"], [77, "C4"], [18, "C4"], [77, "C5"], [18, "C5"], [77, "C6"], [18, "C6"], ":" => [77, "C7"], ";" => [18, "C7"], "<" => [77, "C8"], "=" => [18, "C8"], ">" => [77, "C9"], "?" => [18, "C9"], "@" => [77, "C="], "A" => [18, "C="], "B" => [77, "CA"], "C" => [18, "CA"], "D" => [77, "C_"], "E" => [18, "C_"], "F" => [77, "Cb"], "G" => [18, "Cb"], "H" => [77, "Cd"], "I" => [18, "Cd"], "J" => [77, "Cf"], "K" => [18, "Cf"], "L" => [77, "Cg"], "M" => [18, "Cg"], "N" => [77, "Ch"], "O" => [18, "Ch"], "P" => [77, "Cl"], "Q" => [18, "Cl"], "R" => [77, "Cm"], "S" => [18, "Cm"], "T" => [77, "Cn"], "U" => [18, "Cn"], "V" => [77, "Cp"], "W" => [18, "Cp"], "X" => [77, "Cr"], "Y" => [18, "Cr"], "Z" => [77, "Cu"], "[" => [18, "Cu"], "\\" => [0, "C:"], "]" => [0, "CB"], "^" => [0, "CC"], "_" => [0, "CD"], "`" => [0, "CE"], "a" => [0, "CF"], "b" => [0, "CG"], "c" => [0, "CH"], "d" => [0, "CI"], "e" => [0, "CJ"], "f" => [0, "CK"], "g" => [0, "CL"], "h" => [0, "CM"], "i" => [0, "CN"], "j" => [0, "CO"], "k" => [0, "CP"], "l" => [0, "CQ"], "m" => [0, "CR"], "n" => [0, "CS"], "o" => [0, "CT"], "p" => [0, "CU"], "q" => [0, "CV"], "r" => [0, "CW"], "s" => [0, "CY"], "t" => [0, "Cj"], "u" => [0, "Ck"], "v" => [0, "Cq"], "w" => [0, "Cv"], "x" => [0, "Cw"], "y" => [0, "Cx"], "z" => [0, "Cy"], "{" => [0, "Cz"], "|" => [82, "C"], "}" => [87, "C"], "~" => [130, "C"], "" => [9, "C"], "\x80" => [94, "D0"], "\x81" => [76, "D0"], "\x82" => [104, "D0"], "\x83" => [16, "D0"], "\x84" => [94, "D1"], "\x85" => [76, "D1"], "\x86" => [104, "D1"], "\x87" => [16, "D1"], "\x88" => [94, "D2"], "\x89" => [76, "D2"], "\x8a" => [104, "D2"], "\x8b" => [16, "D2"], "\x8c" => [94, "Da"], "\x8d" => [76, "Da"], "\x8e" => [104, "Da"], "\x8f" => [16, "Da"], "\x90" => [94, "Dc"], "\x91" => [76, "Dc"], "\x92" => [104, "Dc"], "\x93" => [16, "Dc"], "\x94" => [94, "De"], "\x95" => [76, "De"], "\x96" => [104, "De"], "\x97" => [16, "De"], "\x98" => [94, "Di"], "\x99" => [76, "Di"], "\x9a" => [104, "Di"], "\x9b" => [16, "Di"], "\x9c" => [94, "Do"], "\x9d" => [76, "Do"], "\x9e" => [104, "Do"], "\x9f" => [16, "Do"], "\xa0" => [94, "Ds"], "\xa1" => [76, "Ds"], "\xa2" => [104, "Ds"], "\xa3" => [16, "Ds"], "\xa4" => [94, "Dt"], "\xa5" => [76, "Dt"], "\xa6" => [104, "Dt"], "\xa7" => [16, "Dt"], "\xa8" => [77, "D "], "\xa9" => [18, "D "], "\xaa" => [77, "D%"], "\xab" => [18, "D%"], "\xac" => [77, "D-"], "\xad" => [18, "D-"], "\xae" => [77, "D."], "\xaf" => [18, "D."], "\xb0" => [77, "D/"], "\xb1" => [18, "D/"], "\xb2" => [77, "D3"], "\xb3" => [18, "D3"], "\xb4" => [77, "D4"], "\xb5" => [18, "D4"], "\xb6" => [77, "D5"], "\xb7" => [18, "D5"], "\xb8" => [77, "D6"], "\xb9" => [18, "D6"], "\xba" => [77, "D7"], "\xbb" => [18, "D7"], "\xbc" => [77, "D8"], "\xbd" => [18, "D8"], "\xbe" => [77, "D9"], "\xbf" => [18, "D9"], "\xc0" => [77, "D="], "\xc1" => [18, "D="], "\xc2" => [77, "DA"], "\xc3" => [18, "DA"], "\xc4" => [77, "D_"], "\xc5" => [18, "D_"], "\xc6" => [77, "Db"], "\xc7" => [18, "Db"], "\xc8" => [77, "Dd"], "\xc9" => [18, "Dd"], "\xca" => [77, "Df"], "\xcb" => [18, "Df"], "\xcc" => [77, "Dg"], "\xcd" => [18, "Dg"], "\xce" => [77, "Dh"], "\xcf" => [18, "Dh"], "\xd0" => [77, "Dl"], "\xd1" => [18, "Dl"], "\xd2" => [77, "Dm"], "\xd3" => [18, "Dm"], "\xd4" => [77, "Dn"], "\xd5" => [18, "Dn"], "\xd6" => [77, "Dp"], "\xd7" => [18, "Dp"], "\xd8" => [77, "Dr"], "\xd9" => [18, "Dr"], "\xda" => [77, "Du"], "\xdb" => [18, "Du"], "\xdc" => [0, "D:"], "\xdd" => [0, "DB"], "\xde" => [0, "DC"], "\xdf" => [0, "DD"], "\xe0" => [0, "DE"], "\xe1" => [0, "DF"], "\xe2" => [0, "DG"], "\xe3" => [0, "DH"], "\xe4" => [0, "DI"], "\xe5" => [0, "DJ"], "\xe6" => [0, "DK"], "\xe7" => [0, "DL"], "\xe8" => [0, "DM"], "\xe9" => [0, "DN"], "\xea" => [0, "DO"], "\xeb" => [0, "DP"], "\xec" => [0, "DQ"], "\xed" => [0, "DR"], "\xee" => [0, "DS"], "\xef" => [0, "DT"], "\xf0" => [0, "DU"], "\xf1" => [0, "DV"], "\xf2" => [0, "DW"], "\xf3" => [0, "DY"], "\xf4" => [0, "Dj"], "\xf5" => [0, "Dk"], "\xf6" => [0, "Dq"], "\xf7" => [0, "Dv"], "\xf8" => [0, "Dw"], "\xf9" => [0, "Dx"], "\xfa" => [0, "Dy"], "\xfb" => [0, "Dz"], "\xfc" => [82, "D"], "\xfd" => [87, "D"], "\xfe" => [130, "D"], "\xff" => [9, "D"]], ["\x00" => [94, "E0"], "\x01" => [76, "E0"], "\x02" => [104, "E0"], "\x03" => [16, "E0"], "\x04" => [94, "E1"], "\x05" => [76, "E1"], "\x06" => [104, "E1"], "\x07" => [16, "E1"], "\x08" => [94, "E2"], "\t" => [76, "E2"], "\n" => [104, "E2"], "\v" => [16, "E2"], "\f" => [94, "Ea"], "\r" => [76, "Ea"], "\x0e" => [104, "Ea"], "\x0f" => [16, "Ea"], "\x10" => [94, "Ec"], "\x11" => [76, "Ec"], "\x12" => [104, "Ec"], "\x13" => [16, "Ec"], "\x14" => [94, "Ee"], "\x15" => [76, "Ee"], "\x16" => [104, "Ee"], "\x17" => [16, "Ee"], "\x18" => [94, "Ei"], "\x19" => [76, "Ei"], "\x1a" => [104, "Ei"], "\x1b" => [16, "Ei"], "\x1c" => [94, "Eo"], "\x1d" => [76, "Eo"], "\x1e" => [104, "Eo"], "\x1f" => [16, "Eo"], " " => [94, "Es"], "!" => [76, "Es"], "\"" => [104, "Es"], "#" => [16, "Es"], "\$" => [94, "Et"], "%" => [76, "Et"], "&" => [104, "Et"], "'" => [16, "Et"], "(" => [77, "E "], ")" => [18, "E "], "*" => [77, "E%"], "+" => [18, "E%"], "," => [77, "E-"], "-" => [18, "E-"], "." => [77, "E."], "/" => [18, "E."], [77, "E/"], [18, "E/"], [77, "E3"], [18, "E3"], [77, "E4"], [18, "E4"], [77, "E5"], [18, "E5"], [77, "E6"], [18, "E6"], ":" => [77, "E7"], ";" => [18, "E7"], "<" => [77, "E8"], "=" => [18, "E8"], ">" => [77, "E9"], "?" => [18, "E9"], "@" => [77, "E="], "A" => [18, "E="], "B" => [77, "EA"], "C" => [18, "EA"], "D" => [77, "E_"], "E" => [18, "E_"], "F" => [77, "Eb"], "G" => [18, "Eb"], "H" => [77, "Ed"], "I" => [18, "Ed"], "J" => [77, "Ef"], "K" => [18, "Ef"], "L" => [77, "Eg"], "M" => [18, "Eg"], "N" => [77, "Eh"], "O" => [18, "Eh"], "P" => [77, "El"], "Q" => [18, "El"], "R" => [77, "Em"], "S" => [18, "Em"], "T" => [77, "En"], "U" => [18, "En"], "V" => [77, "Ep"], "W" => [18, "Ep"], "X" => [77, "Er"], "Y" => [18, "Er"], "Z" => [77, "Eu"], "[" => [18, "Eu"], "\\" => [0, "E:"], "]" => [0, "EB"], "^" => [0, "EC"], "_" => [0, "ED"], "`" => [0, "EE"], "a" => [0, "EF"], "b" => [0, "EG"], "c" => [0, "EH"], "d" => [0, "EI"], "e" => [0, "EJ"], "f" => [0, "EK"], "g" => [0, "EL"], "h" => [0, "EM"], "i" => [0, "EN"], "j" => [0, "EO"], "k" => [0, "EP"], "l" => [0, "EQ"], "m" => [0, "ER"], "n" => [0, "ES"], "o" => [0, "ET"], "p" => [0, "EU"], "q" => [0, "EV"], "r" => [0, "EW"], "s" => [0, "EY"], "t" => [0, "Ej"], "u" => [0, "Ek"], "v" => [0, "Eq"], "w" => [0, "Ev"], "x" => [0, "Ew"], "y" => [0, "Ex"], "z" => [0, "Ey"], "{" => [0, "Ez"], "|" => [82, "E"], "}" => [87, "E"], "~" => [130, "E"], "" => [9, "E"], "\x80" => [94, "F0"], "\x81" => [76, "F0"], "\x82" => [104, "F0"], "\x83" => [16, "F0"], "\x84" => [94, "F1"], "\x85" => [76, "F1"], "\x86" => [104, "F1"], "\x87" => [16, "F1"], "\x88" => [94, "F2"], "\x89" => [76, "F2"], "\x8a" => [104, "F2"], "\x8b" => [16, "F2"], "\x8c" => [94, "Fa"], "\x8d" => [76, "Fa"], "\x8e" => [104, "Fa"], "\x8f" => [16, "Fa"], "\x90" => [94, "Fc"], "\x91" => [76, "Fc"], "\x92" => [104, "Fc"], "\x93" => [16, "Fc"], "\x94" => [94, "Fe"], "\x95" => [76, "Fe"], "\x96" => [104, "Fe"], "\x97" => [16, "Fe"], "\x98" => [94, "Fi"], "\x99" => [76, "Fi"], "\x9a" => [104, "Fi"], "\x9b" => [16, "Fi"], "\x9c" => [94, "Fo"], "\x9d" => [76, "Fo"], "\x9e" => [104, "Fo"], "\x9f" => [16, "Fo"], "\xa0" => [94, "Fs"], "\xa1" => [76, "Fs"], "\xa2" => [104, "Fs"], "\xa3" => [16, "Fs"], "\xa4" => [94, "Ft"], "\xa5" => [76, "Ft"], "\xa6" => [104, "Ft"], "\xa7" => [16, "Ft"], "\xa8" => [77, "F "], "\xa9" => [18, "F "], "\xaa" => [77, "F%"], "\xab" => [18, "F%"], "\xac" => [77, "F-"], "\xad" => [18, "F-"], "\xae" => [77, "F."], "\xaf" => [18, "F."], "\xb0" => [77, "F/"], "\xb1" => [18, "F/"], "\xb2" => [77, "F3"], "\xb3" => [18, "F3"], "\xb4" => [77, "F4"], "\xb5" => [18, "F4"], "\xb6" => [77, "F5"], "\xb7" => [18, "F5"], "\xb8" => [77, "F6"], "\xb9" => [18, "F6"], "\xba" => [77, "F7"], "\xbb" => [18, "F7"], "\xbc" => [77, "F8"], "\xbd" => [18, "F8"], "\xbe" => [77, "F9"], "\xbf" => [18, "F9"], "\xc0" => [77, "F="], "\xc1" => [18, "F="], "\xc2" => [77, "FA"], "\xc3" => [18, "FA"], "\xc4" => [77, "F_"], "\xc5" => [18, "F_"], "\xc6" => [77, "Fb"], "\xc7" => [18, "Fb"], "\xc8" => [77, "Fd"], "\xc9" => [18, "Fd"], "\xca" => [77, "Ff"], "\xcb" => [18, "Ff"], "\xcc" => [77, "Fg"], "\xcd" => [18, "Fg"], "\xce" => [77, "Fh"], "\xcf" => [18, "Fh"], "\xd0" => [77, "Fl"], "\xd1" => [18, "Fl"], "\xd2" => [77, "Fm"], "\xd3" => [18, "Fm"], "\xd4" => [77, "Fn"], "\xd5" => [18, "Fn"], "\xd6" => [77, "Fp"], "\xd7" => [18, "Fp"], "\xd8" => [77, "Fr"], "\xd9" => [18, "Fr"], "\xda" => [77, "Fu"], "\xdb" => [18, "Fu"], "\xdc" => [0, "F:"], "\xdd" => [0, "FB"], "\xde" => [0, "FC"], "\xdf" => [0, "FD"], "\xe0" => [0, "FE"], "\xe1" => [0, "FF"], "\xe2" => [0, "FG"], "\xe3" => [0, "FH"], "\xe4" => [0, "FI"], "\xe5" => [0, "FJ"], "\xe6" => [0, "FK"], "\xe7" => [0, "FL"], "\xe8" => [0, "FM"], "\xe9" => [0, "FN"], "\xea" => [0, "FO"], "\xeb" => [0, "FP"], "\xec" => [0, "FQ"], "\xed" => [0, "FR"], "\xee" => [0, "FS"], "\xef" => [0, "FT"], "\xf0" => [0, "FU"], "\xf1" => [0, "FV"], "\xf2" => [0, "FW"], "\xf3" => [0, "FY"], "\xf4" => [0, "Fj"], "\xf5" => [0, "Fk"], "\xf6" => [0, "Fq"], "\xf7" => [0, "Fv"], "\xf8" => [0, "Fw"], "\xf9" => [0, "Fx"], "\xfa" => [0, "Fy"], "\xfb" => [0, "Fz"], "\xfc" => [82, "F"], "\xfd" => [87, "F"], "\xfe" => [130, "F"], "\xff" => [9, "F"]], ["\x00" => [77, "E0"], "\x01" => [18, "E0"], "\x02" => [77, "E1"], "\x03" => [18, "E1"], "\x04" => [77, "E2"], "\x05" => [18, "E2"], "\x06" => [77, "Ea"], "\x07" => [18, "Ea"], "\x08" => [77, "Ec"], "\t" => [18, "Ec"], "\n" => [77, "Ee"], "\v" => [18, "Ee"], "\f" => [77, "Ei"], "\r" => [18, "Ei"], "\x0e" => [77, "Eo"], "\x0f" => [18, "Eo"], "\x10" => [77, "Es"], "\x11" => [18, "Es"], "\x12" => [77, "Et"], "\x13" => [18, "Et"], "\x14" => [0, "E "], "\x15" => [0, "E%"], "\x16" => [0, "E-"], "\x17" => [0, "E."], "\x18" => [0, "E/"], "\x19" => [0, "E3"], "\x1a" => [0, "E4"], "\x1b" => [0, "E5"], "\x1c" => [0, "E6"], "\x1d" => [0, "E7"], "\x1e" => [0, "E8"], "\x1f" => [0, "E9"], " " => [0, "E="], "!" => [0, "EA"], "\"" => [0, "E_"], "#" => [0, "Eb"], "\$" => [0, "Ed"], "%" => [0, "Ef"], "&" => [0, "Eg"], "'" => [0, "Eh"], "(" => [0, "El"], ")" => [0, "Em"], "*" => [0, "En"], "+" => [0, "Ep"], "," => [0, "Er"], "-" => [0, "Eu"], "." => [100, "E"], "/" => [110, "E"], [111, "E"], [115, "E"], [116, "E"], [118, "E"], [119, "E"], [122, "E"], [123, "E"], [125, "E"], [126, "E"], [129, "E"], ":" => [143, "E"], ";" => [148, "E"], "<" => [151, "E"], "=" => [153, "E"], ">" => [83, "E"], "?" => [10, "E"], "@" => [77, "F0"], "A" => [18, "F0"], "B" => [77, "F1"], "C" => [18, "F1"], "D" => [77, "F2"], "E" => [18, "F2"], "F" => [77, "Fa"], "G" => [18, "Fa"], "H" => [77, "Fc"], "I" => [18, "Fc"], "J" => [77, "Fe"], "K" => [18, "Fe"], "L" => [77, "Fi"], "M" => [18, "Fi"], "N" => [77, "Fo"], "O" => [18, "Fo"], "P" => [77, "Fs"], "Q" => [18, "Fs"], "R" => [77, "Ft"], "S" => [18, "Ft"], "T" => [0, "F "], "U" => [0, "F%"], "V" => [0, "F-"], "W" => [0, "F."], "X" => [0, "F/"], "Y" => [0, "F3"], "Z" => [0, "F4"], "[" => [0, "F5"], "\\" => [0, "F6"], "]" => [0, "F7"], "^" => [0, "F8"], "_" => [0, "F9"], "`" => [0, "F="], "a" => [0, "FA"], "b" => [0, "F_"], "c" => [0, "Fb"], "d" => [0, "Fd"], "e" => [0, "Ff"], "f" => [0, "Fg"], "g" => [0, "Fh"], "h" => [0, "Fl"], "i" => [0, "Fm"], "j" => [0, "Fn"], "k" => [0, "Fp"], "l" => [0, "Fr"], "m" => [0, "Fu"], "n" => [100, "F"], "o" => [110, "F"], "p" => [111, "F"], "q" => [115, "F"], "r" => [116, "F"], "s" => [118, "F"], "t" => [119, "F"], "u" => [122, "F"], "v" => [123, "F"], "w" => [125, "F"], "x" => [126, "F"], "y" => [129, "F"], "z" => [143, "F"], "{" => [148, "F"], "|" => [151, "F"], "}" => [153, "F"], "~" => [83, "F"], "" => [10, "F"], "\x80" => [77, "G0"], "\x81" => [18, "G0"], "\x82" => [77, "G1"], "\x83" => [18, "G1"], "\x84" => [77, "G2"], "\x85" => [18, "G2"], "\x86" => [77, "Ga"], "\x87" => [18, "Ga"], "\x88" => [77, "Gc"], "\x89" => [18, "Gc"], "\x8a" => [77, "Ge"], "\x8b" => [18, "Ge"], "\x8c" => [77, "Gi"], "\x8d" => [18, "Gi"], "\x8e" => [77, "Go"], "\x8f" => [18, "Go"], "\x90" => [77, "Gs"], "\x91" => [18, "Gs"], "\x92" => [77, "Gt"], "\x93" => [18, "Gt"], "\x94" => [0, "G "], "\x95" => [0, "G%"], "\x96" => [0, "G-"], "\x97" => [0, "G."], "\x98" => [0, "G/"], "\x99" => [0, "G3"], "\x9a" => [0, "G4"], "\x9b" => [0, "G5"], "\x9c" => [0, "G6"], "\x9d" => [0, "G7"], "\x9e" => [0, "G8"], "\x9f" => [0, "G9"], "\xa0" => [0, "G="], "\xa1" => [0, "GA"], "\xa2" => [0, "G_"], "\xa3" => [0, "Gb"], "\xa4" => [0, "Gd"], "\xa5" => [0, "Gf"], "\xa6" => [0, "Gg"], "\xa7" => [0, "Gh"], "\xa8" => [0, "Gl"], "\xa9" => [0, "Gm"], "\xaa" => [0, "Gn"], "\xab" => [0, "Gp"], "\xac" => [0, "Gr"], "\xad" => [0, "Gu"], "\xae" => [100, "G"], "\xaf" => [110, "G"], "\xb0" => [111, "G"], "\xb1" => [115, "G"], "\xb2" => [116, "G"], "\xb3" => [118, "G"], "\xb4" => [119, "G"], "\xb5" => [122, "G"], "\xb6" => [123, "G"], "\xb7" => [125, "G"], "\xb8" => [126, "G"], "\xb9" => [129, "G"], "\xba" => [143, "G"], "\xbb" => [148, "G"], "\xbc" => [151, "G"], "\xbd" => [153, "G"], "\xbe" => [83, "G"], "\xbf" => [10, "G"], "\xc0" => [77, "H0"], "\xc1" => [18, "H0"], "\xc2" => [77, "H1"], "\xc3" => [18, "H1"], "\xc4" => [77, "H2"], "\xc5" => [18, "H2"], "\xc6" => [77, "Ha"], "\xc7" => [18, "Ha"], "\xc8" => [77, "Hc"], "\xc9" => [18, "Hc"], "\xca" => [77, "He"], "\xcb" => [18, "He"], "\xcc" => [77, "Hi"], "\xcd" => [18, "Hi"], "\xce" => [77, "Ho"], "\xcf" => [18, "Ho"], "\xd0" => [77, "Hs"], "\xd1" => [18, "Hs"], "\xd2" => [77, "Ht"], "\xd3" => [18, "Ht"], "\xd4" => [0, "H "], "\xd5" => [0, "H%"], "\xd6" => [0, "H-"], "\xd7" => [0, "H."], "\xd8" => [0, "H/"], "\xd9" => [0, "H3"], "\xda" => [0, "H4"], "\xdb" => [0, "H5"], "\xdc" => [0, "H6"], "\xdd" => [0, "H7"], "\xde" => [0, "H8"], "\xdf" => [0, "H9"], "\xe0" => [0, "H="], "\xe1" => [0, "HA"], "\xe2" => [0, "H_"], "\xe3" => [0, "Hb"], "\xe4" => [0, "Hd"], "\xe5" => [0, "Hf"], "\xe6" => [0, "Hg"], "\xe7" => [0, "Hh"], "\xe8" => [0, "Hl"], "\xe9" => [0, "Hm"], "\xea" => [0, "Hn"], "\xeb" => [0, "Hp"], "\xec" => [0, "Hr"], "\xed" => [0, "Hu"], "\xee" => [100, "H"], "\xef" => [110, "H"], "\xf0" => [111, "H"], "\xf1" => [115, "H"], "\xf2" => [116, "H"], "\xf3" => [118, "H"], "\xf4" => [119, "H"], "\xf5" => [122, "H"], "\xf6" => [123, "H"], "\xf7" => [125, "H"], "\xf8" => [126, "H"], "\xf9" => [129, "H"], "\xfa" => [143, "H"], "\xfb" => [148, "H"], "\xfc" => [151, "H"], "\xfd" => [153, "H"], "\xfe" => [83, "H"], "\xff" => [10, "H"]], ["\x00" => [0, "E0"], "\x01" => [0, "E1"], "\x02" => [0, "E2"], "\x03" => [0, "Ea"], "\x04" => [0, "Ec"], "\x05" => [0, "Ee"], "\x06" => [0, "Ei"], "\x07" => [0, "Eo"], "\x08" => [0, "Es"], "\t" => [0, "Et"], "\n" => [73, "E"], "\v" => [88, "E"], "\f" => [89, "E"], "\r" => [96, "E"], "\x0e" => [97, "E"], "\x0f" => [99, "E"], "\x10" => [106, "E"], "\x11" => [136, "E"], "\x12" => [139, "E"], "\x13" => [141, "E"], "\x14" => [145, "E"], "\x15" => [147, "E"], "\x16" => [149, "E"], "\x17" => [101, "E"], "\x18" => [112, "E"], "\x19" => [117, "E"], "\x1a" => [120, "E"], "\x1b" => [124, "E"], "\x1c" => [127, "E"], "\x1d" => [144, "E"], "\x1e" => [152, "E"], "\x1f" => [11, "E"], " " => [0, "F0"], "!" => [0, "F1"], "\"" => [0, "F2"], "#" => [0, "Fa"], "\$" => [0, "Fc"], "%" => [0, "Fe"], "&" => [0, "Fi"], "'" => [0, "Fo"], "(" => [0, "Fs"], ")" => [0, "Ft"], "*" => [73, "F"], "+" => [88, "F"], "," => [89, "F"], "-" => [96, "F"], "." => [97, "F"], "/" => [99, "F"], [106, "F"], [136, "F"], [139, "F"], [141, "F"], [145, "F"], [147, "F"], [149, "F"], [101, "F"], [112, "F"], [117, "F"], ":" => [120, "F"], ";" => [124, "F"], "<" => [127, "F"], "=" => [144, "F"], ">" => [152, "F"], "?" => [11, "F"], "@" => [0, "G0"], "A" => [0, "G1"], "B" => [0, "G2"], "C" => [0, "Ga"], "D" => [0, "Gc"], "E" => [0, "Ge"], "F" => [0, "Gi"], "G" => [0, "Go"], "H" => [0, "Gs"], "I" => [0, "Gt"], "J" => [73, "G"], "K" => [88, "G"], "L" => [89, "G"], "M" => [96, "G"], "N" => [97, "G"], "O" => [99, "G"], "P" => [106, "G"], "Q" => [136, "G"], "R" => [139, "G"], "S" => [141, "G"], "T" => [145, "G"], "U" => [147, "G"], "V" => [149, "G"], "W" => [101, "G"], "X" => [112, "G"], "Y" => [117, "G"], "Z" => [120, "G"], "[" => [124, "G"], "\\" => [127, "G"], "]" => [144, "G"], "^" => [152, "G"], "_" => [11, "G"], "`" => [0, "H0"], "a" => [0, "H1"], "b" => [0, "H2"], "c" => [0, "Ha"], "d" => [0, "Hc"], "e" => [0, "He"], "f" => [0, "Hi"], "g" => [0, "Ho"], "h" => [0, "Hs"], "i" => [0, "Ht"], "j" => [73, "H"], "k" => [88, "H"], "l" => [89, "H"], "m" => [96, "H"], "n" => [97, "H"], "o" => [99, "H"], "p" => [106, "H"], "q" => [136, "H"], "r" => [139, "H"], "s" => [141, "H"], "t" => [145, "H"], "u" => [147, "H"], "v" => [149, "H"], "w" => [101, "H"], "x" => [112, "H"], "y" => [117, "H"], "z" => [120, "H"], "{" => [124, "H"], "|" => [127, "H"], "}" => [144, "H"], "~" => [152, "H"], "" => [11, "H"], "\x80" => [0, "I0"], "\x81" => [0, "I1"], "\x82" => [0, "I2"], "\x83" => [0, "Ia"], "\x84" => [0, "Ic"], "\x85" => [0, "Ie"], "\x86" => [0, "Ii"], "\x87" => [0, "Io"], "\x88" => [0, "Is"], "\x89" => [0, "It"], "\x8a" => [73, "I"], "\x8b" => [88, "I"], "\x8c" => [89, "I"], "\x8d" => [96, "I"], "\x8e" => [97, "I"], "\x8f" => [99, "I"], "\x90" => [106, "I"], "\x91" => [136, "I"], "\x92" => [139, "I"], "\x93" => [141, "I"], "\x94" => [145, "I"], "\x95" => [147, "I"], "\x96" => [149, "I"], "\x97" => [101, "I"], "\x98" => [112, "I"], "\x99" => [117, "I"], "\x9a" => [120, "I"], "\x9b" => [124, "I"], "\x9c" => [127, "I"], "\x9d" => [144, "I"], "\x9e" => [152, "I"], "\x9f" => [11, "I"], "\xa0" => [0, "J0"], "\xa1" => [0, "J1"], "\xa2" => [0, "J2"], "\xa3" => [0, "Ja"], "\xa4" => [0, "Jc"], "\xa5" => [0, "Je"], "\xa6" => [0, "Ji"], "\xa7" => [0, "Jo"], "\xa8" => [0, "Js"], "\xa9" => [0, "Jt"], "\xaa" => [73, "J"], "\xab" => [88, "J"], "\xac" => [89, "J"], "\xad" => [96, "J"], "\xae" => [97, "J"], "\xaf" => [99, "J"], "\xb0" => [106, "J"], "\xb1" => [136, "J"], "\xb2" => [139, "J"], "\xb3" => [141, "J"], "\xb4" => [145, "J"], "\xb5" => [147, "J"], "\xb6" => [149, "J"], "\xb7" => [101, "J"], "\xb8" => [112, "J"], "\xb9" => [117, "J"], "\xba" => [120, "J"], "\xbb" => [124, "J"], "\xbc" => [127, "J"], "\xbd" => [144, "J"], "\xbe" => [152, "J"], "\xbf" => [11, "J"], "\xc0" => [0, "K0"], "\xc1" => [0, "K1"], "\xc2" => [0, "K2"], "\xc3" => [0, "Ka"], "\xc4" => [0, "Kc"], "\xc5" => [0, "Ke"], "\xc6" => [0, "Ki"], "\xc7" => [0, "Ko"], "\xc8" => [0, "Ks"], "\xc9" => [0, "Kt"], "\xca" => [73, "K"], "\xcb" => [88, "K"], "\xcc" => [89, "K"], "\xcd" => [96, "K"], "\xce" => [97, "K"], "\xcf" => [99, "K"], "\xd0" => [106, "K"], "\xd1" => [136, "K"], "\xd2" => [139, "K"], "\xd3" => [141, "K"], "\xd4" => [145, "K"], "\xd5" => [147, "K"], "\xd6" => [149, "K"], "\xd7" => [101, "K"], "\xd8" => [112, "K"], "\xd9" => [117, "K"], "\xda" => [120, "K"], "\xdb" => [124, "K"], "\xdc" => [127, "K"], "\xdd" => [144, "K"], "\xde" => [152, "K"], "\xdf" => [11, "K"], "\xe0" => [0, "L0"], "\xe1" => [0, "L1"], "\xe2" => [0, "L2"], "\xe3" => [0, "La"], "\xe4" => [0, "Lc"], "\xe5" => [0, "Le"], "\xe6" => [0, "Li"], "\xe7" => [0, "Lo"], "\xe8" => [0, "Ls"], "\xe9" => [0, "Lt"], "\xea" => [73, "L"], "\xeb" => [88, "L"], "\xec" => [89, "L"], "\xed" => [96, "L"], "\xee" => [97, "L"], "\xef" => [99, "L"], "\xf0" => [106, "L"], "\xf1" => [136, "L"], "\xf2" => [139, "L"], "\xf3" => [141, "L"], "\xf4" => [145, "L"], "\xf5" => [147, "L"], "\xf6" => [149, "L"], "\xf7" => [101, "L"], "\xf8" => [112, "L"], "\xf9" => [117, "L"], "\xfa" => [120, "L"], "\xfb" => [124, "L"], "\xfc" => [127, "L"], "\xfd" => [144, "L"], "\xfe" => [152, "L"], "\xff" => [11, "L"]], ["\x00" => [92, "E"], "\x01" => [95, "E"], "\x02" => [137, "E"], "\x03" => [142, "E"], "\x04" => [150, "E"], "\x05" => [74, "E"], "\x06" => [90, "E"], "\x07" => [98, "E"], "\x08" => [107, "E"], "\t" => [140, "E"], "\n" => [146, "E"], "\v" => [102, "E"], "\f" => [113, "E"], "\r" => [121, "E"], "\x0e" => [128, "E"], "\x0f" => [12, "E"], "\x10" => [92, "F"], "\x11" => [95, "F"], "\x12" => [137, "F"], "\x13" => [142, "F"], "\x14" => [150, "F"], "\x15" => [74, "F"], "\x16" => [90, "F"], "\x17" => [98, "F"], "\x18" => [107, "F"], "\x19" => [140, "F"], "\x1a" => [146, "F"], "\x1b" => [102, "F"], "\x1c" => [113, "F"], "\x1d" => [121, "F"], "\x1e" => [128, "F"], "\x1f" => [12, "F"], " " => [92, "G"], "!" => [95, "G"], "\"" => [137, "G"], "#" => [142, "G"], "\$" => [150, "G"], "%" => [74, "G"], "&" => [90, "G"], "'" => [98, "G"], "(" => [107, "G"], ")" => [140, "G"], "*" => [146, "G"], "+" => [102, "G"], "," => [113, "G"], "-" => [121, "G"], "." => [128, "G"], "/" => [12, "G"], [92, "H"], [95, "H"], [137, "H"], [142, "H"], [150, "H"], [74, "H"], [90, "H"], [98, "H"], [107, "H"], [140, "H"], ":" => [146, "H"], ";" => [102, "H"], "<" => [113, "H"], "=" => [121, "H"], ">" => [128, "H"], "?" => [12, "H"], "@" => [92, "I"], "A" => [95, "I"], "B" => [137, "I"], "C" => [142, "I"], "D" => [150, "I"], "E" => [74, "I"], "F" => [90, "I"], "G" => [98, "I"], "H" => [107, "I"], "I" => [140, "I"], "J" => [146, "I"], "K" => [102, "I"], "L" => [113, "I"], "M" => [121, "I"], "N" => [128, "I"], "O" => [12, "I"], "P" => [92, "J"], "Q" => [95, "J"], "R" => [137, "J"], "S" => [142, "J"], "T" => [150, "J"], "U" => [74, "J"], "V" => [90, "J"], "W" => [98, "J"], "X" => [107, "J"], "Y" => [140, "J"], "Z" => [146, "J"], "[" => [102, "J"], "\\" => [113, "J"], "]" => [121, "J"], "^" => [128, "J"], "_" => [12, "J"], "`" => [92, "K"], "a" => [95, "K"], "b" => [137, "K"], "c" => [142, "K"], "d" => [150, "K"], "e" => [74, "K"], "f" => [90, "K"], "g" => [98, "K"], "h" => [107, "K"], "i" => [140, "K"], "j" => [146, "K"], "k" => [102, "K"], "l" => [113, "K"], "m" => [121, "K"], "n" => [128, "K"], "o" => [12, "K"], "p" => [92, "L"], "q" => [95, "L"], "r" => [137, "L"], "s" => [142, "L"], "t" => [150, "L"], "u" => [74, "L"], "v" => [90, "L"], "w" => [98, "L"], "x" => [107, "L"], "y" => [140, "L"], "z" => [146, "L"], "{" => [102, "L"], "|" => [113, "L"], "}" => [121, "L"], "~" => [128, "L"], "" => [12, "L"], "\x80" => [92, "M"], "\x81" => [95, "M"], "\x82" => [137, "M"], "\x83" => [142, "M"], "\x84" => [150, "M"], "\x85" => [74, "M"], "\x86" => [90, "M"], "\x87" => [98, "M"], "\x88" => [107, "M"], "\x89" => [140, "M"], "\x8a" => [146, "M"], "\x8b" => [102, "M"], "\x8c" => [113, "M"], "\x8d" => [121, "M"], "\x8e" => [128, "M"], "\x8f" => [12, "M"], "\x90" => [92, "N"], "\x91" => [95, "N"], "\x92" => [137, "N"], "\x93" => [142, "N"], "\x94" => [150, "N"], "\x95" => [74, "N"], "\x96" => [90, "N"], "\x97" => [98, "N"], "\x98" => [107, "N"], "\x99" => [140, "N"], "\x9a" => [146, "N"], "\x9b" => [102, "N"], "\x9c" => [113, "N"], "\x9d" => [121, "N"], "\x9e" => [128, "N"], "\x9f" => [12, "N"], "\xa0" => [92, "O"], "\xa1" => [95, "O"], "\xa2" => [137, "O"], "\xa3" => [142, "O"], "\xa4" => [150, "O"], "\xa5" => [74, "O"], "\xa6" => [90, "O"], "\xa7" => [98, "O"], "\xa8" => [107, "O"], "\xa9" => [140, "O"], "\xaa" => [146, "O"], "\xab" => [102, "O"], "\xac" => [113, "O"], "\xad" => [121, "O"], "\xae" => [128, "O"], "\xaf" => [12, "O"], "\xb0" => [92, "P"], "\xb1" => [95, "P"], "\xb2" => [137, "P"], "\xb3" => [142, "P"], "\xb4" => [150, "P"], "\xb5" => [74, "P"], "\xb6" => [90, "P"], "\xb7" => [98, "P"], "\xb8" => [107, "P"], "\xb9" => [140, "P"], "\xba" => [146, "P"], "\xbb" => [102, "P"], "\xbc" => [113, "P"], "\xbd" => [121, "P"], "\xbe" => [128, "P"], "\xbf" => [12, "P"], "\xc0" => [92, "Q"], "\xc1" => [95, "Q"], "\xc2" => [137, "Q"], "\xc3" => [142, "Q"], "\xc4" => [150, "Q"], "\xc5" => [74, "Q"], "\xc6" => [90, "Q"], "\xc7" => [98, "Q"], "\xc8" => [107, "Q"], "\xc9" => [140, "Q"], "\xca" => [146, "Q"], "\xcb" => [102, "Q"], "\xcc" => [113, "Q"], "\xcd" => [121, "Q"], "\xce" => [128, "Q"], "\xcf" => [12, "Q"], "\xd0" => [92, "R"], "\xd1" => [95, "R"], "\xd2" => [137, "R"], "\xd3" => [142, "R"], "\xd4" => [150, "R"], "\xd5" => [74, "R"], "\xd6" => [90, "R"], "\xd7" => [98, "R"], "\xd8" => [107, "R"], "\xd9" => [140, "R"], "\xda" => [146, "R"], "\xdb" => [102, "R"], "\xdc" => [113, "R"], "\xdd" => [121, "R"], "\xde" => [128, "R"], "\xdf" => [12, "R"], "\xe0" => [92, "S"], "\xe1" => [95, "S"], "\xe2" => [137, "S"], "\xe3" => [142, "S"], "\xe4" => [150, "S"], "\xe5" => [74, "S"], "\xe6" => [90, "S"], "\xe7" => [98, "S"], "\xe8" => [107, "S"], "\xe9" => [140, "S"], "\xea" => [146, "S"], "\xeb" => [102, "S"], "\xec" => [113, "S"], "\xed" => [121, "S"], "\xee" => [128, "S"], "\xef" => [12, "S"], "\xf0" => [92, "T"], "\xf1" => [95, "T"], "\xf2" => [137, "T"], "\xf3" => [142, "T"], "\xf4" => [150, "T"], "\xf5" => [74, "T"], "\xf6" => [90, "T"], "\xf7" => [98, "T"], "\xf8" => [107, "T"], "\xf9" => [140, "T"], "\xfa" => [146, "T"], "\xfb" => [102, "T"], "\xfc" => [113, "T"], "\xfd" => [121, "T"], "\xfe" => [128, "T"], "\xff" => [12, "T"]], ["\x00" => [94, "G0"], "\x01" => [76, "G0"], "\x02" => [104, "G0"], "\x03" => [16, "G0"], "\x04" => [94, "G1"], "\x05" => [76, "G1"], "\x06" => [104, "G1"], "\x07" => [16, "G1"], "\x08" => [94, "G2"], "\t" => [76, "G2"], "\n" => [104, "G2"], "\v" => [16, "G2"], "\f" => [94, "Ga"], "\r" => [76, "Ga"], "\x0e" => [104, "Ga"], "\x0f" => [16, "Ga"], "\x10" => [94, "Gc"], "\x11" => [76, "Gc"], "\x12" => [104, "Gc"], "\x13" => [16, "Gc"], "\x14" => [94, "Ge"], "\x15" => [76, "Ge"], "\x16" => [104, "Ge"], "\x17" => [16, "Ge"], "\x18" => [94, "Gi"], "\x19" => [76, "Gi"], "\x1a" => [104, "Gi"], "\x1b" => [16, "Gi"], "\x1c" => [94, "Go"], "\x1d" => [76, "Go"], "\x1e" => [104, "Go"], "\x1f" => [16, "Go"], " " => [94, "Gs"], "!" => [76, "Gs"], "\"" => [104, "Gs"], "#" => [16, "Gs"], "\$" => [94, "Gt"], "%" => [76, "Gt"], "&" => [104, "Gt"], "'" => [16, "Gt"], "(" => [77, "G "], ")" => [18, "G "], "*" => [77, "G%"], "+" => [18, "G%"], "," => [77, "G-"], "-" => [18, "G-"], "." => [77, "G."], "/" => [18, "G."], [77, "G/"], [18, "G/"], [77, "G3"], [18, "G3"], [77, "G4"], [18, "G4"], [77, "G5"], [18, "G5"], [77, "G6"], [18, "G6"], ":" => [77, "G7"], ";" => [18, "G7"], "<" => [77, "G8"], "=" => [18, "G8"], ">" => [77, "G9"], "?" => [18, "G9"], "@" => [77, "G="], "A" => [18, "G="], "B" => [77, "GA"], "C" => [18, "GA"], "D" => [77, "G_"], "E" => [18, "G_"], "F" => [77, "Gb"], "G" => [18, "Gb"], "H" => [77, "Gd"], "I" => [18, "Gd"], "J" => [77, "Gf"], "K" => [18, "Gf"], "L" => [77, "Gg"], "M" => [18, "Gg"], "N" => [77, "Gh"], "O" => [18, "Gh"], "P" => [77, "Gl"], "Q" => [18, "Gl"], "R" => [77, "Gm"], "S" => [18, "Gm"], "T" => [77, "Gn"], "U" => [18, "Gn"], "V" => [77, "Gp"], "W" => [18, "Gp"], "X" => [77, "Gr"], "Y" => [18, "Gr"], "Z" => [77, "Gu"], "[" => [18, "Gu"], "\\" => [0, "G:"], "]" => [0, "GB"], "^" => [0, "GC"], "_" => [0, "GD"], "`" => [0, "GE"], "a" => [0, "GF"], "b" => [0, "GG"], "c" => [0, "GH"], "d" => [0, "GI"], "e" => [0, "GJ"], "f" => [0, "GK"], "g" => [0, "GL"], "h" => [0, "GM"], "i" => [0, "GN"], "j" => [0, "GO"], "k" => [0, "GP"], "l" => [0, "GQ"], "m" => [0, "GR"], "n" => [0, "GS"], "o" => [0, "GT"], "p" => [0, "GU"], "q" => [0, "GV"], "r" => [0, "GW"], "s" => [0, "GY"], "t" => [0, "Gj"], "u" => [0, "Gk"], "v" => [0, "Gq"], "w" => [0, "Gv"], "x" => [0, "Gw"], "y" => [0, "Gx"], "z" => [0, "Gy"], "{" => [0, "Gz"], "|" => [82, "G"], "}" => [87, "G"], "~" => [130, "G"], "" => [9, "G"], "\x80" => [94, "H0"], "\x81" => [76, "H0"], "\x82" => [104, "H0"], "\x83" => [16, "H0"], "\x84" => [94, "H1"], "\x85" => [76, "H1"], "\x86" => [104, "H1"], "\x87" => [16, "H1"], "\x88" => [94, "H2"], "\x89" => [76, "H2"], "\x8a" => [104, "H2"], "\x8b" => [16, "H2"], "\x8c" => [94, "Ha"], "\x8d" => [76, "Ha"], "\x8e" => [104, "Ha"], "\x8f" => [16, "Ha"], "\x90" => [94, "Hc"], "\x91" => [76, "Hc"], "\x92" => [104, "Hc"], "\x93" => [16, "Hc"], "\x94" => [94, "He"], "\x95" => [76, "He"], "\x96" => [104, "He"], "\x97" => [16, "He"], "\x98" => [94, "Hi"], "\x99" => [76, "Hi"], "\x9a" => [104, "Hi"], "\x9b" => [16, "Hi"], "\x9c" => [94, "Ho"], "\x9d" => [76, "Ho"], "\x9e" => [104, "Ho"], "\x9f" => [16, "Ho"], "\xa0" => [94, "Hs"], "\xa1" => [76, "Hs"], "\xa2" => [104, "Hs"], "\xa3" => [16, "Hs"], "\xa4" => [94, "Ht"], "\xa5" => [76, "Ht"], "\xa6" => [104, "Ht"], "\xa7" => [16, "Ht"], "\xa8" => [77, "H "], "\xa9" => [18, "H "], "\xaa" => [77, "H%"], "\xab" => [18, "H%"], "\xac" => [77, "H-"], "\xad" => [18, "H-"], "\xae" => [77, "H."], "\xaf" => [18, "H."], "\xb0" => [77, "H/"], "\xb1" => [18, "H/"], "\xb2" => [77, "H3"], "\xb3" => [18, "H3"], "\xb4" => [77, "H4"], "\xb5" => [18, "H4"], "\xb6" => [77, "H5"], "\xb7" => [18, "H5"], "\xb8" => [77, "H6"], "\xb9" => [18, "H6"], "\xba" => [77, "H7"], "\xbb" => [18, "H7"], "\xbc" => [77, "H8"], "\xbd" => [18, "H8"], "\xbe" => [77, "H9"], "\xbf" => [18, "H9"], "\xc0" => [77, "H="], "\xc1" => [18, "H="], "\xc2" => [77, "HA"], "\xc3" => [18, "HA"], "\xc4" => [77, "H_"], "\xc5" => [18, "H_"], "\xc6" => [77, "Hb"], "\xc7" => [18, "Hb"], "\xc8" => [77, "Hd"], "\xc9" => [18, "Hd"], "\xca" => [77, "Hf"], "\xcb" => [18, "Hf"], "\xcc" => [77, "Hg"], "\xcd" => [18, "Hg"], "\xce" => [77, "Hh"], "\xcf" => [18, "Hh"], "\xd0" => [77, "Hl"], "\xd1" => [18, "Hl"], "\xd2" => [77, "Hm"], "\xd3" => [18, "Hm"], "\xd4" => [77, "Hn"], "\xd5" => [18, "Hn"], "\xd6" => [77, "Hp"], "\xd7" => [18, "Hp"], "\xd8" => [77, "Hr"], "\xd9" => [18, "Hr"], "\xda" => [77, "Hu"], "\xdb" => [18, "Hu"], "\xdc" => [0, "H:"], "\xdd" => [0, "HB"], "\xde" => [0, "HC"], "\xdf" => [0, "HD"], "\xe0" => [0, "HE"], "\xe1" => [0, "HF"], "\xe2" => [0, "HG"], "\xe3" => [0, "HH"], "\xe4" => [0, "HI"], "\xe5" => [0, "HJ"], "\xe6" => [0, "HK"], "\xe7" => [0, "HL"], "\xe8" => [0, "HM"], "\xe9" => [0, "HN"], "\xea" => [0, "HO"], "\xeb" => [0, "HP"], "\xec" => [0, "HQ"], "\xed" => [0, "HR"], "\xee" => [0, "HS"], "\xef" => [0, "HT"], "\xf0" => [0, "HU"], "\xf1" => [0, "HV"], "\xf2" => [0, "HW"], "\xf3" => [0, "HY"], "\xf4" => [0, "Hj"], "\xf5" => [0, "Hk"], "\xf6" => [0, "Hq"], "\xf7" => [0, "Hv"], "\xf8" => [0, "Hw"], "\xf9" => [0, "Hx"], "\xfa" => [0, "Hy"], "\xfb" => [0, "Hz"], "\xfc" => [82, "H"], "\xfd" => [87, "H"], "\xfe" => [130, "H"], "\xff" => [9, "H"]], ["\x00" => [94, "I0"], "\x01" => [76, "I0"], "\x02" => [104, "I0"], "\x03" => [16, "I0"], "\x04" => [94, "I1"], "\x05" => [76, "I1"], "\x06" => [104, "I1"], "\x07" => [16, "I1"], "\x08" => [94, "I2"], "\t" => [76, "I2"], "\n" => [104, "I2"], "\v" => [16, "I2"], "\f" => [94, "Ia"], "\r" => [76, "Ia"], "\x0e" => [104, "Ia"], "\x0f" => [16, "Ia"], "\x10" => [94, "Ic"], "\x11" => [76, "Ic"], "\x12" => [104, "Ic"], "\x13" => [16, "Ic"], "\x14" => [94, "Ie"], "\x15" => [76, "Ie"], "\x16" => [104, "Ie"], "\x17" => [16, "Ie"], "\x18" => [94, "Ii"], "\x19" => [76, "Ii"], "\x1a" => [104, "Ii"], "\x1b" => [16, "Ii"], "\x1c" => [94, "Io"], "\x1d" => [76, "Io"], "\x1e" => [104, "Io"], "\x1f" => [16, "Io"], " " => [94, "Is"], "!" => [76, "Is"], "\"" => [104, "Is"], "#" => [16, "Is"], "\$" => [94, "It"], "%" => [76, "It"], "&" => [104, "It"], "'" => [16, "It"], "(" => [77, "I "], ")" => [18, "I "], "*" => [77, "I%"], "+" => [18, "I%"], "," => [77, "I-"], "-" => [18, "I-"], "." => [77, "I."], "/" => [18, "I."], [77, "I/"], [18, "I/"], [77, "I3"], [18, "I3"], [77, "I4"], [18, "I4"], [77, "I5"], [18, "I5"], [77, "I6"], [18, "I6"], ":" => [77, "I7"], ";" => [18, "I7"], "<" => [77, "I8"], "=" => [18, "I8"], ">" => [77, "I9"], "?" => [18, "I9"], "@" => [77, "I="], "A" => [18, "I="], "B" => [77, "IA"], "C" => [18, "IA"], "D" => [77, "I_"], "E" => [18, "I_"], "F" => [77, "Ib"], "G" => [18, "Ib"], "H" => [77, "Id"], "I" => [18, "Id"], "J" => [77, "If"], "K" => [18, "If"], "L" => [77, "Ig"], "M" => [18, "Ig"], "N" => [77, "Ih"], "O" => [18, "Ih"], "P" => [77, "Il"], "Q" => [18, "Il"], "R" => [77, "Im"], "S" => [18, "Im"], "T" => [77, "In"], "U" => [18, "In"], "V" => [77, "Ip"], "W" => [18, "Ip"], "X" => [77, "Ir"], "Y" => [18, "Ir"], "Z" => [77, "Iu"], "[" => [18, "Iu"], "\\" => [0, "I:"], "]" => [0, "IB"], "^" => [0, "IC"], "_" => [0, "ID"], "`" => [0, "IE"], "a" => [0, "IF"], "b" => [0, "IG"], "c" => [0, "IH"], "d" => [0, "II"], "e" => [0, "IJ"], "f" => [0, "IK"], "g" => [0, "IL"], "h" => [0, "IM"], "i" => [0, "IN"], "j" => [0, "IO"], "k" => [0, "IP"], "l" => [0, "IQ"], "m" => [0, "IR"], "n" => [0, "IS"], "o" => [0, "IT"], "p" => [0, "IU"], "q" => [0, "IV"], "r" => [0, "IW"], "s" => [0, "IY"], "t" => [0, "Ij"], "u" => [0, "Ik"], "v" => [0, "Iq"], "w" => [0, "Iv"], "x" => [0, "Iw"], "y" => [0, "Ix"], "z" => [0, "Iy"], "{" => [0, "Iz"], "|" => [82, "I"], "}" => [87, "I"], "~" => [130, "I"], "" => [9, "I"], "\x80" => [94, "J0"], "\x81" => [76, "J0"], "\x82" => [104, "J0"], "\x83" => [16, "J0"], "\x84" => [94, "J1"], "\x85" => [76, "J1"], "\x86" => [104, "J1"], "\x87" => [16, "J1"], "\x88" => [94, "J2"], "\x89" => [76, "J2"], "\x8a" => [104, "J2"], "\x8b" => [16, "J2"], "\x8c" => [94, "Ja"], "\x8d" => [76, "Ja"], "\x8e" => [104, "Ja"], "\x8f" => [16, "Ja"], "\x90" => [94, "Jc"], "\x91" => [76, "Jc"], "\x92" => [104, "Jc"], "\x93" => [16, "Jc"], "\x94" => [94, "Je"], "\x95" => [76, "Je"], "\x96" => [104, "Je"], "\x97" => [16, "Je"], "\x98" => [94, "Ji"], "\x99" => [76, "Ji"], "\x9a" => [104, "Ji"], "\x9b" => [16, "Ji"], "\x9c" => [94, "Jo"], "\x9d" => [76, "Jo"], "\x9e" => [104, "Jo"], "\x9f" => [16, "Jo"], "\xa0" => [94, "Js"], "\xa1" => [76, "Js"], "\xa2" => [104, "Js"], "\xa3" => [16, "Js"], "\xa4" => [94, "Jt"], "\xa5" => [76, "Jt"], "\xa6" => [104, "Jt"], "\xa7" => [16, "Jt"], "\xa8" => [77, "J "], "\xa9" => [18, "J "], "\xaa" => [77, "J%"], "\xab" => [18, "J%"], "\xac" => [77, "J-"], "\xad" => [18, "J-"], "\xae" => [77, "J."], "\xaf" => [18, "J."], "\xb0" => [77, "J/"], "\xb1" => [18, "J/"], "\xb2" => [77, "J3"], "\xb3" => [18, "J3"], "\xb4" => [77, "J4"], "\xb5" => [18, "J4"], "\xb6" => [77, "J5"], "\xb7" => [18, "J5"], "\xb8" => [77, "J6"], "\xb9" => [18, "J6"], "\xba" => [77, "J7"], "\xbb" => [18, "J7"], "\xbc" => [77, "J8"], "\xbd" => [18, "J8"], "\xbe" => [77, "J9"], "\xbf" => [18, "J9"], "\xc0" => [77, "J="], "\xc1" => [18, "J="], "\xc2" => [77, "JA"], "\xc3" => [18, "JA"], "\xc4" => [77, "J_"], "\xc5" => [18, "J_"], "\xc6" => [77, "Jb"], "\xc7" => [18, "Jb"], "\xc8" => [77, "Jd"], "\xc9" => [18, "Jd"], "\xca" => [77, "Jf"], "\xcb" => [18, "Jf"], "\xcc" => [77, "Jg"], "\xcd" => [18, "Jg"], "\xce" => [77, "Jh"], "\xcf" => [18, "Jh"], "\xd0" => [77, "Jl"], "\xd1" => [18, "Jl"], "\xd2" => [77, "Jm"], "\xd3" => [18, "Jm"], "\xd4" => [77, "Jn"], "\xd5" => [18, "Jn"], "\xd6" => [77, "Jp"], "\xd7" => [18, "Jp"], "\xd8" => [77, "Jr"], "\xd9" => [18, "Jr"], "\xda" => [77, "Ju"], "\xdb" => [18, "Ju"], "\xdc" => [0, "J:"], "\xdd" => [0, "JB"], "\xde" => [0, "JC"], "\xdf" => [0, "JD"], "\xe0" => [0, "JE"], "\xe1" => [0, "JF"], "\xe2" => [0, "JG"], "\xe3" => [0, "JH"], "\xe4" => [0, "JI"], "\xe5" => [0, "JJ"], "\xe6" => [0, "JK"], "\xe7" => [0, "JL"], "\xe8" => [0, "JM"], "\xe9" => [0, "JN"], "\xea" => [0, "JO"], "\xeb" => [0, "JP"], "\xec" => [0, "JQ"], "\xed" => [0, "JR"], "\xee" => [0, "JS"], "\xef" => [0, "JT"], "\xf0" => [0, "JU"], "\xf1" => [0, "JV"], "\xf2" => [0, "JW"], "\xf3" => [0, "JY"], "\xf4" => [0, "Jj"], "\xf5" => [0, "Jk"], "\xf6" => [0, "Jq"], "\xf7" => [0, "Jv"], "\xf8" => [0, "Jw"], "\xf9" => [0, "Jx"], "\xfa" => [0, "Jy"], "\xfb" => [0, "Jz"], "\xfc" => [82, "J"], "\xfd" => [87, "J"], "\xfe" => [130, "J"], "\xff" => [9, "J"]], ["\x00" => [77, "I0"], "\x01" => [18, "I0"], "\x02" => [77, "I1"], "\x03" => [18, "I1"], "\x04" => [77, "I2"], "\x05" => [18, "I2"], "\x06" => [77, "Ia"], "\x07" => [18, "Ia"], "\x08" => [77, "Ic"], "\t" => [18, "Ic"], "\n" => [77, "Ie"], "\v" => [18, "Ie"], "\f" => [77, "Ii"], "\r" => [18, "Ii"], "\x0e" => [77, "Io"], "\x0f" => [18, "Io"], "\x10" => [77, "Is"], "\x11" => [18, "Is"], "\x12" => [77, "It"], "\x13" => [18, "It"], "\x14" => [0, "I "], "\x15" => [0, "I%"], "\x16" => [0, "I-"], "\x17" => [0, "I."], "\x18" => [0, "I/"], "\x19" => [0, "I3"], "\x1a" => [0, "I4"], "\x1b" => [0, "I5"], "\x1c" => [0, "I6"], "\x1d" => [0, "I7"], "\x1e" => [0, "I8"], "\x1f" => [0, "I9"], " " => [0, "I="], "!" => [0, "IA"], "\"" => [0, "I_"], "#" => [0, "Ib"], "\$" => [0, "Id"], "%" => [0, "If"], "&" => [0, "Ig"], "'" => [0, "Ih"], "(" => [0, "Il"], ")" => [0, "Im"], "*" => [0, "In"], "+" => [0, "Ip"], "," => [0, "Ir"], "-" => [0, "Iu"], "." => [100, "I"], "/" => [110, "I"], [111, "I"], [115, "I"], [116, "I"], [118, "I"], [119, "I"], [122, "I"], [123, "I"], [125, "I"], [126, "I"], [129, "I"], ":" => [143, "I"], ";" => [148, "I"], "<" => [151, "I"], "=" => [153, "I"], ">" => [83, "I"], "?" => [10, "I"], "@" => [77, "J0"], "A" => [18, "J0"], "B" => [77, "J1"], "C" => [18, "J1"], "D" => [77, "J2"], "E" => [18, "J2"], "F" => [77, "Ja"], "G" => [18, "Ja"], "H" => [77, "Jc"], "I" => [18, "Jc"], "J" => [77, "Je"], "K" => [18, "Je"], "L" => [77, "Ji"], "M" => [18, "Ji"], "N" => [77, "Jo"], "O" => [18, "Jo"], "P" => [77, "Js"], "Q" => [18, "Js"], "R" => [77, "Jt"], "S" => [18, "Jt"], "T" => [0, "J "], "U" => [0, "J%"], "V" => [0, "J-"], "W" => [0, "J."], "X" => [0, "J/"], "Y" => [0, "J3"], "Z" => [0, "J4"], "[" => [0, "J5"], "\\" => [0, "J6"], "]" => [0, "J7"], "^" => [0, "J8"], "_" => [0, "J9"], "`" => [0, "J="], "a" => [0, "JA"], "b" => [0, "J_"], "c" => [0, "Jb"], "d" => [0, "Jd"], "e" => [0, "Jf"], "f" => [0, "Jg"], "g" => [0, "Jh"], "h" => [0, "Jl"], "i" => [0, "Jm"], "j" => [0, "Jn"], "k" => [0, "Jp"], "l" => [0, "Jr"], "m" => [0, "Ju"], "n" => [100, "J"], "o" => [110, "J"], "p" => [111, "J"], "q" => [115, "J"], "r" => [116, "J"], "s" => [118, "J"], "t" => [119, "J"], "u" => [122, "J"], "v" => [123, "J"], "w" => [125, "J"], "x" => [126, "J"], "y" => [129, "J"], "z" => [143, "J"], "{" => [148, "J"], "|" => [151, "J"], "}" => [153, "J"], "~" => [83, "J"], "" => [10, "J"], "\x80" => [77, "K0"], "\x81" => [18, "K0"], "\x82" => [77, "K1"], "\x83" => [18, "K1"], "\x84" => [77, "K2"], "\x85" => [18, "K2"], "\x86" => [77, "Ka"], "\x87" => [18, "Ka"], "\x88" => [77, "Kc"], "\x89" => [18, "Kc"], "\x8a" => [77, "Ke"], "\x8b" => [18, "Ke"], "\x8c" => [77, "Ki"], "\x8d" => [18, "Ki"], "\x8e" => [77, "Ko"], "\x8f" => [18, "Ko"], "\x90" => [77, "Ks"], "\x91" => [18, "Ks"], "\x92" => [77, "Kt"], "\x93" => [18, "Kt"], "\x94" => [0, "K "], "\x95" => [0, "K%"], "\x96" => [0, "K-"], "\x97" => [0, "K."], "\x98" => [0, "K/"], "\x99" => [0, "K3"], "\x9a" => [0, "K4"], "\x9b" => [0, "K5"], "\x9c" => [0, "K6"], "\x9d" => [0, "K7"], "\x9e" => [0, "K8"], "\x9f" => [0, "K9"], "\xa0" => [0, "K="], "\xa1" => [0, "KA"], "\xa2" => [0, "K_"], "\xa3" => [0, "Kb"], "\xa4" => [0, "Kd"], "\xa5" => [0, "Kf"], "\xa6" => [0, "Kg"], "\xa7" => [0, "Kh"], "\xa8" => [0, "Kl"], "\xa9" => [0, "Km"], "\xaa" => [0, "Kn"], "\xab" => [0, "Kp"], "\xac" => [0, "Kr"], "\xad" => [0, "Ku"], "\xae" => [100, "K"], "\xaf" => [110, "K"], "\xb0" => [111, "K"], "\xb1" => [115, "K"], "\xb2" => [116, "K"], "\xb3" => [118, "K"], "\xb4" => [119, "K"], "\xb5" => [122, "K"], "\xb6" => [123, "K"], "\xb7" => [125, "K"], "\xb8" => [126, "K"], "\xb9" => [129, "K"], "\xba" => [143, "K"], "\xbb" => [148, "K"], "\xbc" => [151, "K"], "\xbd" => [153, "K"], "\xbe" => [83, "K"], "\xbf" => [10, "K"], "\xc0" => [77, "L0"], "\xc1" => [18, "L0"], "\xc2" => [77, "L1"], "\xc3" => [18, "L1"], "\xc4" => [77, "L2"], "\xc5" => [18, "L2"], "\xc6" => [77, "La"], "\xc7" => [18, "La"], "\xc8" => [77, "Lc"], "\xc9" => [18, "Lc"], "\xca" => [77, "Le"], "\xcb" => [18, "Le"], "\xcc" => [77, "Li"], "\xcd" => [18, "Li"], "\xce" => [77, "Lo"], "\xcf" => [18, "Lo"], "\xd0" => [77, "Ls"], "\xd1" => [18, "Ls"], "\xd2" => [77, "Lt"], "\xd3" => [18, "Lt"], "\xd4" => [0, "L "], "\xd5" => [0, "L%"], "\xd6" => [0, "L-"], "\xd7" => [0, "L."], "\xd8" => [0, "L/"], "\xd9" => [0, "L3"], "\xda" => [0, "L4"], "\xdb" => [0, "L5"], "\xdc" => [0, "L6"], "\xdd" => [0, "L7"], "\xde" => [0, "L8"], "\xdf" => [0, "L9"], "\xe0" => [0, "L="], "\xe1" => [0, "LA"], "\xe2" => [0, "L_"], "\xe3" => [0, "Lb"], "\xe4" => [0, "Ld"], "\xe5" => [0, "Lf"], "\xe6" => [0, "Lg"], "\xe7" => [0, "Lh"], "\xe8" => [0, "Ll"], "\xe9" => [0, "Lm"], "\xea" => [0, "Ln"], "\xeb" => [0, "Lp"], "\xec" => [0, "Lr"], "\xed" => [0, "Lu"], "\xee" => [100, "L"], "\xef" => [110, "L"], "\xf0" => [111, "L"], "\xf1" => [115, "L"], "\xf2" => [116, "L"], "\xf3" => [118, "L"], "\xf4" => [119, "L"], "\xf5" => [122, "L"], "\xf6" => [123, "L"], "\xf7" => [125, "L"], "\xf8" => [126, "L"], "\xf9" => [129, "L"], "\xfa" => [143, "L"], "\xfb" => [148, "L"], "\xfc" => [151, "L"], "\xfd" => [153, "L"], "\xfe" => [83, "L"], "\xff" => [10, "L"]], ["\x00" => [94, "K0"], "\x01" => [76, "K0"], "\x02" => [104, "K0"], "\x03" => [16, "K0"], "\x04" => [94, "K1"], "\x05" => [76, "K1"], "\x06" => [104, "K1"], "\x07" => [16, "K1"], "\x08" => [94, "K2"], "\t" => [76, "K2"], "\n" => [104, "K2"], "\v" => [16, "K2"], "\f" => [94, "Ka"], "\r" => [76, "Ka"], "\x0e" => [104, "Ka"], "\x0f" => [16, "Ka"], "\x10" => [94, "Kc"], "\x11" => [76, "Kc"], "\x12" => [104, "Kc"], "\x13" => [16, "Kc"], "\x14" => [94, "Ke"], "\x15" => [76, "Ke"], "\x16" => [104, "Ke"], "\x17" => [16, "Ke"], "\x18" => [94, "Ki"], "\x19" => [76, "Ki"], "\x1a" => [104, "Ki"], "\x1b" => [16, "Ki"], "\x1c" => [94, "Ko"], "\x1d" => [76, "Ko"], "\x1e" => [104, "Ko"], "\x1f" => [16, "Ko"], " " => [94, "Ks"], "!" => [76, "Ks"], "\"" => [104, "Ks"], "#" => [16, "Ks"], "\$" => [94, "Kt"], "%" => [76, "Kt"], "&" => [104, "Kt"], "'" => [16, "Kt"], "(" => [77, "K "], ")" => [18, "K "], "*" => [77, "K%"], "+" => [18, "K%"], "," => [77, "K-"], "-" => [18, "K-"], "." => [77, "K."], "/" => [18, "K."], [77, "K/"], [18, "K/"], [77, "K3"], [18, "K3"], [77, "K4"], [18, "K4"], [77, "K5"], [18, "K5"], [77, "K6"], [18, "K6"], ":" => [77, "K7"], ";" => [18, "K7"], "<" => [77, "K8"], "=" => [18, "K8"], ">" => [77, "K9"], "?" => [18, "K9"], "@" => [77, "K="], "A" => [18, "K="], "B" => [77, "KA"], "C" => [18, "KA"], "D" => [77, "K_"], "E" => [18, "K_"], "F" => [77, "Kb"], "G" => [18, "Kb"], "H" => [77, "Kd"], "I" => [18, "Kd"], "J" => [77, "Kf"], "K" => [18, "Kf"], "L" => [77, "Kg"], "M" => [18, "Kg"], "N" => [77, "Kh"], "O" => [18, "Kh"], "P" => [77, "Kl"], "Q" => [18, "Kl"], "R" => [77, "Km"], "S" => [18, "Km"], "T" => [77, "Kn"], "U" => [18, "Kn"], "V" => [77, "Kp"], "W" => [18, "Kp"], "X" => [77, "Kr"], "Y" => [18, "Kr"], "Z" => [77, "Ku"], "[" => [18, "Ku"], "\\" => [0, "K:"], "]" => [0, "KB"], "^" => [0, "KC"], "_" => [0, "KD"], "`" => [0, "KE"], "a" => [0, "KF"], "b" => [0, "KG"], "c" => [0, "KH"], "d" => [0, "KI"], "e" => [0, "KJ"], "f" => [0, "KK"], "g" => [0, "KL"], "h" => [0, "KM"], "i" => [0, "KN"], "j" => [0, "KO"], "k" => [0, "KP"], "l" => [0, "KQ"], "m" => [0, "KR"], "n" => [0, "KS"], "o" => [0, "KT"], "p" => [0, "KU"], "q" => [0, "KV"], "r" => [0, "KW"], "s" => [0, "KY"], "t" => [0, "Kj"], "u" => [0, "Kk"], "v" => [0, "Kq"], "w" => [0, "Kv"], "x" => [0, "Kw"], "y" => [0, "Kx"], "z" => [0, "Ky"], "{" => [0, "Kz"], "|" => [82, "K"], "}" => [87, "K"], "~" => [130, "K"], "" => [9, "K"], "\x80" => [94, "L0"], "\x81" => [76, "L0"], "\x82" => [104, "L0"], "\x83" => [16, "L0"], "\x84" => [94, "L1"], "\x85" => [76, "L1"], "\x86" => [104, "L1"], "\x87" => [16, "L1"], "\x88" => [94, "L2"], "\x89" => [76, "L2"], "\x8a" => [104, "L2"], "\x8b" => [16, "L2"], "\x8c" => [94, "La"], "\x8d" => [76, "La"], "\x8e" => [104, "La"], "\x8f" => [16, "La"], "\x90" => [94, "Lc"], "\x91" => [76, "Lc"], "\x92" => [104, "Lc"], "\x93" => [16, "Lc"], "\x94" => [94, "Le"], "\x95" => [76, "Le"], "\x96" => [104, "Le"], "\x97" => [16, "Le"], "\x98" => [94, "Li"], "\x99" => [76, "Li"], "\x9a" => [104, "Li"], "\x9b" => [16, "Li"], "\x9c" => [94, "Lo"], "\x9d" => [76, "Lo"], "\x9e" => [104, "Lo"], "\x9f" => [16, "Lo"], "\xa0" => [94, "Ls"], "\xa1" => [76, "Ls"], "\xa2" => [104, "Ls"], "\xa3" => [16, "Ls"], "\xa4" => [94, "Lt"], "\xa5" => [76, "Lt"], "\xa6" => [104, "Lt"], "\xa7" => [16, "Lt"], "\xa8" => [77, "L "], "\xa9" => [18, "L "], "\xaa" => [77, "L%"], "\xab" => [18, "L%"], "\xac" => [77, "L-"], "\xad" => [18, "L-"], "\xae" => [77, "L."], "\xaf" => [18, "L."], "\xb0" => [77, "L/"], "\xb1" => [18, "L/"], "\xb2" => [77, "L3"], "\xb3" => [18, "L3"], "\xb4" => [77, "L4"], "\xb5" => [18, "L4"], "\xb6" => [77, "L5"], "\xb7" => [18, "L5"], "\xb8" => [77, "L6"], "\xb9" => [18, "L6"], "\xba" => [77, "L7"], "\xbb" => [18, "L7"], "\xbc" => [77, "L8"], "\xbd" => [18, "L8"], "\xbe" => [77, "L9"], "\xbf" => [18, "L9"], "\xc0" => [77, "L="], "\xc1" => [18, "L="], "\xc2" => [77, "LA"], "\xc3" => [18, "LA"], "\xc4" => [77, "L_"], "\xc5" => [18, "L_"], "\xc6" => [77, "Lb"], "\xc7" => [18, "Lb"], "\xc8" => [77, "Ld"], "\xc9" => [18, "Ld"], "\xca" => [77, "Lf"], "\xcb" => [18, "Lf"], "\xcc" => [77, "Lg"], "\xcd" => [18, "Lg"], "\xce" => [77, "Lh"], "\xcf" => [18, "Lh"], "\xd0" => [77, "Ll"], "\xd1" => [18, "Ll"], "\xd2" => [77, "Lm"], "\xd3" => [18, "Lm"], "\xd4" => [77, "Ln"], "\xd5" => [18, "Ln"], "\xd6" => [77, "Lp"], "\xd7" => [18, "Lp"], "\xd8" => [77, "Lr"], "\xd9" => [18, "Lr"], "\xda" => [77, "Lu"], "\xdb" => [18, "Lu"], "\xdc" => [0, "L:"], "\xdd" => [0, "LB"], "\xde" => [0, "LC"], "\xdf" => [0, "LD"], "\xe0" => [0, "LE"], "\xe1" => [0, "LF"], "\xe2" => [0, "LG"], "\xe3" => [0, "LH"], "\xe4" => [0, "LI"], "\xe5" => [0, "LJ"], "\xe6" => [0, "LK"], "\xe7" => [0, "LL"], "\xe8" => [0, "LM"], "\xe9" => [0, "LN"], "\xea" => [0, "LO"], "\xeb" => [0, "LP"], "\xec" => [0, "LQ"], "\xed" => [0, "LR"], "\xee" => [0, "LS"], "\xef" => [0, "LT"], "\xf0" => [0, "LU"], "\xf1" => [0, "LV"], "\xf2" => [0, "LW"], "\xf3" => [0, "LY"], "\xf4" => [0, "Lj"], "\xf5" => [0, "Lk"], "\xf6" => [0, "Lq"], "\xf7" => [0, "Lv"], "\xf8" => [0, "Lw"], "\xf9" => [0, "Lx"], "\xfa" => [0, "Ly"], "\xfb" => [0, "Lz"], "\xfc" => [82, "L"], "\xfd" => [87, "L"], "\xfe" => [130, "L"], "\xff" => [9, "L"]], ["\x00" => [94, "M0"], "\x01" => [76, "M0"], "\x02" => [104, "M0"], "\x03" => [16, "M0"], "\x04" => [94, "M1"], "\x05" => [76, "M1"], "\x06" => [104, "M1"], "\x07" => [16, "M1"], "\x08" => [94, "M2"], "\t" => [76, "M2"], "\n" => [104, "M2"], "\v" => [16, "M2"], "\f" => [94, "Ma"], "\r" => [76, "Ma"], "\x0e" => [104, "Ma"], "\x0f" => [16, "Ma"], "\x10" => [94, "Mc"], "\x11" => [76, "Mc"], "\x12" => [104, "Mc"], "\x13" => [16, "Mc"], "\x14" => [94, "Me"], "\x15" => [76, "Me"], "\x16" => [104, "Me"], "\x17" => [16, "Me"], "\x18" => [94, "Mi"], "\x19" => [76, "Mi"], "\x1a" => [104, "Mi"], "\x1b" => [16, "Mi"], "\x1c" => [94, "Mo"], "\x1d" => [76, "Mo"], "\x1e" => [104, "Mo"], "\x1f" => [16, "Mo"], " " => [94, "Ms"], "!" => [76, "Ms"], "\"" => [104, "Ms"], "#" => [16, "Ms"], "\$" => [94, "Mt"], "%" => [76, "Mt"], "&" => [104, "Mt"], "'" => [16, "Mt"], "(" => [77, "M "], ")" => [18, "M "], "*" => [77, "M%"], "+" => [18, "M%"], "," => [77, "M-"], "-" => [18, "M-"], "." => [77, "M."], "/" => [18, "M."], [77, "M/"], [18, "M/"], [77, "M3"], [18, "M3"], [77, "M4"], [18, "M4"], [77, "M5"], [18, "M5"], [77, "M6"], [18, "M6"], ":" => [77, "M7"], ";" => [18, "M7"], "<" => [77, "M8"], "=" => [18, "M8"], ">" => [77, "M9"], "?" => [18, "M9"], "@" => [77, "M="], "A" => [18, "M="], "B" => [77, "MA"], "C" => [18, "MA"], "D" => [77, "M_"], "E" => [18, "M_"], "F" => [77, "Mb"], "G" => [18, "Mb"], "H" => [77, "Md"], "I" => [18, "Md"], "J" => [77, "Mf"], "K" => [18, "Mf"], "L" => [77, "Mg"], "M" => [18, "Mg"], "N" => [77, "Mh"], "O" => [18, "Mh"], "P" => [77, "Ml"], "Q" => [18, "Ml"], "R" => [77, "Mm"], "S" => [18, "Mm"], "T" => [77, "Mn"], "U" => [18, "Mn"], "V" => [77, "Mp"], "W" => [18, "Mp"], "X" => [77, "Mr"], "Y" => [18, "Mr"], "Z" => [77, "Mu"], "[" => [18, "Mu"], "\\" => [0, "M:"], "]" => [0, "MB"], "^" => [0, "MC"], "_" => [0, "MD"], "`" => [0, "ME"], "a" => [0, "MF"], "b" => [0, "MG"], "c" => [0, "MH"], "d" => [0, "MI"], "e" => [0, "MJ"], "f" => [0, "MK"], "g" => [0, "ML"], "h" => [0, "MM"], "i" => [0, "MN"], "j" => [0, "MO"], "k" => [0, "MP"], "l" => [0, "MQ"], "m" => [0, "MR"], "n" => [0, "MS"], "o" => [0, "MT"], "p" => [0, "MU"], "q" => [0, "MV"], "r" => [0, "MW"], "s" => [0, "MY"], "t" => [0, "Mj"], "u" => [0, "Mk"], "v" => [0, "Mq"], "w" => [0, "Mv"], "x" => [0, "Mw"], "y" => [0, "Mx"], "z" => [0, "My"], "{" => [0, "Mz"], "|" => [82, "M"], "}" => [87, "M"], "~" => [130, "M"], "" => [9, "M"], "\x80" => [94, "N0"], "\x81" => [76, "N0"], "\x82" => [104, "N0"], "\x83" => [16, "N0"], "\x84" => [94, "N1"], "\x85" => [76, "N1"], "\x86" => [104, "N1"], "\x87" => [16, "N1"], "\x88" => [94, "N2"], "\x89" => [76, "N2"], "\x8a" => [104, "N2"], "\x8b" => [16, "N2"], "\x8c" => [94, "Na"], "\x8d" => [76, "Na"], "\x8e" => [104, "Na"], "\x8f" => [16, "Na"], "\x90" => [94, "Nc"], "\x91" => [76, "Nc"], "\x92" => [104, "Nc"], "\x93" => [16, "Nc"], "\x94" => [94, "Ne"], "\x95" => [76, "Ne"], "\x96" => [104, "Ne"], "\x97" => [16, "Ne"], "\x98" => [94, "Ni"], "\x99" => [76, "Ni"], "\x9a" => [104, "Ni"], "\x9b" => [16, "Ni"], "\x9c" => [94, "No"], "\x9d" => [76, "No"], "\x9e" => [104, "No"], "\x9f" => [16, "No"], "\xa0" => [94, "Ns"], "\xa1" => [76, "Ns"], "\xa2" => [104, "Ns"], "\xa3" => [16, "Ns"], "\xa4" => [94, "Nt"], "\xa5" => [76, "Nt"], "\xa6" => [104, "Nt"], "\xa7" => [16, "Nt"], "\xa8" => [77, "N "], "\xa9" => [18, "N "], "\xaa" => [77, "N%"], "\xab" => [18, "N%"], "\xac" => [77, "N-"], "\xad" => [18, "N-"], "\xae" => [77, "N."], "\xaf" => [18, "N."], "\xb0" => [77, "N/"], "\xb1" => [18, "N/"], "\xb2" => [77, "N3"], "\xb3" => [18, "N3"], "\xb4" => [77, "N4"], "\xb5" => [18, "N4"], "\xb6" => [77, "N5"], "\xb7" => [18, "N5"], "\xb8" => [77, "N6"], "\xb9" => [18, "N6"], "\xba" => [77, "N7"], "\xbb" => [18, "N7"], "\xbc" => [77, "N8"], "\xbd" => [18, "N8"], "\xbe" => [77, "N9"], "\xbf" => [18, "N9"], "\xc0" => [77, "N="], "\xc1" => [18, "N="], "\xc2" => [77, "NA"], "\xc3" => [18, "NA"], "\xc4" => [77, "N_"], "\xc5" => [18, "N_"], "\xc6" => [77, "Nb"], "\xc7" => [18, "Nb"], "\xc8" => [77, "Nd"], "\xc9" => [18, "Nd"], "\xca" => [77, "Nf"], "\xcb" => [18, "Nf"], "\xcc" => [77, "Ng"], "\xcd" => [18, "Ng"], "\xce" => [77, "Nh"], "\xcf" => [18, "Nh"], "\xd0" => [77, "Nl"], "\xd1" => [18, "Nl"], "\xd2" => [77, "Nm"], "\xd3" => [18, "Nm"], "\xd4" => [77, "Nn"], "\xd5" => [18, "Nn"], "\xd6" => [77, "Np"], "\xd7" => [18, "Np"], "\xd8" => [77, "Nr"], "\xd9" => [18, "Nr"], "\xda" => [77, "Nu"], "\xdb" => [18, "Nu"], "\xdc" => [0, "N:"], "\xdd" => [0, "NB"], "\xde" => [0, "NC"], "\xdf" => [0, "ND"], "\xe0" => [0, "NE"], "\xe1" => [0, "NF"], "\xe2" => [0, "NG"], "\xe3" => [0, "NH"], "\xe4" => [0, "NI"], "\xe5" => [0, "NJ"], "\xe6" => [0, "NK"], "\xe7" => [0, "NL"], "\xe8" => [0, "NM"], "\xe9" => [0, "NN"], "\xea" => [0, "NO"], "\xeb" => [0, "NP"], "\xec" => [0, "NQ"], "\xed" => [0, "NR"], "\xee" => [0, "NS"], "\xef" => [0, "NT"], "\xf0" => [0, "NU"], "\xf1" => [0, "NV"], "\xf2" => [0, "NW"], "\xf3" => [0, "NY"], "\xf4" => [0, "Nj"], "\xf5" => [0, "Nk"], "\xf6" => [0, "Nq"], "\xf7" => [0, "Nv"], "\xf8" => [0, "Nw"], "\xf9" => [0, "Nx"], "\xfa" => [0, "Ny"], "\xfb" => [0, "Nz"], "\xfc" => [82, "N"], "\xfd" => [87, "N"], "\xfe" => [130, "N"], "\xff" => [9, "N"]], ["\x00" => [77, "M0"], "\x01" => [18, "M0"], "\x02" => [77, "M1"], "\x03" => [18, "M1"], "\x04" => [77, "M2"], "\x05" => [18, "M2"], "\x06" => [77, "Ma"], "\x07" => [18, "Ma"], "\x08" => [77, "Mc"], "\t" => [18, "Mc"], "\n" => [77, "Me"], "\v" => [18, "Me"], "\f" => [77, "Mi"], "\r" => [18, "Mi"], "\x0e" => [77, "Mo"], "\x0f" => [18, "Mo"], "\x10" => [77, "Ms"], "\x11" => [18, "Ms"], "\x12" => [77, "Mt"], "\x13" => [18, "Mt"], "\x14" => [0, "M "], "\x15" => [0, "M%"], "\x16" => [0, "M-"], "\x17" => [0, "M."], "\x18" => [0, "M/"], "\x19" => [0, "M3"], "\x1a" => [0, "M4"], "\x1b" => [0, "M5"], "\x1c" => [0, "M6"], "\x1d" => [0, "M7"], "\x1e" => [0, "M8"], "\x1f" => [0, "M9"], " " => [0, "M="], "!" => [0, "MA"], "\"" => [0, "M_"], "#" => [0, "Mb"], "\$" => [0, "Md"], "%" => [0, "Mf"], "&" => [0, "Mg"], "'" => [0, "Mh"], "(" => [0, "Ml"], ")" => [0, "Mm"], "*" => [0, "Mn"], "+" => [0, "Mp"], "," => [0, "Mr"], "-" => [0, "Mu"], "." => [100, "M"], "/" => [110, "M"], [111, "M"], [115, "M"], [116, "M"], [118, "M"], [119, "M"], [122, "M"], [123, "M"], [125, "M"], [126, "M"], [129, "M"], ":" => [143, "M"], ";" => [148, "M"], "<" => [151, "M"], "=" => [153, "M"], ">" => [83, "M"], "?" => [10, "M"], "@" => [77, "N0"], "A" => [18, "N0"], "B" => [77, "N1"], "C" => [18, "N1"], "D" => [77, "N2"], "E" => [18, "N2"], "F" => [77, "Na"], "G" => [18, "Na"], "H" => [77, "Nc"], "I" => [18, "Nc"], "J" => [77, "Ne"], "K" => [18, "Ne"], "L" => [77, "Ni"], "M" => [18, "Ni"], "N" => [77, "No"], "O" => [18, "No"], "P" => [77, "Ns"], "Q" => [18, "Ns"], "R" => [77, "Nt"], "S" => [18, "Nt"], "T" => [0, "N "], "U" => [0, "N%"], "V" => [0, "N-"], "W" => [0, "N."], "X" => [0, "N/"], "Y" => [0, "N3"], "Z" => [0, "N4"], "[" => [0, "N5"], "\\" => [0, "N6"], "]" => [0, "N7"], "^" => [0, "N8"], "_" => [0, "N9"], "`" => [0, "N="], "a" => [0, "NA"], "b" => [0, "N_"], "c" => [0, "Nb"], "d" => [0, "Nd"], "e" => [0, "Nf"], "f" => [0, "Ng"], "g" => [0, "Nh"], "h" => [0, "Nl"], "i" => [0, "Nm"], "j" => [0, "Nn"], "k" => [0, "Np"], "l" => [0, "Nr"], "m" => [0, "Nu"], "n" => [100, "N"], "o" => [110, "N"], "p" => [111, "N"], "q" => [115, "N"], "r" => [116, "N"], "s" => [118, "N"], "t" => [119, "N"], "u" => [122, "N"], "v" => [123, "N"], "w" => [125, "N"], "x" => [126, "N"], "y" => [129, "N"], "z" => [143, "N"], "{" => [148, "N"], "|" => [151, "N"], "}" => [153, "N"], "~" => [83, "N"], "" => [10, "N"], "\x80" => [77, "O0"], "\x81" => [18, "O0"], "\x82" => [77, "O1"], "\x83" => [18, "O1"], "\x84" => [77, "O2"], "\x85" => [18, "O2"], "\x86" => [77, "Oa"], "\x87" => [18, "Oa"], "\x88" => [77, "Oc"], "\x89" => [18, "Oc"], "\x8a" => [77, "Oe"], "\x8b" => [18, "Oe"], "\x8c" => [77, "Oi"], "\x8d" => [18, "Oi"], "\x8e" => [77, "Oo"], "\x8f" => [18, "Oo"], "\x90" => [77, "Os"], "\x91" => [18, "Os"], "\x92" => [77, "Ot"], "\x93" => [18, "Ot"], "\x94" => [0, "O "], "\x95" => [0, "O%"], "\x96" => [0, "O-"], "\x97" => [0, "O."], "\x98" => [0, "O/"], "\x99" => [0, "O3"], "\x9a" => [0, "O4"], "\x9b" => [0, "O5"], "\x9c" => [0, "O6"], "\x9d" => [0, "O7"], "\x9e" => [0, "O8"], "\x9f" => [0, "O9"], "\xa0" => [0, "O="], "\xa1" => [0, "OA"], "\xa2" => [0, "O_"], "\xa3" => [0, "Ob"], "\xa4" => [0, "Od"], "\xa5" => [0, "Of"], "\xa6" => [0, "Og"], "\xa7" => [0, "Oh"], "\xa8" => [0, "Ol"], "\xa9" => [0, "Om"], "\xaa" => [0, "On"], "\xab" => [0, "Op"], "\xac" => [0, "Or"], "\xad" => [0, "Ou"], "\xae" => [100, "O"], "\xaf" => [110, "O"], "\xb0" => [111, "O"], "\xb1" => [115, "O"], "\xb2" => [116, "O"], "\xb3" => [118, "O"], "\xb4" => [119, "O"], "\xb5" => [122, "O"], "\xb6" => [123, "O"], "\xb7" => [125, "O"], "\xb8" => [126, "O"], "\xb9" => [129, "O"], "\xba" => [143, "O"], "\xbb" => [148, "O"], "\xbc" => [151, "O"], "\xbd" => [153, "O"], "\xbe" => [83, "O"], "\xbf" => [10, "O"], "\xc0" => [77, "P0"], "\xc1" => [18, "P0"], "\xc2" => [77, "P1"], "\xc3" => [18, "P1"], "\xc4" => [77, "P2"], "\xc5" => [18, "P2"], "\xc6" => [77, "Pa"], "\xc7" => [18, "Pa"], "\xc8" => [77, "Pc"], "\xc9" => [18, "Pc"], "\xca" => [77, "Pe"], "\xcb" => [18, "Pe"], "\xcc" => [77, "Pi"], "\xcd" => [18, "Pi"], "\xce" => [77, "Po"], "\xcf" => [18, "Po"], "\xd0" => [77, "Ps"], "\xd1" => [18, "Ps"], "\xd2" => [77, "Pt"], "\xd3" => [18, "Pt"], "\xd4" => [0, "P "], "\xd5" => [0, "P%"], "\xd6" => [0, "P-"], "\xd7" => [0, "P."], "\xd8" => [0, "P/"], "\xd9" => [0, "P3"], "\xda" => [0, "P4"], "\xdb" => [0, "P5"], "\xdc" => [0, "P6"], "\xdd" => [0, "P7"], "\xde" => [0, "P8"], "\xdf" => [0, "P9"], "\xe0" => [0, "P="], "\xe1" => [0, "PA"], "\xe2" => [0, "P_"], "\xe3" => [0, "Pb"], "\xe4" => [0, "Pd"], "\xe5" => [0, "Pf"], "\xe6" => [0, "Pg"], "\xe7" => [0, "Ph"], "\xe8" => [0, "Pl"], "\xe9" => [0, "Pm"], "\xea" => [0, "Pn"], "\xeb" => [0, "Pp"], "\xec" => [0, "Pr"], "\xed" => [0, "Pu"], "\xee" => [100, "P"], "\xef" => [110, "P"], "\xf0" => [111, "P"], "\xf1" => [115, "P"], "\xf2" => [116, "P"], "\xf3" => [118, "P"], "\xf4" => [119, "P"], "\xf5" => [122, "P"], "\xf6" => [123, "P"], "\xf7" => [125, "P"], "\xf8" => [126, "P"], "\xf9" => [129, "P"], "\xfa" => [143, "P"], "\xfb" => [148, "P"], "\xfc" => [151, "P"], "\xfd" => [153, "P"], "\xfe" => [83, "P"], "\xff" => [10, "P"]], ["\x00" => [0, "M0"], "\x01" => [0, "M1"], "\x02" => [0, "M2"], "\x03" => [0, "Ma"], "\x04" => [0, "Mc"], "\x05" => [0, "Me"], "\x06" => [0, "Mi"], "\x07" => [0, "Mo"], "\x08" => [0, "Ms"], "\t" => [0, "Mt"], "\n" => [73, "M"], "\v" => [88, "M"], "\f" => [89, "M"], "\r" => [96, "M"], "\x0e" => [97, "M"], "\x0f" => [99, "M"], "\x10" => [106, "M"], "\x11" => [136, "M"], "\x12" => [139, "M"], "\x13" => [141, "M"], "\x14" => [145, "M"], "\x15" => [147, "M"], "\x16" => [149, "M"], "\x17" => [101, "M"], "\x18" => [112, "M"], "\x19" => [117, "M"], "\x1a" => [120, "M"], "\x1b" => [124, "M"], "\x1c" => [127, "M"], "\x1d" => [144, "M"], "\x1e" => [152, "M"], "\x1f" => [11, "M"], " " => [0, "N0"], "!" => [0, "N1"], "\"" => [0, "N2"], "#" => [0, "Na"], "\$" => [0, "Nc"], "%" => [0, "Ne"], "&" => [0, "Ni"], "'" => [0, "No"], "(" => [0, "Ns"], ")" => [0, "Nt"], "*" => [73, "N"], "+" => [88, "N"], "," => [89, "N"], "-" => [96, "N"], "." => [97, "N"], "/" => [99, "N"], [106, "N"], [136, "N"], [139, "N"], [141, "N"], [145, "N"], [147, "N"], [149, "N"], [101, "N"], [112, "N"], [117, "N"], ":" => [120, "N"], ";" => [124, "N"], "<" => [127, "N"], "=" => [144, "N"], ">" => [152, "N"], "?" => [11, "N"], "@" => [0, "O0"], "A" => [0, "O1"], "B" => [0, "O2"], "C" => [0, "Oa"], "D" => [0, "Oc"], "E" => [0, "Oe"], "F" => [0, "Oi"], "G" => [0, "Oo"], "H" => [0, "Os"], "I" => [0, "Ot"], "J" => [73, "O"], "K" => [88, "O"], "L" => [89, "O"], "M" => [96, "O"], "N" => [97, "O"], "O" => [99, "O"], "P" => [106, "O"], "Q" => [136, "O"], "R" => [139, "O"], "S" => [141, "O"], "T" => [145, "O"], "U" => [147, "O"], "V" => [149, "O"], "W" => [101, "O"], "X" => [112, "O"], "Y" => [117, "O"], "Z" => [120, "O"], "[" => [124, "O"], "\\" => [127, "O"], "]" => [144, "O"], "^" => [152, "O"], "_" => [11, "O"], "`" => [0, "P0"], "a" => [0, "P1"], "b" => [0, "P2"], "c" => [0, "Pa"], "d" => [0, "Pc"], "e" => [0, "Pe"], "f" => [0, "Pi"], "g" => [0, "Po"], "h" => [0, "Ps"], "i" => [0, "Pt"], "j" => [73, "P"], "k" => [88, "P"], "l" => [89, "P"], "m" => [96, "P"], "n" => [97, "P"], "o" => [99, "P"], "p" => [106, "P"], "q" => [136, "P"], "r" => [139, "P"], "s" => [141, "P"], "t" => [145, "P"], "u" => [147, "P"], "v" => [149, "P"], "w" => [101, "P"], "x" => [112, "P"], "y" => [117, "P"], "z" => [120, "P"], "{" => [124, "P"], "|" => [127, "P"], "}" => [144, "P"], "~" => [152, "P"], "" => [11, "P"], "\x80" => [0, "Q0"], "\x81" => [0, "Q1"], "\x82" => [0, "Q2"], "\x83" => [0, "Qa"], "\x84" => [0, "Qc"], "\x85" => [0, "Qe"], "\x86" => [0, "Qi"], "\x87" => [0, "Qo"], "\x88" => [0, "Qs"], "\x89" => [0, "Qt"], "\x8a" => [73, "Q"], "\x8b" => [88, "Q"], "\x8c" => [89, "Q"], "\x8d" => [96, "Q"], "\x8e" => [97, "Q"], "\x8f" => [99, "Q"], "\x90" => [106, "Q"], "\x91" => [136, "Q"], "\x92" => [139, "Q"], "\x93" => [141, "Q"], "\x94" => [145, "Q"], "\x95" => [147, "Q"], "\x96" => [149, "Q"], "\x97" => [101, "Q"], "\x98" => [112, "Q"], "\x99" => [117, "Q"], "\x9a" => [120, "Q"], "\x9b" => [124, "Q"], "\x9c" => [127, "Q"], "\x9d" => [144, "Q"], "\x9e" => [152, "Q"], "\x9f" => [11, "Q"], "\xa0" => [0, "R0"], "\xa1" => [0, "R1"], "\xa2" => [0, "R2"], "\xa3" => [0, "Ra"], "\xa4" => [0, "Rc"], "\xa5" => [0, "Re"], "\xa6" => [0, "Ri"], "\xa7" => [0, "Ro"], "\xa8" => [0, "Rs"], "\xa9" => [0, "Rt"], "\xaa" => [73, "R"], "\xab" => [88, "R"], "\xac" => [89, "R"], "\xad" => [96, "R"], "\xae" => [97, "R"], "\xaf" => [99, "R"], "\xb0" => [106, "R"], "\xb1" => [136, "R"], "\xb2" => [139, "R"], "\xb3" => [141, "R"], "\xb4" => [145, "R"], "\xb5" => [147, "R"], "\xb6" => [149, "R"], "\xb7" => [101, "R"], "\xb8" => [112, "R"], "\xb9" => [117, "R"], "\xba" => [120, "R"], "\xbb" => [124, "R"], "\xbc" => [127, "R"], "\xbd" => [144, "R"], "\xbe" => [152, "R"], "\xbf" => [11, "R"], "\xc0" => [0, "S0"], "\xc1" => [0, "S1"], "\xc2" => [0, "S2"], "\xc3" => [0, "Sa"], "\xc4" => [0, "Sc"], "\xc5" => [0, "Se"], "\xc6" => [0, "Si"], "\xc7" => [0, "So"], "\xc8" => [0, "Ss"], "\xc9" => [0, "St"], "\xca" => [73, "S"], "\xcb" => [88, "S"], "\xcc" => [89, "S"], "\xcd" => [96, "S"], "\xce" => [97, "S"], "\xcf" => [99, "S"], "\xd0" => [106, "S"], "\xd1" => [136, "S"], "\xd2" => [139, "S"], "\xd3" => [141, "S"], "\xd4" => [145, "S"], "\xd5" => [147, "S"], "\xd6" => [149, "S"], "\xd7" => [101, "S"], "\xd8" => [112, "S"], "\xd9" => [117, "S"], "\xda" => [120, "S"], "\xdb" => [124, "S"], "\xdc" => [127, "S"], "\xdd" => [144, "S"], "\xde" => [152, "S"], "\xdf" => [11, "S"], "\xe0" => [0, "T0"], "\xe1" => [0, "T1"], "\xe2" => [0, "T2"], "\xe3" => [0, "Ta"], "\xe4" => [0, "Tc"], "\xe5" => [0, "Te"], "\xe6" => [0, "Ti"], "\xe7" => [0, "To"], "\xe8" => [0, "Ts"], "\xe9" => [0, "Tt"], "\xea" => [73, "T"], "\xeb" => [88, "T"], "\xec" => [89, "T"], "\xed" => [96, "T"], "\xee" => [97, "T"], "\xef" => [99, "T"], "\xf0" => [106, "T"], "\xf1" => [136, "T"], "\xf2" => [139, "T"], "\xf3" => [141, "T"], "\xf4" => [145, "T"], "\xf5" => [147, "T"], "\xf6" => [149, "T"], "\xf7" => [101, "T"], "\xf8" => [112, "T"], "\xf9" => [117, "T"], "\xfa" => [120, "T"], "\xfb" => [124, "T"], "\xfc" => [127, "T"], "\xfd" => [144, "T"], "\xfe" => [152, "T"], "\xff" => [11, "T"]], ["\x00" => [94, "O0"], "\x01" => [76, "O0"], "\x02" => [104, "O0"], "\x03" => [16, "O0"], "\x04" => [94, "O1"], "\x05" => [76, "O1"], "\x06" => [104, "O1"], "\x07" => [16, "O1"], "\x08" => [94, "O2"], "\t" => [76, "O2"], "\n" => [104, "O2"], "\v" => [16, "O2"], "\f" => [94, "Oa"], "\r" => [76, "Oa"], "\x0e" => [104, "Oa"], "\x0f" => [16, "Oa"], "\x10" => [94, "Oc"], "\x11" => [76, "Oc"], "\x12" => [104, "Oc"], "\x13" => [16, "Oc"], "\x14" => [94, "Oe"], "\x15" => [76, "Oe"], "\x16" => [104, "Oe"], "\x17" => [16, "Oe"], "\x18" => [94, "Oi"], "\x19" => [76, "Oi"], "\x1a" => [104, "Oi"], "\x1b" => [16, "Oi"], "\x1c" => [94, "Oo"], "\x1d" => [76, "Oo"], "\x1e" => [104, "Oo"], "\x1f" => [16, "Oo"], " " => [94, "Os"], "!" => [76, "Os"], "\"" => [104, "Os"], "#" => [16, "Os"], "\$" => [94, "Ot"], "%" => [76, "Ot"], "&" => [104, "Ot"], "'" => [16, "Ot"], "(" => [77, "O "], ")" => [18, "O "], "*" => [77, "O%"], "+" => [18, "O%"], "," => [77, "O-"], "-" => [18, "O-"], "." => [77, "O."], "/" => [18, "O."], [77, "O/"], [18, "O/"], [77, "O3"], [18, "O3"], [77, "O4"], [18, "O4"], [77, "O5"], [18, "O5"], [77, "O6"], [18, "O6"], ":" => [77, "O7"], ";" => [18, "O7"], "<" => [77, "O8"], "=" => [18, "O8"], ">" => [77, "O9"], "?" => [18, "O9"], "@" => [77, "O="], "A" => [18, "O="], "B" => [77, "OA"], "C" => [18, "OA"], "D" => [77, "O_"], "E" => [18, "O_"], "F" => [77, "Ob"], "G" => [18, "Ob"], "H" => [77, "Od"], "I" => [18, "Od"], "J" => [77, "Of"], "K" => [18, "Of"], "L" => [77, "Og"], "M" => [18, "Og"], "N" => [77, "Oh"], "O" => [18, "Oh"], "P" => [77, "Ol"], "Q" => [18, "Ol"], "R" => [77, "Om"], "S" => [18, "Om"], "T" => [77, "On"], "U" => [18, "On"], "V" => [77, "Op"], "W" => [18, "Op"], "X" => [77, "Or"], "Y" => [18, "Or"], "Z" => [77, "Ou"], "[" => [18, "Ou"], "\\" => [0, "O:"], "]" => [0, "OB"], "^" => [0, "OC"], "_" => [0, "OD"], "`" => [0, "OE"], "a" => [0, "OF"], "b" => [0, "OG"], "c" => [0, "OH"], "d" => [0, "OI"], "e" => [0, "OJ"], "f" => [0, "OK"], "g" => [0, "OL"], "h" => [0, "OM"], "i" => [0, "ON"], "j" => [0, "OO"], "k" => [0, "OP"], "l" => [0, "OQ"], "m" => [0, "OR"], "n" => [0, "OS"], "o" => [0, "OT"], "p" => [0, "OU"], "q" => [0, "OV"], "r" => [0, "OW"], "s" => [0, "OY"], "t" => [0, "Oj"], "u" => [0, "Ok"], "v" => [0, "Oq"], "w" => [0, "Ov"], "x" => [0, "Ow"], "y" => [0, "Ox"], "z" => [0, "Oy"], "{" => [0, "Oz"], "|" => [82, "O"], "}" => [87, "O"], "~" => [130, "O"], "" => [9, "O"], "\x80" => [94, "P0"], "\x81" => [76, "P0"], "\x82" => [104, "P0"], "\x83" => [16, "P0"], "\x84" => [94, "P1"], "\x85" => [76, "P1"], "\x86" => [104, "P1"], "\x87" => [16, "P1"], "\x88" => [94, "P2"], "\x89" => [76, "P2"], "\x8a" => [104, "P2"], "\x8b" => [16, "P2"], "\x8c" => [94, "Pa"], "\x8d" => [76, "Pa"], "\x8e" => [104, "Pa"], "\x8f" => [16, "Pa"], "\x90" => [94, "Pc"], "\x91" => [76, "Pc"], "\x92" => [104, "Pc"], "\x93" => [16, "Pc"], "\x94" => [94, "Pe"], "\x95" => [76, "Pe"], "\x96" => [104, "Pe"], "\x97" => [16, "Pe"], "\x98" => [94, "Pi"], "\x99" => [76, "Pi"], "\x9a" => [104, "Pi"], "\x9b" => [16, "Pi"], "\x9c" => [94, "Po"], "\x9d" => [76, "Po"], "\x9e" => [104, "Po"], "\x9f" => [16, "Po"], "\xa0" => [94, "Ps"], "\xa1" => [76, "Ps"], "\xa2" => [104, "Ps"], "\xa3" => [16, "Ps"], "\xa4" => [94, "Pt"], "\xa5" => [76, "Pt"], "\xa6" => [104, "Pt"], "\xa7" => [16, "Pt"], "\xa8" => [77, "P "], "\xa9" => [18, "P "], "\xaa" => [77, "P%"], "\xab" => [18, "P%"], "\xac" => [77, "P-"], "\xad" => [18, "P-"], "\xae" => [77, "P."], "\xaf" => [18, "P."], "\xb0" => [77, "P/"], "\xb1" => [18, "P/"], "\xb2" => [77, "P3"], "\xb3" => [18, "P3"], "\xb4" => [77, "P4"], "\xb5" => [18, "P4"], "\xb6" => [77, "P5"], "\xb7" => [18, "P5"], "\xb8" => [77, "P6"], "\xb9" => [18, "P6"], "\xba" => [77, "P7"], "\xbb" => [18, "P7"], "\xbc" => [77, "P8"], "\xbd" => [18, "P8"], "\xbe" => [77, "P9"], "\xbf" => [18, "P9"], "\xc0" => [77, "P="], "\xc1" => [18, "P="], "\xc2" => [77, "PA"], "\xc3" => [18, "PA"], "\xc4" => [77, "P_"], "\xc5" => [18, "P_"], "\xc6" => [77, "Pb"], "\xc7" => [18, "Pb"], "\xc8" => [77, "Pd"], "\xc9" => [18, "Pd"], "\xca" => [77, "Pf"], "\xcb" => [18, "Pf"], "\xcc" => [77, "Pg"], "\xcd" => [18, "Pg"], "\xce" => [77, "Ph"], "\xcf" => [18, "Ph"], "\xd0" => [77, "Pl"], "\xd1" => [18, "Pl"], "\xd2" => [77, "Pm"], "\xd3" => [18, "Pm"], "\xd4" => [77, "Pn"], "\xd5" => [18, "Pn"], "\xd6" => [77, "Pp"], "\xd7" => [18, "Pp"], "\xd8" => [77, "Pr"], "\xd9" => [18, "Pr"], "\xda" => [77, "Pu"], "\xdb" => [18, "Pu"], "\xdc" => [0, "P:"], "\xdd" => [0, "PB"], "\xde" => [0, "PC"], "\xdf" => [0, "PD"], "\xe0" => [0, "PE"], "\xe1" => [0, "PF"], "\xe2" => [0, "PG"], "\xe3" => [0, "PH"], "\xe4" => [0, "PI"], "\xe5" => [0, "PJ"], "\xe6" => [0, "PK"], "\xe7" => [0, "PL"], "\xe8" => [0, "PM"], "\xe9" => [0, "PN"], "\xea" => [0, "PO"], "\xeb" => [0, "PP"], "\xec" => [0, "PQ"], "\xed" => [0, "PR"], "\xee" => [0, "PS"], "\xef" => [0, "PT"], "\xf0" => [0, "PU"], "\xf1" => [0, "PV"], "\xf2" => [0, "PW"], "\xf3" => [0, "PY"], "\xf4" => [0, "Pj"], "\xf5" => [0, "Pk"], "\xf6" => [0, "Pq"], "\xf7" => [0, "Pv"], "\xf8" => [0, "Pw"], "\xf9" => [0, "Px"], "\xfa" => [0, "Py"], "\xfb" => [0, "Pz"], "\xfc" => [82, "P"], "\xfd" => [87, "P"], "\xfe" => [130, "P"], "\xff" => [9, "P"]], ["\x00" => [94, "Q0"], "\x01" => [76, "Q0"], "\x02" => [104, "Q0"], "\x03" => [16, "Q0"], "\x04" => [94, "Q1"], "\x05" => [76, "Q1"], "\x06" => [104, "Q1"], "\x07" => [16, "Q1"], "\x08" => [94, "Q2"], "\t" => [76, "Q2"], "\n" => [104, "Q2"], "\v" => [16, "Q2"], "\f" => [94, "Qa"], "\r" => [76, "Qa"], "\x0e" => [104, "Qa"], "\x0f" => [16, "Qa"], "\x10" => [94, "Qc"], "\x11" => [76, "Qc"], "\x12" => [104, "Qc"], "\x13" => [16, "Qc"], "\x14" => [94, "Qe"], "\x15" => [76, "Qe"], "\x16" => [104, "Qe"], "\x17" => [16, "Qe"], "\x18" => [94, "Qi"], "\x19" => [76, "Qi"], "\x1a" => [104, "Qi"], "\x1b" => [16, "Qi"], "\x1c" => [94, "Qo"], "\x1d" => [76, "Qo"], "\x1e" => [104, "Qo"], "\x1f" => [16, "Qo"], " " => [94, "Qs"], "!" => [76, "Qs"], "\"" => [104, "Qs"], "#" => [16, "Qs"], "\$" => [94, "Qt"], "%" => [76, "Qt"], "&" => [104, "Qt"], "'" => [16, "Qt"], "(" => [77, "Q "], ")" => [18, "Q "], "*" => [77, "Q%"], "+" => [18, "Q%"], "," => [77, "Q-"], "-" => [18, "Q-"], "." => [77, "Q."], "/" => [18, "Q."], [77, "Q/"], [18, "Q/"], [77, "Q3"], [18, "Q3"], [77, "Q4"], [18, "Q4"], [77, "Q5"], [18, "Q5"], [77, "Q6"], [18, "Q6"], ":" => [77, "Q7"], ";" => [18, "Q7"], "<" => [77, "Q8"], "=" => [18, "Q8"], ">" => [77, "Q9"], "?" => [18, "Q9"], "@" => [77, "Q="], "A" => [18, "Q="], "B" => [77, "QA"], "C" => [18, "QA"], "D" => [77, "Q_"], "E" => [18, "Q_"], "F" => [77, "Qb"], "G" => [18, "Qb"], "H" => [77, "Qd"], "I" => [18, "Qd"], "J" => [77, "Qf"], "K" => [18, "Qf"], "L" => [77, "Qg"], "M" => [18, "Qg"], "N" => [77, "Qh"], "O" => [18, "Qh"], "P" => [77, "Ql"], "Q" => [18, "Ql"], "R" => [77, "Qm"], "S" => [18, "Qm"], "T" => [77, "Qn"], "U" => [18, "Qn"], "V" => [77, "Qp"], "W" => [18, "Qp"], "X" => [77, "Qr"], "Y" => [18, "Qr"], "Z" => [77, "Qu"], "[" => [18, "Qu"], "\\" => [0, "Q:"], "]" => [0, "QB"], "^" => [0, "QC"], "_" => [0, "QD"], "`" => [0, "QE"], "a" => [0, "QF"], "b" => [0, "QG"], "c" => [0, "QH"], "d" => [0, "QI"], "e" => [0, "QJ"], "f" => [0, "QK"], "g" => [0, "QL"], "h" => [0, "QM"], "i" => [0, "QN"], "j" => [0, "QO"], "k" => [0, "QP"], "l" => [0, "QQ"], "m" => [0, "QR"], "n" => [0, "QS"], "o" => [0, "QT"], "p" => [0, "QU"], "q" => [0, "QV"], "r" => [0, "QW"], "s" => [0, "QY"], "t" => [0, "Qj"], "u" => [0, "Qk"], "v" => [0, "Qq"], "w" => [0, "Qv"], "x" => [0, "Qw"], "y" => [0, "Qx"], "z" => [0, "Qy"], "{" => [0, "Qz"], "|" => [82, "Q"], "}" => [87, "Q"], "~" => [130, "Q"], "" => [9, "Q"], "\x80" => [94, "R0"], "\x81" => [76, "R0"], "\x82" => [104, "R0"], "\x83" => [16, "R0"], "\x84" => [94, "R1"], "\x85" => [76, "R1"], "\x86" => [104, "R1"], "\x87" => [16, "R1"], "\x88" => [94, "R2"], "\x89" => [76, "R2"], "\x8a" => [104, "R2"], "\x8b" => [16, "R2"], "\x8c" => [94, "Ra"], "\x8d" => [76, "Ra"], "\x8e" => [104, "Ra"], "\x8f" => [16, "Ra"], "\x90" => [94, "Rc"], "\x91" => [76, "Rc"], "\x92" => [104, "Rc"], "\x93" => [16, "Rc"], "\x94" => [94, "Re"], "\x95" => [76, "Re"], "\x96" => [104, "Re"], "\x97" => [16, "Re"], "\x98" => [94, "Ri"], "\x99" => [76, "Ri"], "\x9a" => [104, "Ri"], "\x9b" => [16, "Ri"], "\x9c" => [94, "Ro"], "\x9d" => [76, "Ro"], "\x9e" => [104, "Ro"], "\x9f" => [16, "Ro"], "\xa0" => [94, "Rs"], "\xa1" => [76, "Rs"], "\xa2" => [104, "Rs"], "\xa3" => [16, "Rs"], "\xa4" => [94, "Rt"], "\xa5" => [76, "Rt"], "\xa6" => [104, "Rt"], "\xa7" => [16, "Rt"], "\xa8" => [77, "R "], "\xa9" => [18, "R "], "\xaa" => [77, "R%"], "\xab" => [18, "R%"], "\xac" => [77, "R-"], "\xad" => [18, "R-"], "\xae" => [77, "R."], "\xaf" => [18, "R."], "\xb0" => [77, "R/"], "\xb1" => [18, "R/"], "\xb2" => [77, "R3"], "\xb3" => [18, "R3"], "\xb4" => [77, "R4"], "\xb5" => [18, "R4"], "\xb6" => [77, "R5"], "\xb7" => [18, "R5"], "\xb8" => [77, "R6"], "\xb9" => [18, "R6"], "\xba" => [77, "R7"], "\xbb" => [18, "R7"], "\xbc" => [77, "R8"], "\xbd" => [18, "R8"], "\xbe" => [77, "R9"], "\xbf" => [18, "R9"], "\xc0" => [77, "R="], "\xc1" => [18, "R="], "\xc2" => [77, "RA"], "\xc3" => [18, "RA"], "\xc4" => [77, "R_"], "\xc5" => [18, "R_"], "\xc6" => [77, "Rb"], "\xc7" => [18, "Rb"], "\xc8" => [77, "Rd"], "\xc9" => [18, "Rd"], "\xca" => [77, "Rf"], "\xcb" => [18, "Rf"], "\xcc" => [77, "Rg"], "\xcd" => [18, "Rg"], "\xce" => [77, "Rh"], "\xcf" => [18, "Rh"], "\xd0" => [77, "Rl"], "\xd1" => [18, "Rl"], "\xd2" => [77, "Rm"], "\xd3" => [18, "Rm"], "\xd4" => [77, "Rn"], "\xd5" => [18, "Rn"], "\xd6" => [77, "Rp"], "\xd7" => [18, "Rp"], "\xd8" => [77, "Rr"], "\xd9" => [18, "Rr"], "\xda" => [77, "Ru"], "\xdb" => [18, "Ru"], "\xdc" => [0, "R:"], "\xdd" => [0, "RB"], "\xde" => [0, "RC"], "\xdf" => [0, "RD"], "\xe0" => [0, "RE"], "\xe1" => [0, "RF"], "\xe2" => [0, "RG"], "\xe3" => [0, "RH"], "\xe4" => [0, "RI"], "\xe5" => [0, "RJ"], "\xe6" => [0, "RK"], "\xe7" => [0, "RL"], "\xe8" => [0, "RM"], "\xe9" => [0, "RN"], "\xea" => [0, "RO"], "\xeb" => [0, "RP"], "\xec" => [0, "RQ"], "\xed" => [0, "RR"], "\xee" => [0, "RS"], "\xef" => [0, "RT"], "\xf0" => [0, "RU"], "\xf1" => [0, "RV"], "\xf2" => [0, "RW"], "\xf3" => [0, "RY"], "\xf4" => [0, "Rj"], "\xf5" => [0, "Rk"], "\xf6" => [0, "Rq"], "\xf7" => [0, "Rv"], "\xf8" => [0, "Rw"], "\xf9" => [0, "Rx"], "\xfa" => [0, "Ry"], "\xfb" => [0, "Rz"], "\xfc" => [82, "R"], "\xfd" => [87, "R"], "\xfe" => [130, "R"], "\xff" => [9, "R"]], ["\x00" => [77, "Q0"], "\x01" => [18, "Q0"], "\x02" => [77, "Q1"], "\x03" => [18, "Q1"], "\x04" => [77, "Q2"], "\x05" => [18, "Q2"], "\x06" => [77, "Qa"], "\x07" => [18, "Qa"], "\x08" => [77, "Qc"], "\t" => [18, "Qc"], "\n" => [77, "Qe"], "\v" => [18, "Qe"], "\f" => [77, "Qi"], "\r" => [18, "Qi"], "\x0e" => [77, "Qo"], "\x0f" => [18, "Qo"], "\x10" => [77, "Qs"], "\x11" => [18, "Qs"], "\x12" => [77, "Qt"], "\x13" => [18, "Qt"], "\x14" => [0, "Q "], "\x15" => [0, "Q%"], "\x16" => [0, "Q-"], "\x17" => [0, "Q."], "\x18" => [0, "Q/"], "\x19" => [0, "Q3"], "\x1a" => [0, "Q4"], "\x1b" => [0, "Q5"], "\x1c" => [0, "Q6"], "\x1d" => [0, "Q7"], "\x1e" => [0, "Q8"], "\x1f" => [0, "Q9"], " " => [0, "Q="], "!" => [0, "QA"], "\"" => [0, "Q_"], "#" => [0, "Qb"], "\$" => [0, "Qd"], "%" => [0, "Qf"], "&" => [0, "Qg"], "'" => [0, "Qh"], "(" => [0, "Ql"], ")" => [0, "Qm"], "*" => [0, "Qn"], "+" => [0, "Qp"], "," => [0, "Qr"], "-" => [0, "Qu"], "." => [100, "Q"], "/" => [110, "Q"], [111, "Q"], [115, "Q"], [116, "Q"], [118, "Q"], [119, "Q"], [122, "Q"], [123, "Q"], [125, "Q"], [126, "Q"], [129, "Q"], ":" => [143, "Q"], ";" => [148, "Q"], "<" => [151, "Q"], "=" => [153, "Q"], ">" => [83, "Q"], "?" => [10, "Q"], "@" => [77, "R0"], "A" => [18, "R0"], "B" => [77, "R1"], "C" => [18, "R1"], "D" => [77, "R2"], "E" => [18, "R2"], "F" => [77, "Ra"], "G" => [18, "Ra"], "H" => [77, "Rc"], "I" => [18, "Rc"], "J" => [77, "Re"], "K" => [18, "Re"], "L" => [77, "Ri"], "M" => [18, "Ri"], "N" => [77, "Ro"], "O" => [18, "Ro"], "P" => [77, "Rs"], "Q" => [18, "Rs"], "R" => [77, "Rt"], "S" => [18, "Rt"], "T" => [0, "R "], "U" => [0, "R%"], "V" => [0, "R-"], "W" => [0, "R."], "X" => [0, "R/"], "Y" => [0, "R3"], "Z" => [0, "R4"], "[" => [0, "R5"], "\\" => [0, "R6"], "]" => [0, "R7"], "^" => [0, "R8"], "_" => [0, "R9"], "`" => [0, "R="], "a" => [0, "RA"], "b" => [0, "R_"], "c" => [0, "Rb"], "d" => [0, "Rd"], "e" => [0, "Rf"], "f" => [0, "Rg"], "g" => [0, "Rh"], "h" => [0, "Rl"], "i" => [0, "Rm"], "j" => [0, "Rn"], "k" => [0, "Rp"], "l" => [0, "Rr"], "m" => [0, "Ru"], "n" => [100, "R"], "o" => [110, "R"], "p" => [111, "R"], "q" => [115, "R"], "r" => [116, "R"], "s" => [118, "R"], "t" => [119, "R"], "u" => [122, "R"], "v" => [123, "R"], "w" => [125, "R"], "x" => [126, "R"], "y" => [129, "R"], "z" => [143, "R"], "{" => [148, "R"], "|" => [151, "R"], "}" => [153, "R"], "~" => [83, "R"], "" => [10, "R"], "\x80" => [77, "S0"], "\x81" => [18, "S0"], "\x82" => [77, "S1"], "\x83" => [18, "S1"], "\x84" => [77, "S2"], "\x85" => [18, "S2"], "\x86" => [77, "Sa"], "\x87" => [18, "Sa"], "\x88" => [77, "Sc"], "\x89" => [18, "Sc"], "\x8a" => [77, "Se"], "\x8b" => [18, "Se"], "\x8c" => [77, "Si"], "\x8d" => [18, "Si"], "\x8e" => [77, "So"], "\x8f" => [18, "So"], "\x90" => [77, "Ss"], "\x91" => [18, "Ss"], "\x92" => [77, "St"], "\x93" => [18, "St"], "\x94" => [0, "S "], "\x95" => [0, "S%"], "\x96" => [0, "S-"], "\x97" => [0, "S."], "\x98" => [0, "S/"], "\x99" => [0, "S3"], "\x9a" => [0, "S4"], "\x9b" => [0, "S5"], "\x9c" => [0, "S6"], "\x9d" => [0, "S7"], "\x9e" => [0, "S8"], "\x9f" => [0, "S9"], "\xa0" => [0, "S="], "\xa1" => [0, "SA"], "\xa2" => [0, "S_"], "\xa3" => [0, "Sb"], "\xa4" => [0, "Sd"], "\xa5" => [0, "Sf"], "\xa6" => [0, "Sg"], "\xa7" => [0, "Sh"], "\xa8" => [0, "Sl"], "\xa9" => [0, "Sm"], "\xaa" => [0, "Sn"], "\xab" => [0, "Sp"], "\xac" => [0, "Sr"], "\xad" => [0, "Su"], "\xae" => [100, "S"], "\xaf" => [110, "S"], "\xb0" => [111, "S"], "\xb1" => [115, "S"], "\xb2" => [116, "S"], "\xb3" => [118, "S"], "\xb4" => [119, "S"], "\xb5" => [122, "S"], "\xb6" => [123, "S"], "\xb7" => [125, "S"], "\xb8" => [126, "S"], "\xb9" => [129, "S"], "\xba" => [143, "S"], "\xbb" => [148, "S"], "\xbc" => [151, "S"], "\xbd" => [153, "S"], "\xbe" => [83, "S"], "\xbf" => [10, "S"], "\xc0" => [77, "T0"], "\xc1" => [18, "T0"], "\xc2" => [77, "T1"], "\xc3" => [18, "T1"], "\xc4" => [77, "T2"], "\xc5" => [18, "T2"], "\xc6" => [77, "Ta"], "\xc7" => [18, "Ta"], "\xc8" => [77, "Tc"], "\xc9" => [18, "Tc"], "\xca" => [77, "Te"], "\xcb" => [18, "Te"], "\xcc" => [77, "Ti"], "\xcd" => [18, "Ti"], "\xce" => [77, "To"], "\xcf" => [18, "To"], "\xd0" => [77, "Ts"], "\xd1" => [18, "Ts"], "\xd2" => [77, "Tt"], "\xd3" => [18, "Tt"], "\xd4" => [0, "T "], "\xd5" => [0, "T%"], "\xd6" => [0, "T-"], "\xd7" => [0, "T."], "\xd8" => [0, "T/"], "\xd9" => [0, "T3"], "\xda" => [0, "T4"], "\xdb" => [0, "T5"], "\xdc" => [0, "T6"], "\xdd" => [0, "T7"], "\xde" => [0, "T8"], "\xdf" => [0, "T9"], "\xe0" => [0, "T="], "\xe1" => [0, "TA"], "\xe2" => [0, "T_"], "\xe3" => [0, "Tb"], "\xe4" => [0, "Td"], "\xe5" => [0, "Tf"], "\xe6" => [0, "Tg"], "\xe7" => [0, "Th"], "\xe8" => [0, "Tl"], "\xe9" => [0, "Tm"], "\xea" => [0, "Tn"], "\xeb" => [0, "Tp"], "\xec" => [0, "Tr"], "\xed" => [0, "Tu"], "\xee" => [100, "T"], "\xef" => [110, "T"], "\xf0" => [111, "T"], "\xf1" => [115, "T"], "\xf2" => [116, "T"], "\xf3" => [118, "T"], "\xf4" => [119, "T"], "\xf5" => [122, "T"], "\xf6" => [123, "T"], "\xf7" => [125, "T"], "\xf8" => [126, "T"], "\xf9" => [129, "T"], "\xfa" => [143, "T"], "\xfb" => [148, "T"], "\xfc" => [151, "T"], "\xfd" => [153, "T"], "\xfe" => [83, "T"], "\xff" => [10, "T"]], ["\x00" => [94, "S0"], "\x01" => [76, "S0"], "\x02" => [104, "S0"], "\x03" => [16, "S0"], "\x04" => [94, "S1"], "\x05" => [76, "S1"], "\x06" => [104, "S1"], "\x07" => [16, "S1"], "\x08" => [94, "S2"], "\t" => [76, "S2"], "\n" => [104, "S2"], "\v" => [16, "S2"], "\f" => [94, "Sa"], "\r" => [76, "Sa"], "\x0e" => [104, "Sa"], "\x0f" => [16, "Sa"], "\x10" => [94, "Sc"], "\x11" => [76, "Sc"], "\x12" => [104, "Sc"], "\x13" => [16, "Sc"], "\x14" => [94, "Se"], "\x15" => [76, "Se"], "\x16" => [104, "Se"], "\x17" => [16, "Se"], "\x18" => [94, "Si"], "\x19" => [76, "Si"], "\x1a" => [104, "Si"], "\x1b" => [16, "Si"], "\x1c" => [94, "So"], "\x1d" => [76, "So"], "\x1e" => [104, "So"], "\x1f" => [16, "So"], " " => [94, "Ss"], "!" => [76, "Ss"], "\"" => [104, "Ss"], "#" => [16, "Ss"], "\$" => [94, "St"], "%" => [76, "St"], "&" => [104, "St"], "'" => [16, "St"], "(" => [77, "S "], ")" => [18, "S "], "*" => [77, "S%"], "+" => [18, "S%"], "," => [77, "S-"], "-" => [18, "S-"], "." => [77, "S."], "/" => [18, "S."], [77, "S/"], [18, "S/"], [77, "S3"], [18, "S3"], [77, "S4"], [18, "S4"], [77, "S5"], [18, "S5"], [77, "S6"], [18, "S6"], ":" => [77, "S7"], ";" => [18, "S7"], "<" => [77, "S8"], "=" => [18, "S8"], ">" => [77, "S9"], "?" => [18, "S9"], "@" => [77, "S="], "A" => [18, "S="], "B" => [77, "SA"], "C" => [18, "SA"], "D" => [77, "S_"], "E" => [18, "S_"], "F" => [77, "Sb"], "G" => [18, "Sb"], "H" => [77, "Sd"], "I" => [18, "Sd"], "J" => [77, "Sf"], "K" => [18, "Sf"], "L" => [77, "Sg"], "M" => [18, "Sg"], "N" => [77, "Sh"], "O" => [18, "Sh"], "P" => [77, "Sl"], "Q" => [18, "Sl"], "R" => [77, "Sm"], "S" => [18, "Sm"], "T" => [77, "Sn"], "U" => [18, "Sn"], "V" => [77, "Sp"], "W" => [18, "Sp"], "X" => [77, "Sr"], "Y" => [18, "Sr"], "Z" => [77, "Su"], "[" => [18, "Su"], "\\" => [0, "S:"], "]" => [0, "SB"], "^" => [0, "SC"], "_" => [0, "SD"], "`" => [0, "SE"], "a" => [0, "SF"], "b" => [0, "SG"], "c" => [0, "SH"], "d" => [0, "SI"], "e" => [0, "SJ"], "f" => [0, "SK"], "g" => [0, "SL"], "h" => [0, "SM"], "i" => [0, "SN"], "j" => [0, "SO"], "k" => [0, "SP"], "l" => [0, "SQ"], "m" => [0, "SR"], "n" => [0, "SS"], "o" => [0, "ST"], "p" => [0, "SU"], "q" => [0, "SV"], "r" => [0, "SW"], "s" => [0, "SY"], "t" => [0, "Sj"], "u" => [0, "Sk"], "v" => [0, "Sq"], "w" => [0, "Sv"], "x" => [0, "Sw"], "y" => [0, "Sx"], "z" => [0, "Sy"], "{" => [0, "Sz"], "|" => [82, "S"], "}" => [87, "S"], "~" => [130, "S"], "" => [9, "S"], "\x80" => [94, "T0"], "\x81" => [76, "T0"], "\x82" => [104, "T0"], "\x83" => [16, "T0"], "\x84" => [94, "T1"], "\x85" => [76, "T1"], "\x86" => [104, "T1"], "\x87" => [16, "T1"], "\x88" => [94, "T2"], "\x89" => [76, "T2"], "\x8a" => [104, "T2"], "\x8b" => [16, "T2"], "\x8c" => [94, "Ta"], "\x8d" => [76, "Ta"], "\x8e" => [104, "Ta"], "\x8f" => [16, "Ta"], "\x90" => [94, "Tc"], "\x91" => [76, "Tc"], "\x92" => [104, "Tc"], "\x93" => [16, "Tc"], "\x94" => [94, "Te"], "\x95" => [76, "Te"], "\x96" => [104, "Te"], "\x97" => [16, "Te"], "\x98" => [94, "Ti"], "\x99" => [76, "Ti"], "\x9a" => [104, "Ti"], "\x9b" => [16, "Ti"], "\x9c" => [94, "To"], "\x9d" => [76, "To"], "\x9e" => [104, "To"], "\x9f" => [16, "To"], "\xa0" => [94, "Ts"], "\xa1" => [76, "Ts"], "\xa2" => [104, "Ts"], "\xa3" => [16, "Ts"], "\xa4" => [94, "Tt"], "\xa5" => [76, "Tt"], "\xa6" => [104, "Tt"], "\xa7" => [16, "Tt"], "\xa8" => [77, "T "], "\xa9" => [18, "T "], "\xaa" => [77, "T%"], "\xab" => [18, "T%"], "\xac" => [77, "T-"], "\xad" => [18, "T-"], "\xae" => [77, "T."], "\xaf" => [18, "T."], "\xb0" => [77, "T/"], "\xb1" => [18, "T/"], "\xb2" => [77, "T3"], "\xb3" => [18, "T3"], "\xb4" => [77, "T4"], "\xb5" => [18, "T4"], "\xb6" => [77, "T5"], "\xb7" => [18, "T5"], "\xb8" => [77, "T6"], "\xb9" => [18, "T6"], "\xba" => [77, "T7"], "\xbb" => [18, "T7"], "\xbc" => [77, "T8"], "\xbd" => [18, "T8"], "\xbe" => [77, "T9"], "\xbf" => [18, "T9"], "\xc0" => [77, "T="], "\xc1" => [18, "T="], "\xc2" => [77, "TA"], "\xc3" => [18, "TA"], "\xc4" => [77, "T_"], "\xc5" => [18, "T_"], "\xc6" => [77, "Tb"], "\xc7" => [18, "Tb"], "\xc8" => [77, "Td"], "\xc9" => [18, "Td"], "\xca" => [77, "Tf"], "\xcb" => [18, "Tf"], "\xcc" => [77, "Tg"], "\xcd" => [18, "Tg"], "\xce" => [77, "Th"], "\xcf" => [18, "Th"], "\xd0" => [77, "Tl"], "\xd1" => [18, "Tl"], "\xd2" => [77, "Tm"], "\xd3" => [18, "Tm"], "\xd4" => [77, "Tn"], "\xd5" => [18, "Tn"], "\xd6" => [77, "Tp"], "\xd7" => [18, "Tp"], "\xd8" => [77, "Tr"], "\xd9" => [18, "Tr"], "\xda" => [77, "Tu"], "\xdb" => [18, "Tu"], "\xdc" => [0, "T:"], "\xdd" => [0, "TB"], "\xde" => [0, "TC"], "\xdf" => [0, "TD"], "\xe0" => [0, "TE"], "\xe1" => [0, "TF"], "\xe2" => [0, "TG"], "\xe3" => [0, "TH"], "\xe4" => [0, "TI"], "\xe5" => [0, "TJ"], "\xe6" => [0, "TK"], "\xe7" => [0, "TL"], "\xe8" => [0, "TM"], "\xe9" => [0, "TN"], "\xea" => [0, "TO"], "\xeb" => [0, "TP"], "\xec" => [0, "TQ"], "\xed" => [0, "TR"], "\xee" => [0, "TS"], "\xef" => [0, "TT"], "\xf0" => [0, "TU"], "\xf1" => [0, "TV"], "\xf2" => [0, "TW"], "\xf3" => [0, "TY"], "\xf4" => [0, "Tj"], "\xf5" => [0, "Tk"], "\xf6" => [0, "Tq"], "\xf7" => [0, "Tv"], "\xf8" => [0, "Tw"], "\xf9" => [0, "Tx"], "\xfa" => [0, "Ty"], "\xfb" => [0, "Tz"], "\xfc" => [82, "T"], "\xfd" => [87, "T"], "\xfe" => [130, "T"], "\xff" => [9, "T"]], ["\x00" => [94, "U0"], "\x01" => [76, "U0"], "\x02" => [104, "U0"], "\x03" => [16, "U0"], "\x04" => [94, "U1"], "\x05" => [76, "U1"], "\x06" => [104, "U1"], "\x07" => [16, "U1"], "\x08" => [94, "U2"], "\t" => [76, "U2"], "\n" => [104, "U2"], "\v" => [16, "U2"], "\f" => [94, "Ua"], "\r" => [76, "Ua"], "\x0e" => [104, "Ua"], "\x0f" => [16, "Ua"], "\x10" => [94, "Uc"], "\x11" => [76, "Uc"], "\x12" => [104, "Uc"], "\x13" => [16, "Uc"], "\x14" => [94, "Ue"], "\x15" => [76, "Ue"], "\x16" => [104, "Ue"], "\x17" => [16, "Ue"], "\x18" => [94, "Ui"], "\x19" => [76, "Ui"], "\x1a" => [104, "Ui"], "\x1b" => [16, "Ui"], "\x1c" => [94, "Uo"], "\x1d" => [76, "Uo"], "\x1e" => [104, "Uo"], "\x1f" => [16, "Uo"], " " => [94, "Us"], "!" => [76, "Us"], "\"" => [104, "Us"], "#" => [16, "Us"], "\$" => [94, "Ut"], "%" => [76, "Ut"], "&" => [104, "Ut"], "'" => [16, "Ut"], "(" => [77, "U "], ")" => [18, "U "], "*" => [77, "U%"], "+" => [18, "U%"], "," => [77, "U-"], "-" => [18, "U-"], "." => [77, "U."], "/" => [18, "U."], [77, "U/"], [18, "U/"], [77, "U3"], [18, "U3"], [77, "U4"], [18, "U4"], [77, "U5"], [18, "U5"], [77, "U6"], [18, "U6"], ":" => [77, "U7"], ";" => [18, "U7"], "<" => [77, "U8"], "=" => [18, "U8"], ">" => [77, "U9"], "?" => [18, "U9"], "@" => [77, "U="], "A" => [18, "U="], "B" => [77, "UA"], "C" => [18, "UA"], "D" => [77, "U_"], "E" => [18, "U_"], "F" => [77, "Ub"], "G" => [18, "Ub"], "H" => [77, "Ud"], "I" => [18, "Ud"], "J" => [77, "Uf"], "K" => [18, "Uf"], "L" => [77, "Ug"], "M" => [18, "Ug"], "N" => [77, "Uh"], "O" => [18, "Uh"], "P" => [77, "Ul"], "Q" => [18, "Ul"], "R" => [77, "Um"], "S" => [18, "Um"], "T" => [77, "Un"], "U" => [18, "Un"], "V" => [77, "Up"], "W" => [18, "Up"], "X" => [77, "Ur"], "Y" => [18, "Ur"], "Z" => [77, "Uu"], "[" => [18, "Uu"], "\\" => [0, "U:"], "]" => [0, "UB"], "^" => [0, "UC"], "_" => [0, "UD"], "`" => [0, "UE"], "a" => [0, "UF"], "b" => [0, "UG"], "c" => [0, "UH"], "d" => [0, "UI"], "e" => [0, "UJ"], "f" => [0, "UK"], "g" => [0, "UL"], "h" => [0, "UM"], "i" => [0, "UN"], "j" => [0, "UO"], "k" => [0, "UP"], "l" => [0, "UQ"], "m" => [0, "UR"], "n" => [0, "US"], "o" => [0, "UT"], "p" => [0, "UU"], "q" => [0, "UV"], "r" => [0, "UW"], "s" => [0, "UY"], "t" => [0, "Uj"], "u" => [0, "Uk"], "v" => [0, "Uq"], "w" => [0, "Uv"], "x" => [0, "Uw"], "y" => [0, "Ux"], "z" => [0, "Uy"], "{" => [0, "Uz"], "|" => [82, "U"], "}" => [87, "U"], "~" => [130, "U"], "" => [9, "U"], "\x80" => [94, "V0"], "\x81" => [76, "V0"], "\x82" => [104, "V0"], "\x83" => [16, "V0"], "\x84" => [94, "V1"], "\x85" => [76, "V1"], "\x86" => [104, "V1"], "\x87" => [16, "V1"], "\x88" => [94, "V2"], "\x89" => [76, "V2"], "\x8a" => [104, "V2"], "\x8b" => [16, "V2"], "\x8c" => [94, "Va"], "\x8d" => [76, "Va"], "\x8e" => [104, "Va"], "\x8f" => [16, "Va"], "\x90" => [94, "Vc"], "\x91" => [76, "Vc"], "\x92" => [104, "Vc"], "\x93" => [16, "Vc"], "\x94" => [94, "Ve"], "\x95" => [76, "Ve"], "\x96" => [104, "Ve"], "\x97" => [16, "Ve"], "\x98" => [94, "Vi"], "\x99" => [76, "Vi"], "\x9a" => [104, "Vi"], "\x9b" => [16, "Vi"], "\x9c" => [94, "Vo"], "\x9d" => [76, "Vo"], "\x9e" => [104, "Vo"], "\x9f" => [16, "Vo"], "\xa0" => [94, "Vs"], "\xa1" => [76, "Vs"], "\xa2" => [104, "Vs"], "\xa3" => [16, "Vs"], "\xa4" => [94, "Vt"], "\xa5" => [76, "Vt"], "\xa6" => [104, "Vt"], "\xa7" => [16, "Vt"], "\xa8" => [77, "V "], "\xa9" => [18, "V "], "\xaa" => [77, "V%"], "\xab" => [18, "V%"], "\xac" => [77, "V-"], "\xad" => [18, "V-"], "\xae" => [77, "V."], "\xaf" => [18, "V."], "\xb0" => [77, "V/"], "\xb1" => [18, "V/"], "\xb2" => [77, "V3"], "\xb3" => [18, "V3"], "\xb4" => [77, "V4"], "\xb5" => [18, "V4"], "\xb6" => [77, "V5"], "\xb7" => [18, "V5"], "\xb8" => [77, "V6"], "\xb9" => [18, "V6"], "\xba" => [77, "V7"], "\xbb" => [18, "V7"], "\xbc" => [77, "V8"], "\xbd" => [18, "V8"], "\xbe" => [77, "V9"], "\xbf" => [18, "V9"], "\xc0" => [77, "V="], "\xc1" => [18, "V="], "\xc2" => [77, "VA"], "\xc3" => [18, "VA"], "\xc4" => [77, "V_"], "\xc5" => [18, "V_"], "\xc6" => [77, "Vb"], "\xc7" => [18, "Vb"], "\xc8" => [77, "Vd"], "\xc9" => [18, "Vd"], "\xca" => [77, "Vf"], "\xcb" => [18, "Vf"], "\xcc" => [77, "Vg"], "\xcd" => [18, "Vg"], "\xce" => [77, "Vh"], "\xcf" => [18, "Vh"], "\xd0" => [77, "Vl"], "\xd1" => [18, "Vl"], "\xd2" => [77, "Vm"], "\xd3" => [18, "Vm"], "\xd4" => [77, "Vn"], "\xd5" => [18, "Vn"], "\xd6" => [77, "Vp"], "\xd7" => [18, "Vp"], "\xd8" => [77, "Vr"], "\xd9" => [18, "Vr"], "\xda" => [77, "Vu"], "\xdb" => [18, "Vu"], "\xdc" => [0, "V:"], "\xdd" => [0, "VB"], "\xde" => [0, "VC"], "\xdf" => [0, "VD"], "\xe0" => [0, "VE"], "\xe1" => [0, "VF"], "\xe2" => [0, "VG"], "\xe3" => [0, "VH"], "\xe4" => [0, "VI"], "\xe5" => [0, "VJ"], "\xe6" => [0, "VK"], "\xe7" => [0, "VL"], "\xe8" => [0, "VM"], "\xe9" => [0, "VN"], "\xea" => [0, "VO"], "\xeb" => [0, "VP"], "\xec" => [0, "VQ"], "\xed" => [0, "VR"], "\xee" => [0, "VS"], "\xef" => [0, "VT"], "\xf0" => [0, "VU"], "\xf1" => [0, "VV"], "\xf2" => [0, "VW"], "\xf3" => [0, "VY"], "\xf4" => [0, "Vj"], "\xf5" => [0, "Vk"], "\xf6" => [0, "Vq"], "\xf7" => [0, "Vv"], "\xf8" => [0, "Vw"], "\xf9" => [0, "Vx"], "\xfa" => [0, "Vy"], "\xfb" => [0, "Vz"], "\xfc" => [82, "V"], "\xfd" => [87, "V"], "\xfe" => [130, "V"], "\xff" => [9, "V"]], ["\x00" => [77, "U0"], "\x01" => [18, "U0"], "\x02" => [77, "U1"], "\x03" => [18, "U1"], "\x04" => [77, "U2"], "\x05" => [18, "U2"], "\x06" => [77, "Ua"], "\x07" => [18, "Ua"], "\x08" => [77, "Uc"], "\t" => [18, "Uc"], "\n" => [77, "Ue"], "\v" => [18, "Ue"], "\f" => [77, "Ui"], "\r" => [18, "Ui"], "\x0e" => [77, "Uo"], "\x0f" => [18, "Uo"], "\x10" => [77, "Us"], "\x11" => [18, "Us"], "\x12" => [77, "Ut"], "\x13" => [18, "Ut"], "\x14" => [0, "U "], "\x15" => [0, "U%"], "\x16" => [0, "U-"], "\x17" => [0, "U."], "\x18" => [0, "U/"], "\x19" => [0, "U3"], "\x1a" => [0, "U4"], "\x1b" => [0, "U5"], "\x1c" => [0, "U6"], "\x1d" => [0, "U7"], "\x1e" => [0, "U8"], "\x1f" => [0, "U9"], " " => [0, "U="], "!" => [0, "UA"], "\"" => [0, "U_"], "#" => [0, "Ub"], "\$" => [0, "Ud"], "%" => [0, "Uf"], "&" => [0, "Ug"], "'" => [0, "Uh"], "(" => [0, "Ul"], ")" => [0, "Um"], "*" => [0, "Un"], "+" => [0, "Up"], "," => [0, "Ur"], "-" => [0, "Uu"], "." => [100, "U"], "/" => [110, "U"], [111, "U"], [115, "U"], [116, "U"], [118, "U"], [119, "U"], [122, "U"], [123, "U"], [125, "U"], [126, "U"], [129, "U"], ":" => [143, "U"], ";" => [148, "U"], "<" => [151, "U"], "=" => [153, "U"], ">" => [83, "U"], "?" => [10, "U"], "@" => [77, "V0"], "A" => [18, "V0"], "B" => [77, "V1"], "C" => [18, "V1"], "D" => [77, "V2"], "E" => [18, "V2"], "F" => [77, "Va"], "G" => [18, "Va"], "H" => [77, "Vc"], "I" => [18, "Vc"], "J" => [77, "Ve"], "K" => [18, "Ve"], "L" => [77, "Vi"], "M" => [18, "Vi"], "N" => [77, "Vo"], "O" => [18, "Vo"], "P" => [77, "Vs"], "Q" => [18, "Vs"], "R" => [77, "Vt"], "S" => [18, "Vt"], "T" => [0, "V "], "U" => [0, "V%"], "V" => [0, "V-"], "W" => [0, "V."], "X" => [0, "V/"], "Y" => [0, "V3"], "Z" => [0, "V4"], "[" => [0, "V5"], "\\" => [0, "V6"], "]" => [0, "V7"], "^" => [0, "V8"], "_" => [0, "V9"], "`" => [0, "V="], "a" => [0, "VA"], "b" => [0, "V_"], "c" => [0, "Vb"], "d" => [0, "Vd"], "e" => [0, "Vf"], "f" => [0, "Vg"], "g" => [0, "Vh"], "h" => [0, "Vl"], "i" => [0, "Vm"], "j" => [0, "Vn"], "k" => [0, "Vp"], "l" => [0, "Vr"], "m" => [0, "Vu"], "n" => [100, "V"], "o" => [110, "V"], "p" => [111, "V"], "q" => [115, "V"], "r" => [116, "V"], "s" => [118, "V"], "t" => [119, "V"], "u" => [122, "V"], "v" => [123, "V"], "w" => [125, "V"], "x" => [126, "V"], "y" => [129, "V"], "z" => [143, "V"], "{" => [148, "V"], "|" => [151, "V"], "}" => [153, "V"], "~" => [83, "V"], "" => [10, "V"], "\x80" => [77, "W0"], "\x81" => [18, "W0"], "\x82" => [77, "W1"], "\x83" => [18, "W1"], "\x84" => [77, "W2"], "\x85" => [18, "W2"], "\x86" => [77, "Wa"], "\x87" => [18, "Wa"], "\x88" => [77, "Wc"], "\x89" => [18, "Wc"], "\x8a" => [77, "We"], "\x8b" => [18, "We"], "\x8c" => [77, "Wi"], "\x8d" => [18, "Wi"], "\x8e" => [77, "Wo"], "\x8f" => [18, "Wo"], "\x90" => [77, "Ws"], "\x91" => [18, "Ws"], "\x92" => [77, "Wt"], "\x93" => [18, "Wt"], "\x94" => [0, "W "], "\x95" => [0, "W%"], "\x96" => [0, "W-"], "\x97" => [0, "W."], "\x98" => [0, "W/"], "\x99" => [0, "W3"], "\x9a" => [0, "W4"], "\x9b" => [0, "W5"], "\x9c" => [0, "W6"], "\x9d" => [0, "W7"], "\x9e" => [0, "W8"], "\x9f" => [0, "W9"], "\xa0" => [0, "W="], "\xa1" => [0, "WA"], "\xa2" => [0, "W_"], "\xa3" => [0, "Wb"], "\xa4" => [0, "Wd"], "\xa5" => [0, "Wf"], "\xa6" => [0, "Wg"], "\xa7" => [0, "Wh"], "\xa8" => [0, "Wl"], "\xa9" => [0, "Wm"], "\xaa" => [0, "Wn"], "\xab" => [0, "Wp"], "\xac" => [0, "Wr"], "\xad" => [0, "Wu"], "\xae" => [100, "W"], "\xaf" => [110, "W"], "\xb0" => [111, "W"], "\xb1" => [115, "W"], "\xb2" => [116, "W"], "\xb3" => [118, "W"], "\xb4" => [119, "W"], "\xb5" => [122, "W"], "\xb6" => [123, "W"], "\xb7" => [125, "W"], "\xb8" => [126, "W"], "\xb9" => [129, "W"], "\xba" => [143, "W"], "\xbb" => [148, "W"], "\xbc" => [151, "W"], "\xbd" => [153, "W"], "\xbe" => [83, "W"], "\xbf" => [10, "W"], "\xc0" => [77, "Y0"], "\xc1" => [18, "Y0"], "\xc2" => [77, "Y1"], "\xc3" => [18, "Y1"], "\xc4" => [77, "Y2"], "\xc5" => [18, "Y2"], "\xc6" => [77, "Ya"], "\xc7" => [18, "Ya"], "\xc8" => [77, "Yc"], "\xc9" => [18, "Yc"], "\xca" => [77, "Ye"], "\xcb" => [18, "Ye"], "\xcc" => [77, "Yi"], "\xcd" => [18, "Yi"], "\xce" => [77, "Yo"], "\xcf" => [18, "Yo"], "\xd0" => [77, "Ys"], "\xd1" => [18, "Ys"], "\xd2" => [77, "Yt"], "\xd3" => [18, "Yt"], "\xd4" => [0, "Y "], "\xd5" => [0, "Y%"], "\xd6" => [0, "Y-"], "\xd7" => [0, "Y."], "\xd8" => [0, "Y/"], "\xd9" => [0, "Y3"], "\xda" => [0, "Y4"], "\xdb" => [0, "Y5"], "\xdc" => [0, "Y6"], "\xdd" => [0, "Y7"], "\xde" => [0, "Y8"], "\xdf" => [0, "Y9"], "\xe0" => [0, "Y="], "\xe1" => [0, "YA"], "\xe2" => [0, "Y_"], "\xe3" => [0, "Yb"], "\xe4" => [0, "Yd"], "\xe5" => [0, "Yf"], "\xe6" => [0, "Yg"], "\xe7" => [0, "Yh"], "\xe8" => [0, "Yl"], "\xe9" => [0, "Ym"], "\xea" => [0, "Yn"], "\xeb" => [0, "Yp"], "\xec" => [0, "Yr"], "\xed" => [0, "Yu"], "\xee" => [100, "Y"], "\xef" => [110, "Y"], "\xf0" => [111, "Y"], "\xf1" => [115, "Y"], "\xf2" => [116, "Y"], "\xf3" => [118, "Y"], "\xf4" => [119, "Y"], "\xf5" => [122, "Y"], "\xf6" => [123, "Y"], "\xf7" => [125, "Y"], "\xf8" => [126, "Y"], "\xf9" => [129, "Y"], "\xfa" => [143, "Y"], "\xfb" => [148, "Y"], "\xfc" => [151, "Y"], "\xfd" => [153, "Y"], "\xfe" => [83, "Y"], "\xff" => [10, "Y"]], ["\x00" => [0, "U0"], "\x01" => [0, "U1"], "\x02" => [0, "U2"], "\x03" => [0, "Ua"], "\x04" => [0, "Uc"], "\x05" => [0, "Ue"], "\x06" => [0, "Ui"], "\x07" => [0, "Uo"], "\x08" => [0, "Us"], "\t" => [0, "Ut"], "\n" => [73, "U"], "\v" => [88, "U"], "\f" => [89, "U"], "\r" => [96, "U"], "\x0e" => [97, "U"], "\x0f" => [99, "U"], "\x10" => [106, "U"], "\x11" => [136, "U"], "\x12" => [139, "U"], "\x13" => [141, "U"], "\x14" => [145, "U"], "\x15" => [147, "U"], "\x16" => [149, "U"], "\x17" => [101, "U"], "\x18" => [112, "U"], "\x19" => [117, "U"], "\x1a" => [120, "U"], "\x1b" => [124, "U"], "\x1c" => [127, "U"], "\x1d" => [144, "U"], "\x1e" => [152, "U"], "\x1f" => [11, "U"], " " => [0, "V0"], "!" => [0, "V1"], "\"" => [0, "V2"], "#" => [0, "Va"], "\$" => [0, "Vc"], "%" => [0, "Ve"], "&" => [0, "Vi"], "'" => [0, "Vo"], "(" => [0, "Vs"], ")" => [0, "Vt"], "*" => [73, "V"], "+" => [88, "V"], "," => [89, "V"], "-" => [96, "V"], "." => [97, "V"], "/" => [99, "V"], [106, "V"], [136, "V"], [139, "V"], [141, "V"], [145, "V"], [147, "V"], [149, "V"], [101, "V"], [112, "V"], [117, "V"], ":" => [120, "V"], ";" => [124, "V"], "<" => [127, "V"], "=" => [144, "V"], ">" => [152, "V"], "?" => [11, "V"], "@" => [0, "W0"], "A" => [0, "W1"], "B" => [0, "W2"], "C" => [0, "Wa"], "D" => [0, "Wc"], "E" => [0, "We"], "F" => [0, "Wi"], "G" => [0, "Wo"], "H" => [0, "Ws"], "I" => [0, "Wt"], "J" => [73, "W"], "K" => [88, "W"], "L" => [89, "W"], "M" => [96, "W"], "N" => [97, "W"], "O" => [99, "W"], "P" => [106, "W"], "Q" => [136, "W"], "R" => [139, "W"], "S" => [141, "W"], "T" => [145, "W"], "U" => [147, "W"], "V" => [149, "W"], "W" => [101, "W"], "X" => [112, "W"], "Y" => [117, "W"], "Z" => [120, "W"], "[" => [124, "W"], "\\" => [127, "W"], "]" => [144, "W"], "^" => [152, "W"], "_" => [11, "W"], "`" => [0, "Y0"], "a" => [0, "Y1"], "b" => [0, "Y2"], "c" => [0, "Ya"], "d" => [0, "Yc"], "e" => [0, "Ye"], "f" => [0, "Yi"], "g" => [0, "Yo"], "h" => [0, "Ys"], "i" => [0, "Yt"], "j" => [73, "Y"], "k" => [88, "Y"], "l" => [89, "Y"], "m" => [96, "Y"], "n" => [97, "Y"], "o" => [99, "Y"], "p" => [106, "Y"], "q" => [136, "Y"], "r" => [139, "Y"], "s" => [141, "Y"], "t" => [145, "Y"], "u" => [147, "Y"], "v" => [149, "Y"], "w" => [101, "Y"], "x" => [112, "Y"], "y" => [117, "Y"], "z" => [120, "Y"], "{" => [124, "Y"], "|" => [127, "Y"], "}" => [144, "Y"], "~" => [152, "Y"], "" => [11, "Y"], "\x80" => [0, "j0"], "\x81" => [0, "j1"], "\x82" => [0, "j2"], "\x83" => [0, "ja"], "\x84" => [0, "jc"], "\x85" => [0, "je"], "\x86" => [0, "ji"], "\x87" => [0, "jo"], "\x88" => [0, "js"], "\x89" => [0, "jt"], "\x8a" => [73, "j"], "\x8b" => [88, "j"], "\x8c" => [89, "j"], "\x8d" => [96, "j"], "\x8e" => [97, "j"], "\x8f" => [99, "j"], "\x90" => [106, "j"], "\x91" => [136, "j"], "\x92" => [139, "j"], "\x93" => [141, "j"], "\x94" => [145, "j"], "\x95" => [147, "j"], "\x96" => [149, "j"], "\x97" => [101, "j"], "\x98" => [112, "j"], "\x99" => [117, "j"], "\x9a" => [120, "j"], "\x9b" => [124, "j"], "\x9c" => [127, "j"], "\x9d" => [144, "j"], "\x9e" => [152, "j"], "\x9f" => [11, "j"], "\xa0" => [0, "k0"], "\xa1" => [0, "k1"], "\xa2" => [0, "k2"], "\xa3" => [0, "ka"], "\xa4" => [0, "kc"], "\xa5" => [0, "ke"], "\xa6" => [0, "ki"], "\xa7" => [0, "ko"], "\xa8" => [0, "ks"], "\xa9" => [0, "kt"], "\xaa" => [73, "k"], "\xab" => [88, "k"], "\xac" => [89, "k"], "\xad" => [96, "k"], "\xae" => [97, "k"], "\xaf" => [99, "k"], "\xb0" => [106, "k"], "\xb1" => [136, "k"], "\xb2" => [139, "k"], "\xb3" => [141, "k"], "\xb4" => [145, "k"], "\xb5" => [147, "k"], "\xb6" => [149, "k"], "\xb7" => [101, "k"], "\xb8" => [112, "k"], "\xb9" => [117, "k"], "\xba" => [120, "k"], "\xbb" => [124, "k"], "\xbc" => [127, "k"], "\xbd" => [144, "k"], "\xbe" => [152, "k"], "\xbf" => [11, "k"], "\xc0" => [0, "q0"], "\xc1" => [0, "q1"], "\xc2" => [0, "q2"], "\xc3" => [0, "qa"], "\xc4" => [0, "qc"], "\xc5" => [0, "qe"], "\xc6" => [0, "qi"], "\xc7" => [0, "qo"], "\xc8" => [0, "qs"], "\xc9" => [0, "qt"], "\xca" => [73, "q"], "\xcb" => [88, "q"], "\xcc" => [89, "q"], "\xcd" => [96, "q"], "\xce" => [97, "q"], "\xcf" => [99, "q"], "\xd0" => [106, "q"], "\xd1" => [136, "q"], "\xd2" => [139, "q"], "\xd3" => [141, "q"], "\xd4" => [145, "q"], "\xd5" => [147, "q"], "\xd6" => [149, "q"], "\xd7" => [101, "q"], "\xd8" => [112, "q"], "\xd9" => [117, "q"], "\xda" => [120, "q"], "\xdb" => [124, "q"], "\xdc" => [127, "q"], "\xdd" => [144, "q"], "\xde" => [152, "q"], "\xdf" => [11, "q"], "\xe0" => [0, "v0"], "\xe1" => [0, "v1"], "\xe2" => [0, "v2"], "\xe3" => [0, "va"], "\xe4" => [0, "vc"], "\xe5" => [0, "ve"], "\xe6" => [0, "vi"], "\xe7" => [0, "vo"], "\xe8" => [0, "vs"], "\xe9" => [0, "vt"], "\xea" => [73, "v"], "\xeb" => [88, "v"], "\xec" => [89, "v"], "\xed" => [96, "v"], "\xee" => [97, "v"], "\xef" => [99, "v"], "\xf0" => [106, "v"], "\xf1" => [136, "v"], "\xf2" => [139, "v"], "\xf3" => [141, "v"], "\xf4" => [145, "v"], "\xf5" => [147, "v"], "\xf6" => [149, "v"], "\xf7" => [101, "v"], "\xf8" => [112, "v"], "\xf9" => [117, "v"], "\xfa" => [120, "v"], "\xfb" => [124, "v"], "\xfc" => [127, "v"], "\xfd" => [144, "v"], "\xfe" => [152, "v"], "\xff" => [11, "v"]], ["\x00" => [94, "W0"], "\x01" => [76, "W0"], "\x02" => [104, "W0"], "\x03" => [16, "W0"], "\x04" => [94, "W1"], "\x05" => [76, "W1"], "\x06" => [104, "W1"], "\x07" => [16, "W1"], "\x08" => [94, "W2"], "\t" => [76, "W2"], "\n" => [104, "W2"], "\v" => [16, "W2"], "\f" => [94, "Wa"], "\r" => [76, "Wa"], "\x0e" => [104, "Wa"], "\x0f" => [16, "Wa"], "\x10" => [94, "Wc"], "\x11" => [76, "Wc"], "\x12" => [104, "Wc"], "\x13" => [16, "Wc"], "\x14" => [94, "We"], "\x15" => [76, "We"], "\x16" => [104, "We"], "\x17" => [16, "We"], "\x18" => [94, "Wi"], "\x19" => [76, "Wi"], "\x1a" => [104, "Wi"], "\x1b" => [16, "Wi"], "\x1c" => [94, "Wo"], "\x1d" => [76, "Wo"], "\x1e" => [104, "Wo"], "\x1f" => [16, "Wo"], " " => [94, "Ws"], "!" => [76, "Ws"], "\"" => [104, "Ws"], "#" => [16, "Ws"], "\$" => [94, "Wt"], "%" => [76, "Wt"], "&" => [104, "Wt"], "'" => [16, "Wt"], "(" => [77, "W "], ")" => [18, "W "], "*" => [77, "W%"], "+" => [18, "W%"], "," => [77, "W-"], "-" => [18, "W-"], "." => [77, "W."], "/" => [18, "W."], [77, "W/"], [18, "W/"], [77, "W3"], [18, "W3"], [77, "W4"], [18, "W4"], [77, "W5"], [18, "W5"], [77, "W6"], [18, "W6"], ":" => [77, "W7"], ";" => [18, "W7"], "<" => [77, "W8"], "=" => [18, "W8"], ">" => [77, "W9"], "?" => [18, "W9"], "@" => [77, "W="], "A" => [18, "W="], "B" => [77, "WA"], "C" => [18, "WA"], "D" => [77, "W_"], "E" => [18, "W_"], "F" => [77, "Wb"], "G" => [18, "Wb"], "H" => [77, "Wd"], "I" => [18, "Wd"], "J" => [77, "Wf"], "K" => [18, "Wf"], "L" => [77, "Wg"], "M" => [18, "Wg"], "N" => [77, "Wh"], "O" => [18, "Wh"], "P" => [77, "Wl"], "Q" => [18, "Wl"], "R" => [77, "Wm"], "S" => [18, "Wm"], "T" => [77, "Wn"], "U" => [18, "Wn"], "V" => [77, "Wp"], "W" => [18, "Wp"], "X" => [77, "Wr"], "Y" => [18, "Wr"], "Z" => [77, "Wu"], "[" => [18, "Wu"], "\\" => [0, "W:"], "]" => [0, "WB"], "^" => [0, "WC"], "_" => [0, "WD"], "`" => [0, "WE"], "a" => [0, "WF"], "b" => [0, "WG"], "c" => [0, "WH"], "d" => [0, "WI"], "e" => [0, "WJ"], "f" => [0, "WK"], "g" => [0, "WL"], "h" => [0, "WM"], "i" => [0, "WN"], "j" => [0, "WO"], "k" => [0, "WP"], "l" => [0, "WQ"], "m" => [0, "WR"], "n" => [0, "WS"], "o" => [0, "WT"], "p" => [0, "WU"], "q" => [0, "WV"], "r" => [0, "WW"], "s" => [0, "WY"], "t" => [0, "Wj"], "u" => [0, "Wk"], "v" => [0, "Wq"], "w" => [0, "Wv"], "x" => [0, "Ww"], "y" => [0, "Wx"], "z" => [0, "Wy"], "{" => [0, "Wz"], "|" => [82, "W"], "}" => [87, "W"], "~" => [130, "W"], "" => [9, "W"], "\x80" => [94, "Y0"], "\x81" => [76, "Y0"], "\x82" => [104, "Y0"], "\x83" => [16, "Y0"], "\x84" => [94, "Y1"], "\x85" => [76, "Y1"], "\x86" => [104, "Y1"], "\x87" => [16, "Y1"], "\x88" => [94, "Y2"], "\x89" => [76, "Y2"], "\x8a" => [104, "Y2"], "\x8b" => [16, "Y2"], "\x8c" => [94, "Ya"], "\x8d" => [76, "Ya"], "\x8e" => [104, "Ya"], "\x8f" => [16, "Ya"], "\x90" => [94, "Yc"], "\x91" => [76, "Yc"], "\x92" => [104, "Yc"], "\x93" => [16, "Yc"], "\x94" => [94, "Ye"], "\x95" => [76, "Ye"], "\x96" => [104, "Ye"], "\x97" => [16, "Ye"], "\x98" => [94, "Yi"], "\x99" => [76, "Yi"], "\x9a" => [104, "Yi"], "\x9b" => [16, "Yi"], "\x9c" => [94, "Yo"], "\x9d" => [76, "Yo"], "\x9e" => [104, "Yo"], "\x9f" => [16, "Yo"], "\xa0" => [94, "Ys"], "\xa1" => [76, "Ys"], "\xa2" => [104, "Ys"], "\xa3" => [16, "Ys"], "\xa4" => [94, "Yt"], "\xa5" => [76, "Yt"], "\xa6" => [104, "Yt"], "\xa7" => [16, "Yt"], "\xa8" => [77, "Y "], "\xa9" => [18, "Y "], "\xaa" => [77, "Y%"], "\xab" => [18, "Y%"], "\xac" => [77, "Y-"], "\xad" => [18, "Y-"], "\xae" => [77, "Y."], "\xaf" => [18, "Y."], "\xb0" => [77, "Y/"], "\xb1" => [18, "Y/"], "\xb2" => [77, "Y3"], "\xb3" => [18, "Y3"], "\xb4" => [77, "Y4"], "\xb5" => [18, "Y4"], "\xb6" => [77, "Y5"], "\xb7" => [18, "Y5"], "\xb8" => [77, "Y6"], "\xb9" => [18, "Y6"], "\xba" => [77, "Y7"], "\xbb" => [18, "Y7"], "\xbc" => [77, "Y8"], "\xbd" => [18, "Y8"], "\xbe" => [77, "Y9"], "\xbf" => [18, "Y9"], "\xc0" => [77, "Y="], "\xc1" => [18, "Y="], "\xc2" => [77, "YA"], "\xc3" => [18, "YA"], "\xc4" => [77, "Y_"], "\xc5" => [18, "Y_"], "\xc6" => [77, "Yb"], "\xc7" => [18, "Yb"], "\xc8" => [77, "Yd"], "\xc9" => [18, "Yd"], "\xca" => [77, "Yf"], "\xcb" => [18, "Yf"], "\xcc" => [77, "Yg"], "\xcd" => [18, "Yg"], "\xce" => [77, "Yh"], "\xcf" => [18, "Yh"], "\xd0" => [77, "Yl"], "\xd1" => [18, "Yl"], "\xd2" => [77, "Ym"], "\xd3" => [18, "Ym"], "\xd4" => [77, "Yn"], "\xd5" => [18, "Yn"], "\xd6" => [77, "Yp"], "\xd7" => [18, "Yp"], "\xd8" => [77, "Yr"], "\xd9" => [18, "Yr"], "\xda" => [77, "Yu"], "\xdb" => [18, "Yu"], "\xdc" => [0, "Y:"], "\xdd" => [0, "YB"], "\xde" => [0, "YC"], "\xdf" => [0, "YD"], "\xe0" => [0, "YE"], "\xe1" => [0, "YF"], "\xe2" => [0, "YG"], "\xe3" => [0, "YH"], "\xe4" => [0, "YI"], "\xe5" => [0, "YJ"], "\xe6" => [0, "YK"], "\xe7" => [0, "YL"], "\xe8" => [0, "YM"], "\xe9" => [0, "YN"], "\xea" => [0, "YO"], "\xeb" => [0, "YP"], "\xec" => [0, "YQ"], "\xed" => [0, "YR"], "\xee" => [0, "YS"], "\xef" => [0, "YT"], "\xf0" => [0, "YU"], "\xf1" => [0, "YV"], "\xf2" => [0, "YW"], "\xf3" => [0, "YY"], "\xf4" => [0, "Yj"], "\xf5" => [0, "Yk"], "\xf6" => [0, "Yq"], "\xf7" => [0, "Yv"], "\xf8" => [0, "Yw"], "\xf9" => [0, "Yx"], "\xfa" => [0, "Yy"], "\xfb" => [0, "Yz"], "\xfc" => [82, "Y"], "\xfd" => [87, "Y"], "\xfe" => [130, "Y"], "\xff" => [9, "Y"]], ["\x00" => [94, "X0"], "\x01" => [76, "X0"], "\x02" => [104, "X0"], "\x03" => [16, "X0"], "\x04" => [94, "X1"], "\x05" => [76, "X1"], "\x06" => [104, "X1"], "\x07" => [16, "X1"], "\x08" => [94, "X2"], "\t" => [76, "X2"], "\n" => [104, "X2"], "\v" => [16, "X2"], "\f" => [94, "Xa"], "\r" => [76, "Xa"], "\x0e" => [104, "Xa"], "\x0f" => [16, "Xa"], "\x10" => [94, "Xc"], "\x11" => [76, "Xc"], "\x12" => [104, "Xc"], "\x13" => [16, "Xc"], "\x14" => [94, "Xe"], "\x15" => [76, "Xe"], "\x16" => [104, "Xe"], "\x17" => [16, "Xe"], "\x18" => [94, "Xi"], "\x19" => [76, "Xi"], "\x1a" => [104, "Xi"], "\x1b" => [16, "Xi"], "\x1c" => [94, "Xo"], "\x1d" => [76, "Xo"], "\x1e" => [104, "Xo"], "\x1f" => [16, "Xo"], " " => [94, "Xs"], "!" => [76, "Xs"], "\"" => [104, "Xs"], "#" => [16, "Xs"], "\$" => [94, "Xt"], "%" => [76, "Xt"], "&" => [104, "Xt"], "'" => [16, "Xt"], "(" => [77, "X "], ")" => [18, "X "], "*" => [77, "X%"], "+" => [18, "X%"], "," => [77, "X-"], "-" => [18, "X-"], "." => [77, "X."], "/" => [18, "X."], [77, "X/"], [18, "X/"], [77, "X3"], [18, "X3"], [77, "X4"], [18, "X4"], [77, "X5"], [18, "X5"], [77, "X6"], [18, "X6"], ":" => [77, "X7"], ";" => [18, "X7"], "<" => [77, "X8"], "=" => [18, "X8"], ">" => [77, "X9"], "?" => [18, "X9"], "@" => [77, "X="], "A" => [18, "X="], "B" => [77, "XA"], "C" => [18, "XA"], "D" => [77, "X_"], "E" => [18, "X_"], "F" => [77, "Xb"], "G" => [18, "Xb"], "H" => [77, "Xd"], "I" => [18, "Xd"], "J" => [77, "Xf"], "K" => [18, "Xf"], "L" => [77, "Xg"], "M" => [18, "Xg"], "N" => [77, "Xh"], "O" => [18, "Xh"], "P" => [77, "Xl"], "Q" => [18, "Xl"], "R" => [77, "Xm"], "S" => [18, "Xm"], "T" => [77, "Xn"], "U" => [18, "Xn"], "V" => [77, "Xp"], "W" => [18, "Xp"], "X" => [77, "Xr"], "Y" => [18, "Xr"], "Z" => [77, "Xu"], "[" => [18, "Xu"], "\\" => [0, "X:"], "]" => [0, "XB"], "^" => [0, "XC"], "_" => [0, "XD"], "`" => [0, "XE"], "a" => [0, "XF"], "b" => [0, "XG"], "c" => [0, "XH"], "d" => [0, "XI"], "e" => [0, "XJ"], "f" => [0, "XK"], "g" => [0, "XL"], "h" => [0, "XM"], "i" => [0, "XN"], "j" => [0, "XO"], "k" => [0, "XP"], "l" => [0, "XQ"], "m" => [0, "XR"], "n" => [0, "XS"], "o" => [0, "XT"], "p" => [0, "XU"], "q" => [0, "XV"], "r" => [0, "XW"], "s" => [0, "XY"], "t" => [0, "Xj"], "u" => [0, "Xk"], "v" => [0, "Xq"], "w" => [0, "Xv"], "x" => [0, "Xw"], "y" => [0, "Xx"], "z" => [0, "Xy"], "{" => [0, "Xz"], "|" => [82, "X"], "}" => [87, "X"], "~" => [130, "X"], "" => [9, "X"], "\x80" => [94, "Z0"], "\x81" => [76, "Z0"], "\x82" => [104, "Z0"], "\x83" => [16, "Z0"], "\x84" => [94, "Z1"], "\x85" => [76, "Z1"], "\x86" => [104, "Z1"], "\x87" => [16, "Z1"], "\x88" => [94, "Z2"], "\x89" => [76, "Z2"], "\x8a" => [104, "Z2"], "\x8b" => [16, "Z2"], "\x8c" => [94, "Za"], "\x8d" => [76, "Za"], "\x8e" => [104, "Za"], "\x8f" => [16, "Za"], "\x90" => [94, "Zc"], "\x91" => [76, "Zc"], "\x92" => [104, "Zc"], "\x93" => [16, "Zc"], "\x94" => [94, "Ze"], "\x95" => [76, "Ze"], "\x96" => [104, "Ze"], "\x97" => [16, "Ze"], "\x98" => [94, "Zi"], "\x99" => [76, "Zi"], "\x9a" => [104, "Zi"], "\x9b" => [16, "Zi"], "\x9c" => [94, "Zo"], "\x9d" => [76, "Zo"], "\x9e" => [104, "Zo"], "\x9f" => [16, "Zo"], "\xa0" => [94, "Zs"], "\xa1" => [76, "Zs"], "\xa2" => [104, "Zs"], "\xa3" => [16, "Zs"], "\xa4" => [94, "Zt"], "\xa5" => [76, "Zt"], "\xa6" => [104, "Zt"], "\xa7" => [16, "Zt"], "\xa8" => [77, "Z "], "\xa9" => [18, "Z "], "\xaa" => [77, "Z%"], "\xab" => [18, "Z%"], "\xac" => [77, "Z-"], "\xad" => [18, "Z-"], "\xae" => [77, "Z."], "\xaf" => [18, "Z."], "\xb0" => [77, "Z/"], "\xb1" => [18, "Z/"], "\xb2" => [77, "Z3"], "\xb3" => [18, "Z3"], "\xb4" => [77, "Z4"], "\xb5" => [18, "Z4"], "\xb6" => [77, "Z5"], "\xb7" => [18, "Z5"], "\xb8" => [77, "Z6"], "\xb9" => [18, "Z6"], "\xba" => [77, "Z7"], "\xbb" => [18, "Z7"], "\xbc" => [77, "Z8"], "\xbd" => [18, "Z8"], "\xbe" => [77, "Z9"], "\xbf" => [18, "Z9"], "\xc0" => [77, "Z="], "\xc1" => [18, "Z="], "\xc2" => [77, "ZA"], "\xc3" => [18, "ZA"], "\xc4" => [77, "Z_"], "\xc5" => [18, "Z_"], "\xc6" => [77, "Zb"], "\xc7" => [18, "Zb"], "\xc8" => [77, "Zd"], "\xc9" => [18, "Zd"], "\xca" => [77, "Zf"], "\xcb" => [18, "Zf"], "\xcc" => [77, "Zg"], "\xcd" => [18, "Zg"], "\xce" => [77, "Zh"], "\xcf" => [18, "Zh"], "\xd0" => [77, "Zl"], "\xd1" => [18, "Zl"], "\xd2" => [77, "Zm"], "\xd3" => [18, "Zm"], "\xd4" => [77, "Zn"], "\xd5" => [18, "Zn"], "\xd6" => [77, "Zp"], "\xd7" => [18, "Zp"], "\xd8" => [77, "Zr"], "\xd9" => [18, "Zr"], "\xda" => [77, "Zu"], "\xdb" => [18, "Zu"], "\xdc" => [0, "Z:"], "\xdd" => [0, "ZB"], "\xde" => [0, "ZC"], "\xdf" => [0, "ZD"], "\xe0" => [0, "ZE"], "\xe1" => [0, "ZF"], "\xe2" => [0, "ZG"], "\xe3" => [0, "ZH"], "\xe4" => [0, "ZI"], "\xe5" => [0, "ZJ"], "\xe6" => [0, "ZK"], "\xe7" => [0, "ZL"], "\xe8" => [0, "ZM"], "\xe9" => [0, "ZN"], "\xea" => [0, "ZO"], "\xeb" => [0, "ZP"], "\xec" => [0, "ZQ"], "\xed" => [0, "ZR"], "\xee" => [0, "ZS"], "\xef" => [0, "ZT"], "\xf0" => [0, "ZU"], "\xf1" => [0, "ZV"], "\xf2" => [0, "ZW"], "\xf3" => [0, "ZY"], "\xf4" => [0, "Zj"], "\xf5" => [0, "Zk"], "\xf6" => [0, "Zq"], "\xf7" => [0, "Zv"], "\xf8" => [0, "Zw"], "\xf9" => [0, "Zx"], "\xfa" => [0, "Zy"], "\xfb" => [0, "Zz"], "\xfc" => [82, "Z"], "\xfd" => [87, "Z"], "\xfe" => [130, "Z"], "\xff" => [9, "Z"]], ["\x00" => [0, "\\0"], "\x01" => [0, "\\1"], "\x02" => [0, "\\2"], "\x03" => [0, "\\a"], "\x04" => [0, "\\c"], "\x05" => [0, "\\e"], "\x06" => [0, "\\i"], "\x07" => [0, "\\o"], "\x08" => [0, "\\s"], "\t" => [0, "\\t"], "\n" => [73, "\\"], "\v" => [88, "\\"], "\f" => [89, "\\"], "\r" => [96, "\\"], "\x0e" => [97, "\\"], "\x0f" => [99, "\\"], "\x10" => [106, "\\"], "\x11" => [136, "\\"], "\x12" => [139, "\\"], "\x13" => [141, "\\"], "\x14" => [145, "\\"], "\x15" => [147, "\\"], "\x16" => [149, "\\"], "\x17" => [101, "\\"], "\x18" => [112, "\\"], "\x19" => [117, "\\"], "\x1a" => [120, "\\"], "\x1b" => [124, "\\"], "\x1c" => [127, "\\"], "\x1d" => [144, "\\"], "\x1e" => [152, "\\"], "\x1f" => [11, "\\"], " " => [0, "\xc30"], "!" => [0, "\xc31"], "\"" => [0, "\xc32"], "#" => [0, "\xc3a"], "\$" => [0, "\xc3c"], "%" => [0, "\xc3e"], "&" => [0, "\xc3i"], "'" => [0, "\xc3o"], "(" => [0, "\xc3s"], ")" => [0, "\xc3t"], "*" => [73, "\xc3"], "+" => [88, "\xc3"], "," => [89, "\xc3"], "-" => [96, "\xc3"], "." => [97, "\xc3"], "/" => [99, "\xc3"], [106, "\xc3"], [136, "\xc3"], [139, "\xc3"], [141, "\xc3"], [145, "\xc3"], [147, "\xc3"], [149, "\xc3"], [101, "\xc3"], [112, "\xc3"], [117, "\xc3"], ":" => [120, "\xc3"], ";" => [124, "\xc3"], "<" => [127, "\xc3"], "=" => [144, "\xc3"], ">" => [152, "\xc3"], "?" => [11, "\xc3"], "@" => [0, "\xd00"], "A" => [0, "\xd01"], "B" => [0, "\xd02"], "C" => [0, "\xd0a"], "D" => [0, "\xd0c"], "E" => [0, "\xd0e"], "F" => [0, "\xd0i"], "G" => [0, "\xd0o"], "H" => [0, "\xd0s"], "I" => [0, "\xd0t"], "J" => [73, "\xd0"], "K" => [88, "\xd0"], "L" => [89, "\xd0"], "M" => [96, "\xd0"], "N" => [97, "\xd0"], "O" => [99, "\xd0"], "P" => [106, "\xd0"], "Q" => [136, "\xd0"], "R" => [139, "\xd0"], "S" => [141, "\xd0"], "T" => [145, "\xd0"], "U" => [147, "\xd0"], "V" => [149, "\xd0"], "W" => [101, "\xd0"], "X" => [112, "\xd0"], "Y" => [117, "\xd0"], "Z" => [120, "\xd0"], "[" => [124, "\xd0"], "\\" => [127, "\xd0"], "]" => [144, "\xd0"], "^" => [152, "\xd0"], "_" => [11, "\xd0"], "`" => [92, "\x80"], "a" => [95, "\x80"], "b" => [137, "\x80"], "c" => [142, "\x80"], "d" => [150, "\x80"], "e" => [74, "\x80"], "f" => [90, "\x80"], "g" => [98, "\x80"], "h" => [107, "\x80"], "i" => [140, "\x80"], "j" => [146, "\x80"], "k" => [102, "\x80"], "l" => [113, "\x80"], "m" => [121, "\x80"], "n" => [128, "\x80"], "o" => [12, "\x80"], "p" => [92, "\x82"], "q" => [95, "\x82"], "r" => [137, "\x82"], "s" => [142, "\x82"], "t" => [150, "\x82"], "u" => [74, "\x82"], "v" => [90, "\x82"], "w" => [98, "\x82"], "x" => [107, "\x82"], "y" => [140, "\x82"], "z" => [146, "\x82"], "{" => [102, "\x82"], "|" => [113, "\x82"], "}" => [121, "\x82"], "~" => [128, "\x82"], "" => [12, "\x82"], "\x80" => [92, "\x83"], "\x81" => [95, "\x83"], "\x82" => [137, "\x83"], "\x83" => [142, "\x83"], "\x84" => [150, "\x83"], "\x85" => [74, "\x83"], "\x86" => [90, "\x83"], "\x87" => [98, "\x83"], "\x88" => [107, "\x83"], "\x89" => [140, "\x83"], "\x8a" => [146, "\x83"], "\x8b" => [102, "\x83"], "\x8c" => [113, "\x83"], "\x8d" => [121, "\x83"], "\x8e" => [128, "\x83"], "\x8f" => [12, "\x83"], "\x90" => [92, "\xa2"], "\x91" => [95, "\xa2"], "\x92" => [137, "\xa2"], "\x93" => [142, "\xa2"], "\x94" => [150, "\xa2"], "\x95" => [74, "\xa2"], "\x96" => [90, "\xa2"], "\x97" => [98, "\xa2"], "\x98" => [107, "\xa2"], "\x99" => [140, "\xa2"], "\x9a" => [146, "\xa2"], "\x9b" => [102, "\xa2"], "\x9c" => [113, "\xa2"], "\x9d" => [121, "\xa2"], "\x9e" => [128, "\xa2"], "\x9f" => [12, "\xa2"], "\xa0" => [92, "\xb8"], "\xa1" => [95, "\xb8"], "\xa2" => [137, "\xb8"], "\xa3" => [142, "\xb8"], "\xa4" => [150, "\xb8"], "\xa5" => [74, "\xb8"], "\xa6" => [90, "\xb8"], "\xa7" => [98, "\xb8"], "\xa8" => [107, "\xb8"], "\xa9" => [140, "\xb8"], "\xaa" => [146, "\xb8"], "\xab" => [102, "\xb8"], "\xac" => [113, "\xb8"], "\xad" => [121, "\xb8"], "\xae" => [128, "\xb8"], "\xaf" => [12, "\xb8"], "\xb0" => [92, "\xc2"], "\xb1" => [95, "\xc2"], "\xb2" => [137, "\xc2"], "\xb3" => [142, "\xc2"], "\xb4" => [150, "\xc2"], "\xb5" => [74, "\xc2"], "\xb6" => [90, "\xc2"], "\xb7" => [98, "\xc2"], "\xb8" => [107, "\xc2"], "\xb9" => [140, "\xc2"], "\xba" => [146, "\xc2"], "\xbb" => [102, "\xc2"], "\xbc" => [113, "\xc2"], "\xbd" => [121, "\xc2"], "\xbe" => [128, "\xc2"], "\xbf" => [12, "\xc2"], "\xc0" => [92, "\xe0"], "\xc1" => [95, "\xe0"], "\xc2" => [137, "\xe0"], "\xc3" => [142, "\xe0"], "\xc4" => [150, "\xe0"], "\xc5" => [74, "\xe0"], "\xc6" => [90, "\xe0"], "\xc7" => [98, "\xe0"], "\xc8" => [107, "\xe0"], "\xc9" => [140, "\xe0"], "\xca" => [146, "\xe0"], "\xcb" => [102, "\xe0"], "\xcc" => [113, "\xe0"], "\xcd" => [121, "\xe0"], "\xce" => [128, "\xe0"], "\xcf" => [12, "\xe0"], "\xd0" => [92, "\xe2"], "\xd1" => [95, "\xe2"], "\xd2" => [137, "\xe2"], "\xd3" => [142, "\xe2"], "\xd4" => [150, "\xe2"], "\xd5" => [74, "\xe2"], "\xd6" => [90, "\xe2"], "\xd7" => [98, "\xe2"], "\xd8" => [107, "\xe2"], "\xd9" => [140, "\xe2"], "\xda" => [146, "\xe2"], "\xdb" => [102, "\xe2"], "\xdc" => [113, "\xe2"], "\xdd" => [121, "\xe2"], "\xde" => [128, "\xe2"], "\xdf" => [12, "\xe2"], "\xe0" => [93, "\x99"], "\xe1" => [138, "\x99"], "\xe2" => [75, "\x99"], "\xe3" => [91, "\x99"], "\xe4" => [108, "\x99"], "\xe5" => [103, "\x99"], "\xe6" => [114, "\x99"], "\xe7" => [14, "\x99"], "\xe8" => [93, "\xa1"], "\xe9" => [138, "\xa1"], "\xea" => [75, "\xa1"], "\xeb" => [91, "\xa1"], "\xec" => [108, "\xa1"], "\xed" => [103, "\xa1"], "\xee" => [114, "\xa1"], "\xef" => [14, "\xa1"], "\xf0" => [93, "\xa7"], "\xf1" => [138, "\xa7"], "\xf2" => [75, "\xa7"], "\xf3" => [91, "\xa7"], "\xf4" => [108, "\xa7"], "\xf5" => [103, "\xa7"], "\xf6" => [114, "\xa7"], "\xf7" => [14, "\xa7"], "\xf8" => [93, "\xac"], "\xf9" => [138, "\xac"], "\xfa" => [75, "\xac"], "\xfb" => [91, "\xac"], "\xfc" => [108, "\xac"], "\xfd" => [103, "\xac"], "\xfe" => [114, "\xac"], "\xff" => [14, "\xac"]], ["\x00" => [94, "\\0"], "\x01" => [76, "\\0"], "\x02" => [104, "\\0"], "\x03" => [16, "\\0"], "\x04" => [94, "\\1"], "\x05" => [76, "\\1"], "\x06" => [104, "\\1"], "\x07" => [16, "\\1"], "\x08" => [94, "\\2"], "\t" => [76, "\\2"], "\n" => [104, "\\2"], "\v" => [16, "\\2"], "\f" => [94, "\\a"], "\r" => [76, "\\a"], "\x0e" => [104, "\\a"], "\x0f" => [16, "\\a"], "\x10" => [94, "\\c"], "\x11" => [76, "\\c"], "\x12" => [104, "\\c"], "\x13" => [16, "\\c"], "\x14" => [94, "\\e"], "\x15" => [76, "\\e"], "\x16" => [104, "\\e"], "\x17" => [16, "\\e"], "\x18" => [94, "\\i"], "\x19" => [76, "\\i"], "\x1a" => [104, "\\i"], "\x1b" => [16, "\\i"], "\x1c" => [94, "\\o"], "\x1d" => [76, "\\o"], "\x1e" => [104, "\\o"], "\x1f" => [16, "\\o"], " " => [94, "\\s"], "!" => [76, "\\s"], "\"" => [104, "\\s"], "#" => [16, "\\s"], "\$" => [94, "\\t"], "%" => [76, "\\t"], "&" => [104, "\\t"], "'" => [16, "\\t"], "(" => [77, "\\ "], ")" => [18, "\\ "], "*" => [77, "\\%"], "+" => [18, "\\%"], "," => [77, "\\-"], "-" => [18, "\\-"], "." => [77, "\\."], "/" => [18, "\\."], [77, "\\/"], [18, "\\/"], [77, "\\3"], [18, "\\3"], [77, "\\4"], [18, "\\4"], [77, "\\5"], [18, "\\5"], [77, "\\6"], [18, "\\6"], ":" => [77, "\\7"], ";" => [18, "\\7"], "<" => [77, "\\8"], "=" => [18, "\\8"], ">" => [77, "\\9"], "?" => [18, "\\9"], "@" => [77, "\\="], "A" => [18, "\\="], "B" => [77, "\\A"], "C" => [18, "\\A"], "D" => [77, "\\_"], "E" => [18, "\\_"], "F" => [77, "\\b"], "G" => [18, "\\b"], "H" => [77, "\\d"], "I" => [18, "\\d"], "J" => [77, "\\f"], "K" => [18, "\\f"], "L" => [77, "\\g"], "M" => [18, "\\g"], "N" => [77, "\\h"], "O" => [18, "\\h"], "P" => [77, "\\l"], "Q" => [18, "\\l"], "R" => [77, "\\m"], "S" => [18, "\\m"], "T" => [77, "\\n"], "U" => [18, "\\n"], "V" => [77, "\\p"], "W" => [18, "\\p"], "X" => [77, "\\r"], "Y" => [18, "\\r"], "Z" => [77, "\\u"], "[" => [18, "\\u"], "\\" => [0, "\\:"], "]" => [0, "\\B"], "^" => [0, "\\C"], "_" => [0, "\\D"], "`" => [0, "\\E"], "a" => [0, "\\F"], "b" => [0, "\\G"], "c" => [0, "\\H"], "d" => [0, "\\I"], "e" => [0, "\\J"], "f" => [0, "\\K"], "g" => [0, "\\L"], "h" => [0, "\\M"], "i" => [0, "\\N"], "j" => [0, "\\O"], "k" => [0, "\\P"], "l" => [0, "\\Q"], "m" => [0, "\\R"], "n" => [0, "\\S"], "o" => [0, "\\T"], "p" => [0, "\\U"], "q" => [0, "\\V"], "r" => [0, "\\W"], "s" => [0, "\\Y"], "t" => [0, "\\j"], "u" => [0, "\\k"], "v" => [0, "\\q"], "w" => [0, "\\v"], "x" => [0, "\\w"], "y" => [0, "\\x"], "z" => [0, "\\y"], "{" => [0, "\\z"], "|" => [82, "\\"], "}" => [87, "\\"], "~" => [130, "\\"], "" => [9, "\\"], "\x80" => [94, "\xc30"], "\x81" => [76, "\xc30"], "\x82" => [104, "\xc30"], "\x83" => [16, "\xc30"], "\x84" => [94, "\xc31"], "\x85" => [76, "\xc31"], "\x86" => [104, "\xc31"], "\x87" => [16, "\xc31"], "\x88" => [94, "\xc32"], "\x89" => [76, "\xc32"], "\x8a" => [104, "\xc32"], "\x8b" => [16, "\xc32"], "\x8c" => [94, "\xc3a"], "\x8d" => [76, "\xc3a"], "\x8e" => [104, "\xc3a"], "\x8f" => [16, "\xc3a"], "\x90" => [94, "\xc3c"], "\x91" => [76, "\xc3c"], "\x92" => [104, "\xc3c"], "\x93" => [16, "\xc3c"], "\x94" => [94, "\xc3e"], "\x95" => [76, "\xc3e"], "\x96" => [104, "\xc3e"], "\x97" => [16, "\xc3e"], "\x98" => [94, "\xc3i"], "\x99" => [76, "\xc3i"], "\x9a" => [104, "\xc3i"], "\x9b" => [16, "\xc3i"], "\x9c" => [94, "\xc3o"], "\x9d" => [76, "\xc3o"], "\x9e" => [104, "\xc3o"], "\x9f" => [16, "\xc3o"], "\xa0" => [94, "\xc3s"], "\xa1" => [76, "\xc3s"], "\xa2" => [104, "\xc3s"], "\xa3" => [16, "\xc3s"], "\xa4" => [94, "\xc3t"], "\xa5" => [76, "\xc3t"], "\xa6" => [104, "\xc3t"], "\xa7" => [16, "\xc3t"], "\xa8" => [77, "\xc3 "], "\xa9" => [18, "\xc3 "], "\xaa" => [77, "\xc3%"], "\xab" => [18, "\xc3%"], "\xac" => [77, "\xc3-"], "\xad" => [18, "\xc3-"], "\xae" => [77, "\xc3."], "\xaf" => [18, "\xc3."], "\xb0" => [77, "\xc3/"], "\xb1" => [18, "\xc3/"], "\xb2" => [77, "\xc33"], "\xb3" => [18, "\xc33"], "\xb4" => [77, "\xc34"], "\xb5" => [18, "\xc34"], "\xb6" => [77, "\xc35"], "\xb7" => [18, "\xc35"], "\xb8" => [77, "\xc36"], "\xb9" => [18, "\xc36"], "\xba" => [77, "\xc37"], "\xbb" => [18, "\xc37"], "\xbc" => [77, "\xc38"], "\xbd" => [18, "\xc38"], "\xbe" => [77, "\xc39"], "\xbf" => [18, "\xc39"], "\xc0" => [77, "\xc3="], "\xc1" => [18, "\xc3="], "\xc2" => [77, "\xc3A"], "\xc3" => [18, "\xc3A"], "\xc4" => [77, "\xc3_"], "\xc5" => [18, "\xc3_"], "\xc6" => [77, "\xc3b"], "\xc7" => [18, "\xc3b"], "\xc8" => [77, "\xc3d"], "\xc9" => [18, "\xc3d"], "\xca" => [77, "\xc3f"], "\xcb" => [18, "\xc3f"], "\xcc" => [77, "\xc3g"], "\xcd" => [18, "\xc3g"], "\xce" => [77, "\xc3h"], "\xcf" => [18, "\xc3h"], "\xd0" => [77, "\xc3l"], "\xd1" => [18, "\xc3l"], "\xd2" => [77, "\xc3m"], "\xd3" => [18, "\xc3m"], "\xd4" => [77, "\xc3n"], "\xd5" => [18, "\xc3n"], "\xd6" => [77, "\xc3p"], "\xd7" => [18, "\xc3p"], "\xd8" => [77, "\xc3r"], "\xd9" => [18, "\xc3r"], "\xda" => [77, "\xc3u"], "\xdb" => [18, "\xc3u"], "\xdc" => [0, "\xc3:"], "\xdd" => [0, "\xc3B"], "\xde" => [0, "\xc3C"], "\xdf" => [0, "\xc3D"], "\xe0" => [0, "\xc3E"], "\xe1" => [0, "\xc3F"], "\xe2" => [0, "\xc3G"], "\xe3" => [0, "\xc3H"], "\xe4" => [0, "\xc3I"], "\xe5" => [0, "\xc3J"], "\xe6" => [0, "\xc3K"], "\xe7" => [0, "\xc3L"], "\xe8" => [0, "\xc3M"], "\xe9" => [0, "\xc3N"], "\xea" => [0, "\xc3O"], "\xeb" => [0, "\xc3P"], "\xec" => [0, "\xc3Q"], "\xed" => [0, "\xc3R"], "\xee" => [0, "\xc3S"], "\xef" => [0, "\xc3T"], "\xf0" => [0, "\xc3U"], "\xf1" => [0, "\xc3V"], "\xf2" => [0, "\xc3W"], "\xf3" => [0, "\xc3Y"], "\xf4" => [0, "\xc3j"], "\xf5" => [0, "\xc3k"], "\xf6" => [0, "\xc3q"], "\xf7" => [0, "\xc3v"], "\xf8" => [0, "\xc3w"], "\xf9" => [0, "\xc3x"], "\xfa" => [0, "\xc3y"], "\xfb" => [0, "\xc3z"], "\xfc" => [82, "\xc3"], "\xfd" => [87, "\xc3"], "\xfe" => [130, "\xc3"], "\xff" => [9, "\xc3"]], ["\x00" => [77, "\\0"], "\x01" => [18, "\\0"], "\x02" => [77, "\\1"], "\x03" => [18, "\\1"], "\x04" => [77, "\\2"], "\x05" => [18, "\\2"], "\x06" => [77, "\\a"], "\x07" => [18, "\\a"], "\x08" => [77, "\\c"], "\t" => [18, "\\c"], "\n" => [77, "\\e"], "\v" => [18, "\\e"], "\f" => [77, "\\i"], "\r" => [18, "\\i"], "\x0e" => [77, "\\o"], "\x0f" => [18, "\\o"], "\x10" => [77, "\\s"], "\x11" => [18, "\\s"], "\x12" => [77, "\\t"], "\x13" => [18, "\\t"], "\x14" => [0, "\\ "], "\x15" => [0, "\\%"], "\x16" => [0, "\\-"], "\x17" => [0, "\\."], "\x18" => [0, "\\/"], "\x19" => [0, "\\3"], "\x1a" => [0, "\\4"], "\x1b" => [0, "\\5"], "\x1c" => [0, "\\6"], "\x1d" => [0, "\\7"], "\x1e" => [0, "\\8"], "\x1f" => [0, "\\9"], " " => [0, "\\="], "!" => [0, "\\A"], "\"" => [0, "\\_"], "#" => [0, "\\b"], "\$" => [0, "\\d"], "%" => [0, "\\f"], "&" => [0, "\\g"], "'" => [0, "\\h"], "(" => [0, "\\l"], ")" => [0, "\\m"], "*" => [0, "\\n"], "+" => [0, "\\p"], "," => [0, "\\r"], "-" => [0, "\\u"], "." => [100, "\\"], "/" => [110, "\\"], [111, "\\"], [115, "\\"], [116, "\\"], [118, "\\"], [119, "\\"], [122, "\\"], [123, "\\"], [125, "\\"], [126, "\\"], [129, "\\"], ":" => [143, "\\"], ";" => [148, "\\"], "<" => [151, "\\"], "=" => [153, "\\"], ">" => [83, "\\"], "?" => [10, "\\"], "@" => [77, "\xc30"], "A" => [18, "\xc30"], "B" => [77, "\xc31"], "C" => [18, "\xc31"], "D" => [77, "\xc32"], "E" => [18, "\xc32"], "F" => [77, "\xc3a"], "G" => [18, "\xc3a"], "H" => [77, "\xc3c"], "I" => [18, "\xc3c"], "J" => [77, "\xc3e"], "K" => [18, "\xc3e"], "L" => [77, "\xc3i"], "M" => [18, "\xc3i"], "N" => [77, "\xc3o"], "O" => [18, "\xc3o"], "P" => [77, "\xc3s"], "Q" => [18, "\xc3s"], "R" => [77, "\xc3t"], "S" => [18, "\xc3t"], "T" => [0, "\xc3 "], "U" => [0, "\xc3%"], "V" => [0, "\xc3-"], "W" => [0, "\xc3."], "X" => [0, "\xc3/"], "Y" => [0, "\xc33"], "Z" => [0, "\xc34"], "[" => [0, "\xc35"], "\\" => [0, "\xc36"], "]" => [0, "\xc37"], "^" => [0, "\xc38"], "_" => [0, "\xc39"], "`" => [0, "\xc3="], "a" => [0, "\xc3A"], "b" => [0, "\xc3_"], "c" => [0, "\xc3b"], "d" => [0, "\xc3d"], "e" => [0, "\xc3f"], "f" => [0, "\xc3g"], "g" => [0, "\xc3h"], "h" => [0, "\xc3l"], "i" => [0, "\xc3m"], "j" => [0, "\xc3n"], "k" => [0, "\xc3p"], "l" => [0, "\xc3r"], "m" => [0, "\xc3u"], "n" => [100, "\xc3"], "o" => [110, "\xc3"], "p" => [111, "\xc3"], "q" => [115, "\xc3"], "r" => [116, "\xc3"], "s" => [118, "\xc3"], "t" => [119, "\xc3"], "u" => [122, "\xc3"], "v" => [123, "\xc3"], "w" => [125, "\xc3"], "x" => [126, "\xc3"], "y" => [129, "\xc3"], "z" => [143, "\xc3"], "{" => [148, "\xc3"], "|" => [151, "\xc3"], "}" => [153, "\xc3"], "~" => [83, "\xc3"], "" => [10, "\xc3"], "\x80" => [77, "\xd00"], "\x81" => [18, "\xd00"], "\x82" => [77, "\xd01"], "\x83" => [18, "\xd01"], "\x84" => [77, "\xd02"], "\x85" => [18, "\xd02"], "\x86" => [77, "\xd0a"], "\x87" => [18, "\xd0a"], "\x88" => [77, "\xd0c"], "\x89" => [18, "\xd0c"], "\x8a" => [77, "\xd0e"], "\x8b" => [18, "\xd0e"], "\x8c" => [77, "\xd0i"], "\x8d" => [18, "\xd0i"], "\x8e" => [77, "\xd0o"], "\x8f" => [18, "\xd0o"], "\x90" => [77, "\xd0s"], "\x91" => [18, "\xd0s"], "\x92" => [77, "\xd0t"], "\x93" => [18, "\xd0t"], "\x94" => [0, "\xd0 "], "\x95" => [0, "\xd0%"], "\x96" => [0, "\xd0-"], "\x97" => [0, "\xd0."], "\x98" => [0, "\xd0/"], "\x99" => [0, "\xd03"], "\x9a" => [0, "\xd04"], "\x9b" => [0, "\xd05"], "\x9c" => [0, "\xd06"], "\x9d" => [0, "\xd07"], "\x9e" => [0, "\xd08"], "\x9f" => [0, "\xd09"], "\xa0" => [0, "\xd0="], "\xa1" => [0, "\xd0A"], "\xa2" => [0, "\xd0_"], "\xa3" => [0, "\xd0b"], "\xa4" => [0, "\xd0d"], "\xa5" => [0, "\xd0f"], "\xa6" => [0, "\xd0g"], "\xa7" => [0, "\xd0h"], "\xa8" => [0, "\xd0l"], "\xa9" => [0, "\xd0m"], "\xaa" => [0, "\xd0n"], "\xab" => [0, "\xd0p"], "\xac" => [0, "\xd0r"], "\xad" => [0, "\xd0u"], "\xae" => [100, "\xd0"], "\xaf" => [110, "\xd0"], "\xb0" => [111, "\xd0"], "\xb1" => [115, "\xd0"], "\xb2" => [116, "\xd0"], "\xb3" => [118, "\xd0"], "\xb4" => [119, "\xd0"], "\xb5" => [122, "\xd0"], "\xb6" => [123, "\xd0"], "\xb7" => [125, "\xd0"], "\xb8" => [126, "\xd0"], "\xb9" => [129, "\xd0"], "\xba" => [143, "\xd0"], "\xbb" => [148, "\xd0"], "\xbc" => [151, "\xd0"], "\xbd" => [153, "\xd0"], "\xbe" => [83, "\xd0"], "\xbf" => [10, "\xd0"], "\xc0" => [0, "\x800"], "\xc1" => [0, "\x801"], "\xc2" => [0, "\x802"], "\xc3" => [0, "\x80a"], "\xc4" => [0, "\x80c"], "\xc5" => [0, "\x80e"], "\xc6" => [0, "\x80i"], "\xc7" => [0, "\x80o"], "\xc8" => [0, "\x80s"], "\xc9" => [0, "\x80t"], "\xca" => [73, "\x80"], "\xcb" => [88, "\x80"], "\xcc" => [89, "\x80"], "\xcd" => [96, "\x80"], "\xce" => [97, "\x80"], "\xcf" => [99, "\x80"], "\xd0" => [106, "\x80"], "\xd1" => [136, "\x80"], "\xd2" => [139, "\x80"], "\xd3" => [141, "\x80"], "\xd4" => [145, "\x80"], "\xd5" => [147, "\x80"], "\xd6" => [149, "\x80"], "\xd7" => [101, "\x80"], "\xd8" => [112, "\x80"], "\xd9" => [117, "\x80"], "\xda" => [120, "\x80"], "\xdb" => [124, "\x80"], "\xdc" => [127, "\x80"], "\xdd" => [144, "\x80"], "\xde" => [152, "\x80"], "\xdf" => [11, "\x80"], "\xe0" => [0, "\x820"], "\xe1" => [0, "\x821"], "\xe2" => [0, "\x822"], "\xe3" => [0, "\x82a"], "\xe4" => [0, "\x82c"], "\xe5" => [0, "\x82e"], "\xe6" => [0, "\x82i"], "\xe7" => [0, "\x82o"], "\xe8" => [0, "\x82s"], "\xe9" => [0, "\x82t"], "\xea" => [73, "\x82"], "\xeb" => [88, "\x82"], "\xec" => [89, "\x82"], "\xed" => [96, "\x82"], "\xee" => [97, "\x82"], "\xef" => [99, "\x82"], "\xf0" => [106, "\x82"], "\xf1" => [136, "\x82"], "\xf2" => [139, "\x82"], "\xf3" => [141, "\x82"], "\xf4" => [145, "\x82"], "\xf5" => [147, "\x82"], "\xf6" => [149, "\x82"], "\xf7" => [101, "\x82"], "\xf8" => [112, "\x82"], "\xf9" => [117, "\x82"], "\xfa" => [120, "\x82"], "\xfb" => [124, "\x82"], "\xfc" => [127, "\x82"], "\xfd" => [144, "\x82"], "\xfe" => [152, "\x82"], "\xff" => [11, "\x82"]], ["\x00" => [94, "]0"], "\x01" => [76, "]0"], "\x02" => [104, "]0"], "\x03" => [16, "]0"], "\x04" => [94, "]1"], "\x05" => [76, "]1"], "\x06" => [104, "]1"], "\x07" => [16, "]1"], "\x08" => [94, "]2"], "\t" => [76, "]2"], "\n" => [104, "]2"], "\v" => [16, "]2"], "\f" => [94, "]a"], "\r" => [76, "]a"], "\x0e" => [104, "]a"], "\x0f" => [16, "]a"], "\x10" => [94, "]c"], "\x11" => [76, "]c"], "\x12" => [104, "]c"], "\x13" => [16, "]c"], "\x14" => [94, "]e"], "\x15" => [76, "]e"], "\x16" => [104, "]e"], "\x17" => [16, "]e"], "\x18" => [94, "]i"], "\x19" => [76, "]i"], "\x1a" => [104, "]i"], "\x1b" => [16, "]i"], "\x1c" => [94, "]o"], "\x1d" => [76, "]o"], "\x1e" => [104, "]o"], "\x1f" => [16, "]o"], " " => [94, "]s"], "!" => [76, "]s"], "\"" => [104, "]s"], "#" => [16, "]s"], "\$" => [94, "]t"], "%" => [76, "]t"], "&" => [104, "]t"], "'" => [16, "]t"], "(" => [77, "] "], ")" => [18, "] "], "*" => [77, "]%"], "+" => [18, "]%"], "," => [77, "]-"], "-" => [18, "]-"], "." => [77, "]."], "/" => [18, "]."], [77, "]/"], [18, "]/"], [77, "]3"], [18, "]3"], [77, "]4"], [18, "]4"], [77, "]5"], [18, "]5"], [77, "]6"], [18, "]6"], ":" => [77, "]7"], ";" => [18, "]7"], "<" => [77, "]8"], "=" => [18, "]8"], ">" => [77, "]9"], "?" => [18, "]9"], "@" => [77, "]="], "A" => [18, "]="], "B" => [77, "]A"], "C" => [18, "]A"], "D" => [77, "]_"], "E" => [18, "]_"], "F" => [77, "]b"], "G" => [18, "]b"], "H" => [77, "]d"], "I" => [18, "]d"], "J" => [77, "]f"], "K" => [18, "]f"], "L" => [77, "]g"], "M" => [18, "]g"], "N" => [77, "]h"], "O" => [18, "]h"], "P" => [77, "]l"], "Q" => [18, "]l"], "R" => [77, "]m"], "S" => [18, "]m"], "T" => [77, "]n"], "U" => [18, "]n"], "V" => [77, "]p"], "W" => [18, "]p"], "X" => [77, "]r"], "Y" => [18, "]r"], "Z" => [77, "]u"], "[" => [18, "]u"], "\\" => [0, "]:"], "]" => [0, "]B"], "^" => [0, "]C"], "_" => [0, "]D"], "`" => [0, "]E"], "a" => [0, "]F"], "b" => [0, "]G"], "c" => [0, "]H"], "d" => [0, "]I"], "e" => [0, "]J"], "f" => [0, "]K"], "g" => [0, "]L"], "h" => [0, "]M"], "i" => [0, "]N"], "j" => [0, "]O"], "k" => [0, "]P"], "l" => [0, "]Q"], "m" => [0, "]R"], "n" => [0, "]S"], "o" => [0, "]T"], "p" => [0, "]U"], "q" => [0, "]V"], "r" => [0, "]W"], "s" => [0, "]Y"], "t" => [0, "]j"], "u" => [0, "]k"], "v" => [0, "]q"], "w" => [0, "]v"], "x" => [0, "]w"], "y" => [0, "]x"], "z" => [0, "]y"], "{" => [0, "]z"], "|" => [82, "]"], "}" => [87, "]"], "~" => [130, "]"], "" => [9, "]"], "\x80" => [94, "~0"], "\x81" => [76, "~0"], "\x82" => [104, "~0"], "\x83" => [16, "~0"], "\x84" => [94, "~1"], "\x85" => [76, "~1"], "\x86" => [104, "~1"], "\x87" => [16, "~1"], "\x88" => [94, "~2"], "\x89" => [76, "~2"], "\x8a" => [104, "~2"], "\x8b" => [16, "~2"], "\x8c" => [94, "~a"], "\x8d" => [76, "~a"], "\x8e" => [104, "~a"], "\x8f" => [16, "~a"], "\x90" => [94, "~c"], "\x91" => [76, "~c"], "\x92" => [104, "~c"], "\x93" => [16, "~c"], "\x94" => [94, "~e"], "\x95" => [76, "~e"], "\x96" => [104, "~e"], "\x97" => [16, "~e"], "\x98" => [94, "~i"], "\x99" => [76, "~i"], "\x9a" => [104, "~i"], "\x9b" => [16, "~i"], "\x9c" => [94, "~o"], "\x9d" => [76, "~o"], "\x9e" => [104, "~o"], "\x9f" => [16, "~o"], "\xa0" => [94, "~s"], "\xa1" => [76, "~s"], "\xa2" => [104, "~s"], "\xa3" => [16, "~s"], "\xa4" => [94, "~t"], "\xa5" => [76, "~t"], "\xa6" => [104, "~t"], "\xa7" => [16, "~t"], "\xa8" => [77, "~ "], "\xa9" => [18, "~ "], "\xaa" => [77, "~%"], "\xab" => [18, "~%"], "\xac" => [77, "~-"], "\xad" => [18, "~-"], "\xae" => [77, "~."], "\xaf" => [18, "~."], "\xb0" => [77, "~/"], "\xb1" => [18, "~/"], "\xb2" => [77, "~3"], "\xb3" => [18, "~3"], "\xb4" => [77, "~4"], "\xb5" => [18, "~4"], "\xb6" => [77, "~5"], "\xb7" => [18, "~5"], "\xb8" => [77, "~6"], "\xb9" => [18, "~6"], "\xba" => [77, "~7"], "\xbb" => [18, "~7"], "\xbc" => [77, "~8"], "\xbd" => [18, "~8"], "\xbe" => [77, "~9"], "\xbf" => [18, "~9"], "\xc0" => [77, "~="], "\xc1" => [18, "~="], "\xc2" => [77, "~A"], "\xc3" => [18, "~A"], "\xc4" => [77, "~_"], "\xc5" => [18, "~_"], "\xc6" => [77, "~b"], "\xc7" => [18, "~b"], "\xc8" => [77, "~d"], "\xc9" => [18, "~d"], "\xca" => [77, "~f"], "\xcb" => [18, "~f"], "\xcc" => [77, "~g"], "\xcd" => [18, "~g"], "\xce" => [77, "~h"], "\xcf" => [18, "~h"], "\xd0" => [77, "~l"], "\xd1" => [18, "~l"], "\xd2" => [77, "~m"], "\xd3" => [18, "~m"], "\xd4" => [77, "~n"], "\xd5" => [18, "~n"], "\xd6" => [77, "~p"], "\xd7" => [18, "~p"], "\xd8" => [77, "~r"], "\xd9" => [18, "~r"], "\xda" => [77, "~u"], "\xdb" => [18, "~u"], "\xdc" => [0, "~:"], "\xdd" => [0, "~B"], "\xde" => [0, "~C"], "\xdf" => [0, "~D"], "\xe0" => [0, "~E"], "\xe1" => [0, "~F"], "\xe2" => [0, "~G"], "\xe3" => [0, "~H"], "\xe4" => [0, "~I"], "\xe5" => [0, "~J"], "\xe6" => [0, "~K"], "\xe7" => [0, "~L"], "\xe8" => [0, "~M"], "\xe9" => [0, "~N"], "\xea" => [0, "~O"], "\xeb" => [0, "~P"], "\xec" => [0, "~Q"], "\xed" => [0, "~R"], "\xee" => [0, "~S"], "\xef" => [0, "~T"], "\xf0" => [0, "~U"], "\xf1" => [0, "~V"], "\xf2" => [0, "~W"], "\xf3" => [0, "~Y"], "\xf4" => [0, "~j"], "\xf5" => [0, "~k"], "\xf6" => [0, "~q"], "\xf7" => [0, "~v"], "\xf8" => [0, "~w"], "\xf9" => [0, "~x"], "\xfa" => [0, "~y"], "\xfb" => [0, "~z"], "\xfc" => [82, "~"], "\xfd" => [87, "~"], "\xfe" => [130, "~"], "\xff" => [9, "~"]], ["\x00" => [94, "^0"], "\x01" => [76, "^0"], "\x02" => [104, "^0"], "\x03" => [16, "^0"], "\x04" => [94, "^1"], "\x05" => [76, "^1"], "\x06" => [104, "^1"], "\x07" => [16, "^1"], "\x08" => [94, "^2"], "\t" => [76, "^2"], "\n" => [104, "^2"], "\v" => [16, "^2"], "\f" => [94, "^a"], "\r" => [76, "^a"], "\x0e" => [104, "^a"], "\x0f" => [16, "^a"], "\x10" => [94, "^c"], "\x11" => [76, "^c"], "\x12" => [104, "^c"], "\x13" => [16, "^c"], "\x14" => [94, "^e"], "\x15" => [76, "^e"], "\x16" => [104, "^e"], "\x17" => [16, "^e"], "\x18" => [94, "^i"], "\x19" => [76, "^i"], "\x1a" => [104, "^i"], "\x1b" => [16, "^i"], "\x1c" => [94, "^o"], "\x1d" => [76, "^o"], "\x1e" => [104, "^o"], "\x1f" => [16, "^o"], " " => [94, "^s"], "!" => [76, "^s"], "\"" => [104, "^s"], "#" => [16, "^s"], "\$" => [94, "^t"], "%" => [76, "^t"], "&" => [104, "^t"], "'" => [16, "^t"], "(" => [77, "^ "], ")" => [18, "^ "], "*" => [77, "^%"], "+" => [18, "^%"], "," => [77, "^-"], "-" => [18, "^-"], "." => [77, "^."], "/" => [18, "^."], [77, "^/"], [18, "^/"], [77, "^3"], [18, "^3"], [77, "^4"], [18, "^4"], [77, "^5"], [18, "^5"], [77, "^6"], [18, "^6"], ":" => [77, "^7"], ";" => [18, "^7"], "<" => [77, "^8"], "=" => [18, "^8"], ">" => [77, "^9"], "?" => [18, "^9"], "@" => [77, "^="], "A" => [18, "^="], "B" => [77, "^A"], "C" => [18, "^A"], "D" => [77, "^_"], "E" => [18, "^_"], "F" => [77, "^b"], "G" => [18, "^b"], "H" => [77, "^d"], "I" => [18, "^d"], "J" => [77, "^f"], "K" => [18, "^f"], "L" => [77, "^g"], "M" => [18, "^g"], "N" => [77, "^h"], "O" => [18, "^h"], "P" => [77, "^l"], "Q" => [18, "^l"], "R" => [77, "^m"], "S" => [18, "^m"], "T" => [77, "^n"], "U" => [18, "^n"], "V" => [77, "^p"], "W" => [18, "^p"], "X" => [77, "^r"], "Y" => [18, "^r"], "Z" => [77, "^u"], "[" => [18, "^u"], "\\" => [0, "^:"], "]" => [0, "^B"], "^" => [0, "^C"], "_" => [0, "^D"], "`" => [0, "^E"], "a" => [0, "^F"], "b" => [0, "^G"], "c" => [0, "^H"], "d" => [0, "^I"], "e" => [0, "^J"], "f" => [0, "^K"], "g" => [0, "^L"], "h" => [0, "^M"], "i" => [0, "^N"], "j" => [0, "^O"], "k" => [0, "^P"], "l" => [0, "^Q"], "m" => [0, "^R"], "n" => [0, "^S"], "o" => [0, "^T"], "p" => [0, "^U"], "q" => [0, "^V"], "r" => [0, "^W"], "s" => [0, "^Y"], "t" => [0, "^j"], "u" => [0, "^k"], "v" => [0, "^q"], "w" => [0, "^v"], "x" => [0, "^w"], "y" => [0, "^x"], "z" => [0, "^y"], "{" => [0, "^z"], "|" => [82, "^"], "}" => [87, "^"], "~" => [130, "^"], "" => [9, "^"], "\x80" => [94, "}0"], "\x81" => [76, "}0"], "\x82" => [104, "}0"], "\x83" => [16, "}0"], "\x84" => [94, "}1"], "\x85" => [76, "}1"], "\x86" => [104, "}1"], "\x87" => [16, "}1"], "\x88" => [94, "}2"], "\x89" => [76, "}2"], "\x8a" => [104, "}2"], "\x8b" => [16, "}2"], "\x8c" => [94, "}a"], "\x8d" => [76, "}a"], "\x8e" => [104, "}a"], "\x8f" => [16, "}a"], "\x90" => [94, "}c"], "\x91" => [76, "}c"], "\x92" => [104, "}c"], "\x93" => [16, "}c"], "\x94" => [94, "}e"], "\x95" => [76, "}e"], "\x96" => [104, "}e"], "\x97" => [16, "}e"], "\x98" => [94, "}i"], "\x99" => [76, "}i"], "\x9a" => [104, "}i"], "\x9b" => [16, "}i"], "\x9c" => [94, "}o"], "\x9d" => [76, "}o"], "\x9e" => [104, "}o"], "\x9f" => [16, "}o"], "\xa0" => [94, "}s"], "\xa1" => [76, "}s"], "\xa2" => [104, "}s"], "\xa3" => [16, "}s"], "\xa4" => [94, "}t"], "\xa5" => [76, "}t"], "\xa6" => [104, "}t"], "\xa7" => [16, "}t"], "\xa8" => [77, "} "], "\xa9" => [18, "} "], "\xaa" => [77, "}%"], "\xab" => [18, "}%"], "\xac" => [77, "}-"], "\xad" => [18, "}-"], "\xae" => [77, "}."], "\xaf" => [18, "}."], "\xb0" => [77, "}/"], "\xb1" => [18, "}/"], "\xb2" => [77, "}3"], "\xb3" => [18, "}3"], "\xb4" => [77, "}4"], "\xb5" => [18, "}4"], "\xb6" => [77, "}5"], "\xb7" => [18, "}5"], "\xb8" => [77, "}6"], "\xb9" => [18, "}6"], "\xba" => [77, "}7"], "\xbb" => [18, "}7"], "\xbc" => [77, "}8"], "\xbd" => [18, "}8"], "\xbe" => [77, "}9"], "\xbf" => [18, "}9"], "\xc0" => [77, "}="], "\xc1" => [18, "}="], "\xc2" => [77, "}A"], "\xc3" => [18, "}A"], "\xc4" => [77, "}_"], "\xc5" => [18, "}_"], "\xc6" => [77, "}b"], "\xc7" => [18, "}b"], "\xc8" => [77, "}d"], "\xc9" => [18, "}d"], "\xca" => [77, "}f"], "\xcb" => [18, "}f"], "\xcc" => [77, "}g"], "\xcd" => [18, "}g"], "\xce" => [77, "}h"], "\xcf" => [18, "}h"], "\xd0" => [77, "}l"], "\xd1" => [18, "}l"], "\xd2" => [77, "}m"], "\xd3" => [18, "}m"], "\xd4" => [77, "}n"], "\xd5" => [18, "}n"], "\xd6" => [77, "}p"], "\xd7" => [18, "}p"], "\xd8" => [77, "}r"], "\xd9" => [18, "}r"], "\xda" => [77, "}u"], "\xdb" => [18, "}u"], "\xdc" => [0, "}:"], "\xdd" => [0, "}B"], "\xde" => [0, "}C"], "\xdf" => [0, "}D"], "\xe0" => [0, "}E"], "\xe1" => [0, "}F"], "\xe2" => [0, "}G"], "\xe3" => [0, "}H"], "\xe4" => [0, "}I"], "\xe5" => [0, "}J"], "\xe6" => [0, "}K"], "\xe7" => [0, "}L"], "\xe8" => [0, "}M"], "\xe9" => [0, "}N"], "\xea" => [0, "}O"], "\xeb" => [0, "}P"], "\xec" => [0, "}Q"], "\xed" => [0, "}R"], "\xee" => [0, "}S"], "\xef" => [0, "}T"], "\xf0" => [0, "}U"], "\xf1" => [0, "}V"], "\xf2" => [0, "}W"], "\xf3" => [0, "}Y"], "\xf4" => [0, "}j"], "\xf5" => [0, "}k"], "\xf6" => [0, "}q"], "\xf7" => [0, "}v"], "\xf8" => [0, "}w"], "\xf9" => [0, "}x"], "\xfa" => [0, "}y"], "\xfb" => [0, "}z"], "\xfc" => [82, "}"], "\xfd" => [87, "}"], "\xfe" => [130, "}"], "\xff" => [9, "}"]], ["\x00" => [94, "_0"], "\x01" => [76, "_0"], "\x02" => [104, "_0"], "\x03" => [16, "_0"], "\x04" => [94, "_1"], "\x05" => [76, "_1"], "\x06" => [104, "_1"], "\x07" => [16, "_1"], "\x08" => [94, "_2"], "\t" => [76, "_2"], "\n" => [104, "_2"], "\v" => [16, "_2"], "\f" => [94, "_a"], "\r" => [76, "_a"], "\x0e" => [104, "_a"], "\x0f" => [16, "_a"], "\x10" => [94, "_c"], "\x11" => [76, "_c"], "\x12" => [104, "_c"], "\x13" => [16, "_c"], "\x14" => [94, "_e"], "\x15" => [76, "_e"], "\x16" => [104, "_e"], "\x17" => [16, "_e"], "\x18" => [94, "_i"], "\x19" => [76, "_i"], "\x1a" => [104, "_i"], "\x1b" => [16, "_i"], "\x1c" => [94, "_o"], "\x1d" => [76, "_o"], "\x1e" => [104, "_o"], "\x1f" => [16, "_o"], " " => [94, "_s"], "!" => [76, "_s"], "\"" => [104, "_s"], "#" => [16, "_s"], "\$" => [94, "_t"], "%" => [76, "_t"], "&" => [104, "_t"], "'" => [16, "_t"], "(" => [77, "_ "], ")" => [18, "_ "], "*" => [77, "_%"], "+" => [18, "_%"], "," => [77, "_-"], "-" => [18, "_-"], "." => [77, "_."], "/" => [18, "_."], [77, "_/"], [18, "_/"], [77, "_3"], [18, "_3"], [77, "_4"], [18, "_4"], [77, "_5"], [18, "_5"], [77, "_6"], [18, "_6"], ":" => [77, "_7"], ";" => [18, "_7"], "<" => [77, "_8"], "=" => [18, "_8"], ">" => [77, "_9"], "?" => [18, "_9"], "@" => [77, "_="], "A" => [18, "_="], "B" => [77, "_A"], "C" => [18, "_A"], "D" => [77, "__"], "E" => [18, "__"], "F" => [77, "_b"], "G" => [18, "_b"], "H" => [77, "_d"], "I" => [18, "_d"], "J" => [77, "_f"], "K" => [18, "_f"], "L" => [77, "_g"], "M" => [18, "_g"], "N" => [77, "_h"], "O" => [18, "_h"], "P" => [77, "_l"], "Q" => [18, "_l"], "R" => [77, "_m"], "S" => [18, "_m"], "T" => [77, "_n"], "U" => [18, "_n"], "V" => [77, "_p"], "W" => [18, "_p"], "X" => [77, "_r"], "Y" => [18, "_r"], "Z" => [77, "_u"], "[" => [18, "_u"], "\\" => [0, "_:"], "]" => [0, "_B"], "^" => [0, "_C"], "_" => [0, "_D"], "`" => [0, "_E"], "a" => [0, "_F"], "b" => [0, "_G"], "c" => [0, "_H"], "d" => [0, "_I"], "e" => [0, "_J"], "f" => [0, "_K"], "g" => [0, "_L"], "h" => [0, "_M"], "i" => [0, "_N"], "j" => [0, "_O"], "k" => [0, "_P"], "l" => [0, "_Q"], "m" => [0, "_R"], "n" => [0, "_S"], "o" => [0, "_T"], "p" => [0, "_U"], "q" => [0, "_V"], "r" => [0, "_W"], "s" => [0, "_Y"], "t" => [0, "_j"], "u" => [0, "_k"], "v" => [0, "_q"], "w" => [0, "_v"], "x" => [0, "_w"], "y" => [0, "_x"], "z" => [0, "_y"], "{" => [0, "_z"], "|" => [82, "_"], "}" => [87, "_"], "~" => [130, "_"], "" => [9, "_"], "\x80" => [94, "b0"], "\x81" => [76, "b0"], "\x82" => [104, "b0"], "\x83" => [16, "b0"], "\x84" => [94, "b1"], "\x85" => [76, "b1"], "\x86" => [104, "b1"], "\x87" => [16, "b1"], "\x88" => [94, "b2"], "\x89" => [76, "b2"], "\x8a" => [104, "b2"], "\x8b" => [16, "b2"], "\x8c" => [94, "ba"], "\x8d" => [76, "ba"], "\x8e" => [104, "ba"], "\x8f" => [16, "ba"], "\x90" => [94, "bc"], "\x91" => [76, "bc"], "\x92" => [104, "bc"], "\x93" => [16, "bc"], "\x94" => [94, "be"], "\x95" => [76, "be"], "\x96" => [104, "be"], "\x97" => [16, "be"], "\x98" => [94, "bi"], "\x99" => [76, "bi"], "\x9a" => [104, "bi"], "\x9b" => [16, "bi"], "\x9c" => [94, "bo"], "\x9d" => [76, "bo"], "\x9e" => [104, "bo"], "\x9f" => [16, "bo"], "\xa0" => [94, "bs"], "\xa1" => [76, "bs"], "\xa2" => [104, "bs"], "\xa3" => [16, "bs"], "\xa4" => [94, "bt"], "\xa5" => [76, "bt"], "\xa6" => [104, "bt"], "\xa7" => [16, "bt"], "\xa8" => [77, "b "], "\xa9" => [18, "b "], "\xaa" => [77, "b%"], "\xab" => [18, "b%"], "\xac" => [77, "b-"], "\xad" => [18, "b-"], "\xae" => [77, "b."], "\xaf" => [18, "b."], "\xb0" => [77, "b/"], "\xb1" => [18, "b/"], "\xb2" => [77, "b3"], "\xb3" => [18, "b3"], "\xb4" => [77, "b4"], "\xb5" => [18, "b4"], "\xb6" => [77, "b5"], "\xb7" => [18, "b5"], "\xb8" => [77, "b6"], "\xb9" => [18, "b6"], "\xba" => [77, "b7"], "\xbb" => [18, "b7"], "\xbc" => [77, "b8"], "\xbd" => [18, "b8"], "\xbe" => [77, "b9"], "\xbf" => [18, "b9"], "\xc0" => [77, "b="], "\xc1" => [18, "b="], "\xc2" => [77, "bA"], "\xc3" => [18, "bA"], "\xc4" => [77, "b_"], "\xc5" => [18, "b_"], "\xc6" => [77, "bb"], "\xc7" => [18, "bb"], "\xc8" => [77, "bd"], "\xc9" => [18, "bd"], "\xca" => [77, "bf"], "\xcb" => [18, "bf"], "\xcc" => [77, "bg"], "\xcd" => [18, "bg"], "\xce" => [77, "bh"], "\xcf" => [18, "bh"], "\xd0" => [77, "bl"], "\xd1" => [18, "bl"], "\xd2" => [77, "bm"], "\xd3" => [18, "bm"], "\xd4" => [77, "bn"], "\xd5" => [18, "bn"], "\xd6" => [77, "bp"], "\xd7" => [18, "bp"], "\xd8" => [77, "br"], "\xd9" => [18, "br"], "\xda" => [77, "bu"], "\xdb" => [18, "bu"], "\xdc" => [0, "b:"], "\xdd" => [0, "bB"], "\xde" => [0, "bC"], "\xdf" => [0, "bD"], "\xe0" => [0, "bE"], "\xe1" => [0, "bF"], "\xe2" => [0, "bG"], "\xe3" => [0, "bH"], "\xe4" => [0, "bI"], "\xe5" => [0, "bJ"], "\xe6" => [0, "bK"], "\xe7" => [0, "bL"], "\xe8" => [0, "bM"], "\xe9" => [0, "bN"], "\xea" => [0, "bO"], "\xeb" => [0, "bP"], "\xec" => [0, "bQ"], "\xed" => [0, "bR"], "\xee" => [0, "bS"], "\xef" => [0, "bT"], "\xf0" => [0, "bU"], "\xf1" => [0, "bV"], "\xf2" => [0, "bW"], "\xf3" => [0, "bY"], "\xf4" => [0, "bj"], "\xf5" => [0, "bk"], "\xf6" => [0, "bq"], "\xf7" => [0, "bv"], "\xf8" => [0, "bw"], "\xf9" => [0, "bx"], "\xfa" => [0, "by"], "\xfb" => [0, "bz"], "\xfc" => [82, "b"], "\xfd" => [87, "b"], "\xfe" => [130, "b"], "\xff" => [9, "b"]], ["\x00" => [94, "c0"], "\x01" => [76, "c0"], "\x02" => [104, "c0"], "\x03" => [16, "c0"], "\x04" => [94, "c1"], "\x05" => [76, "c1"], "\x06" => [104, "c1"], "\x07" => [16, "c1"], "\x08" => [94, "c2"], "\t" => [76, "c2"], "\n" => [104, "c2"], "\v" => [16, "c2"], "\f" => [94, "ca"], "\r" => [76, "ca"], "\x0e" => [104, "ca"], "\x0f" => [16, "ca"], "\x10" => [94, "cc"], "\x11" => [76, "cc"], "\x12" => [104, "cc"], "\x13" => [16, "cc"], "\x14" => [94, "ce"], "\x15" => [76, "ce"], "\x16" => [104, "ce"], "\x17" => [16, "ce"], "\x18" => [94, "ci"], "\x19" => [76, "ci"], "\x1a" => [104, "ci"], "\x1b" => [16, "ci"], "\x1c" => [94, "co"], "\x1d" => [76, "co"], "\x1e" => [104, "co"], "\x1f" => [16, "co"], " " => [94, "cs"], "!" => [76, "cs"], "\"" => [104, "cs"], "#" => [16, "cs"], "\$" => [94, "ct"], "%" => [76, "ct"], "&" => [104, "ct"], "'" => [16, "ct"], "(" => [77, "c "], ")" => [18, "c "], "*" => [77, "c%"], "+" => [18, "c%"], "," => [77, "c-"], "-" => [18, "c-"], "." => [77, "c."], "/" => [18, "c."], [77, "c/"], [18, "c/"], [77, "c3"], [18, "c3"], [77, "c4"], [18, "c4"], [77, "c5"], [18, "c5"], [77, "c6"], [18, "c6"], ":" => [77, "c7"], ";" => [18, "c7"], "<" => [77, "c8"], "=" => [18, "c8"], ">" => [77, "c9"], "?" => [18, "c9"], "@" => [77, "c="], "A" => [18, "c="], "B" => [77, "cA"], "C" => [18, "cA"], "D" => [77, "c_"], "E" => [18, "c_"], "F" => [77, "cb"], "G" => [18, "cb"], "H" => [77, "cd"], "I" => [18, "cd"], "J" => [77, "cf"], "K" => [18, "cf"], "L" => [77, "cg"], "M" => [18, "cg"], "N" => [77, "ch"], "O" => [18, "ch"], "P" => [77, "cl"], "Q" => [18, "cl"], "R" => [77, "cm"], "S" => [18, "cm"], "T" => [77, "cn"], "U" => [18, "cn"], "V" => [77, "cp"], "W" => [18, "cp"], "X" => [77, "cr"], "Y" => [18, "cr"], "Z" => [77, "cu"], "[" => [18, "cu"], "\\" => [0, "c:"], "]" => [0, "cB"], "^" => [0, "cC"], "_" => [0, "cD"], "`" => [0, "cE"], "a" => [0, "cF"], "b" => [0, "cG"], "c" => [0, "cH"], "d" => [0, "cI"], "e" => [0, "cJ"], "f" => [0, "cK"], "g" => [0, "cL"], "h" => [0, "cM"], "i" => [0, "cN"], "j" => [0, "cO"], "k" => [0, "cP"], "l" => [0, "cQ"], "m" => [0, "cR"], "n" => [0, "cS"], "o" => [0, "cT"], "p" => [0, "cU"], "q" => [0, "cV"], "r" => [0, "cW"], "s" => [0, "cY"], "t" => [0, "cj"], "u" => [0, "ck"], "v" => [0, "cq"], "w" => [0, "cv"], "x" => [0, "cw"], "y" => [0, "cx"], "z" => [0, "cy"], "{" => [0, "cz"], "|" => [82, "c"], "}" => [87, "c"], "~" => [130, "c"], "" => [9, "c"], "\x80" => [94, "e0"], "\x81" => [76, "e0"], "\x82" => [104, "e0"], "\x83" => [16, "e0"], "\x84" => [94, "e1"], "\x85" => [76, "e1"], "\x86" => [104, "e1"], "\x87" => [16, "e1"], "\x88" => [94, "e2"], "\x89" => [76, "e2"], "\x8a" => [104, "e2"], "\x8b" => [16, "e2"], "\x8c" => [94, "ea"], "\x8d" => [76, "ea"], "\x8e" => [104, "ea"], "\x8f" => [16, "ea"], "\x90" => [94, "ec"], "\x91" => [76, "ec"], "\x92" => [104, "ec"], "\x93" => [16, "ec"], "\x94" => [94, "ee"], "\x95" => [76, "ee"], "\x96" => [104, "ee"], "\x97" => [16, "ee"], "\x98" => [94, "ei"], "\x99" => [76, "ei"], "\x9a" => [104, "ei"], "\x9b" => [16, "ei"], "\x9c" => [94, "eo"], "\x9d" => [76, "eo"], "\x9e" => [104, "eo"], "\x9f" => [16, "eo"], "\xa0" => [94, "es"], "\xa1" => [76, "es"], "\xa2" => [104, "es"], "\xa3" => [16, "es"], "\xa4" => [94, "et"], "\xa5" => [76, "et"], "\xa6" => [104, "et"], "\xa7" => [16, "et"], "\xa8" => [77, "e "], "\xa9" => [18, "e "], "\xaa" => [77, "e%"], "\xab" => [18, "e%"], "\xac" => [77, "e-"], "\xad" => [18, "e-"], "\xae" => [77, "e."], "\xaf" => [18, "e."], "\xb0" => [77, "e/"], "\xb1" => [18, "e/"], "\xb2" => [77, "e3"], "\xb3" => [18, "e3"], "\xb4" => [77, "e4"], "\xb5" => [18, "e4"], "\xb6" => [77, "e5"], "\xb7" => [18, "e5"], "\xb8" => [77, "e6"], "\xb9" => [18, "e6"], "\xba" => [77, "e7"], "\xbb" => [18, "e7"], "\xbc" => [77, "e8"], "\xbd" => [18, "e8"], "\xbe" => [77, "e9"], "\xbf" => [18, "e9"], "\xc0" => [77, "e="], "\xc1" => [18, "e="], "\xc2" => [77, "eA"], "\xc3" => [18, "eA"], "\xc4" => [77, "e_"], "\xc5" => [18, "e_"], "\xc6" => [77, "eb"], "\xc7" => [18, "eb"], "\xc8" => [77, "ed"], "\xc9" => [18, "ed"], "\xca" => [77, "ef"], "\xcb" => [18, "ef"], "\xcc" => [77, "eg"], "\xcd" => [18, "eg"], "\xce" => [77, "eh"], "\xcf" => [18, "eh"], "\xd0" => [77, "el"], "\xd1" => [18, "el"], "\xd2" => [77, "em"], "\xd3" => [18, "em"], "\xd4" => [77, "en"], "\xd5" => [18, "en"], "\xd6" => [77, "ep"], "\xd7" => [18, "ep"], "\xd8" => [77, "er"], "\xd9" => [18, "er"], "\xda" => [77, "eu"], "\xdb" => [18, "eu"], "\xdc" => [0, "e:"], "\xdd" => [0, "eB"], "\xde" => [0, "eC"], "\xdf" => [0, "eD"], "\xe0" => [0, "eE"], "\xe1" => [0, "eF"], "\xe2" => [0, "eG"], "\xe3" => [0, "eH"], "\xe4" => [0, "eI"], "\xe5" => [0, "eJ"], "\xe6" => [0, "eK"], "\xe7" => [0, "eL"], "\xe8" => [0, "eM"], "\xe9" => [0, "eN"], "\xea" => [0, "eO"], "\xeb" => [0, "eP"], "\xec" => [0, "eQ"], "\xed" => [0, "eR"], "\xee" => [0, "eS"], "\xef" => [0, "eT"], "\xf0" => [0, "eU"], "\xf1" => [0, "eV"], "\xf2" => [0, "eW"], "\xf3" => [0, "eY"], "\xf4" => [0, "ej"], "\xf5" => [0, "ek"], "\xf6" => [0, "eq"], "\xf7" => [0, "ev"], "\xf8" => [0, "ew"], "\xf9" => [0, "ex"], "\xfa" => [0, "ey"], "\xfb" => [0, "ez"], "\xfc" => [82, "e"], "\xfd" => [87, "e"], "\xfe" => [130, "e"], "\xff" => [9, "e"]], ["\x00" => [77, "c0"], "\x01" => [18, "c0"], "\x02" => [77, "c1"], "\x03" => [18, "c1"], "\x04" => [77, "c2"], "\x05" => [18, "c2"], "\x06" => [77, "ca"], "\x07" => [18, "ca"], "\x08" => [77, "cc"], "\t" => [18, "cc"], "\n" => [77, "ce"], "\v" => [18, "ce"], "\f" => [77, "ci"], "\r" => [18, "ci"], "\x0e" => [77, "co"], "\x0f" => [18, "co"], "\x10" => [77, "cs"], "\x11" => [18, "cs"], "\x12" => [77, "ct"], "\x13" => [18, "ct"], "\x14" => [0, "c "], "\x15" => [0, "c%"], "\x16" => [0, "c-"], "\x17" => [0, "c."], "\x18" => [0, "c/"], "\x19" => [0, "c3"], "\x1a" => [0, "c4"], "\x1b" => [0, "c5"], "\x1c" => [0, "c6"], "\x1d" => [0, "c7"], "\x1e" => [0, "c8"], "\x1f" => [0, "c9"], " " => [0, "c="], "!" => [0, "cA"], "\"" => [0, "c_"], "#" => [0, "cb"], "\$" => [0, "cd"], "%" => [0, "cf"], "&" => [0, "cg"], "'" => [0, "ch"], "(" => [0, "cl"], ")" => [0, "cm"], "*" => [0, "cn"], "+" => [0, "cp"], "," => [0, "cr"], "-" => [0, "cu"], "." => [100, "c"], "/" => [110, "c"], [111, "c"], [115, "c"], [116, "c"], [118, "c"], [119, "c"], [122, "c"], [123, "c"], [125, "c"], [126, "c"], [129, "c"], ":" => [143, "c"], ";" => [148, "c"], "<" => [151, "c"], "=" => [153, "c"], ">" => [83, "c"], "?" => [10, "c"], "@" => [77, "e0"], "A" => [18, "e0"], "B" => [77, "e1"], "C" => [18, "e1"], "D" => [77, "e2"], "E" => [18, "e2"], "F" => [77, "ea"], "G" => [18, "ea"], "H" => [77, "ec"], "I" => [18, "ec"], "J" => [77, "ee"], "K" => [18, "ee"], "L" => [77, "ei"], "M" => [18, "ei"], "N" => [77, "eo"], "O" => [18, "eo"], "P" => [77, "es"], "Q" => [18, "es"], "R" => [77, "et"], "S" => [18, "et"], "T" => [0, "e "], "U" => [0, "e%"], "V" => [0, "e-"], "W" => [0, "e."], "X" => [0, "e/"], "Y" => [0, "e3"], "Z" => [0, "e4"], "[" => [0, "e5"], "\\" => [0, "e6"], "]" => [0, "e7"], "^" => [0, "e8"], "_" => [0, "e9"], "`" => [0, "e="], "a" => [0, "eA"], "b" => [0, "e_"], "c" => [0, "eb"], "d" => [0, "ed"], "e" => [0, "ef"], "f" => [0, "eg"], "g" => [0, "eh"], "h" => [0, "el"], "i" => [0, "em"], "j" => [0, "en"], "k" => [0, "ep"], "l" => [0, "er"], "m" => [0, "eu"], "n" => [100, "e"], "o" => [110, "e"], "p" => [111, "e"], "q" => [115, "e"], "r" => [116, "e"], "s" => [118, "e"], "t" => [119, "e"], "u" => [122, "e"], "v" => [123, "e"], "w" => [125, "e"], "x" => [126, "e"], "y" => [129, "e"], "z" => [143, "e"], "{" => [148, "e"], "|" => [151, "e"], "}" => [153, "e"], "~" => [83, "e"], "" => [10, "e"], "\x80" => [77, "i0"], "\x81" => [18, "i0"], "\x82" => [77, "i1"], "\x83" => [18, "i1"], "\x84" => [77, "i2"], "\x85" => [18, "i2"], "\x86" => [77, "ia"], "\x87" => [18, "ia"], "\x88" => [77, "ic"], "\x89" => [18, "ic"], "\x8a" => [77, "ie"], "\x8b" => [18, "ie"], "\x8c" => [77, "ii"], "\x8d" => [18, "ii"], "\x8e" => [77, "io"], "\x8f" => [18, "io"], "\x90" => [77, "is"], "\x91" => [18, "is"], "\x92" => [77, "it"], "\x93" => [18, "it"], "\x94" => [0, "i "], "\x95" => [0, "i%"], "\x96" => [0, "i-"], "\x97" => [0, "i."], "\x98" => [0, "i/"], "\x99" => [0, "i3"], "\x9a" => [0, "i4"], "\x9b" => [0, "i5"], "\x9c" => [0, "i6"], "\x9d" => [0, "i7"], "\x9e" => [0, "i8"], "\x9f" => [0, "i9"], "\xa0" => [0, "i="], "\xa1" => [0, "iA"], "\xa2" => [0, "i_"], "\xa3" => [0, "ib"], "\xa4" => [0, "id"], "\xa5" => [0, "if"], "\xa6" => [0, "ig"], "\xa7" => [0, "ih"], "\xa8" => [0, "il"], "\xa9" => [0, "im"], "\xaa" => [0, "in"], "\xab" => [0, "ip"], "\xac" => [0, "ir"], "\xad" => [0, "iu"], "\xae" => [100, "i"], "\xaf" => [110, "i"], "\xb0" => [111, "i"], "\xb1" => [115, "i"], "\xb2" => [116, "i"], "\xb3" => [118, "i"], "\xb4" => [119, "i"], "\xb5" => [122, "i"], "\xb6" => [123, "i"], "\xb7" => [125, "i"], "\xb8" => [126, "i"], "\xb9" => [129, "i"], "\xba" => [143, "i"], "\xbb" => [148, "i"], "\xbc" => [151, "i"], "\xbd" => [153, "i"], "\xbe" => [83, "i"], "\xbf" => [10, "i"], "\xc0" => [77, "o0"], "\xc1" => [18, "o0"], "\xc2" => [77, "o1"], "\xc3" => [18, "o1"], "\xc4" => [77, "o2"], "\xc5" => [18, "o2"], "\xc6" => [77, "oa"], "\xc7" => [18, "oa"], "\xc8" => [77, "oc"], "\xc9" => [18, "oc"], "\xca" => [77, "oe"], "\xcb" => [18, "oe"], "\xcc" => [77, "oi"], "\xcd" => [18, "oi"], "\xce" => [77, "oo"], "\xcf" => [18, "oo"], "\xd0" => [77, "os"], "\xd1" => [18, "os"], "\xd2" => [77, "ot"], "\xd3" => [18, "ot"], "\xd4" => [0, "o "], "\xd5" => [0, "o%"], "\xd6" => [0, "o-"], "\xd7" => [0, "o."], "\xd8" => [0, "o/"], "\xd9" => [0, "o3"], "\xda" => [0, "o4"], "\xdb" => [0, "o5"], "\xdc" => [0, "o6"], "\xdd" => [0, "o7"], "\xde" => [0, "o8"], "\xdf" => [0, "o9"], "\xe0" => [0, "o="], "\xe1" => [0, "oA"], "\xe2" => [0, "o_"], "\xe3" => [0, "ob"], "\xe4" => [0, "od"], "\xe5" => [0, "of"], "\xe6" => [0, "og"], "\xe7" => [0, "oh"], "\xe8" => [0, "ol"], "\xe9" => [0, "om"], "\xea" => [0, "on"], "\xeb" => [0, "op"], "\xec" => [0, "or"], "\xed" => [0, "ou"], "\xee" => [100, "o"], "\xef" => [110, "o"], "\xf0" => [111, "o"], "\xf1" => [115, "o"], "\xf2" => [116, "o"], "\xf3" => [118, "o"], "\xf4" => [119, "o"], "\xf5" => [122, "o"], "\xf6" => [123, "o"], "\xf7" => [125, "o"], "\xf8" => [126, "o"], "\xf9" => [129, "o"], "\xfa" => [143, "o"], "\xfb" => [148, "o"], "\xfc" => [151, "o"], "\xfd" => [153, "o"], "\xfe" => [83, "o"], "\xff" => [10, "o"]], ["\x00" => [94, "d0"], "\x01" => [76, "d0"], "\x02" => [104, "d0"], "\x03" => [16, "d0"], "\x04" => [94, "d1"], "\x05" => [76, "d1"], "\x06" => [104, "d1"], "\x07" => [16, "d1"], "\x08" => [94, "d2"], "\t" => [76, "d2"], "\n" => [104, "d2"], "\v" => [16, "d2"], "\f" => [94, "da"], "\r" => [76, "da"], "\x0e" => [104, "da"], "\x0f" => [16, "da"], "\x10" => [94, "dc"], "\x11" => [76, "dc"], "\x12" => [104, "dc"], "\x13" => [16, "dc"], "\x14" => [94, "de"], "\x15" => [76, "de"], "\x16" => [104, "de"], "\x17" => [16, "de"], "\x18" => [94, "di"], "\x19" => [76, "di"], "\x1a" => [104, "di"], "\x1b" => [16, "di"], "\x1c" => [94, "do"], "\x1d" => [76, "do"], "\x1e" => [104, "do"], "\x1f" => [16, "do"], " " => [94, "ds"], "!" => [76, "ds"], "\"" => [104, "ds"], "#" => [16, "ds"], "\$" => [94, "dt"], "%" => [76, "dt"], "&" => [104, "dt"], "'" => [16, "dt"], "(" => [77, "d "], ")" => [18, "d "], "*" => [77, "d%"], "+" => [18, "d%"], "," => [77, "d-"], "-" => [18, "d-"], "." => [77, "d."], "/" => [18, "d."], [77, "d/"], [18, "d/"], [77, "d3"], [18, "d3"], [77, "d4"], [18, "d4"], [77, "d5"], [18, "d5"], [77, "d6"], [18, "d6"], ":" => [77, "d7"], ";" => [18, "d7"], "<" => [77, "d8"], "=" => [18, "d8"], ">" => [77, "d9"], "?" => [18, "d9"], "@" => [77, "d="], "A" => [18, "d="], "B" => [77, "dA"], "C" => [18, "dA"], "D" => [77, "d_"], "E" => [18, "d_"], "F" => [77, "db"], "G" => [18, "db"], "H" => [77, "dd"], "I" => [18, "dd"], "J" => [77, "df"], "K" => [18, "df"], "L" => [77, "dg"], "M" => [18, "dg"], "N" => [77, "dh"], "O" => [18, "dh"], "P" => [77, "dl"], "Q" => [18, "dl"], "R" => [77, "dm"], "S" => [18, "dm"], "T" => [77, "dn"], "U" => [18, "dn"], "V" => [77, "dp"], "W" => [18, "dp"], "X" => [77, "dr"], "Y" => [18, "dr"], "Z" => [77, "du"], "[" => [18, "du"], "\\" => [0, "d:"], "]" => [0, "dB"], "^" => [0, "dC"], "_" => [0, "dD"], "`" => [0, "dE"], "a" => [0, "dF"], "b" => [0, "dG"], "c" => [0, "dH"], "d" => [0, "dI"], "e" => [0, "dJ"], "f" => [0, "dK"], "g" => [0, "dL"], "h" => [0, "dM"], "i" => [0, "dN"], "j" => [0, "dO"], "k" => [0, "dP"], "l" => [0, "dQ"], "m" => [0, "dR"], "n" => [0, "dS"], "o" => [0, "dT"], "p" => [0, "dU"], "q" => [0, "dV"], "r" => [0, "dW"], "s" => [0, "dY"], "t" => [0, "dj"], "u" => [0, "dk"], "v" => [0, "dq"], "w" => [0, "dv"], "x" => [0, "dw"], "y" => [0, "dx"], "z" => [0, "dy"], "{" => [0, "dz"], "|" => [82, "d"], "}" => [87, "d"], "~" => [130, "d"], "" => [9, "d"], "\x80" => [94, "f0"], "\x81" => [76, "f0"], "\x82" => [104, "f0"], "\x83" => [16, "f0"], "\x84" => [94, "f1"], "\x85" => [76, "f1"], "\x86" => [104, "f1"], "\x87" => [16, "f1"], "\x88" => [94, "f2"], "\x89" => [76, "f2"], "\x8a" => [104, "f2"], "\x8b" => [16, "f2"], "\x8c" => [94, "fa"], "\x8d" => [76, "fa"], "\x8e" => [104, "fa"], "\x8f" => [16, "fa"], "\x90" => [94, "fc"], "\x91" => [76, "fc"], "\x92" => [104, "fc"], "\x93" => [16, "fc"], "\x94" => [94, "fe"], "\x95" => [76, "fe"], "\x96" => [104, "fe"], "\x97" => [16, "fe"], "\x98" => [94, "fi"], "\x99" => [76, "fi"], "\x9a" => [104, "fi"], "\x9b" => [16, "fi"], "\x9c" => [94, "fo"], "\x9d" => [76, "fo"], "\x9e" => [104, "fo"], "\x9f" => [16, "fo"], "\xa0" => [94, "fs"], "\xa1" => [76, "fs"], "\xa2" => [104, "fs"], "\xa3" => [16, "fs"], "\xa4" => [94, "ft"], "\xa5" => [76, "ft"], "\xa6" => [104, "ft"], "\xa7" => [16, "ft"], "\xa8" => [77, "f "], "\xa9" => [18, "f "], "\xaa" => [77, "f%"], "\xab" => [18, "f%"], "\xac" => [77, "f-"], "\xad" => [18, "f-"], "\xae" => [77, "f."], "\xaf" => [18, "f."], "\xb0" => [77, "f/"], "\xb1" => [18, "f/"], "\xb2" => [77, "f3"], "\xb3" => [18, "f3"], "\xb4" => [77, "f4"], "\xb5" => [18, "f4"], "\xb6" => [77, "f5"], "\xb7" => [18, "f5"], "\xb8" => [77, "f6"], "\xb9" => [18, "f6"], "\xba" => [77, "f7"], "\xbb" => [18, "f7"], "\xbc" => [77, "f8"], "\xbd" => [18, "f8"], "\xbe" => [77, "f9"], "\xbf" => [18, "f9"], "\xc0" => [77, "f="], "\xc1" => [18, "f="], "\xc2" => [77, "fA"], "\xc3" => [18, "fA"], "\xc4" => [77, "f_"], "\xc5" => [18, "f_"], "\xc6" => [77, "fb"], "\xc7" => [18, "fb"], "\xc8" => [77, "fd"], "\xc9" => [18, "fd"], "\xca" => [77, "ff"], "\xcb" => [18, "ff"], "\xcc" => [77, "fg"], "\xcd" => [18, "fg"], "\xce" => [77, "fh"], "\xcf" => [18, "fh"], "\xd0" => [77, "fl"], "\xd1" => [18, "fl"], "\xd2" => [77, "fm"], "\xd3" => [18, "fm"], "\xd4" => [77, "fn"], "\xd5" => [18, "fn"], "\xd6" => [77, "fp"], "\xd7" => [18, "fp"], "\xd8" => [77, "fr"], "\xd9" => [18, "fr"], "\xda" => [77, "fu"], "\xdb" => [18, "fu"], "\xdc" => [0, "f:"], "\xdd" => [0, "fB"], "\xde" => [0, "fC"], "\xdf" => [0, "fD"], "\xe0" => [0, "fE"], "\xe1" => [0, "fF"], "\xe2" => [0, "fG"], "\xe3" => [0, "fH"], "\xe4" => [0, "fI"], "\xe5" => [0, "fJ"], "\xe6" => [0, "fK"], "\xe7" => [0, "fL"], "\xe8" => [0, "fM"], "\xe9" => [0, "fN"], "\xea" => [0, "fO"], "\xeb" => [0, "fP"], "\xec" => [0, "fQ"], "\xed" => [0, "fR"], "\xee" => [0, "fS"], "\xef" => [0, "fT"], "\xf0" => [0, "fU"], "\xf1" => [0, "fV"], "\xf2" => [0, "fW"], "\xf3" => [0, "fY"], "\xf4" => [0, "fj"], "\xf5" => [0, "fk"], "\xf6" => [0, "fq"], "\xf7" => [0, "fv"], "\xf8" => [0, "fw"], "\xf9" => [0, "fx"], "\xfa" => [0, "fy"], "\xfb" => [0, "fz"], "\xfc" => [82, "f"], "\xfd" => [87, "f"], "\xfe" => [130, "f"], "\xff" => [9, "f"]], ["\x00" => [77, "d0"], "\x01" => [18, "d0"], "\x02" => [77, "d1"], "\x03" => [18, "d1"], "\x04" => [77, "d2"], "\x05" => [18, "d2"], "\x06" => [77, "da"], "\x07" => [18, "da"], "\x08" => [77, "dc"], "\t" => [18, "dc"], "\n" => [77, "de"], "\v" => [18, "de"], "\f" => [77, "di"], "\r" => [18, "di"], "\x0e" => [77, "do"], "\x0f" => [18, "do"], "\x10" => [77, "ds"], "\x11" => [18, "ds"], "\x12" => [77, "dt"], "\x13" => [18, "dt"], "\x14" => [0, "d "], "\x15" => [0, "d%"], "\x16" => [0, "d-"], "\x17" => [0, "d."], "\x18" => [0, "d/"], "\x19" => [0, "d3"], "\x1a" => [0, "d4"], "\x1b" => [0, "d5"], "\x1c" => [0, "d6"], "\x1d" => [0, "d7"], "\x1e" => [0, "d8"], "\x1f" => [0, "d9"], " " => [0, "d="], "!" => [0, "dA"], "\"" => [0, "d_"], "#" => [0, "db"], "\$" => [0, "dd"], "%" => [0, "df"], "&" => [0, "dg"], "'" => [0, "dh"], "(" => [0, "dl"], ")" => [0, "dm"], "*" => [0, "dn"], "+" => [0, "dp"], "," => [0, "dr"], "-" => [0, "du"], "." => [100, "d"], "/" => [110, "d"], [111, "d"], [115, "d"], [116, "d"], [118, "d"], [119, "d"], [122, "d"], [123, "d"], [125, "d"], [126, "d"], [129, "d"], ":" => [143, "d"], ";" => [148, "d"], "<" => [151, "d"], "=" => [153, "d"], ">" => [83, "d"], "?" => [10, "d"], "@" => [77, "f0"], "A" => [18, "f0"], "B" => [77, "f1"], "C" => [18, "f1"], "D" => [77, "f2"], "E" => [18, "f2"], "F" => [77, "fa"], "G" => [18, "fa"], "H" => [77, "fc"], "I" => [18, "fc"], "J" => [77, "fe"], "K" => [18, "fe"], "L" => [77, "fi"], "M" => [18, "fi"], "N" => [77, "fo"], "O" => [18, "fo"], "P" => [77, "fs"], "Q" => [18, "fs"], "R" => [77, "ft"], "S" => [18, "ft"], "T" => [0, "f "], "U" => [0, "f%"], "V" => [0, "f-"], "W" => [0, "f."], "X" => [0, "f/"], "Y" => [0, "f3"], "Z" => [0, "f4"], "[" => [0, "f5"], "\\" => [0, "f6"], "]" => [0, "f7"], "^" => [0, "f8"], "_" => [0, "f9"], "`" => [0, "f="], "a" => [0, "fA"], "b" => [0, "f_"], "c" => [0, "fb"], "d" => [0, "fd"], "e" => [0, "ff"], "f" => [0, "fg"], "g" => [0, "fh"], "h" => [0, "fl"], "i" => [0, "fm"], "j" => [0, "fn"], "k" => [0, "fp"], "l" => [0, "fr"], "m" => [0, "fu"], "n" => [100, "f"], "o" => [110, "f"], "p" => [111, "f"], "q" => [115, "f"], "r" => [116, "f"], "s" => [118, "f"], "t" => [119, "f"], "u" => [122, "f"], "v" => [123, "f"], "w" => [125, "f"], "x" => [126, "f"], "y" => [129, "f"], "z" => [143, "f"], "{" => [148, "f"], "|" => [151, "f"], "}" => [153, "f"], "~" => [83, "f"], "" => [10, "f"], "\x80" => [77, "g0"], "\x81" => [18, "g0"], "\x82" => [77, "g1"], "\x83" => [18, "g1"], "\x84" => [77, "g2"], "\x85" => [18, "g2"], "\x86" => [77, "ga"], "\x87" => [18, "ga"], "\x88" => [77, "gc"], "\x89" => [18, "gc"], "\x8a" => [77, "ge"], "\x8b" => [18, "ge"], "\x8c" => [77, "gi"], "\x8d" => [18, "gi"], "\x8e" => [77, "go"], "\x8f" => [18, "go"], "\x90" => [77, "gs"], "\x91" => [18, "gs"], "\x92" => [77, "gt"], "\x93" => [18, "gt"], "\x94" => [0, "g "], "\x95" => [0, "g%"], "\x96" => [0, "g-"], "\x97" => [0, "g."], "\x98" => [0, "g/"], "\x99" => [0, "g3"], "\x9a" => [0, "g4"], "\x9b" => [0, "g5"], "\x9c" => [0, "g6"], "\x9d" => [0, "g7"], "\x9e" => [0, "g8"], "\x9f" => [0, "g9"], "\xa0" => [0, "g="], "\xa1" => [0, "gA"], "\xa2" => [0, "g_"], "\xa3" => [0, "gb"], "\xa4" => [0, "gd"], "\xa5" => [0, "gf"], "\xa6" => [0, "gg"], "\xa7" => [0, "gh"], "\xa8" => [0, "gl"], "\xa9" => [0, "gm"], "\xaa" => [0, "gn"], "\xab" => [0, "gp"], "\xac" => [0, "gr"], "\xad" => [0, "gu"], "\xae" => [100, "g"], "\xaf" => [110, "g"], "\xb0" => [111, "g"], "\xb1" => [115, "g"], "\xb2" => [116, "g"], "\xb3" => [118, "g"], "\xb4" => [119, "g"], "\xb5" => [122, "g"], "\xb6" => [123, "g"], "\xb7" => [125, "g"], "\xb8" => [126, "g"], "\xb9" => [129, "g"], "\xba" => [143, "g"], "\xbb" => [148, "g"], "\xbc" => [151, "g"], "\xbd" => [153, "g"], "\xbe" => [83, "g"], "\xbf" => [10, "g"], "\xc0" => [77, "h0"], "\xc1" => [18, "h0"], "\xc2" => [77, "h1"], "\xc3" => [18, "h1"], "\xc4" => [77, "h2"], "\xc5" => [18, "h2"], "\xc6" => [77, "ha"], "\xc7" => [18, "ha"], "\xc8" => [77, "hc"], "\xc9" => [18, "hc"], "\xca" => [77, "he"], "\xcb" => [18, "he"], "\xcc" => [77, "hi"], "\xcd" => [18, "hi"], "\xce" => [77, "ho"], "\xcf" => [18, "ho"], "\xd0" => [77, "hs"], "\xd1" => [18, "hs"], "\xd2" => [77, "ht"], "\xd3" => [18, "ht"], "\xd4" => [0, "h "], "\xd5" => [0, "h%"], "\xd6" => [0, "h-"], "\xd7" => [0, "h."], "\xd8" => [0, "h/"], "\xd9" => [0, "h3"], "\xda" => [0, "h4"], "\xdb" => [0, "h5"], "\xdc" => [0, "h6"], "\xdd" => [0, "h7"], "\xde" => [0, "h8"], "\xdf" => [0, "h9"], "\xe0" => [0, "h="], "\xe1" => [0, "hA"], "\xe2" => [0, "h_"], "\xe3" => [0, "hb"], "\xe4" => [0, "hd"], "\xe5" => [0, "hf"], "\xe6" => [0, "hg"], "\xe7" => [0, "hh"], "\xe8" => [0, "hl"], "\xe9" => [0, "hm"], "\xea" => [0, "hn"], "\xeb" => [0, "hp"], "\xec" => [0, "hr"], "\xed" => [0, "hu"], "\xee" => [100, "h"], "\xef" => [110, "h"], "\xf0" => [111, "h"], "\xf1" => [115, "h"], "\xf2" => [116, "h"], "\xf3" => [118, "h"], "\xf4" => [119, "h"], "\xf5" => [122, "h"], "\xf6" => [123, "h"], "\xf7" => [125, "h"], "\xf8" => [126, "h"], "\xf9" => [129, "h"], "\xfa" => [143, "h"], "\xfb" => [148, "h"], "\xfc" => [151, "h"], "\xfd" => [153, "h"], "\xfe" => [83, "h"], "\xff" => [10, "h"]], ["\x00" => [94, "g0"], "\x01" => [76, "g0"], "\x02" => [104, "g0"], "\x03" => [16, "g0"], "\x04" => [94, "g1"], "\x05" => [76, "g1"], "\x06" => [104, "g1"], "\x07" => [16, "g1"], "\x08" => [94, "g2"], "\t" => [76, "g2"], "\n" => [104, "g2"], "\v" => [16, "g2"], "\f" => [94, "ga"], "\r" => [76, "ga"], "\x0e" => [104, "ga"], "\x0f" => [16, "ga"], "\x10" => [94, "gc"], "\x11" => [76, "gc"], "\x12" => [104, "gc"], "\x13" => [16, "gc"], "\x14" => [94, "ge"], "\x15" => [76, "ge"], "\x16" => [104, "ge"], "\x17" => [16, "ge"], "\x18" => [94, "gi"], "\x19" => [76, "gi"], "\x1a" => [104, "gi"], "\x1b" => [16, "gi"], "\x1c" => [94, "go"], "\x1d" => [76, "go"], "\x1e" => [104, "go"], "\x1f" => [16, "go"], " " => [94, "gs"], "!" => [76, "gs"], "\"" => [104, "gs"], "#" => [16, "gs"], "\$" => [94, "gt"], "%" => [76, "gt"], "&" => [104, "gt"], "'" => [16, "gt"], "(" => [77, "g "], ")" => [18, "g "], "*" => [77, "g%"], "+" => [18, "g%"], "," => [77, "g-"], "-" => [18, "g-"], "." => [77, "g."], "/" => [18, "g."], [77, "g/"], [18, "g/"], [77, "g3"], [18, "g3"], [77, "g4"], [18, "g4"], [77, "g5"], [18, "g5"], [77, "g6"], [18, "g6"], ":" => [77, "g7"], ";" => [18, "g7"], "<" => [77, "g8"], "=" => [18, "g8"], ">" => [77, "g9"], "?" => [18, "g9"], "@" => [77, "g="], "A" => [18, "g="], "B" => [77, "gA"], "C" => [18, "gA"], "D" => [77, "g_"], "E" => [18, "g_"], "F" => [77, "gb"], "G" => [18, "gb"], "H" => [77, "gd"], "I" => [18, "gd"], "J" => [77, "gf"], "K" => [18, "gf"], "L" => [77, "gg"], "M" => [18, "gg"], "N" => [77, "gh"], "O" => [18, "gh"], "P" => [77, "gl"], "Q" => [18, "gl"], "R" => [77, "gm"], "S" => [18, "gm"], "T" => [77, "gn"], "U" => [18, "gn"], "V" => [77, "gp"], "W" => [18, "gp"], "X" => [77, "gr"], "Y" => [18, "gr"], "Z" => [77, "gu"], "[" => [18, "gu"], "\\" => [0, "g:"], "]" => [0, "gB"], "^" => [0, "gC"], "_" => [0, "gD"], "`" => [0, "gE"], "a" => [0, "gF"], "b" => [0, "gG"], "c" => [0, "gH"], "d" => [0, "gI"], "e" => [0, "gJ"], "f" => [0, "gK"], "g" => [0, "gL"], "h" => [0, "gM"], "i" => [0, "gN"], "j" => [0, "gO"], "k" => [0, "gP"], "l" => [0, "gQ"], "m" => [0, "gR"], "n" => [0, "gS"], "o" => [0, "gT"], "p" => [0, "gU"], "q" => [0, "gV"], "r" => [0, "gW"], "s" => [0, "gY"], "t" => [0, "gj"], "u" => [0, "gk"], "v" => [0, "gq"], "w" => [0, "gv"], "x" => [0, "gw"], "y" => [0, "gx"], "z" => [0, "gy"], "{" => [0, "gz"], "|" => [82, "g"], "}" => [87, "g"], "~" => [130, "g"], "" => [9, "g"], "\x80" => [94, "h0"], "\x81" => [76, "h0"], "\x82" => [104, "h0"], "\x83" => [16, "h0"], "\x84" => [94, "h1"], "\x85" => [76, "h1"], "\x86" => [104, "h1"], "\x87" => [16, "h1"], "\x88" => [94, "h2"], "\x89" => [76, "h2"], "\x8a" => [104, "h2"], "\x8b" => [16, "h2"], "\x8c" => [94, "ha"], "\x8d" => [76, "ha"], "\x8e" => [104, "ha"], "\x8f" => [16, "ha"], "\x90" => [94, "hc"], "\x91" => [76, "hc"], "\x92" => [104, "hc"], "\x93" => [16, "hc"], "\x94" => [94, "he"], "\x95" => [76, "he"], "\x96" => [104, "he"], "\x97" => [16, "he"], "\x98" => [94, "hi"], "\x99" => [76, "hi"], "\x9a" => [104, "hi"], "\x9b" => [16, "hi"], "\x9c" => [94, "ho"], "\x9d" => [76, "ho"], "\x9e" => [104, "ho"], "\x9f" => [16, "ho"], "\xa0" => [94, "hs"], "\xa1" => [76, "hs"], "\xa2" => [104, "hs"], "\xa3" => [16, "hs"], "\xa4" => [94, "ht"], "\xa5" => [76, "ht"], "\xa6" => [104, "ht"], "\xa7" => [16, "ht"], "\xa8" => [77, "h "], "\xa9" => [18, "h "], "\xaa" => [77, "h%"], "\xab" => [18, "h%"], "\xac" => [77, "h-"], "\xad" => [18, "h-"], "\xae" => [77, "h."], "\xaf" => [18, "h."], "\xb0" => [77, "h/"], "\xb1" => [18, "h/"], "\xb2" => [77, "h3"], "\xb3" => [18, "h3"], "\xb4" => [77, "h4"], "\xb5" => [18, "h4"], "\xb6" => [77, "h5"], "\xb7" => [18, "h5"], "\xb8" => [77, "h6"], "\xb9" => [18, "h6"], "\xba" => [77, "h7"], "\xbb" => [18, "h7"], "\xbc" => [77, "h8"], "\xbd" => [18, "h8"], "\xbe" => [77, "h9"], "\xbf" => [18, "h9"], "\xc0" => [77, "h="], "\xc1" => [18, "h="], "\xc2" => [77, "hA"], "\xc3" => [18, "hA"], "\xc4" => [77, "h_"], "\xc5" => [18, "h_"], "\xc6" => [77, "hb"], "\xc7" => [18, "hb"], "\xc8" => [77, "hd"], "\xc9" => [18, "hd"], "\xca" => [77, "hf"], "\xcb" => [18, "hf"], "\xcc" => [77, "hg"], "\xcd" => [18, "hg"], "\xce" => [77, "hh"], "\xcf" => [18, "hh"], "\xd0" => [77, "hl"], "\xd1" => [18, "hl"], "\xd2" => [77, "hm"], "\xd3" => [18, "hm"], "\xd4" => [77, "hn"], "\xd5" => [18, "hn"], "\xd6" => [77, "hp"], "\xd7" => [18, "hp"], "\xd8" => [77, "hr"], "\xd9" => [18, "hr"], "\xda" => [77, "hu"], "\xdb" => [18, "hu"], "\xdc" => [0, "h:"], "\xdd" => [0, "hB"], "\xde" => [0, "hC"], "\xdf" => [0, "hD"], "\xe0" => [0, "hE"], "\xe1" => [0, "hF"], "\xe2" => [0, "hG"], "\xe3" => [0, "hH"], "\xe4" => [0, "hI"], "\xe5" => [0, "hJ"], "\xe6" => [0, "hK"], "\xe7" => [0, "hL"], "\xe8" => [0, "hM"], "\xe9" => [0, "hN"], "\xea" => [0, "hO"], "\xeb" => [0, "hP"], "\xec" => [0, "hQ"], "\xed" => [0, "hR"], "\xee" => [0, "hS"], "\xef" => [0, "hT"], "\xf0" => [0, "hU"], "\xf1" => [0, "hV"], "\xf2" => [0, "hW"], "\xf3" => [0, "hY"], "\xf4" => [0, "hj"], "\xf5" => [0, "hk"], "\xf6" => [0, "hq"], "\xf7" => [0, "hv"], "\xf8" => [0, "hw"], "\xf9" => [0, "hx"], "\xfa" => [0, "hy"], "\xfb" => [0, "hz"], "\xfc" => [82, "h"], "\xfd" => [87, "h"], "\xfe" => [130, "h"], "\xff" => [9, "h"]], ["\x00" => [94, "i0"], "\x01" => [76, "i0"], "\x02" => [104, "i0"], "\x03" => [16, "i0"], "\x04" => [94, "i1"], "\x05" => [76, "i1"], "\x06" => [104, "i1"], "\x07" => [16, "i1"], "\x08" => [94, "i2"], "\t" => [76, "i2"], "\n" => [104, "i2"], "\v" => [16, "i2"], "\f" => [94, "ia"], "\r" => [76, "ia"], "\x0e" => [104, "ia"], "\x0f" => [16, "ia"], "\x10" => [94, "ic"], "\x11" => [76, "ic"], "\x12" => [104, "ic"], "\x13" => [16, "ic"], "\x14" => [94, "ie"], "\x15" => [76, "ie"], "\x16" => [104, "ie"], "\x17" => [16, "ie"], "\x18" => [94, "ii"], "\x19" => [76, "ii"], "\x1a" => [104, "ii"], "\x1b" => [16, "ii"], "\x1c" => [94, "io"], "\x1d" => [76, "io"], "\x1e" => [104, "io"], "\x1f" => [16, "io"], " " => [94, "is"], "!" => [76, "is"], "\"" => [104, "is"], "#" => [16, "is"], "\$" => [94, "it"], "%" => [76, "it"], "&" => [104, "it"], "'" => [16, "it"], "(" => [77, "i "], ")" => [18, "i "], "*" => [77, "i%"], "+" => [18, "i%"], "," => [77, "i-"], "-" => [18, "i-"], "." => [77, "i."], "/" => [18, "i."], [77, "i/"], [18, "i/"], [77, "i3"], [18, "i3"], [77, "i4"], [18, "i4"], [77, "i5"], [18, "i5"], [77, "i6"], [18, "i6"], ":" => [77, "i7"], ";" => [18, "i7"], "<" => [77, "i8"], "=" => [18, "i8"], ">" => [77, "i9"], "?" => [18, "i9"], "@" => [77, "i="], "A" => [18, "i="], "B" => [77, "iA"], "C" => [18, "iA"], "D" => [77, "i_"], "E" => [18, "i_"], "F" => [77, "ib"], "G" => [18, "ib"], "H" => [77, "id"], "I" => [18, "id"], "J" => [77, "if"], "K" => [18, "if"], "L" => [77, "ig"], "M" => [18, "ig"], "N" => [77, "ih"], "O" => [18, "ih"], "P" => [77, "il"], "Q" => [18, "il"], "R" => [77, "im"], "S" => [18, "im"], "T" => [77, "in"], "U" => [18, "in"], "V" => [77, "ip"], "W" => [18, "ip"], "X" => [77, "ir"], "Y" => [18, "ir"], "Z" => [77, "iu"], "[" => [18, "iu"], "\\" => [0, "i:"], "]" => [0, "iB"], "^" => [0, "iC"], "_" => [0, "iD"], "`" => [0, "iE"], "a" => [0, "iF"], "b" => [0, "iG"], "c" => [0, "iH"], "d" => [0, "iI"], "e" => [0, "iJ"], "f" => [0, "iK"], "g" => [0, "iL"], "h" => [0, "iM"], "i" => [0, "iN"], "j" => [0, "iO"], "k" => [0, "iP"], "l" => [0, "iQ"], "m" => [0, "iR"], "n" => [0, "iS"], "o" => [0, "iT"], "p" => [0, "iU"], "q" => [0, "iV"], "r" => [0, "iW"], "s" => [0, "iY"], "t" => [0, "ij"], "u" => [0, "ik"], "v" => [0, "iq"], "w" => [0, "iv"], "x" => [0, "iw"], "y" => [0, "ix"], "z" => [0, "iy"], "{" => [0, "iz"], "|" => [82, "i"], "}" => [87, "i"], "~" => [130, "i"], "" => [9, "i"], "\x80" => [94, "o0"], "\x81" => [76, "o0"], "\x82" => [104, "o0"], "\x83" => [16, "o0"], "\x84" => [94, "o1"], "\x85" => [76, "o1"], "\x86" => [104, "o1"], "\x87" => [16, "o1"], "\x88" => [94, "o2"], "\x89" => [76, "o2"], "\x8a" => [104, "o2"], "\x8b" => [16, "o2"], "\x8c" => [94, "oa"], "\x8d" => [76, "oa"], "\x8e" => [104, "oa"], "\x8f" => [16, "oa"], "\x90" => [94, "oc"], "\x91" => [76, "oc"], "\x92" => [104, "oc"], "\x93" => [16, "oc"], "\x94" => [94, "oe"], "\x95" => [76, "oe"], "\x96" => [104, "oe"], "\x97" => [16, "oe"], "\x98" => [94, "oi"], "\x99" => [76, "oi"], "\x9a" => [104, "oi"], "\x9b" => [16, "oi"], "\x9c" => [94, "oo"], "\x9d" => [76, "oo"], "\x9e" => [104, "oo"], "\x9f" => [16, "oo"], "\xa0" => [94, "os"], "\xa1" => [76, "os"], "\xa2" => [104, "os"], "\xa3" => [16, "os"], "\xa4" => [94, "ot"], "\xa5" => [76, "ot"], "\xa6" => [104, "ot"], "\xa7" => [16, "ot"], "\xa8" => [77, "o "], "\xa9" => [18, "o "], "\xaa" => [77, "o%"], "\xab" => [18, "o%"], "\xac" => [77, "o-"], "\xad" => [18, "o-"], "\xae" => [77, "o."], "\xaf" => [18, "o."], "\xb0" => [77, "o/"], "\xb1" => [18, "o/"], "\xb2" => [77, "o3"], "\xb3" => [18, "o3"], "\xb4" => [77, "o4"], "\xb5" => [18, "o4"], "\xb6" => [77, "o5"], "\xb7" => [18, "o5"], "\xb8" => [77, "o6"], "\xb9" => [18, "o6"], "\xba" => [77, "o7"], "\xbb" => [18, "o7"], "\xbc" => [77, "o8"], "\xbd" => [18, "o8"], "\xbe" => [77, "o9"], "\xbf" => [18, "o9"], "\xc0" => [77, "o="], "\xc1" => [18, "o="], "\xc2" => [77, "oA"], "\xc3" => [18, "oA"], "\xc4" => [77, "o_"], "\xc5" => [18, "o_"], "\xc6" => [77, "ob"], "\xc7" => [18, "ob"], "\xc8" => [77, "od"], "\xc9" => [18, "od"], "\xca" => [77, "of"], "\xcb" => [18, "of"], "\xcc" => [77, "og"], "\xcd" => [18, "og"], "\xce" => [77, "oh"], "\xcf" => [18, "oh"], "\xd0" => [77, "ol"], "\xd1" => [18, "ol"], "\xd2" => [77, "om"], "\xd3" => [18, "om"], "\xd4" => [77, "on"], "\xd5" => [18, "on"], "\xd6" => [77, "op"], "\xd7" => [18, "op"], "\xd8" => [77, "or"], "\xd9" => [18, "or"], "\xda" => [77, "ou"], "\xdb" => [18, "ou"], "\xdc" => [0, "o:"], "\xdd" => [0, "oB"], "\xde" => [0, "oC"], "\xdf" => [0, "oD"], "\xe0" => [0, "oE"], "\xe1" => [0, "oF"], "\xe2" => [0, "oG"], "\xe3" => [0, "oH"], "\xe4" => [0, "oI"], "\xe5" => [0, "oJ"], "\xe6" => [0, "oK"], "\xe7" => [0, "oL"], "\xe8" => [0, "oM"], "\xe9" => [0, "oN"], "\xea" => [0, "oO"], "\xeb" => [0, "oP"], "\xec" => [0, "oQ"], "\xed" => [0, "oR"], "\xee" => [0, "oS"], "\xef" => [0, "oT"], "\xf0" => [0, "oU"], "\xf1" => [0, "oV"], "\xf2" => [0, "oW"], "\xf3" => [0, "oY"], "\xf4" => [0, "oj"], "\xf5" => [0, "ok"], "\xf6" => [0, "oq"], "\xf7" => [0, "ov"], "\xf8" => [0, "ow"], "\xf9" => [0, "ox"], "\xfa" => [0, "oy"], "\xfb" => [0, "oz"], "\xfc" => [82, "o"], "\xfd" => [87, "o"], "\xfe" => [130, "o"], "\xff" => [9, "o"]], ["\x00" => [94, "j0"], "\x01" => [76, "j0"], "\x02" => [104, "j0"], "\x03" => [16, "j0"], "\x04" => [94, "j1"], "\x05" => [76, "j1"], "\x06" => [104, "j1"], "\x07" => [16, "j1"], "\x08" => [94, "j2"], "\t" => [76, "j2"], "\n" => [104, "j2"], "\v" => [16, "j2"], "\f" => [94, "ja"], "\r" => [76, "ja"], "\x0e" => [104, "ja"], "\x0f" => [16, "ja"], "\x10" => [94, "jc"], "\x11" => [76, "jc"], "\x12" => [104, "jc"], "\x13" => [16, "jc"], "\x14" => [94, "je"], "\x15" => [76, "je"], "\x16" => [104, "je"], "\x17" => [16, "je"], "\x18" => [94, "ji"], "\x19" => [76, "ji"], "\x1a" => [104, "ji"], "\x1b" => [16, "ji"], "\x1c" => [94, "jo"], "\x1d" => [76, "jo"], "\x1e" => [104, "jo"], "\x1f" => [16, "jo"], " " => [94, "js"], "!" => [76, "js"], "\"" => [104, "js"], "#" => [16, "js"], "\$" => [94, "jt"], "%" => [76, "jt"], "&" => [104, "jt"], "'" => [16, "jt"], "(" => [77, "j "], ")" => [18, "j "], "*" => [77, "j%"], "+" => [18, "j%"], "," => [77, "j-"], "-" => [18, "j-"], "." => [77, "j."], "/" => [18, "j."], [77, "j/"], [18, "j/"], [77, "j3"], [18, "j3"], [77, "j4"], [18, "j4"], [77, "j5"], [18, "j5"], [77, "j6"], [18, "j6"], ":" => [77, "j7"], ";" => [18, "j7"], "<" => [77, "j8"], "=" => [18, "j8"], ">" => [77, "j9"], "?" => [18, "j9"], "@" => [77, "j="], "A" => [18, "j="], "B" => [77, "jA"], "C" => [18, "jA"], "D" => [77, "j_"], "E" => [18, "j_"], "F" => [77, "jb"], "G" => [18, "jb"], "H" => [77, "jd"], "I" => [18, "jd"], "J" => [77, "jf"], "K" => [18, "jf"], "L" => [77, "jg"], "M" => [18, "jg"], "N" => [77, "jh"], "O" => [18, "jh"], "P" => [77, "jl"], "Q" => [18, "jl"], "R" => [77, "jm"], "S" => [18, "jm"], "T" => [77, "jn"], "U" => [18, "jn"], "V" => [77, "jp"], "W" => [18, "jp"], "X" => [77, "jr"], "Y" => [18, "jr"], "Z" => [77, "ju"], "[" => [18, "ju"], "\\" => [0, "j:"], "]" => [0, "jB"], "^" => [0, "jC"], "_" => [0, "jD"], "`" => [0, "jE"], "a" => [0, "jF"], "b" => [0, "jG"], "c" => [0, "jH"], "d" => [0, "jI"], "e" => [0, "jJ"], "f" => [0, "jK"], "g" => [0, "jL"], "h" => [0, "jM"], "i" => [0, "jN"], "j" => [0, "jO"], "k" => [0, "jP"], "l" => [0, "jQ"], "m" => [0, "jR"], "n" => [0, "jS"], "o" => [0, "jT"], "p" => [0, "jU"], "q" => [0, "jV"], "r" => [0, "jW"], "s" => [0, "jY"], "t" => [0, "jj"], "u" => [0, "jk"], "v" => [0, "jq"], "w" => [0, "jv"], "x" => [0, "jw"], "y" => [0, "jx"], "z" => [0, "jy"], "{" => [0, "jz"], "|" => [82, "j"], "}" => [87, "j"], "~" => [130, "j"], "" => [9, "j"], "\x80" => [94, "k0"], "\x81" => [76, "k0"], "\x82" => [104, "k0"], "\x83" => [16, "k0"], "\x84" => [94, "k1"], "\x85" => [76, "k1"], "\x86" => [104, "k1"], "\x87" => [16, "k1"], "\x88" => [94, "k2"], "\x89" => [76, "k2"], "\x8a" => [104, "k2"], "\x8b" => [16, "k2"], "\x8c" => [94, "ka"], "\x8d" => [76, "ka"], "\x8e" => [104, "ka"], "\x8f" => [16, "ka"], "\x90" => [94, "kc"], "\x91" => [76, "kc"], "\x92" => [104, "kc"], "\x93" => [16, "kc"], "\x94" => [94, "ke"], "\x95" => [76, "ke"], "\x96" => [104, "ke"], "\x97" => [16, "ke"], "\x98" => [94, "ki"], "\x99" => [76, "ki"], "\x9a" => [104, "ki"], "\x9b" => [16, "ki"], "\x9c" => [94, "ko"], "\x9d" => [76, "ko"], "\x9e" => [104, "ko"], "\x9f" => [16, "ko"], "\xa0" => [94, "ks"], "\xa1" => [76, "ks"], "\xa2" => [104, "ks"], "\xa3" => [16, "ks"], "\xa4" => [94, "kt"], "\xa5" => [76, "kt"], "\xa6" => [104, "kt"], "\xa7" => [16, "kt"], "\xa8" => [77, "k "], "\xa9" => [18, "k "], "\xaa" => [77, "k%"], "\xab" => [18, "k%"], "\xac" => [77, "k-"], "\xad" => [18, "k-"], "\xae" => [77, "k."], "\xaf" => [18, "k."], "\xb0" => [77, "k/"], "\xb1" => [18, "k/"], "\xb2" => [77, "k3"], "\xb3" => [18, "k3"], "\xb4" => [77, "k4"], "\xb5" => [18, "k4"], "\xb6" => [77, "k5"], "\xb7" => [18, "k5"], "\xb8" => [77, "k6"], "\xb9" => [18, "k6"], "\xba" => [77, "k7"], "\xbb" => [18, "k7"], "\xbc" => [77, "k8"], "\xbd" => [18, "k8"], "\xbe" => [77, "k9"], "\xbf" => [18, "k9"], "\xc0" => [77, "k="], "\xc1" => [18, "k="], "\xc2" => [77, "kA"], "\xc3" => [18, "kA"], "\xc4" => [77, "k_"], "\xc5" => [18, "k_"], "\xc6" => [77, "kb"], "\xc7" => [18, "kb"], "\xc8" => [77, "kd"], "\xc9" => [18, "kd"], "\xca" => [77, "kf"], "\xcb" => [18, "kf"], "\xcc" => [77, "kg"], "\xcd" => [18, "kg"], "\xce" => [77, "kh"], "\xcf" => [18, "kh"], "\xd0" => [77, "kl"], "\xd1" => [18, "kl"], "\xd2" => [77, "km"], "\xd3" => [18, "km"], "\xd4" => [77, "kn"], "\xd5" => [18, "kn"], "\xd6" => [77, "kp"], "\xd7" => [18, "kp"], "\xd8" => [77, "kr"], "\xd9" => [18, "kr"], "\xda" => [77, "ku"], "\xdb" => [18, "ku"], "\xdc" => [0, "k:"], "\xdd" => [0, "kB"], "\xde" => [0, "kC"], "\xdf" => [0, "kD"], "\xe0" => [0, "kE"], "\xe1" => [0, "kF"], "\xe2" => [0, "kG"], "\xe3" => [0, "kH"], "\xe4" => [0, "kI"], "\xe5" => [0, "kJ"], "\xe6" => [0, "kK"], "\xe7" => [0, "kL"], "\xe8" => [0, "kM"], "\xe9" => [0, "kN"], "\xea" => [0, "kO"], "\xeb" => [0, "kP"], "\xec" => [0, "kQ"], "\xed" => [0, "kR"], "\xee" => [0, "kS"], "\xef" => [0, "kT"], "\xf0" => [0, "kU"], "\xf1" => [0, "kV"], "\xf2" => [0, "kW"], "\xf3" => [0, "kY"], "\xf4" => [0, "kj"], "\xf5" => [0, "kk"], "\xf6" => [0, "kq"], "\xf7" => [0, "kv"], "\xf8" => [0, "kw"], "\xf9" => [0, "kx"], "\xfa" => [0, "ky"], "\xfb" => [0, "kz"], "\xfc" => [82, "k"], "\xfd" => [87, "k"], "\xfe" => [130, "k"], "\xff" => [9, "k"]], ["\x00" => [77, "j0"], "\x01" => [18, "j0"], "\x02" => [77, "j1"], "\x03" => [18, "j1"], "\x04" => [77, "j2"], "\x05" => [18, "j2"], "\x06" => [77, "ja"], "\x07" => [18, "ja"], "\x08" => [77, "jc"], "\t" => [18, "jc"], "\n" => [77, "je"], "\v" => [18, "je"], "\f" => [77, "ji"], "\r" => [18, "ji"], "\x0e" => [77, "jo"], "\x0f" => [18, "jo"], "\x10" => [77, "js"], "\x11" => [18, "js"], "\x12" => [77, "jt"], "\x13" => [18, "jt"], "\x14" => [0, "j "], "\x15" => [0, "j%"], "\x16" => [0, "j-"], "\x17" => [0, "j."], "\x18" => [0, "j/"], "\x19" => [0, "j3"], "\x1a" => [0, "j4"], "\x1b" => [0, "j5"], "\x1c" => [0, "j6"], "\x1d" => [0, "j7"], "\x1e" => [0, "j8"], "\x1f" => [0, "j9"], " " => [0, "j="], "!" => [0, "jA"], "\"" => [0, "j_"], "#" => [0, "jb"], "\$" => [0, "jd"], "%" => [0, "jf"], "&" => [0, "jg"], "'" => [0, "jh"], "(" => [0, "jl"], ")" => [0, "jm"], "*" => [0, "jn"], "+" => [0, "jp"], "," => [0, "jr"], "-" => [0, "ju"], "." => [100, "j"], "/" => [110, "j"], [111, "j"], [115, "j"], [116, "j"], [118, "j"], [119, "j"], [122, "j"], [123, "j"], [125, "j"], [126, "j"], [129, "j"], ":" => [143, "j"], ";" => [148, "j"], "<" => [151, "j"], "=" => [153, "j"], ">" => [83, "j"], "?" => [10, "j"], "@" => [77, "k0"], "A" => [18, "k0"], "B" => [77, "k1"], "C" => [18, "k1"], "D" => [77, "k2"], "E" => [18, "k2"], "F" => [77, "ka"], "G" => [18, "ka"], "H" => [77, "kc"], "I" => [18, "kc"], "J" => [77, "ke"], "K" => [18, "ke"], "L" => [77, "ki"], "M" => [18, "ki"], "N" => [77, "ko"], "O" => [18, "ko"], "P" => [77, "ks"], "Q" => [18, "ks"], "R" => [77, "kt"], "S" => [18, "kt"], "T" => [0, "k "], "U" => [0, "k%"], "V" => [0, "k-"], "W" => [0, "k."], "X" => [0, "k/"], "Y" => [0, "k3"], "Z" => [0, "k4"], "[" => [0, "k5"], "\\" => [0, "k6"], "]" => [0, "k7"], "^" => [0, "k8"], "_" => [0, "k9"], "`" => [0, "k="], "a" => [0, "kA"], "b" => [0, "k_"], "c" => [0, "kb"], "d" => [0, "kd"], "e" => [0, "kf"], "f" => [0, "kg"], "g" => [0, "kh"], "h" => [0, "kl"], "i" => [0, "km"], "j" => [0, "kn"], "k" => [0, "kp"], "l" => [0, "kr"], "m" => [0, "ku"], "n" => [100, "k"], "o" => [110, "k"], "p" => [111, "k"], "q" => [115, "k"], "r" => [116, "k"], "s" => [118, "k"], "t" => [119, "k"], "u" => [122, "k"], "v" => [123, "k"], "w" => [125, "k"], "x" => [126, "k"], "y" => [129, "k"], "z" => [143, "k"], "{" => [148, "k"], "|" => [151, "k"], "}" => [153, "k"], "~" => [83, "k"], "" => [10, "k"], "\x80" => [77, "q0"], "\x81" => [18, "q0"], "\x82" => [77, "q1"], "\x83" => [18, "q1"], "\x84" => [77, "q2"], "\x85" => [18, "q2"], "\x86" => [77, "qa"], "\x87" => [18, "qa"], "\x88" => [77, "qc"], "\x89" => [18, "qc"], "\x8a" => [77, "qe"], "\x8b" => [18, "qe"], "\x8c" => [77, "qi"], "\x8d" => [18, "qi"], "\x8e" => [77, "qo"], "\x8f" => [18, "qo"], "\x90" => [77, "qs"], "\x91" => [18, "qs"], "\x92" => [77, "qt"], "\x93" => [18, "qt"], "\x94" => [0, "q "], "\x95" => [0, "q%"], "\x96" => [0, "q-"], "\x97" => [0, "q."], "\x98" => [0, "q/"], "\x99" => [0, "q3"], "\x9a" => [0, "q4"], "\x9b" => [0, "q5"], "\x9c" => [0, "q6"], "\x9d" => [0, "q7"], "\x9e" => [0, "q8"], "\x9f" => [0, "q9"], "\xa0" => [0, "q="], "\xa1" => [0, "qA"], "\xa2" => [0, "q_"], "\xa3" => [0, "qb"], "\xa4" => [0, "qd"], "\xa5" => [0, "qf"], "\xa6" => [0, "qg"], "\xa7" => [0, "qh"], "\xa8" => [0, "ql"], "\xa9" => [0, "qm"], "\xaa" => [0, "qn"], "\xab" => [0, "qp"], "\xac" => [0, "qr"], "\xad" => [0, "qu"], "\xae" => [100, "q"], "\xaf" => [110, "q"], "\xb0" => [111, "q"], "\xb1" => [115, "q"], "\xb2" => [116, "q"], "\xb3" => [118, "q"], "\xb4" => [119, "q"], "\xb5" => [122, "q"], "\xb6" => [123, "q"], "\xb7" => [125, "q"], "\xb8" => [126, "q"], "\xb9" => [129, "q"], "\xba" => [143, "q"], "\xbb" => [148, "q"], "\xbc" => [151, "q"], "\xbd" => [153, "q"], "\xbe" => [83, "q"], "\xbf" => [10, "q"], "\xc0" => [77, "v0"], "\xc1" => [18, "v0"], "\xc2" => [77, "v1"], "\xc3" => [18, "v1"], "\xc4" => [77, "v2"], "\xc5" => [18, "v2"], "\xc6" => [77, "va"], "\xc7" => [18, "va"], "\xc8" => [77, "vc"], "\xc9" => [18, "vc"], "\xca" => [77, "ve"], "\xcb" => [18, "ve"], "\xcc" => [77, "vi"], "\xcd" => [18, "vi"], "\xce" => [77, "vo"], "\xcf" => [18, "vo"], "\xd0" => [77, "vs"], "\xd1" => [18, "vs"], "\xd2" => [77, "vt"], "\xd3" => [18, "vt"], "\xd4" => [0, "v "], "\xd5" => [0, "v%"], "\xd6" => [0, "v-"], "\xd7" => [0, "v."], "\xd8" => [0, "v/"], "\xd9" => [0, "v3"], "\xda" => [0, "v4"], "\xdb" => [0, "v5"], "\xdc" => [0, "v6"], "\xdd" => [0, "v7"], "\xde" => [0, "v8"], "\xdf" => [0, "v9"], "\xe0" => [0, "v="], "\xe1" => [0, "vA"], "\xe2" => [0, "v_"], "\xe3" => [0, "vb"], "\xe4" => [0, "vd"], "\xe5" => [0, "vf"], "\xe6" => [0, "vg"], "\xe7" => [0, "vh"], "\xe8" => [0, "vl"], "\xe9" => [0, "vm"], "\xea" => [0, "vn"], "\xeb" => [0, "vp"], "\xec" => [0, "vr"], "\xed" => [0, "vu"], "\xee" => [100, "v"], "\xef" => [110, "v"], "\xf0" => [111, "v"], "\xf1" => [115, "v"], "\xf2" => [116, "v"], "\xf3" => [118, "v"], "\xf4" => [119, "v"], "\xf5" => [122, "v"], "\xf6" => [123, "v"], "\xf7" => [125, "v"], "\xf8" => [126, "v"], "\xf9" => [129, "v"], "\xfa" => [143, "v"], "\xfb" => [148, "v"], "\xfc" => [151, "v"], "\xfd" => [153, "v"], "\xfe" => [83, "v"], "\xff" => [10, "v"]], ["\x00" => [94, "l0"], "\x01" => [76, "l0"], "\x02" => [104, "l0"], "\x03" => [16, "l0"], "\x04" => [94, "l1"], "\x05" => [76, "l1"], "\x06" => [104, "l1"], "\x07" => [16, "l1"], "\x08" => [94, "l2"], "\t" => [76, "l2"], "\n" => [104, "l2"], "\v" => [16, "l2"], "\f" => [94, "la"], "\r" => [76, "la"], "\x0e" => [104, "la"], "\x0f" => [16, "la"], "\x10" => [94, "lc"], "\x11" => [76, "lc"], "\x12" => [104, "lc"], "\x13" => [16, "lc"], "\x14" => [94, "le"], "\x15" => [76, "le"], "\x16" => [104, "le"], "\x17" => [16, "le"], "\x18" => [94, "li"], "\x19" => [76, "li"], "\x1a" => [104, "li"], "\x1b" => [16, "li"], "\x1c" => [94, "lo"], "\x1d" => [76, "lo"], "\x1e" => [104, "lo"], "\x1f" => [16, "lo"], " " => [94, "ls"], "!" => [76, "ls"], "\"" => [104, "ls"], "#" => [16, "ls"], "\$" => [94, "lt"], "%" => [76, "lt"], "&" => [104, "lt"], "'" => [16, "lt"], "(" => [77, "l "], ")" => [18, "l "], "*" => [77, "l%"], "+" => [18, "l%"], "," => [77, "l-"], "-" => [18, "l-"], "." => [77, "l."], "/" => [18, "l."], [77, "l/"], [18, "l/"], [77, "l3"], [18, "l3"], [77, "l4"], [18, "l4"], [77, "l5"], [18, "l5"], [77, "l6"], [18, "l6"], ":" => [77, "l7"], ";" => [18, "l7"], "<" => [77, "l8"], "=" => [18, "l8"], ">" => [77, "l9"], "?" => [18, "l9"], "@" => [77, "l="], "A" => [18, "l="], "B" => [77, "lA"], "C" => [18, "lA"], "D" => [77, "l_"], "E" => [18, "l_"], "F" => [77, "lb"], "G" => [18, "lb"], "H" => [77, "ld"], "I" => [18, "ld"], "J" => [77, "lf"], "K" => [18, "lf"], "L" => [77, "lg"], "M" => [18, "lg"], "N" => [77, "lh"], "O" => [18, "lh"], "P" => [77, "ll"], "Q" => [18, "ll"], "R" => [77, "lm"], "S" => [18, "lm"], "T" => [77, "ln"], "U" => [18, "ln"], "V" => [77, "lp"], "W" => [18, "lp"], "X" => [77, "lr"], "Y" => [18, "lr"], "Z" => [77, "lu"], "[" => [18, "lu"], "\\" => [0, "l:"], "]" => [0, "lB"], "^" => [0, "lC"], "_" => [0, "lD"], "`" => [0, "lE"], "a" => [0, "lF"], "b" => [0, "lG"], "c" => [0, "lH"], "d" => [0, "lI"], "e" => [0, "lJ"], "f" => [0, "lK"], "g" => [0, "lL"], "h" => [0, "lM"], "i" => [0, "lN"], "j" => [0, "lO"], "k" => [0, "lP"], "l" => [0, "lQ"], "m" => [0, "lR"], "n" => [0, "lS"], "o" => [0, "lT"], "p" => [0, "lU"], "q" => [0, "lV"], "r" => [0, "lW"], "s" => [0, "lY"], "t" => [0, "lj"], "u" => [0, "lk"], "v" => [0, "lq"], "w" => [0, "lv"], "x" => [0, "lw"], "y" => [0, "lx"], "z" => [0, "ly"], "{" => [0, "lz"], "|" => [82, "l"], "}" => [87, "l"], "~" => [130, "l"], "" => [9, "l"], "\x80" => [94, "m0"], "\x81" => [76, "m0"], "\x82" => [104, "m0"], "\x83" => [16, "m0"], "\x84" => [94, "m1"], "\x85" => [76, "m1"], "\x86" => [104, "m1"], "\x87" => [16, "m1"], "\x88" => [94, "m2"], "\x89" => [76, "m2"], "\x8a" => [104, "m2"], "\x8b" => [16, "m2"], "\x8c" => [94, "ma"], "\x8d" => [76, "ma"], "\x8e" => [104, "ma"], "\x8f" => [16, "ma"], "\x90" => [94, "mc"], "\x91" => [76, "mc"], "\x92" => [104, "mc"], "\x93" => [16, "mc"], "\x94" => [94, "me"], "\x95" => [76, "me"], "\x96" => [104, "me"], "\x97" => [16, "me"], "\x98" => [94, "mi"], "\x99" => [76, "mi"], "\x9a" => [104, "mi"], "\x9b" => [16, "mi"], "\x9c" => [94, "mo"], "\x9d" => [76, "mo"], "\x9e" => [104, "mo"], "\x9f" => [16, "mo"], "\xa0" => [94, "ms"], "\xa1" => [76, "ms"], "\xa2" => [104, "ms"], "\xa3" => [16, "ms"], "\xa4" => [94, "mt"], "\xa5" => [76, "mt"], "\xa6" => [104, "mt"], "\xa7" => [16, "mt"], "\xa8" => [77, "m "], "\xa9" => [18, "m "], "\xaa" => [77, "m%"], "\xab" => [18, "m%"], "\xac" => [77, "m-"], "\xad" => [18, "m-"], "\xae" => [77, "m."], "\xaf" => [18, "m."], "\xb0" => [77, "m/"], "\xb1" => [18, "m/"], "\xb2" => [77, "m3"], "\xb3" => [18, "m3"], "\xb4" => [77, "m4"], "\xb5" => [18, "m4"], "\xb6" => [77, "m5"], "\xb7" => [18, "m5"], "\xb8" => [77, "m6"], "\xb9" => [18, "m6"], "\xba" => [77, "m7"], "\xbb" => [18, "m7"], "\xbc" => [77, "m8"], "\xbd" => [18, "m8"], "\xbe" => [77, "m9"], "\xbf" => [18, "m9"], "\xc0" => [77, "m="], "\xc1" => [18, "m="], "\xc2" => [77, "mA"], "\xc3" => [18, "mA"], "\xc4" => [77, "m_"], "\xc5" => [18, "m_"], "\xc6" => [77, "mb"], "\xc7" => [18, "mb"], "\xc8" => [77, "md"], "\xc9" => [18, "md"], "\xca" => [77, "mf"], "\xcb" => [18, "mf"], "\xcc" => [77, "mg"], "\xcd" => [18, "mg"], "\xce" => [77, "mh"], "\xcf" => [18, "mh"], "\xd0" => [77, "ml"], "\xd1" => [18, "ml"], "\xd2" => [77, "mm"], "\xd3" => [18, "mm"], "\xd4" => [77, "mn"], "\xd5" => [18, "mn"], "\xd6" => [77, "mp"], "\xd7" => [18, "mp"], "\xd8" => [77, "mr"], "\xd9" => [18, "mr"], "\xda" => [77, "mu"], "\xdb" => [18, "mu"], "\xdc" => [0, "m:"], "\xdd" => [0, "mB"], "\xde" => [0, "mC"], "\xdf" => [0, "mD"], "\xe0" => [0, "mE"], "\xe1" => [0, "mF"], "\xe2" => [0, "mG"], "\xe3" => [0, "mH"], "\xe4" => [0, "mI"], "\xe5" => [0, "mJ"], "\xe6" => [0, "mK"], "\xe7" => [0, "mL"], "\xe8" => [0, "mM"], "\xe9" => [0, "mN"], "\xea" => [0, "mO"], "\xeb" => [0, "mP"], "\xec" => [0, "mQ"], "\xed" => [0, "mR"], "\xee" => [0, "mS"], "\xef" => [0, "mT"], "\xf0" => [0, "mU"], "\xf1" => [0, "mV"], "\xf2" => [0, "mW"], "\xf3" => [0, "mY"], "\xf4" => [0, "mj"], "\xf5" => [0, "mk"], "\xf6" => [0, "mq"], "\xf7" => [0, "mv"], "\xf8" => [0, "mw"], "\xf9" => [0, "mx"], "\xfa" => [0, "my"], "\xfb" => [0, "mz"], "\xfc" => [82, "m"], "\xfd" => [87, "m"], "\xfe" => [130, "m"], "\xff" => [9, "m"]], ["\x00" => [77, "l0"], "\x01" => [18, "l0"], "\x02" => [77, "l1"], "\x03" => [18, "l1"], "\x04" => [77, "l2"], "\x05" => [18, "l2"], "\x06" => [77, "la"], "\x07" => [18, "la"], "\x08" => [77, "lc"], "\t" => [18, "lc"], "\n" => [77, "le"], "\v" => [18, "le"], "\f" => [77, "li"], "\r" => [18, "li"], "\x0e" => [77, "lo"], "\x0f" => [18, "lo"], "\x10" => [77, "ls"], "\x11" => [18, "ls"], "\x12" => [77, "lt"], "\x13" => [18, "lt"], "\x14" => [0, "l "], "\x15" => [0, "l%"], "\x16" => [0, "l-"], "\x17" => [0, "l."], "\x18" => [0, "l/"], "\x19" => [0, "l3"], "\x1a" => [0, "l4"], "\x1b" => [0, "l5"], "\x1c" => [0, "l6"], "\x1d" => [0, "l7"], "\x1e" => [0, "l8"], "\x1f" => [0, "l9"], " " => [0, "l="], "!" => [0, "lA"], "\"" => [0, "l_"], "#" => [0, "lb"], "\$" => [0, "ld"], "%" => [0, "lf"], "&" => [0, "lg"], "'" => [0, "lh"], "(" => [0, "ll"], ")" => [0, "lm"], "*" => [0, "ln"], "+" => [0, "lp"], "," => [0, "lr"], "-" => [0, "lu"], "." => [100, "l"], "/" => [110, "l"], [111, "l"], [115, "l"], [116, "l"], [118, "l"], [119, "l"], [122, "l"], [123, "l"], [125, "l"], [126, "l"], [129, "l"], ":" => [143, "l"], ";" => [148, "l"], "<" => [151, "l"], "=" => [153, "l"], ">" => [83, "l"], "?" => [10, "l"], "@" => [77, "m0"], "A" => [18, "m0"], "B" => [77, "m1"], "C" => [18, "m1"], "D" => [77, "m2"], "E" => [18, "m2"], "F" => [77, "ma"], "G" => [18, "ma"], "H" => [77, "mc"], "I" => [18, "mc"], "J" => [77, "me"], "K" => [18, "me"], "L" => [77, "mi"], "M" => [18, "mi"], "N" => [77, "mo"], "O" => [18, "mo"], "P" => [77, "ms"], "Q" => [18, "ms"], "R" => [77, "mt"], "S" => [18, "mt"], "T" => [0, "m "], "U" => [0, "m%"], "V" => [0, "m-"], "W" => [0, "m."], "X" => [0, "m/"], "Y" => [0, "m3"], "Z" => [0, "m4"], "[" => [0, "m5"], "\\" => [0, "m6"], "]" => [0, "m7"], "^" => [0, "m8"], "_" => [0, "m9"], "`" => [0, "m="], "a" => [0, "mA"], "b" => [0, "m_"], "c" => [0, "mb"], "d" => [0, "md"], "e" => [0, "mf"], "f" => [0, "mg"], "g" => [0, "mh"], "h" => [0, "ml"], "i" => [0, "mm"], "j" => [0, "mn"], "k" => [0, "mp"], "l" => [0, "mr"], "m" => [0, "mu"], "n" => [100, "m"], "o" => [110, "m"], "p" => [111, "m"], "q" => [115, "m"], "r" => [116, "m"], "s" => [118, "m"], "t" => [119, "m"], "u" => [122, "m"], "v" => [123, "m"], "w" => [125, "m"], "x" => [126, "m"], "y" => [129, "m"], "z" => [143, "m"], "{" => [148, "m"], "|" => [151, "m"], "}" => [153, "m"], "~" => [83, "m"], "" => [10, "m"], "\x80" => [77, "n0"], "\x81" => [18, "n0"], "\x82" => [77, "n1"], "\x83" => [18, "n1"], "\x84" => [77, "n2"], "\x85" => [18, "n2"], "\x86" => [77, "na"], "\x87" => [18, "na"], "\x88" => [77, "nc"], "\x89" => [18, "nc"], "\x8a" => [77, "ne"], "\x8b" => [18, "ne"], "\x8c" => [77, "ni"], "\x8d" => [18, "ni"], "\x8e" => [77, "no"], "\x8f" => [18, "no"], "\x90" => [77, "ns"], "\x91" => [18, "ns"], "\x92" => [77, "nt"], "\x93" => [18, "nt"], "\x94" => [0, "n "], "\x95" => [0, "n%"], "\x96" => [0, "n-"], "\x97" => [0, "n."], "\x98" => [0, "n/"], "\x99" => [0, "n3"], "\x9a" => [0, "n4"], "\x9b" => [0, "n5"], "\x9c" => [0, "n6"], "\x9d" => [0, "n7"], "\x9e" => [0, "n8"], "\x9f" => [0, "n9"], "\xa0" => [0, "n="], "\xa1" => [0, "nA"], "\xa2" => [0, "n_"], "\xa3" => [0, "nb"], "\xa4" => [0, "nd"], "\xa5" => [0, "nf"], "\xa6" => [0, "ng"], "\xa7" => [0, "nh"], "\xa8" => [0, "nl"], "\xa9" => [0, "nm"], "\xaa" => [0, "nn"], "\xab" => [0, "np"], "\xac" => [0, "nr"], "\xad" => [0, "nu"], "\xae" => [100, "n"], "\xaf" => [110, "n"], "\xb0" => [111, "n"], "\xb1" => [115, "n"], "\xb2" => [116, "n"], "\xb3" => [118, "n"], "\xb4" => [119, "n"], "\xb5" => [122, "n"], "\xb6" => [123, "n"], "\xb7" => [125, "n"], "\xb8" => [126, "n"], "\xb9" => [129, "n"], "\xba" => [143, "n"], "\xbb" => [148, "n"], "\xbc" => [151, "n"], "\xbd" => [153, "n"], "\xbe" => [83, "n"], "\xbf" => [10, "n"], "\xc0" => [77, "p0"], "\xc1" => [18, "p0"], "\xc2" => [77, "p1"], "\xc3" => [18, "p1"], "\xc4" => [77, "p2"], "\xc5" => [18, "p2"], "\xc6" => [77, "pa"], "\xc7" => [18, "pa"], "\xc8" => [77, "pc"], "\xc9" => [18, "pc"], "\xca" => [77, "pe"], "\xcb" => [18, "pe"], "\xcc" => [77, "pi"], "\xcd" => [18, "pi"], "\xce" => [77, "po"], "\xcf" => [18, "po"], "\xd0" => [77, "ps"], "\xd1" => [18, "ps"], "\xd2" => [77, "pt"], "\xd3" => [18, "pt"], "\xd4" => [0, "p "], "\xd5" => [0, "p%"], "\xd6" => [0, "p-"], "\xd7" => [0, "p."], "\xd8" => [0, "p/"], "\xd9" => [0, "p3"], "\xda" => [0, "p4"], "\xdb" => [0, "p5"], "\xdc" => [0, "p6"], "\xdd" => [0, "p7"], "\xde" => [0, "p8"], "\xdf" => [0, "p9"], "\xe0" => [0, "p="], "\xe1" => [0, "pA"], "\xe2" => [0, "p_"], "\xe3" => [0, "pb"], "\xe4" => [0, "pd"], "\xe5" => [0, "pf"], "\xe6" => [0, "pg"], "\xe7" => [0, "ph"], "\xe8" => [0, "pl"], "\xe9" => [0, "pm"], "\xea" => [0, "pn"], "\xeb" => [0, "pp"], "\xec" => [0, "pr"], "\xed" => [0, "pu"], "\xee" => [100, "p"], "\xef" => [110, "p"], "\xf0" => [111, "p"], "\xf1" => [115, "p"], "\xf2" => [116, "p"], "\xf3" => [118, "p"], "\xf4" => [119, "p"], "\xf5" => [122, "p"], "\xf6" => [123, "p"], "\xf7" => [125, "p"], "\xf8" => [126, "p"], "\xf9" => [129, "p"], "\xfa" => [143, "p"], "\xfb" => [148, "p"], "\xfc" => [151, "p"], "\xfd" => [153, "p"], "\xfe" => [83, "p"], "\xff" => [10, "p"]], ["\x00" => [94, "n0"], "\x01" => [76, "n0"], "\x02" => [104, "n0"], "\x03" => [16, "n0"], "\x04" => [94, "n1"], "\x05" => [76, "n1"], "\x06" => [104, "n1"], "\x07" => [16, "n1"], "\x08" => [94, "n2"], "\t" => [76, "n2"], "\n" => [104, "n2"], "\v" => [16, "n2"], "\f" => [94, "na"], "\r" => [76, "na"], "\x0e" => [104, "na"], "\x0f" => [16, "na"], "\x10" => [94, "nc"], "\x11" => [76, "nc"], "\x12" => [104, "nc"], "\x13" => [16, "nc"], "\x14" => [94, "ne"], "\x15" => [76, "ne"], "\x16" => [104, "ne"], "\x17" => [16, "ne"], "\x18" => [94, "ni"], "\x19" => [76, "ni"], "\x1a" => [104, "ni"], "\x1b" => [16, "ni"], "\x1c" => [94, "no"], "\x1d" => [76, "no"], "\x1e" => [104, "no"], "\x1f" => [16, "no"], " " => [94, "ns"], "!" => [76, "ns"], "\"" => [104, "ns"], "#" => [16, "ns"], "\$" => [94, "nt"], "%" => [76, "nt"], "&" => [104, "nt"], "'" => [16, "nt"], "(" => [77, "n "], ")" => [18, "n "], "*" => [77, "n%"], "+" => [18, "n%"], "," => [77, "n-"], "-" => [18, "n-"], "." => [77, "n."], "/" => [18, "n."], [77, "n/"], [18, "n/"], [77, "n3"], [18, "n3"], [77, "n4"], [18, "n4"], [77, "n5"], [18, "n5"], [77, "n6"], [18, "n6"], ":" => [77, "n7"], ";" => [18, "n7"], "<" => [77, "n8"], "=" => [18, "n8"], ">" => [77, "n9"], "?" => [18, "n9"], "@" => [77, "n="], "A" => [18, "n="], "B" => [77, "nA"], "C" => [18, "nA"], "D" => [77, "n_"], "E" => [18, "n_"], "F" => [77, "nb"], "G" => [18, "nb"], "H" => [77, "nd"], "I" => [18, "nd"], "J" => [77, "nf"], "K" => [18, "nf"], "L" => [77, "ng"], "M" => [18, "ng"], "N" => [77, "nh"], "O" => [18, "nh"], "P" => [77, "nl"], "Q" => [18, "nl"], "R" => [77, "nm"], "S" => [18, "nm"], "T" => [77, "nn"], "U" => [18, "nn"], "V" => [77, "np"], "W" => [18, "np"], "X" => [77, "nr"], "Y" => [18, "nr"], "Z" => [77, "nu"], "[" => [18, "nu"], "\\" => [0, "n:"], "]" => [0, "nB"], "^" => [0, "nC"], "_" => [0, "nD"], "`" => [0, "nE"], "a" => [0, "nF"], "b" => [0, "nG"], "c" => [0, "nH"], "d" => [0, "nI"], "e" => [0, "nJ"], "f" => [0, "nK"], "g" => [0, "nL"], "h" => [0, "nM"], "i" => [0, "nN"], "j" => [0, "nO"], "k" => [0, "nP"], "l" => [0, "nQ"], "m" => [0, "nR"], "n" => [0, "nS"], "o" => [0, "nT"], "p" => [0, "nU"], "q" => [0, "nV"], "r" => [0, "nW"], "s" => [0, "nY"], "t" => [0, "nj"], "u" => [0, "nk"], "v" => [0, "nq"], "w" => [0, "nv"], "x" => [0, "nw"], "y" => [0, "nx"], "z" => [0, "ny"], "{" => [0, "nz"], "|" => [82, "n"], "}" => [87, "n"], "~" => [130, "n"], "" => [9, "n"], "\x80" => [94, "p0"], "\x81" => [76, "p0"], "\x82" => [104, "p0"], "\x83" => [16, "p0"], "\x84" => [94, "p1"], "\x85" => [76, "p1"], "\x86" => [104, "p1"], "\x87" => [16, "p1"], "\x88" => [94, "p2"], "\x89" => [76, "p2"], "\x8a" => [104, "p2"], "\x8b" => [16, "p2"], "\x8c" => [94, "pa"], "\x8d" => [76, "pa"], "\x8e" => [104, "pa"], "\x8f" => [16, "pa"], "\x90" => [94, "pc"], "\x91" => [76, "pc"], "\x92" => [104, "pc"], "\x93" => [16, "pc"], "\x94" => [94, "pe"], "\x95" => [76, "pe"], "\x96" => [104, "pe"], "\x97" => [16, "pe"], "\x98" => [94, "pi"], "\x99" => [76, "pi"], "\x9a" => [104, "pi"], "\x9b" => [16, "pi"], "\x9c" => [94, "po"], "\x9d" => [76, "po"], "\x9e" => [104, "po"], "\x9f" => [16, "po"], "\xa0" => [94, "ps"], "\xa1" => [76, "ps"], "\xa2" => [104, "ps"], "\xa3" => [16, "ps"], "\xa4" => [94, "pt"], "\xa5" => [76, "pt"], "\xa6" => [104, "pt"], "\xa7" => [16, "pt"], "\xa8" => [77, "p "], "\xa9" => [18, "p "], "\xaa" => [77, "p%"], "\xab" => [18, "p%"], "\xac" => [77, "p-"], "\xad" => [18, "p-"], "\xae" => [77, "p."], "\xaf" => [18, "p."], "\xb0" => [77, "p/"], "\xb1" => [18, "p/"], "\xb2" => [77, "p3"], "\xb3" => [18, "p3"], "\xb4" => [77, "p4"], "\xb5" => [18, "p4"], "\xb6" => [77, "p5"], "\xb7" => [18, "p5"], "\xb8" => [77, "p6"], "\xb9" => [18, "p6"], "\xba" => [77, "p7"], "\xbb" => [18, "p7"], "\xbc" => [77, "p8"], "\xbd" => [18, "p8"], "\xbe" => [77, "p9"], "\xbf" => [18, "p9"], "\xc0" => [77, "p="], "\xc1" => [18, "p="], "\xc2" => [77, "pA"], "\xc3" => [18, "pA"], "\xc4" => [77, "p_"], "\xc5" => [18, "p_"], "\xc6" => [77, "pb"], "\xc7" => [18, "pb"], "\xc8" => [77, "pd"], "\xc9" => [18, "pd"], "\xca" => [77, "pf"], "\xcb" => [18, "pf"], "\xcc" => [77, "pg"], "\xcd" => [18, "pg"], "\xce" => [77, "ph"], "\xcf" => [18, "ph"], "\xd0" => [77, "pl"], "\xd1" => [18, "pl"], "\xd2" => [77, "pm"], "\xd3" => [18, "pm"], "\xd4" => [77, "pn"], "\xd5" => [18, "pn"], "\xd6" => [77, "pp"], "\xd7" => [18, "pp"], "\xd8" => [77, "pr"], "\xd9" => [18, "pr"], "\xda" => [77, "pu"], "\xdb" => [18, "pu"], "\xdc" => [0, "p:"], "\xdd" => [0, "pB"], "\xde" => [0, "pC"], "\xdf" => [0, "pD"], "\xe0" => [0, "pE"], "\xe1" => [0, "pF"], "\xe2" => [0, "pG"], "\xe3" => [0, "pH"], "\xe4" => [0, "pI"], "\xe5" => [0, "pJ"], "\xe6" => [0, "pK"], "\xe7" => [0, "pL"], "\xe8" => [0, "pM"], "\xe9" => [0, "pN"], "\xea" => [0, "pO"], "\xeb" => [0, "pP"], "\xec" => [0, "pQ"], "\xed" => [0, "pR"], "\xee" => [0, "pS"], "\xef" => [0, "pT"], "\xf0" => [0, "pU"], "\xf1" => [0, "pV"], "\xf2" => [0, "pW"], "\xf3" => [0, "pY"], "\xf4" => [0, "pj"], "\xf5" => [0, "pk"], "\xf6" => [0, "pq"], "\xf7" => [0, "pv"], "\xf8" => [0, "pw"], "\xf9" => [0, "px"], "\xfa" => [0, "py"], "\xfb" => [0, "pz"], "\xfc" => [82, "p"], "\xfd" => [87, "p"], "\xfe" => [130, "p"], "\xff" => [9, "p"]], ["\x00" => [94, "q0"], "\x01" => [76, "q0"], "\x02" => [104, "q0"], "\x03" => [16, "q0"], "\x04" => [94, "q1"], "\x05" => [76, "q1"], "\x06" => [104, "q1"], "\x07" => [16, "q1"], "\x08" => [94, "q2"], "\t" => [76, "q2"], "\n" => [104, "q2"], "\v" => [16, "q2"], "\f" => [94, "qa"], "\r" => [76, "qa"], "\x0e" => [104, "qa"], "\x0f" => [16, "qa"], "\x10" => [94, "qc"], "\x11" => [76, "qc"], "\x12" => [104, "qc"], "\x13" => [16, "qc"], "\x14" => [94, "qe"], "\x15" => [76, "qe"], "\x16" => [104, "qe"], "\x17" => [16, "qe"], "\x18" => [94, "qi"], "\x19" => [76, "qi"], "\x1a" => [104, "qi"], "\x1b" => [16, "qi"], "\x1c" => [94, "qo"], "\x1d" => [76, "qo"], "\x1e" => [104, "qo"], "\x1f" => [16, "qo"], " " => [94, "qs"], "!" => [76, "qs"], "\"" => [104, "qs"], "#" => [16, "qs"], "\$" => [94, "qt"], "%" => [76, "qt"], "&" => [104, "qt"], "'" => [16, "qt"], "(" => [77, "q "], ")" => [18, "q "], "*" => [77, "q%"], "+" => [18, "q%"], "," => [77, "q-"], "-" => [18, "q-"], "." => [77, "q."], "/" => [18, "q."], [77, "q/"], [18, "q/"], [77, "q3"], [18, "q3"], [77, "q4"], [18, "q4"], [77, "q5"], [18, "q5"], [77, "q6"], [18, "q6"], ":" => [77, "q7"], ";" => [18, "q7"], "<" => [77, "q8"], "=" => [18, "q8"], ">" => [77, "q9"], "?" => [18, "q9"], "@" => [77, "q="], "A" => [18, "q="], "B" => [77, "qA"], "C" => [18, "qA"], "D" => [77, "q_"], "E" => [18, "q_"], "F" => [77, "qb"], "G" => [18, "qb"], "H" => [77, "qd"], "I" => [18, "qd"], "J" => [77, "qf"], "K" => [18, "qf"], "L" => [77, "qg"], "M" => [18, "qg"], "N" => [77, "qh"], "O" => [18, "qh"], "P" => [77, "ql"], "Q" => [18, "ql"], "R" => [77, "qm"], "S" => [18, "qm"], "T" => [77, "qn"], "U" => [18, "qn"], "V" => [77, "qp"], "W" => [18, "qp"], "X" => [77, "qr"], "Y" => [18, "qr"], "Z" => [77, "qu"], "[" => [18, "qu"], "\\" => [0, "q:"], "]" => [0, "qB"], "^" => [0, "qC"], "_" => [0, "qD"], "`" => [0, "qE"], "a" => [0, "qF"], "b" => [0, "qG"], "c" => [0, "qH"], "d" => [0, "qI"], "e" => [0, "qJ"], "f" => [0, "qK"], "g" => [0, "qL"], "h" => [0, "qM"], "i" => [0, "qN"], "j" => [0, "qO"], "k" => [0, "qP"], "l" => [0, "qQ"], "m" => [0, "qR"], "n" => [0, "qS"], "o" => [0, "qT"], "p" => [0, "qU"], "q" => [0, "qV"], "r" => [0, "qW"], "s" => [0, "qY"], "t" => [0, "qj"], "u" => [0, "qk"], "v" => [0, "qq"], "w" => [0, "qv"], "x" => [0, "qw"], "y" => [0, "qx"], "z" => [0, "qy"], "{" => [0, "qz"], "|" => [82, "q"], "}" => [87, "q"], "~" => [130, "q"], "" => [9, "q"], "\x80" => [94, "v0"], "\x81" => [76, "v0"], "\x82" => [104, "v0"], "\x83" => [16, "v0"], "\x84" => [94, "v1"], "\x85" => [76, "v1"], "\x86" => [104, "v1"], "\x87" => [16, "v1"], "\x88" => [94, "v2"], "\x89" => [76, "v2"], "\x8a" => [104, "v2"], "\x8b" => [16, "v2"], "\x8c" => [94, "va"], "\x8d" => [76, "va"], "\x8e" => [104, "va"], "\x8f" => [16, "va"], "\x90" => [94, "vc"], "\x91" => [76, "vc"], "\x92" => [104, "vc"], "\x93" => [16, "vc"], "\x94" => [94, "ve"], "\x95" => [76, "ve"], "\x96" => [104, "ve"], "\x97" => [16, "ve"], "\x98" => [94, "vi"], "\x99" => [76, "vi"], "\x9a" => [104, "vi"], "\x9b" => [16, "vi"], "\x9c" => [94, "vo"], "\x9d" => [76, "vo"], "\x9e" => [104, "vo"], "\x9f" => [16, "vo"], "\xa0" => [94, "vs"], "\xa1" => [76, "vs"], "\xa2" => [104, "vs"], "\xa3" => [16, "vs"], "\xa4" => [94, "vt"], "\xa5" => [76, "vt"], "\xa6" => [104, "vt"], "\xa7" => [16, "vt"], "\xa8" => [77, "v "], "\xa9" => [18, "v "], "\xaa" => [77, "v%"], "\xab" => [18, "v%"], "\xac" => [77, "v-"], "\xad" => [18, "v-"], "\xae" => [77, "v."], "\xaf" => [18, "v."], "\xb0" => [77, "v/"], "\xb1" => [18, "v/"], "\xb2" => [77, "v3"], "\xb3" => [18, "v3"], "\xb4" => [77, "v4"], "\xb5" => [18, "v4"], "\xb6" => [77, "v5"], "\xb7" => [18, "v5"], "\xb8" => [77, "v6"], "\xb9" => [18, "v6"], "\xba" => [77, "v7"], "\xbb" => [18, "v7"], "\xbc" => [77, "v8"], "\xbd" => [18, "v8"], "\xbe" => [77, "v9"], "\xbf" => [18, "v9"], "\xc0" => [77, "v="], "\xc1" => [18, "v="], "\xc2" => [77, "vA"], "\xc3" => [18, "vA"], "\xc4" => [77, "v_"], "\xc5" => [18, "v_"], "\xc6" => [77, "vb"], "\xc7" => [18, "vb"], "\xc8" => [77, "vd"], "\xc9" => [18, "vd"], "\xca" => [77, "vf"], "\xcb" => [18, "vf"], "\xcc" => [77, "vg"], "\xcd" => [18, "vg"], "\xce" => [77, "vh"], "\xcf" => [18, "vh"], "\xd0" => [77, "vl"], "\xd1" => [18, "vl"], "\xd2" => [77, "vm"], "\xd3" => [18, "vm"], "\xd4" => [77, "vn"], "\xd5" => [18, "vn"], "\xd6" => [77, "vp"], "\xd7" => [18, "vp"], "\xd8" => [77, "vr"], "\xd9" => [18, "vr"], "\xda" => [77, "vu"], "\xdb" => [18, "vu"], "\xdc" => [0, "v:"], "\xdd" => [0, "vB"], "\xde" => [0, "vC"], "\xdf" => [0, "vD"], "\xe0" => [0, "vE"], "\xe1" => [0, "vF"], "\xe2" => [0, "vG"], "\xe3" => [0, "vH"], "\xe4" => [0, "vI"], "\xe5" => [0, "vJ"], "\xe6" => [0, "vK"], "\xe7" => [0, "vL"], "\xe8" => [0, "vM"], "\xe9" => [0, "vN"], "\xea" => [0, "vO"], "\xeb" => [0, "vP"], "\xec" => [0, "vQ"], "\xed" => [0, "vR"], "\xee" => [0, "vS"], "\xef" => [0, "vT"], "\xf0" => [0, "vU"], "\xf1" => [0, "vV"], "\xf2" => [0, "vW"], "\xf3" => [0, "vY"], "\xf4" => [0, "vj"], "\xf5" => [0, "vk"], "\xf6" => [0, "vq"], "\xf7" => [0, "vv"], "\xf8" => [0, "vw"], "\xf9" => [0, "vx"], "\xfa" => [0, "vy"], "\xfb" => [0, "vz"], "\xfc" => [82, "v"], "\xfd" => [87, "v"], "\xfe" => [130, "v"], "\xff" => [9, "v"]], ["\x00" => [94, "r0"], "\x01" => [76, "r0"], "\x02" => [104, "r0"], "\x03" => [16, "r0"], "\x04" => [94, "r1"], "\x05" => [76, "r1"], "\x06" => [104, "r1"], "\x07" => [16, "r1"], "\x08" => [94, "r2"], "\t" => [76, "r2"], "\n" => [104, "r2"], "\v" => [16, "r2"], "\f" => [94, "ra"], "\r" => [76, "ra"], "\x0e" => [104, "ra"], "\x0f" => [16, "ra"], "\x10" => [94, "rc"], "\x11" => [76, "rc"], "\x12" => [104, "rc"], "\x13" => [16, "rc"], "\x14" => [94, "re"], "\x15" => [76, "re"], "\x16" => [104, "re"], "\x17" => [16, "re"], "\x18" => [94, "ri"], "\x19" => [76, "ri"], "\x1a" => [104, "ri"], "\x1b" => [16, "ri"], "\x1c" => [94, "ro"], "\x1d" => [76, "ro"], "\x1e" => [104, "ro"], "\x1f" => [16, "ro"], " " => [94, "rs"], "!" => [76, "rs"], "\"" => [104, "rs"], "#" => [16, "rs"], "\$" => [94, "rt"], "%" => [76, "rt"], "&" => [104, "rt"], "'" => [16, "rt"], "(" => [77, "r "], ")" => [18, "r "], "*" => [77, "r%"], "+" => [18, "r%"], "," => [77, "r-"], "-" => [18, "r-"], "." => [77, "r."], "/" => [18, "r."], [77, "r/"], [18, "r/"], [77, "r3"], [18, "r3"], [77, "r4"], [18, "r4"], [77, "r5"], [18, "r5"], [77, "r6"], [18, "r6"], ":" => [77, "r7"], ";" => [18, "r7"], "<" => [77, "r8"], "=" => [18, "r8"], ">" => [77, "r9"], "?" => [18, "r9"], "@" => [77, "r="], "A" => [18, "r="], "B" => [77, "rA"], "C" => [18, "rA"], "D" => [77, "r_"], "E" => [18, "r_"], "F" => [77, "rb"], "G" => [18, "rb"], "H" => [77, "rd"], "I" => [18, "rd"], "J" => [77, "rf"], "K" => [18, "rf"], "L" => [77, "rg"], "M" => [18, "rg"], "N" => [77, "rh"], "O" => [18, "rh"], "P" => [77, "rl"], "Q" => [18, "rl"], "R" => [77, "rm"], "S" => [18, "rm"], "T" => [77, "rn"], "U" => [18, "rn"], "V" => [77, "rp"], "W" => [18, "rp"], "X" => [77, "rr"], "Y" => [18, "rr"], "Z" => [77, "ru"], "[" => [18, "ru"], "\\" => [0, "r:"], "]" => [0, "rB"], "^" => [0, "rC"], "_" => [0, "rD"], "`" => [0, "rE"], "a" => [0, "rF"], "b" => [0, "rG"], "c" => [0, "rH"], "d" => [0, "rI"], "e" => [0, "rJ"], "f" => [0, "rK"], "g" => [0, "rL"], "h" => [0, "rM"], "i" => [0, "rN"], "j" => [0, "rO"], "k" => [0, "rP"], "l" => [0, "rQ"], "m" => [0, "rR"], "n" => [0, "rS"], "o" => [0, "rT"], "p" => [0, "rU"], "q" => [0, "rV"], "r" => [0, "rW"], "s" => [0, "rY"], "t" => [0, "rj"], "u" => [0, "rk"], "v" => [0, "rq"], "w" => [0, "rv"], "x" => [0, "rw"], "y" => [0, "rx"], "z" => [0, "ry"], "{" => [0, "rz"], "|" => [82, "r"], "}" => [87, "r"], "~" => [130, "r"], "" => [9, "r"], "\x80" => [94, "u0"], "\x81" => [76, "u0"], "\x82" => [104, "u0"], "\x83" => [16, "u0"], "\x84" => [94, "u1"], "\x85" => [76, "u1"], "\x86" => [104, "u1"], "\x87" => [16, "u1"], "\x88" => [94, "u2"], "\x89" => [76, "u2"], "\x8a" => [104, "u2"], "\x8b" => [16, "u2"], "\x8c" => [94, "ua"], "\x8d" => [76, "ua"], "\x8e" => [104, "ua"], "\x8f" => [16, "ua"], "\x90" => [94, "uc"], "\x91" => [76, "uc"], "\x92" => [104, "uc"], "\x93" => [16, "uc"], "\x94" => [94, "ue"], "\x95" => [76, "ue"], "\x96" => [104, "ue"], "\x97" => [16, "ue"], "\x98" => [94, "ui"], "\x99" => [76, "ui"], "\x9a" => [104, "ui"], "\x9b" => [16, "ui"], "\x9c" => [94, "uo"], "\x9d" => [76, "uo"], "\x9e" => [104, "uo"], "\x9f" => [16, "uo"], "\xa0" => [94, "us"], "\xa1" => [76, "us"], "\xa2" => [104, "us"], "\xa3" => [16, "us"], "\xa4" => [94, "ut"], "\xa5" => [76, "ut"], "\xa6" => [104, "ut"], "\xa7" => [16, "ut"], "\xa8" => [77, "u "], "\xa9" => [18, "u "], "\xaa" => [77, "u%"], "\xab" => [18, "u%"], "\xac" => [77, "u-"], "\xad" => [18, "u-"], "\xae" => [77, "u."], "\xaf" => [18, "u."], "\xb0" => [77, "u/"], "\xb1" => [18, "u/"], "\xb2" => [77, "u3"], "\xb3" => [18, "u3"], "\xb4" => [77, "u4"], "\xb5" => [18, "u4"], "\xb6" => [77, "u5"], "\xb7" => [18, "u5"], "\xb8" => [77, "u6"], "\xb9" => [18, "u6"], "\xba" => [77, "u7"], "\xbb" => [18, "u7"], "\xbc" => [77, "u8"], "\xbd" => [18, "u8"], "\xbe" => [77, "u9"], "\xbf" => [18, "u9"], "\xc0" => [77, "u="], "\xc1" => [18, "u="], "\xc2" => [77, "uA"], "\xc3" => [18, "uA"], "\xc4" => [77, "u_"], "\xc5" => [18, "u_"], "\xc6" => [77, "ub"], "\xc7" => [18, "ub"], "\xc8" => [77, "ud"], "\xc9" => [18, "ud"], "\xca" => [77, "uf"], "\xcb" => [18, "uf"], "\xcc" => [77, "ug"], "\xcd" => [18, "ug"], "\xce" => [77, "uh"], "\xcf" => [18, "uh"], "\xd0" => [77, "ul"], "\xd1" => [18, "ul"], "\xd2" => [77, "um"], "\xd3" => [18, "um"], "\xd4" => [77, "un"], "\xd5" => [18, "un"], "\xd6" => [77, "up"], "\xd7" => [18, "up"], "\xd8" => [77, "ur"], "\xd9" => [18, "ur"], "\xda" => [77, "uu"], "\xdb" => [18, "uu"], "\xdc" => [0, "u:"], "\xdd" => [0, "uB"], "\xde" => [0, "uC"], "\xdf" => [0, "uD"], "\xe0" => [0, "uE"], "\xe1" => [0, "uF"], "\xe2" => [0, "uG"], "\xe3" => [0, "uH"], "\xe4" => [0, "uI"], "\xe5" => [0, "uJ"], "\xe6" => [0, "uK"], "\xe7" => [0, "uL"], "\xe8" => [0, "uM"], "\xe9" => [0, "uN"], "\xea" => [0, "uO"], "\xeb" => [0, "uP"], "\xec" => [0, "uQ"], "\xed" => [0, "uR"], "\xee" => [0, "uS"], "\xef" => [0, "uT"], "\xf0" => [0, "uU"], "\xf1" => [0, "uV"], "\xf2" => [0, "uW"], "\xf3" => [0, "uY"], "\xf4" => [0, "uj"], "\xf5" => [0, "uk"], "\xf6" => [0, "uq"], "\xf7" => [0, "uv"], "\xf8" => [0, "uw"], "\xf9" => [0, "ux"], "\xfa" => [0, "uy"], "\xfb" => [0, "uz"], "\xfc" => [82, "u"], "\xfd" => [87, "u"], "\xfe" => [130, "u"], "\xff" => [9, "u"]], ["\x00" => [94, "s0"], "\x01" => [76, "s0"], "\x02" => [104, "s0"], "\x03" => [16, "s0"], "\x04" => [94, "s1"], "\x05" => [76, "s1"], "\x06" => [104, "s1"], "\x07" => [16, "s1"], "\x08" => [94, "s2"], "\t" => [76, "s2"], "\n" => [104, "s2"], "\v" => [16, "s2"], "\f" => [94, "sa"], "\r" => [76, "sa"], "\x0e" => [104, "sa"], "\x0f" => [16, "sa"], "\x10" => [94, "sc"], "\x11" => [76, "sc"], "\x12" => [104, "sc"], "\x13" => [16, "sc"], "\x14" => [94, "se"], "\x15" => [76, "se"], "\x16" => [104, "se"], "\x17" => [16, "se"], "\x18" => [94, "si"], "\x19" => [76, "si"], "\x1a" => [104, "si"], "\x1b" => [16, "si"], "\x1c" => [94, "so"], "\x1d" => [76, "so"], "\x1e" => [104, "so"], "\x1f" => [16, "so"], " " => [94, "ss"], "!" => [76, "ss"], "\"" => [104, "ss"], "#" => [16, "ss"], "\$" => [94, "st"], "%" => [76, "st"], "&" => [104, "st"], "'" => [16, "st"], "(" => [77, "s "], ")" => [18, "s "], "*" => [77, "s%"], "+" => [18, "s%"], "," => [77, "s-"], "-" => [18, "s-"], "." => [77, "s."], "/" => [18, "s."], [77, "s/"], [18, "s/"], [77, "s3"], [18, "s3"], [77, "s4"], [18, "s4"], [77, "s5"], [18, "s5"], [77, "s6"], [18, "s6"], ":" => [77, "s7"], ";" => [18, "s7"], "<" => [77, "s8"], "=" => [18, "s8"], ">" => [77, "s9"], "?" => [18, "s9"], "@" => [77, "s="], "A" => [18, "s="], "B" => [77, "sA"], "C" => [18, "sA"], "D" => [77, "s_"], "E" => [18, "s_"], "F" => [77, "sb"], "G" => [18, "sb"], "H" => [77, "sd"], "I" => [18, "sd"], "J" => [77, "sf"], "K" => [18, "sf"], "L" => [77, "sg"], "M" => [18, "sg"], "N" => [77, "sh"], "O" => [18, "sh"], "P" => [77, "sl"], "Q" => [18, "sl"], "R" => [77, "sm"], "S" => [18, "sm"], "T" => [77, "sn"], "U" => [18, "sn"], "V" => [77, "sp"], "W" => [18, "sp"], "X" => [77, "sr"], "Y" => [18, "sr"], "Z" => [77, "su"], "[" => [18, "su"], "\\" => [0, "s:"], "]" => [0, "sB"], "^" => [0, "sC"], "_" => [0, "sD"], "`" => [0, "sE"], "a" => [0, "sF"], "b" => [0, "sG"], "c" => [0, "sH"], "d" => [0, "sI"], "e" => [0, "sJ"], "f" => [0, "sK"], "g" => [0, "sL"], "h" => [0, "sM"], "i" => [0, "sN"], "j" => [0, "sO"], "k" => [0, "sP"], "l" => [0, "sQ"], "m" => [0, "sR"], "n" => [0, "sS"], "o" => [0, "sT"], "p" => [0, "sU"], "q" => [0, "sV"], "r" => [0, "sW"], "s" => [0, "sY"], "t" => [0, "sj"], "u" => [0, "sk"], "v" => [0, "sq"], "w" => [0, "sv"], "x" => [0, "sw"], "y" => [0, "sx"], "z" => [0, "sy"], "{" => [0, "sz"], "|" => [82, "s"], "}" => [87, "s"], "~" => [130, "s"], "" => [9, "s"], "\x80" => [94, "t0"], "\x81" => [76, "t0"], "\x82" => [104, "t0"], "\x83" => [16, "t0"], "\x84" => [94, "t1"], "\x85" => [76, "t1"], "\x86" => [104, "t1"], "\x87" => [16, "t1"], "\x88" => [94, "t2"], "\x89" => [76, "t2"], "\x8a" => [104, "t2"], "\x8b" => [16, "t2"], "\x8c" => [94, "ta"], "\x8d" => [76, "ta"], "\x8e" => [104, "ta"], "\x8f" => [16, "ta"], "\x90" => [94, "tc"], "\x91" => [76, "tc"], "\x92" => [104, "tc"], "\x93" => [16, "tc"], "\x94" => [94, "te"], "\x95" => [76, "te"], "\x96" => [104, "te"], "\x97" => [16, "te"], "\x98" => [94, "ti"], "\x99" => [76, "ti"], "\x9a" => [104, "ti"], "\x9b" => [16, "ti"], "\x9c" => [94, "to"], "\x9d" => [76, "to"], "\x9e" => [104, "to"], "\x9f" => [16, "to"], "\xa0" => [94, "ts"], "\xa1" => [76, "ts"], "\xa2" => [104, "ts"], "\xa3" => [16, "ts"], "\xa4" => [94, "tt"], "\xa5" => [76, "tt"], "\xa6" => [104, "tt"], "\xa7" => [16, "tt"], "\xa8" => [77, "t "], "\xa9" => [18, "t "], "\xaa" => [77, "t%"], "\xab" => [18, "t%"], "\xac" => [77, "t-"], "\xad" => [18, "t-"], "\xae" => [77, "t."], "\xaf" => [18, "t."], "\xb0" => [77, "t/"], "\xb1" => [18, "t/"], "\xb2" => [77, "t3"], "\xb3" => [18, "t3"], "\xb4" => [77, "t4"], "\xb5" => [18, "t4"], "\xb6" => [77, "t5"], "\xb7" => [18, "t5"], "\xb8" => [77, "t6"], "\xb9" => [18, "t6"], "\xba" => [77, "t7"], "\xbb" => [18, "t7"], "\xbc" => [77, "t8"], "\xbd" => [18, "t8"], "\xbe" => [77, "t9"], "\xbf" => [18, "t9"], "\xc0" => [77, "t="], "\xc1" => [18, "t="], "\xc2" => [77, "tA"], "\xc3" => [18, "tA"], "\xc4" => [77, "t_"], "\xc5" => [18, "t_"], "\xc6" => [77, "tb"], "\xc7" => [18, "tb"], "\xc8" => [77, "td"], "\xc9" => [18, "td"], "\xca" => [77, "tf"], "\xcb" => [18, "tf"], "\xcc" => [77, "tg"], "\xcd" => [18, "tg"], "\xce" => [77, "th"], "\xcf" => [18, "th"], "\xd0" => [77, "tl"], "\xd1" => [18, "tl"], "\xd2" => [77, "tm"], "\xd3" => [18, "tm"], "\xd4" => [77, "tn"], "\xd5" => [18, "tn"], "\xd6" => [77, "tp"], "\xd7" => [18, "tp"], "\xd8" => [77, "tr"], "\xd9" => [18, "tr"], "\xda" => [77, "tu"], "\xdb" => [18, "tu"], "\xdc" => [0, "t:"], "\xdd" => [0, "tB"], "\xde" => [0, "tC"], "\xdf" => [0, "tD"], "\xe0" => [0, "tE"], "\xe1" => [0, "tF"], "\xe2" => [0, "tG"], "\xe3" => [0, "tH"], "\xe4" => [0, "tI"], "\xe5" => [0, "tJ"], "\xe6" => [0, "tK"], "\xe7" => [0, "tL"], "\xe8" => [0, "tM"], "\xe9" => [0, "tN"], "\xea" => [0, "tO"], "\xeb" => [0, "tP"], "\xec" => [0, "tQ"], "\xed" => [0, "tR"], "\xee" => [0, "tS"], "\xef" => [0, "tT"], "\xf0" => [0, "tU"], "\xf1" => [0, "tV"], "\xf2" => [0, "tW"], "\xf3" => [0, "tY"], "\xf4" => [0, "tj"], "\xf5" => [0, "tk"], "\xf6" => [0, "tq"], "\xf7" => [0, "tv"], "\xf8" => [0, "tw"], "\xf9" => [0, "tx"], "\xfa" => [0, "ty"], "\xfb" => [0, "tz"], "\xfc" => [82, "t"], "\xfd" => [87, "t"], "\xfe" => [130, "t"], "\xff" => [9, "t"]], ["\x00" => [94, "w0"], "\x01" => [76, "w0"], "\x02" => [104, "w0"], "\x03" => [16, "w0"], "\x04" => [94, "w1"], "\x05" => [76, "w1"], "\x06" => [104, "w1"], "\x07" => [16, "w1"], "\x08" => [94, "w2"], "\t" => [76, "w2"], "\n" => [104, "w2"], "\v" => [16, "w2"], "\f" => [94, "wa"], "\r" => [76, "wa"], "\x0e" => [104, "wa"], "\x0f" => [16, "wa"], "\x10" => [94, "wc"], "\x11" => [76, "wc"], "\x12" => [104, "wc"], "\x13" => [16, "wc"], "\x14" => [94, "we"], "\x15" => [76, "we"], "\x16" => [104, "we"], "\x17" => [16, "we"], "\x18" => [94, "wi"], "\x19" => [76, "wi"], "\x1a" => [104, "wi"], "\x1b" => [16, "wi"], "\x1c" => [94, "wo"], "\x1d" => [76, "wo"], "\x1e" => [104, "wo"], "\x1f" => [16, "wo"], " " => [94, "ws"], "!" => [76, "ws"], "\"" => [104, "ws"], "#" => [16, "ws"], "\$" => [94, "wt"], "%" => [76, "wt"], "&" => [104, "wt"], "'" => [16, "wt"], "(" => [77, "w "], ")" => [18, "w "], "*" => [77, "w%"], "+" => [18, "w%"], "," => [77, "w-"], "-" => [18, "w-"], "." => [77, "w."], "/" => [18, "w."], [77, "w/"], [18, "w/"], [77, "w3"], [18, "w3"], [77, "w4"], [18, "w4"], [77, "w5"], [18, "w5"], [77, "w6"], [18, "w6"], ":" => [77, "w7"], ";" => [18, "w7"], "<" => [77, "w8"], "=" => [18, "w8"], ">" => [77, "w9"], "?" => [18, "w9"], "@" => [77, "w="], "A" => [18, "w="], "B" => [77, "wA"], "C" => [18, "wA"], "D" => [77, "w_"], "E" => [18, "w_"], "F" => [77, "wb"], "G" => [18, "wb"], "H" => [77, "wd"], "I" => [18, "wd"], "J" => [77, "wf"], "K" => [18, "wf"], "L" => [77, "wg"], "M" => [18, "wg"], "N" => [77, "wh"], "O" => [18, "wh"], "P" => [77, "wl"], "Q" => [18, "wl"], "R" => [77, "wm"], "S" => [18, "wm"], "T" => [77, "wn"], "U" => [18, "wn"], "V" => [77, "wp"], "W" => [18, "wp"], "X" => [77, "wr"], "Y" => [18, "wr"], "Z" => [77, "wu"], "[" => [18, "wu"], "\\" => [0, "w:"], "]" => [0, "wB"], "^" => [0, "wC"], "_" => [0, "wD"], "`" => [0, "wE"], "a" => [0, "wF"], "b" => [0, "wG"], "c" => [0, "wH"], "d" => [0, "wI"], "e" => [0, "wJ"], "f" => [0, "wK"], "g" => [0, "wL"], "h" => [0, "wM"], "i" => [0, "wN"], "j" => [0, "wO"], "k" => [0, "wP"], "l" => [0, "wQ"], "m" => [0, "wR"], "n" => [0, "wS"], "o" => [0, "wT"], "p" => [0, "wU"], "q" => [0, "wV"], "r" => [0, "wW"], "s" => [0, "wY"], "t" => [0, "wj"], "u" => [0, "wk"], "v" => [0, "wq"], "w" => [0, "wv"], "x" => [0, "ww"], "y" => [0, "wx"], "z" => [0, "wy"], "{" => [0, "wz"], "|" => [82, "w"], "}" => [87, "w"], "~" => [130, "w"], "" => [9, "w"], "\x80" => [94, "x0"], "\x81" => [76, "x0"], "\x82" => [104, "x0"], "\x83" => [16, "x0"], "\x84" => [94, "x1"], "\x85" => [76, "x1"], "\x86" => [104, "x1"], "\x87" => [16, "x1"], "\x88" => [94, "x2"], "\x89" => [76, "x2"], "\x8a" => [104, "x2"], "\x8b" => [16, "x2"], "\x8c" => [94, "xa"], "\x8d" => [76, "xa"], "\x8e" => [104, "xa"], "\x8f" => [16, "xa"], "\x90" => [94, "xc"], "\x91" => [76, "xc"], "\x92" => [104, "xc"], "\x93" => [16, "xc"], "\x94" => [94, "xe"], "\x95" => [76, "xe"], "\x96" => [104, "xe"], "\x97" => [16, "xe"], "\x98" => [94, "xi"], "\x99" => [76, "xi"], "\x9a" => [104, "xi"], "\x9b" => [16, "xi"], "\x9c" => [94, "xo"], "\x9d" => [76, "xo"], "\x9e" => [104, "xo"], "\x9f" => [16, "xo"], "\xa0" => [94, "xs"], "\xa1" => [76, "xs"], "\xa2" => [104, "xs"], "\xa3" => [16, "xs"], "\xa4" => [94, "xt"], "\xa5" => [76, "xt"], "\xa6" => [104, "xt"], "\xa7" => [16, "xt"], "\xa8" => [77, "x "], "\xa9" => [18, "x "], "\xaa" => [77, "x%"], "\xab" => [18, "x%"], "\xac" => [77, "x-"], "\xad" => [18, "x-"], "\xae" => [77, "x."], "\xaf" => [18, "x."], "\xb0" => [77, "x/"], "\xb1" => [18, "x/"], "\xb2" => [77, "x3"], "\xb3" => [18, "x3"], "\xb4" => [77, "x4"], "\xb5" => [18, "x4"], "\xb6" => [77, "x5"], "\xb7" => [18, "x5"], "\xb8" => [77, "x6"], "\xb9" => [18, "x6"], "\xba" => [77, "x7"], "\xbb" => [18, "x7"], "\xbc" => [77, "x8"], "\xbd" => [18, "x8"], "\xbe" => [77, "x9"], "\xbf" => [18, "x9"], "\xc0" => [77, "x="], "\xc1" => [18, "x="], "\xc2" => [77, "xA"], "\xc3" => [18, "xA"], "\xc4" => [77, "x_"], "\xc5" => [18, "x_"], "\xc6" => [77, "xb"], "\xc7" => [18, "xb"], "\xc8" => [77, "xd"], "\xc9" => [18, "xd"], "\xca" => [77, "xf"], "\xcb" => [18, "xf"], "\xcc" => [77, "xg"], "\xcd" => [18, "xg"], "\xce" => [77, "xh"], "\xcf" => [18, "xh"], "\xd0" => [77, "xl"], "\xd1" => [18, "xl"], "\xd2" => [77, "xm"], "\xd3" => [18, "xm"], "\xd4" => [77, "xn"], "\xd5" => [18, "xn"], "\xd6" => [77, "xp"], "\xd7" => [18, "xp"], "\xd8" => [77, "xr"], "\xd9" => [18, "xr"], "\xda" => [77, "xu"], "\xdb" => [18, "xu"], "\xdc" => [0, "x:"], "\xdd" => [0, "xB"], "\xde" => [0, "xC"], "\xdf" => [0, "xD"], "\xe0" => [0, "xE"], "\xe1" => [0, "xF"], "\xe2" => [0, "xG"], "\xe3" => [0, "xH"], "\xe4" => [0, "xI"], "\xe5" => [0, "xJ"], "\xe6" => [0, "xK"], "\xe7" => [0, "xL"], "\xe8" => [0, "xM"], "\xe9" => [0, "xN"], "\xea" => [0, "xO"], "\xeb" => [0, "xP"], "\xec" => [0, "xQ"], "\xed" => [0, "xR"], "\xee" => [0, "xS"], "\xef" => [0, "xT"], "\xf0" => [0, "xU"], "\xf1" => [0, "xV"], "\xf2" => [0, "xW"], "\xf3" => [0, "xY"], "\xf4" => [0, "xj"], "\xf5" => [0, "xk"], "\xf6" => [0, "xq"], "\xf7" => [0, "xv"], "\xf8" => [0, "xw"], "\xf9" => [0, "xx"], "\xfa" => [0, "xy"], "\xfb" => [0, "xz"], "\xfc" => [82, "x"], "\xfd" => [87, "x"], "\xfe" => [130, "x"], "\xff" => [9, "x"]], ["\x00" => [77, "w0"], "\x01" => [18, "w0"], "\x02" => [77, "w1"], "\x03" => [18, "w1"], "\x04" => [77, "w2"], "\x05" => [18, "w2"], "\x06" => [77, "wa"], "\x07" => [18, "wa"], "\x08" => [77, "wc"], "\t" => [18, "wc"], "\n" => [77, "we"], "\v" => [18, "we"], "\f" => [77, "wi"], "\r" => [18, "wi"], "\x0e" => [77, "wo"], "\x0f" => [18, "wo"], "\x10" => [77, "ws"], "\x11" => [18, "ws"], "\x12" => [77, "wt"], "\x13" => [18, "wt"], "\x14" => [0, "w "], "\x15" => [0, "w%"], "\x16" => [0, "w-"], "\x17" => [0, "w."], "\x18" => [0, "w/"], "\x19" => [0, "w3"], "\x1a" => [0, "w4"], "\x1b" => [0, "w5"], "\x1c" => [0, "w6"], "\x1d" => [0, "w7"], "\x1e" => [0, "w8"], "\x1f" => [0, "w9"], " " => [0, "w="], "!" => [0, "wA"], "\"" => [0, "w_"], "#" => [0, "wb"], "\$" => [0, "wd"], "%" => [0, "wf"], "&" => [0, "wg"], "'" => [0, "wh"], "(" => [0, "wl"], ")" => [0, "wm"], "*" => [0, "wn"], "+" => [0, "wp"], "," => [0, "wr"], "-" => [0, "wu"], "." => [100, "w"], "/" => [110, "w"], [111, "w"], [115, "w"], [116, "w"], [118, "w"], [119, "w"], [122, "w"], [123, "w"], [125, "w"], [126, "w"], [129, "w"], ":" => [143, "w"], ";" => [148, "w"], "<" => [151, "w"], "=" => [153, "w"], ">" => [83, "w"], "?" => [10, "w"], "@" => [77, "x0"], "A" => [18, "x0"], "B" => [77, "x1"], "C" => [18, "x1"], "D" => [77, "x2"], "E" => [18, "x2"], "F" => [77, "xa"], "G" => [18, "xa"], "H" => [77, "xc"], "I" => [18, "xc"], "J" => [77, "xe"], "K" => [18, "xe"], "L" => [77, "xi"], "M" => [18, "xi"], "N" => [77, "xo"], "O" => [18, "xo"], "P" => [77, "xs"], "Q" => [18, "xs"], "R" => [77, "xt"], "S" => [18, "xt"], "T" => [0, "x "], "U" => [0, "x%"], "V" => [0, "x-"], "W" => [0, "x."], "X" => [0, "x/"], "Y" => [0, "x3"], "Z" => [0, "x4"], "[" => [0, "x5"], "\\" => [0, "x6"], "]" => [0, "x7"], "^" => [0, "x8"], "_" => [0, "x9"], "`" => [0, "x="], "a" => [0, "xA"], "b" => [0, "x_"], "c" => [0, "xb"], "d" => [0, "xd"], "e" => [0, "xf"], "f" => [0, "xg"], "g" => [0, "xh"], "h" => [0, "xl"], "i" => [0, "xm"], "j" => [0, "xn"], "k" => [0, "xp"], "l" => [0, "xr"], "m" => [0, "xu"], "n" => [100, "x"], "o" => [110, "x"], "p" => [111, "x"], "q" => [115, "x"], "r" => [116, "x"], "s" => [118, "x"], "t" => [119, "x"], "u" => [122, "x"], "v" => [123, "x"], "w" => [125, "x"], "x" => [126, "x"], "y" => [129, "x"], "z" => [143, "x"], "{" => [148, "x"], "|" => [151, "x"], "}" => [153, "x"], "~" => [83, "x"], "" => [10, "x"], "\x80" => [77, "y0"], "\x81" => [18, "y0"], "\x82" => [77, "y1"], "\x83" => [18, "y1"], "\x84" => [77, "y2"], "\x85" => [18, "y2"], "\x86" => [77, "ya"], "\x87" => [18, "ya"], "\x88" => [77, "yc"], "\x89" => [18, "yc"], "\x8a" => [77, "ye"], "\x8b" => [18, "ye"], "\x8c" => [77, "yi"], "\x8d" => [18, "yi"], "\x8e" => [77, "yo"], "\x8f" => [18, "yo"], "\x90" => [77, "ys"], "\x91" => [18, "ys"], "\x92" => [77, "yt"], "\x93" => [18, "yt"], "\x94" => [0, "y "], "\x95" => [0, "y%"], "\x96" => [0, "y-"], "\x97" => [0, "y."], "\x98" => [0, "y/"], "\x99" => [0, "y3"], "\x9a" => [0, "y4"], "\x9b" => [0, "y5"], "\x9c" => [0, "y6"], "\x9d" => [0, "y7"], "\x9e" => [0, "y8"], "\x9f" => [0, "y9"], "\xa0" => [0, "y="], "\xa1" => [0, "yA"], "\xa2" => [0, "y_"], "\xa3" => [0, "yb"], "\xa4" => [0, "yd"], "\xa5" => [0, "yf"], "\xa6" => [0, "yg"], "\xa7" => [0, "yh"], "\xa8" => [0, "yl"], "\xa9" => [0, "ym"], "\xaa" => [0, "yn"], "\xab" => [0, "yp"], "\xac" => [0, "yr"], "\xad" => [0, "yu"], "\xae" => [100, "y"], "\xaf" => [110, "y"], "\xb0" => [111, "y"], "\xb1" => [115, "y"], "\xb2" => [116, "y"], "\xb3" => [118, "y"], "\xb4" => [119, "y"], "\xb5" => [122, "y"], "\xb6" => [123, "y"], "\xb7" => [125, "y"], "\xb8" => [126, "y"], "\xb9" => [129, "y"], "\xba" => [143, "y"], "\xbb" => [148, "y"], "\xbc" => [151, "y"], "\xbd" => [153, "y"], "\xbe" => [83, "y"], "\xbf" => [10, "y"], "\xc0" => [77, "z0"], "\xc1" => [18, "z0"], "\xc2" => [77, "z1"], "\xc3" => [18, "z1"], "\xc4" => [77, "z2"], "\xc5" => [18, "z2"], "\xc6" => [77, "za"], "\xc7" => [18, "za"], "\xc8" => [77, "zc"], "\xc9" => [18, "zc"], "\xca" => [77, "ze"], "\xcb" => [18, "ze"], "\xcc" => [77, "zi"], "\xcd" => [18, "zi"], "\xce" => [77, "zo"], "\xcf" => [18, "zo"], "\xd0" => [77, "zs"], "\xd1" => [18, "zs"], "\xd2" => [77, "zt"], "\xd3" => [18, "zt"], "\xd4" => [0, "z "], "\xd5" => [0, "z%"], "\xd6" => [0, "z-"], "\xd7" => [0, "z."], "\xd8" => [0, "z/"], "\xd9" => [0, "z3"], "\xda" => [0, "z4"], "\xdb" => [0, "z5"], "\xdc" => [0, "z6"], "\xdd" => [0, "z7"], "\xde" => [0, "z8"], "\xdf" => [0, "z9"], "\xe0" => [0, "z="], "\xe1" => [0, "zA"], "\xe2" => [0, "z_"], "\xe3" => [0, "zb"], "\xe4" => [0, "zd"], "\xe5" => [0, "zf"], "\xe6" => [0, "zg"], "\xe7" => [0, "zh"], "\xe8" => [0, "zl"], "\xe9" => [0, "zm"], "\xea" => [0, "zn"], "\xeb" => [0, "zp"], "\xec" => [0, "zr"], "\xed" => [0, "zu"], "\xee" => [100, "z"], "\xef" => [110, "z"], "\xf0" => [111, "z"], "\xf1" => [115, "z"], "\xf2" => [116, "z"], "\xf3" => [118, "z"], "\xf4" => [119, "z"], "\xf5" => [122, "z"], "\xf6" => [123, "z"], "\xf7" => [125, "z"], "\xf8" => [126, "z"], "\xf9" => [129, "z"], "\xfa" => [143, "z"], "\xfb" => [148, "z"], "\xfc" => [151, "z"], "\xfd" => [153, "z"], "\xfe" => [83, "z"], "\xff" => [10, "z"]], ["\x00" => [94, "y0"], "\x01" => [76, "y0"], "\x02" => [104, "y0"], "\x03" => [16, "y0"], "\x04" => [94, "y1"], "\x05" => [76, "y1"], "\x06" => [104, "y1"], "\x07" => [16, "y1"], "\x08" => [94, "y2"], "\t" => [76, "y2"], "\n" => [104, "y2"], "\v" => [16, "y2"], "\f" => [94, "ya"], "\r" => [76, "ya"], "\x0e" => [104, "ya"], "\x0f" => [16, "ya"], "\x10" => [94, "yc"], "\x11" => [76, "yc"], "\x12" => [104, "yc"], "\x13" => [16, "yc"], "\x14" => [94, "ye"], "\x15" => [76, "ye"], "\x16" => [104, "ye"], "\x17" => [16, "ye"], "\x18" => [94, "yi"], "\x19" => [76, "yi"], "\x1a" => [104, "yi"], "\x1b" => [16, "yi"], "\x1c" => [94, "yo"], "\x1d" => [76, "yo"], "\x1e" => [104, "yo"], "\x1f" => [16, "yo"], " " => [94, "ys"], "!" => [76, "ys"], "\"" => [104, "ys"], "#" => [16, "ys"], "\$" => [94, "yt"], "%" => [76, "yt"], "&" => [104, "yt"], "'" => [16, "yt"], "(" => [77, "y "], ")" => [18, "y "], "*" => [77, "y%"], "+" => [18, "y%"], "," => [77, "y-"], "-" => [18, "y-"], "." => [77, "y."], "/" => [18, "y."], [77, "y/"], [18, "y/"], [77, "y3"], [18, "y3"], [77, "y4"], [18, "y4"], [77, "y5"], [18, "y5"], [77, "y6"], [18, "y6"], ":" => [77, "y7"], ";" => [18, "y7"], "<" => [77, "y8"], "=" => [18, "y8"], ">" => [77, "y9"], "?" => [18, "y9"], "@" => [77, "y="], "A" => [18, "y="], "B" => [77, "yA"], "C" => [18, "yA"], "D" => [77, "y_"], "E" => [18, "y_"], "F" => [77, "yb"], "G" => [18, "yb"], "H" => [77, "yd"], "I" => [18, "yd"], "J" => [77, "yf"], "K" => [18, "yf"], "L" => [77, "yg"], "M" => [18, "yg"], "N" => [77, "yh"], "O" => [18, "yh"], "P" => [77, "yl"], "Q" => [18, "yl"], "R" => [77, "ym"], "S" => [18, "ym"], "T" => [77, "yn"], "U" => [18, "yn"], "V" => [77, "yp"], "W" => [18, "yp"], "X" => [77, "yr"], "Y" => [18, "yr"], "Z" => [77, "yu"], "[" => [18, "yu"], "\\" => [0, "y:"], "]" => [0, "yB"], "^" => [0, "yC"], "_" => [0, "yD"], "`" => [0, "yE"], "a" => [0, "yF"], "b" => [0, "yG"], "c" => [0, "yH"], "d" => [0, "yI"], "e" => [0, "yJ"], "f" => [0, "yK"], "g" => [0, "yL"], "h" => [0, "yM"], "i" => [0, "yN"], "j" => [0, "yO"], "k" => [0, "yP"], "l" => [0, "yQ"], "m" => [0, "yR"], "n" => [0, "yS"], "o" => [0, "yT"], "p" => [0, "yU"], "q" => [0, "yV"], "r" => [0, "yW"], "s" => [0, "yY"], "t" => [0, "yj"], "u" => [0, "yk"], "v" => [0, "yq"], "w" => [0, "yv"], "x" => [0, "yw"], "y" => [0, "yx"], "z" => [0, "yy"], "{" => [0, "yz"], "|" => [82, "y"], "}" => [87, "y"], "~" => [130, "y"], "" => [9, "y"], "\x80" => [94, "z0"], "\x81" => [76, "z0"], "\x82" => [104, "z0"], "\x83" => [16, "z0"], "\x84" => [94, "z1"], "\x85" => [76, "z1"], "\x86" => [104, "z1"], "\x87" => [16, "z1"], "\x88" => [94, "z2"], "\x89" => [76, "z2"], "\x8a" => [104, "z2"], "\x8b" => [16, "z2"], "\x8c" => [94, "za"], "\x8d" => [76, "za"], "\x8e" => [104, "za"], "\x8f" => [16, "za"], "\x90" => [94, "zc"], "\x91" => [76, "zc"], "\x92" => [104, "zc"], "\x93" => [16, "zc"], "\x94" => [94, "ze"], "\x95" => [76, "ze"], "\x96" => [104, "ze"], "\x97" => [16, "ze"], "\x98" => [94, "zi"], "\x99" => [76, "zi"], "\x9a" => [104, "zi"], "\x9b" => [16, "zi"], "\x9c" => [94, "zo"], "\x9d" => [76, "zo"], "\x9e" => [104, "zo"], "\x9f" => [16, "zo"], "\xa0" => [94, "zs"], "\xa1" => [76, "zs"], "\xa2" => [104, "zs"], "\xa3" => [16, "zs"], "\xa4" => [94, "zt"], "\xa5" => [76, "zt"], "\xa6" => [104, "zt"], "\xa7" => [16, "zt"], "\xa8" => [77, "z "], "\xa9" => [18, "z "], "\xaa" => [77, "z%"], "\xab" => [18, "z%"], "\xac" => [77, "z-"], "\xad" => [18, "z-"], "\xae" => [77, "z."], "\xaf" => [18, "z."], "\xb0" => [77, "z/"], "\xb1" => [18, "z/"], "\xb2" => [77, "z3"], "\xb3" => [18, "z3"], "\xb4" => [77, "z4"], "\xb5" => [18, "z4"], "\xb6" => [77, "z5"], "\xb7" => [18, "z5"], "\xb8" => [77, "z6"], "\xb9" => [18, "z6"], "\xba" => [77, "z7"], "\xbb" => [18, "z7"], "\xbc" => [77, "z8"], "\xbd" => [18, "z8"], "\xbe" => [77, "z9"], "\xbf" => [18, "z9"], "\xc0" => [77, "z="], "\xc1" => [18, "z="], "\xc2" => [77, "zA"], "\xc3" => [18, "zA"], "\xc4" => [77, "z_"], "\xc5" => [18, "z_"], "\xc6" => [77, "zb"], "\xc7" => [18, "zb"], "\xc8" => [77, "zd"], "\xc9" => [18, "zd"], "\xca" => [77, "zf"], "\xcb" => [18, "zf"], "\xcc" => [77, "zg"], "\xcd" => [18, "zg"], "\xce" => [77, "zh"], "\xcf" => [18, "zh"], "\xd0" => [77, "zl"], "\xd1" => [18, "zl"], "\xd2" => [77, "zm"], "\xd3" => [18, "zm"], "\xd4" => [77, "zn"], "\xd5" => [18, "zn"], "\xd6" => [77, "zp"], "\xd7" => [18, "zp"], "\xd8" => [77, "zr"], "\xd9" => [18, "zr"], "\xda" => [77, "zu"], "\xdb" => [18, "zu"], "\xdc" => [0, "z:"], "\xdd" => [0, "zB"], "\xde" => [0, "zC"], "\xdf" => [0, "zD"], "\xe0" => [0, "zE"], "\xe1" => [0, "zF"], "\xe2" => [0, "zG"], "\xe3" => [0, "zH"], "\xe4" => [0, "zI"], "\xe5" => [0, "zJ"], "\xe6" => [0, "zK"], "\xe7" => [0, "zL"], "\xe8" => [0, "zM"], "\xe9" => [0, "zN"], "\xea" => [0, "zO"], "\xeb" => [0, "zP"], "\xec" => [0, "zQ"], "\xed" => [0, "zR"], "\xee" => [0, "zS"], "\xef" => [0, "zT"], "\xf0" => [0, "zU"], "\xf1" => [0, "zV"], "\xf2" => [0, "zW"], "\xf3" => [0, "zY"], "\xf4" => [0, "zj"], "\xf5" => [0, "zk"], "\xf6" => [0, "zq"], "\xf7" => [0, "zv"], "\xf8" => [0, "zw"], "\xf9" => [0, "zx"], "\xfa" => [0, "zy"], "\xfb" => [0, "zz"], "\xfc" => [82, "z"], "\xfd" => [87, "z"], "\xfe" => [130, "z"], "\xff" => [9, "z"]], ["\x00" => [94, "0"], "\x01" => [76, "0"], "\x02" => [104, "0"], "\x03" => [16, "0"], "\x04" => [94, "1"], "\x05" => [76, "1"], "\x06" => [104, "1"], "\x07" => [16, "1"], "\x08" => [94, "2"], "\t" => [76, "2"], "\n" => [104, "2"], "\v" => [16, "2"], "\f" => [94, "a"], "\r" => [76, "a"], "\x0e" => [104, "a"], "\x0f" => [16, "a"], "\x10" => [94, "c"], "\x11" => [76, "c"], "\x12" => [104, "c"], "\x13" => [16, "c"], "\x14" => [94, "e"], "\x15" => [76, "e"], "\x16" => [104, "e"], "\x17" => [16, "e"], "\x18" => [94, "i"], "\x19" => [76, "i"], "\x1a" => [104, "i"], "\x1b" => [16, "i"], "\x1c" => [94, "o"], "\x1d" => [76, "o"], "\x1e" => [104, "o"], "\x1f" => [16, "o"], " " => [94, "s"], "!" => [76, "s"], "\"" => [104, "s"], "#" => [16, "s"], "\$" => [94, "t"], "%" => [76, "t"], "&" => [104, "t"], "'" => [16, "t"], "(" => [77, " "], ")" => [18, " "], "*" => [77, "%"], "+" => [18, "%"], "," => [77, "-"], "-" => [18, "-"], "." => [77, "."], "/" => [18, "."], [77, "/"], [18, "/"], [77, "3"], [18, "3"], [77, "4"], [18, "4"], [77, "5"], [18, "5"], [77, "6"], [18, "6"], ":" => [77, "7"], ";" => [18, "7"], "<" => [77, "8"], "=" => [18, "8"], ">" => [77, "9"], "?" => [18, "9"], "@" => [77, "="], "A" => [18, "="], "B" => [77, "A"], "C" => [18, "A"], "D" => [77, "_"], "E" => [18, "_"], "F" => [77, "b"], "G" => [18, "b"], "H" => [77, "d"], "I" => [18, "d"], "J" => [77, "f"], "K" => [18, "f"], "L" => [77, "g"], "M" => [18, "g"], "N" => [77, "h"], "O" => [18, "h"], "P" => [77, "l"], "Q" => [18, "l"], "R" => [77, "m"], "S" => [18, "m"], "T" => [77, "n"], "U" => [18, "n"], "V" => [77, "p"], "W" => [18, "p"], "X" => [77, "r"], "Y" => [18, "r"], "Z" => [77, "u"], "[" => [18, "u"], "\\" => [0, ":"], "]" => [0, "B"], "^" => [0, "C"], "_" => [0, "D"], "`" => [0, "E"], "a" => [0, "F"], "b" => [0, "G"], "c" => [0, "H"], "d" => [0, "I"], "e" => [0, "J"], "f" => [0, "K"], "g" => [0, "L"], "h" => [0, "M"], "i" => [0, "N"], "j" => [0, "O"], "k" => [0, "P"], "l" => [0, "Q"], "m" => [0, "R"], "n" => [0, "S"], "o" => [0, "T"], "p" => [0, "U"], "q" => [0, "V"], "r" => [0, "W"], "s" => [0, "Y"], "t" => [0, "j"], "u" => [0, "k"], "v" => [0, "q"], "w" => [0, "v"], "x" => [0, "w"], "y" => [0, "x"], "z" => [0, "y"], "{" => [0, "z"], "|" => [82, ""], "}" => [87, ""], "~" => [130, ""], "" => [9, ""], "\x80" => [94, "\xdc0"], "\x81" => [76, "\xdc0"], "\x82" => [104, "\xdc0"], "\x83" => [16, "\xdc0"], "\x84" => [94, "\xdc1"], "\x85" => [76, "\xdc1"], "\x86" => [104, "\xdc1"], "\x87" => [16, "\xdc1"], "\x88" => [94, "\xdc2"], "\x89" => [76, "\xdc2"], "\x8a" => [104, "\xdc2"], "\x8b" => [16, "\xdc2"], "\x8c" => [94, "\xdca"], "\x8d" => [76, "\xdca"], "\x8e" => [104, "\xdca"], "\x8f" => [16, "\xdca"], "\x90" => [94, "\xdcc"], "\x91" => [76, "\xdcc"], "\x92" => [104, "\xdcc"], "\x93" => [16, "\xdcc"], "\x94" => [94, "\xdce"], "\x95" => [76, "\xdce"], "\x96" => [104, "\xdce"], "\x97" => [16, "\xdce"], "\x98" => [94, "\xdci"], "\x99" => [76, "\xdci"], "\x9a" => [104, "\xdci"], "\x9b" => [16, "\xdci"], "\x9c" => [94, "\xdco"], "\x9d" => [76, "\xdco"], "\x9e" => [104, "\xdco"], "\x9f" => [16, "\xdco"], "\xa0" => [94, "\xdcs"], "\xa1" => [76, "\xdcs"], "\xa2" => [104, "\xdcs"], "\xa3" => [16, "\xdcs"], "\xa4" => [94, "\xdct"], "\xa5" => [76, "\xdct"], "\xa6" => [104, "\xdct"], "\xa7" => [16, "\xdct"], "\xa8" => [77, "\xdc "], "\xa9" => [18, "\xdc "], "\xaa" => [77, "\xdc%"], "\xab" => [18, "\xdc%"], "\xac" => [77, "\xdc-"], "\xad" => [18, "\xdc-"], "\xae" => [77, "\xdc."], "\xaf" => [18, "\xdc."], "\xb0" => [77, "\xdc/"], "\xb1" => [18, "\xdc/"], "\xb2" => [77, "\xdc3"], "\xb3" => [18, "\xdc3"], "\xb4" => [77, "\xdc4"], "\xb5" => [18, "\xdc4"], "\xb6" => [77, "\xdc5"], "\xb7" => [18, "\xdc5"], "\xb8" => [77, "\xdc6"], "\xb9" => [18, "\xdc6"], "\xba" => [77, "\xdc7"], "\xbb" => [18, "\xdc7"], "\xbc" => [77, "\xdc8"], "\xbd" => [18, "\xdc8"], "\xbe" => [77, "\xdc9"], "\xbf" => [18, "\xdc9"], "\xc0" => [77, "\xdc="], "\xc1" => [18, "\xdc="], "\xc2" => [77, "\xdcA"], "\xc3" => [18, "\xdcA"], "\xc4" => [77, "\xdc_"], "\xc5" => [18, "\xdc_"], "\xc6" => [77, "\xdcb"], "\xc7" => [18, "\xdcb"], "\xc8" => [77, "\xdcd"], "\xc9" => [18, "\xdcd"], "\xca" => [77, "\xdcf"], "\xcb" => [18, "\xdcf"], "\xcc" => [77, "\xdcg"], "\xcd" => [18, "\xdcg"], "\xce" => [77, "\xdch"], "\xcf" => [18, "\xdch"], "\xd0" => [77, "\xdcl"], "\xd1" => [18, "\xdcl"], "\xd2" => [77, "\xdcm"], "\xd3" => [18, "\xdcm"], "\xd4" => [77, "\xdcn"], "\xd5" => [18, "\xdcn"], "\xd6" => [77, "\xdcp"], "\xd7" => [18, "\xdcp"], "\xd8" => [77, "\xdcr"], "\xd9" => [18, "\xdcr"], "\xda" => [77, "\xdcu"], "\xdb" => [18, "\xdcu"], "\xdc" => [0, "\xdc:"], "\xdd" => [0, "\xdcB"], "\xde" => [0, "\xdcC"], "\xdf" => [0, "\xdcD"], "\xe0" => [0, "\xdcE"], "\xe1" => [0, "\xdcF"], "\xe2" => [0, "\xdcG"], "\xe3" => [0, "\xdcH"], "\xe4" => [0, "\xdcI"], "\xe5" => [0, "\xdcJ"], "\xe6" => [0, "\xdcK"], "\xe7" => [0, "\xdcL"], "\xe8" => [0, "\xdcM"], "\xe9" => [0, "\xdcN"], "\xea" => [0, "\xdcO"], "\xeb" => [0, "\xdcP"], "\xec" => [0, "\xdcQ"], "\xed" => [0, "\xdcR"], "\xee" => [0, "\xdcS"], "\xef" => [0, "\xdcT"], "\xf0" => [0, "\xdcU"], "\xf1" => [0, "\xdcV"], "\xf2" => [0, "\xdcW"], "\xf3" => [0, "\xdcY"], "\xf4" => [0, "\xdcj"], "\xf5" => [0, "\xdck"], "\xf6" => [0, "\xdcq"], "\xf7" => [0, "\xdcv"], "\xf8" => [0, "\xdcw"], "\xf9" => [0, "\xdcx"], "\xfa" => [0, "\xdcy"], "\xfb" => [0, "\xdcz"], "\xfc" => [82, "\xdc"], "\xfd" => [87, "\xdc"], "\xfe" => [130, "\xdc"], "\xff" => [9, "\xdc"]], ["\x00" => [94, "\x800"], "\x01" => [76, "\x800"], "\x02" => [104, "\x800"], "\x03" => [16, "\x800"], "\x04" => [94, "\x801"], "\x05" => [76, "\x801"], "\x06" => [104, "\x801"], "\x07" => [16, "\x801"], "\x08" => [94, "\x802"], "\t" => [76, "\x802"], "\n" => [104, "\x802"], "\v" => [16, "\x802"], "\f" => [94, "\x80a"], "\r" => [76, "\x80a"], "\x0e" => [104, "\x80a"], "\x0f" => [16, "\x80a"], "\x10" => [94, "\x80c"], "\x11" => [76, "\x80c"], "\x12" => [104, "\x80c"], "\x13" => [16, "\x80c"], "\x14" => [94, "\x80e"], "\x15" => [76, "\x80e"], "\x16" => [104, "\x80e"], "\x17" => [16, "\x80e"], "\x18" => [94, "\x80i"], "\x19" => [76, "\x80i"], "\x1a" => [104, "\x80i"], "\x1b" => [16, "\x80i"], "\x1c" => [94, "\x80o"], "\x1d" => [76, "\x80o"], "\x1e" => [104, "\x80o"], "\x1f" => [16, "\x80o"], " " => [94, "\x80s"], "!" => [76, "\x80s"], "\"" => [104, "\x80s"], "#" => [16, "\x80s"], "\$" => [94, "\x80t"], "%" => [76, "\x80t"], "&" => [104, "\x80t"], "'" => [16, "\x80t"], "(" => [77, "\x80 "], ")" => [18, "\x80 "], "*" => [77, "\x80%"], "+" => [18, "\x80%"], "," => [77, "\x80-"], "-" => [18, "\x80-"], "." => [77, "\x80."], "/" => [18, "\x80."], [77, "\x80/"], [18, "\x80/"], [77, "\x803"], [18, "\x803"], [77, "\x804"], [18, "\x804"], [77, "\x805"], [18, "\x805"], [77, "\x806"], [18, "\x806"], ":" => [77, "\x807"], ";" => [18, "\x807"], "<" => [77, "\x808"], "=" => [18, "\x808"], ">" => [77, "\x809"], "?" => [18, "\x809"], "@" => [77, "\x80="], "A" => [18, "\x80="], "B" => [77, "\x80A"], "C" => [18, "\x80A"], "D" => [77, "\x80_"], "E" => [18, "\x80_"], "F" => [77, "\x80b"], "G" => [18, "\x80b"], "H" => [77, "\x80d"], "I" => [18, "\x80d"], "J" => [77, "\x80f"], "K" => [18, "\x80f"], "L" => [77, "\x80g"], "M" => [18, "\x80g"], "N" => [77, "\x80h"], "O" => [18, "\x80h"], "P" => [77, "\x80l"], "Q" => [18, "\x80l"], "R" => [77, "\x80m"], "S" => [18, "\x80m"], "T" => [77, "\x80n"], "U" => [18, "\x80n"], "V" => [77, "\x80p"], "W" => [18, "\x80p"], "X" => [77, "\x80r"], "Y" => [18, "\x80r"], "Z" => [77, "\x80u"], "[" => [18, "\x80u"], "\\" => [0, "\x80:"], "]" => [0, "\x80B"], "^" => [0, "\x80C"], "_" => [0, "\x80D"], "`" => [0, "\x80E"], "a" => [0, "\x80F"], "b" => [0, "\x80G"], "c" => [0, "\x80H"], "d" => [0, "\x80I"], "e" => [0, "\x80J"], "f" => [0, "\x80K"], "g" => [0, "\x80L"], "h" => [0, "\x80M"], "i" => [0, "\x80N"], "j" => [0, "\x80O"], "k" => [0, "\x80P"], "l" => [0, "\x80Q"], "m" => [0, "\x80R"], "n" => [0, "\x80S"], "o" => [0, "\x80T"], "p" => [0, "\x80U"], "q" => [0, "\x80V"], "r" => [0, "\x80W"], "s" => [0, "\x80Y"], "t" => [0, "\x80j"], "u" => [0, "\x80k"], "v" => [0, "\x80q"], "w" => [0, "\x80v"], "x" => [0, "\x80w"], "y" => [0, "\x80x"], "z" => [0, "\x80y"], "{" => [0, "\x80z"], "|" => [82, "\x80"], "}" => [87, "\x80"], "~" => [130, "\x80"], "" => [9, "\x80"], "\x80" => [94, "\x820"], "\x81" => [76, "\x820"], "\x82" => [104, "\x820"], "\x83" => [16, "\x820"], "\x84" => [94, "\x821"], "\x85" => [76, "\x821"], "\x86" => [104, "\x821"], "\x87" => [16, "\x821"], "\x88" => [94, "\x822"], "\x89" => [76, "\x822"], "\x8a" => [104, "\x822"], "\x8b" => [16, "\x822"], "\x8c" => [94, "\x82a"], "\x8d" => [76, "\x82a"], "\x8e" => [104, "\x82a"], "\x8f" => [16, "\x82a"], "\x90" => [94, "\x82c"], "\x91" => [76, "\x82c"], "\x92" => [104, "\x82c"], "\x93" => [16, "\x82c"], "\x94" => [94, "\x82e"], "\x95" => [76, "\x82e"], "\x96" => [104, "\x82e"], "\x97" => [16, "\x82e"], "\x98" => [94, "\x82i"], "\x99" => [76, "\x82i"], "\x9a" => [104, "\x82i"], "\x9b" => [16, "\x82i"], "\x9c" => [94, "\x82o"], "\x9d" => [76, "\x82o"], "\x9e" => [104, "\x82o"], "\x9f" => [16, "\x82o"], "\xa0" => [94, "\x82s"], "\xa1" => [76, "\x82s"], "\xa2" => [104, "\x82s"], "\xa3" => [16, "\x82s"], "\xa4" => [94, "\x82t"], "\xa5" => [76, "\x82t"], "\xa6" => [104, "\x82t"], "\xa7" => [16, "\x82t"], "\xa8" => [77, "\x82 "], "\xa9" => [18, "\x82 "], "\xaa" => [77, "\x82%"], "\xab" => [18, "\x82%"], "\xac" => [77, "\x82-"], "\xad" => [18, "\x82-"], "\xae" => [77, "\x82."], "\xaf" => [18, "\x82."], "\xb0" => [77, "\x82/"], "\xb1" => [18, "\x82/"], "\xb2" => [77, "\x823"], "\xb3" => [18, "\x823"], "\xb4" => [77, "\x824"], "\xb5" => [18, "\x824"], "\xb6" => [77, "\x825"], "\xb7" => [18, "\x825"], "\xb8" => [77, "\x826"], "\xb9" => [18, "\x826"], "\xba" => [77, "\x827"], "\xbb" => [18, "\x827"], "\xbc" => [77, "\x828"], "\xbd" => [18, "\x828"], "\xbe" => [77, "\x829"], "\xbf" => [18, "\x829"], "\xc0" => [77, "\x82="], "\xc1" => [18, "\x82="], "\xc2" => [77, "\x82A"], "\xc3" => [18, "\x82A"], "\xc4" => [77, "\x82_"], "\xc5" => [18, "\x82_"], "\xc6" => [77, "\x82b"], "\xc7" => [18, "\x82b"], "\xc8" => [77, "\x82d"], "\xc9" => [18, "\x82d"], "\xca" => [77, "\x82f"], "\xcb" => [18, "\x82f"], "\xcc" => [77, "\x82g"], "\xcd" => [18, "\x82g"], "\xce" => [77, "\x82h"], "\xcf" => [18, "\x82h"], "\xd0" => [77, "\x82l"], "\xd1" => [18, "\x82l"], "\xd2" => [77, "\x82m"], "\xd3" => [18, "\x82m"], "\xd4" => [77, "\x82n"], "\xd5" => [18, "\x82n"], "\xd6" => [77, "\x82p"], "\xd7" => [18, "\x82p"], "\xd8" => [77, "\x82r"], "\xd9" => [18, "\x82r"], "\xda" => [77, "\x82u"], "\xdb" => [18, "\x82u"], "\xdc" => [0, "\x82:"], "\xdd" => [0, "\x82B"], "\xde" => [0, "\x82C"], "\xdf" => [0, "\x82D"], "\xe0" => [0, "\x82E"], "\xe1" => [0, "\x82F"], "\xe2" => [0, "\x82G"], "\xe3" => [0, "\x82H"], "\xe4" => [0, "\x82I"], "\xe5" => [0, "\x82J"], "\xe6" => [0, "\x82K"], "\xe7" => [0, "\x82L"], "\xe8" => [0, "\x82M"], "\xe9" => [0, "\x82N"], "\xea" => [0, "\x82O"], "\xeb" => [0, "\x82P"], "\xec" => [0, "\x82Q"], "\xed" => [0, "\x82R"], "\xee" => [0, "\x82S"], "\xef" => [0, "\x82T"], "\xf0" => [0, "\x82U"], "\xf1" => [0, "\x82V"], "\xf2" => [0, "\x82W"], "\xf3" => [0, "\x82Y"], "\xf4" => [0, "\x82j"], "\xf5" => [0, "\x82k"], "\xf6" => [0, "\x82q"], "\xf7" => [0, "\x82v"], "\xf8" => [0, "\x82w"], "\xf9" => [0, "\x82x"], "\xfa" => [0, "\x82y"], "\xfb" => [0, "\x82z"], "\xfc" => [82, "\x82"], "\xfd" => [87, "\x82"], "\xfe" => [130, "\x82"], "\xff" => [9, "\x82"]], ["\x00" => [94, "\xd00"], "\x01" => [76, "\xd00"], "\x02" => [104, "\xd00"], "\x03" => [16, "\xd00"], "\x04" => [94, "\xd01"], "\x05" => [76, "\xd01"], "\x06" => [104, "\xd01"], "\x07" => [16, "\xd01"], "\x08" => [94, "\xd02"], "\t" => [76, "\xd02"], "\n" => [104, "\xd02"], "\v" => [16, "\xd02"], "\f" => [94, "\xd0a"], "\r" => [76, "\xd0a"], "\x0e" => [104, "\xd0a"], "\x0f" => [16, "\xd0a"], "\x10" => [94, "\xd0c"], "\x11" => [76, "\xd0c"], "\x12" => [104, "\xd0c"], "\x13" => [16, "\xd0c"], "\x14" => [94, "\xd0e"], "\x15" => [76, "\xd0e"], "\x16" => [104, "\xd0e"], "\x17" => [16, "\xd0e"], "\x18" => [94, "\xd0i"], "\x19" => [76, "\xd0i"], "\x1a" => [104, "\xd0i"], "\x1b" => [16, "\xd0i"], "\x1c" => [94, "\xd0o"], "\x1d" => [76, "\xd0o"], "\x1e" => [104, "\xd0o"], "\x1f" => [16, "\xd0o"], " " => [94, "\xd0s"], "!" => [76, "\xd0s"], "\"" => [104, "\xd0s"], "#" => [16, "\xd0s"], "\$" => [94, "\xd0t"], "%" => [76, "\xd0t"], "&" => [104, "\xd0t"], "'" => [16, "\xd0t"], "(" => [77, "\xd0 "], ")" => [18, "\xd0 "], "*" => [77, "\xd0%"], "+" => [18, "\xd0%"], "," => [77, "\xd0-"], "-" => [18, "\xd0-"], "." => [77, "\xd0."], "/" => [18, "\xd0."], [77, "\xd0/"], [18, "\xd0/"], [77, "\xd03"], [18, "\xd03"], [77, "\xd04"], [18, "\xd04"], [77, "\xd05"], [18, "\xd05"], [77, "\xd06"], [18, "\xd06"], ":" => [77, "\xd07"], ";" => [18, "\xd07"], "<" => [77, "\xd08"], "=" => [18, "\xd08"], ">" => [77, "\xd09"], "?" => [18, "\xd09"], "@" => [77, "\xd0="], "A" => [18, "\xd0="], "B" => [77, "\xd0A"], "C" => [18, "\xd0A"], "D" => [77, "\xd0_"], "E" => [18, "\xd0_"], "F" => [77, "\xd0b"], "G" => [18, "\xd0b"], "H" => [77, "\xd0d"], "I" => [18, "\xd0d"], "J" => [77, "\xd0f"], "K" => [18, "\xd0f"], "L" => [77, "\xd0g"], "M" => [18, "\xd0g"], "N" => [77, "\xd0h"], "O" => [18, "\xd0h"], "P" => [77, "\xd0l"], "Q" => [18, "\xd0l"], "R" => [77, "\xd0m"], "S" => [18, "\xd0m"], "T" => [77, "\xd0n"], "U" => [18, "\xd0n"], "V" => [77, "\xd0p"], "W" => [18, "\xd0p"], "X" => [77, "\xd0r"], "Y" => [18, "\xd0r"], "Z" => [77, "\xd0u"], "[" => [18, "\xd0u"], "\\" => [0, "\xd0:"], "]" => [0, "\xd0B"], "^" => [0, "\xd0C"], "_" => [0, "\xd0D"], "`" => [0, "\xd0E"], "a" => [0, "\xd0F"], "b" => [0, "\xd0G"], "c" => [0, "\xd0H"], "d" => [0, "\xd0I"], "e" => [0, "\xd0J"], "f" => [0, "\xd0K"], "g" => [0, "\xd0L"], "h" => [0, "\xd0M"], "i" => [0, "\xd0N"], "j" => [0, "\xd0O"], "k" => [0, "\xd0P"], "l" => [0, "\xd0Q"], "m" => [0, "\xd0R"], "n" => [0, "\xd0S"], "o" => [0, "\xd0T"], "p" => [0, "\xd0U"], "q" => [0, "\xd0V"], "r" => [0, "\xd0W"], "s" => [0, "\xd0Y"], "t" => [0, "\xd0j"], "u" => [0, "\xd0k"], "v" => [0, "\xd0q"], "w" => [0, "\xd0v"], "x" => [0, "\xd0w"], "y" => [0, "\xd0x"], "z" => [0, "\xd0y"], "{" => [0, "\xd0z"], "|" => [82, "\xd0"], "}" => [87, "\xd0"], "~" => [130, "\xd0"], "" => [9, "\xd0"], "\x80" => [77, "\x800"], "\x81" => [18, "\x800"], "\x82" => [77, "\x801"], "\x83" => [18, "\x801"], "\x84" => [77, "\x802"], "\x85" => [18, "\x802"], "\x86" => [77, "\x80a"], "\x87" => [18, "\x80a"], "\x88" => [77, "\x80c"], "\x89" => [18, "\x80c"], "\x8a" => [77, "\x80e"], "\x8b" => [18, "\x80e"], "\x8c" => [77, "\x80i"], "\x8d" => [18, "\x80i"], "\x8e" => [77, "\x80o"], "\x8f" => [18, "\x80o"], "\x90" => [77, "\x80s"], "\x91" => [18, "\x80s"], "\x92" => [77, "\x80t"], "\x93" => [18, "\x80t"], "\x94" => [0, "\x80 "], "\x95" => [0, "\x80%"], "\x96" => [0, "\x80-"], "\x97" => [0, "\x80."], "\x98" => [0, "\x80/"], "\x99" => [0, "\x803"], "\x9a" => [0, "\x804"], "\x9b" => [0, "\x805"], "\x9c" => [0, "\x806"], "\x9d" => [0, "\x807"], "\x9e" => [0, "\x808"], "\x9f" => [0, "\x809"], "\xa0" => [0, "\x80="], "\xa1" => [0, "\x80A"], "\xa2" => [0, "\x80_"], "\xa3" => [0, "\x80b"], "\xa4" => [0, "\x80d"], "\xa5" => [0, "\x80f"], "\xa6" => [0, "\x80g"], "\xa7" => [0, "\x80h"], "\xa8" => [0, "\x80l"], "\xa9" => [0, "\x80m"], "\xaa" => [0, "\x80n"], "\xab" => [0, "\x80p"], "\xac" => [0, "\x80r"], "\xad" => [0, "\x80u"], "\xae" => [100, "\x80"], "\xaf" => [110, "\x80"], "\xb0" => [111, "\x80"], "\xb1" => [115, "\x80"], "\xb2" => [116, "\x80"], "\xb3" => [118, "\x80"], "\xb4" => [119, "\x80"], "\xb5" => [122, "\x80"], "\xb6" => [123, "\x80"], "\xb7" => [125, "\x80"], "\xb8" => [126, "\x80"], "\xb9" => [129, "\x80"], "\xba" => [143, "\x80"], "\xbb" => [148, "\x80"], "\xbc" => [151, "\x80"], "\xbd" => [153, "\x80"], "\xbe" => [83, "\x80"], "\xbf" => [10, "\x80"], "\xc0" => [77, "\x820"], "\xc1" => [18, "\x820"], "\xc2" => [77, "\x821"], "\xc3" => [18, "\x821"], "\xc4" => [77, "\x822"], "\xc5" => [18, "\x822"], "\xc6" => [77, "\x82a"], "\xc7" => [18, "\x82a"], "\xc8" => [77, "\x82c"], "\xc9" => [18, "\x82c"], "\xca" => [77, "\x82e"], "\xcb" => [18, "\x82e"], "\xcc" => [77, "\x82i"], "\xcd" => [18, "\x82i"], "\xce" => [77, "\x82o"], "\xcf" => [18, "\x82o"], "\xd0" => [77, "\x82s"], "\xd1" => [18, "\x82s"], "\xd2" => [77, "\x82t"], "\xd3" => [18, "\x82t"], "\xd4" => [0, "\x82 "], "\xd5" => [0, "\x82%"], "\xd6" => [0, "\x82-"], "\xd7" => [0, "\x82."], "\xd8" => [0, "\x82/"], "\xd9" => [0, "\x823"], "\xda" => [0, "\x824"], "\xdb" => [0, "\x825"], "\xdc" => [0, "\x826"], "\xdd" => [0, "\x827"], "\xde" => [0, "\x828"], "\xdf" => [0, "\x829"], "\xe0" => [0, "\x82="], "\xe1" => [0, "\x82A"], "\xe2" => [0, "\x82_"], "\xe3" => [0, "\x82b"], "\xe4" => [0, "\x82d"], "\xe5" => [0, "\x82f"], "\xe6" => [0, "\x82g"], "\xe7" => [0, "\x82h"], "\xe8" => [0, "\x82l"], "\xe9" => [0, "\x82m"], "\xea" => [0, "\x82n"], "\xeb" => [0, "\x82p"], "\xec" => [0, "\x82r"], "\xed" => [0, "\x82u"], "\xee" => [100, "\x82"], "\xef" => [110, "\x82"], "\xf0" => [111, "\x82"], "\xf1" => [115, "\x82"], "\xf2" => [116, "\x82"], "\xf3" => [118, "\x82"], "\xf4" => [119, "\x82"], "\xf5" => [122, "\x82"], "\xf6" => [123, "\x82"], "\xf7" => [125, "\x82"], "\xf8" => [126, "\x82"], "\xf9" => [129, "\x82"], "\xfa" => [143, "\x82"], "\xfb" => [148, "\x82"], "\xfc" => [151, "\x82"], "\xfd" => [153, "\x82"], "\xfe" => [83, "\x82"], "\xff" => [10, "\x82"]], ["\x00" => [94, "\x810"], "\x01" => [76, "\x810"], "\x02" => [104, "\x810"], "\x03" => [16, "\x810"], "\x04" => [94, "\x811"], "\x05" => [76, "\x811"], "\x06" => [104, "\x811"], "\x07" => [16, "\x811"], "\x08" => [94, "\x812"], "\t" => [76, "\x812"], "\n" => [104, "\x812"], "\v" => [16, "\x812"], "\f" => [94, "\x81a"], "\r" => [76, "\x81a"], "\x0e" => [104, "\x81a"], "\x0f" => [16, "\x81a"], "\x10" => [94, "\x81c"], "\x11" => [76, "\x81c"], "\x12" => [104, "\x81c"], "\x13" => [16, "\x81c"], "\x14" => [94, "\x81e"], "\x15" => [76, "\x81e"], "\x16" => [104, "\x81e"], "\x17" => [16, "\x81e"], "\x18" => [94, "\x81i"], "\x19" => [76, "\x81i"], "\x1a" => [104, "\x81i"], "\x1b" => [16, "\x81i"], "\x1c" => [94, "\x81o"], "\x1d" => [76, "\x81o"], "\x1e" => [104, "\x81o"], "\x1f" => [16, "\x81o"], " " => [94, "\x81s"], "!" => [76, "\x81s"], "\"" => [104, "\x81s"], "#" => [16, "\x81s"], "\$" => [94, "\x81t"], "%" => [76, "\x81t"], "&" => [104, "\x81t"], "'" => [16, "\x81t"], "(" => [77, "\x81 "], ")" => [18, "\x81 "], "*" => [77, "\x81%"], "+" => [18, "\x81%"], "," => [77, "\x81-"], "-" => [18, "\x81-"], "." => [77, "\x81."], "/" => [18, "\x81."], [77, "\x81/"], [18, "\x81/"], [77, "\x813"], [18, "\x813"], [77, "\x814"], [18, "\x814"], [77, "\x815"], [18, "\x815"], [77, "\x816"], [18, "\x816"], ":" => [77, "\x817"], ";" => [18, "\x817"], "<" => [77, "\x818"], "=" => [18, "\x818"], ">" => [77, "\x819"], "?" => [18, "\x819"], "@" => [77, "\x81="], "A" => [18, "\x81="], "B" => [77, "\x81A"], "C" => [18, "\x81A"], "D" => [77, "\x81_"], "E" => [18, "\x81_"], "F" => [77, "\x81b"], "G" => [18, "\x81b"], "H" => [77, "\x81d"], "I" => [18, "\x81d"], "J" => [77, "\x81f"], "K" => [18, "\x81f"], "L" => [77, "\x81g"], "M" => [18, "\x81g"], "N" => [77, "\x81h"], "O" => [18, "\x81h"], "P" => [77, "\x81l"], "Q" => [18, "\x81l"], "R" => [77, "\x81m"], "S" => [18, "\x81m"], "T" => [77, "\x81n"], "U" => [18, "\x81n"], "V" => [77, "\x81p"], "W" => [18, "\x81p"], "X" => [77, "\x81r"], "Y" => [18, "\x81r"], "Z" => [77, "\x81u"], "[" => [18, "\x81u"], "\\" => [0, "\x81:"], "]" => [0, "\x81B"], "^" => [0, "\x81C"], "_" => [0, "\x81D"], "`" => [0, "\x81E"], "a" => [0, "\x81F"], "b" => [0, "\x81G"], "c" => [0, "\x81H"], "d" => [0, "\x81I"], "e" => [0, "\x81J"], "f" => [0, "\x81K"], "g" => [0, "\x81L"], "h" => [0, "\x81M"], "i" => [0, "\x81N"], "j" => [0, "\x81O"], "k" => [0, "\x81P"], "l" => [0, "\x81Q"], "m" => [0, "\x81R"], "n" => [0, "\x81S"], "o" => [0, "\x81T"], "p" => [0, "\x81U"], "q" => [0, "\x81V"], "r" => [0, "\x81W"], "s" => [0, "\x81Y"], "t" => [0, "\x81j"], "u" => [0, "\x81k"], "v" => [0, "\x81q"], "w" => [0, "\x81v"], "x" => [0, "\x81w"], "y" => [0, "\x81x"], "z" => [0, "\x81y"], "{" => [0, "\x81z"], "|" => [82, "\x81"], "}" => [87, "\x81"], "~" => [130, "\x81"], "" => [9, "\x81"], "\x80" => [94, "\x840"], "\x81" => [76, "\x840"], "\x82" => [104, "\x840"], "\x83" => [16, "\x840"], "\x84" => [94, "\x841"], "\x85" => [76, "\x841"], "\x86" => [104, "\x841"], "\x87" => [16, "\x841"], "\x88" => [94, "\x842"], "\x89" => [76, "\x842"], "\x8a" => [104, "\x842"], "\x8b" => [16, "\x842"], "\x8c" => [94, "\x84a"], "\x8d" => [76, "\x84a"], "\x8e" => [104, "\x84a"], "\x8f" => [16, "\x84a"], "\x90" => [94, "\x84c"], "\x91" => [76, "\x84c"], "\x92" => [104, "\x84c"], "\x93" => [16, "\x84c"], "\x94" => [94, "\x84e"], "\x95" => [76, "\x84e"], "\x96" => [104, "\x84e"], "\x97" => [16, "\x84e"], "\x98" => [94, "\x84i"], "\x99" => [76, "\x84i"], "\x9a" => [104, "\x84i"], "\x9b" => [16, "\x84i"], "\x9c" => [94, "\x84o"], "\x9d" => [76, "\x84o"], "\x9e" => [104, "\x84o"], "\x9f" => [16, "\x84o"], "\xa0" => [94, "\x84s"], "\xa1" => [76, "\x84s"], "\xa2" => [104, "\x84s"], "\xa3" => [16, "\x84s"], "\xa4" => [94, "\x84t"], "\xa5" => [76, "\x84t"], "\xa6" => [104, "\x84t"], "\xa7" => [16, "\x84t"], "\xa8" => [77, "\x84 "], "\xa9" => [18, "\x84 "], "\xaa" => [77, "\x84%"], "\xab" => [18, "\x84%"], "\xac" => [77, "\x84-"], "\xad" => [18, "\x84-"], "\xae" => [77, "\x84."], "\xaf" => [18, "\x84."], "\xb0" => [77, "\x84/"], "\xb1" => [18, "\x84/"], "\xb2" => [77, "\x843"], "\xb3" => [18, "\x843"], "\xb4" => [77, "\x844"], "\xb5" => [18, "\x844"], "\xb6" => [77, "\x845"], "\xb7" => [18, "\x845"], "\xb8" => [77, "\x846"], "\xb9" => [18, "\x846"], "\xba" => [77, "\x847"], "\xbb" => [18, "\x847"], "\xbc" => [77, "\x848"], "\xbd" => [18, "\x848"], "\xbe" => [77, "\x849"], "\xbf" => [18, "\x849"], "\xc0" => [77, "\x84="], "\xc1" => [18, "\x84="], "\xc2" => [77, "\x84A"], "\xc3" => [18, "\x84A"], "\xc4" => [77, "\x84_"], "\xc5" => [18, "\x84_"], "\xc6" => [77, "\x84b"], "\xc7" => [18, "\x84b"], "\xc8" => [77, "\x84d"], "\xc9" => [18, "\x84d"], "\xca" => [77, "\x84f"], "\xcb" => [18, "\x84f"], "\xcc" => [77, "\x84g"], "\xcd" => [18, "\x84g"], "\xce" => [77, "\x84h"], "\xcf" => [18, "\x84h"], "\xd0" => [77, "\x84l"], "\xd1" => [18, "\x84l"], "\xd2" => [77, "\x84m"], "\xd3" => [18, "\x84m"], "\xd4" => [77, "\x84n"], "\xd5" => [18, "\x84n"], "\xd6" => [77, "\x84p"], "\xd7" => [18, "\x84p"], "\xd8" => [77, "\x84r"], "\xd9" => [18, "\x84r"], "\xda" => [77, "\x84u"], "\xdb" => [18, "\x84u"], "\xdc" => [0, "\x84:"], "\xdd" => [0, "\x84B"], "\xde" => [0, "\x84C"], "\xdf" => [0, "\x84D"], "\xe0" => [0, "\x84E"], "\xe1" => [0, "\x84F"], "\xe2" => [0, "\x84G"], "\xe3" => [0, "\x84H"], "\xe4" => [0, "\x84I"], "\xe5" => [0, "\x84J"], "\xe6" => [0, "\x84K"], "\xe7" => [0, "\x84L"], "\xe8" => [0, "\x84M"], "\xe9" => [0, "\x84N"], "\xea" => [0, "\x84O"], "\xeb" => [0, "\x84P"], "\xec" => [0, "\x84Q"], "\xed" => [0, "\x84R"], "\xee" => [0, "\x84S"], "\xef" => [0, "\x84T"], "\xf0" => [0, "\x84U"], "\xf1" => [0, "\x84V"], "\xf2" => [0, "\x84W"], "\xf3" => [0, "\x84Y"], "\xf4" => [0, "\x84j"], "\xf5" => [0, "\x84k"], "\xf6" => [0, "\x84q"], "\xf7" => [0, "\x84v"], "\xf8" => [0, "\x84w"], "\xf9" => [0, "\x84x"], "\xfa" => [0, "\x84y"], "\xfb" => [0, "\x84z"], "\xfc" => [82, "\x84"], "\xfd" => [87, "\x84"], "\xfe" => [130, "\x84"], "\xff" => [9, "\x84"]], ["\x00" => [94, "\xe60"], "\x01" => [76, "\xe60"], "\x02" => [104, "\xe60"], "\x03" => [16, "\xe60"], "\x04" => [94, "\xe61"], "\x05" => [76, "\xe61"], "\x06" => [104, "\xe61"], "\x07" => [16, "\xe61"], "\x08" => [94, "\xe62"], "\t" => [76, "\xe62"], "\n" => [104, "\xe62"], "\v" => [16, "\xe62"], "\f" => [94, "\xe6a"], "\r" => [76, "\xe6a"], "\x0e" => [104, "\xe6a"], "\x0f" => [16, "\xe6a"], "\x10" => [94, "\xe6c"], "\x11" => [76, "\xe6c"], "\x12" => [104, "\xe6c"], "\x13" => [16, "\xe6c"], "\x14" => [94, "\xe6e"], "\x15" => [76, "\xe6e"], "\x16" => [104, "\xe6e"], "\x17" => [16, "\xe6e"], "\x18" => [94, "\xe6i"], "\x19" => [76, "\xe6i"], "\x1a" => [104, "\xe6i"], "\x1b" => [16, "\xe6i"], "\x1c" => [94, "\xe6o"], "\x1d" => [76, "\xe6o"], "\x1e" => [104, "\xe6o"], "\x1f" => [16, "\xe6o"], " " => [94, "\xe6s"], "!" => [76, "\xe6s"], "\"" => [104, "\xe6s"], "#" => [16, "\xe6s"], "\$" => [94, "\xe6t"], "%" => [76, "\xe6t"], "&" => [104, "\xe6t"], "'" => [16, "\xe6t"], "(" => [77, "\xe6 "], ")" => [18, "\xe6 "], "*" => [77, "\xe6%"], "+" => [18, "\xe6%"], "," => [77, "\xe6-"], "-" => [18, "\xe6-"], "." => [77, "\xe6."], "/" => [18, "\xe6."], [77, "\xe6/"], [18, "\xe6/"], [77, "\xe63"], [18, "\xe63"], [77, "\xe64"], [18, "\xe64"], [77, "\xe65"], [18, "\xe65"], [77, "\xe66"], [18, "\xe66"], ":" => [77, "\xe67"], ";" => [18, "\xe67"], "<" => [77, "\xe68"], "=" => [18, "\xe68"], ">" => [77, "\xe69"], "?" => [18, "\xe69"], "@" => [77, "\xe6="], "A" => [18, "\xe6="], "B" => [77, "\xe6A"], "C" => [18, "\xe6A"], "D" => [77, "\xe6_"], "E" => [18, "\xe6_"], "F" => [77, "\xe6b"], "G" => [18, "\xe6b"], "H" => [77, "\xe6d"], "I" => [18, "\xe6d"], "J" => [77, "\xe6f"], "K" => [18, "\xe6f"], "L" => [77, "\xe6g"], "M" => [18, "\xe6g"], "N" => [77, "\xe6h"], "O" => [18, "\xe6h"], "P" => [77, "\xe6l"], "Q" => [18, "\xe6l"], "R" => [77, "\xe6m"], "S" => [18, "\xe6m"], "T" => [77, "\xe6n"], "U" => [18, "\xe6n"], "V" => [77, "\xe6p"], "W" => [18, "\xe6p"], "X" => [77, "\xe6r"], "Y" => [18, "\xe6r"], "Z" => [77, "\xe6u"], "[" => [18, "\xe6u"], "\\" => [0, "\xe6:"], "]" => [0, "\xe6B"], "^" => [0, "\xe6C"], "_" => [0, "\xe6D"], "`" => [0, "\xe6E"], "a" => [0, "\xe6F"], "b" => [0, "\xe6G"], "c" => [0, "\xe6H"], "d" => [0, "\xe6I"], "e" => [0, "\xe6J"], "f" => [0, "\xe6K"], "g" => [0, "\xe6L"], "h" => [0, "\xe6M"], "i" => [0, "\xe6N"], "j" => [0, "\xe6O"], "k" => [0, "\xe6P"], "l" => [0, "\xe6Q"], "m" => [0, "\xe6R"], "n" => [0, "\xe6S"], "o" => [0, "\xe6T"], "p" => [0, "\xe6U"], "q" => [0, "\xe6V"], "r" => [0, "\xe6W"], "s" => [0, "\xe6Y"], "t" => [0, "\xe6j"], "u" => [0, "\xe6k"], "v" => [0, "\xe6q"], "w" => [0, "\xe6v"], "x" => [0, "\xe6w"], "y" => [0, "\xe6x"], "z" => [0, "\xe6y"], "{" => [0, "\xe6z"], "|" => [82, "\xe6"], "}" => [87, "\xe6"], "~" => [130, "\xe6"], "" => [9, "\xe6"], "\x80" => [77, "\x810"], "\x81" => [18, "\x810"], "\x82" => [77, "\x811"], "\x83" => [18, "\x811"], "\x84" => [77, "\x812"], "\x85" => [18, "\x812"], "\x86" => [77, "\x81a"], "\x87" => [18, "\x81a"], "\x88" => [77, "\x81c"], "\x89" => [18, "\x81c"], "\x8a" => [77, "\x81e"], "\x8b" => [18, "\x81e"], "\x8c" => [77, "\x81i"], "\x8d" => [18, "\x81i"], "\x8e" => [77, "\x81o"], "\x8f" => [18, "\x81o"], "\x90" => [77, "\x81s"], "\x91" => [18, "\x81s"], "\x92" => [77, "\x81t"], "\x93" => [18, "\x81t"], "\x94" => [0, "\x81 "], "\x95" => [0, "\x81%"], "\x96" => [0, "\x81-"], "\x97" => [0, "\x81."], "\x98" => [0, "\x81/"], "\x99" => [0, "\x813"], "\x9a" => [0, "\x814"], "\x9b" => [0, "\x815"], "\x9c" => [0, "\x816"], "\x9d" => [0, "\x817"], "\x9e" => [0, "\x818"], "\x9f" => [0, "\x819"], "\xa0" => [0, "\x81="], "\xa1" => [0, "\x81A"], "\xa2" => [0, "\x81_"], "\xa3" => [0, "\x81b"], "\xa4" => [0, "\x81d"], "\xa5" => [0, "\x81f"], "\xa6" => [0, "\x81g"], "\xa7" => [0, "\x81h"], "\xa8" => [0, "\x81l"], "\xa9" => [0, "\x81m"], "\xaa" => [0, "\x81n"], "\xab" => [0, "\x81p"], "\xac" => [0, "\x81r"], "\xad" => [0, "\x81u"], "\xae" => [100, "\x81"], "\xaf" => [110, "\x81"], "\xb0" => [111, "\x81"], "\xb1" => [115, "\x81"], "\xb2" => [116, "\x81"], "\xb3" => [118, "\x81"], "\xb4" => [119, "\x81"], "\xb5" => [122, "\x81"], "\xb6" => [123, "\x81"], "\xb7" => [125, "\x81"], "\xb8" => [126, "\x81"], "\xb9" => [129, "\x81"], "\xba" => [143, "\x81"], "\xbb" => [148, "\x81"], "\xbc" => [151, "\x81"], "\xbd" => [153, "\x81"], "\xbe" => [83, "\x81"], "\xbf" => [10, "\x81"], "\xc0" => [77, "\x840"], "\xc1" => [18, "\x840"], "\xc2" => [77, "\x841"], "\xc3" => [18, "\x841"], "\xc4" => [77, "\x842"], "\xc5" => [18, "\x842"], "\xc6" => [77, "\x84a"], "\xc7" => [18, "\x84a"], "\xc8" => [77, "\x84c"], "\xc9" => [18, "\x84c"], "\xca" => [77, "\x84e"], "\xcb" => [18, "\x84e"], "\xcc" => [77, "\x84i"], "\xcd" => [18, "\x84i"], "\xce" => [77, "\x84o"], "\xcf" => [18, "\x84o"], "\xd0" => [77, "\x84s"], "\xd1" => [18, "\x84s"], "\xd2" => [77, "\x84t"], "\xd3" => [18, "\x84t"], "\xd4" => [0, "\x84 "], "\xd5" => [0, "\x84%"], "\xd6" => [0, "\x84-"], "\xd7" => [0, "\x84."], "\xd8" => [0, "\x84/"], "\xd9" => [0, "\x843"], "\xda" => [0, "\x844"], "\xdb" => [0, "\x845"], "\xdc" => [0, "\x846"], "\xdd" => [0, "\x847"], "\xde" => [0, "\x848"], "\xdf" => [0, "\x849"], "\xe0" => [0, "\x84="], "\xe1" => [0, "\x84A"], "\xe2" => [0, "\x84_"], "\xe3" => [0, "\x84b"], "\xe4" => [0, "\x84d"], "\xe5" => [0, "\x84f"], "\xe6" => [0, "\x84g"], "\xe7" => [0, "\x84h"], "\xe8" => [0, "\x84l"], "\xe9" => [0, "\x84m"], "\xea" => [0, "\x84n"], "\xeb" => [0, "\x84p"], "\xec" => [0, "\x84r"], "\xed" => [0, "\x84u"], "\xee" => [100, "\x84"], "\xef" => [110, "\x84"], "\xf0" => [111, "\x84"], "\xf1" => [115, "\x84"], "\xf2" => [116, "\x84"], "\xf3" => [118, "\x84"], "\xf4" => [119, "\x84"], "\xf5" => [122, "\x84"], "\xf6" => [123, "\x84"], "\xf7" => [125, "\x84"], "\xf8" => [126, "\x84"], "\xf9" => [129, "\x84"], "\xfa" => [143, "\x84"], "\xfb" => [148, "\x84"], "\xfc" => [151, "\x84"], "\xfd" => [153, "\x84"], "\xfe" => [83, "\x84"], "\xff" => [10, "\x84"]], ["\x00" => [77, "\xe60"], "\x01" => [18, "\xe60"], "\x02" => [77, "\xe61"], "\x03" => [18, "\xe61"], "\x04" => [77, "\xe62"], "\x05" => [18, "\xe62"], "\x06" => [77, "\xe6a"], "\x07" => [18, "\xe6a"], "\x08" => [77, "\xe6c"], "\t" => [18, "\xe6c"], "\n" => [77, "\xe6e"], "\v" => [18, "\xe6e"], "\f" => [77, "\xe6i"], "\r" => [18, "\xe6i"], "\x0e" => [77, "\xe6o"], "\x0f" => [18, "\xe6o"], "\x10" => [77, "\xe6s"], "\x11" => [18, "\xe6s"], "\x12" => [77, "\xe6t"], "\x13" => [18, "\xe6t"], "\x14" => [0, "\xe6 "], "\x15" => [0, "\xe6%"], "\x16" => [0, "\xe6-"], "\x17" => [0, "\xe6."], "\x18" => [0, "\xe6/"], "\x19" => [0, "\xe63"], "\x1a" => [0, "\xe64"], "\x1b" => [0, "\xe65"], "\x1c" => [0, "\xe66"], "\x1d" => [0, "\xe67"], "\x1e" => [0, "\xe68"], "\x1f" => [0, "\xe69"], " " => [0, "\xe6="], "!" => [0, "\xe6A"], "\"" => [0, "\xe6_"], "#" => [0, "\xe6b"], "\$" => [0, "\xe6d"], "%" => [0, "\xe6f"], "&" => [0, "\xe6g"], "'" => [0, "\xe6h"], "(" => [0, "\xe6l"], ")" => [0, "\xe6m"], "*" => [0, "\xe6n"], "+" => [0, "\xe6p"], "," => [0, "\xe6r"], "-" => [0, "\xe6u"], "." => [100, "\xe6"], "/" => [110, "\xe6"], [111, "\xe6"], [115, "\xe6"], [116, "\xe6"], [118, "\xe6"], [119, "\xe6"], [122, "\xe6"], [123, "\xe6"], [125, "\xe6"], [126, "\xe6"], [129, "\xe6"], ":" => [143, "\xe6"], ";" => [148, "\xe6"], "<" => [151, "\xe6"], "=" => [153, "\xe6"], ">" => [83, "\xe6"], "?" => [10, "\xe6"], "@" => [0, "\x810"], "A" => [0, "\x811"], "B" => [0, "\x812"], "C" => [0, "\x81a"], "D" => [0, "\x81c"], "E" => [0, "\x81e"], "F" => [0, "\x81i"], "G" => [0, "\x81o"], "H" => [0, "\x81s"], "I" => [0, "\x81t"], "J" => [73, "\x81"], "K" => [88, "\x81"], "L" => [89, "\x81"], "M" => [96, "\x81"], "N" => [97, "\x81"], "O" => [99, "\x81"], "P" => [106, "\x81"], "Q" => [136, "\x81"], "R" => [139, "\x81"], "S" => [141, "\x81"], "T" => [145, "\x81"], "U" => [147, "\x81"], "V" => [149, "\x81"], "W" => [101, "\x81"], "X" => [112, "\x81"], "Y" => [117, "\x81"], "Z" => [120, "\x81"], "[" => [124, "\x81"], "\\" => [127, "\x81"], "]" => [144, "\x81"], "^" => [152, "\x81"], "_" => [11, "\x81"], "`" => [0, "\x840"], "a" => [0, "\x841"], "b" => [0, "\x842"], "c" => [0, "\x84a"], "d" => [0, "\x84c"], "e" => [0, "\x84e"], "f" => [0, "\x84i"], "g" => [0, "\x84o"], "h" => [0, "\x84s"], "i" => [0, "\x84t"], "j" => [73, "\x84"], "k" => [88, "\x84"], "l" => [89, "\x84"], "m" => [96, "\x84"], "n" => [97, "\x84"], "o" => [99, "\x84"], "p" => [106, "\x84"], "q" => [136, "\x84"], "r" => [139, "\x84"], "s" => [141, "\x84"], "t" => [145, "\x84"], "u" => [147, "\x84"], "v" => [149, "\x84"], "w" => [101, "\x84"], "x" => [112, "\x84"], "y" => [117, "\x84"], "z" => [120, "\x84"], "{" => [124, "\x84"], "|" => [127, "\x84"], "}" => [144, "\x84"], "~" => [152, "\x84"], "" => [11, "\x84"], "\x80" => [0, "\x850"], "\x81" => [0, "\x851"], "\x82" => [0, "\x852"], "\x83" => [0, "\x85a"], "\x84" => [0, "\x85c"], "\x85" => [0, "\x85e"], "\x86" => [0, "\x85i"], "\x87" => [0, "\x85o"], "\x88" => [0, "\x85s"], "\x89" => [0, "\x85t"], "\x8a" => [73, "\x85"], "\x8b" => [88, "\x85"], "\x8c" => [89, "\x85"], "\x8d" => [96, "\x85"], "\x8e" => [97, "\x85"], "\x8f" => [99, "\x85"], "\x90" => [106, "\x85"], "\x91" => [136, "\x85"], "\x92" => [139, "\x85"], "\x93" => [141, "\x85"], "\x94" => [145, "\x85"], "\x95" => [147, "\x85"], "\x96" => [149, "\x85"], "\x97" => [101, "\x85"], "\x98" => [112, "\x85"], "\x99" => [117, "\x85"], "\x9a" => [120, "\x85"], "\x9b" => [124, "\x85"], "\x9c" => [127, "\x85"], "\x9d" => [144, "\x85"], "\x9e" => [152, "\x85"], "\x9f" => [11, "\x85"], "\xa0" => [0, "\x860"], "\xa1" => [0, "\x861"], "\xa2" => [0, "\x862"], "\xa3" => [0, "\x86a"], "\xa4" => [0, "\x86c"], "\xa5" => [0, "\x86e"], "\xa6" => [0, "\x86i"], "\xa7" => [0, "\x86o"], "\xa8" => [0, "\x86s"], "\xa9" => [0, "\x86t"], "\xaa" => [73, "\x86"], "\xab" => [88, "\x86"], "\xac" => [89, "\x86"], "\xad" => [96, "\x86"], "\xae" => [97, "\x86"], "\xaf" => [99, "\x86"], "\xb0" => [106, "\x86"], "\xb1" => [136, "\x86"], "\xb2" => [139, "\x86"], "\xb3" => [141, "\x86"], "\xb4" => [145, "\x86"], "\xb5" => [147, "\x86"], "\xb6" => [149, "\x86"], "\xb7" => [101, "\x86"], "\xb8" => [112, "\x86"], "\xb9" => [117, "\x86"], "\xba" => [120, "\x86"], "\xbb" => [124, "\x86"], "\xbc" => [127, "\x86"], "\xbd" => [144, "\x86"], "\xbe" => [152, "\x86"], "\xbf" => [11, "\x86"], "\xc0" => [0, "\x880"], "\xc1" => [0, "\x881"], "\xc2" => [0, "\x882"], "\xc3" => [0, "\x88a"], "\xc4" => [0, "\x88c"], "\xc5" => [0, "\x88e"], "\xc6" => [0, "\x88i"], "\xc7" => [0, "\x88o"], "\xc8" => [0, "\x88s"], "\xc9" => [0, "\x88t"], "\xca" => [73, "\x88"], "\xcb" => [88, "\x88"], "\xcc" => [89, "\x88"], "\xcd" => [96, "\x88"], "\xce" => [97, "\x88"], "\xcf" => [99, "\x88"], "\xd0" => [106, "\x88"], "\xd1" => [136, "\x88"], "\xd2" => [139, "\x88"], "\xd3" => [141, "\x88"], "\xd4" => [145, "\x88"], "\xd5" => [147, "\x88"], "\xd6" => [149, "\x88"], "\xd7" => [101, "\x88"], "\xd8" => [112, "\x88"], "\xd9" => [117, "\x88"], "\xda" => [120, "\x88"], "\xdb" => [124, "\x88"], "\xdc" => [127, "\x88"], "\xdd" => [144, "\x88"], "\xde" => [152, "\x88"], "\xdf" => [11, "\x88"], "\xe0" => [0, "\x920"], "\xe1" => [0, "\x921"], "\xe2" => [0, "\x922"], "\xe3" => [0, "\x92a"], "\xe4" => [0, "\x92c"], "\xe5" => [0, "\x92e"], "\xe6" => [0, "\x92i"], "\xe7" => [0, "\x92o"], "\xe8" => [0, "\x92s"], "\xe9" => [0, "\x92t"], "\xea" => [73, "\x92"], "\xeb" => [88, "\x92"], "\xec" => [89, "\x92"], "\xed" => [96, "\x92"], "\xee" => [97, "\x92"], "\xef" => [99, "\x92"], "\xf0" => [106, "\x92"], "\xf1" => [136, "\x92"], "\xf2" => [139, "\x92"], "\xf3" => [141, "\x92"], "\xf4" => [145, "\x92"], "\xf5" => [147, "\x92"], "\xf6" => [149, "\x92"], "\xf7" => [101, "\x92"], "\xf8" => [112, "\x92"], "\xf9" => [117, "\x92"], "\xfa" => [120, "\x92"], "\xfb" => [124, "\x92"], "\xfc" => [127, "\x92"], "\xfd" => [144, "\x92"], "\xfe" => [152, "\x92"], "\xff" => [11, "\x92"]], ["\x00" => [0, "\xe60"], "\x01" => [0, "\xe61"], "\x02" => [0, "\xe62"], "\x03" => [0, "\xe6a"], "\x04" => [0, "\xe6c"], "\x05" => [0, "\xe6e"], "\x06" => [0, "\xe6i"], "\x07" => [0, "\xe6o"], "\x08" => [0, "\xe6s"], "\t" => [0, "\xe6t"], "\n" => [73, "\xe6"], "\v" => [88, "\xe6"], "\f" => [89, "\xe6"], "\r" => [96, "\xe6"], "\x0e" => [97, "\xe6"], "\x0f" => [99, "\xe6"], "\x10" => [106, "\xe6"], "\x11" => [136, "\xe6"], "\x12" => [139, "\xe6"], "\x13" => [141, "\xe6"], "\x14" => [145, "\xe6"], "\x15" => [147, "\xe6"], "\x16" => [149, "\xe6"], "\x17" => [101, "\xe6"], "\x18" => [112, "\xe6"], "\x19" => [117, "\xe6"], "\x1a" => [120, "\xe6"], "\x1b" => [124, "\xe6"], "\x1c" => [127, "\xe6"], "\x1d" => [144, "\xe6"], "\x1e" => [152, "\xe6"], "\x1f" => [11, "\xe6"], " " => [92, "\x81"], "!" => [95, "\x81"], "\"" => [137, "\x81"], "#" => [142, "\x81"], "\$" => [150, "\x81"], "%" => [74, "\x81"], "&" => [90, "\x81"], "'" => [98, "\x81"], "(" => [107, "\x81"], ")" => [140, "\x81"], "*" => [146, "\x81"], "+" => [102, "\x81"], "," => [113, "\x81"], "-" => [121, "\x81"], "." => [128, "\x81"], "/" => [12, "\x81"], [92, "\x84"], [95, "\x84"], [137, "\x84"], [142, "\x84"], [150, "\x84"], [74, "\x84"], [90, "\x84"], [98, "\x84"], [107, "\x84"], [140, "\x84"], ":" => [146, "\x84"], ";" => [102, "\x84"], "<" => [113, "\x84"], "=" => [121, "\x84"], ">" => [128, "\x84"], "?" => [12, "\x84"], "@" => [92, "\x85"], "A" => [95, "\x85"], "B" => [137, "\x85"], "C" => [142, "\x85"], "D" => [150, "\x85"], "E" => [74, "\x85"], "F" => [90, "\x85"], "G" => [98, "\x85"], "H" => [107, "\x85"], "I" => [140, "\x85"], "J" => [146, "\x85"], "K" => [102, "\x85"], "L" => [113, "\x85"], "M" => [121, "\x85"], "N" => [128, "\x85"], "O" => [12, "\x85"], "P" => [92, "\x86"], "Q" => [95, "\x86"], "R" => [137, "\x86"], "S" => [142, "\x86"], "T" => [150, "\x86"], "U" => [74, "\x86"], "V" => [90, "\x86"], "W" => [98, "\x86"], "X" => [107, "\x86"], "Y" => [140, "\x86"], "Z" => [146, "\x86"], "[" => [102, "\x86"], "\\" => [113, "\x86"], "]" => [121, "\x86"], "^" => [128, "\x86"], "_" => [12, "\x86"], "`" => [92, "\x88"], "a" => [95, "\x88"], "b" => [137, "\x88"], "c" => [142, "\x88"], "d" => [150, "\x88"], "e" => [74, "\x88"], "f" => [90, "\x88"], "g" => [98, "\x88"], "h" => [107, "\x88"], "i" => [140, "\x88"], "j" => [146, "\x88"], "k" => [102, "\x88"], "l" => [113, "\x88"], "m" => [121, "\x88"], "n" => [128, "\x88"], "o" => [12, "\x88"], "p" => [92, "\x92"], "q" => [95, "\x92"], "r" => [137, "\x92"], "s" => [142, "\x92"], "t" => [150, "\x92"], "u" => [74, "\x92"], "v" => [90, "\x92"], "w" => [98, "\x92"], "x" => [107, "\x92"], "y" => [140, "\x92"], "z" => [146, "\x92"], "{" => [102, "\x92"], "|" => [113, "\x92"], "}" => [121, "\x92"], "~" => [128, "\x92"], "" => [12, "\x92"], "\x80" => [92, "\x9a"], "\x81" => [95, "\x9a"], "\x82" => [137, "\x9a"], "\x83" => [142, "\x9a"], "\x84" => [150, "\x9a"], "\x85" => [74, "\x9a"], "\x86" => [90, "\x9a"], "\x87" => [98, "\x9a"], "\x88" => [107, "\x9a"], "\x89" => [140, "\x9a"], "\x8a" => [146, "\x9a"], "\x8b" => [102, "\x9a"], "\x8c" => [113, "\x9a"], "\x8d" => [121, "\x9a"], "\x8e" => [128, "\x9a"], "\x8f" => [12, "\x9a"], "\x90" => [92, "\x9c"], "\x91" => [95, "\x9c"], "\x92" => [137, "\x9c"], "\x93" => [142, "\x9c"], "\x94" => [150, "\x9c"], "\x95" => [74, "\x9c"], "\x96" => [90, "\x9c"], "\x97" => [98, "\x9c"], "\x98" => [107, "\x9c"], "\x99" => [140, "\x9c"], "\x9a" => [146, "\x9c"], "\x9b" => [102, "\x9c"], "\x9c" => [113, "\x9c"], "\x9d" => [121, "\x9c"], "\x9e" => [128, "\x9c"], "\x9f" => [12, "\x9c"], "\xa0" => [92, "\xa0"], "\xa1" => [95, "\xa0"], "\xa2" => [137, "\xa0"], "\xa3" => [142, "\xa0"], "\xa4" => [150, "\xa0"], "\xa5" => [74, "\xa0"], "\xa6" => [90, "\xa0"], "\xa7" => [98, "\xa0"], "\xa8" => [107, "\xa0"], "\xa9" => [140, "\xa0"], "\xaa" => [146, "\xa0"], "\xab" => [102, "\xa0"], "\xac" => [113, "\xa0"], "\xad" => [121, "\xa0"], "\xae" => [128, "\xa0"], "\xaf" => [12, "\xa0"], "\xb0" => [92, "\xa3"], "\xb1" => [95, "\xa3"], "\xb2" => [137, "\xa3"], "\xb3" => [142, "\xa3"], "\xb4" => [150, "\xa3"], "\xb5" => [74, "\xa3"], "\xb6" => [90, "\xa3"], "\xb7" => [98, "\xa3"], "\xb8" => [107, "\xa3"], "\xb9" => [140, "\xa3"], "\xba" => [146, "\xa3"], "\xbb" => [102, "\xa3"], "\xbc" => [113, "\xa3"], "\xbd" => [121, "\xa3"], "\xbe" => [128, "\xa3"], "\xbf" => [12, "\xa3"], "\xc0" => [92, "\xa4"], "\xc1" => [95, "\xa4"], "\xc2" => [137, "\xa4"], "\xc3" => [142, "\xa4"], "\xc4" => [150, "\xa4"], "\xc5" => [74, "\xa4"], "\xc6" => [90, "\xa4"], "\xc7" => [98, "\xa4"], "\xc8" => [107, "\xa4"], "\xc9" => [140, "\xa4"], "\xca" => [146, "\xa4"], "\xcb" => [102, "\xa4"], "\xcc" => [113, "\xa4"], "\xcd" => [121, "\xa4"], "\xce" => [128, "\xa4"], "\xcf" => [12, "\xa4"], "\xd0" => [92, "\xa9"], "\xd1" => [95, "\xa9"], "\xd2" => [137, "\xa9"], "\xd3" => [142, "\xa9"], "\xd4" => [150, "\xa9"], "\xd5" => [74, "\xa9"], "\xd6" => [90, "\xa9"], "\xd7" => [98, "\xa9"], "\xd8" => [107, "\xa9"], "\xd9" => [140, "\xa9"], "\xda" => [146, "\xa9"], "\xdb" => [102, "\xa9"], "\xdc" => [113, "\xa9"], "\xdd" => [121, "\xa9"], "\xde" => [128, "\xa9"], "\xdf" => [12, "\xa9"], "\xe0" => [92, "\xaa"], "\xe1" => [95, "\xaa"], "\xe2" => [137, "\xaa"], "\xe3" => [142, "\xaa"], "\xe4" => [150, "\xaa"], "\xe5" => [74, "\xaa"], "\xe6" => [90, "\xaa"], "\xe7" => [98, "\xaa"], "\xe8" => [107, "\xaa"], "\xe9" => [140, "\xaa"], "\xea" => [146, "\xaa"], "\xeb" => [102, "\xaa"], "\xec" => [113, "\xaa"], "\xed" => [121, "\xaa"], "\xee" => [128, "\xaa"], "\xef" => [12, "\xaa"], "\xf0" => [92, "\xad"], "\xf1" => [95, "\xad"], "\xf2" => [137, "\xad"], "\xf3" => [142, "\xad"], "\xf4" => [150, "\xad"], "\xf5" => [74, "\xad"], "\xf6" => [90, "\xad"], "\xf7" => [98, "\xad"], "\xf8" => [107, "\xad"], "\xf9" => [140, "\xad"], "\xfa" => [146, "\xad"], "\xfb" => [102, "\xad"], "\xfc" => [113, "\xad"], "\xfd" => [121, "\xad"], "\xfe" => [128, "\xad"], "\xff" => [12, "\xad"]], ["\x00" => [92, "\xb0"], "\x01" => [95, "\xb0"], "\x02" => [137, "\xb0"], "\x03" => [142, "\xb0"], "\x04" => [150, "\xb0"], "\x05" => [74, "\xb0"], "\x06" => [90, "\xb0"], "\x07" => [98, "\xb0"], "\x08" => [107, "\xb0"], "\t" => [140, "\xb0"], "\n" => [146, "\xb0"], "\v" => [102, "\xb0"], "\f" => [113, "\xb0"], "\r" => [121, "\xb0"], "\x0e" => [128, "\xb0"], "\x0f" => [12, "\xb0"], "\x10" => [92, "\xb1"], "\x11" => [95, "\xb1"], "\x12" => [137, "\xb1"], "\x13" => [142, "\xb1"], "\x14" => [150, "\xb1"], "\x15" => [74, "\xb1"], "\x16" => [90, "\xb1"], "\x17" => [98, "\xb1"], "\x18" => [107, "\xb1"], "\x19" => [140, "\xb1"], "\x1a" => [146, "\xb1"], "\x1b" => [102, "\xb1"], "\x1c" => [113, "\xb1"], "\x1d" => [121, "\xb1"], "\x1e" => [128, "\xb1"], "\x1f" => [12, "\xb1"], " " => [92, "\xb3"], "!" => [95, "\xb3"], "\"" => [137, "\xb3"], "#" => [142, "\xb3"], "\$" => [150, "\xb3"], "%" => [74, "\xb3"], "&" => [90, "\xb3"], "'" => [98, "\xb3"], "(" => [107, "\xb3"], ")" => [140, "\xb3"], "*" => [146, "\xb3"], "+" => [102, "\xb3"], "," => [113, "\xb3"], "-" => [121, "\xb3"], "." => [128, "\xb3"], "/" => [12, "\xb3"], [92, "\xd1"], [95, "\xd1"], [137, "\xd1"], [142, "\xd1"], [150, "\xd1"], [74, "\xd1"], [90, "\xd1"], [98, "\xd1"], [107, "\xd1"], [140, "\xd1"], ":" => [146, "\xd1"], ";" => [102, "\xd1"], "<" => [113, "\xd1"], "=" => [121, "\xd1"], ">" => [128, "\xd1"], "?" => [12, "\xd1"], "@" => [92, "\xd8"], "A" => [95, "\xd8"], "B" => [137, "\xd8"], "C" => [142, "\xd8"], "D" => [150, "\xd8"], "E" => [74, "\xd8"], "F" => [90, "\xd8"], "G" => [98, "\xd8"], "H" => [107, "\xd8"], "I" => [140, "\xd8"], "J" => [146, "\xd8"], "K" => [102, "\xd8"], "L" => [113, "\xd8"], "M" => [121, "\xd8"], "N" => [128, "\xd8"], "O" => [12, "\xd8"], "P" => [92, "\xd9"], "Q" => [95, "\xd9"], "R" => [137, "\xd9"], "S" => [142, "\xd9"], "T" => [150, "\xd9"], "U" => [74, "\xd9"], "V" => [90, "\xd9"], "W" => [98, "\xd9"], "X" => [107, "\xd9"], "Y" => [140, "\xd9"], "Z" => [146, "\xd9"], "[" => [102, "\xd9"], "\\" => [113, "\xd9"], "]" => [121, "\xd9"], "^" => [128, "\xd9"], "_" => [12, "\xd9"], "`" => [92, "\xe3"], "a" => [95, "\xe3"], "b" => [137, "\xe3"], "c" => [142, "\xe3"], "d" => [150, "\xe3"], "e" => [74, "\xe3"], "f" => [90, "\xe3"], "g" => [98, "\xe3"], "h" => [107, "\xe3"], "i" => [140, "\xe3"], "j" => [146, "\xe3"], "k" => [102, "\xe3"], "l" => [113, "\xe3"], "m" => [121, "\xe3"], "n" => [128, "\xe3"], "o" => [12, "\xe3"], "p" => [92, "\xe5"], "q" => [95, "\xe5"], "r" => [137, "\xe5"], "s" => [142, "\xe5"], "t" => [150, "\xe5"], "u" => [74, "\xe5"], "v" => [90, "\xe5"], "w" => [98, "\xe5"], "x" => [107, "\xe5"], "y" => [140, "\xe5"], "z" => [146, "\xe5"], "{" => [102, "\xe5"], "|" => [113, "\xe5"], "}" => [121, "\xe5"], "~" => [128, "\xe5"], "" => [12, "\xe5"], "\x80" => [92, "\xe6"], "\x81" => [95, "\xe6"], "\x82" => [137, "\xe6"], "\x83" => [142, "\xe6"], "\x84" => [150, "\xe6"], "\x85" => [74, "\xe6"], "\x86" => [90, "\xe6"], "\x87" => [98, "\xe6"], "\x88" => [107, "\xe6"], "\x89" => [140, "\xe6"], "\x8a" => [146, "\xe6"], "\x8b" => [102, "\xe6"], "\x8c" => [113, "\xe6"], "\x8d" => [121, "\xe6"], "\x8e" => [128, "\xe6"], "\x8f" => [12, "\xe6"], "\x90" => [93, "\x81"], "\x91" => [138, "\x81"], "\x92" => [75, "\x81"], "\x93" => [91, "\x81"], "\x94" => [108, "\x81"], "\x95" => [103, "\x81"], "\x96" => [114, "\x81"], "\x97" => [14, "\x81"], "\x98" => [93, "\x84"], "\x99" => [138, "\x84"], "\x9a" => [75, "\x84"], "\x9b" => [91, "\x84"], "\x9c" => [108, "\x84"], "\x9d" => [103, "\x84"], "\x9e" => [114, "\x84"], "\x9f" => [14, "\x84"], "\xa0" => [93, "\x85"], "\xa1" => [138, "\x85"], "\xa2" => [75, "\x85"], "\xa3" => [91, "\x85"], "\xa4" => [108, "\x85"], "\xa5" => [103, "\x85"], "\xa6" => [114, "\x85"], "\xa7" => [14, "\x85"], "\xa8" => [93, "\x86"], "\xa9" => [138, "\x86"], "\xaa" => [75, "\x86"], "\xab" => [91, "\x86"], "\xac" => [108, "\x86"], "\xad" => [103, "\x86"], "\xae" => [114, "\x86"], "\xaf" => [14, "\x86"], "\xb0" => [93, "\x88"], "\xb1" => [138, "\x88"], "\xb2" => [75, "\x88"], "\xb3" => [91, "\x88"], "\xb4" => [108, "\x88"], "\xb5" => [103, "\x88"], "\xb6" => [114, "\x88"], "\xb7" => [14, "\x88"], "\xb8" => [93, "\x92"], "\xb9" => [138, "\x92"], "\xba" => [75, "\x92"], "\xbb" => [91, "\x92"], "\xbc" => [108, "\x92"], "\xbd" => [103, "\x92"], "\xbe" => [114, "\x92"], "\xbf" => [14, "\x92"], "\xc0" => [93, "\x9a"], "\xc1" => [138, "\x9a"], "\xc2" => [75, "\x9a"], "\xc3" => [91, "\x9a"], "\xc4" => [108, "\x9a"], "\xc5" => [103, "\x9a"], "\xc6" => [114, "\x9a"], "\xc7" => [14, "\x9a"], "\xc8" => [93, "\x9c"], "\xc9" => [138, "\x9c"], "\xca" => [75, "\x9c"], "\xcb" => [91, "\x9c"], "\xcc" => [108, "\x9c"], "\xcd" => [103, "\x9c"], "\xce" => [114, "\x9c"], "\xcf" => [14, "\x9c"], "\xd0" => [93, "\xa0"], "\xd1" => [138, "\xa0"], "\xd2" => [75, "\xa0"], "\xd3" => [91, "\xa0"], "\xd4" => [108, "\xa0"], "\xd5" => [103, "\xa0"], "\xd6" => [114, "\xa0"], "\xd7" => [14, "\xa0"], "\xd8" => [93, "\xa3"], "\xd9" => [138, "\xa3"], "\xda" => [75, "\xa3"], "\xdb" => [91, "\xa3"], "\xdc" => [108, "\xa3"], "\xdd" => [103, "\xa3"], "\xde" => [114, "\xa3"], "\xdf" => [14, "\xa3"], "\xe0" => [93, "\xa4"], "\xe1" => [138, "\xa4"], "\xe2" => [75, "\xa4"], "\xe3" => [91, "\xa4"], "\xe4" => [108, "\xa4"], "\xe5" => [103, "\xa4"], "\xe6" => [114, "\xa4"], "\xe7" => [14, "\xa4"], "\xe8" => [93, "\xa9"], "\xe9" => [138, "\xa9"], "\xea" => [75, "\xa9"], "\xeb" => [91, "\xa9"], "\xec" => [108, "\xa9"], "\xed" => [103, "\xa9"], "\xee" => [114, "\xa9"], "\xef" => [14, "\xa9"], "\xf0" => [93, "\xaa"], "\xf1" => [138, "\xaa"], "\xf2" => [75, "\xaa"], "\xf3" => [91, "\xaa"], "\xf4" => [108, "\xaa"], "\xf5" => [103, "\xaa"], "\xf6" => [114, "\xaa"], "\xf7" => [14, "\xaa"], "\xf8" => [93, "\xad"], "\xf9" => [138, "\xad"], "\xfa" => [75, "\xad"], "\xfb" => [91, "\xad"], "\xfc" => [108, "\xad"], "\xfd" => [103, "\xad"], "\xfe" => [114, "\xad"], "\xff" => [14, "\xad"]], ["\x00" => [94, "\x830"], "\x01" => [76, "\x830"], "\x02" => [104, "\x830"], "\x03" => [16, "\x830"], "\x04" => [94, "\x831"], "\x05" => [76, "\x831"], "\x06" => [104, "\x831"], "\x07" => [16, "\x831"], "\x08" => [94, "\x832"], "\t" => [76, "\x832"], "\n" => [104, "\x832"], "\v" => [16, "\x832"], "\f" => [94, "\x83a"], "\r" => [76, "\x83a"], "\x0e" => [104, "\x83a"], "\x0f" => [16, "\x83a"], "\x10" => [94, "\x83c"], "\x11" => [76, "\x83c"], "\x12" => [104, "\x83c"], "\x13" => [16, "\x83c"], "\x14" => [94, "\x83e"], "\x15" => [76, "\x83e"], "\x16" => [104, "\x83e"], "\x17" => [16, "\x83e"], "\x18" => [94, "\x83i"], "\x19" => [76, "\x83i"], "\x1a" => [104, "\x83i"], "\x1b" => [16, "\x83i"], "\x1c" => [94, "\x83o"], "\x1d" => [76, "\x83o"], "\x1e" => [104, "\x83o"], "\x1f" => [16, "\x83o"], " " => [94, "\x83s"], "!" => [76, "\x83s"], "\"" => [104, "\x83s"], "#" => [16, "\x83s"], "\$" => [94, "\x83t"], "%" => [76, "\x83t"], "&" => [104, "\x83t"], "'" => [16, "\x83t"], "(" => [77, "\x83 "], ")" => [18, "\x83 "], "*" => [77, "\x83%"], "+" => [18, "\x83%"], "," => [77, "\x83-"], "-" => [18, "\x83-"], "." => [77, "\x83."], "/" => [18, "\x83."], [77, "\x83/"], [18, "\x83/"], [77, "\x833"], [18, "\x833"], [77, "\x834"], [18, "\x834"], [77, "\x835"], [18, "\x835"], [77, "\x836"], [18, "\x836"], ":" => [77, "\x837"], ";" => [18, "\x837"], "<" => [77, "\x838"], "=" => [18, "\x838"], ">" => [77, "\x839"], "?" => [18, "\x839"], "@" => [77, "\x83="], "A" => [18, "\x83="], "B" => [77, "\x83A"], "C" => [18, "\x83A"], "D" => [77, "\x83_"], "E" => [18, "\x83_"], "F" => [77, "\x83b"], "G" => [18, "\x83b"], "H" => [77, "\x83d"], "I" => [18, "\x83d"], "J" => [77, "\x83f"], "K" => [18, "\x83f"], "L" => [77, "\x83g"], "M" => [18, "\x83g"], "N" => [77, "\x83h"], "O" => [18, "\x83h"], "P" => [77, "\x83l"], "Q" => [18, "\x83l"], "R" => [77, "\x83m"], "S" => [18, "\x83m"], "T" => [77, "\x83n"], "U" => [18, "\x83n"], "V" => [77, "\x83p"], "W" => [18, "\x83p"], "X" => [77, "\x83r"], "Y" => [18, "\x83r"], "Z" => [77, "\x83u"], "[" => [18, "\x83u"], "\\" => [0, "\x83:"], "]" => [0, "\x83B"], "^" => [0, "\x83C"], "_" => [0, "\x83D"], "`" => [0, "\x83E"], "a" => [0, "\x83F"], "b" => [0, "\x83G"], "c" => [0, "\x83H"], "d" => [0, "\x83I"], "e" => [0, "\x83J"], "f" => [0, "\x83K"], "g" => [0, "\x83L"], "h" => [0, "\x83M"], "i" => [0, "\x83N"], "j" => [0, "\x83O"], "k" => [0, "\x83P"], "l" => [0, "\x83Q"], "m" => [0, "\x83R"], "n" => [0, "\x83S"], "o" => [0, "\x83T"], "p" => [0, "\x83U"], "q" => [0, "\x83V"], "r" => [0, "\x83W"], "s" => [0, "\x83Y"], "t" => [0, "\x83j"], "u" => [0, "\x83k"], "v" => [0, "\x83q"], "w" => [0, "\x83v"], "x" => [0, "\x83w"], "y" => [0, "\x83x"], "z" => [0, "\x83y"], "{" => [0, "\x83z"], "|" => [82, "\x83"], "}" => [87, "\x83"], "~" => [130, "\x83"], "" => [9, "\x83"], "\x80" => [94, "\xa20"], "\x81" => [76, "\xa20"], "\x82" => [104, "\xa20"], "\x83" => [16, "\xa20"], "\x84" => [94, "\xa21"], "\x85" => [76, "\xa21"], "\x86" => [104, "\xa21"], "\x87" => [16, "\xa21"], "\x88" => [94, "\xa22"], "\x89" => [76, "\xa22"], "\x8a" => [104, "\xa22"], "\x8b" => [16, "\xa22"], "\x8c" => [94, "\xa2a"], "\x8d" => [76, "\xa2a"], "\x8e" => [104, "\xa2a"], "\x8f" => [16, "\xa2a"], "\x90" => [94, "\xa2c"], "\x91" => [76, "\xa2c"], "\x92" => [104, "\xa2c"], "\x93" => [16, "\xa2c"], "\x94" => [94, "\xa2e"], "\x95" => [76, "\xa2e"], "\x96" => [104, "\xa2e"], "\x97" => [16, "\xa2e"], "\x98" => [94, "\xa2i"], "\x99" => [76, "\xa2i"], "\x9a" => [104, "\xa2i"], "\x9b" => [16, "\xa2i"], "\x9c" => [94, "\xa2o"], "\x9d" => [76, "\xa2o"], "\x9e" => [104, "\xa2o"], "\x9f" => [16, "\xa2o"], "\xa0" => [94, "\xa2s"], "\xa1" => [76, "\xa2s"], "\xa2" => [104, "\xa2s"], "\xa3" => [16, "\xa2s"], "\xa4" => [94, "\xa2t"], "\xa5" => [76, "\xa2t"], "\xa6" => [104, "\xa2t"], "\xa7" => [16, "\xa2t"], "\xa8" => [77, "\xa2 "], "\xa9" => [18, "\xa2 "], "\xaa" => [77, "\xa2%"], "\xab" => [18, "\xa2%"], "\xac" => [77, "\xa2-"], "\xad" => [18, "\xa2-"], "\xae" => [77, "\xa2."], "\xaf" => [18, "\xa2."], "\xb0" => [77, "\xa2/"], "\xb1" => [18, "\xa2/"], "\xb2" => [77, "\xa23"], "\xb3" => [18, "\xa23"], "\xb4" => [77, "\xa24"], "\xb5" => [18, "\xa24"], "\xb6" => [77, "\xa25"], "\xb7" => [18, "\xa25"], "\xb8" => [77, "\xa26"], "\xb9" => [18, "\xa26"], "\xba" => [77, "\xa27"], "\xbb" => [18, "\xa27"], "\xbc" => [77, "\xa28"], "\xbd" => [18, "\xa28"], "\xbe" => [77, "\xa29"], "\xbf" => [18, "\xa29"], "\xc0" => [77, "\xa2="], "\xc1" => [18, "\xa2="], "\xc2" => [77, "\xa2A"], "\xc3" => [18, "\xa2A"], "\xc4" => [77, "\xa2_"], "\xc5" => [18, "\xa2_"], "\xc6" => [77, "\xa2b"], "\xc7" => [18, "\xa2b"], "\xc8" => [77, "\xa2d"], "\xc9" => [18, "\xa2d"], "\xca" => [77, "\xa2f"], "\xcb" => [18, "\xa2f"], "\xcc" => [77, "\xa2g"], "\xcd" => [18, "\xa2g"], "\xce" => [77, "\xa2h"], "\xcf" => [18, "\xa2h"], "\xd0" => [77, "\xa2l"], "\xd1" => [18, "\xa2l"], "\xd2" => [77, "\xa2m"], "\xd3" => [18, "\xa2m"], "\xd4" => [77, "\xa2n"], "\xd5" => [18, "\xa2n"], "\xd6" => [77, "\xa2p"], "\xd7" => [18, "\xa2p"], "\xd8" => [77, "\xa2r"], "\xd9" => [18, "\xa2r"], "\xda" => [77, "\xa2u"], "\xdb" => [18, "\xa2u"], "\xdc" => [0, "\xa2:"], "\xdd" => [0, "\xa2B"], "\xde" => [0, "\xa2C"], "\xdf" => [0, "\xa2D"], "\xe0" => [0, "\xa2E"], "\xe1" => [0, "\xa2F"], "\xe2" => [0, "\xa2G"], "\xe3" => [0, "\xa2H"], "\xe4" => [0, "\xa2I"], "\xe5" => [0, "\xa2J"], "\xe6" => [0, "\xa2K"], "\xe7" => [0, "\xa2L"], "\xe8" => [0, "\xa2M"], "\xe9" => [0, "\xa2N"], "\xea" => [0, "\xa2O"], "\xeb" => [0, "\xa2P"], "\xec" => [0, "\xa2Q"], "\xed" => [0, "\xa2R"], "\xee" => [0, "\xa2S"], "\xef" => [0, "\xa2T"], "\xf0" => [0, "\xa2U"], "\xf1" => [0, "\xa2V"], "\xf2" => [0, "\xa2W"], "\xf3" => [0, "\xa2Y"], "\xf4" => [0, "\xa2j"], "\xf5" => [0, "\xa2k"], "\xf6" => [0, "\xa2q"], "\xf7" => [0, "\xa2v"], "\xf8" => [0, "\xa2w"], "\xf9" => [0, "\xa2x"], "\xfa" => [0, "\xa2y"], "\xfb" => [0, "\xa2z"], "\xfc" => [82, "\xa2"], "\xfd" => [87, "\xa2"], "\xfe" => [130, "\xa2"], "\xff" => [9, "\xa2"]], ["\x00" => [77, "\x830"], "\x01" => [18, "\x830"], "\x02" => [77, "\x831"], "\x03" => [18, "\x831"], "\x04" => [77, "\x832"], "\x05" => [18, "\x832"], "\x06" => [77, "\x83a"], "\x07" => [18, "\x83a"], "\x08" => [77, "\x83c"], "\t" => [18, "\x83c"], "\n" => [77, "\x83e"], "\v" => [18, "\x83e"], "\f" => [77, "\x83i"], "\r" => [18, "\x83i"], "\x0e" => [77, "\x83o"], "\x0f" => [18, "\x83o"], "\x10" => [77, "\x83s"], "\x11" => [18, "\x83s"], "\x12" => [77, "\x83t"], "\x13" => [18, "\x83t"], "\x14" => [0, "\x83 "], "\x15" => [0, "\x83%"], "\x16" => [0, "\x83-"], "\x17" => [0, "\x83."], "\x18" => [0, "\x83/"], "\x19" => [0, "\x833"], "\x1a" => [0, "\x834"], "\x1b" => [0, "\x835"], "\x1c" => [0, "\x836"], "\x1d" => [0, "\x837"], "\x1e" => [0, "\x838"], "\x1f" => [0, "\x839"], " " => [0, "\x83="], "!" => [0, "\x83A"], "\"" => [0, "\x83_"], "#" => [0, "\x83b"], "\$" => [0, "\x83d"], "%" => [0, "\x83f"], "&" => [0, "\x83g"], "'" => [0, "\x83h"], "(" => [0, "\x83l"], ")" => [0, "\x83m"], "*" => [0, "\x83n"], "+" => [0, "\x83p"], "," => [0, "\x83r"], "-" => [0, "\x83u"], "." => [100, "\x83"], "/" => [110, "\x83"], [111, "\x83"], [115, "\x83"], [116, "\x83"], [118, "\x83"], [119, "\x83"], [122, "\x83"], [123, "\x83"], [125, "\x83"], [126, "\x83"], [129, "\x83"], ":" => [143, "\x83"], ";" => [148, "\x83"], "<" => [151, "\x83"], "=" => [153, "\x83"], ">" => [83, "\x83"], "?" => [10, "\x83"], "@" => [77, "\xa20"], "A" => [18, "\xa20"], "B" => [77, "\xa21"], "C" => [18, "\xa21"], "D" => [77, "\xa22"], "E" => [18, "\xa22"], "F" => [77, "\xa2a"], "G" => [18, "\xa2a"], "H" => [77, "\xa2c"], "I" => [18, "\xa2c"], "J" => [77, "\xa2e"], "K" => [18, "\xa2e"], "L" => [77, "\xa2i"], "M" => [18, "\xa2i"], "N" => [77, "\xa2o"], "O" => [18, "\xa2o"], "P" => [77, "\xa2s"], "Q" => [18, "\xa2s"], "R" => [77, "\xa2t"], "S" => [18, "\xa2t"], "T" => [0, "\xa2 "], "U" => [0, "\xa2%"], "V" => [0, "\xa2-"], "W" => [0, "\xa2."], "X" => [0, "\xa2/"], "Y" => [0, "\xa23"], "Z" => [0, "\xa24"], "[" => [0, "\xa25"], "\\" => [0, "\xa26"], "]" => [0, "\xa27"], "^" => [0, "\xa28"], "_" => [0, "\xa29"], "`" => [0, "\xa2="], "a" => [0, "\xa2A"], "b" => [0, "\xa2_"], "c" => [0, "\xa2b"], "d" => [0, "\xa2d"], "e" => [0, "\xa2f"], "f" => [0, "\xa2g"], "g" => [0, "\xa2h"], "h" => [0, "\xa2l"], "i" => [0, "\xa2m"], "j" => [0, "\xa2n"], "k" => [0, "\xa2p"], "l" => [0, "\xa2r"], "m" => [0, "\xa2u"], "n" => [100, "\xa2"], "o" => [110, "\xa2"], "p" => [111, "\xa2"], "q" => [115, "\xa2"], "r" => [116, "\xa2"], "s" => [118, "\xa2"], "t" => [119, "\xa2"], "u" => [122, "\xa2"], "v" => [123, "\xa2"], "w" => [125, "\xa2"], "x" => [126, "\xa2"], "y" => [129, "\xa2"], "z" => [143, "\xa2"], "{" => [148, "\xa2"], "|" => [151, "\xa2"], "}" => [153, "\xa2"], "~" => [83, "\xa2"], "" => [10, "\xa2"], "\x80" => [77, "\xb80"], "\x81" => [18, "\xb80"], "\x82" => [77, "\xb81"], "\x83" => [18, "\xb81"], "\x84" => [77, "\xb82"], "\x85" => [18, "\xb82"], "\x86" => [77, "\xb8a"], "\x87" => [18, "\xb8a"], "\x88" => [77, "\xb8c"], "\x89" => [18, "\xb8c"], "\x8a" => [77, "\xb8e"], "\x8b" => [18, "\xb8e"], "\x8c" => [77, "\xb8i"], "\x8d" => [18, "\xb8i"], "\x8e" => [77, "\xb8o"], "\x8f" => [18, "\xb8o"], "\x90" => [77, "\xb8s"], "\x91" => [18, "\xb8s"], "\x92" => [77, "\xb8t"], "\x93" => [18, "\xb8t"], "\x94" => [0, "\xb8 "], "\x95" => [0, "\xb8%"], "\x96" => [0, "\xb8-"], "\x97" => [0, "\xb8."], "\x98" => [0, "\xb8/"], "\x99" => [0, "\xb83"], "\x9a" => [0, "\xb84"], "\x9b" => [0, "\xb85"], "\x9c" => [0, "\xb86"], "\x9d" => [0, "\xb87"], "\x9e" => [0, "\xb88"], "\x9f" => [0, "\xb89"], "\xa0" => [0, "\xb8="], "\xa1" => [0, "\xb8A"], "\xa2" => [0, "\xb8_"], "\xa3" => [0, "\xb8b"], "\xa4" => [0, "\xb8d"], "\xa5" => [0, "\xb8f"], "\xa6" => [0, "\xb8g"], "\xa7" => [0, "\xb8h"], "\xa8" => [0, "\xb8l"], "\xa9" => [0, "\xb8m"], "\xaa" => [0, "\xb8n"], "\xab" => [0, "\xb8p"], "\xac" => [0, "\xb8r"], "\xad" => [0, "\xb8u"], "\xae" => [100, "\xb8"], "\xaf" => [110, "\xb8"], "\xb0" => [111, "\xb8"], "\xb1" => [115, "\xb8"], "\xb2" => [116, "\xb8"], "\xb3" => [118, "\xb8"], "\xb4" => [119, "\xb8"], "\xb5" => [122, "\xb8"], "\xb6" => [123, "\xb8"], "\xb7" => [125, "\xb8"], "\xb8" => [126, "\xb8"], "\xb9" => [129, "\xb8"], "\xba" => [143, "\xb8"], "\xbb" => [148, "\xb8"], "\xbc" => [151, "\xb8"], "\xbd" => [153, "\xb8"], "\xbe" => [83, "\xb8"], "\xbf" => [10, "\xb8"], "\xc0" => [77, "\xc20"], "\xc1" => [18, "\xc20"], "\xc2" => [77, "\xc21"], "\xc3" => [18, "\xc21"], "\xc4" => [77, "\xc22"], "\xc5" => [18, "\xc22"], "\xc6" => [77, "\xc2a"], "\xc7" => [18, "\xc2a"], "\xc8" => [77, "\xc2c"], "\xc9" => [18, "\xc2c"], "\xca" => [77, "\xc2e"], "\xcb" => [18, "\xc2e"], "\xcc" => [77, "\xc2i"], "\xcd" => [18, "\xc2i"], "\xce" => [77, "\xc2o"], "\xcf" => [18, "\xc2o"], "\xd0" => [77, "\xc2s"], "\xd1" => [18, "\xc2s"], "\xd2" => [77, "\xc2t"], "\xd3" => [18, "\xc2t"], "\xd4" => [0, "\xc2 "], "\xd5" => [0, "\xc2%"], "\xd6" => [0, "\xc2-"], "\xd7" => [0, "\xc2."], "\xd8" => [0, "\xc2/"], "\xd9" => [0, "\xc23"], "\xda" => [0, "\xc24"], "\xdb" => [0, "\xc25"], "\xdc" => [0, "\xc26"], "\xdd" => [0, "\xc27"], "\xde" => [0, "\xc28"], "\xdf" => [0, "\xc29"], "\xe0" => [0, "\xc2="], "\xe1" => [0, "\xc2A"], "\xe2" => [0, "\xc2_"], "\xe3" => [0, "\xc2b"], "\xe4" => [0, "\xc2d"], "\xe5" => [0, "\xc2f"], "\xe6" => [0, "\xc2g"], "\xe7" => [0, "\xc2h"], "\xe8" => [0, "\xc2l"], "\xe9" => [0, "\xc2m"], "\xea" => [0, "\xc2n"], "\xeb" => [0, "\xc2p"], "\xec" => [0, "\xc2r"], "\xed" => [0, "\xc2u"], "\xee" => [100, "\xc2"], "\xef" => [110, "\xc2"], "\xf0" => [111, "\xc2"], "\xf1" => [115, "\xc2"], "\xf2" => [116, "\xc2"], "\xf3" => [118, "\xc2"], "\xf4" => [119, "\xc2"], "\xf5" => [122, "\xc2"], "\xf6" => [123, "\xc2"], "\xf7" => [125, "\xc2"], "\xf8" => [126, "\xc2"], "\xf9" => [129, "\xc2"], "\xfa" => [143, "\xc2"], "\xfb" => [148, "\xc2"], "\xfc" => [151, "\xc2"], "\xfd" => [153, "\xc2"], "\xfe" => [83, "\xc2"], "\xff" => [10, "\xc2"]], ["\x00" => [0, "\x830"], "\x01" => [0, "\x831"], "\x02" => [0, "\x832"], "\x03" => [0, "\x83a"], "\x04" => [0, "\x83c"], "\x05" => [0, "\x83e"], "\x06" => [0, "\x83i"], "\x07" => [0, "\x83o"], "\x08" => [0, "\x83s"], "\t" => [0, "\x83t"], "\n" => [73, "\x83"], "\v" => [88, "\x83"], "\f" => [89, "\x83"], "\r" => [96, "\x83"], "\x0e" => [97, "\x83"], "\x0f" => [99, "\x83"], "\x10" => [106, "\x83"], "\x11" => [136, "\x83"], "\x12" => [139, "\x83"], "\x13" => [141, "\x83"], "\x14" => [145, "\x83"], "\x15" => [147, "\x83"], "\x16" => [149, "\x83"], "\x17" => [101, "\x83"], "\x18" => [112, "\x83"], "\x19" => [117, "\x83"], "\x1a" => [120, "\x83"], "\x1b" => [124, "\x83"], "\x1c" => [127, "\x83"], "\x1d" => [144, "\x83"], "\x1e" => [152, "\x83"], "\x1f" => [11, "\x83"], " " => [0, "\xa20"], "!" => [0, "\xa21"], "\"" => [0, "\xa22"], "#" => [0, "\xa2a"], "\$" => [0, "\xa2c"], "%" => [0, "\xa2e"], "&" => [0, "\xa2i"], "'" => [0, "\xa2o"], "(" => [0, "\xa2s"], ")" => [0, "\xa2t"], "*" => [73, "\xa2"], "+" => [88, "\xa2"], "," => [89, "\xa2"], "-" => [96, "\xa2"], "." => [97, "\xa2"], "/" => [99, "\xa2"], [106, "\xa2"], [136, "\xa2"], [139, "\xa2"], [141, "\xa2"], [145, "\xa2"], [147, "\xa2"], [149, "\xa2"], [101, "\xa2"], [112, "\xa2"], [117, "\xa2"], ":" => [120, "\xa2"], ";" => [124, "\xa2"], "<" => [127, "\xa2"], "=" => [144, "\xa2"], ">" => [152, "\xa2"], "?" => [11, "\xa2"], "@" => [0, "\xb80"], "A" => [0, "\xb81"], "B" => [0, "\xb82"], "C" => [0, "\xb8a"], "D" => [0, "\xb8c"], "E" => [0, "\xb8e"], "F" => [0, "\xb8i"], "G" => [0, "\xb8o"], "H" => [0, "\xb8s"], "I" => [0, "\xb8t"], "J" => [73, "\xb8"], "K" => [88, "\xb8"], "L" => [89, "\xb8"], "M" => [96, "\xb8"], "N" => [97, "\xb8"], "O" => [99, "\xb8"], "P" => [106, "\xb8"], "Q" => [136, "\xb8"], "R" => [139, "\xb8"], "S" => [141, "\xb8"], "T" => [145, "\xb8"], "U" => [147, "\xb8"], "V" => [149, "\xb8"], "W" => [101, "\xb8"], "X" => [112, "\xb8"], "Y" => [117, "\xb8"], "Z" => [120, "\xb8"], "[" => [124, "\xb8"], "\\" => [127, "\xb8"], "]" => [144, "\xb8"], "^" => [152, "\xb8"], "_" => [11, "\xb8"], "`" => [0, "\xc20"], "a" => [0, "\xc21"], "b" => [0, "\xc22"], "c" => [0, "\xc2a"], "d" => [0, "\xc2c"], "e" => [0, "\xc2e"], "f" => [0, "\xc2i"], "g" => [0, "\xc2o"], "h" => [0, "\xc2s"], "i" => [0, "\xc2t"], "j" => [73, "\xc2"], "k" => [88, "\xc2"], "l" => [89, "\xc2"], "m" => [96, "\xc2"], "n" => [97, "\xc2"], "o" => [99, "\xc2"], "p" => [106, "\xc2"], "q" => [136, "\xc2"], "r" => [139, "\xc2"], "s" => [141, "\xc2"], "t" => [145, "\xc2"], "u" => [147, "\xc2"], "v" => [149, "\xc2"], "w" => [101, "\xc2"], "x" => [112, "\xc2"], "y" => [117, "\xc2"], "z" => [120, "\xc2"], "{" => [124, "\xc2"], "|" => [127, "\xc2"], "}" => [144, "\xc2"], "~" => [152, "\xc2"], "" => [11, "\xc2"], "\x80" => [0, "\xe00"], "\x81" => [0, "\xe01"], "\x82" => [0, "\xe02"], "\x83" => [0, "\xe0a"], "\x84" => [0, "\xe0c"], "\x85" => [0, "\xe0e"], "\x86" => [0, "\xe0i"], "\x87" => [0, "\xe0o"], "\x88" => [0, "\xe0s"], "\x89" => [0, "\xe0t"], "\x8a" => [73, "\xe0"], "\x8b" => [88, "\xe0"], "\x8c" => [89, "\xe0"], "\x8d" => [96, "\xe0"], "\x8e" => [97, "\xe0"], "\x8f" => [99, "\xe0"], "\x90" => [106, "\xe0"], "\x91" => [136, "\xe0"], "\x92" => [139, "\xe0"], "\x93" => [141, "\xe0"], "\x94" => [145, "\xe0"], "\x95" => [147, "\xe0"], "\x96" => [149, "\xe0"], "\x97" => [101, "\xe0"], "\x98" => [112, "\xe0"], "\x99" => [117, "\xe0"], "\x9a" => [120, "\xe0"], "\x9b" => [124, "\xe0"], "\x9c" => [127, "\xe0"], "\x9d" => [144, "\xe0"], "\x9e" => [152, "\xe0"], "\x9f" => [11, "\xe0"], "\xa0" => [0, "\xe20"], "\xa1" => [0, "\xe21"], "\xa2" => [0, "\xe22"], "\xa3" => [0, "\xe2a"], "\xa4" => [0, "\xe2c"], "\xa5" => [0, "\xe2e"], "\xa6" => [0, "\xe2i"], "\xa7" => [0, "\xe2o"], "\xa8" => [0, "\xe2s"], "\xa9" => [0, "\xe2t"], "\xaa" => [73, "\xe2"], "\xab" => [88, "\xe2"], "\xac" => [89, "\xe2"], "\xad" => [96, "\xe2"], "\xae" => [97, "\xe2"], "\xaf" => [99, "\xe2"], "\xb0" => [106, "\xe2"], "\xb1" => [136, "\xe2"], "\xb2" => [139, "\xe2"], "\xb3" => [141, "\xe2"], "\xb4" => [145, "\xe2"], "\xb5" => [147, "\xe2"], "\xb6" => [149, "\xe2"], "\xb7" => [101, "\xe2"], "\xb8" => [112, "\xe2"], "\xb9" => [117, "\xe2"], "\xba" => [120, "\xe2"], "\xbb" => [124, "\xe2"], "\xbc" => [127, "\xe2"], "\xbd" => [144, "\xe2"], "\xbe" => [152, "\xe2"], "\xbf" => [11, "\xe2"], "\xc0" => [92, "\x99"], "\xc1" => [95, "\x99"], "\xc2" => [137, "\x99"], "\xc3" => [142, "\x99"], "\xc4" => [150, "\x99"], "\xc5" => [74, "\x99"], "\xc6" => [90, "\x99"], "\xc7" => [98, "\x99"], "\xc8" => [107, "\x99"], "\xc9" => [140, "\x99"], "\xca" => [146, "\x99"], "\xcb" => [102, "\x99"], "\xcc" => [113, "\x99"], "\xcd" => [121, "\x99"], "\xce" => [128, "\x99"], "\xcf" => [12, "\x99"], "\xd0" => [92, "\xa1"], "\xd1" => [95, "\xa1"], "\xd2" => [137, "\xa1"], "\xd3" => [142, "\xa1"], "\xd4" => [150, "\xa1"], "\xd5" => [74, "\xa1"], "\xd6" => [90, "\xa1"], "\xd7" => [98, "\xa1"], "\xd8" => [107, "\xa1"], "\xd9" => [140, "\xa1"], "\xda" => [146, "\xa1"], "\xdb" => [102, "\xa1"], "\xdc" => [113, "\xa1"], "\xdd" => [121, "\xa1"], "\xde" => [128, "\xa1"], "\xdf" => [12, "\xa1"], "\xe0" => [92, "\xa7"], "\xe1" => [95, "\xa7"], "\xe2" => [137, "\xa7"], "\xe3" => [142, "\xa7"], "\xe4" => [150, "\xa7"], "\xe5" => [74, "\xa7"], "\xe6" => [90, "\xa7"], "\xe7" => [98, "\xa7"], "\xe8" => [107, "\xa7"], "\xe9" => [140, "\xa7"], "\xea" => [146, "\xa7"], "\xeb" => [102, "\xa7"], "\xec" => [113, "\xa7"], "\xed" => [121, "\xa7"], "\xee" => [128, "\xa7"], "\xef" => [12, "\xa7"], "\xf0" => [92, "\xac"], "\xf1" => [95, "\xac"], "\xf2" => [137, "\xac"], "\xf3" => [142, "\xac"], "\xf4" => [150, "\xac"], "\xf5" => [74, "\xac"], "\xf6" => [90, "\xac"], "\xf7" => [98, "\xac"], "\xf8" => [107, "\xac"], "\xf9" => [140, "\xac"], "\xfa" => [146, "\xac"], "\xfb" => [102, "\xac"], "\xfc" => [113, "\xac"], "\xfd" => [121, "\xac"], "\xfe" => [128, "\xac"], "\xff" => [12, "\xac"]], ["\x00" => [94, "\x850"], "\x01" => [76, "\x850"], "\x02" => [104, "\x850"], "\x03" => [16, "\x850"], "\x04" => [94, "\x851"], "\x05" => [76, "\x851"], "\x06" => [104, "\x851"], "\x07" => [16, "\x851"], "\x08" => [94, "\x852"], "\t" => [76, "\x852"], "\n" => [104, "\x852"], "\v" => [16, "\x852"], "\f" => [94, "\x85a"], "\r" => [76, "\x85a"], "\x0e" => [104, "\x85a"], "\x0f" => [16, "\x85a"], "\x10" => [94, "\x85c"], "\x11" => [76, "\x85c"], "\x12" => [104, "\x85c"], "\x13" => [16, "\x85c"], "\x14" => [94, "\x85e"], "\x15" => [76, "\x85e"], "\x16" => [104, "\x85e"], "\x17" => [16, "\x85e"], "\x18" => [94, "\x85i"], "\x19" => [76, "\x85i"], "\x1a" => [104, "\x85i"], "\x1b" => [16, "\x85i"], "\x1c" => [94, "\x85o"], "\x1d" => [76, "\x85o"], "\x1e" => [104, "\x85o"], "\x1f" => [16, "\x85o"], " " => [94, "\x85s"], "!" => [76, "\x85s"], "\"" => [104, "\x85s"], "#" => [16, "\x85s"], "\$" => [94, "\x85t"], "%" => [76, "\x85t"], "&" => [104, "\x85t"], "'" => [16, "\x85t"], "(" => [77, "\x85 "], ")" => [18, "\x85 "], "*" => [77, "\x85%"], "+" => [18, "\x85%"], "," => [77, "\x85-"], "-" => [18, "\x85-"], "." => [77, "\x85."], "/" => [18, "\x85."], [77, "\x85/"], [18, "\x85/"], [77, "\x853"], [18, "\x853"], [77, "\x854"], [18, "\x854"], [77, "\x855"], [18, "\x855"], [77, "\x856"], [18, "\x856"], ":" => [77, "\x857"], ";" => [18, "\x857"], "<" => [77, "\x858"], "=" => [18, "\x858"], ">" => [77, "\x859"], "?" => [18, "\x859"], "@" => [77, "\x85="], "A" => [18, "\x85="], "B" => [77, "\x85A"], "C" => [18, "\x85A"], "D" => [77, "\x85_"], "E" => [18, "\x85_"], "F" => [77, "\x85b"], "G" => [18, "\x85b"], "H" => [77, "\x85d"], "I" => [18, "\x85d"], "J" => [77, "\x85f"], "K" => [18, "\x85f"], "L" => [77, "\x85g"], "M" => [18, "\x85g"], "N" => [77, "\x85h"], "O" => [18, "\x85h"], "P" => [77, "\x85l"], "Q" => [18, "\x85l"], "R" => [77, "\x85m"], "S" => [18, "\x85m"], "T" => [77, "\x85n"], "U" => [18, "\x85n"], "V" => [77, "\x85p"], "W" => [18, "\x85p"], "X" => [77, "\x85r"], "Y" => [18, "\x85r"], "Z" => [77, "\x85u"], "[" => [18, "\x85u"], "\\" => [0, "\x85:"], "]" => [0, "\x85B"], "^" => [0, "\x85C"], "_" => [0, "\x85D"], "`" => [0, "\x85E"], "a" => [0, "\x85F"], "b" => [0, "\x85G"], "c" => [0, "\x85H"], "d" => [0, "\x85I"], "e" => [0, "\x85J"], "f" => [0, "\x85K"], "g" => [0, "\x85L"], "h" => [0, "\x85M"], "i" => [0, "\x85N"], "j" => [0, "\x85O"], "k" => [0, "\x85P"], "l" => [0, "\x85Q"], "m" => [0, "\x85R"], "n" => [0, "\x85S"], "o" => [0, "\x85T"], "p" => [0, "\x85U"], "q" => [0, "\x85V"], "r" => [0, "\x85W"], "s" => [0, "\x85Y"], "t" => [0, "\x85j"], "u" => [0, "\x85k"], "v" => [0, "\x85q"], "w" => [0, "\x85v"], "x" => [0, "\x85w"], "y" => [0, "\x85x"], "z" => [0, "\x85y"], "{" => [0, "\x85z"], "|" => [82, "\x85"], "}" => [87, "\x85"], "~" => [130, "\x85"], "" => [9, "\x85"], "\x80" => [94, "\x860"], "\x81" => [76, "\x860"], "\x82" => [104, "\x860"], "\x83" => [16, "\x860"], "\x84" => [94, "\x861"], "\x85" => [76, "\x861"], "\x86" => [104, "\x861"], "\x87" => [16, "\x861"], "\x88" => [94, "\x862"], "\x89" => [76, "\x862"], "\x8a" => [104, "\x862"], "\x8b" => [16, "\x862"], "\x8c" => [94, "\x86a"], "\x8d" => [76, "\x86a"], "\x8e" => [104, "\x86a"], "\x8f" => [16, "\x86a"], "\x90" => [94, "\x86c"], "\x91" => [76, "\x86c"], "\x92" => [104, "\x86c"], "\x93" => [16, "\x86c"], "\x94" => [94, "\x86e"], "\x95" => [76, "\x86e"], "\x96" => [104, "\x86e"], "\x97" => [16, "\x86e"], "\x98" => [94, "\x86i"], "\x99" => [76, "\x86i"], "\x9a" => [104, "\x86i"], "\x9b" => [16, "\x86i"], "\x9c" => [94, "\x86o"], "\x9d" => [76, "\x86o"], "\x9e" => [104, "\x86o"], "\x9f" => [16, "\x86o"], "\xa0" => [94, "\x86s"], "\xa1" => [76, "\x86s"], "\xa2" => [104, "\x86s"], "\xa3" => [16, "\x86s"], "\xa4" => [94, "\x86t"], "\xa5" => [76, "\x86t"], "\xa6" => [104, "\x86t"], "\xa7" => [16, "\x86t"], "\xa8" => [77, "\x86 "], "\xa9" => [18, "\x86 "], "\xaa" => [77, "\x86%"], "\xab" => [18, "\x86%"], "\xac" => [77, "\x86-"], "\xad" => [18, "\x86-"], "\xae" => [77, "\x86."], "\xaf" => [18, "\x86."], "\xb0" => [77, "\x86/"], "\xb1" => [18, "\x86/"], "\xb2" => [77, "\x863"], "\xb3" => [18, "\x863"], "\xb4" => [77, "\x864"], "\xb5" => [18, "\x864"], "\xb6" => [77, "\x865"], "\xb7" => [18, "\x865"], "\xb8" => [77, "\x866"], "\xb9" => [18, "\x866"], "\xba" => [77, "\x867"], "\xbb" => [18, "\x867"], "\xbc" => [77, "\x868"], "\xbd" => [18, "\x868"], "\xbe" => [77, "\x869"], "\xbf" => [18, "\x869"], "\xc0" => [77, "\x86="], "\xc1" => [18, "\x86="], "\xc2" => [77, "\x86A"], "\xc3" => [18, "\x86A"], "\xc4" => [77, "\x86_"], "\xc5" => [18, "\x86_"], "\xc6" => [77, "\x86b"], "\xc7" => [18, "\x86b"], "\xc8" => [77, "\x86d"], "\xc9" => [18, "\x86d"], "\xca" => [77, "\x86f"], "\xcb" => [18, "\x86f"], "\xcc" => [77, "\x86g"], "\xcd" => [18, "\x86g"], "\xce" => [77, "\x86h"], "\xcf" => [18, "\x86h"], "\xd0" => [77, "\x86l"], "\xd1" => [18, "\x86l"], "\xd2" => [77, "\x86m"], "\xd3" => [18, "\x86m"], "\xd4" => [77, "\x86n"], "\xd5" => [18, "\x86n"], "\xd6" => [77, "\x86p"], "\xd7" => [18, "\x86p"], "\xd8" => [77, "\x86r"], "\xd9" => [18, "\x86r"], "\xda" => [77, "\x86u"], "\xdb" => [18, "\x86u"], "\xdc" => [0, "\x86:"], "\xdd" => [0, "\x86B"], "\xde" => [0, "\x86C"], "\xdf" => [0, "\x86D"], "\xe0" => [0, "\x86E"], "\xe1" => [0, "\x86F"], "\xe2" => [0, "\x86G"], "\xe3" => [0, "\x86H"], "\xe4" => [0, "\x86I"], "\xe5" => [0, "\x86J"], "\xe6" => [0, "\x86K"], "\xe7" => [0, "\x86L"], "\xe8" => [0, "\x86M"], "\xe9" => [0, "\x86N"], "\xea" => [0, "\x86O"], "\xeb" => [0, "\x86P"], "\xec" => [0, "\x86Q"], "\xed" => [0, "\x86R"], "\xee" => [0, "\x86S"], "\xef" => [0, "\x86T"], "\xf0" => [0, "\x86U"], "\xf1" => [0, "\x86V"], "\xf2" => [0, "\x86W"], "\xf3" => [0, "\x86Y"], "\xf4" => [0, "\x86j"], "\xf5" => [0, "\x86k"], "\xf6" => [0, "\x86q"], "\xf7" => [0, "\x86v"], "\xf8" => [0, "\x86w"], "\xf9" => [0, "\x86x"], "\xfa" => [0, "\x86y"], "\xfb" => [0, "\x86z"], "\xfc" => [82, "\x86"], "\xfd" => [87, "\x86"], "\xfe" => [130, "\x86"], "\xff" => [9, "\x86"]], ["\x00" => [77, "\x850"], "\x01" => [18, "\x850"], "\x02" => [77, "\x851"], "\x03" => [18, "\x851"], "\x04" => [77, "\x852"], "\x05" => [18, "\x852"], "\x06" => [77, "\x85a"], "\x07" => [18, "\x85a"], "\x08" => [77, "\x85c"], "\t" => [18, "\x85c"], "\n" => [77, "\x85e"], "\v" => [18, "\x85e"], "\f" => [77, "\x85i"], "\r" => [18, "\x85i"], "\x0e" => [77, "\x85o"], "\x0f" => [18, "\x85o"], "\x10" => [77, "\x85s"], "\x11" => [18, "\x85s"], "\x12" => [77, "\x85t"], "\x13" => [18, "\x85t"], "\x14" => [0, "\x85 "], "\x15" => [0, "\x85%"], "\x16" => [0, "\x85-"], "\x17" => [0, "\x85."], "\x18" => [0, "\x85/"], "\x19" => [0, "\x853"], "\x1a" => [0, "\x854"], "\x1b" => [0, "\x855"], "\x1c" => [0, "\x856"], "\x1d" => [0, "\x857"], "\x1e" => [0, "\x858"], "\x1f" => [0, "\x859"], " " => [0, "\x85="], "!" => [0, "\x85A"], "\"" => [0, "\x85_"], "#" => [0, "\x85b"], "\$" => [0, "\x85d"], "%" => [0, "\x85f"], "&" => [0, "\x85g"], "'" => [0, "\x85h"], "(" => [0, "\x85l"], ")" => [0, "\x85m"], "*" => [0, "\x85n"], "+" => [0, "\x85p"], "," => [0, "\x85r"], "-" => [0, "\x85u"], "." => [100, "\x85"], "/" => [110, "\x85"], [111, "\x85"], [115, "\x85"], [116, "\x85"], [118, "\x85"], [119, "\x85"], [122, "\x85"], [123, "\x85"], [125, "\x85"], [126, "\x85"], [129, "\x85"], ":" => [143, "\x85"], ";" => [148, "\x85"], "<" => [151, "\x85"], "=" => [153, "\x85"], ">" => [83, "\x85"], "?" => [10, "\x85"], "@" => [77, "\x860"], "A" => [18, "\x860"], "B" => [77, "\x861"], "C" => [18, "\x861"], "D" => [77, "\x862"], "E" => [18, "\x862"], "F" => [77, "\x86a"], "G" => [18, "\x86a"], "H" => [77, "\x86c"], "I" => [18, "\x86c"], "J" => [77, "\x86e"], "K" => [18, "\x86e"], "L" => [77, "\x86i"], "M" => [18, "\x86i"], "N" => [77, "\x86o"], "O" => [18, "\x86o"], "P" => [77, "\x86s"], "Q" => [18, "\x86s"], "R" => [77, "\x86t"], "S" => [18, "\x86t"], "T" => [0, "\x86 "], "U" => [0, "\x86%"], "V" => [0, "\x86-"], "W" => [0, "\x86."], "X" => [0, "\x86/"], "Y" => [0, "\x863"], "Z" => [0, "\x864"], "[" => [0, "\x865"], "\\" => [0, "\x866"], "]" => [0, "\x867"], "^" => [0, "\x868"], "_" => [0, "\x869"], "`" => [0, "\x86="], "a" => [0, "\x86A"], "b" => [0, "\x86_"], "c" => [0, "\x86b"], "d" => [0, "\x86d"], "e" => [0, "\x86f"], "f" => [0, "\x86g"], "g" => [0, "\x86h"], "h" => [0, "\x86l"], "i" => [0, "\x86m"], "j" => [0, "\x86n"], "k" => [0, "\x86p"], "l" => [0, "\x86r"], "m" => [0, "\x86u"], "n" => [100, "\x86"], "o" => [110, "\x86"], "p" => [111, "\x86"], "q" => [115, "\x86"], "r" => [116, "\x86"], "s" => [118, "\x86"], "t" => [119, "\x86"], "u" => [122, "\x86"], "v" => [123, "\x86"], "w" => [125, "\x86"], "x" => [126, "\x86"], "y" => [129, "\x86"], "z" => [143, "\x86"], "{" => [148, "\x86"], "|" => [151, "\x86"], "}" => [153, "\x86"], "~" => [83, "\x86"], "" => [10, "\x86"], "\x80" => [77, "\x880"], "\x81" => [18, "\x880"], "\x82" => [77, "\x881"], "\x83" => [18, "\x881"], "\x84" => [77, "\x882"], "\x85" => [18, "\x882"], "\x86" => [77, "\x88a"], "\x87" => [18, "\x88a"], "\x88" => [77, "\x88c"], "\x89" => [18, "\x88c"], "\x8a" => [77, "\x88e"], "\x8b" => [18, "\x88e"], "\x8c" => [77, "\x88i"], "\x8d" => [18, "\x88i"], "\x8e" => [77, "\x88o"], "\x8f" => [18, "\x88o"], "\x90" => [77, "\x88s"], "\x91" => [18, "\x88s"], "\x92" => [77, "\x88t"], "\x93" => [18, "\x88t"], "\x94" => [0, "\x88 "], "\x95" => [0, "\x88%"], "\x96" => [0, "\x88-"], "\x97" => [0, "\x88."], "\x98" => [0, "\x88/"], "\x99" => [0, "\x883"], "\x9a" => [0, "\x884"], "\x9b" => [0, "\x885"], "\x9c" => [0, "\x886"], "\x9d" => [0, "\x887"], "\x9e" => [0, "\x888"], "\x9f" => [0, "\x889"], "\xa0" => [0, "\x88="], "\xa1" => [0, "\x88A"], "\xa2" => [0, "\x88_"], "\xa3" => [0, "\x88b"], "\xa4" => [0, "\x88d"], "\xa5" => [0, "\x88f"], "\xa6" => [0, "\x88g"], "\xa7" => [0, "\x88h"], "\xa8" => [0, "\x88l"], "\xa9" => [0, "\x88m"], "\xaa" => [0, "\x88n"], "\xab" => [0, "\x88p"], "\xac" => [0, "\x88r"], "\xad" => [0, "\x88u"], "\xae" => [100, "\x88"], "\xaf" => [110, "\x88"], "\xb0" => [111, "\x88"], "\xb1" => [115, "\x88"], "\xb2" => [116, "\x88"], "\xb3" => [118, "\x88"], "\xb4" => [119, "\x88"], "\xb5" => [122, "\x88"], "\xb6" => [123, "\x88"], "\xb7" => [125, "\x88"], "\xb8" => [126, "\x88"], "\xb9" => [129, "\x88"], "\xba" => [143, "\x88"], "\xbb" => [148, "\x88"], "\xbc" => [151, "\x88"], "\xbd" => [153, "\x88"], "\xbe" => [83, "\x88"], "\xbf" => [10, "\x88"], "\xc0" => [77, "\x920"], "\xc1" => [18, "\x920"], "\xc2" => [77, "\x921"], "\xc3" => [18, "\x921"], "\xc4" => [77, "\x922"], "\xc5" => [18, "\x922"], "\xc6" => [77, "\x92a"], "\xc7" => [18, "\x92a"], "\xc8" => [77, "\x92c"], "\xc9" => [18, "\x92c"], "\xca" => [77, "\x92e"], "\xcb" => [18, "\x92e"], "\xcc" => [77, "\x92i"], "\xcd" => [18, "\x92i"], "\xce" => [77, "\x92o"], "\xcf" => [18, "\x92o"], "\xd0" => [77, "\x92s"], "\xd1" => [18, "\x92s"], "\xd2" => [77, "\x92t"], "\xd3" => [18, "\x92t"], "\xd4" => [0, "\x92 "], "\xd5" => [0, "\x92%"], "\xd6" => [0, "\x92-"], "\xd7" => [0, "\x92."], "\xd8" => [0, "\x92/"], "\xd9" => [0, "\x923"], "\xda" => [0, "\x924"], "\xdb" => [0, "\x925"], "\xdc" => [0, "\x926"], "\xdd" => [0, "\x927"], "\xde" => [0, "\x928"], "\xdf" => [0, "\x929"], "\xe0" => [0, "\x92="], "\xe1" => [0, "\x92A"], "\xe2" => [0, "\x92_"], "\xe3" => [0, "\x92b"], "\xe4" => [0, "\x92d"], "\xe5" => [0, "\x92f"], "\xe6" => [0, "\x92g"], "\xe7" => [0, "\x92h"], "\xe8" => [0, "\x92l"], "\xe9" => [0, "\x92m"], "\xea" => [0, "\x92n"], "\xeb" => [0, "\x92p"], "\xec" => [0, "\x92r"], "\xed" => [0, "\x92u"], "\xee" => [100, "\x92"], "\xef" => [110, "\x92"], "\xf0" => [111, "\x92"], "\xf1" => [115, "\x92"], "\xf2" => [116, "\x92"], "\xf3" => [118, "\x92"], "\xf4" => [119, "\x92"], "\xf5" => [122, "\x92"], "\xf6" => [123, "\x92"], "\xf7" => [125, "\x92"], "\xf8" => [126, "\x92"], "\xf9" => [129, "\x92"], "\xfa" => [143, "\x92"], "\xfb" => [148, "\x92"], "\xfc" => [151, "\x92"], "\xfd" => [153, "\x92"], "\xfe" => [83, "\x92"], "\xff" => [10, "\x92"]], ["\x00" => [94, "\x880"], "\x01" => [76, "\x880"], "\x02" => [104, "\x880"], "\x03" => [16, "\x880"], "\x04" => [94, "\x881"], "\x05" => [76, "\x881"], "\x06" => [104, "\x881"], "\x07" => [16, "\x881"], "\x08" => [94, "\x882"], "\t" => [76, "\x882"], "\n" => [104, "\x882"], "\v" => [16, "\x882"], "\f" => [94, "\x88a"], "\r" => [76, "\x88a"], "\x0e" => [104, "\x88a"], "\x0f" => [16, "\x88a"], "\x10" => [94, "\x88c"], "\x11" => [76, "\x88c"], "\x12" => [104, "\x88c"], "\x13" => [16, "\x88c"], "\x14" => [94, "\x88e"], "\x15" => [76, "\x88e"], "\x16" => [104, "\x88e"], "\x17" => [16, "\x88e"], "\x18" => [94, "\x88i"], "\x19" => [76, "\x88i"], "\x1a" => [104, "\x88i"], "\x1b" => [16, "\x88i"], "\x1c" => [94, "\x88o"], "\x1d" => [76, "\x88o"], "\x1e" => [104, "\x88o"], "\x1f" => [16, "\x88o"], " " => [94, "\x88s"], "!" => [76, "\x88s"], "\"" => [104, "\x88s"], "#" => [16, "\x88s"], "\$" => [94, "\x88t"], "%" => [76, "\x88t"], "&" => [104, "\x88t"], "'" => [16, "\x88t"], "(" => [77, "\x88 "], ")" => [18, "\x88 "], "*" => [77, "\x88%"], "+" => [18, "\x88%"], "," => [77, "\x88-"], "-" => [18, "\x88-"], "." => [77, "\x88."], "/" => [18, "\x88."], [77, "\x88/"], [18, "\x88/"], [77, "\x883"], [18, "\x883"], [77, "\x884"], [18, "\x884"], [77, "\x885"], [18, "\x885"], [77, "\x886"], [18, "\x886"], ":" => [77, "\x887"], ";" => [18, "\x887"], "<" => [77, "\x888"], "=" => [18, "\x888"], ">" => [77, "\x889"], "?" => [18, "\x889"], "@" => [77, "\x88="], "A" => [18, "\x88="], "B" => [77, "\x88A"], "C" => [18, "\x88A"], "D" => [77, "\x88_"], "E" => [18, "\x88_"], "F" => [77, "\x88b"], "G" => [18, "\x88b"], "H" => [77, "\x88d"], "I" => [18, "\x88d"], "J" => [77, "\x88f"], "K" => [18, "\x88f"], "L" => [77, "\x88g"], "M" => [18, "\x88g"], "N" => [77, "\x88h"], "O" => [18, "\x88h"], "P" => [77, "\x88l"], "Q" => [18, "\x88l"], "R" => [77, "\x88m"], "S" => [18, "\x88m"], "T" => [77, "\x88n"], "U" => [18, "\x88n"], "V" => [77, "\x88p"], "W" => [18, "\x88p"], "X" => [77, "\x88r"], "Y" => [18, "\x88r"], "Z" => [77, "\x88u"], "[" => [18, "\x88u"], "\\" => [0, "\x88:"], "]" => [0, "\x88B"], "^" => [0, "\x88C"], "_" => [0, "\x88D"], "`" => [0, "\x88E"], "a" => [0, "\x88F"], "b" => [0, "\x88G"], "c" => [0, "\x88H"], "d" => [0, "\x88I"], "e" => [0, "\x88J"], "f" => [0, "\x88K"], "g" => [0, "\x88L"], "h" => [0, "\x88M"], "i" => [0, "\x88N"], "j" => [0, "\x88O"], "k" => [0, "\x88P"], "l" => [0, "\x88Q"], "m" => [0, "\x88R"], "n" => [0, "\x88S"], "o" => [0, "\x88T"], "p" => [0, "\x88U"], "q" => [0, "\x88V"], "r" => [0, "\x88W"], "s" => [0, "\x88Y"], "t" => [0, "\x88j"], "u" => [0, "\x88k"], "v" => [0, "\x88q"], "w" => [0, "\x88v"], "x" => [0, "\x88w"], "y" => [0, "\x88x"], "z" => [0, "\x88y"], "{" => [0, "\x88z"], "|" => [82, "\x88"], "}" => [87, "\x88"], "~" => [130, "\x88"], "" => [9, "\x88"], "\x80" => [94, "\x920"], "\x81" => [76, "\x920"], "\x82" => [104, "\x920"], "\x83" => [16, "\x920"], "\x84" => [94, "\x921"], "\x85" => [76, "\x921"], "\x86" => [104, "\x921"], "\x87" => [16, "\x921"], "\x88" => [94, "\x922"], "\x89" => [76, "\x922"], "\x8a" => [104, "\x922"], "\x8b" => [16, "\x922"], "\x8c" => [94, "\x92a"], "\x8d" => [76, "\x92a"], "\x8e" => [104, "\x92a"], "\x8f" => [16, "\x92a"], "\x90" => [94, "\x92c"], "\x91" => [76, "\x92c"], "\x92" => [104, "\x92c"], "\x93" => [16, "\x92c"], "\x94" => [94, "\x92e"], "\x95" => [76, "\x92e"], "\x96" => [104, "\x92e"], "\x97" => [16, "\x92e"], "\x98" => [94, "\x92i"], "\x99" => [76, "\x92i"], "\x9a" => [104, "\x92i"], "\x9b" => [16, "\x92i"], "\x9c" => [94, "\x92o"], "\x9d" => [76, "\x92o"], "\x9e" => [104, "\x92o"], "\x9f" => [16, "\x92o"], "\xa0" => [94, "\x92s"], "\xa1" => [76, "\x92s"], "\xa2" => [104, "\x92s"], "\xa3" => [16, "\x92s"], "\xa4" => [94, "\x92t"], "\xa5" => [76, "\x92t"], "\xa6" => [104, "\x92t"], "\xa7" => [16, "\x92t"], "\xa8" => [77, "\x92 "], "\xa9" => [18, "\x92 "], "\xaa" => [77, "\x92%"], "\xab" => [18, "\x92%"], "\xac" => [77, "\x92-"], "\xad" => [18, "\x92-"], "\xae" => [77, "\x92."], "\xaf" => [18, "\x92."], "\xb0" => [77, "\x92/"], "\xb1" => [18, "\x92/"], "\xb2" => [77, "\x923"], "\xb3" => [18, "\x923"], "\xb4" => [77, "\x924"], "\xb5" => [18, "\x924"], "\xb6" => [77, "\x925"], "\xb7" => [18, "\x925"], "\xb8" => [77, "\x926"], "\xb9" => [18, "\x926"], "\xba" => [77, "\x927"], "\xbb" => [18, "\x927"], "\xbc" => [77, "\x928"], "\xbd" => [18, "\x928"], "\xbe" => [77, "\x929"], "\xbf" => [18, "\x929"], "\xc0" => [77, "\x92="], "\xc1" => [18, "\x92="], "\xc2" => [77, "\x92A"], "\xc3" => [18, "\x92A"], "\xc4" => [77, "\x92_"], "\xc5" => [18, "\x92_"], "\xc6" => [77, "\x92b"], "\xc7" => [18, "\x92b"], "\xc8" => [77, "\x92d"], "\xc9" => [18, "\x92d"], "\xca" => [77, "\x92f"], "\xcb" => [18, "\x92f"], "\xcc" => [77, "\x92g"], "\xcd" => [18, "\x92g"], "\xce" => [77, "\x92h"], "\xcf" => [18, "\x92h"], "\xd0" => [77, "\x92l"], "\xd1" => [18, "\x92l"], "\xd2" => [77, "\x92m"], "\xd3" => [18, "\x92m"], "\xd4" => [77, "\x92n"], "\xd5" => [18, "\x92n"], "\xd6" => [77, "\x92p"], "\xd7" => [18, "\x92p"], "\xd8" => [77, "\x92r"], "\xd9" => [18, "\x92r"], "\xda" => [77, "\x92u"], "\xdb" => [18, "\x92u"], "\xdc" => [0, "\x92:"], "\xdd" => [0, "\x92B"], "\xde" => [0, "\x92C"], "\xdf" => [0, "\x92D"], "\xe0" => [0, "\x92E"], "\xe1" => [0, "\x92F"], "\xe2" => [0, "\x92G"], "\xe3" => [0, "\x92H"], "\xe4" => [0, "\x92I"], "\xe5" => [0, "\x92J"], "\xe6" => [0, "\x92K"], "\xe7" => [0, "\x92L"], "\xe8" => [0, "\x92M"], "\xe9" => [0, "\x92N"], "\xea" => [0, "\x92O"], "\xeb" => [0, "\x92P"], "\xec" => [0, "\x92Q"], "\xed" => [0, "\x92R"], "\xee" => [0, "\x92S"], "\xef" => [0, "\x92T"], "\xf0" => [0, "\x92U"], "\xf1" => [0, "\x92V"], "\xf2" => [0, "\x92W"], "\xf3" => [0, "\x92Y"], "\xf4" => [0, "\x92j"], "\xf5" => [0, "\x92k"], "\xf6" => [0, "\x92q"], "\xf7" => [0, "\x92v"], "\xf8" => [0, "\x92w"], "\xf9" => [0, "\x92x"], "\xfa" => [0, "\x92y"], "\xfb" => [0, "\x92z"], "\xfc" => [82, "\x92"], "\xfd" => [87, "\x92"], "\xfe" => [130, "\x92"], "\xff" => [9, "\x92"]], ["\x00" => [94, "\x890"], "\x01" => [76, "\x890"], "\x02" => [104, "\x890"], "\x03" => [16, "\x890"], "\x04" => [94, "\x891"], "\x05" => [76, "\x891"], "\x06" => [104, "\x891"], "\x07" => [16, "\x891"], "\x08" => [94, "\x892"], "\t" => [76, "\x892"], "\n" => [104, "\x892"], "\v" => [16, "\x892"], "\f" => [94, "\x89a"], "\r" => [76, "\x89a"], "\x0e" => [104, "\x89a"], "\x0f" => [16, "\x89a"], "\x10" => [94, "\x89c"], "\x11" => [76, "\x89c"], "\x12" => [104, "\x89c"], "\x13" => [16, "\x89c"], "\x14" => [94, "\x89e"], "\x15" => [76, "\x89e"], "\x16" => [104, "\x89e"], "\x17" => [16, "\x89e"], "\x18" => [94, "\x89i"], "\x19" => [76, "\x89i"], "\x1a" => [104, "\x89i"], "\x1b" => [16, "\x89i"], "\x1c" => [94, "\x89o"], "\x1d" => [76, "\x89o"], "\x1e" => [104, "\x89o"], "\x1f" => [16, "\x89o"], " " => [94, "\x89s"], "!" => [76, "\x89s"], "\"" => [104, "\x89s"], "#" => [16, "\x89s"], "\$" => [94, "\x89t"], "%" => [76, "\x89t"], "&" => [104, "\x89t"], "'" => [16, "\x89t"], "(" => [77, "\x89 "], ")" => [18, "\x89 "], "*" => [77, "\x89%"], "+" => [18, "\x89%"], "," => [77, "\x89-"], "-" => [18, "\x89-"], "." => [77, "\x89."], "/" => [18, "\x89."], [77, "\x89/"], [18, "\x89/"], [77, "\x893"], [18, "\x893"], [77, "\x894"], [18, "\x894"], [77, "\x895"], [18, "\x895"], [77, "\x896"], [18, "\x896"], ":" => [77, "\x897"], ";" => [18, "\x897"], "<" => [77, "\x898"], "=" => [18, "\x898"], ">" => [77, "\x899"], "?" => [18, "\x899"], "@" => [77, "\x89="], "A" => [18, "\x89="], "B" => [77, "\x89A"], "C" => [18, "\x89A"], "D" => [77, "\x89_"], "E" => [18, "\x89_"], "F" => [77, "\x89b"], "G" => [18, "\x89b"], "H" => [77, "\x89d"], "I" => [18, "\x89d"], "J" => [77, "\x89f"], "K" => [18, "\x89f"], "L" => [77, "\x89g"], "M" => [18, "\x89g"], "N" => [77, "\x89h"], "O" => [18, "\x89h"], "P" => [77, "\x89l"], "Q" => [18, "\x89l"], "R" => [77, "\x89m"], "S" => [18, "\x89m"], "T" => [77, "\x89n"], "U" => [18, "\x89n"], "V" => [77, "\x89p"], "W" => [18, "\x89p"], "X" => [77, "\x89r"], "Y" => [18, "\x89r"], "Z" => [77, "\x89u"], "[" => [18, "\x89u"], "\\" => [0, "\x89:"], "]" => [0, "\x89B"], "^" => [0, "\x89C"], "_" => [0, "\x89D"], "`" => [0, "\x89E"], "a" => [0, "\x89F"], "b" => [0, "\x89G"], "c" => [0, "\x89H"], "d" => [0, "\x89I"], "e" => [0, "\x89J"], "f" => [0, "\x89K"], "g" => [0, "\x89L"], "h" => [0, "\x89M"], "i" => [0, "\x89N"], "j" => [0, "\x89O"], "k" => [0, "\x89P"], "l" => [0, "\x89Q"], "m" => [0, "\x89R"], "n" => [0, "\x89S"], "o" => [0, "\x89T"], "p" => [0, "\x89U"], "q" => [0, "\x89V"], "r" => [0, "\x89W"], "s" => [0, "\x89Y"], "t" => [0, "\x89j"], "u" => [0, "\x89k"], "v" => [0, "\x89q"], "w" => [0, "\x89v"], "x" => [0, "\x89w"], "y" => [0, "\x89x"], "z" => [0, "\x89y"], "{" => [0, "\x89z"], "|" => [82, "\x89"], "}" => [87, "\x89"], "~" => [130, "\x89"], "" => [9, "\x89"], "\x80" => [94, "\x8a0"], "\x81" => [76, "\x8a0"], "\x82" => [104, "\x8a0"], "\x83" => [16, "\x8a0"], "\x84" => [94, "\x8a1"], "\x85" => [76, "\x8a1"], "\x86" => [104, "\x8a1"], "\x87" => [16, "\x8a1"], "\x88" => [94, "\x8a2"], "\x89" => [76, "\x8a2"], "\x8a" => [104, "\x8a2"], "\x8b" => [16, "\x8a2"], "\x8c" => [94, "\x8aa"], "\x8d" => [76, "\x8aa"], "\x8e" => [104, "\x8aa"], "\x8f" => [16, "\x8aa"], "\x90" => [94, "\x8ac"], "\x91" => [76, "\x8ac"], "\x92" => [104, "\x8ac"], "\x93" => [16, "\x8ac"], "\x94" => [94, "\x8ae"], "\x95" => [76, "\x8ae"], "\x96" => [104, "\x8ae"], "\x97" => [16, "\x8ae"], "\x98" => [94, "\x8ai"], "\x99" => [76, "\x8ai"], "\x9a" => [104, "\x8ai"], "\x9b" => [16, "\x8ai"], "\x9c" => [94, "\x8ao"], "\x9d" => [76, "\x8ao"], "\x9e" => [104, "\x8ao"], "\x9f" => [16, "\x8ao"], "\xa0" => [94, "\x8as"], "\xa1" => [76, "\x8as"], "\xa2" => [104, "\x8as"], "\xa3" => [16, "\x8as"], "\xa4" => [94, "\x8at"], "\xa5" => [76, "\x8at"], "\xa6" => [104, "\x8at"], "\xa7" => [16, "\x8at"], "\xa8" => [77, "\x8a "], "\xa9" => [18, "\x8a "], "\xaa" => [77, "\x8a%"], "\xab" => [18, "\x8a%"], "\xac" => [77, "\x8a-"], "\xad" => [18, "\x8a-"], "\xae" => [77, "\x8a."], "\xaf" => [18, "\x8a."], "\xb0" => [77, "\x8a/"], "\xb1" => [18, "\x8a/"], "\xb2" => [77, "\x8a3"], "\xb3" => [18, "\x8a3"], "\xb4" => [77, "\x8a4"], "\xb5" => [18, "\x8a4"], "\xb6" => [77, "\x8a5"], "\xb7" => [18, "\x8a5"], "\xb8" => [77, "\x8a6"], "\xb9" => [18, "\x8a6"], "\xba" => [77, "\x8a7"], "\xbb" => [18, "\x8a7"], "\xbc" => [77, "\x8a8"], "\xbd" => [18, "\x8a8"], "\xbe" => [77, "\x8a9"], "\xbf" => [18, "\x8a9"], "\xc0" => [77, "\x8a="], "\xc1" => [18, "\x8a="], "\xc2" => [77, "\x8aA"], "\xc3" => [18, "\x8aA"], "\xc4" => [77, "\x8a_"], "\xc5" => [18, "\x8a_"], "\xc6" => [77, "\x8ab"], "\xc7" => [18, "\x8ab"], "\xc8" => [77, "\x8ad"], "\xc9" => [18, "\x8ad"], "\xca" => [77, "\x8af"], "\xcb" => [18, "\x8af"], "\xcc" => [77, "\x8ag"], "\xcd" => [18, "\x8ag"], "\xce" => [77, "\x8ah"], "\xcf" => [18, "\x8ah"], "\xd0" => [77, "\x8al"], "\xd1" => [18, "\x8al"], "\xd2" => [77, "\x8am"], "\xd3" => [18, "\x8am"], "\xd4" => [77, "\x8an"], "\xd5" => [18, "\x8an"], "\xd6" => [77, "\x8ap"], "\xd7" => [18, "\x8ap"], "\xd8" => [77, "\x8ar"], "\xd9" => [18, "\x8ar"], "\xda" => [77, "\x8au"], "\xdb" => [18, "\x8au"], "\xdc" => [0, "\x8a:"], "\xdd" => [0, "\x8aB"], "\xde" => [0, "\x8aC"], "\xdf" => [0, "\x8aD"], "\xe0" => [0, "\x8aE"], "\xe1" => [0, "\x8aF"], "\xe2" => [0, "\x8aG"], "\xe3" => [0, "\x8aH"], "\xe4" => [0, "\x8aI"], "\xe5" => [0, "\x8aJ"], "\xe6" => [0, "\x8aK"], "\xe7" => [0, "\x8aL"], "\xe8" => [0, "\x8aM"], "\xe9" => [0, "\x8aN"], "\xea" => [0, "\x8aO"], "\xeb" => [0, "\x8aP"], "\xec" => [0, "\x8aQ"], "\xed" => [0, "\x8aR"], "\xee" => [0, "\x8aS"], "\xef" => [0, "\x8aT"], "\xf0" => [0, "\x8aU"], "\xf1" => [0, "\x8aV"], "\xf2" => [0, "\x8aW"], "\xf3" => [0, "\x8aY"], "\xf4" => [0, "\x8aj"], "\xf5" => [0, "\x8ak"], "\xf6" => [0, "\x8aq"], "\xf7" => [0, "\x8av"], "\xf8" => [0, "\x8aw"], "\xf9" => [0, "\x8ax"], "\xfa" => [0, "\x8ay"], "\xfb" => [0, "\x8az"], "\xfc" => [82, "\x8a"], "\xfd" => [87, "\x8a"], "\xfe" => [130, "\x8a"], "\xff" => [9, "\x8a"]], ["\x00" => [94, "\x8b0"], "\x01" => [76, "\x8b0"], "\x02" => [104, "\x8b0"], "\x03" => [16, "\x8b0"], "\x04" => [94, "\x8b1"], "\x05" => [76, "\x8b1"], "\x06" => [104, "\x8b1"], "\x07" => [16, "\x8b1"], "\x08" => [94, "\x8b2"], "\t" => [76, "\x8b2"], "\n" => [104, "\x8b2"], "\v" => [16, "\x8b2"], "\f" => [94, "\x8ba"], "\r" => [76, "\x8ba"], "\x0e" => [104, "\x8ba"], "\x0f" => [16, "\x8ba"], "\x10" => [94, "\x8bc"], "\x11" => [76, "\x8bc"], "\x12" => [104, "\x8bc"], "\x13" => [16, "\x8bc"], "\x14" => [94, "\x8be"], "\x15" => [76, "\x8be"], "\x16" => [104, "\x8be"], "\x17" => [16, "\x8be"], "\x18" => [94, "\x8bi"], "\x19" => [76, "\x8bi"], "\x1a" => [104, "\x8bi"], "\x1b" => [16, "\x8bi"], "\x1c" => [94, "\x8bo"], "\x1d" => [76, "\x8bo"], "\x1e" => [104, "\x8bo"], "\x1f" => [16, "\x8bo"], " " => [94, "\x8bs"], "!" => [76, "\x8bs"], "\"" => [104, "\x8bs"], "#" => [16, "\x8bs"], "\$" => [94, "\x8bt"], "%" => [76, "\x8bt"], "&" => [104, "\x8bt"], "'" => [16, "\x8bt"], "(" => [77, "\x8b "], ")" => [18, "\x8b "], "*" => [77, "\x8b%"], "+" => [18, "\x8b%"], "," => [77, "\x8b-"], "-" => [18, "\x8b-"], "." => [77, "\x8b."], "/" => [18, "\x8b."], [77, "\x8b/"], [18, "\x8b/"], [77, "\x8b3"], [18, "\x8b3"], [77, "\x8b4"], [18, "\x8b4"], [77, "\x8b5"], [18, "\x8b5"], [77, "\x8b6"], [18, "\x8b6"], ":" => [77, "\x8b7"], ";" => [18, "\x8b7"], "<" => [77, "\x8b8"], "=" => [18, "\x8b8"], ">" => [77, "\x8b9"], "?" => [18, "\x8b9"], "@" => [77, "\x8b="], "A" => [18, "\x8b="], "B" => [77, "\x8bA"], "C" => [18, "\x8bA"], "D" => [77, "\x8b_"], "E" => [18, "\x8b_"], "F" => [77, "\x8bb"], "G" => [18, "\x8bb"], "H" => [77, "\x8bd"], "I" => [18, "\x8bd"], "J" => [77, "\x8bf"], "K" => [18, "\x8bf"], "L" => [77, "\x8bg"], "M" => [18, "\x8bg"], "N" => [77, "\x8bh"], "O" => [18, "\x8bh"], "P" => [77, "\x8bl"], "Q" => [18, "\x8bl"], "R" => [77, "\x8bm"], "S" => [18, "\x8bm"], "T" => [77, "\x8bn"], "U" => [18, "\x8bn"], "V" => [77, "\x8bp"], "W" => [18, "\x8bp"], "X" => [77, "\x8br"], "Y" => [18, "\x8br"], "Z" => [77, "\x8bu"], "[" => [18, "\x8bu"], "\\" => [0, "\x8b:"], "]" => [0, "\x8bB"], "^" => [0, "\x8bC"], "_" => [0, "\x8bD"], "`" => [0, "\x8bE"], "a" => [0, "\x8bF"], "b" => [0, "\x8bG"], "c" => [0, "\x8bH"], "d" => [0, "\x8bI"], "e" => [0, "\x8bJ"], "f" => [0, "\x8bK"], "g" => [0, "\x8bL"], "h" => [0, "\x8bM"], "i" => [0, "\x8bN"], "j" => [0, "\x8bO"], "k" => [0, "\x8bP"], "l" => [0, "\x8bQ"], "m" => [0, "\x8bR"], "n" => [0, "\x8bS"], "o" => [0, "\x8bT"], "p" => [0, "\x8bU"], "q" => [0, "\x8bV"], "r" => [0, "\x8bW"], "s" => [0, "\x8bY"], "t" => [0, "\x8bj"], "u" => [0, "\x8bk"], "v" => [0, "\x8bq"], "w" => [0, "\x8bv"], "x" => [0, "\x8bw"], "y" => [0, "\x8bx"], "z" => [0, "\x8by"], "{" => [0, "\x8bz"], "|" => [82, "\x8b"], "}" => [87, "\x8b"], "~" => [130, "\x8b"], "" => [9, "\x8b"], "\x80" => [94, "\x8c0"], "\x81" => [76, "\x8c0"], "\x82" => [104, "\x8c0"], "\x83" => [16, "\x8c0"], "\x84" => [94, "\x8c1"], "\x85" => [76, "\x8c1"], "\x86" => [104, "\x8c1"], "\x87" => [16, "\x8c1"], "\x88" => [94, "\x8c2"], "\x89" => [76, "\x8c2"], "\x8a" => [104, "\x8c2"], "\x8b" => [16, "\x8c2"], "\x8c" => [94, "\x8ca"], "\x8d" => [76, "\x8ca"], "\x8e" => [104, "\x8ca"], "\x8f" => [16, "\x8ca"], "\x90" => [94, "\x8cc"], "\x91" => [76, "\x8cc"], "\x92" => [104, "\x8cc"], "\x93" => [16, "\x8cc"], "\x94" => [94, "\x8ce"], "\x95" => [76, "\x8ce"], "\x96" => [104, "\x8ce"], "\x97" => [16, "\x8ce"], "\x98" => [94, "\x8ci"], "\x99" => [76, "\x8ci"], "\x9a" => [104, "\x8ci"], "\x9b" => [16, "\x8ci"], "\x9c" => [94, "\x8co"], "\x9d" => [76, "\x8co"], "\x9e" => [104, "\x8co"], "\x9f" => [16, "\x8co"], "\xa0" => [94, "\x8cs"], "\xa1" => [76, "\x8cs"], "\xa2" => [104, "\x8cs"], "\xa3" => [16, "\x8cs"], "\xa4" => [94, "\x8ct"], "\xa5" => [76, "\x8ct"], "\xa6" => [104, "\x8ct"], "\xa7" => [16, "\x8ct"], "\xa8" => [77, "\x8c "], "\xa9" => [18, "\x8c "], "\xaa" => [77, "\x8c%"], "\xab" => [18, "\x8c%"], "\xac" => [77, "\x8c-"], "\xad" => [18, "\x8c-"], "\xae" => [77, "\x8c."], "\xaf" => [18, "\x8c."], "\xb0" => [77, "\x8c/"], "\xb1" => [18, "\x8c/"], "\xb2" => [77, "\x8c3"], "\xb3" => [18, "\x8c3"], "\xb4" => [77, "\x8c4"], "\xb5" => [18, "\x8c4"], "\xb6" => [77, "\x8c5"], "\xb7" => [18, "\x8c5"], "\xb8" => [77, "\x8c6"], "\xb9" => [18, "\x8c6"], "\xba" => [77, "\x8c7"], "\xbb" => [18, "\x8c7"], "\xbc" => [77, "\x8c8"], "\xbd" => [18, "\x8c8"], "\xbe" => [77, "\x8c9"], "\xbf" => [18, "\x8c9"], "\xc0" => [77, "\x8c="], "\xc1" => [18, "\x8c="], "\xc2" => [77, "\x8cA"], "\xc3" => [18, "\x8cA"], "\xc4" => [77, "\x8c_"], "\xc5" => [18, "\x8c_"], "\xc6" => [77, "\x8cb"], "\xc7" => [18, "\x8cb"], "\xc8" => [77, "\x8cd"], "\xc9" => [18, "\x8cd"], "\xca" => [77, "\x8cf"], "\xcb" => [18, "\x8cf"], "\xcc" => [77, "\x8cg"], "\xcd" => [18, "\x8cg"], "\xce" => [77, "\x8ch"], "\xcf" => [18, "\x8ch"], "\xd0" => [77, "\x8cl"], "\xd1" => [18, "\x8cl"], "\xd2" => [77, "\x8cm"], "\xd3" => [18, "\x8cm"], "\xd4" => [77, "\x8cn"], "\xd5" => [18, "\x8cn"], "\xd6" => [77, "\x8cp"], "\xd7" => [18, "\x8cp"], "\xd8" => [77, "\x8cr"], "\xd9" => [18, "\x8cr"], "\xda" => [77, "\x8cu"], "\xdb" => [18, "\x8cu"], "\xdc" => [0, "\x8c:"], "\xdd" => [0, "\x8cB"], "\xde" => [0, "\x8cC"], "\xdf" => [0, "\x8cD"], "\xe0" => [0, "\x8cE"], "\xe1" => [0, "\x8cF"], "\xe2" => [0, "\x8cG"], "\xe3" => [0, "\x8cH"], "\xe4" => [0, "\x8cI"], "\xe5" => [0, "\x8cJ"], "\xe6" => [0, "\x8cK"], "\xe7" => [0, "\x8cL"], "\xe8" => [0, "\x8cM"], "\xe9" => [0, "\x8cN"], "\xea" => [0, "\x8cO"], "\xeb" => [0, "\x8cP"], "\xec" => [0, "\x8cQ"], "\xed" => [0, "\x8cR"], "\xee" => [0, "\x8cS"], "\xef" => [0, "\x8cT"], "\xf0" => [0, "\x8cU"], "\xf1" => [0, "\x8cV"], "\xf2" => [0, "\x8cW"], "\xf3" => [0, "\x8cY"], "\xf4" => [0, "\x8cj"], "\xf5" => [0, "\x8ck"], "\xf6" => [0, "\x8cq"], "\xf7" => [0, "\x8cv"], "\xf8" => [0, "\x8cw"], "\xf9" => [0, "\x8cx"], "\xfa" => [0, "\x8cy"], "\xfb" => [0, "\x8cz"], "\xfc" => [82, "\x8c"], "\xfd" => [87, "\x8c"], "\xfe" => [130, "\x8c"], "\xff" => [9, "\x8c"]], ["\x00" => [77, "\x8b0"], "\x01" => [18, "\x8b0"], "\x02" => [77, "\x8b1"], "\x03" => [18, "\x8b1"], "\x04" => [77, "\x8b2"], "\x05" => [18, "\x8b2"], "\x06" => [77, "\x8ba"], "\x07" => [18, "\x8ba"], "\x08" => [77, "\x8bc"], "\t" => [18, "\x8bc"], "\n" => [77, "\x8be"], "\v" => [18, "\x8be"], "\f" => [77, "\x8bi"], "\r" => [18, "\x8bi"], "\x0e" => [77, "\x8bo"], "\x0f" => [18, "\x8bo"], "\x10" => [77, "\x8bs"], "\x11" => [18, "\x8bs"], "\x12" => [77, "\x8bt"], "\x13" => [18, "\x8bt"], "\x14" => [0, "\x8b "], "\x15" => [0, "\x8b%"], "\x16" => [0, "\x8b-"], "\x17" => [0, "\x8b."], "\x18" => [0, "\x8b/"], "\x19" => [0, "\x8b3"], "\x1a" => [0, "\x8b4"], "\x1b" => [0, "\x8b5"], "\x1c" => [0, "\x8b6"], "\x1d" => [0, "\x8b7"], "\x1e" => [0, "\x8b8"], "\x1f" => [0, "\x8b9"], " " => [0, "\x8b="], "!" => [0, "\x8bA"], "\"" => [0, "\x8b_"], "#" => [0, "\x8bb"], "\$" => [0, "\x8bd"], "%" => [0, "\x8bf"], "&" => [0, "\x8bg"], "'" => [0, "\x8bh"], "(" => [0, "\x8bl"], ")" => [0, "\x8bm"], "*" => [0, "\x8bn"], "+" => [0, "\x8bp"], "," => [0, "\x8br"], "-" => [0, "\x8bu"], "." => [100, "\x8b"], "/" => [110, "\x8b"], [111, "\x8b"], [115, "\x8b"], [116, "\x8b"], [118, "\x8b"], [119, "\x8b"], [122, "\x8b"], [123, "\x8b"], [125, "\x8b"], [126, "\x8b"], [129, "\x8b"], ":" => [143, "\x8b"], ";" => [148, "\x8b"], "<" => [151, "\x8b"], "=" => [153, "\x8b"], ">" => [83, "\x8b"], "?" => [10, "\x8b"], "@" => [77, "\x8c0"], "A" => [18, "\x8c0"], "B" => [77, "\x8c1"], "C" => [18, "\x8c1"], "D" => [77, "\x8c2"], "E" => [18, "\x8c2"], "F" => [77, "\x8ca"], "G" => [18, "\x8ca"], "H" => [77, "\x8cc"], "I" => [18, "\x8cc"], "J" => [77, "\x8ce"], "K" => [18, "\x8ce"], "L" => [77, "\x8ci"], "M" => [18, "\x8ci"], "N" => [77, "\x8co"], "O" => [18, "\x8co"], "P" => [77, "\x8cs"], "Q" => [18, "\x8cs"], "R" => [77, "\x8ct"], "S" => [18, "\x8ct"], "T" => [0, "\x8c "], "U" => [0, "\x8c%"], "V" => [0, "\x8c-"], "W" => [0, "\x8c."], "X" => [0, "\x8c/"], "Y" => [0, "\x8c3"], "Z" => [0, "\x8c4"], "[" => [0, "\x8c5"], "\\" => [0, "\x8c6"], "]" => [0, "\x8c7"], "^" => [0, "\x8c8"], "_" => [0, "\x8c9"], "`" => [0, "\x8c="], "a" => [0, "\x8cA"], "b" => [0, "\x8c_"], "c" => [0, "\x8cb"], "d" => [0, "\x8cd"], "e" => [0, "\x8cf"], "f" => [0, "\x8cg"], "g" => [0, "\x8ch"], "h" => [0, "\x8cl"], "i" => [0, "\x8cm"], "j" => [0, "\x8cn"], "k" => [0, "\x8cp"], "l" => [0, "\x8cr"], "m" => [0, "\x8cu"], "n" => [100, "\x8c"], "o" => [110, "\x8c"], "p" => [111, "\x8c"], "q" => [115, "\x8c"], "r" => [116, "\x8c"], "s" => [118, "\x8c"], "t" => [119, "\x8c"], "u" => [122, "\x8c"], "v" => [123, "\x8c"], "w" => [125, "\x8c"], "x" => [126, "\x8c"], "y" => [129, "\x8c"], "z" => [143, "\x8c"], "{" => [148, "\x8c"], "|" => [151, "\x8c"], "}" => [153, "\x8c"], "~" => [83, "\x8c"], "" => [10, "\x8c"], "\x80" => [77, "\x8d0"], "\x81" => [18, "\x8d0"], "\x82" => [77, "\x8d1"], "\x83" => [18, "\x8d1"], "\x84" => [77, "\x8d2"], "\x85" => [18, "\x8d2"], "\x86" => [77, "\x8da"], "\x87" => [18, "\x8da"], "\x88" => [77, "\x8dc"], "\x89" => [18, "\x8dc"], "\x8a" => [77, "\x8de"], "\x8b" => [18, "\x8de"], "\x8c" => [77, "\x8di"], "\x8d" => [18, "\x8di"], "\x8e" => [77, "\x8do"], "\x8f" => [18, "\x8do"], "\x90" => [77, "\x8ds"], "\x91" => [18, "\x8ds"], "\x92" => [77, "\x8dt"], "\x93" => [18, "\x8dt"], "\x94" => [0, "\x8d "], "\x95" => [0, "\x8d%"], "\x96" => [0, "\x8d-"], "\x97" => [0, "\x8d."], "\x98" => [0, "\x8d/"], "\x99" => [0, "\x8d3"], "\x9a" => [0, "\x8d4"], "\x9b" => [0, "\x8d5"], "\x9c" => [0, "\x8d6"], "\x9d" => [0, "\x8d7"], "\x9e" => [0, "\x8d8"], "\x9f" => [0, "\x8d9"], "\xa0" => [0, "\x8d="], "\xa1" => [0, "\x8dA"], "\xa2" => [0, "\x8d_"], "\xa3" => [0, "\x8db"], "\xa4" => [0, "\x8dd"], "\xa5" => [0, "\x8df"], "\xa6" => [0, "\x8dg"], "\xa7" => [0, "\x8dh"], "\xa8" => [0, "\x8dl"], "\xa9" => [0, "\x8dm"], "\xaa" => [0, "\x8dn"], "\xab" => [0, "\x8dp"], "\xac" => [0, "\x8dr"], "\xad" => [0, "\x8du"], "\xae" => [100, "\x8d"], "\xaf" => [110, "\x8d"], "\xb0" => [111, "\x8d"], "\xb1" => [115, "\x8d"], "\xb2" => [116, "\x8d"], "\xb3" => [118, "\x8d"], "\xb4" => [119, "\x8d"], "\xb5" => [122, "\x8d"], "\xb6" => [123, "\x8d"], "\xb7" => [125, "\x8d"], "\xb8" => [126, "\x8d"], "\xb9" => [129, "\x8d"], "\xba" => [143, "\x8d"], "\xbb" => [148, "\x8d"], "\xbc" => [151, "\x8d"], "\xbd" => [153, "\x8d"], "\xbe" => [83, "\x8d"], "\xbf" => [10, "\x8d"], "\xc0" => [77, "\x8f0"], "\xc1" => [18, "\x8f0"], "\xc2" => [77, "\x8f1"], "\xc3" => [18, "\x8f1"], "\xc4" => [77, "\x8f2"], "\xc5" => [18, "\x8f2"], "\xc6" => [77, "\x8fa"], "\xc7" => [18, "\x8fa"], "\xc8" => [77, "\x8fc"], "\xc9" => [18, "\x8fc"], "\xca" => [77, "\x8fe"], "\xcb" => [18, "\x8fe"], "\xcc" => [77, "\x8fi"], "\xcd" => [18, "\x8fi"], "\xce" => [77, "\x8fo"], "\xcf" => [18, "\x8fo"], "\xd0" => [77, "\x8fs"], "\xd1" => [18, "\x8fs"], "\xd2" => [77, "\x8ft"], "\xd3" => [18, "\x8ft"], "\xd4" => [0, "\x8f "], "\xd5" => [0, "\x8f%"], "\xd6" => [0, "\x8f-"], "\xd7" => [0, "\x8f."], "\xd8" => [0, "\x8f/"], "\xd9" => [0, "\x8f3"], "\xda" => [0, "\x8f4"], "\xdb" => [0, "\x8f5"], "\xdc" => [0, "\x8f6"], "\xdd" => [0, "\x8f7"], "\xde" => [0, "\x8f8"], "\xdf" => [0, "\x8f9"], "\xe0" => [0, "\x8f="], "\xe1" => [0, "\x8fA"], "\xe2" => [0, "\x8f_"], "\xe3" => [0, "\x8fb"], "\xe4" => [0, "\x8fd"], "\xe5" => [0, "\x8ff"], "\xe6" => [0, "\x8fg"], "\xe7" => [0, "\x8fh"], "\xe8" => [0, "\x8fl"], "\xe9" => [0, "\x8fm"], "\xea" => [0, "\x8fn"], "\xeb" => [0, "\x8fp"], "\xec" => [0, "\x8fr"], "\xed" => [0, "\x8fu"], "\xee" => [100, "\x8f"], "\xef" => [110, "\x8f"], "\xf0" => [111, "\x8f"], "\xf1" => [115, "\x8f"], "\xf2" => [116, "\x8f"], "\xf3" => [118, "\x8f"], "\xf4" => [119, "\x8f"], "\xf5" => [122, "\x8f"], "\xf6" => [123, "\x8f"], "\xf7" => [125, "\x8f"], "\xf8" => [126, "\x8f"], "\xf9" => [129, "\x8f"], "\xfa" => [143, "\x8f"], "\xfb" => [148, "\x8f"], "\xfc" => [151, "\x8f"], "\xfd" => [153, "\x8f"], "\xfe" => [83, "\x8f"], "\xff" => [10, "\x8f"]], ["\x00" => [94, "\x8d0"], "\x01" => [76, "\x8d0"], "\x02" => [104, "\x8d0"], "\x03" => [16, "\x8d0"], "\x04" => [94, "\x8d1"], "\x05" => [76, "\x8d1"], "\x06" => [104, "\x8d1"], "\x07" => [16, "\x8d1"], "\x08" => [94, "\x8d2"], "\t" => [76, "\x8d2"], "\n" => [104, "\x8d2"], "\v" => [16, "\x8d2"], "\f" => [94, "\x8da"], "\r" => [76, "\x8da"], "\x0e" => [104, "\x8da"], "\x0f" => [16, "\x8da"], "\x10" => [94, "\x8dc"], "\x11" => [76, "\x8dc"], "\x12" => [104, "\x8dc"], "\x13" => [16, "\x8dc"], "\x14" => [94, "\x8de"], "\x15" => [76, "\x8de"], "\x16" => [104, "\x8de"], "\x17" => [16, "\x8de"], "\x18" => [94, "\x8di"], "\x19" => [76, "\x8di"], "\x1a" => [104, "\x8di"], "\x1b" => [16, "\x8di"], "\x1c" => [94, "\x8do"], "\x1d" => [76, "\x8do"], "\x1e" => [104, "\x8do"], "\x1f" => [16, "\x8do"], " " => [94, "\x8ds"], "!" => [76, "\x8ds"], "\"" => [104, "\x8ds"], "#" => [16, "\x8ds"], "\$" => [94, "\x8dt"], "%" => [76, "\x8dt"], "&" => [104, "\x8dt"], "'" => [16, "\x8dt"], "(" => [77, "\x8d "], ")" => [18, "\x8d "], "*" => [77, "\x8d%"], "+" => [18, "\x8d%"], "," => [77, "\x8d-"], "-" => [18, "\x8d-"], "." => [77, "\x8d."], "/" => [18, "\x8d."], [77, "\x8d/"], [18, "\x8d/"], [77, "\x8d3"], [18, "\x8d3"], [77, "\x8d4"], [18, "\x8d4"], [77, "\x8d5"], [18, "\x8d5"], [77, "\x8d6"], [18, "\x8d6"], ":" => [77, "\x8d7"], ";" => [18, "\x8d7"], "<" => [77, "\x8d8"], "=" => [18, "\x8d8"], ">" => [77, "\x8d9"], "?" => [18, "\x8d9"], "@" => [77, "\x8d="], "A" => [18, "\x8d="], "B" => [77, "\x8dA"], "C" => [18, "\x8dA"], "D" => [77, "\x8d_"], "E" => [18, "\x8d_"], "F" => [77, "\x8db"], "G" => [18, "\x8db"], "H" => [77, "\x8dd"], "I" => [18, "\x8dd"], "J" => [77, "\x8df"], "K" => [18, "\x8df"], "L" => [77, "\x8dg"], "M" => [18, "\x8dg"], "N" => [77, "\x8dh"], "O" => [18, "\x8dh"], "P" => [77, "\x8dl"], "Q" => [18, "\x8dl"], "R" => [77, "\x8dm"], "S" => [18, "\x8dm"], "T" => [77, "\x8dn"], "U" => [18, "\x8dn"], "V" => [77, "\x8dp"], "W" => [18, "\x8dp"], "X" => [77, "\x8dr"], "Y" => [18, "\x8dr"], "Z" => [77, "\x8du"], "[" => [18, "\x8du"], "\\" => [0, "\x8d:"], "]" => [0, "\x8dB"], "^" => [0, "\x8dC"], "_" => [0, "\x8dD"], "`" => [0, "\x8dE"], "a" => [0, "\x8dF"], "b" => [0, "\x8dG"], "c" => [0, "\x8dH"], "d" => [0, "\x8dI"], "e" => [0, "\x8dJ"], "f" => [0, "\x8dK"], "g" => [0, "\x8dL"], "h" => [0, "\x8dM"], "i" => [0, "\x8dN"], "j" => [0, "\x8dO"], "k" => [0, "\x8dP"], "l" => [0, "\x8dQ"], "m" => [0, "\x8dR"], "n" => [0, "\x8dS"], "o" => [0, "\x8dT"], "p" => [0, "\x8dU"], "q" => [0, "\x8dV"], "r" => [0, "\x8dW"], "s" => [0, "\x8dY"], "t" => [0, "\x8dj"], "u" => [0, "\x8dk"], "v" => [0, "\x8dq"], "w" => [0, "\x8dv"], "x" => [0, "\x8dw"], "y" => [0, "\x8dx"], "z" => [0, "\x8dy"], "{" => [0, "\x8dz"], "|" => [82, "\x8d"], "}" => [87, "\x8d"], "~" => [130, "\x8d"], "" => [9, "\x8d"], "\x80" => [94, "\x8f0"], "\x81" => [76, "\x8f0"], "\x82" => [104, "\x8f0"], "\x83" => [16, "\x8f0"], "\x84" => [94, "\x8f1"], "\x85" => [76, "\x8f1"], "\x86" => [104, "\x8f1"], "\x87" => [16, "\x8f1"], "\x88" => [94, "\x8f2"], "\x89" => [76, "\x8f2"], "\x8a" => [104, "\x8f2"], "\x8b" => [16, "\x8f2"], "\x8c" => [94, "\x8fa"], "\x8d" => [76, "\x8fa"], "\x8e" => [104, "\x8fa"], "\x8f" => [16, "\x8fa"], "\x90" => [94, "\x8fc"], "\x91" => [76, "\x8fc"], "\x92" => [104, "\x8fc"], "\x93" => [16, "\x8fc"], "\x94" => [94, "\x8fe"], "\x95" => [76, "\x8fe"], "\x96" => [104, "\x8fe"], "\x97" => [16, "\x8fe"], "\x98" => [94, "\x8fi"], "\x99" => [76, "\x8fi"], "\x9a" => [104, "\x8fi"], "\x9b" => [16, "\x8fi"], "\x9c" => [94, "\x8fo"], "\x9d" => [76, "\x8fo"], "\x9e" => [104, "\x8fo"], "\x9f" => [16, "\x8fo"], "\xa0" => [94, "\x8fs"], "\xa1" => [76, "\x8fs"], "\xa2" => [104, "\x8fs"], "\xa3" => [16, "\x8fs"], "\xa4" => [94, "\x8ft"], "\xa5" => [76, "\x8ft"], "\xa6" => [104, "\x8ft"], "\xa7" => [16, "\x8ft"], "\xa8" => [77, "\x8f "], "\xa9" => [18, "\x8f "], "\xaa" => [77, "\x8f%"], "\xab" => [18, "\x8f%"], "\xac" => [77, "\x8f-"], "\xad" => [18, "\x8f-"], "\xae" => [77, "\x8f."], "\xaf" => [18, "\x8f."], "\xb0" => [77, "\x8f/"], "\xb1" => [18, "\x8f/"], "\xb2" => [77, "\x8f3"], "\xb3" => [18, "\x8f3"], "\xb4" => [77, "\x8f4"], "\xb5" => [18, "\x8f4"], "\xb6" => [77, "\x8f5"], "\xb7" => [18, "\x8f5"], "\xb8" => [77, "\x8f6"], "\xb9" => [18, "\x8f6"], "\xba" => [77, "\x8f7"], "\xbb" => [18, "\x8f7"], "\xbc" => [77, "\x8f8"], "\xbd" => [18, "\x8f8"], "\xbe" => [77, "\x8f9"], "\xbf" => [18, "\x8f9"], "\xc0" => [77, "\x8f="], "\xc1" => [18, "\x8f="], "\xc2" => [77, "\x8fA"], "\xc3" => [18, "\x8fA"], "\xc4" => [77, "\x8f_"], "\xc5" => [18, "\x8f_"], "\xc6" => [77, "\x8fb"], "\xc7" => [18, "\x8fb"], "\xc8" => [77, "\x8fd"], "\xc9" => [18, "\x8fd"], "\xca" => [77, "\x8ff"], "\xcb" => [18, "\x8ff"], "\xcc" => [77, "\x8fg"], "\xcd" => [18, "\x8fg"], "\xce" => [77, "\x8fh"], "\xcf" => [18, "\x8fh"], "\xd0" => [77, "\x8fl"], "\xd1" => [18, "\x8fl"], "\xd2" => [77, "\x8fm"], "\xd3" => [18, "\x8fm"], "\xd4" => [77, "\x8fn"], "\xd5" => [18, "\x8fn"], "\xd6" => [77, "\x8fp"], "\xd7" => [18, "\x8fp"], "\xd8" => [77, "\x8fr"], "\xd9" => [18, "\x8fr"], "\xda" => [77, "\x8fu"], "\xdb" => [18, "\x8fu"], "\xdc" => [0, "\x8f:"], "\xdd" => [0, "\x8fB"], "\xde" => [0, "\x8fC"], "\xdf" => [0, "\x8fD"], "\xe0" => [0, "\x8fE"], "\xe1" => [0, "\x8fF"], "\xe2" => [0, "\x8fG"], "\xe3" => [0, "\x8fH"], "\xe4" => [0, "\x8fI"], "\xe5" => [0, "\x8fJ"], "\xe6" => [0, "\x8fK"], "\xe7" => [0, "\x8fL"], "\xe8" => [0, "\x8fM"], "\xe9" => [0, "\x8fN"], "\xea" => [0, "\x8fO"], "\xeb" => [0, "\x8fP"], "\xec" => [0, "\x8fQ"], "\xed" => [0, "\x8fR"], "\xee" => [0, "\x8fS"], "\xef" => [0, "\x8fT"], "\xf0" => [0, "\x8fU"], "\xf1" => [0, "\x8fV"], "\xf2" => [0, "\x8fW"], "\xf3" => [0, "\x8fY"], "\xf4" => [0, "\x8fj"], "\xf5" => [0, "\x8fk"], "\xf6" => [0, "\x8fq"], "\xf7" => [0, "\x8fv"], "\xf8" => [0, "\x8fw"], "\xf9" => [0, "\x8fx"], "\xfa" => [0, "\x8fy"], "\xfb" => [0, "\x8fz"], "\xfc" => [82, "\x8f"], "\xfd" => [87, "\x8f"], "\xfe" => [130, "\x8f"], "\xff" => [9, "\x8f"]], ["\x00" => [94, "\x900"], "\x01" => [76, "\x900"], "\x02" => [104, "\x900"], "\x03" => [16, "\x900"], "\x04" => [94, "\x901"], "\x05" => [76, "\x901"], "\x06" => [104, "\x901"], "\x07" => [16, "\x901"], "\x08" => [94, "\x902"], "\t" => [76, "\x902"], "\n" => [104, "\x902"], "\v" => [16, "\x902"], "\f" => [94, "\x90a"], "\r" => [76, "\x90a"], "\x0e" => [104, "\x90a"], "\x0f" => [16, "\x90a"], "\x10" => [94, "\x90c"], "\x11" => [76, "\x90c"], "\x12" => [104, "\x90c"], "\x13" => [16, "\x90c"], "\x14" => [94, "\x90e"], "\x15" => [76, "\x90e"], "\x16" => [104, "\x90e"], "\x17" => [16, "\x90e"], "\x18" => [94, "\x90i"], "\x19" => [76, "\x90i"], "\x1a" => [104, "\x90i"], "\x1b" => [16, "\x90i"], "\x1c" => [94, "\x90o"], "\x1d" => [76, "\x90o"], "\x1e" => [104, "\x90o"], "\x1f" => [16, "\x90o"], " " => [94, "\x90s"], "!" => [76, "\x90s"], "\"" => [104, "\x90s"], "#" => [16, "\x90s"], "\$" => [94, "\x90t"], "%" => [76, "\x90t"], "&" => [104, "\x90t"], "'" => [16, "\x90t"], "(" => [77, "\x90 "], ")" => [18, "\x90 "], "*" => [77, "\x90%"], "+" => [18, "\x90%"], "," => [77, "\x90-"], "-" => [18, "\x90-"], "." => [77, "\x90."], "/" => [18, "\x90."], [77, "\x90/"], [18, "\x90/"], [77, "\x903"], [18, "\x903"], [77, "\x904"], [18, "\x904"], [77, "\x905"], [18, "\x905"], [77, "\x906"], [18, "\x906"], ":" => [77, "\x907"], ";" => [18, "\x907"], "<" => [77, "\x908"], "=" => [18, "\x908"], ">" => [77, "\x909"], "?" => [18, "\x909"], "@" => [77, "\x90="], "A" => [18, "\x90="], "B" => [77, "\x90A"], "C" => [18, "\x90A"], "D" => [77, "\x90_"], "E" => [18, "\x90_"], "F" => [77, "\x90b"], "G" => [18, "\x90b"], "H" => [77, "\x90d"], "I" => [18, "\x90d"], "J" => [77, "\x90f"], "K" => [18, "\x90f"], "L" => [77, "\x90g"], "M" => [18, "\x90g"], "N" => [77, "\x90h"], "O" => [18, "\x90h"], "P" => [77, "\x90l"], "Q" => [18, "\x90l"], "R" => [77, "\x90m"], "S" => [18, "\x90m"], "T" => [77, "\x90n"], "U" => [18, "\x90n"], "V" => [77, "\x90p"], "W" => [18, "\x90p"], "X" => [77, "\x90r"], "Y" => [18, "\x90r"], "Z" => [77, "\x90u"], "[" => [18, "\x90u"], "\\" => [0, "\x90:"], "]" => [0, "\x90B"], "^" => [0, "\x90C"], "_" => [0, "\x90D"], "`" => [0, "\x90E"], "a" => [0, "\x90F"], "b" => [0, "\x90G"], "c" => [0, "\x90H"], "d" => [0, "\x90I"], "e" => [0, "\x90J"], "f" => [0, "\x90K"], "g" => [0, "\x90L"], "h" => [0, "\x90M"], "i" => [0, "\x90N"], "j" => [0, "\x90O"], "k" => [0, "\x90P"], "l" => [0, "\x90Q"], "m" => [0, "\x90R"], "n" => [0, "\x90S"], "o" => [0, "\x90T"], "p" => [0, "\x90U"], "q" => [0, "\x90V"], "r" => [0, "\x90W"], "s" => [0, "\x90Y"], "t" => [0, "\x90j"], "u" => [0, "\x90k"], "v" => [0, "\x90q"], "w" => [0, "\x90v"], "x" => [0, "\x90w"], "y" => [0, "\x90x"], "z" => [0, "\x90y"], "{" => [0, "\x90z"], "|" => [82, "\x90"], "}" => [87, "\x90"], "~" => [130, "\x90"], "" => [9, "\x90"], "\x80" => [94, "\x910"], "\x81" => [76, "\x910"], "\x82" => [104, "\x910"], "\x83" => [16, "\x910"], "\x84" => [94, "\x911"], "\x85" => [76, "\x911"], "\x86" => [104, "\x911"], "\x87" => [16, "\x911"], "\x88" => [94, "\x912"], "\x89" => [76, "\x912"], "\x8a" => [104, "\x912"], "\x8b" => [16, "\x912"], "\x8c" => [94, "\x91a"], "\x8d" => [76, "\x91a"], "\x8e" => [104, "\x91a"], "\x8f" => [16, "\x91a"], "\x90" => [94, "\x91c"], "\x91" => [76, "\x91c"], "\x92" => [104, "\x91c"], "\x93" => [16, "\x91c"], "\x94" => [94, "\x91e"], "\x95" => [76, "\x91e"], "\x96" => [104, "\x91e"], "\x97" => [16, "\x91e"], "\x98" => [94, "\x91i"], "\x99" => [76, "\x91i"], "\x9a" => [104, "\x91i"], "\x9b" => [16, "\x91i"], "\x9c" => [94, "\x91o"], "\x9d" => [76, "\x91o"], "\x9e" => [104, "\x91o"], "\x9f" => [16, "\x91o"], "\xa0" => [94, "\x91s"], "\xa1" => [76, "\x91s"], "\xa2" => [104, "\x91s"], "\xa3" => [16, "\x91s"], "\xa4" => [94, "\x91t"], "\xa5" => [76, "\x91t"], "\xa6" => [104, "\x91t"], "\xa7" => [16, "\x91t"], "\xa8" => [77, "\x91 "], "\xa9" => [18, "\x91 "], "\xaa" => [77, "\x91%"], "\xab" => [18, "\x91%"], "\xac" => [77, "\x91-"], "\xad" => [18, "\x91-"], "\xae" => [77, "\x91."], "\xaf" => [18, "\x91."], "\xb0" => [77, "\x91/"], "\xb1" => [18, "\x91/"], "\xb2" => [77, "\x913"], "\xb3" => [18, "\x913"], "\xb4" => [77, "\x914"], "\xb5" => [18, "\x914"], "\xb6" => [77, "\x915"], "\xb7" => [18, "\x915"], "\xb8" => [77, "\x916"], "\xb9" => [18, "\x916"], "\xba" => [77, "\x917"], "\xbb" => [18, "\x917"], "\xbc" => [77, "\x918"], "\xbd" => [18, "\x918"], "\xbe" => [77, "\x919"], "\xbf" => [18, "\x919"], "\xc0" => [77, "\x91="], "\xc1" => [18, "\x91="], "\xc2" => [77, "\x91A"], "\xc3" => [18, "\x91A"], "\xc4" => [77, "\x91_"], "\xc5" => [18, "\x91_"], "\xc6" => [77, "\x91b"], "\xc7" => [18, "\x91b"], "\xc8" => [77, "\x91d"], "\xc9" => [18, "\x91d"], "\xca" => [77, "\x91f"], "\xcb" => [18, "\x91f"], "\xcc" => [77, "\x91g"], "\xcd" => [18, "\x91g"], "\xce" => [77, "\x91h"], "\xcf" => [18, "\x91h"], "\xd0" => [77, "\x91l"], "\xd1" => [18, "\x91l"], "\xd2" => [77, "\x91m"], "\xd3" => [18, "\x91m"], "\xd4" => [77, "\x91n"], "\xd5" => [18, "\x91n"], "\xd6" => [77, "\x91p"], "\xd7" => [18, "\x91p"], "\xd8" => [77, "\x91r"], "\xd9" => [18, "\x91r"], "\xda" => [77, "\x91u"], "\xdb" => [18, "\x91u"], "\xdc" => [0, "\x91:"], "\xdd" => [0, "\x91B"], "\xde" => [0, "\x91C"], "\xdf" => [0, "\x91D"], "\xe0" => [0, "\x91E"], "\xe1" => [0, "\x91F"], "\xe2" => [0, "\x91G"], "\xe3" => [0, "\x91H"], "\xe4" => [0, "\x91I"], "\xe5" => [0, "\x91J"], "\xe6" => [0, "\x91K"], "\xe7" => [0, "\x91L"], "\xe8" => [0, "\x91M"], "\xe9" => [0, "\x91N"], "\xea" => [0, "\x91O"], "\xeb" => [0, "\x91P"], "\xec" => [0, "\x91Q"], "\xed" => [0, "\x91R"], "\xee" => [0, "\x91S"], "\xef" => [0, "\x91T"], "\xf0" => [0, "\x91U"], "\xf1" => [0, "\x91V"], "\xf2" => [0, "\x91W"], "\xf3" => [0, "\x91Y"], "\xf4" => [0, "\x91j"], "\xf5" => [0, "\x91k"], "\xf6" => [0, "\x91q"], "\xf7" => [0, "\x91v"], "\xf8" => [0, "\x91w"], "\xf9" => [0, "\x91x"], "\xfa" => [0, "\x91y"], "\xfb" => [0, "\x91z"], "\xfc" => [82, "\x91"], "\xfd" => [87, "\x91"], "\xfe" => [130, "\x91"], "\xff" => [9, "\x91"]], ["\x00" => [77, "\x900"], "\x01" => [18, "\x900"], "\x02" => [77, "\x901"], "\x03" => [18, "\x901"], "\x04" => [77, "\x902"], "\x05" => [18, "\x902"], "\x06" => [77, "\x90a"], "\x07" => [18, "\x90a"], "\x08" => [77, "\x90c"], "\t" => [18, "\x90c"], "\n" => [77, "\x90e"], "\v" => [18, "\x90e"], "\f" => [77, "\x90i"], "\r" => [18, "\x90i"], "\x0e" => [77, "\x90o"], "\x0f" => [18, "\x90o"], "\x10" => [77, "\x90s"], "\x11" => [18, "\x90s"], "\x12" => [77, "\x90t"], "\x13" => [18, "\x90t"], "\x14" => [0, "\x90 "], "\x15" => [0, "\x90%"], "\x16" => [0, "\x90-"], "\x17" => [0, "\x90."], "\x18" => [0, "\x90/"], "\x19" => [0, "\x903"], "\x1a" => [0, "\x904"], "\x1b" => [0, "\x905"], "\x1c" => [0, "\x906"], "\x1d" => [0, "\x907"], "\x1e" => [0, "\x908"], "\x1f" => [0, "\x909"], " " => [0, "\x90="], "!" => [0, "\x90A"], "\"" => [0, "\x90_"], "#" => [0, "\x90b"], "\$" => [0, "\x90d"], "%" => [0, "\x90f"], "&" => [0, "\x90g"], "'" => [0, "\x90h"], "(" => [0, "\x90l"], ")" => [0, "\x90m"], "*" => [0, "\x90n"], "+" => [0, "\x90p"], "," => [0, "\x90r"], "-" => [0, "\x90u"], "." => [100, "\x90"], "/" => [110, "\x90"], [111, "\x90"], [115, "\x90"], [116, "\x90"], [118, "\x90"], [119, "\x90"], [122, "\x90"], [123, "\x90"], [125, "\x90"], [126, "\x90"], [129, "\x90"], ":" => [143, "\x90"], ";" => [148, "\x90"], "<" => [151, "\x90"], "=" => [153, "\x90"], ">" => [83, "\x90"], "?" => [10, "\x90"], "@" => [77, "\x910"], "A" => [18, "\x910"], "B" => [77, "\x911"], "C" => [18, "\x911"], "D" => [77, "\x912"], "E" => [18, "\x912"], "F" => [77, "\x91a"], "G" => [18, "\x91a"], "H" => [77, "\x91c"], "I" => [18, "\x91c"], "J" => [77, "\x91e"], "K" => [18, "\x91e"], "L" => [77, "\x91i"], "M" => [18, "\x91i"], "N" => [77, "\x91o"], "O" => [18, "\x91o"], "P" => [77, "\x91s"], "Q" => [18, "\x91s"], "R" => [77, "\x91t"], "S" => [18, "\x91t"], "T" => [0, "\x91 "], "U" => [0, "\x91%"], "V" => [0, "\x91-"], "W" => [0, "\x91."], "X" => [0, "\x91/"], "Y" => [0, "\x913"], "Z" => [0, "\x914"], "[" => [0, "\x915"], "\\" => [0, "\x916"], "]" => [0, "\x917"], "^" => [0, "\x918"], "_" => [0, "\x919"], "`" => [0, "\x91="], "a" => [0, "\x91A"], "b" => [0, "\x91_"], "c" => [0, "\x91b"], "d" => [0, "\x91d"], "e" => [0, "\x91f"], "f" => [0, "\x91g"], "g" => [0, "\x91h"], "h" => [0, "\x91l"], "i" => [0, "\x91m"], "j" => [0, "\x91n"], "k" => [0, "\x91p"], "l" => [0, "\x91r"], "m" => [0, "\x91u"], "n" => [100, "\x91"], "o" => [110, "\x91"], "p" => [111, "\x91"], "q" => [115, "\x91"], "r" => [116, "\x91"], "s" => [118, "\x91"], "t" => [119, "\x91"], "u" => [122, "\x91"], "v" => [123, "\x91"], "w" => [125, "\x91"], "x" => [126, "\x91"], "y" => [129, "\x91"], "z" => [143, "\x91"], "{" => [148, "\x91"], "|" => [151, "\x91"], "}" => [153, "\x91"], "~" => [83, "\x91"], "" => [10, "\x91"], "\x80" => [77, "\x940"], "\x81" => [18, "\x940"], "\x82" => [77, "\x941"], "\x83" => [18, "\x941"], "\x84" => [77, "\x942"], "\x85" => [18, "\x942"], "\x86" => [77, "\x94a"], "\x87" => [18, "\x94a"], "\x88" => [77, "\x94c"], "\x89" => [18, "\x94c"], "\x8a" => [77, "\x94e"], "\x8b" => [18, "\x94e"], "\x8c" => [77, "\x94i"], "\x8d" => [18, "\x94i"], "\x8e" => [77, "\x94o"], "\x8f" => [18, "\x94o"], "\x90" => [77, "\x94s"], "\x91" => [18, "\x94s"], "\x92" => [77, "\x94t"], "\x93" => [18, "\x94t"], "\x94" => [0, "\x94 "], "\x95" => [0, "\x94%"], "\x96" => [0, "\x94-"], "\x97" => [0, "\x94."], "\x98" => [0, "\x94/"], "\x99" => [0, "\x943"], "\x9a" => [0, "\x944"], "\x9b" => [0, "\x945"], "\x9c" => [0, "\x946"], "\x9d" => [0, "\x947"], "\x9e" => [0, "\x948"], "\x9f" => [0, "\x949"], "\xa0" => [0, "\x94="], "\xa1" => [0, "\x94A"], "\xa2" => [0, "\x94_"], "\xa3" => [0, "\x94b"], "\xa4" => [0, "\x94d"], "\xa5" => [0, "\x94f"], "\xa6" => [0, "\x94g"], "\xa7" => [0, "\x94h"], "\xa8" => [0, "\x94l"], "\xa9" => [0, "\x94m"], "\xaa" => [0, "\x94n"], "\xab" => [0, "\x94p"], "\xac" => [0, "\x94r"], "\xad" => [0, "\x94u"], "\xae" => [100, "\x94"], "\xaf" => [110, "\x94"], "\xb0" => [111, "\x94"], "\xb1" => [115, "\x94"], "\xb2" => [116, "\x94"], "\xb3" => [118, "\x94"], "\xb4" => [119, "\x94"], "\xb5" => [122, "\x94"], "\xb6" => [123, "\x94"], "\xb7" => [125, "\x94"], "\xb8" => [126, "\x94"], "\xb9" => [129, "\x94"], "\xba" => [143, "\x94"], "\xbb" => [148, "\x94"], "\xbc" => [151, "\x94"], "\xbd" => [153, "\x94"], "\xbe" => [83, "\x94"], "\xbf" => [10, "\x94"], "\xc0" => [77, "\x9f0"], "\xc1" => [18, "\x9f0"], "\xc2" => [77, "\x9f1"], "\xc3" => [18, "\x9f1"], "\xc4" => [77, "\x9f2"], "\xc5" => [18, "\x9f2"], "\xc6" => [77, "\x9fa"], "\xc7" => [18, "\x9fa"], "\xc8" => [77, "\x9fc"], "\xc9" => [18, "\x9fc"], "\xca" => [77, "\x9fe"], "\xcb" => [18, "\x9fe"], "\xcc" => [77, "\x9fi"], "\xcd" => [18, "\x9fi"], "\xce" => [77, "\x9fo"], "\xcf" => [18, "\x9fo"], "\xd0" => [77, "\x9fs"], "\xd1" => [18, "\x9fs"], "\xd2" => [77, "\x9ft"], "\xd3" => [18, "\x9ft"], "\xd4" => [0, "\x9f "], "\xd5" => [0, "\x9f%"], "\xd6" => [0, "\x9f-"], "\xd7" => [0, "\x9f."], "\xd8" => [0, "\x9f/"], "\xd9" => [0, "\x9f3"], "\xda" => [0, "\x9f4"], "\xdb" => [0, "\x9f5"], "\xdc" => [0, "\x9f6"], "\xdd" => [0, "\x9f7"], "\xde" => [0, "\x9f8"], "\xdf" => [0, "\x9f9"], "\xe0" => [0, "\x9f="], "\xe1" => [0, "\x9fA"], "\xe2" => [0, "\x9f_"], "\xe3" => [0, "\x9fb"], "\xe4" => [0, "\x9fd"], "\xe5" => [0, "\x9ff"], "\xe6" => [0, "\x9fg"], "\xe7" => [0, "\x9fh"], "\xe8" => [0, "\x9fl"], "\xe9" => [0, "\x9fm"], "\xea" => [0, "\x9fn"], "\xeb" => [0, "\x9fp"], "\xec" => [0, "\x9fr"], "\xed" => [0, "\x9fu"], "\xee" => [100, "\x9f"], "\xef" => [110, "\x9f"], "\xf0" => [111, "\x9f"], "\xf1" => [115, "\x9f"], "\xf2" => [116, "\x9f"], "\xf3" => [118, "\x9f"], "\xf4" => [119, "\x9f"], "\xf5" => [122, "\x9f"], "\xf6" => [123, "\x9f"], "\xf7" => [125, "\x9f"], "\xf8" => [126, "\x9f"], "\xf9" => [129, "\x9f"], "\xfa" => [143, "\x9f"], "\xfb" => [148, "\x9f"], "\xfc" => [151, "\x9f"], "\xfd" => [153, "\x9f"], "\xfe" => [83, "\x9f"], "\xff" => [10, "\x9f"]], ["\x00" => [94, "\x930"], "\x01" => [76, "\x930"], "\x02" => [104, "\x930"], "\x03" => [16, "\x930"], "\x04" => [94, "\x931"], "\x05" => [76, "\x931"], "\x06" => [104, "\x931"], "\x07" => [16, "\x931"], "\x08" => [94, "\x932"], "\t" => [76, "\x932"], "\n" => [104, "\x932"], "\v" => [16, "\x932"], "\f" => [94, "\x93a"], "\r" => [76, "\x93a"], "\x0e" => [104, "\x93a"], "\x0f" => [16, "\x93a"], "\x10" => [94, "\x93c"], "\x11" => [76, "\x93c"], "\x12" => [104, "\x93c"], "\x13" => [16, "\x93c"], "\x14" => [94, "\x93e"], "\x15" => [76, "\x93e"], "\x16" => [104, "\x93e"], "\x17" => [16, "\x93e"], "\x18" => [94, "\x93i"], "\x19" => [76, "\x93i"], "\x1a" => [104, "\x93i"], "\x1b" => [16, "\x93i"], "\x1c" => [94, "\x93o"], "\x1d" => [76, "\x93o"], "\x1e" => [104, "\x93o"], "\x1f" => [16, "\x93o"], " " => [94, "\x93s"], "!" => [76, "\x93s"], "\"" => [104, "\x93s"], "#" => [16, "\x93s"], "\$" => [94, "\x93t"], "%" => [76, "\x93t"], "&" => [104, "\x93t"], "'" => [16, "\x93t"], "(" => [77, "\x93 "], ")" => [18, "\x93 "], "*" => [77, "\x93%"], "+" => [18, "\x93%"], "," => [77, "\x93-"], "-" => [18, "\x93-"], "." => [77, "\x93."], "/" => [18, "\x93."], [77, "\x93/"], [18, "\x93/"], [77, "\x933"], [18, "\x933"], [77, "\x934"], [18, "\x934"], [77, "\x935"], [18, "\x935"], [77, "\x936"], [18, "\x936"], ":" => [77, "\x937"], ";" => [18, "\x937"], "<" => [77, "\x938"], "=" => [18, "\x938"], ">" => [77, "\x939"], "?" => [18, "\x939"], "@" => [77, "\x93="], "A" => [18, "\x93="], "B" => [77, "\x93A"], "C" => [18, "\x93A"], "D" => [77, "\x93_"], "E" => [18, "\x93_"], "F" => [77, "\x93b"], "G" => [18, "\x93b"], "H" => [77, "\x93d"], "I" => [18, "\x93d"], "J" => [77, "\x93f"], "K" => [18, "\x93f"], "L" => [77, "\x93g"], "M" => [18, "\x93g"], "N" => [77, "\x93h"], "O" => [18, "\x93h"], "P" => [77, "\x93l"], "Q" => [18, "\x93l"], "R" => [77, "\x93m"], "S" => [18, "\x93m"], "T" => [77, "\x93n"], "U" => [18, "\x93n"], "V" => [77, "\x93p"], "W" => [18, "\x93p"], "X" => [77, "\x93r"], "Y" => [18, "\x93r"], "Z" => [77, "\x93u"], "[" => [18, "\x93u"], "\\" => [0, "\x93:"], "]" => [0, "\x93B"], "^" => [0, "\x93C"], "_" => [0, "\x93D"], "`" => [0, "\x93E"], "a" => [0, "\x93F"], "b" => [0, "\x93G"], "c" => [0, "\x93H"], "d" => [0, "\x93I"], "e" => [0, "\x93J"], "f" => [0, "\x93K"], "g" => [0, "\x93L"], "h" => [0, "\x93M"], "i" => [0, "\x93N"], "j" => [0, "\x93O"], "k" => [0, "\x93P"], "l" => [0, "\x93Q"], "m" => [0, "\x93R"], "n" => [0, "\x93S"], "o" => [0, "\x93T"], "p" => [0, "\x93U"], "q" => [0, "\x93V"], "r" => [0, "\x93W"], "s" => [0, "\x93Y"], "t" => [0, "\x93j"], "u" => [0, "\x93k"], "v" => [0, "\x93q"], "w" => [0, "\x93v"], "x" => [0, "\x93w"], "y" => [0, "\x93x"], "z" => [0, "\x93y"], "{" => [0, "\x93z"], "|" => [82, "\x93"], "}" => [87, "\x93"], "~" => [130, "\x93"], "" => [9, "\x93"], "\x80" => [94, "\x950"], "\x81" => [76, "\x950"], "\x82" => [104, "\x950"], "\x83" => [16, "\x950"], "\x84" => [94, "\x951"], "\x85" => [76, "\x951"], "\x86" => [104, "\x951"], "\x87" => [16, "\x951"], "\x88" => [94, "\x952"], "\x89" => [76, "\x952"], "\x8a" => [104, "\x952"], "\x8b" => [16, "\x952"], "\x8c" => [94, "\x95a"], "\x8d" => [76, "\x95a"], "\x8e" => [104, "\x95a"], "\x8f" => [16, "\x95a"], "\x90" => [94, "\x95c"], "\x91" => [76, "\x95c"], "\x92" => [104, "\x95c"], "\x93" => [16, "\x95c"], "\x94" => [94, "\x95e"], "\x95" => [76, "\x95e"], "\x96" => [104, "\x95e"], "\x97" => [16, "\x95e"], "\x98" => [94, "\x95i"], "\x99" => [76, "\x95i"], "\x9a" => [104, "\x95i"], "\x9b" => [16, "\x95i"], "\x9c" => [94, "\x95o"], "\x9d" => [76, "\x95o"], "\x9e" => [104, "\x95o"], "\x9f" => [16, "\x95o"], "\xa0" => [94, "\x95s"], "\xa1" => [76, "\x95s"], "\xa2" => [104, "\x95s"], "\xa3" => [16, "\x95s"], "\xa4" => [94, "\x95t"], "\xa5" => [76, "\x95t"], "\xa6" => [104, "\x95t"], "\xa7" => [16, "\x95t"], "\xa8" => [77, "\x95 "], "\xa9" => [18, "\x95 "], "\xaa" => [77, "\x95%"], "\xab" => [18, "\x95%"], "\xac" => [77, "\x95-"], "\xad" => [18, "\x95-"], "\xae" => [77, "\x95."], "\xaf" => [18, "\x95."], "\xb0" => [77, "\x95/"], "\xb1" => [18, "\x95/"], "\xb2" => [77, "\x953"], "\xb3" => [18, "\x953"], "\xb4" => [77, "\x954"], "\xb5" => [18, "\x954"], "\xb6" => [77, "\x955"], "\xb7" => [18, "\x955"], "\xb8" => [77, "\x956"], "\xb9" => [18, "\x956"], "\xba" => [77, "\x957"], "\xbb" => [18, "\x957"], "\xbc" => [77, "\x958"], "\xbd" => [18, "\x958"], "\xbe" => [77, "\x959"], "\xbf" => [18, "\x959"], "\xc0" => [77, "\x95="], "\xc1" => [18, "\x95="], "\xc2" => [77, "\x95A"], "\xc3" => [18, "\x95A"], "\xc4" => [77, "\x95_"], "\xc5" => [18, "\x95_"], "\xc6" => [77, "\x95b"], "\xc7" => [18, "\x95b"], "\xc8" => [77, "\x95d"], "\xc9" => [18, "\x95d"], "\xca" => [77, "\x95f"], "\xcb" => [18, "\x95f"], "\xcc" => [77, "\x95g"], "\xcd" => [18, "\x95g"], "\xce" => [77, "\x95h"], "\xcf" => [18, "\x95h"], "\xd0" => [77, "\x95l"], "\xd1" => [18, "\x95l"], "\xd2" => [77, "\x95m"], "\xd3" => [18, "\x95m"], "\xd4" => [77, "\x95n"], "\xd5" => [18, "\x95n"], "\xd6" => [77, "\x95p"], "\xd7" => [18, "\x95p"], "\xd8" => [77, "\x95r"], "\xd9" => [18, "\x95r"], "\xda" => [77, "\x95u"], "\xdb" => [18, "\x95u"], "\xdc" => [0, "\x95:"], "\xdd" => [0, "\x95B"], "\xde" => [0, "\x95C"], "\xdf" => [0, "\x95D"], "\xe0" => [0, "\x95E"], "\xe1" => [0, "\x95F"], "\xe2" => [0, "\x95G"], "\xe3" => [0, "\x95H"], "\xe4" => [0, "\x95I"], "\xe5" => [0, "\x95J"], "\xe6" => [0, "\x95K"], "\xe7" => [0, "\x95L"], "\xe8" => [0, "\x95M"], "\xe9" => [0, "\x95N"], "\xea" => [0, "\x95O"], "\xeb" => [0, "\x95P"], "\xec" => [0, "\x95Q"], "\xed" => [0, "\x95R"], "\xee" => [0, "\x95S"], "\xef" => [0, "\x95T"], "\xf0" => [0, "\x95U"], "\xf1" => [0, "\x95V"], "\xf2" => [0, "\x95W"], "\xf3" => [0, "\x95Y"], "\xf4" => [0, "\x95j"], "\xf5" => [0, "\x95k"], "\xf6" => [0, "\x95q"], "\xf7" => [0, "\x95v"], "\xf8" => [0, "\x95w"], "\xf9" => [0, "\x95x"], "\xfa" => [0, "\x95y"], "\xfb" => [0, "\x95z"], "\xfc" => [82, "\x95"], "\xfd" => [87, "\x95"], "\xfe" => [130, "\x95"], "\xff" => [9, "\x95"]], ["\x00" => [77, "\x930"], "\x01" => [18, "\x930"], "\x02" => [77, "\x931"], "\x03" => [18, "\x931"], "\x04" => [77, "\x932"], "\x05" => [18, "\x932"], "\x06" => [77, "\x93a"], "\x07" => [18, "\x93a"], "\x08" => [77, "\x93c"], "\t" => [18, "\x93c"], "\n" => [77, "\x93e"], "\v" => [18, "\x93e"], "\f" => [77, "\x93i"], "\r" => [18, "\x93i"], "\x0e" => [77, "\x93o"], "\x0f" => [18, "\x93o"], "\x10" => [77, "\x93s"], "\x11" => [18, "\x93s"], "\x12" => [77, "\x93t"], "\x13" => [18, "\x93t"], "\x14" => [0, "\x93 "], "\x15" => [0, "\x93%"], "\x16" => [0, "\x93-"], "\x17" => [0, "\x93."], "\x18" => [0, "\x93/"], "\x19" => [0, "\x933"], "\x1a" => [0, "\x934"], "\x1b" => [0, "\x935"], "\x1c" => [0, "\x936"], "\x1d" => [0, "\x937"], "\x1e" => [0, "\x938"], "\x1f" => [0, "\x939"], " " => [0, "\x93="], "!" => [0, "\x93A"], "\"" => [0, "\x93_"], "#" => [0, "\x93b"], "\$" => [0, "\x93d"], "%" => [0, "\x93f"], "&" => [0, "\x93g"], "'" => [0, "\x93h"], "(" => [0, "\x93l"], ")" => [0, "\x93m"], "*" => [0, "\x93n"], "+" => [0, "\x93p"], "," => [0, "\x93r"], "-" => [0, "\x93u"], "." => [100, "\x93"], "/" => [110, "\x93"], [111, "\x93"], [115, "\x93"], [116, "\x93"], [118, "\x93"], [119, "\x93"], [122, "\x93"], [123, "\x93"], [125, "\x93"], [126, "\x93"], [129, "\x93"], ":" => [143, "\x93"], ";" => [148, "\x93"], "<" => [151, "\x93"], "=" => [153, "\x93"], ">" => [83, "\x93"], "?" => [10, "\x93"], "@" => [77, "\x950"], "A" => [18, "\x950"], "B" => [77, "\x951"], "C" => [18, "\x951"], "D" => [77, "\x952"], "E" => [18, "\x952"], "F" => [77, "\x95a"], "G" => [18, "\x95a"], "H" => [77, "\x95c"], "I" => [18, "\x95c"], "J" => [77, "\x95e"], "K" => [18, "\x95e"], "L" => [77, "\x95i"], "M" => [18, "\x95i"], "N" => [77, "\x95o"], "O" => [18, "\x95o"], "P" => [77, "\x95s"], "Q" => [18, "\x95s"], "R" => [77, "\x95t"], "S" => [18, "\x95t"], "T" => [0, "\x95 "], "U" => [0, "\x95%"], "V" => [0, "\x95-"], "W" => [0, "\x95."], "X" => [0, "\x95/"], "Y" => [0, "\x953"], "Z" => [0, "\x954"], "[" => [0, "\x955"], "\\" => [0, "\x956"], "]" => [0, "\x957"], "^" => [0, "\x958"], "_" => [0, "\x959"], "`" => [0, "\x95="], "a" => [0, "\x95A"], "b" => [0, "\x95_"], "c" => [0, "\x95b"], "d" => [0, "\x95d"], "e" => [0, "\x95f"], "f" => [0, "\x95g"], "g" => [0, "\x95h"], "h" => [0, "\x95l"], "i" => [0, "\x95m"], "j" => [0, "\x95n"], "k" => [0, "\x95p"], "l" => [0, "\x95r"], "m" => [0, "\x95u"], "n" => [100, "\x95"], "o" => [110, "\x95"], "p" => [111, "\x95"], "q" => [115, "\x95"], "r" => [116, "\x95"], "s" => [118, "\x95"], "t" => [119, "\x95"], "u" => [122, "\x95"], "v" => [123, "\x95"], "w" => [125, "\x95"], "x" => [126, "\x95"], "y" => [129, "\x95"], "z" => [143, "\x95"], "{" => [148, "\x95"], "|" => [151, "\x95"], "}" => [153, "\x95"], "~" => [83, "\x95"], "" => [10, "\x95"], "\x80" => [77, "\x960"], "\x81" => [18, "\x960"], "\x82" => [77, "\x961"], "\x83" => [18, "\x961"], "\x84" => [77, "\x962"], "\x85" => [18, "\x962"], "\x86" => [77, "\x96a"], "\x87" => [18, "\x96a"], "\x88" => [77, "\x96c"], "\x89" => [18, "\x96c"], "\x8a" => [77, "\x96e"], "\x8b" => [18, "\x96e"], "\x8c" => [77, "\x96i"], "\x8d" => [18, "\x96i"], "\x8e" => [77, "\x96o"], "\x8f" => [18, "\x96o"], "\x90" => [77, "\x96s"], "\x91" => [18, "\x96s"], "\x92" => [77, "\x96t"], "\x93" => [18, "\x96t"], "\x94" => [0, "\x96 "], "\x95" => [0, "\x96%"], "\x96" => [0, "\x96-"], "\x97" => [0, "\x96."], "\x98" => [0, "\x96/"], "\x99" => [0, "\x963"], "\x9a" => [0, "\x964"], "\x9b" => [0, "\x965"], "\x9c" => [0, "\x966"], "\x9d" => [0, "\x967"], "\x9e" => [0, "\x968"], "\x9f" => [0, "\x969"], "\xa0" => [0, "\x96="], "\xa1" => [0, "\x96A"], "\xa2" => [0, "\x96_"], "\xa3" => [0, "\x96b"], "\xa4" => [0, "\x96d"], "\xa5" => [0, "\x96f"], "\xa6" => [0, "\x96g"], "\xa7" => [0, "\x96h"], "\xa8" => [0, "\x96l"], "\xa9" => [0, "\x96m"], "\xaa" => [0, "\x96n"], "\xab" => [0, "\x96p"], "\xac" => [0, "\x96r"], "\xad" => [0, "\x96u"], "\xae" => [100, "\x96"], "\xaf" => [110, "\x96"], "\xb0" => [111, "\x96"], "\xb1" => [115, "\x96"], "\xb2" => [116, "\x96"], "\xb3" => [118, "\x96"], "\xb4" => [119, "\x96"], "\xb5" => [122, "\x96"], "\xb6" => [123, "\x96"], "\xb7" => [125, "\x96"], "\xb8" => [126, "\x96"], "\xb9" => [129, "\x96"], "\xba" => [143, "\x96"], "\xbb" => [148, "\x96"], "\xbc" => [151, "\x96"], "\xbd" => [153, "\x96"], "\xbe" => [83, "\x96"], "\xbf" => [10, "\x96"], "\xc0" => [77, "\x970"], "\xc1" => [18, "\x970"], "\xc2" => [77, "\x971"], "\xc3" => [18, "\x971"], "\xc4" => [77, "\x972"], "\xc5" => [18, "\x972"], "\xc6" => [77, "\x97a"], "\xc7" => [18, "\x97a"], "\xc8" => [77, "\x97c"], "\xc9" => [18, "\x97c"], "\xca" => [77, "\x97e"], "\xcb" => [18, "\x97e"], "\xcc" => [77, "\x97i"], "\xcd" => [18, "\x97i"], "\xce" => [77, "\x97o"], "\xcf" => [18, "\x97o"], "\xd0" => [77, "\x97s"], "\xd1" => [18, "\x97s"], "\xd2" => [77, "\x97t"], "\xd3" => [18, "\x97t"], "\xd4" => [0, "\x97 "], "\xd5" => [0, "\x97%"], "\xd6" => [0, "\x97-"], "\xd7" => [0, "\x97."], "\xd8" => [0, "\x97/"], "\xd9" => [0, "\x973"], "\xda" => [0, "\x974"], "\xdb" => [0, "\x975"], "\xdc" => [0, "\x976"], "\xdd" => [0, "\x977"], "\xde" => [0, "\x978"], "\xdf" => [0, "\x979"], "\xe0" => [0, "\x97="], "\xe1" => [0, "\x97A"], "\xe2" => [0, "\x97_"], "\xe3" => [0, "\x97b"], "\xe4" => [0, "\x97d"], "\xe5" => [0, "\x97f"], "\xe6" => [0, "\x97g"], "\xe7" => [0, "\x97h"], "\xe8" => [0, "\x97l"], "\xe9" => [0, "\x97m"], "\xea" => [0, "\x97n"], "\xeb" => [0, "\x97p"], "\xec" => [0, "\x97r"], "\xed" => [0, "\x97u"], "\xee" => [100, "\x97"], "\xef" => [110, "\x97"], "\xf0" => [111, "\x97"], "\xf1" => [115, "\x97"], "\xf2" => [116, "\x97"], "\xf3" => [118, "\x97"], "\xf4" => [119, "\x97"], "\xf5" => [122, "\x97"], "\xf6" => [123, "\x97"], "\xf7" => [125, "\x97"], "\xf8" => [126, "\x97"], "\xf9" => [129, "\x97"], "\xfa" => [143, "\x97"], "\xfb" => [148, "\x97"], "\xfc" => [151, "\x97"], "\xfd" => [153, "\x97"], "\xfe" => [83, "\x97"], "\xff" => [10, "\x97"]], ["\x00" => [0, "\x930"], "\x01" => [0, "\x931"], "\x02" => [0, "\x932"], "\x03" => [0, "\x93a"], "\x04" => [0, "\x93c"], "\x05" => [0, "\x93e"], "\x06" => [0, "\x93i"], "\x07" => [0, "\x93o"], "\x08" => [0, "\x93s"], "\t" => [0, "\x93t"], "\n" => [73, "\x93"], "\v" => [88, "\x93"], "\f" => [89, "\x93"], "\r" => [96, "\x93"], "\x0e" => [97, "\x93"], "\x0f" => [99, "\x93"], "\x10" => [106, "\x93"], "\x11" => [136, "\x93"], "\x12" => [139, "\x93"], "\x13" => [141, "\x93"], "\x14" => [145, "\x93"], "\x15" => [147, "\x93"], "\x16" => [149, "\x93"], "\x17" => [101, "\x93"], "\x18" => [112, "\x93"], "\x19" => [117, "\x93"], "\x1a" => [120, "\x93"], "\x1b" => [124, "\x93"], "\x1c" => [127, "\x93"], "\x1d" => [144, "\x93"], "\x1e" => [152, "\x93"], "\x1f" => [11, "\x93"], " " => [0, "\x950"], "!" => [0, "\x951"], "\"" => [0, "\x952"], "#" => [0, "\x95a"], "\$" => [0, "\x95c"], "%" => [0, "\x95e"], "&" => [0, "\x95i"], "'" => [0, "\x95o"], "(" => [0, "\x95s"], ")" => [0, "\x95t"], "*" => [73, "\x95"], "+" => [88, "\x95"], "," => [89, "\x95"], "-" => [96, "\x95"], "." => [97, "\x95"], "/" => [99, "\x95"], [106, "\x95"], [136, "\x95"], [139, "\x95"], [141, "\x95"], [145, "\x95"], [147, "\x95"], [149, "\x95"], [101, "\x95"], [112, "\x95"], [117, "\x95"], ":" => [120, "\x95"], ";" => [124, "\x95"], "<" => [127, "\x95"], "=" => [144, "\x95"], ">" => [152, "\x95"], "?" => [11, "\x95"], "@" => [0, "\x960"], "A" => [0, "\x961"], "B" => [0, "\x962"], "C" => [0, "\x96a"], "D" => [0, "\x96c"], "E" => [0, "\x96e"], "F" => [0, "\x96i"], "G" => [0, "\x96o"], "H" => [0, "\x96s"], "I" => [0, "\x96t"], "J" => [73, "\x96"], "K" => [88, "\x96"], "L" => [89, "\x96"], "M" => [96, "\x96"], "N" => [97, "\x96"], "O" => [99, "\x96"], "P" => [106, "\x96"], "Q" => [136, "\x96"], "R" => [139, "\x96"], "S" => [141, "\x96"], "T" => [145, "\x96"], "U" => [147, "\x96"], "V" => [149, "\x96"], "W" => [101, "\x96"], "X" => [112, "\x96"], "Y" => [117, "\x96"], "Z" => [120, "\x96"], "[" => [124, "\x96"], "\\" => [127, "\x96"], "]" => [144, "\x96"], "^" => [152, "\x96"], "_" => [11, "\x96"], "`" => [0, "\x970"], "a" => [0, "\x971"], "b" => [0, "\x972"], "c" => [0, "\x97a"], "d" => [0, "\x97c"], "e" => [0, "\x97e"], "f" => [0, "\x97i"], "g" => [0, "\x97o"], "h" => [0, "\x97s"], "i" => [0, "\x97t"], "j" => [73, "\x97"], "k" => [88, "\x97"], "l" => [89, "\x97"], "m" => [96, "\x97"], "n" => [97, "\x97"], "o" => [99, "\x97"], "p" => [106, "\x97"], "q" => [136, "\x97"], "r" => [139, "\x97"], "s" => [141, "\x97"], "t" => [145, "\x97"], "u" => [147, "\x97"], "v" => [149, "\x97"], "w" => [101, "\x97"], "x" => [112, "\x97"], "y" => [117, "\x97"], "z" => [120, "\x97"], "{" => [124, "\x97"], "|" => [127, "\x97"], "}" => [144, "\x97"], "~" => [152, "\x97"], "" => [11, "\x97"], "\x80" => [0, "\x980"], "\x81" => [0, "\x981"], "\x82" => [0, "\x982"], "\x83" => [0, "\x98a"], "\x84" => [0, "\x98c"], "\x85" => [0, "\x98e"], "\x86" => [0, "\x98i"], "\x87" => [0, "\x98o"], "\x88" => [0, "\x98s"], "\x89" => [0, "\x98t"], "\x8a" => [73, "\x98"], "\x8b" => [88, "\x98"], "\x8c" => [89, "\x98"], "\x8d" => [96, "\x98"], "\x8e" => [97, "\x98"], "\x8f" => [99, "\x98"], "\x90" => [106, "\x98"], "\x91" => [136, "\x98"], "\x92" => [139, "\x98"], "\x93" => [141, "\x98"], "\x94" => [145, "\x98"], "\x95" => [147, "\x98"], "\x96" => [149, "\x98"], "\x97" => [101, "\x98"], "\x98" => [112, "\x98"], "\x99" => [117, "\x98"], "\x9a" => [120, "\x98"], "\x9b" => [124, "\x98"], "\x9c" => [127, "\x98"], "\x9d" => [144, "\x98"], "\x9e" => [152, "\x98"], "\x9f" => [11, "\x98"], "\xa0" => [0, "\x9b0"], "\xa1" => [0, "\x9b1"], "\xa2" => [0, "\x9b2"], "\xa3" => [0, "\x9ba"], "\xa4" => [0, "\x9bc"], "\xa5" => [0, "\x9be"], "\xa6" => [0, "\x9bi"], "\xa7" => [0, "\x9bo"], "\xa8" => [0, "\x9bs"], "\xa9" => [0, "\x9bt"], "\xaa" => [73, "\x9b"], "\xab" => [88, "\x9b"], "\xac" => [89, "\x9b"], "\xad" => [96, "\x9b"], "\xae" => [97, "\x9b"], "\xaf" => [99, "\x9b"], "\xb0" => [106, "\x9b"], "\xb1" => [136, "\x9b"], "\xb2" => [139, "\x9b"], "\xb3" => [141, "\x9b"], "\xb4" => [145, "\x9b"], "\xb5" => [147, "\x9b"], "\xb6" => [149, "\x9b"], "\xb7" => [101, "\x9b"], "\xb8" => [112, "\x9b"], "\xb9" => [117, "\x9b"], "\xba" => [120, "\x9b"], "\xbb" => [124, "\x9b"], "\xbc" => [127, "\x9b"], "\xbd" => [144, "\x9b"], "\xbe" => [152, "\x9b"], "\xbf" => [11, "\x9b"], "\xc0" => [0, "\x9d0"], "\xc1" => [0, "\x9d1"], "\xc2" => [0, "\x9d2"], "\xc3" => [0, "\x9da"], "\xc4" => [0, "\x9dc"], "\xc5" => [0, "\x9de"], "\xc6" => [0, "\x9di"], "\xc7" => [0, "\x9do"], "\xc8" => [0, "\x9ds"], "\xc9" => [0, "\x9dt"], "\xca" => [73, "\x9d"], "\xcb" => [88, "\x9d"], "\xcc" => [89, "\x9d"], "\xcd" => [96, "\x9d"], "\xce" => [97, "\x9d"], "\xcf" => [99, "\x9d"], "\xd0" => [106, "\x9d"], "\xd1" => [136, "\x9d"], "\xd2" => [139, "\x9d"], "\xd3" => [141, "\x9d"], "\xd4" => [145, "\x9d"], "\xd5" => [147, "\x9d"], "\xd6" => [149, "\x9d"], "\xd7" => [101, "\x9d"], "\xd8" => [112, "\x9d"], "\xd9" => [117, "\x9d"], "\xda" => [120, "\x9d"], "\xdb" => [124, "\x9d"], "\xdc" => [127, "\x9d"], "\xdd" => [144, "\x9d"], "\xde" => [152, "\x9d"], "\xdf" => [11, "\x9d"], "\xe0" => [0, "\x9e0"], "\xe1" => [0, "\x9e1"], "\xe2" => [0, "\x9e2"], "\xe3" => [0, "\x9ea"], "\xe4" => [0, "\x9ec"], "\xe5" => [0, "\x9ee"], "\xe6" => [0, "\x9ei"], "\xe7" => [0, "\x9eo"], "\xe8" => [0, "\x9es"], "\xe9" => [0, "\x9et"], "\xea" => [73, "\x9e"], "\xeb" => [88, "\x9e"], "\xec" => [89, "\x9e"], "\xed" => [96, "\x9e"], "\xee" => [97, "\x9e"], "\xef" => [99, "\x9e"], "\xf0" => [106, "\x9e"], "\xf1" => [136, "\x9e"], "\xf2" => [139, "\x9e"], "\xf3" => [141, "\x9e"], "\xf4" => [145, "\x9e"], "\xf5" => [147, "\x9e"], "\xf6" => [149, "\x9e"], "\xf7" => [101, "\x9e"], "\xf8" => [112, "\x9e"], "\xf9" => [117, "\x9e"], "\xfa" => [120, "\x9e"], "\xfb" => [124, "\x9e"], "\xfc" => [127, "\x9e"], "\xfd" => [144, "\x9e"], "\xfe" => [152, "\x9e"], "\xff" => [11, "\x9e"]], ["\x00" => [92, "\x93"], "\x01" => [95, "\x93"], "\x02" => [137, "\x93"], "\x03" => [142, "\x93"], "\x04" => [150, "\x93"], "\x05" => [74, "\x93"], "\x06" => [90, "\x93"], "\x07" => [98, "\x93"], "\x08" => [107, "\x93"], "\t" => [140, "\x93"], "\n" => [146, "\x93"], "\v" => [102, "\x93"], "\f" => [113, "\x93"], "\r" => [121, "\x93"], "\x0e" => [128, "\x93"], "\x0f" => [12, "\x93"], "\x10" => [92, "\x95"], "\x11" => [95, "\x95"], "\x12" => [137, "\x95"], "\x13" => [142, "\x95"], "\x14" => [150, "\x95"], "\x15" => [74, "\x95"], "\x16" => [90, "\x95"], "\x17" => [98, "\x95"], "\x18" => [107, "\x95"], "\x19" => [140, "\x95"], "\x1a" => [146, "\x95"], "\x1b" => [102, "\x95"], "\x1c" => [113, "\x95"], "\x1d" => [121, "\x95"], "\x1e" => [128, "\x95"], "\x1f" => [12, "\x95"], " " => [92, "\x96"], "!" => [95, "\x96"], "\"" => [137, "\x96"], "#" => [142, "\x96"], "\$" => [150, "\x96"], "%" => [74, "\x96"], "&" => [90, "\x96"], "'" => [98, "\x96"], "(" => [107, "\x96"], ")" => [140, "\x96"], "*" => [146, "\x96"], "+" => [102, "\x96"], "," => [113, "\x96"], "-" => [121, "\x96"], "." => [128, "\x96"], "/" => [12, "\x96"], [92, "\x97"], [95, "\x97"], [137, "\x97"], [142, "\x97"], [150, "\x97"], [74, "\x97"], [90, "\x97"], [98, "\x97"], [107, "\x97"], [140, "\x97"], ":" => [146, "\x97"], ";" => [102, "\x97"], "<" => [113, "\x97"], "=" => [121, "\x97"], ">" => [128, "\x97"], "?" => [12, "\x97"], "@" => [92, "\x98"], "A" => [95, "\x98"], "B" => [137, "\x98"], "C" => [142, "\x98"], "D" => [150, "\x98"], "E" => [74, "\x98"], "F" => [90, "\x98"], "G" => [98, "\x98"], "H" => [107, "\x98"], "I" => [140, "\x98"], "J" => [146, "\x98"], "K" => [102, "\x98"], "L" => [113, "\x98"], "M" => [121, "\x98"], "N" => [128, "\x98"], "O" => [12, "\x98"], "P" => [92, "\x9b"], "Q" => [95, "\x9b"], "R" => [137, "\x9b"], "S" => [142, "\x9b"], "T" => [150, "\x9b"], "U" => [74, "\x9b"], "V" => [90, "\x9b"], "W" => [98, "\x9b"], "X" => [107, "\x9b"], "Y" => [140, "\x9b"], "Z" => [146, "\x9b"], "[" => [102, "\x9b"], "\\" => [113, "\x9b"], "]" => [121, "\x9b"], "^" => [128, "\x9b"], "_" => [12, "\x9b"], "`" => [92, "\x9d"], "a" => [95, "\x9d"], "b" => [137, "\x9d"], "c" => [142, "\x9d"], "d" => [150, "\x9d"], "e" => [74, "\x9d"], "f" => [90, "\x9d"], "g" => [98, "\x9d"], "h" => [107, "\x9d"], "i" => [140, "\x9d"], "j" => [146, "\x9d"], "k" => [102, "\x9d"], "l" => [113, "\x9d"], "m" => [121, "\x9d"], "n" => [128, "\x9d"], "o" => [12, "\x9d"], "p" => [92, "\x9e"], "q" => [95, "\x9e"], "r" => [137, "\x9e"], "s" => [142, "\x9e"], "t" => [150, "\x9e"], "u" => [74, "\x9e"], "v" => [90, "\x9e"], "w" => [98, "\x9e"], "x" => [107, "\x9e"], "y" => [140, "\x9e"], "z" => [146, "\x9e"], "{" => [102, "\x9e"], "|" => [113, "\x9e"], "}" => [121, "\x9e"], "~" => [128, "\x9e"], "" => [12, "\x9e"], "\x80" => [92, "\xa5"], "\x81" => [95, "\xa5"], "\x82" => [137, "\xa5"], "\x83" => [142, "\xa5"], "\x84" => [150, "\xa5"], "\x85" => [74, "\xa5"], "\x86" => [90, "\xa5"], "\x87" => [98, "\xa5"], "\x88" => [107, "\xa5"], "\x89" => [140, "\xa5"], "\x8a" => [146, "\xa5"], "\x8b" => [102, "\xa5"], "\x8c" => [113, "\xa5"], "\x8d" => [121, "\xa5"], "\x8e" => [128, "\xa5"], "\x8f" => [12, "\xa5"], "\x90" => [92, "\xa6"], "\x91" => [95, "\xa6"], "\x92" => [137, "\xa6"], "\x93" => [142, "\xa6"], "\x94" => [150, "\xa6"], "\x95" => [74, "\xa6"], "\x96" => [90, "\xa6"], "\x97" => [98, "\xa6"], "\x98" => [107, "\xa6"], "\x99" => [140, "\xa6"], "\x9a" => [146, "\xa6"], "\x9b" => [102, "\xa6"], "\x9c" => [113, "\xa6"], "\x9d" => [121, "\xa6"], "\x9e" => [128, "\xa6"], "\x9f" => [12, "\xa6"], "\xa0" => [92, "\xa8"], "\xa1" => [95, "\xa8"], "\xa2" => [137, "\xa8"], "\xa3" => [142, "\xa8"], "\xa4" => [150, "\xa8"], "\xa5" => [74, "\xa8"], "\xa6" => [90, "\xa8"], "\xa7" => [98, "\xa8"], "\xa8" => [107, "\xa8"], "\xa9" => [140, "\xa8"], "\xaa" => [146, "\xa8"], "\xab" => [102, "\xa8"], "\xac" => [113, "\xa8"], "\xad" => [121, "\xa8"], "\xae" => [128, "\xa8"], "\xaf" => [12, "\xa8"], "\xb0" => [92, "\xae"], "\xb1" => [95, "\xae"], "\xb2" => [137, "\xae"], "\xb3" => [142, "\xae"], "\xb4" => [150, "\xae"], "\xb5" => [74, "\xae"], "\xb6" => [90, "\xae"], "\xb7" => [98, "\xae"], "\xb8" => [107, "\xae"], "\xb9" => [140, "\xae"], "\xba" => [146, "\xae"], "\xbb" => [102, "\xae"], "\xbc" => [113, "\xae"], "\xbd" => [121, "\xae"], "\xbe" => [128, "\xae"], "\xbf" => [12, "\xae"], "\xc0" => [92, "\xaf"], "\xc1" => [95, "\xaf"], "\xc2" => [137, "\xaf"], "\xc3" => [142, "\xaf"], "\xc4" => [150, "\xaf"], "\xc5" => [74, "\xaf"], "\xc6" => [90, "\xaf"], "\xc7" => [98, "\xaf"], "\xc8" => [107, "\xaf"], "\xc9" => [140, "\xaf"], "\xca" => [146, "\xaf"], "\xcb" => [102, "\xaf"], "\xcc" => [113, "\xaf"], "\xcd" => [121, "\xaf"], "\xce" => [128, "\xaf"], "\xcf" => [12, "\xaf"], "\xd0" => [92, "\xb4"], "\xd1" => [95, "\xb4"], "\xd2" => [137, "\xb4"], "\xd3" => [142, "\xb4"], "\xd4" => [150, "\xb4"], "\xd5" => [74, "\xb4"], "\xd6" => [90, "\xb4"], "\xd7" => [98, "\xb4"], "\xd8" => [107, "\xb4"], "\xd9" => [140, "\xb4"], "\xda" => [146, "\xb4"], "\xdb" => [102, "\xb4"], "\xdc" => [113, "\xb4"], "\xdd" => [121, "\xb4"], "\xde" => [128, "\xb4"], "\xdf" => [12, "\xb4"], "\xe0" => [92, "\xb6"], "\xe1" => [95, "\xb6"], "\xe2" => [137, "\xb6"], "\xe3" => [142, "\xb6"], "\xe4" => [150, "\xb6"], "\xe5" => [74, "\xb6"], "\xe6" => [90, "\xb6"], "\xe7" => [98, "\xb6"], "\xe8" => [107, "\xb6"], "\xe9" => [140, "\xb6"], "\xea" => [146, "\xb6"], "\xeb" => [102, "\xb6"], "\xec" => [113, "\xb6"], "\xed" => [121, "\xb6"], "\xee" => [128, "\xb6"], "\xef" => [12, "\xb6"], "\xf0" => [92, "\xb7"], "\xf1" => [95, "\xb7"], "\xf2" => [137, "\xb7"], "\xf3" => [142, "\xb7"], "\xf4" => [150, "\xb7"], "\xf5" => [74, "\xb7"], "\xf6" => [90, "\xb7"], "\xf7" => [98, "\xb7"], "\xf8" => [107, "\xb7"], "\xf9" => [140, "\xb7"], "\xfa" => [146, "\xb7"], "\xfb" => [102, "\xb7"], "\xfc" => [113, "\xb7"], "\xfd" => [121, "\xb7"], "\xfe" => [128, "\xb7"], "\xff" => [12, "\xb7"]], ["\x00" => [94, "\x940"], "\x01" => [76, "\x940"], "\x02" => [104, "\x940"], "\x03" => [16, "\x940"], "\x04" => [94, "\x941"], "\x05" => [76, "\x941"], "\x06" => [104, "\x941"], "\x07" => [16, "\x941"], "\x08" => [94, "\x942"], "\t" => [76, "\x942"], "\n" => [104, "\x942"], "\v" => [16, "\x942"], "\f" => [94, "\x94a"], "\r" => [76, "\x94a"], "\x0e" => [104, "\x94a"], "\x0f" => [16, "\x94a"], "\x10" => [94, "\x94c"], "\x11" => [76, "\x94c"], "\x12" => [104, "\x94c"], "\x13" => [16, "\x94c"], "\x14" => [94, "\x94e"], "\x15" => [76, "\x94e"], "\x16" => [104, "\x94e"], "\x17" => [16, "\x94e"], "\x18" => [94, "\x94i"], "\x19" => [76, "\x94i"], "\x1a" => [104, "\x94i"], "\x1b" => [16, "\x94i"], "\x1c" => [94, "\x94o"], "\x1d" => [76, "\x94o"], "\x1e" => [104, "\x94o"], "\x1f" => [16, "\x94o"], " " => [94, "\x94s"], "!" => [76, "\x94s"], "\"" => [104, "\x94s"], "#" => [16, "\x94s"], "\$" => [94, "\x94t"], "%" => [76, "\x94t"], "&" => [104, "\x94t"], "'" => [16, "\x94t"], "(" => [77, "\x94 "], ")" => [18, "\x94 "], "*" => [77, "\x94%"], "+" => [18, "\x94%"], "," => [77, "\x94-"], "-" => [18, "\x94-"], "." => [77, "\x94."], "/" => [18, "\x94."], [77, "\x94/"], [18, "\x94/"], [77, "\x943"], [18, "\x943"], [77, "\x944"], [18, "\x944"], [77, "\x945"], [18, "\x945"], [77, "\x946"], [18, "\x946"], ":" => [77, "\x947"], ";" => [18, "\x947"], "<" => [77, "\x948"], "=" => [18, "\x948"], ">" => [77, "\x949"], "?" => [18, "\x949"], "@" => [77, "\x94="], "A" => [18, "\x94="], "B" => [77, "\x94A"], "C" => [18, "\x94A"], "D" => [77, "\x94_"], "E" => [18, "\x94_"], "F" => [77, "\x94b"], "G" => [18, "\x94b"], "H" => [77, "\x94d"], "I" => [18, "\x94d"], "J" => [77, "\x94f"], "K" => [18, "\x94f"], "L" => [77, "\x94g"], "M" => [18, "\x94g"], "N" => [77, "\x94h"], "O" => [18, "\x94h"], "P" => [77, "\x94l"], "Q" => [18, "\x94l"], "R" => [77, "\x94m"], "S" => [18, "\x94m"], "T" => [77, "\x94n"], "U" => [18, "\x94n"], "V" => [77, "\x94p"], "W" => [18, "\x94p"], "X" => [77, "\x94r"], "Y" => [18, "\x94r"], "Z" => [77, "\x94u"], "[" => [18, "\x94u"], "\\" => [0, "\x94:"], "]" => [0, "\x94B"], "^" => [0, "\x94C"], "_" => [0, "\x94D"], "`" => [0, "\x94E"], "a" => [0, "\x94F"], "b" => [0, "\x94G"], "c" => [0, "\x94H"], "d" => [0, "\x94I"], "e" => [0, "\x94J"], "f" => [0, "\x94K"], "g" => [0, "\x94L"], "h" => [0, "\x94M"], "i" => [0, "\x94N"], "j" => [0, "\x94O"], "k" => [0, "\x94P"], "l" => [0, "\x94Q"], "m" => [0, "\x94R"], "n" => [0, "\x94S"], "o" => [0, "\x94T"], "p" => [0, "\x94U"], "q" => [0, "\x94V"], "r" => [0, "\x94W"], "s" => [0, "\x94Y"], "t" => [0, "\x94j"], "u" => [0, "\x94k"], "v" => [0, "\x94q"], "w" => [0, "\x94v"], "x" => [0, "\x94w"], "y" => [0, "\x94x"], "z" => [0, "\x94y"], "{" => [0, "\x94z"], "|" => [82, "\x94"], "}" => [87, "\x94"], "~" => [130, "\x94"], "" => [9, "\x94"], "\x80" => [94, "\x9f0"], "\x81" => [76, "\x9f0"], "\x82" => [104, "\x9f0"], "\x83" => [16, "\x9f0"], "\x84" => [94, "\x9f1"], "\x85" => [76, "\x9f1"], "\x86" => [104, "\x9f1"], "\x87" => [16, "\x9f1"], "\x88" => [94, "\x9f2"], "\x89" => [76, "\x9f2"], "\x8a" => [104, "\x9f2"], "\x8b" => [16, "\x9f2"], "\x8c" => [94, "\x9fa"], "\x8d" => [76, "\x9fa"], "\x8e" => [104, "\x9fa"], "\x8f" => [16, "\x9fa"], "\x90" => [94, "\x9fc"], "\x91" => [76, "\x9fc"], "\x92" => [104, "\x9fc"], "\x93" => [16, "\x9fc"], "\x94" => [94, "\x9fe"], "\x95" => [76, "\x9fe"], "\x96" => [104, "\x9fe"], "\x97" => [16, "\x9fe"], "\x98" => [94, "\x9fi"], "\x99" => [76, "\x9fi"], "\x9a" => [104, "\x9fi"], "\x9b" => [16, "\x9fi"], "\x9c" => [94, "\x9fo"], "\x9d" => [76, "\x9fo"], "\x9e" => [104, "\x9fo"], "\x9f" => [16, "\x9fo"], "\xa0" => [94, "\x9fs"], "\xa1" => [76, "\x9fs"], "\xa2" => [104, "\x9fs"], "\xa3" => [16, "\x9fs"], "\xa4" => [94, "\x9ft"], "\xa5" => [76, "\x9ft"], "\xa6" => [104, "\x9ft"], "\xa7" => [16, "\x9ft"], "\xa8" => [77, "\x9f "], "\xa9" => [18, "\x9f "], "\xaa" => [77, "\x9f%"], "\xab" => [18, "\x9f%"], "\xac" => [77, "\x9f-"], "\xad" => [18, "\x9f-"], "\xae" => [77, "\x9f."], "\xaf" => [18, "\x9f."], "\xb0" => [77, "\x9f/"], "\xb1" => [18, "\x9f/"], "\xb2" => [77, "\x9f3"], "\xb3" => [18, "\x9f3"], "\xb4" => [77, "\x9f4"], "\xb5" => [18, "\x9f4"], "\xb6" => [77, "\x9f5"], "\xb7" => [18, "\x9f5"], "\xb8" => [77, "\x9f6"], "\xb9" => [18, "\x9f6"], "\xba" => [77, "\x9f7"], "\xbb" => [18, "\x9f7"], "\xbc" => [77, "\x9f8"], "\xbd" => [18, "\x9f8"], "\xbe" => [77, "\x9f9"], "\xbf" => [18, "\x9f9"], "\xc0" => [77, "\x9f="], "\xc1" => [18, "\x9f="], "\xc2" => [77, "\x9fA"], "\xc3" => [18, "\x9fA"], "\xc4" => [77, "\x9f_"], "\xc5" => [18, "\x9f_"], "\xc6" => [77, "\x9fb"], "\xc7" => [18, "\x9fb"], "\xc8" => [77, "\x9fd"], "\xc9" => [18, "\x9fd"], "\xca" => [77, "\x9ff"], "\xcb" => [18, "\x9ff"], "\xcc" => [77, "\x9fg"], "\xcd" => [18, "\x9fg"], "\xce" => [77, "\x9fh"], "\xcf" => [18, "\x9fh"], "\xd0" => [77, "\x9fl"], "\xd1" => [18, "\x9fl"], "\xd2" => [77, "\x9fm"], "\xd3" => [18, "\x9fm"], "\xd4" => [77, "\x9fn"], "\xd5" => [18, "\x9fn"], "\xd6" => [77, "\x9fp"], "\xd7" => [18, "\x9fp"], "\xd8" => [77, "\x9fr"], "\xd9" => [18, "\x9fr"], "\xda" => [77, "\x9fu"], "\xdb" => [18, "\x9fu"], "\xdc" => [0, "\x9f:"], "\xdd" => [0, "\x9fB"], "\xde" => [0, "\x9fC"], "\xdf" => [0, "\x9fD"], "\xe0" => [0, "\x9fE"], "\xe1" => [0, "\x9fF"], "\xe2" => [0, "\x9fG"], "\xe3" => [0, "\x9fH"], "\xe4" => [0, "\x9fI"], "\xe5" => [0, "\x9fJ"], "\xe6" => [0, "\x9fK"], "\xe7" => [0, "\x9fL"], "\xe8" => [0, "\x9fM"], "\xe9" => [0, "\x9fN"], "\xea" => [0, "\x9fO"], "\xeb" => [0, "\x9fP"], "\xec" => [0, "\x9fQ"], "\xed" => [0, "\x9fR"], "\xee" => [0, "\x9fS"], "\xef" => [0, "\x9fT"], "\xf0" => [0, "\x9fU"], "\xf1" => [0, "\x9fV"], "\xf2" => [0, "\x9fW"], "\xf3" => [0, "\x9fY"], "\xf4" => [0, "\x9fj"], "\xf5" => [0, "\x9fk"], "\xf6" => [0, "\x9fq"], "\xf7" => [0, "\x9fv"], "\xf8" => [0, "\x9fw"], "\xf9" => [0, "\x9fx"], "\xfa" => [0, "\x9fy"], "\xfb" => [0, "\x9fz"], "\xfc" => [82, "\x9f"], "\xfd" => [87, "\x9f"], "\xfe" => [130, "\x9f"], "\xff" => [9, "\x9f"]], ["\x00" => [94, "\x960"], "\x01" => [76, "\x960"], "\x02" => [104, "\x960"], "\x03" => [16, "\x960"], "\x04" => [94, "\x961"], "\x05" => [76, "\x961"], "\x06" => [104, "\x961"], "\x07" => [16, "\x961"], "\x08" => [94, "\x962"], "\t" => [76, "\x962"], "\n" => [104, "\x962"], "\v" => [16, "\x962"], "\f" => [94, "\x96a"], "\r" => [76, "\x96a"], "\x0e" => [104, "\x96a"], "\x0f" => [16, "\x96a"], "\x10" => [94, "\x96c"], "\x11" => [76, "\x96c"], "\x12" => [104, "\x96c"], "\x13" => [16, "\x96c"], "\x14" => [94, "\x96e"], "\x15" => [76, "\x96e"], "\x16" => [104, "\x96e"], "\x17" => [16, "\x96e"], "\x18" => [94, "\x96i"], "\x19" => [76, "\x96i"], "\x1a" => [104, "\x96i"], "\x1b" => [16, "\x96i"], "\x1c" => [94, "\x96o"], "\x1d" => [76, "\x96o"], "\x1e" => [104, "\x96o"], "\x1f" => [16, "\x96o"], " " => [94, "\x96s"], "!" => [76, "\x96s"], "\"" => [104, "\x96s"], "#" => [16, "\x96s"], "\$" => [94, "\x96t"], "%" => [76, "\x96t"], "&" => [104, "\x96t"], "'" => [16, "\x96t"], "(" => [77, "\x96 "], ")" => [18, "\x96 "], "*" => [77, "\x96%"], "+" => [18, "\x96%"], "," => [77, "\x96-"], "-" => [18, "\x96-"], "." => [77, "\x96."], "/" => [18, "\x96."], [77, "\x96/"], [18, "\x96/"], [77, "\x963"], [18, "\x963"], [77, "\x964"], [18, "\x964"], [77, "\x965"], [18, "\x965"], [77, "\x966"], [18, "\x966"], ":" => [77, "\x967"], ";" => [18, "\x967"], "<" => [77, "\x968"], "=" => [18, "\x968"], ">" => [77, "\x969"], "?" => [18, "\x969"], "@" => [77, "\x96="], "A" => [18, "\x96="], "B" => [77, "\x96A"], "C" => [18, "\x96A"], "D" => [77, "\x96_"], "E" => [18, "\x96_"], "F" => [77, "\x96b"], "G" => [18, "\x96b"], "H" => [77, "\x96d"], "I" => [18, "\x96d"], "J" => [77, "\x96f"], "K" => [18, "\x96f"], "L" => [77, "\x96g"], "M" => [18, "\x96g"], "N" => [77, "\x96h"], "O" => [18, "\x96h"], "P" => [77, "\x96l"], "Q" => [18, "\x96l"], "R" => [77, "\x96m"], "S" => [18, "\x96m"], "T" => [77, "\x96n"], "U" => [18, "\x96n"], "V" => [77, "\x96p"], "W" => [18, "\x96p"], "X" => [77, "\x96r"], "Y" => [18, "\x96r"], "Z" => [77, "\x96u"], "[" => [18, "\x96u"], "\\" => [0, "\x96:"], "]" => [0, "\x96B"], "^" => [0, "\x96C"], "_" => [0, "\x96D"], "`" => [0, "\x96E"], "a" => [0, "\x96F"], "b" => [0, "\x96G"], "c" => [0, "\x96H"], "d" => [0, "\x96I"], "e" => [0, "\x96J"], "f" => [0, "\x96K"], "g" => [0, "\x96L"], "h" => [0, "\x96M"], "i" => [0, "\x96N"], "j" => [0, "\x96O"], "k" => [0, "\x96P"], "l" => [0, "\x96Q"], "m" => [0, "\x96R"], "n" => [0, "\x96S"], "o" => [0, "\x96T"], "p" => [0, "\x96U"], "q" => [0, "\x96V"], "r" => [0, "\x96W"], "s" => [0, "\x96Y"], "t" => [0, "\x96j"], "u" => [0, "\x96k"], "v" => [0, "\x96q"], "w" => [0, "\x96v"], "x" => [0, "\x96w"], "y" => [0, "\x96x"], "z" => [0, "\x96y"], "{" => [0, "\x96z"], "|" => [82, "\x96"], "}" => [87, "\x96"], "~" => [130, "\x96"], "" => [9, "\x96"], "\x80" => [94, "\x970"], "\x81" => [76, "\x970"], "\x82" => [104, "\x970"], "\x83" => [16, "\x970"], "\x84" => [94, "\x971"], "\x85" => [76, "\x971"], "\x86" => [104, "\x971"], "\x87" => [16, "\x971"], "\x88" => [94, "\x972"], "\x89" => [76, "\x972"], "\x8a" => [104, "\x972"], "\x8b" => [16, "\x972"], "\x8c" => [94, "\x97a"], "\x8d" => [76, "\x97a"], "\x8e" => [104, "\x97a"], "\x8f" => [16, "\x97a"], "\x90" => [94, "\x97c"], "\x91" => [76, "\x97c"], "\x92" => [104, "\x97c"], "\x93" => [16, "\x97c"], "\x94" => [94, "\x97e"], "\x95" => [76, "\x97e"], "\x96" => [104, "\x97e"], "\x97" => [16, "\x97e"], "\x98" => [94, "\x97i"], "\x99" => [76, "\x97i"], "\x9a" => [104, "\x97i"], "\x9b" => [16, "\x97i"], "\x9c" => [94, "\x97o"], "\x9d" => [76, "\x97o"], "\x9e" => [104, "\x97o"], "\x9f" => [16, "\x97o"], "\xa0" => [94, "\x97s"], "\xa1" => [76, "\x97s"], "\xa2" => [104, "\x97s"], "\xa3" => [16, "\x97s"], "\xa4" => [94, "\x97t"], "\xa5" => [76, "\x97t"], "\xa6" => [104, "\x97t"], "\xa7" => [16, "\x97t"], "\xa8" => [77, "\x97 "], "\xa9" => [18, "\x97 "], "\xaa" => [77, "\x97%"], "\xab" => [18, "\x97%"], "\xac" => [77, "\x97-"], "\xad" => [18, "\x97-"], "\xae" => [77, "\x97."], "\xaf" => [18, "\x97."], "\xb0" => [77, "\x97/"], "\xb1" => [18, "\x97/"], "\xb2" => [77, "\x973"], "\xb3" => [18, "\x973"], "\xb4" => [77, "\x974"], "\xb5" => [18, "\x974"], "\xb6" => [77, "\x975"], "\xb7" => [18, "\x975"], "\xb8" => [77, "\x976"], "\xb9" => [18, "\x976"], "\xba" => [77, "\x977"], "\xbb" => [18, "\x977"], "\xbc" => [77, "\x978"], "\xbd" => [18, "\x978"], "\xbe" => [77, "\x979"], "\xbf" => [18, "\x979"], "\xc0" => [77, "\x97="], "\xc1" => [18, "\x97="], "\xc2" => [77, "\x97A"], "\xc3" => [18, "\x97A"], "\xc4" => [77, "\x97_"], "\xc5" => [18, "\x97_"], "\xc6" => [77, "\x97b"], "\xc7" => [18, "\x97b"], "\xc8" => [77, "\x97d"], "\xc9" => [18, "\x97d"], "\xca" => [77, "\x97f"], "\xcb" => [18, "\x97f"], "\xcc" => [77, "\x97g"], "\xcd" => [18, "\x97g"], "\xce" => [77, "\x97h"], "\xcf" => [18, "\x97h"], "\xd0" => [77, "\x97l"], "\xd1" => [18, "\x97l"], "\xd2" => [77, "\x97m"], "\xd3" => [18, "\x97m"], "\xd4" => [77, "\x97n"], "\xd5" => [18, "\x97n"], "\xd6" => [77, "\x97p"], "\xd7" => [18, "\x97p"], "\xd8" => [77, "\x97r"], "\xd9" => [18, "\x97r"], "\xda" => [77, "\x97u"], "\xdb" => [18, "\x97u"], "\xdc" => [0, "\x97:"], "\xdd" => [0, "\x97B"], "\xde" => [0, "\x97C"], "\xdf" => [0, "\x97D"], "\xe0" => [0, "\x97E"], "\xe1" => [0, "\x97F"], "\xe2" => [0, "\x97G"], "\xe3" => [0, "\x97H"], "\xe4" => [0, "\x97I"], "\xe5" => [0, "\x97J"], "\xe6" => [0, "\x97K"], "\xe7" => [0, "\x97L"], "\xe8" => [0, "\x97M"], "\xe9" => [0, "\x97N"], "\xea" => [0, "\x97O"], "\xeb" => [0, "\x97P"], "\xec" => [0, "\x97Q"], "\xed" => [0, "\x97R"], "\xee" => [0, "\x97S"], "\xef" => [0, "\x97T"], "\xf0" => [0, "\x97U"], "\xf1" => [0, "\x97V"], "\xf2" => [0, "\x97W"], "\xf3" => [0, "\x97Y"], "\xf4" => [0, "\x97j"], "\xf5" => [0, "\x97k"], "\xf6" => [0, "\x97q"], "\xf7" => [0, "\x97v"], "\xf8" => [0, "\x97w"], "\xf9" => [0, "\x97x"], "\xfa" => [0, "\x97y"], "\xfb" => [0, "\x97z"], "\xfc" => [82, "\x97"], "\xfd" => [87, "\x97"], "\xfe" => [130, "\x97"], "\xff" => [9, "\x97"]], ["\x00" => [94, "\x980"], "\x01" => [76, "\x980"], "\x02" => [104, "\x980"], "\x03" => [16, "\x980"], "\x04" => [94, "\x981"], "\x05" => [76, "\x981"], "\x06" => [104, "\x981"], "\x07" => [16, "\x981"], "\x08" => [94, "\x982"], "\t" => [76, "\x982"], "\n" => [104, "\x982"], "\v" => [16, "\x982"], "\f" => [94, "\x98a"], "\r" => [76, "\x98a"], "\x0e" => [104, "\x98a"], "\x0f" => [16, "\x98a"], "\x10" => [94, "\x98c"], "\x11" => [76, "\x98c"], "\x12" => [104, "\x98c"], "\x13" => [16, "\x98c"], "\x14" => [94, "\x98e"], "\x15" => [76, "\x98e"], "\x16" => [104, "\x98e"], "\x17" => [16, "\x98e"], "\x18" => [94, "\x98i"], "\x19" => [76, "\x98i"], "\x1a" => [104, "\x98i"], "\x1b" => [16, "\x98i"], "\x1c" => [94, "\x98o"], "\x1d" => [76, "\x98o"], "\x1e" => [104, "\x98o"], "\x1f" => [16, "\x98o"], " " => [94, "\x98s"], "!" => [76, "\x98s"], "\"" => [104, "\x98s"], "#" => [16, "\x98s"], "\$" => [94, "\x98t"], "%" => [76, "\x98t"], "&" => [104, "\x98t"], "'" => [16, "\x98t"], "(" => [77, "\x98 "], ")" => [18, "\x98 "], "*" => [77, "\x98%"], "+" => [18, "\x98%"], "," => [77, "\x98-"], "-" => [18, "\x98-"], "." => [77, "\x98."], "/" => [18, "\x98."], [77, "\x98/"], [18, "\x98/"], [77, "\x983"], [18, "\x983"], [77, "\x984"], [18, "\x984"], [77, "\x985"], [18, "\x985"], [77, "\x986"], [18, "\x986"], ":" => [77, "\x987"], ";" => [18, "\x987"], "<" => [77, "\x988"], "=" => [18, "\x988"], ">" => [77, "\x989"], "?" => [18, "\x989"], "@" => [77, "\x98="], "A" => [18, "\x98="], "B" => [77, "\x98A"], "C" => [18, "\x98A"], "D" => [77, "\x98_"], "E" => [18, "\x98_"], "F" => [77, "\x98b"], "G" => [18, "\x98b"], "H" => [77, "\x98d"], "I" => [18, "\x98d"], "J" => [77, "\x98f"], "K" => [18, "\x98f"], "L" => [77, "\x98g"], "M" => [18, "\x98g"], "N" => [77, "\x98h"], "O" => [18, "\x98h"], "P" => [77, "\x98l"], "Q" => [18, "\x98l"], "R" => [77, "\x98m"], "S" => [18, "\x98m"], "T" => [77, "\x98n"], "U" => [18, "\x98n"], "V" => [77, "\x98p"], "W" => [18, "\x98p"], "X" => [77, "\x98r"], "Y" => [18, "\x98r"], "Z" => [77, "\x98u"], "[" => [18, "\x98u"], "\\" => [0, "\x98:"], "]" => [0, "\x98B"], "^" => [0, "\x98C"], "_" => [0, "\x98D"], "`" => [0, "\x98E"], "a" => [0, "\x98F"], "b" => [0, "\x98G"], "c" => [0, "\x98H"], "d" => [0, "\x98I"], "e" => [0, "\x98J"], "f" => [0, "\x98K"], "g" => [0, "\x98L"], "h" => [0, "\x98M"], "i" => [0, "\x98N"], "j" => [0, "\x98O"], "k" => [0, "\x98P"], "l" => [0, "\x98Q"], "m" => [0, "\x98R"], "n" => [0, "\x98S"], "o" => [0, "\x98T"], "p" => [0, "\x98U"], "q" => [0, "\x98V"], "r" => [0, "\x98W"], "s" => [0, "\x98Y"], "t" => [0, "\x98j"], "u" => [0, "\x98k"], "v" => [0, "\x98q"], "w" => [0, "\x98v"], "x" => [0, "\x98w"], "y" => [0, "\x98x"], "z" => [0, "\x98y"], "{" => [0, "\x98z"], "|" => [82, "\x98"], "}" => [87, "\x98"], "~" => [130, "\x98"], "" => [9, "\x98"], "\x80" => [94, "\x9b0"], "\x81" => [76, "\x9b0"], "\x82" => [104, "\x9b0"], "\x83" => [16, "\x9b0"], "\x84" => [94, "\x9b1"], "\x85" => [76, "\x9b1"], "\x86" => [104, "\x9b1"], "\x87" => [16, "\x9b1"], "\x88" => [94, "\x9b2"], "\x89" => [76, "\x9b2"], "\x8a" => [104, "\x9b2"], "\x8b" => [16, "\x9b2"], "\x8c" => [94, "\x9ba"], "\x8d" => [76, "\x9ba"], "\x8e" => [104, "\x9ba"], "\x8f" => [16, "\x9ba"], "\x90" => [94, "\x9bc"], "\x91" => [76, "\x9bc"], "\x92" => [104, "\x9bc"], "\x93" => [16, "\x9bc"], "\x94" => [94, "\x9be"], "\x95" => [76, "\x9be"], "\x96" => [104, "\x9be"], "\x97" => [16, "\x9be"], "\x98" => [94, "\x9bi"], "\x99" => [76, "\x9bi"], "\x9a" => [104, "\x9bi"], "\x9b" => [16, "\x9bi"], "\x9c" => [94, "\x9bo"], "\x9d" => [76, "\x9bo"], "\x9e" => [104, "\x9bo"], "\x9f" => [16, "\x9bo"], "\xa0" => [94, "\x9bs"], "\xa1" => [76, "\x9bs"], "\xa2" => [104, "\x9bs"], "\xa3" => [16, "\x9bs"], "\xa4" => [94, "\x9bt"], "\xa5" => [76, "\x9bt"], "\xa6" => [104, "\x9bt"], "\xa7" => [16, "\x9bt"], "\xa8" => [77, "\x9b "], "\xa9" => [18, "\x9b "], "\xaa" => [77, "\x9b%"], "\xab" => [18, "\x9b%"], "\xac" => [77, "\x9b-"], "\xad" => [18, "\x9b-"], "\xae" => [77, "\x9b."], "\xaf" => [18, "\x9b."], "\xb0" => [77, "\x9b/"], "\xb1" => [18, "\x9b/"], "\xb2" => [77, "\x9b3"], "\xb3" => [18, "\x9b3"], "\xb4" => [77, "\x9b4"], "\xb5" => [18, "\x9b4"], "\xb6" => [77, "\x9b5"], "\xb7" => [18, "\x9b5"], "\xb8" => [77, "\x9b6"], "\xb9" => [18, "\x9b6"], "\xba" => [77, "\x9b7"], "\xbb" => [18, "\x9b7"], "\xbc" => [77, "\x9b8"], "\xbd" => [18, "\x9b8"], "\xbe" => [77, "\x9b9"], "\xbf" => [18, "\x9b9"], "\xc0" => [77, "\x9b="], "\xc1" => [18, "\x9b="], "\xc2" => [77, "\x9bA"], "\xc3" => [18, "\x9bA"], "\xc4" => [77, "\x9b_"], "\xc5" => [18, "\x9b_"], "\xc6" => [77, "\x9bb"], "\xc7" => [18, "\x9bb"], "\xc8" => [77, "\x9bd"], "\xc9" => [18, "\x9bd"], "\xca" => [77, "\x9bf"], "\xcb" => [18, "\x9bf"], "\xcc" => [77, "\x9bg"], "\xcd" => [18, "\x9bg"], "\xce" => [77, "\x9bh"], "\xcf" => [18, "\x9bh"], "\xd0" => [77, "\x9bl"], "\xd1" => [18, "\x9bl"], "\xd2" => [77, "\x9bm"], "\xd3" => [18, "\x9bm"], "\xd4" => [77, "\x9bn"], "\xd5" => [18, "\x9bn"], "\xd6" => [77, "\x9bp"], "\xd7" => [18, "\x9bp"], "\xd8" => [77, "\x9br"], "\xd9" => [18, "\x9br"], "\xda" => [77, "\x9bu"], "\xdb" => [18, "\x9bu"], "\xdc" => [0, "\x9b:"], "\xdd" => [0, "\x9bB"], "\xde" => [0, "\x9bC"], "\xdf" => [0, "\x9bD"], "\xe0" => [0, "\x9bE"], "\xe1" => [0, "\x9bF"], "\xe2" => [0, "\x9bG"], "\xe3" => [0, "\x9bH"], "\xe4" => [0, "\x9bI"], "\xe5" => [0, "\x9bJ"], "\xe6" => [0, "\x9bK"], "\xe7" => [0, "\x9bL"], "\xe8" => [0, "\x9bM"], "\xe9" => [0, "\x9bN"], "\xea" => [0, "\x9bO"], "\xeb" => [0, "\x9bP"], "\xec" => [0, "\x9bQ"], "\xed" => [0, "\x9bR"], "\xee" => [0, "\x9bS"], "\xef" => [0, "\x9bT"], "\xf0" => [0, "\x9bU"], "\xf1" => [0, "\x9bV"], "\xf2" => [0, "\x9bW"], "\xf3" => [0, "\x9bY"], "\xf4" => [0, "\x9bj"], "\xf5" => [0, "\x9bk"], "\xf6" => [0, "\x9bq"], "\xf7" => [0, "\x9bv"], "\xf8" => [0, "\x9bw"], "\xf9" => [0, "\x9bx"], "\xfa" => [0, "\x9by"], "\xfb" => [0, "\x9bz"], "\xfc" => [82, "\x9b"], "\xfd" => [87, "\x9b"], "\xfe" => [130, "\x9b"], "\xff" => [9, "\x9b"]], ["\x00" => [77, "\x980"], "\x01" => [18, "\x980"], "\x02" => [77, "\x981"], "\x03" => [18, "\x981"], "\x04" => [77, "\x982"], "\x05" => [18, "\x982"], "\x06" => [77, "\x98a"], "\x07" => [18, "\x98a"], "\x08" => [77, "\x98c"], "\t" => [18, "\x98c"], "\n" => [77, "\x98e"], "\v" => [18, "\x98e"], "\f" => [77, "\x98i"], "\r" => [18, "\x98i"], "\x0e" => [77, "\x98o"], "\x0f" => [18, "\x98o"], "\x10" => [77, "\x98s"], "\x11" => [18, "\x98s"], "\x12" => [77, "\x98t"], "\x13" => [18, "\x98t"], "\x14" => [0, "\x98 "], "\x15" => [0, "\x98%"], "\x16" => [0, "\x98-"], "\x17" => [0, "\x98."], "\x18" => [0, "\x98/"], "\x19" => [0, "\x983"], "\x1a" => [0, "\x984"], "\x1b" => [0, "\x985"], "\x1c" => [0, "\x986"], "\x1d" => [0, "\x987"], "\x1e" => [0, "\x988"], "\x1f" => [0, "\x989"], " " => [0, "\x98="], "!" => [0, "\x98A"], "\"" => [0, "\x98_"], "#" => [0, "\x98b"], "\$" => [0, "\x98d"], "%" => [0, "\x98f"], "&" => [0, "\x98g"], "'" => [0, "\x98h"], "(" => [0, "\x98l"], ")" => [0, "\x98m"], "*" => [0, "\x98n"], "+" => [0, "\x98p"], "," => [0, "\x98r"], "-" => [0, "\x98u"], "." => [100, "\x98"], "/" => [110, "\x98"], [111, "\x98"], [115, "\x98"], [116, "\x98"], [118, "\x98"], [119, "\x98"], [122, "\x98"], [123, "\x98"], [125, "\x98"], [126, "\x98"], [129, "\x98"], ":" => [143, "\x98"], ";" => [148, "\x98"], "<" => [151, "\x98"], "=" => [153, "\x98"], ">" => [83, "\x98"], "?" => [10, "\x98"], "@" => [77, "\x9b0"], "A" => [18, "\x9b0"], "B" => [77, "\x9b1"], "C" => [18, "\x9b1"], "D" => [77, "\x9b2"], "E" => [18, "\x9b2"], "F" => [77, "\x9ba"], "G" => [18, "\x9ba"], "H" => [77, "\x9bc"], "I" => [18, "\x9bc"], "J" => [77, "\x9be"], "K" => [18, "\x9be"], "L" => [77, "\x9bi"], "M" => [18, "\x9bi"], "N" => [77, "\x9bo"], "O" => [18, "\x9bo"], "P" => [77, "\x9bs"], "Q" => [18, "\x9bs"], "R" => [77, "\x9bt"], "S" => [18, "\x9bt"], "T" => [0, "\x9b "], "U" => [0, "\x9b%"], "V" => [0, "\x9b-"], "W" => [0, "\x9b."], "X" => [0, "\x9b/"], "Y" => [0, "\x9b3"], "Z" => [0, "\x9b4"], "[" => [0, "\x9b5"], "\\" => [0, "\x9b6"], "]" => [0, "\x9b7"], "^" => [0, "\x9b8"], "_" => [0, "\x9b9"], "`" => [0, "\x9b="], "a" => [0, "\x9bA"], "b" => [0, "\x9b_"], "c" => [0, "\x9bb"], "d" => [0, "\x9bd"], "e" => [0, "\x9bf"], "f" => [0, "\x9bg"], "g" => [0, "\x9bh"], "h" => [0, "\x9bl"], "i" => [0, "\x9bm"], "j" => [0, "\x9bn"], "k" => [0, "\x9bp"], "l" => [0, "\x9br"], "m" => [0, "\x9bu"], "n" => [100, "\x9b"], "o" => [110, "\x9b"], "p" => [111, "\x9b"], "q" => [115, "\x9b"], "r" => [116, "\x9b"], "s" => [118, "\x9b"], "t" => [119, "\x9b"], "u" => [122, "\x9b"], "v" => [123, "\x9b"], "w" => [125, "\x9b"], "x" => [126, "\x9b"], "y" => [129, "\x9b"], "z" => [143, "\x9b"], "{" => [148, "\x9b"], "|" => [151, "\x9b"], "}" => [153, "\x9b"], "~" => [83, "\x9b"], "" => [10, "\x9b"], "\x80" => [77, "\x9d0"], "\x81" => [18, "\x9d0"], "\x82" => [77, "\x9d1"], "\x83" => [18, "\x9d1"], "\x84" => [77, "\x9d2"], "\x85" => [18, "\x9d2"], "\x86" => [77, "\x9da"], "\x87" => [18, "\x9da"], "\x88" => [77, "\x9dc"], "\x89" => [18, "\x9dc"], "\x8a" => [77, "\x9de"], "\x8b" => [18, "\x9de"], "\x8c" => [77, "\x9di"], "\x8d" => [18, "\x9di"], "\x8e" => [77, "\x9do"], "\x8f" => [18, "\x9do"], "\x90" => [77, "\x9ds"], "\x91" => [18, "\x9ds"], "\x92" => [77, "\x9dt"], "\x93" => [18, "\x9dt"], "\x94" => [0, "\x9d "], "\x95" => [0, "\x9d%"], "\x96" => [0, "\x9d-"], "\x97" => [0, "\x9d."], "\x98" => [0, "\x9d/"], "\x99" => [0, "\x9d3"], "\x9a" => [0, "\x9d4"], "\x9b" => [0, "\x9d5"], "\x9c" => [0, "\x9d6"], "\x9d" => [0, "\x9d7"], "\x9e" => [0, "\x9d8"], "\x9f" => [0, "\x9d9"], "\xa0" => [0, "\x9d="], "\xa1" => [0, "\x9dA"], "\xa2" => [0, "\x9d_"], "\xa3" => [0, "\x9db"], "\xa4" => [0, "\x9dd"], "\xa5" => [0, "\x9df"], "\xa6" => [0, "\x9dg"], "\xa7" => [0, "\x9dh"], "\xa8" => [0, "\x9dl"], "\xa9" => [0, "\x9dm"], "\xaa" => [0, "\x9dn"], "\xab" => [0, "\x9dp"], "\xac" => [0, "\x9dr"], "\xad" => [0, "\x9du"], "\xae" => [100, "\x9d"], "\xaf" => [110, "\x9d"], "\xb0" => [111, "\x9d"], "\xb1" => [115, "\x9d"], "\xb2" => [116, "\x9d"], "\xb3" => [118, "\x9d"], "\xb4" => [119, "\x9d"], "\xb5" => [122, "\x9d"], "\xb6" => [123, "\x9d"], "\xb7" => [125, "\x9d"], "\xb8" => [126, "\x9d"], "\xb9" => [129, "\x9d"], "\xba" => [143, "\x9d"], "\xbb" => [148, "\x9d"], "\xbc" => [151, "\x9d"], "\xbd" => [153, "\x9d"], "\xbe" => [83, "\x9d"], "\xbf" => [10, "\x9d"], "\xc0" => [77, "\x9e0"], "\xc1" => [18, "\x9e0"], "\xc2" => [77, "\x9e1"], "\xc3" => [18, "\x9e1"], "\xc4" => [77, "\x9e2"], "\xc5" => [18, "\x9e2"], "\xc6" => [77, "\x9ea"], "\xc7" => [18, "\x9ea"], "\xc8" => [77, "\x9ec"], "\xc9" => [18, "\x9ec"], "\xca" => [77, "\x9ee"], "\xcb" => [18, "\x9ee"], "\xcc" => [77, "\x9ei"], "\xcd" => [18, "\x9ei"], "\xce" => [77, "\x9eo"], "\xcf" => [18, "\x9eo"], "\xd0" => [77, "\x9es"], "\xd1" => [18, "\x9es"], "\xd2" => [77, "\x9et"], "\xd3" => [18, "\x9et"], "\xd4" => [0, "\x9e "], "\xd5" => [0, "\x9e%"], "\xd6" => [0, "\x9e-"], "\xd7" => [0, "\x9e."], "\xd8" => [0, "\x9e/"], "\xd9" => [0, "\x9e3"], "\xda" => [0, "\x9e4"], "\xdb" => [0, "\x9e5"], "\xdc" => [0, "\x9e6"], "\xdd" => [0, "\x9e7"], "\xde" => [0, "\x9e8"], "\xdf" => [0, "\x9e9"], "\xe0" => [0, "\x9e="], "\xe1" => [0, "\x9eA"], "\xe2" => [0, "\x9e_"], "\xe3" => [0, "\x9eb"], "\xe4" => [0, "\x9ed"], "\xe5" => [0, "\x9ef"], "\xe6" => [0, "\x9eg"], "\xe7" => [0, "\x9eh"], "\xe8" => [0, "\x9el"], "\xe9" => [0, "\x9em"], "\xea" => [0, "\x9en"], "\xeb" => [0, "\x9ep"], "\xec" => [0, "\x9er"], "\xed" => [0, "\x9eu"], "\xee" => [100, "\x9e"], "\xef" => [110, "\x9e"], "\xf0" => [111, "\x9e"], "\xf1" => [115, "\x9e"], "\xf2" => [116, "\x9e"], "\xf3" => [118, "\x9e"], "\xf4" => [119, "\x9e"], "\xf5" => [122, "\x9e"], "\xf6" => [123, "\x9e"], "\xf7" => [125, "\x9e"], "\xf8" => [126, "\x9e"], "\xf9" => [129, "\x9e"], "\xfa" => [143, "\x9e"], "\xfb" => [148, "\x9e"], "\xfc" => [151, "\x9e"], "\xfd" => [153, "\x9e"], "\xfe" => [83, "\x9e"], "\xff" => [10, "\x9e"]], ["\x00" => [94, "\x990"], "\x01" => [76, "\x990"], "\x02" => [104, "\x990"], "\x03" => [16, "\x990"], "\x04" => [94, "\x991"], "\x05" => [76, "\x991"], "\x06" => [104, "\x991"], "\x07" => [16, "\x991"], "\x08" => [94, "\x992"], "\t" => [76, "\x992"], "\n" => [104, "\x992"], "\v" => [16, "\x992"], "\f" => [94, "\x99a"], "\r" => [76, "\x99a"], "\x0e" => [104, "\x99a"], "\x0f" => [16, "\x99a"], "\x10" => [94, "\x99c"], "\x11" => [76, "\x99c"], "\x12" => [104, "\x99c"], "\x13" => [16, "\x99c"], "\x14" => [94, "\x99e"], "\x15" => [76, "\x99e"], "\x16" => [104, "\x99e"], "\x17" => [16, "\x99e"], "\x18" => [94, "\x99i"], "\x19" => [76, "\x99i"], "\x1a" => [104, "\x99i"], "\x1b" => [16, "\x99i"], "\x1c" => [94, "\x99o"], "\x1d" => [76, "\x99o"], "\x1e" => [104, "\x99o"], "\x1f" => [16, "\x99o"], " " => [94, "\x99s"], "!" => [76, "\x99s"], "\"" => [104, "\x99s"], "#" => [16, "\x99s"], "\$" => [94, "\x99t"], "%" => [76, "\x99t"], "&" => [104, "\x99t"], "'" => [16, "\x99t"], "(" => [77, "\x99 "], ")" => [18, "\x99 "], "*" => [77, "\x99%"], "+" => [18, "\x99%"], "," => [77, "\x99-"], "-" => [18, "\x99-"], "." => [77, "\x99."], "/" => [18, "\x99."], [77, "\x99/"], [18, "\x99/"], [77, "\x993"], [18, "\x993"], [77, "\x994"], [18, "\x994"], [77, "\x995"], [18, "\x995"], [77, "\x996"], [18, "\x996"], ":" => [77, "\x997"], ";" => [18, "\x997"], "<" => [77, "\x998"], "=" => [18, "\x998"], ">" => [77, "\x999"], "?" => [18, "\x999"], "@" => [77, "\x99="], "A" => [18, "\x99="], "B" => [77, "\x99A"], "C" => [18, "\x99A"], "D" => [77, "\x99_"], "E" => [18, "\x99_"], "F" => [77, "\x99b"], "G" => [18, "\x99b"], "H" => [77, "\x99d"], "I" => [18, "\x99d"], "J" => [77, "\x99f"], "K" => [18, "\x99f"], "L" => [77, "\x99g"], "M" => [18, "\x99g"], "N" => [77, "\x99h"], "O" => [18, "\x99h"], "P" => [77, "\x99l"], "Q" => [18, "\x99l"], "R" => [77, "\x99m"], "S" => [18, "\x99m"], "T" => [77, "\x99n"], "U" => [18, "\x99n"], "V" => [77, "\x99p"], "W" => [18, "\x99p"], "X" => [77, "\x99r"], "Y" => [18, "\x99r"], "Z" => [77, "\x99u"], "[" => [18, "\x99u"], "\\" => [0, "\x99:"], "]" => [0, "\x99B"], "^" => [0, "\x99C"], "_" => [0, "\x99D"], "`" => [0, "\x99E"], "a" => [0, "\x99F"], "b" => [0, "\x99G"], "c" => [0, "\x99H"], "d" => [0, "\x99I"], "e" => [0, "\x99J"], "f" => [0, "\x99K"], "g" => [0, "\x99L"], "h" => [0, "\x99M"], "i" => [0, "\x99N"], "j" => [0, "\x99O"], "k" => [0, "\x99P"], "l" => [0, "\x99Q"], "m" => [0, "\x99R"], "n" => [0, "\x99S"], "o" => [0, "\x99T"], "p" => [0, "\x99U"], "q" => [0, "\x99V"], "r" => [0, "\x99W"], "s" => [0, "\x99Y"], "t" => [0, "\x99j"], "u" => [0, "\x99k"], "v" => [0, "\x99q"], "w" => [0, "\x99v"], "x" => [0, "\x99w"], "y" => [0, "\x99x"], "z" => [0, "\x99y"], "{" => [0, "\x99z"], "|" => [82, "\x99"], "}" => [87, "\x99"], "~" => [130, "\x99"], "" => [9, "\x99"], "\x80" => [94, "\xa10"], "\x81" => [76, "\xa10"], "\x82" => [104, "\xa10"], "\x83" => [16, "\xa10"], "\x84" => [94, "\xa11"], "\x85" => [76, "\xa11"], "\x86" => [104, "\xa11"], "\x87" => [16, "\xa11"], "\x88" => [94, "\xa12"], "\x89" => [76, "\xa12"], "\x8a" => [104, "\xa12"], "\x8b" => [16, "\xa12"], "\x8c" => [94, "\xa1a"], "\x8d" => [76, "\xa1a"], "\x8e" => [104, "\xa1a"], "\x8f" => [16, "\xa1a"], "\x90" => [94, "\xa1c"], "\x91" => [76, "\xa1c"], "\x92" => [104, "\xa1c"], "\x93" => [16, "\xa1c"], "\x94" => [94, "\xa1e"], "\x95" => [76, "\xa1e"], "\x96" => [104, "\xa1e"], "\x97" => [16, "\xa1e"], "\x98" => [94, "\xa1i"], "\x99" => [76, "\xa1i"], "\x9a" => [104, "\xa1i"], "\x9b" => [16, "\xa1i"], "\x9c" => [94, "\xa1o"], "\x9d" => [76, "\xa1o"], "\x9e" => [104, "\xa1o"], "\x9f" => [16, "\xa1o"], "\xa0" => [94, "\xa1s"], "\xa1" => [76, "\xa1s"], "\xa2" => [104, "\xa1s"], "\xa3" => [16, "\xa1s"], "\xa4" => [94, "\xa1t"], "\xa5" => [76, "\xa1t"], "\xa6" => [104, "\xa1t"], "\xa7" => [16, "\xa1t"], "\xa8" => [77, "\xa1 "], "\xa9" => [18, "\xa1 "], "\xaa" => [77, "\xa1%"], "\xab" => [18, "\xa1%"], "\xac" => [77, "\xa1-"], "\xad" => [18, "\xa1-"], "\xae" => [77, "\xa1."], "\xaf" => [18, "\xa1."], "\xb0" => [77, "\xa1/"], "\xb1" => [18, "\xa1/"], "\xb2" => [77, "\xa13"], "\xb3" => [18, "\xa13"], "\xb4" => [77, "\xa14"], "\xb5" => [18, "\xa14"], "\xb6" => [77, "\xa15"], "\xb7" => [18, "\xa15"], "\xb8" => [77, "\xa16"], "\xb9" => [18, "\xa16"], "\xba" => [77, "\xa17"], "\xbb" => [18, "\xa17"], "\xbc" => [77, "\xa18"], "\xbd" => [18, "\xa18"], "\xbe" => [77, "\xa19"], "\xbf" => [18, "\xa19"], "\xc0" => [77, "\xa1="], "\xc1" => [18, "\xa1="], "\xc2" => [77, "\xa1A"], "\xc3" => [18, "\xa1A"], "\xc4" => [77, "\xa1_"], "\xc5" => [18, "\xa1_"], "\xc6" => [77, "\xa1b"], "\xc7" => [18, "\xa1b"], "\xc8" => [77, "\xa1d"], "\xc9" => [18, "\xa1d"], "\xca" => [77, "\xa1f"], "\xcb" => [18, "\xa1f"], "\xcc" => [77, "\xa1g"], "\xcd" => [18, "\xa1g"], "\xce" => [77, "\xa1h"], "\xcf" => [18, "\xa1h"], "\xd0" => [77, "\xa1l"], "\xd1" => [18, "\xa1l"], "\xd2" => [77, "\xa1m"], "\xd3" => [18, "\xa1m"], "\xd4" => [77, "\xa1n"], "\xd5" => [18, "\xa1n"], "\xd6" => [77, "\xa1p"], "\xd7" => [18, "\xa1p"], "\xd8" => [77, "\xa1r"], "\xd9" => [18, "\xa1r"], "\xda" => [77, "\xa1u"], "\xdb" => [18, "\xa1u"], "\xdc" => [0, "\xa1:"], "\xdd" => [0, "\xa1B"], "\xde" => [0, "\xa1C"], "\xdf" => [0, "\xa1D"], "\xe0" => [0, "\xa1E"], "\xe1" => [0, "\xa1F"], "\xe2" => [0, "\xa1G"], "\xe3" => [0, "\xa1H"], "\xe4" => [0, "\xa1I"], "\xe5" => [0, "\xa1J"], "\xe6" => [0, "\xa1K"], "\xe7" => [0, "\xa1L"], "\xe8" => [0, "\xa1M"], "\xe9" => [0, "\xa1N"], "\xea" => [0, "\xa1O"], "\xeb" => [0, "\xa1P"], "\xec" => [0, "\xa1Q"], "\xed" => [0, "\xa1R"], "\xee" => [0, "\xa1S"], "\xef" => [0, "\xa1T"], "\xf0" => [0, "\xa1U"], "\xf1" => [0, "\xa1V"], "\xf2" => [0, "\xa1W"], "\xf3" => [0, "\xa1Y"], "\xf4" => [0, "\xa1j"], "\xf5" => [0, "\xa1k"], "\xf6" => [0, "\xa1q"], "\xf7" => [0, "\xa1v"], "\xf8" => [0, "\xa1w"], "\xf9" => [0, "\xa1x"], "\xfa" => [0, "\xa1y"], "\xfb" => [0, "\xa1z"], "\xfc" => [82, "\xa1"], "\xfd" => [87, "\xa1"], "\xfe" => [130, "\xa1"], "\xff" => [9, "\xa1"]], ["\x00" => [77, "\x990"], "\x01" => [18, "\x990"], "\x02" => [77, "\x991"], "\x03" => [18, "\x991"], "\x04" => [77, "\x992"], "\x05" => [18, "\x992"], "\x06" => [77, "\x99a"], "\x07" => [18, "\x99a"], "\x08" => [77, "\x99c"], "\t" => [18, "\x99c"], "\n" => [77, "\x99e"], "\v" => [18, "\x99e"], "\f" => [77, "\x99i"], "\r" => [18, "\x99i"], "\x0e" => [77, "\x99o"], "\x0f" => [18, "\x99o"], "\x10" => [77, "\x99s"], "\x11" => [18, "\x99s"], "\x12" => [77, "\x99t"], "\x13" => [18, "\x99t"], "\x14" => [0, "\x99 "], "\x15" => [0, "\x99%"], "\x16" => [0, "\x99-"], "\x17" => [0, "\x99."], "\x18" => [0, "\x99/"], "\x19" => [0, "\x993"], "\x1a" => [0, "\x994"], "\x1b" => [0, "\x995"], "\x1c" => [0, "\x996"], "\x1d" => [0, "\x997"], "\x1e" => [0, "\x998"], "\x1f" => [0, "\x999"], " " => [0, "\x99="], "!" => [0, "\x99A"], "\"" => [0, "\x99_"], "#" => [0, "\x99b"], "\$" => [0, "\x99d"], "%" => [0, "\x99f"], "&" => [0, "\x99g"], "'" => [0, "\x99h"], "(" => [0, "\x99l"], ")" => [0, "\x99m"], "*" => [0, "\x99n"], "+" => [0, "\x99p"], "," => [0, "\x99r"], "-" => [0, "\x99u"], "." => [100, "\x99"], "/" => [110, "\x99"], [111, "\x99"], [115, "\x99"], [116, "\x99"], [118, "\x99"], [119, "\x99"], [122, "\x99"], [123, "\x99"], [125, "\x99"], [126, "\x99"], [129, "\x99"], ":" => [143, "\x99"], ";" => [148, "\x99"], "<" => [151, "\x99"], "=" => [153, "\x99"], ">" => [83, "\x99"], "?" => [10, "\x99"], "@" => [77, "\xa10"], "A" => [18, "\xa10"], "B" => [77, "\xa11"], "C" => [18, "\xa11"], "D" => [77, "\xa12"], "E" => [18, "\xa12"], "F" => [77, "\xa1a"], "G" => [18, "\xa1a"], "H" => [77, "\xa1c"], "I" => [18, "\xa1c"], "J" => [77, "\xa1e"], "K" => [18, "\xa1e"], "L" => [77, "\xa1i"], "M" => [18, "\xa1i"], "N" => [77, "\xa1o"], "O" => [18, "\xa1o"], "P" => [77, "\xa1s"], "Q" => [18, "\xa1s"], "R" => [77, "\xa1t"], "S" => [18, "\xa1t"], "T" => [0, "\xa1 "], "U" => [0, "\xa1%"], "V" => [0, "\xa1-"], "W" => [0, "\xa1."], "X" => [0, "\xa1/"], "Y" => [0, "\xa13"], "Z" => [0, "\xa14"], "[" => [0, "\xa15"], "\\" => [0, "\xa16"], "]" => [0, "\xa17"], "^" => [0, "\xa18"], "_" => [0, "\xa19"], "`" => [0, "\xa1="], "a" => [0, "\xa1A"], "b" => [0, "\xa1_"], "c" => [0, "\xa1b"], "d" => [0, "\xa1d"], "e" => [0, "\xa1f"], "f" => [0, "\xa1g"], "g" => [0, "\xa1h"], "h" => [0, "\xa1l"], "i" => [0, "\xa1m"], "j" => [0, "\xa1n"], "k" => [0, "\xa1p"], "l" => [0, "\xa1r"], "m" => [0, "\xa1u"], "n" => [100, "\xa1"], "o" => [110, "\xa1"], "p" => [111, "\xa1"], "q" => [115, "\xa1"], "r" => [116, "\xa1"], "s" => [118, "\xa1"], "t" => [119, "\xa1"], "u" => [122, "\xa1"], "v" => [123, "\xa1"], "w" => [125, "\xa1"], "x" => [126, "\xa1"], "y" => [129, "\xa1"], "z" => [143, "\xa1"], "{" => [148, "\xa1"], "|" => [151, "\xa1"], "}" => [153, "\xa1"], "~" => [83, "\xa1"], "" => [10, "\xa1"], "\x80" => [77, "\xa70"], "\x81" => [18, "\xa70"], "\x82" => [77, "\xa71"], "\x83" => [18, "\xa71"], "\x84" => [77, "\xa72"], "\x85" => [18, "\xa72"], "\x86" => [77, "\xa7a"], "\x87" => [18, "\xa7a"], "\x88" => [77, "\xa7c"], "\x89" => [18, "\xa7c"], "\x8a" => [77, "\xa7e"], "\x8b" => [18, "\xa7e"], "\x8c" => [77, "\xa7i"], "\x8d" => [18, "\xa7i"], "\x8e" => [77, "\xa7o"], "\x8f" => [18, "\xa7o"], "\x90" => [77, "\xa7s"], "\x91" => [18, "\xa7s"], "\x92" => [77, "\xa7t"], "\x93" => [18, "\xa7t"], "\x94" => [0, "\xa7 "], "\x95" => [0, "\xa7%"], "\x96" => [0, "\xa7-"], "\x97" => [0, "\xa7."], "\x98" => [0, "\xa7/"], "\x99" => [0, "\xa73"], "\x9a" => [0, "\xa74"], "\x9b" => [0, "\xa75"], "\x9c" => [0, "\xa76"], "\x9d" => [0, "\xa77"], "\x9e" => [0, "\xa78"], "\x9f" => [0, "\xa79"], "\xa0" => [0, "\xa7="], "\xa1" => [0, "\xa7A"], "\xa2" => [0, "\xa7_"], "\xa3" => [0, "\xa7b"], "\xa4" => [0, "\xa7d"], "\xa5" => [0, "\xa7f"], "\xa6" => [0, "\xa7g"], "\xa7" => [0, "\xa7h"], "\xa8" => [0, "\xa7l"], "\xa9" => [0, "\xa7m"], "\xaa" => [0, "\xa7n"], "\xab" => [0, "\xa7p"], "\xac" => [0, "\xa7r"], "\xad" => [0, "\xa7u"], "\xae" => [100, "\xa7"], "\xaf" => [110, "\xa7"], "\xb0" => [111, "\xa7"], "\xb1" => [115, "\xa7"], "\xb2" => [116, "\xa7"], "\xb3" => [118, "\xa7"], "\xb4" => [119, "\xa7"], "\xb5" => [122, "\xa7"], "\xb6" => [123, "\xa7"], "\xb7" => [125, "\xa7"], "\xb8" => [126, "\xa7"], "\xb9" => [129, "\xa7"], "\xba" => [143, "\xa7"], "\xbb" => [148, "\xa7"], "\xbc" => [151, "\xa7"], "\xbd" => [153, "\xa7"], "\xbe" => [83, "\xa7"], "\xbf" => [10, "\xa7"], "\xc0" => [77, "\xac0"], "\xc1" => [18, "\xac0"], "\xc2" => [77, "\xac1"], "\xc3" => [18, "\xac1"], "\xc4" => [77, "\xac2"], "\xc5" => [18, "\xac2"], "\xc6" => [77, "\xaca"], "\xc7" => [18, "\xaca"], "\xc8" => [77, "\xacc"], "\xc9" => [18, "\xacc"], "\xca" => [77, "\xace"], "\xcb" => [18, "\xace"], "\xcc" => [77, "\xaci"], "\xcd" => [18, "\xaci"], "\xce" => [77, "\xaco"], "\xcf" => [18, "\xaco"], "\xd0" => [77, "\xacs"], "\xd1" => [18, "\xacs"], "\xd2" => [77, "\xact"], "\xd3" => [18, "\xact"], "\xd4" => [0, "\xac "], "\xd5" => [0, "\xac%"], "\xd6" => [0, "\xac-"], "\xd7" => [0, "\xac."], "\xd8" => [0, "\xac/"], "\xd9" => [0, "\xac3"], "\xda" => [0, "\xac4"], "\xdb" => [0, "\xac5"], "\xdc" => [0, "\xac6"], "\xdd" => [0, "\xac7"], "\xde" => [0, "\xac8"], "\xdf" => [0, "\xac9"], "\xe0" => [0, "\xac="], "\xe1" => [0, "\xacA"], "\xe2" => [0, "\xac_"], "\xe3" => [0, "\xacb"], "\xe4" => [0, "\xacd"], "\xe5" => [0, "\xacf"], "\xe6" => [0, "\xacg"], "\xe7" => [0, "\xach"], "\xe8" => [0, "\xacl"], "\xe9" => [0, "\xacm"], "\xea" => [0, "\xacn"], "\xeb" => [0, "\xacp"], "\xec" => [0, "\xacr"], "\xed" => [0, "\xacu"], "\xee" => [100, "\xac"], "\xef" => [110, "\xac"], "\xf0" => [111, "\xac"], "\xf1" => [115, "\xac"], "\xf2" => [116, "\xac"], "\xf3" => [118, "\xac"], "\xf4" => [119, "\xac"], "\xf5" => [122, "\xac"], "\xf6" => [123, "\xac"], "\xf7" => [125, "\xac"], "\xf8" => [126, "\xac"], "\xf9" => [129, "\xac"], "\xfa" => [143, "\xac"], "\xfb" => [148, "\xac"], "\xfc" => [151, "\xac"], "\xfd" => [153, "\xac"], "\xfe" => [83, "\xac"], "\xff" => [10, "\xac"]], ["\x00" => [77, "\xe00"], "\x01" => [18, "\xe00"], "\x02" => [77, "\xe01"], "\x03" => [18, "\xe01"], "\x04" => [77, "\xe02"], "\x05" => [18, "\xe02"], "\x06" => [77, "\xe0a"], "\x07" => [18, "\xe0a"], "\x08" => [77, "\xe0c"], "\t" => [18, "\xe0c"], "\n" => [77, "\xe0e"], "\v" => [18, "\xe0e"], "\f" => [77, "\xe0i"], "\r" => [18, "\xe0i"], "\x0e" => [77, "\xe0o"], "\x0f" => [18, "\xe0o"], "\x10" => [77, "\xe0s"], "\x11" => [18, "\xe0s"], "\x12" => [77, "\xe0t"], "\x13" => [18, "\xe0t"], "\x14" => [0, "\xe0 "], "\x15" => [0, "\xe0%"], "\x16" => [0, "\xe0-"], "\x17" => [0, "\xe0."], "\x18" => [0, "\xe0/"], "\x19" => [0, "\xe03"], "\x1a" => [0, "\xe04"], "\x1b" => [0, "\xe05"], "\x1c" => [0, "\xe06"], "\x1d" => [0, "\xe07"], "\x1e" => [0, "\xe08"], "\x1f" => [0, "\xe09"], " " => [0, "\xe0="], "!" => [0, "\xe0A"], "\"" => [0, "\xe0_"], "#" => [0, "\xe0b"], "\$" => [0, "\xe0d"], "%" => [0, "\xe0f"], "&" => [0, "\xe0g"], "'" => [0, "\xe0h"], "(" => [0, "\xe0l"], ")" => [0, "\xe0m"], "*" => [0, "\xe0n"], "+" => [0, "\xe0p"], "," => [0, "\xe0r"], "-" => [0, "\xe0u"], "." => [100, "\xe0"], "/" => [110, "\xe0"], [111, "\xe0"], [115, "\xe0"], [116, "\xe0"], [118, "\xe0"], [119, "\xe0"], [122, "\xe0"], [123, "\xe0"], [125, "\xe0"], [126, "\xe0"], [129, "\xe0"], ":" => [143, "\xe0"], ";" => [148, "\xe0"], "<" => [151, "\xe0"], "=" => [153, "\xe0"], ">" => [83, "\xe0"], "?" => [10, "\xe0"], "@" => [77, "\xe20"], "A" => [18, "\xe20"], "B" => [77, "\xe21"], "C" => [18, "\xe21"], "D" => [77, "\xe22"], "E" => [18, "\xe22"], "F" => [77, "\xe2a"], "G" => [18, "\xe2a"], "H" => [77, "\xe2c"], "I" => [18, "\xe2c"], "J" => [77, "\xe2e"], "K" => [18, "\xe2e"], "L" => [77, "\xe2i"], "M" => [18, "\xe2i"], "N" => [77, "\xe2o"], "O" => [18, "\xe2o"], "P" => [77, "\xe2s"], "Q" => [18, "\xe2s"], "R" => [77, "\xe2t"], "S" => [18, "\xe2t"], "T" => [0, "\xe2 "], "U" => [0, "\xe2%"], "V" => [0, "\xe2-"], "W" => [0, "\xe2."], "X" => [0, "\xe2/"], "Y" => [0, "\xe23"], "Z" => [0, "\xe24"], "[" => [0, "\xe25"], "\\" => [0, "\xe26"], "]" => [0, "\xe27"], "^" => [0, "\xe28"], "_" => [0, "\xe29"], "`" => [0, "\xe2="], "a" => [0, "\xe2A"], "b" => [0, "\xe2_"], "c" => [0, "\xe2b"], "d" => [0, "\xe2d"], "e" => [0, "\xe2f"], "f" => [0, "\xe2g"], "g" => [0, "\xe2h"], "h" => [0, "\xe2l"], "i" => [0, "\xe2m"], "j" => [0, "\xe2n"], "k" => [0, "\xe2p"], "l" => [0, "\xe2r"], "m" => [0, "\xe2u"], "n" => [100, "\xe2"], "o" => [110, "\xe2"], "p" => [111, "\xe2"], "q" => [115, "\xe2"], "r" => [116, "\xe2"], "s" => [118, "\xe2"], "t" => [119, "\xe2"], "u" => [122, "\xe2"], "v" => [123, "\xe2"], "w" => [125, "\xe2"], "x" => [126, "\xe2"], "y" => [129, "\xe2"], "z" => [143, "\xe2"], "{" => [148, "\xe2"], "|" => [151, "\xe2"], "}" => [153, "\xe2"], "~" => [83, "\xe2"], "" => [10, "\xe2"], "\x80" => [0, "\x990"], "\x81" => [0, "\x991"], "\x82" => [0, "\x992"], "\x83" => [0, "\x99a"], "\x84" => [0, "\x99c"], "\x85" => [0, "\x99e"], "\x86" => [0, "\x99i"], "\x87" => [0, "\x99o"], "\x88" => [0, "\x99s"], "\x89" => [0, "\x99t"], "\x8a" => [73, "\x99"], "\x8b" => [88, "\x99"], "\x8c" => [89, "\x99"], "\x8d" => [96, "\x99"], "\x8e" => [97, "\x99"], "\x8f" => [99, "\x99"], "\x90" => [106, "\x99"], "\x91" => [136, "\x99"], "\x92" => [139, "\x99"], "\x93" => [141, "\x99"], "\x94" => [145, "\x99"], "\x95" => [147, "\x99"], "\x96" => [149, "\x99"], "\x97" => [101, "\x99"], "\x98" => [112, "\x99"], "\x99" => [117, "\x99"], "\x9a" => [120, "\x99"], "\x9b" => [124, "\x99"], "\x9c" => [127, "\x99"], "\x9d" => [144, "\x99"], "\x9e" => [152, "\x99"], "\x9f" => [11, "\x99"], "\xa0" => [0, "\xa10"], "\xa1" => [0, "\xa11"], "\xa2" => [0, "\xa12"], "\xa3" => [0, "\xa1a"], "\xa4" => [0, "\xa1c"], "\xa5" => [0, "\xa1e"], "\xa6" => [0, "\xa1i"], "\xa7" => [0, "\xa1o"], "\xa8" => [0, "\xa1s"], "\xa9" => [0, "\xa1t"], "\xaa" => [73, "\xa1"], "\xab" => [88, "\xa1"], "\xac" => [89, "\xa1"], "\xad" => [96, "\xa1"], "\xae" => [97, "\xa1"], "\xaf" => [99, "\xa1"], "\xb0" => [106, "\xa1"], "\xb1" => [136, "\xa1"], "\xb2" => [139, "\xa1"], "\xb3" => [141, "\xa1"], "\xb4" => [145, "\xa1"], "\xb5" => [147, "\xa1"], "\xb6" => [149, "\xa1"], "\xb7" => [101, "\xa1"], "\xb8" => [112, "\xa1"], "\xb9" => [117, "\xa1"], "\xba" => [120, "\xa1"], "\xbb" => [124, "\xa1"], "\xbc" => [127, "\xa1"], "\xbd" => [144, "\xa1"], "\xbe" => [152, "\xa1"], "\xbf" => [11, "\xa1"], "\xc0" => [0, "\xa70"], "\xc1" => [0, "\xa71"], "\xc2" => [0, "\xa72"], "\xc3" => [0, "\xa7a"], "\xc4" => [0, "\xa7c"], "\xc5" => [0, "\xa7e"], "\xc6" => [0, "\xa7i"], "\xc7" => [0, "\xa7o"], "\xc8" => [0, "\xa7s"], "\xc9" => [0, "\xa7t"], "\xca" => [73, "\xa7"], "\xcb" => [88, "\xa7"], "\xcc" => [89, "\xa7"], "\xcd" => [96, "\xa7"], "\xce" => [97, "\xa7"], "\xcf" => [99, "\xa7"], "\xd0" => [106, "\xa7"], "\xd1" => [136, "\xa7"], "\xd2" => [139, "\xa7"], "\xd3" => [141, "\xa7"], "\xd4" => [145, "\xa7"], "\xd5" => [147, "\xa7"], "\xd6" => [149, "\xa7"], "\xd7" => [101, "\xa7"], "\xd8" => [112, "\xa7"], "\xd9" => [117, "\xa7"], "\xda" => [120, "\xa7"], "\xdb" => [124, "\xa7"], "\xdc" => [127, "\xa7"], "\xdd" => [144, "\xa7"], "\xde" => [152, "\xa7"], "\xdf" => [11, "\xa7"], "\xe0" => [0, "\xac0"], "\xe1" => [0, "\xac1"], "\xe2" => [0, "\xac2"], "\xe3" => [0, "\xaca"], "\xe4" => [0, "\xacc"], "\xe5" => [0, "\xace"], "\xe6" => [0, "\xaci"], "\xe7" => [0, "\xaco"], "\xe8" => [0, "\xacs"], "\xe9" => [0, "\xact"], "\xea" => [73, "\xac"], "\xeb" => [88, "\xac"], "\xec" => [89, "\xac"], "\xed" => [96, "\xac"], "\xee" => [97, "\xac"], "\xef" => [99, "\xac"], "\xf0" => [106, "\xac"], "\xf1" => [136, "\xac"], "\xf2" => [139, "\xac"], "\xf3" => [141, "\xac"], "\xf4" => [145, "\xac"], "\xf5" => [147, "\xac"], "\xf6" => [149, "\xac"], "\xf7" => [101, "\xac"], "\xf8" => [112, "\xac"], "\xf9" => [117, "\xac"], "\xfa" => [120, "\xac"], "\xfb" => [124, "\xac"], "\xfc" => [127, "\xac"], "\xfd" => [144, "\xac"], "\xfe" => [152, "\xac"], "\xff" => [11, "\xac"]], ["\x00" => [94, "\x9a0"], "\x01" => [76, "\x9a0"], "\x02" => [104, "\x9a0"], "\x03" => [16, "\x9a0"], "\x04" => [94, "\x9a1"], "\x05" => [76, "\x9a1"], "\x06" => [104, "\x9a1"], "\x07" => [16, "\x9a1"], "\x08" => [94, "\x9a2"], "\t" => [76, "\x9a2"], "\n" => [104, "\x9a2"], "\v" => [16, "\x9a2"], "\f" => [94, "\x9aa"], "\r" => [76, "\x9aa"], "\x0e" => [104, "\x9aa"], "\x0f" => [16, "\x9aa"], "\x10" => [94, "\x9ac"], "\x11" => [76, "\x9ac"], "\x12" => [104, "\x9ac"], "\x13" => [16, "\x9ac"], "\x14" => [94, "\x9ae"], "\x15" => [76, "\x9ae"], "\x16" => [104, "\x9ae"], "\x17" => [16, "\x9ae"], "\x18" => [94, "\x9ai"], "\x19" => [76, "\x9ai"], "\x1a" => [104, "\x9ai"], "\x1b" => [16, "\x9ai"], "\x1c" => [94, "\x9ao"], "\x1d" => [76, "\x9ao"], "\x1e" => [104, "\x9ao"], "\x1f" => [16, "\x9ao"], " " => [94, "\x9as"], "!" => [76, "\x9as"], "\"" => [104, "\x9as"], "#" => [16, "\x9as"], "\$" => [94, "\x9at"], "%" => [76, "\x9at"], "&" => [104, "\x9at"], "'" => [16, "\x9at"], "(" => [77, "\x9a "], ")" => [18, "\x9a "], "*" => [77, "\x9a%"], "+" => [18, "\x9a%"], "," => [77, "\x9a-"], "-" => [18, "\x9a-"], "." => [77, "\x9a."], "/" => [18, "\x9a."], [77, "\x9a/"], [18, "\x9a/"], [77, "\x9a3"], [18, "\x9a3"], [77, "\x9a4"], [18, "\x9a4"], [77, "\x9a5"], [18, "\x9a5"], [77, "\x9a6"], [18, "\x9a6"], ":" => [77, "\x9a7"], ";" => [18, "\x9a7"], "<" => [77, "\x9a8"], "=" => [18, "\x9a8"], ">" => [77, "\x9a9"], "?" => [18, "\x9a9"], "@" => [77, "\x9a="], "A" => [18, "\x9a="], "B" => [77, "\x9aA"], "C" => [18, "\x9aA"], "D" => [77, "\x9a_"], "E" => [18, "\x9a_"], "F" => [77, "\x9ab"], "G" => [18, "\x9ab"], "H" => [77, "\x9ad"], "I" => [18, "\x9ad"], "J" => [77, "\x9af"], "K" => [18, "\x9af"], "L" => [77, "\x9ag"], "M" => [18, "\x9ag"], "N" => [77, "\x9ah"], "O" => [18, "\x9ah"], "P" => [77, "\x9al"], "Q" => [18, "\x9al"], "R" => [77, "\x9am"], "S" => [18, "\x9am"], "T" => [77, "\x9an"], "U" => [18, "\x9an"], "V" => [77, "\x9ap"], "W" => [18, "\x9ap"], "X" => [77, "\x9ar"], "Y" => [18, "\x9ar"], "Z" => [77, "\x9au"], "[" => [18, "\x9au"], "\\" => [0, "\x9a:"], "]" => [0, "\x9aB"], "^" => [0, "\x9aC"], "_" => [0, "\x9aD"], "`" => [0, "\x9aE"], "a" => [0, "\x9aF"], "b" => [0, "\x9aG"], "c" => [0, "\x9aH"], "d" => [0, "\x9aI"], "e" => [0, "\x9aJ"], "f" => [0, "\x9aK"], "g" => [0, "\x9aL"], "h" => [0, "\x9aM"], "i" => [0, "\x9aN"], "j" => [0, "\x9aO"], "k" => [0, "\x9aP"], "l" => [0, "\x9aQ"], "m" => [0, "\x9aR"], "n" => [0, "\x9aS"], "o" => [0, "\x9aT"], "p" => [0, "\x9aU"], "q" => [0, "\x9aV"], "r" => [0, "\x9aW"], "s" => [0, "\x9aY"], "t" => [0, "\x9aj"], "u" => [0, "\x9ak"], "v" => [0, "\x9aq"], "w" => [0, "\x9av"], "x" => [0, "\x9aw"], "y" => [0, "\x9ax"], "z" => [0, "\x9ay"], "{" => [0, "\x9az"], "|" => [82, "\x9a"], "}" => [87, "\x9a"], "~" => [130, "\x9a"], "" => [9, "\x9a"], "\x80" => [94, "\x9c0"], "\x81" => [76, "\x9c0"], "\x82" => [104, "\x9c0"], "\x83" => [16, "\x9c0"], "\x84" => [94, "\x9c1"], "\x85" => [76, "\x9c1"], "\x86" => [104, "\x9c1"], "\x87" => [16, "\x9c1"], "\x88" => [94, "\x9c2"], "\x89" => [76, "\x9c2"], "\x8a" => [104, "\x9c2"], "\x8b" => [16, "\x9c2"], "\x8c" => [94, "\x9ca"], "\x8d" => [76, "\x9ca"], "\x8e" => [104, "\x9ca"], "\x8f" => [16, "\x9ca"], "\x90" => [94, "\x9cc"], "\x91" => [76, "\x9cc"], "\x92" => [104, "\x9cc"], "\x93" => [16, "\x9cc"], "\x94" => [94, "\x9ce"], "\x95" => [76, "\x9ce"], "\x96" => [104, "\x9ce"], "\x97" => [16, "\x9ce"], "\x98" => [94, "\x9ci"], "\x99" => [76, "\x9ci"], "\x9a" => [104, "\x9ci"], "\x9b" => [16, "\x9ci"], "\x9c" => [94, "\x9co"], "\x9d" => [76, "\x9co"], "\x9e" => [104, "\x9co"], "\x9f" => [16, "\x9co"], "\xa0" => [94, "\x9cs"], "\xa1" => [76, "\x9cs"], "\xa2" => [104, "\x9cs"], "\xa3" => [16, "\x9cs"], "\xa4" => [94, "\x9ct"], "\xa5" => [76, "\x9ct"], "\xa6" => [104, "\x9ct"], "\xa7" => [16, "\x9ct"], "\xa8" => [77, "\x9c "], "\xa9" => [18, "\x9c "], "\xaa" => [77, "\x9c%"], "\xab" => [18, "\x9c%"], "\xac" => [77, "\x9c-"], "\xad" => [18, "\x9c-"], "\xae" => [77, "\x9c."], "\xaf" => [18, "\x9c."], "\xb0" => [77, "\x9c/"], "\xb1" => [18, "\x9c/"], "\xb2" => [77, "\x9c3"], "\xb3" => [18, "\x9c3"], "\xb4" => [77, "\x9c4"], "\xb5" => [18, "\x9c4"], "\xb6" => [77, "\x9c5"], "\xb7" => [18, "\x9c5"], "\xb8" => [77, "\x9c6"], "\xb9" => [18, "\x9c6"], "\xba" => [77, "\x9c7"], "\xbb" => [18, "\x9c7"], "\xbc" => [77, "\x9c8"], "\xbd" => [18, "\x9c8"], "\xbe" => [77, "\x9c9"], "\xbf" => [18, "\x9c9"], "\xc0" => [77, "\x9c="], "\xc1" => [18, "\x9c="], "\xc2" => [77, "\x9cA"], "\xc3" => [18, "\x9cA"], "\xc4" => [77, "\x9c_"], "\xc5" => [18, "\x9c_"], "\xc6" => [77, "\x9cb"], "\xc7" => [18, "\x9cb"], "\xc8" => [77, "\x9cd"], "\xc9" => [18, "\x9cd"], "\xca" => [77, "\x9cf"], "\xcb" => [18, "\x9cf"], "\xcc" => [77, "\x9cg"], "\xcd" => [18, "\x9cg"], "\xce" => [77, "\x9ch"], "\xcf" => [18, "\x9ch"], "\xd0" => [77, "\x9cl"], "\xd1" => [18, "\x9cl"], "\xd2" => [77, "\x9cm"], "\xd3" => [18, "\x9cm"], "\xd4" => [77, "\x9cn"], "\xd5" => [18, "\x9cn"], "\xd6" => [77, "\x9cp"], "\xd7" => [18, "\x9cp"], "\xd8" => [77, "\x9cr"], "\xd9" => [18, "\x9cr"], "\xda" => [77, "\x9cu"], "\xdb" => [18, "\x9cu"], "\xdc" => [0, "\x9c:"], "\xdd" => [0, "\x9cB"], "\xde" => [0, "\x9cC"], "\xdf" => [0, "\x9cD"], "\xe0" => [0, "\x9cE"], "\xe1" => [0, "\x9cF"], "\xe2" => [0, "\x9cG"], "\xe3" => [0, "\x9cH"], "\xe4" => [0, "\x9cI"], "\xe5" => [0, "\x9cJ"], "\xe6" => [0, "\x9cK"], "\xe7" => [0, "\x9cL"], "\xe8" => [0, "\x9cM"], "\xe9" => [0, "\x9cN"], "\xea" => [0, "\x9cO"], "\xeb" => [0, "\x9cP"], "\xec" => [0, "\x9cQ"], "\xed" => [0, "\x9cR"], "\xee" => [0, "\x9cS"], "\xef" => [0, "\x9cT"], "\xf0" => [0, "\x9cU"], "\xf1" => [0, "\x9cV"], "\xf2" => [0, "\x9cW"], "\xf3" => [0, "\x9cY"], "\xf4" => [0, "\x9cj"], "\xf5" => [0, "\x9ck"], "\xf6" => [0, "\x9cq"], "\xf7" => [0, "\x9cv"], "\xf8" => [0, "\x9cw"], "\xf9" => [0, "\x9cx"], "\xfa" => [0, "\x9cy"], "\xfb" => [0, "\x9cz"], "\xfc" => [82, "\x9c"], "\xfd" => [87, "\x9c"], "\xfe" => [130, "\x9c"], "\xff" => [9, "\x9c"]], ["\x00" => [77, "\x9a0"], "\x01" => [18, "\x9a0"], "\x02" => [77, "\x9a1"], "\x03" => [18, "\x9a1"], "\x04" => [77, "\x9a2"], "\x05" => [18, "\x9a2"], "\x06" => [77, "\x9aa"], "\x07" => [18, "\x9aa"], "\x08" => [77, "\x9ac"], "\t" => [18, "\x9ac"], "\n" => [77, "\x9ae"], "\v" => [18, "\x9ae"], "\f" => [77, "\x9ai"], "\r" => [18, "\x9ai"], "\x0e" => [77, "\x9ao"], "\x0f" => [18, "\x9ao"], "\x10" => [77, "\x9as"], "\x11" => [18, "\x9as"], "\x12" => [77, "\x9at"], "\x13" => [18, "\x9at"], "\x14" => [0, "\x9a "], "\x15" => [0, "\x9a%"], "\x16" => [0, "\x9a-"], "\x17" => [0, "\x9a."], "\x18" => [0, "\x9a/"], "\x19" => [0, "\x9a3"], "\x1a" => [0, "\x9a4"], "\x1b" => [0, "\x9a5"], "\x1c" => [0, "\x9a6"], "\x1d" => [0, "\x9a7"], "\x1e" => [0, "\x9a8"], "\x1f" => [0, "\x9a9"], " " => [0, "\x9a="], "!" => [0, "\x9aA"], "\"" => [0, "\x9a_"], "#" => [0, "\x9ab"], "\$" => [0, "\x9ad"], "%" => [0, "\x9af"], "&" => [0, "\x9ag"], "'" => [0, "\x9ah"], "(" => [0, "\x9al"], ")" => [0, "\x9am"], "*" => [0, "\x9an"], "+" => [0, "\x9ap"], "," => [0, "\x9ar"], "-" => [0, "\x9au"], "." => [100, "\x9a"], "/" => [110, "\x9a"], [111, "\x9a"], [115, "\x9a"], [116, "\x9a"], [118, "\x9a"], [119, "\x9a"], [122, "\x9a"], [123, "\x9a"], [125, "\x9a"], [126, "\x9a"], [129, "\x9a"], ":" => [143, "\x9a"], ";" => [148, "\x9a"], "<" => [151, "\x9a"], "=" => [153, "\x9a"], ">" => [83, "\x9a"], "?" => [10, "\x9a"], "@" => [77, "\x9c0"], "A" => [18, "\x9c0"], "B" => [77, "\x9c1"], "C" => [18, "\x9c1"], "D" => [77, "\x9c2"], "E" => [18, "\x9c2"], "F" => [77, "\x9ca"], "G" => [18, "\x9ca"], "H" => [77, "\x9cc"], "I" => [18, "\x9cc"], "J" => [77, "\x9ce"], "K" => [18, "\x9ce"], "L" => [77, "\x9ci"], "M" => [18, "\x9ci"], "N" => [77, "\x9co"], "O" => [18, "\x9co"], "P" => [77, "\x9cs"], "Q" => [18, "\x9cs"], "R" => [77, "\x9ct"], "S" => [18, "\x9ct"], "T" => [0, "\x9c "], "U" => [0, "\x9c%"], "V" => [0, "\x9c-"], "W" => [0, "\x9c."], "X" => [0, "\x9c/"], "Y" => [0, "\x9c3"], "Z" => [0, "\x9c4"], "[" => [0, "\x9c5"], "\\" => [0, "\x9c6"], "]" => [0, "\x9c7"], "^" => [0, "\x9c8"], "_" => [0, "\x9c9"], "`" => [0, "\x9c="], "a" => [0, "\x9cA"], "b" => [0, "\x9c_"], "c" => [0, "\x9cb"], "d" => [0, "\x9cd"], "e" => [0, "\x9cf"], "f" => [0, "\x9cg"], "g" => [0, "\x9ch"], "h" => [0, "\x9cl"], "i" => [0, "\x9cm"], "j" => [0, "\x9cn"], "k" => [0, "\x9cp"], "l" => [0, "\x9cr"], "m" => [0, "\x9cu"], "n" => [100, "\x9c"], "o" => [110, "\x9c"], "p" => [111, "\x9c"], "q" => [115, "\x9c"], "r" => [116, "\x9c"], "s" => [118, "\x9c"], "t" => [119, "\x9c"], "u" => [122, "\x9c"], "v" => [123, "\x9c"], "w" => [125, "\x9c"], "x" => [126, "\x9c"], "y" => [129, "\x9c"], "z" => [143, "\x9c"], "{" => [148, "\x9c"], "|" => [151, "\x9c"], "}" => [153, "\x9c"], "~" => [83, "\x9c"], "" => [10, "\x9c"], "\x80" => [77, "\xa00"], "\x81" => [18, "\xa00"], "\x82" => [77, "\xa01"], "\x83" => [18, "\xa01"], "\x84" => [77, "\xa02"], "\x85" => [18, "\xa02"], "\x86" => [77, "\xa0a"], "\x87" => [18, "\xa0a"], "\x88" => [77, "\xa0c"], "\x89" => [18, "\xa0c"], "\x8a" => [77, "\xa0e"], "\x8b" => [18, "\xa0e"], "\x8c" => [77, "\xa0i"], "\x8d" => [18, "\xa0i"], "\x8e" => [77, "\xa0o"], "\x8f" => [18, "\xa0o"], "\x90" => [77, "\xa0s"], "\x91" => [18, "\xa0s"], "\x92" => [77, "\xa0t"], "\x93" => [18, "\xa0t"], "\x94" => [0, "\xa0 "], "\x95" => [0, "\xa0%"], "\x96" => [0, "\xa0-"], "\x97" => [0, "\xa0."], "\x98" => [0, "\xa0/"], "\x99" => [0, "\xa03"], "\x9a" => [0, "\xa04"], "\x9b" => [0, "\xa05"], "\x9c" => [0, "\xa06"], "\x9d" => [0, "\xa07"], "\x9e" => [0, "\xa08"], "\x9f" => [0, "\xa09"], "\xa0" => [0, "\xa0="], "\xa1" => [0, "\xa0A"], "\xa2" => [0, "\xa0_"], "\xa3" => [0, "\xa0b"], "\xa4" => [0, "\xa0d"], "\xa5" => [0, "\xa0f"], "\xa6" => [0, "\xa0g"], "\xa7" => [0, "\xa0h"], "\xa8" => [0, "\xa0l"], "\xa9" => [0, "\xa0m"], "\xaa" => [0, "\xa0n"], "\xab" => [0, "\xa0p"], "\xac" => [0, "\xa0r"], "\xad" => [0, "\xa0u"], "\xae" => [100, "\xa0"], "\xaf" => [110, "\xa0"], "\xb0" => [111, "\xa0"], "\xb1" => [115, "\xa0"], "\xb2" => [116, "\xa0"], "\xb3" => [118, "\xa0"], "\xb4" => [119, "\xa0"], "\xb5" => [122, "\xa0"], "\xb6" => [123, "\xa0"], "\xb7" => [125, "\xa0"], "\xb8" => [126, "\xa0"], "\xb9" => [129, "\xa0"], "\xba" => [143, "\xa0"], "\xbb" => [148, "\xa0"], "\xbc" => [151, "\xa0"], "\xbd" => [153, "\xa0"], "\xbe" => [83, "\xa0"], "\xbf" => [10, "\xa0"], "\xc0" => [77, "\xa30"], "\xc1" => [18, "\xa30"], "\xc2" => [77, "\xa31"], "\xc3" => [18, "\xa31"], "\xc4" => [77, "\xa32"], "\xc5" => [18, "\xa32"], "\xc6" => [77, "\xa3a"], "\xc7" => [18, "\xa3a"], "\xc8" => [77, "\xa3c"], "\xc9" => [18, "\xa3c"], "\xca" => [77, "\xa3e"], "\xcb" => [18, "\xa3e"], "\xcc" => [77, "\xa3i"], "\xcd" => [18, "\xa3i"], "\xce" => [77, "\xa3o"], "\xcf" => [18, "\xa3o"], "\xd0" => [77, "\xa3s"], "\xd1" => [18, "\xa3s"], "\xd2" => [77, "\xa3t"], "\xd3" => [18, "\xa3t"], "\xd4" => [0, "\xa3 "], "\xd5" => [0, "\xa3%"], "\xd6" => [0, "\xa3-"], "\xd7" => [0, "\xa3."], "\xd8" => [0, "\xa3/"], "\xd9" => [0, "\xa33"], "\xda" => [0, "\xa34"], "\xdb" => [0, "\xa35"], "\xdc" => [0, "\xa36"], "\xdd" => [0, "\xa37"], "\xde" => [0, "\xa38"], "\xdf" => [0, "\xa39"], "\xe0" => [0, "\xa3="], "\xe1" => [0, "\xa3A"], "\xe2" => [0, "\xa3_"], "\xe3" => [0, "\xa3b"], "\xe4" => [0, "\xa3d"], "\xe5" => [0, "\xa3f"], "\xe6" => [0, "\xa3g"], "\xe7" => [0, "\xa3h"], "\xe8" => [0, "\xa3l"], "\xe9" => [0, "\xa3m"], "\xea" => [0, "\xa3n"], "\xeb" => [0, "\xa3p"], "\xec" => [0, "\xa3r"], "\xed" => [0, "\xa3u"], "\xee" => [100, "\xa3"], "\xef" => [110, "\xa3"], "\xf0" => [111, "\xa3"], "\xf1" => [115, "\xa3"], "\xf2" => [116, "\xa3"], "\xf3" => [118, "\xa3"], "\xf4" => [119, "\xa3"], "\xf5" => [122, "\xa3"], "\xf6" => [123, "\xa3"], "\xf7" => [125, "\xa3"], "\xf8" => [126, "\xa3"], "\xf9" => [129, "\xa3"], "\xfa" => [143, "\xa3"], "\xfb" => [148, "\xa3"], "\xfc" => [151, "\xa3"], "\xfd" => [153, "\xa3"], "\xfe" => [83, "\xa3"], "\xff" => [10, "\xa3"]], ["\x00" => [0, "\x9a0"], "\x01" => [0, "\x9a1"], "\x02" => [0, "\x9a2"], "\x03" => [0, "\x9aa"], "\x04" => [0, "\x9ac"], "\x05" => [0, "\x9ae"], "\x06" => [0, "\x9ai"], "\x07" => [0, "\x9ao"], "\x08" => [0, "\x9as"], "\t" => [0, "\x9at"], "\n" => [73, "\x9a"], "\v" => [88, "\x9a"], "\f" => [89, "\x9a"], "\r" => [96, "\x9a"], "\x0e" => [97, "\x9a"], "\x0f" => [99, "\x9a"], "\x10" => [106, "\x9a"], "\x11" => [136, "\x9a"], "\x12" => [139, "\x9a"], "\x13" => [141, "\x9a"], "\x14" => [145, "\x9a"], "\x15" => [147, "\x9a"], "\x16" => [149, "\x9a"], "\x17" => [101, "\x9a"], "\x18" => [112, "\x9a"], "\x19" => [117, "\x9a"], "\x1a" => [120, "\x9a"], "\x1b" => [124, "\x9a"], "\x1c" => [127, "\x9a"], "\x1d" => [144, "\x9a"], "\x1e" => [152, "\x9a"], "\x1f" => [11, "\x9a"], " " => [0, "\x9c0"], "!" => [0, "\x9c1"], "\"" => [0, "\x9c2"], "#" => [0, "\x9ca"], "\$" => [0, "\x9cc"], "%" => [0, "\x9ce"], "&" => [0, "\x9ci"], "'" => [0, "\x9co"], "(" => [0, "\x9cs"], ")" => [0, "\x9ct"], "*" => [73, "\x9c"], "+" => [88, "\x9c"], "," => [89, "\x9c"], "-" => [96, "\x9c"], "." => [97, "\x9c"], "/" => [99, "\x9c"], [106, "\x9c"], [136, "\x9c"], [139, "\x9c"], [141, "\x9c"], [145, "\x9c"], [147, "\x9c"], [149, "\x9c"], [101, "\x9c"], [112, "\x9c"], [117, "\x9c"], ":" => [120, "\x9c"], ";" => [124, "\x9c"], "<" => [127, "\x9c"], "=" => [144, "\x9c"], ">" => [152, "\x9c"], "?" => [11, "\x9c"], "@" => [0, "\xa00"], "A" => [0, "\xa01"], "B" => [0, "\xa02"], "C" => [0, "\xa0a"], "D" => [0, "\xa0c"], "E" => [0, "\xa0e"], "F" => [0, "\xa0i"], "G" => [0, "\xa0o"], "H" => [0, "\xa0s"], "I" => [0, "\xa0t"], "J" => [73, "\xa0"], "K" => [88, "\xa0"], "L" => [89, "\xa0"], "M" => [96, "\xa0"], "N" => [97, "\xa0"], "O" => [99, "\xa0"], "P" => [106, "\xa0"], "Q" => [136, "\xa0"], "R" => [139, "\xa0"], "S" => [141, "\xa0"], "T" => [145, "\xa0"], "U" => [147, "\xa0"], "V" => [149, "\xa0"], "W" => [101, "\xa0"], "X" => [112, "\xa0"], "Y" => [117, "\xa0"], "Z" => [120, "\xa0"], "[" => [124, "\xa0"], "\\" => [127, "\xa0"], "]" => [144, "\xa0"], "^" => [152, "\xa0"], "_" => [11, "\xa0"], "`" => [0, "\xa30"], "a" => [0, "\xa31"], "b" => [0, "\xa32"], "c" => [0, "\xa3a"], "d" => [0, "\xa3c"], "e" => [0, "\xa3e"], "f" => [0, "\xa3i"], "g" => [0, "\xa3o"], "h" => [0, "\xa3s"], "i" => [0, "\xa3t"], "j" => [73, "\xa3"], "k" => [88, "\xa3"], "l" => [89, "\xa3"], "m" => [96, "\xa3"], "n" => [97, "\xa3"], "o" => [99, "\xa3"], "p" => [106, "\xa3"], "q" => [136, "\xa3"], "r" => [139, "\xa3"], "s" => [141, "\xa3"], "t" => [145, "\xa3"], "u" => [147, "\xa3"], "v" => [149, "\xa3"], "w" => [101, "\xa3"], "x" => [112, "\xa3"], "y" => [117, "\xa3"], "z" => [120, "\xa3"], "{" => [124, "\xa3"], "|" => [127, "\xa3"], "}" => [144, "\xa3"], "~" => [152, "\xa3"], "" => [11, "\xa3"], "\x80" => [0, "\xa40"], "\x81" => [0, "\xa41"], "\x82" => [0, "\xa42"], "\x83" => [0, "\xa4a"], "\x84" => [0, "\xa4c"], "\x85" => [0, "\xa4e"], "\x86" => [0, "\xa4i"], "\x87" => [0, "\xa4o"], "\x88" => [0, "\xa4s"], "\x89" => [0, "\xa4t"], "\x8a" => [73, "\xa4"], "\x8b" => [88, "\xa4"], "\x8c" => [89, "\xa4"], "\x8d" => [96, "\xa4"], "\x8e" => [97, "\xa4"], "\x8f" => [99, "\xa4"], "\x90" => [106, "\xa4"], "\x91" => [136, "\xa4"], "\x92" => [139, "\xa4"], "\x93" => [141, "\xa4"], "\x94" => [145, "\xa4"], "\x95" => [147, "\xa4"], "\x96" => [149, "\xa4"], "\x97" => [101, "\xa4"], "\x98" => [112, "\xa4"], "\x99" => [117, "\xa4"], "\x9a" => [120, "\xa4"], "\x9b" => [124, "\xa4"], "\x9c" => [127, "\xa4"], "\x9d" => [144, "\xa4"], "\x9e" => [152, "\xa4"], "\x9f" => [11, "\xa4"], "\xa0" => [0, "\xa90"], "\xa1" => [0, "\xa91"], "\xa2" => [0, "\xa92"], "\xa3" => [0, "\xa9a"], "\xa4" => [0, "\xa9c"], "\xa5" => [0, "\xa9e"], "\xa6" => [0, "\xa9i"], "\xa7" => [0, "\xa9o"], "\xa8" => [0, "\xa9s"], "\xa9" => [0, "\xa9t"], "\xaa" => [73, "\xa9"], "\xab" => [88, "\xa9"], "\xac" => [89, "\xa9"], "\xad" => [96, "\xa9"], "\xae" => [97, "\xa9"], "\xaf" => [99, "\xa9"], "\xb0" => [106, "\xa9"], "\xb1" => [136, "\xa9"], "\xb2" => [139, "\xa9"], "\xb3" => [141, "\xa9"], "\xb4" => [145, "\xa9"], "\xb5" => [147, "\xa9"], "\xb6" => [149, "\xa9"], "\xb7" => [101, "\xa9"], "\xb8" => [112, "\xa9"], "\xb9" => [117, "\xa9"], "\xba" => [120, "\xa9"], "\xbb" => [124, "\xa9"], "\xbc" => [127, "\xa9"], "\xbd" => [144, "\xa9"], "\xbe" => [152, "\xa9"], "\xbf" => [11, "\xa9"], "\xc0" => [0, "\xaa0"], "\xc1" => [0, "\xaa1"], "\xc2" => [0, "\xaa2"], "\xc3" => [0, "\xaaa"], "\xc4" => [0, "\xaac"], "\xc5" => [0, "\xaae"], "\xc6" => [0, "\xaai"], "\xc7" => [0, "\xaao"], "\xc8" => [0, "\xaas"], "\xc9" => [0, "\xaat"], "\xca" => [73, "\xaa"], "\xcb" => [88, "\xaa"], "\xcc" => [89, "\xaa"], "\xcd" => [96, "\xaa"], "\xce" => [97, "\xaa"], "\xcf" => [99, "\xaa"], "\xd0" => [106, "\xaa"], "\xd1" => [136, "\xaa"], "\xd2" => [139, "\xaa"], "\xd3" => [141, "\xaa"], "\xd4" => [145, "\xaa"], "\xd5" => [147, "\xaa"], "\xd6" => [149, "\xaa"], "\xd7" => [101, "\xaa"], "\xd8" => [112, "\xaa"], "\xd9" => [117, "\xaa"], "\xda" => [120, "\xaa"], "\xdb" => [124, "\xaa"], "\xdc" => [127, "\xaa"], "\xdd" => [144, "\xaa"], "\xde" => [152, "\xaa"], "\xdf" => [11, "\xaa"], "\xe0" => [0, "\xad0"], "\xe1" => [0, "\xad1"], "\xe2" => [0, "\xad2"], "\xe3" => [0, "\xada"], "\xe4" => [0, "\xadc"], "\xe5" => [0, "\xade"], "\xe6" => [0, "\xadi"], "\xe7" => [0, "\xado"], "\xe8" => [0, "\xads"], "\xe9" => [0, "\xadt"], "\xea" => [73, "\xad"], "\xeb" => [88, "\xad"], "\xec" => [89, "\xad"], "\xed" => [96, "\xad"], "\xee" => [97, "\xad"], "\xef" => [99, "\xad"], "\xf0" => [106, "\xad"], "\xf1" => [136, "\xad"], "\xf2" => [139, "\xad"], "\xf3" => [141, "\xad"], "\xf4" => [145, "\xad"], "\xf5" => [147, "\xad"], "\xf6" => [149, "\xad"], "\xf7" => [101, "\xad"], "\xf8" => [112, "\xad"], "\xf9" => [117, "\xad"], "\xfa" => [120, "\xad"], "\xfb" => [124, "\xad"], "\xfc" => [127, "\xad"], "\xfd" => [144, "\xad"], "\xfe" => [152, "\xad"], "\xff" => [11, "\xad"]], ["\x00" => [94, "\x9d0"], "\x01" => [76, "\x9d0"], "\x02" => [104, "\x9d0"], "\x03" => [16, "\x9d0"], "\x04" => [94, "\x9d1"], "\x05" => [76, "\x9d1"], "\x06" => [104, "\x9d1"], "\x07" => [16, "\x9d1"], "\x08" => [94, "\x9d2"], "\t" => [76, "\x9d2"], "\n" => [104, "\x9d2"], "\v" => [16, "\x9d2"], "\f" => [94, "\x9da"], "\r" => [76, "\x9da"], "\x0e" => [104, "\x9da"], "\x0f" => [16, "\x9da"], "\x10" => [94, "\x9dc"], "\x11" => [76, "\x9dc"], "\x12" => [104, "\x9dc"], "\x13" => [16, "\x9dc"], "\x14" => [94, "\x9de"], "\x15" => [76, "\x9de"], "\x16" => [104, "\x9de"], "\x17" => [16, "\x9de"], "\x18" => [94, "\x9di"], "\x19" => [76, "\x9di"], "\x1a" => [104, "\x9di"], "\x1b" => [16, "\x9di"], "\x1c" => [94, "\x9do"], "\x1d" => [76, "\x9do"], "\x1e" => [104, "\x9do"], "\x1f" => [16, "\x9do"], " " => [94, "\x9ds"], "!" => [76, "\x9ds"], "\"" => [104, "\x9ds"], "#" => [16, "\x9ds"], "\$" => [94, "\x9dt"], "%" => [76, "\x9dt"], "&" => [104, "\x9dt"], "'" => [16, "\x9dt"], "(" => [77, "\x9d "], ")" => [18, "\x9d "], "*" => [77, "\x9d%"], "+" => [18, "\x9d%"], "," => [77, "\x9d-"], "-" => [18, "\x9d-"], "." => [77, "\x9d."], "/" => [18, "\x9d."], [77, "\x9d/"], [18, "\x9d/"], [77, "\x9d3"], [18, "\x9d3"], [77, "\x9d4"], [18, "\x9d4"], [77, "\x9d5"], [18, "\x9d5"], [77, "\x9d6"], [18, "\x9d6"], ":" => [77, "\x9d7"], ";" => [18, "\x9d7"], "<" => [77, "\x9d8"], "=" => [18, "\x9d8"], ">" => [77, "\x9d9"], "?" => [18, "\x9d9"], "@" => [77, "\x9d="], "A" => [18, "\x9d="], "B" => [77, "\x9dA"], "C" => [18, "\x9dA"], "D" => [77, "\x9d_"], "E" => [18, "\x9d_"], "F" => [77, "\x9db"], "G" => [18, "\x9db"], "H" => [77, "\x9dd"], "I" => [18, "\x9dd"], "J" => [77, "\x9df"], "K" => [18, "\x9df"], "L" => [77, "\x9dg"], "M" => [18, "\x9dg"], "N" => [77, "\x9dh"], "O" => [18, "\x9dh"], "P" => [77, "\x9dl"], "Q" => [18, "\x9dl"], "R" => [77, "\x9dm"], "S" => [18, "\x9dm"], "T" => [77, "\x9dn"], "U" => [18, "\x9dn"], "V" => [77, "\x9dp"], "W" => [18, "\x9dp"], "X" => [77, "\x9dr"], "Y" => [18, "\x9dr"], "Z" => [77, "\x9du"], "[" => [18, "\x9du"], "\\" => [0, "\x9d:"], "]" => [0, "\x9dB"], "^" => [0, "\x9dC"], "_" => [0, "\x9dD"], "`" => [0, "\x9dE"], "a" => [0, "\x9dF"], "b" => [0, "\x9dG"], "c" => [0, "\x9dH"], "d" => [0, "\x9dI"], "e" => [0, "\x9dJ"], "f" => [0, "\x9dK"], "g" => [0, "\x9dL"], "h" => [0, "\x9dM"], "i" => [0, "\x9dN"], "j" => [0, "\x9dO"], "k" => [0, "\x9dP"], "l" => [0, "\x9dQ"], "m" => [0, "\x9dR"], "n" => [0, "\x9dS"], "o" => [0, "\x9dT"], "p" => [0, "\x9dU"], "q" => [0, "\x9dV"], "r" => [0, "\x9dW"], "s" => [0, "\x9dY"], "t" => [0, "\x9dj"], "u" => [0, "\x9dk"], "v" => [0, "\x9dq"], "w" => [0, "\x9dv"], "x" => [0, "\x9dw"], "y" => [0, "\x9dx"], "z" => [0, "\x9dy"], "{" => [0, "\x9dz"], "|" => [82, "\x9d"], "}" => [87, "\x9d"], "~" => [130, "\x9d"], "" => [9, "\x9d"], "\x80" => [94, "\x9e0"], "\x81" => [76, "\x9e0"], "\x82" => [104, "\x9e0"], "\x83" => [16, "\x9e0"], "\x84" => [94, "\x9e1"], "\x85" => [76, "\x9e1"], "\x86" => [104, "\x9e1"], "\x87" => [16, "\x9e1"], "\x88" => [94, "\x9e2"], "\x89" => [76, "\x9e2"], "\x8a" => [104, "\x9e2"], "\x8b" => [16, "\x9e2"], "\x8c" => [94, "\x9ea"], "\x8d" => [76, "\x9ea"], "\x8e" => [104, "\x9ea"], "\x8f" => [16, "\x9ea"], "\x90" => [94, "\x9ec"], "\x91" => [76, "\x9ec"], "\x92" => [104, "\x9ec"], "\x93" => [16, "\x9ec"], "\x94" => [94, "\x9ee"], "\x95" => [76, "\x9ee"], "\x96" => [104, "\x9ee"], "\x97" => [16, "\x9ee"], "\x98" => [94, "\x9ei"], "\x99" => [76, "\x9ei"], "\x9a" => [104, "\x9ei"], "\x9b" => [16, "\x9ei"], "\x9c" => [94, "\x9eo"], "\x9d" => [76, "\x9eo"], "\x9e" => [104, "\x9eo"], "\x9f" => [16, "\x9eo"], "\xa0" => [94, "\x9es"], "\xa1" => [76, "\x9es"], "\xa2" => [104, "\x9es"], "\xa3" => [16, "\x9es"], "\xa4" => [94, "\x9et"], "\xa5" => [76, "\x9et"], "\xa6" => [104, "\x9et"], "\xa7" => [16, "\x9et"], "\xa8" => [77, "\x9e "], "\xa9" => [18, "\x9e "], "\xaa" => [77, "\x9e%"], "\xab" => [18, "\x9e%"], "\xac" => [77, "\x9e-"], "\xad" => [18, "\x9e-"], "\xae" => [77, "\x9e."], "\xaf" => [18, "\x9e."], "\xb0" => [77, "\x9e/"], "\xb1" => [18, "\x9e/"], "\xb2" => [77, "\x9e3"], "\xb3" => [18, "\x9e3"], "\xb4" => [77, "\x9e4"], "\xb5" => [18, "\x9e4"], "\xb6" => [77, "\x9e5"], "\xb7" => [18, "\x9e5"], "\xb8" => [77, "\x9e6"], "\xb9" => [18, "\x9e6"], "\xba" => [77, "\x9e7"], "\xbb" => [18, "\x9e7"], "\xbc" => [77, "\x9e8"], "\xbd" => [18, "\x9e8"], "\xbe" => [77, "\x9e9"], "\xbf" => [18, "\x9e9"], "\xc0" => [77, "\x9e="], "\xc1" => [18, "\x9e="], "\xc2" => [77, "\x9eA"], "\xc3" => [18, "\x9eA"], "\xc4" => [77, "\x9e_"], "\xc5" => [18, "\x9e_"], "\xc6" => [77, "\x9eb"], "\xc7" => [18, "\x9eb"], "\xc8" => [77, "\x9ed"], "\xc9" => [18, "\x9ed"], "\xca" => [77, "\x9ef"], "\xcb" => [18, "\x9ef"], "\xcc" => [77, "\x9eg"], "\xcd" => [18, "\x9eg"], "\xce" => [77, "\x9eh"], "\xcf" => [18, "\x9eh"], "\xd0" => [77, "\x9el"], "\xd1" => [18, "\x9el"], "\xd2" => [77, "\x9em"], "\xd3" => [18, "\x9em"], "\xd4" => [77, "\x9en"], "\xd5" => [18, "\x9en"], "\xd6" => [77, "\x9ep"], "\xd7" => [18, "\x9ep"], "\xd8" => [77, "\x9er"], "\xd9" => [18, "\x9er"], "\xda" => [77, "\x9eu"], "\xdb" => [18, "\x9eu"], "\xdc" => [0, "\x9e:"], "\xdd" => [0, "\x9eB"], "\xde" => [0, "\x9eC"], "\xdf" => [0, "\x9eD"], "\xe0" => [0, "\x9eE"], "\xe1" => [0, "\x9eF"], "\xe2" => [0, "\x9eG"], "\xe3" => [0, "\x9eH"], "\xe4" => [0, "\x9eI"], "\xe5" => [0, "\x9eJ"], "\xe6" => [0, "\x9eK"], "\xe7" => [0, "\x9eL"], "\xe8" => [0, "\x9eM"], "\xe9" => [0, "\x9eN"], "\xea" => [0, "\x9eO"], "\xeb" => [0, "\x9eP"], "\xec" => [0, "\x9eQ"], "\xed" => [0, "\x9eR"], "\xee" => [0, "\x9eS"], "\xef" => [0, "\x9eT"], "\xf0" => [0, "\x9eU"], "\xf1" => [0, "\x9eV"], "\xf2" => [0, "\x9eW"], "\xf3" => [0, "\x9eY"], "\xf4" => [0, "\x9ej"], "\xf5" => [0, "\x9ek"], "\xf6" => [0, "\x9eq"], "\xf7" => [0, "\x9ev"], "\xf8" => [0, "\x9ew"], "\xf9" => [0, "\x9ex"], "\xfa" => [0, "\x9ey"], "\xfb" => [0, "\x9ez"], "\xfc" => [82, "\x9e"], "\xfd" => [87, "\x9e"], "\xfe" => [130, "\x9e"], "\xff" => [9, "\x9e"]], ["\x00" => [94, "\xa00"], "\x01" => [76, "\xa00"], "\x02" => [104, "\xa00"], "\x03" => [16, "\xa00"], "\x04" => [94, "\xa01"], "\x05" => [76, "\xa01"], "\x06" => [104, "\xa01"], "\x07" => [16, "\xa01"], "\x08" => [94, "\xa02"], "\t" => [76, "\xa02"], "\n" => [104, "\xa02"], "\v" => [16, "\xa02"], "\f" => [94, "\xa0a"], "\r" => [76, "\xa0a"], "\x0e" => [104, "\xa0a"], "\x0f" => [16, "\xa0a"], "\x10" => [94, "\xa0c"], "\x11" => [76, "\xa0c"], "\x12" => [104, "\xa0c"], "\x13" => [16, "\xa0c"], "\x14" => [94, "\xa0e"], "\x15" => [76, "\xa0e"], "\x16" => [104, "\xa0e"], "\x17" => [16, "\xa0e"], "\x18" => [94, "\xa0i"], "\x19" => [76, "\xa0i"], "\x1a" => [104, "\xa0i"], "\x1b" => [16, "\xa0i"], "\x1c" => [94, "\xa0o"], "\x1d" => [76, "\xa0o"], "\x1e" => [104, "\xa0o"], "\x1f" => [16, "\xa0o"], " " => [94, "\xa0s"], "!" => [76, "\xa0s"], "\"" => [104, "\xa0s"], "#" => [16, "\xa0s"], "\$" => [94, "\xa0t"], "%" => [76, "\xa0t"], "&" => [104, "\xa0t"], "'" => [16, "\xa0t"], "(" => [77, "\xa0 "], ")" => [18, "\xa0 "], "*" => [77, "\xa0%"], "+" => [18, "\xa0%"], "," => [77, "\xa0-"], "-" => [18, "\xa0-"], "." => [77, "\xa0."], "/" => [18, "\xa0."], [77, "\xa0/"], [18, "\xa0/"], [77, "\xa03"], [18, "\xa03"], [77, "\xa04"], [18, "\xa04"], [77, "\xa05"], [18, "\xa05"], [77, "\xa06"], [18, "\xa06"], ":" => [77, "\xa07"], ";" => [18, "\xa07"], "<" => [77, "\xa08"], "=" => [18, "\xa08"], ">" => [77, "\xa09"], "?" => [18, "\xa09"], "@" => [77, "\xa0="], "A" => [18, "\xa0="], "B" => [77, "\xa0A"], "C" => [18, "\xa0A"], "D" => [77, "\xa0_"], "E" => [18, "\xa0_"], "F" => [77, "\xa0b"], "G" => [18, "\xa0b"], "H" => [77, "\xa0d"], "I" => [18, "\xa0d"], "J" => [77, "\xa0f"], "K" => [18, "\xa0f"], "L" => [77, "\xa0g"], "M" => [18, "\xa0g"], "N" => [77, "\xa0h"], "O" => [18, "\xa0h"], "P" => [77, "\xa0l"], "Q" => [18, "\xa0l"], "R" => [77, "\xa0m"], "S" => [18, "\xa0m"], "T" => [77, "\xa0n"], "U" => [18, "\xa0n"], "V" => [77, "\xa0p"], "W" => [18, "\xa0p"], "X" => [77, "\xa0r"], "Y" => [18, "\xa0r"], "Z" => [77, "\xa0u"], "[" => [18, "\xa0u"], "\\" => [0, "\xa0:"], "]" => [0, "\xa0B"], "^" => [0, "\xa0C"], "_" => [0, "\xa0D"], "`" => [0, "\xa0E"], "a" => [0, "\xa0F"], "b" => [0, "\xa0G"], "c" => [0, "\xa0H"], "d" => [0, "\xa0I"], "e" => [0, "\xa0J"], "f" => [0, "\xa0K"], "g" => [0, "\xa0L"], "h" => [0, "\xa0M"], "i" => [0, "\xa0N"], "j" => [0, "\xa0O"], "k" => [0, "\xa0P"], "l" => [0, "\xa0Q"], "m" => [0, "\xa0R"], "n" => [0, "\xa0S"], "o" => [0, "\xa0T"], "p" => [0, "\xa0U"], "q" => [0, "\xa0V"], "r" => [0, "\xa0W"], "s" => [0, "\xa0Y"], "t" => [0, "\xa0j"], "u" => [0, "\xa0k"], "v" => [0, "\xa0q"], "w" => [0, "\xa0v"], "x" => [0, "\xa0w"], "y" => [0, "\xa0x"], "z" => [0, "\xa0y"], "{" => [0, "\xa0z"], "|" => [82, "\xa0"], "}" => [87, "\xa0"], "~" => [130, "\xa0"], "" => [9, "\xa0"], "\x80" => [94, "\xa30"], "\x81" => [76, "\xa30"], "\x82" => [104, "\xa30"], "\x83" => [16, "\xa30"], "\x84" => [94, "\xa31"], "\x85" => [76, "\xa31"], "\x86" => [104, "\xa31"], "\x87" => [16, "\xa31"], "\x88" => [94, "\xa32"], "\x89" => [76, "\xa32"], "\x8a" => [104, "\xa32"], "\x8b" => [16, "\xa32"], "\x8c" => [94, "\xa3a"], "\x8d" => [76, "\xa3a"], "\x8e" => [104, "\xa3a"], "\x8f" => [16, "\xa3a"], "\x90" => [94, "\xa3c"], "\x91" => [76, "\xa3c"], "\x92" => [104, "\xa3c"], "\x93" => [16, "\xa3c"], "\x94" => [94, "\xa3e"], "\x95" => [76, "\xa3e"], "\x96" => [104, "\xa3e"], "\x97" => [16, "\xa3e"], "\x98" => [94, "\xa3i"], "\x99" => [76, "\xa3i"], "\x9a" => [104, "\xa3i"], "\x9b" => [16, "\xa3i"], "\x9c" => [94, "\xa3o"], "\x9d" => [76, "\xa3o"], "\x9e" => [104, "\xa3o"], "\x9f" => [16, "\xa3o"], "\xa0" => [94, "\xa3s"], "\xa1" => [76, "\xa3s"], "\xa2" => [104, "\xa3s"], "\xa3" => [16, "\xa3s"], "\xa4" => [94, "\xa3t"], "\xa5" => [76, "\xa3t"], "\xa6" => [104, "\xa3t"], "\xa7" => [16, "\xa3t"], "\xa8" => [77, "\xa3 "], "\xa9" => [18, "\xa3 "], "\xaa" => [77, "\xa3%"], "\xab" => [18, "\xa3%"], "\xac" => [77, "\xa3-"], "\xad" => [18, "\xa3-"], "\xae" => [77, "\xa3."], "\xaf" => [18, "\xa3."], "\xb0" => [77, "\xa3/"], "\xb1" => [18, "\xa3/"], "\xb2" => [77, "\xa33"], "\xb3" => [18, "\xa33"], "\xb4" => [77, "\xa34"], "\xb5" => [18, "\xa34"], "\xb6" => [77, "\xa35"], "\xb7" => [18, "\xa35"], "\xb8" => [77, "\xa36"], "\xb9" => [18, "\xa36"], "\xba" => [77, "\xa37"], "\xbb" => [18, "\xa37"], "\xbc" => [77, "\xa38"], "\xbd" => [18, "\xa38"], "\xbe" => [77, "\xa39"], "\xbf" => [18, "\xa39"], "\xc0" => [77, "\xa3="], "\xc1" => [18, "\xa3="], "\xc2" => [77, "\xa3A"], "\xc3" => [18, "\xa3A"], "\xc4" => [77, "\xa3_"], "\xc5" => [18, "\xa3_"], "\xc6" => [77, "\xa3b"], "\xc7" => [18, "\xa3b"], "\xc8" => [77, "\xa3d"], "\xc9" => [18, "\xa3d"], "\xca" => [77, "\xa3f"], "\xcb" => [18, "\xa3f"], "\xcc" => [77, "\xa3g"], "\xcd" => [18, "\xa3g"], "\xce" => [77, "\xa3h"], "\xcf" => [18, "\xa3h"], "\xd0" => [77, "\xa3l"], "\xd1" => [18, "\xa3l"], "\xd2" => [77, "\xa3m"], "\xd3" => [18, "\xa3m"], "\xd4" => [77, "\xa3n"], "\xd5" => [18, "\xa3n"], "\xd6" => [77, "\xa3p"], "\xd7" => [18, "\xa3p"], "\xd8" => [77, "\xa3r"], "\xd9" => [18, "\xa3r"], "\xda" => [77, "\xa3u"], "\xdb" => [18, "\xa3u"], "\xdc" => [0, "\xa3:"], "\xdd" => [0, "\xa3B"], "\xde" => [0, "\xa3C"], "\xdf" => [0, "\xa3D"], "\xe0" => [0, "\xa3E"], "\xe1" => [0, "\xa3F"], "\xe2" => [0, "\xa3G"], "\xe3" => [0, "\xa3H"], "\xe4" => [0, "\xa3I"], "\xe5" => [0, "\xa3J"], "\xe6" => [0, "\xa3K"], "\xe7" => [0, "\xa3L"], "\xe8" => [0, "\xa3M"], "\xe9" => [0, "\xa3N"], "\xea" => [0, "\xa3O"], "\xeb" => [0, "\xa3P"], "\xec" => [0, "\xa3Q"], "\xed" => [0, "\xa3R"], "\xee" => [0, "\xa3S"], "\xef" => [0, "\xa3T"], "\xf0" => [0, "\xa3U"], "\xf1" => [0, "\xa3V"], "\xf2" => [0, "\xa3W"], "\xf3" => [0, "\xa3Y"], "\xf4" => [0, "\xa3j"], "\xf5" => [0, "\xa3k"], "\xf6" => [0, "\xa3q"], "\xf7" => [0, "\xa3v"], "\xf8" => [0, "\xa3w"], "\xf9" => [0, "\xa3x"], "\xfa" => [0, "\xa3y"], "\xfb" => [0, "\xa3z"], "\xfc" => [82, "\xa3"], "\xfd" => [87, "\xa3"], "\xfe" => [130, "\xa3"], "\xff" => [9, "\xa3"]], ["\x00" => [94, "\xa40"], "\x01" => [76, "\xa40"], "\x02" => [104, "\xa40"], "\x03" => [16, "\xa40"], "\x04" => [94, "\xa41"], "\x05" => [76, "\xa41"], "\x06" => [104, "\xa41"], "\x07" => [16, "\xa41"], "\x08" => [94, "\xa42"], "\t" => [76, "\xa42"], "\n" => [104, "\xa42"], "\v" => [16, "\xa42"], "\f" => [94, "\xa4a"], "\r" => [76, "\xa4a"], "\x0e" => [104, "\xa4a"], "\x0f" => [16, "\xa4a"], "\x10" => [94, "\xa4c"], "\x11" => [76, "\xa4c"], "\x12" => [104, "\xa4c"], "\x13" => [16, "\xa4c"], "\x14" => [94, "\xa4e"], "\x15" => [76, "\xa4e"], "\x16" => [104, "\xa4e"], "\x17" => [16, "\xa4e"], "\x18" => [94, "\xa4i"], "\x19" => [76, "\xa4i"], "\x1a" => [104, "\xa4i"], "\x1b" => [16, "\xa4i"], "\x1c" => [94, "\xa4o"], "\x1d" => [76, "\xa4o"], "\x1e" => [104, "\xa4o"], "\x1f" => [16, "\xa4o"], " " => [94, "\xa4s"], "!" => [76, "\xa4s"], "\"" => [104, "\xa4s"], "#" => [16, "\xa4s"], "\$" => [94, "\xa4t"], "%" => [76, "\xa4t"], "&" => [104, "\xa4t"], "'" => [16, "\xa4t"], "(" => [77, "\xa4 "], ")" => [18, "\xa4 "], "*" => [77, "\xa4%"], "+" => [18, "\xa4%"], "," => [77, "\xa4-"], "-" => [18, "\xa4-"], "." => [77, "\xa4."], "/" => [18, "\xa4."], [77, "\xa4/"], [18, "\xa4/"], [77, "\xa43"], [18, "\xa43"], [77, "\xa44"], [18, "\xa44"], [77, "\xa45"], [18, "\xa45"], [77, "\xa46"], [18, "\xa46"], ":" => [77, "\xa47"], ";" => [18, "\xa47"], "<" => [77, "\xa48"], "=" => [18, "\xa48"], ">" => [77, "\xa49"], "?" => [18, "\xa49"], "@" => [77, "\xa4="], "A" => [18, "\xa4="], "B" => [77, "\xa4A"], "C" => [18, "\xa4A"], "D" => [77, "\xa4_"], "E" => [18, "\xa4_"], "F" => [77, "\xa4b"], "G" => [18, "\xa4b"], "H" => [77, "\xa4d"], "I" => [18, "\xa4d"], "J" => [77, "\xa4f"], "K" => [18, "\xa4f"], "L" => [77, "\xa4g"], "M" => [18, "\xa4g"], "N" => [77, "\xa4h"], "O" => [18, "\xa4h"], "P" => [77, "\xa4l"], "Q" => [18, "\xa4l"], "R" => [77, "\xa4m"], "S" => [18, "\xa4m"], "T" => [77, "\xa4n"], "U" => [18, "\xa4n"], "V" => [77, "\xa4p"], "W" => [18, "\xa4p"], "X" => [77, "\xa4r"], "Y" => [18, "\xa4r"], "Z" => [77, "\xa4u"], "[" => [18, "\xa4u"], "\\" => [0, "\xa4:"], "]" => [0, "\xa4B"], "^" => [0, "\xa4C"], "_" => [0, "\xa4D"], "`" => [0, "\xa4E"], "a" => [0, "\xa4F"], "b" => [0, "\xa4G"], "c" => [0, "\xa4H"], "d" => [0, "\xa4I"], "e" => [0, "\xa4J"], "f" => [0, "\xa4K"], "g" => [0, "\xa4L"], "h" => [0, "\xa4M"], "i" => [0, "\xa4N"], "j" => [0, "\xa4O"], "k" => [0, "\xa4P"], "l" => [0, "\xa4Q"], "m" => [0, "\xa4R"], "n" => [0, "\xa4S"], "o" => [0, "\xa4T"], "p" => [0, "\xa4U"], "q" => [0, "\xa4V"], "r" => [0, "\xa4W"], "s" => [0, "\xa4Y"], "t" => [0, "\xa4j"], "u" => [0, "\xa4k"], "v" => [0, "\xa4q"], "w" => [0, "\xa4v"], "x" => [0, "\xa4w"], "y" => [0, "\xa4x"], "z" => [0, "\xa4y"], "{" => [0, "\xa4z"], "|" => [82, "\xa4"], "}" => [87, "\xa4"], "~" => [130, "\xa4"], "" => [9, "\xa4"], "\x80" => [94, "\xa90"], "\x81" => [76, "\xa90"], "\x82" => [104, "\xa90"], "\x83" => [16, "\xa90"], "\x84" => [94, "\xa91"], "\x85" => [76, "\xa91"], "\x86" => [104, "\xa91"], "\x87" => [16, "\xa91"], "\x88" => [94, "\xa92"], "\x89" => [76, "\xa92"], "\x8a" => [104, "\xa92"], "\x8b" => [16, "\xa92"], "\x8c" => [94, "\xa9a"], "\x8d" => [76, "\xa9a"], "\x8e" => [104, "\xa9a"], "\x8f" => [16, "\xa9a"], "\x90" => [94, "\xa9c"], "\x91" => [76, "\xa9c"], "\x92" => [104, "\xa9c"], "\x93" => [16, "\xa9c"], "\x94" => [94, "\xa9e"], "\x95" => [76, "\xa9e"], "\x96" => [104, "\xa9e"], "\x97" => [16, "\xa9e"], "\x98" => [94, "\xa9i"], "\x99" => [76, "\xa9i"], "\x9a" => [104, "\xa9i"], "\x9b" => [16, "\xa9i"], "\x9c" => [94, "\xa9o"], "\x9d" => [76, "\xa9o"], "\x9e" => [104, "\xa9o"], "\x9f" => [16, "\xa9o"], "\xa0" => [94, "\xa9s"], "\xa1" => [76, "\xa9s"], "\xa2" => [104, "\xa9s"], "\xa3" => [16, "\xa9s"], "\xa4" => [94, "\xa9t"], "\xa5" => [76, "\xa9t"], "\xa6" => [104, "\xa9t"], "\xa7" => [16, "\xa9t"], "\xa8" => [77, "\xa9 "], "\xa9" => [18, "\xa9 "], "\xaa" => [77, "\xa9%"], "\xab" => [18, "\xa9%"], "\xac" => [77, "\xa9-"], "\xad" => [18, "\xa9-"], "\xae" => [77, "\xa9."], "\xaf" => [18, "\xa9."], "\xb0" => [77, "\xa9/"], "\xb1" => [18, "\xa9/"], "\xb2" => [77, "\xa93"], "\xb3" => [18, "\xa93"], "\xb4" => [77, "\xa94"], "\xb5" => [18, "\xa94"], "\xb6" => [77, "\xa95"], "\xb7" => [18, "\xa95"], "\xb8" => [77, "\xa96"], "\xb9" => [18, "\xa96"], "\xba" => [77, "\xa97"], "\xbb" => [18, "\xa97"], "\xbc" => [77, "\xa98"], "\xbd" => [18, "\xa98"], "\xbe" => [77, "\xa99"], "\xbf" => [18, "\xa99"], "\xc0" => [77, "\xa9="], "\xc1" => [18, "\xa9="], "\xc2" => [77, "\xa9A"], "\xc3" => [18, "\xa9A"], "\xc4" => [77, "\xa9_"], "\xc5" => [18, "\xa9_"], "\xc6" => [77, "\xa9b"], "\xc7" => [18, "\xa9b"], "\xc8" => [77, "\xa9d"], "\xc9" => [18, "\xa9d"], "\xca" => [77, "\xa9f"], "\xcb" => [18, "\xa9f"], "\xcc" => [77, "\xa9g"], "\xcd" => [18, "\xa9g"], "\xce" => [77, "\xa9h"], "\xcf" => [18, "\xa9h"], "\xd0" => [77, "\xa9l"], "\xd1" => [18, "\xa9l"], "\xd2" => [77, "\xa9m"], "\xd3" => [18, "\xa9m"], "\xd4" => [77, "\xa9n"], "\xd5" => [18, "\xa9n"], "\xd6" => [77, "\xa9p"], "\xd7" => [18, "\xa9p"], "\xd8" => [77, "\xa9r"], "\xd9" => [18, "\xa9r"], "\xda" => [77, "\xa9u"], "\xdb" => [18, "\xa9u"], "\xdc" => [0, "\xa9:"], "\xdd" => [0, "\xa9B"], "\xde" => [0, "\xa9C"], "\xdf" => [0, "\xa9D"], "\xe0" => [0, "\xa9E"], "\xe1" => [0, "\xa9F"], "\xe2" => [0, "\xa9G"], "\xe3" => [0, "\xa9H"], "\xe4" => [0, "\xa9I"], "\xe5" => [0, "\xa9J"], "\xe6" => [0, "\xa9K"], "\xe7" => [0, "\xa9L"], "\xe8" => [0, "\xa9M"], "\xe9" => [0, "\xa9N"], "\xea" => [0, "\xa9O"], "\xeb" => [0, "\xa9P"], "\xec" => [0, "\xa9Q"], "\xed" => [0, "\xa9R"], "\xee" => [0, "\xa9S"], "\xef" => [0, "\xa9T"], "\xf0" => [0, "\xa9U"], "\xf1" => [0, "\xa9V"], "\xf2" => [0, "\xa9W"], "\xf3" => [0, "\xa9Y"], "\xf4" => [0, "\xa9j"], "\xf5" => [0, "\xa9k"], "\xf6" => [0, "\xa9q"], "\xf7" => [0, "\xa9v"], "\xf8" => [0, "\xa9w"], "\xf9" => [0, "\xa9x"], "\xfa" => [0, "\xa9y"], "\xfb" => [0, "\xa9z"], "\xfc" => [82, "\xa9"], "\xfd" => [87, "\xa9"], "\xfe" => [130, "\xa9"], "\xff" => [9, "\xa9"]], ["\x00" => [77, "\xa40"], "\x01" => [18, "\xa40"], "\x02" => [77, "\xa41"], "\x03" => [18, "\xa41"], "\x04" => [77, "\xa42"], "\x05" => [18, "\xa42"], "\x06" => [77, "\xa4a"], "\x07" => [18, "\xa4a"], "\x08" => [77, "\xa4c"], "\t" => [18, "\xa4c"], "\n" => [77, "\xa4e"], "\v" => [18, "\xa4e"], "\f" => [77, "\xa4i"], "\r" => [18, "\xa4i"], "\x0e" => [77, "\xa4o"], "\x0f" => [18, "\xa4o"], "\x10" => [77, "\xa4s"], "\x11" => [18, "\xa4s"], "\x12" => [77, "\xa4t"], "\x13" => [18, "\xa4t"], "\x14" => [0, "\xa4 "], "\x15" => [0, "\xa4%"], "\x16" => [0, "\xa4-"], "\x17" => [0, "\xa4."], "\x18" => [0, "\xa4/"], "\x19" => [0, "\xa43"], "\x1a" => [0, "\xa44"], "\x1b" => [0, "\xa45"], "\x1c" => [0, "\xa46"], "\x1d" => [0, "\xa47"], "\x1e" => [0, "\xa48"], "\x1f" => [0, "\xa49"], " " => [0, "\xa4="], "!" => [0, "\xa4A"], "\"" => [0, "\xa4_"], "#" => [0, "\xa4b"], "\$" => [0, "\xa4d"], "%" => [0, "\xa4f"], "&" => [0, "\xa4g"], "'" => [0, "\xa4h"], "(" => [0, "\xa4l"], ")" => [0, "\xa4m"], "*" => [0, "\xa4n"], "+" => [0, "\xa4p"], "," => [0, "\xa4r"], "-" => [0, "\xa4u"], "." => [100, "\xa4"], "/" => [110, "\xa4"], [111, "\xa4"], [115, "\xa4"], [116, "\xa4"], [118, "\xa4"], [119, "\xa4"], [122, "\xa4"], [123, "\xa4"], [125, "\xa4"], [126, "\xa4"], [129, "\xa4"], ":" => [143, "\xa4"], ";" => [148, "\xa4"], "<" => [151, "\xa4"], "=" => [153, "\xa4"], ">" => [83, "\xa4"], "?" => [10, "\xa4"], "@" => [77, "\xa90"], "A" => [18, "\xa90"], "B" => [77, "\xa91"], "C" => [18, "\xa91"], "D" => [77, "\xa92"], "E" => [18, "\xa92"], "F" => [77, "\xa9a"], "G" => [18, "\xa9a"], "H" => [77, "\xa9c"], "I" => [18, "\xa9c"], "J" => [77, "\xa9e"], "K" => [18, "\xa9e"], "L" => [77, "\xa9i"], "M" => [18, "\xa9i"], "N" => [77, "\xa9o"], "O" => [18, "\xa9o"], "P" => [77, "\xa9s"], "Q" => [18, "\xa9s"], "R" => [77, "\xa9t"], "S" => [18, "\xa9t"], "T" => [0, "\xa9 "], "U" => [0, "\xa9%"], "V" => [0, "\xa9-"], "W" => [0, "\xa9."], "X" => [0, "\xa9/"], "Y" => [0, "\xa93"], "Z" => [0, "\xa94"], "[" => [0, "\xa95"], "\\" => [0, "\xa96"], "]" => [0, "\xa97"], "^" => [0, "\xa98"], "_" => [0, "\xa99"], "`" => [0, "\xa9="], "a" => [0, "\xa9A"], "b" => [0, "\xa9_"], "c" => [0, "\xa9b"], "d" => [0, "\xa9d"], "e" => [0, "\xa9f"], "f" => [0, "\xa9g"], "g" => [0, "\xa9h"], "h" => [0, "\xa9l"], "i" => [0, "\xa9m"], "j" => [0, "\xa9n"], "k" => [0, "\xa9p"], "l" => [0, "\xa9r"], "m" => [0, "\xa9u"], "n" => [100, "\xa9"], "o" => [110, "\xa9"], "p" => [111, "\xa9"], "q" => [115, "\xa9"], "r" => [116, "\xa9"], "s" => [118, "\xa9"], "t" => [119, "\xa9"], "u" => [122, "\xa9"], "v" => [123, "\xa9"], "w" => [125, "\xa9"], "x" => [126, "\xa9"], "y" => [129, "\xa9"], "z" => [143, "\xa9"], "{" => [148, "\xa9"], "|" => [151, "\xa9"], "}" => [153, "\xa9"], "~" => [83, "\xa9"], "" => [10, "\xa9"], "\x80" => [77, "\xaa0"], "\x81" => [18, "\xaa0"], "\x82" => [77, "\xaa1"], "\x83" => [18, "\xaa1"], "\x84" => [77, "\xaa2"], "\x85" => [18, "\xaa2"], "\x86" => [77, "\xaaa"], "\x87" => [18, "\xaaa"], "\x88" => [77, "\xaac"], "\x89" => [18, "\xaac"], "\x8a" => [77, "\xaae"], "\x8b" => [18, "\xaae"], "\x8c" => [77, "\xaai"], "\x8d" => [18, "\xaai"], "\x8e" => [77, "\xaao"], "\x8f" => [18, "\xaao"], "\x90" => [77, "\xaas"], "\x91" => [18, "\xaas"], "\x92" => [77, "\xaat"], "\x93" => [18, "\xaat"], "\x94" => [0, "\xaa "], "\x95" => [0, "\xaa%"], "\x96" => [0, "\xaa-"], "\x97" => [0, "\xaa."], "\x98" => [0, "\xaa/"], "\x99" => [0, "\xaa3"], "\x9a" => [0, "\xaa4"], "\x9b" => [0, "\xaa5"], "\x9c" => [0, "\xaa6"], "\x9d" => [0, "\xaa7"], "\x9e" => [0, "\xaa8"], "\x9f" => [0, "\xaa9"], "\xa0" => [0, "\xaa="], "\xa1" => [0, "\xaaA"], "\xa2" => [0, "\xaa_"], "\xa3" => [0, "\xaab"], "\xa4" => [0, "\xaad"], "\xa5" => [0, "\xaaf"], "\xa6" => [0, "\xaag"], "\xa7" => [0, "\xaah"], "\xa8" => [0, "\xaal"], "\xa9" => [0, "\xaam"], "\xaa" => [0, "\xaan"], "\xab" => [0, "\xaap"], "\xac" => [0, "\xaar"], "\xad" => [0, "\xaau"], "\xae" => [100, "\xaa"], "\xaf" => [110, "\xaa"], "\xb0" => [111, "\xaa"], "\xb1" => [115, "\xaa"], "\xb2" => [116, "\xaa"], "\xb3" => [118, "\xaa"], "\xb4" => [119, "\xaa"], "\xb5" => [122, "\xaa"], "\xb6" => [123, "\xaa"], "\xb7" => [125, "\xaa"], "\xb8" => [126, "\xaa"], "\xb9" => [129, "\xaa"], "\xba" => [143, "\xaa"], "\xbb" => [148, "\xaa"], "\xbc" => [151, "\xaa"], "\xbd" => [153, "\xaa"], "\xbe" => [83, "\xaa"], "\xbf" => [10, "\xaa"], "\xc0" => [77, "\xad0"], "\xc1" => [18, "\xad0"], "\xc2" => [77, "\xad1"], "\xc3" => [18, "\xad1"], "\xc4" => [77, "\xad2"], "\xc5" => [18, "\xad2"], "\xc6" => [77, "\xada"], "\xc7" => [18, "\xada"], "\xc8" => [77, "\xadc"], "\xc9" => [18, "\xadc"], "\xca" => [77, "\xade"], "\xcb" => [18, "\xade"], "\xcc" => [77, "\xadi"], "\xcd" => [18, "\xadi"], "\xce" => [77, "\xado"], "\xcf" => [18, "\xado"], "\xd0" => [77, "\xads"], "\xd1" => [18, "\xads"], "\xd2" => [77, "\xadt"], "\xd3" => [18, "\xadt"], "\xd4" => [0, "\xad "], "\xd5" => [0, "\xad%"], "\xd6" => [0, "\xad-"], "\xd7" => [0, "\xad."], "\xd8" => [0, "\xad/"], "\xd9" => [0, "\xad3"], "\xda" => [0, "\xad4"], "\xdb" => [0, "\xad5"], "\xdc" => [0, "\xad6"], "\xdd" => [0, "\xad7"], "\xde" => [0, "\xad8"], "\xdf" => [0, "\xad9"], "\xe0" => [0, "\xad="], "\xe1" => [0, "\xadA"], "\xe2" => [0, "\xad_"], "\xe3" => [0, "\xadb"], "\xe4" => [0, "\xadd"], "\xe5" => [0, "\xadf"], "\xe6" => [0, "\xadg"], "\xe7" => [0, "\xadh"], "\xe8" => [0, "\xadl"], "\xe9" => [0, "\xadm"], "\xea" => [0, "\xadn"], "\xeb" => [0, "\xadp"], "\xec" => [0, "\xadr"], "\xed" => [0, "\xadu"], "\xee" => [100, "\xad"], "\xef" => [110, "\xad"], "\xf0" => [111, "\xad"], "\xf1" => [115, "\xad"], "\xf2" => [116, "\xad"], "\xf3" => [118, "\xad"], "\xf4" => [119, "\xad"], "\xf5" => [122, "\xad"], "\xf6" => [123, "\xad"], "\xf7" => [125, "\xad"], "\xf8" => [126, "\xad"], "\xf9" => [129, "\xad"], "\xfa" => [143, "\xad"], "\xfb" => [148, "\xad"], "\xfc" => [151, "\xad"], "\xfd" => [153, "\xad"], "\xfe" => [83, "\xad"], "\xff" => [10, "\xad"]], ["\x00" => [94, "\xa50"], "\x01" => [76, "\xa50"], "\x02" => [104, "\xa50"], "\x03" => [16, "\xa50"], "\x04" => [94, "\xa51"], "\x05" => [76, "\xa51"], "\x06" => [104, "\xa51"], "\x07" => [16, "\xa51"], "\x08" => [94, "\xa52"], "\t" => [76, "\xa52"], "\n" => [104, "\xa52"], "\v" => [16, "\xa52"], "\f" => [94, "\xa5a"], "\r" => [76, "\xa5a"], "\x0e" => [104, "\xa5a"], "\x0f" => [16, "\xa5a"], "\x10" => [94, "\xa5c"], "\x11" => [76, "\xa5c"], "\x12" => [104, "\xa5c"], "\x13" => [16, "\xa5c"], "\x14" => [94, "\xa5e"], "\x15" => [76, "\xa5e"], "\x16" => [104, "\xa5e"], "\x17" => [16, "\xa5e"], "\x18" => [94, "\xa5i"], "\x19" => [76, "\xa5i"], "\x1a" => [104, "\xa5i"], "\x1b" => [16, "\xa5i"], "\x1c" => [94, "\xa5o"], "\x1d" => [76, "\xa5o"], "\x1e" => [104, "\xa5o"], "\x1f" => [16, "\xa5o"], " " => [94, "\xa5s"], "!" => [76, "\xa5s"], "\"" => [104, "\xa5s"], "#" => [16, "\xa5s"], "\$" => [94, "\xa5t"], "%" => [76, "\xa5t"], "&" => [104, "\xa5t"], "'" => [16, "\xa5t"], "(" => [77, "\xa5 "], ")" => [18, "\xa5 "], "*" => [77, "\xa5%"], "+" => [18, "\xa5%"], "," => [77, "\xa5-"], "-" => [18, "\xa5-"], "." => [77, "\xa5."], "/" => [18, "\xa5."], [77, "\xa5/"], [18, "\xa5/"], [77, "\xa53"], [18, "\xa53"], [77, "\xa54"], [18, "\xa54"], [77, "\xa55"], [18, "\xa55"], [77, "\xa56"], [18, "\xa56"], ":" => [77, "\xa57"], ";" => [18, "\xa57"], "<" => [77, "\xa58"], "=" => [18, "\xa58"], ">" => [77, "\xa59"], "?" => [18, "\xa59"], "@" => [77, "\xa5="], "A" => [18, "\xa5="], "B" => [77, "\xa5A"], "C" => [18, "\xa5A"], "D" => [77, "\xa5_"], "E" => [18, "\xa5_"], "F" => [77, "\xa5b"], "G" => [18, "\xa5b"], "H" => [77, "\xa5d"], "I" => [18, "\xa5d"], "J" => [77, "\xa5f"], "K" => [18, "\xa5f"], "L" => [77, "\xa5g"], "M" => [18, "\xa5g"], "N" => [77, "\xa5h"], "O" => [18, "\xa5h"], "P" => [77, "\xa5l"], "Q" => [18, "\xa5l"], "R" => [77, "\xa5m"], "S" => [18, "\xa5m"], "T" => [77, "\xa5n"], "U" => [18, "\xa5n"], "V" => [77, "\xa5p"], "W" => [18, "\xa5p"], "X" => [77, "\xa5r"], "Y" => [18, "\xa5r"], "Z" => [77, "\xa5u"], "[" => [18, "\xa5u"], "\\" => [0, "\xa5:"], "]" => [0, "\xa5B"], "^" => [0, "\xa5C"], "_" => [0, "\xa5D"], "`" => [0, "\xa5E"], "a" => [0, "\xa5F"], "b" => [0, "\xa5G"], "c" => [0, "\xa5H"], "d" => [0, "\xa5I"], "e" => [0, "\xa5J"], "f" => [0, "\xa5K"], "g" => [0, "\xa5L"], "h" => [0, "\xa5M"], "i" => [0, "\xa5N"], "j" => [0, "\xa5O"], "k" => [0, "\xa5P"], "l" => [0, "\xa5Q"], "m" => [0, "\xa5R"], "n" => [0, "\xa5S"], "o" => [0, "\xa5T"], "p" => [0, "\xa5U"], "q" => [0, "\xa5V"], "r" => [0, "\xa5W"], "s" => [0, "\xa5Y"], "t" => [0, "\xa5j"], "u" => [0, "\xa5k"], "v" => [0, "\xa5q"], "w" => [0, "\xa5v"], "x" => [0, "\xa5w"], "y" => [0, "\xa5x"], "z" => [0, "\xa5y"], "{" => [0, "\xa5z"], "|" => [82, "\xa5"], "}" => [87, "\xa5"], "~" => [130, "\xa5"], "" => [9, "\xa5"], "\x80" => [94, "\xa60"], "\x81" => [76, "\xa60"], "\x82" => [104, "\xa60"], "\x83" => [16, "\xa60"], "\x84" => [94, "\xa61"], "\x85" => [76, "\xa61"], "\x86" => [104, "\xa61"], "\x87" => [16, "\xa61"], "\x88" => [94, "\xa62"], "\x89" => [76, "\xa62"], "\x8a" => [104, "\xa62"], "\x8b" => [16, "\xa62"], "\x8c" => [94, "\xa6a"], "\x8d" => [76, "\xa6a"], "\x8e" => [104, "\xa6a"], "\x8f" => [16, "\xa6a"], "\x90" => [94, "\xa6c"], "\x91" => [76, "\xa6c"], "\x92" => [104, "\xa6c"], "\x93" => [16, "\xa6c"], "\x94" => [94, "\xa6e"], "\x95" => [76, "\xa6e"], "\x96" => [104, "\xa6e"], "\x97" => [16, "\xa6e"], "\x98" => [94, "\xa6i"], "\x99" => [76, "\xa6i"], "\x9a" => [104, "\xa6i"], "\x9b" => [16, "\xa6i"], "\x9c" => [94, "\xa6o"], "\x9d" => [76, "\xa6o"], "\x9e" => [104, "\xa6o"], "\x9f" => [16, "\xa6o"], "\xa0" => [94, "\xa6s"], "\xa1" => [76, "\xa6s"], "\xa2" => [104, "\xa6s"], "\xa3" => [16, "\xa6s"], "\xa4" => [94, "\xa6t"], "\xa5" => [76, "\xa6t"], "\xa6" => [104, "\xa6t"], "\xa7" => [16, "\xa6t"], "\xa8" => [77, "\xa6 "], "\xa9" => [18, "\xa6 "], "\xaa" => [77, "\xa6%"], "\xab" => [18, "\xa6%"], "\xac" => [77, "\xa6-"], "\xad" => [18, "\xa6-"], "\xae" => [77, "\xa6."], "\xaf" => [18, "\xa6."], "\xb0" => [77, "\xa6/"], "\xb1" => [18, "\xa6/"], "\xb2" => [77, "\xa63"], "\xb3" => [18, "\xa63"], "\xb4" => [77, "\xa64"], "\xb5" => [18, "\xa64"], "\xb6" => [77, "\xa65"], "\xb7" => [18, "\xa65"], "\xb8" => [77, "\xa66"], "\xb9" => [18, "\xa66"], "\xba" => [77, "\xa67"], "\xbb" => [18, "\xa67"], "\xbc" => [77, "\xa68"], "\xbd" => [18, "\xa68"], "\xbe" => [77, "\xa69"], "\xbf" => [18, "\xa69"], "\xc0" => [77, "\xa6="], "\xc1" => [18, "\xa6="], "\xc2" => [77, "\xa6A"], "\xc3" => [18, "\xa6A"], "\xc4" => [77, "\xa6_"], "\xc5" => [18, "\xa6_"], "\xc6" => [77, "\xa6b"], "\xc7" => [18, "\xa6b"], "\xc8" => [77, "\xa6d"], "\xc9" => [18, "\xa6d"], "\xca" => [77, "\xa6f"], "\xcb" => [18, "\xa6f"], "\xcc" => [77, "\xa6g"], "\xcd" => [18, "\xa6g"], "\xce" => [77, "\xa6h"], "\xcf" => [18, "\xa6h"], "\xd0" => [77, "\xa6l"], "\xd1" => [18, "\xa6l"], "\xd2" => [77, "\xa6m"], "\xd3" => [18, "\xa6m"], "\xd4" => [77, "\xa6n"], "\xd5" => [18, "\xa6n"], "\xd6" => [77, "\xa6p"], "\xd7" => [18, "\xa6p"], "\xd8" => [77, "\xa6r"], "\xd9" => [18, "\xa6r"], "\xda" => [77, "\xa6u"], "\xdb" => [18, "\xa6u"], "\xdc" => [0, "\xa6:"], "\xdd" => [0, "\xa6B"], "\xde" => [0, "\xa6C"], "\xdf" => [0, "\xa6D"], "\xe0" => [0, "\xa6E"], "\xe1" => [0, "\xa6F"], "\xe2" => [0, "\xa6G"], "\xe3" => [0, "\xa6H"], "\xe4" => [0, "\xa6I"], "\xe5" => [0, "\xa6J"], "\xe6" => [0, "\xa6K"], "\xe7" => [0, "\xa6L"], "\xe8" => [0, "\xa6M"], "\xe9" => [0, "\xa6N"], "\xea" => [0, "\xa6O"], "\xeb" => [0, "\xa6P"], "\xec" => [0, "\xa6Q"], "\xed" => [0, "\xa6R"], "\xee" => [0, "\xa6S"], "\xef" => [0, "\xa6T"], "\xf0" => [0, "\xa6U"], "\xf1" => [0, "\xa6V"], "\xf2" => [0, "\xa6W"], "\xf3" => [0, "\xa6Y"], "\xf4" => [0, "\xa6j"], "\xf5" => [0, "\xa6k"], "\xf6" => [0, "\xa6q"], "\xf7" => [0, "\xa6v"], "\xf8" => [0, "\xa6w"], "\xf9" => [0, "\xa6x"], "\xfa" => [0, "\xa6y"], "\xfb" => [0, "\xa6z"], "\xfc" => [82, "\xa6"], "\xfd" => [87, "\xa6"], "\xfe" => [130, "\xa6"], "\xff" => [9, "\xa6"]], ["\x00" => [77, "\xa50"], "\x01" => [18, "\xa50"], "\x02" => [77, "\xa51"], "\x03" => [18, "\xa51"], "\x04" => [77, "\xa52"], "\x05" => [18, "\xa52"], "\x06" => [77, "\xa5a"], "\x07" => [18, "\xa5a"], "\x08" => [77, "\xa5c"], "\t" => [18, "\xa5c"], "\n" => [77, "\xa5e"], "\v" => [18, "\xa5e"], "\f" => [77, "\xa5i"], "\r" => [18, "\xa5i"], "\x0e" => [77, "\xa5o"], "\x0f" => [18, "\xa5o"], "\x10" => [77, "\xa5s"], "\x11" => [18, "\xa5s"], "\x12" => [77, "\xa5t"], "\x13" => [18, "\xa5t"], "\x14" => [0, "\xa5 "], "\x15" => [0, "\xa5%"], "\x16" => [0, "\xa5-"], "\x17" => [0, "\xa5."], "\x18" => [0, "\xa5/"], "\x19" => [0, "\xa53"], "\x1a" => [0, "\xa54"], "\x1b" => [0, "\xa55"], "\x1c" => [0, "\xa56"], "\x1d" => [0, "\xa57"], "\x1e" => [0, "\xa58"], "\x1f" => [0, "\xa59"], " " => [0, "\xa5="], "!" => [0, "\xa5A"], "\"" => [0, "\xa5_"], "#" => [0, "\xa5b"], "\$" => [0, "\xa5d"], "%" => [0, "\xa5f"], "&" => [0, "\xa5g"], "'" => [0, "\xa5h"], "(" => [0, "\xa5l"], ")" => [0, "\xa5m"], "*" => [0, "\xa5n"], "+" => [0, "\xa5p"], "," => [0, "\xa5r"], "-" => [0, "\xa5u"], "." => [100, "\xa5"], "/" => [110, "\xa5"], [111, "\xa5"], [115, "\xa5"], [116, "\xa5"], [118, "\xa5"], [119, "\xa5"], [122, "\xa5"], [123, "\xa5"], [125, "\xa5"], [126, "\xa5"], [129, "\xa5"], ":" => [143, "\xa5"], ";" => [148, "\xa5"], "<" => [151, "\xa5"], "=" => [153, "\xa5"], ">" => [83, "\xa5"], "?" => [10, "\xa5"], "@" => [77, "\xa60"], "A" => [18, "\xa60"], "B" => [77, "\xa61"], "C" => [18, "\xa61"], "D" => [77, "\xa62"], "E" => [18, "\xa62"], "F" => [77, "\xa6a"], "G" => [18, "\xa6a"], "H" => [77, "\xa6c"], "I" => [18, "\xa6c"], "J" => [77, "\xa6e"], "K" => [18, "\xa6e"], "L" => [77, "\xa6i"], "M" => [18, "\xa6i"], "N" => [77, "\xa6o"], "O" => [18, "\xa6o"], "P" => [77, "\xa6s"], "Q" => [18, "\xa6s"], "R" => [77, "\xa6t"], "S" => [18, "\xa6t"], "T" => [0, "\xa6 "], "U" => [0, "\xa6%"], "V" => [0, "\xa6-"], "W" => [0, "\xa6."], "X" => [0, "\xa6/"], "Y" => [0, "\xa63"], "Z" => [0, "\xa64"], "[" => [0, "\xa65"], "\\" => [0, "\xa66"], "]" => [0, "\xa67"], "^" => [0, "\xa68"], "_" => [0, "\xa69"], "`" => [0, "\xa6="], "a" => [0, "\xa6A"], "b" => [0, "\xa6_"], "c" => [0, "\xa6b"], "d" => [0, "\xa6d"], "e" => [0, "\xa6f"], "f" => [0, "\xa6g"], "g" => [0, "\xa6h"], "h" => [0, "\xa6l"], "i" => [0, "\xa6m"], "j" => [0, "\xa6n"], "k" => [0, "\xa6p"], "l" => [0, "\xa6r"], "m" => [0, "\xa6u"], "n" => [100, "\xa6"], "o" => [110, "\xa6"], "p" => [111, "\xa6"], "q" => [115, "\xa6"], "r" => [116, "\xa6"], "s" => [118, "\xa6"], "t" => [119, "\xa6"], "u" => [122, "\xa6"], "v" => [123, "\xa6"], "w" => [125, "\xa6"], "x" => [126, "\xa6"], "y" => [129, "\xa6"], "z" => [143, "\xa6"], "{" => [148, "\xa6"], "|" => [151, "\xa6"], "}" => [153, "\xa6"], "~" => [83, "\xa6"], "" => [10, "\xa6"], "\x80" => [77, "\xa80"], "\x81" => [18, "\xa80"], "\x82" => [77, "\xa81"], "\x83" => [18, "\xa81"], "\x84" => [77, "\xa82"], "\x85" => [18, "\xa82"], "\x86" => [77, "\xa8a"], "\x87" => [18, "\xa8a"], "\x88" => [77, "\xa8c"], "\x89" => [18, "\xa8c"], "\x8a" => [77, "\xa8e"], "\x8b" => [18, "\xa8e"], "\x8c" => [77, "\xa8i"], "\x8d" => [18, "\xa8i"], "\x8e" => [77, "\xa8o"], "\x8f" => [18, "\xa8o"], "\x90" => [77, "\xa8s"], "\x91" => [18, "\xa8s"], "\x92" => [77, "\xa8t"], "\x93" => [18, "\xa8t"], "\x94" => [0, "\xa8 "], "\x95" => [0, "\xa8%"], "\x96" => [0, "\xa8-"], "\x97" => [0, "\xa8."], "\x98" => [0, "\xa8/"], "\x99" => [0, "\xa83"], "\x9a" => [0, "\xa84"], "\x9b" => [0, "\xa85"], "\x9c" => [0, "\xa86"], "\x9d" => [0, "\xa87"], "\x9e" => [0, "\xa88"], "\x9f" => [0, "\xa89"], "\xa0" => [0, "\xa8="], "\xa1" => [0, "\xa8A"], "\xa2" => [0, "\xa8_"], "\xa3" => [0, "\xa8b"], "\xa4" => [0, "\xa8d"], "\xa5" => [0, "\xa8f"], "\xa6" => [0, "\xa8g"], "\xa7" => [0, "\xa8h"], "\xa8" => [0, "\xa8l"], "\xa9" => [0, "\xa8m"], "\xaa" => [0, "\xa8n"], "\xab" => [0, "\xa8p"], "\xac" => [0, "\xa8r"], "\xad" => [0, "\xa8u"], "\xae" => [100, "\xa8"], "\xaf" => [110, "\xa8"], "\xb0" => [111, "\xa8"], "\xb1" => [115, "\xa8"], "\xb2" => [116, "\xa8"], "\xb3" => [118, "\xa8"], "\xb4" => [119, "\xa8"], "\xb5" => [122, "\xa8"], "\xb6" => [123, "\xa8"], "\xb7" => [125, "\xa8"], "\xb8" => [126, "\xa8"], "\xb9" => [129, "\xa8"], "\xba" => [143, "\xa8"], "\xbb" => [148, "\xa8"], "\xbc" => [151, "\xa8"], "\xbd" => [153, "\xa8"], "\xbe" => [83, "\xa8"], "\xbf" => [10, "\xa8"], "\xc0" => [77, "\xae0"], "\xc1" => [18, "\xae0"], "\xc2" => [77, "\xae1"], "\xc3" => [18, "\xae1"], "\xc4" => [77, "\xae2"], "\xc5" => [18, "\xae2"], "\xc6" => [77, "\xaea"], "\xc7" => [18, "\xaea"], "\xc8" => [77, "\xaec"], "\xc9" => [18, "\xaec"], "\xca" => [77, "\xaee"], "\xcb" => [18, "\xaee"], "\xcc" => [77, "\xaei"], "\xcd" => [18, "\xaei"], "\xce" => [77, "\xaeo"], "\xcf" => [18, "\xaeo"], "\xd0" => [77, "\xaes"], "\xd1" => [18, "\xaes"], "\xd2" => [77, "\xaet"], "\xd3" => [18, "\xaet"], "\xd4" => [0, "\xae "], "\xd5" => [0, "\xae%"], "\xd6" => [0, "\xae-"], "\xd7" => [0, "\xae."], "\xd8" => [0, "\xae/"], "\xd9" => [0, "\xae3"], "\xda" => [0, "\xae4"], "\xdb" => [0, "\xae5"], "\xdc" => [0, "\xae6"], "\xdd" => [0, "\xae7"], "\xde" => [0, "\xae8"], "\xdf" => [0, "\xae9"], "\xe0" => [0, "\xae="], "\xe1" => [0, "\xaeA"], "\xe2" => [0, "\xae_"], "\xe3" => [0, "\xaeb"], "\xe4" => [0, "\xaed"], "\xe5" => [0, "\xaef"], "\xe6" => [0, "\xaeg"], "\xe7" => [0, "\xaeh"], "\xe8" => [0, "\xael"], "\xe9" => [0, "\xaem"], "\xea" => [0, "\xaen"], "\xeb" => [0, "\xaep"], "\xec" => [0, "\xaer"], "\xed" => [0, "\xaeu"], "\xee" => [100, "\xae"], "\xef" => [110, "\xae"], "\xf0" => [111, "\xae"], "\xf1" => [115, "\xae"], "\xf2" => [116, "\xae"], "\xf3" => [118, "\xae"], "\xf4" => [119, "\xae"], "\xf5" => [122, "\xae"], "\xf6" => [123, "\xae"], "\xf7" => [125, "\xae"], "\xf8" => [126, "\xae"], "\xf9" => [129, "\xae"], "\xfa" => [143, "\xae"], "\xfb" => [148, "\xae"], "\xfc" => [151, "\xae"], "\xfd" => [153, "\xae"], "\xfe" => [83, "\xae"], "\xff" => [10, "\xae"]], ["\x00" => [0, "\xa50"], "\x01" => [0, "\xa51"], "\x02" => [0, "\xa52"], "\x03" => [0, "\xa5a"], "\x04" => [0, "\xa5c"], "\x05" => [0, "\xa5e"], "\x06" => [0, "\xa5i"], "\x07" => [0, "\xa5o"], "\x08" => [0, "\xa5s"], "\t" => [0, "\xa5t"], "\n" => [73, "\xa5"], "\v" => [88, "\xa5"], "\f" => [89, "\xa5"], "\r" => [96, "\xa5"], "\x0e" => [97, "\xa5"], "\x0f" => [99, "\xa5"], "\x10" => [106, "\xa5"], "\x11" => [136, "\xa5"], "\x12" => [139, "\xa5"], "\x13" => [141, "\xa5"], "\x14" => [145, "\xa5"], "\x15" => [147, "\xa5"], "\x16" => [149, "\xa5"], "\x17" => [101, "\xa5"], "\x18" => [112, "\xa5"], "\x19" => [117, "\xa5"], "\x1a" => [120, "\xa5"], "\x1b" => [124, "\xa5"], "\x1c" => [127, "\xa5"], "\x1d" => [144, "\xa5"], "\x1e" => [152, "\xa5"], "\x1f" => [11, "\xa5"], " " => [0, "\xa60"], "!" => [0, "\xa61"], "\"" => [0, "\xa62"], "#" => [0, "\xa6a"], "\$" => [0, "\xa6c"], "%" => [0, "\xa6e"], "&" => [0, "\xa6i"], "'" => [0, "\xa6o"], "(" => [0, "\xa6s"], ")" => [0, "\xa6t"], "*" => [73, "\xa6"], "+" => [88, "\xa6"], "," => [89, "\xa6"], "-" => [96, "\xa6"], "." => [97, "\xa6"], "/" => [99, "\xa6"], [106, "\xa6"], [136, "\xa6"], [139, "\xa6"], [141, "\xa6"], [145, "\xa6"], [147, "\xa6"], [149, "\xa6"], [101, "\xa6"], [112, "\xa6"], [117, "\xa6"], ":" => [120, "\xa6"], ";" => [124, "\xa6"], "<" => [127, "\xa6"], "=" => [144, "\xa6"], ">" => [152, "\xa6"], "?" => [11, "\xa6"], "@" => [0, "\xa80"], "A" => [0, "\xa81"], "B" => [0, "\xa82"], "C" => [0, "\xa8a"], "D" => [0, "\xa8c"], "E" => [0, "\xa8e"], "F" => [0, "\xa8i"], "G" => [0, "\xa8o"], "H" => [0, "\xa8s"], "I" => [0, "\xa8t"], "J" => [73, "\xa8"], "K" => [88, "\xa8"], "L" => [89, "\xa8"], "M" => [96, "\xa8"], "N" => [97, "\xa8"], "O" => [99, "\xa8"], "P" => [106, "\xa8"], "Q" => [136, "\xa8"], "R" => [139, "\xa8"], "S" => [141, "\xa8"], "T" => [145, "\xa8"], "U" => [147, "\xa8"], "V" => [149, "\xa8"], "W" => [101, "\xa8"], "X" => [112, "\xa8"], "Y" => [117, "\xa8"], "Z" => [120, "\xa8"], "[" => [124, "\xa8"], "\\" => [127, "\xa8"], "]" => [144, "\xa8"], "^" => [152, "\xa8"], "_" => [11, "\xa8"], "`" => [0, "\xae0"], "a" => [0, "\xae1"], "b" => [0, "\xae2"], "c" => [0, "\xaea"], "d" => [0, "\xaec"], "e" => [0, "\xaee"], "f" => [0, "\xaei"], "g" => [0, "\xaeo"], "h" => [0, "\xaes"], "i" => [0, "\xaet"], "j" => [73, "\xae"], "k" => [88, "\xae"], "l" => [89, "\xae"], "m" => [96, "\xae"], "n" => [97, "\xae"], "o" => [99, "\xae"], "p" => [106, "\xae"], "q" => [136, "\xae"], "r" => [139, "\xae"], "s" => [141, "\xae"], "t" => [145, "\xae"], "u" => [147, "\xae"], "v" => [149, "\xae"], "w" => [101, "\xae"], "x" => [112, "\xae"], "y" => [117, "\xae"], "z" => [120, "\xae"], "{" => [124, "\xae"], "|" => [127, "\xae"], "}" => [144, "\xae"], "~" => [152, "\xae"], "" => [11, "\xae"], "\x80" => [0, "\xaf0"], "\x81" => [0, "\xaf1"], "\x82" => [0, "\xaf2"], "\x83" => [0, "\xafa"], "\x84" => [0, "\xafc"], "\x85" => [0, "\xafe"], "\x86" => [0, "\xafi"], "\x87" => [0, "\xafo"], "\x88" => [0, "\xafs"], "\x89" => [0, "\xaft"], "\x8a" => [73, "\xaf"], "\x8b" => [88, "\xaf"], "\x8c" => [89, "\xaf"], "\x8d" => [96, "\xaf"], "\x8e" => [97, "\xaf"], "\x8f" => [99, "\xaf"], "\x90" => [106, "\xaf"], "\x91" => [136, "\xaf"], "\x92" => [139, "\xaf"], "\x93" => [141, "\xaf"], "\x94" => [145, "\xaf"], "\x95" => [147, "\xaf"], "\x96" => [149, "\xaf"], "\x97" => [101, "\xaf"], "\x98" => [112, "\xaf"], "\x99" => [117, "\xaf"], "\x9a" => [120, "\xaf"], "\x9b" => [124, "\xaf"], "\x9c" => [127, "\xaf"], "\x9d" => [144, "\xaf"], "\x9e" => [152, "\xaf"], "\x9f" => [11, "\xaf"], "\xa0" => [0, "\xb40"], "\xa1" => [0, "\xb41"], "\xa2" => [0, "\xb42"], "\xa3" => [0, "\xb4a"], "\xa4" => [0, "\xb4c"], "\xa5" => [0, "\xb4e"], "\xa6" => [0, "\xb4i"], "\xa7" => [0, "\xb4o"], "\xa8" => [0, "\xb4s"], "\xa9" => [0, "\xb4t"], "\xaa" => [73, "\xb4"], "\xab" => [88, "\xb4"], "\xac" => [89, "\xb4"], "\xad" => [96, "\xb4"], "\xae" => [97, "\xb4"], "\xaf" => [99, "\xb4"], "\xb0" => [106, "\xb4"], "\xb1" => [136, "\xb4"], "\xb2" => [139, "\xb4"], "\xb3" => [141, "\xb4"], "\xb4" => [145, "\xb4"], "\xb5" => [147, "\xb4"], "\xb6" => [149, "\xb4"], "\xb7" => [101, "\xb4"], "\xb8" => [112, "\xb4"], "\xb9" => [117, "\xb4"], "\xba" => [120, "\xb4"], "\xbb" => [124, "\xb4"], "\xbc" => [127, "\xb4"], "\xbd" => [144, "\xb4"], "\xbe" => [152, "\xb4"], "\xbf" => [11, "\xb4"], "\xc0" => [0, "\xb60"], "\xc1" => [0, "\xb61"], "\xc2" => [0, "\xb62"], "\xc3" => [0, "\xb6a"], "\xc4" => [0, "\xb6c"], "\xc5" => [0, "\xb6e"], "\xc6" => [0, "\xb6i"], "\xc7" => [0, "\xb6o"], "\xc8" => [0, "\xb6s"], "\xc9" => [0, "\xb6t"], "\xca" => [73, "\xb6"], "\xcb" => [88, "\xb6"], "\xcc" => [89, "\xb6"], "\xcd" => [96, "\xb6"], "\xce" => [97, "\xb6"], "\xcf" => [99, "\xb6"], "\xd0" => [106, "\xb6"], "\xd1" => [136, "\xb6"], "\xd2" => [139, "\xb6"], "\xd3" => [141, "\xb6"], "\xd4" => [145, "\xb6"], "\xd5" => [147, "\xb6"], "\xd6" => [149, "\xb6"], "\xd7" => [101, "\xb6"], "\xd8" => [112, "\xb6"], "\xd9" => [117, "\xb6"], "\xda" => [120, "\xb6"], "\xdb" => [124, "\xb6"], "\xdc" => [127, "\xb6"], "\xdd" => [144, "\xb6"], "\xde" => [152, "\xb6"], "\xdf" => [11, "\xb6"], "\xe0" => [0, "\xb70"], "\xe1" => [0, "\xb71"], "\xe2" => [0, "\xb72"], "\xe3" => [0, "\xb7a"], "\xe4" => [0, "\xb7c"], "\xe5" => [0, "\xb7e"], "\xe6" => [0, "\xb7i"], "\xe7" => [0, "\xb7o"], "\xe8" => [0, "\xb7s"], "\xe9" => [0, "\xb7t"], "\xea" => [73, "\xb7"], "\xeb" => [88, "\xb7"], "\xec" => [89, "\xb7"], "\xed" => [96, "\xb7"], "\xee" => [97, "\xb7"], "\xef" => [99, "\xb7"], "\xf0" => [106, "\xb7"], "\xf1" => [136, "\xb7"], "\xf2" => [139, "\xb7"], "\xf3" => [141, "\xb7"], "\xf4" => [145, "\xb7"], "\xf5" => [147, "\xb7"], "\xf6" => [149, "\xb7"], "\xf7" => [101, "\xb7"], "\xf8" => [112, "\xb7"], "\xf9" => [117, "\xb7"], "\xfa" => [120, "\xb7"], "\xfb" => [124, "\xb7"], "\xfc" => [127, "\xb7"], "\xfd" => [144, "\xb7"], "\xfe" => [152, "\xb7"], "\xff" => [11, "\xb7"]], ["\x00" => [94, "\xa70"], "\x01" => [76, "\xa70"], "\x02" => [104, "\xa70"], "\x03" => [16, "\xa70"], "\x04" => [94, "\xa71"], "\x05" => [76, "\xa71"], "\x06" => [104, "\xa71"], "\x07" => [16, "\xa71"], "\x08" => [94, "\xa72"], "\t" => [76, "\xa72"], "\n" => [104, "\xa72"], "\v" => [16, "\xa72"], "\f" => [94, "\xa7a"], "\r" => [76, "\xa7a"], "\x0e" => [104, "\xa7a"], "\x0f" => [16, "\xa7a"], "\x10" => [94, "\xa7c"], "\x11" => [76, "\xa7c"], "\x12" => [104, "\xa7c"], "\x13" => [16, "\xa7c"], "\x14" => [94, "\xa7e"], "\x15" => [76, "\xa7e"], "\x16" => [104, "\xa7e"], "\x17" => [16, "\xa7e"], "\x18" => [94, "\xa7i"], "\x19" => [76, "\xa7i"], "\x1a" => [104, "\xa7i"], "\x1b" => [16, "\xa7i"], "\x1c" => [94, "\xa7o"], "\x1d" => [76, "\xa7o"], "\x1e" => [104, "\xa7o"], "\x1f" => [16, "\xa7o"], " " => [94, "\xa7s"], "!" => [76, "\xa7s"], "\"" => [104, "\xa7s"], "#" => [16, "\xa7s"], "\$" => [94, "\xa7t"], "%" => [76, "\xa7t"], "&" => [104, "\xa7t"], "'" => [16, "\xa7t"], "(" => [77, "\xa7 "], ")" => [18, "\xa7 "], "*" => [77, "\xa7%"], "+" => [18, "\xa7%"], "," => [77, "\xa7-"], "-" => [18, "\xa7-"], "." => [77, "\xa7."], "/" => [18, "\xa7."], [77, "\xa7/"], [18, "\xa7/"], [77, "\xa73"], [18, "\xa73"], [77, "\xa74"], [18, "\xa74"], [77, "\xa75"], [18, "\xa75"], [77, "\xa76"], [18, "\xa76"], ":" => [77, "\xa77"], ";" => [18, "\xa77"], "<" => [77, "\xa78"], "=" => [18, "\xa78"], ">" => [77, "\xa79"], "?" => [18, "\xa79"], "@" => [77, "\xa7="], "A" => [18, "\xa7="], "B" => [77, "\xa7A"], "C" => [18, "\xa7A"], "D" => [77, "\xa7_"], "E" => [18, "\xa7_"], "F" => [77, "\xa7b"], "G" => [18, "\xa7b"], "H" => [77, "\xa7d"], "I" => [18, "\xa7d"], "J" => [77, "\xa7f"], "K" => [18, "\xa7f"], "L" => [77, "\xa7g"], "M" => [18, "\xa7g"], "N" => [77, "\xa7h"], "O" => [18, "\xa7h"], "P" => [77, "\xa7l"], "Q" => [18, "\xa7l"], "R" => [77, "\xa7m"], "S" => [18, "\xa7m"], "T" => [77, "\xa7n"], "U" => [18, "\xa7n"], "V" => [77, "\xa7p"], "W" => [18, "\xa7p"], "X" => [77, "\xa7r"], "Y" => [18, "\xa7r"], "Z" => [77, "\xa7u"], "[" => [18, "\xa7u"], "\\" => [0, "\xa7:"], "]" => [0, "\xa7B"], "^" => [0, "\xa7C"], "_" => [0, "\xa7D"], "`" => [0, "\xa7E"], "a" => [0, "\xa7F"], "b" => [0, "\xa7G"], "c" => [0, "\xa7H"], "d" => [0, "\xa7I"], "e" => [0, "\xa7J"], "f" => [0, "\xa7K"], "g" => [0, "\xa7L"], "h" => [0, "\xa7M"], "i" => [0, "\xa7N"], "j" => [0, "\xa7O"], "k" => [0, "\xa7P"], "l" => [0, "\xa7Q"], "m" => [0, "\xa7R"], "n" => [0, "\xa7S"], "o" => [0, "\xa7T"], "p" => [0, "\xa7U"], "q" => [0, "\xa7V"], "r" => [0, "\xa7W"], "s" => [0, "\xa7Y"], "t" => [0, "\xa7j"], "u" => [0, "\xa7k"], "v" => [0, "\xa7q"], "w" => [0, "\xa7v"], "x" => [0, "\xa7w"], "y" => [0, "\xa7x"], "z" => [0, "\xa7y"], "{" => [0, "\xa7z"], "|" => [82, "\xa7"], "}" => [87, "\xa7"], "~" => [130, "\xa7"], "" => [9, "\xa7"], "\x80" => [94, "\xac0"], "\x81" => [76, "\xac0"], "\x82" => [104, "\xac0"], "\x83" => [16, "\xac0"], "\x84" => [94, "\xac1"], "\x85" => [76, "\xac1"], "\x86" => [104, "\xac1"], "\x87" => [16, "\xac1"], "\x88" => [94, "\xac2"], "\x89" => [76, "\xac2"], "\x8a" => [104, "\xac2"], "\x8b" => [16, "\xac2"], "\x8c" => [94, "\xaca"], "\x8d" => [76, "\xaca"], "\x8e" => [104, "\xaca"], "\x8f" => [16, "\xaca"], "\x90" => [94, "\xacc"], "\x91" => [76, "\xacc"], "\x92" => [104, "\xacc"], "\x93" => [16, "\xacc"], "\x94" => [94, "\xace"], "\x95" => [76, "\xace"], "\x96" => [104, "\xace"], "\x97" => [16, "\xace"], "\x98" => [94, "\xaci"], "\x99" => [76, "\xaci"], "\x9a" => [104, "\xaci"], "\x9b" => [16, "\xaci"], "\x9c" => [94, "\xaco"], "\x9d" => [76, "\xaco"], "\x9e" => [104, "\xaco"], "\x9f" => [16, "\xaco"], "\xa0" => [94, "\xacs"], "\xa1" => [76, "\xacs"], "\xa2" => [104, "\xacs"], "\xa3" => [16, "\xacs"], "\xa4" => [94, "\xact"], "\xa5" => [76, "\xact"], "\xa6" => [104, "\xact"], "\xa7" => [16, "\xact"], "\xa8" => [77, "\xac "], "\xa9" => [18, "\xac "], "\xaa" => [77, "\xac%"], "\xab" => [18, "\xac%"], "\xac" => [77, "\xac-"], "\xad" => [18, "\xac-"], "\xae" => [77, "\xac."], "\xaf" => [18, "\xac."], "\xb0" => [77, "\xac/"], "\xb1" => [18, "\xac/"], "\xb2" => [77, "\xac3"], "\xb3" => [18, "\xac3"], "\xb4" => [77, "\xac4"], "\xb5" => [18, "\xac4"], "\xb6" => [77, "\xac5"], "\xb7" => [18, "\xac5"], "\xb8" => [77, "\xac6"], "\xb9" => [18, "\xac6"], "\xba" => [77, "\xac7"], "\xbb" => [18, "\xac7"], "\xbc" => [77, "\xac8"], "\xbd" => [18, "\xac8"], "\xbe" => [77, "\xac9"], "\xbf" => [18, "\xac9"], "\xc0" => [77, "\xac="], "\xc1" => [18, "\xac="], "\xc2" => [77, "\xacA"], "\xc3" => [18, "\xacA"], "\xc4" => [77, "\xac_"], "\xc5" => [18, "\xac_"], "\xc6" => [77, "\xacb"], "\xc7" => [18, "\xacb"], "\xc8" => [77, "\xacd"], "\xc9" => [18, "\xacd"], "\xca" => [77, "\xacf"], "\xcb" => [18, "\xacf"], "\xcc" => [77, "\xacg"], "\xcd" => [18, "\xacg"], "\xce" => [77, "\xach"], "\xcf" => [18, "\xach"], "\xd0" => [77, "\xacl"], "\xd1" => [18, "\xacl"], "\xd2" => [77, "\xacm"], "\xd3" => [18, "\xacm"], "\xd4" => [77, "\xacn"], "\xd5" => [18, "\xacn"], "\xd6" => [77, "\xacp"], "\xd7" => [18, "\xacp"], "\xd8" => [77, "\xacr"], "\xd9" => [18, "\xacr"], "\xda" => [77, "\xacu"], "\xdb" => [18, "\xacu"], "\xdc" => [0, "\xac:"], "\xdd" => [0, "\xacB"], "\xde" => [0, "\xacC"], "\xdf" => [0, "\xacD"], "\xe0" => [0, "\xacE"], "\xe1" => [0, "\xacF"], "\xe2" => [0, "\xacG"], "\xe3" => [0, "\xacH"], "\xe4" => [0, "\xacI"], "\xe5" => [0, "\xacJ"], "\xe6" => [0, "\xacK"], "\xe7" => [0, "\xacL"], "\xe8" => [0, "\xacM"], "\xe9" => [0, "\xacN"], "\xea" => [0, "\xacO"], "\xeb" => [0, "\xacP"], "\xec" => [0, "\xacQ"], "\xed" => [0, "\xacR"], "\xee" => [0, "\xacS"], "\xef" => [0, "\xacT"], "\xf0" => [0, "\xacU"], "\xf1" => [0, "\xacV"], "\xf2" => [0, "\xacW"], "\xf3" => [0, "\xacY"], "\xf4" => [0, "\xacj"], "\xf5" => [0, "\xack"], "\xf6" => [0, "\xacq"], "\xf7" => [0, "\xacv"], "\xf8" => [0, "\xacw"], "\xf9" => [0, "\xacx"], "\xfa" => [0, "\xacy"], "\xfb" => [0, "\xacz"], "\xfc" => [82, "\xac"], "\xfd" => [87, "\xac"], "\xfe" => [130, "\xac"], "\xff" => [9, "\xac"]], ["\x00" => [94, "\xa80"], "\x01" => [76, "\xa80"], "\x02" => [104, "\xa80"], "\x03" => [16, "\xa80"], "\x04" => [94, "\xa81"], "\x05" => [76, "\xa81"], "\x06" => [104, "\xa81"], "\x07" => [16, "\xa81"], "\x08" => [94, "\xa82"], "\t" => [76, "\xa82"], "\n" => [104, "\xa82"], "\v" => [16, "\xa82"], "\f" => [94, "\xa8a"], "\r" => [76, "\xa8a"], "\x0e" => [104, "\xa8a"], "\x0f" => [16, "\xa8a"], "\x10" => [94, "\xa8c"], "\x11" => [76, "\xa8c"], "\x12" => [104, "\xa8c"], "\x13" => [16, "\xa8c"], "\x14" => [94, "\xa8e"], "\x15" => [76, "\xa8e"], "\x16" => [104, "\xa8e"], "\x17" => [16, "\xa8e"], "\x18" => [94, "\xa8i"], "\x19" => [76, "\xa8i"], "\x1a" => [104, "\xa8i"], "\x1b" => [16, "\xa8i"], "\x1c" => [94, "\xa8o"], "\x1d" => [76, "\xa8o"], "\x1e" => [104, "\xa8o"], "\x1f" => [16, "\xa8o"], " " => [94, "\xa8s"], "!" => [76, "\xa8s"], "\"" => [104, "\xa8s"], "#" => [16, "\xa8s"], "\$" => [94, "\xa8t"], "%" => [76, "\xa8t"], "&" => [104, "\xa8t"], "'" => [16, "\xa8t"], "(" => [77, "\xa8 "], ")" => [18, "\xa8 "], "*" => [77, "\xa8%"], "+" => [18, "\xa8%"], "," => [77, "\xa8-"], "-" => [18, "\xa8-"], "." => [77, "\xa8."], "/" => [18, "\xa8."], [77, "\xa8/"], [18, "\xa8/"], [77, "\xa83"], [18, "\xa83"], [77, "\xa84"], [18, "\xa84"], [77, "\xa85"], [18, "\xa85"], [77, "\xa86"], [18, "\xa86"], ":" => [77, "\xa87"], ";" => [18, "\xa87"], "<" => [77, "\xa88"], "=" => [18, "\xa88"], ">" => [77, "\xa89"], "?" => [18, "\xa89"], "@" => [77, "\xa8="], "A" => [18, "\xa8="], "B" => [77, "\xa8A"], "C" => [18, "\xa8A"], "D" => [77, "\xa8_"], "E" => [18, "\xa8_"], "F" => [77, "\xa8b"], "G" => [18, "\xa8b"], "H" => [77, "\xa8d"], "I" => [18, "\xa8d"], "J" => [77, "\xa8f"], "K" => [18, "\xa8f"], "L" => [77, "\xa8g"], "M" => [18, "\xa8g"], "N" => [77, "\xa8h"], "O" => [18, "\xa8h"], "P" => [77, "\xa8l"], "Q" => [18, "\xa8l"], "R" => [77, "\xa8m"], "S" => [18, "\xa8m"], "T" => [77, "\xa8n"], "U" => [18, "\xa8n"], "V" => [77, "\xa8p"], "W" => [18, "\xa8p"], "X" => [77, "\xa8r"], "Y" => [18, "\xa8r"], "Z" => [77, "\xa8u"], "[" => [18, "\xa8u"], "\\" => [0, "\xa8:"], "]" => [0, "\xa8B"], "^" => [0, "\xa8C"], "_" => [0, "\xa8D"], "`" => [0, "\xa8E"], "a" => [0, "\xa8F"], "b" => [0, "\xa8G"], "c" => [0, "\xa8H"], "d" => [0, "\xa8I"], "e" => [0, "\xa8J"], "f" => [0, "\xa8K"], "g" => [0, "\xa8L"], "h" => [0, "\xa8M"], "i" => [0, "\xa8N"], "j" => [0, "\xa8O"], "k" => [0, "\xa8P"], "l" => [0, "\xa8Q"], "m" => [0, "\xa8R"], "n" => [0, "\xa8S"], "o" => [0, "\xa8T"], "p" => [0, "\xa8U"], "q" => [0, "\xa8V"], "r" => [0, "\xa8W"], "s" => [0, "\xa8Y"], "t" => [0, "\xa8j"], "u" => [0, "\xa8k"], "v" => [0, "\xa8q"], "w" => [0, "\xa8v"], "x" => [0, "\xa8w"], "y" => [0, "\xa8x"], "z" => [0, "\xa8y"], "{" => [0, "\xa8z"], "|" => [82, "\xa8"], "}" => [87, "\xa8"], "~" => [130, "\xa8"], "" => [9, "\xa8"], "\x80" => [94, "\xae0"], "\x81" => [76, "\xae0"], "\x82" => [104, "\xae0"], "\x83" => [16, "\xae0"], "\x84" => [94, "\xae1"], "\x85" => [76, "\xae1"], "\x86" => [104, "\xae1"], "\x87" => [16, "\xae1"], "\x88" => [94, "\xae2"], "\x89" => [76, "\xae2"], "\x8a" => [104, "\xae2"], "\x8b" => [16, "\xae2"], "\x8c" => [94, "\xaea"], "\x8d" => [76, "\xaea"], "\x8e" => [104, "\xaea"], "\x8f" => [16, "\xaea"], "\x90" => [94, "\xaec"], "\x91" => [76, "\xaec"], "\x92" => [104, "\xaec"], "\x93" => [16, "\xaec"], "\x94" => [94, "\xaee"], "\x95" => [76, "\xaee"], "\x96" => [104, "\xaee"], "\x97" => [16, "\xaee"], "\x98" => [94, "\xaei"], "\x99" => [76, "\xaei"], "\x9a" => [104, "\xaei"], "\x9b" => [16, "\xaei"], "\x9c" => [94, "\xaeo"], "\x9d" => [76, "\xaeo"], "\x9e" => [104, "\xaeo"], "\x9f" => [16, "\xaeo"], "\xa0" => [94, "\xaes"], "\xa1" => [76, "\xaes"], "\xa2" => [104, "\xaes"], "\xa3" => [16, "\xaes"], "\xa4" => [94, "\xaet"], "\xa5" => [76, "\xaet"], "\xa6" => [104, "\xaet"], "\xa7" => [16, "\xaet"], "\xa8" => [77, "\xae "], "\xa9" => [18, "\xae "], "\xaa" => [77, "\xae%"], "\xab" => [18, "\xae%"], "\xac" => [77, "\xae-"], "\xad" => [18, "\xae-"], "\xae" => [77, "\xae."], "\xaf" => [18, "\xae."], "\xb0" => [77, "\xae/"], "\xb1" => [18, "\xae/"], "\xb2" => [77, "\xae3"], "\xb3" => [18, "\xae3"], "\xb4" => [77, "\xae4"], "\xb5" => [18, "\xae4"], "\xb6" => [77, "\xae5"], "\xb7" => [18, "\xae5"], "\xb8" => [77, "\xae6"], "\xb9" => [18, "\xae6"], "\xba" => [77, "\xae7"], "\xbb" => [18, "\xae7"], "\xbc" => [77, "\xae8"], "\xbd" => [18, "\xae8"], "\xbe" => [77, "\xae9"], "\xbf" => [18, "\xae9"], "\xc0" => [77, "\xae="], "\xc1" => [18, "\xae="], "\xc2" => [77, "\xaeA"], "\xc3" => [18, "\xaeA"], "\xc4" => [77, "\xae_"], "\xc5" => [18, "\xae_"], "\xc6" => [77, "\xaeb"], "\xc7" => [18, "\xaeb"], "\xc8" => [77, "\xaed"], "\xc9" => [18, "\xaed"], "\xca" => [77, "\xaef"], "\xcb" => [18, "\xaef"], "\xcc" => [77, "\xaeg"], "\xcd" => [18, "\xaeg"], "\xce" => [77, "\xaeh"], "\xcf" => [18, "\xaeh"], "\xd0" => [77, "\xael"], "\xd1" => [18, "\xael"], "\xd2" => [77, "\xaem"], "\xd3" => [18, "\xaem"], "\xd4" => [77, "\xaen"], "\xd5" => [18, "\xaen"], "\xd6" => [77, "\xaep"], "\xd7" => [18, "\xaep"], "\xd8" => [77, "\xaer"], "\xd9" => [18, "\xaer"], "\xda" => [77, "\xaeu"], "\xdb" => [18, "\xaeu"], "\xdc" => [0, "\xae:"], "\xdd" => [0, "\xaeB"], "\xde" => [0, "\xaeC"], "\xdf" => [0, "\xaeD"], "\xe0" => [0, "\xaeE"], "\xe1" => [0, "\xaeF"], "\xe2" => [0, "\xaeG"], "\xe3" => [0, "\xaeH"], "\xe4" => [0, "\xaeI"], "\xe5" => [0, "\xaeJ"], "\xe6" => [0, "\xaeK"], "\xe7" => [0, "\xaeL"], "\xe8" => [0, "\xaeM"], "\xe9" => [0, "\xaeN"], "\xea" => [0, "\xaeO"], "\xeb" => [0, "\xaeP"], "\xec" => [0, "\xaeQ"], "\xed" => [0, "\xaeR"], "\xee" => [0, "\xaeS"], "\xef" => [0, "\xaeT"], "\xf0" => [0, "\xaeU"], "\xf1" => [0, "\xaeV"], "\xf2" => [0, "\xaeW"], "\xf3" => [0, "\xaeY"], "\xf4" => [0, "\xaej"], "\xf5" => [0, "\xaek"], "\xf6" => [0, "\xaeq"], "\xf7" => [0, "\xaev"], "\xf8" => [0, "\xaew"], "\xf9" => [0, "\xaex"], "\xfa" => [0, "\xaey"], "\xfb" => [0, "\xaez"], "\xfc" => [82, "\xae"], "\xfd" => [87, "\xae"], "\xfe" => [130, "\xae"], "\xff" => [9, "\xae"]], ["\x00" => [94, "\xaa0"], "\x01" => [76, "\xaa0"], "\x02" => [104, "\xaa0"], "\x03" => [16, "\xaa0"], "\x04" => [94, "\xaa1"], "\x05" => [76, "\xaa1"], "\x06" => [104, "\xaa1"], "\x07" => [16, "\xaa1"], "\x08" => [94, "\xaa2"], "\t" => [76, "\xaa2"], "\n" => [104, "\xaa2"], "\v" => [16, "\xaa2"], "\f" => [94, "\xaaa"], "\r" => [76, "\xaaa"], "\x0e" => [104, "\xaaa"], "\x0f" => [16, "\xaaa"], "\x10" => [94, "\xaac"], "\x11" => [76, "\xaac"], "\x12" => [104, "\xaac"], "\x13" => [16, "\xaac"], "\x14" => [94, "\xaae"], "\x15" => [76, "\xaae"], "\x16" => [104, "\xaae"], "\x17" => [16, "\xaae"], "\x18" => [94, "\xaai"], "\x19" => [76, "\xaai"], "\x1a" => [104, "\xaai"], "\x1b" => [16, "\xaai"], "\x1c" => [94, "\xaao"], "\x1d" => [76, "\xaao"], "\x1e" => [104, "\xaao"], "\x1f" => [16, "\xaao"], " " => [94, "\xaas"], "!" => [76, "\xaas"], "\"" => [104, "\xaas"], "#" => [16, "\xaas"], "\$" => [94, "\xaat"], "%" => [76, "\xaat"], "&" => [104, "\xaat"], "'" => [16, "\xaat"], "(" => [77, "\xaa "], ")" => [18, "\xaa "], "*" => [77, "\xaa%"], "+" => [18, "\xaa%"], "," => [77, "\xaa-"], "-" => [18, "\xaa-"], "." => [77, "\xaa."], "/" => [18, "\xaa."], [77, "\xaa/"], [18, "\xaa/"], [77, "\xaa3"], [18, "\xaa3"], [77, "\xaa4"], [18, "\xaa4"], [77, "\xaa5"], [18, "\xaa5"], [77, "\xaa6"], [18, "\xaa6"], ":" => [77, "\xaa7"], ";" => [18, "\xaa7"], "<" => [77, "\xaa8"], "=" => [18, "\xaa8"], ">" => [77, "\xaa9"], "?" => [18, "\xaa9"], "@" => [77, "\xaa="], "A" => [18, "\xaa="], "B" => [77, "\xaaA"], "C" => [18, "\xaaA"], "D" => [77, "\xaa_"], "E" => [18, "\xaa_"], "F" => [77, "\xaab"], "G" => [18, "\xaab"], "H" => [77, "\xaad"], "I" => [18, "\xaad"], "J" => [77, "\xaaf"], "K" => [18, "\xaaf"], "L" => [77, "\xaag"], "M" => [18, "\xaag"], "N" => [77, "\xaah"], "O" => [18, "\xaah"], "P" => [77, "\xaal"], "Q" => [18, "\xaal"], "R" => [77, "\xaam"], "S" => [18, "\xaam"], "T" => [77, "\xaan"], "U" => [18, "\xaan"], "V" => [77, "\xaap"], "W" => [18, "\xaap"], "X" => [77, "\xaar"], "Y" => [18, "\xaar"], "Z" => [77, "\xaau"], "[" => [18, "\xaau"], "\\" => [0, "\xaa:"], "]" => [0, "\xaaB"], "^" => [0, "\xaaC"], "_" => [0, "\xaaD"], "`" => [0, "\xaaE"], "a" => [0, "\xaaF"], "b" => [0, "\xaaG"], "c" => [0, "\xaaH"], "d" => [0, "\xaaI"], "e" => [0, "\xaaJ"], "f" => [0, "\xaaK"], "g" => [0, "\xaaL"], "h" => [0, "\xaaM"], "i" => [0, "\xaaN"], "j" => [0, "\xaaO"], "k" => [0, "\xaaP"], "l" => [0, "\xaaQ"], "m" => [0, "\xaaR"], "n" => [0, "\xaaS"], "o" => [0, "\xaaT"], "p" => [0, "\xaaU"], "q" => [0, "\xaaV"], "r" => [0, "\xaaW"], "s" => [0, "\xaaY"], "t" => [0, "\xaaj"], "u" => [0, "\xaak"], "v" => [0, "\xaaq"], "w" => [0, "\xaav"], "x" => [0, "\xaaw"], "y" => [0, "\xaax"], "z" => [0, "\xaay"], "{" => [0, "\xaaz"], "|" => [82, "\xaa"], "}" => [87, "\xaa"], "~" => [130, "\xaa"], "" => [9, "\xaa"], "\x80" => [94, "\xad0"], "\x81" => [76, "\xad0"], "\x82" => [104, "\xad0"], "\x83" => [16, "\xad0"], "\x84" => [94, "\xad1"], "\x85" => [76, "\xad1"], "\x86" => [104, "\xad1"], "\x87" => [16, "\xad1"], "\x88" => [94, "\xad2"], "\x89" => [76, "\xad2"], "\x8a" => [104, "\xad2"], "\x8b" => [16, "\xad2"], "\x8c" => [94, "\xada"], "\x8d" => [76, "\xada"], "\x8e" => [104, "\xada"], "\x8f" => [16, "\xada"], "\x90" => [94, "\xadc"], "\x91" => [76, "\xadc"], "\x92" => [104, "\xadc"], "\x93" => [16, "\xadc"], "\x94" => [94, "\xade"], "\x95" => [76, "\xade"], "\x96" => [104, "\xade"], "\x97" => [16, "\xade"], "\x98" => [94, "\xadi"], "\x99" => [76, "\xadi"], "\x9a" => [104, "\xadi"], "\x9b" => [16, "\xadi"], "\x9c" => [94, "\xado"], "\x9d" => [76, "\xado"], "\x9e" => [104, "\xado"], "\x9f" => [16, "\xado"], "\xa0" => [94, "\xads"], "\xa1" => [76, "\xads"], "\xa2" => [104, "\xads"], "\xa3" => [16, "\xads"], "\xa4" => [94, "\xadt"], "\xa5" => [76, "\xadt"], "\xa6" => [104, "\xadt"], "\xa7" => [16, "\xadt"], "\xa8" => [77, "\xad "], "\xa9" => [18, "\xad "], "\xaa" => [77, "\xad%"], "\xab" => [18, "\xad%"], "\xac" => [77, "\xad-"], "\xad" => [18, "\xad-"], "\xae" => [77, "\xad."], "\xaf" => [18, "\xad."], "\xb0" => [77, "\xad/"], "\xb1" => [18, "\xad/"], "\xb2" => [77, "\xad3"], "\xb3" => [18, "\xad3"], "\xb4" => [77, "\xad4"], "\xb5" => [18, "\xad4"], "\xb6" => [77, "\xad5"], "\xb7" => [18, "\xad5"], "\xb8" => [77, "\xad6"], "\xb9" => [18, "\xad6"], "\xba" => [77, "\xad7"], "\xbb" => [18, "\xad7"], "\xbc" => [77, "\xad8"], "\xbd" => [18, "\xad8"], "\xbe" => [77, "\xad9"], "\xbf" => [18, "\xad9"], "\xc0" => [77, "\xad="], "\xc1" => [18, "\xad="], "\xc2" => [77, "\xadA"], "\xc3" => [18, "\xadA"], "\xc4" => [77, "\xad_"], "\xc5" => [18, "\xad_"], "\xc6" => [77, "\xadb"], "\xc7" => [18, "\xadb"], "\xc8" => [77, "\xadd"], "\xc9" => [18, "\xadd"], "\xca" => [77, "\xadf"], "\xcb" => [18, "\xadf"], "\xcc" => [77, "\xadg"], "\xcd" => [18, "\xadg"], "\xce" => [77, "\xadh"], "\xcf" => [18, "\xadh"], "\xd0" => [77, "\xadl"], "\xd1" => [18, "\xadl"], "\xd2" => [77, "\xadm"], "\xd3" => [18, "\xadm"], "\xd4" => [77, "\xadn"], "\xd5" => [18, "\xadn"], "\xd6" => [77, "\xadp"], "\xd7" => [18, "\xadp"], "\xd8" => [77, "\xadr"], "\xd9" => [18, "\xadr"], "\xda" => [77, "\xadu"], "\xdb" => [18, "\xadu"], "\xdc" => [0, "\xad:"], "\xdd" => [0, "\xadB"], "\xde" => [0, "\xadC"], "\xdf" => [0, "\xadD"], "\xe0" => [0, "\xadE"], "\xe1" => [0, "\xadF"], "\xe2" => [0, "\xadG"], "\xe3" => [0, "\xadH"], "\xe4" => [0, "\xadI"], "\xe5" => [0, "\xadJ"], "\xe6" => [0, "\xadK"], "\xe7" => [0, "\xadL"], "\xe8" => [0, "\xadM"], "\xe9" => [0, "\xadN"], "\xea" => [0, "\xadO"], "\xeb" => [0, "\xadP"], "\xec" => [0, "\xadQ"], "\xed" => [0, "\xadR"], "\xee" => [0, "\xadS"], "\xef" => [0, "\xadT"], "\xf0" => [0, "\xadU"], "\xf1" => [0, "\xadV"], "\xf2" => [0, "\xadW"], "\xf3" => [0, "\xadY"], "\xf4" => [0, "\xadj"], "\xf5" => [0, "\xadk"], "\xf6" => [0, "\xadq"], "\xf7" => [0, "\xadv"], "\xf8" => [0, "\xadw"], "\xf9" => [0, "\xadx"], "\xfa" => [0, "\xady"], "\xfb" => [0, "\xadz"], "\xfc" => [82, "\xad"], "\xfd" => [87, "\xad"], "\xfe" => [130, "\xad"], "\xff" => [9, "\xad"]], ["\x00" => [94, "\xab0"], "\x01" => [76, "\xab0"], "\x02" => [104, "\xab0"], "\x03" => [16, "\xab0"], "\x04" => [94, "\xab1"], "\x05" => [76, "\xab1"], "\x06" => [104, "\xab1"], "\x07" => [16, "\xab1"], "\x08" => [94, "\xab2"], "\t" => [76, "\xab2"], "\n" => [104, "\xab2"], "\v" => [16, "\xab2"], "\f" => [94, "\xaba"], "\r" => [76, "\xaba"], "\x0e" => [104, "\xaba"], "\x0f" => [16, "\xaba"], "\x10" => [94, "\xabc"], "\x11" => [76, "\xabc"], "\x12" => [104, "\xabc"], "\x13" => [16, "\xabc"], "\x14" => [94, "\xabe"], "\x15" => [76, "\xabe"], "\x16" => [104, "\xabe"], "\x17" => [16, "\xabe"], "\x18" => [94, "\xabi"], "\x19" => [76, "\xabi"], "\x1a" => [104, "\xabi"], "\x1b" => [16, "\xabi"], "\x1c" => [94, "\xabo"], "\x1d" => [76, "\xabo"], "\x1e" => [104, "\xabo"], "\x1f" => [16, "\xabo"], " " => [94, "\xabs"], "!" => [76, "\xabs"], "\"" => [104, "\xabs"], "#" => [16, "\xabs"], "\$" => [94, "\xabt"], "%" => [76, "\xabt"], "&" => [104, "\xabt"], "'" => [16, "\xabt"], "(" => [77, "\xab "], ")" => [18, "\xab "], "*" => [77, "\xab%"], "+" => [18, "\xab%"], "," => [77, "\xab-"], "-" => [18, "\xab-"], "." => [77, "\xab."], "/" => [18, "\xab."], [77, "\xab/"], [18, "\xab/"], [77, "\xab3"], [18, "\xab3"], [77, "\xab4"], [18, "\xab4"], [77, "\xab5"], [18, "\xab5"], [77, "\xab6"], [18, "\xab6"], ":" => [77, "\xab7"], ";" => [18, "\xab7"], "<" => [77, "\xab8"], "=" => [18, "\xab8"], ">" => [77, "\xab9"], "?" => [18, "\xab9"], "@" => [77, "\xab="], "A" => [18, "\xab="], "B" => [77, "\xabA"], "C" => [18, "\xabA"], "D" => [77, "\xab_"], "E" => [18, "\xab_"], "F" => [77, "\xabb"], "G" => [18, "\xabb"], "H" => [77, "\xabd"], "I" => [18, "\xabd"], "J" => [77, "\xabf"], "K" => [18, "\xabf"], "L" => [77, "\xabg"], "M" => [18, "\xabg"], "N" => [77, "\xabh"], "O" => [18, "\xabh"], "P" => [77, "\xabl"], "Q" => [18, "\xabl"], "R" => [77, "\xabm"], "S" => [18, "\xabm"], "T" => [77, "\xabn"], "U" => [18, "\xabn"], "V" => [77, "\xabp"], "W" => [18, "\xabp"], "X" => [77, "\xabr"], "Y" => [18, "\xabr"], "Z" => [77, "\xabu"], "[" => [18, "\xabu"], "\\" => [0, "\xab:"], "]" => [0, "\xabB"], "^" => [0, "\xabC"], "_" => [0, "\xabD"], "`" => [0, "\xabE"], "a" => [0, "\xabF"], "b" => [0, "\xabG"], "c" => [0, "\xabH"], "d" => [0, "\xabI"], "e" => [0, "\xabJ"], "f" => [0, "\xabK"], "g" => [0, "\xabL"], "h" => [0, "\xabM"], "i" => [0, "\xabN"], "j" => [0, "\xabO"], "k" => [0, "\xabP"], "l" => [0, "\xabQ"], "m" => [0, "\xabR"], "n" => [0, "\xabS"], "o" => [0, "\xabT"], "p" => [0, "\xabU"], "q" => [0, "\xabV"], "r" => [0, "\xabW"], "s" => [0, "\xabY"], "t" => [0, "\xabj"], "u" => [0, "\xabk"], "v" => [0, "\xabq"], "w" => [0, "\xabv"], "x" => [0, "\xabw"], "y" => [0, "\xabx"], "z" => [0, "\xaby"], "{" => [0, "\xabz"], "|" => [82, "\xab"], "}" => [87, "\xab"], "~" => [130, "\xab"], "" => [9, "\xab"], "\x80" => [94, "\xce0"], "\x81" => [76, "\xce0"], "\x82" => [104, "\xce0"], "\x83" => [16, "\xce0"], "\x84" => [94, "\xce1"], "\x85" => [76, "\xce1"], "\x86" => [104, "\xce1"], "\x87" => [16, "\xce1"], "\x88" => [94, "\xce2"], "\x89" => [76, "\xce2"], "\x8a" => [104, "\xce2"], "\x8b" => [16, "\xce2"], "\x8c" => [94, "\xcea"], "\x8d" => [76, "\xcea"], "\x8e" => [104, "\xcea"], "\x8f" => [16, "\xcea"], "\x90" => [94, "\xcec"], "\x91" => [76, "\xcec"], "\x92" => [104, "\xcec"], "\x93" => [16, "\xcec"], "\x94" => [94, "\xcee"], "\x95" => [76, "\xcee"], "\x96" => [104, "\xcee"], "\x97" => [16, "\xcee"], "\x98" => [94, "\xcei"], "\x99" => [76, "\xcei"], "\x9a" => [104, "\xcei"], "\x9b" => [16, "\xcei"], "\x9c" => [94, "\xceo"], "\x9d" => [76, "\xceo"], "\x9e" => [104, "\xceo"], "\x9f" => [16, "\xceo"], "\xa0" => [94, "\xces"], "\xa1" => [76, "\xces"], "\xa2" => [104, "\xces"], "\xa3" => [16, "\xces"], "\xa4" => [94, "\xcet"], "\xa5" => [76, "\xcet"], "\xa6" => [104, "\xcet"], "\xa7" => [16, "\xcet"], "\xa8" => [77, "\xce "], "\xa9" => [18, "\xce "], "\xaa" => [77, "\xce%"], "\xab" => [18, "\xce%"], "\xac" => [77, "\xce-"], "\xad" => [18, "\xce-"], "\xae" => [77, "\xce."], "\xaf" => [18, "\xce."], "\xb0" => [77, "\xce/"], "\xb1" => [18, "\xce/"], "\xb2" => [77, "\xce3"], "\xb3" => [18, "\xce3"], "\xb4" => [77, "\xce4"], "\xb5" => [18, "\xce4"], "\xb6" => [77, "\xce5"], "\xb7" => [18, "\xce5"], "\xb8" => [77, "\xce6"], "\xb9" => [18, "\xce6"], "\xba" => [77, "\xce7"], "\xbb" => [18, "\xce7"], "\xbc" => [77, "\xce8"], "\xbd" => [18, "\xce8"], "\xbe" => [77, "\xce9"], "\xbf" => [18, "\xce9"], "\xc0" => [77, "\xce="], "\xc1" => [18, "\xce="], "\xc2" => [77, "\xceA"], "\xc3" => [18, "\xceA"], "\xc4" => [77, "\xce_"], "\xc5" => [18, "\xce_"], "\xc6" => [77, "\xceb"], "\xc7" => [18, "\xceb"], "\xc8" => [77, "\xced"], "\xc9" => [18, "\xced"], "\xca" => [77, "\xcef"], "\xcb" => [18, "\xcef"], "\xcc" => [77, "\xceg"], "\xcd" => [18, "\xceg"], "\xce" => [77, "\xceh"], "\xcf" => [18, "\xceh"], "\xd0" => [77, "\xcel"], "\xd1" => [18, "\xcel"], "\xd2" => [77, "\xcem"], "\xd3" => [18, "\xcem"], "\xd4" => [77, "\xcen"], "\xd5" => [18, "\xcen"], "\xd6" => [77, "\xcep"], "\xd7" => [18, "\xcep"], "\xd8" => [77, "\xcer"], "\xd9" => [18, "\xcer"], "\xda" => [77, "\xceu"], "\xdb" => [18, "\xceu"], "\xdc" => [0, "\xce:"], "\xdd" => [0, "\xceB"], "\xde" => [0, "\xceC"], "\xdf" => [0, "\xceD"], "\xe0" => [0, "\xceE"], "\xe1" => [0, "\xceF"], "\xe2" => [0, "\xceG"], "\xe3" => [0, "\xceH"], "\xe4" => [0, "\xceI"], "\xe5" => [0, "\xceJ"], "\xe6" => [0, "\xceK"], "\xe7" => [0, "\xceL"], "\xe8" => [0, "\xceM"], "\xe9" => [0, "\xceN"], "\xea" => [0, "\xceO"], "\xeb" => [0, "\xceP"], "\xec" => [0, "\xceQ"], "\xed" => [0, "\xceR"], "\xee" => [0, "\xceS"], "\xef" => [0, "\xceT"], "\xf0" => [0, "\xceU"], "\xf1" => [0, "\xceV"], "\xf2" => [0, "\xceW"], "\xf3" => [0, "\xceY"], "\xf4" => [0, "\xcej"], "\xf5" => [0, "\xcek"], "\xf6" => [0, "\xceq"], "\xf7" => [0, "\xcev"], "\xf8" => [0, "\xcew"], "\xf9" => [0, "\xcex"], "\xfa" => [0, "\xcey"], "\xfb" => [0, "\xcez"], "\xfc" => [82, "\xce"], "\xfd" => [87, "\xce"], "\xfe" => [130, "\xce"], "\xff" => [9, "\xce"]], ["\x00" => [77, "\xab0"], "\x01" => [18, "\xab0"], "\x02" => [77, "\xab1"], "\x03" => [18, "\xab1"], "\x04" => [77, "\xab2"], "\x05" => [18, "\xab2"], "\x06" => [77, "\xaba"], "\x07" => [18, "\xaba"], "\x08" => [77, "\xabc"], "\t" => [18, "\xabc"], "\n" => [77, "\xabe"], "\v" => [18, "\xabe"], "\f" => [77, "\xabi"], "\r" => [18, "\xabi"], "\x0e" => [77, "\xabo"], "\x0f" => [18, "\xabo"], "\x10" => [77, "\xabs"], "\x11" => [18, "\xabs"], "\x12" => [77, "\xabt"], "\x13" => [18, "\xabt"], "\x14" => [0, "\xab "], "\x15" => [0, "\xab%"], "\x16" => [0, "\xab-"], "\x17" => [0, "\xab."], "\x18" => [0, "\xab/"], "\x19" => [0, "\xab3"], "\x1a" => [0, "\xab4"], "\x1b" => [0, "\xab5"], "\x1c" => [0, "\xab6"], "\x1d" => [0, "\xab7"], "\x1e" => [0, "\xab8"], "\x1f" => [0, "\xab9"], " " => [0, "\xab="], "!" => [0, "\xabA"], "\"" => [0, "\xab_"], "#" => [0, "\xabb"], "\$" => [0, "\xabd"], "%" => [0, "\xabf"], "&" => [0, "\xabg"], "'" => [0, "\xabh"], "(" => [0, "\xabl"], ")" => [0, "\xabm"], "*" => [0, "\xabn"], "+" => [0, "\xabp"], "," => [0, "\xabr"], "-" => [0, "\xabu"], "." => [100, "\xab"], "/" => [110, "\xab"], [111, "\xab"], [115, "\xab"], [116, "\xab"], [118, "\xab"], [119, "\xab"], [122, "\xab"], [123, "\xab"], [125, "\xab"], [126, "\xab"], [129, "\xab"], ":" => [143, "\xab"], ";" => [148, "\xab"], "<" => [151, "\xab"], "=" => [153, "\xab"], ">" => [83, "\xab"], "?" => [10, "\xab"], "@" => [77, "\xce0"], "A" => [18, "\xce0"], "B" => [77, "\xce1"], "C" => [18, "\xce1"], "D" => [77, "\xce2"], "E" => [18, "\xce2"], "F" => [77, "\xcea"], "G" => [18, "\xcea"], "H" => [77, "\xcec"], "I" => [18, "\xcec"], "J" => [77, "\xcee"], "K" => [18, "\xcee"], "L" => [77, "\xcei"], "M" => [18, "\xcei"], "N" => [77, "\xceo"], "O" => [18, "\xceo"], "P" => [77, "\xces"], "Q" => [18, "\xces"], "R" => [77, "\xcet"], "S" => [18, "\xcet"], "T" => [0, "\xce "], "U" => [0, "\xce%"], "V" => [0, "\xce-"], "W" => [0, "\xce."], "X" => [0, "\xce/"], "Y" => [0, "\xce3"], "Z" => [0, "\xce4"], "[" => [0, "\xce5"], "\\" => [0, "\xce6"], "]" => [0, "\xce7"], "^" => [0, "\xce8"], "_" => [0, "\xce9"], "`" => [0, "\xce="], "a" => [0, "\xceA"], "b" => [0, "\xce_"], "c" => [0, "\xceb"], "d" => [0, "\xced"], "e" => [0, "\xcef"], "f" => [0, "\xceg"], "g" => [0, "\xceh"], "h" => [0, "\xcel"], "i" => [0, "\xcem"], "j" => [0, "\xcen"], "k" => [0, "\xcep"], "l" => [0, "\xcer"], "m" => [0, "\xceu"], "n" => [100, "\xce"], "o" => [110, "\xce"], "p" => [111, "\xce"], "q" => [115, "\xce"], "r" => [116, "\xce"], "s" => [118, "\xce"], "t" => [119, "\xce"], "u" => [122, "\xce"], "v" => [123, "\xce"], "w" => [125, "\xce"], "x" => [126, "\xce"], "y" => [129, "\xce"], "z" => [143, "\xce"], "{" => [148, "\xce"], "|" => [151, "\xce"], "}" => [153, "\xce"], "~" => [83, "\xce"], "" => [10, "\xce"], "\x80" => [77, "\xd70"], "\x81" => [18, "\xd70"], "\x82" => [77, "\xd71"], "\x83" => [18, "\xd71"], "\x84" => [77, "\xd72"], "\x85" => [18, "\xd72"], "\x86" => [77, "\xd7a"], "\x87" => [18, "\xd7a"], "\x88" => [77, "\xd7c"], "\x89" => [18, "\xd7c"], "\x8a" => [77, "\xd7e"], "\x8b" => [18, "\xd7e"], "\x8c" => [77, "\xd7i"], "\x8d" => [18, "\xd7i"], "\x8e" => [77, "\xd7o"], "\x8f" => [18, "\xd7o"], "\x90" => [77, "\xd7s"], "\x91" => [18, "\xd7s"], "\x92" => [77, "\xd7t"], "\x93" => [18, "\xd7t"], "\x94" => [0, "\xd7 "], "\x95" => [0, "\xd7%"], "\x96" => [0, "\xd7-"], "\x97" => [0, "\xd7."], "\x98" => [0, "\xd7/"], "\x99" => [0, "\xd73"], "\x9a" => [0, "\xd74"], "\x9b" => [0, "\xd75"], "\x9c" => [0, "\xd76"], "\x9d" => [0, "\xd77"], "\x9e" => [0, "\xd78"], "\x9f" => [0, "\xd79"], "\xa0" => [0, "\xd7="], "\xa1" => [0, "\xd7A"], "\xa2" => [0, "\xd7_"], "\xa3" => [0, "\xd7b"], "\xa4" => [0, "\xd7d"], "\xa5" => [0, "\xd7f"], "\xa6" => [0, "\xd7g"], "\xa7" => [0, "\xd7h"], "\xa8" => [0, "\xd7l"], "\xa9" => [0, "\xd7m"], "\xaa" => [0, "\xd7n"], "\xab" => [0, "\xd7p"], "\xac" => [0, "\xd7r"], "\xad" => [0, "\xd7u"], "\xae" => [100, "\xd7"], "\xaf" => [110, "\xd7"], "\xb0" => [111, "\xd7"], "\xb1" => [115, "\xd7"], "\xb2" => [116, "\xd7"], "\xb3" => [118, "\xd7"], "\xb4" => [119, "\xd7"], "\xb5" => [122, "\xd7"], "\xb6" => [123, "\xd7"], "\xb7" => [125, "\xd7"], "\xb8" => [126, "\xd7"], "\xb9" => [129, "\xd7"], "\xba" => [143, "\xd7"], "\xbb" => [148, "\xd7"], "\xbc" => [151, "\xd7"], "\xbd" => [153, "\xd7"], "\xbe" => [83, "\xd7"], "\xbf" => [10, "\xd7"], "\xc0" => [77, "\xe10"], "\xc1" => [18, "\xe10"], "\xc2" => [77, "\xe11"], "\xc3" => [18, "\xe11"], "\xc4" => [77, "\xe12"], "\xc5" => [18, "\xe12"], "\xc6" => [77, "\xe1a"], "\xc7" => [18, "\xe1a"], "\xc8" => [77, "\xe1c"], "\xc9" => [18, "\xe1c"], "\xca" => [77, "\xe1e"], "\xcb" => [18, "\xe1e"], "\xcc" => [77, "\xe1i"], "\xcd" => [18, "\xe1i"], "\xce" => [77, "\xe1o"], "\xcf" => [18, "\xe1o"], "\xd0" => [77, "\xe1s"], "\xd1" => [18, "\xe1s"], "\xd2" => [77, "\xe1t"], "\xd3" => [18, "\xe1t"], "\xd4" => [0, "\xe1 "], "\xd5" => [0, "\xe1%"], "\xd6" => [0, "\xe1-"], "\xd7" => [0, "\xe1."], "\xd8" => [0, "\xe1/"], "\xd9" => [0, "\xe13"], "\xda" => [0, "\xe14"], "\xdb" => [0, "\xe15"], "\xdc" => [0, "\xe16"], "\xdd" => [0, "\xe17"], "\xde" => [0, "\xe18"], "\xdf" => [0, "\xe19"], "\xe0" => [0, "\xe1="], "\xe1" => [0, "\xe1A"], "\xe2" => [0, "\xe1_"], "\xe3" => [0, "\xe1b"], "\xe4" => [0, "\xe1d"], "\xe5" => [0, "\xe1f"], "\xe6" => [0, "\xe1g"], "\xe7" => [0, "\xe1h"], "\xe8" => [0, "\xe1l"], "\xe9" => [0, "\xe1m"], "\xea" => [0, "\xe1n"], "\xeb" => [0, "\xe1p"], "\xec" => [0, "\xe1r"], "\xed" => [0, "\xe1u"], "\xee" => [100, "\xe1"], "\xef" => [110, "\xe1"], "\xf0" => [111, "\xe1"], "\xf1" => [115, "\xe1"], "\xf2" => [116, "\xe1"], "\xf3" => [118, "\xe1"], "\xf4" => [119, "\xe1"], "\xf5" => [122, "\xe1"], "\xf6" => [123, "\xe1"], "\xf7" => [125, "\xe1"], "\xf8" => [126, "\xe1"], "\xf9" => [129, "\xe1"], "\xfa" => [143, "\xe1"], "\xfb" => [148, "\xe1"], "\xfc" => [151, "\xe1"], "\xfd" => [153, "\xe1"], "\xfe" => [83, "\xe1"], "\xff" => [10, "\xe1"]], ["\x00" => [0, "\xab0"], "\x01" => [0, "\xab1"], "\x02" => [0, "\xab2"], "\x03" => [0, "\xaba"], "\x04" => [0, "\xabc"], "\x05" => [0, "\xabe"], "\x06" => [0, "\xabi"], "\x07" => [0, "\xabo"], "\x08" => [0, "\xabs"], "\t" => [0, "\xabt"], "\n" => [73, "\xab"], "\v" => [88, "\xab"], "\f" => [89, "\xab"], "\r" => [96, "\xab"], "\x0e" => [97, "\xab"], "\x0f" => [99, "\xab"], "\x10" => [106, "\xab"], "\x11" => [136, "\xab"], "\x12" => [139, "\xab"], "\x13" => [141, "\xab"], "\x14" => [145, "\xab"], "\x15" => [147, "\xab"], "\x16" => [149, "\xab"], "\x17" => [101, "\xab"], "\x18" => [112, "\xab"], "\x19" => [117, "\xab"], "\x1a" => [120, "\xab"], "\x1b" => [124, "\xab"], "\x1c" => [127, "\xab"], "\x1d" => [144, "\xab"], "\x1e" => [152, "\xab"], "\x1f" => [11, "\xab"], " " => [0, "\xce0"], "!" => [0, "\xce1"], "\"" => [0, "\xce2"], "#" => [0, "\xcea"], "\$" => [0, "\xcec"], "%" => [0, "\xcee"], "&" => [0, "\xcei"], "'" => [0, "\xceo"], "(" => [0, "\xces"], ")" => [0, "\xcet"], "*" => [73, "\xce"], "+" => [88, "\xce"], "," => [89, "\xce"], "-" => [96, "\xce"], "." => [97, "\xce"], "/" => [99, "\xce"], [106, "\xce"], [136, "\xce"], [139, "\xce"], [141, "\xce"], [145, "\xce"], [147, "\xce"], [149, "\xce"], [101, "\xce"], [112, "\xce"], [117, "\xce"], ":" => [120, "\xce"], ";" => [124, "\xce"], "<" => [127, "\xce"], "=" => [144, "\xce"], ">" => [152, "\xce"], "?" => [11, "\xce"], "@" => [0, "\xd70"], "A" => [0, "\xd71"], "B" => [0, "\xd72"], "C" => [0, "\xd7a"], "D" => [0, "\xd7c"], "E" => [0, "\xd7e"], "F" => [0, "\xd7i"], "G" => [0, "\xd7o"], "H" => [0, "\xd7s"], "I" => [0, "\xd7t"], "J" => [73, "\xd7"], "K" => [88, "\xd7"], "L" => [89, "\xd7"], "M" => [96, "\xd7"], "N" => [97, "\xd7"], "O" => [99, "\xd7"], "P" => [106, "\xd7"], "Q" => [136, "\xd7"], "R" => [139, "\xd7"], "S" => [141, "\xd7"], "T" => [145, "\xd7"], "U" => [147, "\xd7"], "V" => [149, "\xd7"], "W" => [101, "\xd7"], "X" => [112, "\xd7"], "Y" => [117, "\xd7"], "Z" => [120, "\xd7"], "[" => [124, "\xd7"], "\\" => [127, "\xd7"], "]" => [144, "\xd7"], "^" => [152, "\xd7"], "_" => [11, "\xd7"], "`" => [0, "\xe10"], "a" => [0, "\xe11"], "b" => [0, "\xe12"], "c" => [0, "\xe1a"], "d" => [0, "\xe1c"], "e" => [0, "\xe1e"], "f" => [0, "\xe1i"], "g" => [0, "\xe1o"], "h" => [0, "\xe1s"], "i" => [0, "\xe1t"], "j" => [73, "\xe1"], "k" => [88, "\xe1"], "l" => [89, "\xe1"], "m" => [96, "\xe1"], "n" => [97, "\xe1"], "o" => [99, "\xe1"], "p" => [106, "\xe1"], "q" => [136, "\xe1"], "r" => [139, "\xe1"], "s" => [141, "\xe1"], "t" => [145, "\xe1"], "u" => [147, "\xe1"], "v" => [149, "\xe1"], "w" => [101, "\xe1"], "x" => [112, "\xe1"], "y" => [117, "\xe1"], "z" => [120, "\xe1"], "{" => [124, "\xe1"], "|" => [127, "\xe1"], "}" => [144, "\xe1"], "~" => [152, "\xe1"], "" => [11, "\xe1"], "\x80" => [0, "\xec0"], "\x81" => [0, "\xec1"], "\x82" => [0, "\xec2"], "\x83" => [0, "\xeca"], "\x84" => [0, "\xecc"], "\x85" => [0, "\xece"], "\x86" => [0, "\xeci"], "\x87" => [0, "\xeco"], "\x88" => [0, "\xecs"], "\x89" => [0, "\xect"], "\x8a" => [73, "\xec"], "\x8b" => [88, "\xec"], "\x8c" => [89, "\xec"], "\x8d" => [96, "\xec"], "\x8e" => [97, "\xec"], "\x8f" => [99, "\xec"], "\x90" => [106, "\xec"], "\x91" => [136, "\xec"], "\x92" => [139, "\xec"], "\x93" => [141, "\xec"], "\x94" => [145, "\xec"], "\x95" => [147, "\xec"], "\x96" => [149, "\xec"], "\x97" => [101, "\xec"], "\x98" => [112, "\xec"], "\x99" => [117, "\xec"], "\x9a" => [120, "\xec"], "\x9b" => [124, "\xec"], "\x9c" => [127, "\xec"], "\x9d" => [144, "\xec"], "\x9e" => [152, "\xec"], "\x9f" => [11, "\xec"], "\xa0" => [0, "\xed0"], "\xa1" => [0, "\xed1"], "\xa2" => [0, "\xed2"], "\xa3" => [0, "\xeda"], "\xa4" => [0, "\xedc"], "\xa5" => [0, "\xede"], "\xa6" => [0, "\xedi"], "\xa7" => [0, "\xedo"], "\xa8" => [0, "\xeds"], "\xa9" => [0, "\xedt"], "\xaa" => [73, "\xed"], "\xab" => [88, "\xed"], "\xac" => [89, "\xed"], "\xad" => [96, "\xed"], "\xae" => [97, "\xed"], "\xaf" => [99, "\xed"], "\xb0" => [106, "\xed"], "\xb1" => [136, "\xed"], "\xb2" => [139, "\xed"], "\xb3" => [141, "\xed"], "\xb4" => [145, "\xed"], "\xb5" => [147, "\xed"], "\xb6" => [149, "\xed"], "\xb7" => [101, "\xed"], "\xb8" => [112, "\xed"], "\xb9" => [117, "\xed"], "\xba" => [120, "\xed"], "\xbb" => [124, "\xed"], "\xbc" => [127, "\xed"], "\xbd" => [144, "\xed"], "\xbe" => [152, "\xed"], "\xbf" => [11, "\xed"], "\xc0" => [92, "\xc7"], "\xc1" => [95, "\xc7"], "\xc2" => [137, "\xc7"], "\xc3" => [142, "\xc7"], "\xc4" => [150, "\xc7"], "\xc5" => [74, "\xc7"], "\xc6" => [90, "\xc7"], "\xc7" => [98, "\xc7"], "\xc8" => [107, "\xc7"], "\xc9" => [140, "\xc7"], "\xca" => [146, "\xc7"], "\xcb" => [102, "\xc7"], "\xcc" => [113, "\xc7"], "\xcd" => [121, "\xc7"], "\xce" => [128, "\xc7"], "\xcf" => [12, "\xc7"], "\xd0" => [92, "\xcf"], "\xd1" => [95, "\xcf"], "\xd2" => [137, "\xcf"], "\xd3" => [142, "\xcf"], "\xd4" => [150, "\xcf"], "\xd5" => [74, "\xcf"], "\xd6" => [90, "\xcf"], "\xd7" => [98, "\xcf"], "\xd8" => [107, "\xcf"], "\xd9" => [140, "\xcf"], "\xda" => [146, "\xcf"], "\xdb" => [102, "\xcf"], "\xdc" => [113, "\xcf"], "\xdd" => [121, "\xcf"], "\xde" => [128, "\xcf"], "\xdf" => [12, "\xcf"], "\xe0" => [92, "\xea"], "\xe1" => [95, "\xea"], "\xe2" => [137, "\xea"], "\xe3" => [142, "\xea"], "\xe4" => [150, "\xea"], "\xe5" => [74, "\xea"], "\xe6" => [90, "\xea"], "\xe7" => [98, "\xea"], "\xe8" => [107, "\xea"], "\xe9" => [140, "\xea"], "\xea" => [146, "\xea"], "\xeb" => [102, "\xea"], "\xec" => [113, "\xea"], "\xed" => [121, "\xea"], "\xee" => [128, "\xea"], "\xef" => [12, "\xea"], "\xf0" => [92, "\xeb"], "\xf1" => [95, "\xeb"], "\xf2" => [137, "\xeb"], "\xf3" => [142, "\xeb"], "\xf4" => [150, "\xeb"], "\xf5" => [74, "\xeb"], "\xf6" => [90, "\xeb"], "\xf7" => [98, "\xeb"], "\xf8" => [107, "\xeb"], "\xf9" => [140, "\xeb"], "\xfa" => [146, "\xeb"], "\xfb" => [102, "\xeb"], "\xfc" => [113, "\xeb"], "\xfd" => [121, "\xeb"], "\xfe" => [128, "\xeb"], "\xff" => [12, "\xeb"]], ["\x00" => [94, "\xaf0"], "\x01" => [76, "\xaf0"], "\x02" => [104, "\xaf0"], "\x03" => [16, "\xaf0"], "\x04" => [94, "\xaf1"], "\x05" => [76, "\xaf1"], "\x06" => [104, "\xaf1"], "\x07" => [16, "\xaf1"], "\x08" => [94, "\xaf2"], "\t" => [76, "\xaf2"], "\n" => [104, "\xaf2"], "\v" => [16, "\xaf2"], "\f" => [94, "\xafa"], "\r" => [76, "\xafa"], "\x0e" => [104, "\xafa"], "\x0f" => [16, "\xafa"], "\x10" => [94, "\xafc"], "\x11" => [76, "\xafc"], "\x12" => [104, "\xafc"], "\x13" => [16, "\xafc"], "\x14" => [94, "\xafe"], "\x15" => [76, "\xafe"], "\x16" => [104, "\xafe"], "\x17" => [16, "\xafe"], "\x18" => [94, "\xafi"], "\x19" => [76, "\xafi"], "\x1a" => [104, "\xafi"], "\x1b" => [16, "\xafi"], "\x1c" => [94, "\xafo"], "\x1d" => [76, "\xafo"], "\x1e" => [104, "\xafo"], "\x1f" => [16, "\xafo"], " " => [94, "\xafs"], "!" => [76, "\xafs"], "\"" => [104, "\xafs"], "#" => [16, "\xafs"], "\$" => [94, "\xaft"], "%" => [76, "\xaft"], "&" => [104, "\xaft"], "'" => [16, "\xaft"], "(" => [77, "\xaf "], ")" => [18, "\xaf "], "*" => [77, "\xaf%"], "+" => [18, "\xaf%"], "," => [77, "\xaf-"], "-" => [18, "\xaf-"], "." => [77, "\xaf."], "/" => [18, "\xaf."], [77, "\xaf/"], [18, "\xaf/"], [77, "\xaf3"], [18, "\xaf3"], [77, "\xaf4"], [18, "\xaf4"], [77, "\xaf5"], [18, "\xaf5"], [77, "\xaf6"], [18, "\xaf6"], ":" => [77, "\xaf7"], ";" => [18, "\xaf7"], "<" => [77, "\xaf8"], "=" => [18, "\xaf8"], ">" => [77, "\xaf9"], "?" => [18, "\xaf9"], "@" => [77, "\xaf="], "A" => [18, "\xaf="], "B" => [77, "\xafA"], "C" => [18, "\xafA"], "D" => [77, "\xaf_"], "E" => [18, "\xaf_"], "F" => [77, "\xafb"], "G" => [18, "\xafb"], "H" => [77, "\xafd"], "I" => [18, "\xafd"], "J" => [77, "\xaff"], "K" => [18, "\xaff"], "L" => [77, "\xafg"], "M" => [18, "\xafg"], "N" => [77, "\xafh"], "O" => [18, "\xafh"], "P" => [77, "\xafl"], "Q" => [18, "\xafl"], "R" => [77, "\xafm"], "S" => [18, "\xafm"], "T" => [77, "\xafn"], "U" => [18, "\xafn"], "V" => [77, "\xafp"], "W" => [18, "\xafp"], "X" => [77, "\xafr"], "Y" => [18, "\xafr"], "Z" => [77, "\xafu"], "[" => [18, "\xafu"], "\\" => [0, "\xaf:"], "]" => [0, "\xafB"], "^" => [0, "\xafC"], "_" => [0, "\xafD"], "`" => [0, "\xafE"], "a" => [0, "\xafF"], "b" => [0, "\xafG"], "c" => [0, "\xafH"], "d" => [0, "\xafI"], "e" => [0, "\xafJ"], "f" => [0, "\xafK"], "g" => [0, "\xafL"], "h" => [0, "\xafM"], "i" => [0, "\xafN"], "j" => [0, "\xafO"], "k" => [0, "\xafP"], "l" => [0, "\xafQ"], "m" => [0, "\xafR"], "n" => [0, "\xafS"], "o" => [0, "\xafT"], "p" => [0, "\xafU"], "q" => [0, "\xafV"], "r" => [0, "\xafW"], "s" => [0, "\xafY"], "t" => [0, "\xafj"], "u" => [0, "\xafk"], "v" => [0, "\xafq"], "w" => [0, "\xafv"], "x" => [0, "\xafw"], "y" => [0, "\xafx"], "z" => [0, "\xafy"], "{" => [0, "\xafz"], "|" => [82, "\xaf"], "}" => [87, "\xaf"], "~" => [130, "\xaf"], "" => [9, "\xaf"], "\x80" => [94, "\xb40"], "\x81" => [76, "\xb40"], "\x82" => [104, "\xb40"], "\x83" => [16, "\xb40"], "\x84" => [94, "\xb41"], "\x85" => [76, "\xb41"], "\x86" => [104, "\xb41"], "\x87" => [16, "\xb41"], "\x88" => [94, "\xb42"], "\x89" => [76, "\xb42"], "\x8a" => [104, "\xb42"], "\x8b" => [16, "\xb42"], "\x8c" => [94, "\xb4a"], "\x8d" => [76, "\xb4a"], "\x8e" => [104, "\xb4a"], "\x8f" => [16, "\xb4a"], "\x90" => [94, "\xb4c"], "\x91" => [76, "\xb4c"], "\x92" => [104, "\xb4c"], "\x93" => [16, "\xb4c"], "\x94" => [94, "\xb4e"], "\x95" => [76, "\xb4e"], "\x96" => [104, "\xb4e"], "\x97" => [16, "\xb4e"], "\x98" => [94, "\xb4i"], "\x99" => [76, "\xb4i"], "\x9a" => [104, "\xb4i"], "\x9b" => [16, "\xb4i"], "\x9c" => [94, "\xb4o"], "\x9d" => [76, "\xb4o"], "\x9e" => [104, "\xb4o"], "\x9f" => [16, "\xb4o"], "\xa0" => [94, "\xb4s"], "\xa1" => [76, "\xb4s"], "\xa2" => [104, "\xb4s"], "\xa3" => [16, "\xb4s"], "\xa4" => [94, "\xb4t"], "\xa5" => [76, "\xb4t"], "\xa6" => [104, "\xb4t"], "\xa7" => [16, "\xb4t"], "\xa8" => [77, "\xb4 "], "\xa9" => [18, "\xb4 "], "\xaa" => [77, "\xb4%"], "\xab" => [18, "\xb4%"], "\xac" => [77, "\xb4-"], "\xad" => [18, "\xb4-"], "\xae" => [77, "\xb4."], "\xaf" => [18, "\xb4."], "\xb0" => [77, "\xb4/"], "\xb1" => [18, "\xb4/"], "\xb2" => [77, "\xb43"], "\xb3" => [18, "\xb43"], "\xb4" => [77, "\xb44"], "\xb5" => [18, "\xb44"], "\xb6" => [77, "\xb45"], "\xb7" => [18, "\xb45"], "\xb8" => [77, "\xb46"], "\xb9" => [18, "\xb46"], "\xba" => [77, "\xb47"], "\xbb" => [18, "\xb47"], "\xbc" => [77, "\xb48"], "\xbd" => [18, "\xb48"], "\xbe" => [77, "\xb49"], "\xbf" => [18, "\xb49"], "\xc0" => [77, "\xb4="], "\xc1" => [18, "\xb4="], "\xc2" => [77, "\xb4A"], "\xc3" => [18, "\xb4A"], "\xc4" => [77, "\xb4_"], "\xc5" => [18, "\xb4_"], "\xc6" => [77, "\xb4b"], "\xc7" => [18, "\xb4b"], "\xc8" => [77, "\xb4d"], "\xc9" => [18, "\xb4d"], "\xca" => [77, "\xb4f"], "\xcb" => [18, "\xb4f"], "\xcc" => [77, "\xb4g"], "\xcd" => [18, "\xb4g"], "\xce" => [77, "\xb4h"], "\xcf" => [18, "\xb4h"], "\xd0" => [77, "\xb4l"], "\xd1" => [18, "\xb4l"], "\xd2" => [77, "\xb4m"], "\xd3" => [18, "\xb4m"], "\xd4" => [77, "\xb4n"], "\xd5" => [18, "\xb4n"], "\xd6" => [77, "\xb4p"], "\xd7" => [18, "\xb4p"], "\xd8" => [77, "\xb4r"], "\xd9" => [18, "\xb4r"], "\xda" => [77, "\xb4u"], "\xdb" => [18, "\xb4u"], "\xdc" => [0, "\xb4:"], "\xdd" => [0, "\xb4B"], "\xde" => [0, "\xb4C"], "\xdf" => [0, "\xb4D"], "\xe0" => [0, "\xb4E"], "\xe1" => [0, "\xb4F"], "\xe2" => [0, "\xb4G"], "\xe3" => [0, "\xb4H"], "\xe4" => [0, "\xb4I"], "\xe5" => [0, "\xb4J"], "\xe6" => [0, "\xb4K"], "\xe7" => [0, "\xb4L"], "\xe8" => [0, "\xb4M"], "\xe9" => [0, "\xb4N"], "\xea" => [0, "\xb4O"], "\xeb" => [0, "\xb4P"], "\xec" => [0, "\xb4Q"], "\xed" => [0, "\xb4R"], "\xee" => [0, "\xb4S"], "\xef" => [0, "\xb4T"], "\xf0" => [0, "\xb4U"], "\xf1" => [0, "\xb4V"], "\xf2" => [0, "\xb4W"], "\xf3" => [0, "\xb4Y"], "\xf4" => [0, "\xb4j"], "\xf5" => [0, "\xb4k"], "\xf6" => [0, "\xb4q"], "\xf7" => [0, "\xb4v"], "\xf8" => [0, "\xb4w"], "\xf9" => [0, "\xb4x"], "\xfa" => [0, "\xb4y"], "\xfb" => [0, "\xb4z"], "\xfc" => [82, "\xb4"], "\xfd" => [87, "\xb4"], "\xfe" => [130, "\xb4"], "\xff" => [9, "\xb4"]], ["\x00" => [77, "\xaf0"], "\x01" => [18, "\xaf0"], "\x02" => [77, "\xaf1"], "\x03" => [18, "\xaf1"], "\x04" => [77, "\xaf2"], "\x05" => [18, "\xaf2"], "\x06" => [77, "\xafa"], "\x07" => [18, "\xafa"], "\x08" => [77, "\xafc"], "\t" => [18, "\xafc"], "\n" => [77, "\xafe"], "\v" => [18, "\xafe"], "\f" => [77, "\xafi"], "\r" => [18, "\xafi"], "\x0e" => [77, "\xafo"], "\x0f" => [18, "\xafo"], "\x10" => [77, "\xafs"], "\x11" => [18, "\xafs"], "\x12" => [77, "\xaft"], "\x13" => [18, "\xaft"], "\x14" => [0, "\xaf "], "\x15" => [0, "\xaf%"], "\x16" => [0, "\xaf-"], "\x17" => [0, "\xaf."], "\x18" => [0, "\xaf/"], "\x19" => [0, "\xaf3"], "\x1a" => [0, "\xaf4"], "\x1b" => [0, "\xaf5"], "\x1c" => [0, "\xaf6"], "\x1d" => [0, "\xaf7"], "\x1e" => [0, "\xaf8"], "\x1f" => [0, "\xaf9"], " " => [0, "\xaf="], "!" => [0, "\xafA"], "\"" => [0, "\xaf_"], "#" => [0, "\xafb"], "\$" => [0, "\xafd"], "%" => [0, "\xaff"], "&" => [0, "\xafg"], "'" => [0, "\xafh"], "(" => [0, "\xafl"], ")" => [0, "\xafm"], "*" => [0, "\xafn"], "+" => [0, "\xafp"], "," => [0, "\xafr"], "-" => [0, "\xafu"], "." => [100, "\xaf"], "/" => [110, "\xaf"], [111, "\xaf"], [115, "\xaf"], [116, "\xaf"], [118, "\xaf"], [119, "\xaf"], [122, "\xaf"], [123, "\xaf"], [125, "\xaf"], [126, "\xaf"], [129, "\xaf"], ":" => [143, "\xaf"], ";" => [148, "\xaf"], "<" => [151, "\xaf"], "=" => [153, "\xaf"], ">" => [83, "\xaf"], "?" => [10, "\xaf"], "@" => [77, "\xb40"], "A" => [18, "\xb40"], "B" => [77, "\xb41"], "C" => [18, "\xb41"], "D" => [77, "\xb42"], "E" => [18, "\xb42"], "F" => [77, "\xb4a"], "G" => [18, "\xb4a"], "H" => [77, "\xb4c"], "I" => [18, "\xb4c"], "J" => [77, "\xb4e"], "K" => [18, "\xb4e"], "L" => [77, "\xb4i"], "M" => [18, "\xb4i"], "N" => [77, "\xb4o"], "O" => [18, "\xb4o"], "P" => [77, "\xb4s"], "Q" => [18, "\xb4s"], "R" => [77, "\xb4t"], "S" => [18, "\xb4t"], "T" => [0, "\xb4 "], "U" => [0, "\xb4%"], "V" => [0, "\xb4-"], "W" => [0, "\xb4."], "X" => [0, "\xb4/"], "Y" => [0, "\xb43"], "Z" => [0, "\xb44"], "[" => [0, "\xb45"], "\\" => [0, "\xb46"], "]" => [0, "\xb47"], "^" => [0, "\xb48"], "_" => [0, "\xb49"], "`" => [0, "\xb4="], "a" => [0, "\xb4A"], "b" => [0, "\xb4_"], "c" => [0, "\xb4b"], "d" => [0, "\xb4d"], "e" => [0, "\xb4f"], "f" => [0, "\xb4g"], "g" => [0, "\xb4h"], "h" => [0, "\xb4l"], "i" => [0, "\xb4m"], "j" => [0, "\xb4n"], "k" => [0, "\xb4p"], "l" => [0, "\xb4r"], "m" => [0, "\xb4u"], "n" => [100, "\xb4"], "o" => [110, "\xb4"], "p" => [111, "\xb4"], "q" => [115, "\xb4"], "r" => [116, "\xb4"], "s" => [118, "\xb4"], "t" => [119, "\xb4"], "u" => [122, "\xb4"], "v" => [123, "\xb4"], "w" => [125, "\xb4"], "x" => [126, "\xb4"], "y" => [129, "\xb4"], "z" => [143, "\xb4"], "{" => [148, "\xb4"], "|" => [151, "\xb4"], "}" => [153, "\xb4"], "~" => [83, "\xb4"], "" => [10, "\xb4"], "\x80" => [77, "\xb60"], "\x81" => [18, "\xb60"], "\x82" => [77, "\xb61"], "\x83" => [18, "\xb61"], "\x84" => [77, "\xb62"], "\x85" => [18, "\xb62"], "\x86" => [77, "\xb6a"], "\x87" => [18, "\xb6a"], "\x88" => [77, "\xb6c"], "\x89" => [18, "\xb6c"], "\x8a" => [77, "\xb6e"], "\x8b" => [18, "\xb6e"], "\x8c" => [77, "\xb6i"], "\x8d" => [18, "\xb6i"], "\x8e" => [77, "\xb6o"], "\x8f" => [18, "\xb6o"], "\x90" => [77, "\xb6s"], "\x91" => [18, "\xb6s"], "\x92" => [77, "\xb6t"], "\x93" => [18, "\xb6t"], "\x94" => [0, "\xb6 "], "\x95" => [0, "\xb6%"], "\x96" => [0, "\xb6-"], "\x97" => [0, "\xb6."], "\x98" => [0, "\xb6/"], "\x99" => [0, "\xb63"], "\x9a" => [0, "\xb64"], "\x9b" => [0, "\xb65"], "\x9c" => [0, "\xb66"], "\x9d" => [0, "\xb67"], "\x9e" => [0, "\xb68"], "\x9f" => [0, "\xb69"], "\xa0" => [0, "\xb6="], "\xa1" => [0, "\xb6A"], "\xa2" => [0, "\xb6_"], "\xa3" => [0, "\xb6b"], "\xa4" => [0, "\xb6d"], "\xa5" => [0, "\xb6f"], "\xa6" => [0, "\xb6g"], "\xa7" => [0, "\xb6h"], "\xa8" => [0, "\xb6l"], "\xa9" => [0, "\xb6m"], "\xaa" => [0, "\xb6n"], "\xab" => [0, "\xb6p"], "\xac" => [0, "\xb6r"], "\xad" => [0, "\xb6u"], "\xae" => [100, "\xb6"], "\xaf" => [110, "\xb6"], "\xb0" => [111, "\xb6"], "\xb1" => [115, "\xb6"], "\xb2" => [116, "\xb6"], "\xb3" => [118, "\xb6"], "\xb4" => [119, "\xb6"], "\xb5" => [122, "\xb6"], "\xb6" => [123, "\xb6"], "\xb7" => [125, "\xb6"], "\xb8" => [126, "\xb6"], "\xb9" => [129, "\xb6"], "\xba" => [143, "\xb6"], "\xbb" => [148, "\xb6"], "\xbc" => [151, "\xb6"], "\xbd" => [153, "\xb6"], "\xbe" => [83, "\xb6"], "\xbf" => [10, "\xb6"], "\xc0" => [77, "\xb70"], "\xc1" => [18, "\xb70"], "\xc2" => [77, "\xb71"], "\xc3" => [18, "\xb71"], "\xc4" => [77, "\xb72"], "\xc5" => [18, "\xb72"], "\xc6" => [77, "\xb7a"], "\xc7" => [18, "\xb7a"], "\xc8" => [77, "\xb7c"], "\xc9" => [18, "\xb7c"], "\xca" => [77, "\xb7e"], "\xcb" => [18, "\xb7e"], "\xcc" => [77, "\xb7i"], "\xcd" => [18, "\xb7i"], "\xce" => [77, "\xb7o"], "\xcf" => [18, "\xb7o"], "\xd0" => [77, "\xb7s"], "\xd1" => [18, "\xb7s"], "\xd2" => [77, "\xb7t"], "\xd3" => [18, "\xb7t"], "\xd4" => [0, "\xb7 "], "\xd5" => [0, "\xb7%"], "\xd6" => [0, "\xb7-"], "\xd7" => [0, "\xb7."], "\xd8" => [0, "\xb7/"], "\xd9" => [0, "\xb73"], "\xda" => [0, "\xb74"], "\xdb" => [0, "\xb75"], "\xdc" => [0, "\xb76"], "\xdd" => [0, "\xb77"], "\xde" => [0, "\xb78"], "\xdf" => [0, "\xb79"], "\xe0" => [0, "\xb7="], "\xe1" => [0, "\xb7A"], "\xe2" => [0, "\xb7_"], "\xe3" => [0, "\xb7b"], "\xe4" => [0, "\xb7d"], "\xe5" => [0, "\xb7f"], "\xe6" => [0, "\xb7g"], "\xe7" => [0, "\xb7h"], "\xe8" => [0, "\xb7l"], "\xe9" => [0, "\xb7m"], "\xea" => [0, "\xb7n"], "\xeb" => [0, "\xb7p"], "\xec" => [0, "\xb7r"], "\xed" => [0, "\xb7u"], "\xee" => [100, "\xb7"], "\xef" => [110, "\xb7"], "\xf0" => [111, "\xb7"], "\xf1" => [115, "\xb7"], "\xf2" => [116, "\xb7"], "\xf3" => [118, "\xb7"], "\xf4" => [119, "\xb7"], "\xf5" => [122, "\xb7"], "\xf6" => [123, "\xb7"], "\xf7" => [125, "\xb7"], "\xf8" => [126, "\xb7"], "\xf9" => [129, "\xb7"], "\xfa" => [143, "\xb7"], "\xfb" => [148, "\xb7"], "\xfc" => [151, "\xb7"], "\xfd" => [153, "\xb7"], "\xfe" => [83, "\xb7"], "\xff" => [10, "\xb7"]], ["\x00" => [94, "\xb00"], "\x01" => [76, "\xb00"], "\x02" => [104, "\xb00"], "\x03" => [16, "\xb00"], "\x04" => [94, "\xb01"], "\x05" => [76, "\xb01"], "\x06" => [104, "\xb01"], "\x07" => [16, "\xb01"], "\x08" => [94, "\xb02"], "\t" => [76, "\xb02"], "\n" => [104, "\xb02"], "\v" => [16, "\xb02"], "\f" => [94, "\xb0a"], "\r" => [76, "\xb0a"], "\x0e" => [104, "\xb0a"], "\x0f" => [16, "\xb0a"], "\x10" => [94, "\xb0c"], "\x11" => [76, "\xb0c"], "\x12" => [104, "\xb0c"], "\x13" => [16, "\xb0c"], "\x14" => [94, "\xb0e"], "\x15" => [76, "\xb0e"], "\x16" => [104, "\xb0e"], "\x17" => [16, "\xb0e"], "\x18" => [94, "\xb0i"], "\x19" => [76, "\xb0i"], "\x1a" => [104, "\xb0i"], "\x1b" => [16, "\xb0i"], "\x1c" => [94, "\xb0o"], "\x1d" => [76, "\xb0o"], "\x1e" => [104, "\xb0o"], "\x1f" => [16, "\xb0o"], " " => [94, "\xb0s"], "!" => [76, "\xb0s"], "\"" => [104, "\xb0s"], "#" => [16, "\xb0s"], "\$" => [94, "\xb0t"], "%" => [76, "\xb0t"], "&" => [104, "\xb0t"], "'" => [16, "\xb0t"], "(" => [77, "\xb0 "], ")" => [18, "\xb0 "], "*" => [77, "\xb0%"], "+" => [18, "\xb0%"], "," => [77, "\xb0-"], "-" => [18, "\xb0-"], "." => [77, "\xb0."], "/" => [18, "\xb0."], [77, "\xb0/"], [18, "\xb0/"], [77, "\xb03"], [18, "\xb03"], [77, "\xb04"], [18, "\xb04"], [77, "\xb05"], [18, "\xb05"], [77, "\xb06"], [18, "\xb06"], ":" => [77, "\xb07"], ";" => [18, "\xb07"], "<" => [77, "\xb08"], "=" => [18, "\xb08"], ">" => [77, "\xb09"], "?" => [18, "\xb09"], "@" => [77, "\xb0="], "A" => [18, "\xb0="], "B" => [77, "\xb0A"], "C" => [18, "\xb0A"], "D" => [77, "\xb0_"], "E" => [18, "\xb0_"], "F" => [77, "\xb0b"], "G" => [18, "\xb0b"], "H" => [77, "\xb0d"], "I" => [18, "\xb0d"], "J" => [77, "\xb0f"], "K" => [18, "\xb0f"], "L" => [77, "\xb0g"], "M" => [18, "\xb0g"], "N" => [77, "\xb0h"], "O" => [18, "\xb0h"], "P" => [77, "\xb0l"], "Q" => [18, "\xb0l"], "R" => [77, "\xb0m"], "S" => [18, "\xb0m"], "T" => [77, "\xb0n"], "U" => [18, "\xb0n"], "V" => [77, "\xb0p"], "W" => [18, "\xb0p"], "X" => [77, "\xb0r"], "Y" => [18, "\xb0r"], "Z" => [77, "\xb0u"], "[" => [18, "\xb0u"], "\\" => [0, "\xb0:"], "]" => [0, "\xb0B"], "^" => [0, "\xb0C"], "_" => [0, "\xb0D"], "`" => [0, "\xb0E"], "a" => [0, "\xb0F"], "b" => [0, "\xb0G"], "c" => [0, "\xb0H"], "d" => [0, "\xb0I"], "e" => [0, "\xb0J"], "f" => [0, "\xb0K"], "g" => [0, "\xb0L"], "h" => [0, "\xb0M"], "i" => [0, "\xb0N"], "j" => [0, "\xb0O"], "k" => [0, "\xb0P"], "l" => [0, "\xb0Q"], "m" => [0, "\xb0R"], "n" => [0, "\xb0S"], "o" => [0, "\xb0T"], "p" => [0, "\xb0U"], "q" => [0, "\xb0V"], "r" => [0, "\xb0W"], "s" => [0, "\xb0Y"], "t" => [0, "\xb0j"], "u" => [0, "\xb0k"], "v" => [0, "\xb0q"], "w" => [0, "\xb0v"], "x" => [0, "\xb0w"], "y" => [0, "\xb0x"], "z" => [0, "\xb0y"], "{" => [0, "\xb0z"], "|" => [82, "\xb0"], "}" => [87, "\xb0"], "~" => [130, "\xb0"], "" => [9, "\xb0"], "\x80" => [94, "\xb10"], "\x81" => [76, "\xb10"], "\x82" => [104, "\xb10"], "\x83" => [16, "\xb10"], "\x84" => [94, "\xb11"], "\x85" => [76, "\xb11"], "\x86" => [104, "\xb11"], "\x87" => [16, "\xb11"], "\x88" => [94, "\xb12"], "\x89" => [76, "\xb12"], "\x8a" => [104, "\xb12"], "\x8b" => [16, "\xb12"], "\x8c" => [94, "\xb1a"], "\x8d" => [76, "\xb1a"], "\x8e" => [104, "\xb1a"], "\x8f" => [16, "\xb1a"], "\x90" => [94, "\xb1c"], "\x91" => [76, "\xb1c"], "\x92" => [104, "\xb1c"], "\x93" => [16, "\xb1c"], "\x94" => [94, "\xb1e"], "\x95" => [76, "\xb1e"], "\x96" => [104, "\xb1e"], "\x97" => [16, "\xb1e"], "\x98" => [94, "\xb1i"], "\x99" => [76, "\xb1i"], "\x9a" => [104, "\xb1i"], "\x9b" => [16, "\xb1i"], "\x9c" => [94, "\xb1o"], "\x9d" => [76, "\xb1o"], "\x9e" => [104, "\xb1o"], "\x9f" => [16, "\xb1o"], "\xa0" => [94, "\xb1s"], "\xa1" => [76, "\xb1s"], "\xa2" => [104, "\xb1s"], "\xa3" => [16, "\xb1s"], "\xa4" => [94, "\xb1t"], "\xa5" => [76, "\xb1t"], "\xa6" => [104, "\xb1t"], "\xa7" => [16, "\xb1t"], "\xa8" => [77, "\xb1 "], "\xa9" => [18, "\xb1 "], "\xaa" => [77, "\xb1%"], "\xab" => [18, "\xb1%"], "\xac" => [77, "\xb1-"], "\xad" => [18, "\xb1-"], "\xae" => [77, "\xb1."], "\xaf" => [18, "\xb1."], "\xb0" => [77, "\xb1/"], "\xb1" => [18, "\xb1/"], "\xb2" => [77, "\xb13"], "\xb3" => [18, "\xb13"], "\xb4" => [77, "\xb14"], "\xb5" => [18, "\xb14"], "\xb6" => [77, "\xb15"], "\xb7" => [18, "\xb15"], "\xb8" => [77, "\xb16"], "\xb9" => [18, "\xb16"], "\xba" => [77, "\xb17"], "\xbb" => [18, "\xb17"], "\xbc" => [77, "\xb18"], "\xbd" => [18, "\xb18"], "\xbe" => [77, "\xb19"], "\xbf" => [18, "\xb19"], "\xc0" => [77, "\xb1="], "\xc1" => [18, "\xb1="], "\xc2" => [77, "\xb1A"], "\xc3" => [18, "\xb1A"], "\xc4" => [77, "\xb1_"], "\xc5" => [18, "\xb1_"], "\xc6" => [77, "\xb1b"], "\xc7" => [18, "\xb1b"], "\xc8" => [77, "\xb1d"], "\xc9" => [18, "\xb1d"], "\xca" => [77, "\xb1f"], "\xcb" => [18, "\xb1f"], "\xcc" => [77, "\xb1g"], "\xcd" => [18, "\xb1g"], "\xce" => [77, "\xb1h"], "\xcf" => [18, "\xb1h"], "\xd0" => [77, "\xb1l"], "\xd1" => [18, "\xb1l"], "\xd2" => [77, "\xb1m"], "\xd3" => [18, "\xb1m"], "\xd4" => [77, "\xb1n"], "\xd5" => [18, "\xb1n"], "\xd6" => [77, "\xb1p"], "\xd7" => [18, "\xb1p"], "\xd8" => [77, "\xb1r"], "\xd9" => [18, "\xb1r"], "\xda" => [77, "\xb1u"], "\xdb" => [18, "\xb1u"], "\xdc" => [0, "\xb1:"], "\xdd" => [0, "\xb1B"], "\xde" => [0, "\xb1C"], "\xdf" => [0, "\xb1D"], "\xe0" => [0, "\xb1E"], "\xe1" => [0, "\xb1F"], "\xe2" => [0, "\xb1G"], "\xe3" => [0, "\xb1H"], "\xe4" => [0, "\xb1I"], "\xe5" => [0, "\xb1J"], "\xe6" => [0, "\xb1K"], "\xe7" => [0, "\xb1L"], "\xe8" => [0, "\xb1M"], "\xe9" => [0, "\xb1N"], "\xea" => [0, "\xb1O"], "\xeb" => [0, "\xb1P"], "\xec" => [0, "\xb1Q"], "\xed" => [0, "\xb1R"], "\xee" => [0, "\xb1S"], "\xef" => [0, "\xb1T"], "\xf0" => [0, "\xb1U"], "\xf1" => [0, "\xb1V"], "\xf2" => [0, "\xb1W"], "\xf3" => [0, "\xb1Y"], "\xf4" => [0, "\xb1j"], "\xf5" => [0, "\xb1k"], "\xf6" => [0, "\xb1q"], "\xf7" => [0, "\xb1v"], "\xf8" => [0, "\xb1w"], "\xf9" => [0, "\xb1x"], "\xfa" => [0, "\xb1y"], "\xfb" => [0, "\xb1z"], "\xfc" => [82, "\xb1"], "\xfd" => [87, "\xb1"], "\xfe" => [130, "\xb1"], "\xff" => [9, "\xb1"]], ["\x00" => [77, "\xb00"], "\x01" => [18, "\xb00"], "\x02" => [77, "\xb01"], "\x03" => [18, "\xb01"], "\x04" => [77, "\xb02"], "\x05" => [18, "\xb02"], "\x06" => [77, "\xb0a"], "\x07" => [18, "\xb0a"], "\x08" => [77, "\xb0c"], "\t" => [18, "\xb0c"], "\n" => [77, "\xb0e"], "\v" => [18, "\xb0e"], "\f" => [77, "\xb0i"], "\r" => [18, "\xb0i"], "\x0e" => [77, "\xb0o"], "\x0f" => [18, "\xb0o"], "\x10" => [77, "\xb0s"], "\x11" => [18, "\xb0s"], "\x12" => [77, "\xb0t"], "\x13" => [18, "\xb0t"], "\x14" => [0, "\xb0 "], "\x15" => [0, "\xb0%"], "\x16" => [0, "\xb0-"], "\x17" => [0, "\xb0."], "\x18" => [0, "\xb0/"], "\x19" => [0, "\xb03"], "\x1a" => [0, "\xb04"], "\x1b" => [0, "\xb05"], "\x1c" => [0, "\xb06"], "\x1d" => [0, "\xb07"], "\x1e" => [0, "\xb08"], "\x1f" => [0, "\xb09"], " " => [0, "\xb0="], "!" => [0, "\xb0A"], "\"" => [0, "\xb0_"], "#" => [0, "\xb0b"], "\$" => [0, "\xb0d"], "%" => [0, "\xb0f"], "&" => [0, "\xb0g"], "'" => [0, "\xb0h"], "(" => [0, "\xb0l"], ")" => [0, "\xb0m"], "*" => [0, "\xb0n"], "+" => [0, "\xb0p"], "," => [0, "\xb0r"], "-" => [0, "\xb0u"], "." => [100, "\xb0"], "/" => [110, "\xb0"], [111, "\xb0"], [115, "\xb0"], [116, "\xb0"], [118, "\xb0"], [119, "\xb0"], [122, "\xb0"], [123, "\xb0"], [125, "\xb0"], [126, "\xb0"], [129, "\xb0"], ":" => [143, "\xb0"], ";" => [148, "\xb0"], "<" => [151, "\xb0"], "=" => [153, "\xb0"], ">" => [83, "\xb0"], "?" => [10, "\xb0"], "@" => [77, "\xb10"], "A" => [18, "\xb10"], "B" => [77, "\xb11"], "C" => [18, "\xb11"], "D" => [77, "\xb12"], "E" => [18, "\xb12"], "F" => [77, "\xb1a"], "G" => [18, "\xb1a"], "H" => [77, "\xb1c"], "I" => [18, "\xb1c"], "J" => [77, "\xb1e"], "K" => [18, "\xb1e"], "L" => [77, "\xb1i"], "M" => [18, "\xb1i"], "N" => [77, "\xb1o"], "O" => [18, "\xb1o"], "P" => [77, "\xb1s"], "Q" => [18, "\xb1s"], "R" => [77, "\xb1t"], "S" => [18, "\xb1t"], "T" => [0, "\xb1 "], "U" => [0, "\xb1%"], "V" => [0, "\xb1-"], "W" => [0, "\xb1."], "X" => [0, "\xb1/"], "Y" => [0, "\xb13"], "Z" => [0, "\xb14"], "[" => [0, "\xb15"], "\\" => [0, "\xb16"], "]" => [0, "\xb17"], "^" => [0, "\xb18"], "_" => [0, "\xb19"], "`" => [0, "\xb1="], "a" => [0, "\xb1A"], "b" => [0, "\xb1_"], "c" => [0, "\xb1b"], "d" => [0, "\xb1d"], "e" => [0, "\xb1f"], "f" => [0, "\xb1g"], "g" => [0, "\xb1h"], "h" => [0, "\xb1l"], "i" => [0, "\xb1m"], "j" => [0, "\xb1n"], "k" => [0, "\xb1p"], "l" => [0, "\xb1r"], "m" => [0, "\xb1u"], "n" => [100, "\xb1"], "o" => [110, "\xb1"], "p" => [111, "\xb1"], "q" => [115, "\xb1"], "r" => [116, "\xb1"], "s" => [118, "\xb1"], "t" => [119, "\xb1"], "u" => [122, "\xb1"], "v" => [123, "\xb1"], "w" => [125, "\xb1"], "x" => [126, "\xb1"], "y" => [129, "\xb1"], "z" => [143, "\xb1"], "{" => [148, "\xb1"], "|" => [151, "\xb1"], "}" => [153, "\xb1"], "~" => [83, "\xb1"], "" => [10, "\xb1"], "\x80" => [77, "\xb30"], "\x81" => [18, "\xb30"], "\x82" => [77, "\xb31"], "\x83" => [18, "\xb31"], "\x84" => [77, "\xb32"], "\x85" => [18, "\xb32"], "\x86" => [77, "\xb3a"], "\x87" => [18, "\xb3a"], "\x88" => [77, "\xb3c"], "\x89" => [18, "\xb3c"], "\x8a" => [77, "\xb3e"], "\x8b" => [18, "\xb3e"], "\x8c" => [77, "\xb3i"], "\x8d" => [18, "\xb3i"], "\x8e" => [77, "\xb3o"], "\x8f" => [18, "\xb3o"], "\x90" => [77, "\xb3s"], "\x91" => [18, "\xb3s"], "\x92" => [77, "\xb3t"], "\x93" => [18, "\xb3t"], "\x94" => [0, "\xb3 "], "\x95" => [0, "\xb3%"], "\x96" => [0, "\xb3-"], "\x97" => [0, "\xb3."], "\x98" => [0, "\xb3/"], "\x99" => [0, "\xb33"], "\x9a" => [0, "\xb34"], "\x9b" => [0, "\xb35"], "\x9c" => [0, "\xb36"], "\x9d" => [0, "\xb37"], "\x9e" => [0, "\xb38"], "\x9f" => [0, "\xb39"], "\xa0" => [0, "\xb3="], "\xa1" => [0, "\xb3A"], "\xa2" => [0, "\xb3_"], "\xa3" => [0, "\xb3b"], "\xa4" => [0, "\xb3d"], "\xa5" => [0, "\xb3f"], "\xa6" => [0, "\xb3g"], "\xa7" => [0, "\xb3h"], "\xa8" => [0, "\xb3l"], "\xa9" => [0, "\xb3m"], "\xaa" => [0, "\xb3n"], "\xab" => [0, "\xb3p"], "\xac" => [0, "\xb3r"], "\xad" => [0, "\xb3u"], "\xae" => [100, "\xb3"], "\xaf" => [110, "\xb3"], "\xb0" => [111, "\xb3"], "\xb1" => [115, "\xb3"], "\xb2" => [116, "\xb3"], "\xb3" => [118, "\xb3"], "\xb4" => [119, "\xb3"], "\xb5" => [122, "\xb3"], "\xb6" => [123, "\xb3"], "\xb7" => [125, "\xb3"], "\xb8" => [126, "\xb3"], "\xb9" => [129, "\xb3"], "\xba" => [143, "\xb3"], "\xbb" => [148, "\xb3"], "\xbc" => [151, "\xb3"], "\xbd" => [153, "\xb3"], "\xbe" => [83, "\xb3"], "\xbf" => [10, "\xb3"], "\xc0" => [77, "\xd10"], "\xc1" => [18, "\xd10"], "\xc2" => [77, "\xd11"], "\xc3" => [18, "\xd11"], "\xc4" => [77, "\xd12"], "\xc5" => [18, "\xd12"], "\xc6" => [77, "\xd1a"], "\xc7" => [18, "\xd1a"], "\xc8" => [77, "\xd1c"], "\xc9" => [18, "\xd1c"], "\xca" => [77, "\xd1e"], "\xcb" => [18, "\xd1e"], "\xcc" => [77, "\xd1i"], "\xcd" => [18, "\xd1i"], "\xce" => [77, "\xd1o"], "\xcf" => [18, "\xd1o"], "\xd0" => [77, "\xd1s"], "\xd1" => [18, "\xd1s"], "\xd2" => [77, "\xd1t"], "\xd3" => [18, "\xd1t"], "\xd4" => [0, "\xd1 "], "\xd5" => [0, "\xd1%"], "\xd6" => [0, "\xd1-"], "\xd7" => [0, "\xd1."], "\xd8" => [0, "\xd1/"], "\xd9" => [0, "\xd13"], "\xda" => [0, "\xd14"], "\xdb" => [0, "\xd15"], "\xdc" => [0, "\xd16"], "\xdd" => [0, "\xd17"], "\xde" => [0, "\xd18"], "\xdf" => [0, "\xd19"], "\xe0" => [0, "\xd1="], "\xe1" => [0, "\xd1A"], "\xe2" => [0, "\xd1_"], "\xe3" => [0, "\xd1b"], "\xe4" => [0, "\xd1d"], "\xe5" => [0, "\xd1f"], "\xe6" => [0, "\xd1g"], "\xe7" => [0, "\xd1h"], "\xe8" => [0, "\xd1l"], "\xe9" => [0, "\xd1m"], "\xea" => [0, "\xd1n"], "\xeb" => [0, "\xd1p"], "\xec" => [0, "\xd1r"], "\xed" => [0, "\xd1u"], "\xee" => [100, "\xd1"], "\xef" => [110, "\xd1"], "\xf0" => [111, "\xd1"], "\xf1" => [115, "\xd1"], "\xf2" => [116, "\xd1"], "\xf3" => [118, "\xd1"], "\xf4" => [119, "\xd1"], "\xf5" => [122, "\xd1"], "\xf6" => [123, "\xd1"], "\xf7" => [125, "\xd1"], "\xf8" => [126, "\xd1"], "\xf9" => [129, "\xd1"], "\xfa" => [143, "\xd1"], "\xfb" => [148, "\xd1"], "\xfc" => [151, "\xd1"], "\xfd" => [153, "\xd1"], "\xfe" => [83, "\xd1"], "\xff" => [10, "\xd1"]], ["\x00" => [0, "\xb00"], "\x01" => [0, "\xb01"], "\x02" => [0, "\xb02"], "\x03" => [0, "\xb0a"], "\x04" => [0, "\xb0c"], "\x05" => [0, "\xb0e"], "\x06" => [0, "\xb0i"], "\x07" => [0, "\xb0o"], "\x08" => [0, "\xb0s"], "\t" => [0, "\xb0t"], "\n" => [73, "\xb0"], "\v" => [88, "\xb0"], "\f" => [89, "\xb0"], "\r" => [96, "\xb0"], "\x0e" => [97, "\xb0"], "\x0f" => [99, "\xb0"], "\x10" => [106, "\xb0"], "\x11" => [136, "\xb0"], "\x12" => [139, "\xb0"], "\x13" => [141, "\xb0"], "\x14" => [145, "\xb0"], "\x15" => [147, "\xb0"], "\x16" => [149, "\xb0"], "\x17" => [101, "\xb0"], "\x18" => [112, "\xb0"], "\x19" => [117, "\xb0"], "\x1a" => [120, "\xb0"], "\x1b" => [124, "\xb0"], "\x1c" => [127, "\xb0"], "\x1d" => [144, "\xb0"], "\x1e" => [152, "\xb0"], "\x1f" => [11, "\xb0"], " " => [0, "\xb10"], "!" => [0, "\xb11"], "\"" => [0, "\xb12"], "#" => [0, "\xb1a"], "\$" => [0, "\xb1c"], "%" => [0, "\xb1e"], "&" => [0, "\xb1i"], "'" => [0, "\xb1o"], "(" => [0, "\xb1s"], ")" => [0, "\xb1t"], "*" => [73, "\xb1"], "+" => [88, "\xb1"], "," => [89, "\xb1"], "-" => [96, "\xb1"], "." => [97, "\xb1"], "/" => [99, "\xb1"], [106, "\xb1"], [136, "\xb1"], [139, "\xb1"], [141, "\xb1"], [145, "\xb1"], [147, "\xb1"], [149, "\xb1"], [101, "\xb1"], [112, "\xb1"], [117, "\xb1"], ":" => [120, "\xb1"], ";" => [124, "\xb1"], "<" => [127, "\xb1"], "=" => [144, "\xb1"], ">" => [152, "\xb1"], "?" => [11, "\xb1"], "@" => [0, "\xb30"], "A" => [0, "\xb31"], "B" => [0, "\xb32"], "C" => [0, "\xb3a"], "D" => [0, "\xb3c"], "E" => [0, "\xb3e"], "F" => [0, "\xb3i"], "G" => [0, "\xb3o"], "H" => [0, "\xb3s"], "I" => [0, "\xb3t"], "J" => [73, "\xb3"], "K" => [88, "\xb3"], "L" => [89, "\xb3"], "M" => [96, "\xb3"], "N" => [97, "\xb3"], "O" => [99, "\xb3"], "P" => [106, "\xb3"], "Q" => [136, "\xb3"], "R" => [139, "\xb3"], "S" => [141, "\xb3"], "T" => [145, "\xb3"], "U" => [147, "\xb3"], "V" => [149, "\xb3"], "W" => [101, "\xb3"], "X" => [112, "\xb3"], "Y" => [117, "\xb3"], "Z" => [120, "\xb3"], "[" => [124, "\xb3"], "\\" => [127, "\xb3"], "]" => [144, "\xb3"], "^" => [152, "\xb3"], "_" => [11, "\xb3"], "`" => [0, "\xd10"], "a" => [0, "\xd11"], "b" => [0, "\xd12"], "c" => [0, "\xd1a"], "d" => [0, "\xd1c"], "e" => [0, "\xd1e"], "f" => [0, "\xd1i"], "g" => [0, "\xd1o"], "h" => [0, "\xd1s"], "i" => [0, "\xd1t"], "j" => [73, "\xd1"], "k" => [88, "\xd1"], "l" => [89, "\xd1"], "m" => [96, "\xd1"], "n" => [97, "\xd1"], "o" => [99, "\xd1"], "p" => [106, "\xd1"], "q" => [136, "\xd1"], "r" => [139, "\xd1"], "s" => [141, "\xd1"], "t" => [145, "\xd1"], "u" => [147, "\xd1"], "v" => [149, "\xd1"], "w" => [101, "\xd1"], "x" => [112, "\xd1"], "y" => [117, "\xd1"], "z" => [120, "\xd1"], "{" => [124, "\xd1"], "|" => [127, "\xd1"], "}" => [144, "\xd1"], "~" => [152, "\xd1"], "" => [11, "\xd1"], "\x80" => [0, "\xd80"], "\x81" => [0, "\xd81"], "\x82" => [0, "\xd82"], "\x83" => [0, "\xd8a"], "\x84" => [0, "\xd8c"], "\x85" => [0, "\xd8e"], "\x86" => [0, "\xd8i"], "\x87" => [0, "\xd8o"], "\x88" => [0, "\xd8s"], "\x89" => [0, "\xd8t"], "\x8a" => [73, "\xd8"], "\x8b" => [88, "\xd8"], "\x8c" => [89, "\xd8"], "\x8d" => [96, "\xd8"], "\x8e" => [97, "\xd8"], "\x8f" => [99, "\xd8"], "\x90" => [106, "\xd8"], "\x91" => [136, "\xd8"], "\x92" => [139, "\xd8"], "\x93" => [141, "\xd8"], "\x94" => [145, "\xd8"], "\x95" => [147, "\xd8"], "\x96" => [149, "\xd8"], "\x97" => [101, "\xd8"], "\x98" => [112, "\xd8"], "\x99" => [117, "\xd8"], "\x9a" => [120, "\xd8"], "\x9b" => [124, "\xd8"], "\x9c" => [127, "\xd8"], "\x9d" => [144, "\xd8"], "\x9e" => [152, "\xd8"], "\x9f" => [11, "\xd8"], "\xa0" => [0, "\xd90"], "\xa1" => [0, "\xd91"], "\xa2" => [0, "\xd92"], "\xa3" => [0, "\xd9a"], "\xa4" => [0, "\xd9c"], "\xa5" => [0, "\xd9e"], "\xa6" => [0, "\xd9i"], "\xa7" => [0, "\xd9o"], "\xa8" => [0, "\xd9s"], "\xa9" => [0, "\xd9t"], "\xaa" => [73, "\xd9"], "\xab" => [88, "\xd9"], "\xac" => [89, "\xd9"], "\xad" => [96, "\xd9"], "\xae" => [97, "\xd9"], "\xaf" => [99, "\xd9"], "\xb0" => [106, "\xd9"], "\xb1" => [136, "\xd9"], "\xb2" => [139, "\xd9"], "\xb3" => [141, "\xd9"], "\xb4" => [145, "\xd9"], "\xb5" => [147, "\xd9"], "\xb6" => [149, "\xd9"], "\xb7" => [101, "\xd9"], "\xb8" => [112, "\xd9"], "\xb9" => [117, "\xd9"], "\xba" => [120, "\xd9"], "\xbb" => [124, "\xd9"], "\xbc" => [127, "\xd9"], "\xbd" => [144, "\xd9"], "\xbe" => [152, "\xd9"], "\xbf" => [11, "\xd9"], "\xc0" => [0, "\xe30"], "\xc1" => [0, "\xe31"], "\xc2" => [0, "\xe32"], "\xc3" => [0, "\xe3a"], "\xc4" => [0, "\xe3c"], "\xc5" => [0, "\xe3e"], "\xc6" => [0, "\xe3i"], "\xc7" => [0, "\xe3o"], "\xc8" => [0, "\xe3s"], "\xc9" => [0, "\xe3t"], "\xca" => [73, "\xe3"], "\xcb" => [88, "\xe3"], "\xcc" => [89, "\xe3"], "\xcd" => [96, "\xe3"], "\xce" => [97, "\xe3"], "\xcf" => [99, "\xe3"], "\xd0" => [106, "\xe3"], "\xd1" => [136, "\xe3"], "\xd2" => [139, "\xe3"], "\xd3" => [141, "\xe3"], "\xd4" => [145, "\xe3"], "\xd5" => [147, "\xe3"], "\xd6" => [149, "\xe3"], "\xd7" => [101, "\xe3"], "\xd8" => [112, "\xe3"], "\xd9" => [117, "\xe3"], "\xda" => [120, "\xe3"], "\xdb" => [124, "\xe3"], "\xdc" => [127, "\xe3"], "\xdd" => [144, "\xe3"], "\xde" => [152, "\xe3"], "\xdf" => [11, "\xe3"], "\xe0" => [0, "\xe50"], "\xe1" => [0, "\xe51"], "\xe2" => [0, "\xe52"], "\xe3" => [0, "\xe5a"], "\xe4" => [0, "\xe5c"], "\xe5" => [0, "\xe5e"], "\xe6" => [0, "\xe5i"], "\xe7" => [0, "\xe5o"], "\xe8" => [0, "\xe5s"], "\xe9" => [0, "\xe5t"], "\xea" => [73, "\xe5"], "\xeb" => [88, "\xe5"], "\xec" => [89, "\xe5"], "\xed" => [96, "\xe5"], "\xee" => [97, "\xe5"], "\xef" => [99, "\xe5"], "\xf0" => [106, "\xe5"], "\xf1" => [136, "\xe5"], "\xf2" => [139, "\xe5"], "\xf3" => [141, "\xe5"], "\xf4" => [145, "\xe5"], "\xf5" => [147, "\xe5"], "\xf6" => [149, "\xe5"], "\xf7" => [101, "\xe5"], "\xf8" => [112, "\xe5"], "\xf9" => [117, "\xe5"], "\xfa" => [120, "\xe5"], "\xfb" => [124, "\xe5"], "\xfc" => [127, "\xe5"], "\xfd" => [144, "\xe5"], "\xfe" => [152, "\xe5"], "\xff" => [11, "\xe5"]], ["\x00" => [94, "\xb20"], "\x01" => [76, "\xb20"], "\x02" => [104, "\xb20"], "\x03" => [16, "\xb20"], "\x04" => [94, "\xb21"], "\x05" => [76, "\xb21"], "\x06" => [104, "\xb21"], "\x07" => [16, "\xb21"], "\x08" => [94, "\xb22"], "\t" => [76, "\xb22"], "\n" => [104, "\xb22"], "\v" => [16, "\xb22"], "\f" => [94, "\xb2a"], "\r" => [76, "\xb2a"], "\x0e" => [104, "\xb2a"], "\x0f" => [16, "\xb2a"], "\x10" => [94, "\xb2c"], "\x11" => [76, "\xb2c"], "\x12" => [104, "\xb2c"], "\x13" => [16, "\xb2c"], "\x14" => [94, "\xb2e"], "\x15" => [76, "\xb2e"], "\x16" => [104, "\xb2e"], "\x17" => [16, "\xb2e"], "\x18" => [94, "\xb2i"], "\x19" => [76, "\xb2i"], "\x1a" => [104, "\xb2i"], "\x1b" => [16, "\xb2i"], "\x1c" => [94, "\xb2o"], "\x1d" => [76, "\xb2o"], "\x1e" => [104, "\xb2o"], "\x1f" => [16, "\xb2o"], " " => [94, "\xb2s"], "!" => [76, "\xb2s"], "\"" => [104, "\xb2s"], "#" => [16, "\xb2s"], "\$" => [94, "\xb2t"], "%" => [76, "\xb2t"], "&" => [104, "\xb2t"], "'" => [16, "\xb2t"], "(" => [77, "\xb2 "], ")" => [18, "\xb2 "], "*" => [77, "\xb2%"], "+" => [18, "\xb2%"], "," => [77, "\xb2-"], "-" => [18, "\xb2-"], "." => [77, "\xb2."], "/" => [18, "\xb2."], [77, "\xb2/"], [18, "\xb2/"], [77, "\xb23"], [18, "\xb23"], [77, "\xb24"], [18, "\xb24"], [77, "\xb25"], [18, "\xb25"], [77, "\xb26"], [18, "\xb26"], ":" => [77, "\xb27"], ";" => [18, "\xb27"], "<" => [77, "\xb28"], "=" => [18, "\xb28"], ">" => [77, "\xb29"], "?" => [18, "\xb29"], "@" => [77, "\xb2="], "A" => [18, "\xb2="], "B" => [77, "\xb2A"], "C" => [18, "\xb2A"], "D" => [77, "\xb2_"], "E" => [18, "\xb2_"], "F" => [77, "\xb2b"], "G" => [18, "\xb2b"], "H" => [77, "\xb2d"], "I" => [18, "\xb2d"], "J" => [77, "\xb2f"], "K" => [18, "\xb2f"], "L" => [77, "\xb2g"], "M" => [18, "\xb2g"], "N" => [77, "\xb2h"], "O" => [18, "\xb2h"], "P" => [77, "\xb2l"], "Q" => [18, "\xb2l"], "R" => [77, "\xb2m"], "S" => [18, "\xb2m"], "T" => [77, "\xb2n"], "U" => [18, "\xb2n"], "V" => [77, "\xb2p"], "W" => [18, "\xb2p"], "X" => [77, "\xb2r"], "Y" => [18, "\xb2r"], "Z" => [77, "\xb2u"], "[" => [18, "\xb2u"], "\\" => [0, "\xb2:"], "]" => [0, "\xb2B"], "^" => [0, "\xb2C"], "_" => [0, "\xb2D"], "`" => [0, "\xb2E"], "a" => [0, "\xb2F"], "b" => [0, "\xb2G"], "c" => [0, "\xb2H"], "d" => [0, "\xb2I"], "e" => [0, "\xb2J"], "f" => [0, "\xb2K"], "g" => [0, "\xb2L"], "h" => [0, "\xb2M"], "i" => [0, "\xb2N"], "j" => [0, "\xb2O"], "k" => [0, "\xb2P"], "l" => [0, "\xb2Q"], "m" => [0, "\xb2R"], "n" => [0, "\xb2S"], "o" => [0, "\xb2T"], "p" => [0, "\xb2U"], "q" => [0, "\xb2V"], "r" => [0, "\xb2W"], "s" => [0, "\xb2Y"], "t" => [0, "\xb2j"], "u" => [0, "\xb2k"], "v" => [0, "\xb2q"], "w" => [0, "\xb2v"], "x" => [0, "\xb2w"], "y" => [0, "\xb2x"], "z" => [0, "\xb2y"], "{" => [0, "\xb2z"], "|" => [82, "\xb2"], "}" => [87, "\xb2"], "~" => [130, "\xb2"], "" => [9, "\xb2"], "\x80" => [94, "\xb50"], "\x81" => [76, "\xb50"], "\x82" => [104, "\xb50"], "\x83" => [16, "\xb50"], "\x84" => [94, "\xb51"], "\x85" => [76, "\xb51"], "\x86" => [104, "\xb51"], "\x87" => [16, "\xb51"], "\x88" => [94, "\xb52"], "\x89" => [76, "\xb52"], "\x8a" => [104, "\xb52"], "\x8b" => [16, "\xb52"], "\x8c" => [94, "\xb5a"], "\x8d" => [76, "\xb5a"], "\x8e" => [104, "\xb5a"], "\x8f" => [16, "\xb5a"], "\x90" => [94, "\xb5c"], "\x91" => [76, "\xb5c"], "\x92" => [104, "\xb5c"], "\x93" => [16, "\xb5c"], "\x94" => [94, "\xb5e"], "\x95" => [76, "\xb5e"], "\x96" => [104, "\xb5e"], "\x97" => [16, "\xb5e"], "\x98" => [94, "\xb5i"], "\x99" => [76, "\xb5i"], "\x9a" => [104, "\xb5i"], "\x9b" => [16, "\xb5i"], "\x9c" => [94, "\xb5o"], "\x9d" => [76, "\xb5o"], "\x9e" => [104, "\xb5o"], "\x9f" => [16, "\xb5o"], "\xa0" => [94, "\xb5s"], "\xa1" => [76, "\xb5s"], "\xa2" => [104, "\xb5s"], "\xa3" => [16, "\xb5s"], "\xa4" => [94, "\xb5t"], "\xa5" => [76, "\xb5t"], "\xa6" => [104, "\xb5t"], "\xa7" => [16, "\xb5t"], "\xa8" => [77, "\xb5 "], "\xa9" => [18, "\xb5 "], "\xaa" => [77, "\xb5%"], "\xab" => [18, "\xb5%"], "\xac" => [77, "\xb5-"], "\xad" => [18, "\xb5-"], "\xae" => [77, "\xb5."], "\xaf" => [18, "\xb5."], "\xb0" => [77, "\xb5/"], "\xb1" => [18, "\xb5/"], "\xb2" => [77, "\xb53"], "\xb3" => [18, "\xb53"], "\xb4" => [77, "\xb54"], "\xb5" => [18, "\xb54"], "\xb6" => [77, "\xb55"], "\xb7" => [18, "\xb55"], "\xb8" => [77, "\xb56"], "\xb9" => [18, "\xb56"], "\xba" => [77, "\xb57"], "\xbb" => [18, "\xb57"], "\xbc" => [77, "\xb58"], "\xbd" => [18, "\xb58"], "\xbe" => [77, "\xb59"], "\xbf" => [18, "\xb59"], "\xc0" => [77, "\xb5="], "\xc1" => [18, "\xb5="], "\xc2" => [77, "\xb5A"], "\xc3" => [18, "\xb5A"], "\xc4" => [77, "\xb5_"], "\xc5" => [18, "\xb5_"], "\xc6" => [77, "\xb5b"], "\xc7" => [18, "\xb5b"], "\xc8" => [77, "\xb5d"], "\xc9" => [18, "\xb5d"], "\xca" => [77, "\xb5f"], "\xcb" => [18, "\xb5f"], "\xcc" => [77, "\xb5g"], "\xcd" => [18, "\xb5g"], "\xce" => [77, "\xb5h"], "\xcf" => [18, "\xb5h"], "\xd0" => [77, "\xb5l"], "\xd1" => [18, "\xb5l"], "\xd2" => [77, "\xb5m"], "\xd3" => [18, "\xb5m"], "\xd4" => [77, "\xb5n"], "\xd5" => [18, "\xb5n"], "\xd6" => [77, "\xb5p"], "\xd7" => [18, "\xb5p"], "\xd8" => [77, "\xb5r"], "\xd9" => [18, "\xb5r"], "\xda" => [77, "\xb5u"], "\xdb" => [18, "\xb5u"], "\xdc" => [0, "\xb5:"], "\xdd" => [0, "\xb5B"], "\xde" => [0, "\xb5C"], "\xdf" => [0, "\xb5D"], "\xe0" => [0, "\xb5E"], "\xe1" => [0, "\xb5F"], "\xe2" => [0, "\xb5G"], "\xe3" => [0, "\xb5H"], "\xe4" => [0, "\xb5I"], "\xe5" => [0, "\xb5J"], "\xe6" => [0, "\xb5K"], "\xe7" => [0, "\xb5L"], "\xe8" => [0, "\xb5M"], "\xe9" => [0, "\xb5N"], "\xea" => [0, "\xb5O"], "\xeb" => [0, "\xb5P"], "\xec" => [0, "\xb5Q"], "\xed" => [0, "\xb5R"], "\xee" => [0, "\xb5S"], "\xef" => [0, "\xb5T"], "\xf0" => [0, "\xb5U"], "\xf1" => [0, "\xb5V"], "\xf2" => [0, "\xb5W"], "\xf3" => [0, "\xb5Y"], "\xf4" => [0, "\xb5j"], "\xf5" => [0, "\xb5k"], "\xf6" => [0, "\xb5q"], "\xf7" => [0, "\xb5v"], "\xf8" => [0, "\xb5w"], "\xf9" => [0, "\xb5x"], "\xfa" => [0, "\xb5y"], "\xfb" => [0, "\xb5z"], "\xfc" => [82, "\xb5"], "\xfd" => [87, "\xb5"], "\xfe" => [130, "\xb5"], "\xff" => [9, "\xb5"]], ["\x00" => [77, "\xb20"], "\x01" => [18, "\xb20"], "\x02" => [77, "\xb21"], "\x03" => [18, "\xb21"], "\x04" => [77, "\xb22"], "\x05" => [18, "\xb22"], "\x06" => [77, "\xb2a"], "\x07" => [18, "\xb2a"], "\x08" => [77, "\xb2c"], "\t" => [18, "\xb2c"], "\n" => [77, "\xb2e"], "\v" => [18, "\xb2e"], "\f" => [77, "\xb2i"], "\r" => [18, "\xb2i"], "\x0e" => [77, "\xb2o"], "\x0f" => [18, "\xb2o"], "\x10" => [77, "\xb2s"], "\x11" => [18, "\xb2s"], "\x12" => [77, "\xb2t"], "\x13" => [18, "\xb2t"], "\x14" => [0, "\xb2 "], "\x15" => [0, "\xb2%"], "\x16" => [0, "\xb2-"], "\x17" => [0, "\xb2."], "\x18" => [0, "\xb2/"], "\x19" => [0, "\xb23"], "\x1a" => [0, "\xb24"], "\x1b" => [0, "\xb25"], "\x1c" => [0, "\xb26"], "\x1d" => [0, "\xb27"], "\x1e" => [0, "\xb28"], "\x1f" => [0, "\xb29"], " " => [0, "\xb2="], "!" => [0, "\xb2A"], "\"" => [0, "\xb2_"], "#" => [0, "\xb2b"], "\$" => [0, "\xb2d"], "%" => [0, "\xb2f"], "&" => [0, "\xb2g"], "'" => [0, "\xb2h"], "(" => [0, "\xb2l"], ")" => [0, "\xb2m"], "*" => [0, "\xb2n"], "+" => [0, "\xb2p"], "," => [0, "\xb2r"], "-" => [0, "\xb2u"], "." => [100, "\xb2"], "/" => [110, "\xb2"], [111, "\xb2"], [115, "\xb2"], [116, "\xb2"], [118, "\xb2"], [119, "\xb2"], [122, "\xb2"], [123, "\xb2"], [125, "\xb2"], [126, "\xb2"], [129, "\xb2"], ":" => [143, "\xb2"], ";" => [148, "\xb2"], "<" => [151, "\xb2"], "=" => [153, "\xb2"], ">" => [83, "\xb2"], "?" => [10, "\xb2"], "@" => [77, "\xb50"], "A" => [18, "\xb50"], "B" => [77, "\xb51"], "C" => [18, "\xb51"], "D" => [77, "\xb52"], "E" => [18, "\xb52"], "F" => [77, "\xb5a"], "G" => [18, "\xb5a"], "H" => [77, "\xb5c"], "I" => [18, "\xb5c"], "J" => [77, "\xb5e"], "K" => [18, "\xb5e"], "L" => [77, "\xb5i"], "M" => [18, "\xb5i"], "N" => [77, "\xb5o"], "O" => [18, "\xb5o"], "P" => [77, "\xb5s"], "Q" => [18, "\xb5s"], "R" => [77, "\xb5t"], "S" => [18, "\xb5t"], "T" => [0, "\xb5 "], "U" => [0, "\xb5%"], "V" => [0, "\xb5-"], "W" => [0, "\xb5."], "X" => [0, "\xb5/"], "Y" => [0, "\xb53"], "Z" => [0, "\xb54"], "[" => [0, "\xb55"], "\\" => [0, "\xb56"], "]" => [0, "\xb57"], "^" => [0, "\xb58"], "_" => [0, "\xb59"], "`" => [0, "\xb5="], "a" => [0, "\xb5A"], "b" => [0, "\xb5_"], "c" => [0, "\xb5b"], "d" => [0, "\xb5d"], "e" => [0, "\xb5f"], "f" => [0, "\xb5g"], "g" => [0, "\xb5h"], "h" => [0, "\xb5l"], "i" => [0, "\xb5m"], "j" => [0, "\xb5n"], "k" => [0, "\xb5p"], "l" => [0, "\xb5r"], "m" => [0, "\xb5u"], "n" => [100, "\xb5"], "o" => [110, "\xb5"], "p" => [111, "\xb5"], "q" => [115, "\xb5"], "r" => [116, "\xb5"], "s" => [118, "\xb5"], "t" => [119, "\xb5"], "u" => [122, "\xb5"], "v" => [123, "\xb5"], "w" => [125, "\xb5"], "x" => [126, "\xb5"], "y" => [129, "\xb5"], "z" => [143, "\xb5"], "{" => [148, "\xb5"], "|" => [151, "\xb5"], "}" => [153, "\xb5"], "~" => [83, "\xb5"], "" => [10, "\xb5"], "\x80" => [77, "\xb90"], "\x81" => [18, "\xb90"], "\x82" => [77, "\xb91"], "\x83" => [18, "\xb91"], "\x84" => [77, "\xb92"], "\x85" => [18, "\xb92"], "\x86" => [77, "\xb9a"], "\x87" => [18, "\xb9a"], "\x88" => [77, "\xb9c"], "\x89" => [18, "\xb9c"], "\x8a" => [77, "\xb9e"], "\x8b" => [18, "\xb9e"], "\x8c" => [77, "\xb9i"], "\x8d" => [18, "\xb9i"], "\x8e" => [77, "\xb9o"], "\x8f" => [18, "\xb9o"], "\x90" => [77, "\xb9s"], "\x91" => [18, "\xb9s"], "\x92" => [77, "\xb9t"], "\x93" => [18, "\xb9t"], "\x94" => [0, "\xb9 "], "\x95" => [0, "\xb9%"], "\x96" => [0, "\xb9-"], "\x97" => [0, "\xb9."], "\x98" => [0, "\xb9/"], "\x99" => [0, "\xb93"], "\x9a" => [0, "\xb94"], "\x9b" => [0, "\xb95"], "\x9c" => [0, "\xb96"], "\x9d" => [0, "\xb97"], "\x9e" => [0, "\xb98"], "\x9f" => [0, "\xb99"], "\xa0" => [0, "\xb9="], "\xa1" => [0, "\xb9A"], "\xa2" => [0, "\xb9_"], "\xa3" => [0, "\xb9b"], "\xa4" => [0, "\xb9d"], "\xa5" => [0, "\xb9f"], "\xa6" => [0, "\xb9g"], "\xa7" => [0, "\xb9h"], "\xa8" => [0, "\xb9l"], "\xa9" => [0, "\xb9m"], "\xaa" => [0, "\xb9n"], "\xab" => [0, "\xb9p"], "\xac" => [0, "\xb9r"], "\xad" => [0, "\xb9u"], "\xae" => [100, "\xb9"], "\xaf" => [110, "\xb9"], "\xb0" => [111, "\xb9"], "\xb1" => [115, "\xb9"], "\xb2" => [116, "\xb9"], "\xb3" => [118, "\xb9"], "\xb4" => [119, "\xb9"], "\xb5" => [122, "\xb9"], "\xb6" => [123, "\xb9"], "\xb7" => [125, "\xb9"], "\xb8" => [126, "\xb9"], "\xb9" => [129, "\xb9"], "\xba" => [143, "\xb9"], "\xbb" => [148, "\xb9"], "\xbc" => [151, "\xb9"], "\xbd" => [153, "\xb9"], "\xbe" => [83, "\xb9"], "\xbf" => [10, "\xb9"], "\xc0" => [77, "\xba0"], "\xc1" => [18, "\xba0"], "\xc2" => [77, "\xba1"], "\xc3" => [18, "\xba1"], "\xc4" => [77, "\xba2"], "\xc5" => [18, "\xba2"], "\xc6" => [77, "\xbaa"], "\xc7" => [18, "\xbaa"], "\xc8" => [77, "\xbac"], "\xc9" => [18, "\xbac"], "\xca" => [77, "\xbae"], "\xcb" => [18, "\xbae"], "\xcc" => [77, "\xbai"], "\xcd" => [18, "\xbai"], "\xce" => [77, "\xbao"], "\xcf" => [18, "\xbao"], "\xd0" => [77, "\xbas"], "\xd1" => [18, "\xbas"], "\xd2" => [77, "\xbat"], "\xd3" => [18, "\xbat"], "\xd4" => [0, "\xba "], "\xd5" => [0, "\xba%"], "\xd6" => [0, "\xba-"], "\xd7" => [0, "\xba."], "\xd8" => [0, "\xba/"], "\xd9" => [0, "\xba3"], "\xda" => [0, "\xba4"], "\xdb" => [0, "\xba5"], "\xdc" => [0, "\xba6"], "\xdd" => [0, "\xba7"], "\xde" => [0, "\xba8"], "\xdf" => [0, "\xba9"], "\xe0" => [0, "\xba="], "\xe1" => [0, "\xbaA"], "\xe2" => [0, "\xba_"], "\xe3" => [0, "\xbab"], "\xe4" => [0, "\xbad"], "\xe5" => [0, "\xbaf"], "\xe6" => [0, "\xbag"], "\xe7" => [0, "\xbah"], "\xe8" => [0, "\xbal"], "\xe9" => [0, "\xbam"], "\xea" => [0, "\xban"], "\xeb" => [0, "\xbap"], "\xec" => [0, "\xbar"], "\xed" => [0, "\xbau"], "\xee" => [100, "\xba"], "\xef" => [110, "\xba"], "\xf0" => [111, "\xba"], "\xf1" => [115, "\xba"], "\xf2" => [116, "\xba"], "\xf3" => [118, "\xba"], "\xf4" => [119, "\xba"], "\xf5" => [122, "\xba"], "\xf6" => [123, "\xba"], "\xf7" => [125, "\xba"], "\xf8" => [126, "\xba"], "\xf9" => [129, "\xba"], "\xfa" => [143, "\xba"], "\xfb" => [148, "\xba"], "\xfc" => [151, "\xba"], "\xfd" => [153, "\xba"], "\xfe" => [83, "\xba"], "\xff" => [10, "\xba"]], ["\x00" => [0, "\xb20"], "\x01" => [0, "\xb21"], "\x02" => [0, "\xb22"], "\x03" => [0, "\xb2a"], "\x04" => [0, "\xb2c"], "\x05" => [0, "\xb2e"], "\x06" => [0, "\xb2i"], "\x07" => [0, "\xb2o"], "\x08" => [0, "\xb2s"], "\t" => [0, "\xb2t"], "\n" => [73, "\xb2"], "\v" => [88, "\xb2"], "\f" => [89, "\xb2"], "\r" => [96, "\xb2"], "\x0e" => [97, "\xb2"], "\x0f" => [99, "\xb2"], "\x10" => [106, "\xb2"], "\x11" => [136, "\xb2"], "\x12" => [139, "\xb2"], "\x13" => [141, "\xb2"], "\x14" => [145, "\xb2"], "\x15" => [147, "\xb2"], "\x16" => [149, "\xb2"], "\x17" => [101, "\xb2"], "\x18" => [112, "\xb2"], "\x19" => [117, "\xb2"], "\x1a" => [120, "\xb2"], "\x1b" => [124, "\xb2"], "\x1c" => [127, "\xb2"], "\x1d" => [144, "\xb2"], "\x1e" => [152, "\xb2"], "\x1f" => [11, "\xb2"], " " => [0, "\xb50"], "!" => [0, "\xb51"], "\"" => [0, "\xb52"], "#" => [0, "\xb5a"], "\$" => [0, "\xb5c"], "%" => [0, "\xb5e"], "&" => [0, "\xb5i"], "'" => [0, "\xb5o"], "(" => [0, "\xb5s"], ")" => [0, "\xb5t"], "*" => [73, "\xb5"], "+" => [88, "\xb5"], "," => [89, "\xb5"], "-" => [96, "\xb5"], "." => [97, "\xb5"], "/" => [99, "\xb5"], [106, "\xb5"], [136, "\xb5"], [139, "\xb5"], [141, "\xb5"], [145, "\xb5"], [147, "\xb5"], [149, "\xb5"], [101, "\xb5"], [112, "\xb5"], [117, "\xb5"], ":" => [120, "\xb5"], ";" => [124, "\xb5"], "<" => [127, "\xb5"], "=" => [144, "\xb5"], ">" => [152, "\xb5"], "?" => [11, "\xb5"], "@" => [0, "\xb90"], "A" => [0, "\xb91"], "B" => [0, "\xb92"], "C" => [0, "\xb9a"], "D" => [0, "\xb9c"], "E" => [0, "\xb9e"], "F" => [0, "\xb9i"], "G" => [0, "\xb9o"], "H" => [0, "\xb9s"], "I" => [0, "\xb9t"], "J" => [73, "\xb9"], "K" => [88, "\xb9"], "L" => [89, "\xb9"], "M" => [96, "\xb9"], "N" => [97, "\xb9"], "O" => [99, "\xb9"], "P" => [106, "\xb9"], "Q" => [136, "\xb9"], "R" => [139, "\xb9"], "S" => [141, "\xb9"], "T" => [145, "\xb9"], "U" => [147, "\xb9"], "V" => [149, "\xb9"], "W" => [101, "\xb9"], "X" => [112, "\xb9"], "Y" => [117, "\xb9"], "Z" => [120, "\xb9"], "[" => [124, "\xb9"], "\\" => [127, "\xb9"], "]" => [144, "\xb9"], "^" => [152, "\xb9"], "_" => [11, "\xb9"], "`" => [0, "\xba0"], "a" => [0, "\xba1"], "b" => [0, "\xba2"], "c" => [0, "\xbaa"], "d" => [0, "\xbac"], "e" => [0, "\xbae"], "f" => [0, "\xbai"], "g" => [0, "\xbao"], "h" => [0, "\xbas"], "i" => [0, "\xbat"], "j" => [73, "\xba"], "k" => [88, "\xba"], "l" => [89, "\xba"], "m" => [96, "\xba"], "n" => [97, "\xba"], "o" => [99, "\xba"], "p" => [106, "\xba"], "q" => [136, "\xba"], "r" => [139, "\xba"], "s" => [141, "\xba"], "t" => [145, "\xba"], "u" => [147, "\xba"], "v" => [149, "\xba"], "w" => [101, "\xba"], "x" => [112, "\xba"], "y" => [117, "\xba"], "z" => [120, "\xba"], "{" => [124, "\xba"], "|" => [127, "\xba"], "}" => [144, "\xba"], "~" => [152, "\xba"], "" => [11, "\xba"], "\x80" => [0, "\xbb0"], "\x81" => [0, "\xbb1"], "\x82" => [0, "\xbb2"], "\x83" => [0, "\xbba"], "\x84" => [0, "\xbbc"], "\x85" => [0, "\xbbe"], "\x86" => [0, "\xbbi"], "\x87" => [0, "\xbbo"], "\x88" => [0, "\xbbs"], "\x89" => [0, "\xbbt"], "\x8a" => [73, "\xbb"], "\x8b" => [88, "\xbb"], "\x8c" => [89, "\xbb"], "\x8d" => [96, "\xbb"], "\x8e" => [97, "\xbb"], "\x8f" => [99, "\xbb"], "\x90" => [106, "\xbb"], "\x91" => [136, "\xbb"], "\x92" => [139, "\xbb"], "\x93" => [141, "\xbb"], "\x94" => [145, "\xbb"], "\x95" => [147, "\xbb"], "\x96" => [149, "\xbb"], "\x97" => [101, "\xbb"], "\x98" => [112, "\xbb"], "\x99" => [117, "\xbb"], "\x9a" => [120, "\xbb"], "\x9b" => [124, "\xbb"], "\x9c" => [127, "\xbb"], "\x9d" => [144, "\xbb"], "\x9e" => [152, "\xbb"], "\x9f" => [11, "\xbb"], "\xa0" => [0, "\xbd0"], "\xa1" => [0, "\xbd1"], "\xa2" => [0, "\xbd2"], "\xa3" => [0, "\xbda"], "\xa4" => [0, "\xbdc"], "\xa5" => [0, "\xbde"], "\xa6" => [0, "\xbdi"], "\xa7" => [0, "\xbdo"], "\xa8" => [0, "\xbds"], "\xa9" => [0, "\xbdt"], "\xaa" => [73, "\xbd"], "\xab" => [88, "\xbd"], "\xac" => [89, "\xbd"], "\xad" => [96, "\xbd"], "\xae" => [97, "\xbd"], "\xaf" => [99, "\xbd"], "\xb0" => [106, "\xbd"], "\xb1" => [136, "\xbd"], "\xb2" => [139, "\xbd"], "\xb3" => [141, "\xbd"], "\xb4" => [145, "\xbd"], "\xb5" => [147, "\xbd"], "\xb6" => [149, "\xbd"], "\xb7" => [101, "\xbd"], "\xb8" => [112, "\xbd"], "\xb9" => [117, "\xbd"], "\xba" => [120, "\xbd"], "\xbb" => [124, "\xbd"], "\xbc" => [127, "\xbd"], "\xbd" => [144, "\xbd"], "\xbe" => [152, "\xbd"], "\xbf" => [11, "\xbd"], "\xc0" => [0, "\xbe0"], "\xc1" => [0, "\xbe1"], "\xc2" => [0, "\xbe2"], "\xc3" => [0, "\xbea"], "\xc4" => [0, "\xbec"], "\xc5" => [0, "\xbee"], "\xc6" => [0, "\xbei"], "\xc7" => [0, "\xbeo"], "\xc8" => [0, "\xbes"], "\xc9" => [0, "\xbet"], "\xca" => [73, "\xbe"], "\xcb" => [88, "\xbe"], "\xcc" => [89, "\xbe"], "\xcd" => [96, "\xbe"], "\xce" => [97, "\xbe"], "\xcf" => [99, "\xbe"], "\xd0" => [106, "\xbe"], "\xd1" => [136, "\xbe"], "\xd2" => [139, "\xbe"], "\xd3" => [141, "\xbe"], "\xd4" => [145, "\xbe"], "\xd5" => [147, "\xbe"], "\xd6" => [149, "\xbe"], "\xd7" => [101, "\xbe"], "\xd8" => [112, "\xbe"], "\xd9" => [117, "\xbe"], "\xda" => [120, "\xbe"], "\xdb" => [124, "\xbe"], "\xdc" => [127, "\xbe"], "\xdd" => [144, "\xbe"], "\xde" => [152, "\xbe"], "\xdf" => [11, "\xbe"], "\xe0" => [0, "\xc40"], "\xe1" => [0, "\xc41"], "\xe2" => [0, "\xc42"], "\xe3" => [0, "\xc4a"], "\xe4" => [0, "\xc4c"], "\xe5" => [0, "\xc4e"], "\xe6" => [0, "\xc4i"], "\xe7" => [0, "\xc4o"], "\xe8" => [0, "\xc4s"], "\xe9" => [0, "\xc4t"], "\xea" => [73, "\xc4"], "\xeb" => [88, "\xc4"], "\xec" => [89, "\xc4"], "\xed" => [96, "\xc4"], "\xee" => [97, "\xc4"], "\xef" => [99, "\xc4"], "\xf0" => [106, "\xc4"], "\xf1" => [136, "\xc4"], "\xf2" => [139, "\xc4"], "\xf3" => [141, "\xc4"], "\xf4" => [145, "\xc4"], "\xf5" => [147, "\xc4"], "\xf6" => [149, "\xc4"], "\xf7" => [101, "\xc4"], "\xf8" => [112, "\xc4"], "\xf9" => [117, "\xc4"], "\xfa" => [120, "\xc4"], "\xfb" => [124, "\xc4"], "\xfc" => [127, "\xc4"], "\xfd" => [144, "\xc4"], "\xfe" => [152, "\xc4"], "\xff" => [11, "\xc4"]], ["\x00" => [94, "\xb30"], "\x01" => [76, "\xb30"], "\x02" => [104, "\xb30"], "\x03" => [16, "\xb30"], "\x04" => [94, "\xb31"], "\x05" => [76, "\xb31"], "\x06" => [104, "\xb31"], "\x07" => [16, "\xb31"], "\x08" => [94, "\xb32"], "\t" => [76, "\xb32"], "\n" => [104, "\xb32"], "\v" => [16, "\xb32"], "\f" => [94, "\xb3a"], "\r" => [76, "\xb3a"], "\x0e" => [104, "\xb3a"], "\x0f" => [16, "\xb3a"], "\x10" => [94, "\xb3c"], "\x11" => [76, "\xb3c"], "\x12" => [104, "\xb3c"], "\x13" => [16, "\xb3c"], "\x14" => [94, "\xb3e"], "\x15" => [76, "\xb3e"], "\x16" => [104, "\xb3e"], "\x17" => [16, "\xb3e"], "\x18" => [94, "\xb3i"], "\x19" => [76, "\xb3i"], "\x1a" => [104, "\xb3i"], "\x1b" => [16, "\xb3i"], "\x1c" => [94, "\xb3o"], "\x1d" => [76, "\xb3o"], "\x1e" => [104, "\xb3o"], "\x1f" => [16, "\xb3o"], " " => [94, "\xb3s"], "!" => [76, "\xb3s"], "\"" => [104, "\xb3s"], "#" => [16, "\xb3s"], "\$" => [94, "\xb3t"], "%" => [76, "\xb3t"], "&" => [104, "\xb3t"], "'" => [16, "\xb3t"], "(" => [77, "\xb3 "], ")" => [18, "\xb3 "], "*" => [77, "\xb3%"], "+" => [18, "\xb3%"], "," => [77, "\xb3-"], "-" => [18, "\xb3-"], "." => [77, "\xb3."], "/" => [18, "\xb3."], [77, "\xb3/"], [18, "\xb3/"], [77, "\xb33"], [18, "\xb33"], [77, "\xb34"], [18, "\xb34"], [77, "\xb35"], [18, "\xb35"], [77, "\xb36"], [18, "\xb36"], ":" => [77, "\xb37"], ";" => [18, "\xb37"], "<" => [77, "\xb38"], "=" => [18, "\xb38"], ">" => [77, "\xb39"], "?" => [18, "\xb39"], "@" => [77, "\xb3="], "A" => [18, "\xb3="], "B" => [77, "\xb3A"], "C" => [18, "\xb3A"], "D" => [77, "\xb3_"], "E" => [18, "\xb3_"], "F" => [77, "\xb3b"], "G" => [18, "\xb3b"], "H" => [77, "\xb3d"], "I" => [18, "\xb3d"], "J" => [77, "\xb3f"], "K" => [18, "\xb3f"], "L" => [77, "\xb3g"], "M" => [18, "\xb3g"], "N" => [77, "\xb3h"], "O" => [18, "\xb3h"], "P" => [77, "\xb3l"], "Q" => [18, "\xb3l"], "R" => [77, "\xb3m"], "S" => [18, "\xb3m"], "T" => [77, "\xb3n"], "U" => [18, "\xb3n"], "V" => [77, "\xb3p"], "W" => [18, "\xb3p"], "X" => [77, "\xb3r"], "Y" => [18, "\xb3r"], "Z" => [77, "\xb3u"], "[" => [18, "\xb3u"], "\\" => [0, "\xb3:"], "]" => [0, "\xb3B"], "^" => [0, "\xb3C"], "_" => [0, "\xb3D"], "`" => [0, "\xb3E"], "a" => [0, "\xb3F"], "b" => [0, "\xb3G"], "c" => [0, "\xb3H"], "d" => [0, "\xb3I"], "e" => [0, "\xb3J"], "f" => [0, "\xb3K"], "g" => [0, "\xb3L"], "h" => [0, "\xb3M"], "i" => [0, "\xb3N"], "j" => [0, "\xb3O"], "k" => [0, "\xb3P"], "l" => [0, "\xb3Q"], "m" => [0, "\xb3R"], "n" => [0, "\xb3S"], "o" => [0, "\xb3T"], "p" => [0, "\xb3U"], "q" => [0, "\xb3V"], "r" => [0, "\xb3W"], "s" => [0, "\xb3Y"], "t" => [0, "\xb3j"], "u" => [0, "\xb3k"], "v" => [0, "\xb3q"], "w" => [0, "\xb3v"], "x" => [0, "\xb3w"], "y" => [0, "\xb3x"], "z" => [0, "\xb3y"], "{" => [0, "\xb3z"], "|" => [82, "\xb3"], "}" => [87, "\xb3"], "~" => [130, "\xb3"], "" => [9, "\xb3"], "\x80" => [94, "\xd10"], "\x81" => [76, "\xd10"], "\x82" => [104, "\xd10"], "\x83" => [16, "\xd10"], "\x84" => [94, "\xd11"], "\x85" => [76, "\xd11"], "\x86" => [104, "\xd11"], "\x87" => [16, "\xd11"], "\x88" => [94, "\xd12"], "\x89" => [76, "\xd12"], "\x8a" => [104, "\xd12"], "\x8b" => [16, "\xd12"], "\x8c" => [94, "\xd1a"], "\x8d" => [76, "\xd1a"], "\x8e" => [104, "\xd1a"], "\x8f" => [16, "\xd1a"], "\x90" => [94, "\xd1c"], "\x91" => [76, "\xd1c"], "\x92" => [104, "\xd1c"], "\x93" => [16, "\xd1c"], "\x94" => [94, "\xd1e"], "\x95" => [76, "\xd1e"], "\x96" => [104, "\xd1e"], "\x97" => [16, "\xd1e"], "\x98" => [94, "\xd1i"], "\x99" => [76, "\xd1i"], "\x9a" => [104, "\xd1i"], "\x9b" => [16, "\xd1i"], "\x9c" => [94, "\xd1o"], "\x9d" => [76, "\xd1o"], "\x9e" => [104, "\xd1o"], "\x9f" => [16, "\xd1o"], "\xa0" => [94, "\xd1s"], "\xa1" => [76, "\xd1s"], "\xa2" => [104, "\xd1s"], "\xa3" => [16, "\xd1s"], "\xa4" => [94, "\xd1t"], "\xa5" => [76, "\xd1t"], "\xa6" => [104, "\xd1t"], "\xa7" => [16, "\xd1t"], "\xa8" => [77, "\xd1 "], "\xa9" => [18, "\xd1 "], "\xaa" => [77, "\xd1%"], "\xab" => [18, "\xd1%"], "\xac" => [77, "\xd1-"], "\xad" => [18, "\xd1-"], "\xae" => [77, "\xd1."], "\xaf" => [18, "\xd1."], "\xb0" => [77, "\xd1/"], "\xb1" => [18, "\xd1/"], "\xb2" => [77, "\xd13"], "\xb3" => [18, "\xd13"], "\xb4" => [77, "\xd14"], "\xb5" => [18, "\xd14"], "\xb6" => [77, "\xd15"], "\xb7" => [18, "\xd15"], "\xb8" => [77, "\xd16"], "\xb9" => [18, "\xd16"], "\xba" => [77, "\xd17"], "\xbb" => [18, "\xd17"], "\xbc" => [77, "\xd18"], "\xbd" => [18, "\xd18"], "\xbe" => [77, "\xd19"], "\xbf" => [18, "\xd19"], "\xc0" => [77, "\xd1="], "\xc1" => [18, "\xd1="], "\xc2" => [77, "\xd1A"], "\xc3" => [18, "\xd1A"], "\xc4" => [77, "\xd1_"], "\xc5" => [18, "\xd1_"], "\xc6" => [77, "\xd1b"], "\xc7" => [18, "\xd1b"], "\xc8" => [77, "\xd1d"], "\xc9" => [18, "\xd1d"], "\xca" => [77, "\xd1f"], "\xcb" => [18, "\xd1f"], "\xcc" => [77, "\xd1g"], "\xcd" => [18, "\xd1g"], "\xce" => [77, "\xd1h"], "\xcf" => [18, "\xd1h"], "\xd0" => [77, "\xd1l"], "\xd1" => [18, "\xd1l"], "\xd2" => [77, "\xd1m"], "\xd3" => [18, "\xd1m"], "\xd4" => [77, "\xd1n"], "\xd5" => [18, "\xd1n"], "\xd6" => [77, "\xd1p"], "\xd7" => [18, "\xd1p"], "\xd8" => [77, "\xd1r"], "\xd9" => [18, "\xd1r"], "\xda" => [77, "\xd1u"], "\xdb" => [18, "\xd1u"], "\xdc" => [0, "\xd1:"], "\xdd" => [0, "\xd1B"], "\xde" => [0, "\xd1C"], "\xdf" => [0, "\xd1D"], "\xe0" => [0, "\xd1E"], "\xe1" => [0, "\xd1F"], "\xe2" => [0, "\xd1G"], "\xe3" => [0, "\xd1H"], "\xe4" => [0, "\xd1I"], "\xe5" => [0, "\xd1J"], "\xe6" => [0, "\xd1K"], "\xe7" => [0, "\xd1L"], "\xe8" => [0, "\xd1M"], "\xe9" => [0, "\xd1N"], "\xea" => [0, "\xd1O"], "\xeb" => [0, "\xd1P"], "\xec" => [0, "\xd1Q"], "\xed" => [0, "\xd1R"], "\xee" => [0, "\xd1S"], "\xef" => [0, "\xd1T"], "\xf0" => [0, "\xd1U"], "\xf1" => [0, "\xd1V"], "\xf2" => [0, "\xd1W"], "\xf3" => [0, "\xd1Y"], "\xf4" => [0, "\xd1j"], "\xf5" => [0, "\xd1k"], "\xf6" => [0, "\xd1q"], "\xf7" => [0, "\xd1v"], "\xf8" => [0, "\xd1w"], "\xf9" => [0, "\xd1x"], "\xfa" => [0, "\xd1y"], "\xfb" => [0, "\xd1z"], "\xfc" => [82, "\xd1"], "\xfd" => [87, "\xd1"], "\xfe" => [130, "\xd1"], "\xff" => [9, "\xd1"]], ["\x00" => [94, "\xb60"], "\x01" => [76, "\xb60"], "\x02" => [104, "\xb60"], "\x03" => [16, "\xb60"], "\x04" => [94, "\xb61"], "\x05" => [76, "\xb61"], "\x06" => [104, "\xb61"], "\x07" => [16, "\xb61"], "\x08" => [94, "\xb62"], "\t" => [76, "\xb62"], "\n" => [104, "\xb62"], "\v" => [16, "\xb62"], "\f" => [94, "\xb6a"], "\r" => [76, "\xb6a"], "\x0e" => [104, "\xb6a"], "\x0f" => [16, "\xb6a"], "\x10" => [94, "\xb6c"], "\x11" => [76, "\xb6c"], "\x12" => [104, "\xb6c"], "\x13" => [16, "\xb6c"], "\x14" => [94, "\xb6e"], "\x15" => [76, "\xb6e"], "\x16" => [104, "\xb6e"], "\x17" => [16, "\xb6e"], "\x18" => [94, "\xb6i"], "\x19" => [76, "\xb6i"], "\x1a" => [104, "\xb6i"], "\x1b" => [16, "\xb6i"], "\x1c" => [94, "\xb6o"], "\x1d" => [76, "\xb6o"], "\x1e" => [104, "\xb6o"], "\x1f" => [16, "\xb6o"], " " => [94, "\xb6s"], "!" => [76, "\xb6s"], "\"" => [104, "\xb6s"], "#" => [16, "\xb6s"], "\$" => [94, "\xb6t"], "%" => [76, "\xb6t"], "&" => [104, "\xb6t"], "'" => [16, "\xb6t"], "(" => [77, "\xb6 "], ")" => [18, "\xb6 "], "*" => [77, "\xb6%"], "+" => [18, "\xb6%"], "," => [77, "\xb6-"], "-" => [18, "\xb6-"], "." => [77, "\xb6."], "/" => [18, "\xb6."], [77, "\xb6/"], [18, "\xb6/"], [77, "\xb63"], [18, "\xb63"], [77, "\xb64"], [18, "\xb64"], [77, "\xb65"], [18, "\xb65"], [77, "\xb66"], [18, "\xb66"], ":" => [77, "\xb67"], ";" => [18, "\xb67"], "<" => [77, "\xb68"], "=" => [18, "\xb68"], ">" => [77, "\xb69"], "?" => [18, "\xb69"], "@" => [77, "\xb6="], "A" => [18, "\xb6="], "B" => [77, "\xb6A"], "C" => [18, "\xb6A"], "D" => [77, "\xb6_"], "E" => [18, "\xb6_"], "F" => [77, "\xb6b"], "G" => [18, "\xb6b"], "H" => [77, "\xb6d"], "I" => [18, "\xb6d"], "J" => [77, "\xb6f"], "K" => [18, "\xb6f"], "L" => [77, "\xb6g"], "M" => [18, "\xb6g"], "N" => [77, "\xb6h"], "O" => [18, "\xb6h"], "P" => [77, "\xb6l"], "Q" => [18, "\xb6l"], "R" => [77, "\xb6m"], "S" => [18, "\xb6m"], "T" => [77, "\xb6n"], "U" => [18, "\xb6n"], "V" => [77, "\xb6p"], "W" => [18, "\xb6p"], "X" => [77, "\xb6r"], "Y" => [18, "\xb6r"], "Z" => [77, "\xb6u"], "[" => [18, "\xb6u"], "\\" => [0, "\xb6:"], "]" => [0, "\xb6B"], "^" => [0, "\xb6C"], "_" => [0, "\xb6D"], "`" => [0, "\xb6E"], "a" => [0, "\xb6F"], "b" => [0, "\xb6G"], "c" => [0, "\xb6H"], "d" => [0, "\xb6I"], "e" => [0, "\xb6J"], "f" => [0, "\xb6K"], "g" => [0, "\xb6L"], "h" => [0, "\xb6M"], "i" => [0, "\xb6N"], "j" => [0, "\xb6O"], "k" => [0, "\xb6P"], "l" => [0, "\xb6Q"], "m" => [0, "\xb6R"], "n" => [0, "\xb6S"], "o" => [0, "\xb6T"], "p" => [0, "\xb6U"], "q" => [0, "\xb6V"], "r" => [0, "\xb6W"], "s" => [0, "\xb6Y"], "t" => [0, "\xb6j"], "u" => [0, "\xb6k"], "v" => [0, "\xb6q"], "w" => [0, "\xb6v"], "x" => [0, "\xb6w"], "y" => [0, "\xb6x"], "z" => [0, "\xb6y"], "{" => [0, "\xb6z"], "|" => [82, "\xb6"], "}" => [87, "\xb6"], "~" => [130, "\xb6"], "" => [9, "\xb6"], "\x80" => [94, "\xb70"], "\x81" => [76, "\xb70"], "\x82" => [104, "\xb70"], "\x83" => [16, "\xb70"], "\x84" => [94, "\xb71"], "\x85" => [76, "\xb71"], "\x86" => [104, "\xb71"], "\x87" => [16, "\xb71"], "\x88" => [94, "\xb72"], "\x89" => [76, "\xb72"], "\x8a" => [104, "\xb72"], "\x8b" => [16, "\xb72"], "\x8c" => [94, "\xb7a"], "\x8d" => [76, "\xb7a"], "\x8e" => [104, "\xb7a"], "\x8f" => [16, "\xb7a"], "\x90" => [94, "\xb7c"], "\x91" => [76, "\xb7c"], "\x92" => [104, "\xb7c"], "\x93" => [16, "\xb7c"], "\x94" => [94, "\xb7e"], "\x95" => [76, "\xb7e"], "\x96" => [104, "\xb7e"], "\x97" => [16, "\xb7e"], "\x98" => [94, "\xb7i"], "\x99" => [76, "\xb7i"], "\x9a" => [104, "\xb7i"], "\x9b" => [16, "\xb7i"], "\x9c" => [94, "\xb7o"], "\x9d" => [76, "\xb7o"], "\x9e" => [104, "\xb7o"], "\x9f" => [16, "\xb7o"], "\xa0" => [94, "\xb7s"], "\xa1" => [76, "\xb7s"], "\xa2" => [104, "\xb7s"], "\xa3" => [16, "\xb7s"], "\xa4" => [94, "\xb7t"], "\xa5" => [76, "\xb7t"], "\xa6" => [104, "\xb7t"], "\xa7" => [16, "\xb7t"], "\xa8" => [77, "\xb7 "], "\xa9" => [18, "\xb7 "], "\xaa" => [77, "\xb7%"], "\xab" => [18, "\xb7%"], "\xac" => [77, "\xb7-"], "\xad" => [18, "\xb7-"], "\xae" => [77, "\xb7."], "\xaf" => [18, "\xb7."], "\xb0" => [77, "\xb7/"], "\xb1" => [18, "\xb7/"], "\xb2" => [77, "\xb73"], "\xb3" => [18, "\xb73"], "\xb4" => [77, "\xb74"], "\xb5" => [18, "\xb74"], "\xb6" => [77, "\xb75"], "\xb7" => [18, "\xb75"], "\xb8" => [77, "\xb76"], "\xb9" => [18, "\xb76"], "\xba" => [77, "\xb77"], "\xbb" => [18, "\xb77"], "\xbc" => [77, "\xb78"], "\xbd" => [18, "\xb78"], "\xbe" => [77, "\xb79"], "\xbf" => [18, "\xb79"], "\xc0" => [77, "\xb7="], "\xc1" => [18, "\xb7="], "\xc2" => [77, "\xb7A"], "\xc3" => [18, "\xb7A"], "\xc4" => [77, "\xb7_"], "\xc5" => [18, "\xb7_"], "\xc6" => [77, "\xb7b"], "\xc7" => [18, "\xb7b"], "\xc8" => [77, "\xb7d"], "\xc9" => [18, "\xb7d"], "\xca" => [77, "\xb7f"], "\xcb" => [18, "\xb7f"], "\xcc" => [77, "\xb7g"], "\xcd" => [18, "\xb7g"], "\xce" => [77, "\xb7h"], "\xcf" => [18, "\xb7h"], "\xd0" => [77, "\xb7l"], "\xd1" => [18, "\xb7l"], "\xd2" => [77, "\xb7m"], "\xd3" => [18, "\xb7m"], "\xd4" => [77, "\xb7n"], "\xd5" => [18, "\xb7n"], "\xd6" => [77, "\xb7p"], "\xd7" => [18, "\xb7p"], "\xd8" => [77, "\xb7r"], "\xd9" => [18, "\xb7r"], "\xda" => [77, "\xb7u"], "\xdb" => [18, "\xb7u"], "\xdc" => [0, "\xb7:"], "\xdd" => [0, "\xb7B"], "\xde" => [0, "\xb7C"], "\xdf" => [0, "\xb7D"], "\xe0" => [0, "\xb7E"], "\xe1" => [0, "\xb7F"], "\xe2" => [0, "\xb7G"], "\xe3" => [0, "\xb7H"], "\xe4" => [0, "\xb7I"], "\xe5" => [0, "\xb7J"], "\xe6" => [0, "\xb7K"], "\xe7" => [0, "\xb7L"], "\xe8" => [0, "\xb7M"], "\xe9" => [0, "\xb7N"], "\xea" => [0, "\xb7O"], "\xeb" => [0, "\xb7P"], "\xec" => [0, "\xb7Q"], "\xed" => [0, "\xb7R"], "\xee" => [0, "\xb7S"], "\xef" => [0, "\xb7T"], "\xf0" => [0, "\xb7U"], "\xf1" => [0, "\xb7V"], "\xf2" => [0, "\xb7W"], "\xf3" => [0, "\xb7Y"], "\xf4" => [0, "\xb7j"], "\xf5" => [0, "\xb7k"], "\xf6" => [0, "\xb7q"], "\xf7" => [0, "\xb7v"], "\xf8" => [0, "\xb7w"], "\xf9" => [0, "\xb7x"], "\xfa" => [0, "\xb7y"], "\xfb" => [0, "\xb7z"], "\xfc" => [82, "\xb7"], "\xfd" => [87, "\xb7"], "\xfe" => [130, "\xb7"], "\xff" => [9, "\xb7"]], ["\x00" => [94, "\xb80"], "\x01" => [76, "\xb80"], "\x02" => [104, "\xb80"], "\x03" => [16, "\xb80"], "\x04" => [94, "\xb81"], "\x05" => [76, "\xb81"], "\x06" => [104, "\xb81"], "\x07" => [16, "\xb81"], "\x08" => [94, "\xb82"], "\t" => [76, "\xb82"], "\n" => [104, "\xb82"], "\v" => [16, "\xb82"], "\f" => [94, "\xb8a"], "\r" => [76, "\xb8a"], "\x0e" => [104, "\xb8a"], "\x0f" => [16, "\xb8a"], "\x10" => [94, "\xb8c"], "\x11" => [76, "\xb8c"], "\x12" => [104, "\xb8c"], "\x13" => [16, "\xb8c"], "\x14" => [94, "\xb8e"], "\x15" => [76, "\xb8e"], "\x16" => [104, "\xb8e"], "\x17" => [16, "\xb8e"], "\x18" => [94, "\xb8i"], "\x19" => [76, "\xb8i"], "\x1a" => [104, "\xb8i"], "\x1b" => [16, "\xb8i"], "\x1c" => [94, "\xb8o"], "\x1d" => [76, "\xb8o"], "\x1e" => [104, "\xb8o"], "\x1f" => [16, "\xb8o"], " " => [94, "\xb8s"], "!" => [76, "\xb8s"], "\"" => [104, "\xb8s"], "#" => [16, "\xb8s"], "\$" => [94, "\xb8t"], "%" => [76, "\xb8t"], "&" => [104, "\xb8t"], "'" => [16, "\xb8t"], "(" => [77, "\xb8 "], ")" => [18, "\xb8 "], "*" => [77, "\xb8%"], "+" => [18, "\xb8%"], "," => [77, "\xb8-"], "-" => [18, "\xb8-"], "." => [77, "\xb8."], "/" => [18, "\xb8."], [77, "\xb8/"], [18, "\xb8/"], [77, "\xb83"], [18, "\xb83"], [77, "\xb84"], [18, "\xb84"], [77, "\xb85"], [18, "\xb85"], [77, "\xb86"], [18, "\xb86"], ":" => [77, "\xb87"], ";" => [18, "\xb87"], "<" => [77, "\xb88"], "=" => [18, "\xb88"], ">" => [77, "\xb89"], "?" => [18, "\xb89"], "@" => [77, "\xb8="], "A" => [18, "\xb8="], "B" => [77, "\xb8A"], "C" => [18, "\xb8A"], "D" => [77, "\xb8_"], "E" => [18, "\xb8_"], "F" => [77, "\xb8b"], "G" => [18, "\xb8b"], "H" => [77, "\xb8d"], "I" => [18, "\xb8d"], "J" => [77, "\xb8f"], "K" => [18, "\xb8f"], "L" => [77, "\xb8g"], "M" => [18, "\xb8g"], "N" => [77, "\xb8h"], "O" => [18, "\xb8h"], "P" => [77, "\xb8l"], "Q" => [18, "\xb8l"], "R" => [77, "\xb8m"], "S" => [18, "\xb8m"], "T" => [77, "\xb8n"], "U" => [18, "\xb8n"], "V" => [77, "\xb8p"], "W" => [18, "\xb8p"], "X" => [77, "\xb8r"], "Y" => [18, "\xb8r"], "Z" => [77, "\xb8u"], "[" => [18, "\xb8u"], "\\" => [0, "\xb8:"], "]" => [0, "\xb8B"], "^" => [0, "\xb8C"], "_" => [0, "\xb8D"], "`" => [0, "\xb8E"], "a" => [0, "\xb8F"], "b" => [0, "\xb8G"], "c" => [0, "\xb8H"], "d" => [0, "\xb8I"], "e" => [0, "\xb8J"], "f" => [0, "\xb8K"], "g" => [0, "\xb8L"], "h" => [0, "\xb8M"], "i" => [0, "\xb8N"], "j" => [0, "\xb8O"], "k" => [0, "\xb8P"], "l" => [0, "\xb8Q"], "m" => [0, "\xb8R"], "n" => [0, "\xb8S"], "o" => [0, "\xb8T"], "p" => [0, "\xb8U"], "q" => [0, "\xb8V"], "r" => [0, "\xb8W"], "s" => [0, "\xb8Y"], "t" => [0, "\xb8j"], "u" => [0, "\xb8k"], "v" => [0, "\xb8q"], "w" => [0, "\xb8v"], "x" => [0, "\xb8w"], "y" => [0, "\xb8x"], "z" => [0, "\xb8y"], "{" => [0, "\xb8z"], "|" => [82, "\xb8"], "}" => [87, "\xb8"], "~" => [130, "\xb8"], "" => [9, "\xb8"], "\x80" => [94, "\xc20"], "\x81" => [76, "\xc20"], "\x82" => [104, "\xc20"], "\x83" => [16, "\xc20"], "\x84" => [94, "\xc21"], "\x85" => [76, "\xc21"], "\x86" => [104, "\xc21"], "\x87" => [16, "\xc21"], "\x88" => [94, "\xc22"], "\x89" => [76, "\xc22"], "\x8a" => [104, "\xc22"], "\x8b" => [16, "\xc22"], "\x8c" => [94, "\xc2a"], "\x8d" => [76, "\xc2a"], "\x8e" => [104, "\xc2a"], "\x8f" => [16, "\xc2a"], "\x90" => [94, "\xc2c"], "\x91" => [76, "\xc2c"], "\x92" => [104, "\xc2c"], "\x93" => [16, "\xc2c"], "\x94" => [94, "\xc2e"], "\x95" => [76, "\xc2e"], "\x96" => [104, "\xc2e"], "\x97" => [16, "\xc2e"], "\x98" => [94, "\xc2i"], "\x99" => [76, "\xc2i"], "\x9a" => [104, "\xc2i"], "\x9b" => [16, "\xc2i"], "\x9c" => [94, "\xc2o"], "\x9d" => [76, "\xc2o"], "\x9e" => [104, "\xc2o"], "\x9f" => [16, "\xc2o"], "\xa0" => [94, "\xc2s"], "\xa1" => [76, "\xc2s"], "\xa2" => [104, "\xc2s"], "\xa3" => [16, "\xc2s"], "\xa4" => [94, "\xc2t"], "\xa5" => [76, "\xc2t"], "\xa6" => [104, "\xc2t"], "\xa7" => [16, "\xc2t"], "\xa8" => [77, "\xc2 "], "\xa9" => [18, "\xc2 "], "\xaa" => [77, "\xc2%"], "\xab" => [18, "\xc2%"], "\xac" => [77, "\xc2-"], "\xad" => [18, "\xc2-"], "\xae" => [77, "\xc2."], "\xaf" => [18, "\xc2."], "\xb0" => [77, "\xc2/"], "\xb1" => [18, "\xc2/"], "\xb2" => [77, "\xc23"], "\xb3" => [18, "\xc23"], "\xb4" => [77, "\xc24"], "\xb5" => [18, "\xc24"], "\xb6" => [77, "\xc25"], "\xb7" => [18, "\xc25"], "\xb8" => [77, "\xc26"], "\xb9" => [18, "\xc26"], "\xba" => [77, "\xc27"], "\xbb" => [18, "\xc27"], "\xbc" => [77, "\xc28"], "\xbd" => [18, "\xc28"], "\xbe" => [77, "\xc29"], "\xbf" => [18, "\xc29"], "\xc0" => [77, "\xc2="], "\xc1" => [18, "\xc2="], "\xc2" => [77, "\xc2A"], "\xc3" => [18, "\xc2A"], "\xc4" => [77, "\xc2_"], "\xc5" => [18, "\xc2_"], "\xc6" => [77, "\xc2b"], "\xc7" => [18, "\xc2b"], "\xc8" => [77, "\xc2d"], "\xc9" => [18, "\xc2d"], "\xca" => [77, "\xc2f"], "\xcb" => [18, "\xc2f"], "\xcc" => [77, "\xc2g"], "\xcd" => [18, "\xc2g"], "\xce" => [77, "\xc2h"], "\xcf" => [18, "\xc2h"], "\xd0" => [77, "\xc2l"], "\xd1" => [18, "\xc2l"], "\xd2" => [77, "\xc2m"], "\xd3" => [18, "\xc2m"], "\xd4" => [77, "\xc2n"], "\xd5" => [18, "\xc2n"], "\xd6" => [77, "\xc2p"], "\xd7" => [18, "\xc2p"], "\xd8" => [77, "\xc2r"], "\xd9" => [18, "\xc2r"], "\xda" => [77, "\xc2u"], "\xdb" => [18, "\xc2u"], "\xdc" => [0, "\xc2:"], "\xdd" => [0, "\xc2B"], "\xde" => [0, "\xc2C"], "\xdf" => [0, "\xc2D"], "\xe0" => [0, "\xc2E"], "\xe1" => [0, "\xc2F"], "\xe2" => [0, "\xc2G"], "\xe3" => [0, "\xc2H"], "\xe4" => [0, "\xc2I"], "\xe5" => [0, "\xc2J"], "\xe6" => [0, "\xc2K"], "\xe7" => [0, "\xc2L"], "\xe8" => [0, "\xc2M"], "\xe9" => [0, "\xc2N"], "\xea" => [0, "\xc2O"], "\xeb" => [0, "\xc2P"], "\xec" => [0, "\xc2Q"], "\xed" => [0, "\xc2R"], "\xee" => [0, "\xc2S"], "\xef" => [0, "\xc2T"], "\xf0" => [0, "\xc2U"], "\xf1" => [0, "\xc2V"], "\xf2" => [0, "\xc2W"], "\xf3" => [0, "\xc2Y"], "\xf4" => [0, "\xc2j"], "\xf5" => [0, "\xc2k"], "\xf6" => [0, "\xc2q"], "\xf7" => [0, "\xc2v"], "\xf8" => [0, "\xc2w"], "\xf9" => [0, "\xc2x"], "\xfa" => [0, "\xc2y"], "\xfb" => [0, "\xc2z"], "\xfc" => [82, "\xc2"], "\xfd" => [87, "\xc2"], "\xfe" => [130, "\xc2"], "\xff" => [9, "\xc2"]], ["\x00" => [94, "\xb90"], "\x01" => [76, "\xb90"], "\x02" => [104, "\xb90"], "\x03" => [16, "\xb90"], "\x04" => [94, "\xb91"], "\x05" => [76, "\xb91"], "\x06" => [104, "\xb91"], "\x07" => [16, "\xb91"], "\x08" => [94, "\xb92"], "\t" => [76, "\xb92"], "\n" => [104, "\xb92"], "\v" => [16, "\xb92"], "\f" => [94, "\xb9a"], "\r" => [76, "\xb9a"], "\x0e" => [104, "\xb9a"], "\x0f" => [16, "\xb9a"], "\x10" => [94, "\xb9c"], "\x11" => [76, "\xb9c"], "\x12" => [104, "\xb9c"], "\x13" => [16, "\xb9c"], "\x14" => [94, "\xb9e"], "\x15" => [76, "\xb9e"], "\x16" => [104, "\xb9e"], "\x17" => [16, "\xb9e"], "\x18" => [94, "\xb9i"], "\x19" => [76, "\xb9i"], "\x1a" => [104, "\xb9i"], "\x1b" => [16, "\xb9i"], "\x1c" => [94, "\xb9o"], "\x1d" => [76, "\xb9o"], "\x1e" => [104, "\xb9o"], "\x1f" => [16, "\xb9o"], " " => [94, "\xb9s"], "!" => [76, "\xb9s"], "\"" => [104, "\xb9s"], "#" => [16, "\xb9s"], "\$" => [94, "\xb9t"], "%" => [76, "\xb9t"], "&" => [104, "\xb9t"], "'" => [16, "\xb9t"], "(" => [77, "\xb9 "], ")" => [18, "\xb9 "], "*" => [77, "\xb9%"], "+" => [18, "\xb9%"], "," => [77, "\xb9-"], "-" => [18, "\xb9-"], "." => [77, "\xb9."], "/" => [18, "\xb9."], [77, "\xb9/"], [18, "\xb9/"], [77, "\xb93"], [18, "\xb93"], [77, "\xb94"], [18, "\xb94"], [77, "\xb95"], [18, "\xb95"], [77, "\xb96"], [18, "\xb96"], ":" => [77, "\xb97"], ";" => [18, "\xb97"], "<" => [77, "\xb98"], "=" => [18, "\xb98"], ">" => [77, "\xb99"], "?" => [18, "\xb99"], "@" => [77, "\xb9="], "A" => [18, "\xb9="], "B" => [77, "\xb9A"], "C" => [18, "\xb9A"], "D" => [77, "\xb9_"], "E" => [18, "\xb9_"], "F" => [77, "\xb9b"], "G" => [18, "\xb9b"], "H" => [77, "\xb9d"], "I" => [18, "\xb9d"], "J" => [77, "\xb9f"], "K" => [18, "\xb9f"], "L" => [77, "\xb9g"], "M" => [18, "\xb9g"], "N" => [77, "\xb9h"], "O" => [18, "\xb9h"], "P" => [77, "\xb9l"], "Q" => [18, "\xb9l"], "R" => [77, "\xb9m"], "S" => [18, "\xb9m"], "T" => [77, "\xb9n"], "U" => [18, "\xb9n"], "V" => [77, "\xb9p"], "W" => [18, "\xb9p"], "X" => [77, "\xb9r"], "Y" => [18, "\xb9r"], "Z" => [77, "\xb9u"], "[" => [18, "\xb9u"], "\\" => [0, "\xb9:"], "]" => [0, "\xb9B"], "^" => [0, "\xb9C"], "_" => [0, "\xb9D"], "`" => [0, "\xb9E"], "a" => [0, "\xb9F"], "b" => [0, "\xb9G"], "c" => [0, "\xb9H"], "d" => [0, "\xb9I"], "e" => [0, "\xb9J"], "f" => [0, "\xb9K"], "g" => [0, "\xb9L"], "h" => [0, "\xb9M"], "i" => [0, "\xb9N"], "j" => [0, "\xb9O"], "k" => [0, "\xb9P"], "l" => [0, "\xb9Q"], "m" => [0, "\xb9R"], "n" => [0, "\xb9S"], "o" => [0, "\xb9T"], "p" => [0, "\xb9U"], "q" => [0, "\xb9V"], "r" => [0, "\xb9W"], "s" => [0, "\xb9Y"], "t" => [0, "\xb9j"], "u" => [0, "\xb9k"], "v" => [0, "\xb9q"], "w" => [0, "\xb9v"], "x" => [0, "\xb9w"], "y" => [0, "\xb9x"], "z" => [0, "\xb9y"], "{" => [0, "\xb9z"], "|" => [82, "\xb9"], "}" => [87, "\xb9"], "~" => [130, "\xb9"], "" => [9, "\xb9"], "\x80" => [94, "\xba0"], "\x81" => [76, "\xba0"], "\x82" => [104, "\xba0"], "\x83" => [16, "\xba0"], "\x84" => [94, "\xba1"], "\x85" => [76, "\xba1"], "\x86" => [104, "\xba1"], "\x87" => [16, "\xba1"], "\x88" => [94, "\xba2"], "\x89" => [76, "\xba2"], "\x8a" => [104, "\xba2"], "\x8b" => [16, "\xba2"], "\x8c" => [94, "\xbaa"], "\x8d" => [76, "\xbaa"], "\x8e" => [104, "\xbaa"], "\x8f" => [16, "\xbaa"], "\x90" => [94, "\xbac"], "\x91" => [76, "\xbac"], "\x92" => [104, "\xbac"], "\x93" => [16, "\xbac"], "\x94" => [94, "\xbae"], "\x95" => [76, "\xbae"], "\x96" => [104, "\xbae"], "\x97" => [16, "\xbae"], "\x98" => [94, "\xbai"], "\x99" => [76, "\xbai"], "\x9a" => [104, "\xbai"], "\x9b" => [16, "\xbai"], "\x9c" => [94, "\xbao"], "\x9d" => [76, "\xbao"], "\x9e" => [104, "\xbao"], "\x9f" => [16, "\xbao"], "\xa0" => [94, "\xbas"], "\xa1" => [76, "\xbas"], "\xa2" => [104, "\xbas"], "\xa3" => [16, "\xbas"], "\xa4" => [94, "\xbat"], "\xa5" => [76, "\xbat"], "\xa6" => [104, "\xbat"], "\xa7" => [16, "\xbat"], "\xa8" => [77, "\xba "], "\xa9" => [18, "\xba "], "\xaa" => [77, "\xba%"], "\xab" => [18, "\xba%"], "\xac" => [77, "\xba-"], "\xad" => [18, "\xba-"], "\xae" => [77, "\xba."], "\xaf" => [18, "\xba."], "\xb0" => [77, "\xba/"], "\xb1" => [18, "\xba/"], "\xb2" => [77, "\xba3"], "\xb3" => [18, "\xba3"], "\xb4" => [77, "\xba4"], "\xb5" => [18, "\xba4"], "\xb6" => [77, "\xba5"], "\xb7" => [18, "\xba5"], "\xb8" => [77, "\xba6"], "\xb9" => [18, "\xba6"], "\xba" => [77, "\xba7"], "\xbb" => [18, "\xba7"], "\xbc" => [77, "\xba8"], "\xbd" => [18, "\xba8"], "\xbe" => [77, "\xba9"], "\xbf" => [18, "\xba9"], "\xc0" => [77, "\xba="], "\xc1" => [18, "\xba="], "\xc2" => [77, "\xbaA"], "\xc3" => [18, "\xbaA"], "\xc4" => [77, "\xba_"], "\xc5" => [18, "\xba_"], "\xc6" => [77, "\xbab"], "\xc7" => [18, "\xbab"], "\xc8" => [77, "\xbad"], "\xc9" => [18, "\xbad"], "\xca" => [77, "\xbaf"], "\xcb" => [18, "\xbaf"], "\xcc" => [77, "\xbag"], "\xcd" => [18, "\xbag"], "\xce" => [77, "\xbah"], "\xcf" => [18, "\xbah"], "\xd0" => [77, "\xbal"], "\xd1" => [18, "\xbal"], "\xd2" => [77, "\xbam"], "\xd3" => [18, "\xbam"], "\xd4" => [77, "\xban"], "\xd5" => [18, "\xban"], "\xd6" => [77, "\xbap"], "\xd7" => [18, "\xbap"], "\xd8" => [77, "\xbar"], "\xd9" => [18, "\xbar"], "\xda" => [77, "\xbau"], "\xdb" => [18, "\xbau"], "\xdc" => [0, "\xba:"], "\xdd" => [0, "\xbaB"], "\xde" => [0, "\xbaC"], "\xdf" => [0, "\xbaD"], "\xe0" => [0, "\xbaE"], "\xe1" => [0, "\xbaF"], "\xe2" => [0, "\xbaG"], "\xe3" => [0, "\xbaH"], "\xe4" => [0, "\xbaI"], "\xe5" => [0, "\xbaJ"], "\xe6" => [0, "\xbaK"], "\xe7" => [0, "\xbaL"], "\xe8" => [0, "\xbaM"], "\xe9" => [0, "\xbaN"], "\xea" => [0, "\xbaO"], "\xeb" => [0, "\xbaP"], "\xec" => [0, "\xbaQ"], "\xed" => [0, "\xbaR"], "\xee" => [0, "\xbaS"], "\xef" => [0, "\xbaT"], "\xf0" => [0, "\xbaU"], "\xf1" => [0, "\xbaV"], "\xf2" => [0, "\xbaW"], "\xf3" => [0, "\xbaY"], "\xf4" => [0, "\xbaj"], "\xf5" => [0, "\xbak"], "\xf6" => [0, "\xbaq"], "\xf7" => [0, "\xbav"], "\xf8" => [0, "\xbaw"], "\xf9" => [0, "\xbax"], "\xfa" => [0, "\xbay"], "\xfb" => [0, "\xbaz"], "\xfc" => [82, "\xba"], "\xfd" => [87, "\xba"], "\xfe" => [130, "\xba"], "\xff" => [9, "\xba"]], ["\x00" => [94, "\xbb0"], "\x01" => [76, "\xbb0"], "\x02" => [104, "\xbb0"], "\x03" => [16, "\xbb0"], "\x04" => [94, "\xbb1"], "\x05" => [76, "\xbb1"], "\x06" => [104, "\xbb1"], "\x07" => [16, "\xbb1"], "\x08" => [94, "\xbb2"], "\t" => [76, "\xbb2"], "\n" => [104, "\xbb2"], "\v" => [16, "\xbb2"], "\f" => [94, "\xbba"], "\r" => [76, "\xbba"], "\x0e" => [104, "\xbba"], "\x0f" => [16, "\xbba"], "\x10" => [94, "\xbbc"], "\x11" => [76, "\xbbc"], "\x12" => [104, "\xbbc"], "\x13" => [16, "\xbbc"], "\x14" => [94, "\xbbe"], "\x15" => [76, "\xbbe"], "\x16" => [104, "\xbbe"], "\x17" => [16, "\xbbe"], "\x18" => [94, "\xbbi"], "\x19" => [76, "\xbbi"], "\x1a" => [104, "\xbbi"], "\x1b" => [16, "\xbbi"], "\x1c" => [94, "\xbbo"], "\x1d" => [76, "\xbbo"], "\x1e" => [104, "\xbbo"], "\x1f" => [16, "\xbbo"], " " => [94, "\xbbs"], "!" => [76, "\xbbs"], "\"" => [104, "\xbbs"], "#" => [16, "\xbbs"], "\$" => [94, "\xbbt"], "%" => [76, "\xbbt"], "&" => [104, "\xbbt"], "'" => [16, "\xbbt"], "(" => [77, "\xbb "], ")" => [18, "\xbb "], "*" => [77, "\xbb%"], "+" => [18, "\xbb%"], "," => [77, "\xbb-"], "-" => [18, "\xbb-"], "." => [77, "\xbb."], "/" => [18, "\xbb."], [77, "\xbb/"], [18, "\xbb/"], [77, "\xbb3"], [18, "\xbb3"], [77, "\xbb4"], [18, "\xbb4"], [77, "\xbb5"], [18, "\xbb5"], [77, "\xbb6"], [18, "\xbb6"], ":" => [77, "\xbb7"], ";" => [18, "\xbb7"], "<" => [77, "\xbb8"], "=" => [18, "\xbb8"], ">" => [77, "\xbb9"], "?" => [18, "\xbb9"], "@" => [77, "\xbb="], "A" => [18, "\xbb="], "B" => [77, "\xbbA"], "C" => [18, "\xbbA"], "D" => [77, "\xbb_"], "E" => [18, "\xbb_"], "F" => [77, "\xbbb"], "G" => [18, "\xbbb"], "H" => [77, "\xbbd"], "I" => [18, "\xbbd"], "J" => [77, "\xbbf"], "K" => [18, "\xbbf"], "L" => [77, "\xbbg"], "M" => [18, "\xbbg"], "N" => [77, "\xbbh"], "O" => [18, "\xbbh"], "P" => [77, "\xbbl"], "Q" => [18, "\xbbl"], "R" => [77, "\xbbm"], "S" => [18, "\xbbm"], "T" => [77, "\xbbn"], "U" => [18, "\xbbn"], "V" => [77, "\xbbp"], "W" => [18, "\xbbp"], "X" => [77, "\xbbr"], "Y" => [18, "\xbbr"], "Z" => [77, "\xbbu"], "[" => [18, "\xbbu"], "\\" => [0, "\xbb:"], "]" => [0, "\xbbB"], "^" => [0, "\xbbC"], "_" => [0, "\xbbD"], "`" => [0, "\xbbE"], "a" => [0, "\xbbF"], "b" => [0, "\xbbG"], "c" => [0, "\xbbH"], "d" => [0, "\xbbI"], "e" => [0, "\xbbJ"], "f" => [0, "\xbbK"], "g" => [0, "\xbbL"], "h" => [0, "\xbbM"], "i" => [0, "\xbbN"], "j" => [0, "\xbbO"], "k" => [0, "\xbbP"], "l" => [0, "\xbbQ"], "m" => [0, "\xbbR"], "n" => [0, "\xbbS"], "o" => [0, "\xbbT"], "p" => [0, "\xbbU"], "q" => [0, "\xbbV"], "r" => [0, "\xbbW"], "s" => [0, "\xbbY"], "t" => [0, "\xbbj"], "u" => [0, "\xbbk"], "v" => [0, "\xbbq"], "w" => [0, "\xbbv"], "x" => [0, "\xbbw"], "y" => [0, "\xbbx"], "z" => [0, "\xbby"], "{" => [0, "\xbbz"], "|" => [82, "\xbb"], "}" => [87, "\xbb"], "~" => [130, "\xbb"], "" => [9, "\xbb"], "\x80" => [94, "\xbd0"], "\x81" => [76, "\xbd0"], "\x82" => [104, "\xbd0"], "\x83" => [16, "\xbd0"], "\x84" => [94, "\xbd1"], "\x85" => [76, "\xbd1"], "\x86" => [104, "\xbd1"], "\x87" => [16, "\xbd1"], "\x88" => [94, "\xbd2"], "\x89" => [76, "\xbd2"], "\x8a" => [104, "\xbd2"], "\x8b" => [16, "\xbd2"], "\x8c" => [94, "\xbda"], "\x8d" => [76, "\xbda"], "\x8e" => [104, "\xbda"], "\x8f" => [16, "\xbda"], "\x90" => [94, "\xbdc"], "\x91" => [76, "\xbdc"], "\x92" => [104, "\xbdc"], "\x93" => [16, "\xbdc"], "\x94" => [94, "\xbde"], "\x95" => [76, "\xbde"], "\x96" => [104, "\xbde"], "\x97" => [16, "\xbde"], "\x98" => [94, "\xbdi"], "\x99" => [76, "\xbdi"], "\x9a" => [104, "\xbdi"], "\x9b" => [16, "\xbdi"], "\x9c" => [94, "\xbdo"], "\x9d" => [76, "\xbdo"], "\x9e" => [104, "\xbdo"], "\x9f" => [16, "\xbdo"], "\xa0" => [94, "\xbds"], "\xa1" => [76, "\xbds"], "\xa2" => [104, "\xbds"], "\xa3" => [16, "\xbds"], "\xa4" => [94, "\xbdt"], "\xa5" => [76, "\xbdt"], "\xa6" => [104, "\xbdt"], "\xa7" => [16, "\xbdt"], "\xa8" => [77, "\xbd "], "\xa9" => [18, "\xbd "], "\xaa" => [77, "\xbd%"], "\xab" => [18, "\xbd%"], "\xac" => [77, "\xbd-"], "\xad" => [18, "\xbd-"], "\xae" => [77, "\xbd."], "\xaf" => [18, "\xbd."], "\xb0" => [77, "\xbd/"], "\xb1" => [18, "\xbd/"], "\xb2" => [77, "\xbd3"], "\xb3" => [18, "\xbd3"], "\xb4" => [77, "\xbd4"], "\xb5" => [18, "\xbd4"], "\xb6" => [77, "\xbd5"], "\xb7" => [18, "\xbd5"], "\xb8" => [77, "\xbd6"], "\xb9" => [18, "\xbd6"], "\xba" => [77, "\xbd7"], "\xbb" => [18, "\xbd7"], "\xbc" => [77, "\xbd8"], "\xbd" => [18, "\xbd8"], "\xbe" => [77, "\xbd9"], "\xbf" => [18, "\xbd9"], "\xc0" => [77, "\xbd="], "\xc1" => [18, "\xbd="], "\xc2" => [77, "\xbdA"], "\xc3" => [18, "\xbdA"], "\xc4" => [77, "\xbd_"], "\xc5" => [18, "\xbd_"], "\xc6" => [77, "\xbdb"], "\xc7" => [18, "\xbdb"], "\xc8" => [77, "\xbdd"], "\xc9" => [18, "\xbdd"], "\xca" => [77, "\xbdf"], "\xcb" => [18, "\xbdf"], "\xcc" => [77, "\xbdg"], "\xcd" => [18, "\xbdg"], "\xce" => [77, "\xbdh"], "\xcf" => [18, "\xbdh"], "\xd0" => [77, "\xbdl"], "\xd1" => [18, "\xbdl"], "\xd2" => [77, "\xbdm"], "\xd3" => [18, "\xbdm"], "\xd4" => [77, "\xbdn"], "\xd5" => [18, "\xbdn"], "\xd6" => [77, "\xbdp"], "\xd7" => [18, "\xbdp"], "\xd8" => [77, "\xbdr"], "\xd9" => [18, "\xbdr"], "\xda" => [77, "\xbdu"], "\xdb" => [18, "\xbdu"], "\xdc" => [0, "\xbd:"], "\xdd" => [0, "\xbdB"], "\xde" => [0, "\xbdC"], "\xdf" => [0, "\xbdD"], "\xe0" => [0, "\xbdE"], "\xe1" => [0, "\xbdF"], "\xe2" => [0, "\xbdG"], "\xe3" => [0, "\xbdH"], "\xe4" => [0, "\xbdI"], "\xe5" => [0, "\xbdJ"], "\xe6" => [0, "\xbdK"], "\xe7" => [0, "\xbdL"], "\xe8" => [0, "\xbdM"], "\xe9" => [0, "\xbdN"], "\xea" => [0, "\xbdO"], "\xeb" => [0, "\xbdP"], "\xec" => [0, "\xbdQ"], "\xed" => [0, "\xbdR"], "\xee" => [0, "\xbdS"], "\xef" => [0, "\xbdT"], "\xf0" => [0, "\xbdU"], "\xf1" => [0, "\xbdV"], "\xf2" => [0, "\xbdW"], "\xf3" => [0, "\xbdY"], "\xf4" => [0, "\xbdj"], "\xf5" => [0, "\xbdk"], "\xf6" => [0, "\xbdq"], "\xf7" => [0, "\xbdv"], "\xf8" => [0, "\xbdw"], "\xf9" => [0, "\xbdx"], "\xfa" => [0, "\xbdy"], "\xfb" => [0, "\xbdz"], "\xfc" => [82, "\xbd"], "\xfd" => [87, "\xbd"], "\xfe" => [130, "\xbd"], "\xff" => [9, "\xbd"]], ["\x00" => [77, "\xbb0"], "\x01" => [18, "\xbb0"], "\x02" => [77, "\xbb1"], "\x03" => [18, "\xbb1"], "\x04" => [77, "\xbb2"], "\x05" => [18, "\xbb2"], "\x06" => [77, "\xbba"], "\x07" => [18, "\xbba"], "\x08" => [77, "\xbbc"], "\t" => [18, "\xbbc"], "\n" => [77, "\xbbe"], "\v" => [18, "\xbbe"], "\f" => [77, "\xbbi"], "\r" => [18, "\xbbi"], "\x0e" => [77, "\xbbo"], "\x0f" => [18, "\xbbo"], "\x10" => [77, "\xbbs"], "\x11" => [18, "\xbbs"], "\x12" => [77, "\xbbt"], "\x13" => [18, "\xbbt"], "\x14" => [0, "\xbb "], "\x15" => [0, "\xbb%"], "\x16" => [0, "\xbb-"], "\x17" => [0, "\xbb."], "\x18" => [0, "\xbb/"], "\x19" => [0, "\xbb3"], "\x1a" => [0, "\xbb4"], "\x1b" => [0, "\xbb5"], "\x1c" => [0, "\xbb6"], "\x1d" => [0, "\xbb7"], "\x1e" => [0, "\xbb8"], "\x1f" => [0, "\xbb9"], " " => [0, "\xbb="], "!" => [0, "\xbbA"], "\"" => [0, "\xbb_"], "#" => [0, "\xbbb"], "\$" => [0, "\xbbd"], "%" => [0, "\xbbf"], "&" => [0, "\xbbg"], "'" => [0, "\xbbh"], "(" => [0, "\xbbl"], ")" => [0, "\xbbm"], "*" => [0, "\xbbn"], "+" => [0, "\xbbp"], "," => [0, "\xbbr"], "-" => [0, "\xbbu"], "." => [100, "\xbb"], "/" => [110, "\xbb"], [111, "\xbb"], [115, "\xbb"], [116, "\xbb"], [118, "\xbb"], [119, "\xbb"], [122, "\xbb"], [123, "\xbb"], [125, "\xbb"], [126, "\xbb"], [129, "\xbb"], ":" => [143, "\xbb"], ";" => [148, "\xbb"], "<" => [151, "\xbb"], "=" => [153, "\xbb"], ">" => [83, "\xbb"], "?" => [10, "\xbb"], "@" => [77, "\xbd0"], "A" => [18, "\xbd0"], "B" => [77, "\xbd1"], "C" => [18, "\xbd1"], "D" => [77, "\xbd2"], "E" => [18, "\xbd2"], "F" => [77, "\xbda"], "G" => [18, "\xbda"], "H" => [77, "\xbdc"], "I" => [18, "\xbdc"], "J" => [77, "\xbde"], "K" => [18, "\xbde"], "L" => [77, "\xbdi"], "M" => [18, "\xbdi"], "N" => [77, "\xbdo"], "O" => [18, "\xbdo"], "P" => [77, "\xbds"], "Q" => [18, "\xbds"], "R" => [77, "\xbdt"], "S" => [18, "\xbdt"], "T" => [0, "\xbd "], "U" => [0, "\xbd%"], "V" => [0, "\xbd-"], "W" => [0, "\xbd."], "X" => [0, "\xbd/"], "Y" => [0, "\xbd3"], "Z" => [0, "\xbd4"], "[" => [0, "\xbd5"], "\\" => [0, "\xbd6"], "]" => [0, "\xbd7"], "^" => [0, "\xbd8"], "_" => [0, "\xbd9"], "`" => [0, "\xbd="], "a" => [0, "\xbdA"], "b" => [0, "\xbd_"], "c" => [0, "\xbdb"], "d" => [0, "\xbdd"], "e" => [0, "\xbdf"], "f" => [0, "\xbdg"], "g" => [0, "\xbdh"], "h" => [0, "\xbdl"], "i" => [0, "\xbdm"], "j" => [0, "\xbdn"], "k" => [0, "\xbdp"], "l" => [0, "\xbdr"], "m" => [0, "\xbdu"], "n" => [100, "\xbd"], "o" => [110, "\xbd"], "p" => [111, "\xbd"], "q" => [115, "\xbd"], "r" => [116, "\xbd"], "s" => [118, "\xbd"], "t" => [119, "\xbd"], "u" => [122, "\xbd"], "v" => [123, "\xbd"], "w" => [125, "\xbd"], "x" => [126, "\xbd"], "y" => [129, "\xbd"], "z" => [143, "\xbd"], "{" => [148, "\xbd"], "|" => [151, "\xbd"], "}" => [153, "\xbd"], "~" => [83, "\xbd"], "" => [10, "\xbd"], "\x80" => [77, "\xbe0"], "\x81" => [18, "\xbe0"], "\x82" => [77, "\xbe1"], "\x83" => [18, "\xbe1"], "\x84" => [77, "\xbe2"], "\x85" => [18, "\xbe2"], "\x86" => [77, "\xbea"], "\x87" => [18, "\xbea"], "\x88" => [77, "\xbec"], "\x89" => [18, "\xbec"], "\x8a" => [77, "\xbee"], "\x8b" => [18, "\xbee"], "\x8c" => [77, "\xbei"], "\x8d" => [18, "\xbei"], "\x8e" => [77, "\xbeo"], "\x8f" => [18, "\xbeo"], "\x90" => [77, "\xbes"], "\x91" => [18, "\xbes"], "\x92" => [77, "\xbet"], "\x93" => [18, "\xbet"], "\x94" => [0, "\xbe "], "\x95" => [0, "\xbe%"], "\x96" => [0, "\xbe-"], "\x97" => [0, "\xbe."], "\x98" => [0, "\xbe/"], "\x99" => [0, "\xbe3"], "\x9a" => [0, "\xbe4"], "\x9b" => [0, "\xbe5"], "\x9c" => [0, "\xbe6"], "\x9d" => [0, "\xbe7"], "\x9e" => [0, "\xbe8"], "\x9f" => [0, "\xbe9"], "\xa0" => [0, "\xbe="], "\xa1" => [0, "\xbeA"], "\xa2" => [0, "\xbe_"], "\xa3" => [0, "\xbeb"], "\xa4" => [0, "\xbed"], "\xa5" => [0, "\xbef"], "\xa6" => [0, "\xbeg"], "\xa7" => [0, "\xbeh"], "\xa8" => [0, "\xbel"], "\xa9" => [0, "\xbem"], "\xaa" => [0, "\xben"], "\xab" => [0, "\xbep"], "\xac" => [0, "\xber"], "\xad" => [0, "\xbeu"], "\xae" => [100, "\xbe"], "\xaf" => [110, "\xbe"], "\xb0" => [111, "\xbe"], "\xb1" => [115, "\xbe"], "\xb2" => [116, "\xbe"], "\xb3" => [118, "\xbe"], "\xb4" => [119, "\xbe"], "\xb5" => [122, "\xbe"], "\xb6" => [123, "\xbe"], "\xb7" => [125, "\xbe"], "\xb8" => [126, "\xbe"], "\xb9" => [129, "\xbe"], "\xba" => [143, "\xbe"], "\xbb" => [148, "\xbe"], "\xbc" => [151, "\xbe"], "\xbd" => [153, "\xbe"], "\xbe" => [83, "\xbe"], "\xbf" => [10, "\xbe"], "\xc0" => [77, "\xc40"], "\xc1" => [18, "\xc40"], "\xc2" => [77, "\xc41"], "\xc3" => [18, "\xc41"], "\xc4" => [77, "\xc42"], "\xc5" => [18, "\xc42"], "\xc6" => [77, "\xc4a"], "\xc7" => [18, "\xc4a"], "\xc8" => [77, "\xc4c"], "\xc9" => [18, "\xc4c"], "\xca" => [77, "\xc4e"], "\xcb" => [18, "\xc4e"], "\xcc" => [77, "\xc4i"], "\xcd" => [18, "\xc4i"], "\xce" => [77, "\xc4o"], "\xcf" => [18, "\xc4o"], "\xd0" => [77, "\xc4s"], "\xd1" => [18, "\xc4s"], "\xd2" => [77, "\xc4t"], "\xd3" => [18, "\xc4t"], "\xd4" => [0, "\xc4 "], "\xd5" => [0, "\xc4%"], "\xd6" => [0, "\xc4-"], "\xd7" => [0, "\xc4."], "\xd8" => [0, "\xc4/"], "\xd9" => [0, "\xc43"], "\xda" => [0, "\xc44"], "\xdb" => [0, "\xc45"], "\xdc" => [0, "\xc46"], "\xdd" => [0, "\xc47"], "\xde" => [0, "\xc48"], "\xdf" => [0, "\xc49"], "\xe0" => [0, "\xc4="], "\xe1" => [0, "\xc4A"], "\xe2" => [0, "\xc4_"], "\xe3" => [0, "\xc4b"], "\xe4" => [0, "\xc4d"], "\xe5" => [0, "\xc4f"], "\xe6" => [0, "\xc4g"], "\xe7" => [0, "\xc4h"], "\xe8" => [0, "\xc4l"], "\xe9" => [0, "\xc4m"], "\xea" => [0, "\xc4n"], "\xeb" => [0, "\xc4p"], "\xec" => [0, "\xc4r"], "\xed" => [0, "\xc4u"], "\xee" => [100, "\xc4"], "\xef" => [110, "\xc4"], "\xf0" => [111, "\xc4"], "\xf1" => [115, "\xc4"], "\xf2" => [116, "\xc4"], "\xf3" => [118, "\xc4"], "\xf4" => [119, "\xc4"], "\xf5" => [122, "\xc4"], "\xf6" => [123, "\xc4"], "\xf7" => [125, "\xc4"], "\xf8" => [126, "\xc4"], "\xf9" => [129, "\xc4"], "\xfa" => [143, "\xc4"], "\xfb" => [148, "\xc4"], "\xfc" => [151, "\xc4"], "\xfd" => [153, "\xc4"], "\xfe" => [83, "\xc4"], "\xff" => [10, "\xc4"]], ["\x00" => [94, "\xbc0"], "\x01" => [76, "\xbc0"], "\x02" => [104, "\xbc0"], "\x03" => [16, "\xbc0"], "\x04" => [94, "\xbc1"], "\x05" => [76, "\xbc1"], "\x06" => [104, "\xbc1"], "\x07" => [16, "\xbc1"], "\x08" => [94, "\xbc2"], "\t" => [76, "\xbc2"], "\n" => [104, "\xbc2"], "\v" => [16, "\xbc2"], "\f" => [94, "\xbca"], "\r" => [76, "\xbca"], "\x0e" => [104, "\xbca"], "\x0f" => [16, "\xbca"], "\x10" => [94, "\xbcc"], "\x11" => [76, "\xbcc"], "\x12" => [104, "\xbcc"], "\x13" => [16, "\xbcc"], "\x14" => [94, "\xbce"], "\x15" => [76, "\xbce"], "\x16" => [104, "\xbce"], "\x17" => [16, "\xbce"], "\x18" => [94, "\xbci"], "\x19" => [76, "\xbci"], "\x1a" => [104, "\xbci"], "\x1b" => [16, "\xbci"], "\x1c" => [94, "\xbco"], "\x1d" => [76, "\xbco"], "\x1e" => [104, "\xbco"], "\x1f" => [16, "\xbco"], " " => [94, "\xbcs"], "!" => [76, "\xbcs"], "\"" => [104, "\xbcs"], "#" => [16, "\xbcs"], "\$" => [94, "\xbct"], "%" => [76, "\xbct"], "&" => [104, "\xbct"], "'" => [16, "\xbct"], "(" => [77, "\xbc "], ")" => [18, "\xbc "], "*" => [77, "\xbc%"], "+" => [18, "\xbc%"], "," => [77, "\xbc-"], "-" => [18, "\xbc-"], "." => [77, "\xbc."], "/" => [18, "\xbc."], [77, "\xbc/"], [18, "\xbc/"], [77, "\xbc3"], [18, "\xbc3"], [77, "\xbc4"], [18, "\xbc4"], [77, "\xbc5"], [18, "\xbc5"], [77, "\xbc6"], [18, "\xbc6"], ":" => [77, "\xbc7"], ";" => [18, "\xbc7"], "<" => [77, "\xbc8"], "=" => [18, "\xbc8"], ">" => [77, "\xbc9"], "?" => [18, "\xbc9"], "@" => [77, "\xbc="], "A" => [18, "\xbc="], "B" => [77, "\xbcA"], "C" => [18, "\xbcA"], "D" => [77, "\xbc_"], "E" => [18, "\xbc_"], "F" => [77, "\xbcb"], "G" => [18, "\xbcb"], "H" => [77, "\xbcd"], "I" => [18, "\xbcd"], "J" => [77, "\xbcf"], "K" => [18, "\xbcf"], "L" => [77, "\xbcg"], "M" => [18, "\xbcg"], "N" => [77, "\xbch"], "O" => [18, "\xbch"], "P" => [77, "\xbcl"], "Q" => [18, "\xbcl"], "R" => [77, "\xbcm"], "S" => [18, "\xbcm"], "T" => [77, "\xbcn"], "U" => [18, "\xbcn"], "V" => [77, "\xbcp"], "W" => [18, "\xbcp"], "X" => [77, "\xbcr"], "Y" => [18, "\xbcr"], "Z" => [77, "\xbcu"], "[" => [18, "\xbcu"], "\\" => [0, "\xbc:"], "]" => [0, "\xbcB"], "^" => [0, "\xbcC"], "_" => [0, "\xbcD"], "`" => [0, "\xbcE"], "a" => [0, "\xbcF"], "b" => [0, "\xbcG"], "c" => [0, "\xbcH"], "d" => [0, "\xbcI"], "e" => [0, "\xbcJ"], "f" => [0, "\xbcK"], "g" => [0, "\xbcL"], "h" => [0, "\xbcM"], "i" => [0, "\xbcN"], "j" => [0, "\xbcO"], "k" => [0, "\xbcP"], "l" => [0, "\xbcQ"], "m" => [0, "\xbcR"], "n" => [0, "\xbcS"], "o" => [0, "\xbcT"], "p" => [0, "\xbcU"], "q" => [0, "\xbcV"], "r" => [0, "\xbcW"], "s" => [0, "\xbcY"], "t" => [0, "\xbcj"], "u" => [0, "\xbck"], "v" => [0, "\xbcq"], "w" => [0, "\xbcv"], "x" => [0, "\xbcw"], "y" => [0, "\xbcx"], "z" => [0, "\xbcy"], "{" => [0, "\xbcz"], "|" => [82, "\xbc"], "}" => [87, "\xbc"], "~" => [130, "\xbc"], "" => [9, "\xbc"], "\x80" => [94, "\xbf0"], "\x81" => [76, "\xbf0"], "\x82" => [104, "\xbf0"], "\x83" => [16, "\xbf0"], "\x84" => [94, "\xbf1"], "\x85" => [76, "\xbf1"], "\x86" => [104, "\xbf1"], "\x87" => [16, "\xbf1"], "\x88" => [94, "\xbf2"], "\x89" => [76, "\xbf2"], "\x8a" => [104, "\xbf2"], "\x8b" => [16, "\xbf2"], "\x8c" => [94, "\xbfa"], "\x8d" => [76, "\xbfa"], "\x8e" => [104, "\xbfa"], "\x8f" => [16, "\xbfa"], "\x90" => [94, "\xbfc"], "\x91" => [76, "\xbfc"], "\x92" => [104, "\xbfc"], "\x93" => [16, "\xbfc"], "\x94" => [94, "\xbfe"], "\x95" => [76, "\xbfe"], "\x96" => [104, "\xbfe"], "\x97" => [16, "\xbfe"], "\x98" => [94, "\xbfi"], "\x99" => [76, "\xbfi"], "\x9a" => [104, "\xbfi"], "\x9b" => [16, "\xbfi"], "\x9c" => [94, "\xbfo"], "\x9d" => [76, "\xbfo"], "\x9e" => [104, "\xbfo"], "\x9f" => [16, "\xbfo"], "\xa0" => [94, "\xbfs"], "\xa1" => [76, "\xbfs"], "\xa2" => [104, "\xbfs"], "\xa3" => [16, "\xbfs"], "\xa4" => [94, "\xbft"], "\xa5" => [76, "\xbft"], "\xa6" => [104, "\xbft"], "\xa7" => [16, "\xbft"], "\xa8" => [77, "\xbf "], "\xa9" => [18, "\xbf "], "\xaa" => [77, "\xbf%"], "\xab" => [18, "\xbf%"], "\xac" => [77, "\xbf-"], "\xad" => [18, "\xbf-"], "\xae" => [77, "\xbf."], "\xaf" => [18, "\xbf."], "\xb0" => [77, "\xbf/"], "\xb1" => [18, "\xbf/"], "\xb2" => [77, "\xbf3"], "\xb3" => [18, "\xbf3"], "\xb4" => [77, "\xbf4"], "\xb5" => [18, "\xbf4"], "\xb6" => [77, "\xbf5"], "\xb7" => [18, "\xbf5"], "\xb8" => [77, "\xbf6"], "\xb9" => [18, "\xbf6"], "\xba" => [77, "\xbf7"], "\xbb" => [18, "\xbf7"], "\xbc" => [77, "\xbf8"], "\xbd" => [18, "\xbf8"], "\xbe" => [77, "\xbf9"], "\xbf" => [18, "\xbf9"], "\xc0" => [77, "\xbf="], "\xc1" => [18, "\xbf="], "\xc2" => [77, "\xbfA"], "\xc3" => [18, "\xbfA"], "\xc4" => [77, "\xbf_"], "\xc5" => [18, "\xbf_"], "\xc6" => [77, "\xbfb"], "\xc7" => [18, "\xbfb"], "\xc8" => [77, "\xbfd"], "\xc9" => [18, "\xbfd"], "\xca" => [77, "\xbff"], "\xcb" => [18, "\xbff"], "\xcc" => [77, "\xbfg"], "\xcd" => [18, "\xbfg"], "\xce" => [77, "\xbfh"], "\xcf" => [18, "\xbfh"], "\xd0" => [77, "\xbfl"], "\xd1" => [18, "\xbfl"], "\xd2" => [77, "\xbfm"], "\xd3" => [18, "\xbfm"], "\xd4" => [77, "\xbfn"], "\xd5" => [18, "\xbfn"], "\xd6" => [77, "\xbfp"], "\xd7" => [18, "\xbfp"], "\xd8" => [77, "\xbfr"], "\xd9" => [18, "\xbfr"], "\xda" => [77, "\xbfu"], "\xdb" => [18, "\xbfu"], "\xdc" => [0, "\xbf:"], "\xdd" => [0, "\xbfB"], "\xde" => [0, "\xbfC"], "\xdf" => [0, "\xbfD"], "\xe0" => [0, "\xbfE"], "\xe1" => [0, "\xbfF"], "\xe2" => [0, "\xbfG"], "\xe3" => [0, "\xbfH"], "\xe4" => [0, "\xbfI"], "\xe5" => [0, "\xbfJ"], "\xe6" => [0, "\xbfK"], "\xe7" => [0, "\xbfL"], "\xe8" => [0, "\xbfM"], "\xe9" => [0, "\xbfN"], "\xea" => [0, "\xbfO"], "\xeb" => [0, "\xbfP"], "\xec" => [0, "\xbfQ"], "\xed" => [0, "\xbfR"], "\xee" => [0, "\xbfS"], "\xef" => [0, "\xbfT"], "\xf0" => [0, "\xbfU"], "\xf1" => [0, "\xbfV"], "\xf2" => [0, "\xbfW"], "\xf3" => [0, "\xbfY"], "\xf4" => [0, "\xbfj"], "\xf5" => [0, "\xbfk"], "\xf6" => [0, "\xbfq"], "\xf7" => [0, "\xbfv"], "\xf8" => [0, "\xbfw"], "\xf9" => [0, "\xbfx"], "\xfa" => [0, "\xbfy"], "\xfb" => [0, "\xbfz"], "\xfc" => [82, "\xbf"], "\xfd" => [87, "\xbf"], "\xfe" => [130, "\xbf"], "\xff" => [9, "\xbf"]], ["\x00" => [77, "\xbc0"], "\x01" => [18, "\xbc0"], "\x02" => [77, "\xbc1"], "\x03" => [18, "\xbc1"], "\x04" => [77, "\xbc2"], "\x05" => [18, "\xbc2"], "\x06" => [77, "\xbca"], "\x07" => [18, "\xbca"], "\x08" => [77, "\xbcc"], "\t" => [18, "\xbcc"], "\n" => [77, "\xbce"], "\v" => [18, "\xbce"], "\f" => [77, "\xbci"], "\r" => [18, "\xbci"], "\x0e" => [77, "\xbco"], "\x0f" => [18, "\xbco"], "\x10" => [77, "\xbcs"], "\x11" => [18, "\xbcs"], "\x12" => [77, "\xbct"], "\x13" => [18, "\xbct"], "\x14" => [0, "\xbc "], "\x15" => [0, "\xbc%"], "\x16" => [0, "\xbc-"], "\x17" => [0, "\xbc."], "\x18" => [0, "\xbc/"], "\x19" => [0, "\xbc3"], "\x1a" => [0, "\xbc4"], "\x1b" => [0, "\xbc5"], "\x1c" => [0, "\xbc6"], "\x1d" => [0, "\xbc7"], "\x1e" => [0, "\xbc8"], "\x1f" => [0, "\xbc9"], " " => [0, "\xbc="], "!" => [0, "\xbcA"], "\"" => [0, "\xbc_"], "#" => [0, "\xbcb"], "\$" => [0, "\xbcd"], "%" => [0, "\xbcf"], "&" => [0, "\xbcg"], "'" => [0, "\xbch"], "(" => [0, "\xbcl"], ")" => [0, "\xbcm"], "*" => [0, "\xbcn"], "+" => [0, "\xbcp"], "," => [0, "\xbcr"], "-" => [0, "\xbcu"], "." => [100, "\xbc"], "/" => [110, "\xbc"], [111, "\xbc"], [115, "\xbc"], [116, "\xbc"], [118, "\xbc"], [119, "\xbc"], [122, "\xbc"], [123, "\xbc"], [125, "\xbc"], [126, "\xbc"], [129, "\xbc"], ":" => [143, "\xbc"], ";" => [148, "\xbc"], "<" => [151, "\xbc"], "=" => [153, "\xbc"], ">" => [83, "\xbc"], "?" => [10, "\xbc"], "@" => [77, "\xbf0"], "A" => [18, "\xbf0"], "B" => [77, "\xbf1"], "C" => [18, "\xbf1"], "D" => [77, "\xbf2"], "E" => [18, "\xbf2"], "F" => [77, "\xbfa"], "G" => [18, "\xbfa"], "H" => [77, "\xbfc"], "I" => [18, "\xbfc"], "J" => [77, "\xbfe"], "K" => [18, "\xbfe"], "L" => [77, "\xbfi"], "M" => [18, "\xbfi"], "N" => [77, "\xbfo"], "O" => [18, "\xbfo"], "P" => [77, "\xbfs"], "Q" => [18, "\xbfs"], "R" => [77, "\xbft"], "S" => [18, "\xbft"], "T" => [0, "\xbf "], "U" => [0, "\xbf%"], "V" => [0, "\xbf-"], "W" => [0, "\xbf."], "X" => [0, "\xbf/"], "Y" => [0, "\xbf3"], "Z" => [0, "\xbf4"], "[" => [0, "\xbf5"], "\\" => [0, "\xbf6"], "]" => [0, "\xbf7"], "^" => [0, "\xbf8"], "_" => [0, "\xbf9"], "`" => [0, "\xbf="], "a" => [0, "\xbfA"], "b" => [0, "\xbf_"], "c" => [0, "\xbfb"], "d" => [0, "\xbfd"], "e" => [0, "\xbff"], "f" => [0, "\xbfg"], "g" => [0, "\xbfh"], "h" => [0, "\xbfl"], "i" => [0, "\xbfm"], "j" => [0, "\xbfn"], "k" => [0, "\xbfp"], "l" => [0, "\xbfr"], "m" => [0, "\xbfu"], "n" => [100, "\xbf"], "o" => [110, "\xbf"], "p" => [111, "\xbf"], "q" => [115, "\xbf"], "r" => [116, "\xbf"], "s" => [118, "\xbf"], "t" => [119, "\xbf"], "u" => [122, "\xbf"], "v" => [123, "\xbf"], "w" => [125, "\xbf"], "x" => [126, "\xbf"], "y" => [129, "\xbf"], "z" => [143, "\xbf"], "{" => [148, "\xbf"], "|" => [151, "\xbf"], "}" => [153, "\xbf"], "~" => [83, "\xbf"], "" => [10, "\xbf"], "\x80" => [77, "\xc50"], "\x81" => [18, "\xc50"], "\x82" => [77, "\xc51"], "\x83" => [18, "\xc51"], "\x84" => [77, "\xc52"], "\x85" => [18, "\xc52"], "\x86" => [77, "\xc5a"], "\x87" => [18, "\xc5a"], "\x88" => [77, "\xc5c"], "\x89" => [18, "\xc5c"], "\x8a" => [77, "\xc5e"], "\x8b" => [18, "\xc5e"], "\x8c" => [77, "\xc5i"], "\x8d" => [18, "\xc5i"], "\x8e" => [77, "\xc5o"], "\x8f" => [18, "\xc5o"], "\x90" => [77, "\xc5s"], "\x91" => [18, "\xc5s"], "\x92" => [77, "\xc5t"], "\x93" => [18, "\xc5t"], "\x94" => [0, "\xc5 "], "\x95" => [0, "\xc5%"], "\x96" => [0, "\xc5-"], "\x97" => [0, "\xc5."], "\x98" => [0, "\xc5/"], "\x99" => [0, "\xc53"], "\x9a" => [0, "\xc54"], "\x9b" => [0, "\xc55"], "\x9c" => [0, "\xc56"], "\x9d" => [0, "\xc57"], "\x9e" => [0, "\xc58"], "\x9f" => [0, "\xc59"], "\xa0" => [0, "\xc5="], "\xa1" => [0, "\xc5A"], "\xa2" => [0, "\xc5_"], "\xa3" => [0, "\xc5b"], "\xa4" => [0, "\xc5d"], "\xa5" => [0, "\xc5f"], "\xa6" => [0, "\xc5g"], "\xa7" => [0, "\xc5h"], "\xa8" => [0, "\xc5l"], "\xa9" => [0, "\xc5m"], "\xaa" => [0, "\xc5n"], "\xab" => [0, "\xc5p"], "\xac" => [0, "\xc5r"], "\xad" => [0, "\xc5u"], "\xae" => [100, "\xc5"], "\xaf" => [110, "\xc5"], "\xb0" => [111, "\xc5"], "\xb1" => [115, "\xc5"], "\xb2" => [116, "\xc5"], "\xb3" => [118, "\xc5"], "\xb4" => [119, "\xc5"], "\xb5" => [122, "\xc5"], "\xb6" => [123, "\xc5"], "\xb7" => [125, "\xc5"], "\xb8" => [126, "\xc5"], "\xb9" => [129, "\xc5"], "\xba" => [143, "\xc5"], "\xbb" => [148, "\xc5"], "\xbc" => [151, "\xc5"], "\xbd" => [153, "\xc5"], "\xbe" => [83, "\xc5"], "\xbf" => [10, "\xc5"], "\xc0" => [77, "\xe70"], "\xc1" => [18, "\xe70"], "\xc2" => [77, "\xe71"], "\xc3" => [18, "\xe71"], "\xc4" => [77, "\xe72"], "\xc5" => [18, "\xe72"], "\xc6" => [77, "\xe7a"], "\xc7" => [18, "\xe7a"], "\xc8" => [77, "\xe7c"], "\xc9" => [18, "\xe7c"], "\xca" => [77, "\xe7e"], "\xcb" => [18, "\xe7e"], "\xcc" => [77, "\xe7i"], "\xcd" => [18, "\xe7i"], "\xce" => [77, "\xe7o"], "\xcf" => [18, "\xe7o"], "\xd0" => [77, "\xe7s"], "\xd1" => [18, "\xe7s"], "\xd2" => [77, "\xe7t"], "\xd3" => [18, "\xe7t"], "\xd4" => [0, "\xe7 "], "\xd5" => [0, "\xe7%"], "\xd6" => [0, "\xe7-"], "\xd7" => [0, "\xe7."], "\xd8" => [0, "\xe7/"], "\xd9" => [0, "\xe73"], "\xda" => [0, "\xe74"], "\xdb" => [0, "\xe75"], "\xdc" => [0, "\xe76"], "\xdd" => [0, "\xe77"], "\xde" => [0, "\xe78"], "\xdf" => [0, "\xe79"], "\xe0" => [0, "\xe7="], "\xe1" => [0, "\xe7A"], "\xe2" => [0, "\xe7_"], "\xe3" => [0, "\xe7b"], "\xe4" => [0, "\xe7d"], "\xe5" => [0, "\xe7f"], "\xe6" => [0, "\xe7g"], "\xe7" => [0, "\xe7h"], "\xe8" => [0, "\xe7l"], "\xe9" => [0, "\xe7m"], "\xea" => [0, "\xe7n"], "\xeb" => [0, "\xe7p"], "\xec" => [0, "\xe7r"], "\xed" => [0, "\xe7u"], "\xee" => [100, "\xe7"], "\xef" => [110, "\xe7"], "\xf0" => [111, "\xe7"], "\xf1" => [115, "\xe7"], "\xf2" => [116, "\xe7"], "\xf3" => [118, "\xe7"], "\xf4" => [119, "\xe7"], "\xf5" => [122, "\xe7"], "\xf6" => [123, "\xe7"], "\xf7" => [125, "\xe7"], "\xf8" => [126, "\xe7"], "\xf9" => [129, "\xe7"], "\xfa" => [143, "\xe7"], "\xfb" => [148, "\xe7"], "\xfc" => [151, "\xe7"], "\xfd" => [153, "\xe7"], "\xfe" => [83, "\xe7"], "\xff" => [10, "\xe7"]], ["\x00" => [94, "\xbe0"], "\x01" => [76, "\xbe0"], "\x02" => [104, "\xbe0"], "\x03" => [16, "\xbe0"], "\x04" => [94, "\xbe1"], "\x05" => [76, "\xbe1"], "\x06" => [104, "\xbe1"], "\x07" => [16, "\xbe1"], "\x08" => [94, "\xbe2"], "\t" => [76, "\xbe2"], "\n" => [104, "\xbe2"], "\v" => [16, "\xbe2"], "\f" => [94, "\xbea"], "\r" => [76, "\xbea"], "\x0e" => [104, "\xbea"], "\x0f" => [16, "\xbea"], "\x10" => [94, "\xbec"], "\x11" => [76, "\xbec"], "\x12" => [104, "\xbec"], "\x13" => [16, "\xbec"], "\x14" => [94, "\xbee"], "\x15" => [76, "\xbee"], "\x16" => [104, "\xbee"], "\x17" => [16, "\xbee"], "\x18" => [94, "\xbei"], "\x19" => [76, "\xbei"], "\x1a" => [104, "\xbei"], "\x1b" => [16, "\xbei"], "\x1c" => [94, "\xbeo"], "\x1d" => [76, "\xbeo"], "\x1e" => [104, "\xbeo"], "\x1f" => [16, "\xbeo"], " " => [94, "\xbes"], "!" => [76, "\xbes"], "\"" => [104, "\xbes"], "#" => [16, "\xbes"], "\$" => [94, "\xbet"], "%" => [76, "\xbet"], "&" => [104, "\xbet"], "'" => [16, "\xbet"], "(" => [77, "\xbe "], ")" => [18, "\xbe "], "*" => [77, "\xbe%"], "+" => [18, "\xbe%"], "," => [77, "\xbe-"], "-" => [18, "\xbe-"], "." => [77, "\xbe."], "/" => [18, "\xbe."], [77, "\xbe/"], [18, "\xbe/"], [77, "\xbe3"], [18, "\xbe3"], [77, "\xbe4"], [18, "\xbe4"], [77, "\xbe5"], [18, "\xbe5"], [77, "\xbe6"], [18, "\xbe6"], ":" => [77, "\xbe7"], ";" => [18, "\xbe7"], "<" => [77, "\xbe8"], "=" => [18, "\xbe8"], ">" => [77, "\xbe9"], "?" => [18, "\xbe9"], "@" => [77, "\xbe="], "A" => [18, "\xbe="], "B" => [77, "\xbeA"], "C" => [18, "\xbeA"], "D" => [77, "\xbe_"], "E" => [18, "\xbe_"], "F" => [77, "\xbeb"], "G" => [18, "\xbeb"], "H" => [77, "\xbed"], "I" => [18, "\xbed"], "J" => [77, "\xbef"], "K" => [18, "\xbef"], "L" => [77, "\xbeg"], "M" => [18, "\xbeg"], "N" => [77, "\xbeh"], "O" => [18, "\xbeh"], "P" => [77, "\xbel"], "Q" => [18, "\xbel"], "R" => [77, "\xbem"], "S" => [18, "\xbem"], "T" => [77, "\xben"], "U" => [18, "\xben"], "V" => [77, "\xbep"], "W" => [18, "\xbep"], "X" => [77, "\xber"], "Y" => [18, "\xber"], "Z" => [77, "\xbeu"], "[" => [18, "\xbeu"], "\\" => [0, "\xbe:"], "]" => [0, "\xbeB"], "^" => [0, "\xbeC"], "_" => [0, "\xbeD"], "`" => [0, "\xbeE"], "a" => [0, "\xbeF"], "b" => [0, "\xbeG"], "c" => [0, "\xbeH"], "d" => [0, "\xbeI"], "e" => [0, "\xbeJ"], "f" => [0, "\xbeK"], "g" => [0, "\xbeL"], "h" => [0, "\xbeM"], "i" => [0, "\xbeN"], "j" => [0, "\xbeO"], "k" => [0, "\xbeP"], "l" => [0, "\xbeQ"], "m" => [0, "\xbeR"], "n" => [0, "\xbeS"], "o" => [0, "\xbeT"], "p" => [0, "\xbeU"], "q" => [0, "\xbeV"], "r" => [0, "\xbeW"], "s" => [0, "\xbeY"], "t" => [0, "\xbej"], "u" => [0, "\xbek"], "v" => [0, "\xbeq"], "w" => [0, "\xbev"], "x" => [0, "\xbew"], "y" => [0, "\xbex"], "z" => [0, "\xbey"], "{" => [0, "\xbez"], "|" => [82, "\xbe"], "}" => [87, "\xbe"], "~" => [130, "\xbe"], "" => [9, "\xbe"], "\x80" => [94, "\xc40"], "\x81" => [76, "\xc40"], "\x82" => [104, "\xc40"], "\x83" => [16, "\xc40"], "\x84" => [94, "\xc41"], "\x85" => [76, "\xc41"], "\x86" => [104, "\xc41"], "\x87" => [16, "\xc41"], "\x88" => [94, "\xc42"], "\x89" => [76, "\xc42"], "\x8a" => [104, "\xc42"], "\x8b" => [16, "\xc42"], "\x8c" => [94, "\xc4a"], "\x8d" => [76, "\xc4a"], "\x8e" => [104, "\xc4a"], "\x8f" => [16, "\xc4a"], "\x90" => [94, "\xc4c"], "\x91" => [76, "\xc4c"], "\x92" => [104, "\xc4c"], "\x93" => [16, "\xc4c"], "\x94" => [94, "\xc4e"], "\x95" => [76, "\xc4e"], "\x96" => [104, "\xc4e"], "\x97" => [16, "\xc4e"], "\x98" => [94, "\xc4i"], "\x99" => [76, "\xc4i"], "\x9a" => [104, "\xc4i"], "\x9b" => [16, "\xc4i"], "\x9c" => [94, "\xc4o"], "\x9d" => [76, "\xc4o"], "\x9e" => [104, "\xc4o"], "\x9f" => [16, "\xc4o"], "\xa0" => [94, "\xc4s"], "\xa1" => [76, "\xc4s"], "\xa2" => [104, "\xc4s"], "\xa3" => [16, "\xc4s"], "\xa4" => [94, "\xc4t"], "\xa5" => [76, "\xc4t"], "\xa6" => [104, "\xc4t"], "\xa7" => [16, "\xc4t"], "\xa8" => [77, "\xc4 "], "\xa9" => [18, "\xc4 "], "\xaa" => [77, "\xc4%"], "\xab" => [18, "\xc4%"], "\xac" => [77, "\xc4-"], "\xad" => [18, "\xc4-"], "\xae" => [77, "\xc4."], "\xaf" => [18, "\xc4."], "\xb0" => [77, "\xc4/"], "\xb1" => [18, "\xc4/"], "\xb2" => [77, "\xc43"], "\xb3" => [18, "\xc43"], "\xb4" => [77, "\xc44"], "\xb5" => [18, "\xc44"], "\xb6" => [77, "\xc45"], "\xb7" => [18, "\xc45"], "\xb8" => [77, "\xc46"], "\xb9" => [18, "\xc46"], "\xba" => [77, "\xc47"], "\xbb" => [18, "\xc47"], "\xbc" => [77, "\xc48"], "\xbd" => [18, "\xc48"], "\xbe" => [77, "\xc49"], "\xbf" => [18, "\xc49"], "\xc0" => [77, "\xc4="], "\xc1" => [18, "\xc4="], "\xc2" => [77, "\xc4A"], "\xc3" => [18, "\xc4A"], "\xc4" => [77, "\xc4_"], "\xc5" => [18, "\xc4_"], "\xc6" => [77, "\xc4b"], "\xc7" => [18, "\xc4b"], "\xc8" => [77, "\xc4d"], "\xc9" => [18, "\xc4d"], "\xca" => [77, "\xc4f"], "\xcb" => [18, "\xc4f"], "\xcc" => [77, "\xc4g"], "\xcd" => [18, "\xc4g"], "\xce" => [77, "\xc4h"], "\xcf" => [18, "\xc4h"], "\xd0" => [77, "\xc4l"], "\xd1" => [18, "\xc4l"], "\xd2" => [77, "\xc4m"], "\xd3" => [18, "\xc4m"], "\xd4" => [77, "\xc4n"], "\xd5" => [18, "\xc4n"], "\xd6" => [77, "\xc4p"], "\xd7" => [18, "\xc4p"], "\xd8" => [77, "\xc4r"], "\xd9" => [18, "\xc4r"], "\xda" => [77, "\xc4u"], "\xdb" => [18, "\xc4u"], "\xdc" => [0, "\xc4:"], "\xdd" => [0, "\xc4B"], "\xde" => [0, "\xc4C"], "\xdf" => [0, "\xc4D"], "\xe0" => [0, "\xc4E"], "\xe1" => [0, "\xc4F"], "\xe2" => [0, "\xc4G"], "\xe3" => [0, "\xc4H"], "\xe4" => [0, "\xc4I"], "\xe5" => [0, "\xc4J"], "\xe6" => [0, "\xc4K"], "\xe7" => [0, "\xc4L"], "\xe8" => [0, "\xc4M"], "\xe9" => [0, "\xc4N"], "\xea" => [0, "\xc4O"], "\xeb" => [0, "\xc4P"], "\xec" => [0, "\xc4Q"], "\xed" => [0, "\xc4R"], "\xee" => [0, "\xc4S"], "\xef" => [0, "\xc4T"], "\xf0" => [0, "\xc4U"], "\xf1" => [0, "\xc4V"], "\xf2" => [0, "\xc4W"], "\xf3" => [0, "\xc4Y"], "\xf4" => [0, "\xc4j"], "\xf5" => [0, "\xc4k"], "\xf6" => [0, "\xc4q"], "\xf7" => [0, "\xc4v"], "\xf8" => [0, "\xc4w"], "\xf9" => [0, "\xc4x"], "\xfa" => [0, "\xc4y"], "\xfb" => [0, "\xc4z"], "\xfc" => [82, "\xc4"], "\xfd" => [87, "\xc4"], "\xfe" => [130, "\xc4"], "\xff" => [9, "\xc4"]], ["\x00" => [77, "\xc00"], "\x01" => [18, "\xc00"], "\x02" => [77, "\xc01"], "\x03" => [18, "\xc01"], "\x04" => [77, "\xc02"], "\x05" => [18, "\xc02"], "\x06" => [77, "\xc0a"], "\x07" => [18, "\xc0a"], "\x08" => [77, "\xc0c"], "\t" => [18, "\xc0c"], "\n" => [77, "\xc0e"], "\v" => [18, "\xc0e"], "\f" => [77, "\xc0i"], "\r" => [18, "\xc0i"], "\x0e" => [77, "\xc0o"], "\x0f" => [18, "\xc0o"], "\x10" => [77, "\xc0s"], "\x11" => [18, "\xc0s"], "\x12" => [77, "\xc0t"], "\x13" => [18, "\xc0t"], "\x14" => [0, "\xc0 "], "\x15" => [0, "\xc0%"], "\x16" => [0, "\xc0-"], "\x17" => [0, "\xc0."], "\x18" => [0, "\xc0/"], "\x19" => [0, "\xc03"], "\x1a" => [0, "\xc04"], "\x1b" => [0, "\xc05"], "\x1c" => [0, "\xc06"], "\x1d" => [0, "\xc07"], "\x1e" => [0, "\xc08"], "\x1f" => [0, "\xc09"], " " => [0, "\xc0="], "!" => [0, "\xc0A"], "\"" => [0, "\xc0_"], "#" => [0, "\xc0b"], "\$" => [0, "\xc0d"], "%" => [0, "\xc0f"], "&" => [0, "\xc0g"], "'" => [0, "\xc0h"], "(" => [0, "\xc0l"], ")" => [0, "\xc0m"], "*" => [0, "\xc0n"], "+" => [0, "\xc0p"], "," => [0, "\xc0r"], "-" => [0, "\xc0u"], "." => [100, "\xc0"], "/" => [110, "\xc0"], [111, "\xc0"], [115, "\xc0"], [116, "\xc0"], [118, "\xc0"], [119, "\xc0"], [122, "\xc0"], [123, "\xc0"], [125, "\xc0"], [126, "\xc0"], [129, "\xc0"], ":" => [143, "\xc0"], ";" => [148, "\xc0"], "<" => [151, "\xc0"], "=" => [153, "\xc0"], ">" => [83, "\xc0"], "?" => [10, "\xc0"], "@" => [77, "\xc10"], "A" => [18, "\xc10"], "B" => [77, "\xc11"], "C" => [18, "\xc11"], "D" => [77, "\xc12"], "E" => [18, "\xc12"], "F" => [77, "\xc1a"], "G" => [18, "\xc1a"], "H" => [77, "\xc1c"], "I" => [18, "\xc1c"], "J" => [77, "\xc1e"], "K" => [18, "\xc1e"], "L" => [77, "\xc1i"], "M" => [18, "\xc1i"], "N" => [77, "\xc1o"], "O" => [18, "\xc1o"], "P" => [77, "\xc1s"], "Q" => [18, "\xc1s"], "R" => [77, "\xc1t"], "S" => [18, "\xc1t"], "T" => [0, "\xc1 "], "U" => [0, "\xc1%"], "V" => [0, "\xc1-"], "W" => [0, "\xc1."], "X" => [0, "\xc1/"], "Y" => [0, "\xc13"], "Z" => [0, "\xc14"], "[" => [0, "\xc15"], "\\" => [0, "\xc16"], "]" => [0, "\xc17"], "^" => [0, "\xc18"], "_" => [0, "\xc19"], "`" => [0, "\xc1="], "a" => [0, "\xc1A"], "b" => [0, "\xc1_"], "c" => [0, "\xc1b"], "d" => [0, "\xc1d"], "e" => [0, "\xc1f"], "f" => [0, "\xc1g"], "g" => [0, "\xc1h"], "h" => [0, "\xc1l"], "i" => [0, "\xc1m"], "j" => [0, "\xc1n"], "k" => [0, "\xc1p"], "l" => [0, "\xc1r"], "m" => [0, "\xc1u"], "n" => [100, "\xc1"], "o" => [110, "\xc1"], "p" => [111, "\xc1"], "q" => [115, "\xc1"], "r" => [116, "\xc1"], "s" => [118, "\xc1"], "t" => [119, "\xc1"], "u" => [122, "\xc1"], "v" => [123, "\xc1"], "w" => [125, "\xc1"], "x" => [126, "\xc1"], "y" => [129, "\xc1"], "z" => [143, "\xc1"], "{" => [148, "\xc1"], "|" => [151, "\xc1"], "}" => [153, "\xc1"], "~" => [83, "\xc1"], "" => [10, "\xc1"], "\x80" => [77, "\xc80"], "\x81" => [18, "\xc80"], "\x82" => [77, "\xc81"], "\x83" => [18, "\xc81"], "\x84" => [77, "\xc82"], "\x85" => [18, "\xc82"], "\x86" => [77, "\xc8a"], "\x87" => [18, "\xc8a"], "\x88" => [77, "\xc8c"], "\x89" => [18, "\xc8c"], "\x8a" => [77, "\xc8e"], "\x8b" => [18, "\xc8e"], "\x8c" => [77, "\xc8i"], "\x8d" => [18, "\xc8i"], "\x8e" => [77, "\xc8o"], "\x8f" => [18, "\xc8o"], "\x90" => [77, "\xc8s"], "\x91" => [18, "\xc8s"], "\x92" => [77, "\xc8t"], "\x93" => [18, "\xc8t"], "\x94" => [0, "\xc8 "], "\x95" => [0, "\xc8%"], "\x96" => [0, "\xc8-"], "\x97" => [0, "\xc8."], "\x98" => [0, "\xc8/"], "\x99" => [0, "\xc83"], "\x9a" => [0, "\xc84"], "\x9b" => [0, "\xc85"], "\x9c" => [0, "\xc86"], "\x9d" => [0, "\xc87"], "\x9e" => [0, "\xc88"], "\x9f" => [0, "\xc89"], "\xa0" => [0, "\xc8="], "\xa1" => [0, "\xc8A"], "\xa2" => [0, "\xc8_"], "\xa3" => [0, "\xc8b"], "\xa4" => [0, "\xc8d"], "\xa5" => [0, "\xc8f"], "\xa6" => [0, "\xc8g"], "\xa7" => [0, "\xc8h"], "\xa8" => [0, "\xc8l"], "\xa9" => [0, "\xc8m"], "\xaa" => [0, "\xc8n"], "\xab" => [0, "\xc8p"], "\xac" => [0, "\xc8r"], "\xad" => [0, "\xc8u"], "\xae" => [100, "\xc8"], "\xaf" => [110, "\xc8"], "\xb0" => [111, "\xc8"], "\xb1" => [115, "\xc8"], "\xb2" => [116, "\xc8"], "\xb3" => [118, "\xc8"], "\xb4" => [119, "\xc8"], "\xb5" => [122, "\xc8"], "\xb6" => [123, "\xc8"], "\xb7" => [125, "\xc8"], "\xb8" => [126, "\xc8"], "\xb9" => [129, "\xc8"], "\xba" => [143, "\xc8"], "\xbb" => [148, "\xc8"], "\xbc" => [151, "\xc8"], "\xbd" => [153, "\xc8"], "\xbe" => [83, "\xc8"], "\xbf" => [10, "\xc8"], "\xc0" => [77, "\xc90"], "\xc1" => [18, "\xc90"], "\xc2" => [77, "\xc91"], "\xc3" => [18, "\xc91"], "\xc4" => [77, "\xc92"], "\xc5" => [18, "\xc92"], "\xc6" => [77, "\xc9a"], "\xc7" => [18, "\xc9a"], "\xc8" => [77, "\xc9c"], "\xc9" => [18, "\xc9c"], "\xca" => [77, "\xc9e"], "\xcb" => [18, "\xc9e"], "\xcc" => [77, "\xc9i"], "\xcd" => [18, "\xc9i"], "\xce" => [77, "\xc9o"], "\xcf" => [18, "\xc9o"], "\xd0" => [77, "\xc9s"], "\xd1" => [18, "\xc9s"], "\xd2" => [77, "\xc9t"], "\xd3" => [18, "\xc9t"], "\xd4" => [0, "\xc9 "], "\xd5" => [0, "\xc9%"], "\xd6" => [0, "\xc9-"], "\xd7" => [0, "\xc9."], "\xd8" => [0, "\xc9/"], "\xd9" => [0, "\xc93"], "\xda" => [0, "\xc94"], "\xdb" => [0, "\xc95"], "\xdc" => [0, "\xc96"], "\xdd" => [0, "\xc97"], "\xde" => [0, "\xc98"], "\xdf" => [0, "\xc99"], "\xe0" => [0, "\xc9="], "\xe1" => [0, "\xc9A"], "\xe2" => [0, "\xc9_"], "\xe3" => [0, "\xc9b"], "\xe4" => [0, "\xc9d"], "\xe5" => [0, "\xc9f"], "\xe6" => [0, "\xc9g"], "\xe7" => [0, "\xc9h"], "\xe8" => [0, "\xc9l"], "\xe9" => [0, "\xc9m"], "\xea" => [0, "\xc9n"], "\xeb" => [0, "\xc9p"], "\xec" => [0, "\xc9r"], "\xed" => [0, "\xc9u"], "\xee" => [100, "\xc9"], "\xef" => [110, "\xc9"], "\xf0" => [111, "\xc9"], "\xf1" => [115, "\xc9"], "\xf2" => [116, "\xc9"], "\xf3" => [118, "\xc9"], "\xf4" => [119, "\xc9"], "\xf5" => [122, "\xc9"], "\xf6" => [123, "\xc9"], "\xf7" => [125, "\xc9"], "\xf8" => [126, "\xc9"], "\xf9" => [129, "\xc9"], "\xfa" => [143, "\xc9"], "\xfb" => [148, "\xc9"], "\xfc" => [151, "\xc9"], "\xfd" => [153, "\xc9"], "\xfe" => [83, "\xc9"], "\xff" => [10, "\xc9"]], ["\x00" => [0, "\xc00"], "\x01" => [0, "\xc01"], "\x02" => [0, "\xc02"], "\x03" => [0, "\xc0a"], "\x04" => [0, "\xc0c"], "\x05" => [0, "\xc0e"], "\x06" => [0, "\xc0i"], "\x07" => [0, "\xc0o"], "\x08" => [0, "\xc0s"], "\t" => [0, "\xc0t"], "\n" => [73, "\xc0"], "\v" => [88, "\xc0"], "\f" => [89, "\xc0"], "\r" => [96, "\xc0"], "\x0e" => [97, "\xc0"], "\x0f" => [99, "\xc0"], "\x10" => [106, "\xc0"], "\x11" => [136, "\xc0"], "\x12" => [139, "\xc0"], "\x13" => [141, "\xc0"], "\x14" => [145, "\xc0"], "\x15" => [147, "\xc0"], "\x16" => [149, "\xc0"], "\x17" => [101, "\xc0"], "\x18" => [112, "\xc0"], "\x19" => [117, "\xc0"], "\x1a" => [120, "\xc0"], "\x1b" => [124, "\xc0"], "\x1c" => [127, "\xc0"], "\x1d" => [144, "\xc0"], "\x1e" => [152, "\xc0"], "\x1f" => [11, "\xc0"], " " => [0, "\xc10"], "!" => [0, "\xc11"], "\"" => [0, "\xc12"], "#" => [0, "\xc1a"], "\$" => [0, "\xc1c"], "%" => [0, "\xc1e"], "&" => [0, "\xc1i"], "'" => [0, "\xc1o"], "(" => [0, "\xc1s"], ")" => [0, "\xc1t"], "*" => [73, "\xc1"], "+" => [88, "\xc1"], "," => [89, "\xc1"], "-" => [96, "\xc1"], "." => [97, "\xc1"], "/" => [99, "\xc1"], [106, "\xc1"], [136, "\xc1"], [139, "\xc1"], [141, "\xc1"], [145, "\xc1"], [147, "\xc1"], [149, "\xc1"], [101, "\xc1"], [112, "\xc1"], [117, "\xc1"], ":" => [120, "\xc1"], ";" => [124, "\xc1"], "<" => [127, "\xc1"], "=" => [144, "\xc1"], ">" => [152, "\xc1"], "?" => [11, "\xc1"], "@" => [0, "\xc80"], "A" => [0, "\xc81"], "B" => [0, "\xc82"], "C" => [0, "\xc8a"], "D" => [0, "\xc8c"], "E" => [0, "\xc8e"], "F" => [0, "\xc8i"], "G" => [0, "\xc8o"], "H" => [0, "\xc8s"], "I" => [0, "\xc8t"], "J" => [73, "\xc8"], "K" => [88, "\xc8"], "L" => [89, "\xc8"], "M" => [96, "\xc8"], "N" => [97, "\xc8"], "O" => [99, "\xc8"], "P" => [106, "\xc8"], "Q" => [136, "\xc8"], "R" => [139, "\xc8"], "S" => [141, "\xc8"], "T" => [145, "\xc8"], "U" => [147, "\xc8"], "V" => [149, "\xc8"], "W" => [101, "\xc8"], "X" => [112, "\xc8"], "Y" => [117, "\xc8"], "Z" => [120, "\xc8"], "[" => [124, "\xc8"], "\\" => [127, "\xc8"], "]" => [144, "\xc8"], "^" => [152, "\xc8"], "_" => [11, "\xc8"], "`" => [0, "\xc90"], "a" => [0, "\xc91"], "b" => [0, "\xc92"], "c" => [0, "\xc9a"], "d" => [0, "\xc9c"], "e" => [0, "\xc9e"], "f" => [0, "\xc9i"], "g" => [0, "\xc9o"], "h" => [0, "\xc9s"], "i" => [0, "\xc9t"], "j" => [73, "\xc9"], "k" => [88, "\xc9"], "l" => [89, "\xc9"], "m" => [96, "\xc9"], "n" => [97, "\xc9"], "o" => [99, "\xc9"], "p" => [106, "\xc9"], "q" => [136, "\xc9"], "r" => [139, "\xc9"], "s" => [141, "\xc9"], "t" => [145, "\xc9"], "u" => [147, "\xc9"], "v" => [149, "\xc9"], "w" => [101, "\xc9"], "x" => [112, "\xc9"], "y" => [117, "\xc9"], "z" => [120, "\xc9"], "{" => [124, "\xc9"], "|" => [127, "\xc9"], "}" => [144, "\xc9"], "~" => [152, "\xc9"], "" => [11, "\xc9"], "\x80" => [0, "\xca0"], "\x81" => [0, "\xca1"], "\x82" => [0, "\xca2"], "\x83" => [0, "\xcaa"], "\x84" => [0, "\xcac"], "\x85" => [0, "\xcae"], "\x86" => [0, "\xcai"], "\x87" => [0, "\xcao"], "\x88" => [0, "\xcas"], "\x89" => [0, "\xcat"], "\x8a" => [73, "\xca"], "\x8b" => [88, "\xca"], "\x8c" => [89, "\xca"], "\x8d" => [96, "\xca"], "\x8e" => [97, "\xca"], "\x8f" => [99, "\xca"], "\x90" => [106, "\xca"], "\x91" => [136, "\xca"], "\x92" => [139, "\xca"], "\x93" => [141, "\xca"], "\x94" => [145, "\xca"], "\x95" => [147, "\xca"], "\x96" => [149, "\xca"], "\x97" => [101, "\xca"], "\x98" => [112, "\xca"], "\x99" => [117, "\xca"], "\x9a" => [120, "\xca"], "\x9b" => [124, "\xca"], "\x9c" => [127, "\xca"], "\x9d" => [144, "\xca"], "\x9e" => [152, "\xca"], "\x9f" => [11, "\xca"], "\xa0" => [0, "\xcd0"], "\xa1" => [0, "\xcd1"], "\xa2" => [0, "\xcd2"], "\xa3" => [0, "\xcda"], "\xa4" => [0, "\xcdc"], "\xa5" => [0, "\xcde"], "\xa6" => [0, "\xcdi"], "\xa7" => [0, "\xcdo"], "\xa8" => [0, "\xcds"], "\xa9" => [0, "\xcdt"], "\xaa" => [73, "\xcd"], "\xab" => [88, "\xcd"], "\xac" => [89, "\xcd"], "\xad" => [96, "\xcd"], "\xae" => [97, "\xcd"], "\xaf" => [99, "\xcd"], "\xb0" => [106, "\xcd"], "\xb1" => [136, "\xcd"], "\xb2" => [139, "\xcd"], "\xb3" => [141, "\xcd"], "\xb4" => [145, "\xcd"], "\xb5" => [147, "\xcd"], "\xb6" => [149, "\xcd"], "\xb7" => [101, "\xcd"], "\xb8" => [112, "\xcd"], "\xb9" => [117, "\xcd"], "\xba" => [120, "\xcd"], "\xbb" => [124, "\xcd"], "\xbc" => [127, "\xcd"], "\xbd" => [144, "\xcd"], "\xbe" => [152, "\xcd"], "\xbf" => [11, "\xcd"], "\xc0" => [0, "\xd20"], "\xc1" => [0, "\xd21"], "\xc2" => [0, "\xd22"], "\xc3" => [0, "\xd2a"], "\xc4" => [0, "\xd2c"], "\xc5" => [0, "\xd2e"], "\xc6" => [0, "\xd2i"], "\xc7" => [0, "\xd2o"], "\xc8" => [0, "\xd2s"], "\xc9" => [0, "\xd2t"], "\xca" => [73, "\xd2"], "\xcb" => [88, "\xd2"], "\xcc" => [89, "\xd2"], "\xcd" => [96, "\xd2"], "\xce" => [97, "\xd2"], "\xcf" => [99, "\xd2"], "\xd0" => [106, "\xd2"], "\xd1" => [136, "\xd2"], "\xd2" => [139, "\xd2"], "\xd3" => [141, "\xd2"], "\xd4" => [145, "\xd2"], "\xd5" => [147, "\xd2"], "\xd6" => [149, "\xd2"], "\xd7" => [101, "\xd2"], "\xd8" => [112, "\xd2"], "\xd9" => [117, "\xd2"], "\xda" => [120, "\xd2"], "\xdb" => [124, "\xd2"], "\xdc" => [127, "\xd2"], "\xdd" => [144, "\xd2"], "\xde" => [152, "\xd2"], "\xdf" => [11, "\xd2"], "\xe0" => [0, "\xd50"], "\xe1" => [0, "\xd51"], "\xe2" => [0, "\xd52"], "\xe3" => [0, "\xd5a"], "\xe4" => [0, "\xd5c"], "\xe5" => [0, "\xd5e"], "\xe6" => [0, "\xd5i"], "\xe7" => [0, "\xd5o"], "\xe8" => [0, "\xd5s"], "\xe9" => [0, "\xd5t"], "\xea" => [73, "\xd5"], "\xeb" => [88, "\xd5"], "\xec" => [89, "\xd5"], "\xed" => [96, "\xd5"], "\xee" => [97, "\xd5"], "\xef" => [99, "\xd5"], "\xf0" => [106, "\xd5"], "\xf1" => [136, "\xd5"], "\xf2" => [139, "\xd5"], "\xf3" => [141, "\xd5"], "\xf4" => [145, "\xd5"], "\xf5" => [147, "\xd5"], "\xf6" => [149, "\xd5"], "\xf7" => [101, "\xd5"], "\xf8" => [112, "\xd5"], "\xf9" => [117, "\xd5"], "\xfa" => [120, "\xd5"], "\xfb" => [124, "\xd5"], "\xfc" => [127, "\xd5"], "\xfd" => [144, "\xd5"], "\xfe" => [152, "\xd5"], "\xff" => [11, "\xd5"]], ["\x00" => [92, "\xc0"], "\x01" => [95, "\xc0"], "\x02" => [137, "\xc0"], "\x03" => [142, "\xc0"], "\x04" => [150, "\xc0"], "\x05" => [74, "\xc0"], "\x06" => [90, "\xc0"], "\x07" => [98, "\xc0"], "\x08" => [107, "\xc0"], "\t" => [140, "\xc0"], "\n" => [146, "\xc0"], "\v" => [102, "\xc0"], "\f" => [113, "\xc0"], "\r" => [121, "\xc0"], "\x0e" => [128, "\xc0"], "\x0f" => [12, "\xc0"], "\x10" => [92, "\xc1"], "\x11" => [95, "\xc1"], "\x12" => [137, "\xc1"], "\x13" => [142, "\xc1"], "\x14" => [150, "\xc1"], "\x15" => [74, "\xc1"], "\x16" => [90, "\xc1"], "\x17" => [98, "\xc1"], "\x18" => [107, "\xc1"], "\x19" => [140, "\xc1"], "\x1a" => [146, "\xc1"], "\x1b" => [102, "\xc1"], "\x1c" => [113, "\xc1"], "\x1d" => [121, "\xc1"], "\x1e" => [128, "\xc1"], "\x1f" => [12, "\xc1"], " " => [92, "\xc8"], "!" => [95, "\xc8"], "\"" => [137, "\xc8"], "#" => [142, "\xc8"], "\$" => [150, "\xc8"], "%" => [74, "\xc8"], "&" => [90, "\xc8"], "'" => [98, "\xc8"], "(" => [107, "\xc8"], ")" => [140, "\xc8"], "*" => [146, "\xc8"], "+" => [102, "\xc8"], "," => [113, "\xc8"], "-" => [121, "\xc8"], "." => [128, "\xc8"], "/" => [12, "\xc8"], [92, "\xc9"], [95, "\xc9"], [137, "\xc9"], [142, "\xc9"], [150, "\xc9"], [74, "\xc9"], [90, "\xc9"], [98, "\xc9"], [107, "\xc9"], [140, "\xc9"], ":" => [146, "\xc9"], ";" => [102, "\xc9"], "<" => [113, "\xc9"], "=" => [121, "\xc9"], ">" => [128, "\xc9"], "?" => [12, "\xc9"], "@" => [92, "\xca"], "A" => [95, "\xca"], "B" => [137, "\xca"], "C" => [142, "\xca"], "D" => [150, "\xca"], "E" => [74, "\xca"], "F" => [90, "\xca"], "G" => [98, "\xca"], "H" => [107, "\xca"], "I" => [140, "\xca"], "J" => [146, "\xca"], "K" => [102, "\xca"], "L" => [113, "\xca"], "M" => [121, "\xca"], "N" => [128, "\xca"], "O" => [12, "\xca"], "P" => [92, "\xcd"], "Q" => [95, "\xcd"], "R" => [137, "\xcd"], "S" => [142, "\xcd"], "T" => [150, "\xcd"], "U" => [74, "\xcd"], "V" => [90, "\xcd"], "W" => [98, "\xcd"], "X" => [107, "\xcd"], "Y" => [140, "\xcd"], "Z" => [146, "\xcd"], "[" => [102, "\xcd"], "\\" => [113, "\xcd"], "]" => [121, "\xcd"], "^" => [128, "\xcd"], "_" => [12, "\xcd"], "`" => [92, "\xd2"], "a" => [95, "\xd2"], "b" => [137, "\xd2"], "c" => [142, "\xd2"], "d" => [150, "\xd2"], "e" => [74, "\xd2"], "f" => [90, "\xd2"], "g" => [98, "\xd2"], "h" => [107, "\xd2"], "i" => [140, "\xd2"], "j" => [146, "\xd2"], "k" => [102, "\xd2"], "l" => [113, "\xd2"], "m" => [121, "\xd2"], "n" => [128, "\xd2"], "o" => [12, "\xd2"], "p" => [92, "\xd5"], "q" => [95, "\xd5"], "r" => [137, "\xd5"], "s" => [142, "\xd5"], "t" => [150, "\xd5"], "u" => [74, "\xd5"], "v" => [90, "\xd5"], "w" => [98, "\xd5"], "x" => [107, "\xd5"], "y" => [140, "\xd5"], "z" => [146, "\xd5"], "{" => [102, "\xd5"], "|" => [113, "\xd5"], "}" => [121, "\xd5"], "~" => [128, "\xd5"], "" => [12, "\xd5"], "\x80" => [92, "\xda"], "\x81" => [95, "\xda"], "\x82" => [137, "\xda"], "\x83" => [142, "\xda"], "\x84" => [150, "\xda"], "\x85" => [74, "\xda"], "\x86" => [90, "\xda"], "\x87" => [98, "\xda"], "\x88" => [107, "\xda"], "\x89" => [140, "\xda"], "\x8a" => [146, "\xda"], "\x8b" => [102, "\xda"], "\x8c" => [113, "\xda"], "\x8d" => [121, "\xda"], "\x8e" => [128, "\xda"], "\x8f" => [12, "\xda"], "\x90" => [92, "\xdb"], "\x91" => [95, "\xdb"], "\x92" => [137, "\xdb"], "\x93" => [142, "\xdb"], "\x94" => [150, "\xdb"], "\x95" => [74, "\xdb"], "\x96" => [90, "\xdb"], "\x97" => [98, "\xdb"], "\x98" => [107, "\xdb"], "\x99" => [140, "\xdb"], "\x9a" => [146, "\xdb"], "\x9b" => [102, "\xdb"], "\x9c" => [113, "\xdb"], "\x9d" => [121, "\xdb"], "\x9e" => [128, "\xdb"], "\x9f" => [12, "\xdb"], "\xa0" => [92, "\xee"], "\xa1" => [95, "\xee"], "\xa2" => [137, "\xee"], "\xa3" => [142, "\xee"], "\xa4" => [150, "\xee"], "\xa5" => [74, "\xee"], "\xa6" => [90, "\xee"], "\xa7" => [98, "\xee"], "\xa8" => [107, "\xee"], "\xa9" => [140, "\xee"], "\xaa" => [146, "\xee"], "\xab" => [102, "\xee"], "\xac" => [113, "\xee"], "\xad" => [121, "\xee"], "\xae" => [128, "\xee"], "\xaf" => [12, "\xee"], "\xb0" => [92, "\xf0"], "\xb1" => [95, "\xf0"], "\xb2" => [137, "\xf0"], "\xb3" => [142, "\xf0"], "\xb4" => [150, "\xf0"], "\xb5" => [74, "\xf0"], "\xb6" => [90, "\xf0"], "\xb7" => [98, "\xf0"], "\xb8" => [107, "\xf0"], "\xb9" => [140, "\xf0"], "\xba" => [146, "\xf0"], "\xbb" => [102, "\xf0"], "\xbc" => [113, "\xf0"], "\xbd" => [121, "\xf0"], "\xbe" => [128, "\xf0"], "\xbf" => [12, "\xf0"], "\xc0" => [92, "\xf2"], "\xc1" => [95, "\xf2"], "\xc2" => [137, "\xf2"], "\xc3" => [142, "\xf2"], "\xc4" => [150, "\xf2"], "\xc5" => [74, "\xf2"], "\xc6" => [90, "\xf2"], "\xc7" => [98, "\xf2"], "\xc8" => [107, "\xf2"], "\xc9" => [140, "\xf2"], "\xca" => [146, "\xf2"], "\xcb" => [102, "\xf2"], "\xcc" => [113, "\xf2"], "\xcd" => [121, "\xf2"], "\xce" => [128, "\xf2"], "\xcf" => [12, "\xf2"], "\xd0" => [92, "\xf3"], "\xd1" => [95, "\xf3"], "\xd2" => [137, "\xf3"], "\xd3" => [142, "\xf3"], "\xd4" => [150, "\xf3"], "\xd5" => [74, "\xf3"], "\xd6" => [90, "\xf3"], "\xd7" => [98, "\xf3"], "\xd8" => [107, "\xf3"], "\xd9" => [140, "\xf3"], "\xda" => [146, "\xf3"], "\xdb" => [102, "\xf3"], "\xdc" => [113, "\xf3"], "\xdd" => [121, "\xf3"], "\xde" => [128, "\xf3"], "\xdf" => [12, "\xf3"], "\xe0" => [92, "\xff"], "\xe1" => [95, "\xff"], "\xe2" => [137, "\xff"], "\xe3" => [142, "\xff"], "\xe4" => [150, "\xff"], "\xe5" => [74, "\xff"], "\xe6" => [90, "\xff"], "\xe7" => [98, "\xff"], "\xe8" => [107, "\xff"], "\xe9" => [140, "\xff"], "\xea" => [146, "\xff"], "\xeb" => [102, "\xff"], "\xec" => [113, "\xff"], "\xed" => [121, "\xff"], "\xee" => [128, "\xff"], "\xef" => [12, "\xff"], "\xf0" => [93, "\xcb"], "\xf1" => [138, "\xcb"], "\xf2" => [75, "\xcb"], "\xf3" => [91, "\xcb"], "\xf4" => [108, "\xcb"], "\xf5" => [103, "\xcb"], "\xf6" => [114, "\xcb"], "\xf7" => [14, "\xcb"], "\xf8" => [93, "\xcc"], "\xf9" => [138, "\xcc"], "\xfa" => [75, "\xcc"], "\xfb" => [91, "\xcc"], "\xfc" => [108, "\xcc"], "\xfd" => [103, "\xcc"], "\xfe" => [114, "\xcc"], "\xff" => [14, "\xcc"]], ["\x00" => [94, "\xc00"], "\x01" => [76, "\xc00"], "\x02" => [104, "\xc00"], "\x03" => [16, "\xc00"], "\x04" => [94, "\xc01"], "\x05" => [76, "\xc01"], "\x06" => [104, "\xc01"], "\x07" => [16, "\xc01"], "\x08" => [94, "\xc02"], "\t" => [76, "\xc02"], "\n" => [104, "\xc02"], "\v" => [16, "\xc02"], "\f" => [94, "\xc0a"], "\r" => [76, "\xc0a"], "\x0e" => [104, "\xc0a"], "\x0f" => [16, "\xc0a"], "\x10" => [94, "\xc0c"], "\x11" => [76, "\xc0c"], "\x12" => [104, "\xc0c"], "\x13" => [16, "\xc0c"], "\x14" => [94, "\xc0e"], "\x15" => [76, "\xc0e"], "\x16" => [104, "\xc0e"], "\x17" => [16, "\xc0e"], "\x18" => [94, "\xc0i"], "\x19" => [76, "\xc0i"], "\x1a" => [104, "\xc0i"], "\x1b" => [16, "\xc0i"], "\x1c" => [94, "\xc0o"], "\x1d" => [76, "\xc0o"], "\x1e" => [104, "\xc0o"], "\x1f" => [16, "\xc0o"], " " => [94, "\xc0s"], "!" => [76, "\xc0s"], "\"" => [104, "\xc0s"], "#" => [16, "\xc0s"], "\$" => [94, "\xc0t"], "%" => [76, "\xc0t"], "&" => [104, "\xc0t"], "'" => [16, "\xc0t"], "(" => [77, "\xc0 "], ")" => [18, "\xc0 "], "*" => [77, "\xc0%"], "+" => [18, "\xc0%"], "," => [77, "\xc0-"], "-" => [18, "\xc0-"], "." => [77, "\xc0."], "/" => [18, "\xc0."], [77, "\xc0/"], [18, "\xc0/"], [77, "\xc03"], [18, "\xc03"], [77, "\xc04"], [18, "\xc04"], [77, "\xc05"], [18, "\xc05"], [77, "\xc06"], [18, "\xc06"], ":" => [77, "\xc07"], ";" => [18, "\xc07"], "<" => [77, "\xc08"], "=" => [18, "\xc08"], ">" => [77, "\xc09"], "?" => [18, "\xc09"], "@" => [77, "\xc0="], "A" => [18, "\xc0="], "B" => [77, "\xc0A"], "C" => [18, "\xc0A"], "D" => [77, "\xc0_"], "E" => [18, "\xc0_"], "F" => [77, "\xc0b"], "G" => [18, "\xc0b"], "H" => [77, "\xc0d"], "I" => [18, "\xc0d"], "J" => [77, "\xc0f"], "K" => [18, "\xc0f"], "L" => [77, "\xc0g"], "M" => [18, "\xc0g"], "N" => [77, "\xc0h"], "O" => [18, "\xc0h"], "P" => [77, "\xc0l"], "Q" => [18, "\xc0l"], "R" => [77, "\xc0m"], "S" => [18, "\xc0m"], "T" => [77, "\xc0n"], "U" => [18, "\xc0n"], "V" => [77, "\xc0p"], "W" => [18, "\xc0p"], "X" => [77, "\xc0r"], "Y" => [18, "\xc0r"], "Z" => [77, "\xc0u"], "[" => [18, "\xc0u"], "\\" => [0, "\xc0:"], "]" => [0, "\xc0B"], "^" => [0, "\xc0C"], "_" => [0, "\xc0D"], "`" => [0, "\xc0E"], "a" => [0, "\xc0F"], "b" => [0, "\xc0G"], "c" => [0, "\xc0H"], "d" => [0, "\xc0I"], "e" => [0, "\xc0J"], "f" => [0, "\xc0K"], "g" => [0, "\xc0L"], "h" => [0, "\xc0M"], "i" => [0, "\xc0N"], "j" => [0, "\xc0O"], "k" => [0, "\xc0P"], "l" => [0, "\xc0Q"], "m" => [0, "\xc0R"], "n" => [0, "\xc0S"], "o" => [0, "\xc0T"], "p" => [0, "\xc0U"], "q" => [0, "\xc0V"], "r" => [0, "\xc0W"], "s" => [0, "\xc0Y"], "t" => [0, "\xc0j"], "u" => [0, "\xc0k"], "v" => [0, "\xc0q"], "w" => [0, "\xc0v"], "x" => [0, "\xc0w"], "y" => [0, "\xc0x"], "z" => [0, "\xc0y"], "{" => [0, "\xc0z"], "|" => [82, "\xc0"], "}" => [87, "\xc0"], "~" => [130, "\xc0"], "" => [9, "\xc0"], "\x80" => [94, "\xc10"], "\x81" => [76, "\xc10"], "\x82" => [104, "\xc10"], "\x83" => [16, "\xc10"], "\x84" => [94, "\xc11"], "\x85" => [76, "\xc11"], "\x86" => [104, "\xc11"], "\x87" => [16, "\xc11"], "\x88" => [94, "\xc12"], "\x89" => [76, "\xc12"], "\x8a" => [104, "\xc12"], "\x8b" => [16, "\xc12"], "\x8c" => [94, "\xc1a"], "\x8d" => [76, "\xc1a"], "\x8e" => [104, "\xc1a"], "\x8f" => [16, "\xc1a"], "\x90" => [94, "\xc1c"], "\x91" => [76, "\xc1c"], "\x92" => [104, "\xc1c"], "\x93" => [16, "\xc1c"], "\x94" => [94, "\xc1e"], "\x95" => [76, "\xc1e"], "\x96" => [104, "\xc1e"], "\x97" => [16, "\xc1e"], "\x98" => [94, "\xc1i"], "\x99" => [76, "\xc1i"], "\x9a" => [104, "\xc1i"], "\x9b" => [16, "\xc1i"], "\x9c" => [94, "\xc1o"], "\x9d" => [76, "\xc1o"], "\x9e" => [104, "\xc1o"], "\x9f" => [16, "\xc1o"], "\xa0" => [94, "\xc1s"], "\xa1" => [76, "\xc1s"], "\xa2" => [104, "\xc1s"], "\xa3" => [16, "\xc1s"], "\xa4" => [94, "\xc1t"], "\xa5" => [76, "\xc1t"], "\xa6" => [104, "\xc1t"], "\xa7" => [16, "\xc1t"], "\xa8" => [77, "\xc1 "], "\xa9" => [18, "\xc1 "], "\xaa" => [77, "\xc1%"], "\xab" => [18, "\xc1%"], "\xac" => [77, "\xc1-"], "\xad" => [18, "\xc1-"], "\xae" => [77, "\xc1."], "\xaf" => [18, "\xc1."], "\xb0" => [77, "\xc1/"], "\xb1" => [18, "\xc1/"], "\xb2" => [77, "\xc13"], "\xb3" => [18, "\xc13"], "\xb4" => [77, "\xc14"], "\xb5" => [18, "\xc14"], "\xb6" => [77, "\xc15"], "\xb7" => [18, "\xc15"], "\xb8" => [77, "\xc16"], "\xb9" => [18, "\xc16"], "\xba" => [77, "\xc17"], "\xbb" => [18, "\xc17"], "\xbc" => [77, "\xc18"], "\xbd" => [18, "\xc18"], "\xbe" => [77, "\xc19"], "\xbf" => [18, "\xc19"], "\xc0" => [77, "\xc1="], "\xc1" => [18, "\xc1="], "\xc2" => [77, "\xc1A"], "\xc3" => [18, "\xc1A"], "\xc4" => [77, "\xc1_"], "\xc5" => [18, "\xc1_"], "\xc6" => [77, "\xc1b"], "\xc7" => [18, "\xc1b"], "\xc8" => [77, "\xc1d"], "\xc9" => [18, "\xc1d"], "\xca" => [77, "\xc1f"], "\xcb" => [18, "\xc1f"], "\xcc" => [77, "\xc1g"], "\xcd" => [18, "\xc1g"], "\xce" => [77, "\xc1h"], "\xcf" => [18, "\xc1h"], "\xd0" => [77, "\xc1l"], "\xd1" => [18, "\xc1l"], "\xd2" => [77, "\xc1m"], "\xd3" => [18, "\xc1m"], "\xd4" => [77, "\xc1n"], "\xd5" => [18, "\xc1n"], "\xd6" => [77, "\xc1p"], "\xd7" => [18, "\xc1p"], "\xd8" => [77, "\xc1r"], "\xd9" => [18, "\xc1r"], "\xda" => [77, "\xc1u"], "\xdb" => [18, "\xc1u"], "\xdc" => [0, "\xc1:"], "\xdd" => [0, "\xc1B"], "\xde" => [0, "\xc1C"], "\xdf" => [0, "\xc1D"], "\xe0" => [0, "\xc1E"], "\xe1" => [0, "\xc1F"], "\xe2" => [0, "\xc1G"], "\xe3" => [0, "\xc1H"], "\xe4" => [0, "\xc1I"], "\xe5" => [0, "\xc1J"], "\xe6" => [0, "\xc1K"], "\xe7" => [0, "\xc1L"], "\xe8" => [0, "\xc1M"], "\xe9" => [0, "\xc1N"], "\xea" => [0, "\xc1O"], "\xeb" => [0, "\xc1P"], "\xec" => [0, "\xc1Q"], "\xed" => [0, "\xc1R"], "\xee" => [0, "\xc1S"], "\xef" => [0, "\xc1T"], "\xf0" => [0, "\xc1U"], "\xf1" => [0, "\xc1V"], "\xf2" => [0, "\xc1W"], "\xf3" => [0, "\xc1Y"], "\xf4" => [0, "\xc1j"], "\xf5" => [0, "\xc1k"], "\xf6" => [0, "\xc1q"], "\xf7" => [0, "\xc1v"], "\xf8" => [0, "\xc1w"], "\xf9" => [0, "\xc1x"], "\xfa" => [0, "\xc1y"], "\xfb" => [0, "\xc1z"], "\xfc" => [82, "\xc1"], "\xfd" => [87, "\xc1"], "\xfe" => [130, "\xc1"], "\xff" => [9, "\xc1"]], ["\x00" => [94, "\xc50"], "\x01" => [76, "\xc50"], "\x02" => [104, "\xc50"], "\x03" => [16, "\xc50"], "\x04" => [94, "\xc51"], "\x05" => [76, "\xc51"], "\x06" => [104, "\xc51"], "\x07" => [16, "\xc51"], "\x08" => [94, "\xc52"], "\t" => [76, "\xc52"], "\n" => [104, "\xc52"], "\v" => [16, "\xc52"], "\f" => [94, "\xc5a"], "\r" => [76, "\xc5a"], "\x0e" => [104, "\xc5a"], "\x0f" => [16, "\xc5a"], "\x10" => [94, "\xc5c"], "\x11" => [76, "\xc5c"], "\x12" => [104, "\xc5c"], "\x13" => [16, "\xc5c"], "\x14" => [94, "\xc5e"], "\x15" => [76, "\xc5e"], "\x16" => [104, "\xc5e"], "\x17" => [16, "\xc5e"], "\x18" => [94, "\xc5i"], "\x19" => [76, "\xc5i"], "\x1a" => [104, "\xc5i"], "\x1b" => [16, "\xc5i"], "\x1c" => [94, "\xc5o"], "\x1d" => [76, "\xc5o"], "\x1e" => [104, "\xc5o"], "\x1f" => [16, "\xc5o"], " " => [94, "\xc5s"], "!" => [76, "\xc5s"], "\"" => [104, "\xc5s"], "#" => [16, "\xc5s"], "\$" => [94, "\xc5t"], "%" => [76, "\xc5t"], "&" => [104, "\xc5t"], "'" => [16, "\xc5t"], "(" => [77, "\xc5 "], ")" => [18, "\xc5 "], "*" => [77, "\xc5%"], "+" => [18, "\xc5%"], "," => [77, "\xc5-"], "-" => [18, "\xc5-"], "." => [77, "\xc5."], "/" => [18, "\xc5."], [77, "\xc5/"], [18, "\xc5/"], [77, "\xc53"], [18, "\xc53"], [77, "\xc54"], [18, "\xc54"], [77, "\xc55"], [18, "\xc55"], [77, "\xc56"], [18, "\xc56"], ":" => [77, "\xc57"], ";" => [18, "\xc57"], "<" => [77, "\xc58"], "=" => [18, "\xc58"], ">" => [77, "\xc59"], "?" => [18, "\xc59"], "@" => [77, "\xc5="], "A" => [18, "\xc5="], "B" => [77, "\xc5A"], "C" => [18, "\xc5A"], "D" => [77, "\xc5_"], "E" => [18, "\xc5_"], "F" => [77, "\xc5b"], "G" => [18, "\xc5b"], "H" => [77, "\xc5d"], "I" => [18, "\xc5d"], "J" => [77, "\xc5f"], "K" => [18, "\xc5f"], "L" => [77, "\xc5g"], "M" => [18, "\xc5g"], "N" => [77, "\xc5h"], "O" => [18, "\xc5h"], "P" => [77, "\xc5l"], "Q" => [18, "\xc5l"], "R" => [77, "\xc5m"], "S" => [18, "\xc5m"], "T" => [77, "\xc5n"], "U" => [18, "\xc5n"], "V" => [77, "\xc5p"], "W" => [18, "\xc5p"], "X" => [77, "\xc5r"], "Y" => [18, "\xc5r"], "Z" => [77, "\xc5u"], "[" => [18, "\xc5u"], "\\" => [0, "\xc5:"], "]" => [0, "\xc5B"], "^" => [0, "\xc5C"], "_" => [0, "\xc5D"], "`" => [0, "\xc5E"], "a" => [0, "\xc5F"], "b" => [0, "\xc5G"], "c" => [0, "\xc5H"], "d" => [0, "\xc5I"], "e" => [0, "\xc5J"], "f" => [0, "\xc5K"], "g" => [0, "\xc5L"], "h" => [0, "\xc5M"], "i" => [0, "\xc5N"], "j" => [0, "\xc5O"], "k" => [0, "\xc5P"], "l" => [0, "\xc5Q"], "m" => [0, "\xc5R"], "n" => [0, "\xc5S"], "o" => [0, "\xc5T"], "p" => [0, "\xc5U"], "q" => [0, "\xc5V"], "r" => [0, "\xc5W"], "s" => [0, "\xc5Y"], "t" => [0, "\xc5j"], "u" => [0, "\xc5k"], "v" => [0, "\xc5q"], "w" => [0, "\xc5v"], "x" => [0, "\xc5w"], "y" => [0, "\xc5x"], "z" => [0, "\xc5y"], "{" => [0, "\xc5z"], "|" => [82, "\xc5"], "}" => [87, "\xc5"], "~" => [130, "\xc5"], "" => [9, "\xc5"], "\x80" => [94, "\xe70"], "\x81" => [76, "\xe70"], "\x82" => [104, "\xe70"], "\x83" => [16, "\xe70"], "\x84" => [94, "\xe71"], "\x85" => [76, "\xe71"], "\x86" => [104, "\xe71"], "\x87" => [16, "\xe71"], "\x88" => [94, "\xe72"], "\x89" => [76, "\xe72"], "\x8a" => [104, "\xe72"], "\x8b" => [16, "\xe72"], "\x8c" => [94, "\xe7a"], "\x8d" => [76, "\xe7a"], "\x8e" => [104, "\xe7a"], "\x8f" => [16, "\xe7a"], "\x90" => [94, "\xe7c"], "\x91" => [76, "\xe7c"], "\x92" => [104, "\xe7c"], "\x93" => [16, "\xe7c"], "\x94" => [94, "\xe7e"], "\x95" => [76, "\xe7e"], "\x96" => [104, "\xe7e"], "\x97" => [16, "\xe7e"], "\x98" => [94, "\xe7i"], "\x99" => [76, "\xe7i"], "\x9a" => [104, "\xe7i"], "\x9b" => [16, "\xe7i"], "\x9c" => [94, "\xe7o"], "\x9d" => [76, "\xe7o"], "\x9e" => [104, "\xe7o"], "\x9f" => [16, "\xe7o"], "\xa0" => [94, "\xe7s"], "\xa1" => [76, "\xe7s"], "\xa2" => [104, "\xe7s"], "\xa3" => [16, "\xe7s"], "\xa4" => [94, "\xe7t"], "\xa5" => [76, "\xe7t"], "\xa6" => [104, "\xe7t"], "\xa7" => [16, "\xe7t"], "\xa8" => [77, "\xe7 "], "\xa9" => [18, "\xe7 "], "\xaa" => [77, "\xe7%"], "\xab" => [18, "\xe7%"], "\xac" => [77, "\xe7-"], "\xad" => [18, "\xe7-"], "\xae" => [77, "\xe7."], "\xaf" => [18, "\xe7."], "\xb0" => [77, "\xe7/"], "\xb1" => [18, "\xe7/"], "\xb2" => [77, "\xe73"], "\xb3" => [18, "\xe73"], "\xb4" => [77, "\xe74"], "\xb5" => [18, "\xe74"], "\xb6" => [77, "\xe75"], "\xb7" => [18, "\xe75"], "\xb8" => [77, "\xe76"], "\xb9" => [18, "\xe76"], "\xba" => [77, "\xe77"], "\xbb" => [18, "\xe77"], "\xbc" => [77, "\xe78"], "\xbd" => [18, "\xe78"], "\xbe" => [77, "\xe79"], "\xbf" => [18, "\xe79"], "\xc0" => [77, "\xe7="], "\xc1" => [18, "\xe7="], "\xc2" => [77, "\xe7A"], "\xc3" => [18, "\xe7A"], "\xc4" => [77, "\xe7_"], "\xc5" => [18, "\xe7_"], "\xc6" => [77, "\xe7b"], "\xc7" => [18, "\xe7b"], "\xc8" => [77, "\xe7d"], "\xc9" => [18, "\xe7d"], "\xca" => [77, "\xe7f"], "\xcb" => [18, "\xe7f"], "\xcc" => [77, "\xe7g"], "\xcd" => [18, "\xe7g"], "\xce" => [77, "\xe7h"], "\xcf" => [18, "\xe7h"], "\xd0" => [77, "\xe7l"], "\xd1" => [18, "\xe7l"], "\xd2" => [77, "\xe7m"], "\xd3" => [18, "\xe7m"], "\xd4" => [77, "\xe7n"], "\xd5" => [18, "\xe7n"], "\xd6" => [77, "\xe7p"], "\xd7" => [18, "\xe7p"], "\xd8" => [77, "\xe7r"], "\xd9" => [18, "\xe7r"], "\xda" => [77, "\xe7u"], "\xdb" => [18, "\xe7u"], "\xdc" => [0, "\xe7:"], "\xdd" => [0, "\xe7B"], "\xde" => [0, "\xe7C"], "\xdf" => [0, "\xe7D"], "\xe0" => [0, "\xe7E"], "\xe1" => [0, "\xe7F"], "\xe2" => [0, "\xe7G"], "\xe3" => [0, "\xe7H"], "\xe4" => [0, "\xe7I"], "\xe5" => [0, "\xe7J"], "\xe6" => [0, "\xe7K"], "\xe7" => [0, "\xe7L"], "\xe8" => [0, "\xe7M"], "\xe9" => [0, "\xe7N"], "\xea" => [0, "\xe7O"], "\xeb" => [0, "\xe7P"], "\xec" => [0, "\xe7Q"], "\xed" => [0, "\xe7R"], "\xee" => [0, "\xe7S"], "\xef" => [0, "\xe7T"], "\xf0" => [0, "\xe7U"], "\xf1" => [0, "\xe7V"], "\xf2" => [0, "\xe7W"], "\xf3" => [0, "\xe7Y"], "\xf4" => [0, "\xe7j"], "\xf5" => [0, "\xe7k"], "\xf6" => [0, "\xe7q"], "\xf7" => [0, "\xe7v"], "\xf8" => [0, "\xe7w"], "\xf9" => [0, "\xe7x"], "\xfa" => [0, "\xe7y"], "\xfb" => [0, "\xe7z"], "\xfc" => [82, "\xe7"], "\xfd" => [87, "\xe7"], "\xfe" => [130, "\xe7"], "\xff" => [9, "\xe7"]], ["\x00" => [94, "\xc60"], "\x01" => [76, "\xc60"], "\x02" => [104, "\xc60"], "\x03" => [16, "\xc60"], "\x04" => [94, "\xc61"], "\x05" => [76, "\xc61"], "\x06" => [104, "\xc61"], "\x07" => [16, "\xc61"], "\x08" => [94, "\xc62"], "\t" => [76, "\xc62"], "\n" => [104, "\xc62"], "\v" => [16, "\xc62"], "\f" => [94, "\xc6a"], "\r" => [76, "\xc6a"], "\x0e" => [104, "\xc6a"], "\x0f" => [16, "\xc6a"], "\x10" => [94, "\xc6c"], "\x11" => [76, "\xc6c"], "\x12" => [104, "\xc6c"], "\x13" => [16, "\xc6c"], "\x14" => [94, "\xc6e"], "\x15" => [76, "\xc6e"], "\x16" => [104, "\xc6e"], "\x17" => [16, "\xc6e"], "\x18" => [94, "\xc6i"], "\x19" => [76, "\xc6i"], "\x1a" => [104, "\xc6i"], "\x1b" => [16, "\xc6i"], "\x1c" => [94, "\xc6o"], "\x1d" => [76, "\xc6o"], "\x1e" => [104, "\xc6o"], "\x1f" => [16, "\xc6o"], " " => [94, "\xc6s"], "!" => [76, "\xc6s"], "\"" => [104, "\xc6s"], "#" => [16, "\xc6s"], "\$" => [94, "\xc6t"], "%" => [76, "\xc6t"], "&" => [104, "\xc6t"], "'" => [16, "\xc6t"], "(" => [77, "\xc6 "], ")" => [18, "\xc6 "], "*" => [77, "\xc6%"], "+" => [18, "\xc6%"], "," => [77, "\xc6-"], "-" => [18, "\xc6-"], "." => [77, "\xc6."], "/" => [18, "\xc6."], [77, "\xc6/"], [18, "\xc6/"], [77, "\xc63"], [18, "\xc63"], [77, "\xc64"], [18, "\xc64"], [77, "\xc65"], [18, "\xc65"], [77, "\xc66"], [18, "\xc66"], ":" => [77, "\xc67"], ";" => [18, "\xc67"], "<" => [77, "\xc68"], "=" => [18, "\xc68"], ">" => [77, "\xc69"], "?" => [18, "\xc69"], "@" => [77, "\xc6="], "A" => [18, "\xc6="], "B" => [77, "\xc6A"], "C" => [18, "\xc6A"], "D" => [77, "\xc6_"], "E" => [18, "\xc6_"], "F" => [77, "\xc6b"], "G" => [18, "\xc6b"], "H" => [77, "\xc6d"], "I" => [18, "\xc6d"], "J" => [77, "\xc6f"], "K" => [18, "\xc6f"], "L" => [77, "\xc6g"], "M" => [18, "\xc6g"], "N" => [77, "\xc6h"], "O" => [18, "\xc6h"], "P" => [77, "\xc6l"], "Q" => [18, "\xc6l"], "R" => [77, "\xc6m"], "S" => [18, "\xc6m"], "T" => [77, "\xc6n"], "U" => [18, "\xc6n"], "V" => [77, "\xc6p"], "W" => [18, "\xc6p"], "X" => [77, "\xc6r"], "Y" => [18, "\xc6r"], "Z" => [77, "\xc6u"], "[" => [18, "\xc6u"], "\\" => [0, "\xc6:"], "]" => [0, "\xc6B"], "^" => [0, "\xc6C"], "_" => [0, "\xc6D"], "`" => [0, "\xc6E"], "a" => [0, "\xc6F"], "b" => [0, "\xc6G"], "c" => [0, "\xc6H"], "d" => [0, "\xc6I"], "e" => [0, "\xc6J"], "f" => [0, "\xc6K"], "g" => [0, "\xc6L"], "h" => [0, "\xc6M"], "i" => [0, "\xc6N"], "j" => [0, "\xc6O"], "k" => [0, "\xc6P"], "l" => [0, "\xc6Q"], "m" => [0, "\xc6R"], "n" => [0, "\xc6S"], "o" => [0, "\xc6T"], "p" => [0, "\xc6U"], "q" => [0, "\xc6V"], "r" => [0, "\xc6W"], "s" => [0, "\xc6Y"], "t" => [0, "\xc6j"], "u" => [0, "\xc6k"], "v" => [0, "\xc6q"], "w" => [0, "\xc6v"], "x" => [0, "\xc6w"], "y" => [0, "\xc6x"], "z" => [0, "\xc6y"], "{" => [0, "\xc6z"], "|" => [82, "\xc6"], "}" => [87, "\xc6"], "~" => [130, "\xc6"], "" => [9, "\xc6"], "\x80" => [94, "\xe40"], "\x81" => [76, "\xe40"], "\x82" => [104, "\xe40"], "\x83" => [16, "\xe40"], "\x84" => [94, "\xe41"], "\x85" => [76, "\xe41"], "\x86" => [104, "\xe41"], "\x87" => [16, "\xe41"], "\x88" => [94, "\xe42"], "\x89" => [76, "\xe42"], "\x8a" => [104, "\xe42"], "\x8b" => [16, "\xe42"], "\x8c" => [94, "\xe4a"], "\x8d" => [76, "\xe4a"], "\x8e" => [104, "\xe4a"], "\x8f" => [16, "\xe4a"], "\x90" => [94, "\xe4c"], "\x91" => [76, "\xe4c"], "\x92" => [104, "\xe4c"], "\x93" => [16, "\xe4c"], "\x94" => [94, "\xe4e"], "\x95" => [76, "\xe4e"], "\x96" => [104, "\xe4e"], "\x97" => [16, "\xe4e"], "\x98" => [94, "\xe4i"], "\x99" => [76, "\xe4i"], "\x9a" => [104, "\xe4i"], "\x9b" => [16, "\xe4i"], "\x9c" => [94, "\xe4o"], "\x9d" => [76, "\xe4o"], "\x9e" => [104, "\xe4o"], "\x9f" => [16, "\xe4o"], "\xa0" => [94, "\xe4s"], "\xa1" => [76, "\xe4s"], "\xa2" => [104, "\xe4s"], "\xa3" => [16, "\xe4s"], "\xa4" => [94, "\xe4t"], "\xa5" => [76, "\xe4t"], "\xa6" => [104, "\xe4t"], "\xa7" => [16, "\xe4t"], "\xa8" => [77, "\xe4 "], "\xa9" => [18, "\xe4 "], "\xaa" => [77, "\xe4%"], "\xab" => [18, "\xe4%"], "\xac" => [77, "\xe4-"], "\xad" => [18, "\xe4-"], "\xae" => [77, "\xe4."], "\xaf" => [18, "\xe4."], "\xb0" => [77, "\xe4/"], "\xb1" => [18, "\xe4/"], "\xb2" => [77, "\xe43"], "\xb3" => [18, "\xe43"], "\xb4" => [77, "\xe44"], "\xb5" => [18, "\xe44"], "\xb6" => [77, "\xe45"], "\xb7" => [18, "\xe45"], "\xb8" => [77, "\xe46"], "\xb9" => [18, "\xe46"], "\xba" => [77, "\xe47"], "\xbb" => [18, "\xe47"], "\xbc" => [77, "\xe48"], "\xbd" => [18, "\xe48"], "\xbe" => [77, "\xe49"], "\xbf" => [18, "\xe49"], "\xc0" => [77, "\xe4="], "\xc1" => [18, "\xe4="], "\xc2" => [77, "\xe4A"], "\xc3" => [18, "\xe4A"], "\xc4" => [77, "\xe4_"], "\xc5" => [18, "\xe4_"], "\xc6" => [77, "\xe4b"], "\xc7" => [18, "\xe4b"], "\xc8" => [77, "\xe4d"], "\xc9" => [18, "\xe4d"], "\xca" => [77, "\xe4f"], "\xcb" => [18, "\xe4f"], "\xcc" => [77, "\xe4g"], "\xcd" => [18, "\xe4g"], "\xce" => [77, "\xe4h"], "\xcf" => [18, "\xe4h"], "\xd0" => [77, "\xe4l"], "\xd1" => [18, "\xe4l"], "\xd2" => [77, "\xe4m"], "\xd3" => [18, "\xe4m"], "\xd4" => [77, "\xe4n"], "\xd5" => [18, "\xe4n"], "\xd6" => [77, "\xe4p"], "\xd7" => [18, "\xe4p"], "\xd8" => [77, "\xe4r"], "\xd9" => [18, "\xe4r"], "\xda" => [77, "\xe4u"], "\xdb" => [18, "\xe4u"], "\xdc" => [0, "\xe4:"], "\xdd" => [0, "\xe4B"], "\xde" => [0, "\xe4C"], "\xdf" => [0, "\xe4D"], "\xe0" => [0, "\xe4E"], "\xe1" => [0, "\xe4F"], "\xe2" => [0, "\xe4G"], "\xe3" => [0, "\xe4H"], "\xe4" => [0, "\xe4I"], "\xe5" => [0, "\xe4J"], "\xe6" => [0, "\xe4K"], "\xe7" => [0, "\xe4L"], "\xe8" => [0, "\xe4M"], "\xe9" => [0, "\xe4N"], "\xea" => [0, "\xe4O"], "\xeb" => [0, "\xe4P"], "\xec" => [0, "\xe4Q"], "\xed" => [0, "\xe4R"], "\xee" => [0, "\xe4S"], "\xef" => [0, "\xe4T"], "\xf0" => [0, "\xe4U"], "\xf1" => [0, "\xe4V"], "\xf2" => [0, "\xe4W"], "\xf3" => [0, "\xe4Y"], "\xf4" => [0, "\xe4j"], "\xf5" => [0, "\xe4k"], "\xf6" => [0, "\xe4q"], "\xf7" => [0, "\xe4v"], "\xf8" => [0, "\xe4w"], "\xf9" => [0, "\xe4x"], "\xfa" => [0, "\xe4y"], "\xfb" => [0, "\xe4z"], "\xfc" => [82, "\xe4"], "\xfd" => [87, "\xe4"], "\xfe" => [130, "\xe4"], "\xff" => [9, "\xe4"]], ["\x00" => [77, "\xc60"], "\x01" => [18, "\xc60"], "\x02" => [77, "\xc61"], "\x03" => [18, "\xc61"], "\x04" => [77, "\xc62"], "\x05" => [18, "\xc62"], "\x06" => [77, "\xc6a"], "\x07" => [18, "\xc6a"], "\x08" => [77, "\xc6c"], "\t" => [18, "\xc6c"], "\n" => [77, "\xc6e"], "\v" => [18, "\xc6e"], "\f" => [77, "\xc6i"], "\r" => [18, "\xc6i"], "\x0e" => [77, "\xc6o"], "\x0f" => [18, "\xc6o"], "\x10" => [77, "\xc6s"], "\x11" => [18, "\xc6s"], "\x12" => [77, "\xc6t"], "\x13" => [18, "\xc6t"], "\x14" => [0, "\xc6 "], "\x15" => [0, "\xc6%"], "\x16" => [0, "\xc6-"], "\x17" => [0, "\xc6."], "\x18" => [0, "\xc6/"], "\x19" => [0, "\xc63"], "\x1a" => [0, "\xc64"], "\x1b" => [0, "\xc65"], "\x1c" => [0, "\xc66"], "\x1d" => [0, "\xc67"], "\x1e" => [0, "\xc68"], "\x1f" => [0, "\xc69"], " " => [0, "\xc6="], "!" => [0, "\xc6A"], "\"" => [0, "\xc6_"], "#" => [0, "\xc6b"], "\$" => [0, "\xc6d"], "%" => [0, "\xc6f"], "&" => [0, "\xc6g"], "'" => [0, "\xc6h"], "(" => [0, "\xc6l"], ")" => [0, "\xc6m"], "*" => [0, "\xc6n"], "+" => [0, "\xc6p"], "," => [0, "\xc6r"], "-" => [0, "\xc6u"], "." => [100, "\xc6"], "/" => [110, "\xc6"], [111, "\xc6"], [115, "\xc6"], [116, "\xc6"], [118, "\xc6"], [119, "\xc6"], [122, "\xc6"], [123, "\xc6"], [125, "\xc6"], [126, "\xc6"], [129, "\xc6"], ":" => [143, "\xc6"], ";" => [148, "\xc6"], "<" => [151, "\xc6"], "=" => [153, "\xc6"], ">" => [83, "\xc6"], "?" => [10, "\xc6"], "@" => [77, "\xe40"], "A" => [18, "\xe40"], "B" => [77, "\xe41"], "C" => [18, "\xe41"], "D" => [77, "\xe42"], "E" => [18, "\xe42"], "F" => [77, "\xe4a"], "G" => [18, "\xe4a"], "H" => [77, "\xe4c"], "I" => [18, "\xe4c"], "J" => [77, "\xe4e"], "K" => [18, "\xe4e"], "L" => [77, "\xe4i"], "M" => [18, "\xe4i"], "N" => [77, "\xe4o"], "O" => [18, "\xe4o"], "P" => [77, "\xe4s"], "Q" => [18, "\xe4s"], "R" => [77, "\xe4t"], "S" => [18, "\xe4t"], "T" => [0, "\xe4 "], "U" => [0, "\xe4%"], "V" => [0, "\xe4-"], "W" => [0, "\xe4."], "X" => [0, "\xe4/"], "Y" => [0, "\xe43"], "Z" => [0, "\xe44"], "[" => [0, "\xe45"], "\\" => [0, "\xe46"], "]" => [0, "\xe47"], "^" => [0, "\xe48"], "_" => [0, "\xe49"], "`" => [0, "\xe4="], "a" => [0, "\xe4A"], "b" => [0, "\xe4_"], "c" => [0, "\xe4b"], "d" => [0, "\xe4d"], "e" => [0, "\xe4f"], "f" => [0, "\xe4g"], "g" => [0, "\xe4h"], "h" => [0, "\xe4l"], "i" => [0, "\xe4m"], "j" => [0, "\xe4n"], "k" => [0, "\xe4p"], "l" => [0, "\xe4r"], "m" => [0, "\xe4u"], "n" => [100, "\xe4"], "o" => [110, "\xe4"], "p" => [111, "\xe4"], "q" => [115, "\xe4"], "r" => [116, "\xe4"], "s" => [118, "\xe4"], "t" => [119, "\xe4"], "u" => [122, "\xe4"], "v" => [123, "\xe4"], "w" => [125, "\xe4"], "x" => [126, "\xe4"], "y" => [129, "\xe4"], "z" => [143, "\xe4"], "{" => [148, "\xe4"], "|" => [151, "\xe4"], "}" => [153, "\xe4"], "~" => [83, "\xe4"], "" => [10, "\xe4"], "\x80" => [77, "\xe80"], "\x81" => [18, "\xe80"], "\x82" => [77, "\xe81"], "\x83" => [18, "\xe81"], "\x84" => [77, "\xe82"], "\x85" => [18, "\xe82"], "\x86" => [77, "\xe8a"], "\x87" => [18, "\xe8a"], "\x88" => [77, "\xe8c"], "\x89" => [18, "\xe8c"], "\x8a" => [77, "\xe8e"], "\x8b" => [18, "\xe8e"], "\x8c" => [77, "\xe8i"], "\x8d" => [18, "\xe8i"], "\x8e" => [77, "\xe8o"], "\x8f" => [18, "\xe8o"], "\x90" => [77, "\xe8s"], "\x91" => [18, "\xe8s"], "\x92" => [77, "\xe8t"], "\x93" => [18, "\xe8t"], "\x94" => [0, "\xe8 "], "\x95" => [0, "\xe8%"], "\x96" => [0, "\xe8-"], "\x97" => [0, "\xe8."], "\x98" => [0, "\xe8/"], "\x99" => [0, "\xe83"], "\x9a" => [0, "\xe84"], "\x9b" => [0, "\xe85"], "\x9c" => [0, "\xe86"], "\x9d" => [0, "\xe87"], "\x9e" => [0, "\xe88"], "\x9f" => [0, "\xe89"], "\xa0" => [0, "\xe8="], "\xa1" => [0, "\xe8A"], "\xa2" => [0, "\xe8_"], "\xa3" => [0, "\xe8b"], "\xa4" => [0, "\xe8d"], "\xa5" => [0, "\xe8f"], "\xa6" => [0, "\xe8g"], "\xa7" => [0, "\xe8h"], "\xa8" => [0, "\xe8l"], "\xa9" => [0, "\xe8m"], "\xaa" => [0, "\xe8n"], "\xab" => [0, "\xe8p"], "\xac" => [0, "\xe8r"], "\xad" => [0, "\xe8u"], "\xae" => [100, "\xe8"], "\xaf" => [110, "\xe8"], "\xb0" => [111, "\xe8"], "\xb1" => [115, "\xe8"], "\xb2" => [116, "\xe8"], "\xb3" => [118, "\xe8"], "\xb4" => [119, "\xe8"], "\xb5" => [122, "\xe8"], "\xb6" => [123, "\xe8"], "\xb7" => [125, "\xe8"], "\xb8" => [126, "\xe8"], "\xb9" => [129, "\xe8"], "\xba" => [143, "\xe8"], "\xbb" => [148, "\xe8"], "\xbc" => [151, "\xe8"], "\xbd" => [153, "\xe8"], "\xbe" => [83, "\xe8"], "\xbf" => [10, "\xe8"], "\xc0" => [77, "\xe90"], "\xc1" => [18, "\xe90"], "\xc2" => [77, "\xe91"], "\xc3" => [18, "\xe91"], "\xc4" => [77, "\xe92"], "\xc5" => [18, "\xe92"], "\xc6" => [77, "\xe9a"], "\xc7" => [18, "\xe9a"], "\xc8" => [77, "\xe9c"], "\xc9" => [18, "\xe9c"], "\xca" => [77, "\xe9e"], "\xcb" => [18, "\xe9e"], "\xcc" => [77, "\xe9i"], "\xcd" => [18, "\xe9i"], "\xce" => [77, "\xe9o"], "\xcf" => [18, "\xe9o"], "\xd0" => [77, "\xe9s"], "\xd1" => [18, "\xe9s"], "\xd2" => [77, "\xe9t"], "\xd3" => [18, "\xe9t"], "\xd4" => [0, "\xe9 "], "\xd5" => [0, "\xe9%"], "\xd6" => [0, "\xe9-"], "\xd7" => [0, "\xe9."], "\xd8" => [0, "\xe9/"], "\xd9" => [0, "\xe93"], "\xda" => [0, "\xe94"], "\xdb" => [0, "\xe95"], "\xdc" => [0, "\xe96"], "\xdd" => [0, "\xe97"], "\xde" => [0, "\xe98"], "\xdf" => [0, "\xe99"], "\xe0" => [0, "\xe9="], "\xe1" => [0, "\xe9A"], "\xe2" => [0, "\xe9_"], "\xe3" => [0, "\xe9b"], "\xe4" => [0, "\xe9d"], "\xe5" => [0, "\xe9f"], "\xe6" => [0, "\xe9g"], "\xe7" => [0, "\xe9h"], "\xe8" => [0, "\xe9l"], "\xe9" => [0, "\xe9m"], "\xea" => [0, "\xe9n"], "\xeb" => [0, "\xe9p"], "\xec" => [0, "\xe9r"], "\xed" => [0, "\xe9u"], "\xee" => [100, "\xe9"], "\xef" => [110, "\xe9"], "\xf0" => [111, "\xe9"], "\xf1" => [115, "\xe9"], "\xf2" => [116, "\xe9"], "\xf3" => [118, "\xe9"], "\xf4" => [119, "\xe9"], "\xf5" => [122, "\xe9"], "\xf6" => [123, "\xe9"], "\xf7" => [125, "\xe9"], "\xf8" => [126, "\xe9"], "\xf9" => [129, "\xe9"], "\xfa" => [143, "\xe9"], "\xfb" => [148, "\xe9"], "\xfc" => [151, "\xe9"], "\xfd" => [153, "\xe9"], "\xfe" => [83, "\xe9"], "\xff" => [10, "\xe9"]], ["\x00" => [94, "\xc70"], "\x01" => [76, "\xc70"], "\x02" => [104, "\xc70"], "\x03" => [16, "\xc70"], "\x04" => [94, "\xc71"], "\x05" => [76, "\xc71"], "\x06" => [104, "\xc71"], "\x07" => [16, "\xc71"], "\x08" => [94, "\xc72"], "\t" => [76, "\xc72"], "\n" => [104, "\xc72"], "\v" => [16, "\xc72"], "\f" => [94, "\xc7a"], "\r" => [76, "\xc7a"], "\x0e" => [104, "\xc7a"], "\x0f" => [16, "\xc7a"], "\x10" => [94, "\xc7c"], "\x11" => [76, "\xc7c"], "\x12" => [104, "\xc7c"], "\x13" => [16, "\xc7c"], "\x14" => [94, "\xc7e"], "\x15" => [76, "\xc7e"], "\x16" => [104, "\xc7e"], "\x17" => [16, "\xc7e"], "\x18" => [94, "\xc7i"], "\x19" => [76, "\xc7i"], "\x1a" => [104, "\xc7i"], "\x1b" => [16, "\xc7i"], "\x1c" => [94, "\xc7o"], "\x1d" => [76, "\xc7o"], "\x1e" => [104, "\xc7o"], "\x1f" => [16, "\xc7o"], " " => [94, "\xc7s"], "!" => [76, "\xc7s"], "\"" => [104, "\xc7s"], "#" => [16, "\xc7s"], "\$" => [94, "\xc7t"], "%" => [76, "\xc7t"], "&" => [104, "\xc7t"], "'" => [16, "\xc7t"], "(" => [77, "\xc7 "], ")" => [18, "\xc7 "], "*" => [77, "\xc7%"], "+" => [18, "\xc7%"], "," => [77, "\xc7-"], "-" => [18, "\xc7-"], "." => [77, "\xc7."], "/" => [18, "\xc7."], [77, "\xc7/"], [18, "\xc7/"], [77, "\xc73"], [18, "\xc73"], [77, "\xc74"], [18, "\xc74"], [77, "\xc75"], [18, "\xc75"], [77, "\xc76"], [18, "\xc76"], ":" => [77, "\xc77"], ";" => [18, "\xc77"], "<" => [77, "\xc78"], "=" => [18, "\xc78"], ">" => [77, "\xc79"], "?" => [18, "\xc79"], "@" => [77, "\xc7="], "A" => [18, "\xc7="], "B" => [77, "\xc7A"], "C" => [18, "\xc7A"], "D" => [77, "\xc7_"], "E" => [18, "\xc7_"], "F" => [77, "\xc7b"], "G" => [18, "\xc7b"], "H" => [77, "\xc7d"], "I" => [18, "\xc7d"], "J" => [77, "\xc7f"], "K" => [18, "\xc7f"], "L" => [77, "\xc7g"], "M" => [18, "\xc7g"], "N" => [77, "\xc7h"], "O" => [18, "\xc7h"], "P" => [77, "\xc7l"], "Q" => [18, "\xc7l"], "R" => [77, "\xc7m"], "S" => [18, "\xc7m"], "T" => [77, "\xc7n"], "U" => [18, "\xc7n"], "V" => [77, "\xc7p"], "W" => [18, "\xc7p"], "X" => [77, "\xc7r"], "Y" => [18, "\xc7r"], "Z" => [77, "\xc7u"], "[" => [18, "\xc7u"], "\\" => [0, "\xc7:"], "]" => [0, "\xc7B"], "^" => [0, "\xc7C"], "_" => [0, "\xc7D"], "`" => [0, "\xc7E"], "a" => [0, "\xc7F"], "b" => [0, "\xc7G"], "c" => [0, "\xc7H"], "d" => [0, "\xc7I"], "e" => [0, "\xc7J"], "f" => [0, "\xc7K"], "g" => [0, "\xc7L"], "h" => [0, "\xc7M"], "i" => [0, "\xc7N"], "j" => [0, "\xc7O"], "k" => [0, "\xc7P"], "l" => [0, "\xc7Q"], "m" => [0, "\xc7R"], "n" => [0, "\xc7S"], "o" => [0, "\xc7T"], "p" => [0, "\xc7U"], "q" => [0, "\xc7V"], "r" => [0, "\xc7W"], "s" => [0, "\xc7Y"], "t" => [0, "\xc7j"], "u" => [0, "\xc7k"], "v" => [0, "\xc7q"], "w" => [0, "\xc7v"], "x" => [0, "\xc7w"], "y" => [0, "\xc7x"], "z" => [0, "\xc7y"], "{" => [0, "\xc7z"], "|" => [82, "\xc7"], "}" => [87, "\xc7"], "~" => [130, "\xc7"], "" => [9, "\xc7"], "\x80" => [94, "\xcf0"], "\x81" => [76, "\xcf0"], "\x82" => [104, "\xcf0"], "\x83" => [16, "\xcf0"], "\x84" => [94, "\xcf1"], "\x85" => [76, "\xcf1"], "\x86" => [104, "\xcf1"], "\x87" => [16, "\xcf1"], "\x88" => [94, "\xcf2"], "\x89" => [76, "\xcf2"], "\x8a" => [104, "\xcf2"], "\x8b" => [16, "\xcf2"], "\x8c" => [94, "\xcfa"], "\x8d" => [76, "\xcfa"], "\x8e" => [104, "\xcfa"], "\x8f" => [16, "\xcfa"], "\x90" => [94, "\xcfc"], "\x91" => [76, "\xcfc"], "\x92" => [104, "\xcfc"], "\x93" => [16, "\xcfc"], "\x94" => [94, "\xcfe"], "\x95" => [76, "\xcfe"], "\x96" => [104, "\xcfe"], "\x97" => [16, "\xcfe"], "\x98" => [94, "\xcfi"], "\x99" => [76, "\xcfi"], "\x9a" => [104, "\xcfi"], "\x9b" => [16, "\xcfi"], "\x9c" => [94, "\xcfo"], "\x9d" => [76, "\xcfo"], "\x9e" => [104, "\xcfo"], "\x9f" => [16, "\xcfo"], "\xa0" => [94, "\xcfs"], "\xa1" => [76, "\xcfs"], "\xa2" => [104, "\xcfs"], "\xa3" => [16, "\xcfs"], "\xa4" => [94, "\xcft"], "\xa5" => [76, "\xcft"], "\xa6" => [104, "\xcft"], "\xa7" => [16, "\xcft"], "\xa8" => [77, "\xcf "], "\xa9" => [18, "\xcf "], "\xaa" => [77, "\xcf%"], "\xab" => [18, "\xcf%"], "\xac" => [77, "\xcf-"], "\xad" => [18, "\xcf-"], "\xae" => [77, "\xcf."], "\xaf" => [18, "\xcf."], "\xb0" => [77, "\xcf/"], "\xb1" => [18, "\xcf/"], "\xb2" => [77, "\xcf3"], "\xb3" => [18, "\xcf3"], "\xb4" => [77, "\xcf4"], "\xb5" => [18, "\xcf4"], "\xb6" => [77, "\xcf5"], "\xb7" => [18, "\xcf5"], "\xb8" => [77, "\xcf6"], "\xb9" => [18, "\xcf6"], "\xba" => [77, "\xcf7"], "\xbb" => [18, "\xcf7"], "\xbc" => [77, "\xcf8"], "\xbd" => [18, "\xcf8"], "\xbe" => [77, "\xcf9"], "\xbf" => [18, "\xcf9"], "\xc0" => [77, "\xcf="], "\xc1" => [18, "\xcf="], "\xc2" => [77, "\xcfA"], "\xc3" => [18, "\xcfA"], "\xc4" => [77, "\xcf_"], "\xc5" => [18, "\xcf_"], "\xc6" => [77, "\xcfb"], "\xc7" => [18, "\xcfb"], "\xc8" => [77, "\xcfd"], "\xc9" => [18, "\xcfd"], "\xca" => [77, "\xcff"], "\xcb" => [18, "\xcff"], "\xcc" => [77, "\xcfg"], "\xcd" => [18, "\xcfg"], "\xce" => [77, "\xcfh"], "\xcf" => [18, "\xcfh"], "\xd0" => [77, "\xcfl"], "\xd1" => [18, "\xcfl"], "\xd2" => [77, "\xcfm"], "\xd3" => [18, "\xcfm"], "\xd4" => [77, "\xcfn"], "\xd5" => [18, "\xcfn"], "\xd6" => [77, "\xcfp"], "\xd7" => [18, "\xcfp"], "\xd8" => [77, "\xcfr"], "\xd9" => [18, "\xcfr"], "\xda" => [77, "\xcfu"], "\xdb" => [18, "\xcfu"], "\xdc" => [0, "\xcf:"], "\xdd" => [0, "\xcfB"], "\xde" => [0, "\xcfC"], "\xdf" => [0, "\xcfD"], "\xe0" => [0, "\xcfE"], "\xe1" => [0, "\xcfF"], "\xe2" => [0, "\xcfG"], "\xe3" => [0, "\xcfH"], "\xe4" => [0, "\xcfI"], "\xe5" => [0, "\xcfJ"], "\xe6" => [0, "\xcfK"], "\xe7" => [0, "\xcfL"], "\xe8" => [0, "\xcfM"], "\xe9" => [0, "\xcfN"], "\xea" => [0, "\xcfO"], "\xeb" => [0, "\xcfP"], "\xec" => [0, "\xcfQ"], "\xed" => [0, "\xcfR"], "\xee" => [0, "\xcfS"], "\xef" => [0, "\xcfT"], "\xf0" => [0, "\xcfU"], "\xf1" => [0, "\xcfV"], "\xf2" => [0, "\xcfW"], "\xf3" => [0, "\xcfY"], "\xf4" => [0, "\xcfj"], "\xf5" => [0, "\xcfk"], "\xf6" => [0, "\xcfq"], "\xf7" => [0, "\xcfv"], "\xf8" => [0, "\xcfw"], "\xf9" => [0, "\xcfx"], "\xfa" => [0, "\xcfy"], "\xfb" => [0, "\xcfz"], "\xfc" => [82, "\xcf"], "\xfd" => [87, "\xcf"], "\xfe" => [130, "\xcf"], "\xff" => [9, "\xcf"]], ["\x00" => [77, "\xc70"], "\x01" => [18, "\xc70"], "\x02" => [77, "\xc71"], "\x03" => [18, "\xc71"], "\x04" => [77, "\xc72"], "\x05" => [18, "\xc72"], "\x06" => [77, "\xc7a"], "\x07" => [18, "\xc7a"], "\x08" => [77, "\xc7c"], "\t" => [18, "\xc7c"], "\n" => [77, "\xc7e"], "\v" => [18, "\xc7e"], "\f" => [77, "\xc7i"], "\r" => [18, "\xc7i"], "\x0e" => [77, "\xc7o"], "\x0f" => [18, "\xc7o"], "\x10" => [77, "\xc7s"], "\x11" => [18, "\xc7s"], "\x12" => [77, "\xc7t"], "\x13" => [18, "\xc7t"], "\x14" => [0, "\xc7 "], "\x15" => [0, "\xc7%"], "\x16" => [0, "\xc7-"], "\x17" => [0, "\xc7."], "\x18" => [0, "\xc7/"], "\x19" => [0, "\xc73"], "\x1a" => [0, "\xc74"], "\x1b" => [0, "\xc75"], "\x1c" => [0, "\xc76"], "\x1d" => [0, "\xc77"], "\x1e" => [0, "\xc78"], "\x1f" => [0, "\xc79"], " " => [0, "\xc7="], "!" => [0, "\xc7A"], "\"" => [0, "\xc7_"], "#" => [0, "\xc7b"], "\$" => [0, "\xc7d"], "%" => [0, "\xc7f"], "&" => [0, "\xc7g"], "'" => [0, "\xc7h"], "(" => [0, "\xc7l"], ")" => [0, "\xc7m"], "*" => [0, "\xc7n"], "+" => [0, "\xc7p"], "," => [0, "\xc7r"], "-" => [0, "\xc7u"], "." => [100, "\xc7"], "/" => [110, "\xc7"], [111, "\xc7"], [115, "\xc7"], [116, "\xc7"], [118, "\xc7"], [119, "\xc7"], [122, "\xc7"], [123, "\xc7"], [125, "\xc7"], [126, "\xc7"], [129, "\xc7"], ":" => [143, "\xc7"], ";" => [148, "\xc7"], "<" => [151, "\xc7"], "=" => [153, "\xc7"], ">" => [83, "\xc7"], "?" => [10, "\xc7"], "@" => [77, "\xcf0"], "A" => [18, "\xcf0"], "B" => [77, "\xcf1"], "C" => [18, "\xcf1"], "D" => [77, "\xcf2"], "E" => [18, "\xcf2"], "F" => [77, "\xcfa"], "G" => [18, "\xcfa"], "H" => [77, "\xcfc"], "I" => [18, "\xcfc"], "J" => [77, "\xcfe"], "K" => [18, "\xcfe"], "L" => [77, "\xcfi"], "M" => [18, "\xcfi"], "N" => [77, "\xcfo"], "O" => [18, "\xcfo"], "P" => [77, "\xcfs"], "Q" => [18, "\xcfs"], "R" => [77, "\xcft"], "S" => [18, "\xcft"], "T" => [0, "\xcf "], "U" => [0, "\xcf%"], "V" => [0, "\xcf-"], "W" => [0, "\xcf."], "X" => [0, "\xcf/"], "Y" => [0, "\xcf3"], "Z" => [0, "\xcf4"], "[" => [0, "\xcf5"], "\\" => [0, "\xcf6"], "]" => [0, "\xcf7"], "^" => [0, "\xcf8"], "_" => [0, "\xcf9"], "`" => [0, "\xcf="], "a" => [0, "\xcfA"], "b" => [0, "\xcf_"], "c" => [0, "\xcfb"], "d" => [0, "\xcfd"], "e" => [0, "\xcff"], "f" => [0, "\xcfg"], "g" => [0, "\xcfh"], "h" => [0, "\xcfl"], "i" => [0, "\xcfm"], "j" => [0, "\xcfn"], "k" => [0, "\xcfp"], "l" => [0, "\xcfr"], "m" => [0, "\xcfu"], "n" => [100, "\xcf"], "o" => [110, "\xcf"], "p" => [111, "\xcf"], "q" => [115, "\xcf"], "r" => [116, "\xcf"], "s" => [118, "\xcf"], "t" => [119, "\xcf"], "u" => [122, "\xcf"], "v" => [123, "\xcf"], "w" => [125, "\xcf"], "x" => [126, "\xcf"], "y" => [129, "\xcf"], "z" => [143, "\xcf"], "{" => [148, "\xcf"], "|" => [151, "\xcf"], "}" => [153, "\xcf"], "~" => [83, "\xcf"], "" => [10, "\xcf"], "\x80" => [77, "\xea0"], "\x81" => [18, "\xea0"], "\x82" => [77, "\xea1"], "\x83" => [18, "\xea1"], "\x84" => [77, "\xea2"], "\x85" => [18, "\xea2"], "\x86" => [77, "\xeaa"], "\x87" => [18, "\xeaa"], "\x88" => [77, "\xeac"], "\x89" => [18, "\xeac"], "\x8a" => [77, "\xeae"], "\x8b" => [18, "\xeae"], "\x8c" => [77, "\xeai"], "\x8d" => [18, "\xeai"], "\x8e" => [77, "\xeao"], "\x8f" => [18, "\xeao"], "\x90" => [77, "\xeas"], "\x91" => [18, "\xeas"], "\x92" => [77, "\xeat"], "\x93" => [18, "\xeat"], "\x94" => [0, "\xea "], "\x95" => [0, "\xea%"], "\x96" => [0, "\xea-"], "\x97" => [0, "\xea."], "\x98" => [0, "\xea/"], "\x99" => [0, "\xea3"], "\x9a" => [0, "\xea4"], "\x9b" => [0, "\xea5"], "\x9c" => [0, "\xea6"], "\x9d" => [0, "\xea7"], "\x9e" => [0, "\xea8"], "\x9f" => [0, "\xea9"], "\xa0" => [0, "\xea="], "\xa1" => [0, "\xeaA"], "\xa2" => [0, "\xea_"], "\xa3" => [0, "\xeab"], "\xa4" => [0, "\xead"], "\xa5" => [0, "\xeaf"], "\xa6" => [0, "\xeag"], "\xa7" => [0, "\xeah"], "\xa8" => [0, "\xeal"], "\xa9" => [0, "\xeam"], "\xaa" => [0, "\xean"], "\xab" => [0, "\xeap"], "\xac" => [0, "\xear"], "\xad" => [0, "\xeau"], "\xae" => [100, "\xea"], "\xaf" => [110, "\xea"], "\xb0" => [111, "\xea"], "\xb1" => [115, "\xea"], "\xb2" => [116, "\xea"], "\xb3" => [118, "\xea"], "\xb4" => [119, "\xea"], "\xb5" => [122, "\xea"], "\xb6" => [123, "\xea"], "\xb7" => [125, "\xea"], "\xb8" => [126, "\xea"], "\xb9" => [129, "\xea"], "\xba" => [143, "\xea"], "\xbb" => [148, "\xea"], "\xbc" => [151, "\xea"], "\xbd" => [153, "\xea"], "\xbe" => [83, "\xea"], "\xbf" => [10, "\xea"], "\xc0" => [77, "\xeb0"], "\xc1" => [18, "\xeb0"], "\xc2" => [77, "\xeb1"], "\xc3" => [18, "\xeb1"], "\xc4" => [77, "\xeb2"], "\xc5" => [18, "\xeb2"], "\xc6" => [77, "\xeba"], "\xc7" => [18, "\xeba"], "\xc8" => [77, "\xebc"], "\xc9" => [18, "\xebc"], "\xca" => [77, "\xebe"], "\xcb" => [18, "\xebe"], "\xcc" => [77, "\xebi"], "\xcd" => [18, "\xebi"], "\xce" => [77, "\xebo"], "\xcf" => [18, "\xebo"], "\xd0" => [77, "\xebs"], "\xd1" => [18, "\xebs"], "\xd2" => [77, "\xebt"], "\xd3" => [18, "\xebt"], "\xd4" => [0, "\xeb "], "\xd5" => [0, "\xeb%"], "\xd6" => [0, "\xeb-"], "\xd7" => [0, "\xeb."], "\xd8" => [0, "\xeb/"], "\xd9" => [0, "\xeb3"], "\xda" => [0, "\xeb4"], "\xdb" => [0, "\xeb5"], "\xdc" => [0, "\xeb6"], "\xdd" => [0, "\xeb7"], "\xde" => [0, "\xeb8"], "\xdf" => [0, "\xeb9"], "\xe0" => [0, "\xeb="], "\xe1" => [0, "\xebA"], "\xe2" => [0, "\xeb_"], "\xe3" => [0, "\xebb"], "\xe4" => [0, "\xebd"], "\xe5" => [0, "\xebf"], "\xe6" => [0, "\xebg"], "\xe7" => [0, "\xebh"], "\xe8" => [0, "\xebl"], "\xe9" => [0, "\xebm"], "\xea" => [0, "\xebn"], "\xeb" => [0, "\xebp"], "\xec" => [0, "\xebr"], "\xed" => [0, "\xebu"], "\xee" => [100, "\xeb"], "\xef" => [110, "\xeb"], "\xf0" => [111, "\xeb"], "\xf1" => [115, "\xeb"], "\xf2" => [116, "\xeb"], "\xf3" => [118, "\xeb"], "\xf4" => [119, "\xeb"], "\xf5" => [122, "\xeb"], "\xf6" => [123, "\xeb"], "\xf7" => [125, "\xeb"], "\xf8" => [126, "\xeb"], "\xf9" => [129, "\xeb"], "\xfa" => [143, "\xeb"], "\xfb" => [148, "\xeb"], "\xfc" => [151, "\xeb"], "\xfd" => [153, "\xeb"], "\xfe" => [83, "\xeb"], "\xff" => [10, "\xeb"]], ["\x00" => [77, "\xec0"], "\x01" => [18, "\xec0"], "\x02" => [77, "\xec1"], "\x03" => [18, "\xec1"], "\x04" => [77, "\xec2"], "\x05" => [18, "\xec2"], "\x06" => [77, "\xeca"], "\x07" => [18, "\xeca"], "\x08" => [77, "\xecc"], "\t" => [18, "\xecc"], "\n" => [77, "\xece"], "\v" => [18, "\xece"], "\f" => [77, "\xeci"], "\r" => [18, "\xeci"], "\x0e" => [77, "\xeco"], "\x0f" => [18, "\xeco"], "\x10" => [77, "\xecs"], "\x11" => [18, "\xecs"], "\x12" => [77, "\xect"], "\x13" => [18, "\xect"], "\x14" => [0, "\xec "], "\x15" => [0, "\xec%"], "\x16" => [0, "\xec-"], "\x17" => [0, "\xec."], "\x18" => [0, "\xec/"], "\x19" => [0, "\xec3"], "\x1a" => [0, "\xec4"], "\x1b" => [0, "\xec5"], "\x1c" => [0, "\xec6"], "\x1d" => [0, "\xec7"], "\x1e" => [0, "\xec8"], "\x1f" => [0, "\xec9"], " " => [0, "\xec="], "!" => [0, "\xecA"], "\"" => [0, "\xec_"], "#" => [0, "\xecb"], "\$" => [0, "\xecd"], "%" => [0, "\xecf"], "&" => [0, "\xecg"], "'" => [0, "\xech"], "(" => [0, "\xecl"], ")" => [0, "\xecm"], "*" => [0, "\xecn"], "+" => [0, "\xecp"], "," => [0, "\xecr"], "-" => [0, "\xecu"], "." => [100, "\xec"], "/" => [110, "\xec"], [111, "\xec"], [115, "\xec"], [116, "\xec"], [118, "\xec"], [119, "\xec"], [122, "\xec"], [123, "\xec"], [125, "\xec"], [126, "\xec"], [129, "\xec"], ":" => [143, "\xec"], ";" => [148, "\xec"], "<" => [151, "\xec"], "=" => [153, "\xec"], ">" => [83, "\xec"], "?" => [10, "\xec"], "@" => [77, "\xed0"], "A" => [18, "\xed0"], "B" => [77, "\xed1"], "C" => [18, "\xed1"], "D" => [77, "\xed2"], "E" => [18, "\xed2"], "F" => [77, "\xeda"], "G" => [18, "\xeda"], "H" => [77, "\xedc"], "I" => [18, "\xedc"], "J" => [77, "\xede"], "K" => [18, "\xede"], "L" => [77, "\xedi"], "M" => [18, "\xedi"], "N" => [77, "\xedo"], "O" => [18, "\xedo"], "P" => [77, "\xeds"], "Q" => [18, "\xeds"], "R" => [77, "\xedt"], "S" => [18, "\xedt"], "T" => [0, "\xed "], "U" => [0, "\xed%"], "V" => [0, "\xed-"], "W" => [0, "\xed."], "X" => [0, "\xed/"], "Y" => [0, "\xed3"], "Z" => [0, "\xed4"], "[" => [0, "\xed5"], "\\" => [0, "\xed6"], "]" => [0, "\xed7"], "^" => [0, "\xed8"], "_" => [0, "\xed9"], "`" => [0, "\xed="], "a" => [0, "\xedA"], "b" => [0, "\xed_"], "c" => [0, "\xedb"], "d" => [0, "\xedd"], "e" => [0, "\xedf"], "f" => [0, "\xedg"], "g" => [0, "\xedh"], "h" => [0, "\xedl"], "i" => [0, "\xedm"], "j" => [0, "\xedn"], "k" => [0, "\xedp"], "l" => [0, "\xedr"], "m" => [0, "\xedu"], "n" => [100, "\xed"], "o" => [110, "\xed"], "p" => [111, "\xed"], "q" => [115, "\xed"], "r" => [116, "\xed"], "s" => [118, "\xed"], "t" => [119, "\xed"], "u" => [122, "\xed"], "v" => [123, "\xed"], "w" => [125, "\xed"], "x" => [126, "\xed"], "y" => [129, "\xed"], "z" => [143, "\xed"], "{" => [148, "\xed"], "|" => [151, "\xed"], "}" => [153, "\xed"], "~" => [83, "\xed"], "" => [10, "\xed"], "\x80" => [0, "\xc70"], "\x81" => [0, "\xc71"], "\x82" => [0, "\xc72"], "\x83" => [0, "\xc7a"], "\x84" => [0, "\xc7c"], "\x85" => [0, "\xc7e"], "\x86" => [0, "\xc7i"], "\x87" => [0, "\xc7o"], "\x88" => [0, "\xc7s"], "\x89" => [0, "\xc7t"], "\x8a" => [73, "\xc7"], "\x8b" => [88, "\xc7"], "\x8c" => [89, "\xc7"], "\x8d" => [96, "\xc7"], "\x8e" => [97, "\xc7"], "\x8f" => [99, "\xc7"], "\x90" => [106, "\xc7"], "\x91" => [136, "\xc7"], "\x92" => [139, "\xc7"], "\x93" => [141, "\xc7"], "\x94" => [145, "\xc7"], "\x95" => [147, "\xc7"], "\x96" => [149, "\xc7"], "\x97" => [101, "\xc7"], "\x98" => [112, "\xc7"], "\x99" => [117, "\xc7"], "\x9a" => [120, "\xc7"], "\x9b" => [124, "\xc7"], "\x9c" => [127, "\xc7"], "\x9d" => [144, "\xc7"], "\x9e" => [152, "\xc7"], "\x9f" => [11, "\xc7"], "\xa0" => [0, "\xcf0"], "\xa1" => [0, "\xcf1"], "\xa2" => [0, "\xcf2"], "\xa3" => [0, "\xcfa"], "\xa4" => [0, "\xcfc"], "\xa5" => [0, "\xcfe"], "\xa6" => [0, "\xcfi"], "\xa7" => [0, "\xcfo"], "\xa8" => [0, "\xcfs"], "\xa9" => [0, "\xcft"], "\xaa" => [73, "\xcf"], "\xab" => [88, "\xcf"], "\xac" => [89, "\xcf"], "\xad" => [96, "\xcf"], "\xae" => [97, "\xcf"], "\xaf" => [99, "\xcf"], "\xb0" => [106, "\xcf"], "\xb1" => [136, "\xcf"], "\xb2" => [139, "\xcf"], "\xb3" => [141, "\xcf"], "\xb4" => [145, "\xcf"], "\xb5" => [147, "\xcf"], "\xb6" => [149, "\xcf"], "\xb7" => [101, "\xcf"], "\xb8" => [112, "\xcf"], "\xb9" => [117, "\xcf"], "\xba" => [120, "\xcf"], "\xbb" => [124, "\xcf"], "\xbc" => [127, "\xcf"], "\xbd" => [144, "\xcf"], "\xbe" => [152, "\xcf"], "\xbf" => [11, "\xcf"], "\xc0" => [0, "\xea0"], "\xc1" => [0, "\xea1"], "\xc2" => [0, "\xea2"], "\xc3" => [0, "\xeaa"], "\xc4" => [0, "\xeac"], "\xc5" => [0, "\xeae"], "\xc6" => [0, "\xeai"], "\xc7" => [0, "\xeao"], "\xc8" => [0, "\xeas"], "\xc9" => [0, "\xeat"], "\xca" => [73, "\xea"], "\xcb" => [88, "\xea"], "\xcc" => [89, "\xea"], "\xcd" => [96, "\xea"], "\xce" => [97, "\xea"], "\xcf" => [99, "\xea"], "\xd0" => [106, "\xea"], "\xd1" => [136, "\xea"], "\xd2" => [139, "\xea"], "\xd3" => [141, "\xea"], "\xd4" => [145, "\xea"], "\xd5" => [147, "\xea"], "\xd6" => [149, "\xea"], "\xd7" => [101, "\xea"], "\xd8" => [112, "\xea"], "\xd9" => [117, "\xea"], "\xda" => [120, "\xea"], "\xdb" => [124, "\xea"], "\xdc" => [127, "\xea"], "\xdd" => [144, "\xea"], "\xde" => [152, "\xea"], "\xdf" => [11, "\xea"], "\xe0" => [0, "\xeb0"], "\xe1" => [0, "\xeb1"], "\xe2" => [0, "\xeb2"], "\xe3" => [0, "\xeba"], "\xe4" => [0, "\xebc"], "\xe5" => [0, "\xebe"], "\xe6" => [0, "\xebi"], "\xe7" => [0, "\xebo"], "\xe8" => [0, "\xebs"], "\xe9" => [0, "\xebt"], "\xea" => [73, "\xeb"], "\xeb" => [88, "\xeb"], "\xec" => [89, "\xeb"], "\xed" => [96, "\xeb"], "\xee" => [97, "\xeb"], "\xef" => [99, "\xeb"], "\xf0" => [106, "\xeb"], "\xf1" => [136, "\xeb"], "\xf2" => [139, "\xeb"], "\xf3" => [141, "\xeb"], "\xf4" => [145, "\xeb"], "\xf5" => [147, "\xeb"], "\xf6" => [149, "\xeb"], "\xf7" => [101, "\xeb"], "\xf8" => [112, "\xeb"], "\xf9" => [117, "\xeb"], "\xfa" => [120, "\xeb"], "\xfb" => [124, "\xeb"], "\xfc" => [127, "\xeb"], "\xfd" => [144, "\xeb"], "\xfe" => [152, "\xeb"], "\xff" => [11, "\xeb"]], ["\x00" => [94, "\xc80"], "\x01" => [76, "\xc80"], "\x02" => [104, "\xc80"], "\x03" => [16, "\xc80"], "\x04" => [94, "\xc81"], "\x05" => [76, "\xc81"], "\x06" => [104, "\xc81"], "\x07" => [16, "\xc81"], "\x08" => [94, "\xc82"], "\t" => [76, "\xc82"], "\n" => [104, "\xc82"], "\v" => [16, "\xc82"], "\f" => [94, "\xc8a"], "\r" => [76, "\xc8a"], "\x0e" => [104, "\xc8a"], "\x0f" => [16, "\xc8a"], "\x10" => [94, "\xc8c"], "\x11" => [76, "\xc8c"], "\x12" => [104, "\xc8c"], "\x13" => [16, "\xc8c"], "\x14" => [94, "\xc8e"], "\x15" => [76, "\xc8e"], "\x16" => [104, "\xc8e"], "\x17" => [16, "\xc8e"], "\x18" => [94, "\xc8i"], "\x19" => [76, "\xc8i"], "\x1a" => [104, "\xc8i"], "\x1b" => [16, "\xc8i"], "\x1c" => [94, "\xc8o"], "\x1d" => [76, "\xc8o"], "\x1e" => [104, "\xc8o"], "\x1f" => [16, "\xc8o"], " " => [94, "\xc8s"], "!" => [76, "\xc8s"], "\"" => [104, "\xc8s"], "#" => [16, "\xc8s"], "\$" => [94, "\xc8t"], "%" => [76, "\xc8t"], "&" => [104, "\xc8t"], "'" => [16, "\xc8t"], "(" => [77, "\xc8 "], ")" => [18, "\xc8 "], "*" => [77, "\xc8%"], "+" => [18, "\xc8%"], "," => [77, "\xc8-"], "-" => [18, "\xc8-"], "." => [77, "\xc8."], "/" => [18, "\xc8."], [77, "\xc8/"], [18, "\xc8/"], [77, "\xc83"], [18, "\xc83"], [77, "\xc84"], [18, "\xc84"], [77, "\xc85"], [18, "\xc85"], [77, "\xc86"], [18, "\xc86"], ":" => [77, "\xc87"], ";" => [18, "\xc87"], "<" => [77, "\xc88"], "=" => [18, "\xc88"], ">" => [77, "\xc89"], "?" => [18, "\xc89"], "@" => [77, "\xc8="], "A" => [18, "\xc8="], "B" => [77, "\xc8A"], "C" => [18, "\xc8A"], "D" => [77, "\xc8_"], "E" => [18, "\xc8_"], "F" => [77, "\xc8b"], "G" => [18, "\xc8b"], "H" => [77, "\xc8d"], "I" => [18, "\xc8d"], "J" => [77, "\xc8f"], "K" => [18, "\xc8f"], "L" => [77, "\xc8g"], "M" => [18, "\xc8g"], "N" => [77, "\xc8h"], "O" => [18, "\xc8h"], "P" => [77, "\xc8l"], "Q" => [18, "\xc8l"], "R" => [77, "\xc8m"], "S" => [18, "\xc8m"], "T" => [77, "\xc8n"], "U" => [18, "\xc8n"], "V" => [77, "\xc8p"], "W" => [18, "\xc8p"], "X" => [77, "\xc8r"], "Y" => [18, "\xc8r"], "Z" => [77, "\xc8u"], "[" => [18, "\xc8u"], "\\" => [0, "\xc8:"], "]" => [0, "\xc8B"], "^" => [0, "\xc8C"], "_" => [0, "\xc8D"], "`" => [0, "\xc8E"], "a" => [0, "\xc8F"], "b" => [0, "\xc8G"], "c" => [0, "\xc8H"], "d" => [0, "\xc8I"], "e" => [0, "\xc8J"], "f" => [0, "\xc8K"], "g" => [0, "\xc8L"], "h" => [0, "\xc8M"], "i" => [0, "\xc8N"], "j" => [0, "\xc8O"], "k" => [0, "\xc8P"], "l" => [0, "\xc8Q"], "m" => [0, "\xc8R"], "n" => [0, "\xc8S"], "o" => [0, "\xc8T"], "p" => [0, "\xc8U"], "q" => [0, "\xc8V"], "r" => [0, "\xc8W"], "s" => [0, "\xc8Y"], "t" => [0, "\xc8j"], "u" => [0, "\xc8k"], "v" => [0, "\xc8q"], "w" => [0, "\xc8v"], "x" => [0, "\xc8w"], "y" => [0, "\xc8x"], "z" => [0, "\xc8y"], "{" => [0, "\xc8z"], "|" => [82, "\xc8"], "}" => [87, "\xc8"], "~" => [130, "\xc8"], "" => [9, "\xc8"], "\x80" => [94, "\xc90"], "\x81" => [76, "\xc90"], "\x82" => [104, "\xc90"], "\x83" => [16, "\xc90"], "\x84" => [94, "\xc91"], "\x85" => [76, "\xc91"], "\x86" => [104, "\xc91"], "\x87" => [16, "\xc91"], "\x88" => [94, "\xc92"], "\x89" => [76, "\xc92"], "\x8a" => [104, "\xc92"], "\x8b" => [16, "\xc92"], "\x8c" => [94, "\xc9a"], "\x8d" => [76, "\xc9a"], "\x8e" => [104, "\xc9a"], "\x8f" => [16, "\xc9a"], "\x90" => [94, "\xc9c"], "\x91" => [76, "\xc9c"], "\x92" => [104, "\xc9c"], "\x93" => [16, "\xc9c"], "\x94" => [94, "\xc9e"], "\x95" => [76, "\xc9e"], "\x96" => [104, "\xc9e"], "\x97" => [16, "\xc9e"], "\x98" => [94, "\xc9i"], "\x99" => [76, "\xc9i"], "\x9a" => [104, "\xc9i"], "\x9b" => [16, "\xc9i"], "\x9c" => [94, "\xc9o"], "\x9d" => [76, "\xc9o"], "\x9e" => [104, "\xc9o"], "\x9f" => [16, "\xc9o"], "\xa0" => [94, "\xc9s"], "\xa1" => [76, "\xc9s"], "\xa2" => [104, "\xc9s"], "\xa3" => [16, "\xc9s"], "\xa4" => [94, "\xc9t"], "\xa5" => [76, "\xc9t"], "\xa6" => [104, "\xc9t"], "\xa7" => [16, "\xc9t"], "\xa8" => [77, "\xc9 "], "\xa9" => [18, "\xc9 "], "\xaa" => [77, "\xc9%"], "\xab" => [18, "\xc9%"], "\xac" => [77, "\xc9-"], "\xad" => [18, "\xc9-"], "\xae" => [77, "\xc9."], "\xaf" => [18, "\xc9."], "\xb0" => [77, "\xc9/"], "\xb1" => [18, "\xc9/"], "\xb2" => [77, "\xc93"], "\xb3" => [18, "\xc93"], "\xb4" => [77, "\xc94"], "\xb5" => [18, "\xc94"], "\xb6" => [77, "\xc95"], "\xb7" => [18, "\xc95"], "\xb8" => [77, "\xc96"], "\xb9" => [18, "\xc96"], "\xba" => [77, "\xc97"], "\xbb" => [18, "\xc97"], "\xbc" => [77, "\xc98"], "\xbd" => [18, "\xc98"], "\xbe" => [77, "\xc99"], "\xbf" => [18, "\xc99"], "\xc0" => [77, "\xc9="], "\xc1" => [18, "\xc9="], "\xc2" => [77, "\xc9A"], "\xc3" => [18, "\xc9A"], "\xc4" => [77, "\xc9_"], "\xc5" => [18, "\xc9_"], "\xc6" => [77, "\xc9b"], "\xc7" => [18, "\xc9b"], "\xc8" => [77, "\xc9d"], "\xc9" => [18, "\xc9d"], "\xca" => [77, "\xc9f"], "\xcb" => [18, "\xc9f"], "\xcc" => [77, "\xc9g"], "\xcd" => [18, "\xc9g"], "\xce" => [77, "\xc9h"], "\xcf" => [18, "\xc9h"], "\xd0" => [77, "\xc9l"], "\xd1" => [18, "\xc9l"], "\xd2" => [77, "\xc9m"], "\xd3" => [18, "\xc9m"], "\xd4" => [77, "\xc9n"], "\xd5" => [18, "\xc9n"], "\xd6" => [77, "\xc9p"], "\xd7" => [18, "\xc9p"], "\xd8" => [77, "\xc9r"], "\xd9" => [18, "\xc9r"], "\xda" => [77, "\xc9u"], "\xdb" => [18, "\xc9u"], "\xdc" => [0, "\xc9:"], "\xdd" => [0, "\xc9B"], "\xde" => [0, "\xc9C"], "\xdf" => [0, "\xc9D"], "\xe0" => [0, "\xc9E"], "\xe1" => [0, "\xc9F"], "\xe2" => [0, "\xc9G"], "\xe3" => [0, "\xc9H"], "\xe4" => [0, "\xc9I"], "\xe5" => [0, "\xc9J"], "\xe6" => [0, "\xc9K"], "\xe7" => [0, "\xc9L"], "\xe8" => [0, "\xc9M"], "\xe9" => [0, "\xc9N"], "\xea" => [0, "\xc9O"], "\xeb" => [0, "\xc9P"], "\xec" => [0, "\xc9Q"], "\xed" => [0, "\xc9R"], "\xee" => [0, "\xc9S"], "\xef" => [0, "\xc9T"], "\xf0" => [0, "\xc9U"], "\xf1" => [0, "\xc9V"], "\xf2" => [0, "\xc9W"], "\xf3" => [0, "\xc9Y"], "\xf4" => [0, "\xc9j"], "\xf5" => [0, "\xc9k"], "\xf6" => [0, "\xc9q"], "\xf7" => [0, "\xc9v"], "\xf8" => [0, "\xc9w"], "\xf9" => [0, "\xc9x"], "\xfa" => [0, "\xc9y"], "\xfb" => [0, "\xc9z"], "\xfc" => [82, "\xc9"], "\xfd" => [87, "\xc9"], "\xfe" => [130, "\xc9"], "\xff" => [9, "\xc9"]], ["\x00" => [77, "\xca0"], "\x01" => [18, "\xca0"], "\x02" => [77, "\xca1"], "\x03" => [18, "\xca1"], "\x04" => [77, "\xca2"], "\x05" => [18, "\xca2"], "\x06" => [77, "\xcaa"], "\x07" => [18, "\xcaa"], "\x08" => [77, "\xcac"], "\t" => [18, "\xcac"], "\n" => [77, "\xcae"], "\v" => [18, "\xcae"], "\f" => [77, "\xcai"], "\r" => [18, "\xcai"], "\x0e" => [77, "\xcao"], "\x0f" => [18, "\xcao"], "\x10" => [77, "\xcas"], "\x11" => [18, "\xcas"], "\x12" => [77, "\xcat"], "\x13" => [18, "\xcat"], "\x14" => [0, "\xca "], "\x15" => [0, "\xca%"], "\x16" => [0, "\xca-"], "\x17" => [0, "\xca."], "\x18" => [0, "\xca/"], "\x19" => [0, "\xca3"], "\x1a" => [0, "\xca4"], "\x1b" => [0, "\xca5"], "\x1c" => [0, "\xca6"], "\x1d" => [0, "\xca7"], "\x1e" => [0, "\xca8"], "\x1f" => [0, "\xca9"], " " => [0, "\xca="], "!" => [0, "\xcaA"], "\"" => [0, "\xca_"], "#" => [0, "\xcab"], "\$" => [0, "\xcad"], "%" => [0, "\xcaf"], "&" => [0, "\xcag"], "'" => [0, "\xcah"], "(" => [0, "\xcal"], ")" => [0, "\xcam"], "*" => [0, "\xcan"], "+" => [0, "\xcap"], "," => [0, "\xcar"], "-" => [0, "\xcau"], "." => [100, "\xca"], "/" => [110, "\xca"], [111, "\xca"], [115, "\xca"], [116, "\xca"], [118, "\xca"], [119, "\xca"], [122, "\xca"], [123, "\xca"], [125, "\xca"], [126, "\xca"], [129, "\xca"], ":" => [143, "\xca"], ";" => [148, "\xca"], "<" => [151, "\xca"], "=" => [153, "\xca"], ">" => [83, "\xca"], "?" => [10, "\xca"], "@" => [77, "\xcd0"], "A" => [18, "\xcd0"], "B" => [77, "\xcd1"], "C" => [18, "\xcd1"], "D" => [77, "\xcd2"], "E" => [18, "\xcd2"], "F" => [77, "\xcda"], "G" => [18, "\xcda"], "H" => [77, "\xcdc"], "I" => [18, "\xcdc"], "J" => [77, "\xcde"], "K" => [18, "\xcde"], "L" => [77, "\xcdi"], "M" => [18, "\xcdi"], "N" => [77, "\xcdo"], "O" => [18, "\xcdo"], "P" => [77, "\xcds"], "Q" => [18, "\xcds"], "R" => [77, "\xcdt"], "S" => [18, "\xcdt"], "T" => [0, "\xcd "], "U" => [0, "\xcd%"], "V" => [0, "\xcd-"], "W" => [0, "\xcd."], "X" => [0, "\xcd/"], "Y" => [0, "\xcd3"], "Z" => [0, "\xcd4"], "[" => [0, "\xcd5"], "\\" => [0, "\xcd6"], "]" => [0, "\xcd7"], "^" => [0, "\xcd8"], "_" => [0, "\xcd9"], "`" => [0, "\xcd="], "a" => [0, "\xcdA"], "b" => [0, "\xcd_"], "c" => [0, "\xcdb"], "d" => [0, "\xcdd"], "e" => [0, "\xcdf"], "f" => [0, "\xcdg"], "g" => [0, "\xcdh"], "h" => [0, "\xcdl"], "i" => [0, "\xcdm"], "j" => [0, "\xcdn"], "k" => [0, "\xcdp"], "l" => [0, "\xcdr"], "m" => [0, "\xcdu"], "n" => [100, "\xcd"], "o" => [110, "\xcd"], "p" => [111, "\xcd"], "q" => [115, "\xcd"], "r" => [116, "\xcd"], "s" => [118, "\xcd"], "t" => [119, "\xcd"], "u" => [122, "\xcd"], "v" => [123, "\xcd"], "w" => [125, "\xcd"], "x" => [126, "\xcd"], "y" => [129, "\xcd"], "z" => [143, "\xcd"], "{" => [148, "\xcd"], "|" => [151, "\xcd"], "}" => [153, "\xcd"], "~" => [83, "\xcd"], "" => [10, "\xcd"], "\x80" => [77, "\xd20"], "\x81" => [18, "\xd20"], "\x82" => [77, "\xd21"], "\x83" => [18, "\xd21"], "\x84" => [77, "\xd22"], "\x85" => [18, "\xd22"], "\x86" => [77, "\xd2a"], "\x87" => [18, "\xd2a"], "\x88" => [77, "\xd2c"], "\x89" => [18, "\xd2c"], "\x8a" => [77, "\xd2e"], "\x8b" => [18, "\xd2e"], "\x8c" => [77, "\xd2i"], "\x8d" => [18, "\xd2i"], "\x8e" => [77, "\xd2o"], "\x8f" => [18, "\xd2o"], "\x90" => [77, "\xd2s"], "\x91" => [18, "\xd2s"], "\x92" => [77, "\xd2t"], "\x93" => [18, "\xd2t"], "\x94" => [0, "\xd2 "], "\x95" => [0, "\xd2%"], "\x96" => [0, "\xd2-"], "\x97" => [0, "\xd2."], "\x98" => [0, "\xd2/"], "\x99" => [0, "\xd23"], "\x9a" => [0, "\xd24"], "\x9b" => [0, "\xd25"], "\x9c" => [0, "\xd26"], "\x9d" => [0, "\xd27"], "\x9e" => [0, "\xd28"], "\x9f" => [0, "\xd29"], "\xa0" => [0, "\xd2="], "\xa1" => [0, "\xd2A"], "\xa2" => [0, "\xd2_"], "\xa3" => [0, "\xd2b"], "\xa4" => [0, "\xd2d"], "\xa5" => [0, "\xd2f"], "\xa6" => [0, "\xd2g"], "\xa7" => [0, "\xd2h"], "\xa8" => [0, "\xd2l"], "\xa9" => [0, "\xd2m"], "\xaa" => [0, "\xd2n"], "\xab" => [0, "\xd2p"], "\xac" => [0, "\xd2r"], "\xad" => [0, "\xd2u"], "\xae" => [100, "\xd2"], "\xaf" => [110, "\xd2"], "\xb0" => [111, "\xd2"], "\xb1" => [115, "\xd2"], "\xb2" => [116, "\xd2"], "\xb3" => [118, "\xd2"], "\xb4" => [119, "\xd2"], "\xb5" => [122, "\xd2"], "\xb6" => [123, "\xd2"], "\xb7" => [125, "\xd2"], "\xb8" => [126, "\xd2"], "\xb9" => [129, "\xd2"], "\xba" => [143, "\xd2"], "\xbb" => [148, "\xd2"], "\xbc" => [151, "\xd2"], "\xbd" => [153, "\xd2"], "\xbe" => [83, "\xd2"], "\xbf" => [10, "\xd2"], "\xc0" => [77, "\xd50"], "\xc1" => [18, "\xd50"], "\xc2" => [77, "\xd51"], "\xc3" => [18, "\xd51"], "\xc4" => [77, "\xd52"], "\xc5" => [18, "\xd52"], "\xc6" => [77, "\xd5a"], "\xc7" => [18, "\xd5a"], "\xc8" => [77, "\xd5c"], "\xc9" => [18, "\xd5c"], "\xca" => [77, "\xd5e"], "\xcb" => [18, "\xd5e"], "\xcc" => [77, "\xd5i"], "\xcd" => [18, "\xd5i"], "\xce" => [77, "\xd5o"], "\xcf" => [18, "\xd5o"], "\xd0" => [77, "\xd5s"], "\xd1" => [18, "\xd5s"], "\xd2" => [77, "\xd5t"], "\xd3" => [18, "\xd5t"], "\xd4" => [0, "\xd5 "], "\xd5" => [0, "\xd5%"], "\xd6" => [0, "\xd5-"], "\xd7" => [0, "\xd5."], "\xd8" => [0, "\xd5/"], "\xd9" => [0, "\xd53"], "\xda" => [0, "\xd54"], "\xdb" => [0, "\xd55"], "\xdc" => [0, "\xd56"], "\xdd" => [0, "\xd57"], "\xde" => [0, "\xd58"], "\xdf" => [0, "\xd59"], "\xe0" => [0, "\xd5="], "\xe1" => [0, "\xd5A"], "\xe2" => [0, "\xd5_"], "\xe3" => [0, "\xd5b"], "\xe4" => [0, "\xd5d"], "\xe5" => [0, "\xd5f"], "\xe6" => [0, "\xd5g"], "\xe7" => [0, "\xd5h"], "\xe8" => [0, "\xd5l"], "\xe9" => [0, "\xd5m"], "\xea" => [0, "\xd5n"], "\xeb" => [0, "\xd5p"], "\xec" => [0, "\xd5r"], "\xed" => [0, "\xd5u"], "\xee" => [100, "\xd5"], "\xef" => [110, "\xd5"], "\xf0" => [111, "\xd5"], "\xf1" => [115, "\xd5"], "\xf2" => [116, "\xd5"], "\xf3" => [118, "\xd5"], "\xf4" => [119, "\xd5"], "\xf5" => [122, "\xd5"], "\xf6" => [123, "\xd5"], "\xf7" => [125, "\xd5"], "\xf8" => [126, "\xd5"], "\xf9" => [129, "\xd5"], "\xfa" => [143, "\xd5"], "\xfb" => [148, "\xd5"], "\xfc" => [151, "\xd5"], "\xfd" => [153, "\xd5"], "\xfe" => [83, "\xd5"], "\xff" => [10, "\xd5"]], ["\x00" => [94, "\xca0"], "\x01" => [76, "\xca0"], "\x02" => [104, "\xca0"], "\x03" => [16, "\xca0"], "\x04" => [94, "\xca1"], "\x05" => [76, "\xca1"], "\x06" => [104, "\xca1"], "\x07" => [16, "\xca1"], "\x08" => [94, "\xca2"], "\t" => [76, "\xca2"], "\n" => [104, "\xca2"], "\v" => [16, "\xca2"], "\f" => [94, "\xcaa"], "\r" => [76, "\xcaa"], "\x0e" => [104, "\xcaa"], "\x0f" => [16, "\xcaa"], "\x10" => [94, "\xcac"], "\x11" => [76, "\xcac"], "\x12" => [104, "\xcac"], "\x13" => [16, "\xcac"], "\x14" => [94, "\xcae"], "\x15" => [76, "\xcae"], "\x16" => [104, "\xcae"], "\x17" => [16, "\xcae"], "\x18" => [94, "\xcai"], "\x19" => [76, "\xcai"], "\x1a" => [104, "\xcai"], "\x1b" => [16, "\xcai"], "\x1c" => [94, "\xcao"], "\x1d" => [76, "\xcao"], "\x1e" => [104, "\xcao"], "\x1f" => [16, "\xcao"], " " => [94, "\xcas"], "!" => [76, "\xcas"], "\"" => [104, "\xcas"], "#" => [16, "\xcas"], "\$" => [94, "\xcat"], "%" => [76, "\xcat"], "&" => [104, "\xcat"], "'" => [16, "\xcat"], "(" => [77, "\xca "], ")" => [18, "\xca "], "*" => [77, "\xca%"], "+" => [18, "\xca%"], "," => [77, "\xca-"], "-" => [18, "\xca-"], "." => [77, "\xca."], "/" => [18, "\xca."], [77, "\xca/"], [18, "\xca/"], [77, "\xca3"], [18, "\xca3"], [77, "\xca4"], [18, "\xca4"], [77, "\xca5"], [18, "\xca5"], [77, "\xca6"], [18, "\xca6"], ":" => [77, "\xca7"], ";" => [18, "\xca7"], "<" => [77, "\xca8"], "=" => [18, "\xca8"], ">" => [77, "\xca9"], "?" => [18, "\xca9"], "@" => [77, "\xca="], "A" => [18, "\xca="], "B" => [77, "\xcaA"], "C" => [18, "\xcaA"], "D" => [77, "\xca_"], "E" => [18, "\xca_"], "F" => [77, "\xcab"], "G" => [18, "\xcab"], "H" => [77, "\xcad"], "I" => [18, "\xcad"], "J" => [77, "\xcaf"], "K" => [18, "\xcaf"], "L" => [77, "\xcag"], "M" => [18, "\xcag"], "N" => [77, "\xcah"], "O" => [18, "\xcah"], "P" => [77, "\xcal"], "Q" => [18, "\xcal"], "R" => [77, "\xcam"], "S" => [18, "\xcam"], "T" => [77, "\xcan"], "U" => [18, "\xcan"], "V" => [77, "\xcap"], "W" => [18, "\xcap"], "X" => [77, "\xcar"], "Y" => [18, "\xcar"], "Z" => [77, "\xcau"], "[" => [18, "\xcau"], "\\" => [0, "\xca:"], "]" => [0, "\xcaB"], "^" => [0, "\xcaC"], "_" => [0, "\xcaD"], "`" => [0, "\xcaE"], "a" => [0, "\xcaF"], "b" => [0, "\xcaG"], "c" => [0, "\xcaH"], "d" => [0, "\xcaI"], "e" => [0, "\xcaJ"], "f" => [0, "\xcaK"], "g" => [0, "\xcaL"], "h" => [0, "\xcaM"], "i" => [0, "\xcaN"], "j" => [0, "\xcaO"], "k" => [0, "\xcaP"], "l" => [0, "\xcaQ"], "m" => [0, "\xcaR"], "n" => [0, "\xcaS"], "o" => [0, "\xcaT"], "p" => [0, "\xcaU"], "q" => [0, "\xcaV"], "r" => [0, "\xcaW"], "s" => [0, "\xcaY"], "t" => [0, "\xcaj"], "u" => [0, "\xcak"], "v" => [0, "\xcaq"], "w" => [0, "\xcav"], "x" => [0, "\xcaw"], "y" => [0, "\xcax"], "z" => [0, "\xcay"], "{" => [0, "\xcaz"], "|" => [82, "\xca"], "}" => [87, "\xca"], "~" => [130, "\xca"], "" => [9, "\xca"], "\x80" => [94, "\xcd0"], "\x81" => [76, "\xcd0"], "\x82" => [104, "\xcd0"], "\x83" => [16, "\xcd0"], "\x84" => [94, "\xcd1"], "\x85" => [76, "\xcd1"], "\x86" => [104, "\xcd1"], "\x87" => [16, "\xcd1"], "\x88" => [94, "\xcd2"], "\x89" => [76, "\xcd2"], "\x8a" => [104, "\xcd2"], "\x8b" => [16, "\xcd2"], "\x8c" => [94, "\xcda"], "\x8d" => [76, "\xcda"], "\x8e" => [104, "\xcda"], "\x8f" => [16, "\xcda"], "\x90" => [94, "\xcdc"], "\x91" => [76, "\xcdc"], "\x92" => [104, "\xcdc"], "\x93" => [16, "\xcdc"], "\x94" => [94, "\xcde"], "\x95" => [76, "\xcde"], "\x96" => [104, "\xcde"], "\x97" => [16, "\xcde"], "\x98" => [94, "\xcdi"], "\x99" => [76, "\xcdi"], "\x9a" => [104, "\xcdi"], "\x9b" => [16, "\xcdi"], "\x9c" => [94, "\xcdo"], "\x9d" => [76, "\xcdo"], "\x9e" => [104, "\xcdo"], "\x9f" => [16, "\xcdo"], "\xa0" => [94, "\xcds"], "\xa1" => [76, "\xcds"], "\xa2" => [104, "\xcds"], "\xa3" => [16, "\xcds"], "\xa4" => [94, "\xcdt"], "\xa5" => [76, "\xcdt"], "\xa6" => [104, "\xcdt"], "\xa7" => [16, "\xcdt"], "\xa8" => [77, "\xcd "], "\xa9" => [18, "\xcd "], "\xaa" => [77, "\xcd%"], "\xab" => [18, "\xcd%"], "\xac" => [77, "\xcd-"], "\xad" => [18, "\xcd-"], "\xae" => [77, "\xcd."], "\xaf" => [18, "\xcd."], "\xb0" => [77, "\xcd/"], "\xb1" => [18, "\xcd/"], "\xb2" => [77, "\xcd3"], "\xb3" => [18, "\xcd3"], "\xb4" => [77, "\xcd4"], "\xb5" => [18, "\xcd4"], "\xb6" => [77, "\xcd5"], "\xb7" => [18, "\xcd5"], "\xb8" => [77, "\xcd6"], "\xb9" => [18, "\xcd6"], "\xba" => [77, "\xcd7"], "\xbb" => [18, "\xcd7"], "\xbc" => [77, "\xcd8"], "\xbd" => [18, "\xcd8"], "\xbe" => [77, "\xcd9"], "\xbf" => [18, "\xcd9"], "\xc0" => [77, "\xcd="], "\xc1" => [18, "\xcd="], "\xc2" => [77, "\xcdA"], "\xc3" => [18, "\xcdA"], "\xc4" => [77, "\xcd_"], "\xc5" => [18, "\xcd_"], "\xc6" => [77, "\xcdb"], "\xc7" => [18, "\xcdb"], "\xc8" => [77, "\xcdd"], "\xc9" => [18, "\xcdd"], "\xca" => [77, "\xcdf"], "\xcb" => [18, "\xcdf"], "\xcc" => [77, "\xcdg"], "\xcd" => [18, "\xcdg"], "\xce" => [77, "\xcdh"], "\xcf" => [18, "\xcdh"], "\xd0" => [77, "\xcdl"], "\xd1" => [18, "\xcdl"], "\xd2" => [77, "\xcdm"], "\xd3" => [18, "\xcdm"], "\xd4" => [77, "\xcdn"], "\xd5" => [18, "\xcdn"], "\xd6" => [77, "\xcdp"], "\xd7" => [18, "\xcdp"], "\xd8" => [77, "\xcdr"], "\xd9" => [18, "\xcdr"], "\xda" => [77, "\xcdu"], "\xdb" => [18, "\xcdu"], "\xdc" => [0, "\xcd:"], "\xdd" => [0, "\xcdB"], "\xde" => [0, "\xcdC"], "\xdf" => [0, "\xcdD"], "\xe0" => [0, "\xcdE"], "\xe1" => [0, "\xcdF"], "\xe2" => [0, "\xcdG"], "\xe3" => [0, "\xcdH"], "\xe4" => [0, "\xcdI"], "\xe5" => [0, "\xcdJ"], "\xe6" => [0, "\xcdK"], "\xe7" => [0, "\xcdL"], "\xe8" => [0, "\xcdM"], "\xe9" => [0, "\xcdN"], "\xea" => [0, "\xcdO"], "\xeb" => [0, "\xcdP"], "\xec" => [0, "\xcdQ"], "\xed" => [0, "\xcdR"], "\xee" => [0, "\xcdS"], "\xef" => [0, "\xcdT"], "\xf0" => [0, "\xcdU"], "\xf1" => [0, "\xcdV"], "\xf2" => [0, "\xcdW"], "\xf3" => [0, "\xcdY"], "\xf4" => [0, "\xcdj"], "\xf5" => [0, "\xcdk"], "\xf6" => [0, "\xcdq"], "\xf7" => [0, "\xcdv"], "\xf8" => [0, "\xcdw"], "\xf9" => [0, "\xcdx"], "\xfa" => [0, "\xcdy"], "\xfb" => [0, "\xcdz"], "\xfc" => [82, "\xcd"], "\xfd" => [87, "\xcd"], "\xfe" => [130, "\xcd"], "\xff" => [9, "\xcd"]], ["\x00" => [77, "\xf20"], "\x01" => [18, "\xf20"], "\x02" => [77, "\xf21"], "\x03" => [18, "\xf21"], "\x04" => [77, "\xf22"], "\x05" => [18, "\xf22"], "\x06" => [77, "\xf2a"], "\x07" => [18, "\xf2a"], "\x08" => [77, "\xf2c"], "\t" => [18, "\xf2c"], "\n" => [77, "\xf2e"], "\v" => [18, "\xf2e"], "\f" => [77, "\xf2i"], "\r" => [18, "\xf2i"], "\x0e" => [77, "\xf2o"], "\x0f" => [18, "\xf2o"], "\x10" => [77, "\xf2s"], "\x11" => [18, "\xf2s"], "\x12" => [77, "\xf2t"], "\x13" => [18, "\xf2t"], "\x14" => [0, "\xf2 "], "\x15" => [0, "\xf2%"], "\x16" => [0, "\xf2-"], "\x17" => [0, "\xf2."], "\x18" => [0, "\xf2/"], "\x19" => [0, "\xf23"], "\x1a" => [0, "\xf24"], "\x1b" => [0, "\xf25"], "\x1c" => [0, "\xf26"], "\x1d" => [0, "\xf27"], "\x1e" => [0, "\xf28"], "\x1f" => [0, "\xf29"], " " => [0, "\xf2="], "!" => [0, "\xf2A"], "\"" => [0, "\xf2_"], "#" => [0, "\xf2b"], "\$" => [0, "\xf2d"], "%" => [0, "\xf2f"], "&" => [0, "\xf2g"], "'" => [0, "\xf2h"], "(" => [0, "\xf2l"], ")" => [0, "\xf2m"], "*" => [0, "\xf2n"], "+" => [0, "\xf2p"], "," => [0, "\xf2r"], "-" => [0, "\xf2u"], "." => [100, "\xf2"], "/" => [110, "\xf2"], [111, "\xf2"], [115, "\xf2"], [116, "\xf2"], [118, "\xf2"], [119, "\xf2"], [122, "\xf2"], [123, "\xf2"], [125, "\xf2"], [126, "\xf2"], [129, "\xf2"], ":" => [143, "\xf2"], ";" => [148, "\xf2"], "<" => [151, "\xf2"], "=" => [153, "\xf2"], ">" => [83, "\xf2"], "?" => [10, "\xf2"], "@" => [77, "\xf30"], "A" => [18, "\xf30"], "B" => [77, "\xf31"], "C" => [18, "\xf31"], "D" => [77, "\xf32"], "E" => [18, "\xf32"], "F" => [77, "\xf3a"], "G" => [18, "\xf3a"], "H" => [77, "\xf3c"], "I" => [18, "\xf3c"], "J" => [77, "\xf3e"], "K" => [18, "\xf3e"], "L" => [77, "\xf3i"], "M" => [18, "\xf3i"], "N" => [77, "\xf3o"], "O" => [18, "\xf3o"], "P" => [77, "\xf3s"], "Q" => [18, "\xf3s"], "R" => [77, "\xf3t"], "S" => [18, "\xf3t"], "T" => [0, "\xf3 "], "U" => [0, "\xf3%"], "V" => [0, "\xf3-"], "W" => [0, "\xf3."], "X" => [0, "\xf3/"], "Y" => [0, "\xf33"], "Z" => [0, "\xf34"], "[" => [0, "\xf35"], "\\" => [0, "\xf36"], "]" => [0, "\xf37"], "^" => [0, "\xf38"], "_" => [0, "\xf39"], "`" => [0, "\xf3="], "a" => [0, "\xf3A"], "b" => [0, "\xf3_"], "c" => [0, "\xf3b"], "d" => [0, "\xf3d"], "e" => [0, "\xf3f"], "f" => [0, "\xf3g"], "g" => [0, "\xf3h"], "h" => [0, "\xf3l"], "i" => [0, "\xf3m"], "j" => [0, "\xf3n"], "k" => [0, "\xf3p"], "l" => [0, "\xf3r"], "m" => [0, "\xf3u"], "n" => [100, "\xf3"], "o" => [110, "\xf3"], "p" => [111, "\xf3"], "q" => [115, "\xf3"], "r" => [116, "\xf3"], "s" => [118, "\xf3"], "t" => [119, "\xf3"], "u" => [122, "\xf3"], "v" => [123, "\xf3"], "w" => [125, "\xf3"], "x" => [126, "\xf3"], "y" => [129, "\xf3"], "z" => [143, "\xf3"], "{" => [148, "\xf3"], "|" => [151, "\xf3"], "}" => [153, "\xf3"], "~" => [83, "\xf3"], "" => [10, "\xf3"], "\x80" => [77, "\xff0"], "\x81" => [18, "\xff0"], "\x82" => [77, "\xff1"], "\x83" => [18, "\xff1"], "\x84" => [77, "\xff2"], "\x85" => [18, "\xff2"], "\x86" => [77, "\xffa"], "\x87" => [18, "\xffa"], "\x88" => [77, "\xffc"], "\x89" => [18, "\xffc"], "\x8a" => [77, "\xffe"], "\x8b" => [18, "\xffe"], "\x8c" => [77, "\xffi"], "\x8d" => [18, "\xffi"], "\x8e" => [77, "\xffo"], "\x8f" => [18, "\xffo"], "\x90" => [77, "\xffs"], "\x91" => [18, "\xffs"], "\x92" => [77, "\xfft"], "\x93" => [18, "\xfft"], "\x94" => [0, "\xff "], "\x95" => [0, "\xff%"], "\x96" => [0, "\xff-"], "\x97" => [0, "\xff."], "\x98" => [0, "\xff/"], "\x99" => [0, "\xff3"], "\x9a" => [0, "\xff4"], "\x9b" => [0, "\xff5"], "\x9c" => [0, "\xff6"], "\x9d" => [0, "\xff7"], "\x9e" => [0, "\xff8"], "\x9f" => [0, "\xff9"], "\xa0" => [0, "\xff="], "\xa1" => [0, "\xffA"], "\xa2" => [0, "\xff_"], "\xa3" => [0, "\xffb"], "\xa4" => [0, "\xffd"], "\xa5" => [0, "\xfff"], "\xa6" => [0, "\xffg"], "\xa7" => [0, "\xffh"], "\xa8" => [0, "\xffl"], "\xa9" => [0, "\xffm"], "\xaa" => [0, "\xffn"], "\xab" => [0, "\xffp"], "\xac" => [0, "\xffr"], "\xad" => [0, "\xffu"], "\xae" => [100, "\xff"], "\xaf" => [110, "\xff"], "\xb0" => [111, "\xff"], "\xb1" => [115, "\xff"], "\xb2" => [116, "\xff"], "\xb3" => [118, "\xff"], "\xb4" => [119, "\xff"], "\xb5" => [122, "\xff"], "\xb6" => [123, "\xff"], "\xb7" => [125, "\xff"], "\xb8" => [126, "\xff"], "\xb9" => [129, "\xff"], "\xba" => [143, "\xff"], "\xbb" => [148, "\xff"], "\xbc" => [151, "\xff"], "\xbd" => [153, "\xff"], "\xbe" => [83, "\xff"], "\xbf" => [10, "\xff"], "\xc0" => [0, "\xcb0"], "\xc1" => [0, "\xcb1"], "\xc2" => [0, "\xcb2"], "\xc3" => [0, "\xcba"], "\xc4" => [0, "\xcbc"], "\xc5" => [0, "\xcbe"], "\xc6" => [0, "\xcbi"], "\xc7" => [0, "\xcbo"], "\xc8" => [0, "\xcbs"], "\xc9" => [0, "\xcbt"], "\xca" => [73, "\xcb"], "\xcb" => [88, "\xcb"], "\xcc" => [89, "\xcb"], "\xcd" => [96, "\xcb"], "\xce" => [97, "\xcb"], "\xcf" => [99, "\xcb"], "\xd0" => [106, "\xcb"], "\xd1" => [136, "\xcb"], "\xd2" => [139, "\xcb"], "\xd3" => [141, "\xcb"], "\xd4" => [145, "\xcb"], "\xd5" => [147, "\xcb"], "\xd6" => [149, "\xcb"], "\xd7" => [101, "\xcb"], "\xd8" => [112, "\xcb"], "\xd9" => [117, "\xcb"], "\xda" => [120, "\xcb"], "\xdb" => [124, "\xcb"], "\xdc" => [127, "\xcb"], "\xdd" => [144, "\xcb"], "\xde" => [152, "\xcb"], "\xdf" => [11, "\xcb"], "\xe0" => [0, "\xcc0"], "\xe1" => [0, "\xcc1"], "\xe2" => [0, "\xcc2"], "\xe3" => [0, "\xcca"], "\xe4" => [0, "\xccc"], "\xe5" => [0, "\xcce"], "\xe6" => [0, "\xcci"], "\xe7" => [0, "\xcco"], "\xe8" => [0, "\xccs"], "\xe9" => [0, "\xcct"], "\xea" => [73, "\xcc"], "\xeb" => [88, "\xcc"], "\xec" => [89, "\xcc"], "\xed" => [96, "\xcc"], "\xee" => [97, "\xcc"], "\xef" => [99, "\xcc"], "\xf0" => [106, "\xcc"], "\xf1" => [136, "\xcc"], "\xf2" => [139, "\xcc"], "\xf3" => [141, "\xcc"], "\xf4" => [145, "\xcc"], "\xf5" => [147, "\xcc"], "\xf6" => [149, "\xcc"], "\xf7" => [101, "\xcc"], "\xf8" => [112, "\xcc"], "\xf9" => [117, "\xcc"], "\xfa" => [120, "\xcc"], "\xfb" => [124, "\xcc"], "\xfc" => [127, "\xcc"], "\xfd" => [144, "\xcc"], "\xfe" => [152, "\xcc"], "\xff" => [11, "\xcc"]], ["\x00" => [0, "\xda0"], "\x01" => [0, "\xda1"], "\x02" => [0, "\xda2"], "\x03" => [0, "\xdaa"], "\x04" => [0, "\xdac"], "\x05" => [0, "\xdae"], "\x06" => [0, "\xdai"], "\x07" => [0, "\xdao"], "\x08" => [0, "\xdas"], "\t" => [0, "\xdat"], "\n" => [73, "\xda"], "\v" => [88, "\xda"], "\f" => [89, "\xda"], "\r" => [96, "\xda"], "\x0e" => [97, "\xda"], "\x0f" => [99, "\xda"], "\x10" => [106, "\xda"], "\x11" => [136, "\xda"], "\x12" => [139, "\xda"], "\x13" => [141, "\xda"], "\x14" => [145, "\xda"], "\x15" => [147, "\xda"], "\x16" => [149, "\xda"], "\x17" => [101, "\xda"], "\x18" => [112, "\xda"], "\x19" => [117, "\xda"], "\x1a" => [120, "\xda"], "\x1b" => [124, "\xda"], "\x1c" => [127, "\xda"], "\x1d" => [144, "\xda"], "\x1e" => [152, "\xda"], "\x1f" => [11, "\xda"], " " => [0, "\xdb0"], "!" => [0, "\xdb1"], "\"" => [0, "\xdb2"], "#" => [0, "\xdba"], "\$" => [0, "\xdbc"], "%" => [0, "\xdbe"], "&" => [0, "\xdbi"], "'" => [0, "\xdbo"], "(" => [0, "\xdbs"], ")" => [0, "\xdbt"], "*" => [73, "\xdb"], "+" => [88, "\xdb"], "," => [89, "\xdb"], "-" => [96, "\xdb"], "." => [97, "\xdb"], "/" => [99, "\xdb"], [106, "\xdb"], [136, "\xdb"], [139, "\xdb"], [141, "\xdb"], [145, "\xdb"], [147, "\xdb"], [149, "\xdb"], [101, "\xdb"], [112, "\xdb"], [117, "\xdb"], ":" => [120, "\xdb"], ";" => [124, "\xdb"], "<" => [127, "\xdb"], "=" => [144, "\xdb"], ">" => [152, "\xdb"], "?" => [11, "\xdb"], "@" => [0, "\xee0"], "A" => [0, "\xee1"], "B" => [0, "\xee2"], "C" => [0, "\xeea"], "D" => [0, "\xeec"], "E" => [0, "\xeee"], "F" => [0, "\xeei"], "G" => [0, "\xeeo"], "H" => [0, "\xees"], "I" => [0, "\xeet"], "J" => [73, "\xee"], "K" => [88, "\xee"], "L" => [89, "\xee"], "M" => [96, "\xee"], "N" => [97, "\xee"], "O" => [99, "\xee"], "P" => [106, "\xee"], "Q" => [136, "\xee"], "R" => [139, "\xee"], "S" => [141, "\xee"], "T" => [145, "\xee"], "U" => [147, "\xee"], "V" => [149, "\xee"], "W" => [101, "\xee"], "X" => [112, "\xee"], "Y" => [117, "\xee"], "Z" => [120, "\xee"], "[" => [124, "\xee"], "\\" => [127, "\xee"], "]" => [144, "\xee"], "^" => [152, "\xee"], "_" => [11, "\xee"], "`" => [0, "\xf00"], "a" => [0, "\xf01"], "b" => [0, "\xf02"], "c" => [0, "\xf0a"], "d" => [0, "\xf0c"], "e" => [0, "\xf0e"], "f" => [0, "\xf0i"], "g" => [0, "\xf0o"], "h" => [0, "\xf0s"], "i" => [0, "\xf0t"], "j" => [73, "\xf0"], "k" => [88, "\xf0"], "l" => [89, "\xf0"], "m" => [96, "\xf0"], "n" => [97, "\xf0"], "o" => [99, "\xf0"], "p" => [106, "\xf0"], "q" => [136, "\xf0"], "r" => [139, "\xf0"], "s" => [141, "\xf0"], "t" => [145, "\xf0"], "u" => [147, "\xf0"], "v" => [149, "\xf0"], "w" => [101, "\xf0"], "x" => [112, "\xf0"], "y" => [117, "\xf0"], "z" => [120, "\xf0"], "{" => [124, "\xf0"], "|" => [127, "\xf0"], "}" => [144, "\xf0"], "~" => [152, "\xf0"], "" => [11, "\xf0"], "\x80" => [0, "\xf20"], "\x81" => [0, "\xf21"], "\x82" => [0, "\xf22"], "\x83" => [0, "\xf2a"], "\x84" => [0, "\xf2c"], "\x85" => [0, "\xf2e"], "\x86" => [0, "\xf2i"], "\x87" => [0, "\xf2o"], "\x88" => [0, "\xf2s"], "\x89" => [0, "\xf2t"], "\x8a" => [73, "\xf2"], "\x8b" => [88, "\xf2"], "\x8c" => [89, "\xf2"], "\x8d" => [96, "\xf2"], "\x8e" => [97, "\xf2"], "\x8f" => [99, "\xf2"], "\x90" => [106, "\xf2"], "\x91" => [136, "\xf2"], "\x92" => [139, "\xf2"], "\x93" => [141, "\xf2"], "\x94" => [145, "\xf2"], "\x95" => [147, "\xf2"], "\x96" => [149, "\xf2"], "\x97" => [101, "\xf2"], "\x98" => [112, "\xf2"], "\x99" => [117, "\xf2"], "\x9a" => [120, "\xf2"], "\x9b" => [124, "\xf2"], "\x9c" => [127, "\xf2"], "\x9d" => [144, "\xf2"], "\x9e" => [152, "\xf2"], "\x9f" => [11, "\xf2"], "\xa0" => [0, "\xf30"], "\xa1" => [0, "\xf31"], "\xa2" => [0, "\xf32"], "\xa3" => [0, "\xf3a"], "\xa4" => [0, "\xf3c"], "\xa5" => [0, "\xf3e"], "\xa6" => [0, "\xf3i"], "\xa7" => [0, "\xf3o"], "\xa8" => [0, "\xf3s"], "\xa9" => [0, "\xf3t"], "\xaa" => [73, "\xf3"], "\xab" => [88, "\xf3"], "\xac" => [89, "\xf3"], "\xad" => [96, "\xf3"], "\xae" => [97, "\xf3"], "\xaf" => [99, "\xf3"], "\xb0" => [106, "\xf3"], "\xb1" => [136, "\xf3"], "\xb2" => [139, "\xf3"], "\xb3" => [141, "\xf3"], "\xb4" => [145, "\xf3"], "\xb5" => [147, "\xf3"], "\xb6" => [149, "\xf3"], "\xb7" => [101, "\xf3"], "\xb8" => [112, "\xf3"], "\xb9" => [117, "\xf3"], "\xba" => [120, "\xf3"], "\xbb" => [124, "\xf3"], "\xbc" => [127, "\xf3"], "\xbd" => [144, "\xf3"], "\xbe" => [152, "\xf3"], "\xbf" => [11, "\xf3"], "\xc0" => [0, "\xff0"], "\xc1" => [0, "\xff1"], "\xc2" => [0, "\xff2"], "\xc3" => [0, "\xffa"], "\xc4" => [0, "\xffc"], "\xc5" => [0, "\xffe"], "\xc6" => [0, "\xffi"], "\xc7" => [0, "\xffo"], "\xc8" => [0, "\xffs"], "\xc9" => [0, "\xfft"], "\xca" => [73, "\xff"], "\xcb" => [88, "\xff"], "\xcc" => [89, "\xff"], "\xcd" => [96, "\xff"], "\xce" => [97, "\xff"], "\xcf" => [99, "\xff"], "\xd0" => [106, "\xff"], "\xd1" => [136, "\xff"], "\xd2" => [139, "\xff"], "\xd3" => [141, "\xff"], "\xd4" => [145, "\xff"], "\xd5" => [147, "\xff"], "\xd6" => [149, "\xff"], "\xd7" => [101, "\xff"], "\xd8" => [112, "\xff"], "\xd9" => [117, "\xff"], "\xda" => [120, "\xff"], "\xdb" => [124, "\xff"], "\xdc" => [127, "\xff"], "\xdd" => [144, "\xff"], "\xde" => [152, "\xff"], "\xdf" => [11, "\xff"], "\xe0" => [92, "\xcb"], "\xe1" => [95, "\xcb"], "\xe2" => [137, "\xcb"], "\xe3" => [142, "\xcb"], "\xe4" => [150, "\xcb"], "\xe5" => [74, "\xcb"], "\xe6" => [90, "\xcb"], "\xe7" => [98, "\xcb"], "\xe8" => [107, "\xcb"], "\xe9" => [140, "\xcb"], "\xea" => [146, "\xcb"], "\xeb" => [102, "\xcb"], "\xec" => [113, "\xcb"], "\xed" => [121, "\xcb"], "\xee" => [128, "\xcb"], "\xef" => [12, "\xcb"], "\xf0" => [92, "\xcc"], "\xf1" => [95, "\xcc"], "\xf2" => [137, "\xcc"], "\xf3" => [142, "\xcc"], "\xf4" => [150, "\xcc"], "\xf5" => [74, "\xcc"], "\xf6" => [90, "\xcc"], "\xf7" => [98, "\xcc"], "\xf8" => [107, "\xcc"], "\xf9" => [140, "\xcc"], "\xfa" => [146, "\xcc"], "\xfb" => [102, "\xcc"], "\xfc" => [113, "\xcc"], "\xfd" => [121, "\xcc"], "\xfe" => [128, "\xcc"], "\xff" => [12, "\xcc"]], ["\x00" => [94, "\xcb0"], "\x01" => [76, "\xcb0"], "\x02" => [104, "\xcb0"], "\x03" => [16, "\xcb0"], "\x04" => [94, "\xcb1"], "\x05" => [76, "\xcb1"], "\x06" => [104, "\xcb1"], "\x07" => [16, "\xcb1"], "\x08" => [94, "\xcb2"], "\t" => [76, "\xcb2"], "\n" => [104, "\xcb2"], "\v" => [16, "\xcb2"], "\f" => [94, "\xcba"], "\r" => [76, "\xcba"], "\x0e" => [104, "\xcba"], "\x0f" => [16, "\xcba"], "\x10" => [94, "\xcbc"], "\x11" => [76, "\xcbc"], "\x12" => [104, "\xcbc"], "\x13" => [16, "\xcbc"], "\x14" => [94, "\xcbe"], "\x15" => [76, "\xcbe"], "\x16" => [104, "\xcbe"], "\x17" => [16, "\xcbe"], "\x18" => [94, "\xcbi"], "\x19" => [76, "\xcbi"], "\x1a" => [104, "\xcbi"], "\x1b" => [16, "\xcbi"], "\x1c" => [94, "\xcbo"], "\x1d" => [76, "\xcbo"], "\x1e" => [104, "\xcbo"], "\x1f" => [16, "\xcbo"], " " => [94, "\xcbs"], "!" => [76, "\xcbs"], "\"" => [104, "\xcbs"], "#" => [16, "\xcbs"], "\$" => [94, "\xcbt"], "%" => [76, "\xcbt"], "&" => [104, "\xcbt"], "'" => [16, "\xcbt"], "(" => [77, "\xcb "], ")" => [18, "\xcb "], "*" => [77, "\xcb%"], "+" => [18, "\xcb%"], "," => [77, "\xcb-"], "-" => [18, "\xcb-"], "." => [77, "\xcb."], "/" => [18, "\xcb."], [77, "\xcb/"], [18, "\xcb/"], [77, "\xcb3"], [18, "\xcb3"], [77, "\xcb4"], [18, "\xcb4"], [77, "\xcb5"], [18, "\xcb5"], [77, "\xcb6"], [18, "\xcb6"], ":" => [77, "\xcb7"], ";" => [18, "\xcb7"], "<" => [77, "\xcb8"], "=" => [18, "\xcb8"], ">" => [77, "\xcb9"], "?" => [18, "\xcb9"], "@" => [77, "\xcb="], "A" => [18, "\xcb="], "B" => [77, "\xcbA"], "C" => [18, "\xcbA"], "D" => [77, "\xcb_"], "E" => [18, "\xcb_"], "F" => [77, "\xcbb"], "G" => [18, "\xcbb"], "H" => [77, "\xcbd"], "I" => [18, "\xcbd"], "J" => [77, "\xcbf"], "K" => [18, "\xcbf"], "L" => [77, "\xcbg"], "M" => [18, "\xcbg"], "N" => [77, "\xcbh"], "O" => [18, "\xcbh"], "P" => [77, "\xcbl"], "Q" => [18, "\xcbl"], "R" => [77, "\xcbm"], "S" => [18, "\xcbm"], "T" => [77, "\xcbn"], "U" => [18, "\xcbn"], "V" => [77, "\xcbp"], "W" => [18, "\xcbp"], "X" => [77, "\xcbr"], "Y" => [18, "\xcbr"], "Z" => [77, "\xcbu"], "[" => [18, "\xcbu"], "\\" => [0, "\xcb:"], "]" => [0, "\xcbB"], "^" => [0, "\xcbC"], "_" => [0, "\xcbD"], "`" => [0, "\xcbE"], "a" => [0, "\xcbF"], "b" => [0, "\xcbG"], "c" => [0, "\xcbH"], "d" => [0, "\xcbI"], "e" => [0, "\xcbJ"], "f" => [0, "\xcbK"], "g" => [0, "\xcbL"], "h" => [0, "\xcbM"], "i" => [0, "\xcbN"], "j" => [0, "\xcbO"], "k" => [0, "\xcbP"], "l" => [0, "\xcbQ"], "m" => [0, "\xcbR"], "n" => [0, "\xcbS"], "o" => [0, "\xcbT"], "p" => [0, "\xcbU"], "q" => [0, "\xcbV"], "r" => [0, "\xcbW"], "s" => [0, "\xcbY"], "t" => [0, "\xcbj"], "u" => [0, "\xcbk"], "v" => [0, "\xcbq"], "w" => [0, "\xcbv"], "x" => [0, "\xcbw"], "y" => [0, "\xcbx"], "z" => [0, "\xcby"], "{" => [0, "\xcbz"], "|" => [82, "\xcb"], "}" => [87, "\xcb"], "~" => [130, "\xcb"], "" => [9, "\xcb"], "\x80" => [94, "\xcc0"], "\x81" => [76, "\xcc0"], "\x82" => [104, "\xcc0"], "\x83" => [16, "\xcc0"], "\x84" => [94, "\xcc1"], "\x85" => [76, "\xcc1"], "\x86" => [104, "\xcc1"], "\x87" => [16, "\xcc1"], "\x88" => [94, "\xcc2"], "\x89" => [76, "\xcc2"], "\x8a" => [104, "\xcc2"], "\x8b" => [16, "\xcc2"], "\x8c" => [94, "\xcca"], "\x8d" => [76, "\xcca"], "\x8e" => [104, "\xcca"], "\x8f" => [16, "\xcca"], "\x90" => [94, "\xccc"], "\x91" => [76, "\xccc"], "\x92" => [104, "\xccc"], "\x93" => [16, "\xccc"], "\x94" => [94, "\xcce"], "\x95" => [76, "\xcce"], "\x96" => [104, "\xcce"], "\x97" => [16, "\xcce"], "\x98" => [94, "\xcci"], "\x99" => [76, "\xcci"], "\x9a" => [104, "\xcci"], "\x9b" => [16, "\xcci"], "\x9c" => [94, "\xcco"], "\x9d" => [76, "\xcco"], "\x9e" => [104, "\xcco"], "\x9f" => [16, "\xcco"], "\xa0" => [94, "\xccs"], "\xa1" => [76, "\xccs"], "\xa2" => [104, "\xccs"], "\xa3" => [16, "\xccs"], "\xa4" => [94, "\xcct"], "\xa5" => [76, "\xcct"], "\xa6" => [104, "\xcct"], "\xa7" => [16, "\xcct"], "\xa8" => [77, "\xcc "], "\xa9" => [18, "\xcc "], "\xaa" => [77, "\xcc%"], "\xab" => [18, "\xcc%"], "\xac" => [77, "\xcc-"], "\xad" => [18, "\xcc-"], "\xae" => [77, "\xcc."], "\xaf" => [18, "\xcc."], "\xb0" => [77, "\xcc/"], "\xb1" => [18, "\xcc/"], "\xb2" => [77, "\xcc3"], "\xb3" => [18, "\xcc3"], "\xb4" => [77, "\xcc4"], "\xb5" => [18, "\xcc4"], "\xb6" => [77, "\xcc5"], "\xb7" => [18, "\xcc5"], "\xb8" => [77, "\xcc6"], "\xb9" => [18, "\xcc6"], "\xba" => [77, "\xcc7"], "\xbb" => [18, "\xcc7"], "\xbc" => [77, "\xcc8"], "\xbd" => [18, "\xcc8"], "\xbe" => [77, "\xcc9"], "\xbf" => [18, "\xcc9"], "\xc0" => [77, "\xcc="], "\xc1" => [18, "\xcc="], "\xc2" => [77, "\xccA"], "\xc3" => [18, "\xccA"], "\xc4" => [77, "\xcc_"], "\xc5" => [18, "\xcc_"], "\xc6" => [77, "\xccb"], "\xc7" => [18, "\xccb"], "\xc8" => [77, "\xccd"], "\xc9" => [18, "\xccd"], "\xca" => [77, "\xccf"], "\xcb" => [18, "\xccf"], "\xcc" => [77, "\xccg"], "\xcd" => [18, "\xccg"], "\xce" => [77, "\xcch"], "\xcf" => [18, "\xcch"], "\xd0" => [77, "\xccl"], "\xd1" => [18, "\xccl"], "\xd2" => [77, "\xccm"], "\xd3" => [18, "\xccm"], "\xd4" => [77, "\xccn"], "\xd5" => [18, "\xccn"], "\xd6" => [77, "\xccp"], "\xd7" => [18, "\xccp"], "\xd8" => [77, "\xccr"], "\xd9" => [18, "\xccr"], "\xda" => [77, "\xccu"], "\xdb" => [18, "\xccu"], "\xdc" => [0, "\xcc:"], "\xdd" => [0, "\xccB"], "\xde" => [0, "\xccC"], "\xdf" => [0, "\xccD"], "\xe0" => [0, "\xccE"], "\xe1" => [0, "\xccF"], "\xe2" => [0, "\xccG"], "\xe3" => [0, "\xccH"], "\xe4" => [0, "\xccI"], "\xe5" => [0, "\xccJ"], "\xe6" => [0, "\xccK"], "\xe7" => [0, "\xccL"], "\xe8" => [0, "\xccM"], "\xe9" => [0, "\xccN"], "\xea" => [0, "\xccO"], "\xeb" => [0, "\xccP"], "\xec" => [0, "\xccQ"], "\xed" => [0, "\xccR"], "\xee" => [0, "\xccS"], "\xef" => [0, "\xccT"], "\xf0" => [0, "\xccU"], "\xf1" => [0, "\xccV"], "\xf2" => [0, "\xccW"], "\xf3" => [0, "\xccY"], "\xf4" => [0, "\xccj"], "\xf5" => [0, "\xcck"], "\xf6" => [0, "\xccq"], "\xf7" => [0, "\xccv"], "\xf8" => [0, "\xccw"], "\xf9" => [0, "\xccx"], "\xfa" => [0, "\xccy"], "\xfb" => [0, "\xccz"], "\xfc" => [82, "\xcc"], "\xfd" => [87, "\xcc"], "\xfe" => [130, "\xcc"], "\xff" => [9, "\xcc"]], ["\x00" => [94, "\xff0"], "\x01" => [76, "\xff0"], "\x02" => [104, "\xff0"], "\x03" => [16, "\xff0"], "\x04" => [94, "\xff1"], "\x05" => [76, "\xff1"], "\x06" => [104, "\xff1"], "\x07" => [16, "\xff1"], "\x08" => [94, "\xff2"], "\t" => [76, "\xff2"], "\n" => [104, "\xff2"], "\v" => [16, "\xff2"], "\f" => [94, "\xffa"], "\r" => [76, "\xffa"], "\x0e" => [104, "\xffa"], "\x0f" => [16, "\xffa"], "\x10" => [94, "\xffc"], "\x11" => [76, "\xffc"], "\x12" => [104, "\xffc"], "\x13" => [16, "\xffc"], "\x14" => [94, "\xffe"], "\x15" => [76, "\xffe"], "\x16" => [104, "\xffe"], "\x17" => [16, "\xffe"], "\x18" => [94, "\xffi"], "\x19" => [76, "\xffi"], "\x1a" => [104, "\xffi"], "\x1b" => [16, "\xffi"], "\x1c" => [94, "\xffo"], "\x1d" => [76, "\xffo"], "\x1e" => [104, "\xffo"], "\x1f" => [16, "\xffo"], " " => [94, "\xffs"], "!" => [76, "\xffs"], "\"" => [104, "\xffs"], "#" => [16, "\xffs"], "\$" => [94, "\xfft"], "%" => [76, "\xfft"], "&" => [104, "\xfft"], "'" => [16, "\xfft"], "(" => [77, "\xff "], ")" => [18, "\xff "], "*" => [77, "\xff%"], "+" => [18, "\xff%"], "," => [77, "\xff-"], "-" => [18, "\xff-"], "." => [77, "\xff."], "/" => [18, "\xff."], [77, "\xff/"], [18, "\xff/"], [77, "\xff3"], [18, "\xff3"], [77, "\xff4"], [18, "\xff4"], [77, "\xff5"], [18, "\xff5"], [77, "\xff6"], [18, "\xff6"], ":" => [77, "\xff7"], ";" => [18, "\xff7"], "<" => [77, "\xff8"], "=" => [18, "\xff8"], ">" => [77, "\xff9"], "?" => [18, "\xff9"], "@" => [77, "\xff="], "A" => [18, "\xff="], "B" => [77, "\xffA"], "C" => [18, "\xffA"], "D" => [77, "\xff_"], "E" => [18, "\xff_"], "F" => [77, "\xffb"], "G" => [18, "\xffb"], "H" => [77, "\xffd"], "I" => [18, "\xffd"], "J" => [77, "\xfff"], "K" => [18, "\xfff"], "L" => [77, "\xffg"], "M" => [18, "\xffg"], "N" => [77, "\xffh"], "O" => [18, "\xffh"], "P" => [77, "\xffl"], "Q" => [18, "\xffl"], "R" => [77, "\xffm"], "S" => [18, "\xffm"], "T" => [77, "\xffn"], "U" => [18, "\xffn"], "V" => [77, "\xffp"], "W" => [18, "\xffp"], "X" => [77, "\xffr"], "Y" => [18, "\xffr"], "Z" => [77, "\xffu"], "[" => [18, "\xffu"], "\\" => [0, "\xff:"], "]" => [0, "\xffB"], "^" => [0, "\xffC"], "_" => [0, "\xffD"], "`" => [0, "\xffE"], "a" => [0, "\xffF"], "b" => [0, "\xffG"], "c" => [0, "\xffH"], "d" => [0, "\xffI"], "e" => [0, "\xffJ"], "f" => [0, "\xffK"], "g" => [0, "\xffL"], "h" => [0, "\xffM"], "i" => [0, "\xffN"], "j" => [0, "\xffO"], "k" => [0, "\xffP"], "l" => [0, "\xffQ"], "m" => [0, "\xffR"], "n" => [0, "\xffS"], "o" => [0, "\xffT"], "p" => [0, "\xffU"], "q" => [0, "\xffV"], "r" => [0, "\xffW"], "s" => [0, "\xffY"], "t" => [0, "\xffj"], "u" => [0, "\xffk"], "v" => [0, "\xffq"], "w" => [0, "\xffv"], "x" => [0, "\xffw"], "y" => [0, "\xffx"], "z" => [0, "\xffy"], "{" => [0, "\xffz"], "|" => [82, "\xff"], "}" => [87, "\xff"], "~" => [130, "\xff"], "" => [9, "\xff"], "\x80" => [77, "\xcb0"], "\x81" => [18, "\xcb0"], "\x82" => [77, "\xcb1"], "\x83" => [18, "\xcb1"], "\x84" => [77, "\xcb2"], "\x85" => [18, "\xcb2"], "\x86" => [77, "\xcba"], "\x87" => [18, "\xcba"], "\x88" => [77, "\xcbc"], "\x89" => [18, "\xcbc"], "\x8a" => [77, "\xcbe"], "\x8b" => [18, "\xcbe"], "\x8c" => [77, "\xcbi"], "\x8d" => [18, "\xcbi"], "\x8e" => [77, "\xcbo"], "\x8f" => [18, "\xcbo"], "\x90" => [77, "\xcbs"], "\x91" => [18, "\xcbs"], "\x92" => [77, "\xcbt"], "\x93" => [18, "\xcbt"], "\x94" => [0, "\xcb "], "\x95" => [0, "\xcb%"], "\x96" => [0, "\xcb-"], "\x97" => [0, "\xcb."], "\x98" => [0, "\xcb/"], "\x99" => [0, "\xcb3"], "\x9a" => [0, "\xcb4"], "\x9b" => [0, "\xcb5"], "\x9c" => [0, "\xcb6"], "\x9d" => [0, "\xcb7"], "\x9e" => [0, "\xcb8"], "\x9f" => [0, "\xcb9"], "\xa0" => [0, "\xcb="], "\xa1" => [0, "\xcbA"], "\xa2" => [0, "\xcb_"], "\xa3" => [0, "\xcbb"], "\xa4" => [0, "\xcbd"], "\xa5" => [0, "\xcbf"], "\xa6" => [0, "\xcbg"], "\xa7" => [0, "\xcbh"], "\xa8" => [0, "\xcbl"], "\xa9" => [0, "\xcbm"], "\xaa" => [0, "\xcbn"], "\xab" => [0, "\xcbp"], "\xac" => [0, "\xcbr"], "\xad" => [0, "\xcbu"], "\xae" => [100, "\xcb"], "\xaf" => [110, "\xcb"], "\xb0" => [111, "\xcb"], "\xb1" => [115, "\xcb"], "\xb2" => [116, "\xcb"], "\xb3" => [118, "\xcb"], "\xb4" => [119, "\xcb"], "\xb5" => [122, "\xcb"], "\xb6" => [123, "\xcb"], "\xb7" => [125, "\xcb"], "\xb8" => [126, "\xcb"], "\xb9" => [129, "\xcb"], "\xba" => [143, "\xcb"], "\xbb" => [148, "\xcb"], "\xbc" => [151, "\xcb"], "\xbd" => [153, "\xcb"], "\xbe" => [83, "\xcb"], "\xbf" => [10, "\xcb"], "\xc0" => [77, "\xcc0"], "\xc1" => [18, "\xcc0"], "\xc2" => [77, "\xcc1"], "\xc3" => [18, "\xcc1"], "\xc4" => [77, "\xcc2"], "\xc5" => [18, "\xcc2"], "\xc6" => [77, "\xcca"], "\xc7" => [18, "\xcca"], "\xc8" => [77, "\xccc"], "\xc9" => [18, "\xccc"], "\xca" => [77, "\xcce"], "\xcb" => [18, "\xcce"], "\xcc" => [77, "\xcci"], "\xcd" => [18, "\xcci"], "\xce" => [77, "\xcco"], "\xcf" => [18, "\xcco"], "\xd0" => [77, "\xccs"], "\xd1" => [18, "\xccs"], "\xd2" => [77, "\xcct"], "\xd3" => [18, "\xcct"], "\xd4" => [0, "\xcc "], "\xd5" => [0, "\xcc%"], "\xd6" => [0, "\xcc-"], "\xd7" => [0, "\xcc."], "\xd8" => [0, "\xcc/"], "\xd9" => [0, "\xcc3"], "\xda" => [0, "\xcc4"], "\xdb" => [0, "\xcc5"], "\xdc" => [0, "\xcc6"], "\xdd" => [0, "\xcc7"], "\xde" => [0, "\xcc8"], "\xdf" => [0, "\xcc9"], "\xe0" => [0, "\xcc="], "\xe1" => [0, "\xccA"], "\xe2" => [0, "\xcc_"], "\xe3" => [0, "\xccb"], "\xe4" => [0, "\xccd"], "\xe5" => [0, "\xccf"], "\xe6" => [0, "\xccg"], "\xe7" => [0, "\xcch"], "\xe8" => [0, "\xccl"], "\xe9" => [0, "\xccm"], "\xea" => [0, "\xccn"], "\xeb" => [0, "\xccp"], "\xec" => [0, "\xccr"], "\xed" => [0, "\xccu"], "\xee" => [100, "\xcc"], "\xef" => [110, "\xcc"], "\xf0" => [111, "\xcc"], "\xf1" => [115, "\xcc"], "\xf2" => [116, "\xcc"], "\xf3" => [118, "\xcc"], "\xf4" => [119, "\xcc"], "\xf5" => [122, "\xcc"], "\xf6" => [123, "\xcc"], "\xf7" => [125, "\xcc"], "\xf8" => [126, "\xcc"], "\xf9" => [129, "\xcc"], "\xfa" => [143, "\xcc"], "\xfb" => [148, "\xcc"], "\xfc" => [151, "\xcc"], "\xfd" => [153, "\xcc"], "\xfe" => [83, "\xcc"], "\xff" => [10, "\xcc"]], ["\x00" => [94, "\xd20"], "\x01" => [76, "\xd20"], "\x02" => [104, "\xd20"], "\x03" => [16, "\xd20"], "\x04" => [94, "\xd21"], "\x05" => [76, "\xd21"], "\x06" => [104, "\xd21"], "\x07" => [16, "\xd21"], "\x08" => [94, "\xd22"], "\t" => [76, "\xd22"], "\n" => [104, "\xd22"], "\v" => [16, "\xd22"], "\f" => [94, "\xd2a"], "\r" => [76, "\xd2a"], "\x0e" => [104, "\xd2a"], "\x0f" => [16, "\xd2a"], "\x10" => [94, "\xd2c"], "\x11" => [76, "\xd2c"], "\x12" => [104, "\xd2c"], "\x13" => [16, "\xd2c"], "\x14" => [94, "\xd2e"], "\x15" => [76, "\xd2e"], "\x16" => [104, "\xd2e"], "\x17" => [16, "\xd2e"], "\x18" => [94, "\xd2i"], "\x19" => [76, "\xd2i"], "\x1a" => [104, "\xd2i"], "\x1b" => [16, "\xd2i"], "\x1c" => [94, "\xd2o"], "\x1d" => [76, "\xd2o"], "\x1e" => [104, "\xd2o"], "\x1f" => [16, "\xd2o"], " " => [94, "\xd2s"], "!" => [76, "\xd2s"], "\"" => [104, "\xd2s"], "#" => [16, "\xd2s"], "\$" => [94, "\xd2t"], "%" => [76, "\xd2t"], "&" => [104, "\xd2t"], "'" => [16, "\xd2t"], "(" => [77, "\xd2 "], ")" => [18, "\xd2 "], "*" => [77, "\xd2%"], "+" => [18, "\xd2%"], "," => [77, "\xd2-"], "-" => [18, "\xd2-"], "." => [77, "\xd2."], "/" => [18, "\xd2."], [77, "\xd2/"], [18, "\xd2/"], [77, "\xd23"], [18, "\xd23"], [77, "\xd24"], [18, "\xd24"], [77, "\xd25"], [18, "\xd25"], [77, "\xd26"], [18, "\xd26"], ":" => [77, "\xd27"], ";" => [18, "\xd27"], "<" => [77, "\xd28"], "=" => [18, "\xd28"], ">" => [77, "\xd29"], "?" => [18, "\xd29"], "@" => [77, "\xd2="], "A" => [18, "\xd2="], "B" => [77, "\xd2A"], "C" => [18, "\xd2A"], "D" => [77, "\xd2_"], "E" => [18, "\xd2_"], "F" => [77, "\xd2b"], "G" => [18, "\xd2b"], "H" => [77, "\xd2d"], "I" => [18, "\xd2d"], "J" => [77, "\xd2f"], "K" => [18, "\xd2f"], "L" => [77, "\xd2g"], "M" => [18, "\xd2g"], "N" => [77, "\xd2h"], "O" => [18, "\xd2h"], "P" => [77, "\xd2l"], "Q" => [18, "\xd2l"], "R" => [77, "\xd2m"], "S" => [18, "\xd2m"], "T" => [77, "\xd2n"], "U" => [18, "\xd2n"], "V" => [77, "\xd2p"], "W" => [18, "\xd2p"], "X" => [77, "\xd2r"], "Y" => [18, "\xd2r"], "Z" => [77, "\xd2u"], "[" => [18, "\xd2u"], "\\" => [0, "\xd2:"], "]" => [0, "\xd2B"], "^" => [0, "\xd2C"], "_" => [0, "\xd2D"], "`" => [0, "\xd2E"], "a" => [0, "\xd2F"], "b" => [0, "\xd2G"], "c" => [0, "\xd2H"], "d" => [0, "\xd2I"], "e" => [0, "\xd2J"], "f" => [0, "\xd2K"], "g" => [0, "\xd2L"], "h" => [0, "\xd2M"], "i" => [0, "\xd2N"], "j" => [0, "\xd2O"], "k" => [0, "\xd2P"], "l" => [0, "\xd2Q"], "m" => [0, "\xd2R"], "n" => [0, "\xd2S"], "o" => [0, "\xd2T"], "p" => [0, "\xd2U"], "q" => [0, "\xd2V"], "r" => [0, "\xd2W"], "s" => [0, "\xd2Y"], "t" => [0, "\xd2j"], "u" => [0, "\xd2k"], "v" => [0, "\xd2q"], "w" => [0, "\xd2v"], "x" => [0, "\xd2w"], "y" => [0, "\xd2x"], "z" => [0, "\xd2y"], "{" => [0, "\xd2z"], "|" => [82, "\xd2"], "}" => [87, "\xd2"], "~" => [130, "\xd2"], "" => [9, "\xd2"], "\x80" => [94, "\xd50"], "\x81" => [76, "\xd50"], "\x82" => [104, "\xd50"], "\x83" => [16, "\xd50"], "\x84" => [94, "\xd51"], "\x85" => [76, "\xd51"], "\x86" => [104, "\xd51"], "\x87" => [16, "\xd51"], "\x88" => [94, "\xd52"], "\x89" => [76, "\xd52"], "\x8a" => [104, "\xd52"], "\x8b" => [16, "\xd52"], "\x8c" => [94, "\xd5a"], "\x8d" => [76, "\xd5a"], "\x8e" => [104, "\xd5a"], "\x8f" => [16, "\xd5a"], "\x90" => [94, "\xd5c"], "\x91" => [76, "\xd5c"], "\x92" => [104, "\xd5c"], "\x93" => [16, "\xd5c"], "\x94" => [94, "\xd5e"], "\x95" => [76, "\xd5e"], "\x96" => [104, "\xd5e"], "\x97" => [16, "\xd5e"], "\x98" => [94, "\xd5i"], "\x99" => [76, "\xd5i"], "\x9a" => [104, "\xd5i"], "\x9b" => [16, "\xd5i"], "\x9c" => [94, "\xd5o"], "\x9d" => [76, "\xd5o"], "\x9e" => [104, "\xd5o"], "\x9f" => [16, "\xd5o"], "\xa0" => [94, "\xd5s"], "\xa1" => [76, "\xd5s"], "\xa2" => [104, "\xd5s"], "\xa3" => [16, "\xd5s"], "\xa4" => [94, "\xd5t"], "\xa5" => [76, "\xd5t"], "\xa6" => [104, "\xd5t"], "\xa7" => [16, "\xd5t"], "\xa8" => [77, "\xd5 "], "\xa9" => [18, "\xd5 "], "\xaa" => [77, "\xd5%"], "\xab" => [18, "\xd5%"], "\xac" => [77, "\xd5-"], "\xad" => [18, "\xd5-"], "\xae" => [77, "\xd5."], "\xaf" => [18, "\xd5."], "\xb0" => [77, "\xd5/"], "\xb1" => [18, "\xd5/"], "\xb2" => [77, "\xd53"], "\xb3" => [18, "\xd53"], "\xb4" => [77, "\xd54"], "\xb5" => [18, "\xd54"], "\xb6" => [77, "\xd55"], "\xb7" => [18, "\xd55"], "\xb8" => [77, "\xd56"], "\xb9" => [18, "\xd56"], "\xba" => [77, "\xd57"], "\xbb" => [18, "\xd57"], "\xbc" => [77, "\xd58"], "\xbd" => [18, "\xd58"], "\xbe" => [77, "\xd59"], "\xbf" => [18, "\xd59"], "\xc0" => [77, "\xd5="], "\xc1" => [18, "\xd5="], "\xc2" => [77, "\xd5A"], "\xc3" => [18, "\xd5A"], "\xc4" => [77, "\xd5_"], "\xc5" => [18, "\xd5_"], "\xc6" => [77, "\xd5b"], "\xc7" => [18, "\xd5b"], "\xc8" => [77, "\xd5d"], "\xc9" => [18, "\xd5d"], "\xca" => [77, "\xd5f"], "\xcb" => [18, "\xd5f"], "\xcc" => [77, "\xd5g"], "\xcd" => [18, "\xd5g"], "\xce" => [77, "\xd5h"], "\xcf" => [18, "\xd5h"], "\xd0" => [77, "\xd5l"], "\xd1" => [18, "\xd5l"], "\xd2" => [77, "\xd5m"], "\xd3" => [18, "\xd5m"], "\xd4" => [77, "\xd5n"], "\xd5" => [18, "\xd5n"], "\xd6" => [77, "\xd5p"], "\xd7" => [18, "\xd5p"], "\xd8" => [77, "\xd5r"], "\xd9" => [18, "\xd5r"], "\xda" => [77, "\xd5u"], "\xdb" => [18, "\xd5u"], "\xdc" => [0, "\xd5:"], "\xdd" => [0, "\xd5B"], "\xde" => [0, "\xd5C"], "\xdf" => [0, "\xd5D"], "\xe0" => [0, "\xd5E"], "\xe1" => [0, "\xd5F"], "\xe2" => [0, "\xd5G"], "\xe3" => [0, "\xd5H"], "\xe4" => [0, "\xd5I"], "\xe5" => [0, "\xd5J"], "\xe6" => [0, "\xd5K"], "\xe7" => [0, "\xd5L"], "\xe8" => [0, "\xd5M"], "\xe9" => [0, "\xd5N"], "\xea" => [0, "\xd5O"], "\xeb" => [0, "\xd5P"], "\xec" => [0, "\xd5Q"], "\xed" => [0, "\xd5R"], "\xee" => [0, "\xd5S"], "\xef" => [0, "\xd5T"], "\xf0" => [0, "\xd5U"], "\xf1" => [0, "\xd5V"], "\xf2" => [0, "\xd5W"], "\xf3" => [0, "\xd5Y"], "\xf4" => [0, "\xd5j"], "\xf5" => [0, "\xd5k"], "\xf6" => [0, "\xd5q"], "\xf7" => [0, "\xd5v"], "\xf8" => [0, "\xd5w"], "\xf9" => [0, "\xd5x"], "\xfa" => [0, "\xd5y"], "\xfb" => [0, "\xd5z"], "\xfc" => [82, "\xd5"], "\xfd" => [87, "\xd5"], "\xfe" => [130, "\xd5"], "\xff" => [9, "\xd5"]], ["\x00" => [0, "\xd30"], "\x01" => [0, "\xd31"], "\x02" => [0, "\xd32"], "\x03" => [0, "\xd3a"], "\x04" => [0, "\xd3c"], "\x05" => [0, "\xd3e"], "\x06" => [0, "\xd3i"], "\x07" => [0, "\xd3o"], "\x08" => [0, "\xd3s"], "\t" => [0, "\xd3t"], "\n" => [73, "\xd3"], "\v" => [88, "\xd3"], "\f" => [89, "\xd3"], "\r" => [96, "\xd3"], "\x0e" => [97, "\xd3"], "\x0f" => [99, "\xd3"], "\x10" => [106, "\xd3"], "\x11" => [136, "\xd3"], "\x12" => [139, "\xd3"], "\x13" => [141, "\xd3"], "\x14" => [145, "\xd3"], "\x15" => [147, "\xd3"], "\x16" => [149, "\xd3"], "\x17" => [101, "\xd3"], "\x18" => [112, "\xd3"], "\x19" => [117, "\xd3"], "\x1a" => [120, "\xd3"], "\x1b" => [124, "\xd3"], "\x1c" => [127, "\xd3"], "\x1d" => [144, "\xd3"], "\x1e" => [152, "\xd3"], "\x1f" => [11, "\xd3"], " " => [0, "\xd40"], "!" => [0, "\xd41"], "\"" => [0, "\xd42"], "#" => [0, "\xd4a"], "\$" => [0, "\xd4c"], "%" => [0, "\xd4e"], "&" => [0, "\xd4i"], "'" => [0, "\xd4o"], "(" => [0, "\xd4s"], ")" => [0, "\xd4t"], "*" => [73, "\xd4"], "+" => [88, "\xd4"], "," => [89, "\xd4"], "-" => [96, "\xd4"], "." => [97, "\xd4"], "/" => [99, "\xd4"], [106, "\xd4"], [136, "\xd4"], [139, "\xd4"], [141, "\xd4"], [145, "\xd4"], [147, "\xd4"], [149, "\xd4"], [101, "\xd4"], [112, "\xd4"], [117, "\xd4"], ":" => [120, "\xd4"], ";" => [124, "\xd4"], "<" => [127, "\xd4"], "=" => [144, "\xd4"], ">" => [152, "\xd4"], "?" => [11, "\xd4"], "@" => [0, "\xd60"], "A" => [0, "\xd61"], "B" => [0, "\xd62"], "C" => [0, "\xd6a"], "D" => [0, "\xd6c"], "E" => [0, "\xd6e"], "F" => [0, "\xd6i"], "G" => [0, "\xd6o"], "H" => [0, "\xd6s"], "I" => [0, "\xd6t"], "J" => [73, "\xd6"], "K" => [88, "\xd6"], "L" => [89, "\xd6"], "M" => [96, "\xd6"], "N" => [97, "\xd6"], "O" => [99, "\xd6"], "P" => [106, "\xd6"], "Q" => [136, "\xd6"], "R" => [139, "\xd6"], "S" => [141, "\xd6"], "T" => [145, "\xd6"], "U" => [147, "\xd6"], "V" => [149, "\xd6"], "W" => [101, "\xd6"], "X" => [112, "\xd6"], "Y" => [117, "\xd6"], "Z" => [120, "\xd6"], "[" => [124, "\xd6"], "\\" => [127, "\xd6"], "]" => [144, "\xd6"], "^" => [152, "\xd6"], "_" => [11, "\xd6"], "`" => [0, "\xdd0"], "a" => [0, "\xdd1"], "b" => [0, "\xdd2"], "c" => [0, "\xdda"], "d" => [0, "\xddc"], "e" => [0, "\xdde"], "f" => [0, "\xddi"], "g" => [0, "\xddo"], "h" => [0, "\xdds"], "i" => [0, "\xddt"], "j" => [73, "\xdd"], "k" => [88, "\xdd"], "l" => [89, "\xdd"], "m" => [96, "\xdd"], "n" => [97, "\xdd"], "o" => [99, "\xdd"], "p" => [106, "\xdd"], "q" => [136, "\xdd"], "r" => [139, "\xdd"], "s" => [141, "\xdd"], "t" => [145, "\xdd"], "u" => [147, "\xdd"], "v" => [149, "\xdd"], "w" => [101, "\xdd"], "x" => [112, "\xdd"], "y" => [117, "\xdd"], "z" => [120, "\xdd"], "{" => [124, "\xdd"], "|" => [127, "\xdd"], "}" => [144, "\xdd"], "~" => [152, "\xdd"], "" => [11, "\xdd"], "\x80" => [0, "\xde0"], "\x81" => [0, "\xde1"], "\x82" => [0, "\xde2"], "\x83" => [0, "\xdea"], "\x84" => [0, "\xdec"], "\x85" => [0, "\xdee"], "\x86" => [0, "\xdei"], "\x87" => [0, "\xdeo"], "\x88" => [0, "\xdes"], "\x89" => [0, "\xdet"], "\x8a" => [73, "\xde"], "\x8b" => [88, "\xde"], "\x8c" => [89, "\xde"], "\x8d" => [96, "\xde"], "\x8e" => [97, "\xde"], "\x8f" => [99, "\xde"], "\x90" => [106, "\xde"], "\x91" => [136, "\xde"], "\x92" => [139, "\xde"], "\x93" => [141, "\xde"], "\x94" => [145, "\xde"], "\x95" => [147, "\xde"], "\x96" => [149, "\xde"], "\x97" => [101, "\xde"], "\x98" => [112, "\xde"], "\x99" => [117, "\xde"], "\x9a" => [120, "\xde"], "\x9b" => [124, "\xde"], "\x9c" => [127, "\xde"], "\x9d" => [144, "\xde"], "\x9e" => [152, "\xde"], "\x9f" => [11, "\xde"], "\xa0" => [0, "\xdf0"], "\xa1" => [0, "\xdf1"], "\xa2" => [0, "\xdf2"], "\xa3" => [0, "\xdfa"], "\xa4" => [0, "\xdfc"], "\xa5" => [0, "\xdfe"], "\xa6" => [0, "\xdfi"], "\xa7" => [0, "\xdfo"], "\xa8" => [0, "\xdfs"], "\xa9" => [0, "\xdft"], "\xaa" => [73, "\xdf"], "\xab" => [88, "\xdf"], "\xac" => [89, "\xdf"], "\xad" => [96, "\xdf"], "\xae" => [97, "\xdf"], "\xaf" => [99, "\xdf"], "\xb0" => [106, "\xdf"], "\xb1" => [136, "\xdf"], "\xb2" => [139, "\xdf"], "\xb3" => [141, "\xdf"], "\xb4" => [145, "\xdf"], "\xb5" => [147, "\xdf"], "\xb6" => [149, "\xdf"], "\xb7" => [101, "\xdf"], "\xb8" => [112, "\xdf"], "\xb9" => [117, "\xdf"], "\xba" => [120, "\xdf"], "\xbb" => [124, "\xdf"], "\xbc" => [127, "\xdf"], "\xbd" => [144, "\xdf"], "\xbe" => [152, "\xdf"], "\xbf" => [11, "\xdf"], "\xc0" => [0, "\xf10"], "\xc1" => [0, "\xf11"], "\xc2" => [0, "\xf12"], "\xc3" => [0, "\xf1a"], "\xc4" => [0, "\xf1c"], "\xc5" => [0, "\xf1e"], "\xc6" => [0, "\xf1i"], "\xc7" => [0, "\xf1o"], "\xc8" => [0, "\xf1s"], "\xc9" => [0, "\xf1t"], "\xca" => [73, "\xf1"], "\xcb" => [88, "\xf1"], "\xcc" => [89, "\xf1"], "\xcd" => [96, "\xf1"], "\xce" => [97, "\xf1"], "\xcf" => [99, "\xf1"], "\xd0" => [106, "\xf1"], "\xd1" => [136, "\xf1"], "\xd2" => [139, "\xf1"], "\xd3" => [141, "\xf1"], "\xd4" => [145, "\xf1"], "\xd5" => [147, "\xf1"], "\xd6" => [149, "\xf1"], "\xd7" => [101, "\xf1"], "\xd8" => [112, "\xf1"], "\xd9" => [117, "\xf1"], "\xda" => [120, "\xf1"], "\xdb" => [124, "\xf1"], "\xdc" => [127, "\xf1"], "\xdd" => [144, "\xf1"], "\xde" => [152, "\xf1"], "\xdf" => [11, "\xf1"], "\xe0" => [0, "\xf40"], "\xe1" => [0, "\xf41"], "\xe2" => [0, "\xf42"], "\xe3" => [0, "\xf4a"], "\xe4" => [0, "\xf4c"], "\xe5" => [0, "\xf4e"], "\xe6" => [0, "\xf4i"], "\xe7" => [0, "\xf4o"], "\xe8" => [0, "\xf4s"], "\xe9" => [0, "\xf4t"], "\xea" => [73, "\xf4"], "\xeb" => [88, "\xf4"], "\xec" => [89, "\xf4"], "\xed" => [96, "\xf4"], "\xee" => [97, "\xf4"], "\xef" => [99, "\xf4"], "\xf0" => [106, "\xf4"], "\xf1" => [136, "\xf4"], "\xf2" => [139, "\xf4"], "\xf3" => [141, "\xf4"], "\xf4" => [145, "\xf4"], "\xf5" => [147, "\xf4"], "\xf6" => [149, "\xf4"], "\xf7" => [101, "\xf4"], "\xf8" => [112, "\xf4"], "\xf9" => [117, "\xf4"], "\xfa" => [120, "\xf4"], "\xfb" => [124, "\xf4"], "\xfc" => [127, "\xf4"], "\xfd" => [144, "\xf4"], "\xfe" => [152, "\xf4"], "\xff" => [11, "\xf4"]], ["\x00" => [92, "\xd3"], "\x01" => [95, "\xd3"], "\x02" => [137, "\xd3"], "\x03" => [142, "\xd3"], "\x04" => [150, "\xd3"], "\x05" => [74, "\xd3"], "\x06" => [90, "\xd3"], "\x07" => [98, "\xd3"], "\x08" => [107, "\xd3"], "\t" => [140, "\xd3"], "\n" => [146, "\xd3"], "\v" => [102, "\xd3"], "\f" => [113, "\xd3"], "\r" => [121, "\xd3"], "\x0e" => [128, "\xd3"], "\x0f" => [12, "\xd3"], "\x10" => [92, "\xd4"], "\x11" => [95, "\xd4"], "\x12" => [137, "\xd4"], "\x13" => [142, "\xd4"], "\x14" => [150, "\xd4"], "\x15" => [74, "\xd4"], "\x16" => [90, "\xd4"], "\x17" => [98, "\xd4"], "\x18" => [107, "\xd4"], "\x19" => [140, "\xd4"], "\x1a" => [146, "\xd4"], "\x1b" => [102, "\xd4"], "\x1c" => [113, "\xd4"], "\x1d" => [121, "\xd4"], "\x1e" => [128, "\xd4"], "\x1f" => [12, "\xd4"], " " => [92, "\xd6"], "!" => [95, "\xd6"], "\"" => [137, "\xd6"], "#" => [142, "\xd6"], "\$" => [150, "\xd6"], "%" => [74, "\xd6"], "&" => [90, "\xd6"], "'" => [98, "\xd6"], "(" => [107, "\xd6"], ")" => [140, "\xd6"], "*" => [146, "\xd6"], "+" => [102, "\xd6"], "," => [113, "\xd6"], "-" => [121, "\xd6"], "." => [128, "\xd6"], "/" => [12, "\xd6"], [92, "\xdd"], [95, "\xdd"], [137, "\xdd"], [142, "\xdd"], [150, "\xdd"], [74, "\xdd"], [90, "\xdd"], [98, "\xdd"], [107, "\xdd"], [140, "\xdd"], ":" => [146, "\xdd"], ";" => [102, "\xdd"], "<" => [113, "\xdd"], "=" => [121, "\xdd"], ">" => [128, "\xdd"], "?" => [12, "\xdd"], "@" => [92, "\xde"], "A" => [95, "\xde"], "B" => [137, "\xde"], "C" => [142, "\xde"], "D" => [150, "\xde"], "E" => [74, "\xde"], "F" => [90, "\xde"], "G" => [98, "\xde"], "H" => [107, "\xde"], "I" => [140, "\xde"], "J" => [146, "\xde"], "K" => [102, "\xde"], "L" => [113, "\xde"], "M" => [121, "\xde"], "N" => [128, "\xde"], "O" => [12, "\xde"], "P" => [92, "\xdf"], "Q" => [95, "\xdf"], "R" => [137, "\xdf"], "S" => [142, "\xdf"], "T" => [150, "\xdf"], "U" => [74, "\xdf"], "V" => [90, "\xdf"], "W" => [98, "\xdf"], "X" => [107, "\xdf"], "Y" => [140, "\xdf"], "Z" => [146, "\xdf"], "[" => [102, "\xdf"], "\\" => [113, "\xdf"], "]" => [121, "\xdf"], "^" => [128, "\xdf"], "_" => [12, "\xdf"], "`" => [92, "\xf1"], "a" => [95, "\xf1"], "b" => [137, "\xf1"], "c" => [142, "\xf1"], "d" => [150, "\xf1"], "e" => [74, "\xf1"], "f" => [90, "\xf1"], "g" => [98, "\xf1"], "h" => [107, "\xf1"], "i" => [140, "\xf1"], "j" => [146, "\xf1"], "k" => [102, "\xf1"], "l" => [113, "\xf1"], "m" => [121, "\xf1"], "n" => [128, "\xf1"], "o" => [12, "\xf1"], "p" => [92, "\xf4"], "q" => [95, "\xf4"], "r" => [137, "\xf4"], "s" => [142, "\xf4"], "t" => [150, "\xf4"], "u" => [74, "\xf4"], "v" => [90, "\xf4"], "w" => [98, "\xf4"], "x" => [107, "\xf4"], "y" => [140, "\xf4"], "z" => [146, "\xf4"], "{" => [102, "\xf4"], "|" => [113, "\xf4"], "}" => [121, "\xf4"], "~" => [128, "\xf4"], "" => [12, "\xf4"], "\x80" => [92, "\xf5"], "\x81" => [95, "\xf5"], "\x82" => [137, "\xf5"], "\x83" => [142, "\xf5"], "\x84" => [150, "\xf5"], "\x85" => [74, "\xf5"], "\x86" => [90, "\xf5"], "\x87" => [98, "\xf5"], "\x88" => [107, "\xf5"], "\x89" => [140, "\xf5"], "\x8a" => [146, "\xf5"], "\x8b" => [102, "\xf5"], "\x8c" => [113, "\xf5"], "\x8d" => [121, "\xf5"], "\x8e" => [128, "\xf5"], "\x8f" => [12, "\xf5"], "\x90" => [92, "\xf6"], "\x91" => [95, "\xf6"], "\x92" => [137, "\xf6"], "\x93" => [142, "\xf6"], "\x94" => [150, "\xf6"], "\x95" => [74, "\xf6"], "\x96" => [90, "\xf6"], "\x97" => [98, "\xf6"], "\x98" => [107, "\xf6"], "\x99" => [140, "\xf6"], "\x9a" => [146, "\xf6"], "\x9b" => [102, "\xf6"], "\x9c" => [113, "\xf6"], "\x9d" => [121, "\xf6"], "\x9e" => [128, "\xf6"], "\x9f" => [12, "\xf6"], "\xa0" => [92, "\xf7"], "\xa1" => [95, "\xf7"], "\xa2" => [137, "\xf7"], "\xa3" => [142, "\xf7"], "\xa4" => [150, "\xf7"], "\xa5" => [74, "\xf7"], "\xa6" => [90, "\xf7"], "\xa7" => [98, "\xf7"], "\xa8" => [107, "\xf7"], "\xa9" => [140, "\xf7"], "\xaa" => [146, "\xf7"], "\xab" => [102, "\xf7"], "\xac" => [113, "\xf7"], "\xad" => [121, "\xf7"], "\xae" => [128, "\xf7"], "\xaf" => [12, "\xf7"], "\xb0" => [92, "\xf8"], "\xb1" => [95, "\xf8"], "\xb2" => [137, "\xf8"], "\xb3" => [142, "\xf8"], "\xb4" => [150, "\xf8"], "\xb5" => [74, "\xf8"], "\xb6" => [90, "\xf8"], "\xb7" => [98, "\xf8"], "\xb8" => [107, "\xf8"], "\xb9" => [140, "\xf8"], "\xba" => [146, "\xf8"], "\xbb" => [102, "\xf8"], "\xbc" => [113, "\xf8"], "\xbd" => [121, "\xf8"], "\xbe" => [128, "\xf8"], "\xbf" => [12, "\xf8"], "\xc0" => [92, "\xfa"], "\xc1" => [95, "\xfa"], "\xc2" => [137, "\xfa"], "\xc3" => [142, "\xfa"], "\xc4" => [150, "\xfa"], "\xc5" => [74, "\xfa"], "\xc6" => [90, "\xfa"], "\xc7" => [98, "\xfa"], "\xc8" => [107, "\xfa"], "\xc9" => [140, "\xfa"], "\xca" => [146, "\xfa"], "\xcb" => [102, "\xfa"], "\xcc" => [113, "\xfa"], "\xcd" => [121, "\xfa"], "\xce" => [128, "\xfa"], "\xcf" => [12, "\xfa"], "\xd0" => [92, "\xfb"], "\xd1" => [95, "\xfb"], "\xd2" => [137, "\xfb"], "\xd3" => [142, "\xfb"], "\xd4" => [150, "\xfb"], "\xd5" => [74, "\xfb"], "\xd6" => [90, "\xfb"], "\xd7" => [98, "\xfb"], "\xd8" => [107, "\xfb"], "\xd9" => [140, "\xfb"], "\xda" => [146, "\xfb"], "\xdb" => [102, "\xfb"], "\xdc" => [113, "\xfb"], "\xdd" => [121, "\xfb"], "\xde" => [128, "\xfb"], "\xdf" => [12, "\xfb"], "\xe0" => [92, "\xfc"], "\xe1" => [95, "\xfc"], "\xe2" => [137, "\xfc"], "\xe3" => [142, "\xfc"], "\xe4" => [150, "\xfc"], "\xe5" => [74, "\xfc"], "\xe6" => [90, "\xfc"], "\xe7" => [98, "\xfc"], "\xe8" => [107, "\xfc"], "\xe9" => [140, "\xfc"], "\xea" => [146, "\xfc"], "\xeb" => [102, "\xfc"], "\xec" => [113, "\xfc"], "\xed" => [121, "\xfc"], "\xee" => [128, "\xfc"], "\xef" => [12, "\xfc"], "\xf0" => [92, "\xfd"], "\xf1" => [95, "\xfd"], "\xf2" => [137, "\xfd"], "\xf3" => [142, "\xfd"], "\xf4" => [150, "\xfd"], "\xf5" => [74, "\xfd"], "\xf6" => [90, "\xfd"], "\xf7" => [98, "\xfd"], "\xf8" => [107, "\xfd"], "\xf9" => [140, "\xfd"], "\xfa" => [146, "\xfd"], "\xfb" => [102, "\xfd"], "\xfc" => [113, "\xfd"], "\xfd" => [121, "\xfd"], "\xfe" => [128, "\xfd"], "\xff" => [12, "\xfd"]], ["\x00" => [94, "\xd30"], "\x01" => [76, "\xd30"], "\x02" => [104, "\xd30"], "\x03" => [16, "\xd30"], "\x04" => [94, "\xd31"], "\x05" => [76, "\xd31"], "\x06" => [104, "\xd31"], "\x07" => [16, "\xd31"], "\x08" => [94, "\xd32"], "\t" => [76, "\xd32"], "\n" => [104, "\xd32"], "\v" => [16, "\xd32"], "\f" => [94, "\xd3a"], "\r" => [76, "\xd3a"], "\x0e" => [104, "\xd3a"], "\x0f" => [16, "\xd3a"], "\x10" => [94, "\xd3c"], "\x11" => [76, "\xd3c"], "\x12" => [104, "\xd3c"], "\x13" => [16, "\xd3c"], "\x14" => [94, "\xd3e"], "\x15" => [76, "\xd3e"], "\x16" => [104, "\xd3e"], "\x17" => [16, "\xd3e"], "\x18" => [94, "\xd3i"], "\x19" => [76, "\xd3i"], "\x1a" => [104, "\xd3i"], "\x1b" => [16, "\xd3i"], "\x1c" => [94, "\xd3o"], "\x1d" => [76, "\xd3o"], "\x1e" => [104, "\xd3o"], "\x1f" => [16, "\xd3o"], " " => [94, "\xd3s"], "!" => [76, "\xd3s"], "\"" => [104, "\xd3s"], "#" => [16, "\xd3s"], "\$" => [94, "\xd3t"], "%" => [76, "\xd3t"], "&" => [104, "\xd3t"], "'" => [16, "\xd3t"], "(" => [77, "\xd3 "], ")" => [18, "\xd3 "], "*" => [77, "\xd3%"], "+" => [18, "\xd3%"], "," => [77, "\xd3-"], "-" => [18, "\xd3-"], "." => [77, "\xd3."], "/" => [18, "\xd3."], [77, "\xd3/"], [18, "\xd3/"], [77, "\xd33"], [18, "\xd33"], [77, "\xd34"], [18, "\xd34"], [77, "\xd35"], [18, "\xd35"], [77, "\xd36"], [18, "\xd36"], ":" => [77, "\xd37"], ";" => [18, "\xd37"], "<" => [77, "\xd38"], "=" => [18, "\xd38"], ">" => [77, "\xd39"], "?" => [18, "\xd39"], "@" => [77, "\xd3="], "A" => [18, "\xd3="], "B" => [77, "\xd3A"], "C" => [18, "\xd3A"], "D" => [77, "\xd3_"], "E" => [18, "\xd3_"], "F" => [77, "\xd3b"], "G" => [18, "\xd3b"], "H" => [77, "\xd3d"], "I" => [18, "\xd3d"], "J" => [77, "\xd3f"], "K" => [18, "\xd3f"], "L" => [77, "\xd3g"], "M" => [18, "\xd3g"], "N" => [77, "\xd3h"], "O" => [18, "\xd3h"], "P" => [77, "\xd3l"], "Q" => [18, "\xd3l"], "R" => [77, "\xd3m"], "S" => [18, "\xd3m"], "T" => [77, "\xd3n"], "U" => [18, "\xd3n"], "V" => [77, "\xd3p"], "W" => [18, "\xd3p"], "X" => [77, "\xd3r"], "Y" => [18, "\xd3r"], "Z" => [77, "\xd3u"], "[" => [18, "\xd3u"], "\\" => [0, "\xd3:"], "]" => [0, "\xd3B"], "^" => [0, "\xd3C"], "_" => [0, "\xd3D"], "`" => [0, "\xd3E"], "a" => [0, "\xd3F"], "b" => [0, "\xd3G"], "c" => [0, "\xd3H"], "d" => [0, "\xd3I"], "e" => [0, "\xd3J"], "f" => [0, "\xd3K"], "g" => [0, "\xd3L"], "h" => [0, "\xd3M"], "i" => [0, "\xd3N"], "j" => [0, "\xd3O"], "k" => [0, "\xd3P"], "l" => [0, "\xd3Q"], "m" => [0, "\xd3R"], "n" => [0, "\xd3S"], "o" => [0, "\xd3T"], "p" => [0, "\xd3U"], "q" => [0, "\xd3V"], "r" => [0, "\xd3W"], "s" => [0, "\xd3Y"], "t" => [0, "\xd3j"], "u" => [0, "\xd3k"], "v" => [0, "\xd3q"], "w" => [0, "\xd3v"], "x" => [0, "\xd3w"], "y" => [0, "\xd3x"], "z" => [0, "\xd3y"], "{" => [0, "\xd3z"], "|" => [82, "\xd3"], "}" => [87, "\xd3"], "~" => [130, "\xd3"], "" => [9, "\xd3"], "\x80" => [94, "\xd40"], "\x81" => [76, "\xd40"], "\x82" => [104, "\xd40"], "\x83" => [16, "\xd40"], "\x84" => [94, "\xd41"], "\x85" => [76, "\xd41"], "\x86" => [104, "\xd41"], "\x87" => [16, "\xd41"], "\x88" => [94, "\xd42"], "\x89" => [76, "\xd42"], "\x8a" => [104, "\xd42"], "\x8b" => [16, "\xd42"], "\x8c" => [94, "\xd4a"], "\x8d" => [76, "\xd4a"], "\x8e" => [104, "\xd4a"], "\x8f" => [16, "\xd4a"], "\x90" => [94, "\xd4c"], "\x91" => [76, "\xd4c"], "\x92" => [104, "\xd4c"], "\x93" => [16, "\xd4c"], "\x94" => [94, "\xd4e"], "\x95" => [76, "\xd4e"], "\x96" => [104, "\xd4e"], "\x97" => [16, "\xd4e"], "\x98" => [94, "\xd4i"], "\x99" => [76, "\xd4i"], "\x9a" => [104, "\xd4i"], "\x9b" => [16, "\xd4i"], "\x9c" => [94, "\xd4o"], "\x9d" => [76, "\xd4o"], "\x9e" => [104, "\xd4o"], "\x9f" => [16, "\xd4o"], "\xa0" => [94, "\xd4s"], "\xa1" => [76, "\xd4s"], "\xa2" => [104, "\xd4s"], "\xa3" => [16, "\xd4s"], "\xa4" => [94, "\xd4t"], "\xa5" => [76, "\xd4t"], "\xa6" => [104, "\xd4t"], "\xa7" => [16, "\xd4t"], "\xa8" => [77, "\xd4 "], "\xa9" => [18, "\xd4 "], "\xaa" => [77, "\xd4%"], "\xab" => [18, "\xd4%"], "\xac" => [77, "\xd4-"], "\xad" => [18, "\xd4-"], "\xae" => [77, "\xd4."], "\xaf" => [18, "\xd4."], "\xb0" => [77, "\xd4/"], "\xb1" => [18, "\xd4/"], "\xb2" => [77, "\xd43"], "\xb3" => [18, "\xd43"], "\xb4" => [77, "\xd44"], "\xb5" => [18, "\xd44"], "\xb6" => [77, "\xd45"], "\xb7" => [18, "\xd45"], "\xb8" => [77, "\xd46"], "\xb9" => [18, "\xd46"], "\xba" => [77, "\xd47"], "\xbb" => [18, "\xd47"], "\xbc" => [77, "\xd48"], "\xbd" => [18, "\xd48"], "\xbe" => [77, "\xd49"], "\xbf" => [18, "\xd49"], "\xc0" => [77, "\xd4="], "\xc1" => [18, "\xd4="], "\xc2" => [77, "\xd4A"], "\xc3" => [18, "\xd4A"], "\xc4" => [77, "\xd4_"], "\xc5" => [18, "\xd4_"], "\xc6" => [77, "\xd4b"], "\xc7" => [18, "\xd4b"], "\xc8" => [77, "\xd4d"], "\xc9" => [18, "\xd4d"], "\xca" => [77, "\xd4f"], "\xcb" => [18, "\xd4f"], "\xcc" => [77, "\xd4g"], "\xcd" => [18, "\xd4g"], "\xce" => [77, "\xd4h"], "\xcf" => [18, "\xd4h"], "\xd0" => [77, "\xd4l"], "\xd1" => [18, "\xd4l"], "\xd2" => [77, "\xd4m"], "\xd3" => [18, "\xd4m"], "\xd4" => [77, "\xd4n"], "\xd5" => [18, "\xd4n"], "\xd6" => [77, "\xd4p"], "\xd7" => [18, "\xd4p"], "\xd8" => [77, "\xd4r"], "\xd9" => [18, "\xd4r"], "\xda" => [77, "\xd4u"], "\xdb" => [18, "\xd4u"], "\xdc" => [0, "\xd4:"], "\xdd" => [0, "\xd4B"], "\xde" => [0, "\xd4C"], "\xdf" => [0, "\xd4D"], "\xe0" => [0, "\xd4E"], "\xe1" => [0, "\xd4F"], "\xe2" => [0, "\xd4G"], "\xe3" => [0, "\xd4H"], "\xe4" => [0, "\xd4I"], "\xe5" => [0, "\xd4J"], "\xe6" => [0, "\xd4K"], "\xe7" => [0, "\xd4L"], "\xe8" => [0, "\xd4M"], "\xe9" => [0, "\xd4N"], "\xea" => [0, "\xd4O"], "\xeb" => [0, "\xd4P"], "\xec" => [0, "\xd4Q"], "\xed" => [0, "\xd4R"], "\xee" => [0, "\xd4S"], "\xef" => [0, "\xd4T"], "\xf0" => [0, "\xd4U"], "\xf1" => [0, "\xd4V"], "\xf2" => [0, "\xd4W"], "\xf3" => [0, "\xd4Y"], "\xf4" => [0, "\xd4j"], "\xf5" => [0, "\xd4k"], "\xf6" => [0, "\xd4q"], "\xf7" => [0, "\xd4v"], "\xf8" => [0, "\xd4w"], "\xf9" => [0, "\xd4x"], "\xfa" => [0, "\xd4y"], "\xfb" => [0, "\xd4z"], "\xfc" => [82, "\xd4"], "\xfd" => [87, "\xd4"], "\xfe" => [130, "\xd4"], "\xff" => [9, "\xd4"]], ["\x00" => [77, "\xd30"], "\x01" => [18, "\xd30"], "\x02" => [77, "\xd31"], "\x03" => [18, "\xd31"], "\x04" => [77, "\xd32"], "\x05" => [18, "\xd32"], "\x06" => [77, "\xd3a"], "\x07" => [18, "\xd3a"], "\x08" => [77, "\xd3c"], "\t" => [18, "\xd3c"], "\n" => [77, "\xd3e"], "\v" => [18, "\xd3e"], "\f" => [77, "\xd3i"], "\r" => [18, "\xd3i"], "\x0e" => [77, "\xd3o"], "\x0f" => [18, "\xd3o"], "\x10" => [77, "\xd3s"], "\x11" => [18, "\xd3s"], "\x12" => [77, "\xd3t"], "\x13" => [18, "\xd3t"], "\x14" => [0, "\xd3 "], "\x15" => [0, "\xd3%"], "\x16" => [0, "\xd3-"], "\x17" => [0, "\xd3."], "\x18" => [0, "\xd3/"], "\x19" => [0, "\xd33"], "\x1a" => [0, "\xd34"], "\x1b" => [0, "\xd35"], "\x1c" => [0, "\xd36"], "\x1d" => [0, "\xd37"], "\x1e" => [0, "\xd38"], "\x1f" => [0, "\xd39"], " " => [0, "\xd3="], "!" => [0, "\xd3A"], "\"" => [0, "\xd3_"], "#" => [0, "\xd3b"], "\$" => [0, "\xd3d"], "%" => [0, "\xd3f"], "&" => [0, "\xd3g"], "'" => [0, "\xd3h"], "(" => [0, "\xd3l"], ")" => [0, "\xd3m"], "*" => [0, "\xd3n"], "+" => [0, "\xd3p"], "," => [0, "\xd3r"], "-" => [0, "\xd3u"], "." => [100, "\xd3"], "/" => [110, "\xd3"], [111, "\xd3"], [115, "\xd3"], [116, "\xd3"], [118, "\xd3"], [119, "\xd3"], [122, "\xd3"], [123, "\xd3"], [125, "\xd3"], [126, "\xd3"], [129, "\xd3"], ":" => [143, "\xd3"], ";" => [148, "\xd3"], "<" => [151, "\xd3"], "=" => [153, "\xd3"], ">" => [83, "\xd3"], "?" => [10, "\xd3"], "@" => [77, "\xd40"], "A" => [18, "\xd40"], "B" => [77, "\xd41"], "C" => [18, "\xd41"], "D" => [77, "\xd42"], "E" => [18, "\xd42"], "F" => [77, "\xd4a"], "G" => [18, "\xd4a"], "H" => [77, "\xd4c"], "I" => [18, "\xd4c"], "J" => [77, "\xd4e"], "K" => [18, "\xd4e"], "L" => [77, "\xd4i"], "M" => [18, "\xd4i"], "N" => [77, "\xd4o"], "O" => [18, "\xd4o"], "P" => [77, "\xd4s"], "Q" => [18, "\xd4s"], "R" => [77, "\xd4t"], "S" => [18, "\xd4t"], "T" => [0, "\xd4 "], "U" => [0, "\xd4%"], "V" => [0, "\xd4-"], "W" => [0, "\xd4."], "X" => [0, "\xd4/"], "Y" => [0, "\xd43"], "Z" => [0, "\xd44"], "[" => [0, "\xd45"], "\\" => [0, "\xd46"], "]" => [0, "\xd47"], "^" => [0, "\xd48"], "_" => [0, "\xd49"], "`" => [0, "\xd4="], "a" => [0, "\xd4A"], "b" => [0, "\xd4_"], "c" => [0, "\xd4b"], "d" => [0, "\xd4d"], "e" => [0, "\xd4f"], "f" => [0, "\xd4g"], "g" => [0, "\xd4h"], "h" => [0, "\xd4l"], "i" => [0, "\xd4m"], "j" => [0, "\xd4n"], "k" => [0, "\xd4p"], "l" => [0, "\xd4r"], "m" => [0, "\xd4u"], "n" => [100, "\xd4"], "o" => [110, "\xd4"], "p" => [111, "\xd4"], "q" => [115, "\xd4"], "r" => [116, "\xd4"], "s" => [118, "\xd4"], "t" => [119, "\xd4"], "u" => [122, "\xd4"], "v" => [123, "\xd4"], "w" => [125, "\xd4"], "x" => [126, "\xd4"], "y" => [129, "\xd4"], "z" => [143, "\xd4"], "{" => [148, "\xd4"], "|" => [151, "\xd4"], "}" => [153, "\xd4"], "~" => [83, "\xd4"], "" => [10, "\xd4"], "\x80" => [77, "\xd60"], "\x81" => [18, "\xd60"], "\x82" => [77, "\xd61"], "\x83" => [18, "\xd61"], "\x84" => [77, "\xd62"], "\x85" => [18, "\xd62"], "\x86" => [77, "\xd6a"], "\x87" => [18, "\xd6a"], "\x88" => [77, "\xd6c"], "\x89" => [18, "\xd6c"], "\x8a" => [77, "\xd6e"], "\x8b" => [18, "\xd6e"], "\x8c" => [77, "\xd6i"], "\x8d" => [18, "\xd6i"], "\x8e" => [77, "\xd6o"], "\x8f" => [18, "\xd6o"], "\x90" => [77, "\xd6s"], "\x91" => [18, "\xd6s"], "\x92" => [77, "\xd6t"], "\x93" => [18, "\xd6t"], "\x94" => [0, "\xd6 "], "\x95" => [0, "\xd6%"], "\x96" => [0, "\xd6-"], "\x97" => [0, "\xd6."], "\x98" => [0, "\xd6/"], "\x99" => [0, "\xd63"], "\x9a" => [0, "\xd64"], "\x9b" => [0, "\xd65"], "\x9c" => [0, "\xd66"], "\x9d" => [0, "\xd67"], "\x9e" => [0, "\xd68"], "\x9f" => [0, "\xd69"], "\xa0" => [0, "\xd6="], "\xa1" => [0, "\xd6A"], "\xa2" => [0, "\xd6_"], "\xa3" => [0, "\xd6b"], "\xa4" => [0, "\xd6d"], "\xa5" => [0, "\xd6f"], "\xa6" => [0, "\xd6g"], "\xa7" => [0, "\xd6h"], "\xa8" => [0, "\xd6l"], "\xa9" => [0, "\xd6m"], "\xaa" => [0, "\xd6n"], "\xab" => [0, "\xd6p"], "\xac" => [0, "\xd6r"], "\xad" => [0, "\xd6u"], "\xae" => [100, "\xd6"], "\xaf" => [110, "\xd6"], "\xb0" => [111, "\xd6"], "\xb1" => [115, "\xd6"], "\xb2" => [116, "\xd6"], "\xb3" => [118, "\xd6"], "\xb4" => [119, "\xd6"], "\xb5" => [122, "\xd6"], "\xb6" => [123, "\xd6"], "\xb7" => [125, "\xd6"], "\xb8" => [126, "\xd6"], "\xb9" => [129, "\xd6"], "\xba" => [143, "\xd6"], "\xbb" => [148, "\xd6"], "\xbc" => [151, "\xd6"], "\xbd" => [153, "\xd6"], "\xbe" => [83, "\xd6"], "\xbf" => [10, "\xd6"], "\xc0" => [77, "\xdd0"], "\xc1" => [18, "\xdd0"], "\xc2" => [77, "\xdd1"], "\xc3" => [18, "\xdd1"], "\xc4" => [77, "\xdd2"], "\xc5" => [18, "\xdd2"], "\xc6" => [77, "\xdda"], "\xc7" => [18, "\xdda"], "\xc8" => [77, "\xddc"], "\xc9" => [18, "\xddc"], "\xca" => [77, "\xdde"], "\xcb" => [18, "\xdde"], "\xcc" => [77, "\xddi"], "\xcd" => [18, "\xddi"], "\xce" => [77, "\xddo"], "\xcf" => [18, "\xddo"], "\xd0" => [77, "\xdds"], "\xd1" => [18, "\xdds"], "\xd2" => [77, "\xddt"], "\xd3" => [18, "\xddt"], "\xd4" => [0, "\xdd "], "\xd5" => [0, "\xdd%"], "\xd6" => [0, "\xdd-"], "\xd7" => [0, "\xdd."], "\xd8" => [0, "\xdd/"], "\xd9" => [0, "\xdd3"], "\xda" => [0, "\xdd4"], "\xdb" => [0, "\xdd5"], "\xdc" => [0, "\xdd6"], "\xdd" => [0, "\xdd7"], "\xde" => [0, "\xdd8"], "\xdf" => [0, "\xdd9"], "\xe0" => [0, "\xdd="], "\xe1" => [0, "\xddA"], "\xe2" => [0, "\xdd_"], "\xe3" => [0, "\xddb"], "\xe4" => [0, "\xddd"], "\xe5" => [0, "\xddf"], "\xe6" => [0, "\xddg"], "\xe7" => [0, "\xddh"], "\xe8" => [0, "\xddl"], "\xe9" => [0, "\xddm"], "\xea" => [0, "\xddn"], "\xeb" => [0, "\xddp"], "\xec" => [0, "\xddr"], "\xed" => [0, "\xddu"], "\xee" => [100, "\xdd"], "\xef" => [110, "\xdd"], "\xf0" => [111, "\xdd"], "\xf1" => [115, "\xdd"], "\xf2" => [116, "\xdd"], "\xf3" => [118, "\xdd"], "\xf4" => [119, "\xdd"], "\xf5" => [122, "\xdd"], "\xf6" => [123, "\xdd"], "\xf7" => [125, "\xdd"], "\xf8" => [126, "\xdd"], "\xf9" => [129, "\xdd"], "\xfa" => [143, "\xdd"], "\xfb" => [148, "\xdd"], "\xfc" => [151, "\xdd"], "\xfd" => [153, "\xdd"], "\xfe" => [83, "\xdd"], "\xff" => [10, "\xdd"]], ["\x00" => [94, "\xd60"], "\x01" => [76, "\xd60"], "\x02" => [104, "\xd60"], "\x03" => [16, "\xd60"], "\x04" => [94, "\xd61"], "\x05" => [76, "\xd61"], "\x06" => [104, "\xd61"], "\x07" => [16, "\xd61"], "\x08" => [94, "\xd62"], "\t" => [76, "\xd62"], "\n" => [104, "\xd62"], "\v" => [16, "\xd62"], "\f" => [94, "\xd6a"], "\r" => [76, "\xd6a"], "\x0e" => [104, "\xd6a"], "\x0f" => [16, "\xd6a"], "\x10" => [94, "\xd6c"], "\x11" => [76, "\xd6c"], "\x12" => [104, "\xd6c"], "\x13" => [16, "\xd6c"], "\x14" => [94, "\xd6e"], "\x15" => [76, "\xd6e"], "\x16" => [104, "\xd6e"], "\x17" => [16, "\xd6e"], "\x18" => [94, "\xd6i"], "\x19" => [76, "\xd6i"], "\x1a" => [104, "\xd6i"], "\x1b" => [16, "\xd6i"], "\x1c" => [94, "\xd6o"], "\x1d" => [76, "\xd6o"], "\x1e" => [104, "\xd6o"], "\x1f" => [16, "\xd6o"], " " => [94, "\xd6s"], "!" => [76, "\xd6s"], "\"" => [104, "\xd6s"], "#" => [16, "\xd6s"], "\$" => [94, "\xd6t"], "%" => [76, "\xd6t"], "&" => [104, "\xd6t"], "'" => [16, "\xd6t"], "(" => [77, "\xd6 "], ")" => [18, "\xd6 "], "*" => [77, "\xd6%"], "+" => [18, "\xd6%"], "," => [77, "\xd6-"], "-" => [18, "\xd6-"], "." => [77, "\xd6."], "/" => [18, "\xd6."], [77, "\xd6/"], [18, "\xd6/"], [77, "\xd63"], [18, "\xd63"], [77, "\xd64"], [18, "\xd64"], [77, "\xd65"], [18, "\xd65"], [77, "\xd66"], [18, "\xd66"], ":" => [77, "\xd67"], ";" => [18, "\xd67"], "<" => [77, "\xd68"], "=" => [18, "\xd68"], ">" => [77, "\xd69"], "?" => [18, "\xd69"], "@" => [77, "\xd6="], "A" => [18, "\xd6="], "B" => [77, "\xd6A"], "C" => [18, "\xd6A"], "D" => [77, "\xd6_"], "E" => [18, "\xd6_"], "F" => [77, "\xd6b"], "G" => [18, "\xd6b"], "H" => [77, "\xd6d"], "I" => [18, "\xd6d"], "J" => [77, "\xd6f"], "K" => [18, "\xd6f"], "L" => [77, "\xd6g"], "M" => [18, "\xd6g"], "N" => [77, "\xd6h"], "O" => [18, "\xd6h"], "P" => [77, "\xd6l"], "Q" => [18, "\xd6l"], "R" => [77, "\xd6m"], "S" => [18, "\xd6m"], "T" => [77, "\xd6n"], "U" => [18, "\xd6n"], "V" => [77, "\xd6p"], "W" => [18, "\xd6p"], "X" => [77, "\xd6r"], "Y" => [18, "\xd6r"], "Z" => [77, "\xd6u"], "[" => [18, "\xd6u"], "\\" => [0, "\xd6:"], "]" => [0, "\xd6B"], "^" => [0, "\xd6C"], "_" => [0, "\xd6D"], "`" => [0, "\xd6E"], "a" => [0, "\xd6F"], "b" => [0, "\xd6G"], "c" => [0, "\xd6H"], "d" => [0, "\xd6I"], "e" => [0, "\xd6J"], "f" => [0, "\xd6K"], "g" => [0, "\xd6L"], "h" => [0, "\xd6M"], "i" => [0, "\xd6N"], "j" => [0, "\xd6O"], "k" => [0, "\xd6P"], "l" => [0, "\xd6Q"], "m" => [0, "\xd6R"], "n" => [0, "\xd6S"], "o" => [0, "\xd6T"], "p" => [0, "\xd6U"], "q" => [0, "\xd6V"], "r" => [0, "\xd6W"], "s" => [0, "\xd6Y"], "t" => [0, "\xd6j"], "u" => [0, "\xd6k"], "v" => [0, "\xd6q"], "w" => [0, "\xd6v"], "x" => [0, "\xd6w"], "y" => [0, "\xd6x"], "z" => [0, "\xd6y"], "{" => [0, "\xd6z"], "|" => [82, "\xd6"], "}" => [87, "\xd6"], "~" => [130, "\xd6"], "" => [9, "\xd6"], "\x80" => [94, "\xdd0"], "\x81" => [76, "\xdd0"], "\x82" => [104, "\xdd0"], "\x83" => [16, "\xdd0"], "\x84" => [94, "\xdd1"], "\x85" => [76, "\xdd1"], "\x86" => [104, "\xdd1"], "\x87" => [16, "\xdd1"], "\x88" => [94, "\xdd2"], "\x89" => [76, "\xdd2"], "\x8a" => [104, "\xdd2"], "\x8b" => [16, "\xdd2"], "\x8c" => [94, "\xdda"], "\x8d" => [76, "\xdda"], "\x8e" => [104, "\xdda"], "\x8f" => [16, "\xdda"], "\x90" => [94, "\xddc"], "\x91" => [76, "\xddc"], "\x92" => [104, "\xddc"], "\x93" => [16, "\xddc"], "\x94" => [94, "\xdde"], "\x95" => [76, "\xdde"], "\x96" => [104, "\xdde"], "\x97" => [16, "\xdde"], "\x98" => [94, "\xddi"], "\x99" => [76, "\xddi"], "\x9a" => [104, "\xddi"], "\x9b" => [16, "\xddi"], "\x9c" => [94, "\xddo"], "\x9d" => [76, "\xddo"], "\x9e" => [104, "\xddo"], "\x9f" => [16, "\xddo"], "\xa0" => [94, "\xdds"], "\xa1" => [76, "\xdds"], "\xa2" => [104, "\xdds"], "\xa3" => [16, "\xdds"], "\xa4" => [94, "\xddt"], "\xa5" => [76, "\xddt"], "\xa6" => [104, "\xddt"], "\xa7" => [16, "\xddt"], "\xa8" => [77, "\xdd "], "\xa9" => [18, "\xdd "], "\xaa" => [77, "\xdd%"], "\xab" => [18, "\xdd%"], "\xac" => [77, "\xdd-"], "\xad" => [18, "\xdd-"], "\xae" => [77, "\xdd."], "\xaf" => [18, "\xdd."], "\xb0" => [77, "\xdd/"], "\xb1" => [18, "\xdd/"], "\xb2" => [77, "\xdd3"], "\xb3" => [18, "\xdd3"], "\xb4" => [77, "\xdd4"], "\xb5" => [18, "\xdd4"], "\xb6" => [77, "\xdd5"], "\xb7" => [18, "\xdd5"], "\xb8" => [77, "\xdd6"], "\xb9" => [18, "\xdd6"], "\xba" => [77, "\xdd7"], "\xbb" => [18, "\xdd7"], "\xbc" => [77, "\xdd8"], "\xbd" => [18, "\xdd8"], "\xbe" => [77, "\xdd9"], "\xbf" => [18, "\xdd9"], "\xc0" => [77, "\xdd="], "\xc1" => [18, "\xdd="], "\xc2" => [77, "\xddA"], "\xc3" => [18, "\xddA"], "\xc4" => [77, "\xdd_"], "\xc5" => [18, "\xdd_"], "\xc6" => [77, "\xddb"], "\xc7" => [18, "\xddb"], "\xc8" => [77, "\xddd"], "\xc9" => [18, "\xddd"], "\xca" => [77, "\xddf"], "\xcb" => [18, "\xddf"], "\xcc" => [77, "\xddg"], "\xcd" => [18, "\xddg"], "\xce" => [77, "\xddh"], "\xcf" => [18, "\xddh"], "\xd0" => [77, "\xddl"], "\xd1" => [18, "\xddl"], "\xd2" => [77, "\xddm"], "\xd3" => [18, "\xddm"], "\xd4" => [77, "\xddn"], "\xd5" => [18, "\xddn"], "\xd6" => [77, "\xddp"], "\xd7" => [18, "\xddp"], "\xd8" => [77, "\xddr"], "\xd9" => [18, "\xddr"], "\xda" => [77, "\xddu"], "\xdb" => [18, "\xddu"], "\xdc" => [0, "\xdd:"], "\xdd" => [0, "\xddB"], "\xde" => [0, "\xddC"], "\xdf" => [0, "\xddD"], "\xe0" => [0, "\xddE"], "\xe1" => [0, "\xddF"], "\xe2" => [0, "\xddG"], "\xe3" => [0, "\xddH"], "\xe4" => [0, "\xddI"], "\xe5" => [0, "\xddJ"], "\xe6" => [0, "\xddK"], "\xe7" => [0, "\xddL"], "\xe8" => [0, "\xddM"], "\xe9" => [0, "\xddN"], "\xea" => [0, "\xddO"], "\xeb" => [0, "\xddP"], "\xec" => [0, "\xddQ"], "\xed" => [0, "\xddR"], "\xee" => [0, "\xddS"], "\xef" => [0, "\xddT"], "\xf0" => [0, "\xddU"], "\xf1" => [0, "\xddV"], "\xf2" => [0, "\xddW"], "\xf3" => [0, "\xddY"], "\xf4" => [0, "\xddj"], "\xf5" => [0, "\xddk"], "\xf6" => [0, "\xddq"], "\xf7" => [0, "\xddv"], "\xf8" => [0, "\xddw"], "\xf9" => [0, "\xddx"], "\xfa" => [0, "\xddy"], "\xfb" => [0, "\xddz"], "\xfc" => [82, "\xdd"], "\xfd" => [87, "\xdd"], "\xfe" => [130, "\xdd"], "\xff" => [9, "\xdd"]], ["\x00" => [94, "\xd70"], "\x01" => [76, "\xd70"], "\x02" => [104, "\xd70"], "\x03" => [16, "\xd70"], "\x04" => [94, "\xd71"], "\x05" => [76, "\xd71"], "\x06" => [104, "\xd71"], "\x07" => [16, "\xd71"], "\x08" => [94, "\xd72"], "\t" => [76, "\xd72"], "\n" => [104, "\xd72"], "\v" => [16, "\xd72"], "\f" => [94, "\xd7a"], "\r" => [76, "\xd7a"], "\x0e" => [104, "\xd7a"], "\x0f" => [16, "\xd7a"], "\x10" => [94, "\xd7c"], "\x11" => [76, "\xd7c"], "\x12" => [104, "\xd7c"], "\x13" => [16, "\xd7c"], "\x14" => [94, "\xd7e"], "\x15" => [76, "\xd7e"], "\x16" => [104, "\xd7e"], "\x17" => [16, "\xd7e"], "\x18" => [94, "\xd7i"], "\x19" => [76, "\xd7i"], "\x1a" => [104, "\xd7i"], "\x1b" => [16, "\xd7i"], "\x1c" => [94, "\xd7o"], "\x1d" => [76, "\xd7o"], "\x1e" => [104, "\xd7o"], "\x1f" => [16, "\xd7o"], " " => [94, "\xd7s"], "!" => [76, "\xd7s"], "\"" => [104, "\xd7s"], "#" => [16, "\xd7s"], "\$" => [94, "\xd7t"], "%" => [76, "\xd7t"], "&" => [104, "\xd7t"], "'" => [16, "\xd7t"], "(" => [77, "\xd7 "], ")" => [18, "\xd7 "], "*" => [77, "\xd7%"], "+" => [18, "\xd7%"], "," => [77, "\xd7-"], "-" => [18, "\xd7-"], "." => [77, "\xd7."], "/" => [18, "\xd7."], [77, "\xd7/"], [18, "\xd7/"], [77, "\xd73"], [18, "\xd73"], [77, "\xd74"], [18, "\xd74"], [77, "\xd75"], [18, "\xd75"], [77, "\xd76"], [18, "\xd76"], ":" => [77, "\xd77"], ";" => [18, "\xd77"], "<" => [77, "\xd78"], "=" => [18, "\xd78"], ">" => [77, "\xd79"], "?" => [18, "\xd79"], "@" => [77, "\xd7="], "A" => [18, "\xd7="], "B" => [77, "\xd7A"], "C" => [18, "\xd7A"], "D" => [77, "\xd7_"], "E" => [18, "\xd7_"], "F" => [77, "\xd7b"], "G" => [18, "\xd7b"], "H" => [77, "\xd7d"], "I" => [18, "\xd7d"], "J" => [77, "\xd7f"], "K" => [18, "\xd7f"], "L" => [77, "\xd7g"], "M" => [18, "\xd7g"], "N" => [77, "\xd7h"], "O" => [18, "\xd7h"], "P" => [77, "\xd7l"], "Q" => [18, "\xd7l"], "R" => [77, "\xd7m"], "S" => [18, "\xd7m"], "T" => [77, "\xd7n"], "U" => [18, "\xd7n"], "V" => [77, "\xd7p"], "W" => [18, "\xd7p"], "X" => [77, "\xd7r"], "Y" => [18, "\xd7r"], "Z" => [77, "\xd7u"], "[" => [18, "\xd7u"], "\\" => [0, "\xd7:"], "]" => [0, "\xd7B"], "^" => [0, "\xd7C"], "_" => [0, "\xd7D"], "`" => [0, "\xd7E"], "a" => [0, "\xd7F"], "b" => [0, "\xd7G"], "c" => [0, "\xd7H"], "d" => [0, "\xd7I"], "e" => [0, "\xd7J"], "f" => [0, "\xd7K"], "g" => [0, "\xd7L"], "h" => [0, "\xd7M"], "i" => [0, "\xd7N"], "j" => [0, "\xd7O"], "k" => [0, "\xd7P"], "l" => [0, "\xd7Q"], "m" => [0, "\xd7R"], "n" => [0, "\xd7S"], "o" => [0, "\xd7T"], "p" => [0, "\xd7U"], "q" => [0, "\xd7V"], "r" => [0, "\xd7W"], "s" => [0, "\xd7Y"], "t" => [0, "\xd7j"], "u" => [0, "\xd7k"], "v" => [0, "\xd7q"], "w" => [0, "\xd7v"], "x" => [0, "\xd7w"], "y" => [0, "\xd7x"], "z" => [0, "\xd7y"], "{" => [0, "\xd7z"], "|" => [82, "\xd7"], "}" => [87, "\xd7"], "~" => [130, "\xd7"], "" => [9, "\xd7"], "\x80" => [94, "\xe10"], "\x81" => [76, "\xe10"], "\x82" => [104, "\xe10"], "\x83" => [16, "\xe10"], "\x84" => [94, "\xe11"], "\x85" => [76, "\xe11"], "\x86" => [104, "\xe11"], "\x87" => [16, "\xe11"], "\x88" => [94, "\xe12"], "\x89" => [76, "\xe12"], "\x8a" => [104, "\xe12"], "\x8b" => [16, "\xe12"], "\x8c" => [94, "\xe1a"], "\x8d" => [76, "\xe1a"], "\x8e" => [104, "\xe1a"], "\x8f" => [16, "\xe1a"], "\x90" => [94, "\xe1c"], "\x91" => [76, "\xe1c"], "\x92" => [104, "\xe1c"], "\x93" => [16, "\xe1c"], "\x94" => [94, "\xe1e"], "\x95" => [76, "\xe1e"], "\x96" => [104, "\xe1e"], "\x97" => [16, "\xe1e"], "\x98" => [94, "\xe1i"], "\x99" => [76, "\xe1i"], "\x9a" => [104, "\xe1i"], "\x9b" => [16, "\xe1i"], "\x9c" => [94, "\xe1o"], "\x9d" => [76, "\xe1o"], "\x9e" => [104, "\xe1o"], "\x9f" => [16, "\xe1o"], "\xa0" => [94, "\xe1s"], "\xa1" => [76, "\xe1s"], "\xa2" => [104, "\xe1s"], "\xa3" => [16, "\xe1s"], "\xa4" => [94, "\xe1t"], "\xa5" => [76, "\xe1t"], "\xa6" => [104, "\xe1t"], "\xa7" => [16, "\xe1t"], "\xa8" => [77, "\xe1 "], "\xa9" => [18, "\xe1 "], "\xaa" => [77, "\xe1%"], "\xab" => [18, "\xe1%"], "\xac" => [77, "\xe1-"], "\xad" => [18, "\xe1-"], "\xae" => [77, "\xe1."], "\xaf" => [18, "\xe1."], "\xb0" => [77, "\xe1/"], "\xb1" => [18, "\xe1/"], "\xb2" => [77, "\xe13"], "\xb3" => [18, "\xe13"], "\xb4" => [77, "\xe14"], "\xb5" => [18, "\xe14"], "\xb6" => [77, "\xe15"], "\xb7" => [18, "\xe15"], "\xb8" => [77, "\xe16"], "\xb9" => [18, "\xe16"], "\xba" => [77, "\xe17"], "\xbb" => [18, "\xe17"], "\xbc" => [77, "\xe18"], "\xbd" => [18, "\xe18"], "\xbe" => [77, "\xe19"], "\xbf" => [18, "\xe19"], "\xc0" => [77, "\xe1="], "\xc1" => [18, "\xe1="], "\xc2" => [77, "\xe1A"], "\xc3" => [18, "\xe1A"], "\xc4" => [77, "\xe1_"], "\xc5" => [18, "\xe1_"], "\xc6" => [77, "\xe1b"], "\xc7" => [18, "\xe1b"], "\xc8" => [77, "\xe1d"], "\xc9" => [18, "\xe1d"], "\xca" => [77, "\xe1f"], "\xcb" => [18, "\xe1f"], "\xcc" => [77, "\xe1g"], "\xcd" => [18, "\xe1g"], "\xce" => [77, "\xe1h"], "\xcf" => [18, "\xe1h"], "\xd0" => [77, "\xe1l"], "\xd1" => [18, "\xe1l"], "\xd2" => [77, "\xe1m"], "\xd3" => [18, "\xe1m"], "\xd4" => [77, "\xe1n"], "\xd5" => [18, "\xe1n"], "\xd6" => [77, "\xe1p"], "\xd7" => [18, "\xe1p"], "\xd8" => [77, "\xe1r"], "\xd9" => [18, "\xe1r"], "\xda" => [77, "\xe1u"], "\xdb" => [18, "\xe1u"], "\xdc" => [0, "\xe1:"], "\xdd" => [0, "\xe1B"], "\xde" => [0, "\xe1C"], "\xdf" => [0, "\xe1D"], "\xe0" => [0, "\xe1E"], "\xe1" => [0, "\xe1F"], "\xe2" => [0, "\xe1G"], "\xe3" => [0, "\xe1H"], "\xe4" => [0, "\xe1I"], "\xe5" => [0, "\xe1J"], "\xe6" => [0, "\xe1K"], "\xe7" => [0, "\xe1L"], "\xe8" => [0, "\xe1M"], "\xe9" => [0, "\xe1N"], "\xea" => [0, "\xe1O"], "\xeb" => [0, "\xe1P"], "\xec" => [0, "\xe1Q"], "\xed" => [0, "\xe1R"], "\xee" => [0, "\xe1S"], "\xef" => [0, "\xe1T"], "\xf0" => [0, "\xe1U"], "\xf1" => [0, "\xe1V"], "\xf2" => [0, "\xe1W"], "\xf3" => [0, "\xe1Y"], "\xf4" => [0, "\xe1j"], "\xf5" => [0, "\xe1k"], "\xf6" => [0, "\xe1q"], "\xf7" => [0, "\xe1v"], "\xf8" => [0, "\xe1w"], "\xf9" => [0, "\xe1x"], "\xfa" => [0, "\xe1y"], "\xfb" => [0, "\xe1z"], "\xfc" => [82, "\xe1"], "\xfd" => [87, "\xe1"], "\xfe" => [130, "\xe1"], "\xff" => [9, "\xe1"]], ["\x00" => [94, "\xd80"], "\x01" => [76, "\xd80"], "\x02" => [104, "\xd80"], "\x03" => [16, "\xd80"], "\x04" => [94, "\xd81"], "\x05" => [76, "\xd81"], "\x06" => [104, "\xd81"], "\x07" => [16, "\xd81"], "\x08" => [94, "\xd82"], "\t" => [76, "\xd82"], "\n" => [104, "\xd82"], "\v" => [16, "\xd82"], "\f" => [94, "\xd8a"], "\r" => [76, "\xd8a"], "\x0e" => [104, "\xd8a"], "\x0f" => [16, "\xd8a"], "\x10" => [94, "\xd8c"], "\x11" => [76, "\xd8c"], "\x12" => [104, "\xd8c"], "\x13" => [16, "\xd8c"], "\x14" => [94, "\xd8e"], "\x15" => [76, "\xd8e"], "\x16" => [104, "\xd8e"], "\x17" => [16, "\xd8e"], "\x18" => [94, "\xd8i"], "\x19" => [76, "\xd8i"], "\x1a" => [104, "\xd8i"], "\x1b" => [16, "\xd8i"], "\x1c" => [94, "\xd8o"], "\x1d" => [76, "\xd8o"], "\x1e" => [104, "\xd8o"], "\x1f" => [16, "\xd8o"], " " => [94, "\xd8s"], "!" => [76, "\xd8s"], "\"" => [104, "\xd8s"], "#" => [16, "\xd8s"], "\$" => [94, "\xd8t"], "%" => [76, "\xd8t"], "&" => [104, "\xd8t"], "'" => [16, "\xd8t"], "(" => [77, "\xd8 "], ")" => [18, "\xd8 "], "*" => [77, "\xd8%"], "+" => [18, "\xd8%"], "," => [77, "\xd8-"], "-" => [18, "\xd8-"], "." => [77, "\xd8."], "/" => [18, "\xd8."], [77, "\xd8/"], [18, "\xd8/"], [77, "\xd83"], [18, "\xd83"], [77, "\xd84"], [18, "\xd84"], [77, "\xd85"], [18, "\xd85"], [77, "\xd86"], [18, "\xd86"], ":" => [77, "\xd87"], ";" => [18, "\xd87"], "<" => [77, "\xd88"], "=" => [18, "\xd88"], ">" => [77, "\xd89"], "?" => [18, "\xd89"], "@" => [77, "\xd8="], "A" => [18, "\xd8="], "B" => [77, "\xd8A"], "C" => [18, "\xd8A"], "D" => [77, "\xd8_"], "E" => [18, "\xd8_"], "F" => [77, "\xd8b"], "G" => [18, "\xd8b"], "H" => [77, "\xd8d"], "I" => [18, "\xd8d"], "J" => [77, "\xd8f"], "K" => [18, "\xd8f"], "L" => [77, "\xd8g"], "M" => [18, "\xd8g"], "N" => [77, "\xd8h"], "O" => [18, "\xd8h"], "P" => [77, "\xd8l"], "Q" => [18, "\xd8l"], "R" => [77, "\xd8m"], "S" => [18, "\xd8m"], "T" => [77, "\xd8n"], "U" => [18, "\xd8n"], "V" => [77, "\xd8p"], "W" => [18, "\xd8p"], "X" => [77, "\xd8r"], "Y" => [18, "\xd8r"], "Z" => [77, "\xd8u"], "[" => [18, "\xd8u"], "\\" => [0, "\xd8:"], "]" => [0, "\xd8B"], "^" => [0, "\xd8C"], "_" => [0, "\xd8D"], "`" => [0, "\xd8E"], "a" => [0, "\xd8F"], "b" => [0, "\xd8G"], "c" => [0, "\xd8H"], "d" => [0, "\xd8I"], "e" => [0, "\xd8J"], "f" => [0, "\xd8K"], "g" => [0, "\xd8L"], "h" => [0, "\xd8M"], "i" => [0, "\xd8N"], "j" => [0, "\xd8O"], "k" => [0, "\xd8P"], "l" => [0, "\xd8Q"], "m" => [0, "\xd8R"], "n" => [0, "\xd8S"], "o" => [0, "\xd8T"], "p" => [0, "\xd8U"], "q" => [0, "\xd8V"], "r" => [0, "\xd8W"], "s" => [0, "\xd8Y"], "t" => [0, "\xd8j"], "u" => [0, "\xd8k"], "v" => [0, "\xd8q"], "w" => [0, "\xd8v"], "x" => [0, "\xd8w"], "y" => [0, "\xd8x"], "z" => [0, "\xd8y"], "{" => [0, "\xd8z"], "|" => [82, "\xd8"], "}" => [87, "\xd8"], "~" => [130, "\xd8"], "" => [9, "\xd8"], "\x80" => [94, "\xd90"], "\x81" => [76, "\xd90"], "\x82" => [104, "\xd90"], "\x83" => [16, "\xd90"], "\x84" => [94, "\xd91"], "\x85" => [76, "\xd91"], "\x86" => [104, "\xd91"], "\x87" => [16, "\xd91"], "\x88" => [94, "\xd92"], "\x89" => [76, "\xd92"], "\x8a" => [104, "\xd92"], "\x8b" => [16, "\xd92"], "\x8c" => [94, "\xd9a"], "\x8d" => [76, "\xd9a"], "\x8e" => [104, "\xd9a"], "\x8f" => [16, "\xd9a"], "\x90" => [94, "\xd9c"], "\x91" => [76, "\xd9c"], "\x92" => [104, "\xd9c"], "\x93" => [16, "\xd9c"], "\x94" => [94, "\xd9e"], "\x95" => [76, "\xd9e"], "\x96" => [104, "\xd9e"], "\x97" => [16, "\xd9e"], "\x98" => [94, "\xd9i"], "\x99" => [76, "\xd9i"], "\x9a" => [104, "\xd9i"], "\x9b" => [16, "\xd9i"], "\x9c" => [94, "\xd9o"], "\x9d" => [76, "\xd9o"], "\x9e" => [104, "\xd9o"], "\x9f" => [16, "\xd9o"], "\xa0" => [94, "\xd9s"], "\xa1" => [76, "\xd9s"], "\xa2" => [104, "\xd9s"], "\xa3" => [16, "\xd9s"], "\xa4" => [94, "\xd9t"], "\xa5" => [76, "\xd9t"], "\xa6" => [104, "\xd9t"], "\xa7" => [16, "\xd9t"], "\xa8" => [77, "\xd9 "], "\xa9" => [18, "\xd9 "], "\xaa" => [77, "\xd9%"], "\xab" => [18, "\xd9%"], "\xac" => [77, "\xd9-"], "\xad" => [18, "\xd9-"], "\xae" => [77, "\xd9."], "\xaf" => [18, "\xd9."], "\xb0" => [77, "\xd9/"], "\xb1" => [18, "\xd9/"], "\xb2" => [77, "\xd93"], "\xb3" => [18, "\xd93"], "\xb4" => [77, "\xd94"], "\xb5" => [18, "\xd94"], "\xb6" => [77, "\xd95"], "\xb7" => [18, "\xd95"], "\xb8" => [77, "\xd96"], "\xb9" => [18, "\xd96"], "\xba" => [77, "\xd97"], "\xbb" => [18, "\xd97"], "\xbc" => [77, "\xd98"], "\xbd" => [18, "\xd98"], "\xbe" => [77, "\xd99"], "\xbf" => [18, "\xd99"], "\xc0" => [77, "\xd9="], "\xc1" => [18, "\xd9="], "\xc2" => [77, "\xd9A"], "\xc3" => [18, "\xd9A"], "\xc4" => [77, "\xd9_"], "\xc5" => [18, "\xd9_"], "\xc6" => [77, "\xd9b"], "\xc7" => [18, "\xd9b"], "\xc8" => [77, "\xd9d"], "\xc9" => [18, "\xd9d"], "\xca" => [77, "\xd9f"], "\xcb" => [18, "\xd9f"], "\xcc" => [77, "\xd9g"], "\xcd" => [18, "\xd9g"], "\xce" => [77, "\xd9h"], "\xcf" => [18, "\xd9h"], "\xd0" => [77, "\xd9l"], "\xd1" => [18, "\xd9l"], "\xd2" => [77, "\xd9m"], "\xd3" => [18, "\xd9m"], "\xd4" => [77, "\xd9n"], "\xd5" => [18, "\xd9n"], "\xd6" => [77, "\xd9p"], "\xd7" => [18, "\xd9p"], "\xd8" => [77, "\xd9r"], "\xd9" => [18, "\xd9r"], "\xda" => [77, "\xd9u"], "\xdb" => [18, "\xd9u"], "\xdc" => [0, "\xd9:"], "\xdd" => [0, "\xd9B"], "\xde" => [0, "\xd9C"], "\xdf" => [0, "\xd9D"], "\xe0" => [0, "\xd9E"], "\xe1" => [0, "\xd9F"], "\xe2" => [0, "\xd9G"], "\xe3" => [0, "\xd9H"], "\xe4" => [0, "\xd9I"], "\xe5" => [0, "\xd9J"], "\xe6" => [0, "\xd9K"], "\xe7" => [0, "\xd9L"], "\xe8" => [0, "\xd9M"], "\xe9" => [0, "\xd9N"], "\xea" => [0, "\xd9O"], "\xeb" => [0, "\xd9P"], "\xec" => [0, "\xd9Q"], "\xed" => [0, "\xd9R"], "\xee" => [0, "\xd9S"], "\xef" => [0, "\xd9T"], "\xf0" => [0, "\xd9U"], "\xf1" => [0, "\xd9V"], "\xf2" => [0, "\xd9W"], "\xf3" => [0, "\xd9Y"], "\xf4" => [0, "\xd9j"], "\xf5" => [0, "\xd9k"], "\xf6" => [0, "\xd9q"], "\xf7" => [0, "\xd9v"], "\xf8" => [0, "\xd9w"], "\xf9" => [0, "\xd9x"], "\xfa" => [0, "\xd9y"], "\xfb" => [0, "\xd9z"], "\xfc" => [82, "\xd9"], "\xfd" => [87, "\xd9"], "\xfe" => [130, "\xd9"], "\xff" => [9, "\xd9"]], ["\x00" => [77, "\xd80"], "\x01" => [18, "\xd80"], "\x02" => [77, "\xd81"], "\x03" => [18, "\xd81"], "\x04" => [77, "\xd82"], "\x05" => [18, "\xd82"], "\x06" => [77, "\xd8a"], "\x07" => [18, "\xd8a"], "\x08" => [77, "\xd8c"], "\t" => [18, "\xd8c"], "\n" => [77, "\xd8e"], "\v" => [18, "\xd8e"], "\f" => [77, "\xd8i"], "\r" => [18, "\xd8i"], "\x0e" => [77, "\xd8o"], "\x0f" => [18, "\xd8o"], "\x10" => [77, "\xd8s"], "\x11" => [18, "\xd8s"], "\x12" => [77, "\xd8t"], "\x13" => [18, "\xd8t"], "\x14" => [0, "\xd8 "], "\x15" => [0, "\xd8%"], "\x16" => [0, "\xd8-"], "\x17" => [0, "\xd8."], "\x18" => [0, "\xd8/"], "\x19" => [0, "\xd83"], "\x1a" => [0, "\xd84"], "\x1b" => [0, "\xd85"], "\x1c" => [0, "\xd86"], "\x1d" => [0, "\xd87"], "\x1e" => [0, "\xd88"], "\x1f" => [0, "\xd89"], " " => [0, "\xd8="], "!" => [0, "\xd8A"], "\"" => [0, "\xd8_"], "#" => [0, "\xd8b"], "\$" => [0, "\xd8d"], "%" => [0, "\xd8f"], "&" => [0, "\xd8g"], "'" => [0, "\xd8h"], "(" => [0, "\xd8l"], ")" => [0, "\xd8m"], "*" => [0, "\xd8n"], "+" => [0, "\xd8p"], "," => [0, "\xd8r"], "-" => [0, "\xd8u"], "." => [100, "\xd8"], "/" => [110, "\xd8"], [111, "\xd8"], [115, "\xd8"], [116, "\xd8"], [118, "\xd8"], [119, "\xd8"], [122, "\xd8"], [123, "\xd8"], [125, "\xd8"], [126, "\xd8"], [129, "\xd8"], ":" => [143, "\xd8"], ";" => [148, "\xd8"], "<" => [151, "\xd8"], "=" => [153, "\xd8"], ">" => [83, "\xd8"], "?" => [10, "\xd8"], "@" => [77, "\xd90"], "A" => [18, "\xd90"], "B" => [77, "\xd91"], "C" => [18, "\xd91"], "D" => [77, "\xd92"], "E" => [18, "\xd92"], "F" => [77, "\xd9a"], "G" => [18, "\xd9a"], "H" => [77, "\xd9c"], "I" => [18, "\xd9c"], "J" => [77, "\xd9e"], "K" => [18, "\xd9e"], "L" => [77, "\xd9i"], "M" => [18, "\xd9i"], "N" => [77, "\xd9o"], "O" => [18, "\xd9o"], "P" => [77, "\xd9s"], "Q" => [18, "\xd9s"], "R" => [77, "\xd9t"], "S" => [18, "\xd9t"], "T" => [0, "\xd9 "], "U" => [0, "\xd9%"], "V" => [0, "\xd9-"], "W" => [0, "\xd9."], "X" => [0, "\xd9/"], "Y" => [0, "\xd93"], "Z" => [0, "\xd94"], "[" => [0, "\xd95"], "\\" => [0, "\xd96"], "]" => [0, "\xd97"], "^" => [0, "\xd98"], "_" => [0, "\xd99"], "`" => [0, "\xd9="], "a" => [0, "\xd9A"], "b" => [0, "\xd9_"], "c" => [0, "\xd9b"], "d" => [0, "\xd9d"], "e" => [0, "\xd9f"], "f" => [0, "\xd9g"], "g" => [0, "\xd9h"], "h" => [0, "\xd9l"], "i" => [0, "\xd9m"], "j" => [0, "\xd9n"], "k" => [0, "\xd9p"], "l" => [0, "\xd9r"], "m" => [0, "\xd9u"], "n" => [100, "\xd9"], "o" => [110, "\xd9"], "p" => [111, "\xd9"], "q" => [115, "\xd9"], "r" => [116, "\xd9"], "s" => [118, "\xd9"], "t" => [119, "\xd9"], "u" => [122, "\xd9"], "v" => [123, "\xd9"], "w" => [125, "\xd9"], "x" => [126, "\xd9"], "y" => [129, "\xd9"], "z" => [143, "\xd9"], "{" => [148, "\xd9"], "|" => [151, "\xd9"], "}" => [153, "\xd9"], "~" => [83, "\xd9"], "" => [10, "\xd9"], "\x80" => [77, "\xe30"], "\x81" => [18, "\xe30"], "\x82" => [77, "\xe31"], "\x83" => [18, "\xe31"], "\x84" => [77, "\xe32"], "\x85" => [18, "\xe32"], "\x86" => [77, "\xe3a"], "\x87" => [18, "\xe3a"], "\x88" => [77, "\xe3c"], "\x89" => [18, "\xe3c"], "\x8a" => [77, "\xe3e"], "\x8b" => [18, "\xe3e"], "\x8c" => [77, "\xe3i"], "\x8d" => [18, "\xe3i"], "\x8e" => [77, "\xe3o"], "\x8f" => [18, "\xe3o"], "\x90" => [77, "\xe3s"], "\x91" => [18, "\xe3s"], "\x92" => [77, "\xe3t"], "\x93" => [18, "\xe3t"], "\x94" => [0, "\xe3 "], "\x95" => [0, "\xe3%"], "\x96" => [0, "\xe3-"], "\x97" => [0, "\xe3."], "\x98" => [0, "\xe3/"], "\x99" => [0, "\xe33"], "\x9a" => [0, "\xe34"], "\x9b" => [0, "\xe35"], "\x9c" => [0, "\xe36"], "\x9d" => [0, "\xe37"], "\x9e" => [0, "\xe38"], "\x9f" => [0, "\xe39"], "\xa0" => [0, "\xe3="], "\xa1" => [0, "\xe3A"], "\xa2" => [0, "\xe3_"], "\xa3" => [0, "\xe3b"], "\xa4" => [0, "\xe3d"], "\xa5" => [0, "\xe3f"], "\xa6" => [0, "\xe3g"], "\xa7" => [0, "\xe3h"], "\xa8" => [0, "\xe3l"], "\xa9" => [0, "\xe3m"], "\xaa" => [0, "\xe3n"], "\xab" => [0, "\xe3p"], "\xac" => [0, "\xe3r"], "\xad" => [0, "\xe3u"], "\xae" => [100, "\xe3"], "\xaf" => [110, "\xe3"], "\xb0" => [111, "\xe3"], "\xb1" => [115, "\xe3"], "\xb2" => [116, "\xe3"], "\xb3" => [118, "\xe3"], "\xb4" => [119, "\xe3"], "\xb5" => [122, "\xe3"], "\xb6" => [123, "\xe3"], "\xb7" => [125, "\xe3"], "\xb8" => [126, "\xe3"], "\xb9" => [129, "\xe3"], "\xba" => [143, "\xe3"], "\xbb" => [148, "\xe3"], "\xbc" => [151, "\xe3"], "\xbd" => [153, "\xe3"], "\xbe" => [83, "\xe3"], "\xbf" => [10, "\xe3"], "\xc0" => [77, "\xe50"], "\xc1" => [18, "\xe50"], "\xc2" => [77, "\xe51"], "\xc3" => [18, "\xe51"], "\xc4" => [77, "\xe52"], "\xc5" => [18, "\xe52"], "\xc6" => [77, "\xe5a"], "\xc7" => [18, "\xe5a"], "\xc8" => [77, "\xe5c"], "\xc9" => [18, "\xe5c"], "\xca" => [77, "\xe5e"], "\xcb" => [18, "\xe5e"], "\xcc" => [77, "\xe5i"], "\xcd" => [18, "\xe5i"], "\xce" => [77, "\xe5o"], "\xcf" => [18, "\xe5o"], "\xd0" => [77, "\xe5s"], "\xd1" => [18, "\xe5s"], "\xd2" => [77, "\xe5t"], "\xd3" => [18, "\xe5t"], "\xd4" => [0, "\xe5 "], "\xd5" => [0, "\xe5%"], "\xd6" => [0, "\xe5-"], "\xd7" => [0, "\xe5."], "\xd8" => [0, "\xe5/"], "\xd9" => [0, "\xe53"], "\xda" => [0, "\xe54"], "\xdb" => [0, "\xe55"], "\xdc" => [0, "\xe56"], "\xdd" => [0, "\xe57"], "\xde" => [0, "\xe58"], "\xdf" => [0, "\xe59"], "\xe0" => [0, "\xe5="], "\xe1" => [0, "\xe5A"], "\xe2" => [0, "\xe5_"], "\xe3" => [0, "\xe5b"], "\xe4" => [0, "\xe5d"], "\xe5" => [0, "\xe5f"], "\xe6" => [0, "\xe5g"], "\xe7" => [0, "\xe5h"], "\xe8" => [0, "\xe5l"], "\xe9" => [0, "\xe5m"], "\xea" => [0, "\xe5n"], "\xeb" => [0, "\xe5p"], "\xec" => [0, "\xe5r"], "\xed" => [0, "\xe5u"], "\xee" => [100, "\xe5"], "\xef" => [110, "\xe5"], "\xf0" => [111, "\xe5"], "\xf1" => [115, "\xe5"], "\xf2" => [116, "\xe5"], "\xf3" => [118, "\xe5"], "\xf4" => [119, "\xe5"], "\xf5" => [122, "\xe5"], "\xf6" => [123, "\xe5"], "\xf7" => [125, "\xe5"], "\xf8" => [126, "\xe5"], "\xf9" => [129, "\xe5"], "\xfa" => [143, "\xe5"], "\xfb" => [148, "\xe5"], "\xfc" => [151, "\xe5"], "\xfd" => [153, "\xe5"], "\xfe" => [83, "\xe5"], "\xff" => [10, "\xe5"]], ["\x00" => [77, "\xda0"], "\x01" => [18, "\xda0"], "\x02" => [77, "\xda1"], "\x03" => [18, "\xda1"], "\x04" => [77, "\xda2"], "\x05" => [18, "\xda2"], "\x06" => [77, "\xdaa"], "\x07" => [18, "\xdaa"], "\x08" => [77, "\xdac"], "\t" => [18, "\xdac"], "\n" => [77, "\xdae"], "\v" => [18, "\xdae"], "\f" => [77, "\xdai"], "\r" => [18, "\xdai"], "\x0e" => [77, "\xdao"], "\x0f" => [18, "\xdao"], "\x10" => [77, "\xdas"], "\x11" => [18, "\xdas"], "\x12" => [77, "\xdat"], "\x13" => [18, "\xdat"], "\x14" => [0, "\xda "], "\x15" => [0, "\xda%"], "\x16" => [0, "\xda-"], "\x17" => [0, "\xda."], "\x18" => [0, "\xda/"], "\x19" => [0, "\xda3"], "\x1a" => [0, "\xda4"], "\x1b" => [0, "\xda5"], "\x1c" => [0, "\xda6"], "\x1d" => [0, "\xda7"], "\x1e" => [0, "\xda8"], "\x1f" => [0, "\xda9"], " " => [0, "\xda="], "!" => [0, "\xdaA"], "\"" => [0, "\xda_"], "#" => [0, "\xdab"], "\$" => [0, "\xdad"], "%" => [0, "\xdaf"], "&" => [0, "\xdag"], "'" => [0, "\xdah"], "(" => [0, "\xdal"], ")" => [0, "\xdam"], "*" => [0, "\xdan"], "+" => [0, "\xdap"], "," => [0, "\xdar"], "-" => [0, "\xdau"], "." => [100, "\xda"], "/" => [110, "\xda"], [111, "\xda"], [115, "\xda"], [116, "\xda"], [118, "\xda"], [119, "\xda"], [122, "\xda"], [123, "\xda"], [125, "\xda"], [126, "\xda"], [129, "\xda"], ":" => [143, "\xda"], ";" => [148, "\xda"], "<" => [151, "\xda"], "=" => [153, "\xda"], ">" => [83, "\xda"], "?" => [10, "\xda"], "@" => [77, "\xdb0"], "A" => [18, "\xdb0"], "B" => [77, "\xdb1"], "C" => [18, "\xdb1"], "D" => [77, "\xdb2"], "E" => [18, "\xdb2"], "F" => [77, "\xdba"], "G" => [18, "\xdba"], "H" => [77, "\xdbc"], "I" => [18, "\xdbc"], "J" => [77, "\xdbe"], "K" => [18, "\xdbe"], "L" => [77, "\xdbi"], "M" => [18, "\xdbi"], "N" => [77, "\xdbo"], "O" => [18, "\xdbo"], "P" => [77, "\xdbs"], "Q" => [18, "\xdbs"], "R" => [77, "\xdbt"], "S" => [18, "\xdbt"], "T" => [0, "\xdb "], "U" => [0, "\xdb%"], "V" => [0, "\xdb-"], "W" => [0, "\xdb."], "X" => [0, "\xdb/"], "Y" => [0, "\xdb3"], "Z" => [0, "\xdb4"], "[" => [0, "\xdb5"], "\\" => [0, "\xdb6"], "]" => [0, "\xdb7"], "^" => [0, "\xdb8"], "_" => [0, "\xdb9"], "`" => [0, "\xdb="], "a" => [0, "\xdbA"], "b" => [0, "\xdb_"], "c" => [0, "\xdbb"], "d" => [0, "\xdbd"], "e" => [0, "\xdbf"], "f" => [0, "\xdbg"], "g" => [0, "\xdbh"], "h" => [0, "\xdbl"], "i" => [0, "\xdbm"], "j" => [0, "\xdbn"], "k" => [0, "\xdbp"], "l" => [0, "\xdbr"], "m" => [0, "\xdbu"], "n" => [100, "\xdb"], "o" => [110, "\xdb"], "p" => [111, "\xdb"], "q" => [115, "\xdb"], "r" => [116, "\xdb"], "s" => [118, "\xdb"], "t" => [119, "\xdb"], "u" => [122, "\xdb"], "v" => [123, "\xdb"], "w" => [125, "\xdb"], "x" => [126, "\xdb"], "y" => [129, "\xdb"], "z" => [143, "\xdb"], "{" => [148, "\xdb"], "|" => [151, "\xdb"], "}" => [153, "\xdb"], "~" => [83, "\xdb"], "" => [10, "\xdb"], "\x80" => [77, "\xee0"], "\x81" => [18, "\xee0"], "\x82" => [77, "\xee1"], "\x83" => [18, "\xee1"], "\x84" => [77, "\xee2"], "\x85" => [18, "\xee2"], "\x86" => [77, "\xeea"], "\x87" => [18, "\xeea"], "\x88" => [77, "\xeec"], "\x89" => [18, "\xeec"], "\x8a" => [77, "\xeee"], "\x8b" => [18, "\xeee"], "\x8c" => [77, "\xeei"], "\x8d" => [18, "\xeei"], "\x8e" => [77, "\xeeo"], "\x8f" => [18, "\xeeo"], "\x90" => [77, "\xees"], "\x91" => [18, "\xees"], "\x92" => [77, "\xeet"], "\x93" => [18, "\xeet"], "\x94" => [0, "\xee "], "\x95" => [0, "\xee%"], "\x96" => [0, "\xee-"], "\x97" => [0, "\xee."], "\x98" => [0, "\xee/"], "\x99" => [0, "\xee3"], "\x9a" => [0, "\xee4"], "\x9b" => [0, "\xee5"], "\x9c" => [0, "\xee6"], "\x9d" => [0, "\xee7"], "\x9e" => [0, "\xee8"], "\x9f" => [0, "\xee9"], "\xa0" => [0, "\xee="], "\xa1" => [0, "\xeeA"], "\xa2" => [0, "\xee_"], "\xa3" => [0, "\xeeb"], "\xa4" => [0, "\xeed"], "\xa5" => [0, "\xeef"], "\xa6" => [0, "\xeeg"], "\xa7" => [0, "\xeeh"], "\xa8" => [0, "\xeel"], "\xa9" => [0, "\xeem"], "\xaa" => [0, "\xeen"], "\xab" => [0, "\xeep"], "\xac" => [0, "\xeer"], "\xad" => [0, "\xeeu"], "\xae" => [100, "\xee"], "\xaf" => [110, "\xee"], "\xb0" => [111, "\xee"], "\xb1" => [115, "\xee"], "\xb2" => [116, "\xee"], "\xb3" => [118, "\xee"], "\xb4" => [119, "\xee"], "\xb5" => [122, "\xee"], "\xb6" => [123, "\xee"], "\xb7" => [125, "\xee"], "\xb8" => [126, "\xee"], "\xb9" => [129, "\xee"], "\xba" => [143, "\xee"], "\xbb" => [148, "\xee"], "\xbc" => [151, "\xee"], "\xbd" => [153, "\xee"], "\xbe" => [83, "\xee"], "\xbf" => [10, "\xee"], "\xc0" => [77, "\xf00"], "\xc1" => [18, "\xf00"], "\xc2" => [77, "\xf01"], "\xc3" => [18, "\xf01"], "\xc4" => [77, "\xf02"], "\xc5" => [18, "\xf02"], "\xc6" => [77, "\xf0a"], "\xc7" => [18, "\xf0a"], "\xc8" => [77, "\xf0c"], "\xc9" => [18, "\xf0c"], "\xca" => [77, "\xf0e"], "\xcb" => [18, "\xf0e"], "\xcc" => [77, "\xf0i"], "\xcd" => [18, "\xf0i"], "\xce" => [77, "\xf0o"], "\xcf" => [18, "\xf0o"], "\xd0" => [77, "\xf0s"], "\xd1" => [18, "\xf0s"], "\xd2" => [77, "\xf0t"], "\xd3" => [18, "\xf0t"], "\xd4" => [0, "\xf0 "], "\xd5" => [0, "\xf0%"], "\xd6" => [0, "\xf0-"], "\xd7" => [0, "\xf0."], "\xd8" => [0, "\xf0/"], "\xd9" => [0, "\xf03"], "\xda" => [0, "\xf04"], "\xdb" => [0, "\xf05"], "\xdc" => [0, "\xf06"], "\xdd" => [0, "\xf07"], "\xde" => [0, "\xf08"], "\xdf" => [0, "\xf09"], "\xe0" => [0, "\xf0="], "\xe1" => [0, "\xf0A"], "\xe2" => [0, "\xf0_"], "\xe3" => [0, "\xf0b"], "\xe4" => [0, "\xf0d"], "\xe5" => [0, "\xf0f"], "\xe6" => [0, "\xf0g"], "\xe7" => [0, "\xf0h"], "\xe8" => [0, "\xf0l"], "\xe9" => [0, "\xf0m"], "\xea" => [0, "\xf0n"], "\xeb" => [0, "\xf0p"], "\xec" => [0, "\xf0r"], "\xed" => [0, "\xf0u"], "\xee" => [100, "\xf0"], "\xef" => [110, "\xf0"], "\xf0" => [111, "\xf0"], "\xf1" => [115, "\xf0"], "\xf2" => [116, "\xf0"], "\xf3" => [118, "\xf0"], "\xf4" => [119, "\xf0"], "\xf5" => [122, "\xf0"], "\xf6" => [123, "\xf0"], "\xf7" => [125, "\xf0"], "\xf8" => [126, "\xf0"], "\xf9" => [129, "\xf0"], "\xfa" => [143, "\xf0"], "\xfb" => [148, "\xf0"], "\xfc" => [151, "\xf0"], "\xfd" => [153, "\xf0"], "\xfe" => [83, "\xf0"], "\xff" => [10, "\xf0"]], ["\x00" => [94, "\xda0"], "\x01" => [76, "\xda0"], "\x02" => [104, "\xda0"], "\x03" => [16, "\xda0"], "\x04" => [94, "\xda1"], "\x05" => [76, "\xda1"], "\x06" => [104, "\xda1"], "\x07" => [16, "\xda1"], "\x08" => [94, "\xda2"], "\t" => [76, "\xda2"], "\n" => [104, "\xda2"], "\v" => [16, "\xda2"], "\f" => [94, "\xdaa"], "\r" => [76, "\xdaa"], "\x0e" => [104, "\xdaa"], "\x0f" => [16, "\xdaa"], "\x10" => [94, "\xdac"], "\x11" => [76, "\xdac"], "\x12" => [104, "\xdac"], "\x13" => [16, "\xdac"], "\x14" => [94, "\xdae"], "\x15" => [76, "\xdae"], "\x16" => [104, "\xdae"], "\x17" => [16, "\xdae"], "\x18" => [94, "\xdai"], "\x19" => [76, "\xdai"], "\x1a" => [104, "\xdai"], "\x1b" => [16, "\xdai"], "\x1c" => [94, "\xdao"], "\x1d" => [76, "\xdao"], "\x1e" => [104, "\xdao"], "\x1f" => [16, "\xdao"], " " => [94, "\xdas"], "!" => [76, "\xdas"], "\"" => [104, "\xdas"], "#" => [16, "\xdas"], "\$" => [94, "\xdat"], "%" => [76, "\xdat"], "&" => [104, "\xdat"], "'" => [16, "\xdat"], "(" => [77, "\xda "], ")" => [18, "\xda "], "*" => [77, "\xda%"], "+" => [18, "\xda%"], "," => [77, "\xda-"], "-" => [18, "\xda-"], "." => [77, "\xda."], "/" => [18, "\xda."], [77, "\xda/"], [18, "\xda/"], [77, "\xda3"], [18, "\xda3"], [77, "\xda4"], [18, "\xda4"], [77, "\xda5"], [18, "\xda5"], [77, "\xda6"], [18, "\xda6"], ":" => [77, "\xda7"], ";" => [18, "\xda7"], "<" => [77, "\xda8"], "=" => [18, "\xda8"], ">" => [77, "\xda9"], "?" => [18, "\xda9"], "@" => [77, "\xda="], "A" => [18, "\xda="], "B" => [77, "\xdaA"], "C" => [18, "\xdaA"], "D" => [77, "\xda_"], "E" => [18, "\xda_"], "F" => [77, "\xdab"], "G" => [18, "\xdab"], "H" => [77, "\xdad"], "I" => [18, "\xdad"], "J" => [77, "\xdaf"], "K" => [18, "\xdaf"], "L" => [77, "\xdag"], "M" => [18, "\xdag"], "N" => [77, "\xdah"], "O" => [18, "\xdah"], "P" => [77, "\xdal"], "Q" => [18, "\xdal"], "R" => [77, "\xdam"], "S" => [18, "\xdam"], "T" => [77, "\xdan"], "U" => [18, "\xdan"], "V" => [77, "\xdap"], "W" => [18, "\xdap"], "X" => [77, "\xdar"], "Y" => [18, "\xdar"], "Z" => [77, "\xdau"], "[" => [18, "\xdau"], "\\" => [0, "\xda:"], "]" => [0, "\xdaB"], "^" => [0, "\xdaC"], "_" => [0, "\xdaD"], "`" => [0, "\xdaE"], "a" => [0, "\xdaF"], "b" => [0, "\xdaG"], "c" => [0, "\xdaH"], "d" => [0, "\xdaI"], "e" => [0, "\xdaJ"], "f" => [0, "\xdaK"], "g" => [0, "\xdaL"], "h" => [0, "\xdaM"], "i" => [0, "\xdaN"], "j" => [0, "\xdaO"], "k" => [0, "\xdaP"], "l" => [0, "\xdaQ"], "m" => [0, "\xdaR"], "n" => [0, "\xdaS"], "o" => [0, "\xdaT"], "p" => [0, "\xdaU"], "q" => [0, "\xdaV"], "r" => [0, "\xdaW"], "s" => [0, "\xdaY"], "t" => [0, "\xdaj"], "u" => [0, "\xdak"], "v" => [0, "\xdaq"], "w" => [0, "\xdav"], "x" => [0, "\xdaw"], "y" => [0, "\xdax"], "z" => [0, "\xday"], "{" => [0, "\xdaz"], "|" => [82, "\xda"], "}" => [87, "\xda"], "~" => [130, "\xda"], "" => [9, "\xda"], "\x80" => [94, "\xdb0"], "\x81" => [76, "\xdb0"], "\x82" => [104, "\xdb0"], "\x83" => [16, "\xdb0"], "\x84" => [94, "\xdb1"], "\x85" => [76, "\xdb1"], "\x86" => [104, "\xdb1"], "\x87" => [16, "\xdb1"], "\x88" => [94, "\xdb2"], "\x89" => [76, "\xdb2"], "\x8a" => [104, "\xdb2"], "\x8b" => [16, "\xdb2"], "\x8c" => [94, "\xdba"], "\x8d" => [76, "\xdba"], "\x8e" => [104, "\xdba"], "\x8f" => [16, "\xdba"], "\x90" => [94, "\xdbc"], "\x91" => [76, "\xdbc"], "\x92" => [104, "\xdbc"], "\x93" => [16, "\xdbc"], "\x94" => [94, "\xdbe"], "\x95" => [76, "\xdbe"], "\x96" => [104, "\xdbe"], "\x97" => [16, "\xdbe"], "\x98" => [94, "\xdbi"], "\x99" => [76, "\xdbi"], "\x9a" => [104, "\xdbi"], "\x9b" => [16, "\xdbi"], "\x9c" => [94, "\xdbo"], "\x9d" => [76, "\xdbo"], "\x9e" => [104, "\xdbo"], "\x9f" => [16, "\xdbo"], "\xa0" => [94, "\xdbs"], "\xa1" => [76, "\xdbs"], "\xa2" => [104, "\xdbs"], "\xa3" => [16, "\xdbs"], "\xa4" => [94, "\xdbt"], "\xa5" => [76, "\xdbt"], "\xa6" => [104, "\xdbt"], "\xa7" => [16, "\xdbt"], "\xa8" => [77, "\xdb "], "\xa9" => [18, "\xdb "], "\xaa" => [77, "\xdb%"], "\xab" => [18, "\xdb%"], "\xac" => [77, "\xdb-"], "\xad" => [18, "\xdb-"], "\xae" => [77, "\xdb."], "\xaf" => [18, "\xdb."], "\xb0" => [77, "\xdb/"], "\xb1" => [18, "\xdb/"], "\xb2" => [77, "\xdb3"], "\xb3" => [18, "\xdb3"], "\xb4" => [77, "\xdb4"], "\xb5" => [18, "\xdb4"], "\xb6" => [77, "\xdb5"], "\xb7" => [18, "\xdb5"], "\xb8" => [77, "\xdb6"], "\xb9" => [18, "\xdb6"], "\xba" => [77, "\xdb7"], "\xbb" => [18, "\xdb7"], "\xbc" => [77, "\xdb8"], "\xbd" => [18, "\xdb8"], "\xbe" => [77, "\xdb9"], "\xbf" => [18, "\xdb9"], "\xc0" => [77, "\xdb="], "\xc1" => [18, "\xdb="], "\xc2" => [77, "\xdbA"], "\xc3" => [18, "\xdbA"], "\xc4" => [77, "\xdb_"], "\xc5" => [18, "\xdb_"], "\xc6" => [77, "\xdbb"], "\xc7" => [18, "\xdbb"], "\xc8" => [77, "\xdbd"], "\xc9" => [18, "\xdbd"], "\xca" => [77, "\xdbf"], "\xcb" => [18, "\xdbf"], "\xcc" => [77, "\xdbg"], "\xcd" => [18, "\xdbg"], "\xce" => [77, "\xdbh"], "\xcf" => [18, "\xdbh"], "\xd0" => [77, "\xdbl"], "\xd1" => [18, "\xdbl"], "\xd2" => [77, "\xdbm"], "\xd3" => [18, "\xdbm"], "\xd4" => [77, "\xdbn"], "\xd5" => [18, "\xdbn"], "\xd6" => [77, "\xdbp"], "\xd7" => [18, "\xdbp"], "\xd8" => [77, "\xdbr"], "\xd9" => [18, "\xdbr"], "\xda" => [77, "\xdbu"], "\xdb" => [18, "\xdbu"], "\xdc" => [0, "\xdb:"], "\xdd" => [0, "\xdbB"], "\xde" => [0, "\xdbC"], "\xdf" => [0, "\xdbD"], "\xe0" => [0, "\xdbE"], "\xe1" => [0, "\xdbF"], "\xe2" => [0, "\xdbG"], "\xe3" => [0, "\xdbH"], "\xe4" => [0, "\xdbI"], "\xe5" => [0, "\xdbJ"], "\xe6" => [0, "\xdbK"], "\xe7" => [0, "\xdbL"], "\xe8" => [0, "\xdbM"], "\xe9" => [0, "\xdbN"], "\xea" => [0, "\xdbO"], "\xeb" => [0, "\xdbP"], "\xec" => [0, "\xdbQ"], "\xed" => [0, "\xdbR"], "\xee" => [0, "\xdbS"], "\xef" => [0, "\xdbT"], "\xf0" => [0, "\xdbU"], "\xf1" => [0, "\xdbV"], "\xf2" => [0, "\xdbW"], "\xf3" => [0, "\xdbY"], "\xf4" => [0, "\xdbj"], "\xf5" => [0, "\xdbk"], "\xf6" => [0, "\xdbq"], "\xf7" => [0, "\xdbv"], "\xf8" => [0, "\xdbw"], "\xf9" => [0, "\xdbx"], "\xfa" => [0, "\xdby"], "\xfb" => [0, "\xdbz"], "\xfc" => [82, "\xdb"], "\xfd" => [87, "\xdb"], "\xfe" => [130, "\xdb"], "\xff" => [9, "\xdb"]], ["\x00" => [94, "\xde0"], "\x01" => [76, "\xde0"], "\x02" => [104, "\xde0"], "\x03" => [16, "\xde0"], "\x04" => [94, "\xde1"], "\x05" => [76, "\xde1"], "\x06" => [104, "\xde1"], "\x07" => [16, "\xde1"], "\x08" => [94, "\xde2"], "\t" => [76, "\xde2"], "\n" => [104, "\xde2"], "\v" => [16, "\xde2"], "\f" => [94, "\xdea"], "\r" => [76, "\xdea"], "\x0e" => [104, "\xdea"], "\x0f" => [16, "\xdea"], "\x10" => [94, "\xdec"], "\x11" => [76, "\xdec"], "\x12" => [104, "\xdec"], "\x13" => [16, "\xdec"], "\x14" => [94, "\xdee"], "\x15" => [76, "\xdee"], "\x16" => [104, "\xdee"], "\x17" => [16, "\xdee"], "\x18" => [94, "\xdei"], "\x19" => [76, "\xdei"], "\x1a" => [104, "\xdei"], "\x1b" => [16, "\xdei"], "\x1c" => [94, "\xdeo"], "\x1d" => [76, "\xdeo"], "\x1e" => [104, "\xdeo"], "\x1f" => [16, "\xdeo"], " " => [94, "\xdes"], "!" => [76, "\xdes"], "\"" => [104, "\xdes"], "#" => [16, "\xdes"], "\$" => [94, "\xdet"], "%" => [76, "\xdet"], "&" => [104, "\xdet"], "'" => [16, "\xdet"], "(" => [77, "\xde "], ")" => [18, "\xde "], "*" => [77, "\xde%"], "+" => [18, "\xde%"], "," => [77, "\xde-"], "-" => [18, "\xde-"], "." => [77, "\xde."], "/" => [18, "\xde."], [77, "\xde/"], [18, "\xde/"], [77, "\xde3"], [18, "\xde3"], [77, "\xde4"], [18, "\xde4"], [77, "\xde5"], [18, "\xde5"], [77, "\xde6"], [18, "\xde6"], ":" => [77, "\xde7"], ";" => [18, "\xde7"], "<" => [77, "\xde8"], "=" => [18, "\xde8"], ">" => [77, "\xde9"], "?" => [18, "\xde9"], "@" => [77, "\xde="], "A" => [18, "\xde="], "B" => [77, "\xdeA"], "C" => [18, "\xdeA"], "D" => [77, "\xde_"], "E" => [18, "\xde_"], "F" => [77, "\xdeb"], "G" => [18, "\xdeb"], "H" => [77, "\xded"], "I" => [18, "\xded"], "J" => [77, "\xdef"], "K" => [18, "\xdef"], "L" => [77, "\xdeg"], "M" => [18, "\xdeg"], "N" => [77, "\xdeh"], "O" => [18, "\xdeh"], "P" => [77, "\xdel"], "Q" => [18, "\xdel"], "R" => [77, "\xdem"], "S" => [18, "\xdem"], "T" => [77, "\xden"], "U" => [18, "\xden"], "V" => [77, "\xdep"], "W" => [18, "\xdep"], "X" => [77, "\xder"], "Y" => [18, "\xder"], "Z" => [77, "\xdeu"], "[" => [18, "\xdeu"], "\\" => [0, "\xde:"], "]" => [0, "\xdeB"], "^" => [0, "\xdeC"], "_" => [0, "\xdeD"], "`" => [0, "\xdeE"], "a" => [0, "\xdeF"], "b" => [0, "\xdeG"], "c" => [0, "\xdeH"], "d" => [0, "\xdeI"], "e" => [0, "\xdeJ"], "f" => [0, "\xdeK"], "g" => [0, "\xdeL"], "h" => [0, "\xdeM"], "i" => [0, "\xdeN"], "j" => [0, "\xdeO"], "k" => [0, "\xdeP"], "l" => [0, "\xdeQ"], "m" => [0, "\xdeR"], "n" => [0, "\xdeS"], "o" => [0, "\xdeT"], "p" => [0, "\xdeU"], "q" => [0, "\xdeV"], "r" => [0, "\xdeW"], "s" => [0, "\xdeY"], "t" => [0, "\xdej"], "u" => [0, "\xdek"], "v" => [0, "\xdeq"], "w" => [0, "\xdev"], "x" => [0, "\xdew"], "y" => [0, "\xdex"], "z" => [0, "\xdey"], "{" => [0, "\xdez"], "|" => [82, "\xde"], "}" => [87, "\xde"], "~" => [130, "\xde"], "" => [9, "\xde"], "\x80" => [94, "\xdf0"], "\x81" => [76, "\xdf0"], "\x82" => [104, "\xdf0"], "\x83" => [16, "\xdf0"], "\x84" => [94, "\xdf1"], "\x85" => [76, "\xdf1"], "\x86" => [104, "\xdf1"], "\x87" => [16, "\xdf1"], "\x88" => [94, "\xdf2"], "\x89" => [76, "\xdf2"], "\x8a" => [104, "\xdf2"], "\x8b" => [16, "\xdf2"], "\x8c" => [94, "\xdfa"], "\x8d" => [76, "\xdfa"], "\x8e" => [104, "\xdfa"], "\x8f" => [16, "\xdfa"], "\x90" => [94, "\xdfc"], "\x91" => [76, "\xdfc"], "\x92" => [104, "\xdfc"], "\x93" => [16, "\xdfc"], "\x94" => [94, "\xdfe"], "\x95" => [76, "\xdfe"], "\x96" => [104, "\xdfe"], "\x97" => [16, "\xdfe"], "\x98" => [94, "\xdfi"], "\x99" => [76, "\xdfi"], "\x9a" => [104, "\xdfi"], "\x9b" => [16, "\xdfi"], "\x9c" => [94, "\xdfo"], "\x9d" => [76, "\xdfo"], "\x9e" => [104, "\xdfo"], "\x9f" => [16, "\xdfo"], "\xa0" => [94, "\xdfs"], "\xa1" => [76, "\xdfs"], "\xa2" => [104, "\xdfs"], "\xa3" => [16, "\xdfs"], "\xa4" => [94, "\xdft"], "\xa5" => [76, "\xdft"], "\xa6" => [104, "\xdft"], "\xa7" => [16, "\xdft"], "\xa8" => [77, "\xdf "], "\xa9" => [18, "\xdf "], "\xaa" => [77, "\xdf%"], "\xab" => [18, "\xdf%"], "\xac" => [77, "\xdf-"], "\xad" => [18, "\xdf-"], "\xae" => [77, "\xdf."], "\xaf" => [18, "\xdf."], "\xb0" => [77, "\xdf/"], "\xb1" => [18, "\xdf/"], "\xb2" => [77, "\xdf3"], "\xb3" => [18, "\xdf3"], "\xb4" => [77, "\xdf4"], "\xb5" => [18, "\xdf4"], "\xb6" => [77, "\xdf5"], "\xb7" => [18, "\xdf5"], "\xb8" => [77, "\xdf6"], "\xb9" => [18, "\xdf6"], "\xba" => [77, "\xdf7"], "\xbb" => [18, "\xdf7"], "\xbc" => [77, "\xdf8"], "\xbd" => [18, "\xdf8"], "\xbe" => [77, "\xdf9"], "\xbf" => [18, "\xdf9"], "\xc0" => [77, "\xdf="], "\xc1" => [18, "\xdf="], "\xc2" => [77, "\xdfA"], "\xc3" => [18, "\xdfA"], "\xc4" => [77, "\xdf_"], "\xc5" => [18, "\xdf_"], "\xc6" => [77, "\xdfb"], "\xc7" => [18, "\xdfb"], "\xc8" => [77, "\xdfd"], "\xc9" => [18, "\xdfd"], "\xca" => [77, "\xdff"], "\xcb" => [18, "\xdff"], "\xcc" => [77, "\xdfg"], "\xcd" => [18, "\xdfg"], "\xce" => [77, "\xdfh"], "\xcf" => [18, "\xdfh"], "\xd0" => [77, "\xdfl"], "\xd1" => [18, "\xdfl"], "\xd2" => [77, "\xdfm"], "\xd3" => [18, "\xdfm"], "\xd4" => [77, "\xdfn"], "\xd5" => [18, "\xdfn"], "\xd6" => [77, "\xdfp"], "\xd7" => [18, "\xdfp"], "\xd8" => [77, "\xdfr"], "\xd9" => [18, "\xdfr"], "\xda" => [77, "\xdfu"], "\xdb" => [18, "\xdfu"], "\xdc" => [0, "\xdf:"], "\xdd" => [0, "\xdfB"], "\xde" => [0, "\xdfC"], "\xdf" => [0, "\xdfD"], "\xe0" => [0, "\xdfE"], "\xe1" => [0, "\xdfF"], "\xe2" => [0, "\xdfG"], "\xe3" => [0, "\xdfH"], "\xe4" => [0, "\xdfI"], "\xe5" => [0, "\xdfJ"], "\xe6" => [0, "\xdfK"], "\xe7" => [0, "\xdfL"], "\xe8" => [0, "\xdfM"], "\xe9" => [0, "\xdfN"], "\xea" => [0, "\xdfO"], "\xeb" => [0, "\xdfP"], "\xec" => [0, "\xdfQ"], "\xed" => [0, "\xdfR"], "\xee" => [0, "\xdfS"], "\xef" => [0, "\xdfT"], "\xf0" => [0, "\xdfU"], "\xf1" => [0, "\xdfV"], "\xf2" => [0, "\xdfW"], "\xf3" => [0, "\xdfY"], "\xf4" => [0, "\xdfj"], "\xf5" => [0, "\xdfk"], "\xf6" => [0, "\xdfq"], "\xf7" => [0, "\xdfv"], "\xf8" => [0, "\xdfw"], "\xf9" => [0, "\xdfx"], "\xfa" => [0, "\xdfy"], "\xfb" => [0, "\xdfz"], "\xfc" => [82, "\xdf"], "\xfd" => [87, "\xdf"], "\xfe" => [130, "\xdf"], "\xff" => [9, "\xdf"]], ["\x00" => [77, "\xde0"], "\x01" => [18, "\xde0"], "\x02" => [77, "\xde1"], "\x03" => [18, "\xde1"], "\x04" => [77, "\xde2"], "\x05" => [18, "\xde2"], "\x06" => [77, "\xdea"], "\x07" => [18, "\xdea"], "\x08" => [77, "\xdec"], "\t" => [18, "\xdec"], "\n" => [77, "\xdee"], "\v" => [18, "\xdee"], "\f" => [77, "\xdei"], "\r" => [18, "\xdei"], "\x0e" => [77, "\xdeo"], "\x0f" => [18, "\xdeo"], "\x10" => [77, "\xdes"], "\x11" => [18, "\xdes"], "\x12" => [77, "\xdet"], "\x13" => [18, "\xdet"], "\x14" => [0, "\xde "], "\x15" => [0, "\xde%"], "\x16" => [0, "\xde-"], "\x17" => [0, "\xde."], "\x18" => [0, "\xde/"], "\x19" => [0, "\xde3"], "\x1a" => [0, "\xde4"], "\x1b" => [0, "\xde5"], "\x1c" => [0, "\xde6"], "\x1d" => [0, "\xde7"], "\x1e" => [0, "\xde8"], "\x1f" => [0, "\xde9"], " " => [0, "\xde="], "!" => [0, "\xdeA"], "\"" => [0, "\xde_"], "#" => [0, "\xdeb"], "\$" => [0, "\xded"], "%" => [0, "\xdef"], "&" => [0, "\xdeg"], "'" => [0, "\xdeh"], "(" => [0, "\xdel"], ")" => [0, "\xdem"], "*" => [0, "\xden"], "+" => [0, "\xdep"], "," => [0, "\xder"], "-" => [0, "\xdeu"], "." => [100, "\xde"], "/" => [110, "\xde"], [111, "\xde"], [115, "\xde"], [116, "\xde"], [118, "\xde"], [119, "\xde"], [122, "\xde"], [123, "\xde"], [125, "\xde"], [126, "\xde"], [129, "\xde"], ":" => [143, "\xde"], ";" => [148, "\xde"], "<" => [151, "\xde"], "=" => [153, "\xde"], ">" => [83, "\xde"], "?" => [10, "\xde"], "@" => [77, "\xdf0"], "A" => [18, "\xdf0"], "B" => [77, "\xdf1"], "C" => [18, "\xdf1"], "D" => [77, "\xdf2"], "E" => [18, "\xdf2"], "F" => [77, "\xdfa"], "G" => [18, "\xdfa"], "H" => [77, "\xdfc"], "I" => [18, "\xdfc"], "J" => [77, "\xdfe"], "K" => [18, "\xdfe"], "L" => [77, "\xdfi"], "M" => [18, "\xdfi"], "N" => [77, "\xdfo"], "O" => [18, "\xdfo"], "P" => [77, "\xdfs"], "Q" => [18, "\xdfs"], "R" => [77, "\xdft"], "S" => [18, "\xdft"], "T" => [0, "\xdf "], "U" => [0, "\xdf%"], "V" => [0, "\xdf-"], "W" => [0, "\xdf."], "X" => [0, "\xdf/"], "Y" => [0, "\xdf3"], "Z" => [0, "\xdf4"], "[" => [0, "\xdf5"], "\\" => [0, "\xdf6"], "]" => [0, "\xdf7"], "^" => [0, "\xdf8"], "_" => [0, "\xdf9"], "`" => [0, "\xdf="], "a" => [0, "\xdfA"], "b" => [0, "\xdf_"], "c" => [0, "\xdfb"], "d" => [0, "\xdfd"], "e" => [0, "\xdff"], "f" => [0, "\xdfg"], "g" => [0, "\xdfh"], "h" => [0, "\xdfl"], "i" => [0, "\xdfm"], "j" => [0, "\xdfn"], "k" => [0, "\xdfp"], "l" => [0, "\xdfr"], "m" => [0, "\xdfu"], "n" => [100, "\xdf"], "o" => [110, "\xdf"], "p" => [111, "\xdf"], "q" => [115, "\xdf"], "r" => [116, "\xdf"], "s" => [118, "\xdf"], "t" => [119, "\xdf"], "u" => [122, "\xdf"], "v" => [123, "\xdf"], "w" => [125, "\xdf"], "x" => [126, "\xdf"], "y" => [129, "\xdf"], "z" => [143, "\xdf"], "{" => [148, "\xdf"], "|" => [151, "\xdf"], "}" => [153, "\xdf"], "~" => [83, "\xdf"], "" => [10, "\xdf"], "\x80" => [77, "\xf10"], "\x81" => [18, "\xf10"], "\x82" => [77, "\xf11"], "\x83" => [18, "\xf11"], "\x84" => [77, "\xf12"], "\x85" => [18, "\xf12"], "\x86" => [77, "\xf1a"], "\x87" => [18, "\xf1a"], "\x88" => [77, "\xf1c"], "\x89" => [18, "\xf1c"], "\x8a" => [77, "\xf1e"], "\x8b" => [18, "\xf1e"], "\x8c" => [77, "\xf1i"], "\x8d" => [18, "\xf1i"], "\x8e" => [77, "\xf1o"], "\x8f" => [18, "\xf1o"], "\x90" => [77, "\xf1s"], "\x91" => [18, "\xf1s"], "\x92" => [77, "\xf1t"], "\x93" => [18, "\xf1t"], "\x94" => [0, "\xf1 "], "\x95" => [0, "\xf1%"], "\x96" => [0, "\xf1-"], "\x97" => [0, "\xf1."], "\x98" => [0, "\xf1/"], "\x99" => [0, "\xf13"], "\x9a" => [0, "\xf14"], "\x9b" => [0, "\xf15"], "\x9c" => [0, "\xf16"], "\x9d" => [0, "\xf17"], "\x9e" => [0, "\xf18"], "\x9f" => [0, "\xf19"], "\xa0" => [0, "\xf1="], "\xa1" => [0, "\xf1A"], "\xa2" => [0, "\xf1_"], "\xa3" => [0, "\xf1b"], "\xa4" => [0, "\xf1d"], "\xa5" => [0, "\xf1f"], "\xa6" => [0, "\xf1g"], "\xa7" => [0, "\xf1h"], "\xa8" => [0, "\xf1l"], "\xa9" => [0, "\xf1m"], "\xaa" => [0, "\xf1n"], "\xab" => [0, "\xf1p"], "\xac" => [0, "\xf1r"], "\xad" => [0, "\xf1u"], "\xae" => [100, "\xf1"], "\xaf" => [110, "\xf1"], "\xb0" => [111, "\xf1"], "\xb1" => [115, "\xf1"], "\xb2" => [116, "\xf1"], "\xb3" => [118, "\xf1"], "\xb4" => [119, "\xf1"], "\xb5" => [122, "\xf1"], "\xb6" => [123, "\xf1"], "\xb7" => [125, "\xf1"], "\xb8" => [126, "\xf1"], "\xb9" => [129, "\xf1"], "\xba" => [143, "\xf1"], "\xbb" => [148, "\xf1"], "\xbc" => [151, "\xf1"], "\xbd" => [153, "\xf1"], "\xbe" => [83, "\xf1"], "\xbf" => [10, "\xf1"], "\xc0" => [77, "\xf40"], "\xc1" => [18, "\xf40"], "\xc2" => [77, "\xf41"], "\xc3" => [18, "\xf41"], "\xc4" => [77, "\xf42"], "\xc5" => [18, "\xf42"], "\xc6" => [77, "\xf4a"], "\xc7" => [18, "\xf4a"], "\xc8" => [77, "\xf4c"], "\xc9" => [18, "\xf4c"], "\xca" => [77, "\xf4e"], "\xcb" => [18, "\xf4e"], "\xcc" => [77, "\xf4i"], "\xcd" => [18, "\xf4i"], "\xce" => [77, "\xf4o"], "\xcf" => [18, "\xf4o"], "\xd0" => [77, "\xf4s"], "\xd1" => [18, "\xf4s"], "\xd2" => [77, "\xf4t"], "\xd3" => [18, "\xf4t"], "\xd4" => [0, "\xf4 "], "\xd5" => [0, "\xf4%"], "\xd6" => [0, "\xf4-"], "\xd7" => [0, "\xf4."], "\xd8" => [0, "\xf4/"], "\xd9" => [0, "\xf43"], "\xda" => [0, "\xf44"], "\xdb" => [0, "\xf45"], "\xdc" => [0, "\xf46"], "\xdd" => [0, "\xf47"], "\xde" => [0, "\xf48"], "\xdf" => [0, "\xf49"], "\xe0" => [0, "\xf4="], "\xe1" => [0, "\xf4A"], "\xe2" => [0, "\xf4_"], "\xe3" => [0, "\xf4b"], "\xe4" => [0, "\xf4d"], "\xe5" => [0, "\xf4f"], "\xe6" => [0, "\xf4g"], "\xe7" => [0, "\xf4h"], "\xe8" => [0, "\xf4l"], "\xe9" => [0, "\xf4m"], "\xea" => [0, "\xf4n"], "\xeb" => [0, "\xf4p"], "\xec" => [0, "\xf4r"], "\xed" => [0, "\xf4u"], "\xee" => [100, "\xf4"], "\xef" => [110, "\xf4"], "\xf0" => [111, "\xf4"], "\xf1" => [115, "\xf4"], "\xf2" => [116, "\xf4"], "\xf3" => [118, "\xf4"], "\xf4" => [119, "\xf4"], "\xf5" => [122, "\xf4"], "\xf6" => [123, "\xf4"], "\xf7" => [125, "\xf4"], "\xf8" => [126, "\xf4"], "\xf9" => [129, "\xf4"], "\xfa" => [143, "\xf4"], "\xfb" => [148, "\xf4"], "\xfc" => [151, "\xf4"], "\xfd" => [153, "\xf4"], "\xfe" => [83, "\xf4"], "\xff" => [10, "\xf4"]], ["\x00" => [94, "\xe00"], "\x01" => [76, "\xe00"], "\x02" => [104, "\xe00"], "\x03" => [16, "\xe00"], "\x04" => [94, "\xe01"], "\x05" => [76, "\xe01"], "\x06" => [104, "\xe01"], "\x07" => [16, "\xe01"], "\x08" => [94, "\xe02"], "\t" => [76, "\xe02"], "\n" => [104, "\xe02"], "\v" => [16, "\xe02"], "\f" => [94, "\xe0a"], "\r" => [76, "\xe0a"], "\x0e" => [104, "\xe0a"], "\x0f" => [16, "\xe0a"], "\x10" => [94, "\xe0c"], "\x11" => [76, "\xe0c"], "\x12" => [104, "\xe0c"], "\x13" => [16, "\xe0c"], "\x14" => [94, "\xe0e"], "\x15" => [76, "\xe0e"], "\x16" => [104, "\xe0e"], "\x17" => [16, "\xe0e"], "\x18" => [94, "\xe0i"], "\x19" => [76, "\xe0i"], "\x1a" => [104, "\xe0i"], "\x1b" => [16, "\xe0i"], "\x1c" => [94, "\xe0o"], "\x1d" => [76, "\xe0o"], "\x1e" => [104, "\xe0o"], "\x1f" => [16, "\xe0o"], " " => [94, "\xe0s"], "!" => [76, "\xe0s"], "\"" => [104, "\xe0s"], "#" => [16, "\xe0s"], "\$" => [94, "\xe0t"], "%" => [76, "\xe0t"], "&" => [104, "\xe0t"], "'" => [16, "\xe0t"], "(" => [77, "\xe0 "], ")" => [18, "\xe0 "], "*" => [77, "\xe0%"], "+" => [18, "\xe0%"], "," => [77, "\xe0-"], "-" => [18, "\xe0-"], "." => [77, "\xe0."], "/" => [18, "\xe0."], [77, "\xe0/"], [18, "\xe0/"], [77, "\xe03"], [18, "\xe03"], [77, "\xe04"], [18, "\xe04"], [77, "\xe05"], [18, "\xe05"], [77, "\xe06"], [18, "\xe06"], ":" => [77, "\xe07"], ";" => [18, "\xe07"], "<" => [77, "\xe08"], "=" => [18, "\xe08"], ">" => [77, "\xe09"], "?" => [18, "\xe09"], "@" => [77, "\xe0="], "A" => [18, "\xe0="], "B" => [77, "\xe0A"], "C" => [18, "\xe0A"], "D" => [77, "\xe0_"], "E" => [18, "\xe0_"], "F" => [77, "\xe0b"], "G" => [18, "\xe0b"], "H" => [77, "\xe0d"], "I" => [18, "\xe0d"], "J" => [77, "\xe0f"], "K" => [18, "\xe0f"], "L" => [77, "\xe0g"], "M" => [18, "\xe0g"], "N" => [77, "\xe0h"], "O" => [18, "\xe0h"], "P" => [77, "\xe0l"], "Q" => [18, "\xe0l"], "R" => [77, "\xe0m"], "S" => [18, "\xe0m"], "T" => [77, "\xe0n"], "U" => [18, "\xe0n"], "V" => [77, "\xe0p"], "W" => [18, "\xe0p"], "X" => [77, "\xe0r"], "Y" => [18, "\xe0r"], "Z" => [77, "\xe0u"], "[" => [18, "\xe0u"], "\\" => [0, "\xe0:"], "]" => [0, "\xe0B"], "^" => [0, "\xe0C"], "_" => [0, "\xe0D"], "`" => [0, "\xe0E"], "a" => [0, "\xe0F"], "b" => [0, "\xe0G"], "c" => [0, "\xe0H"], "d" => [0, "\xe0I"], "e" => [0, "\xe0J"], "f" => [0, "\xe0K"], "g" => [0, "\xe0L"], "h" => [0, "\xe0M"], "i" => [0, "\xe0N"], "j" => [0, "\xe0O"], "k" => [0, "\xe0P"], "l" => [0, "\xe0Q"], "m" => [0, "\xe0R"], "n" => [0, "\xe0S"], "o" => [0, "\xe0T"], "p" => [0, "\xe0U"], "q" => [0, "\xe0V"], "r" => [0, "\xe0W"], "s" => [0, "\xe0Y"], "t" => [0, "\xe0j"], "u" => [0, "\xe0k"], "v" => [0, "\xe0q"], "w" => [0, "\xe0v"], "x" => [0, "\xe0w"], "y" => [0, "\xe0x"], "z" => [0, "\xe0y"], "{" => [0, "\xe0z"], "|" => [82, "\xe0"], "}" => [87, "\xe0"], "~" => [130, "\xe0"], "" => [9, "\xe0"], "\x80" => [94, "\xe20"], "\x81" => [76, "\xe20"], "\x82" => [104, "\xe20"], "\x83" => [16, "\xe20"], "\x84" => [94, "\xe21"], "\x85" => [76, "\xe21"], "\x86" => [104, "\xe21"], "\x87" => [16, "\xe21"], "\x88" => [94, "\xe22"], "\x89" => [76, "\xe22"], "\x8a" => [104, "\xe22"], "\x8b" => [16, "\xe22"], "\x8c" => [94, "\xe2a"], "\x8d" => [76, "\xe2a"], "\x8e" => [104, "\xe2a"], "\x8f" => [16, "\xe2a"], "\x90" => [94, "\xe2c"], "\x91" => [76, "\xe2c"], "\x92" => [104, "\xe2c"], "\x93" => [16, "\xe2c"], "\x94" => [94, "\xe2e"], "\x95" => [76, "\xe2e"], "\x96" => [104, "\xe2e"], "\x97" => [16, "\xe2e"], "\x98" => [94, "\xe2i"], "\x99" => [76, "\xe2i"], "\x9a" => [104, "\xe2i"], "\x9b" => [16, "\xe2i"], "\x9c" => [94, "\xe2o"], "\x9d" => [76, "\xe2o"], "\x9e" => [104, "\xe2o"], "\x9f" => [16, "\xe2o"], "\xa0" => [94, "\xe2s"], "\xa1" => [76, "\xe2s"], "\xa2" => [104, "\xe2s"], "\xa3" => [16, "\xe2s"], "\xa4" => [94, "\xe2t"], "\xa5" => [76, "\xe2t"], "\xa6" => [104, "\xe2t"], "\xa7" => [16, "\xe2t"], "\xa8" => [77, "\xe2 "], "\xa9" => [18, "\xe2 "], "\xaa" => [77, "\xe2%"], "\xab" => [18, "\xe2%"], "\xac" => [77, "\xe2-"], "\xad" => [18, "\xe2-"], "\xae" => [77, "\xe2."], "\xaf" => [18, "\xe2."], "\xb0" => [77, "\xe2/"], "\xb1" => [18, "\xe2/"], "\xb2" => [77, "\xe23"], "\xb3" => [18, "\xe23"], "\xb4" => [77, "\xe24"], "\xb5" => [18, "\xe24"], "\xb6" => [77, "\xe25"], "\xb7" => [18, "\xe25"], "\xb8" => [77, "\xe26"], "\xb9" => [18, "\xe26"], "\xba" => [77, "\xe27"], "\xbb" => [18, "\xe27"], "\xbc" => [77, "\xe28"], "\xbd" => [18, "\xe28"], "\xbe" => [77, "\xe29"], "\xbf" => [18, "\xe29"], "\xc0" => [77, "\xe2="], "\xc1" => [18, "\xe2="], "\xc2" => [77, "\xe2A"], "\xc3" => [18, "\xe2A"], "\xc4" => [77, "\xe2_"], "\xc5" => [18, "\xe2_"], "\xc6" => [77, "\xe2b"], "\xc7" => [18, "\xe2b"], "\xc8" => [77, "\xe2d"], "\xc9" => [18, "\xe2d"], "\xca" => [77, "\xe2f"], "\xcb" => [18, "\xe2f"], "\xcc" => [77, "\xe2g"], "\xcd" => [18, "\xe2g"], "\xce" => [77, "\xe2h"], "\xcf" => [18, "\xe2h"], "\xd0" => [77, "\xe2l"], "\xd1" => [18, "\xe2l"], "\xd2" => [77, "\xe2m"], "\xd3" => [18, "\xe2m"], "\xd4" => [77, "\xe2n"], "\xd5" => [18, "\xe2n"], "\xd6" => [77, "\xe2p"], "\xd7" => [18, "\xe2p"], "\xd8" => [77, "\xe2r"], "\xd9" => [18, "\xe2r"], "\xda" => [77, "\xe2u"], "\xdb" => [18, "\xe2u"], "\xdc" => [0, "\xe2:"], "\xdd" => [0, "\xe2B"], "\xde" => [0, "\xe2C"], "\xdf" => [0, "\xe2D"], "\xe0" => [0, "\xe2E"], "\xe1" => [0, "\xe2F"], "\xe2" => [0, "\xe2G"], "\xe3" => [0, "\xe2H"], "\xe4" => [0, "\xe2I"], "\xe5" => [0, "\xe2J"], "\xe6" => [0, "\xe2K"], "\xe7" => [0, "\xe2L"], "\xe8" => [0, "\xe2M"], "\xe9" => [0, "\xe2N"], "\xea" => [0, "\xe2O"], "\xeb" => [0, "\xe2P"], "\xec" => [0, "\xe2Q"], "\xed" => [0, "\xe2R"], "\xee" => [0, "\xe2S"], "\xef" => [0, "\xe2T"], "\xf0" => [0, "\xe2U"], "\xf1" => [0, "\xe2V"], "\xf2" => [0, "\xe2W"], "\xf3" => [0, "\xe2Y"], "\xf4" => [0, "\xe2j"], "\xf5" => [0, "\xe2k"], "\xf6" => [0, "\xe2q"], "\xf7" => [0, "\xe2v"], "\xf8" => [0, "\xe2w"], "\xf9" => [0, "\xe2x"], "\xfa" => [0, "\xe2y"], "\xfb" => [0, "\xe2z"], "\xfc" => [82, "\xe2"], "\xfd" => [87, "\xe2"], "\xfe" => [130, "\xe2"], "\xff" => [9, "\xe2"]], ["\x00" => [94, "\xe30"], "\x01" => [76, "\xe30"], "\x02" => [104, "\xe30"], "\x03" => [16, "\xe30"], "\x04" => [94, "\xe31"], "\x05" => [76, "\xe31"], "\x06" => [104, "\xe31"], "\x07" => [16, "\xe31"], "\x08" => [94, "\xe32"], "\t" => [76, "\xe32"], "\n" => [104, "\xe32"], "\v" => [16, "\xe32"], "\f" => [94, "\xe3a"], "\r" => [76, "\xe3a"], "\x0e" => [104, "\xe3a"], "\x0f" => [16, "\xe3a"], "\x10" => [94, "\xe3c"], "\x11" => [76, "\xe3c"], "\x12" => [104, "\xe3c"], "\x13" => [16, "\xe3c"], "\x14" => [94, "\xe3e"], "\x15" => [76, "\xe3e"], "\x16" => [104, "\xe3e"], "\x17" => [16, "\xe3e"], "\x18" => [94, "\xe3i"], "\x19" => [76, "\xe3i"], "\x1a" => [104, "\xe3i"], "\x1b" => [16, "\xe3i"], "\x1c" => [94, "\xe3o"], "\x1d" => [76, "\xe3o"], "\x1e" => [104, "\xe3o"], "\x1f" => [16, "\xe3o"], " " => [94, "\xe3s"], "!" => [76, "\xe3s"], "\"" => [104, "\xe3s"], "#" => [16, "\xe3s"], "\$" => [94, "\xe3t"], "%" => [76, "\xe3t"], "&" => [104, "\xe3t"], "'" => [16, "\xe3t"], "(" => [77, "\xe3 "], ")" => [18, "\xe3 "], "*" => [77, "\xe3%"], "+" => [18, "\xe3%"], "," => [77, "\xe3-"], "-" => [18, "\xe3-"], "." => [77, "\xe3."], "/" => [18, "\xe3."], [77, "\xe3/"], [18, "\xe3/"], [77, "\xe33"], [18, "\xe33"], [77, "\xe34"], [18, "\xe34"], [77, "\xe35"], [18, "\xe35"], [77, "\xe36"], [18, "\xe36"], ":" => [77, "\xe37"], ";" => [18, "\xe37"], "<" => [77, "\xe38"], "=" => [18, "\xe38"], ">" => [77, "\xe39"], "?" => [18, "\xe39"], "@" => [77, "\xe3="], "A" => [18, "\xe3="], "B" => [77, "\xe3A"], "C" => [18, "\xe3A"], "D" => [77, "\xe3_"], "E" => [18, "\xe3_"], "F" => [77, "\xe3b"], "G" => [18, "\xe3b"], "H" => [77, "\xe3d"], "I" => [18, "\xe3d"], "J" => [77, "\xe3f"], "K" => [18, "\xe3f"], "L" => [77, "\xe3g"], "M" => [18, "\xe3g"], "N" => [77, "\xe3h"], "O" => [18, "\xe3h"], "P" => [77, "\xe3l"], "Q" => [18, "\xe3l"], "R" => [77, "\xe3m"], "S" => [18, "\xe3m"], "T" => [77, "\xe3n"], "U" => [18, "\xe3n"], "V" => [77, "\xe3p"], "W" => [18, "\xe3p"], "X" => [77, "\xe3r"], "Y" => [18, "\xe3r"], "Z" => [77, "\xe3u"], "[" => [18, "\xe3u"], "\\" => [0, "\xe3:"], "]" => [0, "\xe3B"], "^" => [0, "\xe3C"], "_" => [0, "\xe3D"], "`" => [0, "\xe3E"], "a" => [0, "\xe3F"], "b" => [0, "\xe3G"], "c" => [0, "\xe3H"], "d" => [0, "\xe3I"], "e" => [0, "\xe3J"], "f" => [0, "\xe3K"], "g" => [0, "\xe3L"], "h" => [0, "\xe3M"], "i" => [0, "\xe3N"], "j" => [0, "\xe3O"], "k" => [0, "\xe3P"], "l" => [0, "\xe3Q"], "m" => [0, "\xe3R"], "n" => [0, "\xe3S"], "o" => [0, "\xe3T"], "p" => [0, "\xe3U"], "q" => [0, "\xe3V"], "r" => [0, "\xe3W"], "s" => [0, "\xe3Y"], "t" => [0, "\xe3j"], "u" => [0, "\xe3k"], "v" => [0, "\xe3q"], "w" => [0, "\xe3v"], "x" => [0, "\xe3w"], "y" => [0, "\xe3x"], "z" => [0, "\xe3y"], "{" => [0, "\xe3z"], "|" => [82, "\xe3"], "}" => [87, "\xe3"], "~" => [130, "\xe3"], "" => [9, "\xe3"], "\x80" => [94, "\xe50"], "\x81" => [76, "\xe50"], "\x82" => [104, "\xe50"], "\x83" => [16, "\xe50"], "\x84" => [94, "\xe51"], "\x85" => [76, "\xe51"], "\x86" => [104, "\xe51"], "\x87" => [16, "\xe51"], "\x88" => [94, "\xe52"], "\x89" => [76, "\xe52"], "\x8a" => [104, "\xe52"], "\x8b" => [16, "\xe52"], "\x8c" => [94, "\xe5a"], "\x8d" => [76, "\xe5a"], "\x8e" => [104, "\xe5a"], "\x8f" => [16, "\xe5a"], "\x90" => [94, "\xe5c"], "\x91" => [76, "\xe5c"], "\x92" => [104, "\xe5c"], "\x93" => [16, "\xe5c"], "\x94" => [94, "\xe5e"], "\x95" => [76, "\xe5e"], "\x96" => [104, "\xe5e"], "\x97" => [16, "\xe5e"], "\x98" => [94, "\xe5i"], "\x99" => [76, "\xe5i"], "\x9a" => [104, "\xe5i"], "\x9b" => [16, "\xe5i"], "\x9c" => [94, "\xe5o"], "\x9d" => [76, "\xe5o"], "\x9e" => [104, "\xe5o"], "\x9f" => [16, "\xe5o"], "\xa0" => [94, "\xe5s"], "\xa1" => [76, "\xe5s"], "\xa2" => [104, "\xe5s"], "\xa3" => [16, "\xe5s"], "\xa4" => [94, "\xe5t"], "\xa5" => [76, "\xe5t"], "\xa6" => [104, "\xe5t"], "\xa7" => [16, "\xe5t"], "\xa8" => [77, "\xe5 "], "\xa9" => [18, "\xe5 "], "\xaa" => [77, "\xe5%"], "\xab" => [18, "\xe5%"], "\xac" => [77, "\xe5-"], "\xad" => [18, "\xe5-"], "\xae" => [77, "\xe5."], "\xaf" => [18, "\xe5."], "\xb0" => [77, "\xe5/"], "\xb1" => [18, "\xe5/"], "\xb2" => [77, "\xe53"], "\xb3" => [18, "\xe53"], "\xb4" => [77, "\xe54"], "\xb5" => [18, "\xe54"], "\xb6" => [77, "\xe55"], "\xb7" => [18, "\xe55"], "\xb8" => [77, "\xe56"], "\xb9" => [18, "\xe56"], "\xba" => [77, "\xe57"], "\xbb" => [18, "\xe57"], "\xbc" => [77, "\xe58"], "\xbd" => [18, "\xe58"], "\xbe" => [77, "\xe59"], "\xbf" => [18, "\xe59"], "\xc0" => [77, "\xe5="], "\xc1" => [18, "\xe5="], "\xc2" => [77, "\xe5A"], "\xc3" => [18, "\xe5A"], "\xc4" => [77, "\xe5_"], "\xc5" => [18, "\xe5_"], "\xc6" => [77, "\xe5b"], "\xc7" => [18, "\xe5b"], "\xc8" => [77, "\xe5d"], "\xc9" => [18, "\xe5d"], "\xca" => [77, "\xe5f"], "\xcb" => [18, "\xe5f"], "\xcc" => [77, "\xe5g"], "\xcd" => [18, "\xe5g"], "\xce" => [77, "\xe5h"], "\xcf" => [18, "\xe5h"], "\xd0" => [77, "\xe5l"], "\xd1" => [18, "\xe5l"], "\xd2" => [77, "\xe5m"], "\xd3" => [18, "\xe5m"], "\xd4" => [77, "\xe5n"], "\xd5" => [18, "\xe5n"], "\xd6" => [77, "\xe5p"], "\xd7" => [18, "\xe5p"], "\xd8" => [77, "\xe5r"], "\xd9" => [18, "\xe5r"], "\xda" => [77, "\xe5u"], "\xdb" => [18, "\xe5u"], "\xdc" => [0, "\xe5:"], "\xdd" => [0, "\xe5B"], "\xde" => [0, "\xe5C"], "\xdf" => [0, "\xe5D"], "\xe0" => [0, "\xe5E"], "\xe1" => [0, "\xe5F"], "\xe2" => [0, "\xe5G"], "\xe3" => [0, "\xe5H"], "\xe4" => [0, "\xe5I"], "\xe5" => [0, "\xe5J"], "\xe6" => [0, "\xe5K"], "\xe7" => [0, "\xe5L"], "\xe8" => [0, "\xe5M"], "\xe9" => [0, "\xe5N"], "\xea" => [0, "\xe5O"], "\xeb" => [0, "\xe5P"], "\xec" => [0, "\xe5Q"], "\xed" => [0, "\xe5R"], "\xee" => [0, "\xe5S"], "\xef" => [0, "\xe5T"], "\xf0" => [0, "\xe5U"], "\xf1" => [0, "\xe5V"], "\xf2" => [0, "\xe5W"], "\xf3" => [0, "\xe5Y"], "\xf4" => [0, "\xe5j"], "\xf5" => [0, "\xe5k"], "\xf6" => [0, "\xe5q"], "\xf7" => [0, "\xe5v"], "\xf8" => [0, "\xe5w"], "\xf9" => [0, "\xe5x"], "\xfa" => [0, "\xe5y"], "\xfb" => [0, "\xe5z"], "\xfc" => [82, "\xe5"], "\xfd" => [87, "\xe5"], "\xfe" => [130, "\xe5"], "\xff" => [9, "\xe5"]], ["\x00" => [94, "\xe80"], "\x01" => [76, "\xe80"], "\x02" => [104, "\xe80"], "\x03" => [16, "\xe80"], "\x04" => [94, "\xe81"], "\x05" => [76, "\xe81"], "\x06" => [104, "\xe81"], "\x07" => [16, "\xe81"], "\x08" => [94, "\xe82"], "\t" => [76, "\xe82"], "\n" => [104, "\xe82"], "\v" => [16, "\xe82"], "\f" => [94, "\xe8a"], "\r" => [76, "\xe8a"], "\x0e" => [104, "\xe8a"], "\x0f" => [16, "\xe8a"], "\x10" => [94, "\xe8c"], "\x11" => [76, "\xe8c"], "\x12" => [104, "\xe8c"], "\x13" => [16, "\xe8c"], "\x14" => [94, "\xe8e"], "\x15" => [76, "\xe8e"], "\x16" => [104, "\xe8e"], "\x17" => [16, "\xe8e"], "\x18" => [94, "\xe8i"], "\x19" => [76, "\xe8i"], "\x1a" => [104, "\xe8i"], "\x1b" => [16, "\xe8i"], "\x1c" => [94, "\xe8o"], "\x1d" => [76, "\xe8o"], "\x1e" => [104, "\xe8o"], "\x1f" => [16, "\xe8o"], " " => [94, "\xe8s"], "!" => [76, "\xe8s"], "\"" => [104, "\xe8s"], "#" => [16, "\xe8s"], "\$" => [94, "\xe8t"], "%" => [76, "\xe8t"], "&" => [104, "\xe8t"], "'" => [16, "\xe8t"], "(" => [77, "\xe8 "], ")" => [18, "\xe8 "], "*" => [77, "\xe8%"], "+" => [18, "\xe8%"], "," => [77, "\xe8-"], "-" => [18, "\xe8-"], "." => [77, "\xe8."], "/" => [18, "\xe8."], [77, "\xe8/"], [18, "\xe8/"], [77, "\xe83"], [18, "\xe83"], [77, "\xe84"], [18, "\xe84"], [77, "\xe85"], [18, "\xe85"], [77, "\xe86"], [18, "\xe86"], ":" => [77, "\xe87"], ";" => [18, "\xe87"], "<" => [77, "\xe88"], "=" => [18, "\xe88"], ">" => [77, "\xe89"], "?" => [18, "\xe89"], "@" => [77, "\xe8="], "A" => [18, "\xe8="], "B" => [77, "\xe8A"], "C" => [18, "\xe8A"], "D" => [77, "\xe8_"], "E" => [18, "\xe8_"], "F" => [77, "\xe8b"], "G" => [18, "\xe8b"], "H" => [77, "\xe8d"], "I" => [18, "\xe8d"], "J" => [77, "\xe8f"], "K" => [18, "\xe8f"], "L" => [77, "\xe8g"], "M" => [18, "\xe8g"], "N" => [77, "\xe8h"], "O" => [18, "\xe8h"], "P" => [77, "\xe8l"], "Q" => [18, "\xe8l"], "R" => [77, "\xe8m"], "S" => [18, "\xe8m"], "T" => [77, "\xe8n"], "U" => [18, "\xe8n"], "V" => [77, "\xe8p"], "W" => [18, "\xe8p"], "X" => [77, "\xe8r"], "Y" => [18, "\xe8r"], "Z" => [77, "\xe8u"], "[" => [18, "\xe8u"], "\\" => [0, "\xe8:"], "]" => [0, "\xe8B"], "^" => [0, "\xe8C"], "_" => [0, "\xe8D"], "`" => [0, "\xe8E"], "a" => [0, "\xe8F"], "b" => [0, "\xe8G"], "c" => [0, "\xe8H"], "d" => [0, "\xe8I"], "e" => [0, "\xe8J"], "f" => [0, "\xe8K"], "g" => [0, "\xe8L"], "h" => [0, "\xe8M"], "i" => [0, "\xe8N"], "j" => [0, "\xe8O"], "k" => [0, "\xe8P"], "l" => [0, "\xe8Q"], "m" => [0, "\xe8R"], "n" => [0, "\xe8S"], "o" => [0, "\xe8T"], "p" => [0, "\xe8U"], "q" => [0, "\xe8V"], "r" => [0, "\xe8W"], "s" => [0, "\xe8Y"], "t" => [0, "\xe8j"], "u" => [0, "\xe8k"], "v" => [0, "\xe8q"], "w" => [0, "\xe8v"], "x" => [0, "\xe8w"], "y" => [0, "\xe8x"], "z" => [0, "\xe8y"], "{" => [0, "\xe8z"], "|" => [82, "\xe8"], "}" => [87, "\xe8"], "~" => [130, "\xe8"], "" => [9, "\xe8"], "\x80" => [94, "\xe90"], "\x81" => [76, "\xe90"], "\x82" => [104, "\xe90"], "\x83" => [16, "\xe90"], "\x84" => [94, "\xe91"], "\x85" => [76, "\xe91"], "\x86" => [104, "\xe91"], "\x87" => [16, "\xe91"], "\x88" => [94, "\xe92"], "\x89" => [76, "\xe92"], "\x8a" => [104, "\xe92"], "\x8b" => [16, "\xe92"], "\x8c" => [94, "\xe9a"], "\x8d" => [76, "\xe9a"], "\x8e" => [104, "\xe9a"], "\x8f" => [16, "\xe9a"], "\x90" => [94, "\xe9c"], "\x91" => [76, "\xe9c"], "\x92" => [104, "\xe9c"], "\x93" => [16, "\xe9c"], "\x94" => [94, "\xe9e"], "\x95" => [76, "\xe9e"], "\x96" => [104, "\xe9e"], "\x97" => [16, "\xe9e"], "\x98" => [94, "\xe9i"], "\x99" => [76, "\xe9i"], "\x9a" => [104, "\xe9i"], "\x9b" => [16, "\xe9i"], "\x9c" => [94, "\xe9o"], "\x9d" => [76, "\xe9o"], "\x9e" => [104, "\xe9o"], "\x9f" => [16, "\xe9o"], "\xa0" => [94, "\xe9s"], "\xa1" => [76, "\xe9s"], "\xa2" => [104, "\xe9s"], "\xa3" => [16, "\xe9s"], "\xa4" => [94, "\xe9t"], "\xa5" => [76, "\xe9t"], "\xa6" => [104, "\xe9t"], "\xa7" => [16, "\xe9t"], "\xa8" => [77, "\xe9 "], "\xa9" => [18, "\xe9 "], "\xaa" => [77, "\xe9%"], "\xab" => [18, "\xe9%"], "\xac" => [77, "\xe9-"], "\xad" => [18, "\xe9-"], "\xae" => [77, "\xe9."], "\xaf" => [18, "\xe9."], "\xb0" => [77, "\xe9/"], "\xb1" => [18, "\xe9/"], "\xb2" => [77, "\xe93"], "\xb3" => [18, "\xe93"], "\xb4" => [77, "\xe94"], "\xb5" => [18, "\xe94"], "\xb6" => [77, "\xe95"], "\xb7" => [18, "\xe95"], "\xb8" => [77, "\xe96"], "\xb9" => [18, "\xe96"], "\xba" => [77, "\xe97"], "\xbb" => [18, "\xe97"], "\xbc" => [77, "\xe98"], "\xbd" => [18, "\xe98"], "\xbe" => [77, "\xe99"], "\xbf" => [18, "\xe99"], "\xc0" => [77, "\xe9="], "\xc1" => [18, "\xe9="], "\xc2" => [77, "\xe9A"], "\xc3" => [18, "\xe9A"], "\xc4" => [77, "\xe9_"], "\xc5" => [18, "\xe9_"], "\xc6" => [77, "\xe9b"], "\xc7" => [18, "\xe9b"], "\xc8" => [77, "\xe9d"], "\xc9" => [18, "\xe9d"], "\xca" => [77, "\xe9f"], "\xcb" => [18, "\xe9f"], "\xcc" => [77, "\xe9g"], "\xcd" => [18, "\xe9g"], "\xce" => [77, "\xe9h"], "\xcf" => [18, "\xe9h"], "\xd0" => [77, "\xe9l"], "\xd1" => [18, "\xe9l"], "\xd2" => [77, "\xe9m"], "\xd3" => [18, "\xe9m"], "\xd4" => [77, "\xe9n"], "\xd5" => [18, "\xe9n"], "\xd6" => [77, "\xe9p"], "\xd7" => [18, "\xe9p"], "\xd8" => [77, "\xe9r"], "\xd9" => [18, "\xe9r"], "\xda" => [77, "\xe9u"], "\xdb" => [18, "\xe9u"], "\xdc" => [0, "\xe9:"], "\xdd" => [0, "\xe9B"], "\xde" => [0, "\xe9C"], "\xdf" => [0, "\xe9D"], "\xe0" => [0, "\xe9E"], "\xe1" => [0, "\xe9F"], "\xe2" => [0, "\xe9G"], "\xe3" => [0, "\xe9H"], "\xe4" => [0, "\xe9I"], "\xe5" => [0, "\xe9J"], "\xe6" => [0, "\xe9K"], "\xe7" => [0, "\xe9L"], "\xe8" => [0, "\xe9M"], "\xe9" => [0, "\xe9N"], "\xea" => [0, "\xe9O"], "\xeb" => [0, "\xe9P"], "\xec" => [0, "\xe9Q"], "\xed" => [0, "\xe9R"], "\xee" => [0, "\xe9S"], "\xef" => [0, "\xe9T"], "\xf0" => [0, "\xe9U"], "\xf1" => [0, "\xe9V"], "\xf2" => [0, "\xe9W"], "\xf3" => [0, "\xe9Y"], "\xf4" => [0, "\xe9j"], "\xf5" => [0, "\xe9k"], "\xf6" => [0, "\xe9q"], "\xf7" => [0, "\xe9v"], "\xf8" => [0, "\xe9w"], "\xf9" => [0, "\xe9x"], "\xfa" => [0, "\xe9y"], "\xfb" => [0, "\xe9z"], "\xfc" => [82, "\xe9"], "\xfd" => [87, "\xe9"], "\xfe" => [130, "\xe9"], "\xff" => [9, "\xe9"]], ["\x00" => [94, "\xea0"], "\x01" => [76, "\xea0"], "\x02" => [104, "\xea0"], "\x03" => [16, "\xea0"], "\x04" => [94, "\xea1"], "\x05" => [76, "\xea1"], "\x06" => [104, "\xea1"], "\x07" => [16, "\xea1"], "\x08" => [94, "\xea2"], "\t" => [76, "\xea2"], "\n" => [104, "\xea2"], "\v" => [16, "\xea2"], "\f" => [94, "\xeaa"], "\r" => [76, "\xeaa"], "\x0e" => [104, "\xeaa"], "\x0f" => [16, "\xeaa"], "\x10" => [94, "\xeac"], "\x11" => [76, "\xeac"], "\x12" => [104, "\xeac"], "\x13" => [16, "\xeac"], "\x14" => [94, "\xeae"], "\x15" => [76, "\xeae"], "\x16" => [104, "\xeae"], "\x17" => [16, "\xeae"], "\x18" => [94, "\xeai"], "\x19" => [76, "\xeai"], "\x1a" => [104, "\xeai"], "\x1b" => [16, "\xeai"], "\x1c" => [94, "\xeao"], "\x1d" => [76, "\xeao"], "\x1e" => [104, "\xeao"], "\x1f" => [16, "\xeao"], " " => [94, "\xeas"], "!" => [76, "\xeas"], "\"" => [104, "\xeas"], "#" => [16, "\xeas"], "\$" => [94, "\xeat"], "%" => [76, "\xeat"], "&" => [104, "\xeat"], "'" => [16, "\xeat"], "(" => [77, "\xea "], ")" => [18, "\xea "], "*" => [77, "\xea%"], "+" => [18, "\xea%"], "," => [77, "\xea-"], "-" => [18, "\xea-"], "." => [77, "\xea."], "/" => [18, "\xea."], [77, "\xea/"], [18, "\xea/"], [77, "\xea3"], [18, "\xea3"], [77, "\xea4"], [18, "\xea4"], [77, "\xea5"], [18, "\xea5"], [77, "\xea6"], [18, "\xea6"], ":" => [77, "\xea7"], ";" => [18, "\xea7"], "<" => [77, "\xea8"], "=" => [18, "\xea8"], ">" => [77, "\xea9"], "?" => [18, "\xea9"], "@" => [77, "\xea="], "A" => [18, "\xea="], "B" => [77, "\xeaA"], "C" => [18, "\xeaA"], "D" => [77, "\xea_"], "E" => [18, "\xea_"], "F" => [77, "\xeab"], "G" => [18, "\xeab"], "H" => [77, "\xead"], "I" => [18, "\xead"], "J" => [77, "\xeaf"], "K" => [18, "\xeaf"], "L" => [77, "\xeag"], "M" => [18, "\xeag"], "N" => [77, "\xeah"], "O" => [18, "\xeah"], "P" => [77, "\xeal"], "Q" => [18, "\xeal"], "R" => [77, "\xeam"], "S" => [18, "\xeam"], "T" => [77, "\xean"], "U" => [18, "\xean"], "V" => [77, "\xeap"], "W" => [18, "\xeap"], "X" => [77, "\xear"], "Y" => [18, "\xear"], "Z" => [77, "\xeau"], "[" => [18, "\xeau"], "\\" => [0, "\xea:"], "]" => [0, "\xeaB"], "^" => [0, "\xeaC"], "_" => [0, "\xeaD"], "`" => [0, "\xeaE"], "a" => [0, "\xeaF"], "b" => [0, "\xeaG"], "c" => [0, "\xeaH"], "d" => [0, "\xeaI"], "e" => [0, "\xeaJ"], "f" => [0, "\xeaK"], "g" => [0, "\xeaL"], "h" => [0, "\xeaM"], "i" => [0, "\xeaN"], "j" => [0, "\xeaO"], "k" => [0, "\xeaP"], "l" => [0, "\xeaQ"], "m" => [0, "\xeaR"], "n" => [0, "\xeaS"], "o" => [0, "\xeaT"], "p" => [0, "\xeaU"], "q" => [0, "\xeaV"], "r" => [0, "\xeaW"], "s" => [0, "\xeaY"], "t" => [0, "\xeaj"], "u" => [0, "\xeak"], "v" => [0, "\xeaq"], "w" => [0, "\xeav"], "x" => [0, "\xeaw"], "y" => [0, "\xeax"], "z" => [0, "\xeay"], "{" => [0, "\xeaz"], "|" => [82, "\xea"], "}" => [87, "\xea"], "~" => [130, "\xea"], "" => [9, "\xea"], "\x80" => [94, "\xeb0"], "\x81" => [76, "\xeb0"], "\x82" => [104, "\xeb0"], "\x83" => [16, "\xeb0"], "\x84" => [94, "\xeb1"], "\x85" => [76, "\xeb1"], "\x86" => [104, "\xeb1"], "\x87" => [16, "\xeb1"], "\x88" => [94, "\xeb2"], "\x89" => [76, "\xeb2"], "\x8a" => [104, "\xeb2"], "\x8b" => [16, "\xeb2"], "\x8c" => [94, "\xeba"], "\x8d" => [76, "\xeba"], "\x8e" => [104, "\xeba"], "\x8f" => [16, "\xeba"], "\x90" => [94, "\xebc"], "\x91" => [76, "\xebc"], "\x92" => [104, "\xebc"], "\x93" => [16, "\xebc"], "\x94" => [94, "\xebe"], "\x95" => [76, "\xebe"], "\x96" => [104, "\xebe"], "\x97" => [16, "\xebe"], "\x98" => [94, "\xebi"], "\x99" => [76, "\xebi"], "\x9a" => [104, "\xebi"], "\x9b" => [16, "\xebi"], "\x9c" => [94, "\xebo"], "\x9d" => [76, "\xebo"], "\x9e" => [104, "\xebo"], "\x9f" => [16, "\xebo"], "\xa0" => [94, "\xebs"], "\xa1" => [76, "\xebs"], "\xa2" => [104, "\xebs"], "\xa3" => [16, "\xebs"], "\xa4" => [94, "\xebt"], "\xa5" => [76, "\xebt"], "\xa6" => [104, "\xebt"], "\xa7" => [16, "\xebt"], "\xa8" => [77, "\xeb "], "\xa9" => [18, "\xeb "], "\xaa" => [77, "\xeb%"], "\xab" => [18, "\xeb%"], "\xac" => [77, "\xeb-"], "\xad" => [18, "\xeb-"], "\xae" => [77, "\xeb."], "\xaf" => [18, "\xeb."], "\xb0" => [77, "\xeb/"], "\xb1" => [18, "\xeb/"], "\xb2" => [77, "\xeb3"], "\xb3" => [18, "\xeb3"], "\xb4" => [77, "\xeb4"], "\xb5" => [18, "\xeb4"], "\xb6" => [77, "\xeb5"], "\xb7" => [18, "\xeb5"], "\xb8" => [77, "\xeb6"], "\xb9" => [18, "\xeb6"], "\xba" => [77, "\xeb7"], "\xbb" => [18, "\xeb7"], "\xbc" => [77, "\xeb8"], "\xbd" => [18, "\xeb8"], "\xbe" => [77, "\xeb9"], "\xbf" => [18, "\xeb9"], "\xc0" => [77, "\xeb="], "\xc1" => [18, "\xeb="], "\xc2" => [77, "\xebA"], "\xc3" => [18, "\xebA"], "\xc4" => [77, "\xeb_"], "\xc5" => [18, "\xeb_"], "\xc6" => [77, "\xebb"], "\xc7" => [18, "\xebb"], "\xc8" => [77, "\xebd"], "\xc9" => [18, "\xebd"], "\xca" => [77, "\xebf"], "\xcb" => [18, "\xebf"], "\xcc" => [77, "\xebg"], "\xcd" => [18, "\xebg"], "\xce" => [77, "\xebh"], "\xcf" => [18, "\xebh"], "\xd0" => [77, "\xebl"], "\xd1" => [18, "\xebl"], "\xd2" => [77, "\xebm"], "\xd3" => [18, "\xebm"], "\xd4" => [77, "\xebn"], "\xd5" => [18, "\xebn"], "\xd6" => [77, "\xebp"], "\xd7" => [18, "\xebp"], "\xd8" => [77, "\xebr"], "\xd9" => [18, "\xebr"], "\xda" => [77, "\xebu"], "\xdb" => [18, "\xebu"], "\xdc" => [0, "\xeb:"], "\xdd" => [0, "\xebB"], "\xde" => [0, "\xebC"], "\xdf" => [0, "\xebD"], "\xe0" => [0, "\xebE"], "\xe1" => [0, "\xebF"], "\xe2" => [0, "\xebG"], "\xe3" => [0, "\xebH"], "\xe4" => [0, "\xebI"], "\xe5" => [0, "\xebJ"], "\xe6" => [0, "\xebK"], "\xe7" => [0, "\xebL"], "\xe8" => [0, "\xebM"], "\xe9" => [0, "\xebN"], "\xea" => [0, "\xebO"], "\xeb" => [0, "\xebP"], "\xec" => [0, "\xebQ"], "\xed" => [0, "\xebR"], "\xee" => [0, "\xebS"], "\xef" => [0, "\xebT"], "\xf0" => [0, "\xebU"], "\xf1" => [0, "\xebV"], "\xf2" => [0, "\xebW"], "\xf3" => [0, "\xebY"], "\xf4" => [0, "\xebj"], "\xf5" => [0, "\xebk"], "\xf6" => [0, "\xebq"], "\xf7" => [0, "\xebv"], "\xf8" => [0, "\xebw"], "\xf9" => [0, "\xebx"], "\xfa" => [0, "\xeby"], "\xfb" => [0, "\xebz"], "\xfc" => [82, "\xeb"], "\xfd" => [87, "\xeb"], "\xfe" => [130, "\xeb"], "\xff" => [9, "\xeb"]], ["\x00" => [94, "\xec0"], "\x01" => [76, "\xec0"], "\x02" => [104, "\xec0"], "\x03" => [16, "\xec0"], "\x04" => [94, "\xec1"], "\x05" => [76, "\xec1"], "\x06" => [104, "\xec1"], "\x07" => [16, "\xec1"], "\x08" => [94, "\xec2"], "\t" => [76, "\xec2"], "\n" => [104, "\xec2"], "\v" => [16, "\xec2"], "\f" => [94, "\xeca"], "\r" => [76, "\xeca"], "\x0e" => [104, "\xeca"], "\x0f" => [16, "\xeca"], "\x10" => [94, "\xecc"], "\x11" => [76, "\xecc"], "\x12" => [104, "\xecc"], "\x13" => [16, "\xecc"], "\x14" => [94, "\xece"], "\x15" => [76, "\xece"], "\x16" => [104, "\xece"], "\x17" => [16, "\xece"], "\x18" => [94, "\xeci"], "\x19" => [76, "\xeci"], "\x1a" => [104, "\xeci"], "\x1b" => [16, "\xeci"], "\x1c" => [94, "\xeco"], "\x1d" => [76, "\xeco"], "\x1e" => [104, "\xeco"], "\x1f" => [16, "\xeco"], " " => [94, "\xecs"], "!" => [76, "\xecs"], "\"" => [104, "\xecs"], "#" => [16, "\xecs"], "\$" => [94, "\xect"], "%" => [76, "\xect"], "&" => [104, "\xect"], "'" => [16, "\xect"], "(" => [77, "\xec "], ")" => [18, "\xec "], "*" => [77, "\xec%"], "+" => [18, "\xec%"], "," => [77, "\xec-"], "-" => [18, "\xec-"], "." => [77, "\xec."], "/" => [18, "\xec."], [77, "\xec/"], [18, "\xec/"], [77, "\xec3"], [18, "\xec3"], [77, "\xec4"], [18, "\xec4"], [77, "\xec5"], [18, "\xec5"], [77, "\xec6"], [18, "\xec6"], ":" => [77, "\xec7"], ";" => [18, "\xec7"], "<" => [77, "\xec8"], "=" => [18, "\xec8"], ">" => [77, "\xec9"], "?" => [18, "\xec9"], "@" => [77, "\xec="], "A" => [18, "\xec="], "B" => [77, "\xecA"], "C" => [18, "\xecA"], "D" => [77, "\xec_"], "E" => [18, "\xec_"], "F" => [77, "\xecb"], "G" => [18, "\xecb"], "H" => [77, "\xecd"], "I" => [18, "\xecd"], "J" => [77, "\xecf"], "K" => [18, "\xecf"], "L" => [77, "\xecg"], "M" => [18, "\xecg"], "N" => [77, "\xech"], "O" => [18, "\xech"], "P" => [77, "\xecl"], "Q" => [18, "\xecl"], "R" => [77, "\xecm"], "S" => [18, "\xecm"], "T" => [77, "\xecn"], "U" => [18, "\xecn"], "V" => [77, "\xecp"], "W" => [18, "\xecp"], "X" => [77, "\xecr"], "Y" => [18, "\xecr"], "Z" => [77, "\xecu"], "[" => [18, "\xecu"], "\\" => [0, "\xec:"], "]" => [0, "\xecB"], "^" => [0, "\xecC"], "_" => [0, "\xecD"], "`" => [0, "\xecE"], "a" => [0, "\xecF"], "b" => [0, "\xecG"], "c" => [0, "\xecH"], "d" => [0, "\xecI"], "e" => [0, "\xecJ"], "f" => [0, "\xecK"], "g" => [0, "\xecL"], "h" => [0, "\xecM"], "i" => [0, "\xecN"], "j" => [0, "\xecO"], "k" => [0, "\xecP"], "l" => [0, "\xecQ"], "m" => [0, "\xecR"], "n" => [0, "\xecS"], "o" => [0, "\xecT"], "p" => [0, "\xecU"], "q" => [0, "\xecV"], "r" => [0, "\xecW"], "s" => [0, "\xecY"], "t" => [0, "\xecj"], "u" => [0, "\xeck"], "v" => [0, "\xecq"], "w" => [0, "\xecv"], "x" => [0, "\xecw"], "y" => [0, "\xecx"], "z" => [0, "\xecy"], "{" => [0, "\xecz"], "|" => [82, "\xec"], "}" => [87, "\xec"], "~" => [130, "\xec"], "" => [9, "\xec"], "\x80" => [94, "\xed0"], "\x81" => [76, "\xed0"], "\x82" => [104, "\xed0"], "\x83" => [16, "\xed0"], "\x84" => [94, "\xed1"], "\x85" => [76, "\xed1"], "\x86" => [104, "\xed1"], "\x87" => [16, "\xed1"], "\x88" => [94, "\xed2"], "\x89" => [76, "\xed2"], "\x8a" => [104, "\xed2"], "\x8b" => [16, "\xed2"], "\x8c" => [94, "\xeda"], "\x8d" => [76, "\xeda"], "\x8e" => [104, "\xeda"], "\x8f" => [16, "\xeda"], "\x90" => [94, "\xedc"], "\x91" => [76, "\xedc"], "\x92" => [104, "\xedc"], "\x93" => [16, "\xedc"], "\x94" => [94, "\xede"], "\x95" => [76, "\xede"], "\x96" => [104, "\xede"], "\x97" => [16, "\xede"], "\x98" => [94, "\xedi"], "\x99" => [76, "\xedi"], "\x9a" => [104, "\xedi"], "\x9b" => [16, "\xedi"], "\x9c" => [94, "\xedo"], "\x9d" => [76, "\xedo"], "\x9e" => [104, "\xedo"], "\x9f" => [16, "\xedo"], "\xa0" => [94, "\xeds"], "\xa1" => [76, "\xeds"], "\xa2" => [104, "\xeds"], "\xa3" => [16, "\xeds"], "\xa4" => [94, "\xedt"], "\xa5" => [76, "\xedt"], "\xa6" => [104, "\xedt"], "\xa7" => [16, "\xedt"], "\xa8" => [77, "\xed "], "\xa9" => [18, "\xed "], "\xaa" => [77, "\xed%"], "\xab" => [18, "\xed%"], "\xac" => [77, "\xed-"], "\xad" => [18, "\xed-"], "\xae" => [77, "\xed."], "\xaf" => [18, "\xed."], "\xb0" => [77, "\xed/"], "\xb1" => [18, "\xed/"], "\xb2" => [77, "\xed3"], "\xb3" => [18, "\xed3"], "\xb4" => [77, "\xed4"], "\xb5" => [18, "\xed4"], "\xb6" => [77, "\xed5"], "\xb7" => [18, "\xed5"], "\xb8" => [77, "\xed6"], "\xb9" => [18, "\xed6"], "\xba" => [77, "\xed7"], "\xbb" => [18, "\xed7"], "\xbc" => [77, "\xed8"], "\xbd" => [18, "\xed8"], "\xbe" => [77, "\xed9"], "\xbf" => [18, "\xed9"], "\xc0" => [77, "\xed="], "\xc1" => [18, "\xed="], "\xc2" => [77, "\xedA"], "\xc3" => [18, "\xedA"], "\xc4" => [77, "\xed_"], "\xc5" => [18, "\xed_"], "\xc6" => [77, "\xedb"], "\xc7" => [18, "\xedb"], "\xc8" => [77, "\xedd"], "\xc9" => [18, "\xedd"], "\xca" => [77, "\xedf"], "\xcb" => [18, "\xedf"], "\xcc" => [77, "\xedg"], "\xcd" => [18, "\xedg"], "\xce" => [77, "\xedh"], "\xcf" => [18, "\xedh"], "\xd0" => [77, "\xedl"], "\xd1" => [18, "\xedl"], "\xd2" => [77, "\xedm"], "\xd3" => [18, "\xedm"], "\xd4" => [77, "\xedn"], "\xd5" => [18, "\xedn"], "\xd6" => [77, "\xedp"], "\xd7" => [18, "\xedp"], "\xd8" => [77, "\xedr"], "\xd9" => [18, "\xedr"], "\xda" => [77, "\xedu"], "\xdb" => [18, "\xedu"], "\xdc" => [0, "\xed:"], "\xdd" => [0, "\xedB"], "\xde" => [0, "\xedC"], "\xdf" => [0, "\xedD"], "\xe0" => [0, "\xedE"], "\xe1" => [0, "\xedF"], "\xe2" => [0, "\xedG"], "\xe3" => [0, "\xedH"], "\xe4" => [0, "\xedI"], "\xe5" => [0, "\xedJ"], "\xe6" => [0, "\xedK"], "\xe7" => [0, "\xedL"], "\xe8" => [0, "\xedM"], "\xe9" => [0, "\xedN"], "\xea" => [0, "\xedO"], "\xeb" => [0, "\xedP"], "\xec" => [0, "\xedQ"], "\xed" => [0, "\xedR"], "\xee" => [0, "\xedS"], "\xef" => [0, "\xedT"], "\xf0" => [0, "\xedU"], "\xf1" => [0, "\xedV"], "\xf2" => [0, "\xedW"], "\xf3" => [0, "\xedY"], "\xf4" => [0, "\xedj"], "\xf5" => [0, "\xedk"], "\xf6" => [0, "\xedq"], "\xf7" => [0, "\xedv"], "\xf8" => [0, "\xedw"], "\xf9" => [0, "\xedx"], "\xfa" => [0, "\xedy"], "\xfb" => [0, "\xedz"], "\xfc" => [82, "\xed"], "\xfd" => [87, "\xed"], "\xfe" => [130, "\xed"], "\xff" => [9, "\xed"]], ["\x00" => [94, "\xee0"], "\x01" => [76, "\xee0"], "\x02" => [104, "\xee0"], "\x03" => [16, "\xee0"], "\x04" => [94, "\xee1"], "\x05" => [76, "\xee1"], "\x06" => [104, "\xee1"], "\x07" => [16, "\xee1"], "\x08" => [94, "\xee2"], "\t" => [76, "\xee2"], "\n" => [104, "\xee2"], "\v" => [16, "\xee2"], "\f" => [94, "\xeea"], "\r" => [76, "\xeea"], "\x0e" => [104, "\xeea"], "\x0f" => [16, "\xeea"], "\x10" => [94, "\xeec"], "\x11" => [76, "\xeec"], "\x12" => [104, "\xeec"], "\x13" => [16, "\xeec"], "\x14" => [94, "\xeee"], "\x15" => [76, "\xeee"], "\x16" => [104, "\xeee"], "\x17" => [16, "\xeee"], "\x18" => [94, "\xeei"], "\x19" => [76, "\xeei"], "\x1a" => [104, "\xeei"], "\x1b" => [16, "\xeei"], "\x1c" => [94, "\xeeo"], "\x1d" => [76, "\xeeo"], "\x1e" => [104, "\xeeo"], "\x1f" => [16, "\xeeo"], " " => [94, "\xees"], "!" => [76, "\xees"], "\"" => [104, "\xees"], "#" => [16, "\xees"], "\$" => [94, "\xeet"], "%" => [76, "\xeet"], "&" => [104, "\xeet"], "'" => [16, "\xeet"], "(" => [77, "\xee "], ")" => [18, "\xee "], "*" => [77, "\xee%"], "+" => [18, "\xee%"], "," => [77, "\xee-"], "-" => [18, "\xee-"], "." => [77, "\xee."], "/" => [18, "\xee."], [77, "\xee/"], [18, "\xee/"], [77, "\xee3"], [18, "\xee3"], [77, "\xee4"], [18, "\xee4"], [77, "\xee5"], [18, "\xee5"], [77, "\xee6"], [18, "\xee6"], ":" => [77, "\xee7"], ";" => [18, "\xee7"], "<" => [77, "\xee8"], "=" => [18, "\xee8"], ">" => [77, "\xee9"], "?" => [18, "\xee9"], "@" => [77, "\xee="], "A" => [18, "\xee="], "B" => [77, "\xeeA"], "C" => [18, "\xeeA"], "D" => [77, "\xee_"], "E" => [18, "\xee_"], "F" => [77, "\xeeb"], "G" => [18, "\xeeb"], "H" => [77, "\xeed"], "I" => [18, "\xeed"], "J" => [77, "\xeef"], "K" => [18, "\xeef"], "L" => [77, "\xeeg"], "M" => [18, "\xeeg"], "N" => [77, "\xeeh"], "O" => [18, "\xeeh"], "P" => [77, "\xeel"], "Q" => [18, "\xeel"], "R" => [77, "\xeem"], "S" => [18, "\xeem"], "T" => [77, "\xeen"], "U" => [18, "\xeen"], "V" => [77, "\xeep"], "W" => [18, "\xeep"], "X" => [77, "\xeer"], "Y" => [18, "\xeer"], "Z" => [77, "\xeeu"], "[" => [18, "\xeeu"], "\\" => [0, "\xee:"], "]" => [0, "\xeeB"], "^" => [0, "\xeeC"], "_" => [0, "\xeeD"], "`" => [0, "\xeeE"], "a" => [0, "\xeeF"], "b" => [0, "\xeeG"], "c" => [0, "\xeeH"], "d" => [0, "\xeeI"], "e" => [0, "\xeeJ"], "f" => [0, "\xeeK"], "g" => [0, "\xeeL"], "h" => [0, "\xeeM"], "i" => [0, "\xeeN"], "j" => [0, "\xeeO"], "k" => [0, "\xeeP"], "l" => [0, "\xeeQ"], "m" => [0, "\xeeR"], "n" => [0, "\xeeS"], "o" => [0, "\xeeT"], "p" => [0, "\xeeU"], "q" => [0, "\xeeV"], "r" => [0, "\xeeW"], "s" => [0, "\xeeY"], "t" => [0, "\xeej"], "u" => [0, "\xeek"], "v" => [0, "\xeeq"], "w" => [0, "\xeev"], "x" => [0, "\xeew"], "y" => [0, "\xeex"], "z" => [0, "\xeey"], "{" => [0, "\xeez"], "|" => [82, "\xee"], "}" => [87, "\xee"], "~" => [130, "\xee"], "" => [9, "\xee"], "\x80" => [94, "\xf00"], "\x81" => [76, "\xf00"], "\x82" => [104, "\xf00"], "\x83" => [16, "\xf00"], "\x84" => [94, "\xf01"], "\x85" => [76, "\xf01"], "\x86" => [104, "\xf01"], "\x87" => [16, "\xf01"], "\x88" => [94, "\xf02"], "\x89" => [76, "\xf02"], "\x8a" => [104, "\xf02"], "\x8b" => [16, "\xf02"], "\x8c" => [94, "\xf0a"], "\x8d" => [76, "\xf0a"], "\x8e" => [104, "\xf0a"], "\x8f" => [16, "\xf0a"], "\x90" => [94, "\xf0c"], "\x91" => [76, "\xf0c"], "\x92" => [104, "\xf0c"], "\x93" => [16, "\xf0c"], "\x94" => [94, "\xf0e"], "\x95" => [76, "\xf0e"], "\x96" => [104, "\xf0e"], "\x97" => [16, "\xf0e"], "\x98" => [94, "\xf0i"], "\x99" => [76, "\xf0i"], "\x9a" => [104, "\xf0i"], "\x9b" => [16, "\xf0i"], "\x9c" => [94, "\xf0o"], "\x9d" => [76, "\xf0o"], "\x9e" => [104, "\xf0o"], "\x9f" => [16, "\xf0o"], "\xa0" => [94, "\xf0s"], "\xa1" => [76, "\xf0s"], "\xa2" => [104, "\xf0s"], "\xa3" => [16, "\xf0s"], "\xa4" => [94, "\xf0t"], "\xa5" => [76, "\xf0t"], "\xa6" => [104, "\xf0t"], "\xa7" => [16, "\xf0t"], "\xa8" => [77, "\xf0 "], "\xa9" => [18, "\xf0 "], "\xaa" => [77, "\xf0%"], "\xab" => [18, "\xf0%"], "\xac" => [77, "\xf0-"], "\xad" => [18, "\xf0-"], "\xae" => [77, "\xf0."], "\xaf" => [18, "\xf0."], "\xb0" => [77, "\xf0/"], "\xb1" => [18, "\xf0/"], "\xb2" => [77, "\xf03"], "\xb3" => [18, "\xf03"], "\xb4" => [77, "\xf04"], "\xb5" => [18, "\xf04"], "\xb6" => [77, "\xf05"], "\xb7" => [18, "\xf05"], "\xb8" => [77, "\xf06"], "\xb9" => [18, "\xf06"], "\xba" => [77, "\xf07"], "\xbb" => [18, "\xf07"], "\xbc" => [77, "\xf08"], "\xbd" => [18, "\xf08"], "\xbe" => [77, "\xf09"], "\xbf" => [18, "\xf09"], "\xc0" => [77, "\xf0="], "\xc1" => [18, "\xf0="], "\xc2" => [77, "\xf0A"], "\xc3" => [18, "\xf0A"], "\xc4" => [77, "\xf0_"], "\xc5" => [18, "\xf0_"], "\xc6" => [77, "\xf0b"], "\xc7" => [18, "\xf0b"], "\xc8" => [77, "\xf0d"], "\xc9" => [18, "\xf0d"], "\xca" => [77, "\xf0f"], "\xcb" => [18, "\xf0f"], "\xcc" => [77, "\xf0g"], "\xcd" => [18, "\xf0g"], "\xce" => [77, "\xf0h"], "\xcf" => [18, "\xf0h"], "\xd0" => [77, "\xf0l"], "\xd1" => [18, "\xf0l"], "\xd2" => [77, "\xf0m"], "\xd3" => [18, "\xf0m"], "\xd4" => [77, "\xf0n"], "\xd5" => [18, "\xf0n"], "\xd6" => [77, "\xf0p"], "\xd7" => [18, "\xf0p"], "\xd8" => [77, "\xf0r"], "\xd9" => [18, "\xf0r"], "\xda" => [77, "\xf0u"], "\xdb" => [18, "\xf0u"], "\xdc" => [0, "\xf0:"], "\xdd" => [0, "\xf0B"], "\xde" => [0, "\xf0C"], "\xdf" => [0, "\xf0D"], "\xe0" => [0, "\xf0E"], "\xe1" => [0, "\xf0F"], "\xe2" => [0, "\xf0G"], "\xe3" => [0, "\xf0H"], "\xe4" => [0, "\xf0I"], "\xe5" => [0, "\xf0J"], "\xe6" => [0, "\xf0K"], "\xe7" => [0, "\xf0L"], "\xe8" => [0, "\xf0M"], "\xe9" => [0, "\xf0N"], "\xea" => [0, "\xf0O"], "\xeb" => [0, "\xf0P"], "\xec" => [0, "\xf0Q"], "\xed" => [0, "\xf0R"], "\xee" => [0, "\xf0S"], "\xef" => [0, "\xf0T"], "\xf0" => [0, "\xf0U"], "\xf1" => [0, "\xf0V"], "\xf2" => [0, "\xf0W"], "\xf3" => [0, "\xf0Y"], "\xf4" => [0, "\xf0j"], "\xf5" => [0, "\xf0k"], "\xf6" => [0, "\xf0q"], "\xf7" => [0, "\xf0v"], "\xf8" => [0, "\xf0w"], "\xf9" => [0, "\xf0x"], "\xfa" => [0, "\xf0y"], "\xfb" => [0, "\xf0z"], "\xfc" => [82, "\xf0"], "\xfd" => [87, "\xf0"], "\xfe" => [130, "\xf0"], "\xff" => [9, "\xf0"]], ["\x00" => [94, "\xf10"], "\x01" => [76, "\xf10"], "\x02" => [104, "\xf10"], "\x03" => [16, "\xf10"], "\x04" => [94, "\xf11"], "\x05" => [76, "\xf11"], "\x06" => [104, "\xf11"], "\x07" => [16, "\xf11"], "\x08" => [94, "\xf12"], "\t" => [76, "\xf12"], "\n" => [104, "\xf12"], "\v" => [16, "\xf12"], "\f" => [94, "\xf1a"], "\r" => [76, "\xf1a"], "\x0e" => [104, "\xf1a"], "\x0f" => [16, "\xf1a"], "\x10" => [94, "\xf1c"], "\x11" => [76, "\xf1c"], "\x12" => [104, "\xf1c"], "\x13" => [16, "\xf1c"], "\x14" => [94, "\xf1e"], "\x15" => [76, "\xf1e"], "\x16" => [104, "\xf1e"], "\x17" => [16, "\xf1e"], "\x18" => [94, "\xf1i"], "\x19" => [76, "\xf1i"], "\x1a" => [104, "\xf1i"], "\x1b" => [16, "\xf1i"], "\x1c" => [94, "\xf1o"], "\x1d" => [76, "\xf1o"], "\x1e" => [104, "\xf1o"], "\x1f" => [16, "\xf1o"], " " => [94, "\xf1s"], "!" => [76, "\xf1s"], "\"" => [104, "\xf1s"], "#" => [16, "\xf1s"], "\$" => [94, "\xf1t"], "%" => [76, "\xf1t"], "&" => [104, "\xf1t"], "'" => [16, "\xf1t"], "(" => [77, "\xf1 "], ")" => [18, "\xf1 "], "*" => [77, "\xf1%"], "+" => [18, "\xf1%"], "," => [77, "\xf1-"], "-" => [18, "\xf1-"], "." => [77, "\xf1."], "/" => [18, "\xf1."], [77, "\xf1/"], [18, "\xf1/"], [77, "\xf13"], [18, "\xf13"], [77, "\xf14"], [18, "\xf14"], [77, "\xf15"], [18, "\xf15"], [77, "\xf16"], [18, "\xf16"], ":" => [77, "\xf17"], ";" => [18, "\xf17"], "<" => [77, "\xf18"], "=" => [18, "\xf18"], ">" => [77, "\xf19"], "?" => [18, "\xf19"], "@" => [77, "\xf1="], "A" => [18, "\xf1="], "B" => [77, "\xf1A"], "C" => [18, "\xf1A"], "D" => [77, "\xf1_"], "E" => [18, "\xf1_"], "F" => [77, "\xf1b"], "G" => [18, "\xf1b"], "H" => [77, "\xf1d"], "I" => [18, "\xf1d"], "J" => [77, "\xf1f"], "K" => [18, "\xf1f"], "L" => [77, "\xf1g"], "M" => [18, "\xf1g"], "N" => [77, "\xf1h"], "O" => [18, "\xf1h"], "P" => [77, "\xf1l"], "Q" => [18, "\xf1l"], "R" => [77, "\xf1m"], "S" => [18, "\xf1m"], "T" => [77, "\xf1n"], "U" => [18, "\xf1n"], "V" => [77, "\xf1p"], "W" => [18, "\xf1p"], "X" => [77, "\xf1r"], "Y" => [18, "\xf1r"], "Z" => [77, "\xf1u"], "[" => [18, "\xf1u"], "\\" => [0, "\xf1:"], "]" => [0, "\xf1B"], "^" => [0, "\xf1C"], "_" => [0, "\xf1D"], "`" => [0, "\xf1E"], "a" => [0, "\xf1F"], "b" => [0, "\xf1G"], "c" => [0, "\xf1H"], "d" => [0, "\xf1I"], "e" => [0, "\xf1J"], "f" => [0, "\xf1K"], "g" => [0, "\xf1L"], "h" => [0, "\xf1M"], "i" => [0, "\xf1N"], "j" => [0, "\xf1O"], "k" => [0, "\xf1P"], "l" => [0, "\xf1Q"], "m" => [0, "\xf1R"], "n" => [0, "\xf1S"], "o" => [0, "\xf1T"], "p" => [0, "\xf1U"], "q" => [0, "\xf1V"], "r" => [0, "\xf1W"], "s" => [0, "\xf1Y"], "t" => [0, "\xf1j"], "u" => [0, "\xf1k"], "v" => [0, "\xf1q"], "w" => [0, "\xf1v"], "x" => [0, "\xf1w"], "y" => [0, "\xf1x"], "z" => [0, "\xf1y"], "{" => [0, "\xf1z"], "|" => [82, "\xf1"], "}" => [87, "\xf1"], "~" => [130, "\xf1"], "" => [9, "\xf1"], "\x80" => [94, "\xf40"], "\x81" => [76, "\xf40"], "\x82" => [104, "\xf40"], "\x83" => [16, "\xf40"], "\x84" => [94, "\xf41"], "\x85" => [76, "\xf41"], "\x86" => [104, "\xf41"], "\x87" => [16, "\xf41"], "\x88" => [94, "\xf42"], "\x89" => [76, "\xf42"], "\x8a" => [104, "\xf42"], "\x8b" => [16, "\xf42"], "\x8c" => [94, "\xf4a"], "\x8d" => [76, "\xf4a"], "\x8e" => [104, "\xf4a"], "\x8f" => [16, "\xf4a"], "\x90" => [94, "\xf4c"], "\x91" => [76, "\xf4c"], "\x92" => [104, "\xf4c"], "\x93" => [16, "\xf4c"], "\x94" => [94, "\xf4e"], "\x95" => [76, "\xf4e"], "\x96" => [104, "\xf4e"], "\x97" => [16, "\xf4e"], "\x98" => [94, "\xf4i"], "\x99" => [76, "\xf4i"], "\x9a" => [104, "\xf4i"], "\x9b" => [16, "\xf4i"], "\x9c" => [94, "\xf4o"], "\x9d" => [76, "\xf4o"], "\x9e" => [104, "\xf4o"], "\x9f" => [16, "\xf4o"], "\xa0" => [94, "\xf4s"], "\xa1" => [76, "\xf4s"], "\xa2" => [104, "\xf4s"], "\xa3" => [16, "\xf4s"], "\xa4" => [94, "\xf4t"], "\xa5" => [76, "\xf4t"], "\xa6" => [104, "\xf4t"], "\xa7" => [16, "\xf4t"], "\xa8" => [77, "\xf4 "], "\xa9" => [18, "\xf4 "], "\xaa" => [77, "\xf4%"], "\xab" => [18, "\xf4%"], "\xac" => [77, "\xf4-"], "\xad" => [18, "\xf4-"], "\xae" => [77, "\xf4."], "\xaf" => [18, "\xf4."], "\xb0" => [77, "\xf4/"], "\xb1" => [18, "\xf4/"], "\xb2" => [77, "\xf43"], "\xb3" => [18, "\xf43"], "\xb4" => [77, "\xf44"], "\xb5" => [18, "\xf44"], "\xb6" => [77, "\xf45"], "\xb7" => [18, "\xf45"], "\xb8" => [77, "\xf46"], "\xb9" => [18, "\xf46"], "\xba" => [77, "\xf47"], "\xbb" => [18, "\xf47"], "\xbc" => [77, "\xf48"], "\xbd" => [18, "\xf48"], "\xbe" => [77, "\xf49"], "\xbf" => [18, "\xf49"], "\xc0" => [77, "\xf4="], "\xc1" => [18, "\xf4="], "\xc2" => [77, "\xf4A"], "\xc3" => [18, "\xf4A"], "\xc4" => [77, "\xf4_"], "\xc5" => [18, "\xf4_"], "\xc6" => [77, "\xf4b"], "\xc7" => [18, "\xf4b"], "\xc8" => [77, "\xf4d"], "\xc9" => [18, "\xf4d"], "\xca" => [77, "\xf4f"], "\xcb" => [18, "\xf4f"], "\xcc" => [77, "\xf4g"], "\xcd" => [18, "\xf4g"], "\xce" => [77, "\xf4h"], "\xcf" => [18, "\xf4h"], "\xd0" => [77, "\xf4l"], "\xd1" => [18, "\xf4l"], "\xd2" => [77, "\xf4m"], "\xd3" => [18, "\xf4m"], "\xd4" => [77, "\xf4n"], "\xd5" => [18, "\xf4n"], "\xd6" => [77, "\xf4p"], "\xd7" => [18, "\xf4p"], "\xd8" => [77, "\xf4r"], "\xd9" => [18, "\xf4r"], "\xda" => [77, "\xf4u"], "\xdb" => [18, "\xf4u"], "\xdc" => [0, "\xf4:"], "\xdd" => [0, "\xf4B"], "\xde" => [0, "\xf4C"], "\xdf" => [0, "\xf4D"], "\xe0" => [0, "\xf4E"], "\xe1" => [0, "\xf4F"], "\xe2" => [0, "\xf4G"], "\xe3" => [0, "\xf4H"], "\xe4" => [0, "\xf4I"], "\xe5" => [0, "\xf4J"], "\xe6" => [0, "\xf4K"], "\xe7" => [0, "\xf4L"], "\xe8" => [0, "\xf4M"], "\xe9" => [0, "\xf4N"], "\xea" => [0, "\xf4O"], "\xeb" => [0, "\xf4P"], "\xec" => [0, "\xf4Q"], "\xed" => [0, "\xf4R"], "\xee" => [0, "\xf4S"], "\xef" => [0, "\xf4T"], "\xf0" => [0, "\xf4U"], "\xf1" => [0, "\xf4V"], "\xf2" => [0, "\xf4W"], "\xf3" => [0, "\xf4Y"], "\xf4" => [0, "\xf4j"], "\xf5" => [0, "\xf4k"], "\xf6" => [0, "\xf4q"], "\xf7" => [0, "\xf4v"], "\xf8" => [0, "\xf4w"], "\xf9" => [0, "\xf4x"], "\xfa" => [0, "\xf4y"], "\xfb" => [0, "\xf4z"], "\xfc" => [82, "\xf4"], "\xfd" => [87, "\xf4"], "\xfe" => [130, "\xf4"], "\xff" => [9, "\xf4"]], ["\x00" => [94, "\xf20"], "\x01" => [76, "\xf20"], "\x02" => [104, "\xf20"], "\x03" => [16, "\xf20"], "\x04" => [94, "\xf21"], "\x05" => [76, "\xf21"], "\x06" => [104, "\xf21"], "\x07" => [16, "\xf21"], "\x08" => [94, "\xf22"], "\t" => [76, "\xf22"], "\n" => [104, "\xf22"], "\v" => [16, "\xf22"], "\f" => [94, "\xf2a"], "\r" => [76, "\xf2a"], "\x0e" => [104, "\xf2a"], "\x0f" => [16, "\xf2a"], "\x10" => [94, "\xf2c"], "\x11" => [76, "\xf2c"], "\x12" => [104, "\xf2c"], "\x13" => [16, "\xf2c"], "\x14" => [94, "\xf2e"], "\x15" => [76, "\xf2e"], "\x16" => [104, "\xf2e"], "\x17" => [16, "\xf2e"], "\x18" => [94, "\xf2i"], "\x19" => [76, "\xf2i"], "\x1a" => [104, "\xf2i"], "\x1b" => [16, "\xf2i"], "\x1c" => [94, "\xf2o"], "\x1d" => [76, "\xf2o"], "\x1e" => [104, "\xf2o"], "\x1f" => [16, "\xf2o"], " " => [94, "\xf2s"], "!" => [76, "\xf2s"], "\"" => [104, "\xf2s"], "#" => [16, "\xf2s"], "\$" => [94, "\xf2t"], "%" => [76, "\xf2t"], "&" => [104, "\xf2t"], "'" => [16, "\xf2t"], "(" => [77, "\xf2 "], ")" => [18, "\xf2 "], "*" => [77, "\xf2%"], "+" => [18, "\xf2%"], "," => [77, "\xf2-"], "-" => [18, "\xf2-"], "." => [77, "\xf2."], "/" => [18, "\xf2."], [77, "\xf2/"], [18, "\xf2/"], [77, "\xf23"], [18, "\xf23"], [77, "\xf24"], [18, "\xf24"], [77, "\xf25"], [18, "\xf25"], [77, "\xf26"], [18, "\xf26"], ":" => [77, "\xf27"], ";" => [18, "\xf27"], "<" => [77, "\xf28"], "=" => [18, "\xf28"], ">" => [77, "\xf29"], "?" => [18, "\xf29"], "@" => [77, "\xf2="], "A" => [18, "\xf2="], "B" => [77, "\xf2A"], "C" => [18, "\xf2A"], "D" => [77, "\xf2_"], "E" => [18, "\xf2_"], "F" => [77, "\xf2b"], "G" => [18, "\xf2b"], "H" => [77, "\xf2d"], "I" => [18, "\xf2d"], "J" => [77, "\xf2f"], "K" => [18, "\xf2f"], "L" => [77, "\xf2g"], "M" => [18, "\xf2g"], "N" => [77, "\xf2h"], "O" => [18, "\xf2h"], "P" => [77, "\xf2l"], "Q" => [18, "\xf2l"], "R" => [77, "\xf2m"], "S" => [18, "\xf2m"], "T" => [77, "\xf2n"], "U" => [18, "\xf2n"], "V" => [77, "\xf2p"], "W" => [18, "\xf2p"], "X" => [77, "\xf2r"], "Y" => [18, "\xf2r"], "Z" => [77, "\xf2u"], "[" => [18, "\xf2u"], "\\" => [0, "\xf2:"], "]" => [0, "\xf2B"], "^" => [0, "\xf2C"], "_" => [0, "\xf2D"], "`" => [0, "\xf2E"], "a" => [0, "\xf2F"], "b" => [0, "\xf2G"], "c" => [0, "\xf2H"], "d" => [0, "\xf2I"], "e" => [0, "\xf2J"], "f" => [0, "\xf2K"], "g" => [0, "\xf2L"], "h" => [0, "\xf2M"], "i" => [0, "\xf2N"], "j" => [0, "\xf2O"], "k" => [0, "\xf2P"], "l" => [0, "\xf2Q"], "m" => [0, "\xf2R"], "n" => [0, "\xf2S"], "o" => [0, "\xf2T"], "p" => [0, "\xf2U"], "q" => [0, "\xf2V"], "r" => [0, "\xf2W"], "s" => [0, "\xf2Y"], "t" => [0, "\xf2j"], "u" => [0, "\xf2k"], "v" => [0, "\xf2q"], "w" => [0, "\xf2v"], "x" => [0, "\xf2w"], "y" => [0, "\xf2x"], "z" => [0, "\xf2y"], "{" => [0, "\xf2z"], "|" => [82, "\xf2"], "}" => [87, "\xf2"], "~" => [130, "\xf2"], "" => [9, "\xf2"], "\x80" => [94, "\xf30"], "\x81" => [76, "\xf30"], "\x82" => [104, "\xf30"], "\x83" => [16, "\xf30"], "\x84" => [94, "\xf31"], "\x85" => [76, "\xf31"], "\x86" => [104, "\xf31"], "\x87" => [16, "\xf31"], "\x88" => [94, "\xf32"], "\x89" => [76, "\xf32"], "\x8a" => [104, "\xf32"], "\x8b" => [16, "\xf32"], "\x8c" => [94, "\xf3a"], "\x8d" => [76, "\xf3a"], "\x8e" => [104, "\xf3a"], "\x8f" => [16, "\xf3a"], "\x90" => [94, "\xf3c"], "\x91" => [76, "\xf3c"], "\x92" => [104, "\xf3c"], "\x93" => [16, "\xf3c"], "\x94" => [94, "\xf3e"], "\x95" => [76, "\xf3e"], "\x96" => [104, "\xf3e"], "\x97" => [16, "\xf3e"], "\x98" => [94, "\xf3i"], "\x99" => [76, "\xf3i"], "\x9a" => [104, "\xf3i"], "\x9b" => [16, "\xf3i"], "\x9c" => [94, "\xf3o"], "\x9d" => [76, "\xf3o"], "\x9e" => [104, "\xf3o"], "\x9f" => [16, "\xf3o"], "\xa0" => [94, "\xf3s"], "\xa1" => [76, "\xf3s"], "\xa2" => [104, "\xf3s"], "\xa3" => [16, "\xf3s"], "\xa4" => [94, "\xf3t"], "\xa5" => [76, "\xf3t"], "\xa6" => [104, "\xf3t"], "\xa7" => [16, "\xf3t"], "\xa8" => [77, "\xf3 "], "\xa9" => [18, "\xf3 "], "\xaa" => [77, "\xf3%"], "\xab" => [18, "\xf3%"], "\xac" => [77, "\xf3-"], "\xad" => [18, "\xf3-"], "\xae" => [77, "\xf3."], "\xaf" => [18, "\xf3."], "\xb0" => [77, "\xf3/"], "\xb1" => [18, "\xf3/"], "\xb2" => [77, "\xf33"], "\xb3" => [18, "\xf33"], "\xb4" => [77, "\xf34"], "\xb5" => [18, "\xf34"], "\xb6" => [77, "\xf35"], "\xb7" => [18, "\xf35"], "\xb8" => [77, "\xf36"], "\xb9" => [18, "\xf36"], "\xba" => [77, "\xf37"], "\xbb" => [18, "\xf37"], "\xbc" => [77, "\xf38"], "\xbd" => [18, "\xf38"], "\xbe" => [77, "\xf39"], "\xbf" => [18, "\xf39"], "\xc0" => [77, "\xf3="], "\xc1" => [18, "\xf3="], "\xc2" => [77, "\xf3A"], "\xc3" => [18, "\xf3A"], "\xc4" => [77, "\xf3_"], "\xc5" => [18, "\xf3_"], "\xc6" => [77, "\xf3b"], "\xc7" => [18, "\xf3b"], "\xc8" => [77, "\xf3d"], "\xc9" => [18, "\xf3d"], "\xca" => [77, "\xf3f"], "\xcb" => [18, "\xf3f"], "\xcc" => [77, "\xf3g"], "\xcd" => [18, "\xf3g"], "\xce" => [77, "\xf3h"], "\xcf" => [18, "\xf3h"], "\xd0" => [77, "\xf3l"], "\xd1" => [18, "\xf3l"], "\xd2" => [77, "\xf3m"], "\xd3" => [18, "\xf3m"], "\xd4" => [77, "\xf3n"], "\xd5" => [18, "\xf3n"], "\xd6" => [77, "\xf3p"], "\xd7" => [18, "\xf3p"], "\xd8" => [77, "\xf3r"], "\xd9" => [18, "\xf3r"], "\xda" => [77, "\xf3u"], "\xdb" => [18, "\xf3u"], "\xdc" => [0, "\xf3:"], "\xdd" => [0, "\xf3B"], "\xde" => [0, "\xf3C"], "\xdf" => [0, "\xf3D"], "\xe0" => [0, "\xf3E"], "\xe1" => [0, "\xf3F"], "\xe2" => [0, "\xf3G"], "\xe3" => [0, "\xf3H"], "\xe4" => [0, "\xf3I"], "\xe5" => [0, "\xf3J"], "\xe6" => [0, "\xf3K"], "\xe7" => [0, "\xf3L"], "\xe8" => [0, "\xf3M"], "\xe9" => [0, "\xf3N"], "\xea" => [0, "\xf3O"], "\xeb" => [0, "\xf3P"], "\xec" => [0, "\xf3Q"], "\xed" => [0, "\xf3R"], "\xee" => [0, "\xf3S"], "\xef" => [0, "\xf3T"], "\xf0" => [0, "\xf3U"], "\xf1" => [0, "\xf3V"], "\xf2" => [0, "\xf3W"], "\xf3" => [0, "\xf3Y"], "\xf4" => [0, "\xf3j"], "\xf5" => [0, "\xf3k"], "\xf6" => [0, "\xf3q"], "\xf7" => [0, "\xf3v"], "\xf8" => [0, "\xf3w"], "\xf9" => [0, "\xf3x"], "\xfa" => [0, "\xf3y"], "\xfb" => [0, "\xf3z"], "\xfc" => [82, "\xf3"], "\xfd" => [87, "\xf3"], "\xfe" => [130, "\xf3"], "\xff" => [9, "\xf3"]], ["\x00" => [0, "\xf50"], "\x01" => [0, "\xf51"], "\x02" => [0, "\xf52"], "\x03" => [0, "\xf5a"], "\x04" => [0, "\xf5c"], "\x05" => [0, "\xf5e"], "\x06" => [0, "\xf5i"], "\x07" => [0, "\xf5o"], "\x08" => [0, "\xf5s"], "\t" => [0, "\xf5t"], "\n" => [73, "\xf5"], "\v" => [88, "\xf5"], "\f" => [89, "\xf5"], "\r" => [96, "\xf5"], "\x0e" => [97, "\xf5"], "\x0f" => [99, "\xf5"], "\x10" => [106, "\xf5"], "\x11" => [136, "\xf5"], "\x12" => [139, "\xf5"], "\x13" => [141, "\xf5"], "\x14" => [145, "\xf5"], "\x15" => [147, "\xf5"], "\x16" => [149, "\xf5"], "\x17" => [101, "\xf5"], "\x18" => [112, "\xf5"], "\x19" => [117, "\xf5"], "\x1a" => [120, "\xf5"], "\x1b" => [124, "\xf5"], "\x1c" => [127, "\xf5"], "\x1d" => [144, "\xf5"], "\x1e" => [152, "\xf5"], "\x1f" => [11, "\xf5"], " " => [0, "\xf60"], "!" => [0, "\xf61"], "\"" => [0, "\xf62"], "#" => [0, "\xf6a"], "\$" => [0, "\xf6c"], "%" => [0, "\xf6e"], "&" => [0, "\xf6i"], "'" => [0, "\xf6o"], "(" => [0, "\xf6s"], ")" => [0, "\xf6t"], "*" => [73, "\xf6"], "+" => [88, "\xf6"], "," => [89, "\xf6"], "-" => [96, "\xf6"], "." => [97, "\xf6"], "/" => [99, "\xf6"], [106, "\xf6"], [136, "\xf6"], [139, "\xf6"], [141, "\xf6"], [145, "\xf6"], [147, "\xf6"], [149, "\xf6"], [101, "\xf6"], [112, "\xf6"], [117, "\xf6"], ":" => [120, "\xf6"], ";" => [124, "\xf6"], "<" => [127, "\xf6"], "=" => [144, "\xf6"], ">" => [152, "\xf6"], "?" => [11, "\xf6"], "@" => [0, "\xf70"], "A" => [0, "\xf71"], "B" => [0, "\xf72"], "C" => [0, "\xf7a"], "D" => [0, "\xf7c"], "E" => [0, "\xf7e"], "F" => [0, "\xf7i"], "G" => [0, "\xf7o"], "H" => [0, "\xf7s"], "I" => [0, "\xf7t"], "J" => [73, "\xf7"], "K" => [88, "\xf7"], "L" => [89, "\xf7"], "M" => [96, "\xf7"], "N" => [97, "\xf7"], "O" => [99, "\xf7"], "P" => [106, "\xf7"], "Q" => [136, "\xf7"], "R" => [139, "\xf7"], "S" => [141, "\xf7"], "T" => [145, "\xf7"], "U" => [147, "\xf7"], "V" => [149, "\xf7"], "W" => [101, "\xf7"], "X" => [112, "\xf7"], "Y" => [117, "\xf7"], "Z" => [120, "\xf7"], "[" => [124, "\xf7"], "\\" => [127, "\xf7"], "]" => [144, "\xf7"], "^" => [152, "\xf7"], "_" => [11, "\xf7"], "`" => [0, "\xf80"], "a" => [0, "\xf81"], "b" => [0, "\xf82"], "c" => [0, "\xf8a"], "d" => [0, "\xf8c"], "e" => [0, "\xf8e"], "f" => [0, "\xf8i"], "g" => [0, "\xf8o"], "h" => [0, "\xf8s"], "i" => [0, "\xf8t"], "j" => [73, "\xf8"], "k" => [88, "\xf8"], "l" => [89, "\xf8"], "m" => [96, "\xf8"], "n" => [97, "\xf8"], "o" => [99, "\xf8"], "p" => [106, "\xf8"], "q" => [136, "\xf8"], "r" => [139, "\xf8"], "s" => [141, "\xf8"], "t" => [145, "\xf8"], "u" => [147, "\xf8"], "v" => [149, "\xf8"], "w" => [101, "\xf8"], "x" => [112, "\xf8"], "y" => [117, "\xf8"], "z" => [120, "\xf8"], "{" => [124, "\xf8"], "|" => [127, "\xf8"], "}" => [144, "\xf8"], "~" => [152, "\xf8"], "" => [11, "\xf8"], "\x80" => [0, "\xfa0"], "\x81" => [0, "\xfa1"], "\x82" => [0, "\xfa2"], "\x83" => [0, "\xfaa"], "\x84" => [0, "\xfac"], "\x85" => [0, "\xfae"], "\x86" => [0, "\xfai"], "\x87" => [0, "\xfao"], "\x88" => [0, "\xfas"], "\x89" => [0, "\xfat"], "\x8a" => [73, "\xfa"], "\x8b" => [88, "\xfa"], "\x8c" => [89, "\xfa"], "\x8d" => [96, "\xfa"], "\x8e" => [97, "\xfa"], "\x8f" => [99, "\xfa"], "\x90" => [106, "\xfa"], "\x91" => [136, "\xfa"], "\x92" => [139, "\xfa"], "\x93" => [141, "\xfa"], "\x94" => [145, "\xfa"], "\x95" => [147, "\xfa"], "\x96" => [149, "\xfa"], "\x97" => [101, "\xfa"], "\x98" => [112, "\xfa"], "\x99" => [117, "\xfa"], "\x9a" => [120, "\xfa"], "\x9b" => [124, "\xfa"], "\x9c" => [127, "\xfa"], "\x9d" => [144, "\xfa"], "\x9e" => [152, "\xfa"], "\x9f" => [11, "\xfa"], "\xa0" => [0, "\xfb0"], "\xa1" => [0, "\xfb1"], "\xa2" => [0, "\xfb2"], "\xa3" => [0, "\xfba"], "\xa4" => [0, "\xfbc"], "\xa5" => [0, "\xfbe"], "\xa6" => [0, "\xfbi"], "\xa7" => [0, "\xfbo"], "\xa8" => [0, "\xfbs"], "\xa9" => [0, "\xfbt"], "\xaa" => [73, "\xfb"], "\xab" => [88, "\xfb"], "\xac" => [89, "\xfb"], "\xad" => [96, "\xfb"], "\xae" => [97, "\xfb"], "\xaf" => [99, "\xfb"], "\xb0" => [106, "\xfb"], "\xb1" => [136, "\xfb"], "\xb2" => [139, "\xfb"], "\xb3" => [141, "\xfb"], "\xb4" => [145, "\xfb"], "\xb5" => [147, "\xfb"], "\xb6" => [149, "\xfb"], "\xb7" => [101, "\xfb"], "\xb8" => [112, "\xfb"], "\xb9" => [117, "\xfb"], "\xba" => [120, "\xfb"], "\xbb" => [124, "\xfb"], "\xbc" => [127, "\xfb"], "\xbd" => [144, "\xfb"], "\xbe" => [152, "\xfb"], "\xbf" => [11, "\xfb"], "\xc0" => [0, "\xfc0"], "\xc1" => [0, "\xfc1"], "\xc2" => [0, "\xfc2"], "\xc3" => [0, "\xfca"], "\xc4" => [0, "\xfcc"], "\xc5" => [0, "\xfce"], "\xc6" => [0, "\xfci"], "\xc7" => [0, "\xfco"], "\xc8" => [0, "\xfcs"], "\xc9" => [0, "\xfct"], "\xca" => [73, "\xfc"], "\xcb" => [88, "\xfc"], "\xcc" => [89, "\xfc"], "\xcd" => [96, "\xfc"], "\xce" => [97, "\xfc"], "\xcf" => [99, "\xfc"], "\xd0" => [106, "\xfc"], "\xd1" => [136, "\xfc"], "\xd2" => [139, "\xfc"], "\xd3" => [141, "\xfc"], "\xd4" => [145, "\xfc"], "\xd5" => [147, "\xfc"], "\xd6" => [149, "\xfc"], "\xd7" => [101, "\xfc"], "\xd8" => [112, "\xfc"], "\xd9" => [117, "\xfc"], "\xda" => [120, "\xfc"], "\xdb" => [124, "\xfc"], "\xdc" => [127, "\xfc"], "\xdd" => [144, "\xfc"], "\xde" => [152, "\xfc"], "\xdf" => [11, "\xfc"], "\xe0" => [0, "\xfd0"], "\xe1" => [0, "\xfd1"], "\xe2" => [0, "\xfd2"], "\xe3" => [0, "\xfda"], "\xe4" => [0, "\xfdc"], "\xe5" => [0, "\xfde"], "\xe6" => [0, "\xfdi"], "\xe7" => [0, "\xfdo"], "\xe8" => [0, "\xfds"], "\xe9" => [0, "\xfdt"], "\xea" => [73, "\xfd"], "\xeb" => [88, "\xfd"], "\xec" => [89, "\xfd"], "\xed" => [96, "\xfd"], "\xee" => [97, "\xfd"], "\xef" => [99, "\xfd"], "\xf0" => [106, "\xfd"], "\xf1" => [136, "\xfd"], "\xf2" => [139, "\xfd"], "\xf3" => [141, "\xfd"], "\xf4" => [145, "\xfd"], "\xf5" => [147, "\xfd"], "\xf6" => [149, "\xfd"], "\xf7" => [101, "\xfd"], "\xf8" => [112, "\xfd"], "\xf9" => [117, "\xfd"], "\xfa" => [120, "\xfd"], "\xfb" => [124, "\xfd"], "\xfc" => [127, "\xfd"], "\xfd" => [144, "\xfd"], "\xfe" => [152, "\xfd"], "\xff" => [11, "\xfd"]], ["\x00" => [94, "\xf50"], "\x01" => [76, "\xf50"], "\x02" => [104, "\xf50"], "\x03" => [16, "\xf50"], "\x04" => [94, "\xf51"], "\x05" => [76, "\xf51"], "\x06" => [104, "\xf51"], "\x07" => [16, "\xf51"], "\x08" => [94, "\xf52"], "\t" => [76, "\xf52"], "\n" => [104, "\xf52"], "\v" => [16, "\xf52"], "\f" => [94, "\xf5a"], "\r" => [76, "\xf5a"], "\x0e" => [104, "\xf5a"], "\x0f" => [16, "\xf5a"], "\x10" => [94, "\xf5c"], "\x11" => [76, "\xf5c"], "\x12" => [104, "\xf5c"], "\x13" => [16, "\xf5c"], "\x14" => [94, "\xf5e"], "\x15" => [76, "\xf5e"], "\x16" => [104, "\xf5e"], "\x17" => [16, "\xf5e"], "\x18" => [94, "\xf5i"], "\x19" => [76, "\xf5i"], "\x1a" => [104, "\xf5i"], "\x1b" => [16, "\xf5i"], "\x1c" => [94, "\xf5o"], "\x1d" => [76, "\xf5o"], "\x1e" => [104, "\xf5o"], "\x1f" => [16, "\xf5o"], " " => [94, "\xf5s"], "!" => [76, "\xf5s"], "\"" => [104, "\xf5s"], "#" => [16, "\xf5s"], "\$" => [94, "\xf5t"], "%" => [76, "\xf5t"], "&" => [104, "\xf5t"], "'" => [16, "\xf5t"], "(" => [77, "\xf5 "], ")" => [18, "\xf5 "], "*" => [77, "\xf5%"], "+" => [18, "\xf5%"], "," => [77, "\xf5-"], "-" => [18, "\xf5-"], "." => [77, "\xf5."], "/" => [18, "\xf5."], [77, "\xf5/"], [18, "\xf5/"], [77, "\xf53"], [18, "\xf53"], [77, "\xf54"], [18, "\xf54"], [77, "\xf55"], [18, "\xf55"], [77, "\xf56"], [18, "\xf56"], ":" => [77, "\xf57"], ";" => [18, "\xf57"], "<" => [77, "\xf58"], "=" => [18, "\xf58"], ">" => [77, "\xf59"], "?" => [18, "\xf59"], "@" => [77, "\xf5="], "A" => [18, "\xf5="], "B" => [77, "\xf5A"], "C" => [18, "\xf5A"], "D" => [77, "\xf5_"], "E" => [18, "\xf5_"], "F" => [77, "\xf5b"], "G" => [18, "\xf5b"], "H" => [77, "\xf5d"], "I" => [18, "\xf5d"], "J" => [77, "\xf5f"], "K" => [18, "\xf5f"], "L" => [77, "\xf5g"], "M" => [18, "\xf5g"], "N" => [77, "\xf5h"], "O" => [18, "\xf5h"], "P" => [77, "\xf5l"], "Q" => [18, "\xf5l"], "R" => [77, "\xf5m"], "S" => [18, "\xf5m"], "T" => [77, "\xf5n"], "U" => [18, "\xf5n"], "V" => [77, "\xf5p"], "W" => [18, "\xf5p"], "X" => [77, "\xf5r"], "Y" => [18, "\xf5r"], "Z" => [77, "\xf5u"], "[" => [18, "\xf5u"], "\\" => [0, "\xf5:"], "]" => [0, "\xf5B"], "^" => [0, "\xf5C"], "_" => [0, "\xf5D"], "`" => [0, "\xf5E"], "a" => [0, "\xf5F"], "b" => [0, "\xf5G"], "c" => [0, "\xf5H"], "d" => [0, "\xf5I"], "e" => [0, "\xf5J"], "f" => [0, "\xf5K"], "g" => [0, "\xf5L"], "h" => [0, "\xf5M"], "i" => [0, "\xf5N"], "j" => [0, "\xf5O"], "k" => [0, "\xf5P"], "l" => [0, "\xf5Q"], "m" => [0, "\xf5R"], "n" => [0, "\xf5S"], "o" => [0, "\xf5T"], "p" => [0, "\xf5U"], "q" => [0, "\xf5V"], "r" => [0, "\xf5W"], "s" => [0, "\xf5Y"], "t" => [0, "\xf5j"], "u" => [0, "\xf5k"], "v" => [0, "\xf5q"], "w" => [0, "\xf5v"], "x" => [0, "\xf5w"], "y" => [0, "\xf5x"], "z" => [0, "\xf5y"], "{" => [0, "\xf5z"], "|" => [82, "\xf5"], "}" => [87, "\xf5"], "~" => [130, "\xf5"], "" => [9, "\xf5"], "\x80" => [94, "\xf60"], "\x81" => [76, "\xf60"], "\x82" => [104, "\xf60"], "\x83" => [16, "\xf60"], "\x84" => [94, "\xf61"], "\x85" => [76, "\xf61"], "\x86" => [104, "\xf61"], "\x87" => [16, "\xf61"], "\x88" => [94, "\xf62"], "\x89" => [76, "\xf62"], "\x8a" => [104, "\xf62"], "\x8b" => [16, "\xf62"], "\x8c" => [94, "\xf6a"], "\x8d" => [76, "\xf6a"], "\x8e" => [104, "\xf6a"], "\x8f" => [16, "\xf6a"], "\x90" => [94, "\xf6c"], "\x91" => [76, "\xf6c"], "\x92" => [104, "\xf6c"], "\x93" => [16, "\xf6c"], "\x94" => [94, "\xf6e"], "\x95" => [76, "\xf6e"], "\x96" => [104, "\xf6e"], "\x97" => [16, "\xf6e"], "\x98" => [94, "\xf6i"], "\x99" => [76, "\xf6i"], "\x9a" => [104, "\xf6i"], "\x9b" => [16, "\xf6i"], "\x9c" => [94, "\xf6o"], "\x9d" => [76, "\xf6o"], "\x9e" => [104, "\xf6o"], "\x9f" => [16, "\xf6o"], "\xa0" => [94, "\xf6s"], "\xa1" => [76, "\xf6s"], "\xa2" => [104, "\xf6s"], "\xa3" => [16, "\xf6s"], "\xa4" => [94, "\xf6t"], "\xa5" => [76, "\xf6t"], "\xa6" => [104, "\xf6t"], "\xa7" => [16, "\xf6t"], "\xa8" => [77, "\xf6 "], "\xa9" => [18, "\xf6 "], "\xaa" => [77, "\xf6%"], "\xab" => [18, "\xf6%"], "\xac" => [77, "\xf6-"], "\xad" => [18, "\xf6-"], "\xae" => [77, "\xf6."], "\xaf" => [18, "\xf6."], "\xb0" => [77, "\xf6/"], "\xb1" => [18, "\xf6/"], "\xb2" => [77, "\xf63"], "\xb3" => [18, "\xf63"], "\xb4" => [77, "\xf64"], "\xb5" => [18, "\xf64"], "\xb6" => [77, "\xf65"], "\xb7" => [18, "\xf65"], "\xb8" => [77, "\xf66"], "\xb9" => [18, "\xf66"], "\xba" => [77, "\xf67"], "\xbb" => [18, "\xf67"], "\xbc" => [77, "\xf68"], "\xbd" => [18, "\xf68"], "\xbe" => [77, "\xf69"], "\xbf" => [18, "\xf69"], "\xc0" => [77, "\xf6="], "\xc1" => [18, "\xf6="], "\xc2" => [77, "\xf6A"], "\xc3" => [18, "\xf6A"], "\xc4" => [77, "\xf6_"], "\xc5" => [18, "\xf6_"], "\xc6" => [77, "\xf6b"], "\xc7" => [18, "\xf6b"], "\xc8" => [77, "\xf6d"], "\xc9" => [18, "\xf6d"], "\xca" => [77, "\xf6f"], "\xcb" => [18, "\xf6f"], "\xcc" => [77, "\xf6g"], "\xcd" => [18, "\xf6g"], "\xce" => [77, "\xf6h"], "\xcf" => [18, "\xf6h"], "\xd0" => [77, "\xf6l"], "\xd1" => [18, "\xf6l"], "\xd2" => [77, "\xf6m"], "\xd3" => [18, "\xf6m"], "\xd4" => [77, "\xf6n"], "\xd5" => [18, "\xf6n"], "\xd6" => [77, "\xf6p"], "\xd7" => [18, "\xf6p"], "\xd8" => [77, "\xf6r"], "\xd9" => [18, "\xf6r"], "\xda" => [77, "\xf6u"], "\xdb" => [18, "\xf6u"], "\xdc" => [0, "\xf6:"], "\xdd" => [0, "\xf6B"], "\xde" => [0, "\xf6C"], "\xdf" => [0, "\xf6D"], "\xe0" => [0, "\xf6E"], "\xe1" => [0, "\xf6F"], "\xe2" => [0, "\xf6G"], "\xe3" => [0, "\xf6H"], "\xe4" => [0, "\xf6I"], "\xe5" => [0, "\xf6J"], "\xe6" => [0, "\xf6K"], "\xe7" => [0, "\xf6L"], "\xe8" => [0, "\xf6M"], "\xe9" => [0, "\xf6N"], "\xea" => [0, "\xf6O"], "\xeb" => [0, "\xf6P"], "\xec" => [0, "\xf6Q"], "\xed" => [0, "\xf6R"], "\xee" => [0, "\xf6S"], "\xef" => [0, "\xf6T"], "\xf0" => [0, "\xf6U"], "\xf1" => [0, "\xf6V"], "\xf2" => [0, "\xf6W"], "\xf3" => [0, "\xf6Y"], "\xf4" => [0, "\xf6j"], "\xf5" => [0, "\xf6k"], "\xf6" => [0, "\xf6q"], "\xf7" => [0, "\xf6v"], "\xf8" => [0, "\xf6w"], "\xf9" => [0, "\xf6x"], "\xfa" => [0, "\xf6y"], "\xfb" => [0, "\xf6z"], "\xfc" => [82, "\xf6"], "\xfd" => [87, "\xf6"], "\xfe" => [130, "\xf6"], "\xff" => [9, "\xf6"]], ["\x00" => [77, "\xf50"], "\x01" => [18, "\xf50"], "\x02" => [77, "\xf51"], "\x03" => [18, "\xf51"], "\x04" => [77, "\xf52"], "\x05" => [18, "\xf52"], "\x06" => [77, "\xf5a"], "\x07" => [18, "\xf5a"], "\x08" => [77, "\xf5c"], "\t" => [18, "\xf5c"], "\n" => [77, "\xf5e"], "\v" => [18, "\xf5e"], "\f" => [77, "\xf5i"], "\r" => [18, "\xf5i"], "\x0e" => [77, "\xf5o"], "\x0f" => [18, "\xf5o"], "\x10" => [77, "\xf5s"], "\x11" => [18, "\xf5s"], "\x12" => [77, "\xf5t"], "\x13" => [18, "\xf5t"], "\x14" => [0, "\xf5 "], "\x15" => [0, "\xf5%"], "\x16" => [0, "\xf5-"], "\x17" => [0, "\xf5."], "\x18" => [0, "\xf5/"], "\x19" => [0, "\xf53"], "\x1a" => [0, "\xf54"], "\x1b" => [0, "\xf55"], "\x1c" => [0, "\xf56"], "\x1d" => [0, "\xf57"], "\x1e" => [0, "\xf58"], "\x1f" => [0, "\xf59"], " " => [0, "\xf5="], "!" => [0, "\xf5A"], "\"" => [0, "\xf5_"], "#" => [0, "\xf5b"], "\$" => [0, "\xf5d"], "%" => [0, "\xf5f"], "&" => [0, "\xf5g"], "'" => [0, "\xf5h"], "(" => [0, "\xf5l"], ")" => [0, "\xf5m"], "*" => [0, "\xf5n"], "+" => [0, "\xf5p"], "," => [0, "\xf5r"], "-" => [0, "\xf5u"], "." => [100, "\xf5"], "/" => [110, "\xf5"], [111, "\xf5"], [115, "\xf5"], [116, "\xf5"], [118, "\xf5"], [119, "\xf5"], [122, "\xf5"], [123, "\xf5"], [125, "\xf5"], [126, "\xf5"], [129, "\xf5"], ":" => [143, "\xf5"], ";" => [148, "\xf5"], "<" => [151, "\xf5"], "=" => [153, "\xf5"], ">" => [83, "\xf5"], "?" => [10, "\xf5"], "@" => [77, "\xf60"], "A" => [18, "\xf60"], "B" => [77, "\xf61"], "C" => [18, "\xf61"], "D" => [77, "\xf62"], "E" => [18, "\xf62"], "F" => [77, "\xf6a"], "G" => [18, "\xf6a"], "H" => [77, "\xf6c"], "I" => [18, "\xf6c"], "J" => [77, "\xf6e"], "K" => [18, "\xf6e"], "L" => [77, "\xf6i"], "M" => [18, "\xf6i"], "N" => [77, "\xf6o"], "O" => [18, "\xf6o"], "P" => [77, "\xf6s"], "Q" => [18, "\xf6s"], "R" => [77, "\xf6t"], "S" => [18, "\xf6t"], "T" => [0, "\xf6 "], "U" => [0, "\xf6%"], "V" => [0, "\xf6-"], "W" => [0, "\xf6."], "X" => [0, "\xf6/"], "Y" => [0, "\xf63"], "Z" => [0, "\xf64"], "[" => [0, "\xf65"], "\\" => [0, "\xf66"], "]" => [0, "\xf67"], "^" => [0, "\xf68"], "_" => [0, "\xf69"], "`" => [0, "\xf6="], "a" => [0, "\xf6A"], "b" => [0, "\xf6_"], "c" => [0, "\xf6b"], "d" => [0, "\xf6d"], "e" => [0, "\xf6f"], "f" => [0, "\xf6g"], "g" => [0, "\xf6h"], "h" => [0, "\xf6l"], "i" => [0, "\xf6m"], "j" => [0, "\xf6n"], "k" => [0, "\xf6p"], "l" => [0, "\xf6r"], "m" => [0, "\xf6u"], "n" => [100, "\xf6"], "o" => [110, "\xf6"], "p" => [111, "\xf6"], "q" => [115, "\xf6"], "r" => [116, "\xf6"], "s" => [118, "\xf6"], "t" => [119, "\xf6"], "u" => [122, "\xf6"], "v" => [123, "\xf6"], "w" => [125, "\xf6"], "x" => [126, "\xf6"], "y" => [129, "\xf6"], "z" => [143, "\xf6"], "{" => [148, "\xf6"], "|" => [151, "\xf6"], "}" => [153, "\xf6"], "~" => [83, "\xf6"], "" => [10, "\xf6"], "\x80" => [77, "\xf70"], "\x81" => [18, "\xf70"], "\x82" => [77, "\xf71"], "\x83" => [18, "\xf71"], "\x84" => [77, "\xf72"], "\x85" => [18, "\xf72"], "\x86" => [77, "\xf7a"], "\x87" => [18, "\xf7a"], "\x88" => [77, "\xf7c"], "\x89" => [18, "\xf7c"], "\x8a" => [77, "\xf7e"], "\x8b" => [18, "\xf7e"], "\x8c" => [77, "\xf7i"], "\x8d" => [18, "\xf7i"], "\x8e" => [77, "\xf7o"], "\x8f" => [18, "\xf7o"], "\x90" => [77, "\xf7s"], "\x91" => [18, "\xf7s"], "\x92" => [77, "\xf7t"], "\x93" => [18, "\xf7t"], "\x94" => [0, "\xf7 "], "\x95" => [0, "\xf7%"], "\x96" => [0, "\xf7-"], "\x97" => [0, "\xf7."], "\x98" => [0, "\xf7/"], "\x99" => [0, "\xf73"], "\x9a" => [0, "\xf74"], "\x9b" => [0, "\xf75"], "\x9c" => [0, "\xf76"], "\x9d" => [0, "\xf77"], "\x9e" => [0, "\xf78"], "\x9f" => [0, "\xf79"], "\xa0" => [0, "\xf7="], "\xa1" => [0, "\xf7A"], "\xa2" => [0, "\xf7_"], "\xa3" => [0, "\xf7b"], "\xa4" => [0, "\xf7d"], "\xa5" => [0, "\xf7f"], "\xa6" => [0, "\xf7g"], "\xa7" => [0, "\xf7h"], "\xa8" => [0, "\xf7l"], "\xa9" => [0, "\xf7m"], "\xaa" => [0, "\xf7n"], "\xab" => [0, "\xf7p"], "\xac" => [0, "\xf7r"], "\xad" => [0, "\xf7u"], "\xae" => [100, "\xf7"], "\xaf" => [110, "\xf7"], "\xb0" => [111, "\xf7"], "\xb1" => [115, "\xf7"], "\xb2" => [116, "\xf7"], "\xb3" => [118, "\xf7"], "\xb4" => [119, "\xf7"], "\xb5" => [122, "\xf7"], "\xb6" => [123, "\xf7"], "\xb7" => [125, "\xf7"], "\xb8" => [126, "\xf7"], "\xb9" => [129, "\xf7"], "\xba" => [143, "\xf7"], "\xbb" => [148, "\xf7"], "\xbc" => [151, "\xf7"], "\xbd" => [153, "\xf7"], "\xbe" => [83, "\xf7"], "\xbf" => [10, "\xf7"], "\xc0" => [77, "\xf80"], "\xc1" => [18, "\xf80"], "\xc2" => [77, "\xf81"], "\xc3" => [18, "\xf81"], "\xc4" => [77, "\xf82"], "\xc5" => [18, "\xf82"], "\xc6" => [77, "\xf8a"], "\xc7" => [18, "\xf8a"], "\xc8" => [77, "\xf8c"], "\xc9" => [18, "\xf8c"], "\xca" => [77, "\xf8e"], "\xcb" => [18, "\xf8e"], "\xcc" => [77, "\xf8i"], "\xcd" => [18, "\xf8i"], "\xce" => [77, "\xf8o"], "\xcf" => [18, "\xf8o"], "\xd0" => [77, "\xf8s"], "\xd1" => [18, "\xf8s"], "\xd2" => [77, "\xf8t"], "\xd3" => [18, "\xf8t"], "\xd4" => [0, "\xf8 "], "\xd5" => [0, "\xf8%"], "\xd6" => [0, "\xf8-"], "\xd7" => [0, "\xf8."], "\xd8" => [0, "\xf8/"], "\xd9" => [0, "\xf83"], "\xda" => [0, "\xf84"], "\xdb" => [0, "\xf85"], "\xdc" => [0, "\xf86"], "\xdd" => [0, "\xf87"], "\xde" => [0, "\xf88"], "\xdf" => [0, "\xf89"], "\xe0" => [0, "\xf8="], "\xe1" => [0, "\xf8A"], "\xe2" => [0, "\xf8_"], "\xe3" => [0, "\xf8b"], "\xe4" => [0, "\xf8d"], "\xe5" => [0, "\xf8f"], "\xe6" => [0, "\xf8g"], "\xe7" => [0, "\xf8h"], "\xe8" => [0, "\xf8l"], "\xe9" => [0, "\xf8m"], "\xea" => [0, "\xf8n"], "\xeb" => [0, "\xf8p"], "\xec" => [0, "\xf8r"], "\xed" => [0, "\xf8u"], "\xee" => [100, "\xf8"], "\xef" => [110, "\xf8"], "\xf0" => [111, "\xf8"], "\xf1" => [115, "\xf8"], "\xf2" => [116, "\xf8"], "\xf3" => [118, "\xf8"], "\xf4" => [119, "\xf8"], "\xf5" => [122, "\xf8"], "\xf6" => [123, "\xf8"], "\xf7" => [125, "\xf8"], "\xf8" => [126, "\xf8"], "\xf9" => [129, "\xf8"], "\xfa" => [143, "\xf8"], "\xfb" => [148, "\xf8"], "\xfc" => [151, "\xf8"], "\xfd" => [153, "\xf8"], "\xfe" => [83, "\xf8"], "\xff" => [10, "\xf8"]], ["\x00" => [94, "\xf70"], "\x01" => [76, "\xf70"], "\x02" => [104, "\xf70"], "\x03" => [16, "\xf70"], "\x04" => [94, "\xf71"], "\x05" => [76, "\xf71"], "\x06" => [104, "\xf71"], "\x07" => [16, "\xf71"], "\x08" => [94, "\xf72"], "\t" => [76, "\xf72"], "\n" => [104, "\xf72"], "\v" => [16, "\xf72"], "\f" => [94, "\xf7a"], "\r" => [76, "\xf7a"], "\x0e" => [104, "\xf7a"], "\x0f" => [16, "\xf7a"], "\x10" => [94, "\xf7c"], "\x11" => [76, "\xf7c"], "\x12" => [104, "\xf7c"], "\x13" => [16, "\xf7c"], "\x14" => [94, "\xf7e"], "\x15" => [76, "\xf7e"], "\x16" => [104, "\xf7e"], "\x17" => [16, "\xf7e"], "\x18" => [94, "\xf7i"], "\x19" => [76, "\xf7i"], "\x1a" => [104, "\xf7i"], "\x1b" => [16, "\xf7i"], "\x1c" => [94, "\xf7o"], "\x1d" => [76, "\xf7o"], "\x1e" => [104, "\xf7o"], "\x1f" => [16, "\xf7o"], " " => [94, "\xf7s"], "!" => [76, "\xf7s"], "\"" => [104, "\xf7s"], "#" => [16, "\xf7s"], "\$" => [94, "\xf7t"], "%" => [76, "\xf7t"], "&" => [104, "\xf7t"], "'" => [16, "\xf7t"], "(" => [77, "\xf7 "], ")" => [18, "\xf7 "], "*" => [77, "\xf7%"], "+" => [18, "\xf7%"], "," => [77, "\xf7-"], "-" => [18, "\xf7-"], "." => [77, "\xf7."], "/" => [18, "\xf7."], [77, "\xf7/"], [18, "\xf7/"], [77, "\xf73"], [18, "\xf73"], [77, "\xf74"], [18, "\xf74"], [77, "\xf75"], [18, "\xf75"], [77, "\xf76"], [18, "\xf76"], ":" => [77, "\xf77"], ";" => [18, "\xf77"], "<" => [77, "\xf78"], "=" => [18, "\xf78"], ">" => [77, "\xf79"], "?" => [18, "\xf79"], "@" => [77, "\xf7="], "A" => [18, "\xf7="], "B" => [77, "\xf7A"], "C" => [18, "\xf7A"], "D" => [77, "\xf7_"], "E" => [18, "\xf7_"], "F" => [77, "\xf7b"], "G" => [18, "\xf7b"], "H" => [77, "\xf7d"], "I" => [18, "\xf7d"], "J" => [77, "\xf7f"], "K" => [18, "\xf7f"], "L" => [77, "\xf7g"], "M" => [18, "\xf7g"], "N" => [77, "\xf7h"], "O" => [18, "\xf7h"], "P" => [77, "\xf7l"], "Q" => [18, "\xf7l"], "R" => [77, "\xf7m"], "S" => [18, "\xf7m"], "T" => [77, "\xf7n"], "U" => [18, "\xf7n"], "V" => [77, "\xf7p"], "W" => [18, "\xf7p"], "X" => [77, "\xf7r"], "Y" => [18, "\xf7r"], "Z" => [77, "\xf7u"], "[" => [18, "\xf7u"], "\\" => [0, "\xf7:"], "]" => [0, "\xf7B"], "^" => [0, "\xf7C"], "_" => [0, "\xf7D"], "`" => [0, "\xf7E"], "a" => [0, "\xf7F"], "b" => [0, "\xf7G"], "c" => [0, "\xf7H"], "d" => [0, "\xf7I"], "e" => [0, "\xf7J"], "f" => [0, "\xf7K"], "g" => [0, "\xf7L"], "h" => [0, "\xf7M"], "i" => [0, "\xf7N"], "j" => [0, "\xf7O"], "k" => [0, "\xf7P"], "l" => [0, "\xf7Q"], "m" => [0, "\xf7R"], "n" => [0, "\xf7S"], "o" => [0, "\xf7T"], "p" => [0, "\xf7U"], "q" => [0, "\xf7V"], "r" => [0, "\xf7W"], "s" => [0, "\xf7Y"], "t" => [0, "\xf7j"], "u" => [0, "\xf7k"], "v" => [0, "\xf7q"], "w" => [0, "\xf7v"], "x" => [0, "\xf7w"], "y" => [0, "\xf7x"], "z" => [0, "\xf7y"], "{" => [0, "\xf7z"], "|" => [82, "\xf7"], "}" => [87, "\xf7"], "~" => [130, "\xf7"], "" => [9, "\xf7"], "\x80" => [94, "\xf80"], "\x81" => [76, "\xf80"], "\x82" => [104, "\xf80"], "\x83" => [16, "\xf80"], "\x84" => [94, "\xf81"], "\x85" => [76, "\xf81"], "\x86" => [104, "\xf81"], "\x87" => [16, "\xf81"], "\x88" => [94, "\xf82"], "\x89" => [76, "\xf82"], "\x8a" => [104, "\xf82"], "\x8b" => [16, "\xf82"], "\x8c" => [94, "\xf8a"], "\x8d" => [76, "\xf8a"], "\x8e" => [104, "\xf8a"], "\x8f" => [16, "\xf8a"], "\x90" => [94, "\xf8c"], "\x91" => [76, "\xf8c"], "\x92" => [104, "\xf8c"], "\x93" => [16, "\xf8c"], "\x94" => [94, "\xf8e"], "\x95" => [76, "\xf8e"], "\x96" => [104, "\xf8e"], "\x97" => [16, "\xf8e"], "\x98" => [94, "\xf8i"], "\x99" => [76, "\xf8i"], "\x9a" => [104, "\xf8i"], "\x9b" => [16, "\xf8i"], "\x9c" => [94, "\xf8o"], "\x9d" => [76, "\xf8o"], "\x9e" => [104, "\xf8o"], "\x9f" => [16, "\xf8o"], "\xa0" => [94, "\xf8s"], "\xa1" => [76, "\xf8s"], "\xa2" => [104, "\xf8s"], "\xa3" => [16, "\xf8s"], "\xa4" => [94, "\xf8t"], "\xa5" => [76, "\xf8t"], "\xa6" => [104, "\xf8t"], "\xa7" => [16, "\xf8t"], "\xa8" => [77, "\xf8 "], "\xa9" => [18, "\xf8 "], "\xaa" => [77, "\xf8%"], "\xab" => [18, "\xf8%"], "\xac" => [77, "\xf8-"], "\xad" => [18, "\xf8-"], "\xae" => [77, "\xf8."], "\xaf" => [18, "\xf8."], "\xb0" => [77, "\xf8/"], "\xb1" => [18, "\xf8/"], "\xb2" => [77, "\xf83"], "\xb3" => [18, "\xf83"], "\xb4" => [77, "\xf84"], "\xb5" => [18, "\xf84"], "\xb6" => [77, "\xf85"], "\xb7" => [18, "\xf85"], "\xb8" => [77, "\xf86"], "\xb9" => [18, "\xf86"], "\xba" => [77, "\xf87"], "\xbb" => [18, "\xf87"], "\xbc" => [77, "\xf88"], "\xbd" => [18, "\xf88"], "\xbe" => [77, "\xf89"], "\xbf" => [18, "\xf89"], "\xc0" => [77, "\xf8="], "\xc1" => [18, "\xf8="], "\xc2" => [77, "\xf8A"], "\xc3" => [18, "\xf8A"], "\xc4" => [77, "\xf8_"], "\xc5" => [18, "\xf8_"], "\xc6" => [77, "\xf8b"], "\xc7" => [18, "\xf8b"], "\xc8" => [77, "\xf8d"], "\xc9" => [18, "\xf8d"], "\xca" => [77, "\xf8f"], "\xcb" => [18, "\xf8f"], "\xcc" => [77, "\xf8g"], "\xcd" => [18, "\xf8g"], "\xce" => [77, "\xf8h"], "\xcf" => [18, "\xf8h"], "\xd0" => [77, "\xf8l"], "\xd1" => [18, "\xf8l"], "\xd2" => [77, "\xf8m"], "\xd3" => [18, "\xf8m"], "\xd4" => [77, "\xf8n"], "\xd5" => [18, "\xf8n"], "\xd6" => [77, "\xf8p"], "\xd7" => [18, "\xf8p"], "\xd8" => [77, "\xf8r"], "\xd9" => [18, "\xf8r"], "\xda" => [77, "\xf8u"], "\xdb" => [18, "\xf8u"], "\xdc" => [0, "\xf8:"], "\xdd" => [0, "\xf8B"], "\xde" => [0, "\xf8C"], "\xdf" => [0, "\xf8D"], "\xe0" => [0, "\xf8E"], "\xe1" => [0, "\xf8F"], "\xe2" => [0, "\xf8G"], "\xe3" => [0, "\xf8H"], "\xe4" => [0, "\xf8I"], "\xe5" => [0, "\xf8J"], "\xe6" => [0, "\xf8K"], "\xe7" => [0, "\xf8L"], "\xe8" => [0, "\xf8M"], "\xe9" => [0, "\xf8N"], "\xea" => [0, "\xf8O"], "\xeb" => [0, "\xf8P"], "\xec" => [0, "\xf8Q"], "\xed" => [0, "\xf8R"], "\xee" => [0, "\xf8S"], "\xef" => [0, "\xf8T"], "\xf0" => [0, "\xf8U"], "\xf1" => [0, "\xf8V"], "\xf2" => [0, "\xf8W"], "\xf3" => [0, "\xf8Y"], "\xf4" => [0, "\xf8j"], "\xf5" => [0, "\xf8k"], "\xf6" => [0, "\xf8q"], "\xf7" => [0, "\xf8v"], "\xf8" => [0, "\xf8w"], "\xf9" => [0, "\xf8x"], "\xfa" => [0, "\xf8y"], "\xfb" => [0, "\xf8z"], "\xfc" => [82, "\xf8"], "\xfd" => [87, "\xf8"], "\xfe" => [130, "\xf8"], "\xff" => [9, "\xf8"]], ["\x00" => [94, "\xfa0"], "\x01" => [76, "\xfa0"], "\x02" => [104, "\xfa0"], "\x03" => [16, "\xfa0"], "\x04" => [94, "\xfa1"], "\x05" => [76, "\xfa1"], "\x06" => [104, "\xfa1"], "\x07" => [16, "\xfa1"], "\x08" => [94, "\xfa2"], "\t" => [76, "\xfa2"], "\n" => [104, "\xfa2"], "\v" => [16, "\xfa2"], "\f" => [94, "\xfaa"], "\r" => [76, "\xfaa"], "\x0e" => [104, "\xfaa"], "\x0f" => [16, "\xfaa"], "\x10" => [94, "\xfac"], "\x11" => [76, "\xfac"], "\x12" => [104, "\xfac"], "\x13" => [16, "\xfac"], "\x14" => [94, "\xfae"], "\x15" => [76, "\xfae"], "\x16" => [104, "\xfae"], "\x17" => [16, "\xfae"], "\x18" => [94, "\xfai"], "\x19" => [76, "\xfai"], "\x1a" => [104, "\xfai"], "\x1b" => [16, "\xfai"], "\x1c" => [94, "\xfao"], "\x1d" => [76, "\xfao"], "\x1e" => [104, "\xfao"], "\x1f" => [16, "\xfao"], " " => [94, "\xfas"], "!" => [76, "\xfas"], "\"" => [104, "\xfas"], "#" => [16, "\xfas"], "\$" => [94, "\xfat"], "%" => [76, "\xfat"], "&" => [104, "\xfat"], "'" => [16, "\xfat"], "(" => [77, "\xfa "], ")" => [18, "\xfa "], "*" => [77, "\xfa%"], "+" => [18, "\xfa%"], "," => [77, "\xfa-"], "-" => [18, "\xfa-"], "." => [77, "\xfa."], "/" => [18, "\xfa."], [77, "\xfa/"], [18, "\xfa/"], [77, "\xfa3"], [18, "\xfa3"], [77, "\xfa4"], [18, "\xfa4"], [77, "\xfa5"], [18, "\xfa5"], [77, "\xfa6"], [18, "\xfa6"], ":" => [77, "\xfa7"], ";" => [18, "\xfa7"], "<" => [77, "\xfa8"], "=" => [18, "\xfa8"], ">" => [77, "\xfa9"], "?" => [18, "\xfa9"], "@" => [77, "\xfa="], "A" => [18, "\xfa="], "B" => [77, "\xfaA"], "C" => [18, "\xfaA"], "D" => [77, "\xfa_"], "E" => [18, "\xfa_"], "F" => [77, "\xfab"], "G" => [18, "\xfab"], "H" => [77, "\xfad"], "I" => [18, "\xfad"], "J" => [77, "\xfaf"], "K" => [18, "\xfaf"], "L" => [77, "\xfag"], "M" => [18, "\xfag"], "N" => [77, "\xfah"], "O" => [18, "\xfah"], "P" => [77, "\xfal"], "Q" => [18, "\xfal"], "R" => [77, "\xfam"], "S" => [18, "\xfam"], "T" => [77, "\xfan"], "U" => [18, "\xfan"], "V" => [77, "\xfap"], "W" => [18, "\xfap"], "X" => [77, "\xfar"], "Y" => [18, "\xfar"], "Z" => [77, "\xfau"], "[" => [18, "\xfau"], "\\" => [0, "\xfa:"], "]" => [0, "\xfaB"], "^" => [0, "\xfaC"], "_" => [0, "\xfaD"], "`" => [0, "\xfaE"], "a" => [0, "\xfaF"], "b" => [0, "\xfaG"], "c" => [0, "\xfaH"], "d" => [0, "\xfaI"], "e" => [0, "\xfaJ"], "f" => [0, "\xfaK"], "g" => [0, "\xfaL"], "h" => [0, "\xfaM"], "i" => [0, "\xfaN"], "j" => [0, "\xfaO"], "k" => [0, "\xfaP"], "l" => [0, "\xfaQ"], "m" => [0, "\xfaR"], "n" => [0, "\xfaS"], "o" => [0, "\xfaT"], "p" => [0, "\xfaU"], "q" => [0, "\xfaV"], "r" => [0, "\xfaW"], "s" => [0, "\xfaY"], "t" => [0, "\xfaj"], "u" => [0, "\xfak"], "v" => [0, "\xfaq"], "w" => [0, "\xfav"], "x" => [0, "\xfaw"], "y" => [0, "\xfax"], "z" => [0, "\xfay"], "{" => [0, "\xfaz"], "|" => [82, "\xfa"], "}" => [87, "\xfa"], "~" => [130, "\xfa"], "" => [9, "\xfa"], "\x80" => [94, "\xfb0"], "\x81" => [76, "\xfb0"], "\x82" => [104, "\xfb0"], "\x83" => [16, "\xfb0"], "\x84" => [94, "\xfb1"], "\x85" => [76, "\xfb1"], "\x86" => [104, "\xfb1"], "\x87" => [16, "\xfb1"], "\x88" => [94, "\xfb2"], "\x89" => [76, "\xfb2"], "\x8a" => [104, "\xfb2"], "\x8b" => [16, "\xfb2"], "\x8c" => [94, "\xfba"], "\x8d" => [76, "\xfba"], "\x8e" => [104, "\xfba"], "\x8f" => [16, "\xfba"], "\x90" => [94, "\xfbc"], "\x91" => [76, "\xfbc"], "\x92" => [104, "\xfbc"], "\x93" => [16, "\xfbc"], "\x94" => [94, "\xfbe"], "\x95" => [76, "\xfbe"], "\x96" => [104, "\xfbe"], "\x97" => [16, "\xfbe"], "\x98" => [94, "\xfbi"], "\x99" => [76, "\xfbi"], "\x9a" => [104, "\xfbi"], "\x9b" => [16, "\xfbi"], "\x9c" => [94, "\xfbo"], "\x9d" => [76, "\xfbo"], "\x9e" => [104, "\xfbo"], "\x9f" => [16, "\xfbo"], "\xa0" => [94, "\xfbs"], "\xa1" => [76, "\xfbs"], "\xa2" => [104, "\xfbs"], "\xa3" => [16, "\xfbs"], "\xa4" => [94, "\xfbt"], "\xa5" => [76, "\xfbt"], "\xa6" => [104, "\xfbt"], "\xa7" => [16, "\xfbt"], "\xa8" => [77, "\xfb "], "\xa9" => [18, "\xfb "], "\xaa" => [77, "\xfb%"], "\xab" => [18, "\xfb%"], "\xac" => [77, "\xfb-"], "\xad" => [18, "\xfb-"], "\xae" => [77, "\xfb."], "\xaf" => [18, "\xfb."], "\xb0" => [77, "\xfb/"], "\xb1" => [18, "\xfb/"], "\xb2" => [77, "\xfb3"], "\xb3" => [18, "\xfb3"], "\xb4" => [77, "\xfb4"], "\xb5" => [18, "\xfb4"], "\xb6" => [77, "\xfb5"], "\xb7" => [18, "\xfb5"], "\xb8" => [77, "\xfb6"], "\xb9" => [18, "\xfb6"], "\xba" => [77, "\xfb7"], "\xbb" => [18, "\xfb7"], "\xbc" => [77, "\xfb8"], "\xbd" => [18, "\xfb8"], "\xbe" => [77, "\xfb9"], "\xbf" => [18, "\xfb9"], "\xc0" => [77, "\xfb="], "\xc1" => [18, "\xfb="], "\xc2" => [77, "\xfbA"], "\xc3" => [18, "\xfbA"], "\xc4" => [77, "\xfb_"], "\xc5" => [18, "\xfb_"], "\xc6" => [77, "\xfbb"], "\xc7" => [18, "\xfbb"], "\xc8" => [77, "\xfbd"], "\xc9" => [18, "\xfbd"], "\xca" => [77, "\xfbf"], "\xcb" => [18, "\xfbf"], "\xcc" => [77, "\xfbg"], "\xcd" => [18, "\xfbg"], "\xce" => [77, "\xfbh"], "\xcf" => [18, "\xfbh"], "\xd0" => [77, "\xfbl"], "\xd1" => [18, "\xfbl"], "\xd2" => [77, "\xfbm"], "\xd3" => [18, "\xfbm"], "\xd4" => [77, "\xfbn"], "\xd5" => [18, "\xfbn"], "\xd6" => [77, "\xfbp"], "\xd7" => [18, "\xfbp"], "\xd8" => [77, "\xfbr"], "\xd9" => [18, "\xfbr"], "\xda" => [77, "\xfbu"], "\xdb" => [18, "\xfbu"], "\xdc" => [0, "\xfb:"], "\xdd" => [0, "\xfbB"], "\xde" => [0, "\xfbC"], "\xdf" => [0, "\xfbD"], "\xe0" => [0, "\xfbE"], "\xe1" => [0, "\xfbF"], "\xe2" => [0, "\xfbG"], "\xe3" => [0, "\xfbH"], "\xe4" => [0, "\xfbI"], "\xe5" => [0, "\xfbJ"], "\xe6" => [0, "\xfbK"], "\xe7" => [0, "\xfbL"], "\xe8" => [0, "\xfbM"], "\xe9" => [0, "\xfbN"], "\xea" => [0, "\xfbO"], "\xeb" => [0, "\xfbP"], "\xec" => [0, "\xfbQ"], "\xed" => [0, "\xfbR"], "\xee" => [0, "\xfbS"], "\xef" => [0, "\xfbT"], "\xf0" => [0, "\xfbU"], "\xf1" => [0, "\xfbV"], "\xf2" => [0, "\xfbW"], "\xf3" => [0, "\xfbY"], "\xf4" => [0, "\xfbj"], "\xf5" => [0, "\xfbk"], "\xf6" => [0, "\xfbq"], "\xf7" => [0, "\xfbv"], "\xf8" => [0, "\xfbw"], "\xf9" => [0, "\xfbx"], "\xfa" => [0, "\xfby"], "\xfb" => [0, "\xfbz"], "\xfc" => [82, "\xfb"], "\xfd" => [87, "\xfb"], "\xfe" => [130, "\xfb"], "\xff" => [9, "\xfb"]], ["\x00" => [77, "\xfa0"], "\x01" => [18, "\xfa0"], "\x02" => [77, "\xfa1"], "\x03" => [18, "\xfa1"], "\x04" => [77, "\xfa2"], "\x05" => [18, "\xfa2"], "\x06" => [77, "\xfaa"], "\x07" => [18, "\xfaa"], "\x08" => [77, "\xfac"], "\t" => [18, "\xfac"], "\n" => [77, "\xfae"], "\v" => [18, "\xfae"], "\f" => [77, "\xfai"], "\r" => [18, "\xfai"], "\x0e" => [77, "\xfao"], "\x0f" => [18, "\xfao"], "\x10" => [77, "\xfas"], "\x11" => [18, "\xfas"], "\x12" => [77, "\xfat"], "\x13" => [18, "\xfat"], "\x14" => [0, "\xfa "], "\x15" => [0, "\xfa%"], "\x16" => [0, "\xfa-"], "\x17" => [0, "\xfa."], "\x18" => [0, "\xfa/"], "\x19" => [0, "\xfa3"], "\x1a" => [0, "\xfa4"], "\x1b" => [0, "\xfa5"], "\x1c" => [0, "\xfa6"], "\x1d" => [0, "\xfa7"], "\x1e" => [0, "\xfa8"], "\x1f" => [0, "\xfa9"], " " => [0, "\xfa="], "!" => [0, "\xfaA"], "\"" => [0, "\xfa_"], "#" => [0, "\xfab"], "\$" => [0, "\xfad"], "%" => [0, "\xfaf"], "&" => [0, "\xfag"], "'" => [0, "\xfah"], "(" => [0, "\xfal"], ")" => [0, "\xfam"], "*" => [0, "\xfan"], "+" => [0, "\xfap"], "," => [0, "\xfar"], "-" => [0, "\xfau"], "." => [100, "\xfa"], "/" => [110, "\xfa"], [111, "\xfa"], [115, "\xfa"], [116, "\xfa"], [118, "\xfa"], [119, "\xfa"], [122, "\xfa"], [123, "\xfa"], [125, "\xfa"], [126, "\xfa"], [129, "\xfa"], ":" => [143, "\xfa"], ";" => [148, "\xfa"], "<" => [151, "\xfa"], "=" => [153, "\xfa"], ">" => [83, "\xfa"], "?" => [10, "\xfa"], "@" => [77, "\xfb0"], "A" => [18, "\xfb0"], "B" => [77, "\xfb1"], "C" => [18, "\xfb1"], "D" => [77, "\xfb2"], "E" => [18, "\xfb2"], "F" => [77, "\xfba"], "G" => [18, "\xfba"], "H" => [77, "\xfbc"], "I" => [18, "\xfbc"], "J" => [77, "\xfbe"], "K" => [18, "\xfbe"], "L" => [77, "\xfbi"], "M" => [18, "\xfbi"], "N" => [77, "\xfbo"], "O" => [18, "\xfbo"], "P" => [77, "\xfbs"], "Q" => [18, "\xfbs"], "R" => [77, "\xfbt"], "S" => [18, "\xfbt"], "T" => [0, "\xfb "], "U" => [0, "\xfb%"], "V" => [0, "\xfb-"], "W" => [0, "\xfb."], "X" => [0, "\xfb/"], "Y" => [0, "\xfb3"], "Z" => [0, "\xfb4"], "[" => [0, "\xfb5"], "\\" => [0, "\xfb6"], "]" => [0, "\xfb7"], "^" => [0, "\xfb8"], "_" => [0, "\xfb9"], "`" => [0, "\xfb="], "a" => [0, "\xfbA"], "b" => [0, "\xfb_"], "c" => [0, "\xfbb"], "d" => [0, "\xfbd"], "e" => [0, "\xfbf"], "f" => [0, "\xfbg"], "g" => [0, "\xfbh"], "h" => [0, "\xfbl"], "i" => [0, "\xfbm"], "j" => [0, "\xfbn"], "k" => [0, "\xfbp"], "l" => [0, "\xfbr"], "m" => [0, "\xfbu"], "n" => [100, "\xfb"], "o" => [110, "\xfb"], "p" => [111, "\xfb"], "q" => [115, "\xfb"], "r" => [116, "\xfb"], "s" => [118, "\xfb"], "t" => [119, "\xfb"], "u" => [122, "\xfb"], "v" => [123, "\xfb"], "w" => [125, "\xfb"], "x" => [126, "\xfb"], "y" => [129, "\xfb"], "z" => [143, "\xfb"], "{" => [148, "\xfb"], "|" => [151, "\xfb"], "}" => [153, "\xfb"], "~" => [83, "\xfb"], "" => [10, "\xfb"], "\x80" => [77, "\xfc0"], "\x81" => [18, "\xfc0"], "\x82" => [77, "\xfc1"], "\x83" => [18, "\xfc1"], "\x84" => [77, "\xfc2"], "\x85" => [18, "\xfc2"], "\x86" => [77, "\xfca"], "\x87" => [18, "\xfca"], "\x88" => [77, "\xfcc"], "\x89" => [18, "\xfcc"], "\x8a" => [77, "\xfce"], "\x8b" => [18, "\xfce"], "\x8c" => [77, "\xfci"], "\x8d" => [18, "\xfci"], "\x8e" => [77, "\xfco"], "\x8f" => [18, "\xfco"], "\x90" => [77, "\xfcs"], "\x91" => [18, "\xfcs"], "\x92" => [77, "\xfct"], "\x93" => [18, "\xfct"], "\x94" => [0, "\xfc "], "\x95" => [0, "\xfc%"], "\x96" => [0, "\xfc-"], "\x97" => [0, "\xfc."], "\x98" => [0, "\xfc/"], "\x99" => [0, "\xfc3"], "\x9a" => [0, "\xfc4"], "\x9b" => [0, "\xfc5"], "\x9c" => [0, "\xfc6"], "\x9d" => [0, "\xfc7"], "\x9e" => [0, "\xfc8"], "\x9f" => [0, "\xfc9"], "\xa0" => [0, "\xfc="], "\xa1" => [0, "\xfcA"], "\xa2" => [0, "\xfc_"], "\xa3" => [0, "\xfcb"], "\xa4" => [0, "\xfcd"], "\xa5" => [0, "\xfcf"], "\xa6" => [0, "\xfcg"], "\xa7" => [0, "\xfch"], "\xa8" => [0, "\xfcl"], "\xa9" => [0, "\xfcm"], "\xaa" => [0, "\xfcn"], "\xab" => [0, "\xfcp"], "\xac" => [0, "\xfcr"], "\xad" => [0, "\xfcu"], "\xae" => [100, "\xfc"], "\xaf" => [110, "\xfc"], "\xb0" => [111, "\xfc"], "\xb1" => [115, "\xfc"], "\xb2" => [116, "\xfc"], "\xb3" => [118, "\xfc"], "\xb4" => [119, "\xfc"], "\xb5" => [122, "\xfc"], "\xb6" => [123, "\xfc"], "\xb7" => [125, "\xfc"], "\xb8" => [126, "\xfc"], "\xb9" => [129, "\xfc"], "\xba" => [143, "\xfc"], "\xbb" => [148, "\xfc"], "\xbc" => [151, "\xfc"], "\xbd" => [153, "\xfc"], "\xbe" => [83, "\xfc"], "\xbf" => [10, "\xfc"], "\xc0" => [77, "\xfd0"], "\xc1" => [18, "\xfd0"], "\xc2" => [77, "\xfd1"], "\xc3" => [18, "\xfd1"], "\xc4" => [77, "\xfd2"], "\xc5" => [18, "\xfd2"], "\xc6" => [77, "\xfda"], "\xc7" => [18, "\xfda"], "\xc8" => [77, "\xfdc"], "\xc9" => [18, "\xfdc"], "\xca" => [77, "\xfde"], "\xcb" => [18, "\xfde"], "\xcc" => [77, "\xfdi"], "\xcd" => [18, "\xfdi"], "\xce" => [77, "\xfdo"], "\xcf" => [18, "\xfdo"], "\xd0" => [77, "\xfds"], "\xd1" => [18, "\xfds"], "\xd2" => [77, "\xfdt"], "\xd3" => [18, "\xfdt"], "\xd4" => [0, "\xfd "], "\xd5" => [0, "\xfd%"], "\xd6" => [0, "\xfd-"], "\xd7" => [0, "\xfd."], "\xd8" => [0, "\xfd/"], "\xd9" => [0, "\xfd3"], "\xda" => [0, "\xfd4"], "\xdb" => [0, "\xfd5"], "\xdc" => [0, "\xfd6"], "\xdd" => [0, "\xfd7"], "\xde" => [0, "\xfd8"], "\xdf" => [0, "\xfd9"], "\xe0" => [0, "\xfd="], "\xe1" => [0, "\xfdA"], "\xe2" => [0, "\xfd_"], "\xe3" => [0, "\xfdb"], "\xe4" => [0, "\xfdd"], "\xe5" => [0, "\xfdf"], "\xe6" => [0, "\xfdg"], "\xe7" => [0, "\xfdh"], "\xe8" => [0, "\xfdl"], "\xe9" => [0, "\xfdm"], "\xea" => [0, "\xfdn"], "\xeb" => [0, "\xfdp"], "\xec" => [0, "\xfdr"], "\xed" => [0, "\xfdu"], "\xee" => [100, "\xfd"], "\xef" => [110, "\xfd"], "\xf0" => [111, "\xfd"], "\xf1" => [115, "\xfd"], "\xf2" => [116, "\xfd"], "\xf3" => [118, "\xfd"], "\xf4" => [119, "\xfd"], "\xf5" => [122, "\xfd"], "\xf6" => [123, "\xfd"], "\xf7" => [125, "\xfd"], "\xf8" => [126, "\xfd"], "\xf9" => [129, "\xfd"], "\xfa" => [143, "\xfd"], "\xfb" => [148, "\xfd"], "\xfc" => [151, "\xfd"], "\xfd" => [153, "\xfd"], "\xfe" => [83, "\xfd"], "\xff" => [10, "\xfd"]], ["\x00" => [94, "\xfc0"], "\x01" => [76, "\xfc0"], "\x02" => [104, "\xfc0"], "\x03" => [16, "\xfc0"], "\x04" => [94, "\xfc1"], "\x05" => [76, "\xfc1"], "\x06" => [104, "\xfc1"], "\x07" => [16, "\xfc1"], "\x08" => [94, "\xfc2"], "\t" => [76, "\xfc2"], "\n" => [104, "\xfc2"], "\v" => [16, "\xfc2"], "\f" => [94, "\xfca"], "\r" => [76, "\xfca"], "\x0e" => [104, "\xfca"], "\x0f" => [16, "\xfca"], "\x10" => [94, "\xfcc"], "\x11" => [76, "\xfcc"], "\x12" => [104, "\xfcc"], "\x13" => [16, "\xfcc"], "\x14" => [94, "\xfce"], "\x15" => [76, "\xfce"], "\x16" => [104, "\xfce"], "\x17" => [16, "\xfce"], "\x18" => [94, "\xfci"], "\x19" => [76, "\xfci"], "\x1a" => [104, "\xfci"], "\x1b" => [16, "\xfci"], "\x1c" => [94, "\xfco"], "\x1d" => [76, "\xfco"], "\x1e" => [104, "\xfco"], "\x1f" => [16, "\xfco"], " " => [94, "\xfcs"], "!" => [76, "\xfcs"], "\"" => [104, "\xfcs"], "#" => [16, "\xfcs"], "\$" => [94, "\xfct"], "%" => [76, "\xfct"], "&" => [104, "\xfct"], "'" => [16, "\xfct"], "(" => [77, "\xfc "], ")" => [18, "\xfc "], "*" => [77, "\xfc%"], "+" => [18, "\xfc%"], "," => [77, "\xfc-"], "-" => [18, "\xfc-"], "." => [77, "\xfc."], "/" => [18, "\xfc."], [77, "\xfc/"], [18, "\xfc/"], [77, "\xfc3"], [18, "\xfc3"], [77, "\xfc4"], [18, "\xfc4"], [77, "\xfc5"], [18, "\xfc5"], [77, "\xfc6"], [18, "\xfc6"], ":" => [77, "\xfc7"], ";" => [18, "\xfc7"], "<" => [77, "\xfc8"], "=" => [18, "\xfc8"], ">" => [77, "\xfc9"], "?" => [18, "\xfc9"], "@" => [77, "\xfc="], "A" => [18, "\xfc="], "B" => [77, "\xfcA"], "C" => [18, "\xfcA"], "D" => [77, "\xfc_"], "E" => [18, "\xfc_"], "F" => [77, "\xfcb"], "G" => [18, "\xfcb"], "H" => [77, "\xfcd"], "I" => [18, "\xfcd"], "J" => [77, "\xfcf"], "K" => [18, "\xfcf"], "L" => [77, "\xfcg"], "M" => [18, "\xfcg"], "N" => [77, "\xfch"], "O" => [18, "\xfch"], "P" => [77, "\xfcl"], "Q" => [18, "\xfcl"], "R" => [77, "\xfcm"], "S" => [18, "\xfcm"], "T" => [77, "\xfcn"], "U" => [18, "\xfcn"], "V" => [77, "\xfcp"], "W" => [18, "\xfcp"], "X" => [77, "\xfcr"], "Y" => [18, "\xfcr"], "Z" => [77, "\xfcu"], "[" => [18, "\xfcu"], "\\" => [0, "\xfc:"], "]" => [0, "\xfcB"], "^" => [0, "\xfcC"], "_" => [0, "\xfcD"], "`" => [0, "\xfcE"], "a" => [0, "\xfcF"], "b" => [0, "\xfcG"], "c" => [0, "\xfcH"], "d" => [0, "\xfcI"], "e" => [0, "\xfcJ"], "f" => [0, "\xfcK"], "g" => [0, "\xfcL"], "h" => [0, "\xfcM"], "i" => [0, "\xfcN"], "j" => [0, "\xfcO"], "k" => [0, "\xfcP"], "l" => [0, "\xfcQ"], "m" => [0, "\xfcR"], "n" => [0, "\xfcS"], "o" => [0, "\xfcT"], "p" => [0, "\xfcU"], "q" => [0, "\xfcV"], "r" => [0, "\xfcW"], "s" => [0, "\xfcY"], "t" => [0, "\xfcj"], "u" => [0, "\xfck"], "v" => [0, "\xfcq"], "w" => [0, "\xfcv"], "x" => [0, "\xfcw"], "y" => [0, "\xfcx"], "z" => [0, "\xfcy"], "{" => [0, "\xfcz"], "|" => [82, "\xfc"], "}" => [87, "\xfc"], "~" => [130, "\xfc"], "" => [9, "\xfc"], "\x80" => [94, "\xfd0"], "\x81" => [76, "\xfd0"], "\x82" => [104, "\xfd0"], "\x83" => [16, "\xfd0"], "\x84" => [94, "\xfd1"], "\x85" => [76, "\xfd1"], "\x86" => [104, "\xfd1"], "\x87" => [16, "\xfd1"], "\x88" => [94, "\xfd2"], "\x89" => [76, "\xfd2"], "\x8a" => [104, "\xfd2"], "\x8b" => [16, "\xfd2"], "\x8c" => [94, "\xfda"], "\x8d" => [76, "\xfda"], "\x8e" => [104, "\xfda"], "\x8f" => [16, "\xfda"], "\x90" => [94, "\xfdc"], "\x91" => [76, "\xfdc"], "\x92" => [104, "\xfdc"], "\x93" => [16, "\xfdc"], "\x94" => [94, "\xfde"], "\x95" => [76, "\xfde"], "\x96" => [104, "\xfde"], "\x97" => [16, "\xfde"], "\x98" => [94, "\xfdi"], "\x99" => [76, "\xfdi"], "\x9a" => [104, "\xfdi"], "\x9b" => [16, "\xfdi"], "\x9c" => [94, "\xfdo"], "\x9d" => [76, "\xfdo"], "\x9e" => [104, "\xfdo"], "\x9f" => [16, "\xfdo"], "\xa0" => [94, "\xfds"], "\xa1" => [76, "\xfds"], "\xa2" => [104, "\xfds"], "\xa3" => [16, "\xfds"], "\xa4" => [94, "\xfdt"], "\xa5" => [76, "\xfdt"], "\xa6" => [104, "\xfdt"], "\xa7" => [16, "\xfdt"], "\xa8" => [77, "\xfd "], "\xa9" => [18, "\xfd "], "\xaa" => [77, "\xfd%"], "\xab" => [18, "\xfd%"], "\xac" => [77, "\xfd-"], "\xad" => [18, "\xfd-"], "\xae" => [77, "\xfd."], "\xaf" => [18, "\xfd."], "\xb0" => [77, "\xfd/"], "\xb1" => [18, "\xfd/"], "\xb2" => [77, "\xfd3"], "\xb3" => [18, "\xfd3"], "\xb4" => [77, "\xfd4"], "\xb5" => [18, "\xfd4"], "\xb6" => [77, "\xfd5"], "\xb7" => [18, "\xfd5"], "\xb8" => [77, "\xfd6"], "\xb9" => [18, "\xfd6"], "\xba" => [77, "\xfd7"], "\xbb" => [18, "\xfd7"], "\xbc" => [77, "\xfd8"], "\xbd" => [18, "\xfd8"], "\xbe" => [77, "\xfd9"], "\xbf" => [18, "\xfd9"], "\xc0" => [77, "\xfd="], "\xc1" => [18, "\xfd="], "\xc2" => [77, "\xfdA"], "\xc3" => [18, "\xfdA"], "\xc4" => [77, "\xfd_"], "\xc5" => [18, "\xfd_"], "\xc6" => [77, "\xfdb"], "\xc7" => [18, "\xfdb"], "\xc8" => [77, "\xfdd"], "\xc9" => [18, "\xfdd"], "\xca" => [77, "\xfdf"], "\xcb" => [18, "\xfdf"], "\xcc" => [77, "\xfdg"], "\xcd" => [18, "\xfdg"], "\xce" => [77, "\xfdh"], "\xcf" => [18, "\xfdh"], "\xd0" => [77, "\xfdl"], "\xd1" => [18, "\xfdl"], "\xd2" => [77, "\xfdm"], "\xd3" => [18, "\xfdm"], "\xd4" => [77, "\xfdn"], "\xd5" => [18, "\xfdn"], "\xd6" => [77, "\xfdp"], "\xd7" => [18, "\xfdp"], "\xd8" => [77, "\xfdr"], "\xd9" => [18, "\xfdr"], "\xda" => [77, "\xfdu"], "\xdb" => [18, "\xfdu"], "\xdc" => [0, "\xfd:"], "\xdd" => [0, "\xfdB"], "\xde" => [0, "\xfdC"], "\xdf" => [0, "\xfdD"], "\xe0" => [0, "\xfdE"], "\xe1" => [0, "\xfdF"], "\xe2" => [0, "\xfdG"], "\xe3" => [0, "\xfdH"], "\xe4" => [0, "\xfdI"], "\xe5" => [0, "\xfdJ"], "\xe6" => [0, "\xfdK"], "\xe7" => [0, "\xfdL"], "\xe8" => [0, "\xfdM"], "\xe9" => [0, "\xfdN"], "\xea" => [0, "\xfdO"], "\xeb" => [0, "\xfdP"], "\xec" => [0, "\xfdQ"], "\xed" => [0, "\xfdR"], "\xee" => [0, "\xfdS"], "\xef" => [0, "\xfdT"], "\xf0" => [0, "\xfdU"], "\xf1" => [0, "\xfdV"], "\xf2" => [0, "\xfdW"], "\xf3" => [0, "\xfdY"], "\xf4" => [0, "\xfdj"], "\xf5" => [0, "\xfdk"], "\xf6" => [0, "\xfdq"], "\xf7" => [0, "\xfdv"], "\xf8" => [0, "\xfdw"], "\xf9" => [0, "\xfdx"], "\xfa" => [0, "\xfdy"], "\xfb" => [0, "\xfdz"], "\xfc" => [82, "\xfd"], "\xfd" => [87, "\xfd"], "\xfe" => [130, "\xfd"], "\xff" => [9, "\xfd"]]]; diff --git a/dependencies/amphp/hpack/tools/compress.php b/dependencies/amphp/hpack/tools/compress.php deleted file mode 100644 index 201358b..0000000 --- a/dependencies/amphp/hpack/tools/compress.php +++ /dev/null @@ -1,114 +0,0 @@ -= 0 && (!isset($all[$i]) || \is_array($all[$i]) && ($all[$i][0] === \T_COMMENT || $all[$i][0] === \T_DOC_COMMENT || $all[$i][0] === \T_WHITESPACE)); --$i) { - } - return $i; -}; -$first = \true; -foreach ($all as $i => $token) { - if (\is_array($token) && ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT)) { - // remove all comments except first - if ($first === \true) { - $first = \false; - continue; - } - unset($all[$i]); - } elseif (\is_array($token) && $token[0] === \T_PUBLIC) { - // get next non-whitespace token after `public` visibility - $token = $all[$next($i)]; - if (\is_array($token) && $token[0] === \T_VARIABLE) { - // use shorter variable notation `public $a` => `var $a` - $all[$i] = [\T_VAR, 'var']; - } else { - // remove unneeded public identifier `public static function a()` => `static function a()` - unset($all[$i]); - } - } elseif (\is_array($token) && $token[0] === \T_LNUMBER) { - // Use shorter integer notation `0x0F` => `15` and `011` => `9`. - // Technically, hex codes may be shorter for very large ints, but adding - // another 2 leading chars is rarely worth it. - // Optimizing floats is not really worth it, as they have many special - // cases, such as e-notation and we would lose types for `0.0` => `0`. - $all[$i][1] = (string) \intval($token[1], 0); - } elseif (\is_array($token) && $token[0] === \T_NEW) { - // remove unneeded parenthesis for constructors without args `new a();` => `new a;` - // jump over next token (class name), then next must be open parenthesis, followed by closing - $open = $next($next($i)); - $close = $next($open); - if ($all[$open] === '(' && $all[$close] === ')') { - unset($all[$open], $all[$close]); - } - } elseif (\is_array($token) && $token[0] === \T_STRING) { - // replace certain functions with their shorter alias function name - // http://php.net/manual/en/aliases.php - static $replace = ['implode' => 'join', 'fwrite' => 'fputs', 'array_key_exists' => 'key_exists', 'current' => 'pos']; - // check this has a replacement and "looks like" a function call - // this works on a number of assumptions, such as not being aliased/namespaced - if (isset($replace[$token[1]])) { - $p = $all[$prev($i)]; - if ($all[$next($i)] === '(' && (!\is_array($p) || !\in_array($p[0], [\T_FUNCTION, \T_OBJECT_OPERATOR, \T_DOUBLE_COLON, \T_NEW]))) { - $all[$i][1] = $replace[$all[$i][1]]; - } - } - } elseif (\is_array($token) && $token[0] === \T_EXIT) { - // replace `exit` with shorter alias `die` - // it's a language construct, not a function (see above) - $all[$i][1] = 'die'; - } elseif (\is_array($token) && $token[0] === \T_RETURN) { - // replace `return null;` with `return;` - $t = $next($i); - if (\is_array($all[$t]) && $all[$t][0] === \T_STRING && $all[$t][1] === 'null' && $all[$next($t)] === ';') { - unset($all[$t]); - } - } -} -$all = \array_values($all); -foreach ($all as $i => $token) { - if (\is_array($token) && $token[0] === \T_WHITESPACE) { - if (\strpos($token[1], "\n") !== \false) { - $token = \strpos("()[]<>=+-*/%|,.:?!'\"\n", \substr($small, -1)) === \false ? "\n" : ''; - } else { - $last = \substr($small, -1); - $next = isset($all[$i + 1]) ? \substr(\is_array($all[$i + 1]) ? $all[$i + 1][1] : $all[$i + 1], 0, 1) : ' '; - $token = \strpos('()[]{}<>;=+-*/%&|,.:?!@\'"' . "\r\n", $last) !== \false || \strpos('()[]{}<>;=+-*/%&|,.:?!@\'"' . '\\$', $next) !== \false ? '' : ' '; - } - } - $small .= isset($token[1]) ? $token[1] : $token; -} -\file_put_contents($argv[1], $small); diff --git a/dependencies/amphp/hpack/tools/php-fuzzer/decode-crash.php b/dependencies/amphp/hpack/tools/php-fuzzer/decode-crash.php deleted file mode 100644 index ba1290d..0000000 --- a/dependencies/amphp/hpack/tools/php-fuzzer/decode-crash.php +++ /dev/null @@ -1,7 +0,0 @@ -decode(\file_get_contents($argv[1]), 8192); diff --git a/dependencies/amphp/hpack/tools/php-fuzzer/decode-oracle.php b/dependencies/amphp/hpack/tools/php-fuzzer/decode-oracle.php deleted file mode 100644 index 1b2c867..0000000 --- a/dependencies/amphp/hpack/tools/php-fuzzer/decode-oracle.php +++ /dev/null @@ -1,17 +0,0 @@ -setTarget(function (string $input) { - $result1 = (new Internal\HPackNghttp2())->decode($input, 8192); - $result2 = (new Internal\HPackNative())->decode($input, 8192); - if ($result1 === null || $result2 === null) { - return; - } - if ($result1 !== $result2) { - throw new \Error('Mismatch: ' . \var_export($result1, \true) . ' / ' . \var_export($result2, \true)); - } -}); -$fuzzer->setMaxLen(1024); diff --git a/dependencies/amphp/hpack/tools/php-fuzzer/decode.php b/dependencies/amphp/hpack/tools/php-fuzzer/decode.php deleted file mode 100644 index a831bc4..0000000 --- a/dependencies/amphp/hpack/tools/php-fuzzer/decode.php +++ /dev/null @@ -1,10 +0,0 @@ -setTarget(function (string $input) { - (new HPack())->decode($input, 8192); -}); -$fuzzer->setMaxLen(1024); diff --git a/dependencies/amphp/http-client/psalm.xml b/dependencies/amphp/http-client/psalm.xml deleted file mode 100644 index c8cc5de..0000000 --- a/dependencies/amphp/http-client/psalm.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/amphp/http-client/src/ApplicationInterceptor.php b/dependencies/amphp/http-client/src/ApplicationInterceptor.php deleted file mode 100644 index cd2d6d0..0000000 --- a/dependencies/amphp/http-client/src/ApplicationInterceptor.php +++ /dev/null @@ -1,34 +0,0 @@ -request(...)` resolves. - * - * An interceptor might also short-circuit and not delegate to the `$httpClient` at all. - * - * Any retry or cloned follow-up request must be manually cloned from `$request` to ensure a properly working - * interceptor chain, e.g. the {@see DecompressResponse} interceptor only decodes a response if the - * `accept-encoding` header isn't set manually. If the request isn't cloned, the first attempt will set the header - * and the second attempt will see the header and won't decode the response, because it thinks another interceptor - * or the application itself will care about the decoding. - * - * @param Request $request - * @param CancellationToken $cancellation - * @param DelegateHttpClient $httpClient - * - * @return Promise - */ - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise; -} diff --git a/dependencies/amphp/http-client/src/Body/FileBody.php b/dependencies/amphp/http-client/src/Body/FileBody.php deleted file mode 100644 index b818d7c..0000000 --- a/dependencies/amphp/http-client/src/Body/FileBody.php +++ /dev/null @@ -1,69 +0,0 @@ -path = $path; - } - public function createBodyStream() : InputStream - { - $handlePromise = \function_exists('WP_Ultimo\\Dependencies\\Amp\\File\\openFile') ? openFile($this->path, "r") : open($this->path, "r"); - return new class($handlePromise) implements InputStream - { - /** @var Promise */ - private $promise; - /** @var InputStream|null */ - private $stream; - public function __construct(Promise $promise) - { - $this->promise = $promise; - $this->promise->onResolve(function ($error, $stream) { - if ($error) { - return; - } - $this->stream = $stream; - }); - } - public function read() : Promise - { - if (!$this->stream) { - return call(function () { - /** @var InputStream $stream */ - $stream = (yield $this->promise); - return $stream->read(); - }); - } - return $this->stream->read(); - } - }; - } - public function getHeaders() : Promise - { - return new Success([]); - } - public function getBodyLength() : Promise - { - return \function_exists('WP_Ultimo\\Dependencies\\Amp\\File\\getSize') ? getSize($this->path) : size($this->path); - } -} diff --git a/dependencies/amphp/http-client/src/Body/FormBody.php b/dependencies/amphp/http-client/src/Body/FormBody.php deleted file mode 100644 index 86ade0c..0000000 --- a/dependencies/amphp/http-client/src/Body/FormBody.php +++ /dev/null @@ -1,218 +0,0 @@ -|null */ - private $cachedLength; - /** @var list|null */ - private $cachedFields; - /** - * @param string $boundary An optional multipart boundary string - */ - public function __construct(string $boundary = null) - { - /** @noinspection PhpUnhandledExceptionInspection */ - $this->boundary = $boundary ?? \bin2hex(\random_bytes(16)); - } - /** - * Add a data field to the form entity body. - * - * @param string $name - * @param string $value - * @param string $contentType - */ - public function addField(string $name, string $value, string $contentType = 'text/plain') : void - { - $this->fields[] = [$name, $value, $contentType, null]; - $this->resetCache(); - } - /** - * Add each element of a associative array as a data field to the form entity body. - * - * @param array $data - * @param string $contentType - */ - public function addFields(array $data, string $contentType = 'text/plain') : void - { - foreach ($data as $key => $value) { - $this->addField($key, $value, $contentType); - } - } - /** - * Add a file field to the form entity body. - * - * @param string $name - * @param string $filePath - * @param string $contentType - */ - public function addFile(string $name, string $filePath, string $contentType = 'application/octet-stream') : void - { - $fileName = \basename($filePath); - $this->fields[] = [$name, new FileBody($filePath), $contentType, $fileName]; - $this->isMultipart = \true; - $this->resetCache(); - } - /** - * Add each element of a associative array as a file field to the form entity body. - * - * @param array $data - * @param string $contentType - */ - public function addFiles(array $data, string $contentType = 'application/octet-stream') : void - { - foreach ($data as $key => $value) { - $this->addFile($key, $value, $contentType); - } - } - /** - * Add a file field to the form from a string. - * - * @param string $name - * @param string $fileContent - * @param string $fileName - * @param string $contentType - */ - public function addFileFromString(string $name, string $fileContent, string $fileName, string $contentType = 'application/octet-stream') : void - { - $this->fields[] = [$name, $fileContent, $contentType, $fileName]; - $this->isMultipart = \true; - $this->resetCache(); - } - /** - * Returns an array of fields, each being an array of [name, value, content-type, file-name|null]. - * Both fields and files are returned in the array. Files use a FileBody object as the value. The file-name is - * always null for fields. - * - * @return array - */ - public function getFields() : array - { - return $this->fields; - } - private function resetCache() : void - { - $this->cachedBody = null; - $this->cachedLength = null; - $this->cachedFields = null; - } - public function createBodyStream() : InputStream - { - if ($this->isMultipart) { - return $this->generateMultipartStreamFromFields($this->getMultipartFieldArray()); - } - return new InMemoryStream($this->getFormEncodedBodyString()); - } - private function getMultipartFieldArray() : array - { - if (isset($this->cachedFields)) { - return $this->cachedFields; - } - $fields = []; - foreach ($this->fields as $fieldArr) { - [$name, $field, $contentType, $fileName] = $fieldArr; - $fields[] = "--{$this->boundary}\r\n"; - /** @psalm-suppress PossiblyNullArgument */ - $fields[] = $fileName !== null ? $this->generateMultipartFileHeader($name, $fileName, $contentType) : $this->generateMultipartFieldHeader($name, $contentType); - $fields[] = $field; - $fields[] = "\r\n"; - } - $fields[] = "--{$this->boundary}--\r\n"; - return $this->cachedFields = $fields; - } - private function generateMultipartFileHeader(string $name, string $fileName, string $contentType) : string - { - $header = "Content-Disposition: form-data; name=\"{$name}\"; filename=\"{$fileName}\"\r\n"; - $header .= "Content-Type: {$contentType}\r\n"; - $header .= "Content-Transfer-Encoding: binary\r\n\r\n"; - return $header; - } - private function generateMultipartFieldHeader(string $name, string $contentType) : string - { - $header = "Content-Disposition: form-data; name=\"{$name}\"\r\n"; - if ($contentType !== "") { - $header .= "Content-Type: {$contentType}\r\n\r\n"; - } else { - $header .= "\r\n"; - } - return $header; - } - private function generateMultipartStreamFromFields(array $fields) : InputStream - { - foreach ($fields as $key => $field) { - $fields[$key] = $field instanceof FileBody ? $field->createBodyStream() : new InMemoryStream($field); - } - return new IteratorStream(new Producer(static function (callable $emit) use($fields) { - /** @psalm-var callable(string) $emit */ - foreach ($fields as $stream) { - /** @var InputStream $stream */ - while (null !== ($chunk = (yield $stream->read()))) { - (yield $emit($chunk)); - } - } - })); - } - private function getFormEncodedBodyString() : string - { - if ($this->cachedBody) { - return $this->cachedBody; - } - $fields = []; - foreach ($this->fields as $fieldArr) { - [$name, $value] = $fieldArr; - $fields[$name][] = $value; - } - foreach ($fields as $key => $value) { - $fields[$key] = isset($value[1]) ? $value : $value[0]; - } - return $this->cachedBody = \http_build_query($fields); - } - public function getHeaders() : Promise - { - return new Success(['Content-Type' => $this->determineContentType()]); - } - private function determineContentType() : string - { - return $this->isMultipart ? "multipart/form-data; boundary={$this->boundary}" : 'application/x-www-form-urlencoded'; - } - public function getBodyLength() : Promise - { - if ($this->cachedLength) { - return $this->cachedLength; - } - if (!$this->isMultipart) { - return $this->cachedLength = new Success(\strlen($this->getFormEncodedBodyString())); - } - /** @var Promise $lengthPromise */ - $lengthPromise = call(function () : \Generator { - $fields = $this->getMultipartFieldArray(); - $length = 0; - foreach ($fields as $field) { - if (\is_string($field)) { - $length += \strlen($field); - } else { - $length += (yield $field->getBodyLength()); - } - } - return $length; - }); - return $this->cachedLength = $lengthPromise; - } -} diff --git a/dependencies/amphp/http-client/src/Body/JsonBody.php b/dependencies/amphp/http-client/src/Body/JsonBody.php deleted file mode 100644 index fc56e66..0000000 --- a/dependencies/amphp/http-client/src/Body/JsonBody.php +++ /dev/null @@ -1,44 +0,0 @@ - $depth - * - * @throws HttpException - */ - public function __construct($data, int $options = 0, int $depth = 512) - { - $this->json = \json_encode($data, $options, $depth); - if (\json_last_error() !== \JSON_ERROR_NONE) { - throw new HttpException('Failed to encode data to JSON'); - } - } - public function getHeaders() : Promise - { - return new Success(['content-type' => 'application/json; charset=utf-8']); - } - public function createBodyStream() : InputStream - { - return new InMemoryStream($this->json); - } - public function getBodyLength() : Promise - { - return new Success(\strlen($this->json)); - } -} diff --git a/dependencies/amphp/http-client/src/Body/StringBody.php b/dependencies/amphp/http-client/src/Body/StringBody.php deleted file mode 100644 index 54b003e..0000000 --- a/dependencies/amphp/http-client/src/Body/StringBody.php +++ /dev/null @@ -1,29 +0,0 @@ -body = $body; - } - public function createBodyStream() : InputStream - { - return new InMemoryStream($this->body !== '' ? $this->body : null); - } - public function getHeaders() : Promise - { - return new Success([]); - } - public function getBodyLength() : Promise - { - return new Success(\strlen($this->body)); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Connection.php b/dependencies/amphp/http-client/src/Connection/Connection.php deleted file mode 100644 index c1866fb..0000000 --- a/dependencies/amphp/http-client/src/Connection/Connection.php +++ /dev/null @@ -1,28 +0,0 @@ - Returns a stream for the given request, or null if no stream is available or if - * the connection is not suited for the given request. The first request for a stream - * on a new connection MUST resolve the promise with a Stream instance. - */ - public function getStream(Request $request) : Promise; - /** - * @return string[] Array of supported protocol versions. - */ - public function getProtocolVersions() : array; - public function close() : Promise; - public function onClose(callable $onClose) : void; - public function getLocalAddress() : SocketAddress; - public function getRemoteAddress() : SocketAddress; - public function getTlsInfo() : ?TlsInfo; -} diff --git a/dependencies/amphp/http-client/src/Connection/ConnectionFactory.php b/dependencies/amphp/http-client/src/Connection/ConnectionFactory.php deleted file mode 100644 index 94dffee..0000000 --- a/dependencies/amphp/http-client/src/Connection/ConnectionFactory.php +++ /dev/null @@ -1,26 +0,0 @@ -getUri(); - $scheme = $uri->getScheme(); - $isHttps = $scheme === 'https'; - $defaultPort = $isHttps ? 443 : 80; - $host = $uri->getHost(); - $port = $uri->getPort() ?? $defaultPort; - $authority = $host . ':' . $port; - return $scheme . '://' . $authority; - } - /** @var int */ - private $connectionLimit; - /** @var ConnectionFactory */ - private $connectionFactory; - /** @var array>> */ - private $connections = []; - /** @var Connection[] */ - private $idleConnections = []; - /** @var int[] */ - private $activeRequestCounts = []; - /** @var Deferred[][] */ - private $waiting = []; - /** @var bool[] */ - private $waitForPriorConnection = []; - /** @var int */ - private $totalConnectionAttempts = 0; - /** @var int */ - private $totalStreamRequests = 0; - /** @var int */ - private $openConnectionCount = 0; - private function __construct(int $connectionLimit, ?ConnectionFactory $connectionFactory = null) - { - if ($connectionLimit < 1) { - throw new \Error('The connection limit must be greater than 0'); - } - $this->connectionLimit = $connectionLimit; - $this->connectionFactory = $connectionFactory ?? new DefaultConnectionFactory(); - } - public function __clone() - { - $this->connections = []; - $this->totalConnectionAttempts = 0; - $this->totalStreamRequests = 0; - $this->openConnectionCount = 0; - } - public function getTotalConnectionAttempts() : int - { - return $this->totalConnectionAttempts; - } - public function getTotalStreamRequests() : int - { - return $this->totalStreamRequests; - } - public function getOpenConnectionCount() : int - { - return $this->openConnectionCount; - } - public function getStream(Request $request, CancellationToken $cancellation) : Promise - { - return call(function () use($request, $cancellation) { - $this->totalStreamRequests++; - $uri = self::formatUri($request); - // Using new Coroutine avoids a bug on PHP < 7.4, see #265 - /** - * @var Stream $stream - * @psalm-suppress all - */ - [$connection, $stream] = (yield new Coroutine($this->getStreamFor($uri, $request, $cancellation))); - $connectionId = \spl_object_id($connection); - $this->activeRequestCounts[$connectionId] = ($this->activeRequestCounts[$connectionId] ?? 0) + 1; - unset($this->idleConnections[$connectionId]); - return HttpStream::fromStream($stream, coroutine(function (Request $request, CancellationToken $cancellationToken) use($connection, $stream, $uri) { - try { - /** @var Response $response */ - $response = (yield $stream->request($request, $cancellationToken)); - } catch (\Throwable $e) { - $this->onReadyConnection($connection, $uri); - throw $e; - } - // await response being completely received - $response->getTrailers()->onResolve(function () use($connection, $uri) : void { - $this->onReadyConnection($connection, $uri); - }); - return $response; - }), function () use($connection, $uri) : void { - $this->onReadyConnection($connection, $uri); - }); - }); - } - private function getStreamFor(string $uri, Request $request, CancellationToken $cancellation) : \Generator - { - $isHttps = $request->getUri()->getScheme() === 'https'; - $connections = $this->connections[$uri] ?? new \ArrayObject(); - do { - foreach ($connections as $connectionPromise) { - \assert($connectionPromise instanceof Promise); - try { - if ($isHttps && ($this->waitForPriorConnection[$uri] ?? \true)) { - // Wait for first successful connection if using a secure connection (maybe we can use HTTP/2). - $connection = (yield $connectionPromise); - } else { - $connection = (yield Promise\first([$connectionPromise, new Success()])); - if ($connection === null) { - continue; - } - } - } catch (\Exception $exception) { - continue; - // Ignore cancellations and errors of other requests. - } - \assert($connection instanceof Connection); - $stream = (yield $this->getStreamFromConnection($connection, $request)); - if ($stream === null) { - if (!$this->isAdditionalConnectionAllowed($uri) && $this->isConnectionIdle($connection)) { - $connection->close(); - break; - } - continue; - // No stream available for the given request. - } - return [$connection, $stream]; - } - $deferred = new Deferred(); - $deferredId = \spl_object_id($deferred); - $this->waiting[$uri][$deferredId] = $deferred; - $deferredPromise = $deferred->promise(); - $deferredPromise->onResolve(function () use($uri, $deferredId) : void { - $this->removeWaiting($uri, $deferredId); - }); - if ($this->isAdditionalConnectionAllowed($uri)) { - break; - } - $connection = (yield $deferredPromise); - \assert($connection instanceof Connection); - $stream = (yield $this->getStreamFromConnection($connection, $request)); - if ($stream === null) { - continue; - // Wait for a different connection to become available. - } - return [$connection, $stream]; - } while (\true); - $this->totalConnectionAttempts++; - $connectionPromise = $this->connectionFactory->create($request, $cancellation); - $promiseId = \spl_object_id($connectionPromise); - $this->connections[$uri] = $this->connections[$uri] ?? new \ArrayObject(); - $this->connections[$uri][$promiseId] = $connectionPromise; - $connectionPromise->onResolve(function (?\Throwable $exception, ?Connection $connection) use(&$deferred, $uri, $promiseId, $isHttps) : void { - if ($exception) { - $this->dropConnection($uri, null, $promiseId); - if ($deferred !== null) { - $deferred->fail($exception); - // Fail Deferred so Promise\first() below fails. - } - return; - } - \assert($connection !== null); - $connectionId = \spl_object_id($connection); - $this->openConnectionCount++; - if ($isHttps) { - $this->waitForPriorConnection[$uri] = \in_array('2', $connection->getProtocolVersions(), \true); - } - $connection->onClose(function () use($uri, $connectionId, $promiseId) : void { - $this->openConnectionCount--; - $this->dropConnection($uri, $connectionId, $promiseId); - }); - }); - try { - $connection = (yield Promise\first([$connectionPromise, $deferredPromise])); - } catch (MultiReasonException $exception) { - [$exception] = $exception->getReasons(); - // The first reason is why the connection failed. - throw $exception; - } - $deferred = null; - // Null reference so connection promise handler does not double-resolve the Deferred. - $this->removeWaiting($uri, $deferredId); - // Deferred no longer needed for this request. - \assert($connection instanceof Connection); - $stream = (yield $this->getStreamFromConnection($connection, $request)); - if ($stream === null) { - // Reused connection did not have an available stream for the given request. - $connection = (yield $connectionPromise); - // Wait for new connection request instead. - $stream = (yield $this->getStreamFromConnection($connection, $request)); - if ($stream === null) { - // Other requests used the new connection first, so we need to go around again. - // Using new Coroutine avoids a bug on PHP < 7.4, see #265 - return (yield new Coroutine($this->getStreamFor($uri, $request, $cancellation))); - } - } - return [$connection, $stream]; - } - private function getStreamFromConnection(Connection $connection, Request $request) : Promise - { - if (!\array_intersect($request->getProtocolVersions(), $connection->getProtocolVersions())) { - return new Success(); - // Connection does not support any of the requested protocol versions. - } - return $connection->getStream($request); - } - private function isAdditionalConnectionAllowed(string $uri) : bool - { - return \count($this->connections[$uri] ?? []) < $this->connectionLimit; - } - private function onReadyConnection(Connection $connection, string $uri) : void - { - $connectionId = \spl_object_id($connection); - if (isset($this->activeRequestCounts[$connectionId])) { - $this->activeRequestCounts[$connectionId]--; - if ($this->activeRequestCounts[$connectionId] === 0) { - while (\count($this->idleConnections) > 64) { - // not customizable for now - $idleConnection = \reset($this->idleConnections); - $key = \key($this->idleConnections); - unset($this->idleConnections[$key]); - $idleConnection->close(); - } - $this->idleConnections[$connectionId] = $connection; - } - } - if (empty($this->waiting[$uri])) { - return; - } - $deferred = \reset($this->waiting[$uri]); - // Deferred is removed from waiting list in onResolve callback attached above. - $deferred->resolve($connection); - } - private function isConnectionIdle(Connection $connection) : bool - { - $connectionId = \spl_object_id($connection); - \assert(!isset($this->activeRequestCounts[$connectionId]) || $this->activeRequestCounts[$connectionId] >= 0); - return ($this->activeRequestCounts[$connectionId] ?? 0) === 0; - } - private function removeWaiting(string $uri, int $deferredId) : void - { - unset($this->waiting[$uri][$deferredId]); - if (empty($this->waiting[$uri])) { - unset($this->waiting[$uri]); - } - } - private function dropConnection(string $uri, ?int $connectionId, int $promiseId) : void - { - unset($this->connections[$uri][$promiseId]); - if ($connectionId !== null) { - unset($this->activeRequestCounts[$connectionId], $this->idleConnections[$connectionId]); - } - if ($this->connections[$uri]->count() === 0) { - unset($this->connections[$uri], $this->waitForPriorConnection[$uri]); - } - } -} diff --git a/dependencies/amphp/http-client/src/Connection/ConnectionPool.php b/dependencies/amphp/http-client/src/Connection/ConnectionPool.php deleted file mode 100644 index 7cbadc2..0000000 --- a/dependencies/amphp/http-client/src/Connection/ConnectionPool.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - public function getStream(Request $request, CancellationToken $cancellation) : Promise; -} diff --git a/dependencies/amphp/http-client/src/Connection/DefaultConnectionFactory.php b/dependencies/amphp/http-client/src/Connection/DefaultConnectionFactory.php deleted file mode 100644 index 37a5a12..0000000 --- a/dependencies/amphp/http-client/src/Connection/DefaultConnectionFactory.php +++ /dev/null @@ -1,149 +0,0 @@ -connector = $connector; - $this->connectContext = $connectContext; - } - public function create(Request $request, CancellationToken $cancellationToken) : Promise - { - return call(function () use($request, $cancellationToken) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startConnectionCreation($request)); - } - $connector = $this->connector ?? connector(); - $connectContext = $this->connectContext ?? new ConnectContext(); - $uri = $request->getUri(); - $scheme = $uri->getScheme(); - if (!\in_array($scheme, ['http', 'https'], \true)) { - throw new InvalidRequestException($request, 'Invalid scheme provided in the request URI: ' . $uri); - } - $isHttps = $scheme === 'https'; - $defaultPort = $isHttps ? 443 : 80; - $host = $uri->getHost(); - $port = $uri->getPort() ?? $defaultPort; - if ($host === '') { - throw new InvalidRequestException($request, 'A host must be provided in the request URI: ' . $uri); - } - $authority = $host . ':' . $port; - $protocolVersions = $request->getProtocolVersions(); - $isConnect = $request->getMethod() === 'CONNECT'; - if ($isHttps) { - $protocols = []; - if (!$isConnect && \in_array('2', $protocolVersions, \true)) { - $protocols[] = 'h2'; - } - if (\in_array('1.1', $protocolVersions, \true) || \in_array('1.0', $protocolVersions, \true)) { - $protocols[] = 'http/1.1'; - } - if (!$protocols) { - throw new InvalidRequestException($request, \sprintf("None of the requested protocol versions (%s) are supported by %s (HTTP/2 is only supported on HTTPS)", \implode(', ', $protocolVersions), self::class)); - } - $tlsContext = ($connectContext->getTlsContext() ?? new ClientTlsContext(''))->withPeerCapturing(); - // If we only have HTTP/1.1 available, don't set application layer protocols. - // There are misbehaving sites like n11.com, see https://github.com/amphp/http-client/issues/255 - if ($protocols !== ['http/1.1'] && Socket\hasTlsAlpnSupport()) { - $tlsContext = $tlsContext->withApplicationLayerProtocols($protocols); - } - if ($tlsContext->getPeerName() === '') { - $tlsContext = $tlsContext->withPeerName($host); - } - $connectContext = $connectContext->withTlsContext($tlsContext); - } - try { - /** @var EncryptableSocket $socket */ - $socket = (yield $connector->connect('tcp://' . $authority, $connectContext->withConnectTimeout($request->getTcpConnectTimeout()), $cancellationToken)); - } catch (Socket\ConnectException $e) { - throw new UnprocessedRequestException(new SocketException(\sprintf("Connection to '%s' failed", $authority), 0, $e)); - } catch (CancelledException $e) { - // In case of a user cancellation request, throw the expected exception - $cancellationToken->throwIfRequested(); - // Otherwise we ran into a timeout of our TimeoutCancellationToken - throw new UnprocessedRequestException(new TimeoutException(\sprintf("Connection to '%s' timed out, took longer than " . $request->getTcpConnectTimeout() . ' ms', $authority))); - // don't pass $e - } - if ($isHttps) { - try { - $tlsState = $socket->getTlsState(); - // Error if anything enabled TLS on a new connection before we can do it - if ($tlsState !== EncryptableSocket::TLS_STATE_DISABLED) { - $socket->close(); - throw new UnprocessedRequestException(new SocketException('Failed to setup TLS connection, connection was in an unexpected TLS state (' . $tlsState . ')')); - } - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startTlsNegotiation($request)); - } - $tlsCancellationToken = new CombinedCancellationToken($cancellationToken, new TimeoutCancellationToken($request->getTlsHandshakeTimeout())); - (yield $socket->setupTls($tlsCancellationToken)); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeTlsNegotiation($request)); - } - } catch (StreamException $exception) { - $socket->close(); - throw new UnprocessedRequestException(new SocketException(\sprintf("Connection to '%s' @ '%s' closed during TLS handshake", $authority, $socket->getRemoteAddress()->toString()), 0, $exception)); - } catch (CancelledException $e) { - $socket->close(); - // In case of a user cancellation request, throw the expected exception - $cancellationToken->throwIfRequested(); - // Otherwise we ran into a timeout of our TimeoutCancellationToken - throw new UnprocessedRequestException(new TimeoutException(\sprintf("TLS handshake with '%s' @ '%s' timed out, took longer than " . $request->getTlsHandshakeTimeout() . ' ms', $authority, $socket->getRemoteAddress()->toString()))); - // don't pass $e - } - $tlsInfo = $socket->getTlsInfo(); - if ($tlsInfo === null) { - throw new UnprocessedRequestException(new SocketException(\sprintf("Socket closed after TLS handshake with '%s' @ '%s'", $authority, $socket->getRemoteAddress()->toString()))); - } - if ($tlsInfo->getApplicationLayerProtocol() === 'h2') { - $http2Connection = new Http2Connection($socket); - (yield $http2Connection->initialize()); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeConnectionCreation($request)); - } - return $http2Connection; - } - } - // Treat the presence of only HTTP/2 as prior knowledge, see https://http2.github.io/http2-spec/#known-http - if ($request->getProtocolVersions() === ['2']) { - $http2Connection = new Http2Connection($socket); - (yield $http2Connection->initialize()); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeConnectionCreation($request)); - } - return $http2Connection; - } - if (!\array_intersect($request->getProtocolVersions(), ['1.0', '1.1'])) { - $socket->close(); - throw new InvalidRequestException($request, \sprintf("None of the requested protocol versions (%s) are supported by '%s' @ '%s'", \implode(', ', $protocolVersions), $authority, $socket->getRemoteAddress()->toString())); - } - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeConnectionCreation($request)); - } - return new Http1Connection($socket); - }); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Http1Connection.php b/dependencies/amphp/http-client/src/Connection/Http1Connection.php deleted file mode 100644 index 392305b..0000000 --- a/dependencies/amphp/http-client/src/Connection/Http1Connection.php +++ /dev/null @@ -1,546 +0,0 @@ -socket = $socket; - $this->localAddress = $socket->getLocalAddress(); - $this->remoteAddress = $socket->getRemoteAddress(); - $this->tlsInfo = $socket->getTlsInfo(); - $this->timeoutGracePeriod = $timeoutGracePeriod; - $this->lastUsedAt = getCurrentTime(); - $this->watchIdleConnection(); - } - public function __destruct() - { - $this->close(); - } - public function onClose(callable $onClose) : void - { - if (!$this->socket || $this->socket->isClosed()) { - Promise\rethrow(call($onClose, $this)); - return; - } - $this->onClose[] = $onClose; - } - public function close() : Promise - { - if ($this->socket) { - $this->socket->close(); - } - return $this->free(); - } - public function getLocalAddress() : SocketAddress - { - return $this->localAddress; - } - public function getRemoteAddress() : SocketAddress - { - return $this->remoteAddress; - } - public function getTlsInfo() : ?TlsInfo - { - return $this->tlsInfo; - } - public function getProtocolVersions() : array - { - return self::PROTOCOL_VERSIONS; - } - public function getStream(Request $request) : Promise - { - if ($this->busy || $this->requestCounter && !$this->hasStreamFor($request)) { - return new Success(); - } - $this->busy = \true; - return new Success(HttpStream::fromConnection($this, \Closure::fromCallable([$this, 'request']), \Closure::fromCallable([$this, 'release']))); - } - private function free() : Promise - { - $this->socket = null; - $this->idleRead = null; - $this->lastUsedAt = 0; - if ($this->timeoutWatcher !== null) { - Loop::cancel($this->timeoutWatcher); - } - if ($this->onClose !== null) { - $onClose = $this->onClose; - $this->onClose = null; - foreach ($onClose as $callback) { - asyncCall($callback, $this); - } - } - return new Success(); - } - private function hasStreamFor(Request $request) : bool - { - return !$this->busy && $this->socket && !$this->socket->isClosed() && ($this->getRemainingTime() > 0 || $request->isIdempotent()); - } - /** @inheritdoc */ - private function request(Request $request, CancellationToken $cancellation, Stream $stream) : Promise - { - return call(function () use($request, $cancellation, $stream) { - ++$this->requestCounter; - if ($this->socket !== null && !$this->socket->isClosed()) { - $this->socket->reference(); - } - if ($this->timeoutWatcher !== null) { - Loop::cancel($this->timeoutWatcher); - $this->timeoutWatcher = null; - } - (yield RequestNormalizer::normalizeRequest($request)); - $protocolVersion = $this->determineProtocolVersion($request); - $request->setProtocolVersions([$protocolVersion]); - if ($request->getTransferTimeout() > 0) { - $timeoutToken = new TimeoutCancellationToken($request->getTransferTimeout()); - $combinedCancellation = new CombinedCancellationToken($cancellation, $timeoutToken); - } else { - $combinedCancellation = $cancellation; - } - $id = $combinedCancellation->subscribe([$this, 'close']); - try { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startSendingRequest($request, $stream)); - } - yield from $this->writeRequest($request, $protocolVersion, $combinedCancellation); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeSendingRequest($request, $stream)); - } - return yield from $this->readResponse($request, $cancellation, $combinedCancellation, $stream); - } catch (\Throwable $e) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $e)); - } - if ($this->socket !== null) { - $this->socket->close(); - } - throw $e; - } finally { - $combinedCancellation->unsubscribe($id); - $cancellation->throwIfRequested(); - } - }); - } - private function release() : void - { - $this->busy = \false; - } - /** - * @param Request $request - * @param CancellationToken $originalCancellation - * @param CancellationToken $readingCancellation - * - * @param Stream $stream - * - * @return \Generator - * @throws CancelledException - * @throws HttpException - * @throws ParseException - * @throws SocketException - */ - private function readResponse(Request $request, CancellationToken $originalCancellation, CancellationToken $readingCancellation, Stream $stream) : \Generator - { - $bodyEmitter = new Emitter(); - $backpressure = new Success(); - $bodyCallback = static function ($data) use($bodyEmitter, &$backpressure) : void { - $backpressure = $bodyEmitter->emit($data); - }; - $trailersDeferred = new Deferred(); - $trailers = []; - $trailersCallback = static function (array $headers) use(&$trailers) : void { - $trailers = $headers; - }; - $parser = new Http1Parser($request, $bodyCallback, $trailersCallback); - $start = getCurrentTime(); - $timeout = $request->getInactivityTimeout(); - try { - if ($this->socket === null) { - throw new SocketException('Socket closed prior to response completion'); - } - while (null !== ($chunk = (yield $timeout > 0 ? Promise\timeout($this->idleRead ?: $this->socket->read(), $timeout) : ($this->idleRead ?: $this->socket->read())))) { - $this->idleRead = null; - parseChunk: - $response = $parser->parse($chunk); - if ($response === null) { - if ($this->socket === null) { - throw new SocketException('Socket closed prior to response completion'); - } - continue; - } - $this->lastUsedAt = getCurrentTime(); - $status = $response->getStatus(); - if ($status === Http\Status::SWITCHING_PROTOCOLS) { - $connection = Http\createFieldValueComponentMap(Http\parseFieldValueComponents($response, 'connection')); - if (!isset($connection['upgrade'])) { - throw new HttpException('Switching protocols response missing "Connection: upgrade" header'); - } - if (!$response->hasHeader('upgrade')) { - throw new HttpException('Switching protocols response missing "Upgrade" header'); - } - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeReceivingResponse($request, $stream)); - } - $trailersDeferred->resolve($trailers); - return $this->handleUpgradeResponse($request, $response, $parser->getBuffer()); - } - if ($status < 200) { - // 1XX responses (excluding 101, handled above) - $onInformationalResponse = $request->getInformationalResponseHandler(); - if ($onInformationalResponse !== null) { - (yield call($onInformationalResponse, $response)); - } - $chunk = $parser->getBuffer(); - $parser = new Http1Parser($request, $bodyCallback, $trailersCallback); - goto parseChunk; - } - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startReceivingResponse($request, $stream)); - } - if ($status >= 200 && $status < 300 && $request->getMethod() === 'CONNECT') { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeReceivingResponse($request, $stream)); - } - $trailersDeferred->resolve($trailers); - return $this->handleUpgradeResponse($request, $response, $parser->getBuffer()); - } - $bodyCancellationSource = new CancellationTokenSource(); - $bodyCancellationToken = new CombinedCancellationToken($readingCancellation, $bodyCancellationSource->getToken()); - $response->setTrailers($trailersDeferred->promise()); - $response->setBody(new ResponseBodyStream(new IteratorStream($bodyEmitter->iterate()), $bodyCancellationSource)); - // Read body async - asyncCall(function () use($parser, $request, $response, $bodyEmitter, $trailersDeferred, $originalCancellation, $readingCancellation, $bodyCancellationToken, $stream, $timeout, &$backpressure, &$trailers) { - $id = $bodyCancellationToken->subscribe([$this, 'close']); - try { - // Required, otherwise responses without body hang - if (!$parser->isComplete()) { - // Directly parse again in case we already have the full body but aborted parsing - // to resolve promise with headers. - $chunk = null; - try { - /** @psalm-suppress PossiblyNullReference */ - do { - /** @noinspection CallableParameterUseCaseInTypeContextInspection */ - $parser->parse($chunk); - /** - * @noinspection NotOptimalIfConditionsInspection - * @psalm-suppress TypeDoesNotContainType - */ - if ($parser->isComplete()) { - break; - } - if (!$backpressure instanceof Success) { - (yield $this->withCancellation($backpressure, $bodyCancellationToken)); - } - /** @psalm-suppress TypeDoesNotContainNull */ - if ($this->socket === null) { - throw new SocketException('Socket closed prior to response completion'); - } - } while (null !== ($chunk = (yield $timeout > 0 ? Promise\timeout($this->socket->read(), $timeout) : $this->socket->read()))); - } catch (PromiseTimeoutException $e) { - $this->close(); - throw new TimeoutException('Inactivity timeout exceeded, more than ' . $timeout . ' ms elapsed from last data received', 0, $e); - } - $originalCancellation->throwIfRequested(); - if ($readingCancellation->isRequested()) { - throw new TimeoutException('Allowed transfer timeout exceeded, took longer than ' . $request->getTransferTimeout() . ' ms'); - } - $bodyCancellationToken->throwIfRequested(); - // Ignore check if neither content-length nor chunked encoding are given. - /** @psalm-suppress RedundantCondition */ - if (!$parser->isComplete() && $parser->getState() !== Http1Parser::BODY_IDENTITY_EOF) { - throw new SocketException('Socket disconnected prior to response completion'); - } - } - $timeout = $this->determineKeepAliveTimeout($response); - if ($timeout > 0 && $parser->getState() !== Http1Parser::BODY_IDENTITY_EOF) { - $this->timeoutWatcher = Loop::delay($timeout * 1000, [$this, 'close']); - Loop::unreference($this->timeoutWatcher); - $this->watchIdleConnection(); - } else { - $this->close(); - } - $this->busy = \false; - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeReceivingResponse($request, $stream)); - } - $bodyEmitter->complete(); - $trailersDeferred->resolve($trailers); - } catch (\Throwable $e) { - $this->close(); - try { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $e)); - } - } finally { - $bodyEmitter->fail($e); - $trailersDeferred->fail($e); - } - } finally { - $bodyCancellationToken->unsubscribe($id); - } - }); - return $response; - } - $originalCancellation->throwIfRequested(); - throw new SocketException(\sprintf("Receiving the response headers for '%s' failed, because the socket to '%s' @ '%s' closed early with %d bytes received within %d milliseconds", (string) $request->getUri()->withUserInfo(''), $request->getUri()->withUserInfo('')->getAuthority(), $this->socket === null ? '???' : (string) $this->socket->getRemoteAddress(), \strlen($parser->getBuffer()), getCurrentTime() - $start)); - } catch (HttpException $e) { - $this->close(); - throw $e; - } catch (PromiseTimeoutException $e) { - $this->close(); - throw new TimeoutException('Inactivity timeout exceeded, more than ' . $timeout . ' ms elapsed from last data received', 0, $e); - } catch (\Throwable $e) { - $this->close(); - throw new SocketException('Receiving the response headers failed: ' . $e->getMessage(), 0, $e); - } - } - private function handleUpgradeResponse(Request $request, Response $response, string $buffer) : Response - { - if ($this->socket === null) { - throw new SocketException('Socket closed while upgrading'); - } - $socket = new UpgradedSocket($this->socket, $buffer); - $this->free(); - // Mark this connection as unusable without closing socket. - if (($onUpgrade = $request->getUpgradeHandler()) === null) { - $socket->close(); - throw new HttpException('CONNECT or upgrade request made without upgrade handler callback'); - } - asyncCall(static function () use($onUpgrade, $socket, $request, $response) : \Generator { - try { - (yield call($onUpgrade, $socket, $request, $response)); - } catch (\Throwable $exception) { - $socket->close(); - throw new HttpException('Upgrade handler threw an exception', 0, $exception); - } - }); - return $response; - } - /** - * @return int Approximate number of milliseconds remaining until the connection is closed. - */ - private function getRemainingTime() : int - { - $timestamp = $this->lastUsedAt + ($this->explicitTimeout ? $this->priorTimeout * 1000 : $this->timeoutGracePeriod); - return \max(0, $timestamp - getCurrentTime()); - } - private function withCancellation(Promise $promise, CancellationToken $cancellationToken) : Promise - { - $deferred = new Deferred(); - $newPromise = $deferred->promise(); - $promise->onResolve(static function ($error, $value) use(&$deferred) : void { - if ($deferred) { - $temp = $deferred; - $deferred = null; - if ($error) { - $temp->fail($error); - } else { - $temp->resolve($value); - } - } - }); - $cancellationSubscription = $cancellationToken->subscribe(static function ($e) use(&$deferred) : void { - if ($deferred) { - $temp = $deferred; - $deferred = null; - $temp->fail($e); - } - }); - $newPromise->onResolve(static function () use($cancellationToken, $cancellationSubscription) : void { - $cancellationToken->unsubscribe($cancellationSubscription); - }); - return $newPromise; - } - private function determineKeepAliveTimeout(Response $response) : int - { - $request = $response->getRequest(); - $requestConnHeader = $request->getHeader('connection') ?? ''; - $responseConnHeader = $response->getHeader('connection') ?? ''; - if (!\strcasecmp($requestConnHeader, 'close')) { - return 0; - } - if ($response->getProtocolVersion() === '1.0') { - return 0; - } - if (!\strcasecmp($responseConnHeader, 'close')) { - return 0; - } - $params = Http\createFieldValueComponentMap(Http\parseFieldValueComponents($response, 'keep-alive')); - $timeout = (int) ($params['timeout'] ?? $this->priorTimeout); - if (isset($params['timeout'])) { - $this->explicitTimeout = \true; - } - return $this->priorTimeout = \min(\max(0, $timeout), self::MAX_KEEP_ALIVE_TIMEOUT); - } - private function determineProtocolVersion(Request $request) : string - { - $protocolVersions = $request->getProtocolVersions(); - if (\in_array("1.1", $protocolVersions, \true)) { - return "1.1"; - } - if (\in_array("1.0", $protocolVersions, \true)) { - return "1.0"; - } - throw new InvalidRequestException($request, "None of the requested protocol versions is supported: " . \implode(", ", $protocolVersions)); - } - private function writeRequest(Request $request, string $protocolVersion, CancellationToken $cancellation) : \Generator - { - try { - $rawHeaders = $this->generateRawHeader($request, $protocolVersion); - if ($this->socket === null) { - throw new UnprocessedRequestException(new SocketException('Socket closed before request started')); - } - (yield $this->socket->write($rawHeaders)); - if ($request->getMethod() === 'CONNECT') { - return; - } - $body = $request->getBody()->createBodyStream(); - $chunking = $request->getHeader("transfer-encoding") === "chunked"; - $remainingBytes = $request->getHeader("content-length"); - if ($remainingBytes !== null) { - $remainingBytes = (int) $remainingBytes; - } - if ($chunking && $protocolVersion === "1.0") { - throw new InvalidRequestException($request, "Can't send chunked bodies over HTTP/1.0"); - } - // We always buffer the last chunk to make sure we don't write $contentLength bytes if the body is too long. - $buffer = ""; - while (null !== ($chunk = (yield $body->read()))) { - $cancellation->throwIfRequested(); - if ($chunk === "") { - continue; - } - if ($chunking) { - $chunk = \dechex(\strlen($chunk)) . "\r\n" . $chunk . "\r\n"; - } elseif ($remainingBytes !== null) { - $remainingBytes -= \strlen($chunk); - if ($remainingBytes < 0) { - throw new InvalidRequestException($request, "Body contained more bytes than specified in Content-Length, aborting request"); - } - } - (yield $this->socket->write($buffer)); - $buffer = $chunk; - } - $cancellation->throwIfRequested(); - // Flush last buffered chunk. - (yield $this->socket->write($buffer)); - if ($chunking) { - (yield $this->socket->write("0\r\n\r\n")); - } elseif ($remainingBytes !== null && $remainingBytes > 0) { - throw new InvalidRequestException($request, "Body contained fewer bytes than specified in Content-Length, aborting request"); - } - } catch (StreamException $exception) { - throw new SocketException('Socket disconnected prior to response completion'); - } - } - /** - * @param Request $request - * @param string $protocolVersion - * - * @return string - * - * @throws HttpException - */ - private function generateRawHeader(Request $request, string $protocolVersion) : string - { - $uri = $request->getUri(); - $requestUri = normalizeRequestPathWithQuery($request); - $method = $request->getMethod(); - if ($method === 'CONNECT') { - $defaultPort = $uri->getScheme() === 'https' ? 443 : 80; - $requestUri = $uri->getHost() . ':' . ($uri->getPort() ?? $defaultPort); - } - $header = $method . ' ' . $requestUri . ' HTTP/' . $protocolVersion . "\r\n"; - try { - $header .= Rfc7230::formatRawHeaders($request->getRawHeaders()); - } catch (InvalidHeaderException $e) { - throw new HttpException($e->getMessage()); - } - return $header . "\r\n"; - } - private function watchIdleConnection() : void - { - if ($this->socket === null || $this->socket->isClosed()) { - return; - } - $this->socket->unreference(); - $this->idleRead = $this->socket->read(); - $this->idleRead->onResolve(function ($error, $chunk) { - if ($error || $chunk === null) { - $this->close(); - } - }); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Http2Connection.php b/dependencies/amphp/http-client/src/Connection/Http2Connection.php deleted file mode 100644 index 5f6379c..0000000 --- a/dependencies/amphp/http-client/src/Connection/Http2Connection.php +++ /dev/null @@ -1,78 +0,0 @@ -socket = $socket; - $this->processor = new Http2ConnectionProcessor($socket); - } - public function getProtocolVersions() : array - { - return self::PROTOCOL_VERSIONS; - } - public function initialize() : Promise - { - return $this->processor->initialize(); - } - public function getStream(Request $request) : Promise - { - if (!$this->processor->isInitialized()) { - throw new \Error('The promise returned from ' . __CLASS__ . '::initialize() must resolve before using the connection'); - } - return call(function () { - if ($this->processor->isClosed() || $this->processor->getRemainingStreams() <= 0) { - return null; - } - $this->processor->reserveStream(); - return HttpStream::fromConnection($this, \Closure::fromCallable([$this, 'request']), \Closure::fromCallable([$this->processor, 'unreserveStream'])); - }); - } - public function onClose(callable $onClose) : void - { - $this->processor->onClose($onClose); - } - public function close() : Promise - { - return $this->processor->close(); - } - public function getLocalAddress() : SocketAddress - { - return $this->socket->getLocalAddress(); - } - public function getRemoteAddress() : SocketAddress - { - return $this->socket->getRemoteAddress(); - } - public function getTlsInfo() : ?TlsInfo - { - return $this->socket->getTlsInfo(); - } - private function request(Request $request, CancellationToken $token, Stream $applicationStream) : Promise - { - $this->requestCount++; - return $this->processor->request($request, $token, $applicationStream); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Http2ConnectionException.php b/dependencies/amphp/http-client/src/Connection/Http2ConnectionException.php deleted file mode 100644 index d3b5af6..0000000 --- a/dependencies/amphp/http-client/src/Connection/Http2ConnectionException.php +++ /dev/null @@ -1,15 +0,0 @@ -streamId = $streamId; - } - public function getStreamId() : int - { - return $this->streamId; - } -} diff --git a/dependencies/amphp/http-client/src/Connection/HttpStream.php b/dependencies/amphp/http-client/src/Connection/HttpStream.php deleted file mode 100644 index a892779..0000000 --- a/dependencies/amphp/http-client/src/Connection/HttpStream.php +++ /dev/null @@ -1,74 +0,0 @@ -getLocalAddress(), $connection->getRemoteAddress(), $connection->getTlsInfo(), $requestCallback, $releaseCallback); - } - public static function fromStream(Stream $stream, callable $requestCallback, callable $releaseCallback) : self - { - return new self($stream->getLocalAddress(), $stream->getRemoteAddress(), $stream->getTlsInfo(), $requestCallback, $releaseCallback); - } - /** @var SocketAddress */ - private $localAddress; - /** @var SocketAddress */ - private $remoteAddress; - /** @var TlsInfo|null */ - private $tlsInfo; - /** @var callable */ - private $requestCallback; - /** @var callable|null */ - private $releaseCallback; - private function __construct(SocketAddress $localAddress, SocketAddress $remoteAddress, ?TlsInfo $tlsInfo, callable $requestCallback, callable $releaseCallback) - { - $this->localAddress = $localAddress; - $this->remoteAddress = $remoteAddress; - $this->tlsInfo = $tlsInfo; - $this->requestCallback = $requestCallback; - $this->releaseCallback = $releaseCallback; - } - public function __destruct() - { - if ($this->releaseCallback !== null) { - ($this->releaseCallback)(); - } - } - public function request(Request $request, CancellationToken $cancellation) : Promise - { - if ($this->releaseCallback === null) { - throw new \Error('A stream may only be used for a single request'); - } - $this->releaseCallback = null; - return call(function () use($request, $cancellation) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startRequest($request)); - } - return call($this->requestCallback, $request, $cancellation, $this); - }); - } - public function getLocalAddress() : SocketAddress - { - return $this->localAddress; - } - public function getRemoteAddress() : SocketAddress - { - return $this->remoteAddress; - } - public function getTlsInfo() : ?TlsInfo - { - return $this->tlsInfo; - } -} diff --git a/dependencies/amphp/http-client/src/Connection/InterceptedStream.php b/dependencies/amphp/http-client/src/Connection/InterceptedStream.php deleted file mode 100644 index a94f4a0..0000000 --- a/dependencies/amphp/http-client/src/Connection/InterceptedStream.php +++ /dev/null @@ -1,53 +0,0 @@ -stream = $stream; - $this->interceptor = $interceptor; - } - public function request(Request $request, CancellationToken $cancellation) : Promise - { - if (!$this->interceptor) { - throw new \Error(__METHOD__ . ' may only be invoked once per instance. ' . 'If you need to implement retries or otherwise issue multiple requests, register an ApplicationInterceptor to do so.'); - } - $interceptor = $this->interceptor; - $this->interceptor = null; - return call(function () use($interceptor, $request, $cancellation) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startRequest($request)); - } - return $interceptor->requestViaNetwork($request, $cancellation, $this->stream); - }); - } - public function getLocalAddress() : SocketAddress - { - return $this->stream->getLocalAddress(); - } - public function getRemoteAddress() : SocketAddress - { - return $this->stream->getRemoteAddress(); - } - public function getTlsInfo() : ?TlsInfo - { - return $this->stream->getTlsInfo(); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Internal/Http1Parser.php b/dependencies/amphp/http-client/src/Connection/Internal/Http1Parser.php deleted file mode 100644 index 6826bf2..0000000 --- a/dependencies/amphp/http-client/src/Connection/Internal/Http1Parser.php +++ /dev/null @@ -1,344 +0,0 @@ -\\d+\\.\\d+)[ \t]+\n (?P[1-9]\\d\\d)[ \t]*\n (?P[^\x01-\x08\x10-\x19]*)\n \$#ix"; - public const AWAITING_HEADERS = 0; - public const BODY_IDENTITY = 1; - public const BODY_IDENTITY_EOF = 2; - public const BODY_CHUNKS = 3; - public const TRAILERS_START = 4; - public const TRAILERS = 5; - /** @var int */ - private $state = self::AWAITING_HEADERS; - /** @var string */ - private $buffer = ''; - /** @var string|null */ - private $protocol; - /** @var int|null */ - private $statusCode; - /** @var string|null */ - private $statusReason; - /** @var string[][] */ - private $headers = []; - /** @var int|null */ - private $remainingBodyBytes; - /** @var int */ - private $bodyBytesConsumed = 0; - /** @var bool */ - private $chunkedEncoding = \false; - /** @var int|null */ - private $chunkLengthRemaining; - /** @var bool */ - private $complete = \false; - /** @var Request */ - private $request; - /** @var int */ - private $maxHeaderBytes; - /** @var int */ - private $maxBodyBytes; - /** @var callable */ - private $bodyDataCallback; - /** @var callable */ - private $trailersCallback; - public function __construct(Request $request, callable $bodyDataCallback, callable $trailersCallback) - { - $this->request = $request; - $this->bodyDataCallback = $bodyDataCallback; - $this->trailersCallback = $trailersCallback; - $this->maxHeaderBytes = $request->getHeaderSizeLimit(); - $this->maxBodyBytes = $request->getBodySizeLimit(); - } - public function getBuffer() : string - { - return $this->buffer; - } - public function getState() : int - { - return $this->state; - } - public function buffer(string $data) : void - { - $this->buffer .= $data; - } - /** - * @param string|null $data - * - * @return Response|null - * - * @throws ParseException - */ - public function parse(string $data = null) : ?Response - { - if ($data !== null) { - $this->buffer .= $data; - } - if ($this->buffer === '') { - return null; - } - if ($this->complete) { - throw new ParseException('Can\'t continue parsing, response is already complete', Status::BAD_REQUEST); - } - switch ($this->state) { - case self::AWAITING_HEADERS: - goto headers; - case self::BODY_IDENTITY: - goto body_identity; - case self::BODY_IDENTITY_EOF: - goto body_identity_eof; - case self::BODY_CHUNKS: - goto body_chunks; - case self::TRAILERS_START: - goto trailers_start; - case self::TRAILERS: - goto trailers; - } - headers: - $startLineAndHeaders = $this->shiftHeadersFromBuffer(); - if ($startLineAndHeaders === null) { - return null; - } - $startLineEndPos = \strpos($startLineAndHeaders, "\r\n"); - \assert($startLineEndPos !== \false); - $startLine = \substr($startLineAndHeaders, 0, $startLineEndPos); - $rawHeaders = \substr($startLineAndHeaders, $startLineEndPos + 2); - if (\preg_match(self::STATUS_LINE_PATTERN, $startLine, $match)) { - $this->protocol = $match['protocol']; - $this->statusCode = (int) $match['status']; - $this->statusReason = \trim($match['reason']); - } else { - throw new ParseException('Invalid status line: ' . $startLine, Status::BAD_REQUEST); - } - if ($rawHeaders !== '') { - $this->headers = $this->parseRawHeaders($rawHeaders); - } else { - $this->headers = []; - } - $requestMethod = $this->request->getMethod(); - $skipBody = $this->statusCode < Status::OK || $this->statusCode === Status::NOT_MODIFIED || $this->statusCode === Status::NO_CONTENT || $requestMethod === 'HEAD' || $requestMethod === 'CONNECT'; - if ($skipBody) { - $this->complete = \true; - } elseif ($this->chunkedEncoding) { - $this->state = self::BODY_CHUNKS; - } elseif ($this->remainingBodyBytes === null) { - $this->state = self::BODY_IDENTITY_EOF; - } elseif ($this->remainingBodyBytes > 0) { - $this->state = self::BODY_IDENTITY; - } else { - $this->complete = \true; - } - $response = new Response($this->protocol, $this->statusCode, $this->statusReason, [], new InMemoryStream(), $this->request); - foreach ($this->headers as [$key, $value]) { - $response->addHeader($key, $value); - } - return $response; - body_identity: - $bufferDataSize = \strlen($this->buffer); - if ($bufferDataSize <= $this->remainingBodyBytes) { - $chunk = $this->buffer; - $this->buffer = ''; - $this->remainingBodyBytes -= $bufferDataSize; - $this->addToBody($chunk); - if ($this->remainingBodyBytes === 0) { - $this->complete = \true; - } - return null; - } - $bodyData = \substr($this->buffer, 0, $this->remainingBodyBytes); - $this->addToBody($bodyData); - $this->buffer = \substr($this->buffer, $this->remainingBodyBytes); - $this->remainingBodyBytes = 0; - goto complete; - body_identity_eof: - $this->addToBody($this->buffer); - $this->buffer = ''; - return null; - body_chunks: - if ($this->parseChunkedBody()) { - $this->state = self::TRAILERS_START; - goto trailers_start; - } - return null; - trailers_start: - $firstTwoBytes = \substr($this->buffer, 0, 2); - if ($firstTwoBytes === "" || $firstTwoBytes === "\r") { - return null; - } - if ($firstTwoBytes === "\r\n") { - $this->buffer = \substr($this->buffer, 2); - goto complete; - } - $this->state = self::TRAILERS; - goto trailers; - trailers: - $trailers = $this->shiftHeadersFromBuffer(); - if ($trailers === null) { - return null; - } - $this->parseTrailers($trailers); - goto complete; - complete: - $this->complete = \true; - return null; - } - public function isComplete() : bool - { - return $this->complete; - } - /** - * @return string|null - * - * @throws ParseException - */ - private function shiftHeadersFromBuffer() : ?string - { - $this->buffer = \ltrim($this->buffer, "\r\n"); - if ($headersSize = \strpos($this->buffer, "\r\n\r\n")) { - $headers = \substr($this->buffer, 0, $headersSize + 2); - $this->buffer = \substr($this->buffer, $headersSize + 4); - } else { - $headersSize = \strlen($this->buffer); - $headers = null; - } - if ($this->maxHeaderBytes > 0 && $headersSize > $this->maxHeaderBytes) { - throw new ParseException("Configured header size exceeded: {$headersSize} bytes received, while the configured limit is {$this->maxHeaderBytes} bytes", Status::REQUEST_HEADER_FIELDS_TOO_LARGE); - } - return $headers; - } - /** - * @param string $rawHeaders - * - * @return array - * - * @throws ParseException - */ - private function parseRawHeaders(string $rawHeaders) : array - { - // Legacy support for folded headers - if (\strpos($rawHeaders, "\r\n ") || \strpos($rawHeaders, "\r\n\t")) { - $rawHeaders = \preg_replace("/\r\n[ \t]++/", ' ', $rawHeaders); - } - try { - $headers = Rfc7230::parseRawHeaders($rawHeaders); - $headerMap = []; - foreach ($headers as [$key, $value]) { - $headerMap[\strtolower($key)][] = $value; - } - } catch (InvalidHeaderException $e) { - throw new ParseException('Invalid headers', Status::BAD_REQUEST, $e); - } - if (isset($headerMap['transfer-encoding'])) { - $transferEncodings = \explode(',', \strtolower(\implode(',', $headerMap['transfer-encoding']))); - $transferEncodings = \array_map('trim', $transferEncodings); - $this->chunkedEncoding = \in_array('chunked', $transferEncodings, \true); - } elseif (isset($headerMap['content-length'])) { - if (\count($headerMap['content-length']) > 1) { - throw new ParseException('Can\'t determine body length, because multiple content-length headers present in the response', Status::BAD_REQUEST); - } - $contentLength = $headerMap['content-length'][0]; - if (!\preg_match('/^(0|[1-9][0-9]*)$/', $contentLength)) { - throw new ParseException('Can\'t determine body length, because the content-length header value is invalid', Status::BAD_REQUEST); - } - $this->remainingBodyBytes = (int) $contentLength; - } - return $headers; - } - /** - * Decodes a chunked response body. - * - * @return bool Returns {@code true} if the body is complete, otherwise {@code false}. - * - * @throws ParseException - */ - private function parseChunkedBody() : bool - { - if ($this->chunkLengthRemaining !== null) { - goto decode_chunk; - } - determine_chunk_size: - if (\false === ($lineEndPos = \strpos($this->buffer, "\r\n"))) { - return \false; - } - if ($lineEndPos === 0) { - throw new ParseException('Invalid line; hexadecimal chunk size expected', Status::BAD_REQUEST); - } - $line = \substr($this->buffer, 0, $lineEndPos); - $hex = \strtolower(\trim(\ltrim($line, '0'))) ?: '0'; - $dec = \hexdec($hex); - if ($hex !== \dechex($dec)) { - throw new ParseException('Invalid hexadecimal chunk size', Status::BAD_REQUEST); - } - $this->chunkLengthRemaining = $dec; - $this->buffer = \substr($this->buffer, $lineEndPos + 2); - if ($this->chunkLengthRemaining === 0) { - return \true; - } - decode_chunk: - $bufferLength = \strlen($this->buffer); - // These first two (extreme) edge cases prevent errors where the packet boundary ends after - // the \r and before the \n at the end of a chunk. - if ($bufferLength === $this->chunkLengthRemaining || $bufferLength === $this->chunkLengthRemaining + 1) { - return \false; - } - if ($bufferLength >= $this->chunkLengthRemaining + 2) { - $chunk = \substr($this->buffer, 0, $this->chunkLengthRemaining); - $this->buffer = \substr($this->buffer, $this->chunkLengthRemaining + 2); - $this->chunkLengthRemaining = null; - $this->addToBody($chunk); - goto determine_chunk_size; - } - /** @noinspection SuspiciousAssignmentsInspection */ - $chunk = $this->buffer; - $this->buffer = ''; - $this->chunkLengthRemaining -= $bufferLength; - $this->addToBody($chunk); - return \false; - } - /** - * @param string $trailers - * - * @throws ParseException - */ - private function parseTrailers(string $trailers) : void - { - try { - $trailers = Rfc7230::parseHeaders($trailers); - } catch (InvalidHeaderException $e) { - throw new ParseException('Invalid trailers', Status::BAD_REQUEST, $e); - } - ($this->trailersCallback)($trailers); - } - /** - * @param string $data - * - * @throws ParseException - */ - private function addToBody(string $data) : void - { - $length = \strlen($data); - if (!$length) { - return; - } - $this->bodyBytesConsumed += $length; - if ($this->maxBodyBytes > 0 && $this->bodyBytesConsumed > $this->maxBodyBytes) { - throw new ParseException("Configured body size exceeded: {$this->bodyBytesConsumed} bytes received, while the configured limit is {$this->maxBodyBytes} bytes", Status::PAYLOAD_TOO_LARGE); - } - if ($this->bodyDataCallback) { - ($this->bodyDataCallback)($data); - } - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Internal/Http2ConnectionProcessor.php b/dependencies/amphp/http-client/src/Connection/Internal/Http2ConnectionProcessor.php deleted file mode 100644 index e438057..0000000 --- a/dependencies/amphp/http-client/src/Connection/Internal/Http2ConnectionProcessor.php +++ /dev/null @@ -1,1143 +0,0 @@ -socket = $socket; - $this->hpack = new HPack(); - $this->frameQueueEmitter = new Emitter(); - $this->frameQueue = $this->frameQueueEmitter->iterate(); - } - public function isInitialized() : bool - { - return $this->initialized; - } - /** - * Returns a promise that is resolved once the connection has been initialized. A stream cannot be obtained from the - * connection until the promise returned by this method resolves. - * - * @return Promise - */ - public function initialize() : Promise - { - if ($this->initializeStarted) { - throw new \Error('Connection may only be initialized once'); - } - $this->initializeStarted = \true; - if ($this->socket->isClosed()) { - return new Failure(new UnprocessedRequestException(new SocketException('The socket closed before the connection could be initialized'))); - } - $this->settings = new Deferred(); - $promise = $this->settings->promise(); - Promise\rethrow(new Coroutine($this->run())); - return $promise; - } - public function onClose(callable $onClose) : void - { - if ($this->onClose === null) { - asyncCall($onClose, $this); - return; - } - $this->onClose[] = $onClose; - } - public function close() : Promise - { - $this->shutdown(new SocketException('Socket from \'' . $this->socket->getLocalAddress() . '\' to \'' . $this->socket->getRemoteAddress() . '\' closed')); - $this->socket->close(); - if ($this->onClose !== null) { - $onClose = $this->onClose; - $this->onClose = null; - foreach ($onClose as $callback) { - asyncCall($callback, $this); - } - } - return new Success(); - } - public function handlePong(string $data) : void - { - if ($this->pongDeferred === null) { - return; - } - if ($this->pongWatcher !== null) { - Loop::cancel($this->pongWatcher); - $this->pongWatcher = null; - } - $this->hasTimeout = \false; - $deferred = $this->pongDeferred; - $this->pongDeferred = null; - $deferred->resolve(\true); - } - public function handlePing(string $data) : void - { - $this->writeFrame(Http2Parser::PING, Http2Parser::ACK, 0, $data); - } - public function handleShutdown(int $lastId, int $error) : void - { - $message = \sprintf("Received GOAWAY frame on '%s' from '%s' with error code %d", (string) $this->socket->getLocalAddress(), (string) $this->socket->getRemoteAddress(), $error); - /** - * @psalm-suppress DeprecatedClass - * @noinspection PhpDeprecationInspection - */ - $this->shutdown(new ClientHttp2ConnectionException($message, $error), $lastId); - } - public function handleStreamWindowIncrement(int $streamId, int $windowSize) : void - { - if (!isset($this->streams[$streamId])) { - return; - } - $stream = $this->streams[$streamId]; - if ($stream->clientWindow + $windowSize > 2147483647) { - $this->handleStreamException(new Http2StreamException("Current window size plus new window exceeds maximum size", $streamId, Http2Parser::FLOW_CONTROL_ERROR)); - return; - } - $stream->clientWindow += $windowSize; - $this->writeBufferedData($stream); - } - public function handleConnectionWindowIncrement(int $windowSize) : void - { - if ($this->clientWindow + $windowSize > 2147483647) { - $this->handleConnectionException(new Http2ConnectionException("Current window size plus new window exceeds maximum size", Http2Parser::FLOW_CONTROL_ERROR)); - return; - } - $this->clientWindow += $windowSize; - foreach ($this->streams as $stream) { - if ($this->clientWindow <= 0) { - return; - } - if ($stream->requestBodyBuffer === '' || $stream->clientWindow <= 0) { - continue; - } - $this->writeBufferedData($stream); - } - } - public function handleHeaders(int $streamId, array $pseudo, array $headers, bool $streamEnded) : void - { - foreach ($pseudo as $name => $value) { - if (!isset(Http2Parser::KNOWN_RESPONSE_PSEUDO_HEADERS[$name])) { - throw new Http2StreamException("Invalid pseudo header", $streamId, Http2Parser::PROTOCOL_ERROR); - } - } - if (!isset($this->streams[$streamId])) { - return; - } - $stream = $this->streams[$streamId]; - $stream->enableInactivityWatcher(); - $this->hasTimeout = \false; - if ($stream->trailers) { - if ($stream->expectedLength && $stream->received !== $stream->expectedLength) { - $diff = $stream->expectedLength - $stream->received; - $this->handleStreamException(new Http2StreamException("Content length mismatch: " . \abs($diff) . ' bytes ' . ($diff > 0 ? ' missing' : 'too much'), $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - if (!empty($pseudo)) { - $this->handleStreamException(new Http2StreamException("Trailers must not contain pseudo headers", $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - try { - // Constructor checks for any disallowed fields - $parsedTrailers = new Trailers($headers); - } catch (InvalidHeaderException $exception) { - $this->handleStreamException(new Http2StreamException("Disallowed field names in trailer", $streamId, Http2Parser::PROTOCOL_ERROR, $exception)); - return; - } - $trailers = $stream->trailers; - $stream->trailers = null; - $trailers->resolve(call(function () use($stream, $streamId, $parsedTrailers) { - try { - foreach ($stream->request->getEventListeners() as $eventListener) { - (yield $eventListener->completeReceivingResponse($stream->request, $stream->stream)); - } - return $parsedTrailers; - } catch (\Throwable $e) { - $this->handleStreamException(new Http2StreamException("Event listener error", $streamId, Http2Parser::CANCEL)); - throw $e; - } - })); - $this->setupPingIfIdle(); - return; - } - if (!isset($pseudo[":status"])) { - $this->handleConnectionException(new Http2ConnectionException("No status pseudo header in response", Http2Parser::PROTOCOL_ERROR)); - return; - } - if (!\preg_match("/^[1-5]\\d\\d\$/", $pseudo[":status"])) { - $this->handleStreamException(new Http2StreamException("Invalid response status code: " . $pseudo[':status'], $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - if ($stream->response !== null) { - $this->handleStreamException(new Http2StreamException("Stream headers already received", $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $status = (int) $pseudo[":status"]; - if ($status === Status::SWITCHING_PROTOCOLS) { - $this->handleConnectionException(new Http2ConnectionException("Switching Protocols (101) is not part of HTTP/2", Http2Parser::PROTOCOL_ERROR)); - return; - } - $response = new Response('2', $status, Status::getReason($status), $headers, new InMemoryStream(), $stream->request); - if ($status < 200) { - $onInformationalResponse = $stream->request->getInformationalResponseHandler(); - if ($onInformationalResponse !== null) { - $stream->preResponseResolution = call(function () use($onInformationalResponse, $response, $stream, $streamId) { - (yield $stream->preResponseResolution); - try { - (yield call($onInformationalResponse, $response)); - } catch (\Throwable $e) { - $this->handleStreamException(new Http2StreamException('Informational response handler threw an exception', $streamId, Http2Parser::CANCEL)); - } - }); - } - return; - } - \assert($stream->preResponseResolution === null); - $stream->preResponseResolution = call(function () use($stream, $streamId) { - try { - foreach ($stream->request->getEventListeners() as $eventListener) { - (yield $eventListener->startReceivingResponse($stream->request, $stream->stream)); - } - } catch (\Throwable $e) { - $this->handleStreamException(new Http2StreamException("Event listener error", $streamId, Http2Parser::CANCEL)); - } - }); - $stream->body = new Emitter(); - $stream->trailers = new Deferred(); - $bodyCancellation = new CancellationTokenSource(); - $cancellationToken = new CombinedCancellationToken($stream->cancellationToken, $bodyCancellation->getToken()); - $stream->cancellationToken = $cancellationToken; - $response->setBody(new ResponseBodyStream(new IteratorStream($stream->body->iterate()), $bodyCancellation)); - $response->setTrailers($stream->trailers->promise()); - \assert($stream->pendingResponse !== null); - $stream->responsePending = \false; - $stream->pendingResponse->resolve(call(static function () use($response, $stream) { - (yield $stream->requestBodyCompletion->promise()); - (yield $stream->preResponseResolution); - $stream->preResponseResolution = null; - $stream->pendingResponse = null; - return $response; - })); - $this->increaseConnectionWindow(); - $this->increaseStreamWindow($stream); - if (isset($headers["content-length"])) { - if (\count($headers['content-length']) !== 1) { - $this->handleStreamException(new Http2StreamException("Multiple content-length header values", $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $contentLength = $headers["content-length"][0]; - if (!\preg_match('/^(0|[1-9][0-9]*)$/', $contentLength)) { - $this->handleStreamException(new Http2StreamException("Invalid content-length header value", $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $stream->expectedLength = (int) $contentLength; - } - $cancellationToken->subscribe(function (CancelledException $exception) use($streamId) : void { - if (!isset($this->streams[$streamId])) { - return; - } - $this->writeFrame(Http2Parser::RST_STREAM, Http2Parser::NO_FLAG, $streamId, \pack("N", Http2Parser::CANCEL)); - if (!$this->streams[$streamId]->originalCancellation->isRequested()) { - $this->hasTimeout = \true; - $this->ping(); - // async ping, if other requests occur, they wait for it - $transferTimeout = $this->streams[$streamId]->request->getTransferTimeout(); - $exception = new TimeoutException('Allowed transfer timeout exceeded, took longer than ' . $transferTimeout . ' ms', 0, $exception); - } - $this->releaseStream($streamId, $exception); - }); - } - public function handlePushPromise(int $streamId, int $pushId, array $pseudo, array $headers) : void - { - if ($pushId % 2 === 1) { - $this->handleConnectionException(new Http2ConnectionException("Invalid server initiated stream", Http2Parser::PROTOCOL_ERROR)); - return; - } - foreach ($pseudo as $name => $value) { - if (!isset(Http2Parser::KNOWN_REQUEST_PSEUDO_HEADERS[$name])) { - throw new Http2StreamException("Invalid pseudo header", $pushId, Http2Parser::PROTOCOL_ERROR); - } - } - if (!isset($pseudo[":method"], $pseudo[":path"], $pseudo[":scheme"], $pseudo[":authority"]) || isset($headers["connection"]) || $pseudo[":path"] === '' || isset($headers["te"]) && \implode($headers["te"]) !== "trailers") { - $this->handleStreamException(new Http2StreamException("Invalid header values", $pushId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $method = $pseudo[":method"]; - $target = $pseudo[":path"]; - $scheme = $pseudo[":scheme"]; - $host = $pseudo[":authority"]; - $query = null; - if ($method !== 'GET' && $method !== 'HEAD') { - $this->handleStreamException(new Http2StreamException("Pushed request method must be a safe method", $pushId, Http2Parser::PROTOCOL_ERROR)); - return; - } - if (!\preg_match("#^([A-Z\\d.\\-]+|\\[[\\d:]+])(?::([1-9]\\d*))?\$#i", $host, $matches)) { - $this->handleStreamException(new Http2StreamException("Invalid pushed authority (host) name", $pushId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $host = $matches[1]; - $port = isset($matches[2]) ? (int) $matches[2] : $this->socket->getRemoteAddress()->getPort(); - if (!isset($this->streams[$streamId])) { - $this->handleStreamException(new Http2StreamException("Parent stream {$streamId} is no longer open", $pushId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $parentStream = $this->streams[$streamId]; - $parentStream->enableInactivityWatcher(); - if (\strcasecmp($host, $parentStream->request->getUri()->getHost()) !== 0) { - $this->handleStreamException(new Http2StreamException("Authority does not match original request authority", $pushId, Http2Parser::PROTOCOL_ERROR)); - return; - } - if ($position = \strpos($target, "#")) { - $target = \substr($target, 0, $position); - } - if ($position = \strpos($target, "?")) { - $query = \substr($target, $position + 1); - $target = \substr($target, 0, $position); - } - try { - $uri = Uri\Http::createFromComponents(["scheme" => $scheme, "host" => $host, "port" => $port, "path" => $target, "query" => $query]); - } catch (\Exception $exception) { - $this->handleConnectionException(new Http2ConnectionException("Invalid push URI", Http2Parser::PROTOCOL_ERROR)); - return; - } - $request = new Request($uri, $method); - $request->setHeaders($headers); - $request->setProtocolVersions(['2']); - $request->setPushHandler($parentStream->request->getPushHandler()); - $request->setHeaderSizeLimit($parentStream->request->getHeaderSizeLimit()); - $request->setBodySizeLimit($parentStream->request->getBodySizeLimit()); - $request->setInactivityTimeout($parentStream->request->getInactivityTimeout()); - $request->setTransferTimeout($parentStream->request->getTransferTimeout()); - $stream = new Http2Stream($pushId, $request, HttpStream::fromStream($parentStream->stream, static function () { - throw new \Error('Calling Stream::request() on a pushed request is forbidden'); - }, static function () { - // nothing to do - }), $parentStream->cancellationToken, $parentStream->originalCancellation, $this->createStreamInactivityWatcher($pushId, $request->getInactivityTimeout()), self::DEFAULT_WINDOW_SIZE, 0); - $stream->dependency = $streamId; - $this->streams[$pushId] = $stream; - $stream->requestBodyComplete = \true; - $stream->requestBodyCompletion->resolve(); - if ($parentStream->request->getPushHandler() === null) { - $this->handleStreamException(new Http2StreamException("Push promise refused", $pushId, Http2Parser::CANCEL)); - return; - } - asyncCall(function () use($pushId, $stream) : \Generator { - $tokenSource = new CancellationTokenSource(); - $cancellationToken = new CombinedCancellationToken($stream->cancellationToken, $tokenSource->getToken()); - $cancellationId = $cancellationToken->subscribe(function (CancelledException $exception) use($pushId) : void { - if (!isset($this->streams[$pushId])) { - return; - } - $this->writeFrame(Http2Parser::RST_STREAM, Http2Parser::NO_FLAG, $pushId, \pack("N", Http2Parser::CANCEL)); - $this->releaseStream($pushId, $exception); - }); - $onPush = $stream->request->getPushHandler(); - try { - \assert($onPush !== null); - \assert($stream->pendingResponse !== null); - (yield call($onPush, $stream->request, $stream->pendingResponse->promise())); - } catch (HttpException|StreamException|CancelledException $exception) { - $tokenSource->cancel($exception); - } catch (\Throwable $exception) { - $tokenSource->cancel($exception); - throw $exception; - } finally { - $cancellationToken->unsubscribe($cancellationId); - } - }); - } - public function handlePriority(int $streamId, int $parentId, int $weight) : void - { - if (!isset($this->streams[$streamId])) { - return; - } - $stream = $this->streams[$streamId]; - $stream->dependency = $parentId; - $stream->weight = $weight; - } - public function handleStreamReset(int $streamId, int $errorCode) : void - { - if (!isset($this->streams[$streamId])) { - return; - } - $this->handleStreamException(new Http2StreamException("Stream closed by server", $streamId, $errorCode)); - } - public function handleStreamException(Http2StreamException $exception) : void - { - $id = $exception->getStreamId(); - $code = $exception->getCode(); - /** - * @psalm-suppress DeprecatedClass - * @psalm-suppress InvalidScalarArgument - * @noinspection PhpDeprecationInspection - */ - $exception = new ClientHttp2StreamException($exception->getMessage(), $id, $code, $exception); - if ($code === Http2Parser::REFUSED_STREAM) { - $exception = new UnprocessedRequestException($exception); - } - $this->writeFrame(Http2Parser::RST_STREAM, Http2Parser::NO_FLAG, $id, \pack("N", $code)); - if (isset($this->streams[$id])) { - $this->releaseStream($id, $exception); - } - } - public function handleConnectionException(Http2ConnectionException $exception) : void - { - /** - * @psalm-suppress DeprecatedClass - * @psalm-suppress InvalidScalarArgument - * @noinspection PhpDeprecationInspection - */ - $this->shutdown(new ClientHttp2ConnectionException($exception->getMessage(), $exception->getCode(), $exception)); - $this->close(); - } - public function handleData(int $streamId, string $data) : void - { - $length = \strlen($data); - $this->serverWindow -= $length; - $this->increaseConnectionWindow(); - if (!isset($this->streams[$streamId])) { - return; - } - $stream = $this->streams[$streamId]; - $stream->disableInactivityWatcher(); - if (!$stream->body) { - $this->handleStreamException(new Http2StreamException("Stream headers not complete or body already complete", $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $stream->serverWindow -= $length; - $stream->received += $length; - $stream->bufferSize += $length; - if ($stream->request->getBodySizeLimit() > 0 && $stream->received >= $stream->request->getBodySizeLimit()) { - $this->handleStreamException(new Http2StreamException("Body size limit exceeded", $streamId, Http2Parser::CANCEL)); - return; - } - if ($stream->expectedLength !== null && $stream->received > $stream->expectedLength) { - $this->handleStreamException(new Http2StreamException("Body size exceeded content-length in header", $streamId, Http2Parser::CANCEL)); - return; - } - $promise = $stream->body->emit($data); - $promise->onResolve(function (?\Throwable $exception) use($streamId, $length) : void { - if ($exception || !isset($this->streams[$streamId])) { - return; - } - // Defer prevents sending increments for already closed streams - Loop::defer(function () use($streamId, $length) { - if (!isset($this->streams[$streamId])) { - return; - } - $this->streams[$streamId]->bufferSize -= $length; - if ($this->streams[$streamId]->bufferSize === 0) { - $this->streams[$streamId]->enableInactivityWatcher(); - } - $this->increaseStreamWindow($this->streams[$streamId]); - }); - }); - } - public function handleSettings(array $settings) : void - { - foreach ($settings as $setting => $value) { - $this->applySetting($setting, $value); - } - $this->writeFrame(Http2Parser::SETTINGS, Http2Parser::ACK); - if ($this->settings) { - $deferred = $this->settings; - $this->settings = null; - $this->initialized = \true; - $deferred->resolve($this->remainingStreams); - } - } - public function handleStreamEnd(int $streamId) : void - { - if (!isset($this->streams[$streamId])) { - return; - } - $stream = $this->streams[$streamId]; - if ($stream->expectedLength !== null && $stream->received !== $stream->expectedLength) { - $this->handleStreamException(new Http2StreamException("Body length does not match content-length header", $streamId, Http2Parser::PROTOCOL_ERROR)); - return; - } - $body = $stream->body; - $stream->body = null; - \assert($body !== null); - $trailers = $stream->trailers; - $stream->trailers = null; - \assert($trailers !== null); - $body->complete(); - $trailers->resolve(call(function () use($stream, $streamId) { - try { - foreach ($stream->request->getEventListeners() as $eventListener) { - (yield $eventListener->completeReceivingResponse($stream->request, $stream->stream)); - } - return new Trailers([]); - } catch (\Throwable $e) { - $this->handleStreamException(new Http2StreamException("Event listener error", $streamId, Http2Parser::CANCEL)); - throw $e; - } - })); - $this->setupPingIfIdle(); - // Stream might be cancelled right after body completion - if (isset($this->streams[$streamId])) { - $this->releaseStream($streamId); - } - } - public function reserveStream() : void - { - if ($this->shutdown !== null || $this->hasWriteError || $this->hasTimeout) { - throw new \Error("Can't reserve stream after shutdown started"); - } - --$this->remainingStreams; - } - public function unreserveStream() : void - { - ++$this->remainingStreams; - \assert($this->remainingStreams <= $this->concurrentStreamLimit); - } - public function getRemainingStreams() : int - { - if ($this->shutdown !== null || $this->hasWriteError || $this->hasTimeout) { - return 0; - } - return $this->remainingStreams; - } - public function request(Request $request, CancellationToken $cancellationToken, Stream $stream) : Promise - { - return call(function () use($request, $cancellationToken, $stream) : \Generator { - if ($this->shutdown !== null) { - $exception = new UnprocessedRequestException(new SocketException(\sprintf("Connection from '%s' to '%s' has already been shut down", (string) $this->socket->getLocalAddress(), (string) $this->socket->getRemoteAddress()))); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $exception)); - } - throw $exception; - } - if ($this->hasTimeout && !(yield $this->ping())) { - $exception = new UnprocessedRequestException(new SocketException(\sprintf("Socket to '%s' missed responding to PINGs", (string) $this->socket->getRemoteAddress()))); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $exception)); - } - throw $exception; - } - $this->idlePings = 0; - $this->cancelIdleWatcher(); - (yield RequestNormalizer::normalizeRequest($request)); - // Remove defunct HTTP/1.x headers. - $request->removeHeader('host'); - $request->removeHeader('connection'); - $request->removeHeader('keep-alive'); - $request->removeHeader('transfer-encoding'); - $request->removeHeader('upgrade'); - $request->setProtocolVersions(['2']); - if ($request->getMethod() === 'CONNECT') { - $exception = new HttpException("CONNECT requests are currently not supported on HTTP/2"); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $exception)); - } - throw $exception; - } - if ($this->socket->isClosed()) { - $exception = new UnprocessedRequestException(new SocketException(\sprintf("Socket to '%s' closed before the request could be sent", (string) $this->socket->getRemoteAddress()))); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $exception)); - } - throw $exception; - } - $originalCancellation = $cancellationToken; - if ($request->getTransferTimeout() > 0) { - $cancellationToken = new CombinedCancellationToken($cancellationToken, new TimeoutCancellationToken($request->getTransferTimeout())); - } - try { - $headers = $this->generateHeaders($request); - $body = $request->getBody()->createBodyStream(); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startSendingRequest($request, $stream)); - } - $chunk = (yield $body->read()); - $streamId = $this->streamId += 2; - // Client streams should be odd-numbered, starting at 1. - $this->streams[$streamId] = $http2stream = new Http2Stream($streamId, $request, $stream, $cancellationToken, $originalCancellation, $this->createStreamInactivityWatcher($streamId, $request->getInactivityTimeout()), self::DEFAULT_WINDOW_SIZE, $this->initialWindowSize); - $this->socket->reference(); - $transferTimeout = $request->getTransferTimeout(); - $cancellationId = $cancellationToken->subscribe(function (CancelledException $exception) use($streamId, $originalCancellation, $transferTimeout) : void { - if (!isset($this->streams[$streamId])) { - return; - } - $this->writeFrame(Http2Parser::RST_STREAM, Http2Parser::NO_FLAG, $streamId, \pack("N", Http2Parser::CANCEL)); - if (!$originalCancellation->isRequested()) { - $this->hasTimeout = \true; - $this->ping(); - // async ping, if other requests occur, they wait for it - $exception = new TimeoutException('Allowed transfer timeout exceeded, took longer than ' . $transferTimeout . ' ms', 0, $exception); - } - $this->releaseStream($streamId, $exception); - }); - if (!isset($this->streams[$streamId])) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeSendingRequest($request, $stream)); - } - \assert($http2stream->pendingResponse !== null); - return (yield $http2stream->pendingResponse->promise()); - } - $flag = Http2Parser::END_HEADERS | ($chunk === null ? Http2Parser::END_STREAM : Http2Parser::NO_FLAG); - $headers = $this->hpack->encode($headers); - if (\strlen($headers) > $this->frameSizeLimit) { - /** @var string[] $split */ - $split = \str_split($headers, $this->frameSizeLimit); - $firstChunk = \array_shift($split); - $lastChunk = \array_pop($split); - // no yield, because there must not be other frames in between - $this->writeFrame(Http2Parser::HEADERS, Http2Parser::NO_FLAG, $streamId, $firstChunk); - foreach ($split as $headerChunk) { - // no yield, because there must not be other frames in between - $this->writeFrame(Http2Parser::CONTINUATION, Http2Parser::NO_FLAG, $streamId, $headerChunk); - } - (yield $this->writeFrame(Http2Parser::CONTINUATION, $flag, $streamId, $lastChunk)); - } else { - (yield $this->writeFrame(Http2Parser::HEADERS, $flag, $streamId, $headers)); - } - if ($chunk === null) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeSendingRequest($request, $stream)); - } - $http2stream->requestBodyComplete = \true; - $http2stream->requestBodyCompletion->resolve(); - \assert($http2stream->pendingResponse !== null); - return (yield $http2stream->pendingResponse->promise()); - } - $buffer = $chunk; - while (null !== ($chunk = (yield $body->read()))) { - if (!isset($this->streams[$streamId])) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeSendingRequest($request, $stream)); - } - \assert($http2stream->pendingResponse !== null); - return (yield $http2stream->pendingResponse->promise()); - } - (yield $this->writeData($http2stream, $buffer)); - $buffer = $chunk; - } - if (!isset($this->streams[$streamId])) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeSendingRequest($request, $stream)); - } - \assert($http2stream->pendingResponse !== null); - return (yield $http2stream->pendingResponse->promise()); - } - \assert($http2stream->pendingResponse !== null); - $responsePromise = $http2stream->pendingResponse->promise(); - $http2stream->requestBodyComplete = \true; - $http2stream->requestBodyCompletion->resolve(); - (yield $this->writeData($http2stream, $buffer)); - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->completeSendingRequest($request, $stream)); - } - return (yield $responsePromise); - } catch (\Throwable $exception) { - if (isset($streamId) && isset($this->streams[$streamId])) { - \assert(isset($http2stream)); - if (!$http2stream->requestBodyComplete) { - $http2stream->requestBodyCompletion->fail($exception); - } - $this->releaseStream($streamId, $exception); - } - if ($exception instanceof StreamException) { - $message = 'Failed to write request (stream ' . ($streamId ?? 'not assigned') . ') to socket: ' . $exception->getMessage(); - $exception = new SocketException($message, 0, $exception); - } - throw $exception; - } finally { - if (isset($cancellationId)) { - $cancellationToken->unsubscribe($cancellationId); - } - } - }); - } - public function isClosed() : bool - { - return $this->onClose === null; - } - private function run() : \Generator - { - try { - (yield $this->socket->write(Http2Parser::PREFACE)); - Promise\rethrow(new Coroutine($this->runWriteThread())); - (yield $this->writeFrame(Http2Parser::SETTINGS, 0, 0, \pack("nNnNnNnN", Http2Parser::ENABLE_PUSH, 1, Http2Parser::MAX_CONCURRENT_STREAMS, 256, Http2Parser::INITIAL_WINDOW_SIZE, self::DEFAULT_WINDOW_SIZE, Http2Parser::MAX_FRAME_SIZE, self::DEFAULT_MAX_FRAME_SIZE))); - } catch (\Throwable $e) { - /** - * @psalm-suppress DeprecatedClass - * @noinspection PhpDeprecationInspection - */ - $this->shutdown(new ClientHttp2ConnectionException('The HTTP/2 connection closed' . ($this->shutdown !== null ? ' unexpectedly' : ''), $this->shutdown ?? Http2Parser::INTERNAL_ERROR)); - $this->close(); - return; - } - try { - $parser = (new Http2Parser($this))->parse(); - while (null !== ($chunk = (yield $this->socket->read()))) { - $return = $parser->send($chunk); - \assert($return === null); - } - /** - * @psalm-suppress DeprecatedClass - * @noinspection PhpDeprecationInspection - */ - $this->shutdown(new ClientHttp2ConnectionException("The HTTP/2 connection from '" . $this->socket->getLocalAddress() . "' to '" . $this->socket->getRemoteAddress() . "' closed" . ($this->shutdown === null ? ' unexpectedly' : ''), $this->shutdown ?? Http2Parser::INTERNAL_ERROR)); - $this->close(); - } catch (\Throwable $exception) { - /** - * @psalm-suppress DeprecatedClass - * @noinspection PhpDeprecationInspection - */ - $this->shutdown(new ClientHttp2ConnectionException("The HTTP/2 connection from '" . $this->socket->getLocalAddress() . "' to '" . $this->socket->getRemoteAddress() . "' closed unexpectedly: " . $exception->getMessage(), Http2Parser::INTERNAL_ERROR, $exception)); - $this->close(); - } - } - private function writeFrame(int $type, int $flags = Http2Parser::NO_FLAG, int $stream = 0, string $data = '') : Promise - { - \assert(Http2Parser::logDebugFrame('send', $type, $flags, $stream, \strlen($data))); - return $this->frameQueueEmitter->emit(\substr(\pack("NccN", \strlen($data), $type, $flags, $stream), 1) . $data); - } - private function applySetting(int $setting, int $value) : void - { - switch ($setting) { - case Http2Parser::INITIAL_WINDOW_SIZE: - if ($value < 0 || $value > 2147483647) { - // (1 << 31) - 1 - $this->handleConnectionException(new Http2ConnectionException("Invalid window size: {$value}", Http2Parser::FLOW_CONTROL_ERROR)); - return; - } - $priorWindowSize = $this->initialWindowSize; - $this->initialWindowSize = $value; - $difference = $this->initialWindowSize - $priorWindowSize; - foreach ($this->streams as $stream) { - $stream->clientWindow += $difference; - } - // Settings ACK should be sent before HEADER or DATA frames. - if ($difference > 0) { - Loop::defer(function () { - foreach ($this->streams as $stream) { - if ($this->clientWindow <= 0) { - return; - } - if ($stream->requestBodyBuffer === '' || $stream->clientWindow <= 0) { - continue; - } - $this->writeBufferedData($stream); - } - }); - } - return; - case Http2Parser::MAX_FRAME_SIZE: - if ($value < 1 << 14 || $value >= 1 << 24) { - $this->handleConnectionException(new Http2ConnectionException("Invalid maximum frame size: {$value}", Http2Parser::PROTOCOL_ERROR)); - return; - } - $this->frameSizeLimit = $value; - return; - case Http2Parser::MAX_CONCURRENT_STREAMS: - if ($value < 0 || $value > 2147483647) { - // (1 << 31) - 1 - $this->handleConnectionException(new Http2ConnectionException("Invalid concurrent streams value: {$value}", Http2Parser::PROTOCOL_ERROR)); - return; - } - $priorUsedStreams = $this->concurrentStreamLimit - $this->remainingStreams; - $this->concurrentStreamLimit = $value; - $this->remainingStreams = $this->concurrentStreamLimit - $priorUsedStreams; - \assert($this->remainingStreams <= $this->concurrentStreamLimit); - return; - case Http2Parser::HEADER_TABLE_SIZE: - // TODO Respect this setting from the server - case Http2Parser::MAX_HEADER_LIST_SIZE: - // TODO Respect this setting from the server - case Http2Parser::ENABLE_PUSH: - // No action needed. - default: - // Unknown setting, ignore (6.5.2). - return; - } - } - private function writeBufferedData(Http2Stream $stream) : Promise - { - if ($stream->requestBodyComplete && $stream->requestBodyBuffer === '') { - return new Success(); - } - $windowSize = \min($this->clientWindow, $stream->clientWindow); - $length = \strlen($stream->requestBodyBuffer); - if ($length <= $windowSize) { - if ($stream->windowSizeIncrease) { - $deferred = $stream->windowSizeIncrease; - $stream->windowSizeIncrease = null; - $deferred->resolve(); - } - $this->clientWindow -= $length; - $stream->clientWindow -= $length; - if ($length > $this->frameSizeLimit) { - /** @var string[] $chunks */ - $chunks = \str_split($stream->requestBodyBuffer, $this->frameSizeLimit); - $stream->requestBodyBuffer = \array_pop($chunks); - foreach ($chunks as $chunk) { - $this->writeFrame(Http2Parser::DATA, Http2Parser::NO_FLAG, $stream->id, $chunk); - } - } - if ($stream->requestBodyComplete) { - $promise = $this->writeFrame(Http2Parser::DATA, Http2Parser::END_STREAM, $stream->id, $stream->requestBodyBuffer); - } else { - $promise = $this->writeFrame(Http2Parser::DATA, Http2Parser::NO_FLAG, $stream->id, $stream->requestBodyBuffer); - } - $stream->requestBodyBuffer = ""; - $stream->enableInactivityWatcher(); - return $promise; - } - if ($windowSize > 0) { - // Read next body chunk if less than 8192 bytes will remain in the buffer - if ($length - 8192 < $windowSize && $stream->windowSizeIncrease) { - $deferred = $stream->windowSizeIncrease; - $stream->windowSizeIncrease = null; - $deferred->resolve(); - } - $data = $stream->requestBodyBuffer; - $end = $windowSize - $this->frameSizeLimit; - $stream->clientWindow -= $windowSize; - $this->clientWindow -= $windowSize; - for ($off = 0; $off < $end; $off += $this->frameSizeLimit) { - $this->writeFrame(Http2Parser::DATA, Http2Parser::NO_FLAG, $stream->id, \substr($data, $off, $this->frameSizeLimit)); - } - $promise = $this->writeFrame(Http2Parser::DATA, Http2Parser::NO_FLAG, $stream->id, \substr($data, $off, $windowSize - $off)); - $stream->requestBodyBuffer = \substr($data, $windowSize); - $stream->enableInactivityWatcher(); - return $promise; - } - if ($stream->windowSizeIncrease === null) { - $stream->windowSizeIncrease = new Deferred(); - } - return $stream->windowSizeIncrease->promise(); - } - private function releaseStream(int $streamId, ?\Throwable $exception = null) : void - { - \assert(isset($this->streams[$streamId])); - $stream = $this->streams[$streamId]; - unset($this->streams[$streamId]); - if ($streamId & 1) { - // Client-initiated stream. - $this->remainingStreams++; - \assert($this->remainingStreams <= $this->concurrentStreamLimit); - } - if ($stream->responsePending || $stream->body || $stream->trailers) { - /** - * @psalm-suppress DeprecatedClass - * @noinspection PhpDeprecationInspection - */ - $exception = $exception ?? new ClientHttp2StreamException(\sprintf("Stream %d closed unexpectedly", $streamId), $streamId, Http2Parser::INTERNAL_ERROR); - if (!$exception instanceof HttpException && !$exception instanceof CancelledException) { - $exception = new HttpException($exception->getMessage(), 0, $exception); - } - /** @var (Deferred|Emitter)[] $deferredAndEmitter */ - $deferredAndEmitter = []; - if ($stream->responsePending) { - $stream->responsePending = \false; - $deferredAndEmitter[] = $stream->pendingResponse; - $stream->pendingResponse = null; - } - if ($stream->body) { - $deferredAndEmitter[] = $stream->body; - $stream->body = null; - } - if ($stream->trailers) { - $deferredAndEmitter[] = $stream->trailers; - $stream->trailers = null; - } - $request = $stream->request; - asyncCall(static function () use($request, $deferredAndEmitter, $exception) { - try { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->abort($request, $exception)); - } - } finally { - foreach ($deferredAndEmitter as $deferredOrEmitter) { - \assert($deferredOrEmitter !== null); - // TODO Find out why psalm reports this as nullable - $deferredOrEmitter->fail($exception); - } - } - }); - } - if (!$this->streams && !$this->socket->isClosed()) { - $this->socket->unreference(); - } - if (!$this->streams && $this->shutdown !== null) { - $this->close(); - } - } - private function setupPingIfIdle() : void - { - if ($this->idleWatcher !== null) { - return; - } - $this->idleWatcher = Loop::defer(function ($watcher) { - \assert($this->idleWatcher === null || $this->idleWatcher === $watcher); - $this->idleWatcher = null; - if (!empty($this->streams)) { - return; - } - $this->idleWatcher = Loop::delay(300000, function ($watcher) { - \assert($this->idleWatcher === null || $this->idleWatcher === $watcher); - \assert(empty($this->streams)); - $this->idleWatcher = null; - // Connection idle for 10 minutes - if ($this->idlePings >= 1) { - $this->shutdown(new HttpException('Too many pending pings')); - $this->close(); - return; - } - if ((yield $this->ping())) { - $this->setupPingIfIdle(); - } - }); - Loop::unreference($this->idleWatcher); - }); - Loop::unreference($this->idleWatcher); - } - private function cancelIdleWatcher() : void - { - if ($this->idleWatcher !== null) { - Loop::cancel($this->idleWatcher); - $this->idleWatcher = null; - } - } - /** - * @return Promise Fulfilled with true if a pong is received within the timeout, false if none is received. - */ - private function ping() : Promise - { - if ($this->onClose === null) { - return new Success(\false); - } - if ($this->pongDeferred !== null) { - return $this->pongDeferred->promise(); - } - $this->pongDeferred = new Deferred(); - $this->idlePings++; - $promise = $this->pongDeferred->promise(); - $this->pongWatcher = Loop::delay(self::PONG_TIMEOUT, function () { - $this->hasTimeout = \false; - $deferred = $this->pongDeferred; - $this->pongDeferred = null; - \assert($deferred !== null); - $deferred->resolve(\false); - // Shutdown connection to stop new requests, but keep it open, as other responses might still arrive - $this->shutdown(new HttpException('PONG timeout of ' . self::PONG_TIMEOUT . 'ms reached'), \max(0, $this->streamId)); - }); - $this->writeFrame(Http2Parser::PING, 0, 0, $this->counter++); - return $promise; - } - /** - * @param HttpException $reason Shutdown reason. - * @param int|null $lastId ID of last processed frame. Null to use the last opened frame ID or 0 if no - * streams have been opened. - * - * @return Promise - */ - private function shutdown(HttpException $reason, ?int $lastId = null) : Promise - { - return call(function () use($lastId, $reason) { - /** @psalm-suppress RedundantCast */ - $code = (int) $reason->getCode(); - $this->shutdown = $code; - if ($this->settings !== null) { - $settings = $this->settings; - $this->settings = null; - $message = "Connection closed before HTTP/2 settings could be received"; - $settings->fail(new UnprocessedRequestException(new SocketException($message, 0, $reason))); - } - if ($this->streams) { - $reason = $lastId !== null ? new UnprocessedRequestException($reason) : $reason; - foreach ($this->streams as $id => $stream) { - if ($lastId !== null && $id <= $lastId) { - continue; - } - $this->releaseStream($id, $reason); - } - } - }); - } - /** - * @param Request $request - * - * @return array - * @throws InvalidRequestException - * - * @psalm-return list - */ - private function generateHeaders(Request $request) : array - { - $uri = $request->getUri(); - $path = normalizeRequestPathWithQuery($request); - $authority = $uri->getHost(); - if ($port = $uri->getPort()) { - $authority .= ':' . $port; - } - $headers = [[":authority", $authority], [":path", $path], [":scheme", $uri->getScheme()], [":method", $request->getMethod()]]; - foreach ($request->getHeaders() as $field => $values) { - foreach ($values as $value) { - if ($field === 'te' && $value !== 'trailers') { - continue; - } - $headers[] = [$field, $value]; - } - } - return $headers; - } - private function writeData(Http2Stream $stream, string $data) : Promise - { - $stream->requestBodyBuffer .= $data; - return $this->writeBufferedData($stream); - } - private function increaseConnectionWindow() : void - { - $increase = 0; - while ($this->serverWindow <= self::MINIMUM_WINDOW) { - $this->serverWindow += self::WINDOW_INCREMENT; - $increase += self::WINDOW_INCREMENT; - } - if ($increase > 0) { - $this->writeFrame(Http2Parser::WINDOW_UPDATE, 0, 0, \pack("N", self::WINDOW_INCREMENT)); - } - } - private function increaseStreamWindow(Http2Stream $stream) : void - { - $minWindow = \min($stream->request->getBodySizeLimit(), self::MINIMUM_WINDOW); - $increase = 0; - while ($stream->serverWindow + $stream->bufferSize <= $minWindow) { - $stream->serverWindow += self::WINDOW_INCREMENT; - $increase += self::WINDOW_INCREMENT; - } - if ($increase > 0) { - $this->writeFrame(Http2Parser::WINDOW_UPDATE, Http2Parser::NO_FLAG, $stream->id, \pack("N", self::WINDOW_INCREMENT)); - } - } - private function createStreamInactivityWatcher(int $streamId, int $timeout) : ?string - { - if ($timeout <= 0) { - return null; - } - $watcher = Loop::delay($timeout, function () use($streamId, $timeout) : void { - if (!isset($this->streams[$streamId])) { - return; - } - $this->writeFrame(Http2Parser::RST_STREAM, Http2Parser::NO_FLAG, $streamId, \pack("N", Http2Parser::CANCEL)); - $this->releaseStream($streamId, new TimeoutException("Inactivity timeout exceeded, more than {$timeout} ms elapsed from last data received")); - }); - Loop::unreference($watcher); - return $watcher; - } - private function runWriteThread() : \Generator - { - try { - while ((yield $this->frameQueue->advance())) { - (yield $this->socket->write($this->frameQueue->getCurrent())); - } - } catch (\Throwable $exception) { - $this->hasWriteError = \true; - /** - * @psalm-suppress DeprecatedClass - * @noinspection PhpDeprecationInspection - */ - $this->shutdown(new ClientHttp2ConnectionException("The HTTP/2 connection closed unexpectedly: " . $exception->getMessage(), Http2Parser::INTERNAL_ERROR, $exception), \max(0, $this->streamId)); - } - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Internal/Http2Stream.php b/dependencies/amphp/http-client/src/Connection/Internal/Http2Stream.php deleted file mode 100644 index c279fc5..0000000 --- a/dependencies/amphp/http-client/src/Connection/Internal/Http2Stream.php +++ /dev/null @@ -1,107 +0,0 @@ -id = $id; - $this->request = $request; - $this->stream = $stream; - $this->cancellationToken = $cancellationToken; - $this->originalCancellation = $originalCancellation; - $this->watcher = $watcher; - $this->serverWindow = $serverSize; - $this->clientWindow = $clientSize; - $this->pendingResponse = new Deferred(); - $this->requestBodyCompletion = new Deferred(); - $this->bufferSize = 0; - } - public function __destruct() - { - if ($this->watcher !== null) { - Loop::cancel($this->watcher); - } - } - public function disableInactivityWatcher() : void - { - if ($this->watcher === null) { - return; - } - Loop::disable($this->watcher); - } - public function enableInactivityWatcher() : void - { - if ($this->watcher === null) { - return; - } - Loop::disable($this->watcher); - Loop::enable($this->watcher); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/Internal/RequestNormalizer.php b/dependencies/amphp/http-client/src/Connection/Internal/RequestNormalizer.php deleted file mode 100644 index 7723c27..0000000 --- a/dependencies/amphp/http-client/src/Connection/Internal/RequestNormalizer.php +++ /dev/null @@ -1,71 +0,0 @@ -getBody()->getHeaders()); - foreach ($headers as $name => $header) { - if (!$request->hasHeader($name)) { - $request->setHeaders([$name => $header]); - } - } - yield from self::normalizeRequestBodyHeaders($request); - // Always normalize this as last item, because we need to strip sensitive headers - self::normalizeTraceRequest($request); - return $request; - }); - } - private static function normalizeRequestBodyHeaders(Request $request) : \Generator - { - if (!$request->hasHeader('host')) { - // Though servers are supposed to be able to handle standard port names on the end of the - // Host header some fail to do this correctly. Thankfully PSR-7 recommends to strip the port - // if it is the standard port for the given scheme. - $request->setHeader('host', $request->getUri()->withUserInfo('')->getAuthority()); - } - if ($request->hasHeader("transfer-encoding")) { - $request->removeHeader("content-length"); - return; - } - if ($request->hasHeader("content-length")) { - return; - } - /** @var RequestBody $body */ - $body = $request->getBody(); - $bodyLength = (yield $body->getBodyLength()); - if ($bodyLength === 0) { - if (\in_array($request->getMethod(), ['HEAD', 'GET', 'CONNECT'], \true)) { - $request->removeHeader('content-length'); - } else { - $request->setHeader('content-length', '0'); - } - $request->removeHeader('transfer-encoding'); - } elseif ($bodyLength > 0) { - $request->setHeader("content-length", $bodyLength); - $request->removeHeader("transfer-encoding"); - } else { - $request->setHeader("transfer-encoding", "chunked"); - } - } - private static function normalizeTraceRequest(Request $request) : void - { - $method = $request->getMethod(); - if ($method !== 'TRACE') { - return; - } - // https://tools.ietf.org/html/rfc7231#section-4.3.8 - $request->setBody(null); - // Remove all body and sensitive headers - $request->setHeaders(["transfer-encoding" => [], "content-length" => [], "authorization" => [], "proxy-authorization" => [], "cookie" => []]); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/LimitedConnectionPool.php b/dependencies/amphp/http-client/src/Connection/LimitedConnectionPool.php deleted file mode 100644 index 7fab84b..0000000 --- a/dependencies/amphp/http-client/src/Connection/LimitedConnectionPool.php +++ /dev/null @@ -1,6 +0,0 @@ - - * - * @throws \Error Thrown if this method is called more than once. - */ - public function request(Request $request, CancellationToken $cancellation) : Promise; - public function getLocalAddress() : SocketAddress; - public function getRemoteAddress() : SocketAddress; - public function getTlsInfo() : ?TlsInfo; -} diff --git a/dependencies/amphp/http-client/src/Connection/StreamLimitingPool.php b/dependencies/amphp/http-client/src/Connection/StreamLimitingPool.php deleted file mode 100644 index 1d9bf4c..0000000 --- a/dependencies/amphp/http-client/src/Connection/StreamLimitingPool.php +++ /dev/null @@ -1,72 +0,0 @@ -getUri()->getHost(); - }); - } - public static function byStaticKey(ConnectionPool $delegate, KeyedSemaphore $semaphore, string $key = '') : self - { - return new self($delegate, $semaphore, static function () use($key) { - return $key; - }); - } - public static function byCustomKey(ConnectionPool $delegate, KeyedSemaphore $semaphore, callable $requestToKeyMapper) : self - { - return new self($delegate, $semaphore, $requestToKeyMapper); - } - /** @var ConnectionPool */ - private $delegate; - /** @var KeyedSemaphore */ - private $semaphore; - /** @var callable */ - private $requestToKeyMapper; - private function __construct(ConnectionPool $delegate, KeyedSemaphore $semaphore, callable $requestToKeyMapper) - { - $this->delegate = $delegate; - $this->semaphore = $semaphore; - $this->requestToKeyMapper = $requestToKeyMapper; - } - public function getStream(Request $request, CancellationToken $cancellation) : Promise - { - return call(function () use($request, $cancellation) { - /** @var Lock $lock */ - $lock = (yield $this->semaphore->acquire(($this->requestToKeyMapper)($request))); - /** @var Stream $stream */ - $stream = (yield $this->delegate->getStream($request, $cancellation)); - return HttpStream::fromStream($stream, coroutine(static function (Request $request, CancellationToken $cancellationToken) use($stream, $lock) { - try { - /** @var Response $response */ - $response = (yield $stream->request($request, $cancellationToken)); - // await response being completely received - $response->getTrailers()->onResolve(static function () use($lock) { - $lock->release(); - }); - } catch (\Throwable $e) { - $lock->release(); - throw $e; - } - return $response; - }), static function () use($lock) { - $lock->release(); - }); - }); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/UnlimitedConnectionPool.php b/dependencies/amphp/http-client/src/Connection/UnlimitedConnectionPool.php deleted file mode 100644 index 722dc78..0000000 --- a/dependencies/amphp/http-client/src/Connection/UnlimitedConnectionPool.php +++ /dev/null @@ -1,38 +0,0 @@ -pool = ConnectionLimitingPool::byAuthority(\PHP_INT_MAX, $connectionFactory); - } - public function __clone() - { - $this->pool = clone $this->pool; - } - public function getTotalConnectionAttempts() : int - { - return $this->pool->getTotalConnectionAttempts(); - } - public function getTotalStreamRequests() : int - { - return $this->pool->getTotalStreamRequests(); - } - public function getOpenConnectionCount() : int - { - return $this->pool->getOpenConnectionCount(); - } - public function getStream(Request $request, CancellationToken $cancellation) : Promise - { - return $this->pool->getStream($request, $cancellation); - } -} diff --git a/dependencies/amphp/http-client/src/Connection/UnprocessedRequestException.php b/dependencies/amphp/http-client/src/Connection/UnprocessedRequestException.php deleted file mode 100644 index 5565c48..0000000 --- a/dependencies/amphp/http-client/src/Connection/UnprocessedRequestException.php +++ /dev/null @@ -1,12 +0,0 @@ -socket = $socket; - $this->buffer = $buffer !== '' ? $buffer : null; - } - public function read() : Promise - { - if ($this->buffer !== null) { - $buffer = $this->buffer; - $this->buffer = null; - return new Success($buffer); - } - return $this->socket->read(); - } - public function close() : void - { - $this->socket->close(); - } - public function __destruct() - { - $this->close(); - } - public function write(string $data) : Promise - { - return $this->socket->write($data); - } - public function end(string $finalData = "") : Promise - { - return $this->socket->end($finalData); - } - public function reference() : void - { - $this->socket->reference(); - } - public function unreference() : void - { - $this->socket->unreference(); - } - public function isClosed() : bool - { - return $this->socket->isClosed(); - } - public function getLocalAddress() : SocketAddress - { - return $this->socket->getLocalAddress(); - } - public function getRemoteAddress() : SocketAddress - { - return $this->socket->getRemoteAddress(); - } - public function setupTls(?CancellationToken $cancellationToken = null) : Promise - { - return $this->socket->setupTls($cancellationToken); - } - public function shutdownTls(?CancellationToken $cancellationToken = null) : Promise - { - return $this->socket->shutdownTls(); - } - public function getTlsState() : int - { - return $this->socket->getTlsState(); - } - public function getTlsInfo() : ?TlsInfo - { - return $this->socket->getTlsInfo(); - } -} diff --git a/dependencies/amphp/http-client/src/DelegateHttpClient.php b/dependencies/amphp/http-client/src/DelegateHttpClient.php deleted file mode 100644 index 3a46a9f..0000000 --- a/dependencies/amphp/http-client/src/DelegateHttpClient.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ - public function request(Request $request, CancellationToken $cancellation) : Promise; -} diff --git a/dependencies/amphp/http-client/src/EventListener.php b/dependencies/amphp/http-client/src/EventListener.php deleted file mode 100644 index b618b29..0000000 --- a/dependencies/amphp/http-client/src/EventListener.php +++ /dev/null @@ -1,117 +0,0 @@ -hasAttribute(HarAttributes::STARTED_DATE_TIME)) { - $request->setAttribute(HarAttributes::STARTED_DATE_TIME, new \DateTimeImmutable()); - } - return $this->addTiming(HarAttributes::TIME_START, $request); - } - public function startDnsResolution(Request $request) : Promise - { - return new Success(); - // not implemented - } - public function startConnectionCreation(Request $request) : Promise - { - return $this->addTiming(HarAttributes::TIME_CONNECT, $request); - } - public function startTlsNegotiation(Request $request) : Promise - { - return $this->addTiming(HarAttributes::TIME_SSL, $request); - } - public function startSendingRequest(Request $request, Stream $stream) : Promise - { - $host = $stream->getRemoteAddress()->getHost(); - if (\strrpos($host, ':')) { - $host = '[' . $host . ']'; - } - $request->setAttribute(HarAttributes::SERVER_IP_ADDRESS, $host); - return $this->addTiming(HarAttributes::TIME_SEND, $request); - } - public function completeSendingRequest(Request $request, Stream $stream) : Promise - { - return $this->addTiming(HarAttributes::TIME_WAIT, $request); - } - public function startReceivingResponse(Request $request, Stream $stream) : Promise - { - return $this->addTiming(HarAttributes::TIME_RECEIVE, $request); - } - public function completeReceivingResponse(Request $request, Stream $stream) : Promise - { - return $this->addTiming(HarAttributes::TIME_COMPLETE, $request); - } - public function completeDnsResolution(Request $request) : Promise - { - return new Success(); - // not implemented - } - public function completeConnectionCreation(Request $request) : Promise - { - return new Success(); - // not implemented - } - public function completeTlsNegotiation(Request $request) : Promise - { - return new Success(); - // not implemented - } - private function addTiming(string $key, Request $request) : Promise - { - if (!$request->hasAttribute($key)) { - $request->setAttribute($key, getCurrentTime()); - } - return new Success(); - } - public function abort(Request $request, \Throwable $cause) : Promise - { - return new Success(); - } -} diff --git a/dependencies/amphp/http-client/src/HttpClient.php b/dependencies/amphp/http-client/src/HttpClient.php deleted file mode 100644 index 74213a4..0000000 --- a/dependencies/amphp/http-client/src/HttpClient.php +++ /dev/null @@ -1,31 +0,0 @@ -httpClient = $httpClient; - } - /** - * Request a specific resource from an HTTP server. - * - * @param Request $request - * @param CancellationToken $cancellation - * - * @return Promise - */ - public function request(Request $request, ?CancellationToken $cancellation = null) : Promise - { - return $this->httpClient->request(clone $request, $cancellation ?? new NullCancellationToken()); - } -} diff --git a/dependencies/amphp/http-client/src/HttpClientBuilder.php b/dependencies/amphp/http-client/src/HttpClientBuilder.php deleted file mode 100644 index 5a2d3c0..0000000 --- a/dependencies/amphp/http-client/src/HttpClientBuilder.php +++ /dev/null @@ -1,204 +0,0 @@ -build(); - } - /** @var ForbidUriUserInfo|null */ - private $forbidUriUserInfo; - /** @var RetryRequests|null */ - private $retryInterceptor; - /** @var FollowRedirects|null */ - private $followRedirectsInterceptor; - /** @var SetRequestHeaderIfUnset|null */ - private $defaultUserAgentInterceptor; - /** @var SetRequestHeaderIfUnset|null */ - private $defaultAcceptInterceptor; - /** @var NetworkInterceptor|null */ - private $defaultCompressionHandler; - /** @var ApplicationInterceptor[] */ - private $applicationInterceptors = []; - /** @var NetworkInterceptor[] */ - private $networkInterceptors = []; - /** @var ConnectionPool */ - private $pool; - public function __construct() - { - $this->pool = new UnlimitedConnectionPool(); - $this->forbidUriUserInfo = new ForbidUriUserInfo(); - $this->followRedirectsInterceptor = new FollowRedirects(10); - $this->retryInterceptor = new RetryRequests(2); - $this->defaultAcceptInterceptor = new SetRequestHeaderIfUnset('accept', '*/*'); - $this->defaultUserAgentInterceptor = new SetRequestHeaderIfUnset('user-agent', 'amphp/http-client @ v4.x'); - $this->defaultCompressionHandler = new DecompressResponse(); - } - public function build() : HttpClient - { - /** @var PooledHttpClient $client */ - $client = new PooledHttpClient($this->pool); - foreach ($this->networkInterceptors as $interceptor) { - $client = $client->intercept($interceptor); - } - if ($this->defaultAcceptInterceptor) { - $client = $client->intercept($this->defaultAcceptInterceptor); - } - if ($this->defaultUserAgentInterceptor) { - $client = $client->intercept($this->defaultUserAgentInterceptor); - } - if ($this->defaultCompressionHandler) { - $client = $client->intercept($this->defaultCompressionHandler); - } - $applicationInterceptors = $this->applicationInterceptors; - if ($this->followRedirectsInterceptor) { - \array_unshift($applicationInterceptors, $this->followRedirectsInterceptor); - } - if ($this->forbidUriUserInfo) { - \array_unshift($applicationInterceptors, $this->forbidUriUserInfo); - } - if ($this->retryInterceptor) { - $applicationInterceptors[] = $this->retryInterceptor; - } - foreach (\array_reverse($applicationInterceptors) as $applicationInterceptor) { - $client = new InterceptedHttpClient($client, $applicationInterceptor); - } - return new HttpClient($client); - } - /** - * @param ConnectionPool $pool Connection pool to use. - * - * @return self - */ - public function usingPool(ConnectionPool $pool) : self - { - $builder = clone $this; - $builder->pool = $pool; - return $builder; - } - /** - * @param ApplicationInterceptor $interceptor This interceptor gets added to the interceptor queue, so interceptors - * are executed in the order given to this method. - * - * @return self - */ - public function intercept(ApplicationInterceptor $interceptor) : self - { - if ($this->followRedirectsInterceptor !== null && $interceptor instanceof FollowRedirects) { - throw new \Error('Disable automatic redirect following or use HttpClientBuilder::followRedirects() to customize redirects'); - } - if ($this->retryInterceptor !== null && $interceptor instanceof RetryRequests) { - throw new \Error('Disable automatic retries or use HttpClientBuilder::retry() to customize retries'); - } - $builder = clone $this; - $builder->applicationInterceptors[] = $interceptor; - return $builder; - } - /** - * @param NetworkInterceptor $interceptor This interceptor gets added to the interceptor queue, so interceptors - * are executed in the order given to this method. - * - * @return self - */ - public function interceptNetwork(NetworkInterceptor $interceptor) : self - { - $builder = clone $this; - $builder->networkInterceptors[] = $interceptor; - return $builder; - } - /** - * @param int $retryLimit Maximum number of times a request may be retried. Only certain requests will be retried - * automatically (GET, HEAD, PUT, and DELETE requests are automatically retried, or any - * request that was indicated as unprocessed by the connection). - * - * @return self - */ - public function retry(int $retryLimit) : self - { - $builder = clone $this; - if ($retryLimit <= 0) { - $builder->retryInterceptor = null; - } else { - $builder->retryInterceptor = new RetryRequests($retryLimit); - } - return $builder; - } - /** - * @param int $limit Maximum number of redirects to follow. The client will automatically request the URI supplied - * by a redirect response (3xx status codes) and returns that response instead. - * - * @return self - */ - public function followRedirects(int $limit = 10) : self - { - $builder = clone $this; - if ($limit <= 0) { - $builder->followRedirectsInterceptor = null; - } else { - $builder->followRedirectsInterceptor = new FollowRedirects($limit); - } - return $builder; - } - /** - * Removes the default restriction of user:password in request URIs. - * - * @return self - */ - public function allowDeprecatedUriUserInfo() : self - { - $builder = clone $this; - $builder->forbidUriUserInfo = null; - return $builder; - } - /** - * Doesn't automatically set an 'accept' header. - * - * @return self - */ - public function skipDefaultAcceptHeader() : self - { - $builder = clone $this; - $builder->defaultAcceptInterceptor = null; - return $builder; - } - /** - * Doesn't automatically set a 'user-agent' header. - * - * @return self - */ - public function skipDefaultUserAgent() : self - { - $builder = clone $this; - $builder->defaultUserAgentInterceptor = null; - return $builder; - } - /** - * Doesn't automatically set an 'accept-encoding' header and decompress the response. - * - * @return self - */ - public function skipAutomaticCompression() : self - { - $builder = clone $this; - $builder->defaultCompressionHandler = null; - return $builder; - } -} diff --git a/dependencies/amphp/http-client/src/HttpException.php b/dependencies/amphp/http-client/src/HttpException.php deleted file mode 100644 index feb965d..0000000 --- a/dependencies/amphp/http-client/src/HttpException.php +++ /dev/null @@ -1,7 +0,0 @@ -httpClient = $httpClient; - $this->interceptor = $interceptor; - } - public function request(Request $request, CancellationToken $cancellation) : Promise - { - return call(function () use($request, $cancellation) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startRequest($request)); - } - return $this->interceptor->request($request, $cancellation, $this->httpClient); - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/AddRequestHeader.php b/dependencies/amphp/http-client/src/Interceptor/AddRequestHeader.php deleted file mode 100644 index af65855..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/AddRequestHeader.php +++ /dev/null @@ -1,15 +0,0 @@ -addHeader($headerName, $headerValues); - return $request; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/AddResponseHeader.php b/dependencies/amphp/http-client/src/Interceptor/AddResponseHeader.php deleted file mode 100644 index 5093910..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/AddResponseHeader.php +++ /dev/null @@ -1,15 +0,0 @@ -addHeader($headerName, $headerValues); - return $response; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/DecompressResponse.php b/dependencies/amphp/http-client/src/Interceptor/DecompressResponse.php deleted file mode 100644 index 38f3d92..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/DecompressResponse.php +++ /dev/null @@ -1,76 +0,0 @@ -hasZlib = \extension_loaded('zlib'); - } - public function requestViaNetwork(Request $request, CancellationToken $cancellation, Stream $stream) : Promise - { - // If a header is manually set, we won't interfere - if ($request->hasHeader('accept-encoding')) { - return $stream->request($request, $cancellation); - } - return call(function () use($request, $cancellation, $stream) { - $this->addAcceptEncodingHeader($request); - $request->interceptPush(function (Response $response) { - return $this->decompressResponse($response); - }); - return $this->decompressResponse((yield $stream->request($request, $cancellation))); - }); - } - private function addAcceptEncodingHeader(Request $request) : void - { - if ($this->hasZlib) { - $request->setHeader('Accept-Encoding', 'gzip, deflate, identity'); - } - } - private function decompressResponse(Response $response) : Response - { - if ($encoding = $this->determineCompressionEncoding($response)) { - $sizeLimit = $response->getRequest()->getBodySizeLimit(); - /** @noinspection PhpUnhandledExceptionInspection */ - $decompressedBody = new ZlibInputStream($response->getBody(), $encoding); - $response->setBody(new SizeLimitingInputStream($decompressedBody, $sizeLimit)); - $response->removeHeader('content-encoding'); - } - return $response; - } - private function determineCompressionEncoding(Response $response) : int - { - if (!$this->hasZlib) { - return 0; - } - if (!$response->hasHeader("content-encoding")) { - return 0; - } - $contentEncoding = $response->getHeader("content-encoding"); - \assert($contentEncoding !== null); - $contentEncodingHeader = \trim($contentEncoding); - if (\strcasecmp($contentEncodingHeader, 'gzip') === 0) { - return \ZLIB_ENCODING_GZIP; - } - if (\strcasecmp($contentEncodingHeader, 'deflate') === 0) { - return \ZLIB_ENCODING_DEFLATE; - } - return 0; - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/FollowRedirects.php b/dependencies/amphp/http-client/src/Interceptor/FollowRedirects.php deleted file mode 100644 index dbf84b5..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/FollowRedirects.php +++ /dev/null @@ -1,245 +0,0 @@ -getScheme() !== '' || $locationUri->getHost() !== '') { - $resultUri = $locationUri->withPath(self::removeDotSegments($locationUri->getPath())); - if ($locationUri->getScheme() === '') { - $resultUri = $resultUri->withScheme($baseUri->getScheme()); - } - return $resultUri; - } - $baseUri = $baseUri->withQuery($locationUri->getQuery()); - $baseUri = $baseUri->withFragment($locationUri->getFragment()); - if ($locationUri->getPath() !== '' && \substr($locationUri->getPath(), 0, 1) === "/") { - $baseUri = $baseUri->withPath(self::removeDotSegments($locationUri->getPath())); - } else { - $baseUri = $baseUri->withPath(self::mergePaths($baseUri->getPath(), $locationUri->getPath())); - } - return $baseUri; - } - /** - * @param string $input - * - * @return string - * - * @link http://www.apps.ietf.org/rfc/rfc3986.html#sec-5.2.4 - */ - private static function removeDotSegments(string $input) : string - { - $output = ''; - $patternA = ',^(\\.\\.?/),'; - $patternB1 = ',^(/\\./),'; - $patternB2 = ',^(/\\.)$,'; - $patternC = ',^(/\\.\\./|/\\.\\.),'; - // $patternD = ',^(\.\.?)$,'; - $patternE = ',(/*[^/]*),'; - while ($input !== '') { - if (\preg_match($patternA, $input)) { - $input = \preg_replace($patternA, '', $input); - } elseif (\preg_match($patternB1, $input, $match) || \preg_match($patternB2, $input, $match)) { - $input = \preg_replace(",^" . $match[1] . ",", '/', $input); - } elseif (\preg_match($patternC, $input, $match)) { - $input = \preg_replace(',^' . \preg_quote($match[1], ',') . ',', '/', $input); - $output = \preg_replace(',/([^/]+)$,', '', $output); - } elseif ($input === '.' || $input === '..') { - // pattern D - $input = ''; - } elseif (\preg_match($patternE, $input, $match)) { - $initialSegment = $match[1]; - $input = \preg_replace(',^' . \preg_quote($initialSegment, ',') . ',', '', $input, 1); - $output .= $initialSegment; - } - } - return $output; - } - /** - * @param string $basePath - * @param string $pathToMerge - * - * @return string - * - * @link http://tools.ietf.org/html/rfc3986#section-5.2.3 - */ - private static function mergePaths(string $basePath, string $pathToMerge) : string - { - if ($pathToMerge === '') { - return self::removeDotSegments($basePath); - } - if ($basePath === '') { - return self::removeDotSegments('/' . $pathToMerge); - } - $parts = \explode('/', $basePath); - \array_pop($parts); - $parts[] = $pathToMerge; - return self::removeDotSegments(\implode('/', $parts)); - } - /** @var int */ - private $maxRedirects; - /** @var bool */ - private $autoReferrer; - public function __construct(int $limit, bool $autoReferrer = \true) - { - if ($limit < 1) { - /** @noinspection PhpUndefinedClassInspection */ - throw new \Error("Invalid redirection limit: " . $limit); - } - $this->maxRedirects = $limit; - $this->autoReferrer = $autoReferrer; - } - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise - { - // Don't follow redirects on pushes, just store the redirect in cache (if an interceptor is configured) - return call(function () use($request, $cancellation, $httpClient) { - /** @var Response $response */ - $response = (yield $httpClient->request(clone $request, $cancellation)); - $response = (yield from $this->followRedirects($request, $response, $httpClient, $cancellation)); - return $response; - }); - } - private function followRedirects(Request $request, Response $response, DelegateHttpClient $client, CancellationToken $cancellationToken) : \Generator - { - $previousResponse = null; - $maxRedirects = $this->maxRedirects; - $requestNr = 2; - do { - $request = (yield from $this->createRedirectRequest($request, $response)); - if ($request === null) { - return $response; - } - /** @var Response $redirectResponse */ - $redirectResponse = (yield $client->request(clone $request, $cancellationToken)); - $redirectResponse->setPreviousResponse($response); - $response = $redirectResponse; - } while (++$requestNr <= $maxRedirects + 1); - if ($this->getRedirectUri($response) !== null) { - throw new TooManyRedirectsException($response); - } - return $response; - } - private function createRedirectRequest(Request $originalRequest, Response $response) : \Generator - { - $redirectUri = $this->getRedirectUri($response); - if ($redirectUri === null) { - return null; - } - $originalUri = $response->getRequest()->getUri(); - $isSameHost = $redirectUri->getAuthority() === $originalUri->getAuthority(); - $request = clone $originalRequest; - $request->setMethod('GET'); - $request->setUri($redirectUri); - $request->removeHeader('transfer-encoding'); - $request->removeHeader('content-length'); - $request->removeHeader('content-type'); - $request->removeAttributes(); - $request->setBody(null); - if (!$isSameHost) { - // Remove for security reasons, any interceptor headers will be added again, - // but application headers will be discarded. - foreach ($request->getRawHeaders() as [$field]) { - $request->removeHeader($field); - } - } - if ($this->autoReferrer) { - $this->assignRedirectRefererHeader($request, $originalUri, $redirectUri); - } - yield from $this->discardResponseBody($response); - return $request; - } - /** - * Clients must not add a Referer header when leaving an unencrypted resource and redirecting to an encrypted - * resource. - * - * @param Request $request - * @param PsrUri $referrerUri - * @param PsrUri $followUri - * - * @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3 - */ - private function assignRedirectRefererHeader(Request $request, PsrUri $referrerUri, PsrUri $followUri) : void - { - $referrerIsEncrypted = $referrerUri->getScheme() === 'https'; - $destinationIsEncrypted = $followUri->getScheme() === 'https'; - if (!$referrerIsEncrypted || $destinationIsEncrypted) { - $request->setHeader('Referer', (string) $referrerUri->withUserInfo('')->withFragment('')); - } else { - $request->removeHeader('Referer'); - } - } - private function getRedirectUri(Response $response) : ?PsrUri - { - if (\count($response->getHeaderArray('location')) !== 1) { - return null; - } - $status = $response->getStatus(); - $request = $response->getRequest(); - $method = $request->getMethod(); - if ($method !== 'GET' && \in_array($status, [307, 308], \true)) { - return null; - } - // We don't automatically follow: - // - 300 (Multiple Choices) - // - 304 (Not Modified) - // - 305 (Use Proxy) - if (!\in_array($status, [301, 302, 303, 307, 308], \true)) { - return null; - } - try { - $location = $response->getHeader('location'); - \assert($location !== null); - $locationUri = Uri\Http::createFromString($location); - } catch (\Exception $e) { - return null; - } - return self::resolve($request->getUri(), $locationUri); - } - private function discardResponseBody(Response $response) : \Generator - { - // Discard response body of redirect responses - $body = $response->getBody(); - try { - /** @noinspection PhpStatementHasEmptyBodyInspection */ - /** @noinspection LoopWhichDoesNotLoopInspection */ - /** @noinspection MissingOrEmptyGroupStatementInspection */ - while (null !== (yield $body->read())) { - // discard - } - } catch (HttpException|StreamException $e) { - // ignore streaming errors on previous responses - } finally { - unset($body); - } - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/ForbidUriUserInfo.php b/dependencies/amphp/http-client/src/Interceptor/ForbidUriUserInfo.php deleted file mode 100644 index 084969d..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/ForbidUriUserInfo.php +++ /dev/null @@ -1,17 +0,0 @@ -getUri()->getUserInfo() !== '') { - throw new InvalidRequestException($request, 'The user information (username:password) component of URIs has been deprecated ' . '(see https://tools.ietf.org/html/rfc3986#section-3.2.1 and https://tools.ietf.org/html/rfc7230#section-2.7.1); ' . 'Instead, set an "Authorization" header containing "Basic " . \\base64_encode("username:password"). ' . 'If you used HttpClientBuilder, you can use HttpClientBuilder::allowDeprecatedUriUserInfo() to disable this protection. ' . 'Doing so is strongly discouraged and you need to be aware of any interceptor using UriInterface::__toString(), which might expose the password in headers or logs.'); - } - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/LogHttpArchive.php b/dependencies/amphp/http-client/src/Interceptor/LogHttpArchive.php deleted file mode 100644 index 92cea42..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/LogHttpArchive.php +++ /dev/null @@ -1,148 +0,0 @@ -hasAttribute($start)) { - return -1; - } - foreach ($ends as $end) { - if ($request->hasAttribute($end)) { - return $request->getAttribute($end) - $request->getAttribute($start); - } - } - return -1; - } - private static function formatHeaders(Message $message) : array - { - $headers = []; - foreach ($message->getHeaders() as $field => $values) { - foreach ($values as $value) { - $headers[] = ['name' => $field, 'value' => $value]; - } - } - return $headers; - } - private static function formatEntry(Response $response) : array - { - $request = $response->getRequest(); - $data = ['startedDateTime' => $request->getAttribute(HarAttributes::STARTED_DATE_TIME)->format(\DateTimeInterface::RFC3339_EXTENDED), 'time' => self::getTime($request, HarAttributes::TIME_START, HarAttributes::TIME_COMPLETE), 'request' => ['method' => $request->getMethod(), 'url' => (string) $request->getUri()->withUserInfo(''), 'httpVersion' => 'http/' . $request->getProtocolVersions()[0], 'headers' => self::formatHeaders($request), 'queryString' => [], 'cookies' => [], 'headersSize' => -1, 'bodySize' => -1], 'response' => ['status' => $response->getStatus(), 'statusText' => $response->getReason(), 'httpVersion' => 'http/' . $response->getProtocolVersion(), 'headers' => self::formatHeaders($response), 'cookies' => [], 'redirectURL' => $response->getHeader('location') ?? '', 'headersSize' => -1, 'bodySize' => -1, 'content' => ['size' => (int) ($response->getHeader('content-length') ?? '-1'), 'mimeType' => $response->getHeader('content-type') ?? '']], 'cache' => [], 'timings' => ['blocked' => self::getTime($request, HarAttributes::TIME_START, HarAttributes::TIME_CONNECT, HarAttributes::TIME_SEND), 'dns' => -1, 'connect' => self::getTime($request, HarAttributes::TIME_CONNECT, HarAttributes::TIME_SEND), 'ssl' => self::getTime($request, HarAttributes::TIME_SSL, HarAttributes::TIME_SEND), 'send' => self::getTime($request, HarAttributes::TIME_SEND, HarAttributes::TIME_WAIT), 'wait' => self::getTime($request, HarAttributes::TIME_WAIT, HarAttributes::TIME_RECEIVE), 'receive' => self::getTime($request, HarAttributes::TIME_RECEIVE, HarAttributes::TIME_COMPLETE)]]; - if ($request->hasAttribute(HarAttributes::SERVER_IP_ADDRESS)) { - $data['serverIPAddress'] = $request->getAttribute(HarAttributes::SERVER_IP_ADDRESS); - } - return $data; - } - /** @var LocalMutex */ - private $fileMutex; - /** @var File\File|null */ - private $fileHandle; - /** @var string */ - private $filePath; - /** @var \Throwable|null */ - private $error; - /** @var EventListener */ - private $eventListener; - public function __construct(string $filePath) - { - $this->filePath = $filePath; - $this->fileMutex = new LocalMutex(); - $this->eventListener = new RecordHarAttributes(); - if (!\interface_exists(Driver::class)) { - throw new \Error(__CLASS__ . ' requires amphp/file to be installed'); - } - } - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise - { - return call(function () use($request, $cancellation, $httpClient) { - if ($this->error) { - throw $this->error; - } - $this->ensureEventListenerIsRegistered($request); - /** @var Response $response */ - $response = (yield $httpClient->request($request, $cancellation)); - rethrow($this->writeLog($response)); - return $response; - }); - } - public function reset() : Promise - { - return $this->rotate($this->filePath); - } - public function rotate(string $filePath) : Promise - { - return call(function () use($filePath) { - /** @var Lock $lock */ - $lock = (yield $this->fileMutex->acquire()); - // Will automatically reopen and reset the file - $this->fileHandle = null; - $this->filePath = $filePath; - $this->error = null; - $lock->release(); - }); - } - private function writeLog(Response $response) : Promise - { - return call(function () use($response) { - try { - (yield $response->getTrailers()); - } catch (\Throwable $e) { - // ignore, still log the remaining response times - } - try { - /** @var Lock $lock */ - $lock = (yield $this->fileMutex->acquire()); - $firstEntry = $this->fileHandle === null; - if ($firstEntry) { - $this->fileHandle = (yield \function_exists('WP_Ultimo\\Dependencies\\Amp\\File\\openFile') ? File\openFile($this->filePath, 'w') : File\open($this->filePath, 'w')); - $header = '{"log":{"version":"1.2","creator":{"name":"amphp/http-client","version":"4.x"},"pages":[],"entries":['; - (yield $this->fileHandle->write($header)); - } else { - \assert($this->fileHandle !== null); - (yield $this->fileHandle->seek(-3, \SEEK_CUR)); - } - /** @noinspection PhpComposerExtensionStubsInspection */ - $json = \json_encode(self::formatEntry($response)); - (yield $this->fileHandle->write(($firstEntry ? '' : ',') . $json . ']}}')); - $lock->release(); - } catch (HttpException $e) { - $this->error = $e; - } catch (\Throwable $e) { - $this->error = new HttpException('Writing HTTP archive log failed', 0, $e); - } - }); - } - private function ensureEventListenerIsRegistered(Request $request) : void - { - foreach ($request->getEventListeners() as $eventListener) { - if ($eventListener instanceof RecordHarAttributes) { - return; - // user added it manually - } - } - $request->addEventListener($this->eventListener); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/MatchOrigin.php b/dependencies/amphp/http-client/src/Interceptor/MatchOrigin.php deleted file mode 100644 index b7b9800..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/MatchOrigin.php +++ /dev/null @@ -1,80 +0,0 @@ - $interceptor) { - if (!$interceptor instanceof ApplicationInterceptor) { - $type = \is_object($interceptor) ? \get_class($interceptor) : \gettype($interceptor); - throw new HttpException('Origin map must be a map from origin to ApplicationInterceptor, got ' . $type); - } - $this->originMap[$this->checkOrigin($origin)] = $interceptor; - } - $this->default = $default; - } - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise - { - $interceptor = $this->originMap[$this->normalizeOrigin($request->getUri())] ?? $this->default; - if (!$interceptor) { - return $httpClient->request($request, $cancellation); - } - return $interceptor->request($request, $cancellation, $httpClient); - } - private function checkOrigin(string $origin) : string - { - try { - $originUri = Http::createFromString($origin); - } catch (\Exception $e) { - throw new HttpException("Invalid origin provided: parsing failed: " . $origin); - } - if (!\in_array($originUri->getScheme(), ['http', 'https'], \true)) { - throw new HttpException('Invalid origin with unsupported scheme: ' . $origin); - } - if ($originUri->getHost() === '') { - throw new HttpException('Invalid origin without host: ' . $origin); - } - if ($originUri->getUserInfo() !== '') { - throw new HttpException('Invalid origin with user info, which must not be present: ' . $origin); - } - if (!\in_array($originUri->getPath(), ['', '/'], \true)) { - throw new HttpException('Invalid origin with path, which must not be present: ' . $origin); - } - if ($originUri->getQuery() !== '') { - throw new HttpException('Invalid origin with query, which must not be present: ' . $origin); - } - if ($originUri->getFragment() !== '') { - throw new HttpException('Invalid origin with fragment, which must not be present: ' . $origin); - } - return $this->normalizeOrigin($originUri); - } - private function normalizeOrigin(UriInterface $uri) : string - { - $defaultPort = $uri->getScheme() === 'https' ? 443 : 80; - return $uri->getScheme() . '://' . $uri->getHost() . ':' . ($uri->getPort() ?? $defaultPort); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/ModifyRequest.php b/dependencies/amphp/http-client/src/Interceptor/ModifyRequest.php deleted file mode 100644 index dc9b103..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/ModifyRequest.php +++ /dev/null @@ -1,52 +0,0 @@ -|Request|null>|Promise|Request|null) */ - private $mapper; - /** - * @psalm-param callable(Request):(\Generator|Request|null>|Promise|Request|null) $mapper - */ - public function __construct(callable $mapper) - { - $this->mapper = $mapper; - } - /** - * @param Request $request - * @param CancellationToken $cancellation - * @param Stream $stream - * - * @return Promise - */ - public final function requestViaNetwork(Request $request, CancellationToken $cancellation, Stream $stream) : Promise - { - return call(function () use($request, $cancellation, $stream) { - $mappedRequest = (yield call($this->mapper, $request)); - \assert($mappedRequest instanceof Request || $mappedRequest === null); - return (yield $stream->request($mappedRequest ?? $request, $cancellation)); - }); - } - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise - { - return call(function () use($request, $cancellation, $httpClient) { - $mappedRequest = (yield call($this->mapper, $request)); - \assert($mappedRequest instanceof Request || $mappedRequest === null); - return $httpClient->request($mappedRequest ?? $request, $cancellation); - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/ModifyResponse.php b/dependencies/amphp/http-client/src/Interceptor/ModifyResponse.php deleted file mode 100644 index b9adc03..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/ModifyResponse.php +++ /dev/null @@ -1,48 +0,0 @@ -|Promise|Response|null) */ - private $mapper; - /** - * @psalm-param callable(Response):(\Generator|Promise|Response|null) $mapper - */ - public function __construct(callable $mapper) - { - $this->mapper = $mapper; - } - public final function requestViaNetwork(Request $request, CancellationToken $cancellation, Stream $stream) : Promise - { - return call(function () use($request, $cancellation, $stream) { - $response = (yield $stream->request($request, $cancellation)); - $mappedResponse = (yield call($this->mapper, $response)); - \assert($mappedResponse instanceof Response || $mappedResponse === null); - return $mappedResponse ?? $response; - }); - } - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise - { - return call(function () use($request, $cancellation, $httpClient) { - $request->interceptPush($this->mapper); - $response = (yield $httpClient->request($request, $cancellation)); - $mappedResponse = (yield call($this->mapper, $response)); - \assert($mappedResponse instanceof Response || $mappedResponse === null); - return $mappedResponse ?? $response; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/RemoveRequestHeader.php b/dependencies/amphp/http-client/src/Interceptor/RemoveRequestHeader.php deleted file mode 100644 index a74f2ea..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/RemoveRequestHeader.php +++ /dev/null @@ -1,15 +0,0 @@ -removeHeader($headerName); - return $request; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/RemoveResponseHeader.php b/dependencies/amphp/http-client/src/Interceptor/RemoveResponseHeader.php deleted file mode 100644 index e6b0cea..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/RemoveResponseHeader.php +++ /dev/null @@ -1,15 +0,0 @@ -removeHeader($headerName); - return $response; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/RetryRequests.php b/dependencies/amphp/http-client/src/Interceptor/RetryRequests.php deleted file mode 100644 index 858f4ad..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/RetryRequests.php +++ /dev/null @@ -1,45 +0,0 @@ -retryLimit = $retryLimit; - } - public function request(Request $request, CancellationToken $cancellation, DelegateHttpClient $httpClient) : Promise - { - return call(function () use($request, $cancellation, $httpClient) { - $attempt = 1; - do { - try { - return (yield $httpClient->request(clone $request, $cancellation)); - } catch (UnprocessedRequestException $exception) { - // Request was deemed retryable by connection, so carry on. - } catch (SocketException|Http2ConnectionException $exception) { - if (!$request->isIdempotent()) { - throw $exception; - } - // Request can safely be retried. - } - } while ($attempt++ <= $this->retryLimit); - throw $exception; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/SetRequestHeader.php b/dependencies/amphp/http-client/src/Interceptor/SetRequestHeader.php deleted file mode 100644 index 82d63bf..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/SetRequestHeader.php +++ /dev/null @@ -1,16 +0,0 @@ -setHeader($headerName, $headerValues); - return $request; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/SetRequestHeaderIfUnset.php b/dependencies/amphp/http-client/src/Interceptor/SetRequestHeaderIfUnset.php deleted file mode 100644 index 3905618..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/SetRequestHeaderIfUnset.php +++ /dev/null @@ -1,18 +0,0 @@ -hasHeader($headerName)) { - $request->setHeader($headerName, $headerValues); - } - return $request; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/SetRequestTimeout.php b/dependencies/amphp/http-client/src/Interceptor/SetRequestTimeout.php deleted file mode 100644 index 9abe725..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/SetRequestTimeout.php +++ /dev/null @@ -1,17 +0,0 @@ -setTcpConnectTimeout($tcpConnectTimeout); - $request->setTlsHandshakeTimeout($tlsHandshakeTimeout); - $request->setTransferTimeout($transferTimeout); - return $request; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/SetResponseHeader.php b/dependencies/amphp/http-client/src/Interceptor/SetResponseHeader.php deleted file mode 100644 index 3de11f7..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/SetResponseHeader.php +++ /dev/null @@ -1,16 +0,0 @@ -setHeader($headerName, $headerValues); - return $response; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/SetResponseHeaderIfUnset.php b/dependencies/amphp/http-client/src/Interceptor/SetResponseHeaderIfUnset.php deleted file mode 100644 index 5329860..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/SetResponseHeaderIfUnset.php +++ /dev/null @@ -1,18 +0,0 @@ -hasHeader($headerName)) { - $response->setHeader($headerName, $headerValues); - } - return $response; - }); - } -} diff --git a/dependencies/amphp/http-client/src/Interceptor/TooManyRedirectsException.php b/dependencies/amphp/http-client/src/Interceptor/TooManyRedirectsException.php deleted file mode 100644 index 5d3645a..0000000 --- a/dependencies/amphp/http-client/src/Interceptor/TooManyRedirectsException.php +++ /dev/null @@ -1,20 +0,0 @@ -response = $response; - } - public function getResponse() : Response - { - return $this->response; - } -} diff --git a/dependencies/amphp/http-client/src/Internal/ForbidCloning.php b/dependencies/amphp/http-client/src/Internal/ForbidCloning.php deleted file mode 100644 index ef07767..0000000 --- a/dependencies/amphp/http-client/src/Internal/ForbidCloning.php +++ /dev/null @@ -1,13 +0,0 @@ -body = $body; - $this->bodyCancellation = $bodyCancellation; - } - public function read() : Promise - { - $promise = $this->body->read(); - $promise->onResolve(function ($error, $value) { - if ($value === null && $error === null) { - $this->successfulEnd = \true; - } - }); - return $promise; - } - public function __destruct() - { - if (!$this->successfulEnd) { - $this->bodyCancellation->cancel(); - } - } -} diff --git a/dependencies/amphp/http-client/src/Internal/SizeLimitingInputStream.php b/dependencies/amphp/http-client/src/Internal/SizeLimitingInputStream.php deleted file mode 100644 index 43d85e1..0000000 --- a/dependencies/amphp/http-client/src/Internal/SizeLimitingInputStream.php +++ /dev/null @@ -1,46 +0,0 @@ -source = $source; - $this->sizeLimit = $sizeLimit; - } - public function read() : Promise - { - if ($this->exception) { - return new Failure($this->exception); - } - \assert($this->source !== null); - $promise = $this->source->read(); - $promise->onResolve(function ($error, $value) { - if ($value !== null) { - $this->bytesRead += \strlen($value); - if ($this->bytesRead > $this->sizeLimit) { - $this->exception = new ParseException("Configured body size exceeded: {$this->bytesRead} bytes received, while the configured limit is {$this->sizeLimit} bytes", Status::PAYLOAD_TOO_LARGE); - $this->source = null; - } - } - }); - return $promise; - } -} diff --git a/dependencies/amphp/http-client/src/Internal/functions.php b/dependencies/amphp/http-client/src/Internal/functions.php deleted file mode 100644 index 59277ed..0000000 --- a/dependencies/amphp/http-client/src/Internal/functions.php +++ /dev/null @@ -1,26 +0,0 @@ -getUri()->getPath(); - $query = $request->getUri()->getQuery(); - if ($path === '') { - return '/' . ($query !== '' ? '?' . $query : ''); - } - if ($path[0] !== '/') { - throw new InvalidRequestException($request, 'Relative path (' . $path . ') is not allowed in the request URI'); - } - return $path . ($query !== '' ? '?' . $query : ''); -} diff --git a/dependencies/amphp/http-client/src/InvalidRequestException.php b/dependencies/amphp/http-client/src/InvalidRequestException.php deleted file mode 100644 index 29fd685..0000000 --- a/dependencies/amphp/http-client/src/InvalidRequestException.php +++ /dev/null @@ -1,18 +0,0 @@ -request = $request; - } - public function getRequest() : Request - { - return $this->request; - } -} diff --git a/dependencies/amphp/http-client/src/MissingAttributeError.php b/dependencies/amphp/http-client/src/MissingAttributeError.php deleted file mode 100644 index 7704c09..0000000 --- a/dependencies/amphp/http-client/src/MissingAttributeError.php +++ /dev/null @@ -1,11 +0,0 @@ -request(...)` resolved. - * - * A NetworkInterceptor SHOULD NOT short-circuit and SHOULD delegate to the `$stream` passed as third argument - * exactly once. The only exception to this is throwing an exception, e.g. because the TLS settings used are - * unacceptable. If you need short circuits, use an {@see ApplicationInterceptor} instead. - * - * @param Request $request - * @param CancellationToken $cancellation - * @param Stream $stream - * - * @return Promise - */ - public function requestViaNetwork(Request $request, CancellationToken $cancellation, Stream $stream) : Promise; -} diff --git a/dependencies/amphp/http-client/src/ParseException.php b/dependencies/amphp/http-client/src/ParseException.php deleted file mode 100644 index d0fa8d2..0000000 --- a/dependencies/amphp/http-client/src/ParseException.php +++ /dev/null @@ -1,16 +0,0 @@ -connectionPool = $connectionPool ?? new UnlimitedConnectionPool(); - } - public function request(Request $request, CancellationToken $cancellation) : Promise - { - return call(function () use($request, $cancellation) { - foreach ($request->getEventListeners() as $eventListener) { - (yield $eventListener->startRequest($request)); - } - $stream = (yield $this->connectionPool->getStream($request, $cancellation)); - \assert($stream instanceof Stream); - foreach (\array_reverse($this->networkInterceptors) as $interceptor) { - $stream = new InterceptedStream($stream, $interceptor); - } - return (yield $stream->request($request, $cancellation)); - }); - } - /** - * Adds a network interceptor. - * - * Network interceptors are only invoked if the request requires network access, i.e. there's no short-circuit by - * an application interceptor, e.g. a cache. - * - * Whether the given network interceptor will be respected for currently running requests is undefined. - * - * Any new requests have to take the new interceptor into account. - * - * @param NetworkInterceptor $networkInterceptor - * - * @return self - */ - public function intercept(NetworkInterceptor $networkInterceptor) : self - { - $clone = clone $this; - $clone->networkInterceptors[] = $networkInterceptor; - return $clone; - } -} diff --git a/dependencies/amphp/http-client/src/Request.php b/dependencies/amphp/http-client/src/Request.php deleted file mode 100644 index 49ba005..0000000 --- a/dependencies/amphp/http-client/src/Request.php +++ /dev/null @@ -1,468 +0,0 @@ - \true]); - } - /** @var string[] */ - private $protocolVersions = ['1.1', '2']; - /** @var string */ - private $method; - /** @var UriInterface */ - private $uri; - /** @var RequestBody */ - private $body; - /** @var int */ - private $tcpConnectTimeout = 10000; - /** @var int */ - private $tlsHandshakeTimeout = 10000; - /** @var int */ - private $transferTimeout = 10000; - /** @var int */ - private $inactivityTimeout = 10000; - /** @var int */ - private $bodySizeLimit = self::DEFAULT_BODY_SIZE_LIMIT; - /** @var int */ - private $headerSizeLimit = self::DEFAULT_HEADER_SIZE_LIMIT; - /** @var callable|null */ - private $onPush; - /** @var callable|null */ - private $onUpgrade; - /** @var callable|null */ - private $onInformationalResponse; - /** @var mixed[] */ - private $attributes = []; - /** @var EventListener[] */ - private $eventListeners = []; - /** - * Request constructor. - * - * @param string|UriInterface $uri - * @param string $method - * @param string $body - */ - public function __construct($uri, string $method = "GET", ?string $body = null) - { - $this->setUri($uri); - $this->setMethod($method); - $this->setBody($body); - } - public function addEventListener(EventListener $eventListener) : void - { - $this->eventListeners[] = $eventListener; - } - /** - * @return EventListener[] - */ - public function getEventListeners() : array - { - return $this->eventListeners; - } - /** - * Retrieve the requests's acceptable HTTP protocol versions. - * - * @return string[] - */ - public function getProtocolVersions() : array - { - return $this->protocolVersions; - } - /** - * Assign the requests's acceptable HTTP protocol versions. - * - * The HTTP client might choose any of these. - * - * @param string[] $versions - */ - public function setProtocolVersions(array $versions) : void - { - $versions = \array_unique($versions); - if (empty($versions)) { - /** @noinspection PhpUndefinedClassInspection */ - throw new \Error("Empty array of protocol versions provided, must not be empty."); - } - foreach ($versions as $version) { - if (!\in_array($version, ["1.0", "1.1", "2"], \true)) { - /** @noinspection PhpUndefinedClassInspection */ - throw new \Error("Invalid HTTP protocol version: " . $version); - } - } - $this->protocolVersions = $versions; - } - /** - * Retrieve the request's HTTP method verb. - * - * @return string - */ - public function getMethod() : string - { - return $this->method; - } - /** - * Specify the request's HTTP method verb. - * - * @param string $method - */ - public function setMethod(string $method) : void - { - $this->method = $method; - } - /** - * Retrieve the request's URI. - * - * @return UriInterface - */ - public function getUri() : UriInterface - { - return $this->uri; - } - /** - * Specify the request's HTTP URI. - * - * @param string|UriInterface $uri - */ - public function setUri($uri) : void - { - $this->uri = $uri instanceof UriInterface ? $uri : $this->createUriFromString($uri); - } - /** - * Assign a value for the specified header field by replacing any existing values for that field. - * - * @param string $name Header name. - * @param string|string[] $value Header value. - */ - public function setHeader(string $name, $value) : void - { - if (($name[0] ?? ":") === ":") { - throw new \Error("Header name cannot be empty or start with a colon (:)"); - } - parent::setHeader($name, $value); - } - /** - * Assign a value for the specified header field by adding an additional header line. - * - * @param string $name Header name. - * @param string|string[] $value Header value. - */ - public function addHeader(string $name, $value) : void - { - if (($name[0] ?? ":") === ":") { - throw new \Error("Header name cannot be empty or start with a colon (:)"); - } - parent::addHeader($name, $value); - } - public function setHeaders(array $headers) : void - { - /** @noinspection PhpUnhandledExceptionInspection */ - parent::setHeaders($headers); - } - /** - * Remove the specified header field from the message. - * - * @param string $name Header name. - */ - public function removeHeader(string $name) : void - { - parent::removeHeader($name); - } - /** - * Retrieve the message entity body. - */ - public function getBody() : RequestBody - { - return $this->body; - } - /** - * Assign the message entity body. - * - * @param mixed $body - */ - public function setBody($body) : void - { - if ($body === null) { - $this->body = new StringBody(""); - } elseif (\is_string($body)) { - $this->body = new StringBody($body); - } elseif (\is_scalar($body)) { - $this->body = new StringBody(\var_export($body, \true)); - } elseif ($body instanceof RequestBody) { - $this->body = $body; - } else { - /** @noinspection PhpUndefinedClassInspection */ - throw new \TypeError("Invalid body type: " . \gettype($body)); - } - } - /** - * Registers a callback to the request that is invoked when the server pushes an additional resource. - * The callback is given two parameters: the Request generated from the pushed resource, and a promise for the - * Response containing the pushed resource. An HttpException, StreamException, or CancelledException can be thrown - * to refuse the push. If no callback is registered, pushes are automatically rejected. - * - * Interceptors can mostly use {@code interceptPush} instead. - * - * Example: - * function (Request $request, Promise $response): \Generator { - * $uri = $request->getUri(); // URI of pushed resource. - * $response = yield $promise; // Wait for resource to arrive. - * // Use Response object from resolved promise. - * } - * - * @param callable|null $onPush - */ - public function setPushHandler(?callable $onPush) : void - { - $this->onPush = $onPush; - } - /** - * Allows interceptors to modify also pushed responses. - * - * If no push callable has been set by the application, the interceptor won't be invoked. If you want to enable - * push in an interceptor without the application setting a push handler, you need to use {@code setPushHandler}. - * - * @param callable $interceptor Receives the response and might modify it or return a new instance. - */ - public function interceptPush(callable $interceptor) : void - { - if ($this->onPush === null) { - return; - } - $onPush = $this->onPush; - /** @psalm-suppress MissingClosureReturnType */ - $this->onPush = static function (Request $request, Promise $response) use($onPush, $interceptor) { - $response = call(static function () use($response, $interceptor) : \Generator { - return (yield call($interceptor, (yield $response))) ?? $response; - }); - return $onPush($request, $response); - }; - } - /** - * @return callable|null - */ - public function getPushHandler() : ?callable - { - return $this->onPush; - } - /** - * Registers a callback invoked if a 101 response is returned to the request. - * - * @param callable|null $onUpgrade - */ - public function setUpgradeHandler(?callable $onUpgrade) : void - { - $this->onUpgrade = $onUpgrade; - } - /** - * @return callable|null - */ - public function getUpgradeHandler() : ?callable - { - return $this->onUpgrade; - } - /** - * Registers a callback invoked when a 1xx response is returned to the request (other than a 101). - * - * @param callable|null $onInformationalResponse - */ - public function setInformationalResponseHandler(?callable $onInformationalResponse) : void - { - $this->onInformationalResponse = $onInformationalResponse; - } - /** - * @return callable|null - */ - public function getInformationalResponseHandler() : ?callable - { - return $this->onInformationalResponse; - } - /** - * @return int Timeout in milliseconds for the TCP connection. - */ - public function getTcpConnectTimeout() : int - { - return $this->tcpConnectTimeout; - } - public function setTcpConnectTimeout(int $tcpConnectTimeout) : void - { - $this->tcpConnectTimeout = $tcpConnectTimeout; - } - /** - * @return int Timeout in milliseconds for the TLS handshake. - */ - public function getTlsHandshakeTimeout() : int - { - return $this->tlsHandshakeTimeout; - } - public function setTlsHandshakeTimeout(int $tlsHandshakeTimeout) : void - { - $this->tlsHandshakeTimeout = $tlsHandshakeTimeout; - } - /** - * @return int Timeout in milliseconds for the HTTP transfer (not counting TCP connect and TLS handshake) - */ - public function getTransferTimeout() : int - { - return $this->transferTimeout; - } - public function setTransferTimeout(int $transferTimeout) : void - { - $this->transferTimeout = $transferTimeout; - } - /** - * @return int Timeout in milliseconds since the last data was received before the request fails due to inactivity. - */ - public function getInactivityTimeout() : int - { - return $this->inactivityTimeout; - } - public function setInactivityTimeout(int $inactivityTimeout) : void - { - $this->inactivityTimeout = $inactivityTimeout; - } - public function getHeaderSizeLimit() : int - { - return $this->headerSizeLimit; - } - public function setHeaderSizeLimit(int $headerSizeLimit) : void - { - $this->headerSizeLimit = $headerSizeLimit; - } - public function getBodySizeLimit() : int - { - return $this->bodySizeLimit; - } - public function setBodySizeLimit(int $bodySizeLimit) : void - { - $this->bodySizeLimit = $bodySizeLimit; - } - /** - * Note: This method returns a deep clone of the request's attributes, so you can't modify the request attributes - * by modifying the returned value in any way. - * - * @return mixed[] An array of all request attributes in the request's local storage, indexed by name. - */ - public function getAttributes() : array - { - return self::clone($this->attributes); - } - /** - * Check whether a variable with the given name exists in the request's local storage. - * - * Each request has its own local storage to which applications and interceptors may read and write data. - * Other interceptors which are aware of this data can then access it without the server being tightly coupled to - * specific implementations. - * - * @param string $name Name of the attribute, should be namespaced with a vendor and package namespace like classes. - * - * @return bool - */ - public function hasAttribute(string $name) : bool - { - return \array_key_exists($name, $this->attributes); - } - /** - * Retrieve a variable from the request's local storage. - * - * Each request has its own local storage to which applications and interceptors may read and write data. - * Other interceptors which are aware of this data can then access it without the server being tightly coupled to - * specific implementations. - * - * Note: This method returns a deep clone of the request's attribute, so you can't modify the request attribute - * by modifying the returned value in any way. - * - * @param string $name Name of the attribute, should be namespaced with a vendor and package namespace like classes. - * - * @return mixed - * - * @throws MissingAttributeError If an attribute with the given name does not exist. - */ - public function getAttribute(string $name) - { - if (!$this->hasAttribute($name)) { - throw new MissingAttributeError("The requested attribute '{$name}' does not exist"); - } - return self::clone($this->attributes[$name]); - } - /** - * Assign a variable to the request's local storage. - * - * Each request has its own local storage to which applications and interceptors may read and write data. - * Other interceptors which are aware of this data can then access it without the server being tightly coupled to - * specific implementations. - * - * Note: This method performs a deep clone of the value via serialization, so you can't modify the given value - * after setting it. - * - * **Example** - * - * ```php - * $request->setAttribute(Timing::class, $stopWatch); - * ``` - * - * @param string $name Name of the attribute, should be namespaced with a vendor and package namespace like classes. - * @param mixed $value Value of the attribute, might be any serializable value. - */ - public function setAttribute(string $name, $value) : void - { - $this->attributes[$name] = self::clone($value); - } - /** - * Remove an attribute from the request's local storage. - * - * @param string $name Name of the attribute, should be namespaced with a vendor and package namespace like classes. - * - * @throws MissingAttributeError If an attribute with the given name does not exist. - */ - public function removeAttribute(string $name) : void - { - if (!$this->hasAttribute($name)) { - throw new MissingAttributeError("The requested attribute '{$name}' does not exist"); - } - unset($this->attributes[$name]); - } - /** - * Remove all attributes from the request's local storage. - */ - public function removeAttributes() : void - { - $this->attributes = []; - } - public function isIdempotent() : bool - { - // https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html - return \in_array($this->method, ['GET', 'HEAD', 'PUT', 'DELETE'], \true); - } - private function createUriFromString(string $uri) : UriInterface - { - return Uri\Http::createFromString($uri); - } -} diff --git a/dependencies/amphp/http-client/src/RequestBody.php b/dependencies/amphp/http-client/src/RequestBody.php deleted file mode 100644 index 681cb4a..0000000 --- a/dependencies/amphp/http-client/src/RequestBody.php +++ /dev/null @@ -1,34 +0,0 @@ - */ - private $trailers; - /** @var Response|null */ - private $previousResponse; - public function __construct(string $protocolVersion, int $status, ?string $reason, array $headers, InputStream $body, Request $request, ?Promise $trailerPromise = null, ?Response $previousResponse = null) - { - $this->setProtocolVersion($protocolVersion); - $this->setStatus($status, $reason); - $this->setHeaders($headers); - $this->setBody($body); - $this->request = $request; - /** @noinspection PhpUnhandledExceptionInspection */ - $this->trailers = $trailerPromise ?? new Success(new Trailers([])); - $this->previousResponse = $previousResponse; - } - /** - * Retrieve the requests's HTTP protocol version. - * - * @return string - */ - public function getProtocolVersion() : string - { - return $this->protocolVersion; - } - public function setProtocolVersion(string $protocolVersion) : void - { - if (!\in_array($protocolVersion, ["1.0", "1.1", "2"], \true)) { - /** @noinspection PhpUndefinedClassInspection */ - throw new \Error("Invalid HTTP protocol version: " . $protocolVersion); - } - $this->protocolVersion = $protocolVersion; - } - /** - * Retrieve the response's three-digit HTTP status code. - * - * @return int - */ - public function getStatus() : int - { - return $this->status; - } - public function setStatus(int $status, ?string $reason = null) : void - { - $this->status = $status; - $this->reason = $reason ?? Status::getReason($status); - } - /** - * Retrieve the response's (possibly empty) reason phrase. - * - * @return string - */ - public function getReason() : string - { - return $this->reason; - } - /** - * Retrieve the Request instance that resulted in this Response instance. - * - * @return Request - */ - public function getRequest() : Request - { - return $this->request; - } - public function setRequest(Request $request) : void - { - $this->request = $request; - } - /** - * Retrieve the original Request instance associated with this Response instance. - * - * A given Response may be the result of one or more redirects. This method is a shortcut to - * access information from the original Request that led to this response. - * - * @return Request - */ - public function getOriginalRequest() : Request - { - if (empty($this->previousResponse)) { - return $this->request; - } - return $this->previousResponse->getOriginalRequest(); - } - /** - * Retrieve the original Response instance associated with this Response instance. - * - * A given Response may be the result of one or more redirects. This method is a shortcut to - * access information from the original Response that led to this response. - * - * @return Response - */ - public function getOriginalResponse() : Response - { - if (empty($this->previousResponse)) { - return $this; - } - return $this->previousResponse->getOriginalResponse(); - } - /** - * If this Response is the result of a redirect traverse up the redirect history. - * - * @return Response|null - */ - public function getPreviousResponse() : ?Response - { - return $this->previousResponse; - } - public function setPreviousResponse(?Response $previousResponse) : void - { - $this->previousResponse = $previousResponse; - } - /** - * Assign a value for the specified header field by replacing any existing values for that field. - * - * @param string $name Header name. - * @param string|string[] $value Header value. - */ - public function setHeader(string $name, $value) : void - { - if (($name[0] ?? ":") === ":") { - throw new \Error("Header name cannot be empty or start with a colon (:)"); - } - parent::setHeader($name, $value); - } - /** - * Assign a value for the specified header field by adding an additional header line. - * - * @param string $name Header name. - * @param string|string[] $value Header value. - */ - public function addHeader(string $name, $value) : void - { - if (($name[0] ?? ":") === ":") { - throw new \Error("Header name cannot be empty or start with a colon (:)"); - } - parent::addHeader($name, $value); - } - public function setHeaders(array $headers) : void - { - /** @noinspection PhpUnhandledExceptionInspection */ - parent::setHeaders($headers); - } - /** - * Remove the specified header field from the message. - * - * @param string $name Header name. - */ - public function removeHeader(string $name) : void - { - parent::removeHeader($name); - } - /** - * Retrieve the response body. - * - * Note: If you stream a Message, you can't consume the payload twice. - * - * @return Payload - */ - public function getBody() : Payload - { - return $this->body; - } - /** - * @param Payload|InputStream|string|int|float|bool $body - */ - public function setBody($body) : void - { - if ($body instanceof Payload) { - $this->body = $body; - } elseif ($body === null) { - $this->body = new Payload(new InMemoryStream()); - } elseif (\is_string($body)) { - $this->body = new Payload(new InMemoryStream($body)); - } elseif (\is_scalar($body)) { - $this->body = new Payload(new InMemoryStream(\var_export($body, \true))); - } elseif ($body instanceof InputStream) { - $this->body = new Payload($body); - } else { - /** @noinspection PhpUndefinedClassInspection */ - throw new \TypeError("Invalid body type: " . \gettype($body)); - } - } - /** - * @return Promise - */ - public function getTrailers() : Promise - { - return $this->trailers; - } - /** - * @param Promise $promise - */ - public function setTrailers(Promise $promise) : void - { - $this->trailers = $promise; - } -} diff --git a/dependencies/amphp/http-client/src/SocketException.php b/dependencies/amphp/http-client/src/SocketException.php deleted file mode 100644 index 179e6b7..0000000 --- a/dependencies/amphp/http-client/src/SocketException.php +++ /dev/null @@ -1,7 +0,0 @@ - \true, "content-encoding" => \true, "content-length" => \true, "content-range" => \true, "content-type" => \true, "cookie" => \true, "expect" => \true, "host" => \true, "pragma" => \true, "proxy-authenticate" => \true, "proxy-authorization" => \true, "range" => \true, "te" => \true, "trailer" => \true, "transfer-encoding" => \true, "www-authenticate" => \true]; - /** - * @param string[]|string[][] $headers - * - * @throws InvalidHeaderException Thrown if a disallowed field is in the header values. - */ - public function __construct(array $headers) - { - if (!empty($headers)) { - $this->setHeaders($headers); - } - if (\array_intersect_key($this->getHeaders(), self::DISALLOWED_TRAILERS)) { - throw new InvalidHeaderException('Disallowed field in trailers'); - } - } -} diff --git a/dependencies/amphp/http/src/Cookie/CookieAttributes.php b/dependencies/amphp/http/src/Cookie/CookieAttributes.php deleted file mode 100644 index db8ecf8..0000000 --- a/dependencies/amphp/http/src/Cookie/CookieAttributes.php +++ /dev/null @@ -1,322 +0,0 @@ -httpOnly = \false; - return $new; - } - /** - * @return CookieAttributes Default cookie attributes, which means httpOnly is enabled by default. - * - * @see self::empty() - */ - public static function default() : self - { - return new self(); - } - /** @var string */ - private $path = ''; - /** @var string */ - private $domain = ''; - /** @var int|null */ - private $maxAge; - /** @var \DateTimeImmutable */ - private $expiry; - /** @var bool */ - private $secure = \false; - /** @var bool */ - private $httpOnly = \true; - /** @var string|null */ - private $sameSite; - private function __construct() - { - // only allow creation via named constructors - } - /** - * @param string $path Cookie path. - * - * @return self Cloned instance with the specified operation applied. Cloned instance with the specified operation - * applied. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.4 - */ - public function withPath(string $path) : self - { - $new = clone $this; - $new->path = $path; - return $new; - } - /** - * @param string $domain Cookie domain. - * - * @return self Cloned instance with the specified operation applied. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.3 - */ - public function withDomain(string $domain) : self - { - $new = clone $this; - $new->domain = $domain; - return $new; - } - /** - * @param string $sameSite Cookie SameSite attribute value. - * - * @return self Cloned instance with the specified operation applied. - * - * @link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-5.3.7 - */ - public function withSameSite(string $sameSite) : self - { - $normalizedValue = \ucfirst(\strtolower($sameSite)); - if (!\in_array($normalizedValue, [self::SAMESITE_NONE, self::SAMESITE_LAX, self::SAMESITE_STRICT], \true)) { - throw new \Error("Invalid SameSite attribute: " . $sameSite); - } - $new = clone $this; - $new->sameSite = $normalizedValue; - return $new; - } - /** - * @return self Cloned instance with the specified operation applied. - * - * @link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-5.3.7 - */ - public function withoutSameSite() : self - { - $new = clone $this; - $new->sameSite = null; - return $new; - } - /** - * Applies the given maximum age to the cookie. - * - * @param int $maxAge Cookie maximum age. - * - * @return self Cloned instance with the specified operation applied. - * - * @see self::withoutMaxAge() - * @see self::withExpiry() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.2 - */ - public function withMaxAge(int $maxAge) : self - { - $new = clone $this; - $new->maxAge = $maxAge; - return $new; - } - /** - * Removes any max-age information. - * - * @return self Cloned instance with the specified operation applied. - * - * @see self::withMaxAge() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.2 - */ - public function withoutMaxAge() : self - { - $new = clone $this; - $new->maxAge = null; - return $new; - } - /** - * Applies the given expiry to the cookie. - * - * @return self Cloned instance with the specified operation applied. - * - * @see self::withMaxAge() - * @see self::withoutExpiry() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.1 - */ - public function withExpiry(\DateTimeInterface $date) : self - { - $new = clone $this; - if ($date instanceof \DateTimeImmutable) { - $new->expiry = $date; - } elseif ($date instanceof \DateTime) { - $new->expiry = \DateTimeImmutable::createFromMutable($date); - } else { - $new->expiry = new \DateTimeImmutable("@" . $date->getTimestamp()); - } - return $new; - } - /** - * Removes any expiry information. - * - * @return self Cloned instance with the specified operation applied. - * - * @see self::withExpiry() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.1 - */ - public function withoutExpiry() : self - { - $new = clone $this; - $new->expiry = null; - return $new; - } - /** - * @return self Cloned instance with the specified operation applied. - * - * @see self::withoutSecure() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.5 - */ - public function withSecure() : self - { - $new = clone $this; - $new->secure = \true; - return $new; - } - /** - * @return self Cloned instance with the specified operation applied. - * - * @see self::withSecure() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.5 - */ - public function withoutSecure() : self - { - $new = clone $this; - $new->secure = \false; - return $new; - } - /** - * @return self Cloned instance with the specified operation applied. - * - * @see self::withoutHttpOnly() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.6 - */ - public function withHttpOnly() : self - { - $new = clone $this; - $new->httpOnly = \true; - return $new; - } - /** - * @return self Cloned instance with the specified operation applied. - * - * @see self::withHttpOnly() - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.6 - */ - public function withoutHttpOnly() : self - { - $new = clone $this; - $new->httpOnly = \false; - return $new; - } - /** - * @return string Cookie path. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.4 - */ - public function getPath() : string - { - return $this->path; - } - /** - * @return string Cookie domain. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.3 - */ - public function getDomain() : string - { - return $this->domain; - } - /** - * @return string Cookie domain. - * - * @link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-5.3.7 - */ - public function getSameSite() : ?string - { - return $this->sameSite; - } - /** - * @return int|null Cookie maximum age in seconds or `null` if no value is set. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.2 - */ - public function getMaxAge() : ?int - { - return $this->maxAge; - } - /** - * @return \DateTimeImmutable|null Cookie expiry or `null` if no value is set. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.2 - */ - public function getExpiry() : ?\DateTimeImmutable - { - return $this->expiry; - } - /** - * @return bool Whether the secure flag is enabled or not. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.5 - */ - public function isSecure() : bool - { - return $this->secure; - } - /** - * @return bool Whether the httpOnly flag is enabled or not. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.6 - */ - public function isHttpOnly() : bool - { - return $this->httpOnly; - } - /** - * @return string Representation of the cookie attributes appended to key=value in a 'set-cookie' header. - */ - public function __toString() : string - { - $string = ''; - if ($this->expiry) { - $string .= '; Expires=' . \gmdate('D, j M Y G:i:s T', $this->expiry->getTimestamp()); - } - if ($this->maxAge) { - $string .= '; Max-Age=' . $this->maxAge; - } - if ('' !== $this->path) { - $string .= '; Path=' . $this->path; - } - if ('' !== $this->domain) { - $string .= '; Domain=' . $this->domain; - } - if ($this->secure) { - $string .= '; Secure'; - } - if ($this->httpOnly) { - $string .= '; HttpOnly'; - } - if ($this->sameSite !== null) { - $string .= '; SameSite=' . $this->sameSite; - } - return $string; - } -} diff --git a/dependencies/amphp/http/src/Cookie/InvalidCookieException.php b/dependencies/amphp/http/src/Cookie/InvalidCookieException.php deleted file mode 100644 index 4b91e2f..0000000 --- a/dependencies/amphp/http/src/Cookie/InvalidCookieException.php +++ /dev/null @@ -1,11 +0,0 @@ -@,;:\\\\"/[\\]?={}\\x01-\\x20\\x7F]*+$)', $name)) { - throw new InvalidCookieException("Invalid cookie name: '{$name}'"); - } - if (!\preg_match('(^[\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]*+$)', $value)) { - throw new InvalidCookieException("Invalid cookie value: '{$value}'"); - } - $this->name = $name; - $this->value = $value; - } - /** - * @return string Name of the cookie. - */ - public function getName() : string - { - return $this->name; - } - public function withName(string $name) : self - { - if (!\preg_match('(^[^()<>@,;:\\\\"/[\\]?={}\\x01-\\x20\\x7F]++$)', $name)) { - throw new InvalidCookieException("Invalid cookie name: '{$name}'"); - } - $clone = clone $this; - $clone->name = $name; - return $clone; - } - /** - * @return string Value of the cookie. - */ - public function getValue() : string - { - return $this->value; - } - public function withValue(string $value) : self - { - if (!\preg_match('(^[\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]*+$)', $value)) { - throw new InvalidCookieException("Invalid cookie value: '{$value}'"); - } - $clone = clone $this; - $clone->value = $value; - return $clone; - } - /** - * @return string Representation of the cookie as in a 'cookie' header. - */ - public function __toString() : string - { - return $this->name . '=' . $this->value; - } -} diff --git a/dependencies/amphp/http/src/Cookie/ResponseCookie.php b/dependencies/amphp/http/src/Cookie/ResponseCookie.php deleted file mode 100644 index f88db34..0000000 --- a/dependencies/amphp/http/src/Cookie/ResponseCookie.php +++ /dev/null @@ -1,306 +0,0 @@ -withSecure(); - break; - case 'httponly': - $meta = $meta->withHttpOnly(); - break; - default: - $unknownAttributes[] = $part; - break; - } - } else { - switch ($key) { - case 'expires': - $time = self::parseDate($pieces[1]); - if ($time === null) { - break; - // break is correct, see https://tools.ietf.org/html/rfc6265#section-5.2.1 - } - $meta = $meta->withExpiry($time); - break; - case 'max-age': - $maxAge = \trim($pieces[1]); - // This also allows +1.42, but avoids a more complicated manual check - if (!\is_numeric($maxAge)) { - break; - // break is correct, see https://tools.ietf.org/html/rfc6265#section-5.2.2 - } - $meta = $meta->withMaxAge($maxAge); - break; - case 'path': - $meta = $meta->withPath($pieces[1]); - break; - case 'domain': - $meta = $meta->withDomain($pieces[1]); - break; - case 'samesite': - $normalizedValue = \ucfirst(\strtolower($pieces[1])); - if (!\in_array($normalizedValue, [CookieAttributes::SAMESITE_NONE, CookieAttributes::SAMESITE_LAX, CookieAttributes::SAMESITE_STRICT], \true)) { - $unknownAttributes[] = $part; - } else { - $meta = $meta->withSameSite($normalizedValue); - } - break; - default: - $unknownAttributes[] = $part; - break; - } - } - } - try { - $cookie = new self($name, $value, $meta); - $cookie->unknownAttributes = $unknownAttributes; - return $cookie; - } catch (InvalidCookieException $e) { - return null; - } - } - /** - * @param string $date Formatted cookie date - * - * @return \DateTimeImmutable|null Parsed date. - */ - private static function parseDate(string $date) : ?\DateTimeImmutable - { - foreach (self::$dateFormats as $dateFormat) { - if ($parsedDate = \DateTimeImmutable::createFromFormat($dateFormat, $date, new \DateTimeZone('GMT'))) { - return $parsedDate; - } - } - return null; - } - /** @var string[] */ - private $unknownAttributes = []; - /** @var string */ - private $name; - /** @var string */ - private $value; - /** @var CookieAttributes */ - private $attributes; - /** - * @param string $name Name of the cookie. - * @param string $value Value of the cookie. - * @param CookieAttributes $attributes Attributes of the cookie. - * - * @throws InvalidCookieException If name or value is invalid. - */ - public function __construct(string $name, string $value = '', CookieAttributes $attributes = null) - { - if (!\preg_match('(^[^()<>@,;:\\\\"/[\\]?={}\\x01-\\x20\\x7F]++$)', $name)) { - throw new InvalidCookieException("Invalid cookie name: '{$name}'"); - } - if (!\preg_match('(^[\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]*+$)', $value)) { - throw new InvalidCookieException("Invalid cookie value: '{$value}'"); - } - $this->name = $name; - $this->value = $value; - $this->attributes = $attributes ?? CookieAttributes::default(); - } - /** - * @return string Name of the cookie. - */ - public function getName() : string - { - return $this->name; - } - public function withName(string $name) : self - { - if (!\preg_match('(^[^()<>@,;:\\\\"/[\\]?={}\\x01-\\x20\\x7F]++$)', $name)) { - throw new InvalidCookieException("Invalid cookie name: '{$name}'"); - } - $clone = clone $this; - $clone->name = $name; - return $clone; - } - /** - * @return string Value of the cookie. - */ - public function getValue() : string - { - return $this->value; - } - public function withValue(string $value) : self - { - if (!\preg_match('(^[\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]*+$)', $value)) { - throw new InvalidCookieException("Invalid cookie value: '{$value}'"); - } - $clone = clone $this; - $clone->value = $value; - return $clone; - } - /** - * @return \DateTimeImmutable|null Expiry if set, otherwise `null`. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.1 - */ - public function getExpiry() : ?\DateTimeImmutable - { - return $this->attributes->getExpiry(); - } - public function withExpiry(\DateTimeInterface $expiry) : self - { - return $this->withAttributes($this->attributes->withExpiry($expiry)); - } - public function withoutExpiry() : self - { - return $this->withAttributes($this->attributes->withoutExpiry()); - } - /** - * @return int|null Max-Age if set, otherwise `null`. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.2 - */ - public function getMaxAge() : ?int - { - return $this->attributes->getMaxAge(); - } - public function withMaxAge(int $maxAge) : self - { - return $this->withAttributes($this->attributes->withMaxAge($maxAge)); - } - public function withoutMaxAge() : self - { - return $this->withAttributes($this->attributes->withoutMaxAge()); - } - /** - * @return string Cookie path. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.4 - */ - public function getPath() : string - { - return $this->attributes->getPath(); - } - public function withPath(string $path) : self - { - return $this->withAttributes($this->attributes->withPath($path)); - } - /** - * @return string Cookie domain. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.3 - */ - public function getDomain() : string - { - return $this->attributes->getDomain(); - } - public function withDomain(string $domain) : self - { - return $this->withAttributes($this->attributes->withDomain($domain)); - } - /** - * @return bool Whether the secure flag is enabled or not. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.5 - */ - public function isSecure() : bool - { - return $this->attributes->isSecure(); - } - public function withSecure() : self - { - return $this->withAttributes($this->attributes->withSecure()); - } - public function withoutSecure() : self - { - return $this->withAttributes($this->attributes->withoutSecure()); - } - /** - * @return bool Whether the httpOnly flag is enabled or not. - * - * @link https://tools.ietf.org/html/rfc6265#section-5.2.6 - */ - public function isHttpOnly() : bool - { - return $this->attributes->isHttpOnly(); - } - public function withHttpOnly() : self - { - return $this->withAttributes($this->attributes->withHttpOnly()); - } - public function withoutHttpOnly() : self - { - return $this->withAttributes($this->attributes->withoutHttpOnly()); - } - public function withSameSite(string $sameSite) : self - { - return $this->withAttributes($this->attributes->withSameSite($sameSite)); - } - public function withoutSameSite() : self - { - return $this->withAttributes($this->attributes->withoutSameSite()); - } - public function getSameSite() : ?string - { - return $this->attributes->getSameSite(); - } - /** - * @return CookieAttributes All cookie attributes. - */ - public function getAttributes() : CookieAttributes - { - return $this->attributes; - } - public function withAttributes(CookieAttributes $attributes) : self - { - $clone = clone $this; - $clone->attributes = $attributes; - return $clone; - } - /** - * @return string Representation of the cookie as in a 'set-cookie' header. - */ - public function __toString() : string - { - $line = $this->name . '=' . $this->value; - $line .= $this->attributes; - $unknownAttributes = \implode('; ', $this->unknownAttributes); - if ($unknownAttributes !== '') { - $line .= '; ' . $unknownAttributes; - } - return $line; - } -} diff --git a/dependencies/amphp/http/src/Http2/Http2ConnectionException.php b/dependencies/amphp/http/src/Http2/Http2ConnectionException.php deleted file mode 100644 index 8d8152b..0000000 --- a/dependencies/amphp/http/src/Http2/Http2ConnectionException.php +++ /dev/null @@ -1,11 +0,0 @@ - \true]; - public const KNOWN_REQUEST_PSEUDO_HEADERS = [":method" => \true, ":authority" => \true, ":path" => \true, ":scheme" => \true]; - // SETTINGS Flags - https://http2.github.io/http2-spec/#rfc.section.6.5 - public const ACK = 0x1; - // HEADERS Flags - https://http2.github.io/http2-spec/#rfc.section.6.2 - public const NO_FLAG = 0x0; - public const END_STREAM = 0x1; - public const END_HEADERS = 0x4; - public const PADDED = 0x8; - public const PRIORITY_FLAG = 0x20; - // Frame Types - https://http2.github.io/http2-spec/#rfc.section.11.2 - public const DATA = 0x0; - public const HEADERS = 0x1; - public const PRIORITY = 0x2; - public const RST_STREAM = 0x3; - public const SETTINGS = 0x4; - public const PUSH_PROMISE = 0x5; - public const PING = 0x6; - public const GOAWAY = 0x7; - public const WINDOW_UPDATE = 0x8; - public const CONTINUATION = 0x9; - // Settings - public const HEADER_TABLE_SIZE = 0x1; - // 1 << 12 - public const ENABLE_PUSH = 0x2; - // 1 - public const MAX_CONCURRENT_STREAMS = 0x3; - // INF - public const INITIAL_WINDOW_SIZE = 0x4; - // 1 << 16 - 1 - public const MAX_FRAME_SIZE = 0x5; - // 1 << 14 - public const MAX_HEADER_LIST_SIZE = 0x6; - // INF - // Error codes - public const GRACEFUL_SHUTDOWN = 0x0; - public const PROTOCOL_ERROR = 0x1; - public const INTERNAL_ERROR = 0x2; - public const FLOW_CONTROL_ERROR = 0x3; - public const SETTINGS_TIMEOUT = 0x4; - public const STREAM_CLOSED = 0x5; - public const FRAME_SIZE_ERROR = 0x6; - public const REFUSED_STREAM = 0x7; - public const CANCEL = 0x8; - public const COMPRESSION_ERROR = 0x9; - public const CONNECT_ERROR = 0xa; - public const ENHANCE_YOUR_CALM = 0xb; - public const INADEQUATE_SECURITY = 0xc; - public const HTTP_1_1_REQUIRED = 0xd; - public static function getFrameName(int $type) : string - { - $names = [self::DATA => 'DATA', self::HEADERS => 'HEADERS', self::PRIORITY => 'PRIORITY', self::RST_STREAM => 'RST_STREAM', self::SETTINGS => 'SETTINGS', self::PUSH_PROMISE => 'PUSH_PROMISE', self::PING => 'PING', self::GOAWAY => 'GOAWAY', self::WINDOW_UPDATE => 'WINDOW_UPDATE', self::CONTINUATION => 'CONTINUATION']; - return $names[$type] ?? '0x' . \bin2hex(\chr($type)); - } - public static function logDebugFrame(string $action, int $frameType, int $frameFlags, int $streamId, int $frameLength) : bool - { - $env = \getenv("AMP_DEBUG_HTTP2_FRAMES") ?: "0"; - if ($env !== "0" && $env !== "false" || \defined("AMP_DEBUG_HTTP2_FRAMES") && \AMP_DEBUG_HTTP2_FRAMES) { - \fwrite(\STDERR, $action . ' ' . self::getFrameName($frameType) . ' ' . "\r\n"); - } - return \true; - } - /** @var string */ - private $buffer = ''; - /** @var int */ - private $bufferOffset = 0; - /** @var int */ - private $headerSizeLimit = self::DEFAULT_MAX_FRAME_SIZE; - // Should be configurable? - /** @var bool */ - private $continuationExpected = \false; - /** @var int */ - private $headerFrameType = 0; - /** @var string */ - private $headerBuffer = ''; - /** @var int */ - private $headerStream = 0; - /** @var HPack */ - private $hpack; - /** @var Http2Processor */ - private $handler; - /** @var int */ - private $receivedFrameCount = 0; - /** @var int */ - private $receivedByteCount = 0; - public function __construct(Http2Processor $handler) - { - $this->hpack = new HPack(); - $this->handler = $handler; - } - public function getReceivedByteCount() : int - { - return $this->receivedByteCount; - } - public function getReceivedFrameCount() : int - { - return $this->receivedFrameCount; - } - public function parse(string $settings = null) : \Generator - { - if ($settings !== null) { - $this->parseSettings($settings, \strlen($settings), self::NO_FLAG, 0); - } - $this->buffer = yield; - while (\true) { - $frameHeader = (yield from $this->consume(9)); - ['length' => $frameLength, 'type' => $frameType, 'flags' => $frameFlags, 'id' => $streamId] = \unpack('Nlength/ctype/cflags/Nid', "\x00" . $frameHeader); - $streamId &= 0x7fffffff; - $frameBuffer = $frameLength === 0 ? '' : (yield from $this->consume($frameLength)); - $this->receivedFrameCount++; - \assert(self::logDebugFrame('recv', $frameType, $frameFlags, $streamId, $frameLength)); - try { - // Do we want to allow increasing the maximum frame size? - if ($frameLength > self::DEFAULT_MAX_FRAME_SIZE) { - throw new Http2ConnectionException("Frame size limit exceeded", self::FRAME_SIZE_ERROR); - } - if ($this->continuationExpected && $frameType !== self::CONTINUATION) { - throw new Http2ConnectionException("Expected continuation frame", self::PROTOCOL_ERROR); - } - switch ($frameType) { - case self::DATA: - $this->parseDataFrame($frameBuffer, $frameLength, $frameFlags, $streamId); - break; - case self::PUSH_PROMISE: - $this->parsePushPromise($frameBuffer, $frameLength, $frameFlags, $streamId); - break; - case self::HEADERS: - $this->parseHeaders($frameBuffer, $frameLength, $frameFlags, $streamId); - break; - case self::PRIORITY: - $this->parsePriorityFrame($frameBuffer, $frameLength, $streamId); - break; - case self::RST_STREAM: - $this->parseStreamReset($frameBuffer, $frameLength, $streamId); - break; - case self::SETTINGS: - $this->parseSettings($frameBuffer, $frameLength, $frameFlags, $streamId); - break; - case self::PING: - $this->parsePing($frameBuffer, $frameLength, $frameFlags, $streamId); - break; - case self::GOAWAY: - $this->parseGoAway($frameBuffer, $frameLength, $streamId); - break; - case self::WINDOW_UPDATE: - $this->parseWindowUpdate($frameBuffer, $frameLength, $streamId); - break; - case self::CONTINUATION: - $this->parseContinuation($frameBuffer, $frameFlags, $streamId); - break; - default: - // Ignore and discard unknown frame per spec - break; - } - } catch (Http2StreamException $exception) { - $this->handler->handleStreamException($exception); - } catch (Http2ConnectionException $exception) { - $this->handler->handleConnectionException($exception); - throw $exception; - } - } - } - private function consume(int $bytes) : \Generator - { - $bufferEnd = $this->bufferOffset + $bytes; - while (\strlen($this->buffer) < $bufferEnd) { - $this->buffer .= yield; - } - $consumed = \substr($this->buffer, $this->bufferOffset, $bytes); - if ($bufferEnd > 2048) { - $this->buffer = \substr($this->buffer, $bufferEnd); - $this->bufferOffset = 0; - } else { - $this->bufferOffset += $bytes; - } - $this->receivedByteCount += $bytes; - return $consumed; - } - private function parseDataFrame(string $frameBuffer, int $frameLength, int $frameFlags, int $streamId) : void - { - $isPadded = $frameFlags & self::PADDED; - $headerLength = $isPadded ? 1 : 0; - if ($frameLength < $headerLength) { - $this->throwInvalidFrameSizeError(); - } - $header = $headerLength === 0 ? '' : \substr($frameBuffer, 0, $headerLength); - $padding = $isPadded ? \ord($header[0]) : 0; - if ($streamId === 0) { - $this->throwInvalidZeroStreamIdError(); - } - if ($frameLength - $headerLength - $padding < 0) { - $this->throwInvalidPaddingError(); - } - $data = \substr($frameBuffer, $headerLength, $frameLength - $headerLength - $padding); - $this->handler->handleData($streamId, $data); - if ($frameFlags & self::END_STREAM) { - $this->handler->handleStreamEnd($streamId); - } - } - /** @see https://http2.github.io/http2-spec/#rfc.section.6.6 */ - private function parsePushPromise(string $frameBuffer, int $frameLength, int $frameFlags, int $streamId) : void - { - $isPadded = $frameFlags & self::PADDED; - $headerLength = $isPadded ? 5 : 4; - if ($frameLength < $headerLength) { - $this->throwInvalidFrameSizeError(); - } - $header = \substr($frameBuffer, 0, $headerLength); - $padding = $isPadded ? \ord($header[0]) : 0; - $pushId = \unpack("N", $header)[1] & 0x7fffffff; - if ($frameLength - $headerLength - $padding < 0) { - $this->throwInvalidPaddingError(); - } - $this->headerFrameType = self::PUSH_PROMISE; - $this->pushHeaderBlockFragment($pushId, \substr($frameBuffer, $headerLength, $frameLength - $headerLength - $padding)); - if ($frameFlags & self::END_HEADERS) { - $this->continuationExpected = \false; - [$pseudo, $headers] = $this->parseHeaderBuffer(); - $this->handler->handlePushPromise($streamId, $pushId, $pseudo, $headers); - } else { - $this->continuationExpected = \true; - } - if ($frameFlags & self::END_STREAM) { - $this->handler->handleStreamEnd($streamId); - } - } - private function parseHeaderBuffer() : array - { - if ($this->headerStream === 0) { - throw new Http2ConnectionException('Invalid stream ID 0 for header block', self::PROTOCOL_ERROR); - } - if ($this->headerBuffer === '') { - throw new Http2StreamException('Invalid empty header section', $this->headerStream, self::PROTOCOL_ERROR); - } - $decoded = $this->hpack->decode($this->headerBuffer, $this->headerSizeLimit); - if ($decoded === null) { - throw new Http2ConnectionException("Compression error in headers", self::COMPRESSION_ERROR); - } - $headers = []; - $pseudo = []; - foreach ($decoded as [$name, $value]) { - if (!\preg_match(self::HEADER_NAME_REGEX, $name)) { - throw new Http2StreamException("Invalid header field name", $this->headerStream, self::PROTOCOL_ERROR); - } - if ($name[0] === ':') { - if (!empty($headers)) { - throw new Http2ConnectionException("Pseudo header after other headers", self::PROTOCOL_ERROR); - } - if (isset($pseudo[$name])) { - throw new Http2ConnectionException("Repeat pseudo header", self::PROTOCOL_ERROR); - } - $pseudo[$name] = $value; - continue; - } - $headers[$name][] = $value; - } - $this->headerBuffer = ''; - $this->headerStream = 0; - return [$pseudo, $headers]; - } - private function pushHeaderBlockFragment(int $streamId, string $buffer) : void - { - if ($this->headerStream !== 0 && $this->headerStream !== $streamId) { - throw new Http2ConnectionException("Expected CONTINUATION frame for stream ID " . $this->headerStream, self::PROTOCOL_ERROR); - } - $this->headerStream = $streamId; - $this->headerBuffer .= $buffer; - } - /** @see https://http2.github.io/http2-spec/#HEADERS */ - private function parseHeaders(string $frameBuffer, int $frameLength, int $frameFlags, int $streamId) : void - { - if ($streamId === 0) { - $this->throwInvalidZeroStreamIdError(); - } - $headerLength = 0; - $isPadded = $frameFlags & self::PADDED; - $isPriority = $frameFlags & self::PRIORITY_FLAG; - if ($isPadded) { - $headerLength++; - } - if ($isPriority) { - $headerLength += 5; - } - if ($frameLength < $headerLength) { - $this->throwInvalidFrameSizeError(); - } - $header = \substr($frameBuffer, 0, $headerLength); - $padding = $isPadded ? \ord($header[0]) : 0; - if ($isPriority) { - ['parent' => $parent, 'weight' => $weight] = \unpack("Nparent/cweight", $header, $isPadded ? 1 : 0); - $parent &= 0x7fffffff; - if ($parent === $streamId) { - $this->throwInvalidRecursiveDependency($streamId); - } - $this->handler->handlePriority($streamId, $parent, $weight + 1); - } - if ($frameLength - $headerLength - $padding < 0) { - $this->throwInvalidPaddingError(); - } - $this->headerFrameType = self::HEADERS; - $this->pushHeaderBlockFragment($streamId, \substr($frameBuffer, $headerLength, $frameLength - $headerLength - $padding)); - $ended = $frameFlags & self::END_STREAM; - if ($frameFlags & self::END_HEADERS) { - $this->continuationExpected = \false; - $headersTooLarge = \strlen($this->headerBuffer) > $this->headerSizeLimit; - [$pseudo, $headers] = $this->parseHeaderBuffer(); - // This must happen after the parsing, otherwise we loose the connection state and must close the whole - // connection, which is not what we want here… - if ($headersTooLarge) { - throw new Http2StreamException("Headers exceed maximum configured size of {$this->headerSizeLimit} bytes", $streamId, self::ENHANCE_YOUR_CALM); - } - $this->handler->handleHeaders($streamId, $pseudo, $headers, $ended); - } else { - $this->continuationExpected = \true; - } - if ($ended) { - $this->handler->handleStreamEnd($streamId); - } - } - private function parsePriorityFrame(string $frameBuffer, int $frameLength, int $streamId) : void - { - if ($frameLength !== 5) { - $this->throwInvalidFrameSizeError(); - } - ['parent' => $parent, 'weight' => $weight] = \unpack("Nparent/cweight", $frameBuffer); - if ($exclusive = $parent & 0x80000000) { - $parent &= 0x7fffffff; - } - if ($streamId === 0) { - $this->throwInvalidZeroStreamIdError(); - } - if ($parent === $streamId) { - $this->throwInvalidRecursiveDependency($streamId); - } - $this->handler->handlePriority($streamId, $parent, $weight + 1); - } - private function parseStreamReset(string $frameBuffer, int $frameLength, int $streamId) : void - { - if ($frameLength !== 4) { - $this->throwInvalidFrameSizeError(); - } - if ($streamId === 0) { - $this->throwInvalidZeroStreamIdError(); - } - $errorCode = \unpack('N', $frameBuffer)[1]; - $this->handler->handleStreamReset($streamId, $errorCode); - } - private function parseSettings(string $frameBuffer, int $frameLength, int $frameFlags, int $streamId) : void - { - if ($streamId !== 0) { - $this->throwInvalidNonZeroStreamIdError(); - } - if ($frameFlags & self::ACK) { - if ($frameLength) { - $this->throwInvalidFrameSizeError(); - } - return; - // Got ACK, nothing to do - } - if ($frameLength % 6 !== 0) { - $this->throwInvalidFrameSizeError(); - } - if ($frameLength > 60) { - // Even with room for a few future options, sending that a big SETTINGS frame is just about - // wasting our processing time. We declare this a protocol error. - throw new Http2ConnectionException("Excessive SETTINGS frame", self::PROTOCOL_ERROR); - } - $settings = []; - while ($frameLength > 0) { - ['key' => $key, 'value' => $value] = \unpack("nkey/Nvalue", $frameBuffer); - if ($value < 0) { - throw new Http2ConnectionException("Invalid setting: {$value}", self::PROTOCOL_ERROR); - } - $settings[$key] = $value; - $frameBuffer = \substr($frameBuffer, 6); - $frameLength -= 6; - } - $this->handler->handleSettings($settings); - } - /** @see https://http2.github.io/http2-spec/#rfc.section.6.7 */ - private function parsePing(string $frameBuffer, int $frameLength, int $frameFlags, int $streamId) : void - { - if ($frameLength !== 8) { - $this->throwInvalidFrameSizeError(); - } - if ($streamId !== 0) { - $this->throwInvalidNonZeroStreamIdError(); - } - if ($frameFlags & self::ACK) { - $this->handler->handlePong($frameBuffer); - } else { - $this->handler->handlePing($frameBuffer); - } - } - /** @see https://http2.github.io/http2-spec/#rfc.section.6.8 */ - private function parseGoAway(string $frameBuffer, int $frameLength, int $streamId) : void - { - if ($frameLength < 8) { - $this->throwInvalidFrameSizeError(); - } - if ($streamId !== 0) { - $this->throwInvalidNonZeroStreamIdError(); - } - ['last' => $lastId, 'error' => $error] = \unpack("Nlast/Nerror", $frameBuffer); - $this->handler->handleShutdown($lastId & 0x7fffffff, $error); - } - /** @see https://http2.github.io/http2-spec/#rfc.section.6.9 */ - private function parseWindowUpdate(string $frameBuffer, int $frameLength, int $streamId) : void - { - if ($frameLength !== 4) { - $this->throwInvalidFrameSizeError(); - } - $windowSize = \unpack('N', $frameBuffer)[1]; - if ($windowSize === 0) { - if ($streamId) { - throw new Http2StreamException("Invalid zero window update value", $streamId, self::PROTOCOL_ERROR); - } - throw new Http2ConnectionException("Invalid zero window update value", self::PROTOCOL_ERROR); - } - if ($streamId) { - $this->handler->handleStreamWindowIncrement($streamId, $windowSize); - } else { - $this->handler->handleConnectionWindowIncrement($windowSize); - } - } - /** @see https://http2.github.io/http2-spec/#rfc.section.6.10 */ - private function parseContinuation(string $frameBuffer, int $frameFlags, int $streamId) : void - { - if ($streamId !== $this->headerStream) { - throw new Http2ConnectionException("Invalid CONTINUATION frame stream ID", self::PROTOCOL_ERROR); - } - if ($this->headerBuffer === '') { - throw new Http2ConnectionException("Unexpected CONTINUATION frame for stream ID " . $this->headerStream, self::PROTOCOL_ERROR); - } - $this->pushHeaderBlockFragment($streamId, $frameBuffer); - $ended = $frameFlags & self::END_STREAM; - if ($frameFlags & self::END_HEADERS) { - $this->continuationExpected = \false; - $isPush = $this->headerFrameType === self::PUSH_PROMISE; - $pushId = $this->headerStream; - [$pseudo, $headers] = $this->parseHeaderBuffer(); - if ($isPush) { - $this->handler->handlePushPromise($streamId, $pushId, $pseudo, $headers); - } else { - $this->handler->handleHeaders($streamId, $pseudo, $headers, $ended); - } - } - if ($ended) { - $this->handler->handleStreamEnd($streamId); - } - } - private function throwInvalidFrameSizeError() : void - { - throw new Http2ConnectionException("Invalid frame length", self::PROTOCOL_ERROR); - } - private function throwInvalidRecursiveDependency(int $streamId) : void - { - throw new Http2ConnectionException("Invalid recursive dependency for stream {$streamId}", self::PROTOCOL_ERROR); - } - private function throwInvalidPaddingError() : void - { - throw new Http2ConnectionException("Padding greater than length", self::PROTOCOL_ERROR); - } - private function throwInvalidZeroStreamIdError() : void - { - throw new Http2ConnectionException("Invalid zero stream ID", self::PROTOCOL_ERROR); - } - private function throwInvalidNonZeroStreamIdError() : void - { - throw new Http2ConnectionException("Invalid non-zero stream ID", self::PROTOCOL_ERROR); - } -} diff --git a/dependencies/amphp/http/src/Http2/Http2Processor.php b/dependencies/amphp/http/src/Http2/Http2Processor.php deleted file mode 100644 index 12093e9..0000000 --- a/dependencies/amphp/http/src/Http2/Http2Processor.php +++ /dev/null @@ -1,21 +0,0 @@ -streamId = $streamId; - } - public function getStreamId() : int - { - return $this->streamId; - } -} diff --git a/dependencies/amphp/http/src/InvalidHeaderException.php b/dependencies/amphp/http/src/InvalidHeaderException.php deleted file mode 100644 index e3d9970..0000000 --- a/dependencies/amphp/http/src/InvalidHeaderException.php +++ /dev/null @@ -1,16 +0,0 @@ - 'accept', 'accept' => 'accept', 'Accept-Encoding' => 'accept-encoding', 'accept-encoding' => 'accept-encoding', 'Accept-Language' => 'accept-language', 'accept-language' => 'accept-language', 'Connection' => 'connection', 'connection' => 'connection', 'Cookie' => 'cookie', 'cookie' => 'cookie', 'Host' => 'host', 'host' => 'host', 'Sec-Fetch-Dest' => 'sec-fetch-dest', 'sec-fetch-dest' => 'sec-fetch-dest', 'Sec-Fetch-Mode' => 'sec-fetch-mode', 'sec-fetch-mode' => 'sec-fetch-mode', 'Sec-Fetch-Site' => 'sec-fetch-site', 'sec-fetch-site' => 'sec-fetch-site', 'Sec-Fetch-User' => 'sec-fetch-user', 'sec-fetch-user' => 'sec-fetch-user', 'Upgrade-Insecure-Requests' => 'upgrade-insecure-requests', 'upgrade-insecure-requests' => 'upgrade-insecure-requests', 'User-Agent' => 'user-agent', 'user-agent' => 'user-agent']; - /** @var string[][] */ - private $headers = []; - /** @var string[][] */ - private $headerCase = []; - /** - * Returns the headers as a string-indexed array of arrays of strings or an empty array if no headers - * have been set. - * - * @return string[][] - */ - public function getHeaders() : array - { - return $this->headers; - } - /** - * Returns the headers as list of [field, name] pairs in the original casing provided by the application or server. - */ - public final function getRawHeaders() : array - { - $headers = []; - foreach ($this->headers as $lcName => $values) { - $size = \count($values); - for ($i = 0; $i < $size; $i++) { - $headers[] = [$this->headerCase[$lcName][$i], $values[$i]]; - } - } - return $headers; - } - /** - * Returns the array of values for the given header or an empty array if the header does not exist. - * - * @return string[] - */ - public function getHeaderArray(string $name) : array - { - return $this->headers[self::HEADER_LOWER[$name] ?? \strtolower($name)] ?? []; - } - /** - * Returns the value of the given header. If multiple headers are present for the named header, only the first - * header value will be returned. Use getHeaderArray() to return an array of all values for the particular header. - * Returns null if the header does not exist. - * - * @return string|null - */ - public function getHeader(string $name) - { - return $this->headers[self::HEADER_LOWER[$name] ?? \strtolower($name)][0] ?? null; - } - /** - * Sets the headers from the given array. - * - * @param string[]|string[][] $headers - */ - protected function setHeaders(array $headers) - { - // Ensure this is an atomic operation, either all headers are set or none. - $before = $this->headers; - $beforeCase = $this->headerCase; - try { - foreach ($headers as $name => $value) { - $this->setHeader($name, $value); - } - } catch (\Throwable $e) { - $this->headers = $before; - $this->headerCase = $beforeCase; - throw $e; - } - } - /** - * Sets the named header to the given value. - * - * @param string|string[] $value - * - * @throws \Error If the header name or value is invalid. - */ - protected function setHeader(string $name, $value) - { - \assert($this->isNameValid($name), "Invalid header name"); - if (\is_array($value)) { - if (!$value) { - $this->removeHeader($name); - return; - } - $value = \array_values(\array_map("strval", $value)); - } else { - $value = [(string) $value]; - } - \assert($this->isValueValid($value), "Invalid header value"); - $lcName = self::HEADER_LOWER[$name] ?? \strtolower($name); - $this->headers[$lcName] = $value; - $this->headerCase[$lcName] = []; - foreach ($value as $_) { - $this->headerCase[$lcName][] = $name; - } - } - /** - * Adds the value to the named header, or creates the header with the given value if it did not exist. - * - * @param string|string[] $value - * - * @throws \Error If the header name or value is invalid. - */ - protected function addHeader(string $name, $value) - { - \assert($this->isNameValid($name), "Invalid header name"); - if (\is_array($value)) { - if (!$value) { - return; - } - $value = \array_values(\array_map("strval", $value)); - } else { - $value = [(string) $value]; - } - \assert($this->isValueValid($value), "Invalid header value"); - $lcName = self::HEADER_LOWER[$name] ?? \strtolower($name); - if (isset($this->headers[$lcName])) { - $this->headers[$lcName] = \array_merge($this->headers[$lcName], $value); - foreach ($value as $_) { - $this->headerCase[$lcName][] = $name; - } - } else { - $this->headers[$lcName] = $value; - foreach ($value as $_) { - $this->headerCase[$lcName][] = $name; - } - } - } - /** - * Removes the given header if it exists. - */ - protected function removeHeader(string $name) - { - $lcName = self::HEADER_LOWER[$name] ?? \strtolower($name); - unset($this->headers[$lcName], $this->headerCase[$lcName]); - } - /** - * Checks if given header exists. - */ - public function hasHeader(string $name) : bool - { - return isset($this->headers[self::HEADER_LOWER[$name] ?? \strtolower($name)]); - } - private function isNameValid(string $name) : bool - { - return (bool) \preg_match('/^[A-Za-z0-9`~!#$%^&_|\'\\-*+.]+$/', $name); - } - /** - * Determines if the given value is a valid header value. - * - * @param string[] $values - * - * @throws \Error If the given value cannot be converted to a string and is not an array of values that can be - * converted to strings. - */ - private function isValueValid(array $values) : bool - { - foreach ($values as $value) { - if (\preg_match("/[^\t\r\n -~\x80-\xfe]|\r\n/", $value)) { - return \false; - } - } - return \true; - } -} diff --git a/dependencies/amphp/http/src/Rfc7230.php b/dependencies/amphp/http/src/Rfc7230.php deleted file mode 100644 index f9e6d68..0000000 --- a/dependencies/amphp/http/src/Rfc7230.php +++ /dev/null @@ -1,121 +0,0 @@ -@,;:\\\"/[\\]?={}\x01- ]++)\$)"; - public const HEADER_VALUE_REGEX = "(^[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\$)"; - public const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r\n)m"; - public const HEADER_FOLD_REGEX = "(\r\n[ \t]++)"; - /** - * Parses headers according to RFC 7230 and 2616. - * - * Allows empty header values, as HTTP/1.0 allows that. - * - * @return array Associative array mapping header names to arrays of values. - * - * @throws InvalidHeaderException If invalid headers have been passed. - */ - public static function parseHeaders(string $rawHeaders) : array - { - $headers = []; - foreach (self::parseRawHeaders($rawHeaders) as $header) { - // Unfortunately, we can't avoid the \strtolower() calls due to \array_change_key_case() behavior - // when equal headers are present with different casing, e.g. 'set-cookie' and 'Set-Cookie'. - // Accessing headers directly instead of using foreach (... as list(...)) is slightly faster. - $headers[\strtolower($header[0])][] = $header[1]; - } - return $headers; - } - /** - * Parses headers according to RFC 7230 and 2616. - * - * Allows empty header values, as HTTP/1.0 allows that. - * - * @return array List of [field, value] header pairs. - * - * @throws InvalidHeaderException If invalid headers have been passed. - */ - public static function parseRawHeaders(string $rawHeaders) : array - { - // Ensure that the last line also ends with a newline, this is important. - \assert(\substr($rawHeaders, -2) === "\r\n", "Argument 1 must end with CRLF: " . \bin2hex($rawHeaders)); - /** @var array[] $matches */ - $count = \preg_match_all(self::HEADER_REGEX, $rawHeaders, $matches, \PREG_SET_ORDER); - // If these aren't the same, then one line didn't match and there's an invalid header. - if ($count !== \substr_count($rawHeaders, "\n")) { - // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 - if (\preg_match(self::HEADER_FOLD_REGEX, $rawHeaders)) { - throw new InvalidHeaderException("Invalid header syntax: Obsolete line folding"); - } - throw new InvalidHeaderException("Invalid header syntax"); - } - $headers = []; - foreach ($matches as $match) { - // We avoid a call to \trim() here due to the regex. - // Accessing matches directly instead of using foreach (... as list(...)) is slightly faster. - $headers[] = [$match[1], $match[2]]; - } - return $headers; - } - /** - * Format headers in to their on-the-wire format. - * - * Headers are always validated syntactically. This protects against response splitting and header injection - * attacks. - * - * @param array $headers Headers in a format as returned by {@see parseHeaders()}. - * - * @return string Formatted headers. - * - * @throws InvalidHeaderException If header names or values are invalid. - */ - public static function formatHeaders(array $headers) : string - { - $headerList = []; - foreach ($headers as $name => $values) { - foreach ($values as $value) { - // PHP casts integer-like keys to integers - $headerList[] = [(string) $name, $value]; - } - } - return self::formatRawHeaders($headerList); - } - /** - * Format headers in to their on-the-wire HTTP/1 format. - * - * Headers are always validated syntactically. This protects against response splitting and header injection - * attacks. - * - * @param array $headers List of headers in [field, value] format as returned by {@see Message::getRawHeaders()}. - * - * @return string Formatted headers. - * - * @throws InvalidHeaderException If header names or values are invalid. - */ - public static function formatRawHeaders(array $headers) : string - { - $buffer = ""; - $lines = 0; - foreach ($headers as [$name, $value]) { - // Ignore any HTTP/2 pseudo headers - if (($name[0] ?? '') === ':') { - continue; - } - $buffer .= "{$name}: {$value}\r\n"; - $lines++; - } - $count = \preg_match_all(self::HEADER_REGEX, $buffer); - if ($lines !== $count || $lines !== \substr_count($buffer, "\n")) { - throw new InvalidHeaderException("Invalid headers"); - } - return $buffer; - } -} diff --git a/dependencies/amphp/http/src/Status.php b/dependencies/amphp/http/src/Status.php deleted file mode 100644 index 8eca923..0000000 --- a/dependencies/amphp/http/src/Status.php +++ /dev/null @@ -1,80 +0,0 @@ - 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 103 => 'Early Hints', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', 208 => 'Already Reported', 226 => 'IM Used', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Payload Too Large', 414 => 'URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Range Not Satisfiable', 417 => 'Expectation Failed', 421 => 'Misdirected Request', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required'][$code] ?? ''; - } -} diff --git a/dependencies/amphp/http/src/functions.php b/dependencies/amphp/http/src/functions.php deleted file mode 100644 index e6820d8..0000000 --- a/dependencies/amphp/http/src/functions.php +++ /dev/null @@ -1,74 +0,0 @@ -getHeaderArray($headerName)); - if ($header === '') { - return []; - } - \preg_match_all('(([^"=,]+)(?:=(?:"((?:[^\\\\"]|\\\\.)*)"|([^,"]*)))?,?\\s*)', $header, $matches, \PREG_SET_ORDER); - $totalMatchedLength = 0; - $pairs = []; - foreach ($matches as $match) { - $totalMatchedLength += \strlen($match[0]); - $key = \trim($match[1]); - $value = ($match[2] ?? '') . \trim($match[3] ?? ''); - if (($match[2] ?? '') !== '') { - // decode escaped characters - $value = \preg_replace('(\\\\(.))', '\\1', $value); - } - $pairs[] = [$key, $value]; - } - if ($totalMatchedLength !== \strlen($header)) { - return null; - // parse error - } - return $pairs; -} -/** - * @param array $pairs Output of {@code parseFieldValueComponents}. Keys are handled case-insensitively. - * - * @return array|null Map of keys to values or {@code null} if incompatible duplicates are found. - */ -function createFieldValueComponentMap(?array $pairs) : ?array -{ - if ($pairs === null) { - return null; - } - $map = []; - foreach ($pairs as $pair) { - \assert(\count($pair) === 2); - \assert(\is_string($pair[0])); - \assert(\is_string($pair[1])); - } - foreach ($pairs as [$key, $value]) { - $key = \strtolower($key); - if (isset($map[$key]) && $map[$key] !== $value) { - return null; - // incompatible duplicates - } - $map[$key] = $value; - } - return $map; -} -/** - * Format timestamp in seconds as an HTTP date header. - * - * @param int|null $timestamp Timestamp to format, current time if `null`. - * - * @return string Formatted date header value. - */ -function formatDateHeader(?int $timestamp = null) : string -{ - static $cachedTimestamp, $cachedFormattedDate; - $timestamp = $timestamp ?? \time(); - if ($cachedTimestamp === $timestamp) { - return $cachedFormattedDate; - } - return $cachedFormattedDate = \gmdate("D, d M Y H:i:s", $cachedTimestamp = $timestamp) . " GMT"; -} diff --git a/dependencies/amphp/parser/psalm.xml b/dependencies/amphp/parser/psalm.xml deleted file mode 100644 index 1377868..0000000 --- a/dependencies/amphp/parser/psalm.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/amphp/parser/src/InvalidDelimiterError.php b/dependencies/amphp/parser/src/InvalidDelimiterError.php deleted file mode 100644 index 11aaa78..0000000 --- a/dependencies/amphp/parser/src/InvalidDelimiterError.php +++ /dev/null @@ -1,23 +0,0 @@ -current(); - $prefix .= \sprintf("; %s yielded at key %s", \is_object($yielded) ? \get_class($yielded) : \gettype($yielded), \var_export($generator->key(), \true)); - if (!$generator->valid()) { - parent::__construct($prefix, 0, $previous); - return; - } - $reflGen = new \ReflectionGenerator($generator); - $exeGen = $reflGen->getExecutingGenerator(); - if ($isSubgenerator = $exeGen !== $generator) { - $reflGen = new \ReflectionGenerator($exeGen); - } - parent::__construct(\sprintf("%s on line %s in %s", $prefix, $reflGen->getExecutingLine(), $reflGen->getExecutingFile()), 0, $previous); - } -} diff --git a/dependencies/amphp/parser/src/Parser.php b/dependencies/amphp/parser/src/Parser.php deleted file mode 100644 index f442200..0000000 --- a/dependencies/amphp/parser/src/Parser.php +++ /dev/null @@ -1,122 +0,0 @@ -|null */ - private ?\Generator $generator; - /** @var list */ - private array $buffers = []; - private int $bufferLength = 0; - /** @var int|string|null */ - private $delimiter; - /** - * @param \Generator $generator - * - * @throws InvalidDelimiterError If the generator yields an invalid delimiter. - * @throws \Throwable If the generator throws. - */ - public function __construct(\Generator $generator) - { - $this->generator = $generator; - $this->delimiter = $this->filterDelimiter($this->generator->current()); - if (!$this->generator->valid()) { - $this->generator = null; - } - } - /** - * Cancels the generator parser and returns any remaining data in the internal buffer. Writing data after calling - * this method will result in an error. - */ - public final function cancel() : string - { - $buffer = \implode($this->buffers); - $this->buffers = []; - $this->generator = null; - return $buffer; - } - /** - * @return bool True if the parser can still receive more data to parse, false if it has ended and calling push - * will throw an exception. - */ - public final function isValid() : bool - { - return $this->generator !== null; - } - /** - * Adds data to the internal buffer and tries to continue parsing. - * - * @param string $data Data to append to the internal buffer. - * - * @throws InvalidDelimiterError If the generator yields an invalid delimiter. - * @throws \Error If parsing has already been cancelled. - * @throws \Throwable If the generator throws. - */ - public final function push(string $data) : void - { - if ($this->generator === null) { - throw new \Error("The parser is no longer writable"); - } - $length = \strlen($data); - if ($length === 0) { - return; - } - $this->bufferLength += $length; - try { - do { - if (\is_int($this->delimiter) && $this->bufferLength < $this->delimiter) { - return; - } - if (!empty($this->buffers)) { - $this->buffers[] = $data; - $data = \implode($this->buffers); - $this->buffers = []; - } - if (\is_int($this->delimiter)) { - $cutAt = $retainFrom = $this->delimiter; - } elseif (\is_string($this->delimiter)) { - if (($cutAt = \strpos($data, $this->delimiter)) === \false) { - return; - } - $retainFrom = $cutAt + \strlen($this->delimiter); - } else { - $cutAt = $retainFrom = $this->bufferLength; - } - if ($this->bufferLength > $cutAt) { - $send = \substr($data, 0, $cutAt); - $data = \substr($data, $retainFrom); - } else { - $send = $data; - $data = ''; - } - $this->bufferLength -= $retainFrom; - $this->delimiter = $this->filterDelimiter($this->generator->send($send)); - if (!$this->generator->valid()) { - $this->generator = null; - return; - } - } while ($this->bufferLength); - } catch (\Throwable $exception) { - $this->generator = null; - throw $exception; - } finally { - if (\strlen($data)) { - $this->buffers[] = $data; - } - } - } - /** - * @param mixed $delimiter Value yielded from Generator. - * @return int|string|null - */ - private function filterDelimiter($delimiter) - { - \assert($this->generator instanceof \Generator, "Invalid parser state"); - if ($delimiter !== null && (!\is_int($delimiter) || $delimiter <= 0) && (!\is_string($delimiter) || !\strlen($delimiter))) { - throw new InvalidDelimiterError($this->generator, \sprintf("Invalid value yielded: Expected NULL, an int greater than 0, or a non-empty string; %s given", \is_object($delimiter) ? \sprintf("instance of %s", \get_class($delimiter)) : \gettype($delimiter))); - } - return $delimiter; - } -} diff --git a/dependencies/amphp/process/lib/Internal/Posix/Handle.php b/dependencies/amphp/process/lib/Internal/Posix/Handle.php deleted file mode 100644 index 233dfad..0000000 --- a/dependencies/amphp/process/lib/Internal/Posix/Handle.php +++ /dev/null @@ -1,48 +0,0 @@ -pidDeferred = new Deferred(); - $this->joinDeferred = new Deferred(); - $this->originalParentPid = \getmypid(); - } - /** @var Deferred */ - public $joinDeferred; - /** @var resource */ - public $proc; - /** @var resource */ - public $extraDataPipe; - /** @var string */ - public $extraDataPipeWatcher; - /** @var string */ - public $extraDataPipeStartWatcher; - /** @var int */ - public $originalParentPid; - /** @var int */ - public $shellPid; - public function wait() - { - if ($this->shellPid === 0) { - return; - } - $pid = $this->shellPid; - $this->shellPid = 0; - Loop::unreference(Loop::repeat(100, static function (string $watcherId) use($pid) { - if (!\extension_loaded('pcntl') || \pcntl_waitpid($pid, $status, \WNOHANG) !== 0) { - Loop::cancel($watcherId); - } - })); - } - public function __destruct() - { - $this->wait(); - } -} diff --git a/dependencies/amphp/process/lib/Internal/Posix/Runner.php b/dependencies/amphp/process/lib/Internal/Posix/Runner.php deleted file mode 100644 index 6f16473..0000000 --- a/dependencies/amphp/process/lib/Internal/Posix/Runner.php +++ /dev/null @@ -1,207 +0,0 @@ -extraDataPipeWatcher = null; - $handle->status = ProcessStatus::ENDED; - if (!\is_resource($stream) || \feof($stream)) { - $handle->joinDeferred->fail(new ProcessException("Process ended unexpectedly")); - } else { - $handle->joinDeferred->resolve((int) \rtrim(@\stream_get_contents($stream))); - } - $handle->wait(); - } - public static function onProcessStartExtraDataPipeReadable($watcher, $stream, $data) - { - Loop::cancel($watcher); - $pid = \rtrim(@\fgets($stream)); - /** @var $deferreds Deferred[] */ - list($handle, $pipes, $deferreds) = $data; - if (!$pid || !\is_numeric($pid)) { - $error = new ProcessException("Could not determine PID"); - $handle->pidDeferred->fail($error); - foreach ($deferreds as $deferred) { - /** @var $deferred Deferred */ - $deferred->fail($error); - } - if ($handle->status < ProcessStatus::ENDED) { - $handle->status = ProcessStatus::ENDED; - $handle->joinDeferred->fail($error); - } - return; - } - $handle->status = ProcessStatus::RUNNING; - $handle->pidDeferred->resolve((int) $pid); - $deferreds[0]->resolve($pipes[0]); - $deferreds[1]->resolve($pipes[1]); - $deferreds[2]->resolve($pipes[2]); - if ($handle->extraDataPipeWatcher !== null) { - Loop::enable($handle->extraDataPipeWatcher); - } - } - /** @inheritdoc */ - public function start(string $command, string $cwd = null, array $env = [], array $options = []) : ProcessHandle - { - $command = \sprintf('{ (%s) <&3 3<&- 3>/dev/null & } 3<&0; trap "" INT TERM QUIT HUP;' . 'pid=$!; echo $pid >&3; wait $pid; RC=$?; echo $RC >&3; exit $RC', $command); - $handle = new Handle(); - $handle->proc = @\proc_open($command, $this->generateFds(), $pipes, $cwd ?: null, $env ?: null, $options); - if (!\is_resource($handle->proc)) { - $message = "Could not start process"; - if ($error = \error_get_last()) { - $message .= \sprintf(" Errno: %d; %s", $error["type"], $error["message"]); - } - throw new ProcessException($message); - } - $status = \proc_get_status($handle->proc); - if (!$status) { - \proc_close($handle->proc); - throw new ProcessException("Could not get process status"); - } - $handle->shellPid = \proc_get_status($handle->proc)['pid']; - $stdinDeferred = new Deferred(); - $handle->stdin = new ProcessOutputStream($stdinDeferred->promise()); - $stdoutDeferred = new Deferred(); - $handle->stdout = new ProcessInputStream($stdoutDeferred->promise()); - $stderrDeferred = new Deferred(); - $handle->stderr = new ProcessInputStream($stderrDeferred->promise()); - $handle->extraDataPipe = $pipes[3]; - \stream_set_blocking($pipes[3], \false); - $handle->extraDataPipeStartWatcher = Loop::onReadable($pipes[3], [self::class, 'onProcessStartExtraDataPipeReadable'], [$handle, [new ResourceOutputStream($pipes[0]), new ResourceInputStream($pipes[1]), new ResourceInputStream($pipes[2])], [$stdinDeferred, $stdoutDeferred, $stderrDeferred]]); - $handle->extraDataPipeWatcher = Loop::onReadable($pipes[3], [self::class, 'onProcessEndExtraDataPipeReadable'], $handle); - Loop::unreference($handle->extraDataPipeWatcher); - Loop::disable($handle->extraDataPipeWatcher); - return $handle; - } - private function generateFds() : array - { - if (self::$fdPath === null) { - self::$fdPath = \file_exists("/dev/fd") ? "/dev/fd" : "/proc/self/fd"; - } - $fdList = @\scandir(self::$fdPath, \SCANDIR_SORT_NONE); - if ($fdList === \false) { - throw new ProcessException("Unable to list open file descriptors"); - } - $fdList = \array_filter($fdList, function (string $path) : bool { - return $path !== "." && $path !== ".."; - }); - $fds = []; - foreach ($fdList as $id) { - $fds[(int) $id] = ["file", "/dev/null", "r"]; - } - return self::FD_SPEC + $fds; - } - /** @inheritdoc */ - public function join(ProcessHandle $handle) : Promise - { - /** @var Handle $handle */ - if ($handle->extraDataPipeWatcher !== null) { - Loop::reference($handle->extraDataPipeWatcher); - } - return $handle->joinDeferred->promise(); - } - /** @inheritdoc */ - public function kill(ProcessHandle $handle) - { - /** @var Handle $handle */ - if ($handle->extraDataPipeWatcher !== null) { - Loop::cancel($handle->extraDataPipeWatcher); - $handle->extraDataPipeWatcher = null; - } - /** @var Handle $handle */ - if ($handle->extraDataPipeStartWatcher !== null) { - Loop::cancel($handle->extraDataPipeStartWatcher); - $handle->extraDataPipeStartWatcher = null; - } - if (!\proc_terminate($handle->proc, 9)) { - // Forcefully kill the process using SIGKILL. - throw new ProcessException("Terminating process failed"); - } - $handle->pidDeferred->promise()->onResolve(function ($error, $pid) { - // The function should not call posix_kill() if $pid is null (i.e., there was an error starting the process). - if ($error) { - return; - } - // ignore errors because process not always detached - @\posix_kill($pid, 9); - }); - if ($handle->status < ProcessStatus::ENDED) { - $handle->status = ProcessStatus::ENDED; - $handle->joinDeferred->fail(new ProcessException("The process was killed")); - } - $this->free($handle); - } - /** @inheritdoc */ - public function signal(ProcessHandle $handle, int $signo) - { - $handle->pidDeferred->promise()->onResolve(function ($error, $pid) use($signo) { - if ($error) { - return; - } - @\posix_kill($pid, $signo); - }); - } - /** @inheritdoc */ - public function destroy(ProcessHandle $handle) - { - /** @var Handle $handle */ - if ($handle->status < ProcessStatus::ENDED && \getmypid() === $handle->originalParentPid) { - try { - $this->kill($handle); - return; - } catch (ProcessException $e) { - // ignore - } - } - $this->free($handle); - } - private function free(Handle $handle) - { - /** @var Handle $handle */ - if ($handle->extraDataPipeWatcher !== null) { - Loop::cancel($handle->extraDataPipeWatcher); - $handle->extraDataPipeWatcher = null; - } - /** @var Handle $handle */ - if ($handle->extraDataPipeStartWatcher !== null) { - Loop::cancel($handle->extraDataPipeStartWatcher); - $handle->extraDataPipeStartWatcher = null; - } - if (\is_resource($handle->extraDataPipe)) { - \fclose($handle->extraDataPipe); - } - $handle->stdin->close(); - $handle->stdout->close(); - $handle->stderr->close(); - if (\is_resource($handle->proc)) { - \proc_close($handle->proc); - } - } -} diff --git a/dependencies/amphp/process/lib/Internal/ProcessHandle.php b/dependencies/amphp/process/lib/Internal/ProcessHandle.php deleted file mode 100644 index bf8f62d..0000000 --- a/dependencies/amphp/process/lib/Internal/ProcessHandle.php +++ /dev/null @@ -1,22 +0,0 @@ - Succeeds with exit code of the process or fails if the process is killed. - */ - public function join(ProcessHandle $handle) : Promise; - /** - * Forcibly end the child process. - * - * @param ProcessHandle $handle The process descriptor. - * - * @throws ProcessException If terminating the process fails. - */ - public function kill(ProcessHandle $handle); - /** - * Send a signal signal to the child process. - * - * @param ProcessHandle $handle The process descriptor. - * @param int $signo Signal number to send to process. - * - * @throws ProcessException If sending the signal fails. - */ - public function signal(ProcessHandle $handle, int $signo); - /** - * Release all resources held by the process handle. - * - * @param ProcessHandle $handle The process descriptor. - */ - public function destroy(ProcessHandle $handle); -} diff --git a/dependencies/amphp/process/lib/Internal/ProcessStatus.php b/dependencies/amphp/process/lib/Internal/ProcessStatus.php deleted file mode 100644 index 10b0bf9..0000000 --- a/dependencies/amphp/process/lib/Internal/ProcessStatus.php +++ /dev/null @@ -1,14 +0,0 @@ -joinDeferred = new Deferred(); - $this->pidDeferred = new Deferred(); - } - /** @var Deferred */ - public $joinDeferred; - /** @var string */ - public $exitCodeWatcher; - /** @var bool */ - public $exitCodeRequested = \false; - /** @var resource */ - public $proc; - /** @var int */ - public $wrapperPid; - /** @var resource */ - public $wrapperStderrPipe; - /** @var resource[] */ - public $sockets = []; - /** @var Deferred[] */ - public $stdioDeferreds; - /** @var string */ - public $childPidWatcher; - /** @var string */ - public $connectTimeoutWatcher; - /** @var string[] */ - public $securityTokens; -} diff --git a/dependencies/amphp/process/lib/Internal/Windows/HandshakeStatus.php b/dependencies/amphp/process/lib/Internal/Windows/HandshakeStatus.php deleted file mode 100644 index 973981a..0000000 --- a/dependencies/amphp/process/lib/Internal/Windows/HandshakeStatus.php +++ /dev/null @@ -1,21 +0,0 @@ -socketConnector->address, $this->socketConnector->port, SocketConnector::SECURITY_TOKEN_SIZE); - if ($workingDirectory !== '') { - $result .= ' ' . \escapeshellarg('--cwd=' . \rtrim($workingDirectory, '\\')); - } - return $result; - } - public function __construct() - { - $this->socketConnector = new SocketConnector(); - } - /** @inheritdoc */ - public function start(string $command, string $cwd = null, array $env = [], array $options = []) : ProcessHandle - { - if (\strpos($command, "\x00") !== \false) { - throw new ProcessException("Can't execute commands that contain null bytes."); - } - $options['bypass_shell'] = \true; - $handle = new Handle(); - $handle->proc = @\proc_open($this->makeCommand($cwd ?? ''), self::FD_SPEC, $pipes, $cwd ?: null, $env ?: null, $options); - if (!\is_resource($handle->proc)) { - $message = "Could not start process"; - if ($error = \error_get_last()) { - $message .= \sprintf(" Errno: %d; %s", $error["type"], $error["message"]); - } - throw new ProcessException($message); - } - $status = \proc_get_status($handle->proc); - if (!$status) { - \proc_close($handle->proc); - throw new ProcessException("Could not get process status"); - } - $securityTokens = \random_bytes(SocketConnector::SECURITY_TOKEN_SIZE * 6); - $written = \fwrite($pipes[0], $securityTokens . "\x00" . $command . "\x00"); - \fclose($pipes[0]); - \fclose($pipes[1]); - if ($written !== SocketConnector::SECURITY_TOKEN_SIZE * 6 + \strlen($command) + 2) { - \fclose($pipes[2]); - \proc_close($handle->proc); - throw new ProcessException("Could not send security tokens / command to process wrapper"); - } - $handle->securityTokens = \str_split($securityTokens, SocketConnector::SECURITY_TOKEN_SIZE); - $handle->wrapperPid = $status['pid']; - $handle->wrapperStderrPipe = $pipes[2]; - $stdinDeferred = new Deferred(); - $handle->stdioDeferreds[] = $stdinDeferred; - $handle->stdin = new ProcessOutputStream($stdinDeferred->promise()); - $stdoutDeferred = new Deferred(); - $handle->stdioDeferreds[] = $stdoutDeferred; - $handle->stdout = new ProcessInputStream($stdoutDeferred->promise()); - $stderrDeferred = new Deferred(); - $handle->stdioDeferreds[] = $stderrDeferred; - $handle->stderr = new ProcessInputStream($stderrDeferred->promise()); - $this->socketConnector->registerPendingProcess($handle); - return $handle; - } - /** @inheritdoc */ - public function join(ProcessHandle $handle) : Promise - { - /** @var Handle $handle */ - $handle->exitCodeRequested = \true; - if ($handle->exitCodeWatcher !== null) { - Loop::reference($handle->exitCodeWatcher); - } - return $handle->joinDeferred->promise(); - } - /** @inheritdoc */ - public function kill(ProcessHandle $handle) - { - /** @var Handle $handle */ - \exec('taskkill /F /T /PID ' . $handle->wrapperPid . ' 2>&1', $output, $exitCode); - $failStart = \false; - if ($handle->childPidWatcher !== null) { - Loop::cancel($handle->childPidWatcher); - $handle->childPidWatcher = null; - $handle->pidDeferred->fail(new ProcessException("The process was killed")); - $failStart = \true; - } - if ($handle->exitCodeWatcher !== null) { - Loop::cancel($handle->exitCodeWatcher); - $handle->exitCodeWatcher = null; - $handle->joinDeferred->fail(new ProcessException("The process was killed")); - } - $handle->status = ProcessStatus::ENDED; - if ($failStart || $handle->stdioDeferreds) { - $this->socketConnector->failHandleStart($handle, "The process was killed"); - } - $this->free($handle); - } - /** @inheritdoc */ - public function signal(ProcessHandle $handle, int $signo) - { - throw new ProcessException('Signals are not supported on Windows'); - } - /** @inheritdoc */ - public function destroy(ProcessHandle $handle) - { - /** @var Handle $handle */ - if ($handle->status < ProcessStatus::ENDED && \is_resource($handle->proc)) { - try { - $this->kill($handle); - return; - } catch (ProcessException $e) { - // ignore - } - } - $this->free($handle); - } - private function free(Handle $handle) - { - if ($handle->childPidWatcher !== null) { - Loop::cancel($handle->childPidWatcher); - $handle->childPidWatcher = null; - } - if ($handle->exitCodeWatcher !== null) { - Loop::cancel($handle->exitCodeWatcher); - $handle->exitCodeWatcher = null; - } - $handle->stdin->close(); - $handle->stdout->close(); - $handle->stderr->close(); - foreach ($handle->sockets as $socket) { - if (\is_resource($socket)) { - @\fclose($socket); - } - } - if (\is_resource($handle->wrapperStderrPipe)) { - @\fclose($handle->wrapperStderrPipe); - } - if (\is_resource($handle->proc)) { - \proc_close($handle->proc); - } - } -} diff --git a/dependencies/amphp/process/lib/Internal/Windows/SignalCode.php b/dependencies/amphp/process/lib/Internal/Windows/SignalCode.php deleted file mode 100644 index 70b6d1c..0000000 --- a/dependencies/amphp/process/lib/Internal/Windows/SignalCode.php +++ /dev/null @@ -1,19 +0,0 @@ -server = \stream_socket_server(self::SERVER_SOCKET_URI, $errNo, $errStr, $flags); - if (!$this->server) { - throw new \Error("Failed to create TCP server socket for process wrapper: {$errNo}: {$errStr}"); - } - if (!\stream_set_blocking($this->server, \false)) { - throw new \Error("Failed to set server socket to non-blocking mode"); - } - list($this->address, $this->port) = \explode(':', \stream_socket_get_name($this->server, \false)); - $this->port = (int) $this->port; - Loop::unreference(Loop::onReadable($this->server, [$this, 'onServerSocketReadable'])); - } - private function failClientHandshake($socket, int $code) - { - \fwrite($socket, \chr(SignalCode::HANDSHAKE_ACK) . \chr($code)); - \fclose($socket); - unset($this->pendingClients[(int) $socket]); - } - public function failHandleStart(Handle $handle, string $message, ...$args) - { - Loop::cancel($handle->connectTimeoutWatcher); - unset($this->pendingProcesses[$handle->wrapperPid]); - foreach ($handle->sockets as $socket) { - \fclose($socket); - } - $error = new ProcessException(\vsprintf($message, $args)); - $deferreds = $handle->stdioDeferreds; - $deferreds[] = $handle->joinDeferred; - $handle->stdioDeferreds = []; - foreach ($deferreds as $deferred) { - $deferred->fail($error); - } - } - /** - * Read data from a client socket. - * - * This method cleans up internal state as appropriate. Returns null if the read fails or needs to be repeated. - * - * @param resource $socket - * @param int $length - * @param PendingSocketClient $state - * - * @return string|null - */ - private function readDataFromPendingClient($socket, int $length, PendingSocketClient $state) - { - $data = \fread($socket, $length); - if ($data === \false || $data === '') { - return null; - } - $data = $state->receivedDataBuffer . $data; - if (\strlen($data) < $length) { - $state->receivedDataBuffer = $data; - return null; - } - $state->receivedDataBuffer = ''; - Loop::cancel($state->readWatcher); - return $data; - } - public function onReadableHandshake($watcher, $socket) - { - $socketId = (int) $socket; - $pendingClient = $this->pendingClients[$socketId]; - if (null === ($data = $this->readDataFromPendingClient($socket, self::SECURITY_TOKEN_SIZE + 6, $pendingClient))) { - return; - } - $packet = \unpack('Csignal/Npid/Cstream_id/a*client_token', $data); - // validate the client's handshake - if ($packet['signal'] !== SignalCode::HANDSHAKE) { - $this->failClientHandshake($socket, HandshakeStatus::SIGNAL_UNEXPECTED); - return; - } - if ($packet['stream_id'] > 2) { - $this->failClientHandshake($socket, HandshakeStatus::INVALID_STREAM_ID); - return; - } - if (!isset($this->pendingProcesses[$packet['pid']])) { - $this->failClientHandshake($socket, HandshakeStatus::INVALID_PROCESS_ID); - return; - } - $handle = $this->pendingProcesses[$packet['pid']]; - if (isset($handle->sockets[$packet['stream_id']])) { - $this->failClientHandshake($socket, HandshakeStatus::DUPLICATE_STREAM_ID); - \trigger_error(\sprintf("%s: Received duplicate socket for process #%s stream #%d", self::class, $handle->pid, $packet['stream_id']), \E_USER_WARNING); - return; - } - if (!\hash_equals($packet['client_token'], $handle->securityTokens[$packet['stream_id']])) { - $this->failClientHandshake($socket, HandshakeStatus::INVALID_CLIENT_TOKEN); - $this->failHandleStart($handle, "Invalid client security token for stream #%d", $packet['stream_id']); - return; - } - $ackData = \chr(SignalCode::HANDSHAKE_ACK) . \chr(HandshakeStatus::SUCCESS) . $handle->securityTokens[$packet['stream_id'] + 3]; - // Unless we set the security token size so high that it won't fit in the - // buffer, this probably shouldn't ever happen unless something has gone wrong - if (\fwrite($socket, $ackData) !== self::SECURITY_TOKEN_SIZE + 2) { - unset($this->pendingClients[$socketId]); - return; - } - $pendingClient->pid = $packet['pid']; - $pendingClient->streamId = $packet['stream_id']; - $pendingClient->readWatcher = Loop::onReadable($socket, [$this, 'onReadableHandshakeAck']); - } - public function onReadableHandshakeAck($watcher, $socket) - { - $socketId = (int) $socket; - $pendingClient = $this->pendingClients[$socketId]; - // can happen if the start promise was failed - if (!isset($this->pendingProcesses[$pendingClient->pid]) || $this->pendingProcesses[$pendingClient->pid]->status === ProcessStatus::ENDED) { - \fclose($socket); - Loop::cancel($watcher); - Loop::cancel($pendingClient->timeoutWatcher); - unset($this->pendingClients[$socketId]); - return; - } - if (null === ($data = $this->readDataFromPendingClient($socket, 2, $pendingClient))) { - return; - } - Loop::cancel($pendingClient->timeoutWatcher); - unset($this->pendingClients[$socketId]); - $handle = $this->pendingProcesses[$pendingClient->pid]; - $packet = \unpack('Csignal/Cstatus', $data); - if ($packet['signal'] !== SignalCode::HANDSHAKE_ACK || $packet['status'] !== HandshakeStatus::SUCCESS) { - $this->failHandleStart($handle, "Client rejected handshake with code %d for stream #%d", $packet['status'], $pendingClient->streamId); - return; - } - $handle->sockets[$pendingClient->streamId] = $socket; - if (\count($handle->sockets) === 3) { - $handle->childPidWatcher = Loop::onReadable($handle->sockets[0], [$this, 'onReadableChildPid'], $handle); - $deferreds = $handle->stdioDeferreds; - $handle->stdioDeferreds = []; - // clear, so there's no double resolution if process spawn fails - $deferreds[0]->resolve(new ResourceOutputStream($handle->sockets[0])); - $deferreds[1]->resolve(new ResourceInputStream($handle->sockets[1])); - $deferreds[2]->resolve(new ResourceInputStream($handle->sockets[2])); - } - } - public function onReadableChildPid($watcher, $socket, Handle $handle) - { - $data = \fread($socket, 5); - if ($data === \false || $data === '') { - return; - } - Loop::cancel($handle->childPidWatcher); - Loop::cancel($handle->connectTimeoutWatcher); - $handle->childPidWatcher = null; - if (\strlen($data) !== 5) { - $this->failHandleStart($handle, 'Failed to read PID from wrapper: Received %d of 5 expected bytes', \strlen($data)); - return; - } - $packet = \unpack('Csignal/Npid', $data); - if ($packet['signal'] !== SignalCode::CHILD_PID) { - $this->failHandleStart($handle, "Failed to read PID from wrapper: Unexpected signal code %d", $packet['signal']); - return; - } - // Required, because a process might be destroyed while starting - if ($handle->status === ProcessStatus::STARTING) { - $handle->status = ProcessStatus::RUNNING; - $handle->exitCodeWatcher = Loop::onReadable($handle->sockets[0], [$this, 'onReadableExitCode'], $handle); - if (!$handle->exitCodeRequested) { - Loop::unreference($handle->exitCodeWatcher); - } - } - $handle->pidDeferred->resolve($packet['pid']); - unset($this->pendingProcesses[$handle->wrapperPid]); - } - public function onReadableExitCode($watcher, $socket, Handle $handle) - { - $data = \fread($socket, 5); - if ($data === \false || $data === '') { - return; - } - Loop::cancel($handle->exitCodeWatcher); - $handle->exitCodeWatcher = null; - if (\strlen($data) !== 5) { - $handle->status = ProcessStatus::ENDED; - $handle->joinDeferred->fail(new ProcessException(\sprintf('Failed to read exit code from wrapper: Received %d of 5 expected bytes', \strlen($data)))); - return; - } - $packet = \unpack('Csignal/Ncode', $data); - if ($packet['signal'] !== SignalCode::EXIT_CODE) { - $this->failHandleStart($handle, "Failed to read exit code from wrapper: Unexpected signal code %d", $packet['signal']); - return; - } - $handle->status = ProcessStatus::ENDED; - $handle->joinDeferred->resolve($packet['code']); - $handle->stdin->close(); - $handle->stdout->close(); - $handle->stderr->close(); - // Explicitly \fclose() sockets, as resource streams shut only one side down. - foreach ($handle->sockets as $sock) { - // Ensure socket is still open before attempting to close. - if (\is_resource($sock)) { - @\fclose($sock); - } - } - } - public function onClientSocketConnectTimeout($watcher, $socket) - { - $id = (int) $socket; - Loop::cancel($this->pendingClients[$id]->readWatcher); - unset($this->pendingClients[$id]); - \fclose($socket); - } - public function onServerSocketReadable() - { - $socket = \stream_socket_accept($this->server); - if (!\stream_set_blocking($socket, \false)) { - throw new \Error("Failed to set client socket to non-blocking mode"); - } - $pendingClient = new PendingSocketClient(); - $pendingClient->readWatcher = Loop::onReadable($socket, [$this, 'onReadableHandshake']); - $pendingClient->timeoutWatcher = Loop::delay(self::CONNECT_TIMEOUT, [$this, 'onClientSocketConnectTimeout'], $socket); - $this->pendingClients[(int) $socket] = $pendingClient; - } - public function onProcessConnectTimeout($watcher, Handle $handle) - { - $running = \is_resource($handle->proc) && \proc_get_status($handle->proc)['running']; - $error = null; - if (!$running) { - $error = \stream_get_contents($handle->wrapperStderrPipe); - } - $error = $error ?: 'Process did not connect to server before timeout elapsed'; - foreach ($handle->sockets as $socket) { - \fclose($socket); - } - $error = new ProcessException(\trim($error)); - foreach ($handle->stdioDeferreds as $deferred) { - $deferred->fail($error); - } - \fclose($handle->wrapperStderrPipe); - \proc_close($handle->proc); - $handle->joinDeferred->fail($error); - } - public function registerPendingProcess(Handle $handle) - { - // Use Loop::defer() to start the timeout only after the loop has ticked once. This prevents issues with many - // things started at once, see https://github.com/amphp/process/issues/21. - $handle->connectTimeoutWatcher = Loop::defer(function () use($handle) { - $handle->connectTimeoutWatcher = Loop::delay(self::CONNECT_TIMEOUT, [$this, 'onProcessConnectTimeout'], $handle); - }); - $this->pendingProcesses[$handle->wrapperPid] = $handle; - } -} diff --git a/dependencies/amphp/process/lib/Process.php b/dependencies/amphp/process/lib/Process.php deleted file mode 100644 index 5ff0669..0000000 --- a/dependencies/amphp/process/lib/Process.php +++ /dev/null @@ -1,233 +0,0 @@ - $value) { - if (\is_array($value)) { - throw new \Error("\$env cannot accept array values"); - } - $envVars[(string) $key] = (string) $value; - } - $this->command = $command; - $this->cwd = $cwd; - $this->env = $envVars; - $this->options = $options; - $this->processRunner = Loop::getState(self::class); - if ($this->processRunner === null) { - $this->processRunner = IS_WINDOWS ? new WindowsProcessRunner() : new PosixProcessRunner(); - Loop::setState(self::class, $this->processRunner); - } - } - /** - * Stops the process if it is still running. - */ - public function __destruct() - { - if ($this->handle !== null) { - $this->processRunner->destroy($this->handle); - } - } - public function __clone() - { - throw new \Error("Cloning is not allowed!"); - } - /** - * Start the process. - * - * @return Promise Resolves with the PID. - * - * @throws StatusError If the process has already been started. - */ - public function start() : Promise - { - if ($this->handle) { - throw new StatusError("Process has already been started."); - } - return call(function () { - $this->handle = $this->processRunner->start($this->command, $this->cwd, $this->env, $this->options); - return $this->pid = (yield $this->handle->pidDeferred->promise()); - }); - } - /** - * Wait for the process to end. - * - * @return Promise Succeeds with process exit code or fails with a ProcessException if the process is killed. - * - * @throws StatusError If the process has already been started. - */ - public function join() : Promise - { - if (!$this->handle) { - throw new StatusError("Process has not been started."); - } - return $this->processRunner->join($this->handle); - } - /** - * Forcibly end the process. - * - * @throws StatusError If the process is not running. - * @throws ProcessException If terminating the process fails. - */ - public function kill() - { - if (!$this->isRunning()) { - throw new StatusError("Process is not running."); - } - $this->processRunner->kill($this->handle); - } - /** - * Send a signal signal to the process. - * - * @param int $signo Signal number to send to process. - * - * @throws StatusError If the process is not running. - * @throws ProcessException If sending the signal fails. - */ - public function signal(int $signo) - { - if (!$this->isRunning()) { - throw new StatusError("Process is not running."); - } - $this->processRunner->signal($this->handle, $signo); - } - /** - * Returns the PID of the child process. - * - * @return int - * - * @throws StatusError If the process has not started or has not completed starting. - */ - public function getPid() : int - { - if (!$this->pid) { - throw new StatusError("Process has not been started or has not completed starting."); - } - return $this->pid; - } - /** - * Returns the command to execute. - * - * @return string The command to execute. - */ - public function getCommand() : string - { - return $this->command; - } - /** - * Gets the current working directory. - * - * @return string The current working directory an empty string if inherited from the current PHP process. - */ - public function getWorkingDirectory() : string - { - if ($this->cwd === "") { - return \getcwd() ?: ""; - } - return $this->cwd; - } - /** - * Gets the environment variables array. - * - * @return string[] Array of environment variables. - */ - public function getEnv() : array - { - return $this->env; - } - /** - * Gets the options to pass to proc_open(). - * - * @return mixed[] Array of options. - */ - public function getOptions() : array - { - return $this->options; - } - /** - * Determines if the process is still running. - * - * @return bool - */ - public function isRunning() : bool - { - return $this->handle && $this->handle->status !== ProcessStatus::ENDED; - } - /** - * Gets the process input stream (STDIN). - * - * @return ProcessOutputStream - */ - public function getStdin() : ProcessOutputStream - { - if (!$this->handle || $this->handle->status === ProcessStatus::STARTING) { - throw new StatusError("Process has not been started or has not completed starting."); - } - return $this->handle->stdin; - } - /** - * Gets the process output stream (STDOUT). - * - * @return ProcessInputStream - */ - public function getStdout() : ProcessInputStream - { - if (!$this->handle || $this->handle->status === ProcessStatus::STARTING) { - throw new StatusError("Process has not been started or has not completed starting."); - } - return $this->handle->stdout; - } - /** - * Gets the process error stream (STDERR). - * - * @return ProcessInputStream - */ - public function getStderr() : ProcessInputStream - { - if (!$this->handle || $this->handle->status === ProcessStatus::STARTING) { - throw new StatusError("Process has not been started or has not completed starting."); - } - return $this->handle->stderr; - } - public function __debugInfo() : array - { - return ['command' => $this->getCommand(), 'cwd' => $this->getWorkingDirectory(), 'env' => $this->getEnv(), 'options' => $this->getOptions(), 'pid' => $this->pid, 'status' => $this->handle ? $this->handle->status : -1]; - } -} diff --git a/dependencies/amphp/process/lib/ProcessException.php b/dependencies/amphp/process/lib/ProcessException.php deleted file mode 100644 index c8af8fe..0000000 --- a/dependencies/amphp/process/lib/ProcessException.php +++ /dev/null @@ -1,7 +0,0 @@ -onResolve(function ($error, $resourceStream) { - if ($error) { - $this->error = new StreamException("Failed to launch process", 0, $error); - if ($this->initialRead) { - $initialRead = $this->initialRead; - $this->initialRead = null; - $initialRead->fail($this->error); - } - return; - } - $this->resourceStream = $resourceStream; - if (!$this->referenced) { - $this->resourceStream->unreference(); - } - if ($this->shouldClose) { - $this->resourceStream->close(); - } - if ($this->initialRead) { - $initialRead = $this->initialRead; - $this->initialRead = null; - $initialRead->resolve($this->shouldClose ? null : $this->resourceStream->read()); - } - }); - } - /** - * Reads data from the stream. - * - * @return Promise Resolves with a string when new data is available or `null` if the stream has closed. - * - * @throws PendingReadError Thrown if another read operation is still pending. - */ - public function read() : Promise - { - if ($this->initialRead) { - throw new PendingReadError(); - } - if ($this->error) { - return new Failure($this->error); - } - if ($this->resourceStream) { - return $this->resourceStream->read(); - } - if ($this->shouldClose) { - return new Success(); - // Resolve reads on closed streams with null. - } - $this->initialRead = new Deferred(); - return $this->initialRead->promise(); - } - public function reference() - { - $this->referenced = \true; - if ($this->resourceStream) { - $this->resourceStream->reference(); - } - } - public function unreference() - { - $this->referenced = \false; - if ($this->resourceStream) { - $this->resourceStream->unreference(); - } - } - public function close() - { - $this->shouldClose = \true; - if ($this->initialRead) { - $initialRead = $this->initialRead; - $this->initialRead = null; - $initialRead->resolve(); - } - if ($this->resourceStream) { - $this->resourceStream->close(); - } - } -} diff --git a/dependencies/amphp/process/lib/ProcessOutputStream.php b/dependencies/amphp/process/lib/ProcessOutputStream.php deleted file mode 100644 index 60b54f9..0000000 --- a/dependencies/amphp/process/lib/ProcessOutputStream.php +++ /dev/null @@ -1,94 +0,0 @@ -queuedWrites = new \SplQueue(); - $resourceStreamPromise->onResolve(function ($error, $resourceStream) { - if ($error) { - $this->error = new StreamException("Failed to launch process", 0, $error); - while (!$this->queuedWrites->isEmpty()) { - list(, $deferred) = $this->queuedWrites->shift(); - $deferred->fail($this->error); - } - return; - } - while (!$this->queuedWrites->isEmpty()) { - /** - * @var string $data - * @var \Amp\Deferred $deferred - */ - list($data, $deferred) = $this->queuedWrites->shift(); - $deferred->resolve($resourceStream->write($data)); - } - $this->resourceStream = $resourceStream; - if ($this->shouldClose) { - $this->resourceStream->close(); - } - }); - } - /** @inheritdoc */ - public function write(string $data) : Promise - { - if ($this->resourceStream) { - return $this->resourceStream->write($data); - } - if ($this->error) { - return new Failure($this->error); - } - if ($this->shouldClose) { - throw new ClosedException("Stream has already been closed."); - } - $deferred = new Deferred(); - $this->queuedWrites->push([$data, $deferred]); - return $deferred->promise(); - } - /** @inheritdoc */ - public function end(string $finalData = "") : Promise - { - if ($this->resourceStream) { - return $this->resourceStream->end($finalData); - } - if ($this->error) { - return new Failure($this->error); - } - if ($this->shouldClose) { - throw new ClosedException("Stream has already been closed."); - } - $deferred = new Deferred(); - $this->queuedWrites->push([$finalData, $deferred]); - $this->shouldClose = \true; - return $deferred->promise(); - } - public function close() - { - $this->shouldClose = \true; - if ($this->resourceStream) { - $this->resourceStream->close(); - } elseif (!$this->queuedWrites->isEmpty()) { - $error = new ClosedException("Stream closed."); - do { - list(, $deferred) = $this->queuedWrites->shift(); - $deferred->fail($error); - } while (!$this->queuedWrites->isEmpty()); - } - } -} diff --git a/dependencies/amphp/process/lib/StatusError.php b/dependencies/amphp/process/lib/StatusError.php deleted file mode 100644 index cc014d3..0000000 --- a/dependencies/amphp/process/lib/StatusError.php +++ /dev/null @@ -1,7 +0,0 @@ -serializer = $serializer; - } - public function serialize($data) : string - { - $serializedData = $this->serializer->serialize($data); - $flags = 0; - if (\strlen($serializedData) > self::COMPRESSION_THRESHOLD) { - $serializedData = @\gzdeflate($serializedData, 1); - if ($serializedData === \false) { - $error = \error_get_last(); - throw new SerializationException('Could not compress data: ' . ($error['message'] ?? 'unknown error')); - } - $flags |= self::FLAG_COMPRESSED; - } - return \chr($flags & 0xff) . $serializedData; - } - public function unserialize(string $data) - { - $firstByte = \ord($data[0]); - $data = \substr($data, 1); - if ($firstByte & self::FLAG_COMPRESSED) { - $data = @\gzinflate($data); - if ($data === \false) { - $error = \error_get_last(); - throw new SerializationException('Could not decompress data: ' . ($error['message'] ?? 'unknown error')); - } - } - return $this->serializer->unserialize($data); - } -} diff --git a/dependencies/amphp/serialization/src/JsonSerializer.php b/dependencies/amphp/serialization/src/JsonSerializer.php deleted file mode 100644 index 83e466f..0000000 --- a/dependencies/amphp/serialization/src/JsonSerializer.php +++ /dev/null @@ -1,71 +0,0 @@ -associative = $associative; - $this->depth = $depth; - // We don't want to throw on errors, we manually check for errors using json_last_error(). - $this->encodeOptions = $encodeOptions & ~self::THROW_ON_ERROR; - $this->decodeOptions = $decodeOptions & ~self::THROW_ON_ERROR; - } - public function serialize($data) : string - { - $result = \json_encode($data, $this->encodeOptions, $this->depth); - switch ($code = \json_last_error()) { - case \JSON_ERROR_NONE: - return $result; - default: - throw new SerializationException(\json_last_error_msg(), $code); - } - } - public function unserialize(string $data) - { - $result = \json_decode($data, $this->associative, $this->depth, $this->decodeOptions); - switch ($code = \json_last_error()) { - case \JSON_ERROR_NONE: - return $result; - default: - throw new SerializationException(\json_last_error_msg(), $code); - } - } -} diff --git a/dependencies/amphp/serialization/src/NativeSerializer.php b/dependencies/amphp/serialization/src/NativeSerializer.php deleted file mode 100644 index 1032579..0000000 --- a/dependencies/amphp/serialization/src/NativeSerializer.php +++ /dev/null @@ -1,36 +0,0 @@ -allowedClasses = $allowedClasses; - } - public function serialize($data) : string - { - try { - return \serialize($data); - } catch (\Throwable $exception) { - throw new SerializationException(\sprintf('The given data could not be serialized: %s', $exception->getMessage()), 0, $exception); - } - } - public function unserialize(string $data) - { - try { - $result = \unserialize($data, ['allowed_classes' => $this->allowedClasses ?? \true]); - if ($result === \false && $data !== \serialize(\false)) { - throw new SerializationException('Invalid data provided to unserialize: ' . encodeUnprintableChars($data)); - } - } catch (\Throwable $exception) { - throw new SerializationException('Exception thrown when unserializing data', 0, $exception); - } - return $result; - } -} diff --git a/dependencies/amphp/serialization/src/PassthroughSerializer.php b/dependencies/amphp/serialization/src/PassthroughSerializer.php deleted file mode 100644 index c924690..0000000 --- a/dependencies/amphp/serialization/src/PassthroughSerializer.php +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/amphp/socket/src/BindContext.php b/dependencies/amphp/socket/src/BindContext.php deleted file mode 100644 index cc790d2..0000000 --- a/dependencies/amphp/socket/src/BindContext.php +++ /dev/null @@ -1,136 +0,0 @@ -withBindTo(null); - } - public function withBindTo(?string $bindTo) : self - { - $bindTo = normalizeBindToOption($bindTo); - $clone = clone $this; - $clone->bindTo = $bindTo; - return $clone; - } - public function getBindTo() : ?string - { - return $this->bindTo; - } - public function getBacklog() : int - { - return $this->backlog; - } - public function withBacklog(int $backlog) : self - { - $clone = clone $this; - $clone->backlog = $backlog; - return $clone; - } - public function hasReusePort() : bool - { - return $this->reusePort; - } - public function withReusePort() : self - { - $clone = clone $this; - $clone->reusePort = \true; - return $clone; - } - public function withoutReusePort() : self - { - $clone = clone $this; - $clone->reusePort = \false; - return $clone; - } - public function hasBroadcast() : bool - { - return $this->broadcast; - } - public function withBroadcast() : self - { - $clone = clone $this; - $clone->broadcast = \true; - return $clone; - } - public function withoutBroadcast() : self - { - $clone = clone $this; - $clone->broadcast = \false; - return $clone; - } - public function hasTcpNoDelay() : bool - { - return $this->tcpNoDelay; - } - public function withTcpNoDelay() : self - { - $clone = clone $this; - $clone->tcpNoDelay = \true; - return $clone; - } - public function withoutTcpNoDelay() : self - { - $clone = clone $this; - $clone->tcpNoDelay = \false; - return $clone; - } - public function getTlsContext() : ?ServerTlsContext - { - return $this->tlsContext; - } - public function withoutTlsContext() : self - { - return $this->withTlsContext(null); - } - public function withTlsContext(?ServerTlsContext $tlsContext) : self - { - $clone = clone $this; - $clone->tlsContext = $tlsContext; - return $clone; - } - public function getChunkSize() : int - { - return $this->chunkSize; - } - public function withChunkSize(int $chunkSize) : self - { - $clone = clone $this; - $clone->chunkSize = $chunkSize; - return $clone; - } - public function toStreamContextArray() : array - { - $array = ['socket' => [ - 'bindto' => $this->bindTo, - 'backlog' => $this->backlog, - 'ipv6_v6only' => \true, - // SO_REUSEADDR has SO_REUSEPORT semantics on Windows - 'so_reuseaddr' => $this->reusePort && \stripos(\PHP_OS, 'WIN') === 0, - 'so_reuseport' => $this->reusePort, - 'so_broadcast' => $this->broadcast, - 'tcp_nodelay' => $this->tcpNoDelay, - ]]; - if ($this->tlsContext) { - $array = \array_merge($array, $this->tlsContext->toStreamContextArray()); - } - return $array; - } -} diff --git a/dependencies/amphp/socket/src/Certificate.php b/dependencies/amphp/socket/src/Certificate.php deleted file mode 100644 index 8459d26..0000000 --- a/dependencies/amphp/socket/src/Certificate.php +++ /dev/null @@ -1,38 +0,0 @@ -certFile = $certFile; - $this->keyFile = $keyFile ?? $certFile; - } - /** - * @return string - */ - public function getCertFile() : string - { - return $this->certFile; - } - /** - * @return string - */ - public function getKeyFile() : string - { - return $this->keyFile; - } -} diff --git a/dependencies/amphp/socket/src/ClientTlsContext.php b/dependencies/amphp/socket/src/ClientTlsContext.php deleted file mode 100644 index 46ac9d3..0000000 --- a/dependencies/amphp/socket/src/ClientTlsContext.php +++ /dev/null @@ -1,388 +0,0 @@ -= 70400 ? \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT : 0; - private const TLS_VERSIONS = \PHP_VERSION_ID >= 70400 ? ['TLSv1.0' => self::TLSv1_0, 'TLSv1.1' => self::TLSv1_1, 'TLSv1.2' => self::TLSv1_2, 'TLSv1.3' => self::TLSv1_3] : ['TLSv1.0' => self::TLSv1_0, 'TLSv1.1' => self::TLSv1_1, 'TLSv1.2' => self::TLSv1_2]; - /** @var int */ - private $minVersion = self::TLSv1_0; - /** @var string|null */ - private $peerName; - /** @var bool */ - private $verifyPeer = \true; - /** @var int */ - private $verifyDepth = 10; - /** @var string|null */ - private $ciphers; - /** @var string|null */ - private $caFile; - /** @var string|null */ - private $caPath; - /** @var bool */ - private $capturePeer = \false; - /** @var bool */ - private $sniEnabled = \true; - /** @var int */ - private $securityLevel = 2; - /** @var Certificate|null */ - private $certificate; - /** @var string[] */ - private $alpnProtocols = []; - public function __construct(string $peerName) - { - $this->peerName = $peerName; - } - /** - * Minimum TLS version to negotiate. - * - * Defaults to TLS 1.0. - * - * @param int $version One of the `ClientTlsContext::TLSv*` constants. - * - * @return self Cloned, modified instance. - * @throws \Error If an invalid minimum version is given. - */ - public function withMinimumVersion(int $version) : self - { - if (!\in_array($version, self::TLS_VERSIONS, \true)) { - throw new \Error(\sprintf('Invalid minimum version, only %s allowed', \implode(', ', \array_keys(self::TLS_VERSIONS)))); - } - $clone = clone $this; - $clone->minVersion = $version; - return $clone; - } - /** - * Returns the minimum TLS version to negotiate. - * - * @return int - */ - public function getMinimumVersion() : int - { - return $this->minVersion; - } - /** - * Expected name of the peer. - * - * @param string $peerName - * - * @return self Cloned, modified instance. - */ - public function withPeerName(string $peerName) : self - { - $clone = clone $this; - $clone->peerName = $peerName; - return $clone; - } - /** - * @return null|string Expected name of the peer or `null` if such an expectation doesn't exist. - */ - public function getPeerName() : ?string - { - return $this->peerName; - } - /** - * Enable peer verification. - * - * @return self Cloned, modified instance. - */ - public function withPeerVerification() : self - { - $clone = clone $this; - $clone->verifyPeer = \true; - return $clone; - } - /** - * Disable peer verification, this is the default for servers. - * - * Warning: You usually shouldn't disable this setting for clients, because it allows active MitM attackers to - * intercept the communication and change it without anyone noticing. - * - * @return self Cloned, modified instance. - */ - public function withoutPeerVerification() : self - { - $clone = clone $this; - $clone->verifyPeer = \false; - return $clone; - } - /** - * @return bool Whether peer verification is enabled. - */ - public function hasPeerVerification() : bool - { - return $this->verifyPeer; - } - /** - * Maximum chain length the peer might present including the certificates in the local trust store. - * - * @param int $verifyDepth Maximum length of the certificate chain. - * - * @return self Cloned, modified instance. - */ - public function withVerificationDepth(int $verifyDepth) : self - { - if ($verifyDepth < 0) { - throw new \Error("Invalid verification depth ({$verifyDepth}), must be greater than or equal to 0"); - } - $clone = clone $this; - $clone->verifyDepth = $verifyDepth; - return $clone; - } - /** - * @return int Maximum length of the certificate chain. - */ - public function getVerificationDepth() : int - { - return $this->verifyDepth; - } - /** - * List of ciphers to negotiate, the server's order is always preferred. - * - * @param string|null $ciphers List of ciphers in OpenSSL's format (colon separated). - * - * @return self Cloned, modified instance. - */ - public function withCiphers(string $ciphers = null) : self - { - $clone = clone $this; - $clone->ciphers = $ciphers; - return $clone; - } - /** - * @return string List of ciphers in OpenSSL's format (colon separated). - */ - public function getCiphers() : string - { - return $this->ciphers ?? \OPENSSL_DEFAULT_STREAM_CIPHERS; - } - /** - * CAFile to check for trusted certificates. - * - * @param string|null $cafile Path to the file or `null` to unset. - * - * @return self Cloned, modified instance. - */ - public function withCaFile(string $cafile = null) : self - { - $clone = clone $this; - $clone->caFile = $cafile; - return $clone; - } - /** - * @return null|string Path to the file if one is set, otherwise `null`. - */ - public function getCaFile() : ?string - { - return $this->caFile; - } - /** - * CAPath to check for trusted certificates. - * - * @param string|null $capath Path to the file or `null` to unset. - * - * @return self Cloned, modified instance. - */ - public function withCaPath(string $capath = null) : self - { - $clone = clone $this; - $clone->caPath = $capath; - return $clone; - } - /** - * @return null|string Path to the file if one is set, otherwise `null`. - */ - public function getCaPath() : ?string - { - return $this->caPath; - } - /** - * Capture the certificates sent by the peer. - * - * Note: This is the chain as sent by the peer, NOT the verified chain. - * - * @return self Cloned, modified instance. - */ - public function withPeerCapturing() : self - { - $clone = clone $this; - $clone->capturePeer = \true; - return $clone; - } - /** - * Don't capture the certificates sent by the peer. - * - * @return self Cloned, modified instance. - */ - public function withoutPeerCapturing() : self - { - $clone = clone $this; - $clone->capturePeer = \false; - return $clone; - } - /** - * @return bool Whether to capture the certificates sent by the peer. - */ - public function hasPeerCapturing() : bool - { - return $this->capturePeer; - } - /** - * Enable SNI. - * - * @return self Cloned, modified instance. - */ - public function withSni() : self - { - $clone = clone $this; - $clone->sniEnabled = \true; - return $clone; - } - /** - * Disable SNI. - * - * @return self Cloned, modified instance. - */ - public function withoutSni() : self - { - $clone = clone $this; - $clone->sniEnabled = \false; - return $clone; - } - /** - * @return bool Whether SNI is enabled or not. - */ - public function hasSni() : bool - { - return $this->sniEnabled; - } - /** - * Security level to use. - * - * Requires OpenSSL 1.1.0 or higher. - * - * @param int $level Must be between 0 and 5. - * - * @return self Cloned, modified instance. - */ - public function withSecurityLevel(int $level) : self - { - // See https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_security_level.html - // Level 2 is not recommended, because of SHA-1 by that document, - // but SHA-1 should be phased out now on general internet use. - // We therefore default to level 2. - if ($level < 0 || $level > 5) { - throw new \Error("Invalid security level ({$level}), must be between 0 and 5."); - } - if (!hasTlsSecurityLevelSupport()) { - throw new \Error("Can't set a security level, as PHP is compiled with OpenSSL < 1.1.0."); - } - $clone = clone $this; - $clone->securityLevel = $level; - return $clone; - } - /** - * @return int Security level between 0 and 5. Always 0 for OpenSSL < 1.1.0. - */ - public function getSecurityLevel() : int - { - // 0 is equivalent to previous versions of OpenSSL and just does nothing - if (!hasTlsSecurityLevelSupport()) { - return 0; - } - return $this->securityLevel; - } - /** - * Client certificate to use, if key is no present it assumes it is present in the same file as the certificate. - * - * @param Certificate $certificate Certificate and private key info - * - * @return self Cloned, modified instance. - */ - public function withCertificate(Certificate $certificate = null) : self - { - $clone = clone $this; - $clone->certificate = $certificate; - return $clone; - } - public function getCertificate() : ?Certificate - { - return $this->certificate; - } - /** - * @param string[] $protocols - * - * @return self Cloned, modified instance. - */ - public function withApplicationLayerProtocols(array $protocols) : self - { - if (!hasTlsAlpnSupport()) { - throw new \Error("Can't set an application layer protocol list, as PHP is compiled with OpenSSL < 1.0.2."); - } - foreach ($protocols as $protocol) { - if (!\is_string($protocol)) { - throw new \TypeError("Protocol names must be strings"); - } - } - $clone = clone $this; - $clone->alpnProtocols = $protocols; - return $clone; - } - /** - * @return string[] - */ - public function getApplicationLayerProtocols() : array - { - return $this->alpnProtocols; - } - /** - * Converts this TLS context into PHP's equivalent stream context array. - * - * @return array Stream context array compatible with PHP's streams. - */ - public function toStreamContextArray() : array - { - $options = ['crypto_method' => $this->toStreamCryptoMethod(), 'peer_name' => $this->peerName, 'verify_peer' => $this->verifyPeer, 'verify_peer_name' => $this->verifyPeer, 'verify_depth' => $this->verifyDepth, 'ciphers' => $this->ciphers ?? \OPENSSL_DEFAULT_STREAM_CIPHERS, 'capture_peer_cert' => $this->capturePeer, 'capture_peer_cert_chain' => $this->capturePeer, 'SNI_enabled' => $this->sniEnabled]; - if ($this->certificate !== null) { - $options['local_cert'] = $this->certificate->getCertFile(); - if ($this->certificate->getCertFile() !== $this->certificate->getKeyFile()) { - $options['local_pk'] = $this->certificate->getKeyFile(); - } - } - if ($this->caFile !== null) { - $options['cafile'] = $this->caFile; - } - if ($this->caPath !== null) { - $options['capath'] = $this->caPath; - } - if (hasTlsSecurityLevelSupport()) { - $options['security_level'] = $this->securityLevel; - } - if (!empty($this->alpnProtocols)) { - $options['alpn_protocols'] = \implode(',', $this->alpnProtocols); - } - return ['ssl' => $options]; - } - /** - * @return int Crypto method compatible with PHP's streams. - */ - public function toStreamCryptoMethod() : int - { - switch ($this->minVersion) { - case self::TLSv1_0: - return self::TLSv1_0 | self::TLSv1_1 | self::TLSv1_2 | self::TLSv1_3; - case self::TLSv1_1: - return self::TLSv1_1 | self::TLSv1_2 | self::TLSv1_3; - case self::TLSv1_2: - return self::TLSv1_2 | self::TLSv1_3; - case self::TLSv1_3: - return self::TLSv1_3; - default: - throw new \RuntimeException('Unknown minimum TLS version: ' . $this->minVersion); - } - } -} diff --git a/dependencies/amphp/socket/src/ConnectContext.php b/dependencies/amphp/socket/src/ConnectContext.php deleted file mode 100644 index 34afa76..0000000 --- a/dependencies/amphp/socket/src/ConnectContext.php +++ /dev/null @@ -1,121 +0,0 @@ -withBindTo(null); - } - public function withBindTo(?string $bindTo) : self - { - $bindTo = normalizeBindToOption($bindTo); - $clone = clone $this; - $clone->bindTo = $bindTo; - return $clone; - } - public function getBindTo() : ?string - { - return $this->bindTo; - } - public function withConnectTimeout(int $timeout) : self - { - if ($timeout <= 0) { - throw new \Error("Invalid connect timeout ({$timeout}), must be greater than 0"); - } - $clone = clone $this; - $clone->connectTimeout = $timeout; - return $clone; - } - public function getConnectTimeout() : int - { - return $this->connectTimeout; - } - public function withMaxAttempts(int $maxAttempts) : self - { - if ($maxAttempts <= 0) { - throw new \Error("Invalid max attempts ({$maxAttempts}), must be greater than 0"); - } - $clone = clone $this; - $clone->maxAttempts = $maxAttempts; - return $clone; - } - public function getMaxAttempts() : int - { - return $this->maxAttempts; - } - public function withoutDnsTypeRestriction() : self - { - return $this->withDnsTypeRestriction(null); - } - public function withDnsTypeRestriction(?int $type) : self - { - if ($type !== null && $type !== Record::AAAA && $type !== Record::A) { - throw new \Error('Invalid resolver type restriction'); - } - $clone = clone $this; - $clone->typeRestriction = $type; - return $clone; - } - public function getDnsTypeRestriction() : ?int - { - return $this->typeRestriction; - } - public function hasTcpNoDelay() : bool - { - return $this->tcpNoDelay; - } - public function withTcpNoDelay() : self - { - $clone = clone $this; - $clone->tcpNoDelay = \true; - return $clone; - } - public function withoutTcpNoDelay() : self - { - $clone = clone $this; - $clone->tcpNoDelay = \false; - return $clone; - } - public function withoutTlsContext() : self - { - return $this->withTlsContext(null); - } - public function withTlsContext(?ClientTlsContext $tlsContext) : self - { - $clone = clone $this; - $clone->tlsContext = $tlsContext; - return $clone; - } - public function getTlsContext() : ?ClientTlsContext - { - return $this->tlsContext; - } - public function toStreamContextArray() : array - { - $options = ['tcp_nodelay' => $this->tcpNoDelay]; - if ($this->bindTo !== null) { - $options['bindto'] = $this->bindTo; - } - $array = ['socket' => $options]; - if ($this->tlsContext) { - $array = \array_merge($array, $this->tlsContext->toStreamContextArray()); - } - return $array; - } -} diff --git a/dependencies/amphp/socket/src/ConnectException.php b/dependencies/amphp/socket/src/ConnectException.php deleted file mode 100644 index 5745d5e..0000000 --- a/dependencies/amphp/socket/src/ConnectException.php +++ /dev/null @@ -1,10 +0,0 @@ - - * - * @throws ConnectException - * @throws CancelledException - */ - public function connect(string $uri, ?ConnectContext $context = null, ?CancellationToken $token = null) : Promise; -} diff --git a/dependencies/amphp/socket/src/DatagramSocket.php b/dependencies/amphp/socket/src/DatagramSocket.php deleted file mode 100644 index 5ddc8c0..0000000 --- a/dependencies/amphp/socket/src/DatagramSocket.php +++ /dev/null @@ -1,213 +0,0 @@ -toStreamContextArray()); - // Error reporting suppressed since stream_socket_server() emits an E_WARNING on failure (checked below). - $server = @\stream_socket_server($uri, $errno, $errstr, \STREAM_SERVER_BIND, $streamContext); - if (!$server || $errno) { - throw new SocketException(\sprintf('Could not create datagram %s: [Error: #%d] %s', $uri, $errno, $errstr), $errno); - } - return new self($server, $context->getChunkSize()); - } - /** @var resource|null UDP socket resource. */ - private $socket; - /** @var string Watcher ID. */ - private $watcher; - /** @var SocketAddress */ - private $address; - /** @var Deferred|null */ - private $reader; - /** @var int */ - private $chunkSize; - /** - * @param resource $socket A bound udp socket resource - * @param int $chunkSize Maximum chunk size for the - * - * @throws \Error If a stream resource is not given for $socket. - */ - public function __construct($socket, int $chunkSize = self::DEFAULT_CHUNK_SIZE) - { - if (!\is_resource($socket) || \get_resource_type($socket) !== 'stream') { - throw new \Error('Invalid resource given to constructor!'); - } - $this->socket = $socket; - $this->address = SocketAddress::fromLocalResource($socket); - $this->chunkSize =& $chunkSize; - \stream_set_blocking($this->socket, \false); - $reader =& $this->reader; - $this->watcher = Loop::onReadable($this->socket, static function ($watcher, $socket) use(&$reader, &$chunkSize) { - $deferred = $reader; - $reader = null; - \assert($deferred !== null); - $data = @\stream_socket_recvfrom($socket, $chunkSize, 0, $address); - /** @psalm-suppress TypeDoesNotContainType */ - if ($data === \false) { - Loop::cancel($watcher); - $deferred->resolve(); - return; - } - $deferred->resolve([SocketAddress::fromSocketName($address), $data]); - /** @psalm-suppress RedundantCondition Resolution of the deferred above might read immediately again */ - if (!$reader) { - Loop::disable($watcher); - } - }); - Loop::disable($this->watcher); - } - /** - * Automatically cancels the loop watcher. - */ - public function __destruct() - { - if (!$this->socket) { - return; - } - $this->free(); - } - /** - * @return Promise Resolves with null if the socket is closed. - * - * @throws PendingReceiveError If a receive request is already pending. - */ - public function receive() : Promise - { - if ($this->reader) { - throw new PendingReceiveError(); - } - if (!$this->socket) { - return new Success(); - // Resolve with null when endpoint is closed. - } - $this->reader = new Deferred(); - Loop::enable($this->watcher); - return $this->reader->promise(); - } - /** - * @param SocketAddress $address - * @param string $data - * - * @return Promise Resolves with the number of bytes written to the socket. - * - * @throws SocketException If the UDP socket closes before the data can be sent. - */ - public function send(SocketAddress $address, string $data) : Promise - { - if (!$this->socket) { - return new Failure(new SocketException('The endpoint is not writable')); - } - try { - try { - \set_error_handler(static function (int $errno, string $errstr) { - throw new SocketException(\sprintf('Could not send packet on endpoint: %s', $errstr)); - }); - $result = \stream_socket_sendto($this->socket, $data, 0, $address->toString()); - /** @psalm-suppress TypeDoesNotContainType */ - if ($result < 0 || $result === \false) { - throw new SocketException('Could not send packet on endpoint: Unknown error'); - } - } finally { - \restore_error_handler(); - } - } catch (SocketException $e) { - return new Failure($e); - } - return new Success($result); - } - /** - * Raw stream socket resource. - * - * @return resource|null - */ - public final function getResource() - { - return $this->socket; - } - /** - * References the receive watcher. - * - * @see Loop::reference() - */ - public final function reference() : void - { - Loop::reference($this->watcher); - } - /** - * Unreferences the receive watcher. - * - * @see Loop::unreference() - */ - public final function unreference() : void - { - Loop::unreference($this->watcher); - } - /** - * Closes the datagram socket and stops receiving data. Any pending read is resolved with null. - */ - public function close() : void - { - if ($this->socket) { - /** @psalm-suppress InvalidPropertyAssignmentValue */ - \fclose($this->socket); - } - $this->free(); - } - /** - * @return bool - */ - public function isClosed() : bool - { - return $this->socket === null; - } - /** - * @return SocketAddress - */ - public function getAddress() : SocketAddress - { - return $this->address; - } - /** - * @param int $chunkSize The new maximum packet size to receive. - */ - public function setChunkSize(int $chunkSize) : void - { - $this->chunkSize = $chunkSize; - } - private function free() : void - { - Loop::cancel($this->watcher); - $this->socket = null; - if ($this->reader) { - $this->reader->resolve(); - $this->reader = null; - } - } -} diff --git a/dependencies/amphp/socket/src/DnsConnector.php b/dependencies/amphp/socket/src/DnsConnector.php deleted file mode 100644 index f5d036d..0000000 --- a/dependencies/amphp/socket/src/DnsConnector.php +++ /dev/null @@ -1,108 +0,0 @@ -resolver = $resolver; - } - public function connect(string $uri, ?ConnectContext $context = null, ?CancellationToken $token = null) : Promise - { - $resolver = $this->resolver; - return call(static function () use($uri, $context, $token, $resolver) { - $context = $context ?? new ConnectContext(); - $token = $token ?? new NullCancellationToken(); - $attempt = 0; - $uris = []; - $failures = []; - [$scheme, $host, $port] = Internal\parseUri($uri); - if ($host[0] === '[') { - $host = \substr($host, 1, -1); - } - if ($port === 0 || @\inet_pton($host)) { - // Host is already an IP address or file path. - $uris = [$uri]; - } else { - // Host is not an IP address, so resolve the domain name. - $records = (yield ($resolver ?? Dns\resolver())->resolve($host, $context->getDnsTypeRestriction())); - // Usually the faster response should be preferred, but we don't have a reliable way of determining IPv6 - // support, so we always prefer IPv4 here. - \usort($records, static function (Dns\Record $a, Dns\Record $b) { - return $a->getType() - $b->getType(); - }); - foreach ($records as $record) { - /** @var Dns\Record $record */ - if ($record->getType() === Dns\Record::AAAA) { - $uris[] = \sprintf('%s://[%s]:%d', $scheme, $record->getValue(), $port); - } else { - $uris[] = \sprintf('%s://%s:%d', $scheme, $record->getValue(), $port); - } - } - } - $flags = \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT; - $timeout = $context->getConnectTimeout(); - foreach ($uris as $builtUri) { - try { - $streamContext = \stream_context_create($context->withoutTlsContext()->toStreamContextArray()); - /** @psalm-suppress NullArgument */ - if (!($socket = @\stream_socket_client($builtUri, $errno, $errstr, null, $flags, $streamContext))) { - throw new ConnectException(\sprintf('Connection to %s failed: [Error #%d] %s%s', $uri, $errno, $errstr, $failures ? '; previous attempts: ' . \implode($failures) : ''), $errno); - } - \stream_set_blocking($socket, \false); - $deferred = new Deferred(); - $watcher = Loop::onWritable($socket, static function () use($deferred) { - $deferred->resolve(); - }); - $id = $token->subscribe([$deferred, 'fail']); - try { - (yield Promise\timeout($deferred->promise(), $timeout)); - } catch (TimeoutException $e) { - throw new ConnectException(\sprintf('Connecting to %s failed: timeout exceeded (%d ms)%s', $uri, $timeout, $failures ? '; previous attempts: ' . \implode($failures) : ''), 110); - // See ETIMEDOUT in http://www.virtsync.com/c-error-codes-include-errno - } finally { - Loop::cancel($watcher); - $token->unsubscribe($id); - } - // The following hack looks like the only way to detect connection refused errors with PHP's stream sockets. - /** @psalm-suppress TypeDoesNotContainType */ - if (\stream_socket_get_name($socket, \true) === \false) { - \fclose($socket); - throw new ConnectException(\sprintf('Connection to %s refused%s', $uri, $failures ? '; previous attempts: ' . \implode($failures) : ''), 111); - // See ECONNREFUSED in http://www.virtsync.com/c-error-codes-include-errno - } - } catch (ConnectException $e) { - // Includes only error codes used in this file, as error codes on other OS families might be different. - // In fact, this might show a confusing error message on OS families that return 110 or 111 by itself. - $knownReasons = [110 => 'connection timeout', 111 => 'connection refused']; - $code = $e->getCode(); - $reason = $knownReasons[$code] ?? 'Error #' . $code; - if (++$attempt === $context->getMaxAttempts()) { - break; - } - $failures[] = "{$uri} ({$reason})"; - continue; - // Could not connect to host, try next host in the list. - } - return ResourceSocket::fromClientSocket($socket, $context->getTlsContext()); - } - /** - * This is reached if either all URIs failed or the maximum number of attempts is reached. - * - * @noinspection PhpUndefinedVariableInspection - * @psalm-suppress PossiblyUndefinedVariable - */ - throw $e; - }); - } -} diff --git a/dependencies/amphp/socket/src/EncryptableSocket.php b/dependencies/amphp/socket/src/EncryptableSocket.php deleted file mode 100644 index c53a491..0000000 --- a/dependencies/amphp/socket/src/EncryptableSocket.php +++ /dev/null @@ -1,37 +0,0 @@ - Resolved when TLS is successfully set up on the socket. - * - * @throws SocketException Promise fails and the socket is closed if setting up TLS fails. - */ - public function setupTls(?CancellationToken $cancellationToken = null) : Promise; - /** - * @param CancellationToken|null $cancellationToken - * - * @return Promise Resolved when TLS is successfully shutdown. - * - * @throws SocketException Promise fails and the socket is closed if shutting down TLS fails. - */ - public function shutdownTls(?CancellationToken $cancellationToken = null) : Promise; - /** - * @return int One of the TLS_STATE_* constants defined in this interface. - */ - public function getTlsState() : int; - /** - * @return TlsInfo|null The TLS (crypto) context info if TLS is enabled on the socket or null otherwise. - */ - public function getTlsInfo() : ?TlsInfo; -} diff --git a/dependencies/amphp/socket/src/Internal/functions.php b/dependencies/amphp/socket/src/Internal/functions.php deleted file mode 100644 index 7cfb678..0000000 --- a/dependencies/amphp/socket/src/Internal/functions.php +++ /dev/null @@ -1,213 +0,0 @@ - - * - * @internal - */ -function setupTls($socket, array $options, ?CancellationToken $cancellationToken) : Promise -{ - $cancellationToken = $cancellationToken ?? new NullCancellationToken(); - if (isset(\stream_get_meta_data($socket)['crypto'])) { - return new Failure(new TlsException("Can't setup TLS, because it has already been set up")); - } - \error_clear_last(); - \stream_context_set_option($socket, $options); - try { - \set_error_handler(static function (int $errno, string $errstr) { - new TlsException('TLS negotiation failed: ' . $errstr); - }); - $result = \stream_socket_enable_crypto($socket, $enable = \true); - if ($result === \false) { - throw new TlsException('TLS negotiation failed: Unknown error'); - } - } catch (TlsException $e) { - return new Failure($e); - } finally { - \restore_error_handler(); - } - // Yes, that function can return true / false / 0, don't use weak comparisons. - if ($result === \true) { - /** @psalm-suppress InvalidReturnStatement */ - return new Success(); - } - return call(static function () use($socket, $cancellationToken) { - $cancellationToken->throwIfRequested(); - $deferred = new Deferred(); - // Watcher is guaranteed to be created, because we throw above if cancellation has already been requested - $id = $cancellationToken->subscribe(static function ($e) use($deferred, &$watcher) { - Loop::cancel($watcher); - $deferred->fail($e); - }); - $watcher = Loop::onReadable($socket, static function (string $watcher, $socket, Deferred $deferred) use($cancellationToken, $id) { - try { - try { - \set_error_handler(static function (int $errno, string $errstr) use($socket) { - if (\feof($socket)) { - $errstr = 'Connection reset by peer'; - } - throw new TlsException('TLS negotiation failed: ' . $errstr); - }); - $result = \stream_socket_enable_crypto($socket, \true); - if ($result === \false) { - $message = \feof($socket) ? 'Connection reset by peer' : 'Unknown error'; - throw new TlsException('TLS negotiation failed: ' . $message); - } - } finally { - \restore_error_handler(); - } - } catch (TlsException $e) { - Loop::cancel($watcher); - $cancellationToken->unsubscribe($id); - $deferred->fail($e); - return; - } - // If $result is 0, just wait for the next invocation - if ($result === \true) { - Loop::cancel($watcher); - $cancellationToken->unsubscribe($id); - $deferred->resolve(); - } - }, $deferred); - return $deferred->promise(); - }); -} -/** - * Disable encryption on an existing socket stream. - * - * @param resource $socket - * - * @return Promise - * - * @internal - * @psalm-suppress InvalidReturnType - */ -function shutdownTls($socket) : Promise -{ - // note that disabling crypto *ALWAYS* returns false, immediately - // don't set _enabled to false, TLS can be setup only once - @\stream_socket_enable_crypto($socket, \false); - /** @psalm-suppress InvalidReturnStatement */ - return new Success(); -} -/** - * Normalizes "bindto" options to add a ":0" in case no port is present, otherwise PHP will silently ignore those. - * - * @param string|null $bindTo - * - * @return string|null - * - * @throws \Error If an invalid option has been passed. - */ -function normalizeBindToOption(string $bindTo = null) -{ - if ($bindTo === null) { - return null; - } - if (\preg_match("/\\[(?P[0-9a-f:]+)\\](:(?P\\d+))?\$/", $bindTo, $match)) { - $ip = $match['ip']; - $port = $match['port'] ?? 0; - if (@\inet_pton($ip) === \false) { - throw new \Error("Invalid IPv6 address: {$ip}"); - } - if ($port < 0 || $port > 65535) { - throw new \Error("Invalid port: {$port}"); - } - return "[{$ip}]:{$port}"; - } - if (\preg_match("/(?P\\d+\\.\\d+\\.\\d+\\.\\d+)(:(?P\\d+))?\$/", $bindTo, $match)) { - $ip = $match['ip']; - $port = $match['port'] ?? 0; - if (@\inet_pton($ip) === \false) { - throw new \Error("Invalid IPv4 address: {$ip}"); - } - if ($port < 0 || $port > 65535) { - throw new \Error("Invalid port: {$port}"); - } - return "{$ip}:{$port}"; - } - throw new \Error("Invalid bindTo value: {$bindTo}"); -} -/** - * Cleans up return values of stream_socket_get_name. - * - * @param string|false $address - * - * @return string|null - */ -function cleanupSocketName($address) -{ - // https://3v4l.org/5C1lo - if ($address === \false || $address === "\x00") { - return null; - } - // Check if this is an IPv6 address which includes multiple colons but no square brackets - // @see https://github.com/reactphp/socket/blob/v0.8.10/src/TcpServer.php#L179-L184 - // @license https://github.com/reactphp/socket/blob/v0.8.10/LICENSE - $pos = \strrpos($address, ':'); - if ($pos !== \false && \strpos($address, ':') < $pos && $address[0] !== '[') { - $port = \substr($address, $pos + 1); - $address = '[' . \substr($address, 0, $pos) . ']:' . $port; - } - // -- End of imported code ----- // - return $address; -} diff --git a/dependencies/amphp/socket/src/PendingAcceptError.php b/dependencies/amphp/socket/src/PendingAcceptError.php deleted file mode 100644 index dbd6d06..0000000 --- a/dependencies/amphp/socket/src/PendingAcceptError.php +++ /dev/null @@ -1,14 +0,0 @@ -tlsContext = $tlsContext; - $this->reader = new ResourceInputStream($resource, $chunkSize); - $this->writer = new ResourceOutputStream($resource, $chunkSize); - $this->remoteAddress = SocketAddress::fromPeerResource($resource); - $this->localAddress = SocketAddress::fromLocalResource($resource); - $this->tlsState = self::TLS_STATE_DISABLED; - } - /** @inheritDoc */ - public function setupTls(?CancellationToken $cancellationToken = null) : Promise - { - $resource = $this->getResource(); - if ($resource === null) { - return new Failure(new ClosedException("Can't setup TLS, because the socket has already been closed")); - } - $this->tlsState = self::TLS_STATE_SETUP_PENDING; - if ($this->tlsContext) { - $promise = Internal\setupTls($resource, $this->tlsContext->toStreamContextArray(), $cancellationToken); - } else { - $context = @\stream_context_get_options($resource); - if (empty($context['ssl'])) { - return new Failure(new TlsException("Can't enable TLS without configuration. " . "If you used Amp\\Socket\\listen(), be sure to pass a ServerTlsContext within the BindContext " . "in the second argument, otherwise set the 'ssl' context option to the PHP stream resource.")); - } - $promise = Internal\setupTls($resource, $context, $cancellationToken); - } - return call(function () use($promise) { - try { - (yield $promise); - $this->tlsState = self::TLS_STATE_ENABLED; - } catch (\Throwable $exception) { - $this->close(); - throw $exception; - } - }); - } - /** @inheritDoc */ - public function shutdownTls(?CancellationToken $cancellationToken = null) : Promise - { - if (($resource = $this->reader->getResource()) === null) { - return new Failure(new ClosedException("Can't shutdown TLS, because the socket has already been closed")); - } - $this->tlsState = self::TLS_STATE_SHUTDOWN_PENDING; - return call(function () use($resource) { - try { - (yield Internal\shutdownTls($resource)); - } finally { - $this->tlsState = self::TLS_STATE_DISABLED; - } - }); - } - /** @inheritDoc */ - public function read() : Promise - { - return $this->reader->read(); - } - /** @inheritDoc */ - public function write(string $data) : Promise - { - return $this->writer->write($data); - } - /** @inheritDoc */ - public function end(string $data = '') : Promise - { - $promise = $this->writer->end($data); - $promise->onResolve(function () { - $this->close(); - }); - return $promise; - } - /** @inheritDoc */ - public function close() : void - { - $this->reader->close(); - $this->writer->close(); - } - /** @inheritDoc */ - public function reference() : void - { - $this->reader->reference(); - } - /** @inheritDoc */ - public function unreference() : void - { - $this->reader->unreference(); - } - /** @inheritDoc */ - public function getLocalAddress() : SocketAddress - { - return $this->localAddress; - } - /** - * @inheritDoc - * - * @return resource|null - */ - public function getResource() - { - return $this->reader->getResource(); - } - /** @inheritDoc */ - public function getRemoteAddress() : SocketAddress - { - return $this->remoteAddress; - } - /** @inheritDoc */ - public function getTlsState() : int - { - return $this->tlsState; - } - /** @inheritDoc */ - public function getTlsInfo() : ?TlsInfo - { - if (null !== $this->tlsInfo) { - return $this->tlsInfo; - } - $resource = $this->getResource(); - if ($resource === null || !\is_resource($resource)) { - return null; - } - return $this->tlsInfo = TlsInfo::fromStreamResource($resource); - } - /** @inheritDoc */ - public function isClosed() : bool - { - return $this->getResource() === null; - } - /** - * @param int $chunkSize New chunk size for reading and writing. - */ - public function setChunkSize(int $chunkSize) : void - { - $this->reader->setChunkSize($chunkSize); - $this->writer->setChunkSize($chunkSize); - } -} diff --git a/dependencies/amphp/socket/src/Server.php b/dependencies/amphp/socket/src/Server.php deleted file mode 100644 index ac4fa22..0000000 --- a/dependencies/amphp/socket/src/Server.php +++ /dev/null @@ -1,179 +0,0 @@ -setupTls()` after accepting new clients. - * - * @param string $uri URI in scheme://host:port format. TCP is assumed if no scheme is present. - * @param BindContext|null $context Context options for listening. - * - * @return Server - * - * @throws SocketException If binding to the specified URI failed. - * @throws \Error If an invalid scheme is given. - */ - public static function listen(string $uri, ?BindContext $context = null) : self - { - $context = $context ?? new BindContext(); - $scheme = \strstr($uri, '://', \true); - if ($scheme === \false) { - $uri = 'tcp://' . $uri; - } elseif (!\in_array($scheme, ['tcp', 'unix'])) { - throw new \Error('Only tcp and unix schemes allowed for server creation'); - } - $streamContext = \stream_context_create($context->toStreamContextArray()); - // Error reporting suppressed since stream_socket_server() emits an E_WARNING on failure (checked below). - $server = @\stream_socket_server($uri, $errno, $errstr, \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN, $streamContext); - if (!$server || $errno) { - throw new SocketException(\sprintf('Could not create server %s: [Error: #%d] %s', $uri, $errno, $errstr), $errno); - } - return new self($server, $context->getChunkSize()); - } - /** - * @param resource $socket A bound socket server resource - * @param int $chunkSize Chunk size for the input and output stream. - * - * @throws \Error If a stream resource is not given for $socket. - */ - public function __construct($socket, int $chunkSize = ResourceSocket::DEFAULT_CHUNK_SIZE) - { - if (!\is_resource($socket) || \get_resource_type($socket) !== 'stream') { - throw new \Error('Invalid resource given to constructor!'); - } - $this->socket = $socket; - $this->chunkSize = $chunkSize; - $this->address = SocketAddress::fromLocalResource($socket); - \stream_set_blocking($this->socket, \false); - $acceptor =& $this->acceptor; - $this->watcher = Loop::onReadable($this->socket, static function ($watcher, $socket) use(&$acceptor, $chunkSize) { - // Error reporting suppressed since stream_socket_accept() emits E_WARNING on client accept failure. - if (!($client = @\stream_socket_accept($socket, 0))) { - // Timeout of 0 to be non-blocking. - return; - // Accepting client failed. - } - $deferred = $acceptor; - $acceptor = null; - \assert($deferred !== null); - $deferred->resolve(ResourceSocket::fromServerSocket($client, $chunkSize)); - /** @psalm-suppress RedundantCondition Resolution of the deferred above might accept immediately again */ - if (!$acceptor) { - Loop::disable($watcher); - } - }); - Loop::disable($this->watcher); - } - /** - * Automatically cancels the loop watcher. - */ - public function __destruct() - { - if (!$this->socket) { - return; - } - $this->free(); - } - private function free() : void - { - Loop::cancel($this->watcher); - $this->socket = null; - if ($this->acceptor) { - $this->acceptor->resolve(); - $this->acceptor = null; - } - } - /** - * @return Promise - * - * @throws PendingAcceptError If another accept request is pending. - */ - public function accept() : Promise - { - if ($this->acceptor) { - throw new PendingAcceptError(); - } - if (!$this->socket) { - return new Success(); - // Resolve with null when server is closed. - } - // Error reporting suppressed since stream_socket_accept() emits E_WARNING on client accept failure. - if ($client = @\stream_socket_accept($this->socket, 0)) { - // Timeout of 0 to be non-blocking. - return new Success(ResourceSocket::fromServerSocket($client, $this->chunkSize)); - } - $this->acceptor = new Deferred(); - Loop::enable($this->watcher); - return $this->acceptor->promise(); - } - /** - * Closes the server and stops accepting connections. Any socket clients accepted will not be closed. - */ - public function close() : void - { - if ($this->socket) { - /** @psalm-suppress InvalidPropertyAssignmentValue */ - \fclose($this->socket); - } - $this->free(); - } - /** - * @return bool - */ - public function isClosed() : bool - { - return $this->socket === null; - } - /** - * References the accept watcher. - * - * @see Loop::reference() - */ - public final function reference() : void - { - Loop::reference($this->watcher); - } - /** - * Unreferences the accept watcher. - * - * @see Loop::unreference() - */ - public final function unreference() : void - { - Loop::unreference($this->watcher); - } - /** - * @return SocketAddress - */ - public function getAddress() : SocketAddress - { - return $this->address; - } - /** - * Raw stream socket resource. - * - * @return resource|null - */ - public final function getResource() - { - return $this->socket; - } -} diff --git a/dependencies/amphp/socket/src/ServerTlsContext.php b/dependencies/amphp/socket/src/ServerTlsContext.php deleted file mode 100644 index 74c64ba..0000000 --- a/dependencies/amphp/socket/src/ServerTlsContext.php +++ /dev/null @@ -1,394 +0,0 @@ -= 70400 ? \STREAM_CRYPTO_METHOD_TLSv1_3_SERVER : 0; - private const TLS_VERSIONS = \PHP_VERSION_ID >= 70400 ? ['TLSv1.0' => self::TLSv1_0, 'TLSv1.1' => self::TLSv1_1, 'TLSv1.2' => self::TLSv1_2, 'TLSv1.3' => self::TLSv1_3] : ['TLSv1.0' => self::TLSv1_0, 'TLSv1.1' => self::TLSv1_1, 'TLSv1.2' => self::TLSv1_2]; - /** @var int */ - private $minVersion = self::TLSv1_0; - /** @var null|string */ - private $peerName; - /** @var bool */ - private $verifyPeer = \false; - /** @var int */ - private $verifyDepth = 10; - /** @var null|string */ - private $ciphers; - /** @var null|string */ - private $caFile; - /** @var null|string */ - private $caPath; - /** @var bool */ - private $capturePeer = \false; - /** @var null|Certificate */ - private $defaultCertificate; - /** @var Certificate[] */ - private $certificates = []; - /** @var int */ - private $securityLevel = 2; - /** @var string[] */ - private $alpnProtocols = []; - /** - * Minimum TLS version to negotiate. - * - * Defaults to TLS 1.0. - * - * @param int $version One of the `ServerTlsContext::TLSv*` constants. - * - * @return self Cloned, modified instance. - * @throws \Error If an invalid minimum version is given. - */ - public function withMinimumVersion(int $version) : self - { - if (!\in_array($version, self::TLS_VERSIONS, \true)) { - throw new \Error(\sprintf('Invalid minimum version, only %s allowed', \implode(', ', \array_keys(self::TLS_VERSIONS)))); - } - $clone = clone $this; - $clone->minVersion = $version; - return $clone; - } - /** - * Returns the minimum TLS version to negotiate. - * - * @return int - */ - public function getMinimumVersion() : int - { - return $this->minVersion; - } - /** - * Expected name of the peer. - * - * @param string|null $peerName - * - * @return self Cloned, modified instance. - */ - public function withPeerName(string $peerName = null) : self - { - $clone = clone $this; - $clone->peerName = $peerName; - return $clone; - } - /** - * @return null|string Expected name of the peer or `null` if such an expectation doesn't exist. - */ - public function getPeerName() : ?string - { - return $this->peerName; - } - /** - * Enable peer verification. - * - * @return self Cloned, modified instance. - */ - public function withPeerVerification() : self - { - $clone = clone $this; - $clone->verifyPeer = \true; - return $clone; - } - /** - * Disable peer verification, this is the default for servers. - * - * @return self Cloned, modified instance. - */ - public function withoutPeerVerification() : self - { - $clone = clone $this; - $clone->verifyPeer = \false; - return $clone; - } - /** - * @return bool Whether peer verification is enabled. - */ - public function hasPeerVerification() : bool - { - return $this->verifyPeer; - } - /** - * Maximum chain length the peer might present including the certificates in the local trust store. - * - * @param int $verifyDepth Maximum length of the certificate chain. - * - * @return self Cloned, modified instance. - */ - public function withVerificationDepth(int $verifyDepth) : self - { - if ($verifyDepth < 0) { - throw new \Error("Invalid verification depth ({$verifyDepth}), must be greater than or equal to 0"); - } - $clone = clone $this; - $clone->verifyDepth = $verifyDepth; - return $clone; - } - /** - * @return int Maximum length of the certificate chain. - */ - public function getVerificationDepth() : int - { - return $this->verifyDepth; - } - /** - * List of ciphers to negotiate, the server's order is always preferred. - * - * @param string|null $ciphers List of ciphers in OpenSSL's format (colon separated). - * - * @return self Cloned, modified instance. - */ - public function withCiphers(string $ciphers = null) : self - { - $clone = clone $this; - $clone->ciphers = $ciphers; - return $clone; - } - /** - * @return string List of ciphers in OpenSSL's format (colon separated). - */ - public function getCiphers() : string - { - return $this->ciphers ?? \OPENSSL_DEFAULT_STREAM_CIPHERS; - } - /** - * CAFile to check for trusted certificates. - * - * @param string|null $cafile Path to the file or `null` to unset. - * - * @return self Cloned, modified instance. - */ - public function withCaFile(string $cafile = null) : self - { - $clone = clone $this; - $clone->caFile = $cafile; - return $clone; - } - /** - * @return null|string Path to the file if one is set, otherwise `null`. - */ - public function getCaFile() : ?string - { - return $this->caFile; - } - /** - * CAPath to check for trusted certificates. - * - * @param string|null $capath Path to the file or `null` to unset. - * - * @return self Cloned, modified instance. - */ - public function withCaPath(string $capath = null) : self - { - $clone = clone $this; - $clone->caPath = $capath; - return $clone; - } - /** - * @return null|string Path to the file if one is set, otherwise `null`. - */ - public function getCaPath() : ?string - { - return $this->caPath; - } - /** - * Capture the certificates sent by the peer. - * - * Note: This is the chain as sent by the peer, NOT the verified chain. - * - * @return self Cloned, modified instance. - */ - public function withPeerCapturing() : self - { - $clone = clone $this; - $clone->capturePeer = \true; - return $clone; - } - /** - * Don't capture the certificates sent by the peer. - * - * @return self Cloned, modified instance. - */ - public function withoutPeerCapturing() : self - { - $clone = clone $this; - $clone->capturePeer = \false; - return $clone; - } - /** - * @return bool Whether to capture the certificates sent by the peer. - */ - public function hasPeerCapturing() : bool - { - return $this->capturePeer; - } - /** - * Default certificate to use in case no SNI certificate matches. - * - * @param Certificate|null $defaultCertificate - * - * @return self Cloned, modified instance. - */ - public function withDefaultCertificate(Certificate $defaultCertificate = null) : self - { - $clone = clone $this; - $clone->defaultCertificate = $defaultCertificate; - return $clone; - } - /** - * @return Certificate|null Default certificate to use in case no SNI certificate matches, or `null` if unset. - */ - public function getDefaultCertificate() : ?Certificate - { - return $this->defaultCertificate; - } - /** - * Certificates to use for the given host names. - * - * @param array $certificates Must be a associative array mapping hostnames to certificate instances. - * - * @return self Cloned, modified instance. - */ - public function withCertificates(array $certificates) : self - { - foreach ($certificates as $key => $certificate) { - if (!\is_string($key)) { - throw new \TypeError('Expected an array mapping domain names to Certificate instances'); - } - if (!$certificate instanceof Certificate) { - throw new \TypeError('Expected an array of Certificate instances'); - } - if (\PHP_VERSION_ID < 70200 && $certificate->getCertFile() !== $certificate->getKeyFile()) { - throw new \Error('Different files for cert and key are not supported on this version of PHP. ' . 'Please upgrade to PHP 7.2 or later.'); - } - } - $clone = clone $this; - $clone->certificates = $certificates; - return $clone; - } - /** - * @return array Associative array mapping hostnames to certificate instances. - */ - public function getCertificates() : array - { - return $this->certificates; - } - /** - * Security level to use. - * - * Requires OpenSSL 1.1.0 or higher. - * - * @param int $level Must be between 0 and 5. - * - * @return self Cloned, modified instance. - */ - public function withSecurityLevel(int $level) : self - { - // See https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_security_level.html - // Level 2 is not recommended, because of SHA-1 by that document, - // but SHA-1 should be phased out now on general internet use. - // We therefore default to level 2. - if ($level < 0 || $level > 5) { - throw new \Error("Invalid security level ({$level}), must be between 0 and 5."); - } - if (!hasTlsSecurityLevelSupport()) { - throw new \Error("Can't set a security level, as PHP is compiled with OpenSSL < 1.1.0."); - } - $clone = clone $this; - $clone->securityLevel = $level; - return $clone; - } - /** - * @return int Security level between 0 and 5. Always 0 for OpenSSL < 1.1.0. - */ - public function getSecurityLevel() : int - { - // 0 is equivalent to previous versions of OpenSSL and just does nothing - if (!hasTlsSecurityLevelSupport()) { - return 0; - } - return $this->securityLevel; - } - /** - * @param string[] $protocols - * - * @return self Cloned, modified instance. - */ - public function withApplicationLayerProtocols(array $protocols) : self - { - if (!hasTlsAlpnSupport()) { - throw new \Error("Can't set an application layer protocol list, as PHP is compiled with OpenSSL < 1.0.2."); - } - foreach ($protocols as $protocol) { - if (!\is_string($protocol)) { - throw new \TypeError("Protocol names must be strings"); - } - } - $clone = clone $this; - $clone->alpnProtocols = $protocols; - return $clone; - } - /** - * @return string[] - */ - public function getApplicationLayerProtocols() : array - { - return $this->alpnProtocols; - } - /** - * Converts this TLS context into PHP's equivalent stream context array. - * - * @return array Stream context array compatible with PHP's streams. - */ - public function toStreamContextArray() : array - { - $options = ['crypto_method' => $this->toStreamCryptoMethod(), 'peer_name' => $this->peerName, 'verify_peer' => $this->verifyPeer, 'verify_peer_name' => $this->verifyPeer, 'verify_depth' => $this->verifyDepth, 'ciphers' => $this->ciphers ?? \OPENSSL_DEFAULT_STREAM_CIPHERS, 'honor_cipher_order' => \true, 'single_dh_use' => \true, 'no_ticket' => \true, 'capture_peer_cert' => $this->capturePeer, 'capture_peer_chain' => $this->capturePeer]; - if (!empty($this->alpnProtocols)) { - $options['alpn_protocols'] = \implode(',', $this->alpnProtocols); - } - if ($this->defaultCertificate !== null) { - $options['local_cert'] = $this->defaultCertificate->getCertFile(); - if ($this->defaultCertificate->getCertFile() !== $this->defaultCertificate->getKeyFile()) { - $options['local_pk'] = $this->defaultCertificate->getKeyFile(); - } - } - if ($this->certificates) { - $options['SNI_server_certs'] = \array_map(static function (Certificate $certificate) { - if ($certificate->getCertFile() === $certificate->getKeyFile()) { - return $certificate->getCertFile(); - } - return ['local_cert' => $certificate->getCertFile(), 'local_pk' => $certificate->getKeyFile()]; - }, $this->certificates); - } - if ($this->caFile !== null) { - $options['cafile'] = $this->caFile; - } - if ($this->caPath !== null) { - $options['capath'] = $this->caPath; - } - if (\OPENSSL_VERSION_NUMBER >= 0x10100000) { - $options['security_level'] = $this->securityLevel; - } - return ['ssl' => $options]; - } - /** - * @return int Crypto method compatible with PHP's streams. - */ - public function toStreamCryptoMethod() : int - { - switch ($this->minVersion) { - case self::TLSv1_0: - return self::TLSv1_0 | self::TLSv1_1 | self::TLSv1_2 | self::TLSv1_3; - case self::TLSv1_1: - return self::TLSv1_1 | self::TLSv1_2 | self::TLSv1_3; - case self::TLSv1_2: - return self::TLSv1_2 | self::TLSv1_3; - case self::TLSv1_3: - return self::TLSv1_3; - default: - throw new \RuntimeException('Unknown minimum TLS version: ' . $this->minVersion); - } - } -} diff --git a/dependencies/amphp/socket/src/Socket.php b/dependencies/amphp/socket/src/Socket.php deleted file mode 100644 index 13c1aa8..0000000 --- a/dependencies/amphp/socket/src/Socket.php +++ /dev/null @@ -1,39 +0,0 @@ - 65535)) { - throw new \Error('Port number must be null or an integer between 1 and 65535'); - } - if (\strrpos($host, ':')) { - $host = \trim($host, '[]'); - } - $this->host = $host; - $this->port = $port; - } - /** - * @return string - */ - public function getHost() : string - { - return $this->host; - } - /** - * @return int - */ - public function getPort() : ?int - { - return $this->port; - } - /** - * @return string host:port formatted string. - */ - public function toString() : string - { - $host = $this->host; - if (\strrpos($host, ':')) { - $host = '[' . $host . ']'; - } - if ($this->port === null) { - return $host; - } - return $host . ':' . $this->port; - } - /** - * @see toString - * - * @return string - */ - public function __toString() : string - { - return $this->toString(); - } -} diff --git a/dependencies/amphp/socket/src/SocketException.php b/dependencies/amphp/socket/src/SocketException.php deleted file mode 100644 index 7927491..0000000 --- a/dependencies/amphp/socket/src/SocketException.php +++ /dev/null @@ -1,8 +0,0 @@ - Resolves to an EncryptableSocket instance once a connection is available. - * - * @throws SocketException - * @throws CancelledException - */ - public function checkout(string $uri, ConnectContext $context = null, CancellationToken $token = null) : Promise; - /** - * Return a previously checked-out socket to the pool so it can be reused. - * - * @param EncryptableSocket $socket Socket instance. - * - * @throws \Error If the provided resource is unknown to the pool. - */ - public function checkin(EncryptableSocket $socket) : void; - /** - * Remove the specified socket from the pool. - * - * @param EncryptableSocket $socket Socket instance. - * - * @throws \Error If the provided resource is unknown to the pool. - */ - public function clear(EncryptableSocket $socket) : void; -} diff --git a/dependencies/amphp/socket/src/StaticConnector.php b/dependencies/amphp/socket/src/StaticConnector.php deleted file mode 100644 index 50a3049..0000000 --- a/dependencies/amphp/socket/src/StaticConnector.php +++ /dev/null @@ -1,23 +0,0 @@ -uri = $uri; - $this->connector = $connector; - } - public function connect(string $uri, ?ConnectContext $context = null, ?CancellationToken $token = null) : Promise - { - return $this->connector->connect($this->uri, $context, $token); - } -} diff --git a/dependencies/amphp/socket/src/TlsException.php b/dependencies/amphp/socket/src/TlsException.php deleted file mode 100644 index 615f455..0000000 --- a/dependencies/amphp/socket/src/TlsException.php +++ /dev/null @@ -1,10 +0,0 @@ -getResource())["crypto"]`. - * @param array $tlsContext Context obtained via `stream_context_get_options($socket->getResource())["ssl"])`. - * - * @return self - */ - public static function fromMetaData(array $cryptoInfo, array $tlsContext) : self - { - if (isset($tlsContext["peer_certificate"])) { - $certificates = \array_merge([$tlsContext["peer_certificate"]], $tlsContext["peer_certificate_chain"] ?? []); - } else { - $certificates = $tlsContext["peer_certificate_chain"] ?? []; - } - return new self($cryptoInfo["protocol"], $cryptoInfo["cipher_name"], $cryptoInfo["cipher_bits"], $cryptoInfo["cipher_version"], $cryptoInfo["alpn_protocol"] ?? null, empty($certificates) ? null : $certificates); - } - private function __construct(string $version, string $cipherName, int $cipherBits, string $cipherVersion, ?string $alpnProtocol, ?array $certificates) - { - $this->version = $version; - $this->cipherName = $cipherName; - $this->cipherBits = $cipherBits; - $this->cipherVersion = $cipherVersion; - $this->alpnProtocol = $alpnProtocol; - $this->certificates = $certificates; - } - public function getVersion() : string - { - return $this->version; - } - public function getCipherName() : string - { - return $this->cipherName; - } - public function getCipherBits() : int - { - return $this->cipherBits; - } - public function getCipherVersion() : string - { - return $this->cipherVersion; - } - public function getApplicationLayerProtocol() : ?string - { - return $this->alpnProtocol; - } - /** - * @return Certificate[] - * - * @throws SocketException If peer certificates were not captured. - */ - public function getPeerCertificates() : array - { - if ($this->certificates === null) { - throw new SocketException("Peer certificates not captured; use ClientTlsContext::withPeerCapturing() to capture peer certificates"); - } - if ($this->parsedCertificates === null) { - $this->parsedCertificates = \array_map(static function ($resource) { - return new Certificate($resource); - }, $this->certificates); - } - return $this->parsedCertificates; - } -} diff --git a/dependencies/amphp/socket/src/UnlimitedSocketPool.php b/dependencies/amphp/socket/src/UnlimitedSocketPool.php deleted file mode 100644 index 03d9e24..0000000 --- a/dependencies/amphp/socket/src/UnlimitedSocketPool.php +++ /dev/null @@ -1,203 +0,0 @@ - null, 'unix' => null]; - /** @var object[][] */ - private $sockets = []; - /** @var string[] */ - private $objectIdCacheKeyMap = []; - /** @var int[] */ - private $pendingCount = []; - /** @var int */ - private $idleTimeout; - /** @var Connector */ - private $connector; - public function __construct(int $idleTimeout = 10000, ?Connector $connector = null) - { - $this->idleTimeout = $idleTimeout; - $this->connector = $connector ?? connector(); - } - /** @inheritdoc */ - public function checkout(string $uri, ConnectContext $context = null, CancellationToken $token = null) : Promise - { - // A request might already be cancelled before we reach the checkout, so do not even attempt to checkout in that - // case. The weird logic is required to throw the token's exception instead of creating a new one. - if ($token && $token->isRequested()) { - try { - $token->throwIfRequested(); - } catch (CancelledException $e) { - return new Failure($e); - } - } - [$uri, $fragment] = $this->normalizeUri($uri); - $cacheKey = $uri; - if ($context && ($tlsContext = $context->getTlsContext())) { - $cacheKey .= ' + ' . \serialize($tlsContext->toStreamContextArray()); - } - if ($fragment !== null) { - $cacheKey .= ' # ' . $fragment; - } - if (empty($this->sockets[$cacheKey])) { - return $this->checkoutNewSocket($uri, $cacheKey, $context, $token); - } - foreach ($this->sockets[$cacheKey] as $socketId => $socket) { - if (!$socket->isAvailable) { - continue; - } - if ($socket->object instanceof ResourceSocket) { - $resource = $socket->object->getResource(); - if (!$resource || !\is_resource($resource) || \feof($resource)) { - $this->clearFromId(\spl_object_hash($socket->object)); - continue; - } - } elseif ($socket->object->isClosed()) { - $this->clearFromId(\spl_object_hash($socket->object)); - continue; - } - $socket->isAvailable = \false; - if ($socket->idleWatcher !== null) { - Loop::disable($socket->idleWatcher); - } - return new Success($socket->object); - } - return $this->checkoutNewSocket($uri, $cacheKey, $context, $token); - } - /** @inheritdoc */ - public function clear(EncryptableSocket $socket) : void - { - $this->clearFromId(\spl_object_hash($socket)); - } - /** @inheritdoc */ - public function checkin(EncryptableSocket $socket) : void - { - $objectId = \spl_object_hash($socket); - if (!isset($this->objectIdCacheKeyMap[$objectId])) { - throw new \Error(\sprintf('Unknown socket: %d', $objectId)); - } - $cacheKey = $this->objectIdCacheKeyMap[$objectId]; - if ($socket instanceof ResourceSocket) { - $resource = $socket->getResource(); - if (!$resource || !\is_resource($resource) || \feof($resource)) { - $this->clearFromId(\spl_object_hash($socket)); - return; - } - } elseif ($socket->isClosed()) { - $this->clearFromId(\spl_object_hash($socket)); - return; - } - $socket = $this->sockets[$cacheKey][$objectId]; - $socket->isAvailable = \true; - if (isset($socket->idleWatcher)) { - Loop::enable($socket->idleWatcher); - } else { - $socket->idleWatcher = Loop::delay($this->idleTimeout, function () use($socket) { - $this->clearFromId(\spl_object_hash($socket->object)); - }); - Loop::unreference($socket->idleWatcher); - } - } - /** - * @param string $uri - * - * @return array - * - * @throws SocketException - */ - private function normalizeUri(string $uri) : array - { - if (\stripos($uri, 'unix://') === 0) { - return \explode('#', $uri) + [null, null]; - } - try { - $parts = Uri\parse($uri); - } catch (\Exception $exception) { - throw new SocketException('Could not parse URI', 0, $exception); - } - if ($parts['scheme'] === null) { - throw new SocketException('Invalid URI for socket pool; no scheme given'); - } - $port = $parts['port'] ?? 0; - if ($port === 0 || $parts['host'] === null) { - throw new SocketException('Invalid URI for socket pool; missing host or port'); - } - $scheme = \strtolower($parts['scheme']); - $host = \strtolower($parts['host']); - if (!\array_key_exists($scheme, self::ALLOWED_SCHEMES)) { - throw new SocketException(\sprintf("Invalid URI for socket pool; '%s' scheme not allowed - scheme must be one of %s", $scheme, \implode(', ', \array_keys(self::ALLOWED_SCHEMES)))); - } - if ($parts['query'] !== null) { - throw new SocketException('Invalid URI for socket pool; query component not allowed'); - } - if ($parts['path'] !== '') { - throw new SocketException('Invalid URI for socket pool; path component must be empty'); - } - if ($parts['user'] !== null) { - throw new SocketException('Invalid URI for socket pool; user component not allowed'); - } - return [$scheme . '://' . $host . ':' . $port, $parts['fragment']]; - } - private function checkoutNewSocket(string $uri, string $cacheKey, ConnectContext $connectContext = null, CancellationToken $token = null) : Promise - { - return call(function () use($uri, $cacheKey, $connectContext, $token) { - $this->pendingCount[$uri] = ($this->pendingCount[$uri] ?? 0) + 1; - try { - /** @var EncryptableSocket $socket */ - $socket = (yield $this->connector->connect($uri, $connectContext, $token)); - } finally { - if (--$this->pendingCount[$uri] === 0) { - unset($this->pendingCount[$uri]); - } - } - /** @psalm-suppress MissingConstructor */ - $socketEntry = new class - { - use Struct; - /** @var string */ - public $uri; - /** @var EncryptableSocket */ - public $object; - /** @var bool */ - public $isAvailable; - /** @var string|null */ - public $idleWatcher; - }; - $socketEntry->uri = $uri; - $socketEntry->isAvailable = \false; - $socketEntry->object = $socket; - $objectId = \spl_object_hash($socket); - $this->sockets[$cacheKey][$objectId] = $socketEntry; - $this->objectIdCacheKeyMap[$objectId] = $cacheKey; - return $socket; - }); - } - private function clearFromId(string $objectId) : void - { - if (!isset($this->objectIdCacheKeyMap[$objectId])) { - throw new \Error(\sprintf('Unknown socket: %d', $objectId)); - } - $cacheKey = $this->objectIdCacheKeyMap[$objectId]; - $socket = $this->sockets[$cacheKey][$objectId]; - if ($socket->idleWatcher) { - Loop::cancel($socket->idleWatcher); - } - unset($this->sockets[$cacheKey][$objectId], $this->objectIdCacheKeyMap[$objectId]); - if (empty($this->sockets[$cacheKey])) { - unset($this->sockets[$cacheKey]); - } - } -} diff --git a/dependencies/amphp/socket/src/functions.php b/dependencies/amphp/socket/src/functions.php deleted file mode 100644 index 8dcb1d3..0000000 --- a/dependencies/amphp/socket/src/functions.php +++ /dev/null @@ -1,97 +0,0 @@ -setupTls()` after accepting new clients. - * - * @param string $uri URI in scheme://host:port format. TCP is assumed if no scheme is present. - * @param BindContext|null $context Context options for listening. - * - * @return Server - * - * @throws SocketException If binding to the specified URI failed. - * @throws \Error If an invalid scheme is given. - * @see Server::listen() - * - * @deprecated Use Server::listen() instead. - */ -function listen(string $uri, ?BindContext $context = null) : Server -{ - return Server::listen($uri, $context); -} -/** - * Set or access the global socket Connector instance. - * - * @param Connector|null $connector - * - * @return Connector - */ -function connector(Connector $connector = null) : Connector -{ - if ($connector === null) { - if ($connector = Loop::getState(LOOP_CONNECTOR_IDENTIFIER)) { - return $connector; - } - $connector = new DnsConnector(); - } - Loop::setState(LOOP_CONNECTOR_IDENTIFIER, $connector); - return $connector; -} -/** - * Asynchronously establish a socket connection to the specified URI. - * - * @param string $uri URI in scheme://host:port format. TCP is assumed if no scheme is present. - * @param ConnectContext $context Socket connect context to use when connecting. - * @param CancellationToken|null $token - * - * @return Promise - * - * @throws ConnectException - * @throws CancelledException - */ -function connect(string $uri, ConnectContext $context = null, CancellationToken $token = null) : Promise -{ - return connector()->connect($uri, $context, $token); -} -/** - * Returns a pair of connected stream socket resources. - * - * @return ResourceSocket[] Pair of socket resources. - * - * @throws SocketException If creating the sockets fails. - */ -function createPair() : array -{ - try { - \set_error_handler(static function (int $errno, string $errstr) { - throw new SocketException(\sprintf('Failed to create socket pair. Errno: %d; %s', $errno, $errstr)); - }); - $sockets = \stream_socket_pair(\stripos(\PHP_OS, 'win') === 0 ? \STREAM_PF_INET : \STREAM_PF_UNIX, \STREAM_SOCK_STREAM, \STREAM_IPPROTO_IP); - if ($sockets === \false) { - throw new SocketException('Failed to create socket pair.'); - } - } finally { - \restore_error_handler(); - } - return [ResourceSocket::fromClientSocket($sockets[0]), ResourceSocket::fromClientSocket($sockets[1])]; -} -/** - * @see https://wiki.openssl.org/index.php/Manual:OPENSSL_VERSION_NUMBER(3) - * @return bool - */ -function hasTlsAlpnSupport() : bool -{ - return \defined('OPENSSL_VERSION_NUMBER') && \OPENSSL_VERSION_NUMBER >= 0x10002000; -} -function hasTlsSecurityLevelSupport() : bool -{ - return \defined('OPENSSL_VERSION_NUMBER') && \OPENSSL_VERSION_NUMBER >= 0x10100000; -} diff --git a/dependencies/amphp/sync/composer-require-check.json b/dependencies/amphp/sync/composer-require-check.json deleted file mode 100644 index b91af80..0000000 --- a/dependencies/amphp/sync/composer-require-check.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "symbol-whitelist": [ - "null", - "true", - "false", - "static", - "self", - "parent", - "array", - "string", - "int", - "float", - "bool", - "iterable", - "callable", - "void", - "object", - "MSG_EAGAIN", - "MSG_ENOMSG", - "msg_get_queue", - "MSG_IPC_NOWAIT", - "msg_queue_exists", - "msg_receive", - "msg_remove_queue", - "msg_send", - "msg_set_queue", - "msg_stat_queue", - "Threaded", - "transform", - "SysvMessageQueue" - ], - "php-core-extensions": [ - "Core", - "date", - "pcre", - "Phar", - "Reflection", - "SPL", - "standard" - ] -} diff --git a/dependencies/amphp/sync/src/Barrier.php b/dependencies/amphp/sync/src/Barrier.php deleted file mode 100644 index 851af76..0000000 --- a/dependencies/amphp/sync/src/Barrier.php +++ /dev/null @@ -1,71 +0,0 @@ -arrive(); - * $barrier->arrive(); // promise returned from Barrier::await() is now resolved - * - * yield $barrier->await(); - * ``` - */ -final class Barrier -{ - /** @var int */ - private $count; - /** @var Deferred */ - private $deferred; - public function __construct(int $count) - { - if ($count < 1) { - throw new \Error('Count must be positive, got ' . $count); - } - $this->count = $count; - $this->deferred = new Deferred(); - } - public function getCount() : int - { - return $this->count; - } - public function arrive(int $count = 1) : void - { - if ($count < 1) { - throw new \Error('Count must be at least 1, got ' . $count); - } - if ($count > $this->count) { - throw new \Error('Count cannot be greater than remaining count: ' . $count . ' > ' . $this->count); - } - $this->count -= $count; - if ($this->count === 0) { - $this->deferred->resolve(); - } - } - public function register(int $count = 1) : void - { - if ($count < 1) { - throw new \Error('Count must be at least 1, got ' . $count); - } - if ($this->count === 0) { - throw new \Error('Can\'t increase count, because the barrier already broke'); - } - $this->count += $count; - } - public function await() : Promise - { - return $this->deferred->promise(); - } -} diff --git a/dependencies/amphp/sync/src/ConcurrentIterator/functions.php b/dependencies/amphp/sync/src/ConcurrentIterator/functions.php deleted file mode 100644 index 24e1461..0000000 --- a/dependencies/amphp/sync/src/ConcurrentIterator/functions.php +++ /dev/null @@ -1,146 +0,0 @@ -getId()]); - $lock->release(); - $barrier->arrive(); - } - }; - while ((yield $iterator->advance())) { - if ($error) { - break; - } - /** @var Lock $lock */ - $lock = (yield $semaphore->acquire()); - if ($gc || isset($locks[$lock->getId()])) { - // Throwing here causes a segfault on PHP 7.3 - return; - // throw new CancelledException; // producer and locks have been GCed - } - $locks[$lock->getId()] = \true; - $barrier->register(); - asyncCall($processor, $lock, $iterator->getCurrent()); - } - $barrier->arrive(); - // remove dummy item - (yield $barrier->await()); - if ($error) { - throw $error; - } - }); -} -/** - * Concurrently map all iterator values using {@code $processor}. - * - * The order of the items in the resulting iterator is not guaranteed in any way. - * - * @param Iterator $iterator Values to map. - * @param Semaphore $semaphore Semaphore limiting the concurrency, e.g. {@code LocalSemaphore} - * @param callable $processor Processing callable, which is run as coroutine. It should not throw any errors, - * otherwise the entire operation is aborted. - * - * @return Iterator Mapped values. - */ -function map(Iterator $iterator, Semaphore $semaphore, callable $processor) : Iterator -{ - $processor = coroutine($processor); - return transform($iterator, $semaphore, static function ($value, callable $emit) use($processor) { - $value = (yield $processor($value)); - (yield $emit($value)); - }); -} -/** - * Concurrently filter all iterator values using {@code $filter}. - * - * The order of the items in the resulting iterator is not guaranteed in any way. - * - * @param Iterator $iterator Values to map. - * @param Semaphore $semaphore Semaphore limiting the concurrency, e.g. {@code LocalSemaphore} - * @param callable $filter Processing callable, which is run as coroutine. It should not throw any errors, - * otherwise the entire operation is aborted. Must resolve to a boolean, true to keep values in the resulting - * iterator. - * - * @return Iterator Values, where {@code $filter} resolved to {@code true}. - */ -function filter(Iterator $iterator, Semaphore $semaphore, callable $filter) : Iterator -{ - $filter = coroutine($filter); - return transform($iterator, $semaphore, static function ($value, callable $emit) use($filter) { - $keep = (yield $filter($value)); - if (!\is_bool($keep)) { - throw new \TypeError(__NAMESPACE__ . '\\filter\'s callable must resolve to a boolean value, got ' . \gettype($keep)); - } - if ($keep) { - (yield $emit($value)); - } - }); -} -/** - * Concurrently invoke a callback on all iterator values using {@code $processor}. - * - * @param Iterator $iterator Values to act on. - * @param Semaphore $semaphore Semaphore limiting the concurrency, e.g. {@code LocalSemaphore} - * @param callable $processor Processing callable, which is run as coroutine. It should not throw any errors, - * otherwise the entire operation is aborted. - * - * @return Promise - */ -function each(Iterator $iterator, Semaphore $semaphore, callable $processor) : Promise -{ - $processor = coroutine($processor); - $iterator = transform($iterator, $semaphore, static function ($value, callable $emit) use($processor) { - (yield $processor($value)); - (yield $emit(null)); - }); - // Use Amp\Iterator\discard in the future - return call(static function () use($iterator) { - $count = 0; - while ((yield $iterator->advance())) { - $count++; - } - return $count; - }); -} diff --git a/dependencies/amphp/sync/src/FileMutex.php b/dependencies/amphp/sync/src/FileMutex.php deleted file mode 100644 index a703297..0000000 --- a/dependencies/amphp/sync/src/FileMutex.php +++ /dev/null @@ -1,73 +0,0 @@ -fileName = $fileName; - } - /** - * {@inheritdoc} - */ - public function acquire() : Promise - { - return new Coroutine($this->doAcquire()); - } - /** - * @coroutine - * - * @return \Generator - */ - private function doAcquire() : \Generator - { - // Try to create the lock file. If the file already exists, someone else - // has the lock, so set an asynchronous timer and try again. - while (($handle = @\fopen($this->fileName, 'x')) === \false) { - (yield new Delayed(self::LATENCY_TIMEOUT)); - } - // Return a lock object that can be used to release the lock on the mutex. - $lock = new Lock(0, function () : void { - $this->release(); - }); - \fclose($handle); - return $lock; - } - /** - * Releases the lock on the mutex. - * - * @throws SyncException If the unlock operation failed. - */ - protected function release() - { - $success = @\unlink($this->fileName); - if (!$success) { - throw new SyncException('Failed to unlock the mutex file.'); - } - } -} diff --git a/dependencies/amphp/sync/src/Internal/MutexStorage.php b/dependencies/amphp/sync/src/Internal/MutexStorage.php deleted file mode 100644 index 2c73475..0000000 --- a/dependencies/amphp/sync/src/Internal/MutexStorage.php +++ /dev/null @@ -1,33 +0,0 @@ -locked) { - return \true; - } - $this->locked = \true; - return \false; - }; - while ($this->locked || $this->synchronized($tsl)) { - (yield new Delayed(self::LATENCY_TIMEOUT)); - } - return new Lock(0, function () : void { - $this->locked = \false; - }); - }); - } -} diff --git a/dependencies/amphp/sync/src/Internal/SemaphoreStorage.php b/dependencies/amphp/sync/src/Internal/SemaphoreStorage.php deleted file mode 100644 index bb344e4..0000000 --- a/dependencies/amphp/sync/src/Internal/SemaphoreStorage.php +++ /dev/null @@ -1,55 +0,0 @@ -count()) { - return null; - } - return $this->shift(); - }; - while (!$this->count() || ($id = $this->synchronized($tsl)) === null) { - (yield new Delayed(self::LATENCY_TIMEOUT)); - } - return new Lock($id, function (Lock $lock) : void { - $id = $lock->getId(); - $this->synchronized(function () use($id) { - $this[] = $id; - }); - }); - }); - } -} diff --git a/dependencies/amphp/sync/src/KeyedMutex.php b/dependencies/amphp/sync/src/KeyedMutex.php deleted file mode 100644 index 4f4004b..0000000 --- a/dependencies/amphp/sync/src/KeyedMutex.php +++ /dev/null @@ -1,23 +0,0 @@ - Resolves with a lock object with an ID of 0. May fail with a SyncException - * if an error occurs when attempting to obtain the lock (e.g. a shared memory segment closed). - */ - public function acquire(string $key) : Promise; -} diff --git a/dependencies/amphp/sync/src/KeyedSemaphore.php b/dependencies/amphp/sync/src/KeyedSemaphore.php deleted file mode 100644 index 2b8cb07..0000000 --- a/dependencies/amphp/sync/src/KeyedSemaphore.php +++ /dev/null @@ -1,24 +0,0 @@ - Resolves with an integer keyed lock object. Identifiers returned by the - * locks should be 0-indexed. Releasing an identifier MUST make that same identifier available. May fail with - * a SyncException if an error occurs when attempting to obtain the lock (e.g. a shared memory segment closed). - */ - public function acquire(string $key) : Promise; -} diff --git a/dependencies/amphp/sync/src/LocalKeyedMutex.php b/dependencies/amphp/sync/src/LocalKeyedMutex.php deleted file mode 100644 index e6f0f70..0000000 --- a/dependencies/amphp/sync/src/LocalKeyedMutex.php +++ /dev/null @@ -1,31 +0,0 @@ -mutex[$key])) { - $this->mutex[$key] = new LocalMutex(); - $this->locks[$key] = 0; - } - return call(function () use($key) { - $this->locks[$key]++; - /** @var Lock $lock */ - $lock = (yield $this->mutex[$key]->acquire()); - return new Lock(0, function () use($lock, $key) { - if (--$this->locks[$key] === 0) { - unset($this->mutex[$key], $this->locks[$key]); - } - $lock->release(); - }); - }); - } -} diff --git a/dependencies/amphp/sync/src/LocalKeyedSemaphore.php b/dependencies/amphp/sync/src/LocalKeyedSemaphore.php deleted file mode 100644 index 23a468a..0000000 --- a/dependencies/amphp/sync/src/LocalKeyedSemaphore.php +++ /dev/null @@ -1,37 +0,0 @@ -maxLocks = $maxLocks; - } - public function acquire(string $key) : Promise - { - if (!isset($this->semaphore[$key])) { - $this->semaphore[$key] = new LocalSemaphore($this->maxLocks); - $this->locks[$key] = 0; - } - return call(function () use($key) { - $this->locks[$key]++; - /** @var Lock $lock */ - $lock = (yield $this->semaphore[$key]->acquire()); - return new Lock(0, function () use($lock, $key) { - if (--$this->locks[$key] === 0) { - unset($this->semaphore[$key], $this->locks[$key]); - } - $lock->release(); - }); - }); - } -} diff --git a/dependencies/amphp/sync/src/LocalMutex.php b/dependencies/amphp/sync/src/LocalMutex.php deleted file mode 100644 index ff1c92a..0000000 --- a/dependencies/amphp/sync/src/LocalMutex.php +++ /dev/null @@ -1,36 +0,0 @@ -locked) { - $this->locked = \true; - return new Success(new Lock(0, \Closure::fromCallable([$this, 'release']))); - } - $this->queue[] = $deferred = new Deferred(); - return $deferred->promise(); - } - private function release() : void - { - if (!empty($this->queue)) { - $deferred = \array_shift($this->queue); - $deferred->resolve(new Lock(0, \Closure::fromCallable([$this, 'release']))); - return; - } - $this->locked = \false; - } -} diff --git a/dependencies/amphp/sync/src/LocalSemaphore.php b/dependencies/amphp/sync/src/LocalSemaphore.php deleted file mode 100644 index eb69088..0000000 --- a/dependencies/amphp/sync/src/LocalSemaphore.php +++ /dev/null @@ -1,43 +0,0 @@ -locks = \range(0, $maxLocks - 1); - } - /** {@inheritdoc} */ - public function acquire() : Promise - { - if (!empty($this->locks)) { - return new Success(new Lock(\array_shift($this->locks), \Closure::fromCallable([$this, 'release']))); - } - $this->queue[] = $deferred = new Deferred(); - return $deferred->promise(); - } - private function release(Lock $lock) : void - { - $id = $lock->getId(); - if (!empty($this->queue)) { - $deferred = \array_shift($this->queue); - $deferred->resolve(new Lock($id, \Closure::fromCallable([$this, 'release']))); - return; - } - $this->locks[] = $id; - } -} diff --git a/dependencies/amphp/sync/src/Lock.php b/dependencies/amphp/sync/src/Lock.php deleted file mode 100644 index f2351c9..0000000 --- a/dependencies/amphp/sync/src/Lock.php +++ /dev/null @@ -1,68 +0,0 @@ -id = $id; - $this->releaser = $releaser; - } - /** - * Checks if the lock has already been released. - * - * @return bool True if the lock has already been released, otherwise false. - */ - public function isReleased() : bool - { - return !$this->releaser; - } - /** - * @return int Lock identifier. - */ - public function getId() : int - { - return $this->id; - } - /** - * Releases the lock. No-op if the lock has already been released. - */ - public function release() - { - if (!$this->releaser) { - return; - } - // Invoke the releaser function given to us by the synchronization source - // to release the lock. - $releaser = $this->releaser; - $this->releaser = null; - $releaser($this); - } - /** - * Releases the lock when there are no more references to it. - */ - public function __destruct() - { - if (!$this->isReleased()) { - $this->release(); - } - } -} diff --git a/dependencies/amphp/sync/src/Mutex.php b/dependencies/amphp/sync/src/Mutex.php deleted file mode 100644 index 5cfbd65..0000000 --- a/dependencies/amphp/sync/src/Mutex.php +++ /dev/null @@ -1,21 +0,0 @@ - Resolves with a lock object with an ID of 0. May fail with a SyncException - * if an error occurs when attempting to obtain the lock (e.g. a shared memory segment closed). - */ - public function acquire() : Promise; -} diff --git a/dependencies/amphp/sync/src/PosixSemaphore.php b/dependencies/amphp/sync/src/PosixSemaphore.php deleted file mode 100644 index 515397b..0000000 --- a/dependencies/amphp/sync/src/PosixSemaphore.php +++ /dev/null @@ -1,211 +0,0 @@ -init($maxLocks, $permissions); - return $semaphore; - } - /** - * @param string $id The unique name of the semaphore to use. - * - * @return \Amp\Sync\PosixSemaphore - */ - public static function use(string $id) : self - { - $semaphore = new self($id); - $semaphore->open(); - return $semaphore; - } - /** - * @param string $id - * - * @throws \Error If the sysvmsg extension is not loaded. - */ - private function __construct(string $id) - { - if (!\extension_loaded("sysvmsg")) { - throw new \Error(__CLASS__ . " requires the sysvmsg extension."); - } - $this->id = $id; - $this->key = self::makeKey($this->id); - } - /** - * Private method to prevent cloning. - */ - private function __clone() - { - } - /** - * Prevent serialization. - */ - public function __sleep() - { - throw new \Error('A semaphore cannot be serialized!'); - } - public function getId() : string - { - return $this->id; - } - private function open() : void - { - if (!\msg_queue_exists($this->key)) { - throw new SyncException('No semaphore with that ID found'); - } - $this->queue = \msg_get_queue($this->key); - if (!$this->queue) { - throw new SyncException('Failed to open the semaphore.'); - } - } - /** - * @param int $maxLocks The maximum number of locks that can be acquired from the semaphore. - * @param int $permissions Permissions to access the semaphore. - * - * @throws SyncException If the semaphore could not be created due to an internal error. - */ - private function init(int $maxLocks, int $permissions) : void - { - if (\msg_queue_exists($this->key)) { - throw new SyncException('A semaphore with that ID already exists'); - } - $this->queue = \msg_get_queue($this->key, $permissions); - if (!$this->queue) { - throw new SyncException('Failed to create the semaphore.'); - } - $this->initializer = \getmypid(); - // Fill the semaphore with locks. - while (--$maxLocks >= 0) { - $this->release($maxLocks); - } - } - /** - * Gets the access permissions of the semaphore. - * - * @return int A permissions mode. - */ - public function getPermissions() : int - { - $stat = \msg_stat_queue($this->queue); - return $stat['msg_perm.mode']; - } - /** - * Sets the access permissions of the semaphore. - * - * The current user must have access to the semaphore in order to change the permissions. - * - * @param int $mode A permissions mode to set. - * - * @throws SyncException If the operation failed. - */ - public function setPermissions(int $mode) - { - if (!\msg_set_queue($this->queue, ['msg_perm.mode' => $mode])) { - throw new SyncException('Failed to change the semaphore permissions.'); - } - } - public function acquire() : Promise - { - return new Coroutine($this->doAcquire()); - } - /** - * {@inheritdoc} - */ - private function doAcquire() : \Generator - { - do { - // Attempt to acquire a lock from the semaphore. - if (@\msg_receive($this->queue, 0, $type, 1, $id, \false, \MSG_IPC_NOWAIT, $errno)) { - // A free lock was found, so resolve with a lock object that can - // be used to release the lock. - return new Lock(\unpack("C", $id)[1], function (Lock $lock) { - $this->release($lock->getId()); - }); - } - // Check for unusual errors. - if ($errno !== \MSG_ENOMSG) { - throw new SyncException(\sprintf('Failed to acquire a lock; errno: %d', $errno)); - } - } while ((yield new Delayed(self::LATENCY_TIMEOUT, \true))); - } - /** - * Removes the semaphore if it still exists. - * - * @throws SyncException If the operation failed. - */ - public function __destruct() - { - if ($this->initializer === 0 || $this->initializer !== \getmypid()) { - return; - } - if (\PHP_VERSION_ID < 80000 && (!\is_resource($this->queue) || !\msg_queue_exists($this->key))) { - return; - } - if (\PHP_VERSION_ID >= 80000 && (!$this->queue instanceof \SysvMessageQueue || !\msg_queue_exists($this->key))) { - return; - } - \msg_remove_queue($this->queue); - } - /** - * Releases a lock from the semaphore. - * - * @param int $id Lock identifier. - * - * @throws SyncException If the operation failed. - */ - protected function release(int $id) - { - if (!$this->queue) { - return; - // Queue already destroyed. - } - // Call send in non-blocking mode. If the call fails because the queue - // is full, then the number of locks configured is too large. - if (!@\msg_send($this->queue, 1, \pack("C", $id), \false, \false, $errno)) { - if ($errno === \MSG_EAGAIN) { - throw new SyncException('The semaphore size is larger than the system allows.'); - } - throw new SyncException('Failed to release the lock.'); - } - } - private static function makeKey(string $id) : int - { - return \abs(\unpack("l", \md5($id, \true))[1]); - } -} diff --git a/dependencies/amphp/sync/src/PrefixedKeyedMutex.php b/dependencies/amphp/sync/src/PrefixedKeyedMutex.php deleted file mode 100644 index 2efc189..0000000 --- a/dependencies/amphp/sync/src/PrefixedKeyedMutex.php +++ /dev/null @@ -1,21 +0,0 @@ -mutex = $mutex; - $this->prefix = $prefix; - } - public function acquire(string $key) : Promise - { - return $this->mutex->acquire($this->prefix . $key); - } -} diff --git a/dependencies/amphp/sync/src/PrefixedKeyedSemaphore.php b/dependencies/amphp/sync/src/PrefixedKeyedSemaphore.php deleted file mode 100644 index 61a89b7..0000000 --- a/dependencies/amphp/sync/src/PrefixedKeyedSemaphore.php +++ /dev/null @@ -1,21 +0,0 @@ -semaphore = $semaphore; - $this->prefix = $prefix; - } - public function acquire(string $key) : Promise - { - return $this->semaphore->acquire($this->prefix . $key); - } -} diff --git a/dependencies/amphp/sync/src/Semaphore.php b/dependencies/amphp/sync/src/Semaphore.php deleted file mode 100644 index 5c89ef1..0000000 --- a/dependencies/amphp/sync/src/Semaphore.php +++ /dev/null @@ -1,22 +0,0 @@ - Resolves with an integer keyed lock object. Identifiers returned by the - * locks should be 0-indexed. Releasing an identifier MUST make that same identifier available. May fail with - * a SyncException if an error occurs when attempting to obtain the lock (e.g. a shared memory segment closed). - */ - public function acquire() : Promise; -} diff --git a/dependencies/amphp/sync/src/SemaphoreMutex.php b/dependencies/amphp/sync/src/SemaphoreMutex.php deleted file mode 100644 index fefd2eb..0000000 --- a/dependencies/amphp/sync/src/SemaphoreMutex.php +++ /dev/null @@ -1,31 +0,0 @@ -semaphore = $semaphore; - } - /** {@inheritdoc} */ - public function acquire() : Promise - { - return call(function () : \Generator { - /** @var \Amp\Sync\Lock $lock */ - $lock = (yield $this->semaphore->acquire()); - if ($lock->getId() !== 0) { - $lock->release(); - throw new \Error("Cannot use a semaphore with more than a single lock"); - } - return $lock; - }); - } -} diff --git a/dependencies/amphp/sync/src/StaticKeyMutex.php b/dependencies/amphp/sync/src/StaticKeyMutex.php deleted file mode 100644 index 6b3d608..0000000 --- a/dependencies/amphp/sync/src/StaticKeyMutex.php +++ /dev/null @@ -1,21 +0,0 @@ -mutex = $mutex; - $this->key = $key; - } - public function acquire() : Promise - { - return $this->mutex->acquire($this->key); - } -} diff --git a/dependencies/amphp/sync/src/SyncException.php b/dependencies/amphp/sync/src/SyncException.php deleted file mode 100644 index c605631..0000000 --- a/dependencies/amphp/sync/src/SyncException.php +++ /dev/null @@ -1,7 +0,0 @@ -mutex = new Internal\MutexStorage(); - } - /** - * {@inheritdoc} - */ - public function acquire() : Promise - { - return $this->mutex->acquire(); - } -} diff --git a/dependencies/amphp/sync/src/ThreadedSemaphore.php b/dependencies/amphp/sync/src/ThreadedSemaphore.php deleted file mode 100644 index d56393a..0000000 --- a/dependencies/amphp/sync/src/ThreadedSemaphore.php +++ /dev/null @@ -1,39 +0,0 @@ -semaphore = new Internal\SemaphoreStorage($locks); - } - /** - * {@inheritdoc} - */ - public function acquire() : Promise - { - return $this->semaphore->acquire(); - } -} diff --git a/dependencies/amphp/sync/src/functions.php b/dependencies/amphp/sync/src/functions.php deleted file mode 100644 index 905fdb0..0000000 --- a/dependencies/amphp/sync/src/functions.php +++ /dev/null @@ -1,29 +0,0 @@ -acquire()); - try { - return (yield call($callback, ...$args)); - } finally { - $lock->release(); - } - }); -} diff --git a/dependencies/amphp/windows-registry/lib/KeyNotFoundException.php b/dependencies/amphp/windows-registry/lib/KeyNotFoundException.php deleted file mode 100644 index 707f334..0000000 --- a/dependencies/amphp/windows-registry/lib/KeyNotFoundException.php +++ /dev/null @@ -1,7 +0,0 @@ -query($key)); - $lines = \array_filter($lines, function ($line) { - return '' !== $line && $line[0] === ' '; - }); - $values = \array_map(function ($line) { - return \preg_split("(\\s+)", \ltrim($line), 3); - }, $lines); - $foundValue = null; - foreach ($values as $v) { - if ($v[0] === $value) { - if (\count($v) >= 3) { - return $v[2]; - } - $foundValue = $v; - } - } - if ($foundValue) { - throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' was found, but could not be read correctly, got " . \var_export($foundValue, \true)); - } - throw new KeyNotFoundException("Windows registry key '{$key}\\{$value}' not found."); - }); - } - public function listKeys(string $key) : Promise - { - return call(function () use($key) { - $lines = (yield $this->query($key)); - $lines = \array_filter($lines, function ($line) { - return '' !== $line && $line[0] !== ' '; - }); - return $lines; - }); - } - private function query(string $key) : Promise - { - return call(function () use($key) { - if (0 !== \stripos(\PHP_OS, 'WIN')) { - throw new \Error('Not running on Windows.'); - } - $key = \strtr($key, '/', "\\"); - $cmd = \sprintf('reg query %s', \escapeshellarg($key)); - $process = new Process($cmd); - (yield $process->start()); - $stdout = (yield ByteStream\buffer($process->getStdout())); - $code = (yield $process->join()); - if ($code !== 0) { - throw new KeyNotFoundException("Windows registry key '{$key}' not found."); - } - return \explode("\n", \str_replace("\r", '', $stdout)); - }); - } -} diff --git a/dependencies/autoload.php b/dependencies/autoload.php deleted file mode 100644 index 4617f1b..0000000 --- a/dependencies/autoload.php +++ /dev/null @@ -1,25 +0,0 @@ -{$key}; - } - // Return null if not exists - return null; - } - /** - * Converts the given object to an array. - * - * @since 1.0.0 - * - * @return array Array version of the given object. - */ - public function to_array() - { - return \get_object_vars($this); - } - /** Protected *************************************************************/ - /** - * Maybe append the prefix to string. - * - * @since 1.0.0 - * - * @param string $string - * @param string $sep - * @return string - */ - protected function apply_prefix($string = '', $sep = '_') - { - return !empty($this->prefix) ? "{$this->prefix}{$sep}{$string}" : $string; - } - /** - * Return the first letters of a string of words with a separator. - * - * Used primarily to guess at table aliases when none is manually set. - * - * Applies the following formatting to a string: - * - Trim whitespace - * - No accents - * - No trailing underscores - * - * @since 1.0.0 - * - * @param string $string - * @param string $sep - * @return string - */ - protected function first_letters($string = '', $sep = '_') - { - // Set empty default return value - $retval = ''; - // Bail if empty or not a string - if (empty($string) || !\is_string($string)) { - return $retval; - } - // Trim spaces off the ends - $unspace = \trim($string); - // Only non-accented table names (avoid truncation) - $accents = remove_accents($unspace); - // Only lowercase letters are allowed - $lower = \strtolower($accents); - // Explode into parts - $parts = \explode($sep, $lower); - // Loop through parts and concatenate the first letters together - foreach ($parts as $part) { - $retval .= \substr($part, 0, 1); - } - // Return the result - return $retval; - } - /** - * Sanitize a table name string. - * - * Used to make sure that a table name value meets MySQL expectations. - * - * Applies the following formatting to a string: - * - Trim whitespace - * - No accents - * - No special characters - * - No hyphens - * - No double underscores - * - No trailing underscores - * - * @since 1.0.0 - * - * @param string $name The name of the database table - * - * @return string Sanitized database table name - */ - protected function sanitize_table_name($name = '') - { - // Bail if empty or not a string - if (empty($name) || !\is_string($name)) { - return \false; - } - // Trim spaces off the ends - $unspace = \trim($name); - // Only non-accented table names (avoid truncation) - $accents = remove_accents($unspace); - // Only lowercase characters, hyphens, and dashes (avoid index corruption) - $lower = sanitize_key($accents); - // Replace hyphens with single underscores - $under = \str_replace('-', '_', $lower); - // Single underscores only - $single = \str_replace('__', '_', $under); - // Remove trailing underscores - $clean = \trim($single, '_'); - // Bail if table name was garbaged - if (empty($clean)) { - return \false; - } - // Return the cleaned table name - return $clean; - } - /** - * Set class variables from arguments. - * - * @since 1.0.0 - * @param array $args - */ - protected function set_vars($args = array()) - { - // Bail if empty or not an array - if (empty($args)) { - return; - } - // Cast to an array - if (!\is_array($args)) { - $args = (array) $args; - } - // Set all properties - foreach ($args as $key => $value) { - $this->{$key} = $value; - } - } - /** - * Return the global database interface. - * - * See: https://core.trac.wordpress.org/ticket/31556 - * - * @since 1.0.0 - * - * @return \wpdb Database interface, or False if not set - */ - protected function get_db() - { - // Default database return value (might change) - $retval = \false; - // Look for a commonly used global database interface - if (isset($GLOBALS[$this->db_global])) { - $retval = $GLOBALS[$this->db_global]; - } - /* - * Developer note: - * - * It should be impossible for a database table to be interacted with - * before the primary database interface is setup. - * - * However, because applications are complicated, it is unsafe to assume - * anything, so this silently returns false instead of halting everything. - * - * If you are here because this method is returning false for you, that - * means the database table is being invoked too early in the lifecycle - * of the application. - * - * In WordPress, that means before the $wpdb global is created; in other - * environments, you will need to adjust accordingly. - */ - // Return the database interface - return $retval; - } - /** - * Check if an operation succeeded. - * - * @since 1.0.0 - * - * @param mixed $result - * @return bool - */ - protected function is_success($result = \false) - { - // Bail if no row exists - if (empty($result)) { - $retval = \false; - // Bail if an error occurred - } elseif (is_wp_error($result)) { - $this->last_error = $result; - $retval = \false; - // No errors - } else { - $retval = \true; - } - // Return the result - return (bool) $retval; - } -} diff --git a/dependencies/berlindb/core/src/Database/Column.php b/dependencies/berlindb/core/src/Database/Column.php deleted file mode 100644 index a41f13c..0000000 --- a/dependencies/berlindb/core/src/Database/Column.php +++ /dev/null @@ -1,803 +0,0 @@ -parse_args($args); - // Maybe set variables from arguments - if (!empty($r)) { - $this->set_vars($r); - } - } - /** Argument Handlers *****************************************************/ - /** - * Parse column arguments - * - * @since 1.0.0 - * @param array $args Default empty array. - * @return array - */ - private function parse_args($args = array()) - { - // Parse arguments - $r = wp_parse_args($args, array( - // Table - 'name' => '', - 'type' => '', - 'length' => '', - 'unsigned' => \false, - 'zerofill' => \false, - 'binary' => \false, - 'allow_null' => \false, - 'default' => '', - 'extra' => '', - 'encoding' => $this->get_db()->charset, - 'collation' => $this->get_db()->collate, - 'comment' => '', - // Query - 'pattern' => \false, - 'searchable' => \false, - 'sortable' => \false, - 'date_query' => \false, - 'transition' => \false, - 'in' => \true, - 'not_in' => \true, - // Special - 'primary' => \false, - 'created' => \false, - 'modified' => \false, - 'uuid' => \false, - // Cache - 'cache_key' => \false, - // Validation - 'validate' => '', - // Capabilities - 'caps' => array(), - // Backwards Compatibility - 'aliases' => array(), - // Column Relationships - 'relationships' => array(), - )); - // Force some arguments for special column types - $r = $this->special_args($r); - // Set the args before they are sanitized - $this->set_vars($r); - // Return array - return $this->validate_args($r); - } - /** - * Validate arguments after they are parsed. - * - * @since 1.0.0 - * @param array $args Default empty array. - * @return array - */ - private function validate_args($args = array()) - { - // Sanitization callbacks - $callbacks = array('name' => 'sanitize_key', 'type' => 'strtoupper', 'length' => 'intval', 'unsigned' => 'wp_validate_boolean', 'zerofill' => 'wp_validate_boolean', 'binary' => 'wp_validate_boolean', 'allow_null' => 'wp_validate_boolean', 'default' => array($this, 'sanitize_default'), 'extra' => 'wu_kses_data', 'encoding' => 'wu_kses_data', 'collation' => 'wu_kses_data', 'comment' => 'wu_kses_data', 'primary' => 'wp_validate_boolean', 'created' => 'wp_validate_boolean', 'modified' => 'wp_validate_boolean', 'uuid' => 'wp_validate_boolean', 'searchable' => 'wp_validate_boolean', 'sortable' => 'wp_validate_boolean', 'date_query' => 'wp_validate_boolean', 'transition' => 'wp_validate_boolean', 'in' => 'wp_validate_boolean', 'not_in' => 'wp_validate_boolean', 'cache_key' => 'wp_validate_boolean', 'pattern' => array($this, 'sanitize_pattern'), 'validate' => array($this, 'sanitize_validation'), 'caps' => array($this, 'sanitize_capabilities'), 'aliases' => array($this, 'sanitize_aliases'), 'relationships' => array($this, 'sanitize_relationships')); - // Default args array - $r = array(); - // Loop through and try to execute callbacks - foreach ($args as $key => $value) { - // Callback is callable - if (isset($callbacks[$key]) && \is_callable($callbacks[$key])) { - $r[$key] = \call_user_func($callbacks[$key], $value ?? ""); - // Callback is malformed so just let it through to avoid breakage - } else { - $r[$key] = $value; - } - } - // Return sanitized arguments - return $r; - } - /** - * Force column arguments for special column types - * - * @since 1.0.0 - * @param array $args Default empty array. - * @return array - */ - private function special_args($args = array()) - { - // Primary key columns are always used as cache keys - if (!empty($args['primary'])) { - $args['cache_key'] = \true; - // All UUID columns need to follow a very specific pattern - } elseif (!empty($args['uuid'])) { - $args['name'] = 'uuid'; - $args['type'] = 'varchar'; - $args['length'] = '100'; - $args['in'] = \false; - $args['not_in'] = \false; - $args['searchable'] = \false; - $args['sortable'] = \false; - } - // Return args - return (array) $args; - } - /** Public Helpers ********************************************************/ - /** - * Return if a column type is numeric or not. - * - * @since 1.0.0 - * @return bool - */ - public function is_numeric() - { - return $this->is_type(array('tinyint', 'int', 'mediumint', 'bigint')); - } - /** Private Helpers *******************************************************/ - /** - * Return if this column is of a certain type. - * - * @since 1.0.0 - * @param mixed $type Default empty string. The type to check. Also accepts an array. - * @return bool True if of type, False if not - */ - private function is_type($type = '') - { - // If string, cast to array - if (\is_string($type)) { - $type = (array) $type; - } - // Make them lowercase - $types = \array_map('strtolower', $type); - // Return if match or not - return (bool) \in_array(\strtolower($this->type), $types, \true); - } - /** Private Sanitizers ****************************************************/ - /** - * Sanitize capabilities array - * - * @since 1.0.0 - * @param array $caps Default empty array. - * @return array - */ - private function sanitize_capabilities($caps = array()) - { - return wp_parse_args($caps, array('select' => 'exist', 'insert' => 'exist', 'update' => 'exist', 'delete' => 'exist')); - } - /** - * Sanitize aliases array using `sanitize_key()` - * - * @since 1.0.0 - * @param array $aliases Default empty array. - * @return array - */ - private function sanitize_aliases($aliases = array()) - { - return \array_map('sanitize_key', $aliases); - } - /** - * Sanitize relationships array - * - * @todo - * @since 1.0.0 - * @param array $relationships Default empty array. - * @return array - */ - private function sanitize_relationships($relationships = array()) - { - return \array_filter($relationships); - } - /** - * Sanitize the default value - * - * @since 1.0.0 - * @param string $default - * @return string|null - */ - private function sanitize_default($default = '') - { - // Null - if (\true === $this->allow_null && \is_null($default)) { - return null; - // String - } elseif (\is_string($default)) { - return wu_kses_data($default); - // Integer - } elseif ($this->is_numeric()) { - return (int) $default; - } - // @todo datetime, decimal, and other column types - // Unknown, so return the default's default - return ''; - } - /** - * Sanitize the pattern - * - * @since 1.0.0 - * @param string $pattern - * @return string - */ - private function sanitize_pattern($pattern = '%s') - { - // Allowed patterns - $allowed_patterns = array('%s', '%d', '%f'); - // Return pattern if allowed - if (\in_array($pattern, $allowed_patterns, \true)) { - return $pattern; - } - // Fallback to digit or string - return $this->is_numeric() ? '%d' : '%s'; - } - /** - * Sanitize the validation callback - * - * @since 1.0.0 - * @param string $callback Default empty string. A callable PHP function name or method - * @return string The most appropriate callback function for the value - */ - private function sanitize_validation($callback = '') - { - // Return callback if it's callable - if (\is_callable($callback)) { - return $callback; - } - // UUID special column - if (\true === $this->uuid) { - $callback = array($this, 'validate_uuid'); - // Datetime fallback - } elseif ($this->is_type('datetime')) { - $callback = array($this, 'validate_datetime'); - // Decimal fallback - } elseif ($this->is_type('decimal')) { - $callback = array($this, 'validate_decimal'); - // Intval fallback - } elseif ($this->is_numeric()) { - $callback = 'intval'; - } - // Return the callback - return $callback; - } - /** Public Validators *****************************************************/ - /** - * Fallback to validate a datetime value if no other is set. - * - * This assumes NO_ZERO_DATES is off or overridden. - * - * If MySQL drops support for zero dates, this method will need to be - * updated to support different default values based on the environment. - * - * @since 1.0.0 - * @param string $value Default ''. A datetime value that needs validating - * @return string A valid datetime value - */ - public function validate_datetime($value = '') - { - // Handle "empty" values - if (empty($value) || '0000-00-00 00:00:00' === $value) { - $value = !empty($this->default) ? $this->default : ''; - // Convert to MySQL datetime format via gmdate() && strtotime - } elseif (\function_exists('gmdate')) { - $value = \gmdate('Y-m-d H:i:s', \strtotime($value)); - } - // Return the validated value - return $value; - } - /** - * Validate a decimal - * - * (Recommended decimal column length is '18,9'.) - * - * This is used to validate a mixed value before it is saved into a decimal - * column in a database table. - * - * Uses number_format() which does rounding to the last decimal if your - * value is longer than specified. - * - * @since 1.0.0 - * @param mixed $value Default empty string. The decimal value to validate - * @param int $decimals Default 9. The number of decimal points to accept - * @return float - */ - public function validate_decimal($value = 0, $decimals = 9) - { - // Protect against non-numeric values - if (!\is_numeric($value)) { - $value = 0; - } - // Protect against non-numeric decimals - if (!\is_numeric($decimals)) { - $decimals = 9; - } - // Is the value negative? - $negative_exponent = $value < 0 ? -1 : 1; - // Only numbers and period - $value = \preg_replace('/[^0-9\\.]/', '', (string) $value); - // Format to number of decimals, and cast as float - $formatted = \number_format($value, $decimals, '.', ''); - // Adjust for negative values - $retval = $formatted * $negative_exponent; - // Return - return $retval; - } - /** - * Validate a UUID. - * - * This uses the v4 algorithm to generate a UUID that is used to uniquely - * and universally identify a given database row without any direct - * connection or correlation to the data in that row. - * - * From http://php.net/manual/en/function.uniqid.php#94959 - * - * @since 1.0.0 - * @param string $value The UUID value (empty on insert, string on update) - * @return string Generated UUID. - */ - public function validate_uuid($value = '') - { - // Default URN UUID prefix - $prefix = 'urn:uuid:'; - // Bail if not empty and correctly prefixed - // (UUIDs should _never_ change once they are set) - if (!empty($value) && 0 === \strpos($value, $prefix)) { - return $value; - } - // Put the pieces together - $value = \sprintf( - "{$prefix}%04x%04x-%04x-%04x-%04x-%04x%04x%04x", - // 32 bits for "time_low" - \mt_rand(0, 0xffff), - \mt_rand(0, 0xffff), - // 16 bits for "time_mid" - \mt_rand(0, 0xffff), - // 16 bits for "time_hi_and_version", - // four most significant bits holds version number 4 - \mt_rand(0, 0xfff) | 0x4000, - // 16 bits, 8 bits for "clk_seq_hi_res", - // 8 bits for "clk_seq_low", - // two most significant bits holds zero and one for variant DCE1.1 - \mt_rand(0, 0x3fff) | 0x8000, - // 48 bits for "node" - \mt_rand(0, 0xffff), - \mt_rand(0, 0xffff), - \mt_rand(0, 0xffff) - ); - // Return the new UUID - return $value; - } - /** Table Helpers *********************************************************/ - /** - * Return a string representation of what this column's properties look like - * in a MySQL. - * - * @todo - * @since 1.0.0 - * @return string - */ - public function get_create_string() - { - // Default return val - $retval = ''; - // Bail if no name - if (!empty($this->name)) { - $retval .= $this->name; - } - // Type - if (!empty($this->type)) { - $retval .= " {$this->type}"; - } - // Length - if (!empty($this->length)) { - $retval .= '(' . $this->length . ')'; - } - // Unsigned - if (!empty($this->unsigned)) { - $retval .= " unsigned"; - } - // Zerofill - if (!empty($this->zerofill)) { - // TBD - } - // Binary - if (!empty($this->binary)) { - // TBD - } - // Allow null - if (!empty($this->allow_null)) { - $retval .= " NOT NULL "; - } - // Default - if (!empty($this->default)) { - $retval .= " default '{$this->default}'"; - // A literal false means no default value - } elseif (\false !== $this->default) { - // Numeric - if ($this->is_numeric()) { - $retval .= " default '0'"; - } elseif ($this->is_type('datetime')) { - $retval .= " default '0000-00-00 00:00:00'"; - } else { - $retval .= " default ''"; - } - } - // Extra - if (!empty($this->extra)) { - $retval .= " {$this->extra}"; - } - // Encoding - if (!empty($this->encoding)) { - } else { - } - // Collation - if (!empty($this->collation)) { - } else { - } - // Return the create string - return $retval; - } -} diff --git a/dependencies/berlindb/core/src/Database/Queries/Compare.php b/dependencies/berlindb/core/src/Database/Queries/Compare.php deleted file mode 100644 index 0f3d5f4..0000000 --- a/dependencies/berlindb/core/src/Database/Queries/Compare.php +++ /dev/null @@ -1,131 +0,0 @@ -', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE'); - // IN and BETWEEN - const IN_BETWEEN_COMPARES = array('IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'); - /** - * Generate SQL WHERE clauses for a first-order query clause. - * - * "First-order" means that it's an array with a 'key' or 'value'. - * - * @since 1.0.0 - * - * @param array $clause Query clause (passed by reference). - * @param array $parent_query Parent query array. - * @param string $clause_key Optional. The array key used to name the clause in the original `$meta_query` - * parameters. If not provided, a key will be generated automatically. - * @return array { - * Array containing WHERE SQL clauses to append to a first-order query. - * - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - public function get_sql_for_clause(&$clause, $parent_query, $clause_key = '') - { - global $wpdb; - // Default chunks - $sql_chunks = array('where' => array(), 'join' => array()); - // Maybe format compare clause - if (isset($clause['compare'])) { - $clause['compare'] = \strtoupper($clause['compare']); - // Or set compare clause based on value - } else { - $clause['compare'] = isset($clause['value']) && \is_array($clause['value']) ? 'IN' : '='; - } - // Fallback to equals - if (!\in_array($clause['compare'], self::ALL_COMPARES, \true)) { - $clause['compare'] = '='; - } - // Uppercase or equals - if (isset($clause['compare_key']) && 'LIKE' === \strtoupper($clause['compare_key'])) { - $clause['compare_key'] = \strtoupper($clause['compare_key']); - } else { - $clause['compare_key'] = '='; - } - // Get comparison from clause - $compare = $clause['compare']; - /** Build the WHERE clause ********************************************/ - // Column name and value. - if (\array_key_exists('key', $clause) && \array_key_exists('value', $clause)) { - $column = sanitize_key($clause['key']); - $value = $clause['value']; - // IN or BETWEEN - if (\in_array($compare, self::IN_BETWEEN_COMPARES, \true)) { - if (!\is_array($value)) { - $value = \preg_split('/[,\\s]+/', $value); - } - // Anything else - } else { - $value = \trim($value); - } - // Format WHERE from compare value(s) - switch ($compare) { - case 'IN': - case 'NOT IN': - $compare_string = '(' . \substr(\str_repeat(',%s', \count($value)), 1) . ')'; - $where = $wpdb->prepare($compare_string, $value); - break; - case 'BETWEEN': - case 'NOT BETWEEN': - $value = \array_slice($value, 0, 2); - $where = $wpdb->prepare('%s AND %s', $value); - break; - case 'LIKE': - case 'NOT LIKE': - $value = '%' . $wpdb->esc_like($value) . '%'; - $where = $wpdb->prepare('%s', $value); - break; - // EXISTS with a value is interpreted as '='. - case 'EXISTS': - $compare = '='; - $where = $wpdb->prepare('%s', $value); - break; - // 'value' is ignored for NOT EXISTS. - case 'NOT EXISTS': - $where = ''; - break; - default: - $where = $wpdb->prepare('%s', $value); - break; - } - // Maybe add column, compare, & where to chunks - if (!empty($where)) { - $sql_chunks['where'][] = "{$column} {$compare} {$where}"; - } - } - /* - * Multiple WHERE clauses (for meta_key and meta_value) should - * be joined in parentheses. - */ - if (1 < \count($sql_chunks['where'])) { - $sql_chunks['where'] = array('( ' . \implode(' AND ', $sql_chunks['where']) . ' )'); - } - // Return - return $sql_chunks; - } -} diff --git a/dependencies/berlindb/core/src/Database/Queries/Date.php b/dependencies/berlindb/core/src/Database/Queries/Date.php deleted file mode 100644 index a74e07e..0000000 --- a/dependencies/berlindb/core/src/Database/Queries/Date.php +++ /dev/null @@ -1,1017 +0,0 @@ -', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'); - /** - * Supported multi-value comparison types - * - * @since 1.1.0 - * @var array - */ - public $multi_value_keys = array('IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'); - /** - * Supported relation types - * - * @since 1.1.0 - * @var array - */ - public $relation_keys = array('OR', 'AND'); - /** - * Constructor. - * - * Time-related parameters that normally require integer values ('year', 'month', 'week', 'dayofyear', 'day', - * 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second') accept arrays of integers for some values of - * 'compare'. When 'compare' is 'IN' or 'NOT IN', arrays are accepted; when 'compare' is 'BETWEEN' or 'NOT - * BETWEEN', arrays of two valid values are required. See individual argument descriptions for accepted values. - * - * @since 1.0.0 - * - * @param array $date_query { - * Array of date query clauses. - * - * @type array ...$0 { - * @type string $column Optional. The column to query against. If undefined, inherits the value of - * 'date_created'. Accepts 'date_created', 'date_created_gmt', - * 'post_modified','post_modified_gmt', 'comment_date', 'comment_date_gmt'. - * Default 'date_created'. - * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', '<', '<=', - * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. Default '='. - * @type string $relation Optional. The boolean relationship between the date queries. Accepts 'OR' or 'AND'. - * Default 'OR'. - * @type int|array $start_of_week Optional. Day that week starts on. Accepts numbers 0-6 - * (0 = Sunday, 1 is Monday). Default 0. - * @type array ...$0 { - * Optional. An array of first-order clause parameters, or another fully-formed date query. - * - * @type string|array $before { - * Optional. Date to retrieve posts before. Accepts `strtotime()`-compatible string, - * or array of 'year', 'month', 'day' values. - * - * @type string $year The four-digit year. Default empty. Accepts any four-digit year. - * @type string $month Optional when passing array.The month of the year. - * Default (string:empty)|(array:1). Accepts numbers 1-12. - * @type string $day Optional when passing array.The day of the month. - * Default (string:empty)|(array:1). Accepts numbers 1-31. - * } - * @type string|array $after { - * Optional. Date to retrieve posts after. Accepts `strtotime()`-compatible string, - * or array of 'year', 'month', 'day' values. - * - * @type string $year The four-digit year. Accepts any four-digit year. Default empty. - * @type string $month Optional when passing array. The month of the year. Accepts numbers 1-12. - * Default (string:empty)|(array:12). - * @type string $day Optional when passing array.The day of the month. Accepts numbers 1-31. - * Default (string:empty)|(array:last day of month). - * } - * @type string $column Optional. Used to add a clause comparing a column other than the - * column specified in the top-level `$column` parameter. Accepts - * 'date_created', 'date_created_gmt', 'post_modified', 'post_modified_gmt', - * 'comment_date', 'comment_date_gmt'. Default is the value of - * top-level `$column`. - * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', - * '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. 'IN', - * 'NOT IN', 'BETWEEN', and 'NOT BETWEEN'. Comparisons support - * arrays in some time-related parameters. Default '='. - * @type int|array $start_of_week Optional. Day that week starts on. Accepts numbers 0-6 - * (0 = Sunday, 1 is Monday). Default 0. - * @type bool $inclusive Optional. Include results from dates specified in 'before' or - * 'after'. Default false. - * @type int|array $year Optional. The four-digit year number. Accepts any four-digit year - * or an array of years if `$compare` supports it. Default empty. - * @type int|array $month Optional. The two-digit month number. Accepts numbers 1-12 or an - * array of valid numbers if `$compare` supports it. Default empty. - * @type int|array $week Optional. The week number of the year. Accepts numbers 0-53 or an - * array of valid numbers if `$compare` supports it. Default empty. - * @type int|array $dayofyear Optional. The day number of the year. Accepts numbers 1-366 or an - * array of valid numbers if `$compare` supports it. - * @type int|array $day Optional. The day of the month. Accepts numbers 1-31 or an array - * of valid numbers if `$compare` supports it. Default empty. - * @type int|array $dayofweek Optional. The day number of the week. Accepts numbers 1-7 (1 is - * Sunday) or an array of valid numbers if `$compare` supports it. - * Default empty. - * @type int|array $dayofweek_iso Optional. The day number of the week (ISO). Accepts numbers 1-7 - * (1 is Monday) or an array of valid numbers if `$compare` supports it. - * Default empty. - * @type int|array $hour Optional. The hour of the day. Accepts numbers 0-23 or an array - * of valid numbers if `$compare` supports it. Default empty. - * @type int|array $minute Optional. The minute of the hour. Accepts numbers 0-60 or an array - * of valid numbers if `$compare` supports it. Default empty. - * @type int|array $second Optional. The second of the minute. Accepts numbers 0-60 or an - * array of valid numbers if `$compare` supports it. Default empty. - * } - * } - * } - */ - public function __construct($date_query = array()) - { - // Bail if empty or not an array. - if (empty($date_query) || !\is_array($date_query)) { - return; - } - // Set now, column, compare, relation, and start_of_week. - $this->now = $this->get_now($date_query); - $this->column = $this->get_column($date_query); - $this->compare = $this->get_compare($date_query); - $this->relation = $this->get_relation($date_query); - $this->start_of_week = $this->get_start_of_week($date_query); - // Support for passing time-based keys in the top level of the array. - if (!isset($date_query[0])) { - $date_query = array($date_query); - } - // Set the queries - $this->queries = $this->sanitize_query($date_query); - } - /** - * Recursive-friendly query sanitizer. - * - * Ensures that each query-level clause has a 'relation' key, and that - * each first-order clause contains all the necessary keys from - * `$defaults`. - * - * @since 1.0.0 - * - * @param array $queries - * @param array $parent_query - * - * @return array Sanitized queries. - */ - public function sanitize_query($queries = array(), $parent_query = array()) - { - // Default return value. - $retval = array(); - // Setup defaults. - $defaults = array('now' => $this->get_now(), 'column' => $this->get_column(), 'compare' => $this->get_compare(), 'relation' => $this->get_relation(), 'start_of_week' => $this->get_start_of_week()); - // Numeric keys should always have array values. - foreach ($queries as $qkey => $qvalue) { - if (\is_numeric($qkey) && !\is_array($qvalue)) { - unset($queries[$qkey]); - } - } - // Each query should have a value for each default key. - // Inherit from the parent when possible. - foreach ($defaults as $dkey => $dvalue) { - // Skip if already set. - if (isset($queries[$dkey])) { - continue; - } - // Set the query. - if (isset($parent_query[$dkey])) { - $queries[$dkey] = $parent_query[$dkey]; - } else { - $queries[$dkey] = $dvalue; - } - } - // Validate the dates passed in the query. - if ($this->is_first_order_clause($queries)) { - $this->validate_date_values($queries); - } - // Add queries to return array. - foreach ($queries as $key => $q) { - // This is a first-order query. Trust the values and sanitize when building SQL. - if (!\is_array($q) || \in_array($key, $this->time_keys, \true)) { - $retval[$key] = $q; - // Any array without a time key is another query, so we recurse. - } else { - $retval[] = $this->sanitize_query($q, $queries); - } - } - // Return sanitized queries. - return $retval; - } - /** - * Determine whether this is a first-order clause. - * - * Checks to see if the current clause has any time-related keys. - * If so, it's first-order. - * - * @since 1.0.0 - * - * @param array $query Query clause. - * - * @return bool True if this is a first-order clause. - */ - protected function is_first_order_clause($query = array()) - { - $time_keys = \array_intersect($this->time_keys, \array_keys($query)); - return !empty($time_keys); - } - /** - * Determines and validates what the current unix timestamp is. - * - * @since 1.1.0 - * - * @param array $query A date query or a date subquery. - * - * @return string The current unix timestamp. - */ - public function get_now($query = array()) - { - // Use now if passed - $retval = !empty($query['now']) && \is_numeric($query['now']) ? absint($query['now']) : \time(); - return $retval; - } - /** - * Determines and validates what comparison operator to use. - * - * @since 1.0.0 - * - * @param array $query A date query or a date subquery. - * - * @return string The comparison operator. - */ - public function get_column($query = array()) - { - // Use column if passed - $retval = !empty($query['column']) ? esc_sql($this->validate_column($query['column'])) : $this->column; - return $retval; - } - /** - * Determines and validates what comparison operator to use. - * - * @since 1.0.0 - * - * @param array $query A date query or a date subquery. - * - * @return string The comparison operator. - */ - public function get_compare($query = array()) - { - // Compare must be in the allowed array - $retval = !empty($query['compare']) && \in_array($query['compare'], $this->comparison_keys, \true) ? \strtoupper($query['compare']) : $this->compare; - return $retval; - } - /** - * Determines and validates what relation to use. - * - * @since 1.0.0 - * - * @param array $query A date query or a date subquery. - * @return string The relation operator. - */ - public function get_relation($query = array()) - { - // Relation must be in the allowed array - $retval = !empty($query['relation']) && \in_array($query['relation'], $this->relation_keys, \true) ? \strtoupper($query['relation']) : $this->relation; - return $retval; - } - /** - * Determines and validates what start_of_week to use. - * - * @since 1.1.0 - * - * @param array $query A date query or a date subquery. - * - * @return string The comparison operator. - */ - public function get_start_of_week($query = array()) - { - // Use start of week if passed and valid - $retval = isset($query['start_of_week']) && 6 >= (int) $query['start_of_week'] && 0 <= (int) $query['start_of_week'] ? $query['start_of_week'] : $this->start_of_week; - return (int) $retval; - } - /** - * Validates the given date_query values. - * - * Note that date queries with invalid date ranges are allowed to - * continue (though of course no items will be found for impossible dates). - * This method only generates debug notices for these cases. - * - * @since 1.0.0 - * - * @param array $date_query The date_query array. - * - * @return bool True if all values in the query are valid, false if one or more fail. - */ - public function validate_date_values($date_query = array()) - { - // Bail if empty. - if (empty($date_query)) { - return \false; - } - $valid = \true; - /* - * Validate 'before' and 'after' up front, then let the - * validation routine continue to be sure that all invalid - * values generate errors too. - */ - if (\array_key_exists('before', $date_query) && \is_array($date_query['before'])) { - $valid = $this->validate_date_values($date_query['before']); - } - if (\array_key_exists('after', $date_query) && \is_array($date_query['after'])) { - $valid = $this->validate_date_values($date_query['after']); - } - // Values are passthroughs. - if (\array_key_exists('value', $date_query)) { - $valid = \true; - } - // Array containing all min-max checks. - $min_max_checks = array(); - // Days per year. - if (\array_key_exists('year', $date_query)) { - /* - * If a year exists in the date query, we can use it to get the days. - * If multiple years are provided (as in a BETWEEN), use the first one. - */ - if (\is_array($date_query['year'])) { - $_year = \reset($date_query['year']); - } else { - $_year = $date_query['year']; - } - $max_days_of_year = \gmdate('z', \gmmktime(0, 0, 0, 12, 31, $_year)) + 1; - // Otherwise we use the max of 366 (leap-year) - } else { - $max_days_of_year = 366; - } - // Days of year. - $min_max_checks['dayofyear'] = array('min' => 1, 'max' => $max_days_of_year); - // Days per week. - $min_max_checks['dayofweek'] = array('min' => 1, 'max' => 7); - // Days per week. - $min_max_checks['dayofweek_iso'] = array('min' => 1, 'max' => 7); - // Months per year. - $min_max_checks['month'] = array('min' => 1, 'max' => 12); - // Weeks per year. - if (isset($_year)) { - /* - * If we have a specific year, use it to calculate number of weeks. - * Note: the number of weeks in a year is the date in which Dec 28 appears. - */ - $week_count = \gmdate('W', \gmmktime(0, 0, 0, 12, 28, $_year)); - // Otherwise set the week-count to a maximum of 53. - } else { - $week_count = 53; - } - // Weeks per year. - $min_max_checks['week'] = array('min' => 1, 'max' => $week_count); - // Days per month. - $min_max_checks['day'] = array('min' => 1, 'max' => 31); - // Hours per day. - $min_max_checks['hour'] = array('min' => 0, 'max' => 23); - // Minutes per hour. - $min_max_checks['minute'] = array('min' => 0, 'max' => 59); - // Seconds per minute. - $min_max_checks['second'] = array('min' => 0, 'max' => 59); - // Loop through min/max checks. - foreach ($min_max_checks as $key => $check) { - // Skip if not in query. - if (!\array_key_exists($key, $date_query)) { - continue; - } - // Check for invalid values. - foreach ((array) $date_query[$key] as $_value) { - $is_between = $_value >= $check['min'] && $_value <= $check['max']; - if (!\is_numeric($_value) || empty($is_between)) { - $valid = \false; - } - } - } - // Bail if invalid query. - if (\false === $valid) { - return $valid; - } - // Check what kinds of dates are being queried for. - $day_exists = \array_key_exists('day', $date_query) && \is_numeric($date_query['day']); - $month_exists = \array_key_exists('month', $date_query) && \is_numeric($date_query['month']); - $year_exists = \array_key_exists('year', $date_query) && \is_numeric($date_query['year']); - // Checking at least day & month. - if (!empty($day_exists) && !empty($month_exists)) { - // Check for year query, or fallback to 2012 (for flexibility). - $year = !empty($year_exists) ? $date_query['year'] : '2012'; - // Parse the date to check. - $to_check = \sprintf('%s-%s-%s', $year, $date_query['month'], $date_query['day']); - // Check the date. - if (!$this->checkdate($date_query['month'], $date_query['day'], $year, $to_check)) { - $valid = \false; - } - } - // Return if valid or not - return $valid; - } - /** - * Validates a column name parameter. - * - * @since 1.0.0 - * - * @param string $column The user-supplied column name. - * - * @return string A validated column name value. - */ - public function validate_column($column = '') - { - return \preg_replace('/[^a-zA-Z0-9_$\\.]/', '', $column); - } - /** - * Generate WHERE clause to be appended to a main query. - * - * @since 1.0.0 - * - * @return string MySQL WHERE clauses. - */ - public function get_sql() - { - $sql = $this->get_sql_clauses(); - /** - * Filters the date query clauses. - * - * @since 1.0.0 - * - * @param string $sql Clauses of the date query. - * @param Date $this The Date query instance. - */ - return apply_filters('get_date_sql', $sql, $this); - } - /** - * Generate SQL clauses to be appended to a main query. - * - * Called by the public Date::get_sql(), this method is abstracted - * out to maintain parity with the other Query classes. - * - * @since 1.0.0 - * - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_clauses() - { - $sql = $this->get_sql_for_query($this->queries); - if (!empty($sql['where'])) { - $sql['where'] = ' AND ' . $sql['where']; - } - return apply_filters('get_date_sql_clauses', $sql, $this); - } - /** - * Generate SQL clauses for a single query array. - * - * If nested subqueries are found, this method recurses the tree to - * produce the properly nested SQL. - * - * @since 1.0.0 - * - * @param array $query Query to parse. - * @param int $depth Optional. Number of tree levels deep we currently are. - * Used to calculate indentation. Default 0. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to a single query array. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_query($query = array(), $depth = 0) - { - $sql_chunks = array('join' => array(), 'where' => array()); - $sql = array('join' => '', 'where' => ''); - $indent = ''; - for ($i = 0; $i < $depth; $i++) { - $indent .= ' '; - } - foreach ($query as $key => $clause) { - if ('relation' === $key) { - $relation = $query['relation']; - } elseif (\is_array($clause)) { - // This is a first-order clause. - if ($this->is_first_order_clause($clause)) { - // Get clauses & where count - $clause_sql = $this->get_sql_for_clause($clause, $query); - $where_count = \count($clause_sql['where']); - if (0 === $where_count) { - $sql_chunks['where'][] = ''; - } elseif (1 === $where_count) { - $sql_chunks['where'][] = $clause_sql['where'][0]; - } else { - $sql_chunks['where'][] = '( ' . \implode(' AND ', $clause_sql['where']) . ' )'; - } - $sql_chunks['join'] = \array_merge($sql_chunks['join'], $clause_sql['join']); - // This is a subquery, so we recurse. - } else { - $clause_sql = $this->get_sql_for_query($clause, $depth + 1); - $sql_chunks['where'][] = $clause_sql['where']; - $sql_chunks['join'][] = $clause_sql['join']; - } - } - } - // Filter to remove empties. - $sql_chunks['join'] = \array_filter($sql_chunks['join']); - $sql_chunks['where'] = \array_filter($sql_chunks['where']); - if (empty($relation)) { - $relation = 'AND'; - } - // Filter duplicate JOIN clauses and combine into a single string. - if (!empty($sql_chunks['join'])) { - $sql['join'] = \implode(' ', \array_unique($sql_chunks['join'])); - } - // Generate a single WHERE clause with proper brackets and indentation. - if (!empty($sql_chunks['where'])) { - $sql['where'] = '( ' . "\n " . $indent . \implode(' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where']) . "\n" . $indent . ')'; - } - // Filter and return - return apply_filters('get_date_sql_for_query', $sql, $query, $depth, $this); - } - /** - * Turns a first-order date query into SQL for a WHERE clause. - * - * @since 1.0.0 - * - * @param array $query Date query clause. - * @param array $parent_query Parent query of the current date query. - * - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_clause($query = array(), $parent_query = array()) - { - // The sub-parts of a $where part. - $where_parts = array(); - // Get first-order clauses - $now = $this->get_now($query); - $column = $this->get_column($query); - $compare = $this->get_compare($query); - $start_of_week = $this->get_start_of_week($query); - $inclusive = !empty($query['inclusive']); - // Assign greater-than and less-than values. - $lt = '<'; - $gt = '>'; - if (\true === $inclusive) { - $lt .= '='; - $gt .= '='; - } - // Range queries. - if (!empty($query['after'])) { - $where_parts[] = $this->get_db()->prepare("{$column} {$gt} %s", $this->build_mysql_datetime($query['after'], !$inclusive, $now)); - } - if (!empty($query['before'])) { - $where_parts[] = $this->get_db()->prepare("{$column} {$lt} %s", $this->build_mysql_datetime($query['before'], $inclusive, $now)); - } - // Specific value queries. - if (isset($query['year']) && ($value = $this->build_numeric_value($compare, $query['year']))) { - $where_parts[] = "YEAR( {$column} ) {$compare} {$value}"; - } - if (isset($query['month']) && ($value = $this->build_numeric_value($compare, $query['month']))) { - $where_parts[] = "MONTH( {$column} ) {$compare} {$value}"; - } elseif (isset($query['monthnum']) && ($value = $this->build_numeric_value($compare, $query['monthnum']))) { - $where_parts[] = "MONTH( {$column} ) {$compare} {$value}"; - } - if (isset($query['week']) && \false !== ($value = $this->build_numeric_value($compare, $query['week']))) { - $where_parts[] = $this->build_mysql_week($column, $start_of_week) . " {$compare} {$value}"; - } elseif (isset($query['w']) && \false !== ($value = $this->build_numeric_value($compare, $query['w']))) { - $where_parts[] = $this->build_mysql_week($column, $start_of_week) . " {$compare} {$value}"; - } - if (isset($query['dayofyear']) && ($value = $this->build_numeric_value($compare, $query['dayofyear']))) { - $where_parts[] = "DAYOFYEAR( {$column} ) {$compare} {$value}"; - } - if (isset($query['day']) && ($value = $this->build_numeric_value($compare, $query['day']))) { - $where_parts[] = "DAYOFMONTH( {$column} ) {$compare} {$value}"; - } - if (isset($query['dayofweek']) && ($value = $this->build_numeric_value($compare, $query['dayofweek']))) { - $where_parts[] = "DAYOFWEEK( {$column} ) {$compare} {$value}"; - } - if (isset($query['dayofweek_iso']) && ($value = $this->build_numeric_value($compare, $query['dayofweek_iso']))) { - $where_parts[] = "WEEKDAY( {$column} ) + 1 {$compare} {$value}"; - } - // Straight value compare - if (isset($query['value'])) { - $value = $this->build_value($compare, $query['value']); - $where_parts[] = "{$column} {$compare} {$value}"; - } - // Hour/Minute/Second - if (isset($query['hour']) || isset($query['minute']) || isset($query['second'])) { - // Avoid notices. - foreach (array('hour', 'minute', 'second') as $unit) { - if (!isset($query[$unit])) { - $query[$unit] = null; - } - } - $time_query = $this->build_time_query($column, $compare, $query['hour'], $query['minute'], $query['second']); - if (!empty($time_query)) { - $where_parts[] = $time_query; - } - } - /* - * Return an array of 'join' and 'where' for compatibility - * with other query classes. - */ - return array('where' => $where_parts, 'join' => array()); - } - /** - * Builds and validates a value string based on the comparison operator. - * - * @since 1.0.0 - * - * @param string $compare The compare operator to use - * @param string|array $value The value - * - * @return string|false|int The value to be used in SQL or false on error. - */ - public function build_numeric_value($compare = '=', $value = null) - { - // Bail if null value - if (\is_null($value)) { - return \false; - } - switch ($compare) { - case 'IN': - case 'NOT IN': - $value = (array) $value; - // Remove non-numeric values. - $value = \array_filter($value, 'is_numeric'); - if (empty($value)) { - return \false; - } - return '(' . \implode(',', \array_map('intval', $value)) . ')'; - case 'BETWEEN': - case 'NOT BETWEEN': - if (!\is_array($value) || 2 !== \count($value)) { - $value = array($value, $value); - } else { - $value = \array_values($value); - } - // If either value is non-numeric, bail. - foreach ($value as $v) { - if (!\is_numeric($v)) { - return \false; - } - } - $value = \array_map('intval', $value); - return $value[0] . ' AND ' . $value[1]; - default: - if (!\is_numeric($value)) { - return \false; - } - return (int) $value; - } - } - /** - * Builds and validates a value string based on the comparison operator. - * - * @since 1.0.0 - * - * @param string $compare The compare operator to use - * @param string|array $value The value - * - * @return string|false|int The value to be used in SQL or false on error. - */ - public function build_value($compare = '=', $value = null) - { - if (\in_array($compare, $this->multi_value_keys, \true)) { - if (!\is_array($value)) { - $value = \preg_split('/[,\\s]+/', $value); - } - } else { - $value = \trim($value); - } - switch ($compare) { - case 'IN': - case 'NOT IN': - $compare_string = '(' . \substr(\str_repeat(',%s', \count($value)), 1) . ')'; - $where = $this->get_db()->prepare($compare_string, $value); - break; - case 'BETWEEN': - case 'NOT BETWEEN': - $value = \array_slice($value, 0, 2); - $where = $this->get_db()->prepare('%s AND %s', $value); - break; - case 'LIKE': - case 'NOT LIKE': - $value = '%' . $this->get_db()->esc_like($value) . '%'; - $where = $this->get_db()->prepare('%s', $value); - break; - // EXISTS with a value is interpreted as '='. - case 'EXISTS': - $compare = '='; - $where = $this->get_db()->prepare('%s', $value); - break; - // 'value' is ignored for NOT EXISTS. - case 'NOT EXISTS': - $where = ''; - break; - default: - $where = $this->get_db()->prepare('%s', $value); - break; - } - return $where; - } - /** - * Builds a MySQL format date/time based on some query parameters. - * - * You can pass an array of values (year, month, etc.) with missing parameter values being defaulted to - * either the maximum or minimum values (controlled by the $default_to parameter). Alternatively you can - * pass a string that will be run through strtotime(). - * - * @since 1.0.0 - * - * @param string|array $datetime An array of parameters or a strtotime() string - * @param bool $default_to_max Whether to round up incomplete dates. Supported by values - * of $datetime that are arrays, or string values that are a - * subset of MySQL date format ('Y', 'Y-m', 'Y-m-d', 'Y-m-d H:i'). - * Default: false. - * @param string|int $now The current unix timestamp. - * - * @return string|false A MySQL format date/time or false on failure - */ - public function build_mysql_datetime($datetime = '', $default_to_max = \false, $now = 0) - { - // Datetime is string - if (\is_string($datetime)) { - // Define matches so linters don't complain - $matches = array(); - /* - * Try to parse some common date formats, so we can detect - * the level of precision and support the 'inclusive' parameter. - */ - // Y - if (\preg_match('/^(\\d{4})$/', $datetime, $matches)) { - $datetime = array('year' => \intval($matches[1])); - // Y-m - } elseif (\preg_match('/^(\\d{4})\\-(\\d{2})$/', $datetime, $matches)) { - $datetime = array('year' => \intval($matches[1]), 'month' => \intval($matches[2])); - // Y-m-d - } elseif (\preg_match('/^(\\d{4})\\-(\\d{2})\\-(\\d{2})$/', $datetime, $matches)) { - $datetime = array('year' => \intval($matches[1]), 'month' => \intval($matches[2]), 'day' => \intval($matches[3])); - // Y-m-d H:i - } elseif (\preg_match('/^(\\d{4})\\-(\\d{2})\\-(\\d{2}) (\\d{2}):(\\d{2})$/', $datetime, $matches)) { - $datetime = array('year' => \intval($matches[1]), 'month' => \intval($matches[2]), 'day' => \intval($matches[3]), 'hour' => \intval($matches[4]), 'minute' => \intval($matches[5])); - // Y-m-d H:i:s - } elseif (\preg_match('/^(\\d{4})\\-(\\d{2})\\-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})$/', $datetime, $matches)) { - $datetime = array('year' => \intval($matches[1]), 'month' => \intval($matches[2]), 'day' => \intval($matches[3]), 'hour' => \intval($matches[4]), 'minute' => \intval($matches[5]), 'second' => \intval($matches[6])); - } - } - // No match; may be int or string - if (!\is_array($datetime)) { - // Maybe format or use as-is - $datetime = !\is_int($datetime) ? \strtotime($datetime, $now) : absint($datetime); - // Return formatted - return \gmdate('Y-m-d H:i:s', $datetime); - } - // Map to ints - $datetime = \array_map('absint', $datetime); - // Year - if (!isset($datetime['year'])) { - $datetime['year'] = \gmdate('Y', $now); - } - // Month - if (!isset($datetime['month'])) { - $datetime['month'] = !empty($default_to_max) ? 12 : 1; - } - // Day - if (!isset($datetime['day'])) { - $datetime['day'] = !empty($default_to_max) ? (int) \gmdate('t', \gmmktime(0, 0, 0, $datetime['month'], 1, $datetime['year'])) : 1; - } - // Hour - if (!isset($datetime['hour'])) { - $datetime['hour'] = !empty($default_to_max) ? 23 : 0; - } - // Minute - if (!isset($datetime['minute'])) { - $datetime['minute'] = !empty($default_to_max) ? 59 : 0; - } - // Second - if (!isset($datetime['second'])) { - $datetime['second'] = !empty($default_to_max) ? 59 : 0; - } - // Combine and return - return \sprintf('%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['minute'], $datetime['second']); - } - /** - * Return a MySQL expression for selecting the week number based on the - * day that the week starts. - * - * Uses the WordPress site option, if set. - * - * @since 1.0.0 - * - * @param string $column Database column. - * @param int $start_of_week Day that week starts on. 0 = Sunday. - * - * @return string SQL clause. - */ - public function build_mysql_week($column = '', $start_of_week = 0) - { - // When does the week start? - switch ($start_of_week) { - // Monday - case 1: - $retval = "WEEK( {$column}, 1 )"; - break; - // Tuesday - Saturday - case 2: - case 3: - case 4: - case 5: - case 6: - $retval = "WEEK( DATE_SUB( {$column}, INTERVAL {$start_of_week} DAY ), 0 )"; - break; - // Sunday - case 0: - default: - $retval = "WEEK( {$column}, 0 )"; - break; - } - // Return SQL - return $retval; - } - /** - * Builds a query string for comparing time values (hour, minute, second). - * - * If just hour, minute, or second is set than a normal comparison will be done. - * However if multiple values are passed, a pseudo-decimal time will be created - * in order to be able to accurately compare against. - * - * @since 1.0.0 - * - * @param string $column The column to query against. Needs to be pre-validated! - * @param string $compare The comparison operator. Needs to be pre-validated! - * @param int|null $hour Optional. An hour value (0-23). - * @param int|null $minute Optional. A minute value (0-59). - * @param int|null $second Optional. A second value (0-59). - * - * @return string|false A query part or false on failure. - */ - public function build_time_query($column, $compare, $hour = null, $minute = null, $second = null) - { - // Have to have at least one - if (!isset($hour) && !isset($minute) && !isset($second)) { - return \false; - } - // Complex combined queries aren't supported for multi-value queries - if (\in_array($compare, $this->multi_value_keys, \true)) { - $retval = array(); - // Hour - if (isset($hour) && \false !== ($value = $this->build_numeric_value($compare, $hour))) { - $retval[] = "HOUR( {$column} ) {$compare} {$value}"; - } - // Minute - if (isset($minute) && \false !== ($value = $this->build_numeric_value($compare, $minute))) { - $retval[] = "MINUTE( {$column} ) {$compare} {$value}"; - } - // Second - if (isset($second) && \false !== ($value = $this->build_numeric_value($compare, $second))) { - $retval[] = "SECOND( {$column} ) {$compare} {$value}"; - } - return \implode(' AND ', $retval); - } - // Cases where just one unit is set - // Hour - if (isset($hour) && !isset($minute) && !isset($second) && \false !== ($value = $this->build_numeric_value($compare, $hour))) { - return "HOUR( {$column} ) {$compare} {$value}"; - // Minute - } elseif (!isset($hour) && isset($minute) && !isset($second) && \false !== ($value = $this->build_numeric_value($compare, $minute))) { - return "MINUTE( {$column} ) {$compare} {$value}"; - // Second - } elseif (!isset($hour) && !isset($minute) && isset($second) && \false !== ($value = $this->build_numeric_value($compare, $second))) { - return "SECOND( {$column} ) {$compare} {$value}"; - } - // Single units were already handled. Since hour & second isn't allowed, - // minute must to be set. - if (!isset($minute)) { - return \false; - } - // Defaults - $format = $time = ''; - // Hour - if (null !== $hour) { - $format .= '%H.'; - $time .= \sprintf('%02d', $hour) . '.'; - } else { - $format .= '0.'; - $time .= '0.'; - } - // Minute - $format .= '%i'; - $time .= \sprintf('%02d', $minute); - // Second - if (isset($second)) { - $format .= '%s'; - $time .= \sprintf('%02d', $second); - } - // Build the SQL - $query = "DATE_FORMAT( {$column}, %s ) {$compare} %f"; - // Return the prepared SQL - return $this->get_db()->prepare($query, $format, $time); - } - /** - * Test if the supplied date is valid for the Gregorian calendar. - * - * @since 1.0.0 - * - * @link https://www.php.net/manual/en/function.checkdate.php - * - * @param int $month Month number. - * @param int $day Day number. - * @param int $year Year number. - * @param string $source_date The date to filter. - * - * @return bool True if valid date, false if not valid date. - */ - public function checkdate($month = 0, $day = 0, $year = 0, $source_date = '') - { - // Check the date - $retval = \checkdate($month, $day, $year); - /** - * Filters whether the given date is valid for the Gregorian calendar. - * - * @since 1.0.0 - * - * @param bool $checkdate Whether the given date is valid. - * @param string $source_date Date to check. - */ - return (bool) apply_filters('wp_checkdate', $retval, $source_date); - } -} diff --git a/dependencies/berlindb/core/src/Database/Queries/Meta.php b/dependencies/berlindb/core/src/Database/Queries/Meta.php deleted file mode 100644 index 6fb0d14..0000000 --- a/dependencies/berlindb/core/src/Database/Queries/Meta.php +++ /dev/null @@ -1,28 +0,0 @@ - '', 'from' => '', 'where' => array(), 'groupby' => '', 'orderby' => '', 'limits' => ''); - /** - * Request clauses. - * - * @since 1.0.0 - * @var array - */ - protected $request_clauses = array('select' => '', 'from' => '', 'where' => '', 'groupby' => '', 'orderby' => '', 'limits' => ''); - /** - * Meta query container. - * - * @since 1.0.0 - * @var object|Queries\Meta - */ - protected $meta_query = \false; - /** - * Date query container. - * - * @since 1.0.0 - * @var object|Queries\Date - */ - protected $date_query = \false; - /** - * Compare query container. - * - * @since 1.0.0 - * @var object|Queries\Compare - */ - protected $compare_query = \false; - /** Query Variables *******************************************************/ - /** - * Parsed query vars set by the application, possibly filtered and changed. - * - * This is specifically marked as public, to allow byref actions to change - * them from outside the class methods proper and inside filter functions. - * - * @since 1.0.0 - * @var array - */ - public $query_vars = array(); - /** - * Original query vars set by the application. - * - * These are the original query variables before any filters are applied, - * and are the results of merging $query_var_defaults with $query_vars. - * - * @since 1.0.0 - * @var array - */ - protected $query_var_originals = array(); - /** - * Default values for query vars. - * - * These are computed at runtime based on the registered columns for the - * database table this query relates to. - * - * @since 1.0.0 - * @var array - */ - protected $query_var_defaults = array(); - /** - * This private variable temporarily holds onto a random string used as the - * default query var value. This is used internally when performing - * comparisons, and allows for querying by falsy values. - * - * @since 1.1.0 - * @var string - */ - protected $query_var_default_value = ''; - /** Results ***************************************************************/ - /** - * List of items located by the query. - * - * @since 1.0.0 - * @var array - */ - public $items = array(); - /** - * The amount of found items for the current query. - * - * @since 1.0.0 - * @var int - */ - protected $found_items = 0; - /** - * The number of pages. - * - * @since 1.0.0 - * @var int - */ - protected $max_num_pages = 0; - /** - * SQL for database query. - * - * @since 1.0.0 - * @var string - */ - protected $request = ''; - /** Methods ***************************************************************/ - /** - * Sets up the item query, based on the query vars passed. - * - * @since 1.0.0 - * - * @param string|array $query { - * Optional. Array or query string of item query parameters. - * Default empty. - * - * @type string $fields Site fields to return. Accepts 'ids' (returns an array of item IDs) - * or empty (returns an array of complete item objects). Default empty. - * To do a date query against a field, append the field name with _query - * @type bool $count Whether to return a item count (true) or array of item objects. - * Default false. - * @type int $number Limit number of items to retrieve. Use 0 for no limit. - * Default 100. - * @type int $offset Number of items to offset the query. Used to build LIMIT clause. - * Default 0. - * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. - * Default true. - * @type string|array $orderby Accepts false, an empty array, or 'none' to disable `ORDER BY` clause. - * Default '', to primary column ID. - * @type string $order How to order retrieved items. Accepts 'ASC', 'DESC'. - * Default 'DESC'. - * @type string $search Search term(s) to retrieve matching items for. - * Default empty. - * @type array $search_columns Array of column names to be searched. - * Default empty array. - * @type bool $update_item_cache Whether to prime the cache for found items. - * Default false. - * @type bool $update_meta_cache Whether to prime the meta cache for found items. - * Default false. - * } - */ - public function __construct($query = array()) - { - // Setup - $this->set_alias(); - $this->set_prefix(); - $this->set_columns(); - $this->set_item_shape(); - $this->set_query_var_defaults(); - // Maybe execute a query if arguments were passed - if (!empty($query)) { - $this->query($query); - } - } - /** - * Queries the database and retrieves items or counts. - * - * This method is public to allow subclasses to perform JIT manipulation - * of the parameters passed into it. - * - * @since 1.0.0 - * - * @param string|array $query Array or URL query string of parameters. - * @return array|int List of items, or number of items when 'count' is passed as a query var. - */ - public function query($query = array()) - { - $this->parse_query($query); - return $this->get_items(); - } - /** Private Setters *******************************************************/ - /** - * Set the time when items were last changed. - * - * We set this locally to avoid inconsistencies between method calls. - * - * @since 1.0.0 - */ - private function set_last_changed() - { - $this->last_changed = \microtime(); - } - /** - * Set up the table alias if not already set in the class. - * - * This happens before prefixes are applied. - * - * @since 1.0.0 - */ - private function set_alias() - { - if (empty($this->table_alias)) { - $this->table_alias = $this->first_letters($this->table_name); - } - } - /** - * Prefix table names, cache groups, and other things. - * - * This is to avoid conflicts with other plugins or themes that might be - * doing their own things. - * - * @since 1.0.0 - */ - private function set_prefix() - { - $this->table_name = $this->apply_prefix($this->table_name); - $this->table_alias = $this->apply_prefix($this->table_alias); - $this->cache_group = $this->apply_prefix($this->cache_group, '-'); - } - /** - * Set columns objects. - * - * @since 1.0.0 - */ - private function set_columns() - { - // Bail if no table schema - if (!\class_exists($this->table_schema)) { - return; - } - // Invoke a new table schema class - $schema = new $this->table_schema(); - // Maybe get the column objects - if (!empty($schema->columns)) { - $this->columns = $schema->columns; - } - } - /** - * Set the default item shape if none exists. - * - * @since 1.0.0 - */ - private function set_item_shape() - { - if (empty($this->item_shape) || !\class_exists($this->item_shape)) { - $this->item_shape = __NAMESPACE__ . '\\Row'; - } - } - /** - * Set default query vars based on columns. - * - * @since 1.0.0 - */ - private function set_query_var_defaults() - { - // Default query variable value - $this->query_var_default_value = \function_exists('random_bytes') ? $this->apply_prefix(\bin2hex(\random_bytes(18))) : $this->apply_prefix(\uniqid('_', \true)); - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Default query variables - $this->query_var_defaults = array( - 'fields' => '', - 'number' => 100, - 'offset' => '', - 'orderby' => $primary, - 'order' => 'DESC', - 'groupby' => '', - 'search' => '', - 'search_columns' => array(), - 'count' => \false, - // Disable SQL_CALC_FOUND_ROWS? - 'no_found_rows' => \true, - // Queries - 'meta_query' => null, - // See Queries\Meta - 'date_query' => null, - // See Queries\Date - 'compare_query' => null, - // See Queries\Compare - // Caching - 'update_item_cache' => \true, - 'update_meta_cache' => \true, - ); - // Bail if no columns - if (empty($this->columns)) { - return; - } - // Direct column names - $names = wp_list_pluck($this->columns, 'name'); - foreach ($names as $name) { - $this->query_var_defaults[$name] = $this->query_var_default_value; - } - // Possible ins - $possible_ins = $this->get_columns(array('in' => \true), 'and', 'name'); - foreach ($possible_ins as $in) { - $key = "{$in}__in"; - $this->query_var_defaults[$key] = \false; - } - // Possible not ins - $possible_not_ins = $this->get_columns(array('not_in' => \true), 'and', 'name'); - foreach ($possible_not_ins as $in) { - $key = "{$in}__not_in"; - $this->query_var_defaults[$key] = \false; - } - // Possible dates - $possible_dates = $this->get_columns(array('date_query' => \true), 'and', 'name'); - foreach ($possible_dates as $date) { - $key = "{$date}_query"; - $this->query_var_defaults[$key] = \false; - } - } - /** - * Set the request clauses. - * - * @since 1.0.0 - * - * @param array $clauses - */ - private function set_request_clauses($clauses = array()) - { - // Found rows - $found_rows = empty($this->query_vars['no_found_rows']) ? 'SQL_CALC_FOUND_ROWS' : ''; - // Fields - $fields = !empty($clauses['fields']) ? $clauses['fields'] : ''; - // Join - $join = !empty($clauses['join']) ? $clauses['join'] : ''; - // Where - $where = !empty($clauses['where']) ? "WHERE {$clauses['where']}" : ''; - // Group by - $groupby = !empty($clauses['groupby']) ? "GROUP BY {$clauses['groupby']}" : ''; - // Order by - $orderby = !empty($clauses['orderby']) ? "ORDER BY {$clauses['orderby']}" : ''; - // Limits - $limits = !empty($clauses['limits']) ? $clauses['limits'] : ''; - // Select & From - $table = $this->get_table_name(); - $select = "SELECT {$found_rows} {$fields}"; - $from = "FROM {$table} {$this->table_alias} {$join}"; - // Put query into clauses array - $this->request_clauses['select'] = $select; - $this->request_clauses['from'] = $from; - $this->request_clauses['where'] = $where; - $this->request_clauses['groupby'] = $groupby; - $this->request_clauses['orderby'] = $orderby; - $this->request_clauses['limits'] = $limits; - } - /** - * Set the request. - * - * @since 1.0.0 - */ - private function set_request() - { - $filtered = \array_filter($this->request_clauses); - $clauses = \array_map('trim', $filtered); - $this->request = \implode(' ', $clauses); - } - /** - * Set items by mapping them through the single item callback. - * - * @since 1.0.0 - * @param array $item_ids - */ - private function set_items($item_ids = array()) - { - // Bail if counting, to avoid shaping items - if (!empty($this->query_vars['count'])) { - $this->items = $item_ids; - return; - } - // Cast to integers - $item_ids = \array_map('intval', $item_ids); - // Prime item caches - $this->prime_item_caches($item_ids); - // Shape the items - $this->items = $this->shape_items($item_ids); - } - /** - * Populates found_items and max_num_pages properties for the current query - * if the limit clause was used. - * - * @since 1.0.0 - * - * @param array $item_ids Optional array of item IDs - */ - private function set_found_items($item_ids = array()) - { - // Items were not found - if (empty($item_ids)) { - return; - } - // Default to number of item IDs - $this->found_items = \count((array) $item_ids); - // Count query - if (!empty($this->query_vars['count'])) { - // Not grouped - if (\is_numeric($item_ids) && empty($this->query_vars['groupby'])) { - $this->found_items = \intval($item_ids); - } - // Not a count query - } elseif (\is_array($item_ids) && (!empty($this->query_vars['number']) && empty($this->query_vars['no_found_rows']))) { - /** - * Filters the query used to retrieve found item count. - * - * @since 1.0.0 - * - * @param string $found_items_query SQL query. Default 'SELECT FOUND_ROWS()'. - * @param object $item_query The object instance. - */ - $found_items_query = (string) apply_filters_ref_array($this->apply_prefix("found_{$this->item_name_plural}_query"), array('SELECT FOUND_ROWS()', &$this)); - // Maybe query for found items - if (!empty($found_items_query)) { - $this->found_items = (int) $this->get_db()->get_var($found_items_query); - } - } - } - /** Public Setters ********************************************************/ - /** - * Set a query var, to both defaults and request arrays. - * - * This method is used to expose the private query_vars array to hooks, - * allowing them to manipulate query vars just-in-time. - * - * @since 1.0.0 - * - * @param string $key - * @param string $value - */ - public function set_query_var($key = '', $value = '') - { - $this->query_var_defaults[$key] = $value; - $this->query_vars[$key] = $value; - } - /** - * Check whether a query variable strictly equals the unique default - * starting value. - * - * @since 1.1.0 - * @param string $key - * @return bool - */ - public function is_query_var_default($key = '') - { - return (bool) ($this->query_vars[$key] === $this->query_var_default_value); - } - /** Private Getters *******************************************************/ - /** - * Pass-through method to return a new Meta object. - * - * @since 1.0.0 - * - * @param array $args See Queries\Meta - * - * @return Queries\Meta - */ - private function get_meta_query($args = array()) - { - return new Queries\Meta($args); - } - /** - * Pass-through method to return a new Compare object. - * - * @since 1.0.0 - * - * @param array $args See Queries\Compare - * - * @return Queries\Compare - */ - private function get_compare_query($args = array()) - { - return new Queries\Compare($args); - } - /** - * Pass-through method to return a new Queries\Date object. - * - * @since 1.0.0 - * - * @param array $args See Queries\Date - * - * @return Queries\Date - */ - private function get_date_query($args = array()) - { - return new Queries\Date($args); - } - /** - * Return the current time as a UTC timestamp. - * - * This is used by add_item() and update_item() - * - * @since 1.0.0 - * - * @return string - */ - private function get_current_time() - { - return \gmdate("Y-m-d\\TH:i:s\\Z"); - } - /** - * Return the literal table name (with prefix) from the database interface. - * - * @since 1.0.0 - * - * @return string - */ - private function get_table_name() - { - return $this->get_db()->{$this->table_name}; - } - /** - * Return array of column names. - * - * @since 1.0.0 - * - * @return array - */ - private function get_column_names() - { - return \array_flip($this->get_columns(array(), 'and', 'name')); - } - /** - * Return the primary database column name. - * - * @since 1.0.0 - * - * @return string Default "id", Primary column name if not empty - */ - private function get_primary_column_name() - { - return $this->get_column_field(array('primary' => \true), 'name', 'id'); - } - /** - * Get a column from an array of arguments. - * - * @since 1.0.0 - * - * @param array $args Arguments to get a column by. - * @param string $field Field to get from a column. - * @param mixed $default Default to use if no field is set. - * @return mixed Column object, or false - */ - private function get_column_field($args = array(), $field = '', $default = \false) - { - // Get the column - $column = $this->get_column_by($args); - // Return field, or default - return isset($column->{$field}) ? $column->{$field} : $default; - } - /** - * Get a column from an array of arguments. - * - * @since 1.0.0 - * - * @param array $args Arguments to get a column by. - * @return mixed Column object, or false - */ - private function get_column_by($args = array()) - { - // Filter columns - $filter = $this->get_columns($args); - // Return column or false - return !empty($filter) ? \reset($filter) : \false; - } - /** - * Get columns from an array of arguments. - * - * @since 1.0.0 - * - * @param array $args Arguments to filter columns by. - * @param string $operator Optional. The logical operation to perform. - * @param string $field Optional. A field from the object to place - * instead of the entire object. Default false. - * @return array Array of column. - */ - private function get_columns($args = array(), $operator = 'and', $field = \false) - { - // Filter columns - $filter = wp_filter_object_list($this->columns, $args, $operator, $field); - // Return column or false - return !empty($filter) ? \array_values($filter) : array(); - } - /** - * Get a single database row by any column and value, skipping cache. - * - * @since 1.0.0 - * - * @param string $column_name Name of database column - * @param string $column_value Value to query for - * @return object|false False if empty/error, Object if successful - */ - private function get_item_raw($column_name = '', $column_value = '') - { - // Bail if no name or value - if (empty($column_name) || empty($column_value)) { - return \false; - } - // Bail if values aren't query'able - if (!\is_string($column_name) || !\is_scalar($column_value)) { - return \false; - } - // Get query parts - $table = $this->get_table_name(); - $pattern = $this->get_column_field(array('name' => $column_name), 'pattern', '%s'); - // Query database - $query = "SELECT * FROM {$table} WHERE {$column_name} = {$pattern} LIMIT 1"; - $select = $this->get_db()->prepare($query, $column_value); - $result = $this->get_db()->get_row($select); - // Bail on failure - if (!$this->is_success($result)) { - return \false; - } - // Return row - return $result; - } - /** - * Retrieves a list of items matching the query vars. - * - * @since 1.0.0 - * - * @return array|int List of items, or number of items when 'count' is passed as a query var. - */ - private function get_items() - { - /** - * Fires before object items are retrieved. - * - * @since 1.0.0 - * - * @param Query &$this Current instance of Query, passed by reference. - */ - do_action_ref_array($this->apply_prefix("pre_get_{$this->item_name_plural}"), array(&$this)); - // Never limit, never update item/meta caches when counting - if (!empty($this->query_vars['count'])) { - $this->query_vars['number'] = \false; - $this->query_vars['no_found_rows'] = \true; - $this->query_vars['update_item_cache'] = \false; - $this->query_vars['update_meta_cache'] = \false; - } - // Check the cache - $cache_key = $this->get_cache_key(); - $cache_value = $this->cache_get($cache_key, $this->cache_group); - // No cache value - if (\false === $cache_value) { - $item_ids = $this->get_item_ids(); - // Set the number of found items - $this->set_found_items($item_ids); - // Format the cached value - $cache_value = array('item_ids' => $item_ids, 'found_items' => \intval($this->found_items)); - // Add value to the cache - $this->cache_add($cache_key, $cache_value, $this->cache_group); - // Value exists in cache - } else { - $item_ids = $cache_value['item_ids']; - $this->found_items = \intval($cache_value['found_items']); - } - // Pagination - if (!empty($this->found_items) && !empty($this->query_vars['number'])) { - $this->max_num_pages = \ceil($this->found_items / $this->query_vars['number']); - } - // Cast to int if not grouping counts - if (!empty($this->query_vars['count']) && empty($this->query_vars['groupby'])) { - $item_ids = \intval($item_ids); - } - // Set items from IDs - $this->set_items($item_ids); - // Return array of items - return $this->items; - } - /** - * Used internally to get a list of item IDs matching the query vars. - * - * @since 1.0.0 - * - * @return int|array A single count of item IDs if a count query. An array - * of item IDs if a full query. - */ - private function get_item_ids() - { - // Setup primary column, and parse the where clause - $this->parse_where(); - // Order & Order By - $order = $this->parse_order($this->query_vars['order']); - $orderby = $this->get_order_by($order); - // Limit & Offset - $limit = absint($this->query_vars['number']); - $offset = absint($this->query_vars['offset']); - // Limits - if (!empty($limit)) { - $limits = !empty($offset) ? "LIMIT {$offset}, {$limit}" : "LIMIT {$limit}"; - } else { - $limits = ''; - } - // Where & Join - $where = \implode(' AND ', $this->query_clauses['where']); - $join = \implode(', ', $this->query_clauses['join']); - // Group by - $groupby = $this->parse_groupby($this->query_vars['groupby']); - // Fields - $fields = $this->parse_fields($this->query_vars['fields']); - // Setup the query array (compact() is too opaque here) - $query = array('fields' => $fields, 'join' => $join, 'where' => $where, 'orderby' => $orderby, 'limits' => $limits, 'groupby' => $groupby); - /** - * Filters the item query clauses. - * - * @since 1.0.0 - * - * @param array $pieces A compacted array of item query clauses. - * @param Query &$this Current instance passed by reference. - */ - $clauses = (array) apply_filters_ref_array($this->apply_prefix("{$this->item_name_plural}_query_clauses"), array($query, &$this)); - // Setup request - $this->set_request_clauses($clauses); - $this->set_request(); - // Return count - if (!empty($this->query_vars['count'])) { - // Get vars or results - $retval = empty($this->query_vars['groupby']) ? $this->get_db()->get_var($this->request) : $this->get_db()->get_results($this->request, ARRAY_A); - // Return vars or results - return $retval; - } - // Get IDs - $item_ids = $this->get_db()->get_col($this->request); - // Return parsed IDs - return wp_parse_id_list($item_ids); - } - /** - * Get the ORDERBY clause. - * - * @since 1.0.0 - * - * @param string $order - * @return string - */ - private function get_order_by($order = '') - { - // Default orderby primary column - $parsed = $this->parse_orderby(); - $orderby = "{$parsed} {$order}"; - // Disable ORDER BY if counting, or: 'none', an empty array, or false. - if (!empty($this->query_vars['count']) || \in_array($this->query_vars['orderby'], array('none', array(), \false), \true)) { - $orderby = ''; - // Ordering by something, so figure it out - } elseif (!empty($this->query_vars['orderby'])) { - // Array of keys, or comma separated - $ordersby = \is_array($this->query_vars['orderby']) ? $this->query_vars['orderby'] : \preg_split('/[,\\s]/', $this->query_vars['orderby']); - $orderby_array = array(); - $possible_ins = $this->get_columns(array('in' => \true), 'and', 'name'); - $sortables = $this->get_columns(array('sortable' => \true), 'and', 'name'); - // Loop through possible order by's - foreach ($ordersby as $_key => $_value) { - // Skip if empty - if (empty($_value)) { - continue; - } - // Key is numeric - if (\is_int($_key)) { - $_orderby = $_value; - $_item = $order; - // Key is string - } else { - $_orderby = $_key; - $_item = $_value; - } - // Skip if not sortable - if (!\in_array($_value, $sortables, \true)) { - continue; - } - // Parse orderby - $parsed = $this->parse_orderby($_orderby); - // Skip if empty - if (empty($parsed)) { - continue; - } - // Set if __in - if (\in_array($_orderby, $possible_ins, \true)) { - $orderby_array[] = "{$parsed} {$order}"; - continue; - } - // Append parsed orderby to array - $orderby_array[] = $parsed . ' ' . $this->parse_order($_item); - } - // Only set if valid orderby - if (!empty($orderby_array)) { - $orderby = \implode(', ', $orderby_array); - } - } - // Return parsed orderby - return $orderby; - } - /** - * Used internally to generate an SQL string for searching across multiple - * columns. - * - * @since 1.0.0 - * - * @param string $string Search string. - * @param array $columns Columns to search. - * @return string Search SQL. - */ - private function get_search_sql($string = '', $columns = array()) - { - // Array or String - $like = \false !== \strpos($string, '*') ? '%' . \implode('%', \array_map(array($this->get_db(), 'esc_like'), \explode('*', $string))) . '%' : '%' . $this->get_db()->esc_like($string) . '%'; - // Default array - $searches = array(); - // Build search SQL - foreach ($columns as $column) { - $searches[] = $this->get_db()->prepare("{$column} LIKE %s", $like); - } - // Return the clause - return '(' . \implode(' OR ', $searches) . ')'; - } - /** Private Parsers *******************************************************/ - /** - * Parses arguments passed to the item query with default query parameters. - * - * @since 1.0.0 - * - * @see Query::__construct() - * - * @param string|array $query Array or string of Query arguments. - */ - private function parse_query($query = array()) - { - // Setup the query_vars_original var - $this->query_var_originals = wp_parse_args($query); - // Setup the query_vars parsed var - $this->query_vars = wp_parse_args($this->query_var_originals, $this->query_var_defaults); - /** - * Fires after the item query vars have been parsed. - * - * @since 1.0.0 - * - * @param Query &$this The Query instance (passed by reference). - */ - do_action_ref_array($this->apply_prefix("parse_{$this->item_name_plural}_query"), array(&$this)); - } - /** - * Parse the where clauses for all known columns. - * - * @todo split this method into smaller parts - * - * @since 1.0.0 - */ - private function parse_where() - { - // Defaults - $where = $join = $searchable = $date_query = array(); - // Loop through columns - foreach ($this->columns as $column) { - // Maybe add name to searchable array - if (\true === $column->searchable) { - $searchable[] = $column->name; - } - // Literal column comparison - if (!$this->is_query_var_default($column->name)) { - // Array (unprepared) - if (\is_array($this->query_vars[$column->name])) { - $where_id = "'" . \implode("', '", $this->get_db()->_escape($this->query_vars[$column->name])) . "'"; - $statement = "{$this->table_alias}.{$column->name} IN ({$where_id})"; - // Add to where array - $where[$column->name] = $statement; - // Numeric/String/Float (prepared) - } else { - $pattern = $this->get_column_field(array('name' => $column->name), 'pattern', '%s'); - $where_id = $this->query_vars[$column->name]; - $statement = "{$this->table_alias}.{$column->name} = {$pattern}"; - // Add to where array - $where[$column->name] = $this->get_db()->prepare($statement, $where_id); - } - } - // __in - if (\true === $column->in) { - $where_id = "{$column->name}__in"; - // Parse item for an IN clause. - if (isset($this->query_vars[$where_id]) && \is_array($this->query_vars[$where_id])) { - // Convert single item arrays to literal column comparisons - if (1 === \count($this->query_vars[$where_id])) { - $column_value = \reset($this->query_vars[$where_id]); - $statement = "{$this->table_alias}.{$column->name} = %s"; - $where[$column->name] = $this->get_db()->prepare($statement, $column_value); - // Implode - } else { - $where[$where_id] = "{$this->table_alias}.{$column->name} IN ( '" . \implode("', '", $this->get_db()->_escape($this->query_vars[$where_id])) . "' )"; - } - } - } - // __not_in - if (\true === $column->not_in) { - $where_id = "{$column->name}__not_in"; - // Parse item for a NOT IN clause. - if (isset($this->query_vars[$where_id]) && \is_array($this->query_vars[$where_id])) { - // Convert single item arrays to literal column comparisons - if (1 === \count($this->query_vars[$where_id])) { - $column_value = \reset($this->query_vars[$where_id]); - $statement = "{$this->table_alias}.{$column->name} != %s"; - $where[$column->name] = $this->get_db()->prepare($statement, $column_value); - // Implode - } else { - $where[$where_id] = "{$this->table_alias}.{$column->name} NOT IN ( '" . \implode("', '", $this->get_db()->_escape($this->query_vars[$where_id])) . "' )"; - } - } - } - // date_query - if (\true === $column->date_query) { - $where_id = "{$column->name}_query"; - $column_date = $this->query_vars[$where_id]; - // Parse item - if (!empty($column_date)) { - // Default arguments - $defaults = array('column' => "{$this->table_alias}.{$column->name}", 'before' => $column_date, 'inclusive' => \true); - // Default date query - if (\is_string($column_date)) { - $date_query[] = $defaults; - // Array query var - } elseif (\is_array($column_date)) { - // Auto-fill column if empty - if (empty($column_date['column'])) { - $column_date['column'] = $defaults['column']; - } - // Add clause to date query - $date_query[] = $column_date; - } - } - } - } - // Maybe search if columns are searchable. - if (!empty($searchable) && \strlen($this->query_vars['search'])) { - $search_columns = array(); - // Intersect against known searchable columns - if (!empty($this->query_vars['search_columns'])) { - $search_columns = \array_intersect($this->query_vars['search_columns'], $searchable); - } - // Default to all searchable columns - if (empty($search_columns)) { - $search_columns = $searchable; - } - /** - * Filters the columns to search in a Query search. - * - * @since 1.0.0 - * - * @param array $search_columns Array of column names to be searched. - * @param string $search Text being searched. - * @param object $this The current Query instance. - */ - $search_columns = (array) apply_filters($this->apply_prefix("{$this->item_name_plural}_search_columns"), $search_columns, $this->query_vars['search'], $this); - // Add search query clause - $where['search'] = $this->get_search_sql($this->query_vars['search'], $search_columns); - } - /** Query Classes *****************************************************/ - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get the meta table - $table = $this->get_meta_type(); - // Set the " AND " regex pattern - $and = '/^\\s*AND\\s*/'; - // Maybe perform a meta query. - $meta_query = $this->query_vars['meta_query']; - if (!empty($meta_query) && \is_array($meta_query)) { - $this->meta_query = $this->get_meta_query($meta_query); - $clauses = $this->meta_query->get_sql($table, $this->table_alias, $primary, $this); - // Not all objects have meta, so make sure this one exists - if (\false !== $clauses) { - // Set join - if (!empty($clauses['join'])) { - $join['meta_query'] = $clauses['join']; - } - // Set where - if (!empty($clauses['where'])) { - // Remove " AND " from query query where clause - $where['meta_query'] = \preg_replace($and, '', $clauses['where']); - } - } - } - // Maybe perform a compare query. - $compare_query = $this->query_vars['compare_query']; - if (!empty($compare_query) && \is_array($compare_query)) { - $this->compare_query = $this->get_compare_query($compare_query); - $clauses = $this->compare_query->get_sql($table, $this->table_alias, $primary, $this); - // Not all objects can compare, so make sure this one exists - if (\false !== $clauses) { - // Set join - if (!empty($clauses['join'])) { - $join['compare_query'] = $clauses['join']; - } - // Set where - if (!empty($clauses['where'])) { - // Remove " AND " from query where clause. - $where['compare_query'] = \preg_replace($and, '', $clauses['where']); - } - } - } - // Only do a date query with an array - $date_query = !empty($date_query) ? $date_query : $this->query_vars['date_query']; - // Maybe perform a date query - if (!empty($date_query) && \is_array($date_query)) { - $this->date_query = $this->get_date_query($date_query); - $clauses = $this->date_query->get_sql($this->table_name, $this->table_alias, $primary, $this); - // Not all objects are dates, so make sure this one exists - if (\false !== $clauses) { - // Set join - if (!empty($clauses['join'])) { - $join['date_query'] = $clauses['join']; - } - // Set where - if (!empty($clauses['where'])) { - // Remove " AND " from query where clause. - $where['date_query'] = \preg_replace($and, '', $clauses['where']); - } - } - } - // Set where and join clauses, removing possible empties - $this->query_clauses['where'] = \array_filter($where); - $this->query_clauses['join'] = \array_filter($join); - } - /** - * Parse which fields to query for. - * - * @since 1.0.0 - * - * @param string $fields - * @param bool $alias - * @return string - */ - private function parse_fields($fields = '', $alias = \true) - { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Default return value - $retval = \true === $alias ? "{$this->table_alias}.{$primary}" : $primary; - // No fields - if (empty($fields) && !empty($this->query_vars['count'])) { - // Possible fields to group by - $groupby_names = $this->parse_groupby($this->query_vars['groupby'], $alias); - $groupby_names = !empty($groupby_names) ? "{$groupby_names}" : ''; - // Group by or total count - $retval = !empty($groupby_names) ? "{$groupby_names}, COUNT(*) as count" : 'COUNT(*)'; - } - // Return fields (or COUNT) - return $retval; - } - /** - * Parses and sanitizes the 'groupby' keys passed into the item query. - * - * @since 1.0.0 - * - * @param string $groupby - * @param bool $alias - * @return string - */ - private function parse_groupby($groupby = '', $alias = \true) - { - // Bail if empty - if (empty($groupby)) { - return ''; - } - // Sanitize groupby columns - $groupby = (array) \array_map('sanitize_key', (array) $groupby); - // Re'flip column names back around - $columns = \array_flip($this->get_column_names()); - // Get the intersection of allowed column names to groupby columns - $intersect = \array_intersect($columns, $groupby); - // Bail if invalid column - if (empty($intersect)) { - return ''; - } - // Default return value - $retval = array(); - // Maybe prepend table alias to key - foreach ($intersect as $key) { - $retval[] = \true === $alias ? "{$this->table_alias}.{$key}" : $key; - } - // Separate sanitized columns - return \implode(',', \array_values($retval)); - } - /** - * Parses and sanitizes 'orderby' keys passed to the item query. - * - * @since 1.0.0 - * - * @param string $orderby Field for the items to be ordered by. - * @return string|false Value to used in the ORDER clause. False otherwise. - */ - private function parse_orderby($orderby = '') - { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Default return value - $parsed = "{$this->table_alias}.{$primary}"; - // Default to primary column - if (empty($orderby)) { - $orderby = $primary; - } - // __in - if (\false !== \strstr($orderby, '__in')) { - $column_name = \str_replace('__in', '', $orderby); - $column = $this->get_column_by(array('name' => $column_name)); - $item_in = $column->is_numeric() ? \implode(',', \array_map('absint', $this->query_vars[$orderby])) : \implode(',', $this->query_vars[$orderby]); - $parsed = "FIELD( {$this->table_alias}.{$column->name}, {$item_in} )"; - // Specific column - } else { - // Orderby is a literal, sortable column name - $sortables = $this->get_columns(array('sortable' => \true), 'and', 'name'); - if (\in_array($orderby, $sortables, \true)) { - $parsed = "{$this->table_alias}.{$orderby}"; - } - } - // Return parsed value - return $parsed; - } - /** - * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as - * necessary. - * - * @since 1.0.0 - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - private function parse_order($order = '') - { - // Bail if malformed - if (empty($order) || !\is_string($order)) { - return 'DESC'; - } - // Ascending or Descending - return 'ASC' === \strtoupper($order) ? 'ASC' : 'DESC'; - } - /** Private Shapers *******************************************************/ - /** - * Shape items into their most relevant objects. - * - * This will try to use item_shape, but will fallback to a private - * method for querying and caching items. - * - * If using the `fields` parameter, results will have unique shapes based on - * exactly what was requested. - * - * @since 1.0.0 - * - * @param array $items - * @return array - */ - private function shape_items($items = array()) - { - // Force to stdClass if querying for fields - if (!empty($this->query_vars['fields'])) { - $this->item_shape = 'stdClass'; - } - // Default return value - $retval = array(); - // Use foreach because it's faster than array_map() - if (!empty($items)) { - foreach ($items as $item) { - $retval[] = $this->get_item($item); - } - } - /** - * Filters the object query results. - * - * Looks like `edd_get_customers` - * - * @since 1.0.0 - * - * @param array $retval An array of items. - * @param object &$this Current instance of Query, passed by reference. - */ - $retval = (array) apply_filters_ref_array($this->apply_prefix("the_{$this->item_name_plural}"), array($retval, &$this)); - // Return filtered results - return !empty($this->query_vars['fields']) ? $this->get_item_fields($retval) : $retval; - } - /** - * Get specific item fields based on query_vars['fields']. - * - * @since 1.0.0 - * - * @param array $items - * @return array - */ - private function get_item_fields($items = array()) - { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get the query var fields - $fields = $this->query_vars['fields']; - // Strings need to be single columns - if (\is_string($fields)) { - $field = sanitize_key($fields); - $items = 'ids' === $fields ? wp_list_pluck($items, $primary) : wp_list_pluck($items, $field, $primary); - // Arrays could be anything - } elseif (\is_array($fields)) { - $new_items = array(); - $fields = \array_flip($fields); - // Loop through items and pluck out the fields - foreach ($items as $item_id => $item) { - $new_items[$item_id] = (object) \array_intersect_key((array) $item, $fields); - } - // Set the items and unset the new items - $items = $new_items; - unset($new_items); - } - // Return the item, possibly reduced - return $items; - } - /** - * Shape an item ID from an object, array, or numeric value. - * - * @since 1.0.0 - * - * @param mixed $item - * @return int - */ - private function shape_item_id($item = 0) - { - // Default return value - $retval = 0; - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Numeric item ID - if (\is_numeric($item)) { - $retval = $item; - // Object item - } elseif (\is_object($item) && isset($item->{$primary})) { - $retval = $item->{$primary}; - // Array item - } elseif (\is_array($item) && isset($item[$primary])) { - $retval = $item[$primary]; - } - // Return the item ID - return absint($retval); - } - /** Queries ***************************************************************/ - /** - * Get a single database row by the primary column ID, possibly from cache. - * - * Accepts an integer, object, or array, and attempts to get the ID from it, - * then attempts to retrieve that item fresh from the database or cache. - * - * @since 1.0.0 - * - * @param int|array|object $item_id The ID of the item - * @return object|false False if empty/error, Object if successful - */ - public function get_item($item_id = 0) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no item to get by - if (empty($item_id)) { - return \false; - } - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get item by ID - return $this->get_item_by($primary, $item_id); - } - /** - * Get a single database row by any column and value, possibly from cache. - * - * Take care to only use this method on columns with unique values, - * preferably with a cache group for that column. See: get_item(). - * - * @since 1.0.0 - * - * @param string $column_name Name of database column - * @param int|string $column_value Value to query for - * @return object|false False if empty/error, Object if successful - */ - public function get_item_by($column_name = '', $column_value = '') - { - // Default return value - $retval = \false; - // Bail if no key or value - if (empty($column_name) || empty($column_value)) { - return $retval; - } - // Bail if name is not a string - if (!\is_string($column_name)) { - return $retval; - } - // Bail if value is not scalar (null values also not allowed) - if (!\is_scalar($column_value)) { - return $retval; - } - // Get all of the column names - $columns = $this->get_column_names(); - // Bail if column does not exist - if (!isset($columns[$column_name])) { - return $retval; - } - // Get all of the cache groups - $groups = $this->get_cache_groups(); - // Check cache - if (!empty($groups[$column_name])) { - $retval = $this->cache_get($column_value, $groups[$column_name]); - } - // Item not cached - if (\false === $retval) { - // Get item by column name & value (from database, not cache) - $retval = $this->get_item_raw($column_name, $column_value); - // Bail on failure - if (!$this->is_success($retval)) { - return \false; - } - // Update item cache(s) - $this->update_item_cache($retval); - } - // Reduce the item - $retval = $this->reduce_item('select', $retval); - // Return result - return $this->shape_item($retval); - } - /** - * Add an item to the database. - * - * @since 1.0.0 - * - * @param array $data - * @return bool - */ - public function add_item($data = array()) - { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // If data includes primary column, check if item already exists - if (!empty($data[$primary])) { - // Shape the primary item ID - $item_id = $this->shape_item_id($data[$primary]); - // Get item by ID (from database, not cache) - $item = $this->get_item_raw($primary, $item_id); - // Bail if item already exists - if (!empty($item)) { - return \false; - } - // Set data primary ID to newly shaped ID - $data[$primary] = $item_id; - } - // Get default values for item (from columns) - $item = $this->default_item(); - // Unset the primary key if not part of data array (auto-incremented) - if (empty($data[$primary])) { - unset($item[$primary]); - } - // Cut out non-keys for meta - $columns = $this->get_column_names(); - $data = \array_merge($item, $data); - $meta = \array_diff_key($data, $columns); - $save = \array_intersect_key($data, $columns); - // Bail if nothing to save - if (empty($save) && empty($meta)) { - return \false; - } - // Get the current time (maybe used by created/modified) - $time = $this->get_current_time(); - // If date-created exists, but is empty or default, use the current time - $created = $this->get_column_by(array('created' => \true)); - if (!empty($created) && (empty($save[$created->name]) || $save[$created->name] === $created->default)) { - $save[$created->name] = $time; - } - // If date-modified exists, but is empty or default, use the current time - $modified = $this->get_column_by(array('modified' => \true)); - if (!empty($modified) && (empty($save[$modified->name]) || $save[$modified->name] === $modified->default)) { - $save[$modified->name] = $time; - } - // Try to add - $table = $this->get_table_name(); - $reduce = $this->reduce_item('insert', $save); - $save = $this->validate_item($reduce); - $result = !empty($save) ? $this->get_db()->insert($table, $save) : \false; - // Bail on failure - if (!$this->is_success($result)) { - return \false; - } - // Get the new item ID - $item_id = $this->get_db()->insert_id; - // Maybe save meta keys - if (!empty($meta)) { - $this->save_extra_item_meta($item_id, $meta); - } - // Update item cache(s) - $this->update_item_cache($item_id); - // Transition item data - $this->transition_item($save, array(), $item_id); - // Return result - return $item_id; - } - /** - * Copy an item in the database to a new item. - * - * @since 1.1.0 - * - * @param int $item_id - * @param array $data - * @return bool - */ - public function copy_item($item_id = 0, $data = array()) - { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get item by ID (from database, not cache) - $item = $this->get_item_raw($primary, $item_id); - // Bail if item does not exist - if (empty($item)) { - return \false; - } - // Cast object to array - $save = (array) $item; - // Maybe merge data with original item - if (!empty($data) && \is_array($data)) { - $save = \array_merge($save, $data); - } - // Unset the primary key - unset($save[$primary]); - // Return result - return $this->add_item($save); - } - /** - * Update an item in the database. - * - * @since 1.0.0 - * - * @param int $item_id - * @param array $data - * @return bool - */ - public function update_item($item_id = 0, $data = array()) - { - // Bail early if no data to update - if (empty($data)) { - return \false; - } - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no item ID - if (empty($item_id)) { - return \false; - } - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get item to update (from database, not cache) - $item = $this->get_item_raw($primary, $item_id); - // Bail if item does not exist to update - if (empty($item)) { - return \false; - } - // Cast as an array for easier manipulation - $item = (array) $item; - // Unset the primary key from item & data - unset($data[$primary], $item[$primary]); - // Slice data that has columns, and cut out non-keys for meta - $columns = $this->get_column_names(); - $data = \array_diff_assoc($data, $item); - $meta = \array_diff_key($data, $columns); - $save = \array_intersect_key($data, $columns); - // Maybe save meta keys - if (!empty($meta)) { - $this->save_extra_item_meta($item_id, $meta); - } - // Bail if nothing to save - if (empty($save)) { - return \false; - } - // If date-modified exists, use the current time - $modified = $this->get_column_by(array('modified' => \true)); - if (!empty($modified)) { - $save[$modified->name] = $this->get_current_time(); - } - // Try to update - $table = $this->get_table_name(); - $reduce = $this->reduce_item('update', $save); - $save = $this->validate_item($reduce); - $where = array($primary => $item_id); - $result = !empty($save) ? $this->get_db()->update($table, $save, $where) : \false; - // Bail on failure - if (!$this->is_success($result)) { - return \false; - } - // Update item cache(s) - $this->update_item_cache($item_id); - // Transition item data - $this->transition_item($save, $item, $item_id); - // Return result - return $result; - } - /** - * Delete an item from the database. - * - * @since 1.0.0 - * - * @param int $item_id - * @return bool - */ - public function delete_item($item_id = 0) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no item ID - if (empty($item_id)) { - return \false; - } - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get item by ID (from database, not cache) - $item = $this->get_item_raw($primary, $item_id); - // Bail if item does not exist to delete - if (empty($item)) { - return \false; - } - // Attempt to reduce this item - $item = $this->reduce_item('delete', $item); - // Bail if item was reduced to nothing - if (empty($item)) { - return \false; - } - // Try to delete - $table = $this->get_table_name(); - $where = array($primary => $item_id); - $result = $this->get_db()->delete($table, $where); - // Bail on failure - if (!$this->is_success($result)) { - return \false; - } - // Clean caches on successful delete - $this->delete_all_item_meta($item_id); - $this->clean_item_cache($item); - // Return result - return $result; - } - /** - * Filter an item before it is inserted of updated in the database. - * - * This method is public to allow subclasses to perform JIT manipulation - * of the parameters passed into it. - * - * @since 1.0.0 - * - * @param array $item - * @return array - */ - public function filter_item($item = array()) - { - return (array) apply_filters_ref_array($this->apply_prefix("filter_{$this->item_name}_item"), array($item, &$this)); - } - /** - * Shape an item from the database into the type of object it always wanted - * to be when it grew up. - * - * @since 1.0.0 - * - * @param mixed ID of item, or row from database - * @return mixed False on error, Object of single-object class type on success - */ - private function shape_item($item = 0) - { - // Get the item from an ID - if (\is_numeric($item)) { - $item = $this->get_item($item); - } - // Return the item if it's already shaped - if ($item instanceof $this->item_shape) { - return $item; - } - // Shape the item as needed - $item = !empty($this->item_shape) ? new $this->item_shape($item) : (object) $item; - // Return the item object - return $item; - } - /** - * Validate an item before it is updated in or added to the database. - * - * @since 1.0.0 - * - * @param array $item - * @return array|false False on error, Array of validated values on success - */ - private function validate_item($item = array()) - { - // Bail if item is empty or not an array - if (empty($item) || !\is_array($item)) { - return $item; - } - // Loop through item attributes - foreach ($item as $key => $value) { - // Get the column - $column = $this->get_column_by(array('name' => $key)); - // Null value is special for all item keys - if (\is_null($value)) { - // Bail if null is not allowed - if (\false === $column->allow_null) { - return \false; - } - // Attempt to validate - } elseif (!empty($column->validate) && \is_callable($column->validate)) { - $validated = \call_user_func($column->validate, $value); - // Bail if error - if (is_wp_error($validated)) { - return \false; - } - // Update the value - $item[$key] = $validated; - /** - * Fallback to using the raw value. - * - * Note: This may change at a later date, so do not rely on this. - * Please always validate all data. - */ - } else { - $item[$key] = $value; - } - } - // Return the validated item - return $this->filter_item($item); - } - /** - * Reduce an item down to the keys and values the current user has the - * appropriate capabilities to select|insert|update|delete. - * - * Note that internally, this method works with both arrays and objects of - * any type, and also resets the key values. It looks weird, but is - * currently by design to protect the integrity of the return value. - * - * @since 1.0.0 - * - * @param string $method select|insert|update|delete - * @param mixed $item Object|Array of keys/values to reduce - * - * @return mixed Object|Array without keys the current user does not have caps for - */ - private function reduce_item($method = 'update', $item = array()) - { - // Bail if item is empty - if (empty($item)) { - return $item; - } - // Loop through item attributes - foreach ($item as $key => $value) { - // Get capabilities for this column - $caps = $this->get_column_field(array('name' => $key), 'caps'); - // Unset if not explicitly allowed - if (empty($caps[$method])) { - if (\is_array($item)) { - unset($item[$key]); - } elseif (\is_object($item)) { - $item->{$key} = null; - } - // Set if explicitly allowed - } elseif (\is_array($item)) { - $item[$key] = $value; - } elseif (\is_object($item)) { - $item->{$key} = $value; - } - } - // Return the reduced item - return $item; - } - /** - * Return an item comprised of all default values. - * - * This is used by `add_item()` to populate known default values, to ensure - * new item data is always what we expect it to be. - * - * @since 1.0.0 - * - * @return array - */ - private function default_item() - { - // Default return value - $retval = array(); - // Get the column names and their defaults - $names = $this->get_columns(array(), 'and', 'name'); - $defaults = $this->get_columns(array(), 'and', 'default'); - // Put together an item using default values - foreach ($names as $key => $name) { - $retval[$name] = $defaults[$key]; - } - // Return - return $retval; - } - /** - * Transition an item when adding or updating. - * - * This method takes the data being saved, looks for any columns that are - * known to transition between values, and fires actions on them. - * - * @since 1.0.0 - * - * @param array $new_data - * @param array $old_data - * @param int $item_id - * @return array - */ - private function transition_item($new_data = array(), $old_data = array(), $item_id = 0) - { - // Look for transition columns - $columns = $this->get_columns(array('transition' => \true), 'and', 'name'); - // Bail if no columns to transition - if (empty($columns)) { - return; - } - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no item ID - if (empty($item_id)) { - return; - } - // If no old value(s), it's new - if (empty($old_data) || !\is_array($old_data)) { - $old_data = $new_data; - // Set all old values to "new" - foreach ($old_data as $key => $value) { - $value = 'new'; - $old_data[$key] = $value; - } - } - // Compare - $keys = \array_flip($columns); - $new = \array_intersect_key($new_data, $keys); - $old = \array_intersect_key($old_data, $keys); - // Get the difference - $diff = \array_diff($new, $old); - // Bail if nothing is changing - if (empty($diff)) { - return; - } - // Do the actions - foreach ($diff as $key => $value) { - $old_value = $old_data[$key]; - $new_value = $new_data[$key]; - $key_action = $this->apply_prefix("transition_{$this->item_name}_{$key}"); - /** - * Fires after an object value has transitioned. - * - * @since 1.0.0 - * - * @param mixed $old_value The value being transitioned FROM. - * @param mixed $new_value The value being transitioned TO. - * @param int $item_id The ID of the item that is transitioning. - */ - do_action($key_action, $old_value, $new_value, $item_id); - } - } - /** Meta ******************************************************************/ - /** - * Add meta data to an item. - * - * @since 1.0.0 - * - * @param int $item_id - * @param string $meta_key - * @param string $meta_value - * @param string $unique - * @return int|false The meta ID on success, false on failure. - */ - protected function add_item_meta($item_id = 0, $meta_key = '', $meta_value = '', $unique = \false) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no meta to add - if (empty($item_id) || empty($meta_key)) { - return \false; - } - // Bail if no meta table exists - if (\false === $this->get_meta_table_name()) { - return \false; - } - // Get the meta type - $meta_type = $this->get_meta_type(); - // Return results of adding meta data - return add_metadata($meta_type, $item_id, $meta_key, $meta_value, $unique); - } - /** - * Get meta data for an item. - * - * @since 1.0.0 - * - * @param int $item_id - * @param string $meta_key - * @param bool $single - * @return mixed Single metadata value, or array of values - */ - protected function get_item_meta($item_id = 0, $meta_key = '', $single = \false) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no meta was returned - if (empty($item_id) || empty($meta_key)) { - return \false; - } - // Bail if no meta table exists - if (\false === $this->get_meta_table_name()) { - return \false; - } - // Get the meta type - $meta_type = $this->get_meta_type(); - // Return results of getting meta data - return get_metadata($meta_type, $item_id, $meta_key, $single); - } - /** - * Update meta data for an item. - * - * @since 1.0.0 - * - * @param int $item_id - * @param string $meta_key - * @param string $meta_value - * @param string $prev_value - * @return bool True on successful update, false on failure. - */ - protected function update_item_meta($item_id = 0, $meta_key = '', $meta_value = '', $prev_value = '') - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no meta was returned - if (empty($item_id) || empty($meta_key)) { - return \false; - } - // Bail if no meta table exists - if (\false === $this->get_meta_table_name()) { - return \false; - } - // Get the meta type - $meta_type = $this->get_meta_type(); - // Return results of updating meta data - return update_metadata($meta_type, $item_id, $meta_key, $meta_value, $prev_value); - } - /** - * Delete meta data for an item. - * - * @since 1.0.0 - * - * @param int $item_id - * @param string $meta_key - * @param string $meta_value - * @param string $delete_all - * @return bool True on successful delete, false on failure. - */ - protected function delete_item_meta($item_id = 0, $meta_key = '', $meta_value = '', $delete_all = \false) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no meta was returned - if (empty($item_id) || empty($meta_key)) { - return \false; - } - // Bail if no meta table exists - if (\false === $this->get_meta_table_name()) { - return \false; - } - // Get the meta type - $meta_type = $this->get_meta_type(); - // Return results of deleting meta data - return delete_metadata($meta_type, $item_id, $meta_key, $meta_value, $delete_all); - } - /** - * Get registered meta data keys. - * - * @since 1.0.0 - * - * @param string $object_subtype The sub-type of meta keys - * - * @return array - */ - private function get_registered_meta_keys($object_subtype = '') - { - // Get the object type - $object_type = $this->get_meta_type(); - // Return the keys - return get_registered_meta_keys($object_type, $object_subtype); - } - /** - * Maybe update meta values on item update/save. - * - * @since 1.0.0 - * - * @param array $meta - */ - private function save_extra_item_meta($item_id = 0, $meta = array()) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if there is no bulk meta to save - if (empty($item_id) || empty($meta)) { - return; - } - // Bail if no meta table exists - if (\false === $this->get_meta_table_name()) { - return; - } - // Only save registered keys - $keys = $this->get_registered_meta_keys(); - $meta = \array_intersect_key($meta, $keys); - // Bail if no registered meta keys - if (empty($meta)) { - return; - } - // Save or delete meta data - foreach ($meta as $key => $value) { - !empty($value) ? $this->update_item_meta($item_id, $key, $value) : $this->delete_item_meta($item_id, $key); - } - } - /** - * Delete all meta data for an item. - * - * @since 1.0.0 - * - * @param int $item_id - */ - private function delete_all_item_meta($item_id = 0) - { - // Shape the item ID - $item_id = $this->shape_item_id($item_id); - // Bail if no item ID - if (empty($item_id)) { - return; - } - // Get the meta table name - $table = $this->get_meta_table_name(); - // Bail if no meta table exists - if (empty($table)) { - return; - } - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Guess the item ID column for the meta table - $item_id_column = $this->apply_prefix("{$this->item_name}_{$primary}"); - // Get meta IDs - $query = "SELECT meta_id FROM {$table} WHERE {$item_id_column} = %d"; - $prepared = $this->get_db()->prepare($query, $item_id); - $meta_ids = $this->get_db()->get_col($prepared); - // Bail if no meta IDs to delete - if (empty($meta_ids)) { - return; - } - // Get the meta type - $meta_type = $this->get_meta_type(); - // Delete all meta data for this item ID - foreach ($meta_ids as $mid) { - delete_metadata_by_mid($meta_type, $mid); - } - } - /** - * Get the meta table for this query. - * - * Forked from WordPress\_get_meta_table() so it can be more accurately - * predicted in a future iteration and default to returning false. - * - * @since 1.0.0 - * - * @return mixed Table name if exists, False if not - */ - private function get_meta_table_name() - { - // Get the meta-type - $type = $this->get_meta_type(); - // Append "meta" to end of meta-type - $table_name = "{$type}meta"; - // Variable'ize the database interface, to use inside empty() - $db = $this->get_db(); - // If not empty, return table name - if (!empty($db->{$table_name})) { - return $db->{$table_name}; - } - // Default return false - return \false; - } - /** - * Get the meta type for this query. - * - * This method exists to reduce some duplication for now. Future iterations - * will likely use Column::relationships to - * - * @since 1.1.0 - * - * @return string - */ - private function get_meta_type() - { - return $this->apply_prefix($this->item_name); - } - /** Cache *****************************************************************/ - /** - * Get cache key from query_vars and query_var_defaults. - * - * @since 1.0.0 - * - * @return string - */ - private function get_cache_key($group = '') - { - // Slice query vars - $slice = wp_array_slice_assoc($this->query_vars, \array_keys($this->query_var_defaults)); - // Unset `fields` so it does not effect the cache key - unset($slice['fields']); - // Setup key & last_changed - $key = \md5(\serialize($slice)); - $last_changed = $this->get_last_changed_cache($group); - // Concatenate and return cache key - return "get_{$this->item_name_plural}:{$key}:{$last_changed}"; - } - /** - * Get the cache group, or fallback to the primary one. - * - * @since 1.0.0 - * - * @param string $group - * @return string - */ - private function get_cache_group($group = '') - { - // Get the primary column - $primary = $this->get_primary_column_name(); - // Default return value - $retval = $this->cache_group; - // Only allow non-primary groups - if (!empty($group) && $group !== $primary) { - $retval = $group; - } - // Return the group - return $retval; - } - /** - * Get array of which database columns have uniquely cached groups. - * - * @since 1.0.0 - * - * @return array - */ - private function get_cache_groups() - { - // Return value - $cache_groups = array(); - // Get the cache groups - $groups = $this->get_columns(array('cache_key' => \true), 'and', 'name'); - if (!empty($groups)) { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Setup return values - foreach ($groups as $name) { - if ($primary !== $name) { - $cache_groups[$name] = "{$this->cache_group}-by-{$name}"; - } else { - $cache_groups[$name] = $this->cache_group; - } - } - } - // Return cache groups array - return $cache_groups; - } - /** - * Maybe prime item & item-meta caches by querying 1 time for all un-cached - * items. - * - * Accepts a single ID, or an array of IDs. - * - * The reason this accepts only IDs is because it gets called immediately - * after an item is inserted in the database, but before items have been - * "shaped" into proper objects, so object properties may not be set yet. - * - * @since 1.0.0 - * - * @param array $item_ids - * @param bool $force - * - * @return bool False if empty - */ - private function prime_item_caches($item_ids = array(), $force = \false) - { - // Bail if no items to cache - if (empty($item_ids)) { - return \false; - } - // Accepts single values, so cast to array - $item_ids = (array) $item_ids; - // Update item caches - if (!empty($force) || !empty($this->query_vars['update_item_cache'])) { - // Look for non-cached IDs - $ids = $this->get_non_cached_ids($item_ids, $this->cache_group); - // Bail if IDs are cached - if (empty($ids)) { - return \false; - } - // Get query parts - $table = $this->get_table_name(); - $primary = $this->get_primary_column_name(); - // Query database - $query = "SELECT * FROM {$table} WHERE {$primary} IN (%s)"; - $ids = \implode(',', \array_map('absint', $ids)); - $prepare = \sprintf($query, $ids); - $results = $this->get_db()->get_results($prepare); - // Update item cache(s) - $this->update_item_cache($results); - } - // Update meta data caches - if (!empty($this->query_vars['update_meta_cache'])) { - $singular = \rtrim($this->table_name, 's'); - // sic - update_meta_cache($singular, $item_ids); - } - } - /** - * Update the cache for an item. Does not update item-meta cache. - * - * Accepts a single object, or an array of objects. - * - * The reason this does not accept ID's is because this gets called - * after an item is already updated in the database, so we want to avoid - * querying for it again. It's just safer this way. - * - * @since 1.0.0 - * - * @param array $items - */ - private function update_item_cache($items = array()) - { - // Maybe query for single item - if (\is_numeric($items)) { - // Get the primary column name - $primary = $this->get_primary_column_name(); - // Get item by ID (from database, not cache) - $items = $this->get_item_raw($primary, $items); - } - // Bail if no items to cache - if (empty($items)) { - return \false; - } - // Make sure items are an array (without casting objects to arrays) - if (!\is_array($items)) { - $items = array($items); - } - // Get the cache groups - $groups = $this->get_cache_groups(); - // Loop through all items and cache them - foreach ($items as $item) { - // Skip if item is not an object - if (!\is_object($item)) { - continue; - } - // Loop through groups and set cache - if (!empty($groups)) { - foreach ($groups as $key => $group) { - $this->cache_set($item->{$key}, $item, $group); - } - } - } - // Update last changed - $this->update_last_changed_cache(); - } - /** - * Clean the cache for an item. Does not clean item-meta. - * - * Accepts a single object, or an array of objects. - * - * The reason this does not accept ID's is because this gets called - * after an item is already deleted from the database, so it cannot be - * queried and may not exist in the cache. It's just safer this way. - * - * @since 1.0.0 - * - * @param mixed $items Single object item, or Array of object items - * - * @return bool - */ - private function clean_item_cache($items = array()) - { - // Bail if no items to clean - if (empty($items)) { - return \false; - } - // Make sure items are an array - if (!\is_array($items)) { - $items = array($items); - } - // Get the cache groups - $groups = $this->get_cache_groups(); - // Loop through all items and clean them - foreach ($items as $item) { - // Skip if item is not an object - if (!\is_object($item)) { - continue; - } - // Loop through groups and delete cache - if (!empty($groups)) { - foreach ($groups as $key => $group) { - $this->cache_delete($item->{$key}, $group); - } - } - } - // Update last changed - $this->update_last_changed_cache(); - } - /** - * Update the last_changed key for the cache group. - * - * @since 1.0.0 - * - * @return string The last time a cache group was changed. - */ - private function update_last_changed_cache($group = '') - { - // Fallback to microtime - if (empty($this->last_changed)) { - $this->set_last_changed(); - } - // Set the last changed time for this cache group - $this->cache_set('last_changed', $this->last_changed, $group); - // Return the last changed time - return $this->last_changed; - } - /** - * Get the last_changed key for a cache group. - * - * @since 1.0.0 - * - * @param string $group Cache group. Defaults to $this->cache_group - * - * @return string The last time a cache group was changed. - */ - private function get_last_changed_cache($group = '') - { - // Get the last changed cache value - $last_changed = $this->cache_get('last_changed', $group); - // Maybe update the last changed value - if (\false === $last_changed) { - $last_changed = $this->update_last_changed_cache($group); - } - // Return the last changed value for the cache group - return $last_changed; - } - /** - * Get array of non-cached item IDs. - * - * @since 1.0.0 - * - * @param array $item_ids Array of item IDs - * @param string $group Cache group. Defaults to $this->cache_group - * - * @return array - */ - private function get_non_cached_ids($item_ids = array(), $group = '') - { - // Default return value - $retval = array(); - // Bail if no item IDs - if (empty($item_ids)) { - return $retval; - } - // Loop through item IDs - foreach ($item_ids as $id) { - // Shape the item ID - $id = $this->shape_item_id($id); - // Add to return value if not cached - if (\false === $this->cache_get($id, $group)) { - $retval[] = $id; - } - } - // Return array of IDs - return $retval; - } - /** - * Add a cache value for a key and group. - * - * @since 1.0.0 - * - * @param string $key Cache key. - * @param mixed $value Cache value. - * @param string $group Cache group. Defaults to $this->cache_group - * @param int $expire Expiration. - */ - private function cache_add($key = '', $value = '', $group = '', $expire = 0) - { - // Bail if cache invalidation is suspended - if (wp_suspend_cache_addition()) { - return; - } - // Bail if no cache key - if (empty($key)) { - return; - } - // Get the cache group - $group = $this->get_cache_group($group); - // Add to the cache - wp_cache_add($key, $value, $group, $expire); - } - /** - * Get a cache value for a key and group. - * - * @since 1.0.0 - * - * @param string $key Cache key. - * @param string $group Cache group. Defaults to $this->cache_group - * @param bool $force - */ - private function cache_get($key = '', $group = '', $force = \false) - { - // Bail if no cache key - if (empty($key)) { - return; - } - // Get the cache group - $group = $this->get_cache_group($group); - // Return from the cache - return wp_cache_get($key, $group, $force); - } - /** - * Set a cache value for a key and group. - * - * @since 1.0.0 - * - * @param string $key Cache key. - * @param mixed $value Cache value. - * @param string $group Cache group. Defaults to $this->cache_group - * @param int $expire Expiration. - */ - private function cache_set($key = '', $value = '', $group = '', $expire = 0) - { - // Bail if cache invalidation is suspended - if (wp_suspend_cache_addition()) { - return; - } - // Bail if no cache key - if (empty($key)) { - return; - } - // Get the cache group - $group = $this->get_cache_group($group); - // Update the cache - wp_cache_set($key, $value, $group, $expire); - } - /** - * Delete a cache key for a group. - * - * @since 1.0.0 - * - * @global bool $_wp_suspend_cache_invalidation - * - * @param string $key Cache key. - * @param string $group Cache group. Defaults to $this->cache_group - */ - private function cache_delete($key = '', $group = '') - { - global $_wp_suspend_cache_invalidation; - // Bail if cache invalidation is suspended - if (!empty($_wp_suspend_cache_invalidation)) { - return; - } - // Bail if no cache key - if (empty($key)) { - return; - } - // Get the cache group - $group = $this->get_cache_group($group); - // Delete the cache - wp_cache_delete($key, $group); - } - /** - * Fetch raw results directly from the database. - * - * @since 1.0.0 - * - * @param array $cols Columns for `SELECT`. - * @param array $where_cols Where clauses. Each key-value pair in the array - * represents a column and a comparison. - * @param int $limit Optional. LIMIT value. Default 25. - * @param null $offset Optional. OFFSET value. Default null. - * @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. - * Default OBJECT. - * With one of the first three, return an array of - * rows indexed from 0 by SQL result row number. - * Each row is an associative array (column => value, ...), - * a numerically indexed array (0 => value, ...), - * or an object. ( ->column = value ), respectively. - * With OBJECT_K, return an associative array of - * row objects keyed by the value of each row's - * first column's value. - * - * @return array|object|null Database query results. - */ - public function get_results($cols = array(), $where_cols = array(), $limit = 25, $offset = null, $output = OBJECT) - { - // Bail if no columns have been passed - if (empty($cols)) { - return null; - } - // Fetch all the columns for the table being queried - $column_names = $this->get_column_names(); - // Ensure valid column names have been passed for the `SELECT` clause - foreach ($cols as $index => $column) { - if (!\array_key_exists($column, $column_names)) { - unset($cols[$index]); - } - } - // Columns to retrieve - $columns = \implode(',', $cols); - // Get the table name - $table = $this->get_table_name(); - // Setup base query - $query = \implode(' ', array("SELECT", $columns, "FROM {$table} {$this->table_alias}", "WHERE 1=1")); - // Ensure valid columns have been passed for the `WHERE` clause - if (!empty($where_cols)) { - // Get keys from where columns - $columns = \array_keys($where_cols); - // Loop through columns and unset any invalid names - foreach ($columns as $index => $column) { - if (!\array_key_exists($column, $column_names)) { - unset($where_cols[$index]); - } - } - // Parse WHERE clauses - foreach ($where_cols as $column => $compare) { - // Basic WHERE clause - if (!\is_array($compare)) { - $pattern = $this->get_column_field(array('name' => $column), 'pattern', '%s'); - $statement = " AND {$this->table_alias}.{$column} = {$pattern} "; - $query .= $this->get_db()->prepare($statement, $compare); - // More complex WHERE clause - } else { - $value = isset($compare['value']) ? $compare['value'] : \false; - // Skip if a value was not provided - if (\false === $value) { - continue; - } - // Default compare clause to equals - $compare_clause = isset($compare['compare_query']) ? \trim(\strtoupper($compare['compare_query'])) : '='; - // Array (unprepared) - if (\is_array($compare['value'])) { - // Default to IN if clause not specified - if (!\in_array($compare_clause, array('IN', 'NOT IN', 'BETWEEN'), \true)) { - $compare_clause = 'IN'; - } - // Parse & escape for IN and NOT IN - if ('IN' === $compare_clause || 'NOT IN' === $compare_clause) { - $value = "('" . \implode("','", $this->get_db()->_escape($compare['value'])) . "')"; - // Parse & escape for BETWEEN - } elseif (\is_array($value) && 2 === \count($value) && 'BETWEEN' === $compare_clause) { - $_this = $this->get_db()->_escape($value[0]); - $_that = $this->get_db()->_escape($value[1]); - $value = " {$_this} AND {$_that} "; - } - } - // Add WHERE clause - $query .= " AND {$this->table_alias}.{$column} {$compare_clause} {$value} "; - } - } - } - // Maybe set an offset - if (!empty($offset)) { - $values = \explode(',', $offset); - $values = \array_filter($values, 'intval'); - $offset = \implode(',', $values); - $query .= " OFFSET {$offset} "; - } - // Maybe set a limit - if (!empty($limit) && $limit > 0) { - $limit = \intval($limit); - $query .= " LIMIT {$limit} "; - } - // Execute query - $results = $this->get_db()->get_results($query, $output); - // Return results - return $results; - } -} diff --git a/dependencies/berlindb/core/src/Database/Row.php b/dependencies/berlindb/core/src/Database/Row.php deleted file mode 100644 index 75f9cb1..0000000 --- a/dependencies/berlindb/core/src/Database/Row.php +++ /dev/null @@ -1,66 +0,0 @@ -init($item); - } - } - /** - * Initialize class properties based on data array. - * - * @since 1.0.0 - * - * @param array $data - */ - private function init($data = array()) - { - $this->set_vars($data); - } - /** - * Determines whether the current row exists. - * - * @since 1.0.0 - * - * @return bool - */ - public function exists() - { - return !empty($this->id); - } -} diff --git a/dependencies/berlindb/core/src/Database/Schema.php b/dependencies/berlindb/core/src/Database/Schema.php deleted file mode 100644 index edd5269..0000000 --- a/dependencies/berlindb/core/src/Database/Schema.php +++ /dev/null @@ -1,81 +0,0 @@ -columns) || !\is_array($this->columns)) { - return; - } - // Juggle original columns array - $columns = $this->columns; - $this->columns = array(); - // Loop through columns and create objects from them - foreach ($columns as $column) { - if (\is_array($column)) { - $this->columns[] = new Column($column); - } elseif ($column instanceof Column) { - $this->columns[] = $column; - } - } - } - /** - * Return the schema in string form. - * - * @since 1.0.0 - * - * @return string Calls get_create_string() on every column. - */ - protected function to_string() - { - // Default return value - $retval = ''; - // Bail if no columns to convert - if (empty($this->columns)) { - return $retval; - } - // Loop through columns... - foreach ($this->columns as $column_info) { - if (\method_exists($column_info, 'get_create_string')) { - $retval .= '\\n' . $column_info->get_create_string() . ', '; - } - } - // Return the string - return $retval; - } -} diff --git a/dependencies/berlindb/core/src/Database/Table.php b/dependencies/berlindb/core/src/Database/Table.php deleted file mode 100644 index 0518a18..0000000 --- a/dependencies/berlindb/core/src/Database/Table.php +++ /dev/null @@ -1,836 +0,0 @@ - value array of versions => methods. - * - * @since 1.0.0 - * @var array - */ - protected $upgrades = array(); - /** Methods ***************************************************************/ - /** - * Hook into queries, admin screens, and more! - * - * @since 1.0.0 - */ - public function __construct() - { - // Setup the database table - $this->setup(); - // Bail if setup failed - if (empty($this->name) || empty($this->db_version_key)) { - return; - } - // Add the table to the database interface - $this->set_db_interface(); - // Set the database schema - $this->set_schema(); - // Add hooks - $this->add_hooks(); - // Maybe force upgrade if testing - if ($this->is_testing()) { - $this->maybe_upgrade(); - } - } - /** - * Compatibility for clone() method for PHP versions less than 7.0. - * - * See: https://github.com/sugarcalendar/core/issues/105 - * - * This shim will be removed at a later date. - * - * @since 2.0.20 - * - * @param string $function - * @param array $args - */ - public function __call($function = '', $args = array()) - { - if ('clone' === $function) { - \call_user_func_array(array($this, '_clone'), $args); - } - } - /** Abstract **************************************************************/ - /** - * Setup this database table. - * - * @since 1.0.0 - */ - protected abstract function set_schema(); - /** Multisite *************************************************************/ - /** - * Update table version & references. - * - * Hooked to the "switch_blog" action. - * - * @since 1.0.0 - * - * @param int $site_id The site being switched to - */ - public function switch_blog($site_id = 0) - { - // Update DB version based on the current site - if (!$this->is_global()) { - $this->db_version = get_blog_option($site_id, $this->db_version_key, \false); - } - // Update interface for switched site - $this->set_db_interface(); - } - /** Public Helpers ********************************************************/ - /** - * Maybe upgrade the database table. Handles creation & schema changes. - * - * Hooked to the `admin_init` action. - * - * @since 1.0.0 - */ - public function maybe_upgrade() - { - // Bail if not upgradeable - if (!$this->is_upgradeable()) { - return; - } - // Bail if upgrade not needed - if (!$this->needs_upgrade()) { - return; - } - // Upgrade - if ($this->exists()) { - $this->upgrade(); - // Install - } else { - $this->install(); - } - } - /** - * Return whether this table needs an upgrade. - * - * @since 1.0.0 - * - * @param mixed $version Database version to check if upgrade is needed - * - * @return bool True if table needs upgrading. False if not. - */ - public function needs_upgrade($version = \false) - { - // Use the current table version if none was passed - if (empty($version)) { - $version = $this->version; - } - // Get the current database version - $this->get_db_version(); - // Is the database table up to date? - $is_current = \version_compare($this->db_version, $version, '>='); - // Return false if current, true if out of date - return \true === $is_current ? \false : \true; - } - /** - * Return whether this table can be upgraded. - * - * @since 1.0.0 - * - * @return bool True if table can be upgraded. False if not. - */ - public function is_upgradeable() - { - // Bail if global and upgrading global tables is not allowed - if ($this->is_global() && !wp_should_upgrade_global_tables()) { - return \false; - } - // Kinda weird, but assume it is - return \true; - } - /** - * Return the current table version from the database. - * - * This is public method for accessing a private variable so that it cannot - * be externally modified. - * - * @since 1.0.0 - * - * @return string - */ - public function get_version() - { - $this->get_db_version(); - return $this->db_version; - } - /** - * Install a database table - * - * Creates the table and sets the version information if successful. - * - * @since 1.0.0 - */ - public function install() - { - // Try to create the table - $created = $this->create(); - // Set the DB version if create was successful - if (\true === $created) { - $this->set_db_version(); - } - } - /** - * Uninstall a database table - * - * Drops the table and deletes the version information if successful and/or - * the table does not exist anymore. - * - * @since 1.0.0 - */ - public function uninstall() - { - // Try to drop the table - $dropped = $this->drop(); - // Delete the DB version if drop was successful or table does not exist - if (\true === $dropped || !$this->exists()) { - $this->delete_db_version(); - } - } - /** Public Management *****************************************************/ - /** - * Check if table already exists. - * - * @since 1.0.0 - * - * @return bool - */ - public function exists() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "SHOW TABLES LIKE %s"; - $like = $db->esc_like($this->table_name); - $prepared = $db->prepare($query, $like); - $result = $db->get_var($prepared); - // Does the table exist? - return $this->is_success($result); - } - /** - * Get columns from table. - * - * @since 1.2.0 - * - * @return array - */ - public function columns() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "SHOW FULL COLUMNS FROM {$this->table_name}"; - $result = $db->get_results($query); - // Return the results - return $this->is_success($result) ? $result : \false; - } - /** - * Create the table. - * - * @since 1.0.0 - * - * @return bool - */ - public function create() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "CREATE TABLE {$this->table_name} ( {$this->schema} ) {$this->charset_collation}"; - $result = $db->query($query); - // Was the table created? - return $this->is_success($result); - } - /** - * Drop the database table. - * - * @since 1.0.0 - * - * @return bool - */ - public function drop() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "DROP TABLE {$this->table_name}"; - $result = $db->query($query); - // Did the table get dropped? - return $this->is_success($result); - } - /** - * Truncate the database table. - * - * @since 1.0.0 - * - * @return bool - */ - public function truncate() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "TRUNCATE TABLE {$this->table_name}"; - $result = $db->query($query); - // Did the table get truncated? - return $this->is_success($result); - } - /** - * Delete all items from the database table. - * - * @since 1.0.0 - * - * @return bool - */ - public function delete_all() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "DELETE FROM {$this->table_name}"; - $result = $db->query($query); - // Return the results - return $result; - } - /** - * Clone this database table. - * - * Pair with copy(). - * - * @since 1.1.0 - * - * @param string $new_table_name The name of the new table, without prefix - * - * @return bool - */ - public function _clone($new_table_name = '') - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Sanitize the new table name - $table_name = $this->sanitize_table_name($new_table_name); - // Bail if new table name is invalid - if (empty($table_name)) { - return \false; - } - // Query statement - $table = $this->apply_prefix($table_name); - $query = "CREATE TABLE {$table} LIKE {$this->table_name}"; - $result = $db->query($query); - // Did the table get cloned? - return $this->is_success($result); - } - /** - * Copy the contents of this table to a new table. - * - * Pair with clone(). - * - * @since 1.1.0 - * - * @param string $new_table_name The name of the new table, without prefix - * - * @return bool - */ - public function copy($new_table_name = '') - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Sanitize the new table name - $table_name = $this->sanitize_table_name($new_table_name); - // Bail if new table name is invalid - if (empty($table_name)) { - return \false; - } - // Query statement - $table = $this->apply_prefix($table_name); - $query = "INSERT INTO {$table} SELECT * FROM {$this->table_name}"; - $result = $db->query($query); - // Did the table get copied? - return $this->is_success($result); - } - /** - * Count the number of items in the database table. - * - * @since 1.0.0 - * - * @return int - */ - public function count() - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return 0; - } - // Query statement - $query = "SELECT COUNT(*) FROM {$this->table_name}"; - $result = $db->get_var($query); - // Query success/fail - return \intval($result); - } - /** - * Check if column already exists. - * - * @since 1.0.0 - * - * @param string $name Value - * - * @return bool - */ - public function column_exists($name = '') - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Query statement - $query = "SHOW COLUMNS FROM {$this->table_name} LIKE %s"; - $like = $db->esc_like($name); - $prepared = $db->prepare($query, $like); - $result = $db->query($prepared); - // Does the column exist? - return $this->is_success($result); - } - /** - * Check if index already exists. - * - * @since 1.0.0 - * - * @param string $name Value - * @param string $column Column name - * - * @return bool - */ - public function index_exists($name = '', $column = 'Key_name') - { - // Get the database interface - $db = $this->get_db(); - // Bail if no database interface is available - if (empty($db)) { - return \false; - } - // Limit $column to Key or Column name, until we can do better - if (!\in_array($column, array('Key_name', 'Column_name'), \true)) { - $column = 'Key_name'; - } - // Query statement - $query = "SHOW INDEXES FROM {$this->table_name} WHERE {$column} LIKE %s"; - $like = $db->esc_like($name); - $prepared = $db->prepare($query, $like); - $result = $db->query($prepared); - // Does the index exist? - return $this->is_success($result); - } - /** Upgrades **************************************************************/ - /** - * Upgrade this database table. - * - * @since 1.0.0 - * - * @return bool - */ - public function upgrade() - { - // Get pending upgrades - $upgrades = $this->get_pending_upgrades(); - // Bail if no upgrades - if (empty($upgrades)) { - $this->set_db_version(); - // Return, without failure - return \true; - } - // Default result - $result = \false; - // Try to do the upgrades - foreach ($upgrades as $version => $callback) { - // Do the upgrade - $result = $this->upgrade_to($version, $callback); - // Bail if an error occurs, to avoid skipping upgrades - if (!$this->is_success($result)) { - return \false; - } - } - // Success/fail - return $this->is_success($result); - } - /** - * Return array of upgrades that still need to run. - * - * @since 1.1.0 - * - * @return array Array of upgrade callbacks, keyed by their db version. - */ - public function get_pending_upgrades() - { - // Default return value - $upgrades = array(); - // Bail if no upgrades, or no database version to compare to - if (empty($this->upgrades) || empty($this->db_version)) { - return $upgrades; - } - // Loop through all upgrades, and pick out the ones that need doing - foreach ($this->upgrades as $version => $callback) { - if (\true === \version_compare($version, $this->db_version, '>')) { - $upgrades[$version] = $callback; - } - } - // Return - return $upgrades; - } - /** - * Upgrade to a specific database version. - * - * @since 1.0.0 - * - * @param mixed $version Database version to check if upgrade is needed - * @param string $callback Callback function or class method to call - * - * @return bool - */ - public function upgrade_to($version = '', $callback = '') - { - // Bail if no upgrade is needed - if (!$this->needs_upgrade($version)) { - return \false; - } - // Allow self-named upgrade callbacks - if (empty($callback)) { - $callback = $version; - } - // Is the callback... callable? - $callable = $this->get_callable($callback); - // Bail if no callable upgrade was found - if (empty($callable)) { - return \false; - } - // Do the upgrade - $result = \call_user_func($callable); - $success = $this->is_success($result); - // Bail if upgrade failed - if (\true !== $success) { - return \false; - } - // Set the database version to this successful version - $this->set_db_version($version); - // Return success - return \true; - } - /** Private ***************************************************************/ - /** - * Setup the necessary table variables. - * - * @since 1.0.0 - */ - private function setup() - { - // Bail if no database interface is available - if (!$this->get_db()) { - return; - } - // Sanitize the database table name - $this->name = $this->sanitize_table_name($this->name); - // Bail if database table name was garbage - if (\false === $this->name) { - return; - } - // Separator - $glue = '_'; - // Setup the prefixed name - $this->prefixed_name = $this->apply_prefix($this->name, $glue); - // Maybe create database key - if (empty($this->db_version_key)) { - $this->db_version_key = \implode($glue, array(sanitize_key($this->db_global), $this->prefixed_name, 'version')); - } - } - /** - * Set this table up in the database interface. - * - * This must be done directly because the database interface does not - * have a common mechanism for manipulating them safely. - * - * @since 1.0.0 - */ - private function set_db_interface() - { - // Get the database once, to avoid duplicate function calls - $db = $this->get_db(); - // Bail if no database - if (empty($db)) { - return; - } - // Set variables for global tables - if ($this->is_global()) { - $site_id = 0; - $tables = 'ms_global_tables'; - // Set variables for per-site tables - } else { - $site_id = null; - $tables = 'tables'; - } - // Set the table prefix and prefix the table name - $this->table_prefix = $db->get_blog_prefix($site_id); - // Get the prefixed table name - $prefixed_table_name = "{$this->table_prefix}{$this->prefixed_name}"; - // Set the database interface - $db->{$this->prefixed_name} = $this->table_name = $prefixed_table_name; - // Create the array if it does not exist - if (!isset($db->{$tables})) { - $db->{$tables} = array(); - } - // Add the table to the global table array - $db->{$tables}[] = $this->prefixed_name; - // Charset - if (!empty($db->charset)) { - $this->charset_collation = "DEFAULT CHARACTER SET {$db->charset}"; - } - // Collation - if (!empty($db->collate)) { - $this->charset_collation .= " COLLATE {$db->collate}"; - } - } - /** - * Set the database version for the table. - * - * @since 1.0.0 - * - * @param mixed $version Database version to set when upgrading/creating - */ - private function set_db_version($version = '') - { - // If no version is passed during an upgrade, use the current version - if (empty($version)) { - $version = $this->version; - } - // Update the DB version - $this->is_global() ? update_network_option(get_main_network_id(), $this->db_version_key, $version) : update_option($this->db_version_key, $version); - // Set the DB version - $this->db_version = $version; - } - /** - * Get the table version from the database. - * - * @since 1.0.0 - */ - private function get_db_version() - { - $this->db_version = $this->is_global() ? get_network_option(get_main_network_id(), $this->db_version_key, \false) : get_option($this->db_version_key, \false); - } - /** - * Delete the table version from the database. - * - * @since 1.0.0 - */ - private function delete_db_version() - { - $this->db_version = $this->is_global() ? delete_network_option(get_main_network_id(), $this->db_version_key) : delete_option($this->db_version_key); - } - /** - * Add class hooks to the parent application actions. - * - * @since 1.0.0 - */ - private function add_hooks() - { - // Add table to the global database object - add_action('switch_blog', array($this, 'switch_blog')); - add_action('admin_init', array($this, 'maybe_upgrade')); - } - /** - * Check if the current request is from some kind of test. - * - * This is primarily used to skip 'admin_init' and force-install tables. - * - * @since 1.0.0 - * - * @return bool - */ - private function is_testing() - { - return (bool) (\defined('WP_TESTS_DIR') && WP_TESTS_DIR) || \function_exists('_manually_load_plugin'); - } - /** - * Check if table is global. - * - * @since 1.0.0 - * - * @return bool - */ - private function is_global() - { - return \true === $this->global; - } - /** - * Try to get a callable upgrade, with some magic to avoid needing to - * do this dance repeatedly inside subclasses. - * - * @since 1.0.0 - * - * @param string $callback - * - * @return mixed Callable string, or false if not callable - */ - private function get_callable($callback = '') - { - // Default return value - $callable = $callback; - // Look for global function - if (!\is_callable($callable)) { - // Fallback to local class method - $callable = array($this, $callback); - if (!\is_callable($callable)) { - // Fallback to class method prefixed with "__" - $callable = array($this, "__{$callback}"); - if (!\is_callable($callable)) { - $callable = \false; - } - } - } - // Return callable string, or false if not callable - return $callable; - } -} diff --git a/dependencies/composer/ClassLoader.php b/dependencies/composer/ClassLoader.php deleted file mode 100644 index 7824d8f..0000000 --- a/dependencies/composer/ClassLoader.php +++ /dev/null @@ -1,579 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - /** @var \Closure(string):void */ - private static $includeFile; - - /** @var string|null */ - private $vendorDir; - - // PSR-4 - /** - * @var array> - */ - private $prefixLengthsPsr4 = array(); - /** - * @var array> - */ - private $prefixDirsPsr4 = array(); - /** - * @var list - */ - private $fallbackDirsPsr4 = array(); - - // PSR-0 - /** - * List of PSR-0 prefixes - * - * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) - * - * @var array>> - */ - private $prefixesPsr0 = array(); - /** - * @var list - */ - private $fallbackDirsPsr0 = array(); - - /** @var bool */ - private $useIncludePath = false; - - /** - * @var array - */ - private $classMap = array(); - - /** @var bool */ - private $classMapAuthoritative = false; - - /** - * @var array - */ - private $missingClasses = array(); - - /** @var string|null */ - private $apcuPrefix; - - /** - * @var array - */ - private static $registeredLoaders = array(); - - /** - * @param string|null $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - self::initializeIncludeClosure(); - } - - /** - * @return array> - */ - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - /** - * @return array> - */ - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - /** - * @return list - */ - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - /** - * @return list - */ - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - /** - * @return array Array of classname => path - */ - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - * - * @return void - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param list|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void - */ - public function add($prefix, $paths, $prepend = false) - { - $paths = (array) $paths; - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param list|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - $paths = (array) $paths; - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param list|string $paths The PSR-0 base directories - * - * @return void - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param list|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - * - * @return void - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - * - * @return void - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - * - * @return void - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - * - * @return void - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return true|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - $includeFile = self::$includeFile; - $includeFile($file); - - return true; - } - - return null; - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders keyed by their corresponding vendor directories. - * - * @return array - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } - - /** - * @return void - */ - private static function initializeIncludeClosure() - { - if (self::$includeFile !== null) { - return; - } - - /** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - */ - self::$includeFile = \Closure::bind(static function($file) { - include $file; - }, null, null); - } -} diff --git a/dependencies/composer/InstalledVersions.php b/dependencies/composer/InstalledVersions.php deleted file mode 100644 index b2d6857..0000000 --- a/dependencies/composer/InstalledVersions.php +++ /dev/null @@ -1,313 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Composer; - -use WP_Ultimo\Dependencies\Composer\Autoload\ClassLoader; -use WP_Ultimo\Dependencies\Composer\Semver\VersionParser; -/** - * This class is copied in every Composer installed project and available to all - * - * See also https://getcomposer.org/doc/07-runtime.md#installed-versions - * - * To require its presence, you can require `composer-runtime-api ^2.0` - * - * @final - */ -class InstalledVersions -{ - /** - * @var mixed[]|null - * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null - */ - private static $installed; - /** - * @var bool|null - */ - private static $canGetVendors; - /** - * @var array[] - * @psalm-var array}> - */ - private static $installedByVendor = array(); - /** - * Returns a list of all package names which are present, either by being installed, replaced or provided - * - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackages() - { - $packages = array(); - foreach (self::getInstalled() as $installed) { - $packages[] = \array_keys($installed['versions']); - } - if (1 === \count($packages)) { - return $packages[0]; - } - return \array_keys(\array_flip(\call_user_func_array('array_merge', $packages))); - } - /** - * Returns a list of all package names with a specific type e.g. 'library' - * - * @param string $type - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackagesByType($type) - { - $packagesByType = array(); - foreach (self::getInstalled() as $installed) { - foreach ($installed['versions'] as $name => $package) { - if (isset($package['type']) && $package['type'] === $type) { - $packagesByType[] = $name; - } - } - } - return $packagesByType; - } - /** - * Checks whether the given package is installed - * - * This also returns true if the package name is provided or replaced by another package - * - * @param string $packageName - * @param bool $includeDevRequirements - * @return bool - */ - public static function isInstalled($packageName, $includeDevRequirements = \true) - { - foreach (self::getInstalled() as $installed) { - if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false; - } - } - return \false; - } - /** - * Checks whether the given package satisfies a version constraint - * - * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: - * - * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') - * - * @param VersionParser $parser Install composer/semver to have access to this class and functionality - * @param string $packageName - * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package - * @return bool - */ - public static function satisfies(VersionParser $parser, $packageName, $constraint) - { - $constraint = $parser->parseConstraints((string) $constraint); - $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - return $provided->matches($constraint); - } - /** - * Returns a version constraint representing all the range(s) which are installed for a given package - * - * It is easier to use this via isInstalled() with the $constraint argument if you need to check - * whether a given version of a package is installed, and not just whether it exists - * - * @param string $packageName - * @return string Version constraint usable with composer/semver - */ - public static function getVersionRanges($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - $ranges = array(); - if (isset($installed['versions'][$packageName]['pretty_version'])) { - $ranges[] = $installed['versions'][$packageName]['pretty_version']; - } - if (\array_key_exists('aliases', $installed['versions'][$packageName])) { - $ranges = \array_merge($ranges, $installed['versions'][$packageName]['aliases']); - } - if (\array_key_exists('replaced', $installed['versions'][$packageName])) { - $ranges = \array_merge($ranges, $installed['versions'][$packageName]['replaced']); - } - if (\array_key_exists('provided', $installed['versions'][$packageName])) { - $ranges = \array_merge($ranges, $installed['versions'][$packageName]['provided']); - } - return \implode(' || ', $ranges); - } - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - if (!isset($installed['versions'][$packageName]['version'])) { - return null; - } - return $installed['versions'][$packageName]['version']; - } - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getPrettyVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - if (!isset($installed['versions'][$packageName]['pretty_version'])) { - return null; - } - return $installed['versions'][$packageName]['pretty_version']; - } - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference - */ - public static function getReference($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - if (!isset($installed['versions'][$packageName]['reference'])) { - return null; - } - return $installed['versions'][$packageName]['reference']; - } - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. - */ - public static function getInstallPath($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; - } - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - /** - * @return array - * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} - */ - public static function getRootPackage() - { - $installed = self::getInstalled(); - return $installed[0]['root']; - } - /** - * Returns the raw installed.php data for custom implementations - * - * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. - * @return array[] - * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} - */ - public static function getRawData() - { - @\trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED); - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (\substr(__DIR__, -8, 1) !== 'C') { - self::$installed = (include __DIR__ . '/installed.php'); - } else { - self::$installed = array(); - } - } - return self::$installed; - } - /** - * Returns the raw data of all installed.php which are currently loaded for custom implementations - * - * @return array[] - * @psalm-return list}> - */ - public static function getAllRawData() - { - return self::getInstalled(); - } - /** - * Lets you reload the static array from another file - * - * This is only useful for complex integrations in which a project needs to use - * this class but then also needs to execute another project's autoloader in process, - * and wants to ensure both projects have access to their version of installed.php. - * - * A typical case would be PHPUnit, where it would need to make sure it reads all - * the data it needs from this class, then call reload() with - * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure - * the project in which it runs can then also use this class safely, without - * interference between PHPUnit's dependencies and the project's dependencies. - * - * @param array[] $data A vendor/composer/installed.php data set - * @return void - * - * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data - */ - public static function reload($data) - { - self::$installed = $data; - self::$installedByVendor = array(); - } - /** - * @return array[] - * @psalm-return list}> - */ - private static function getInstalled() - { - if (null === self::$canGetVendors) { - self::$canGetVendors = \method_exists('WP_Ultimo\\Dependencies\\Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); - } - $installed = array(); - if (self::$canGetVendors) { - foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { - if (isset(self::$installedByVendor[$vendorDir])) { - $installed[] = self::$installedByVendor[$vendorDir]; - } elseif (\is_file($vendorDir . '/composer/installed.php')) { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = (require $vendorDir . '/composer/installed.php'); - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && \strtr($vendorDir . '/composer', '\\', '/') === \strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[\count($installed) - 1]; - } - } - } - } - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (\substr(__DIR__, -8, 1) !== 'C') { - /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ - $required = (require __DIR__ . '/installed.php'); - self::$installed = $required; - } else { - self::$installed = array(); - } - } - if (self::$installed !== array()) { - $installed[] = self::$installed; - } - return $installed; - } -} diff --git a/dependencies/composer/LICENSE b/dependencies/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/dependencies/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/dependencies/composer/autoload_classmap.php b/dependencies/composer/autoload_classmap.php deleted file mode 100644 index 46d64e7..0000000 --- a/dependencies/composer/autoload_classmap.php +++ /dev/null @@ -1,2149 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', - 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => $vendorDir . '/symfony/translation/CatalogueMetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPullCommand' => $vendorDir . '/symfony/translation/Command/TranslationPullCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPushCommand' => $vendorDir . '/symfony/translation/Command/TranslationPushCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationTrait' => $vendorDir . '/symfony/translation/Command/TranslationTrait.php', - 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => $vendorDir . '/symfony/translation/Command/XliffLintCommand.php', - 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php', - 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', - 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php', - 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php', - 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\IncompleteDsnException' => $vendorDir . '/symfony/translation/Exception/IncompleteDsnException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/translation/Exception/InvalidArgumentException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\LogicException' => $vendorDir . '/symfony/translation/Exception/LogicException.php', - 'Symfony\\Component\\Translation\\Exception\\MissingRequiredOptionException' => $vendorDir . '/symfony/translation/Exception/MissingRequiredOptionException.php', - 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderException' => $vendorDir . '/symfony/translation/Exception/ProviderException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ProviderExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => $vendorDir . '/symfony/translation/Exception/RuntimeException.php', - 'Symfony\\Component\\Translation\\Exception\\UnsupportedSchemeException' => $vendorDir . '/symfony/translation/Exception/UnsupportedSchemeException.php', - 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpAstExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => $vendorDir . '/symfony/translation/Extractor/PhpStringTokenParser.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\AbstractVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/AbstractVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\ConstraintVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/ConstraintVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TransMethodVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/TransMethodVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TranslatableMessageVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => $vendorDir . '/symfony/translation/Formatter/IntlFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/IntlFormatterInterface.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php', - 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php', - 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php', - 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php', - 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php', - 'Symfony\\Component\\Translation\\LocaleSwitcher' => $vendorDir . '/symfony/translation/LocaleSwitcher.php', - 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php', - 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php', - 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php', - 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Provider\\AbstractProviderFactory' => $vendorDir . '/symfony/translation/Provider/AbstractProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\Dsn' => $vendorDir . '/symfony/translation/Provider/Dsn.php', - 'Symfony\\Component\\Translation\\Provider\\FilteringProvider' => $vendorDir . '/symfony/translation/Provider/FilteringProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProvider' => $vendorDir . '/symfony/translation/Provider/NullProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProviderFactory' => $vendorDir . '/symfony/translation/Provider/NullProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderFactoryInterface' => $vendorDir . '/symfony/translation/Provider/ProviderFactoryInterface.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderInterface' => $vendorDir . '/symfony/translation/Provider/ProviderInterface.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollection' => $vendorDir . '/symfony/translation/Provider/TranslationProviderCollection.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollectionFactory' => $vendorDir . '/symfony/translation/Provider/TranslationProviderCollectionFactory.php', - 'Symfony\\Component\\Translation\\PseudoLocalizationTranslator' => $vendorDir . '/symfony/translation/PseudoLocalizationTranslator.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => $vendorDir . '/symfony/translation/Reader/TranslationReader.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => $vendorDir . '/symfony/translation/Reader/TranslationReaderInterface.php', - 'Symfony\\Component\\Translation\\Test\\ProviderFactoryTestCase' => $vendorDir . '/symfony/translation/Test/ProviderFactoryTestCase.php', - 'Symfony\\Component\\Translation\\Test\\ProviderTestCase' => $vendorDir . '/symfony/translation/Test/ProviderTestCase.php', - 'Symfony\\Component\\Translation\\TranslatableMessage' => $vendorDir . '/symfony/translation/TranslatableMessage.php', - 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php', - 'Symfony\\Component\\Translation\\TranslatorBag' => $vendorDir . '/symfony/translation/TranslatorBag.php', - 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php', - 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php', - 'Symfony\\Component\\Translation\\Util\\XliffUtils' => $vendorDir . '/symfony/translation/Util/XliffUtils.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php', - 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php', - 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', - 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', - 'Symfony\\Polyfill\\Php81\\Php81' => $vendorDir . '/symfony/polyfill-php81/Php81.php', - 'WP_Ultimo\\API\\Register_Endpoint' => $baseDir . '/inc/api/class-register-endpoint.php', - 'WP_Ultimo\\Apis\\Rest_Api' => $baseDir . '/inc/api/trait-rest-api.php', - 'WP_Ultimo\\Apis\\WP_CLI' => $baseDir . '/inc/api/trait-wp-cli.php', - 'WP_Ultimo\\Contracts\\Session' => $baseDir . '/inc/contracts/Session.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ClosedException' => $vendorDir . '/amphp/byte-stream/lib/ClosedException.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\InMemoryStream' => $vendorDir . '/amphp/byte-stream/lib/InMemoryStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\InputStream' => $vendorDir . '/amphp/byte-stream/lib/InputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\InputStreamChain' => $vendorDir . '/amphp/byte-stream/lib/InputStreamChain.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\IteratorStream' => $vendorDir . '/amphp/byte-stream/lib/IteratorStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\LineReader' => $vendorDir . '/amphp/byte-stream/lib/LineReader.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Message' => $vendorDir . '/amphp/byte-stream/lib/Message.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\OutputBuffer' => $vendorDir . '/amphp/byte-stream/lib/OutputBuffer.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\OutputStream' => $vendorDir . '/amphp/byte-stream/lib/OutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Payload' => $vendorDir . '/amphp/byte-stream/lib/Payload.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\PendingReadError' => $vendorDir . '/amphp/byte-stream/lib/PendingReadError.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ResourceInputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ResourceOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\StreamException' => $vendorDir . '/amphp/byte-stream/lib/StreamException.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ZlibInputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ZlibOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\ArrayCache' => $vendorDir . '/amphp/cache/lib/ArrayCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\AtomicCache' => $vendorDir . '/amphp/cache/lib/AtomicCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\Cache' => $vendorDir . '/amphp/cache/lib/Cache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\CacheException' => $vendorDir . '/amphp/cache/lib/CacheException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\FileCache' => $vendorDir . '/amphp/cache/lib/FileCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\NullCache' => $vendorDir . '/amphp/cache/lib/NullCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\PrefixCache' => $vendorDir . '/amphp/cache/lib/PrefixCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\SerializedCache' => $vendorDir . '/amphp/cache/lib/SerializedCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\CallableMaker' => $vendorDir . '/amphp/amp/lib/CallableMaker.php', - 'WP_Ultimo\\Dependencies\\Amp\\CancellationToken' => $vendorDir . '/amphp/amp/lib/CancellationToken.php', - 'WP_Ultimo\\Dependencies\\Amp\\CancellationTokenSource' => $vendorDir . '/amphp/amp/lib/CancellationTokenSource.php', - 'WP_Ultimo\\Dependencies\\Amp\\CancelledException' => $vendorDir . '/amphp/amp/lib/CancelledException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Coroutine' => $vendorDir . '/amphp/amp/lib/Coroutine.php', - 'WP_Ultimo\\Dependencies\\Amp\\Deferred' => $vendorDir . '/amphp/amp/lib/Deferred.php', - 'WP_Ultimo\\Dependencies\\Amp\\Delayed' => $vendorDir . '/amphp/amp/lib/Delayed.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\BlockingFallbackResolver' => $vendorDir . '/amphp/dns/lib/BlockingFallbackResolver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Config' => $vendorDir . '/amphp/dns/lib/Config.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\ConfigException' => $vendorDir . '/amphp/dns/lib/ConfigException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\ConfigLoader' => $vendorDir . '/amphp/dns/lib/ConfigLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\DnsException' => $vendorDir . '/amphp/dns/lib/DnsException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\HostLoader' => $vendorDir . '/amphp/dns/lib/HostLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Internal\\Socket' => $vendorDir . '/amphp/dns/lib/Internal/Socket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Internal\\TcpSocket' => $vendorDir . '/amphp/dns/lib/Internal/TcpSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Internal\\UdpSocket' => $vendorDir . '/amphp/dns/lib/Internal/UdpSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\InvalidNameException' => $vendorDir . '/amphp/dns/lib/InvalidNameException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\NoRecordException' => $vendorDir . '/amphp/dns/lib/NoRecordException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Record' => $vendorDir . '/amphp/dns/lib/Record.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Resolver' => $vendorDir . '/amphp/dns/lib/Resolver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Rfc1035StubResolver' => $vendorDir . '/amphp/dns/lib/Rfc1035StubResolver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\TimeoutException' => $vendorDir . '/amphp/dns/lib/TimeoutException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\UnixConfigLoader' => $vendorDir . '/amphp/dns/lib/UnixConfigLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\WindowsConfigLoader' => $vendorDir . '/amphp/dns/lib/WindowsConfigLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Emitter' => $vendorDir . '/amphp/amp/lib/Emitter.php', - 'WP_Ultimo\\Dependencies\\Amp\\Failure' => $vendorDir . '/amphp/amp/lib/Failure.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\ApplicationInterceptor' => $vendorDir . '/amphp/http-client/src/ApplicationInterceptor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\FileBody' => $vendorDir . '/amphp/http-client/src/Body/FileBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\FormBody' => $vendorDir . '/amphp/http-client/src/Body/FormBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\JsonBody' => $vendorDir . '/amphp/http-client/src/Body/JsonBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\StringBody' => $vendorDir . '/amphp/http-client/src/Body/StringBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Connection' => $vendorDir . '/amphp/http-client/src/Connection/Connection.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\ConnectionFactory' => $vendorDir . '/amphp/http-client/src/Connection/ConnectionFactory.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\ConnectionLimitingPool' => $vendorDir . '/amphp/http-client/src/Connection/ConnectionLimitingPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\ConnectionPool' => $vendorDir . '/amphp/http-client/src/Connection/ConnectionPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\DefaultConnectionFactory' => $vendorDir . '/amphp/http-client/src/Connection/DefaultConnectionFactory.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http1Connection' => $vendorDir . '/amphp/http-client/src/Connection/Http1Connection.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http2Connection' => $vendorDir . '/amphp/http-client/src/Connection/Http2Connection.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http2ConnectionException' => $vendorDir . '/amphp/http-client/src/Connection/Http2ConnectionException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http2StreamException' => $vendorDir . '/amphp/http-client/src/Connection/Http2StreamException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\HttpStream' => $vendorDir . '/amphp/http-client/src/Connection/HttpStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\InterceptedStream' => $vendorDir . '/amphp/http-client/src/Connection/InterceptedStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\Http1Parser' => $vendorDir . '/amphp/http-client/src/Connection/Internal/Http1Parser.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\Http2ConnectionProcessor' => $vendorDir . '/amphp/http-client/src/Connection/Internal/Http2ConnectionProcessor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\Http2Stream' => $vendorDir . '/amphp/http-client/src/Connection/Internal/Http2Stream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\RequestNormalizer' => $vendorDir . '/amphp/http-client/src/Connection/Internal/RequestNormalizer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Stream' => $vendorDir . '/amphp/http-client/src/Connection/Stream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\StreamLimitingPool' => $vendorDir . '/amphp/http-client/src/Connection/StreamLimitingPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\UnlimitedConnectionPool' => $vendorDir . '/amphp/http-client/src/Connection/UnlimitedConnectionPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\UnprocessedRequestException' => $vendorDir . '/amphp/http-client/src/Connection/UnprocessedRequestException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\UpgradedSocket' => $vendorDir . '/amphp/http-client/src/Connection/UpgradedSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\DelegateHttpClient' => $vendorDir . '/amphp/http-client/src/DelegateHttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\EventListener' => $vendorDir . '/amphp/http-client/src/EventListener.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\EventListener\\RecordHarAttributes' => $vendorDir . '/amphp/http-client/src/EventListener/RecordHarAttributes.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\HttpClient' => $vendorDir . '/amphp/http-client/src/HttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\HttpClientBuilder' => $vendorDir . '/amphp/http-client/src/HttpClientBuilder.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\HttpException' => $vendorDir . '/amphp/http-client/src/HttpException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\InterceptedHttpClient' => $vendorDir . '/amphp/http-client/src/InterceptedHttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\AddRequestHeader' => $vendorDir . '/amphp/http-client/src/Interceptor/AddRequestHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\AddResponseHeader' => $vendorDir . '/amphp/http-client/src/Interceptor/AddResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\DecompressResponse' => $vendorDir . '/amphp/http-client/src/Interceptor/DecompressResponse.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\FollowRedirects' => $vendorDir . '/amphp/http-client/src/Interceptor/FollowRedirects.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\ForbidUriUserInfo' => $vendorDir . '/amphp/http-client/src/Interceptor/ForbidUriUserInfo.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\LogHttpArchive' => $vendorDir . '/amphp/http-client/src/Interceptor/LogHttpArchive.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\MatchOrigin' => $vendorDir . '/amphp/http-client/src/Interceptor/MatchOrigin.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\ModifyRequest' => $vendorDir . '/amphp/http-client/src/Interceptor/ModifyRequest.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\ModifyResponse' => $vendorDir . '/amphp/http-client/src/Interceptor/ModifyResponse.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\RemoveRequestHeader' => $vendorDir . '/amphp/http-client/src/Interceptor/RemoveRequestHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\RemoveResponseHeader' => $vendorDir . '/amphp/http-client/src/Interceptor/RemoveResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\RetryRequests' => $vendorDir . '/amphp/http-client/src/Interceptor/RetryRequests.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetRequestHeader' => $vendorDir . '/amphp/http-client/src/Interceptor/SetRequestHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetRequestHeaderIfUnset' => $vendorDir . '/amphp/http-client/src/Interceptor/SetRequestHeaderIfUnset.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetRequestTimeout' => $vendorDir . '/amphp/http-client/src/Interceptor/SetRequestTimeout.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetResponseHeader' => $vendorDir . '/amphp/http-client/src/Interceptor/SetResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetResponseHeaderIfUnset' => $vendorDir . '/amphp/http-client/src/Interceptor/SetResponseHeaderIfUnset.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\TooManyRedirectsException' => $vendorDir . '/amphp/http-client/src/Interceptor/TooManyRedirectsException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\ForbidCloning' => $vendorDir . '/amphp/http-client/src/Internal/ForbidCloning.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\ForbidSerialization' => $vendorDir . '/amphp/http-client/src/Internal/ForbidSerialization.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\HarAttributes' => $vendorDir . '/amphp/http-client/src/Internal/HarAttributes.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\ResponseBodyStream' => $vendorDir . '/amphp/http-client/src/Internal/ResponseBodyStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\SizeLimitingInputStream' => $vendorDir . '/amphp/http-client/src/Internal/SizeLimitingInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\InvalidRequestException' => $vendorDir . '/amphp/http-client/src/InvalidRequestException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\MissingAttributeError' => $vendorDir . '/amphp/http-client/src/MissingAttributeError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\NetworkInterceptor' => $vendorDir . '/amphp/http-client/src/NetworkInterceptor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\ParseException' => $vendorDir . '/amphp/http-client/src/ParseException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\PooledHttpClient' => $vendorDir . '/amphp/http-client/src/PooledHttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Request' => $vendorDir . '/amphp/http-client/src/Request.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\RequestBody' => $vendorDir . '/amphp/http-client/src/RequestBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Response' => $vendorDir . '/amphp/http-client/src/Response.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\SocketException' => $vendorDir . '/amphp/http-client/src/SocketException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\TimeoutException' => $vendorDir . '/amphp/http-client/src/TimeoutException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Trailers' => $vendorDir . '/amphp/http-client/src/Trailers.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\CookieAttributes' => $vendorDir . '/amphp/http/src/Cookie/CookieAttributes.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\InvalidCookieException' => $vendorDir . '/amphp/http/src/Cookie/InvalidCookieException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\RequestCookie' => $vendorDir . '/amphp/http/src/Cookie/RequestCookie.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\ResponseCookie' => $vendorDir . '/amphp/http/src/Cookie/ResponseCookie.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\HPack' => $vendorDir . '/amphp/hpack/src/HPack.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\HPackException' => $vendorDir . '/amphp/hpack/src/HPackException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2ConnectionException' => $vendorDir . '/amphp/http/src/Http2/Http2ConnectionException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2Parser' => $vendorDir . '/amphp/http/src/Http2/Http2Parser.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2Processor' => $vendorDir . '/amphp/http/src/Http2/Http2Processor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2StreamException' => $vendorDir . '/amphp/http/src/Http2/Http2StreamException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Internal\\HPackNative' => $vendorDir . '/amphp/hpack/src/Internal/HPackNative.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Internal\\HPackNghttp2' => $vendorDir . '/amphp/hpack/src/Internal/HPackNghttp2.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\InvalidHeaderException' => $vendorDir . '/amphp/http/src/InvalidHeaderException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Message' => $vendorDir . '/amphp/http/src/Message.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Rfc7230' => $vendorDir . '/amphp/http/src/Rfc7230.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Status' => $vendorDir . '/amphp/http/src/Status.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\Placeholder' => $vendorDir . '/amphp/amp/lib/Internal/Placeholder.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\PrivateIterator' => $vendorDir . '/amphp/amp/lib/Internal/PrivateIterator.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\PrivatePromise' => $vendorDir . '/amphp/amp/lib/Internal/PrivatePromise.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\Producer' => $vendorDir . '/amphp/amp/lib/Internal/Producer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\ResolutionQueue' => $vendorDir . '/amphp/amp/lib/Internal/ResolutionQueue.php', - 'WP_Ultimo\\Dependencies\\Amp\\InvalidYieldError' => $vendorDir . '/amphp/amp/lib/InvalidYieldError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Iterator' => $vendorDir . '/amphp/amp/lib/Iterator.php', - 'WP_Ultimo\\Dependencies\\Amp\\LazyPromise' => $vendorDir . '/amphp/amp/lib/LazyPromise.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop' => $vendorDir . '/amphp/amp/lib/Loop.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\Driver' => $vendorDir . '/amphp/amp/lib/Loop/Driver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\DriverFactory' => $vendorDir . '/amphp/amp/lib/Loop/DriverFactory.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\EvDriver' => $vendorDir . '/amphp/amp/lib/Loop/EvDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\EventDriver' => $vendorDir . '/amphp/amp/lib/Loop/EventDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\Internal\\TimerQueue' => $vendorDir . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\InvalidWatcherError' => $vendorDir . '/amphp/amp/lib/Loop/InvalidWatcherError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\NativeDriver' => $vendorDir . '/amphp/amp/lib/Loop/NativeDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\TracingDriver' => $vendorDir . '/amphp/amp/lib/Loop/TracingDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\UnsupportedFeatureException' => $vendorDir . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\UvDriver' => $vendorDir . '/amphp/amp/lib/Loop/UvDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\Watcher' => $vendorDir . '/amphp/amp/lib/Loop/Watcher.php', - 'WP_Ultimo\\Dependencies\\Amp\\MultiReasonException' => $vendorDir . '/amphp/amp/lib/MultiReasonException.php', - 'WP_Ultimo\\Dependencies\\Amp\\NullCancellationToken' => $vendorDir . '/amphp/amp/lib/NullCancellationToken.php', - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\InvalidDelimiterError' => $vendorDir . '/amphp/parser/src/InvalidDelimiterError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\Parser' => $vendorDir . '/amphp/parser/src/Parser.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Posix\\Handle' => $vendorDir . '/amphp/process/lib/Internal/Posix/Handle.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Posix\\Runner' => $vendorDir . '/amphp/process/lib/Internal/Posix/Runner.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\ProcessHandle' => $vendorDir . '/amphp/process/lib/Internal/ProcessHandle.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\ProcessRunner' => $vendorDir . '/amphp/process/lib/Internal/ProcessRunner.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\ProcessStatus' => $vendorDir . '/amphp/process/lib/Internal/ProcessStatus.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\Handle' => $vendorDir . '/amphp/process/lib/Internal/Windows/Handle.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\HandshakeStatus' => $vendorDir . '/amphp/process/lib/Internal/Windows/HandshakeStatus.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\PendingSocketClient' => $vendorDir . '/amphp/process/lib/Internal/Windows/PendingSocketClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\Runner' => $vendorDir . '/amphp/process/lib/Internal/Windows/Runner.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\SignalCode' => $vendorDir . '/amphp/process/lib/Internal/Windows/SignalCode.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\SocketConnector' => $vendorDir . '/amphp/process/lib/Internal/Windows/SocketConnector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Process' => $vendorDir . '/amphp/process/lib/Process.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\ProcessException' => $vendorDir . '/amphp/process/lib/ProcessException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\ProcessInputStream' => $vendorDir . '/amphp/process/lib/ProcessInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\ProcessOutputStream' => $vendorDir . '/amphp/process/lib/ProcessOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\StatusError' => $vendorDir . '/amphp/process/lib/StatusError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Producer' => $vendorDir . '/amphp/amp/lib/Producer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Promise' => $vendorDir . '/amphp/amp/lib/Promise.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\CompressingSerializer' => $vendorDir . '/amphp/serialization/src/CompressingSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\JsonSerializer' => $vendorDir . '/amphp/serialization/src/JsonSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\NativeSerializer' => $vendorDir . '/amphp/serialization/src/NativeSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\PassthroughSerializer' => $vendorDir . '/amphp/serialization/src/PassthroughSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\SerializationException' => $vendorDir . '/amphp/serialization/src/SerializationException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\Serializer' => $vendorDir . '/amphp/serialization/src/Serializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\BindContext' => $vendorDir . '/amphp/socket/src/BindContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Certificate' => $vendorDir . '/amphp/socket/src/Certificate.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ClientTlsContext' => $vendorDir . '/amphp/socket/src/ClientTlsContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ConnectContext' => $vendorDir . '/amphp/socket/src/ConnectContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ConnectException' => $vendorDir . '/amphp/socket/src/ConnectException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Connector' => $vendorDir . '/amphp/socket/src/Connector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\DatagramSocket' => $vendorDir . '/amphp/socket/src/DatagramSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\DnsConnector' => $vendorDir . '/amphp/socket/src/DnsConnector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\EncryptableSocket' => $vendorDir . '/amphp/socket/src/EncryptableSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\PendingAcceptError' => $vendorDir . '/amphp/socket/src/PendingAcceptError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\PendingReceiveError' => $vendorDir . '/amphp/socket/src/PendingReceiveError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ResourceSocket' => $vendorDir . '/amphp/socket/src/ResourceSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Server' => $vendorDir . '/amphp/socket/src/Server.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ServerTlsContext' => $vendorDir . '/amphp/socket/src/ServerTlsContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Socket' => $vendorDir . '/amphp/socket/src/Socket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\SocketAddress' => $vendorDir . '/amphp/socket/src/SocketAddress.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\SocketException' => $vendorDir . '/amphp/socket/src/SocketException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\SocketPool' => $vendorDir . '/amphp/socket/src/SocketPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\StaticConnector' => $vendorDir . '/amphp/socket/src/StaticConnector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\TlsException' => $vendorDir . '/amphp/socket/src/TlsException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\TlsInfo' => $vendorDir . '/amphp/socket/src/TlsInfo.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\UnlimitedSocketPool' => $vendorDir . '/amphp/socket/src/UnlimitedSocketPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Struct' => $vendorDir . '/amphp/amp/lib/Struct.php', - 'WP_Ultimo\\Dependencies\\Amp\\Success' => $vendorDir . '/amphp/amp/lib/Success.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Barrier' => $vendorDir . '/amphp/sync/src/Barrier.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\FileMutex' => $vendorDir . '/amphp/sync/src/FileMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Internal\\MutexStorage' => $vendorDir . '/amphp/sync/src/Internal/MutexStorage.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Internal\\SemaphoreStorage' => $vendorDir . '/amphp/sync/src/Internal/SemaphoreStorage.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\KeyedMutex' => $vendorDir . '/amphp/sync/src/KeyedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\KeyedSemaphore' => $vendorDir . '/amphp/sync/src/KeyedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalKeyedMutex' => $vendorDir . '/amphp/sync/src/LocalKeyedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalKeyedSemaphore' => $vendorDir . '/amphp/sync/src/LocalKeyedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalMutex' => $vendorDir . '/amphp/sync/src/LocalMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalSemaphore' => $vendorDir . '/amphp/sync/src/LocalSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Lock' => $vendorDir . '/amphp/sync/src/Lock.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Mutex' => $vendorDir . '/amphp/sync/src/Mutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\PosixSemaphore' => $vendorDir . '/amphp/sync/src/PosixSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\PrefixedKeyedMutex' => $vendorDir . '/amphp/sync/src/PrefixedKeyedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\PrefixedKeyedSemaphore' => $vendorDir . '/amphp/sync/src/PrefixedKeyedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Semaphore' => $vendorDir . '/amphp/sync/src/Semaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\SemaphoreMutex' => $vendorDir . '/amphp/sync/src/SemaphoreMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\StaticKeyMutex' => $vendorDir . '/amphp/sync/src/StaticKeyMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\SyncException' => $vendorDir . '/amphp/sync/src/SyncException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\ThreadedMutex' => $vendorDir . '/amphp/sync/src/ThreadedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\ThreadedSemaphore' => $vendorDir . '/amphp/sync/src/ThreadedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\TimeoutCancellationToken' => $vendorDir . '/amphp/amp/lib/TimeoutCancellationToken.php', - 'WP_Ultimo\\Dependencies\\Amp\\TimeoutException' => $vendorDir . '/amphp/amp/lib/TimeoutException.php', - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\KeyNotFoundException' => $vendorDir . '/amphp/windows-registry/lib/KeyNotFoundException.php', - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\WindowsRegistry' => $vendorDir . '/amphp/windows-registry/lib/WindowsRegistry.php', - 'WP_Ultimo\\Dependencies\\Arrch\\Arrch' => $vendorDir . '/rpnzl/arrch/src/Arrch/Arrch.php', - 'WP_Ultimo\\Dependencies\\Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Base' => $vendorDir . '/berlindb/core/src/Database/Base.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Column' => $vendorDir . '/berlindb/core/src/Database/Column.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Queries\\Compare' => $vendorDir . '/berlindb/core/src/Database/Queries/Compare.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Queries\\Date' => $vendorDir . '/berlindb/core/src/Database/Queries/Date.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Queries\\Meta' => $vendorDir . '/berlindb/core/src/Database/Queries/Meta.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Query' => $vendorDir . '/berlindb/core/src/Database/Query.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Row' => $vendorDir . '/berlindb/core/src/Database/Row.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Schema' => $vendorDir . '/berlindb/core/src/Database/Schema.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Table' => $vendorDir . '/berlindb/core/src/Database/Table.php', - 'WP_Ultimo\\Dependencies\\CURLStringFile' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', - 'WP_Ultimo\\Dependencies\\Carbon\\AbstractTranslator' => $vendorDir . '/nesbot/carbon/src/Carbon/AbstractTranslator.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonConverterInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterface.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonPeriod' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonPeriodImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonTimeZone' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Cli\\Invoker' => $vendorDir . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonDoctrineType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonImmutableType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonTypeConverter' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\DateTimeDefaultPrecision' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\DateTimeImmutableType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\DateTimeType' => $vendorDir . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadComparisonUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadFluentConstructorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadFluentSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadMethodCallException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\EndLessPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\Exception' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\ImmutableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidArgumentException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidCastException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidFormatException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidIntervalException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidPeriodDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidPeriodParameterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidTimeZoneException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidTypeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\NotACarbonClassException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\NotAPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\NotLocaleAwareException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\OutOfRangeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\ParseErrorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\RuntimeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnitNotConfiguredException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownGetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownMethodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnreachableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Factory' => $vendorDir . '/nesbot/carbon/src/Carbon/Factory.php', - 'WP_Ultimo\\Dependencies\\Carbon\\FactoryImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Laravel\\ServiceProvider' => $vendorDir . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', - 'WP_Ultimo\\Dependencies\\Carbon\\MessageFormatter\\MessageFormatterMapper' => $vendorDir . '/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\AbstractMacro' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\Macro' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/Macro.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\MacroExtension' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\MacroScanner' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Boundaries' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Cast' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Cast.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Comparison' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Converter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Converter.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Creator' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Creator.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Date' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Date.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\DeprecatedProperties' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Difference' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Difference.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\IntervalRounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\IntervalStep' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Localization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Localization.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Macro' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Macro.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\MagicParameter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/MagicParameter.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Mixin' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Modifiers' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Mutability' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\ObjectInitialisation' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Options' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Options.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Rounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Serialization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Test' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Test.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Timestamp' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\ToStringFormat' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Units' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Units.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Week' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Week.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Translator' => $vendorDir . '/nesbot/carbon/src/Carbon/Translator.php', - 'WP_Ultimo\\Dependencies\\Carbon\\TranslatorImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/TranslatorImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\TranslatorStrongTypeInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\ChainableFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\Cookie' => $vendorDir . '/delight-im/cookie/src/Cookie.php', - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\Session' => $vendorDir . '/delight-im/cookie/src/Session.php', - 'WP_Ultimo\\Dependencies\\Delight\\Http\\ResponseHeader' => $vendorDir . '/delight-im/http/src/ResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Doctrine\\Deprecations\\Deprecation' => $vendorDir . '/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\BodySummarizer' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizer.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\BodySummarizerInterface' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\ClientTrait' => $vendorDir . '/guzzlehttp/guzzle/src/ClientTrait.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\InvalidArgumentException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\HandlerStack' => $vendorDir . '/guzzlehttp/guzzle/src/HandlerStack.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\HeaderProcessor' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\MessageFormatterInterface' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatterInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Create' => $vendorDir . '/guzzlehttp/promises/src/Create.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Each' => $vendorDir . '/guzzlehttp/promises/src/Each.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Is' => $vendorDir . '/guzzlehttp/promises/src/Is.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\PromiseInterface' => $vendorDir . '/guzzlehttp/promises/src/PromiseInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\PromisorInterface' => $vendorDir . '/guzzlehttp/promises/src/PromisorInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Utils' => $vendorDir . '/guzzlehttp/promises/src/Utils.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => $vendorDir . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Header' => $vendorDir . '/guzzlehttp/psr7/src/Header.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\HttpFactory' => $vendorDir . '/guzzlehttp/psr7/src/HttpFactory.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Message' => $vendorDir . '/guzzlehttp/psr7/src/Message.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\MimeType' => $vendorDir . '/guzzlehttp/psr7/src/MimeType.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Query' => $vendorDir . '/guzzlehttp/psr7/src/Query.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UriComparator' => $vendorDir . '/guzzlehttp/psr7/src/UriComparator.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Utils' => $vendorDir . '/guzzlehttp/psr7/src/Utils.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Hashids' => $vendorDir . '/hashids/hashids/src/Hashids.php', - 'WP_Ultimo\\Dependencies\\Hashids\\HashidsException' => $vendorDir . '/hashids/hashids/src/HashidsException.php', - 'WP_Ultimo\\Dependencies\\Hashids\\HashidsInterface' => $vendorDir . '/hashids/hashids/src/HashidsInterface.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Math\\Bc' => $vendorDir . '/hashids/hashids/src/Math/Bc.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Math\\Gmp' => $vendorDir . '/hashids/hashids/src/Math/Gmp.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Math\\MathInterface' => $vendorDir . '/hashids/hashids/src/Math/MathInterface.php', - 'WP_Ultimo\\Dependencies\\Ifsnop\\Mysqldump\\Mysqldump' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php', - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\NoDynamicProperties' => $vendorDir . '/jasny/immutable/src/NoDynamicProperties.php', - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\With' => $vendorDir . '/jasny/immutable/src/With.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Broker' => $vendorDir . '/jasny/sso/src/Broker/Broker.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Cookies' => $vendorDir . '/jasny/sso/src/Broker/Cookies.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Curl' => $vendorDir . '/jasny/sso/src/Broker/Curl.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\NotAttachedException' => $vendorDir . '/jasny/sso/src/Broker/NotAttachedException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\RequestException' => $vendorDir . '/jasny/sso/src/Broker/RequestException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Session' => $vendorDir . '/jasny/sso/src/Broker/Session.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\BrokerException' => $vendorDir . '/jasny/sso/src/Server/BrokerException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\ExceptionInterface' => $vendorDir . '/jasny/sso/src/Server/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\GlobalSession' => $vendorDir . '/jasny/sso/src/Server/GlobalSession.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\Server' => $vendorDir . '/jasny/sso/src/Server/Server.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\ServerException' => $vendorDir . '/jasny/sso/src/Server/ServerException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\SessionInterface' => $vendorDir . '/jasny/sso/src/Server/SessionInterface.php', - 'WP_Ultimo\\Dependencies\\JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\Certificate' => $vendorDir . '/kelunik/certificate/src/Certificate.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\FieldNotSupportedException' => $vendorDir . '/kelunik/certificate/src/FieldNotSupportedException.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\InvalidCertificateException' => $vendorDir . '/kelunik/certificate/src/InvalidCertificateException.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\Profile' => $vendorDir . '/kelunik/certificate/src/Profile.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\BaseUri' => $vendorDir . '/league/uri/BaseUri.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\AuthorityInterface' => $vendorDir . '/league/uri-interfaces/Contracts/AuthorityInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\DataPathInterface' => $vendorDir . '/league/uri-interfaces/Contracts/DataPathInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\DomainHostInterface' => $vendorDir . '/league/uri-interfaces/Contracts/DomainHostInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\FragmentInterface' => $vendorDir . '/league/uri-interfaces/Contracts/FragmentInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\HostInterface' => $vendorDir . '/league/uri-interfaces/Contracts/HostInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\IpHostInterface' => $vendorDir . '/league/uri-interfaces/Contracts/IpHostInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\PathInterface' => $vendorDir . '/league/uri-interfaces/Contracts/PathInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\PortInterface' => $vendorDir . '/league/uri-interfaces/Contracts/PortInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\QueryInterface' => $vendorDir . '/league/uri-interfaces/Contracts/QueryInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\SegmentedPathInterface' => $vendorDir . '/league/uri-interfaces/Contracts/SegmentedPathInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriAccess' => $vendorDir . '/league/uri-interfaces/Contracts/UriAccess.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriComponentInterface' => $vendorDir . '/league/uri-interfaces/Contracts/UriComponentInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriException' => $vendorDir . '/league/uri-interfaces/Contracts/UriException.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriInterface' => $vendorDir . '/league/uri-interfaces/Contracts/UriInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UserInfoInterface' => $vendorDir . '/league/uri-interfaces/Contracts/UserInfoInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Encoder' => $vendorDir . '/league/uri-interfaces/Encoder.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exception' => $vendorDir . '/league/uri-parser/src/Exception.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\ConversionFailed' => $vendorDir . '/league/uri-interfaces/Exceptions/ConversionFailed.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\MissingFeature' => $vendorDir . '/league/uri-interfaces/Exceptions/MissingFeature.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\OffsetOutOfBounds' => $vendorDir . '/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\SyntaxError' => $vendorDir . '/league/uri-interfaces/Exceptions/SyntaxError.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\FeatureDetection' => $vendorDir . '/league/uri-interfaces/FeatureDetection.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Http' => $vendorDir . '/league/uri/Http.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\HttpFactory' => $vendorDir . '/league/uri/HttpFactory.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\BCMathCalculator' => $vendorDir . '/league/uri-interfaces/IPv4/BCMathCalculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\Calculator' => $vendorDir . '/league/uri-interfaces/IPv4/Calculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\Converter' => $vendorDir . '/league/uri-interfaces/IPv4/Converter.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\GMPCalculator' => $vendorDir . '/league/uri-interfaces/IPv4/GMPCalculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\NativeCalculator' => $vendorDir . '/league/uri-interfaces/IPv4/NativeCalculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Converter' => $vendorDir . '/league/uri-interfaces/Idna/Converter.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Error' => $vendorDir . '/league/uri-interfaces/Idna/Error.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Option' => $vendorDir . '/league/uri-interfaces/Idna/Option.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Result' => $vendorDir . '/league/uri-interfaces/Idna/Result.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\KeyValuePair\\Converter' => $vendorDir . '/league/uri-interfaces/KeyValuePair/Converter.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\MissingIdnSupport' => $vendorDir . '/league/uri-parser/src/MissingIdnSupport.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Parser' => $vendorDir . '/league/uri-parser/src/Parser.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\QueryString' => $vendorDir . '/league/uri-interfaces/QueryString.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Uri' => $vendorDir . '/league/uri/Uri.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriInfo' => $vendorDir . '/league/uri/UriInfo.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriResolver' => $vendorDir . '/league/uri/UriResolver.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriString' => $vendorDir . '/league/uri-interfaces/UriString.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate' => $vendorDir . '/league/uri/UriTemplate.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\Expression' => $vendorDir . '/league/uri/UriTemplate/Expression.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\Operator' => $vendorDir . '/league/uri/UriTemplate/Operator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\Template' => $vendorDir . '/league/uri/UriTemplate/Template.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\TemplateCanNotBeExpanded' => $vendorDir . '/league/uri/UriTemplate/TemplateCanNotBeExpanded.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\VarSpecifier' => $vendorDir . '/league/uri/UriTemplate/VarSpecifier.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\VariableBag' => $vendorDir . '/league/uri/UriTemplate/VariableBag.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\Decoder' => $vendorDir . '/daverandom/libdns/src/Decoder/Decoder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\DecoderFactory' => $vendorDir . '/daverandom/libdns/src/Decoder/DecoderFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\DecodingContext' => $vendorDir . '/daverandom/libdns/src/Decoder/DecodingContext.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\DecodingContextFactory' => $vendorDir . '/daverandom/libdns/src/Decoder/DecodingContextFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\Encoder' => $vendorDir . '/daverandom/libdns/src/Encoder/Encoder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\EncoderFactory' => $vendorDir . '/daverandom/libdns/src/Encoder/EncoderFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\EncodingContext' => $vendorDir . '/daverandom/libdns/src/Encoder/EncodingContext.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\EncodingContextFactory' => $vendorDir . '/daverandom/libdns/src/Encoder/EncodingContextFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Enumeration' => $vendorDir . '/daverandom/libdns/src/Enumeration.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\Message' => $vendorDir . '/daverandom/libdns/src/Messages/Message.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageFactory' => $vendorDir . '/daverandom/libdns/src/Messages/MessageFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageOpCodes' => $vendorDir . '/daverandom/libdns/src/Messages/MessageOpCodes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageResponseCodes' => $vendorDir . '/daverandom/libdns/src/Messages/MessageResponseCodes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageTypes' => $vendorDir . '/daverandom/libdns/src/Messages/MessageTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Packets\\LabelRegistry' => $vendorDir . '/daverandom/libdns/src/Packets/LabelRegistry.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Packets\\Packet' => $vendorDir . '/daverandom/libdns/src/Packets/Packet.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Packets\\PacketFactory' => $vendorDir . '/daverandom/libdns/src/Packets/PacketFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Question' => $vendorDir . '/daverandom/libdns/src/Records/Question.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\QuestionFactory' => $vendorDir . '/daverandom/libdns/src/Records/QuestionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RData' => $vendorDir . '/daverandom/libdns/src/Records/RData.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RDataBuilder' => $vendorDir . '/daverandom/libdns/src/Records/RDataBuilder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RDataFactory' => $vendorDir . '/daverandom/libdns/src/Records/RDataFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Record' => $vendorDir . '/daverandom/libdns/src/Records/Record.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RecordCollection' => $vendorDir . '/daverandom/libdns/src/Records/RecordCollection.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RecordCollectionFactory' => $vendorDir . '/daverandom/libdns/src/Records/RecordCollectionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RecordTypes' => $vendorDir . '/daverandom/libdns/src/Records/RecordTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Resource' => $vendorDir . '/daverandom/libdns/src/Records/Resource.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceBuilder' => $vendorDir . '/daverandom/libdns/src/Records/ResourceBuilder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceBuilderFactory' => $vendorDir . '/daverandom/libdns/src/Records/ResourceBuilderFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceClasses' => $vendorDir . '/daverandom/libdns/src/Records/ResourceClasses.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceFactory' => $vendorDir . '/daverandom/libdns/src/Records/ResourceFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceQClasses' => $vendorDir . '/daverandom/libdns/src/Records/ResourceQClasses.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceQTypes' => $vendorDir . '/daverandom/libdns/src/Records/ResourceQTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceTypes' => $vendorDir . '/daverandom/libdns/src/Records/ResourceTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\FieldDefinition' => $vendorDir . '/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinition.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\FieldDefinitionFactory' => $vendorDir . '/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinitionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinition' => $vendorDir . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinition.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinitionFactory' => $vendorDir . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinitionManager' => $vendorDir . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManager.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinitionManagerFactory' => $vendorDir . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManagerFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Anything' => $vendorDir . '/daverandom/libdns/src/Records/Types/Anything.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\BitMap' => $vendorDir . '/daverandom/libdns/src/Records/Types/BitMap.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Char' => $vendorDir . '/daverandom/libdns/src/Records/Types/Char.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\CharacterString' => $vendorDir . '/daverandom/libdns/src/Records/Types/CharacterString.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\DomainName' => $vendorDir . '/daverandom/libdns/src/Records/Types/DomainName.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\IPv4Address' => $vendorDir . '/daverandom/libdns/src/Records/Types/IPv4Address.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\IPv6Address' => $vendorDir . '/daverandom/libdns/src/Records/Types/IPv6Address.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Long' => $vendorDir . '/daverandom/libdns/src/Records/Types/Long.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Short' => $vendorDir . '/daverandom/libdns/src/Records/Types/Short.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Type' => $vendorDir . '/daverandom/libdns/src/Records/Types/Type.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\TypeBuilder' => $vendorDir . '/daverandom/libdns/src/Records/Types/TypeBuilder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\TypeFactory' => $vendorDir . '/daverandom/libdns/src/Records/Types/TypeFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Types' => $vendorDir . '/daverandom/libdns/src/Records/Types/Types.php', - 'WP_Ultimo\\Dependencies\\Mexitek\\PHPColors\\Color' => $vendorDir . '/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\AssetFetcher' => $vendorDir . '/mpdf/mpdf/src/AssetFetcher.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode' => $vendorDir . '/mpdf/mpdf/src/Barcode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\AbstractBarcode' => $vendorDir . '/mpdf/mpdf/src/Barcode/AbstractBarcode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\BarcodeException' => $vendorDir . '/mpdf/mpdf/src/Barcode/BarcodeException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\BarcodeInterface' => $vendorDir . '/mpdf/mpdf/src/Barcode/BarcodeInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Codabar' => $vendorDir . '/mpdf/mpdf/src/Barcode/Codabar.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code11' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code11.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code128' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code128.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code39' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code39.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code93' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code93.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\EanExt' => $vendorDir . '/mpdf/mpdf/src/Barcode/EanExt.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\EanUpc' => $vendorDir . '/mpdf/mpdf/src/Barcode/EanUpc.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\I25' => $vendorDir . '/mpdf/mpdf/src/Barcode/I25.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Imb' => $vendorDir . '/mpdf/mpdf/src/Barcode/Imb.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Msi' => $vendorDir . '/mpdf/mpdf/src/Barcode/Msi.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Postnet' => $vendorDir . '/mpdf/mpdf/src/Barcode/Postnet.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Rm4Scc' => $vendorDir . '/mpdf/mpdf/src/Barcode/Rm4Scc.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\S25' => $vendorDir . '/mpdf/mpdf/src/Barcode/S25.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Cache' => $vendorDir . '/mpdf/mpdf/src/Cache.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\ColorConverter' => $vendorDir . '/mpdf/mpdf/src/Color/ColorConverter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\ColorModeConverter' => $vendorDir . '/mpdf/mpdf/src/Color/ColorModeConverter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\ColorSpaceRestrictor' => $vendorDir . '/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\NamedColors' => $vendorDir . '/mpdf/mpdf/src/Color/NamedColors.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Config\\ConfigVariables' => $vendorDir . '/mpdf/mpdf/src/Config/ConfigVariables.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Config\\FontVariables' => $vendorDir . '/mpdf/mpdf/src/Config/FontVariables.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Container\\ContainerInterface' => $vendorDir . '/mpdf/mpdf/src/Container/ContainerInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Container\\NotFoundException' => $vendorDir . '/mpdf/mpdf/src/Container/NotFoundException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Container\\SimpleContainer' => $vendorDir . '/mpdf/mpdf/src/Container/SimpleContainer.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToAlpha' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToAlpha.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToCjk' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToCjk.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToHebrew' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToHebrew.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToOther' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToOther.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToRoman' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToRoman.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\CssManager' => $vendorDir . '/mpdf/mpdf/src/CssManager.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Css\\Border' => $vendorDir . '/mpdf/mpdf/src/Css/Border.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Css\\DefaultCss' => $vendorDir . '/mpdf/mpdf/src/Css/DefaultCss.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Css\\TextVars' => $vendorDir . '/mpdf/mpdf/src/Css/TextVars.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\DirectWrite' => $vendorDir . '/mpdf/mpdf/src/DirectWrite.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Exception\\AssetFetchingException' => $vendorDir . '/mpdf/mpdf/src/Exception/AssetFetchingException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Exception\\FontException' => $vendorDir . '/mpdf/mpdf/src/Exception/FontException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Exception\\InvalidArgumentException' => $vendorDir . '/mpdf/mpdf/src/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\File\\LocalContentLoader' => $vendorDir . '/mpdf/mpdf/src/File/LocalContentLoader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\File\\LocalContentLoaderInterface' => $vendorDir . '/mpdf/mpdf/src/File/LocalContentLoaderInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\File\\StreamWrapperChecker' => $vendorDir . '/mpdf/mpdf/src/File/StreamWrapperChecker.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\FontCache' => $vendorDir . '/mpdf/mpdf/src/Fonts/FontCache.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\FontFileFinder' => $vendorDir . '/mpdf/mpdf/src/Fonts/FontFileFinder.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\GlyphOperator' => $vendorDir . '/mpdf/mpdf/src/Fonts/GlyphOperator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\MetricsGenerator' => $vendorDir . '/mpdf/mpdf/src/Fonts/MetricsGenerator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Form' => $vendorDir . '/mpdf/mpdf/src/Form.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\FpdiTrait' => $vendorDir . '/mpdf/mpdf/src/FpdiTrait.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\ColorTable' => $vendorDir . '/mpdf/mpdf/src/Gif/ColorTable.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\FileHeader' => $vendorDir . '/mpdf/mpdf/src/Gif/FileHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\Gif' => $vendorDir . '/mpdf/mpdf/src/Gif/Gif.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\Image' => $vendorDir . '/mpdf/mpdf/src/Gif/Image.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\ImageHeader' => $vendorDir . '/mpdf/mpdf/src/Gif/ImageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\Lzw' => $vendorDir . '/mpdf/mpdf/src/Gif/Lzw.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gradient' => $vendorDir . '/mpdf/mpdf/src/Gradient.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\HTMLParserMode' => $vendorDir . '/mpdf/mpdf/src/HTMLParserMode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\ClientInterface' => $vendorDir . '/mpdf/mpdf/src/Http/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\CurlHttpClient' => $vendorDir . '/mpdf/mpdf/src/Http/CurlHttpClient.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\ClientException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/ClientException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\ForbiddenRequestException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\NetworkException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/NetworkException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\RequestException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/RequestException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\SocketHttpClient' => $vendorDir . '/mpdf/mpdf/src/Http/SocketHttpClient.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Hyphenator' => $vendorDir . '/mpdf/mpdf/src/Hyphenator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\Bmp' => $vendorDir . '/mpdf/mpdf/src/Image/Bmp.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\ImageProcessor' => $vendorDir . '/mpdf/mpdf/src/Image/ImageProcessor.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\ImageTypeGuesser' => $vendorDir . '/mpdf/mpdf/src/Image/ImageTypeGuesser.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\Svg' => $vendorDir . '/mpdf/mpdf/src/Image/Svg.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\Wmf' => $vendorDir . '/mpdf/mpdf/src/Image/Wmf.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\LanguageToFont' => $vendorDir . '/mpdf/mpdf/src/Language/LanguageToFont.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\LanguageToFontInterface' => $vendorDir . '/mpdf/mpdf/src/Language/LanguageToFontInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\ScriptToLanguage' => $vendorDir . '/mpdf/mpdf/src/Language/ScriptToLanguage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\ScriptToLanguageInterface' => $vendorDir . '/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Log\\Context' => $vendorDir . '/mpdf/mpdf/src/Log/Context.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Mpdf' => $vendorDir . '/mpdf/mpdf/src/Mpdf.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\MpdfException' => $vendorDir . '/mpdf/mpdf/src/MpdfException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\MpdfImageException' => $vendorDir . '/mpdf/mpdf/src/MpdfImageException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Otl' => $vendorDir . '/mpdf/mpdf/src/Otl.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\OtlDump' => $vendorDir . '/mpdf/mpdf/src/OtlDump.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Output\\Destination' => $vendorDir . '/mpdf/mpdf/src/Output/Destination.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PageBox' => $vendorDir . '/mpdf/mpdf/src/PageBox.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PageFormat' => $vendorDir . '/mpdf/mpdf/src/PageFormat.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Pdf\\Protection' => $vendorDir . '/mpdf/mpdf/src/Pdf/Protection.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Pdf\\Protection\\UniqidGenerator' => $vendorDir . '/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Request' => $vendorDir . '/mpdf/psr-http-message-shim/src/Request.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Response' => $vendorDir . '/mpdf/psr-http-message-shim/src/Response.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Stream' => $vendorDir . '/mpdf/psr-http-message-shim/src/Stream.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Uri' => $vendorDir . '/mpdf/psr-http-message-shim/src/Uri.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\MpdfPsrLogAwareTrait' => $vendorDir . '/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\PsrLogAwareTrait' => $vendorDir . '/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\ServiceFactory' => $vendorDir . '/mpdf/mpdf/src/ServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Shaper\\Indic' => $vendorDir . '/mpdf/mpdf/src/Shaper/Indic.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Shaper\\Myanmar' => $vendorDir . '/mpdf/mpdf/src/Shaper/Myanmar.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Shaper\\Sea' => $vendorDir . '/mpdf/mpdf/src/Shaper/Sea.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\SizeConverter' => $vendorDir . '/mpdf/mpdf/src/SizeConverter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Strict' => $vendorDir . '/mpdf/mpdf/src/Strict.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\TTFontFile' => $vendorDir . '/mpdf/mpdf/src/TTFontFile.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\TTFontFileAnalysis' => $vendorDir . '/mpdf/mpdf/src/TTFontFileAnalysis.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\TableOfContents' => $vendorDir . '/mpdf/mpdf/src/TableOfContents.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag' => $vendorDir . '/mpdf/mpdf/src/Tag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\A' => $vendorDir . '/mpdf/mpdf/src/Tag/A.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Acronym' => $vendorDir . '/mpdf/mpdf/src/Tag/Acronym.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Address' => $vendorDir . '/mpdf/mpdf/src/Tag/Address.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Annotation' => $vendorDir . '/mpdf/mpdf/src/Tag/Annotation.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Article' => $vendorDir . '/mpdf/mpdf/src/Tag/Article.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Aside' => $vendorDir . '/mpdf/mpdf/src/Tag/Aside.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\B' => $vendorDir . '/mpdf/mpdf/src/Tag/B.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\BarCode' => $vendorDir . '/mpdf/mpdf/src/Tag/BarCode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Bdi' => $vendorDir . '/mpdf/mpdf/src/Tag/Bdi.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Bdo' => $vendorDir . '/mpdf/mpdf/src/Tag/Bdo.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Big' => $vendorDir . '/mpdf/mpdf/src/Tag/Big.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\BlockQuote' => $vendorDir . '/mpdf/mpdf/src/Tag/BlockQuote.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\BlockTag' => $vendorDir . '/mpdf/mpdf/src/Tag/BlockTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Bookmark' => $vendorDir . '/mpdf/mpdf/src/Tag/Bookmark.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Br' => $vendorDir . '/mpdf/mpdf/src/Tag/Br.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Caption' => $vendorDir . '/mpdf/mpdf/src/Tag/Caption.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Center' => $vendorDir . '/mpdf/mpdf/src/Tag/Center.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Cite' => $vendorDir . '/mpdf/mpdf/src/Tag/Cite.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Code' => $vendorDir . '/mpdf/mpdf/src/Tag/Code.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\ColumnBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/ColumnBreak.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Columns' => $vendorDir . '/mpdf/mpdf/src/Tag/Columns.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Dd' => $vendorDir . '/mpdf/mpdf/src/Tag/Dd.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Del' => $vendorDir . '/mpdf/mpdf/src/Tag/Del.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Details' => $vendorDir . '/mpdf/mpdf/src/Tag/Details.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Div' => $vendorDir . '/mpdf/mpdf/src/Tag/Div.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Dl' => $vendorDir . '/mpdf/mpdf/src/Tag/Dl.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\DotTab' => $vendorDir . '/mpdf/mpdf/src/Tag/DotTab.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Dt' => $vendorDir . '/mpdf/mpdf/src/Tag/Dt.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Em' => $vendorDir . '/mpdf/mpdf/src/Tag/Em.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\FieldSet' => $vendorDir . '/mpdf/mpdf/src/Tag/FieldSet.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\FigCaption' => $vendorDir . '/mpdf/mpdf/src/Tag/FigCaption.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Figure' => $vendorDir . '/mpdf/mpdf/src/Tag/Figure.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Font' => $vendorDir . '/mpdf/mpdf/src/Tag/Font.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Footer' => $vendorDir . '/mpdf/mpdf/src/Tag/Footer.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Form' => $vendorDir . '/mpdf/mpdf/src/Tag/Form.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\FormFeed' => $vendorDir . '/mpdf/mpdf/src/Tag/FormFeed.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H1' => $vendorDir . '/mpdf/mpdf/src/Tag/H1.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H2' => $vendorDir . '/mpdf/mpdf/src/Tag/H2.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H3' => $vendorDir . '/mpdf/mpdf/src/Tag/H3.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H4' => $vendorDir . '/mpdf/mpdf/src/Tag/H4.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H5' => $vendorDir . '/mpdf/mpdf/src/Tag/H5.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H6' => $vendorDir . '/mpdf/mpdf/src/Tag/H6.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\HGroup' => $vendorDir . '/mpdf/mpdf/src/Tag/HGroup.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Header' => $vendorDir . '/mpdf/mpdf/src/Tag/Header.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Hr' => $vendorDir . '/mpdf/mpdf/src/Tag/Hr.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\I' => $vendorDir . '/mpdf/mpdf/src/Tag/I.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Img' => $vendorDir . '/mpdf/mpdf/src/Tag/Img.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\IndexEntry' => $vendorDir . '/mpdf/mpdf/src/Tag/IndexEntry.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\IndexInsert' => $vendorDir . '/mpdf/mpdf/src/Tag/IndexInsert.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\InlineTag' => $vendorDir . '/mpdf/mpdf/src/Tag/InlineTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Input' => $vendorDir . '/mpdf/mpdf/src/Tag/Input.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ins' => $vendorDir . '/mpdf/mpdf/src/Tag/Ins.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Kbd' => $vendorDir . '/mpdf/mpdf/src/Tag/Kbd.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Legend' => $vendorDir . '/mpdf/mpdf/src/Tag/Legend.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Li' => $vendorDir . '/mpdf/mpdf/src/Tag/Li.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Main' => $vendorDir . '/mpdf/mpdf/src/Tag/Main.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Mark' => $vendorDir . '/mpdf/mpdf/src/Tag/Mark.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Meter' => $vendorDir . '/mpdf/mpdf/src/Tag/Meter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Nav' => $vendorDir . '/mpdf/mpdf/src/Tag/Nav.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\NewColumn' => $vendorDir . '/mpdf/mpdf/src/Tag/NewColumn.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\NewPage' => $vendorDir . '/mpdf/mpdf/src/Tag/NewPage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ol' => $vendorDir . '/mpdf/mpdf/src/Tag/Ol.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Option' => $vendorDir . '/mpdf/mpdf/src/Tag/Option.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\P' => $vendorDir . '/mpdf/mpdf/src/Tag/P.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\PageBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/PageBreak.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\PageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/PageFooter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\PageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/PageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Pre' => $vendorDir . '/mpdf/mpdf/src/Tag/Pre.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Progress' => $vendorDir . '/mpdf/mpdf/src/Tag/Progress.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Q' => $vendorDir . '/mpdf/mpdf/src/Tag/Q.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\S' => $vendorDir . '/mpdf/mpdf/src/Tag/S.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Samp' => $vendorDir . '/mpdf/mpdf/src/Tag/Samp.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Section' => $vendorDir . '/mpdf/mpdf/src/Tag/Section.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Select' => $vendorDir . '/mpdf/mpdf/src/Tag/Select.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetHtmlPageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetHtmlPageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetPageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/SetPageFooter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetPageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/SetPageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Small' => $vendorDir . '/mpdf/mpdf/src/Tag/Small.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Span' => $vendorDir . '/mpdf/mpdf/src/Tag/Span.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Strike' => $vendorDir . '/mpdf/mpdf/src/Tag/Strike.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Strong' => $vendorDir . '/mpdf/mpdf/src/Tag/Strong.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Sub' => $vendorDir . '/mpdf/mpdf/src/Tag/Sub.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SubstituteTag' => $vendorDir . '/mpdf/mpdf/src/Tag/SubstituteTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Summary' => $vendorDir . '/mpdf/mpdf/src/Tag/Summary.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Sup' => $vendorDir . '/mpdf/mpdf/src/Tag/Sup.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TBody' => $vendorDir . '/mpdf/mpdf/src/Tag/TBody.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TFoot' => $vendorDir . '/mpdf/mpdf/src/Tag/TFoot.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\THead' => $vendorDir . '/mpdf/mpdf/src/Tag/THead.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Table' => $vendorDir . '/mpdf/mpdf/src/Tag/Table.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tag' => $vendorDir . '/mpdf/mpdf/src/Tag/Tag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Td' => $vendorDir . '/mpdf/mpdf/src/Tag/Td.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TextArea' => $vendorDir . '/mpdf/mpdf/src/Tag/TextArea.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TextCircle' => $vendorDir . '/mpdf/mpdf/src/Tag/TextCircle.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Th' => $vendorDir . '/mpdf/mpdf/src/Tag/Th.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Time' => $vendorDir . '/mpdf/mpdf/src/Tag/Time.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Toc' => $vendorDir . '/mpdf/mpdf/src/Tag/Toc.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TocEntry' => $vendorDir . '/mpdf/mpdf/src/Tag/TocEntry.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TocPageBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/TocPageBreak.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tr' => $vendorDir . '/mpdf/mpdf/src/Tag/Tr.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tt' => $vendorDir . '/mpdf/mpdf/src/Tag/Tt.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tta' => $vendorDir . '/mpdf/mpdf/src/Tag/Tta.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tts' => $vendorDir . '/mpdf/mpdf/src/Tag/Tts.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ttz' => $vendorDir . '/mpdf/mpdf/src/Tag/Ttz.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\U' => $vendorDir . '/mpdf/mpdf/src/Tag/U.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ul' => $vendorDir . '/mpdf/mpdf/src/Tag/Ul.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\VarTag' => $vendorDir . '/mpdf/mpdf/src/Tag/VarTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\WatermarkImage' => $vendorDir . '/mpdf/mpdf/src/Tag/WatermarkImage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\WatermarkText' => $vendorDir . '/mpdf/mpdf/src/Tag/WatermarkText.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Ucdn' => $vendorDir . '/mpdf/mpdf/src/Ucdn.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\Arrays' => $vendorDir . '/mpdf/mpdf/src/Utils/Arrays.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\NumericString' => $vendorDir . '/mpdf/mpdf/src/Utils/NumericString.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\PdfDate' => $vendorDir . '/mpdf/mpdf/src/Utils/PdfDate.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\UtfString' => $vendorDir . '/mpdf/mpdf/src/Utils/UtfString.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Watermark' => $vendorDir . '/mpdf/mpdf/src/Watermark.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\WatermarkImage' => $vendorDir . '/mpdf/mpdf/src/WatermarkImage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\WatermarkText' => $vendorDir . '/mpdf/mpdf/src/WatermarkText.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\BackgroundWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BackgroundWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\BaseWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BaseWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\BookmarkWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BookmarkWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ColorWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ColorWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\FontWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/FontWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\FormWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/FormWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ImageWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ImageWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\JavaScriptWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/JavaScriptWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\MetadataWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/MetadataWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ObjectWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ObjectWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\OptionalContentWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/OptionalContentWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\PageWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/PageWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ResourceWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ResourceWriter.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Factory\\HttplugFactory' => $vendorDir . '/nyholm/psr7/src/Factory/HttplugFactory.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Factory\\Psr17Factory' => $vendorDir . '/nyholm/psr7/src/Factory/Psr17Factory.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\MessageTrait' => $vendorDir . '/nyholm/psr7/src/MessageTrait.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Request' => $vendorDir . '/nyholm/psr7/src/Request.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\RequestTrait' => $vendorDir . '/nyholm/psr7/src/RequestTrait.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Response' => $vendorDir . '/nyholm/psr7/src/Response.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\ServerRequest' => $vendorDir . '/nyholm/psr7/src/ServerRequest.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Stream' => $vendorDir . '/nyholm/psr7/src/Stream.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\StreamTrait' => $vendorDir . '/nyholm/psr7/src/StreamTrait.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\UploadedFile' => $vendorDir . '/nyholm/psr7/src/UploadedFile.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Uri' => $vendorDir . '/nyholm/psr7/src/Uri.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Attribute' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\QuoteAwareConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Node' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Node.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor\\CloningVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagMethodValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagPropertyValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineAnnotation' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArgument' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArray' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArrayItem' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ExtendsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ImplementsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MixinTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamOutTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\SelfOutTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasImportTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypelessParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\UsesTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeForParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\InvalidTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Lexer\\Lexer' => $vendorDir . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\ParserException' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\StringUnescaper' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\TokenIterator' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\TypeParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Printer\\DiffElem' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/DiffElem.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Printer\\Differ' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/Differ.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Printer\\Printer' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/Printer.php', - 'WP_Ultimo\\Dependencies\\Pablo_Pacheco\\WP_Namespace_Autoloader\\WP_Namespace_Autoloader' => $vendorDir . '/pablo-sg-pacheco/wp-namespace-autoloader/src/WP_Namespace_Autoloader.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base32' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base32Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32Hex.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64DotSlash' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64DotSlash.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64DotSlashOrdered' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64UrlSafe' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64UrlSafe.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Binary' => $vendorDir . '/paragonie/constant_time_encoding/src/Binary.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\EncoderInterface' => $vendorDir . '/paragonie/constant_time_encoding/src/EncoderInterface.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Encoding' => $vendorDir . '/paragonie/constant_time_encoding/src/Encoding.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Hex.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\RFC4648' => $vendorDir . '/paragonie/constant_time_encoding/src/RFC4648.php', - 'WP_Ultimo\\Dependencies\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Psr\\Clock\\ClockInterface' => $vendorDir . '/psr/clock/src/ClockInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\RequestExceptionInterface' => $vendorDir . '/psr/http-client/src/RequestExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\RequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/RequestFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ResponseFactoryInterface' => $vendorDir . '/psr/http-factory/src/ResponseFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ServerRequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/ServerRequestFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\StreamFactoryInterface' => $vendorDir . '/psr/http-factory/src/StreamFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UploadedFileFactoryInterface' => $vendorDir . '/psr/http-factory/src/UploadedFileFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Attribute' => $vendorDir . '/rakit/validation/src/Attribute.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\ErrorBag' => $vendorDir . '/rakit/validation/src/ErrorBag.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Helper' => $vendorDir . '/rakit/validation/src/Helper.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\MimeTypeGuesser' => $vendorDir . '/rakit/validation/src/MimeTypeGuesser.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\MissingRequiredParameterException' => $vendorDir . '/rakit/validation/src/MissingRequiredParameterException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rule' => $vendorDir . '/rakit/validation/src/Rule.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\RuleNotFoundException' => $vendorDir . '/rakit/validation/src/RuleNotFoundException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\RuleQuashException' => $vendorDir . '/rakit/validation/src/RuleQuashException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Accepted' => $vendorDir . '/rakit/validation/src/Rules/Accepted.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\After' => $vendorDir . '/rakit/validation/src/Rules/After.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Alpha' => $vendorDir . '/rakit/validation/src/Rules/Alpha.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\AlphaDash' => $vendorDir . '/rakit/validation/src/Rules/AlphaDash.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\AlphaNum' => $vendorDir . '/rakit/validation/src/Rules/AlphaNum.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\AlphaSpaces' => $vendorDir . '/rakit/validation/src/Rules/AlphaSpaces.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Before' => $vendorDir . '/rakit/validation/src/Rules/Before.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Between' => $vendorDir . '/rakit/validation/src/Rules/Between.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Boolean' => $vendorDir . '/rakit/validation/src/Rules/Boolean.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Callback' => $vendorDir . '/rakit/validation/src/Rules/Callback.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Date' => $vendorDir . '/rakit/validation/src/Rules/Date.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Defaults' => $vendorDir . '/rakit/validation/src/Rules/Defaults.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Different' => $vendorDir . '/rakit/validation/src/Rules/Different.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Digits' => $vendorDir . '/rakit/validation/src/Rules/Digits.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\DigitsBetween' => $vendorDir . '/rakit/validation/src/Rules/DigitsBetween.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Email' => $vendorDir . '/rakit/validation/src/Rules/Email.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Extension' => $vendorDir . '/rakit/validation/src/Rules/Extension.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\In' => $vendorDir . '/rakit/validation/src/Rules/In.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Integer' => $vendorDir . '/rakit/validation/src/Rules/Integer.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Interfaces\\BeforeValidate' => $vendorDir . '/rakit/validation/src/Rules/Interfaces/BeforeValidate.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Interfaces\\ModifyValue' => $vendorDir . '/rakit/validation/src/Rules/Interfaces/ModifyValue.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Ip' => $vendorDir . '/rakit/validation/src/Rules/Ip.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Ipv4' => $vendorDir . '/rakit/validation/src/Rules/Ipv4.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Ipv6' => $vendorDir . '/rakit/validation/src/Rules/Ipv6.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Json' => $vendorDir . '/rakit/validation/src/Rules/Json.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Lowercase' => $vendorDir . '/rakit/validation/src/Rules/Lowercase.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Max' => $vendorDir . '/rakit/validation/src/Rules/Max.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Mimes' => $vendorDir . '/rakit/validation/src/Rules/Mimes.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Min' => $vendorDir . '/rakit/validation/src/Rules/Min.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\NotIn' => $vendorDir . '/rakit/validation/src/Rules/NotIn.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Nullable' => $vendorDir . '/rakit/validation/src/Rules/Nullable.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Numeric' => $vendorDir . '/rakit/validation/src/Rules/Numeric.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Present' => $vendorDir . '/rakit/validation/src/Rules/Present.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Regex' => $vendorDir . '/rakit/validation/src/Rules/Regex.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Required' => $vendorDir . '/rakit/validation/src/Rules/Required.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredIf' => $vendorDir . '/rakit/validation/src/Rules/RequiredIf.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredUnless' => $vendorDir . '/rakit/validation/src/Rules/RequiredUnless.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWith' => $vendorDir . '/rakit/validation/src/Rules/RequiredWith.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWithAll' => $vendorDir . '/rakit/validation/src/Rules/RequiredWithAll.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWithout' => $vendorDir . '/rakit/validation/src/Rules/RequiredWithout.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWithoutAll' => $vendorDir . '/rakit/validation/src/Rules/RequiredWithoutAll.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Same' => $vendorDir . '/rakit/validation/src/Rules/Same.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Traits\\DateUtilsTrait' => $vendorDir . '/rakit/validation/src/Rules/Traits/DateUtilsTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Traits\\FileTrait' => $vendorDir . '/rakit/validation/src/Rules/Traits/FileTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Traits\\SizeTrait' => $vendorDir . '/rakit/validation/src/Rules/Traits/SizeTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\TypeArray' => $vendorDir . '/rakit/validation/src/Rules/TypeArray.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\UploadedFile' => $vendorDir . '/rakit/validation/src/Rules/UploadedFile.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Uppercase' => $vendorDir . '/rakit/validation/src/Rules/Uppercase.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Url' => $vendorDir . '/rakit/validation/src/Rules/Url.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Traits\\MessagesTrait' => $vendorDir . '/rakit/validation/src/Traits/MessagesTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Traits\\TranslationsTrait' => $vendorDir . '/rakit/validation/src/Traits/TranslationsTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Validation' => $vendorDir . '/rakit/validation/src/Validation.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Validator' => $vendorDir . '/rakit/validation/src/Validator.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\CAAData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/CAAData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\CNAMEData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/CNAMEData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DNSRecord' => $vendorDir . '/remotelyliving/php-dns/src/Entities/DNSRecord.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DNSRecordCollection' => $vendorDir . '/remotelyliving/php-dns/src/Entities/DNSRecordCollection.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DNSRecordType' => $vendorDir . '/remotelyliving/php-dns/src/Entities/DNSRecordType.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DataAbstract' => $vendorDir . '/remotelyliving/php-dns/src/Entities/DataAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\EntityAbstract' => $vendorDir . '/remotelyliving/php-dns/src/Entities/EntityAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Hostname' => $vendorDir . '/remotelyliving/php-dns/src/Entities/Hostname.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\IPAddress' => $vendorDir . '/remotelyliving/php-dns/src/Entities/IPAddress.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Interfaces\\Arrayable' => $vendorDir . '/remotelyliving/php-dns/src/Entities/Interfaces/Arrayable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Interfaces\\DNSRecordInterface' => $vendorDir . '/remotelyliving/php-dns/src/Entities/Interfaces/DNSRecordInterface.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Interfaces\\Serializable' => $vendorDir . '/remotelyliving/php-dns/src/Entities/Interfaces/Serializable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\MXData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/MXData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\NSData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/NSData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\PTRData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/PTRData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\SOAData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/SOAData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\SRVData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/SRVData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\TXTData' => $vendorDir . '/remotelyliving/php-dns/src/Entities/TXTData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Exceptions\\Exception' => $vendorDir . '/remotelyliving/php-dns/src/Exceptions/Exception.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Exceptions\\InvalidArgumentException' => $vendorDir . '/remotelyliving/php-dns/src/Exceptions/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Factories\\SpatieDNS' => $vendorDir . '/remotelyliving/php-dns/src/Factories/SpatieDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\CloudFlare' => $vendorDir . '/remotelyliving/php-dns/src/Mappers/CloudFlare.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\Dig' => $vendorDir . '/remotelyliving/php-dns/src/Mappers/Dig.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\GoogleDNS' => $vendorDir . '/remotelyliving/php-dns/src/Mappers/GoogleDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\LocalSystem' => $vendorDir . '/remotelyliving/php-dns/src/Mappers/LocalSystem.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\MapperAbstract' => $vendorDir . '/remotelyliving/php-dns/src/Mappers/MapperAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\MapperInterface' => $vendorDir . '/remotelyliving/php-dns/src/Mappers/MapperInterface.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\DNSQueried' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Events/DNSQueried.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\DNSQueryFailed' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Events/DNSQueryFailed.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\DNSQueryProfiled' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Events/DNSQueryProfiled.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\ObservableEventAbstract' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Events/ObservableEventAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Interfaces\\Observable' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Interfaces/Observable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Interfaces\\ProfileInterface' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Performance/Interfaces/ProfileInterface.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Interfaces\\Time' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Performance/Interfaces/Time.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Profile' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Performance/Profile.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\ProfileFactory' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Performance/ProfileFactory.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Timer' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Performance/Timer.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Subscribers\\STDIOSubscriber' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Subscribers/STDIOSubscriber.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Traits\\Dispatcher' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Traits/Dispatcher.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Traits\\Logger' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Traits/Logger.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Traits\\Profileable' => $vendorDir . '/remotelyliving/php-dns/src/Observability/Traits/Profileable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Cached' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Cached.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Chain' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Chain.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\CloudFlare' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/CloudFlare.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Dig' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Dig.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Exceptions\\QueryFailure' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Exceptions/QueryFailure.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Exceptions\\ReverseLookupFailure' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Exceptions/ReverseLookupFailure.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\GoogleDNS' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/GoogleDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\Chain' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Interfaces/Chain.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\DNSQuery' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Interfaces/DNSQuery.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\ObservableResolver' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Interfaces/ObservableResolver.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\Resolver' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Interfaces/Resolver.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\ReverseDNSQuery' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Interfaces/ReverseDNSQuery.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\LocalSystem' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/LocalSystem.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\ResolverAbstract' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/ResolverAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Traits\\Time' => $vendorDir . '/remotelyliving/php-dns/src/Resolvers/Traits/Time.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Services\\Interfaces\\LocalSystemDNS' => $vendorDir . '/remotelyliving/php-dns/src/Services/Interfaces/LocalSystemDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Services\\LocalSystemDNS' => $vendorDir . '/remotelyliving/php-dns/src/Services/LocalSystemDNS.php', - 'WP_Ultimo\\Dependencies\\ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Base\\Range' => $vendorDir . '/scssphp/scssphp/src/Base/Range.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block' => $vendorDir . '/scssphp/scssphp/src/Block.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\AtRootBlock' => $vendorDir . '/scssphp/scssphp/src/Block/AtRootBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\CallableBlock' => $vendorDir . '/scssphp/scssphp/src/Block/CallableBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ContentBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ContentBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\DirectiveBlock' => $vendorDir . '/scssphp/scssphp/src/Block/DirectiveBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\EachBlock' => $vendorDir . '/scssphp/scssphp/src/Block/EachBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ElseBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ElseBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ElseifBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ElseifBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ForBlock' => $vendorDir . '/scssphp/scssphp/src/Block/ForBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\IfBlock' => $vendorDir . '/scssphp/scssphp/src/Block/IfBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\MediaBlock' => $vendorDir . '/scssphp/scssphp/src/Block/MediaBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\NestedPropertyBlock' => $vendorDir . '/scssphp/scssphp/src/Block/NestedPropertyBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\WhileBlock' => $vendorDir . '/scssphp/scssphp/src/Block/WhileBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Cache' => $vendorDir . '/scssphp/scssphp/src/Cache.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Colors' => $vendorDir . '/scssphp/scssphp/src/Colors.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\CompilationResult' => $vendorDir . '/scssphp/scssphp/src/CompilationResult.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Compiler' => $vendorDir . '/scssphp/scssphp/src/Compiler.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Compiler\\CachedResult' => $vendorDir . '/scssphp/scssphp/src/Compiler/CachedResult.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Compiler\\Environment' => $vendorDir . '/scssphp/scssphp/src/Compiler/Environment.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\CompilerException' => $vendorDir . '/scssphp/scssphp/src/Exception/CompilerException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\ParserException' => $vendorDir . '/scssphp/scssphp/src/Exception/ParserException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\RangeException' => $vendorDir . '/scssphp/scssphp/src/Exception/RangeException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\SassException' => $vendorDir . '/scssphp/scssphp/src/Exception/SassException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\SassScriptException' => $vendorDir . '/scssphp/scssphp/src/Exception/SassScriptException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\ServerException' => $vendorDir . '/scssphp/scssphp/src/Exception/ServerException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter' => $vendorDir . '/scssphp/scssphp/src/Formatter.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Compact' => $vendorDir . '/scssphp/scssphp/src/Formatter/Compact.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Compressed' => $vendorDir . '/scssphp/scssphp/src/Formatter/Compressed.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Crunched' => $vendorDir . '/scssphp/scssphp/src/Formatter/Crunched.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Debug' => $vendorDir . '/scssphp/scssphp/src/Formatter/Debug.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Expanded' => $vendorDir . '/scssphp/scssphp/src/Formatter/Expanded.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Nested' => $vendorDir . '/scssphp/scssphp/src/Formatter/Nested.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\OutputBlock' => $vendorDir . '/scssphp/scssphp/src/Formatter/OutputBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Logger\\LoggerInterface' => $vendorDir . '/scssphp/scssphp/src/Logger/LoggerInterface.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Logger\\QuietLogger' => $vendorDir . '/scssphp/scssphp/src/Logger/QuietLogger.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Logger\\StreamLogger' => $vendorDir . '/scssphp/scssphp/src/Logger/StreamLogger.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Node' => $vendorDir . '/scssphp/scssphp/src/Node.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Node\\Number' => $vendorDir . '/scssphp/scssphp/src/Node/Number.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\OutputStyle' => $vendorDir . '/scssphp/scssphp/src/OutputStyle.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Parser' => $vendorDir . '/scssphp/scssphp/src/Parser.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\SourceMap\\Base64' => $vendorDir . '/scssphp/scssphp/src/SourceMap/Base64.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\SourceMap\\Base64VLQ' => $vendorDir . '/scssphp/scssphp/src/SourceMap/Base64VLQ.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\SourceMap\\SourceMapGenerator' => $vendorDir . '/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Type' => $vendorDir . '/scssphp/scssphp/src/Type.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Util' => $vendorDir . '/scssphp/scssphp/src/Util.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Util\\Path' => $vendorDir . '/scssphp/scssphp/src/Util/Path.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\ValueConverter' => $vendorDir . '/scssphp/scssphp/src/ValueConverter.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Version' => $vendorDir . '/scssphp/scssphp/src/Version.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Warn' => $vendorDir . '/scssphp/scssphp/src/Warn.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\Dns' => $vendorDir . '/spatie/dns/src/Dns.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\Exceptions\\CouldNotFetchDns' => $vendorDir . '/spatie/dns/src/Exceptions/CouldNotFetchDns.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\Exceptions\\InvalidArgument' => $vendorDir . '/spatie/dns/src/Exceptions/InvalidArgument.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Macroable\\Macroable' => $vendorDir . '/spatie/macroable/src/Macroable.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Downloader' => $vendorDir . '/spatie/ssl-certificate/src/Downloader.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate' => $vendorDir . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate\\HostDoesNotExist' => $vendorDir . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/HostDoesNotExist.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate\\NoCertificateInstalled' => $vendorDir . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/NoCertificateInstalled.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate\\UnknownError' => $vendorDir . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/UnknownError.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\InvalidIpAddress' => $vendorDir . '/spatie/ssl-certificate/src/Exceptions/InvalidIpAddress.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\InvalidUrl' => $vendorDir . '/spatie/ssl-certificate/src/Exceptions/InvalidUrl.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\SslCertificate' => $vendorDir . '/spatie/ssl-certificate/src/SslCertificate.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Url' => $vendorDir . '/spatie/ssl-certificate/src/Url.php', - 'WP_Ultimo\\Dependencies\\Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Account' => $vendorDir . '/stripe/stripe-php/lib/Account.php', - 'WP_Ultimo\\Dependencies\\Stripe\\AccountLink' => $vendorDir . '/stripe/stripe-php/lib/AccountLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\All' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/All.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Create' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/Create.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Delete' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/Delete.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\NestedResource' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/NestedResource.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Request' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/Request.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Retrieve' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/Retrieve.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Search' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/Search.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\SingletonRetrieve' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Update' => $vendorDir . '/stripe/stripe-php/lib/ApiOperations/Update.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiRequestor' => $vendorDir . '/stripe/stripe-php/lib/ApiRequestor.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiResource' => $vendorDir . '/stripe/stripe-php/lib/ApiResource.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiResponse' => $vendorDir . '/stripe/stripe-php/lib/ApiResponse.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApplePayDomain' => $vendorDir . '/stripe/stripe-php/lib/ApplePayDomain.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApplicationFee' => $vendorDir . '/stripe/stripe-php/lib/ApplicationFee.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApplicationFeeRefund' => $vendorDir . '/stripe/stripe-php/lib/ApplicationFeeRefund.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Apps\\Secret' => $vendorDir . '/stripe/stripe-php/lib/Apps/Secret.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Balance' => $vendorDir . '/stripe/stripe-php/lib/Balance.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BalanceTransaction' => $vendorDir . '/stripe/stripe-php/lib/BalanceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BankAccount' => $vendorDir . '/stripe/stripe-php/lib/BankAccount.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BaseStripeClient' => $vendorDir . '/stripe/stripe-php/lib/BaseStripeClient.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BaseStripeClientInterface' => $vendorDir . '/stripe/stripe-php/lib/BaseStripeClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BillingPortal\\Configuration' => $vendorDir . '/stripe/stripe-php/lib/BillingPortal/Configuration.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BillingPortal\\Session' => $vendorDir . '/stripe/stripe-php/lib/BillingPortal/Session.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Capability' => $vendorDir . '/stripe/stripe-php/lib/Capability.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Card' => $vendorDir . '/stripe/stripe-php/lib/Card.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CashBalance' => $vendorDir . '/stripe/stripe-php/lib/CashBalance.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Charge' => $vendorDir . '/stripe/stripe-php/lib/Charge.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Checkout\\Session' => $vendorDir . '/stripe/stripe-php/lib/Checkout/Session.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Collection' => $vendorDir . '/stripe/stripe-php/lib/Collection.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CountrySpec' => $vendorDir . '/stripe/stripe-php/lib/CountrySpec.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Coupon' => $vendorDir . '/stripe/stripe-php/lib/Coupon.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CreditNote' => $vendorDir . '/stripe/stripe-php/lib/CreditNote.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CreditNoteLineItem' => $vendorDir . '/stripe/stripe-php/lib/CreditNoteLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Customer' => $vendorDir . '/stripe/stripe-php/lib/Customer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CustomerBalanceTransaction' => $vendorDir . '/stripe/stripe-php/lib/CustomerBalanceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CustomerCashBalanceTransaction' => $vendorDir . '/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Discount' => $vendorDir . '/stripe/stripe-php/lib/Discount.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Dispute' => $vendorDir . '/stripe/stripe-php/lib/Dispute.php', - 'WP_Ultimo\\Dependencies\\Stripe\\EphemeralKey' => $vendorDir . '/stripe/stripe-php/lib/EphemeralKey.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ErrorObject' => $vendorDir . '/stripe/stripe-php/lib/ErrorObject.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Event' => $vendorDir . '/stripe/stripe-php/lib/Event.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\ApiConnectionException' => $vendorDir . '/stripe/stripe-php/lib/Exception/ApiConnectionException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\ApiErrorException' => $vendorDir . '/stripe/stripe-php/lib/Exception/ApiErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\AuthenticationException' => $vendorDir . '/stripe/stripe-php/lib/Exception/AuthenticationException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\BadMethodCallException' => $vendorDir . '/stripe/stripe-php/lib/Exception/BadMethodCallException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\CardException' => $vendorDir . '/stripe/stripe-php/lib/Exception/CardException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\ExceptionInterface' => $vendorDir . '/stripe/stripe-php/lib/Exception/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\IdempotencyException' => $vendorDir . '/stripe/stripe-php/lib/Exception/IdempotencyException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\InvalidArgumentException' => $vendorDir . '/stripe/stripe-php/lib/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\InvalidRequestException' => $vendorDir . '/stripe/stripe-php/lib/Exception/InvalidRequestException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\ExceptionInterface' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidClientException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/InvalidClientException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidGrantException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/InvalidGrantException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidRequestException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/InvalidRequestException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidScopeException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/InvalidScopeException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\OAuthErrorException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/OAuthErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\UnknownOAuthErrorException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\UnsupportedGrantTypeException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\UnsupportedResponseTypeException' => $vendorDir . '/stripe/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\PermissionException' => $vendorDir . '/stripe/stripe-php/lib/Exception/PermissionException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\RateLimitException' => $vendorDir . '/stripe/stripe-php/lib/Exception/RateLimitException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\SignatureVerificationException' => $vendorDir . '/stripe/stripe-php/lib/Exception/SignatureVerificationException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\UnexpectedValueException' => $vendorDir . '/stripe/stripe-php/lib/Exception/UnexpectedValueException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\UnknownApiErrorException' => $vendorDir . '/stripe/stripe-php/lib/Exception/UnknownApiErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ExchangeRate' => $vendorDir . '/stripe/stripe-php/lib/ExchangeRate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\File' => $vendorDir . '/stripe/stripe-php/lib/File.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FileLink' => $vendorDir . '/stripe/stripe-php/lib/FileLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\Account' => $vendorDir . '/stripe/stripe-php/lib/FinancialConnections/Account.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\AccountOwner' => $vendorDir . '/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\AccountOwnership' => $vendorDir . '/stripe/stripe-php/lib/FinancialConnections/AccountOwnership.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\Session' => $vendorDir . '/stripe/stripe-php/lib/FinancialConnections/Session.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FundingInstructions' => $vendorDir . '/stripe/stripe-php/lib/FundingInstructions.php', - 'WP_Ultimo\\Dependencies\\Stripe\\HttpClient\\ClientInterface' => $vendorDir . '/stripe/stripe-php/lib/HttpClient/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\HttpClient\\CurlClient' => $vendorDir . '/stripe/stripe-php/lib/HttpClient/CurlClient.php', - 'WP_Ultimo\\Dependencies\\Stripe\\HttpClient\\StreamingClientInterface' => $vendorDir . '/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Identity\\VerificationReport' => $vendorDir . '/stripe/stripe-php/lib/Identity/VerificationReport.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Identity\\VerificationSession' => $vendorDir . '/stripe/stripe-php/lib/Identity/VerificationSession.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Invoice' => $vendorDir . '/stripe/stripe-php/lib/Invoice.php', - 'WP_Ultimo\\Dependencies\\Stripe\\InvoiceItem' => $vendorDir . '/stripe/stripe-php/lib/InvoiceItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\InvoiceLineItem' => $vendorDir . '/stripe/stripe-php/lib/InvoiceLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Authorization' => $vendorDir . '/stripe/stripe-php/lib/Issuing/Authorization.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Card' => $vendorDir . '/stripe/stripe-php/lib/Issuing/Card.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\CardDetails' => $vendorDir . '/stripe/stripe-php/lib/Issuing/CardDetails.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Cardholder' => $vendorDir . '/stripe/stripe-php/lib/Issuing/Cardholder.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Dispute' => $vendorDir . '/stripe/stripe-php/lib/Issuing/Dispute.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Transaction' => $vendorDir . '/stripe/stripe-php/lib/Issuing/Transaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\LineItem' => $vendorDir . '/stripe/stripe-php/lib/LineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\LoginLink' => $vendorDir . '/stripe/stripe-php/lib/LoginLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Mandate' => $vendorDir . '/stripe/stripe-php/lib/Mandate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\OAuth' => $vendorDir . '/stripe/stripe-php/lib/OAuth.php', - 'WP_Ultimo\\Dependencies\\Stripe\\OAuthErrorObject' => $vendorDir . '/stripe/stripe-php/lib/OAuthErrorObject.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PaymentIntent' => $vendorDir . '/stripe/stripe-php/lib/PaymentIntent.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PaymentLink' => $vendorDir . '/stripe/stripe-php/lib/PaymentLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PaymentMethod' => $vendorDir . '/stripe/stripe-php/lib/PaymentMethod.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Payout' => $vendorDir . '/stripe/stripe-php/lib/Payout.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Person' => $vendorDir . '/stripe/stripe-php/lib/Person.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Plan' => $vendorDir . '/stripe/stripe-php/lib/Plan.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Price' => $vendorDir . '/stripe/stripe-php/lib/Price.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Product' => $vendorDir . '/stripe/stripe-php/lib/Product.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PromotionCode' => $vendorDir . '/stripe/stripe-php/lib/PromotionCode.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Quote' => $vendorDir . '/stripe/stripe-php/lib/Quote.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Radar\\EarlyFraudWarning' => $vendorDir . '/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Radar\\ValueList' => $vendorDir . '/stripe/stripe-php/lib/Radar/ValueList.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Radar\\ValueListItem' => $vendorDir . '/stripe/stripe-php/lib/Radar/ValueListItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\RecipientTransfer' => $vendorDir . '/stripe/stripe-php/lib/RecipientTransfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Refund' => $vendorDir . '/stripe/stripe-php/lib/Refund.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Reporting\\ReportRun' => $vendorDir . '/stripe/stripe-php/lib/Reporting/ReportRun.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Reporting\\ReportType' => $vendorDir . '/stripe/stripe-php/lib/Reporting/ReportType.php', - 'WP_Ultimo\\Dependencies\\Stripe\\RequestTelemetry' => $vendorDir . '/stripe/stripe-php/lib/RequestTelemetry.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Review' => $vendorDir . '/stripe/stripe-php/lib/Review.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SearchResult' => $vendorDir . '/stripe/stripe-php/lib/SearchResult.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AbstractService' => $vendorDir . '/stripe/stripe-php/lib/Service/AbstractService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AbstractServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/AbstractServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AccountLinkService' => $vendorDir . '/stripe/stripe-php/lib/Service/AccountLinkService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AccountService' => $vendorDir . '/stripe/stripe-php/lib/Service/AccountService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ApplePayDomainService' => $vendorDir . '/stripe/stripe-php/lib/Service/ApplePayDomainService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ApplicationFeeService' => $vendorDir . '/stripe/stripe-php/lib/Service/ApplicationFeeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Apps\\AppsServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Apps\\SecretService' => $vendorDir . '/stripe/stripe-php/lib/Service/Apps/SecretService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BalanceService' => $vendorDir . '/stripe/stripe-php/lib/Service/BalanceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BalanceTransactionService' => $vendorDir . '/stripe/stripe-php/lib/Service/BalanceTransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BillingPortal\\BillingPortalServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BillingPortal\\ConfigurationService' => $vendorDir . '/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BillingPortal\\SessionService' => $vendorDir . '/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ChargeService' => $vendorDir . '/stripe/stripe-php/lib/Service/ChargeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Checkout\\CheckoutServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Checkout\\SessionService' => $vendorDir . '/stripe/stripe-php/lib/Service/Checkout/SessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CoreServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/CoreServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CountrySpecService' => $vendorDir . '/stripe/stripe-php/lib/Service/CountrySpecService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CouponService' => $vendorDir . '/stripe/stripe-php/lib/Service/CouponService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CreditNoteService' => $vendorDir . '/stripe/stripe-php/lib/Service/CreditNoteService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CustomerService' => $vendorDir . '/stripe/stripe-php/lib/Service/CustomerService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\DisputeService' => $vendorDir . '/stripe/stripe-php/lib/Service/DisputeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\EphemeralKeyService' => $vendorDir . '/stripe/stripe-php/lib/Service/EphemeralKeyService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\EventService' => $vendorDir . '/stripe/stripe-php/lib/Service/EventService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ExchangeRateService' => $vendorDir . '/stripe/stripe-php/lib/Service/ExchangeRateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FileLinkService' => $vendorDir . '/stripe/stripe-php/lib/Service/FileLinkService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FileService' => $vendorDir . '/stripe/stripe-php/lib/Service/FileService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FinancialConnections\\AccountService' => $vendorDir . '/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FinancialConnections\\FinancialConnectionsServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FinancialConnections\\SessionService' => $vendorDir . '/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Identity\\IdentityServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Identity\\VerificationReportService' => $vendorDir . '/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Identity\\VerificationSessionService' => $vendorDir . '/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\InvoiceItemService' => $vendorDir . '/stripe/stripe-php/lib/Service/InvoiceItemService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\InvoiceService' => $vendorDir . '/stripe/stripe-php/lib/Service/InvoiceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\AuthorizationService' => $vendorDir . '/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\CardService' => $vendorDir . '/stripe/stripe-php/lib/Service/Issuing/CardService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\CardholderService' => $vendorDir . '/stripe/stripe-php/lib/Service/Issuing/CardholderService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\DisputeService' => $vendorDir . '/stripe/stripe-php/lib/Service/Issuing/DisputeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\IssuingServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\TransactionService' => $vendorDir . '/stripe/stripe-php/lib/Service/Issuing/TransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\MandateService' => $vendorDir . '/stripe/stripe-php/lib/Service/MandateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\OAuthService' => $vendorDir . '/stripe/stripe-php/lib/Service/OAuthService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PaymentIntentService' => $vendorDir . '/stripe/stripe-php/lib/Service/PaymentIntentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PaymentLinkService' => $vendorDir . '/stripe/stripe-php/lib/Service/PaymentLinkService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PaymentMethodService' => $vendorDir . '/stripe/stripe-php/lib/Service/PaymentMethodService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PayoutService' => $vendorDir . '/stripe/stripe-php/lib/Service/PayoutService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PlanService' => $vendorDir . '/stripe/stripe-php/lib/Service/PlanService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PriceService' => $vendorDir . '/stripe/stripe-php/lib/Service/PriceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ProductService' => $vendorDir . '/stripe/stripe-php/lib/Service/ProductService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PromotionCodeService' => $vendorDir . '/stripe/stripe-php/lib/Service/PromotionCodeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\QuoteService' => $vendorDir . '/stripe/stripe-php/lib/Service/QuoteService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\EarlyFraudWarningService' => $vendorDir . '/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\RadarServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\ValueListItemService' => $vendorDir . '/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\ValueListService' => $vendorDir . '/stripe/stripe-php/lib/Service/Radar/ValueListService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\RefundService' => $vendorDir . '/stripe/stripe-php/lib/Service/RefundService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Reporting\\ReportRunService' => $vendorDir . '/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Reporting\\ReportTypeService' => $vendorDir . '/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Reporting\\ReportingServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ReviewService' => $vendorDir . '/stripe/stripe-php/lib/Service/ReviewService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SetupAttemptService' => $vendorDir . '/stripe/stripe-php/lib/Service/SetupAttemptService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SetupIntentService' => $vendorDir . '/stripe/stripe-php/lib/Service/SetupIntentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ShippingRateService' => $vendorDir . '/stripe/stripe-php/lib/Service/ShippingRateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Sigma\\ScheduledQueryRunService' => $vendorDir . '/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Sigma\\SigmaServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SourceService' => $vendorDir . '/stripe/stripe-php/lib/Service/SourceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SubscriptionItemService' => $vendorDir . '/stripe/stripe-php/lib/Service/SubscriptionItemService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SubscriptionScheduleService' => $vendorDir . '/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SubscriptionService' => $vendorDir . '/stripe/stripe-php/lib/Service/SubscriptionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TaxCodeService' => $vendorDir . '/stripe/stripe-php/lib/Service/TaxCodeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TaxRateService' => $vendorDir . '/stripe/stripe-php/lib/Service/TaxRateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\CalculationService' => $vendorDir . '/stripe/stripe-php/lib/Service/Tax/CalculationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\SettingsService' => $vendorDir . '/stripe/stripe-php/lib/Service/Tax/SettingsService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\TaxServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\TransactionService' => $vendorDir . '/stripe/stripe-php/lib/Service/Tax/TransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\ConfigurationService' => $vendorDir . '/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\ConnectionTokenService' => $vendorDir . '/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\LocationService' => $vendorDir . '/stripe/stripe-php/lib/Service/Terminal/LocationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\ReaderService' => $vendorDir . '/stripe/stripe-php/lib/Service/Terminal/ReaderService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\TerminalServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\CustomerService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Issuing\\CardService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Issuing\\IssuingServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\RefundService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Terminal\\ReaderService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Terminal\\TerminalServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\TestClockService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\TestHelpersServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\InboundTransferService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\OutboundPaymentService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\OutboundTransferService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\ReceivedCreditService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\ReceivedDebitService' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\TreasuryServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TokenService' => $vendorDir . '/stripe/stripe-php/lib/Service/TokenService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TopupService' => $vendorDir . '/stripe/stripe-php/lib/Service/TopupService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TransferService' => $vendorDir . '/stripe/stripe-php/lib/Service/TransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\CreditReversalService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\DebitReversalService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\FinancialAccountService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\InboundTransferService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\OutboundPaymentService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\OutboundTransferService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\ReceivedCreditService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\ReceivedDebitService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\TransactionEntryService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\TransactionService' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/TransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\TreasuryServiceFactory' => $vendorDir . '/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\WebhookEndpointService' => $vendorDir . '/stripe/stripe-php/lib/Service/WebhookEndpointService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SetupAttempt' => $vendorDir . '/stripe/stripe-php/lib/SetupAttempt.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SetupIntent' => $vendorDir . '/stripe/stripe-php/lib/SetupIntent.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ShippingRate' => $vendorDir . '/stripe/stripe-php/lib/ShippingRate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Sigma\\ScheduledQueryRun' => $vendorDir . '/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SingletonApiResource' => $vendorDir . '/stripe/stripe-php/lib/SingletonApiResource.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Source' => $vendorDir . '/stripe/stripe-php/lib/Source.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SourceTransaction' => $vendorDir . '/stripe/stripe-php/lib/SourceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Stripe' => $vendorDir . '/stripe/stripe-php/lib/Stripe.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeClient' => $vendorDir . '/stripe/stripe-php/lib/StripeClient.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeClientInterface' => $vendorDir . '/stripe/stripe-php/lib/StripeClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeObject' => $vendorDir . '/stripe/stripe-php/lib/StripeObject.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeStreamingClientInterface' => $vendorDir . '/stripe/stripe-php/lib/StripeStreamingClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Subscription' => $vendorDir . '/stripe/stripe-php/lib/Subscription.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SubscriptionItem' => $vendorDir . '/stripe/stripe-php/lib/SubscriptionItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SubscriptionSchedule' => $vendorDir . '/stripe/stripe-php/lib/SubscriptionSchedule.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TaxCode' => $vendorDir . '/stripe/stripe-php/lib/TaxCode.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TaxId' => $vendorDir . '/stripe/stripe-php/lib/TaxId.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TaxRate' => $vendorDir . '/stripe/stripe-php/lib/TaxRate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\Calculation' => $vendorDir . '/stripe/stripe-php/lib/Tax/Calculation.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\CalculationLineItem' => $vendorDir . '/stripe/stripe-php/lib/Tax/CalculationLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\Settings' => $vendorDir . '/stripe/stripe-php/lib/Tax/Settings.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\Transaction' => $vendorDir . '/stripe/stripe-php/lib/Tax/Transaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\TransactionLineItem' => $vendorDir . '/stripe/stripe-php/lib/Tax/TransactionLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\Configuration' => $vendorDir . '/stripe/stripe-php/lib/Terminal/Configuration.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\ConnectionToken' => $vendorDir . '/stripe/stripe-php/lib/Terminal/ConnectionToken.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\Location' => $vendorDir . '/stripe/stripe-php/lib/Terminal/Location.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\Reader' => $vendorDir . '/stripe/stripe-php/lib/Terminal/Reader.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TestHelpers\\TestClock' => $vendorDir . '/stripe/stripe-php/lib/TestHelpers/TestClock.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Token' => $vendorDir . '/stripe/stripe-php/lib/Token.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Topup' => $vendorDir . '/stripe/stripe-php/lib/Topup.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Transfer' => $vendorDir . '/stripe/stripe-php/lib/Transfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TransferReversal' => $vendorDir . '/stripe/stripe-php/lib/TransferReversal.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\CreditReversal' => $vendorDir . '/stripe/stripe-php/lib/Treasury/CreditReversal.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\DebitReversal' => $vendorDir . '/stripe/stripe-php/lib/Treasury/DebitReversal.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\FinancialAccount' => $vendorDir . '/stripe/stripe-php/lib/Treasury/FinancialAccount.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\FinancialAccountFeatures' => $vendorDir . '/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\InboundTransfer' => $vendorDir . '/stripe/stripe-php/lib/Treasury/InboundTransfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\OutboundPayment' => $vendorDir . '/stripe/stripe-php/lib/Treasury/OutboundPayment.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\OutboundTransfer' => $vendorDir . '/stripe/stripe-php/lib/Treasury/OutboundTransfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\ReceivedCredit' => $vendorDir . '/stripe/stripe-php/lib/Treasury/ReceivedCredit.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\ReceivedDebit' => $vendorDir . '/stripe/stripe-php/lib/Treasury/ReceivedDebit.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\Transaction' => $vendorDir . '/stripe/stripe-php/lib/Treasury/Transaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\TransactionEntry' => $vendorDir . '/stripe/stripe-php/lib/Treasury/TransactionEntry.php', - 'WP_Ultimo\\Dependencies\\Stripe\\UsageRecord' => $vendorDir . '/stripe/stripe-php/lib/UsageRecord.php', - 'WP_Ultimo\\Dependencies\\Stripe\\UsageRecordSummary' => $vendorDir . '/stripe/stripe-php/lib/UsageRecordSummary.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\ApiVersion' => $vendorDir . '/stripe/stripe-php/lib/Util/ApiVersion.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\CaseInsensitiveArray' => $vendorDir . '/stripe/stripe-php/lib/Util/CaseInsensitiveArray.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\DefaultLogger' => $vendorDir . '/stripe/stripe-php/lib/Util/DefaultLogger.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\LoggerInterface' => $vendorDir . '/stripe/stripe-php/lib/Util/LoggerInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\ObjectTypes' => $vendorDir . '/stripe/stripe-php/lib/Util/ObjectTypes.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\RandomGenerator' => $vendorDir . '/stripe/stripe-php/lib/Util/RandomGenerator.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\RequestOptions' => $vendorDir . '/stripe/stripe-php/lib/Util/RequestOptions.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\Set' => $vendorDir . '/stripe/stripe-php/lib/Util/Set.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\Util' => $vendorDir . '/stripe/stripe-php/lib/Util/Util.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Webhook' => $vendorDir . '/stripe/stripe-php/lib/Webhook.php', - 'WP_Ultimo\\Dependencies\\Stripe\\WebhookEndpoint' => $vendorDir . '/stripe/stripe-php/lib/WebhookEndpoint.php', - 'WP_Ultimo\\Dependencies\\Stripe\\WebhookSignature' => $vendorDir . '/stripe/stripe-php/lib/WebhookSignature.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => $vendorDir . '/symfony/cache/Adapter/ApcuAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/ArrayAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineDbalAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => $vendorDir . '/symfony/cache/Adapter/MemcachedAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\NullAdapter' => $vendorDir . '/symfony/cache/Adapter/NullAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => $vendorDir . '/symfony/cache/Adapter/ParameterNormalizer.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => $vendorDir . '/symfony/cache/Adapter/PdoAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpArrayAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpFilesAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => $vendorDir . '/symfony/cache/Adapter/ProxyAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => $vendorDir . '/symfony/cache/Adapter/Psr16Adapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => $vendorDir . '/symfony/cache/DependencyInjection/CacheCollectorPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DoctrineProvider' => $vendorDir . '/symfony/cache/DoctrineProvider.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Exception\\LogicException' => $vendorDir . '/symfony/cache/Exception/LogicException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\LockRegistry' => $vendorDir . '/symfony/cache/LockRegistry.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DefaultMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DeflateMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => $vendorDir . '/symfony/cache/Marshaller/MarshallerInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => $vendorDir . '/symfony/cache/Marshaller/SodiumMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => $vendorDir . '/symfony/cache/Marshaller/TagAwareMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationHandler.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationMessage.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\PruneableInterface' => $vendorDir . '/symfony/cache/PruneableInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Psr16Cache' => $vendorDir . '/symfony/cache/Psr16Cache.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\ResettableInterface' => $vendorDir . '/symfony/cache/ResettableInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => $vendorDir . '/symfony/cache/Traits/AbstractAdapterTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\ContractsTrait' => $vendorDir . '/symfony/cache/Traits/ContractsTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemCommonTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\ProxyTrait' => $vendorDir . '/symfony/cache/Traits/ProxyTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterNodeProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisProxy' => $vendorDir . '/symfony/cache/Traits/RedisProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => $vendorDir . '/symfony/event-dispatcher/Attribute/AsEventListener.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => $vendorDir . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/var-exporter/Exception/ClassNotFoundException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/var-exporter/Exception/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\LogicException' => $vendorDir . '/symfony/var-exporter/Exception/LogicException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => $vendorDir . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Hydrator' => $vendorDir . '/symfony/var-exporter/Hydrator.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Instantiator' => $vendorDir . '/symfony/var-exporter/Instantiator.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Exporter' => $vendorDir . '/symfony/var-exporter/Internal/Exporter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Hydrator' => $vendorDir . '/symfony/var-exporter/Internal/Hydrator.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectRegistry.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectState.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Reference' => $vendorDir . '/symfony/var-exporter/Internal/Reference.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\LazyGhostTrait' => $vendorDir . '/symfony/var-exporter/LazyGhostTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\LazyObjectInterface' => $vendorDir . '/symfony/var-exporter/LazyObjectInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\LazyProxyTrait' => $vendorDir . '/symfony/var-exporter/LazyProxyTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\ProxyHelper' => $vendorDir . '/symfony/var-exporter/ProxyHelper.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\ItemInterface' => $vendorDir . '/symfony/cache-contracts/ItemInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => $vendorDir . '/symfony/cache-contracts/TagAwareCacheInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher-contracts/Event.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/translation-contracts/TranslatableInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php', - 'WP_Ultimo\\Dependencies\\UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'WP_Ultimo\\Dependencies\\ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Exception\\PcreException' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoType' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoType.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShape' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShapeItem' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\ConstExpression' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\FloatValue' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerValue' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyList' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\StringValue' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\AggregatedType' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\ArrayKey' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\CallableParameter' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/CallableParameter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Expression' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Expression.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\InterfaceString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Intersection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Intersection.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Never_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Never_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Utils' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Utils.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdfTpl' => $vendorDir . '/setasign/fpdi/src/FpdfTpl.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdfTplTrait' => $vendorDir . '/setasign/fpdi/src/FpdfTplTrait.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdfTrait' => $vendorDir . '/setasign/fpdi/src/FpdfTrait.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Fpdi.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdiException' => $vendorDir . '/setasign/fpdi/src/FpdiException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdiTrait' => $vendorDir . '/setasign/fpdi/src/FpdiTrait.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\GraphicsState' => $vendorDir . '/setasign/fpdi/src/GraphicsState.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Math\\Matrix' => $vendorDir . '/setasign/fpdi/src/Math/Matrix.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Math\\Vector' => $vendorDir . '/setasign/fpdi/src/Math/Vector.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\AbstractReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReference' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReferenceException' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\FixedReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\LineReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\ReaderInterface' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Ascii85.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85Exception' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\AsciiHex' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\FilterException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FilterException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\FilterInterface' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Flate' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Flate.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\FlateException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FlateException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Lzw' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Lzw.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\LzwException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/LzwException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\PdfParser' => $vendorDir . '/setasign/fpdi/src/PdfParser/PdfParser.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\PdfParserException' => $vendorDir . '/setasign/fpdi/src/PdfParser/PdfParserException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\StreamReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/StreamReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Tokenizer' => $vendorDir . '/setasign/fpdi/src/PdfParser/Tokenizer.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfArray' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfArray.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfBoolean' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfDictionary' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfHexString' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfHexString.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObject' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObjectReference' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfName' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfName.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfNull' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfNull.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfNumeric' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfStream' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfStream.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfString' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfString.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfToken' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfToken.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfType' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfType.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfTypeException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\DataStructure\\Rectangle' => $vendorDir . '/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\Page' => $vendorDir . '/setasign/fpdi/src/PdfReader/Page.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\PageBoundaries' => $vendorDir . '/setasign/fpdi/src/PdfReader/PageBoundaries.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\PdfReader' => $vendorDir . '/setasign/fpdi/src/PdfReader/PdfReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\PdfReaderException' => $vendorDir . '/setasign/fpdi/src/PdfReader/PdfReaderException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\TcpdfFpdi' => $vendorDir . '/setasign/fpdi/src/TcpdfFpdi.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Tcpdf\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Tcpdf/Fpdi.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Tfpdf\\FpdfTpl' => $vendorDir . '/setasign/fpdi/src/Tfpdf/FpdfTpl.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Tfpdf\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Tfpdf/Fpdi.php', - 'WP_Ultimo\\Models\\Traits\\Billable' => $baseDir . '/inc/models/traits/trait-billable.php', - 'WP_Ultimo\\Models\\Traits\\Limitable' => $baseDir . '/inc/models/traits/trait-limitable.php', - 'WP_Ultimo\\Models\\Traits\\Notable' => $baseDir . '/inc/models/traits/trait-notable.php', - 'WP_Ultimo\\Traits\\Singleton' => $baseDir . '/inc/traits/trait-singleton.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Coupon_Deprecated' => $baseDir . '/inc/traits/trait-wp-ultimo-coupon-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Deprecated' => $baseDir . '/inc/traits/trait-wp-ultimo-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Plan_Deprecated' => $baseDir . '/inc/traits/trait-wp-ultimo-plan-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Settings_Deprecated' => $baseDir . '/inc/traits/trait-wp-ultimo-settings-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Site_Deprecated' => $baseDir . '/inc/traits/trait-wp-ultimo-site-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Subscription_Deprecated' => $baseDir . '/inc/traits/trait-wp-ultimo-subscription-deprecated.php', - 'bcmath_compat\\BCMath' => $vendorDir . '/phpseclib/bcmath_compat/src/BCMath.php', - 'phpseclib3\\Common\\Functions\\Strings' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php', - 'phpseclib3\\Crypt\\AES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php', - 'phpseclib3\\Crypt\\Blowfish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php', - 'phpseclib3\\Crypt\\ChaCha20' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php', - 'phpseclib3\\Crypt\\Common\\AsymmetricKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php', - 'phpseclib3\\Crypt\\Common\\BlockCipher' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\JWK' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Signature\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php', - 'phpseclib3\\Crypt\\Common\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php', - 'phpseclib3\\Crypt\\Common\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php', - 'phpseclib3\\Crypt\\Common\\StreamCipher' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php', - 'phpseclib3\\Crypt\\Common\\SymmetricKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php', - 'phpseclib3\\Crypt\\Common\\Traits\\Fingerprint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php', - 'phpseclib3\\Crypt\\Common\\Traits\\PasswordProtected' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php', - 'phpseclib3\\Crypt\\DES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DES.php', - 'phpseclib3\\Crypt\\DH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH.php', - 'phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\DH\\Parameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php', - 'phpseclib3\\Crypt\\DH\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php', - 'phpseclib3\\Crypt\\DH\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php', - 'phpseclib3\\Crypt\\DSA' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\XML' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Signature\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Signature\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Signature\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php', - 'phpseclib3\\Crypt\\DSA\\Parameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php', - 'phpseclib3\\Crypt\\DSA\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php', - 'phpseclib3\\Crypt\\DSA\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php', - 'phpseclib3\\Crypt\\EC' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Binary' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\KoblitzPrime' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Montgomery' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Prime' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\TwistedEdwards' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Curve25519' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Curve448' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Ed25519' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Ed448' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistb233' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistb409' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk163' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk233' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk283' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk409' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp192' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp224' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp256' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp384' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp521' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistt571' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime192v1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime192v2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime192v3' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime239v1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime239v2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime239v3' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime256v1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp112r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp112r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp128r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp128r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp160k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp160r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp160r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp192k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp192r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp224k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp224r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp256k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp256r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp384r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp521r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect113r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect113r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect131r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect131r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect163k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect163r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect163r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect193r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect193r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect233k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect233r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect239k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect283k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect283r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect409k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect409r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect571k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect571r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\Common' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\JWK' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPrivate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPublic' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\XML' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\libsodium' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Signature\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Signature\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Signature\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php', - 'phpseclib3\\Crypt\\EC\\Parameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php', - 'phpseclib3\\Crypt\\EC\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php', - 'phpseclib3\\Crypt\\EC\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php', - 'phpseclib3\\Crypt\\Hash' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Hash.php', - 'phpseclib3\\Crypt\\PublicKeyLoader' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php', - 'phpseclib3\\Crypt\\RC2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RC2.php', - 'phpseclib3\\Crypt\\RC4' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RC4.php', - 'phpseclib3\\Crypt\\RSA' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\JWK' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\MSBLOB' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PSS' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\XML' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php', - 'phpseclib3\\Crypt\\RSA\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php', - 'phpseclib3\\Crypt\\RSA\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php', - 'phpseclib3\\Crypt\\Random' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php', - 'phpseclib3\\Crypt\\Rijndael' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php', - 'phpseclib3\\Crypt\\Salsa20' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php', - 'phpseclib3\\Crypt\\TripleDES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php', - 'phpseclib3\\Crypt\\Twofish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php', - 'phpseclib3\\Exception\\BadConfigurationException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php', - 'phpseclib3\\Exception\\BadDecryptionException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php', - 'phpseclib3\\Exception\\BadModeException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php', - 'phpseclib3\\Exception\\ConnectionClosedException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php', - 'phpseclib3\\Exception\\FileNotFoundException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php', - 'phpseclib3\\Exception\\InconsistentSetupException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php', - 'phpseclib3\\Exception\\InsufficientSetupException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php', - 'phpseclib3\\Exception\\NoKeyLoadedException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php', - 'phpseclib3\\Exception\\NoSupportedAlgorithmsException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php', - 'phpseclib3\\Exception\\UnableToConnectException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php', - 'phpseclib3\\Exception\\UnsupportedAlgorithmException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php', - 'phpseclib3\\Exception\\UnsupportedCurveException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php', - 'phpseclib3\\Exception\\UnsupportedFormatException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php', - 'phpseclib3\\Exception\\UnsupportedOperationException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php', - 'phpseclib3\\File\\ANSI' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ANSI.php', - 'phpseclib3\\File\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1.php', - 'phpseclib3\\File\\ASN1\\Element' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php', - 'phpseclib3\\File\\ASN1\\Maps\\AccessDescription' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php', - 'phpseclib3\\File\\ASN1\\Maps\\AdministrationDomainName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php', - 'phpseclib3\\File\\ASN1\\Maps\\AlgorithmIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\AnotherName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php', - 'phpseclib3\\File\\ASN1\\Maps\\Attribute' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php', - 'phpseclib3\\File\\ASN1\\Maps\\AttributeType' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php', - 'phpseclib3\\File\\ASN1\\Maps\\AttributeTypeAndValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\AttributeValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\Attributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\AuthorityInfoAccessSyntax' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php', - 'phpseclib3\\File\\ASN1\\Maps\\AuthorityKeyIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\BaseDistance' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php', - 'phpseclib3\\File\\ASN1\\Maps\\BasicConstraints' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php', - 'phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttribute' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php', - 'phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\BuiltInStandardAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\CPSuri' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php', - 'phpseclib3\\File\\ASN1\\Maps\\CRLDistributionPoints' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php', - 'phpseclib3\\File\\ASN1\\Maps\\CRLNumber' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php', - 'phpseclib3\\File\\ASN1\\Maps\\CRLReason' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertPolicyId' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php', - 'phpseclib3\\File\\ASN1\\Maps\\Certificate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificateIssuer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificateList' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificatePolicies' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificateSerialNumber' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificationRequest' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificationRequestInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\Characteristic_two' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php', - 'phpseclib3\\File\\ASN1\\Maps\\CountryName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php', - 'phpseclib3\\File\\ASN1\\Maps\\Curve' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php', - 'phpseclib3\\File\\ASN1\\Maps\\DHParameter' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php', - 'phpseclib3\\File\\ASN1\\Maps\\DSAParams' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php', - 'phpseclib3\\File\\ASN1\\Maps\\DSAPrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\DSAPublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\DigestInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\DirectoryString' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php', - 'phpseclib3\\File\\ASN1\\Maps\\DisplayText' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php', - 'phpseclib3\\File\\ASN1\\Maps\\DistributionPoint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php', - 'phpseclib3\\File\\ASN1\\Maps\\DistributionPointName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php', - 'phpseclib3\\File\\ASN1\\Maps\\DssSigValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\ECParameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php', - 'phpseclib3\\File\\ASN1\\Maps\\ECPoint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php', - 'phpseclib3\\File\\ASN1\\Maps\\ECPrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\EDIPartyName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php', - 'phpseclib3\\File\\ASN1\\Maps\\EcdsaSigValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\EncryptedData' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php', - 'phpseclib3\\File\\ASN1\\Maps\\EncryptedPrivateKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\ExtKeyUsageSyntax' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php', - 'phpseclib3\\File\\ASN1\\Maps\\Extension' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php', - 'phpseclib3\\File\\ASN1\\Maps\\ExtensionAttribute' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php', - 'phpseclib3\\File\\ASN1\\Maps\\ExtensionAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\Extensions' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php', - 'phpseclib3\\File\\ASN1\\Maps\\FieldElement' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php', - 'phpseclib3\\File\\ASN1\\Maps\\FieldID' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralNames' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralSubtree' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralSubtrees' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php', - 'phpseclib3\\File\\ASN1\\Maps\\HashAlgorithm' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php', - 'phpseclib3\\File\\ASN1\\Maps\\HoldInstructionCode' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php', - 'phpseclib3\\File\\ASN1\\Maps\\InvalidityDate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php', - 'phpseclib3\\File\\ASN1\\Maps\\IssuerAltName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php', - 'phpseclib3\\File\\ASN1\\Maps\\IssuingDistributionPoint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php', - 'phpseclib3\\File\\ASN1\\Maps\\KeyIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\KeyPurposeId' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php', - 'phpseclib3\\File\\ASN1\\Maps\\KeyUsage' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php', - 'phpseclib3\\File\\ASN1\\Maps\\MaskGenAlgorithm' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php', - 'phpseclib3\\File\\ASN1\\Maps\\Name' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php', - 'phpseclib3\\File\\ASN1\\Maps\\NameConstraints' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php', - 'phpseclib3\\File\\ASN1\\Maps\\NetworkAddress' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php', - 'phpseclib3\\File\\ASN1\\Maps\\NoticeReference' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php', - 'phpseclib3\\File\\ASN1\\Maps\\NumericUserIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\ORAddress' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php', - 'phpseclib3\\File\\ASN1\\Maps\\OneAsymmetricKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\OrganizationName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php', - 'phpseclib3\\File\\ASN1\\Maps\\OrganizationalUnitNames' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php', - 'phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfos' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBEParameter' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBES2params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBKDF2params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBMAC1params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php', - 'phpseclib3\\File\\ASN1\\Maps\\PKCS9String' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php', - 'phpseclib3\\File\\ASN1\\Maps\\Pentanomial' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php', - 'phpseclib3\\File\\ASN1\\Maps\\PersonalName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyInformation' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyMappings' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierId' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\PostalAddress' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php', - 'phpseclib3\\File\\ASN1\\Maps\\Prime_p' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateDomainName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateKeyUsagePeriod' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php', - 'phpseclib3\\File\\ASN1\\Maps\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\PublicKeyAndChallenge' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php', - 'phpseclib3\\File\\ASN1\\Maps\\PublicKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\RC2CBCParameter' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php', - 'phpseclib3\\File\\ASN1\\Maps\\RDNSequence' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php', - 'phpseclib3\\File\\ASN1\\Maps\\RSAPrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\RSAPublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\RSASSA_PSS_params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php', - 'phpseclib3\\File\\ASN1\\Maps\\ReasonFlags' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php', - 'phpseclib3\\File\\ASN1\\Maps\\RelativeDistinguishedName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php', - 'phpseclib3\\File\\ASN1\\Maps\\RevokedCertificate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php', - 'phpseclib3\\File\\ASN1\\Maps\\SignedPublicKeyAndChallenge' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php', - 'phpseclib3\\File\\ASN1\\Maps\\SpecifiedECDomain' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectAltName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectDirectoryAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectInfoAccessSyntax' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectPublicKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\TBSCertList' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php', - 'phpseclib3\\File\\ASN1\\Maps\\TBSCertificate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php', - 'phpseclib3\\File\\ASN1\\Maps\\TerminalIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\Time' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php', - 'phpseclib3\\File\\ASN1\\Maps\\Trinomial' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php', - 'phpseclib3\\File\\ASN1\\Maps\\UniqueIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\UserNotice' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php', - 'phpseclib3\\File\\ASN1\\Maps\\Validity' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php', - 'phpseclib3\\File\\ASN1\\Maps\\netscape_ca_policy_url' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php', - 'phpseclib3\\File\\ASN1\\Maps\\netscape_cert_type' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php', - 'phpseclib3\\File\\ASN1\\Maps\\netscape_comment' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php', - 'phpseclib3\\File\\X509' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/X509.php', - 'phpseclib3\\Math\\BigInteger' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\BuiltIn' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\DefaultEngine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\OpenSSL' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\Barrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\EvalBarrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\Engine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\GMP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\GMP\\DefaultEngine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\OpenSSL' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP32' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP64' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\DefaultEngine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Montgomery' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\OpenSSL' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Barrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Classic' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\EvalBarrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Montgomery' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\MontgomeryMult' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\PowerOfTwo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php', - 'phpseclib3\\Math\\BinaryField' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BinaryField.php', - 'phpseclib3\\Math\\BinaryField\\Integer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php', - 'phpseclib3\\Math\\Common\\FiniteField' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php', - 'phpseclib3\\Math\\Common\\FiniteField\\Integer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php', - 'phpseclib3\\Math\\PrimeField' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/PrimeField.php', - 'phpseclib3\\Math\\PrimeField\\Integer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php', - 'phpseclib3\\Net\\SFTP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SFTP.php', - 'phpseclib3\\Net\\SFTP\\Stream' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php', - 'phpseclib3\\Net\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php', - 'phpseclib3\\System\\SSH\\Agent' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php', - 'phpseclib3\\System\\SSH\\Agent\\Identity' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php', - 'phpseclib3\\System\\SSH\\Common\\Traits\\ReadBytes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php', -); diff --git a/dependencies/composer/autoload_files.php b/dependencies/composer/autoload_files.php deleted file mode 100644 index 23ef1d1..0000000 --- a/dependencies/composer/autoload_files.php +++ /dev/null @@ -1,38 +0,0 @@ - $vendorDir . '/amphp/amp/lib/functions.php', - '76cd0796156622033397994f25b0d8fc' => $vendorDir . '/amphp/amp/lib/Internal/functions.php', - '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => $vendorDir . '/amphp/byte-stream/lib/functions.php', - '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - 'bcb7d4fc55f4b1a7e10f5806723e9892' => $vendorDir . '/amphp/sync/src/functions.php', - 'e187e371b30897d6dc51cac6a8c94ff6' => $vendorDir . '/amphp/sync/src/ConcurrentIterator/functions.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '8dc56fe697ca93c4b40d876df1c94584' => $vendorDir . '/amphp/process/lib/functions.php', - '3da389f428d8ee50333e4391c3f45046' => $vendorDir . '/amphp/serialization/src/functions.php', - '445532134d762b3cbc25500cac266092' => $vendorDir . '/daverandom/libdns/src/functions.php', - 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', - '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', - '7ebf029ad4b246f1e3f66192b40a932f' => $vendorDir . '/amphp/dns/lib/functions.php', - 'e1e8b49c332434256b5df11b0f0c2a62' => $vendorDir . '/league/uri-parser/src/functions_include.php', - 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', - '3d8ee50db78074a9235f0c2008c26b42' => $vendorDir . '/amphp/http/src/functions.php', - 'd4e415514e4352172d58f02433fa50e4' => $vendorDir . '/amphp/socket/src/functions.php', - '1c2dcb9d6851a7abaae89f9586ddd460' => $vendorDir . '/amphp/socket/src/Internal/functions.php', - '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', - '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', - 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', - '77e5a577434e31d19d8dd6aeceac1ff4' => $vendorDir . '/amphp/http-client/src/Internal/functions.php', - 'db356362850385d08a5381de2638b5fd' => $vendorDir . '/mpdf/mpdf/src/functions.php', - '56823cacd97af379eceaf82ad00b928f' => $vendorDir . '/phpseclib/bcmath_compat/lib/bcmath.php', - '6576cecdc0cf89139d7b600c9ffaa124' => $vendorDir . '/spatie/ssl-certificate/src/helpers.php', - '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', - '49a1299791c25c6fd83542c6fedacddd' => $vendorDir . '/yahnis-elsts/plugin-update-checker/load-v4p11.php', -); diff --git a/dependencies/composer/autoload_namespaces.php b/dependencies/composer/autoload_namespaces.php deleted file mode 100644 index 15a2ff3..0000000 --- a/dependencies/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/phpseclib/phpseclib/phpseclib'), - 'bcmath_compat\\' => array($vendorDir . '/phpseclib/bcmath_compat/src'), - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\' => array($vendorDir . '/setasign/fpdi/src'), - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), - 'WP_Ultimo\\Dependencies\\Ultimo\\Next\\' => array($baseDir . '/src/next'), - 'WP_Ultimo\\Dependencies\\Ultimo\\' => array($baseDir . '/app'), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'), - 'WP_Ultimo\\Dependencies\\Stripe\\' => array($vendorDir . '/stripe/stripe-php/lib'), - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\' => array($vendorDir . '/spatie/ssl-certificate/src'), - 'WP_Ultimo\\Dependencies\\Spatie\\Macroable\\' => array($vendorDir . '/spatie/macroable/src'), - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\' => array($vendorDir . '/spatie/dns/src'), - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'), - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\' => array($vendorDir . '/remotelyliving/php-dns/src'), - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\' => array($vendorDir . '/rakit/validation/src'), - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'WP_Ultimo\\Dependencies\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), - 'WP_Ultimo\\Dependencies\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'WP_Ultimo\\Dependencies\\Psr\\Clock\\' => array($vendorDir . '/psr/clock/src'), - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'), - 'WP_Ultimo\\Dependencies\\Pablo_Pacheco\\WP_Namespace_Autoloader\\' => array($vendorDir . '/pablo-sg-pacheco/wp-namespace-autoloader/src'), - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\' => array($vendorDir . '/nyholm/psr7/src'), - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\' => array($vendorDir . '/mpdf/psr-log-aware-trait/src'), - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\' => array($vendorDir . '/mpdf/psr-http-message-shim/src'), - 'WP_Ultimo\\Dependencies\\Mpdf\\' => array($vendorDir . '/mpdf/mpdf/src'), - 'WP_Ultimo\\Dependencies\\LibDNS\\' => array($vendorDir . '/daverandom/libdns/src'), - 'WP_Ultimo\\Dependencies\\League\\Uri\\' => array($vendorDir . '/league/uri', $vendorDir . '/league/uri-interfaces', $vendorDir . '/league/uri-parser/src'), - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\' => array($vendorDir . '/kelunik/certificate/src'), - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\' => array($vendorDir . '/jasny/sso/src'), - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\' => array($vendorDir . '/jasny/immutable/src'), - 'WP_Ultimo\\Dependencies\\Ifsnop\\' => array($vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop'), - 'WP_Ultimo\\Dependencies\\Hashids\\' => array($vendorDir . '/hashids/hashids/src'), - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), - 'WP_Ultimo\\Dependencies\\Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/lib/Doctrine/Deprecations'), - 'WP_Ultimo\\Dependencies\\Delight\\Http\\' => array($vendorDir . '/delight-im/http/src'), - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\' => array($vendorDir . '/delight-im/cookie/src'), - 'WP_Ultimo\\Dependencies\\DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), - 'WP_Ultimo\\Dependencies\\Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), - 'WP_Ultimo\\Dependencies\\BerlinDB\\' => array($vendorDir . '/berlindb/core/src'), - 'WP_Ultimo\\Dependencies\\Arrch\\' => array($vendorDir . '/rpnzl/arrch/src/Arrch'), - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\' => array($vendorDir . '/amphp/windows-registry/lib'), - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\' => array($vendorDir . '/amphp/sync/src'), - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\' => array($vendorDir . '/amphp/socket/src'), - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\' => array($vendorDir . '/amphp/serialization/src'), - 'WP_Ultimo\\Dependencies\\Amp\\Process\\' => array($vendorDir . '/amphp/process/lib'), - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\' => array($vendorDir . '/amphp/parser/src'), - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\' => array($vendorDir . '/amphp/http-client/src'), - 'WP_Ultimo\\Dependencies\\Amp\\Http\\' => array($vendorDir . '/amphp/hpack/src', $vendorDir . '/amphp/http/src'), - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\' => array($vendorDir . '/amphp/dns/lib'), - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\' => array($vendorDir . '/amphp/cache/lib'), - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\' => array($vendorDir . '/amphp/byte-stream/lib'), - 'WP_Ultimo\\Dependencies\\Amp\\' => array($vendorDir . '/amphp/amp/lib'), - 'WP_Ultimo\\Contracts\\' => array($baseDir . '/inc/contracts'), - 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'), - 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), - 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), - 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), - 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), -); diff --git a/dependencies/composer/autoload_real.php b/dependencies/composer/autoload_real.php deleted file mode 100644 index 676b34e..0000000 --- a/dependencies/composer/autoload_real.php +++ /dev/null @@ -1,48 +0,0 @@ -register(true); - - $filesToLoad = \Composer\Autoload\ComposerStaticInitWPUltimoDependencies::$files; - $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - - require $file; - } - }, null, null); - foreach ($filesToLoad as $fileIdentifier => $file) { - $requireFile($fileIdentifier, $file); - } - - return $loader; - } -} diff --git a/dependencies/composer/autoload_static.php b/dependencies/composer/autoload_static.php deleted file mode 100644 index 5339c92..0000000 --- a/dependencies/composer/autoload_static.php +++ /dev/null @@ -1,2577 +0,0 @@ - __DIR__ . '/..' . '/amphp/amp/lib/functions.php', - '76cd0796156622033397994f25b0d8fc' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/functions.php', - '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => __DIR__ . '/..' . '/amphp/byte-stream/lib/functions.php', - '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - 'bcb7d4fc55f4b1a7e10f5806723e9892' => __DIR__ . '/..' . '/amphp/sync/src/functions.php', - 'e187e371b30897d6dc51cac6a8c94ff6' => __DIR__ . '/..' . '/amphp/sync/src/ConcurrentIterator/functions.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '8dc56fe697ca93c4b40d876df1c94584' => __DIR__ . '/..' . '/amphp/process/lib/functions.php', - '3da389f428d8ee50333e4391c3f45046' => __DIR__ . '/..' . '/amphp/serialization/src/functions.php', - '445532134d762b3cbc25500cac266092' => __DIR__ . '/..' . '/daverandom/libdns/src/functions.php', - 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', - '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', - '7ebf029ad4b246f1e3f66192b40a932f' => __DIR__ . '/..' . '/amphp/dns/lib/functions.php', - 'e1e8b49c332434256b5df11b0f0c2a62' => __DIR__ . '/..' . '/league/uri-parser/src/functions_include.php', - 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', - '3d8ee50db78074a9235f0c2008c26b42' => __DIR__ . '/..' . '/amphp/http/src/functions.php', - 'd4e415514e4352172d58f02433fa50e4' => __DIR__ . '/..' . '/amphp/socket/src/functions.php', - '1c2dcb9d6851a7abaae89f9586ddd460' => __DIR__ . '/..' . '/amphp/socket/src/Internal/functions.php', - '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', - '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', - 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', - '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', - '77e5a577434e31d19d8dd6aeceac1ff4' => __DIR__ . '/..' . '/amphp/http-client/src/Internal/functions.php', - 'db356362850385d08a5381de2638b5fd' => __DIR__ . '/..' . '/mpdf/mpdf/src/functions.php', - '56823cacd97af379eceaf82ad00b928f' => __DIR__ . '/..' . '/phpseclib/bcmath_compat/lib/bcmath.php', - '6576cecdc0cf89139d7b600c9ffaa124' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/helpers.php', - '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', - '49a1299791c25c6fd83542c6fedacddd' => __DIR__ . '/..' . '/yahnis-elsts/plugin-update-checker/load-v4p11.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'p' => - array ( - 'phpseclib3\\' => 11, - ), - 'b' => - array ( - 'bcmath_compat\\' => 14, - ), - 'W' => - array ( - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\' => 37, - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\' => 48, - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\' => 40, - 'WP_Ultimo\\Dependencies\\Ultimo\\Next\\' => 35, - 'WP_Ultimo\\Dependencies\\Ultimo\\' => 30, - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\' => 53, - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\' => 49, - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\' => 57, - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\' => 47, - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\' => 53, - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\' => 49, - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\' => 57, - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\' => 47, - 'WP_Ultimo\\Dependencies\\Stripe\\' => 30, - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\' => 45, - 'WP_Ultimo\\Dependencies\\Spatie\\Macroable\\' => 40, - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\' => 34, - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\' => 39, - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\' => 45, - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\' => 40, - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\' => 39, - 'WP_Ultimo\\Dependencies\\Psr\\Log\\' => 31, - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\' => 40, - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\' => 39, - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\' => 43, - 'WP_Ultimo\\Dependencies\\Psr\\Container\\' => 37, - 'WP_Ultimo\\Dependencies\\Psr\\Clock\\' => 33, - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\' => 33, - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\' => 46, - 'WP_Ultimo\\Dependencies\\Pablo_Pacheco\\WP_Namespace_Autoloader\\' => 61, - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\' => 44, - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\' => 35, - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\' => 45, - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\' => 47, - 'WP_Ultimo\\Dependencies\\Mpdf\\' => 28, - 'WP_Ultimo\\Dependencies\\LibDNS\\' => 30, - 'WP_Ultimo\\Dependencies\\League\\Uri\\' => 34, - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\' => 43, - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\' => 33, - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\' => 39, - 'WP_Ultimo\\Dependencies\\Ifsnop\\' => 30, - 'WP_Ultimo\\Dependencies\\Hashids\\' => 31, - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\' => 39, - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\' => 42, - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\' => 34, - 'WP_Ultimo\\Dependencies\\Doctrine\\Deprecations\\' => 45, - 'WP_Ultimo\\Dependencies\\Delight\\Http\\' => 36, - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\' => 38, - 'WP_Ultimo\\Dependencies\\DeepCopy\\' => 32, - 'WP_Ultimo\\Dependencies\\Carbon\\' => 30, - 'WP_Ultimo\\Dependencies\\BerlinDB\\' => 32, - 'WP_Ultimo\\Dependencies\\Arrch\\' => 29, - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\' => 43, - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\' => 32, - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\' => 34, - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\' => 41, - 'WP_Ultimo\\Dependencies\\Amp\\Process\\' => 35, - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\' => 34, - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\' => 39, - 'WP_Ultimo\\Dependencies\\Amp\\Http\\' => 32, - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\' => 31, - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\' => 33, - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\' => 38, - 'WP_Ultimo\\Dependencies\\Amp\\' => 27, - 'WP_Ultimo\\Contracts\\' => 20, - ), - 'S' => - array ( - 'Symfony\\Polyfill\\Php81\\' => 23, - 'Symfony\\Polyfill\\Php80\\' => 23, - 'Symfony\\Polyfill\\Php73\\' => 23, - 'Symfony\\Polyfill\\Mbstring\\' => 26, - 'Symfony\\Component\\Translation\\' => 30, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'phpseclib3\\' => - array ( - 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib', - ), - 'bcmath_compat\\' => - array ( - 0 => __DIR__ . '/..' . '/phpseclib/bcmath_compat/src', - ), - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\' => - array ( - 0 => __DIR__ . '/..' . '/setasign/fpdi/src', - ), - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\' => - array ( - 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', - 1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', - 2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', - ), - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\' => - array ( - 0 => __DIR__ . '/..' . '/webmozart/assert/src', - ), - 'WP_Ultimo\\Dependencies\\Ultimo\\Next\\' => - array ( - 0 => __DIR__ . '/../..' . '/src/next', - ), - 'WP_Ultimo\\Dependencies\\Ultimo\\' => - array ( - 0 => __DIR__ . '/../..' . '/app', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/translation-contracts', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/service-contracts', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/cache-contracts', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/var-exporter', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/process', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', - ), - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/cache', - ), - 'WP_Ultimo\\Dependencies\\Stripe\\' => - array ( - 0 => __DIR__ . '/..' . '/stripe/stripe-php/lib', - ), - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\' => - array ( - 0 => __DIR__ . '/..' . '/spatie/ssl-certificate/src', - ), - 'WP_Ultimo\\Dependencies\\Spatie\\Macroable\\' => - array ( - 0 => __DIR__ . '/..' . '/spatie/macroable/src', - ), - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\' => - array ( - 0 => __DIR__ . '/..' . '/spatie/dns/src', - ), - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\' => - array ( - 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', - ), - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\' => - array ( - 0 => __DIR__ . '/..' . '/remotelyliving/php-dns/src', - ), - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\' => - array ( - 0 => __DIR__ . '/..' . '/rakit/validation/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/simple-cache/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/http-factory/src', - 1 => __DIR__ . '/..' . '/psr/http-message/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/http-client/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/container/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\Clock\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/clock/src', - ), - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/cache/src', - ), - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\' => - array ( - 0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src', - ), - 'WP_Ultimo\\Dependencies\\Pablo_Pacheco\\WP_Namespace_Autoloader\\' => - array ( - 0 => __DIR__ . '/..' . '/pablo-sg-pacheco/wp-namespace-autoloader/src', - ), - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\' => - array ( - 0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src', - ), - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\' => - array ( - 0 => __DIR__ . '/..' . '/nyholm/psr7/src', - ), - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\' => - array ( - 0 => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src', - ), - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\' => - array ( - 0 => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src', - ), - 'WP_Ultimo\\Dependencies\\Mpdf\\' => - array ( - 0 => __DIR__ . '/..' . '/mpdf/mpdf/src', - ), - 'WP_Ultimo\\Dependencies\\LibDNS\\' => - array ( - 0 => __DIR__ . '/..' . '/daverandom/libdns/src', - ), - 'WP_Ultimo\\Dependencies\\League\\Uri\\' => - array ( - 0 => __DIR__ . '/..' . '/league/uri', - 1 => __DIR__ . '/..' . '/league/uri-interfaces', - 2 => __DIR__ . '/..' . '/league/uri-parser/src', - ), - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\' => - array ( - 0 => __DIR__ . '/..' . '/kelunik/certificate/src', - ), - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\' => - array ( - 0 => __DIR__ . '/..' . '/jasny/sso/src', - ), - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\' => - array ( - 0 => __DIR__ . '/..' . '/jasny/immutable/src', - ), - 'WP_Ultimo\\Dependencies\\Ifsnop\\' => - array ( - 0 => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop', - ), - 'WP_Ultimo\\Dependencies\\Hashids\\' => - array ( - 0 => __DIR__ . '/..' . '/hashids/hashids/src', - ), - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\' => - array ( - 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', - ), - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\' => - array ( - 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', - ), - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\' => - array ( - 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', - ), - 'WP_Ultimo\\Dependencies\\Doctrine\\Deprecations\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/deprecations/lib/Doctrine/Deprecations', - ), - 'WP_Ultimo\\Dependencies\\Delight\\Http\\' => - array ( - 0 => __DIR__ . '/..' . '/delight-im/http/src', - ), - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\' => - array ( - 0 => __DIR__ . '/..' . '/delight-im/cookie/src', - ), - 'WP_Ultimo\\Dependencies\\DeepCopy\\' => - array ( - 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', - ), - 'WP_Ultimo\\Dependencies\\Carbon\\' => - array ( - 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', - ), - 'WP_Ultimo\\Dependencies\\BerlinDB\\' => - array ( - 0 => __DIR__ . '/..' . '/berlindb/core/src', - ), - 'WP_Ultimo\\Dependencies\\Arrch\\' => - array ( - 0 => __DIR__ . '/..' . '/rpnzl/arrch/src/Arrch', - ), - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/windows-registry/lib', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/sync/src', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/socket/src', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/serialization/src', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Process\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/process/lib', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/parser/src', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/http-client/src', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Http\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/hpack/src', - 1 => __DIR__ . '/..' . '/amphp/http/src', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/dns/lib', - ), - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/cache/lib', - ), - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/byte-stream/lib', - ), - 'WP_Ultimo\\Dependencies\\Amp\\' => - array ( - 0 => __DIR__ . '/..' . '/amphp/amp/lib', - ), - 'WP_Ultimo\\Contracts\\' => - array ( - 0 => __DIR__ . '/../..' . '/inc/contracts', - ), - 'Symfony\\Polyfill\\Php81\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php81', - ), - 'Symfony\\Polyfill\\Php80\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', - ), - 'Symfony\\Polyfill\\Php73\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', - ), - 'Symfony\\Polyfill\\Mbstring\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', - ), - 'Symfony\\Component\\Translation\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/translation', - ), - ); - - public static $classMap = array ( - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/CatalogueMetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPullCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationPullCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPushCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationPushCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationTrait' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationTrait.php', - 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/XliffLintCommand.php', - 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php', - 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', - 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php', - 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php', - 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\IncompleteDsnException' => __DIR__ . '/..' . '/symfony/translation/Exception/IncompleteDsnException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidArgumentException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/translation/Exception/LogicException.php', - 'Symfony\\Component\\Translation\\Exception\\MissingRequiredOptionException' => __DIR__ . '/..' . '/symfony/translation/Exception/MissingRequiredOptionException.php', - 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderException' => __DIR__ . '/..' . '/symfony/translation/Exception/ProviderException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ProviderExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/translation/Exception/RuntimeException.php', - 'Symfony\\Component\\Translation\\Exception\\UnsupportedSchemeException' => __DIR__ . '/..' . '/symfony/translation/Exception/UnsupportedSchemeException.php', - 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpAstExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpStringTokenParser.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\AbstractVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/AbstractVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\ConstraintVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/ConstraintVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TransMethodVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/TransMethodVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TranslatableMessageVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatterInterface.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php', - 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php', - 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php', - 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php', - 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php', - 'Symfony\\Component\\Translation\\LocaleSwitcher' => __DIR__ . '/..' . '/symfony/translation/LocaleSwitcher.php', - 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php', - 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php', - 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php', - 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Provider\\AbstractProviderFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/AbstractProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\Dsn' => __DIR__ . '/..' . '/symfony/translation/Provider/Dsn.php', - 'Symfony\\Component\\Translation\\Provider\\FilteringProvider' => __DIR__ . '/..' . '/symfony/translation/Provider/FilteringProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProvider' => __DIR__ . '/..' . '/symfony/translation/Provider/NullProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProviderFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/NullProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderFactoryInterface' => __DIR__ . '/..' . '/symfony/translation/Provider/ProviderFactoryInterface.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderInterface' => __DIR__ . '/..' . '/symfony/translation/Provider/ProviderInterface.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollection' => __DIR__ . '/..' . '/symfony/translation/Provider/TranslationProviderCollection.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollectionFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/TranslationProviderCollectionFactory.php', - 'Symfony\\Component\\Translation\\PseudoLocalizationTranslator' => __DIR__ . '/..' . '/symfony/translation/PseudoLocalizationTranslator.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReader.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReaderInterface.php', - 'Symfony\\Component\\Translation\\Test\\ProviderFactoryTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/ProviderFactoryTestCase.php', - 'Symfony\\Component\\Translation\\Test\\ProviderTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/ProviderTestCase.php', - 'Symfony\\Component\\Translation\\TranslatableMessage' => __DIR__ . '/..' . '/symfony/translation/TranslatableMessage.php', - 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php', - 'Symfony\\Component\\Translation\\TranslatorBag' => __DIR__ . '/..' . '/symfony/translation/TranslatorBag.php', - 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php', - 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php', - 'Symfony\\Component\\Translation\\Util\\XliffUtils' => __DIR__ . '/..' . '/symfony/translation/Util/XliffUtils.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php', - 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php', - 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', - 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', - 'Symfony\\Polyfill\\Php81\\Php81' => __DIR__ . '/..' . '/symfony/polyfill-php81/Php81.php', - 'WP_Ultimo\\API\\Register_Endpoint' => __DIR__ . '/../..' . '/inc/api/class-register-endpoint.php', - 'WP_Ultimo\\Apis\\Rest_Api' => __DIR__ . '/../..' . '/inc/api/trait-rest-api.php', - 'WP_Ultimo\\Apis\\WP_CLI' => __DIR__ . '/../..' . '/inc/api/trait-wp-cli.php', - 'WP_Ultimo\\Contracts\\Session' => __DIR__ . '/../..' . '/inc/contracts/Session.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ClosedException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ClosedException.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\InMemoryStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InMemoryStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\InputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\InputStreamChain' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStreamChain.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\IteratorStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/IteratorStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\LineReader' => __DIR__ . '/..' . '/amphp/byte-stream/lib/LineReader.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Message' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Message.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\OutputBuffer' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputBuffer.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\OutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\Payload' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Payload.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\PendingReadError' => __DIR__ . '/..' . '/amphp/byte-stream/lib/PendingReadError.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ResourceInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ResourceOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\StreamException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/StreamException.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ZlibInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\ByteStream\\ZlibOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\ArrayCache' => __DIR__ . '/..' . '/amphp/cache/lib/ArrayCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\AtomicCache' => __DIR__ . '/..' . '/amphp/cache/lib/AtomicCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\Cache' => __DIR__ . '/..' . '/amphp/cache/lib/Cache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\CacheException' => __DIR__ . '/..' . '/amphp/cache/lib/CacheException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\FileCache' => __DIR__ . '/..' . '/amphp/cache/lib/FileCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\NullCache' => __DIR__ . '/..' . '/amphp/cache/lib/NullCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\PrefixCache' => __DIR__ . '/..' . '/amphp/cache/lib/PrefixCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\Cache\\SerializedCache' => __DIR__ . '/..' . '/amphp/cache/lib/SerializedCache.php', - 'WP_Ultimo\\Dependencies\\Amp\\CallableMaker' => __DIR__ . '/..' . '/amphp/amp/lib/CallableMaker.php', - 'WP_Ultimo\\Dependencies\\Amp\\CancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationToken.php', - 'WP_Ultimo\\Dependencies\\Amp\\CancellationTokenSource' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationTokenSource.php', - 'WP_Ultimo\\Dependencies\\Amp\\CancelledException' => __DIR__ . '/..' . '/amphp/amp/lib/CancelledException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Coroutine' => __DIR__ . '/..' . '/amphp/amp/lib/Coroutine.php', - 'WP_Ultimo\\Dependencies\\Amp\\Deferred' => __DIR__ . '/..' . '/amphp/amp/lib/Deferred.php', - 'WP_Ultimo\\Dependencies\\Amp\\Delayed' => __DIR__ . '/..' . '/amphp/amp/lib/Delayed.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\BlockingFallbackResolver' => __DIR__ . '/..' . '/amphp/dns/lib/BlockingFallbackResolver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Config' => __DIR__ . '/..' . '/amphp/dns/lib/Config.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\ConfigException' => __DIR__ . '/..' . '/amphp/dns/lib/ConfigException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\ConfigLoader' => __DIR__ . '/..' . '/amphp/dns/lib/ConfigLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\DnsException' => __DIR__ . '/..' . '/amphp/dns/lib/DnsException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\HostLoader' => __DIR__ . '/..' . '/amphp/dns/lib/HostLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Internal\\Socket' => __DIR__ . '/..' . '/amphp/dns/lib/Internal/Socket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Internal\\TcpSocket' => __DIR__ . '/..' . '/amphp/dns/lib/Internal/TcpSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Internal\\UdpSocket' => __DIR__ . '/..' . '/amphp/dns/lib/Internal/UdpSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\InvalidNameException' => __DIR__ . '/..' . '/amphp/dns/lib/InvalidNameException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\NoRecordException' => __DIR__ . '/..' . '/amphp/dns/lib/NoRecordException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Record' => __DIR__ . '/..' . '/amphp/dns/lib/Record.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Resolver' => __DIR__ . '/..' . '/amphp/dns/lib/Resolver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\Rfc1035StubResolver' => __DIR__ . '/..' . '/amphp/dns/lib/Rfc1035StubResolver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\TimeoutException' => __DIR__ . '/..' . '/amphp/dns/lib/TimeoutException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\UnixConfigLoader' => __DIR__ . '/..' . '/amphp/dns/lib/UnixConfigLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Dns\\WindowsConfigLoader' => __DIR__ . '/..' . '/amphp/dns/lib/WindowsConfigLoader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Emitter' => __DIR__ . '/..' . '/amphp/amp/lib/Emitter.php', - 'WP_Ultimo\\Dependencies\\Amp\\Failure' => __DIR__ . '/..' . '/amphp/amp/lib/Failure.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\ApplicationInterceptor' => __DIR__ . '/..' . '/amphp/http-client/src/ApplicationInterceptor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\FileBody' => __DIR__ . '/..' . '/amphp/http-client/src/Body/FileBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\FormBody' => __DIR__ . '/..' . '/amphp/http-client/src/Body/FormBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\JsonBody' => __DIR__ . '/..' . '/amphp/http-client/src/Body/JsonBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Body\\StringBody' => __DIR__ . '/..' . '/amphp/http-client/src/Body/StringBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Connection' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Connection.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\ConnectionFactory' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/ConnectionFactory.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\ConnectionLimitingPool' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/ConnectionLimitingPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\ConnectionPool' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/ConnectionPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\DefaultConnectionFactory' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/DefaultConnectionFactory.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http1Connection' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Http1Connection.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http2Connection' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Http2Connection.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http2ConnectionException' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Http2ConnectionException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Http2StreamException' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Http2StreamException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\HttpStream' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/HttpStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\InterceptedStream' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/InterceptedStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\Http1Parser' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Internal/Http1Parser.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\Http2ConnectionProcessor' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Internal/Http2ConnectionProcessor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\Http2Stream' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Internal/Http2Stream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Internal\\RequestNormalizer' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Internal/RequestNormalizer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\Stream' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/Stream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\StreamLimitingPool' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/StreamLimitingPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\UnlimitedConnectionPool' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/UnlimitedConnectionPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\UnprocessedRequestException' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/UnprocessedRequestException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Connection\\UpgradedSocket' => __DIR__ . '/..' . '/amphp/http-client/src/Connection/UpgradedSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\DelegateHttpClient' => __DIR__ . '/..' . '/amphp/http-client/src/DelegateHttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\EventListener' => __DIR__ . '/..' . '/amphp/http-client/src/EventListener.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\EventListener\\RecordHarAttributes' => __DIR__ . '/..' . '/amphp/http-client/src/EventListener/RecordHarAttributes.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\HttpClient' => __DIR__ . '/..' . '/amphp/http-client/src/HttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\HttpClientBuilder' => __DIR__ . '/..' . '/amphp/http-client/src/HttpClientBuilder.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\HttpException' => __DIR__ . '/..' . '/amphp/http-client/src/HttpException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\InterceptedHttpClient' => __DIR__ . '/..' . '/amphp/http-client/src/InterceptedHttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\AddRequestHeader' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/AddRequestHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\AddResponseHeader' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/AddResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\DecompressResponse' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/DecompressResponse.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\FollowRedirects' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/FollowRedirects.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\ForbidUriUserInfo' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/ForbidUriUserInfo.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\LogHttpArchive' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/LogHttpArchive.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\MatchOrigin' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/MatchOrigin.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\ModifyRequest' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/ModifyRequest.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\ModifyResponse' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/ModifyResponse.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\RemoveRequestHeader' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/RemoveRequestHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\RemoveResponseHeader' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/RemoveResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\RetryRequests' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/RetryRequests.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetRequestHeader' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/SetRequestHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetRequestHeaderIfUnset' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/SetRequestHeaderIfUnset.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetRequestTimeout' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/SetRequestTimeout.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetResponseHeader' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/SetResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\SetResponseHeaderIfUnset' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/SetResponseHeaderIfUnset.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Interceptor\\TooManyRedirectsException' => __DIR__ . '/..' . '/amphp/http-client/src/Interceptor/TooManyRedirectsException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\ForbidCloning' => __DIR__ . '/..' . '/amphp/http-client/src/Internal/ForbidCloning.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\ForbidSerialization' => __DIR__ . '/..' . '/amphp/http-client/src/Internal/ForbidSerialization.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\HarAttributes' => __DIR__ . '/..' . '/amphp/http-client/src/Internal/HarAttributes.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\ResponseBodyStream' => __DIR__ . '/..' . '/amphp/http-client/src/Internal/ResponseBodyStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Internal\\SizeLimitingInputStream' => __DIR__ . '/..' . '/amphp/http-client/src/Internal/SizeLimitingInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\InvalidRequestException' => __DIR__ . '/..' . '/amphp/http-client/src/InvalidRequestException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\MissingAttributeError' => __DIR__ . '/..' . '/amphp/http-client/src/MissingAttributeError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\NetworkInterceptor' => __DIR__ . '/..' . '/amphp/http-client/src/NetworkInterceptor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\ParseException' => __DIR__ . '/..' . '/amphp/http-client/src/ParseException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\PooledHttpClient' => __DIR__ . '/..' . '/amphp/http-client/src/PooledHttpClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Request' => __DIR__ . '/..' . '/amphp/http-client/src/Request.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\RequestBody' => __DIR__ . '/..' . '/amphp/http-client/src/RequestBody.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Response' => __DIR__ . '/..' . '/amphp/http-client/src/Response.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\SocketException' => __DIR__ . '/..' . '/amphp/http-client/src/SocketException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\TimeoutException' => __DIR__ . '/..' . '/amphp/http-client/src/TimeoutException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\Trailers' => __DIR__ . '/..' . '/amphp/http-client/src/Trailers.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\CookieAttributes' => __DIR__ . '/..' . '/amphp/http/src/Cookie/CookieAttributes.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\InvalidCookieException' => __DIR__ . '/..' . '/amphp/http/src/Cookie/InvalidCookieException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\RequestCookie' => __DIR__ . '/..' . '/amphp/http/src/Cookie/RequestCookie.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Cookie\\ResponseCookie' => __DIR__ . '/..' . '/amphp/http/src/Cookie/ResponseCookie.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\HPack' => __DIR__ . '/..' . '/amphp/hpack/src/HPack.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\HPackException' => __DIR__ . '/..' . '/amphp/hpack/src/HPackException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2ConnectionException' => __DIR__ . '/..' . '/amphp/http/src/Http2/Http2ConnectionException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2Parser' => __DIR__ . '/..' . '/amphp/http/src/Http2/Http2Parser.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2Processor' => __DIR__ . '/..' . '/amphp/http/src/Http2/Http2Processor.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Http2\\Http2StreamException' => __DIR__ . '/..' . '/amphp/http/src/Http2/Http2StreamException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Internal\\HPackNative' => __DIR__ . '/..' . '/amphp/hpack/src/Internal/HPackNative.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Internal\\HPackNghttp2' => __DIR__ . '/..' . '/amphp/hpack/src/Internal/HPackNghttp2.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\InvalidHeaderException' => __DIR__ . '/..' . '/amphp/http/src/InvalidHeaderException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Message' => __DIR__ . '/..' . '/amphp/http/src/Message.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Rfc7230' => __DIR__ . '/..' . '/amphp/http/src/Rfc7230.php', - 'WP_Ultimo\\Dependencies\\Amp\\Http\\Status' => __DIR__ . '/..' . '/amphp/http/src/Status.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\Placeholder' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Placeholder.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\PrivateIterator' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivateIterator.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\PrivatePromise' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivatePromise.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Producer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Internal\\ResolutionQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/ResolutionQueue.php', - 'WP_Ultimo\\Dependencies\\Amp\\InvalidYieldError' => __DIR__ . '/..' . '/amphp/amp/lib/InvalidYieldError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Iterator' => __DIR__ . '/..' . '/amphp/amp/lib/Iterator.php', - 'WP_Ultimo\\Dependencies\\Amp\\LazyPromise' => __DIR__ . '/..' . '/amphp/amp/lib/LazyPromise.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop' => __DIR__ . '/..' . '/amphp/amp/lib/Loop.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\Driver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Driver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\DriverFactory' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/DriverFactory.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\EvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EvDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\EventDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EventDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\Internal\\TimerQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\InvalidWatcherError' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/InvalidWatcherError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\NativeDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/NativeDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\TracingDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/TracingDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\UnsupportedFeatureException' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\UvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UvDriver.php', - 'WP_Ultimo\\Dependencies\\Amp\\Loop\\Watcher' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Watcher.php', - 'WP_Ultimo\\Dependencies\\Amp\\MultiReasonException' => __DIR__ . '/..' . '/amphp/amp/lib/MultiReasonException.php', - 'WP_Ultimo\\Dependencies\\Amp\\NullCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/NullCancellationToken.php', - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\InvalidDelimiterError' => __DIR__ . '/..' . '/amphp/parser/src/InvalidDelimiterError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Parser\\Parser' => __DIR__ . '/..' . '/amphp/parser/src/Parser.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Posix\\Handle' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Posix/Handle.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Posix\\Runner' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Posix/Runner.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\ProcessHandle' => __DIR__ . '/..' . '/amphp/process/lib/Internal/ProcessHandle.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\ProcessRunner' => __DIR__ . '/..' . '/amphp/process/lib/Internal/ProcessRunner.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\ProcessStatus' => __DIR__ . '/..' . '/amphp/process/lib/Internal/ProcessStatus.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\Handle' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Windows/Handle.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\HandshakeStatus' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Windows/HandshakeStatus.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\PendingSocketClient' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Windows/PendingSocketClient.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\Runner' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Windows/Runner.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\SignalCode' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Windows/SignalCode.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Internal\\Windows\\SocketConnector' => __DIR__ . '/..' . '/amphp/process/lib/Internal/Windows/SocketConnector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\Process' => __DIR__ . '/..' . '/amphp/process/lib/Process.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\ProcessException' => __DIR__ . '/..' . '/amphp/process/lib/ProcessException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\ProcessInputStream' => __DIR__ . '/..' . '/amphp/process/lib/ProcessInputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\ProcessOutputStream' => __DIR__ . '/..' . '/amphp/process/lib/ProcessOutputStream.php', - 'WP_Ultimo\\Dependencies\\Amp\\Process\\StatusError' => __DIR__ . '/..' . '/amphp/process/lib/StatusError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Producer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Promise' => __DIR__ . '/..' . '/amphp/amp/lib/Promise.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\CompressingSerializer' => __DIR__ . '/..' . '/amphp/serialization/src/CompressingSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\JsonSerializer' => __DIR__ . '/..' . '/amphp/serialization/src/JsonSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\NativeSerializer' => __DIR__ . '/..' . '/amphp/serialization/src/NativeSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\PassthroughSerializer' => __DIR__ . '/..' . '/amphp/serialization/src/PassthroughSerializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\SerializationException' => __DIR__ . '/..' . '/amphp/serialization/src/SerializationException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Serialization\\Serializer' => __DIR__ . '/..' . '/amphp/serialization/src/Serializer.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\BindContext' => __DIR__ . '/..' . '/amphp/socket/src/BindContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Certificate' => __DIR__ . '/..' . '/amphp/socket/src/Certificate.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ClientTlsContext' => __DIR__ . '/..' . '/amphp/socket/src/ClientTlsContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ConnectContext' => __DIR__ . '/..' . '/amphp/socket/src/ConnectContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ConnectException' => __DIR__ . '/..' . '/amphp/socket/src/ConnectException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Connector' => __DIR__ . '/..' . '/amphp/socket/src/Connector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\DatagramSocket' => __DIR__ . '/..' . '/amphp/socket/src/DatagramSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\DnsConnector' => __DIR__ . '/..' . '/amphp/socket/src/DnsConnector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\EncryptableSocket' => __DIR__ . '/..' . '/amphp/socket/src/EncryptableSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\PendingAcceptError' => __DIR__ . '/..' . '/amphp/socket/src/PendingAcceptError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\PendingReceiveError' => __DIR__ . '/..' . '/amphp/socket/src/PendingReceiveError.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ResourceSocket' => __DIR__ . '/..' . '/amphp/socket/src/ResourceSocket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Server' => __DIR__ . '/..' . '/amphp/socket/src/Server.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\ServerTlsContext' => __DIR__ . '/..' . '/amphp/socket/src/ServerTlsContext.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\Socket' => __DIR__ . '/..' . '/amphp/socket/src/Socket.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\SocketAddress' => __DIR__ . '/..' . '/amphp/socket/src/SocketAddress.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\SocketException' => __DIR__ . '/..' . '/amphp/socket/src/SocketException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\SocketPool' => __DIR__ . '/..' . '/amphp/socket/src/SocketPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\StaticConnector' => __DIR__ . '/..' . '/amphp/socket/src/StaticConnector.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\TlsException' => __DIR__ . '/..' . '/amphp/socket/src/TlsException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\TlsInfo' => __DIR__ . '/..' . '/amphp/socket/src/TlsInfo.php', - 'WP_Ultimo\\Dependencies\\Amp\\Socket\\UnlimitedSocketPool' => __DIR__ . '/..' . '/amphp/socket/src/UnlimitedSocketPool.php', - 'WP_Ultimo\\Dependencies\\Amp\\Struct' => __DIR__ . '/..' . '/amphp/amp/lib/Struct.php', - 'WP_Ultimo\\Dependencies\\Amp\\Success' => __DIR__ . '/..' . '/amphp/amp/lib/Success.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Barrier' => __DIR__ . '/..' . '/amphp/sync/src/Barrier.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\FileMutex' => __DIR__ . '/..' . '/amphp/sync/src/FileMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Internal\\MutexStorage' => __DIR__ . '/..' . '/amphp/sync/src/Internal/MutexStorage.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Internal\\SemaphoreStorage' => __DIR__ . '/..' . '/amphp/sync/src/Internal/SemaphoreStorage.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\KeyedMutex' => __DIR__ . '/..' . '/amphp/sync/src/KeyedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\KeyedSemaphore' => __DIR__ . '/..' . '/amphp/sync/src/KeyedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalKeyedMutex' => __DIR__ . '/..' . '/amphp/sync/src/LocalKeyedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalKeyedSemaphore' => __DIR__ . '/..' . '/amphp/sync/src/LocalKeyedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalMutex' => __DIR__ . '/..' . '/amphp/sync/src/LocalMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\LocalSemaphore' => __DIR__ . '/..' . '/amphp/sync/src/LocalSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Lock' => __DIR__ . '/..' . '/amphp/sync/src/Lock.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Mutex' => __DIR__ . '/..' . '/amphp/sync/src/Mutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\PosixSemaphore' => __DIR__ . '/..' . '/amphp/sync/src/PosixSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\PrefixedKeyedMutex' => __DIR__ . '/..' . '/amphp/sync/src/PrefixedKeyedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\PrefixedKeyedSemaphore' => __DIR__ . '/..' . '/amphp/sync/src/PrefixedKeyedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\Semaphore' => __DIR__ . '/..' . '/amphp/sync/src/Semaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\SemaphoreMutex' => __DIR__ . '/..' . '/amphp/sync/src/SemaphoreMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\StaticKeyMutex' => __DIR__ . '/..' . '/amphp/sync/src/StaticKeyMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\SyncException' => __DIR__ . '/..' . '/amphp/sync/src/SyncException.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\ThreadedMutex' => __DIR__ . '/..' . '/amphp/sync/src/ThreadedMutex.php', - 'WP_Ultimo\\Dependencies\\Amp\\Sync\\ThreadedSemaphore' => __DIR__ . '/..' . '/amphp/sync/src/ThreadedSemaphore.php', - 'WP_Ultimo\\Dependencies\\Amp\\TimeoutCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutCancellationToken.php', - 'WP_Ultimo\\Dependencies\\Amp\\TimeoutException' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutException.php', - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\KeyNotFoundException' => __DIR__ . '/..' . '/amphp/windows-registry/lib/KeyNotFoundException.php', - 'WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\WindowsRegistry' => __DIR__ . '/..' . '/amphp/windows-registry/lib/WindowsRegistry.php', - 'WP_Ultimo\\Dependencies\\Arrch\\Arrch' => __DIR__ . '/..' . '/rpnzl/arrch/src/Arrch/Arrch.php', - 'WP_Ultimo\\Dependencies\\Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Base' => __DIR__ . '/..' . '/berlindb/core/src/Database/Base.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Column' => __DIR__ . '/..' . '/berlindb/core/src/Database/Column.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Queries\\Compare' => __DIR__ . '/..' . '/berlindb/core/src/Database/Queries/Compare.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Queries\\Date' => __DIR__ . '/..' . '/berlindb/core/src/Database/Queries/Date.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Queries\\Meta' => __DIR__ . '/..' . '/berlindb/core/src/Database/Queries/Meta.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Query' => __DIR__ . '/..' . '/berlindb/core/src/Database/Query.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Row' => __DIR__ . '/..' . '/berlindb/core/src/Database/Row.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Schema' => __DIR__ . '/..' . '/berlindb/core/src/Database/Schema.php', - 'WP_Ultimo\\Dependencies\\BerlinDB\\Database\\Table' => __DIR__ . '/..' . '/berlindb/core/src/Database/Table.php', - 'WP_Ultimo\\Dependencies\\CURLStringFile' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', - 'WP_Ultimo\\Dependencies\\Carbon\\AbstractTranslator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/AbstractTranslator.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonConverterInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterface.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonPeriod' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonPeriodImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\CarbonTimeZone' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Cli\\Invoker' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonDoctrineType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonImmutableType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\CarbonTypeConverter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\DateTimeDefaultPrecision' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\DateTimeImmutableType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Doctrine\\DateTimeType' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadComparisonUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadFluentConstructorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadFluentSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\BadMethodCallException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\EndLessPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\Exception' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\ImmutableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidCastException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidFormatException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidIntervalException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidPeriodDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidPeriodParameterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidTimeZoneException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\InvalidTypeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\NotACarbonClassException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\NotAPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\NotLocaleAwareException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\OutOfRangeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\ParseErrorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnitNotConfiguredException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownGetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownMethodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnknownUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Exceptions\\UnreachableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Factory' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Factory.php', - 'WP_Ultimo\\Dependencies\\Carbon\\FactoryImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Laravel\\ServiceProvider' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', - 'WP_Ultimo\\Dependencies\\Carbon\\MessageFormatter\\MessageFormatterMapper' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\AbstractMacro' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\Macro' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/Macro.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\MacroExtension' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php', - 'WP_Ultimo\\Dependencies\\Carbon\\PHPStan\\MacroScanner' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Boundaries' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Cast' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Cast.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Comparison' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Converter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Converter.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Creator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Creator.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Date' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Date.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\DeprecatedProperties' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Difference' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Difference.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\IntervalRounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\IntervalStep' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Localization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Localization.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Macro' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Macro.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\MagicParameter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/MagicParameter.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Mixin' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Modifiers' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Mutability' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\ObjectInitialisation' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Options' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Options.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Rounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Serialization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Test' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Test.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Timestamp' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\ToStringFormat' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Units' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Units.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Traits\\Week' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Week.php', - 'WP_Ultimo\\Dependencies\\Carbon\\Translator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Translator.php', - 'WP_Ultimo\\Dependencies\\Carbon\\TranslatorImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/TranslatorImmutable.php', - 'WP_Ultimo\\Dependencies\\Carbon\\TranslatorStrongTypeInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\ChainableFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', - 'WP_Ultimo\\Dependencies\\DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\Cookie' => __DIR__ . '/..' . '/delight-im/cookie/src/Cookie.php', - 'WP_Ultimo\\Dependencies\\Delight\\Cookie\\Session' => __DIR__ . '/..' . '/delight-im/cookie/src/Session.php', - 'WP_Ultimo\\Dependencies\\Delight\\Http\\ResponseHeader' => __DIR__ . '/..' . '/delight-im/http/src/ResponseHeader.php', - 'WP_Ultimo\\Dependencies\\Doctrine\\Deprecations\\Deprecation' => __DIR__ . '/..' . '/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\BodySummarizer' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizer.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\BodySummarizerInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\ClientTrait' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientTrait.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\SessionCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Cookie\\SetCookie' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\BadResponseException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\ClientException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ClientException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\ConnectException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ConnectException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\HandlerStack' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HandlerStack.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlFactory' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlFactoryInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\HeaderProcessor' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\MessageFormatterInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatterInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Create' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Create.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Each' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Each.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Is' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Is.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromiseInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\PromisorInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromisorInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\Utils' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Utils.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Header' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Header.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\HttpFactory' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/HttpFactory.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Message' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Message.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\MimeType' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MimeType.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Query' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Query.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriComparator.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Utils.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php', - 'WP_Ultimo\\Dependencies\\GuzzleHttp\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Hashids' => __DIR__ . '/..' . '/hashids/hashids/src/Hashids.php', - 'WP_Ultimo\\Dependencies\\Hashids\\HashidsException' => __DIR__ . '/..' . '/hashids/hashids/src/HashidsException.php', - 'WP_Ultimo\\Dependencies\\Hashids\\HashidsInterface' => __DIR__ . '/..' . '/hashids/hashids/src/HashidsInterface.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Math\\Bc' => __DIR__ . '/..' . '/hashids/hashids/src/Math/Bc.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Math\\Gmp' => __DIR__ . '/..' . '/hashids/hashids/src/Math/Gmp.php', - 'WP_Ultimo\\Dependencies\\Hashids\\Math\\MathInterface' => __DIR__ . '/..' . '/hashids/hashids/src/Math/MathInterface.php', - 'WP_Ultimo\\Dependencies\\Ifsnop\\Mysqldump\\Mysqldump' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php', - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\NoDynamicProperties' => __DIR__ . '/..' . '/jasny/immutable/src/NoDynamicProperties.php', - 'WP_Ultimo\\Dependencies\\Jasny\\Immutable\\With' => __DIR__ . '/..' . '/jasny/immutable/src/With.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Broker' => __DIR__ . '/..' . '/jasny/sso/src/Broker/Broker.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Cookies' => __DIR__ . '/..' . '/jasny/sso/src/Broker/Cookies.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Curl' => __DIR__ . '/..' . '/jasny/sso/src/Broker/Curl.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\NotAttachedException' => __DIR__ . '/..' . '/jasny/sso/src/Broker/NotAttachedException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\RequestException' => __DIR__ . '/..' . '/jasny/sso/src/Broker/RequestException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Broker\\Session' => __DIR__ . '/..' . '/jasny/sso/src/Broker/Session.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\BrokerException' => __DIR__ . '/..' . '/jasny/sso/src/Server/BrokerException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\ExceptionInterface' => __DIR__ . '/..' . '/jasny/sso/src/Server/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\GlobalSession' => __DIR__ . '/..' . '/jasny/sso/src/Server/GlobalSession.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\Server' => __DIR__ . '/..' . '/jasny/sso/src/Server/Server.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\ServerException' => __DIR__ . '/..' . '/jasny/sso/src/Server/ServerException.php', - 'WP_Ultimo\\Dependencies\\Jasny\\SSO\\Server\\SessionInterface' => __DIR__ . '/..' . '/jasny/sso/src/Server/SessionInterface.php', - 'WP_Ultimo\\Dependencies\\JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\Certificate' => __DIR__ . '/..' . '/kelunik/certificate/src/Certificate.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\FieldNotSupportedException' => __DIR__ . '/..' . '/kelunik/certificate/src/FieldNotSupportedException.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\InvalidCertificateException' => __DIR__ . '/..' . '/kelunik/certificate/src/InvalidCertificateException.php', - 'WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\Profile' => __DIR__ . '/..' . '/kelunik/certificate/src/Profile.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\BaseUri' => __DIR__ . '/..' . '/league/uri/BaseUri.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\AuthorityInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/AuthorityInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\DataPathInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/DataPathInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\DomainHostInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/DomainHostInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\FragmentInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/FragmentInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\HostInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/HostInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\IpHostInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/IpHostInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\PathInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/PathInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\PortInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/PortInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\QueryInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/QueryInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\SegmentedPathInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/SegmentedPathInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriAccess' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/UriAccess.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriComponentInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/UriComponentInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriException' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/UriException.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UriInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/UriInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Contracts\\UserInfoInterface' => __DIR__ . '/..' . '/league/uri-interfaces/Contracts/UserInfoInterface.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Encoder' => __DIR__ . '/..' . '/league/uri-interfaces/Encoder.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exception' => __DIR__ . '/..' . '/league/uri-parser/src/Exception.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\ConversionFailed' => __DIR__ . '/..' . '/league/uri-interfaces/Exceptions/ConversionFailed.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\MissingFeature' => __DIR__ . '/..' . '/league/uri-interfaces/Exceptions/MissingFeature.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\OffsetOutOfBounds' => __DIR__ . '/..' . '/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Exceptions\\SyntaxError' => __DIR__ . '/..' . '/league/uri-interfaces/Exceptions/SyntaxError.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\FeatureDetection' => __DIR__ . '/..' . '/league/uri-interfaces/FeatureDetection.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Http' => __DIR__ . '/..' . '/league/uri/Http.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\HttpFactory' => __DIR__ . '/..' . '/league/uri/HttpFactory.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\BCMathCalculator' => __DIR__ . '/..' . '/league/uri-interfaces/IPv4/BCMathCalculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\Calculator' => __DIR__ . '/..' . '/league/uri-interfaces/IPv4/Calculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\Converter' => __DIR__ . '/..' . '/league/uri-interfaces/IPv4/Converter.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\GMPCalculator' => __DIR__ . '/..' . '/league/uri-interfaces/IPv4/GMPCalculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\IPv4\\NativeCalculator' => __DIR__ . '/..' . '/league/uri-interfaces/IPv4/NativeCalculator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Converter' => __DIR__ . '/..' . '/league/uri-interfaces/Idna/Converter.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Error' => __DIR__ . '/..' . '/league/uri-interfaces/Idna/Error.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Option' => __DIR__ . '/..' . '/league/uri-interfaces/Idna/Option.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Idna\\Result' => __DIR__ . '/..' . '/league/uri-interfaces/Idna/Result.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\KeyValuePair\\Converter' => __DIR__ . '/..' . '/league/uri-interfaces/KeyValuePair/Converter.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\MissingIdnSupport' => __DIR__ . '/..' . '/league/uri-parser/src/MissingIdnSupport.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Parser' => __DIR__ . '/..' . '/league/uri-parser/src/Parser.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\QueryString' => __DIR__ . '/..' . '/league/uri-interfaces/QueryString.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\Uri' => __DIR__ . '/..' . '/league/uri/Uri.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriInfo' => __DIR__ . '/..' . '/league/uri/UriInfo.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriResolver' => __DIR__ . '/..' . '/league/uri/UriResolver.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriString' => __DIR__ . '/..' . '/league/uri-interfaces/UriString.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate' => __DIR__ . '/..' . '/league/uri/UriTemplate.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\Expression' => __DIR__ . '/..' . '/league/uri/UriTemplate/Expression.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\Operator' => __DIR__ . '/..' . '/league/uri/UriTemplate/Operator.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\Template' => __DIR__ . '/..' . '/league/uri/UriTemplate/Template.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\TemplateCanNotBeExpanded' => __DIR__ . '/..' . '/league/uri/UriTemplate/TemplateCanNotBeExpanded.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\VarSpecifier' => __DIR__ . '/..' . '/league/uri/UriTemplate/VarSpecifier.php', - 'WP_Ultimo\\Dependencies\\League\\Uri\\UriTemplate\\VariableBag' => __DIR__ . '/..' . '/league/uri/UriTemplate/VariableBag.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\Decoder' => __DIR__ . '/..' . '/daverandom/libdns/src/Decoder/Decoder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\DecoderFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Decoder/DecoderFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\DecodingContext' => __DIR__ . '/..' . '/daverandom/libdns/src/Decoder/DecodingContext.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Decoder\\DecodingContextFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Decoder/DecodingContextFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\Encoder' => __DIR__ . '/..' . '/daverandom/libdns/src/Encoder/Encoder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\EncoderFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Encoder/EncoderFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\EncodingContext' => __DIR__ . '/..' . '/daverandom/libdns/src/Encoder/EncodingContext.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Encoder\\EncodingContextFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Encoder/EncodingContextFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Enumeration' => __DIR__ . '/..' . '/daverandom/libdns/src/Enumeration.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\Message' => __DIR__ . '/..' . '/daverandom/libdns/src/Messages/Message.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Messages/MessageFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageOpCodes' => __DIR__ . '/..' . '/daverandom/libdns/src/Messages/MessageOpCodes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageResponseCodes' => __DIR__ . '/..' . '/daverandom/libdns/src/Messages/MessageResponseCodes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Messages\\MessageTypes' => __DIR__ . '/..' . '/daverandom/libdns/src/Messages/MessageTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Packets\\LabelRegistry' => __DIR__ . '/..' . '/daverandom/libdns/src/Packets/LabelRegistry.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Packets\\Packet' => __DIR__ . '/..' . '/daverandom/libdns/src/Packets/Packet.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Packets\\PacketFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Packets/PacketFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Question' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Question.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\QuestionFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/QuestionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RData' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/RData.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RDataBuilder' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/RDataBuilder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RDataFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/RDataFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Record' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Record.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RecordCollection' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/RecordCollection.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RecordCollectionFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/RecordCollectionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\RecordTypes' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/RecordTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Resource' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Resource.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceBuilder' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceBuilder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceBuilderFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceBuilderFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceClasses' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceClasses.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceQClasses' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceQClasses.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceQTypes' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceQTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\ResourceTypes' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/ResourceTypes.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\FieldDefinition' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinition.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\FieldDefinitionFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinitionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinition' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinition.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinitionFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinitionManager' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManager.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\TypeDefinitions\\TypeDefinitionManagerFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManagerFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Anything' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/Anything.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\BitMap' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/BitMap.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Char' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/Char.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\CharacterString' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/CharacterString.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\DomainName' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/DomainName.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\IPv4Address' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/IPv4Address.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\IPv6Address' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/IPv6Address.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Long' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/Long.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Short' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/Short.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Type' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/Type.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\TypeBuilder' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/TypeBuilder.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\TypeFactory' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/TypeFactory.php', - 'WP_Ultimo\\Dependencies\\LibDNS\\Records\\Types\\Types' => __DIR__ . '/..' . '/daverandom/libdns/src/Records/Types/Types.php', - 'WP_Ultimo\\Dependencies\\Mexitek\\PHPColors\\Color' => __DIR__ . '/..' . '/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\AssetFetcher' => __DIR__ . '/..' . '/mpdf/mpdf/src/AssetFetcher.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\AbstractBarcode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/AbstractBarcode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\BarcodeException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/BarcodeException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\BarcodeInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/BarcodeInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Codabar' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Codabar.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code11' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code11.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code128' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code128.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code39' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code39.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Code93' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code93.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\EanExt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/EanExt.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\EanUpc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/EanUpc.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\I25' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/I25.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Imb' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Imb.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Msi' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Msi.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Postnet' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Postnet.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\Rm4Scc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Rm4Scc.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Barcode\\S25' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/S25.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Cache' => __DIR__ . '/..' . '/mpdf/mpdf/src/Cache.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\ColorConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorConverter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\ColorModeConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorModeConverter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\ColorSpaceRestrictor' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Color\\NamedColors' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/NamedColors.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Config\\ConfigVariables' => __DIR__ . '/..' . '/mpdf/mpdf/src/Config/ConfigVariables.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Config\\FontVariables' => __DIR__ . '/..' . '/mpdf/mpdf/src/Config/FontVariables.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Container\\ContainerInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/ContainerInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Container\\NotFoundException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/NotFoundException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Container\\SimpleContainer' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/SimpleContainer.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToAlpha' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToAlpha.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToCjk' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToCjk.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToHebrew' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToHebrew.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToOther' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToOther.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Conversion\\DecToRoman' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToRoman.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\CssManager' => __DIR__ . '/..' . '/mpdf/mpdf/src/CssManager.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Css\\Border' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/Border.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Css\\DefaultCss' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/DefaultCss.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Css\\TextVars' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/TextVars.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\DirectWrite' => __DIR__ . '/..' . '/mpdf/mpdf/src/DirectWrite.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Exception\\AssetFetchingException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/AssetFetchingException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Exception\\FontException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/FontException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\File\\LocalContentLoader' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/LocalContentLoader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\File\\LocalContentLoaderInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/LocalContentLoaderInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\File\\StreamWrapperChecker' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/StreamWrapperChecker.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\FontCache' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/FontCache.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\FontFileFinder' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/FontFileFinder.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\GlyphOperator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/GlyphOperator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Fonts\\MetricsGenerator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/MetricsGenerator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Form' => __DIR__ . '/..' . '/mpdf/mpdf/src/Form.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\FpdiTrait' => __DIR__ . '/..' . '/mpdf/mpdf/src/FpdiTrait.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\ColorTable' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/ColorTable.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\FileHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/FileHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\Gif' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Gif.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\Image' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Image.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\ImageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/ImageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gif\\Lzw' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Lzw.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Gradient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gradient.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\HTMLParserMode' => __DIR__ . '/..' . '/mpdf/mpdf/src/HTMLParserMode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\ClientInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\CurlHttpClient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/CurlHttpClient.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\ClientException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/ClientException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\ForbiddenRequestException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\NetworkException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/NetworkException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\Exception\\RequestException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/RequestException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Http\\SocketHttpClient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/SocketHttpClient.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Hyphenator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Hyphenator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\Bmp' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Bmp.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\ImageProcessor' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/ImageProcessor.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\ImageTypeGuesser' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/ImageTypeGuesser.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\Svg' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Svg.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Image\\Wmf' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Wmf.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\LanguageToFont' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/LanguageToFont.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\LanguageToFontInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/LanguageToFontInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\ScriptToLanguage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/ScriptToLanguage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Language\\ScriptToLanguageInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Log\\Context' => __DIR__ . '/..' . '/mpdf/mpdf/src/Log/Context.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Mpdf' => __DIR__ . '/..' . '/mpdf/mpdf/src/Mpdf.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\MpdfException' => __DIR__ . '/..' . '/mpdf/mpdf/src/MpdfException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\MpdfImageException' => __DIR__ . '/..' . '/mpdf/mpdf/src/MpdfImageException.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Otl' => __DIR__ . '/..' . '/mpdf/mpdf/src/Otl.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\OtlDump' => __DIR__ . '/..' . '/mpdf/mpdf/src/OtlDump.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Output\\Destination' => __DIR__ . '/..' . '/mpdf/mpdf/src/Output/Destination.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PageBox' => __DIR__ . '/..' . '/mpdf/mpdf/src/PageBox.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PageFormat' => __DIR__ . '/..' . '/mpdf/mpdf/src/PageFormat.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Pdf\\Protection' => __DIR__ . '/..' . '/mpdf/mpdf/src/Pdf/Protection.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Pdf\\Protection\\UniqidGenerator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Request' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Request.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Response' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Response.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Stream' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Stream.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\Uri' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Uri.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\MpdfPsrLogAwareTrait' => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\PsrLogAwareTrait' => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\ServiceFactory' => __DIR__ . '/..' . '/mpdf/mpdf/src/ServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Shaper\\Indic' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Indic.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Shaper\\Myanmar' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Myanmar.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Shaper\\Sea' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Sea.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\SizeConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/SizeConverter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Strict' => __DIR__ . '/..' . '/mpdf/mpdf/src/Strict.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\TTFontFile' => __DIR__ . '/..' . '/mpdf/mpdf/src/TTFontFile.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\TTFontFileAnalysis' => __DIR__ . '/..' . '/mpdf/mpdf/src/TTFontFileAnalysis.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\TableOfContents' => __DIR__ . '/..' . '/mpdf/mpdf/src/TableOfContents.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\A' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/A.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Acronym' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Acronym.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Address' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Address.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Annotation' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Annotation.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Article' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Article.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Aside' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Aside.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\B' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/B.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\BarCode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BarCode.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Bdi' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bdi.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Bdo' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bdo.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Big' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Big.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\BlockQuote' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BlockQuote.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\BlockTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BlockTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Bookmark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bookmark.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Br' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Br.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Caption' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Caption.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Center' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Center.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Cite' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Cite.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Code' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Code.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\ColumnBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/ColumnBreak.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Columns' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Columns.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Dd' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dd.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Del' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Del.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Details' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Details.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Div' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Div.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Dl' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dl.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\DotTab' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/DotTab.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Dt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dt.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Em' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Em.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\FieldSet' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FieldSet.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\FigCaption' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FigCaption.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Figure' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Figure.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Font' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Font.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Footer' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Footer.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Form' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Form.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\FormFeed' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FormFeed.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H1' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H1.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H2' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H2.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H3' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H3.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H4' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H4.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H5' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H5.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\H6' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H6.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\HGroup' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/HGroup.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Header' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Header.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Hr' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Hr.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\I' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/I.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Img' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Img.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\IndexEntry' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/IndexEntry.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\IndexInsert' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/IndexInsert.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\InlineTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/InlineTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Input' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Input.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ins' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ins.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Kbd' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Kbd.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Legend' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Legend.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Li' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Li.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Main' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Main.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Mark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Mark.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Meter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Meter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Nav' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Nav.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\NewColumn' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/NewColumn.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\NewPage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/NewPage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ol' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ol.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Option' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Option.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\P' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/P.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\PageBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageBreak.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\PageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageFooter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\PageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Pre' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Pre.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Progress' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Progress.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Q' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Q.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\S' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/S.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Samp' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Samp.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Section' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Section.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Select' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Select.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetHtmlPageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetHtmlPageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetPageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetPageFooter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SetPageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetPageHeader.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Small' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Small.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Span' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Span.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Strike' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Strike.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Strong' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Strong.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Sub' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Sub.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\SubstituteTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SubstituteTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Summary' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Summary.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Sup' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Sup.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TBody' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TBody.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TFoot' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TFoot.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\THead' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/THead.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Table' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Table.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Td' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Td.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TextArea' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TextArea.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TextCircle' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TextCircle.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Th' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Th.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Time' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Time.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Toc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Toc.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TocEntry' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TocEntry.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\TocPageBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TocPageBreak.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tr' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tr.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tt.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tta' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tta.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Tts' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tts.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ttz' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ttz.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\U' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/U.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\Ul' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ul.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\VarTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/VarTag.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\WatermarkImage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/WatermarkImage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\WatermarkText' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/WatermarkText.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Ucdn' => __DIR__ . '/..' . '/mpdf/mpdf/src/Ucdn.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\Arrays' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/Arrays.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\NumericString' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/NumericString.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\PdfDate' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/PdfDate.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Utils\\UtfString' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/UtfString.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Watermark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Watermark.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\WatermarkImage' => __DIR__ . '/..' . '/mpdf/mpdf/src/WatermarkImage.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\WatermarkText' => __DIR__ . '/..' . '/mpdf/mpdf/src/WatermarkText.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\BackgroundWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BackgroundWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\BaseWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BaseWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\BookmarkWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BookmarkWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ColorWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ColorWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\FontWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/FontWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\FormWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/FormWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ImageWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ImageWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\JavaScriptWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/JavaScriptWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\MetadataWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/MetadataWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ObjectWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ObjectWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\OptionalContentWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/OptionalContentWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\PageWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/PageWriter.php', - 'WP_Ultimo\\Dependencies\\Mpdf\\Writer\\ResourceWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ResourceWriter.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Factory\\HttplugFactory' => __DIR__ . '/..' . '/nyholm/psr7/src/Factory/HttplugFactory.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Factory\\Psr17Factory' => __DIR__ . '/..' . '/nyholm/psr7/src/Factory/Psr17Factory.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/nyholm/psr7/src/MessageTrait.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Request' => __DIR__ . '/..' . '/nyholm/psr7/src/Request.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\RequestTrait' => __DIR__ . '/..' . '/nyholm/psr7/src/RequestTrait.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Response' => __DIR__ . '/..' . '/nyholm/psr7/src/Response.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/nyholm/psr7/src/ServerRequest.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Stream' => __DIR__ . '/..' . '/nyholm/psr7/src/Stream.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\StreamTrait' => __DIR__ . '/..' . '/nyholm/psr7/src/StreamTrait.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/nyholm/psr7/src/UploadedFile.php', - 'WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\Uri' => __DIR__ . '/..' . '/nyholm/psr7/src/Uri.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Attribute' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\QuoteAwareConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Node' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Node.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagMethodValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagPropertyValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineAnnotation' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArgument' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArray' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArrayItem' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ExtendsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ImplementsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MixinTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamOutTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\SelfOutTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasImportTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypelessParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\UsesTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeForParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\InvalidTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Lexer\\Lexer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\ParserException' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\StringUnescaper' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\TokenIterator' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Parser\\TypeParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Printer\\DiffElem' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/DiffElem.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Printer\\Differ' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/Differ.php', - 'WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\Printer\\Printer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/Printer.php', - 'WP_Ultimo\\Dependencies\\Pablo_Pacheco\\WP_Namespace_Autoloader\\WP_Namespace_Autoloader' => __DIR__ . '/..' . '/pablo-sg-pacheco/wp-namespace-autoloader/src/WP_Namespace_Autoloader.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base32' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base32Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32Hex.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64DotSlash' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64DotSlash.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64DotSlashOrdered' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Base64UrlSafe' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64UrlSafe.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Binary' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Binary.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\EncoderInterface' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/EncoderInterface.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Encoding' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Encoding.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Hex.php', - 'WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\RFC4648' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/RFC4648.php', - 'WP_Ultimo\\Dependencies\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Psr\\Clock\\ClockInterface' => __DIR__ . '/..' . '/psr/clock/src/ClockInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\RequestExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/RequestExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/RequestFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ResponseFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ServerRequestFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/StreamFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UploadedFileFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', - 'WP_Ultimo\\Dependencies\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', - 'WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Attribute' => __DIR__ . '/..' . '/rakit/validation/src/Attribute.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\ErrorBag' => __DIR__ . '/..' . '/rakit/validation/src/ErrorBag.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Helper' => __DIR__ . '/..' . '/rakit/validation/src/Helper.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\MimeTypeGuesser' => __DIR__ . '/..' . '/rakit/validation/src/MimeTypeGuesser.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\MissingRequiredParameterException' => __DIR__ . '/..' . '/rakit/validation/src/MissingRequiredParameterException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rule' => __DIR__ . '/..' . '/rakit/validation/src/Rule.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\RuleNotFoundException' => __DIR__ . '/..' . '/rakit/validation/src/RuleNotFoundException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\RuleQuashException' => __DIR__ . '/..' . '/rakit/validation/src/RuleQuashException.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Accepted' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Accepted.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\After' => __DIR__ . '/..' . '/rakit/validation/src/Rules/After.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Alpha' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Alpha.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\AlphaDash' => __DIR__ . '/..' . '/rakit/validation/src/Rules/AlphaDash.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\AlphaNum' => __DIR__ . '/..' . '/rakit/validation/src/Rules/AlphaNum.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\AlphaSpaces' => __DIR__ . '/..' . '/rakit/validation/src/Rules/AlphaSpaces.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Before' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Before.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Between' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Between.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Boolean' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Boolean.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Callback' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Callback.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Date' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Date.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Defaults' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Defaults.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Different' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Different.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Digits' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Digits.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\DigitsBetween' => __DIR__ . '/..' . '/rakit/validation/src/Rules/DigitsBetween.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Email' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Email.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Extension' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Extension.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\In' => __DIR__ . '/..' . '/rakit/validation/src/Rules/In.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Integer' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Integer.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Interfaces\\BeforeValidate' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Interfaces/BeforeValidate.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Interfaces\\ModifyValue' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Interfaces/ModifyValue.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Ip' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Ip.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Ipv4' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Ipv4.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Ipv6' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Ipv6.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Json' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Json.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Lowercase' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Lowercase.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Max' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Max.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Mimes' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Mimes.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Min' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Min.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\NotIn' => __DIR__ . '/..' . '/rakit/validation/src/Rules/NotIn.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Nullable' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Nullable.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Numeric' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Numeric.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Present' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Present.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Regex' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Regex.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Required' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Required.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredIf' => __DIR__ . '/..' . '/rakit/validation/src/Rules/RequiredIf.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredUnless' => __DIR__ . '/..' . '/rakit/validation/src/Rules/RequiredUnless.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWith' => __DIR__ . '/..' . '/rakit/validation/src/Rules/RequiredWith.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWithAll' => __DIR__ . '/..' . '/rakit/validation/src/Rules/RequiredWithAll.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWithout' => __DIR__ . '/..' . '/rakit/validation/src/Rules/RequiredWithout.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\RequiredWithoutAll' => __DIR__ . '/..' . '/rakit/validation/src/Rules/RequiredWithoutAll.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Same' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Same.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Traits\\DateUtilsTrait' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Traits/DateUtilsTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Traits\\FileTrait' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Traits/FileTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Traits\\SizeTrait' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Traits/SizeTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\TypeArray' => __DIR__ . '/..' . '/rakit/validation/src/Rules/TypeArray.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\UploadedFile' => __DIR__ . '/..' . '/rakit/validation/src/Rules/UploadedFile.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Uppercase' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Uppercase.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Rules\\Url' => __DIR__ . '/..' . '/rakit/validation/src/Rules/Url.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Traits\\MessagesTrait' => __DIR__ . '/..' . '/rakit/validation/src/Traits/MessagesTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Traits\\TranslationsTrait' => __DIR__ . '/..' . '/rakit/validation/src/Traits/TranslationsTrait.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Validation' => __DIR__ . '/..' . '/rakit/validation/src/Validation.php', - 'WP_Ultimo\\Dependencies\\Rakit\\Validation\\Validator' => __DIR__ . '/..' . '/rakit/validation/src/Validator.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\CAAData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/CAAData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\CNAMEData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/CNAMEData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DNSRecord' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/DNSRecord.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DNSRecordCollection' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/DNSRecordCollection.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DNSRecordType' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/DNSRecordType.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\DataAbstract' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/DataAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\EntityAbstract' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/EntityAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Hostname' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/Hostname.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\IPAddress' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/IPAddress.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Interfaces\\Arrayable' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/Interfaces/Arrayable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Interfaces\\DNSRecordInterface' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/Interfaces/DNSRecordInterface.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\Interfaces\\Serializable' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/Interfaces/Serializable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\MXData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/MXData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\NSData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/NSData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\PTRData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/PTRData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\SOAData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/SOAData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\SRVData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/SRVData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Entities\\TXTData' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Entities/TXTData.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Exceptions\\Exception' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Exceptions/Exception.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Exceptions/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Factories\\SpatieDNS' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Factories/SpatieDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\CloudFlare' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Mappers/CloudFlare.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\Dig' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Mappers/Dig.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\GoogleDNS' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Mappers/GoogleDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\LocalSystem' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Mappers/LocalSystem.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\MapperAbstract' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Mappers/MapperAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Mappers\\MapperInterface' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Mappers/MapperInterface.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\DNSQueried' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Events/DNSQueried.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\DNSQueryFailed' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Events/DNSQueryFailed.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\DNSQueryProfiled' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Events/DNSQueryProfiled.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Events\\ObservableEventAbstract' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Events/ObservableEventAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Interfaces\\Observable' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Interfaces/Observable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Interfaces\\ProfileInterface' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Performance/Interfaces/ProfileInterface.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Interfaces\\Time' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Performance/Interfaces/Time.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Profile' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Performance/Profile.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\ProfileFactory' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Performance/ProfileFactory.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Performance\\Timer' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Performance/Timer.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Subscribers\\STDIOSubscriber' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Subscribers/STDIOSubscriber.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Traits\\Dispatcher' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Traits/Dispatcher.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Traits\\Logger' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Traits/Logger.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Observability\\Traits\\Profileable' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Observability/Traits/Profileable.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Cached' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Cached.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Chain' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Chain.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\CloudFlare' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/CloudFlare.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Dig' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Dig.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Exceptions\\QueryFailure' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Exceptions/QueryFailure.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Exceptions\\ReverseLookupFailure' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Exceptions/ReverseLookupFailure.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\GoogleDNS' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/GoogleDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\Chain' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Interfaces/Chain.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\DNSQuery' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Interfaces/DNSQuery.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\ObservableResolver' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Interfaces/ObservableResolver.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\Resolver' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Interfaces/Resolver.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Interfaces\\ReverseDNSQuery' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Interfaces/ReverseDNSQuery.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\LocalSystem' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/LocalSystem.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\ResolverAbstract' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/ResolverAbstract.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Resolvers\\Traits\\Time' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Resolvers/Traits/Time.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Services\\Interfaces\\LocalSystemDNS' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Services/Interfaces/LocalSystemDNS.php', - 'WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\Services\\LocalSystemDNS' => __DIR__ . '/..' . '/remotelyliving/php-dns/src/Services/LocalSystemDNS.php', - 'WP_Ultimo\\Dependencies\\ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Base\\Range' => __DIR__ . '/..' . '/scssphp/scssphp/src/Base/Range.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\AtRootBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/AtRootBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\CallableBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/CallableBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ContentBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ContentBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\DirectiveBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/DirectiveBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\EachBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/EachBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ElseBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ElseBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ElseifBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ElseifBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\ForBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/ForBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\IfBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/IfBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\MediaBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/MediaBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\NestedPropertyBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/NestedPropertyBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Block\\WhileBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block/WhileBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Cache' => __DIR__ . '/..' . '/scssphp/scssphp/src/Cache.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Colors' => __DIR__ . '/..' . '/scssphp/scssphp/src/Colors.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\CompilationResult' => __DIR__ . '/..' . '/scssphp/scssphp/src/CompilationResult.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Compiler' => __DIR__ . '/..' . '/scssphp/scssphp/src/Compiler.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Compiler\\CachedResult' => __DIR__ . '/..' . '/scssphp/scssphp/src/Compiler/CachedResult.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Compiler\\Environment' => __DIR__ . '/..' . '/scssphp/scssphp/src/Compiler/Environment.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\CompilerException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/CompilerException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\ParserException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/ParserException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\RangeException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/RangeException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\SassException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/SassException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\SassScriptException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/SassScriptException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Exception\\ServerException' => __DIR__ . '/..' . '/scssphp/scssphp/src/Exception/ServerException.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Compact' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Compact.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Compressed' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Compressed.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Crunched' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Crunched.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Debug' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Debug.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Expanded' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Expanded.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\Nested' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/Nested.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Formatter\\OutputBlock' => __DIR__ . '/..' . '/scssphp/scssphp/src/Formatter/OutputBlock.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Logger\\LoggerInterface' => __DIR__ . '/..' . '/scssphp/scssphp/src/Logger/LoggerInterface.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Logger\\QuietLogger' => __DIR__ . '/..' . '/scssphp/scssphp/src/Logger/QuietLogger.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Logger\\StreamLogger' => __DIR__ . '/..' . '/scssphp/scssphp/src/Logger/StreamLogger.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Node' => __DIR__ . '/..' . '/scssphp/scssphp/src/Node.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Node\\Number' => __DIR__ . '/..' . '/scssphp/scssphp/src/Node/Number.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\OutputStyle' => __DIR__ . '/..' . '/scssphp/scssphp/src/OutputStyle.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Parser' => __DIR__ . '/..' . '/scssphp/scssphp/src/Parser.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\SourceMap\\Base64' => __DIR__ . '/..' . '/scssphp/scssphp/src/SourceMap/Base64.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\SourceMap\\Base64VLQ' => __DIR__ . '/..' . '/scssphp/scssphp/src/SourceMap/Base64VLQ.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\SourceMap\\SourceMapGenerator' => __DIR__ . '/..' . '/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Type' => __DIR__ . '/..' . '/scssphp/scssphp/src/Type.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Util' => __DIR__ . '/..' . '/scssphp/scssphp/src/Util.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Util\\Path' => __DIR__ . '/..' . '/scssphp/scssphp/src/Util/Path.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\ValueConverter' => __DIR__ . '/..' . '/scssphp/scssphp/src/ValueConverter.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Version' => __DIR__ . '/..' . '/scssphp/scssphp/src/Version.php', - 'WP_Ultimo\\Dependencies\\ScssPhp\\ScssPhp\\Warn' => __DIR__ . '/..' . '/scssphp/scssphp/src/Warn.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\Dns' => __DIR__ . '/..' . '/spatie/dns/src/Dns.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\Exceptions\\CouldNotFetchDns' => __DIR__ . '/..' . '/spatie/dns/src/Exceptions/CouldNotFetchDns.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Dns\\Exceptions\\InvalidArgument' => __DIR__ . '/..' . '/spatie/dns/src/Exceptions/InvalidArgument.php', - 'WP_Ultimo\\Dependencies\\Spatie\\Macroable\\Macroable' => __DIR__ . '/..' . '/spatie/macroable/src/Macroable.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Downloader' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Downloader.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate\\HostDoesNotExist' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/HostDoesNotExist.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate\\NoCertificateInstalled' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/NoCertificateInstalled.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\CouldNotDownloadCertificate\\UnknownError' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate/UnknownError.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\InvalidIpAddress' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Exceptions/InvalidIpAddress.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Exceptions\\InvalidUrl' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Exceptions/InvalidUrl.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\SslCertificate' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/SslCertificate.php', - 'WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\Url' => __DIR__ . '/..' . '/spatie/ssl-certificate/src/Url.php', - 'WP_Ultimo\\Dependencies\\Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Account' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Account.php', - 'WP_Ultimo\\Dependencies\\Stripe\\AccountLink' => __DIR__ . '/..' . '/stripe/stripe-php/lib/AccountLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\All' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/All.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Create' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/Create.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Delete' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/Delete.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\NestedResource' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/NestedResource.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Request' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/Request.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Retrieve' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/Retrieve.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Search' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/Search.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\SingletonRetrieve' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiOperations\\Update' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiOperations/Update.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiRequestor' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiRequestor.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiResource' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiResource.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApiResponse' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApiResponse.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApplePayDomain' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApplePayDomain.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApplicationFee' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApplicationFee.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ApplicationFeeRefund' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ApplicationFeeRefund.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Apps\\Secret' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Apps/Secret.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Balance' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Balance.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BalanceTransaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/BalanceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BankAccount' => __DIR__ . '/..' . '/stripe/stripe-php/lib/BankAccount.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BaseStripeClient' => __DIR__ . '/..' . '/stripe/stripe-php/lib/BaseStripeClient.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BaseStripeClientInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/BaseStripeClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BillingPortal\\Configuration' => __DIR__ . '/..' . '/stripe/stripe-php/lib/BillingPortal/Configuration.php', - 'WP_Ultimo\\Dependencies\\Stripe\\BillingPortal\\Session' => __DIR__ . '/..' . '/stripe/stripe-php/lib/BillingPortal/Session.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Capability' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Capability.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Card' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Card.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CashBalance' => __DIR__ . '/..' . '/stripe/stripe-php/lib/CashBalance.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Charge' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Charge.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Checkout\\Session' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Checkout/Session.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Collection' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Collection.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CountrySpec' => __DIR__ . '/..' . '/stripe/stripe-php/lib/CountrySpec.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Coupon' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Coupon.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CreditNote' => __DIR__ . '/..' . '/stripe/stripe-php/lib/CreditNote.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CreditNoteLineItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/CreditNoteLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Customer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Customer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CustomerBalanceTransaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/CustomerBalanceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\CustomerCashBalanceTransaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Discount' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Discount.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Dispute' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Dispute.php', - 'WP_Ultimo\\Dependencies\\Stripe\\EphemeralKey' => __DIR__ . '/..' . '/stripe/stripe-php/lib/EphemeralKey.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ErrorObject' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ErrorObject.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Event' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Event.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\ApiConnectionException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/ApiConnectionException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\ApiErrorException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/ApiErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/AuthenticationException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/BadMethodCallException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\CardException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/CardException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\IdempotencyException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/IdempotencyException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\InvalidRequestException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/InvalidRequestException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\ExceptionInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidClientException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/InvalidClientException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidGrantException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/InvalidGrantException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidRequestException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/InvalidRequestException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\InvalidScopeException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/InvalidScopeException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\OAuthErrorException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/OAuthErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\UnknownOAuthErrorException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\UnsupportedGrantTypeException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\OAuth\\UnsupportedResponseTypeException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\PermissionException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/PermissionException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\RateLimitException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/RateLimitException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\SignatureVerificationException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/SignatureVerificationException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/UnexpectedValueException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Exception\\UnknownApiErrorException' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Exception/UnknownApiErrorException.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ExchangeRate' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ExchangeRate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\File' => __DIR__ . '/..' . '/stripe/stripe-php/lib/File.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FileLink' => __DIR__ . '/..' . '/stripe/stripe-php/lib/FileLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\Account' => __DIR__ . '/..' . '/stripe/stripe-php/lib/FinancialConnections/Account.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\AccountOwner' => __DIR__ . '/..' . '/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\AccountOwnership' => __DIR__ . '/..' . '/stripe/stripe-php/lib/FinancialConnections/AccountOwnership.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FinancialConnections\\Session' => __DIR__ . '/..' . '/stripe/stripe-php/lib/FinancialConnections/Session.php', - 'WP_Ultimo\\Dependencies\\Stripe\\FundingInstructions' => __DIR__ . '/..' . '/stripe/stripe-php/lib/FundingInstructions.php', - 'WP_Ultimo\\Dependencies\\Stripe\\HttpClient\\ClientInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/HttpClient/ClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\HttpClient\\CurlClient' => __DIR__ . '/..' . '/stripe/stripe-php/lib/HttpClient/CurlClient.php', - 'WP_Ultimo\\Dependencies\\Stripe\\HttpClient\\StreamingClientInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Identity\\VerificationReport' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Identity/VerificationReport.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Identity\\VerificationSession' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Identity/VerificationSession.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Invoice' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Invoice.php', - 'WP_Ultimo\\Dependencies\\Stripe\\InvoiceItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/InvoiceItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\InvoiceLineItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/InvoiceLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Authorization' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Issuing/Authorization.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Card' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Issuing/Card.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\CardDetails' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Issuing/CardDetails.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Cardholder' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Issuing/Cardholder.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Dispute' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Issuing/Dispute.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Issuing\\Transaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Issuing/Transaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\LineItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/LineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\LoginLink' => __DIR__ . '/..' . '/stripe/stripe-php/lib/LoginLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Mandate' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Mandate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\OAuth' => __DIR__ . '/..' . '/stripe/stripe-php/lib/OAuth.php', - 'WP_Ultimo\\Dependencies\\Stripe\\OAuthErrorObject' => __DIR__ . '/..' . '/stripe/stripe-php/lib/OAuthErrorObject.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PaymentIntent' => __DIR__ . '/..' . '/stripe/stripe-php/lib/PaymentIntent.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PaymentLink' => __DIR__ . '/..' . '/stripe/stripe-php/lib/PaymentLink.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PaymentMethod' => __DIR__ . '/..' . '/stripe/stripe-php/lib/PaymentMethod.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Payout' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Payout.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Person' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Person.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Plan' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Plan.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Price' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Price.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Product' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Product.php', - 'WP_Ultimo\\Dependencies\\Stripe\\PromotionCode' => __DIR__ . '/..' . '/stripe/stripe-php/lib/PromotionCode.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Quote' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Quote.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Radar\\EarlyFraudWarning' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Radar\\ValueList' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Radar/ValueList.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Radar\\ValueListItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Radar/ValueListItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\RecipientTransfer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/RecipientTransfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Refund' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Refund.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Reporting\\ReportRun' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Reporting/ReportRun.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Reporting\\ReportType' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Reporting/ReportType.php', - 'WP_Ultimo\\Dependencies\\Stripe\\RequestTelemetry' => __DIR__ . '/..' . '/stripe/stripe-php/lib/RequestTelemetry.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Review' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Review.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SearchResult' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SearchResult.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AbstractService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/AbstractService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AbstractServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/AbstractServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AccountLinkService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/AccountLinkService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\AccountService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/AccountService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ApplePayDomainService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ApplePayDomainService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ApplicationFeeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ApplicationFeeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Apps\\AppsServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Apps\\SecretService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Apps/SecretService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BalanceService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/BalanceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BalanceTransactionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/BalanceTransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BillingPortal\\BillingPortalServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BillingPortal\\ConfigurationService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\BillingPortal\\SessionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ChargeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ChargeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Checkout\\CheckoutServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Checkout\\SessionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Checkout/SessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CoreServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/CoreServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CountrySpecService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/CountrySpecService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CouponService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/CouponService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CreditNoteService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/CreditNoteService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\CustomerService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/CustomerService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\DisputeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/DisputeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\EphemeralKeyService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/EphemeralKeyService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\EventService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/EventService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ExchangeRateService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ExchangeRateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FileLinkService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/FileLinkService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FileService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/FileService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FinancialConnections\\AccountService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FinancialConnections\\FinancialConnectionsServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\FinancialConnections\\SessionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Identity\\IdentityServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Identity\\VerificationReportService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Identity\\VerificationSessionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\InvoiceItemService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/InvoiceItemService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\InvoiceService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/InvoiceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\AuthorizationService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\CardService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Issuing/CardService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\CardholderService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Issuing/CardholderService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\DisputeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Issuing/DisputeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\IssuingServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Issuing\\TransactionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Issuing/TransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\MandateService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/MandateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\OAuthService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/OAuthService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PaymentIntentService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PaymentIntentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PaymentLinkService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PaymentLinkService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PaymentMethodService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PaymentMethodService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PayoutService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PayoutService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PlanService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PlanService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PriceService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PriceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ProductService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ProductService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\PromotionCodeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/PromotionCodeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\QuoteService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/QuoteService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\EarlyFraudWarningService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\RadarServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\ValueListItemService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Radar\\ValueListService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Radar/ValueListService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\RefundService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/RefundService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Reporting\\ReportRunService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Reporting\\ReportTypeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Reporting\\ReportingServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ReviewService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ReviewService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SetupAttemptService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/SetupAttemptService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SetupIntentService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/SetupIntentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\ShippingRateService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/ShippingRateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Sigma\\ScheduledQueryRunService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Sigma\\SigmaServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SourceService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/SourceService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SubscriptionItemService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/SubscriptionItemService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SubscriptionScheduleService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\SubscriptionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/SubscriptionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TaxCodeService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TaxCodeService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TaxRateService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TaxRateService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\CalculationService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Tax/CalculationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\SettingsService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Tax/SettingsService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\TaxServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Tax\\TransactionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Tax/TransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\ConfigurationService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\ConnectionTokenService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\LocationService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Terminal/LocationService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\ReaderService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Terminal/ReaderService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Terminal\\TerminalServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\CustomerService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Issuing\\CardService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Issuing\\IssuingServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\RefundService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Terminal\\ReaderService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Terminal\\TerminalServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\TestClockService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\TestHelpersServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\InboundTransferService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\OutboundPaymentService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\OutboundTransferService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\ReceivedCreditService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\ReceivedDebitService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TestHelpers\\Treasury\\TreasuryServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TokenService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TokenService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TopupService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TopupService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\TransferService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/TransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\CreditReversalService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\DebitReversalService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\FinancialAccountService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\InboundTransferService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\OutboundPaymentService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\OutboundTransferService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\ReceivedCreditService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\ReceivedDebitService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\TransactionEntryService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\TransactionService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/TransactionService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\Treasury\\TreasuryServiceFactory' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Service\\WebhookEndpointService' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Service/WebhookEndpointService.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SetupAttempt' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SetupAttempt.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SetupIntent' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SetupIntent.php', - 'WP_Ultimo\\Dependencies\\Stripe\\ShippingRate' => __DIR__ . '/..' . '/stripe/stripe-php/lib/ShippingRate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Sigma\\ScheduledQueryRun' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SingletonApiResource' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SingletonApiResource.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Source' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Source.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SourceTransaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SourceTransaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Stripe' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeClient' => __DIR__ . '/..' . '/stripe/stripe-php/lib/StripeClient.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeClientInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/StripeClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeObject' => __DIR__ . '/..' . '/stripe/stripe-php/lib/StripeObject.php', - 'WP_Ultimo\\Dependencies\\Stripe\\StripeStreamingClientInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/StripeStreamingClientInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Subscription' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Subscription.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SubscriptionItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SubscriptionItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\SubscriptionSchedule' => __DIR__ . '/..' . '/stripe/stripe-php/lib/SubscriptionSchedule.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TaxCode' => __DIR__ . '/..' . '/stripe/stripe-php/lib/TaxCode.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TaxId' => __DIR__ . '/..' . '/stripe/stripe-php/lib/TaxId.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TaxRate' => __DIR__ . '/..' . '/stripe/stripe-php/lib/TaxRate.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\Calculation' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Tax/Calculation.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\CalculationLineItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Tax/CalculationLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\Settings' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Tax/Settings.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\Transaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Tax/Transaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Tax\\TransactionLineItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Tax/TransactionLineItem.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\Configuration' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Terminal/Configuration.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\ConnectionToken' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Terminal/ConnectionToken.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\Location' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Terminal/Location.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Terminal\\Reader' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Terminal/Reader.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TestHelpers\\TestClock' => __DIR__ . '/..' . '/stripe/stripe-php/lib/TestHelpers/TestClock.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Token' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Token.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Topup' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Topup.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Transfer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Transfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\TransferReversal' => __DIR__ . '/..' . '/stripe/stripe-php/lib/TransferReversal.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\CreditReversal' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/CreditReversal.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\DebitReversal' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/DebitReversal.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\FinancialAccount' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/FinancialAccount.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\FinancialAccountFeatures' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\InboundTransfer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/InboundTransfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\OutboundPayment' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/OutboundPayment.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\OutboundTransfer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/OutboundTransfer.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\ReceivedCredit' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/ReceivedCredit.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\ReceivedDebit' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/ReceivedDebit.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\Transaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/Transaction.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Treasury\\TransactionEntry' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Treasury/TransactionEntry.php', - 'WP_Ultimo\\Dependencies\\Stripe\\UsageRecord' => __DIR__ . '/..' . '/stripe/stripe-php/lib/UsageRecord.php', - 'WP_Ultimo\\Dependencies\\Stripe\\UsageRecordSummary' => __DIR__ . '/..' . '/stripe/stripe-php/lib/UsageRecordSummary.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\ApiVersion' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/ApiVersion.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\CaseInsensitiveArray' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/CaseInsensitiveArray.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\DefaultLogger' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/DefaultLogger.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\LoggerInterface' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/LoggerInterface.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\ObjectTypes' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/ObjectTypes.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\RandomGenerator' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/RandomGenerator.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\RequestOptions' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/RequestOptions.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\Set' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/Set.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Util\\Util' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Util/Util.php', - 'WP_Ultimo\\Dependencies\\Stripe\\Webhook' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Webhook.php', - 'WP_Ultimo\\Dependencies\\Stripe\\WebhookEndpoint' => __DIR__ . '/..' . '/stripe/stripe-php/lib/WebhookEndpoint.php', - 'WP_Ultimo\\Dependencies\\Stripe\\WebhookSignature' => __DIR__ . '/..' . '/stripe/stripe-php/lib/WebhookSignature.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ApcuAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ArrayAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineDbalAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/MemcachedAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/NullAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => __DIR__ . '/..' . '/symfony/cache/Adapter/ParameterNormalizer.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PdoAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpArrayAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpFilesAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ProxyAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/Psr16Adapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CacheCollectorPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\DoctrineProvider' => __DIR__ . '/..' . '/symfony/cache/DoctrineProvider.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/cache/Exception/LogicException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\LockRegistry' => __DIR__ . '/..' . '/symfony/cache/LockRegistry.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DefaultMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DeflateMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => __DIR__ . '/..' . '/symfony/cache/Marshaller/MarshallerInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/SodiumMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/TagAwareMarshaller.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationHandler.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationMessage.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\PruneableInterface' => __DIR__ . '/..' . '/symfony/cache/PruneableInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Psr16Cache' => __DIR__ . '/..' . '/symfony/cache/Psr16Cache.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\ResettableInterface' => __DIR__ . '/..' . '/symfony/cache/ResettableInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractAdapterTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\ContractsTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ContractsTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemCommonTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ProxyTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterNodeProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Attribute/AsEventListener.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcherInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\LegacyEventDispatcherProxy' => __DIR__ . '/..' . '/symfony/event-dispatcher/LegacyEventDispatcherProxy.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ClassNotFoundException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ExceptionInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/LogicException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Hydrator.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Instantiator' => __DIR__ . '/..' . '/symfony/var-exporter/Instantiator.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Exporter' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Exporter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Hydrator.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectRegistry.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectState.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Reference' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Reference.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\LazyGhostTrait' => __DIR__ . '/..' . '/symfony/var-exporter/LazyGhostTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\LazyObjectInterface' => __DIR__ . '/..' . '/symfony/var-exporter/LazyObjectInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\LazyProxyTrait' => __DIR__ . '/..' . '/symfony/var-exporter/LazyProxyTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\ProxyHelper' => __DIR__ . '/..' . '/symfony/var-exporter/ProxyHelper.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\ItemInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/ItemInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/TagAwareCacheInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/Event.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatableInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php', - 'WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php', - 'WP_Ultimo\\Dependencies\\UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', - 'WP_Ultimo\\Dependencies\\ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', - 'WP_Ultimo\\Dependencies\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Exception\\PcreException' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoType.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShape' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShapeItem' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\ConstExpression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\FloatValue' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerValue' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\StringValue' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\AggregatedType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\ArrayKey' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\CallableParameter' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/CallableParameter.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Expression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Expression.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\InterfaceString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Intersection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Intersection.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Never_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Never_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', - 'WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\Utils' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Utils.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdfTpl' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTpl.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdfTplTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTplTrait.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdfTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTrait.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Fpdi.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdiException' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdiException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\FpdiTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdiTrait.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\GraphicsState' => __DIR__ . '/..' . '/setasign/fpdi/src/GraphicsState.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Math\\Matrix' => __DIR__ . '/..' . '/setasign/fpdi/src/Math/Matrix.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Math\\Vector' => __DIR__ . '/..' . '/setasign/fpdi/src/Math/Vector.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\AbstractReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReference' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReferenceException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\FixedReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\LineReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\CrossReference\\ReaderInterface' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Ascii85.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85Exception' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\AsciiHex' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\FilterException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FilterException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\FilterInterface' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Flate' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Flate.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\FlateException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FlateException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\Lzw' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Lzw.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Filter\\LzwException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/LzwException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\PdfParser' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/PdfParser.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\PdfParserException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/PdfParserException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\StreamReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/StreamReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Tokenizer' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Tokenizer.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfArray' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfArray.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfBoolean' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfDictionary' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfHexString' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfHexString.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObject' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObjectReference' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfName' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfName.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfNull' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfNull.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfNumeric' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfStream' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfStream.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfString' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfString.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfToken' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfToken.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfType' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfType.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfParser\\Type\\PdfTypeException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\DataStructure\\Rectangle' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\Page' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/Page.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\PageBoundaries' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PageBoundaries.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\PdfReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PdfReader.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\PdfReader\\PdfReaderException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PdfReaderException.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\TcpdfFpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/TcpdfFpdi.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Tcpdf\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Tcpdf/Fpdi.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Tfpdf\\FpdfTpl' => __DIR__ . '/..' . '/setasign/fpdi/src/Tfpdf/FpdfTpl.php', - 'WP_Ultimo\\Dependencies\\setasign\\Fpdi\\Tfpdf\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Tfpdf/Fpdi.php', - 'WP_Ultimo\\Models\\Traits\\Billable' => __DIR__ . '/../..' . '/inc/models/traits/trait-billable.php', - 'WP_Ultimo\\Models\\Traits\\Limitable' => __DIR__ . '/../..' . '/inc/models/traits/trait-limitable.php', - 'WP_Ultimo\\Models\\Traits\\Notable' => __DIR__ . '/../..' . '/inc/models/traits/trait-notable.php', - 'WP_Ultimo\\Traits\\Singleton' => __DIR__ . '/../..' . '/inc/traits/trait-singleton.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Coupon_Deprecated' => __DIR__ . '/../..' . '/inc/traits/trait-wp-ultimo-coupon-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Deprecated' => __DIR__ . '/../..' . '/inc/traits/trait-wp-ultimo-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Plan_Deprecated' => __DIR__ . '/../..' . '/inc/traits/trait-wp-ultimo-plan-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Settings_Deprecated' => __DIR__ . '/../..' . '/inc/traits/trait-wp-ultimo-settings-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Site_Deprecated' => __DIR__ . '/../..' . '/inc/traits/trait-wp-ultimo-site-deprecated.php', - 'WP_Ultimo\\Traits\\WP_Ultimo_Subscription_Deprecated' => __DIR__ . '/../..' . '/inc/traits/trait-wp-ultimo-subscription-deprecated.php', - 'bcmath_compat\\BCMath' => __DIR__ . '/..' . '/phpseclib/bcmath_compat/src/BCMath.php', - 'phpseclib3\\Common\\Functions\\Strings' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php', - 'phpseclib3\\Crypt\\AES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php', - 'phpseclib3\\Crypt\\Blowfish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php', - 'phpseclib3\\Crypt\\ChaCha20' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php', - 'phpseclib3\\Crypt\\Common\\AsymmetricKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php', - 'phpseclib3\\Crypt\\Common\\BlockCipher' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\JWK' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\Common\\Formats\\Signature\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php', - 'phpseclib3\\Crypt\\Common\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php', - 'phpseclib3\\Crypt\\Common\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php', - 'phpseclib3\\Crypt\\Common\\StreamCipher' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php', - 'phpseclib3\\Crypt\\Common\\SymmetricKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php', - 'phpseclib3\\Crypt\\Common\\Traits\\Fingerprint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php', - 'phpseclib3\\Crypt\\Common\\Traits\\PasswordProtected' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php', - 'phpseclib3\\Crypt\\DES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DES.php', - 'phpseclib3\\Crypt\\DH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH.php', - 'phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\DH\\Parameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php', - 'phpseclib3\\Crypt\\DH\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php', - 'phpseclib3\\Crypt\\DH\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php', - 'phpseclib3\\Crypt\\DSA' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\XML' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Signature\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Signature\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php', - 'phpseclib3\\Crypt\\DSA\\Formats\\Signature\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php', - 'phpseclib3\\Crypt\\DSA\\Parameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php', - 'phpseclib3\\Crypt\\DSA\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php', - 'phpseclib3\\Crypt\\DSA\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php', - 'phpseclib3\\Crypt\\EC' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Binary' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\KoblitzPrime' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Montgomery' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\Prime' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php', - 'phpseclib3\\Crypt\\EC\\BaseCurves\\TwistedEdwards' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Curve25519' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Curve448' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Ed25519' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php', - 'phpseclib3\\Crypt\\EC\\Curves\\Ed448' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistb233' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistb409' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk163' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk233' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk283' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistk409' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp192' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp224' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp256' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp384' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistp521' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php', - 'phpseclib3\\Crypt\\EC\\Curves\\nistt571' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime192v1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime192v2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime192v3' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime239v1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime239v2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime239v3' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php', - 'phpseclib3\\Crypt\\EC\\Curves\\prime256v1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp112r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp112r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp128r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp128r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp160k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp160r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp160r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp192k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp192r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp224k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp224r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp256k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp256r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp384r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\secp521r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect113r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect113r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect131r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect131r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect163k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect163r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect163r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect193r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect193r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect233k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect233r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect239k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect283k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect283r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect409k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect409r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect571k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php', - 'phpseclib3\\Crypt\\EC\\Curves\\sect571r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\Common' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\JWK' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPrivate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPublic' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\XML' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\libsodium' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Signature\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Signature\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php', - 'phpseclib3\\Crypt\\EC\\Formats\\Signature\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php', - 'phpseclib3\\Crypt\\EC\\Parameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php', - 'phpseclib3\\Crypt\\EC\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php', - 'phpseclib3\\Crypt\\EC\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php', - 'phpseclib3\\Crypt\\Hash' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Hash.php', - 'phpseclib3\\Crypt\\PublicKeyLoader' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php', - 'phpseclib3\\Crypt\\RC2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RC2.php', - 'phpseclib3\\Crypt\\RC4' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RC4.php', - 'phpseclib3\\Crypt\\RSA' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\JWK' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\MSBLOB' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PSS' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php', - 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\XML' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php', - 'phpseclib3\\Crypt\\RSA\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php', - 'phpseclib3\\Crypt\\RSA\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php', - 'phpseclib3\\Crypt\\Random' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php', - 'phpseclib3\\Crypt\\Rijndael' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php', - 'phpseclib3\\Crypt\\Salsa20' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php', - 'phpseclib3\\Crypt\\TripleDES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php', - 'phpseclib3\\Crypt\\Twofish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php', - 'phpseclib3\\Exception\\BadConfigurationException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php', - 'phpseclib3\\Exception\\BadDecryptionException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php', - 'phpseclib3\\Exception\\BadModeException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php', - 'phpseclib3\\Exception\\ConnectionClosedException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php', - 'phpseclib3\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php', - 'phpseclib3\\Exception\\InconsistentSetupException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php', - 'phpseclib3\\Exception\\InsufficientSetupException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php', - 'phpseclib3\\Exception\\NoKeyLoadedException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php', - 'phpseclib3\\Exception\\NoSupportedAlgorithmsException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php', - 'phpseclib3\\Exception\\UnableToConnectException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php', - 'phpseclib3\\Exception\\UnsupportedAlgorithmException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php', - 'phpseclib3\\Exception\\UnsupportedCurveException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php', - 'phpseclib3\\Exception\\UnsupportedFormatException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php', - 'phpseclib3\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php', - 'phpseclib3\\File\\ANSI' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ANSI.php', - 'phpseclib3\\File\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1.php', - 'phpseclib3\\File\\ASN1\\Element' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php', - 'phpseclib3\\File\\ASN1\\Maps\\AccessDescription' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php', - 'phpseclib3\\File\\ASN1\\Maps\\AdministrationDomainName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php', - 'phpseclib3\\File\\ASN1\\Maps\\AlgorithmIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\AnotherName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php', - 'phpseclib3\\File\\ASN1\\Maps\\Attribute' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php', - 'phpseclib3\\File\\ASN1\\Maps\\AttributeType' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php', - 'phpseclib3\\File\\ASN1\\Maps\\AttributeTypeAndValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\AttributeValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\Attributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\AuthorityInfoAccessSyntax' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php', - 'phpseclib3\\File\\ASN1\\Maps\\AuthorityKeyIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\BaseDistance' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php', - 'phpseclib3\\File\\ASN1\\Maps\\BasicConstraints' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php', - 'phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttribute' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php', - 'phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\BuiltInStandardAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\CPSuri' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php', - 'phpseclib3\\File\\ASN1\\Maps\\CRLDistributionPoints' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php', - 'phpseclib3\\File\\ASN1\\Maps\\CRLNumber' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php', - 'phpseclib3\\File\\ASN1\\Maps\\CRLReason' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertPolicyId' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php', - 'phpseclib3\\File\\ASN1\\Maps\\Certificate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificateIssuer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificateList' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificatePolicies' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificateSerialNumber' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificationRequest' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php', - 'phpseclib3\\File\\ASN1\\Maps\\CertificationRequestInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\Characteristic_two' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php', - 'phpseclib3\\File\\ASN1\\Maps\\CountryName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php', - 'phpseclib3\\File\\ASN1\\Maps\\Curve' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php', - 'phpseclib3\\File\\ASN1\\Maps\\DHParameter' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php', - 'phpseclib3\\File\\ASN1\\Maps\\DSAParams' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php', - 'phpseclib3\\File\\ASN1\\Maps\\DSAPrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\DSAPublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\DigestInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\DirectoryString' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php', - 'phpseclib3\\File\\ASN1\\Maps\\DisplayText' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php', - 'phpseclib3\\File\\ASN1\\Maps\\DistributionPoint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php', - 'phpseclib3\\File\\ASN1\\Maps\\DistributionPointName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php', - 'phpseclib3\\File\\ASN1\\Maps\\DssSigValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\ECParameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php', - 'phpseclib3\\File\\ASN1\\Maps\\ECPoint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php', - 'phpseclib3\\File\\ASN1\\Maps\\ECPrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\EDIPartyName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php', - 'phpseclib3\\File\\ASN1\\Maps\\EcdsaSigValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php', - 'phpseclib3\\File\\ASN1\\Maps\\EncryptedData' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php', - 'phpseclib3\\File\\ASN1\\Maps\\EncryptedPrivateKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\ExtKeyUsageSyntax' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php', - 'phpseclib3\\File\\ASN1\\Maps\\Extension' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php', - 'phpseclib3\\File\\ASN1\\Maps\\ExtensionAttribute' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php', - 'phpseclib3\\File\\ASN1\\Maps\\ExtensionAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\Extensions' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php', - 'phpseclib3\\File\\ASN1\\Maps\\FieldElement' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php', - 'phpseclib3\\File\\ASN1\\Maps\\FieldID' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralNames' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralSubtree' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php', - 'phpseclib3\\File\\ASN1\\Maps\\GeneralSubtrees' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php', - 'phpseclib3\\File\\ASN1\\Maps\\HashAlgorithm' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php', - 'phpseclib3\\File\\ASN1\\Maps\\HoldInstructionCode' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php', - 'phpseclib3\\File\\ASN1\\Maps\\InvalidityDate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php', - 'phpseclib3\\File\\ASN1\\Maps\\IssuerAltName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php', - 'phpseclib3\\File\\ASN1\\Maps\\IssuingDistributionPoint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php', - 'phpseclib3\\File\\ASN1\\Maps\\KeyIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\KeyPurposeId' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php', - 'phpseclib3\\File\\ASN1\\Maps\\KeyUsage' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php', - 'phpseclib3\\File\\ASN1\\Maps\\MaskGenAlgorithm' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php', - 'phpseclib3\\File\\ASN1\\Maps\\Name' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php', - 'phpseclib3\\File\\ASN1\\Maps\\NameConstraints' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php', - 'phpseclib3\\File\\ASN1\\Maps\\NetworkAddress' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php', - 'phpseclib3\\File\\ASN1\\Maps\\NoticeReference' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php', - 'phpseclib3\\File\\ASN1\\Maps\\NumericUserIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\ORAddress' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php', - 'phpseclib3\\File\\ASN1\\Maps\\OneAsymmetricKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\OrganizationName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php', - 'phpseclib3\\File\\ASN1\\Maps\\OrganizationalUnitNames' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php', - 'phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfos' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBEParameter' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBES2params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBKDF2params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php', - 'phpseclib3\\File\\ASN1\\Maps\\PBMAC1params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php', - 'phpseclib3\\File\\ASN1\\Maps\\PKCS9String' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php', - 'phpseclib3\\File\\ASN1\\Maps\\Pentanomial' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php', - 'phpseclib3\\File\\ASN1\\Maps\\PersonalName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyInformation' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyMappings' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierId' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php', - 'phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\PostalAddress' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php', - 'phpseclib3\\File\\ASN1\\Maps\\Prime_p' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateDomainName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\PrivateKeyUsagePeriod' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php', - 'phpseclib3\\File\\ASN1\\Maps\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\PublicKeyAndChallenge' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php', - 'phpseclib3\\File\\ASN1\\Maps\\PublicKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\RC2CBCParameter' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php', - 'phpseclib3\\File\\ASN1\\Maps\\RDNSequence' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php', - 'phpseclib3\\File\\ASN1\\Maps\\RSAPrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\RSAPublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php', - 'phpseclib3\\File\\ASN1\\Maps\\RSASSA_PSS_params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php', - 'phpseclib3\\File\\ASN1\\Maps\\ReasonFlags' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php', - 'phpseclib3\\File\\ASN1\\Maps\\RelativeDistinguishedName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php', - 'phpseclib3\\File\\ASN1\\Maps\\RevokedCertificate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php', - 'phpseclib3\\File\\ASN1\\Maps\\SignedPublicKeyAndChallenge' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php', - 'phpseclib3\\File\\ASN1\\Maps\\SpecifiedECDomain' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectAltName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectDirectoryAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectInfoAccessSyntax' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php', - 'phpseclib3\\File\\ASN1\\Maps\\SubjectPublicKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php', - 'phpseclib3\\File\\ASN1\\Maps\\TBSCertList' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php', - 'phpseclib3\\File\\ASN1\\Maps\\TBSCertificate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php', - 'phpseclib3\\File\\ASN1\\Maps\\TerminalIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\Time' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php', - 'phpseclib3\\File\\ASN1\\Maps\\Trinomial' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php', - 'phpseclib3\\File\\ASN1\\Maps\\UniqueIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php', - 'phpseclib3\\File\\ASN1\\Maps\\UserNotice' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php', - 'phpseclib3\\File\\ASN1\\Maps\\Validity' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php', - 'phpseclib3\\File\\ASN1\\Maps\\netscape_ca_policy_url' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php', - 'phpseclib3\\File\\ASN1\\Maps\\netscape_cert_type' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php', - 'phpseclib3\\File\\ASN1\\Maps\\netscape_comment' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php', - 'phpseclib3\\File\\X509' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/X509.php', - 'phpseclib3\\Math\\BigInteger' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\BuiltIn' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\DefaultEngine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\OpenSSL' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\Barrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\EvalBarrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\Engine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\GMP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\GMP\\DefaultEngine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\OpenSSL' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP32' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP64' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\DefaultEngine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Montgomery' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\OpenSSL' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Barrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Classic' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\EvalBarrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Montgomery' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\MontgomeryMult' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php', - 'phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\PowerOfTwo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php', - 'phpseclib3\\Math\\BinaryField' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BinaryField.php', - 'phpseclib3\\Math\\BinaryField\\Integer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php', - 'phpseclib3\\Math\\Common\\FiniteField' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php', - 'phpseclib3\\Math\\Common\\FiniteField\\Integer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php', - 'phpseclib3\\Math\\PrimeField' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/PrimeField.php', - 'phpseclib3\\Math\\PrimeField\\Integer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php', - 'phpseclib3\\Net\\SFTP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SFTP.php', - 'phpseclib3\\Net\\SFTP\\Stream' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php', - 'phpseclib3\\Net\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php', - 'phpseclib3\\System\\SSH\\Agent' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php', - 'phpseclib3\\System\\SSH\\Agent\\Identity' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php', - 'phpseclib3\\System\\SSH\\Common\\Traits\\ReadBytes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitWPUltimoDependencies::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitWPUltimoDependencies::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInitWPUltimoDependencies::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/dependencies/composer/installed.json b/dependencies/composer/installed.json deleted file mode 100644 index f8266a9..0000000 --- a/dependencies/composer/installed.json +++ /dev/null @@ -1,5605 +0,0 @@ -{ - "packages": [ - { - "name": "amphp\/amp", - "version": "v2.6.2", - "version_normalized": "2.6.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/amp\/zipball\/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1", - "ext-json": "*", - "jetbrains\/phpstorm-stubs": "^2019.3", - "phpunit\/phpunit": "^7 | ^8 | ^9", - "psalm\/phar": "^3.11@dev", - "react\/promise": "^2" - }, - "time": "2022-02-20T17:52:18+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "lib\/functions.php", - "lib\/Internal\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\": "lib" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https:\/\/amphp.org\/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc:\/\/irc.freenode.org\/amphp", - "issues": "https:\/\/github.com\/amphp\/amp\/issues", - "source": "https:\/\/github.com\/amphp\/amp\/tree\/v2.6.2" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/amp" - }, - { - "name": "amphp\/byte-stream", - "version": "v1.8.1", - "version_normalized": "1.8.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/byte-stream\/zipball\/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1.4", - "friendsofphp\/php-cs-fixer": "^2.3", - "jetbrains\/phpstorm-stubs": "^2019.3", - "phpunit\/phpunit": "^6 || ^7 || ^8", - "psalm\/phar": "^3.11.4" - }, - "time": "2021-03-30T17:13:30+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "lib\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\ByteStream\\": "lib" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I\/O simple.", - "homepage": "http:\/\/amphp.org\/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc:\/\/irc.freenode.org\/amphp", - "issues": "https:\/\/github.com\/amphp\/byte-stream\/issues", - "source": "https:\/\/github.com\/amphp\/byte-stream\/tree\/v1.8.1" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/byte-stream" - }, - { - "name": "amphp\/cache", - "version": "v1.5.0", - "version_normalized": "1.5.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/cache.git", - "reference": "2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/cache\/zipball\/2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28", - "reference": "2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2", - "amphp\/serialization": "^1", - "amphp\/sync": "^1.2", - "php": ">=7.1" - }, - "conflict": { - "amphp\/file": "<0.2 || >=3" - }, - "require-dev": { - "amphp\/file": "^1 || ^2", - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1.1", - "phpunit\/phpunit": "^6 | ^7 | ^8 | ^9", - "vimeo\/psalm": "^4" - }, - "time": "2021-06-29T17:12:43+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Cache\\": "lib" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - } - ], - "description": "A promise-aware caching API for Amp.", - "homepage": "https:\/\/github.com\/amphp\/cache", - "support": { - "irc": "irc:\/\/irc.freenode.org\/amphp", - "issues": "https:\/\/github.com\/amphp\/cache\/issues", - "source": "https:\/\/github.com\/amphp\/cache\/tree\/v1.5.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/cache" - }, - { - "name": "amphp\/dns", - "version": "v1.2.3", - "version_normalized": "1.2.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/dns.git", - "reference": "852292532294d7972c729a96b49756d781f7c59d" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/dns\/zipball\/852292532294d7972c729a96b49756d781f7c59d", - "reference": "852292532294d7972c729a96b49756d781f7c59d", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2", - "amphp\/byte-stream": "^1.1", - "amphp\/cache": "^1.2", - "amphp\/parser": "^1", - "amphp\/windows-registry": "^0.3", - "daverandom\/libdns": "^2.0.1", - "ext-filter": "*", - "ext-json": "*", - "php": ">=7.0" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1", - "phpunit\/phpunit": "^6 || ^7 || ^8 || ^9" - }, - "time": "2020-07-21T19:04:57+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Dns\\": "lib" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Wright", - "email": "addr@daverandom.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - } - ], - "description": "Async DNS resolution for Amp.", - "homepage": "https:\/\/github.com\/amphp\/dns", - "keywords": [ - "amp", - "amphp", - "async", - "client", - "dns", - "resolve" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/dns\/issues", - "source": "https:\/\/github.com\/amphp\/dns\/tree\/v1.2.3" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/dns" - }, - { - "name": "amphp\/hpack", - "version": "v3.2.0", - "version_normalized": "3.2.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/hpack.git", - "reference": "95895d29ae577a3a5995b46d16def04e11e39947" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/hpack\/zipball\/95895d29ae577a3a5995b46d16def04e11e39947", - "reference": "95895d29ae577a3a5995b46d16def04e11e39947", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "^2", - "http2jp\/hpack-test-case": "^1", - "nikic\/php-fuzzer": "^0.0.10", - "phpunit\/phpunit": "^7 | ^8 | ^9" - }, - "time": "2023-09-05T19:59:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Http\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Bob Weinand" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - } - ], - "description": "HTTP\/2 HPack implementation.", - "homepage": "https:\/\/github.com\/amphp\/hpack", - "keywords": [ - "headers", - "hpack", - "http-2" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/hpack\/issues", - "source": "https:\/\/github.com\/amphp\/hpack\/tree\/v3.2.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/hpack" - }, - { - "name": "amphp\/http", - "version": "v1.7.1", - "version_normalized": "1.7.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/http.git", - "reference": "0d729b09fbace00dd1fd35ae8d4d45eb25f39d96" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/http\/zipball\/0d729b09fbace00dd1fd35ae8d4d45eb25f39d96", - "reference": "0d729b09fbace00dd1fd35ae8d4d45eb25f39d96", - "shasum": "" - }, - "require": { - "amphp\/hpack": "^3", - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "^2-dev", - "phpunit\/phpunit": "^9 || ^8 || ^7" - }, - "time": "2023-02-08T00:29:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Http\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Basic HTTP primitives which can be shared by servers and clients.", - "support": { - "issues": "https:\/\/github.com\/amphp\/http\/issues", - "source": "https:\/\/github.com\/amphp\/http\/tree\/v1.7.1" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/http" - }, - { - "name": "amphp\/http-client", - "version": "v4.6.3", - "version_normalized": "4.6.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/http-client.git", - "reference": "6d4dcc7b7bd9a6ea58e26652eba632ccbc16c030" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/http-client\/zipball\/6d4dcc7b7bd9a6ea58e26652eba632ccbc16c030", - "reference": "6d4dcc7b7bd9a6ea58e26652eba632ccbc16c030", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2.4", - "amphp\/byte-stream": "^1.6", - "amphp\/hpack": "^3", - "amphp\/http": "^1.6", - "amphp\/socket": "^1", - "amphp\/sync": "^1.3", - "league\/uri": "^6 | ^7", - "php": ">=7.2", - "psr\/http-message": "^1 | ^2" - }, - "conflict": { - "amphp\/file": "<0.2 || >=3" - }, - "require-dev": { - "amphp\/file": "^0.2 || ^0.3 || ^1 || ^2", - "amphp\/http-server": "^2", - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1.1", - "amphp\/react-adapter": "^2.1", - "clue\/socks-react": "^1.0", - "ext-json": "*", - "kelunik\/link-header-rfc5988": "^1.0", - "laminas\/laminas-diactoros": "^2.3", - "phpunit\/phpunit": "^7 || ^8 || ^9", - "vimeo\/psalm": "^5" - }, - "suggest": { - "amphp\/file": "Required for file request bodies and HTTP archive logging", - "ext-json": "Required for logging HTTP archives", - "ext-zlib": "Allows using compression for response bodies." - }, - "time": "2023-08-15T20:09:57+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src\/Internal\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Http\\Client\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - } - ], - "description": "Asynchronous concurrent HTTP\/2 and HTTP\/1.1 client built on the Amp concurrency framework", - "homepage": "https:\/\/github.com\/amphp\/http-client", - "keywords": [ - "async", - "client", - "concurrent", - "http", - "non-blocking", - "rest" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/http-client\/issues", - "source": "https:\/\/github.com\/amphp\/http-client\/tree\/v4.6.3" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/http-client" - }, - { - "name": "amphp\/parser", - "version": "v1.1.0", - "version_normalized": "1.1.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/parser.git", - "reference": "ff1de4144726c5dad5fab97f66692ebe8de3e151" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/parser\/zipball\/ff1de4144726c5dad5fab97f66692ebe8de3e151", - "reference": "ff1de4144726c5dad5fab97f66692ebe8de3e151", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "^2", - "phpunit\/phpunit": "^9", - "psalm\/phar": "^5.4" - }, - "time": "2022-12-30T18:08:47+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Parser\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A generator parser to make streaming parsers simple.", - "homepage": "https:\/\/github.com\/amphp\/parser", - "keywords": [ - "async", - "non-blocking", - "parser", - "stream" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/parser\/issues", - "source": "https:\/\/github.com\/amphp\/parser\/tree\/v1.1.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/parser" - }, - { - "name": "amphp\/process", - "version": "v1.1.4", - "version_normalized": "1.1.4.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/process.git", - "reference": "76e9495fd6818b43a20167cb11d8a67f7744ee0f" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/process\/zipball\/76e9495fd6818b43a20167cb11d8a67f7744ee0f", - "reference": "76e9495fd6818b43a20167cb11d8a67f7744ee0f", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2", - "amphp\/byte-stream": "^1.4", - "php": ">=7" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1", - "phpunit\/phpunit": "^6" - }, - "time": "2022-07-06T23:50:12+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Process\\": "lib" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Asynchronous process manager.", - "homepage": "https:\/\/github.com\/amphp\/process", - "support": { - "issues": "https:\/\/github.com\/amphp\/process\/issues", - "source": "https:\/\/github.com\/amphp\/process\/tree\/v1.1.4" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/process" - }, - { - "name": "amphp\/serialization", - "version": "v1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/serialization\/zipball\/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "phpunit\/phpunit": "^9 || ^8 || ^7" - }, - "time": "2020-03-25T21:39:07+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Serialization\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https:\/\/github.com\/amphp\/serialization", - "keywords": [ - "async", - "asynchronous", - "serialization", - "serialize" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/serialization\/issues", - "source": "https:\/\/github.com\/amphp\/serialization\/tree\/master" - }, - "install-path": "..\/amphp\/serialization" - }, - { - "name": "amphp\/socket", - "version": "v1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/socket.git", - "reference": "a8af9f5d0a66c5fe9567da45a51509e592788fe6" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/socket\/zipball\/a8af9f5d0a66c5fe9567da45a51509e592788fe6", - "reference": "a8af9f5d0a66c5fe9567da45a51509e592788fe6", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2", - "amphp\/byte-stream": "^1.6", - "amphp\/dns": "^1 || ^0.9", - "ext-openssl": "*", - "kelunik\/certificate": "^1.1", - "league\/uri-parser": "^1.4", - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1", - "phpunit\/phpunit": "^6 || ^7 || ^8", - "vimeo\/psalm": "^3.9@dev" - }, - "time": "2021-07-09T18:18:48+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions.php", - "src\/Internal\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Socket\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Async socket connection \/ server tools for Amp.", - "homepage": "https:\/\/github.com\/amphp\/socket", - "keywords": [ - "amp", - "async", - "encryption", - "non-blocking", - "sockets", - "tcp", - "tls" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/socket\/issues", - "source": "https:\/\/github.com\/amphp\/socket\/tree\/v1.2.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/socket" - }, - { - "name": "amphp\/sync", - "version": "v1.4.2", - "version_normalized": "1.4.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/sync.git", - "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/sync\/zipball\/85ab06764f4f36d63b1356b466df6111cf4b89cf", - "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2.2", - "php": ">=7.1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master", - "amphp\/phpunit-util": "^1.1", - "phpunit\/phpunit": "^9 || ^8 || ^7" - }, - "time": "2021-10-25T18:29:10+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions.php", - "src\/ConcurrentIterator\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\Sync\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" - } - ], - "description": "Mutex, Semaphore, and other synchronization tools for Amp.", - "homepage": "https:\/\/github.com\/amphp\/sync", - "keywords": [ - "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" - ], - "support": { - "issues": "https:\/\/github.com\/amphp\/sync\/issues", - "source": "https:\/\/github.com\/amphp\/sync\/tree\/v1.4.2" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/sync" - }, - { - "name": "amphp\/windows-registry", - "version": "v0.3.3", - "version_normalized": "0.3.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/amphp\/windows-registry.git", - "reference": "0f56438b9197e224325e88f305346f0221df1f71" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/amphp\/windows-registry\/zipball\/0f56438b9197e224325e88f305346f0221df1f71", - "reference": "0f56438b9197e224325e88f305346f0221df1f71", - "shasum": "" - }, - "require": { - "amphp\/amp": "^2", - "amphp\/byte-stream": "^1.4", - "amphp\/process": "^1" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "dev-master" - }, - "time": "2020-07-10T16:13:29+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Amp\\WindowsRegistry\\": "lib" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Windows Registry Reader.", - "support": { - "issues": "https:\/\/github.com\/amphp\/windows-registry\/issues", - "source": "https:\/\/github.com\/amphp\/windows-registry\/tree\/master" - }, - "funding": [ - { - "url": "https:\/\/github.com\/amphp", - "type": "github" - } - ], - "install-path": "..\/amphp\/windows-registry" - }, - { - "name": "berlindb\/core", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/berlindb\/core.git", - "reference": "7dcddaddcffb69c58800d2fb3f6f169791cab1f7" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/berlindb\/core\/zipball\/7dcddaddcffb69c58800d2fb3f6f169791cab1f7", - "reference": "7dcddaddcffb69c58800d2fb3f6f169791cab1f7", - "shasum": "" - }, - "time": "2022-03-10T21:12:11+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\BerlinDB\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "A collection of PHP classes and functions that aims to provide an ORM-like experience and interface to WordPress database tables.", - "support": { - "issues": "https:\/\/github.com\/berlindb\/core\/issues", - "source": "https:\/\/github.com\/berlindb\/core\/tree\/2.0.1" - }, - "install-path": "..\/berlindb\/core" - }, - { - "name": "daverandom\/libdns", - "version": "v2.0.3", - "version_normalized": "2.0.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/DaveRandom\/LibDNS.git", - "reference": "42c2d700d1178c9f9e78664793463f7f1aea248c" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/DaveRandom\/LibDNS\/zipball\/42c2d700d1178c9f9e78664793463f7f1aea248c", - "reference": "42c2d700d1178c9f9e78664793463f7f1aea248c", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": ">=7.0" - }, - "suggest": { - "ext-intl": "Required for IDN support" - }, - "time": "2022-09-20T18:15:38+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\LibDNS\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "DNS protocol implementation written in pure PHP", - "keywords": [ - "dns" - ], - "support": { - "issues": "https:\/\/github.com\/DaveRandom\/LibDNS\/issues", - "source": "https:\/\/github.com\/DaveRandom\/LibDNS\/tree\/v2.0.3" - }, - "install-path": "..\/daverandom\/libdns" - }, - { - "name": "delight-im\/cookie", - "version": "v3.4.0", - "version_normalized": "3.4.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/delight-im\/PHP-Cookie.git", - "reference": "67065d34272377d63bab0bd58f984f9b228c803f" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/delight-im\/PHP-Cookie\/zipball\/67065d34272377d63bab0bd58f984f9b228c803f", - "reference": "67065d34272377d63bab0bd58f984f9b228c803f", - "shasum": "" - }, - "require": { - "delight-im\/http": "^2.0", - "php": ">=5.4.0" - }, - "time": "2020-04-16T11:01:26+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Delight\\Cookie\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "Modern cookie management for PHP", - "homepage": "https:\/\/github.com\/delight-im\/PHP-Cookie", - "keywords": [ - "cookie", - "cookies", - "csrf", - "http", - "same-site", - "samesite", - "xss" - ], - "support": { - "issues": "https:\/\/github.com\/delight-im\/PHP-Cookie\/issues", - "source": "https:\/\/github.com\/delight-im\/PHP-Cookie\/tree\/v3.4.0" - }, - "install-path": "..\/delight-im\/cookie" - }, - { - "name": "delight-im\/http", - "version": "v2.1.0", - "version_normalized": "2.1.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/delight-im\/PHP-HTTP.git", - "reference": "a5c2c4eae1dd3207f797984e8f64f2d71ed889dd" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/delight-im\/PHP-HTTP\/zipball\/a5c2c4eae1dd3207f797984e8f64f2d71ed889dd", - "reference": "a5c2c4eae1dd3207f797984e8f64f2d71ed889dd", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2021-10-12T18:52:29+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Delight\\Http\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "Hypertext Transfer Protocol (HTTP) utilities for PHP", - "homepage": "https:\/\/github.com\/delight-im\/PHP-HTTP", - "keywords": [ - "headers", - "http", - "https" - ], - "support": { - "issues": "https:\/\/github.com\/delight-im\/PHP-HTTP\/issues", - "source": "https:\/\/github.com\/delight-im\/PHP-HTTP\/tree\/v2.1.0" - }, - "install-path": "..\/delight-im\/http" - }, - { - "name": "doctrine\/deprecations", - "version": "1.1.2", - "version_normalized": "1.1.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/doctrine\/deprecations.git", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/doctrine\/deprecations\/zipball\/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine\/coding-standard": "^9", - "phpstan\/phpstan": "1.4.10 || 1.10.15", - "phpstan\/phpstan-phpunit": "^1.0", - "phpunit\/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm\/plugin-phpunit": "0.18.4", - "psr\/log": "^1 || ^2 || ^3", - "vimeo\/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr\/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "time": "2023-09-27T20:04:15+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Doctrine\\Deprecations\\": "lib\/Doctrine\/Deprecations" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https:\/\/www.doctrine-project.org\/", - "support": { - "issues": "https:\/\/github.com\/doctrine\/deprecations\/issues", - "source": "https:\/\/github.com\/doctrine\/deprecations\/tree\/1.1.2" - }, - "install-path": "..\/doctrine\/deprecations" - }, - { - "name": "guzzlehttp\/guzzle", - "version": "7.8.0", - "version_normalized": "7.8.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/guzzle\/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/guzzle\/guzzle\/zipball\/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp\/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp\/psr7": "^1.9.1 || ^2.5.1", - "php": "^7.2.5 || ^8.0", - "psr\/http-client": "^1.0", - "symfony\/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr\/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni\/composer-bin-plugin": "^1.8.1", - "ext-curl": "*", - "php-http\/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http\/message-factory": "^1.1", - "phpunit\/phpunit": "^8.5.29 || ^9.5.23", - "psr\/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr\/log": "Required for using the Log middleware" - }, - "time": "2023-08-27T10:20:53+00:00", - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions_include.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\GuzzleHttp\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https:\/\/github.com\/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https:\/\/github.com\/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https:\/\/github.com\/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https:\/\/github.com\/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https:\/\/github.com\/Nyholm" - }, - { - "name": "M\u00e1rk S\u00e1gi-Kaz\u00e1r", - "email": "mark.sagikazar@gmail.com", - "homepage": "https:\/\/github.com\/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https:\/\/github.com\/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https:\/\/github.com\/guzzle\/guzzle\/issues", - "source": "https:\/\/github.com\/guzzle\/guzzle\/tree\/7.8.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/GrahamCampbell", - "type": "github" - }, - { - "url": "https:\/\/github.com\/Nyholm", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/guzzle", - "type": "tidelift" - } - ], - "install-path": "..\/guzzlehttp\/guzzle" - }, - { - "name": "guzzlehttp\/promises", - "version": "1.5.3", - "version_normalized": "1.5.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/guzzle\/promises.git", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/guzzle\/promises\/zipball\/67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony\/phpunit-bridge": "^4.4 || ^5.1" - }, - "time": "2023-05-21T12:31:43+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions_include.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\GuzzleHttp\\Promise\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https:\/\/github.com\/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https:\/\/github.com\/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https:\/\/github.com\/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https:\/\/github.com\/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https:\/\/github.com\/guzzle\/promises\/issues", - "source": "https:\/\/github.com\/guzzle\/promises\/tree\/1.5.3" - }, - "funding": [ - { - "url": "https:\/\/github.com\/GrahamCampbell", - "type": "github" - }, - { - "url": "https:\/\/github.com\/Nyholm", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/promises", - "type": "tidelift" - } - ], - "install-path": "..\/guzzlehttp\/promises" - }, - { - "name": "guzzlehttp\/psr7", - "version": "2.6.1", - "version_normalized": "2.6.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/guzzle\/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/guzzle\/psr7\/zipball\/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr\/http-factory": "^1.0", - "psr\/http-message": "^1.1 || ^2.0", - "ralouphie\/getallheaders": "^3.0" - }, - "provide": { - "psr\/http-factory-implementation": "1.0", - "psr\/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni\/composer-bin-plugin": "^1.8.1", - "http-interop\/http-factory-tests": "^0.9", - "phpunit\/phpunit": "^8.5.29 || ^9.5.23" - }, - "suggest": { - "laminas\/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "time": "2023-08-27T10:13:57+00:00", - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\GuzzleHttp\\Psr7\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https:\/\/github.com\/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https:\/\/github.com\/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https:\/\/github.com\/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https:\/\/github.com\/Nyholm" - }, - { - "name": "M\u00e1rk S\u00e1gi-Kaz\u00e1r", - "email": "mark.sagikazar@gmail.com", - "homepage": "https:\/\/github.com\/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https:\/\/github.com\/Tobion" - }, - { - "name": "M\u00e1rk S\u00e1gi-Kaz\u00e1r", - "email": "mark.sagikazar@gmail.com", - "homepage": "https:\/\/sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https:\/\/github.com\/guzzle\/psr7\/issues", - "source": "https:\/\/github.com\/guzzle\/psr7\/tree\/2.6.1" - }, - "funding": [ - { - "url": "https:\/\/github.com\/GrahamCampbell", - "type": "github" - }, - { - "url": "https:\/\/github.com\/Nyholm", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/psr7", - "type": "tidelift" - } - ], - "install-path": "..\/guzzlehttp\/psr7" - }, - { - "name": "hashids\/hashids", - "version": "4.1.0", - "version_normalized": "4.1.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/vinkla\/hashids.git", - "reference": "8cab111f78e0bd9c76953b082919fc9e251761be" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/vinkla\/hashids\/zipball\/8cab111f78e0bd9c76953b082919fc9e251761be", - "reference": "8cab111f78e0bd9c76953b082919fc9e251761be", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit\/phpunit": "^8.0 || ^9.4", - "squizlabs\/php_codesniffer": "^3.5" - }, - "suggest": { - "ext-bcmath": "Required to use BC Math arbitrary precision mathematics (*).", - "ext-gmp": "Required to use GNU multiple precision mathematics (*)." - }, - "time": "2020-11-26T19:24:33+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Hashids\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ivan Akimov", - "email": "ivan@barreleye.com" - }, - { - "name": "Vincent Klaiber", - "email": "hello@doubledip.se" - } - ], - "description": "Generate short, unique, non-sequential ids (like YouTube and Bitly) from numbers", - "homepage": "https:\/\/hashids.org\/php", - "keywords": [ - "bitly", - "decode", - "encode", - "hash", - "hashid", - "hashids", - "ids", - "obfuscate", - "youtube" - ], - "support": { - "issues": "https:\/\/github.com\/vinkla\/hashids\/issues", - "source": "https:\/\/github.com\/vinkla\/hashids\/tree\/4.1.0" - }, - "install-path": "..\/hashids\/hashids" - }, - { - "name": "ifsnop\/mysqldump-php", - "version": "v2.12", - "version_normalized": "2.12.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/ifsnop\/mysqldump-php.git", - "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/ifsnop\/mysqldump-php\/zipball\/2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", - "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit\/phpunit": "4.8.36", - "squizlabs\/php_codesniffer": "1.*" - }, - "time": "2023-04-12T07:43:14+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Ifsnop\\": "src\/Ifsnop\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "GPL-3.0-or-later" - ], - "authors": [ - { - "name": "Diego Torres", - "homepage": "https:\/\/github.com\/ifsnop", - "role": "Developer" - } - ], - "description": "PHP version of mysqldump cli that comes with MySQL", - "homepage": "https:\/\/github.com\/ifsnop\/mysqldump-php", - "keywords": [ - "PHP7", - "database", - "hhvm", - "mariadb", - "mysql", - "mysql-backup", - "mysqldump", - "pdo", - "php", - "php5", - "sql" - ], - "support": { - "issues": "https:\/\/github.com\/ifsnop\/mysqldump-php\/issues", - "source": "https:\/\/github.com\/ifsnop\/mysqldump-php\/tree\/v2.12" - }, - "install-path": "..\/ifsnop\/mysqldump-php" - }, - { - "name": "jasny\/immutable", - "version": "v2.1.0", - "version_normalized": "2.1.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/jasny\/immutable.git", - "reference": "1a4ffb42bea73ea5d318f39b3a5dd283aec063f9" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/jasny\/immutable\/zipball\/1a4ffb42bea73ea5d318f39b3a5dd283aec063f9", - "reference": "1a4ffb42bea73ea5d318f39b3a5dd283aec063f9", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "jasny\/php-code-quality": "^2.5" - }, - "time": "2020-01-27T09:41:29+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Jasny\\Immutable\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arnold Daniels", - "email": "arnold@jasny.net", - "homepage": "http:\/\/www.jasny.net" - } - ], - "description": "Helper methods for immutable objects", - "support": { - "issues": "https:\/\/github.com\/jasny\/immutable\/issues", - "source": "https:\/\/github.com\/jasny\/immutable" - }, - "install-path": "..\/jasny\/immutable" - }, - { - "name": "jasny\/sso", - "version": "v0.4.2", - "version_normalized": "0.4.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/jasny\/sso.git", - "reference": "fb4f0916911b00797425237abfb073ffee8cba1c" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/jasny\/sso\/zipball\/fb4f0916911b00797425237abfb073ffee8cba1c", - "reference": "fb4f0916911b00797425237abfb073ffee8cba1c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "jasny\/immutable": "^2.1", - "php": ">=7.3.0", - "psr\/log": "*", - "psr\/simple-cache": "^1.0" - }, - "require-dev": { - "codeception\/codeception": "^4.1", - "codeception\/module-phpbrowser": "^1.0", - "codeception\/module-rest": "^1.2", - "desarrolla2\/cache": "^3.0", - "jasny\/http-message": "^1.3", - "jasny\/php-code-quality": "^2.6.0", - "jasny\/phpunit-extension": "^0.3.2", - "phpstan\/phpstan": "^0.12.59", - "yubb\/loggy": "^2.1" - }, - "time": "2022-04-30T18:31:10+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Jasny\\SSO\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arnold Daniels", - "email": "arnold@jasny.net", - "homepage": "http:\/\/www.jasny.net" - } - ], - "description": "Simple Single Sign-On", - "homepage": "https:\/\/github.com\/jasny\/sso\/wiki", - "keywords": [ - "SSO", - "auth" - ], - "support": { - "issues": "https:\/\/github.com\/jasny\/sso\/issues", - "source": "https:\/\/github.com\/jasny\/sso" - }, - "install-path": "..\/jasny\/sso" - }, - { - "name": "kelunik\/certificate", - "version": "v1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/kelunik\/certificate.git", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/kelunik\/certificate\/zipball\/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "php": ">=7.0" - }, - "require-dev": { - "amphp\/php-cs-fixer-config": "^2", - "phpunit\/phpunit": "^6 | 7 | ^8 | ^9" - }, - "time": "2023-02-03T21:26:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Kelunik\\Certificate\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Access certificate details and transform between different formats.", - "keywords": [ - "DER", - "certificate", - "certificates", - "openssl", - "pem", - "x509" - ], - "support": { - "issues": "https:\/\/github.com\/kelunik\/certificate\/issues", - "source": "https:\/\/github.com\/kelunik\/certificate\/tree\/v1.1.3" - }, - "install-path": "..\/kelunik\/certificate" - }, - { - "name": "league\/uri", - "version": "7.3.0", - "version_normalized": "7.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/thephpleague\/uri.git", - "reference": "36743c3961bb82bf93da91917b6bced0358a8d45" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/thephpleague\/uri\/zipball\/36743c3961bb82bf93da91917b6bced0358a8d45", - "reference": "36743c3961bb82bf93da91917b6bced0358a8d45", - "shasum": "" - }, - "require": { - "league\/uri-interfaces": "^7.3", - "php": "^8.1" - }, - "conflict": { - "league\/uri-schemes": "^1.0" - }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "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", - "jeremykendall\/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league\/uri-components": "Needed to easily manipulate URI objects components", - "php-64bit": "to improve IPV4 host parsing", - "symfony\/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" - }, - "time": "2023-09-09T17:21:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\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": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "middleware", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "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.3.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/sponsors\/nyamsprod", - "type": "github" - } - ], - "install-path": "..\/league\/uri" - }, - { - "name": "league\/uri-interfaces", - "version": "7.3.0", - "version_normalized": "7.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/thephpleague\/uri-interfaces.git", - "reference": "c409b60ed2245ff94c965a8c798a60166db53361" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/thephpleague\/uri-interfaces\/zipball\/c409b60ed2245ff94c965a8c798a60166db53361", - "reference": "c409b60ed2245ff94c965a8c798a60166db53361", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^8.1", - "psr\/http-factory": "^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", - "symfony\/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" - }, - "time": "2023-09-09T17:21:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\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 interfaces and classes for URI representation and interaction", - "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.3.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/sponsors\/nyamsprod", - "type": "github" - } - ], - "install-path": "..\/league\/uri-interfaces" - }, - { - "name": "league\/uri-parser", - "version": "1.4.1", - "version_normalized": "1.4.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/thephpleague\/uri-parser.git", - "reference": "671548427e4c932352d9b9279fdfa345bf63fa00" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/thephpleague\/uri-parser\/zipball\/671548427e4c932352d9b9279fdfa345bf63fa00", - "reference": "671548427e4c932352d9b9279fdfa345bf63fa00", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "friendsofphp\/php-cs-fixer": "^2.0", - "phpstan\/phpstan": "^0.9.2", - "phpstan\/phpstan-phpunit": "^0.9.4", - "phpstan\/phpstan-strict-rules": "^0.9.0", - "phpunit\/phpunit": "^6.0" - }, - "suggest": { - "ext-intl": "Allow parsing RFC3987 compliant hosts", - "league\/uri-schemes": "Allow validating and normalizing URI parsing results" - }, - "time": "2018-11-22T07:55:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions_include.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\League\\Uri\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https:\/\/nyamsprod.com" - } - ], - "description": "userland URI parser RFC 3986 compliant", - "homepage": "https:\/\/github.com\/thephpleague\/uri-parser", - "keywords": [ - "parse_url", - "parser", - "rfc3986", - "rfc3987", - "uri", - "url" - ], - "support": { - "issues": "https:\/\/github.com\/thephpleague\/uri-parser\/issues", - "source": "https:\/\/github.com\/thephpleague\/uri-parser\/tree\/master" - }, - "abandoned": true, - "install-path": "..\/league\/uri-parser" - }, - { - "name": "mexitek\/phpcolors", - "version": "v1.0.4", - "version_normalized": "1.0.4.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/mexitek\/phpColors.git", - "reference": "4043974240ca7dc3c2bec3c158588148b605b206" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/mexitek\/phpColors\/zipball\/4043974240ca7dc3c2bec3c158588148b605b206", - "reference": "4043974240ca7dc3c2bec3c158588148b605b206", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "require-dev": { - "nette\/tester": "^2.3", - "squizlabs\/php_codesniffer": "^3.5" - }, - "time": "2021-11-26T13:19:08+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arlo Carreon", - "homepage": "http:\/\/arlocarreon.com", - "role": "creator" - } - ], - "description": "A series of methods that let you manipulate colors. Just incase you ever need different shades of one color on the fly.", - "homepage": "http:\/\/mexitek.github.com\/phpColors\/", - "keywords": [ - "color", - "css", - "design", - "frontend", - "ui" - ], - "support": { - "issues": "https:\/\/github.com\/mexitek\/phpColors\/issues", - "source": "https:\/\/github.com\/mexitek\/phpColors" - }, - "install-path": "..\/mexitek\/phpcolors" - }, - { - "name": "mpdf\/mpdf", - "version": "v8.2.0", - "version_normalized": "8.2.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/mpdf\/mpdf.git", - "reference": "170a236a588d177c2aa7447ce490a030ca68e6f4" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/mpdf\/mpdf\/zipball\/170a236a588d177c2aa7447ce490a030ca68e6f4", - "reference": "170a236a588d177c2aa7447ce490a030ca68e6f4", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "ext-mbstring": "*", - "mpdf\/psr-http-message-shim": "^1.0 || ^2.0", - "mpdf\/psr-log-aware-trait": "^2.0 || ^3.0", - "myclabs\/deep-copy": "^1.7", - "paragonie\/random_compat": "^1.4|^2.0|^9.99.99", - "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0", - "psr\/http-message": "^1.0 || ^2.0", - "psr\/log": "^1.0 || ^2.0 || ^3.0", - "setasign\/fpdi": "^2.1" - }, - "require-dev": { - "mockery\/mockery": "^1.3.0", - "mpdf\/qrcode": "^1.1.0", - "squizlabs\/php_codesniffer": "^3.5.0", - "tracy\/tracy": "~2.5", - "yoast\/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-bcmath": "Needed for generation of some types of barcodes", - "ext-xml": "Needed mainly for SVG manipulation", - "ext-zlib": "Needed for compression of embedded resources, such as fonts" - }, - "time": "2023-09-01T11:44:52+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/functions.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Mpdf\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "GPL-2.0-only" - ], - "authors": [ - { - "name": "Mat\u011bj Hump\u00e1l", - "role": "Developer, maintainer" - }, - { - "name": "Ian Back", - "role": "Developer (retired)" - } - ], - "description": "PHP library generating PDF files from UTF-8 encoded HTML", - "homepage": "https:\/\/mpdf.github.io", - "keywords": [ - "pdf", - "php", - "utf-8" - ], - "support": { - "docs": "http:\/\/mpdf.github.io", - "issues": "https:\/\/github.com\/mpdf\/mpdf\/issues", - "source": "https:\/\/github.com\/mpdf\/mpdf" - }, - "funding": [ - { - "url": "https:\/\/www.paypal.me\/mpdf", - "type": "custom" - } - ], - "install-path": "..\/mpdf\/mpdf" - }, - { - "name": "mpdf\/psr-http-message-shim", - "version": "v2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/mpdf\/psr-http-message-shim.git", - "reference": "f25a0153d645e234f9db42e5433b16d9b113920f" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/mpdf\/psr-http-message-shim\/zipball\/f25a0153d645e234f9db42e5433b16d9b113920f", - "reference": "f25a0153d645e234f9db42e5433b16d9b113920f", - "shasum": "" - }, - "require": { - "psr\/http-message": "^2.0" - }, - "time": "2023-10-02T14:34:03+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Mpdf\\PsrHttpMessageShim\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Dorison", - "email": "mark@chromatichq.com" - }, - { - "name": "Kristofer Widholm", - "email": "kristofer@chromatichq.com" - }, - { - "name": "Nigel Cunningham", - "email": "nigel.cunningham@technocrat.com.au" - } - ], - "description": "Shim to allow support of different psr\/message versions.", - "support": { - "issues": "https:\/\/github.com\/mpdf\/psr-http-message-shim\/issues", - "source": "https:\/\/github.com\/mpdf\/psr-http-message-shim\/tree\/v2.0.1" - }, - "install-path": "..\/mpdf\/psr-http-message-shim" - }, - { - "name": "mpdf\/psr-log-aware-trait", - "version": "v2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/mpdf\/psr-log-aware-trait.git", - "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/mpdf\/psr-log-aware-trait\/zipball\/7a077416e8f39eb626dee4246e0af99dd9ace275", - "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275", - "shasum": "" - }, - "require": { - "psr\/log": "^1.0 || ^2.0" - }, - "time": "2023-05-03T06:18:28+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Mpdf\\PsrLogAwareTrait\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Dorison", - "email": "mark@chromatichq.com" - }, - { - "name": "Kristofer Widholm", - "email": "kristofer@chromatichq.com" - } - ], - "description": "Trait to allow support of different psr\/log versions.", - "support": { - "issues": "https:\/\/github.com\/mpdf\/psr-log-aware-trait\/issues", - "source": "https:\/\/github.com\/mpdf\/psr-log-aware-trait\/tree\/v2.0.0" - }, - "install-path": "..\/mpdf\/psr-log-aware-trait" - }, - { - "name": "myclabs\/deep-copy", - "version": "1.11.1", - "version_normalized": "1.11.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/myclabs\/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/myclabs\/DeepCopy\/zipball\/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine\/collections": "<1.6.8", - "doctrine\/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine\/collections": "^1.6.8", - "doctrine\/common": "^2.13.3 || ^3.2.2", - "phpunit\/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "time": "2023-03-08T13:26:56+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/DeepCopy\/deep_copy.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\DeepCopy\\": "src\/DeepCopy\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https:\/\/github.com\/myclabs\/DeepCopy\/issues", - "source": "https:\/\/github.com\/myclabs\/DeepCopy\/tree\/1.11.1" - }, - "funding": [ - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/myclabs\/deep-copy", - "type": "tidelift" - } - ], - "install-path": "..\/myclabs\/deep-copy" - }, - { - "name": "nesbot\/carbon", - "version": "2.71.0", - "version_normalized": "2.71.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/briannesbitt\/Carbon.git", - "reference": "98276233188583f2ff845a0f992a235472d9466a" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/briannesbitt\/Carbon\/zipball\/98276233188583f2ff845a0f992a235472d9466a", - "reference": "98276233188583f2ff845a0f992a235472d9466a", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "psr\/clock": "^1.0", - "symfony\/polyfill-mbstring": "^1.0", - "symfony\/polyfill-php80": "^1.16", - "symfony\/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" - }, - "provide": { - "psr\/clock-implementation": "1.0" - }, - "require-dev": { - "doctrine\/dbal": "^2.0 || ^3.1.4", - "doctrine\/orm": "^2.7", - "friendsofphp\/php-cs-fixer": "^3.0", - "kylekatarnls\/multi-tester": "^2.0", - "ondrejmirtes\/better-reflection": "*", - "phpmd\/phpmd": "^2.9", - "phpstan\/extension-installer": "^1.0", - "phpstan\/phpstan": "^0.12.99 || ^1.7.14", - "phpunit\/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit\/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs\/php_codesniffer": "^3.4" - }, - "time": "2023-09-25T11:31:05+00:00", - "bin": [ - "bin\/carbon" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "WP_Ultimo\\Dependencies\\Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Carbon\\": "src\/Carbon\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https:\/\/markido.com" - }, - { - "name": "kylekatarnls", - "homepage": "https:\/\/github.com\/kylekatarnls" - } - ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https:\/\/carbon.nesbot.com", - "keywords": [ - "date", - "datetime", - "time" - ], - "support": { - "docs": "https:\/\/carbon.nesbot.com\/docs", - "issues": "https:\/\/github.com\/briannesbitt\/Carbon\/issues", - "source": "https:\/\/github.com\/briannesbitt\/Carbon" - }, - "funding": [ - { - "url": "https:\/\/github.com\/sponsors\/kylekatarnls", - "type": "github" - }, - { - "url": "https:\/\/opencollective.com\/Carbon#sponsor", - "type": "opencollective" - }, - { - "url": "https:\/\/tidelift.com\/subscription\/pkg\/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", - "type": "tidelift" - } - ], - "install-path": "..\/nesbot\/carbon" - }, - { - "name": "nyholm\/psr7", - "version": "1.8.0", - "version_normalized": "1.8.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/Nyholm\/psr7.git", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/Nyholm\/psr7\/zipball\/3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr\/http-factory": "^1.0", - "psr\/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http\/message-factory-implementation": "1.0", - "psr\/http-factory-implementation": "1.0", - "psr\/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop\/http-factory-tests": "^0.9", - "php-http\/message-factory": "^1.0", - "php-http\/psr7-integration-tests": "^1.0", - "phpunit\/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony\/error-handler": "^4.4" - }, - "time": "2023-05-02T11:26:24+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Nyholm\\Psr7\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https:\/\/tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https:\/\/github.com\/Nyholm\/psr7\/issues", - "source": "https:\/\/github.com\/Nyholm\/psr7\/tree\/1.8.0" - }, - "funding": [ - { - "url": "https:\/\/github.com\/Zegnat", - "type": "github" - }, - { - "url": "https:\/\/github.com\/nyholm", - "type": "github" - } - ], - "install-path": "..\/nyholm\/psr7" - }, - { - "name": "pablo-sg-pacheco\/wp-namespace-autoloader", - "version": "dev-master", - "version_normalized": "dev-master", - "source": { - "type": "git", - "url": "https:\/\/github.com\/pablo-sg-pacheco\/wp-namespace-autoloader.git", - "reference": "069163f215743c83381613749ace0c5a642720b4" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/pablo-sg-pacheco\/wp-namespace-autoloader\/zipball\/069163f215743c83381613749ace0c5a642720b4", - "reference": "069163f215743c83381613749ace0c5a642720b4", - "shasum": "" - }, - "require": { - "php": ">=5.4" - }, - "require-dev": { - "cweagans\/composer-patches": "^1.0", - "dealerdirect\/phpcodesniffer-composer-installer": "0.7.0", - "phpunit\/phpunit": "^7", - "squizlabs\/php_codesniffer": "dev-master", - "wp-coding-standards\/wpcs": "^2.3" - }, - "time": "2022-12-02T14:49:51+00:00", - "default-branch": true, - "type": "library", - "extra": { - "patches": { - "squizlabs\/php_codesniffer": { - "Add GitHub Actions Annotations report type": "https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\/pull\/2918.patch" - } - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Pablo_Pacheco\\WP_Namespace_Autoloader\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "GPLv2" - ], - "authors": [ - { - "name": "Pablo dos S G Pacheco", - "email": "pablo.sg.pacheco@gmail.com" - } - ], - "description": "A PHP autoloader class that follows the WordPress coding standards 2.0 and proposed 3.0 for class\/interface\/trait names and filenames", - "homepage": "https:\/\/github.com\/pablo-pacheco\/wp-namespace-autoloader", - "keywords": [ - "autoload", - "namespace", - "wordpress", - "wp" - ], - "support": { - "issues": "https:\/\/github.com\/pablo-sg-pacheco\/wp-namespace-autoloader\/issues", - "source": "https:\/\/github.com\/pablo-sg-pacheco\/wp-namespace-autoloader\/tree\/master" - }, - "install-path": "..\/pablo-sg-pacheco\/wp-namespace-autoloader" - }, - { - "name": "paragonie\/constant_time_encoding", - "version": "v2.6.3", - "version_normalized": "2.6.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/paragonie\/constant_time_encoding.git", - "reference": "58c3f47f650c94ec05a151692652a868995d2938" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/paragonie\/constant_time_encoding\/zipball\/58c3f47f650c94ec05a151692652a868995d2938", - "reference": "58c3f47f650c94ec05a151692652a868995d2938", - "shasum": "" - }, - "require": { - "php": "^7|^8" - }, - "require-dev": { - "phpunit\/phpunit": "^6|^7|^8|^9", - "vimeo\/psalm": "^1|^2|^3|^4" - }, - "time": "2022-06-14T06:56:20+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\ParagonIE\\ConstantTime\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https:\/\/paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https:\/\/www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https:\/\/github.com\/paragonie\/constant_time_encoding\/issues", - "source": "https:\/\/github.com\/paragonie\/constant_time_encoding" - }, - "install-path": "..\/paragonie\/constant_time_encoding" - }, - { - "name": "paragonie\/random_compat", - "version": "v9.99.100", - "version_normalized": "9.99.100.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/paragonie\/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/paragonie\/random_compat\/zipball\/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", - "shasum": "" - }, - "require": { - "php": ">= 7" - }, - "require-dev": { - "phpunit\/phpunit": "4.*|5.*", - "vimeo\/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "time": "2020-10-15T08:29:30+00:00", - "type": "library", - "installation-source": "dist", - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https:\/\/paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https:\/\/github.com\/paragonie\/random_compat\/issues", - "source": "https:\/\/github.com\/paragonie\/random_compat" - }, - "install-path": "..\/paragonie\/random_compat" - }, - { - "name": "phpdocumentor\/reflection-common", - "version": "2.2.0", - "version_normalized": "2.2.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpDocumentor\/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpDocumentor\/ReflectionCommon\/zipball\/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "time": "2020-06-27T09:03:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http:\/\/www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https:\/\/github.com\/phpDocumentor\/ReflectionCommon\/issues", - "source": "https:\/\/github.com\/phpDocumentor\/ReflectionCommon\/tree\/2.x" - }, - "install-path": "..\/phpdocumentor\/reflection-common" - }, - { - "name": "phpdocumentor\/reflection-docblock", - "version": "5.3.0", - "version_normalized": "5.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpDocumentor\/ReflectionDocBlock\/zipball\/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor\/reflection-common": "^2.2", - "phpdocumentor\/type-resolver": "^1.3", - "webmozart\/assert": "^1.9.1" - }, - "require-dev": { - "mockery\/mockery": "~1.3.2", - "psalm\/phar": "^4.8" - }, - "time": "2021-10-19T17:43:47+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock\/issues", - "source": "https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock\/tree\/5.3.0" - }, - "install-path": "..\/phpdocumentor\/reflection-docblock" - }, - { - "name": "phpdocumentor\/type-resolver", - "version": "1.7.3", - "version_normalized": "1.7.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpDocumentor\/TypeResolver.git", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpDocumentor\/TypeResolver\/zipball\/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "shasum": "" - }, - "require": { - "doctrine\/deprecations": "^1.0", - "php": "^7.4 || ^8.0", - "phpdocumentor\/reflection-common": "^2.0", - "phpstan\/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench\/phpbench": "^1.2", - "phpstan\/extension-installer": "^1.1", - "phpstan\/phpstan": "^1.8", - "phpstan\/phpstan-phpunit": "^1.1", - "phpunit\/phpunit": "^9.5", - "rector\/rector": "^0.13.9", - "vimeo\/psalm": "^4.25" - }, - "time": "2023-08-12T11:01:26+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https:\/\/github.com\/phpDocumentor\/TypeResolver\/issues", - "source": "https:\/\/github.com\/phpDocumentor\/TypeResolver\/tree\/1.7.3" - }, - "install-path": "..\/phpdocumentor\/type-resolver" - }, - { - "name": "phpseclib\/bcmath_compat", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpseclib\/bcmath_compat.git", - "reference": "2ffea8bfe1702b4535a7b3c2649c4301968e9a3c" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpseclib\/bcmath_compat\/zipball\/2ffea8bfe1702b4535a7b3c2649c4301968e9a3c", - "reference": "2ffea8bfe1702b4535a7b3c2649c4301968e9a3c", - "shasum": "" - }, - "require": { - "phpseclib\/phpseclib": "^3.0" - }, - "provide": { - "ext-bcmath": "8.1.0" - }, - "require-dev": { - "phpunit\/phpunit": "^4.8.35|^5.7|^6.0|^9.4", - "squizlabs\/php_codesniffer": "^3.0" - }, - "suggest": { - "ext-gmp": "Will enable faster math operations" - }, - "time": "2021-12-16T02:35:52+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib\/bcmath.php" - ], - "psr-4": { - "bcmath_compat\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "homepage": "http:\/\/phpseclib.sourceforge.net" - } - ], - "description": "PHP 5.x-8.x polyfill for bcmath extension", - "keywords": [ - "BigInteger", - "bcmath", - "bigdecimal", - "math", - "polyfill" - ], - "support": { - "email": "terrafrost@php.net", - "issues": "https:\/\/github.com\/phpseclib\/bcmath_compat\/issues", - "source": "https:\/\/github.com\/phpseclib\/bcmath_compat" - }, - "install-path": "..\/phpseclib\/bcmath_compat" - }, - { - "name": "phpseclib\/phpseclib", - "version": "3.0.23", - "version_normalized": "3.0.23.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpseclib\/phpseclib.git", - "reference": "866cc78fbd82462ffd880e3f65692afe928bed50" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpseclib\/phpseclib\/zipball\/866cc78fbd82462ffd880e3f65692afe928bed50", - "reference": "866cc78fbd82462ffd880e3f65692afe928bed50", - "shasum": "" - }, - "require": { - "paragonie\/constant_time_encoding": "^1|^2", - "paragonie\/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit\/phpunit": "*" - }, - "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2\/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "time": "2023-09-18T17:22:01+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "phpseclib\/bootstrap.php" - ], - "psr-4": { - "phpseclib3\\": "phpseclib\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-J\u00fcrgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http:\/\/phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https:\/\/github.com\/phpseclib\/phpseclib\/issues", - "source": "https:\/\/github.com\/phpseclib\/phpseclib\/tree\/3.0.23" - }, - "funding": [ - { - "url": "https:\/\/github.com\/terrafrost", - "type": "github" - }, - { - "url": "https:\/\/www.patreon.com\/phpseclib", - "type": "patreon" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/phpseclib\/phpseclib", - "type": "tidelift" - } - ], - "install-path": "..\/phpseclib\/phpseclib" - }, - { - "name": "phpstan\/phpdoc-parser", - "version": "1.24.2", - "version_normalized": "1.24.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpstan\/phpdoc-parser.git", - "reference": "bcad8d995980440892759db0c32acae7c8e79442" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/bcad8d995980440892759db0c32acae7c8e79442", - "reference": "bcad8d995980440892759db0c32acae7c8e79442", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine\/annotations": "^2.0", - "nikic\/php-parser": "^4.15", - "php-parallel-lint\/php-parallel-lint": "^1.2", - "phpstan\/extension-installer": "^1.0", - "phpstan\/phpstan": "^1.5", - "phpstan\/phpstan-phpunit": "^1.1", - "phpstan\/phpstan-strict-rules": "^1.0", - "phpunit\/phpunit": "^9.5", - "symfony\/process": "^5.2" - }, - "time": "2023-09-26T12:28:12+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\PHPStan\\PhpDocParser\\": [ - "src\/" - ] - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https:\/\/github.com\/phpstan\/phpdoc-parser\/issues", - "source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/1.24.2" - }, - "install-path": "..\/phpstan\/phpdoc-parser" - }, - { - "name": "psr\/cache", - "version": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/cache.git", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/cache\/zipball\/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "time": "2021-02-03T23:23:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\Cache\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https:\/\/www.php-fig.org\/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https:\/\/github.com\/php-fig\/cache\/tree\/2.0.0" - }, - "install-path": "..\/psr\/cache" - }, - { - "name": "psr\/clock", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/clock\/zipball\/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "time": "2022-11-25T14:36:26+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\Clock\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https:\/\/www.php-fig.org\/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https:\/\/github.com\/php-fig\/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https:\/\/github.com\/php-fig\/clock\/issues", - "source": "https:\/\/github.com\/php-fig\/clock\/tree\/1.0.0" - }, - "install-path": "..\/psr\/clock" - }, - { - "name": "psr\/container", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/container\/zipball\/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "time": "2021-11-05T16:47:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\Container\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https:\/\/www.php-fig.org\/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https:\/\/github.com\/php-fig\/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https:\/\/github.com\/php-fig\/container\/issues", - "source": "https:\/\/github.com\/php-fig\/container\/tree\/2.0.2" - }, - "install-path": "..\/psr\/container" - }, - { - "name": "psr\/event-dispatcher", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/event-dispatcher\/zipball\/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "time": "2019-01-08T18:20:26+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\EventDispatcher\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http:\/\/www.php-fig.org\/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https:\/\/github.com\/php-fig\/event-dispatcher\/issues", - "source": "https:\/\/github.com\/php-fig\/event-dispatcher\/tree\/1.0.0" - }, - "install-path": "..\/psr\/event-dispatcher" - }, - { - "name": "psr\/http-client", - "version": "1.0.3", - "version_normalized": "1.0.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/http-client\/zipball\/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr\/http-message": "^1.0 || ^2.0" - }, - "time": "2023-09-23T14:17:50+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\Http\\Client\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https:\/\/www.php-fig.org\/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https:\/\/github.com\/php-fig\/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https:\/\/github.com\/php-fig\/http-client" - }, - "install-path": "..\/psr\/http-client" - }, - { - "name": "psr\/http-factory", - "version": "1.0.2", - "version_normalized": "1.0.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/http-factory\/zipball\/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr\/http-message": "^1.0 || ^2.0" - }, - "time": "2023-04-10T20:10:41+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\Http\\Message\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https:\/\/www.php-fig.org\/" - } - ], - "description": "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\/tree\/1.0.2" - }, - "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": { - "WP_Ultimo\\Dependencies\\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": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/log\/zipball\/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "time": "2021-07-14T16:41:46+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\Log\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https:\/\/www.php-fig.org\/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https:\/\/github.com\/php-fig\/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https:\/\/github.com\/php-fig\/log\/tree\/2.0.0" - }, - "install-path": "..\/psr\/log" - }, - { - "name": "psr\/simple-cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/php-fig\/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/php-fig\/simple-cache\/zipball\/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-10-23T01:57:42+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Psr\\SimpleCache\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http:\/\/www.php-fig.org\/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https:\/\/github.com\/php-fig\/simple-cache\/tree\/master" - }, - "install-path": "..\/psr\/simple-cache" - }, - { - "name": "rakit\/validation", - "version": "dev-master", - "version_normalized": "dev-master", - "source": { - "type": "git", - "url": "https:\/\/github.com\/rakit\/validation.git", - "reference": "ff003a35cdf5030a5f2482299f4c93f344a35b29" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rakit\/validation\/zipball\/ff003a35cdf5030a5f2482299f4c93f344a35b29", - "reference": "ff003a35cdf5030a5f2482299f4c93f344a35b29", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=7.0" - }, - "require-dev": { - "php-coveralls\/php-coveralls": "^2.2", - "phpunit\/phpunit": "^6.5", - "squizlabs\/php_codesniffer": "^3" - }, - "time": "2020-08-27T05:07:01+00:00", - "default-branch": true, - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Rakit\\Validation\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Muhammad Syifa", - "email": "emsifa@gmail.com" - } - ], - "description": "PHP Laravel like standalone validation library", - "support": { - "issues": "https:\/\/github.com\/rakit\/validation\/issues", - "source": "https:\/\/github.com\/rakit\/validation\/tree\/v1.4.0" - }, - "install-path": "..\/rakit\/validation" - }, - { - "name": "ralouphie\/getallheaders", - "version": "3.0.3", - "version_normalized": "3.0.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/ralouphie\/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/ralouphie\/getallheaders\/zipball\/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls\/php-coveralls": "^2.1", - "phpunit\/phpunit": "^5 || ^6.5" - }, - "time": "2019-03-08T08:55:37+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/getallheaders.php" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https:\/\/github.com\/ralouphie\/getallheaders\/issues", - "source": "https:\/\/github.com\/ralouphie\/getallheaders\/tree\/develop" - }, - "install-path": "..\/ralouphie\/getallheaders" - }, - { - "name": "remotelyliving\/php-dns", - "version": "4.3.0", - "version_normalized": "4.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/remotelyliving\/php-dns.git", - "reference": "fa1eebebe6275487e947cd2109874ce960dd7717" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/remotelyliving\/php-dns\/zipball\/fa1eebebe6275487e947cd2109874ce960dd7717", - "reference": "fa1eebebe6275487e947cd2109874ce960dd7717", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp\/guzzle": "^7.0 || ^6.0", - "guzzlehttp\/promises": "^1.3", - "php": ">=7.4", - "psr\/cache": "^1.0 || ^2.0", - "psr\/log": "^1.0 || ^2.0 || ^3.0", - "spatie\/dns": "^1.5", - "symfony\/event-dispatcher": "^6.0 || ^5.0 || ^4.0 || ^3.0" - }, - "require-dev": { - "bmitch\/churn-php": "^1.5", - "maglnet\/composer-require-checker": "@stable", - "php-coveralls\/php-coveralls": "^2.1", - "phpunit\/phpunit": "^9.0", - "psy\/psysh": "^0.9.9", - "rector\/rector": "^0.12.8", - "squizlabs\/php_codesniffer": "^3.3", - "symfony\/cache": "^4.3", - "vimeo\/psalm": "^4.10" - }, - "time": "2021-12-22T02:56:43+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\RemotelyLiving\\PHPDNS\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "chthomas", - "email": "christian.h.thomas@me.com" - } - ], - "description": "A php library for abstracting DNS querying", - "support": { - "issues": "https:\/\/github.com\/remotelyliving\/php-dns\/issues", - "source": "https:\/\/github.com\/remotelyliving\/php-dns\/tree\/4.3.0" - }, - "install-path": "..\/remotelyliving\/php-dns" - }, - { - "name": "rpnzl\/arrch", - "version": "dev-master", - "version_normalized": "dev-master", - "source": { - "type": "git", - "url": "https:\/\/github.com\/rpnzl\/arrch.git", - "reference": "994258bbefb7722243211654c4f78813312cd5ed" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rpnzl\/arrch\/zipball\/994258bbefb7722243211654c4f78813312cd5ed", - "reference": "994258bbefb7722243211654c4f78813312cd5ed", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2014-08-26T16:32:28+00:00", - "default-branch": true, - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Arrch\\": "src\/Arrch\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Giuliana", - "email": "mike@rpnzl.com", - "homepage": "http:\/\/rpnzl.com", - "role": "Developer" - } - ], - "description": "Array queries for PHP 5.3", - "homepage": "https:\/\/github.com\/rpnzl\/arrch", - "keywords": [ - "array", - "query", - "search" - ], - "support": { - "issues": "https:\/\/github.com\/rpnzl\/arrch\/issues", - "source": "https:\/\/github.com\/rpnzl\/arrch\/tree\/master" - }, - "install-path": "..\/rpnzl\/arrch" - }, - { - "name": "scssphp\/scssphp", - "version": "v1.11.1", - "version_normalized": "1.11.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/scssphp\/scssphp.git", - "reference": "ace2503684bab0dcc817d7614c8a54b865122414" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/scssphp\/scssphp\/zipball\/ace2503684bab0dcc817d7614c8a54b865122414", - "reference": "ace2503684bab0dcc817d7614c8a54b865122414", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "php": ">=5.6.0" - }, - "require-dev": { - "bamarni\/composer-bin-plugin": "^1.4", - "phpunit\/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", - "sass\/sass-spec": "*", - "squizlabs\/php_codesniffer": "~3.5", - "symfony\/phpunit-bridge": "^5.1", - "thoughtbot\/bourbon": "^7.0", - "twbs\/bootstrap": "~5.0", - "twbs\/bootstrap4": "4.6.1", - "zurb\/foundation": "~6.7.0" - }, - "suggest": { - "ext-iconv": "Can be used as fallback when ext-mbstring is not available", - "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" - }, - "time": "2023-09-24T13:38:17+00:00", - "bin": [ - "bin\/pscss" - ], - "type": "library", - "extra": { - "bamarni-bin": { - "forward-command": false, - "bin-links": false - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\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\u00e9dric Morin", - "email": "cedric@yterium.com", - "homepage": "https:\/\/github.com\/Cerdic" - } - ], - "description": "scssphp is a compiler for SCSS written in PHP.", - "homepage": "http:\/\/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\/v1.11.1" - }, - "install-path": "..\/scssphp\/scssphp" - }, - { - "name": "setasign\/fpdi", - "version": "v2.5.0", - "version_normalized": "2.5.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/Setasign\/FPDI.git", - "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/Setasign\/FPDI\/zipball\/ecf0459643ec963febfb9a5d529dcd93656006a4", - "reference": "ecf0459643ec963febfb9a5d529dcd93656006a4", - "shasum": "" - }, - "require": { - "ext-zlib": "*", - "php": "^5.6 || ^7.0 || ^8.0" - }, - "conflict": { - "setasign\/tfpdf": "<1.31" - }, - "require-dev": { - "phpunit\/phpunit": "~5.7", - "setasign\/fpdf": "~1.8", - "setasign\/tfpdf": "~1.31", - "squizlabs\/php_codesniffer": "^3.5", - "tecnickcom\/tcpdf": "~6.2" - }, - "suggest": { - "setasign\/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." - }, - "time": "2023-09-28T10:46:27+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\setasign\\Fpdi\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Slabon", - "email": "jan.slabon@setasign.com", - "homepage": "https:\/\/www.setasign.com" - }, - { - "name": "Maximilian Kresse", - "email": "maximilian.kresse@setasign.com", - "homepage": "https:\/\/www.setasign.com" - } - ], - "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", - "homepage": "https:\/\/www.setasign.com\/fpdi", - "keywords": [ - "fpdf", - "fpdi", - "pdf" - ], - "support": { - "issues": "https:\/\/github.com\/Setasign\/FPDI\/issues", - "source": "https:\/\/github.com\/Setasign\/FPDI\/tree\/v2.5.0" - }, - "funding": [ - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/setasign\/fpdi", - "type": "tidelift" - } - ], - "install-path": "..\/setasign\/fpdi" - }, - { - "name": "spatie\/dns", - "version": "1.6.0", - "version_normalized": "1.6.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/spatie\/dns.git", - "reference": "2ca388f359323364aaf438a5fa28da74bc55c6f4" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/spatie\/dns\/zipball\/2ca388f359323364aaf438a5fa28da74bc55c6f4", - "reference": "2ca388f359323364aaf438a5fa28da74bc55c6f4", - "shasum": "" - }, - "require": { - "php": "^7.4|^8.0", - "symfony\/process": "^5.0" - }, - "require-dev": { - "phpunit\/phpunit": "^9.4" - }, - "time": "2020-12-02T19:24:48+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Spatie\\Dns\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Harish Toshniwal", - "email": "harish@spatie.be", - "homepage": "https:\/\/spatie.be", - "role": "Developer" - }, - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https:\/\/spatie.be", - "role": "Developer" - } - ], - "description": "Retrieve DNS records", - "homepage": "https:\/\/github.com\/spatie\/dns", - "keywords": [ - "dns", - "spatie" - ], - "support": { - "issues": "https:\/\/github.com\/spatie\/dns\/issues", - "source": "https:\/\/github.com\/spatie\/dns\/tree\/1.6.0" - }, - "install-path": "..\/spatie\/dns" - }, - { - "name": "spatie\/macroable", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/spatie\/macroable.git", - "reference": "7a99549fc001c925714b329220dea680c04bfa48" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/spatie\/macroable\/zipball\/7a99549fc001c925714b329220dea680c04bfa48", - "reference": "7a99549fc001c925714b329220dea680c04bfa48", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "require-dev": { - "phpunit\/phpunit": "^8.0|^9.3" - }, - "time": "2020-11-03T10:15:05+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Spatie\\Macroable\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https:\/\/spatie.be", - "role": "Developer" - } - ], - "description": "A trait to dynamically add methods to a class", - "homepage": "https:\/\/github.com\/spatie\/macroable", - "keywords": [ - "macroable", - "spatie" - ], - "support": { - "issues": "https:\/\/github.com\/spatie\/macroable\/issues", - "source": "https:\/\/github.com\/spatie\/macroable\/tree\/1.0.1" - }, - "install-path": "..\/spatie\/macroable" - }, - { - "name": "spatie\/ssl-certificate", - "version": "1.22.1", - "version_normalized": "1.22.1.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/spatie\/ssl-certificate.git", - "reference": "c4756c3f18f9abeea62cfe99fc841229d9fead2c" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/spatie\/ssl-certificate\/zipball\/c4756c3f18f9abeea62cfe99fc841229d9fead2c", - "reference": "c4756c3f18f9abeea62cfe99fc841229d9fead2c", - "shasum": "" - }, - "require": { - "ext-intl": "*", - "ext-json": "*", - "nesbot\/carbon": "^2.23", - "php": "^7.4|^8.0", - "spatie\/macroable": "^1.0" - }, - "require-dev": { - "phpunit\/phpunit": "^9.0", - "spatie\/phpunit-snapshot-assertions": "^4.2.3" - }, - "time": "2021-02-15T15:42:15+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src\/helpers.php" - ], - "psr-4": { - "WP_Ultimo\\Dependencies\\Spatie\\SslCertificate\\": "src" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https:\/\/spatie.be", - "role": "Developer" - } - ], - "description": "A class to easily query the properties of an ssl certificate", - "homepage": "https:\/\/github.com\/spatie\/ssl-certificate", - "keywords": [ - "spatie", - "ssl-certificate" - ], - "support": { - "issues": "https:\/\/github.com\/spatie\/ssl-certificate\/issues", - "source": "https:\/\/github.com\/spatie\/ssl-certificate\/tree\/1.22.1" - }, - "funding": [ - { - "url": "https:\/\/github.com\/sponsors\/spatie", - "type": "github" - }, - { - "url": "https:\/\/spatie.be\/open-source\/support-us", - "type": "other" - } - ], - "install-path": "..\/spatie\/ssl-certificate" - }, - { - "name": "stripe\/stripe-php", - "version": "v10.21.0", - "version_normalized": "10.21.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/stripe\/stripe-php.git", - "reference": "b4ab319731958077227fad1874a3671458c5d593" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/stripe\/stripe-php\/zipball\/b4ab319731958077227fad1874a3671458c5d593", - "reference": "b4ab319731958077227fad1874a3671458c5d593", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "php": ">=5.6.0" - }, - "require-dev": { - "friendsofphp\/php-cs-fixer": "3.5.0", - "php-coveralls\/php-coveralls": "^2.5", - "phpstan\/phpstan": "^1.2", - "phpunit\/phpunit": "^5.7 || ^9.0", - "squizlabs\/php_codesniffer": "^3.3" - }, - "time": "2023-08-11T00:23:24+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Stripe\\": "lib\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stripe and contributors", - "homepage": "https:\/\/github.com\/stripe\/stripe-php\/contributors" - } - ], - "description": "Stripe PHP Library", - "homepage": "https:\/\/stripe.com\/", - "keywords": [ - "api", - "payment processing", - "stripe" - ], - "support": { - "issues": "https:\/\/github.com\/stripe\/stripe-php\/issues", - "source": "https:\/\/github.com\/stripe\/stripe-php\/tree\/v10.21.0" - }, - "install-path": "..\/stripe\/stripe-php" - }, - { - "name": "symfony\/cache", - "version": "v5.4.29", - "version_normalized": "5.4.29.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/cache.git", - "reference": "e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/cache\/zipball\/e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151", - "reference": "e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr\/cache": "^1.0|^2.0", - "psr\/log": "^1.1|^2|^3", - "symfony\/cache-contracts": "^1.1.7|^2", - "symfony\/deprecation-contracts": "^2.1|^3", - "symfony\/polyfill-php73": "^1.9", - "symfony\/polyfill-php80": "^1.16", - "symfony\/service-contracts": "^1.1|^2|^3", - "symfony\/var-exporter": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine\/dbal": "<2.13.1", - "symfony\/dependency-injection": "<4.4", - "symfony\/http-kernel": "<4.4", - "symfony\/var-dumper": "<4.4" - }, - "provide": { - "psr\/cache-implementation": "1.0|2.0", - "psr\/simple-cache-implementation": "1.0|2.0", - "symfony\/cache-implementation": "1.0|2.0" - }, - "require-dev": { - "cache\/integration-tests": "dev-master", - "doctrine\/cache": "^1.6|^2.0", - "doctrine\/dbal": "^2.13.1|^3.0", - "predis\/predis": "^1.1", - "psr\/simple-cache": "^1.0|^2.0", - "symfony\/config": "^4.4|^5.0|^6.0", - "symfony\/dependency-injection": "^4.4|^5.0|^6.0", - "symfony\/filesystem": "^4.4|^5.0|^6.0", - "symfony\/http-kernel": "^4.4|^5.0|^6.0", - "symfony\/messenger": "^4.4|^5.0|^6.0", - "symfony\/var-dumper": "^4.4|^5.0|^6.0" - }, - "time": "2023-09-19T13:25:51+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "\/Tests\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/cache\/tree\/v5.4.29" - }, - "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\/cache" - }, - { - "name": "symfony\/cache-contracts", - "version": "v2.5.2", - "version_normalized": "2.5.2.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/cache-contracts.git", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/cache-contracts\/zipball\/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr\/cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "symfony\/cache-implementation": "" - }, - "time": "2022-01-02T09:53:40+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/cache-contracts\/tree\/v2.5.2" - }, - "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\/cache-contracts" - }, - { - "name": "symfony\/deprecation-contracts", - "version": "v3.3.0", - "version_normalized": "3.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/deprecation-contracts\/zipball\/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "time": "2023-05-23T14:45:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https:\/\/symfony.com", - "support": { - "source": "https:\/\/github.com\/symfony\/deprecation-contracts\/tree\/v3.3.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\/deprecation-contracts" - }, - { - "name": "symfony\/event-dispatcher", - "version": "v5.4.26", - "version_normalized": "5.4.26.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/event-dispatcher.git", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/event-dispatcher\/zipball\/5dcc00e03413f05c1e7900090927bb7247cb0aac", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony\/deprecation-contracts": "^2.1|^3", - "symfony\/event-dispatcher-contracts": "^2|^3", - "symfony\/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony\/dependency-injection": "<4.4" - }, - "provide": { - "psr\/event-dispatcher-implementation": "1.0", - "symfony\/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr\/log": "^1|^2|^3", - "symfony\/config": "^4.4|^5.0|^6.0", - "symfony\/dependency-injection": "^4.4|^5.0|^6.0", - "symfony\/error-handler": "^4.4|^5.0|^6.0", - "symfony\/expression-language": "^4.4|^5.0|^6.0", - "symfony\/http-foundation": "^4.4|^5.0|^6.0", - "symfony\/service-contracts": "^1.1|^2|^3", - "symfony\/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony\/dependency-injection": "", - "symfony\/http-kernel": "" - }, - "time": "2023-07-06T06:34:20+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "\/Tests\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https:\/\/symfony.com", - "support": { - "source": "https:\/\/github.com\/symfony\/event-dispatcher\/tree\/v5.4.26" - }, - "funding": [ - { - "url": "https:\/\/symfony.com\/sponsor", - "type": "custom" - }, - { - "url": "https:\/\/github.com\/fabpot", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony", - "type": "tidelift" - } - ], - "install-path": "..\/symfony\/event-dispatcher" - }, - { - "name": "symfony\/event-dispatcher-contracts", - "version": "v3.3.0", - "version_normalized": "3.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/event-dispatcher-contracts\/zipball\/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr\/event-dispatcher": "^1" - }, - "time": "2023-05-23T14:45:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/event-dispatcher-contracts\/tree\/v3.3.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\/event-dispatcher-contracts" - }, - { - "name": "symfony\/polyfill-mbstring", - "version": "v1.28.0", - "version_normalized": "1.28.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2023-07-28T09:04:16+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony\/polyfill", - "url": "https:\/\/github.com\/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.28.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-php73", - "version": "v1.28.0", - "version_normalized": "1.28.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-php73\/zipball\/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2023-01-26T09:26:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony\/polyfill", - "url": "https:\/\/github.com\/symfony\/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources\/stubs" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/polyfill-php73\/tree\/v1.28.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-php73" - }, - { - "name": "symfony\/polyfill-php80", - "version": "v1.28.0", - "version_normalized": "1.28.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-php80\/zipball\/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2023-01-26T09:26:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony\/polyfill", - "url": "https:\/\/github.com\/symfony\/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources\/stubs" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/polyfill-php80\/tree\/v1.28.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-php80" - }, - { - "name": "symfony\/polyfill-php81", - "version": "v1.28.0", - "version_normalized": "1.28.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-php81\/zipball\/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2023-01-26T09:26:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony\/polyfill", - "url": "https:\/\/github.com\/symfony\/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources\/stubs" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/polyfill-php81\/tree\/v1.28.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-php81" - }, - { - "name": "symfony\/process", - "version": "v5.4.28", - "version_normalized": "5.4.28.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/process.git", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony\/polyfill-php80": "^1.16" - }, - "time": "2023-08-07T10:36:04+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "\/Tests\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https:\/\/symfony.com", - "support": { - "source": "https:\/\/github.com\/symfony\/process\/tree\/v5.4.28" - }, - "funding": [ - { - "url": "https:\/\/symfony.com\/sponsor", - "type": "custom" - }, - { - "url": "https:\/\/github.com\/fabpot", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony", - "type": "tidelift" - } - ], - "install-path": "..\/symfony\/process" - }, - { - "name": "symfony\/service-contracts", - "version": "v3.3.0", - "version_normalized": "3.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/service-contracts\/zipball\/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr\/container": "^2.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "time": "2023-05-23T14:45:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "\/Test\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/service-contracts\/tree\/v3.3.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\/service-contracts" - }, - { - "name": "symfony\/translation", - "version": "v6.3.3", - "version_normalized": "6.3.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/translation.git", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/translation\/zipball\/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony\/deprecation-contracts": "^2.5|^3", - "symfony\/polyfill-mbstring": "~1.0", - "symfony\/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony\/config": "<5.4", - "symfony\/console": "<5.4", - "symfony\/dependency-injection": "<5.4", - "symfony\/http-client-contracts": "<2.5", - "symfony\/http-kernel": "<5.4", - "symfony\/service-contracts": "<2.5", - "symfony\/twig-bundle": "<5.4", - "symfony\/yaml": "<5.4" - }, - "provide": { - "symfony\/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic\/php-parser": "^4.13", - "psr\/log": "^1|^2|^3", - "symfony\/config": "^5.4|^6.0", - "symfony\/console": "^5.4|^6.0", - "symfony\/dependency-injection": "^5.4|^6.0", - "symfony\/finder": "^5.4|^6.0", - "symfony\/http-client-contracts": "^2.5|^3.0", - "symfony\/http-kernel": "^5.4|^6.0", - "symfony\/intl": "^5.4|^6.0", - "symfony\/polyfill-intl-icu": "^1.21", - "symfony\/routing": "^5.4|^6.0", - "symfony\/service-contracts": "^2.5|^3", - "symfony\/yaml": "^5.4|^6.0" - }, - "time": "2023-07-31T07:08:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "Resources\/functions.php" - ], - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "\/Tests\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Provides tools to internationalize your application", - "homepage": "https:\/\/symfony.com", - "support": { - "source": "https:\/\/github.com\/symfony\/translation\/tree\/v6.3.3" - }, - "funding": [ - { - "url": "https:\/\/symfony.com\/sponsor", - "type": "custom" - }, - { - "url": "https:\/\/github.com\/fabpot", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony", - "type": "tidelift" - } - ], - "install-path": "..\/symfony\/translation" - }, - { - "name": "symfony\/translation-contracts", - "version": "v3.3.0", - "version_normalized": "3.3.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/translation-contracts.git", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/translation-contracts\/zipball\/02c24deb352fb0d79db5486c0c79905a85e37e86", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "time": "2023-05-30T17:17:10+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony\/contracts", - "url": "https:\/\/github.com\/symfony\/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "\/Test\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/translation-contracts\/tree\/v3.3.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\/translation-contracts" - }, - { - "name": "symfony\/var-exporter", - "version": "v6.3.4", - "version_normalized": "6.3.4.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/symfony\/var-exporter.git", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/symfony\/var-exporter\/zipball\/df1f8aac5751871b83d30bf3e2c355770f8f0691", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony\/var-dumper": "^5.4|^6.0" - }, - "time": "2023-08-16T18:14:47+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "\/Tests\/" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https:\/\/symfony.com\/contributors" - } - ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https:\/\/symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https:\/\/github.com\/symfony\/var-exporter\/tree\/v6.3.4" - }, - "funding": [ - { - "url": "https:\/\/symfony.com\/sponsor", - "type": "custom" - }, - { - "url": "https:\/\/github.com\/fabpot", - "type": "github" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony", - "type": "tidelift" - } - ], - "install-path": "..\/symfony\/var-exporter" - }, - { - "name": "webmozart\/assert", - "version": "1.11.0", - "version_normalized": "1.11.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/webmozarts\/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/webmozarts\/assert\/zipball\/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan\/phpstan": "<0.12.20", - "vimeo\/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit\/phpunit": "^8.5.13" - }, - "time": "2022-06-03T18:03:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "WP_Ultimo\\Dependencies\\Webmozart\\Assert\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input\/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https:\/\/github.com\/webmozarts\/assert\/issues", - "source": "https:\/\/github.com\/webmozarts\/assert\/tree\/1.11.0" - }, - "install-path": "..\/webmozart\/assert" - }, - { - "name": "woocommerce\/action-scheduler", - "version": "3.6.4", - "version_normalized": "3.6.4.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/woocommerce\/action-scheduler.git", - "reference": "e7dafe215be5ef823392204535ee2e241f99a8cb" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/woocommerce\/action-scheduler\/zipball\/e7dafe215be5ef823392204535ee2e241f99a8cb", - "reference": "e7dafe215be5ef823392204535ee2e241f99a8cb", - "shasum": "" - }, - "require-dev": { - "phpunit\/phpunit": "^7.5", - "woocommerce\/woocommerce-sniffs": "0.1.0", - "wp-cli\/wp-cli": "~2.5.0", - "yoast\/phpunit-polyfills": "^1.0" - }, - "time": "2023-10-11T18:24:47+00:00", - "type": "wordpress-plugin", - "extra": { - "scripts-description": { - "test": "Run unit tests", - "phpcs": "Analyze code against the WordPress coding standards with PHP_CodeSniffer", - "phpcbf": "Fix coding standards warnings\/errors automatically with PHP Code Beautifier" - } - }, - "installation-source": "dist", - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "GPL-3.0-or-later" - ], - "description": "Action Scheduler for WordPress and WooCommerce", - "homepage": "https:\/\/actionscheduler.org\/", - "support": { - "issues": "https:\/\/github.com\/woocommerce\/action-scheduler\/issues", - "source": "https:\/\/github.com\/woocommerce\/action-scheduler\/tree\/3.6.4" - }, - "install-path": "..\/woocommerce\/action-scheduler" - }, - { - "name": "yahnis-elsts\/plugin-update-checker", - "version": "v4.11", - "version_normalized": "4.11.0.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/YahnisElsts\/plugin-update-checker.git", - "reference": "3155f2d3f1ca5e7ed3f25b256f020e370515af43" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/YahnisElsts\/plugin-update-checker\/zipball\/3155f2d3f1ca5e7ed3f25b256f020e370515af43", - "reference": "3155f2d3f1ca5e7ed3f25b256f020e370515af43", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=5.2.0" - }, - "time": "2021-03-15T16:07:52+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "load-v4p11.php" - ] - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Yahnis Elsts", - "email": "whiteshadow@w-shadow.com", - "homepage": "http:\/\/w-shadow.com\/", - "role": "Developer" - } - ], - "description": "A custom update checker for WordPress plugins and themes. Useful if you can't host your plugin in the official WP repository but still want it to support automatic updates.", - "homepage": "https:\/\/github.com\/YahnisElsts\/plugin-update-checker\/", - "keywords": [ - "automatic updates", - "plugin updates", - "theme updates", - "wordpress" - ], - "support": { - "issues": "https:\/\/github.com\/YahnisElsts\/plugin-update-checker\/issues", - "source": "https:\/\/github.com\/YahnisElsts\/plugin-update-checker\/tree\/v4.11" - }, - "install-path": "..\/yahnis-elsts\/plugin-update-checker" - } - ], - "dev": false, - "dev-package-names": [] -} \ No newline at end of file diff --git a/dependencies/composer/installed.php b/dependencies/composer/installed.php deleted file mode 100644 index 659662e..0000000 --- a/dependencies/composer/installed.php +++ /dev/null @@ -1,5 +0,0 @@ - array('name' => 'next-press/wp-ultimo', 'pretty_version' => '2.3.2', 'version' => '2.3.2.0', 'reference' => NULL, 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('amphp/amp' => array('pretty_version' => 'v2.6.2', 'version' => '2.6.2.0', 'reference' => '9d5100cebffa729aaffecd3ad25dc5aeea4f13bb', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/amp', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/byte-stream' => array('pretty_version' => 'v1.8.1', 'version' => '1.8.1.0', 'reference' => 'acbd8002b3536485c997c4e019206b3f10ca15bd', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/byte-stream', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/cache' => array('pretty_version' => 'v1.5.0', 'version' => '1.5.0.0', 'reference' => '2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/cache', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/dns' => array('pretty_version' => 'v1.2.3', 'version' => '1.2.3.0', 'reference' => '852292532294d7972c729a96b49756d781f7c59d', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/dns', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/hpack' => array('pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '95895d29ae577a3a5995b46d16def04e11e39947', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/hpack', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/http' => array('pretty_version' => 'v1.7.1', 'version' => '1.7.1.0', 'reference' => '0d729b09fbace00dd1fd35ae8d4d45eb25f39d96', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/http', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/http-client' => array('pretty_version' => 'v4.6.3', 'version' => '4.6.3.0', 'reference' => '6d4dcc7b7bd9a6ea58e26652eba632ccbc16c030', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/http-client', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/parser' => array('pretty_version' => 'v1.1.0', 'version' => '1.1.0.0', 'reference' => 'ff1de4144726c5dad5fab97f66692ebe8de3e151', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/parser', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/process' => array('pretty_version' => 'v1.1.4', 'version' => '1.1.4.0', 'reference' => '76e9495fd6818b43a20167cb11d8a67f7744ee0f', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/process', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/serialization' => array('pretty_version' => 'v1.0.0', 'version' => '1.0.0.0', 'reference' => '693e77b2fb0b266c3c7d622317f881de44ae94a1', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/serialization', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/socket' => array('pretty_version' => 'v1.2.0', 'version' => '1.2.0.0', 'reference' => 'a8af9f5d0a66c5fe9567da45a51509e592788fe6', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/socket', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/sync' => array('pretty_version' => 'v1.4.2', 'version' => '1.4.2.0', 'reference' => '85ab06764f4f36d63b1356b466df6111cf4b89cf', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/sync', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/windows-registry' => array('pretty_version' => 'v0.3.3', 'version' => '0.3.3.0', 'reference' => '0f56438b9197e224325e88f305346f0221df1f71', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/windows-registry', 'aliases' => array(), 'dev_requirement' => \false), 'berlindb/core' => array('pretty_version' => '2.0.1', 'version' => '2.0.1.0', 'reference' => '7dcddaddcffb69c58800d2fb3f6f169791cab1f7', 'type' => 'library', 'install_path' => __DIR__ . '/../berlindb/core', 'aliases' => array(), 'dev_requirement' => \false), 'daverandom/libdns' => array('pretty_version' => 'v2.0.3', 'version' => '2.0.3.0', 'reference' => '42c2d700d1178c9f9e78664793463f7f1aea248c', 'type' => 'library', 'install_path' => __DIR__ . '/../daverandom/libdns', 'aliases' => array(), 'dev_requirement' => \false), 'delight-im/cookie' => array('pretty_version' => 'v3.4.0', 'version' => '3.4.0.0', 'reference' => '67065d34272377d63bab0bd58f984f9b228c803f', 'type' => 'library', 'install_path' => __DIR__ . '/../delight-im/cookie', 'aliases' => array(), 'dev_requirement' => \false), 'delight-im/http' => array('pretty_version' => 'v2.1.0', 'version' => '2.1.0.0', 'reference' => 'a5c2c4eae1dd3207f797984e8f64f2d71ed889dd', 'type' => 'library', 'install_path' => __DIR__ . '/../delight-im/http', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/deprecations' => array('pretty_version' => '1.1.2', 'version' => '1.1.2.0', 'reference' => '4f2d4f2836e7ec4e7a8625e75c6aa916004db931', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/deprecations', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/guzzle' => array('pretty_version' => '7.8.0', 'version' => '7.8.0.0', 'reference' => '1110f66a6530a40fe7aea0378fe608ee2b2248f9', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/promises' => array('pretty_version' => '1.5.3', 'version' => '1.5.3.0', 'reference' => '67ab6e18aaa14d753cc148911d273f6e6cb6721e', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/psr7' => array('pretty_version' => '2.6.1', 'version' => '2.6.1.0', 'reference' => 'be45764272e8873c72dbe3d2edcfdfcc3bc9f727', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), 'dev_requirement' => \false), 'hashids/hashids' => array('pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => '8cab111f78e0bd9c76953b082919fc9e251761be', 'type' => 'library', 'install_path' => __DIR__ . '/../hashids/hashids', 'aliases' => array(), 'dev_requirement' => \false), 'ifsnop/mysqldump-php' => array('pretty_version' => 'v2.12', 'version' => '2.12.0.0', 'reference' => '2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3', 'type' => 'library', 'install_path' => __DIR__ . '/../ifsnop/mysqldump-php', 'aliases' => array(), 'dev_requirement' => \false), 'jasny/immutable' => array('pretty_version' => 'v2.1.0', 'version' => '2.1.0.0', 'reference' => '1a4ffb42bea73ea5d318f39b3a5dd283aec063f9', 'type' => 'library', 'install_path' => __DIR__ . '/../jasny/immutable', 'aliases' => array(), 'dev_requirement' => \false), 'jasny/sso' => array('pretty_version' => 'v0.4.2', 'version' => '0.4.2.0', 'reference' => 'fb4f0916911b00797425237abfb073ffee8cba1c', 'type' => 'library', 'install_path' => __DIR__ . '/../jasny/sso', 'aliases' => array(), 'dev_requirement' => \false), 'kelunik/certificate' => array('pretty_version' => 'v1.1.3', 'version' => '1.1.3.0', 'reference' => '7e00d498c264d5eb4f78c69f41c8bd6719c0199e', 'type' => 'library', 'install_path' => __DIR__ . '/../kelunik/certificate', 'aliases' => array(), 'dev_requirement' => \false), 'league/uri' => array('pretty_version' => '7.3.0', 'version' => '7.3.0.0', 'reference' => '36743c3961bb82bf93da91917b6bced0358a8d45', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri', 'aliases' => array(), 'dev_requirement' => \false), 'league/uri-interfaces' => array('pretty_version' => '7.3.0', 'version' => '7.3.0.0', 'reference' => 'c409b60ed2245ff94c965a8c798a60166db53361', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri-interfaces', 'aliases' => array(), 'dev_requirement' => \false), 'league/uri-parser' => array('pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'reference' => '671548427e4c932352d9b9279fdfa345bf63fa00', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri-parser', 'aliases' => array(), 'dev_requirement' => \false), 'mexitek/phpcolors' => array('pretty_version' => 'v1.0.4', 'version' => '1.0.4.0', 'reference' => '4043974240ca7dc3c2bec3c158588148b605b206', 'type' => 'library', 'install_path' => __DIR__ . '/../mexitek/phpcolors', 'aliases' => array(), 'dev_requirement' => \false), 'mpdf/mpdf' => array('pretty_version' => 'v8.2.0', 'version' => '8.2.0.0', 'reference' => '170a236a588d177c2aa7447ce490a030ca68e6f4', 'type' => 'library', 'install_path' => __DIR__ . '/../mpdf/mpdf', 'aliases' => array(), 'dev_requirement' => \false), 'mpdf/psr-http-message-shim' => array('pretty_version' => 'v2.0.1', 'version' => '2.0.1.0', 'reference' => 'f25a0153d645e234f9db42e5433b16d9b113920f', 'type' => 'library', 'install_path' => __DIR__ . '/../mpdf/psr-http-message-shim', 'aliases' => array(), 'dev_requirement' => \false), 'mpdf/psr-log-aware-trait' => array('pretty_version' => 'v2.0.0', 'version' => '2.0.0.0', 'reference' => '7a077416e8f39eb626dee4246e0af99dd9ace275', 'type' => 'library', 'install_path' => __DIR__ . '/../mpdf/psr-log-aware-trait', 'aliases' => array(), 'dev_requirement' => \false), 'myclabs/deep-copy' => array('pretty_version' => '1.11.1', 'version' => '1.11.1.0', 'reference' => '7284c22080590fb39f2ffa3e9057f10a4ddd0e0c', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'dev_requirement' => \false), 'nesbot/carbon' => array('pretty_version' => '2.71.0', 'version' => '2.71.0.0', 'reference' => '98276233188583f2ff845a0f992a235472d9466a', 'type' => 'library', 'install_path' => __DIR__ . '/../nesbot/carbon', 'aliases' => array(), 'dev_requirement' => \false), 'next-press/wp-ultimo' => array('pretty_version' => '2.3.2', 'version' => '2.3.2.0', 'reference' => NULL, 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'nyholm/psr7' => array('pretty_version' => '1.8.0', 'version' => '1.8.0.0', 'reference' => '3cb4d163b58589e47b35103e8e5e6a6a475b47be', 'type' => 'library', 'install_path' => __DIR__ . '/../nyholm/psr7', 'aliases' => array(), 'dev_requirement' => \false), 'pablo-sg-pacheco/wp-namespace-autoloader' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '069163f215743c83381613749ace0c5a642720b4', 'type' => 'library', 'install_path' => __DIR__ . '/../pablo-sg-pacheco/wp-namespace-autoloader', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'paragonie/constant_time_encoding' => array('pretty_version' => 'v2.6.3', 'version' => '2.6.3.0', 'reference' => '58c3f47f650c94ec05a151692652a868995d2938', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', 'aliases' => array(), 'dev_requirement' => \false), 'paragonie/random_compat' => array('pretty_version' => 'v9.99.100', 'version' => '9.99.100.0', 'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/random_compat', 'aliases' => array(), 'dev_requirement' => \false), 'php-http/message-factory-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'phpdocumentor/reflection-common' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-docblock' => array('pretty_version' => '5.3.0', 'version' => '5.3.0.0', 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/type-resolver' => array('pretty_version' => '1.7.3', 'version' => '1.7.3.0', 'reference' => '3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'dev_requirement' => \false), 'phpseclib/bcmath_compat' => array('pretty_version' => '2.0.1', 'version' => '2.0.1.0', 'reference' => '2ffea8bfe1702b4535a7b3c2649c4301968e9a3c', 'type' => 'library', 'install_path' => __DIR__ . '/../phpseclib/bcmath_compat', 'aliases' => array(), 'dev_requirement' => \false), 'phpseclib/phpseclib' => array('pretty_version' => '3.0.23', 'version' => '3.0.23.0', 'reference' => '866cc78fbd82462ffd880e3f65692afe928bed50', 'type' => 'library', 'install_path' => __DIR__ . '/../phpseclib/phpseclib', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.24.2', 'version' => '1.24.2.0', 'reference' => 'bcad8d995980440892759db0c32acae7c8e79442', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'psr/cache' => array('pretty_version' => '2.0.0', 'version' => '2.0.0.0', 'reference' => '213f9dbc5b9bfbc4f8db86d2838dc968752ce13b', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/cache', 'aliases' => array(), 'dev_requirement' => \false), 'psr/cache-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0')), 'psr/clock' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/clock', 'aliases' => array(), 'dev_requirement' => \false), 'psr/clock-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/container' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => \false), 'psr/event-dispatcher' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/event-dispatcher', 'aliases' => array(), 'dev_requirement' => \false), 'psr/event-dispatcher-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-client' => array('pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-client-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-factory' => array('pretty_version' => '1.0.2', 'version' => '1.0.2.0', 'reference' => 'e616d01114759c4c489f93b099585439f795fe35', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-factory-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), '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/http-message-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/log' => array('pretty_version' => '2.0.0', 'version' => '2.0.0.0', 'reference' => 'ef29f6d262798707a9edd554e2b82517ef3a9376', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'psr/simple-cache' => array('pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/simple-cache', 'aliases' => array(), 'dev_requirement' => \false), 'psr/simple-cache-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0')), 'rakit/validation' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => 'ff003a35cdf5030a5f2482299f4c93f344a35b29', 'type' => 'library', 'install_path' => __DIR__ . '/../rakit/validation', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'ralouphie/getallheaders' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'type' => 'library', 'install_path' => __DIR__ . '/../ralouphie/getallheaders', 'aliases' => array(), 'dev_requirement' => \false), 'remotelyliving/php-dns' => array('pretty_version' => '4.3.0', 'version' => '4.3.0.0', 'reference' => 'fa1eebebe6275487e947cd2109874ce960dd7717', 'type' => 'library', 'install_path' => __DIR__ . '/../remotelyliving/php-dns', 'aliases' => array(), 'dev_requirement' => \false), 'rpnzl/arrch' => array('pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => '994258bbefb7722243211654c4f78813312cd5ed', 'type' => 'library', 'install_path' => __DIR__ . '/../rpnzl/arrch', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'scssphp/scssphp' => array('pretty_version' => 'v1.11.1', 'version' => '1.11.1.0', 'reference' => 'ace2503684bab0dcc817d7614c8a54b865122414', 'type' => 'library', 'install_path' => __DIR__ . '/../scssphp/scssphp', 'aliases' => array(), 'dev_requirement' => \false), 'setasign/fpdi' => array('pretty_version' => 'v2.5.0', 'version' => '2.5.0.0', 'reference' => 'ecf0459643ec963febfb9a5d529dcd93656006a4', 'type' => 'library', 'install_path' => __DIR__ . '/../setasign/fpdi', 'aliases' => array(), 'dev_requirement' => \false), 'spatie/dns' => array('pretty_version' => '1.6.0', 'version' => '1.6.0.0', 'reference' => '2ca388f359323364aaf438a5fa28da74bc55c6f4', 'type' => 'library', 'install_path' => __DIR__ . '/../spatie/dns', 'aliases' => array(), 'dev_requirement' => \false), 'spatie/macroable' => array('pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'reference' => '7a99549fc001c925714b329220dea680c04bfa48', 'type' => 'library', 'install_path' => __DIR__ . '/../spatie/macroable', 'aliases' => array(), 'dev_requirement' => \false), 'spatie/ssl-certificate' => array('pretty_version' => '1.22.1', 'version' => '1.22.1.0', 'reference' => 'c4756c3f18f9abeea62cfe99fc841229d9fead2c', 'type' => 'library', 'install_path' => __DIR__ . '/../spatie/ssl-certificate', 'aliases' => array(), 'dev_requirement' => \false), 'stripe/stripe-php' => array('pretty_version' => 'v10.21.0', 'version' => '10.21.0.0', 'reference' => 'b4ab319731958077227fad1874a3671458c5d593', 'type' => 'library', 'install_path' => __DIR__ . '/../stripe/stripe-php', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/cache' => array('pretty_version' => 'v5.4.29', 'version' => '5.4.29.0', 'reference' => 'e29c5a97bc2d81269973c3e1d7ceb9d48b4d5151', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/cache-contracts' => array('pretty_version' => 'v2.5.2', 'version' => '2.5.2.0', 'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/cache-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0')), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.3.0', 'version' => '3.3.0.0', 'reference' => '7c3aff79d10325257a001fcf92d991f24fc967cf', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/event-dispatcher' => array('pretty_version' => 'v5.4.26', 'version' => '5.4.26.0', 'reference' => '5dcc00e03413f05c1e7900090927bb7247cb0aac', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/event-dispatcher-contracts' => array('pretty_version' => 'v3.3.0', 'version' => '3.3.0.0', 'reference' => 'a76aed96a42d2b521153fb382d418e30d18b59df', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/event-dispatcher-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '2.0')), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.28.0', 'version' => '1.28.0.0', 'reference' => '42292d99c55abe617799667f454222c54c60e229', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php73' => array('pretty_version' => 'v1.28.0', 'version' => '1.28.0.0', 'reference' => 'fe2f306d1d9d346a7fee353d0d5012e401e984b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php80' => array('pretty_version' => 'v1.28.0', 'version' => '1.28.0.0', 'reference' => '6caa57379c4aec19c0a12a38b59b26487dcfe4b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php81' => array('pretty_version' => 'v1.28.0', 'version' => '1.28.0.0', 'reference' => '7581cd600fa9fd681b797d00b02f068e2f13263b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v5.4.28', 'version' => '5.4.28.0', 'reference' => '45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.3.0', 'version' => '3.3.0.0', 'reference' => '40da9cc13ec349d9e4966ce18b5fbcd724ab10a4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/translation' => array('pretty_version' => 'v6.3.3', 'version' => '6.3.3.0', 'reference' => '3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/translation-contracts' => array('pretty_version' => 'v3.3.0', 'version' => '3.3.0.0', 'reference' => '02c24deb352fb0d79db5486c0c79905a85e37e86', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/translation-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '2.3|3.0')), 'symfony/var-exporter' => array('pretty_version' => 'v6.3.4', 'version' => '6.3.4.0', 'reference' => 'df1f8aac5751871b83d30bf3e2c355770f8f0691', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false), 'woocommerce/action-scheduler' => array('pretty_version' => '3.6.4', 'version' => '3.6.4.0', 'reference' => 'e7dafe215be5ef823392204535ee2e241f99a8cb', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../woocommerce/action-scheduler', 'aliases' => array(), 'dev_requirement' => \false), 'yahnis-elsts/plugin-update-checker' => array('pretty_version' => 'v4.11', 'version' => '4.11.0.0', 'reference' => '3155f2d3f1ca5e7ed3f25b256f020e370515af43', 'type' => 'library', 'install_path' => __DIR__ . '/../yahnis-elsts/plugin-update-checker', 'aliases' => array(), 'dev_requirement' => \false))); diff --git a/dependencies/daverandom/libdns/src/Decoder/Decoder.php b/dependencies/daverandom/libdns/src/Decoder/Decoder.php deleted file mode 100644 index c4a795f..0000000 --- a/dependencies/daverandom/libdns/src/Decoder/Decoder.php +++ /dev/null @@ -1,445 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Decoder; - -use WP_Ultimo\Dependencies\LibDNS\Messages\Message; -use WP_Ultimo\Dependencies\LibDNS\Messages\MessageFactory; -use WP_Ultimo\Dependencies\LibDNS\Packets\Packet; -use WP_Ultimo\Dependencies\LibDNS\Packets\PacketFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\Question; -use WP_Ultimo\Dependencies\LibDNS\Records\QuestionFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\Resource; -use WP_Ultimo\Dependencies\LibDNS\Records\ResourceBuilder; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Anything; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\BitMap; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Char; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\CharacterString; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\DomainName; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\IPv4Address; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\IPv6Address; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Long; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Short; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Type; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeBuilder; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Types; -/** - * Decodes raw network data to Message objects - * - * @category LibDNS - * @package Decoder - * @author Chris Wright - */ -class Decoder -{ - /** - * @var \LibDNS\Packets\PacketFactory - */ - private $packetFactory; - /** - * @var \LibDNS\Messages\MessageFactory - */ - private $messageFactory; - /** - * @var \LibDNS\Records\QuestionFactory - */ - private $questionFactory; - /** - * @var \LibDNS\Records\ResourceBuilder - */ - private $resourceBuilder; - /** - * @var \LibDNS\Records\Types\TypeBuilder - */ - private $typeBuilder; - /** - * @var \LibDNS\Decoder\DecodingContextFactory - */ - private $decodingContextFactory; - /** - * @var bool - */ - private $allowTrailingData; - /** - * Constructor - * - * @param \LibDNS\Packets\PacketFactory $packetFactory - * @param \LibDNS\Messages\MessageFactory $messageFactory - * @param \LibDNS\Records\QuestionFactory $questionFactory - * @param \LibDNS\Records\ResourceBuilder $resourceBuilder - * @param \LibDNS\Records\Types\TypeBuilder $typeBuilder - * @param \LibDNS\Decoder\DecodingContextFactory $decodingContextFactory - * @param bool $allowTrailingData - */ - public function __construct(PacketFactory $packetFactory, MessageFactory $messageFactory, QuestionFactory $questionFactory, ResourceBuilder $resourceBuilder, TypeBuilder $typeBuilder, DecodingContextFactory $decodingContextFactory, bool $allowTrailingData = \true) - { - $this->packetFactory = $packetFactory; - $this->messageFactory = $messageFactory; - $this->questionFactory = $questionFactory; - $this->resourceBuilder = $resourceBuilder; - $this->typeBuilder = $typeBuilder; - $this->decodingContextFactory = $decodingContextFactory; - $this->allowTrailingData = $allowTrailingData; - } - /** - * Read a specified number of bytes of data from a packet - * - * @param \LibDNS\Packets\Packet $packet - * @param int $length - * @return string - * @throws \UnexpectedValueException When the read operation does not result in the requested number of bytes - */ - private function readDataFromPacket(Packet $packet, int $length) : string - { - if ($packet->getBytesRemaining() < $length) { - throw new \UnexpectedValueException('Decode error: Incomplete packet (tried to read ' . $length . ' bytes from index ' . $packet->getPointer()); - } - return $packet->read($length); - } - /** - * Decode the header section of the message - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Messages\Message $message - * @throws \UnexpectedValueException When the header section is invalid - */ - private function decodeHeader(DecodingContext $decodingContext, Message $message) - { - $header = \unpack('nid/nmeta/nqd/nan/nns/nar', $this->readDataFromPacket($decodingContext->getPacket(), 12)); - if (!$header) { - throw new \UnexpectedValueException('Decode error: Header unpack failed'); - } - $message->setID($header['id']); - $message->setType(($header['meta'] & 0b1000000000000000) >> 15); - $message->setOpCode(($header['meta'] & 0b111100000000000) >> 11); - $message->isAuthoritative((bool) (($header['meta'] & 0b10000000000) >> 10)); - $message->isTruncated((bool) (($header['meta'] & 0b1000000000) >> 9)); - $message->isRecursionDesired((bool) (($header['meta'] & 0b100000000) >> 8)); - $message->isRecursionAvailable((bool) (($header['meta'] & 0b10000000) >> 7)); - $message->setResponseCode($header['meta'] & 0b1111); - $decodingContext->setExpectedQuestionRecords($header['qd']); - $decodingContext->setExpectedAnswerRecords($header['an']); - $decodingContext->setExpectedAuthorityRecords($header['ns']); - $decodingContext->setExpectedAdditionalRecords($header['ar']); - } - /** - * Decode an Anything field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\Anything $anything The object to populate with the result - * @param int $length - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeAnything(DecodingContext $decodingContext, Anything $anything, int $length) : int - { - $anything->setValue($this->readDataFromPacket($decodingContext->getPacket(), $length)); - return $length; - } - /** - * Decode a BitMap field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\BitMap $bitMap The object to populate with the result - * @param int $length - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeBitMap(DecodingContext $decodingContext, BitMap $bitMap, int $length) : int - { - $bitMap->setValue($this->readDataFromPacket($decodingContext->getPacket(), $length)); - return $length; - } - /** - * Decode a Char field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\Char $char The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeChar(DecodingContext $decodingContext, Char $char) : int - { - $value = \unpack('C', $this->readDataFromPacket($decodingContext->getPacket(), 1))[1]; - $char->setValue($value); - return 1; - } - /** - * Decode a CharacterString field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\CharacterString $characterString The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeCharacterString(DecodingContext $decodingContext, CharacterString $characterString) : int - { - $packet = $decodingContext->getPacket(); - $length = \ord($this->readDataFromPacket($packet, 1)); - $characterString->setValue($this->readDataFromPacket($packet, $length)); - return $length + 1; - } - /** - * Decode a DomainName field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\DomainName $domainName The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeDomainName(DecodingContext $decodingContext, DomainName $domainName) : int - { - $packet = $decodingContext->getPacket(); - $startIndex = '0x' . \dechex($packet->getPointer()); - $labelRegistry = $decodingContext->getLabelRegistry(); - $labels = []; - $totalLength = 0; - while (++$totalLength && ($length = \ord($this->readDataFromPacket($packet, 1)))) { - $labelType = $length & 0b11000000; - if ($labelType === 0b0) { - $index = $packet->getPointer() - 1; - $label = $this->readDataFromPacket($packet, $length); - \array_unshift($labels, [$index, $label]); - $totalLength += $length; - } else { - if ($labelType === 0b11000000) { - $index = ($length & 0b111111) << 8 | \ord($this->readDataFromPacket($packet, 1)); - $ref = $labelRegistry->lookupLabel($index); - if ($ref === null) { - throw new \UnexpectedValueException('Decode error: Invalid compression pointer reference in domain name at position ' . $startIndex); - } - \array_unshift($labels, $ref); - $totalLength++; - break; - } else { - throw new \UnexpectedValueException('Decode error: Invalid label type ' . $labelType . 'in domain name at position ' . $startIndex); - } - } - } - $result = []; - foreach ($labels as $label) { - if (\is_int($label[0])) { - \array_unshift($result, $label[1]); - $labelRegistry->register($result, $label[0]); - } else { - $result = $label; - } - } - $domainName->setLabels($result); - return $totalLength; - } - /** - * Decode an IPv4Address field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\IPv4Address $ipv4Address The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeIPv4Address(DecodingContext $decodingContext, IPv4Address $ipv4Address) : int - { - $octets = \unpack('C4', $this->readDataFromPacket($decodingContext->getPacket(), 4)); - $ipv4Address->setOctets($octets); - return 4; - } - /** - * Decode an IPv6Address field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\IPv6Address $ipv6Address The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeIPv6Address(DecodingContext $decodingContext, IPv6Address $ipv6Address) : int - { - $shorts = \unpack('n8', $this->readDataFromPacket($decodingContext->getPacket(), 16)); - $ipv6Address->setShorts($shorts); - return 16; - } - /** - * Decode a Long field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\Long $long The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeLong(DecodingContext $decodingContext, Long $long) : int - { - $value = \unpack('N', $this->readDataFromPacket($decodingContext->getPacket(), 4))[1]; - $long->setValue($value); - return 4; - } - /** - * Decode a Short field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\Short $short The object to populate with the result - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - */ - private function decodeShort(DecodingContext $decodingContext, Short $short) : int - { - $value = \unpack('n', $this->readDataFromPacket($decodingContext->getPacket(), 2))[1]; - $short->setValue($value); - return 2; - } - /** - * Decode a Type field - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @param \LibDNS\Records\Types\Type $type The object to populate with the result - * @param int $length Expected data length - * @return int The number of packet bytes consumed by the operation - * @throws \UnexpectedValueException When the packet data is invalid - * @throws \InvalidArgumentException When the Type subtype is unknown - */ - private function decodeType(DecodingContext $decodingContext, Type $type, int $length) : int - { - if ($type instanceof Anything) { - $result = $this->decodeAnything($decodingContext, $type, $length); - } else { - if ($type instanceof BitMap) { - $result = $this->decodeBitMap($decodingContext, $type, $length); - } else { - if ($type instanceof Char) { - $result = $this->decodeChar($decodingContext, $type); - } else { - if ($type instanceof CharacterString) { - $result = $this->decodeCharacterString($decodingContext, $type); - } else { - if ($type instanceof DomainName) { - $result = $this->decodeDomainName($decodingContext, $type); - } else { - if ($type instanceof IPv4Address) { - $result = $this->decodeIPv4Address($decodingContext, $type); - } else { - if ($type instanceof IPv6Address) { - $result = $this->decodeIPv6Address($decodingContext, $type); - } else { - if ($type instanceof Long) { - $result = $this->decodeLong($decodingContext, $type); - } else { - if ($type instanceof Short) { - $result = $this->decodeShort($decodingContext, $type); - } else { - throw new \InvalidArgumentException('Unknown Type ' . \get_class($type)); - } - } - } - } - } - } - } - } - } - return $result; - } - /** - * Decode a question record - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @return \LibDNS\Records\Question - * @throws \UnexpectedValueException When the record is invalid - */ - private function decodeQuestionRecord(DecodingContext $decodingContext) : Question - { - /** @var \LibDNS\Records\Types\DomainName $domainName */ - $domainName = $this->typeBuilder->build(Types::DOMAIN_NAME); - $this->decodeDomainName($decodingContext, $domainName); - $meta = \unpack('ntype/nclass', $this->readDataFromPacket($decodingContext->getPacket(), 4)); - $question = $this->questionFactory->create($meta['type']); - $question->setName($domainName); - $question->setClass($meta['class']); - return $question; - } - /** - * Decode a resource record - * - * @param \LibDNS\Decoder\DecodingContext $decodingContext - * @return \LibDNS\Records\Resource - * @throws \UnexpectedValueException When the record is invalid - * @throws \InvalidArgumentException When a type subtype is unknown - */ - private function decodeResourceRecord(DecodingContext $decodingContext) : Resource - { - /** @var \LibDNS\Records\Types\DomainName $domainName */ - $domainName = $this->typeBuilder->build(Types::DOMAIN_NAME); - $this->decodeDomainName($decodingContext, $domainName); - $meta = \unpack('ntype/nclass/Nttl/nlength', $this->readDataFromPacket($decodingContext->getPacket(), 10)); - $resource = $this->resourceBuilder->build($meta['type']); - $resource->setName($domainName); - $resource->setClass($meta['class']); - $resource->setTTL($meta['ttl']); - $data = $resource->getData(); - $remainingLength = $meta['length']; - $fieldDef = $index = null; - foreach ($resource->getData()->getTypeDefinition() as $index => $fieldDef) { - $field = $this->typeBuilder->build($fieldDef->getType()); - $remainingLength -= $this->decodeType($decodingContext, $field, $remainingLength); - $data->setField($index, $field); - } - if ($fieldDef->allowsMultiple()) { - while ($remainingLength) { - $field = $this->typeBuilder->build($fieldDef->getType()); - $remainingLength -= $this->decodeType($decodingContext, $field, $remainingLength); - $data->setField(++$index, $field); - } - } - if ($remainingLength !== 0) { - throw new \UnexpectedValueException('Decode error: Invalid length for record data section'); - } - return $resource; - } - /** - * Decode a Message from raw network data - * - * @param string $data The data string to decode - * @return \LibDNS\Messages\Message - * @throws \UnexpectedValueException When the packet data is invalid - * @throws \InvalidArgumentException When a type subtype is unknown - */ - public function decode(string $data) : Message - { - $packet = $this->packetFactory->create($data); - $decodingContext = $this->decodingContextFactory->create($packet); - $message = $this->messageFactory->create(); - $this->decodeHeader($decodingContext, $message); - $questionRecords = $message->getQuestionRecords(); - $expected = $decodingContext->getExpectedQuestionRecords(); - for ($i = 0; $i < $expected; $i++) { - $questionRecords->add($this->decodeQuestionRecord($decodingContext)); - } - $answerRecords = $message->getAnswerRecords(); - $expected = $decodingContext->getExpectedAnswerRecords(); - for ($i = 0; $i < $expected; $i++) { - $answerRecords->add($this->decodeResourceRecord($decodingContext)); - } - $authorityRecords = $message->getAuthorityRecords(); - $expected = $decodingContext->getExpectedAuthorityRecords(); - for ($i = 0; $i < $expected; $i++) { - $authorityRecords->add($this->decodeResourceRecord($decodingContext)); - } - $additionalRecords = $message->getAdditionalRecords(); - $expected = $decodingContext->getExpectedAdditionalRecords(); - for ($i = 0; $i < $expected; $i++) { - $additionalRecords->add($this->decodeResourceRecord($decodingContext)); - } - if (!$this->allowTrailingData && $packet->getBytesRemaining() !== 0) { - throw new \UnexpectedValueException('Decode error: Unexpected data at end of packet'); - } - return $message; - } -} diff --git a/dependencies/daverandom/libdns/src/Decoder/DecoderFactory.php b/dependencies/daverandom/libdns/src/Decoder/DecoderFactory.php deleted file mode 100644 index 896a235..0000000 --- a/dependencies/daverandom/libdns/src/Decoder/DecoderFactory.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Decoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\PacketFactory; -use WP_Ultimo\Dependencies\LibDNS\Messages\MessageFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\RecordCollectionFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\QuestionFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\ResourceBuilder; -use WP_Ultimo\Dependencies\LibDNS\Records\ResourceFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\RDataBuilder; -use WP_Ultimo\Dependencies\LibDNS\Records\RDataFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeBuilder; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinitionManager; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinitionFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\FieldDefinitionFactory; -/** - * Creates Decoder objects - * - * @category LibDNS - * @package Decoder - * @author Chris Wright - */ -class DecoderFactory -{ - /** - * Create a new Decoder object - * - * @param \LibDNS\Records\TypeDefinitions\TypeDefinitionManager $typeDefinitionManager - * @param bool $allowTrailingData - * @return Decoder - */ - public function create(TypeDefinitionManager $typeDefinitionManager = null, bool $allowTrailingData = \true) : Decoder - { - $typeBuilder = new TypeBuilder(new TypeFactory()); - return new Decoder(new PacketFactory(), new MessageFactory(new RecordCollectionFactory()), new QuestionFactory(), new ResourceBuilder(new ResourceFactory(), new RDataBuilder(new RDataFactory(), $typeBuilder), $typeDefinitionManager ?: new TypeDefinitionManager(new TypeDefinitionFactory(), new FieldDefinitionFactory())), $typeBuilder, new DecodingContextFactory(), $allowTrailingData); - } -} diff --git a/dependencies/daverandom/libdns/src/Decoder/DecodingContext.php b/dependencies/daverandom/libdns/src/Decoder/DecodingContext.php deleted file mode 100644 index b532898..0000000 --- a/dependencies/daverandom/libdns/src/Decoder/DecodingContext.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Decoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\Packet; -use WP_Ultimo\Dependencies\LibDNS\Packets\LabelRegistry; -/** - * Holds data associated with a decode operation - * - * @category LibDNS - * @package Decoder - * @author Chris Wright - */ -class DecodingContext -{ - /** - * @var \LibDNS\Packets\Packet - */ - private $packet; - /** - * @var \LibDNS\Packets\LabelRegistry - */ - private $labelRegistry; - /** - * @var int - */ - private $expectedQuestionRecords = 0; - /** - * @var int - */ - private $expectedAnswerRecords = 0; - /** - * @var int - */ - private $expectedAuthorityRecords = 0; - /** - * @var int - */ - private $expectedAdditionalRecords = 0; - /** - * Constructor - * - * @param \LibDNS\Packets\Packet $packet - * @param \LibDNS\Packets\LabelRegistry $labelRegistry - */ - public function __construct(Packet $packet, LabelRegistry $labelRegistry) - { - $this->packet = $packet; - $this->labelRegistry = $labelRegistry; - } - /** - * Get the packet - * - * @return \LibDNS\Packets\Packet - */ - public function getPacket() : Packet - { - return $this->packet; - } - /** - * Get the label registry - * - * @return \LibDNS\Packets\LabelRegistry - */ - public function getLabelRegistry() : LabelRegistry - { - return $this->labelRegistry; - } - /** - * Get the number of question records expected in the message - * - * @return int - */ - public function getExpectedQuestionRecords() : int - { - return $this->expectedQuestionRecords; - } - /** - * Get the number of question records expected in the message - * - * @param int $expectedQuestionRecords - */ - public function setExpectedQuestionRecords(int $expectedQuestionRecords) - { - $this->expectedQuestionRecords = $expectedQuestionRecords; - } - /** - * Get the number of answer records expected in the message - * - * @return int - */ - public function getExpectedAnswerRecords() : int - { - return $this->expectedAnswerRecords; - } - /** - * Set the number of answer records expected in the message - * - * @param int $expectedAnswerRecords - */ - public function setExpectedAnswerRecords(int $expectedAnswerRecords) - { - $this->expectedAnswerRecords = $expectedAnswerRecords; - } - /** - * Get the number of authority records expected in the message - * - * @return int - */ - public function getExpectedAuthorityRecords() : int - { - return $this->expectedAuthorityRecords; - } - /** - * Set the number of authority records expected in the message - * - * @param int $expectedAuthorityRecords - */ - public function setExpectedAuthorityRecords(int $expectedAuthorityRecords) - { - $this->expectedAuthorityRecords = $expectedAuthorityRecords; - } - /** - * Get the number of additional records expected in the message - * - * @return int - */ - public function getExpectedAdditionalRecords() : int - { - return $this->expectedAdditionalRecords; - } - /** - * Set the number of additional records expected in the message - * - * @param int $expectedAdditionalRecords - */ - public function setExpectedAdditionalRecords(int $expectedAdditionalRecords) - { - $this->expectedAdditionalRecords = $expectedAdditionalRecords; - } -} diff --git a/dependencies/daverandom/libdns/src/Decoder/DecodingContextFactory.php b/dependencies/daverandom/libdns/src/Decoder/DecodingContextFactory.php deleted file mode 100644 index 94a58b4..0000000 --- a/dependencies/daverandom/libdns/src/Decoder/DecodingContextFactory.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Decoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\Packet; -use WP_Ultimo\Dependencies\LibDNS\Packets\LabelRegistry; -/** - * Creates DecodingContext objects - * - * @category LibDNS - * @package Decoder - * @author Chris Wright - */ -class DecodingContextFactory -{ - /** - * Create a new DecodingContext object - * - * @param \LibDNS\Packets\Packet $packet The packet to be decoded - * @return \LibDNS\Decoder\DecodingContext - */ - public function create(Packet $packet) : DecodingContext - { - return new DecodingContext($packet, new LabelRegistry()); - } -} diff --git a/dependencies/daverandom/libdns/src/Encoder/Encoder.php b/dependencies/daverandom/libdns/src/Encoder/Encoder.php deleted file mode 100644 index 2196c6a..0000000 --- a/dependencies/daverandom/libdns/src/Encoder/Encoder.php +++ /dev/null @@ -1,324 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Encoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\PacketFactory; -use WP_Ultimo\Dependencies\LibDNS\Messages\Message; -use WP_Ultimo\Dependencies\LibDNS\Records\Question; -use WP_Ultimo\Dependencies\LibDNS\Records\Resource; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Type; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Anything; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\BitMap; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Char; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\CharacterString; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\DomainName; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\IPv4Address; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\IPv6Address; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Long; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Short; -/** - * Encodes Message objects to raw network data - * - * @category LibDNS - * @package Encoder - * @author Chris Wright - */ -class Encoder -{ - /** - * @var \LibDNS\Packets\PacketFactory - */ - private $packetFactory; - /** - * @var \LibDNS\Encoder\EncodingContextFactory - */ - private $encodingContextFactory; - /** - * Constructor - * - * @param \LibDNS\Packets\PacketFactory $packetFactory - * @param \LibDNS\Encoder\EncodingContextFactory $encodingContextFactory - */ - public function __construct(PacketFactory $packetFactory, EncodingContextFactory $encodingContextFactory) - { - $this->packetFactory = $packetFactory; - $this->encodingContextFactory = $encodingContextFactory; - } - /** - * Encode the header section of the message - * - * @param \LibDNS\Encoder\EncodingContext $encodingContext - * @param \LibDNS\Messages\Message $message - * @return string - * @throws \UnexpectedValueException When the header section is invalid - */ - private function encodeHeader(EncodingContext $encodingContext, Message $message) : string - { - $header = ['id' => $message->getID(), 'meta' => 0, 'qd' => $message->getQuestionRecords()->count(), 'an' => $message->getAnswerRecords()->count(), 'ns' => $message->getAuthorityRecords()->count(), 'ar' => $message->getAdditionalRecords()->count()]; - $header['meta'] |= $message->getType() << 15; - $header['meta'] |= $message->getOpCode() << 11; - $header['meta'] |= (int) $message->isAuthoritative() << 10; - $header['meta'] |= (int) $encodingContext->isTruncated() << 9; - $header['meta'] |= (int) $message->isRecursionDesired() << 8; - $header['meta'] |= (int) $message->isRecursionAvailable() << 7; - $header['meta'] |= $message->getResponseCode(); - return \pack('n*', $header['id'], $header['meta'], $header['qd'], $header['an'], $header['ns'], $header['ar']); - } - /** - * Encode an Anything field - * - * @param \LibDNS\Records\Types\Anything $anything - * @return string - */ - private function encodeAnything(Anything $anything) : string - { - return $anything->getValue(); - } - /** - * Encode a BitMap field - * - * @param \LibDNS\Records\Types\BitMap $bitMap - * @return string - */ - private function encodeBitMap(BitMap $bitMap) : string - { - return $bitMap->getValue(); - } - /** - * Encode a Char field - * - * @param \LibDNS\Records\Types\Char $char - * @return string - */ - private function encodeChar(Char $char) : string - { - return \chr($char->getValue()); - } - /** - * Encode a CharacterString field - * - * @param \LibDNS\Records\Types\CharacterString $characterString - * @return string - */ - private function encodeCharacterString(CharacterString $characterString) : string - { - $data = $characterString->getValue(); - return \chr(\strlen($data)) . $data; - } - /** - * Encode a DomainName field - * - * @param \LibDNS\Records\Types\DomainName $domainName - * @param \LibDNS\Encoder\EncodingContext $encodingContext - * @return string - */ - private function encodeDomainName(DomainName $domainName, EncodingContext $encodingContext) : string - { - $packetIndex = $encodingContext->getPacket()->getLength() + 12; - $labelRegistry = $encodingContext->getLabelRegistry(); - $result = ''; - $labels = $domainName->getLabels(); - if ($encodingContext->useCompression()) { - do { - $part = \implode('.', $labels); - $index = $labelRegistry->lookupIndex($part); - if ($index === null) { - $labelRegistry->register($part, $packetIndex); - $label = \array_shift($labels); - $length = \strlen($label); - $result .= \chr($length) . $label; - $packetIndex += $length + 1; - } else { - $result .= \pack('n', 0b1100000000000000 | $index); - break; - } - } while ($labels); - if (!$labels) { - $result .= "\x00"; - } - } else { - foreach ($labels as $label) { - $result .= \chr(\strlen($label)) . $label; - } - $result .= "\x00"; - } - return $result; - } - /** - * Encode an IPv4Address field - * - * @param \LibDNS\Records\Types\IPv4Address $ipv4Address - * @return string - */ - private function encodeIPv4Address(IPv4Address $ipv4Address) : string - { - $octets = $ipv4Address->getOctets(); - return \pack('C*', $octets[0], $octets[1], $octets[2], $octets[3]); - } - /** - * Encode an IPv6Address field - * - * @param \LibDNS\Records\Types\IPv6Address $ipv6Address - * @return string - */ - private function encodeIPv6Address(IPv6Address $ipv6Address) : string - { - $shorts = $ipv6Address->getShorts(); - return \pack('n*', $shorts[0], $shorts[1], $shorts[2], $shorts[3], $shorts[4], $shorts[5], $shorts[6], $shorts[7]); - } - /** - * Encode a Long field - * - * @param \LibDNS\Records\Types\Long $long - * @return string - */ - private function encodeLong(Long $long) : string - { - return \pack('N', $long->getValue()); - } - /** - * Encode a Short field - * - * @param \LibDNS\Records\Types\Short $short - * @return string - */ - private function encodeShort(Short $short) : string - { - return \pack('n', $short->getValue()); - } - /** - * Encode a type object - * - * @param \LibDNS\Encoder\EncodingContext $encodingContext - * @param \LibDNS\Records\Types\Type $type - * @return string - */ - private function encodeType(EncodingContext $encodingContext, Type $type) : string - { - if ($type instanceof Anything) { - $result = $this->encodeAnything($type); - } else { - if ($type instanceof BitMap) { - $result = $this->encodeBitMap($type); - } else { - if ($type instanceof Char) { - $result = $this->encodeChar($type); - } else { - if ($type instanceof CharacterString) { - $result = $this->encodeCharacterString($type); - } else { - if ($type instanceof DomainName) { - $result = $this->encodeDomainName($type, $encodingContext); - } else { - if ($type instanceof IPv4Address) { - $result = $this->encodeIPv4Address($type); - } else { - if ($type instanceof IPv6Address) { - $result = $this->encodeIPv6Address($type); - } else { - if ($type instanceof Long) { - $result = $this->encodeLong($type); - } else { - if ($type instanceof Short) { - $result = $this->encodeShort($type); - } else { - throw new \InvalidArgumentException('Unknown Type ' . \get_class($type)); - } - } - } - } - } - } - } - } - } - return $result; - } - /** - * Encode a question record - * - * @param \LibDNS\Encoder\EncodingContext $encodingContext - * @param \LibDNS\Records\Question $record - */ - private function encodeQuestionRecord(EncodingContext $encodingContext, Question $record) - { - if (!$encodingContext->isTruncated()) { - $packet = $encodingContext->getPacket(); - $name = $this->encodeDomainName($record->getName(), $encodingContext); - $meta = \pack('n*', $record->getType(), $record->getClass()); - if (12 + $packet->getLength() + \strlen($name) + 4 > 512) { - $encodingContext->isTruncated(\true); - } else { - $packet->write($name); - $packet->write($meta); - } - } - } - /** - * Encode a resource record - * - * @param \LibDNS\Encoder\EncodingContext $encodingContext - * @param \LibDNS\Records\Resource $record - */ - private function encodeResourceRecord(EncodingContext $encodingContext, Resource $record) - { - if (!$encodingContext->isTruncated()) { - $packet = $encodingContext->getPacket(); - $name = $this->encodeDomainName($record->getName(), $encodingContext); - $data = ''; - foreach ($record->getData() as $field) { - $data .= $this->encodeType($encodingContext, $field); - } - $meta = \pack('n2Nn', $record->getType(), $record->getClass(), $record->getTTL(), \strlen($data)); - if (12 + $packet->getLength() + \strlen($name) + 10 + \strlen($data) > 512) { - $encodingContext->isTruncated(\true); - } else { - $packet->write($name); - $packet->write($meta); - $packet->write($data); - } - } - } - /** - * Encode a Message to raw network data - * - * @param \LibDNS\Messages\Message $message The Message to encode - * @param bool $compress Enable message compression - * @return string - */ - public function encode(Message $message, $compress = \true) : string - { - $packet = $this->packetFactory->create(); - $encodingContext = $this->encodingContextFactory->create($packet, $compress); - foreach ($message->getQuestionRecords() as $record) { - /** @var \LibDNS\Records\Question $record */ - $this->encodeQuestionRecord($encodingContext, $record); - } - foreach ($message->getAnswerRecords() as $record) { - /** @var \LibDNS\Records\Resource $record */ - $this->encodeResourceRecord($encodingContext, $record); - } - foreach ($message->getAuthorityRecords() as $record) { - /** @var \LibDNS\Records\Resource $record */ - $this->encodeResourceRecord($encodingContext, $record); - } - foreach ($message->getAdditionalRecords() as $record) { - /** @var \LibDNS\Records\Resource $record */ - $this->encodeResourceRecord($encodingContext, $record); - } - return $this->encodeHeader($encodingContext, $message) . $packet->read($packet->getLength()); - } -} diff --git a/dependencies/daverandom/libdns/src/Encoder/EncoderFactory.php b/dependencies/daverandom/libdns/src/Encoder/EncoderFactory.php deleted file mode 100644 index 374cd4b..0000000 --- a/dependencies/daverandom/libdns/src/Encoder/EncoderFactory.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Encoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\PacketFactory; -/** - * Creates Encoder objects - * - * @category LibDNS - * @package Encoder - * @author Chris Wright - */ -class EncoderFactory -{ - /** - * Create a new Encoder object - * - * @return \LibDNS\Encoder\Encoder - */ - public function create() : Encoder - { - return new Encoder(new PacketFactory(), new EncodingContextFactory()); - } -} diff --git a/dependencies/daverandom/libdns/src/Encoder/EncodingContext.php b/dependencies/daverandom/libdns/src/Encoder/EncodingContext.php deleted file mode 100644 index 3c1fa89..0000000 --- a/dependencies/daverandom/libdns/src/Encoder/EncodingContext.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Encoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\Packet; -use WP_Ultimo\Dependencies\LibDNS\Packets\LabelRegistry; -/** - * Holds data associated with an encode operation - * - * @category LibDNS - * @package Encoder - * @author Chris Wright - */ -class EncodingContext -{ - /** - * @var \LibDNS\Packets\Packet - */ - private $packet; - /** - * @var \LibDNS\Packets\LabelRegistry - */ - private $labelRegistry; - /** - * @var bool - */ - private $compress; - /** - * @var bool - */ - private $truncate = \false; - /** - * Constructor - * - * @param \LibDNS\Packets\Packet $packet - * @param \LibDNS\Packets\LabelRegistry $labelRegistry - * @param bool $compress - */ - public function __construct(Packet $packet, LabelRegistry $labelRegistry, bool $compress) - { - $this->packet = $packet; - $this->labelRegistry = $labelRegistry; - $this->compress = $compress; - } - /** - * Get the packet - * - * @return \LibDNS\Packets\Packet - */ - public function getPacket() : Packet - { - return $this->packet; - } - /** - * Get the label registry - * - * @return \LibDNS\Packets\LabelRegistry - */ - public function getLabelRegistry() : LabelRegistry - { - return $this->labelRegistry; - } - /** - * Determine whether compression is enabled - * - * @return bool - */ - public function useCompression() : bool - { - return $this->compress; - } - /** - * Determine or set whether the message is truncated - * - * @param bool $truncate - * @return bool - */ - public function isTruncated(bool $truncate = null) : bool - { - $result = $this->truncate; - if ($truncate !== null) { - $this->truncate = $truncate; - } - return $result; - } -} diff --git a/dependencies/daverandom/libdns/src/Encoder/EncodingContextFactory.php b/dependencies/daverandom/libdns/src/Encoder/EncodingContextFactory.php deleted file mode 100644 index e114d9f..0000000 --- a/dependencies/daverandom/libdns/src/Encoder/EncodingContextFactory.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Encoder; - -use WP_Ultimo\Dependencies\LibDNS\Packets\Packet; -use WP_Ultimo\Dependencies\LibDNS\Packets\LabelRegistry; -/** - * Creates EncodingContext objects - * - * @category LibDNS - * @package Encoder - * @author Chris Wright - */ -class EncodingContextFactory -{ - /** - * Create a new EncodingContext object - * - * @param \LibDNS\Packets\Packet $packet The packet to be decoded - * @param bool $compress Whether message compression is enabled - * @return \LibDNS\Encoder\EncodingContext - */ - public function create(Packet $packet, bool $compress) : EncodingContext - { - return new EncodingContext($packet, new LabelRegistry(), $compress); - } -} diff --git a/dependencies/daverandom/libdns/src/Enumeration.php b/dependencies/daverandom/libdns/src/Enumeration.php deleted file mode 100644 index a1b6a02..0000000 --- a/dependencies/daverandom/libdns/src/Enumeration.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS; - -/** - * Base class for enumerations to prevent instantiation - * - * @category LibDNS - * @package LibDNS - * @author Chris Wright - */ -abstract class Enumeration -{ - protected final function __construct() - { - throw new \LogicException('Enumerations cannot be instantiated'); - } -} diff --git a/dependencies/daverandom/libdns/src/Messages/Message.php b/dependencies/daverandom/libdns/src/Messages/Message.php deleted file mode 100644 index 7b24ac1..0000000 --- a/dependencies/daverandom/libdns/src/Messages/Message.php +++ /dev/null @@ -1,275 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Messages; - -use WP_Ultimo\Dependencies\LibDNS\Records\RecordCollection; -use WP_Ultimo\Dependencies\LibDNS\Records\RecordCollectionFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\RecordTypes; -/** - * Represents a DNS protocol message - * - * @category LibDNS - * @package Messages - * @author Chris Wright - */ -class Message -{ - /** - * @var int Unsigned short that identifies the DNS transaction - */ - private $id = 0; - /** - * @var int Indicates the type of the message, can be indicated using the MessageTypes enum - */ - private $type = -1; - /** - * @var int Message opcode, can be indicated using the MessageOpCodes enum - */ - private $opCode = MessageOpCodes::QUERY; - /** - * @var bool Whether a response message is authoritative - */ - private $authoritative = \false; - /** - * @var bool Whether the message is truncated - */ - private $truncated = \false; - /** - * @var bool Whether a query desires the server to recurse the lookup - */ - private $recursionDesired = \true; - /** - * @var bool Whether a server could provide recursion in a response - */ - private $recursionAvailable = \false; - /** - * @var int Message response code, can be indicated using the MessageResponseCodes enum - */ - private $responseCode = MessageResponseCodes::NO_ERROR; - /** - * @var \LibDNS\Records\RecordCollection Collection of question records - */ - private $questionRecords; - /** - * @var \LibDNS\Records\RecordCollection Collection of question records - */ - private $answerRecords; - /** - * @var \LibDNS\Records\RecordCollection Collection of authority records - */ - private $authorityRecords; - /** - * @var \LibDNS\Records\RecordCollection Collection of authority records - */ - private $additionalRecords; - /** - * Constructor - * - * @param \LibDNS\Records\RecordCollectionFactory $recordCollectionFactory Factory which makes RecordCollection objects - * @param int $type Value of the message type field - * @throws \RangeException When the supplied message type is outside the valid range 0 - 1 - */ - public function __construct(RecordCollectionFactory $recordCollectionFactory, int $type = null) - { - $this->questionRecords = $recordCollectionFactory->create(RecordTypes::QUESTION); - $this->answerRecords = $recordCollectionFactory->create(RecordTypes::RESOURCE); - $this->authorityRecords = $recordCollectionFactory->create(RecordTypes::RESOURCE); - $this->additionalRecords = $recordCollectionFactory->create(RecordTypes::RESOURCE); - if ($type !== null) { - $this->setType($type); - } - } - /** - * Get the value of the message ID field - * - * @return int - */ - public function getID() : int - { - return $this->id; - } - /** - * Set the value of the message ID field - * - * @param int $id The new value - * @throws \RangeException When the supplied value is outside the valid range 0 - 65535 - */ - public function setID(int $id) - { - if ($id < 0 || $id > 65535) { - throw new \RangeException('Message ID must be in the range 0 - 65535'); - } - $this->id = $id; - } - /** - * Get the value of the message type field - * - * @return int - */ - public function getType() : int - { - return $this->type; - } - /** - * Set the value of the message type field - * - * @param int $type The new value - * @throws \RangeException When the supplied value is outside the valid range 0 - 1 - */ - public function setType(int $type) - { - if ($type < 0 || $type > 1) { - throw new \RangeException('Message type must be in the range 0 - 1'); - } - $this->type = $type; - } - /** - * Get the value of the message opcode field - * - * @return int - */ - public function getOpCode() : int - { - return $this->opCode; - } - /** - * Set the value of the message opcode field - * - * @param int $opCode The new value - * @throws \RangeException When the supplied value is outside the valid range 0 - 15 - */ - public function setOpCode(int $opCode) - { - if ($opCode < 0 || $opCode > 15) { - throw new \RangeException('Message opcode must be in the range 0 - 15'); - } - $this->opCode = $opCode; - } - /** - * Inspect the value of the authoritative field and optionally set a new value - * - * @param bool $newValue The new value - * @return bool The old value - */ - public function isAuthoritative(bool $newValue = null) : bool - { - $result = $this->authoritative; - if ($newValue !== null) { - $this->authoritative = $newValue; - } - return $result; - } - /** - * Inspect the value of the truncated field and optionally set a new value - * - * @param bool $newValue The new value - * @return bool The old value - */ - public function isTruncated(bool $newValue = null) : bool - { - $result = $this->truncated; - if ($newValue !== null) { - $this->truncated = $newValue; - } - return $result; - } - /** - * Inspect the value of the recusion desired field and optionally set a new value - * - * @param bool $newValue The new value - * @return bool The old value - */ - public function isRecursionDesired(bool $newValue = null) : bool - { - $result = $this->recursionDesired; - if ($newValue !== null) { - $this->recursionDesired = $newValue; - } - return $result; - } - /** - * Inspect the value of the recursion available field and optionally set a new value - * - * @param bool $newValue The new value - * @return bool The old value - */ - public function isRecursionAvailable(bool $newValue = null) : bool - { - $result = $this->recursionAvailable; - if ($newValue !== null) { - $this->recursionAvailable = $newValue; - } - return $result; - } - /** - * Get the value of the message response code field - * - * @return int - */ - public function getResponseCode() : int - { - return $this->responseCode; - } - /** - * Set the value of the message response code field - * - * @param int $responseCode The new value - * @throws \RangeException When the supplied value is outside the valid range 0 - 15 - */ - public function setResponseCode(int $responseCode) - { - if ($responseCode < 0 || $responseCode > 15) { - throw new \RangeException('Message response code must be in the range 0 - 15'); - } - $this->responseCode = $responseCode; - } - /** - * Get the question records collection - * - * @return \LibDNS\Records\RecordCollection - */ - public function getQuestionRecords() : RecordCollection - { - return $this->questionRecords; - } - /** - * Get the answer records collection - * - * @return \LibDNS\Records\RecordCollection - */ - public function getAnswerRecords() : RecordCollection - { - return $this->answerRecords; - } - /** - * Get the authority records collection - * - * @return \LibDNS\Records\RecordCollection - */ - public function getAuthorityRecords() : RecordCollection - { - return $this->authorityRecords; - } - /** - * Get the additional records collection - * - * @return \LibDNS\Records\RecordCollection - */ - public function getAdditionalRecords() : RecordCollection - { - return $this->additionalRecords; - } -} diff --git a/dependencies/daverandom/libdns/src/Messages/MessageFactory.php b/dependencies/daverandom/libdns/src/Messages/MessageFactory.php deleted file mode 100644 index 3499c74..0000000 --- a/dependencies/daverandom/libdns/src/Messages/MessageFactory.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Messages; - -use WP_Ultimo\Dependencies\LibDNS\Records\RecordCollectionFactory; -/** - * Factory which creates Message objects - * - * @category LibDNS - * @package Messages - * @author Chris Wright - */ -class MessageFactory -{ - /** - * Create a new Message object - * - * @param int $type Value of the message type field - * @return \LibDNS\Messages\Message - */ - public function create(int $type = null) : Message - { - return new Message(new RecordCollectionFactory(), $type); - } -} diff --git a/dependencies/daverandom/libdns/src/Messages/MessageOpCodes.php b/dependencies/daverandom/libdns/src/Messages/MessageOpCodes.php deleted file mode 100644 index 34241ab..0000000 --- a/dependencies/daverandom/libdns/src/Messages/MessageOpCodes.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Messages; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of possible message types - * - * @category LibDNS - * @package Messages - * @author Chris Wright - */ -final class MessageOpCodes extends Enumeration -{ - const QUERY = 0; - const IQUERY = 1; - const STATUS = 2; -} diff --git a/dependencies/daverandom/libdns/src/Messages/MessageResponseCodes.php b/dependencies/daverandom/libdns/src/Messages/MessageResponseCodes.php deleted file mode 100644 index 0c4c882..0000000 --- a/dependencies/daverandom/libdns/src/Messages/MessageResponseCodes.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Messages; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of possible message types - * - * @category LibDNS - * @package Messages - * @author Chris Wright - */ -final class MessageResponseCodes extends Enumeration -{ - const NO_ERROR = 0; - const FORMAT_ERROR = 1; - const SERVER_FAILURE = 2; - const NAME_ERROR = 3; - const NOT_IMPLEMENTED = 4; - const REFUSED = 5; -} diff --git a/dependencies/daverandom/libdns/src/Messages/MessageTypes.php b/dependencies/daverandom/libdns/src/Messages/MessageTypes.php deleted file mode 100644 index 138db31..0000000 --- a/dependencies/daverandom/libdns/src/Messages/MessageTypes.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Messages; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of possible message types - * - * @category LibDNS - * @package Messages - * @author Chris Wright - */ -final class MessageTypes extends Enumeration -{ - const QUERY = 0; - const RESPONSE = 1; -} diff --git a/dependencies/daverandom/libdns/src/Packets/LabelRegistry.php b/dependencies/daverandom/libdns/src/Packets/LabelRegistry.php deleted file mode 100644 index 9aa155e..0000000 --- a/dependencies/daverandom/libdns/src/Packets/LabelRegistry.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Packets; - -/** - * Creates Packet objects - * - * @category LibDNS - * @package Packets - * @author Chris Wright - */ -class LabelRegistry -{ - /** - * @var int[] Map of labels to indexes - */ - private $labels = []; - /** - * @var string[][] Map of indexes to labels - */ - private $indexes = []; - /** - * Register a new relationship - * - * @param string|string[] $labels - * @param int $index - */ - public function register($labels, int $index) - { - if (\is_array($labels)) { - $labelsArr = $labels; - $labelsStr = \implode('.', $labels); - } else { - $labelsArr = \explode('.', $labels); - $labelsStr = (string) $labels; - } - if (!isset($this->labels[$labelsStr]) || $index < $this->labels[$labelsStr]) { - $this->labels[$labelsStr] = $index; - } - $this->indexes[$index] = $labelsArr; - } - /** - * Lookup the index of a label - * - * @param string $label - * @return int|null - */ - public function lookupIndex(string $label) - { - return $this->labels[$label] ?? null; - } - /** - * Lookup the label at an index - * - * @param int $index - * @return string[]|null - */ - public function lookupLabel(int $index) - { - return $this->indexes[$index] ?? null; - } -} diff --git a/dependencies/daverandom/libdns/src/Packets/Packet.php b/dependencies/daverandom/libdns/src/Packets/Packet.php deleted file mode 100644 index 8a68974..0000000 --- a/dependencies/daverandom/libdns/src/Packets/Packet.php +++ /dev/null @@ -1,120 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Packets; - -/** - * Represents a raw network data packet - * - * @category LibDNS - * @package Packets - * @author Chris Wright - */ -class Packet -{ - /** - * @var string - */ - private $data; - /** - * @var int Data length - */ - private $length; - /** - * @var int Read pointer - */ - private $pointer = 0; - /** - * Constructor - * - * @param string $data The initial packet raw data - */ - public function __construct(string $data = '') - { - $this->data = $data; - $this->length = \strlen($this->data); - } - /** - * Read bytes from the packet data - * - * @param int $length The number of bytes to read - * @return string - * @throws \OutOfBoundsException When the pointer position is invalid or the supplied length is negative - */ - public function read(int $length = null) : string - { - if ($this->pointer > $this->length) { - throw new \OutOfBoundsException('Pointer position invalid'); - } - if ($length === null) { - $result = \substr($this->data, $this->pointer); - $this->pointer = $this->length; - } else { - if ($length < 0) { - throw new \OutOfBoundsException('Length must be a positive integer'); - } - $result = \substr($this->data, $this->pointer, $length); - $this->pointer += $length; - } - return $result; - } - /** - * Append data to the packet - * - * @param string $data The data to append - * @return int The number of bytes written - */ - public function write(string $data) : int - { - $length = \strlen($data); - $this->data .= $data; - $this->length += $length; - return $length; - } - /** - * Reset the read pointer - */ - public function reset() - { - $this->pointer = 0; - } - /** - * Get the pointer index - * - * @return int - */ - public function getPointer() : int - { - return $this->pointer; - } - /** - * Get the data length - * - * @return int - */ - public function getLength() : int - { - return $this->length; - } - /** - * Get the number of remaining bytes from the pointer position - * - * @return int - */ - public function getBytesRemaining() : int - { - return $this->length - $this->pointer; - } -} diff --git a/dependencies/daverandom/libdns/src/Packets/PacketFactory.php b/dependencies/daverandom/libdns/src/Packets/PacketFactory.php deleted file mode 100644 index f60468f..0000000 --- a/dependencies/daverandom/libdns/src/Packets/PacketFactory.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Packets; - -/** - * Creates Packet objects - * - * @category LibDNS - * @package Packets - * @author Chris Wright - */ -class PacketFactory -{ - /** - * Create a new Packet object - * - * @param string $data - * @return \LibDNS\Packets\Packet - */ - public function create(string $data = '') : Packet - { - return new Packet($data); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Question.php b/dependencies/daverandom/libdns/src/Records/Question.php deleted file mode 100644 index 309b0b9..0000000 --- a/dependencies/daverandom/libdns/src/Records/Question.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeFactory; -/** - * Represents a DNS question record - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class Question extends Record -{ - /** - * Constructor - * - * @param \LibDNS\Records\Types\TypeFactory $typeFactory - * @param int $type Resource type being requested, can be indicated using the ResourceQTypes enum - */ - public function __construct(TypeFactory $typeFactory, int $type) - { - $this->typeFactory = $typeFactory; - $this->type = $type; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/QuestionFactory.php b/dependencies/daverandom/libdns/src/Records/QuestionFactory.php deleted file mode 100644 index 37f35a2..0000000 --- a/dependencies/daverandom/libdns/src/Records/QuestionFactory.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeFactory; -/** - * Creates Question objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class QuestionFactory -{ - /** - * Create a new Question object - * - * @param int $type The resource type - * @return \LibDNS\Records\Question - */ - public function create(int $type) : Question - { - return new Question(new TypeFactory(), $type); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/RData.php b/dependencies/daverandom/libdns/src/Records/RData.php deleted file mode 100644 index 304ee4f..0000000 --- a/dependencies/daverandom/libdns/src/Records/RData.php +++ /dev/null @@ -1,138 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Type; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinition; -/** - * Represents a data type comprising multiple simple types - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class RData implements \IteratorAggregate, \Countable -{ - /** - * @var \LibDNS\Records\Types\Type[] The items that make up the complex type - */ - private $fields = []; - /** - * @var \LibDNS\Records\TypeDefinitions\TypeDefinition Structural definition of the fields - */ - private $typeDef; - /** - * Constructor - * - * @param \LibDNS\Records\TypeDefinitions\TypeDefinition $typeDef - */ - public function __construct(TypeDefinition $typeDef) - { - $this->typeDef = $typeDef; - } - /** - * Magic method for type coersion to string - * - * @return string - */ - public function __toString() - { - if ($handler = $this->typeDef->getToStringFunction()) { - $result = \call_user_func_array($handler, $this->fields); - } else { - $result = \implode(',', $this->fields); - } - return $result; - } - /** - * Get the field indicated by the supplied index - * - * @param int $index - * @return \LibDNS\Records\Types\Type - * @throws \OutOfBoundsException When the supplied index does not refer to a valid field - */ - public function getField(int $index) - { - if (!isset($this->fields[$index])) { - throw new \OutOfBoundsException('Index ' . $index . ' does not refer to a valid field'); - } - return $this->fields[$index]; - } - /** - * Set the field indicated by the supplied index - * - * @param int $index - * @param \LibDNS\Records\Types\Type $value - * @throws \InvalidArgumentException When the supplied index/value pair does not match the type definition - */ - public function setField(int $index, Type $value) - { - if (!$this->typeDef->getFieldDefinition($index)->assertDataValid($value)) { - throw new \InvalidArgumentException('The supplied value is not valid for the specified index'); - } - $this->fields[$index] = $value; - } - /** - * Get the field indicated by the supplied name - * - * @param string $name - * @return \LibDNS\Records\Types\Type - * @throws \OutOfBoundsException When the supplied name does not refer to a valid field - */ - public function getFieldByName(string $name) : Type - { - return $this->getField($this->typeDef->getFieldIndexByName($name)); - } - /** - * Set the field indicated by the supplied name - * - * @param string $name - * @param \LibDNS\Records\Types\Type $value - * @throws \OutOfBoundsException When the supplied name does not refer to a valid field - * @throws \InvalidArgumentException When the supplied value does not match the type definition - */ - public function setFieldByName(string $name, Type $value) - { - $this->setField($this->typeDef->getFieldIndexByName($name), $value); - } - /** - * Get the structural definition of the fields - * - * @return \LibDNS\Records\TypeDefinitions\TypeDefinition - */ - public function getTypeDefinition() : TypeDefinition - { - return $this->typeDef; - } - /** - * Retrieve an iterator (IteratorAggregate interface) - * - * @return \Iterator - */ - public function getIterator() : \Iterator - { - return new \ArrayIterator($this->fields); - } - /** - * Get the number of fields (Countable interface) - * - * @return int - */ - public function count() : int - { - return \count($this->fields); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/RDataBuilder.php b/dependencies/daverandom/libdns/src/Records/RDataBuilder.php deleted file mode 100644 index c5b19e5..0000000 --- a/dependencies/daverandom/libdns/src/Records/RDataBuilder.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinition; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeBuilder; -/** - * Creates RData objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class RDataBuilder -{ - /** - * @var \LibDNS\Records\RDataFactory - */ - private $rDataFactory; - /** - * @var \LibDNS\Records\Types\TypeBuilder - */ - private $typeBuilder; - /** - * Constructor - * - * @param \LibDNS\Records\RDataFactory $rDataFactory - * @param \LibDNS\Records\Types\TypeBuilder $typeBuilder - */ - public function __construct(RDataFactory $rDataFactory, TypeBuilder $typeBuilder) - { - $this->rDataFactory = $rDataFactory; - $this->typeBuilder = $typeBuilder; - } - /** - * Create a new RData object - * - * @param \LibDNS\Records\TypeDefinitions\TypeDefinition $typeDefinition - * @return \LibDNS\Records\RData - */ - public function build(TypeDefinition $typeDefinition) : RData - { - $rData = $this->rDataFactory->create($typeDefinition); - foreach ($typeDefinition as $index => $type) { - $rData->setField($index, $this->typeBuilder->build($type->getType())); - } - return $rData; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/RDataFactory.php b/dependencies/daverandom/libdns/src/Records/RDataFactory.php deleted file mode 100644 index 170915d..0000000 --- a/dependencies/daverandom/libdns/src/Records/RDataFactory.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinition; -/** - * Creates RData objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class RDataFactory -{ - /** - * Create a new RData object - * - * @param \LibDNS\Records\TypeDefinitions\TypeDefinition $typeDefinition - * @return \LibDNS\Records\RData - */ - public function create(TypeDefinition $typeDefinition) : RData - { - return new RData($typeDefinition); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Record.php b/dependencies/daverandom/libdns/src/Records/Record.php deleted file mode 100644 index d691ce4..0000000 --- a/dependencies/daverandom/libdns/src/Records/Record.php +++ /dev/null @@ -1,97 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\DomainName; -/** - * Represents a DNS record - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -abstract class Record -{ - /** - * @var \LibDNS\Records\Types\TypeFactory - */ - protected $typeFactory; - /** - * @var \LibDNS\Records\Types\DomainName - */ - protected $name; - /** - * @var int - */ - protected $type; - /** - * @var int - */ - protected $class = ResourceClasses::IN; - /** - * Get the value of the record name field - * - * @return \LibDNS\Records\Types\DomainName - */ - public function getName() : DomainName - { - return $this->name; - } - /** - * Set the value of the record name field - * - * @param string|\LibDNS\Records\Types\DomainName $name - * @throws \UnexpectedValueException When the supplied value is not a valid domain name - */ - public function setName($name) - { - if (!$name instanceof DomainName) { - $name = $this->typeFactory->createDomainName((string) $name); - } - $this->name = $name; - } - /** - * Get the value of the record type field - * - * @return int - */ - public function getType() : int - { - return $this->type; - } - /** - * Get the value of the record class field - * - * @return int - */ - public function getClass() : int - { - return $this->class; - } - /** - * Set the value of the record class field - * - * @param int $class The new value, can be indicated using the ResourceClasses/ResourceQClasses enums - * @throws \RangeException When the supplied value is outside the valid range 0 - 65535 - */ - public function setClass(int $class) - { - if ($class < 0 || $class > 65535) { - throw new \RangeException('Record class must be in the range 0 - 65535'); - } - $this->class = $class; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/RecordCollection.php b/dependencies/daverandom/libdns/src/Records/RecordCollection.php deleted file mode 100644 index a34821c..0000000 --- a/dependencies/daverandom/libdns/src/Records/RecordCollection.php +++ /dev/null @@ -1,219 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -/** - * Collection of Record objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class RecordCollection implements \IteratorAggregate, \Countable -{ - /** - * @var \LibDNS\Records\Record[] List of records held in the collection - */ - private $records = []; - /** - * @var \LibDNS\Records\Record[][] Map of Records in the collection grouped by record name - */ - private $nameMap = []; - /** - * @var int Number of Records in the collection - */ - private $length = 0; - /** - * @var int Whether the collection holds question or resource records - */ - private $type; - /** - * Constructor - * - * @param int $type Can be indicated using the RecordTypes enum - * @throws \InvalidArgumentException When the specified record type is invalid - */ - public function __construct($type) - { - if ($type !== RecordTypes::QUESTION && $type !== RecordTypes::RESOURCE) { - throw new \InvalidArgumentException('Record type must be QUESTION or RESOURCE'); - } - $this->type = $type; - } - /** - * Add a record to the correct bucket in the name map - * - * @param \LibDNS\Records\Record $record The record to add - */ - private function addToNameMap(Record $record) - { - if (!isset($this->nameMap[$name = (string) $record->getName()])) { - $this->nameMap[$name] = []; - } - $this->nameMap[$name][] = $record; - } - /** - * Remove a record from the name map - * - * @param \LibDNS\Records\Record $record The record to remove - */ - private function removeFromNameMap(Record $record) - { - if (!empty($this->nameMap[$name = (string) $record->getName()])) { - foreach ($this->nameMap[$name] as $key => $item) { - if ($item === $record) { - \array_splice($this->nameMap[$name], $key, 1); - break; - } - } - } - if (empty($this->nameMap[$name])) { - unset($this->nameMap[$name]); - } - } - /** - * Add a record to the collection - * - * @param \LibDNS\Records\Record $record The record to add - * @throws \InvalidArgumentException When the wrong record type is supplied - */ - public function add(Record $record) - { - if ($this->type === RecordTypes::QUESTION && !$record instanceof Question || $this->type === RecordTypes::RESOURCE && !$record instanceof Resource) { - throw new \InvalidArgumentException('Incorrect record type for this collection'); - } - $this->records[] = $record; - $this->addToNameMap($record); - $this->length++; - } - /** - * Remove a record from the collection - * - * @param \LibDNS\Records\Record $record The record to remove - */ - public function remove(Record $record) - { - foreach ($this->records as $key => $item) { - if ($item === $record) { - \array_splice($this->records, $key, 1); - $this->removeFromNameMap($record); - $this->length--; - return; - } - } - throw new \InvalidArgumentException('The supplied record is not a member of this collection'); - } - /** - * Test whether the collection contains a specific record - * - * @param \LibDNS\Records\Record $record The record to search for - * @param bool $sameInstance Whether to perform strict comparisons in search - * @return bool - */ - public function contains(Record $record, bool $sameInstance = \false) : bool - { - return \in_array($record, $this->records, $sameInstance); - } - /** - * Get all records in the collection that refer to the specified name - * - * @param string $name The name to match records against - * @return \LibDNS\Records\Record[] - */ - public function getRecordsByName(string $name) : array - { - return $this->nameMap[\strtolower($name)] ?? []; - } - /** - * Get a record from the collection by index - * - * @param int $index Record index - * @return \LibDNS\Records\Record - * @throws \OutOfBoundsException When the supplied index does not refer to a valid record - */ - public function getRecordByIndex(int $index) : Record - { - if (isset($this->records[$index])) { - return $this->records[$index]; - } - throw new \OutOfBoundsException('The specified index ' . $index . ' does not exist in the collection'); - } - /** - * Remove all records in the collection that refer to the specified name - * - * @param string $name The name to match records against - * @return int The number of records removed - */ - public function clearRecordsByName(string $name) : int - { - $count = 0; - if (isset($this->nameMap[$name = \strtolower($name)])) { - unset($this->nameMap[$name]); - foreach ($this->records as $index => $record) { - if ($record->getName() === $name) { - unset($this->records[$index]); - $count++; - } - } - $this->records = \array_values($this->records); - } - return $count; - } - /** - * Remove all records from the collection - */ - public function clear() - { - $this->records = $this->nameMap = []; - $this->length = 0; - } - /** - * Get a list of all names referenced by records in the collection - * - * @return string[] - */ - public function getNames() : array - { - return \array_keys($this->nameMap); - } - /** - * Get whether the collection holds question or resource records - * - * @return int - */ - public function getType() : int - { - return $this->type; - } - /** - * Retrieve an iterator (IteratorAggregate interface) - * - * @return \Iterator - */ - public function getIterator() : \Iterator - { - return new \ArrayIterator($this->records); - } - /** - * Get the number of records in the collection (Countable interface) - * - * @return int - */ - public function count() : int - { - return $this->length; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/RecordCollectionFactory.php b/dependencies/daverandom/libdns/src/Records/RecordCollectionFactory.php deleted file mode 100644 index a4ad1dc..0000000 --- a/dependencies/daverandom/libdns/src/Records/RecordCollectionFactory.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -/** - * Creates RecordCollection objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class RecordCollectionFactory -{ - /** - * Create a new RecordCollection object - * - * @param int $type Can be indicated using the RecordTypes enum - * @return \LibDNS\Records\RecordCollection - * @throws \InvalidArgumentException When the specified record type is invalid - */ - public function create(int $type) : RecordCollection - { - return new RecordCollection($type); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/RecordTypes.php b/dependencies/daverandom/libdns/src/Records/RecordTypes.php deleted file mode 100644 index 4573f52..0000000 --- a/dependencies/daverandom/libdns/src/Records/RecordTypes.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of possible record types - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -final class RecordTypes extends Enumeration -{ - const QUESTION = 0; - const RESOURCE = 1; -} diff --git a/dependencies/daverandom/libdns/src/Records/Resource.php b/dependencies/daverandom/libdns/src/Records/Resource.php deleted file mode 100644 index ec3ac39..0000000 --- a/dependencies/daverandom/libdns/src/Records/Resource.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeFactory; -/** - * Represents a DNS resource record - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class Resource extends Record -{ - /** - * @var int Value of the resource's time-to-live property - */ - private $ttl; - /** - * @var \LibDNS\Records\RData - */ - private $data; - /** - * Constructor - * - * @param \LibDNS\Records\Types\TypeFactory $typeFactory - * @param int $type Can be indicated using the ResourceTypes enum - * @param \LibDNS\Records\RData $data - */ - public function __construct(TypeFactory $typeFactory, int $type, RData $data) - { - $this->typeFactory = $typeFactory; - $this->type = $type; - $this->data = $data; - } - /** - * Get the value of the record TTL field - * - * @return int - */ - public function getTTL() : int - { - return $this->ttl; - } - /** - * Set the value of the record TTL field - * - * @param int $ttl The new value - * @throws \RangeException When the supplied value is outside the valid range 0 - 4294967296 - */ - public function setTTL(int $ttl) - { - if ($ttl < 0 || $ttl > 4294967296) { - throw new \RangeException('Record class must be in the range 0 - 4294967296'); - } - $this->ttl = $ttl; - } - /** - * Get the value of the resource data field - * - * @return \LibDNS\Records\RData - */ - public function getData() : RData - { - return $this->data; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceBuilder.php b/dependencies/daverandom/libdns/src/Records/ResourceBuilder.php deleted file mode 100644 index cdc1d37..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceBuilder.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinitionManager; -/** - * Builds Resource objects of a specific type - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class ResourceBuilder -{ - /** - * @var \LibDNS\Records\ResourceFactory - */ - private $resourceFactory; - /** - * @var \LibDNS\Records\RDataBuilder - */ - private $rDataBuilder; - /** - * @var \LibDNS\Records\TypeDefinitions\TypeDefinitionManager - */ - private $typeDefinitionManager; - /** - * Constructor - * - * @param \LibDNS\Records\ResourceFactory $resourceFactory - * @param \LibDNS\Records\RDataBuilder $rDataBuilder - * @param \LibDNS\Records\TypeDefinitions\TypeDefinitionManager $typeDefinitionManager - */ - public function __construct(ResourceFactory $resourceFactory, RDataBuilder $rDataBuilder, TypeDefinitionManager $typeDefinitionManager) - { - $this->resourceFactory = $resourceFactory; - $this->rDataBuilder = $rDataBuilder; - $this->typeDefinitionManager = $typeDefinitionManager; - } - /** - * Create a new Resource object - * - * @param int $type Type of the resource, can be indicated using the ResourceTypes enum - * @return \LibDNS\Records\Resource - */ - public function build(int $type) : Resource - { - $typeDefinition = $this->typeDefinitionManager->getTypeDefinition($type); - $rData = $this->rDataBuilder->build($typeDefinition); - return $this->resourceFactory->create($type, $rData); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceBuilderFactory.php b/dependencies/daverandom/libdns/src/Records/ResourceBuilderFactory.php deleted file mode 100644 index b21341b..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceBuilderFactory.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeBuilder; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinitionManager; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\TypeDefinitionFactory; -use WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions\FieldDefinitionFactory; -/** - * Creates ResourceBuilder objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class ResourceBuilderFactory -{ - /** - * Create a new ResourceBuilder object - * - * @param \LibDNS\Records\TypeDefinitions\TypeDefinitionManager $typeDefinitionManager - * @return \LibDNS\Records\ResourceBuilder - */ - public function create(TypeDefinitionManager $typeDefinitionManager = null) : ResourceBuilder - { - return new ResourceBuilder(new ResourceFactory(), new RDataBuilder(new RDataFactory(), new TypeBuilder(new TypeFactory())), $typeDefinitionManager ?: new TypeDefinitionManager(new TypeDefinitionFactory(), new FieldDefinitionFactory())); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceClasses.php b/dependencies/daverandom/libdns/src/Records/ResourceClasses.php deleted file mode 100644 index 8c9bf67..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceClasses.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of possible resource CLASS values - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -abstract class ResourceClasses extends Enumeration -{ - const IN = 1; - const CS = 2; - const CH = 3; - const HS = 4; -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceFactory.php b/dependencies/daverandom/libdns/src/Records/ResourceFactory.php deleted file mode 100644 index 77fb1d2..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceFactory.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\TypeFactory; -/** - * Creates Resource objects - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -class ResourceFactory -{ - /** - * Create a new Resource object - * - * @param int $type Can be indicated using the ResourceTypes enum - * @param \LibDNS\Records\RData $data - * @return \LibDNS\Records\Resource - */ - public function create(int $type, RData $data) : Resource - { - return new Resource(new TypeFactory(), $type, $data); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceQClasses.php b/dependencies/daverandom/libdns/src/Records/ResourceQClasses.php deleted file mode 100644 index a6096a0..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceQClasses.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -/** - * Enumeration of possible resource QCLASS values - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -final class ResourceQClasses extends ResourceClasses -{ - const ANY = 255; -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceQTypes.php b/dependencies/daverandom/libdns/src/Records/ResourceQTypes.php deleted file mode 100644 index b4bf90b..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceQTypes.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -/** - * Enumeration of possible resource QTYPE values - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -final class ResourceQTypes extends ResourceTypes -{ - const AXFR = 252; - const MAILB = 253; - const MAILA = 254; - const ALL = 255; -} diff --git a/dependencies/daverandom/libdns/src/Records/ResourceTypes.php b/dependencies/daverandom/libdns/src/Records/ResourceTypes.php deleted file mode 100644 index 614334d..0000000 --- a/dependencies/daverandom/libdns/src/Records/ResourceTypes.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of possible resource TYPE values - * - * @category LibDNS - * @package Records - * @author Chris Wright - */ -abstract class ResourceTypes extends Enumeration -{ - const A = 1; - const AAAA = 28; - const AFSDB = 18; - // const APL = 42; - const CAA = 257; - const CERT = 37; - const CNAME = 5; - const DHCID = 49; - const DLV = 32769; - const DNAME = 39; - const DNSKEY = 48; - const DS = 43; - const HINFO = 13; - // const HIP = 55; - // const IPSECKEY = 45; - const KEY = 25; - const KX = 36; - const ISDN = 20; - const LOC = 29; - const MB = 7; - const MD = 3; - const MF = 4; - const MG = 8; - const MINFO = 14; - const MR = 9; - const MX = 15; - const NAPTR = 35; - const NS = 2; - // const NSEC = 47; - // const NSEC3 = 50; - // const NSEC3PARAM = 50; - const NULL = 10; - const PTR = 12; - const RP = 17; - // const RRSIG = 46; - const RT = 21; - const SIG = 24; - const SOA = 6; - const SPF = 99; - const SRV = 33; - const TXT = 16; - const WKS = 11; - const X25 = 19; -} diff --git a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinition.php b/dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinition.php deleted file mode 100644 index a339fa8..0000000 --- a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinition.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions; - -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Type; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Anything; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\BitMap; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Char; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\CharacterString; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\DomainName; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\IPv4Address; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\IPv6Address; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Long; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Short; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Types; -/** - * Defines a field in a type - * - * @category LibDNS - * @package TypeDefinitions - * @author Chris Wright - */ -class FieldDefinition -{ - /** - * @var int - */ - private $index; - /** - * @var string - */ - private $name; - /** - * @var int - */ - private $type; - /** - * @var bool - */ - private $allowsMultiple; - /** - * @var int - */ - private $minimumValues; - /** - * Constructor - * - * @param int $index - * @param string $name - * @param int $type - * @param bool $allowsMultiple - * @param int $minimumValues - */ - public function __construct(int $index, string $name, int $type, bool $allowsMultiple, int $minimumValues) - { - $this->index = $index; - $this->name = $name; - $this->type = $type; - $this->allowsMultiple = $allowsMultiple; - $this->minimumValues = $minimumValues; - } - /** - * Get the index of the field in the containing type - * - * @return int - */ - public function getIndex() : int - { - return $this->index; - } - /** - * Get the name of the field - * - * @return string - */ - public function getName() : string - { - return $this->name; - } - /** - * Get the type of the field - * - * @return int - */ - public function getType() : int - { - return $this->type; - } - /** - * Determine whether the field allows multiple values - * - * @return bool - */ - public function allowsMultiple() : bool - { - return $this->allowsMultiple; - } - /** - * Get the minimum number of values for the field - * - * @return int - */ - public function getMinimumValues() : int - { - return $this->minimumValues; - } - /** - * Assert that a Type object is valid for this field - * - * @param \LibDNS\Records\Types\Type - * @return bool - */ - public function assertDataValid(Type $value) : bool - { - return $this->type & Types::ANYTHING && $value instanceof Anything || $this->type & Types::BITMAP && $value instanceof BitMap || $this->type & Types::CHAR && $value instanceof Char || $this->type & Types::CHARACTER_STRING && $value instanceof CharacterString || $this->type & Types::DOMAIN_NAME && $value instanceof DomainName || $this->type & Types::IPV4_ADDRESS && $value instanceof IPv4Address || $this->type & Types::IPV6_ADDRESS && $value instanceof IPv6Address || $this->type & Types::LONG && $value instanceof Long || $this->type & Types::SHORT && $value instanceof Short; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinitionFactory.php b/dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinitionFactory.php deleted file mode 100644 index 315ad8a..0000000 --- a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/FieldDefinitionFactory.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions; - -/** - * Creates FieldDefinition objects - * - * @category LibDNS - * @package TypeDefinitions - * @author Chris Wright - */ -class FieldDefinitionFactory -{ - /** - * Create a new FieldDefinition object - * - * @param int $index - * @param string $name - * @param int $type - * @param bool $allowsMultiple - * @param int $minimumValues - * @return \LibDNS\Records\TypeDefinitions\FieldDefinition - */ - public function create(int $index, string $name, int $type, bool $allowsMultiple, int $minimumValues) : FieldDefinition - { - return new FieldDefinition($index, $name, $type, $allowsMultiple, $minimumValues); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinition.php b/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinition.php deleted file mode 100644 index 92a63c2..0000000 --- a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinition.php +++ /dev/null @@ -1,177 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions; - -/** - * Defines a data type comprising multiple fields - * - * @category LibDNS - * @package TypeDefinitions - * @author Chris Wright - */ -class TypeDefinition implements \IteratorAggregate, \Countable -{ - /** - * @var FieldDefinitionFactory Creates FieldDefinition objects - */ - private $fieldDefFactory; - /** - * @var int Number of fields in the type - */ - private $fieldCount; - /** - * @var \LibDNS\Records\TypeDefinitions\FieldDefinition The last field defined by the type - */ - private $lastField; - /** - * @var int[] Map of field indexes to type identifiers - */ - private $fieldDefs = []; - /** - * @var int[] Map of field names to indexes - */ - private $fieldNameMap = []; - /** - * @var callable Custom implementation for __toString() handling - */ - private $toStringFunction; - /** - * Constructor - * - * @param FieldDefinitionFactory $fieldDefFactory - * @param array $definition Structural definition of the fields - * @throws \InvalidArgumentException When the type definition is invalid - */ - public function __construct(FieldDefinitionFactory $fieldDefFactory, array $definition) - { - $this->fieldDefFactory = $fieldDefFactory; - if (isset($definition['__toString'])) { - if (!\is_callable($definition['__toString'])) { - throw new \InvalidArgumentException('Invalid type definition: __toString() implementation is not callable'); - } - $this->toStringFunction = $definition['__toString']; - unset($definition['__toString']); - } - $this->fieldCount = \count($definition); - $index = 0; - foreach ($definition as $name => $type) { - $this->registerField($index++, $name, $type); - } - } - /** - * Register a field from the type definition - * - * @param int $index - * @param string $name - * @param int $type - * @throws \InvalidArgumentException When the field definition is invalid - */ - private function registerField(int $index, string $name, int $type) - { - if (!\preg_match('/^(?P[\\w\\-]+)(?P\\+|\\*)?(?P(?<=\\+)\\d+)?$/', \strtolower($name), $matches)) { - throw new \InvalidArgumentException('Invalid field definition ' . $name . ': Syntax error'); - } - if (isset($matches['quantifier'])) { - if ($index !== $this->fieldCount - 1) { - throw new \InvalidArgumentException('Invalid field definition ' . $name . ': Quantifiers only allowed in last field'); - } - if (!isset($matches['minimum'])) { - $matches['minimum'] = $matches['quantifier'] === '+' ? 1 : 0; - } - $allowsMultiple = \true; - $minimumValues = (int) $matches['minimum']; - } else { - $allowsMultiple = \false; - $minimumValues = 0; - } - $this->fieldDefs[$index] = $this->fieldDefFactory->create($index, $matches['name'], $type, $allowsMultiple, $minimumValues); - if ($index === $this->fieldCount - 1) { - $this->lastField = $this->fieldDefs[$index]; - } - $this->fieldNameMap[$matches['name']] = $index; - } - /** - * Get the field definition indicated by the supplied index - * - * @param int $index - * @return \LibDNS\Records\TypeDefinitions\FieldDefinition - * @throws \OutOfBoundsException When the supplied index does not refer to a valid field - */ - public function getFieldDefinition(int $index) : FieldDefinition - { - if (isset($this->fieldDefs[$index])) { - $fieldDef = $this->fieldDefs[$index]; - } else { - if ($index >= 0 && $this->lastField->allowsMultiple()) { - $fieldDef = $this->lastField; - } else { - throw new \OutOfBoundsException('Index ' . $index . ' does not refer to a valid field'); - } - } - return $fieldDef; - } - /** - * Get the field index indicated by the supplied name - * - * @param string $name - * @return int - * @throws \OutOfBoundsException When the supplied name does not refer to a valid field - */ - public function getFieldIndexByName($name) : int - { - $fieldName = \strtolower($name); - if (!isset($this->fieldNameMap[$fieldName])) { - throw new \OutOfBoundsException('Name ' . $name . ' does not refer to a valid field'); - } - return $this->fieldNameMap[$fieldName]; - } - /** - * Get the __toString() implementation - * - * @return callable|null - */ - public function getToStringFunction() - { - return $this->toStringFunction; - } - /** - * Set the __toString() implementation - * - * @param callable $function - */ - public function setToStringFunction(callable $function) - { - $this->toStringFunction = $function; - } - /** - * Retrieve an iterator (IteratorAggregate interface) - * - * @return \Iterator - */ - public function getIterator() : \Iterator - { - return new \ArrayIterator($this->fieldDefs); - } - /** - * Get the number of fields (Countable interface) - * - * @return int - */ - public function count() : int - { - return $this->fieldCount; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionFactory.php b/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionFactory.php deleted file mode 100644 index aa9884c..0000000 --- a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionFactory.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions; - -/** - * Creates TypeDefinition objects - * - * @category LibDNS - * @package TypeDefinitions - * @author Chris Wright - */ -class TypeDefinitionFactory -{ - /** - * Create a new TypeDefinition object - * - * @param FieldDefinitionFactory $fieldDefinitionFactory - * @param int[] $definition Structural definition of the fields - * @return \LibDNS\Records\TypeDefinitions\TypeDefinition - * @throws \InvalidArgumentException When the type definition is invalid - */ - public function create(FieldDefinitionFactory $fieldDefinitionFactory, array $definition) : TypeDefinition - { - return new TypeDefinition($fieldDefinitionFactory, $definition); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManager.php b/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManager.php deleted file mode 100644 index 6548302..0000000 --- a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManager.php +++ /dev/null @@ -1,264 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions; - -use WP_Ultimo\Dependencies\LibDNS\Records\ResourceTypes; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\Types; -use WP_Ultimo\Dependencies\LibDNS\Records\Types\DomainName; -/** - * Holds data about how the RDATA sections of known resource record types are structured - * - * @category LibDNS - * @package TypeDefinitions - * @author Chris Wright - */ -class TypeDefinitionManager -{ - /** - * @var array[] How the RDATA sections of known resource record types are structured - */ - private $definitions = []; - /** - * @var array Cache of created definitions - */ - private $typeDefs = []; - /** - * @var \LibDNS\Records\TypeDefinitions\TypeDefinitionFactory - */ - private $typeDefFactory; - /** - * @var \LibDNS\Records\TypeDefinitions\FieldDefinitionFactory - */ - private $fieldDefFactory; - /** - * Constructor - * - * @param \LibDNS\Records\TypeDefinitions\TypeDefinitionFactory $typeDefFactory - * @param \LibDNS\Records\TypeDefinitions\FieldDefinitionFactory $fieldDefFactory - */ - public function __construct(TypeDefinitionFactory $typeDefFactory, FieldDefinitionFactory $fieldDefFactory) - { - $this->typeDefFactory = $typeDefFactory; - $this->fieldDefFactory = $fieldDefFactory; - $this->setDefinitions(); - } - /** - * Set the internal definitions structure - */ - private function setDefinitions() - { - // This is defined in a method because PHP doesn't let you define properties with - // expressions at the class level. If anyone has a better way to do this I am open - // to any and all suggestions. - $this->definitions = [ResourceTypes::A => [ - // RFC 1035 - 'address' => Types::IPV4_ADDRESS, - ], ResourceTypes::AAAA => [ - // RFC 3596 - 'address' => Types::IPV6_ADDRESS, - ], ResourceTypes::AFSDB => [ - // RFC 1183 - 'subtype' => Types::SHORT, - 'hostname' => Types::DOMAIN_NAME, - ], ResourceTypes::CAA => [ - // RFC 6844 - 'flags' => Types::DOMAIN_NAME, - 'tag' => Types::CHARACTER_STRING, - 'value' => Types::ANYTHING, - ], ResourceTypes::CERT => [ - // RFC 4398 - 'type' => Types::SHORT, - 'key-tag' => Types::SHORT, - 'algorithm' => Types::CHAR, - 'certificate' => Types::ANYTHING, - ], ResourceTypes::CNAME => [ - // RFC 1035 - 'cname' => Types::DOMAIN_NAME, - ], ResourceTypes::DHCID => [ - // RFC 4701 - 'identifier-type' => Types::SHORT, - 'digest-type' => Types::CHAR, - 'digest' => Types::ANYTHING, - ], ResourceTypes::DLV => [ - // RFC 4034 - 'key-tag' => Types::SHORT, - 'algorithm' => Types::CHAR, - 'digest-type' => Types::CHAR, - 'digest' => Types::ANYTHING, - ], ResourceTypes::DNAME => [ - // RFC 4034 - 'target' => Types::DOMAIN_NAME, - ], ResourceTypes::DNSKEY => [ - // RFC 6672 - 'flags' => Types::SHORT, - 'protocol' => Types::CHAR, - 'algorithm' => Types::CHAR, - 'public-key' => Types::ANYTHING, - ], ResourceTypes::DS => [ - // RFC 4034 - 'key-tag' => Types::SHORT, - 'algorithm' => Types::CHAR, - 'digest-type' => Types::CHAR, - 'digest' => Types::ANYTHING, - ], ResourceTypes::HINFO => [ - // RFC 1035 - 'cpu' => Types::CHARACTER_STRING, - 'os' => Types::CHARACTER_STRING, - ], ResourceTypes::ISDN => [ - // RFC 1183 - 'isdn-address' => Types::CHARACTER_STRING, - 'sa' => Types::CHARACTER_STRING, - ], ResourceTypes::KEY => [ - // RFC 2535 - 'flags' => Types::SHORT, - 'protocol' => Types::CHAR, - 'algorithm' => Types::CHAR, - 'public-key' => Types::ANYTHING, - ], ResourceTypes::KX => [ - // RFC 2230 - 'preference' => Types::SHORT, - 'exchange' => Types::DOMAIN_NAME, - ], ResourceTypes::LOC => [ - // RFC 1876 - 'version' => Types::CHAR, - 'size' => Types::CHAR, - 'horizontal-precision' => Types::CHAR, - 'vertical-precision' => Types::CHAR, - 'latitude' => Types::LONG, - 'longitude' => Types::LONG, - 'altitude' => Types::LONG, - ], ResourceTypes::MB => [ - // RFC 1035 - 'madname' => Types::DOMAIN_NAME, - ], ResourceTypes::MD => [ - // RFC 1035 - 'madname' => Types::DOMAIN_NAME, - ], ResourceTypes::MF => [ - // RFC 1035 - 'madname' => Types::DOMAIN_NAME, - ], ResourceTypes::MG => [ - // RFC 1035 - 'mgmname' => Types::DOMAIN_NAME, - ], ResourceTypes::MINFO => [ - // RFC 1035 - 'rmailbx' => Types::DOMAIN_NAME, - 'emailbx' => Types::DOMAIN_NAME, - ], ResourceTypes::MR => [ - // RFC 1035 - 'newname' => Types::DOMAIN_NAME, - ], ResourceTypes::MX => [ - // RFC 1035 - 'preference' => Types::SHORT, - 'exchange' => Types::DOMAIN_NAME, - ], ResourceTypes::NAPTR => [ - // RFC 3403 - 'order' => Types::SHORT, - 'preference' => Types::SHORT, - 'flags' => Types::CHARACTER_STRING, - 'services' => Types::CHARACTER_STRING, - 'regexp' => Types::CHARACTER_STRING, - 'replacement' => Types::DOMAIN_NAME, - ], ResourceTypes::NS => [ - // RFC 1035 - 'nsdname' => Types::DOMAIN_NAME, - ], ResourceTypes::NULL => [ - // RFC 1035 - 'data' => Types::ANYTHING, - ], ResourceTypes::PTR => [ - // RFC 1035 - 'ptrdname' => Types::DOMAIN_NAME, - ], ResourceTypes::RP => [ - // RFC 1183 - 'mbox-dname' => Types::DOMAIN_NAME, - 'txt-dname' => Types::DOMAIN_NAME, - ], ResourceTypes::RT => [ - // RFC 1183 - 'preference' => Types::SHORT, - 'intermediate-host' => Types::DOMAIN_NAME, - ], ResourceTypes::SIG => [ - // RFC 4034 - 'type-covered' => Types::SHORT, - 'algorithm' => Types::CHAR, - 'labels' => Types::CHAR, - 'original-ttl' => Types::LONG, - 'signature-expiration' => Types::LONG, - 'signature-inception' => Types::LONG, - 'key-tag' => Types::SHORT, - 'signers-name' => Types::DOMAIN_NAME, - 'signature' => Types::ANYTHING, - ], ResourceTypes::SOA => [ - // RFC 1035 - 'mname' => Types::DOMAIN_NAME, - 'rname' => Types::DOMAIN_NAME, - 'serial' => Types::LONG, - 'refresh' => Types::LONG, - 'retry' => Types::LONG, - 'expire' => Types::LONG, - 'minimum' => Types::LONG, - ], ResourceTypes::SPF => [ - // RFC 4408 - 'data+' => Types::CHARACTER_STRING, - ], ResourceTypes::SRV => [ - // RFC 2782 - 'priority' => Types::SHORT, - 'weight' => Types::SHORT, - 'port' => Types::SHORT, - 'name' => Types::DOMAIN_NAME | DomainName::FLAG_NO_COMPRESSION, - ], ResourceTypes::TXT => [ - // RFC 1035 - 'txtdata+' => Types::CHARACTER_STRING, - ], ResourceTypes::WKS => [ - // RFC 1035 - 'address' => Types::IPV4_ADDRESS, - 'protocol' => Types::SHORT, - 'bit-map' => Types::BITMAP, - ], ResourceTypes::X25 => [ - // RFC 1183 - 'psdn-address' => Types::CHARACTER_STRING, - ]]; - } - /** - * Get a type definition for a record type if it is known - * - * @param int $recordType Resource type, can be indicated using the ResourceTypes enum - * @return \LibDNS\Records\TypeDefinitions\TypeDefinition - */ - public function getTypeDefinition(int $recordType) - { - if (!isset($this->typeDefs[$recordType])) { - $definition = isset($this->definitions[$recordType]) ? $this->definitions[$recordType] : ['data' => Types::ANYTHING]; - $this->typeDefs[$recordType] = $this->typeDefFactory->create($this->fieldDefFactory, $definition); - } - return $this->typeDefs[$recordType]; - } - /** - * Register a custom type definition - * - * @param int $recordType Resource type, can be indicated using the ResourceTypes enum - * @param int[]|\LibDNS\Records\TypeDefinitions\TypeDefinition $definition - * @throws \InvalidArgumentException When the type definition is invalid - */ - public function registerTypeDefinition(int $recordType, $definition) - { - if (!$definition instanceof TypeDefinition) { - if (!\is_array($definition)) { - throw new \InvalidArgumentException('Definition must be an array or an instance of ' . __NAMESPACE__ . '\\TypeDefinition'); - } - $definition = $this->typeDefFactory->create($this->fieldDefFactory, $definition); - } - $this->typeDefs[$recordType] = $definition; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManagerFactory.php b/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManagerFactory.php deleted file mode 100644 index acce6c4..0000000 --- a/dependencies/daverandom/libdns/src/Records/TypeDefinitions/TypeDefinitionManagerFactory.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\TypeDefinitions; - -/** - * Creates TypeDefinitionManager objects - * - * @category LibDNS - * @package TypeDefinitions - * @author Chris Wright - */ -class TypeDefinitionManagerFactory -{ - /** - * Create a new TypeDefinitionManager object - * - * @return \LibDNS\Records\TypeDefinitions\TypeDefinitionManager - */ - public function create() : TypeDefinitionManager - { - return new TypeDefinitionManager(new TypeDefinitionFactory(), new FieldDefinitionFactory()); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/Anything.php b/dependencies/daverandom/libdns/src/Records/Types/Anything.php deleted file mode 100644 index 8d7e555..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/Anything.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents a generic binary data string - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class Anything extends Type -{ - /** - * @var string - */ - protected $value = ''; - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnexpectedValueException When the supplied value is outside the valid length range 0 - 65535 - */ - public function setValue($value) - { - $value = (string) $value; - if (\strlen($value) > 65535) { - throw new \UnexpectedValueException('Untyped string length must be in the range 0 - 65535'); - } - $this->value = $value; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/BitMap.php b/dependencies/daverandom/libdns/src/Records/Types/BitMap.php deleted file mode 100644 index caa8a74..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/BitMap.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents a bit map - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class BitMap extends Type -{ - /** - * @var string - */ - protected $value = ''; - /** - * Set the internal value - * - * @param string $value The new value - */ - public function setValue($value) - { - $this->value = (string) $value; - } - /** - * Inspect the value of the bit at the specific index and optionally set a new value - * - * @param int $index - * @param bool $newValue The new value - * @return bool The old value - */ - public function isBitSet(int $index, bool $newValue = null) : bool - { - $charIndex = (int) ($index / 8); - $bitMask = 0b10000000 >> $index % 8; - $result = \false; - if (isset($this->value[$charIndex])) { - $result = (bool) (\ord($this->value[$charIndex]) & $bitMask); - } - if (isset($newValue) && $newValue != $result) { - if (!isset($this->value[$charIndex])) { - $this->value = \str_pad($this->value, $charIndex + 1, "\x00", \STR_PAD_RIGHT); - } - $this->value[$charIndex] = \chr(\ord($this->value[$charIndex]) & ~$bitMask | ($newValue ? $bitMask : 0)); - } - return $result; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/Char.php b/dependencies/daverandom/libdns/src/Records/Types/Char.php deleted file mode 100644 index ef8b1e8..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/Char.php +++ /dev/null @@ -1,50 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents an 8-bit unsigned integer - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class Char extends Type -{ - /** - * @var int - */ - protected $value = 0; - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnderflowException When the supplied value is less than 0 - * @throws \OverflowException When the supplied value is greater than 255 - */ - public function setValue($value) - { - $value = (int) $value; - if ($value < 0) { - throw new \UnderflowException('Char value must be in the range 0 - 255'); - } else { - if ($value > 255) { - throw new \OverflowException('Char value must be in the range 0 - 255'); - } - } - $this->value = $value; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/CharacterString.php b/dependencies/daverandom/libdns/src/Records/Types/CharacterString.php deleted file mode 100644 index 224a230..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/CharacterString.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents a binary character string - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class CharacterString extends Type -{ - /** - * @var string - */ - protected $value = ''; - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnexpectedValueException When the supplied value is outside the valid length range 0 - 255 - */ - public function setValue($value) - { - $value = (string) $value; - if (\strlen($value) > 255) { - throw new \UnexpectedValueException('Character string length must be in the range 0 - 255'); - } - $this->value = $value; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/DomainName.php b/dependencies/daverandom/libdns/src/Records/Types/DomainName.php deleted file mode 100644 index ee79f31..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/DomainName.php +++ /dev/null @@ -1,104 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents a fully qualified domain name - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class DomainName extends Type -{ - const FLAG_NO_COMPRESSION = \PHP_INT_SIZE === 4 ? -2147483648 : 0x80000000; - /** - * @var string - */ - protected $value = ''; - /** - * @var string[] The value as a list of labels - */ - private $labels = []; - /** - * Constructor - * - * @param string|string[] $value - * @throws \UnexpectedValueException When the supplied value is not a valid domain name - */ - public function __construct($value = null) - { - if (\is_array($value)) { - $this->setLabels($value); - } else { - parent::__construct($value); - } - } - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnexpectedValueException When the supplied value is not a valid domain name - */ - public function setValue($value) - { - $this->setLabels(\explode('.', (string) $value)); - } - /** - * Get the domain name labels - * - * @param bool $tldFirst Whether to return the label list ordered with the TLD label first - * @return string[] - */ - public function getLabels($tldFirst = \false) : array - { - return $tldFirst ? \array_reverse($this->labels) : $this->labels; - } - /** - * Set the domain name labels - * - * @param string[] $labels The new label list - * @param bool $tldFirst Whether the supplied label list is ordered with the TLD label first - * @throws \UnexpectedValueException When the supplied label list is not a valid domain name - */ - public function setLabels(array $labels, $tldFirst = \false) - { - if (!$labels) { - $this->labels = []; - $this->value = ''; - return; - } - $length = $count = 0; - foreach ($labels as &$label) { - $label = \WP_Ultimo\Dependencies\LibDNS\normalize_name($label); - $labelLength = \strlen($label); - if ($labelLength > 63) { - throw new \InvalidArgumentException('Label list is not a valid domain name: Label ' . $label . ' length exceeds 63 byte limit'); - } - $length += $labelLength + 1; - $count++; - } - $tld = $tldFirst ? $labels[0] : $labels[$count - 1]; - if ($tld === '') { - $length--; - } - if ($length + 1 > 255) { - throw new \InvalidArgumentException('Label list is not a valid domain name: Total length exceeds 255 byte limit'); - } - $this->labels = $tldFirst ? \array_reverse($labels) : $labels; - $this->value = \implode('.', $this->labels); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/IPv4Address.php b/dependencies/daverandom/libdns/src/Records/Types/IPv4Address.php deleted file mode 100644 index 8579f12..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/IPv4Address.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents an IPv4 address - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class IPv4Address extends Type -{ - /** - * @var string - */ - protected $value = '0.0.0.0'; - /** - * @var int[] The octets of the address - */ - private $octets = [0, 0, 0, 0]; - /** - * Constructor - * - * @param string|int[] $value String representation or octet list - * @throws \UnexpectedValueException When the supplied value is not a valid IPv4 address - */ - public function __construct($value = null) - { - if (\is_array($value)) { - $this->setOctets($value); - } else { - parent::__construct($value); - } - } - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnexpectedValueException When the supplied value is outside the valid length range 0 - 65535 - */ - public function setValue($value) - { - $this->setOctets(\explode('.', (string) $value)); - } - /** - * Get the address octets - * - * @return int[] - */ - public function getOctets() : array - { - return $this->octets; - } - /** - * Set the address octets - * - * @param int[] $octets The new address octets - * @throws \UnexpectedValueException When the supplied octet list is not a valid IPv4 address - */ - public function setOctets(array $octets) - { - if (\count($octets) !== 4) { - throw new \UnexpectedValueException('Octet list is not a valid IPv4 address: invalid octet count'); - } - foreach ($octets as &$octet) { - if (!\is_int($octet) && !\ctype_digit((string) $octet) || $octet < 0x0 || $octet > 0xff) { - throw new \UnexpectedValueException('Octet list is not a valid IPv4 address: invalid octet value ' . $octet); - } - $octet = (int) $octet; - } - $this->octets = \array_values($octets); - $this->value = \implode('.', $this->octets); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/IPv6Address.php b/dependencies/daverandom/libdns/src/Records/Types/IPv6Address.php deleted file mode 100644 index 0182b35..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/IPv6Address.php +++ /dev/null @@ -1,152 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents an IPv6 address - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class IPv6Address extends Type -{ - /** - * @var string - */ - protected $value = '::'; - /** - * @var int[] The shorts of the address - */ - private $shorts = [0, 0, 0, 0, 0, 0, 0, 0]; - /** - * Create a compressed string representation of an IPv6 address - * - * @param int[] $shorts Address shorts - * @return string - */ - private function createCompressedString($shorts) - { - $compressLen = $compressPos = $currentLen = $currentPos = 0; - $inBlock = \false; - for ($i = 0; $i < 8; $i++) { - if ($shorts[$i] === 0) { - if (!$inBlock) { - $inBlock = \true; - $currentPos = $i; - } - $currentLen++; - } else { - if ($inBlock) { - if ($currentLen > $compressLen) { - $compressLen = $currentLen; - $compressPos = $currentPos; - } - $inBlock = \false; - $currentPos = $currentLen = 0; - } - } - $shorts[$i] = \dechex($shorts[$i]); - } - if ($inBlock) { - $compressLen = $currentLen; - $compressPos = $currentPos; - } - if ($compressLen > 1) { - if ($compressLen === 8) { - $replace = ['', '', '']; - } else { - if ($compressPos === 0 || $compressPos + $compressLen === 8) { - $replace = ['', '']; - } else { - $replace = ['']; - } - } - \array_splice($shorts, $compressPos, $compressLen, $replace); - } - return \implode(':', $shorts); - } - /** - * Constructor - * - * @param string|int[] $value String representation or shorts list - * @throws \UnexpectedValueException When the supplied value is not a valid IPv6 address - */ - public function __construct($value = null) - { - if (\is_array($value)) { - $this->setShorts($value); - } else { - parent::__construct($value); - } - } - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnexpectedValueException When the supplied value is outside the valid length range 0 - 65535 - */ - public function setValue($value) - { - $shorts = \explode(':', (string) $value); - $count = \count($shorts); - if ($count < 3 || $count > 8) { - throw new \UnexpectedValueException('Value is not a valid IPv6 address: invalid short count'); - } else { - if ($shorts[0] === '' && $shorts[1] === '') { - $shorts = \array_pad($shorts, -8, '0'); - } else { - if ($shorts[$count - 2] === '' && $shorts[$count - 1] === '') { - $shorts = \array_pad($shorts, 8, '0'); - } else { - if (\false !== ($pos = \array_search('', $shorts, \true))) { - \array_splice($shorts, $pos, 1, \array_fill(0, 8 - ($count - 1), '0')); - } - } - } - } - $this->setShorts(\array_map('hexdec', $shorts)); - } - /** - * Get the address shorts - * - * @return int[] - */ - public function getShorts() : array - { - return $this->shorts; - } - /** - * Set the address shorts - * - * @param int[] $shorts The new address shorts - * @throws \UnexpectedValueException When the supplied short list is not a valid IPv6 address - */ - public function setShorts(array $shorts) - { - if (\count($shorts) !== 8) { - throw new \UnexpectedValueException('Short list is not a valid IPv6 address: invalid short count'); - } - foreach ($shorts as &$short) { - if (!\is_int($short) && !\ctype_digit((string) $short) || $short < 0x0 || $short > 0xffff) { - throw new \UnexpectedValueException('Short list is not a valid IPv6 address: invalid short value ' . $short); - } - $short = (int) $short; - } - $this->shorts = \array_values($shorts); - $this->value = $this->createCompressedString($this->shorts); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/Long.php b/dependencies/daverandom/libdns/src/Records/Types/Long.php deleted file mode 100644 index 9e74931..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/Long.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents a 32-bit unsigned integer - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class Long extends Type -{ - /** - * @var int - */ - protected $value = 0; - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnderflowException When the supplied value is less than 0 - * @throws \OverflowException When the supplied value is greater than 4294967296 - */ - public function setValue($value) - { - $value = (int) $value; - if (\PHP_INT_SIZE > 4) { - if ($value < 0) { - throw new \UnderflowException('Long integer value must be in the range 0 - 4294967296'); - } else { - if ($value > 0xffffffff) { - throw new \OverflowException('Long integer value must be in the range 0 - 4294967296'); - } - } - } - $this->value = $value; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/Short.php b/dependencies/daverandom/libdns/src/Records/Types/Short.php deleted file mode 100644 index df02172..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/Short.php +++ /dev/null @@ -1,50 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Represents a 16-bit unsigned integer - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class Short extends Type -{ - /** - * @var int - */ - protected $value = 0; - /** - * Set the internal value - * - * @param string $value The new value - * @throws \UnderflowException When the supplied value is less than 0 - * @throws \OverflowException When the supplied value is greater than 65535 - */ - public function setValue($value) - { - $value = (int) $value; - if ($value < 0) { - throw new \UnderflowException('Short integer value must be in the range 0 - 65535'); - } else { - if ($value > 0xffff) { - throw new \OverflowException('Short integer value must be in the range 0 - 65535'); - } - } - $this->value = $value; - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/Type.php b/dependencies/daverandom/libdns/src/Records/Types/Type.php deleted file mode 100644 index 00bdaec..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/Type.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Base class for simple data types - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -abstract class Type -{ - /** - * @var mixed The internal value - */ - protected $value; - /** - * Constructor - * - * @param string $value Internal value - * @throws \RuntimeException When the supplied value is invalid - */ - public function __construct(string $value = null) - { - if (isset($value)) { - $this->setValue($value); - } - } - /** - * Magic method for type coercion to string - * - * @return string - */ - public function __toString() : string - { - return (string) $this->value; - } - /** - * Get the internal value - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - /** - * Set the internal value - * - * @param string $value The new value - * @throws \RuntimeException When the supplied value is invalid - */ - public abstract function setValue($value); -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/TypeBuilder.php b/dependencies/daverandom/libdns/src/Records/Types/TypeBuilder.php deleted file mode 100644 index df40212..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/TypeBuilder.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Builds Types from type definitions - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class TypeBuilder -{ - /** - * @var \LibDNS\Records\Types\TypeFactory - */ - private $typeFactory; - /** - * Constructor - * - * @param \LibDNS\Records\Types\TypeFactory $typeFactory - */ - public function __construct(TypeFactory $typeFactory) - { - $this->typeFactory = $typeFactory; - } - /** - * Build a new Type object corresponding to a resource record type - * - * @param int $type Data type, can be indicated using the Types enum - * @return \LibDNS\Records\Types\Type - */ - public function build(int $type) : Type - { - static $typeMap = [Types::ANYTHING => 'createAnything', Types::BITMAP => 'createBitMap', Types::CHAR => 'createChar', Types::CHARACTER_STRING => 'createCharacterString', Types::DOMAIN_NAME => 'createDomainName', Types::IPV4_ADDRESS => 'createIPv4Address', Types::IPV6_ADDRESS => 'createIPv6Address', Types::LONG => 'createLong', Types::SHORT => 'createShort']; - if (!isset($typeMap[$type])) { - throw new \InvalidArgumentException('Invalid Type identifier ' . $type); - } - return $this->typeFactory->{$typeMap[$type]}(); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/TypeFactory.php b/dependencies/daverandom/libdns/src/Records/Types/TypeFactory.php deleted file mode 100644 index 03f915f..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/TypeFactory.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -/** - * Creates Type objects - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -class TypeFactory -{ - /** - * Create a new Anything object - * - * @param string $value - * @return \LibDNS\Records\Types\Anything - */ - public function createAnything(string $value = null) - { - return new Anything($value); - } - /** - * Create a new BitMap object - * - * @param string $value - * @return \LibDNS\Records\Types\BitMap - */ - public function createBitMap(string $value = null) - { - return new BitMap($value); - } - /** - * Create a new Char object - * - * @param int $value - * @return \LibDNS\Records\Types\Char - */ - public function createChar(int $value = null) - { - return new Char((string) $value); - } - /** - * Create a new CharacterString object - * - * @param string $value - * @return \LibDNS\Records\Types\CharacterString - */ - public function createCharacterString(string $value = null) - { - return new CharacterString($value); - } - /** - * Create a new DomainName object - * - * @param string|string[] $value - * @return \LibDNS\Records\Types\DomainName - */ - public function createDomainName($value = null) - { - return new DomainName($value); - } - /** - * Create a new IPv4Address object - * - * @param string|int[] $value - * @return \LibDNS\Records\Types\IPv4Address - */ - public function createIPv4Address($value = null) - { - return new IPv4Address($value); - } - /** - * Create a new IPv6Address object - * - * @param string|int[] $value - * @return \LibDNS\Records\Types\IPv6Address - */ - public function createIPv6Address($value = null) - { - return new IPv6Address($value); - } - /** - * Create a new Long object - * - * @param int $value - * @return \LibDNS\Records\Types\Long - */ - public function createLong(int $value = null) - { - return new Long((string) $value); - } - /** - * Create a new Short object - * - * @param int $value - * @return \LibDNS\Records\Types\Short - */ - public function createShort(int $value = null) - { - return new Short((string) $value); - } -} diff --git a/dependencies/daverandom/libdns/src/Records/Types/Types.php b/dependencies/daverandom/libdns/src/Records/Types/Types.php deleted file mode 100644 index 04fb067..0000000 --- a/dependencies/daverandom/libdns/src/Records/Types/Types.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 2.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Records\Types; - -use WP_Ultimo\Dependencies\LibDNS\Enumeration; -/** - * Enumeration of simple data types - * - * @category LibDNS - * @package Types - * @author Chris Wright - */ -final class Types extends Enumeration -{ - const ANYTHING = 0b1; - const BITMAP = 0b10; - const CHAR = 0b100; - const CHARACTER_STRING = 0b1000; - const DOMAIN_NAME = 0b10000; - const IPV4_ADDRESS = 0b100000; - const IPV6_ADDRESS = 0b1000000; - const LONG = 0b10000000; - const SHORT = 0b100000000; -} diff --git a/dependencies/daverandom/libdns/src/functions.php b/dependencies/daverandom/libdns/src/functions.php deleted file mode 100644 index 0a4a688..0000000 --- a/dependencies/daverandom/libdns/src/functions.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright Copyright (c) Chris Wright - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 1.0.0 - */ -namespace WP_Ultimo\Dependencies\LibDNS\Tools; - -use RecursiveIteratorIterator; -use RecursiveDirectoryIterator; -use FilesystemIterator; -\error_reporting(0); -\ini_set('display_errors', 0); -if (!isset($argv[1])) { - $srcDir = \getcwd(); -} else { - if (\in_array(\strtolower($argv[1]), ['--help', '?', '/?'])) { - exit("Syntax: " . __FILE__ . " [source directory]\n"); - } else { - if (!\is_dir($srcDir = $argv[1])) { - exit("Invalid source directory\n\nSyntax: " . __FILE__ . " [source directory]\n"); - } - } -} -$srcDir = \str_replace('\\', '/', $srcDir); -$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($srcDir, FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)); -$items = []; -$stripLength = \strlen($srcDir) + 1; -$maxLength = 0; -foreach ($iterator as $item) { - if ($item->isFile() && $item->getFilename() !== 'autoload.php' && \strtolower($item->getExtension()) === 'php') { - $classPath = \substr($item->getPath() . '\\' . $item->getBasename('.' . $item->getExtension()), $stripLength); - $lookupName = \strtolower(\str_replace('/', '\\', $classPath)); - $loadPath = "__DIR__ . '/{$srcDir}/" . \str_replace('\\', '/', $classPath) . ".php'"; - $length = \strlen($classPath); - if ($length > $maxLength) { - $maxLength = $length; - } - $items[$lookupName] = $loadPath; - } -} -unset($iterator); -$output = <<<'PHP' - $loadPath) { - $output .= "\n " . \str_pad("'" . $lookupName . "'", $maxLength, ' ', \STR_PAD_RIGHT) . " => {$loadPath},"; -} -$output .= <<<'PHP' - - ]; - } - - $className = strtolower($className); - if (isset($classMap[$className])) { - /** @noinspection PhpIncludeInspection */ - require $classMap[$className]; - } -}); - -PHP; -\file_put_contents(\getcwd() . '/autoload.php', $output); diff --git a/dependencies/delight-im/cookie/src/Cookie.php b/dependencies/delight-im/cookie/src/Cookie.php deleted file mode 100644 index bf6bb3a..0000000 --- a/dependencies/delight-im/cookie/src/Cookie.php +++ /dev/null @@ -1,522 +0,0 @@ -name = $name; - $this->value = null; - $this->expiryTime = 0; - $this->path = '/'; - $this->domain = null; - $this->httpOnly = \true; - $this->secureOnly = \false; - $this->sameSiteRestriction = self::SAME_SITE_RESTRICTION_LAX; - } - /** - * Returns the name of the cookie - * - * @return string the name of the cookie which is also the key for future accesses via `$_COOKIE[...]` - */ - public function getName() - { - return $this->name; - } - /** - * Returns the value of the cookie - * - * @return mixed|null the value of the cookie that will be stored on the client's machine - */ - public function getValue() - { - return $this->value; - } - /** - * Sets the value for the cookie - * - * @param mixed|null $value the value of the cookie that will be stored on the client's machine - * @return static this instance for chaining - */ - public function setValue($value) - { - $this->value = $value; - return $this; - } - /** - * Returns the expiry time of the cookie - * - * @return int the Unix timestamp indicating the time that the cookie will expire at, i.e. usually `time() + $seconds` - */ - public function getExpiryTime() - { - return $this->expiryTime; - } - /** - * Sets the expiry time for the cookie - * - * @param int $expiryTime the Unix timestamp indicating the time that the cookie will expire at, i.e. usually `time() + $seconds` - * @return static this instance for chaining - */ - public function setExpiryTime($expiryTime) - { - $this->expiryTime = $expiryTime; - return $this; - } - /** - * Returns the maximum age of the cookie (i.e. the remaining lifetime) - * - * @return int the maximum age of the cookie in seconds - */ - public function getMaxAge() - { - return $this->expiryTime - \time(); - } - /** - * Sets the expiry time for the cookie based on the specified maximum age (i.e. the remaining lifetime) - * - * @param int $maxAge the maximum age for the cookie in seconds - * @return static this instance for chaining - */ - public function setMaxAge($maxAge) - { - $this->expiryTime = \time() + $maxAge; - return $this; - } - /** - * Returns the path of the cookie - * - * @return string the path on the server that the cookie will be valid for (including all sub-directories), e.g. an empty string for the current directory or `/` for the root directory - */ - public function getPath() - { - return $this->path; - } - /** - * Sets the path for the cookie - * - * @param string $path the path on the server that the cookie will be valid for (including all sub-directories), e.g. an empty string for the current directory or `/` for the root directory - * @return static this instance for chaining - */ - public function setPath($path) - { - $this->path = $path; - return $this; - } - /** - * Returns the domain of the cookie - * - * @return string|null the domain that the cookie will be valid for (including subdomains) or `null` for the current host (excluding subdomains) - */ - public function getDomain() - { - return $this->domain; - } - /** - * Sets the domain for the cookie - * - * @param string|null $domain the domain that the cookie will be valid for (including subdomains) or `null` for the current host (excluding subdomains) - * @return static this instance for chaining - */ - public function setDomain($domain = null) - { - $this->domain = self::normalizeDomain($domain); - return $this; - } - /** - * Returns whether the cookie should be accessible through HTTP only - * - * @return bool whether the cookie should be accessible through the HTTP protocol only and not through scripting languages - */ - public function isHttpOnly() - { - return $this->httpOnly; - } - /** - * Sets whether the cookie should be accessible through HTTP only - * - * @param bool $httpOnly indicates that the cookie should be accessible through the HTTP protocol only and not through scripting languages - * @return static this instance for chaining - */ - public function setHttpOnly($httpOnly) - { - $this->httpOnly = $httpOnly; - return $this; - } - /** - * Returns whether the cookie should be sent over HTTPS only - * - * @return bool whether the cookie should be sent back by the client over secure HTTPS connections only - */ - public function isSecureOnly() - { - return $this->secureOnly; - } - /** - * Sets whether the cookie should be sent over HTTPS only - * - * @param bool $secureOnly indicates that the cookie should be sent back by the client over secure HTTPS connections only - * @return static this instance for chaining - */ - public function setSecureOnly($secureOnly) - { - $this->secureOnly = $secureOnly; - return $this; - } - /** - * Returns the same-site restriction of the cookie - * - * @return string|null whether the cookie should not be sent along with cross-site requests (either `null`, `None`, `Lax` or `Strict`) - */ - public function getSameSiteRestriction() - { - return $this->sameSiteRestriction; - } - /** - * Sets the same-site restriction for the cookie - * - * @param string|null $sameSiteRestriction indicates that the cookie should not be sent along with cross-site requests (either `null`, `None`, `Lax` or `Strict`) - * @return static this instance for chaining - */ - public function setSameSiteRestriction($sameSiteRestriction) - { - $this->sameSiteRestriction = $sameSiteRestriction; - return $this; - } - /** - * Saves the cookie - * - * @return bool whether the cookie header has successfully been sent (and will *probably* cause the client to set the cookie) - */ - public function save() - { - return self::addHttpHeader((string) $this); - } - /** - * Saves the cookie and immediately creates the corresponding variable in the superglobal `$_COOKIE` array - * - * The variable would otherwise only be available starting from the next HTTP request - * - * @return bool whether the cookie header has successfully been sent (and will *probably* cause the client to set the cookie) - */ - public function saveAndSet() - { - $_COOKIE[$this->name] = $this->value; - return $this->save(); - } - /** - * Deletes the cookie - * - * @return bool whether the cookie header has successfully been sent (and will *probably* cause the client to delete the cookie) - */ - public function delete() - { - // create a temporary copy of this cookie so that it isn't corrupted - $copiedCookie = clone $this; - // set the copied cookie's value to an empty string which internally sets the required options for a deletion - $copiedCookie->setValue(''); - // save the copied "deletion" cookie - return $copiedCookie->save(); - } - /** - * Deletes the cookie and immediately removes the corresponding variable from the superglobal `$_COOKIE` array - * - * The variable would otherwise only be deleted at the start of the next HTTP request - * - * @return bool whether the cookie header has successfully been sent (and will *probably* cause the client to delete the cookie) - */ - public function deleteAndUnset() - { - unset($_COOKIE[$this->name]); - return $this->delete(); - } - public function __toString() - { - return self::buildCookieHeader($this->name, $this->value, $this->expiryTime, $this->path, $this->domain, $this->secureOnly, $this->httpOnly, $this->sameSiteRestriction); - } - /** - * Sets a new cookie in a way compatible to PHP's `setcookie(...)` function - * - * @param string $name the name of the cookie which is also the key for future accesses via `$_COOKIE[...]` - * @param mixed|null $value the value of the cookie that will be stored on the client's machine - * @param int $expiryTime the Unix timestamp indicating the time that the cookie will expire at, i.e. usually `time() + $seconds` - * @param string|null $path the path on the server that the cookie will be valid for (including all sub-directories), e.g. an empty string for the current directory or `/` for the root directory - * @param string|null $domain the domain that the cookie will be valid for (including subdomains) or `null` for the current host (excluding subdomains) - * @param bool $secureOnly indicates that the cookie should be sent back by the client over secure HTTPS connections only - * @param bool $httpOnly indicates that the cookie should be accessible through the HTTP protocol only and not through scripting languages - * @param string|null $sameSiteRestriction indicates that the cookie should not be sent along with cross-site requests (either `null`, `None`, `Lax` or `Strict`) - * @return bool whether the cookie header has successfully been sent (and will *probably* cause the client to set the cookie) - */ - public static function setcookie($name, $value = null, $expiryTime = 0, $path = null, $domain = null, $secureOnly = \false, $httpOnly = \false, $sameSiteRestriction = null) - { - return self::addHttpHeader(self::buildCookieHeader($name, $value, $expiryTime, $path, $domain, $secureOnly, $httpOnly, $sameSiteRestriction)); - } - /** - * Builds the HTTP header that can be used to set a cookie with the specified options - * - * @param string $name the name of the cookie which is also the key for future accesses via `$_COOKIE[...]` - * @param mixed|null $value the value of the cookie that will be stored on the client's machine - * @param int $expiryTime the Unix timestamp indicating the time that the cookie will expire at, i.e. usually `time() + $seconds` - * @param string|null $path the path on the server that the cookie will be valid for (including all sub-directories), e.g. an empty string for the current directory or `/` for the root directory - * @param string|null $domain the domain that the cookie will be valid for (including subdomains) or `null` for the current host (excluding subdomains) - * @param bool $secureOnly indicates that the cookie should be sent back by the client over secure HTTPS connections only - * @param bool $httpOnly indicates that the cookie should be accessible through the HTTP protocol only and not through scripting languages - * @param string|null $sameSiteRestriction indicates that the cookie should not be sent along with cross-site requests (either `null`, `None`, `Lax` or `Strict`) - * @return string the HTTP header - */ - public static function buildCookieHeader($name, $value = null, $expiryTime = 0, $path = null, $domain = null, $secureOnly = \false, $httpOnly = \false, $sameSiteRestriction = null) - { - if (self::isNameValid($name)) { - $name = (string) $name; - } else { - return null; - } - if (self::isExpiryTimeValid($expiryTime)) { - $expiryTime = (int) $expiryTime; - } else { - return null; - } - $forceShowExpiry = \false; - if (\is_null($value) || $value === \false || $value === '') { - $value = 'deleted'; - $expiryTime = 0; - $forceShowExpiry = \true; - } - $maxAgeStr = self::formatMaxAge($expiryTime, $forceShowExpiry); - $expiryTimeStr = self::formatExpiryTime($expiryTime, $forceShowExpiry); - $headerStr = self::HEADER_PREFIX . $name . '=' . \urlencode($value); - if (!\is_null($expiryTimeStr)) { - $headerStr .= '; expires=' . $expiryTimeStr; - } - // The `Max-Age` property is supported on PHP 5.5+ only (https://bugs.php.net/bug.php?id=23955). - if (\PHP_VERSION_ID >= 50500) { - if (!\is_null($maxAgeStr)) { - $headerStr .= '; Max-Age=' . $maxAgeStr; - } - } - if (!empty($path) || $path === 0) { - $headerStr .= '; path=' . $path; - } - if (!empty($domain) || $domain === 0) { - $headerStr .= '; domain=' . $domain; - } - if ($secureOnly) { - $headerStr .= '; secure'; - } - if ($httpOnly) { - $headerStr .= '; httponly'; - } - if ($sameSiteRestriction === self::SAME_SITE_RESTRICTION_NONE) { - // if the 'secure' attribute is missing - if (!$secureOnly) { - \trigger_error('When the \'SameSite\' attribute is set to \'None\', the \'secure\' attribute should be set as well', \E_USER_WARNING); - } - $headerStr .= '; SameSite=None'; - } elseif ($sameSiteRestriction === self::SAME_SITE_RESTRICTION_LAX) { - $headerStr .= '; SameSite=Lax'; - } elseif ($sameSiteRestriction === self::SAME_SITE_RESTRICTION_STRICT) { - $headerStr .= '; SameSite=Strict'; - } - return $headerStr; - } - /** - * Parses the given cookie header and returns an equivalent cookie instance - * - * @param string $cookieHeader the cookie header to parse - * @return \Delight\Cookie\Cookie|null the cookie instance or `null` - */ - public static function parse($cookieHeader) - { - if (empty($cookieHeader)) { - return null; - } - if (\preg_match('/^' . self::HEADER_PREFIX . '(.*?)=(.*?)(?:; (.*?))?$/i', $cookieHeader, $matches)) { - $cookie = new self($matches[1]); - $cookie->setPath(null); - $cookie->setHttpOnly(\false); - $cookie->setValue(\urldecode($matches[2])); - $cookie->setSameSiteRestriction(null); - if (\count($matches) >= 4) { - $attributes = \explode('; ', $matches[3]); - foreach ($attributes as $attribute) { - if (\strcasecmp($attribute, 'HttpOnly') === 0) { - $cookie->setHttpOnly(\true); - } elseif (\strcasecmp($attribute, 'Secure') === 0) { - $cookie->setSecureOnly(\true); - } elseif (\stripos($attribute, 'Expires=') === 0) { - $cookie->setExpiryTime((int) \strtotime(\substr($attribute, 8))); - } elseif (\stripos($attribute, 'Domain=') === 0) { - $cookie->setDomain(\substr($attribute, 7)); - } elseif (\stripos($attribute, 'Path=') === 0) { - $cookie->setPath(\substr($attribute, 5)); - } elseif (\stripos($attribute, 'SameSite=') === 0) { - $cookie->setSameSiteRestriction(\substr($attribute, 9)); - } - } - } - return $cookie; - } else { - return null; - } - } - /** - * Checks whether a cookie with the specified name exists - * - * @param string $name the name of the cookie to check - * @return bool whether there is a cookie with the specified name - */ - public static function exists($name) - { - return isset($_COOKIE[$name]); - } - /** - * Returns the value from the requested cookie or, if not found, the specified default value - * - * @param string $name the name of the cookie to retrieve the value from - * @param mixed $defaultValue the default value to return if the requested cookie cannot be found - * @return mixed the value from the requested cookie or the default value - */ - public static function get($name, $defaultValue = null) - { - if (isset($_COOKIE[$name])) { - return $_COOKIE[$name]; - } else { - return $defaultValue; - } - } - private static function isNameValid($name) - { - $name = (string) $name; - // The name of a cookie must not be empty on PHP 7+ (https://bugs.php.net/bug.php?id=69523). - if ($name !== '' || \PHP_VERSION_ID < 70000) { - if (!\preg_match('/[=,; \\t\\r\\n\\013\\014]/', $name)) { - return \true; - } - } - return \false; - } - private static function isExpiryTimeValid($expiryTime) - { - return \is_numeric($expiryTime) || \is_null($expiryTime) || \is_bool($expiryTime); - } - private static function calculateMaxAge($expiryTime) - { - if ($expiryTime === 0) { - return 0; - } else { - $maxAge = $expiryTime - \time(); - // The value of the `Max-Age` property must not be negative on PHP 7.0.19+ (< 7.1) and - // PHP 7.1.5+ (https://bugs.php.net/bug.php?id=72071). - if (\PHP_VERSION_ID >= 70019 && \PHP_VERSION_ID < 70100 || \PHP_VERSION_ID >= 70105) { - if ($maxAge < 0) { - $maxAge = 0; - } - } - return $maxAge; - } - } - private static function formatExpiryTime($expiryTime, $forceShow = \false) - { - if ($expiryTime > 0 || $forceShow) { - if ($forceShow) { - $expiryTime = 1; - } - return \gmdate('D, d-M-Y H:i:s T', $expiryTime); - } else { - return null; - } - } - private static function formatMaxAge($expiryTime, $forceShow = \false) - { - if ($expiryTime > 0 || $forceShow) { - return (string) self::calculateMaxAge($expiryTime); - } else { - return null; - } - } - private static function normalizeDomain($domain = null) - { - // make sure that the domain is a string - $domain = (string) $domain; - // if the cookie should be valid for the current host only - if ($domain === '') { - // no need for further normalization - return null; - } - // if the provided domain is actually an IP address - if (\filter_var($domain, \FILTER_VALIDATE_IP) !== \false) { - // let the cookie be valid for the current host - return null; - } - // for local hostnames (which either have no dot at all or a leading dot only) - if (\strpos($domain, '.') === \false || \strrpos($domain, '.') === 0) { - // let the cookie be valid for the current host while ensuring maximum compatibility - return null; - } - // unless the domain already starts with a dot - if ($domain[0] !== '.') { - // prepend a dot for maximum compatibility (e.g. with RFC 2109) - $domain = '.' . $domain; - } - // return the normalized domain - return $domain; - } - private static function addHttpHeader($header) - { - if (!\headers_sent()) { - if (!empty($header)) { - \header($header, \false); - return \true; - } - } - return \false; - } -} diff --git a/dependencies/delight-im/cookie/src/Session.php b/dependencies/delight-im/cookie/src/Session.php deleted file mode 100644 index 555e859..0000000 --- a/dependencies/delight-im/cookie/src/Session.php +++ /dev/null @@ -1,158 +0,0 @@ -setSameSiteRestriction($sameSiteRestriction); - if ($parsedCookie->getSameSiteRestriction() === Cookie::SAME_SITE_RESTRICTION_NONE && !$parsedCookie->isSecureOnly()) { - \trigger_error('You may have to enable the \'session.cookie_secure\' directive in the configuration in \'php.ini\' or via the \'ini_set\' function', \E_USER_WARNING); - } - // save the cookie - $parsedCookie->save(); - } - } - } -} diff --git a/dependencies/delight-im/http/src/ResponseHeader.php b/dependencies/delight-im/http/src/ResponseHeader.php deleted file mode 100644 index 03e051f..0000000 --- a/dependencies/delight-im/http/src/ResponseHeader.php +++ /dev/null @@ -1,147 +0,0 @@ -|null */ - private static $type; - /** @var LoggerInterface|null */ - private static $logger; - /** @var array */ - private static $ignoredPackages = []; - /** @var array */ - private static $triggeredDeprecations = []; - /** @var array */ - private static $ignoredLinks = []; - /** @var bool */ - private static $deduplication = \true; - /** - * Trigger a deprecation for the given package and identfier. - * - * The link should point to a Github issue or Wiki entry detailing the - * deprecation. It is additionally used to de-duplicate the trigger of the - * same deprecation during a request. - * - * @param float|int|string $args - */ - public static function trigger(string $package, string $link, string $message, ...$args) : void - { - $type = self::$type ?? self::getTypeFromEnv(); - if ($type === self::TYPE_NONE) { - return; - } - if (isset(self::$ignoredLinks[$link])) { - return; - } - if (array_key_exists($link, self::$triggeredDeprecations)) { - self::$triggeredDeprecations[$link]++; - } else { - self::$triggeredDeprecations[$link] = 1; - } - if (self::$deduplication === \true && self::$triggeredDeprecations[$link] > 1) { - return; - } - if (isset(self::$ignoredPackages[$package])) { - return; - } - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - $message = sprintf($message, ...$args); - self::delegateTriggerToBackend($message, $backtrace, $link, $package); - } - /** - * Trigger a deprecation for the given package and identifier when called from outside. - * - * "Outside" means we assume that $package is currently installed as a - * dependency and the caller is not a file in that package. When $package - * is installed as a root package then deprecations triggered from the - * tests folder are also considered "outside". - * - * This deprecation method assumes that you are using Composer to install - * the dependency and are using the default /vendor/ folder and not a - * Composer plugin to change the install location. The assumption is also - * that $package is the exact composer packge name. - * - * Compared to {@link trigger()} this method causes some overhead when - * deprecation tracking is enabled even during deduplication, because it - * needs to call {@link debug_backtrace()} - * - * @param float|int|string $args - */ - public static function triggerIfCalledFromOutside(string $package, string $link, string $message, ...$args) : void - { - $type = self::$type ?? self::getTypeFromEnv(); - if ($type === self::TYPE_NONE) { - return; - } - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - // first check that the caller is not from a tests folder, in which case we always let deprecations pass - if (isset($backtrace[1]['file'], $backtrace[0]['file']) && strpos($backtrace[1]['file'], DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR) === \false) { - $path = DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $package) . DIRECTORY_SEPARATOR; - if (strpos($backtrace[0]['file'], $path) === \false) { - return; - } - if (strpos($backtrace[1]['file'], $path) !== \false) { - return; - } - } - if (isset(self::$ignoredLinks[$link])) { - return; - } - if (array_key_exists($link, self::$triggeredDeprecations)) { - self::$triggeredDeprecations[$link]++; - } else { - self::$triggeredDeprecations[$link] = 1; - } - if (self::$deduplication === \true && self::$triggeredDeprecations[$link] > 1) { - return; - } - if (isset(self::$ignoredPackages[$package])) { - return; - } - $message = sprintf($message, ...$args); - self::delegateTriggerToBackend($message, $backtrace, $link, $package); - } - /** - * @param list $backtrace - */ - private static function delegateTriggerToBackend(string $message, array $backtrace, string $link, string $package) : void - { - $type = self::$type ?? self::getTypeFromEnv(); - if (($type & self::TYPE_PSR_LOGGER) > 0) { - $context = ['file' => $backtrace[0]['file'] ?? null, 'line' => $backtrace[0]['line'] ?? null, 'package' => $package, 'link' => $link]; - assert(self::$logger !== null); - self::$logger->notice($message, $context); - } - if (!(($type & self::TYPE_TRIGGER_ERROR) > 0)) { - return; - } - $message .= sprintf(' (%s:%d called by %s:%d, %s, package %s)', self::basename($backtrace[0]['file'] ?? 'native code'), $backtrace[0]['line'] ?? 0, self::basename($backtrace[1]['file'] ?? 'native code'), $backtrace[1]['line'] ?? 0, $link, $package); - @trigger_error($message, E_USER_DEPRECATED); - } - /** - * A non-local-aware version of PHPs basename function. - */ - private static function basename(string $filename) : string - { - $pos = strrpos($filename, DIRECTORY_SEPARATOR); - if ($pos === \false) { - return $filename; - } - return substr($filename, $pos + 1); - } - public static function enableTrackingDeprecations() : void - { - self::$type = self::$type ?? 0; - self::$type |= self::TYPE_TRACK_DEPRECATIONS; - } - public static function enableWithTriggerError() : void - { - self::$type = self::$type ?? 0; - self::$type |= self::TYPE_TRIGGER_ERROR; - } - public static function enableWithPsrLogger(LoggerInterface $logger) : void - { - self::$type = self::$type ?? 0; - self::$type |= self::TYPE_PSR_LOGGER; - self::$logger = $logger; - } - public static function withoutDeduplication() : void - { - self::$deduplication = \false; - } - public static function disable() : void - { - self::$type = self::TYPE_NONE; - self::$logger = null; - self::$deduplication = \true; - self::$ignoredLinks = []; - foreach (self::$triggeredDeprecations as $link => $count) { - self::$triggeredDeprecations[$link] = 0; - } - } - public static function ignorePackage(string $packageName) : void - { - self::$ignoredPackages[$packageName] = \true; - } - public static function ignoreDeprecations(string ...$links) : void - { - foreach ($links as $link) { - self::$ignoredLinks[$link] = \true; - } - } - public static function getUniqueTriggeredDeprecationsCount() : int - { - return array_reduce(self::$triggeredDeprecations, static function (int $carry, int $count) { - return $carry + $count; - }, 0); - } - /** - * Returns each triggered deprecation link identifier and the amount of occurrences. - * - * @return array - */ - public static function getTriggeredDeprecations() : array - { - return self::$triggeredDeprecations; - } - /** - * @return int-mask-of - */ - private static function getTypeFromEnv() : int - { - switch ($_SERVER['DOCTRINE_DEPRECATIONS'] ?? $_ENV['DOCTRINE_DEPRECATIONS'] ?? null) { - case 'trigger': - self::$type = self::TYPE_TRIGGER_ERROR; - break; - case 'track': - self::$type = self::TYPE_TRACK_DEPRECATIONS; - break; - default: - self::$type = self::TYPE_NONE; - break; - } - return self::$type; - } -} diff --git a/dependencies/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php b/dependencies/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php deleted file mode 100644 index fd1b50e..0000000 --- a/dependencies/doctrine/deprecations/lib/Doctrine/Deprecations/PHPUnit/VerifyDeprecations.php +++ /dev/null @@ -1,43 +0,0 @@ - */ - private $doctrineDeprecationsExpectations = []; - /** @var array */ - private $doctrineNoDeprecationsExpectations = []; - public function expectDeprecationWithIdentifier(string $identifier) : void - { - $this->doctrineDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; - } - public function expectNoDeprecationWithIdentifier(string $identifier) : void - { - $this->doctrineNoDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; - } - /** - * @before - */ - public function enableDeprecationTracking() : void - { - Deprecation::enableTrackingDeprecations(); - } - /** - * @after - */ - public function verifyDeprecationsAreTriggered() : void - { - foreach ($this->doctrineDeprecationsExpectations as $identifier => $expectation) { - $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; - $this->assertTrue($actualCount > $expectation, sprintf("Expected deprecation with identifier '%s' was not triggered by code executed in test.", $identifier)); - } - foreach ($this->doctrineNoDeprecationsExpectations as $identifier => $expectation) { - $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; - $this->assertTrue($actualCount === $expectation, sprintf("Expected deprecation with identifier '%s' was triggered by code executed in test, but expected not to.", $identifier)); - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/BodySummarizer.php b/dependencies/guzzlehttp/guzzle/src/BodySummarizer.php deleted file mode 100644 index 55caa50..0000000 --- a/dependencies/guzzlehttp/guzzle/src/BodySummarizer.php +++ /dev/null @@ -1,23 +0,0 @@ -truncateAt = $truncateAt; - } - /** - * Returns a summarized message body. - */ - public function summarize(MessageInterface $message) : ?string - { - return $this->truncateAt === null ? \WP_Ultimo\Dependencies\GuzzleHttp\Psr7\Message::bodySummary($message) : \WP_Ultimo\Dependencies\GuzzleHttp\Psr7\Message::bodySummary($message, $this->truncateAt); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/BodySummarizerInterface.php b/dependencies/guzzlehttp/guzzle/src/BodySummarizerInterface.php deleted file mode 100644 index e909a8c..0000000 --- a/dependencies/guzzlehttp/guzzle/src/BodySummarizerInterface.php +++ /dev/null @@ -1,12 +0,0 @@ - 'http://www.foo.com/1.0/', - * 'timeout' => 0, - * 'allow_redirects' => false, - * 'proxy' => '192.168.16.1:10' - * ]); - * - * Client configuration settings include the following options: - * - * - handler: (callable) Function that transfers HTTP requests over the - * wire. The function is called with a Psr7\Http\Message\RequestInterface - * and array of transfer options, and must return a - * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a - * Psr7\Http\Message\ResponseInterface on success. - * If no handler is provided, a default handler will be created - * that enables all of the request options below by attaching all of the - * default middleware to the handler. - * - base_uri: (string|UriInterface) Base URI of the client that is merged - * into relative URIs. Can be a string or instance of UriInterface. - * - **: any request option - * - * @param array $config Client configuration settings. - * - * @see \GuzzleHttp\RequestOptions for a list of available request options. - */ - public function __construct(array $config = []) - { - if (!isset($config['handler'])) { - $config['handler'] = HandlerStack::create(); - } elseif (!\is_callable($config['handler'])) { - throw new InvalidArgumentException('handler must be a callable'); - } - // Convert the base_uri to a UriInterface - if (isset($config['base_uri'])) { - $config['base_uri'] = Psr7\Utils::uriFor($config['base_uri']); - } - $this->configureDefaults($config); - } - /** - * @param string $method - * @param array $args - * - * @return PromiseInterface|ResponseInterface - * - * @deprecated Client::__call will be removed in guzzlehttp/guzzle:8.0. - */ - public function __call($method, $args) - { - if (\count($args) < 1) { - throw new InvalidArgumentException('Magic request methods require a URI and optional options array'); - } - $uri = $args[0]; - $opts = $args[1] ?? []; - return \substr($method, -5) === 'Async' ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); - } - /** - * Asynchronously send an HTTP request. - * - * @param array $options Request options to apply to the given - * request and to the transfer. See \GuzzleHttp\RequestOptions. - */ - public function sendAsync(RequestInterface $request, array $options = []) : PromiseInterface - { - // Merge the base URI into the request URI if needed. - $options = $this->prepareDefaults($options); - return $this->transfer($request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options); - } - /** - * Send an HTTP request. - * - * @param array $options Request options to apply to the given - * request and to the transfer. See \GuzzleHttp\RequestOptions. - * - * @throws GuzzleException - */ - public function send(RequestInterface $request, array $options = []) : ResponseInterface - { - $options[RequestOptions::SYNCHRONOUS] = \true; - return $this->sendAsync($request, $options)->wait(); - } - /** - * The HttpClient PSR (PSR-18) specify this method. - * - * {@inheritDoc} - */ - public function sendRequest(RequestInterface $request) : ResponseInterface - { - $options[RequestOptions::SYNCHRONOUS] = \true; - $options[RequestOptions::ALLOW_REDIRECTS] = \false; - $options[RequestOptions::HTTP_ERRORS] = \false; - return $this->sendAsync($request, $options)->wait(); - } - /** - * Create and send an asynchronous HTTP request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string $method HTTP method - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. - */ - public function requestAsync(string $method, $uri = '', array $options = []) : PromiseInterface - { - $options = $this->prepareDefaults($options); - // Remove request modifying parameter because it can be done up-front. - $headers = $options['headers'] ?? []; - $body = $options['body'] ?? null; - $version = $options['version'] ?? '1.1'; - // Merge the URI into the base URI. - $uri = $this->buildUri(Psr7\Utils::uriFor($uri), $options); - if (\is_array($body)) { - throw $this->invalidBody(); - } - $request = new Psr7\Request($method, $uri, $headers, $body, $version); - // Remove the option so that they are not doubly-applied. - unset($options['headers'], $options['body'], $options['version']); - return $this->transfer($request, $options); - } - /** - * Create and send an HTTP request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. - * - * @param string $method HTTP method. - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. - * - * @throws GuzzleException - */ - public function request(string $method, $uri = '', array $options = []) : ResponseInterface - { - $options[RequestOptions::SYNCHRONOUS] = \true; - return $this->requestAsync($method, $uri, $options)->wait(); - } - /** - * Get a client configuration option. - * - * These options include default request options of the client, a "handler" - * (if utilized by the concrete client), and a "base_uri" if utilized by - * the concrete client. - * - * @param string|null $option The config option to retrieve. - * - * @return mixed - * - * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0. - */ - public function getConfig(string $option = null) - { - return $option === null ? $this->config : $this->config[$option] ?? null; - } - private function buildUri(UriInterface $uri, array $config) : UriInterface - { - if (isset($config['base_uri'])) { - $uri = Psr7\UriResolver::resolve(Psr7\Utils::uriFor($config['base_uri']), $uri); - } - if (isset($config['idn_conversion']) && $config['idn_conversion'] !== \false) { - $idnOptions = $config['idn_conversion'] === \true ? \IDNA_DEFAULT : $config['idn_conversion']; - $uri = Utils::idnUriConvert($uri, $idnOptions); - } - return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; - } - /** - * Configures the default options for a client. - */ - private function configureDefaults(array $config) : void - { - $defaults = ['allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => \true, 'decode_content' => \true, 'verify' => \true, 'cookies' => \false, 'idn_conversion' => \false]; - // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. - // We can only trust the HTTP_PROXY environment variable in a CLI - // process due to the fact that PHP has no reliable mechanism to - // get environment variables that start with "HTTP_". - if (\PHP_SAPI === 'cli' && ($proxy = Utils::getenv('HTTP_PROXY'))) { - $defaults['proxy']['http'] = $proxy; - } - if ($proxy = Utils::getenv('HTTPS_PROXY')) { - $defaults['proxy']['https'] = $proxy; - } - if ($noProxy = Utils::getenv('NO_PROXY')) { - $cleanedNoProxy = \str_replace(' ', '', $noProxy); - $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); - } - $this->config = $config + $defaults; - if (!empty($config['cookies']) && $config['cookies'] === \true) { - $this->config['cookies'] = new CookieJar(); - } - // Add the default user-agent header. - if (!isset($this->config['headers'])) { - $this->config['headers'] = ['User-Agent' => Utils::defaultUserAgent()]; - } else { - // Add the User-Agent header if one was not already set. - foreach (\array_keys($this->config['headers']) as $name) { - if (\strtolower($name) === 'user-agent') { - return; - } - } - $this->config['headers']['User-Agent'] = Utils::defaultUserAgent(); - } - } - /** - * Merges default options into the array. - * - * @param array $options Options to modify by reference - */ - private function prepareDefaults(array $options) : array - { - $defaults = $this->config; - if (!empty($defaults['headers'])) { - // Default headers are only added if they are not present. - $defaults['_conditional'] = $defaults['headers']; - unset($defaults['headers']); - } - // Special handling for headers is required as they are added as - // conditional headers and as headers passed to a request ctor. - if (\array_key_exists('headers', $options)) { - // Allows default headers to be unset. - if ($options['headers'] === null) { - $defaults['_conditional'] = []; - unset($options['headers']); - } elseif (!\is_array($options['headers'])) { - throw new InvalidArgumentException('headers must be an array'); - } - } - // Shallow merge defaults underneath options. - $result = $options + $defaults; - // Remove null values. - foreach ($result as $k => $v) { - if ($v === null) { - unset($result[$k]); - } - } - return $result; - } - /** - * Transfers the given request and applies request options. - * - * The URI of the request is not modified and the request options are used - * as-is without merging in default options. - * - * @param array $options See \GuzzleHttp\RequestOptions. - */ - private function transfer(RequestInterface $request, array $options) : PromiseInterface - { - $request = $this->applyOptions($request, $options); - /** @var HandlerStack $handler */ - $handler = $options['handler']; - try { - return P\Create::promiseFor($handler($request, $options)); - } catch (\Exception $e) { - return P\Create::rejectionFor($e); - } - } - /** - * Applies the array of request options to a request. - */ - private function applyOptions(RequestInterface $request, array &$options) : RequestInterface - { - $modify = ['set_headers' => []]; - if (isset($options['headers'])) { - if (\array_keys($options['headers']) === \range(0, \count($options['headers']) - 1)) { - throw new InvalidArgumentException('The headers array must have header name as keys.'); - } - $modify['set_headers'] = $options['headers']; - unset($options['headers']); - } - if (isset($options['form_params'])) { - if (isset($options['multipart'])) { - throw new InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.'); - } - $options['body'] = \http_build_query($options['form_params'], '', '&'); - unset($options['form_params']); - // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); - $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; - } - if (isset($options['multipart'])) { - $options['body'] = new Psr7\MultipartStream($options['multipart']); - unset($options['multipart']); - } - if (isset($options['json'])) { - $options['body'] = Utils::jsonEncode($options['json']); - unset($options['json']); - // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); - $options['_conditional']['Content-Type'] = 'application/json'; - } - if (!empty($options['decode_content']) && $options['decode_content'] !== \true) { - // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']); - $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; - } - if (isset($options['body'])) { - if (\is_array($options['body'])) { - throw $this->invalidBody(); - } - $modify['body'] = Psr7\Utils::streamFor($options['body']); - unset($options['body']); - } - if (!empty($options['auth']) && \is_array($options['auth'])) { - $value = $options['auth']; - $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; - switch ($type) { - case 'basic': - // Ensure that we don't have the header in different case and set the new value. - $modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']); - $modify['set_headers']['Authorization'] = 'Basic ' . \base64_encode("{$value[0]}:{$value[1]}"); - break; - case 'digest': - // @todo: Do not rely on curl - $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; - $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; - break; - case 'ntlm': - $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; - $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; - break; - } - } - if (isset($options['query'])) { - $value = $options['query']; - if (\is_array($value)) { - $value = \http_build_query($value, '', '&', \PHP_QUERY_RFC3986); - } - if (!\is_string($value)) { - throw new InvalidArgumentException('query must be a string or array'); - } - $modify['query'] = $value; - unset($options['query']); - } - // Ensure that sink is not an invalid value. - if (isset($options['sink'])) { - // TODO: Add more sink validation? - if (\is_bool($options['sink'])) { - throw new InvalidArgumentException('sink must not be a boolean'); - } - } - if (isset($options['version'])) { - $modify['version'] = $options['version']; - } - $request = Psr7\Utils::modifyRequest($request, $modify); - if ($request->getBody() instanceof Psr7\MultipartStream) { - // Use a multipart/form-data POST if a Content-Type is not set. - // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); - $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary(); - } - // Merge in conditional headers if they are not present. - if (isset($options['_conditional'])) { - // Build up the changes so it's in a single clone of the message. - $modify = []; - foreach ($options['_conditional'] as $k => $v) { - if (!$request->hasHeader($k)) { - $modify['set_headers'][$k] = $v; - } - } - $request = Psr7\Utils::modifyRequest($request, $modify); - // Don't pass this internal value along to middleware/handlers. - unset($options['_conditional']); - } - return $request; - } - /** - * Return an InvalidArgumentException with pre-set message. - */ - private function invalidBody() : InvalidArgumentException - { - return new InvalidArgumentException('Passing in the "body" request ' . 'option as an array to send a request is not supported. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.'); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/ClientInterface.php b/dependencies/guzzlehttp/guzzle/src/ClientInterface.php deleted file mode 100644 index d95a184..0000000 --- a/dependencies/guzzlehttp/guzzle/src/ClientInterface.php +++ /dev/null @@ -1,78 +0,0 @@ -request('GET', $uri, $options); - } - /** - * Create and send an HTTP HEAD request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - * - * @throws GuzzleException - */ - public function head($uri, array $options = []) : ResponseInterface - { - return $this->request('HEAD', $uri, $options); - } - /** - * Create and send an HTTP PUT request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - * - * @throws GuzzleException - */ - public function put($uri, array $options = []) : ResponseInterface - { - return $this->request('PUT', $uri, $options); - } - /** - * Create and send an HTTP POST request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - * - * @throws GuzzleException - */ - public function post($uri, array $options = []) : ResponseInterface - { - return $this->request('POST', $uri, $options); - } - /** - * Create and send an HTTP PATCH request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - * - * @throws GuzzleException - */ - public function patch($uri, array $options = []) : ResponseInterface - { - return $this->request('PATCH', $uri, $options); - } - /** - * Create and send an HTTP DELETE request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - * - * @throws GuzzleException - */ - public function delete($uri, array $options = []) : ResponseInterface - { - return $this->request('DELETE', $uri, $options); - } - /** - * Create and send an asynchronous HTTP request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string $method HTTP method - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public abstract function requestAsync(string $method, $uri, array $options = []) : PromiseInterface; - /** - * Create and send an asynchronous HTTP GET request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public function getAsync($uri, array $options = []) : PromiseInterface - { - return $this->requestAsync('GET', $uri, $options); - } - /** - * Create and send an asynchronous HTTP HEAD request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public function headAsync($uri, array $options = []) : PromiseInterface - { - return $this->requestAsync('HEAD', $uri, $options); - } - /** - * Create and send an asynchronous HTTP PUT request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public function putAsync($uri, array $options = []) : PromiseInterface - { - return $this->requestAsync('PUT', $uri, $options); - } - /** - * Create and send an asynchronous HTTP POST request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public function postAsync($uri, array $options = []) : PromiseInterface - { - return $this->requestAsync('POST', $uri, $options); - } - /** - * Create and send an asynchronous HTTP PATCH request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public function patchAsync($uri, array $options = []) : PromiseInterface - { - return $this->requestAsync('PATCH', $uri, $options); - } - /** - * Create and send an asynchronous HTTP DELETE request. - * - * Use an absolute path to override the base path of the client, or a - * relative path to append to the base path of the client. The URL can - * contain the query string as well. Use an array to provide a URL - * template and additional variables to use in the URL template expansion. - * - * @param string|UriInterface $uri URI object or string. - * @param array $options Request options to apply. - */ - public function deleteAsync($uri, array $options = []) : PromiseInterface - { - return $this->requestAsync('DELETE', $uri, $options); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/dependencies/guzzlehttp/guzzle/src/Cookie/CookieJar.php deleted file mode 100644 index fa6e145..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Cookie/CookieJar.php +++ /dev/null @@ -1,240 +0,0 @@ -strictMode = $strictMode; - foreach ($cookieArray as $cookie) { - if (!$cookie instanceof SetCookie) { - $cookie = new SetCookie($cookie); - } - $this->setCookie($cookie); - } - } - /** - * Create a new Cookie jar from an associative array and domain. - * - * @param array $cookies Cookies to create the jar from - * @param string $domain Domain to set the cookies to - */ - public static function fromArray(array $cookies, string $domain) : self - { - $cookieJar = new self(); - foreach ($cookies as $name => $value) { - $cookieJar->setCookie(new SetCookie(['Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => \true])); - } - return $cookieJar; - } - /** - * Evaluate if this cookie should be persisted to storage - * that survives between requests. - * - * @param SetCookie $cookie Being evaluated. - * @param bool $allowSessionCookies If we should persist session cookies - */ - public static function shouldPersist(SetCookie $cookie, bool $allowSessionCookies = \false) : bool - { - if ($cookie->getExpires() || $allowSessionCookies) { - if (!$cookie->getDiscard()) { - return \true; - } - } - return \false; - } - /** - * Finds and returns the cookie based on the name - * - * @param string $name cookie name to search for - * - * @return SetCookie|null cookie that was found or null if not found - */ - public function getCookieByName(string $name) : ?SetCookie - { - foreach ($this->cookies as $cookie) { - if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { - return $cookie; - } - } - return null; - } - public function toArray() : array - { - return \array_map(static function (SetCookie $cookie) : array { - return $cookie->toArray(); - }, $this->getIterator()->getArrayCopy()); - } - public function clear(string $domain = null, string $path = null, string $name = null) : void - { - if (!$domain) { - $this->cookies = []; - return; - } elseif (!$path) { - $this->cookies = \array_filter($this->cookies, static function (SetCookie $cookie) use($domain) : bool { - return !$cookie->matchesDomain($domain); - }); - } elseif (!$name) { - $this->cookies = \array_filter($this->cookies, static function (SetCookie $cookie) use($path, $domain) : bool { - return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); - }); - } else { - $this->cookies = \array_filter($this->cookies, static function (SetCookie $cookie) use($path, $domain, $name) { - return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); - }); - } - } - public function clearSessionCookies() : void - { - $this->cookies = \array_filter($this->cookies, static function (SetCookie $cookie) : bool { - return !$cookie->getDiscard() && $cookie->getExpires(); - }); - } - public function setCookie(SetCookie $cookie) : bool - { - // If the name string is empty (but not 0), ignore the set-cookie - // string entirely. - $name = $cookie->getName(); - if (!$name && $name !== '0') { - return \false; - } - // Only allow cookies with set and valid domain, name, value - $result = $cookie->validate(); - if ($result !== \true) { - if ($this->strictMode) { - throw new \RuntimeException('Invalid cookie: ' . $result); - } - $this->removeCookieIfEmpty($cookie); - return \false; - } - // Resolve conflicts with previously set cookies - foreach ($this->cookies as $i => $c) { - // Two cookies are identical, when their path, and domain are - // identical. - if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName()) { - continue; - } - // The previously set cookie is a discard cookie and this one is - // not so allow the new cookie to be set - if (!$cookie->getDiscard() && $c->getDiscard()) { - unset($this->cookies[$i]); - continue; - } - // If the new cookie's expiration is further into the future, then - // replace the old cookie - if ($cookie->getExpires() > $c->getExpires()) { - unset($this->cookies[$i]); - continue; - } - // If the value has changed, we better change it - if ($cookie->getValue() !== $c->getValue()) { - unset($this->cookies[$i]); - continue; - } - // The cookie exists, so no need to continue - return \false; - } - $this->cookies[] = $cookie; - return \true; - } - public function count() : int - { - return \count($this->cookies); - } - /** - * @return \ArrayIterator - */ - public function getIterator() : \ArrayIterator - { - return new \ArrayIterator(\array_values($this->cookies)); - } - public function extractCookies(RequestInterface $request, ResponseInterface $response) : void - { - if ($cookieHeader = $response->getHeader('Set-Cookie')) { - foreach ($cookieHeader as $cookie) { - $sc = SetCookie::fromString($cookie); - if (!$sc->getDomain()) { - $sc->setDomain($request->getUri()->getHost()); - } - if (0 !== \strpos($sc->getPath(), '/')) { - $sc->setPath($this->getCookiePathFromRequest($request)); - } - if (!$sc->matchesDomain($request->getUri()->getHost())) { - continue; - } - // Note: At this point `$sc->getDomain()` being a public suffix should - // be rejected, but we don't want to pull in the full PSL dependency. - $this->setCookie($sc); - } - } - } - /** - * Computes cookie path following RFC 6265 section 5.1.4 - * - * @see https://tools.ietf.org/html/rfc6265#section-5.1.4 - */ - private function getCookiePathFromRequest(RequestInterface $request) : string - { - $uriPath = $request->getUri()->getPath(); - if ('' === $uriPath) { - return '/'; - } - if (0 !== \strpos($uriPath, '/')) { - return '/'; - } - if ('/' === $uriPath) { - return '/'; - } - $lastSlashPos = \strrpos($uriPath, '/'); - if (0 === $lastSlashPos || \false === $lastSlashPos) { - return '/'; - } - return \substr($uriPath, 0, $lastSlashPos); - } - public function withCookieHeader(RequestInterface $request) : RequestInterface - { - $values = []; - $uri = $request->getUri(); - $scheme = $uri->getScheme(); - $host = $uri->getHost(); - $path = $uri->getPath() ?: '/'; - foreach ($this->cookies as $cookie) { - if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https')) { - $values[] = $cookie->getName() . '=' . $cookie->getValue(); - } - } - return $values ? $request->withHeader('Cookie', \implode('; ', $values)) : $request; - } - /** - * If a cookie already exists and the server asks to set it again with a - * null value, the cookie must be deleted. - */ - private function removeCookieIfEmpty(SetCookie $cookie) : void - { - $cookieValue = $cookie->getValue(); - if ($cookieValue === null || $cookieValue === '') { - $this->clear($cookie->getDomain(), $cookie->getPath(), $cookie->getName()); - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/dependencies/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php deleted file mode 100644 index c230901..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php +++ /dev/null @@ -1,74 +0,0 @@ - - */ -interface CookieJarInterface extends \Countable, \IteratorAggregate -{ - /** - * Create a request with added cookie headers. - * - * If no matching cookies are found in the cookie jar, then no Cookie - * header is added to the request and the same request is returned. - * - * @param RequestInterface $request Request object to modify. - * - * @return RequestInterface returns the modified request. - */ - public function withCookieHeader(RequestInterface $request) : RequestInterface; - /** - * Extract cookies from an HTTP response and store them in the CookieJar. - * - * @param RequestInterface $request Request that was sent - * @param ResponseInterface $response Response that was received - */ - public function extractCookies(RequestInterface $request, ResponseInterface $response) : void; - /** - * Sets a cookie in the cookie jar. - * - * @param SetCookie $cookie Cookie to set. - * - * @return bool Returns true on success or false on failure - */ - public function setCookie(SetCookie $cookie) : bool; - /** - * Remove cookies currently held in the cookie jar. - * - * Invoking this method without arguments will empty the whole cookie jar. - * If given a $domain argument only cookies belonging to that domain will - * be removed. If given a $domain and $path argument, cookies belonging to - * the specified path within that domain are removed. If given all three - * arguments, then the cookie with the specified name, path and domain is - * removed. - * - * @param string|null $domain Clears cookies matching a domain - * @param string|null $path Clears cookies matching a domain and path - * @param string|null $name Clears cookies matching a domain, path, and name - */ - public function clear(string $domain = null, string $path = null, string $name = null) : void; - /** - * Discard all sessions cookies. - * - * Removes cookies that don't have an expire field or a have a discard - * field set to true. To be called when the user agent shuts down according - * to RFC 2965. - */ - public function clearSessionCookies() : void; - /** - * Converts the cookie jar to an array. - */ - public function toArray() : array; -} diff --git a/dependencies/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php b/dependencies/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php deleted file mode 100644 index 5836328..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php +++ /dev/null @@ -1,92 +0,0 @@ -filename = $cookieFile; - $this->storeSessionCookies = $storeSessionCookies; - if (\file_exists($cookieFile)) { - $this->load($cookieFile); - } - } - /** - * Saves the file when shutting down - */ - public function __destruct() - { - $this->save($this->filename); - } - /** - * Saves the cookies to a file. - * - * @param string $filename File to save - * - * @throws \RuntimeException if the file cannot be found or created - */ - public function save(string $filename) : void - { - $json = []; - /** @var SetCookie $cookie */ - foreach ($this as $cookie) { - if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { - $json[] = $cookie->toArray(); - } - } - $jsonStr = Utils::jsonEncode($json); - if (\false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { - throw new \RuntimeException("Unable to save file {$filename}"); - } - } - /** - * Load cookies from a JSON formatted file. - * - * Old cookies are kept unless overwritten by newly loaded ones. - * - * @param string $filename Cookie file to load. - * - * @throws \RuntimeException if the file cannot be loaded. - */ - public function load(string $filename) : void - { - $json = \file_get_contents($filename); - if (\false === $json) { - throw new \RuntimeException("Unable to load file {$filename}"); - } - if ($json === '') { - return; - } - $data = Utils::jsonDecode($json, \true); - if (\is_array($data)) { - foreach ($data as $cookie) { - $this->setCookie(new SetCookie($cookie)); - } - } elseif (\is_scalar($data) && !empty($data)) { - throw new \RuntimeException("Invalid cookie file: {$filename}"); - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/dependencies/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php deleted file mode 100644 index ad7a0eb..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php +++ /dev/null @@ -1,71 +0,0 @@ -sessionKey = $sessionKey; - $this->storeSessionCookies = $storeSessionCookies; - $this->load(); - } - /** - * Saves cookies to session when shutting down - */ - public function __destruct() - { - $this->save(); - } - /** - * Save cookies to the client session - */ - public function save() : void - { - $json = []; - /** @var SetCookie $cookie */ - foreach ($this as $cookie) { - if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { - $json[] = $cookie->toArray(); - } - } - $_SESSION[$this->sessionKey] = \json_encode($json); - } - /** - * Load the contents of the client session into the data array - */ - protected function load() : void - { - if (!isset($_SESSION[$this->sessionKey])) { - return; - } - $data = \json_decode($_SESSION[$this->sessionKey], \true); - if (\is_array($data)) { - foreach ($data as $cookie) { - $this->setCookie(new SetCookie($cookie)); - } - } elseif (\strlen($data)) { - throw new \RuntimeException('Invalid cookie data'); - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/dependencies/guzzlehttp/guzzle/src/Cookie/SetCookie.php deleted file mode 100644 index 3303a26..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Cookie/SetCookie.php +++ /dev/null @@ -1,407 +0,0 @@ - null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => \false, 'Discard' => \false, 'HttpOnly' => \false]; - /** - * @var array Cookie data - */ - private $data; - /** - * Create a new SetCookie object from a string. - * - * @param string $cookie Set-Cookie header string - */ - public static function fromString(string $cookie) : self - { - // Create the default return array - $data = self::$defaults; - // Explode the cookie string using a series of semicolons - $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); - // The name of the cookie (first kvp) must exist and include an equal sign. - if (!isset($pieces[0]) || \strpos($pieces[0], '=') === \false) { - return new self($data); - } - // Add the cookie pieces into the parsed data array - foreach ($pieces as $part) { - $cookieParts = \explode('=', $part, 2); - $key = \trim($cookieParts[0]); - $value = isset($cookieParts[1]) ? \trim($cookieParts[1], " \n\r\t\x00\v") : \true; - // Only check for non-cookies when cookies have been found - if (!isset($data['Name'])) { - $data['Name'] = $key; - $data['Value'] = $value; - } else { - foreach (\array_keys(self::$defaults) as $search) { - if (!\strcasecmp($search, $key)) { - if ($search === 'Max-Age') { - if (\is_numeric($value)) { - $data[$search] = (int) $value; - } - } else { - $data[$search] = $value; - } - continue 2; - } - } - $data[$key] = $value; - } - } - return new self($data); - } - /** - * @param array $data Array of cookie data provided by a Cookie parser - */ - public function __construct(array $data = []) - { - $this->data = self::$defaults; - if (isset($data['Name'])) { - $this->setName($data['Name']); - } - if (isset($data['Value'])) { - $this->setValue($data['Value']); - } - if (isset($data['Domain'])) { - $this->setDomain($data['Domain']); - } - if (isset($data['Path'])) { - $this->setPath($data['Path']); - } - if (isset($data['Max-Age'])) { - $this->setMaxAge($data['Max-Age']); - } - if (isset($data['Expires'])) { - $this->setExpires($data['Expires']); - } - if (isset($data['Secure'])) { - $this->setSecure($data['Secure']); - } - if (isset($data['Discard'])) { - $this->setDiscard($data['Discard']); - } - if (isset($data['HttpOnly'])) { - $this->setHttpOnly($data['HttpOnly']); - } - // Set the remaining values that don't have extra validation logic - foreach (\array_diff(\array_keys($data), \array_keys(self::$defaults)) as $key) { - $this->data[$key] = $data[$key]; - } - // Extract the Expires value and turn it into a UNIX timestamp if needed - if (!$this->getExpires() && $this->getMaxAge()) { - // Calculate the Expires date - $this->setExpires(\time() + $this->getMaxAge()); - } elseif (null !== ($expires = $this->getExpires()) && !\is_numeric($expires)) { - $this->setExpires($expires); - } - } - public function __toString() - { - $str = $this->data['Name'] . '=' . ($this->data['Value'] ?? '') . '; '; - foreach ($this->data as $k => $v) { - if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== \false) { - if ($k === 'Expires') { - $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; '; - } else { - $str .= ($v === \true ? $k : "{$k}={$v}") . '; '; - } - } - } - return \rtrim($str, '; '); - } - public function toArray() : array - { - return $this->data; - } - /** - * Get the cookie name. - * - * @return string - */ - public function getName() - { - return $this->data['Name']; - } - /** - * Set the cookie name. - * - * @param string $name Cookie name - */ - public function setName($name) : void - { - if (!\is_string($name)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Name'] = (string) $name; - } - /** - * Get the cookie value. - * - * @return string|null - */ - public function getValue() - { - return $this->data['Value']; - } - /** - * Set the cookie value. - * - * @param string $value Cookie value - */ - public function setValue($value) : void - { - if (!\is_string($value)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Value'] = (string) $value; - } - /** - * Get the domain. - * - * @return string|null - */ - public function getDomain() - { - return $this->data['Domain']; - } - /** - * Set the domain of the cookie. - * - * @param string|null $domain - */ - public function setDomain($domain) : void - { - if (!\is_string($domain) && null !== $domain) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Domain'] = null === $domain ? null : (string) $domain; - } - /** - * Get the path. - * - * @return string - */ - public function getPath() - { - return $this->data['Path']; - } - /** - * Set the path of the cookie. - * - * @param string $path Path of the cookie - */ - public function setPath($path) : void - { - if (!\is_string($path)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Path'] = (string) $path; - } - /** - * Maximum lifetime of the cookie in seconds. - * - * @return int|null - */ - public function getMaxAge() - { - return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age']; - } - /** - * Set the max-age of the cookie. - * - * @param int|null $maxAge Max age of the cookie in seconds - */ - public function setMaxAge($maxAge) : void - { - if (!\is_int($maxAge) && null !== $maxAge) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge; - } - /** - * The UNIX timestamp when the cookie Expires. - * - * @return string|int|null - */ - public function getExpires() - { - return $this->data['Expires']; - } - /** - * Set the unix timestamp for which the cookie will expire. - * - * @param int|string|null $timestamp Unix timestamp or any English textual datetime description. - */ - public function setExpires($timestamp) : void - { - if (!\is_int($timestamp) && !\is_string($timestamp) && null !== $timestamp) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Expires'] = null === $timestamp ? null : (\is_numeric($timestamp) ? (int) $timestamp : \strtotime((string) $timestamp)); - } - /** - * Get whether or not this is a secure cookie. - * - * @return bool - */ - public function getSecure() - { - return $this->data['Secure']; - } - /** - * Set whether or not the cookie is secure. - * - * @param bool $secure Set to true or false if secure - */ - public function setSecure($secure) : void - { - if (!\is_bool($secure)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Secure'] = (bool) $secure; - } - /** - * Get whether or not this is a session cookie. - * - * @return bool|null - */ - public function getDiscard() - { - return $this->data['Discard']; - } - /** - * Set whether or not this is a session cookie. - * - * @param bool $discard Set to true or false if this is a session cookie - */ - public function setDiscard($discard) : void - { - if (!\is_bool($discard)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['Discard'] = (bool) $discard; - } - /** - * Get whether or not this is an HTTP only cookie. - * - * @return bool - */ - public function getHttpOnly() - { - return $this->data['HttpOnly']; - } - /** - * Set whether or not this is an HTTP only cookie. - * - * @param bool $httpOnly Set to true or false if this is HTTP only - */ - public function setHttpOnly($httpOnly) : void - { - if (!\is_bool($httpOnly)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->data['HttpOnly'] = (bool) $httpOnly; - } - /** - * Check if the cookie matches a path value. - * - * A request-path path-matches a given cookie-path if at least one of - * the following conditions holds: - * - * - The cookie-path and the request-path are identical. - * - The cookie-path is a prefix of the request-path, and the last - * character of the cookie-path is %x2F ("/"). - * - The cookie-path is a prefix of the request-path, and the first - * character of the request-path that is not included in the cookie- - * path is a %x2F ("/") character. - * - * @param string $requestPath Path to check against - */ - public function matchesPath(string $requestPath) : bool - { - $cookiePath = $this->getPath(); - // Match on exact matches or when path is the default empty "/" - if ($cookiePath === '/' || $cookiePath == $requestPath) { - return \true; - } - // Ensure that the cookie-path is a prefix of the request path. - if (0 !== \strpos($requestPath, $cookiePath)) { - return \false; - } - // Match if the last character of the cookie-path is "/" - if (\substr($cookiePath, -1, 1) === '/') { - return \true; - } - // Match if the first character not included in cookie path is "/" - return \substr($requestPath, \strlen($cookiePath), 1) === '/'; - } - /** - * Check if the cookie matches a domain value. - * - * @param string $domain Domain to check against - */ - public function matchesDomain(string $domain) : bool - { - $cookieDomain = $this->getDomain(); - if (null === $cookieDomain) { - return \true; - } - // Remove the leading '.' as per spec in RFC 6265. - // https://tools.ietf.org/html/rfc6265#section-5.2.3 - $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); - $domain = \strtolower($domain); - // Domain not set or exact match. - if ('' === $cookieDomain || $domain === $cookieDomain) { - return \true; - } - // Matching the subdomain according to RFC 6265. - // https://tools.ietf.org/html/rfc6265#section-5.1.3 - if (\filter_var($domain, \FILTER_VALIDATE_IP)) { - return \false; - } - return (bool) \preg_match('/\\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); - } - /** - * Check if the cookie is expired. - */ - public function isExpired() : bool - { - return $this->getExpires() !== null && \time() > $this->getExpires(); - } - /** - * Check if the cookie is valid according to RFC 6265. - * - * @return bool|string Returns true if valid or an error message if invalid - */ - public function validate() - { - $name = $this->getName(); - if ($name === '') { - return 'The cookie name must not be empty'; - } - // Check if any of the invalid characters are present in the cookie name - if (\preg_match('/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/', $name)) { - return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\\"/?={}'; - } - // Value must not be null. 0 and empty string are valid. Empty strings - // are technically against RFC 6265, but known to happen in the wild. - $value = $this->getValue(); - if ($value === null) { - return 'The cookie value must not be empty'; - } - // Domains must not be empty, but can be 0. "0" is not a valid internet - // domain, but may be used as server name in a private network. - $domain = $this->getDomain(); - if ($domain === null || $domain === '') { - return 'The cookie domain must not be empty'; - } - return \true; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/dependencies/guzzlehttp/guzzle/src/Exception/BadResponseException.php deleted file mode 100644 index 177beea..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Exception/BadResponseException.php +++ /dev/null @@ -1,31 +0,0 @@ -request = $request; - $this->handlerContext = $handlerContext; - } - /** - * Get the request that caused the exception - */ - public function getRequest() : RequestInterface - { - return $this->request; - } - /** - * Get contextual information about the error from the underlying handler. - * - * The contents of this array will vary depending on which handler you are - * using. It may also be just an empty array. Relying on this data will - * couple you to a specific handler, but can give more debug information - * when needed. - */ - public function getHandlerContext() : array - { - return $this->handlerContext; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/dependencies/guzzlehttp/guzzle/src/Exception/GuzzleException.php deleted file mode 100644 index 04a4cb6..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Exception/GuzzleException.php +++ /dev/null @@ -1,8 +0,0 @@ -getStatusCode() : 0; - parent::__construct($message, $code, $previous); - $this->request = $request; - $this->response = $response; - $this->handlerContext = $handlerContext; - } - /** - * Wrap non-RequestExceptions with a RequestException - */ - public static function wrapException(RequestInterface $request, \Throwable $e) : RequestException - { - return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); - } - /** - * Factory method to create a new exception with a normalized error message - * - * @param RequestInterface $request Request sent - * @param ResponseInterface $response Response received - * @param \Throwable|null $previous Previous exception - * @param array $handlerContext Optional handler context - * @param BodySummarizerInterface|null $bodySummarizer Optional body summarizer - */ - public static function create(RequestInterface $request, ResponseInterface $response = null, \Throwable $previous = null, array $handlerContext = [], BodySummarizerInterface $bodySummarizer = null) : self - { - if (!$response) { - return new self('Error completing request', $request, null, $previous, $handlerContext); - } - $level = (int) \floor($response->getStatusCode() / 100); - if ($level === 4) { - $label = 'Client error'; - $className = ClientException::class; - } elseif ($level === 5) { - $label = 'Server error'; - $className = ServerException::class; - } else { - $label = 'Unsuccessful request'; - $className = __CLASS__; - } - $uri = $request->getUri(); - $uri = static::obfuscateUri($uri); - // Client Error: `GET /` resulted in a `404 Not Found` response: - // ... (truncated) - $message = \sprintf('%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri->__toString(), $response->getStatusCode(), $response->getReasonPhrase()); - $summary = ($bodySummarizer ?? new BodySummarizer())->summarize($response); - if ($summary !== null) { - $message .= ":\n{$summary}\n"; - } - return new $className($message, $request, $response, $previous, $handlerContext); - } - /** - * Obfuscates URI if there is a username and a password present - */ - private static function obfuscateUri(UriInterface $uri) : UriInterface - { - $userInfo = $uri->getUserInfo(); - if (\false !== ($pos = \strpos($userInfo, ':'))) { - return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); - } - return $uri; - } - /** - * Get the request that caused the exception - */ - public function getRequest() : RequestInterface - { - return $this->request; - } - /** - * Get the associated response - */ - public function getResponse() : ?ResponseInterface - { - return $this->response; - } - /** - * Check if a response was received - */ - public function hasResponse() : bool - { - return $this->response !== null; - } - /** - * Get contextual information about the error from the underlying handler. - * - * The contents of this array will vary depending on which handler you are - * using. It may also be just an empty array. Relying on this data will - * couple you to a specific handler, but can give more debug information - * when needed. - */ - public function getHandlerContext() : array - { - return $this->handlerContext; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Exception/ServerException.php b/dependencies/guzzlehttp/guzzle/src/Exception/ServerException.php deleted file mode 100644 index 5972e4d..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Exception/ServerException.php +++ /dev/null @@ -1,10 +0,0 @@ -maxHandles = $maxHandles; - } - public function create(RequestInterface $request, array $options) : EasyHandle - { - if (isset($options['curl']['body_as_string'])) { - $options['_body_as_string'] = $options['curl']['body_as_string']; - unset($options['curl']['body_as_string']); - } - $easy = new EasyHandle(); - $easy->request = $request; - $easy->options = $options; - $conf = $this->getDefaultConf($easy); - $this->applyMethod($easy, $conf); - $this->applyHandlerOptions($easy, $conf); - $this->applyHeaders($easy, $conf); - unset($conf['_headers']); - // Add handler options from the request configuration options - if (isset($options['curl'])) { - $conf = \array_replace($conf, $options['curl']); - } - $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); - $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); - \curl_setopt_array($easy->handle, $conf); - return $easy; - } - public function release(EasyHandle $easy) : void - { - $resource = $easy->handle; - unset($easy->handle); - if (\count($this->handles) >= $this->maxHandles) { - \curl_close($resource); - } else { - // Remove all callback functions as they can hold onto references - // and are not cleaned up by curl_reset. Using curl_setopt_array - // does not work for some reason, so removing each one - // individually. - \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); - \curl_setopt($resource, \CURLOPT_READFUNCTION, null); - \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); - \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); - \curl_reset($resource); - $this->handles[] = $resource; - } - } - /** - * Completes a cURL transaction, either returning a response promise or a - * rejected promise. - * - * @param callable(RequestInterface, array): PromiseInterface $handler - * @param CurlFactoryInterface $factory Dictates how the handle is released - */ - public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) : PromiseInterface - { - if (isset($easy->options['on_stats'])) { - self::invokeStats($easy); - } - if (!$easy->response || $easy->errno) { - return self::finishError($handler, $easy, $factory); - } - // Return the response if it is present and there is no error. - $factory->release($easy); - // Rewind the body of the response if possible. - $body = $easy->response->getBody(); - if ($body->isSeekable()) { - $body->rewind(); - } - return new FulfilledPromise($easy->response); - } - private static function invokeStats(EasyHandle $easy) : void - { - $curlStats = \curl_getinfo($easy->handle); - $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); - $stats = new TransferStats($easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats); - $easy->options['on_stats']($stats); - } - /** - * @param callable(RequestInterface, array): PromiseInterface $handler - */ - private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) : PromiseInterface - { - // Get error information and release the handle to the factory. - $ctx = ['errno' => $easy->errno, 'error' => \curl_error($easy->handle), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME)] + \curl_getinfo($easy->handle); - $ctx[self::CURL_VERSION_STR] = \curl_version()['version']; - $factory->release($easy); - // Retry when nothing is present or when curl failed to rewind. - if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { - return self::retryFailedRewind($handler, $easy, $ctx); - } - return self::createRejection($easy, $ctx); - } - private static function createRejection(EasyHandle $easy, array $ctx) : PromiseInterface - { - static $connectionErrors = [\CURLE_OPERATION_TIMEOUTED => \true, \CURLE_COULDNT_RESOLVE_HOST => \true, \CURLE_COULDNT_CONNECT => \true, \CURLE_SSL_CONNECT_ERROR => \true, \CURLE_GOT_NOTHING => \true]; - if ($easy->createResponseException) { - return P\Create::rejectionFor(new RequestException('An error was encountered while creating the response', $easy->request, $easy->response, $easy->createResponseException, $ctx)); - } - // If an exception was encountered during the onHeaders event, then - // return a rejected promise that wraps that exception. - if ($easy->onHeadersException) { - return P\Create::rejectionFor(new RequestException('An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx)); - } - $message = \sprintf('cURL error %s: %s (%s)', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'); - $uriString = (string) $easy->request->getUri(); - if ($uriString !== '' && \false === \strpos($ctx['error'], $uriString)) { - $message .= \sprintf(' for %s', $uriString); - } - // Create a connection exception if it was a specific error code. - $error = isset($connectionErrors[$easy->errno]) ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); - return P\Create::rejectionFor($error); - } - /** - * @return array - */ - private function getDefaultConf(EasyHandle $easy) : array - { - $conf = ['_headers' => $easy->request->getHeaders(), \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), \CURLOPT_RETURNTRANSFER => \false, \CURLOPT_HEADER => \false, \CURLOPT_CONNECTTIMEOUT => 300]; - if (\defined('CURLOPT_PROTOCOLS')) { - $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; - } - $version = $easy->request->getProtocolVersion(); - if ($version == 1.1) { - $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; - } elseif ($version == 2.0) { - $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; - } else { - $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; - } - return $conf; - } - private function applyMethod(EasyHandle $easy, array &$conf) : void - { - $body = $easy->request->getBody(); - $size = $body->getSize(); - if ($size === null || $size > 0) { - $this->applyBody($easy->request, $easy->options, $conf); - return; - } - $method = $easy->request->getMethod(); - if ($method === 'PUT' || $method === 'POST') { - // See https://tools.ietf.org/html/rfc7230#section-3.3.2 - if (!$easy->request->hasHeader('Content-Length')) { - $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; - } - } elseif ($method === 'HEAD') { - $conf[\CURLOPT_NOBODY] = \true; - unset($conf[\CURLOPT_WRITEFUNCTION], $conf[\CURLOPT_READFUNCTION], $conf[\CURLOPT_FILE], $conf[\CURLOPT_INFILE]); - } - } - private function applyBody(RequestInterface $request, array $options, array &$conf) : void - { - $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null; - // Send the body as a string if the size is less than 1MB OR if the - // [curl][body_as_string] request value is set. - if ($size !== null && $size < 1000000 || !empty($options['_body_as_string'])) { - $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); - // Don't duplicate the Content-Length header - $this->removeHeader('Content-Length', $conf); - $this->removeHeader('Transfer-Encoding', $conf); - } else { - $conf[\CURLOPT_UPLOAD] = \true; - if ($size !== null) { - $conf[\CURLOPT_INFILESIZE] = $size; - $this->removeHeader('Content-Length', $conf); - } - $body = $request->getBody(); - if ($body->isSeekable()) { - $body->rewind(); - } - $conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use($body) { - return $body->read($length); - }; - } - // If the Expect header is not present, prevent curl from adding it - if (!$request->hasHeader('Expect')) { - $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; - } - // cURL sometimes adds a content-type by default. Prevent this. - if (!$request->hasHeader('Content-Type')) { - $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; - } - } - private function applyHeaders(EasyHandle $easy, array &$conf) : void - { - foreach ($conf['_headers'] as $name => $values) { - foreach ($values as $value) { - $value = (string) $value; - if ($value === '') { - // cURL requires a special format for empty headers. - // See https://github.com/guzzle/guzzle/issues/1882 for more details. - $conf[\CURLOPT_HTTPHEADER][] = "{$name};"; - } else { - $conf[\CURLOPT_HTTPHEADER][] = "{$name}: {$value}"; - } - } - } - // Remove the Accept header if one was not set - if (!$easy->request->hasHeader('Accept')) { - $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; - } - } - /** - * Remove a header from the options array. - * - * @param string $name Case-insensitive header to remove - * @param array $options Array of options to modify - */ - private function removeHeader(string $name, array &$options) : void - { - foreach (\array_keys($options['_headers']) as $key) { - if (!\strcasecmp($key, $name)) { - unset($options['_headers'][$key]); - return; - } - } - } - private function applyHandlerOptions(EasyHandle $easy, array &$conf) : void - { - $options = $easy->options; - if (isset($options['verify'])) { - if ($options['verify'] === \false) { - unset($conf[\CURLOPT_CAINFO]); - $conf[\CURLOPT_SSL_VERIFYHOST] = 0; - $conf[\CURLOPT_SSL_VERIFYPEER] = \false; - } else { - $conf[\CURLOPT_SSL_VERIFYHOST] = 2; - $conf[\CURLOPT_SSL_VERIFYPEER] = \true; - if (\is_string($options['verify'])) { - // Throw an error if the file/folder/link path is not valid or doesn't exist. - if (!\file_exists($options['verify'])) { - throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); - } - // If it's a directory or a link to a directory use CURLOPT_CAPATH. - // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. - if (\is_dir($options['verify']) || \is_link($options['verify']) === \true && ($verifyLink = \readlink($options['verify'])) !== \false && \is_dir($verifyLink)) { - $conf[\CURLOPT_CAPATH] = $options['verify']; - } else { - $conf[\CURLOPT_CAINFO] = $options['verify']; - } - } - } - } - if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) { - $accept = $easy->request->getHeaderLine('Accept-Encoding'); - if ($accept) { - $conf[\CURLOPT_ENCODING] = $accept; - } else { - // The empty string enables all available decoders and implicitly - // sets a matching 'Accept-Encoding' header. - $conf[\CURLOPT_ENCODING] = ''; - // But as the user did not specify any acceptable encodings we need - // to overwrite this implicit header with an empty one. - $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; - } - } - if (!isset($options['sink'])) { - // Use a default temp stream if no sink was set. - $options['sink'] = \WP_Ultimo\Dependencies\GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+'); - } - $sink = $options['sink']; - if (!\is_string($sink)) { - $sink = \WP_Ultimo\Dependencies\GuzzleHttp\Psr7\Utils::streamFor($sink); - } elseif (!\is_dir(\dirname($sink))) { - // Ensure that the directory exists before failing in curl. - throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); - } else { - $sink = new LazyOpenStream($sink, 'w+'); - } - $easy->sink = $sink; - $conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use($sink) : int { - return $sink->write($write); - }; - $timeoutRequiresNoSignal = \false; - if (isset($options['timeout'])) { - $timeoutRequiresNoSignal |= $options['timeout'] < 1; - $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; - } - // CURL default value is CURL_IPRESOLVE_WHATEVER - if (isset($options['force_ip_resolve'])) { - if ('v4' === $options['force_ip_resolve']) { - $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; - } elseif ('v6' === $options['force_ip_resolve']) { - $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; - } - } - if (isset($options['connect_timeout'])) { - $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; - $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; - } - if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { - $conf[\CURLOPT_NOSIGNAL] = \true; - } - if (isset($options['proxy'])) { - if (!\is_array($options['proxy'])) { - $conf[\CURLOPT_PROXY] = $options['proxy']; - } else { - $scheme = $easy->request->getUri()->getScheme(); - if (isset($options['proxy'][$scheme])) { - $host = $easy->request->getUri()->getHost(); - if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) { - unset($conf[\CURLOPT_PROXY]); - } else { - $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; - } - } - } - } - if (isset($options['crypto_method'])) { - if (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) { - if (!\defined('CURL_SSLVERSION_TLSv1_0')) { - throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.0 not supported by your version of cURL'); - } - $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0; - } elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) { - if (!\defined('CURL_SSLVERSION_TLSv1_1')) { - throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.1 not supported by your version of cURL'); - } - $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1; - } elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) { - if (!\defined('CURL_SSLVERSION_TLSv1_2')) { - throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL'); - } - $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2; - } elseif (\defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) { - if (!\defined('CURL_SSLVERSION_TLSv1_3')) { - throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL'); - } - $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3; - } else { - throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided'); - } - } - if (isset($options['cert'])) { - $cert = $options['cert']; - if (\is_array($cert)) { - $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; - $cert = $cert[0]; - } - if (!\file_exists($cert)) { - throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); - } - // OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files. - // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html - $ext = \pathinfo($cert, \PATHINFO_EXTENSION); - if (\preg_match('#^(der|p12)$#i', $ext)) { - $conf[\CURLOPT_SSLCERTTYPE] = \strtoupper($ext); - } - $conf[\CURLOPT_SSLCERT] = $cert; - } - if (isset($options['ssl_key'])) { - if (\is_array($options['ssl_key'])) { - if (\count($options['ssl_key']) === 2) { - [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key']; - } else { - [$sslKey] = $options['ssl_key']; - } - } - $sslKey = $sslKey ?? $options['ssl_key']; - if (!\file_exists($sslKey)) { - throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); - } - $conf[\CURLOPT_SSLKEY] = $sslKey; - } - if (isset($options['progress'])) { - $progress = $options['progress']; - if (!\is_callable($progress)) { - throw new \InvalidArgumentException('progress client option must be callable'); - } - $conf[\CURLOPT_NOPROGRESS] = \false; - $conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use($progress) { - $progress($downloadSize, $downloaded, $uploadSize, $uploaded); - }; - } - if (!empty($options['debug'])) { - $conf[\CURLOPT_STDERR] = Utils::debugResource($options['debug']); - $conf[\CURLOPT_VERBOSE] = \true; - } - } - /** - * This function ensures that a response was set on a transaction. If one - * was not set, then the request is retried if possible. This error - * typically means you are sending a payload, curl encountered a - * "Connection died, retrying a fresh connect" error, tried to rewind the - * stream, and then encountered a "necessary data rewind wasn't possible" - * error, causing the request to be sent through curl_multi_info_read() - * without an error status. - * - * @param callable(RequestInterface, array): PromiseInterface $handler - */ - private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx) : PromiseInterface - { - try { - // Only rewind if the body has been read from. - $body = $easy->request->getBody(); - if ($body->tell() > 0) { - $body->rewind(); - } - } catch (\RuntimeException $e) { - $ctx['error'] = 'The connection unexpectedly failed without ' . 'providing an error. The request would have been retried, ' . 'but attempting to rewind the request body failed. ' . 'Exception: ' . $e; - return self::createRejection($easy, $ctx); - } - // Retry no more than 3 times before giving up. - if (!isset($easy->options['_curl_retries'])) { - $easy->options['_curl_retries'] = 1; - } elseif ($easy->options['_curl_retries'] == 2) { - $ctx['error'] = 'The cURL request was retried 3 times ' . 'and did not succeed. The most likely reason for the failure ' . 'is that cURL was unable to rewind the body of the request ' . 'and subsequent retries resulted in the same error. Turn on ' . 'the debug option to see what went wrong. See ' . 'https://bugs.php.net/bug.php?id=47204 for more information.'; - return self::createRejection($easy, $ctx); - } else { - ++$easy->options['_curl_retries']; - } - return $handler($easy->request, $easy->options); - } - private function createHeaderFn(EasyHandle $easy) : callable - { - if (isset($easy->options['on_headers'])) { - $onHeaders = $easy->options['on_headers']; - if (!\is_callable($onHeaders)) { - throw new \InvalidArgumentException('on_headers must be callable'); - } - } else { - $onHeaders = null; - } - return static function ($ch, $h) use($onHeaders, $easy, &$startingResponse) { - $value = \trim($h); - if ($value === '') { - $startingResponse = \true; - try { - $easy->createResponse(); - } catch (\Exception $e) { - $easy->createResponseException = $e; - return -1; - } - if ($onHeaders !== null) { - try { - $onHeaders($easy->response); - } catch (\Exception $e) { - // Associate the exception with the handle and trigger - // a curl header write error by returning 0. - $easy->onHeadersException = $e; - return -1; - } - } - } elseif ($startingResponse) { - $startingResponse = \false; - $easy->headers = [$value]; - } else { - $easy->headers[] = $value; - } - return \strlen($h); - }; - } - public function __destruct() - { - foreach ($this->handles as $id => $handle) { - \curl_close($handle); - unset($this->handles[$id]); - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/dependencies/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php deleted file mode 100644 index 9981e84..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -factory = $options['handle_factory'] ?? new CurlFactory(3); - } - public function __invoke(RequestInterface $request, array $options) : PromiseInterface - { - if (isset($options['delay'])) { - \usleep($options['delay'] * 1000); - } - $easy = $this->factory->create($request, $options); - \curl_exec($easy->handle); - $easy->errno = \curl_errno($easy->handle); - return CurlFactory::finish($this, $easy, $this->factory); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/dependencies/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php deleted file mode 100644 index fa46f18..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php +++ /dev/null @@ -1,220 +0,0 @@ - An array of delay times, indexed by handle id in `addRequest`. - * - * @see CurlMultiHandler::addRequest - */ - private $delays = []; - /** - * @var array An associative array of CURLMOPT_* options and corresponding values for curl_multi_setopt() - */ - private $options = []; - /** @var resource|\CurlMultiHandle */ - private $_mh; - /** - * This handler accepts the following options: - * - * - handle_factory: An optional factory used to create curl handles - * - select_timeout: Optional timeout (in seconds) to block before timing - * out while selecting curl handles. Defaults to 1 second. - * - options: An associative array of CURLMOPT_* options and - * corresponding values for curl_multi_setopt() - */ - public function __construct(array $options = []) - { - $this->factory = $options['handle_factory'] ?? new CurlFactory(50); - if (isset($options['select_timeout'])) { - $this->selectTimeout = $options['select_timeout']; - } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { - @\trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED); - $this->selectTimeout = (int) $selectTimeout; - } else { - $this->selectTimeout = 1; - } - $this->options = $options['options'] ?? []; - // unsetting the property forces the first access to go through - // __get(). - unset($this->_mh); - } - /** - * @param string $name - * - * @return resource|\CurlMultiHandle - * - * @throws \BadMethodCallException when another field as `_mh` will be gotten - * @throws \RuntimeException when curl can not initialize a multi handle - */ - public function __get($name) - { - if ($name !== '_mh') { - throw new \BadMethodCallException("Can not get other property as '_mh'."); - } - $multiHandle = \curl_multi_init(); - if (\false === $multiHandle) { - throw new \RuntimeException('Can not initialize curl multi handle.'); - } - $this->_mh = $multiHandle; - foreach ($this->options as $option => $value) { - // A warning is raised in case of a wrong option. - \curl_multi_setopt($this->_mh, $option, $value); - } - return $this->_mh; - } - public function __destruct() - { - if (isset($this->_mh)) { - \curl_multi_close($this->_mh); - unset($this->_mh); - } - } - public function __invoke(RequestInterface $request, array $options) : PromiseInterface - { - $easy = $this->factory->create($request, $options); - $id = (int) $easy->handle; - $promise = new Promise([$this, 'execute'], function () use($id) { - return $this->cancel($id); - }); - $this->addRequest(['easy' => $easy, 'deferred' => $promise]); - return $promise; - } - /** - * Ticks the curl event loop. - */ - public function tick() : void - { - // Add any delayed handles if needed. - if ($this->delays) { - $currentTime = Utils::currentTime(); - foreach ($this->delays as $id => $delay) { - if ($currentTime >= $delay) { - unset($this->delays[$id]); - \curl_multi_add_handle($this->_mh, $this->handles[$id]['easy']->handle); - } - } - } - // Step through the task queue which may add additional requests. - P\Utils::queue()->run(); - if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { - // Perform a usleep if a select returns -1. - // See: https://bugs.php.net/bug.php?id=61141 - \usleep(250); - } - while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { - } - $this->processMessages(); - } - /** - * Runs until all outstanding connections have completed. - */ - public function execute() : void - { - $queue = P\Utils::queue(); - while ($this->handles || !$queue->isEmpty()) { - // If there are no transfers, then sleep for the next delay - if (!$this->active && $this->delays) { - \usleep($this->timeToNext()); - } - $this->tick(); - } - } - private function addRequest(array $entry) : void - { - $easy = $entry['easy']; - $id = (int) $easy->handle; - $this->handles[$id] = $entry; - if (empty($easy->options['delay'])) { - \curl_multi_add_handle($this->_mh, $easy->handle); - } else { - $this->delays[$id] = Utils::currentTime() + $easy->options['delay'] / 1000; - } - } - /** - * Cancels a handle from sending and removes references to it. - * - * @param int $id Handle ID to cancel and remove. - * - * @return bool True on success, false on failure. - */ - private function cancel($id) : bool - { - if (!\is_int($id)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - // Cannot cancel if it has been processed. - if (!isset($this->handles[$id])) { - return \false; - } - $handle = $this->handles[$id]['easy']->handle; - unset($this->delays[$id], $this->handles[$id]); - \curl_multi_remove_handle($this->_mh, $handle); - \curl_close($handle); - return \true; - } - private function processMessages() : void - { - while ($done = \curl_multi_info_read($this->_mh)) { - if ($done['msg'] !== \CURLMSG_DONE) { - // if it's not done, then it would be premature to remove the handle. ref https://github.com/guzzle/guzzle/pull/2892#issuecomment-945150216 - continue; - } - $id = (int) $done['handle']; - \curl_multi_remove_handle($this->_mh, $done['handle']); - if (!isset($this->handles[$id])) { - // Probably was cancelled. - continue; - } - $entry = $this->handles[$id]; - unset($this->handles[$id], $this->delays[$id]); - $entry['easy']->errno = $done['result']; - $entry['deferred']->resolve(CurlFactory::finish($this, $entry['easy'], $this->factory)); - } - } - private function timeToNext() : int - { - $currentTime = Utils::currentTime(); - $nextTime = \PHP_INT_MAX; - foreach ($this->delays as $time) { - if ($time < $nextTime) { - $nextTime = $time; - } - } - return (int) \max(0, $nextTime - $currentTime) * 1000000; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/dependencies/guzzlehttp/guzzle/src/Handler/EasyHandle.php deleted file mode 100644 index b0d526c..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Handler/EasyHandle.php +++ /dev/null @@ -1,91 +0,0 @@ -headers); - $normalizedKeys = Utils::normalizeHeaderKeys($headers); - if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { - $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; - unset($headers[$normalizedKeys['content-encoding']]); - if (isset($normalizedKeys['content-length'])) { - $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; - $bodyLength = (int) $this->sink->getSize(); - if ($bodyLength) { - $headers[$normalizedKeys['content-length']] = $bodyLength; - } else { - unset($headers[$normalizedKeys['content-length']]); - } - } - } - // Attach a response to the easy handle with the parsed headers. - $this->response = new Response($status, $headers, $this->sink, $ver, $reason); - } - /** - * @param string $name - * - * @return void - * - * @throws \BadMethodCallException - */ - public function __get($name) - { - $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; - throw new \BadMethodCallException($msg); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php b/dependencies/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php deleted file mode 100644 index a1d4804..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php +++ /dev/null @@ -1,36 +0,0 @@ -|null $queue The parameters to be passed to the append function, as an indexed array. - * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. - * @param callable|null $onRejected Callback to invoke when the return value is rejected. - */ - public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null) - { - $this->onFulfilled = $onFulfilled; - $this->onRejected = $onRejected; - if ($queue) { - // array_values included for BC - $this->append(...\array_values($queue)); - } - } - public function __invoke(RequestInterface $request, array $options) : PromiseInterface - { - if (!$this->queue) { - throw new \OutOfBoundsException('Mock queue is empty'); - } - if (isset($options['delay']) && \is_numeric($options['delay'])) { - \usleep((int) $options['delay'] * 1000); - } - $this->lastRequest = $request; - $this->lastOptions = $options; - $response = \array_shift($this->queue); - if (isset($options['on_headers'])) { - if (!\is_callable($options['on_headers'])) { - throw new \InvalidArgumentException('on_headers must be callable'); - } - try { - $options['on_headers']($response); - } catch (\Exception $e) { - $msg = 'An error was encountered during the on_headers event'; - $response = new RequestException($msg, $request, $response, $e); - } - } - if (\is_callable($response)) { - $response = $response($request, $options); - } - $response = $response instanceof \Throwable ? P\Create::rejectionFor($response) : P\Create::promiseFor($response); - return $response->then(function (?ResponseInterface $value) use($request, $options) { - $this->invokeStats($request, $options, $value); - if ($this->onFulfilled) { - ($this->onFulfilled)($value); - } - if ($value !== null && isset($options['sink'])) { - $contents = (string) $value->getBody(); - $sink = $options['sink']; - if (\is_resource($sink)) { - \fwrite($sink, $contents); - } elseif (\is_string($sink)) { - \file_put_contents($sink, $contents); - } elseif ($sink instanceof StreamInterface) { - $sink->write($contents); - } - } - return $value; - }, function ($reason) use($request, $options) { - $this->invokeStats($request, $options, null, $reason); - if ($this->onRejected) { - ($this->onRejected)($reason); - } - return P\Create::rejectionFor($reason); - }); - } - /** - * Adds one or more variadic requests, exceptions, callables, or promises - * to the queue. - * - * @param mixed ...$values - */ - public function append(...$values) : void - { - foreach ($values as $value) { - if ($value instanceof ResponseInterface || $value instanceof \Throwable || $value instanceof PromiseInterface || \is_callable($value)) { - $this->queue[] = $value; - } else { - throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found ' . Utils::describeType($value)); - } - } - } - /** - * Get the last received request. - */ - public function getLastRequest() : ?RequestInterface - { - return $this->lastRequest; - } - /** - * Get the last received request options. - */ - public function getLastOptions() : array - { - return $this->lastOptions; - } - /** - * Returns the number of remaining items in the queue. - */ - public function count() : int - { - return \count($this->queue); - } - public function reset() : void - { - $this->queue = []; - } - /** - * @param mixed $reason Promise or reason. - */ - private function invokeStats(RequestInterface $request, array $options, ResponseInterface $response = null, $reason = null) : void - { - if (isset($options['on_stats'])) { - $transferTime = $options['transfer_time'] ?? 0; - $stats = new TransferStats($request, $response, $transferTime, $reason); - $options['on_stats']($stats); - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Handler/Proxy.php b/dependencies/guzzlehttp/guzzle/src/Handler/Proxy.php deleted file mode 100644 index 554b4e6..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Handler/Proxy.php +++ /dev/null @@ -1,49 +0,0 @@ -withoutHeader('Expect'); - // Append a content-length header if body size is zero to match - // cURL's behavior. - if (0 === $request->getBody()->getSize()) { - $request = $request->withHeader('Content-Length', '0'); - } - return $this->createResponse($request, $options, $this->createStream($request, $options), $startTime); - } catch (\InvalidArgumentException $e) { - throw $e; - } catch (\Exception $e) { - // Determine if the error was a networking error. - $message = $e->getMessage(); - // This list can probably get more comprehensive. - if (\false !== \strpos($message, 'getaddrinfo') || \false !== \strpos($message, 'Connection refused') || \false !== \strpos($message, "couldn't connect to host") || \false !== \strpos($message, 'connection attempt failed')) { - $e = new ConnectException($e->getMessage(), $request, $e); - } else { - $e = RequestException::wrapException($request, $e); - } - $this->invokeStats($options, $request, $startTime, null, $e); - return P\Create::rejectionFor($e); - } - } - private function invokeStats(array $options, RequestInterface $request, ?float $startTime, ResponseInterface $response = null, \Throwable $error = null) : void - { - if (isset($options['on_stats'])) { - $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); - $options['on_stats']($stats); - } - } - /** - * @param resource $stream - */ - private function createResponse(RequestInterface $request, array $options, $stream, ?float $startTime) : PromiseInterface - { - $hdrs = $this->lastHeaders; - $this->lastHeaders = []; - try { - [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs); - } catch (\Exception $e) { - return P\Create::rejectionFor(new RequestException('An error was encountered while creating the response', $request, null, $e)); - } - [$stream, $headers] = $this->checkDecode($options, $headers, $stream); - $stream = Psr7\Utils::streamFor($stream); - $sink = $stream; - if (\strcasecmp('HEAD', $request->getMethod())) { - $sink = $this->createSink($stream, $options); - } - try { - $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); - } catch (\Exception $e) { - return P\Create::rejectionFor(new RequestException('An error was encountered while creating the response', $request, null, $e)); - } - if (isset($options['on_headers'])) { - try { - $options['on_headers']($response); - } catch (\Exception $e) { - return P\Create::rejectionFor(new RequestException('An error was encountered during the on_headers event', $request, $response, $e)); - } - } - // Do not drain when the request is a HEAD request because they have - // no body. - if ($sink !== $stream) { - $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); - } - $this->invokeStats($options, $request, $startTime, $response, null); - return new FulfilledPromise($response); - } - private function createSink(StreamInterface $stream, array $options) : StreamInterface - { - if (!empty($options['stream'])) { - return $stream; - } - $sink = $options['sink'] ?? Psr7\Utils::tryFopen('php://temp', 'r+'); - return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\Utils::streamFor($sink); - } - /** - * @param resource $stream - */ - private function checkDecode(array $options, array $headers, $stream) : array - { - // Automatically decode responses when instructed. - if (!empty($options['decode_content'])) { - $normalizedKeys = Utils::normalizeHeaderKeys($headers); - if (isset($normalizedKeys['content-encoding'])) { - $encoding = $headers[$normalizedKeys['content-encoding']]; - if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { - $stream = new Psr7\InflateStream(Psr7\Utils::streamFor($stream)); - $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; - // Remove content-encoding header - unset($headers[$normalizedKeys['content-encoding']]); - // Fix content-length header - if (isset($normalizedKeys['content-length'])) { - $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; - $length = (int) $stream->getSize(); - if ($length === 0) { - unset($headers[$normalizedKeys['content-length']]); - } else { - $headers[$normalizedKeys['content-length']] = [$length]; - } - } - } - } - } - return [$stream, $headers]; - } - /** - * Drains the source stream into the "sink" client option. - * - * @param string $contentLength Header specifying the amount of - * data to read. - * - * @throws \RuntimeException when the sink option is invalid. - */ - private function drain(StreamInterface $source, StreamInterface $sink, string $contentLength) : StreamInterface - { - // If a content-length header is provided, then stop reading once - // that number of bytes has been read. This can prevent infinitely - // reading from a stream when dealing with servers that do not honor - // Connection: Close headers. - Psr7\Utils::copyToStream($source, $sink, \strlen($contentLength) > 0 && (int) $contentLength > 0 ? (int) $contentLength : -1); - $sink->seek(0); - $source->close(); - return $sink; - } - /** - * Create a resource and check to ensure it was created successfully - * - * @param callable $callback Callable that returns stream resource - * - * @return resource - * - * @throws \RuntimeException on error - */ - private function createResource(callable $callback) - { - $errors = []; - \set_error_handler(static function ($_, $msg, $file, $line) use(&$errors) : bool { - $errors[] = ['message' => $msg, 'file' => $file, 'line' => $line]; - return \true; - }); - try { - $resource = $callback(); - } finally { - \restore_error_handler(); - } - if (!$resource) { - $message = 'Error creating resource: '; - foreach ($errors as $err) { - foreach ($err as $key => $value) { - $message .= "[{$key}] {$value}" . \PHP_EOL; - } - } - throw new \RuntimeException(\trim($message)); - } - return $resource; - } - /** - * @return resource - */ - private function createStream(RequestInterface $request, array $options) - { - static $methods; - if (!$methods) { - $methods = \array_flip(\get_class_methods(__CLASS__)); - } - if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) { - throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request); - } - // HTTP/1.1 streams using the PHP stream wrapper require a - // Connection: close header - if ($request->getProtocolVersion() == '1.1' && !$request->hasHeader('Connection')) { - $request = $request->withHeader('Connection', 'close'); - } - // Ensure SSL is verified by default - if (!isset($options['verify'])) { - $options['verify'] = \true; - } - $params = []; - $context = $this->getDefaultContext($request); - if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { - throw new \InvalidArgumentException('on_headers must be callable'); - } - if (!empty($options)) { - foreach ($options as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $context, $value, $params); - } - } - } - if (isset($options['stream_context'])) { - if (!\is_array($options['stream_context'])) { - throw new \InvalidArgumentException('stream_context must be an array'); - } - $context = \array_replace_recursive($context, $options['stream_context']); - } - // Microsoft NTLM authentication only supported with curl handler - if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) { - throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); - } - $uri = $this->resolveHost($request, $options); - $contextResource = $this->createResource(static function () use($context, $params) { - return \stream_context_create($context, $params); - }); - return $this->createResource(function () use($uri, &$http_response_header, $contextResource, $context, $options, $request) { - $resource = @\fopen((string) $uri, 'r', \false, $contextResource); - $this->lastHeaders = $http_response_header ?? []; - if (\false === $resource) { - throw new ConnectException(\sprintf('Connection refused for URI %s', $uri), $request, null, $context); - } - if (isset($options['read_timeout'])) { - $readTimeout = $options['read_timeout']; - $sec = (int) $readTimeout; - $usec = ($readTimeout - $sec) * 100000; - \stream_set_timeout($resource, $sec, $usec); - } - return $resource; - }); - } - private function resolveHost(RequestInterface $request, array $options) : UriInterface - { - $uri = $request->getUri(); - if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { - if ('v4' === $options['force_ip_resolve']) { - $records = \dns_get_record($uri->getHost(), \DNS_A); - if (\false === $records || !isset($records[0]['ip'])) { - throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); - } - return $uri->withHost($records[0]['ip']); - } - if ('v6' === $options['force_ip_resolve']) { - $records = \dns_get_record($uri->getHost(), \DNS_AAAA); - if (\false === $records || !isset($records[0]['ipv6'])) { - throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); - } - return $uri->withHost('[' . $records[0]['ipv6'] . ']'); - } - } - return $uri; - } - private function getDefaultContext(RequestInterface $request) : array - { - $headers = ''; - foreach ($request->getHeaders() as $name => $value) { - foreach ($value as $val) { - $headers .= "{$name}: {$val}\r\n"; - } - } - $context = ['http' => ['method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => \true, 'follow_location' => 0], 'ssl' => ['peer_name' => $request->getUri()->getHost()]]; - $body = (string) $request->getBody(); - if ('' !== $body) { - $context['http']['content'] = $body; - // Prevent the HTTP handler from adding a Content-Type header. - if (!$request->hasHeader('Content-Type')) { - $context['http']['header'] .= "Content-Type:\r\n"; - } - } - $context['http']['header'] = \rtrim($context['http']['header']); - return $context; - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_proxy(RequestInterface $request, array &$options, $value, array &$params) : void - { - $uri = null; - if (!\is_array($value)) { - $uri = $value; - } else { - $scheme = $request->getUri()->getScheme(); - if (isset($value[$scheme])) { - if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) { - $uri = $value[$scheme]; - } - } - } - if (!$uri) { - return; - } - $parsed = $this->parse_proxy($uri); - $options['http']['proxy'] = $parsed['proxy']; - if ($parsed['auth']) { - if (!isset($options['http']['header'])) { - $options['http']['header'] = []; - } - $options['http']['header'] .= "\r\nProxy-Authorization: {$parsed['auth']}"; - } - } - /** - * Parses the given proxy URL to make it compatible with the format PHP's stream context expects. - */ - private function parse_proxy(string $url) : array - { - $parsed = \parse_url($url); - if ($parsed !== \false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') { - if (isset($parsed['host']) && isset($parsed['port'])) { - $auth = null; - if (isset($parsed['user']) && isset($parsed['pass'])) { - $auth = \base64_encode("{$parsed['user']}:{$parsed['pass']}"); - } - return ['proxy' => "tcp://{$parsed['host']}:{$parsed['port']}", 'auth' => $auth ? "Basic {$auth}" : null]; - } - } - // Return proxy as-is. - return ['proxy' => $url, 'auth' => null]; - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_timeout(RequestInterface $request, array &$options, $value, array &$params) : void - { - if ($value > 0) { - $options['http']['timeout'] = $value; - } - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_crypto_method(RequestInterface $request, array &$options, $value, array &$params) : void - { - if ($value === \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT || $value === \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT || $value === \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT || \defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT) { - $options['http']['crypto_method'] = $value; - return; - } - throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided'); - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_verify(RequestInterface $request, array &$options, $value, array &$params) : void - { - if ($value === \false) { - $options['ssl']['verify_peer'] = \false; - $options['ssl']['verify_peer_name'] = \false; - return; - } - if (\is_string($value)) { - $options['ssl']['cafile'] = $value; - if (!\file_exists($value)) { - throw new \RuntimeException("SSL CA bundle not found: {$value}"); - } - } elseif ($value !== \true) { - throw new \InvalidArgumentException('Invalid verify request option'); - } - $options['ssl']['verify_peer'] = \true; - $options['ssl']['verify_peer_name'] = \true; - $options['ssl']['allow_self_signed'] = \false; - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_cert(RequestInterface $request, array &$options, $value, array &$params) : void - { - if (\is_array($value)) { - $options['ssl']['passphrase'] = $value[1]; - $value = $value[0]; - } - if (!\file_exists($value)) { - throw new \RuntimeException("SSL certificate not found: {$value}"); - } - $options['ssl']['local_cert'] = $value; - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_progress(RequestInterface $request, array &$options, $value, array &$params) : void - { - self::addNotification($params, static function ($code, $a, $b, $c, $transferred, $total) use($value) { - if ($code == \STREAM_NOTIFY_PROGRESS) { - // The upload progress cannot be determined. Use 0 for cURL compatibility: - // https://curl.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html - $value($total, $transferred, 0, 0); - } - }); - } - /** - * @param mixed $value as passed via Request transfer options. - */ - private function add_debug(RequestInterface $request, array &$options, $value, array &$params) : void - { - if ($value === \false) { - return; - } - static $map = [\STREAM_NOTIFY_CONNECT => 'CONNECT', \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', \STREAM_NOTIFY_PROGRESS => 'PROGRESS', \STREAM_NOTIFY_FAILURE => 'FAILURE', \STREAM_NOTIFY_COMPLETED => 'COMPLETED', \STREAM_NOTIFY_RESOLVE => 'RESOLVE']; - static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; - $value = Utils::debugResource($value); - $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); - self::addNotification($params, static function (int $code, ...$passed) use($ident, $value, $map, $args) : void { - \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); - foreach (\array_filter($passed) as $i => $v) { - \fwrite($value, $args[$i] . ': "' . $v . '" '); - } - \fwrite($value, "\n"); - }); - } - private static function addNotification(array &$params, callable $notify) : void - { - // Wrap the existing function if needed. - if (!isset($params['notification'])) { - $params['notification'] = $notify; - } else { - $params['notification'] = self::callArray([$params['notification'], $notify]); - } - } - private static function callArray(array $functions) : callable - { - return static function (...$args) use($functions) { - foreach ($functions as $fn) { - $fn(...$args); - } - }; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/HandlerStack.php b/dependencies/guzzlehttp/guzzle/src/HandlerStack.php deleted file mode 100644 index 3c921f0..0000000 --- a/dependencies/guzzlehttp/guzzle/src/HandlerStack.php +++ /dev/null @@ -1,238 +0,0 @@ -push(Middleware::httpErrors(), 'http_errors'); - $stack->push(Middleware::redirect(), 'allow_redirects'); - $stack->push(Middleware::cookies(), 'cookies'); - $stack->push(Middleware::prepareBody(), 'prepare_body'); - return $stack; - } - /** - * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler. - */ - public function __construct(callable $handler = null) - { - $this->handler = $handler; - } - /** - * Invokes the handler stack as a composed handler - * - * @return ResponseInterface|PromiseInterface - */ - public function __invoke(RequestInterface $request, array $options) - { - $handler = $this->resolve(); - return $handler($request, $options); - } - /** - * Dumps a string representation of the stack. - * - * @return string - */ - public function __toString() - { - $depth = 0; - $stack = []; - if ($this->handler !== null) { - $stack[] = '0) Handler: ' . $this->debugCallable($this->handler); - } - $result = ''; - foreach (\array_reverse($this->stack) as $tuple) { - ++$depth; - $str = "{$depth}) Name: '{$tuple[1]}', "; - $str .= 'Function: ' . $this->debugCallable($tuple[0]); - $result = "> {$str}\n{$result}"; - $stack[] = $str; - } - foreach (\array_keys($stack) as $k) { - $result .= "< {$stack[$k]}\n"; - } - return $result; - } - /** - * Set the HTTP handler that actually returns a promise. - * - * @param callable(RequestInterface, array): PromiseInterface $handler Accepts a request and array of options and - * returns a Promise. - */ - public function setHandler(callable $handler) : void - { - $this->handler = $handler; - $this->cached = null; - } - /** - * Returns true if the builder has a handler. - */ - public function hasHandler() : bool - { - return $this->handler !== null; - } - /** - * Unshift a middleware to the bottom of the stack. - * - * @param callable(callable): callable $middleware Middleware function - * @param string $name Name to register for this middleware. - */ - public function unshift(callable $middleware, string $name = null) : void - { - \array_unshift($this->stack, [$middleware, $name]); - $this->cached = null; - } - /** - * Push a middleware to the top of the stack. - * - * @param callable(callable): callable $middleware Middleware function - * @param string $name Name to register for this middleware. - */ - public function push(callable $middleware, string $name = '') : void - { - $this->stack[] = [$middleware, $name]; - $this->cached = null; - } - /** - * Add a middleware before another middleware by name. - * - * @param string $findName Middleware to find - * @param callable(callable): callable $middleware Middleware function - * @param string $withName Name to register for this middleware. - */ - public function before(string $findName, callable $middleware, string $withName = '') : void - { - $this->splice($findName, $withName, $middleware, \true); - } - /** - * Add a middleware after another middleware by name. - * - * @param string $findName Middleware to find - * @param callable(callable): callable $middleware Middleware function - * @param string $withName Name to register for this middleware. - */ - public function after(string $findName, callable $middleware, string $withName = '') : void - { - $this->splice($findName, $withName, $middleware, \false); - } - /** - * Remove a middleware by instance or name from the stack. - * - * @param callable|string $remove Middleware to remove by instance or name. - */ - public function remove($remove) : void - { - if (!\is_string($remove) && !\is_callable($remove)) { - trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); - } - $this->cached = null; - $idx = \is_callable($remove) ? 0 : 1; - $this->stack = \array_values(\array_filter($this->stack, static function ($tuple) use($idx, $remove) { - return $tuple[$idx] !== $remove; - })); - } - /** - * Compose the middleware and handler into a single callable function. - * - * @return callable(RequestInterface, array): PromiseInterface - */ - public function resolve() : callable - { - if ($this->cached === null) { - if (($prev = $this->handler) === null) { - throw new \LogicException('No handler has been specified'); - } - foreach (\array_reverse($this->stack) as $fn) { - /** @var callable(RequestInterface, array): PromiseInterface $prev */ - $prev = $fn[0]($prev); - } - $this->cached = $prev; - } - return $this->cached; - } - private function findByName(string $name) : int - { - foreach ($this->stack as $k => $v) { - if ($v[1] === $name) { - return $k; - } - } - throw new \InvalidArgumentException("Middleware not found: {$name}"); - } - /** - * Splices a function into the middleware list at a specific position. - */ - private function splice(string $findName, string $withName, callable $middleware, bool $before) : void - { - $this->cached = null; - $idx = $this->findByName($findName); - $tuple = [$middleware, $withName]; - if ($before) { - if ($idx === 0) { - \array_unshift($this->stack, $tuple); - } else { - $replacement = [$tuple, $this->stack[$idx]]; - \array_splice($this->stack, $idx, 1, $replacement); - } - } elseif ($idx === \count($this->stack) - 1) { - $this->stack[] = $tuple; - } else { - $replacement = [$this->stack[$idx], $tuple]; - \array_splice($this->stack, $idx, 1, $replacement); - } - } - /** - * Provides a debug string for a given callable. - * - * @param callable|string $fn Function to write as a string. - */ - private function debugCallable($fn) : string - { - if (\is_string($fn)) { - return "callable({$fn})"; - } - if (\is_array($fn)) { - return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; - } - /** @var object $fn */ - return 'callable(' . \spl_object_hash($fn) . ')'; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/MessageFormatter.php b/dependencies/guzzlehttp/guzzle/src/MessageFormatter.php deleted file mode 100644 index 6082bf1..0000000 --- a/dependencies/guzzlehttp/guzzle/src/MessageFormatter.php +++ /dev/null @@ -1,168 +0,0 @@ ->>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; - public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; - /** - * @var string Template used to format log messages - */ - private $template; - /** - * @param string $template Log message template - */ - public function __construct(?string $template = self::CLF) - { - $this->template = $template ?: self::CLF; - } - /** - * Returns a formatted message string. - * - * @param RequestInterface $request Request that was sent - * @param ResponseInterface|null $response Response that was received - * @param \Throwable|null $error Exception that was received - */ - public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null) : string - { - $cache = []; - /** @var string */ - return \preg_replace_callback('/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/', function (array $matches) use($request, $response, $error, &$cache) { - if (isset($cache[$matches[1]])) { - return $cache[$matches[1]]; - } - $result = ''; - switch ($matches[1]) { - case 'request': - $result = Psr7\Message::toString($request); - break; - case 'response': - $result = $response ? Psr7\Message::toString($response) : ''; - break; - case 'req_headers': - $result = \trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request); - break; - case 'res_headers': - $result = $response ? \sprintf('HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase()) . "\r\n" . $this->headers($response) : 'NULL'; - break; - case 'req_body': - $result = $request->getBody()->__toString(); - break; - case 'res_body': - if (!$response instanceof ResponseInterface) { - $result = 'NULL'; - break; - } - $body = $response->getBody(); - if (!$body->isSeekable()) { - $result = 'RESPONSE_NOT_LOGGEABLE'; - break; - } - $result = $response->getBody()->__toString(); - break; - case 'ts': - case 'date_iso_8601': - $result = \gmdate('c'); - break; - case 'date_common_log': - $result = \date('d/M/Y:H:i:s O'); - break; - case 'method': - $result = $request->getMethod(); - break; - case 'version': - $result = $request->getProtocolVersion(); - break; - case 'uri': - case 'url': - $result = $request->getUri()->__toString(); - break; - case 'target': - $result = $request->getRequestTarget(); - break; - case 'req_version': - $result = $request->getProtocolVersion(); - break; - case 'res_version': - $result = $response ? $response->getProtocolVersion() : 'NULL'; - break; - case 'host': - $result = $request->getHeaderLine('Host'); - break; - case 'hostname': - $result = \gethostname(); - break; - case 'code': - $result = $response ? $response->getStatusCode() : 'NULL'; - break; - case 'phrase': - $result = $response ? $response->getReasonPhrase() : 'NULL'; - break; - case 'error': - $result = $error ? $error->getMessage() : 'NULL'; - break; - default: - // handle prefixed dynamic headers - if (\strpos($matches[1], 'req_header_') === 0) { - $result = $request->getHeaderLine(\substr($matches[1], 11)); - } elseif (\strpos($matches[1], 'res_header_') === 0) { - $result = $response ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL'; - } - } - $cache[$matches[1]] = $result; - return $result; - }, $this->template); - } - /** - * Get headers from message as string - */ - private function headers(MessageInterface $message) : string - { - $result = ''; - foreach ($message->getHeaders() as $name => $values) { - $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; - } - return \trim($result); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/MessageFormatterInterface.php b/dependencies/guzzlehttp/guzzle/src/MessageFormatterInterface.php deleted file mode 100644 index f45b3dc..0000000 --- a/dependencies/guzzlehttp/guzzle/src/MessageFormatterInterface.php +++ /dev/null @@ -1,17 +0,0 @@ -withCookieHeader($request); - return $handler($request, $options)->then(static function (ResponseInterface $response) use($cookieJar, $request) : ResponseInterface { - $cookieJar->extractCookies($request, $response); - return $response; - }); - }; - }; - } - /** - * Middleware that throws exceptions for 4xx or 5xx responses when the - * "http_errors" request option is set to true. - * - * @param BodySummarizerInterface|null $bodySummarizer The body summarizer to use in exception messages. - * - * @return callable(callable): callable Returns a function that accepts the next handler. - */ - public static function httpErrors(BodySummarizerInterface $bodySummarizer = null) : callable - { - return static function (callable $handler) use($bodySummarizer) : callable { - return static function ($request, array $options) use($handler, $bodySummarizer) { - if (empty($options['http_errors'])) { - return $handler($request, $options); - } - return $handler($request, $options)->then(static function (ResponseInterface $response) use($request, $bodySummarizer) { - $code = $response->getStatusCode(); - if ($code < 400) { - return $response; - } - throw RequestException::create($request, $response, null, [], $bodySummarizer); - }); - }; - }; - } - /** - * Middleware that pushes history data to an ArrayAccess container. - * - * @param array|\ArrayAccess $container Container to hold the history (by reference). - * - * @return callable(callable): callable Returns a function that accepts the next handler. - * - * @throws \InvalidArgumentException if container is not an array or ArrayAccess. - */ - public static function history(&$container) : callable - { - if (!\is_array($container) && !$container instanceof \ArrayAccess) { - throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); - } - return static function (callable $handler) use(&$container) : callable { - return static function (RequestInterface $request, array $options) use($handler, &$container) { - return $handler($request, $options)->then(static function ($value) use($request, &$container, $options) { - $container[] = ['request' => $request, 'response' => $value, 'error' => null, 'options' => $options]; - return $value; - }, static function ($reason) use($request, &$container, $options) { - $container[] = ['request' => $request, 'response' => null, 'error' => $reason, 'options' => $options]; - return P\Create::rejectionFor($reason); - }); - }; - }; - } - /** - * Middleware that invokes a callback before and after sending a request. - * - * The provided listener cannot modify or alter the response. It simply - * "taps" into the chain to be notified before returning the promise. The - * before listener accepts a request and options array, and the after - * listener accepts a request, options array, and response promise. - * - * @param callable $before Function to invoke before forwarding the request. - * @param callable $after Function invoked after forwarding. - * - * @return callable Returns a function that accepts the next handler. - */ - public static function tap(callable $before = null, callable $after = null) : callable - { - return static function (callable $handler) use($before, $after) : callable { - return static function (RequestInterface $request, array $options) use($handler, $before, $after) { - if ($before) { - $before($request, $options); - } - $response = $handler($request, $options); - if ($after) { - $after($request, $options, $response); - } - return $response; - }; - }; - } - /** - * Middleware that handles request redirects. - * - * @return callable Returns a function that accepts the next handler. - */ - public static function redirect() : callable - { - return static function (callable $handler) : RedirectMiddleware { - return new RedirectMiddleware($handler); - }; - } - /** - * Middleware that retries requests based on the boolean result of - * invoking the provided "decider" function. - * - * If no delay function is provided, a simple implementation of exponential - * backoff will be utilized. - * - * @param callable $decider Function that accepts the number of retries, - * a request, [response], and [exception] and - * returns true if the request is to be retried. - * @param callable $delay Function that accepts the number of retries and - * returns the number of milliseconds to delay. - * - * @return callable Returns a function that accepts the next handler. - */ - public static function retry(callable $decider, callable $delay = null) : callable - { - return static function (callable $handler) use($decider, $delay) : RetryMiddleware { - return new RetryMiddleware($decider, $handler, $delay); - }; - } - /** - * Middleware that logs requests, responses, and errors using a message - * formatter. - * - * @phpstan-param \Psr\Log\LogLevel::* $logLevel Level at which to log requests. - * - * @param LoggerInterface $logger Logs messages. - * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings. - * @param string $logLevel Level at which to log requests. - * - * @return callable Returns a function that accepts the next handler. - */ - public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info') : callable - { - // To be compatible with Guzzle 7.1.x we need to allow users to pass a MessageFormatter - if (!$formatter instanceof MessageFormatter && !$formatter instanceof MessageFormatterInterface) { - throw new \LogicException(\sprintf('Argument 2 to %s::log() must be of type %s', self::class, MessageFormatterInterface::class)); - } - return static function (callable $handler) use($logger, $formatter, $logLevel) : callable { - return static function (RequestInterface $request, array $options = []) use($handler, $logger, $formatter, $logLevel) { - return $handler($request, $options)->then(static function ($response) use($logger, $request, $formatter, $logLevel) : ResponseInterface { - $message = $formatter->format($request, $response); - $logger->log($logLevel, $message); - return $response; - }, static function ($reason) use($logger, $request, $formatter) : PromiseInterface { - $response = $reason instanceof RequestException ? $reason->getResponse() : null; - $message = $formatter->format($request, $response, P\Create::exceptionFor($reason)); - $logger->error($message); - return P\Create::rejectionFor($reason); - }); - }; - }; - } - /** - * This middleware adds a default content-type if possible, a default - * content-length or transfer-encoding header, and the expect header. - */ - public static function prepareBody() : callable - { - return static function (callable $handler) : PrepareBodyMiddleware { - return new PrepareBodyMiddleware($handler); - }; - } - /** - * Middleware that applies a map function to the request before passing to - * the next handler. - * - * @param callable $fn Function that accepts a RequestInterface and returns - * a RequestInterface. - */ - public static function mapRequest(callable $fn) : callable - { - return static function (callable $handler) use($fn) : callable { - return static function (RequestInterface $request, array $options) use($handler, $fn) { - return $handler($fn($request), $options); - }; - }; - } - /** - * Middleware that applies a map function to the resolved promise's - * response. - * - * @param callable $fn Function that accepts a ResponseInterface and - * returns a ResponseInterface. - */ - public static function mapResponse(callable $fn) : callable - { - return static function (callable $handler) use($fn) : callable { - return static function (RequestInterface $request, array $options) use($handler, $fn) { - return $handler($request, $options)->then($fn); - }; - }; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Pool.php b/dependencies/guzzlehttp/guzzle/src/Pool.php deleted file mode 100644 index ba66083..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Pool.php +++ /dev/null @@ -1,116 +0,0 @@ - $rfn) { - if ($rfn instanceof RequestInterface) { - (yield $key => $client->sendAsync($rfn, $opts)); - } elseif (\is_callable($rfn)) { - (yield $key => $rfn($opts)); - } else { - throw new \InvalidArgumentException('Each value yielded by the iterator must be a Psr7\\Http\\Message\\RequestInterface or a callable that returns a promise that fulfills with a Psr7\\Message\\Http\\ResponseInterface object.'); - } - } - }; - $this->each = new EachPromise($requests(), $config); - } - /** - * Get promise - */ - public function promise() : PromiseInterface - { - return $this->each->promise(); - } - /** - * Sends multiple requests concurrently and returns an array of responses - * and exceptions that uses the same ordering as the provided requests. - * - * IMPORTANT: This method keeps every request and response in memory, and - * as such, is NOT recommended when sending a large number or an - * indeterminate number of requests concurrently. - * - * @param ClientInterface $client Client used to send the requests - * @param array|\Iterator $requests Requests to send concurrently. - * @param array $options Passes through the options available in - * {@see \GuzzleHttp\Pool::__construct} - * - * @return array Returns an array containing the response or an exception - * in the same order that the requests were sent. - * - * @throws \InvalidArgumentException if the event format is incorrect. - */ - public static function batch(ClientInterface $client, $requests, array $options = []) : array - { - $res = []; - self::cmpCallback($options, 'fulfilled', $res); - self::cmpCallback($options, 'rejected', $res); - $pool = new static($client, $requests, $options); - $pool->promise()->wait(); - \ksort($res); - return $res; - } - /** - * Execute callback(s) - */ - private static function cmpCallback(array &$options, string $name, array &$results) : void - { - if (!isset($options[$name])) { - $options[$name] = static function ($v, $k) use(&$results) { - $results[$k] = $v; - }; - } else { - $currentFn = $options[$name]; - $options[$name] = static function ($v, $k) use(&$results, $currentFn) { - $currentFn($v, $k); - $results[$k] = $v; - }; - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/dependencies/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php deleted file mode 100644 index c0cd419..0000000 --- a/dependencies/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php +++ /dev/null @@ -1,86 +0,0 @@ -nextHandler = $nextHandler; - } - public function __invoke(RequestInterface $request, array $options) : PromiseInterface - { - $fn = $this->nextHandler; - // Don't do anything if the request has no body. - if ($request->getBody()->getSize() === 0) { - return $fn($request, $options); - } - $modify = []; - // Add a default content-type if possible. - if (!$request->hasHeader('Content-Type')) { - if ($uri = $request->getBody()->getMetadata('uri')) { - if (\is_string($uri) && ($type = Psr7\MimeType::fromFilename($uri))) { - $modify['set_headers']['Content-Type'] = $type; - } - } - } - // Add a default content-length or transfer-encoding header. - if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding')) { - $size = $request->getBody()->getSize(); - if ($size !== null) { - $modify['set_headers']['Content-Length'] = $size; - } else { - $modify['set_headers']['Transfer-Encoding'] = 'chunked'; - } - } - // Add the expect header if needed. - $this->addExpectHeader($request, $options, $modify); - return $fn(Psr7\Utils::modifyRequest($request, $modify), $options); - } - /** - * Add expect header - */ - private function addExpectHeader(RequestInterface $request, array $options, array &$modify) : void - { - // Determine if the Expect header should be used - if ($request->hasHeader('Expect')) { - return; - } - $expect = $options['expect'] ?? null; - // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 - if ($expect === \false || $request->getProtocolVersion() < 1.1) { - return; - } - // The expect header is unconditionally enabled - if ($expect === \true) { - $modify['set_headers']['Expect'] = '100-Continue'; - return; - } - // By default, send the expect header when the payload is > 1mb - if ($expect === null) { - $expect = 1048576; - } - // Always add if the body cannot be rewound, the size cannot be - // determined, or the size is greater than the cutoff threshold - $body = $request->getBody(); - $size = $body->getSize(); - if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { - $modify['set_headers']['Expect'] = '100-Continue'; - } - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/RedirectMiddleware.php b/dependencies/guzzlehttp/guzzle/src/RedirectMiddleware.php deleted file mode 100644 index bc85045..0000000 --- a/dependencies/guzzlehttp/guzzle/src/RedirectMiddleware.php +++ /dev/null @@ -1,162 +0,0 @@ - 5, 'protocols' => ['http', 'https'], 'strict' => \false, 'referer' => \false, 'track_redirects' => \false]; - /** - * @var callable(RequestInterface, array): PromiseInterface - */ - private $nextHandler; - /** - * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. - */ - public function __construct(callable $nextHandler) - { - $this->nextHandler = $nextHandler; - } - public function __invoke(RequestInterface $request, array $options) : PromiseInterface - { - $fn = $this->nextHandler; - if (empty($options['allow_redirects'])) { - return $fn($request, $options); - } - if ($options['allow_redirects'] === \true) { - $options['allow_redirects'] = self::$defaultSettings; - } elseif (!\is_array($options['allow_redirects'])) { - throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); - } else { - // Merge the default settings with the provided settings - $options['allow_redirects'] += self::$defaultSettings; - } - if (empty($options['allow_redirects']['max'])) { - return $fn($request, $options); - } - return $fn($request, $options)->then(function (ResponseInterface $response) use($request, $options) { - return $this->checkRedirect($request, $options, $response); - }); - } - /** - * @return ResponseInterface|PromiseInterface - */ - public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) - { - if (\strpos((string) $response->getStatusCode(), '3') !== 0 || !$response->hasHeader('Location')) { - return $response; - } - $this->guardMax($request, $response, $options); - $nextRequest = $this->modifyRequest($request, $options, $response); - // If authorization is handled by curl, unset it if URI is cross-origin. - if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && \defined('\\CURLOPT_HTTPAUTH')) { - unset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD]); - } - if (isset($options['allow_redirects']['on_redirect'])) { - $options['allow_redirects']['on_redirect']($request, $response, $nextRequest->getUri()); - } - $promise = $this($nextRequest, $options); - // Add headers to be able to track history of redirects. - if (!empty($options['allow_redirects']['track_redirects'])) { - return $this->withTracking($promise, (string) $nextRequest->getUri(), $response->getStatusCode()); - } - return $promise; - } - /** - * Enable tracking on promise. - */ - private function withTracking(PromiseInterface $promise, string $uri, int $statusCode) : PromiseInterface - { - return $promise->then(static function (ResponseInterface $response) use($uri, $statusCode) { - // Note that we are pushing to the front of the list as this - // would be an earlier response than what is currently present - // in the history header. - $historyHeader = $response->getHeader(self::HISTORY_HEADER); - $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); - \array_unshift($historyHeader, $uri); - \array_unshift($statusHeader, (string) $statusCode); - return $response->withHeader(self::HISTORY_HEADER, $historyHeader)->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); - }); - } - /** - * Check for too many redirects. - * - * @throws TooManyRedirectsException Too many redirects. - */ - private function guardMax(RequestInterface $request, ResponseInterface $response, array &$options) : void - { - $current = $options['__redirect_count'] ?? 0; - $options['__redirect_count'] = $current + 1; - $max = $options['allow_redirects']['max']; - if ($options['__redirect_count'] > $max) { - throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request, $response); - } - } - public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response) : RequestInterface - { - // Request modifications to apply. - $modify = []; - $protocols = $options['allow_redirects']['protocols']; - // Use a GET request if this is an entity enclosing request and we are - // not forcing RFC compliance, but rather emulating what all browsers - // would do. - $statusCode = $response->getStatusCode(); - if ($statusCode == 303 || $statusCode <= 302 && !$options['allow_redirects']['strict']) { - $safeMethods = ['GET', 'HEAD', 'OPTIONS']; - $requestMethod = $request->getMethod(); - $modify['method'] = \in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET'; - $modify['body'] = ''; - } - $uri = self::redirectUri($request, $response, $protocols); - if (isset($options['idn_conversion']) && $options['idn_conversion'] !== \false) { - $idnOptions = $options['idn_conversion'] === \true ? \IDNA_DEFAULT : $options['idn_conversion']; - $uri = Utils::idnUriConvert($uri, $idnOptions); - } - $modify['uri'] = $uri; - Psr7\Message::rewindBody($request); - // Add the Referer header if it is told to do so and only - // add the header if we are not redirecting from https to http. - if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme()) { - $uri = $request->getUri()->withUserInfo(''); - $modify['set_headers']['Referer'] = (string) $uri; - } else { - $modify['remove_headers'][] = 'Referer'; - } - // Remove Authorization and Cookie headers if URI is cross-origin. - if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { - $modify['remove_headers'][] = 'Authorization'; - $modify['remove_headers'][] = 'Cookie'; - } - return Psr7\Utils::modifyRequest($request, $modify); - } - /** - * Set the appropriate URL on the request based on the location header. - */ - private static function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols) : UriInterface - { - $location = Psr7\UriResolver::resolve($request->getUri(), new Psr7\Uri($response->getHeaderLine('Location'))); - // Ensure that the redirect URI is allowed based on the protocols. - if (!\in_array($location->getScheme(), $protocols)) { - throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); - } - return $location; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/RequestOptions.php b/dependencies/guzzlehttp/guzzle/src/RequestOptions.php deleted file mode 100644 index d449329..0000000 --- a/dependencies/guzzlehttp/guzzle/src/RequestOptions.php +++ /dev/null @@ -1,246 +0,0 @@ -decider = $decider; - $this->nextHandler = $nextHandler; - $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; - } - /** - * Default exponential backoff delay function. - * - * @return int milliseconds. - */ - public static function exponentialDelay(int $retries) : int - { - return (int) 2 ** ($retries - 1) * 1000; - } - public function __invoke(RequestInterface $request, array $options) : PromiseInterface - { - if (!isset($options['retries'])) { - $options['retries'] = 0; - } - $fn = $this->nextHandler; - return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options)); - } - /** - * Execute fulfilled closure - */ - private function onFulfilled(RequestInterface $request, array $options) : callable - { - return function ($value) use($request, $options) { - if (!($this->decider)($options['retries'], $request, $value, null)) { - return $value; - } - return $this->doRetry($request, $options, $value); - }; - } - /** - * Execute rejected closure - */ - private function onRejected(RequestInterface $req, array $options) : callable - { - return function ($reason) use($req, $options) { - if (!($this->decider)($options['retries'], $req, null, $reason)) { - return P\Create::rejectionFor($reason); - } - return $this->doRetry($req, $options); - }; - } - private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) : PromiseInterface - { - $options['delay'] = ($this->delay)(++$options['retries'], $response, $request); - return $this($request, $options); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/TransferStats.php b/dependencies/guzzlehttp/guzzle/src/TransferStats.php deleted file mode 100644 index eb62745..0000000 --- a/dependencies/guzzlehttp/guzzle/src/TransferStats.php +++ /dev/null @@ -1,114 +0,0 @@ -request = $request; - $this->response = $response; - $this->transferTime = $transferTime; - $this->handlerErrorData = $handlerErrorData; - $this->handlerStats = $handlerStats; - } - public function getRequest() : RequestInterface - { - return $this->request; - } - /** - * Returns the response that was received (if any). - */ - public function getResponse() : ?ResponseInterface - { - return $this->response; - } - /** - * Returns true if a response was received. - */ - public function hasResponse() : bool - { - return $this->response !== null; - } - /** - * Gets handler specific error data. - * - * This might be an exception, a integer representing an error code, or - * anything else. Relying on this value assumes that you know what handler - * you are using. - * - * @return mixed - */ - public function getHandlerErrorData() - { - return $this->handlerErrorData; - } - /** - * Get the effective URI the request was sent to. - */ - public function getEffectiveUri() : UriInterface - { - return $this->request->getUri(); - } - /** - * Get the estimated time the request was being transferred by the handler. - * - * @return float|null Time in seconds. - */ - public function getTransferTime() : ?float - { - return $this->transferTime; - } - /** - * Gets an array of all of the handler specific transfer data. - */ - public function getHandlerStats() : array - { - return $this->handlerStats; - } - /** - * Get a specific handler statistic from the handler by name. - * - * @param string $stat Handler specific transfer stat to retrieve. - * - * @return mixed|null - */ - public function getHandlerStat(string $stat) - { - return $this->handlerStats[$stat] ?? null; - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/Utils.php b/dependencies/guzzlehttp/guzzle/src/Utils.php deleted file mode 100644 index 22c4e72..0000000 --- a/dependencies/guzzlehttp/guzzle/src/Utils.php +++ /dev/null @@ -1,340 +0,0 @@ -getHost()) { - $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); - if ($asciiHost === \false) { - $errorBitSet = $info['errors'] ?? 0; - $errorConstants = \array_filter(\array_keys(\get_defined_constants()), static function (string $name) : bool { - return \substr($name, 0, 11) === 'IDNA_ERROR_'; - }); - $errors = []; - foreach ($errorConstants as $errorConstant) { - if ($errorBitSet & \constant($errorConstant)) { - $errors[] = $errorConstant; - } - } - $errorMessage = 'IDN conversion failed'; - if ($errors) { - $errorMessage .= ' (errors: ' . \implode(', ', $errors) . ')'; - } - throw new InvalidArgumentException($errorMessage); - } - if ($uri->getHost() !== $asciiHost) { - // Replace URI only if the ASCII version is different - $uri = $uri->withHost($asciiHost); - } - } - return $uri; - } - /** - * @internal - */ - public static function getenv(string $name) : ?string - { - if (isset($_SERVER[$name])) { - return (string) $_SERVER[$name]; - } - if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== \false && $value !== null) { - return (string) $value; - } - return null; - } - /** - * @return string|false - */ - private static function idnToAsci(string $domain, int $options, ?array &$info = []) - { - if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) { - return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); - } - throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old'); - } -} diff --git a/dependencies/guzzlehttp/guzzle/src/functions.php b/dependencies/guzzlehttp/guzzle/src/functions.php deleted file mode 100644 index 6abe6e6..0000000 --- a/dependencies/guzzlehttp/guzzle/src/functions.php +++ /dev/null @@ -1,158 +0,0 @@ -then(function ($v) { echo $v; }); - * - * @param callable $generatorFn Generator function to wrap into a promise. - * - * @return Promise - * - * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration - */ -final class Coroutine implements PromiseInterface -{ - /** - * @var PromiseInterface|null - */ - private $currentPromise; - /** - * @var Generator - */ - private $generator; - /** - * @var Promise - */ - private $result; - public function __construct(callable $generatorFn) - { - $this->generator = $generatorFn(); - $this->result = new Promise(function () { - while (isset($this->currentPromise)) { - $this->currentPromise->wait(); - } - }); - try { - $this->nextCoroutine($this->generator->current()); - } catch (\Exception $exception) { - $this->result->reject($exception); - } catch (Throwable $throwable) { - $this->result->reject($throwable); - } - } - /** - * Create a new coroutine. - * - * @return self - */ - public static function of(callable $generatorFn) - { - return new self($generatorFn); - } - public function then(callable $onFulfilled = null, callable $onRejected = null) - { - return $this->result->then($onFulfilled, $onRejected); - } - public function otherwise(callable $onRejected) - { - return $this->result->otherwise($onRejected); - } - public function wait($unwrap = \true) - { - return $this->result->wait($unwrap); - } - public function getState() - { - return $this->result->getState(); - } - public function resolve($value) - { - $this->result->resolve($value); - } - public function reject($reason) - { - $this->result->reject($reason); - } - public function cancel() - { - $this->currentPromise->cancel(); - $this->result->cancel(); - } - private function nextCoroutine($yielded) - { - $this->currentPromise = Create::promiseFor($yielded)->then([$this, '_handleSuccess'], [$this, '_handleFailure']); - } - /** - * @internal - */ - public function _handleSuccess($value) - { - unset($this->currentPromise); - try { - $next = $this->generator->send($value); - if ($this->generator->valid()) { - $this->nextCoroutine($next); - } else { - $this->result->resolve($value); - } - } catch (Exception $exception) { - $this->result->reject($exception); - } catch (Throwable $throwable) { - $this->result->reject($throwable); - } - } - /** - * @internal - */ - public function _handleFailure($reason) - { - unset($this->currentPromise); - try { - $nextYield = $this->generator->throw(Create::exceptionFor($reason)); - // The throw was caught, so keep iterating on the coroutine - $this->nextCoroutine($nextYield); - } catch (Exception $exception) { - $this->result->reject($exception); - } catch (Throwable $throwable) { - $this->result->reject($throwable); - } - } -} diff --git a/dependencies/guzzlehttp/promises/src/Create.php b/dependencies/guzzlehttp/promises/src/Create.php deleted file mode 100644 index 9ccae49..0000000 --- a/dependencies/guzzlehttp/promises/src/Create.php +++ /dev/null @@ -1,75 +0,0 @@ -then([$promise, 'resolve'], [$promise, 'reject']); - return $promise; - } - return new FulfilledPromise($value); - } - /** - * Creates a rejected promise for a reason if the reason is not a promise. - * If the provided reason is a promise, then it is returned as-is. - * - * @param mixed $reason Promise or reason. - * - * @return PromiseInterface - */ - public static function rejectionFor($reason) - { - if ($reason instanceof PromiseInterface) { - return $reason; - } - return new RejectedPromise($reason); - } - /** - * Create an exception for a rejected promise value. - * - * @param mixed $reason - * - * @return \Exception|\Throwable - */ - public static function exceptionFor($reason) - { - if ($reason instanceof \Exception || $reason instanceof \Throwable) { - return $reason; - } - return new RejectionException($reason); - } - /** - * Returns an iterator for the given value. - * - * @param mixed $value - * - * @return \Iterator - */ - public static function iterFor($value) - { - if ($value instanceof \Iterator) { - return $value; - } - if (\is_array($value)) { - return new \ArrayIterator($value); - } - return new \ArrayIterator([$value]); - } -} diff --git a/dependencies/guzzlehttp/promises/src/Each.php b/dependencies/guzzlehttp/promises/src/Each.php deleted file mode 100644 index 85a1e3e..0000000 --- a/dependencies/guzzlehttp/promises/src/Each.php +++ /dev/null @@ -1,66 +0,0 @@ - $onFulfilled, 'rejected' => $onRejected]))->promise(); - } - /** - * Like of, but only allows a certain number of outstanding promises at any - * given time. - * - * $concurrency may be an integer or a function that accepts the number of - * pending promises and returns a numeric concurrency limit value to allow - * for dynamic a concurrency size. - * - * @param mixed $iterable - * @param int|callable $concurrency - * @param callable $onFulfilled - * @param callable $onRejected - * - * @return PromiseInterface - */ - public static function ofLimit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) - { - return (new EachPromise($iterable, ['fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency]))->promise(); - } - /** - * Like limit, but ensures that no promise in the given $iterable argument - * is rejected. If any promise is rejected, then the aggregate promise is - * rejected with the encountered rejection. - * - * @param mixed $iterable - * @param int|callable $concurrency - * @param callable $onFulfilled - * - * @return PromiseInterface - */ - public static function ofLimitAll($iterable, $concurrency, callable $onFulfilled = null) - { - return self::ofLimit($iterable, $concurrency, $onFulfilled, function ($reason, $idx, PromiseInterface $aggregate) { - $aggregate->reject($reason); - }); - } -} diff --git a/dependencies/guzzlehttp/promises/src/EachPromise.php b/dependencies/guzzlehttp/promises/src/EachPromise.php deleted file mode 100644 index bf3c94d..0000000 --- a/dependencies/guzzlehttp/promises/src/EachPromise.php +++ /dev/null @@ -1,200 +0,0 @@ -iterable = Create::iterFor($iterable); - if (isset($config['concurrency'])) { - $this->concurrency = $config['concurrency']; - } - if (isset($config['fulfilled'])) { - $this->onFulfilled = $config['fulfilled']; - } - if (isset($config['rejected'])) { - $this->onRejected = $config['rejected']; - } - } - /** @psalm-suppress InvalidNullableReturnType */ - public function promise() - { - if ($this->aggregate) { - return $this->aggregate; - } - try { - $this->createPromise(); - /** @psalm-assert Promise $this->aggregate */ - $this->iterable->rewind(); - $this->refillPending(); - } catch (\Throwable $e) { - $this->aggregate->reject($e); - } catch (\Exception $e) { - $this->aggregate->reject($e); - } - /** - * @psalm-suppress NullableReturnStatement - * @phpstan-ignore-next-line - */ - return $this->aggregate; - } - private function createPromise() - { - $this->mutex = \false; - $this->aggregate = new Promise(function () { - if ($this->checkIfFinished()) { - return; - } - \reset($this->pending); - // Consume a potentially fluctuating list of promises while - // ensuring that indexes are maintained (precluding array_shift). - while ($promise = \current($this->pending)) { - \next($this->pending); - $promise->wait(); - if (Is::settled($this->aggregate)) { - return; - } - } - }); - // Clear the references when the promise is resolved. - $clearFn = function () { - $this->iterable = $this->concurrency = $this->pending = null; - $this->onFulfilled = $this->onRejected = null; - $this->nextPendingIndex = 0; - }; - $this->aggregate->then($clearFn, $clearFn); - } - private function refillPending() - { - if (!$this->concurrency) { - // Add all pending promises. - while ($this->addPending() && $this->advanceIterator()) { - } - return; - } - // Add only up to N pending promises. - $concurrency = \is_callable($this->concurrency) ? \call_user_func($this->concurrency, \count($this->pending)) : $this->concurrency; - $concurrency = \max($concurrency - \count($this->pending), 0); - // Concurrency may be set to 0 to disallow new promises. - if (!$concurrency) { - return; - } - // Add the first pending promise. - $this->addPending(); - // Note this is special handling for concurrency=1 so that we do - // not advance the iterator after adding the first promise. This - // helps work around issues with generators that might not have the - // next value to yield until promise callbacks are called. - while (--$concurrency && $this->advanceIterator() && $this->addPending()) { - } - } - private function addPending() - { - if (!$this->iterable || !$this->iterable->valid()) { - return \false; - } - $promise = Create::promiseFor($this->iterable->current()); - $key = $this->iterable->key(); - // Iterable keys may not be unique, so we use a counter to - // guarantee uniqueness - $idx = $this->nextPendingIndex++; - $this->pending[$idx] = $promise->then(function ($value) use($idx, $key) { - if ($this->onFulfilled) { - \call_user_func($this->onFulfilled, $value, $key, $this->aggregate); - } - $this->step($idx); - }, function ($reason) use($idx, $key) { - if ($this->onRejected) { - \call_user_func($this->onRejected, $reason, $key, $this->aggregate); - } - $this->step($idx); - }); - return \true; - } - private function advanceIterator() - { - // Place a lock on the iterator so that we ensure to not recurse, - // preventing fatal generator errors. - if ($this->mutex) { - return \false; - } - $this->mutex = \true; - try { - $this->iterable->next(); - $this->mutex = \false; - return \true; - } catch (\Throwable $e) { - $this->aggregate->reject($e); - $this->mutex = \false; - return \false; - } catch (\Exception $e) { - $this->aggregate->reject($e); - $this->mutex = \false; - return \false; - } - } - private function step($idx) - { - // If the promise was already resolved, then ignore this step. - if (Is::settled($this->aggregate)) { - return; - } - unset($this->pending[$idx]); - // Only refill pending promises if we are not locked, preventing the - // EachPromise to recursively invoke the provided iterator, which - // cause a fatal error: "Cannot resume an already running generator" - if ($this->advanceIterator() && !$this->checkIfFinished()) { - // Add more pending promises if possible. - $this->refillPending(); - } - } - private function checkIfFinished() - { - if (!$this->pending && !$this->iterable->valid()) { - // Resolve the promise if there's nothing left to do. - $this->aggregate->resolve(null); - return \true; - } - return \false; - } -} diff --git a/dependencies/guzzlehttp/promises/src/FulfilledPromise.php b/dependencies/guzzlehttp/promises/src/FulfilledPromise.php deleted file mode 100644 index 2eb2509..0000000 --- a/dependencies/guzzlehttp/promises/src/FulfilledPromise.php +++ /dev/null @@ -1,69 +0,0 @@ -value = $value; - } - public function then(callable $onFulfilled = null, callable $onRejected = null) - { - // Return itself if there is no onFulfilled function. - if (!$onFulfilled) { - return $this; - } - $queue = Utils::queue(); - $p = new Promise([$queue, 'run']); - $value = $this->value; - $queue->add(static function () use($p, $value, $onFulfilled) { - if (Is::pending($p)) { - try { - $p->resolve($onFulfilled($value)); - } catch (\Throwable $e) { - $p->reject($e); - } catch (\Exception $e) { - $p->reject($e); - } - } - }); - return $p; - } - public function otherwise(callable $onRejected) - { - return $this->then(null, $onRejected); - } - public function wait($unwrap = \true, $defaultDelivery = null) - { - return $unwrap ? $this->value : null; - } - public function getState() - { - return self::FULFILLED; - } - public function resolve($value) - { - if ($value !== $this->value) { - throw new \LogicException("Cannot resolve a fulfilled promise"); - } - } - public function reject($reason) - { - throw new \LogicException("Cannot reject a fulfilled promise"); - } - public function cancel() - { - // pass - } -} diff --git a/dependencies/guzzlehttp/promises/src/Is.php b/dependencies/guzzlehttp/promises/src/Is.php deleted file mode 100644 index 269663f..0000000 --- a/dependencies/guzzlehttp/promises/src/Is.php +++ /dev/null @@ -1,43 +0,0 @@ -getState() === PromiseInterface::PENDING; - } - /** - * Returns true if a promise is fulfilled or rejected. - * - * @return bool - */ - public static function settled(PromiseInterface $promise) - { - return $promise->getState() !== PromiseInterface::PENDING; - } - /** - * Returns true if a promise is fulfilled. - * - * @return bool - */ - public static function fulfilled(PromiseInterface $promise) - { - return $promise->getState() === PromiseInterface::FULFILLED; - } - /** - * Returns true if a promise is rejected. - * - * @return bool - */ - public static function rejected(PromiseInterface $promise) - { - return $promise->getState() === PromiseInterface::REJECTED; - } -} diff --git a/dependencies/guzzlehttp/promises/src/Promise.php b/dependencies/guzzlehttp/promises/src/Promise.php deleted file mode 100644 index 99772fc..0000000 --- a/dependencies/guzzlehttp/promises/src/Promise.php +++ /dev/null @@ -1,237 +0,0 @@ -waitFn = $waitFn; - $this->cancelFn = $cancelFn; - } - public function then(callable $onFulfilled = null, callable $onRejected = null) - { - if ($this->state === self::PENDING) { - $p = new Promise(null, [$this, 'cancel']); - $this->handlers[] = [$p, $onFulfilled, $onRejected]; - $p->waitList = $this->waitList; - $p->waitList[] = $this; - return $p; - } - // Return a fulfilled promise and immediately invoke any callbacks. - if ($this->state === self::FULFILLED) { - $promise = Create::promiseFor($this->result); - return $onFulfilled ? $promise->then($onFulfilled) : $promise; - } - // It's either cancelled or rejected, so return a rejected promise - // and immediately invoke any callbacks. - $rejection = Create::rejectionFor($this->result); - return $onRejected ? $rejection->then(null, $onRejected) : $rejection; - } - public function otherwise(callable $onRejected) - { - return $this->then(null, $onRejected); - } - public function wait($unwrap = \true) - { - $this->waitIfPending(); - if ($this->result instanceof PromiseInterface) { - return $this->result->wait($unwrap); - } - if ($unwrap) { - if ($this->state === self::FULFILLED) { - return $this->result; - } - // It's rejected so "unwrap" and throw an exception. - throw Create::exceptionFor($this->result); - } - } - public function getState() - { - return $this->state; - } - public function cancel() - { - if ($this->state !== self::PENDING) { - return; - } - $this->waitFn = $this->waitList = null; - if ($this->cancelFn) { - $fn = $this->cancelFn; - $this->cancelFn = null; - try { - $fn(); - } catch (\Throwable $e) { - $this->reject($e); - } catch (\Exception $e) { - $this->reject($e); - } - } - // Reject the promise only if it wasn't rejected in a then callback. - /** @psalm-suppress RedundantCondition */ - if ($this->state === self::PENDING) { - $this->reject(new CancellationException('Promise has been cancelled')); - } - } - public function resolve($value) - { - $this->settle(self::FULFILLED, $value); - } - public function reject($reason) - { - $this->settle(self::REJECTED, $reason); - } - private function settle($state, $value) - { - if ($this->state !== self::PENDING) { - // Ignore calls with the same resolution. - if ($state === $this->state && $value === $this->result) { - return; - } - throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}"); - } - if ($value === $this) { - throw new \LogicException('Cannot fulfill or reject a promise with itself'); - } - // Clear out the state of the promise but stash the handlers. - $this->state = $state; - $this->result = $value; - $handlers = $this->handlers; - $this->handlers = null; - $this->waitList = $this->waitFn = null; - $this->cancelFn = null; - if (!$handlers) { - return; - } - // If the value was not a settled promise or a thenable, then resolve - // it in the task queue using the correct ID. - if (!\is_object($value) || !\method_exists($value, 'then')) { - $id = $state === self::FULFILLED ? 1 : 2; - // It's a success, so resolve the handlers in the queue. - Utils::queue()->add(static function () use($id, $value, $handlers) { - foreach ($handlers as $handler) { - self::callHandler($id, $value, $handler); - } - }); - } elseif ($value instanceof Promise && Is::pending($value)) { - // We can just merge our handlers onto the next promise. - $value->handlers = \array_merge($value->handlers, $handlers); - } else { - // Resolve the handlers when the forwarded promise is resolved. - $value->then(static function ($value) use($handlers) { - foreach ($handlers as $handler) { - self::callHandler(1, $value, $handler); - } - }, static function ($reason) use($handlers) { - foreach ($handlers as $handler) { - self::callHandler(2, $reason, $handler); - } - }); - } - } - /** - * Call a stack of handlers using a specific callback index and value. - * - * @param int $index 1 (resolve) or 2 (reject). - * @param mixed $value Value to pass to the callback. - * @param array $handler Array of handler data (promise and callbacks). - */ - private static function callHandler($index, $value, array $handler) - { - /** @var PromiseInterface $promise */ - $promise = $handler[0]; - // The promise may have been cancelled or resolved before placing - // this thunk in the queue. - if (Is::settled($promise)) { - return; - } - try { - if (isset($handler[$index])) { - /* - * If $f throws an exception, then $handler will be in the exception - * stack trace. Since $handler contains a reference to the callable - * itself we get a circular reference. We clear the $handler - * here to avoid that memory leak. - */ - $f = $handler[$index]; - unset($handler); - $promise->resolve($f($value)); - } elseif ($index === 1) { - // Forward resolution values as-is. - $promise->resolve($value); - } else { - // Forward rejections down the chain. - $promise->reject($value); - } - } catch (\Throwable $reason) { - $promise->reject($reason); - } catch (\Exception $reason) { - $promise->reject($reason); - } - } - private function waitIfPending() - { - if ($this->state !== self::PENDING) { - return; - } elseif ($this->waitFn) { - $this->invokeWaitFn(); - } elseif ($this->waitList) { - $this->invokeWaitList(); - } else { - // If there's no wait function, then reject the promise. - $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.'); - } - Utils::queue()->run(); - /** @psalm-suppress RedundantCondition */ - if ($this->state === self::PENDING) { - $this->reject('Invoking the wait callback did not resolve the promise'); - } - } - private function invokeWaitFn() - { - try { - $wfn = $this->waitFn; - $this->waitFn = null; - $wfn(\true); - } catch (\Exception $reason) { - if ($this->state === self::PENDING) { - // The promise has not been resolved yet, so reject the promise - // with the exception. - $this->reject($reason); - } else { - // The promise was already resolved, so there's a problem in - // the application. - throw $reason; - } - } - } - private function invokeWaitList() - { - $waitList = $this->waitList; - $this->waitList = null; - foreach ($waitList as $result) { - do { - $result->waitIfPending(); - $result = $result->result; - } while ($result instanceof Promise); - if ($result instanceof PromiseInterface) { - $result->wait(\false); - } - } - } -} diff --git a/dependencies/guzzlehttp/promises/src/PromiseInterface.php b/dependencies/guzzlehttp/promises/src/PromiseInterface.php deleted file mode 100644 index af536f6..0000000 --- a/dependencies/guzzlehttp/promises/src/PromiseInterface.php +++ /dev/null @@ -1,87 +0,0 @@ -reason = $reason; - } - public function then(callable $onFulfilled = null, callable $onRejected = null) - { - // If there's no onRejected callback then just return self. - if (!$onRejected) { - return $this; - } - $queue = Utils::queue(); - $reason = $this->reason; - $p = new Promise([$queue, 'run']); - $queue->add(static function () use($p, $reason, $onRejected) { - if (Is::pending($p)) { - try { - // Return a resolved promise if onRejected does not throw. - $p->resolve($onRejected($reason)); - } catch (\Throwable $e) { - // onRejected threw, so return a rejected promise. - $p->reject($e); - } catch (\Exception $e) { - // onRejected threw, so return a rejected promise. - $p->reject($e); - } - } - }); - return $p; - } - public function otherwise(callable $onRejected) - { - return $this->then(null, $onRejected); - } - public function wait($unwrap = \true, $defaultDelivery = null) - { - if ($unwrap) { - throw Create::exceptionFor($this->reason); - } - return null; - } - public function getState() - { - return self::REJECTED; - } - public function resolve($value) - { - throw new \LogicException("Cannot resolve a rejected promise"); - } - public function reject($reason) - { - if ($reason !== $this->reason) { - throw new \LogicException("Cannot reject a rejected promise"); - } - } - public function cancel() - { - // pass - } -} diff --git a/dependencies/guzzlehttp/promises/src/RejectionException.php b/dependencies/guzzlehttp/promises/src/RejectionException.php deleted file mode 100644 index e003be3..0000000 --- a/dependencies/guzzlehttp/promises/src/RejectionException.php +++ /dev/null @@ -1,40 +0,0 @@ -reason = $reason; - $message = 'The promise was rejected'; - if ($description) { - $message .= ' with reason: ' . $description; - } elseif (\is_string($reason) || \is_object($reason) && \method_exists($reason, '__toString')) { - $message .= ' with reason: ' . $this->reason; - } elseif ($reason instanceof \JsonSerializable) { - $message .= ' with reason: ' . \json_encode($this->reason, \JSON_PRETTY_PRINT); - } - parent::__construct($message); - } - /** - * Returns the rejection reason. - * - * @return mixed - */ - public function getReason() - { - return $this->reason; - } -} diff --git a/dependencies/guzzlehttp/promises/src/TaskQueue.php b/dependencies/guzzlehttp/promises/src/TaskQueue.php deleted file mode 100644 index 7b70b90..0000000 --- a/dependencies/guzzlehttp/promises/src/TaskQueue.php +++ /dev/null @@ -1,62 +0,0 @@ -run(); - */ -class TaskQueue implements TaskQueueInterface -{ - private $enableShutdown = \true; - private $queue = []; - public function __construct($withShutdown = \true) - { - if ($withShutdown) { - \register_shutdown_function(function () { - if ($this->enableShutdown) { - // Only run the tasks if an E_ERROR didn't occur. - $err = \error_get_last(); - if (!$err || $err['type'] ^ \E_ERROR) { - $this->run(); - } - } - }); - } - } - public function isEmpty() - { - return !$this->queue; - } - public function add(callable $task) - { - $this->queue[] = $task; - } - public function run() - { - while ($task = \array_shift($this->queue)) { - /** @var callable $task */ - $task(); - } - } - /** - * The task queue will be run and exhausted by default when the process - * exits IFF the exit is not the result of a PHP E_ERROR error. - * - * You can disable running the automatic shutdown of the queue by calling - * this function. If you disable the task queue shutdown process, then you - * MUST either run the task queue (as a result of running your event loop - * or manually using the run() method) or wait on each outstanding promise. - * - * Note: This shutdown will occur before any destructors are triggered. - */ - public function disableShutdown() - { - $this->enableShutdown = \false; - } -} diff --git a/dependencies/guzzlehttp/promises/src/TaskQueueInterface.php b/dependencies/guzzlehttp/promises/src/TaskQueueInterface.php deleted file mode 100644 index e21306d..0000000 --- a/dependencies/guzzlehttp/promises/src/TaskQueueInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * while ($eventLoop->isRunning()) { - * GuzzleHttp\Promise\Utils::queue()->run(); - * } - * - * - * @param TaskQueueInterface $assign Optionally specify a new queue instance. - * - * @return TaskQueueInterface - */ - public static function queue(TaskQueueInterface $assign = null) - { - static $queue; - if ($assign) { - $queue = $assign; - } elseif (!$queue) { - $queue = new TaskQueue(); - } - return $queue; - } - /** - * Adds a function to run in the task queue when it is next `run()` and - * returns a promise that is fulfilled or rejected with the result. - * - * @param callable $task Task function to run. - * - * @return PromiseInterface - */ - public static function task(callable $task) - { - $queue = self::queue(); - $promise = new Promise([$queue, 'run']); - $queue->add(function () use($task, $promise) { - try { - if (Is::pending($promise)) { - $promise->resolve($task()); - } - } catch (\Throwable $e) { - $promise->reject($e); - } catch (\Exception $e) { - $promise->reject($e); - } - }); - return $promise; - } - /** - * Synchronously waits on a promise to resolve and returns an inspection - * state array. - * - * Returns a state associative array containing a "state" key mapping to a - * valid promise state. If the state of the promise is "fulfilled", the - * array will contain a "value" key mapping to the fulfilled value of the - * promise. If the promise is rejected, the array will contain a "reason" - * key mapping to the rejection reason of the promise. - * - * @param PromiseInterface $promise Promise or value. - * - * @return array - */ - public static function inspect(PromiseInterface $promise) - { - try { - return ['state' => PromiseInterface::FULFILLED, 'value' => $promise->wait()]; - } catch (RejectionException $e) { - return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; - } catch (\Throwable $e) { - return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; - } catch (\Exception $e) { - return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; - } - } - /** - * Waits on all of the provided promises, but does not unwrap rejected - * promises as thrown exception. - * - * Returns an array of inspection state arrays. - * - * @see inspect for the inspection state array format. - * - * @param PromiseInterface[] $promises Traversable of promises to wait upon. - * - * @return array - */ - public static function inspectAll($promises) - { - $results = []; - foreach ($promises as $key => $promise) { - $results[$key] = self::inspect($promise); - } - return $results; - } - /** - * Waits on all of the provided promises and returns the fulfilled values. - * - * Returns an array that contains the value of each promise (in the same - * order the promises were provided). An exception is thrown if any of the - * promises are rejected. - * - * @param iterable $promises Iterable of PromiseInterface objects to wait on. - * - * @return array - * - * @throws \Exception on error - * @throws \Throwable on error in PHP >=7 - */ - public static function unwrap($promises) - { - $results = []; - foreach ($promises as $key => $promise) { - $results[$key] = $promise->wait(); - } - return $results; - } - /** - * Given an array of promises, return a promise that is fulfilled when all - * the items in the array are fulfilled. - * - * The promise's fulfillment value is an array with fulfillment values at - * respective positions to the original array. If any promise in the array - * rejects, the returned promise is rejected with the rejection reason. - * - * @param mixed $promises Promises or values. - * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. - * - * @return PromiseInterface - */ - public static function all($promises, $recursive = \false) - { - $results = []; - $promise = Each::of($promises, function ($value, $idx) use(&$results) { - $results[$idx] = $value; - }, function ($reason, $idx, Promise $aggregate) { - $aggregate->reject($reason); - })->then(function () use(&$results) { - \ksort($results); - return $results; - }); - if (\true === $recursive) { - $promise = $promise->then(function ($results) use($recursive, &$promises) { - foreach ($promises as $promise) { - if (Is::pending($promise)) { - return self::all($promises, $recursive); - } - } - return $results; - }); - } - return $promise; - } - /** - * Initiate a competitive race between multiple promises or values (values - * will become immediately fulfilled promises). - * - * When count amount of promises have been fulfilled, the returned promise - * is fulfilled with an array that contains the fulfillment values of the - * winners in order of resolution. - * - * This promise is rejected with a {@see AggregateException} if the number - * of fulfilled promises is less than the desired $count. - * - * @param int $count Total number of promises. - * @param mixed $promises Promises or values. - * - * @return PromiseInterface - */ - public static function some($count, $promises) - { - $results = []; - $rejections = []; - return Each::of($promises, function ($value, $idx, PromiseInterface $p) use(&$results, $count) { - if (Is::settled($p)) { - return; - } - $results[$idx] = $value; - if (\count($results) >= $count) { - $p->resolve(null); - } - }, function ($reason) use(&$rejections) { - $rejections[] = $reason; - })->then(function () use(&$results, &$rejections, $count) { - if (\count($results) !== $count) { - throw new AggregateException('Not enough promises to fulfill count', $rejections); - } - \ksort($results); - return \array_values($results); - }); - } - /** - * Like some(), with 1 as count. However, if the promise fulfills, the - * fulfillment value is not an array of 1 but the value directly. - * - * @param mixed $promises Promises or values. - * - * @return PromiseInterface - */ - public static function any($promises) - { - return self::some(1, $promises)->then(function ($values) { - return $values[0]; - }); - } - /** - * Returns a promise that is fulfilled when all of the provided promises have - * been fulfilled or rejected. - * - * The returned promise is fulfilled with an array of inspection state arrays. - * - * @see inspect for the inspection state array format. - * - * @param mixed $promises Promises or values. - * - * @return PromiseInterface - */ - public static function settle($promises) - { - $results = []; - return Each::of($promises, function ($value, $idx) use(&$results) { - $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; - }, function ($reason, $idx) use(&$results) { - $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; - })->then(function () use(&$results) { - \ksort($results); - return $results; - }); - } -} diff --git a/dependencies/guzzlehttp/promises/src/functions.php b/dependencies/guzzlehttp/promises/src/functions.php deleted file mode 100644 index 9c8f580..0000000 --- a/dependencies/guzzlehttp/promises/src/functions.php +++ /dev/null @@ -1,334 +0,0 @@ - - * while ($eventLoop->isRunning()) { - * GuzzleHttp\Promise\queue()->run(); - * } - * - * - * @param TaskQueueInterface $assign Optionally specify a new queue instance. - * - * @return TaskQueueInterface - * - * @deprecated queue will be removed in guzzlehttp/promises:2.0. Use Utils::queue instead. - */ -function queue(TaskQueueInterface $assign = null) -{ - return Utils::queue($assign); -} -/** - * Adds a function to run in the task queue when it is next `run()` and returns - * a promise that is fulfilled or rejected with the result. - * - * @param callable $task Task function to run. - * - * @return PromiseInterface - * - * @deprecated task will be removed in guzzlehttp/promises:2.0. Use Utils::task instead. - */ -function task(callable $task) -{ - return Utils::task($task); -} -/** - * Creates a promise for a value if the value is not a promise. - * - * @param mixed $value Promise or value. - * - * @return PromiseInterface - * - * @deprecated promise_for will be removed in guzzlehttp/promises:2.0. Use Create::promiseFor instead. - */ -function promise_for($value) -{ - return Create::promiseFor($value); -} -/** - * Creates a rejected promise for a reason if the reason is not a promise. If - * the provided reason is a promise, then it is returned as-is. - * - * @param mixed $reason Promise or reason. - * - * @return PromiseInterface - * - * @deprecated rejection_for will be removed in guzzlehttp/promises:2.0. Use Create::rejectionFor instead. - */ -function rejection_for($reason) -{ - return Create::rejectionFor($reason); -} -/** - * Create an exception for a rejected promise value. - * - * @param mixed $reason - * - * @return \Exception|\Throwable - * - * @deprecated exception_for will be removed in guzzlehttp/promises:2.0. Use Create::exceptionFor instead. - */ -function exception_for($reason) -{ - return Create::exceptionFor($reason); -} -/** - * Returns an iterator for the given value. - * - * @param mixed $value - * - * @return \Iterator - * - * @deprecated iter_for will be removed in guzzlehttp/promises:2.0. Use Create::iterFor instead. - */ -function iter_for($value) -{ - return Create::iterFor($value); -} -/** - * Synchronously waits on a promise to resolve and returns an inspection state - * array. - * - * Returns a state associative array containing a "state" key mapping to a - * valid promise state. If the state of the promise is "fulfilled", the array - * will contain a "value" key mapping to the fulfilled value of the promise. If - * the promise is rejected, the array will contain a "reason" key mapping to - * the rejection reason of the promise. - * - * @param PromiseInterface $promise Promise or value. - * - * @return array - * - * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspect instead. - */ -function inspect(PromiseInterface $promise) -{ - return Utils::inspect($promise); -} -/** - * Waits on all of the provided promises, but does not unwrap rejected promises - * as thrown exception. - * - * Returns an array of inspection state arrays. - * - * @see inspect for the inspection state array format. - * - * @param PromiseInterface[] $promises Traversable of promises to wait upon. - * - * @return array - * - * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspectAll instead. - */ -function inspect_all($promises) -{ - return Utils::inspectAll($promises); -} -/** - * Waits on all of the provided promises and returns the fulfilled values. - * - * Returns an array that contains the value of each promise (in the same order - * the promises were provided). An exception is thrown if any of the promises - * are rejected. - * - * @param iterable $promises Iterable of PromiseInterface objects to wait on. - * - * @return array - * - * @throws \Exception on error - * @throws \Throwable on error in PHP >=7 - * - * @deprecated unwrap will be removed in guzzlehttp/promises:2.0. Use Utils::unwrap instead. - */ -function unwrap($promises) -{ - return Utils::unwrap($promises); -} -/** - * Given an array of promises, return a promise that is fulfilled when all the - * items in the array are fulfilled. - * - * The promise's fulfillment value is an array with fulfillment values at - * respective positions to the original array. If any promise in the array - * rejects, the returned promise is rejected with the rejection reason. - * - * @param mixed $promises Promises or values. - * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. - * - * @return PromiseInterface - * - * @deprecated all will be removed in guzzlehttp/promises:2.0. Use Utils::all instead. - */ -function all($promises, $recursive = \false) -{ - return Utils::all($promises, $recursive); -} -/** - * Initiate a competitive race between multiple promises or values (values will - * become immediately fulfilled promises). - * - * When count amount of promises have been fulfilled, the returned promise is - * fulfilled with an array that contains the fulfillment values of the winners - * in order of resolution. - * - * This promise is rejected with a {@see AggregateException} if the number of - * fulfilled promises is less than the desired $count. - * - * @param int $count Total number of promises. - * @param mixed $promises Promises or values. - * - * @return PromiseInterface - * - * @deprecated some will be removed in guzzlehttp/promises:2.0. Use Utils::some instead. - */ -function some($count, $promises) -{ - return Utils::some($count, $promises); -} -/** - * Like some(), with 1 as count. However, if the promise fulfills, the - * fulfillment value is not an array of 1 but the value directly. - * - * @param mixed $promises Promises or values. - * - * @return PromiseInterface - * - * @deprecated any will be removed in guzzlehttp/promises:2.0. Use Utils::any instead. - */ -function any($promises) -{ - return Utils::any($promises); -} -/** - * Returns a promise that is fulfilled when all of the provided promises have - * been fulfilled or rejected. - * - * The returned promise is fulfilled with an array of inspection state arrays. - * - * @see inspect for the inspection state array format. - * - * @param mixed $promises Promises or values. - * - * @return PromiseInterface - * - * @deprecated settle will be removed in guzzlehttp/promises:2.0. Use Utils::settle instead. - */ -function settle($promises) -{ - return Utils::settle($promises); -} -/** - * Given an iterator that yields promises or values, returns a promise that is - * fulfilled with a null value when the iterator has been consumed or the - * aggregate promise has been fulfilled or rejected. - * - * $onFulfilled is a function that accepts the fulfilled value, iterator index, - * and the aggregate promise. The callback can invoke any necessary side - * effects and choose to resolve or reject the aggregate if needed. - * - * $onRejected is a function that accepts the rejection reason, iterator index, - * and the aggregate promise. The callback can invoke any necessary side - * effects and choose to resolve or reject the aggregate if needed. - * - * @param mixed $iterable Iterator or array to iterate over. - * @param callable $onFulfilled - * @param callable $onRejected - * - * @return PromiseInterface - * - * @deprecated each will be removed in guzzlehttp/promises:2.0. Use Each::of instead. - */ -function each($iterable, callable $onFulfilled = null, callable $onRejected = null) -{ - return Each::of($iterable, $onFulfilled, $onRejected); -} -/** - * Like each, but only allows a certain number of outstanding promises at any - * given time. - * - * $concurrency may be an integer or a function that accepts the number of - * pending promises and returns a numeric concurrency limit value to allow for - * dynamic a concurrency size. - * - * @param mixed $iterable - * @param int|callable $concurrency - * @param callable $onFulfilled - * @param callable $onRejected - * - * @return PromiseInterface - * - * @deprecated each_limit will be removed in guzzlehttp/promises:2.0. Use Each::ofLimit instead. - */ -function each_limit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) -{ - return Each::ofLimit($iterable, $concurrency, $onFulfilled, $onRejected); -} -/** - * Like each_limit, but ensures that no promise in the given $iterable argument - * is rejected. If any promise is rejected, then the aggregate promise is - * rejected with the encountered rejection. - * - * @param mixed $iterable - * @param int|callable $concurrency - * @param callable $onFulfilled - * - * @return PromiseInterface - * - * @deprecated each_limit_all will be removed in guzzlehttp/promises:2.0. Use Each::ofLimitAll instead. - */ -function each_limit_all($iterable, $concurrency, callable $onFulfilled = null) -{ - return Each::ofLimitAll($iterable, $concurrency, $onFulfilled); -} -/** - * Returns true if a promise is fulfilled. - * - * @return bool - * - * @deprecated is_fulfilled will be removed in guzzlehttp/promises:2.0. Use Is::fulfilled instead. - */ -function is_fulfilled(PromiseInterface $promise) -{ - return Is::fulfilled($promise); -} -/** - * Returns true if a promise is rejected. - * - * @return bool - * - * @deprecated is_rejected will be removed in guzzlehttp/promises:2.0. Use Is::rejected instead. - */ -function is_rejected(PromiseInterface $promise) -{ - return Is::rejected($promise); -} -/** - * Returns true if a promise is fulfilled or rejected. - * - * @return bool - * - * @deprecated is_settled will be removed in guzzlehttp/promises:2.0. Use Is::settled instead. - */ -function is_settled(PromiseInterface $promise) -{ - return Is::settled($promise); -} -/** - * Create a new coroutine. - * - * @see Coroutine - * - * @return PromiseInterface - * - * @deprecated coroutine will be removed in guzzlehttp/promises:2.0. Use Coroutine::of instead. - */ -function coroutine(callable $generatorFn) -{ - return Coroutine::of($generatorFn); -} diff --git a/dependencies/guzzlehttp/promises/src/functions_include.php b/dependencies/guzzlehttp/promises/src/functions_include.php deleted file mode 100644 index b9258d2..0000000 --- a/dependencies/guzzlehttp/promises/src/functions_include.php +++ /dev/null @@ -1,8 +0,0 @@ -addStream($stream); - } - } - public function __toString() : string - { - try { - $this->rewind(); - return $this->getContents(); - } catch (\Throwable $e) { - if (\PHP_VERSION_ID >= 70400) { - throw $e; - } - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); - return ''; - } - } - /** - * Add a stream to the AppendStream - * - * @param StreamInterface $stream Stream to append. Must be readable. - * - * @throws \InvalidArgumentException if the stream is not readable - */ - public function addStream(StreamInterface $stream) : void - { - if (!$stream->isReadable()) { - throw new \InvalidArgumentException('Each stream must be readable'); - } - // The stream is only seekable if all streams are seekable - if (!$stream->isSeekable()) { - $this->seekable = \false; - } - $this->streams[] = $stream; - } - public function getContents() : string - { - return Utils::copyToString($this); - } - /** - * Closes each attached stream. - */ - public function close() : void - { - $this->pos = $this->current = 0; - $this->seekable = \true; - foreach ($this->streams as $stream) { - $stream->close(); - } - $this->streams = []; - } - /** - * Detaches each attached stream. - * - * Returns null as it's not clear which underlying stream resource to return. - */ - public function detach() - { - $this->pos = $this->current = 0; - $this->seekable = \true; - foreach ($this->streams as $stream) { - $stream->detach(); - } - $this->streams = []; - return null; - } - public function tell() : int - { - return $this->pos; - } - /** - * Tries to calculate the size by adding the size of each stream. - * - * If any of the streams do not return a valid number, then the size of the - * append stream cannot be determined and null is returned. - */ - public function getSize() : ?int - { - $size = 0; - foreach ($this->streams as $stream) { - $s = $stream->getSize(); - if ($s === null) { - return null; - } - $size += $s; - } - return $size; - } - public function eof() : bool - { - return !$this->streams || $this->current >= \count($this->streams) - 1 && $this->streams[$this->current]->eof(); - } - public function rewind() : void - { - $this->seek(0); - } - /** - * Attempts to seek to the given position. Only supports SEEK_SET. - */ - public function seek($offset, $whence = \SEEK_SET) : void - { - if (!$this->seekable) { - throw new \RuntimeException('This AppendStream is not seekable'); - } elseif ($whence !== \SEEK_SET) { - throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); - } - $this->pos = $this->current = 0; - // Rewind each stream - foreach ($this->streams as $i => $stream) { - try { - $stream->rewind(); - } catch (\Exception $e) { - throw new \RuntimeException('Unable to seek stream ' . $i . ' of the AppendStream', 0, $e); - } - } - // Seek to the actual position by reading from each stream - while ($this->pos < $offset && !$this->eof()) { - $result = $this->read(\min(8096, $offset - $this->pos)); - if ($result === '') { - break; - } - } - } - /** - * Reads from all of the appended streams until the length is met or EOF. - */ - public function read($length) : string - { - $buffer = ''; - $total = \count($this->streams) - 1; - $remaining = $length; - $progressToNext = \false; - while ($remaining > 0) { - // Progress to the next stream if needed. - if ($progressToNext || $this->streams[$this->current]->eof()) { - $progressToNext = \false; - if ($this->current === $total) { - break; - } - ++$this->current; - } - $result = $this->streams[$this->current]->read($remaining); - if ($result === '') { - $progressToNext = \true; - continue; - } - $buffer .= $result; - $remaining = $length - \strlen($buffer); - } - $this->pos += \strlen($buffer); - return $buffer; - } - public function isReadable() : bool - { - return \true; - } - public function isWritable() : bool - { - return \false; - } - public function isSeekable() : bool - { - return $this->seekable; - } - public function write($string) : int - { - throw new \RuntimeException('Cannot write to an AppendStream'); - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - return $key ? null : []; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/BufferStream.php b/dependencies/guzzlehttp/psr7/src/BufferStream.php deleted file mode 100644 index 9b7d4e6..0000000 --- a/dependencies/guzzlehttp/psr7/src/BufferStream.php +++ /dev/null @@ -1,121 +0,0 @@ -hwm = $hwm; - } - public function __toString() : string - { - return $this->getContents(); - } - public function getContents() : string - { - $buffer = $this->buffer; - $this->buffer = ''; - return $buffer; - } - public function close() : void - { - $this->buffer = ''; - } - public function detach() - { - $this->close(); - return null; - } - public function getSize() : ?int - { - return \strlen($this->buffer); - } - public function isReadable() : bool - { - return \true; - } - public function isWritable() : bool - { - return \true; - } - public function isSeekable() : bool - { - return \false; - } - public function rewind() : void - { - $this->seek(0); - } - public function seek($offset, $whence = \SEEK_SET) : void - { - throw new \RuntimeException('Cannot seek a BufferStream'); - } - public function eof() : bool - { - return \strlen($this->buffer) === 0; - } - public function tell() : int - { - throw new \RuntimeException('Cannot determine the position of a BufferStream'); - } - /** - * Reads data from the buffer. - */ - public function read($length) : string - { - $currentLength = \strlen($this->buffer); - if ($length >= $currentLength) { - // No need to slice the buffer because we don't have enough data. - $result = $this->buffer; - $this->buffer = ''; - } else { - // Slice up the result to provide a subset of the buffer. - $result = \substr($this->buffer, 0, $length); - $this->buffer = \substr($this->buffer, $length); - } - return $result; - } - /** - * Writes data to the buffer. - */ - public function write($string) : int - { - $this->buffer .= $string; - if (\strlen($this->buffer) >= $this->hwm) { - return 0; - } - return \strlen($string); - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - if ($key === 'hwm') { - return $this->hwm; - } - return $key ? null : []; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/CachingStream.php b/dependencies/guzzlehttp/psr7/src/CachingStream.php deleted file mode 100644 index d9973c7..0000000 --- a/dependencies/guzzlehttp/psr7/src/CachingStream.php +++ /dev/null @@ -1,125 +0,0 @@ -remoteStream = $stream; - $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); - } - public function getSize() : ?int - { - $remoteSize = $this->remoteStream->getSize(); - if (null === $remoteSize) { - return null; - } - return \max($this->stream->getSize(), $remoteSize); - } - public function rewind() : void - { - $this->seek(0); - } - public function seek($offset, $whence = \SEEK_SET) : void - { - if ($whence === \SEEK_SET) { - $byte = $offset; - } elseif ($whence === \SEEK_CUR) { - $byte = $offset + $this->tell(); - } elseif ($whence === \SEEK_END) { - $size = $this->remoteStream->getSize(); - if ($size === null) { - $size = $this->cacheEntireStream(); - } - $byte = $size + $offset; - } else { - throw new \InvalidArgumentException('Invalid whence'); - } - $diff = $byte - $this->stream->getSize(); - if ($diff > 0) { - // Read the remoteStream until we have read in at least the amount - // of bytes requested, or we reach the end of the file. - while ($diff > 0 && !$this->remoteStream->eof()) { - $this->read($diff); - $diff = $byte - $this->stream->getSize(); - } - } else { - // We can just do a normal seek since we've already seen this byte. - $this->stream->seek($byte); - } - } - public function read($length) : string - { - // Perform a regular read on any previously read data from the buffer - $data = $this->stream->read($length); - $remaining = $length - \strlen($data); - // More data was requested so read from the remote stream - if ($remaining) { - // If data was written to the buffer in a position that would have - // been filled from the remote stream, then we must skip bytes on - // the remote stream to emulate overwriting bytes from that - // position. This mimics the behavior of other PHP stream wrappers. - $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); - if ($this->skipReadBytes) { - $len = \strlen($remoteData); - $remoteData = \substr($remoteData, $this->skipReadBytes); - $this->skipReadBytes = \max(0, $this->skipReadBytes - $len); - } - $data .= $remoteData; - $this->stream->write($remoteData); - } - return $data; - } - public function write($string) : int - { - // When appending to the end of the currently read stream, you'll want - // to skip bytes from being read from the remote stream to emulate - // other stream wrappers. Basically replacing bytes of data of a fixed - // length. - $overflow = \strlen($string) + $this->tell() - $this->remoteStream->tell(); - if ($overflow > 0) { - $this->skipReadBytes += $overflow; - } - return $this->stream->write($string); - } - public function eof() : bool - { - return $this->stream->eof() && $this->remoteStream->eof(); - } - /** - * Close both the remote stream and buffer stream - */ - public function close() : void - { - $this->remoteStream->close(); - $this->stream->close(); - } - private function cacheEntireStream() : int - { - $target = new FnStream(['write' => 'strlen']); - Utils::copyToStream($this, $target); - return $this->tell(); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/DroppingStream.php b/dependencies/guzzlehttp/psr7/src/DroppingStream.php deleted file mode 100644 index bfbcb81..0000000 --- a/dependencies/guzzlehttp/psr7/src/DroppingStream.php +++ /dev/null @@ -1,40 +0,0 @@ -stream = $stream; - $this->maxLength = $maxLength; - } - public function write($string) : int - { - $diff = $this->maxLength - $this->stream->getSize(); - // Begin returning 0 when the underlying stream is too large. - if ($diff <= 0) { - return 0; - } - // Write the stream or a subset of the stream if needed. - if (\strlen($string) < $diff) { - return $this->stream->write($string); - } - return $this->stream->write(\substr($string, 0, $diff)); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Exception/MalformedUriException.php b/dependencies/guzzlehttp/psr7/src/Exception/MalformedUriException.php deleted file mode 100644 index 7a08f2a..0000000 --- a/dependencies/guzzlehttp/psr7/src/Exception/MalformedUriException.php +++ /dev/null @@ -1,12 +0,0 @@ - */ - private $methods; - /** - * @param array $methods Hash of method name to a callable. - */ - public function __construct(array $methods) - { - $this->methods = $methods; - // Create the functions on the class - foreach ($methods as $name => $fn) { - $this->{'_fn_' . $name} = $fn; - } - } - /** - * Lazily determine which methods are not implemented. - * - * @throws \BadMethodCallException - */ - public function __get(string $name) : void - { - throw new \BadMethodCallException(\str_replace('_fn_', '', $name) . '() is not implemented in the FnStream'); - } - /** - * The close method is called on the underlying stream only if possible. - */ - public function __destruct() - { - if (isset($this->_fn_close)) { - \call_user_func($this->_fn_close); - } - } - /** - * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. - * - * @throws \LogicException - */ - public function __wakeup() : void - { - throw new \LogicException('FnStream should never be unserialized'); - } - /** - * Adds custom functionality to an underlying stream by intercepting - * specific method calls. - * - * @param StreamInterface $stream Stream to decorate - * @param array $methods Hash of method name to a closure - * - * @return FnStream - */ - public static function decorate(StreamInterface $stream, array $methods) - { - // If any of the required methods were not provided, then simply - // proxy to the decorated stream. - foreach (\array_diff(self::SLOTS, \array_keys($methods)) as $diff) { - /** @var callable $callable */ - $callable = [$stream, $diff]; - $methods[$diff] = $callable; - } - return new self($methods); - } - public function __toString() : string - { - try { - return \call_user_func($this->_fn___toString); - } catch (\Throwable $e) { - if (\PHP_VERSION_ID >= 70400) { - throw $e; - } - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); - return ''; - } - } - public function close() : void - { - \call_user_func($this->_fn_close); - } - public function detach() - { - return \call_user_func($this->_fn_detach); - } - public function getSize() : ?int - { - return \call_user_func($this->_fn_getSize); - } - public function tell() : int - { - return \call_user_func($this->_fn_tell); - } - public function eof() : bool - { - return \call_user_func($this->_fn_eof); - } - public function isSeekable() : bool - { - return \call_user_func($this->_fn_isSeekable); - } - public function rewind() : void - { - \call_user_func($this->_fn_rewind); - } - public function seek($offset, $whence = \SEEK_SET) : void - { - \call_user_func($this->_fn_seek, $offset, $whence); - } - public function isWritable() : bool - { - return \call_user_func($this->_fn_isWritable); - } - public function write($string) : int - { - return \call_user_func($this->_fn_write, $string); - } - public function isReadable() : bool - { - return \call_user_func($this->_fn_isReadable); - } - public function read($length) : string - { - return \call_user_func($this->_fn_read, $length); - } - public function getContents() : string - { - return \call_user_func($this->_fn_getContents); - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - return \call_user_func($this->_fn_getMetadata, $key); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Header.php b/dependencies/guzzlehttp/psr7/src/Header.php deleted file mode 100644 index e39a65a..0000000 --- a/dependencies/guzzlehttp/psr7/src/Header.php +++ /dev/null @@ -1,117 +0,0 @@ -]+>|[^=]+/', $kvp, $matches)) { - $m = $matches[0]; - if (isset($m[1])) { - $part[\trim($m[0], $trimmed)] = \trim($m[1], $trimmed); - } else { - $part[] = \trim($m[0], $trimmed); - } - } - } - if ($part) { - $params[] = $part; - } - } - } - return $params; - } - /** - * Converts an array of header values that may contain comma separated - * headers into an array of headers with no comma separated values. - * - * @param string|array $header Header to normalize. - * - * @deprecated Use self::splitList() instead. - */ - public static function normalize($header) : array - { - $result = []; - foreach ((array) $header as $value) { - foreach (self::splitList($value) as $parsed) { - $result[] = $parsed; - } - } - return $result; - } - /** - * Splits a HTTP header defined to contain a comma-separated list into - * each individual value. Empty values will be removed. - * - * Example headers include 'accept', 'cache-control' and 'if-none-match'. - * - * This method must not be used to parse headers that are not defined as - * a list, such as 'user-agent' or 'set-cookie'. - * - * @param string|string[] $values Header value as returned by MessageInterface::getHeader() - * - * @return string[] - */ - public static function splitList($values) : array - { - if (!\is_array($values)) { - $values = [$values]; - } - $result = []; - foreach ($values as $value) { - if (!\is_string($value)) { - throw new \TypeError('$header must either be a string or an array containing strings.'); - } - $v = ''; - $isQuoted = \false; - $isEscaped = \false; - for ($i = 0, $max = \strlen($value); $i < $max; ++$i) { - if ($isEscaped) { - $v .= $value[$i]; - $isEscaped = \false; - continue; - } - if (!$isQuoted && $value[$i] === ',') { - $v = \trim($v); - if ($v !== '') { - $result[] = $v; - } - $v = ''; - continue; - } - if ($isQuoted && $value[$i] === '\\') { - $isEscaped = \true; - $v .= $value[$i]; - continue; - } - if ($value[$i] === '"') { - $isQuoted = !$isQuoted; - $v .= $value[$i]; - continue; - } - $v .= $value[$i]; - } - $v = \trim($v); - if ($v !== '') { - $result[] = $v; - } - } - return $result; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/HttpFactory.php b/dependencies/guzzlehttp/psr7/src/HttpFactory.php deleted file mode 100644 index af2e31a..0000000 --- a/dependencies/guzzlehttp/psr7/src/HttpFactory.php +++ /dev/null @@ -1,76 +0,0 @@ -getSize(); - } - return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); - } - public function createStream(string $content = '') : StreamInterface - { - return Utils::streamFor($content); - } - public function createStreamFromFile(string $file, string $mode = 'r') : StreamInterface - { - try { - $resource = Utils::tryFopen($file, $mode); - } catch (\RuntimeException $e) { - if ('' === $mode || \false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], \true)) { - throw new \InvalidArgumentException(\sprintf('Invalid file opening mode "%s"', $mode), 0, $e); - } - throw $e; - } - return Utils::streamFor($resource); - } - public function createStreamFromResource($resource) : StreamInterface - { - return Utils::streamFor($resource); - } - public function createServerRequest(string $method, $uri, array $serverParams = []) : ServerRequestInterface - { - if (empty($method)) { - if (!empty($serverParams['REQUEST_METHOD'])) { - $method = $serverParams['REQUEST_METHOD']; - } else { - throw new \InvalidArgumentException('Cannot determine HTTP method'); - } - } - return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); - } - public function createResponse(int $code = 200, string $reasonPhrase = '') : ResponseInterface - { - return new Response($code, [], null, '1.1', $reasonPhrase); - } - public function createRequest(string $method, $uri) : RequestInterface - { - return new Request($method, $uri); - } - public function createUri(string $uri = '') : UriInterface - { - return new Uri($uri); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/InflateStream.php b/dependencies/guzzlehttp/psr7/src/InflateStream.php deleted file mode 100644 index d0ee0f6..0000000 --- a/dependencies/guzzlehttp/psr7/src/InflateStream.php +++ /dev/null @@ -1,33 +0,0 @@ - 15 + 32]); - $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/LazyOpenStream.php b/dependencies/guzzlehttp/psr7/src/LazyOpenStream.php deleted file mode 100644 index 26b908d..0000000 --- a/dependencies/guzzlehttp/psr7/src/LazyOpenStream.php +++ /dev/null @@ -1,41 +0,0 @@ -filename = $filename; - $this->mode = $mode; - // unsetting the property forces the first access to go through - // __get(). - unset($this->stream); - } - /** - * Creates the underlying stream lazily when required. - */ - protected function createStream() : StreamInterface - { - return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/LimitStream.php b/dependencies/guzzlehttp/psr7/src/LimitStream.php deleted file mode 100644 index 35b4690..0000000 --- a/dependencies/guzzlehttp/psr7/src/LimitStream.php +++ /dev/null @@ -1,128 +0,0 @@ -stream = $stream; - $this->setLimit($limit); - $this->setOffset($offset); - } - public function eof() : bool - { - // Always return true if the underlying stream is EOF - if ($this->stream->eof()) { - return \true; - } - // No limit and the underlying stream is not at EOF - if ($this->limit === -1) { - return \false; - } - return $this->stream->tell() >= $this->offset + $this->limit; - } - /** - * Returns the size of the limited subset of data - */ - public function getSize() : ?int - { - if (null === ($length = $this->stream->getSize())) { - return null; - } elseif ($this->limit === -1) { - return $length - $this->offset; - } else { - return \min($this->limit, $length - $this->offset); - } - } - /** - * Allow for a bounded seek on the read limited stream - */ - public function seek($offset, $whence = \SEEK_SET) : void - { - if ($whence !== \SEEK_SET || $offset < 0) { - throw new \RuntimeException(\sprintf('Cannot seek to offset %s with whence %s', $offset, $whence)); - } - $offset += $this->offset; - if ($this->limit !== -1) { - if ($offset > $this->offset + $this->limit) { - $offset = $this->offset + $this->limit; - } - } - $this->stream->seek($offset); - } - /** - * Give a relative tell() - */ - public function tell() : int - { - return $this->stream->tell() - $this->offset; - } - /** - * Set the offset to start limiting from - * - * @param int $offset Offset to seek to and begin byte limiting from - * - * @throws \RuntimeException if the stream cannot be seeked. - */ - public function setOffset(int $offset) : void - { - $current = $this->stream->tell(); - if ($current !== $offset) { - // If the stream cannot seek to the offset position, then read to it - if ($this->stream->isSeekable()) { - $this->stream->seek($offset); - } elseif ($current > $offset) { - throw new \RuntimeException("Could not seek to stream offset {$offset}"); - } else { - $this->stream->read($offset - $current); - } - } - $this->offset = $offset; - } - /** - * Set the limit of bytes that the decorator allows to be read from the - * stream. - * - * @param int $limit Number of bytes to allow to be read from the stream. - * Use -1 for no limit. - */ - public function setLimit(int $limit) : void - { - $this->limit = $limit; - } - public function read($length) : string - { - if ($this->limit === -1) { - return $this->stream->read($length); - } - // Check if the current position is less than the total allowed - // bytes + original offset - $remaining = $this->offset + $this->limit - $this->stream->tell(); - if ($remaining > 0) { - // Only return the amount of requested data, ensuring that the byte - // limit is not exceeded - return $this->stream->read(\min($remaining, $length)); - } - return ''; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Message.php b/dependencies/guzzlehttp/psr7/src/Message.php deleted file mode 100644 index caafd57..0000000 --- a/dependencies/guzzlehttp/psr7/src/Message.php +++ /dev/null @@ -1,189 +0,0 @@ -getMethod() . ' ' . $message->getRequestTarget()) . ' HTTP/' . $message->getProtocolVersion(); - if (!$message->hasHeader('host')) { - $msg .= "\r\nHost: " . $message->getUri()->getHost(); - } - } elseif ($message instanceof ResponseInterface) { - $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' . $message->getStatusCode() . ' ' . $message->getReasonPhrase(); - } else { - throw new \InvalidArgumentException('Unknown message type'); - } - foreach ($message->getHeaders() as $name => $values) { - if (\is_string($name) && \strtolower($name) === 'set-cookie') { - foreach ($values as $value) { - $msg .= "\r\n{$name}: " . $value; - } - } else { - $msg .= "\r\n{$name}: " . \implode(', ', $values); - } - } - return "{$msg}\r\n\r\n" . $message->getBody(); - } - /** - * Get a short summary of the message body. - * - * Will return `null` if the response is not printable. - * - * @param MessageInterface $message The message to get the body summary - * @param int $truncateAt The maximum allowed size of the summary - */ - public static function bodySummary(MessageInterface $message, int $truncateAt = 120) : ?string - { - $body = $message->getBody(); - if (!$body->isSeekable() || !$body->isReadable()) { - return null; - } - $size = $body->getSize(); - if ($size === 0) { - return null; - } - $body->rewind(); - $summary = $body->read($truncateAt); - $body->rewind(); - if ($size > $truncateAt) { - $summary .= ' (truncated...)'; - } - // Matches any printable character, including unicode characters: - // letters, marks, numbers, punctuation, spacing, and separators. - if (\preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/u', $summary) !== 0) { - return null; - } - return $summary; - } - /** - * Attempts to rewind a message body and throws an exception on failure. - * - * The body of the message will only be rewound if a call to `tell()` - * returns a value other than `0`. - * - * @param MessageInterface $message Message to rewind - * - * @throws \RuntimeException - */ - public static function rewindBody(MessageInterface $message) : void - { - $body = $message->getBody(); - if ($body->tell()) { - $body->rewind(); - } - } - /** - * Parses an HTTP message into an associative array. - * - * The array contains the "start-line" key containing the start line of - * the message, "headers" key containing an associative array of header - * array values, and a "body" key containing the body of the message. - * - * @param string $message HTTP request or response to parse. - */ - public static function parseMessage(string $message) : array - { - if (!$message) { - throw new \InvalidArgumentException('Invalid message'); - } - $message = \ltrim($message, "\r\n"); - $messageParts = \preg_split("/\r?\n\r?\n/", $message, 2); - if ($messageParts === \false || \count($messageParts) !== 2) { - throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); - } - [$rawHeaders, $body] = $messageParts; - $rawHeaders .= "\r\n"; - // Put back the delimiter we split previously - $headerParts = \preg_split("/\r?\n/", $rawHeaders, 2); - if ($headerParts === \false || \count($headerParts) !== 2) { - throw new \InvalidArgumentException('Invalid message: Missing status line'); - } - [$startLine, $rawHeaders] = $headerParts; - if (\preg_match("/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { - // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 - $rawHeaders = \preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); - } - /** @var array[] $headerLines */ - $count = \preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, \PREG_SET_ORDER); - // If these aren't the same, then one line didn't match and there's an invalid header. - if ($count !== \substr_count($rawHeaders, "\n")) { - // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 - if (\preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { - throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); - } - throw new \InvalidArgumentException('Invalid header syntax'); - } - $headers = []; - foreach ($headerLines as $headerLine) { - $headers[$headerLine[1]][] = $headerLine[2]; - } - return ['start-line' => $startLine, 'headers' => $headers, 'body' => $body]; - } - /** - * Constructs a URI for an HTTP request message. - * - * @param string $path Path from the start-line - * @param array $headers Array of headers (each value an array). - */ - public static function parseRequestUri(string $path, array $headers) : string - { - $hostKey = \array_filter(\array_keys($headers), function ($k) { - // Numeric array keys are converted to int by PHP. - $k = (string) $k; - return \strtolower($k) === 'host'; - }); - // If no host is found, then a full URI cannot be constructed. - if (!$hostKey) { - return $path; - } - $host = $headers[\reset($hostKey)][0]; - $scheme = \substr($host, -4) === ':443' ? 'https' : 'http'; - return $scheme . '://' . $host . '/' . \ltrim($path, '/'); - } - /** - * Parses a request message string into a request object. - * - * @param string $message Request message string. - */ - public static function parseRequest(string $message) : RequestInterface - { - $data = self::parseMessage($message); - $matches = []; - if (!\preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) { - throw new \InvalidArgumentException('Invalid request string'); - } - $parts = \explode(' ', $data['start-line'], 3); - $version = isset($parts[2]) ? \explode('/', $parts[2])[1] : '1.1'; - $request = new Request($parts[0], $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version); - return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); - } - /** - * Parses a response message string into a response object. - * - * @param string $message Response message string. - */ - public static function parseResponse(string $message) : ResponseInterface - { - $data = self::parseMessage($message); - // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space - // between status-code and reason-phrase is required. But browsers accept - // responses without space and reason as well. - if (!\preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { - throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); - } - $parts = \explode(' ', $data['start-line'], 3); - return new Response((int) $parts[1], $data['headers'], $data['body'], \explode('/', $parts[0])[1], $parts[2] ?? null); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/MessageTrait.php b/dependencies/guzzlehttp/psr7/src/MessageTrait.php deleted file mode 100644 index 281dbfb..0000000 --- a/dependencies/guzzlehttp/psr7/src/MessageTrait.php +++ /dev/null @@ -1,212 +0,0 @@ - array of values */ - private $headers = []; - /** @var string[] Map of lowercase header name => original name at registration */ - private $headerNames = []; - /** @var string */ - private $protocol = '1.1'; - /** @var StreamInterface|null */ - private $stream; - public function getProtocolVersion() : string - { - return $this->protocol; - } - public function withProtocolVersion($version) : MessageInterface - { - if ($this->protocol === $version) { - return $this; - } - $new = clone $this; - $new->protocol = $version; - return $new; - } - public function getHeaders() : array - { - return $this->headers; - } - public function hasHeader($header) : bool - { - return isset($this->headerNames[\strtolower($header)]); - } - public function getHeader($header) : array - { - $header = \strtolower($header); - if (!isset($this->headerNames[$header])) { - return []; - } - $header = $this->headerNames[$header]; - return $this->headers[$header]; - } - public function getHeaderLine($header) : string - { - return \implode(', ', $this->getHeader($header)); - } - public function withHeader($header, $value) : MessageInterface - { - $this->assertHeader($header); - $value = $this->normalizeHeaderValue($value); - $normalized = \strtolower($header); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - unset($new->headers[$new->headerNames[$normalized]]); - } - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - return $new; - } - public function withAddedHeader($header, $value) : MessageInterface - { - $this->assertHeader($header); - $value = $this->normalizeHeaderValue($value); - $normalized = \strtolower($header); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $new->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - } - return $new; - } - public function withoutHeader($header) : MessageInterface - { - $normalized = \strtolower($header); - if (!isset($this->headerNames[$normalized])) { - return $this; - } - $header = $this->headerNames[$normalized]; - $new = clone $this; - unset($new->headers[$header], $new->headerNames[$normalized]); - return $new; - } - public function getBody() : StreamInterface - { - if (!$this->stream) { - $this->stream = Utils::streamFor(''); - } - return $this->stream; - } - public function withBody(StreamInterface $body) : MessageInterface - { - if ($body === $this->stream) { - return $this; - } - $new = clone $this; - $new->stream = $body; - return $new; - } - /** - * @param array $headers - */ - private function setHeaders(array $headers) : void - { - $this->headerNames = $this->headers = []; - foreach ($headers as $header => $value) { - // Numeric array keys are converted to int by PHP. - $header = (string) $header; - $this->assertHeader($header); - $value = $this->normalizeHeaderValue($value); - $normalized = \strtolower($header); - if (isset($this->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $this->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $this->headerNames[$normalized] = $header; - $this->headers[$header] = $value; - } - } - } - /** - * @param mixed $value - * - * @return string[] - */ - private function normalizeHeaderValue($value) : array - { - if (!\is_array($value)) { - return $this->trimAndValidateHeaderValues([$value]); - } - if (\count($value) === 0) { - throw new \InvalidArgumentException('Header value can not be an empty array.'); - } - return $this->trimAndValidateHeaderValues($value); - } - /** - * Trims whitespace from the header values. - * - * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. - * - * header-field = field-name ":" OWS field-value OWS - * OWS = *( SP / HTAB ) - * - * @param mixed[] $values Header values - * - * @return string[] Trimmed header values - * - * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 - */ - private function trimAndValidateHeaderValues(array $values) : array - { - return \array_map(function ($value) { - if (!\is_scalar($value) && null !== $value) { - throw new \InvalidArgumentException(\sprintf('Header value must be scalar or null but %s provided.', \is_object($value) ? \get_class($value) : \gettype($value))); - } - $trimmed = \trim((string) $value, " \t"); - $this->assertValue($trimmed); - return $trimmed; - }, \array_values($values)); - } - /** - * @see https://tools.ietf.org/html/rfc7230#section-3.2 - * - * @param mixed $header - */ - private function assertHeader($header) : void - { - if (!\is_string($header)) { - throw new \InvalidArgumentException(\sprintf('Header name must be a string but %s provided.', \is_object($header) ? \get_class($header) : \gettype($header))); - } - if (!\preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) { - throw new \InvalidArgumentException(\sprintf('"%s" is not valid header name.', $header)); - } - } - /** - * @see https://tools.ietf.org/html/rfc7230#section-3.2 - * - * field-value = *( field-content / obs-fold ) - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - * VCHAR = %x21-7E - * obs-text = %x80-FF - * obs-fold = CRLF 1*( SP / HTAB ) - */ - private function assertValue(string $value) : void - { - // The regular expression intentionally does not support the obs-fold production, because as - // per RFC 7230#3.2.4: - // - // A sender MUST NOT generate a message that includes - // line folding (i.e., that has any field-value that contains a match to - // the obs-fold rule) unless the message is intended for packaging - // within the message/http media type. - // - // Clients must not send a request with line folding and a server sending folded headers is - // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting - // folding is not likely to break any legitimate use case. - if (!\preg_match('/^[\\x20\\x09\\x21-\\x7E\\x80-\\xFF]*$/D', $value)) { - throw new \InvalidArgumentException(\sprintf('"%s" is not valid header value.', $value)); - } - } -} diff --git a/dependencies/guzzlehttp/psr7/src/MimeType.php b/dependencies/guzzlehttp/psr7/src/MimeType.php deleted file mode 100644 index 2a8f051..0000000 --- a/dependencies/guzzlehttp/psr7/src/MimeType.php +++ /dev/null @@ -1,27 +0,0 @@ - 'application/vnd.1000minds.decision-model+xml', '3dml' => 'text/vnd.in3d.3dml', '3ds' => 'image/x-3ds', '3g2' => 'video/3gpp2', '3gp' => 'video/3gp', '3gpp' => 'video/3gpp', '3mf' => 'model/3mf', '7z' => 'application/x-7z-compressed', '7zip' => 'application/x-7z-compressed', '123' => 'application/vnd.lotus-1-2-3', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/vnd.nokia.n-gage.ac+xml', 'ac3' => 'audio/ac3', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'adts' => 'audio/aac', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'age' => 'application/vnd.age', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/pdf', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'aml' => 'application/automationml-aml+xml', 'amlx' => 'application/automationml-amlx+zip', 'amr' => 'audio/amr', 'apk' => 'application/vnd.android.package-archive', 'apng' => 'image/apng', 'appcache' => 'text/cache-manifest', 'appinstaller' => 'application/appinstaller', 'application' => 'application/x-ms-application', 'appx' => 'application/appx', 'appxbundle' => 'application/appxbundle', 'apr' => 'application/vnd.lotus-approach', 'arc' => 'application/x-freearc', 'arj' => 'application/x-arj', 'asc' => 'application/pgp-signature', 'asf' => 'video/x-ms-asf', 'asm' => 'text/x-asm', 'aso' => 'application/vnd.accpac.simply.aso', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomdeleted' => 'application/atomdeleted+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/x-au', 'avci' => 'image/avci', 'avcs' => 'image/avcs', 'avi' => 'video/x-msvideo', 'avif' => 'image/avif', 'aw' => 'application/applixware', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azv' => 'image/vnd.airzip.accelerator.azv', 'azw' => 'application/vnd.amazon.ebook', 'b16' => 'image/vnd.pco.b16', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bdoc' => 'application/x-bdoc', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'blb' => 'application/x-blorb', 'blorb' => 'application/x-blorb', 'bmi' => 'application/vnd.bmi', 'bmml' => 'application/vnd.balsamiq.bmml+xml', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'bpmn' => 'application/octet-stream', 'bsp' => 'model/vnd.valve.source.compiled-map', 'btf' => 'image/prs.btif', 'btif' => 'image/prs.btif', 'buffer' => 'application/octet-stream', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'cab' => 'application/vnd.ms-cab-compressed', 'caf' => 'audio/x-caf', 'cap' => 'application/vnd.tcpdump.pcap', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cb7' => 'application/x-cbr', 'cba' => 'application/x-cbr', 'cbr' => 'application/x-cbr', 'cbt' => 'application/x-cbr', 'cbz' => 'application/x-cbr', 'cc' => 'text/x-c', 'cco' => 'application/x-cocoa', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdfx' => 'application/cdfx+xml', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdr' => 'application/cdr', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfs' => 'application/x-cfs-compressed', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cjs' => 'application/node', 'cla' => 'application/vnd.claymore', 'class' => 'application/octet-stream', 'cld' => 'model/vnd.cld', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'coffee' => 'text/coffeescript', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpl' => 'application/cpl+xml', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'crx' => 'application/x-chrome-extension', 'cryptonote' => 'application/vnd.rig.cryptonote', 'csh' => 'application/x-csh', 'csl' => 'application/vnd.citationstyles.style+xml', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'csr' => 'application/octet-stream', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cwl' => 'application/cwl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dart' => 'application/vnd.dart', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dbf' => 'application/vnd.dbf', 'dbk' => 'application/docbook+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'ddf' => 'application/vnd.syncml.dmddf+xml', 'dds' => 'image/vnd.ms-dds', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dgc' => 'application/x-dgc-compressed', 'dib' => 'image/bmp', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'disposition-notification' => 'message/disposition-notification', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/octet-stream', 'dmg' => 'application/x-apple-diskimage', 'dmn' => 'application/octet-stream', 'dmp' => 'application/vnd.tcpdump.pcap', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dpx' => 'image/dpx', 'dra' => 'audio/vnd.dra', 'drle' => 'image/dicom-rle', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvb' => 'video/vnd.dvb.file', 'dvi' => 'application/x-dvi', 'dwd' => 'application/atsc-dwd+xml', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ear' => 'application/java-archive', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'emf' => 'image/emf', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'emotionml' => 'application/emotionml+xml', 'emz' => 'application/x-msmetafile', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esa' => 'application/vnd.osgi.subsystem', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'eva' => 'application/x-eva', 'evy' => 'application/x-envoy', 'exe' => 'application/octet-stream', 'exi' => 'application/exi', 'exp' => 'application/express', 'exr' => 'image/aces', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/mp4', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'fbs' => 'image/vnd.fastbidsheet', 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/vnd.fdf', 'fdt' => 'application/fdt+xml', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fits' => 'image/fits', 'flac' => 'audio/x-flac', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'fo' => 'application/vnd.software602.filler.form+xml', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gam' => 'application/x-tads', 'gbr' => 'application/rpki-ghostbusters', 'gca' => 'application/x-gca-compressed', 'gdl' => 'model/vnd.gdl', 'gdoc' => 'application/vnd.google-apps.document', 'ged' => 'text/vnd.familysearch.gedcom', 'geo' => 'application/vnd.dynageo', 'geojson' => 'application/geo+json', 'gex' => 'application/vnd.geometry-explorer', 'ggb' => 'application/vnd.geogebra.file', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'glb' => 'model/gltf-binary', 'gltf' => 'model/gltf+json', 'gml' => 'application/gml+xml', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gpg' => 'application/gpg-keys', 'gph' => 'application/vnd.flographit', 'gpx' => 'application/gpx+xml', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gramps' => 'application/x-gramps-xml', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gsf' => 'application/x-font-ghostscript', 'gsheet' => 'application/vnd.google-apps.spreadsheet', 'gslides' => 'application/vnd.google-apps.presentation', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxf' => 'application/gxf', 'gxt' => 'application/vnd.geonext', 'gz' => 'application/gzip', 'gzip' => 'application/gzip', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hbs' => 'text/x-handlebars-template', 'hdd' => 'application/x-virtualbox-hdd', 'hdf' => 'application/x-hdf', 'heic' => 'image/heic', 'heics' => 'image/heic-sequence', 'heif' => 'image/heif', 'heifs' => 'image/heif-sequence', 'hej2' => 'image/hej2k', 'held' => 'application/atsc-held+xml', 'hh' => 'text/x-c', 'hjson' => 'application/hjson', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'hsj2' => 'image/hsj2', 'htc' => 'text/x-component', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'img' => 'application/octet-stream', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'ini' => 'text/plain', 'ink' => 'application/inkml+xml', 'inkml' => 'application/inkml+xml', 'install' => 'application/x-install-instructions', 'iota' => 'application/vnd.astraea-software.iota', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/x-iso9660-image', 'itp' => 'application/vnd.shana.informed.formtemplate', 'its' => 'application/its+xml', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jade' => 'text/jade', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'jardiff' => 'application/x-java-archive-diff', 'java' => 'text/x-java-source', 'jhc' => 'image/jphc', 'jisp' => 'application/vnd.jisp', 'jls' => 'image/jls', 'jlt' => 'application/vnd.hp-jlyt', 'jng' => 'image/x-jng', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jp2' => 'image/jp2', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpf' => 'image/jpx', 'jpg' => 'image/jpeg', 'jpg2' => 'image/jp2', 'jpgm' => 'video/jpm', 'jpgv' => 'video/jpeg', 'jph' => 'image/jph', 'jpm' => 'video/jpm', 'jpx' => 'image/jpx', 'js' => 'application/javascript', 'json' => 'application/json', 'json5' => 'application/json5', 'jsonld' => 'application/ld+json', 'jsonml' => 'application/jsonml+json', 'jsx' => 'text/jsx', 'jt' => 'model/jt', 'jxr' => 'image/jxr', 'jxra' => 'image/jxra', 'jxrs' => 'image/jxrs', 'jxs' => 'image/jxs', 'jxsc' => 'image/jxsc', 'jxsi' => 'image/jxsi', 'jxss' => 'image/jxss', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kdb' => 'application/octet-stream', 'kdbx' => 'application/x-keepass2', 'key' => 'application/x-iwork-keynote-sffkey', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'kpxx' => 'application/vnd.ds-keypoint', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktx2' => 'image/ktx2', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'less' => 'text/less', 'lgr' => 'application/lgr+xml', 'lha' => 'application/octet-stream', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'litcoffee' => 'text/coffeescript', 'lnk' => 'application/x-ms-shortcut', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lua' => 'text/x-lua', 'luac' => 'application/x-lua-bytecode', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/octet-stream', 'm1v' => 'video/mpeg', 'm2a' => 'audio/mpeg', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'text/plain', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/x-m4a', 'm4p' => 'application/mp4', 'm4s' => 'video/iso.segment', 'm4u' => 'application/vnd.mpegurl', 'm4v' => 'video/x-m4v', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm21' => 'application/mp21', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'maei' => 'application/mmt-aei+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'manifest' => 'text/cache-manifest', 'map' => 'application/json', 'mar' => 'application/octet-stream', 'markdown' => 'text/markdown', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'md' => 'text/markdown', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'mdx' => 'text/mdx', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'metalink' => 'application/metalink+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mft' => 'application/rpki-manifest', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mie' => 'application/x-mie', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mjs' => 'text/javascript', 'mk3d' => 'video/x-matroska', 'mka' => 'audio/x-matroska', 'mkd' => 'text/x-markdown', 'mks' => 'video/x-matroska', 'mkv' => 'video/x-matroska', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mml' => 'text/mathml', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mng' => 'video/x-mng', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mp21' => 'application/mp21', 'mpc' => 'application/vnd.mophun.certificate', 'mpd' => 'application/dash+xml', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpf' => 'application/media-policy-dataset+xml', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msg' => 'application/vnd.ms-outlook', 'msh' => 'model/mesh', 'msi' => 'application/x-msdownload', 'msix' => 'application/msix', 'msixbundle' => 'application/msixbundle', 'msl' => 'application/vnd.mobius.msl', 'msm' => 'application/octet-stream', 'msp' => 'application/octet-stream', 'msty' => 'application/vnd.muvee.style', 'mtl' => 'model/mtl', 'mts' => 'model/vnd.mts', 'mus' => 'application/vnd.musician', 'musd' => 'application/mmt-usd+xml', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mvt' => 'application/vnd.mapbox-vector-tile', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxmf' => 'audio/mobile-xmf', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'nfo' => 'text/x-nfo', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nitf' => 'application/vnd.nitf', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nq' => 'application/n-quads', 'nsc' => 'application/x-conference', 'nsf' => 'application/vnd.lotus-notes', 'nt' => 'application/n-triples', 'ntf' => 'application/vnd.nitf', 'numbers' => 'application/x-iwork-numbers-sffnumbers', 'nzb' => 'application/x-nzb', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'obgx' => 'application/vnd.openblox.game+xml', 'obj' => 'model/obj', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogex' => 'model/vnd.opengex', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'omdoc' => 'application/omdoc+xml', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'opml' => 'text/x-opml', 'oprc' => 'application/vnd.palm', 'opus' => 'audio/ogg', 'org' => 'text/x-org', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osm' => 'application/vnd.openstreetmap.data+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'font/otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'ova' => 'application/x-virtualbox-ova', 'ovf' => 'application/x-virtualbox-ovf', 'owl' => 'application/rdf+xml', 'oxps' => 'application/oxps', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p7a' => 'application/x-pkcs7-signature', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'p10' => 'application/x-pkcs10', 'p12' => 'application/x-pkcs12', 'pac' => 'application/x-ns-proxy-autoconfig', 'pages' => 'application/x-iwork-pages-sffpages', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcap' => 'application/vnd.tcpdump.pcap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/x-pcx', 'pdb' => 'application/x-pilot', 'pde' => 'text/x-processing', 'pdf' => 'application/pdf', 'pem' => 'application/x-x509-user-cert', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp', 'phar' => 'application/octet-stream', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'phps' => 'application/x-httpd-php-source', 'phtml' => 'application/x-httpd-php', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'pkpass' => 'application/vnd.apple.pkpass', 'pl' => 'application/x-perl', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pm' => 'application/x-perl', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppa' => 'application/vnd.ms-powerpoint', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'model/prc', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'provx' => 'application/provenance+xml', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'application/x-photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'pti' => 'image/prs.pti', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyo' => 'model/vnd.pytha.pyox', 'pyox' => 'model/vnd.pytha.pyox', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-realaudio', 'ram' => 'audio/x-pn-realaudio', 'raml' => 'application/raml+yaml', 'rapd' => 'application/route-apd+xml', 'rar' => 'application/x-rar', 'ras' => 'image/x-cmu-raster', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'relo' => 'application/p2p-overlay+xml', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'ris' => 'application/x-research-info-systems', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'audio/x-pn-realaudio', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rmvb' => 'application/vnd.rn-realmedia-vbr', 'rnc' => 'application/relax-ng-compact-syntax', 'rng' => 'application/xml', 'roa' => 'application/rpki-roa', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpm' => 'audio/x-pn-realaudio-plugin', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsa' => 'application/x-pkcs7', 'rsat' => 'application/atsc-rsat+xml', 'rsd' => 'application/rsd+xml', 'rsheet' => 'application/urc-ressheet+xml', 'rss' => 'application/rss+xml', 'rtf' => 'text/rtf', 'rtx' => 'text/richtext', 'run' => 'application/x-makeself', 'rusd' => 'application/route-usd+xml', 'rv' => 'video/vnd.rn-realvideo', 's' => 'text/x-asm', 's3m' => 'audio/s3m', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sass' => 'text/x-sass', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scss' => 'text/x-scss', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'sea' => 'application/octet-stream', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'senmlx' => 'application/senml+xml', 'sensmlx' => 'application/sensml+xml', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sfv' => 'text/x-sfv', 'sgi' => 'image/sgi', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shex' => 'text/shex', 'shf' => 'application/shf+xml', 'shtml' => 'text/html', 'sid' => 'image/x-mrsid-image', 'sieve' => 'application/sieve', 'sig' => 'application/pgp-signature', 'sil' => 'audio/silk', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'siv' => 'application/sieve', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slim' => 'text/slim', 'slm' => 'text/slim', 'sls' => 'application/route-s-tsid+xml', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil', 'smil' => 'application/smil', 'smv' => 'video/x-smv', 'smzip' => 'application/vnd.stepmania.package', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spdx' => 'text/spdx', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'sql' => 'application/x-sql', 'src' => 'application/x-wais-source', 'srt' => 'application/x-subrip', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'ssdl' => 'application/ssdl+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'sst' => 'application/octet-stream', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'step' => 'application/STEP', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'model/stl', 'stp' => 'application/STEP', 'stpx' => 'model/step+xml', 'stpxz' => 'model/step-xml+zip', 'stpz' => 'model/step+zip', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'styl' => 'text/stylus', 'stylus' => 'text/stylus', 'sub' => 'text/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'swidtag' => 'application/swid+xml', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 't' => 'text/troff', 't3' => 'application/x-t3vm-image', 't38' => 'image/t38', 'taglet' => 'application/vnd.mynfc', 'tao' => 'application/vnd.tao.intent-module-archive', 'tap' => 'image/vnd.tencent.tap', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'td' => 'application/urc-targetdesc+xml', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'tfx' => 'image/tiff-fx', 'tga' => 'image/x-tga', 'tgz' => 'application/x-tar', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tk' => 'application/x-tcl', 'tmo' => 'application/vnd.tmobile-livetv', 'toml' => 'application/toml', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trig' => 'application/trig', 'trm' => 'application/x-msterminal', 'ts' => 'video/mp2t', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'font/collection', 'ttf' => 'font/ttf', 'ttl' => 'text/turtle', 'ttml' => 'application/ttml+xml', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u3d' => 'model/u3d', 'u8dsn' => 'message/global-delivery-status', 'u8hdr' => 'message/global-headers', 'u8mdn' => 'message/global-disposition-notification', 'u8msg' => 'message/global', 'u32' => 'application/x-authorware-bin', 'ubj' => 'application/ubjson', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'ulx' => 'application/x-glulx', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uo' => 'application/vnd.uoml+xml', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'usda' => 'model/vnd.usda', 'usdz' => 'model/vnd.usdz+zip', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvvz' => 'application/vnd.dece.zip', 'uvx' => 'application/vnd.dece.unspecified', 'uvz' => 'application/vnd.dece.zip', 'vbox' => 'application/x-virtualbox-vbox', 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', 'vcard' => 'text/vcard', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vdi' => 'application/x-virtualbox-vdi', 'vds' => 'model/vnd.sap.vds', 'vhd' => 'application/x-virtualbox-vhd', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vlc' => 'application/videolan', 'vmdk' => 'application/x-virtualbox-vmdk', 'vob' => 'video/x-ms-vob', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtf' => 'image/vnd.valve.source.texture', 'vtt' => 'text/vtt', 'vtu' => 'model/vnd.vtu', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wadl' => 'application/vnd.sun.wadl+xml', 'war' => 'application/java-archive', 'wasm' => 'application/wasm', 'wav' => 'audio/x-wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'wdp' => 'image/vnd.ms-photo', 'weba' => 'audio/webm', 'webapp' => 'application/x-web-app-manifest+json', 'webm' => 'video/webm', 'webmanifest' => 'application/manifest+json', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgsl' => 'text/wgsl', 'wgt' => 'application/widget', 'wif' => 'application/watcherinfo+xml', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'image/wmf', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-msmetafile', 'woff' => 'font/woff', 'woff2' => 'font/woff2', 'word' => 'application/msword', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsc' => 'message/vnd.wfa.wsc', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x3d' => 'model/x3d+xml', 'x3db' => 'model/x3d+fastinfoset', 'x3dbz' => 'model/x3d+binary', 'x3dv' => 'model/x3d-vrml', 'x3dvz' => 'model/x3d+vrml', 'x3dz' => 'model/x3d+xml', 'x32' => 'application/x-authorware-bin', 'x_b' => 'model/vnd.parasolid.transmit.binary', 'x_t' => 'model/vnd.parasolid.transmit.text', 'xaml' => 'application/xaml+xml', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xav' => 'application/xcap-att+xml', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xca' => 'application/xcap-caps+xml', 'xcs' => 'application/calendar+xml', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xel' => 'application/xcap-el+xml', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtm' => 'application/vnd.pwg-xhtml-print+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xl' => 'application/excel', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlf' => 'application/xliff+xml', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xm' => 'audio/xm', 'xml' => 'application/xml', 'xns' => 'application/xcap-ns+xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpl' => 'application/xproc+xml', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsd' => 'application/xml', 'xsf' => 'application/prs.xsf+xml', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'xz' => 'application/x-xz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'ymp' => 'text/x-suse-ymp', 'z' => 'application/x-compress', 'z1' => 'application/x-zmachine', 'z2' => 'application/x-zmachine', 'z3' => 'application/x-zmachine', 'z4' => 'application/x-zmachine', 'z5' => 'application/x-zmachine', 'z6' => 'application/x-zmachine', 'z7' => 'application/x-zmachine', 'z8' => 'application/x-zmachine', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml', 'zsh' => 'text/x-scriptzsh']; - /** - * Determines the mimetype of a file by looking at its extension. - * - * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json - */ - public static function fromFilename(string $filename) : ?string - { - return self::fromExtension(\pathinfo($filename, \PATHINFO_EXTENSION)); - } - /** - * Maps a file extensions to a mimetype. - * - * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json - */ - public static function fromExtension(string $extension) : ?string - { - return self::MIME_TYPES[\strtolower($extension)] ?? null; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/MultipartStream.php b/dependencies/guzzlehttp/psr7/src/MultipartStream.php deleted file mode 100644 index 256cd87..0000000 --- a/dependencies/guzzlehttp/psr7/src/MultipartStream.php +++ /dev/null @@ -1,122 +0,0 @@ -boundary = $boundary ?: \bin2hex(\random_bytes(20)); - $this->stream = $this->createStream($elements); - } - public function getBoundary() : string - { - return $this->boundary; - } - public function isWritable() : bool - { - return \false; - } - /** - * Get the headers needed before transferring the content of a POST file - * - * @param array $headers - */ - private function getHeaders(array $headers) : string - { - $str = ''; - foreach ($headers as $key => $value) { - $str .= "{$key}: {$value}\r\n"; - } - return "--{$this->boundary}\r\n" . \trim($str) . "\r\n\r\n"; - } - /** - * Create the aggregate stream that will be used to upload the POST data - */ - protected function createStream(array $elements = []) : StreamInterface - { - $stream = new AppendStream(); - foreach ($elements as $element) { - if (!\is_array($element)) { - throw new \UnexpectedValueException('An array is expected'); - } - $this->addElement($stream, $element); - } - // Add the trailing boundary with CRLF - $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); - return $stream; - } - private function addElement(AppendStream $stream, array $element) : void - { - foreach (['contents', 'name'] as $key) { - if (!\array_key_exists($key, $element)) { - throw new \InvalidArgumentException("A '{$key}' key is required"); - } - } - $element['contents'] = Utils::streamFor($element['contents']); - if (empty($element['filename'])) { - $uri = $element['contents']->getMetadata('uri'); - if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') { - $element['filename'] = $uri; - } - } - [$body, $headers] = $this->createElement($element['name'], $element['contents'], $element['filename'] ?? null, $element['headers'] ?? []); - $stream->addStream(Utils::streamFor($this->getHeaders($headers))); - $stream->addStream($body); - $stream->addStream(Utils::streamFor("\r\n")); - } - private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers) : array - { - // Set a default content-disposition header if one was no provided - $disposition = $this->getHeader($headers, 'content-disposition'); - if (!$disposition) { - $headers['Content-Disposition'] = $filename === '0' || $filename ? \sprintf('form-data; name="%s"; filename="%s"', $name, \basename($filename)) : "form-data; name=\"{$name}\""; - } - // Set a default content-length header if one was no provided - $length = $this->getHeader($headers, 'content-length'); - if (!$length) { - if ($length = $stream->getSize()) { - $headers['Content-Length'] = (string) $length; - } - } - // Set a default Content-Type if one was not supplied - $type = $this->getHeader($headers, 'content-type'); - if (!$type && ($filename === '0' || $filename)) { - $headers['Content-Type'] = MimeType::fromFilename($filename) ?? 'application/octet-stream'; - } - return [$stream, $headers]; - } - private function getHeader(array $headers, string $key) - { - $lowercaseHeader = \strtolower($key); - foreach ($headers as $k => $v) { - if (\strtolower($k) === $lowercaseHeader) { - return $v; - } - } - return null; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/NoSeekStream.php b/dependencies/guzzlehttp/psr7/src/NoSeekStream.php deleted file mode 100644 index 082cb54..0000000 --- a/dependencies/guzzlehttp/psr7/src/NoSeekStream.php +++ /dev/null @@ -1,23 +0,0 @@ -source = $source; - $this->size = $options['size'] ?? null; - $this->metadata = $options['metadata'] ?? []; - $this->buffer = new BufferStream(); - } - public function __toString() : string - { - try { - return Utils::copyToString($this); - } catch (\Throwable $e) { - if (\PHP_VERSION_ID >= 70400) { - throw $e; - } - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); - return ''; - } - } - public function close() : void - { - $this->detach(); - } - public function detach() - { - $this->tellPos = 0; - $this->source = null; - return null; - } - public function getSize() : ?int - { - return $this->size; - } - public function tell() : int - { - return $this->tellPos; - } - public function eof() : bool - { - return $this->source === null; - } - public function isSeekable() : bool - { - return \false; - } - public function rewind() : void - { - $this->seek(0); - } - public function seek($offset, $whence = \SEEK_SET) : void - { - throw new \RuntimeException('Cannot seek a PumpStream'); - } - public function isWritable() : bool - { - return \false; - } - public function write($string) : int - { - throw new \RuntimeException('Cannot write to a PumpStream'); - } - public function isReadable() : bool - { - return \true; - } - public function read($length) : string - { - $data = $this->buffer->read($length); - $readLen = \strlen($data); - $this->tellPos += $readLen; - $remaining = $length - $readLen; - if ($remaining) { - $this->pump($remaining); - $data .= $this->buffer->read($remaining); - $this->tellPos += \strlen($data) - $readLen; - } - return $data; - } - public function getContents() : string - { - $result = ''; - while (!$this->eof()) { - $result .= $this->read(1000000); - } - return $result; - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - if (!$key) { - return $this->metadata; - } - return $this->metadata[$key] ?? null; - } - private function pump(int $length) : void - { - if ($this->source) { - do { - $data = \call_user_func($this->source, $length); - if ($data === \false || $data === null) { - $this->source = null; - return; - } - $this->buffer->write($data); - $length -= \strlen($data); - } while ($length > 0); - } - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Query.php b/dependencies/guzzlehttp/psr7/src/Query.php deleted file mode 100644 index fe63a7f..0000000 --- a/dependencies/guzzlehttp/psr7/src/Query.php +++ /dev/null @@ -1,104 +0,0 @@ - '1', 'foo[b]' => '2'])`. - * - * @param string $str Query string to parse - * @param int|bool $urlEncoding How the query string is encoded - */ - public static function parse(string $str, $urlEncoding = \true) : array - { - $result = []; - if ($str === '') { - return $result; - } - if ($urlEncoding === \true) { - $decoder = function ($value) { - return \rawurldecode(\str_replace('+', ' ', (string) $value)); - }; - } elseif ($urlEncoding === \PHP_QUERY_RFC3986) { - $decoder = 'rawurldecode'; - } elseif ($urlEncoding === \PHP_QUERY_RFC1738) { - $decoder = 'urldecode'; - } else { - $decoder = function ($str) { - return $str; - }; - } - foreach (\explode('&', $str) as $kvp) { - $parts = \explode('=', $kvp, 2); - $key = $decoder($parts[0]); - $value = isset($parts[1]) ? $decoder($parts[1]) : null; - if (!\array_key_exists($key, $result)) { - $result[$key] = $value; - } else { - if (!\is_array($result[$key])) { - $result[$key] = [$result[$key]]; - } - $result[$key][] = $value; - } - } - return $result; - } - /** - * Build a query string from an array of key value pairs. - * - * This function can use the return value of `parse()` to build a query - * string. This function does not modify the provided keys when an array is - * encountered (like `http_build_query()` would). - * - * @param array $params Query string parameters. - * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 - * to encode using RFC3986, or PHP_QUERY_RFC1738 - * to encode using RFC1738. - */ - public static function build(array $params, $encoding = \PHP_QUERY_RFC3986) : string - { - if (!$params) { - return ''; - } - if ($encoding === \false) { - $encoder = function (string $str) : string { - return $str; - }; - } elseif ($encoding === \PHP_QUERY_RFC3986) { - $encoder = 'rawurlencode'; - } elseif ($encoding === \PHP_QUERY_RFC1738) { - $encoder = 'urlencode'; - } else { - throw new \InvalidArgumentException('Invalid type'); - } - $qs = ''; - foreach ($params as $k => $v) { - $k = $encoder((string) $k); - if (!\is_array($v)) { - $qs .= $k; - $v = \is_bool($v) ? (int) $v : $v; - if ($v !== null) { - $qs .= '=' . $encoder((string) $v); - } - $qs .= '&'; - } else { - foreach ($v as $vv) { - $qs .= $k; - $vv = \is_bool($vv) ? (int) $vv : $vv; - if ($vv !== null) { - $qs .= '=' . $encoder((string) $vv); - } - $qs .= '&'; - } - } - } - return $qs ? (string) \substr($qs, 0, -1) : ''; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Request.php b/dependencies/guzzlehttp/psr7/src/Request.php deleted file mode 100644 index c4bc8f3..0000000 --- a/dependencies/guzzlehttp/psr7/src/Request.php +++ /dev/null @@ -1,124 +0,0 @@ - $headers Request headers - * @param string|resource|StreamInterface|null $body Request body - * @param string $version Protocol version - */ - public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1') - { - $this->assertMethod($method); - if (!$uri instanceof UriInterface) { - $uri = new Uri($uri); - } - $this->method = \strtoupper($method); - $this->uri = $uri; - $this->setHeaders($headers); - $this->protocol = $version; - if (!isset($this->headerNames['host'])) { - $this->updateHostFromUri(); - } - if ($body !== '' && $body !== null) { - $this->stream = Utils::streamFor($body); - } - } - public function getRequestTarget() : string - { - if ($this->requestTarget !== null) { - return $this->requestTarget; - } - $target = $this->uri->getPath(); - if ($target === '') { - $target = '/'; - } - if ($this->uri->getQuery() != '') { - $target .= '?' . $this->uri->getQuery(); - } - return $target; - } - public function withRequestTarget($requestTarget) : RequestInterface - { - if (\preg_match('#\\s#', $requestTarget)) { - throw new InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); - } - $new = clone $this; - $new->requestTarget = $requestTarget; - return $new; - } - public function getMethod() : string - { - return $this->method; - } - public function withMethod($method) : RequestInterface - { - $this->assertMethod($method); - $new = clone $this; - $new->method = \strtoupper($method); - return $new; - } - public function getUri() : UriInterface - { - return $this->uri; - } - public function withUri(UriInterface $uri, $preserveHost = \false) : RequestInterface - { - if ($uri === $this->uri) { - return $this; - } - $new = clone $this; - $new->uri = $uri; - if (!$preserveHost || !isset($this->headerNames['host'])) { - $new->updateHostFromUri(); - } - return $new; - } - private function updateHostFromUri() : void - { - $host = $this->uri->getHost(); - if ($host == '') { - return; - } - if (($port = $this->uri->getPort()) !== null) { - $host .= ':' . $port; - } - if (isset($this->headerNames['host'])) { - $header = $this->headerNames['host']; - } else { - $header = 'Host'; - $this->headerNames['host'] = 'Host'; - } - // Ensure Host is the first header. - // See: http://tools.ietf.org/html/rfc7230#section-5.4 - $this->headers = [$header => [$host]] + $this->headers; - } - /** - * @param mixed $method - */ - private function assertMethod($method) : void - { - if (!\is_string($method) || $method === '') { - throw new InvalidArgumentException('Method must be a non-empty string.'); - } - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Response.php b/dependencies/guzzlehttp/psr7/src/Response.php deleted file mode 100644 index 81c0fea..0000000 --- a/dependencies/guzzlehttp/psr7/src/Response.php +++ /dev/null @@ -1,78 +0,0 @@ - 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required']; - /** @var string */ - private $reasonPhrase; - /** @var int */ - private $statusCode; - /** - * @param int $status Status code - * @param array $headers Response headers - * @param string|resource|StreamInterface|null $body Response body - * @param string $version Protocol version - * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) - */ - public function __construct(int $status = 200, array $headers = [], $body = null, string $version = '1.1', string $reason = null) - { - $this->assertStatusCodeRange($status); - $this->statusCode = $status; - if ($body !== '' && $body !== null) { - $this->stream = Utils::streamFor($body); - } - $this->setHeaders($headers); - if ($reason == '' && isset(self::PHRASES[$this->statusCode])) { - $this->reasonPhrase = self::PHRASES[$this->statusCode]; - } else { - $this->reasonPhrase = (string) $reason; - } - $this->protocol = $version; - } - public function getStatusCode() : int - { - return $this->statusCode; - } - public function getReasonPhrase() : string - { - return $this->reasonPhrase; - } - public function withStatus($code, $reasonPhrase = '') : ResponseInterface - { - $this->assertStatusCodeIsInteger($code); - $code = (int) $code; - $this->assertStatusCodeRange($code); - $new = clone $this; - $new->statusCode = $code; - if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) { - $reasonPhrase = self::PHRASES[$new->statusCode]; - } - $new->reasonPhrase = (string) $reasonPhrase; - return $new; - } - /** - * @param mixed $statusCode - */ - private function assertStatusCodeIsInteger($statusCode) : void - { - if (\filter_var($statusCode, \FILTER_VALIDATE_INT) === \false) { - throw new \InvalidArgumentException('Status code must be an integer value.'); - } - } - private function assertStatusCodeRange(int $statusCode) : void - { - if ($statusCode < 100 || $statusCode >= 600) { - throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); - } - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Rfc7230.php b/dependencies/guzzlehttp/psr7/src/Rfc7230.php deleted file mode 100644 index acdec0d..0000000 --- a/dependencies/guzzlehttp/psr7/src/Rfc7230.php +++ /dev/null @@ -1,22 +0,0 @@ -@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m"; - public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; -} diff --git a/dependencies/guzzlehttp/psr7/src/ServerRequest.php b/dependencies/guzzlehttp/psr7/src/ServerRequest.php deleted file mode 100644 index b8d824e..0000000 --- a/dependencies/guzzlehttp/psr7/src/ServerRequest.php +++ /dev/null @@ -1,266 +0,0 @@ - $headers Request headers - * @param string|resource|StreamInterface|null $body Request body - * @param string $version Protocol version - * @param array $serverParams Typically the $_SERVER superglobal - */ - public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = []) - { - $this->serverParams = $serverParams; - parent::__construct($method, $uri, $headers, $body, $version); - } - /** - * Return an UploadedFile instance array. - * - * @param array $files An array which respect $_FILES structure - * - * @throws InvalidArgumentException for unrecognized values - */ - public static function normalizeFiles(array $files) : array - { - $normalized = []; - foreach ($files as $key => $value) { - if ($value instanceof UploadedFileInterface) { - $normalized[$key] = $value; - } elseif (\is_array($value) && isset($value['tmp_name'])) { - $normalized[$key] = self::createUploadedFileFromSpec($value); - } elseif (\is_array($value)) { - $normalized[$key] = self::normalizeFiles($value); - continue; - } else { - throw new InvalidArgumentException('Invalid value in files specification'); - } - } - return $normalized; - } - /** - * Create and return an UploadedFile instance from a $_FILES specification. - * - * If the specification represents an array of values, this method will - * delegate to normalizeNestedFileSpec() and return that return value. - * - * @param array $value $_FILES struct - * - * @return UploadedFileInterface|UploadedFileInterface[] - */ - private static function createUploadedFileFromSpec(array $value) - { - if (\is_array($value['tmp_name'])) { - return self::normalizeNestedFileSpec($value); - } - return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); - } - /** - * Normalize an array of file specifications. - * - * Loops through all nested files and returns a normalized array of - * UploadedFileInterface instances. - * - * @return UploadedFileInterface[] - */ - private static function normalizeNestedFileSpec(array $files = []) : array - { - $normalizedFiles = []; - foreach (\array_keys($files['tmp_name']) as $key) { - $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key] ?? null, 'error' => $files['error'][$key] ?? null, 'name' => $files['name'][$key] ?? null, 'type' => $files['type'][$key] ?? null]; - $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); - } - return $normalizedFiles; - } - /** - * Return a ServerRequest populated with superglobals: - * $_GET - * $_POST - * $_COOKIE - * $_FILES - * $_SERVER - */ - public static function fromGlobals() : ServerRequestInterface - { - $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; - $headers = \getallheaders(); - $uri = self::getUriFromGlobals(); - $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); - $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; - $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); - return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES)); - } - private static function extractHostAndPortFromAuthority(string $authority) : array - { - $uri = 'http://' . $authority; - $parts = \parse_url($uri); - if (\false === $parts) { - return [null, null]; - } - $host = $parts['host'] ?? null; - $port = $parts['port'] ?? null; - return [$host, $port]; - } - /** - * Get a Uri populated with values from $_SERVER. - */ - public static function getUriFromGlobals() : UriInterface - { - $uri = new Uri(''); - $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); - $hasPort = \false; - if (isset($_SERVER['HTTP_HOST'])) { - [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); - if ($host !== null) { - $uri = $uri->withHost($host); - } - if ($port !== null) { - $hasPort = \true; - $uri = $uri->withPort($port); - } - } elseif (isset($_SERVER['SERVER_NAME'])) { - $uri = $uri->withHost($_SERVER['SERVER_NAME']); - } elseif (isset($_SERVER['SERVER_ADDR'])) { - $uri = $uri->withHost($_SERVER['SERVER_ADDR']); - } - if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { - $uri = $uri->withPort($_SERVER['SERVER_PORT']); - } - $hasQuery = \false; - if (isset($_SERVER['REQUEST_URI'])) { - $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2); - $uri = $uri->withPath($requestUriParts[0]); - if (isset($requestUriParts[1])) { - $hasQuery = \true; - $uri = $uri->withQuery($requestUriParts[1]); - } - } - if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { - $uri = $uri->withQuery($_SERVER['QUERY_STRING']); - } - return $uri; - } - public function getServerParams() : array - { - return $this->serverParams; - } - public function getUploadedFiles() : array - { - return $this->uploadedFiles; - } - public function withUploadedFiles(array $uploadedFiles) : ServerRequestInterface - { - $new = clone $this; - $new->uploadedFiles = $uploadedFiles; - return $new; - } - public function getCookieParams() : array - { - return $this->cookieParams; - } - public function withCookieParams(array $cookies) : ServerRequestInterface - { - $new = clone $this; - $new->cookieParams = $cookies; - return $new; - } - public function getQueryParams() : array - { - return $this->queryParams; - } - public function withQueryParams(array $query) : ServerRequestInterface - { - $new = clone $this; - $new->queryParams = $query; - return $new; - } - /** - * @return array|object|null - */ - public function getParsedBody() - { - return $this->parsedBody; - } - public function withParsedBody($data) : ServerRequestInterface - { - $new = clone $this; - $new->parsedBody = $data; - return $new; - } - public function getAttributes() : array - { - return $this->attributes; - } - /** - * @return mixed - */ - public function getAttribute($attribute, $default = null) - { - if (\false === \array_key_exists($attribute, $this->attributes)) { - return $default; - } - return $this->attributes[$attribute]; - } - public function withAttribute($attribute, $value) : ServerRequestInterface - { - $new = clone $this; - $new->attributes[$attribute] = $value; - return $new; - } - public function withoutAttribute($attribute) : ServerRequestInterface - { - if (\false === \array_key_exists($attribute, $this->attributes)) { - return $this; - } - $new = clone $this; - unset($new->attributes[$attribute]); - return $new; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Stream.php b/dependencies/guzzlehttp/psr7/src/Stream.php deleted file mode 100644 index 84a6739..0000000 --- a/dependencies/guzzlehttp/psr7/src/Stream.php +++ /dev/null @@ -1,235 +0,0 @@ -size = $options['size']; - } - $this->customMetadata = $options['metadata'] ?? []; - $this->stream = $stream; - $meta = \stream_get_meta_data($this->stream); - $this->seekable = $meta['seekable']; - $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); - $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); - $this->uri = $this->getMetadata('uri'); - } - /** - * Closes the stream when the destructed - */ - public function __destruct() - { - $this->close(); - } - public function __toString() : string - { - try { - if ($this->isSeekable()) { - $this->seek(0); - } - return $this->getContents(); - } catch (\Throwable $e) { - if (\PHP_VERSION_ID >= 70400) { - throw $e; - } - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); - return ''; - } - } - public function getContents() : string - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->readable) { - throw new \RuntimeException('Cannot read from non-readable stream'); - } - return Utils::tryGetContents($this->stream); - } - public function close() : void - { - if (isset($this->stream)) { - if (\is_resource($this->stream)) { - \fclose($this->stream); - } - $this->detach(); - } - } - public function detach() - { - if (!isset($this->stream)) { - return null; - } - $result = $this->stream; - unset($this->stream); - $this->size = $this->uri = null; - $this->readable = $this->writable = $this->seekable = \false; - return $result; - } - public function getSize() : ?int - { - if ($this->size !== null) { - return $this->size; - } - if (!isset($this->stream)) { - return null; - } - // Clear the stat cache if the stream has a URI - if ($this->uri) { - \clearstatcache(\true, $this->uri); - } - $stats = \fstat($this->stream); - if (\is_array($stats) && isset($stats['size'])) { - $this->size = $stats['size']; - return $this->size; - } - return null; - } - public function isReadable() : bool - { - return $this->readable; - } - public function isWritable() : bool - { - return $this->writable; - } - public function isSeekable() : bool - { - return $this->seekable; - } - public function eof() : bool - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - return \feof($this->stream); - } - public function tell() : int - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - $result = \ftell($this->stream); - if ($result === \false) { - throw new \RuntimeException('Unable to determine stream position'); - } - return $result; - } - public function rewind() : void - { - $this->seek(0); - } - public function seek($offset, $whence = \SEEK_SET) : void - { - $whence = (int) $whence; - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->seekable) { - throw new \RuntimeException('Stream is not seekable'); - } - if (\fseek($this->stream, $offset, $whence) === -1) { - throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); - } - } - public function read($length) : string - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->readable) { - throw new \RuntimeException('Cannot read from non-readable stream'); - } - if ($length < 0) { - throw new \RuntimeException('Length parameter cannot be negative'); - } - if (0 === $length) { - return ''; - } - try { - $string = \fread($this->stream, $length); - } catch (\Exception $e) { - throw new \RuntimeException('Unable to read from stream', 0, $e); - } - if (\false === $string) { - throw new \RuntimeException('Unable to read from stream'); - } - return $string; - } - public function write($string) : int - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->writable) { - throw new \RuntimeException('Cannot write to a non-writable stream'); - } - // We can't know the size after writing anything - $this->size = null; - $result = \fwrite($this->stream, $string); - if ($result === \false) { - throw new \RuntimeException('Unable to write to stream'); - } - return $result; - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - if (!isset($this->stream)) { - return $key ? null : []; - } elseif (!$key) { - return $this->customMetadata + \stream_get_meta_data($this->stream); - } elseif (isset($this->customMetadata[$key])) { - return $this->customMetadata[$key]; - } - $meta = \stream_get_meta_data($this->stream); - return $meta[$key] ?? null; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/dependencies/guzzlehttp/psr7/src/StreamDecoratorTrait.php deleted file mode 100644 index 94d8fe8..0000000 --- a/dependencies/guzzlehttp/psr7/src/StreamDecoratorTrait.php +++ /dev/null @@ -1,131 +0,0 @@ -stream = $stream; - } - /** - * Magic method used to create a new stream if streams are not added in - * the constructor of a decorator (e.g., LazyOpenStream). - * - * @return StreamInterface - */ - public function __get(string $name) - { - if ($name === 'stream') { - $this->stream = $this->createStream(); - return $this->stream; - } - throw new \UnexpectedValueException("{$name} not found on class"); - } - public function __toString() : string - { - try { - if ($this->isSeekable()) { - $this->seek(0); - } - return $this->getContents(); - } catch (\Throwable $e) { - if (\PHP_VERSION_ID >= 70400) { - throw $e; - } - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); - return ''; - } - } - public function getContents() : string - { - return Utils::copyToString($this); - } - /** - * Allow decorators to implement custom methods - * - * @return mixed - */ - public function __call(string $method, array $args) - { - /** @var callable $callable */ - $callable = [$this->stream, $method]; - $result = \call_user_func_array($callable, $args); - // Always return the wrapped object if the result is a return $this - return $result === $this->stream ? $this : $result; - } - public function close() : void - { - $this->stream->close(); - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - return $this->stream->getMetadata($key); - } - public function detach() - { - return $this->stream->detach(); - } - public function getSize() : ?int - { - return $this->stream->getSize(); - } - public function eof() : bool - { - return $this->stream->eof(); - } - public function tell() : int - { - return $this->stream->tell(); - } - public function isReadable() : bool - { - return $this->stream->isReadable(); - } - public function isWritable() : bool - { - return $this->stream->isWritable(); - } - public function isSeekable() : bool - { - return $this->stream->isSeekable(); - } - public function rewind() : void - { - $this->seek(0); - } - public function seek($offset, $whence = \SEEK_SET) : void - { - $this->stream->seek($offset, $whence); - } - public function read($length) : string - { - return $this->stream->read($length); - } - public function write($string) : int - { - return $this->stream->write($string); - } - /** - * Implement in subclasses to dynamically create streams when requested. - * - * @throws \BadMethodCallException - */ - protected function createStream() : StreamInterface - { - throw new \BadMethodCallException('Not implemented'); - } -} diff --git a/dependencies/guzzlehttp/psr7/src/StreamWrapper.php b/dependencies/guzzlehttp/psr7/src/StreamWrapper.php deleted file mode 100644 index a632126..0000000 --- a/dependencies/guzzlehttp/psr7/src/StreamWrapper.php +++ /dev/null @@ -1,114 +0,0 @@ -isReadable()) { - $mode = $stream->isWritable() ? 'r+' : 'r'; - } elseif ($stream->isWritable()) { - $mode = 'w'; - } else { - throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.'); - } - return \fopen('guzzle://stream', $mode, \false, self::createStreamContext($stream)); - } - /** - * Creates a stream context that can be used to open a stream as a php stream resource. - * - * @return resource - */ - public static function createStreamContext(StreamInterface $stream) - { - return \stream_context_create(['guzzle' => ['stream' => $stream]]); - } - /** - * Registers the stream wrapper if needed - */ - public static function register() : void - { - if (!\in_array('guzzle', \stream_get_wrappers())) { - \stream_wrapper_register('guzzle', __CLASS__); - } - } - public function stream_open(string $path, string $mode, int $options, string &$opened_path = null) : bool - { - $options = \stream_context_get_options($this->context); - if (!isset($options['guzzle']['stream'])) { - return \false; - } - $this->mode = $mode; - $this->stream = $options['guzzle']['stream']; - return \true; - } - public function stream_read(int $count) : string - { - return $this->stream->read($count); - } - public function stream_write(string $data) : int - { - return $this->stream->write($data); - } - public function stream_tell() : int - { - return $this->stream->tell(); - } - public function stream_eof() : bool - { - return $this->stream->eof(); - } - public function stream_seek(int $offset, int $whence) : bool - { - $this->stream->seek($offset, $whence); - return \true; - } - /** - * @return resource|false - */ - public function stream_cast(int $cast_as) - { - $stream = clone $this->stream; - $resource = $stream->detach(); - return $resource ?? \false; - } - /** - * @return array - */ - public function stream_stat() : array - { - static $modeMap = ['r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188]; - return ['dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; - } - /** - * @return array - */ - public function url_stat(string $path, int $flags) : array - { - return ['dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/UploadedFile.php b/dependencies/guzzlehttp/psr7/src/UploadedFile.php deleted file mode 100644 index 36754bf..0000000 --- a/dependencies/guzzlehttp/psr7/src/UploadedFile.php +++ /dev/null @@ -1,152 +0,0 @@ -setError($errorStatus); - $this->size = $size; - $this->clientFilename = $clientFilename; - $this->clientMediaType = $clientMediaType; - if ($this->isOk()) { - $this->setStreamOrFile($streamOrFile); - } - } - /** - * Depending on the value set file or stream variable - * - * @param StreamInterface|string|resource $streamOrFile - * - * @throws InvalidArgumentException - */ - private function setStreamOrFile($streamOrFile) : void - { - if (\is_string($streamOrFile)) { - $this->file = $streamOrFile; - } elseif (\is_resource($streamOrFile)) { - $this->stream = new Stream($streamOrFile); - } elseif ($streamOrFile instanceof StreamInterface) { - $this->stream = $streamOrFile; - } else { - throw new InvalidArgumentException('Invalid stream or file provided for UploadedFile'); - } - } - /** - * @throws InvalidArgumentException - */ - private function setError(int $error) : void - { - if (\false === \in_array($error, UploadedFile::ERRORS, \true)) { - throw new InvalidArgumentException('Invalid error status for UploadedFile'); - } - $this->error = $error; - } - private function isStringNotEmpty($param) : bool - { - return \is_string($param) && \false === empty($param); - } - /** - * Return true if there is no upload error - */ - private function isOk() : bool - { - return $this->error === \UPLOAD_ERR_OK; - } - public function isMoved() : bool - { - return $this->moved; - } - /** - * @throws RuntimeException if is moved or not ok - */ - private function validateActive() : void - { - if (\false === $this->isOk()) { - throw new RuntimeException('Cannot retrieve stream due to upload error'); - } - if ($this->isMoved()) { - throw new RuntimeException('Cannot retrieve stream after it has already been moved'); - } - } - public function getStream() : StreamInterface - { - $this->validateActive(); - if ($this->stream instanceof StreamInterface) { - return $this->stream; - } - /** @var string $file */ - $file = $this->file; - return new LazyOpenStream($file, 'r+'); - } - public function moveTo($targetPath) : void - { - $this->validateActive(); - if (\false === $this->isStringNotEmpty($targetPath)) { - throw new InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string'); - } - if ($this->file) { - $this->moved = \PHP_SAPI === 'cli' ? \rename($this->file, $targetPath) : \move_uploaded_file($this->file, $targetPath); - } else { - Utils::copyToStream($this->getStream(), new LazyOpenStream($targetPath, 'w')); - $this->moved = \true; - } - if (\false === $this->moved) { - throw new RuntimeException(\sprintf('Uploaded file could not be moved to %s', $targetPath)); - } - } - public function getSize() : ?int - { - return $this->size; - } - public function getError() : int - { - return $this->error; - } - public function getClientFilename() : ?string - { - return $this->clientFilename; - } - public function getClientMediaType() : ?string - { - return $this->clientMediaType; - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Uri.php b/dependencies/guzzlehttp/psr7/src/Uri.php deleted file mode 100644 index a8617a5..0000000 --- a/dependencies/guzzlehttp/psr7/src/Uri.php +++ /dev/null @@ -1,570 +0,0 @@ - 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389]; - /** - * Unreserved characters for use in a regex. - * - * @see https://tools.ietf.org/html/rfc3986#section-2.3 - */ - private const CHAR_UNRESERVED = 'a-zA-Z0-9_\\-\\.~'; - /** - * Sub-delims for use in a regex. - * - * @see https://tools.ietf.org/html/rfc3986#section-2.2 - */ - private const CHAR_SUB_DELIMS = '!\\$&\'\\(\\)\\*\\+,;='; - private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26']; - /** @var string Uri scheme. */ - private $scheme = ''; - /** @var string Uri user info. */ - private $userInfo = ''; - /** @var string Uri host. */ - private $host = ''; - /** @var int|null Uri port. */ - private $port; - /** @var string Uri path. */ - private $path = ''; - /** @var string Uri query string. */ - private $query = ''; - /** @var string Uri fragment. */ - private $fragment = ''; - /** @var string|null String representation */ - private $composedComponents; - public function __construct(string $uri = '') - { - if ($uri !== '') { - $parts = self::parse($uri); - if ($parts === \false) { - throw new MalformedUriException("Unable to parse URI: {$uri}"); - } - $this->applyParts($parts); - } - } - /** - * UTF-8 aware \parse_url() replacement. - * - * The internal function produces broken output for non ASCII domain names - * (IDN) when used with locales other than "C". - * - * On the other hand, cURL understands IDN correctly only when UTF-8 locale - * is configured ("C.UTF-8", "en_US.UTF-8", etc.). - * - * @see https://bugs.php.net/bug.php?id=52923 - * @see https://www.php.net/manual/en/function.parse-url.php#114817 - * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING - * - * @return array|false - */ - private static function parse(string $url) - { - // If IPv6 - $prefix = ''; - if (\preg_match('%^(.*://\\[[0-9:a-f]+\\])(.*?)$%', $url, $matches)) { - /** @var array{0:string, 1:string, 2:string} $matches */ - $prefix = $matches[1]; - $url = $matches[2]; - } - /** @var string */ - $encodedUrl = \preg_replace_callback('%[^:/@?&=#]+%usD', static function ($matches) { - return \urlencode($matches[0]); - }, $url); - $result = \parse_url($prefix . $encodedUrl); - if ($result === \false) { - return \false; - } - return \array_map('urldecode', $result); - } - public function __toString() : string - { - if ($this->composedComponents === null) { - $this->composedComponents = self::composeComponents($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); - } - return $this->composedComponents; - } - /** - * Composes a URI reference string from its various components. - * - * Usually this method does not need to be called manually but instead is used indirectly via - * `Psr\Http\Message\UriInterface::__toString`. - * - * PSR-7 UriInterface treats an empty component the same as a missing component as - * getQuery(), getFragment() etc. always return a string. This explains the slight - * difference to RFC 3986 Section 5.3. - * - * Another adjustment is that the authority separator is added even when the authority is missing/empty - * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with - * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But - * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to - * that format). - * - * @see https://tools.ietf.org/html/rfc3986#section-5.3 - */ - public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment) : string - { - $uri = ''; - // weak type checks to also accept null until we can add scalar type hints - if ($scheme != '') { - $uri .= $scheme . ':'; - } - if ($authority != '' || $scheme === 'file') { - $uri .= '//' . $authority; - } - if ($authority != '' && $path != '' && $path[0] != '/') { - $path = '/' . $path; - } - $uri .= $path; - if ($query != '') { - $uri .= '?' . $query; - } - if ($fragment != '') { - $uri .= '#' . $fragment; - } - return $uri; - } - /** - * Whether the URI has the default port of the current scheme. - * - * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used - * independently of the implementation. - */ - public static function isDefaultPort(UriInterface $uri) : bool - { - return $uri->getPort() === null || isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]; - } - /** - * Whether the URI is absolute, i.e. it has a scheme. - * - * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true - * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative - * to another URI, the base URI. Relative references can be divided into several forms: - * - network-path references, e.g. '//example.com/path' - * - absolute-path references, e.g. '/path' - * - relative-path references, e.g. 'subpath' - * - * @see Uri::isNetworkPathReference - * @see Uri::isAbsolutePathReference - * @see Uri::isRelativePathReference - * @see https://tools.ietf.org/html/rfc3986#section-4 - */ - public static function isAbsolute(UriInterface $uri) : bool - { - return $uri->getScheme() !== ''; - } - /** - * Whether the URI is a network-path reference. - * - * A relative reference that begins with two slash characters is termed an network-path reference. - * - * @see https://tools.ietf.org/html/rfc3986#section-4.2 - */ - public static function isNetworkPathReference(UriInterface $uri) : bool - { - return $uri->getScheme() === '' && $uri->getAuthority() !== ''; - } - /** - * Whether the URI is a absolute-path reference. - * - * A relative reference that begins with a single slash character is termed an absolute-path reference. - * - * @see https://tools.ietf.org/html/rfc3986#section-4.2 - */ - public static function isAbsolutePathReference(UriInterface $uri) : bool - { - return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/'; - } - /** - * Whether the URI is a relative-path reference. - * - * A relative reference that does not begin with a slash character is termed a relative-path reference. - * - * @see https://tools.ietf.org/html/rfc3986#section-4.2 - */ - public static function isRelativePathReference(UriInterface $uri) : bool - { - return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); - } - /** - * Whether the URI is a same-document reference. - * - * A same-document reference refers to a URI that is, aside from its fragment - * component, identical to the base URI. When no base URI is given, only an empty - * URI reference (apart from its fragment) is considered a same-document reference. - * - * @param UriInterface $uri The URI to check - * @param UriInterface|null $base An optional base URI to compare against - * - * @see https://tools.ietf.org/html/rfc3986#section-4.4 - */ - public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) : bool - { - if ($base !== null) { - $uri = UriResolver::resolve($base, $uri); - return $uri->getScheme() === $base->getScheme() && $uri->getAuthority() === $base->getAuthority() && $uri->getPath() === $base->getPath() && $uri->getQuery() === $base->getQuery(); - } - return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; - } - /** - * Creates a new URI with a specific query string value removed. - * - * Any existing query string values that exactly match the provided key are - * removed. - * - * @param UriInterface $uri URI to use as a base. - * @param string $key Query string key to remove. - */ - public static function withoutQueryValue(UriInterface $uri, string $key) : UriInterface - { - $result = self::getFilteredQueryString($uri, [$key]); - return $uri->withQuery(\implode('&', $result)); - } - /** - * Creates a new URI with a specific query string value. - * - * Any existing query string values that exactly match the provided key are - * removed and replaced with the given key value pair. - * - * A value of null will set the query string key without a value, e.g. "key" - * instead of "key=value". - * - * @param UriInterface $uri URI to use as a base. - * @param string $key Key to set. - * @param string|null $value Value to set - */ - public static function withQueryValue(UriInterface $uri, string $key, ?string $value) : UriInterface - { - $result = self::getFilteredQueryString($uri, [$key]); - $result[] = self::generateQueryString($key, $value); - return $uri->withQuery(\implode('&', $result)); - } - /** - * Creates a new URI with multiple specific query string values. - * - * It has the same behavior as withQueryValue() but for an associative array of key => value. - * - * @param UriInterface $uri URI to use as a base. - * @param array $keyValueArray Associative array of key and values - */ - public static function withQueryValues(UriInterface $uri, array $keyValueArray) : UriInterface - { - $result = self::getFilteredQueryString($uri, \array_keys($keyValueArray)); - foreach ($keyValueArray as $key => $value) { - $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null); - } - return $uri->withQuery(\implode('&', $result)); - } - /** - * Creates a URI from a hash of `parse_url` components. - * - * @see http://php.net/manual/en/function.parse-url.php - * - * @throws MalformedUriException If the components do not form a valid URI. - */ - public static function fromParts(array $parts) : UriInterface - { - $uri = new self(); - $uri->applyParts($parts); - $uri->validateState(); - return $uri; - } - public function getScheme() : string - { - return $this->scheme; - } - public function getAuthority() : string - { - $authority = $this->host; - if ($this->userInfo !== '') { - $authority = $this->userInfo . '@' . $authority; - } - if ($this->port !== null) { - $authority .= ':' . $this->port; - } - return $authority; - } - public function getUserInfo() : string - { - return $this->userInfo; - } - public function getHost() : string - { - return $this->host; - } - public function getPort() : ?int - { - return $this->port; - } - public function getPath() : string - { - return $this->path; - } - public function getQuery() : string - { - return $this->query; - } - public function getFragment() : string - { - return $this->fragment; - } - public function withScheme($scheme) : UriInterface - { - $scheme = $this->filterScheme($scheme); - if ($this->scheme === $scheme) { - return $this; - } - $new = clone $this; - $new->scheme = $scheme; - $new->composedComponents = null; - $new->removeDefaultPort(); - $new->validateState(); - return $new; - } - public function withUserInfo($user, $password = null) : UriInterface - { - $info = $this->filterUserInfoComponent($user); - if ($password !== null) { - $info .= ':' . $this->filterUserInfoComponent($password); - } - if ($this->userInfo === $info) { - return $this; - } - $new = clone $this; - $new->userInfo = $info; - $new->composedComponents = null; - $new->validateState(); - return $new; - } - public function withHost($host) : UriInterface - { - $host = $this->filterHost($host); - if ($this->host === $host) { - return $this; - } - $new = clone $this; - $new->host = $host; - $new->composedComponents = null; - $new->validateState(); - return $new; - } - public function withPort($port) : UriInterface - { - $port = $this->filterPort($port); - if ($this->port === $port) { - return $this; - } - $new = clone $this; - $new->port = $port; - $new->composedComponents = null; - $new->removeDefaultPort(); - $new->validateState(); - return $new; - } - public function withPath($path) : UriInterface - { - $path = $this->filterPath($path); - if ($this->path === $path) { - return $this; - } - $new = clone $this; - $new->path = $path; - $new->composedComponents = null; - $new->validateState(); - return $new; - } - public function withQuery($query) : UriInterface - { - $query = $this->filterQueryAndFragment($query); - if ($this->query === $query) { - return $this; - } - $new = clone $this; - $new->query = $query; - $new->composedComponents = null; - return $new; - } - public function withFragment($fragment) : UriInterface - { - $fragment = $this->filterQueryAndFragment($fragment); - if ($this->fragment === $fragment) { - return $this; - } - $new = clone $this; - $new->fragment = $fragment; - $new->composedComponents = null; - return $new; - } - public function jsonSerialize() : string - { - return $this->__toString(); - } - /** - * Apply parse_url parts to a URI. - * - * @param array $parts Array of parse_url parts to apply. - */ - private function applyParts(array $parts) : void - { - $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; - $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : ''; - $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; - $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; - $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; - $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; - $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; - if (isset($parts['pass'])) { - $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); - } - $this->removeDefaultPort(); - } - /** - * @param mixed $scheme - * - * @throws \InvalidArgumentException If the scheme is invalid. - */ - private function filterScheme($scheme) : string - { - if (!\is_string($scheme)) { - throw new \InvalidArgumentException('Scheme must be a string'); - } - return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); - } - /** - * @param mixed $component - * - * @throws \InvalidArgumentException If the user info is invalid. - */ - private function filterUserInfoComponent($component) : string - { - if (!\is_string($component)) { - throw new \InvalidArgumentException('User info must be a string'); - } - return \preg_replace_callback('/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component); - } - /** - * @param mixed $host - * - * @throws \InvalidArgumentException If the host is invalid. - */ - private function filterHost($host) : string - { - if (!\is_string($host)) { - throw new \InvalidArgumentException('Host must be a string'); - } - return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); - } - /** - * @param mixed $port - * - * @throws \InvalidArgumentException If the port is invalid. - */ - private function filterPort($port) : ?int - { - if ($port === null) { - return null; - } - $port = (int) $port; - if (0 > $port || 0xffff < $port) { - throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); - } - return $port; - } - /** - * @param string[] $keys - * - * @return string[] - */ - private static function getFilteredQueryString(UriInterface $uri, array $keys) : array - { - $current = $uri->getQuery(); - if ($current === '') { - return []; - } - $decodedKeys = \array_map('rawurldecode', $keys); - return \array_filter(\explode('&', $current), function ($part) use($decodedKeys) { - return !\in_array(\rawurldecode(\explode('=', $part)[0]), $decodedKeys, \true); - }); - } - private static function generateQueryString(string $key, ?string $value) : string - { - // Query string separators ("=", "&") within the key or value need to be encoded - // (while preventing double-encoding) before setting the query string. All other - // chars that need percent-encoding will be encoded by withQuery(). - $queryString = \strtr($key, self::QUERY_SEPARATORS_REPLACEMENT); - if ($value !== null) { - $queryString .= '=' . \strtr($value, self::QUERY_SEPARATORS_REPLACEMENT); - } - return $queryString; - } - private function removeDefaultPort() : void - { - if ($this->port !== null && self::isDefaultPort($this)) { - $this->port = null; - } - } - /** - * Filters the path of a URI - * - * @param mixed $path - * - * @throws \InvalidArgumentException If the path is invalid. - */ - private function filterPath($path) : string - { - if (!\is_string($path)) { - throw new \InvalidArgumentException('Path must be a string'); - } - return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path); - } - /** - * Filters the query string or fragment of a URI. - * - * @param mixed $str - * - * @throws \InvalidArgumentException If the query or fragment is invalid. - */ - private function filterQueryAndFragment($str) : string - { - if (!\is_string($str)) { - throw new \InvalidArgumentException('Query and fragment must be a string'); - } - return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str); - } - private function rawurlencodeMatchZero(array $match) : string - { - return \rawurlencode($match[0]); - } - private function validateState() : void - { - if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { - $this->host = self::HTTP_DEFAULT_HOST; - } - if ($this->getAuthority() === '') { - if (0 === \strpos($this->path, '//')) { - throw new MalformedUriException('The path of a URI without an authority must not start with two slashes "//"'); - } - if ($this->scheme === '' && \false !== \strpos(\explode('/', $this->path, 2)[0], ':')) { - throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon'); - } - } - } -} diff --git a/dependencies/guzzlehttp/psr7/src/UriComparator.php b/dependencies/guzzlehttp/psr7/src/UriComparator.php deleted file mode 100644 index 9a5d709..0000000 --- a/dependencies/guzzlehttp/psr7/src/UriComparator.php +++ /dev/null @@ -1,43 +0,0 @@ -getHost(), $modified->getHost()) !== 0) { - return \true; - } - if ($original->getScheme() !== $modified->getScheme()) { - return \true; - } - if (self::computePort($original) !== self::computePort($modified)) { - return \true; - } - return \false; - } - private static function computePort(UriInterface $uri) : int - { - $port = $uri->getPort(); - if (null !== $port) { - return $port; - } - return 'https' === $uri->getScheme() ? 443 : 80; - } - private function __construct() - { - // cannot be instantiated - } -} diff --git a/dependencies/guzzlehttp/psr7/src/UriNormalizer.php b/dependencies/guzzlehttp/psr7/src/UriNormalizer.php deleted file mode 100644 index 02a421a..0000000 --- a/dependencies/guzzlehttp/psr7/src/UriNormalizer.php +++ /dev/null @@ -1,175 +0,0 @@ -getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) { - $uri = $uri->withPath('/'); - } - if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { - $uri = $uri->withHost(''); - } - if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { - $uri = $uri->withPort(null); - } - if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { - $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); - } - if ($flags & self::REMOVE_DUPLICATE_SLASHES) { - $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath())); - } - if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { - $queryKeyValues = \explode('&', $uri->getQuery()); - \sort($queryKeyValues); - $uri = $uri->withQuery(\implode('&', $queryKeyValues)); - } - return $uri; - } - /** - * Whether two URIs can be considered equivalent. - * - * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also - * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be - * resolved against the same base URI. If this is not the case, determination of equivalence or difference of - * relative references does not mean anything. - * - * @param UriInterface $uri1 An URI to compare - * @param UriInterface $uri2 An URI to compare - * @param int $normalizations A bitmask of normalizations to apply, see constants - * - * @see https://tools.ietf.org/html/rfc3986#section-6.1 - */ - public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS) : bool - { - return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); - } - private static function capitalizePercentEncoding(UriInterface $uri) : UriInterface - { - $regex = '/(?:%[A-Fa-f0-9]{2})++/'; - $callback = function (array $match) { - return \strtoupper($match[0]); - }; - return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); - } - private static function decodeUnreservedCharacters(UriInterface $uri) : UriInterface - { - $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; - $callback = function (array $match) { - return \rawurldecode($match[0]); - }; - return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); - } - private function __construct() - { - // cannot be instantiated - } -} diff --git a/dependencies/guzzlehttp/psr7/src/UriResolver.php b/dependencies/guzzlehttp/psr7/src/UriResolver.php deleted file mode 100644 index 93989b6..0000000 --- a/dependencies/guzzlehttp/psr7/src/UriResolver.php +++ /dev/null @@ -1,180 +0,0 @@ -getScheme() != '') { - return $rel->withPath(self::removeDotSegments($rel->getPath())); - } - if ($rel->getAuthority() != '') { - $targetAuthority = $rel->getAuthority(); - $targetPath = self::removeDotSegments($rel->getPath()); - $targetQuery = $rel->getQuery(); - } else { - $targetAuthority = $base->getAuthority(); - if ($rel->getPath() === '') { - $targetPath = $base->getPath(); - $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); - } else { - if ($rel->getPath()[0] === '/') { - $targetPath = $rel->getPath(); - } else { - if ($targetAuthority != '' && $base->getPath() === '') { - $targetPath = '/' . $rel->getPath(); - } else { - $lastSlashPos = \strrpos($base->getPath(), '/'); - if ($lastSlashPos === \false) { - $targetPath = $rel->getPath(); - } else { - $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); - } - } - } - $targetPath = self::removeDotSegments($targetPath); - $targetQuery = $rel->getQuery(); - } - } - return new Uri(Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment())); - } - /** - * Returns the target URI as a relative reference from the base URI. - * - * This method is the counterpart to resolve(): - * - * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) - * - * One use-case is to use the current request URI as base URI and then generate relative links in your documents - * to reduce the document size or offer self-contained downloadable document archives. - * - * $base = new Uri('http://example.com/a/b/'); - * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. - * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. - * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. - * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. - * - * This method also accepts a target that is already relative and will try to relativize it further. Only a - * relative-path reference will be returned as-is. - * - * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well - */ - public static function relativize(UriInterface $base, UriInterface $target) : UriInterface - { - if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) { - return $target; - } - if (Uri::isRelativePathReference($target)) { - // As the target is already highly relative we return it as-is. It would be possible to resolve - // the target with `$target = self::resolve($base, $target);` and then try make it more relative - // by removing a duplicate query. But let's not do that automatically. - return $target; - } - if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { - return $target->withScheme(''); - } - // We must remove the path before removing the authority because if the path starts with two slashes, the URI - // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also - // invalid. - $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); - if ($base->getPath() !== $target->getPath()) { - return $emptyPathUri->withPath(self::getRelativePath($base, $target)); - } - if ($base->getQuery() === $target->getQuery()) { - // Only the target fragment is left. And it must be returned even if base and target fragment are the same. - return $emptyPathUri->withQuery(''); - } - // If the base URI has a query but the target has none, we cannot return an empty path reference as it would - // inherit the base query component when resolving. - if ($target->getQuery() === '') { - $segments = \explode('/', $target->getPath()); - /** @var string $lastSegment */ - $lastSegment = \end($segments); - return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); - } - return $emptyPathUri; - } - private static function getRelativePath(UriInterface $base, UriInterface $target) : string - { - $sourceSegments = \explode('/', $base->getPath()); - $targetSegments = \explode('/', $target->getPath()); - \array_pop($sourceSegments); - $targetLastSegment = \array_pop($targetSegments); - foreach ($sourceSegments as $i => $segment) { - if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { - unset($sourceSegments[$i], $targetSegments[$i]); - } else { - break; - } - } - $targetSegments[] = $targetLastSegment; - $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); - // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". - // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used - // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. - if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) { - $relativePath = "./{$relativePath}"; - } elseif ('/' === $relativePath[0]) { - if ($base->getAuthority() != '' && $base->getPath() === '') { - // In this case an extra slash is added by resolve() automatically. So we must not add one here. - $relativePath = ".{$relativePath}"; - } else { - $relativePath = "./{$relativePath}"; - } - } - return $relativePath; - } - private function __construct() - { - // cannot be instantiated - } -} diff --git a/dependencies/guzzlehttp/psr7/src/Utils.php b/dependencies/guzzlehttp/psr7/src/Utils.php deleted file mode 100644 index be98511..0000000 --- a/dependencies/guzzlehttp/psr7/src/Utils.php +++ /dev/null @@ -1,375 +0,0 @@ - $v) { - if (!\is_string($k) || !\in_array(\strtolower($k), $keys)) { - $result[$k] = $v; - } - } - return $result; - } - /** - * Copy the contents of a stream into another stream until the given number - * of bytes have been read. - * - * @param StreamInterface $source Stream to read from - * @param StreamInterface $dest Stream to write to - * @param int $maxLen Maximum number of bytes to read. Pass -1 - * to read the entire stream. - * - * @throws \RuntimeException on error. - */ - public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1) : void - { - $bufferSize = 8192; - if ($maxLen === -1) { - while (!$source->eof()) { - if (!$dest->write($source->read($bufferSize))) { - break; - } - } - } else { - $remaining = $maxLen; - while ($remaining > 0 && !$source->eof()) { - $buf = $source->read(\min($bufferSize, $remaining)); - $len = \strlen($buf); - if (!$len) { - break; - } - $remaining -= $len; - $dest->write($buf); - } - } - } - /** - * Copy the contents of a stream into a string until the given number of - * bytes have been read. - * - * @param StreamInterface $stream Stream to read - * @param int $maxLen Maximum number of bytes to read. Pass -1 - * to read the entire stream. - * - * @throws \RuntimeException on error. - */ - public static function copyToString(StreamInterface $stream, int $maxLen = -1) : string - { - $buffer = ''; - if ($maxLen === -1) { - while (!$stream->eof()) { - $buf = $stream->read(1048576); - if ($buf === '') { - break; - } - $buffer .= $buf; - } - return $buffer; - } - $len = 0; - while (!$stream->eof() && $len < $maxLen) { - $buf = $stream->read($maxLen - $len); - if ($buf === '') { - break; - } - $buffer .= $buf; - $len = \strlen($buffer); - } - return $buffer; - } - /** - * Calculate a hash of a stream. - * - * This method reads the entire stream to calculate a rolling hash, based - * on PHP's `hash_init` functions. - * - * @param StreamInterface $stream Stream to calculate the hash for - * @param string $algo Hash algorithm (e.g. md5, crc32, etc) - * @param bool $rawOutput Whether or not to use raw output - * - * @throws \RuntimeException on error. - */ - public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = \false) : string - { - $pos = $stream->tell(); - if ($pos > 0) { - $stream->rewind(); - } - $ctx = \hash_init($algo); - while (!$stream->eof()) { - \hash_update($ctx, $stream->read(1048576)); - } - $out = \hash_final($ctx, $rawOutput); - $stream->seek($pos); - return $out; - } - /** - * Clone and modify a request with the given changes. - * - * This method is useful for reducing the number of clones needed to mutate - * a message. - * - * The changes can be one of: - * - method: (string) Changes the HTTP method. - * - set_headers: (array) Sets the given headers. - * - remove_headers: (array) Remove the given headers. - * - body: (mixed) Sets the given body. - * - uri: (UriInterface) Set the URI. - * - query: (string) Set the query string value of the URI. - * - version: (string) Set the protocol version. - * - * @param RequestInterface $request Request to clone and modify. - * @param array $changes Changes to apply. - */ - public static function modifyRequest(RequestInterface $request, array $changes) : RequestInterface - { - if (!$changes) { - return $request; - } - $headers = $request->getHeaders(); - if (!isset($changes['uri'])) { - $uri = $request->getUri(); - } else { - // Remove the host header if one is on the URI - if ($host = $changes['uri']->getHost()) { - $changes['set_headers']['Host'] = $host; - if ($port = $changes['uri']->getPort()) { - $standardPorts = ['http' => 80, 'https' => 443]; - $scheme = $changes['uri']->getScheme(); - if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { - $changes['set_headers']['Host'] .= ':' . $port; - } - } - } - $uri = $changes['uri']; - } - if (!empty($changes['remove_headers'])) { - $headers = self::caselessRemove($changes['remove_headers'], $headers); - } - if (!empty($changes['set_headers'])) { - $headers = self::caselessRemove(\array_keys($changes['set_headers']), $headers); - $headers = $changes['set_headers'] + $headers; - } - if (isset($changes['query'])) { - $uri = $uri->withQuery($changes['query']); - } - if ($request instanceof ServerRequestInterface) { - $new = (new ServerRequest($changes['method'] ?? $request->getMethod(), $uri, $headers, $changes['body'] ?? $request->getBody(), $changes['version'] ?? $request->getProtocolVersion(), $request->getServerParams()))->withParsedBody($request->getParsedBody())->withQueryParams($request->getQueryParams())->withCookieParams($request->getCookieParams())->withUploadedFiles($request->getUploadedFiles()); - foreach ($request->getAttributes() as $key => $value) { - $new = $new->withAttribute($key, $value); - } - return $new; - } - return new Request($changes['method'] ?? $request->getMethod(), $uri, $headers, $changes['body'] ?? $request->getBody(), $changes['version'] ?? $request->getProtocolVersion()); - } - /** - * Read a line from the stream up to the maximum allowed buffer length. - * - * @param StreamInterface $stream Stream to read from - * @param int|null $maxLength Maximum buffer length - */ - public static function readLine(StreamInterface $stream, int $maxLength = null) : string - { - $buffer = ''; - $size = 0; - while (!$stream->eof()) { - if ('' === ($byte = $stream->read(1))) { - return $buffer; - } - $buffer .= $byte; - // Break when a new line is found or the max length - 1 is reached - if ($byte === "\n" || ++$size === $maxLength - 1) { - break; - } - } - return $buffer; - } - /** - * Create a new stream based on the input type. - * - * Options is an associative array that can contain the following keys: - * - metadata: Array of custom metadata. - * - size: Size of the stream. - * - * This method accepts the following `$resource` types: - * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. - * - `string`: Creates a stream object that uses the given string as the contents. - * - `resource`: Creates a stream object that wraps the given PHP stream resource. - * - `Iterator`: If the provided value implements `Iterator`, then a read-only - * stream object will be created that wraps the given iterable. Each time the - * stream is read from, data from the iterator will fill a buffer and will be - * continuously called until the buffer is equal to the requested read size. - * Subsequent read calls will first read from the buffer and then call `next` - * on the underlying iterator until it is exhausted. - * - `object` with `__toString()`: If the object has the `__toString()` method, - * the object will be cast to a string and then a stream will be returned that - * uses the string value. - * - `NULL`: When `null` is passed, an empty stream object is returned. - * - `callable` When a callable is passed, a read-only stream object will be - * created that invokes the given callable. The callable is invoked with the - * number of suggested bytes to read. The callable can return any number of - * bytes, but MUST return `false` when there is no more data to return. The - * stream object that wraps the callable will invoke the callable until the - * number of requested bytes are available. Any additional bytes will be - * buffered and used in subsequent reads. - * - * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data - * @param array{size?: int, metadata?: array} $options Additional options - * - * @throws \InvalidArgumentException if the $resource arg is not valid. - */ - public static function streamFor($resource = '', array $options = []) : StreamInterface - { - if (\is_scalar($resource)) { - $stream = self::tryFopen('php://temp', 'r+'); - if ($resource !== '') { - \fwrite($stream, (string) $resource); - \fseek($stream, 0); - } - return new Stream($stream, $options); - } - switch (\gettype($resource)) { - case 'resource': - /* - * The 'php://input' is a special stream with quirks and inconsistencies. - * We avoid using that stream by reading it into php://temp - */ - /** @var resource $resource */ - if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') { - $stream = self::tryFopen('php://temp', 'w+'); - \stream_copy_to_stream($resource, $stream); - \fseek($stream, 0); - $resource = $stream; - } - return new Stream($resource, $options); - case 'object': - /** @var object $resource */ - if ($resource instanceof StreamInterface) { - return $resource; - } elseif ($resource instanceof \Iterator) { - return new PumpStream(function () use($resource) { - if (!$resource->valid()) { - return \false; - } - $result = $resource->current(); - $resource->next(); - return $result; - }, $options); - } elseif (\method_exists($resource, '__toString')) { - return self::streamFor((string) $resource, $options); - } - break; - case 'NULL': - return new Stream(self::tryFopen('php://temp', 'r+'), $options); - } - if (\is_callable($resource)) { - return new PumpStream($resource, $options); - } - throw new \InvalidArgumentException('Invalid resource type: ' . \gettype($resource)); - } - /** - * Safely opens a PHP stream resource using a filename. - * - * When fopen fails, PHP normally raises a warning. This function adds an - * error handler that checks for errors and throws an exception instead. - * - * @param string $filename File to open - * @param string $mode Mode used to open the file - * - * @return resource - * - * @throws \RuntimeException if the file cannot be opened - */ - public static function tryFopen(string $filename, string $mode) - { - $ex = null; - \set_error_handler(static function (int $errno, string $errstr) use($filename, $mode, &$ex) : bool { - $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $errstr)); - return \true; - }); - try { - /** @var resource $handle */ - $handle = \fopen($filename, $mode); - } catch (\Throwable $e) { - $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $e->getMessage()), 0, $e); - } - \restore_error_handler(); - if ($ex) { - /** @var $ex \RuntimeException */ - throw $ex; - } - return $handle; - } - /** - * Safely gets the contents of a given stream. - * - * When stream_get_contents fails, PHP normally raises a warning. This - * function adds an error handler that checks for errors and throws an - * exception instead. - * - * @param resource $stream - * - * @throws \RuntimeException if the stream cannot be read - */ - public static function tryGetContents($stream) : string - { - $ex = null; - \set_error_handler(static function (int $errno, string $errstr) use(&$ex) : bool { - $ex = new \RuntimeException(\sprintf('Unable to read stream contents: %s', $errstr)); - return \true; - }); - try { - /** @var string|false $contents */ - $contents = \stream_get_contents($stream); - if ($contents === \false) { - $ex = new \RuntimeException('Unable to read stream contents'); - } - } catch (\Throwable $e) { - $ex = new \RuntimeException(\sprintf('Unable to read stream contents: %s', $e->getMessage()), 0, $e); - } - \restore_error_handler(); - if ($ex) { - /** @var $ex \RuntimeException */ - throw $ex; - } - return $contents; - } - /** - * Returns a UriInterface for the given value. - * - * This function accepts a string or UriInterface and returns a - * UriInterface for the given value. If the value is already a - * UriInterface, it is returned as-is. - * - * @param string|UriInterface $uri - * - * @throws \InvalidArgumentException - */ - public static function uriFor($uri) : UriInterface - { - if ($uri instanceof UriInterface) { - return $uri; - } - if (\is_string($uri)) { - return new Uri($uri); - } - throw new \InvalidArgumentException('URI must be a string or UriInterface'); - } -} diff --git a/dependencies/hashids/hashids/src/Hashids.php b/dependencies/hashids/hashids/src/Hashids.php deleted file mode 100644 index 1ee28da..0000000 --- a/dependencies/hashids/hashids/src/Hashids.php +++ /dev/null @@ -1,353 +0,0 @@ -salt = \mb_convert_encoding($salt, 'UTF-8', \mb_detect_encoding($salt)); - $this->minHashLength = $minHashLength; - $alphabet = \mb_convert_encoding($alphabet, 'UTF-8', \mb_detect_encoding($alphabet)); - $this->alphabet = \implode('', \array_unique($this->multiByteSplit($alphabet))); - $this->math = $this->getMathExtension(); - if (\mb_strlen($this->alphabet) < 16) { - throw new HashidsException('Alphabet must contain at least 16 unique characters.'); - } - if (\false !== \mb_strpos($this->alphabet, ' ')) { - throw new HashidsException('Alphabet can\'t contain spaces.'); - } - $alphabetArray = $this->multiByteSplit($this->alphabet); - $sepsArray = $this->multiByteSplit($this->seps); - $this->seps = \implode('', \array_intersect($sepsArray, $alphabetArray)); - $this->alphabet = \implode('', \array_diff($alphabetArray, $sepsArray)); - $this->seps = $this->shuffle($this->seps, $this->salt); - if (!$this->seps || \mb_strlen($this->alphabet) / \mb_strlen($this->seps) > self::SEP_DIV) { - $sepsLength = (int) \ceil(\mb_strlen($this->alphabet) / self::SEP_DIV); - if ($sepsLength > \mb_strlen($this->seps)) { - $diff = $sepsLength - \mb_strlen($this->seps); - $this->seps .= \mb_substr($this->alphabet, 0, $diff); - $this->alphabet = \mb_substr($this->alphabet, $diff); - } - } - $this->alphabet = $this->shuffle($this->alphabet, $this->salt); - $guardCount = (int) \ceil(\mb_strlen($this->alphabet) / self::GUARD_DIV); - if (\mb_strlen($this->alphabet) < 3) { - $this->guards = \mb_substr($this->seps, 0, $guardCount); - $this->seps = \mb_substr($this->seps, $guardCount); - } else { - $this->guards = \mb_substr($this->alphabet, 0, $guardCount); - $this->alphabet = \mb_substr($this->alphabet, $guardCount); - } - } - /** - * Encode parameters to generate a hash. - * - * @param mixed $numbers - * - * @return string - */ - public function encode(...$numbers) : string - { - $ret = ''; - if (1 === \count($numbers) && \is_array($numbers[0])) { - $numbers = $numbers[0]; - } - if (!$numbers) { - return $ret; - } - foreach ($numbers as $number) { - $isNumber = \ctype_digit((string) $number); - if (!$isNumber) { - return $ret; - } - } - $alphabet = $this->alphabet; - $numbersSize = \count($numbers); - $numbersHashInt = 0; - foreach ($numbers as $i => $number) { - $numbersHashInt += $this->math->intval($this->math->mod($number, $i + 100)); - } - $lottery = $ret = \mb_substr($alphabet, $numbersHashInt % \mb_strlen($alphabet), 1); - foreach ($numbers as $i => $number) { - $alphabet = $this->shuffle($alphabet, \mb_substr($lottery . $this->salt . $alphabet, 0, \mb_strlen($alphabet))); - $ret .= $last = $this->hash($number, $alphabet); - if ($i + 1 < $numbersSize) { - $number %= \mb_ord($last, 'UTF-8') + $i; - $sepsIndex = $this->math->intval($this->math->mod($number, \mb_strlen($this->seps))); - $ret .= \mb_substr($this->seps, $sepsIndex, 1); - } - } - if (\mb_strlen($ret) < $this->minHashLength) { - $guardIndex = ($numbersHashInt + \mb_ord(\mb_substr($ret, 0, 1), 'UTF-8')) % \mb_strlen($this->guards); - $guard = \mb_substr($this->guards, $guardIndex, 1); - $ret = $guard . $ret; - if (\mb_strlen($ret) < $this->minHashLength) { - $guardIndex = ($numbersHashInt + \mb_ord(\mb_substr($ret, 2, 1), 'UTF-8')) % \mb_strlen($this->guards); - $guard = \mb_substr($this->guards, $guardIndex, 1); - $ret .= $guard; - } - } - $halfLength = (int) (\mb_strlen($alphabet) / 2); - while (\mb_strlen($ret) < $this->minHashLength) { - $alphabet = $this->shuffle($alphabet, $alphabet); - $ret = \mb_substr($alphabet, $halfLength) . $ret . \mb_substr($alphabet, 0, $halfLength); - $excess = \mb_strlen($ret) - $this->minHashLength; - if ($excess > 0) { - $ret = \mb_substr($ret, (int) ($excess / 2), $this->minHashLength); - } - } - return $ret; - } - /** - * Decode a hash to the original parameter values. - * - * @param string $hash - * - * @return array - */ - public function decode($hash) : array - { - $ret = []; - if (!\is_string($hash) || !($hash = \trim($hash))) { - return $ret; - } - $alphabet = $this->alphabet; - $hashBreakdown = \str_replace($this->multiByteSplit($this->guards), ' ', $hash); - $hashArray = \explode(' ', $hashBreakdown); - $i = 3 === \count($hashArray) || 2 === \count($hashArray) ? 1 : 0; - $hashBreakdown = $hashArray[$i]; - if ('' !== $hashBreakdown) { - $lottery = \mb_substr($hashBreakdown, 0, 1); - $hashBreakdown = \mb_substr($hashBreakdown, 1); - $hashBreakdown = \str_replace($this->multiByteSplit($this->seps), ' ', $hashBreakdown); - $hashArray = \explode(' ', $hashBreakdown); - foreach ($hashArray as $subHash) { - $alphabet = $this->shuffle($alphabet, \mb_substr($lottery . $this->salt . $alphabet, 0, \mb_strlen($alphabet))); - $result = $this->unhash($subHash, $alphabet); - if ($this->math->greaterThan($result, \PHP_INT_MAX)) { - $ret[] = $this->math->strval($result); - } else { - $ret[] = $this->math->intval($result); - } - } - if ($this->encode($ret) !== $hash) { - $ret = []; - } - } - return $ret; - } - /** - * Encode hexadecimal values and generate a hash string. - * - * @param string $str - * - * @return string - */ - public function encodeHex($str) : string - { - if (!\ctype_xdigit((string) $str)) { - return ''; - } - $numbers = \trim(\chunk_split($str, 12, ' ')); - $numbers = \explode(' ', $numbers); - foreach ($numbers as $i => $number) { - $numbers[$i] = \hexdec('1' . $number); - } - return $this->encode(...$numbers); - } - /** - * Decode a hexadecimal hash. - * - * @param string $hash - * - * @return string - */ - public function decodeHex($hash) : string - { - $ret = ''; - $numbers = $this->decode($hash); - foreach ($numbers as $i => $number) { - $ret .= \mb_substr(\dechex($number), 1); - } - return $ret; - } - /** - * Shuffle alphabet by given salt. - * - * @param string $alphabet - * @param string $salt - * - * @return string - */ - protected function shuffle($alphabet, $salt) : string - { - $key = $alphabet . ' ' . $salt; - if (isset($this->shuffledAlphabets[$key])) { - return $this->shuffledAlphabets[$key]; - } - $saltLength = \mb_strlen($salt); - $saltArray = $this->multiByteSplit($salt); - if (!$saltLength) { - return $alphabet; - } - $alphabetArray = $this->multiByteSplit($alphabet); - for ($i = \mb_strlen($alphabet) - 1, $v = 0, $p = 0; $i > 0; $i--, $v++) { - $v %= $saltLength; - $p += $int = \mb_ord($saltArray[$v], 'UTF-8'); - $j = ($int + $v + $p) % $i; - $temp = $alphabetArray[$j]; - $alphabetArray[$j] = $alphabetArray[$i]; - $alphabetArray[$i] = $temp; - } - $alphabet = \implode('', $alphabetArray); - $this->shuffledAlphabets[$key] = $alphabet; - return $alphabet; - } - /** - * Hash given input value. - * - * @param string $input - * @param string $alphabet - * - * @return string - */ - protected function hash($input, $alphabet) : string - { - $hash = ''; - $alphabetLength = \mb_strlen($alphabet); - do { - $hash = \mb_substr($alphabet, $this->math->intval($this->math->mod($input, $alphabetLength)), 1) . $hash; - $input = $this->math->divide($input, $alphabetLength); - } while ($this->math->greaterThan($input, 0)); - return $hash; - } - /** - * Unhash given input value. - * - * @param string $input - * @param string $alphabet - * - * @return int - */ - protected function unhash($input, $alphabet) - { - $number = 0; - $inputLength = \mb_strlen($input); - if ($inputLength && $alphabet) { - $alphabetLength = \mb_strlen($alphabet); - $inputChars = $this->multiByteSplit($input); - foreach ($inputChars as $char) { - $position = \mb_strpos($alphabet, $char); - $number = $this->math->multiply($number, $alphabetLength); - $number = $this->math->add($number, $position); - } - } - return $number; - } - /** - * Get BC Math or GMP extension. - * - * @codeCoverageIgnore - * - * @throws \RuntimeException - * - * @return \Hashids\Math\MathInterface - */ - protected function getMathExtension() : MathInterface - { - if (\extension_loaded('gmp')) { - return new Gmp(); - } - if (\function_exists('bcadd')) { - return new Bc(); - } - throw new RuntimeException('Missing BC Math or GMP extension.'); - } - /** - * Replace simple use of $this->multiByteSplit with multi byte string. - * - * @param string $string - * - * @return array - */ - protected function multiByteSplit($string) : array - { - return \preg_split('/(?!^)(?=.)/u', $string) ?: []; - } -} diff --git a/dependencies/hashids/hashids/src/HashidsException.php b/dependencies/hashids/hashids/src/HashidsException.php deleted file mode 100644 index 2c24c7d..0000000 --- a/dependencies/hashids/hashids/src/HashidsException.php +++ /dev/null @@ -1,17 +0,0 @@ - 0; - } - /** - * Converts arbitrary-length integer to PHP integer. - * - * @param string $a - * - * @return int - */ - public function intval($a) - { - return \intval($a); - } - /** - * Converts arbitrary-length integer to PHP string. - * - * @param string $a - * - * @return string - */ - public function strval($a) - { - return $a; - } - /** - * Converts PHP integer to arbitrary-length integer. - * - * @param int $a - * - * @return string - */ - public function get($a) - { - return $a; - } -} diff --git a/dependencies/hashids/hashids/src/Math/Gmp.php b/dependencies/hashids/hashids/src/Math/Gmp.php deleted file mode 100644 index 2c71a80..0000000 --- a/dependencies/hashids/hashids/src/Math/Gmp.php +++ /dev/null @@ -1,108 +0,0 @@ - 0; - } - /** - * Converts arbitrary-length integer to PHP integer. - * - * @param string $a - * - * @return int - */ - public function intval($a) - { - return \gmp_intval($a); - } - /** - * Converts arbitrary-length integer to PHP string. - * - * @param string $a - * - * @return string - */ - public function strval($a) - { - return \gmp_strval($a); - } - /** - * Converts PHP integer to arbitrary-length integer. - * - * @param int $a - * - * @return string - */ - public function get($a) - { - return \gmp_init($a); - } -} diff --git a/dependencies/hashids/hashids/src/Math/MathInterface.php b/dependencies/hashids/hashids/src/Math/MathInterface.php deleted file mode 100644 index efd0b6e..0000000 --- a/dependencies/hashids/hashids/src/Math/MathInterface.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License - * @link https://github.com/ifsnop/mysqldump-php - * - */ -namespace WP_Ultimo\Dependencies\Ifsnop\Mysqldump; - -use Exception; -use PDO; -use PDOException; -/** - * Class Mysqldump. - * - * @category Library - * @author Diego Torres - * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License - * @link https://github.com/ifsnop/mysqldump-php - * - */ -class Mysqldump -{ - // Same as mysqldump. - const MAXLINESIZE = 1000000; - // List of available compression methods as constants. - const GZIP = 'Gzip'; - const BZIP2 = 'Bzip2'; - const NONE = 'None'; - const GZIPSTREAM = 'Gzipstream'; - // List of available connection strings. - const UTF8 = 'utf8'; - const UTF8MB4 = 'utf8mb4'; - const BINARY = 'binary'; - /** - * Database username. - * @var string - */ - public $user; - /** - * Database password. - * @var string - */ - public $pass; - /** - * Connection string for PDO. - * @var string - */ - public $dsn; - /** - * Destination filename, defaults to stdout. - * @var string - */ - public $fileName = 'php://stdout'; - // Internal stuff. - private $tables = array(); - private $views = array(); - private $triggers = array(); - private $procedures = array(); - private $functions = array(); - private $events = array(); - protected $dbHandler = null; - private $dbType = ""; - private $compressManager; - private $typeAdapter; - protected $dumpSettings = array(); - protected $pdoSettings = array(); - private $version; - private $tableColumnTypes = array(); - private $transformTableRowCallable; - private $transformColumnValueCallable; - private $infoCallable; - /** - * Database name, parsed from dsn. - * @var string - */ - private $dbName; - /** - * Host name, parsed from dsn. - * @var string - */ - private $host; - /** - * Dsn string parsed as an array. - * @var array - */ - private $dsnArray = array(); - /** - * Keyed on table name, with the value as the conditions. - * e.g. - 'users' => 'date_registered > NOW() - INTERVAL 6 MONTH' - * - * @var array - */ - private $tableWheres = array(); - private $tableLimits = array(); - protected $dumpSettingsDefault = array( - 'include-tables' => array(), - 'exclude-tables' => array(), - 'include-views' => array(), - 'compress' => Mysqldump::NONE, - 'init_commands' => array(), - 'no-data' => array(), - 'if-not-exists' => \false, - 'reset-auto-increment' => \false, - 'add-drop-database' => \false, - 'add-drop-table' => \false, - 'add-drop-trigger' => \true, - 'add-locks' => \true, - 'complete-insert' => \false, - 'databases' => \false, - 'default-character-set' => Mysqldump::UTF8, - 'disable-keys' => \true, - 'extended-insert' => \true, - 'events' => \false, - 'hex-blob' => \true, - /* faster than escaped content */ - 'insert-ignore' => \false, - 'net_buffer_length' => self::MAXLINESIZE, - 'no-autocommit' => \true, - 'no-create-db' => \false, - 'no-create-info' => \false, - 'lock-tables' => \true, - 'routines' => \false, - 'single-transaction' => \true, - 'skip-triggers' => \false, - 'skip-tz-utc' => \false, - 'skip-comments' => \false, - 'skip-dump-date' => \false, - 'skip-definer' => \false, - 'where' => '', - /* deprecated */ - 'disable-foreign-keys-check' => \true, - ); - protected $pdoSettingsDefault = array(PDO::ATTR_PERSISTENT => \true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); - /** - * Constructor of Mysqldump. Note that in the case of an SQLite database - * connection, the filename must be in the $db parameter. - * - * @param string $dsn PDO DSN connection string - * @param string $user SQL account username - * @param string $pass SQL account password - * @param array $dumpSettings SQL database settings - * @param array $pdoSettings PDO configured attributes - */ - public function __construct($dsn = '', $user = '', $pass = '', $dumpSettings = array(), $pdoSettings = array()) - { - $this->user = $user; - $this->pass = $pass; - $this->parseDsn($dsn); - // This drops MYSQL dependency, only use the constant if it's defined. - if ("mysql" === $this->dbType) { - $this->pdoSettingsDefault[PDO::MYSQL_ATTR_USE_BUFFERED_QUERY] = \false; - } - $this->pdoSettings = \array_replace_recursive($this->pdoSettingsDefault, $pdoSettings); - $this->dumpSettings = \array_replace_recursive($this->dumpSettingsDefault, $dumpSettings); - $this->dumpSettings['init_commands'][] = "SET NAMES " . $this->dumpSettings['default-character-set']; - if (\false === $this->dumpSettings['skip-tz-utc']) { - $this->dumpSettings['init_commands'][] = "SET TIME_ZONE='+00:00'"; - } - $diff = \array_diff(\array_keys($this->dumpSettings), \array_keys($this->dumpSettingsDefault)); - if (\count($diff) > 0) { - throw new Exception("Unexpected value in dumpSettings: (" . \implode(",", $diff) . ")"); - } - if (!\is_array($this->dumpSettings['include-tables']) || !\is_array($this->dumpSettings['exclude-tables'])) { - throw new Exception("Include-tables and exclude-tables should be arrays"); - } - // If no include-views is passed in, dump the same views as tables, mimic mysqldump behaviour. - if (!isset($dumpSettings['include-views'])) { - $this->dumpSettings['include-views'] = $this->dumpSettings['include-tables']; - } - // Create a new compressManager to manage compressed output - $this->compressManager = CompressManagerFactory::create($this->dumpSettings['compress']); - } - /** - * Destructor of Mysqldump. Unsets dbHandlers and database objects. - */ - public function __destruct() - { - $this->dbHandler = null; - } - /** - * Keyed by table name, with the value as the conditions: - * e.g. 'users' => 'date_registered > NOW() - INTERVAL 6 MONTH AND deleted=0' - * - * @param array $tableWheres - */ - public function setTableWheres(array $tableWheres) - { - $this->tableWheres = $tableWheres; - } - /** - * @param $tableName - * - * @return boolean|mixed - */ - public function getTableWhere($tableName) - { - if (!empty($this->tableWheres[$tableName])) { - return $this->tableWheres[$tableName]; - } elseif ($this->dumpSettings['where']) { - return $this->dumpSettings['where']; - } - return \false; - } - /** - * Keyed by table name, with the value as the numeric limit: - * e.g. 'users' => 3000 - * - * @param array $tableLimits - */ - public function setTableLimits(array $tableLimits) - { - $this->tableLimits = $tableLimits; - } - /** - * Returns the LIMIT for the table. Must be numeric to be returned. - * @param $tableName - * @return boolean - */ - public function getTableLimit($tableName) - { - if (!isset($this->tableLimits[$tableName])) { - return \false; - } - $limit = $this->tableLimits[$tableName]; - if (!\is_numeric($limit)) { - return \false; - } - return $limit; - } - /** - * Import supplied SQL file - * @param string $path Absolute path to imported *.sql file - */ - public function restore($path) - { - if (!$path || !\is_file($path)) { - throw new Exception("File {$path} does not exist."); - } - $handle = \fopen($path, 'rb'); - if (!$handle) { - throw new Exception("Failed reading file {$path}. Check access permissions."); - } - if (!$this->dbHandler) { - $this->connect(); - } - $buffer = ''; - while (!\feof($handle)) { - $line = \trim(\fgets($handle)); - if (\substr($line, 0, 2) == '--' || !$line) { - continue; - // skip comments - } - $buffer .= $line; - // if it has a semicolon at the end, it's the end of the query - if (';' == \substr(\rtrim($line), -1, 1)) { - $this->dbHandler->exec($buffer); - $buffer = ''; - } - } - \fclose($handle); - } - /** - * Parse DSN string and extract dbname value - * Several examples of a DSN string - * mysql:host=localhost;dbname=testdb - * mysql:host=localhost;port=3307;dbname=testdb - * mysql:unix_socket=/tmp/mysql.sock;dbname=testdb - * - * @param string $dsn dsn string to parse - * @return boolean - */ - private function parseDsn($dsn) - { - if (empty($dsn) || \false === ($pos = \strpos($dsn, ":"))) { - throw new Exception("Empty DSN string"); - } - $this->dsn = $dsn; - $this->dbType = \strtolower(\substr($dsn, 0, $pos)); - // always returns a string - if (empty($this->dbType)) { - throw new Exception("Missing database type from DSN string"); - } - $dsn = \substr($dsn, $pos + 1); - foreach (\explode(";", $dsn) as $kvp) { - $kvpArr = \explode("=", $kvp); - $this->dsnArray[\strtolower($kvpArr[0])] = $kvpArr[1]; - } - if (empty($this->dsnArray['host']) && empty($this->dsnArray['unix_socket'])) { - throw new Exception("Missing host from DSN string"); - } - $this->host = !empty($this->dsnArray['host']) ? $this->dsnArray['host'] : $this->dsnArray['unix_socket']; - if (empty($this->dsnArray['dbname'])) { - throw new Exception("Missing database name from DSN string"); - } - $this->dbName = $this->dsnArray['dbname']; - return \true; - } - /** - * Connect with PDO. - * - * @return null - */ - protected function connect() - { - // Connecting with PDO. - try { - switch ($this->dbType) { - case 'sqlite': - $this->dbHandler = @new PDO("sqlite:" . $this->dbName, null, null, $this->pdoSettings); - break; - case 'mysql': - case 'pgsql': - case 'dblib': - $this->dbHandler = @new PDO($this->dsn, $this->user, $this->pass, $this->pdoSettings); - // Execute init commands once connected - foreach ($this->dumpSettings['init_commands'] as $stmt) { - $this->dbHandler->exec($stmt); - } - // Store server version - $this->version = $this->dbHandler->getAttribute(PDO::ATTR_SERVER_VERSION); - break; - default: - throw new Exception("Unsupported database type (" . $this->dbType . ")"); - } - } catch (PDOException $e) { - throw new Exception("Connection to " . $this->dbType . " failed with message: " . $e->getMessage()); - } - if (\is_null($this->dbHandler)) { - throw new Exception("Connection to " . $this->dbType . "failed"); - } - $this->dbHandler->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_NATURAL); - $this->typeAdapter = TypeAdapterFactory::create($this->dbType, $this->dbHandler, $this->dumpSettings); - } - /** - * Primary function, triggers dumping. - * - * @param string $filename Name of file to write sql dump to - * @return null - * @throws \Exception - */ - public function start($filename = '') - { - // Output file can be redefined here - if (!empty($filename)) { - $this->fileName = $filename; - } - // Connect to database - $this->connect(); - // Create output file - $this->compressManager->open($this->fileName); - // Write some basic info to output file - $this->compressManager->write($this->getDumpFileHeader()); - // initiate a transaction at global level to create a consistent snapshot - if ($this->dumpSettings['single-transaction']) { - $this->dbHandler->exec($this->typeAdapter->setup_transaction()); - $this->dbHandler->exec($this->typeAdapter->start_transaction()); - } - // Store server settings and use sanner defaults to dump - $this->compressManager->write($this->typeAdapter->backup_parameters()); - if ($this->dumpSettings['databases']) { - $this->compressManager->write($this->typeAdapter->getDatabaseHeader($this->dbName)); - if ($this->dumpSettings['add-drop-database']) { - $this->compressManager->write($this->typeAdapter->add_drop_database($this->dbName)); - } - } - // Get table, view, trigger, procedures, functions and events structures from - // database. - $this->getDatabaseStructureTables(); - $this->getDatabaseStructureViews(); - $this->getDatabaseStructureTriggers(); - $this->getDatabaseStructureProcedures(); - $this->getDatabaseStructureFunctions(); - $this->getDatabaseStructureEvents(); - if ($this->dumpSettings['databases']) { - $this->compressManager->write($this->typeAdapter->databases($this->dbName)); - } - // If there still are some tables/views in include-tables array, - // that means that some tables or views weren't found. - // Give proper error and exit. - // This check will be removed once include-tables supports regexps. - if (0 < \count($this->dumpSettings['include-tables'])) { - $name = \implode(",", $this->dumpSettings['include-tables']); - throw new Exception("Table (" . $name . ") not found in database"); - } - $this->exportTables(); - $this->exportTriggers(); - $this->exportFunctions(); - $this->exportProcedures(); - $this->exportViews(); - $this->exportEvents(); - // Restore saved parameters. - $this->compressManager->write($this->typeAdapter->restore_parameters()); - // end transaction - if ($this->dumpSettings['single-transaction']) { - $this->dbHandler->exec($this->typeAdapter->commit_transaction()); - } - // Write some stats to output file. - $this->compressManager->write($this->getDumpFileFooter()); - // Close output file. - $this->compressManager->close(); - return; - } - /** - * Returns header for dump file. - * - * @return string - */ - private function getDumpFileHeader() - { - $header = ''; - if (!$this->dumpSettings['skip-comments']) { - // Some info about software, source and time - $header = "-- mysqldump-php https://github.com/ifsnop/mysqldump-php" . \PHP_EOL . "--" . \PHP_EOL . "-- Host: {$this->host}\tDatabase: {$this->dbName}" . \PHP_EOL . "-- ------------------------------------------------------" . \PHP_EOL; - if (!empty($this->version)) { - $header .= "-- Server version \t" . $this->version . \PHP_EOL; - } - if (!$this->dumpSettings['skip-dump-date']) { - $header .= "-- Date: " . \date('r') . \PHP_EOL . \PHP_EOL; - } - } - return $header; - } - /** - * Returns footer for dump file. - * - * @return string - */ - private function getDumpFileFooter() - { - $footer = ''; - if (!$this->dumpSettings['skip-comments']) { - $footer .= '-- Dump completed'; - if (!$this->dumpSettings['skip-dump-date']) { - $footer .= ' on: ' . \date('r'); - } - $footer .= \PHP_EOL; - } - return $footer; - } - /** - * Reads table names from database. - * Fills $this->tables array so they will be dumped later. - * - * @return null - */ - private function getDatabaseStructureTables() - { - // Listing all tables from database - if (empty($this->dumpSettings['include-tables'])) { - // include all tables for now, blacklisting happens later - foreach ($this->dbHandler->query($this->typeAdapter->show_tables($this->dbName)) as $row) { - \array_push($this->tables, \current($row)); - } - } else { - // include only the tables mentioned in include-tables - foreach ($this->dbHandler->query($this->typeAdapter->show_tables($this->dbName)) as $row) { - if (\in_array(\current($row), $this->dumpSettings['include-tables'], \true)) { - \array_push($this->tables, \current($row)); - $elem = \array_search(\current($row), $this->dumpSettings['include-tables']); - unset($this->dumpSettings['include-tables'][$elem]); - } - } - } - return; - } - /** - * Reads view names from database. - * Fills $this->tables array so they will be dumped later. - * - * @return null - */ - private function getDatabaseStructureViews() - { - // Listing all views from database - if (empty($this->dumpSettings['include-views'])) { - // include all views for now, blacklisting happens later - foreach ($this->dbHandler->query($this->typeAdapter->show_views($this->dbName)) as $row) { - \array_push($this->views, \current($row)); - } - } else { - // include only the tables mentioned in include-tables - foreach ($this->dbHandler->query($this->typeAdapter->show_views($this->dbName)) as $row) { - if (\in_array(\current($row), $this->dumpSettings['include-views'], \true)) { - \array_push($this->views, \current($row)); - $elem = \array_search(\current($row), $this->dumpSettings['include-views']); - unset($this->dumpSettings['include-views'][$elem]); - } - } - } - return; - } - /** - * Reads trigger names from database. - * Fills $this->tables array so they will be dumped later. - * - * @return null - */ - private function getDatabaseStructureTriggers() - { - // Listing all triggers from database - if (\false === $this->dumpSettings['skip-triggers']) { - foreach ($this->dbHandler->query($this->typeAdapter->show_triggers($this->dbName)) as $row) { - \array_push($this->triggers, $row['Trigger']); - } - } - return; - } - /** - * Reads procedure names from database. - * Fills $this->tables array so they will be dumped later. - * - * @return null - */ - private function getDatabaseStructureProcedures() - { - // Listing all procedures from database - if ($this->dumpSettings['routines']) { - foreach ($this->dbHandler->query($this->typeAdapter->show_procedures($this->dbName)) as $row) { - \array_push($this->procedures, $row['procedure_name']); - } - } - return; - } - /** - * Reads functions names from database. - * Fills $this->tables array so they will be dumped later. - * - * @return null - */ - private function getDatabaseStructureFunctions() - { - // Listing all functions from database - if ($this->dumpSettings['routines']) { - foreach ($this->dbHandler->query($this->typeAdapter->show_functions($this->dbName)) as $row) { - \array_push($this->functions, $row['function_name']); - } - } - return; - } - /** - * Reads event names from database. - * Fills $this->tables array so they will be dumped later. - * - * @return null - */ - private function getDatabaseStructureEvents() - { - // Listing all events from database - if ($this->dumpSettings['events']) { - foreach ($this->dbHandler->query($this->typeAdapter->show_events($this->dbName)) as $row) { - \array_push($this->events, $row['event_name']); - } - } - return; - } - /** - * Compare if $table name matches with a definition inside $arr - * @param $table string - * @param $arr array with strings or patterns - * @return boolean - */ - private function matches($table, $arr) - { - $match = \false; - foreach ($arr as $pattern) { - if ('/' != $pattern[0]) { - continue; - } - if (1 == \preg_match($pattern, $table)) { - $match = \true; - } - } - return \in_array($table, $arr) || $match; - } - /** - * Exports all the tables selected from database - * - * @return null - */ - private function exportTables() - { - // Exporting tables one by one - foreach ($this->tables as $table) { - if ($this->matches($table, $this->dumpSettings['exclude-tables'])) { - continue; - } - $this->getTableStructure($table); - if (\false === $this->dumpSettings['no-data']) { - // don't break compatibility with old trigger - $this->listValues($table); - } elseif (\true === $this->dumpSettings['no-data'] || $this->matches($table, $this->dumpSettings['no-data'])) { - continue; - } else { - $this->listValues($table); - } - } - } - /** - * Exports all the views found in database - * - * @return null - */ - private function exportViews() - { - if (\false === $this->dumpSettings['no-create-info']) { - // Exporting views one by one - foreach ($this->views as $view) { - if ($this->matches($view, $this->dumpSettings['exclude-tables'])) { - continue; - } - $this->tableColumnTypes[$view] = $this->getTableColumnTypes($view); - $this->getViewStructureTable($view); - } - foreach ($this->views as $view) { - if ($this->matches($view, $this->dumpSettings['exclude-tables'])) { - continue; - } - $this->getViewStructureView($view); - } - } - } - /** - * Exports all the triggers found in database - * - * @return null - */ - private function exportTriggers() - { - // Exporting triggers one by one - foreach ($this->triggers as $trigger) { - $this->getTriggerStructure($trigger); - } - } - /** - * Exports all the procedures found in database - * - * @return null - */ - private function exportProcedures() - { - // Exporting triggers one by one - foreach ($this->procedures as $procedure) { - $this->getProcedureStructure($procedure); - } - } - /** - * Exports all the functions found in database - * - * @return null - */ - private function exportFunctions() - { - // Exporting triggers one by one - foreach ($this->functions as $function) { - $this->getFunctionStructure($function); - } - } - /** - * Exports all the events found in database - * - * @return null - */ - private function exportEvents() - { - // Exporting triggers one by one - foreach ($this->events as $event) { - $this->getEventStructure($event); - } - } - /** - * Table structure extractor - * - * @todo move specific mysql code to typeAdapter - * @param string $tableName Name of table to export - * @return null - */ - private function getTableStructure($tableName) - { - if (!$this->dumpSettings['no-create-info']) { - $ret = ''; - if (!$this->dumpSettings['skip-comments']) { - $ret = "--" . \PHP_EOL . "-- Table structure for table `{$tableName}`" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - } - $stmt = $this->typeAdapter->show_create_table($tableName); - foreach ($this->dbHandler->query($stmt) as $r) { - $this->compressManager->write($ret); - if ($this->dumpSettings['add-drop-table']) { - $this->compressManager->write($this->typeAdapter->drop_table($tableName)); - } - $this->compressManager->write($this->typeAdapter->create_table($r)); - break; - } - } - $this->tableColumnTypes[$tableName] = $this->getTableColumnTypes($tableName); - return; - } - /** - * Store column types to create data dumps and for Stand-In tables - * - * @param string $tableName Name of table to export - * @return array type column types detailed - */ - private function getTableColumnTypes($tableName) - { - $columnTypes = array(); - $columns = $this->dbHandler->query($this->typeAdapter->show_columns($tableName)); - $columns->setFetchMode(PDO::FETCH_ASSOC); - foreach ($columns as $key => $col) { - $types = $this->typeAdapter->parseColumnType($col); - $columnTypes[$col['Field']] = array('is_numeric' => $types['is_numeric'], 'is_blob' => $types['is_blob'], 'type' => $types['type'], 'type_sql' => $col['Type'], 'is_virtual' => $types['is_virtual']); - } - return $columnTypes; - } - /** - * View structure extractor, create table (avoids cyclic references) - * - * @todo move mysql specific code to typeAdapter - * @param string $viewName Name of view to export - * @return null - */ - private function getViewStructureTable($viewName) - { - if (!$this->dumpSettings['skip-comments']) { - $ret = "--" . \PHP_EOL . "-- Stand-In structure for view `{$viewName}`" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - $this->compressManager->write($ret); - } - $stmt = $this->typeAdapter->show_create_view($viewName); - // create views as tables, to resolve dependencies - foreach ($this->dbHandler->query($stmt) as $r) { - if ($this->dumpSettings['add-drop-table']) { - $this->compressManager->write($this->typeAdapter->drop_view($viewName)); - } - $this->compressManager->write($this->createStandInTable($viewName)); - break; - } - } - /** - * Write a create table statement for the table Stand-In, show create - * table would return a create algorithm when used on a view - * - * @param string $viewName Name of view to export - * @return string create statement - */ - public function createStandInTable($viewName) - { - $ret = array(); - foreach ($this->tableColumnTypes[$viewName] as $k => $v) { - $ret[] = "`{$k}` {$v['type_sql']}"; - } - $ret = \implode(\PHP_EOL . ",", $ret); - $ret = "CREATE TABLE IF NOT EXISTS `{$viewName}` (" . \PHP_EOL . $ret . \PHP_EOL . ");" . \PHP_EOL; - return $ret; - } - /** - * View structure extractor, create view - * - * @todo move mysql specific code to typeAdapter - * @param string $viewName Name of view to export - * @return null - */ - private function getViewStructureView($viewName) - { - if (!$this->dumpSettings['skip-comments']) { - $ret = "--" . \PHP_EOL . "-- View structure for view `{$viewName}`" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - $this->compressManager->write($ret); - } - $stmt = $this->typeAdapter->show_create_view($viewName); - // create views, to resolve dependencies - // replacing tables with views - foreach ($this->dbHandler->query($stmt) as $r) { - // because we must replace table with view, we should delete it - $this->compressManager->write($this->typeAdapter->drop_view($viewName)); - $this->compressManager->write($this->typeAdapter->create_view($r)); - break; - } - } - /** - * Trigger structure extractor - * - * @param string $triggerName Name of trigger to export - * @return null - */ - private function getTriggerStructure($triggerName) - { - $stmt = $this->typeAdapter->show_create_trigger($triggerName); - foreach ($this->dbHandler->query($stmt) as $r) { - if ($this->dumpSettings['add-drop-trigger']) { - $this->compressManager->write($this->typeAdapter->add_drop_trigger($triggerName)); - } - $this->compressManager->write($this->typeAdapter->create_trigger($r)); - return; - } - } - /** - * Procedure structure extractor - * - * @param string $procedureName Name of procedure to export - * @return null - */ - private function getProcedureStructure($procedureName) - { - if (!$this->dumpSettings['skip-comments']) { - $ret = "--" . \PHP_EOL . "-- Dumping routines for database '" . $this->dbName . "'" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - $this->compressManager->write($ret); - } - $stmt = $this->typeAdapter->show_create_procedure($procedureName); - foreach ($this->dbHandler->query($stmt) as $r) { - $this->compressManager->write($this->typeAdapter->create_procedure($r)); - return; - } - } - /** - * Function structure extractor - * - * @param string $functionName Name of function to export - * @return null - */ - private function getFunctionStructure($functionName) - { - if (!$this->dumpSettings['skip-comments']) { - $ret = "--" . \PHP_EOL . "-- Dumping routines for database '" . $this->dbName . "'" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - $this->compressManager->write($ret); - } - $stmt = $this->typeAdapter->show_create_function($functionName); - foreach ($this->dbHandler->query($stmt) as $r) { - $this->compressManager->write($this->typeAdapter->create_function($r)); - return; - } - } - /** - * Event structure extractor - * - * @param string $eventName Name of event to export - * @return null - */ - private function getEventStructure($eventName) - { - if (!$this->dumpSettings['skip-comments']) { - $ret = "--" . \PHP_EOL . "-- Dumping events for database '" . $this->dbName . "'" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - $this->compressManager->write($ret); - } - $stmt = $this->typeAdapter->show_create_event($eventName); - foreach ($this->dbHandler->query($stmt) as $r) { - $this->compressManager->write($this->typeAdapter->create_event($r)); - return; - } - } - /** - * Prepare values for output - * - * @param string $tableName Name of table which contains rows - * @param array $row Associative array of column names and values to be - * quoted - * - * @return array - */ - private function prepareColumnValues($tableName, array $row) - { - $ret = array(); - $columnTypes = $this->tableColumnTypes[$tableName]; - if ($this->transformTableRowCallable) { - $row = \call_user_func($this->transformTableRowCallable, $tableName, $row); - } - foreach ($row as $colName => $colValue) { - if ($this->transformColumnValueCallable) { - $colValue = \call_user_func($this->transformColumnValueCallable, $tableName, $colName, $colValue, $row); - } - $ret[] = $this->escape($colValue, $columnTypes[$colName]); - } - return $ret; - } - /** - * Escape values with quotes when needed - * - * @param string $tableName Name of table which contains rows - * @param array $row Associative array of column names and values to be quoted - * - * @return string - */ - private function escape($colValue, $colType) - { - if (\is_null($colValue)) { - return "NULL"; - } elseif ($this->dumpSettings['hex-blob'] && $colType['is_blob']) { - if ($colType['type'] == 'bit' || !empty($colValue)) { - return "0x{$colValue}"; - } else { - return "''"; - } - } elseif ($colType['is_numeric']) { - return $colValue; - } - return $this->dbHandler->quote($colValue); - } - /** - * Set a callable that will be used to transform table rows - * - * @param callable $callable - * - * @return void - */ - public function setTransformTableRowHook($callable) - { - $this->transformTableRowCallable = $callable; - } - /** - * Set a callable that will be used to transform column values - * - * @param callable $callable - * - * @return void - * - * @deprecated Use setTransformTableRowHook instead for better performance - */ - public function setTransformColumnValueHook($callable) - { - $this->transformColumnValueCallable = $callable; - } - /** - * Set a callable that will be used to report dump information - * - * @param callable $callable - * - * @return void - */ - public function setInfoHook($callable) - { - $this->infoCallable = $callable; - } - /** - * Table rows extractor - * - * @param string $tableName Name of table to export - * - * @return null - */ - private function listValues($tableName) - { - $this->prepareListValues($tableName); - $onlyOnce = \true; - $lineSize = 0; - // colStmt is used to form a query to obtain row values - $colStmt = $this->getColumnStmt($tableName); - // colNames is used to get the name of the columns when using complete-insert - if ($this->dumpSettings['complete-insert']) { - $colNames = $this->getColumnNames($tableName); - } - $stmt = "SELECT " . \implode(",", $colStmt) . " FROM `{$tableName}`"; - // Table specific conditions override the default 'where' - $condition = $this->getTableWhere($tableName); - if ($condition) { - $stmt .= " WHERE {$condition}"; - } - $limit = $this->getTableLimit($tableName); - if ($limit !== \false) { - $stmt .= " LIMIT {$limit}"; - } - $resultSet = $this->dbHandler->query($stmt); - $resultSet->setFetchMode(PDO::FETCH_ASSOC); - $ignore = $this->dumpSettings['insert-ignore'] ? ' IGNORE' : ''; - $count = 0; - foreach ($resultSet as $row) { - $count++; - $vals = $this->prepareColumnValues($tableName, $row); - if ($onlyOnce || !$this->dumpSettings['extended-insert']) { - if ($this->dumpSettings['complete-insert']) { - $lineSize += $this->compressManager->write("INSERT{$ignore} INTO `{$tableName}` (" . \implode(", ", $colNames) . ") VALUES (" . \implode(",", $vals) . ")"); - } else { - $lineSize += $this->compressManager->write("INSERT{$ignore} INTO `{$tableName}` VALUES (" . \implode(",", $vals) . ")"); - } - $onlyOnce = \false; - } else { - $lineSize += $this->compressManager->write(",(" . \implode(",", $vals) . ")"); - } - if ($lineSize > $this->dumpSettings['net_buffer_length'] || !$this->dumpSettings['extended-insert']) { - $onlyOnce = \true; - $lineSize = $this->compressManager->write(";" . \PHP_EOL); - } - } - $resultSet->closeCursor(); - if (!$onlyOnce) { - $this->compressManager->write(";" . \PHP_EOL); - } - $this->endListValues($tableName, $count); - if ($this->infoCallable) { - \call_user_func($this->infoCallable, 'table', array('name' => $tableName, 'rowCount' => $count)); - } - } - /** - * Table rows extractor, append information prior to dump - * - * @param string $tableName Name of table to export - * - * @return null - */ - public function prepareListValues($tableName) - { - if (!$this->dumpSettings['skip-comments']) { - $this->compressManager->write("--" . \PHP_EOL . "-- Dumping data for table `{$tableName}`" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL); - } - if ($this->dumpSettings['lock-tables'] && !$this->dumpSettings['single-transaction']) { - $this->typeAdapter->lock_table($tableName); - } - if ($this->dumpSettings['add-locks']) { - $this->compressManager->write($this->typeAdapter->start_add_lock_table($tableName)); - } - if ($this->dumpSettings['disable-keys']) { - $this->compressManager->write($this->typeAdapter->start_add_disable_keys($tableName)); - } - // Disable autocommit for faster reload - if ($this->dumpSettings['no-autocommit']) { - $this->compressManager->write($this->typeAdapter->start_disable_autocommit()); - } - return; - } - /** - * Table rows extractor, close locks and commits after dump - * - * @param string $tableName Name of table to export. - * @param integer $count Number of rows inserted. - * - * @return void - */ - public function endListValues($tableName, $count = 0) - { - if ($this->dumpSettings['disable-keys']) { - $this->compressManager->write($this->typeAdapter->end_add_disable_keys($tableName)); - } - if ($this->dumpSettings['add-locks']) { - $this->compressManager->write($this->typeAdapter->end_add_lock_table($tableName)); - } - if ($this->dumpSettings['lock-tables'] && !$this->dumpSettings['single-transaction']) { - $this->typeAdapter->unlock_table($tableName); - } - // Commit to enable autocommit - if ($this->dumpSettings['no-autocommit']) { - $this->compressManager->write($this->typeAdapter->end_disable_autocommit()); - } - $this->compressManager->write(\PHP_EOL); - if (!$this->dumpSettings['skip-comments']) { - $this->compressManager->write("-- Dumped table `" . $tableName . "` with {$count} row(s)" . \PHP_EOL . '--' . \PHP_EOL . \PHP_EOL); - } - return; - } - /** - * Build SQL List of all columns on current table which will be used for selecting - * - * @param string $tableName Name of table to get columns - * - * @return array SQL sentence with columns for select - */ - public function getColumnStmt($tableName) - { - $colStmt = array(); - foreach ($this->tableColumnTypes[$tableName] as $colName => $colType) { - if ($colType['is_virtual']) { - $this->dumpSettings['complete-insert'] = \true; - continue; - } elseif ($colType['type'] == 'bit' && $this->dumpSettings['hex-blob']) { - $colStmt[] = "LPAD(HEX(`{$colName}`),2,'0') AS `{$colName}`"; - } elseif ($colType['type'] == 'double' && \PHP_VERSION_ID > 80100) { - $colStmt[] = \sprintf("CONCAT(`%s`) AS `%s`", $colName, $colName); - } elseif ($colType['is_blob'] && $this->dumpSettings['hex-blob']) { - $colStmt[] = "HEX(`{$colName}`) AS `{$colName}`"; - } else { - $colStmt[] = "`{$colName}`"; - } - } - return $colStmt; - } - /** - * Build SQL List of all columns on current table which will be used for inserting - * - * @param string $tableName Name of table to get columns - * - * @return array columns for sql sentence for insert - */ - public function getColumnNames($tableName) - { - $colNames = array(); - foreach ($this->tableColumnTypes[$tableName] as $colName => $colType) { - if ($colType['is_virtual']) { - $this->dumpSettings['complete-insert'] = \true; - continue; - } else { - $colNames[] = "`{$colName}`"; - } - } - return $colNames; - } -} -/** - * Enum with all available compression methods - * - */ -abstract class CompressMethod -{ - public static $enums = array(Mysqldump::NONE, Mysqldump::GZIP, Mysqldump::BZIP2, Mysqldump::GZIPSTREAM); - /** - * @param string $c - * @return boolean - */ - public static function isValid($c) - { - return \in_array($c, self::$enums); - } -} -abstract class CompressManagerFactory -{ - /** - * @param string $c - * @return CompressBzip2|CompressGzip|CompressNone - */ - public static function create($c) - { - $c = \ucfirst(\strtolower($c)); - if (!CompressMethod::isValid($c)) { - throw new Exception("Compression method ({$c}) is not defined yet"); - } - $method = __NAMESPACE__ . "\\" . "Compress" . $c; - return new $method(); - } -} -class CompressBzip2 extends CompressManagerFactory -{ - private $fileHandler = null; - public function __construct() - { - if (!\function_exists("bzopen")) { - throw new Exception("Compression is enabled, but bzip2 lib is not installed or configured properly"); - } - } - /** - * @param string $filename - */ - public function open($filename) - { - $this->fileHandler = \bzopen($filename, "w"); - if (\false === $this->fileHandler) { - throw new Exception("Output file is not writable"); - } - return \true; - } - public function write($str) - { - $bytesWritten = \bzwrite($this->fileHandler, $str); - if (\false === $bytesWritten) { - throw new Exception("Writting to file failed! Probably, there is no more free space left?"); - } - return $bytesWritten; - } - public function close() - { - return \bzclose($this->fileHandler); - } -} -class CompressGzip extends CompressManagerFactory -{ - private $fileHandler = null; - public function __construct() - { - if (!\function_exists("gzopen")) { - throw new Exception("Compression is enabled, but gzip lib is not installed or configured properly"); - } - } - /** - * @param string $filename - */ - public function open($filename) - { - $this->fileHandler = \gzopen($filename, "wb"); - if (\false === $this->fileHandler) { - throw new Exception("Output file is not writable"); - } - return \true; - } - public function write($str) - { - $bytesWritten = \gzwrite($this->fileHandler, $str); - if (\false === $bytesWritten) { - throw new Exception("Writting to file failed! Probably, there is no more free space left?"); - } - return $bytesWritten; - } - public function close() - { - return \gzclose($this->fileHandler); - } -} -class CompressNone extends CompressManagerFactory -{ - private $fileHandler = null; - /** - * @param string $filename - */ - public function open($filename) - { - $this->fileHandler = \fopen($filename, "wb"); - if (\false === $this->fileHandler) { - throw new Exception("Output file is not writable"); - } - return \true; - } - public function write($str) - { - $bytesWritten = \fwrite($this->fileHandler, $str); - if (\false === $bytesWritten) { - throw new Exception("Writting to file failed! Probably, there is no more free space left?"); - } - return $bytesWritten; - } - public function close() - { - return \fclose($this->fileHandler); - } -} -class CompressGzipstream extends CompressManagerFactory -{ - private $fileHandler = null; - private $compressContext; - /** - * @param string $filename - */ - public function open($filename) - { - $this->fileHandler = \fopen($filename, "wb"); - if (\false === $this->fileHandler) { - throw new Exception("Output file is not writable"); - } - $this->compressContext = \deflate_init(\ZLIB_ENCODING_GZIP, array('level' => 9)); - return \true; - } - public function write($str) - { - $bytesWritten = \fwrite($this->fileHandler, \deflate_add($this->compressContext, $str, \ZLIB_NO_FLUSH)); - if (\false === $bytesWritten) { - throw new Exception("Writting to file failed! Probably, there is no more free space left?"); - } - return $bytesWritten; - } - public function close() - { - \fwrite($this->fileHandler, \deflate_add($this->compressContext, '', \ZLIB_FINISH)); - return \fclose($this->fileHandler); - } -} -/** - * Enum with all available TypeAdapter implementations - * - */ -abstract class TypeAdapter -{ - public static $enums = array("Sqlite", "Mysql"); - /** - * @param string $c - * @return boolean - */ - public static function isValid($c) - { - return \in_array($c, self::$enums); - } -} -/** - * TypeAdapter Factory - * - */ -abstract class TypeAdapterFactory -{ - protected $dbHandler = null; - protected $dumpSettings = array(); - /** - * @param string $c Type of database factory to create (Mysql, Sqlite,...) - * @param PDO $dbHandler - */ - public static function create($c, $dbHandler = null, $dumpSettings = array()) - { - $c = \ucfirst(\strtolower($c)); - if (!TypeAdapter::isValid($c)) { - throw new Exception("Database type support for ({$c}) not yet available"); - } - $method = __NAMESPACE__ . "\\" . "TypeAdapter" . $c; - return new $method($dbHandler, $dumpSettings); - } - public function __construct($dbHandler = null, $dumpSettings = array()) - { - $this->dbHandler = $dbHandler; - $this->dumpSettings = $dumpSettings; - } - /** - * function databases Add sql to create and use database - * @todo make it do something with sqlite - */ - public function databases() - { - return ""; - } - public function show_create_table($tableName) - { - return "SELECT tbl_name as 'Table', sql as 'Create Table' " . "FROM sqlite_master " . "WHERE type='table' AND tbl_name='{$tableName}'"; - } - /** - * function create_table Get table creation code from database - * @todo make it do something with sqlite - */ - public function create_table($row) - { - return ""; - } - public function show_create_view($viewName) - { - return "SELECT tbl_name as 'View', sql as 'Create View' " . "FROM sqlite_master " . "WHERE type='view' AND tbl_name='{$viewName}'"; - } - /** - * function create_view Get view creation code from database - * @todo make it do something with sqlite - */ - public function create_view($row) - { - return ""; - } - /** - * function show_create_trigger Get trigger creation code from database - * @todo make it do something with sqlite - */ - public function show_create_trigger($triggerName) - { - return ""; - } - /** - * function create_trigger Modify trigger code, add delimiters, etc - * @todo make it do something with sqlite - */ - public function create_trigger($triggerName) - { - return ""; - } - /** - * function create_procedure Modify procedure code, add delimiters, etc - * @todo make it do something with sqlite - */ - public function create_procedure($procedureName) - { - return ""; - } - /** - * function create_function Modify function code, add delimiters, etc - * @todo make it do something with sqlite - */ - public function create_function($functionName) - { - return ""; - } - public function show_tables() - { - return "SELECT tbl_name FROM sqlite_master WHERE type='table'"; - } - public function show_views() - { - return "SELECT tbl_name FROM sqlite_master WHERE type='view'"; - } - public function show_triggers() - { - return "SELECT name FROM sqlite_master WHERE type='trigger'"; - } - public function show_columns() - { - if (\func_num_args() != 1) { - return ""; - } - $args = \func_get_args(); - return "pragma table_info({$args[0]})"; - } - public function show_procedures() - { - return ""; - } - public function show_functions() - { - return ""; - } - public function show_events() - { - return ""; - } - public function setup_transaction() - { - return ""; - } - public function start_transaction() - { - return "BEGIN EXCLUSIVE"; - } - public function commit_transaction() - { - return "COMMIT"; - } - public function lock_table() - { - return ""; - } - public function unlock_table() - { - return ""; - } - public function start_add_lock_table() - { - return \PHP_EOL; - } - public function end_add_lock_table() - { - return \PHP_EOL; - } - public function start_add_disable_keys() - { - return \PHP_EOL; - } - public function end_add_disable_keys() - { - return \PHP_EOL; - } - public function start_disable_foreign_keys_check() - { - return \PHP_EOL; - } - public function end_disable_foreign_keys_check() - { - return \PHP_EOL; - } - public function add_drop_database() - { - return \PHP_EOL; - } - public function add_drop_trigger() - { - return \PHP_EOL; - } - public function drop_table() - { - return \PHP_EOL; - } - public function drop_view() - { - return \PHP_EOL; - } - /** - * Decode column metadata and fill info structure. - * type, is_numeric and is_blob will always be available. - * - * @param array $colType Array returned from "SHOW COLUMNS FROM tableName" - * @return array - */ - public function parseColumnType($colType) - { - return array(); - } - public function backup_parameters() - { - return \PHP_EOL; - } - public function restore_parameters() - { - return \PHP_EOL; - } -} -class TypeAdapterPgsql extends TypeAdapterFactory -{ -} -class TypeAdapterDblib extends TypeAdapterFactory -{ -} -class TypeAdapterSqlite extends TypeAdapterFactory -{ -} -class TypeAdapterMysql extends TypeAdapterFactory -{ - const DEFINER_RE = 'DEFINER=`(?:[^`]|``)*`@`(?:[^`]|``)*`'; - // Numerical Mysql types - public $mysqlTypes = array('numerical' => array('bit', 'tinyint', 'smallint', 'mediumint', 'int', 'integer', 'bigint', 'real', 'double', 'float', 'decimal', 'numeric'), 'blob' => array( - 'tinyblob', - 'blob', - 'mediumblob', - 'longblob', - 'binary', - 'varbinary', - 'bit', - 'geometry', - /* http://bugs.mysql.com/bug.php?id=43544 */ - 'point', - 'linestring', - 'polygon', - 'multipoint', - 'multilinestring', - 'multipolygon', - 'geometrycollection', - )); - public function databases() - { - if ($this->dumpSettings['no-create-db']) { - return ""; - } - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - $databaseName = $args[0]; - $resultSet = $this->dbHandler->query("SHOW VARIABLES LIKE 'character_set_database';"); - $characterSet = $resultSet->fetchColumn(1); - $resultSet->closeCursor(); - $resultSet = $this->dbHandler->query("SHOW VARIABLES LIKE 'collation_database';"); - $collationDb = $resultSet->fetchColumn(1); - $resultSet->closeCursor(); - $ret = ""; - $ret .= "CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$databaseName}`" . " /*!40100 DEFAULT CHARACTER SET {$characterSet} " . " COLLATE {$collationDb} */;" . \PHP_EOL . \PHP_EOL . "USE `{$databaseName}`;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function show_create_table($tableName) - { - return "SHOW CREATE TABLE `{$tableName}`"; - } - public function show_create_view($viewName) - { - return "SHOW CREATE VIEW `{$viewName}`"; - } - public function show_create_trigger($triggerName) - { - return "SHOW CREATE TRIGGER `{$triggerName}`"; - } - public function show_create_procedure($procedureName) - { - return "SHOW CREATE PROCEDURE `{$procedureName}`"; - } - public function show_create_function($functionName) - { - return "SHOW CREATE FUNCTION `{$functionName}`"; - } - public function show_create_event($eventName) - { - return "SHOW CREATE EVENT `{$eventName}`"; - } - public function create_table($row) - { - if (!isset($row['Create Table'])) { - throw new Exception("Error getting table code, unknown output"); - } - $createTable = $row['Create Table']; - if ($this->dumpSettings['reset-auto-increment']) { - $match = "/AUTO_INCREMENT=[0-9]+/s"; - $replace = ""; - $createTable = \preg_replace($match, $replace, $createTable); - } - if ($this->dumpSettings['if-not-exists']) { - $createTable = \preg_replace('/^CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $createTable); - } - $ret = "/*!40101 SET @saved_cs_client = @@character_set_client */;" . \PHP_EOL . "/*!40101 SET character_set_client = " . $this->dumpSettings['default-character-set'] . " */;" . \PHP_EOL . $createTable . ";" . \PHP_EOL . "/*!40101 SET character_set_client = @saved_cs_client */;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function create_view($row) - { - $ret = ""; - if (!isset($row['Create View'])) { - throw new Exception("Error getting view structure, unknown output"); - } - $viewStmt = $row['Create View']; - $definerStr = $this->dumpSettings['skip-definer'] ? '' : '/*!50013 \\2 */' . \PHP_EOL; - if ($viewStmtReplaced = \preg_replace('/^(CREATE(?:\\s+ALGORITHM=(?:UNDEFINED|MERGE|TEMPTABLE))?)\\s+(' . self::DEFINER_RE . '(?:\\s+SQL SECURITY (?:DEFINER|INVOKER))?)?\\s+(VIEW .+)$/', '/*!50001 \\1 */' . \PHP_EOL . $definerStr . '/*!50001 \\3 */', $viewStmt, 1)) { - $viewStmt = $viewStmtReplaced; - } - $ret .= $viewStmt . ';' . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function create_trigger($row) - { - $ret = ""; - if (!isset($row['SQL Original Statement'])) { - throw new Exception("Error getting trigger code, unknown output"); - } - $triggerStmt = $row['SQL Original Statement']; - $definerStr = $this->dumpSettings['skip-definer'] ? '' : '/*!50017 \\2*/ '; - if ($triggerStmtReplaced = \preg_replace('/^(CREATE)\\s+(' . self::DEFINER_RE . ')?\\s+(TRIGGER\\s.*)$/s', '/*!50003 \\1*/ ' . $definerStr . '/*!50003 \\3 */', $triggerStmt, 1)) { - $triggerStmt = $triggerStmtReplaced; - } - $ret .= "DELIMITER ;;" . \PHP_EOL . $triggerStmt . ";;" . \PHP_EOL . "DELIMITER ;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function create_procedure($row) - { - $ret = ""; - if (!isset($row['Create Procedure'])) { - throw new Exception("Error getting procedure code, unknown output. " . "Please check 'https://bugs.mysql.com/bug.php?id=14564'"); - } - $procedureStmt = $row['Create Procedure']; - if ($this->dumpSettings['skip-definer']) { - if ($procedureStmtReplaced = \preg_replace('/^(CREATE)\\s+(' . self::DEFINER_RE . ')?\\s+(PROCEDURE\\s.*)$/s', '\\1 \\3', $procedureStmt, 1)) { - $procedureStmt = $procedureStmtReplaced; - } - } - $ret .= "/*!50003 DROP PROCEDURE IF EXISTS `" . $row['Procedure'] . "` */;" . \PHP_EOL . "/*!40101 SET @saved_cs_client = @@character_set_client */;" . \PHP_EOL . "/*!40101 SET character_set_client = " . $this->dumpSettings['default-character-set'] . " */;" . \PHP_EOL . "DELIMITER ;;" . \PHP_EOL . $procedureStmt . " ;;" . \PHP_EOL . "DELIMITER ;" . \PHP_EOL . "/*!40101 SET character_set_client = @saved_cs_client */;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function create_function($row) - { - $ret = ""; - if (!isset($row['Create Function'])) { - throw new Exception("Error getting function code, unknown output. " . "Please check 'https://bugs.mysql.com/bug.php?id=14564'"); - } - $functionStmt = $row['Create Function']; - $characterSetClient = $row['character_set_client']; - $collationConnection = $row['collation_connection']; - $sqlMode = $row['sql_mode']; - if ($this->dumpSettings['skip-definer']) { - if ($functionStmtReplaced = \preg_replace('/^(CREATE)\\s+(' . self::DEFINER_RE . ')?\\s+(FUNCTION\\s.*)$/s', '\\1 \\3', $functionStmt, 1)) { - $functionStmt = $functionStmtReplaced; - } - } - $ret .= "/*!50003 DROP FUNCTION IF EXISTS `" . $row['Function'] . "` */;" . \PHP_EOL . "/*!40101 SET @saved_cs_client = @@character_set_client */;" . \PHP_EOL . "/*!50003 SET @saved_cs_results = @@character_set_results */ ;" . \PHP_EOL . "/*!50003 SET @saved_col_connection = @@collation_connection */ ;" . \PHP_EOL . "/*!40101 SET character_set_client = " . $characterSetClient . " */;" . \PHP_EOL . "/*!40101 SET character_set_results = " . $characterSetClient . " */;" . \PHP_EOL . "/*!50003 SET collation_connection = " . $collationConnection . " */ ;" . \PHP_EOL . "/*!50003 SET @saved_sql_mode = @@sql_mode */ ;;" . \PHP_EOL . "/*!50003 SET sql_mode = '" . $sqlMode . "' */ ;;" . \PHP_EOL . "/*!50003 SET @saved_time_zone = @@time_zone */ ;;" . \PHP_EOL . "/*!50003 SET time_zone = 'SYSTEM' */ ;;" . \PHP_EOL . "DELIMITER ;;" . \PHP_EOL . $functionStmt . " ;;" . \PHP_EOL . "DELIMITER ;" . \PHP_EOL . "/*!50003 SET sql_mode = @saved_sql_mode */ ;" . \PHP_EOL . "/*!50003 SET character_set_client = @saved_cs_client */ ;" . \PHP_EOL . "/*!50003 SET character_set_results = @saved_cs_results */ ;" . \PHP_EOL . "/*!50003 SET collation_connection = @saved_col_connection */ ;" . \PHP_EOL . "/*!50106 SET TIME_ZONE= @saved_time_zone */ ;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function create_event($row) - { - $ret = ""; - if (!isset($row['Create Event'])) { - throw new Exception("Error getting event code, unknown output. " . "Please check 'http://stackoverflow.com/questions/10853826/mysql-5-5-create-event-gives-syntax-error'"); - } - $eventName = $row['Event']; - $eventStmt = $row['Create Event']; - $sqlMode = $row['sql_mode']; - $definerStr = $this->dumpSettings['skip-definer'] ? '' : '/*!50117 \\2*/ '; - if ($eventStmtReplaced = \preg_replace('/^(CREATE)\\s+(' . self::DEFINER_RE . ')?\\s+(EVENT .*)$/', '/*!50106 \\1*/ ' . $definerStr . '/*!50106 \\3 */', $eventStmt, 1)) { - $eventStmt = $eventStmtReplaced; - } - $ret .= "/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;" . \PHP_EOL . "/*!50106 DROP EVENT IF EXISTS `" . $eventName . "` */;" . \PHP_EOL . "DELIMITER ;;" . \PHP_EOL . "/*!50003 SET @saved_cs_client = @@character_set_client */ ;;" . \PHP_EOL . "/*!50003 SET @saved_cs_results = @@character_set_results */ ;;" . \PHP_EOL . "/*!50003 SET @saved_col_connection = @@collation_connection */ ;;" . \PHP_EOL . "/*!50003 SET character_set_client = utf8 */ ;;" . \PHP_EOL . "/*!50003 SET character_set_results = utf8 */ ;;" . \PHP_EOL . "/*!50003 SET collation_connection = utf8_general_ci */ ;;" . \PHP_EOL . "/*!50003 SET @saved_sql_mode = @@sql_mode */ ;;" . \PHP_EOL . "/*!50003 SET sql_mode = '" . $sqlMode . "' */ ;;" . \PHP_EOL . "/*!50003 SET @saved_time_zone = @@time_zone */ ;;" . \PHP_EOL . "/*!50003 SET time_zone = 'SYSTEM' */ ;;" . \PHP_EOL . $eventStmt . " ;;" . \PHP_EOL . "/*!50003 SET time_zone = @saved_time_zone */ ;;" . \PHP_EOL . "/*!50003 SET sql_mode = @saved_sql_mode */ ;;" . \PHP_EOL . "/*!50003 SET character_set_client = @saved_cs_client */ ;;" . \PHP_EOL . "/*!50003 SET character_set_results = @saved_cs_results */ ;;" . \PHP_EOL . "/*!50003 SET collation_connection = @saved_col_connection */ ;;" . \PHP_EOL . "DELIMITER ;" . \PHP_EOL . "/*!50106 SET TIME_ZONE= @save_time_zone */ ;" . \PHP_EOL . \PHP_EOL; - // Commented because we are doing this in restore_parameters() - // "/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;" . PHP_EOL . PHP_EOL; - return $ret; - } - public function show_tables() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SELECT TABLE_NAME AS tbl_name " . "FROM INFORMATION_SCHEMA.TABLES " . "WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA='{$args[0]}' " . "ORDER BY TABLE_NAME"; - } - public function show_views() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SELECT TABLE_NAME AS tbl_name " . "FROM INFORMATION_SCHEMA.TABLES " . "WHERE TABLE_TYPE='VIEW' AND TABLE_SCHEMA='{$args[0]}' " . "ORDER BY TABLE_NAME"; - } - public function show_triggers() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SHOW TRIGGERS FROM `{$args[0]}`;"; - } - public function show_columns() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SHOW COLUMNS FROM `{$args[0]}`;"; - } - public function show_procedures() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SELECT SPECIFIC_NAME AS procedure_name " . "FROM INFORMATION_SCHEMA.ROUTINES " . "WHERE ROUTINE_TYPE='PROCEDURE' AND ROUTINE_SCHEMA='{$args[0]}'"; - } - public function show_functions() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SELECT SPECIFIC_NAME AS function_name " . "FROM INFORMATION_SCHEMA.ROUTINES " . "WHERE ROUTINE_TYPE='FUNCTION' AND ROUTINE_SCHEMA='{$args[0]}'"; - } - /** - * Get query string to ask for names of events from current database. - * - * @param string Name of database - * @return string - */ - public function show_events() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "SELECT EVENT_NAME AS event_name " . "FROM INFORMATION_SCHEMA.EVENTS " . "WHERE EVENT_SCHEMA='{$args[0]}'"; - } - public function setup_transaction() - { - return "SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ"; - } - public function start_transaction() - { - return "START TRANSACTION " . "/*!40100 WITH CONSISTENT SNAPSHOT */"; - } - public function commit_transaction() - { - return "COMMIT"; - } - public function lock_table() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return $this->dbHandler->exec("LOCK TABLES `{$args[0]}` READ LOCAL"); - } - public function unlock_table() - { - return $this->dbHandler->exec("UNLOCK TABLES"); - } - public function start_add_lock_table() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "LOCK TABLES `{$args[0]}` WRITE;" . \PHP_EOL; - } - public function end_add_lock_table() - { - return "UNLOCK TABLES;" . \PHP_EOL; - } - public function start_add_disable_keys() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "/*!40000 ALTER TABLE `{$args[0]}` DISABLE KEYS */;" . \PHP_EOL; - } - public function end_add_disable_keys() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "/*!40000 ALTER TABLE `{$args[0]}` ENABLE KEYS */;" . \PHP_EOL; - } - public function start_disable_autocommit() - { - return "SET autocommit=0;" . \PHP_EOL; - } - public function end_disable_autocommit() - { - return "COMMIT;" . \PHP_EOL; - } - public function add_drop_database() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "/*!40000 DROP DATABASE IF EXISTS `{$args[0]}`*/;" . \PHP_EOL . \PHP_EOL; - } - public function add_drop_trigger() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "DROP TRIGGER IF EXISTS `{$args[0]}`;" . \PHP_EOL; - } - public function drop_table() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "DROP TABLE IF EXISTS `{$args[0]}`;" . \PHP_EOL; - } - public function drop_view() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "DROP TABLE IF EXISTS `{$args[0]}`;" . \PHP_EOL . "/*!50001 DROP VIEW IF EXISTS `{$args[0]}`*/;" . \PHP_EOL; - } - public function getDatabaseHeader() - { - $this->check_parameters(\func_num_args(), $expected_num_args = 1, __METHOD__); - $args = \func_get_args(); - return "--" . \PHP_EOL . "-- Current Database: `{$args[0]}`" . \PHP_EOL . "--" . \PHP_EOL . \PHP_EOL; - } - /** - * Decode column metadata and fill info structure. - * type, is_numeric and is_blob will always be available. - * - * @param array $colType Array returned from "SHOW COLUMNS FROM tableName" - * @return array - */ - public function parseColumnType($colType) - { - $colInfo = array(); - $colParts = \explode(" ", $colType['Type']); - if ($fparen = \strpos($colParts[0], "(")) { - $colInfo['type'] = \substr($colParts[0], 0, $fparen); - $colInfo['length'] = \str_replace(")", "", \substr($colParts[0], $fparen + 1)); - $colInfo['attributes'] = isset($colParts[1]) ? $colParts[1] : null; - } else { - $colInfo['type'] = $colParts[0]; - } - $colInfo['is_numeric'] = \in_array($colInfo['type'], $this->mysqlTypes['numerical']); - $colInfo['is_blob'] = \in_array($colInfo['type'], $this->mysqlTypes['blob']); - // for virtual columns that are of type 'Extra', column type - // could by "STORED GENERATED" or "VIRTUAL GENERATED" - // MySQL reference: https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html - $colInfo['is_virtual'] = \strpos($colType['Extra'], "VIRTUAL GENERATED") !== \false || \strpos($colType['Extra'], "STORED GENERATED") !== \false; - return $colInfo; - } - public function backup_parameters() - { - $ret = "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" . \PHP_EOL . "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" . \PHP_EOL . "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" . \PHP_EOL . "/*!40101 SET NAMES " . $this->dumpSettings['default-character-set'] . " */;" . \PHP_EOL; - if (\false === $this->dumpSettings['skip-tz-utc']) { - $ret .= "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;" . \PHP_EOL . "/*!40103 SET TIME_ZONE='+00:00' */;" . \PHP_EOL; - } - if ($this->dumpSettings['no-autocommit']) { - $ret .= "/*!40101 SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT */;" . \PHP_EOL; - } - $ret .= "/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;" . \PHP_EOL . "/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;" . \PHP_EOL . "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;" . \PHP_EOL . "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - public function restore_parameters() - { - $ret = ""; - if (\false === $this->dumpSettings['skip-tz-utc']) { - $ret .= "/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;" . \PHP_EOL; - } - if ($this->dumpSettings['no-autocommit']) { - $ret .= "/*!40101 SET AUTOCOMMIT=@OLD_AUTOCOMMIT */;" . \PHP_EOL; - } - $ret .= "/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;" . \PHP_EOL . "/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;" . \PHP_EOL . "/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;" . \PHP_EOL . "/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;" . \PHP_EOL . "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;" . \PHP_EOL . "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;" . \PHP_EOL . "/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;" . \PHP_EOL . \PHP_EOL; - return $ret; - } - /** - * Check number of parameters passed to function, useful when inheriting. - * Raise exception if unexpected. - * - * @param integer $num_args - * @param integer $expected_num_args - * @param string $method_name - */ - private function check_parameters($num_args, $expected_num_args, $method_name) - { - if ($num_args != $expected_num_args) { - throw new Exception("Unexpected parameter passed to {$method_name}"); - } - return; - } -} diff --git a/dependencies/jasny/immutable/phpcs.xml b/dependencies/jasny/immutable/phpcs.xml deleted file mode 100644 index 5897613..0000000 --- a/dependencies/jasny/immutable/phpcs.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - The Jasny coding standard. - - - - - - - - - diff --git a/dependencies/jasny/immutable/phpstan.neon b/dependencies/jasny/immutable/phpstan.neon deleted file mode 100644 index 368b419..0000000 --- a/dependencies/jasny/immutable/phpstan.neon +++ /dev/null @@ -1,10 +0,0 @@ -parameters: - level: 7 - paths: - - src - reportUnmatchedIgnoredErrors: false - ignoreErrors: - - /^Variable property access/ - -includes: - - vendor/phpstan/phpstan-strict-rules/rules.neon diff --git a/dependencies/jasny/immutable/src/NoDynamicProperties.php b/dependencies/jasny/immutable/src/NoDynamicProperties.php deleted file mode 100644 index 7c67b14..0000000 --- a/dependencies/jasny/immutable/src/NoDynamicProperties.php +++ /dev/null @@ -1,22 +0,0 @@ -{$property}) && $this->{$property} === $value || !isset($this->{$property}) && $value === null) { - return $this; - } - $clone = clone $this; - $clone->{$property} = $value; - return $clone; - } - /** - * Return a copy with a property unset. - * Returns this object if the resulting object would be the same as the current one. - * - * @param string $property - * @return static - * @throws \BadMethodCallException if property doesn't exist - */ - private function withoutProperty(string $property) - { - if (!\property_exists($this, $property)) { - throw new \BadMethodCallException(\sprintf('%s has no property "%s"', \get_class($this), $property)); - } - if (!isset($this->{$property})) { - return $this; - } - $clone = clone $this; - unset($clone->{$property}); - return $clone; - } - /** - * Return a copy with an added item for a property. - * Returns this object if the resulting object would be the same as the current one. - * - * @param string $property - * @param string $key - * @param mixed $value - * @return static - * @throws \BadMethodCallException if property doesn't exist - */ - private function withPropertyKey(string $property, string $key, $value) - { - if (!\property_exists($this, $property)) { - throw new \BadMethodCallException(\sprintf('%s has no property "%s"', \get_class($this), $property)); - } - // @codeCoverageIgnore - if (!\is_array($this->{$property}) && !$this->{$property} instanceof \ArrayAccess) { - throw new \BadMethodCallException(\sprintf('%s::$%s is not an array', \get_class($this), $property)); - } - if (isset($this->{$property}[$key]) && $this->{$property}[$key] === $value) { - return $this; - } - $clone = clone $this; - $clone->{$property}[$key] = $value; - return $clone; - } - /** - * Return a copy with a removed item from a property. - * Returns this object if the resulting object would be the same as the current one. - * - * @param string $property - * @param string $key - * @return static - * @throws \BadMethodCallException if property doesn't exist or isn't an array - */ - private function withoutPropertyKey(string $property, string $key) - { - if (!\property_exists($this, $property)) { - throw new \BadMethodCallException(\sprintf('%s has no property "%s"', \get_class($this), $property)); - } - // @codeCoverageIgnore - if (!\is_array($this->{$property}) && !$this->{$property} instanceof \ArrayAccess) { - throw new \BadMethodCallException(\sprintf('%s::$%s is not an array', \get_class($this), $property)); - } - if (!isset($this->{$property}[$key])) { - return $this; - } - $clone = clone $this; - unset($clone->{$property}[$key]); - return $clone; - } - /** - * Return a copy with a value added to a sequential array. - * - * @param string $property - * @param mixed $value - * @param mixed $unique Don't add if the array already has a copy of the value. - * @return static - * @throws \BadMethodCallException if property doesn't exist or isn't an array - */ - private function withPropertyItem(string $property, $value, bool $unique = \false) - { - if (!\property_exists($this, $property)) { - throw new \BadMethodCallException(\sprintf('%s has no property "%s"', \get_class($this), $property)); - } - if (!\is_array($this->{$property})) { - throw new \BadMethodCallException(\sprintf('%s::$%s is not an array', \get_class($this), $property)); - } - if ($unique && \in_array($value, $this->{$property}, \true)) { - return $this; - } - $clone = clone $this; - $clone->{$property}[] = $value; - return $clone; - } - /** - * Return a copy with a value removed from a sequential array. - * Returns this object if the resulting object would be the same as the current one. - * - * @param string $property - * @param mixed $value - * @return static - * @throws \BadMethodCallException if property doesn't exist or isn't an array - */ - private function withoutPropertyItem(string $property, $value) - { - if (!\property_exists($this, $property)) { - throw new \BadMethodCallException(\sprintf('%s has no property "%s"', \get_class($this), $property)); - } - if (!\is_array($this->{$property})) { - throw new \BadMethodCallException(\sprintf('%s::$%s is not an array', \get_class($this), $property)); - } - $keys = \array_keys($this->{$property}, $value, \true); - if ($keys === []) { - return $this; - } - $clone = clone $this; - $clone->{$property} = \array_values(\array_diff_key($clone->{$property}, \array_fill_keys($keys, null))); - return $clone; - } -} diff --git a/dependencies/jasny/sso/codeception.yml b/dependencies/jasny/sso/codeception.yml deleted file mode 100644 index b0d68ce..0000000 --- a/dependencies/jasny/sso/codeception.yml +++ /dev/null @@ -1,14 +0,0 @@ -actor: Tester -paths: - tests: tests - log: tests/_output - data: tests/_data - support: tests/_support - envs: tests/_envs -bootstrap: _bootstrap.php -settings: - colors: true - memory_limit: 1024M -extensions: - enabled: - - WP_Ultimo\Dependencies\Codeception\Extension\RunFailed diff --git a/dependencies/jasny/sso/phpcs.xml b/dependencies/jasny/sso/phpcs.xml deleted file mode 100644 index 5897613..0000000 --- a/dependencies/jasny/sso/phpcs.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - The Jasny coding standard. - - - - - - - - - diff --git a/dependencies/jasny/sso/src/Broker/Broker.php b/dependencies/jasny/sso/src/Broker/Broker.php deleted file mode 100644 index 51d3840..0000000 --- a/dependencies/jasny/sso/src/Broker/Broker.php +++ /dev/null @@ -1,281 +0,0 @@ - - */ - protected $state; - /** - * @var Curl - */ - protected $curl; - /** - * Class constructor - * - * @param string $url Url of SSO server - * @param string $broker My identifier, given by SSO provider. - * @param string $secret My secret word, given by SSO provider. - */ - public function __construct(string $url, string $broker, string $secret) - { - if (!(bool) \preg_match('~^https?://~', $url)) { - throw new \InvalidArgumentException("Invalid SSO server URL '{$url}'"); - } - if ((bool) \preg_match('/\\W/', $broker)) { - throw new \InvalidArgumentException("Invalid broker id '{$broker}': must be alphanumeric"); - } - $this->url = $url; - $this->broker = $broker; - $this->secret = $secret; - $this->state = new Cookies(); - } - /** - * Get a copy with a different handler for the user state (like cookie or session). - * - * @param \ArrayAccess $handler - * @return static - */ - public function withTokenIn(\ArrayAccess $handler) : self - { - return $this->withProperty('state', $handler); - } - /** - * Set a custom wrapper for cURL. - * - * @param Curl $curl - * @return static - */ - public function withCurl(Curl $curl) : self - { - return $this->withProperty('curl', $curl); - } - /** - * Get Wrapped cURL. - */ - protected function getCurl() : Curl - { - if (!isset($this->curl)) { - $this->curl = new Curl(); - // @codeCoverageIgnore - } - return $this->curl; - } - /** - * Get the broker identifier. - */ - public function getBrokerId() : string - { - return $this->broker; - } - /** - * Get information from cookie. - */ - protected function initialize() : void - { - if ($this->initialized) { - return; - } - $this->token = $this->state[$this->getCookieName('token')] ?? null; - $this->verificationCode = $this->state[$this->getCookieName('verify')] ?? null; - $this->initialized = \true; - } - /** - * @return string|null - */ - protected function getToken() : ?string - { - $this->initialize(); - return $this->token; - } - /** - * @return string|null - */ - protected function getVerificationCode() : ?string - { - $this->initialize(); - return $this->verificationCode; - } - /** - * Get the cookie name. - * The broker name is part of the cookie name. This resolves issues when multiple brokers are on the same domain. - */ - protected function getCookieName(string $type) : string - { - $brokerName = \preg_replace('/[_\\W]+/', '_', \strtolower($this->broker)); - return "sso_{$type}_{$brokerName}"; - } - /** - * Generate session id from session key - * - * @throws NotAttachedException - */ - public function getBearerToken() : string - { - $token = $this->getToken(); - $verificationCode = $this->getVerificationCode(); - if ($verificationCode === null) { - throw new NotAttachedException("The client isn't attached to the SSO server for this broker. " . "Make sure that the '" . $this->getCookieName('verify') . "' cookie is set."); - } - return "SSO-{$this->broker}-{$token}-" . $this->generateChecksum("bearer:{$verificationCode}"); - } - /** - * Generate session token. - */ - protected function generateToken() : void - { - $this->token = \base_convert(\bin2hex(\random_bytes(32)), 16, 36); - $this->state[$this->getCookieName('token')] = $this->token; - } - /** - * Clears session token. - */ - public function clearToken() : void - { - unset($this->state[$this->getCookieName('token')]); - unset($this->state[$this->getCookieName('verify')]); - $this->token = null; - $this->verificationCode = null; - } - /** - * Check if we have an SSO token. - */ - public function isAttached() : bool - { - return $this->getVerificationCode() !== null; - } - /** - * Get URL to attach session at SSO server. - * - * @param array $params - * @return string - */ - public function getAttachUrl(array $params = []) : string - { - if ($this->getToken() === null) { - $this->generateToken(); - } - $data = ['broker' => $this->broker, 'token' => $this->getToken(), 'checksum' => $this->generateChecksum('attach')]; - return $this->url . "?" . \http_build_query($data + $params); - } - /** - * Verify attaching to the SSO server by providing the verification code. - */ - public function verify(string $code) : void - { - $this->initialize(); - if ($this->verificationCode === $code) { - return; - } - if ($this->verificationCode !== null) { - \trigger_error("SSO attach already verified", \E_USER_WARNING); - return; - } - $this->verificationCode = $code; - $this->state[$this->getCookieName('verify')] = $code; - } - /** - * Generate checksum for a broker. - */ - protected function generateChecksum(string $command) : string - { - return \base_convert(\hash_hmac('sha256', $command . ':' . $this->token, $this->secret), 16, 36); - } - /** - * Get the request url for a command - * - * @param string $path - * @param array|string $params Query parameters - * @return string - */ - protected function getRequestUrl(string $path, $params = '') : string - { - $query = \is_array($params) ? \http_build_query($params) : $params; - $base = $path[0] === '/' ? \preg_replace('~^(\\w+://[^/]+).*~', '$1', $this->url) : \preg_replace('~/[^/]*$~', '', $this->url); - return $base . '/' . \ltrim($path, '/') . ($query !== '' ? '?' . $query : ''); - } - /** - * Send an HTTP request to the SSO server. - * - * @param string $method HTTP method: 'GET', 'POST', 'DELETE' - * @param string $path Relative path - * @param array|string $data Query or post parameters - * @return mixed - * @throws RequestException - */ - public function request(string $method, string $path, $data = '') - { - $url = $this->getRequestUrl($path, $method === 'POST' ? '' : $data); - $headers = ['Accept: application/json', 'Authorization: Bearer ' . $this->getBearerToken()]; - ['httpCode' => $httpCode, 'contentType' => $contentType, 'body' => $body] = $this->getCurl()->request($method, $url, $headers, $method === 'POST' ? $data : ''); - return $this->handleResponse($httpCode, $contentType, $body); - } - /** - * Handle the response of the cURL request. - * - * @param int $httpCode HTTP status code - * @param string|null $ctHeader Content-Type header - * @param string $body Response body - * @return mixed - * @throws RequestException - */ - protected function handleResponse(int $httpCode, $ctHeader, string $body) - { - if ($httpCode === 204) { - return null; - } - [$contentType] = \explode(';', $ctHeader, 2); - if ($contentType != 'application/json') { - throw new RequestException("Expected 'application/json' response, got '{$contentType}'", 500, new RequestException($body, $httpCode)); - } - try { - $data = \json_decode($body, \true, 512, \JSON_THROW_ON_ERROR); - } catch (\JsonException $exception) { - throw new RequestException("Invalid JSON response from server", 500, $exception); - } - if ($httpCode >= 400) { - throw new RequestException($data['error'] ?? $body, $httpCode); - } - return $data; - } -} diff --git a/dependencies/jasny/sso/src/Broker/Cookies.php b/dependencies/jasny/sso/src/Broker/Cookies.php deleted file mode 100644 index a76b4cd..0000000 --- a/dependencies/jasny/sso/src/Broker/Cookies.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @codeCoverageIgnore - */ -class Cookies implements \ArrayAccess -{ - /** @var int */ - protected $ttl; - /** @var string */ - protected $path; - /** @var string */ - protected $domain; - /** @var bool */ - protected $secure; - /** - * Cookies constructor. - * - * @param int $ttl Cookie TTL in seconds - * @param string $path - * @param string $domain - * @param bool $secure - */ - public function __construct(int $ttl = 3600, string $path = '', string $domain = '', bool $secure = \false) - { - $this->ttl = $ttl; - $this->path = $path; - $this->domain = $domain; - $this->secure = $secure; - } - /** - * @inheritDoc - */ - #[\ReturnTypeWillChange] - public function offsetSet($name, $value) - { - $success = \setcookie($name, $value, \time() + $this->ttl, $this->path, $this->domain, $this->secure, \true); - if (!$success) { - throw new \RuntimeException("Failed to set cookie '{$name}'"); - } - $_COOKIE[$name] = $value; - } - /** - * @inheritDoc - */ - public function offsetUnset($name) : void - { - \setcookie($name, '', 1, $this->path, $this->domain, $this->secure, \true); - unset($_COOKIE[$name]); - } - /** - * @inheritDoc - */ - #[\ReturnTypeWillChange] - public function offsetGet($name) - { - return $_COOKIE[$name] ?? null; - } - /** - * @inheritDoc - */ - #[\ReturnTypeWillChange] - public function offsetExists($name) - { - return isset($_COOKIE[$name]); - } -} diff --git a/dependencies/jasny/sso/src/Broker/Curl.php b/dependencies/jasny/sso/src/Broker/Curl.php deleted file mode 100644 index 7e45c69..0000000 --- a/dependencies/jasny/sso/src/Broker/Curl.php +++ /dev/null @@ -1,56 +0,0 @@ -|string $data Query or post parameters - * @return array{httpCode:int,contentType:string,body:string} - * @throws RequestException - */ - public function request(string $method, string $url, array $headers, $data = '') - { - $ch = \curl_init($url); - if ($ch === \false) { - throw new \RuntimeException("Failed to initialize a cURL session"); - } - if ($data !== [] && $data !== '') { - $post = \is_string($data) ? $data : \http_build_query($data); - \curl_setopt($ch, \CURLOPT_POSTFIELDS, $post); - } - \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, \true); - \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, $method); - \curl_setopt($ch, \CURLOPT_HTTPHEADER, $headers); - $responseBody = (string) \curl_exec($ch); - if (\curl_errno($ch) != 0) { - throw new RequestException('Server request failed: ' . \curl_error($ch)); - } - $httpCode = \curl_getinfo($ch, \CURLINFO_HTTP_CODE); - $contentType = \curl_getinfo($ch, \CURLINFO_CONTENT_TYPE) ?? 'text/html'; - return ['httpCode' => $httpCode, 'contentType' => $contentType, 'body' => $responseBody]; - } -} diff --git a/dependencies/jasny/sso/src/Broker/NotAttachedException.php b/dependencies/jasny/sso/src/Broker/NotAttachedException.php deleted file mode 100644 index 5813481..0000000 --- a/dependencies/jasny/sso/src/Broker/NotAttachedException.php +++ /dev/null @@ -1,11 +0,0 @@ - - * @codeCoverageIgnore - */ -class Session implements \ArrayAccess -{ - /** - * @inheritDoc - */ - public function offsetSet($name, $value) : void - { - $_SESSION[$name] = $value; - } - /** - * @inheritDoc - */ - public function offsetUnset($name) : void - { - unset($_SESSION[$name]); - } - /** - * @inheritDoc - */ - public function offsetGet($name) - { - return $_SESSION[$name] ?? null; - } - /** - * @inheritDoc - */ - public function offsetExists($name) : bool - { - return isset($_SESSION[$name]); - } -} diff --git a/dependencies/jasny/sso/src/Server/BrokerException.php b/dependencies/jasny/sso/src/Server/BrokerException.php deleted file mode 100644 index be88b6d..0000000 --- a/dependencies/jasny/sso/src/Server/BrokerException.php +++ /dev/null @@ -1,12 +0,0 @@ - - */ - protected $options; - /** - * Class constructor. - * - * @param array $options Options passed to session_start(). - */ - public function __construct(array $options = []) - { - $this->options = $options + ['cookie_samesite' => 'None', 'cookie_secure' => \true]; - } - /** - * @inheritDoc - */ - public function getId() : string - { - return \session_id(); - } - /** - * @inheritDoc - */ - public function start() : void - { - $started = \session_status() !== \PHP_SESSION_ACTIVE ? \session_start($this->options) : \true; - if (!$started) { - $err = \error_get_last() ?? ['message' => 'Failed to start session']; - throw new ServerException($err['message'], 500); - } - // Session shouldn't be empty when resumed. - $_SESSION['_sso_init'] = 1; - } - /** - * @inheritDoc - */ - public function resume(string $id) : void - { - \session_id($id); - $started = \session_start($this->options); - if (!$started) { - $err = \error_get_last() ?? ['message' => 'Failed to start session']; - throw new ServerException($err['message'], 500); - } - if ($_SESSION === []) { - \session_abort(); - throw new BrokerException("Session has expired. Client must attach with new token.", 401); - } - } - /** - * @inheritDoc - */ - public function isActive() : bool - { - return \session_status() === \PHP_SESSION_ACTIVE; - } -} diff --git a/dependencies/jasny/sso/src/Server/Server.php b/dependencies/jasny/sso/src/Server/Server.php deleted file mode 100644 index 2e4ee91..0000000 --- a/dependencies/jasny/sso/src/Server/Server.php +++ /dev/null @@ -1,273 +0,0 @@ -getBrokerInfo = \Closure::fromCallable($getBrokerInfo); - $this->cache = $cache; - $this->logger = new NullLogger(); - $this->session = new GlobalSession(); - } - /** - * Get a copy of the service with logging. - * - * @return static - */ - public function withLogger(LoggerInterface $logger) : self - { - return $this->withProperty('logger', $logger); - } - /** - * Get a copy of the service with a custom session service. - * - * @return static - */ - public function withSession(SessionInterface $session) : self - { - return $this->withProperty('session', $session); - } - /** - * Start the session for broker requests to the SSO server. - * - * @throws BrokerException - * @throws ServerException - */ - public function startBrokerSession(?ServerRequestInterface $request = null) : void - { - if ($this->session->isActive()) { - throw new ServerException("Session is already started", 500); - } - $bearer = $this->getBearerToken($request); - [$brokerId, $token, $checksum] = $this->parseBearer($bearer); - $sessionId = $this->cache->get($this->getCacheKey($brokerId, $token)); - if ($sessionId === null) { - $this->logger->warning("Bearer token isn't attached to a client session", ['broker' => $brokerId, 'token' => $token]); - throw new BrokerException("Bearer token isn't attached to a client session", 403); - } - $code = $this->getVerificationCode($brokerId, $token, $sessionId); - $this->validateChecksum($checksum, 'bearer', $brokerId, $token, $code); - $this->session->resume($sessionId); - $this->logger->debug("Broker request with session", ['broker' => $brokerId, 'token' => $token, 'session' => $sessionId]); - } - /** - * Get bearer token from Authorization header. - */ - protected function getBearerToken(?ServerRequestInterface $request = null) : string - { - $authorization = $request === null ? $_SERVER['HTTP_AUTHORIZATION'] ?? '' : $request->getHeaderLine('Authorization'); - [$type, $token] = \explode(' ', $authorization, 2) + ['', '']; - if ($type !== 'Bearer') { - $this->logger->warning("Broker didn't use bearer authentication: " . ($authorization === '' ? "No 'Authorization' header" : "{$type} authorization used")); - throw new BrokerException("Broker didn't use bearer authentication", 401); - } - return $token; - } - /** - * Get the broker id and token from the bearer token used by the broker. - * - * @return string[] - * @throws BrokerException - */ - protected function parseBearer(string $bearer) : array - { - $matches = null; - if (!(bool) \preg_match('/^SSO-(\\w*+)-(\\w*+)-([a-z0-9]*+)$/', $bearer, $matches)) { - $this->logger->warning("Invalid bearer token", ['bearer' => $bearer]); - throw new BrokerException("Invalid bearer token", 403); - } - return \array_slice($matches, 1); - } - /** - * Generate cache key for linking the broker token to the client session. - */ - protected function getCacheKey(string $brokerId, string $token) : string - { - return "SSO-{$brokerId}-{$token}"; - } - /** - * Get the broker secret using the configured callback. - * - * @param string $brokerId - * @return string|null - */ - protected function getBrokerSecret(string $brokerId) : ?string - { - return ($this->getBrokerInfo)($brokerId)['secret'] ?? null; - } - /** - * Generate the verification code based on the token using the server secret. - */ - protected function getVerificationCode(string $brokerId, string $token, string $sessionId) : string - { - return \base_convert(\hash('sha256', $brokerId . $token . $sessionId), 16, 36); - } - /** - * Generate checksum for a broker. - */ - protected function generateChecksum(string $command, string $brokerId, string $token) : string - { - $secret = $this->getBrokerSecret($brokerId); - if ($secret === null) { - $this->logger->warning("Unknown broker", ['broker' => $brokerId, 'token' => $token]); - throw new BrokerException("Broker is unknown or disabled", 403); - } - return \base_convert(\hash_hmac('sha256', $command . ':' . $token, $secret), 16, 36); - } - /** - * Assert that the checksum matches the expected checksum. - * - * @throws BrokerException - */ - protected function validateChecksum(string $checksum, string $command, string $brokerId, string $token, ?string $code = null) : void - { - $expected = $this->generateChecksum($command . ($code !== null ? ":{$code}" : ''), $brokerId, $token); - if ($checksum !== $expected) { - $this->logger->warning("Invalid {$command} checksum", ['expected' => $expected, 'received' => $checksum, 'broker' => $brokerId, 'token' => $token] + ($code !== null ? ['verification_code' => $code] : [])); - throw new BrokerException("Invalid {$command} checksum", 403); - } - } - /** - * Validate that the URL has a domain that is allowed for the broker. - */ - public function validateDomain(string $type, string $url, string $brokerId, ?string $token = null) : void - { - $domains = ($this->getBrokerInfo)($brokerId)['domains'] ?? []; - $host = \parse_url($url, \PHP_URL_HOST); - if (!\in_array($host, $domains, \true)) { - $this->logger->warning("Domain of {$type} is not allowed for broker", [$type => $url, 'broker' => $brokerId] + ($token !== null ? ['token' => $token] : [])); - throw new BrokerException("Domain of {$type} is not allowed", 400); - } - } - /** - * Attach a client session to a broker session. - * Returns the verification code. - * - * @throws BrokerException - * @throws ServerException - */ - public function attach(?ServerRequestInterface $request = null) : string - { - ['broker' => $brokerId, 'token' => $token] = $this->processAttachRequest($request); - $this->session->start(); - $this->assertNotAttached($brokerId, $token); - $key = $this->getCacheKey($brokerId, $token); - $cached = $this->cache->set($key, $this->session->getId()); - $info = ['broker' => $brokerId, 'token' => $token, 'session' => $this->session->getId()]; - if (!$cached) { - $this->logger->error("Failed to attach bearer token to session id due to cache issue", $info); - throw new ServerException("Failed to attach bearer token to session id", 500); - } - $this->logger->info("Attached broker token to session", $info); - return $this->getVerificationCode($brokerId, $token, $this->session->getId()); - } - /** - * Assert that the token isn't already attached to a different session. - */ - protected function assertNotAttached(string $brokerId, string $token) : void - { - $key = $this->getCacheKey($brokerId, $token); - $attached = $this->cache->get($key); - if ($attached !== null && $attached !== $this->session->getId()) { - $this->logger->warning("Token is already attached", ['broker' => $brokerId, 'token' => $token, 'attached_to' => $attached, 'session' => $this->session->getId()]); - throw new BrokerException("Token is already attached", 400); - } - } - /** - * Validate attach request and return broker id and token. - * - * @param ServerRequestInterface|null $request - * @return array{broker:string,token:string} - * @throws BrokerException - */ - protected function processAttachRequest(?ServerRequestInterface $request) : array - { - $brokerId = $this->getRequiredQueryParam($request, 'broker'); - $token = $this->getRequiredQueryParam($request, 'token'); - $checksum = $this->getRequiredQueryParam($request, 'checksum'); - $this->validateChecksum($checksum, 'attach', $brokerId, $token); - $origin = $this->getHeader($request, 'Origin'); - if ($origin !== '') { - $this->validateDomain('origin', $origin, $brokerId, $token); - } - $referer = $this->getHeader($request, 'Referer'); - if ($referer !== '') { - $this->validateDomain('referer', $referer, $brokerId, $token); - } - $returnUrl = $this->getQueryParam($request, 'return_url'); - if ($returnUrl !== null) { - $this->validateDomain('return_url', $returnUrl, $brokerId, $token); - } - return ['broker' => $brokerId, 'token' => $token]; - } - /** - * Get query parameter from PSR-7 request or $_GET. - */ - protected function getQueryParam(?ServerRequestInterface $request, string $key) : ?string - { - $params = $request === null ? $_GET : $request->getQueryParams(); - return $params[$key] ?? null; - } - /** - * Get required query parameter from PSR-7 request or $_GET. - * - * @throws BrokerException if query parameter isn't set - */ - protected function getRequiredQueryParam(?ServerRequestInterface $request, string $key) : string - { - $value = $this->getQueryParam($request, $key); - if ($value === null) { - throw new BrokerException("Missing '{$key}' query parameter", 400); - } - return $value; - } - /** - * Get HTTP Header from PSR-7 request or $_SERVER. - * - * @param ServerRequestInterface $request - * @param string $key - * @return string - */ - protected function getHeader(?ServerRequestInterface $request, string $key) : string - { - return $request === null ? $_SERVER['HTTP_' . \str_replace('-', '_', \strtoupper($key))] ?? '' : $request->getHeaderLine($key); - } -} diff --git a/dependencies/jasny/sso/src/Server/ServerException.php b/dependencies/jasny/sso/src/Server/ServerException.php deleted file mode 100644 index 8ed843d..0000000 --- a/dependencies/jasny/sso/src/Server/ServerException.php +++ /dev/null @@ -1,12 +0,0 @@ -pem) === \false) { - throw new InvalidCertificateException("Could not convert 'OpenSSL X.509' resource to PEM!"); - } - if (!($this->info = \openssl_x509_parse($cert))) { - throw new InvalidCertificateException("Invalid PEM encoded certificate!"); - } - } - public function getNames() - { - $san = isset($this->info["extensions"]["subjectAltName"]) ? $this->info["extensions"]["subjectAltName"] : ""; - $names = []; - $parts = \array_map("trim", \explode(",", $san)); - foreach ($parts as $part) { - if (\stripos($part, "dns:") === 0) { - $names[] = \substr($part, 4); - } - } - $names = \array_map("strtolower", $names); - $names = \array_unique($names); - \sort($names); - return $names; - } - public function getSubject() - { - if ($this->subject === null) { - $this->subject = new Profile(isset($this->info["subject"]["CN"]) ? $this->info["subject"]["CN"] : null, isset($this->info["subject"]["O"]) ? $this->info["subject"]["O"] : null, isset($this->info["subject"]["C"]) ? $this->info["subject"]["C"] : null); - } - return $this->subject; - } - public function getIssuer() - { - if ($this->issuer === null) { - $this->issuer = new Profile(isset($this->info["issuer"]["CN"]) ? $this->info["issuer"]["CN"] : null, isset($this->info["issuer"]["O"]) ? $this->info["issuer"]["O"] : null, isset($this->info["issuer"]["C"]) ? $this->info["issuer"]["C"] : null); - } - return $this->issuer; - } - public function getSerialNumber() - { - return $this->info["serialNumber"]; - } - public function getValidFrom() - { - return $this->info["validFrom_time_t"]; - } - public function getValidTo() - { - return $this->info["validTo_time_t"]; - } - public function getSignatureType() - { - // https://3v4l.org/Iu3T2 - if (!isset($this->info["signatureTypeSN"])) { - throw new FieldNotSupportedException("Signature type is not supported in this version of PHP. Please update your version to a higher bugfix version. See: https://3v4l.org/Iu3T2"); - } - return $this->info["signatureTypeSN"]; - } - public function isSelfSigned() - { - return $this->info["subject"] === $this->info["issuer"]; - } - public function toPem() - { - return $this->pem; - } - public function toDer() - { - return self::pemToDer($this->pem); - } - public function __toString() - { - return $this->pem; - } - public function __debugInfo() - { - return ["commonName" => $this->getSubject()->getCommonName(), "names" => $this->getNames(), "issuedBy" => $this->getIssuer()->getCommonName(), "validFrom" => \date("d.m.Y", $this->getValidFrom()), "validTo" => \date("d.m.Y", $this->getValidTo())]; - } -} diff --git a/dependencies/kelunik/certificate/src/FieldNotSupportedException.php b/dependencies/kelunik/certificate/src/FieldNotSupportedException.php deleted file mode 100644 index 14544a7..0000000 --- a/dependencies/kelunik/certificate/src/FieldNotSupportedException.php +++ /dev/null @@ -1,8 +0,0 @@ -commonName = $commonName; - $this->organizationName = $organizationName; - $this->country = $country; - } - public function getCommonName() - { - return $this->commonName; - } - public function getOrganizationName() - { - return $this->organizationName; - } - public function getCountry() - { - return $this->country; - } -} diff --git a/dependencies/league/uri-interfaces/Contracts/AuthorityInterface.php b/dependencies/league/uri-interfaces/Contracts/AuthorityInterface.php deleted file mode 100644 index 75b40fe..0000000 --- a/dependencies/league/uri-interfaces/Contracts/AuthorityInterface.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\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/dependencies/league/uri-interfaces/Contracts/DataPathInterface.php b/dependencies/league/uri-interfaces/Contracts/DataPathInterface.php deleted file mode 100644 index a9ac748..0000000 --- a/dependencies/league/uri-interfaces/Contracts/DataPathInterface.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\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/dependencies/league/uri-interfaces/Contracts/DomainHostInterface.php b/dependencies/league/uri-interfaces/Contracts/DomainHostInterface.php deleted file mode 100644 index 15150f8..0000000 --- a/dependencies/league/uri-interfaces/Contracts/DomainHostInterface.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use Countable; -use Iterator; -use IteratorAggregate; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use Stringable; -/** - * @extends IteratorAggregate - */ -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/dependencies/league/uri-interfaces/Contracts/FragmentInterface.php b/dependencies/league/uri-interfaces/Contracts/FragmentInterface.php deleted file mode 100644 index 9987c08..0000000 --- a/dependencies/league/uri-interfaces/Contracts/FragmentInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -interface FragmentInterface extends UriComponentInterface -{ - /** - * Returns the decoded fragment. - */ - public function decoded() : ?string; -} diff --git a/dependencies/league/uri-interfaces/Contracts/HostInterface.php b/dependencies/league/uri-interfaces/Contracts/HostInterface.php deleted file mode 100644 index 6ced927..0000000 --- a/dependencies/league/uri-interfaces/Contracts/HostInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -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/dependencies/league/uri-interfaces/Contracts/IpHostInterface.php b/dependencies/league/uri-interfaces/Contracts/IpHostInterface.php deleted file mode 100644 index 242a541..0000000 --- a/dependencies/league/uri-interfaces/Contracts/IpHostInterface.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\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/dependencies/league/uri-interfaces/Contracts/PathInterface.php b/dependencies/league/uri-interfaces/Contracts/PathInterface.php deleted file mode 100644 index d122e2e..0000000 --- a/dependencies/league/uri-interfaces/Contracts/PathInterface.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -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/dependencies/league/uri-interfaces/Contracts/PortInterface.php b/dependencies/league/uri-interfaces/Contracts/PortInterface.php deleted file mode 100644 index 2ed1a3a..0000000 --- a/dependencies/league/uri-interfaces/Contracts/PortInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -interface PortInterface extends UriComponentInterface -{ - /** - * Returns the integer representation of the Port. - */ - public function toInt() : ?int; -} diff --git a/dependencies/league/uri-interfaces/Contracts/QueryInterface.php b/dependencies/league/uri-interfaces/Contracts/QueryInterface.php deleted file mode 100644 index e7fb0f5..0000000 --- a/dependencies/league/uri-interfaces/Contracts/QueryInterface.php +++ /dev/null @@ -1,227 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use Countable; -use Iterator; -use IteratorAggregate; -use Stringable; -/** - * @extends IteratorAggregate - * - * @method self withoutPairByKey(string ...$keys) Returns an instance without pairs with the specified keys. - * @method self withoutPairByValue(Stringable|string|int|bool|null ...$values) Returns an instance without pairs with the specified values. - * @method self withoutPairByKeyValue(string $key, Stringable|string|int|bool|null $value) 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 ?string toFormData() Returns the string representation using the applicat/www-form-urlencoded rules - * @method ?string toRFC3986() Returns the string representation using RFC3986 rules - */ -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.2.0 - * @codeCoverageIgnore - * @see Modifier::removeQueryPairsByKey() - * - * 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 - */ - 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/dependencies/league/uri-interfaces/Contracts/SegmentedPathInterface.php b/dependencies/league/uri-interfaces/Contracts/SegmentedPathInterface.php deleted file mode 100644 index f74b217..0000000 --- a/dependencies/league/uri-interfaces/Contracts/SegmentedPathInterface.php +++ /dev/null @@ -1,131 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use Countable; -use Iterator; -use IteratorAggregate; -use WP_Ultimo\Dependencies\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 $segment) : 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 $segment) : 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/dependencies/league/uri-interfaces/Contracts/UriAccess.php b/dependencies/league/uri-interfaces/Contracts/UriAccess.php deleted file mode 100644 index 0ad21c6..0000000 --- a/dependencies/league/uri-interfaces/Contracts/UriAccess.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface as Psr7UriInterface; -interface UriAccess -{ - public function getUri() : UriInterface|Psr7UriInterface; - public function getUriString() : string; -} diff --git a/dependencies/league/uri-interfaces/Contracts/UriComponentInterface.php b/dependencies/league/uri-interfaces/Contracts/UriComponentInterface.php deleted file mode 100644 index 66797bd..0000000 --- a/dependencies/league/uri-interfaces/Contracts/UriComponentInterface.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use JsonSerializable; -use Stringable; -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/dependencies/league/uri-interfaces/Contracts/UriException.php b/dependencies/league/uri-interfaces/Contracts/UriException.php deleted file mode 100644 index 18a3a39..0000000 --- a/dependencies/league/uri-interfaces/Contracts/UriException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use Throwable; -interface UriException extends Throwable -{ -} diff --git a/dependencies/league/uri-interfaces/Contracts/UriInterface.php b/dependencies/league/uri-interfaces/Contracts/UriInterface.php deleted file mode 100644 index c81f34c..0000000 --- a/dependencies/league/uri-interfaces/Contracts/UriInterface.php +++ /dev/null @@ -1,289 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Contracts; - -use JsonSerializable; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\UriString; -use Stringable; -/** - * @phpstan-import-type ComponentMap from UriString - */ -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/dependencies/league/uri-interfaces/Contracts/UserInfoInterface.php b/dependencies/league/uri-interfaces/Contracts/UserInfoInterface.php deleted file mode 100644 index de42294..0000000 --- a/dependencies/league/uri-interfaces/Contracts/UserInfoInterface.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\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/dependencies/league/uri-interfaces/Encoder.php b/dependencies/league/uri-interfaces/Encoder.php deleted file mode 100644 index e28060a..0000000 --- a/dependencies/league/uri-interfaces/Encoder.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use Closure; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriComponentInterface; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use Stringable; -use function preg_match; -use function preg_replace_callback; -use function rawurldecode; -use function rawurlencode; -use function strtoupper; -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})'; - /** - * Encode User. - * - * All generic delimiters MUST be encoded - */ - public static function encodeUser(Stringable|string|null $component) : ?string - { - static $pattern = '/[^' . self::REGEXP_PART_UNRESERVED . self::REGEXP_PART_SUBDELIM . ']+|' . self::REGEXP_PART_ENCODED . '/'; - return self::encode($component, $pattern); - } - /** - * Encode Password. - * - * Generic delimiters ":" MUST NOT be encoded - */ - public static function encodePassword(Stringable|string|null $component) : ?string - { - static $pattern = '/[^' . self::REGEXP_PART_UNRESERVED . self::REGEXP_PART_SUBDELIM . ':]+|' . self::REGEXP_PART_ENCODED . '/'; - return self::encode($component, $pattern); - } - /** - * Encode Path. - * - * Generic delimiters ":", "@", and "/" MUST NOT be encoded - */ - public static function encodePath(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); - } - /** - * Encode Query or Fragment. - * - * Generic delimiters ":", "@", "?", and "/" MUST NOT be encoded - */ - public static function encodeQueryOrFragment(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 . '/'; - $encodeMatches = static fn(array $matches): string => match (1) { - preg_match('/[^' . self::REGEXP_PART_UNRESERVED . ']/', rawurldecode($matches[0])) => rawurlencode($matches[0]), - default => $matches[0], - }; - $component = self::filterComponent($component); - return match (\true) { - !\is_scalar($component) => throw new SyntaxError(\sprintf('A pair key/value must be a scalar value `%s` given.', \gettype($component))), - 1 === preg_match(self::REGEXP_CHARS_INVALID, $component) => rawurlencode($component), - 1 === preg_match($pattern, $component) => (string) preg_replace_callback($pattern, $encodeMatches(...), $component), - default => $component, - }; - } - /** - * Decodes the URI component without decoding the unreserved characters which are already encoded. - */ - public static function decodePartial(Stringable|string|int|null $component) : ?string - { - $decodeMatches = static fn(array $matches): string => match (1) { - preg_match(self::REGEXP_CHARS_PREVENTS_DECODING, $matches[0]) => strtoupper($matches[0]), - default => rawurldecode($matches[0]), - }; - return self::decode($component, $decodeMatches); - } - /** - * Decodes all the URI component characters. - */ - public static function decodeAll(Stringable|string|int|null $component) : ?string - { - $decodeMatches = static fn(array $matches): string => rawurldecode($matches[0]); - return self::decode($component, $decodeMatches); - } - private static function filterComponent(mixed $component) : ?string - { - return match (\true) { - \true === $component => '1', - \false === $component => '0', - $component instanceof UriComponentInterface => $component->value(), - $component instanceof Stringable, \is_scalar($component) => (string) $component, - null === $component => null, - default => throw new SyntaxError(\sprintf('The component must be a scalar value `%s` given.', \gettype($component))), - }; - } - private static function encode(Stringable|string|int|bool|null $component, string $pattern) : ?string - { - $component = self::filterComponent($component); - $encodeMatches = static fn(array $matches): string => match (1) { - preg_match('/[^' . self::REGEXP_PART_UNRESERVED . ']/', rawurldecode($matches[0])) => rawurlencode($matches[0]), - default => $matches[0], - }; - return match (\true) { - null === $component, '' === $component => $component, - default => (string) preg_replace_callback($pattern, $encodeMatches(...), $component), - }; - } - /** - * Decodes all the URI component characters. - */ - private static function decode(Stringable|string|int|null $component, Closure $decodeMatches) : ?string - { - $component = self::filterComponent($component); - return match (\true) { - null === $component => null, - 1 === preg_match(self::REGEXP_CHARS_INVALID, $component) => throw new SyntaxError('Invalid component string: ' . $component . '.'), - 1 === preg_match(self::REGEXP_CHARS_ENCODED, $component) => preg_replace_callback(self::REGEXP_CHARS_ENCODED, $decodeMatches(...), $component), - default => $component, - }; - } -} diff --git a/dependencies/league/uri-interfaces/Exceptions/ConversionFailed.php b/dependencies/league/uri-interfaces/Exceptions/ConversionFailed.php deleted file mode 100644 index 1ced7cc..0000000 --- a/dependencies/league/uri-interfaces/Exceptions/ConversionFailed.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Exceptions; - -use WP_Ultimo\Dependencies\League\Uri\Idna\Error; -use WP_Ultimo\Dependencies\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(Stringable|string $host, Result $result) : self - { - $reasons = \array_map(fn(Error $error): string => $error->description(), $result->errors()); - 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/dependencies/league/uri-interfaces/Exceptions/MissingFeature.php b/dependencies/league/uri-interfaces/Exceptions/MissingFeature.php deleted file mode 100644 index 8b0c890..0000000 --- a/dependencies/league/uri-interfaces/Exceptions/MissingFeature.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Exceptions; - -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriException; -use RuntimeException; -class MissingFeature extends RuntimeException implements UriException -{ -} diff --git a/dependencies/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php b/dependencies/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php deleted file mode 100644 index ea57d82..0000000 --- a/dependencies/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Exceptions; - -class OffsetOutOfBounds extends SyntaxError -{ -} diff --git a/dependencies/league/uri-interfaces/Exceptions/SyntaxError.php b/dependencies/league/uri-interfaces/Exceptions/SyntaxError.php deleted file mode 100644 index 0af4a1a..0000000 --- a/dependencies/league/uri-interfaces/Exceptions/SyntaxError.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Exceptions; - -use InvalidArgumentException; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriException; -class SyntaxError extends InvalidArgumentException implements UriException -{ -} diff --git a/dependencies/league/uri-interfaces/FeatureDetection.php b/dependencies/league/uri-interfaces/FeatureDetection.php deleted file mode 100644 index 313b6ef..0000000 --- a/dependencies/league/uri-interfaces/FeatureDetection.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use finfo; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\League\Uri\IPv4\Calculator; -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); - if (!$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'); - if (!$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') || \function_exists('bcadd') || 4 < PHP_INT_SIZE; - if (!$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 implmentation.'); - } - } -} diff --git a/dependencies/league/uri-interfaces/IPv4/BCMathCalculator.php b/dependencies/league/uri-interfaces/IPv4/BCMathCalculator.php deleted file mode 100644 index 418d1b2..0000000 --- a/dependencies/league/uri-interfaces/IPv4/BCMathCalculator.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\IPv4; - -use function bcadd; -use function bccomp; -use function bcdiv; -use function bcmod; -use function bcmul; -use function bcpow; -use function bcsub; -use function str_split; -final class BCMathCalculator implements Calculator -{ - private const SCALE = 0; - private const CONVERSION_TABLE = ['0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 'a' => '10', 'b' => '11', 'c' => '12', 'd' => '13', 'e' => '14', 'f' => '15']; - public function baseConvert(mixed $value, int $base) : string - { - $value = (string) $value; - if (10 === $base) { - return $value; - } - $base = (string) $base; - $decimal = '0'; - foreach (str_split($value) as $char) { - $decimal = bcadd($this->multiply($decimal, $base), self::CONVERSION_TABLE[$char], self::SCALE); - } - return $decimal; - } - public function pow(mixed $value, int $exponent) : string - { - return bcpow((string) $value, (string) $exponent, self::SCALE); - } - public function compare(mixed $value1, $value2) : int - { - return bccomp((string) $value1, (string) $value2, self::SCALE); - } - public function multiply(mixed $value1, $value2) : string - { - return bcmul((string) $value1, (string) $value2, self::SCALE); - } - public function div(mixed $value, mixed $base) : string - { - return bcdiv((string) $value, (string) $base, self::SCALE); - } - public function mod(mixed $value, mixed $base) : string - { - return bcmod((string) $value, (string) $base, self::SCALE); - } - public function add(mixed $value1, mixed $value2) : string - { - return bcadd((string) $value1, (string) $value2, self::SCALE); - } - public function sub(mixed $value1, mixed $value2) : string - { - return bcsub((string) $value1, (string) $value2, self::SCALE); - } -} diff --git a/dependencies/league/uri-interfaces/IPv4/Calculator.php b/dependencies/league/uri-interfaces/IPv4/Calculator.php deleted file mode 100644 index 6d2361f..0000000 --- a/dependencies/league/uri-interfaces/IPv4/Calculator.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\IPv4; - -interface Calculator -{ - /** - * Add numbers. - * - * @param mixed $value1 a number that will be added to $value2 - * @param mixed $value2 a number that will be added to $value1 - * - * @return mixed the addition result - */ - public function add(mixed $value1, mixed $value2); - /** - * Subtract one number from another. - * - * @param mixed $value1 a number that will be subtracted of $value2 - * @param mixed $value2 a number that will be subtracted to $value1 - * - * @return mixed the subtraction result - */ - public function sub(mixed $value1, mixed $value2); - /** - * Multiply numbers. - * - * @param mixed $value1 a number that will be multiplied by $value2 - * @param mixed $value2 a number that will be multiplied by $value1 - * - * @return mixed the multiplication result - */ - public function multiply(mixed $value1, mixed $value2); - /** - * Divide numbers. - * - * @param mixed $value The number being divided. - * @param mixed $base The number that $value is being divided by. - * - * @return mixed the result of the division - */ - public function div(mixed $value, mixed $base); - /** - * Raise an number to the power of exponent. - * - * @param mixed $value scalar, the base to use - * - * @return mixed the value raised to the power of exp. - */ - public function pow(mixed $value, int $exponent); - /** - * Returns the int point remainder (modulo) of the division of the arguments. - * - * @param mixed $value The dividend - * @param mixed $base The divisor - * - * @return mixed the remainder - */ - public function mod(mixed $value, mixed $base); - /** - * Number comparison. - * - * @param mixed $value1 the first value - * @param mixed $value2 the second value - * - * @return int Returns < 0 if value1 is less than value2; > 0 if value1 is greater than value2, and 0 if they are equal. - */ - public function compare(mixed $value1, mixed $value2) : int; - /** - * Get the decimal integer value of a variable. - * - * @param mixed $value The scalar value being converted to an integer - * - * @return mixed the integer value - */ - public function baseConvert(mixed $value, int $base); -} diff --git a/dependencies/league/uri-interfaces/IPv4/Converter.php b/dependencies/league/uri-interfaces/IPv4/Converter.php deleted file mode 100644 index 537970d..0000000 --- a/dependencies/league/uri-interfaces/IPv4/Converter.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\IPv4; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\League\Uri\FeatureDetection; -use Stringable; -use function array_pop; -use function count; -use function explode; -use function extension_loaded; -use function ltrim; -use function preg_match; -use function str_ends_with; -use function substr; -final class Converter -{ - private const REGEXP_IPV4_HOST = '/ - (?(DEFINE) # . is missing as it is used to separate labels - (?0x[[:xdigit:]]*) - (?0[0-7]*) - (?\\d+) - (?(?:(?&hexadecimal)|(?&octal)|(?&decimal))*) - ) - ^(?:(?&ipv4_part)\\.){0,3}(?&ipv4_part)\\.?$ - /x'; - private const REGEXP_IPV4_NUMBER_PER_BASE = ['/^0x(?[[:xdigit:]]*)$/' => 16, '/^0(?[0-7]*)$/' => 8, '/^(?\\d+)$/' => 10]; - private readonly mixed $maxIPv4Number; - public function __construct(private readonly Calculator $calculator) - { - $this->maxIPv4Number = $calculator->sub($calculator->pow(2, 32), 1); - } - /** - * Returns an instance using a GMP calculator. - */ - public static function fromGMP() : self - { - return new self(new GMPCalculator()); - } - /** - * Returns an instance using a Bcmath calculator. - */ - public static function fromBCMath() : self - { - return new self(new BCMathCalculator()); - } - /** - * Returns an instance using a PHP native calculator (requires 64bits PHP). - */ - public static function fromNative() : self - { - return new self(new NativeCalculator()); - } - /** - * Returns an instance using a detected calculator depending on the PHP environment. - * - * @throws MissingFeature If no Calculator implementing object can be used on the platform - * - * @codeCoverageIgnore - */ - public static function fromEnvironment() : self - { - FeatureDetection::supportsIPv4Conversion(); - return match (\true) { - extension_loaded('gmp') => self::fromGMP(), - function_exists('bcadd') => self::fromBCMath(), - default => self::fromNative(), - }; - } - public function isIpv4(Stringable|string|null $host) : bool - { - return null !== $this->toDecimal($host); - } - public function toOctal(Stringable|string|null $host) : ?string - { - $host = $this->toDecimal($host); - return match (null) { - $host => null, - default => \implode('.', \array_map(fn($value) => \str_pad(\decoct((int) $value), 4, '0', \STR_PAD_LEFT), explode('.', $host))), - }; - } - public function toHexadecimal(Stringable|string|null $host) : ?string - { - $host = $this->toDecimal($host); - return match (null) { - $host => null, - default => '0x' . \implode('', \array_map(fn($value) => \dechex((int) $value), explode('.', $host))), - }; - } - /** - * Tries to convert a IPv4 hexadecimal or a IPv4 octal notation into a IPv4 dot-decimal notation if possible - * otherwise returns null. - * - * @see https://url.spec.whatwg.org/#concept-ipv4-parser - */ - public function toDecimal(Stringable|string|null $host) : ?string - { - $host = (string) $host; - if (1 !== preg_match(self::REGEXP_IPV4_HOST, $host)) { - return null; - } - if (str_ends_with($host, '.')) { - $host = substr($host, 0, -1); - } - $numbers = []; - foreach (explode('.', $host) as $label) { - $number = $this->labelToNumber($label); - if (null === $number) { - return null; - } - $numbers[] = $number; - } - $ipv4 = array_pop($numbers); - $max = $this->calculator->pow(256, 6 - count($numbers)); - if ($this->calculator->compare($ipv4, $max) > 0) { - return null; - } - foreach ($numbers as $offset => $number) { - if ($this->calculator->compare($number, 255) > 0) { - return null; - } - $ipv4 = $this->calculator->add($ipv4, $this->calculator->multiply($number, $this->calculator->pow(256, 3 - $offset))); - } - return $this->long2Ip($ipv4); - } - /** - * Converts a domain label into a IPv4 integer part. - * - * @see https://url.spec.whatwg.org/#ipv4-number-parser - * - * @return mixed returns null if it cannot correctly convert the label - */ - private function labelToNumber(string $label) : mixed - { - foreach (self::REGEXP_IPV4_NUMBER_PER_BASE as $regexp => $base) { - if (1 !== preg_match($regexp, $label, $matches)) { - continue; - } - $number = ltrim($matches['number'], '0'); - if ('' === $number) { - return 0; - } - $number = $this->calculator->baseConvert($number, $base); - if (0 <= $this->calculator->compare($number, 0) && 0 >= $this->calculator->compare($number, $this->maxIPv4Number)) { - return $number; - } - } - return null; - } - /** - * Generates the dot-decimal notation for IPv4. - * - * @see https://url.spec.whatwg.org/#concept-ipv4-parser - * - * @param mixed $ipAddress the number representation of the IPV4address - */ - private function long2Ip(mixed $ipAddress) : string - { - $output = ''; - for ($offset = 0; $offset < 4; $offset++) { - $output = $this->calculator->mod($ipAddress, 256) . $output; - if ($offset < 3) { - $output = '.' . $output; - } - $ipAddress = $this->calculator->div($ipAddress, 256); - } - return $output; - } -} diff --git a/dependencies/league/uri-interfaces/IPv4/GMPCalculator.php b/dependencies/league/uri-interfaces/IPv4/GMPCalculator.php deleted file mode 100644 index b8020f1..0000000 --- a/dependencies/league/uri-interfaces/IPv4/GMPCalculator.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\IPv4; - -use GMP; -use function gmp_add; -use function gmp_cmp; -use function gmp_div_q; -use function gmp_init; -use function gmp_mod; -use function gmp_mul; -use function gmp_pow; -use function gmp_sub; -use const GMP_ROUND_MINUSINF; -final class GMPCalculator implements Calculator -{ - public function baseConvert(mixed $value, int $base) : GMP - { - return gmp_init($value, $base); - } - public function pow(mixed $value, int $exponent) : GMP - { - return gmp_pow($value, $exponent); - } - public function compare(mixed $value1, mixed $value2) : int - { - return gmp_cmp($value1, $value2); - } - public function multiply(mixed $value1, mixed $value2) : GMP - { - return gmp_mul($value1, $value2); - } - public function div(mixed $value, mixed $base) : GMP - { - return gmp_div_q($value, $base, GMP_ROUND_MINUSINF); - } - public function mod(mixed $value, mixed $base) : GMP - { - return gmp_mod($value, $base); - } - public function add(mixed $value1, mixed $value2) : GMP - { - return gmp_add($value1, $value2); - } - public function sub(mixed $value1, mixed $value2) : GMP - { - return gmp_sub($value1, $value2); - } -} diff --git a/dependencies/league/uri-interfaces/IPv4/NativeCalculator.php b/dependencies/league/uri-interfaces/IPv4/NativeCalculator.php deleted file mode 100644 index 511a7e3..0000000 --- a/dependencies/league/uri-interfaces/IPv4/NativeCalculator.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\IPv4; - -use function floor; -use function intval; -final class NativeCalculator implements Calculator -{ - public function baseConvert(mixed $value, int $base) : int - { - return intval((string) $value, $base); - } - public function pow(mixed $value, int $exponent) - { - return $value ** $exponent; - } - public function compare(mixed $value1, mixed $value2) : int - { - return $value1 <=> $value2; - } - public function multiply(mixed $value1, mixed $value2) : int - { - return $value1 * $value2; - } - public function div(mixed $value, mixed $base) : int - { - return (int) floor($value / $base); - } - public function mod(mixed $value, mixed $base) : int - { - return $value % $base; - } - public function add(mixed $value1, mixed $value2) : int - { - return $value1 + $value2; - } - public function sub(mixed $value1, mixed $value2) : int - { - return $value1 - $value2; - } -} diff --git a/dependencies/league/uri-interfaces/Idna/Converter.php b/dependencies/league/uri-interfaces/Idna/Converter.php deleted file mode 100644 index 20eadb3..0000000 --- a/dependencies/league/uri-interfaces/Idna/Converter.php +++ /dev/null @@ -1,177 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Idna; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\ConversionFailed; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\FeatureDetection; -use Stringable; -use function idn_to_ascii; -use function idn_to_utf8; -use function rawurldecode; -use const INTL_IDNA_VARIANT_UTS46; -/** - * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html - */ -final class Converter -{ - private const REGEXP_IDNA_PATTERN = '/[^\\x20-\\x7f]/'; - private const MAX_DOMAIN_LENGTH = 253; - private const MAX_LABEL_LENGTH = 63; - /** - * 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'; - /** - * Converts the input to its IDNA ASCII form or throw on failure. - * - * @see Converter::toAscii() - * - * @throws SyntaxError if the string cannot be converted to UNICODE using IDN UTS46 algorithm - * @throws ConversionFailed if the conversion returns error - */ - public static function toAsciiOrFail(Stringable|string $domain, Option|int|null $options = null) : string - { - $result = self::toAscii($domain, $options); - return match (\true) { - $result->hasErrors() => throw ConversionFailed::dueToIdnError($domain, $result), - default => $result->domain(), - }; - } - /** - * Converts the input to its IDNA ASCII form. - * - * This method returns the string converted to IDN ASCII form - * - * @throws SyntaxError if the string cannot be converted to ASCII using IDN UTS46 algorithm - */ - public static function toAscii(Stringable|string $domain, Option|int|null $options = null) : Result - { - $domain = rawurldecode((string) $domain); - if (1 === \preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { - FeatureDetection::supportsIdn(); - $flags = match (\true) { - null === $options => Option::forIDNA2008Ascii(), - $options instanceof Option => $options, - default => Option::new($options), - }; - idn_to_ascii($domain, $flags->toBytes(), INTL_IDNA_VARIANT_UTS46, $idnaInfo); - if ([] === $idnaInfo) { - return Result::fromIntl(['result' => \strtolower($domain), 'isTransitionalDifferent' => \false, 'errors' => self::validateDomainAndLabelLength($domain)]); - } - return Result::fromIntl($idnaInfo); - } - $error = Error::NONE->value; - if (1 !== \preg_match(self::REGEXP_REGISTERED_NAME, $domain)) { - $error |= Error::DISALLOWED->value; - } - return Result::fromIntl(['result' => \strtolower($domain), 'isTransitionalDifferent' => \false, 'errors' => self::validateDomainAndLabelLength($domain) | $error]); - } - /** - * Converts the input to its IDNA UNICODE form or throw on failure. - * - * @see Converter::toUnicode() - * - * @throws ConversionFailed if the conversion returns error - */ - public static function toUnicodeOrFail(Stringable|string $domain, Option|int|null $options = null) : string - { - $result = self::toUnicode($domain, $options); - return match (\true) { - $result->hasErrors() => throw ConversionFailed::dueToIdnError($domain, $result), - default => $result->domain(), - }; - } - /** - * Converts the input to its IDNA UNICODE form. - * - * This method returns the string converted to IDN UNICODE form - * - * @throws SyntaxError if the string cannot be converted to UNICODE using IDN UTS46 algorithm - */ - public static function toUnicode(Stringable|string $domain, Option|int|null $options = null) : Result - { - $domain = rawurldecode((string) $domain); - if (\false === \stripos($domain, 'xn--')) { - return Result::fromIntl(['result' => $domain, 'isTransitionalDifferent' => \false, 'errors' => Error::NONE->value]); - } - FeatureDetection::supportsIdn(); - $flags = match (\true) { - null === $options => Option::forIDNA2008Unicode(), - $options instanceof Option => $options, - default => Option::new($options), - }; - idn_to_utf8($domain, $flags->toBytes(), INTL_IDNA_VARIANT_UTS46, $idnaInfo); - if ([] === $idnaInfo) { - return Result::fromIntl(['result' => $domain, 'isTransitionalDifferent' => \false, 'errors' => Error::NONE->value]); - } - return Result::fromIntl($idnaInfo); - } - /** - * Tells whether the submitted host is a valid IDN regardless of its format. - * - * Returns false if the host is invalid or if its conversion yield the same result - */ - public static function isIdn(Stringable|string|null $domain) : bool - { - $domain = \strtolower(rawurldecode((string) $domain)); - $result = match (1) { - \preg_match(self::REGEXP_IDNA_PATTERN, $domain) => self::toAscii($domain), - default => self::toUnicode($domain), - }; - return match (\true) { - $result->hasErrors() => \false, - default => $result->domain() !== $domain, - }; - } - /** - * Adapted from https://github.com/TRowbotham/idna. - * - * @see https://github.com/TRowbotham/idna/blob/master/src/Idna.php#L236 - */ - private static function validateDomainAndLabelLength(string $domain) : int - { - $error = Error::NONE->value; - $labels = \explode('.', $domain); - $maxDomainSize = self::MAX_DOMAIN_LENGTH; - $length = \count($labels); - // If the last label is empty, and it is not the first label, then it is the root label. - // Increase the max size by 1, making it 254, to account for the root label's "." - // delimiter. This also means we don't need to check the last label's length for being too - // long. - if ($length > 1 && '' === $labels[$length - 1]) { - ++$maxDomainSize; - \array_pop($labels); - } - if (\strlen($domain) > $maxDomainSize) { - $error |= Error::DOMAIN_NAME_TOO_LONG->value; - } - foreach ($labels as $label) { - if (\strlen($label) > self::MAX_LABEL_LENGTH) { - $error |= Error::LABEL_TOO_LONG->value; - break; - } - } - return $error; - } -} diff --git a/dependencies/league/uri-interfaces/Idna/Error.php b/dependencies/league/uri-interfaces/Idna/Error.php deleted file mode 100644 index 44de604..0000000 --- a/dependencies/league/uri-interfaces/Idna/Error.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\League\Uri\Idna; - -enum Error : int -{ - case NONE = 0; - case EMPTY_LABEL = 1; - case LABEL_TOO_LONG = 2; - case DOMAIN_NAME_TOO_LONG = 4; - case LEADING_HYPHEN = 8; - case TRAILING_HYPHEN = 0x10; - case HYPHEN_3_4 = 0x20; - case LEADING_COMBINING_MARK = 0x40; - case DISALLOWED = 0x80; - case PUNYCODE = 0x100; - case LABEL_HAS_DOT = 0x200; - case INVALID_ACE_LABEL = 0x400; - case BIDI = 0x800; - case CONTEXTJ = 0x1000; - case CONTEXTO_PUNCTUATION = 0x2000; - case CONTEXTO_DIGITS = 0x4000; - public function description() : string - { - return match ($this) { - self::NONE => 'No error has occurred', - self::EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', - self::LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - self::DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - self::LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - self::TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - self::HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - self::LEADING_COMBINING_MARK => 'a label starts with a combining mark', - self::DISALLOWED => 'a label or domain name contains disallowed characters', - self::PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - self::LABEL_HAS_DOT => 'a label contains a dot=full stop', - self::INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - self::BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - self::CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - self::CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', - self::CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', - }; - } - public static function filterByErrorBytes(int $errors) : array - { - return \array_values(\array_filter(self::cases(), fn(self $error): bool => 0 !== ($error->value & $errors))); - } -} diff --git a/dependencies/league/uri-interfaces/Idna/Option.php b/dependencies/league/uri-interfaces/Idna/Option.php deleted file mode 100644 index c72b5e4..0000000 --- a/dependencies/league/uri-interfaces/Idna/Option.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Idna; - -use ReflectionClass; -use ReflectionClassConstant; -/** - * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html - */ -final class Option -{ - private const DEFAULT = 0; - private const ALLOW_UNASSIGNED = 1; - private const USE_STD3_RULES = 2; - private const CHECK_BIDI = 4; - private const CHECK_CONTEXTJ = 8; - private const NONTRANSITIONAL_TO_ASCII = 0x10; - private const NONTRANSITIONAL_TO_UNICODE = 0x20; - private const CHECK_CONTEXTO = 0x40; - private function __construct(private readonly int $value) - { - } - private static function cases() : array - { - static $assoc; - if (null === $assoc) { - $assoc = []; - $fooClass = new ReflectionClass(self::class); - foreach ($fooClass->getConstants(ReflectionClassConstant::IS_PRIVATE) as $name => $value) { - $assoc[$name] = $value; - } - } - return $assoc; - } - public static function new(int $bytes = self::DEFAULT) : self - { - return new self(\array_reduce(self::cases(), fn(int $value, int $option) => 0 !== ($option & $bytes) ? $value | $option : $value, self::DEFAULT)); - } - public static function forIDNA2008Ascii() : self - { - return self::new()->nonTransitionalToAscii()->checkBidi()->useSTD3Rules()->checkContextJ(); - } - public static function forIDNA2008Unicode() : self - { - return self::new()->nonTransitionalToUnicode()->checkBidi()->useSTD3Rules()->checkContextJ(); - } - public function toBytes() : int - { - return $this->value; - } - /** array */ - public function list() : array - { - return \array_keys(\array_filter(self::cases(), fn(int $value) => 0 !== ($value & $this->value))); - } - public function allowUnassigned() : self - { - return $this->add(self::ALLOW_UNASSIGNED); - } - public function disallowUnassigned() : self - { - return $this->remove(self::ALLOW_UNASSIGNED); - } - public function useSTD3Rules() : self - { - return $this->add(self::USE_STD3_RULES); - } - public function prohibitSTD3Rules() : self - { - return $this->remove(self::USE_STD3_RULES); - } - public function checkBidi() : self - { - return $this->add(self::CHECK_BIDI); - } - public function ignoreBidi() : self - { - return $this->remove(self::CHECK_BIDI); - } - public function checkContextJ() : self - { - return $this->add(self::CHECK_CONTEXTJ); - } - public function ignoreContextJ() : self - { - return $this->remove(self::CHECK_CONTEXTJ); - } - public function checkContextO() : self - { - return $this->add(self::CHECK_CONTEXTO); - } - public function ignoreContextO() : self - { - return $this->remove(self::CHECK_CONTEXTO); - } - public function nonTransitionalToAscii() : self - { - return $this->add(self::NONTRANSITIONAL_TO_ASCII); - } - public function transitionalToAscii() : self - { - return $this->remove(self::NONTRANSITIONAL_TO_ASCII); - } - public function nonTransitionalToUnicode() : self - { - return $this->add(self::NONTRANSITIONAL_TO_UNICODE); - } - public function transitionalToUnicode() : self - { - return $this->remove(self::NONTRANSITIONAL_TO_UNICODE); - } - public function add(Option|int|null $option = null) : self - { - return match (\true) { - null === $option => $this, - $option instanceof self => self::new($this->value | $option->value), - default => self::new($this->value | $option), - }; - } - public function remove(Option|int|null $option = null) : self - { - return match (\true) { - null === $option => $this, - $option instanceof self => self::new($this->value & ~$option->value), - default => self::new($this->value & ~$option), - }; - } -} diff --git a/dependencies/league/uri-interfaces/Idna/Result.php b/dependencies/league/uri-interfaces/Idna/Result.php deleted file mode 100644 index c2a3eac..0000000 --- a/dependencies/league/uri-interfaces/Idna/Result.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\Idna; - -/** - * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html - */ -final class Result -{ - private function __construct( - private readonly string $domain, - private readonly bool $isTransitionalDifferent, - /** @var array */ - private readonly array $errors - ) - { - } - /** - * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos - */ - public static function fromIntl(array $infos) : self - { - return new self($infos['result'], $infos['isTransitionalDifferent'], Error::filterByErrorBytes($infos['errors'])); - } - public function domain() : string - { - return $this->domain; - } - public function isTransitionalDifferent() : bool - { - return $this->isTransitionalDifferent; - } - /** - * @return array - */ - public function errors() : array - { - return $this->errors; - } - public function hasErrors() : bool - { - return [] !== $this->errors; - } - public function hasError(Error $error) : bool - { - return \in_array($error, $this->errors, \true); - } -} diff --git a/dependencies/league/uri-interfaces/KeyValuePair/Converter.php b/dependencies/league/uri-interfaces/KeyValuePair/Converter.php deleted file mode 100644 index d5f7e06..0000000 --- a/dependencies/league/uri-interfaces/KeyValuePair/Converter.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\KeyValuePair; - -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriComponentInterface; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use Stringable; -use function array_combine; -use function explode; -use function implode; -use function is_float; -use function is_int; -use function is_string; -use function json_encode; -use function preg_match; -use function str_replace; -use const JSON_PRESERVE_ZERO_FRACTION; -use const PHP_QUERY_RFC1738; -use const PHP_QUERY_RFC3986; -final class Converter -{ - private const REGEXP_INVALID_CHARS = '/[\\x00-\\x1f\\x7f]/'; - /** @var non-empty-string */ - private readonly string $separator; - /** - * @param array $fromRfc3986 contains all the RFC3986 encoded characters to be converted - * @param array $toEncoding contains all the expected encoded characters - */ - private function __construct(string $separator, private readonly array $fromRfc3986 = [], private readonly array $toEncoding = []) - { - if ('' === $separator) { - throw new SyntaxError('The separator character must be a non empty string.'); - } - $this->separator = $separator; - } - /** - * @param non-empty-string $separator - */ - public static function new(string $separator) : self - { - return new self($separator); - } - /** - * @param non-empty-string $separator - */ - public static function fromRFC3986(string $separator = '&') : self - { - return self::new($separator); - } - /** - * @param non-empty-string $separator - */ - public static function fromRFC1738(string $separator = '&') : self - { - return self::new($separator)->withEncodingMap(['%20' => '+']); - } - /** - * @param non-empty-string $separator - * - * @see https://url.spec.whatwg.org/#application/x-www-form-urlencoded - */ - public static function fromFormData(string $separator = '&') : self - { - return self::new($separator)->withEncodingMap(['%20' => '+', '%2A' => '*']); - } - public static function fromEncodingType(int $encType) : self - { - return match ($encType) { - PHP_QUERY_RFC3986 => self::fromRFC3986(), - PHP_QUERY_RFC1738 => self::fromRFC1738(), - default => throw new SyntaxError('Unknown or Unsupported encoding.'), - }; - } - /** - * @return non-empty-string - */ - public function separator() : string - { - return $this->separator; - } - /** - * @return array - */ - public function encodingMap() : array - { - return array_combine($this->fromRfc3986, $this->toEncoding); - } - /** - * @return array> - */ - public function toPairs(Stringable|string|int|float|bool|null $value) : array - { - $value = match (\true) { - $value instanceof UriComponentInterface => $value->value(), - $value instanceof Stringable, is_int($value) => (string) $value, - \false === $value => '0', - \true === $value => '1', - default => $value, - }; - if (null === $value) { - return []; - } - $value = match (1) { - preg_match(self::REGEXP_INVALID_CHARS, (string) $value) => throw new SyntaxError('Invalid query string: `' . $value . '`.'), - default => str_replace($this->toEncoding, $this->fromRfc3986, (string) $value), - }; - return \array_map(fn(string $pair): array => explode('=', $pair, 2) + [1 => null], explode($this->separator, $value)); - } - private static function vString(Stringable|string|bool|int|float|null $value) : ?string - { - return match (\true) { - $value => '1', - \false === $value => '0', - null === $value => null, - is_float($value) => (string) json_encode($value, JSON_PRESERVE_ZERO_FRACTION), - default => (string) $value, - }; - } - /** - * @param iterable $pairs - */ - public function toValue(iterable $pairs) : ?string - { - $filteredPairs = []; - foreach ($pairs as $pair) { - $filteredPairs[] = match (\true) { - !is_string($pair[0]) => throw new SyntaxError('the pair key MUST be a string;, `' . \gettype($pair[0]) . '` given.'), - null === $pair[1] => self::vString($pair[0]), - default => self::vString($pair[0]) . '=' . self::vString($pair[1]), - }; - } - return match ([]) { - $filteredPairs => null, - default => str_replace($this->fromRfc3986, $this->toEncoding, implode($this->separator, $filteredPairs)), - }; - } - /** - * @param non-empty-string $separator - */ - public function withSeparator(string $separator) : self - { - return match ($this->separator) { - $separator => $this, - default => new self($separator, $this->fromRfc3986, $this->toEncoding), - }; - } - /** - * Sets the conversion map. - * - * Each key from the iterable structure represents the RFC3986 encoded characters as string, - * while each value represents the expected output encoded characters - */ - public function withEncodingMap(iterable $encodingMap) : self - { - $fromRfc3986 = []; - $toEncoding = []; - foreach ($encodingMap as $from => $to) { - [$fromRfc3986[], $toEncoding[]] = match (\true) { - !is_string($from) => throw new SyntaxError('The encoding output must be a string; `' . \gettype($from) . '` given.'), - $to instanceof Stringable, is_string($to) => [$from, (string) $to], - default => throw new SyntaxError('The encoding output must be a string; `' . \gettype($to) . '` given.'), - }; - } - return match (\true) { - $fromRfc3986 !== $this->fromRfc3986, $toEncoding !== $this->toEncoding => new self($this->separator, $fromRfc3986, $toEncoding), - default => $this, - }; - } -} diff --git a/dependencies/league/uri-interfaces/QueryString.php b/dependencies/league/uri-interfaces/QueryString.php deleted file mode 100644 index 7b8b8ba..0000000 --- a/dependencies/league/uri-interfaces/QueryString.php +++ /dev/null @@ -1,231 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\KeyValuePair\Converter; -use Stringable; -use function array_key_exists; -use function array_keys; -use function is_array; -use function rawurldecode; -use function strpos; -use function substr; -use const PHP_QUERY_RFC3986; -/** - * A class to parse the URI query string. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.4 - */ -final class QueryString -{ - private const PAIR_VALUE_DECODED = 1; - private const PAIR_VALUE_PRESERVED = 2; - /** - * @codeCoverageIgnore - */ - private function __construct() - { - } - /** - * Build a query string from a list of pairs. - * - * @see QueryString::buildFromPairs() - * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 - * - * @param iterable $pairs - * @param non-empty-string $separator - * - * @throws SyntaxError If the encoding type is invalid - * @throws SyntaxError If a pair is invalid - */ - public static function build(iterable $pairs, string $separator = '&', int $encType = PHP_QUERY_RFC3986) : ?string - { - return self::buildFromPairs($pairs, Converter::fromEncodingType($encType)->withSeparator($separator)); - } - /** - * Build a query string from a list of pairs. - * - * The method expects the return value from Query::parse to build - * a valid query string. This method differs from PHP http_build_query as - * it does not modify parameters keys. - * - * If a reserved character is found in a URI component and - * no delimiting role is known for that character, then it must be - * interpreted as representing the data octet corresponding to that - * character's encoding in US-ASCII. - * - * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2 - * - * @param iterable $pairs - * - * @throws SyntaxError If the encoding type is invalid - * @throws SyntaxError If a pair is invalid - */ - public static function buildFromPairs(iterable $pairs, Converter $converter = null) : ?string - { - $keyValuePairs = []; - foreach ($pairs as $pair) { - if (!is_array($pair) || [0, 1] !== array_keys($pair)) { - throw new SyntaxError('A pair must be a sequential array starting at `0` and containing two elements.'); - } - $keyValuePairs[] = [(string) Encoder::encodeQueryKeyValue($pair[0]), match (null) { - $pair[1] => null, - default => Encoder::encodeQueryKeyValue($pair[1]), - }]; - } - return ($converter ?? Converter::fromRFC3986())->toValue($keyValuePairs); - } - /** - * Parses the query string like parse_str without mangling the results. - * - * @see QueryString::extractFromValue() - * @see http://php.net/parse_str - * @see https://wiki.php.net/rfc/on_demand_name_mangling - * - * @param non-empty-string $separator - * - * @throws SyntaxError - */ - public static function extract(Stringable|string|bool|null $query, string $separator = '&', int $encType = PHP_QUERY_RFC3986) : array - { - return self::extractFromValue($query, Converter::fromEncodingType($encType)->withSeparator($separator)); - } - /** - * Parses the query string like parse_str without mangling the results. - * - * 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 - * - * @throws SyntaxError - */ - public static function extractFromValue(Stringable|string|bool|null $query, Converter $converter = null) : array - { - return self::convert(self::decodePairs(($converter ?? Converter::fromRFC3986())->toPairs($query), self::PAIR_VALUE_PRESERVED)); - } - /** - * Parses a query string into a collection of key/value pairs. - * - * @param non-empty-string $separator - * - * @throws SyntaxError - * - * @return array - */ - public static function parse(Stringable|string|bool|null $query, string $separator = '&', int $encType = PHP_QUERY_RFC3986) : array - { - return self::parseFromValue($query, Converter::fromEncodingType($encType)->withSeparator($separator)); - } - /** - * Parses a query string into a collection of key/value pairs. - * - * @throws SyntaxError - * - * @return array - */ - public static function parseFromValue(Stringable|string|bool|null $query, Converter $converter = null) : array - { - return self::decodePairs(($converter ?? Converter::fromRFC3986())->toPairs($query), self::PAIR_VALUE_DECODED); - } - /** - * @param array> $pairs - * - * @return array - */ - private static function decodePairs(array $pairs, int $pairValueState) : array - { - $decodePair = static function (array $pair, int $pairValueState) : array { - [$key, $value] = $pair; - return match ($pairValueState) { - self::PAIR_VALUE_PRESERVED => [(string) Encoder::decodeAll($key), $value], - default => [(string) Encoder::decodeAll($key), Encoder::decodeAll($value)], - }; - }; - return \array_reduce($pairs, fn(array $carry, array $pair) => [...$carry, $decodePair($pair, $pairValueState)], []); - } - /** - * Converts a collection of key/value pairs and returns - * the store PHP variables as elements of an array. - */ - public static function convert(iterable $pairs) : array - { - $returnedValue = []; - foreach ($pairs as $pair) { - $returnedValue = self::extractPhpVariable($returnedValue, $pair); - } - return $returnedValue; - } - /** - * Parses a query pair like parse_str without mangling the results array keys. - * - *
    - *
  • empty name are not saved
  • - *
  • If the value from name is duplicated its corresponding value will be overwritten
  • - *
  • if no "[" is detected the value is added to the return array with the name as index
  • - *
  • if no "]" is detected after detecting a "[" the value is added to the return array with the name as index
  • - *
  • if there's a mismatch in bracket usage the remaining part is dropped
  • - *
  • “.” and “ ” are not converted to “_”
  • - *
  • If there is no “]”, then the first “[” is not converted to becomes an “_”
  • - *
  • no whitespace trimming is done on the key value
  • - *
- * - * @see https://php.net/parse_str - * @see https://wiki.php.net/rfc/on_demand_name_mangling - * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic1.phpt - * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic2.phpt - * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic3.phpt - * @see https://github.com/php/php-src/blob/master/ext/standard/tests/strings/parse_str_basic4.phpt - * - * @param array $data the submitted array - * @param array|string $name the pair key - * @param string $value the pair value - */ - private static function extractPhpVariable(array $data, array|string $name, string $value = '') : array - { - if (is_array($name)) { - [$name, $value] = $name; - $value = rawurldecode((string) $value); - } - if ('' === $name) { - return $data; - } - $leftBracketPosition = strpos($name, '['); - if (\false === $leftBracketPosition) { - $data[$name] = $value; - return $data; - } - $rightBracketPosition = strpos($name, ']', $leftBracketPosition); - if (\false === $rightBracketPosition) { - $data[$name] = $value; - return $data; - } - $key = substr($name, 0, $leftBracketPosition); - if (!array_key_exists($key, $data) || !is_array($data[$key])) { - $data[$key] = []; - } - $index = substr($name, $leftBracketPosition + 1, $rightBracketPosition - $leftBracketPosition - 1); - if ('' === $index) { - $data[$key][] = $value; - return $data; - } - $remaining = substr($name, $rightBracketPosition + 1); - if (!\str_starts_with($remaining, '[') || \false === strpos($remaining, ']', 1)) { - $remaining = ''; - } - $data[$key] = self::extractPhpVariable($data[$key], $index . $remaining, $value); - return $data; - } -} diff --git a/dependencies/league/uri-interfaces/UriString.php b/dependencies/league/uri-interfaces/UriString.php deleted file mode 100644 index b7a355c..0000000 --- a/dependencies/league/uri-interfaces/UriString.php +++ /dev/null @@ -1,367 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\ConversionFailed; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\Idna\Converter; -use Stringable; -use function array_merge; -use function explode; -use function filter_var; -use function inet_pton; -use function preg_match; -use function rawurldecode; -use function sprintf; -use function strpos; -use function substr; -use const FILTER_FLAG_IPV6; -use const FILTER_VALIDATE_IP; -/** - * A class to parse a URI string according to RFC3986. - * - * @link https://tools.ietf.org/html/rfc3986 - * @package League\Uri - * @author Ignace Nyamagana Butera - * @since 6.0.0 - * - * @phpstan-type AuthorityMap array{user:?string, pass:?string, host:?string, port:?int} - * @phpstan-type ComponentMap array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} - * @phpstan-type InputComponentMap array{scheme? : ?string, user? : ?string, pass? : ?string, host? : ?string, port? : ?int, path? : ?string, query? : ?string, fragment? : ?string} - */ -final class UriString -{ - /** - * Default URI component values. - */ - private const URI_COMPONENTS = ['scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null]; - /** - * Simple URI which do not need any parsing. - */ - private const URI_SCHORTCUTS = ['' => [], '#' => ['fragment' => ''], '?' => ['query' => ''], '?#' => ['query' => '', 'fragment' => ''], '/' => ['path' => '/'], '//' => ['host' => '']]; - /** - * Range of invalid characters in URI string. - */ - private const REGEXP_INVALID_URI_CHARS = '/[\\x00-\\x1f\\x7f]/'; - /** - * RFC3986 regular expression URI splitter. - * - * @link https://tools.ietf.org/html/rfc3986#appendix-B - */ - private const REGEXP_URI_PARTS = ',^ - (?(?[^:/?\\#]+):)? # URI scheme component - (?//(?[^/?\\#]*))? # URI authority part - (?[^?\\#]*) # URI path component - (?\\?(?[^\\#]*))? # URI query component - (?\\#(?.*))? # URI fragment component - ,x'; - /** - * URI scheme regular expresssion. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.1 - */ - private const REGEXP_URI_SCHEME = '/^([a-z][a-z\\d+.-]*)?$/i'; - /** - * IPvFuture regular expression. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - */ - private const REGEXP_IP_FUTURE = '/^ - v(?[A-F0-9])+\\. - (?: - (?[a-z0-9_~\\-\\.])| - (?[!$&\'()*+,;=:]) # also include the : character - )+ - $/ix'; - /** - * General registered name regular expression. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - */ - 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'; - /** - * Invalid characters in host regular expression. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - */ - private const REGEXP_INVALID_HOST_CHARS = '/ - [:\\/?#\\[\\]@ ] # gen-delims characters as well as the space character - /ix'; - /** - * Invalid path for URI without scheme and authority regular expression. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.3 - */ - private const REGEXP_INVALID_PATH = ',^(([^/]*):)(.*)?/,'; - /** - * Host and Port splitter regular expression. - */ - private const REGEXP_HOST_PORT = ',^(?\\[.*\\]|[^:]*)(:(?.*))?$,'; - /** - * IDN Host detector regular expression. - */ - private const REGEXP_IDN_PATTERN = '/[^\\x20-\\x7f]/'; - /** - * Only the address block fe80::/10 can have a Zone ID attach to - * let's detect the link local significant 10 bits. - */ - private const ZONE_ID_ADDRESS_BLOCK = "\xfe\x80"; - /** - * Generate a URI string representation from its parsed representation - * returned by League\UriString::parse() or PHP's parse_url. - * - * If you supply your own array, you are responsible for providing - * valid components without their URI delimiters. - * - * @link https://tools.ietf.org/html/rfc3986#section-5.3 - * @link https://tools.ietf.org/html/rfc3986#section-7.5 - * - * @param InputComponentMap $components - */ - public static function build(array $components) : string - { - $uri = $components['path'] ?? ''; - if (isset($components['query'])) { - $uri .= '?' . $components['query']; - } - if (isset($components['fragment'])) { - $uri .= '#' . $components['fragment']; - } - $scheme = null; - if (isset($components['scheme'])) { - $scheme = $components['scheme'] . ':'; - } - $authority = self::buildAuthority($components); - if (null !== $authority) { - $authority = '//' . $authority; - } - return $scheme . $authority . $uri; - } - /** - * Generate a URI authority representation from its parsed representation. - * - * @param InputComponentMap $components - */ - public static function buildAuthority(array $components) : ?string - { - if (!isset($components['host'])) { - return null; - } - $authority = $components['host']; - if (isset($components['port'])) { - $authority .= ':' . $components['port']; - } - if (!isset($components['user'])) { - return $authority; - } - $authority = '@' . $authority; - if (!isset($components['pass'])) { - return $components['user'] . $authority; - } - return $components['user'] . ':' . $components['pass'] . $authority; - } - /** - * Parse a URI string into its components. - * - * This method parses a URI and returns an associative array containing any - * of the various components of the URI that are present. - * - * - * $components = UriString::parse('http://foo@test.example.com:42?query#'); - * var_export($components); - * //will display - * array( - * 'scheme' => 'http', // the URI scheme component - * 'user' => 'foo', // the URI user component - * 'pass' => null, // the URI pass component - * 'host' => 'test.example.com', // the URI host component - * 'port' => 42, // the URI port component - * 'path' => '', // the URI path component - * 'query' => 'query', // the URI query component - * 'fragment' => '', // the URI fragment component - * ); - * - * - * The returned array is similar to PHP's parse_url return value with the following - * differences: - * - *
    - *
  • All components are always 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.
  • - *
  • The path component is never undefined
  • - *
  • The method parses the URI following the RFC3986 rules, but you are still - * required to validate the returned components against its related scheme specific rules.
  • - *
- * - * @link https://tools.ietf.org/html/rfc3986 - * - * @throws SyntaxError if the URI contains invalid characters - * @throws SyntaxError if the URI contains an invalid scheme - * @throws SyntaxError if the URI contains an invalid path - * - * @return ComponentMap - */ - public static function parse(Stringable|string|int $uri) : array - { - $uri = (string) $uri; - if (isset(self::URI_SCHORTCUTS[$uri])) { - /** @var ComponentMap $components */ - $components = array_merge(self::URI_COMPONENTS, self::URI_SCHORTCUTS[$uri]); - return $components; - } - if (1 === preg_match(self::REGEXP_INVALID_URI_CHARS, $uri)) { - throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri)); - } - //if the first character is a known URI delimiter parsing can be simplified - $first_char = $uri[0]; - //The URI is made of the fragment only - if ('#' === $first_char) { - [, $fragment] = explode('#', $uri, 2); - $components = self::URI_COMPONENTS; - $components['fragment'] = $fragment; - return $components; - } - //The URI is made of the query and fragment - if ('?' === $first_char) { - [, $partial] = explode('?', $uri, 2); - [$query, $fragment] = explode('#', $partial, 2) + [1 => null]; - $components = self::URI_COMPONENTS; - $components['query'] = $query; - $components['fragment'] = $fragment; - return $components; - } - //use RFC3986 URI regexp to split the URI - preg_match(self::REGEXP_URI_PARTS, $uri, $parts); - $parts += ['query' => '', 'fragment' => '']; - if (':' === $parts['scheme'] || 1 !== preg_match(self::REGEXP_URI_SCHEME, $parts['scontent'])) { - throw new SyntaxError(sprintf('The uri `%s` contains an invalid scheme', $uri)); - } - if ('' === $parts['scheme'] . $parts['authority'] && 1 === preg_match(self::REGEXP_INVALID_PATH, $parts['path'])) { - throw new SyntaxError(sprintf('The uri `%s` contains an invalid path.', $uri)); - } - /** @var ComponentMap $components */ - $components = array_merge(self::URI_COMPONENTS, '' === $parts['authority'] ? [] : self::parseAuthority($parts['acontent']), ['path' => $parts['path'], 'scheme' => '' === $parts['scheme'] ? null : $parts['scontent'], 'query' => '' === $parts['query'] ? null : $parts['qcontent'], 'fragment' => '' === $parts['fragment'] ? null : $parts['fcontent']]); - return $components; - } - /** - * Parses the URI authority part. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2 - * - * @throws SyntaxError If the port component is invalid - * - * @return AuthorityMap - */ - public static function parseAuthority(?string $authority) : array - { - $components = ['user' => null, 'pass' => null, 'host' => null, 'port' => null]; - if (null === $authority) { - return $components; - } - $components['host'] = ''; - if ('' === $authority) { - return $components; - } - $parts = explode('@', $authority, 2); - if (isset($parts[1])) { - [$components['user'], $components['pass']] = explode(':', $parts[0], 2) + [1 => null]; - } - preg_match(self::REGEXP_HOST_PORT, $parts[1] ?? $parts[0], $matches); - $matches += ['port' => '']; - $components['port'] = self::filterPort($matches['port']); - $components['host'] = self::filterHost($matches['host']); - return $components; - } - /** - * Filter and format the port component. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @throws SyntaxError if the registered name is invalid - */ - private static function filterPort(string $port) : ?int - { - return match (\true) { - '' === $port => null, - 1 === preg_match('/^\\d*$/', $port) => (int) $port, - default => throw new SyntaxError(sprintf('The port `%s` is invalid', $port)), - }; - } - /** - * Returns whether a hostname is valid. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @throws SyntaxError if the registered name is invalid - */ - private static function filterHost(string $host) : string - { - return match (\true) { - '' === $host => '', - '[' !== $host[0] || !\str_ends_with($host, ']') => self::filterRegisteredName($host), - !self::isIpHost(substr($host, 1, -1)) => throw new SyntaxError(sprintf('Host `%s` is invalid : the IP host is malformed', $host)), - default => $host, - }; - } - /** - * Returns whether the host is an IPv4 or a registered named. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @throws SyntaxError if the registered name is invalid - * @throws MissingFeature if IDN support or ICU requirement are not available or met. - * @throws ConversionFailed if the submitted IDN host cannot be converted to a valid ascii form - */ - private static function filterRegisteredName(string $host) : string - { - $formattedHost = rawurldecode($host); - if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $formattedHost)) { - return $host; - } - //to test IDN host non-ascii characters must be present in the host - if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedHost)) { - throw new SyntaxError(sprintf('Host `%s` is invalid: the host is not a valid registered name', $host)); - } - Converter::toAsciiOrFail($host); - return $host; - } - /** - * Validates a IPv6/IPfuture host. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - * @link https://tools.ietf.org/html/rfc6874#section-2 - * @link https://tools.ietf.org/html/rfc6874#section-4 - */ - private static function isIpHost(string $ipHost) : bool - { - if (\false !== filter_var($ipHost, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - return \true; - } - if (1 === preg_match(self::REGEXP_IP_FUTURE, $ipHost, $matches)) { - return !\in_array($matches['version'], ['4', '6'], \true); - } - $pos = strpos($ipHost, '%'); - if (\false === $pos || 1 === preg_match(self::REGEXP_INVALID_HOST_CHARS, rawurldecode(substr($ipHost, $pos)))) { - return \false; - } - $ipHost = substr($ipHost, 0, $pos); - return \false !== filter_var($ipHost, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && \str_starts_with((string) inet_pton($ipHost), self::ZONE_ID_ADDRESS_BLOCK); - } -} diff --git a/dependencies/league/uri-parser/src/Exception.php b/dependencies/league/uri-parser/src/Exception.php deleted file mode 100644 index 2b21f59..0000000 --- a/dependencies/league/uri-parser/src/Exception.php +++ /dev/null @@ -1,84 +0,0 @@ - - * @license https://github.com/thephpleague/uri-parser/blob/master/LICENSE (MIT License) - * @version 1.4.1 - * @link https://uri.thephpleague.com/parser/ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use InvalidArgumentException; -/** - * An exception thrown on parse attempts of invalid URIs. - * - * @see https://tools.ietf.org/html/rfc3986 - * @package League\Uri - * @author Ignace Nyamagana Butera - * @since 0.2.0 - */ -class Exception extends InvalidArgumentException -{ - /** - * Returns a new Instance from an error in URI characters. - * - * @return static - */ - public static function createFromInvalidCharacters(string $uri) - { - return new static(\sprintf('The submitted uri `%s` contains invalid characters', $uri)); - } - /** - * Returns a new Instance from an error in URI characters. - * - * @return static - */ - public static function createFromInvalidScheme(string $uri) - { - return new static(\sprintf('The submitted uri `%s` contains an invalid scheme', $uri)); - } - /** - * Returns a new Instance from an error in Host validation. - * - * @return static - */ - public static function createFromInvalidHost(string $host) - { - return new static(\sprintf('The submitted host `%s` is invalid', $host)); - } - /** - * Returns a new Instance from an error in port validation. - * - * @return static - */ - public static function createFromInvalidHostname(string $hostname) - { - return new static(\sprintf('The submitted hostname `%s` is invalid', $hostname)); - } - /** - * Returns a new Instance from an error in port validation. - * - * @param string|int $port - * - * @return static - */ - public static function createFromInvalidPort($port) - { - return new static(\sprintf('The submitted port `%s` is invalid', $port)); - } - /** - * Returns a new Instance from an error in Uri path component. - * - * @return static - */ - public static function createFromInvalidPath(string $uri) - { - return new static(\sprintf('The submitted uri `%s` contains an invalid path', $uri)); - } -} diff --git a/dependencies/league/uri-parser/src/MissingIdnSupport.php b/dependencies/league/uri-parser/src/MissingIdnSupport.php deleted file mode 100644 index 5dd4a09..0000000 --- a/dependencies/league/uri-parser/src/MissingIdnSupport.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @license https://github.com/thephpleague/uri-parser/blob/master/LICENSE (MIT License) - * @version 1.4.1 - * @link https://uri.thephpleague.com/parser/ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -/** - * An exception thrown if the IDN support is missing or - * the ICU is not at least version 4.6. - * - * @see https://tools.ietf.org/html/rfc3986 - * @package League\Uri - * @author Ignace Nyamagana Butera - * @since 1.4.0 - */ -class MissingIdnSupport extends Exception -{ -} diff --git a/dependencies/league/uri-parser/src/Parser.php b/dependencies/league/uri-parser/src/Parser.php deleted file mode 100644 index d17c5a2..0000000 --- a/dependencies/league/uri-parser/src/Parser.php +++ /dev/null @@ -1,539 +0,0 @@ - - * @license https://github.com/thephpleague/uri-parser/blob/master/LICENSE (MIT License) - * @version 1.4.1 - * @link https://uri.thephpleague.com/parser/ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use UnexpectedValueException; -/** - * A class to parse a URI string according to RFC3986. - * - * @see https://tools.ietf.org/html/rfc3986 - * @package League\Uri - * @author Ignace Nyamagana Butera - * @since 0.1.0 - */ -class Parser -{ - /** @deprecated 1.4.0 will be removed in the next major point release */ - const INVALID_URI_CHARS = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"; - /** @deprecated 1.4.0 will be removed in the next major point release */ - const SCHEME_VALID_STARTING_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - /** @deprecated 1.4.0 will be removed in the next major point release */ - const SCHEME_VALID_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-'; - /** @deprecated 1.4.0 will be removed in the next major point release */ - const LABEL_VALID_STARTING_CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - /** @deprecated 1.4.0 will be removed in the next major point release */ - const LOCAL_LINK_PREFIX = '1111111010'; - const URI_COMPONENTS = ['scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null]; - /** @deprecated 1.4.0 will be removed in the next major point release */ - const SUB_DELIMITERS = '!$&\'()*+,;='; - /** - * Returns whether a scheme is valid. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - */ - public function isScheme(string $scheme) : bool - { - static $pattern = '/^[a-z][a-z0-9\\+\\.\\-]*$/i'; - return '' === $scheme || 1 === \preg_match($pattern, $scheme); - } - /** - * Returns whether a hostname is valid. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 - */ - public function isHost(string $host) : bool - { - return '' === $host || $this->isIpHost($host) || $this->isRegisteredName($host); - } - /** - * Validate a IPv6/IPvfuture host. - * - * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 - * @see http://tools.ietf.org/html/rfc6874#section-2 - * @see http://tools.ietf.org/html/rfc6874#section-4 - */ - private function isIpHost(string $host) : bool - { - if ('[' !== ($host[0] ?? '') || ']' !== \substr($host, -1)) { - return \false; - } - $ip = \substr($host, 1, -1); - if (\filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return \true; - } - static $ip_future = '/^ - v(?[A-F0-9])+\\. - (?: - (?[a-z0-9_~\\-\\.])| - (?[!$&\'()*+,;=:]) # also include the : character - )+ - $/ix'; - if (1 === \preg_match($ip_future, $ip, $matches) && !\in_array($matches['version'], ['4', '6'], \true)) { - return \true; - } - if (\false === ($pos = \strpos($ip, '%'))) { - return \false; - } - static $gen_delims = '/[:\\/?#\\[\\]@ ]/'; - // Also includes space. - if (1 === \preg_match($gen_delims, \rawurldecode(\substr($ip, $pos)))) { - return \false; - } - $ip = \substr($ip, 0, $pos); - if (!\filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return \false; - } - //Only the address block fe80::/10 can have a Zone ID attach to - //let's detect the link local significant 10 bits - static $address_block = "\xfe\x80"; - return 0 === \strpos((string) \inet_pton($ip), $address_block); - } - /** - * Returns whether the host is an IPv4 or a registered named. - * - * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @throws MissingIdnSupport if the registered name contains non-ASCII characters - * and IDN support or ICU requirement are not available or met. - * - */ - protected function isRegisteredName(string $host) : bool - { - // Note that unreserved is purposely missing . as it is used to separate labels. - static $reg_name = '/(?(DEFINE) - (?[a-z0-9_~\\-]) - (?[!$&\'()*+,;=]) - (?%[A-F0-9]{2}) - (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*) - ) - ^(?:(?®_name)\\.)*(?®_name)\\.?$/ix'; - if (1 === \preg_match($reg_name, $host)) { - return \true; - } - //to test IDN host non-ascii characters must be present in the host - static $idn_pattern = '/[^\\x20-\\x7f]/'; - if (1 !== \preg_match($idn_pattern, $host)) { - return \false; - } - static $idn_support = null; - $idn_support = $idn_support ?? \function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46'); - // @codeCoverageIgnoreStart - // added because it is not possible in travis to disabled the ext/intl extension - // see travis issue https://github.com/travis-ci/travis-ci/issues/4701 - if (!$idn_support) { - throw new MissingIdnSupport(\sprintf('the host `%s` could not be processed for IDN. Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6.', $host)); - } - // @codeCoverageIgnoreEnd - $ascii_host = \idn_to_ascii($host, \IDNA_NONTRANSITIONAL_TO_ASCII, \INTL_IDNA_VARIANT_UTS46, $arr); - // @codeCoverageIgnoreStart - if (\false === $ascii_host && 0 === $arr['errors']) { - throw new UnexpectedValueException(\sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', \PHP_OS)); - } - // @codeCoverageIgnoreEnd - return 0 === $arr['errors']; - } - /** - * Returns whether a port is valid. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 - */ - public function isPort($port) : bool - { - static $pattern = '/^[0-9]+$/'; - if (null === $port || '' === $port) { - return \true; - } - return 1 === \preg_match($pattern, (string) $port); - } - /** - * Parse a URI string into its components. - * - * @see Parser::parse - * - * @throws Exception if the URI contains invalid characters - */ - public function __invoke(string $uri) : array - { - return $this->parse($uri); - } - /** - * Parse an URI string into its components. - * - * This method parses a URI and returns an associative array containing any - * of the various components of the URI that are present. - * - * - * $components = (new Parser())->parse('http://foo@test.example.com:42?query#'); - * var_export($components); - * //will display - * array( - * 'scheme' => 'http', // the URI scheme component - * 'user' => 'foo', // the URI user component - * 'pass' => null, // the URI pass component - * 'host' => 'test.example.com', // the URI host component - * 'port' => 42, // the URI port component - * 'path' => '', // the URI path component - * 'query' => 'query', // the URI query component - * 'fragment' => '', // the URI fragment component - * ); - * - * - * The returned array is similar to PHP's parse_url return value with the following - * differences: - * - *
    - *
  • All components are always 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.
  • - *
  • The path component is never undefined
  • - *
  • The method parses the URI following the RFC3986 rules but you are still - * required to validate the returned components against its related scheme specific rules.
  • - *
- * - * @see https://tools.ietf.org/html/rfc3986 - * @see https://tools.ietf.org/html/rfc3986#section-2 - * - * @throws Exception if the URI contains invalid characters - */ - public function parse(string $uri) : array - { - static $pattern = '/[\\x00-\\x1f\\x7f]/'; - //simple URI which do not need any parsing - static $simple_uri = ['' => [], '#' => ['fragment' => ''], '?' => ['query' => ''], '?#' => ['query' => '', 'fragment' => ''], '/' => ['path' => '/'], '//' => ['host' => '']]; - if (isset($simple_uri[$uri])) { - return \array_merge(self::URI_COMPONENTS, $simple_uri[$uri]); - } - if (1 === \preg_match($pattern, $uri)) { - throw Exception::createFromInvalidCharacters($uri); - } - //if the first character is a known URI delimiter parsing can be simplified - $first_char = $uri[0]; - //The URI is made of the fragment only - if ('#' === $first_char) { - $components = self::URI_COMPONENTS; - $components['fragment'] = (string) \substr($uri, 1); - return $components; - } - //The URI is made of the query and fragment - if ('?' === $first_char) { - $components = self::URI_COMPONENTS; - list($components['query'], $components['fragment']) = \explode('#', \substr($uri, 1), 2) + [1 => null]; - return $components; - } - //The URI does not contain any scheme part - if (0 === \strpos($uri, '//')) { - return $this->parseSchemeSpecificPart($uri); - } - //The URI is made of a path, query and fragment - if ('/' === $first_char || \false === \strpos($uri, ':')) { - return $this->parsePathQueryAndFragment($uri); - } - //Fallback parser - return $this->fallbackParser($uri); - } - /** - * Extract components from a URI without a scheme part. - * - * The URI MUST start with the authority component - * preceded by its delimiter the double slash ('//') - * - * Example: //user:pass@host:42/path?query#fragment - * - * The authority MUST adhere to the RFC3986 requirements. - * - * If the URI contains a path component, it MUST be empty or absolute - * according to RFC3986 path classification. - * - * This method returns an associative array containing all URI components. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2 - * @see https://tools.ietf.org/html/rfc3986#section-3.3 - * - * @throws Exception If any component of the URI is invalid - */ - protected function parseSchemeSpecificPart(string $uri) : array - { - //We remove the authority delimiter - $remaining_uri = (string) \substr($uri, 2); - $components = self::URI_COMPONENTS; - //Parsing is done from the right upmost part to the left - //1 - detect fragment, query and path part if any - list($remaining_uri, $components['fragment']) = \explode('#', $remaining_uri, 2) + [1 => null]; - list($remaining_uri, $components['query']) = \explode('?', $remaining_uri, 2) + [1 => null]; - if (\false !== \strpos($remaining_uri, '/')) { - list($remaining_uri, $components['path']) = \explode('/', $remaining_uri, 2) + [1 => null]; - $components['path'] = '/' . $components['path']; - } - //2 - The $remaining_uri represents the authority part - //if the authority part is empty parsing is simplified - if ('' === $remaining_uri) { - $components['host'] = ''; - return $components; - } - //otherwise we split the authority into the user information and the hostname parts - $parts = \explode('@', $remaining_uri, 2); - $hostname = $parts[1] ?? $parts[0]; - $user_info = isset($parts[1]) ? $parts[0] : null; - if (null !== $user_info) { - list($components['user'], $components['pass']) = \explode(':', $user_info, 2) + [1 => null]; - } - list($components['host'], $components['port']) = $this->parseHostname($hostname); - return $components; - } - /** - * Parse and validate the URI hostname. - * - * @throws Exception If the hostname is invalid - */ - protected function parseHostname(string $hostname) : array - { - if (\false === \strpos($hostname, '[')) { - list($host, $port) = \explode(':', $hostname, 2) + [1 => null]; - return [$this->filterHost($host), $this->filterPort($port)]; - } - $delimiter_offset = \strpos($hostname, ']') + 1; - if (isset($hostname[$delimiter_offset]) && ':' !== $hostname[$delimiter_offset]) { - throw Exception::createFromInvalidHostname($hostname); - } - return [$this->filterHost(\substr($hostname, 0, $delimiter_offset)), $this->filterPort(\substr($hostname, ++$delimiter_offset))]; - } - /** - * validate the host component. - * - * @param string|null $host - * - * @throws Exception If the hostname is invalid - * - * @return string|null - */ - protected function filterHost($host) - { - if (null === $host || $this->isHost($host)) { - return $host; - } - throw Exception::createFromInvalidHost($host); - } - /** - * Validate a port number. - * - * An exception is raised for ports outside the established TCP and UDP port ranges. - * - * @param mixed $port the port number - * - * @throws Exception If the port number is invalid. - * - * @return null|int - */ - protected function filterPort($port) - { - static $pattern = '/^[0-9]+$/'; - if (null === $port || \false === $port || '' === $port) { - return null; - } - if (1 !== \preg_match($pattern, (string) $port)) { - throw Exception::createFromInvalidPort($port); - } - return (int) $port; - } - /** - * Extract Components from an URI without scheme or authority part. - * - * The URI contains a path component and MUST adhere to path requirements - * of RFC3986. The path can be - * - * - * path = path-abempty ; begins with "/" or is empty - * / path-absolute ; begins with "/" but not "//" - * / path-noscheme ; begins with a non-colon segment - * / path-rootless ; begins with a segment - * / path-empty ; zero characters - * - * - * ex: path?q#f - * ex: /path - * ex: /pa:th#f - * - * This method returns an associative array containing all URI components. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.3 - * - * @throws Exception If the path component is invalid - */ - protected function parsePathQueryAndFragment(string $uri) : array - { - //No scheme is present so we ensure that the path respects RFC3986 - if (\false !== ($pos = \strpos($uri, ':')) && \false === \strpos(\substr($uri, 0, $pos), '/')) { - throw Exception::createFromInvalidPath($uri); - } - $components = self::URI_COMPONENTS; - //Parsing is done from the right upmost part to the left - //1 - detect the fragment part if any - list($remaining_uri, $components['fragment']) = \explode('#', $uri, 2) + [1 => null]; - //2 - detect the query and the path part - list($components['path'], $components['query']) = \explode('?', $remaining_uri, 2) + [1 => null]; - return $components; - } - /** - * Extract components from an URI containing a colon. - * - * Depending on the colon ":" position and on the string - * composition before the presence of the colon, the URI - * will be considered to have an scheme or not. - * - *
    - *
  • In case no valid scheme is found according to RFC3986 the URI will - * be parsed as an URI without a scheme and an authority
  • - *
  • In case an authority part is detected the URI specific part is parsed - * as an URI without scheme
  • - *
- * - * ex: email:johndoe@thephpleague.com?subject=Hellow%20World! - * - * This method returns an associative array containing all - * the URI components. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - * @see Parser::parsePathQueryAndFragment - * @see Parser::parseSchemeSpecificPart - * - * @throws Exception If the URI scheme component is empty - */ - protected function fallbackParser(string $uri) : array - { - //1 - we split the URI on the first detected colon character - $parts = \explode(':', $uri, 2); - $remaining_uri = $parts[1] ?? $parts[0]; - $scheme = isset($parts[1]) ? $parts[0] : null; - //1.1 - a scheme can not be empty (ie a URI can not start with a colon) - if ('' === $scheme) { - throw Exception::createFromInvalidScheme($uri); - } - //2 - depending on the scheme presence and validity we will differ the parsing - //2.1 - If the scheme part is invalid the URI may be an URI with a path-noscheme - // let's differ the parsing to the Parser::parsePathQueryAndFragment method - if (!$this->isScheme($scheme)) { - return $this->parsePathQueryAndFragment($uri); - } - $components = self::URI_COMPONENTS; - $components['scheme'] = $scheme; - //2.2 - if no scheme specific part is detect parsing is finished - if ('' == $remaining_uri) { - return $components; - } - //2.3 - if the scheme specific part is a double forward slash - if ('//' === $remaining_uri) { - $components['host'] = ''; - return $components; - } - //2.4 - if the scheme specific part starts with double forward slash - // we differ the remaining parsing to the Parser::parseSchemeSpecificPart method - if (0 === \strpos($remaining_uri, '//')) { - $components = $this->parseSchemeSpecificPart($remaining_uri); - $components['scheme'] = $scheme; - return $components; - } - //2.5 - Parsing is done from the right upmost part to the left from the scheme specific part - //2.5.1 - detect the fragment part if any - list($remaining_uri, $components['fragment']) = \explode('#', $remaining_uri, 2) + [1 => null]; - //2.5.2 - detect the part and query part if any - list($components['path'], $components['query']) = \explode('?', $remaining_uri, 2) + [1 => null]; - return $components; - } - /** - * Convert a registered name label to its IDNA ASCII form. - * - * DEPRECATION WARNING! This method will be removed in the next major point release - * - * @deprecated 1.4.0 this method is no longer used to validate RFC3987 compliant host component - * @codeCoverageIgnore - * - * Conversion is done only if the label contains none valid label characters - * if a '%' sub delimiter is detected the label MUST be rawurldecode prior to - * making the conversion - * - * @return string|false - */ - protected function toAscii(string $label) - { - \trigger_error(self::class . '::' . __METHOD__ . ' is deprecated and will be removed in the next major point release', \E_USER_DEPRECATED); - if (\false !== \strpos($label, '%')) { - $label = \rawurldecode($label); - } - static $idn_support = null; - $idn_support = $idn_support ?? \function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46'); - if (!$idn_support) { - throw new MissingIdnSupport(\sprintf('the label `%s` could not be processed for IDN. Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6.', $label)); - } - $ascii_host = \idn_to_ascii($label, \IDNA_NONTRANSITIONAL_TO_ASCII, \INTL_IDNA_VARIANT_UTS46, $arr); - if (\false === $ascii_host && 0 === $arr['errors']) { - throw new UnexpectedValueException(\sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', \PHP_OS)); - } - return $ascii_host; - } - /** - * Returns whether the registered name label is valid. - * - * DEPRECATION WARNING! This method will be removed in the next major point release - * - * @deprecated 1.4.0 this method is no longer used to validated the host component - * @codeCoverageIgnore - * - * A valid registered name label MUST conform to the following ABNF - * - * reg-name = *( unreserved / pct-encoded / sub-delims ) - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @param string $label - */ - protected function isHostLabel($label) : bool - { - \trigger_error(self::class . '::' . __METHOD__ . ' is deprecated and will be removed in the next major point release', \E_USER_DEPRECATED); - return '' != $label && 63 >= \strlen($label) && \strlen($label) == \strspn($label, self::LABEL_VALID_STARTING_CHARS . '-_~' . self::SUB_DELIMITERS); - } - /** - * Validate an IPv6 host. - * - * DEPRECATION WARNING! This method will be removed in the next major point release - * - * @deprecated 1.4.0 this method is no longer used to validated the host component - * @codeCoverageIgnore - * - * @see http://tools.ietf.org/html/rfc6874#section-2 - * @see http://tools.ietf.org/html/rfc6874#section-4 - */ - protected function isIpv6Host(string $ipv6) : bool - { - \trigger_error(self::class . '::' . __METHOD__ . ' is deprecated and will be removed in the next major point release', \E_USER_DEPRECATED); - if ('[' !== ($ipv6[0] ?? '') || ']' !== \substr($ipv6, -1)) { - return \false; - } - $ipv6 = \substr($ipv6, 1, -1); - if (\false === ($pos = \strpos($ipv6, '%'))) { - return (bool) \filter_var($ipv6, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6); - } - $scope = \rawurldecode(\substr($ipv6, $pos)); - if (\strlen($scope) !== \strcspn($scope, '?#@[]')) { - return \false; - } - $ipv6 = \substr($ipv6, 0, $pos); - if (!\filter_var($ipv6, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return \false; - } - //Only the address block fe80::/10 can have a Zone ID attach to - //let's detect the link local significant 10 bits - return 0 === \strpos((string) \inet_pton($ipv6), "\xfe\x80"); - } -} diff --git a/dependencies/league/uri-parser/src/functions.php b/dependencies/league/uri-parser/src/functions.php deleted file mode 100644 index bc90789..0000000 --- a/dependencies/league/uri-parser/src/functions.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @license https://github.com/thephpleague/uri-parser/blob/master/LICENSE (MIT License) - * @version 1.4.1 - * @link https://uri.thephpleague.com/parser/ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -/** - * Returns whether the URI host component is valid according to RFC3986. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 - * @see Parser::isHost() - */ -function is_host(string $host) : bool -{ - static $parser; - $parser = $parser ?? new Parser(); - return $parser->isHost($host); -} -/** - * Returns whether the URI port component is valid according to RFC3986. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2.3 - * @see Parser::isPort() - */ -function is_port($port) : bool -{ - static $parser; - $parser = $parser ?? new Parser(); - return $parser->isPort($port); -} -/** - * Returns whether the URI scheme component is valid according to RFC3986. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - * @see Parser::isScheme() - */ -function is_scheme(string $scheme) : bool -{ - static $parser; - $parser = $parser ?? new Parser(); - return $parser->isScheme($scheme); -} -/** - * Parse an URI string into its components. - * - * This method parses a URL and returns an associative array containing any - * of the various components of the URL that are present. - * - * @see https://tools.ietf.org/html/rfc3986 - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see Parser::parse() - * - * @throws Exception if the URI contains invalid characters - */ -function parse(string $uri) : array -{ - static $parser; - $parser = $parser ?? new Parser(); - return $parser->parse($uri); -} -/** - * Generate an URI string representation from its parsed representation - * returned by League\Uri\Parser::parse() or PHP's parse_url. - * - * If you supply your own array, you are responsible for providing - * valid components without their URI delimiters. - * - * For security reasons the password (pass) component has been deprecated - * as per RFC3986 and is never returned in the URI string - * - * @see https://tools.ietf.org/html/rfc3986#section-5.3 - * @see https://tools.ietf.org/html/rfc3986#section-7.5 - */ -function build(array $components) : string -{ - $uri = $components['path'] ?? ''; - if (isset($components['query'])) { - $uri .= '?' . $components['query']; - } - if (isset($components['fragment'])) { - $uri .= '#' . $components['fragment']; - } - if (isset($components['host'])) { - $authority = $components['host']; - if (isset($components['port'])) { - $authority .= ':' . $components['port']; - } - if (isset($components['user'])) { - $authority = $components['user'] . '@' . $authority; - } - $uri = '//' . $authority . $uri; - } - if (isset($components['scheme'])) { - return $components['scheme'] . ':' . $uri; - } - return $uri; -} diff --git a/dependencies/league/uri-parser/src/functions_include.php b/dependencies/league/uri-parser/src/functions_include.php deleted file mode 100644 index 9c9b004..0000000 --- a/dependencies/league/uri-parser/src/functions_include.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @license https://github.com/thephpleague/uri-parser/blob/master/LICENSE (MIT License) - * @version 1.4.1 - * @link https://uri.thephpleague.com/parser/ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (!\function_exists('WP_Ultimo\\Dependencies\\League\\Uri\\parse')) { - require __DIR__ . '/functions.php'; -} diff --git a/dependencies/league/uri/BaseUri.php b/dependencies/league/uri/BaseUri.php deleted file mode 100644 index 1018dc4..0000000 --- a/dependencies/league/uri/BaseUri.php +++ /dev/null @@ -1,417 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use JsonSerializable; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriAccess; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriInterface; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\League\Uri\Idna\Converter; -use WP_Ultimo\Dependencies\League\Uri\IPv4\Converter as IPv4Converter; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriFactoryInterface; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface as Psr7UriInterface; -use Stringable; -use function array_pop; -use function array_reduce; -use function count; -use function end; -use function explode; -use function implode; -use function str_repeat; -use function strpos; -use function substr; -/** - * @phpstan-import-type ComponentMap from UriInterface - */ -class BaseUri implements Stringable, JsonSerializable, UriAccess -{ - /** @var array */ - protected final const WHATWG_SPECIAL_SCHEMES = ['ftp' => 1, 'http' => 1, 'https' => 1, 'ws' => 1, 'wss' => 1]; - /** @var array */ - protected final const DOT_SEGMENTS = ['.' => 1, '..' => 1]; - protected readonly Psr7UriInterface|UriInterface|null $origin; - protected readonly ?string $nullValue; - protected final function __construct(protected readonly Psr7UriInterface|UriInterface $uri, protected readonly ?UriFactoryInterface $uriFactory) - { - $this->nullValue = $this->uri instanceof Psr7UriInterface ? '' : null; - $this->origin = $this->computeOrigin($this->uri, $this->nullValue); - } - public static function from(Stringable|string $uri, ?UriFactoryInterface $uriFactory = null) : static - { - return new static(static::formatHost(static::filterUri($uri, $uriFactory)), $uriFactory); - } - public function withUriFactory(UriFactoryInterface $uriFactory) : static - { - return new static($this->uri, $uriFactory); - } - public function withoutUriFactory() : static - { - return new static($this->uri, null); - } - public function getUri() : Psr7UriInterface|UriInterface - { - return $this->uri; - } - public function getUriString() : string - { - return $this->uri->__toString(); - } - public function jsonSerialize() : string - { - return $this->uri->__toString(); - } - public function __toString() : string - { - return $this->uri->__toString(); - } - public function origin() : ?self - { - return match (null) { - $this->origin => null, - default => new self($this->origin, $this->uriFactory), - }; - } - /** - * Tells whether two URI do not share the same origin. - */ - public function isCrossOrigin(Stringable|string $uri) : bool - { - if (null === $this->origin) { - return \true; - } - $uri = static::filterUri($uri); - $uriOrigin = $this->computeOrigin($uri, $uri instanceof Psr7UriInterface ? '' : null); - return match (\true) { - null === $uriOrigin, $uriOrigin->__toString() !== $this->origin->__toString() => \true, - default => \false, - }; - } - /** - * Tells whether the URI is absolute. - */ - public function isAbsolute() : bool - { - return $this->nullValue !== $this->uri->getScheme(); - } - /** - * Tells whether the URI is a network path. - */ - public function isNetworkPath() : bool - { - return $this->nullValue === $this->uri->getScheme() && $this->nullValue !== $this->uri->getAuthority(); - } - /** - * Tells whether the URI is an absolute path. - */ - public function isAbsolutePath() : bool - { - return $this->nullValue === $this->uri->getScheme() && $this->nullValue === $this->uri->getAuthority() && '/' === ($this->uri->getPath()[0] ?? ''); - } - /** - * Tells whether the URI is a relative path. - */ - public function isRelativePath() : bool - { - return $this->nullValue === $this->uri->getScheme() && $this->nullValue === $this->uri->getAuthority() && '/' !== ($this->uri->getPath()[0] ?? ''); - } - /** - * Tells whether both URI refers to the same document. - */ - public function isSameDocument(Stringable|string $uri) : bool - { - return $this->normalize(static::filterUri($uri)) === $this->normalize($this->uri); - } - /** - * Tells whether the URI contains an Internationalized Domain Name (IDN). - */ - public function hasIdn() : bool - { - return Converter::isIdn($this->uri->getHost()); - } - /** - * Resolves a URI against a base URI using RFC3986 rules. - * - * This method MUST retain the state of the submitted URI instance, and return - * a URI instance of the same type that contains the applied modifications. - * - * This method MUST be transparent when dealing with error and exceptions. - * It MUST not alter or silence them apart from validating its own parameters. - */ - public function resolve(Stringable|string $uri) : static - { - $uri = static::formatHost(static::filterUri($uri, $this->uriFactory)); - $null = $uri instanceof Psr7UriInterface ? '' : null; - if ($null !== $uri->getScheme()) { - return new static($uri->withPath(static::removeDotSegments($uri->getPath())), $this->uriFactory); - } - if ($null !== $uri->getAuthority()) { - return new static($uri->withScheme($this->uri->getScheme())->withPath(static::removeDotSegments($uri->getPath())), $this->uriFactory); - } - $user = $null; - $pass = null; - $userInfo = $this->uri->getUserInfo(); - if (null !== $userInfo) { - [$user, $pass] = explode(':', $userInfo, 2) + [1 => null]; - } - [$path, $query] = $this->resolvePathAndQuery($uri); - return new static($uri->withPath($this->removeDotSegments($path))->withQuery($query)->withHost($this->uri->getHost())->withPort($this->uri->getPort())->withUserInfo((string) $user, $pass)->withScheme($this->uri->getScheme()), $this->uriFactory); - } - /** - * Relativize a URI according to a base URI. - * - * This method MUST retain the state of the submitted URI instance, and return - * a URI instance of the same type that contains the applied modifications. - * - * This method MUST be transparent when dealing with error and exceptions. - * It MUST not alter of silence them apart from validating its own parameters. - */ - public function relativize(Stringable|string $uri) : static - { - $uri = static::formatHost(static::filterUri($uri, $this->uriFactory)); - if ($this->canNotBeRelativize($uri)) { - return new static($uri, $this->uriFactory); - } - $null = $uri instanceof Psr7UriInterface ? '' : null; - $uri = $uri->withScheme($null)->withPort(null)->withUserInfo($null)->withHost($null); - $targetPath = $uri->getPath(); - $basePath = $this->uri->getPath(); - return new static(match (\true) { - $targetPath !== $basePath => $uri->withPath(static::relativizePath($targetPath, $basePath)), - static::componentEquals('query', $uri) => $uri->withPath('')->withQuery($null), - $null === $uri->getQuery() => $uri->withPath(static::formatPathWithEmptyBaseQuery($targetPath)), - default => $uri->withPath(''), - }, $this->uriFactory); - } - protected final function computeOrigin(Psr7UriInterface|UriInterface $uri, ?string $nullValue) : Psr7UriInterface|UriInterface|null - { - $scheme = $uri->getScheme(); - if ('blob' !== $scheme) { - return match (\true) { - isset(static::WHATWG_SPECIAL_SCHEMES[$scheme]) => $uri->withFragment($nullValue)->withQuery($nullValue)->withPath('')->withUserInfo($nullValue), - default => null, - }; - } - $components = UriString::parse($uri->getPath()); - if ($uri instanceof Psr7UriInterface) { - /** @var ComponentMap $components */ - $components = \array_map(fn($component) => null === $component ? '' : $component, $components); - } - return match (\true) { - null !== $components['scheme'] && isset(static::WHATWG_SPECIAL_SCHEMES[\strtolower($components['scheme'])]) => $uri->withFragment($nullValue)->withQuery($nullValue)->withPath('')->withHost($components['host'])->withPort($components['port'])->withScheme($components['scheme'])->withUserInfo($nullValue), - default => null, - }; - } - /** - * Normalizes a URI for comparison; this URI string representation is not suitable for usage as per RFC guidelines. - */ - protected final function normalize(Psr7UriInterface|UriInterface $uri) : string - { - $null = $uri instanceof Psr7UriInterface ? '' : null; - $path = $uri->getPath(); - if ('/' === ($path[0] ?? '') || '' !== $uri->getScheme() . $uri->getAuthority()) { - $path = $this->removeDotSegments($path); - } - $query = $uri->getQuery(); - $pairs = null === $query ? [] : explode('&', $query); - \sort($pairs); - static $regexpEncodedChars = ',%(2[D|E]|3\\d|4[1-9|A-F]|5[\\d|AF]|6[1-9|A-F]|7[\\d|E]),i'; - $value = \preg_replace_callback($regexpEncodedChars, static fn(array $matches): string => \rawurldecode($matches[0]), [$path, implode('&', $pairs)]) ?? ['', $null]; - [$path, $query] = $value + ['', $null]; - if ($null !== $uri->getAuthority() && '' === $path) { - $path = '/'; - } - return $uri->withHost(Uri::fromComponents(['host' => $uri->getHost()])->getHost())->withPath($path)->withQuery([] === $pairs ? $null : $query)->withFragment($null)->__toString(); - } - /** - * Input URI normalization to allow Stringable and string URI. - */ - protected static final function filterUri(Stringable|string $uri, UriFactoryInterface|null $uriFactory = null) : Psr7UriInterface|UriInterface - { - return match (\true) { - $uri instanceof UriAccess => $uri->getUri(), - $uri instanceof Psr7UriInterface, $uri instanceof UriInterface => $uri, - $uriFactory instanceof UriFactoryInterface => $uriFactory->createUri((string) $uri), - default => Uri::new($uri), - }; - } - /** - * Remove dot segments from the URI path as per RFC specification. - */ - protected final function removeDotSegments(string $path) : string - { - if (!\str_contains($path, '.')) { - return $path; - } - $reducer = function (array $carry, string $segment) : array { - if ('..' === $segment) { - array_pop($carry); - return $carry; - } - if (!isset(static::DOT_SEGMENTS[$segment])) { - $carry[] = $segment; - } - return $carry; - }; - $oldSegments = explode('/', $path); - $newPath = implode('/', array_reduce($oldSegments, $reducer(...), [])); - if (isset(static::DOT_SEGMENTS[end($oldSegments)])) { - $newPath .= '/'; - } - // @codeCoverageIgnoreStart - // added because some PSR-7 implementations do not respect RFC3986 - if (\str_starts_with($path, '/') && !\str_starts_with($newPath, '/')) { - return '/' . $newPath; - } - // @codeCoverageIgnoreEnd - return $newPath; - } - /** - * Resolves an URI path and query component. - * - * @return array{0:string, 1:string|null} - */ - protected final function resolvePathAndQuery(Psr7UriInterface|UriInterface $uri) : array - { - $targetPath = $uri->getPath(); - $null = $uri instanceof Psr7UriInterface ? '' : null; - if (\str_starts_with($targetPath, '/')) { - return [$targetPath, $uri->getQuery()]; - } - if ('' === $targetPath) { - $targetQuery = $uri->getQuery(); - if ($null === $targetQuery) { - $targetQuery = $this->uri->getQuery(); - } - $targetPath = $this->uri->getPath(); - //@codeCoverageIgnoreStart - //because some PSR-7 Uri implementations allow this RFC3986 forbidden construction - if (null !== $this->uri->getAuthority() && !\str_starts_with($targetPath, '/')) { - $targetPath = '/' . $targetPath; - } - //@codeCoverageIgnoreEnd - return [$targetPath, $targetQuery]; - } - $basePath = $this->uri->getPath(); - if (null !== $this->uri->getAuthority() && '' === $basePath) { - $targetPath = '/' . $targetPath; - } - if ('' !== $basePath) { - $segments = explode('/', $basePath); - array_pop($segments); - if ([] !== $segments) { - $targetPath = implode('/', $segments) . '/' . $targetPath; - } - } - return [$targetPath, $uri->getQuery()]; - } - /** - * Tells whether the component value from both URI object equals. - * - * @pqram 'query'|'authority'|'scheme' $property - */ - protected final function componentEquals(string $property, Psr7UriInterface|UriInterface $uri) : bool - { - $getComponent = function (string $property, Psr7UriInterface|UriInterface $uri) : ?string { - $component = match ($property) { - 'query' => $uri->getQuery(), - 'authority' => $uri->getAuthority(), - default => $uri->getScheme(), - }; - return match (\true) { - $uri instanceof UriInterface, '' !== $component => $component, - default => null, - }; - }; - return $getComponent($property, $uri) === $getComponent($property, $this->uri); - } - /** - * Filter the URI object. - */ - protected static final function formatHost(Psr7UriInterface|UriInterface $uri) : Psr7UriInterface|UriInterface - { - $host = $uri->getHost(); - try { - $converted = IPv4Converter::fromEnvironment()->toDecimal($host); - } catch (MissingFeature) { - $converted = null; - } - return match (\true) { - null !== $converted => $uri->withHost($converted), - '' === $host, $uri instanceof UriInterface => $uri, - default => $uri->withHost((string) Uri::fromComponents(['host' => $host])->getHost()), - }; - } - /** - * Tells whether the submitted URI object can be relativized. - */ - protected final function canNotBeRelativize(Psr7UriInterface|UriInterface $uri) : bool - { - return !static::componentEquals('scheme', $uri) || !static::componentEquals('authority', $uri) || static::from($uri)->isRelativePath(); - } - /** - * Relatives the URI for an authority-less target URI. - */ - protected static final function relativizePath(string $path, string $basePath) : string - { - $baseSegments = static::getSegments($basePath); - $targetSegments = static::getSegments($path); - $targetBasename = array_pop($targetSegments); - array_pop($baseSegments); - foreach ($baseSegments as $offset => $segment) { - if (!isset($targetSegments[$offset]) || $segment !== $targetSegments[$offset]) { - break; - } - unset($baseSegments[$offset], $targetSegments[$offset]); - } - $targetSegments[] = $targetBasename; - return static::formatPath(str_repeat('../', count($baseSegments)) . implode('/', $targetSegments), $basePath); - } - /** - * returns the path segments. - * - * @return string[] - */ - protected static final function getSegments(string $path) : array - { - return explode('/', match (\true) { - '' === $path, '/' !== $path[0] => $path, - default => substr($path, 1), - }); - } - /** - * Formatting the path to keep a valid URI. - */ - protected static final function formatPath(string $path, string $basePath) : string - { - $colonPosition = strpos($path, ':'); - $slashPosition = strpos($path, '/'); - return match (\true) { - '' === $path => match (\true) { - '' === $basePath, '/' === $basePath => $basePath, - default => './', - }, - \false === $colonPosition => $path, - \false === $slashPosition, $colonPosition < $slashPosition => "./{$path}", - default => $path, - }; - } - /** - * Formatting the path to keep a resolvable URI. - */ - protected static final function formatPathWithEmptyBaseQuery(string $path) : string - { - $targetSegments = static::getSegments($path); - /** @var string $basename */ - $basename = end($targetSegments); - return '' === $basename ? './' : $basename; - } -} diff --git a/dependencies/league/uri/Http.php b/dependencies/league/uri/Http.php deleted file mode 100644 index f558ff0..0000000 --- a/dependencies/league/uri/Http.php +++ /dev/null @@ -1,237 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use JsonSerializable; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriException; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriInterface; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\UriTemplate\TemplateCanNotBeExpanded; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface as Psr7UriInterface; -use Stringable; -/** - * @phpstan-import-type InputComponentMap from UriString - */ -final class Http implements Stringable, Psr7UriInterface, JsonSerializable -{ - private function __construct(private readonly UriInterface $uri) - { - if (null === $this->uri->getScheme() && '' === $this->uri->getHost()) { - throw new SyntaxError('An URI without scheme cannot contain an empty host string according to PSR-7: ' . $uri); - } - $port = $this->uri->getPort(); - if (null !== $port && ($port < 0 || $port > 65535)) { - throw new SyntaxError('The URI port is outside the established TCP and UDP port ranges: ' . $uri); - } - } - /** - * Create a new instance from a string or a stringable object. - */ - public static function new(Stringable|string $uri = '') : self - { - return match (\true) { - $uri instanceof UriInterface => new self($uri), - default => new self(Uri::new($uri)), - }; - } - /** - * Create a new instance from a hash of parse_url parts. - * - * @param InputComponentMap $components a hash representation of the URI similar - * to PHP parse_url function result - */ - public static function fromComponents(array $components) : self - { - return new self(Uri::fromComponents($components)); - } - /** - * Create a new instance from the environment. - */ - public static function fromServer(array $server) : self - { - return new self(Uri::fromServer($server)); - } - /** - * Create a new instance from a URI and a Base URI. - * - * The returned URI must be absolute. - */ - public static function fromBaseUri(Stringable|string $uri, Stringable|string|null $baseUri = null) : self - { - return new self(Uri::fromBaseUri($uri, $baseUri)); - } - /** - * Creates a new instance from a template. - * - * @throws TemplateCanNotBeExpanded if the variables are invalid or missing - * @throws UriException if the variables are invalid or missing - */ - public static function fromTemplate(Stringable|string $template, iterable $variables = []) : self - { - return new self(Uri::fromTemplate($template, $variables)); - } - public function getScheme() : string - { - return $this->uri->getScheme() ?? ''; - } - public function getAuthority() : string - { - return $this->uri->getAuthority() ?? ''; - } - public function getUserInfo() : string - { - return $this->uri->getUserInfo() ?? ''; - } - public function getHost() : string - { - return $this->uri->getHost() ?? ''; - } - public function getPort() : ?int - { - return $this->uri->getPort(); - } - public function getPath() : string - { - return $this->uri->getPath(); - } - public function getQuery() : string - { - return $this->uri->getQuery() ?? ''; - } - public function getFragment() : string - { - return $this->uri->getFragment() ?? ''; - } - public function __toString() : string - { - return $this->uri->toString(); - } - public function jsonSerialize() : string - { - return $this->uri->toString(); - } - /** - * Safely stringify input when possible for League UriInterface compatibility. - */ - private function filterInput(string $str) : ?string - { - return match ('') { - $str => null, - default => $str, - }; - } - private function newInstance(UriInterface $uri) : self - { - return match ($this->uri->toString()) { - $uri->toString() => $this, - default => new self($uri), - }; - } - public function withScheme(string $scheme) : self - { - return $this->newInstance($this->uri->withScheme($this->filterInput($scheme))); - } - public function withUserInfo(string $user, ?string $password = null) : self - { - return $this->newInstance($this->uri->withUserInfo($this->filterInput($user), $password)); - } - public function withHost(string $host) : self - { - return $this->newInstance($this->uri->withHost($this->filterInput($host))); - } - public function withPort(?int $port) : self - { - return $this->newInstance($this->uri->withPort($port)); - } - public function withPath(string $path) : self - { - return $this->newInstance($this->uri->withPath($path)); - } - public function withQuery(string $query) : self - { - return $this->newInstance($this->uri->withQuery($this->filterInput($query))); - } - public function withFragment(string $fragment) : self - { - return $this->newInstance($this->uri->withFragment($this->filterInput($fragment))); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Http::new() - * - * Create a new instance from a string. - */ - public static function createFromString(Stringable|string $uri = '') : self - { - return self::new($uri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Http::fromComponents() - * - * Create a new instance from a hash of parse_url parts. - * - * @param InputComponentMap $components a hash representation of the URI similar - * to PHP parse_url function result - */ - public static function createFromComponents(array $components) : self - { - return self::fromComponents($components); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Http::fromServer() - * - * Create a new instance from the environment. - */ - public static function createFromServer(array $server) : self - { - return self::fromServer($server); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Http::new() - * - * Create a new instance from a URI object. - */ - public static function createFromUri(Psr7UriInterface|UriInterface $uri) : self - { - return self::new($uri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Http::fromBaseUri() - * - * Create a new instance from a URI and a Base URI. - * - * The returned URI must be absolute. - */ - public static function createFromBaseUri(Stringable|string $uri, Stringable|string|null $baseUri = null) : self - { - return self::fromBaseUri($uri, $baseUri); - } -} diff --git a/dependencies/league/uri/HttpFactory.php b/dependencies/league/uri/HttpFactory.php deleted file mode 100644 index fa99e1e..0000000 --- a/dependencies/league/uri/HttpFactory.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use WP_Ultimo\Dependencies\Psr\Http\Message\UriFactoryInterface; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface; -final class HttpFactory implements UriFactoryInterface -{ - public function createUri(string $uri = '') : UriInterface - { - return Http::new($uri); - } -} diff --git a/dependencies/league/uri/Uri.php b/dependencies/league/uri/Uri.php deleted file mode 100644 index 672c7ef..0000000 --- a/dependencies/league/uri/Uri.php +++ /dev/null @@ -1,1028 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use finfo; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriComponentInterface; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriException; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriInterface; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\ConversionFailed; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\MissingFeature; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\Idna\Converter as IdnConverter; -use WP_Ultimo\Dependencies\League\Uri\UriTemplate\TemplateCanNotBeExpanded; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface as Psr7UriInterface; -use SensitiveParameter; -use Stringable; -use function array_filter; -use function array_key_first; -use function array_map; -use function base64_decode; -use function base64_encode; -use function count; -use function explode; -use function file_get_contents; -use function filter_var; -use function implode; -use function in_array; -use function inet_pton; -use function ltrim; -use function preg_match; -use function preg_replace_callback; -use function rawurlencode; -use function str_contains; -use function str_replace; -use function strlen; -use function strpos; -use function strspn; -use function strtolower; -use function substr; -use const FILEINFO_MIME; -use const FILTER_FLAG_IPV4; -use const FILTER_FLAG_IPV6; -use const FILTER_NULL_ON_FAILURE; -use const FILTER_VALIDATE_BOOLEAN; -use const FILTER_VALIDATE_IP; -/** - * @phpstan-import-type ComponentMap from UriString - * @phpstan-import-type InputComponentMap from UriString - */ -final class Uri implements UriInterface -{ - /** - * RFC3986 invalid characters. - * - * @link https://tools.ietf.org/html/rfc3986#section-2.2 - * - * @var string - */ - private const REGEXP_INVALID_CHARS = '/[\\x00-\\x1f\\x7f]/'; - /** - * RFC3986 schema regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.1 - * - * @var string - */ - private const REGEXP_SCHEME = ',^[a-z]([-a-z\\d+.]+)?$,i'; - /** - * RFC3986 host identified by a registered name regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @var string - */ - private const REGEXP_HOST_REGNAME = '/^( - (?[a-z\\d_~\\-\\.])| - (?[!$&\'()*+,;=])| - (?%[A-F\\d]{2}) - )+$/x'; - /** - * RFC3986 delimiters of the generic URI components regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc3986#section-2.2 - * - * @var string - */ - private const REGEXP_HOST_GEN_DELIMS = '/[:\\/?#\\[\\]@ ]/'; - // Also includes space. - /** - * RFC3986 IPvFuture regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc3986#section-3.2.2 - * - * @var string - */ - private const REGEXP_HOST_IPFUTURE = '/^ - v(?[A-F\\d])+\\. - (?: - (?[a-z\\d_~\\-\\.])| - (?[!$&\'()*+,;=:]) # also include the : character - )+ - $/ix'; - /** - * RFC3986 IPvFuture host and port component. - * - * @var string - */ - private const REGEXP_HOST_PORT = ',^(?(\\[.*]|[^:])*)(:(?[^/?#]*))?$,x'; - /** - * Significant 10 bits of IP to detect Zone ID regular expression pattern. - * - * @var string - */ - private const HOST_ADDRESS_BLOCK = "\xfe\x80"; - /** - * Regular expression pattern to for file URI. - * contains the volume but not the volume separator. - * The volume separator may be URL-encoded (`|` as `%7C`) by ::formatPath(), - * so we account for that here. - * - * @var string - */ - private const REGEXP_FILE_PATH = ',^(?/)?(?[a-zA-Z])(?:[:|\\|]|%7C)(?.*)?,'; - /** - * Mimetype regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc2397 - * - * @var string - */ - private const REGEXP_MIMETYPE = ',^\\w+/[-.\\w]+(?:\\+[-.\\w]+)?$,'; - /** - * Base64 content regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc2397 - * - * @var string - */ - private const REGEXP_BINARY = ',(;|^)base64$,'; - /** - * Windows file path string regular expression pattern. - * contains both the volume and volume separator. - * - * @var string - */ - private const REGEXP_WINDOW_PATH = ',^(?[a-zA-Z][:|\\|]),'; - /** - * Supported schemes and corresponding default port. - * - * @var array - */ - private const SCHEME_DEFAULT_PORT = ['data' => null, 'file' => null, 'ftp' => 21, 'gopher' => 70, 'http' => 80, 'https' => 443, 'ws' => 80, 'wss' => 443]; - /** - * Maximum number of formatted host cached. - * - * @var int - */ - private const MAXIMUM_FORMATTED_HOST_CACHED = 100; - /** - * All ASCII letters sorted by typical frequency of occurrence. - * - * @var string - */ - private const ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5Tscheme = $this->formatScheme($scheme); - $this->userInfo = $this->formatUserInfo($user, $pass); - $this->host = $this->formatHost($host); - $this->port = $this->formatPort($port); - $this->authority = $this->setAuthority(); - $this->path = $this->formatPath($path); - $this->query = Encoder::encodeQueryOrFragment($query); - $this->fragment = Encoder::encodeQueryOrFragment($fragment); - $this->assertValidState(); - } - /** - * Format the Scheme and Host component. - * - * @throws SyntaxError if the scheme is invalid - */ - private function formatScheme(?string $scheme) : ?string - { - if (null === $scheme || \array_key_exists($scheme, self::SCHEME_DEFAULT_PORT)) { - return $scheme; - } - $formattedScheme = strtolower($scheme); - if (\array_key_exists($formattedScheme, self::SCHEME_DEFAULT_PORT) || 1 === preg_match(self::REGEXP_SCHEME, $formattedScheme)) { - return $formattedScheme; - } - throw new SyntaxError('The scheme `' . $scheme . '` is invalid.'); - } - /** - * Set the UserInfo component. - */ - private function formatUserInfo(?string $user, #[SensitiveParameter] ?string $password) : ?string - { - return match (null) { - $password => Encoder::encodeUser($user), - default => Encoder::encodeUser($user) . ':' . Encoder::encodePassword($password), - }; - } - /** - * Validate and Format the Host component. - */ - private function formatHost(?string $host) : ?string - { - if (null === $host || '' === $host) { - return $host; - } - static $formattedHostCache = []; - if (isset($formattedHostCache[$host])) { - return $formattedHostCache[$host]; - } - $formattedHost = '[' === $host[0] ? $this->formatIp($host) : $this->formatRegisteredName($host); - $formattedHostCache[$host] = $formattedHost; - if (self::MAXIMUM_FORMATTED_HOST_CACHED < count($formattedHostCache)) { - unset($formattedHostCache[array_key_first($formattedHostCache)]); - } - return $formattedHost; - } - /** - * Validate and format a registered name. - * - * The host is converted to its ascii representation if needed - * - * @throws MissingFeature if the submitted host required missing or misconfigured IDN support - * @throws SyntaxError if the submitted host is not a valid registered name - * @throws ConversionFailed if the submitted IDN host cannot be converted to a valid ascii form - */ - private function formatRegisteredName(string $host) : string - { - $formattedHost = \rawurldecode($host); - return match (1) { - preg_match(self::REGEXP_HOST_REGNAME, $formattedHost) => $formattedHost, - preg_match(self::REGEXP_HOST_GEN_DELIMS, $formattedHost) => throw new SyntaxError('The host `' . $host . '` is invalid : a registered name cannot contain URI delimiters or spaces.'), - default => IdnConverter::toAsciiOrFail($host), - }; - } - /** - * Validate and Format the IPv6/IPvfuture host. - * - * @throws SyntaxError if the submitted host is not a valid IP host - */ - private function formatIp(string $host) : string - { - $ip = substr($host, 1, -1); - if (\false !== filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - return $host; - } - if (1 === preg_match(self::REGEXP_HOST_IPFUTURE, $ip, $matches) && !in_array($matches['version'], ['4', '6'], \true)) { - return $host; - } - $pos = strpos($ip, '%'); - if (\false === $pos) { - throw new SyntaxError('The host `' . $host . '` is invalid : the IP host is malformed.'); - } - if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, \rawurldecode(substr($ip, $pos)))) { - throw new SyntaxError('The host `' . $host . '` is invalid : the IP host is malformed.'); - } - $ip = substr($ip, 0, $pos); - if (\false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - throw new SyntaxError('The host `' . $host . '` is invalid : the IP host is malformed.'); - } - //Only the address block fe80::/10 can have a Zone ID attach to - //let's detect the link local significant 10 bits - if (\str_starts_with((string) inet_pton($ip), self::HOST_ADDRESS_BLOCK)) { - return $host; - } - throw new SyntaxError('The host `' . $host . '` is invalid : the IP host is malformed.'); - } - /** - * Format the Port component. - * - * @throws SyntaxError - */ - private function formatPort(?int $port = null) : ?int - { - $defaultPort = self::SCHEME_DEFAULT_PORT[$this->scheme] ?? null; - return match (\true) { - null === $port, $defaultPort === $port => null, - 0 > $port => throw new SyntaxError('The port `' . $port . '` is invalid.'), - default => $port, - }; - } - /** - * Create a new instance from a string. - */ - public static function new(Stringable|string $uri = '') : self - { - $components = match (\true) { - $uri instanceof UriInterface => $uri->getComponents(), - $uri instanceof Psr7UriInterface => (function (Psr7UriInterface $uri) : array { - $normalize = fn($component) => '' !== $component ? $component : null; - $userInfo = $uri->getUserInfo(); - [$user, $pass] = '' !== $userInfo ? explode(':', $userInfo, 2) : ['', '']; - return ['scheme' => $normalize($uri->getScheme()), 'user' => $normalize($user), 'pass' => $normalize($pass), 'host' => $normalize($uri->getHost()), 'port' => $uri->getPort(), 'path' => $uri->getPath(), 'query' => $normalize($uri->getQuery()), 'fragment' => $normalize($uri->getFragment())]; - })($uri), - default => UriString::parse($uri), - }; - return new self($components['scheme'], $components['user'], $components['pass'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment']); - } - /** - * Creates a new instance from a URI and a Base URI. - * - * The returned URI must be absolute. - */ - public static function fromBaseUri(Stringable|string $uri, Stringable|string|null $baseUri = null) : self - { - $uri = self::new($uri); - $baseUri = BaseUri::from($baseUri ?? $uri); - /** @var self $uri */ - $uri = match (\true) { - $baseUri->isAbsolute() => $baseUri->resolve($uri)->getUri(), - default => throw new SyntaxError('the URI `' . $baseUri . '` must be absolute.'), - }; - return $uri; - } - /** - * Creates a new instance from a template. - * - * @throws TemplateCanNotBeExpanded if the variables are invalid or missing - * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance - */ - public static function fromTemplate(UriTemplate|Stringable|string $template, iterable $variables = []) : self - { - return match (\true) { - $template instanceof UriTemplate => self::fromComponents($template->expand($variables)->getComponents()), - $template instanceof UriTemplate\Template => self::new($template->expand($variables)), - default => self::new(UriTemplate\Template::new($template)->expand($variables)), - }; - } - /** - * Create a new instance from a hash representation of the URI similar - * to PHP parse_url function result. - * - * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result - */ - public static function fromComponents(array $components = []) : self - { - $components += ['scheme' => null, 'user' => null, 'pass' => null, 'host' => null, 'port' => null, 'path' => '', 'query' => null, 'fragment' => null]; - if (null === $components['path']) { - $components['path'] = ''; - } - return new self($components['scheme'], $components['user'], $components['pass'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment']); - } - /** - * Create a new instance from a data file path. - * - * @param resource|null $context - * - * @throws MissingFeature If ext/fileinfo is not installed - * @throws SyntaxError If the file does not exist or is not readable - */ - public static function fromFileContents(Stringable|string $path, $context = null) : self - { - FeatureDetection::supportsFileDetection(); - $path = (string) $path; - $fileArguments = [$path, \false]; - $mimeArguments = [$path, FILEINFO_MIME]; - if (null !== $context) { - $fileArguments[] = $context; - $mimeArguments[] = $context; - } - \set_error_handler(fn(int $errno, string $errstr, string $errfile, int $errline) => \true); - $raw = file_get_contents(...$fileArguments); - \restore_error_handler(); - if (\false === $raw) { - throw new SyntaxError('The file `' . $path . '` does not exist or is not readable.'); - } - $mimetype = (string) (new finfo(FILEINFO_MIME))->file(...$mimeArguments); - return Uri::fromComponents(['scheme' => 'data', 'path' => str_replace(' ', '', $mimetype . ';base64,' . base64_encode($raw))]); - } - /** - * Create a new instance from a Unix path string. - */ - public static function fromUnixPath(Stringable|string $path) : self - { - $path = implode('/', array_map(rawurlencode(...), explode('/', (string) $path))); - return Uri::fromComponents(match (\true) { - '/' !== ($path[0] ?? '') => ['path' => $path], - default => ['path' => $path, 'scheme' => 'file', 'host' => ''], - }); - } - /** - * Create a new instance from a local Windows path string. - */ - public static function fromWindowsPath(Stringable|string $path) : self - { - $path = (string) $path; - $root = ''; - if (1 === preg_match(self::REGEXP_WINDOW_PATH, $path, $matches)) { - $root = substr($matches['root'], 0, -1) . ':'; - $path = substr($path, strlen($root)); - } - $path = str_replace('\\', '/', $path); - $path = implode('/', array_map(rawurlencode(...), explode('/', $path))); - //Local Windows absolute path - if ('' !== $root) { - return Uri::fromComponents(['path' => '/' . $root . $path, 'scheme' => 'file', 'host' => '']); - } - //UNC Windows Path - if (!\str_starts_with($path, '//')) { - return Uri::fromComponents(['path' => $path]); - } - [$host, $path] = explode('/', substr($path, 2), 2) + [1 => '']; - return Uri::fromComponents(['host' => $host, 'path' => '/' . $path, 'scheme' => 'file']); - } - /** - * Create a new instance from the environment. - */ - public static function fromServer(array $server) : self - { - $components = ['scheme' => self::fetchScheme($server)]; - [$components['user'], $components['pass']] = self::fetchUserInfo($server); - [$components['host'], $components['port']] = self::fetchHostname($server); - [$components['path'], $components['query']] = self::fetchRequestUri($server); - return Uri::fromComponents($components); - } - /** - * Returns the environment scheme. - */ - private static function fetchScheme(array $server) : string - { - $server += ['HTTPS' => '']; - return match (\true) { - \false !== filter_var($server['HTTPS'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) => 'https', - default => 'http', - }; - } - /** - * Returns the environment user info. - * - * @return non-empty-array{0: ?string, 1: ?string} - */ - private static function fetchUserInfo(array $server) : array - { - $server += ['PHP_AUTH_USER' => null, 'PHP_AUTH_PW' => null, 'HTTP_AUTHORIZATION' => '']; - $user = $server['PHP_AUTH_USER']; - $pass = $server['PHP_AUTH_PW']; - if (\str_starts_with(strtolower($server['HTTP_AUTHORIZATION']), 'basic')) { - $userinfo = base64_decode(substr($server['HTTP_AUTHORIZATION'], 6), \true); - if (\false === $userinfo) { - throw new SyntaxError('The user info could not be detected'); - } - [$user, $pass] = explode(':', $userinfo, 2) + [1 => null]; - } - if (null !== $user) { - $user = rawurlencode($user); - } - if (null !== $pass) { - $pass = rawurlencode($pass); - } - return [$user, $pass]; - } - /** - * Returns the environment host. - * - * @throws SyntaxError If the host cannot be detected - * - * @return array{0:string|null, 1:int|null} - */ - private static function fetchHostname(array $server) : array - { - $server += ['SERVER_PORT' => null]; - if (null !== $server['SERVER_PORT']) { - $server['SERVER_PORT'] = (int) $server['SERVER_PORT']; - } - if (isset($server['HTTP_HOST']) && 1 === preg_match(self::REGEXP_HOST_PORT, $server['HTTP_HOST'], $matches)) { - $matches += ['host' => null, 'port' => null]; - if (null !== $matches['port']) { - $matches['port'] = (int) $matches['port']; - } - if (null !== $matches['host']) { - $matches['host'] = (string) $matches['host']; - } - return [$matches['host'], $matches['port'] ?? $server['SERVER_PORT']]; - } - if (!isset($server['SERVER_ADDR'])) { - throw new SyntaxError('The host could not be detected'); - } - if (\false === filter_var($server['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { - return ['[' . $server['SERVER_ADDR'] . ']', $server['SERVER_PORT']]; - } - return [$server['SERVER_ADDR'], $server['SERVER_PORT']]; - } - /** - * Returns the environment path. - * - * @return non-empty-array{0:?string, 1:?string} - */ - private static function fetchRequestUri(array $server) : array - { - $server += ['IIS_WasUrlRewritten' => null, 'UNENCODED_URL' => '', 'PHP_SELF' => '', 'QUERY_STRING' => null]; - if ('1' === $server['IIS_WasUrlRewritten'] && '' !== $server['UNENCODED_URL']) { - return explode('?', $server['UNENCODED_URL'], 2) + [1 => null]; - } - if (isset($server['REQUEST_URI'])) { - [$path] = explode('?', $server['REQUEST_URI'], 2); - $query = '' !== $server['QUERY_STRING'] ? $server['QUERY_STRING'] : null; - return [$path, $query]; - } - return [$server['PHP_SELF'], $server['QUERY_STRING']]; - } - /** - * Generate the URI authority part. - */ - private function setAuthority() : ?string - { - $authority = null; - if (null !== $this->userInfo) { - $authority = $this->userInfo . '@'; - } - if (null !== $this->host) { - $authority .= $this->host; - } - if (null !== $this->port) { - $authority .= ':' . $this->port; - } - return $authority; - } - /** - * Format the Path component. - */ - private function formatPath(string $path) : string - { - return match (\true) { - 'data' === $this->scheme => Encoder::encodePath($this->formatDataPath($path)), - 'file' === $this->scheme => $this->formatFilePath(Encoder::encodePath($path)), - default => Encoder::encodePath($path), - }; - } - /** - * Filter the Path component. - * - * @link https://tools.ietf.org/html/rfc2397 - * - * @throws SyntaxError If the path is not compliant with RFC2397 - */ - private function formatDataPath(string $path) : string - { - if ('' == $path) { - return 'text/plain;charset=us-ascii,'; - } - if (strlen($path) !== strspn($path, self::ASCII) || !str_contains($path, ',')) { - throw new SyntaxError('The path `' . $path . '` is invalid according to RFC2937.'); - } - $parts = explode(',', $path, 2) + [1 => null]; - $mediatype = explode(';', (string) $parts[0], 2) + [1 => null]; - $data = (string) $parts[1]; - $mimetype = $mediatype[0]; - if (null === $mimetype || '' === $mimetype) { - $mimetype = 'text/plain'; - } - $parameters = $mediatype[1]; - if (null === $parameters || '' === $parameters) { - $parameters = 'charset=us-ascii'; - } - $this->assertValidPath($mimetype, $parameters, $data); - return $mimetype . ';' . $parameters . ',' . $data; - } - /** - * Assert the path is a compliant with RFC2397. - * - * @link https://tools.ietf.org/html/rfc2397 - * - * @throws SyntaxError If the mediatype or the data are not compliant with the RFC2397 - */ - private function assertValidPath(string $mimetype, string $parameters, string $data) : void - { - if (1 !== preg_match(self::REGEXP_MIMETYPE, $mimetype)) { - throw new SyntaxError('The path mimetype `' . $mimetype . '` is invalid.'); - } - $isBinary = 1 === preg_match(self::REGEXP_BINARY, $parameters, $matches); - if ($isBinary) { - $parameters = substr($parameters, 0, -strlen($matches[0])); - } - $res = array_filter(array_filter(explode(';', $parameters), $this->validateParameter(...))); - if ([] !== $res) { - throw new SyntaxError('The path paremeters `' . $parameters . '` is invalid.'); - } - if (!$isBinary) { - return; - } - $res = base64_decode($data, \true); - if (\false === $res || $data !== base64_encode($res)) { - throw new SyntaxError('The path data `' . $data . '` is invalid.'); - } - } - /** - * Validate mediatype parameter. - */ - private function validateParameter(string $parameter) : bool - { - $properties = explode('=', $parameter); - return 2 != count($properties) || 'base64' === strtolower($properties[0]); - } - /** - * Format path component for file scheme. - */ - private function formatFilePath(string $path) : string - { - return (string) preg_replace_callback(self::REGEXP_FILE_PATH, static fn(array $matches): string => $matches['delim'] . $matches['volume'] . ':' . $matches['rest'], $path); - } - /** - * assert the URI internal state is valid. - * - * @link https://tools.ietf.org/html/rfc3986#section-3 - * @link https://tools.ietf.org/html/rfc3986#section-3.3 - * - * @throws SyntaxError if the URI is in an invalid state according to RFC3986 - * @throws SyntaxError if the URI is in an invalid state according to scheme specific rules - */ - private function assertValidState() : void - { - if (null !== $this->authority && ('' !== $this->path && '/' !== $this->path[0])) { - throw new SyntaxError('If an authority is present the path must be empty or start with a `/`.'); - } - if (null === $this->authority && \str_starts_with($this->path, '//')) { - throw new SyntaxError('If there is no authority the path `' . $this->path . '` cannot start with a `//`.'); - } - $pos = strpos($this->path, ':'); - if (null === $this->authority && null === $this->scheme && \false !== $pos && !str_contains(substr($this->path, 0, $pos), '/')) { - throw new SyntaxError('In absence of a scheme and an authority the first path segment cannot contain a colon (":") character.'); - } - $this->uri = null; - if (!match ($this->scheme) { - 'data' => $this->isUriWithSchemeAndPathOnly(), - 'file' => $this->isUriWithSchemeHostAndPathOnly(), - 'ftp', 'gopher' => $this->isNonEmptyHostUriWithoutFragmentAndQuery(), - 'http', 'https' => $this->isNonEmptyHostUri(), - 'ws', 'wss' => $this->isNonEmptyHostUriWithoutFragment(), - default => \true, - }) { - throw new SyntaxError('The uri `' . $this . '` is invalid for the `' . $this->scheme . '` scheme.'); - } - } - /** - * URI validation for URI schemes which allows only scheme and path components. - */ - private function isUriWithSchemeAndPathOnly() : bool - { - return null === $this->authority && null === $this->query && null === $this->fragment; - } - /** - * URI validation for URI schemes which allows only scheme, host and path components. - */ - private function isUriWithSchemeHostAndPathOnly() : bool - { - return null === $this->userInfo && null === $this->port && null === $this->query && null === $this->fragment && !('' != $this->scheme && null === $this->host); - } - /** - * URI validation for URI schemes which disallow the empty '' host. - */ - private function isNonEmptyHostUri() : bool - { - return '' !== $this->host && !(null !== $this->scheme && null === $this->host); - } - /** - * URI validation for URIs schemes which disallow the empty '' host - * and forbids the fragment component. - */ - private function isNonEmptyHostUriWithoutFragment() : bool - { - return $this->isNonEmptyHostUri() && null === $this->fragment; - } - /** - * URI validation for URIs schemes which disallow the empty '' host - * and forbids fragment and query components. - */ - private function isNonEmptyHostUriWithoutFragmentAndQuery() : bool - { - return $this->isNonEmptyHostUri() && null === $this->fragment && null === $this->query; - } - /** - * Generate the URI string representation from its components. - * - * @link https://tools.ietf.org/html/rfc3986#section-5.3 - */ - private function getUriString(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment) : string - { - if (null !== $scheme) { - $scheme = $scheme . ':'; - } - if (null !== $authority) { - $authority = '//' . $authority; - } - if (null !== $query) { - $query = '?' . $query; - } - if (null !== $fragment) { - $fragment = '#' . $fragment; - } - return $scheme . $authority . $path . $query . $fragment; - } - public function toString() : string - { - return $this->uri ??= $this->getUriString($this->scheme, $this->authority, $this->path, $this->query, $this->fragment); - } - /** - * {@inheritDoc} - */ - public function __toString() : string - { - return $this->toString(); - } - /** - * {@inheritDoc} - */ - public function jsonSerialize() : string - { - return $this->toString(); - } - /** - * @return ComponentMap - */ - public function getComponents() : array - { - [$user, $pass] = null !== $this->userInfo ? explode(':', $this->userInfo, 2) : [null, null]; - return ['scheme' => $this->scheme, 'user' => $user, 'pass' => $pass, 'host' => $this->host, 'port' => $this->port, 'path' => $this->path, 'query' => $this->query, 'fragment' => $this->fragment]; - } - /** - * {@inheritDoc} - */ - public function getScheme() : ?string - { - return $this->scheme; - } - /** - * {@inheritDoc} - */ - public function getAuthority() : ?string - { - return $this->authority; - } - /** - * {@inheritDoc} - */ - public function getUserInfo() : ?string - { - return $this->userInfo; - } - /** - * {@inheritDoc} - */ - public function getHost() : ?string - { - return $this->host; - } - /** - * {@inheritDoc} - */ - public function getPort() : ?int - { - return $this->port; - } - /** - * {@inheritDoc} - */ - public function getPath() : string - { - return match (\true) { - \str_starts_with($this->path, '//') => '/' . ltrim($this->path, '/'), - default => $this->path, - }; - } - /** - * {@inheritDoc} - */ - public function getQuery() : ?string - { - return $this->query; - } - /** - * {@inheritDoc} - */ - public function getFragment() : ?string - { - return $this->fragment; - } - /** - * {@inheritDoc} - */ - public function withScheme(Stringable|string|null $scheme) : UriInterface - { - $scheme = $this->formatScheme($this->filterString($scheme)); - if ($scheme === $this->scheme) { - return $this; - } - $clone = clone $this; - $clone->scheme = $scheme; - $clone->port = $clone->formatPort($clone->port); - $clone->authority = $clone->setAuthority(); - $clone->assertValidState(); - return $clone; - } - /** - * Filter a string. - * - * @throws SyntaxError if the submitted data cannot be converted to string - */ - private function filterString(Stringable|string|null $str) : ?string - { - $str = match (\true) { - $str instanceof UriComponentInterface => $str->value(), - null === $str => null, - default => (string) $str, - }; - return match (\true) { - null === $str => null, - 1 === preg_match(self::REGEXP_INVALID_CHARS, $str) => throw new SyntaxError('The component `' . $str . '` contains invalid characters.'), - default => $str, - }; - } - public function withUserInfo(Stringable|string|null $user, #[SensitiveParameter] Stringable|string|null $password = null) : UriInterface - { - $user_info = null; - $user = $this->filterString($user); - if (null !== $password) { - $password = $this->filterString($password); - } - if ('' !== $user) { - $user_info = $this->formatUserInfo($user, $password); - } - if ($user_info === $this->userInfo) { - return $this; - } - $clone = clone $this; - $clone->userInfo = $user_info; - $clone->authority = $clone->setAuthority(); - $clone->assertValidState(); - return $clone; - } - public function withHost(Stringable|string|null $host) : UriInterface - { - $host = $this->formatHost($this->filterString($host)); - if ($host === $this->host) { - return $this; - } - $clone = clone $this; - $clone->host = $host; - $clone->authority = $clone->setAuthority(); - $clone->assertValidState(); - return $clone; - } - public function withPort(int|null $port) : UriInterface - { - $port = $this->formatPort($port); - if ($port === $this->port) { - return $this; - } - $clone = clone $this; - $clone->port = $port; - $clone->authority = $clone->setAuthority(); - $clone->assertValidState(); - return $clone; - } - public function withPath(Stringable|string $path) : UriInterface - { - $path = $this->filterString($path); - if (null === $path) { - throw new SyntaxError('The path component cannot be null.'); - } - $path = $this->formatPath($path); - if ($path === $this->path) { - return $this; - } - $clone = clone $this; - $clone->path = $path; - $clone->assertValidState(); - return $clone; - } - public function withQuery(Stringable|string|null $query) : UriInterface - { - $query = Encoder::encodeQueryOrFragment($this->filterString($query)); - if ($query === $this->query) { - return $this; - } - $clone = clone $this; - $clone->query = $query; - $clone->assertValidState(); - return $clone; - } - public function withFragment(Stringable|string|null $fragment) : UriInterface - { - $fragment = Encoder::encodeQueryOrFragment($this->filterString($fragment)); - if ($fragment === $this->fragment) { - return $this; - } - $clone = clone $this; - $clone->fragment = $fragment; - $clone->assertValidState(); - return $clone; - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::new() - */ - public static function createFromString(Stringable|string $uri = '') : self - { - return self::new($uri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::fromComponents() - * - * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result - */ - public static function createFromComponents(array $components = []) : self - { - return self::fromComponents($components); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @param resource|null $context - * - * @throws MissingFeature If ext/fileinfo is not installed - * @throws SyntaxError If the file does not exist or is not readable - * @see Uri::fromFileContents() - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - */ - public static function createFromDataPath(string $path, $context = null) : self - { - return self::fromFileContents($path, $context); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::fromBaseUri() - * - * Creates a new instance from a URI and a Base URI. - * - * The returned URI must be absolute. - */ - public static function createFromBaseUri(Stringable|UriInterface|string $uri, Stringable|UriInterface|string|null $baseUri = null) : UriInterface - { - return self::fromBaseUri($uri, $baseUri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::fromUnixPath() - * - * Create a new instance from a Unix path string. - */ - public static function createFromUnixPath(string $uri = '') : self - { - return self::fromUnixPath($uri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::fromWindowsPath() - * - * Create a new instance from a local Windows path string. - */ - public static function createFromWindowsPath(string $uri = '') : self - { - return self::fromWindowsPath($uri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::new() - * - * Create a new instance from a URI object. - */ - public static function createFromUri(Psr7UriInterface|UriInterface $uri) : self - { - return self::new($uri); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Uri::fromServer() - * - * Create a new instance from the environment. - */ - public static function createFromServer(array $server) : self - { - return self::fromServer($server); - } -} diff --git a/dependencies/league/uri/UriInfo.php b/dependencies/league/uri/UriInfo.php deleted file mode 100644 index 53791c0..0000000 --- a/dependencies/league/uri/UriInfo.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriInterface; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface as Psr7UriInterface; -/** - * @deprecated since version 7.0.0 - * @codeCoverageIgnore - * @see BaseUri - */ -final class UriInfo -{ - /** - * @codeCoverageIgnore - */ - private function __construct() - { - } - /** - * Tells whether the URI represents an absolute URI. - */ - public static function isAbsolute(Psr7UriInterface|UriInterface $uri) : bool - { - return BaseUri::from($uri)->isAbsolute(); - } - /** - * Tell whether the URI represents a network path. - */ - public static function isNetworkPath(Psr7UriInterface|UriInterface $uri) : bool - { - return BaseUri::from($uri)->isNetworkPath(); - } - /** - * Tells whether the URI represents an absolute path. - */ - public static function isAbsolutePath(Psr7UriInterface|UriInterface $uri) : bool - { - return BaseUri::from($uri)->isAbsolutePath(); - } - /** - * Tell whether the URI represents a relative path. - * - */ - public static function isRelativePath(Psr7UriInterface|UriInterface $uri) : bool - { - return BaseUri::from($uri)->isRelativePath(); - } - /** - * Tells whether both URI refers to the same document. - */ - public static function isSameDocument(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri) : bool - { - return BaseUri::from($baseUri)->isSameDocument($uri); - } - /** - * Returns the URI origin property as defined by WHATWG URL living standard. - * - * {@see https://url.spec.whatwg.org/#origin} - * - * For URI without a special scheme the method returns null - * For URI with the file scheme the method will return null (as this is left to the implementation decision) - * For URI with a special scheme the method returns the scheme followed by its authority (without the userinfo part) - */ - public static function getOrigin(Psr7UriInterface|UriInterface $uri) : ?string - { - return BaseUri::from($uri)->origin()?->__toString(); - } - /** - * Tells whether two URI do not share the same origin. - * - * @see UriInfo::getOrigin() - */ - public static function isCrossOrigin(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri) : bool - { - return BaseUri::from($baseUri)->isCrossOrigin($uri); - } -} diff --git a/dependencies/league/uri/UriResolver.php b/dependencies/league/uri/UriResolver.php deleted file mode 100644 index 5802ddf..0000000 --- a/dependencies/league/uri/UriResolver.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriInterface; -use WP_Ultimo\Dependencies\Psr\Http\Message\UriInterface as Psr7UriInterface; -/** - * @deprecated since version 7.0.0 - * @codeCoverageIgnore - * @see BaseUri - */ -final class UriResolver -{ - /** - * Resolves a URI against a base URI using RFC3986 rules. - * - * This method MUST retain the state of the submitted URI instance, and return - * a URI instance of the same type that contains the applied modifications. - * - * This method MUST be transparent when dealing with error and exceptions. - * It MUST not alter or silence them apart from validating its own parameters. - */ - public static function resolve(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri) : Psr7UriInterface|UriInterface - { - return BaseUri::from($baseUri)->resolve($uri)->getUri(); - } - /** - * Relativizes a URI according to a base URI. - * - * This method MUST retain the state of the submitted URI instance, and return - * a URI instance of the same type that contains the applied modifications. - * - * This method MUST be transparent when dealing with error and exceptions. - * It MUST not alter or silence them apart from validating its own parameters. - */ - public static function relativize(Psr7UriInterface|UriInterface $uri, Psr7UriInterface|UriInterface $baseUri) : Psr7UriInterface|UriInterface - { - return BaseUri::from($baseUri)->relativize($uri)->getUri(); - } -} diff --git a/dependencies/league/uri/UriTemplate.php b/dependencies/league/uri/UriTemplate.php deleted file mode 100644 index 82c04e0..0000000 --- a/dependencies/league/uri/UriTemplate.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri; - -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriException; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriInterface; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use WP_Ultimo\Dependencies\League\Uri\UriTemplate\Template; -use WP_Ultimo\Dependencies\League\Uri\UriTemplate\TemplateCanNotBeExpanded; -use WP_Ultimo\Dependencies\League\Uri\UriTemplate\VariableBag; -use Stringable; -use function array_fill_keys; -use function array_key_exists; -/** - * Defines the URI Template syntax and the process for expanding a URI Template into a URI reference. - * - * @link https://tools.ietf.org/html/rfc6570 - * @package League\Uri - * @author Ignace Nyamagana Butera - * @since 6.1.0 - */ -final class UriTemplate -{ - private readonly Template $template; - private readonly VariableBag $defaultVariables; - /** - * @throws SyntaxError if the template syntax is invalid - * @throws TemplateCanNotBeExpanded if the template or the variables are invalid - */ - public function __construct(Stringable|string $template, iterable $defaultVariables = []) - { - $this->template = $template instanceof Template ? $template : Template::new($template); - $this->defaultVariables = $this->filterVariables($defaultVariables); - } - private function filterVariables(iterable $variables) : VariableBag - { - if (!$variables instanceof VariableBag) { - $variables = new VariableBag($variables); - } - return $variables->filter(fn($value, string|int $name) => array_key_exists($name, array_fill_keys($this->template->variableNames, 1))); - } - public function getTemplate() : string - { - return $this->template->value; - } - /** - * @return array - */ - public function getVariableNames() : array - { - return $this->template->variableNames; - } - public function getDefaultVariables() : array - { - return \iterator_to_array($this->defaultVariables); - } - /** - * Returns a new instance with the updated default variables. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the modified default variables. - * - * If present, variables whose name is not part of the current template - * possible variable names are removed. - * - * @throws TemplateCanNotBeExpanded if the variables are invalid - */ - public function withDefaultVariables(iterable $defaultVariables) : self - { - $defaultVariables = $this->filterVariables($defaultVariables); - if ($defaultVariables == $this->defaultVariables) { - return $this; - } - return new self($this->template, $defaultVariables); - } - /** - * @throws TemplateCanNotBeExpanded if the variables are invalid - * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance - */ - public function expand(iterable $variables = []) : UriInterface - { - return Uri::new($this->template->expand($this->filterVariables($variables)->replace($this->defaultVariables))); - } - /** - * @throws TemplateCanNotBeExpanded if the variables are invalid or missing - * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance - */ - public function expandOrFail(iterable $variables = []) : UriInterface - { - return Uri::new($this->template->expandOrFail($this->filterVariables($variables)->replace($this->defaultVariables))); - } -} diff --git a/dependencies/league/uri/UriTemplate/Expression.php b/dependencies/league/uri/UriTemplate/Expression.php deleted file mode 100644 index e2d3f18..0000000 --- a/dependencies/league/uri/UriTemplate/Expression.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\UriTemplate; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use Stringable; -use function array_filter; -use function array_map; -use function array_unique; -use function explode; -use function implode; -/** - * @internal The class exposes the internal representation of an Expression and its usage - * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.2 - */ -final class Expression -{ - /** @var array */ - private readonly array $varSpecifiers; - /** @var array */ - public readonly array $variableNames; - public readonly string $value; - private function __construct(public readonly Operator $operator, VarSpecifier ...$varSpecifiers) - { - $this->varSpecifiers = $varSpecifiers; - $this->variableNames = array_unique(array_map(static fn(VarSpecifier $varSpecifier): string => $varSpecifier->name, $varSpecifiers)); - $this->value = '{' . $operator->value . implode(',', array_map(static fn(VarSpecifier $varSpecifier): string => $varSpecifier->toString(), $varSpecifiers)) . '}'; - } - /** - * @throws SyntaxError if the expression is invalid - */ - public static function new(Stringable|string $expression) : self - { - $parts = Operator::parseExpression($expression); - return new Expression($parts['operator'], ...array_map(static fn(string $varSpec): VarSpecifier => VarSpecifier::new($varSpec), explode(',', $parts['variables']))); - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @throws SyntaxError if the expression is invalid - * @see Expression::new() - * - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - */ - public static function createFromString(Stringable|string $expression) : self - { - return self::new($expression); - } - public function expand(VariableBag $variables) : string - { - $expanded = implode($this->operator->separator(), array_filter(array_map(fn(VarSpecifier $varSpecifier): string => $this->operator->expand($varSpecifier, $variables), $this->varSpecifiers), static fn($value): bool => '' !== $value)); - return match ('') { - $expanded => '', - default => $this->operator->first() . $expanded, - }; - } -} diff --git a/dependencies/league/uri/UriTemplate/Operator.php b/dependencies/league/uri/UriTemplate/Operator.php deleted file mode 100644 index d91340c..0000000 --- a/dependencies/league/uri/UriTemplate/Operator.php +++ /dev/null @@ -1,193 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\UriTemplate; - -use WP_Ultimo\Dependencies\League\Uri\Encoder; -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use Stringable; -use function implode; -use function is_array; -use function preg_match; -use function rawurlencode; -use function str_contains; -use function substr; -/** - * Processing behavior according to the expression type operator. - * - * @internal The class exposes the internal representation of an Operator and its usage - * - * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.2 - * @link https://tools.ietf.org/html/rfc6570#appendix-A - */ -enum Operator : string -{ - /** - * Expression regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc6570#section-2.2 - */ - private const REGEXP_EXPRESSION = '/^\\{(?:(?[\\.\\/;\\?&\\=,\\!@\\|\\+#])?(?[^\\}]*))\\}$/'; - /** - * Reserved Operator characters. - * - * @link https://tools.ietf.org/html/rfc6570#section-2.2 - */ - private const RESERVED_OPERATOR = '=,!@|'; - case None = ''; - case ReservedChars = '+'; - case Label = '.'; - case Path = '/'; - case PathParam = ';'; - case Query = '?'; - case QueryPair = '&'; - case Fragment = '#'; - public function first() : string - { - return match ($this) { - self::None, self::ReservedChars => '', - default => $this->value, - }; - } - public function separator() : string - { - return match ($this) { - self::None, self::ReservedChars, self::Fragment => ',', - self::Query, self::QueryPair => '&', - default => $this->value, - }; - } - public function isNamed() : bool - { - return match ($this) { - self::Query, self::PathParam, self::QueryPair => \true, - default => \false, - }; - } - /** - * Removes percent encoding on reserved characters (used with + and # modifiers). - */ - public function decode(string $var) : string - { - return match ($this) { - Operator::ReservedChars, Operator::Fragment => (string) Encoder::encodeQueryOrFragment($var), - default => rawurlencode($var), - }; - } - /** - * @throws SyntaxError if the expression is invalid - * @throws SyntaxError if the operator used in the expression is invalid - * @throws SyntaxError if the contained variable specifiers are invalid - * - * @return array{operator:Operator, variables:string} - */ - public static function parseExpression(Stringable|string $expression) : array - { - $expression = (string) $expression; - if (1 !== preg_match(self::REGEXP_EXPRESSION, $expression, $parts)) { - throw new SyntaxError('The expression "' . $expression . '" is invalid.'); - } - /** @var array{operator:string, variables:string} $parts */ - $parts = $parts + ['operator' => '']; - if ('' !== $parts['operator'] && str_contains(self::RESERVED_OPERATOR, $parts['operator'])) { - throw new SyntaxError('The operator used in the expression "' . $expression . '" is reserved.'); - } - return ['operator' => self::from($parts['operator']), 'variables' => $parts['variables']]; - } - /** - * Replaces an expression with the given variables. - * - * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied - * @throws TemplateCanNotBeExpanded if the variables contains nested array values - */ - public function expand(VarSpecifier $varSpecifier, VariableBag $variables) : string - { - $value = $variables->fetch($varSpecifier->name); - if (null === $value) { - return ''; - } - [$expanded, $actualQuery] = $this->inject($value, $varSpecifier); - if (!$actualQuery) { - return $expanded; - } - if ('&' !== $this->separator() && '' === $expanded) { - return $varSpecifier->name; - } - return $varSpecifier->name . '=' . $expanded; - } - /** - * @param string|array $value - * - * @return array{0:string, 1:bool} - */ - private function inject(array|string $value, VarSpecifier $varSpec) : array - { - if (is_array($value)) { - return $this->replaceList($value, $varSpec); - } - if (':' === $varSpec->modifier) { - $value = substr($value, 0, $varSpec->position); - } - return [$this->decode($value), $this->isNamed()]; - } - /** - * Expands an expression using a list of values. - * - * @param array $value - * - * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied - * - * @return array{0:string, 1:bool} - */ - private function replaceList(array $value, VarSpecifier $varSpec) : array - { - if (':' === $varSpec->modifier) { - throw TemplateCanNotBeExpanded::dueToUnableToProcessValueListWithPrefix($varSpec->name); - } - if ([] === $value) { - return ['', \false]; - } - $pairs = []; - $isList = \array_is_list($value); - $useQuery = $this->isNamed(); - foreach ($value as $key => $var) { - if (!$isList) { - $key = rawurlencode((string) $key); - } - $var = $this->decode($var); - if ('*' === $varSpec->modifier) { - if (!$isList) { - $var = $key . '=' . $var; - } elseif ($key > 0 && $useQuery) { - $var = $varSpec->name . '=' . $var; - } - } - $pairs[$key] = $var; - } - if ('*' === $varSpec->modifier) { - if (!$isList) { - // Don't prepend the value name when using the `explode` modifier with an associative array. - $useQuery = \false; - } - return [implode($this->separator(), $pairs), $useQuery]; - } - if (!$isList) { - // When an associative array is encountered and the `explode` modifier is not set, then - // the result must be a comma separated list of keys followed by their respective values. - $retVal = []; - foreach ($pairs as $offset => $data) { - $retVal[$offset] = $offset . ',' . $data; - } - $pairs = $retVal; - } - return [implode(',', $pairs), $useQuery]; - } -} diff --git a/dependencies/league/uri/UriTemplate/Template.php b/dependencies/league/uri/UriTemplate/Template.php deleted file mode 100644 index 9836f1d..0000000 --- a/dependencies/league/uri/UriTemplate/Template.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\UriTemplate; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use Stringable; -use function array_filter; -use function array_map; -use function array_reduce; -use function array_unique; -use function preg_match_all; -use function preg_replace; -use function str_contains; -use function str_replace; -use const PREG_SET_ORDER; -/** - * @internal The class exposes the internal representation of a Template and its usage - */ -final class Template implements Stringable -{ - /** - * Expression regular expression pattern. - */ - private const REGEXP_EXPRESSION_DETECTOR = '/(?\\{[^}]*})/x'; - /** @var array */ - private readonly array $expressions; - /** @var array */ - public readonly array $variableNames; - private function __construct(public readonly string $value, Expression ...$expressions) - { - $this->expressions = $expressions; - $this->variableNames = array_unique(\array_merge(...array_map(static fn(Expression $expression): array => $expression->variableNames, $expressions))); - } - /** - * @throws SyntaxError if the template contains invalid expressions - * @throws SyntaxError if the template contains invalid variable specification - */ - public static function new(Stringable|string $template) : self - { - $template = (string) $template; - /** @var string $remainder */ - $remainder = preg_replace(self::REGEXP_EXPRESSION_DETECTOR, '', $template); - if (str_contains($remainder, '{') || str_contains($remainder, '}')) { - throw new SyntaxError('The template "' . $template . '" contains invalid expressions.'); - } - preg_match_all(self::REGEXP_EXPRESSION_DETECTOR, $template, $founds, PREG_SET_ORDER); - return new self($template, ...\array_values(array_reduce($founds, function (array $carry, array $found) : array { - if (!isset($carry[$found['expression']])) { - $carry[$found['expression']] = Expression::new($found['expression']); - } - return $carry; - }, []))); - } - /** - * @throws TemplateCanNotBeExpanded if the variables are invalid - */ - public function expand(iterable $variables = []) : string - { - if (!$variables instanceof VariableBag) { - $variables = new VariableBag($variables); - } - return $this->expandAll($variables); - } - /** - * @throws TemplateCanNotBeExpanded if the variables are invalid or missing - */ - public function expandOrFail(iterable $variables = []) : string - { - if (!$variables instanceof VariableBag) { - $variables = new VariableBag($variables); - } - $missing = array_filter($this->variableNames, fn(string $name): bool => !isset($variables[$name])); - if ([] !== $missing) { - throw TemplateCanNotBeExpanded::dueToMissingVariables(...$missing); - } - return $this->expandAll($variables); - } - private function expandAll(VariableBag $variables) : string - { - return array_reduce($this->expressions, fn(string $uri, Expression $expr): string => str_replace($expr->value, $expr->expand($variables), $uri), $this->value); - } - public function __toString() : string - { - return $this->value; - } - /** - * DEPRECATION WARNING! This method will be removed in the next major point release. - * - * @throws SyntaxError if the template contains invalid expressions - * @throws SyntaxError if the template contains invalid variable specification - * @deprecated Since version 7.0.0 - * @codeCoverageIgnore - * @see Template::new() - * - * Create a new instance from a string. - * - */ - public static function createFromString(Stringable|string $template) : self - { - return self::new($template); - } -} diff --git a/dependencies/league/uri/UriTemplate/TemplateCanNotBeExpanded.php b/dependencies/league/uri/UriTemplate/TemplateCanNotBeExpanded.php deleted file mode 100644 index e4d8c1d..0000000 --- a/dependencies/league/uri/UriTemplate/TemplateCanNotBeExpanded.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\UriTemplate; - -use InvalidArgumentException; -use WP_Ultimo\Dependencies\League\Uri\Contracts\UriException; -class TemplateCanNotBeExpanded extends InvalidArgumentException implements UriException -{ - public readonly array $variablesNames; - public function __construct(string $message = '', string ...$variableNames) - { - parent::__construct($message, 0, null); - $this->variablesNames = $variableNames; - } - public static function dueToUnableToProcessValueListWithPrefix(string $variableName) : self - { - return new self('The ":" modifier cannot be applied on "' . $variableName . '" since it is a list of values.', $variableName); - } - public static function dueToNestedListOfValue(string $variableName) : self - { - return new self('The "' . $variableName . '" cannot be a nested list.', $variableName); - } - public static function dueToMissingVariables(string ...$variableNames) : self - { - return new self('The following required variables are missing: `' . \implode('`, `', $variableNames) . '`.', ...$variableNames); - } -} diff --git a/dependencies/league/uri/UriTemplate/VarSpecifier.php b/dependencies/league/uri/UriTemplate/VarSpecifier.php deleted file mode 100644 index 182afe1..0000000 --- a/dependencies/league/uri/UriTemplate/VarSpecifier.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\UriTemplate; - -use WP_Ultimo\Dependencies\League\Uri\Exceptions\SyntaxError; -use function preg_match; -/** - * @internal The class exposes the internal representation of a Var Specifier - * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.3 - */ -final class VarSpecifier -{ - /** - * Variables specification regular expression pattern. - * - * @link https://tools.ietf.org/html/rfc6570#section-2.3 - */ - private const REGEXP_VARSPEC = '/^(?(?:[A-z0-9_\\.]|%[0-9a-fA-F]{2})+)(?\\:(?\\d+)|\\*)?$/'; - private const MODIFIER_POSITION_MAX_POSITION = 10000; - private function __construct(public readonly string $name, public readonly string $modifier, public readonly int $position) - { - } - public static function new(string $specification) : self - { - if (1 !== preg_match(self::REGEXP_VARSPEC, $specification, $parsed)) { - throw new SyntaxError('The variable specification "' . $specification . '" is invalid.'); - } - $properties = ['name' => $parsed['name'], 'modifier' => $parsed['modifier'] ?? '', 'position' => $parsed['position'] ?? '']; - if ('' !== $properties['position']) { - $properties['position'] = (int) $properties['position']; - $properties['modifier'] = ':'; - } - if ('' === $properties['position']) { - $properties['position'] = 0; - } - if (self::MODIFIER_POSITION_MAX_POSITION <= $properties['position']) { - throw new SyntaxError('The variable specification "' . $specification . '" is invalid the position modifier must be lower than 10000.'); - } - return new self($properties['name'], $properties['modifier'], $properties['position']); - } - public function toString() : string - { - return $this->name . $this->modifier . match (\true) { - 0 < $this->position => $this->position, - default => '', - }; - } -} diff --git a/dependencies/league/uri/UriTemplate/VariableBag.php b/dependencies/league/uri/UriTemplate/VariableBag.php deleted file mode 100644 index 9302d2d..0000000 --- a/dependencies/league/uri/UriTemplate/VariableBag.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -declare (strict_types=1); -namespace WP_Ultimo\Dependencies\League\Uri\UriTemplate; - -use ArrayAccess; -use Closure; -use Countable; -use IteratorAggregate; -use Stringable; -use Traversable; -use function array_filter; -use function is_bool; -use function is_scalar; -use const ARRAY_FILTER_USE_BOTH; -/** - * @internal The class exposes the internal representation of variable bags - * - * @phpstan-type InputValue string|bool|int|float|array - * - * @implements ArrayAccess - * @implements IteratorAggregate - */ -final class VariableBag implements ArrayAccess, Countable, IteratorAggregate -{ - /** - * @var array> - */ - private array $variables = []; - /** - * @param iterable $variables - */ - public function __construct(iterable $variables = []) - { - foreach ($variables as $name => $value) { - $this->assign((string) $name, $value); - } - } - public function count() : int - { - return \count($this->variables); - } - public function getIterator() : Traversable - { - yield from $this->variables; - } - public function offsetExists(mixed $offset) : bool - { - return \array_key_exists($offset, $this->variables); - } - public function offsetUnset(mixed $offset) : void - { - unset($this->variables[$offset]); - } - public function offsetSet(mixed $offset, mixed $value) : void - { - $this->assign($offset, $value); - /* @phpstan-ignore-line */ - } - public function offsetGet(mixed $offset) : mixed - { - return $this->fetch($offset); - } - /** - * Tells whether the bag is empty or not. - */ - public function isEmpty() : bool - { - return [] === $this->variables; - } - /** - * Tells whether the bag is empty or not. - */ - public function isNotEmpty() : bool - { - return [] !== $this->variables; - } - /** - * Fetches the variable value if none found returns null. - * - * @return null|string|array - */ - public function fetch(string $name) : null|string|array - { - return $this->variables[$name] ?? null; - } - /** - * @param Stringable|InputValue $value - */ - public function assign(string $name, Stringable|string|bool|int|float|array|null $value) : void - { - $this->variables[$name] = $this->normalizeValue($value, $name, \true); - } - /** - * @param Stringable|InputValue $value - * - * @throws TemplateCanNotBeExpanded if the value contains nested list - */ - private function normalizeValue(Stringable|string|float|int|bool|array|null $value, string $name, bool $isNestedListAllowed) : array|string - { - return match (\true) { - is_bool($value) => \true === $value ? '1' : '0', - null === $value || is_scalar($value) || $value instanceof Stringable => (string) $value, - !$isNestedListAllowed => throw TemplateCanNotBeExpanded::dueToNestedListOfValue($name), - default => \array_map(fn($var): array|string => self::normalizeValue($var, $name, \false), $value), - }; - } - /** - * Replaces elements from passed variables into the current instance. - */ - public function replace(VariableBag $variables) : self - { - return new self($this->variables + $variables->variables); - } - /** - * Filters elements using the closure. - */ - public function filter(Closure $fn) : self - { - return new self(array_filter($this->variables, $fn, ARRAY_FILTER_USE_BOTH)); - } -} diff --git a/dependencies/mexitek/phpcolors/demo/demo.php b/dependencies/mexitek/phpcolors/demo/demo.php deleted file mode 100644 index b629ec0..0000000 --- a/dependencies/mexitek/phpcolors/demo/demo.php +++ /dev/null @@ -1,135 +0,0 @@ - - - - phpColors Demo - - - - -
-
phpColor Gradient #getHex(); -?>
-
Plain #getHex(); -?>
-
-
phpColor Gradient #getHex(); -?>
-
Plain #getHex(); -?>
-
-
phpColor Gradient #getHex(); -?>
-
Plain #getHex(); -?>
-
-
- phpColor Gradient with vintage browsers support #getHex(); -?> -
- - -5^|N{gT(5h4KqfGQ>`Bo6?f2mpXlM}+x(CZJMz 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 - * Info: http://mexitek.github.io/phpColors/ - * License: http://arlo.mit-license.org/ - */ -namespace WP_Ultimo\Dependencies\Mexitek\PHPColors; - -use Exception; -/** - * A color utility that helps manipulate HEX colors - */ -class Color -{ - /** - * @var string - */ - private $_hex; - /** - * @var array - */ - private $_hsl; - /** - * @var array - */ - private $_rgb; - /** - * Auto darkens/lightens by 10% for sexily-subtle gradients. - * Set this to FALSE to adjust automatic shade to be between given color - * and black (for darken) or white (for lighten) - */ - public const DEFAULT_ADJUST = 10; - /** - * Instantiates the class with a HEX value - * @param string $hex - * @throws Exception - */ - public function __construct(string $hex) - { - $color = self::sanitizeHex($hex); - $this->_hex = $color; - $this->_hsl = self::hexToHsl($color); - $this->_rgb = self::hexToRgb($color); - } - /** - * Given a HEX string returns a HSL array equivalent. - * @param string $color - * @return array HSL associative array - * @throws Exception - */ - public static function hexToHsl(string $color) : array - { - // Sanity check - $color = self::sanitizeHex($color); - // Convert HEX to DEC - $R = \hexdec($color[0] . $color[1]); - $G = \hexdec($color[2] . $color[3]); - $B = \hexdec($color[4] . $color[5]); - $HSL = array(); - $var_R = $R / 255; - $var_G = $G / 255; - $var_B = $B / 255; - $var_Min = \min($var_R, $var_G, $var_B); - $var_Max = \max($var_R, $var_G, $var_B); - $del_Max = $var_Max - $var_Min; - $L = ($var_Max + $var_Min) / 2; - if ($del_Max == 0) { - $H = 0; - $S = 0; - } else { - if ($L < 0.5) { - $S = $del_Max / ($var_Max + $var_Min); - } else { - $S = $del_Max / (2 - $var_Max - $var_Min); - } - $del_R = (($var_Max - $var_R) / 6 + $del_Max / 2) / $del_Max; - $del_G = (($var_Max - $var_G) / 6 + $del_Max / 2) / $del_Max; - $del_B = (($var_Max - $var_B) / 6 + $del_Max / 2) / $del_Max; - if ($var_R == $var_Max) { - $H = $del_B - $del_G; - } elseif ($var_G == $var_Max) { - $H = 1 / 3 + $del_R - $del_B; - } elseif ($var_B == $var_Max) { - $H = 2 / 3 + $del_G - $del_R; - } - if ($H < 0) { - $H++; - } - if ($H > 1) { - $H--; - } - } - $HSL['H'] = $H * 360; - $HSL['S'] = $S; - $HSL['L'] = $L; - return $HSL; - } - /** - * Given a HSL associative array returns the equivalent HEX string - * @param array $hsl - * @return string HEX string - * @throws Exception "Bad HSL Array" - */ - public static function hslToHex(array $hsl = array()) : string - { - // Make sure it's HSL - if (empty($hsl) || !isset($hsl["H"], $hsl["S"], $hsl["L"])) { - throw new Exception("Param was not an HSL array"); - } - list($H, $S, $L) = array($hsl['H'] / 360, $hsl['S'], $hsl['L']); - if ($S == 0) { - $r = $L * 255; - $g = $L * 255; - $b = $L * 255; - } else { - if ($L < 0.5) { - $var_2 = $L * (1 + $S); - } else { - $var_2 = $L + $S - $S * $L; - } - $var_1 = 2 * $L - $var_2; - $r = 255 * self::hueToRgb($var_1, $var_2, $H + 1 / 3); - $g = 255 * self::hueToRgb($var_1, $var_2, $H); - $b = 255 * self::hueToRgb($var_1, $var_2, $H - 1 / 3); - } - // Convert to hex - $r = \dechex(\round($r)); - $g = \dechex(\round($g)); - $b = \dechex(\round($b)); - // Make sure we get 2 digits for decimals - $r = \strlen("" . $r) === 1 ? "0" . $r : $r; - $g = \strlen("" . $g) === 1 ? "0" . $g : $g; - $b = \strlen("" . $b) === 1 ? "0" . $b : $b; - return $r . $g . $b; - } - /** - * Given a HEX string returns a RGB array equivalent. - * @param string $color - * @return array RGB associative array - * @throws Exception - */ - public static function hexToRgb(string $color) : array - { - // Sanity check - $color = self::sanitizeHex($color); - // Convert HEX to DEC - $R = \hexdec($color[0] . $color[1]); - $G = \hexdec($color[2] . $color[3]); - $B = \hexdec($color[4] . $color[5]); - $RGB['R'] = $R; - $RGB['G'] = $G; - $RGB['B'] = $B; - return $RGB; - } - /** - * Given an RGB associative array returns the equivalent HEX string - * @param array $rgb - * @return string Hex string - * @throws Exception "Bad RGB Array" - */ - public static function rgbToHex(array $rgb = array()) : string - { - // Make sure it's RGB - if (empty($rgb) || !isset($rgb["R"], $rgb["G"], $rgb["B"])) { - throw new Exception("Param was not an RGB array"); - } - // https://github.com/mexitek/phpColors/issues/25#issuecomment-88354815 - // Convert RGB to HEX - $hex[0] = \str_pad(\dechex((int) $rgb['R']), 2, '0', \STR_PAD_LEFT); - $hex[1] = \str_pad(\dechex((int) $rgb['G']), 2, '0', \STR_PAD_LEFT); - $hex[2] = \str_pad(\dechex((int) $rgb['B']), 2, '0', \STR_PAD_LEFT); - // Make sure that 2 digits are allocated to each color. - $hex[0] = \strlen($hex[0]) === 1 ? '0' . $hex[0] : $hex[0]; - $hex[1] = \strlen($hex[1]) === 1 ? '0' . $hex[1] : $hex[1]; - $hex[2] = \strlen($hex[2]) === 1 ? '0' . $hex[2] : $hex[2]; - return \implode('', $hex); - } - /** - * Given an RGB associative array, returns CSS string output. - * @param array $rgb - * @return string rgb(r,g,b) string - * @throws Exception "Bad RGB Array" - */ - public static function rgbToString(array $rgb = array()) : string - { - // Make sure it's RGB - if (empty($rgb) || !isset($rgb["R"], $rgb["G"], $rgb["B"])) { - throw new Exception("Param was not an RGB array"); - } - return 'rgb(' . $rgb['R'] . ', ' . $rgb['G'] . ', ' . $rgb['B'] . ')'; - } - /** - * Given a standard color name, return hex code - * - * @param string $color_name - * @return string - */ - public static function nameToHex(string $color_name) : string - { - $colors = array('aliceblue' => 'F0F8FF', 'antiquewhite' => 'FAEBD7', 'aqua' => '00FFFF', 'aquamarine' => '7FFFD4', 'azure' => 'F0FFFF', 'beige' => 'F5F5DC', 'bisque' => 'FFE4C4', 'black' => '000000', 'blanchedalmond' => 'FFEBCD', 'blue' => '0000FF', 'blueviolet' => '8A2BE2', 'brown' => 'A52A2A', 'burlywood' => 'DEB887', 'cadetblue' => '5F9EA0', 'chartreuse' => '7FFF00', 'chocolate' => 'D2691E', 'coral' => 'FF7F50', 'cornflowerblue' => '6495ED', 'cornsilk' => 'FFF8DC', 'crimson' => 'DC143C', 'cyan' => '00FFFF', 'darkblue' => '00008B', 'darkcyan' => '008B8B', 'darkgoldenrod' => 'B8860B', 'darkgray' => 'A9A9A9', 'darkgreen' => '006400', 'darkgrey' => 'A9A9A9', 'darkkhaki' => 'BDB76B', 'darkmagenta' => '8B008B', 'darkolivegreen' => '556B2F', 'darkorange' => 'FF8C00', 'darkorchid' => '9932CC', 'darkred' => '8B0000', 'darksalmon' => 'E9967A', 'darkseagreen' => '8FBC8F', 'darkslateblue' => '483D8B', 'darkslategray' => '2F4F4F', 'darkslategrey' => '2F4F4F', 'darkturquoise' => '00CED1', 'darkviolet' => '9400D3', 'deeppink' => 'FF1493', 'deepskyblue' => '00BFFF', 'dimgray' => '696969', 'dimgrey' => '696969', 'dodgerblue' => '1E90FF', 'firebrick' => 'B22222', 'floralwhite' => 'FFFAF0', 'forestgreen' => '228B22', 'fuchsia' => 'FF00FF', 'gainsboro' => 'DCDCDC', 'ghostwhite' => 'F8F8FF', 'gold' => 'FFD700', 'goldenrod' => 'DAA520', 'gray' => '808080', 'green' => '008000', 'greenyellow' => 'ADFF2F', 'grey' => '808080', 'honeydew' => 'F0FFF0', 'hotpink' => 'FF69B4', 'indianred' => 'CD5C5C', 'indigo' => '4B0082', 'ivory' => 'FFFFF0', 'khaki' => 'F0E68C', 'lavender' => 'E6E6FA', 'lavenderblush' => 'FFF0F5', 'lawngreen' => '7CFC00', 'lemonchiffon' => 'FFFACD', 'lightblue' => 'ADD8E6', 'lightcoral' => 'F08080', 'lightcyan' => 'E0FFFF', 'lightgoldenrodyellow' => 'FAFAD2', 'lightgray' => 'D3D3D3', 'lightgreen' => '90EE90', 'lightgrey' => 'D3D3D3', 'lightpink' => 'FFB6C1', 'lightsalmon' => 'FFA07A', 'lightseagreen' => '20B2AA', 'lightskyblue' => '87CEFA', 'lightslategray' => '778899', 'lightslategrey' => '778899', 'lightsteelblue' => 'B0C4DE', 'lightyellow' => 'FFFFE0', 'lime' => '00FF00', 'limegreen' => '32CD32', 'linen' => 'FAF0E6', 'magenta' => 'FF00FF', 'maroon' => '800000', 'mediumaquamarine' => '66CDAA', 'mediumblue' => '0000CD', 'mediumorchid' => 'BA55D3', 'mediumpurple' => '9370D0', 'mediumseagreen' => '3CB371', 'mediumslateblue' => '7B68EE', 'mediumspringgreen' => '00FA9A', 'mediumturquoise' => '48D1CC', 'mediumvioletred' => 'C71585', 'midnightblue' => '191970', 'mintcream' => 'F5FFFA', 'mistyrose' => 'FFE4E1', 'moccasin' => 'FFE4B5', 'navajowhite' => 'FFDEAD', 'navy' => '000080', 'oldlace' => 'FDF5E6', 'olive' => '808000', 'olivedrab' => '6B8E23', 'orange' => 'FFA500', 'orangered' => 'FF4500', 'orchid' => 'DA70D6', 'palegoldenrod' => 'EEE8AA', 'palegreen' => '98FB98', 'paleturquoise' => 'AFEEEE', 'palevioletred' => 'DB7093', 'papayawhip' => 'FFEFD5', 'peachpuff' => 'FFDAB9', 'peru' => 'CD853F', 'pink' => 'FFC0CB', 'plum' => 'DDA0DD', 'powderblue' => 'B0E0E6', 'purple' => '800080', 'red' => 'FF0000', 'rosybrown' => 'BC8F8F', 'royalblue' => '4169E1', 'saddlebrown' => '8B4513', 'salmon' => 'FA8072', 'sandybrown' => 'F4A460', 'seagreen' => '2E8B57', 'seashell' => 'FFF5EE', 'sienna' => 'A0522D', 'silver' => 'C0C0C0', 'skyblue' => '87CEEB', 'slateblue' => '6A5ACD', 'slategray' => '708090', 'slategrey' => '708090', 'snow' => 'FFFAFA', 'springgreen' => '00FF7F', 'steelblue' => '4682B4', 'tan' => 'D2B48C', 'teal' => '008080', 'thistle' => 'D8BFD8', 'tomato' => 'FF6347', 'turquoise' => '40E0D0', 'violet' => 'EE82EE', 'wheat' => 'F5DEB3', 'white' => 'FFFFFF', 'whitesmoke' => 'F5F5F5', 'yellow' => 'FFFF00', 'yellowgreen' => '9ACD32'); - $color_name = \strtolower($color_name); - if (isset($colors[$color_name])) { - return '#' . $colors[$color_name]; - } - return $color_name; - } - /** - * Given a HEX value, returns a darker color. If no desired amount provided, then the color halfway between - * given HEX and black will be returned. - * @param int $amount - * @return string Darker HEX value - * @throws Exception - */ - public function darken(int $amount = self::DEFAULT_ADJUST) : string - { - // Darken - $darkerHSL = $this->darkenHsl($this->_hsl, $amount); - // Return as HEX - return self::hslToHex($darkerHSL); - } - /** - * Given a HEX value, returns a lighter color. If no desired amount provided, then the color halfway between - * given HEX and white will be returned. - * @param int $amount - * @return string Lighter HEX value - * @throws Exception - */ - public function lighten(int $amount = self::DEFAULT_ADJUST) : string - { - // Lighten - $lighterHSL = $this->lightenHsl($this->_hsl, $amount); - // Return as HEX - return self::hslToHex($lighterHSL); - } - /** - * Given a HEX value, returns a mixed color. If no desired amount provided, then the color mixed by this ratio - * @param string $hex2 Secondary HEX value to mix with - * @param int $amount = -100..0..+100 - * @return string mixed HEX value - * @throws Exception - */ - public function mix(string $hex2, int $amount = 0) : string - { - $rgb2 = self::hexToRgb($hex2); - $mixed = $this->mixRgb($this->_rgb, $rgb2, $amount); - // Return as HEX - return self::rgbToHex($mixed); - } - /** - * Creates an array with two shades that can be used to make a gradient - * @param int $amount Optional percentage amount you want your contrast color - * @return array An array with a 'light' and 'dark' index - * @throws Exception - */ - public function makeGradient(int $amount = self::DEFAULT_ADJUST) : array - { - // Decide which color needs to be made - if ($this->isLight()) { - $lightColor = $this->_hex; - $darkColor = $this->darken($amount); - } else { - $lightColor = $this->lighten($amount); - $darkColor = $this->_hex; - } - // Return our gradient array - return array("light" => $lightColor, "dark" => $darkColor); - } - /** - * Returns whether or not given color is considered "light" - * @param string|bool $color - * @param int $lighterThan - * @return boolean - */ - public function isLight($color = \false, int $lighterThan = 130) : bool - { - // Get our color - $color = $color ? $color : $this->_hex; - // Calculate straight from rbg - $r = \hexdec($color[0] . $color[1]); - $g = \hexdec($color[2] . $color[3]); - $b = \hexdec($color[4] . $color[5]); - return ($r * 299 + $g * 587 + $b * 114) / 1000 > $lighterThan; - } - /** - * Returns whether or not a given color is considered "dark" - * @param string|bool $color - * @param int $darkerThan - * @return boolean - */ - public function isDark($color = \false, int $darkerThan = 130) : bool - { - // Get our color - $color = $color ? $color : $this->_hex; - // Calculate straight from rbg - $r = \hexdec($color[0] . $color[1]); - $g = \hexdec($color[2] . $color[3]); - $b = \hexdec($color[4] . $color[5]); - return ($r * 299 + $g * 587 + $b * 114) / 1000 <= $darkerThan; - } - /** - * Returns the complimentary color - * @return string Complementary hex color - * @throws Exception - */ - public function complementary() : string - { - // Get our HSL - $hsl = $this->_hsl; - // Adjust Hue 180 degrees - $hsl['H'] += $hsl['H'] > 180 ? -180 : 180; - // Return the new value in HEX - return self::hslToHex($hsl); - } - /** - * Returns the HSL array of your color - */ - public function getHsl() : array - { - return $this->_hsl; - } - /** - * Returns your original color - */ - public function getHex() : string - { - return $this->_hex; - } - /** - * Returns the RGB array of your color - */ - public function getRgb() : array - { - return $this->_rgb; - } - /** - * Returns the cross browser CSS3 gradient - * @param int $amount Optional: percentage amount to light/darken the gradient - * @param boolean $vintageBrowsers Optional: include vendor prefixes for browsers that almost died out already - * @param string $prefix Optional: prefix for every lines - * @param string $suffix Optional: suffix for every lines - * @return string CSS3 gradient for chrome, safari, firefox, opera and IE10 - * @throws Exception - * @link http://caniuse.com/css-gradients Resource for the browser support - */ - public function getCssGradient($amount = self::DEFAULT_ADJUST, $vintageBrowsers = \false, $suffix = "", $prefix = "") : string - { - // Get the recommended gradient - $g = $this->makeGradient($amount); - $css = ""; - /* fallback/image non-cover color */ - $css .= "{$prefix}background-color: #" . $this->_hex . ";{$suffix}"; - /* IE Browsers */ - $css .= "{$prefix}filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#" . $g['light'] . "', endColorstr='#" . $g['dark'] . "');{$suffix}"; - /* Safari 4+, Chrome 1-9 */ - if ($vintageBrowsers) { - $css .= "{$prefix}background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#" . $g['light'] . "), to(#" . $g['dark'] . "));{$suffix}"; - } - /* Safari 5.1+, Mobile Safari, Chrome 10+ */ - $css .= "{$prefix}background-image: -webkit-linear-gradient(top, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}"; - if ($vintageBrowsers) { - /* Firefox 3.6+ */ - $css .= "{$prefix}background-image: -moz-linear-gradient(top, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}"; - /* Opera 11.10+ */ - $css .= "{$prefix}background-image: -o-linear-gradient(top, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}"; - } - /* Unprefixed version (standards): FF 16+, IE10+, Chrome 26+, Safari 7+, Opera 12.1+ */ - $css .= "{$prefix}background-image: linear-gradient(to bottom, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}"; - // Return our CSS - return $css; - } - /** - * Darkens a given HSL array - * @param array $hsl - * @param int $amount - * @return array $hsl - */ - private function darkenHsl(array $hsl, int $amount = self::DEFAULT_ADJUST) : array - { - // Check if we were provided a number - if ($amount) { - $hsl['L'] = $hsl['L'] * 100 - $amount; - $hsl['L'] = $hsl['L'] < 0 ? 0 : $hsl['L'] / 100; - } else { - // We need to find out how much to darken - $hsl['L'] /= 2; - } - return $hsl; - } - /** - * Lightens a given HSL array - * @param array $hsl - * @param int $amount - * @return array - */ - private function lightenHsl(array $hsl, int $amount = self::DEFAULT_ADJUST) : array - { - // Check if we were provided a number - if ($amount) { - $hsl['L'] = $hsl['L'] * 100 + $amount; - $hsl['L'] = $hsl['L'] > 100 ? 1 : $hsl['L'] / 100; - } else { - // We need to find out how much to lighten - $hsl['L'] += (1 - $hsl['L']) / 2; - } - return $hsl; - } - /** - * Mix two RGB colors and return the resulting RGB color - * ported from http://phpxref.pagelines.com/nav.html?includes/class.colors.php.source.html - * @param array $rgb1 - * @param array $rgb2 - * @param int $amount ranged -100..0..+100 - * @return array - */ - private function mixRgb(array $rgb1, array $rgb2, int $amount = 0) : array - { - $r1 = ($amount + 100) / 100; - $r2 = 2 - $r1; - $rmix = ($rgb1['R'] * $r1 + $rgb2['R'] * $r2) / 2; - $gmix = ($rgb1['G'] * $r1 + $rgb2['G'] * $r2) / 2; - $bmix = ($rgb1['B'] * $r1 + $rgb2['B'] * $r2) / 2; - return array('R' => $rmix, 'G' => $gmix, 'B' => $bmix); - } - /** - * Given a Hue, returns corresponding RGB value - * @param float $v1 - * @param float $v2 - * @param float $vH - * @return float - */ - private static function hueToRgb(float $v1, float $v2, float $vH) : float - { - if ($vH < 0) { - ++$vH; - } - if ($vH > 1) { - --$vH; - } - if (6 * $vH < 1) { - return $v1 + ($v2 - $v1) * 6 * $vH; - } - if (2 * $vH < 1) { - return $v2; - } - if (3 * $vH < 2) { - return $v1 + ($v2 - $v1) * (2 / 3 - $vH) * 6; - } - return $v1; - } - /** - * Checks the HEX string for correct formatting and converts short format to long - * @param string $hex - * @return string - * @throws Exception - */ - private static function sanitizeHex(string $hex) : string - { - // Strip # sign if it is present - $color = \str_replace("#", "", $hex); - // Validate hex string - if (!\preg_match('/^[a-fA-F0-9]+$/', $color)) { - throw new Exception("HEX color does not match format"); - } - // Make sure it's 6 digits - if (\strlen($color) === 3) { - $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2]; - } elseif (\strlen($color) !== 6) { - throw new Exception("HEX color needs to be 6 or 3 digits long"); - } - return $color; - } - /** - * Converts object into its string representation - * @return string - */ - public function __toString() - { - return "#" . $this->getHex(); - } - /** - * @param string $name - * @return mixed|null - */ - public function __get(string $name) - { - switch (\strtolower($name)) { - case 'red': - case 'r': - return $this->_rgb["R"]; - case 'green': - case 'g': - return $this->_rgb["G"]; - case 'blue': - case 'b': - return $this->_rgb["B"]; - case 'hue': - case 'h': - return $this->_hsl["H"]; - case 'saturation': - case 's': - return $this->_hsl["S"]; - case 'lightness': - case 'l': - return $this->_hsl["L"]; - } - $trace = \debug_backtrace(); - \trigger_error('Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], \E_USER_NOTICE); - return null; - } - /** - * @param string $name - * @param mixed $value - * @throws Exception - */ - public function __set(string $name, $value) - { - switch (\strtolower($name)) { - case 'red': - case 'r': - $this->_rgb["R"] = $value; - $this->_hex = self::rgbToHex($this->_rgb); - $this->_hsl = self::hexToHsl($this->_hex); - break; - case 'green': - case 'g': - $this->_rgb["G"] = $value; - $this->_hex = self::rgbToHex($this->_rgb); - $this->_hsl = self::hexToHsl($this->_hex); - break; - case 'blue': - case 'b': - $this->_rgb["B"] = $value; - $this->_hex = self::rgbToHex($this->_rgb); - $this->_hsl = self::hexToHsl($this->_hex); - break; - case 'hue': - case 'h': - $this->_hsl["H"] = $value; - $this->_hex = self::hslToHex($this->_hsl); - $this->_rgb = self::hexToRgb($this->_hex); - break; - case 'saturation': - case 's': - $this->_hsl["S"] = $value; - $this->_hex = self::hslToHex($this->_hsl); - $this->_rgb = self::hexToRgb($this->_hex); - break; - case 'lightness': - case 'light': - case 'l': - $this->_hsl["L"] = $value; - $this->_hex = self::hslToHex($this->_hsl); - $this->_rgb = self::hexToRgb($this->_hex); - break; - } - } -} diff --git a/dependencies/mpdf/mpdf/CREDITS.txt b/dependencies/mpdf/mpdf/CREDITS.txt deleted file mode 100644 index d633b6b..0000000 --- a/dependencies/mpdf/mpdf/CREDITS.txt +++ /dev/null @@ -1,91 +0,0 @@ - - -/******************************************************************************* -* Software: FPDF * -* Version: 1.53 * -* Date: 2004-12-31 * -* Author: Olivier PLATHEY * -* License: Freeware * -* * -* You may use and modify this software as you wish. * -*******************************************************************************/ - -/******************************************************************************* -* HTML2FPDF is a php script to read a HTML text and generate a PDF file. * -* Copyright (C) 2004-2005 Renato Coelho * -* * -* html2fpdf.php, htmltoolkit.php * -*******************************************************************************/ - -CREDITS From HTML2FPDF: - --Olivier Plathey for the fpdf.php class [http://www.fpdf.org] --Damon Kohler for the Flowing Block script [mailto:damonkohler@yahoo.com] --Clément Lavoillotte for HTML-oriented FPDF idea --Yamasoft for the gif.php class [http://www.yamasoft.com/] --Jérôme Fenal for the _parsegif() function --"VIETCOM" for the PDFTable code [http://www.freepgs.com/vietcom/tool/pdftable/] [mailto:vncommando@yahoo.com] --Yukihiro O. for the SetDash() function [mailto:yukihiro_o@infoseek.jp] --Ron Korving for the WordWrap() function --Michel Poulain for the DisplayPreferences() function --Patrick Benny for the MultiCellBlt() function idea [no longer in use] --Seb for the _SetTextRendering() and SetTextOutline() functions [mailto:captainseb@wanadoo.fr] --MorphSoft for the colornames list idea --W3SCHOOLS for HTML-related reference info [http://www.w3schools.com/] - - - -/**************************************************************************** -* Software: FPDF_Protection * -* Version: 1.02 * -* Date: 2005/05/08 * -* Author: Klemen VODOPIVEC * -* License: Freeware * -* * -* You may use and modify this software as you wish as stated in original * -* FPDF package. * -****************************************************************************/ - -/**************************************************************************** -// FPDI - Version 1.2 -// -// Copyright 2004-2007 Setasign - Jan Slabon -// -// 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. -****************************************************************************/ - -/**************************************************************************** - * @copyright Khaled Al-Shamaa 2008 - * @link http://www.ar-php.org - * @author Khaled Al-Shamaa - * @desc Set of PHP5 / UTF-8 Classes developed to enhance Arabic web - * applications by providing set of tools includes stem-based searching, - * translitiration, soundex, Hijri calendar, charset detection and - * converter, spell numbers, keyboard language, Muslim prayer time, - * auto-summarization, and more... - * @package Arabic - * - * @version 1.8 released in Feb 15, 2009 - * - * @license LGPL -****************************************************************************/ - - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. -[http://www.opensource.org/licenses/lgpl-license.php] diff --git a/dependencies/mpdf/mpdf/data/CJKdata.php b/dependencies/mpdf/mpdf/data/CJKdata.php deleted file mode 100644 index 9657b8d..0000000 --- a/dependencies/mpdf/mpdf/data/CJKdata.php +++ /dev/null @@ -1,38 +0,0 @@ - 250, 33 => 250, 34 => 408, 35 => 668, 36 => 490, 37 => 875, 38 => 698, 39 => 250, 40 => 240, 41 => 240, 42 => 417, 43 => 667, 44 => 250, 45 => 313, 46 => 250, 47 => 520, 48 => 500, 49 => 500, 50 => 500, 51 => 500, 52 => 500, 53 => 500, 54 => 500, 55 => 500, 56 => 500, 57 => 500, 58 => 250, 59 => 250, 60 => 667, 61 => 667, 62 => 667, 63 => 396, 64 => 921, 65 => 677, 66 => 615, 67 => 719, 68 => 760, 69 => 625, 70 => 552, 71 => 771, 72 => 802, 73 => 354, 74 => 354, 75 => 781, 76 => 604, 77 => 927, 78 => 750, 79 => 823, 80 => 563, 81 => 823, 82 => 729, 83 => 542, 84 => 698, 85 => 771, 86 => 729, 87 => 948, 88 => 771, 89 => 677, 90 => 635, 91 => 344, 92 => 520, 93 => 344, 94 => 469, 95 => 500, 96 => 250, 97 => 469, 98 => 521, 99 => 427, 100 => 521, 101 => 438, 102 => 271, 103 => 469, 104 => 531, 105 => 250, 106 => 250, 107 => 458, 108 => 240, 109 => 802, 110 => 531, 111 => 500, 112 => 521, 113 => 521, 114 => 365, 115 => 333, 116 => 292, 117 => 521, 118 => 458, 119 => 677, 120 => 479, 121 => 458, 122 => 427, 123 => 480, 124 => 496, 125 => 480, 126 => 667, 17601 => 500); -$this->Big5_widths = $cw; -// GB -$cw = array(32 => 207, 33 => 270, 34 => 342, 35 => 467, 36 => 462, 37 => 797, 38 => 710, 39 => 239, 40 => 374, 41 => 374, 42 => 423, 43 => 605, 44 => 238, 45 => 375, 46 => 238, 47 => 334, 48 => 462, 49 => 462, 50 => 462, 51 => 462, 52 => 462, 53 => 462, 54 => 462, 55 => 462, 56 => 462, 57 => 462, 58 => 238, 59 => 238, 60 => 605, 61 => 605, 62 => 605, 63 => 344, 64 => 748, 65 => 684, 66 => 560, 67 => 695, 68 => 739, 69 => 563, 70 => 511, 71 => 729, 72 => 793, 73 => 318, 74 => 312, 75 => 666, 76 => 526, 77 => 896, 78 => 758, 79 => 772, 80 => 544, 81 => 772, 82 => 628, 83 => 465, 84 => 607, 85 => 753, 86 => 711, 87 => 972, 88 => 647, 89 => 620, 90 => 607, 91 => 374, 92 => 333, 93 => 374, 94 => 606, 95 => 500, 96 => 239, 97 => 417, 98 => 503, 99 => 427, 100 => 529, 101 => 415, 102 => 264, 103 => 444, 104 => 518, 105 => 241, 106 => 230, 107 => 495, 108 => 228, 109 => 793, 110 => 527, 111 => 524, 112 => 524, 113 => 504, 114 => 338, 115 => 336, 116 => 277, 117 => 517, 118 => 450, 119 => 652, 120 => 466, 121 => 452, 122 => 407, 123 => 370, 124 => 258, 125 => 370, 126 => 605); -$this->GB_widths = $cw; -// Japanese -$cw = array(32 => 278, 33 => 299, 34 => 353, 35 => 614, 36 => 614, 37 => 721, 38 => 735, 39 => 216, 40 => 323, 41 => 323, 42 => 449, 43 => 529, 44 => 219, 45 => 306, 46 => 219, 47 => 453, 48 => 614, 49 => 614, 50 => 614, 51 => 614, 52 => 614, 53 => 614, 54 => 614, 55 => 614, 56 => 614, 57 => 614, 58 => 219, 59 => 219, 60 => 529, 61 => 529, 62 => 529, 63 => 486, 64 => 744, 65 => 646, 66 => 604, 67 => 617, 68 => 681, 69 => 567, 70 => 537, 71 => 647, 72 => 738, 73 => 320, 74 => 433, 75 => 637, 76 => 566, 77 => 904, 78 => 710, 79 => 716, 80 => 605, 81 => 716, 82 => 623, 83 => 517, 84 => 601, 85 => 690, 86 => 668, 87 => 990, 88 => 681, 89 => 634, 90 => 578, 91 => 316, 92 => 614, 93 => 316, 94 => 529, 95 => 500, 96 => 387, 97 => 509, 98 => 566, 99 => 478, 100 => 565, 101 => 503, 102 => 337, 103 => 549, 104 => 580, 105 => 275, 106 => 266, 107 => 544, 108 => 276, 109 => 854, 110 => 579, 111 => 550, 112 => 578, 113 => 566, 114 => 410, 115 => 444, 116 => 340, 117 => 575, 118 => 512, 119 => 760, 120 => 503, 121 => 529, 122 => 453, 123 => 326, 124 => 380, 125 => 326, 126 => 387, 127 => 216, 128 => 453, 129 => 216, 130 => 380, 131 => 529, 132 => 299, 133 => 614, 134 => 614, 135 => 265, 136 => 614, 137 => 475, 138 => 614, 139 => 353, 140 => 451, 141 => 291, 142 => 291, 143 => 588, 144 => 589, 145 => 500, 146 => 476, 147 => 476, 148 => 219, 149 => 494, 150 => 452, 151 => 216, 152 => 353, 153 => 353, 154 => 451, 156 => 1075, 157 => 486, 158 => 387, 159 => 387, 160 => 387, 161 => 387, 162 => 387, 163 => 387, 164 => 387, 165 => 387, 166 => 387, 167 => 387, 168 => 387, 170 => 880, 171 => 448, 172 => 566, 173 => 716, 174 => 903, 175 => 460, 176 => 805, 177 => 275, 178 => 276, 179 => 550, 180 => 886, 181 => 582, 182 => 529, 183 => 738, 184 => 529, 185 => 738, 186 => 357, 187 => 529, 188 => 406, 189 => 406, 190 => 575, 191 => 406, 192 => 934, 193 => 934, 194 => 934, 195 => 646, 196 => 646, 197 => 646, 198 => 646, 199 => 646, 200 => 646, 201 => 617, 202 => 567, 203 => 567, 204 => 567, 205 => 567, 206 => 320, 207 => 320, 208 => 320, 209 => 320, 210 => 681, 211 => 710, 212 => 716, 213 => 716, 214 => 716, 215 => 716, 216 => 716, 217 => 529, 218 => 690, 219 => 690, 220 => 690, 221 => 690, 222 => 634, 223 => 605, 224 => 509, 225 => 509, 226 => 509, 227 => 509, 228 => 509, 229 => 509, 230 => 478, 231 => 503, 232 => 503, 233 => 503, 234 => 503, 235 => 275, 236 => 275, 237 => 275, 238 => 275, 239 => 550, 240 => 579, 241 => 550, 242 => 550, 243 => 550, 244 => 550, 245 => 550, 246 => 529, 247 => 575, 248 => 575, 249 => 575, 250 => 575, 251 => 529, 252 => 578, 253 => 529, 254 => 517, 255 => 634, 256 => 578, 257 => 445, 258 => 444, 259 => 842, 260 => 453, 261 => 614); -$_cr = array( - array(231, 632, 500), - // half-width - array(8718, 8718, 500), - array(9738, 9757, 250), - // quarter-width - array(9758, 9778, 333), - // third-width - array(12063, 12087, 500), -); -foreach ($_cr as $_r) { - for ($i = $_r[0]; $i <= $_r[1]; $i++) { - $cw[$i + 31] = $_r[2]; - } -} -$this->SJIS_widths = $cw; -// Korean -$cw = array(32 => 333, 33 => 416, 34 => 416, 35 => 833, 36 => 625, 37 => 916, 38 => 833, 39 => 250, 40 => 500, 41 => 500, 42 => 500, 43 => 833, 44 => 291, 45 => 450, 46 => 291, 47 => 375, 48 => 625, 49 => 625, 50 => 625, 51 => 625, 52 => 625, 53 => 625, 54 => 625, 55 => 625, 56 => 625, 57 => 625, 58 => 333, 59 => 333, 60 => 833, 61 => 833, 62 => 916, 63 => 500, 64 => 1000, 65 => 791, 66 => 708, 67 => 708, 68 => 750, 69 => 708, 70 => 666, 71 => 750, 72 => 791, 73 => 375, 74 => 500, 75 => 791, 76 => 666, 77 => 916, 78 => 791, 79 => 750, 80 => 666, 81 => 750, 82 => 708, 83 => 666, 84 => 791, 85 => 791, 86 => 750, 87 => 1000, 88 => 708, 89 => 708, 90 => 666, 91 => 500, 92 => 375, 93 => 500, 94 => 500, 95 => 500, 96 => 333, 97 => 541, 98 => 583, 99 => 541, 100 => 583, 101 => 583, 102 => 375, 103 => 583, 104 => 583, 105 => 291, 106 => 333, 107 => 583, 108 => 291, 109 => 875, 110 => 583, 111 => 583, 112 => 583, 113 => 583, 114 => 458, 115 => 541, 116 => 375, 117 => 583, 118 => 583, 119 => 833, 120 => 625, 121 => 625, 122 => 500, 123 => 583, 124 => 583, 125 => 583, 126 => 750); -$_cr = array(array(8094, 8190, 500)); -foreach ($_cr as $_r) { - for ($i = $_r[0]; $i <= $_r[1]; $i++) { - $cw[$i + 31] = $_r[2]; - } -} -$this->UHC_widths = $cw; diff --git a/dependencies/mpdf/mpdf/data/collations/Afrikaans_South_Africa.php b/dependencies/mpdf/mpdf/data/collations/Afrikaans_South_Africa.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Afrikaans_South_Africa.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Albanian_Albania.php b/dependencies/mpdf/mpdf/data/collations/Albanian_Albania.php deleted file mode 100644 index 8270f7b..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Albanian_Albania.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 347 => 115, 346 => 115, 353 => 115, 352 => 115, 351 => 115, 350 => 115, 223 => 115, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 221 => 253, 89 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Alsatian_France.php b/dependencies/mpdf/mpdf/data/collations/Alsatian_France.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Alsatian_France.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Algeria.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Algeria.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Algeria.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Bahrain.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Bahrain.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Bahrain.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Egypt.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Egypt.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Egypt.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Iraq.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Iraq.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Iraq.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Jordan.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Jordan.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Jordan.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Kuwait.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Kuwait.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Kuwait.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Lebanon.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Lebanon.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Lebanon.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Libya.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Libya.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Libya.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Morocco.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Morocco.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Morocco.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Oman.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Oman.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Oman.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Pseudo_RTL.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Pseudo_RTL.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Pseudo_RTL.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Qatar.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Qatar.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Qatar.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Saudi_Arabia.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Saudi_Arabia.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Saudi_Arabia.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Syria.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Syria.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Syria.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Tunisia.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Tunisia.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Tunisia.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Arabic_Yemen.php b/dependencies/mpdf/mpdf/data/collations/Arabic_Yemen.php deleted file mode 100644 index dc98a5c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Arabic_Yemen.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1570 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Azeri_(Cyrillic)_Azerbaijan.php b/dependencies/mpdf/mpdf/data/collations/Azeri_(Cyrillic)_Azerbaijan.php deleted file mode 100644 index 69b3093..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Azeri_(Cyrillic)_Azerbaijan.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 88 => 120, 73 => 105, 74 => 106, 75 => 107, 81 => 113, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1067 => 1099, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Azeri_(Latin)_Azerbaijan.php b/dependencies/mpdf/mpdf/data/collations/Azeri_(Latin)_Azerbaijan.php deleted file mode 100644 index 55d31f5..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Azeri_(Latin)_Azerbaijan.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 199 => 231, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 286 => 287, 72 => 104, 88 => 120, 73 => 105, 305 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 304 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 81 => 113, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 214 => 246, 80 => 112, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 220 => 252, 86 => 118, 87 => 119, 89 => 121, 255 => 121, 376 => 121, 90 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Bashkir_Russia.php b/dependencies/mpdf/mpdf/data/collations/Bashkir_Russia.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Bashkir_Russia.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Basque_Spain.php b/dependencies/mpdf/mpdf/data/collations/Basque_Spain.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Basque_Spain.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Belarusian_Belarus.php b/dependencies/mpdf/mpdf/data/collations/Belarusian_Belarus.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Belarusian_Belarus.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Bosnian_(Cyrillic)_Bosnia_and_Herzegovina.php b/dependencies/mpdf/mpdf/data/collations/Bosnian_(Cyrillic)_Bosnia_and_Herzegovina.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Bosnian_(Cyrillic)_Bosnia_and_Herzegovina.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Bosnian_(Latin)_Bosnia_and_Herzegovina.php b/dependencies/mpdf/mpdf/data/collations/Bosnian_(Latin)_Bosnia_and_Herzegovina.php deleted file mode 100644 index 76b6453..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Bosnian_(Latin)_Bosnia_and_Herzegovina.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Breton_France.php b/dependencies/mpdf/mpdf/data/collations/Breton_France.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Breton_France.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Bulgarian_Bulgaria.php b/dependencies/mpdf/mpdf/data/collations/Bulgarian_Bulgaria.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Bulgarian_Bulgaria.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Catalan_Spain.php b/dependencies/mpdf/mpdf/data/collations/Catalan_Spain.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Catalan_Spain.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Corsican_France.php b/dependencies/mpdf/mpdf/data/collations/Corsican_France.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Corsican_France.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Croatian_(Latin)_Bosnia_and_Herzegovina.php b/dependencies/mpdf/mpdf/data/collations/Croatian_(Latin)_Bosnia_and_Herzegovina.php deleted file mode 100644 index 76b6453..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Croatian_(Latin)_Bosnia_and_Herzegovina.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Croatian_Croatia.php b/dependencies/mpdf/mpdf/data/collations/Croatian_Croatia.php deleted file mode 100644 index 76b6453..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Croatian_Croatia.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Czech_Czech_Republic.php b/dependencies/mpdf/mpdf/data/collations/Czech_Czech_Republic.php deleted file mode 100644 index 9c24438..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Czech_Czech_Republic.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 228 => 97, 196 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 231 => 99, 199 => 99, 268 => 269, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 235 => 101, 203 => 101, 233 => 101, 201 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 246 => 111, 214 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 344 => 345, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 252 => 117, 220 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 380 => 122, 379 => 122, 378 => 122, 377 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Danish_Denmark.php b/dependencies/mpdf/mpdf/data/collations/Danish_Denmark.php deleted file mode 100644 index 614763d..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Danish_Denmark.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 198 => 230, 228 => 230, 196 => 230, 216 => 248, 246 => 248, 214 => 248, 197 => 229]; diff --git a/dependencies/mpdf/mpdf/data/collations/Dari_Afghanistan.php b/dependencies/mpdf/mpdf/data/collations/Dari_Afghanistan.php deleted file mode 100644 index f6c6ec2..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Dari_Afghanistan.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1606 => 1722, 1726 => 1729, 1572 => 1608, 1574 => 1746]; diff --git a/dependencies/mpdf/mpdf/data/collations/Dutch_Belgium.php b/dependencies/mpdf/mpdf/data/collations/Dutch_Belgium.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Dutch_Belgium.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Dutch_Netherlands.php b/dependencies/mpdf/mpdf/data/collations/Dutch_Netherlands.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Dutch_Netherlands.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Australia.php b/dependencies/mpdf/mpdf/data/collations/English_Australia.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Australia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Belize.php b/dependencies/mpdf/mpdf/data/collations/English_Belize.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Belize.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Canada.php b/dependencies/mpdf/mpdf/data/collations/English_Canada.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Canada.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Caribbean.php b/dependencies/mpdf/mpdf/data/collations/English_Caribbean.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Caribbean.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_India.php b/dependencies/mpdf/mpdf/data/collations/English_India.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_India.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Ireland.php b/dependencies/mpdf/mpdf/data/collations/English_Ireland.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Ireland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Jamaica.php b/dependencies/mpdf/mpdf/data/collations/English_Jamaica.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Jamaica.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Malaysia.php b/dependencies/mpdf/mpdf/data/collations/English_Malaysia.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Malaysia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_New_Zealand.php b/dependencies/mpdf/mpdf/data/collations/English_New_Zealand.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_New_Zealand.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Republic_of_the_Philippines.php b/dependencies/mpdf/mpdf/data/collations/English_Republic_of_the_Philippines.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Republic_of_the_Philippines.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Singapore.php b/dependencies/mpdf/mpdf/data/collations/English_Singapore.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Singapore.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_South_Africa.php b/dependencies/mpdf/mpdf/data/collations/English_South_Africa.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_South_Africa.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Trinidad_and_Tobago.php b/dependencies/mpdf/mpdf/data/collations/English_Trinidad_and_Tobago.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Trinidad_and_Tobago.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_United_Kingdom.php b/dependencies/mpdf/mpdf/data/collations/English_United_Kingdom.php deleted file mode 100644 index 257e96e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_United_Kingdom.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 222 => 254, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_United_States.php b/dependencies/mpdf/mpdf/data/collations/English_United_States.php deleted file mode 100644 index 257e96e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_United_States.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 222 => 254, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/English_Zimbabwe.php b/dependencies/mpdf/mpdf/data/collations/English_Zimbabwe.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/English_Zimbabwe.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Estonian_Estonia.php b/dependencies/mpdf/mpdf/data/collations/Estonian_Estonia.php deleted file mode 100644 index fd215a8..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Estonian_Estonia.php +++ /dev/null @@ -1,5 +0,0 @@ - 188, 190 => 179, 65 => 97, 257 => 97, 256 => 97, 229 => 97, 197 => 97, 261 => 97, 260 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 279 => 101, 278 => 101, 275 => 101, 274 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 291 => 103, 290 => 103, 72 => 104, 73 => 105, 299 => 105, 298 => 105, 303 => 105, 302 => 105, 74 => 106, 75 => 107, 311 => 107, 310 => 107, 76 => 108, 316 => 108, 315 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 326 => 110, 325 => 110, 79 => 111, 243 => 111, 211 => 111, 333 => 111, 332 => 111, 248 => 111, 216 => 111, 80 => 112, 81 => 113, 82 => 114, 343 => 114, 342 => 114, 83 => 115, 347 => 115, 346 => 115, 223 => 115, 352 => 353, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382, 84 => 116, 85 => 117, 363 => 117, 362 => 117, 371 => 117, 370 => 117, 86 => 118, 119 => 118, 87 => 118, 213 => 245, 196 => 228, 214 => 246, 220 => 252, 88 => 120, 89 => 121]; diff --git a/dependencies/mpdf/mpdf/data/collations/Faroese_Faroe_Islands.php b/dependencies/mpdf/mpdf/data/collations/Faroese_Faroe_Islands.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Faroese_Faroe_Islands.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Filipino_Philippines.php b/dependencies/mpdf/mpdf/data/collations/Filipino_Philippines.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Filipino_Philippines.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Finnish_Finland.php b/dependencies/mpdf/mpdf/data/collations/Finnish_Finland.php deleted file mode 100644 index cd1e48c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Finnish_Finland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 119 => 118, 87 => 118, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 197 => 229, 196 => 228, 214 => 246, 248 => 246, 216 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/French_Belgium.php b/dependencies/mpdf/mpdf/data/collations/French_Belgium.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/French_Belgium.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/French_Canada.php b/dependencies/mpdf/mpdf/data/collations/French_Canada.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/French_Canada.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/French_France.php b/dependencies/mpdf/mpdf/data/collations/French_France.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/French_France.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/French_Luxembourg.php b/dependencies/mpdf/mpdf/data/collations/French_Luxembourg.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/French_Luxembourg.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/French_Principality_of_Monaco.php b/dependencies/mpdf/mpdf/data/collations/French_Principality_of_Monaco.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/French_Principality_of_Monaco.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/French_Switzerland.php b/dependencies/mpdf/mpdf/data/collations/French_Switzerland.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/French_Switzerland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Frisian_Netherlands.php b/dependencies/mpdf/mpdf/data/collations/Frisian_Netherlands.php deleted file mode 100644 index 14bc0bf..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Frisian_Netherlands.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 121 => 105, 89 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 221 => 253, 255 => 253, 376 => 253, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Galician_Spain.php b/dependencies/mpdf/mpdf/data/collations/Galician_Spain.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Galician_Spain.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/German_Austria.php b/dependencies/mpdf/mpdf/data/collations/German_Austria.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/German_Austria.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/German_Germany.php b/dependencies/mpdf/mpdf/data/collations/German_Germany.php deleted file mode 100644 index cd4e5a6..0000000 --- a/dependencies/mpdf/mpdf/data/collations/German_Germany.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 228 => 97, 230 => 97, 196 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 246 => 111, 338 => 111, 214 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/German_Liechtenstein.php b/dependencies/mpdf/mpdf/data/collations/German_Liechtenstein.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/German_Liechtenstein.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/German_Luxembourg.php b/dependencies/mpdf/mpdf/data/collations/German_Luxembourg.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/German_Luxembourg.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/German_Switzerland.php b/dependencies/mpdf/mpdf/data/collations/German_Switzerland.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/German_Switzerland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Greek_Greece.php b/dependencies/mpdf/mpdf/data/collations/Greek_Greece.php deleted file mode 100644 index ba955a6..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Greek_Greece.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 913 => 945, 940 => 945, 902 => 945, 914 => 946, 915 => 947, 916 => 948, 917 => 949, 941 => 949, 904 => 949, 918 => 950, 919 => 951, 942 => 951, 905 => 951, 920 => 952, 921 => 953, 943 => 953, 906 => 953, 970 => 953, 938 => 953, 912 => 953, 922 => 954, 923 => 955, 925 => 957, 926 => 958, 927 => 959, 972 => 959, 908 => 959, 928 => 960, 929 => 961, 962 => 963, 931 => 963, 932 => 964, 933 => 965, 973 => 965, 910 => 965, 971 => 965, 939 => 965, 944 => 965, 934 => 966, 935 => 967, 936 => 968, 937 => 969, 974 => 969, 911 => 969]; diff --git a/dependencies/mpdf/mpdf/data/collations/Greenlandic_Greenland.php b/dependencies/mpdf/mpdf/data/collations/Greenlandic_Greenland.php deleted file mode 100644 index 614763d..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Greenlandic_Greenland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 198 => 230, 228 => 230, 196 => 230, 216 => 248, 246 => 248, 214 => 248, 197 => 229]; diff --git a/dependencies/mpdf/mpdf/data/collations/Hausa_(Latin)_Nigeria.php b/dependencies/mpdf/mpdf/data/collations/Hausa_(Latin)_Nigeria.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Hausa_(Latin)_Nigeria.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Hebrew_Israel.php b/dependencies/mpdf/mpdf/data/collations/Hebrew_Israel.php deleted file mode 100644 index db4d250..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Hebrew_Israel.php +++ /dev/null @@ -1,5 +0,0 @@ - 173, 1457 => 173, 1458 => 173, 1459 => 173, 1460 => 173, 1461 => 173, 1462 => 173, 1463 => 173, 1464 => 173, 1465 => 173, 1466 => 173, 1467 => 173, 1468 => 173, 1469 => 173, 1471 => 173, 1472 => 173, 1473 => 173, 1474 => 173, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1520 => 1493, 1521 => 1493, 1522 => 1497, 1499 => 1498, 1502 => 1501, 1504 => 1503, 1508 => 1507, 1510 => 1509]; diff --git a/dependencies/mpdf/mpdf/data/collations/Hungarian_Hungary.php b/dependencies/mpdf/mpdf/data/collations/Hungarian_Hungary.php deleted file mode 100644 index 39b7a1b..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Hungarian_Hungary.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 97 => 65, 225 => 193, 226 => 194, 228 => 196, 259 => 258, 261 => 260, 98 => 66, 99 => 67, 231 => 199, 263 => 262, 269 => 268, 100 => 68, 271 => 270, 273 => 272, 101 => 69, 233 => 201, 235 => 203, 281 => 280, 283 => 282, 102 => 70, 103 => 71, 104 => 72, 105 => 73, 237 => 205, 238 => 206, 106 => 74, 107 => 75, 108 => 76, 314 => 313, 318 => 317, 322 => 321, 109 => 77, 110 => 78, 324 => 323, 328 => 327, 111 => 79, 243 => 211, 244 => 212, 246 => 214, 337 => 336, 112 => 80, 113 => 81, 114 => 82, 341 => 340, 345 => 344, 115 => 83, 347 => 346, 351 => 350, 353 => 352, 116 => 84, 355 => 354, 357 => 356, 117 => 85, 250 => 218, 252 => 220, 367 => 366, 369 => 368, 118 => 86, 119 => 87, 120 => 88, 121 => 89, 253 => 221, 122 => 90, 378 => 377, 380 => 379, 382 => 381]; diff --git a/dependencies/mpdf/mpdf/data/collations/Icelandic_Iceland.php b/dependencies/mpdf/mpdf/data/collations/Icelandic_Iceland.php deleted file mode 100644 index deda392..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Icelandic_Iceland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 193 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 208 => 240, 69 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 201 => 233, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 205 => 237, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 211 => 243, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 85 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 218 => 250, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 221 => 253, 90 => 122, 382 => 122, 381 => 122, 222 => 254, 198 => 230, 214 => 246, 248 => 246, 216 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Igbo_Nigeria.php b/dependencies/mpdf/mpdf/data/collations/Igbo_Nigeria.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Igbo_Nigeria.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Indonesian_Indonesia.php b/dependencies/mpdf/mpdf/data/collations/Indonesian_Indonesia.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Indonesian_Indonesia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Inuktitut_(Latin)_Canada.php b/dependencies/mpdf/mpdf/data/collations/Inuktitut_(Latin)_Canada.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Inuktitut_(Latin)_Canada.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Invariant_Language_Invariant_Country.php b/dependencies/mpdf/mpdf/data/collations/Invariant_Language_Invariant_Country.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Invariant_Language_Invariant_Country.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Irish_Ireland.php b/dependencies/mpdf/mpdf/data/collations/Irish_Ireland.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Irish_Ireland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Italian_Italy.php b/dependencies/mpdf/mpdf/data/collations/Italian_Italy.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Italian_Italy.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Italian_Switzerland.php b/dependencies/mpdf/mpdf/data/collations/Italian_Switzerland.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Italian_Switzerland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Kinyarwanda_Rwanda.php b/dependencies/mpdf/mpdf/data/collations/Kinyarwanda_Rwanda.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Kinyarwanda_Rwanda.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Kiswahili_Kenya.php b/dependencies/mpdf/mpdf/data/collations/Kiswahili_Kenya.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Kiswahili_Kenya.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Kyrgyz_Kyrgyzstan.php b/dependencies/mpdf/mpdf/data/collations/Kyrgyz_Kyrgyzstan.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Kyrgyz_Kyrgyzstan.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Latvian_Latvia.php b/dependencies/mpdf/mpdf/data/collations/Latvian_Latvia.php deleted file mode 100644 index 447c3d3..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Latvian_Latvia.php +++ /dev/null @@ -1,5 +0,0 @@ - 188, 190 => 179, 65 => 97, 228 => 97, 196 => 97, 229 => 97, 197 => 97, 261 => 97, 260 => 97, 230 => 97, 198 => 97, 256 => 257, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 268 => 269, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 279 => 101, 278 => 101, 281 => 101, 280 => 101, 274 => 275, 70 => 102, 71 => 103, 290 => 291, 72 => 104, 73 => 105, 303 => 105, 302 => 105, 298 => 299, 74 => 106, 75 => 107, 310 => 311, 76 => 108, 322 => 108, 321 => 108, 315 => 316, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 325 => 326, 79 => 111, 243 => 111, 211 => 111, 246 => 111, 214 => 111, 333 => 111, 332 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 80 => 112, 81 => 113, 82 => 114, 343 => 114, 342 => 114, 83 => 115, 347 => 115, 346 => 115, 223 => 115, 352 => 353, 84 => 116, 85 => 117, 371 => 117, 370 => 117, 252 => 117, 220 => 117, 362 => 363, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Lithuanian_Lithuania.php b/dependencies/mpdf/mpdf/data/collations/Lithuanian_Lithuania.php deleted file mode 100644 index 89e0fa9..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Lithuanian_Lithuania.php +++ /dev/null @@ -1,5 +0,0 @@ - 188, 190 => 179, 65 => 97, 228 => 97, 196 => 97, 257 => 97, 256 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 260 => 261, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 268 => 269, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 279 => 101, 278 => 101, 275 => 101, 274 => 101, 280 => 281, 70 => 102, 71 => 103, 291 => 103, 290 => 103, 72 => 104, 73 => 105, 299 => 105, 298 => 105, 302 => 303, 89 => 121, 74 => 106, 75 => 107, 311 => 107, 310 => 107, 76 => 108, 316 => 108, 315 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 326 => 110, 325 => 110, 79 => 111, 243 => 111, 211 => 111, 246 => 111, 214 => 111, 333 => 111, 332 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 80 => 112, 81 => 113, 82 => 114, 343 => 114, 342 => 114, 83 => 115, 347 => 115, 346 => 115, 223 => 115, 352 => 353, 84 => 116, 85 => 117, 363 => 117, 362 => 117, 252 => 117, 220 => 117, 370 => 371, 86 => 118, 87 => 119, 88 => 120, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Lower_Sorbian_Germany.php b/dependencies/mpdf/mpdf/data/collations/Lower_Sorbian_Germany.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Lower_Sorbian_Germany.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Luxembourgish_Luxembourg.php b/dependencies/mpdf/mpdf/data/collations/Luxembourgish_Luxembourg.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Luxembourgish_Luxembourg.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Macedonian_(FYROM)_Macedonia_(FYROM).php b/dependencies/mpdf/mpdf/data/collations/Macedonian_(FYROM)_Macedonia_(FYROM).php deleted file mode 100644 index b7f726c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Macedonian_(FYROM)_Macedonia_(FYROM).php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1168 => 1169, 1076 => 1107, 1027 => 1107, 1044 => 1107, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1036 => 1116, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Malay_Brunei_Darussalam.php b/dependencies/mpdf/mpdf/data/collations/Malay_Brunei_Darussalam.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Malay_Brunei_Darussalam.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Malay_Malaysia.php b/dependencies/mpdf/mpdf/data/collations/Malay_Malaysia.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Malay_Malaysia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Mapudungun_Chile.php b/dependencies/mpdf/mpdf/data/collations/Mapudungun_Chile.php deleted file mode 100644 index 5c2f87d..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Mapudungun_Chile.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 220 => 252, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Mohawk_Canada.php b/dependencies/mpdf/mpdf/data/collations/Mohawk_Canada.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Mohawk_Canada.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Mongolian_(Cyrillic)_Mongolia.php b/dependencies/mpdf/mpdf/data/collations/Mongolian_(Cyrillic)_Mongolia.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Mongolian_(Cyrillic)_Mongolia.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Norwegian_(Nynorsk)_Norway.php b/dependencies/mpdf/mpdf/data/collations/Norwegian_(Nynorsk)_Norway.php deleted file mode 100644 index 614763d..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Norwegian_(Nynorsk)_Norway.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 198 => 230, 228 => 230, 196 => 230, 216 => 248, 246 => 248, 214 => 248, 197 => 229]; diff --git a/dependencies/mpdf/mpdf/data/collations/Occitan_France.php b/dependencies/mpdf/mpdf/data/collations/Occitan_France.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Occitan_France.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Persian_Iran.php b/dependencies/mpdf/mpdf/data/collations/Persian_Iran.php deleted file mode 100644 index c3473fd..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Persian_Iran.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Polish_Poland.php b/dependencies/mpdf/mpdf/data/collations/Polish_Poland.php deleted file mode 100644 index f1eed7a..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Polish_Poland.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 259 => 97, 258 => 97, 260 => 261, 66 => 98, 67 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 280 => 281, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 321 => 322, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 323 => 324, 79 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 211 => 243, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 353 => 115, 352 => 115, 351 => 115, 350 => 115, 223 => 115, 346 => 347, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 382 => 122, 381 => 122, 377 => 378, 379 => 380]; diff --git a/dependencies/mpdf/mpdf/data/collations/Portuguese_Brazil.php b/dependencies/mpdf/mpdf/data/collations/Portuguese_Brazil.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Portuguese_Brazil.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Portuguese_Portugal.php b/dependencies/mpdf/mpdf/data/collations/Portuguese_Portugal.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Portuguese_Portugal.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Quechua_Bolivia.php b/dependencies/mpdf/mpdf/data/collations/Quechua_Bolivia.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Quechua_Bolivia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Quechua_Ecuador.php b/dependencies/mpdf/mpdf/data/collations/Quechua_Ecuador.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Quechua_Ecuador.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Quechua_Peru.php b/dependencies/mpdf/mpdf/data/collations/Quechua_Peru.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Quechua_Peru.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Romanian_Romania.php b/dependencies/mpdf/mpdf/data/collations/Romanian_Romania.php deleted file mode 100644 index 89f903e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Romanian_Romania.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 225 => 97, 193 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 258 => 259, 226 => 259, 194 => 259, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 206 => 238, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 347 => 115, 346 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 357 => 116, 356 => 116, 354 => 355, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Romansh_Switzerland.php b/dependencies/mpdf/mpdf/data/collations/Romansh_Switzerland.php deleted file mode 100644 index a097d50..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Romansh_Switzerland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122, 192 => 224, 200 => 232, 204 => 236, 210 => 242, 217 => 249, 193 => 225, 201 => 233, 205 => 237, 211 => 243, 218 => 250, 194 => 226, 202 => 234, 206 => 238, 212 => 244, 219 => 251, 196 => 228, 214 => 246, 220 => 252]; diff --git a/dependencies/mpdf/mpdf/data/collations/Russian_Russia.php b/dependencies/mpdf/mpdf/data/collations/Russian_Russia.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Russian_Russia.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Inari)_Finland.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Inari)_Finland.php deleted file mode 100644 index fe6646e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Inari)_Finland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Norway.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Norway.php deleted file mode 100644 index 04d67a7..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Norway.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 196 => 228, 216 => 248, 214 => 246, 197 => 229]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Sweden.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Sweden.php deleted file mode 100644 index fe6646e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Lule)_Sweden.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Finland.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Finland.php deleted file mode 100644 index fe6646e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Finland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Norway.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Norway.php deleted file mode 100644 index 04d67a7..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Norway.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 196 => 228, 216 => 248, 214 => 246, 197 => 229]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Sweden.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Sweden.php deleted file mode 100644 index fe6646e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Northern)_Sweden.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Skolt)_Finland.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Skolt)_Finland.php deleted file mode 100644 index fe6646e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Skolt)_Finland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Norway.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Norway.php deleted file mode 100644 index 04d67a7..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Norway.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 196 => 228, 216 => 248, 214 => 246, 197 => 229]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Sweden.php b/dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Sweden.php deleted file mode 100644 index fe6646e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sami_(Southern)_Sweden.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 224 => 97, 192 => 97, 227 => 97, 195 => 97, 193 => 225, 226 => 225, 194 => 225, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 339 => 111, 338 => 111, 213 => 245, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382, 198 => 230, 216 => 248, 197 => 229, 196 => 228, 214 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Bosnia_and_Herzegovina.php b/dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Bosnia_and_Herzegovina.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Bosnia_and_Herzegovina.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Serbia.php b/dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Serbia.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Serbia.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Bosnia_and_Herzegovina.php b/dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Bosnia_and_Herzegovina.php deleted file mode 100644 index 76b6453..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Bosnia_and_Herzegovina.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Serbia.php b/dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Serbia.php deleted file mode 100644 index 76b6453..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Serbian_(Latin)_Serbia.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 259 => 97, 258 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 283 => 101, 282 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 318 => 108, 317 => 108, 314 => 108, 313 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 328 => 110, 327 => 110, 324 => 110, 323 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 345 => 114, 344 => 114, 341 => 114, 340 => 114, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Sesotho_sa_Leboa_South_Africa.php b/dependencies/mpdf/mpdf/data/collations/Sesotho_sa_Leboa_South_Africa.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Sesotho_sa_Leboa_South_Africa.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Setswana_South_Africa.php b/dependencies/mpdf/mpdf/data/collations/Setswana_South_Africa.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Setswana_South_Africa.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Slovak_Slovakia.php b/dependencies/mpdf/mpdf/data/collations/Slovak_Slovakia.php deleted file mode 100644 index b10ae52..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Slovak_Slovakia.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 196 => 228, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 231 => 99, 199 => 99, 268 => 269, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 235 => 101, 203 => 101, 233 => 101, 201 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 246 => 111, 214 => 111, 243 => 111, 211 => 111, 337 => 111, 336 => 111, 212 => 244, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 344 => 345, 83 => 115, 347 => 115, 346 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 252 => 117, 220 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 380 => 122, 379 => 122, 378 => 122, 377 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Slovenian_Slovenia.php b/dependencies/mpdf/mpdf/data/collations/Slovenian_Slovenia.php deleted file mode 100644 index 19fb630..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Slovenian_Slovenia.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 268 => 269, 262 => 263, 68 => 100, 271 => 100, 270 => 100, 272 => 273, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 328 => 110, 327 => 110, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 337 => 111, 336 => 111, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 351 => 115, 350 => 115, 223 => 115, 352 => 353, 346 => 347, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 90 => 122, 380 => 122, 379 => 122, 381 => 382, 377 => 378]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Argentina.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Argentina.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Argentina.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Bolivia.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Bolivia.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Bolivia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Chile.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Chile.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Chile.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Colombia.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Colombia.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Colombia.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Costa_Rica.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Costa_Rica.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Costa_Rica.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Dominican_Republic.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Dominican_Republic.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Dominican_Republic.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Ecuador.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Ecuador.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Ecuador.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_El_Salvador.php b/dependencies/mpdf/mpdf/data/collations/Spanish_El_Salvador.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_El_Salvador.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Guatemala.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Guatemala.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Guatemala.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Honduras.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Honduras.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Honduras.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Mexico.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Mexico.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Mexico.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Nicaragua.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Nicaragua.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Nicaragua.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Panama.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Panama.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Panama.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Paraguay.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Paraguay.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Paraguay.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Peru.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Peru.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Peru.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Puerto_Rico.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Puerto_Rico.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Puerto_Rico.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Spain.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Spain.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Spain.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_United_States.php b/dependencies/mpdf/mpdf/data/collations/Spanish_United_States.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_United_States.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Uruguay.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Uruguay.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Uruguay.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Spanish_Venezuela.php b/dependencies/mpdf/mpdf/data/collations/Spanish_Venezuela.php deleted file mode 100644 index 3b624e0..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Spanish_Venezuela.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 209 => 241, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Swedish_Finland.php b/dependencies/mpdf/mpdf/data/collations/Swedish_Finland.php deleted file mode 100644 index cd1e48c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Swedish_Finland.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 119 => 118, 87 => 118, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 197 => 229, 196 => 228, 214 => 246, 248 => 246, 216 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Swedish_Sweden.php b/dependencies/mpdf/mpdf/data/collations/Swedish_Sweden.php deleted file mode 100644 index cd1e48c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Swedish_Sweden.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 227 => 97, 195 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 86 => 118, 119 => 118, 87 => 118, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 252 => 121, 220 => 121, 90 => 122, 382 => 122, 381 => 122, 197 => 229, 196 => 228, 214 => 246, 248 => 246, 216 => 246]; diff --git a/dependencies/mpdf/mpdf/data/collations/Tajik_(Cyrillic)_Tajikistan.php b/dependencies/mpdf/mpdf/data/collations/Tajik_(Cyrillic)_Tajikistan.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Tajik_(Cyrillic)_Tajikistan.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Tamazight_(Latin)_Algeria.php b/dependencies/mpdf/mpdf/data/collations/Tamazight_(Latin)_Algeria.php deleted file mode 100644 index 971f378..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Tamazight_(Latin)_Algeria.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 86 => 118, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Tatar_Russia.php b/dependencies/mpdf/mpdf/data/collations/Tatar_Russia.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Tatar_Russia.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Turkish_Turkey.php b/dependencies/mpdf/mpdf/data/collations/Turkish_Turkey.php deleted file mode 100644 index 1cf63b9..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Turkish_Turkey.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 199 => 231, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 286 => 287, 72 => 104, 73 => 105, 305 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 304 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 214 => 246, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 220 => 252, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 90 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Turkmen_Turkmenistan.php b/dependencies/mpdf/mpdf/data/collations/Turkmen_Turkmenistan.php deleted file mode 100644 index 72f81b7..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Turkmen_Turkmenistan.php +++ /dev/null @@ -1,5 +0,0 @@ - 711, 65 => 97, 225 => 97, 193 => 97, 226 => 97, 194 => 97, 259 => 97, 258 => 97, 261 => 97, 260 => 97, 66 => 98, 67 => 99, 263 => 99, 262 => 99, 269 => 99, 268 => 99, 231 => 99, 199 => 99, 68 => 100, 271 => 100, 270 => 100, 273 => 100, 272 => 100, 69 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 283 => 101, 282 => 101, 281 => 101, 280 => 101, 196 => 228, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 238 => 105, 206 => 105, 74 => 106, 381 => 382, 75 => 107, 76 => 108, 314 => 108, 313 => 108, 318 => 108, 317 => 108, 322 => 108, 321 => 108, 77 => 109, 78 => 110, 324 => 110, 323 => 110, 327 => 328, 79 => 111, 243 => 111, 211 => 111, 244 => 111, 212 => 111, 337 => 111, 336 => 111, 214 => 246, 80 => 112, 81 => 113, 82 => 114, 341 => 114, 340 => 114, 345 => 114, 344 => 114, 83 => 115, 347 => 115, 346 => 115, 353 => 115, 352 => 115, 223 => 115, 350 => 351, 84 => 116, 357 => 116, 356 => 116, 355 => 116, 354 => 116, 85 => 117, 250 => 117, 218 => 117, 367 => 117, 366 => 117, 369 => 117, 368 => 117, 220 => 252, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 221 => 253, 90 => 122, 378 => 122, 377 => 122, 380 => 122, 379 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Ukrainian_Ukraine.php b/dependencies/mpdf/mpdf/data/collations/Ukrainian_Ukraine.php deleted file mode 100644 index 4af3050..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Ukrainian_Ukraine.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Upper_Sorbian_Germany.php b/dependencies/mpdf/mpdf/data/collations/Upper_Sorbian_Germany.php deleted file mode 100644 index 029474f..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Upper_Sorbian_Germany.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 352 => 353, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 381 => 382]; diff --git a/dependencies/mpdf/mpdf/data/collations/Urdu_Islamic_Republic_of_Pakistan.php b/dependencies/mpdf/mpdf/data/collations/Urdu_Islamic_Republic_of_Pakistan.php deleted file mode 100644 index 21e051b..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Urdu_Islamic_Republic_of_Pakistan.php +++ /dev/null @@ -1,5 +0,0 @@ - 8205, 1600 => 8205, 1611 => 8205, 1612 => 8205, 1613 => 8205, 1614 => 8205, 1615 => 8205, 1616 => 8205, 1618 => 8205, 1617 => 8205, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 226 => 97, 66 => 98, 67 => 99, 231 => 99, 68 => 100, 69 => 101, 233 => 101, 232 => 101, 234 => 101, 235 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 238 => 105, 239 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 244 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 249 => 117, 251 => 117, 252 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1573 => 1575, 1571 => 1575, 1606 => 1722, 1729 => 1607, 1726 => 1607, 1572 => 1608, 1746 => 1610, 1574 => 1610]; diff --git a/dependencies/mpdf/mpdf/data/collations/Uzbek_(Cyrillic)_Uzbekistan.php b/dependencies/mpdf/mpdf/data/collations/Uzbek_(Cyrillic)_Uzbekistan.php deleted file mode 100644 index 4a3a82e..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Uzbek_(Cyrillic)_Uzbekistan.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1044 => 1076, 1026 => 1106, 1045 => 1077, 1105 => 1077, 1025 => 1077, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Uzbek_(Latin)_Uzbekistan.php b/dependencies/mpdf/mpdf/data/collations/Uzbek_(Latin)_Uzbekistan.php deleted file mode 100644 index e93e81c..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Uzbek_(Latin)_Uzbekistan.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 287 => 103, 286 => 103, 72 => 104, 73 => 105, 305 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 304 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 351 => 115, 350 => 115, 223 => 115, 84 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 90 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Vietnamese_Vietnam.php b/dependencies/mpdf/mpdf/data/collations/Vietnamese_Vietnam.php deleted file mode 100644 index 4bcf811..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Vietnamese_Vietnam.php +++ /dev/null @@ -1,5 +0,0 @@ - 173, 777 => 173, 771 => 173, 769 => 173, 803 => 173, 710 => 94, 189 => 188, 190 => 179, 65 => 97, 224 => 97, 170 => 97, 192 => 97, 225 => 97, 193 => 97, 228 => 97, 196 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 258 => 259, 194 => 226, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 272 => 273, 69 => 101, 232 => 101, 200 => 101, 233 => 101, 201 => 101, 235 => 101, 203 => 101, 202 => 234, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 239 => 105, 207 => 105, 206 => 238, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 246 => 111, 214 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 212 => 244, 416 => 417, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 223 => 115, 84 => 116, 85 => 117, 249 => 117, 217 => 117, 250 => 117, 218 => 117, 252 => 117, 220 => 117, 431 => 432, 219 => 251, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 255 => 121, 376 => 121, 90 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Welsh_United_Kingdom.php b/dependencies/mpdf/mpdf/data/collations/Welsh_United_Kingdom.php deleted file mode 100644 index 24a07bd..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Welsh_United_Kingdom.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 103 => 102, 70 => 102, 71 => 102, 402 => 102, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 222 => 254, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Wolof_Senegal.php b/dependencies/mpdf/mpdf/data/collations/Wolof_Senegal.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Wolof_Senegal.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/Yakut_Russia.php b/dependencies/mpdf/mpdf/data/collations/Yakut_Russia.php deleted file mode 100644 index 4bf3eca..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Yakut_Russia.php +++ /dev/null @@ -1,5 +0,0 @@ - 97, 66 => 98, 67 => 99, 68 => 100, 69 => 101, 70 => 102, 71 => 103, 72 => 104, 73 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 79 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 84 => 116, 85 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 90 => 122, 1040 => 1072, 1041 => 1073, 1042 => 1074, 1043 => 1075, 1107 => 1075, 1027 => 1075, 1168 => 1169, 1026 => 1106, 1044 => 1076, 1045 => 1077, 1025 => 1105, 1028 => 1108, 1046 => 1078, 1047 => 1079, 1029 => 1109, 1048 => 1080, 1031 => 1111, 1049 => 1081, 1032 => 1112, 1050 => 1082, 1116 => 1082, 1036 => 1082, 1051 => 1083, 1033 => 1113, 1052 => 1084, 1053 => 1085, 1034 => 1114, 1054 => 1086, 1055 => 1087, 1056 => 1088, 1057 => 1089, 1058 => 1090, 1035 => 1115, 1059 => 1091, 1118 => 1091, 1038 => 1091, 1060 => 1092, 1061 => 1093, 1062 => 1094, 1063 => 1095, 1039 => 1119, 1064 => 1096, 1065 => 1097, 1066 => 1098, 1067 => 1099, 1068 => 1100, 1069 => 1101, 1070 => 1102, 1071 => 1103]; diff --git a/dependencies/mpdf/mpdf/data/collations/Yoruba_Nigeria.php b/dependencies/mpdf/mpdf/data/collations/Yoruba_Nigeria.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/Yoruba_Nigeria.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/isiXhosa_South_Africa.php b/dependencies/mpdf/mpdf/data/collations/isiXhosa_South_Africa.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/isiXhosa_South_Africa.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/collations/isiZulu_South_Africa.php b/dependencies/mpdf/mpdf/data/collations/isiZulu_South_Africa.php deleted file mode 100644 index 9aa8351..0000000 --- a/dependencies/mpdf/mpdf/data/collations/isiZulu_South_Africa.php +++ /dev/null @@ -1,5 +0,0 @@ - 94, 189 => 188, 190 => 179, 65 => 97, 170 => 97, 225 => 97, 193 => 97, 224 => 97, 192 => 97, 226 => 97, 194 => 97, 228 => 97, 196 => 97, 227 => 97, 195 => 97, 229 => 97, 197 => 97, 230 => 97, 198 => 97, 66 => 98, 67 => 99, 231 => 99, 199 => 99, 68 => 100, 240 => 100, 208 => 100, 69 => 101, 233 => 101, 201 => 101, 232 => 101, 200 => 101, 234 => 101, 202 => 101, 235 => 101, 203 => 101, 70 => 102, 402 => 102, 71 => 103, 72 => 104, 73 => 105, 237 => 105, 205 => 105, 236 => 105, 204 => 105, 238 => 105, 206 => 105, 239 => 105, 207 => 105, 74 => 106, 75 => 107, 76 => 108, 77 => 109, 78 => 110, 241 => 110, 209 => 110, 79 => 111, 186 => 111, 243 => 111, 211 => 111, 242 => 111, 210 => 111, 244 => 111, 212 => 111, 246 => 111, 214 => 111, 245 => 111, 213 => 111, 248 => 111, 216 => 111, 339 => 111, 338 => 111, 80 => 112, 81 => 113, 82 => 114, 83 => 115, 353 => 115, 352 => 115, 223 => 115, 84 => 116, 254 => 116, 222 => 116, 85 => 117, 250 => 117, 218 => 117, 249 => 117, 217 => 117, 251 => 117, 219 => 117, 252 => 117, 220 => 117, 86 => 118, 87 => 119, 88 => 120, 89 => 121, 253 => 121, 221 => 121, 255 => 121, 376 => 121, 90 => 122, 382 => 122, 381 => 122]; diff --git a/dependencies/mpdf/mpdf/data/entity_substitutions.php b/dependencies/mpdf/mpdf/data/entity_substitutions.php deleted file mode 100644 index edff67c..0000000 --- a/dependencies/mpdf/mpdf/data/entity_substitutions.php +++ /dev/null @@ -1,5 +0,0 @@ - '160', 'iexcl' => '161', 'cent' => '162', 'pound' => '163', 'curren' => '164', 'yen' => '165', 'brvbar' => '166', 'sect' => '167', 'uml' => '168', 'copy' => '169', 'ordf' => '170', 'laquo' => '171', 'not' => '172', 'shy' => '173', 'reg' => '174', 'macr' => '175', 'deg' => '176', 'plusmn' => '177', 'sup2' => '178', 'sup3' => '179', 'acute' => '180', 'micro' => '181', 'para' => '182', 'middot' => '183', 'cedil' => '184', 'sup1' => '185', 'ordm' => '186', 'raquo' => '187', 'frac14' => '188', 'frac12' => '189', 'frac34' => '190', 'iquest' => '191', 'Agrave' => '192', 'Aacute' => '193', 'Acirc' => '194', 'Atilde' => '195', 'Auml' => '196', 'Aring' => '197', 'AElig' => '198', 'Ccedil' => '199', 'Egrave' => '200', 'Eacute' => '201', 'Ecirc' => '202', 'Euml' => '203', 'Igrave' => '204', 'Iacute' => '205', 'Icirc' => '206', 'Iuml' => '207', 'ETH' => '208', 'Ntilde' => '209', 'Ograve' => '210', 'Oacute' => '211', 'Ocirc' => '212', 'Otilde' => '213', 'Ouml' => '214', 'times' => '215', 'Oslash' => '216', 'Ugrave' => '217', 'Uacute' => '218', 'Ucirc' => '219', 'Uuml' => '220', 'Yacute' => '221', 'THORN' => '222', 'szlig' => '223', 'agrave' => '224', 'aacute' => '225', 'acirc' => '226', 'atilde' => '227', 'auml' => '228', 'aring' => '229', 'aelig' => '230', 'ccedil' => '231', 'egrave' => '232', 'eacute' => '233', 'ecirc' => '234', 'euml' => '235', 'igrave' => '236', 'iacute' => '237', 'icirc' => '238', 'iuml' => '239', 'eth' => '240', 'ntilde' => '241', 'ograve' => '242', 'oacute' => '243', 'ocirc' => '244', 'otilde' => '245', 'ouml' => '246', 'divide' => '247', 'oslash' => '248', 'ugrave' => '249', 'uacute' => '250', 'ucirc' => '251', 'uuml' => '252', 'yacute' => '253', 'thorn' => '254', 'yuml' => '255', 'OElig' => '338', 'oelig' => '339', 'Scaron' => '352', 'scaron' => '353', 'Yuml' => '376', 'fnof' => '402', 'circ' => '710', 'tilde' => '732', 'Alpha' => '913', 'Beta' => '914', 'Gamma' => '915', 'Delta' => '916', 'Epsilon' => '917', 'Zeta' => '918', 'Eta' => '919', 'Theta' => '920', 'Iota' => '921', 'Kappa' => '922', 'Lambda' => '923', 'Mu' => '924', 'Nu' => '925', 'Xi' => '926', 'Omicron' => '927', 'Pi' => '928', 'Rho' => '929', 'Sigma' => '931', 'Tau' => '932', 'Upsilon' => '933', 'Phi' => '934', 'Chi' => '935', 'Psi' => '936', 'Omega' => '937', 'alpha' => '945', 'beta' => '946', 'gamma' => '947', 'delta' => '948', 'epsilon' => '949', 'zeta' => '950', 'eta' => '951', 'theta' => '952', 'iota' => '953', 'kappa' => '954', 'lambda' => '955', 'mu' => '956', 'nu' => '957', 'xi' => '958', 'omicron' => '959', 'pi' => '960', 'rho' => '961', 'sigmaf' => '962', 'sigma' => '963', 'tau' => '964', 'upsilon' => '965', 'phi' => '966', 'chi' => '967', 'psi' => '968', 'omega' => '969', 'thetasym' => '977', 'upsih' => '978', 'piv' => '982', 'ensp' => '8194', 'emsp' => '8195', 'thinsp' => '8201', 'zwnj' => '8204', 'zwj' => '8205', 'lrm' => '8206', 'rlm' => '8207', 'ndash' => '8211', 'mdash' => '8212', 'lsquo' => '8216', 'rsquo' => '8217', 'sbquo' => '8218', 'ldquo' => '8220', 'rdquo' => '8221', 'bdquo' => '8222', 'dagger' => '8224', 'Dagger' => '8225', 'bull' => '8226', 'hellip' => '8230', 'permil' => '8240', 'prime' => '8242', 'Prime' => '8243', 'lsaquo' => '8249', 'rsaquo' => '8250', 'oline' => '8254', 'frasl' => '8260', 'euro' => '8364', 'image' => '8465', 'weierp' => '8472', 'real' => '8476', 'trade' => '8482', 'alefsym' => '8501', 'larr' => '8592', 'uarr' => '8593', 'rarr' => '8594', 'darr' => '8595', 'harr' => '8596', 'crarr' => '8629', 'lArr' => '8656', 'uArr' => '8657', 'rArr' => '8658', 'dArr' => '8659', 'hArr' => '8660', 'forall' => '8704', 'part' => '8706', 'exist' => '8707', 'empty' => '8709', 'nabla' => '8711', 'isin' => '8712', 'notin' => '8713', 'ni' => '8715', 'prod' => '8719', 'sum' => '8721', 'minus' => '8722', 'lowast' => '8727', 'radic' => '8730', 'prop' => '8733', 'infin' => '8734', 'ang' => '8736', 'and' => '8743', 'or' => '8744', 'cap' => '8745', 'cup' => '8746', 'int' => '8747', 'there4' => '8756', 'sim' => '8764', 'cong' => '8773', 'asymp' => '8776', 'ne' => '8800', 'equiv' => '8801', 'le' => '8804', 'ge' => '8805', 'sub' => '8834', 'sup' => '8835', 'nsub' => '8836', 'sube' => '8838', 'supe' => '8839', 'oplus' => '8853', 'otimes' => '8855', 'perp' => '8869', 'sdot' => '8901', 'lceil' => '8968', 'rceil' => '8969', 'lfloor' => '8970', 'rfloor' => '8971', 'lang' => '9001', 'rang' => '9002', 'loz' => '9674', 'spades' => '9824', 'clubs' => '9827', 'hearts' => '9829', 'diams' => '9830']; diff --git a/dependencies/mpdf/mpdf/data/font/ccourier.php b/dependencies/mpdf/mpdf/data/font/ccourier.php deleted file mode 100644 index 8142605..0000000 --- a/dependencies/mpdf/mpdf/data/font/ccourier.php +++ /dev/null @@ -1,11 +0,0 @@ -629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-23 -250 715 805]'); -$desc = array('Flags' => 33, 'FontBBox' => '[-23 -250 715 805]', 'ItalicAngle' => 0, 'Ascent' => 805, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 426, 'StemV' => 51, 'StemH' => 51, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); -$up = -100; -$ut = 50; diff --git a/dependencies/mpdf/mpdf/data/font/ccourierb.php b/dependencies/mpdf/mpdf/data/font/ccourierb.php deleted file mode 100644 index dd0d5be..0000000 --- a/dependencies/mpdf/mpdf/data/font/ccourierb.php +++ /dev/null @@ -1,11 +0,0 @@ -629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-113 -250 749 801]'); -$desc = array('Flags' => 33, 'FontBBox' => '[-113 -250 749 801]', 'ItalicAngle' => 0, 'Ascent' => 801, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 439, 'StemV' => 106, 'StemH' => 84, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); -$up = -100; -$ut = 50; diff --git a/dependencies/mpdf/mpdf/data/font/ccourierbi.php b/dependencies/mpdf/mpdf/data/font/ccourierbi.php deleted file mode 100644 index ad339d6..0000000 --- a/dependencies/mpdf/mpdf/data/font/ccourierbi.php +++ /dev/null @@ -1,11 +0,0 @@ -629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-57 -250 869 801]'); -$desc = array('Flags' => 97, 'FontBBox' => '[-57 -250 869 801]', 'ItalicAngle' => -12, 'Ascent' => 801, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 439, 'StemV' => 106, 'StemH' => 84, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); -$up = -100; -$ut = 50; diff --git a/dependencies/mpdf/mpdf/data/font/ccourieri.php b/dependencies/mpdf/mpdf/data/font/ccourieri.php deleted file mode 100644 index 1cabf60..0000000 --- a/dependencies/mpdf/mpdf/data/font/ccourieri.php +++ /dev/null @@ -1,11 +0,0 @@ - 629, 'Descent' => -157, 'CapHeight' => 562, 'FontBBox' => '[-27 -250 849 805]'); -$desc = array('Flags' => 97, 'FontBBox' => '[-27 -250 849 805]', 'ItalicAngle' => -12, 'Ascent' => 805, 'Descent' => -250, 'Leading' => 0, 'CapHeight' => 562, 'XHeight' => 426, 'StemV' => 51, 'StemH' => 51, 'AvgWidth' => 600, 'MaxWidth' => 600, 'MissingWidth' => 600); -$up = -100; -$ut = 50; diff --git a/dependencies/mpdf/mpdf/data/font/chelvetica.php b/dependencies/mpdf/mpdf/data/font/chelvetica.php deleted file mode 100644 index 93f9864..0000000 --- a/dependencies/mpdf/mpdf/data/font/chelvetica.php +++ /dev/null @@ -1,10 +0,0 @@ - 278, \chr(1) => 278, \chr(2) => 278, \chr(3) => 278, \chr(4) => 278, \chr(5) => 278, \chr(6) => 278, \chr(7) => 278, \chr(8) => 278, \chr(9) => 278, \chr(10) => 278, \chr(11) => 278, \chr(12) => 278, \chr(13) => 278, \chr(14) => 278, \chr(15) => 278, \chr(16) => 278, \chr(17) => 278, \chr(18) => 278, \chr(19) => 278, \chr(20) => 278, \chr(21) => 278, \chr(22) => 278, \chr(23) => 278, \chr(24) => 278, \chr(25) => 278, \chr(26) => 278, \chr(27) => 278, \chr(28) => 278, \chr(29) => 278, \chr(30) => 278, \chr(31) => 278, ' ' => 278, '!' => 278, '"' => 355, '#' => 556, '$' => 556, '%' => 889, '&' => 667, '\'' => 191, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 278, ';' => 278, '<' => 584, '=' => 584, '>' => 584, '?' => 556, '@' => 1015, 'A' => 667, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 500, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 278, '\\' => 278, ']' => 278, '^' => 469, '_' => 556, '`' => 333, 'a' => 556, 'b' => 556, 'c' => 500, 'd' => 556, 'e' => 556, 'f' => 278, 'g' => 556, 'h' => 556, 'i' => 222, 'j' => 222, 'k' => 500, 'l' => 222, 'm' => 833, 'n' => 556, 'o' => 556, 'p' => 556, 'q' => 556, 'r' => 333, 's' => 500, 't' => 278, 'u' => 556, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 500, '{' => 334, '|' => 260, '}' => 334, '~' => 584, \chr(127) => 350, \chr(128) => 556, \chr(129) => 350, \chr(130) => 222, \chr(131) => 556, \chr(132) => 333, \chr(133) => 1000, \chr(134) => 556, \chr(135) => 556, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 667, \chr(139) => 333, \chr(140) => 1000, \chr(141) => 350, \chr(142) => 611, \chr(143) => 350, \chr(144) => 350, \chr(145) => 222, \chr(146) => 222, \chr(147) => 333, \chr(148) => 333, \chr(149) => 350, \chr(150) => 556, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 1000, \chr(154) => 500, \chr(155) => 333, \chr(156) => 944, \chr(157) => 350, \chr(158) => 500, \chr(159) => 667, \chr(160) => 278, \chr(161) => 333, \chr(162) => 556, \chr(163) => 556, \chr(164) => 556, \chr(165) => 556, \chr(166) => 260, \chr(167) => 556, \chr(168) => 333, \chr(169) => 737, \chr(170) => 370, \chr(171) => 556, \chr(172) => 584, \chr(173) => 333, \chr(174) => 737, \chr(175) => 333, \chr(176) => 400, \chr(177) => 584, \chr(178) => 333, \chr(179) => 333, \chr(180) => 333, \chr(181) => 556, \chr(182) => 537, \chr(183) => 278, \chr(184) => 333, \chr(185) => 333, \chr(186) => 365, \chr(187) => 556, \chr(188) => 834, \chr(189) => 834, \chr(190) => 834, \chr(191) => 611, \chr(192) => 667, \chr(193) => 667, \chr(194) => 667, \chr(195) => 667, \chr(196) => 667, \chr(197) => 667, \chr(198) => 1000, \chr(199) => 722, \chr(200) => 667, \chr(201) => 667, \chr(202) => 667, \chr(203) => 667, \chr(204) => 278, \chr(205) => 278, \chr(206) => 278, \chr(207) => 278, \chr(208) => 722, \chr(209) => 722, \chr(210) => 778, \chr(211) => 778, \chr(212) => 778, \chr(213) => 778, \chr(214) => 778, \chr(215) => 584, \chr(216) => 778, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 667, \chr(222) => 667, \chr(223) => 611, \chr(224) => 556, \chr(225) => 556, \chr(226) => 556, \chr(227) => 556, \chr(228) => 556, \chr(229) => 556, \chr(230) => 889, \chr(231) => 500, \chr(232) => 556, \chr(233) => 556, \chr(234) => 556, \chr(235) => 556, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 556, \chr(241) => 556, \chr(242) => 556, \chr(243) => 556, \chr(244) => 556, \chr(245) => 556, \chr(246) => 556, \chr(247) => 584, \chr(248) => 611, \chr(249) => 556, \chr(250) => 556, \chr(251) => 556, \chr(252) => 556, \chr(253) => 500, \chr(254) => 556, \chr(255) => 500); -//$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-166 -225 1000 931]'); -$desc = array('Flags' => 32, 'FontBBox' => '[-166 -225 1000 931]', 'ItalicAngle' => 0, 'Ascent' => 931, 'Descent' => -225, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 523, 'StemV' => 88, 'StemH' => 76, 'AvgWidth' => 513, 'MaxWidth' => 1015, 'MissingWidth' => 513); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -74), \chr(65) => array(\chr(84) => -74, \chr(86) => -74, \chr(87) => -37, \chr(89) => -74, \chr(118) => -18, \chr(119) => -18, \chr(121) => -18, \chr(146) => -74), \chr(70) => array(\chr(44) => -110, \chr(46) => -110, \chr(65) => -55), \chr(76) => array(\chr(84) => -74, \chr(86) => -74, \chr(87) => -74, \chr(89) => -74, \chr(121) => -37, \chr(146) => -55), \chr(80) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -74), \chr(82) => array(\chr(84) => -18, \chr(86) => -18, \chr(87) => -18, \chr(89) => -18), \chr(84) => array(\chr(44) => -110, \chr(46) => -110, \chr(58) => -110, \chr(65) => -74, \chr(79) => -18, \chr(97) => -110, \chr(99) => -110, \chr(101) => -110, \chr(105) => -37, \chr(111) => -110, \chr(114) => -37, \chr(115) => -110, \chr(117) => -37, \chr(119) => -55, \chr(121) => -55), \chr(86) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -37, \chr(65) => -74, \chr(97) => -74, \chr(101) => -55, \chr(105) => -18, \chr(111) => -55, \chr(114) => -37, \chr(117) => -37, \chr(121) => -37), \chr(87) => array(\chr(44) => -55, \chr(46) => -55, \chr(58) => -18, \chr(65) => -37, \chr(97) => -37, \chr(101) => -18, \chr(105) => 0, \chr(111) => -18, \chr(114) => -18, \chr(117) => -18, \chr(121) => -8), \chr(89) => array(\chr(44) => -128, \chr(46) => -128, \chr(58) => -55, \chr(65) => -74, \chr(97) => -74, \chr(101) => -91, \chr(105) => -37, \chr(111) => -91, \chr(112) => -74, \chr(113) => -91, \chr(117) => -55, \chr(118) => -55), \chr(102) => array(\chr(102) => -18, \chr(146) => 18), \chr(114) => array(\chr(44) => -55, \chr(46) => -55, \chr(146) => 37), \chr(118) => array(\chr(44) => -74, \chr(46) => -74), \chr(119) => array(\chr(44) => -55, \chr(46) => -55), \chr(121) => array(\chr(44) => -74, \chr(46) => -74), \chr(145) => array(\chr(145) => -18), \chr(146) => array(\chr(115) => -18, \chr(146) => -18)); diff --git a/dependencies/mpdf/mpdf/data/font/chelveticab.php b/dependencies/mpdf/mpdf/data/font/chelveticab.php deleted file mode 100644 index df47994..0000000 --- a/dependencies/mpdf/mpdf/data/font/chelveticab.php +++ /dev/null @@ -1,10 +0,0 @@ - 278, \chr(1) => 278, \chr(2) => 278, \chr(3) => 278, \chr(4) => 278, \chr(5) => 278, \chr(6) => 278, \chr(7) => 278, \chr(8) => 278, \chr(9) => 278, \chr(10) => 278, \chr(11) => 278, \chr(12) => 278, \chr(13) => 278, \chr(14) => 278, \chr(15) => 278, \chr(16) => 278, \chr(17) => 278, \chr(18) => 278, \chr(19) => 278, \chr(20) => 278, \chr(21) => 278, \chr(22) => 278, \chr(23) => 278, \chr(24) => 278, \chr(25) => 278, \chr(26) => 278, \chr(27) => 278, \chr(28) => 278, \chr(29) => 278, \chr(30) => 278, \chr(31) => 278, ' ' => 278, '!' => 333, '"' => 474, '#' => 556, '$' => 556, '%' => 889, '&' => 722, '\'' => 238, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 333, ';' => 333, '<' => 584, '=' => 584, '>' => 584, '?' => 611, '@' => 975, 'A' => 722, 'B' => 722, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 556, 'K' => 722, 'L' => 611, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 584, '_' => 556, '`' => 333, 'a' => 556, 'b' => 611, 'c' => 556, 'd' => 611, 'e' => 556, 'f' => 333, 'g' => 611, 'h' => 611, 'i' => 278, 'j' => 278, 'k' => 556, 'l' => 278, 'm' => 889, 'n' => 611, 'o' => 611, 'p' => 611, 'q' => 611, 'r' => 389, 's' => 556, 't' => 333, 'u' => 611, 'v' => 556, 'w' => 778, 'x' => 556, 'y' => 556, 'z' => 500, '{' => 389, '|' => 280, '}' => 389, '~' => 584, \chr(127) => 350, \chr(128) => 556, \chr(129) => 350, \chr(130) => 278, \chr(131) => 556, \chr(132) => 500, \chr(133) => 1000, \chr(134) => 556, \chr(135) => 556, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 667, \chr(139) => 333, \chr(140) => 1000, \chr(141) => 350, \chr(142) => 611, \chr(143) => 350, \chr(144) => 350, \chr(145) => 278, \chr(146) => 278, \chr(147) => 500, \chr(148) => 500, \chr(149) => 350, \chr(150) => 556, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 1000, \chr(154) => 556, \chr(155) => 333, \chr(156) => 944, \chr(157) => 350, \chr(158) => 500, \chr(159) => 667, \chr(160) => 278, \chr(161) => 333, \chr(162) => 556, \chr(163) => 556, \chr(164) => 556, \chr(165) => 556, \chr(166) => 280, \chr(167) => 556, \chr(168) => 333, \chr(169) => 737, \chr(170) => 370, \chr(171) => 556, \chr(172) => 584, \chr(173) => 333, \chr(174) => 737, \chr(175) => 333, \chr(176) => 400, \chr(177) => 584, \chr(178) => 333, \chr(179) => 333, \chr(180) => 333, \chr(181) => 611, \chr(182) => 556, \chr(183) => 278, \chr(184) => 333, \chr(185) => 333, \chr(186) => 365, \chr(187) => 556, \chr(188) => 834, \chr(189) => 834, \chr(190) => 834, \chr(191) => 611, \chr(192) => 722, \chr(193) => 722, \chr(194) => 722, \chr(195) => 722, \chr(196) => 722, \chr(197) => 722, \chr(198) => 1000, \chr(199) => 722, \chr(200) => 667, \chr(201) => 667, \chr(202) => 667, \chr(203) => 667, \chr(204) => 278, \chr(205) => 278, \chr(206) => 278, \chr(207) => 278, \chr(208) => 722, \chr(209) => 722, \chr(210) => 778, \chr(211) => 778, \chr(212) => 778, \chr(213) => 778, \chr(214) => 778, \chr(215) => 584, \chr(216) => 778, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 667, \chr(222) => 667, \chr(223) => 611, \chr(224) => 556, \chr(225) => 556, \chr(226) => 556, \chr(227) => 556, \chr(228) => 556, \chr(229) => 556, \chr(230) => 889, \chr(231) => 556, \chr(232) => 556, \chr(233) => 556, \chr(234) => 556, \chr(235) => 556, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 611, \chr(241) => 611, \chr(242) => 611, \chr(243) => 611, \chr(244) => 611, \chr(245) => 611, \chr(246) => 611, \chr(247) => 584, \chr(248) => 611, \chr(249) => 611, \chr(250) => 611, \chr(251) => 611, \chr(252) => 611, \chr(253) => 556, \chr(254) => 611, \chr(255) => 556); -//$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-170 -228 1003 962]'); -$desc = array('Flags' => 32, 'FontBBox' => '[-170 -228 1003 962]', 'ItalicAngle' => 0, 'Ascent' => 962, 'Descent' => -228, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 532, 'StemV' => 140, 'StemH' => 118, 'AvgWidth' => 535, 'MaxWidth' => 1000, 'MissingWidth' => 535); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -55), \chr(65) => array(\chr(84) => -74, \chr(86) => -74, \chr(87) => -55, \chr(89) => -91, \chr(118) => -37, \chr(119) => -18, \chr(121) => -37, \chr(146) => -55), \chr(70) => array(\chr(44) => -110, \chr(46) => -110, \chr(65) => -55), \chr(76) => array(\chr(84) => -74, \chr(86) => -74, \chr(87) => -55, \chr(89) => -91, \chr(121) => -37, \chr(146) => -55), \chr(80) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -74), \chr(82) => array(\chr(86) => -18, \chr(87) => -18, \chr(89) => -37), \chr(84) => array(\chr(44) => -110, \chr(46) => -110, \chr(58) => -110, \chr(65) => -74, \chr(79) => -18, \chr(97) => -74, \chr(99) => -74, \chr(101) => -74, \chr(105) => -18, \chr(111) => -74, \chr(114) => -55, \chr(115) => -74, \chr(117) => -74, \chr(119) => -74, \chr(121) => -74), \chr(86) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -55, \chr(65) => -74, \chr(97) => -55, \chr(101) => -55, \chr(105) => -18, \chr(111) => -74, \chr(114) => -55, \chr(117) => -37, \chr(121) => -37), \chr(87) => array(\chr(44) => -55, \chr(46) => -55, \chr(58) => -18, \chr(65) => -55, \chr(97) => -37, \chr(101) => -18, \chr(105) => -8, \chr(111) => -18, \chr(114) => -18, \chr(117) => -18, \chr(121) => -18), \chr(89) => array(\chr(44) => -110, \chr(46) => -110, \chr(58) => -74, \chr(65) => -91, \chr(97) => -55, \chr(101) => -55, \chr(105) => -37, \chr(111) => -74, \chr(112) => -55, \chr(113) => -74, \chr(117) => -55, \chr(118) => -55), \chr(102) => array(\chr(146) => 18), \chr(114) => array(\chr(44) => -55, \chr(46) => -55, \chr(146) => 37), \chr(118) => array(\chr(44) => -74, \chr(46) => -74), \chr(119) => array(\chr(44) => -37, \chr(46) => -37), \chr(121) => array(\chr(44) => -74, \chr(46) => -74), \chr(145) => array(\chr(145) => -37), \chr(146) => array(\chr(115) => -37, \chr(146) => -37)); diff --git a/dependencies/mpdf/mpdf/data/font/chelveticabi.php b/dependencies/mpdf/mpdf/data/font/chelveticabi.php deleted file mode 100644 index 4159a87..0000000 --- a/dependencies/mpdf/mpdf/data/font/chelveticabi.php +++ /dev/null @@ -1,10 +0,0 @@ - 278, \chr(1) => 278, \chr(2) => 278, \chr(3) => 278, \chr(4) => 278, \chr(5) => 278, \chr(6) => 278, \chr(7) => 278, \chr(8) => 278, \chr(9) => 278, \chr(10) => 278, \chr(11) => 278, \chr(12) => 278, \chr(13) => 278, \chr(14) => 278, \chr(15) => 278, \chr(16) => 278, \chr(17) => 278, \chr(18) => 278, \chr(19) => 278, \chr(20) => 278, \chr(21) => 278, \chr(22) => 278, \chr(23) => 278, \chr(24) => 278, \chr(25) => 278, \chr(26) => 278, \chr(27) => 278, \chr(28) => 278, \chr(29) => 278, \chr(30) => 278, \chr(31) => 278, ' ' => 278, '!' => 333, '"' => 474, '#' => 556, '$' => 556, '%' => 889, '&' => 722, '\'' => 238, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 333, ';' => 333, '<' => 584, '=' => 584, '>' => 584, '?' => 611, '@' => 975, 'A' => 722, 'B' => 722, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 556, 'K' => 722, 'L' => 611, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 584, '_' => 556, '`' => 333, 'a' => 556, 'b' => 611, 'c' => 556, 'd' => 611, 'e' => 556, 'f' => 333, 'g' => 611, 'h' => 611, 'i' => 278, 'j' => 278, 'k' => 556, 'l' => 278, 'm' => 889, 'n' => 611, 'o' => 611, 'p' => 611, 'q' => 611, 'r' => 389, 's' => 556, 't' => 333, 'u' => 611, 'v' => 556, 'w' => 778, 'x' => 556, 'y' => 556, 'z' => 500, '{' => 389, '|' => 280, '}' => 389, '~' => 584, \chr(127) => 350, \chr(128) => 556, \chr(129) => 350, \chr(130) => 278, \chr(131) => 556, \chr(132) => 500, \chr(133) => 1000, \chr(134) => 556, \chr(135) => 556, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 667, \chr(139) => 333, \chr(140) => 1000, \chr(141) => 350, \chr(142) => 611, \chr(143) => 350, \chr(144) => 350, \chr(145) => 278, \chr(146) => 278, \chr(147) => 500, \chr(148) => 500, \chr(149) => 350, \chr(150) => 556, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 1000, \chr(154) => 556, \chr(155) => 333, \chr(156) => 944, \chr(157) => 350, \chr(158) => 500, \chr(159) => 667, \chr(160) => 278, \chr(161) => 333, \chr(162) => 556, \chr(163) => 556, \chr(164) => 556, \chr(165) => 556, \chr(166) => 280, \chr(167) => 556, \chr(168) => 333, \chr(169) => 737, \chr(170) => 370, \chr(171) => 556, \chr(172) => 584, \chr(173) => 333, \chr(174) => 737, \chr(175) => 333, \chr(176) => 400, \chr(177) => 584, \chr(178) => 333, \chr(179) => 333, \chr(180) => 333, \chr(181) => 611, \chr(182) => 556, \chr(183) => 278, \chr(184) => 333, \chr(185) => 333, \chr(186) => 365, \chr(187) => 556, \chr(188) => 834, \chr(189) => 834, \chr(190) => 834, \chr(191) => 611, \chr(192) => 722, \chr(193) => 722, \chr(194) => 722, \chr(195) => 722, \chr(196) => 722, \chr(197) => 722, \chr(198) => 1000, \chr(199) => 722, \chr(200) => 667, \chr(201) => 667, \chr(202) => 667, \chr(203) => 667, \chr(204) => 278, \chr(205) => 278, \chr(206) => 278, \chr(207) => 278, \chr(208) => 722, \chr(209) => 722, \chr(210) => 778, \chr(211) => 778, \chr(212) => 778, \chr(213) => 778, \chr(214) => 778, \chr(215) => 584, \chr(216) => 778, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 667, \chr(222) => 667, \chr(223) => 611, \chr(224) => 556, \chr(225) => 556, \chr(226) => 556, \chr(227) => 556, \chr(228) => 556, \chr(229) => 556, \chr(230) => 889, \chr(231) => 556, \chr(232) => 556, \chr(233) => 556, \chr(234) => 556, \chr(235) => 556, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 611, \chr(241) => 611, \chr(242) => 611, \chr(243) => 611, \chr(244) => 611, \chr(245) => 611, \chr(246) => 611, \chr(247) => 584, \chr(248) => 611, \chr(249) => 611, \chr(250) => 611, \chr(251) => 611, \chr(252) => 611, \chr(253) => 556, \chr(254) => 611, \chr(255) => 556); -//$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-174 -228 1114 962]'); -$desc = array('Flags' => 96, 'FontBBox' => '[-174 -228 1114 962]', 'ItalicAngle' => -12, 'Ascent' => 962, 'Descent' => -228, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 532, 'StemV' => 140, 'StemH' => 118, 'AvgWidth' => 535, 'MaxWidth' => 1000, 'MissingWidth' => 535); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -74), \chr(65) => array(\chr(84) => -74, \chr(86) => -74, \chr(87) => -55, \chr(89) => -74, \chr(146) => -55), \chr(70) => array(\chr(44) => -110, \chr(46) => -110, \chr(65) => -55), \chr(76) => array(\chr(84) => -74, \chr(86) => -55, \chr(87) => -55, \chr(89) => -74, \chr(146) => -74), \chr(80) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -74), \chr(82) => array(\chr(84) => -18, \chr(87) => -18, \chr(89) => -18), \chr(84) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -74, \chr(65) => -74, \chr(79) => -18, \chr(97) => -37, \chr(99) => -37, \chr(101) => -37, \chr(105) => -18, \chr(111) => -37, \chr(114) => -18, \chr(115) => -37, \chr(117) => -18, \chr(119) => -37, \chr(121) => -37), \chr(86) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -37, \chr(65) => -74, \chr(97) => -37, \chr(101) => -37, \chr(105) => -37, \chr(111) => -37, \chr(114) => -18, \chr(117) => -18, \chr(121) => -18), \chr(87) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -37, \chr(65) => -55, \chr(97) => -18, \chr(101) => -18, \chr(105) => -8, \chr(111) => -18, \chr(114) => -18, \chr(117) => -18, \chr(121) => -18), \chr(89) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -55, \chr(65) => -74, \chr(97) => -37, \chr(101) => -37, \chr(105) => -37, \chr(111) => -37, \chr(112) => -37, \chr(113) => -37, \chr(117) => -37, \chr(118) => -37), \chr(102) => array(\chr(102) => -18, \chr(146) => 18), \chr(114) => array(\chr(44) => -55, \chr(46) => -55, \chr(146) => 37), \chr(118) => array(\chr(44) => -55, \chr(46) => -55), \chr(119) => array(\chr(44) => -37, \chr(46) => -37), \chr(121) => array(\chr(44) => -37, \chr(46) => -37), \chr(145) => array(\chr(145) => -37), \chr(146) => array(\chr(115) => -18, \chr(116) => 18, \chr(146) => -37)); diff --git a/dependencies/mpdf/mpdf/data/font/chelveticai.php b/dependencies/mpdf/mpdf/data/font/chelveticai.php deleted file mode 100644 index afdafd4..0000000 --- a/dependencies/mpdf/mpdf/data/font/chelveticai.php +++ /dev/null @@ -1,10 +0,0 @@ - 278, \chr(1) => 278, \chr(2) => 278, \chr(3) => 278, \chr(4) => 278, \chr(5) => 278, \chr(6) => 278, \chr(7) => 278, \chr(8) => 278, \chr(9) => 278, \chr(10) => 278, \chr(11) => 278, \chr(12) => 278, \chr(13) => 278, \chr(14) => 278, \chr(15) => 278, \chr(16) => 278, \chr(17) => 278, \chr(18) => 278, \chr(19) => 278, \chr(20) => 278, \chr(21) => 278, \chr(22) => 278, \chr(23) => 278, \chr(24) => 278, \chr(25) => 278, \chr(26) => 278, \chr(27) => 278, \chr(28) => 278, \chr(29) => 278, \chr(30) => 278, \chr(31) => 278, ' ' => 278, '!' => 278, '"' => 355, '#' => 556, '$' => 556, '%' => 889, '&' => 667, '\'' => 191, '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, '8' => 556, '9' => 556, ':' => 278, ';' => 278, '<' => 584, '=' => 584, '>' => 584, '?' => 556, '@' => 1015, 'A' => 667, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 722, 'I' => 278, 'J' => 500, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 722, 'O' => 778, 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 278, '\\' => 278, ']' => 278, '^' => 469, '_' => 556, '`' => 333, 'a' => 556, 'b' => 556, 'c' => 500, 'd' => 556, 'e' => 556, 'f' => 278, 'g' => 556, 'h' => 556, 'i' => 222, 'j' => 222, 'k' => 500, 'l' => 222, 'm' => 833, 'n' => 556, 'o' => 556, 'p' => 556, 'q' => 556, 'r' => 333, 's' => 500, 't' => 278, 'u' => 556, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 500, '{' => 334, '|' => 260, '}' => 334, '~' => 584, \chr(127) => 350, \chr(128) => 556, \chr(129) => 350, \chr(130) => 222, \chr(131) => 556, \chr(132) => 333, \chr(133) => 1000, \chr(134) => 556, \chr(135) => 556, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 667, \chr(139) => 333, \chr(140) => 1000, \chr(141) => 350, \chr(142) => 611, \chr(143) => 350, \chr(144) => 350, \chr(145) => 222, \chr(146) => 222, \chr(147) => 333, \chr(148) => 333, \chr(149) => 350, \chr(150) => 556, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 1000, \chr(154) => 500, \chr(155) => 333, \chr(156) => 944, \chr(157) => 350, \chr(158) => 500, \chr(159) => 667, \chr(160) => 278, \chr(161) => 333, \chr(162) => 556, \chr(163) => 556, \chr(164) => 556, \chr(165) => 556, \chr(166) => 260, \chr(167) => 556, \chr(168) => 333, \chr(169) => 737, \chr(170) => 370, \chr(171) => 556, \chr(172) => 584, \chr(173) => 333, \chr(174) => 737, \chr(175) => 333, \chr(176) => 400, \chr(177) => 584, \chr(178) => 333, \chr(179) => 333, \chr(180) => 333, \chr(181) => 556, \chr(182) => 537, \chr(183) => 278, \chr(184) => 333, \chr(185) => 333, \chr(186) => 365, \chr(187) => 556, \chr(188) => 834, \chr(189) => 834, \chr(190) => 834, \chr(191) => 611, \chr(192) => 667, \chr(193) => 667, \chr(194) => 667, \chr(195) => 667, \chr(196) => 667, \chr(197) => 667, \chr(198) => 1000, \chr(199) => 722, \chr(200) => 667, \chr(201) => 667, \chr(202) => 667, \chr(203) => 667, \chr(204) => 278, \chr(205) => 278, \chr(206) => 278, \chr(207) => 278, \chr(208) => 722, \chr(209) => 722, \chr(210) => 778, \chr(211) => 778, \chr(212) => 778, \chr(213) => 778, \chr(214) => 778, \chr(215) => 584, \chr(216) => 778, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 667, \chr(222) => 667, \chr(223) => 611, \chr(224) => 556, \chr(225) => 556, \chr(226) => 556, \chr(227) => 556, \chr(228) => 556, \chr(229) => 556, \chr(230) => 889, \chr(231) => 500, \chr(232) => 556, \chr(233) => 556, \chr(234) => 556, \chr(235) => 556, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 556, \chr(241) => 556, \chr(242) => 556, \chr(243) => 556, \chr(244) => 556, \chr(245) => 556, \chr(246) => 556, \chr(247) => 584, \chr(248) => 611, \chr(249) => 556, \chr(250) => 556, \chr(251) => 556, \chr(252) => 556, \chr(253) => 500, \chr(254) => 556, \chr(255) => 500); -//$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-170 -225 1116 931]'); -$desc = array('Flags' => 96, 'FontBBox' => '[-170 -225 1116 931]', 'ItalicAngle' => -12, 'Ascent' => 931, 'Descent' => -225, 'Leading' => 0, 'CapHeight' => 718, 'XHeight' => 523, 'StemV' => 88, 'StemH' => 76, 'AvgWidth' => 513, 'MaxWidth' => 1015, 'MissingWidth' => 513); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -74), \chr(65) => array(\chr(84) => -74, \chr(86) => -55, \chr(87) => -18, \chr(89) => -74, \chr(118) => -18, \chr(119) => -18, \chr(121) => -8, \chr(146) => -37), \chr(70) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -74), \chr(76) => array(\chr(84) => -74, \chr(86) => -55, \chr(87) => -37, \chr(89) => -91, \chr(121) => -18, \chr(146) => -55), \chr(80) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -74), \chr(82) => array(\chr(84) => -18, \chr(86) => -18, \chr(87) => -18, \chr(89) => -37), \chr(84) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -74, \chr(65) => -74, \chr(79) => -18, \chr(97) => -91, \chr(99) => -91, \chr(101) => -91, \chr(105) => -8, \chr(111) => -91, \chr(114) => -74, \chr(115) => -91, \chr(117) => -74, \chr(119) => -74, \chr(121) => -74), \chr(86) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -18, \chr(65) => -55, \chr(97) => -37, \chr(101) => -37, \chr(105) => -18, \chr(111) => -37, \chr(114) => -18, \chr(117) => -18, \chr(121) => -18), \chr(87) => array(\chr(44) => -37, \chr(46) => -37, \chr(65) => -18, \chr(97) => -18, \chr(101) => -18, \chr(105) => -8), \chr(89) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -37, \chr(65) => -55, \chr(97) => -74, \chr(101) => -55, \chr(105) => -18, \chr(111) => -55, \chr(112) => -55, \chr(113) => -55, \chr(117) => -37, \chr(118) => -37), \chr(102) => array(\chr(146) => 37), \chr(114) => array(\chr(44) => -55, \chr(46) => -37, \chr(146) => 37), \chr(118) => array(\chr(44) => -74, \chr(46) => -74), \chr(119) => array(\chr(44) => -55, \chr(46) => -55), \chr(121) => array(\chr(44) => -74, \chr(46) => -74), \chr(145) => array(\chr(145) => -37), \chr(146) => array(\chr(115) => -18, \chr(146) => -37)); diff --git a/dependencies/mpdf/mpdf/data/font/csymbol.php b/dependencies/mpdf/mpdf/data/font/csymbol.php deleted file mode 100644 index 984978d..0000000 --- a/dependencies/mpdf/mpdf/data/font/csymbol.php +++ /dev/null @@ -1,9 +0,0 @@ - 250, \chr(1) => 250, \chr(2) => 250, \chr(3) => 250, \chr(4) => 250, \chr(5) => 250, \chr(6) => 250, \chr(7) => 250, \chr(8) => 250, \chr(9) => 250, \chr(10) => 250, \chr(11) => 250, \chr(12) => 250, \chr(13) => 250, \chr(14) => 250, \chr(15) => 250, \chr(16) => 250, \chr(17) => 250, \chr(18) => 250, \chr(19) => 250, \chr(20) => 250, \chr(21) => 250, \chr(22) => 250, \chr(23) => 250, \chr(24) => 250, \chr(25) => 250, \chr(26) => 250, \chr(27) => 250, \chr(28) => 250, \chr(29) => 250, \chr(30) => 250, \chr(31) => 250, ' ' => 250, '!' => 333, '"' => 713, '#' => 500, '$' => 549, '%' => 833, '&' => 778, '\'' => 439, '(' => 333, ')' => 333, '*' => 500, '+' => 549, ',' => 250, '-' => 549, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 278, ';' => 278, '<' => 549, '=' => 549, '>' => 549, '?' => 444, '@' => 549, 'A' => 722, 'B' => 667, 'C' => 722, 'D' => 612, 'E' => 611, 'F' => 763, 'G' => 603, 'H' => 722, 'I' => 333, 'J' => 631, 'K' => 722, 'L' => 686, 'M' => 889, 'N' => 722, 'O' => 722, 'P' => 768, 'Q' => 741, 'R' => 556, 'S' => 592, 'T' => 611, 'U' => 690, 'V' => 439, 'W' => 768, 'X' => 645, 'Y' => 795, 'Z' => 611, '[' => 333, '\\' => 863, ']' => 333, '^' => 658, '_' => 500, '`' => 500, 'a' => 631, 'b' => 549, 'c' => 549, 'd' => 494, 'e' => 439, 'f' => 521, 'g' => 411, 'h' => 603, 'i' => 329, 'j' => 603, 'k' => 549, 'l' => 549, 'm' => 576, 'n' => 521, 'o' => 549, 'p' => 549, 'q' => 521, 'r' => 549, 's' => 603, 't' => 439, 'u' => 576, 'v' => 713, 'w' => 686, 'x' => 493, 'y' => 686, 'z' => 494, '{' => 480, '|' => 200, '}' => 480, '~' => 549, \chr(127) => 0, \chr(128) => 0, \chr(129) => 0, \chr(130) => 0, \chr(131) => 0, \chr(132) => 0, \chr(133) => 0, \chr(134) => 0, \chr(135) => 0, \chr(136) => 0, \chr(137) => 0, \chr(138) => 0, \chr(139) => 0, \chr(140) => 0, \chr(141) => 0, \chr(142) => 0, \chr(143) => 0, \chr(144) => 0, \chr(145) => 0, \chr(146) => 0, \chr(147) => 0, \chr(148) => 0, \chr(149) => 0, \chr(150) => 0, \chr(151) => 0, \chr(152) => 0, \chr(153) => 0, \chr(154) => 0, \chr(155) => 0, \chr(156) => 0, \chr(157) => 0, \chr(158) => 0, \chr(159) => 0, \chr(160) => 750, \chr(161) => 620, \chr(162) => 247, \chr(163) => 549, \chr(164) => 167, \chr(165) => 713, \chr(166) => 500, \chr(167) => 753, \chr(168) => 753, \chr(169) => 753, \chr(170) => 753, \chr(171) => 1042, \chr(172) => 987, \chr(173) => 603, \chr(174) => 987, \chr(175) => 603, \chr(176) => 400, \chr(177) => 549, \chr(178) => 411, \chr(179) => 549, \chr(180) => 549, \chr(181) => 713, \chr(182) => 494, \chr(183) => 460, \chr(184) => 549, \chr(185) => 549, \chr(186) => 549, \chr(187) => 549, \chr(188) => 1000, \chr(189) => 603, \chr(190) => 1000, \chr(191) => 658, \chr(192) => 823, \chr(193) => 686, \chr(194) => 795, \chr(195) => 987, \chr(196) => 768, \chr(197) => 768, \chr(198) => 823, \chr(199) => 768, \chr(200) => 768, \chr(201) => 713, \chr(202) => 713, \chr(203) => 713, \chr(204) => 713, \chr(205) => 713, \chr(206) => 713, \chr(207) => 713, \chr(208) => 768, \chr(209) => 713, \chr(210) => 790, \chr(211) => 790, \chr(212) => 890, \chr(213) => 823, \chr(214) => 549, \chr(215) => 250, \chr(216) => 713, \chr(217) => 603, \chr(218) => 603, \chr(219) => 1042, \chr(220) => 987, \chr(221) => 603, \chr(222) => 987, \chr(223) => 603, \chr(224) => 494, \chr(225) => 329, \chr(226) => 790, \chr(227) => 790, \chr(228) => 786, \chr(229) => 713, \chr(230) => 384, \chr(231) => 384, \chr(232) => 384, \chr(233) => 384, \chr(234) => 384, \chr(235) => 384, \chr(236) => 494, \chr(237) => 494, \chr(238) => 494, \chr(239) => 494, \chr(240) => 0, \chr(241) => 329, \chr(242) => 274, \chr(243) => 686, \chr(244) => 686, \chr(245) => 686, \chr(246) => 384, \chr(247) => 384, \chr(248) => 384, \chr(249) => 384, \chr(250) => 384, \chr(251) => 384, \chr(252) => 494, \chr(253) => 494, \chr(254) => 494, \chr(255) => 0); -//$desc=array('FontBBox'=>'[-180 -293 1090 1010]'); -$desc = array('Flags' => 4, 'FontBBox' => '[-180 -293 1090 1010]', 'ItalicAngle' => 0, 'Ascent' => 1010, 'Descent' => -293, 'Leading' => 0, 'CapHeight' => 1010, 'StemV' => 85, 'StemH' => 92, 'AvgWidth' => 587, 'MaxWidth' => 1042, 'MissingWidth' => 587); -$up = -100; -$ut = 50; diff --git a/dependencies/mpdf/mpdf/data/font/ctimes.php b/dependencies/mpdf/mpdf/data/font/ctimes.php deleted file mode 100644 index fadf21c..0000000 --- a/dependencies/mpdf/mpdf/data/font/ctimes.php +++ /dev/null @@ -1,10 +0,0 @@ - 250, \chr(1) => 250, \chr(2) => 250, \chr(3) => 250, \chr(4) => 250, \chr(5) => 250, \chr(6) => 250, \chr(7) => 250, \chr(8) => 250, \chr(9) => 250, \chr(10) => 250, \chr(11) => 250, \chr(12) => 250, \chr(13) => 250, \chr(14) => 250, \chr(15) => 250, \chr(16) => 250, \chr(17) => 250, \chr(18) => 250, \chr(19) => 250, \chr(20) => 250, \chr(21) => 250, \chr(22) => 250, \chr(23) => 250, \chr(24) => 250, \chr(25) => 250, \chr(26) => 250, \chr(27) => 250, \chr(28) => 250, \chr(29) => 250, \chr(30) => 250, \chr(31) => 250, ' ' => 250, '!' => 333, '"' => 408, '#' => 500, '$' => 500, '%' => 833, '&' => 778, '\'' => 180, '(' => 333, ')' => 333, '*' => 500, '+' => 564, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 278, ';' => 278, '<' => 564, '=' => 564, '>' => 564, '?' => 444, '@' => 921, 'A' => 722, 'B' => 667, 'C' => 667, 'D' => 722, 'E' => 611, 'F' => 556, 'G' => 722, 'H' => 722, 'I' => 333, 'J' => 389, 'K' => 722, 'L' => 611, 'M' => 889, 'N' => 722, 'O' => 722, 'P' => 556, 'Q' => 722, 'R' => 667, 'S' => 556, 'T' => 611, 'U' => 722, 'V' => 722, 'W' => 944, 'X' => 722, 'Y' => 722, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 469, '_' => 500, '`' => 333, 'a' => 444, 'b' => 500, 'c' => 444, 'd' => 500, 'e' => 444, 'f' => 333, 'g' => 500, 'h' => 500, 'i' => 278, 'j' => 278, 'k' => 500, 'l' => 278, 'm' => 778, 'n' => 500, 'o' => 500, 'p' => 500, 'q' => 500, 'r' => 333, 's' => 389, 't' => 278, 'u' => 500, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 444, '{' => 480, '|' => 200, '}' => 480, '~' => 541, \chr(127) => 350, \chr(128) => 500, \chr(129) => 350, \chr(130) => 333, \chr(131) => 500, \chr(132) => 444, \chr(133) => 1000, \chr(134) => 500, \chr(135) => 500, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 556, \chr(139) => 333, \chr(140) => 889, \chr(141) => 350, \chr(142) => 611, \chr(143) => 350, \chr(144) => 350, \chr(145) => 333, \chr(146) => 333, \chr(147) => 444, \chr(148) => 444, \chr(149) => 350, \chr(150) => 500, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 980, \chr(154) => 389, \chr(155) => 333, \chr(156) => 722, \chr(157) => 350, \chr(158) => 444, \chr(159) => 722, \chr(160) => 250, \chr(161) => 333, \chr(162) => 500, \chr(163) => 500, \chr(164) => 500, \chr(165) => 500, \chr(166) => 200, \chr(167) => 500, \chr(168) => 333, \chr(169) => 760, \chr(170) => 276, \chr(171) => 500, \chr(172) => 564, \chr(173) => 333, \chr(174) => 760, \chr(175) => 333, \chr(176) => 400, \chr(177) => 564, \chr(178) => 300, \chr(179) => 300, \chr(180) => 333, \chr(181) => 500, \chr(182) => 453, \chr(183) => 250, \chr(184) => 333, \chr(185) => 300, \chr(186) => 310, \chr(187) => 500, \chr(188) => 750, \chr(189) => 750, \chr(190) => 750, \chr(191) => 444, \chr(192) => 722, \chr(193) => 722, \chr(194) => 722, \chr(195) => 722, \chr(196) => 722, \chr(197) => 722, \chr(198) => 889, \chr(199) => 667, \chr(200) => 611, \chr(201) => 611, \chr(202) => 611, \chr(203) => 611, \chr(204) => 333, \chr(205) => 333, \chr(206) => 333, \chr(207) => 333, \chr(208) => 722, \chr(209) => 722, \chr(210) => 722, \chr(211) => 722, \chr(212) => 722, \chr(213) => 722, \chr(214) => 722, \chr(215) => 564, \chr(216) => 722, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 722, \chr(222) => 556, \chr(223) => 500, \chr(224) => 444, \chr(225) => 444, \chr(226) => 444, \chr(227) => 444, \chr(228) => 444, \chr(229) => 444, \chr(230) => 667, \chr(231) => 444, \chr(232) => 444, \chr(233) => 444, \chr(234) => 444, \chr(235) => 444, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 500, \chr(241) => 500, \chr(242) => 500, \chr(243) => 500, \chr(244) => 500, \chr(245) => 500, \chr(246) => 500, \chr(247) => 564, \chr(248) => 500, \chr(249) => 500, \chr(250) => 500, \chr(251) => 500, \chr(252) => 500, \chr(253) => 500, \chr(254) => 500, \chr(255) => 500); -//$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>662,'FontBBox'=>'[-168 -218 1000 898]'); -$desc = array('Flags' => 32, 'FontBBox' => '[-168 -218 1000 898]', 'ItalicAngle' => 0, 'Ascent' => 898, 'Descent' => -218, 'Leading' => 0, 'CapHeight' => 662, 'XHeight' => 450, 'StemV' => 84, 'StemH' => 28, 'AvgWidth' => 495, 'MaxWidth' => 1000, 'MissingWidth' => 495); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -37), \chr(65) => array(\chr(84) => -110, \chr(86) => -128, \chr(87) => -80, \chr(89) => -91, \chr(118) => -74, \chr(119) => -91, \chr(121) => -91, \chr(146) => -110), \chr(70) => array(\chr(44) => -80, \chr(46) => -80, \chr(65) => -74), \chr(76) => array(\chr(84) => -91, \chr(86) => -91, \chr(87) => -74, \chr(89) => -100, \chr(121) => -55, \chr(146) => -91), \chr(80) => array(\chr(44) => -110, \chr(46) => -110, \chr(65) => -91), \chr(82) => array(\chr(84) => -60, \chr(86) => -80, \chr(87) => -55, \chr(89) => -55, \chr(121) => -40), \chr(84) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -49, \chr(65) => -80, \chr(79) => -18, \chr(97) => -69, \chr(99) => -69, \chr(101) => -69, \chr(105) => -35, \chr(111) => -69, \chr(114) => -35, \chr(115) => -69, \chr(117) => -35, \chr(119) => -69, \chr(121) => -69), \chr(86) => array(\chr(44) => -128, \chr(46) => -128, \chr(58) => -74, \chr(65) => -128, \chr(97) => -110, \chr(101) => -110, \chr(105) => -60, \chr(111) => -128, \chr(114) => -60, \chr(117) => -60, \chr(121) => -110), \chr(87) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -37, \chr(65) => -110, \chr(97) => -80, \chr(101) => -80, \chr(105) => -40, \chr(111) => -80, \chr(114) => -40, \chr(117) => -40, \chr(121) => -60), \chr(89) => array(\chr(44) => -128, \chr(46) => -128, \chr(58) => -91, \chr(65) => -110, \chr(97) => -100, \chr(101) => -100, \chr(105) => -55, \chr(111) => -100, \chr(112) => -91, \chr(113) => -110, \chr(117) => -110, \chr(118) => -100), \chr(102) => array(\chr(102) => -18, \chr(146) => 55), \chr(114) => array(\chr(44) => -40, \chr(46) => -55, \chr(103) => -18, \chr(146) => 37), \chr(118) => array(\chr(44) => -64, \chr(46) => -64), \chr(119) => array(\chr(44) => -64, \chr(46) => -64), \chr(121) => array(\chr(44) => -64, \chr(46) => -64), \chr(145) => array(\chr(145) => -74), \chr(146) => array(\chr(115) => -55, \chr(116) => -18, \chr(146) => -74)); diff --git a/dependencies/mpdf/mpdf/data/font/ctimesb.php b/dependencies/mpdf/mpdf/data/font/ctimesb.php deleted file mode 100644 index bf2e227..0000000 --- a/dependencies/mpdf/mpdf/data/font/ctimesb.php +++ /dev/null @@ -1,10 +0,0 @@ - 250, \chr(1) => 250, \chr(2) => 250, \chr(3) => 250, \chr(4) => 250, \chr(5) => 250, \chr(6) => 250, \chr(7) => 250, \chr(8) => 250, \chr(9) => 250, \chr(10) => 250, \chr(11) => 250, \chr(12) => 250, \chr(13) => 250, \chr(14) => 250, \chr(15) => 250, \chr(16) => 250, \chr(17) => 250, \chr(18) => 250, \chr(19) => 250, \chr(20) => 250, \chr(21) => 250, \chr(22) => 250, \chr(23) => 250, \chr(24) => 250, \chr(25) => 250, \chr(26) => 250, \chr(27) => 250, \chr(28) => 250, \chr(29) => 250, \chr(30) => 250, \chr(31) => 250, ' ' => 250, '!' => 333, '"' => 555, '#' => 500, '$' => 500, '%' => 1000, '&' => 833, '\'' => 278, '(' => 333, ')' => 333, '*' => 500, '+' => 570, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 333, ';' => 333, '<' => 570, '=' => 570, '>' => 570, '?' => 500, '@' => 930, 'A' => 722, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, 'H' => 778, 'I' => 389, 'J' => 500, 'K' => 778, 'L' => 667, 'M' => 944, 'N' => 722, 'O' => 778, 'P' => 611, 'Q' => 778, 'R' => 722, 'S' => 556, 'T' => 667, 'U' => 722, 'V' => 722, 'W' => 1000, 'X' => 722, 'Y' => 722, 'Z' => 667, '[' => 333, '\\' => 278, ']' => 333, '^' => 581, '_' => 500, '`' => 333, 'a' => 500, 'b' => 556, 'c' => 444, 'd' => 556, 'e' => 444, 'f' => 333, 'g' => 500, 'h' => 556, 'i' => 278, 'j' => 333, 'k' => 556, 'l' => 278, 'm' => 833, 'n' => 556, 'o' => 500, 'p' => 556, 'q' => 556, 'r' => 444, 's' => 389, 't' => 333, 'u' => 556, 'v' => 500, 'w' => 722, 'x' => 500, 'y' => 500, 'z' => 444, '{' => 394, '|' => 220, '}' => 394, '~' => 520, \chr(127) => 350, \chr(128) => 500, \chr(129) => 350, \chr(130) => 333, \chr(131) => 500, \chr(132) => 500, \chr(133) => 1000, \chr(134) => 500, \chr(135) => 500, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 556, \chr(139) => 333, \chr(140) => 1000, \chr(141) => 350, \chr(142) => 667, \chr(143) => 350, \chr(144) => 350, \chr(145) => 333, \chr(146) => 333, \chr(147) => 500, \chr(148) => 500, \chr(149) => 350, \chr(150) => 500, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 1000, \chr(154) => 389, \chr(155) => 333, \chr(156) => 722, \chr(157) => 350, \chr(158) => 444, \chr(159) => 722, \chr(160) => 250, \chr(161) => 333, \chr(162) => 500, \chr(163) => 500, \chr(164) => 500, \chr(165) => 500, \chr(166) => 220, \chr(167) => 500, \chr(168) => 333, \chr(169) => 747, \chr(170) => 300, \chr(171) => 500, \chr(172) => 570, \chr(173) => 333, \chr(174) => 747, \chr(175) => 333, \chr(176) => 400, \chr(177) => 570, \chr(178) => 300, \chr(179) => 300, \chr(180) => 333, \chr(181) => 556, \chr(182) => 540, \chr(183) => 250, \chr(184) => 333, \chr(185) => 300, \chr(186) => 330, \chr(187) => 500, \chr(188) => 750, \chr(189) => 750, \chr(190) => 750, \chr(191) => 500, \chr(192) => 722, \chr(193) => 722, \chr(194) => 722, \chr(195) => 722, \chr(196) => 722, \chr(197) => 722, \chr(198) => 1000, \chr(199) => 722, \chr(200) => 667, \chr(201) => 667, \chr(202) => 667, \chr(203) => 667, \chr(204) => 389, \chr(205) => 389, \chr(206) => 389, \chr(207) => 389, \chr(208) => 722, \chr(209) => 722, \chr(210) => 778, \chr(211) => 778, \chr(212) => 778, \chr(213) => 778, \chr(214) => 778, \chr(215) => 570, \chr(216) => 778, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 722, \chr(222) => 611, \chr(223) => 556, \chr(224) => 500, \chr(225) => 500, \chr(226) => 500, \chr(227) => 500, \chr(228) => 500, \chr(229) => 500, \chr(230) => 722, \chr(231) => 444, \chr(232) => 444, \chr(233) => 444, \chr(234) => 444, \chr(235) => 444, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 500, \chr(241) => 556, \chr(242) => 500, \chr(243) => 500, \chr(244) => 500, \chr(245) => 500, \chr(246) => 500, \chr(247) => 570, \chr(248) => 500, \chr(249) => 556, \chr(250) => 556, \chr(251) => 556, \chr(252) => 556, \chr(253) => 500, \chr(254) => 556, \chr(255) => 500); -//$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>676,'FontBBox'=>'[-168 -218 1000 935]'); -$desc = array('Flags' => 32, 'FontBBox' => '[-168 -218 1000 935]', 'ItalicAngle' => 0, 'Ascent' => 935, 'Descent' => -218, 'Leading' => 0, 'CapHeight' => 676, 'XHeight' => 461, 'StemV' => 139, 'StemH' => 44, 'AvgWidth' => 516, 'MaxWidth' => 1000, 'MissingWidth' => 516); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -55), \chr(65) => array(\chr(84) => -74, \chr(86) => -128, \chr(87) => -110, \chr(89) => -91, \chr(118) => -74, \chr(119) => -74, \chr(121) => -74, \chr(146) => -74), \chr(70) => array(\chr(44) => -91, \chr(46) => -91, \chr(65) => -74), \chr(76) => array(\chr(84) => -91, \chr(86) => -91, \chr(87) => -91, \chr(89) => -91, \chr(121) => -55, \chr(146) => -91), \chr(80) => array(\chr(44) => -91, \chr(46) => -91, \chr(65) => -74), \chr(82) => array(\chr(84) => -35, \chr(86) => -35, \chr(87) => -35, \chr(89) => -35, \chr(121) => -35), \chr(84) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -74, \chr(65) => -74, \chr(79) => -18, \chr(97) => -91, \chr(99) => -91, \chr(101) => -91, \chr(105) => -18, \chr(111) => -91, \chr(114) => -74, \chr(115) => -91, \chr(117) => -91, \chr(119) => -74, \chr(121) => -74), \chr(86) => array(\chr(44) => -128, \chr(46) => -128, \chr(58) => -91, \chr(65) => -128, \chr(79) => -20, \chr(97) => -91, \chr(101) => -91, \chr(105) => -37, \chr(111) => -91, \chr(114) => -74, \chr(117) => -91, \chr(121) => -91), \chr(87) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -55, \chr(65) => -110, \chr(97) => -55, \chr(101) => -55, \chr(105) => -18, \chr(111) => -55, \chr(114) => -18, \chr(117) => -18, \chr(121) => -37), \chr(89) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -91, \chr(65) => -91, \chr(97) => -110, \chr(101) => -110, \chr(105) => -37, \chr(111) => -110, \chr(112) => -91, \chr(113) => -110, \chr(117) => -91, \chr(118) => -110), \chr(102) => array(\chr(102) => 0, \chr(146) => 55), \chr(114) => array(\chr(44) => -91, \chr(46) => -91, \chr(99) => -18, \chr(101) => -18, \chr(104) => 0, \chr(111) => -18, \chr(113) => -18, \chr(116) => 0, \chr(119) => 0, \chr(120) => 0, \chr(121) => 0, \chr(122) => 0, \chr(146) => 18), \chr(118) => array(\chr(44) => -55, \chr(46) => -55), \chr(119) => array(\chr(44) => -55, \chr(46) => -55), \chr(121) => array(\chr(44) => -55, \chr(46) => -55), \chr(145) => array(\chr(145) => -74), \chr(146) => array(\chr(115) => -37, \chr(146) => -74)); diff --git a/dependencies/mpdf/mpdf/data/font/ctimesbi.php b/dependencies/mpdf/mpdf/data/font/ctimesbi.php deleted file mode 100644 index f8ffda6..0000000 --- a/dependencies/mpdf/mpdf/data/font/ctimesbi.php +++ /dev/null @@ -1,10 +0,0 @@ - 250, \chr(1) => 250, \chr(2) => 250, \chr(3) => 250, \chr(4) => 250, \chr(5) => 250, \chr(6) => 250, \chr(7) => 250, \chr(8) => 250, \chr(9) => 250, \chr(10) => 250, \chr(11) => 250, \chr(12) => 250, \chr(13) => 250, \chr(14) => 250, \chr(15) => 250, \chr(16) => 250, \chr(17) => 250, \chr(18) => 250, \chr(19) => 250, \chr(20) => 250, \chr(21) => 250, \chr(22) => 250, \chr(23) => 250, \chr(24) => 250, \chr(25) => 250, \chr(26) => 250, \chr(27) => 250, \chr(28) => 250, \chr(29) => 250, \chr(30) => 250, \chr(31) => 250, ' ' => 250, '!' => 389, '"' => 555, '#' => 500, '$' => 500, '%' => 833, '&' => 778, '\'' => 278, '(' => 333, ')' => 333, '*' => 500, '+' => 570, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 333, ';' => 333, '<' => 570, '=' => 570, '>' => 570, '?' => 500, '@' => 832, 'A' => 667, 'B' => 667, 'C' => 667, 'D' => 722, 'E' => 667, 'F' => 667, 'G' => 722, 'H' => 778, 'I' => 389, 'J' => 500, 'K' => 667, 'L' => 611, 'M' => 889, 'N' => 722, 'O' => 722, 'P' => 611, 'Q' => 722, 'R' => 667, 'S' => 556, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 889, 'X' => 667, 'Y' => 611, 'Z' => 611, '[' => 333, '\\' => 278, ']' => 333, '^' => 570, '_' => 500, '`' => 333, 'a' => 500, 'b' => 500, 'c' => 444, 'd' => 500, 'e' => 444, 'f' => 333, 'g' => 500, 'h' => 556, 'i' => 278, 'j' => 278, 'k' => 500, 'l' => 278, 'm' => 778, 'n' => 556, 'o' => 500, 'p' => 500, 'q' => 500, 'r' => 389, 's' => 389, 't' => 278, 'u' => 556, 'v' => 444, 'w' => 667, 'x' => 500, 'y' => 444, 'z' => 389, '{' => 348, '|' => 220, '}' => 348, '~' => 570, \chr(127) => 350, \chr(128) => 500, \chr(129) => 350, \chr(130) => 333, \chr(131) => 500, \chr(132) => 500, \chr(133) => 1000, \chr(134) => 500, \chr(135) => 500, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 556, \chr(139) => 333, \chr(140) => 944, \chr(141) => 350, \chr(142) => 611, \chr(143) => 350, \chr(144) => 350, \chr(145) => 333, \chr(146) => 333, \chr(147) => 500, \chr(148) => 500, \chr(149) => 350, \chr(150) => 500, \chr(151) => 1000, \chr(152) => 333, \chr(153) => 1000, \chr(154) => 389, \chr(155) => 333, \chr(156) => 722, \chr(157) => 350, \chr(158) => 389, \chr(159) => 611, \chr(160) => 250, \chr(161) => 389, \chr(162) => 500, \chr(163) => 500, \chr(164) => 500, \chr(165) => 500, \chr(166) => 220, \chr(167) => 500, \chr(168) => 333, \chr(169) => 747, \chr(170) => 266, \chr(171) => 500, \chr(172) => 606, \chr(173) => 333, \chr(174) => 747, \chr(175) => 333, \chr(176) => 400, \chr(177) => 570, \chr(178) => 300, \chr(179) => 300, \chr(180) => 333, \chr(181) => 576, \chr(182) => 500, \chr(183) => 250, \chr(184) => 333, \chr(185) => 300, \chr(186) => 300, \chr(187) => 500, \chr(188) => 750, \chr(189) => 750, \chr(190) => 750, \chr(191) => 500, \chr(192) => 667, \chr(193) => 667, \chr(194) => 667, \chr(195) => 667, \chr(196) => 667, \chr(197) => 667, \chr(198) => 944, \chr(199) => 667, \chr(200) => 667, \chr(201) => 667, \chr(202) => 667, \chr(203) => 667, \chr(204) => 389, \chr(205) => 389, \chr(206) => 389, \chr(207) => 389, \chr(208) => 722, \chr(209) => 722, \chr(210) => 722, \chr(211) => 722, \chr(212) => 722, \chr(213) => 722, \chr(214) => 722, \chr(215) => 570, \chr(216) => 722, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 611, \chr(222) => 611, \chr(223) => 500, \chr(224) => 500, \chr(225) => 500, \chr(226) => 500, \chr(227) => 500, \chr(228) => 500, \chr(229) => 500, \chr(230) => 722, \chr(231) => 444, \chr(232) => 444, \chr(233) => 444, \chr(234) => 444, \chr(235) => 444, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 500, \chr(241) => 556, \chr(242) => 500, \chr(243) => 500, \chr(244) => 500, \chr(245) => 500, \chr(246) => 500, \chr(247) => 570, \chr(248) => 500, \chr(249) => 556, \chr(250) => 556, \chr(251) => 556, \chr(252) => 556, \chr(253) => 444, \chr(254) => 500, \chr(255) => 444); -//$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>669,'FontBBox'=>'[-200 -218 996 921]'); -$desc = array('Flags' => 96, 'FontBBox' => '[-200 -218 996 921]', 'ItalicAngle' => -15, 'Ascent' => 921, 'Descent' => -218, 'Leading' => 0, 'CapHeight' => 669, 'XHeight' => 462, 'StemV' => 121, 'StemH' => 42, 'AvgWidth' => 501, 'MaxWidth' => 1000, 'MissingWidth' => 501); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -55), \chr(65) => array(\chr(84) => -55, \chr(86) => -74, \chr(87) => -91, \chr(89) => -55, \chr(118) => -74, \chr(119) => -74, \chr(121) => -74, \chr(146) => -74), \chr(70) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -91), \chr(76) => array(\chr(84) => -18, \chr(86) => -37, \chr(87) => -37, \chr(89) => -37, \chr(121) => -37, \chr(146) => -55), \chr(80) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -74), \chr(82) => array(\chr(86) => -18, \chr(87) => -18, \chr(89) => -18, \chr(121) => -18), \chr(84) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -74, \chr(65) => -55, \chr(79) => -18, \chr(97) => -91, \chr(99) => -91, \chr(101) => -91, \chr(105) => -37, \chr(111) => -91, \chr(114) => -37, \chr(115) => -91, \chr(117) => -37, \chr(119) => -37, \chr(121) => -37), \chr(86) => array(\chr(44) => -128, \chr(46) => -128, \chr(58) => -74, \chr(65) => -74, \chr(97) => -110, \chr(101) => -110, \chr(105) => -55, \chr(111) => -110, \chr(114) => -55, \chr(117) => -55, \chr(121) => -74), \chr(87) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -55, \chr(65) => -74, \chr(97) => -74, \chr(101) => -74, \chr(105) => -37, \chr(111) => -74, \chr(114) => -74, \chr(117) => -55, \chr(121) => -55), \chr(89) => array(\chr(44) => -91, \chr(46) => -74, \chr(58) => -91, \chr(65) => -74, \chr(97) => -91, \chr(101) => -110, \chr(105) => -55, \chr(111) => -110, \chr(112) => -74, \chr(113) => -110, \chr(117) => -91, \chr(118) => -91), \chr(102) => array(\chr(102) => -18, \chr(146) => 55), \chr(114) => array(\chr(44) => -55, \chr(46) => -55, \chr(146) => 37), \chr(118) => array(\chr(44) => -37, \chr(46) => -37), \chr(119) => array(\chr(44) => -37, \chr(46) => -37), \chr(121) => array(\chr(44) => -37, \chr(46) => -37), \chr(145) => array(\chr(145) => -74), \chr(146) => array(\chr(115) => -74, \chr(116) => -37, \chr(146) => -74)); diff --git a/dependencies/mpdf/mpdf/data/font/ctimesi.php b/dependencies/mpdf/mpdf/data/font/ctimesi.php deleted file mode 100644 index 46a5178..0000000 --- a/dependencies/mpdf/mpdf/data/font/ctimesi.php +++ /dev/null @@ -1,10 +0,0 @@ - 250, \chr(1) => 250, \chr(2) => 250, \chr(3) => 250, \chr(4) => 250, \chr(5) => 250, \chr(6) => 250, \chr(7) => 250, \chr(8) => 250, \chr(9) => 250, \chr(10) => 250, \chr(11) => 250, \chr(12) => 250, \chr(13) => 250, \chr(14) => 250, \chr(15) => 250, \chr(16) => 250, \chr(17) => 250, \chr(18) => 250, \chr(19) => 250, \chr(20) => 250, \chr(21) => 250, \chr(22) => 250, \chr(23) => 250, \chr(24) => 250, \chr(25) => 250, \chr(26) => 250, \chr(27) => 250, \chr(28) => 250, \chr(29) => 250, \chr(30) => 250, \chr(31) => 250, ' ' => 250, '!' => 333, '"' => 420, '#' => 500, '$' => 500, '%' => 833, '&' => 778, '\'' => 214, '(' => 333, ')' => 333, '*' => 500, '+' => 675, ',' => 250, '-' => 333, '.' => 250, '/' => 278, '0' => 500, '1' => 500, '2' => 500, '3' => 500, '4' => 500, '5' => 500, '6' => 500, '7' => 500, '8' => 500, '9' => 500, ':' => 333, ';' => 333, '<' => 675, '=' => 675, '>' => 675, '?' => 500, '@' => 920, 'A' => 611, 'B' => 611, 'C' => 667, 'D' => 722, 'E' => 611, 'F' => 611, 'G' => 722, 'H' => 722, 'I' => 333, 'J' => 444, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 667, 'O' => 722, 'P' => 611, 'Q' => 722, 'R' => 611, 'S' => 500, 'T' => 556, 'U' => 722, 'V' => 611, 'W' => 833, 'X' => 611, 'Y' => 556, 'Z' => 556, '[' => 389, '\\' => 278, ']' => 389, '^' => 422, '_' => 500, '`' => 333, 'a' => 500, 'b' => 500, 'c' => 444, 'd' => 500, 'e' => 444, 'f' => 278, 'g' => 500, 'h' => 500, 'i' => 278, 'j' => 278, 'k' => 444, 'l' => 278, 'm' => 722, 'n' => 500, 'o' => 500, 'p' => 500, 'q' => 500, 'r' => 389, 's' => 389, 't' => 278, 'u' => 500, 'v' => 444, 'w' => 667, 'x' => 444, 'y' => 444, 'z' => 389, '{' => 400, '|' => 275, '}' => 400, '~' => 541, \chr(127) => 350, \chr(128) => 500, \chr(129) => 350, \chr(130) => 333, \chr(131) => 500, \chr(132) => 556, \chr(133) => 889, \chr(134) => 500, \chr(135) => 500, \chr(136) => 333, \chr(137) => 1000, \chr(138) => 500, \chr(139) => 333, \chr(140) => 944, \chr(141) => 350, \chr(142) => 556, \chr(143) => 350, \chr(144) => 350, \chr(145) => 333, \chr(146) => 333, \chr(147) => 556, \chr(148) => 556, \chr(149) => 350, \chr(150) => 500, \chr(151) => 889, \chr(152) => 333, \chr(153) => 980, \chr(154) => 389, \chr(155) => 333, \chr(156) => 667, \chr(157) => 350, \chr(158) => 389, \chr(159) => 556, \chr(160) => 250, \chr(161) => 389, \chr(162) => 500, \chr(163) => 500, \chr(164) => 500, \chr(165) => 500, \chr(166) => 275, \chr(167) => 500, \chr(168) => 333, \chr(169) => 760, \chr(170) => 276, \chr(171) => 500, \chr(172) => 675, \chr(173) => 333, \chr(174) => 760, \chr(175) => 333, \chr(176) => 400, \chr(177) => 675, \chr(178) => 300, \chr(179) => 300, \chr(180) => 333, \chr(181) => 500, \chr(182) => 523, \chr(183) => 250, \chr(184) => 333, \chr(185) => 300, \chr(186) => 310, \chr(187) => 500, \chr(188) => 750, \chr(189) => 750, \chr(190) => 750, \chr(191) => 500, \chr(192) => 611, \chr(193) => 611, \chr(194) => 611, \chr(195) => 611, \chr(196) => 611, \chr(197) => 611, \chr(198) => 889, \chr(199) => 667, \chr(200) => 611, \chr(201) => 611, \chr(202) => 611, \chr(203) => 611, \chr(204) => 333, \chr(205) => 333, \chr(206) => 333, \chr(207) => 333, \chr(208) => 722, \chr(209) => 667, \chr(210) => 722, \chr(211) => 722, \chr(212) => 722, \chr(213) => 722, \chr(214) => 722, \chr(215) => 675, \chr(216) => 722, \chr(217) => 722, \chr(218) => 722, \chr(219) => 722, \chr(220) => 722, \chr(221) => 556, \chr(222) => 611, \chr(223) => 500, \chr(224) => 500, \chr(225) => 500, \chr(226) => 500, \chr(227) => 500, \chr(228) => 500, \chr(229) => 500, \chr(230) => 667, \chr(231) => 444, \chr(232) => 444, \chr(233) => 444, \chr(234) => 444, \chr(235) => 444, \chr(236) => 278, \chr(237) => 278, \chr(238) => 278, \chr(239) => 278, \chr(240) => 500, \chr(241) => 500, \chr(242) => 500, \chr(243) => 500, \chr(244) => 500, \chr(245) => 500, \chr(246) => 500, \chr(247) => 675, \chr(248) => 500, \chr(249) => 500, \chr(250) => 500, \chr(251) => 500, \chr(252) => 500, \chr(253) => 444, \chr(254) => 500, \chr(255) => 444); -//$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>653,'FontBBox'=>'[-169 -217 1010 883]'); -$desc = array('Flags' => 96, 'FontBBox' => '[-169 -217 1010 883]', 'ItalicAngle' => -15.5, 'Ascent' => 883, 'Descent' => -217, 'Leading' => 0, 'CapHeight' => 653, 'XHeight' => 441, 'StemV' => 76, 'StemH' => 32, 'AvgWidth' => 491, 'MaxWidth' => 1000, 'MissingWidth' => 491); -$up = -100; -$ut = 50; -$kerninfo = array(\chr(49) => array(\chr(49) => -74), \chr(65) => array(\chr(84) => -37, \chr(86) => -49, \chr(87) => -37, \chr(89) => -55, \chr(118) => -55, \chr(119) => -55, \chr(121) => -55, \chr(146) => -37), \chr(70) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -128), \chr(76) => array(\chr(84) => -20, \chr(86) => -37, \chr(87) => -37, \chr(89) => -20, \chr(121) => -29, \chr(146) => -37), \chr(80) => array(\chr(44) => -128, \chr(46) => -128, \chr(65) => -128), \chr(82) => array(\chr(84) => 0, \chr(86) => -18, \chr(87) => -18, \chr(89) => -18, \chr(121) => -18), \chr(84) => array(\chr(44) => -74, \chr(46) => -74, \chr(58) => -55, \chr(65) => -74, \chr(79) => -18, \chr(97) => -91, \chr(99) => -91, \chr(101) => -91, \chr(105) => -55, \chr(111) => -91, \chr(114) => -55, \chr(115) => -91, \chr(117) => -55, \chr(119) => -74, \chr(121) => -74), \chr(86) => array(\chr(44) => -128, \chr(46) => -128, \chr(58) => -64, \chr(65) => -74, \chr(79) => -29, \chr(97) => -110, \chr(101) => -110, \chr(105) => -74, \chr(111) => -110, \chr(114) => -74, \chr(117) => -74, \chr(121) => -91), \chr(87) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -64, \chr(65) => -69, \chr(97) => -91, \chr(101) => -91, \chr(105) => -55, \chr(111) => -91, \chr(114) => -55, \chr(117) => -55, \chr(121) => -91), \chr(89) => array(\chr(44) => -91, \chr(46) => -91, \chr(58) => -64, \chr(65) => -69, \chr(97) => -91, \chr(101) => -91, \chr(105) => -74, \chr(111) => -91, \chr(112) => -91, \chr(113) => -110, \chr(117) => -91, \chr(118) => -91), \chr(102) => array(\chr(146) => 91), \chr(114) => array(\chr(44) => -110, \chr(46) => -110, \chr(99) => -37, \chr(100) => -37, \chr(101) => -37, \chr(103) => -37, \chr(104) => -18, \chr(111) => -37, \chr(113) => -37, \chr(114) => 0, \chr(116) => 0, \chr(117) => 0, \chr(118) => 0, \chr(119) => 0, \chr(120) => 0, \chr(121) => 0, \chr(146) => 37), \chr(118) => array(\chr(44) => -74, \chr(46) => -74), \chr(119) => array(\chr(44) => -74, \chr(46) => -74), \chr(121) => array(\chr(44) => -55, \chr(46) => -55), \chr(145) => array(\chr(145) => -110), \chr(146) => array(\chr(115) => -128, \chr(116) => -110, \chr(146) => -110)); diff --git a/dependencies/mpdf/mpdf/data/font/czapfdingbats.php b/dependencies/mpdf/mpdf/data/font/czapfdingbats.php deleted file mode 100644 index 97c6af2..0000000 --- a/dependencies/mpdf/mpdf/data/font/czapfdingbats.php +++ /dev/null @@ -1,9 +0,0 @@ - 0, \chr(1) => 0, \chr(2) => 0, \chr(3) => 0, \chr(4) => 0, \chr(5) => 0, \chr(6) => 0, \chr(7) => 0, \chr(8) => 0, \chr(9) => 0, \chr(10) => 0, \chr(11) => 0, \chr(12) => 0, \chr(13) => 0, \chr(14) => 0, \chr(15) => 0, \chr(16) => 0, \chr(17) => 0, \chr(18) => 0, \chr(19) => 0, \chr(20) => 0, \chr(21) => 0, \chr(22) => 0, \chr(23) => 0, \chr(24) => 0, \chr(25) => 0, \chr(26) => 0, \chr(27) => 0, \chr(28) => 0, \chr(29) => 0, \chr(30) => 0, \chr(31) => 0, ' ' => 278, '!' => 974, '"' => 961, '#' => 974, '$' => 980, '%' => 719, '&' => 789, '\'' => 790, '(' => 791, ')' => 690, '*' => 960, '+' => 939, ',' => 549, '-' => 855, '.' => 911, '/' => 933, '0' => 911, '1' => 945, '2' => 974, '3' => 755, '4' => 846, '5' => 762, '6' => 761, '7' => 571, '8' => 677, '9' => 763, ':' => 760, ';' => 759, '<' => 754, '=' => 494, '>' => 552, '?' => 537, '@' => 577, 'A' => 692, 'B' => 786, 'C' => 788, 'D' => 788, 'E' => 790, 'F' => 793, 'G' => 794, 'H' => 816, 'I' => 823, 'J' => 789, 'K' => 841, 'L' => 823, 'M' => 833, 'N' => 816, 'O' => 831, 'P' => 923, 'Q' => 744, 'R' => 723, 'S' => 749, 'T' => 790, 'U' => 792, 'V' => 695, 'W' => 776, 'X' => 768, 'Y' => 792, 'Z' => 759, '[' => 707, '\\' => 708, ']' => 682, '^' => 701, '_' => 826, '`' => 815, 'a' => 789, 'b' => 789, 'c' => 707, 'd' => 687, 'e' => 696, 'f' => 689, 'g' => 786, 'h' => 787, 'i' => 713, 'j' => 791, 'k' => 785, 'l' => 791, 'm' => 873, 'n' => 761, 'o' => 762, 'p' => 762, 'q' => 759, 'r' => 759, 's' => 892, 't' => 892, 'u' => 788, 'v' => 784, 'w' => 438, 'x' => 138, 'y' => 277, 'z' => 415, '{' => 392, '|' => 392, '}' => 668, '~' => 668, \chr(127) => 0, \chr(128) => 390, \chr(129) => 390, \chr(130) => 317, \chr(131) => 317, \chr(132) => 276, \chr(133) => 276, \chr(134) => 509, \chr(135) => 509, \chr(136) => 410, \chr(137) => 410, \chr(138) => 234, \chr(139) => 234, \chr(140) => 334, \chr(141) => 334, \chr(142) => 0, \chr(143) => 0, \chr(144) => 0, \chr(145) => 0, \chr(146) => 0, \chr(147) => 0, \chr(148) => 0, \chr(149) => 0, \chr(150) => 0, \chr(151) => 0, \chr(152) => 0, \chr(153) => 0, \chr(154) => 0, \chr(155) => 0, \chr(156) => 0, \chr(157) => 0, \chr(158) => 0, \chr(159) => 0, \chr(160) => 0, \chr(161) => 732, \chr(162) => 544, \chr(163) => 544, \chr(164) => 910, \chr(165) => 667, \chr(166) => 760, \chr(167) => 760, \chr(168) => 776, \chr(169) => 595, \chr(170) => 694, \chr(171) => 626, \chr(172) => 788, \chr(173) => 788, \chr(174) => 788, \chr(175) => 788, \chr(176) => 788, \chr(177) => 788, \chr(178) => 788, \chr(179) => 788, \chr(180) => 788, \chr(181) => 788, \chr(182) => 788, \chr(183) => 788, \chr(184) => 788, \chr(185) => 788, \chr(186) => 788, \chr(187) => 788, \chr(188) => 788, \chr(189) => 788, \chr(190) => 788, \chr(191) => 788, \chr(192) => 788, \chr(193) => 788, \chr(194) => 788, \chr(195) => 788, \chr(196) => 788, \chr(197) => 788, \chr(198) => 788, \chr(199) => 788, \chr(200) => 788, \chr(201) => 788, \chr(202) => 788, \chr(203) => 788, \chr(204) => 788, \chr(205) => 788, \chr(206) => 788, \chr(207) => 788, \chr(208) => 788, \chr(209) => 788, \chr(210) => 788, \chr(211) => 788, \chr(212) => 894, \chr(213) => 838, \chr(214) => 1016, \chr(215) => 458, \chr(216) => 748, \chr(217) => 924, \chr(218) => 748, \chr(219) => 918, \chr(220) => 927, \chr(221) => 928, \chr(222) => 928, \chr(223) => 834, \chr(224) => 873, \chr(225) => 828, \chr(226) => 924, \chr(227) => 924, \chr(228) => 917, \chr(229) => 930, \chr(230) => 931, \chr(231) => 463, \chr(232) => 883, \chr(233) => 836, \chr(234) => 836, \chr(235) => 867, \chr(236) => 867, \chr(237) => 696, \chr(238) => 696, \chr(239) => 874, \chr(240) => 0, \chr(241) => 874, \chr(242) => 760, \chr(243) => 946, \chr(244) => 771, \chr(245) => 865, \chr(246) => 771, \chr(247) => 888, \chr(248) => 967, \chr(249) => 888, \chr(250) => 831, \chr(251) => 873, \chr(252) => 927, \chr(253) => 970, \chr(254) => 918, \chr(255) => 0); -//$desc=array('FontBBox'=>'[-1 -143 981 820]'); -$desc = array('Flags' => 4, 'FontBBox' => '[-1 -143 981 820]', 'ItalicAngle' => 0, 'Ascent' => 820, 'Descent' => -143, 'Leading' => 0, 'CapHeight' => 820, 'StemV' => 90, 'StemH' => 28, 'AvgWidth' => 746, 'MaxWidth' => 1016, 'MissingWidth' => 746); -$up = -100; -$ut = 50; diff --git a/dependencies/mpdf/mpdf/data/iccprofiles/sRGB_IEC61966-2-1.icc b/dependencies/mpdf/mpdf/data/iccprofiles/sRGB_IEC61966-2-1.icc deleted file mode 100644 index d0ef5738a80ac5d549a473dba7904b1e2b3ec61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3052 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 KfKLFRHQ_%=3FYAc diff --git a/dependencies/mpdf/mpdf/data/lang2fonts.css b/dependencies/mpdf/mpdf/data/lang2fonts.css deleted file mode 100644 index e60b784..0000000 --- a/dependencies/mpdf/mpdf/data/lang2fonts.css +++ /dev/null @@ -1,394 +0,0 @@ -/* European */ -:lang("en"), :lang("eng"), /* English */ /* LATIN */ -:lang("eu"), :lang("eus"), /* Basque */ -:lang("br"), :lang("bre"), /* Breton */ -:lang("ca"), :lang("cat"), /* Catalan */ -:lang("co"), :lang("cos"), /* Corsican */ -:lang("kw"), :lang("cor"), /* Cornish */ -:lang("cy"), :lang("cym"), /* Welsh */ -:lang("cs"), :lang("ces"), /* Czech */ -:lang("da"), :lang("dan"), /* Danish */ -:lang("nl"), :lang("nld"), /* Dutch */ -:lang("et"), :lang("est"), /* Estonian */ -:lang("fo"), :lang("fao"), /* Faroese */ -:lang("fi"), :lang("fin"), /* Finnish */ -:lang("fr"), :lang("fra"), /* French */ -:lang("gl"), :lang("glg"), /* Galician */ -:lang("de"), :lang("deu"), /* German */ -:lang("ht"), :lang("hat"), /* Haitian; Haitian Creole */ -:lang("hu"), :lang("hun"), /* Hungarian */ -:lang("ga"), :lang("gle"), /* Irish */ -:lang("is"), :lang("isl"), /* Icelandic */ -:lang("it"), :lang("ita"), /* Italian */ -:lang("la"), :lang("lat"), /* Latin */ -:lang("lb"), :lang("ltz"), /* Luxembourgish */ -:lang("li"), :lang("lim"), /* Limburgish */ -:lang("lt"), :lang("lit"), /* Lithuanian */ -:lang("lv"), :lang("lav"), /* Latvian */ -:lang("gv"), :lang("glv"), /* Manx */ -:lang("no"), :lang("nor"), /* Norwegian */ -:lang("nn"), :lang("nno"), /* Norwegian Nynorsk */ -:lang("nb"), :lang("nob"), /* Norwegian Bokmal */ -:lang("pl"), :lang("pol"), /* Polish */ -:lang("pt"), :lang("por"), /* Portuguese */ -:lang("ro"), :lang("ron"), /* Romanian */ -:lang("gd"), :lang("gla"), /* Scottish Gaelic */ -:lang("es"), :lang("spa"), /* Spanish */ -:lang("sv"), :lang("swe"), /* Swedish */ -:lang("sl"), :lang("slv"), /* Slovene */ -:lang("sk"), :lang("slk") { /* Slovak */ - font-family: dejavusanscondensed; -} - - -:lang("el"), :lang("ell") { /* GREEK */ - font-family: dejavusanscondensed; -} - -:lang("ru"), :lang("rus"), /* Russian */ /* CYRILLIC */ -:lang("ab"), :lang("abk"), /* Abkhaz */ -:lang("av"), :lang("ava"), /* Avaric */ -:lang("ba"), :lang("bak"), /* Bashkir */ -:lang("be"), :lang("bel"), /* Belarusian */ -:lang("bg"), :lang("bul"), /* Bulgarian */ -:lang("ce"), :lang("che"), /* Chechen */ -:lang("cv"), :lang("chv"), /* Chuvash */ -:lang("kk"), :lang("kaz"), /* Kazakh */ -:lang("kv"), :lang("kom"), /* Komi */ -:lang("ky"), :lang("kir"), /* Kyrgyz */ -:lang("mk"), :lang("mkd"), /* Macedonian */ -:lang("cu"), :lang("chu"), /* Old Church Slavonic */ -:lang("os"), :lang("oss"), /* Ossetian */ -:lang("sr"), :lang("srp"), /* Serbian */ -:lang("tg"), :lang("tgk"), /* Tajik */ -:lang("tt"), :lang("tat"), /* Tatar */ -:lang("tk"), :lang("tuk"), /* Turkmen */ -:lang("uk"), :lang("ukr") { /* Ukrainian */ - font-family: dejavusanscondensed; -} - - - -:lang("hy"), :lang("hye") { /* ARMENIAN */ - font-family: dejavusanscondensed; -} -:lang("ka"), :lang("kat") { /* GEORGIAN */ - font-family: dejavusanscondensed; -} -:lang("cop") { /* COPTIC */ - font-family: quivira; -} -:lang("got") { /* GOTHIC */ - font-family: freeserif; -} -:lang("und-Latn") { /* LATIN */ - font-family: dejavusanscondensed; -} -:lang("und-Cyrl") { /* CYRILLIC */ - font-family: dejavusanscondensed; -} -:lang("und-Cprt") { /* CYPRIOT */ - font-family: aegean; -} -:lang("und-Glag") { /* GLAGOLITIC */ - font-family: mph2bdamase; -} -:lang("und-Linb") { /* LINEAR_B */ - font-family: aegean; -} -:lang("und-Ogam") { /* OGHAM */ - font-family: dejavusanscondensed; -} -:lang("und-Ital") { /* OLD_ITALIC */ - font-family: aegean; -} -:lang("und-Runr") { /* RUNIC */ - font-family: sun-exta; -} -:lang("und-Shaw") { /* SHAVIAN */ - font-family: mph2bdamase; -} - - - - -/* African */ -:lang("am"), :lang("amh") { /* Amharic ETHIOPIC */ - font-family: abyssinicasil; -} -:lang("ti"), :lang("tir") { /* Tigrinya ETHIOPIC */ - font-family: abyssinicasil; -} -:lang("nqo") { /* NKO */ - font-family: dejavusanscondensed; -} -:lang("vai") { /* VAI */ - font-family: freesans; -} -:lang("und-Egyp") { /* EGYPTIAN_HIEROGLYPHS */ - font-family: aegyptus; -} -:lang("und-Ethi") { /* ETHIOPIC */ - font-family: abyssinicasil; -} -:lang("und-Osma") { /* OSMANYA */ - font-family: mph2bdamase; -} -:lang("und-Tfng") { /* TIFINAGH */ - font-family: dejavusanscondensed; -} - - - - - -/* Middle Eastern */ -:lang("ar"), :lang("ara") { /* Arabic */ - font-family: xbriyaz; -} -:lang("fa"), :lang("fas") { /* Persian (Farsi) */ - font-family: xbriyaz; -} -:lang("ku"), :lang("kur") { /* Kurdish */ - font-family: xbriyaz; -} -:lang("ps"), :lang("pus") { /* Pashto */ - font-family: xbriyaz; -} -:lang("ur"), :lang("urd") { /* Urdu */ - font-family: xbriyaz; -} -:lang("he"), :lang("heb") { /* HEBREW */ - font-family: taameydavidclm; -} -:lang("yi"), :lang("yid") { /* Yiddish */ - font-family: taameydavidclm; -} -:lang("syr") { /* SYRIAC */ - font-family: estrangeloedessa; -} - -:lang("xcr") { /* CARIAN */ - font-family: aegean; -} -:lang("xlc") { /* LYCIAN */ - font-family: aegean; -} -:lang("xld") { /* LYDIAN */ - font-family: aegean; -} -:lang("phn") { /* PHOENICIAN */ - font-family: aegean; -} -:lang("uga") { /* UGARITIC */ - font-family: aegean; -} - -:lang("und-Arab") { /* ARABIC */ - font-family: xbriyaz; -} -:lang("und-Xsux") { /* CUNEIFORM */ - font-family: akkadian; -} - - - - -/* Central Asian */ -:lang("bo"), :lang("bod"), /* TIBETAN */ -:lang("dz"), :lang("dzo") { /* Dzongkha */ - font-family: jomolhari; -} - - - -/* South Asian */ -:lang("as"), :lang("asm") { /* Assamese */ - font-family: freeserif; -} -:lang("bn"), :lang("ben") { /* BENGALI; Bangla */ - font-family: freeserif; -} -:lang("ks"), :lang("kas") { /* Kashmiri */ - font-family: freeserif; -} -:lang("hi"), :lang("hin"), /* Hindi DEVANAGARI */ -:lang("bh"), :lang("bih"), /* Bihari (Bhojpuri, Magahi, and Maithili) */ -:lang("sa"), :lang("san") { /* Sanskrit */ - font-family: freeserif; -} -:lang("gu"), :lang("guj") { /* Gujarati */ - font-family: freeserif; -} -:lang("pa"), :lang("pan") { /* Panjabi, Punjabi GURMUKHI */ - font-family: freeserif; -} -:lang("kn"), :lang("kan") { /* Kannada */ - font-family: lohitkannada; -} -:lang("mr"), :lang("mar") { /* Marathi */ - font-family: freeserif; -} -:lang("ml"), :lang("mal") { /* MALAYALAM */ - font-family: freeserif; -} -:lang("ne"), :lang("nep") { /* Nepali */ - font-family: freeserif; -} -:lang("or"), :lang("ori") { /* ORIYA */ - font-family: freeserif; -} -:lang("si"), :lang("sin") { /* SINHALA */ - font-family: kaputaunicode; -} -:lang("ta"), :lang("tam") { /* TAMIL */ - font-family: freeserif; -} -:lang("te"), :lang("tel") { /* TELUGU */ - font-family: pothana2000; -} -:lang("sd"), :lang("snd") { /* Sindhi */ - font-family: lateef; -} -:lang("sd-IN") { /* Sindhi */ - font-family: freeserif; -} -:lang("sd-PK") { /* Sindhi */ - font-family: lateef; -} - -:lang("lif") { /* LIMBU */ - font-family: sun-exta; -} -:lang("syl") { /* SYLOTI_NAGRI */ - font-family: mph2bdamase; -} -:lang("dv"), :lang("div") { /* Divehi; Maldivian THAANA */ - font-family: freeserif; -} -:lang("und-Khar") { /* KHAROSHTHI */ - font-family: mph2bdamase; -} -:lang("und-Mtei") { /* MEETEI_MAYEK */ - font-family: eeyekunicode; -} - - - - -/* South East Asian */ -:lang("km"), :lang("khm") { /* KHMER */ - font-family: khmeros; -} -:lang("lo"), :lang("lao") { /* LAO */ - font-family: dhyana; -} -:lang("my"), :lang("mya") { /* MYANMAR Burmese */ - font-family: tharlon; /* zawgyi-one is non-unicode compliant but in wide usage ; ayar is also not strictly compliant */ -} -:lang("th"), :lang("tha") { /* THAI */ - font-family: garuda; -} - - -:lang("vi"), :lang("vie") { /* Vietnamese */ - font-family: dejavusanscondensed; -} - - -:lang("bug") { /* BUGINESE */ - font-family: freeserif; -} -:lang("su") { /* SUNDANESE */ - font-family: sundaneseunicode; -} -:lang("tdd") { /* TAI_LE */ - font-family: tharlon; -} -:lang("blt") { /* TAI_VIET */ - font-family: taiheritagepro; -} -:lang("und-Kali") { /* KAYAH_LI */ - font-family: freemono; -} -:lang("und-Lana") { /* TAI_THAM */ - font-family: lannaalif; -} -:lang("und-Talu") { /* NEW_TAI_LUE */ - font-family: daibannasilbook; -} - - - -/* Phillipine */ -:lang("bku") { /* BUHID */ - font-family: quivira; -} -:lang("hnn") { /* HANUNOO */ - font-family: quivira; -} -:lang("tl") { /* TAGALOG */ - font-family: quivira; -} -:lang("tbw") { /* TAGBANWA */ - font-family: quivira; -} - - - - -/* East Asian */ -:lang("zh"), :lang("zho") { /* Chinese */ - font-family: sun-exta, gb; -} -:lang("zh-HK") { /* Hong Kong */ - font-family: sun-exta, big5; -} -:lang("zh-TW") { /* Taiwan */ - font-family: sun-exta, big5; -} -:lang("zh-CN") { /* Chinese */ - font-family: sun-exta, gb; -} -:lang("ko"), :lang("kor") { /* HANGUL Korean */ - font-family: unbatang, uhc; -} -:lang("ja"), :lang("jpn") { /* Japanese HIRAGANA KATAKANA */ - font-family: sun-exta, sjis; -} -:lang("lis") { /* LISU */ - font-family: quivira; -} -:lang("und-Hans") { /* HAN (SIMPLIFIED) */ - font-family: sun-exta, gb; -} -:lang("und-Bopo") { /* BOPOMOFO */ - font-family: sun-exta; -} -:lang("ii"), :lang("iii"), /* Nuosu; Yi */ -:lang("und-Yiii") { /* YI */ - font-family: sun-exta; -} - - - -/* American */ -:lang("chr") { /* CHEROKEE */ - font-family: aboriginalsans; -} -:lang("oj"), :lang("oji"), /* Ojibwe; Chippewa */ -:lang("iu"), :lang("iku"), /* Inuktitut */ -:lang("cr"), :lang("cre") { /* Cree CANADIAN_ABORIGINAL */ - font-family: aboriginalsans; -} -:lang("und-Dsrt") { /* DESERET */ - font-family: mph2bdamase; -} - - - - -/* Other */ -:lang("und-Brai") { /* BRAILLE */ - font-family: dejavusans; -} diff --git a/dependencies/mpdf/mpdf/data/linebrdictK.dat b/dependencies/mpdf/mpdf/data/linebrdictK.dat deleted file mode 100644 index c186b1d9e612a8ef3a68626b2cb3449cf6af3b2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1053144 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ǂC#H9}&G;%v=dFkES`!Pvj^F^A;1^zN#z8*M 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%0A}XF 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%0Dgu@Sh1^WX3(Tj`$BuBz)$B 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%0A@k6S7 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�gMBi?c%9^I0vZnYT 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

A@`#L530p) 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⋘zq$z}$IFr9KeR0*N0w*e8jDpNDkVfde41Ez=v!=7_YRhH zpOGx0^M`9@`BEbUmQCbbk3#V+IH8C66mz~{e7KMi2hQZ->ulh>B-|KpRMPbVsfYg( z5s7&!Q1`SG9jf41>r7%9@h7lF)pox}s@OSkEY0Gm`yhj~H2N??c z)*bSq65evLs%d$9JlX_}5t)eCEpG!25pn!%JF|yy+>*8LNoFXlR*{lA8o}t2orK)nv%T z+qdd3O&Km)4aWmu5w2f2S%#LkRvh=HELttf9*>T2n|3854Fzks@75RcS`}XNRK=`%R>*~@uL7git*M6k+Fy7b^J@Jo zD0LiToNxU{MZ%!Oaav)ZrunH2r3na{H82?(T5loWgPYdlRe9?Xs64(w)Ox7)tm}ah zx0FU#A|F___87=4MYoM*il1}@->xfT+V#(2xZtFX)gOXto8sEp#dZ=) zE83i;^kAz^b*+R-Th1~<+w$6FoBM=On>*8zzcx2ZaGPJ!Di{c)go)YuKTueKRK$Au zYs4IJ?Ccofws|Y1Zf*L+`#to!;Gs>oj8lSEaM|WH-}!-GGw}9Ax@aKg6^B@AGn-D} zE+Wsx%DBxw_1}&n3gNcQsH%dt4fQ#Q-TYi(i>bD^hwN`m7b2z?i@T3ac$;}|!k(C&BKJ2g+z!`Z|gv5rq3+BF9aX@3Q1zJOoTCUEiG?nS^z zUek_g?|guJVto!-o(IKa3=T)h@DNhFbtDbgNV~;Gly>uk0Pfbiz_A@;e`sNIk4{nA z+Lxhdh2Yv9b`;odzluIri9vsRx9mhcMNb+@qEqv{i1yn@lGC1V{{ReH$2GNQ7Eb_j z;DlZbptS!v^s?6{1l<0&5xL2I@fzVYpLDqoQhfAPM*{8R^X2V_J056n{^t%Co9%_d z@R)LbgQVFo$COE`vzb8l46eM%?KpIy{Y+>gOD68drw7`4FlPPBCg=k3!x$ARGrLbkbx~c z+KDO}5`45VfdZRBUXR{^7XA4LgoNceD$OuYJUUc2-ahsXq+1dv z0YvE?$_5D*BPq5d#aQ?tGlRemndt$94(>z-E*<`%qtwO~KQ%)E+u;woYd?vl&&?#zZ5N_jf z&p)mUIJ1e1B9x->t3WaKjQe`xL1XXZZ>FtOk5AV(hzK42q(F+yY>!@D+X~$`%2wZjNO_TFi<2WgK&H*=KF>+#O%VBmi1R*8$MJ4?FfXVXev~oS~^G0_`{!mg>Rs zHT>Is{#Gql+G zSE9Gm=V^An)9N68MTWpm%bbyC9Y#zH;MhBDrJdM@<@`7;U^<qX7U~roBP=^IS<``^m~A1Y?b6gq@{CZ*j2|MFqAlj0dtd@C?N6NGxLh7hQwGr)%qspRRz9HXH2n zslx2?L3$^Raq(MSKE};Pfh58g-m1%2r_@?y@oCGu?v;VLh)r-BZy>IiV>HP^)=zu- zi!1ms2w&rj1W3j}ocqD9aR^=ME2w%>zx?!r!S}ssCgbV5BbAhzy5?#4h^N~jO@gdB zBykhso_<{=KRp3gifo?tBBS9d`4ZptDV5gs=3t1>8Kbza7owmT+9T_( z*Pi;;1vFYzJi~m}6XN+M5i>AbO|YX^-`!|iJQlOzTUA$?M?aNTu{ zGU&=0h#1Xv9Uk1097nyQ>jVpOBqdV1Oa;YnZ^I8+PnJfz_P7#PlGM5$%^uUIg;#rl7$xNz3(eqqt=Z+i03 zSGQYE^b0qoPND~;bh{V0xFlEI!)3Q;<5|WzV5!?vnRLMtBY6!J*VJtubR(~Bquf5_ z_eh0Ew^vOcE)oviW<~-km^8rs zdBnyuXDO2I8{x-xK0;un_^B5_!vN*Ve68-HkjD{u?tXw=Cn(md;rCGFGp7TE0_!XC zRYMS`>$N;iMj!b<4&9%*7M<$p>dE;t+4>L7&mLF$VF>7(@h##@yISR|u^jAv4P# z6wB{fxj5sE9?!{akK*zA$2^mfW9R{@d)@%-@rOM<%mnf-2=CJK4*<*kk+2^p*!8?KOd5u73@&@NAeF6e z$9pa?&( z7+x3DH6edtaju;`>;AT2#Z>^Y?NHR2oeG#|FEpG|3wgE*SZ@$2c=lW>AyFs1NHH0$m|;%1D`3 zo_(H64Y+t>HSP7n@Y!j~=h+F6d7^SuR0PlmJi8Q7Rtw|FDg%6_g+EU$h?TExkgi=k zyGObU1VOK2Fi{B7(&!{I<6bcr+^Zf}u}G9*O)!cPkplE;0NE~2F5t!b=|xj7a~+pJ za#Td9saI#WA;NmE=1|QTC*SO}*ZnjZTQeFPh!ht`03u5&m1z-%`EswmdB0S|D2${z zercK$g1v78b*Qj+UbOrcDcyM*Yp=PQ3{izZ)$1tE6;I!5pK;p@=0Bdpja#EU1S~Rl z;9777xz;Oc5OWx!<2!o)2vEdSpVrj7hR(~(OX_=HicC#_0yK?bp8OsQ?cEqjFigTL z6EKUd5FPVddY9~tz1MK9C)Y2hyyNUe8&pquT5i=7$0 zM}kJo$&=*>D41OD1u#z**n18R5Yuz^BL04llm~IRG8f;U%*scKys8x``jH@_zGNf+~+nV4|9EP zLEHo$hK0$gG~n7@G>!=X4)oY30zjV*p@3_`*U`)M&=9rKoWkzY7s)Ybh~fkI?K2`w zFODhc^PL)znwe1GyFT3a4O@KvmtgFA{=-}eLr4tLpP!V(^?a+egy{KyLxbfH+99|< z{}4)NgjSgM!$^*vAFb4IfX}=3*)>}beLXeNR0Z{t?yVvPBGwN?NtZ*NFXQTw7Z>)pr+m~ltklO$$(2tzEKT^BtI{_3}4h26APd1fuk$zX0$o2i0 zIq{%p9sFiN3Nh zyWbBT*XQRo6twjtbM1ejD74|Z(cWM6x&3|*)qz{Tx(4xxxZgiDqS$uT?@1CcJAD-N zTltGl$tiAfxY+MCYZd)ceIp|KeTG2E zPy2lW;ZT82(lidmKNb@azf^WVvOhgTir@Xq<1220^`gkD*811tf@_l@Tp?tlXT$=J z{cn@l{*<*Uley|;OtJ+?S+DeJERR()CYDp&(LYc2!W#t_y!AVwqu z{!Y>dSO)x&UdoD;*g59HJ}`$E2DG4AXB?x^i~T_r$@^##%?#+tC9}K%{dHE6*bNx& zWBhe>+?c168Q@2|wQB7o6`lqx1#d(ROOihLLLKw#0mrDNl0gmltf+_m4nyk&cR$20 z(QX6f^g^7;@&e_+FaVf%;T!}2N{ICSDyUf|2ekgGvNlX0!BjOH=wIunm!Bu4p;76!#>P6O|DC^+y!AA7-c2)$cRb=Z$4NRkGY zNi+{U4VuGVuP1BA_m;T|mxPf2c(0%kj@HwRxvk?SB^fz!=C?RMX zuQ%2UXjm^zR$MO*$E{q+V@IRGNWBNHAsVI{D4;@F19$1TOj0orlrhjbFv6VsAywOp zEe&ihvRunXUOZa~0iYK#EvrWSbCn2qu^H~(2Y#zmUv#XdJYM{@-MO8hI6cI<5_Aib zFWx2aUcAEw7)?R*i}#CUBCydCA9@3qx}p_voMJ=tJ18%z@h=Wk9pF1)eO}P`mi)Xp zC7XC9N`b3s&AU)pZqd1;et^UUdK7MQ$rL}?Z0`7BcN`k?aOwxK~~tj`dTNbm5Y zL;DDp!ST`CK^yhagXS{`=h~pb>UU5F_$`R~>!8~e@E{KU;sX7tWm?V3IllQI2sx!v z$Y2tOY;qC9R5C&zdM+MHq{YjpQ2Dafc2$0Y;Gn72Bw%pR90i9_F#M3PmG%$$a9K0o>4d~xhN>Ou+9O!Z49~Dw}vnRjyON~PPIAs7uIeD z|2RTOSa9Y9kjdb`!d9HVH~3FdW;Oxe6f<$1gNF!~!H=h$XRzlV0m#6Gvnfn4Hsj2A_lL}+YFwWrzdqlGk77CV9p*hlr}Qx83u0z4n`j(JNOIQPfACM z@d>iQ90-}*|5Y*k0gQ-aNTujK{C*+Yz(m3+47pkx7!rqc5O`9_Twx3$Z3x5;`K58i z>{TNi`e5=ILoe18hn{U(Zv#*0dWSr$$(789gS5Gt7Vs-WI3hokI^?-fsy=V1pD-rr zsKf2e@z6XS`w+R0fvqDq(in_($O_bYB}@ap|Fh`}V;OQp*$w$J@5D?)ObOUUneRI< zax4CicM#G;YfEbVd_sex5twVj#as0oar-wcHb87cn{e~0yr$;B9A*+;rYV>2wMe4s zhu*E*i=jn5TfAD!ANmxiM215<>JdVEIDmBGWQc8lwEe0+dgxfAi3uuL!q*L*NmrmN zJmt{UigoBJ9dRiv58#!I!Nt%`B8-AHh#9&YbWm)F(|F-x*qzcajPHfUcyid8zHK7R ztC-R-N;V=ajS7cdr_UdzkGI5^9!&$Sc=#8|5liW?KZGm@=qZ89d_CeA_GDg@Fw3cP8$)6>@JH7_O}MudEZ?G!u1UYE&X6O~mQ`~pwI=BA(qdWNlVSYyQj zvKdjK?O}XOID|E9yB#?b>*e8n^qFOR=MaL5>M1cZm*s^W%UuA3Qt zQP?^6a4(lz*+N3YIq4lsFp0lX2abYH)ZMVm8+oF=sv3T`RTK3a${OBW7Arz(9u}Ae z7sGp{6MlxX7BUH)pV9GAEk|nJ2~sB*ba6?;XQ9W-f~=jcp*z8v>~i?- ztm)4)$$Bg8Ta8&zT*U~N+eJnYC8ZIy46-At`Mg)3N)5o=u&I^yppTq7C@ z?I_NU_%&34&#SolNA1v%lziWadnuk~ZM8&hF{zDLMH3^&sooL2!VS4D2EuV`BSu6z z5#JaP5tjMtMj#)tP&JNt1Mw05>jks;0Q}sD6(|w14KFNW3+0czFX-9H1sX<_Bb%lK zVdM|6O^`FPjQx*1!xvNLGLq?|=xJoF2xX?IdAJ0uBYfRR7os5hfVL|L)xCZmB}9@w z5*vuTCEEYD=3>>)R?*PNQ3(knySg}gFHBM#*4l~KIqbQD8pPwE=HR^ zGfnPL%*eSugJM#u9!50s1F1&1lyXPK#bl4Nj|=#euZjk<&}O#^<$YMurWCPrP8^2x)_Pns7E4c1`F^p>M0;;>5@x2DeG9C8Ufl&8xIZBdNGdGeCcI zO`-%RVn%9DBmd_K{K4qEG)w3jeT!x}`j=o=>Z0rVk^PST8$@2Nvr3hAWAd0Y$<|TY z=s_ZGbX#?Z5JnFSq~pFE(w87Napo-*o@rFfj$SEPX?SOgOPC@SW{e z<5`70rYzSNk!dS(iRFoD8s_?ax{ z7ZYRpX9hlIsBa=GNEo|Mc#dtLs~fWzMIhe%&`1`Fk=K}&8r#JIld&ZnCyd#}lP4Au z`0BC9vrkOhpIFX;w8k<&XMX2&FzQ84V|4^Dd;#2f68Nckyz(78kt_yGjvX%huIwE9 zpkws0ccB%>0I4ZZ-2i4!7GB0aidd-W(RMuE6GogSf>rn*JBSyGOhDX0)%E!(Fq{B- z8M`C1g|Tae(bx}o)go5WTm!^_aYQ|Kt9e(U4mqu~_2_3Fw z+@)IPxJsF2j$`kLNkxWXM$rxx>~9dO_lCj7M)WOBLmxV!Lkzv@+5~7GCFXo~v zVXe5(j?x>q*>r6j=Zui5MVuJ-S*Ff$Ed0smd9hEoR&x+o_O% zy78q%-78T!eC1M`B-o<(S0oR$lrXNNkyqT_ED~P16Nig%U(o}gUq{Uz&GpKE)C9+J zp~D#Py)xDi^~!UU2Ai68$^LdJM9cr$3a z8jm}tl~~7dy}oIDWALEYAh%<3NNAv#@&8ejkyMYrUGe+m-Kx(o-P4`5kK`Z54@{N( z@jZpz`0ff9SrJ3W_xAW;ZH=E22R!iiwXat#i)5OIE$0ZCcG{S2y{YMs%=#6Cv;MR zk>fPxuZd_+>PFfd3T;T!2*a{^0d5I+M5+Y#Cwz#4PfnItZ%7AjRWde`$4kua@FYd1 z12GVZb-sGQko+p21(3>DV+qTvXTlYtiqnY0<-WQV`$IRcZuaCCB=>53&GprPS_62M zOq(-LJ+J z)2kz*2^Iz5$zNq^iD&BNaKZ}4Zzw9qSKomv7qOYIy}AyGM9!gZl#~V{O8GNYw87+s zJb0YeVo-#6Pb>q)<>Z}Y0UMs^LU-^m@q9YuumyUeaAIc@uSA|m_j;u- z1ZE8wD#!Eh(i^YZ31@)o5qP;2e{BbFH|ltq*TdE87bjn!%qPccHzY%V4^}2ujYOe} z7kCK;Tok|Z3(LQ;JLACQE4apDIcwu^j5H_z*I_-5Wb*HgI+K5!MIA6a`F5QE>`cCo zwjvlnTGME!wQ6Om0ve~>katE*`@Z&HnVkH(#x;4kx}7{E^NFZ;@+)peO;|(8SnuRR z!OmjR#yH#$uM0vaZ;w_y|AF3W!M%e*BhcgnVH;?Lay#mO?XRSIkoQ{o_^XWi0wN&w zHP#k}19|-wQzU zwIz0Yqk4-1_>__vUAqVmMd0}QEUwqrA-_JIzA0h5QPpQ6I!(RKO2X7@9qGWw)M94TukU0@0OEOlN6?1) zuwXkp0)09su2=#_%Je<8JXZ?%AE5^QPtDe639PB-2P`slKwg>~4vQU6FQbz@b;~>u&`hmmsWNL# zCb7x(rhQ5rL1NR^A*)9G=Yix-)t~TFA+%|qxP}vxvFC5npm-W900OJ=CBEs*g}TN# z<|2V2bkDxdv*l)A?9PDMwew2H{Kw3Xn~c3Or@l*mV-yXoD)WF+8tjp@%RDv*O8nR$yoZYEogqmVUYjc#T7 zETXcLN0>l-FL(M8>;R}wclC=YSHkpkZQqeEsnzvLd-{R6PwRElRZ<$%IOFdIj2S;S z%bjs85W{3=I92TMHJ$OEEw<3+waQd3A`>kMHeEe|V(EXzZ&6olopXiEiEW8+KjUeK z0W;bmWt~Sliztj-AutV3PsvNo7{}co@?Xq&&KSni$SnmOo@hiXvm+(0|G~jFXAWnd@YS zHW7uN;Qmll)mEWaC(l_i%v-(Ih>{|5|&SwJES>*J6CuexRx4 z>AScS3la(uNZHWFDQUa@y&&<>fcxj0d6YIYi4+iu-uO$Fq`cv3q^Q_5c80H!Ep zU;>eP0)_m>^C%wmz40G?9bV{-XXOP?-9ge*MK-4bVZ1Z{ETqMddAi$tJNa9c8sl z0^gfEaM&gI+1JG?_Ke#TcyD$=Eh*L{2N?qfdmp7|cGO0ZCb_^j)&EWCFAS8FBN|$U zW_5hf6DIuTrvHx#hv;Xs9x~WEZo`gkngk$cmsBbYIU*p;uB-wsSG;!2%E)}cc8Qim zWqyOEdKGlduJ%pMjVrO2Dlo`fKZyg9m0ZoTML=!@^Pm5Sl(?9a5a*&GC- z-rSo|QQ~m`v-hVYn>$74G8ymY{14<^8QsoN%_oD%9KLV*f4i02IX9E@sQNiSS56M} z(oygb7K1OG;GFr&dd^*%E{K{lOC5T>Z%D{2*rWsxjakik213!FK_~Q&EapsvQA-Lp zDaJYD%~=WNt|-dE>6|-U(LnUvKG07NLbRMa2*z2W&iq=8HRdj{q=Ovi zPIpffA}4Xiwt1d^oxd%m(ep5-J#V^Bf8JfV5j@Vk-pvrlDRTl4>CQ4)@zc)mVGVisB8r&f* z41=C`I5^vaXCZr;M*RoThJ@Dj z&rs7;{Zj$t)wh15Zsy1LyXVLL)%k3Z%_k%{)CsSM)93M0mRjml31n4GmMq>G^A;vV~6-+w%{AZJXSq?FV2_R=(aU#e0`YqR2s`Z~X-A_|puN zkyde?(pwjZx8$5pnbe@U%cA!2)=dn|W4bSfgeZH#-SYC*r*`}n!?yt5ThCYqe5*CW zV!?G}xNmi)3>XQ1ZLUGEUB}k?w}wDK9D{rjcZhm8o42MyYeU3B&!kR{|4__ZA1H~p zRywRFUqu`tg||MI1JM;z{n*2T!ekE%>M5lK)srk2l+#TuC@lsc3W+VKqEPDxoMXnK z3D+(Y&)9SzXTf!pC+a1%_(LHrusDXbEw~M{2f*fn$gEnhLEgx%g*7$K1sy~*se&VD z_B%?;P7o{=y`VyF77XIWbgW*!HnCuVK6Alj-T+J>V8NT*&YS@L6;HNconTt98oDmf zZ8V7C-h%B=gA7hq*%lnK4`99Em=vNKI$l@?$g>xM78bJmK`^`F!2;aEfyqi10uhGs z4m)|r2X9yU3vYxF_oSOkF8nbFF4wQWrpP-&V}Ls zO`p*)#`gCAO8VR9>JfS4?K1Qpkpv#zwggDyjz&FphJ|}%nGsmuZYVt7z7{RS{E;^i zKC*l}jt&6wZ~vWZMpyTWGAtmI3+=qkQr1|@@^%+cTY?8!1{6z)PJC1yfWJMEWDI@r zF5y&=^NS&z+@8i4{Ve*LjulYC!?YGLy%;g|?O6Q!_6K=-XkOHtCNRH!i1{eS1#f== zFZ7sg#z0z&DsY9QNr5b)`lm-S*z*IjqqMT&Zq_~x<`*1cBo-!2#eb4+_e!Z;;sh8@~g7G`C2z(ql0B-^!JMo zsNBVm8vPfs;Wwp=i>5&|Dj_mM+v2vQQFOWZ=V=+|;tL@x7mX}BsHhU+kQZQH@Xdg*?tieTcwx)^RDJk>>*u3}?*h7XJk6H6qq^gH8Iy0Jr$J zJQ`)*M%v?IwtmFrf4ZRCaTMrRm#5?}Nv4Yj(3dXwhxAm4?$UtH5!d3KG-6{j6wBf% z(1rsRoN17?*vfZd(F+ZEWIgSB8d+pz4f*wyqtMuU5RMmxFZru(=G}=N5{;DJ*`rf= z=TWur&UuRcomzs3>*H9;-j&-`JG$!hdy>kJO;~% zPu#xqUnNG$XSL;o3efXAgJkucUIfM{?4<>aX=kwJ`OYGaFY@Qitcz*U5b=}NRBlYY z!PGn3G-$lbJL?lgPGDq-93S&mx#i5T4G}9RL1mj?_Pv3`67ma zs!HK^!ZL?I

IV6+%R(pA7xKFFlyUdL@X7d_y-X9?q-xvZlwO+-5|vbkYmdUh60isGK-p;SczE2v@V5b{Xt=SvHMzWBh;k|Ci)A-UuYMhOl0sqJS= zlbm8rfLyYK#tLjX0Z~9NEw4tF>;o~VXvyc{(vr=_h+xT4Wk!=r<&`CG+Poj02y*It z4;7IOFa4`_xbzmawv-Q^VuQNXr8fW$eJyGTdx#Wf>7Vp&$!RZrR?sbdgl$-ee(6J& zN_qTp-R{z-p<9kJ=Nrp;k>%0>x(azkW z2Lsikt1UF?$;a|VK_;HY-!DCkW*mD5IHQHld2KR#z}a3Z6Y zB)|7-)FSov`Q8hdygwf@bienXaMG8XuqO|o4ZYVf*v&kRE%A*UAWv0Q`sDg2QRtf)k)j29!OS`MO-6{tNQ!CMkQb+omD91XkC`*{DidYTo#LRFYRfdexz zwBj#515TCbiuUTjLBHYH(j}bn8x)@es}b&t3apWB`cq? z__8vmSXX?;;LM&^F$qqMW5qJ9IqF5yxEWHS2<#H`t1MiX;_4yfiwQa({y!+P8p&6+ z%$cnGox@$aT3KMTE9;=pRGAI~TImKBSN`E5VQJ+r+#?nz!82iqEKZn^6>7*|c~<~} zkHUMmhF)alL&TXd9SB_61-gs_X-YdX1JGm7b2OKgBftQFf_5~6Y*rHW?UN<^*e$_7 zA5Bq910SmhyYbFW6}xgBRL1@YBC1u5l{?fZQ+v|w;SYpSj76HOxS5K$v+7J#k~WFS zj#)hqzyAwe$Eu&J=2bs}fBYXW#jaRbSoO1nDNPHNuX-4_fy!3hY0!7eor#Q-c)EdA z4>&$$5<6-%_}Nu23y<*at72Krsva67%p!wTBeiGFu|_=Md5eBuP zO|M#|O{S7&jKZBP(|xbn7P=?7hM84+F@{i-GlSMvRMY$C2g+Cl4O=*E=vF1!H`qLB z)A2bB(&zicM>ulbzY>Bx7Pmp34nf;_zrPja_aDI{5VPOE6K!X8x^%SNO`uJWR#d8g z|7k8bon!$G%2IjsMDBpl-hWrO^!}@0mf6W935w@?Svt}|AjsUtE{d*Kb$RAR?l+o_=C%J^dDTvP=Y%joC`UwZY=>tesmMk zVnknp>so|m;MM)|$~s0_{kRRRZs!6sQ2W6QS^wZE$@(C+$AXg&9z>6(|9p1FxUP^h zgle$0xI;h!IUn@J*B9_V0wZmIFgm2eT251)TDsW}rpA2^wSWu~r`6YpmerN44cgO} z{`tXX-g8AUplwPY^eJNH&qpMGxoDp;UI$=`o z@Pw;x=0HxMznW!)dOL^$X{%c(cuw0eH(A|01C4p5OK5R=;rD78yvrio=&J_=$9`VT z(Dem6y4AxFSV^ZjC1bpngo;;BRU;-C!TXm=ZuK6cDL!WPmNZISy^-!vH(gnnEiAGl za|bFAi1I_e*`ypktf8_#ENztcazzu}tZWNwA6|=uy#50Lb)L{m>&Va%`QL{(XvOyA z4kg{^hhqqSw)@|J*?l0_QA1cUc7l99Yz=K3c?q;X9D%W5S|9cRTgDFBim9IuU*b2M zq7_ws+~7YKM2lIH6HBFSyM};O+A2q~3VEP|8h+#7y-E-mC^OU=trJ}-$2+yHR7`*z#ZFeU^qpVPCsym5_feyamuhhikS-^dt6KS z=zjI`(Z6^!#>7#r4vl@(h6W;p3Qd62nCD*Bb$m3`f}+2?sH9<;r3(IIwM7r}(QB!Y zB?)K|^{gp|dhiqV&a1iV5nvA}A9|YepeGrw74>yQ^-<5}Y+NgM6!VYmQM@Q~hh$ z*DN?=zrdQ$P}+@#kW{JRSD_RSR7qrDq1F%DUIXjeQH!dSk)7JWa0%6@fB6IDZ zwZye7ea>es3R)*gz)7zC83r2*79rgT0gb058`%jt7XhslAA_Xj#zVek1v-nA zc^!L9$wC!c6ojJQyY80?G@K`U}?jkq>&Ae$75~Gr16iwz$pZ?a*2%KbJ_ z1Tauk3w?q(^ts`^Kw+k1yp#gUiZk5ac%Ni$yeUmHY%D3m8hk#ZPUbpd&l>?0gl;@v zd*8@;iPjm&9~}1pO`P<`EAT?G(i&I1@rJy{ig06LHqBP(!?EdT<88tXZ4rky{>z5w zA|@mdeMDgTgze4bw$aD8Jb-FpIty?RwE0gGwE5PAx6L;pW+k`zdX%U{H(wo< z!pJL6pwH`ZWD)H}jNzvt%U(9$pCGaMUVBTv#cwa55r(tdo0#Tqo{)D=JUb@qc9`9k z;KpD@4uSgDAeIKGSA){6M?~qC{wjF$2J@TE%TvrL$**hk^xXzaGW9K;S(-~E+I*0u z9O;{F#vQI~xlHD^l;!C(_Q90!5nHOJoWHt}V~eK%TQDOf$_mY>am#PT_LdvCbfS28 zv9n-gxT&_ZrFlASXv=+=sZlB>^Xk!9RTQX8*z!08Uua-<>OLsxmBt6AUMLR=KYrZ! zw`Gj}F>3HzRyso>1#i+OF$D*_h3cQ~^cr%N_@$bv`naNV6&b^_(&KTvt_=kEZF4PKqSn>*F0#{c-I7L(Lz*9!Zg_njAhj11(sQ z8M(0c7t-XFD*8(PSciM^p^8P~PJg5~WMylOcQ8BFYV z>;5!`*t!{5Xjxm?2A}*}BngpEUJ%@E8*g`?EYx*)lt#g&Pm=!N4@Pr{qBu2x-I5CNl@`z z+itUjvh5a#(GjG9Jj{goBARV?am|8P0FxiF9B12$2~XReQkB~}3W#Lx+nxna(!Ong z!L)uPb>Voojm@4yz1vnRzin?3@-la;q_!M} zYcc?8d+}72w-QHy0xH`tg-yuX9vKj**iP_+3+!7yh_=5Jy4!!6=~dutzd`pyM5T+D=JspRdTaKb+8-=8jyZCrGwG4oG4qH)?m=2S>NPUB(oCA%Zo9UgWs_ zWq}3j+b3xkIu4i9=|psR`r_@!R2b~K5ApP;eh_p~Q0cHEx90zrJ%D6fw0Z^z??p&e~7adC6^U*&!gS!*JxE71JblxE-J% zpN2sUlGt$w@LJHjkny7x4f_NGCue;n^|K1!yQ{!H`ypy|t+T~WxBnMJn<;jGb{!52 zW!esS#Tx+jom1rP^LsoK;kpZ9}*(ENE9cqV%&h#XtnBwwOl zkMsc&6`arcR#oKPpHH?`hjNJfb56hV4-B4~7kw1xUzO&fO+Rujf1mJonvnUN&%n6w zfH%la!2Ql{%4R2M4Y}>CYmDDnIlKkV-Wr=0#@h|J{sTmmGP|8ux%59Wnw_kIr8`S$ zvC&PV(<$+zu0DF_gWSm)%13){IU`|clqTYao6RioHB zmKV9oxq51l(2XtZZm!?k^*5(4c3oqtfiu~;PtfnA3>L$Uo!cSISvlS+O3w77yJGkF zF1D5H6Ly^euQ&tT|1LkIV-+JCTArj|T>#cyS0z(N7TD#k8}lx7m>31nRKn6ZpW+ii z|E_hK*scedGFGpbIB?p{**BtS&YXYLvU5B*7y~c&~ zf!TO_DWZ)$$P5uTm{klxz^+finTCPxZmh<4#~F#cj?-6+-JH|$kY1JTQY82U9lNhU zNxZ+C<0%#CZr9-&kt5(h)$X4{D7m6UsfgWwQXso;6%V>41O(T+?=rGPI<@-&I^h;x zA871puDW)w)!KFsL= z8Yo7wmJ(nCx$fckB~`rV)@)3*`=HPO>3e=dW0Jh5fqm~`aw{Hm%L~ohuvH-wZ$FWB zp`<%|$=XN^Gq^^Ndv1i)0(8SG3eVGFg}8}{zHZO|ilsucnNvU^L2Ja}o-vebkoKN_ zShxwxHlBhH6pz#r^KOrakXT2H8CS=L&G%lb!#x zC)WQt{1gFu-2bI=zbK}uk~AWQFUr9hjw3X8K`}l=Ed_^urr`G%Cu8&Z75??bZ3^s* z8yu;8(a0_t0_9A8zPLrb)j>Ykt!;L;jW0|iTq|rwY&DlYaavZXm7c{f$N?;03^O%3 z)sI$0kd++&%h`l9cWAACWbBKllB(t{$kpedvM>dhU{#=%ngK4z&;WD|+`H)>M$y-cQ8%-Yv35O5K>>_q$Y`8gz~+ z1c=8}bGymh5t0o%+IK@{NBe%P9U;Jdg+Xw@ZJ&!jC_TeL zM zz7Q})5VQK=X5TwF84w7U`zU>*v*P@RsAJJD(zB?kIqW+ieGnJHao;hm%fKsE5B%8t zZ2uBVCi|ONQQ7|o53{Eq4|-+f6@uO082e9Sxoa>OH{k(LgG@R`h<&li<6#{8@8MNb zl@v$AXb}LGy1xhCLTbRzj>fd&6jzE8P8r=lpRF`NYyT^9w|}&r+GcncCic&OIa*Z4 z*)L}EQ4Imy2g)kL{h#PiydH}-s5R~Xl1CarykCF6r zJM~pkee2-|Vws$lN85q*FMp?z9e74k4?KiDXZCA!JMb^tK^yeQY-9Wp=^e}+cuJ(W zXe@Q6pfO&|_P_@i1kgM%OHmz|uAi2yNyu9+X$bF(qYL{uus|C?E(fdt<64Sr;^4Go z69-#?bkKCLbToI|!Qg=-3LRjwj2LMhq#hhD03$#66Z<~MlKas2!3#q=rUYX4;ExbS z)UYU;(=Uc|um#4B&yJk{2mgQ=m|tF~O>?hkIP_&>oBQ(m%=T^Zru1&? z~5IG%+JKA=Fo7Qok#3wdqKra0u^B5Q9r_`n7NC^ zAkIUp4Qq#1P*{dTr{;ppPkHVNq;Jx#G7ht(IL5w*{k$0i8vTc<0%Lo!?8D_eOz4_) z*(|-H@>6uB0FfR?13LT*J>=n^az5T!F8HdDA3yb5hi{F{!@_-~$Uum)ha(Ujo+=B6 zA27)UclgG`?ctBegP9!8#(!iUk%=6B0mfpP6zV)Y9+$$RE?A3Ni6f0z`at37@QSqH z^Y9{t;m|P353zeGJok+k>l3 zsL1T93jd|m8CX-sh=K|Ae?{5P+`)1XX!9@;JQxjsU9RW`mlHz1zC`qXZQ&ru%nJ;c z4SK%5R-sx!!y$g%*tT$^;Om!JK%2JEigRA$u|eZATVS@87rEHdP@yqCt%(bs+hsOabGF$UwBVjQ2!o2$=${RlJfY|IaZW*r$AR>bjmdW(8OB%;i#pO*5gqBH zh#X7+S{kvn!5Sb`B7h?wDx#owVcd)LZ{&g!Ol$(-N7w?YPXey>?AYs!(=n89YG|HE z4iTG(xnao!#3RRCY7mRTzBxl@41~X_%xjTcIBHhl-<<1;N1FeJFM!cq9AhCe8-GV;_e~Eu{idy)x~xp@zv-xC7_r1yEAqZ?`pGn^ z`DTb?sTAIivPnks`esesS*;(zcYd=Flt5`IeqDjO*q!A`B)%j~2TaBUeVjI-n!E$% zzd4$De6iw%qa1?~AwWY_wW9aCawdh}o^JC;@3z0AR}f)!-ADi8HXD$B^ajuhy=eC6 zEjrT^0~pFi`M?H^x;PK7d33H{Wj{LHid`Lk=>+ZGg(RSVv~S)iCy!o$-JYn{ovCh) z&cIKTMI2=pVB`?a2H+x4?a?jdlRmQ23;6P*EdR+VpKVt4%2U+n)%uZ_h`n4MH8?I**6NlC#ruz=%G-eN6Fv`zu6?H;j)v ze)|CC8|9L3|MR`VqEGOyTzuOuaiIvm?UJgQ(VuGo;ScrN_$Ye6TJhqpzhxp=bQjV) zkOv^&e&{snx9?-~ClXKlU|ayt-yTiF#cy{g6^T56rvUSAJdA0qg3#c1rC}*nCNh$w z)8l6vmcDyN!~O1`$@zX43zEM3G2qZQWi`5@n%H*{l5m0F{o|zi`K`VI&s81j_dCX) z^v~MG3l#5n%zjC0oV@p4R|SiHeo!p`*nhN&iapt_)gxPSU~sJ*zhs%k)bbpL*9>}VXjhCW>}h!P9f`J z8#;EC@#dJpB$MW`-%uLDyBuqxwq?bA<5y}#5_0SwLnQ-x2hm!9;SZZU){?`Zfo1ra zNScqmt9>1t?(j~lI~MkjJsleYG7%#~eA@!;L8<5i+LU4SLdO**a1LVX) zRoXZX0m0Y-E@kU&yl+A6M6@re)&`~vi{*-q#+-A-el9qVk4{t_e^N{x*ZyJWCVkiO zf9VpA-$|7l-5>vB20{pvBp2~J(~Mv+f2{QQ17?93+VKt$c_QaX+4k`PJdDHCSvj4C z=O>1lJ37q6H95e~6}t|+RO9Cl=s#DCO}nv*`S=zkczi7qRLPE$=v6wf6LfL>5V|oF zcB(P3DtmbmZom)A8z2asROH3Wtpo7sm14#}s(zRsxp8A2V8vkp*9rfoF8~85;ZdQ{ z@SiJ2T_1DI6?+IjW&7#dSEfo)#xJUF;_c4k?h}Y7i#0Baj{SPBUCI@E5%x=R2^Kuj z1IX$j<$fmtCs)kV?-@4cC?yfORoBP#T#KI@jBsiPv4yLsMVfL#(!|kRu|trYN&xjJ zaz(lGa(*dgdqkv*i{;MnAh2BCpD@!4x$~_w74Mr@5Pw}6j>49T_o66xrVb=myaV=~ zE6!3MyiBe*b71XP8uX_JKgiR@2HgGhoB&gs*+cD zl+hMMql^o&R;3(cgQ#J~xc_qdfoSqQL=7e^T<7utVsbrsEPxVbbe8v9I>S87nc$l> z3U!L*a(@x3dG8SVb9nJvM-Apu2J+EFb@QxsylLA@0Xo zQ+~;8U~(D1UnmCht0PgoRWAR0%l2TM^b`(rp0}9Gzed(0Q_kf-X}|e*lN03f{~Vq$ zrl`yzimWl*N>%Q+!ZfcWUyV?CVh9#ymH)Ezqa7 z=V01d(J{6>nV9GDkE6hI`MDM-;r0KAU-#vm3rsEbXOpScZoYTO7!T574)EniEXw67 z>wLhW`BpA>u9AT1+%*IOG@rXlac~=J!RB(mBZX8lG5%NcK(Q80@rbXTUPb)mRuHap zx#o)AY%-TyhFkWv7nO3Z8=fX&bS}s782PDk$CFocZ*r(D`5Y_;MdJi=i}g!-B9_qW z^7RIg4G^)M(*|j@r`?XU=;JhI^K?u(zke5W9QAlASisXk)@iuWgg8WeT6M%@W+i|b zP2@#)r~N6N8lO9jfho5mjl`Tz`$YyO?4mRjIGD)}&5|JOo_Q&xa9V3k;k0IwSaecU zkVbJjxIC>_25_V&W1i=RThx2!PCJYX0H&wCC%8|WZ~BaZ1mA%qlQBb>L@V6WJ^@Ac zx+QQL$USYZo|+6^6%m~-5;3Qj<4rT&-05-t1CGJt<6=P;+?AXtjU{f;O_V@$7Gra# zZ&9JA|BUcrZA)>V{*NT+({F{jP&_y}{cmCyAu|q!_tVFd0q0I{1*)szVE_jlo!*sA}g9r&)S=_ham@E0HCBYi}@;6B?$x7dR z<3h>bLHT7k8m7u}d4(z=4%C2>lJ}yGdkk?{teSs72hg{C|ThXE+cFS%SzGL(_ueKD7iE4fEzQ)xaHqQi=Z zq~}T=&D`1}rQ$=2ZRjI<+8o5i*p zYh))T0x@lzTRBQPu3*TOZJ}|Nc8HWa;|p#1jL9Z&i1mzN!sd);MS95jjF%Dyqb>qN zXN*Tipj8PlfVze&Z|d}}v6`4WV^#7A*$Pd3#u*#o1Ig&ZD#DG6&mtQ{!=+xr!sxD4 zBQaL096eDOGSy24SBmP0S12+Eic9@CA*0l#$_ycux+a5+5xIWEk5V1=%BB91s4o@! zzoFf%%Hxi6rP>&hixSH04$y5#uK*SfOR?xzDV2I&K26bN6-?j)N_}WBEA<+Tkp6__ zmU=5RR4M#8-T?b9^*-c8>J1-IQ@VU`c{t+&2Pn)F%{o~DTsr2zP)KP`fC-C48>I^p zdP>)k6d*&T8Oln_zm5a2mC4g9lwPNOBg)b*>LW}4U4fSVgO5>64iQRz>Bn#)_R)+x zN~3gZTZR215tn`*5qqPzR7CPsB-zq)isQjb&rFgn{rX8O?q!<6nyuZR`H?J*3z(N#qB{YTWnR)jmg!|L$f3*& z%8-!}td|)jLK^bR{4~HQGmDi$#9EV9)R@cY!=s2Ro<)UaS^TGKB1n|Y*WW6Ud|Zxe z1{?($t37kVHSjo*_)GyPEPDaU=1Fy2wk|KyyyLPWkrK?b;#{Xg9u6pt?XQdfRpy@EA)u$%Uz}H%du-KI^B)z0bbe9?Urx@hgA8)1d>{#PKxIb zC6r@UDB9yA#o{njRPHiJ!**43JRL3x5tr+htfbss8d5nc!iFuhSMHDYg)c96hgfbD zDlOMVN9&WV2y+Mp=UMK_u;&OO&dB1OwD|dt@BE~vkaaLNanhYuS)^ER!^R%?LJN-7BTpUL_!4du-LxE(`EsyHKQ zRKL)YZSKs+#bqh%52x;fYmJI$E@gTKg3laEpQMA~JI|aL^$c)@OE_~L&9V1Vxj7^~ zk#bj}Y3T|}V#IY8)N5;Jy4mIbf2EwO*Dk>w;0C0>5r60(0%U0Rtm$SuXLS?2PVlywoIQuU! zRsA3NhfA%Vho4K=FIj!wHmNcH-J?{sK@oZ*5eOi0=@+6r%dl*8Cj~CDu z?WUcmDHNQ&2)z2_0_cL^2m+RosGvo3s<1fP-IsTne&%dEg-D47A-Gmruh3RSR=8Mi zQGsZVEEqh2$qIbdM16rvEu(_xzw>G&PXM68AESPqtMF4EqUW1bS_S7mQsIfjw-z}U z`XMi?z?Kik%oXm7=3yhsgaZvk~Znu;JF<@Td0LFsSDr_?!w5;cFf{==1t*}R5%t8;dI{vQsVXK;L~#`V zs(V3;Q7x;=n=z39#g#_W0Ntp}N+ZJVM6_|F9-XB6wZ>a%4lt;0yzsk{xyq-D4zTO(Nm0vrNcfUV+}0K1tNa&z zAUdhs05fag>zUtm09g4J{-*G3hGMI(CW4o=SPG{aV5vM+T~>Y~W%`vLQ*>tfsn=(< z!ca=(Novrp#?q9T6?>}fkoC>cZ;ow}xyl>ZCJEjuuTa^Qm#H$8im$1>R*YdpY@GDg zXRu%cKMbc`>k{KJ59e?~1jhqGRov{Am4|e7 zQ72-ESvvfXomIJ;%U2~eV(<)dd5HF)3~f{yFZ!ymzuyQ~KqYJ@`Uf2i@^^@Z zu~wxn9?2&tsk%ThR~?9Hp@OQ<0VK_)Xt8&x!?W)?p9H67IYM!v0t9Av63_yV0YG$JGNpP3c;f)${?N$^P>(5}d+8tPEd?KsR z+X$lCgRsj4HAPEuJD8|mAb-_fFnoipYQ10-9b}=-Gz@a89fMhlZdl&Y&5HEtjv zCC+>6l?5)2!d;LkIJIS>8|>^-DRtwb{-b&+jkbEMJ1T;x9=3X=G_tx;309BsZ~f3} z_1M^}cy6`R>V?u%y`hGcG*bOn_MofbZ@8&`uVhxgQ!^y@GQ+d|wy>9$s31o$RK26I z%yr4R>OJ)|_S-*;5~K?5#>!P6ll3FzUn=VA%NSlMz3Oi#p^64f3>8=Z7!@nsO$i(T zzam|_LX#qQL?An^(M)=3oCd$RLdG2QQ-g)v`8HppR@frwZWxXiy1aT%mIc-zk-#Ms z&9ue6e_*Pvc613!4U&4x>~%E!6XhVkPYe>8fVB(tdFRmLM6-|@gM?v?-heCCtl>|T zBw;L|R%0BtXF`c;ldNkjQC>CP$~#9Y&})7Sgq2;54|$U{DrmRnxz=7uLuwok=JwGH z@Nzqwkt&A70gjsGEEeJD$rLW;Jx@Tf-ihO5_E%RQN3Au{aB9XVAB(7Yog2UyTA=Hi zzoAvesnJ1neHUGv0a00{hxhqa1-Nw6D(E?UhB!uOHRsAp&3=+t)A7IdfxPSS=R_?7 zE!7-{mOvMC9XQgs66;?qiHYW#-^hB+_hBM@ca+O(?og^VNrhrT4bZLmm2C@A6q|foUS^L zbJ}|%_Vu!NPIL1GpcLe#ZE*2xMTAncD^9yQ=K~=|N_@^Z!^Js{0%GBt35lXU$FJW+ zJ;Lu43C!5^uOZD^0fY;+GNA_&yfswwtrRbr$8$+b$+g!>PLX8g*-~FoR+|hc16S>V z30y{i+RK@(Q66uFuG0!W&_fSdaLxv->Vl$EA^k8Oz!lahr)#RcKM0d!D%e0i|Q|?9cY3QsUg(^#=t?{ zKS_Mu^K7DSB)xS$GH%0WofYU__VCRJnAWk%I>$k$jqiyH3Qf_jt17I5#OjtTVqvd! zYsMETb9Ez)jkf$!J4fgSkm|;GxbBaVu&7qieBGP#3OuVJSGQ?GJc4RK7ZG-0u5MKK z>b4cgb^ohhafIw=g0y~3p>9V5B=F~sT^b(h)t2PCD+qqFyiDw2>vdpH>E77a463!*Ir8F2<*L&ut@?{$E??0jF10 z=Y2AHkN|=pp$G^hlVm27-ZSYlnY5Yo-h1!8_uhM7U63LoRjIN_(N&ZcFs{C?h$sk( zAR?kJio*N-{?C0T!T0^_O6GZ zltR*h;D)>U|F9m0l==^b@MkOS`V)0G7)gD%faU7Q#f_>O_#(AjgOTJ8rQ$bQMd42x%!U5Ed>X7mKI~pW zKFYSic36U*y5Tcw>H->k*=X0`OIWcyApzVFvA2O903)$)isd5B2EPAU6K?RFW8jM6 zufa=^g+nM}YTy&V5R-gJ(G`AIbQutd`n$-763eKTvh(5t*(n+obx>U3s)&ORaX5+f zo_ub{-FPod16N%%C5v}OgTq>@#12FhO%$x|oE3SMG3`=hX78>Fa$w5pHL=m~kIJ<8 z+JdXX&llaLCW^j@L}aq)%Q65v67#x}E_&IuLtk2L1wz`cyo%1?r`*@X&}enQ$vgmfVr#X@#$-6{T!wotr6nu<*=Xj_@U z7k5@;1~jaeP*BVk_fTK)Xow2mN`NY6cevM?jp27(iO-r?a8|sP!D4wux_)ius~qmN zG%vn|OXC#V^x$ZeZsCxN|0nhIi+R;;@R3$Q0vK8S@2Wj>xjqxU7orY&Z@5qqHY~$w zBd>-XM7n>}<&3tr{CipQ8pNlD*CAB~jBFvSx?wBEt6pZ%K_Xpu%A^#k;ZQ(vwy;h4 zTEi(B?D-`fD;o+YEHr#fLv6TSL(TS^`^;0W;Vr1dmxARQei0Q$CQM92+6^D%7tXtY zBsvHYY^0M%o}+MW_*`Hlj<1Offb^*0D}2W@8o7q=APK`gBqxX72+0Vfk{i`r$tBJT z^E9AQM9K9i$^;4Tlmu5YUjUUfRU}2R`=ey6nko?v;c{bQ-@?-=t z?g2C8_9Z{0G;>`Jci_N34^?7qo+Y0Aa>-xCKnZzJcmuG>#=bJ3ii-|(QZqqr<47CMB+yO%Vjq847A{m`iNAbad)dla+byo)qdl;NK)LR4!Rh$kw8J{Rlzpy zguOT6i|iK=T)Ybr2 zG$ZiYQ8G6vAlC{Zz>Ds|xtn|@xa6ADo3E48LYwr^!8B>X{e__l_WtAwD&mGN+>0kq z6_~kRlL_?ViGWR_|7i=|Ey$+3O=d$EhLP%s4*R{T`IB~Ln(ZjKE_iS9s)%axoI$tA zSFpx-$)oUVa)%7i=qGQ0%O;OND96r7^D|hMVULSFctG_v;j9o7S2WV(72P=-|>*Q{}B?lhzI>E<{5Nf8${RL)44Nt>-os}9Y2D(`0TFnw~9%?5;T@%hGF zvq^C3`$viJ7;Ce+s8j&riSx&H@+x$P-YWkLP0rQ)RKfK!(Ci5rXvSNRBXw`~4b_AG zntdH}U;!lSV5Mrkc{6`%eu1JEQNIyL%{cnBCLB{1>XX=TauZ*^AF^kr?u%R%6q-WFWnT5BlX=@Ydwm zaMFTyH-O+wPLAQtwb(0P^wTV*&=;h(xD6ADFe;S~AkXOU`-;z8i>H8sO*2HFH4{KV zOAcuaLvHb*uA{}ToC@W&c$cd!+%5)cavxDE@ZXX$pY%2&K+CJLpAb##%ID*`ve0R_ zY#YAD2vT1;x7;8(EhpKKX*p0HELzhp3XzHjgq4;{p)=oItCMIkT%%Jgx8(`_Rm-F3 z)OG-4@I5@Yyd~L;sa3u_6E!VgQ3WlZ6hz+sW2p2os$9!6p&^VppI7PCTAi;iZ}}b= ziwB2%Z+5QbKNOx8S;IgGs$0>VmZMfzNdb7Kk%A*@)iuz?ivZjX(28?$+ze2Z%iN;k zZROzxrMh>BYcZ~-D(FO})m zto4aCHM9m_e&dar4mm)pGprh7%biin#_0i-8KmgTY=?`elpoF&jHJ~;>R)lSO zsJ}LJ>%-f(ex51P+iDRE>!WQhB&%%0NWKRMWwkM&w0{3wA}bVrn*t~cPO@z{>Gfl- z>B2++u#J8v@5)j;qfHkEvVClxM}}O^hqQ5|&3|b|#ML%m31V+cj{~)tN42NLv2l#1 zgW<5vjznRb%?@tDjFmuSo6`*UIpmblRW0gxSQaF;c{FnActjb+wfRr<8GCVK!@C8R zs|<)i_WqQ=^ZGvL#$V-j?iBZ`aoIZ%_f&*7h=t9?rW}r$=QBZx%!H0n`9` z+e($%)}Cl-2*85oEGkR+4fLBmINp3NG6Q$WTA7#PPhaSkYrBK5%_FE%Ma`Qg< z5cUAu?b>98OuO2ee7j4yJ(hjWMwNE9txYH8r5&{o6k^drohVS^lE0`^4yr54;9gug zNe#Cft>?SEBDF**GH>^NK)`zh7^B^fAt=Hqbl2iDEm6n>5n!SHd8xnM?nBTB3Hq@B zg&UcaV*A)f*}fgnARM-DsKaYtPfntSfsghrWj>@r^3#5lxR7F6xiNqHq2zSvA*$5K zQ^^S0TLEI-0J!}=O~L+G`<maFm=qh$Ph}Ks{Qsq(D>Wm&7iT_D&6@6 zcXEeU!gBj(6E6`c0Yv*ZflAAuij^NIiPb(BMD6YEg113?!mRWXfmmv39Lazi_~pCw zrfAQkIsn&;D=BT1=EutdhSEuKV-Kks6-?;IPp zj@oW#Vs5rD1tL0LkaQS|?bv`DupiP1#zabeu~ygh!tPC^+2s{kXh)6SS4@Bpa?g%& z{&zZ5$-apw>G+^rbi7Tj{kW>2P;_-%4m6+_4)7BlzYtE4G>N(XKl@oi)fJN3huqZWZB5f58YE9ONCusiJs z_yzpCA}C->5Xz5jGX;4&fFutb(-;__J2DO$fsU@Z)9uQ*h(8|YGFM-1=tw)?b$-UO z1+aJaZ0cO6{}m&hguKG-^lKm%%d2Km6z(b8%hF{WV(0T5n@Kuf4p{BxMLbK{dgnT! zVlKcLcWw-3B2jarP2{b;_;#6?>pa44tnjs@t>CX{DxkB@i{Z*et3v*JEk9-L$)v%~ z2Z#yMz8BGC6edgRe7o9{t}h8a*iDAtIh}tL-P_KDgd9V%2ct+Tx-3+gU1}+T&Ype4 zqYK=rSUSHGW)cAhGeIkzKZc9UGv*)1a=tFjjT2qi{2z{{O9LqOGD1ak(PQxelDkaT z@jGAtus=nYi50nb8HF5xq&v`fFEHvva)`)?oYK)QU(+_a?6g0fwhNMipwBKxn6Q+| zxL9N9a$DSjJNL)?f{s9cmlw6EE>G)<^66~KBSe3f_tVO0mp@8o1z)_4PN1m5)SUnC zL&Xz&0?JnyY`XoxeJpkPqo4eDeMqTw_55pj>>4Z8h`8&J_}CQ$+j%oNhiuT%wXY1D zU1TLMai!~KYm}~OiTxN5g1YDlCpREGy>&b z43qvP_c39%bO1kCf4A!)BI+4*(5)dpAU4QCDN^Xh2|G2#9)8Vhd%`;r-}H(+7|y%h zp>n(JF@$wnLy$q3-8ca_+*r4j5<{<6KZZv{Tiv!hnva&K%vMVEp$%J2);ICVOR9$IKt-4M=Xfy$4jI8JOCG46WeHv@acM z+2web8n*PTheO0=9mEf^E^C@6NePs-Q`L1s8fA1(LlllMK%TgppP;n7vvMfgrquaZ zwmj~Q^Y6L9>s|lNW`pzc%XMas|G0#g-EQPI`dkt|s_aof9>4oOc9k@?`>}LMMyoDDdiq< zs73dNvQusYOJ>UN3pZQ=O2e&U&E@|Ga$D=+%fAmB`AvOr@wu};wgO1R4Huo4>&^=| z^cUs%Fj!q-b<4m#TasZ zZ;P4JQC=m2u3|AP{A7elpZ<7TJe{dq)rs8jOb>Nvm2s~5j{R1X5bP=ea6W`bp7HB&~|JxqM;v^YzTVelU7on@?o^Boyjk9kPM8Z;KvZV-n(wnyTW z&J4ZCU}6+AmvS$v%=CDSOv)k+_=U~(VCOHtM=IJKDW#=^oHL4EQ<4(bKmOvx`L9@?&vh^+HH!sAn&} zuez7%J!izE7b9wr1J-&jCQZc4fHM@+>zl^jUTgLGy|9*W1TV@+&xfsD zdwvBr&NB-~#QvZX*$(?(X&PSbtqBZ&n?<8B2RThJ=NCTD8(pA_n&E zW+l+;mzaT9{T~M77AiR|<=`O{(Ys#iKJ@++618#>;7$1}zh|^YBs#sX#QDhqry00Y z!DUS?9~Tmh(cbyzzk7GKgs877i*l~X^q#JpCtURQ1e7x9jBt*UdQXuU;!+iVZ)WAh zi#9Niu(y@z&&1rO5&3$*tZnsvSclmA&LCC@gleMuQ!_{=uR-L!Uj%wSs7E%JJY=Nk zR$=*&APoA%E`~nmnQNZq*itDQSQn?M*(o|lAjqu`oq!0?_`bHJvQS$tf#d#cMLO(q z1J$5A4I%w1EpqxkV$iC4UaoSEeD?XfN7(fFu9x-M=TBH!pOsKYZWqe#vz>W)ED;n- z5Nf!DD;_pA!9e=lN7u(&?n-tqVgO_f%j!$q4~hHf^KHKb(wFh~8IHqg?MZXFKL6{{ zM3`5fH;hiv*XZM6c#+Gqy1|h-zFQzy+1B_`Y5yw_NW`sdg#QQql?|9SZR#r32V5yQ z@~@v)43&M=Q)M6eg{emvuB*}r0I4R0bxdh1r`v4^mLaI>P3^sEoLH^gsG$)xs_Nh| z@RgOXE4Rw0lvpJmFG|?TuQEX_Wm!m(_aURo$1xX$5K+1Ed!Q(|`3ZonQXWswjde|^psN&fNL<=tQa#f?DmR0KTa}D{t$?2;WVo$y>#KS*P`Pt@&S#;HH9KR%4 zRYx=yLU|Q$$+0u+_L%Ge-m1rS3{}*@x&_+NUiM!h>#P<*+ExFPzloCCr5=GD4=sa!DT=dDV1vgea)9s zAnIG`(o$idvmA6O)xHOmYTu2lm!smoi^Hcx^#a3v*C?P8c_e2Dw*^e!*bd&8H=x-E;=1I~5u^jZp^L#^p*ZO1=iz&~ zexEXJ=GK0G?*;J`WWQ@gUcakjpm3f23jHyk>h|ja7`&oX$uW4pa&L#6xZ+c|gAr~K z0ciav#_-=WlJ&bce1r+T%I>$*3;Jye=VkQ}wTl+tkM~}&?ZU1P!`eAW4{9R;V?WZl zh>JWZk5UT_^n1p=AK8kbqxxS%)rwE03g|v2}o%bKeO=0P_31IGehQM6W zz@e!zNB*Z*ckU&hfJ)2w|S8}Oc@R42CQQK zRGB2qV15HWwD5C;IILj6%?ZTnTyVM6owXX3#IxiFPW^;hGUdv4!qVOe(tfMJ2e9`8 ztH;gfe^+Y*{sbiet~!%p&Vg6bYH7{Cmmfo;KH^@er+D$FO)MonuU zgDp8LqYt{!Tyo%75e=9bxJZo+oQjH|(^r`BM`%hY4BQSrTsJfesUfhD!@w`Xu~9g! zfW~tupLj*^r`2TwXO=%Dd=5O09;)Vh{6k*9f<#ic5X=GJJowV+ zJGeV=u$!ORd*S8rtOfs)TcG^Gdn~{QmpaSfM!{lDM5&(-cgJLdr+ZkefAmAv|tZ^lCK0S@jCP~evBB8JGp =vx9PX^K!q9(k{o=G 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 */ - font-weight: bold; -} - -span.mpdf_toc_p_level_0 { /* Page no. level 0 - may be inside */ -} - -div.mpdf_toc_level_1 { /* Whole line level 1 */ - margin-left: 2em; - text-indent: -2em; - padding-right: 0em; /* should match the outdent specified for ToC; 0 is default; suggested value 2em */ -} - -span.mpdf_toc_t_level_1 { /* Title level 1 */ - font-style: italic; - font-weight: bold; -} - -span.mpdf_toc_p_level_1 { /* Page no. level 1 - may be inside */ -} - -div.mpdf_toc_level_2 { /* Whole line level 2 */ - margin-left: 4em; - text-indent: -2em; - padding-right: 0em; /* should match the outdent specified for ToC; 0 is default; suggested value 2em */ -} - -span.mpdf_toc_t_level_2 { /* Title level 2 */ -} - -span.mpdf_toc_p_level_2 { /* Page no. level 2 - may be inside */ -} diff --git a/dependencies/mpdf/mpdf/data/no_image.jpg b/dependencies/mpdf/mpdf/data/no_image.jpg deleted file mode 100644 index a690485ec13f25d2509e3f34d0188ff5a7af789f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7888 zcmeI1Yfuwc6vyvoH`xTS5>%`XQ)1Lctzk(bDlvo+Fa>5PRq@%@&SrOkD0z@9CeUg| ztq)pC3$3N1)v>-GW3@%J)hR_$Y{w3xRuF70h_sbr0iRKW+q)1S?WfYtIMZ=YCfRfE zo;~OOfA@YkljY8HO&}!2lxzYBf`BCW0bFxP(NvEm1Ax?2FcttH1sF0Jh@dBfgOpVk zfI%ODe){@P_$vqnAcSoT2RNJyhGQfAg77x@Bjr881Ofs9fq+0jARrKU8VMwmHbp#1 zEri;UM}2}6_83B+@HCzWL9;+WARrJB2nYoJN+21Kzy=f`9$qQHHw;{J5ShiY4n0BG zT#+PgH#3ox-AZ^!2ce0KB7h;z7ro|Sk>Ns4fQdsC%)$Hihs8mM+lVwTD zcQP~bUrML)7g8~_D$dwH$l%d?tPU%~k_wMC+vd`HVwFAF_0Z?138m5Cq%-u>6HS2# zIEqyU*5Y=%Bi*`4yEBu}#Kgo9QCdQ)Rl^9iE6>J~9<|LiB9I`FaZyf-gSFUg3O*re zw&$|3%G_KFt~nSpq`YERH(ssqt*^Pu-|tKpN1CtyO6K0y|63Ap-1pijZV=@M}Di9nx%h12yv z!}X|LWNffUbi-zly8sgS7hsQ@NW_m&5i}IVFccbwNyHc?hQ1gVizU2aVjRaMIPdaF z0tw(#s02eXe!6eQeFNlD5CWb-5hW1G5mb(F)gS`?Z6@x`{h(V$L?|Yf;8IyoKNxTz z1c(q66=A3tt`J5qhW7y`7l#hlOpy$nM&inxLE5Foo1`P+_g4*`e!6p{&g@(!3knz??Gj@FRgo%@4^a+VmO)n-Tr_4y7IcxTux$`KR$;iyIEO4>8i`<^P{N-=0 zSh;F-!P_Mte7NSL(vR1ceY$ze)@|E&?A-PF7v%>k4j%gQtE0!NkDsVH`R#XS&i-(& zuKs*OWAmk!%dNls`rDPZu4~tC+`M($cjqpz3jt^V8N$Cug!VUGa;QrL>0>yr3lX{b z068Weu91XJnTC@&1C`pP(n0aXoAy`9M(Cz@4mLYa2ZfCs-#n^|m)4`~p9x#`uarF$ z_DEMF2u2aOd8i!3f%|1lo!88PhIO~*be9^(`n}z2{e-(|z!3inotONHzN_2b6rDYi zu-)f+d0o=7q{!&5VEdA=yRH7!e<&*srInv7n0%C3U3r}Y9Ke%3%hP;$9Kf2o-~W1o zU*t=^RD1sL@t;F0v+l9yZoEbutC%nADx8;I_T0{qv�J$+Rx@@6P*vPf2NE``nT- z#Vu*|8~ZJ}_)l3cL4JQugq+2=V=)S(TK}+fw^p*zEkl73FMF``-B+ zNL;v?T5K3yFR#AsI91nrIV(83z2?pp4lLi`wRHGY_0@Kt3U4pHXS`n>S6)-afx=<- zs*c9^(|i1~rq7CMPR!d|ys7_ynMKOl9CvI(c|mIt_T$xXDY;^iq5v;mxqZX9Yt9`l zH(z;U_k5d`@Gh#m*!a_e3#Hn04wz19j6>6otsgZ`J?wYG%!q^QOYR=tntx>1#*SCl Vq>{C&RFlON^{y&qOP7~x_!D__T&4g3 diff --git a/dependencies/mpdf/mpdf/data/out.php b/dependencies/mpdf/mpdf/data/out.php deleted file mode 100644 index d3248b7..0000000 --- a/dependencies/mpdf/mpdf/data/out.php +++ /dev/null @@ -1,60 +0,0 @@ -24 hrs old - $interval = 86400; - if ($handle = \opendir(\dirname($path . 'dummy'))) { - while (\false !== ($file = \readdir($handle))) { - if (\filemtime($path . $file) + $interval < \time() && $file != ".." && $file != "." && \substr($file, -3) == 'pdf') { - \unlink($path . $file); - } - } - \closedir($handle); - } - exit; -} diff --git a/dependencies/mpdf/mpdf/data/patterns/NOTES.txt b/dependencies/mpdf/mpdf/data/patterns/NOTES.txt deleted file mode 100644 index d169a57..0000000 --- a/dependencies/mpdf/mpdf/data/patterns/NOTES.txt +++ /dev/null @@ -1,5 +0,0 @@ -Alternative sources of Hyphenation programs or TEX files: - -OpenOffice: http://wiki.services.openoffice.org/wiki/Dictionaries - -Hyphenator4PHP- alternative PHP hyphenator scripts: http://apps.sourceforge.net/trac/hyphenator4php/ diff --git a/dependencies/mpdf/mpdf/data/patterns/de.php b/dependencies/mpdf/mpdf/data/patterns/de.php deleted file mode 100644 index a2e2216..0000000 --- a/dependencies/mpdf/mpdf/data/patterns/de.php +++ /dev/null @@ -1,9 +0,0 @@ - 160, 161 => 161, 162 => 162, 163 => 163, 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, 180 => 180, 181 => 181, 182 => 182, 183 => 183, 184 => 184, 185 => 185, 186 => 186, 187 => 187, 188 => 188, 189 => 189, 190 => 190, 191 => 191, 192 => 192, 193 => 193, 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, 199 => 199, 200 => 200, 201 => 201, 202 => 202, 203 => 203, 204 => 204, 205 => 205, 206 => 206, 207 => 207, 208 => 208, 209 => 209, 210 => 210, 211 => 211, 212 => 212, 213 => 213, 214 => 214, 215 => 215, 216 => 216, 217 => 217, 218 => 218, 219 => 219, 220 => 220, 221 => 221, 222 => 222, 223 => 223, 224 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, 229 => 229, 230 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, 236 => 236, 237 => 237, 238 => 238, 239 => 239, 240 => 240, 241 => 241, 242 => 242, 243 => 243, 244 => 244, 245 => 245, 246 => 246, 247 => 247, 248 => 248, 249 => 249, 250 => 250, 251 => 251, 252 => 252, 253 => 253, 254 => 254, 255 => 255, 338 => 140, 339 => 156, 352 => 138, 353 => 154, 376 => 159, 381 => 142, 382 => 158, 402 => 131, 710 => 136, 732 => 152, 8211 => 150, 8212 => 151, 8216 => 145, 8217 => 146, 8218 => 130, 8220 => 147, 8221 => 148, 8222 => 132, 8224 => 134, 8225 => 135, 8226 => 149, 8230 => 133, 8240 => 137, 8249 => 139, 8250 => 155, 8364 => 128, 8482 => 153); -$zarr = array(8594 => 213, 8596 => 214, 8597 => 215, 9312 => 172, 9313 => 173, 9314 => 174, 9315 => 175, 9316 => 176, 9317 => 177, 9318 => 178, 9319 => 179, 9320 => 180, 9321 => 181, 9632 => 110, 9650 => 115, 9660 => 116, 9670 => 117, 9679 => 108, 9687 => 119, 9733 => 72, 9742 => 37, 9755 => 42, 9758 => 43, 9824 => 171, 9827 => 168, 9829 => 170, 9830 => 169, 9985 => 33, 9986 => 34, 9987 => 35, 9988 => 36, 9990 => 38, 9991 => 39, 9992 => 40, 9993 => 41, 9996 => 44, 9997 => 45, 9998 => 46, 9999 => 47, 10000 => 48, 10001 => 49, 10002 => 50, 10003 => 51, 10004 => 52, 10005 => 53, 10006 => 54, 10007 => 55, 10008 => 56, 10009 => 57, 10010 => 58, 10011 => 59, 10012 => 60, 10013 => 61, 10014 => 62, 10015 => 63, 10016 => 64, 10017 => 65, 10018 => 66, 10019 => 67, 10020 => 68, 10021 => 69, 10022 => 70, 10023 => 71, 10025 => 73, 10026 => 74, 10027 => 75, 10028 => 76, 10029 => 77, 10030 => 78, 10031 => 79, 10032 => 80, 10033 => 81, 10034 => 82, 10035 => 83, 10036 => 84, 10037 => 85, 10038 => 86, 10039 => 87, 10040 => 88, 10041 => 89, 10042 => 90, 10043 => 91, 10044 => 92, 10045 => 93, 10046 => 94, 10047 => 95, 10048 => 96, 10049 => 97, 10050 => 98, 10051 => 99, 10052 => 100, 10053 => 101, 10054 => 102, 10055 => 103, 10056 => 104, 10057 => 105, 10058 => 106, 10059 => 107, 10061 => 109, 10063 => 111, 10064 => 112, 10065 => 113, 10066 => 114, 10070 => 118, 10072 => 120, 10073 => 121, 10074 => 122, 10075 => 123, 10076 => 124, 10077 => 125, 10078 => 126, 10081 => 161, 10082 => 162, 10083 => 163, 10084 => 164, 10085 => 165, 10086 => 166, 10087 => 167, 10102 => 182, 10103 => 183, 10104 => 184, 10105 => 185, 10106 => 186, 10107 => 187, 10108 => 188, 10109 => 189, 10110 => 190, 10111 => 191, 10112 => 192, 10113 => 193, 10114 => 194, 10115 => 195, 10116 => 196, 10117 => 197, 10118 => 198, 10119 => 199, 10120 => 200, 10121 => 201, 10122 => 202, 10123 => 203, 10124 => 204, 10125 => 205, 10126 => 206, 10127 => 207, 10128 => 208, 10129 => 209, 10130 => 210, 10131 => 211, 10132 => 212, 10136 => 216, 10137 => 217, 10138 => 218, 10139 => 219, 10140 => 220, 10141 => 221, 10142 => 222, 10143 => 223, 10144 => 224, 10145 => 225, 10146 => 226, 10147 => 227, 10148 => 228, 10149 => 229, 10150 => 230, 10151 => 231, 10152 => 232, 10153 => 233, 10154 => 234, 10155 => 235, 10156 => 236, 10157 => 237, 10158 => 238, 10159 => 239, 10161 => 241, 10162 => 242, 10163 => 243, 10164 => 244, 10165 => 245, 10166 => 246, 10167 => 247, 10168 => 248, 10169 => 249, 10170 => 250, 10171 => 251, 10172 => 252, 10173 => 253, 10174 => 254); -$sarr = array(169 => 227, 172 => 216, 174 => 226, 176 => 176, 177 => 177, 181 => 109, 215 => 180, 247 => 184, 402 => 166, 913 => 65, 914 => 66, 915 => 71, 916 => 68, 917 => 69, 918 => 90, 919 => 72, 920 => 81, 921 => 73, 922 => 75, 923 => 76, 924 => 77, 925 => 78, 926 => 88, 927 => 79, 928 => 80, 929 => 82, 931 => 83, 932 => 84, 933 => 85, 934 => 70, 935 => 67, 936 => 89, 937 => 87, 945 => 97, 946 => 98, 947 => 103, 948 => 100, 949 => 101, 950 => 122, 951 => 104, 952 => 113, 953 => 105, 954 => 107, 955 => 108, 956 => 109, 957 => 110, 958 => 120, 959 => 111, 960 => 112, 961 => 114, 962 => 86, 963 => 115, 964 => 116, 965 => 117, 966 => 102, 967 => 99, 968 => 121, 969 => 119, 977 => 74, 978 => 161, 981 => 106, 982 => 118, 8226 => 183, 8230 => 188, 8242 => 162, 8243 => 178, 8260 => 164, 8465 => 193, 8472 => 195, 8476 => 194, 8482 => 228, 8486 => 87, 8501 => 192, 8592 => 172, 8593 => 173, 8594 => 174, 8595 => 175, 8596 => 171, 8629 => 191, 8656 => 220, 8657 => 221, 8658 => 222, 8659 => 223, 8660 => 219, 8704 => 34, 8706 => 182, 8707 => 36, 8709 => 198, 8710 => 68, 8711 => 209, 8712 => 206, 8713 => 207, 8715 => 39, 8719 => 213, 8721 => 229, 8722 => 45, 8725 => 164, 8727 => 42, 8730 => 214, 8733 => 181, 8734 => 165, 8736 => 208, 8743 => 217, 8744 => 218, 8745 => 199, 8746 => 200, 8747 => 242, 8756 => 92, 8764 => 126, 8773 => 64, 8776 => 187, 8800 => 185, 8801 => 186, 8804 => 163, 8805 => 179, 8834 => 204, 8835 => 201, 8836 => 203, 8838 => 205, 8839 => 202, 8853 => 197, 8855 => 196, 8869 => 94, 8901 => 215, 8992 => 243, 8993 => 245, 9001 => 225, 9002 => 241, 9674 => 224, 9824 => 170, 9827 => 167, 9829 => 169, 9830 => 168); diff --git a/dependencies/mpdf/mpdf/data/subs_win-1252.php b/dependencies/mpdf/mpdf/data/subs_win-1252.php deleted file mode 100644 index 231eaf2..0000000 --- a/dependencies/mpdf/mpdf/data/subs_win-1252.php +++ /dev/null @@ -1,5 +0,0 @@ - '65', 914 => '66', 915 => '71', 916 => '68', 917 => '69', 918 => '90', 919 => '72', 920 => '81', 921 => '73', 922 => '75', 923 => '76', 924 => '77', 925 => '78', 926 => '88', 927 => '79', 928 => '80', 929 => '82', 931 => '83', 932 => '84', 933 => '85', 934 => '70', 935 => '67', 936 => '89', 937 => '87', 945 => '97', 946 => '98', 947 => '103', 948 => '100', 949 => '101', 950 => '122', 951 => '104', 952 => '113', 953 => '105', 954 => '107', 955 => '108', 956 => '109', 957 => '110', 958 => '120', 959 => '111', 960 => '112', 961 => '114', 962 => '86', 963 => '115', 964 => '116', 965 => '117', 966 => '102', 967 => '99', 968 => '121', 969 => '119', 977 => '74', 978 => '161', 981 => '106', 982 => '118', 8242 => '162', 8243 => '178', 8260 => '164', 8465 => '193', 8472 => '195', 8476 => '194', 8486 => '87', 8501 => '192', 8592 => '172', 8593 => '173', 8594 => '174', 8595 => '175', 8596 => '171', 8597 => '215', 8629 => '191', 8656 => '220', 8657 => '221', 8658 => '222', 8659 => '223', 8660 => '219', 8704 => '34', 8706 => '182', 8707 => '36', 8709 => '198', 8710 => '68', 8711 => '209', 8712 => '206', 8713 => '207', 8715 => '39', 8719 => '213', 8721 => '229', 8722 => '45', 8725 => '164', 8727 => '42', 8730 => '214', 8733 => '181', 8734 => '165', 8736 => '208', 8743 => '217', 8744 => '218', 8745 => '199', 8746 => '200', 8747 => '242', 8756 => '92', 8764 => '126', 8773 => '64', 8776 => '187', 8800 => '185', 8801 => '186', 8804 => '163', 8805 => '179', 8834 => '204', 8835 => '201', 8836 => '203', 8838 => '205', 8839 => '202', 8853 => '197', 8855 => '196', 8869 => '94', 8901 => '215', 8992 => '243', 8993 => '245', 9001 => '225', 9002 => '241', 9312 => '172', 9313 => '173', 9314 => '174', 9315 => '175', 9316 => '176', 9317 => '177', 9318 => '178', 9319 => '179', 9320 => '180', 9321 => '181', 9632 => '110', 9650 => '115', 9660 => '116', 9670 => '117', 9674 => '224', 9679 => '108', 9687 => '119', 9733 => '72', 9742 => '37', 9755 => '42', 9758 => '43', 9824 => '170', 9827 => '167', 9829 => '169', 9830 => '168', 9985 => '33', 9986 => '34', 9987 => '35', 9988 => '36', 9990 => '38', 9991 => '39', 9992 => '40', 9993 => '41', 9996 => '44', 9997 => '45', 9998 => '46', 9999 => '47', 10000 => '48', 10001 => '49', 10002 => '50', 10003 => '51', 10004 => '52', 10005 => '53', 10006 => '54', 10007 => '55', 10008 => '56', 10009 => '57', 10010 => '58', 10011 => '59', 10012 => '60', 10013 => '61', 10014 => '62', 10015 => '63', 10016 => '64', 10017 => '65', 10018 => '66', 10019 => '67', 10020 => '68', 10021 => '69', 10022 => '70', 10023 => '71', 10025 => '73', 10026 => '74', 10027 => '75', 10028 => '76', 10029 => '77', 10030 => '78', 10031 => '79', 10032 => '80', 10033 => '81', 10034 => '82', 10035 => '83', 10036 => '84', 10037 => '85', 10038 => '86', 10039 => '87', 10040 => '88', 10041 => '89', 10042 => '90', 10043 => '91', 10044 => '92', 10045 => '93', 10046 => '94', 10047 => '95', 10048 => '96', 10049 => '97', 10050 => '98', 10051 => '99', 10052 => '100', 10053 => '101', 10054 => '102', 10055 => '103', 10056 => '104', 10057 => '105', 10058 => '106', 10059 => '107', 10061 => '109', 10063 => '111', 10064 => '112', 10065 => '113', 10066 => '114', 10070 => '118', 10072 => '120', 10073 => '121', 10074 => '122', 10075 => '123', 10076 => '124', 10077 => '125', 10078 => '126', 10081 => '161', 10082 => '162', 10083 => '163', 10084 => '164', 10085 => '165', 10086 => '166', 10087 => '167', 10102 => '182', 10103 => '183', 10104 => '184', 10105 => '185', 10106 => '186', 10107 => '187', 10108 => '188', 10109 => '189', 10110 => '190', 10111 => '191', 10112 => '192', 10113 => '193', 10114 => '194', 10115 => '195', 10116 => '196', 10117 => '197', 10118 => '198', 10119 => '199', 10120 => '200', 10121 => '201', 10122 => '202', 10123 => '203', 10124 => '204', 10125 => '205', 10126 => '206', 10127 => '207', 10128 => '208', 10129 => '209', 10130 => '210', 10131 => '211', 10132 => '212', 10136 => '216', 10137 => '217', 10138 => '218', 10139 => '219', 10140 => '220', 10141 => '221', 10142 => '222', 10143 => '223', 10144 => '224', 10145 => '225', 10146 => '226', 10147 => '227', 10148 => '228', 10149 => '229', 10150 => '230', 10151 => '231', 10152 => '232', 10153 => '233', 10154 => '234', 10155 => '235', 10156 => '236', 10157 => '237', 10158 => '238', 10159 => '239', 10161 => '241', 10162 => '242', 10163 => '243', 10164 => '244', 10165 => '245', 10166 => '246', 10167 => '247', 10168 => '248', 10169 => '249', 10170 => '250', 10171 => '251', 10172 => '252', 10173 => '253', 10174 => '254'); diff --git a/dependencies/mpdf/mpdf/data/upperCase.php b/dependencies/mpdf/mpdf/data/upperCase.php deleted file mode 100644 index 301f4b0..0000000 --- a/dependencies/mpdf/mpdf/data/upperCase.php +++ /dev/null @@ -1,5 +0,0 @@ - 65, 98 => 66, 99 => 67, 100 => 68, 101 => 69, 102 => 70, 103 => 71, 104 => 72, 105 => 73, 106 => 74, 107 => 75, 108 => 76, 109 => 77, 110 => 78, 111 => 79, 112 => 80, 113 => 81, 114 => 82, 115 => 83, 116 => 84, 117 => 85, 118 => 86, 119 => 87, 120 => 88, 121 => 89, 122 => 90, 181 => 924, 224 => 192, 225 => 193, 226 => 194, 227 => 195, 228 => 196, 229 => 197, 230 => 198, 231 => 199, 232 => 200, 233 => 201, 234 => 202, 235 => 203, 236 => 204, 237 => 205, 238 => 206, 239 => 207, 240 => 208, 241 => 209, 242 => 210, 243 => 211, 244 => 212, 245 => 213, 246 => 214, 248 => 216, 249 => 217, 250 => 218, 251 => 219, 252 => 220, 253 => 221, 254 => 222, 255 => 376, 257 => 256, 259 => 258, 261 => 260, 263 => 262, 265 => 264, 267 => 266, 269 => 268, 271 => 270, 273 => 272, 275 => 274, 277 => 276, 279 => 278, 281 => 280, 283 => 282, 285 => 284, 287 => 286, 289 => 288, 291 => 290, 293 => 292, 295 => 294, 297 => 296, 299 => 298, 301 => 300, 303 => 302, 305 => 73, 307 => 306, 309 => 308, 311 => 310, 314 => 313, 316 => 315, 318 => 317, 320 => 319, 322 => 321, 324 => 323, 326 => 325, 328 => 327, 331 => 330, 333 => 332, 335 => 334, 337 => 336, 339 => 338, 341 => 340, 343 => 342, 345 => 344, 347 => 346, 349 => 348, 351 => 350, 353 => 352, 355 => 354, 357 => 356, 359 => 358, 361 => 360, 363 => 362, 365 => 364, 367 => 366, 369 => 368, 371 => 370, 373 => 372, 375 => 374, 378 => 377, 380 => 379, 382 => 381, 383 => 83, 384 => 579, 387 => 386, 389 => 388, 392 => 391, 396 => 395, 402 => 401, 405 => 502, 409 => 408, 410 => 573, 414 => 544, 417 => 416, 419 => 418, 421 => 420, 424 => 423, 429 => 428, 432 => 431, 436 => 435, 438 => 437, 441 => 440, 445 => 444, 447 => 503, 453 => 452, 454 => 452, 456 => 455, 457 => 455, 459 => 458, 460 => 458, 462 => 461, 464 => 463, 466 => 465, 468 => 467, 470 => 469, 472 => 471, 474 => 473, 476 => 475, 477 => 398, 479 => 478, 481 => 480, 483 => 482, 485 => 484, 487 => 486, 489 => 488, 491 => 490, 493 => 492, 495 => 494, 498 => 497, 499 => 497, 501 => 500, 505 => 504, 507 => 506, 509 => 508, 511 => 510, 513 => 512, 515 => 514, 517 => 516, 519 => 518, 521 => 520, 523 => 522, 525 => 524, 527 => 526, 529 => 528, 531 => 530, 533 => 532, 535 => 534, 537 => 536, 539 => 538, 541 => 540, 543 => 542, 547 => 546, 549 => 548, 551 => 550, 553 => 552, 555 => 554, 557 => 556, 559 => 558, 561 => 560, 563 => 562, 572 => 571, 575 => 11390, 576 => 11391, 578 => 577, 583 => 582, 585 => 584, 587 => 586, 589 => 588, 591 => 590, 592 => 11375, 593 => 11373, 594 => 11376, 595 => 385, 596 => 390, 598 => 393, 599 => 394, 601 => 399, 603 => 400, 608 => 403, 611 => 404, 616 => 407, 617 => 406, 619 => 11362, 623 => 412, 625 => 11374, 626 => 413, 629 => 415, 637 => 11364, 640 => 422, 643 => 425, 648 => 430, 649 => 580, 650 => 433, 651 => 434, 652 => 581, 658 => 439, 837 => 921, 881 => 880, 883 => 882, 887 => 886, 891 => 1021, 892 => 1022, 893 => 1023, 940 => 902, 941 => 904, 942 => 905, 943 => 906, 945 => 913, 946 => 914, 947 => 915, 948 => 916, 949 => 917, 950 => 918, 951 => 919, 952 => 920, 953 => 921, 954 => 922, 955 => 923, 956 => 924, 957 => 925, 958 => 926, 959 => 927, 960 => 928, 961 => 929, 962 => 931, 963 => 931, 964 => 932, 965 => 933, 966 => 934, 967 => 935, 968 => 936, 969 => 937, 970 => 938, 971 => 939, 972 => 908, 973 => 910, 974 => 911, 976 => 914, 977 => 920, 981 => 934, 982 => 928, 983 => 975, 985 => 984, 987 => 986, 989 => 988, 991 => 990, 993 => 992, 995 => 994, 997 => 996, 999 => 998, 1001 => 1000, 1003 => 1002, 1005 => 1004, 1007 => 1006, 1008 => 922, 1009 => 929, 1010 => 1017, 1013 => 917, 1016 => 1015, 1019 => 1018, 1072 => 1040, 1073 => 1041, 1074 => 1042, 1075 => 1043, 1076 => 1044, 1077 => 1045, 1078 => 1046, 1079 => 1047, 1080 => 1048, 1081 => 1049, 1082 => 1050, 1083 => 1051, 1084 => 1052, 1085 => 1053, 1086 => 1054, 1087 => 1055, 1088 => 1056, 1089 => 1057, 1090 => 1058, 1091 => 1059, 1092 => 1060, 1093 => 1061, 1094 => 1062, 1095 => 1063, 1096 => 1064, 1097 => 1065, 1098 => 1066, 1099 => 1067, 1100 => 1068, 1101 => 1069, 1102 => 1070, 1103 => 1071, 1104 => 1024, 1105 => 1025, 1106 => 1026, 1107 => 1027, 1108 => 1028, 1109 => 1029, 1110 => 1030, 1111 => 1031, 1112 => 1032, 1113 => 1033, 1114 => 1034, 1115 => 1035, 1116 => 1036, 1117 => 1037, 1118 => 1038, 1119 => 1039, 1121 => 1120, 1123 => 1122, 1125 => 1124, 1127 => 1126, 1129 => 1128, 1131 => 1130, 1133 => 1132, 1135 => 1134, 1137 => 1136, 1139 => 1138, 1141 => 1140, 1143 => 1142, 1145 => 1144, 1147 => 1146, 1149 => 1148, 1151 => 1150, 1153 => 1152, 1163 => 1162, 1165 => 1164, 1167 => 1166, 1169 => 1168, 1171 => 1170, 1173 => 1172, 1175 => 1174, 1177 => 1176, 1179 => 1178, 1181 => 1180, 1183 => 1182, 1185 => 1184, 1187 => 1186, 1189 => 1188, 1191 => 1190, 1193 => 1192, 1195 => 1194, 1197 => 1196, 1199 => 1198, 1201 => 1200, 1203 => 1202, 1205 => 1204, 1207 => 1206, 1209 => 1208, 1211 => 1210, 1213 => 1212, 1215 => 1214, 1218 => 1217, 1220 => 1219, 1222 => 1221, 1224 => 1223, 1226 => 1225, 1228 => 1227, 1230 => 1229, 1231 => 1216, 1233 => 1232, 1235 => 1234, 1237 => 1236, 1239 => 1238, 1241 => 1240, 1243 => 1242, 1245 => 1244, 1247 => 1246, 1249 => 1248, 1251 => 1250, 1253 => 1252, 1255 => 1254, 1257 => 1256, 1259 => 1258, 1261 => 1260, 1263 => 1262, 1265 => 1264, 1267 => 1266, 1269 => 1268, 1271 => 1270, 1273 => 1272, 1275 => 1274, 1277 => 1276, 1279 => 1278, 1281 => 1280, 1283 => 1282, 1285 => 1284, 1287 => 1286, 1289 => 1288, 1291 => 1290, 1293 => 1292, 1295 => 1294, 1297 => 1296, 1299 => 1298, 1301 => 1300, 1303 => 1302, 1305 => 1304, 1307 => 1306, 1309 => 1308, 1311 => 1310, 1313 => 1312, 1315 => 1314, 1317 => 1316, 1377 => 1329, 1378 => 1330, 1379 => 1331, 1380 => 1332, 1381 => 1333, 1382 => 1334, 1383 => 1335, 1384 => 1336, 1385 => 1337, 1386 => 1338, 1387 => 1339, 1388 => 1340, 1389 => 1341, 1390 => 1342, 1391 => 1343, 1392 => 1344, 1393 => 1345, 1394 => 1346, 1395 => 1347, 1396 => 1348, 1397 => 1349, 1398 => 1350, 1399 => 1351, 1400 => 1352, 1401 => 1353, 1402 => 1354, 1403 => 1355, 1404 => 1356, 1405 => 1357, 1406 => 1358, 1407 => 1359, 1408 => 1360, 1409 => 1361, 1410 => 1362, 1411 => 1363, 1412 => 1364, 1413 => 1365, 1414 => 1366, 7545 => 42877, 7549 => 11363, 7681 => 7680, 7683 => 7682, 7685 => 7684, 7687 => 7686, 7689 => 7688, 7691 => 7690, 7693 => 7692, 7695 => 7694, 7697 => 7696, 7699 => 7698, 7701 => 7700, 7703 => 7702, 7705 => 7704, 7707 => 7706, 7709 => 7708, 7711 => 7710, 7713 => 7712, 7715 => 7714, 7717 => 7716, 7719 => 7718, 7721 => 7720, 7723 => 7722, 7725 => 7724, 7727 => 7726, 7729 => 7728, 7731 => 7730, 7733 => 7732, 7735 => 7734, 7737 => 7736, 7739 => 7738, 7741 => 7740, 7743 => 7742, 7745 => 7744, 7747 => 7746, 7749 => 7748, 7751 => 7750, 7753 => 7752, 7755 => 7754, 7757 => 7756, 7759 => 7758, 7761 => 7760, 7763 => 7762, 7765 => 7764, 7767 => 7766, 7769 => 7768, 7771 => 7770, 7773 => 7772, 7775 => 7774, 7777 => 7776, 7779 => 7778, 7781 => 7780, 7783 => 7782, 7785 => 7784, 7787 => 7786, 7789 => 7788, 7791 => 7790, 7793 => 7792, 7795 => 7794, 7797 => 7796, 7799 => 7798, 7801 => 7800, 7803 => 7802, 7805 => 7804, 7807 => 7806, 7809 => 7808, 7811 => 7810, 7813 => 7812, 7815 => 7814, 7817 => 7816, 7819 => 7818, 7821 => 7820, 7823 => 7822, 7825 => 7824, 7827 => 7826, 7829 => 7828, 7835 => 7776, 7841 => 7840, 7843 => 7842, 7845 => 7844, 7847 => 7846, 7849 => 7848, 7851 => 7850, 7853 => 7852, 7855 => 7854, 7857 => 7856, 7859 => 7858, 7861 => 7860, 7863 => 7862, 7865 => 7864, 7867 => 7866, 7869 => 7868, 7871 => 7870, 7873 => 7872, 7875 => 7874, 7877 => 7876, 7879 => 7878, 7881 => 7880, 7883 => 7882, 7885 => 7884, 7887 => 7886, 7889 => 7888, 7891 => 7890, 7893 => 7892, 7895 => 7894, 7897 => 7896, 7899 => 7898, 7901 => 7900, 7903 => 7902, 7905 => 7904, 7907 => 7906, 7909 => 7908, 7911 => 7910, 7913 => 7912, 7915 => 7914, 7917 => 7916, 7919 => 7918, 7921 => 7920, 7923 => 7922, 7925 => 7924, 7927 => 7926, 7929 => 7928, 7931 => 7930, 7933 => 7932, 7935 => 7934, 7936 => 7944, 7937 => 7945, 7938 => 7946, 7939 => 7947, 7940 => 7948, 7941 => 7949, 7942 => 7950, 7943 => 7951, 7952 => 7960, 7953 => 7961, 7954 => 7962, 7955 => 7963, 7956 => 7964, 7957 => 7965, 7968 => 7976, 7969 => 7977, 7970 => 7978, 7971 => 7979, 7972 => 7980, 7973 => 7981, 7974 => 7982, 7975 => 7983, 7984 => 7992, 7985 => 7993, 7986 => 7994, 7987 => 7995, 7988 => 7996, 7989 => 7997, 7990 => 7998, 7991 => 7999, 8000 => 8008, 8001 => 8009, 8002 => 8010, 8003 => 8011, 8004 => 8012, 8005 => 8013, 8017 => 8025, 8019 => 8027, 8021 => 8029, 8023 => 8031, 8032 => 8040, 8033 => 8041, 8034 => 8042, 8035 => 8043, 8036 => 8044, 8037 => 8045, 8038 => 8046, 8039 => 8047, 8048 => 8122, 8049 => 8123, 8050 => 8136, 8051 => 8137, 8052 => 8138, 8053 => 8139, 8054 => 8154, 8055 => 8155, 8056 => 8184, 8057 => 8185, 8058 => 8170, 8059 => 8171, 8060 => 8186, 8061 => 8187, 8064 => 8072, 8065 => 8073, 8066 => 8074, 8067 => 8075, 8068 => 8076, 8069 => 8077, 8070 => 8078, 8071 => 8079, 8080 => 8088, 8081 => 8089, 8082 => 8090, 8083 => 8091, 8084 => 8092, 8085 => 8093, 8086 => 8094, 8087 => 8095, 8096 => 8104, 8097 => 8105, 8098 => 8106, 8099 => 8107, 8100 => 8108, 8101 => 8109, 8102 => 8110, 8103 => 8111, 8112 => 8120, 8113 => 8121, 8115 => 8124, 8126 => 921, 8131 => 8140, 8144 => 8152, 8145 => 8153, 8160 => 8168, 8161 => 8169, 8165 => 8172, 8179 => 8188, 8526 => 8498, 8560 => 8544, 8561 => 8545, 8562 => 8546, 8563 => 8547, 8564 => 8548, 8565 => 8549, 8566 => 8550, 8567 => 8551, 8568 => 8552, 8569 => 8553, 8570 => 8554, 8571 => 8555, 8572 => 8556, 8573 => 8557, 8574 => 8558, 8575 => 8559, 8580 => 8579, 9424 => 9398, 9425 => 9399, 9426 => 9400, 9427 => 9401, 9428 => 9402, 9429 => 9403, 9430 => 9404, 9431 => 9405, 9432 => 9406, 9433 => 9407, 9434 => 9408, 9435 => 9409, 9436 => 9410, 9437 => 9411, 9438 => 9412, 9439 => 9413, 9440 => 9414, 9441 => 9415, 9442 => 9416, 9443 => 9417, 9444 => 9418, 9445 => 9419, 9446 => 9420, 9447 => 9421, 9448 => 9422, 9449 => 9423, 11312 => 11264, 11313 => 11265, 11314 => 11266, 11315 => 11267, 11316 => 11268, 11317 => 11269, 11318 => 11270, 11319 => 11271, 11320 => 11272, 11321 => 11273, 11322 => 11274, 11323 => 11275, 11324 => 11276, 11325 => 11277, 11326 => 11278, 11327 => 11279, 11328 => 11280, 11329 => 11281, 11330 => 11282, 11331 => 11283, 11332 => 11284, 11333 => 11285, 11334 => 11286, 11335 => 11287, 11336 => 11288, 11337 => 11289, 11338 => 11290, 11339 => 11291, 11340 => 11292, 11341 => 11293, 11342 => 11294, 11343 => 11295, 11344 => 11296, 11345 => 11297, 11346 => 11298, 11347 => 11299, 11348 => 11300, 11349 => 11301, 11350 => 11302, 11351 => 11303, 11352 => 11304, 11353 => 11305, 11354 => 11306, 11355 => 11307, 11356 => 11308, 11357 => 11309, 11358 => 11310, 11361 => 11360, 11365 => 570, 11366 => 574, 11368 => 11367, 11370 => 11369, 11372 => 11371, 11379 => 11378, 11382 => 11381, 11393 => 11392, 11395 => 11394, 11397 => 11396, 11399 => 11398, 11401 => 11400, 11403 => 11402, 11405 => 11404, 11407 => 11406, 11409 => 11408, 11411 => 11410, 11413 => 11412, 11415 => 11414, 11417 => 11416, 11419 => 11418, 11421 => 11420, 11423 => 11422, 11425 => 11424, 11427 => 11426, 11429 => 11428, 11431 => 11430, 11433 => 11432, 11435 => 11434, 11437 => 11436, 11439 => 11438, 11441 => 11440, 11443 => 11442, 11445 => 11444, 11447 => 11446, 11449 => 11448, 11451 => 11450, 11453 => 11452, 11455 => 11454, 11457 => 11456, 11459 => 11458, 11461 => 11460, 11463 => 11462, 11465 => 11464, 11467 => 11466, 11469 => 11468, 11471 => 11470, 11473 => 11472, 11475 => 11474, 11477 => 11476, 11479 => 11478, 11481 => 11480, 11483 => 11482, 11485 => 11484, 11487 => 11486, 11489 => 11488, 11491 => 11490, 11500 => 11499, 11502 => 11501, 11520 => 4256, 11521 => 4257, 11522 => 4258, 11523 => 4259, 11524 => 4260, 11525 => 4261, 11526 => 4262, 11527 => 4263, 11528 => 4264, 11529 => 4265, 11530 => 4266, 11531 => 4267, 11532 => 4268, 11533 => 4269, 11534 => 4270, 11535 => 4271, 11536 => 4272, 11537 => 4273, 11538 => 4274, 11539 => 4275, 11540 => 4276, 11541 => 4277, 11542 => 4278, 11543 => 4279, 11544 => 4280, 11545 => 4281, 11546 => 4282, 11547 => 4283, 11548 => 4284, 11549 => 4285, 11550 => 4286, 11551 => 4287, 11552 => 4288, 11553 => 4289, 11554 => 4290, 11555 => 4291, 11556 => 4292, 11557 => 4293, 42561 => 42560, 42563 => 42562, 42565 => 42564, 42567 => 42566, 42569 => 42568, 42571 => 42570, 42573 => 42572, 42575 => 42574, 42577 => 42576, 42579 => 42578, 42581 => 42580, 42583 => 42582, 42585 => 42584, 42587 => 42586, 42589 => 42588, 42591 => 42590, 42595 => 42594, 42597 => 42596, 42599 => 42598, 42601 => 42600, 42603 => 42602, 42605 => 42604, 42625 => 42624, 42627 => 42626, 42629 => 42628, 42631 => 42630, 42633 => 42632, 42635 => 42634, 42637 => 42636, 42639 => 42638, 42641 => 42640, 42643 => 42642, 42645 => 42644, 42647 => 42646, 42787 => 42786, 42789 => 42788, 42791 => 42790, 42793 => 42792, 42795 => 42794, 42797 => 42796, 42799 => 42798, 42803 => 42802, 42805 => 42804, 42807 => 42806, 42809 => 42808, 42811 => 42810, 42813 => 42812, 42815 => 42814, 42817 => 42816, 42819 => 42818, 42821 => 42820, 42823 => 42822, 42825 => 42824, 42827 => 42826, 42829 => 42828, 42831 => 42830, 42833 => 42832, 42835 => 42834, 42837 => 42836, 42839 => 42838, 42841 => 42840, 42843 => 42842, 42845 => 42844, 42847 => 42846, 42849 => 42848, 42851 => 42850, 42853 => 42852, 42855 => 42854, 42857 => 42856, 42859 => 42858, 42861 => 42860, 42863 => 42862, 42874 => 42873, 42876 => 42875, 42879 => 42878, 42881 => 42880, 42883 => 42882, 42885 => 42884, 42887 => 42886, 42892 => 42891); diff --git a/dependencies/mpdf/mpdf/phpunit.xml b/dependencies/mpdf/mpdf/phpunit.xml deleted file mode 100644 index db24e9f..0000000 --- a/dependencies/mpdf/mpdf/phpunit.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - ./tests - - - - - - src - - - - - - - - diff --git a/dependencies/mpdf/mpdf/ruleset.xml b/dependencies/mpdf/mpdf/ruleset.xml deleted file mode 100644 index e70f872..0000000 --- a/dependencies/mpdf/mpdf/ruleset.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - PSR2 with tabs instead of spaces. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/mpdf/mpdf/src/AssetFetcher.php b/dependencies/mpdf/mpdf/src/AssetFetcher.php deleted file mode 100644 index a206ac1..0000000 --- a/dependencies/mpdf/mpdf/src/AssetFetcher.php +++ /dev/null @@ -1,88 +0,0 @@ -mpdf = $mpdf; - $this->contentLoader = $contentLoader; - $this->http = $http; - $this->logger = $logger; - } - public function fetchDataFromPath($path, $originalSrc = null) - { - /** - * Prevents insecure PHP object injection through phar:// wrapper - * @see https://github.com/mpdf/mpdf/issues/949 - * @see https://github.com/mpdf/mpdf/issues/1381 - */ - $wrapperChecker = new StreamWrapperChecker($this->mpdf); - if ($wrapperChecker->hasBlacklistedStreamWrapper($path)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\AssetFetchingException('File contains an invalid stream. Only ' . \implode(', ', $wrapperChecker->getWhitelistedStreamWrappers()) . ' streams are allowed.'); - } - if ($originalSrc && $wrapperChecker->hasBlacklistedStreamWrapper($originalSrc)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\AssetFetchingException('File contains an invalid stream. Only ' . \implode(', ', $wrapperChecker->getWhitelistedStreamWrappers()) . ' streams are allowed.'); - } - $this->mpdf->GetFullPath($path); - return $this->isPathLocal($path) || $originalSrc !== null && $this->isPathLocal($originalSrc) ? $this->fetchLocalContent($path, $originalSrc) : $this->fetchRemoteContent($path); - } - public function fetchLocalContent($path, $originalSrc) - { - $data = ''; - if ($originalSrc && $this->mpdf->basepathIsLocal && ($check = @\fopen($originalSrc, 'rb'))) { - \fclose($check); - $path = $originalSrc; - $this->logger->debug(\sprintf('Fetching content of file "%s" with local basepath', $path), ['context' => LogContext::REMOTE_CONTENT]); - return $this->contentLoader->load($path); - } - if ($path && ($check = @\fopen($path, 'rb'))) { - \fclose($check); - $this->logger->debug(\sprintf('Fetching content of file "%s" with non-local basepath', $path), ['context' => LogContext::REMOTE_CONTENT]); - return $this->contentLoader->load($path); - } - return $data; - } - public function fetchRemoteContent($path) - { - $data = ''; - try { - $this->logger->debug(\sprintf('Fetching remote content of file "%s"', $path), ['context' => LogContext::REMOTE_CONTENT]); - /** @var \Mpdf\PsrHttpMessageShim\Response $response */ - $response = $this->http->sendRequest(new Request('GET', $path)); - if ($response->getStatusCode() !== 200) { - $message = \sprintf('Non-OK HTTP response "%s" on fetching remote content "%s" because of an error', $response->getStatusCode(), $path); - if ($this->mpdf->debug) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException($message); - } - $this->logger->info($message); - return $data; - } - $data = $response->getBody()->getContents(); - } catch (\InvalidArgumentException $e) { - $message = \sprintf('Unable to fetch remote content "%s" because of an error "%s"', $path, $e->getMessage()); - if ($this->mpdf->debug) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException($message, 0, \E_ERROR, null, null, $e); - } - $this->logger->warning($message); - } - return $data; - } - public function isPathLocal($path) - { - return \str_starts_with($path, 'file://') || \strpos($path, '://') === \false; - // @todo More robust implementation - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode.php b/dependencies/mpdf/mpdf/src/Barcode.php deleted file mode 100644 index f09b335..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode.php +++ /dev/null @@ -1,159 +0,0 @@ -getBarcode($code, $type, $pr, $quiet_zone_left, $quiet_zone_right); - return $barcode ? $barcode->getData() : \false; - } - public function getChecksum($code, $type) - { - $barcode = $this->getBarcode($code, $type); - return $barcode ? $barcode->getChecksum() : \false; - } - /** - * @param string $code - * @param string $type - * @param float $pr - * - * @return \Mpdf\Barcode\BarcodeInterface - */ - public function getBarcode($code, $type, $pr = 0.0, $quiet_zone_left = null, $quiet_zone_right = null) - { - switch (\strtoupper($type)) { - case 'ISBN': - case 'ISSN': - case 'EAN13': - // EAN 13 - return new Barcode\EanUpc($code, 13, 11, 7, 0.33, 25.93); - case 'UPCA': - // UPC-A - return new Barcode\EanUpc($code, 12, 9, 9, 0.33, 25.91); - case 'UPCE': - // UPC-E - return new Barcode\EanUpc($code, 6, 9, 7, 0.33, 25.93); - case 'EAN8': - // EAN 8 - return new Barcode\EanUpc($code, 8, 7, 7, 0.33, 21.64); - case 'EAN2': - // 2-Digits UPC-Based Extention - return new Barcode\EanExt($code, 2, 7, 7, 0.33, 20, 9); - case 'EAN5': - // 5-Digits UPC-Based Extention - return new Barcode\EanExt($code, 5, 7, 7, 0.33, 20, 9); - case 'IMB': - // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 - $xdim = 0.508; - // Nominal value for X-dim (bar width) in mm (spec.) - $bpi = 22; - // Bars per inch - return new Barcode\Imb($code, $xdim, (25.4 / $bpi - $xdim) / $xdim, ['D' => 2, 'A' => 2, 'F' => 3, 'T' => 1]); - case 'RM4SCC': - // RM4SCC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - $xdim = 0.508; - // Nominal value for X-dim (bar width) in mm (spec.) - $bpi = 22; - // Bars per inch - return new Barcode\Rm4Scc($code, $xdim, (25.4 / $bpi - $xdim) / $xdim, ['D' => 5, 'A' => 5, 'F' => 8, 'T' => 2]); - case 'KIX': - // KIX (Klant index - Customer index) - $xdim = 0.508; - // Nominal value for X-dim (bar width) in mm (spec.) - $bpi = 22; - // Bars per inch - return new Barcode\Rm4Scc($code, $xdim, (25.4 / $bpi - $xdim) / $xdim, ['D' => 5, 'A' => 5, 'F' => 8, 'T' => 2], \true); - case 'POSTNET': - // POSTNET - $xdim = 0.508; - // Nominal value for X-dim (bar width) in mm (spec.) - $bpi = 22; - // Bars per inch - return new Barcode\Postnet($code, $xdim, (25.4 / $bpi - $xdim) / $xdim, \false); - case 'PLANET': - // PLANET - $xdim = 0.508; - // Nominal value for X-dim (bar width) in mm (spec.) - $bpi = 22; - // Bars per inch - return new Barcode\Postnet($code, $xdim, (25.4 / $bpi - $xdim) / $xdim, \true); - case 'C93': - // CODE 93 - USS-93 - return new Barcode\Code93($code, $quiet_zone_left, $quiet_zone_right); - case 'CODE11': - // CODE 11 - return new Barcode\Code11($code, $pr > 0 ? $pr : 3, $quiet_zone_left, $quiet_zone_right); - case 'MSI': - // MSI (Variation of Plessey code) - return new Barcode\Msi($code, \false, $quiet_zone_left, $quiet_zone_right); - case 'MSI+': - // MSI + CHECKSUM (modulo 11) - return new Barcode\Msi($code, \true, $quiet_zone_left, $quiet_zone_right); - case 'CODABAR': - // CODABAR - return new Barcode\Codabar($code, $pr > 0 ? $pr : 2.5, $quiet_zone_left, $quiet_zone_right); - case 'C128A': - // CODE 128 A - return new Barcode\Code128($code, 'A', \false, $quiet_zone_left, $quiet_zone_right); - case 'C128B': - // CODE 128 B - return new Barcode\Code128($code, 'B', \false, $quiet_zone_left, $quiet_zone_right); - case 'C128C': - // CODE 128 C - return new Barcode\Code128($code, 'C', \false, $quiet_zone_left, $quiet_zone_right); - case 'C128RAW': - // CODE 128 RAW -- code is a space separated list of codes with startcode but without checkdigit,stop,end ex: "105 12 34" - return new Barcode\Code128($code, 'RAW', \false, $quiet_zone_left, $quiet_zone_right); - case 'EAN128A': - // EAN 128 A - return new Barcode\Code128($code, 'A', \true, $quiet_zone_left, $quiet_zone_right); - case 'EAN128B': - // EAN 128 B - return new Barcode\Code128($code, 'B', \true, $quiet_zone_left, $quiet_zone_right); - case 'EAN128C': - // EAN 128 C - return new Barcode\Code128($code, 'C', \true, $quiet_zone_left, $quiet_zone_right); - case 'C39': - // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. - return new Barcode\Code39($this->sanitizeCode($code), $pr > 0 ? $pr : 2.5, \false, \false, $quiet_zone_left, $quiet_zone_right); - case 'C39+': - // CODE 39 with checksum - return new Barcode\Code39($this->sanitizeCode($code), $pr > 0 ? $pr : 2.5, \false, \true, $quiet_zone_left, $quiet_zone_right); - case 'C39E': - // CODE 39 EXTENDED - return new Barcode\Code39($this->sanitizeCode($code), $pr > 0 ? $pr : 2.5, \true, \false, $quiet_zone_left, $quiet_zone_right); - case 'C39E+': - // CODE 39 EXTENDED + CHECKSUM - return new Barcode\Code39($this->sanitizeCode($code), $pr > 0 ? $pr : 2.5, \true, \true, $quiet_zone_left, $quiet_zone_right); - case 'S25': - // Standard 2 of 5 - return new Barcode\S25($code, \false, $quiet_zone_left, $quiet_zone_right); - case 'S25+': - // Standard 2 of 5 + CHECKSUM - return new Barcode\S25($code, \true, $quiet_zone_left, $quiet_zone_right); - case 'I25': - // Interleaved 2 of 5 - return new Barcode\I25($code, 0, $pr > 0 ? $pr : 2.5, \false, $quiet_zone_left, $quiet_zone_right); - case 'I25+': - // Interleaved 2 of 5 + CHECKSUM - return new Barcode\I25($code, 0, $pr > 0 ? $pr : 2.5, \true, $quiet_zone_left, $quiet_zone_right); - case 'I25B': - // Interleaved 2 of 5 + Bearer bars - return new Barcode\I25($code, 2, $pr > 0 ? $pr : 2.5, \false, $quiet_zone_left, $quiet_zone_right); - case 'I25B+': - // Interleaved 2 of 5 + CHECKSUM + Bearer bars - return new Barcode\I25($code, 2, $pr > 0 ? $pr : 2.5, \true, $quiet_zone_left, $quiet_zone_right); - } - return \false; - } - private function sanitizeCode($code) - { - $code = \str_replace(\chr(194) . \chr(160), ' ', $code); - // mPDF 5.3.95 (for utf-8 encoded) - $code = \str_replace(\chr(160), ' ', $code); - // mPDF 5.3.95 (for win-1252) - return $code; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/AbstractBarcode.php b/dependencies/mpdf/mpdf/src/Barcode/AbstractBarcode.php deleted file mode 100644 index 50adecb..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/AbstractBarcode.php +++ /dev/null @@ -1,65 +0,0 @@ -data; - } - /** - * @param string $key - * - * @return mixed - */ - public function getKey($key) - { - return isset($this->data[$key]) ? $this->data[$key] : null; - } - /** - * @return string - */ - public function getChecksum() - { - return $this->getKey('checkdigit'); - } - /** - * Convert binary barcode sequence to barcode array - * - * @param string $seq - * @param mixed[] $barcodeData - * - * @return mixed[] - */ - protected function binseqToArray($seq, array $barcodeData) - { - $len = \strlen($seq); - $w = 0; - $k = 0; - for ($i = 0; $i < $len; ++$i) { - $w += 1; - if ($i == $len - 1 or $i < $len - 1 and $seq[$i] != $seq[$i + 1]) { - if ($seq[$i] == '1') { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $barcodeData['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $barcodeData['maxw'] += $w; - ++$k; - $w = 0; - } - } - return $barcodeData; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/BarcodeException.php b/dependencies/mpdf/mpdf/src/Barcode/BarcodeException.php deleted file mode 100644 index 755a3c5..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/BarcodeException.php +++ /dev/null @@ -1,7 +0,0 @@ -init($code, $printRatio); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - * @param float $printRatio - */ - private function init($code, $printRatio) - { - $chr = ['0' => '11111221', '1' => '11112211', '2' => '11121121', '3' => '22111111', '4' => '11211211', '5' => '21111211', '6' => '12111121', '7' => '12112111', '8' => '12211111', '9' => '21121111', '-' => '11122111', '$' => '11221111', ':' => '21112121', '/' => '21211121', '.' => '21212111', '+' => '11222221', 'A' => '11221211', 'B' => '12121121', 'C' => '11121221', 'D' => '11122211']; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $k = 0; - $code = \strtoupper($code); - $len = \strlen($code); - for ($i = 0; $i < $len; ++$i) { - if (!isset($chr[$code[$i]])) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in CODABAR barcode value "%s"', $code[$i], $code)); - } - $seq = $chr[$code[$i]]; - for ($j = 0; $j < 8; ++$j) { - if ($j % 2 == 0) { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $x = $seq[$j]; - if ($x == 2) { - $w = $printRatio; - } else { - $w = 1; - } - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - } - } - $this->data = $bararray; - } - public function getType() - { - return 'CODABAR'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Code11.php b/dependencies/mpdf/mpdf/src/Barcode/Code11.php deleted file mode 100644 index 66a5823..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Code11.php +++ /dev/null @@ -1,109 +0,0 @@ -init($code, $printRatio); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - * @param float $printRatio - */ - private function init($code, $printRatio) - { - $chr = ['0' => '111121', '1' => '211121', '2' => '121121', '3' => '221111', '4' => '112121', '5' => '212111', '6' => '122111', '7' => '111221', '8' => '211211', '9' => '211111', '-' => '112111', 'S' => '112211']; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $k = 0; - $len = \strlen($code); - // calculate check digit C - $p = 1; - $check = 0; - for ($i = $len - 1; $i >= 0; --$i) { - $digit = $code[$i]; - if ($digit == '-') { - $dval = 10; - } else { - $dval = (int) $digit; - } - $check += $dval * $p; - ++$p; - if ($p > 10) { - $p = 1; - } - } - $check %= 11; - if ($check == 10) { - $check = '-'; - } - $code .= $check; - $checkdigit = $check; - if ($len > 10) { - // calculate check digit K - $p = 1; - $check = 0; - for ($i = $len; $i >= 0; --$i) { - $digit = $code[$i]; - if ($digit == '-') { - $dval = 10; - } else { - $dval = (int) $digit; - } - $check += $dval * $p; - ++$p; - if ($p > 9) { - $p = 1; - } - } - $check %= 11; - $code .= $check; - $checkdigit .= $check; - ++$len; - } - $code = 'S' . $code . 'S'; - $len += 3; - for ($i = 0; $i < $len; ++$i) { - if (!isset($chr[$code[$i]])) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in CODE11 barcode value "%s"', $code[$i], $code)); - } - $seq = $chr[$code[$i]]; - for ($j = 0; $j < 6; ++$j) { - $t = $j % 2 === 0; - $x = $seq[$j]; - $w = $x == 2 ? $printRatio : 1; - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - } - } - $bararray['checkdigit'] = $checkdigit; - $this->data = $bararray; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'CODE11'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Code128.php b/dependencies/mpdf/mpdf/src/Barcode/Code128.php deleted file mode 100644 index f60665b..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Code128.php +++ /dev/null @@ -1,378 +0,0 @@ -init($code, $type, $ean); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - * @param string $type - * @param bool $ean - */ - protected function init($code, $type, $ean) - { - $code = UtfString::strcode2utf($code); - // mPDF 5.7.1 Allows e.g. - $chr = [ - '212222', - /* 00 */ - '222122', - /* 01 */ - '222221', - /* 02 */ - '121223', - /* 03 */ - '121322', - /* 04 */ - '131222', - /* 05 */ - '122213', - /* 06 */ - '122312', - /* 07 */ - '132212', - /* 08 */ - '221213', - /* 09 */ - '221312', - /* 10 */ - '231212', - /* 11 */ - '112232', - /* 12 */ - '122132', - /* 13 */ - '122231', - /* 14 */ - '113222', - /* 15 */ - '123122', - /* 16 */ - '123221', - /* 17 */ - '223211', - /* 18 */ - '221132', - /* 19 */ - '221231', - /* 20 */ - '213212', - /* 21 */ - '223112', - /* 22 */ - '312131', - /* 23 */ - '311222', - /* 24 */ - '321122', - /* 25 */ - '321221', - /* 26 */ - '312212', - /* 27 */ - '322112', - /* 28 */ - '322211', - /* 29 */ - '212123', - /* 30 */ - '212321', - /* 31 */ - '232121', - /* 32 */ - '111323', - /* 33 */ - '131123', - /* 34 */ - '131321', - /* 35 */ - '112313', - /* 36 */ - '132113', - /* 37 */ - '132311', - /* 38 */ - '211313', - /* 39 */ - '231113', - /* 40 */ - '231311', - /* 41 */ - '112133', - /* 42 */ - '112331', - /* 43 */ - '132131', - /* 44 */ - '113123', - /* 45 */ - '113321', - /* 46 */ - '133121', - /* 47 */ - '313121', - /* 48 */ - '211331', - /* 49 */ - '231131', - /* 50 */ - '213113', - /* 51 */ - '213311', - /* 52 */ - '213131', - /* 53 */ - '311123', - /* 54 */ - '311321', - /* 55 */ - '331121', - /* 56 */ - '312113', - /* 57 */ - '312311', - /* 58 */ - '332111', - /* 59 */ - '314111', - /* 60 */ - '221411', - /* 61 */ - '431111', - /* 62 */ - '111224', - /* 63 */ - '111422', - /* 64 */ - '121124', - /* 65 */ - '121421', - /* 66 */ - '141122', - /* 67 */ - '141221', - /* 68 */ - '112214', - /* 69 */ - '112412', - /* 70 */ - '122114', - /* 71 */ - '122411', - /* 72 */ - '142112', - /* 73 */ - '142211', - /* 74 */ - '241211', - /* 75 */ - '221114', - /* 76 */ - '413111', - /* 77 */ - '241112', - /* 78 */ - '134111', - /* 79 */ - '111242', - /* 80 */ - '121142', - /* 81 */ - '121241', - /* 82 */ - '114212', - /* 83 */ - '124112', - /* 84 */ - '124211', - /* 85 */ - '411212', - /* 86 */ - '421112', - /* 87 */ - '421211', - /* 88 */ - '212141', - /* 89 */ - '214121', - /* 90 */ - '412121', - /* 91 */ - '111143', - /* 92 */ - '111341', - /* 93 */ - '131141', - /* 94 */ - '114113', - /* 95 */ - '114311', - /* 96 */ - '411113', - /* 97 */ - '411311', - /* 98 */ - '113141', - /* 99 */ - '114131', - /* 100 */ - '311141', - /* 101 */ - '411131', - /* 102 */ - '211412', - /* 103 START A */ - '211214', - /* 104 START B */ - '211232', - /* 105 START C */ - '233111', - /* STOP */ - '200000', - ]; - switch (\strtoupper($type)) { - case 'RAW': - $newCode = ''; - $startid = \false; - foreach (\explode(" ", $code) as $v) { - if (\is_numeric($v) && \round($v, 0) == $v) { - if ($v >= 0 && $v <= 105) { - if ($startid === \false) { - $startid = $v; - } else { - $newCode .= \chr($v); - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE128RAW barcode value "%s". 0-105 needed', $code)); - } - } else { - //double spaces generates empty $v any other is not allowed - if ($v != '') { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE128RAW barcode value "%s". 0-105 needed', $code)); - } - } - } - if ($startid < 103 || $startid > 105) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE128RAW startid value "%s". Must be 103, 104 or 105 (for A, B or C)', $startid)); - } - $keys = ''; - for ($i = 0; $i <= 105; ++$i) { - $keys .= \chr($i); - } - $code = $newCode; - break; - case 'A': - $startid = 103; - $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'; - for ($i = 0; $i < 32; ++$i) { - $keys .= \chr($i); - } - break; - case 'B': - $startid = 104; - $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~' . \chr(127); - break; - case 'C': - $startid = 105; - $keys = ''; - if (\strlen($code) % 2 != 0) { - // The length of barcode value must be even ($code). You must pad the number with zeros - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException('Invalid CODE128C barcode value'); - } - for ($i = 0; $i <= 99; ++$i) { - $keys .= \chr($i); - } - $newCode = ''; - $hclen = \strlen($code) / 2; - for ($i = 0; $i < $hclen; ++$i) { - if ($code[2 * $i] < "0" || $code[2 * $i] > "9" || $code[2 * $i + 1] < "0" || $code[2 * $i + 1] > "9") { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in CODE128C barcode value "%s"', $code[$i], $code)); - } - $newCode .= \chr((int) ($code[2 * $i] . $code[2 * $i + 1])); - } - $code = $newCode; - break; - default: - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE128 barcode type "%s"', $type)); - } - // calculate check character - $sum = $startid; - // Add FNC 1 - which identifies it as EAN-128 - if ($ean) { - $code = \chr(102) . $code; - } - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - if ($ean && $i == 0) { - $sum += 102; - } else { - if (\strpos($keys, $code[$i]) === \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in CODE128%s barcode value "%s"', $code[$i], $type, $code)); - } - $sum += \strpos($keys, $code[$i]) * ($i + 1); - } - } - $check = $sum % 103; - $checkdigit = $check; - // add start, check and stop codes - $code = \chr($startid) . $code . \chr($check) . \chr(106) . \chr(107); - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $k = 0; - $len = \strlen($code); - for ($i = 0; $i < $len; ++$i) { - $ck = \strpos($keys, $code[$i]); - if ($i == 0 || ($ean && $i == 1) | $i > $len - 4) { - $char_num = \ord($code[$i]); - $seq = $chr[$char_num]; - } elseif ($ck >= 0 && isset($chr[$ck])) { - $seq = $chr[$ck]; - } else { - // invalid character - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in CODE128C barcode value "%s"', $code[$i], $code)); - } - for ($j = 0; $j < 6; ++$j) { - if ($j % 2 == 0) { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $w = $seq[$j]; - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - } - } - $bararray['checkdigit'] = $checkdigit; - $this->data = $bararray; - } - public function getType() - { - return 'CODE128'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Code39.php b/dependencies/mpdf/mpdf/src/Barcode/Code39.php deleted file mode 100644 index 65f5da4..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Code39.php +++ /dev/null @@ -1,135 +0,0 @@ -init($code, $printRatio, $extended, $checksum); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - * @param float $printRatio - * @param bool $extended - * @param bool $checksum - * - * @return mixed[] - */ - private function init($code, $printRatio, $extended, $checksum) - { - $chr = ['0' => '111221211', '1' => '211211112', '2' => '112211112', '3' => '212211111', '4' => '111221112', '5' => '211221111', '6' => '112221111', '7' => '111211212', '8' => '211211211', '9' => '112211211', 'A' => '211112112', 'B' => '112112112', 'C' => '212112111', 'D' => '111122112', 'E' => '211122111', 'F' => '112122111', 'G' => '111112212', 'H' => '211112211', 'I' => '112112211', 'J' => '111122211', 'K' => '211111122', 'L' => '112111122', 'M' => '212111121', 'N' => '111121122', 'O' => '211121121', 'P' => '112121121', 'Q' => '111111222', 'R' => '211111221', 'S' => '112111221', 'T' => '111121221', 'U' => '221111112', 'V' => '122111112', 'W' => '222111111', 'X' => '121121112', 'Y' => '221121111', 'Z' => '122121111', '-' => '121111212', '.' => '221111211', ' ' => '122111211', '$' => '121212111', '/' => '121211121', '+' => '121112121', '%' => '111212121', '*' => '121121211']; - $code = \strtoupper($code); - $checkdigit = ''; - if ($extended) { - // extended mode - $code = $this->encodeExt($code); - } - if ($code === \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE39 barcode value "%s"', $code)); - } - if ($checksum) { - // checksum - $checkdigit = $this->checksum($code); - $code .= $checkdigit; - } - // add star$this->>datat and stop codes - $code = '*' . $code . '*'; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $k = 0; - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $char = $code[$i]; - if (!isset($chr[$char])) { - // invalid character - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE39 barcode value "%s"', $code)); - } - for ($j = 0; $j < 9; ++$j) { - if ($j % 2 == 0) { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $x = $chr[$char][$j]; - if ($x == 2) { - $w = $printRatio; - } else { - $w = 1; - } - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - } - $bararray['bcode'][$k] = ['t' => \false, 'w' => 1, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += 1; - ++$k; - } - $bararray['checkdigit'] = $checkdigit; - $this->data = $bararray; - } - /** - * Encode a string to be used for CODE 39 Extended mode. - * - * @param string $code - * @return string - */ - protected function encodeExt($code) - { - $encode = [\chr(0) => '%U', \chr(1) => '$A', \chr(2) => '$B', \chr(3) => '$C', \chr(4) => '$D', \chr(5) => '$E', \chr(6) => '$F', \chr(7) => '$G', \chr(8) => '$H', \chr(9) => '$I', \chr(10) => '$J', \chr(11) => '£K', \chr(12) => '$L', \chr(13) => '$M', \chr(14) => '$N', \chr(15) => '$O', \chr(16) => '$P', \chr(17) => '$Q', \chr(18) => '$R', \chr(19) => '$S', \chr(20) => '$T', \chr(21) => '$U', \chr(22) => '$V', \chr(23) => '$W', \chr(24) => '$X', \chr(25) => '$Y', \chr(26) => '$Z', \chr(27) => '%A', \chr(28) => '%B', \chr(29) => '%C', \chr(30) => '%D', \chr(31) => '%E', \chr(32) => ' ', \chr(33) => '/A', \chr(34) => '/B', \chr(35) => '/C', \chr(36) => '/D', \chr(37) => '/E', \chr(38) => '/F', \chr(39) => '/G', \chr(40) => '/H', \chr(41) => '/I', \chr(42) => '/J', \chr(43) => '/K', \chr(44) => '/L', \chr(45) => '-', \chr(46) => '.', \chr(47) => '/O', \chr(48) => '0', \chr(49) => '1', \chr(50) => '2', \chr(51) => '3', \chr(52) => '4', \chr(53) => '5', \chr(54) => '6', \chr(55) => '7', \chr(56) => '8', \chr(57) => '9', \chr(58) => '/Z', \chr(59) => '%F', \chr(60) => '%G', \chr(61) => '%H', \chr(62) => '%I', \chr(63) => '%J', \chr(64) => '%V', \chr(65) => 'A', \chr(66) => 'B', \chr(67) => 'C', \chr(68) => 'D', \chr(69) => 'E', \chr(70) => 'F', \chr(71) => 'G', \chr(72) => 'H', \chr(73) => 'I', \chr(74) => 'J', \chr(75) => 'K', \chr(76) => 'L', \chr(77) => 'M', \chr(78) => 'N', \chr(79) => 'O', \chr(80) => 'P', \chr(81) => 'Q', \chr(82) => 'R', \chr(83) => 'S', \chr(84) => 'T', \chr(85) => 'U', \chr(86) => 'V', \chr(87) => 'W', \chr(88) => 'X', \chr(89) => 'Y', \chr(90) => 'Z', \chr(91) => '%K', \chr(92) => '%L', \chr(93) => '%M', \chr(94) => '%N', \chr(95) => '%O', \chr(96) => '%W', \chr(97) => '+A', \chr(98) => '+B', \chr(99) => '+C', \chr(100) => '+D', \chr(101) => '+E', \chr(102) => '+F', \chr(103) => '+G', \chr(104) => '+H', \chr(105) => '+I', \chr(106) => '+J', \chr(107) => '+K', \chr(108) => '+L', \chr(109) => '+M', \chr(110) => '+N', \chr(111) => '+O', \chr(112) => '+P', \chr(113) => '+Q', \chr(114) => '+R', \chr(115) => '+S', \chr(116) => '+T', \chr(117) => '+U', \chr(118) => '+V', \chr(119) => '+W', \chr(120) => '+X', \chr(121) => '+Y', \chr(122) => '+Z', \chr(123) => '%P', \chr(124) => '%Q', \chr(125) => '%R', \chr(126) => '%S', \chr(127) => '%T']; - $code_ext = ''; - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - if (\ord($code[$i]) > 127) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE39 barcode value "%s"', $code)); - } - $code_ext .= $encode[$code[$i]]; - } - return $code_ext; - } - /** - * Calculate CODE 39 checksum (modulo 43). - * - * @param string $code - * @return string mixed - */ - protected function checksum($code) - { - $chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%']; - $sum = 0; - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $k = \array_keys($chars, $code[$i]); - $sum += $k[0]; - } - $j = $sum % 43; - return $chars[$j]; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'CODE39'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Code93.php b/dependencies/mpdf/mpdf/src/Barcode/Code93.php deleted file mode 100644 index 9ffcb67..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Code93.php +++ /dev/null @@ -1,222 +0,0 @@ -init($code); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - */ - private function init($code) - { - $chr = [ - 48 => '131112', - // 0 - 49 => '111213', - // 1 - 50 => '111312', - // 2 - 51 => '111411', - // 3 - 52 => '121113', - // 4 - 53 => '121212', - // 5 - 54 => '121311', - // 6 - 55 => '111114', - // 7 - 56 => '131211', - // 8 - 57 => '141111', - // 9 - 65 => '211113', - // A - 66 => '211212', - // B - 67 => '211311', - // C - 68 => '221112', - // D - 69 => '221211', - // E - 70 => '231111', - // F - 71 => '112113', - // G - 72 => '112212', - // H - 73 => '112311', - // I - 74 => '122112', - // J - 75 => '132111', - // K - 76 => '111123', - // L - 77 => '111222', - // M - 78 => '111321', - // N - 79 => '121122', - // O - 80 => '131121', - // P - 81 => '212112', - // Q - 82 => '212211', - // R - 83 => '211122', - // S - 84 => '211221', - // T - 85 => '221121', - // U - 86 => '222111', - // V - 87 => '112122', - // W - 88 => '112221', - // X - 89 => '122121', - // Y - 90 => '123111', - // Z - 45 => '121131', - // - - 46 => '311112', - // . - 32 => '311211', - // - 36 => '321111', - // $ - 47 => '112131', - // / - 43 => '113121', - // + - 37 => '211131', - // % - 128 => '121221', - // ($) - 129 => '311121', - // (/) - 130 => '122211', - // (+) - 131 => '312111', - // (%) - 42 => '111141', - ]; - $code = \strtoupper($code); - $encode = [\chr(0) => \chr(131) . 'U', \chr(1) => \chr(128) . 'A', \chr(2) => \chr(128) . 'B', \chr(3) => \chr(128) . 'C', \chr(4) => \chr(128) . 'D', \chr(5) => \chr(128) . 'E', \chr(6) => \chr(128) . 'F', \chr(7) => \chr(128) . 'G', \chr(8) => \chr(128) . 'H', \chr(9) => \chr(128) . 'I', \chr(10) => \chr(128) . 'J', \chr(11) => '£K', \chr(12) => \chr(128) . 'L', \chr(13) => \chr(128) . 'M', \chr(14) => \chr(128) . 'N', \chr(15) => \chr(128) . 'O', \chr(16) => \chr(128) . 'P', \chr(17) => \chr(128) . 'Q', \chr(18) => \chr(128) . 'R', \chr(19) => \chr(128) . 'S', \chr(20) => \chr(128) . 'T', \chr(21) => \chr(128) . 'U', \chr(22) => \chr(128) . 'V', \chr(23) => \chr(128) . 'W', \chr(24) => \chr(128) . 'X', \chr(25) => \chr(128) . 'Y', \chr(26) => \chr(128) . 'Z', \chr(27) => \chr(131) . 'A', \chr(28) => \chr(131) . 'B', \chr(29) => \chr(131) . 'C', \chr(30) => \chr(131) . 'D', \chr(31) => \chr(131) . 'E', \chr(32) => ' ', \chr(33) => \chr(129) . 'A', \chr(34) => \chr(129) . 'B', \chr(35) => \chr(129) . 'C', \chr(36) => \chr(129) . 'D', \chr(37) => \chr(129) . 'E', \chr(38) => \chr(129) . 'F', \chr(39) => \chr(129) . 'G', \chr(40) => \chr(129) . 'H', \chr(41) => \chr(129) . 'I', \chr(42) => \chr(129) . 'J', \chr(43) => \chr(129) . 'K', \chr(44) => \chr(129) . 'L', \chr(45) => '-', \chr(46) => '.', \chr(47) => \chr(129) . 'O', \chr(48) => '0', \chr(49) => '1', \chr(50) => '2', \chr(51) => '3', \chr(52) => '4', \chr(53) => '5', \chr(54) => '6', \chr(55) => '7', \chr(56) => '8', \chr(57) => '9', \chr(58) => \chr(129) . 'Z', \chr(59) => \chr(131) . 'F', \chr(60) => \chr(131) . 'G', \chr(61) => \chr(131) . 'H', \chr(62) => \chr(131) . 'I', \chr(63) => \chr(131) . 'J', \chr(64) => \chr(131) . 'V', \chr(65) => 'A', \chr(66) => 'B', \chr(67) => 'C', \chr(68) => 'D', \chr(69) => 'E', \chr(70) => 'F', \chr(71) => 'G', \chr(72) => 'H', \chr(73) => 'I', \chr(74) => 'J', \chr(75) => 'K', \chr(76) => 'L', \chr(77) => 'M', \chr(78) => 'N', \chr(79) => 'O', \chr(80) => 'P', \chr(81) => 'Q', \chr(82) => 'R', \chr(83) => 'S', \chr(84) => 'T', \chr(85) => 'U', \chr(86) => 'V', \chr(87) => 'W', \chr(88) => 'X', \chr(89) => 'Y', \chr(90) => 'Z', \chr(91) => \chr(131) . 'K', \chr(92) => \chr(131) . 'L', \chr(93) => \chr(131) . 'M', \chr(94) => \chr(131) . 'N', \chr(95) => \chr(131) . 'O', \chr(96) => \chr(131) . 'W', \chr(97) => \chr(130) . 'A', \chr(98) => \chr(130) . 'B', \chr(99) => \chr(130) . 'C', \chr(100) => \chr(130) . 'D', \chr(101) => \chr(130) . 'E', \chr(102) => \chr(130) . 'F', \chr(103) => \chr(130) . 'G', \chr(104) => \chr(130) . 'H', \chr(105) => \chr(130) . 'I', \chr(106) => \chr(130) . 'J', \chr(107) => \chr(130) . 'K', \chr(108) => \chr(130) . 'L', \chr(109) => \chr(130) . 'M', \chr(110) => \chr(130) . 'N', \chr(111) => \chr(130) . 'O', \chr(112) => \chr(130) . 'P', \chr(113) => \chr(130) . 'Q', \chr(114) => \chr(130) . 'R', \chr(115) => \chr(130) . 'S', \chr(116) => \chr(130) . 'T', \chr(117) => \chr(130) . 'U', \chr(118) => \chr(130) . 'V', \chr(119) => \chr(130) . 'W', \chr(120) => \chr(130) . 'X', \chr(121) => \chr(130) . 'Y', \chr(122) => \chr(130) . 'Z', \chr(123) => \chr(131) . 'P', \chr(124) => \chr(131) . 'Q', \chr(125) => \chr(131) . 'R', \chr(126) => \chr(131) . 'S', \chr(127) => \chr(131) . 'T']; - $code_ext = ''; - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - if (\ord($code[$i]) > 127) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in CODE93 barcode value "%s"', $code[$i], $code)); - } - $code_ext .= $encode[$code[$i]]; - } - // checksum - $code_ext .= $this->checksum($code_ext); - // add start and stop codes - $code = '*' . $code_ext . '*'; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $k = 0; - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $char = \ord($code[$i]); - if (!isset($chr[$char])) { - // invalid character - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid CODE93 barcode value "%s"', $code)); - } - for ($j = 0; $j < 6; ++$j) { - if ($j % 2 == 0) { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $w = $chr[$char][$j]; - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - } - } - $bararray['bcode'][$k] = ['t' => \true, 'w' => 1, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += 1; - $this->data = $bararray; - } - /** - * Calculate CODE 93 checksum (modulo 47). - * - * @param string $code - * @return string - */ - protected function checksum($code) - { - $chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%', '<', '=', '>', '?']; - // translate special characters - $code = \strtr($code, \chr(128) . \chr(131) . \chr(129) . \chr(130), '<=>?'); - $len = \strlen($code); - // calculate check digit C - $p = 1; - $check = 0; - for ($i = $len - 1; $i >= 0; --$i) { - $k = \array_keys($chars, $code[$i]); - $check += $k[0] * $p; - ++$p; - if ($p > 20) { - $p = 1; - } - } - $check %= 47; - $c = $chars[$check]; - $code .= $c; - // calculate check digit K - $p = 1; - $check = 0; - for ($i = $len; $i >= 0; --$i) { - $k = \array_keys($chars, $code[$i]); - $check += $k[0] * $p; - ++$p; - if ($p > 15) { - $p = 1; - } - } - $check %= 47; - $k = $chars[$check]; - $checksum = $c . $k; - // resto respecial characters - $checksum = \strtr($checksum, '<=>?', \chr(128) . \chr(131) . \chr(129) . \chr(130)); - return $checksum; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'CODE93'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/EanExt.php b/dependencies/mpdf/mpdf/src/Barcode/EanExt.php deleted file mode 100644 index bc3c646..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/EanExt.php +++ /dev/null @@ -1,97 +0,0 @@ -init($code, $length); - $this->data['lightmL'] = $leftMargin; - // LEFT light margin = x X-dim (http://www.gs1uk.org) - $this->data['lightmR'] = $rightMargin; - // RIGHT light margin = x X-dim (http://www.gs1uk.org) - $this->data['nom-X'] = $xDim; - // Nominal value for X-dim in mm (http://www.gs1uk.org) - $this->data['nom-H'] = $barHeight; - // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) - $this->data['sepM'] = $separatorMargin; - // SEPARATION margin = x X-dim (http://web.archive.org/web/19990501035133/http://www.uc-council.org/d36-d.htm) - } - /** - * @param string $code - * @param int $length - */ - private function init($code, $length = 5) - { - // Padding - $code = \str_pad($code, $length, '0', \STR_PAD_LEFT); - // Calculate check digit - if ($length == 2) { - $r = $code % 4; - } elseif ($length == 5) { - $r = 3 * ($code[0] + $code[2] + $code[4]) + 9 * ($code[1] + $code[3]); - $r %= 10; - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid EAN barcode value "%s"', $code)); - } - // Convert digits to bars - $codes = ['A' => [ - // left odd parity - '0' => '0001101', - '1' => '0011001', - '2' => '0010011', - '3' => '0111101', - '4' => '0100011', - '5' => '0110001', - '6' => '0101111', - '7' => '0111011', - '8' => '0110111', - '9' => '0001011', - ], 'B' => [ - // left even parity - '0' => '0100111', - '1' => '0110011', - '2' => '0011011', - '3' => '0100001', - '4' => '0011101', - '5' => '0111001', - '6' => '0000101', - '7' => '0010001', - '8' => '0001001', - '9' => '0010111', - ]]; - $parities = []; - $parities[2] = ['0' => ['A', 'A'], '1' => ['A', 'B'], '2' => ['B', 'A'], '3' => ['B', 'B']]; - $parities[5] = ['0' => ['B', 'B', 'A', 'A', 'A'], '1' => ['B', 'A', 'B', 'A', 'A'], '2' => ['B', 'A', 'A', 'B', 'A'], '3' => ['B', 'A', 'A', 'A', 'B'], '4' => ['A', 'B', 'B', 'A', 'A'], '5' => ['A', 'A', 'B', 'B', 'A'], '6' => ['A', 'A', 'A', 'B', 'B'], '7' => ['A', 'B', 'A', 'B', 'A'], '8' => ['A', 'B', 'A', 'A', 'B'], '9' => ['A', 'A', 'B', 'A', 'B']]; - $p = $parities[$length][$r]; - $seq = '1011'; - // left guard bar - $seq .= $codes[$p[0]][$code[0]]; - for ($i = 1; $i < $length; ++$i) { - $seq .= '01'; - // separator - $seq .= $codes[$p[$i]][$code[$i]]; - } - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $this->data = $this->binseqToArray($seq, $bararray); - } - public function getType() - { - return 'EAN EXT'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/EanUpc.php b/dependencies/mpdf/mpdf/src/Barcode/EanUpc.php deleted file mode 100644 index 30ddb2c..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/EanUpc.php +++ /dev/null @@ -1,229 +0,0 @@ -init($code, $length); - $this->data['lightmL'] = $leftMargin; - // LEFT light margin = x X-dim (http://www.gs1uk.org) - $this->data['lightmR'] = $rightMargin; - // RIGHT light margin = x X-dim (http://www.gs1uk.org) - $this->data['nom-X'] = $xDim; - // Nominal value for X-dim in mm (http://www.gs1uk.org) - $this->data['nom-H'] = $barHeight; - // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) - } - /** - * @param string $code - * @param int $length - */ - private function init($code, $length) - { - if (\preg_match('/[\\D]+/', $code)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid EAN UPC barcode value "%s"', $code)); - } - $upce = \false; - $checkdigit = \false; - if ($length == 6) { - $length = 12; - // UPC-A - $upce = \true; - // UPC-E mode - } - $dataLength = $length - 1; - // Padding - $code = \str_pad($code, $dataLength, '0', \STR_PAD_LEFT); - $codeLength = \strlen($code); - // Calculate check digit - $sum_a = 0; - for ($i = 1; $i < $dataLength; $i += 2) { - $sum_a += $code[$i]; - } - if ($length > 12) { - $sum_a *= 3; - } - $sum_b = 0; - for ($i = 0; $i < $dataLength; $i += 2) { - $sum_b += $code[$i]; - } - if ($length < 13) { - $sum_b *= 3; - } - $r = ($sum_a + $sum_b) % 10; - if ($r > 0) { - $r = 10 - $r; - } - if ($codeLength == $dataLength) { - // Add check digit - $code .= $r; - $checkdigit = $r; - } elseif ($r !== (int) $code[$dataLength]) { - // Wrong checkdigit - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid EAN UPC barcode value "%s"', $code)); - } - if ($length == 12) { - // UPC-A - $code = '0' . $code; - ++$length; - } - if ($upce) { - // Convert UPC-A to UPC-E - $tmp = \substr($code, 4, 3); - $prodCode = (int) \substr($code, 7, 5); - // product code - $invalidUpce = \false; - if ($tmp == '000' or $tmp == '100' or $tmp == '200') { - // Manufacturer code ends in 000, 100, or 200 - $upceCode = \substr($code, 2, 2) . \substr($code, 9, 3) . \substr($code, 4, 1); - if ($prodCode > 999) { - $invalidUpce = \true; - } - } else { - $tmp = \substr($code, 5, 2); - if ($tmp == '00') { - // Manufacturer code ends in 00 - $upceCode = \substr($code, 2, 3) . \substr($code, 10, 2) . '3'; - if ($prodCode > 99) { - $invalidUpce = \true; - } - } else { - $tmp = \substr($code, 6, 1); - if ($tmp == '0') { - // Manufacturer code ends in 0 - $upceCode = \substr($code, 2, 4) . \substr($code, 11, 1) . '4'; - if ($prodCode > 9) { - $invalidUpce = \true; - } - } else { - // Manufacturer code does not end in zero - $upceCode = \substr($code, 2, 5) . \substr($code, 11, 1); - if ($prodCode > 9) { - $invalidUpce = \true; - } - } - } - } - if ($invalidUpce) { - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException('UPC-A cannot produce a valid UPC-E barcode'); - } - } - // Convert digits to bars - $codes = ['A' => [ - // left odd parity - '0' => '0001101', - '1' => '0011001', - '2' => '0010011', - '3' => '0111101', - '4' => '0100011', - '5' => '0110001', - '6' => '0101111', - '7' => '0111011', - '8' => '0110111', - '9' => '0001011', - ], 'B' => [ - // left even parity - '0' => '0100111', - '1' => '0110011', - '2' => '0011011', - '3' => '0100001', - '4' => '0011101', - '5' => '0111001', - '6' => '0000101', - '7' => '0010001', - '8' => '0001001', - '9' => '0010111', - ], 'C' => [ - // right - '0' => '1110010', - '1' => '1100110', - '2' => '1101100', - '3' => '1000010', - '4' => '1011100', - '5' => '1001110', - '6' => '1010000', - '7' => '1000100', - '8' => '1001000', - '9' => '1110100', - ]]; - $parities = ['0' => ['A', 'A', 'A', 'A', 'A', 'A'], '1' => ['A', 'A', 'B', 'A', 'B', 'B'], '2' => ['A', 'A', 'B', 'B', 'A', 'B'], '3' => ['A', 'A', 'B', 'B', 'B', 'A'], '4' => ['A', 'B', 'A', 'A', 'B', 'B'], '5' => ['A', 'B', 'B', 'A', 'A', 'B'], '6' => ['A', 'B', 'B', 'B', 'A', 'A'], '7' => ['A', 'B', 'A', 'B', 'A', 'B'], '8' => ['A', 'B', 'A', 'B', 'B', 'A'], '9' => ['A', 'B', 'B', 'A', 'B', 'A']]; - $upceParities = []; - $upceParities[0] = ['0' => ['B', 'B', 'B', 'A', 'A', 'A'], '1' => ['B', 'B', 'A', 'B', 'A', 'A'], '2' => ['B', 'B', 'A', 'A', 'B', 'A'], '3' => ['B', 'B', 'A', 'A', 'A', 'B'], '4' => ['B', 'A', 'B', 'B', 'A', 'A'], '5' => ['B', 'A', 'A', 'B', 'B', 'A'], '6' => ['B', 'A', 'A', 'A', 'B', 'B'], '7' => ['B', 'A', 'B', 'A', 'B', 'A'], '8' => ['B', 'A', 'B', 'A', 'A', 'B'], '9' => ['B', 'A', 'A', 'B', 'A', 'B']]; - $upceParities[1] = ['0' => ['A', 'A', 'A', 'B', 'B', 'B'], '1' => ['A', 'A', 'B', 'A', 'B', 'B'], '2' => ['A', 'A', 'B', 'B', 'A', 'B'], '3' => ['A', 'A', 'B', 'B', 'B', 'A'], '4' => ['A', 'B', 'A', 'A', 'B', 'B'], '5' => ['A', 'B', 'B', 'A', 'A', 'B'], '6' => ['A', 'B', 'B', 'B', 'A', 'A'], '7' => ['A', 'B', 'A', 'B', 'A', 'B'], '8' => ['A', 'B', 'A', 'B', 'B', 'A'], '9' => ['A', 'B', 'B', 'A', 'B', 'A']]; - $k = 0; - $seq = '101'; - // left guard bar - if ($upce && isset($upceCode)) { - $bararray = ['code' => $upceCode, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $p = $upceParities[$code[1]][$r]; - for ($i = 0; $i < 6; ++$i) { - $seq .= $codes[$p[$i]][$upceCode[$i]]; - } - $seq .= '010101'; - // right guard bar - } else { - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $halfLen = \ceil($length / 2); - if ($length == 8) { - for ($i = 0; $i < $halfLen; ++$i) { - $seq .= $codes['A'][$code[$i]]; - } - } else { - $p = $parities[$code[0]]; - for ($i = 1; $i < $halfLen; ++$i) { - $seq .= $codes[$p[$i - 1]][$code[$i]]; - } - } - $seq .= '01010'; - // center guard bar - for ($i = $halfLen; $i < $length; ++$i) { - $seq .= $codes['C'][$code[(int) $i]]; - } - $seq .= '101'; - // right guard bar - } - $clen = \strlen($seq); - $w = 0; - for ($i = 0; $i < $clen; ++$i) { - $w += 1; - if ($i == $clen - 1 or $i < $clen - 1 and $seq[$i] != $seq[$i + 1]) { - if ($seq[$i] == '1') { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - $w = 0; - } - } - $bararray['checkdigit'] = $checkdigit; - $this->data = $bararray; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'EANUPC'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/I25.php b/dependencies/mpdf/mpdf/src/Barcode/I25.php deleted file mode 100644 index b5d71c2..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/I25.php +++ /dev/null @@ -1,121 +0,0 @@ -init($code, $printRatio, $checksum); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = $topBottomMargin; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - * @param float $printRatio - * @param bool $checksum - */ - private function init($code, $printRatio, $checksum) - { - $chr = ['0' => '11221', '1' => '21112', '2' => '12112', '3' => '22111', '4' => '11212', '5' => '21211', '6' => '12211', '7' => '11122', '8' => '21121', '9' => '12121', 'A' => '11', 'Z' => '21']; - $checkdigit = ''; - if ($checksum) { - // add checksum - $checkdigit = $this->checksum($code); - $code .= $checkdigit; - } - if (\strlen($code) % 2 != 0) { - // add leading zero if code-length is odd - $code = '0' . $code; - } - // add start and stop codes - $code = 'AA' . \strtolower($code) . 'ZA'; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $k = 0; - $clen = \strlen($code); - for ($i = 0; $i < $clen; $i = $i + 2) { - $charBar = $code[$i]; - $charSpace = $code[$i + 1]; - if (!isset($chr[$charBar]) or !isset($chr[$charSpace])) { - // invalid character - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid I25 barcode value "%s"', $code)); - } - // create a bar-space sequence - $seq = ''; - $chrlen = \strlen($chr[$charBar]); - for ($s = 0; $s < $chrlen; $s++) { - $seq .= $chr[$charBar][$s] . $chr[$charSpace][$s]; - } - $seqlen = \strlen($seq); - for ($j = 0; $j < $seqlen; ++$j) { - if ($j % 2 == 0) { - $t = \true; - // bar - } else { - $t = \false; - // space - } - $x = $seq[$j]; - if ($x == 2) { - $w = $printRatio; - } else { - $w = 1; - } - $bararray['bcode'][$k] = ['t' => $t, 'w' => $w, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += $w; - ++$k; - } - } - $bararray['checkdigit'] = $checkdigit; - $this->data = $bararray; - } - /** - * Checksum for standard 2 of 5 barcodes. - * - * @param string $code - * @return int - */ - private function checksum($code) - { - $len = \strlen($code); - $sum = 0; - for ($i = 0; $i < $len; $i += 2) { - $sum += $code[$i]; - } - $sum *= 3; - for ($i = 1; $i < $len; $i += 2) { - $sum += $code[$i]; - } - $r = $sum % 10; - if ($r > 0) { - $r = 10 - $r; - } - return $r; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'I25'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Imb.php b/dependencies/mpdf/mpdf/src/Barcode/Imb.php deleted file mode 100644 index 08f2eac..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Imb.php +++ /dev/null @@ -1,320 +0,0 @@ -init($code, $gapWidth, $daft); - $this->data['nom-X'] = $xDim; - $this->data['nom-H'] = 3.68; - // Nominal value for Height of Full bar in mm (spec.) - // USPS-B-3200 Revision C = 4.623 - // USPS-B-3200 Revision E = 3.68 - $this->data['quietL'] = 3.175; - // LEFT Quiet margin = mm (spec.) - $this->data['quietR'] = 3.175; - // RIGHT Quiet margin = mm (spec.) - $this->data['quietTB'] = 0.711; - // TOP/BOTTOM Quiet margin = mm (spec.) - } - /** - * @param string $code - * @param float $gapWidth - * @param int[] $daft - */ - private function init($code, $gapWidth, $daft) - { - $asc_chr = [4, 0, 2, 6, 3, 5, 1, 9, 8, 7, 1, 2, 0, 6, 4, 8, 2, 9, 5, 3, 0, 1, 3, 7, 4, 6, 8, 9, 2, 0, 5, 1, 9, 4, 3, 8, 6, 7, 1, 2, 4, 3, 9, 5, 7, 8, 3, 0, 2, 1, 4, 0, 9, 1, 7, 0, 2, 4, 6, 3, 7, 1, 9, 5, 8]; - $dsc_chr = [7, 1, 9, 5, 8, 0, 2, 4, 6, 3, 5, 8, 9, 7, 3, 0, 6, 1, 7, 4, 6, 8, 9, 2, 5, 1, 7, 5, 4, 3, 8, 7, 6, 0, 2, 5, 4, 9, 3, 0, 1, 6, 8, 2, 0, 4, 5, 9, 6, 7, 5, 2, 6, 3, 8, 5, 1, 9, 8, 7, 4, 0, 2, 6, 3]; - $asc_pos = [3, 0, 8, 11, 1, 12, 8, 11, 10, 6, 4, 12, 2, 7, 9, 6, 7, 9, 2, 8, 4, 0, 12, 7, 10, 9, 0, 7, 10, 5, 7, 9, 6, 8, 2, 12, 1, 4, 2, 0, 1, 5, 4, 6, 12, 1, 0, 9, 4, 7, 5, 10, 2, 6, 9, 11, 2, 12, 6, 7, 5, 11, 0, 3, 2]; - $dsc_pos = [2, 10, 12, 5, 9, 1, 5, 4, 3, 9, 11, 5, 10, 1, 6, 3, 4, 1, 10, 0, 2, 11, 8, 6, 1, 12, 3, 8, 6, 4, 4, 11, 0, 6, 1, 9, 11, 5, 3, 7, 3, 10, 7, 11, 8, 2, 10, 3, 5, 8, 0, 3, 12, 11, 8, 4, 5, 1, 3, 0, 7, 12, 9, 8, 10]; - $codeArray = \explode('-', $code); - $trackingNumber = $codeArray[0]; - $routingCode = ''; - if (isset($codeArray[1])) { - $routingCode = $codeArray[1]; - } - // Conversion of Routing Code - switch (\strlen($routingCode)) { - case 0: - $binaryCode = 0; - break; - case 5: - $binaryCode = \bcadd($routingCode, '1'); - break; - case 9: - $binaryCode = \bcadd($routingCode, '100001'); - break; - case 11: - $binaryCode = \bcadd($routingCode, '1000100001'); - break; - default: - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid MSI routing code "%s"', $routingCode)); - } - $binaryCode = \bcmul($binaryCode, 10); - $binaryCode = \bcadd($binaryCode, $trackingNumber[0]); - $binaryCode = \bcmul($binaryCode, 5); - $binaryCode = \bcadd($binaryCode, $trackingNumber[1]); - $binaryCode .= \substr($trackingNumber, 2, 18); - // convert to hexadecimal - $binaryCode = $this->decToHex($binaryCode); - // pad to get 13 bytes - $binaryCode = \str_pad($binaryCode, 26, '0', \STR_PAD_LEFT); - // convert string to array of bytes - $binaryCodeArray = \chunk_split($binaryCode, 2, "\r"); - $binaryCodeArray = \substr($binaryCodeArray, 0, -1); - $binaryCodeArray = \explode("\r", $binaryCodeArray); - // calculate frame check sequence - $fcs = $this->imbCrc11Fcs($binaryCodeArray); - // exclude first 2 bits from first byte - $first_byte = \sprintf('%2s', \dechex(\hexdec($binaryCodeArray[0]) << 2 >> 2)); - $binaryCode102bit = $first_byte . \substr($binaryCode, 2); - // convert binary data to codewords - $codewords = []; - $data = $this->hexToDec($binaryCode102bit); - $codewords[0] = \bcmod($data, 636) * 2; - $data = \bcdiv($data, 636); - for ($i = 1; $i < 9; ++$i) { - $codewords[$i] = \bcmod($data, 1365); - $data = \bcdiv($data, 1365); - } - $codewords[9] = $data; - if ($fcs >> 10 == 1) { - $codewords[9] += 659; - } - // generate lookup tables - $table2of13 = $this->imbTables(2, 78); - $table5of13 = $this->imbTables(5, 1287); - // convert codewords to characters - $characters = []; - $bitmask = 512; - foreach ($codewords as $k => $val) { - if ($val <= 1286) { - $chrcode = $table5of13[$val]; - } else { - $chrcode = $table2of13[$val - 1287]; - } - if (($fcs & $bitmask) > 0) { - // bitwise invert - $chrcode = ~$chrcode & 8191; - } - $characters[] = $chrcode; - $bitmask /= 2; - } - $characters = \array_reverse($characters); - // build bars - $k = 0; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => $daft['F'], 'bcode' => []]; - for ($i = 0; $i < 65; ++$i) { - $asc = ($characters[$asc_chr[$i]] & \pow(2, $asc_pos[$i])) > 0; - $dsc = ($characters[$dsc_chr[$i]] & \pow(2, $dsc_pos[$i])) > 0; - if ($asc and $dsc) { - // full bar (F) - $p = 0; - $h = $daft['F']; - } elseif ($asc) { - // ascender (A) - $p = 0; - $h = $daft['A']; - } elseif ($dsc) { - // descender (D) - $p = $daft['F'] - $daft['D']; - $h = $daft['D']; - } else { - // tracker (T) - $p = ($daft['F'] - $daft['T']) / 2; - $h = $daft['T']; - } - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $h, 'p' => $p]; - // Gap - $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 1, 'p' => 0]; - $bararray['maxw'] += 1 + $gapWidth; - } - unset($bararray['bcode'][$k - 1]); - $bararray['maxw'] -= $gapWidth; - $this->data = $bararray; - } - /** - * Intelligent Mail Barcode calculation of Frame Check Sequence - * - * @param string[] $codeArray - * @return int - */ - private function imbCrc11Fcs($codeArray) - { - $genpoly = 0xf35; - // generator polynomial - $fcs = 0x7ff; - // Frame Check Sequence - // do most significant byte skipping the 2 most significant bits - $data = \hexdec($codeArray[0]) << 5; - for ($bit = 2; $bit < 8; ++$bit) { - if (($fcs ^ $data) & 0x400) { - $fcs = $fcs << 1 ^ $genpoly; - } else { - $fcs = $fcs << 1; - } - $fcs &= 0x7ff; - $data <<= 1; - } - // do rest of bytes - for ($byte = 1; $byte < 13; ++$byte) { - $data = \hexdec($codeArray[$byte]) << 3; - for ($bit = 0; $bit < 8; ++$bit) { - if (($fcs ^ $data) & 0x400) { - $fcs = $fcs << 1 ^ $genpoly; - } else { - $fcs = $fcs << 1; - } - $fcs &= 0x7ff; - $data <<= 1; - } - } - return $fcs; - } - /** - * Reverse unsigned short value - * - * @param int $num - * @return int - */ - private function imbReverseUs($num) - { - $rev = 0; - for ($i = 0; $i < 16; ++$i) { - $rev <<= 1; - $rev |= $num & 1; - $num >>= 1; - } - return $rev; - } - /** - * Generate Nof13 tables used for Intelligent Mail Barcode - * - * @param int $n - * @param int $size - * - * @return mixed[] - */ - private function imbTables($n, $size) - { - $table = []; - $lli = 0; - // LUT lower index - $lui = $size - 1; - // LUT upper index - for ($count = 0; $count < 8192; ++$count) { - $bitCount = 0; - for ($bit_index = 0; $bit_index < 13; ++$bit_index) { - $bitCount += (int) (($count & 1 << $bit_index) != 0); - } - // if we don't have the right number of bits on, go on to the next value - if ($bitCount == $n) { - $reverse = $this->imbReverseUs($count) >> 3; - // if the reverse is less than count, we have already visited this pair before - if ($reverse >= $count) { - // If count is symmetric, place it at the first free slot from the end of the list. - // Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list - if ($reverse == $count) { - $table[$lui] = $count; - --$lui; - } else { - $table[$lli] = $count; - ++$lli; - $table[$lli] = $reverse; - ++$lli; - } - } - } - } - return $table; - } - /** - * Convert large integer number to hexadecimal representation. - * - * @param int $number - * @return string - */ - private function decToHex($number) - { - $hex = []; - if ($number == 0) { - return '00'; - } - while ($number > 0) { - if ($number == 0) { - \array_push($hex, '0'); - } else { - \array_push($hex, \strtoupper(\dechex(\bcmod($number, '16')))); - $number = \bcdiv($number, '16', 0); - } - } - $hex = \array_reverse($hex); - return \implode($hex); - } - /** - * Convert large hexadecimal number to decimal representation (string). - * (requires PHP bcmath extension) - * - * @param string $hex - * @return int - */ - private function hexToDec($hex) - { - $dec = 0; - $bitval = 1; - $len = \strlen($hex); - for ($pos = $len - 1; $pos >= 0; --$pos) { - $dec = \bcadd($dec, \bcmul(\hexdec($hex[$pos]), $bitval)); - $bitval = \bcmul($bitval, 16); - } - return $dec; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'IMB'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Msi.php b/dependencies/mpdf/mpdf/src/Barcode/Msi.php deleted file mode 100644 index 93f66ac..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Msi.php +++ /dev/null @@ -1,80 +0,0 @@ -init($code, $checksum); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 12; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 12; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param int $code - * @param bool $checksum - */ - private function init($code, $checksum) - { - $chr = ['0' => '100100100100', '1' => '100100100110', '2' => '100100110100', '3' => '100100110110', '4' => '100110100100', '5' => '100110100110', '6' => '100110110100', '7' => '100110110110', '8' => '110100100100', '9' => '110100100110', 'A' => '110100110100', 'B' => '110100110110', 'C' => '110110100100', 'D' => '110110100110', 'E' => '110110110100', 'F' => '110110110110']; - $checkdigit = ''; - if ($checksum) { - // add checksum - $clen = \strlen($code); - $p = 2; - $check = 0; - for ($i = $clen - 1; $i >= 0; --$i) { - $check += \hexdec($code[$i]) * $p; - ++$p; - if ($p > 7) { - $p = 2; - } - } - $check %= 11; - if ($check > 0) { - $check = 11 - $check; - } - $code .= $check; - $checkdigit = $check; - } - $seq = '110'; - // left guard - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $digit = $code[$i]; - if (!isset($chr[$digit])) { - // invalid character - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in MSI barcode value "%s"', $digit, $code)); - } - $seq .= $chr[$digit]; - } - $seq .= '1001'; - // right guard - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $bararray['checkdigit'] = $checkdigit; - $this->data = $this->binseqToArray($seq, $bararray); - } - /** - * @inheritdoc - */ - public function getType() - { - return 'MSI'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Postnet.php b/dependencies/mpdf/mpdf/src/Barcode/Postnet.php deleted file mode 100644 index d54fca5..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Postnet.php +++ /dev/null @@ -1,92 +0,0 @@ -init($code, $gapWidth, $planet); - $this->data['nom-X'] = $xDim; - $this->data['nom-H'] = 3.175; - // Nominal value for Height of Full bar in mm (spec.) - $this->data['quietL'] = 3.175; - // LEFT Quiet margin = mm (?spec.) - $this->data['quietR'] = 3.175; - // RIGHT Quiet margin = mm (?spec.) - $this->data['quietTB'] = 1.016; - // TOP/BOTTOM Quiet margin = mm (?spec.) - } - /** - * @param string $code - * @param float $gapWidth - * @param bool $planet - */ - private function init($code, $gapWidth, $planet) - { - // bar lenght - if ($planet) { - $barlen = [0 => [1, 1, 2, 2, 2], 1 => [2, 2, 2, 1, 1], 2 => [2, 2, 1, 2, 1], 3 => [2, 2, 1, 1, 2], 4 => [2, 1, 2, 2, 1], 5 => [2, 1, 2, 1, 2], 6 => [2, 1, 1, 2, 2], 7 => [1, 2, 2, 2, 1], 8 => [1, 2, 2, 1, 2], 9 => [1, 2, 1, 2, 2]]; - } else { - $barlen = [0 => [2, 2, 1, 1, 1], 1 => [1, 1, 1, 2, 2], 2 => [1, 1, 2, 1, 2], 3 => [1, 1, 2, 2, 1], 4 => [1, 2, 1, 1, 2], 5 => [1, 2, 1, 2, 1], 6 => [1, 2, 2, 1, 1], 7 => [2, 1, 1, 1, 2], 8 => [2, 1, 1, 2, 1], 9 => [2, 1, 2, 1, 1]]; - } - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 5, 'bcode' => []]; - $k = 0; - $code = \str_replace('-', '', $code); - $code = \str_replace(' ', '', $code); - $len = \strlen($code); - // calculate checksum - $sum = 0; - for ($i = 0; $i < $len; ++$i) { - $sum += (int) $code[$i]; - } - $chkd = $sum % 10; - if ($chkd > 0) { - $chkd = 10 - $chkd; - } - $code .= $chkd; - $checkdigit = $chkd; - $len = \strlen($code); - // start bar - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => 5, 'p' => 0]; - $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 5, 'p' => 0]; - $bararray['maxw'] += 1 + $gapWidth; - for ($i = 0; $i < $len; ++$i) { - for ($j = 0; $j < 5; ++$j) { - $bh = $barlen[$code[$i]][$j]; - if ($bh == 2) { - $h = 5; - $p = 0; - } else { - $h = 2; - $p = 3; - } - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $h, 'p' => $p]; - $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 2, 'p' => 0]; - $bararray['maxw'] += 1 + $gapWidth; - } - } - // end bar - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => 5, 'p' => 0]; - $bararray['maxw'] += 1; - $bararray['checkdigit'] = $checkdigit; - $this->data = $bararray; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'POSTNET'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/Rm4Scc.php b/dependencies/mpdf/mpdf/src/Barcode/Rm4Scc.php deleted file mode 100644 index 05df51f..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/Rm4Scc.php +++ /dev/null @@ -1,111 +0,0 @@ -init($code, $gapWidth, $daft, $kix); - $this->data['nom-X'] = $xDim; - $this->data['nom-H'] = 5.0; - // Nominal value for Height of Full bar in mm (spec.) - $this->data['quietL'] = 2; - // LEFT Quiet margin = mm (spec.) - $this->data['quietR'] = 2; - // RIGHT Quiet margin = mm (spec.) - $this->data['quietTB'] = 2; - // TOP/BOTTOM Quiet margin = mm (spec?) - } - /** - * @param string $code - * @param float $gapWidth - * @param int[] $daft - * @param bool $kix - */ - private function init($code, $gapWidth, $daft, $kix) - { - $notkix = !$kix; - // bar mode - // 1 = pos 1, length 2 - // 2 = pos 1, length 3 - // 3 = pos 2, length 1 - // 4 = pos 2, length 2 - $barmode = ['0' => [3, 3, 2, 2], '1' => [3, 4, 1, 2], '2' => [3, 4, 2, 1], '3' => [4, 3, 1, 2], '4' => [4, 3, 2, 1], '5' => [4, 4, 1, 1], '6' => [3, 1, 4, 2], '7' => [3, 2, 3, 2], '8' => [3, 2, 4, 1], '9' => [4, 1, 3, 2], 'A' => [4, 1, 4, 1], 'B' => [4, 2, 3, 1], 'C' => [3, 1, 2, 4], 'D' => [3, 2, 1, 4], 'E' => [3, 2, 2, 3], 'F' => [4, 1, 1, 4], 'G' => [4, 1, 2, 3], 'H' => [4, 2, 1, 3], 'I' => [1, 3, 4, 2], 'J' => [1, 4, 3, 2], 'K' => [1, 4, 4, 1], 'L' => [2, 3, 3, 2], 'M' => [2, 3, 4, 1], 'N' => [2, 4, 3, 1], 'O' => [1, 3, 2, 4], 'P' => [1, 4, 1, 4], 'Q' => [1, 4, 2, 3], 'R' => [2, 3, 1, 4], 'S' => [2, 3, 2, 3], 'T' => [2, 4, 1, 3], 'U' => [1, 1, 4, 4], 'V' => [1, 2, 3, 4], 'W' => [1, 2, 4, 3], 'X' => [2, 1, 3, 4], 'Y' => [2, 1, 4, 3], 'Z' => [2, 2, 3, 3]]; - $code = \strtoupper($code); - $len = \strlen($code); - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => $daft['F'], 'bcode' => []]; - if ($notkix) { - // table for checksum calculation (row,col) - $checktable = ['0' => [1, 1], '1' => [1, 2], '2' => [1, 3], '3' => [1, 4], '4' => [1, 5], '5' => [1, 0], '6' => [2, 1], '7' => [2, 2], '8' => [2, 3], '9' => [2, 4], 'A' => [2, 5], 'B' => [2, 0], 'C' => [3, 1], 'D' => [3, 2], 'E' => [3, 3], 'F' => [3, 4], 'G' => [3, 5], 'H' => [3, 0], 'I' => [4, 1], 'J' => [4, 2], 'K' => [4, 3], 'L' => [4, 4], 'M' => [4, 5], 'N' => [4, 0], 'O' => [5, 1], 'P' => [5, 2], 'Q' => [5, 3], 'R' => [5, 4], 'S' => [5, 5], 'T' => [5, 0], 'U' => [0, 1], 'V' => [0, 2], 'W' => [0, 3], 'X' => [0, 4], 'Y' => [0, 5], 'Z' => [0, 0]]; - $row = 0; - $col = 0; - for ($i = 0; $i < $len; ++$i) { - $row += $checktable[$code[$i]][0]; - $col += $checktable[$code[$i]][1]; - } - $row %= 6; - $col %= 6; - $chk = \array_keys($checktable, [$row, $col]); - $code .= $chk[0]; - $bararray['checkdigit'] = $chk[0]; - ++$len; - } - $k = 0; - if ($notkix) { - // start bar - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $daft['A'], 'p' => 0]; - $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => $daft['A'], 'p' => 0]; - $bararray['maxw'] += 1 + $gapWidth; - } - for ($i = 0; $i < $len; ++$i) { - for ($j = 0; $j < 4; ++$j) { - switch ($barmode[$code[$i]][$j]) { - case 1: - // ascender (A) - $p = 0; - $h = $daft['A']; - break; - case 2: - // full bar (F) - $p = 0; - $h = $daft['F']; - break; - case 3: - // tracker (T) - $p = ($daft['F'] - $daft['T']) / 2; - $h = $daft['T']; - break; - case 4: - // descender (D) - $p = $daft['F'] - $daft['D']; - $h = $daft['D']; - break; - } - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $h, 'p' => $p]; - $bararray['bcode'][$k++] = ['t' => 0, 'w' => $gapWidth, 'h' => 2, 'p' => 0]; - $bararray['maxw'] += 1 + $gapWidth; - } - } - if ($notkix) { - // stop bar - $bararray['bcode'][$k++] = ['t' => 1, 'w' => 1, 'h' => $daft['F'], 'p' => 0]; - $bararray['maxw'] += 1; - } - $this->data = $bararray; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'RM4SCC'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Barcode/S25.php b/dependencies/mpdf/mpdf/src/Barcode/S25.php deleted file mode 100644 index c6da0f3..0000000 --- a/dependencies/mpdf/mpdf/src/Barcode/S25.php +++ /dev/null @@ -1,93 +0,0 @@ -init($code, $checksum); - $this->data['nom-X'] = 0.381; - // Nominal value for X-dim (bar width) in mm (2 X min. spec.) - $this->data['nom-H'] = 10; - // Nominal value for Height of Full bar in mm (non-spec.) - $this->data['lightmL'] = $quiet_zone_left !== null ? $quiet_zone_left : 10; - // LEFT light margin = x X-dim (spec.) - $this->data['lightmR'] = $quiet_zone_right !== null ? $quiet_zone_right : 10; - // RIGHT light margin = x X-dim (spec.) - $this->data['lightTB'] = 0; - // TOP/BOTTOM light margin = x X-dim (non-spec.) - } - /** - * @param string $code - * @param bool $checksum - */ - private function init($code, $checksum) - { - $chr = ['0' => '10101110111010', '1' => '11101010101110', '2' => '10111010101110', '3' => '11101110101010', '4' => '10101110101110', '5' => '11101011101010', '6' => '10111011101010', '7' => '10101011101110', '8' => '10101110111010', '9' => '10111010111010']; - $checkdigit = ''; - if ($checksum) { - // add checksum - $checkdigit = $this->checksum($code); - $code .= $checkdigit; - } - if (\strlen($code) % 2 != 0) { - // add leading zero if code-length is odd - $code = '0' . $code; - } - $seq = '11011010'; - $clen = \strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $digit = $code[$i]; - if (!isset($chr[$digit])) { - // invalid character - throw new \WP_Ultimo\Dependencies\Mpdf\Barcode\BarcodeException(\sprintf('Invalid character "%s" in S25 barcode value "%s"', $digit, $code)); - } - $seq .= $chr[$digit]; - } - $seq .= '1101011'; - $bararray = ['code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => []]; - $bararray['checkdigit'] = $checkdigit; - $this->data = $this->binseqToArray($seq, $bararray); - } - /** - * Checksum for standard 2 of 5 barcodes. - * - * @param string $code - * - * @return int - */ - private function checksum($code) - { - $len = \strlen($code); - $sum = 0; - for ($i = 0; $i < $len; $i += 2) { - $sum += $code[$i]; - } - $sum *= 3; - for ($i = 1; $i < $len; $i += 2) { - $sum += $code[$i]; - } - $r = $sum % 10; - if ($r > 0) { - $r = 10 - $r; - } - return $r; - } - /** - * @inheritdoc - */ - public function getType() - { - return 'S25'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Cache.php b/dependencies/mpdf/mpdf/src/Cache.php deleted file mode 100644 index ee815ed..0000000 --- a/dependencies/mpdf/mpdf/src/Cache.php +++ /dev/null @@ -1,93 +0,0 @@ -createBasePath($basePath)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Temporary files directory "%s" is not writable', $basePath)); - } - $this->basePath = $basePath; - $this->cleanupInterval = $cleanupInterval; - } - protected function createBasePath($basePath) - { - if (!\file_exists($basePath)) { - if (!$this->createBasePath(\dirname($basePath))) { - return \false; - } - if (!$this->createDirectory($basePath)) { - return \false; - } - } - if (!\is_writable($basePath) || !\is_dir($basePath)) { - return \false; - } - return \true; - } - protected function createDirectory($basePath) - { - if (!\mkdir($basePath)) { - return \false; - } - if (!\chmod($basePath, 0777)) { - return \false; - } - return \true; - } - public function tempFilename($filename) - { - return $this->getFilePath($filename); - } - public function has($filename) - { - return \file_exists($this->getFilePath($filename)); - } - public function load($filename) - { - return \file_get_contents($this->getFilePath($filename)); - } - public function write($filename, $data) - { - $tempFile = \tempnam($this->basePath, 'cache_tmp_'); - \file_put_contents($tempFile, $data); - \chmod($tempFile, 0664); - $path = $this->getFilePath($filename); - \rename($tempFile, $path); - return $path; - } - public function remove($filename) - { - return \unlink($this->getFilePath($filename)); - } - public function clearOld() - { - $iterator = new DirectoryIterator($this->basePath); - /** @var \DirectoryIterator $item */ - foreach ($iterator as $item) { - if (!$item->isDot() && $item->isFile() && !$this->isDotFile($item) && $this->isOld($item)) { - \unlink($item->getPathname()); - } - } - } - private function getFilePath($filename) - { - return $this->basePath . '/' . $filename; - } - private function isOld(DirectoryIterator $item) - { - return $this->cleanupInterval ? $item->getMTime() + $this->cleanupInterval < \time() : \false; - } - public function isDotFile(DirectoryIterator $item) - { - return \substr($item->getFilename(), 0, 1) === '.'; - } -} diff --git a/dependencies/mpdf/mpdf/src/Color/ColorConverter.php b/dependencies/mpdf/mpdf/src/Color/ColorConverter.php deleted file mode 100644 index 8d3c35d..0000000 --- a/dependencies/mpdf/mpdf/src/Color/ColorConverter.php +++ /dev/null @@ -1,285 +0,0 @@ -mpdf = $mpdf; - $this->colorModeConverter = $colorModeConverter; - $this->colorSpaceRestrictor = $colorSpaceRestrictor; - $this->cache = []; - } - public function convert($color, array &$PDFAXwarnings = []) - { - $color = \strtolower(\trim($color)); - if ($color === 'transparent' || $color === 'inherit') { - return \false; - } - if (isset(NamedColors::$colors[$color])) { - $color = NamedColors::$colors[$color]; - } - if (!isset($this->cache[$color])) { - $c = $this->convertPlain($color, $PDFAXwarnings); - $cstr = ''; - if (\is_array($c)) { - $c = \array_pad($c, 6, 0); - $cstr = \pack('a1ccccc', $c[0], \round($c[1]) & 0xff, \round($c[2]) & 0xff, \round($c[3]) & 0xff, \round($c[4]) & 0xff, \round($c[5]) & 0xff); - } - $this->cache[$color] = $cstr; - } - return $this->cache[$color]; - } - public function lighten($c) - { - $this->ensureBinaryColorFormat($c); - if ($c[0] == static::MODE_RGB || $c[0] == static::MODE_RGBA) { - list($h, $s, $l) = $this->colorModeConverter->rgb2hsl(\ord($c[1]) / 255, \ord($c[2]) / 255, \ord($c[3]) / 255); - $l += (1 - $l) * 0.8; - list($r, $g, $b) = $this->colorModeConverter->hsl2rgb($h, $s, $l); - $ret = [3, $r, $g, $b]; - } elseif ($c[0] == static::MODE_CMYK || $c[0] == static::MODE_CMYKA) { - $ret = [4, \max(0, \ord($c[1]) - 20), \max(0, \ord($c[2]) - 20), \max(0, \ord($c[3]) - 20), \max(0, \ord($c[4]) - 20)]; - } elseif ($c[0] == static::MODE_GRAYSCALE) { - $ret = [1, \min(255, \ord($c[1]) + 32)]; - } - $c = \array_pad($ret, 6, 0); - $cstr = \pack('a1ccccc', $c[0], \round($c[1]) & 0xff, \round($c[2]) & 0xff, \round($c[3]) & 0xff, \round($c[4]) & 0xff, \round($c[5]) & 0xff); - return $cstr; - } - public function darken($c) - { - $this->ensureBinaryColorFormat($c); - if ($c[0] == static::MODE_RGB || $c[0] == static::MODE_RGBA) { - list($h, $s, $l) = $this->colorModeConverter->rgb2hsl(\ord($c[1]) / 255, \ord($c[2]) / 255, \ord($c[3]) / 255); - $s *= 0.25; - $l *= 0.75; - list($r, $g, $b) = $this->colorModeConverter->hsl2rgb($h, $s, $l); - $ret = [3, $r, $g, $b]; - } elseif ($c[0] == static::MODE_CMYK || $c[0] == static::MODE_CMYKA) { - $ret = [4, \min(100, \ord($c[1]) + 20), \min(100, \ord($c[2]) + 20), \min(100, \ord($c[3]) + 20), \min(100, \ord($c[4]) + 20)]; - } elseif ($c[0] == static::MODE_GRAYSCALE) { - $ret = [1, \max(0, \ord($c[1]) - 32)]; - } - $c = \array_pad($ret, 6, 0); - $cstr = \pack('a1ccccc', $c[0], $c[1] & 0xff, $c[2] & 0xff, $c[3] & 0xff, $c[4] & 0xff, $c[5] & 0xff); - return $cstr; - } - /** - * @param string $c - * @return float[] - */ - public function invert($c) - { - $this->ensureBinaryColorFormat($c); - if ($c[0] == static::MODE_RGB || $c[0] == static::MODE_RGBA) { - return [3, 255 - \ord($c[1]), 255 - \ord($c[2]), 255 - \ord($c[3])]; - } - if ($c[0] == static::MODE_CMYK || $c[0] == static::MODE_CMYKA) { - return [4, 100 - \ord($c[1]), 100 - \ord($c[2]), 100 - \ord($c[3]), 100 - \ord($c[4])]; - } - if ($c[0] == static::MODE_GRAYSCALE) { - return [1, 255 - \ord($c[1])]; - } - // Cannot cope with non-RGB colors at present - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Trying to invert non-RGB color'); - } - /** - * @param string $c Binary color string - * - * @return string - */ - public function colAtoString($c) - { - if ($c[0] == static::MODE_GRAYSCALE) { - return 'rgb(' . \ord($c[1]) . ', ' . \ord($c[1]) . ', ' . \ord($c[1]) . ')'; - } - if ($c[0] == static::MODE_SPOT) { - return 'spot(' . \ord($c[1]) . ', ' . \ord($c[2]) . ')'; - } - if ($c[0] == static::MODE_RGB) { - return 'rgb(' . \ord($c[1]) . ', ' . \ord($c[2]) . ', ' . \ord($c[3]) . ')'; - } - if ($c[0] == static::MODE_CMYK) { - return 'cmyk(' . \ord($c[1]) . ', ' . \ord($c[2]) . ', ' . \ord($c[3]) . ', ' . \ord($c[4]) . ')'; - } - if ($c[0] == static::MODE_RGBA) { - return 'rgba(' . \ord($c[1]) . ', ' . \ord($c[2]) . ', ' . \ord($c[3]) . ', ' . \sprintf('%0.2F', \ord($c[4]) / 100) . ')'; - } - if ($c[0] == static::MODE_CMYKA) { - return 'cmyka(' . \ord($c[1]) . ', ' . \ord($c[2]) . ', ' . \ord($c[3]) . ', ' . \ord($c[4]) . ', ' . \sprintf('%0.2F', \ord($c[5]) / 100) . ')'; - } - return ''; - } - /** - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return bool|float[] - */ - private function convertPlain($color, array &$PDFAXwarnings = []) - { - $c = \false; - if (\preg_match('/^[\\d]+$/', $color)) { - $c = [static::MODE_GRAYSCALE, $color]; - // i.e. integer only - } elseif (\strpos($color, '#') === 0) { - // case of #nnnnnn or #nnn - $c = $this->processHashColor($color); - } elseif (\preg_match('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\\((.*?)\\)/', $color, $m)) { - // quickfix for color containing CSS variable - \preg_match('/var\\(--([a-z-_]+)\\)/i', $m[0], $var); - if ($var) { - $m[2] = '0, 0, 0, 100'; - } - $c = $this->processModeColor($m[1], \explode(',', $m[2])); - } - if ($this->mpdf->PDFA || $this->mpdf->PDFX || $this->mpdf->restrictColorSpace) { - $c = $this->restrictColorSpace($c, $color, $PDFAXwarnings); - } - return $c; - } - /** - * @param string $color - * - * @return float[] - */ - private function processHashColor($color) - { - // in case of Background: #CCC url() x-repeat etc. - $cor = \preg_replace('/\\s+.*/', '', $color); - // Turn #RGB into #RRGGBB - if (\strlen($cor) === 4) { - $cor = '#' . $cor[1] . $cor[1] . $cor[2] . $cor[2] . $cor[3] . $cor[3]; - } - $r = self::safeHexDec(\substr($cor, 1, 2)); - $g = self::safeHexDec(\substr($cor, 3, 2)); - $b = self::safeHexDec(\substr($cor, 5, 2)); - return [3, $r, $g, $b]; - } - /** - * @param $mode - * @param mixed[] $cores - * @return bool|float[] - */ - private function processModeColor($mode, array $cores) - { - $c = \false; - $cores = $this->convertPercentCoreValues($mode, $cores); - switch ($mode) { - case 'rgb': - return [static::MODE_RGB, $cores[0], $cores[1], $cores[2]]; - case 'rgba': - return [static::MODE_RGBA, $cores[0], $cores[1], $cores[2], $cores[3] * 100]; - case 'cmyk': - case 'device-cmyk': - return [static::MODE_CMYK, $cores[0], $cores[1], $cores[2], $cores[3]]; - case 'cmyka': - case 'device-cmyka': - return [static::MODE_CMYKA, $cores[0], $cores[1], $cores[2], $cores[3], $cores[4] * 100]; - case 'hsl': - $conv = $this->colorModeConverter->hsl2rgb($cores[0] / 360, $cores[1], $cores[2]); - return [static::MODE_RGB, $conv[0], $conv[1], $conv[2]]; - case 'hsla': - $conv = $this->colorModeConverter->hsl2rgb($cores[0] / 360, $cores[1], $cores[2]); - return [static::MODE_RGBA, $conv[0], $conv[1], $conv[2], $cores[3] * 100]; - case 'spot': - $name = \strtoupper(\trim($cores[0])); - if (!isset($this->mpdf->spotColors[$name])) { - if (isset($cores[5])) { - $this->mpdf->AddSpotColor($cores[0], $cores[2], $cores[3], $cores[4], $cores[5]); - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Undefined spot color "%s"', $name)); - } - } - return [static::MODE_SPOT, $this->mpdf->spotColors[$name]['i'], $cores[1]]; - } - return $c; - } - /** - * @param string $mode - * @param mixed[] $cores - * - * @return float[] - */ - private function convertPercentCoreValues($mode, array $cores) - { - $ncores = \count($cores); - if (\strpos($cores[0], '%') !== \false) { - $cores[0] = (float) $cores[0]; - if ($mode === 'rgb' || $mode === 'rgba') { - $cores[0] = (int) ($cores[0] * 255 / 100); - } - } - if ($ncores > 1 && \strpos($cores[1], '%') !== \false) { - $cores[1] = (float) $cores[1]; - if ($mode === 'rgb' || $mode === 'rgba') { - $cores[1] = (int) ($cores[1] * 255 / 100); - } - if ($mode === 'hsl' || $mode === 'hsla') { - $cores[1] /= 100; - } - } - if ($ncores > 2 && \strpos($cores[2], '%') !== \false) { - $cores[2] = (float) $cores[2]; - if ($mode === 'rgb' || $mode === 'rgba') { - $cores[2] = (int) ($cores[2] * 255 / 100); - } - if ($mode === 'hsl' || $mode === 'hsla') { - $cores[2] /= 100; - } - } - if ($ncores > 3 && \strpos($cores[3], '%') !== \false) { - $cores[3] = (float) $cores[3]; - } - return $cores; - } - /** - * @param mixed $c - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return float[] - */ - private function restrictColorSpace($c, $color, &$PDFAXwarnings = []) - { - return $this->colorSpaceRestrictor->restrictColorSpace($c, $color, $PDFAXwarnings); - } - /** - * @param string $color Binary color string - */ - private function ensureBinaryColorFormat($color) - { - if (!\is_string($color)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid color input, binary color string expected'); - } - if (\strlen($color) !== 6) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid color input, binary color string expected'); - } - if (!\in_array($color[0], [static::MODE_GRAYSCALE, static::MODE_SPOT, static::MODE_RGB, static::MODE_CMYK, static::MODE_RGBA, static::MODE_CMYKA])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid color input, invalid color mode in binary color string'); - } - } - /** - * Converts the given hexString to its decimal representation when all digits are hexadecimal - * - * @param string $hexString The hexadecimal string to convert - * @return float|int The decimal representation of hexString or 0 if not all digits of hexString are hexadecimal - */ - private function safeHexDec($hexString) - { - return \ctype_xdigit($hexString) ? \hexdec($hexString) : 0; - } -} diff --git a/dependencies/mpdf/mpdf/src/Color/ColorModeConverter.php b/dependencies/mpdf/mpdf/src/Color/ColorModeConverter.php deleted file mode 100644 index 152575d..0000000 --- a/dependencies/mpdf/mpdf/src/Color/ColorModeConverter.php +++ /dev/null @@ -1,170 +0,0 @@ -cmyk2rgb($c); - return $this->rgb2gray($rgb); - } - /** - * @param float[] $c - * - * @return float[] - */ - public function rgb2cmyk($c) - { - $cyan = 1 - $c[1] / 255; - $magenta = 1 - $c[2] / 255; - $yellow = 1 - $c[3] / 255; - $min = \min($cyan, $magenta, $yellow); - if ($min == 1) { - if ($c[0] == 5) { - return [6, 100, 100, 100, 100, $c[4]]; - } - return [4, 100, 100, 100, 100]; - // For K-Black - //if ($c[0]==5) { return array (6,0,0,0,100, $c[4]); } - //else { return array (4,0,0,0,100); } - } - $K = $min; - $black = 1 - $K; - if ($c[0] == 5) { - return [6, ($cyan - $K) * 100 / $black, ($magenta - $K) * 100 / $black, ($yellow - $K) * 100 / $black, $K * 100, $c[4]]; - } - return [4, ($cyan - $K) * 100 / $black, ($magenta - $K) * 100 / $black, ($yellow - $K) * 100 / $black, $K * 100]; - } - /** - * @param float[] $c - * - * @return float[] - */ - public function cmyk2rgb($c) - { - $rgb = []; - $colors = 255 - $c[4] * 2.55; - $rgb[0] = (int) ($colors * (255 - $c[1] * 2.55) / 255); - $rgb[1] = (int) ($colors * (255 - $c[2] * 2.55) / 255); - $rgb[2] = (int) ($colors * (255 - $c[3] * 2.55) / 255); - if ($c[0] == 6) { - return [5, $rgb[0], $rgb[1], $rgb[2], $c[5]]; - } - return [3, $rgb[0], $rgb[1], $rgb[2]]; - } - /** - * @param float $r - * @param float $g - * @param float $b - * - * @return float[] - */ - public function rgb2hsl($r, $g, $b) - { - $h = 0; - $min = \min($r, $g, $b); - $max = \max($r, $g, $b); - $diff = $max - $min; - $l = ($max + $min) / 2; - if ($diff == 0) { - $h = 0; - $s = 0; - } else { - if ($l < 0.5) { - $s = $diff / ($max + $min); - } else { - $s = $diff / (2 - $max - $min); - } - $rDiff = (($max - $r) / 6 + $diff / 2) / $diff; - $gDiff = (($max - $g) / 6 + $diff / 2) / $diff; - $bDiff = (($max - $b) / 6 + $diff / 2) / $diff; - if ($r == $max) { - $h = $bDiff - $gDiff; - } elseif ($g == $max) { - $h = 1 / 3 + $rDiff - $bDiff; - } elseif ($b == $max) { - $h = 2 / 3 + $gDiff - $rDiff; - } - if ($h < 0) { - ++$h; - } - if ($h > 1) { - --$h; - } - } - return [$h, $s, $l]; - } - /** - * Input is HSL value of complementary colour, held in $h2, $s, $l as fractions of 1 - * Output is RGB in normal 255 255 255 format, held in $r, $g, $b - * - * @param float $h - * @param float $s - * @param float $l - * - * @return float[] - */ - public function hsl2rgb($h, $s, $l) - { - if ($s == 0) { - $r = $l * 255; - $g = $l * 255; - $b = $l * 255; - } else { - if ($l < 0.5) { - $tmp = $l * (1 + $s); - } else { - $tmp = $l + $s - $s * $l; - } - $tmp2 = 2 * $l - $tmp; - $r = \round(255 * $this->hue2rgb($tmp2, $tmp, $h + 1 / 3)); - $g = \round(255 * $this->hue2rgb($tmp2, $tmp, $h)); - $b = \round(255 * $this->hue2rgb($tmp2, $tmp, $h - 1 / 3)); - } - return [$r, $g, $b]; - } - /** - * @param float $v1 - * @param float $v2 - * @param float $vh - * - * @return float - */ - public function hue2rgb($v1, $v2, $vh) - { - if ($vh < 0) { - ++$vh; - } - if ($vh > 1) { - --$vh; - } - if (6 * $vh < 1) { - return $v1 + ($v2 - $v1) * 6 * $vh; - } - if (2 * $vh < 1) { - return $v2; - } - if (3 * $vh < 2) { - return $v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6); - } - return $v1; - } -} diff --git a/dependencies/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php b/dependencies/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php deleted file mode 100644 index fc46943..0000000 --- a/dependencies/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php +++ /dev/null @@ -1,190 +0,0 @@ -gray] - * 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] - * 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] - * - * @param \Mpdf\Mpdf $mpdf - * @param \Mpdf\Color\ColorModeConverter $colorModeConverter - * @param int $mode - */ - public function __construct(Mpdf $mpdf, ColorModeConverter $colorModeConverter) - { - $this->mpdf = $mpdf; - $this->colorModeConverter = $colorModeConverter; - } - /** - * @param mixed $c - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return float[]|mixed - */ - public function restrictColorSpace($c, $color, &$PDFAXwarnings = []) - { - if (!\is_array($c)) { - return $c; - } - $mode = (int) $c[0]; - switch ($mode) { - case 1: - return $c; - case 2: - return $this->restrictSpotColorSpace($c, $PDFAXwarnings); - case 3: - return $this->restrictRgbColorSpace($c, $color, $PDFAXwarnings); - case 4: - return $this->restrictCmykColorSpace($c, $color, $PDFAXwarnings); - case 5: - return $this->restrictRgbaColorSpace($c, $color, $PDFAXwarnings); - case 6: - return $this->restrictCmykaColorSpace($c, $color, $PDFAXwarnings); - } - return $c; - } - /** - * @param string $c - * @param string[] $PDFAXwarnings - * - * @return float[] - */ - private function restrictSpotColorSpace($c, &$PDFAXwarnings = []) - { - if (!isset($this->mpdf->spotColorIDs[$c[1]])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Error: Spot colour has not been defined - ' . $this->mpdf->spotColorIDs[$c[1]]); - } - if ($this->mpdf->PDFA) { - if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto) { - $PDFAXwarnings[] = "Spot color specified '" . $this->mpdf->spotColorIDs[$c[1]] . "' (converted to process color)"; - } - if ($this->mpdf->restrictColorSpace != 3) { - $sp = $this->mpdf->spotColors[$this->mpdf->spotColorIDs[$c[1]]]; - $c = $this->colorModeConverter->cmyk2rgb([4, $sp['c'], $sp['m'], $sp['y'], $sp['k']]); - } - } elseif ($this->mpdf->restrictColorSpace == 1) { - $sp = $this->mpdf->spotColors[$this->mpdf->spotColorIDs[$c[1]]]; - $c = $this->colorModeConverter->cmyk2gray([4, $sp['c'], $sp['m'], $sp['y'], $sp['k']]); - } - return $c; - } - /** - * @param mixed $c - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return float[] - */ - private function restrictRgbColorSpace($c, $color, &$PDFAXwarnings = []) - { - if ($this->mpdf->PDFX || $this->mpdf->PDFA && $this->mpdf->restrictColorSpace == 3) { - if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto || $this->mpdf->PDFX && !$this->mpdf->PDFXauto) { - $PDFAXwarnings[] = "RGB color specified '" . $color . "' (converted to CMYK)"; - } - $c = $this->colorModeConverter->rgb2cmyk($c); - } elseif ($this->mpdf->restrictColorSpace == 1) { - $c = $this->colorModeConverter->rgb2gray($c); - } elseif ($this->mpdf->restrictColorSpace == 3) { - $c = $this->colorModeConverter->rgb2cmyk($c); - } - return $c; - } - /** - * @param mixed $c - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return float[] - */ - private function restrictCmykColorSpace($c, $color, &$PDFAXwarnings = []) - { - if ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace != 3) { - if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto) { - $PDFAXwarnings[] = "CMYK color specified '" . $color . "' (converted to RGB)"; - } - $c = $this->colorModeConverter->cmyk2rgb($c); - } elseif ($this->mpdf->restrictColorSpace == 1) { - $c = $this->colorModeConverter->cmyk2gray($c); - } elseif ($this->mpdf->restrictColorSpace == 2) { - $c = $this->colorModeConverter->cmyk2rgb($c); - } - return $c; - } - /** - * @param mixed $c - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return float[] - */ - private function restrictRgbaColorSpace($c, $color, &$PDFAXwarnings = []) - { - if ($this->mpdf->PDFX || $this->mpdf->PDFA && $this->mpdf->restrictColorSpace == 3) { - if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto || $this->mpdf->PDFX && !$this->mpdf->PDFXauto) { - $PDFAXwarnings[] = "RGB color with transparency specified '" . $color . "' (converted to CMYK without transparency)"; - } - $c = $this->colorModeConverter->rgb2cmyk($c); - $c = [4, $c[1], $c[2], $c[3], $c[4]]; - } elseif ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace != 3) { - if (!$this->mpdf->PDFAauto) { - $PDFAXwarnings[] = "RGB color with transparency specified '" . $color . "' (converted to RGB without transparency)"; - } - $c = $this->colorModeConverter->rgb2cmyk($c); - $c = [4, $c[1], $c[2], $c[3], $c[4]]; - } elseif ($this->mpdf->restrictColorSpace == 1) { - $c = $this->colorModeConverter->rgb2gray($c); - } elseif ($this->mpdf->restrictColorSpace == 3) { - $c = $this->colorModeConverter->rgb2cmyk($c); - } - return $c; - } - /** - * @param mixed $c - * @param string $color - * @param string[] $PDFAXwarnings - * - * @return float[] - */ - private function restrictCmykaColorSpace($c, $color, &$PDFAXwarnings = []) - { - if ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace != 3) { - if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto || $this->mpdf->PDFX && !$this->mpdf->PDFXauto) { - $PDFAXwarnings[] = "CMYK color with transparency specified '" . $color . "' (converted to RGB without transparency)"; - } - $c = $this->colorModeConverter->cmyk2rgb($c); - $c = [3, $c[1], $c[2], $c[3]]; - } elseif ($this->mpdf->PDFX || $this->mpdf->PDFA && $this->mpdf->restrictColorSpace == 3) { - if ($this->mpdf->PDFA && !$this->mpdf->PDFAauto || $this->mpdf->PDFX && !$this->mpdf->PDFXauto) { - $PDFAXwarnings[] = "CMYK color with transparency specified '" . $color . "' (converted to CMYK without transparency)"; - } - $c = $this->colorModeConverter->cmyk2rgb($c); - $c = [3, $c[1], $c[2], $c[3]]; - } elseif ($this->mpdf->restrictColorSpace == 1) { - $c = $this->colorModeConverter->cmyk2gray($c); - } elseif ($this->mpdf->restrictColorSpace == 2) { - $c = $this->colorModeConverter->cmyk2rgb($c); - } - return $c; - } -} diff --git a/dependencies/mpdf/mpdf/src/Color/NamedColors.php b/dependencies/mpdf/mpdf/src/Color/NamedColors.php deleted file mode 100644 index 063a4cd..0000000 --- a/dependencies/mpdf/mpdf/src/Color/NamedColors.php +++ /dev/null @@ -1,8 +0,0 @@ - '#f0f8ff', 'antiquewhite' => '#faebd7', 'aqua' => '#00ffff', 'aquamarine' => '#7fffd4', 'azure' => '#f0ffff', 'beige' => '#f5f5dc', 'bisque' => '#ffe4c4', 'black' => '#000000', 'blanchedalmond' => '#ffebcd', 'blue' => '#0000ff', 'blueviolet' => '#8a2be2', 'brown' => '#a52a2a', 'burlywood' => '#deb887', 'cadetblue' => '#5f9ea0', 'chartreuse' => '#7fff00', 'chocolate' => '#d2691e', 'coral' => '#ff7f50', 'cornflowerblue' => '#6495ed', 'cornsilk' => '#fff8dc', 'crimson' => '#dc143c', 'cyan' => '#00ffff', 'darkblue' => '#00008b', 'darkcyan' => '#008b8b', 'darkgoldenrod' => '#b8860b', 'darkgray' => '#a9a9a9', 'darkgreen' => '#006400', 'darkgrey' => '#a9a9a9', 'darkkhaki' => '#bdb76b', 'darkmagenta' => '#8b008b', 'darkolivegreen' => '#556b2f', 'darkorange' => '#ff8c00', 'darkorchid' => '#9932cc', 'darkred' => '#8b0000', 'darksalmon' => '#e9967a', 'darkseagreen' => '#8fbc8f', 'darkslateblue' => '#483d8b', 'darkslategray' => '#2f4f4f', 'darkslategrey' => '#2f4f4f', 'darkturquoise' => '#00ced1', 'darkviolet' => '#9400d3', 'deeppink' => '#ff1493', 'deepskyblue' => '#00bfff', 'dimgray' => '#696969', 'dimgrey' => '#696969', 'dodgerblue' => '#1e90ff', 'firebrick' => '#b22222', 'floralwhite' => '#fffaf0', 'forestgreen' => '#228b22', 'fuchsia' => '#ff00ff', 'gainsboro' => '#dcdcdc', 'ghostwhite' => '#f8f8ff', 'gold' => '#ffd700', 'goldenrod' => '#daa520', 'gray' => '#808080', 'green' => '#008000', 'greenyellow' => '#adff2f', 'grey' => '#808080', 'honeydew' => '#f0fff0', 'hotpink' => '#ff69b4', 'indianred' => '#cd5c5c', 'indigo' => '#4b0082', 'ivory' => '#fffff0', 'khaki' => '#f0e68c', 'lavender' => '#e6e6fa', 'lavenderblush' => '#fff0f5', 'lawngreen' => '#7cfc00', 'lemonchiffon' => '#fffacd', 'lightblue' => '#add8e6', 'lightcoral' => '#f08080', 'lightcyan' => '#e0ffff', 'lightgoldenrodyellow' => '#fafad2', 'lightgray' => '#d3d3d3', 'lightgreen' => '#90ee90', 'lightgrey' => '#d3d3d3', 'lightpink' => '#ffb6c1', 'lightsalmon' => '#ffa07a', 'lightseagreen' => '#20b2aa', 'lightskyblue' => '#87cefa', 'lightslategray' => '#778899', 'lightslategrey' => '#778899', 'lightsteelblue' => '#b0c4de', 'lightyellow' => '#ffffe0', 'lime' => '#00ff00', 'limegreen' => '#32cd32', 'linen' => '#faf0e6', 'magenta' => '#ff00ff', 'maroon' => '#800000', 'mediumaquamarine' => '#66cdaa', 'mediumblue' => '#0000cd', 'mediumorchid' => '#ba55d3', 'mediumpurple' => '#9370db', 'mediumseagreen' => '#3cb371', 'mediumslateblue' => '#7b68ee', 'mediumspringgreen' => '#00fa9a', 'mediumturquoise' => '#48d1cc', 'mediumvioletred' => '#c71585', 'midnightblue' => '#191970', 'mintcream' => '#f5fffa', 'mistyrose' => '#ffe4e1', 'moccasin' => '#ffe4b5', 'navajowhite' => '#ffdead', 'navy' => '#000080', 'oldlace' => '#fdf5e6', 'olive' => '#808000', 'olivedrab' => '#6b8e23', 'orange' => '#ffa500', 'orangered' => '#ff4500', 'orchid' => '#da70d6', 'palegoldenrod' => '#eee8aa', 'palegreen' => '#98fb98', 'paleturquoise' => '#afeeee', 'palevioletred' => '#d87093', 'papayawhip' => '#ffefd5', 'peachpuff' => '#ffdab9', 'peru' => '#cd853f', 'pink' => '#ffc0cb', 'plum' => '#dda0dd', 'powderblue' => '#b0e0e6', 'purple' => '#800080', 'red' => '#ff0000', 'rosybrown' => '#bc8f8f', 'royalblue' => '#4169e1', 'saddlebrown' => '#8b4513', 'salmon' => '#fa8072', 'sandybrown' => '#f4a460', 'seagreen' => '#2e8b57', 'seashell' => '#fff5ee', 'sienna' => '#a0522d', 'silver' => '#c0c0c0', 'skyblue' => '#87ceeb', 'slateblue' => '#6a5acd', 'slategray' => '#708090', 'slategrey' => '#708090', 'snow' => '#fffafa', 'springgreen' => '#00ff7f', 'steelblue' => '#4682b4', 'tan' => '#d2b48c', 'teal' => '#008080', 'thistle' => '#d8bfd8', 'tomato' => '#ff6347', 'turquoise' => '#40e0d0', 'violet' => '#ee82ee', 'violetred' => '#d02090', 'wheat' => '#f5deb3', 'white' => '#ffffff', 'whitesmoke' => '#f5f5f5', 'yellow' => '#ffff00', 'yellowgreen' => '#9acd32']; -} diff --git a/dependencies/mpdf/mpdf/src/Config/ConfigVariables.php b/dependencies/mpdf/mpdf/src/Config/ConfigVariables.php deleted file mode 100644 index 79d43d2..0000000 --- a/dependencies/mpdf/mpdf/src/Config/ConfigVariables.php +++ /dev/null @@ -1,447 +0,0 @@ -defaults = [ - // PAGING - 'mirrorMargins' => 0, - 'forcePortraitMargins' => \false, - 'displayDefaultOrientation' => \false, - // Adds date and page info for printer when using @page and "marks:crop," - 'printers_info' => \false, - 'bleedMargin' => 5, - // Distance of cross mark from margin in mm - 'crossMarkMargin' => 5, - // Distance of crop mark from margin in mm - 'cropMarkMargin' => 8, - // Default length in mm of crop line - 'cropMarkLength' => 18, - // Non-printable border at edge of paper sheet in mm - 'nonPrintMargin' => 8, - // 'slice' or 'cloneall' or 'clonebycss' - for forced pagebreaks using - // Automatic pagebreaks (flow in text) are always 'slice' - 'defaultPagebreakType' => 'cloneall', - // Avoid just the border/background-color of the end of a block being moved on to next page - // Allows an (empty) end of block to extend beyond the bottom margin by this amount (mm) - 'margBuffer' => 2, - // PAGE NUMBERING - 'pagenumPrefix' => '', - 'pagenumSuffix' => '', - 'nbpgPrefix' => '', - 'nbpgSuffix' => '', - // 1:Decimal, A:uppercase alphabetic etc. (as for list-style shorthands) - 'defaultPageNumStyle' => '1', - // PAGE NUMBER ALIASES - 'aliasNbPg' => '{nb}', - 'aliasNbPgGp' => '{nbpg}', - // FONTS, LANGUAGES & CHARACTER SETS - // Set maximum size of TTF font file to allow non-subsets - in kB - // Used to avoid a font e.g. Arial Unicode MS (perhaps used for substitutions) ever being fully embedded - // NB Free serif is 1.5MB, most files are <= 600kB (most 200-400KB) - 'maxTTFFilesize' => 2000, - // this value determines whether to subset or not - // 0 - 100' => percent characters - // i.e. if ==40, mPDF will embed whole font if >40% characters in that font - // or embed subset if <40% characters - // 0 will force whole file to be embedded (NO subsetting) - // 100 will force always to subset - // This value is overridden if you set new mPDF('s') - // and/or Can set at runtime - 'percentSubset' => 30, - // Uses Adobe CJK fonts for CJK languages - // default TRUE, only set false if you have defined some available fonts that support CJK - // If true this will not stop use of other CJK fonts if specified by font-family: - // and vice versa i.e. only dictates behaviour when specified by lang="" incl. AutoFont() - 'useAdobeCJK' => \false, - // When embedding full TTF font files, remakes the font file using only core tables - // May improve function with some PostScript printers (GhostScript/GSView) - // Does not work with TTC font collections - // Slightly smaller file, increased processing time - 'repackageTTF' => \false, - // Allows automatic character set conversion if "charset=xxx" detected in html header (WriteHTML() ) - 'allow_charset_conversion' => \true, - // Automatically determine BIDI text in LTR page - 'biDirectional' => \false, - // AUTOMATIC FONT SELECTION - // Based on script and/or language - // mPDF 6.0 (similar to previously using function SetAutoFont() ) - 'autoScriptToLang' => \false, - 'baseScript' => Ucdn::SCRIPT_LATIN, - 'autoVietnamese' => \true, - 'autoArabic' => \true, - // mPDF 6.0 (similar to old useLang) - 'autoLangToFont' => \false, - // Substitute missing characters in UTF-8(multibyte) documents - from other fonts - 'useSubstitutions' => \false, - // Weight for bold text when using an artificial (outline) bold, value 0 (off) - 10 (rec. max) - 'falseBoldWeight' => 5, - // CONFIGURATION - 'allow_output_buffering' => \false, - // Adding mPDFI functions - 'enableImports' => \false, - // Allows top and bottom margins to collapse between block elements - 'collapseBlockMargins' => \true, - // To interpret "px" pixel values in HTML/CSS (see img_dpi below) - 'dpi' => 96, - // Automatically correct for tags where HTML specifies optional end tags e.g. P,LI,DD,TD - // If you are confident input html is valid XHTML, turning this off may make it more reliable(?) - 'allow_html_optional_endtags' => \true, - 'ignore_invalid_utf8' => \false, - // Converts all entities in Text inputs to UTF-8 before encoding - 'text_input_as_HTML' => \false, - // When writing a block element with position:fixed and overflow:auto, mPDF scales it down to fit in the space - // by repeatedly rewriting it and making adjustments. These values give the adjustments used, depending how far out - // the previous guess was. The lower the number, the quicker it will finish, but the less accurate the fit may be. - // FPR1 is for coarse adjustments, and FPR4 for fine adjustments when it is getting closer. - 'incrementFPR1' => 10, - // i.e. will alter by 1/[10]th of width and try again until within closer limits - 'incrementFPR2' => 20, - 'incrementFPR3' => 30, - 'incrementFPR4' => 50, - // i.e. will alter by 1/[50]th of width and try again when it nearly fits - // COLORSPACE - // 1 - allow GRAYSCALE only [convert CMYK/RGB->gray] - // 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] - // 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] - 'restrictColorSpace' => 0, - // PDFX/1-a Compliant files - // true=Forces compliance with PDFX-1a spec - // Cannot be used with 'restrictColorSpace' (i.e. no RGB) - 'PDFX' => \false, - // Overrides warnings making changes when possible to force PDFX1-a compliance - 'PDFXauto' => \false, - // PDFA1-b Compliant files - // true=Forces compliance with PDFA-1b spec - // Can use with 'restrictColorSpace'=3 (for a CMYK file) - // Any other settings, uses RGB profile - 'PDFA' => \false, - // Overrides warnings making changes when possible to force PDFA1-b compliance - 'PDFAauto' => \false, - // Colour profile OutputIntent - // sRGB_IEC61966-2-1 (=default if blank and PDFA), or other added .icc profile - // Must be CMYK for PDFX, or appropriate type for PDFA(RGB or CMYK) - 'ICCProfile' => '', - 'spotColors' => [], - 'spotColorIDs' => [], - // DEBUGGING & DEVELOPERS - 'debug' => \false, - // Checks and reports on errors when parsing TTF files - adds significantly to processing time - 'debugfonts' => \false, - 'showImageErrors' => \false, - // Die and report error if table is too wide to contain whole words - 'table_error_report' => \false, - // Parameter which can be passed to show in error report i.e. chapter number being processed - 'table_error_report_param' => '', - 'title2annots' => \false, - // Automatically convert title="" properties in tags, to annotations - 'annotSize' => 0.5, - // default mm for Adobe annotations - nominal - 'annotMargin' => null, - // default position for Annotations - 'annotOpacity' => 0.5, - // default opacity for Annotations - // BOOKMARKS - // makes into a bookmark as well as internal link target, 1' => just name, 2' => name (p.34) - // Set an optional array to specify appearance of Bookmarks (by level) - // Default values are Black and normal style - 'anchor2Bookmark' => 0, - /* - Example: - 'bookmarkStyles' => array( - 0 => array('color'=> array(0,64,128), 'style'=>'B'), - 1 => array('color'=> array(128,0,0), 'style'=>''), - 2 => array('color'=> array(0,128,0), 'style'=>'I'), - ), - */ - 'bookmarkStyles' => [], - // Specify whether to automatically generate bookmarks from h1 - h6 tags - /* - Define arrays with e.g. the tag=>Bookmark-level - Remember bookmark levels start at 0 - (does not work inside tables) - H1 - H6 must be uppercase - 'h2bookmarks' => array('H1'=>0, 'H2'=>1, 'H3'=>2), - */ - 'h2bookmarks' => [], - // TABLE OF CONTENTS - // Specify whether to automatically generate ToC entries from h1 - h6 tags - /* - Define arrays with e.g. the tag=>ToC-level - Remember ToC levels start at 0 - (does not work inside tables) - Only the default ToC will be used if > 1 ToCs are defined for the document - H1 - H6 must be uppercase - 'h2toc' => array('H1'=>0, 'H2'=>1, 'H3'=>2), - */ - 'h2toc' => [], - // INDEX - /* Specifies whether to repeat the main entry for each subEntry (true suppresses this) - e.g. Mammal:dog ... Mammal:elephant -> - [true] - Mammal - - dog - - elephant - [false] - Mammal, dog - Mammal, elephant - */ - 'indexUseSubentries' => \true, - // CSS & STYLES - // screen, print, or any other CSS @media type (except "all") - 'CSSselectMedia' => 'print', - // PAGE HEADERS & FOOTERS - 'forcePortraitHeaders' => \false, - // Values used if simple FOOTER/HEADER given i.e. not array - 'defaultheaderfontsize' => 8, - // pt - 'defaultheaderfontstyle' => 'BI', - // '', or 'B' or 'I' or 'BI' - 'defaultheaderline' => 1, - // 1 or 0 - line under the header - 'defaultfooterfontsize' => 8, - // pt - 'defaultfooterfontstyle' => 'BI', - // '', or 'B' or 'I' or 'BI' - 'defaultfooterline' => 1, - // 1 or 0 - line over the footer - // spacing between bottom of header and line (if present) - function of fontsize - 'header_line_spacing' => 0.25, - // spacing between bottom of header and line (if present) - function of fontsize - 'footer_line_spacing' => 0.25, - // If 'pad' margin-top sets fixed distance in mm (padding) between bottom of header and top of text. - // If 'stretch' margin-top sets a minimum distance in mm between top of page and top of text, which expands if header is too large to fit. - 'setAutoTopMargin' => \false, - 'setAutoBottomMargin' => \false, - // distance in mm used as padding if 'stretch' mode is used - 'autoMarginPadding' => 2, - // TABLES - // Forces all cells to have same border, background etc. Improves performance - 'simpleTables' => \false, - // Reduce memory usage processing tables (but with increased processing time) - 'packTableData' => \false, - 'ignore_table_percents' => \false, - 'ignore_table_widths' => \false, - // If table width set > page width, force resizing but keep relative sizes - // Also forces respect of cell widths set by % - 'keep_table_proportions' => \true, - // automatically reduce fontsize in table if words would have to split ( not in CJK) - // 0 or false to disable, value (if set) gives maximum factor to reduce fontsize - 'shrink_tables_to_fit' => 1.4, - // If page-break-inside:avoid but cannot fit on full page without - // exceeding autosize, setting this value to true will force respect for autosize, and disable the page-break-inside:avoid - 'tableMinSizePriority' => \false, - // "Keep-with-table" Attempts to keep a

to
tagged heading together with a table which comes immediately after it. - 'use_kwt' => \false, - // Set to TRUE to use table Head iteration counter - 'iterationCounter' => \false, - // Use table border (using this width in mm) when table breaks across pages - // Recommended to use small value e.g. 0.01 - 'splitTableBorderWidth' => 0, - // Allowed characters for text alignment on decimal marks. Additional codes must start with D - // DM - middot U+00B7 - // DA - arabic decimal mark U+066B - 'decimal_align' => ['DP' => '.', 'DC' => ',', 'DM' => "·", 'DA' => "٫", 'DD' => '-'], - // IMAGES - // if image-rendering=='auto', this defines value for image-rendering - // if true, image interpolation shall be performed by a conforming reader - 'interpolateImages' => \false, - // Default dpi to output images if size not defined - // See also above "dpi" - 'img_dpi' => 96, - // Specify whitelisted PHP streams to be used for images - // Useful to add custom streams like `s3` - // Note: for security reasons the `phar` stream cannot be used @see https://github.com/mpdf/mpdf/issues/949 - 'whitelistStreamWrappers' => ['http', 'https', 'file'], - // TEXT SPACING & JUSTIFICATION - // Specify whether kerning should be used when CSS font-kerning="auto" used for HTML, - // Also whether kerning should be used in any direct writing e.g. $mpdf->Text(), - 'useKerning' => \false, - // In justified text,
does not cause the preceding text to be justified in browsers - // Change to true to force justification (as in MS Word) - 'justifyB4br' => \false, - // Number of spaces to replace for a TAB in
 sections
-            // Notepad uses 6, HTML specification recommends 8
-            'tabSpaces' => 8,
-            // Proportion (/1) of space (when justifying margins) to allocate to Word vs. Character
-            'jSWord' => 0.4,
-            // Maximum spacing to allocate to character spacing. (0' => no maximum)
-            'jSmaxChar' => 2,
-            // Maximum character spacing allowed (carried over) when finishing a last line
-            'jSmaxCharLast' => 1,
-            // Maximum word spacing allowed (carried over) when finishing a last line
-            'jSmaxWordLast' => 2,
-            // LINE SPACING & TEXT BASELINE
-            // Use the fixed factor ('normalLineheight') when line-height:normal
-            // Compatible with mPDF versions < 6
-            'useFixedNormalLineHeight' => \false,
-            // Use a fixed ratio ('baselineC') to set the text baseline
-            // Compatible with mPDF versions < 6
-            'useFixedTextBaseline' => \false,
-            // Default Value used for line-height when CSS specified as 'normal' (default)
-            'normalLineheight' => 1.33,
-            // Correction factor applied to lineheight values derived from 'win', 'mac', 'winTypo'
-            'adjustFontDescLineheight' => 1.14,
-            // Small Caps
-            // Factor of 1 to scale capital letters
-            'smCapsScale' => 0.75,
-            // % to stretch small caps horizontally (i.e. 100' => no stretch)
-            'smCapsStretch' => 110,
-            // Line-breaking
-            // The alternative to these next 2 is the use of U+200B Zero-width space
-            // These are only effective if using OTL for the fonts
-            // Use the dictionaries to determine line-breaking in Lao, Khmer and Thai
-            'useDictionaryLBR' => \true,
-            // Use the inbuilt algorithm to determine line-breaking in Tibetan
-            'useTibetanLBR' => \true,
-            // CJK Line-breaking
-            // FALSE=always wrap to next line, TRUE=squeeze or overflow
-            'allowCJKorphans' => \true,
-            // FALSE=squeeze, TRUE=overflow (only some characters, and disabled in tables)
-            'allowCJKoverflow' => \false,
-            // Forces overflowng punctuation to hang outside right margin mPDF 5.6.40
-            'CJKforceend' => \false,
-            // COLUMNS
-            'keepColumns' => \false,
-            // Set to go to the second column only when the first is full of text etc.
-            'max_colH_correction' => 1.15,
-            // Maximum ratio to adjust column height when justifying - too large a value can give ugly results
-            'ColGap' => 5,
-            // LISTS
-            // mPDF 6
-            // 'mpdf' or 'browser' - Specify whether to use mPDF custom method of automatic
-            'list_auto_mode' => 'browser',
-            // indentation of lists, or standard browser-compatible
-            // custom mPDF method is ignored if list-style-position: inside, or image used for marker (or custom U+)
-            // List Indentation when set to 'auto' if using standard browser-compatible method
-            'list_indent_default' => '40px',
-            // List Indentation when set to 'auto' if using mPDF custom method
-            'list_indent_default_mpdf' => '0em',
-            // 1/0 yes/no to indent first level of list, if using mPDF custom method
-            'list_indent_first_level' => 0,
-            // Content to follow a numbered list marker e.g. '.' gives 1. or IV., ')' gives 1) or a)
-            'list_number_suffix' => '.',
-            // To specify a bullet size and offset proportional to the list item's font size:
-            // Browsers use a fixed bullet size and offset
-            // Offset (CSS length) of list marker bullets (disc/circle/square)
-            'list_marker_offset' => '5.5pt',
-            // Size (CSS) of list marker bullets (disc/circle/square)
-            'list_symbol_size' => '3.6pt',
-            // Hyphenation
-            'SHYlanguages' => ['en', 'de', 'es', 'fi', 'fr', 'it', 'nl', 'pl', 'ru', 'sv'],
-            // existing defined patterns
-            'SHYlang' => "en",
-            // 'en','de','es','fi','fr','it','nl','pl','ru','sv'
-            'SHYleftmin' => 2,
-            'SHYrightmin' => 2,
-            'SHYcharmin' => 2,
-            'SHYcharmax' => 10,
-            // ACTIVE FORMS
-            'useActiveForms' => \false,
-            // WATERMARKS
-            'watermarkImgBehind' => \false,
-            'showWatermarkText' => 0,
-            'showWatermarkImage' => 0,
-            'watermarkText' => '',
-            'watermarkAngle' => 45,
-            'watermarkImage' => '',
-            'watermark_font' => '',
-            'watermarkTextAlpha' => 0.2,
-            'watermarkImageAlpha' => 0.2,
-            // Accepts any PDF spec. value: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion
-            // "Multiply" works well for watermark image on top
-            'watermarkImgAlphaBlend' => 'Normal',
-            // BORDERS
-            'autoPadding' => \false,
-            // Automatically increases padding in block elements when border-radius set - if required
-            // SVG
-            // If you wish to use Automatic Font selection within SVG's. change this definition to true.
-            // This selects different fonts for different scripts used in text.
-            // This can be enabled/disabled independently of the use of Automatic Font selection within mPDF generally.
-            // Choice of font is determined by the LangToFont and ScriptToLang classes, the same as for mPDF generally.
-            'svgAutoFont' => \false,
-            // Enable a limited use of classes within SVG  elements by setting this to true.
-            // This allows recognition of a "class" attribute on a  element.
-            // The CSS style for that class should be outside the SVG, and cannot use any other selectors (i.e. only .class {} can be defined)
-            // ';
-                $html = \str_replace('>' . $m[1][$i] . '', $sub, $html);
-            }
-        }
-        $html = \preg_replace('//i', '', $html);
-        $html = \preg_replace('/<\\!\\-\\-.*?\\-\\->/s', ' ', $html);
-        $match = 0;
-        // no match for instance
-        $CSSext = [];
-        // CSS inside external files
-        $regexp = '/]*rel=["\']stylesheet["\'][^>]*href=["\']([^>"\']*)["\'].*?>/si';
-        $x = \preg_match_all($regexp, $html, $cxt);
-        if ($x) {
-            $match += $x;
-            $CSSext = $cxt[1];
-        }
-        $regexp = '/]*href=["\']([^>"\']*)["\'][^>]*?rel=["\']stylesheet["\'].*?>/si';
-        $x = \preg_match_all($regexp, $html, $cxt);
-        if ($x) {
-            $match += $x;
-            $CSSext = \array_merge($CSSext, $cxt[1]);
-        }
-        // look for @import stylesheets
-        // $regexp = '/@import url\([\'\"]{0,1}([^\)]*?\.css)[\'\"]{0,1}\)/si';
-        // $regexp = '/@import url\([\'\"]{0,1}([^\)]*?\.css(\?\S+)?)[\'\"]{0,1}\)/si';
-        $regexp = '/@import url\\([\'\\"]{0,1}(\\S*?\\.css(\\?[^\\s\'\\"]+)?)[\'\\"]{0,1}\\)\\;?/si';
-        $x = \preg_match_all($regexp, $html, $cxt);
-        if ($x) {
-            $match += $x;
-            $CSSext = \array_merge($CSSext, $cxt[1]);
-        }
-        // look for @import without the url()
-        // $regexp = '/@import [\'\"]{0,1}([^;]*?\.css)[\'\"]{0,1}/si';
-        // $regexp = '/@import [\'\"]{0,1}([^;]*?\.css(\?\S+)?)[\'\"]{0,1}/si';
-        $regexp = '/@import (?!url)[\'\\"]{0,1}(\\S*?\\.css(\\?[^\\s\'\\"]+)?)[\'\\"]{0,1}\\;?/si';
-        $x = \preg_match_all($regexp, $html, $cxt);
-        if ($x) {
-            $match += $x;
-            $CSSext = \array_merge($CSSext, $cxt[1]);
-        }
-        $ind = 0;
-        $CSSstr = '';
-        if (!\is_array($this->cascadeCSS)) {
-            $this->cascadeCSS = [];
-        }
-        while ($match) {
-            $path = $CSSext[$ind];
-            $path = \htmlspecialchars_decode($path);
-            // mPDF 6
-            $this->mpdf->GetFullPath($path);
-            // mPDF 5.7.3
-            if (\strpos($path, '//') === \false) {
-                $path = \preg_replace('/\\.css\\?.*$/', '.css', $path);
-            }
-            $CSSextblock = $this->assetFetcher->fetchDataFromPath($path);
-            if (!$CSSextblock) {
-                $path = $this->normalizePath($path);
-                $CSSextblock = $this->assetFetcher->fetchDataFromPath($path);
-            }
-            if ($CSSextblock) {
-                // look for embedded @import stylesheets in other stylesheets
-                // and fix url paths (including background-images) relative to stylesheet
-                // $regexpem = '/@import url\([\'\"]{0,1}(.*?\.css)[\'\"]{0,1}\)/si';
-                $regexpem = '/@import url\\([\'\\"]{0,1}(.*?\\.css(\\?\\S+)?)[\'\\"]{0,1}\\)/si';
-                $xem = \preg_match_all($regexpem, $CSSextblock, $cxtem);
-                $cssBasePath = \preg_replace('/\\/[^\\/]*$/', '', $path) . '/';
-                if ($xem) {
-                    foreach ($cxtem[1] as $cxtembedded) {
-                        // path is relative to original stylesheet!!
-                        $this->mpdf->GetFullPath($cxtembedded, $cssBasePath);
-                        $match++;
-                        $CSSext[] = $cxtembedded;
-                    }
-                }
-                $regexpem = '/(background[^;]*url\\s*\\(\\s*[\'\\"]{0,1})([^\\)\'\\"]*)([\'\\"]{0,1}\\s*\\))/si';
-                $xem = \preg_match_all($regexpem, $CSSextblock, $cxtem);
-                if ($xem) {
-                    $count_cxtem = \count($cxtem[0]);
-                    for ($i = 0; $i < $count_cxtem; $i++) {
-                        // path is relative to original stylesheet!!
-                        $embedded = $cxtem[2][$i];
-                        if (!\preg_match('/^data:image/i', $embedded)) {
-                            // mPDF 5.5.13
-                            $this->mpdf->GetFullPath($embedded, $cssBasePath);
-                            $CSSextblock = \str_replace($cxtem[0][$i], $cxtem[1][$i] . $embedded . $cxtem[3][$i], $CSSextblock);
-                        }
-                    }
-                }
-                $CSSstr .= ' ' . $CSSextblock;
-            }
-            $match--;
-            $ind++;
-        }
-        // CSS as ');
-        } else {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Unable to read default CSS file "%s"', $this->defaultCssFile));
-        }
-        if ($default_font == '') {
-            if ($this->onlyCoreFonts) {
-                if (\in_array(\strtolower($this->defaultCSS['BODY']['FONT-FAMILY']), $this->mono_fonts)) {
-                    $default_font = 'ccourier';
-                } elseif (\in_array(\strtolower($this->defaultCSS['BODY']['FONT-FAMILY']), $this->sans_fonts)) {
-                    $default_font = 'chelvetica';
-                } else {
-                    $default_font = 'ctimes';
-                }
-            } else {
-                $default_font = $this->defaultCSS['BODY']['FONT-FAMILY'];
-            }
-        }
-        if (!$default_font_size) {
-            $mmsize = $this->sizeConverter->convert($this->defaultCSS['BODY']['FONT-SIZE']);
-            $default_font_size = $mmsize * Mpdf::SCALE;
-        }
-        if ($default_font) {
-            $this->SetDefaultFont($default_font);
-        }
-        if ($default_font_size) {
-            $this->SetDefaultFontSize($default_font_size);
-        }
-        $this->SetLineHeight();
-        // lineheight is in mm
-        $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings));
-        $this->HREF = '';
-        $this->oldy = -1;
-        $this->B = 0;
-        $this->I = 0;
-        // mPDF 6  Lists
-        $this->listlvl = 0;
-        $this->listtype = [];
-        $this->listitem = [];
-        $this->listcounter = [];
-        $this->tdbegin = \false;
-        $this->table = [];
-        $this->cell = [];
-        $this->col = -1;
-        $this->row = -1;
-        $this->cellBorderBuffer = [];
-        $this->divbegin = \false;
-        // mPDF 6
-        $this->cellTextAlign = '';
-        $this->cellLineHeight = '';
-        $this->cellLineStackingStrategy = '';
-        $this->cellLineStackingShift = '';
-        $this->divwidth = 0;
-        $this->divheight = 0;
-        $this->spanbgcolor = \false;
-        $this->spanborder = \false;
-        $this->spanborddet = [];
-        $this->blockjustfinished = \false;
-        $this->ignorefollowingspaces = \true;
-        // in order to eliminate exceeding left-side spaces
-        $this->dash_on = \false;
-        $this->dotted_on = \false;
-        $this->textshadow = '';
-        $this->currentfontfamily = '';
-        $this->currentfontsize = '';
-        $this->currentfontstyle = '';
-        $this->colorarray = '';
-        // mPDF 6
-        $this->spanbgcolorarray = '';
-        // mPDF 6
-        $this->textbuffer = [];
-        $this->internallink = [];
-        $this->basepath = "";
-        $this->SetBasePath('');
-        $this->textparam = [];
-        $this->specialcontent = '';
-        $this->selectoption = [];
-    }
-    public function cleanup()
-    {
-        \mb_internal_encoding($this->originalMbEnc);
-        @\mb_regex_encoding($this->originalMbRegexEnc);
-        // this will free up the readers, based on code from Setasign's FpdiTrait::cleanUp()
-        foreach ($this->createdReaders as $id) {
-            $this->readers[$id]->getParser()->getStreamReader()->cleanUp();
-            unset($this->readers[$id]);
-        }
-        $this->createdReaders = [];
-    }
-    private function initConfig(array $config)
-    {
-        $configObject = new ConfigVariables();
-        $defaults = $configObject->getDefaults();
-        $config = \array_intersect_key($config + $defaults, $defaults);
-        foreach ($config as $var => $val) {
-            $this->{$var} = $val;
-        }
-        return $config;
-    }
-    private function initConstructorParams(array $config)
-    {
-        $constructor = ['mode' => '', 'format' => 'A4', 'default_font_size' => 0, 'default_font' => '', 'margin_left' => 15, 'margin_right' => 15, 'margin_top' => 16, 'margin_bottom' => 16, 'margin_header' => 9, 'margin_footer' => 9, 'orientation' => 'P'];
-        foreach ($constructor as $key => $val) {
-            if (isset($config[$key])) {
-                $constructor[$key] = $config[$key];
-            }
-        }
-        return \array_values($constructor);
-    }
-    private function initFontConfig(array $config)
-    {
-        $configObject = new FontVariables();
-        $defaults = $configObject->getDefaults();
-        $config = \array_intersect_key($config + $defaults, $defaults);
-        foreach ($config as $var => $val) {
-            $this->{$var} = $val;
-        }
-        return $config;
-    }
-    function _setPageSize($format, &$orientation)
-    {
-        if (\is_string($format)) {
-            if (empty($format)) {
-                $format = 'A4';
-            }
-            // e.g. A4-L = A4 landscape, A4-P = A4 portrait
-            $orientation = $orientation ?: 'P';
-            if (\preg_match('/([0-9a-zA-Z]*)-([P,L])/i', $format, $m)) {
-                list(, $format, $orientation) = $m;
-            }
-            $format = PageFormat::getSizeFromName($format);
-            $this->fwPt = $format[0];
-            $this->fhPt = $format[1];
-        } else {
-            if (!$format[0] || !$format[1]) {
-                throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid page format: ' . $format[0] . ' ' . $format[1]);
-            }
-            $this->fwPt = $format[0] * Mpdf::SCALE;
-            $this->fhPt = $format[1] * Mpdf::SCALE;
-        }
-        $this->fw = $this->fwPt / Mpdf::SCALE;
-        $this->fh = $this->fhPt / Mpdf::SCALE;
-        // Page orientation
-        $orientation = \strtolower($orientation);
-        if ($orientation === 'p' || $orientation === 'portrait') {
-            $orientation = 'P';
-            $this->wPt = $this->fwPt;
-            $this->hPt = $this->fhPt;
-        } elseif ($orientation === 'l' || $orientation === 'landscape') {
-            $orientation = 'L';
-            $this->wPt = $this->fhPt;
-            $this->hPt = $this->fwPt;
-        } else {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Incorrect orientation: ' . $orientation);
-        }
-        $this->CurOrientation = $orientation;
-        $this->w = $this->wPt / Mpdf::SCALE;
-        $this->h = $this->hPt / Mpdf::SCALE;
-    }
-    function RestrictUnicodeFonts($res)
-    {
-        // $res = array of (Unicode) fonts to restrict to: e.g. norasi|norasiB - language specific
-        if (\count($res)) {
-            // Leave full list of available fonts if passed blank array
-            $this->available_unifonts = $res;
-        } else {
-            $this->available_unifonts = $this->default_available_fonts;
-        }
-        if (\count($this->available_unifonts) == 0) {
-            $this->available_unifonts[] = $this->default_available_fonts[0];
-        }
-        $this->available_unifonts = \array_values($this->available_unifonts);
-    }
-    function setMBencoding($enc)
-    {
-        if ($this->mb_enc != $enc) {
-            $this->mb_enc = $enc;
-            \mb_internal_encoding($this->mb_enc);
-        }
-    }
-    function SetMargins($left, $right, $top)
-    {
-        // Set left, top and right margins
-        $this->lMargin = $left;
-        $this->rMargin = $right;
-        $this->tMargin = $top;
-    }
-    function ResetMargins()
-    {
-        // ReSet left, top margins
-        if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation == 'P' && $this->CurOrientation == 'L') {
-            if ($this->mirrorMargins && $this->page % 2 == 0) {
-                // EVEN
-                $this->tMargin = $this->orig_rMargin;
-                $this->bMargin = $this->orig_lMargin;
-            } else {
-                // ODD	// OR NOT MIRRORING MARGINS/FOOTERS
-                $this->tMargin = $this->orig_lMargin;
-                $this->bMargin = $this->orig_rMargin;
-            }
-            $this->lMargin = $this->DeflMargin;
-            $this->rMargin = $this->DefrMargin;
-            $this->MarginCorrection = 0;
-            $this->PageBreakTrigger = $this->h - $this->bMargin;
-        } elseif ($this->mirrorMargins && $this->page % 2 == 0) {
-            // EVEN
-            $this->lMargin = $this->DefrMargin;
-            $this->rMargin = $this->DeflMargin;
-            $this->MarginCorrection = $this->DefrMargin - $this->DeflMargin;
-        } else {
-            // ODD	// OR NOT MIRRORING MARGINS/FOOTERS
-            $this->lMargin = $this->DeflMargin;
-            $this->rMargin = $this->DefrMargin;
-            if ($this->mirrorMargins) {
-                $this->MarginCorrection = $this->DeflMargin - $this->DefrMargin;
-            }
-        }
-        $this->x = $this->lMargin;
-    }
-    function SetLeftMargin($margin)
-    {
-        // Set left margin
-        $this->lMargin = $margin;
-        if ($this->page > 0 and $this->x < $margin) {
-            $this->x = $margin;
-        }
-    }
-    function SetTopMargin($margin)
-    {
-        // Set top margin
-        $this->tMargin = $margin;
-    }
-    function SetRightMargin($margin)
-    {
-        // Set right margin
-        $this->rMargin = $margin;
-    }
-    function SetAutoPageBreak($auto, $margin = 0)
-    {
-        // Set auto page break mode and triggering margin
-        $this->autoPageBreak = $auto;
-        $this->bMargin = $margin;
-        $this->PageBreakTrigger = $this->h - $margin;
-    }
-    function SetDisplayMode($zoom, $layout = 'continuous')
-    {
-        $allowedZoomModes = ['fullpage', 'fullwidth', 'real', 'default', 'none'];
-        if (\in_array($zoom, $allowedZoomModes, \true) || \is_numeric($zoom)) {
-            $this->ZoomMode = $zoom;
-        } else {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Incorrect zoom display mode: ' . $zoom);
-        }
-        $allowedLayoutModes = ['single', 'continuous', 'two', 'twoleft', 'tworight', 'default'];
-        if (\in_array($layout, $allowedLayoutModes, \true)) {
-            $this->LayoutMode = $layout;
-        } else {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Incorrect layout display mode: ' . $layout);
-        }
-    }
-    function SetCompression($compress)
-    {
-        // Set page compression
-        if (\function_exists('gzcompress')) {
-            $this->compress = $compress;
-        } else {
-            $this->compress = \false;
-        }
-    }
-    function SetTitle($title)
-    {
-        // Title of document // Arrives as UTF-8
-        $this->title = $title;
-    }
-    function SetSubject($subject)
-    {
-        // Subject of document
-        $this->subject = $subject;
-    }
-    function SetAuthor($author)
-    {
-        // Author of document
-        $this->author = $author;
-    }
-    function SetKeywords($keywords)
-    {
-        // Keywords of document
-        $this->keywords = $keywords;
-    }
-    function SetCreator($creator)
-    {
-        // Creator of document
-        $this->creator = $creator;
-    }
-    function AddCustomProperty($key, $value)
-    {
-        $this->customProperties[$key] = $value;
-    }
-    /**
-     * Set one or multiple associated file ("/AF" as required by PDF/A-3)
-     *
-     * param $files is an array of hash containing:
-     *   path: file path on FS
-     *   content: file content
-     *   name: file name (not necessarily the same as the file on FS)
-     *   mime (optional): file mime type (will show up as /Subtype in the PDF)
-     *   description (optional): file description
-     *   AFRelationship (optional): PDF/A-3 AFRelationship (e.g. "Alternative")
-     *
-     * e.g. to associate 1 file:
-     *     [[
-     *         'path' => 'tmp/1234.xml',
-     *         'content' => 'file content',
-     *         'name' => 'public_name.xml',
-     *         'mime' => 'text/xml',
-     *         'description' => 'foo',
-     *         'AFRelationship' => 'Alternative',
-     *     ]]
-     *
-     * @param mixed[] $files Array of arrays of associated files. See above
-     */
-    function SetAssociatedFiles(array $files)
-    {
-        $this->associatedFiles = $files;
-    }
-    function SetAdditionalXmpRdf($s)
-    {
-        $this->additionalXmpRdf = $s;
-    }
-    function SetAnchor2Bookmark($x)
-    {
-        $this->anchor2Bookmark = $x;
-    }
-    public function AliasNbPages($alias = '{nb}')
-    {
-        // Define an alias for total number of pages
-        $this->aliasNbPg = $alias;
-    }
-    public function AliasNbPageGroups($alias = '{nbpg}')
-    {
-        // Define an alias for total number of pages in a group
-        $this->aliasNbPgGp = $alias;
-    }
-    function SetAlpha($alpha, $bm = 'Normal', $return = \false, $mode = 'B')
-    {
-        // alpha: real value from 0 (transparent) to 1 (opaque)
-        // bm:    blend mode, one of the following:
-        //          Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn,
-        //          HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity
-        // set alpha for stroking (CA) and non-stroking (ca) operations
-        // mode determines F (fill) S (stroke) B (both)
-        if (($this->PDFA || $this->PDFX) && $alpha != 1) {
-            if ($this->PDFA && !$this->PDFAauto || $this->PDFX && !$this->PDFXauto) {
-                $this->PDFAXwarnings[] = "Image opacity must be 100% (Opacity changed to 100%)";
-            }
-            $alpha = 1;
-        }
-        $a = ['BM' => '/' . $bm];
-        if ($mode == 'F' || $mode == 'B') {
-            $a['ca'] = $alpha;
-            // mPDF 5.7.2
-        }
-        if ($mode == 'S' || $mode == 'B') {
-            $a['CA'] = $alpha;
-            // mPDF 5.7.2
-        }
-        $gs = $this->AddExtGState($a);
-        if ($return) {
-            return \sprintf('/GS%d gs', $gs);
-        } else {
-            $this->writer->write(\sprintf('/GS%d gs', $gs));
-        }
-    }
-    function AddExtGState($parms)
-    {
-        $n = \count($this->extgstates);
-        // check if graphics state already exists
-        for ($i = 1; $i <= $n; $i++) {
-            if (\count($this->extgstates[$i]['parms']) == \count($parms)) {
-                $same = \true;
-                foreach ($this->extgstates[$i]['parms'] as $k => $v) {
-                    if (!isset($parms[$k]) || $parms[$k] != $v) {
-                        $same = \false;
-                        break;
-                    }
-                }
-                if ($same) {
-                    return $i;
-                }
-            }
-        }
-        $n++;
-        $this->extgstates[$n]['parms'] = $parms;
-        return $n;
-    }
-    function SetVisibility($v)
-    {
-        if (($this->PDFA || $this->PDFX) && $this->visibility != 'visible') {
-            $this->PDFAXwarnings[] = "Cannot set visibility to anything other than full when using PDFA or PDFX";
-            return '';
-        } elseif (!$this->PDFA && !$this->PDFX) {
-            $this->pdf_version = '1.5';
-        }
-        if ($this->visibility != 'visible') {
-            $this->writer->write('EMC');
-            $this->hasOC = \intval($this->hasOC);
-        }
-        if ($v == 'printonly') {
-            $this->writer->write('/OC /OC1 BDC');
-            $this->hasOC = $this->hasOC | 1;
-        } elseif ($v == 'screenonly') {
-            $this->writer->write('/OC /OC2 BDC');
-            $this->hasOC = $this->hasOC | 2;
-        } elseif ($v == 'hidden') {
-            $this->writer->write('/OC /OC3 BDC');
-            $this->hasOC = $this->hasOC | 4;
-        } elseif ($v != 'visible') {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Incorrect visibility: ' . $v);
-        }
-        $this->visibility = $v;
-    }
-    function Open()
-    {
-        // Begin document
-        if ($this->state == 0) {
-            $this->state = 1;
-            if (\false === $this->preambleWritten) {
-                $this->writer->write('%PDF-' . $this->pdf_version);
-                $this->writer->write('%' . \chr(226) . \chr(227) . \chr(207) . \chr(211));
-                // 4 chars > 128 to show binary file
-                $this->preambleWritten = \true;
-            }
-        }
-    }
-    function Close()
-    {
-        // @log Closing last page
-        // Terminate document
-        if ($this->state == 3) {
-            return;
-        }
-        if ($this->page == 0) {
-            $this->AddPage($this->CurOrientation);
-        }
-        if (\count($this->cellBorderBuffer)) {
-            $this->printcellbuffer();
-        }
-        // *TABLES*
-        if ($this->tablebuffer) {
-            $this->printtablebuffer();
-        }
-        /* -- COLUMNS -- */
-        if ($this->ColActive) {
-            $this->SetColumns(0);
-            $this->ColActive = 0;
-            if (\count($this->columnbuffer)) {
-                $this->printcolumnbuffer();
-            }
-        }
-        /* -- END COLUMNS -- */
-        // BODY Backgrounds
-        $s = '';
-        $s .= $this->PrintBodyBackgrounds();
-        $s .= $this->PrintPageBackgrounds();
-        $this->pages[$this->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', "\n" . $s . "\n" . '\\1', $this->pages[$this->page]);
-        $this->pageBackgrounds = [];
-        if ($this->visibility != 'visible') {
-            $this->SetVisibility('visible');
-        }
-        $this->EndLayer();
-        if (!$this->tableOfContents->TOCmark) {
-            // Page footer
-            $this->InFooter = \true;
-            $this->Footer();
-            $this->InFooter = \false;
-        }
-        if ($this->tableOfContents->TOCmark || \count($this->tableOfContents->m_TOC)) {
-            $this->tableOfContents->insertTOC();
-        }
-        // Close page
-        $this->_endpage();
-        // Close document
-        $this->_enddoc();
-    }
-    /* -- BACKGROUNDS -- */
-    function _resizeBackgroundImage($imw, $imh, $cw, $ch, $resize, $repx, $repy, $pba = [], $size = [])
-    {
-        // pba is background positioning area (from CSS background-origin) may not always be set [x,y,w,h]
-        // size is from CSS3 background-size - takes precendence over old resize
-        // $w - absolute length or % or auto or cover | contain
-        // $h - absolute length or % or auto or cover | contain
-        if (isset($pba['w'])) {
-            $cw = $pba['w'];
-        }
-        if (isset($pba['h'])) {
-            $ch = $pba['h'];
-        }
-        $cw = $cw * Mpdf::SCALE;
-        $ch = $ch * Mpdf::SCALE;
-        if (empty($size) && !$resize) {
-            return [$imw, $imh, $repx, $repy];
-        }
-        if (isset($size['w']) && $size['w']) {
-            if ($size['w'] == 'contain') {
-                // Scale the image, while preserving its intrinsic aspect ratio (if any),
-                // to the largest size such that both its width and its height can fit inside the background positioning area.
-                // Same as resize==3
-                $h = $imh * $cw / $imw;
-                $w = $cw;
-                if ($h > $ch) {
-                    $w = $w * $ch / $h;
-                    $h = $ch;
-                }
-            } elseif ($size['w'] == 'cover') {
-                // Scale the image, while preserving its intrinsic aspect ratio (if any),
-                // to the smallest size such that both its width and its height can completely cover the background positioning area.
-                $h = $imh * $cw / $imw;
-                $w = $cw;
-                if ($h < $ch) {
-                    $w = $w * $h / $ch;
-                    $h = $ch;
-                }
-            } else {
-                if (\stristr($size['w'], '%')) {
-                    $size['w'] = (float) $size['w'];
-                    $size['w'] /= 100;
-                    $size['w'] = $cw * $size['w'];
-                }
-                if (\stristr($size['h'], '%')) {
-                    $size['h'] = (float) $size['h'];
-                    $size['h'] /= 100;
-                    $size['h'] = $ch * $size['h'];
-                }
-                if ($size['w'] == 'auto' && $size['h'] == 'auto') {
-                    $w = $imw;
-                    $h = $imh;
-                } elseif ($size['w'] == 'auto' && $size['h'] != 'auto') {
-                    $w = $imw * $size['h'] / $imh;
-                    $h = $size['h'];
-                } elseif ($size['w'] != 'auto' && $size['h'] == 'auto') {
-                    $h = $imh * $size['w'] / $imw;
-                    $w = $size['w'];
-                } else {
-                    $w = $size['w'];
-                    $h = $size['h'];
-                }
-            }
-            return [$w, $h, $repx, $repy];
-        } elseif ($resize == 1 && $imw > $cw) {
-            $h = $imh * $cw / $imw;
-            return [$cw, $h, $repx, $repy];
-        } elseif ($resize == 2 && $imh > $ch) {
-            $w = $imw * $ch / $imh;
-            return [$w, $ch, $repx, $repy];
-        } elseif ($resize == 3) {
-            $w = $imw;
-            $h = $imh;
-            if ($w > $cw) {
-                $h = $h * $cw / $w;
-                $w = $cw;
-            }
-            if ($h > $ch) {
-                $w = $w * $ch / $h;
-                $h = $ch;
-            }
-            return [$w, $h, $repx, $repy];
-        } elseif ($resize == 4) {
-            $h = $imh * $cw / $imw;
-            return [$cw, $h, $repx, $repy];
-        } elseif ($resize == 5) {
-            $w = $imw * $ch / $imh;
-            return [$w, $ch, $repx, $repy];
-        } elseif ($resize == 6) {
-            return [$cw, $ch, $repx, $repy];
-        }
-        return [$imw, $imh, $repx, $repy];
-    }
-    function SetBackground(&$properties, &$maxwidth)
-    {
-        if (isset($properties['BACKGROUND-ORIGIN']) && ($properties['BACKGROUND-ORIGIN'] == 'border-box' || $properties['BACKGROUND-ORIGIN'] == 'content-box')) {
-            $origin = $properties['BACKGROUND-ORIGIN'];
-        } else {
-            $origin = 'padding-box';
-        }
-        if (isset($properties['BACKGROUND-SIZE'])) {
-            if (\stristr($properties['BACKGROUND-SIZE'], 'contain')) {
-                $bsw = $bsh = 'contain';
-            } elseif (\stristr($properties['BACKGROUND-SIZE'], 'cover')) {
-                $bsw = $bsh = 'cover';
-            } else {
-                $bsw = $bsh = 'auto';
-                $sz = \preg_split('/\\s+/', \trim($properties['BACKGROUND-SIZE']));
-                if (\count($sz) == 2) {
-                    $bsw = $sz[0];
-                    $bsh = $sz[1];
-                } else {
-                    $bsw = $sz[0];
-                }
-                if (!\stristr($bsw, '%') && !\stristr($bsw, 'auto')) {
-                    $bsw = $this->sizeConverter->convert($bsw, $maxwidth, $this->FontSize);
-                }
-                if (!\stristr($bsh, '%') && !\stristr($bsh, 'auto')) {
-                    $bsh = $this->sizeConverter->convert($bsh, $maxwidth, $this->FontSize);
-                }
-            }
-            $size = ['w' => $bsw, 'h' => $bsh];
-        } else {
-            $size = \false;
-        }
-        // mPDF 6
-        if (\preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $properties['BACKGROUND-IMAGE'])) {
-            return ['gradient' => $properties['BACKGROUND-IMAGE'], 'origin' => $origin, 'size' => $size];
-        } else {
-            $file = $properties['BACKGROUND-IMAGE'];
-            $sizesarray = $this->Image($file, 0, 0, 0, 0, '', '', \false, \false, \false, \false, \true);
-            if (isset($sizesarray['IMAGE_ID'])) {
-                $image_id = $sizesarray['IMAGE_ID'];
-                $orig_w = $sizesarray['WIDTH'] * Mpdf::SCALE;
-                // in user units i.e. mm
-                $orig_h = $sizesarray['HEIGHT'] * Mpdf::SCALE;
-                // (using $this->img_dpi)
-                if (isset($properties['BACKGROUND-IMAGE-RESOLUTION'])) {
-                    if (\preg_match('/from-image/i', $properties['BACKGROUND-IMAGE-RESOLUTION']) && isset($sizesarray['set-dpi']) && $sizesarray['set-dpi'] > 0) {
-                        $orig_w *= $this->img_dpi / $sizesarray['set-dpi'];
-                        $orig_h *= $this->img_dpi / $sizesarray['set-dpi'];
-                    } elseif (\preg_match('/(\\d+)dpi/i', $properties['BACKGROUND-IMAGE-RESOLUTION'], $m)) {
-                        $dpi = $m[1];
-                        if ($dpi > 0) {
-                            $orig_w *= $this->img_dpi / $dpi;
-                            $orig_h *= $this->img_dpi / $dpi;
-                        }
-                    }
-                }
-                $x_repeat = \true;
-                $y_repeat = \true;
-                if (isset($properties['BACKGROUND-REPEAT'])) {
-                    if ($properties['BACKGROUND-REPEAT'] == 'no-repeat' || $properties['BACKGROUND-REPEAT'] == 'repeat-x') {
-                        $y_repeat = \false;
-                    }
-                    if ($properties['BACKGROUND-REPEAT'] == 'no-repeat' || $properties['BACKGROUND-REPEAT'] == 'repeat-y') {
-                        $x_repeat = \false;
-                    }
-                }
-                $x_pos = 0;
-                $y_pos = 0;
-                if (isset($properties['BACKGROUND-POSITION'])) {
-                    $ppos = \preg_split('/\\s+/', $properties['BACKGROUND-POSITION']);
-                    $x_pos = $ppos[0];
-                    $y_pos = $ppos[1];
-                    if (!\stristr($x_pos, '%')) {
-                        $x_pos = $this->sizeConverter->convert($x_pos, $maxwidth, $this->FontSize);
-                    }
-                    if (!\stristr($y_pos, '%')) {
-                        $y_pos = $this->sizeConverter->convert($y_pos, $maxwidth, $this->FontSize);
-                    }
-                }
-                if (isset($properties['BACKGROUND-IMAGE-RESIZE'])) {
-                    $resize = $properties['BACKGROUND-IMAGE-RESIZE'];
-                } else {
-                    $resize = 0;
-                }
-                if (isset($properties['BACKGROUND-IMAGE-OPACITY'])) {
-                    $opacity = $properties['BACKGROUND-IMAGE-OPACITY'];
-                } else {
-                    $opacity = 1;
-                }
-                return ['image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $sizesarray['itype'], 'origin' => $origin, 'size' => $size];
-            }
-        }
-        return \false;
-    }
-    /* -- END BACKGROUNDS -- */
-    function PrintBodyBackgrounds()
-    {
-        $s = '';
-        $clx = 0;
-        $cly = 0;
-        $clw = $this->w;
-        $clh = $this->h;
-        // If using bleed and trim margins in paged media
-        if ($this->pageDim[$this->page]['outer_width_LR'] || $this->pageDim[$this->page]['outer_width_TB']) {
-            $clx = $this->pageDim[$this->page]['outer_width_LR'] - $this->pageDim[$this->page]['bleedMargin'];
-            $cly = $this->pageDim[$this->page]['outer_width_TB'] - $this->pageDim[$this->page]['bleedMargin'];
-            $clw = $this->w - 2 * $clx;
-            $clh = $this->h - 2 * $cly;
-        }
-        if ($this->bodyBackgroundColor) {
-            $s .= 'q ' . $this->SetFColor($this->bodyBackgroundColor, \true) . "\n";
-            if ($this->bodyBackgroundColor[0] == 5) {
-                // RGBa
-                $s .= $this->SetAlpha(\ord($this->bodyBackgroundColor[4]) / 100, 'Normal', \true, 'F') . "\n";
-            } elseif ($this->bodyBackgroundColor[0] == 6) {
-                // CMYKa
-                $s .= $this->SetAlpha(\ord($this->bodyBackgroundColor[5]) / 100, 'Normal', \true, 'F') . "\n";
-            }
-            $s .= \sprintf('%.3F %.3F %.3F %.3F re f Q', $clx * Mpdf::SCALE, $cly * Mpdf::SCALE, $clw * Mpdf::SCALE, $clh * Mpdf::SCALE) . "\n";
-        }
-        /* -- BACKGROUNDS -- */
-        if ($this->bodyBackgroundGradient) {
-            $g = $this->gradient->parseBackgroundGradient($this->bodyBackgroundGradient);
-            if ($g) {
-                $s .= $this->gradient->Gradient($clx, $cly, $clw, $clh, isset($g['gradtype']) ? $g['gradtype'] : null, $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], \true);
-            }
-        }
-        if ($this->bodyBackgroundImage) {
-            if (isset($this->bodyBackgroundImage['gradient']) && $this->bodyBackgroundImage['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->bodyBackgroundImage['gradient'])) {
-                $g = $this->gradient->parseMozGradient($this->bodyBackgroundImage['gradient']);
-                if ($g) {
-                    $s .= $this->gradient->Gradient($clx, $cly, $clw, $clh, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], \true);
-                }
-            } elseif ($this->bodyBackgroundImage['image_id']) {
-                // Background pattern
-                $n = \count($this->patterns) + 1;
-                // If using resize, uses TrimBox (not including the bleed)
-                list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($this->bodyBackgroundImage['orig_w'], $this->bodyBackgroundImage['orig_h'], $clw, $clh, $this->bodyBackgroundImage['resize'], $this->bodyBackgroundImage['x_repeat'], $this->bodyBackgroundImage['y_repeat']);
-                $this->patterns[$n] = ['x' => $clx, 'y' => $cly, 'w' => $clw, 'h' => $clh, 'pgh' => $this->h, 'image_id' => $this->bodyBackgroundImage['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $this->bodyBackgroundImage['x_pos'], 'y_pos' => $this->bodyBackgroundImage['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $this->bodyBackgroundImage['itype']];
-                if (($this->bodyBackgroundImage['opacity'] > 0 || $this->bodyBackgroundImage['opacity'] === '0') && $this->bodyBackgroundImage['opacity'] < 1) {
-                    $opac = $this->SetAlpha($this->bodyBackgroundImage['opacity'], 'Normal', \true);
-                } else {
-                    $opac = '';
-                }
-                $s .= \sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $clx * Mpdf::SCALE, $cly * Mpdf::SCALE, $clw * Mpdf::SCALE, $clh * Mpdf::SCALE) . "\n";
-            }
-        }
-        /* -- END BACKGROUNDS -- */
-        return $s;
-    }
-    function _setClippingPath($clx, $cly, $clw, $clh)
-    {
-        $s = ' q 0 w ';
-        // Line width=0
-        $s .= \sprintf('%.3F %.3F m ', $clx * Mpdf::SCALE, ($this->h - $cly) * Mpdf::SCALE);
-        // start point TL before the arc
-        $s .= \sprintf('%.3F %.3F l ', $clx * Mpdf::SCALE, ($this->h - ($cly + $clh)) * Mpdf::SCALE);
-        // line to BL
-        $s .= \sprintf('%.3F %.3F l ', ($clx + $clw) * Mpdf::SCALE, ($this->h - ($cly + $clh)) * Mpdf::SCALE);
-        // line to BR
-        $s .= \sprintf('%.3F %.3F l ', ($clx + $clw) * Mpdf::SCALE, ($this->h - $cly) * Mpdf::SCALE);
-        // line to TR
-        $s .= \sprintf('%.3F %.3F l ', $clx * Mpdf::SCALE, ($this->h - $cly) * Mpdf::SCALE);
-        // line to TL
-        $s .= ' W n ';
-        // Ends path no-op & Sets the clipping path
-        return $s;
-    }
-    function PrintPageBackgrounds($adjustmenty = 0)
-    {
-        $s = '';
-        \ksort($this->pageBackgrounds);
-        foreach ($this->pageBackgrounds as $bl => $pbs) {
-            foreach ($pbs as $pb) {
-                if (!isset($pb['image_id']) && !isset($pb['gradient']) || isset($pb['shadowonly'])) {
-                    // Background colour or boxshadow
-                    if ($pb['z-index'] > 0) {
-                        $this->current_layer = $pb['z-index'];
-                        $s .= "\n" . '/OCBZ-index /ZI' . $pb['z-index'] . ' BDC' . "\n";
-                    }
-                    if ($pb['visibility'] != 'visible') {
-                        if ($pb['visibility'] == 'printonly') {
-                            $s .= '/OC /OC1 BDC' . "\n";
-                        } elseif ($pb['visibility'] == 'screenonly') {
-                            $s .= '/OC /OC2 BDC' . "\n";
-                        } elseif ($pb['visibility'] == 'hidden') {
-                            $s .= '/OC /OC3 BDC' . "\n";
-                        }
-                    }
-                    // Box shadow
-                    if (isset($pb['shadow']) && $pb['shadow']) {
-                        $s .= $pb['shadow'] . "\n";
-                    }
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= $pb['clippath'] . "\n";
-                    }
-                    $s .= 'q ' . $this->SetFColor($pb['col'], \true) . "\n";
-                    if ($pb['col'] && $pb['col'][0] === '5') {
-                        // RGBa
-                        $s .= $this->SetAlpha(\ord($pb['col'][4]) / 100, 'Normal', \true, 'F') . "\n";
-                    } elseif ($pb['col'] && $pb['col'][0] === '6') {
-                        // CMYKa
-                        $s .= $this->SetAlpha(\ord($pb['col'][5]) / 100, 'Normal', \true, 'F') . "\n";
-                    }
-                    $s .= \sprintf('%.3F %.3F %.3F %.3F re f Q', $pb['x'] * Mpdf::SCALE, ($this->h - $pb['y']) * Mpdf::SCALE, $pb['w'] * Mpdf::SCALE, -$pb['h'] * Mpdf::SCALE) . "\n";
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= 'Q' . "\n";
-                    }
-                    if ($pb['visibility'] != 'visible') {
-                        $s .= 'EMC' . "\n";
-                    }
-                    if ($pb['z-index'] > 0) {
-                        $s .= "\n" . 'EMCBZ-index' . "\n";
-                        $this->current_layer = 0;
-                    }
-                }
-            }
-            /* -- BACKGROUNDS -- */
-            foreach ($pbs as $pb) {
-                if (isset($pb['gradient']) && $pb['gradient'] || isset($pb['image_id']) && $pb['image_id']) {
-                    if ($pb['z-index'] > 0) {
-                        $this->current_layer = $pb['z-index'];
-                        $s .= "\n" . '/OCGZ-index /ZI' . $pb['z-index'] . ' BDC' . "\n";
-                    }
-                    if ($pb['visibility'] != 'visible') {
-                        if ($pb['visibility'] == 'printonly') {
-                            $s .= '/OC /OC1 BDC' . "\n";
-                        } elseif ($pb['visibility'] == 'screenonly') {
-                            $s .= '/OC /OC2 BDC' . "\n";
-                        } elseif ($pb['visibility'] == 'hidden') {
-                            $s .= '/OC /OC3 BDC' . "\n";
-                        }
-                    }
-                }
-                if (isset($pb['gradient']) && $pb['gradient']) {
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= $pb['clippath'] . "\n";
-                    }
-                    $s .= $this->gradient->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], \true);
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= 'Q' . "\n";
-                    }
-                } elseif (isset($pb['image_id']) && $pb['image_id']) {
-                    // Background Image
-                    $pb['y'] -= $adjustmenty;
-                    $pb['h'] += $adjustmenty;
-                    $n = \count($this->patterns) + 1;
-                    list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat'], $pb['bpa'], $pb['size']);
-                    $this->patterns[$n] = ['x' => $pb['x'], 'y' => $pb['y'], 'w' => $pb['w'], 'h' => $pb['h'], 'pgh' => $this->h, 'image_id' => $pb['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $pb['x_pos'], 'y_pos' => $pb['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $pb['itype'], 'bpa' => $pb['bpa']];
-                    $x = $pb['x'] * Mpdf::SCALE;
-                    $y = ($this->h - $pb['y']) * Mpdf::SCALE;
-                    $w = $pb['w'] * Mpdf::SCALE;
-                    $h = -$pb['h'] * Mpdf::SCALE;
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= $pb['clippath'] . "\n";
-                    }
-                    if ($this->writingHTMLfooter || $this->writingHTMLheader) {
-                        // Write each (tiles) image rather than use as a pattern
-                        $iw = $pb['orig_w'] / Mpdf::SCALE;
-                        $ih = $pb['orig_h'] / Mpdf::SCALE;
-                        $w = $pb['w'];
-                        $h = $pb['h'];
-                        $x0 = $pb['x'];
-                        $y0 = $pb['y'];
-                        if (isset($pb['bpa']) && $pb['bpa']) {
-                            $w = $pb['bpa']['w'];
-                            $h = $pb['bpa']['h'];
-                            $x0 = $pb['bpa']['x'];
-                            $y0 = $pb['bpa']['y'];
-                        }
-                        if (isset($pb['size']['w']) && $pb['size']['w']) {
-                            $size = $pb['size'];
-                            if ($size['w'] == 'contain') {
-                                // Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest
-                                // size such that both its width and its height can fit inside the background positioning area.
-                                // Same as resize==3
-                                $ih = $ih * $pb['bpa']['w'] / $iw;
-                                $iw = $pb['bpa']['w'];
-                                if ($ih > $pb['bpa']['h']) {
-                                    $iw = $iw * $pb['bpa']['h'] / $ih;
-                                    $ih = $pb['bpa']['h'];
-                                }
-                            } elseif ($size['w'] == 'cover') {
-                                // Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest
-                                // size such that both its width and its height can completely cover the background positioning area.
-                                $ih = $ih * $pb['bpa']['w'] / $iw;
-                                $iw = $pb['bpa']['w'];
-                                if ($ih < $pb['bpa']['h']) {
-                                    $iw = $iw * $ih / $pb['bpa']['h'];
-                                    $ih = $pb['bpa']['h'];
-                                }
-                            } else {
-                                if (NumericString::containsPercentChar($size['w'])) {
-                                    $size['w'] = NumericString::removePercentChar($size['w']);
-                                    $size['w'] /= 100;
-                                    $size['w'] = $pb['bpa']['w'] * $size['w'];
-                                }
-                                if (NumericString::containsPercentChar($size['h'])) {
-                                    $size['h'] = NumericString::removePercentChar($size['h']);
-                                    $size['h'] /= 100;
-                                    $size['h'] = $pb['bpa']['h'] * $size['h'];
-                                }
-                                if ($size['w'] == 'auto' && $size['h'] == 'auto') {
-                                    $iw = $iw;
-                                    $ih = $ih;
-                                } elseif ($size['w'] == 'auto' && $size['h'] != 'auto') {
-                                    $iw = $iw * $size['h'] / $ih;
-                                    $ih = $size['h'];
-                                } elseif ($size['w'] != 'auto' && $size['h'] == 'auto') {
-                                    $ih = $ih * $size['w'] / $iw;
-                                    $iw = $size['w'];
-                                } else {
-                                    $iw = $size['w'];
-                                    $ih = $size['h'];
-                                }
-                            }
-                        }
-                        // Number to repeat
-                        if ($pb['x_repeat']) {
-                            $nx = \ceil($pb['w'] / $iw) + 1;
-                        } else {
-                            $nx = 1;
-                        }
-                        if ($pb['y_repeat']) {
-                            $ny = \ceil($pb['h'] / $ih) + 1;
-                        } else {
-                            $ny = 1;
-                        }
-                        $x_pos = $pb['x_pos'];
-                        if (\stristr($x_pos, '%')) {
-                            $x_pos = (float) $x_pos;
-                            $x_pos /= 100;
-                            $x_pos = $pb['bpa']['w'] * $x_pos - $iw * $x_pos;
-                        }
-                        $y_pos = $pb['y_pos'];
-                        if (\stristr($y_pos, '%')) {
-                            $y_pos = (float) $y_pos;
-                            $y_pos /= 100;
-                            $y_pos = $pb['bpa']['h'] * $y_pos - $ih * $y_pos;
-                        }
-                        if ($nx > 1) {
-                            while ($x_pos > $pb['x'] - $pb['bpa']['x']) {
-                                $x_pos -= $iw;
-                            }
-                        }
-                        if ($ny > 1) {
-                            while ($y_pos > $pb['y'] - $pb['bpa']['y']) {
-                                $y_pos -= $ih;
-                            }
-                        }
-                        for ($xi = 0; $xi < $nx; $xi++) {
-                            for ($yi = 0; $yi < $ny; $yi++) {
-                                $x = $x0 + $x_pos + $iw * $xi;
-                                $y = $y0 + $y_pos + $ih * $yi;
-                                if ($pb['opacity'] > 0 && $pb['opacity'] < 1) {
-                                    $opac = $this->SetAlpha($pb['opacity'], 'Normal', \true);
-                                } else {
-                                    $opac = '';
-                                }
-                                $s .= \sprintf("q %s %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $opac, $iw * Mpdf::SCALE, $ih * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $ih)) * Mpdf::SCALE, $pb['image_id']) . "\n";
-                            }
-                        }
-                    } else {
-                        if (($pb['opacity'] > 0 || $pb['opacity'] === '0') && $pb['opacity'] < 1) {
-                            $opac = $this->SetAlpha($pb['opacity'], 'Normal', \true);
-                        } else {
-                            $opac = '';
-                        }
-                        $s .= \sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) . "\n";
-                    }
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= 'Q' . "\n";
-                    }
-                }
-                if (isset($pb['gradient']) && $pb['gradient'] || isset($pb['image_id']) && $pb['image_id']) {
-                    if ($pb['visibility'] != 'visible') {
-                        $s .= 'EMC' . "\n";
-                    }
-                    if ($pb['z-index'] > 0) {
-                        $s .= "\n" . 'EMCGZ-index' . "\n";
-                        $this->current_layer = 0;
-                    }
-                }
-            }
-            /* -- END BACKGROUNDS -- */
-        }
-        return $s;
-    }
-    function PrintTableBackgrounds($adjustmenty = 0)
-    {
-        $s = '';
-        /* -- BACKGROUNDS -- */
-        \ksort($this->tableBackgrounds);
-        foreach ($this->tableBackgrounds as $bl => $pbs) {
-            foreach ($pbs as $pb) {
-                if ((!isset($pb['gradient']) || !$pb['gradient']) && (!isset($pb['image_id']) || !$pb['image_id'])) {
-                    $s .= 'q ' . $this->SetFColor($pb['col'], \true) . "\n";
-                    if ($pb['col'][0] == 5) {
-                        // RGBa
-                        $s .= $this->SetAlpha(\ord($pb['col'][4]) / 100, 'Normal', \true, 'F') . "\n";
-                    } elseif ($pb['col'][0] == 6) {
-                        // CMYKa
-                        $s .= $this->SetAlpha(\ord($pb['col'][5]) / 100, 'Normal', \true, 'F') . "\n";
-                    }
-                    $s .= \sprintf('%.3F %.3F %.3F %.3F re %s Q', $pb['x'] * Mpdf::SCALE, ($this->h - $pb['y']) * Mpdf::SCALE, $pb['w'] * Mpdf::SCALE, -$pb['h'] * Mpdf::SCALE, 'f') . "\n";
-                }
-                if (isset($pb['gradient']) && $pb['gradient']) {
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= $pb['clippath'] . "\n";
-                    }
-                    $s .= $this->gradient->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], \true);
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= 'Q' . "\n";
-                    }
-                }
-                if (isset($pb['image_id']) && $pb['image_id']) {
-                    // Background pattern
-                    $pb['y'] -= $adjustmenty;
-                    $pb['h'] += $adjustmenty;
-                    $n = \count($this->patterns) + 1;
-                    list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat']);
-                    $this->patterns[$n] = ['x' => $pb['x'], 'y' => $pb['y'], 'w' => $pb['w'], 'h' => $pb['h'], 'pgh' => $this->h, 'image_id' => $pb['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $pb['x_pos'], 'y_pos' => $pb['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $pb['itype']];
-                    $x = $pb['x'] * Mpdf::SCALE;
-                    $y = ($this->h - $pb['y']) * Mpdf::SCALE;
-                    $w = $pb['w'] * Mpdf::SCALE;
-                    $h = -$pb['h'] * Mpdf::SCALE;
-                    // mPDF 5.7.3
-                    if (($this->writingHTMLfooter || $this->writingHTMLheader) && (!isset($pb['clippath']) || $pb['clippath'] == '')) {
-                        // Set clipping path
-                        $pb['clippath'] = \sprintf(' q 0 w %.3F %.3F m %.3F %.3F l %.3F %.3F l %.3F %.3F l %.3F %.3F l W n ', $x, $y, $x, $y + $h, $x + $w, $y + $h, $x + $w, $y, $x, $y);
-                    }
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= $pb['clippath'] . "\n";
-                    }
-                    // mPDF 5.7.3
-                    if ($this->writingHTMLfooter || $this->writingHTMLheader) {
-                        // Write each (tiles) image rather than use as a pattern
-                        $iw = $pb['orig_w'] / Mpdf::SCALE;
-                        $ih = $pb['orig_h'] / Mpdf::SCALE;
-                        $w = $pb['w'];
-                        $h = $pb['h'];
-                        $x0 = $pb['x'];
-                        $y0 = $pb['y'];
-                        if (isset($pb['bpa']) && $pb['bpa']) {
-                            $w = $pb['bpa']['w'];
-                            $h = $pb['bpa']['h'];
-                            $x0 = $pb['bpa']['x'];
-                            $y0 = $pb['bpa']['y'];
-                        } else {
-                            $pb['bpa'] = ['x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h];
-                        }
-                        if (isset($pb['size']['w']) && $pb['size']['w']) {
-                            $size = $pb['size'];
-                            if ($size['w'] == 'contain') {
-                                // Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.
-                                // Same as resize==3
-                                $ih = $ih * $pb['bpa']['w'] / $iw;
-                                $iw = $pb['bpa']['w'];
-                                if ($ih > $pb['bpa']['h']) {
-                                    $iw = $iw * $pb['bpa']['h'] / $ih;
-                                    $ih = $pb['bpa']['h'];
-                                }
-                            } elseif ($size['w'] == 'cover') {
-                                // Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.
-                                $ih = $ih * $pb['bpa']['w'] / $iw;
-                                $iw = $pb['bpa']['w'];
-                                if ($ih < $pb['bpa']['h']) {
-                                    $iw = $iw * $ih / $pb['bpa']['h'];
-                                    $ih = $pb['bpa']['h'];
-                                }
-                            } else {
-                                if (NumericString::containsPercentChar($size['w'])) {
-                                    $size['w'] = NumericString::removePercentChar($size['w']);
-                                    $size['w'] /= 100;
-                                    $size['w'] = $pb['bpa']['w'] * $size['w'];
-                                }
-                                if (NumericString::containsPercentChar($size['h'])) {
-                                    $size['h'] = NumericString::removePercentChar($size['h']);
-                                    $size['h'] /= 100;
-                                    $size['h'] = $pb['bpa']['h'] * $size['h'];
-                                }
-                                if ($size['w'] == 'auto' && $size['h'] == 'auto') {
-                                    $iw = $iw;
-                                    $ih = $ih;
-                                } elseif ($size['w'] == 'auto' && $size['h'] != 'auto') {
-                                    $iw = $iw * $size['h'] / $ih;
-                                    $ih = $size['h'];
-                                } elseif ($size['w'] != 'auto' && $size['h'] == 'auto') {
-                                    $ih = $ih * $size['w'] / $iw;
-                                    $iw = $size['w'];
-                                } else {
-                                    $iw = $size['w'];
-                                    $ih = $size['h'];
-                                }
-                            }
-                        }
-                        // Number to repeat
-                        if (isset($pb['x_repeat']) && $pb['x_repeat']) {
-                            $nx = \ceil($pb['w'] / $iw) + 1;
-                        } else {
-                            $nx = 1;
-                        }
-                        if (isset($pb['y_repeat']) && $pb['y_repeat']) {
-                            $ny = \ceil($pb['h'] / $ih) + 1;
-                        } else {
-                            $ny = 1;
-                        }
-                        $x_pos = $pb['x_pos'];
-                        if (NumericString::containsPercentChar($x_pos)) {
-                            $x_pos = NumericString::removePercentChar($x_pos);
-                            $x_pos /= 100;
-                            $x_pos = $pb['bpa']['w'] * $x_pos - $iw * $x_pos;
-                        }
-                        $y_pos = $pb['y_pos'];
-                        if (NumericString::containsPercentChar($y_pos)) {
-                            $y_pos = NumericString::removePercentChar($y_pos);
-                            $y_pos /= 100;
-                            $y_pos = $pb['bpa']['h'] * $y_pos - $ih * $y_pos;
-                        }
-                        if ($nx > 1) {
-                            while ($x_pos > $pb['x'] - $pb['bpa']['x']) {
-                                $x_pos -= $iw;
-                            }
-                        }
-                        if ($ny > 1) {
-                            while ($y_pos > $pb['y'] - $pb['bpa']['y']) {
-                                $y_pos -= $ih;
-                            }
-                        }
-                        for ($xi = 0; $xi < $nx; $xi++) {
-                            for ($yi = 0; $yi < $ny; $yi++) {
-                                $x = $x0 + $x_pos + $iw * $xi;
-                                $y = $y0 + $y_pos + $ih * $yi;
-                                if ($pb['opacity'] > 0 && $pb['opacity'] < 1) {
-                                    $opac = $this->SetAlpha($pb['opacity'], 'Normal', \true);
-                                } else {
-                                    $opac = '';
-                                }
-                                $s .= \sprintf("q %s %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $opac, $iw * Mpdf::SCALE, $ih * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $ih)) * Mpdf::SCALE, $pb['image_id']) . "\n";
-                            }
-                        }
-                    } else {
-                        if (($pb['opacity'] > 0 || $pb['opacity'] === '0') && $pb['opacity'] < 1) {
-                            $opac = $this->SetAlpha($pb['opacity'], 'Normal', \true);
-                        } else {
-                            $opac = '';
-                        }
-                        $s .= \sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) . "\n";
-                    }
-                    if (isset($pb['clippath']) && $pb['clippath']) {
-                        $s .= 'Q' . "\n";
-                    }
-                }
-            }
-        }
-        /* -- END BACKGROUNDS -- */
-        return $s;
-    }
-    function BeginLayer($id)
-    {
-        if ($this->current_layer > 0) {
-            $this->EndLayer();
-        }
-        if ($id < 1) {
-            return \false;
-        }
-        if (!isset($this->layers[$id])) {
-            $this->layers[$id] = ['name' => 'Layer ' . $id];
-            if ($this->PDFA || $this->PDFX) {
-                $this->PDFAXwarnings[] = "Cannot use layers when using PDFA or PDFX";
-                return '';
-            } elseif (!$this->PDFA && !$this->PDFX) {
-                $this->pdf_version = '1.5';
-            }
-        }
-        $this->current_layer = $id;
-        $this->writer->write('/OCZ-index /ZI' . $id . ' BDC');
-        $this->pageoutput[$this->page] = [];
-    }
-    function EndLayer()
-    {
-        if ($this->current_layer > 0) {
-            $this->writer->write('EMCZ-index');
-            $this->current_layer = 0;
-        }
-    }
-    function AddPageByArray($a)
-    {
-        if (!\is_array($a)) {
-            $a = [];
-        }
-        $orientation = isset($a['orientation']) ? $a['orientation'] : '';
-        $condition = isset($a['condition']) ? $a['condition'] : (isset($a['type']) ? $a['type'] : '');
-        $resetpagenum = isset($a['resetpagenum']) ? $a['resetpagenum'] : '';
-        $pagenumstyle = isset($a['pagenumstyle']) ? $a['pagenumstyle'] : '';
-        $suppress = isset($a['suppress']) ? $a['suppress'] : '';
-        $mgl = isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : '');
-        $mgr = isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : '');
-        $mgt = isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : '');
-        $mgb = isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : '');
-        $mgh = isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : '');
-        $mgf = isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : '');
-        $ohname = isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : '');
-        $ehname = isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : '');
-        $ofname = isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : '');
-        $efname = isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : '');
-        $ohvalue = isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0);
-        $ehvalue = isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0);
-        $ofvalue = isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0);
-        $efvalue = isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0);
-        $pagesel = isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : '');
-        $newformat = isset($a['newformat']) ? $a['newformat'] : (isset($a['sheet-size']) ? $a['sheet-size'] : '');
-        $this->AddPage($orientation, $condition, $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat);
-    }
-    // mPDF 6 pagebreaktype
-    function _preForcedPagebreak($pagebreaktype)
-    {
-        if ($pagebreaktype == 'cloneall') {
-            // Close any open block tags
-            $arr = [];
-            $ai = 0;
-            for ($b = $this->blklvl; $b > 0; $b--) {
-                $this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai);
-            }
-            if ($this->blklvl == 0 && !empty($this->textbuffer)) {
-                // Output previously buffered content
-                $this->printbuffer($this->textbuffer, 1);
-                $this->textbuffer = [];
-            }
-        } elseif ($pagebreaktype == 'clonebycss') {
-            // Close open block tags whilst box-decoration-break==clone
-            $arr = [];
-            $ai = 0;
-            for ($b = $this->blklvl; $b > 0; $b--) {
-                if (isset($this->blk[$b]['box_decoration_break']) && $this->blk[$b]['box_decoration_break'] == 'clone') {
-                    $this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai);
-                } else {
-                    if ($b == $this->blklvl && !empty($this->textbuffer)) {
-                        // Output previously buffered content
-                        $this->printbuffer($this->textbuffer, 1);
-                        $this->textbuffer = [];
-                    }
-                    break;
-                }
-            }
-        } elseif (!empty($this->textbuffer)) {
-            // Output previously buffered content
-            $this->printbuffer($this->textbuffer, 1);
-            $this->textbuffer = [];
-        }
-    }
-    // mPDF 6 pagebreaktype
-    function _postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl)
-    {
-        if ($pagebreaktype == 'cloneall') {
-            $this->blk = [];
-            $this->blk[0] = $save_blk[0];
-            // Re-open block tags
-            $this->blklvl = 0;
-            $arr = [];
-            $i = 0;
-            for ($b = 1; $b <= $save_blklvl; $b++) {
-                $this->tag->OpenTag($save_blk[$b]['tag'], $save_blk[$b]['attr'], $arr, $i);
-            }
-        } elseif ($pagebreaktype == 'clonebycss') {
-            $this->blk = [];
-            $this->blk[0] = $save_blk[0];
-            // Don't re-open tags for lowest level elements - so need to do some adjustments
-            for ($b = 1; $b <= $this->blklvl; $b++) {
-                $this->blk[$b] = $save_blk[$b];
-                $this->blk[$b]['startpage'] = 0;
-                $this->blk[$b]['y0'] = $this->y;
-                // ?? $this->tMargin
-                if (($this->page - $startpage) % 2) {
-                    if (isset($this->blk[$b]['x0'])) {
-                        $this->blk[$b]['x0'] += $this->MarginCorrection;
-                    } else {
-                        $this->blk[$b]['x0'] = $this->MarginCorrection;
-                    }
-                }
-                // for Float DIV
-                $this->blk[$b]['marginCorrected'][$this->page] = \true;
-            }
-            // Re-open block tags for any that have box_decoration_break==clone
-            $arr = [];
-            $i = 0;
-            for ($b = $this->blklvl + 1; $b <= $save_blklvl; $b++) {
-                if ($b < $this->blklvl) {
-                    $this->lastblocklevelchange = -1;
-                }
-                $this->tag->OpenTag($save_blk[$b]['tag'], $save_blk[$b]['attr'], $arr, $i);
-            }
-            if ($this->blk[$this->blklvl]['box_decoration_break'] != 'clone') {
-                $this->lastblocklevelchange = -1;
-            }
-        } else {
-            $this->lastblocklevelchange = -1;
-        }
-    }
-    function AddPage($orientation = '', $condition = '', $resetpagenum = '', $pagenumstyle = '', $suppress = '', $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $pagesel = '', $newformat = '')
-    {
-        /* -- CSS-FLOAT -- */
-        // Float DIV
-        // Cannot do with columns on, or if any change in page orientation/margins etc.
-        // If next page already exists - i.e background /headers and footers already written
-        if ($this->state > 0 && $this->page < \count($this->pages)) {
-            $bak_cml = $this->cMarginL;
-            $bak_cmr = $this->cMarginR;
-            $bak_dw = $this->divwidth;
-            // Paint Div Border if necessary
-            if ($this->blklvl > 0) {
-                $save_tr = $this->table_rotate;
-                // *TABLES*
-                $this->table_rotate = 0;
-                // *TABLES*
-                if (isset($this->blk[$this->blklvl]['y0']) && $this->y == $this->blk[$this->blklvl]['y0']) {
-                    $this->blk[$this->blklvl]['startpage']++;
-                }
-                if (isset($this->blk[$this->blklvl]['y0']) && $this->y > $this->blk[$this->blklvl]['y0'] || $this->flowingBlockAttr['is_table']) {
-                    $toplvl = $this->blklvl;
-                } else {
-                    $toplvl = $this->blklvl - 1;
-                }
-                $sy = $this->y;
-                for ($bl = 1; $bl <= $toplvl; $bl++) {
-                    $this->PaintDivBB('pagebottom', 0, $bl);
-                }
-                $this->y = $sy;
-                $this->table_rotate = $save_tr;
-                // *TABLES*
-            }
-            $s = $this->PrintPageBackgrounds();
-            // Writes after the marker so not overwritten later by page background etc.
-            $this->pages[$this->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]);
-            $this->pageBackgrounds = [];
-            $family = $this->FontFamily;
-            $style = $this->FontStyle;
-            $size = $this->FontSizePt;
-            $lw = $this->LineWidth;
-            $dc = $this->DrawColor;
-            $fc = $this->FillColor;
-            $tc = $this->TextColor;
-            $cf = $this->ColorFlag;
-            $this->printfloatbuffer();
-            // Move to next page
-            $this->page++;
-            $this->ResetMargins();
-            $this->SetAutoPageBreak($this->autoPageBreak, $this->bMargin);
-            $this->x = $this->lMargin;
-            $this->y = $this->tMargin;
-            $this->FontFamily = '';
-            $this->writer->write('2 J');
-            $this->LineWidth = $lw;
-            $this->writer->write(\sprintf('%.3F w', $lw * Mpdf::SCALE));
-            if ($family) {
-                $this->SetFont($family, $style, $size, \true, \true);
-            }
-            $this->DrawColor = $dc;
-            if ($dc != $this->defDrawColor) {
-                $this->writer->write($dc);
-            }
-            $this->FillColor = $fc;
-            if ($fc != $this->defFillColor) {
-                $this->writer->write($fc);
-            }
-            $this->TextColor = $tc;
-            $this->ColorFlag = $cf;
-            for ($bl = 1; $bl <= $this->blklvl; $bl++) {
-                $this->blk[$bl]['y0'] = $this->y;
-                // Don't correct more than once for background DIV containing a Float
-                if (!isset($this->blk[$bl]['marginCorrected'][$this->page])) {
-                    if (isset($this->blk[$bl]['x0'])) {
-                        $this->blk[$bl]['x0'] += $this->MarginCorrection;
-                    } else {
-                        $this->blk[$bl]['x0'] = $this->MarginCorrection;
-                    }
-                }
-                $this->blk[$bl]['marginCorrected'][$this->page] = \true;
-            }
-            $this->cMarginL = $bak_cml;
-            $this->cMarginR = $bak_cmr;
-            $this->divwidth = $bak_dw;
-            return '';
-        }
-        /* -- END CSS-FLOAT -- */
-        // Start a new page
-        if ($this->state == 0) {
-            $this->Open();
-        }
-        $bak_cml = $this->cMarginL;
-        $bak_cmr = $this->cMarginR;
-        $bak_dw = $this->divwidth;
-        $bak_lh = $this->lineheight;
-        $orientation = \substr(\strtoupper($orientation), 0, 1);
-        $condition = \strtoupper($condition);
-        if ($condition == 'E') {
-            // only adds new page if needed to create an Even page
-            if (!$this->mirrorMargins || $this->page % 2 == 0) {
-                return \false;
-            }
-        } elseif ($condition == 'O') {
-            // only adds new page if needed to create an Odd page
-            if (!$this->mirrorMargins || $this->page % 2 == 1) {
-                return \false;
-            }
-        } elseif ($condition == 'NEXT-EVEN') {
-            // always adds at least one new page to create an Even page
-            if (!$this->mirrorMargins) {
-                $condition = '';
-            } else {
-                if ($pagesel) {
-                    $pbch = $pagesel;
-                    $pagesel = '';
-                } else {
-                    $pbch = \false;
-                }
-                // *CSS-PAGE*
-                $this->AddPage($this->CurOrientation, 'O');
-                $this->extrapagebreak = \true;
-                // mPDF 6 pagebreaktype
-                if ($pbch) {
-                    $pagesel = $pbch;
-                }
-                // *CSS-PAGE*
-                $condition = '';
-            }
-        } elseif ($condition == 'NEXT-ODD') {
-            // always adds at least one new page to create an Odd page
-            if (!$this->mirrorMargins) {
-                $condition = '';
-            } else {
-                if ($pagesel) {
-                    $pbch = $pagesel;
-                    $pagesel = '';
-                } else {
-                    $pbch = \false;
-                }
-                // *CSS-PAGE*
-                $this->AddPage($this->CurOrientation, 'E');
-                $this->extrapagebreak = \true;
-                // mPDF 6 pagebreaktype
-                if ($pbch) {
-                    $pagesel = $pbch;
-                }
-                // *CSS-PAGE*
-                $condition = '';
-            }
-        }
-        if ($resetpagenum || $pagenumstyle || $suppress) {
-            $this->PageNumSubstitutions[] = ['from' => $this->page + 1, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress];
-        }
-        $save_tr = $this->table_rotate;
-        // *TABLES*
-        $this->table_rotate = 0;
-        // *TABLES*
-        $save_kwt = $this->kwt;
-        $this->kwt = 0;
-        $save_layer = $this->current_layer;
-        $save_vis = $this->visibility;
-        if ($this->visibility != 'visible') {
-            $this->SetVisibility('visible');
-        }
-        $this->EndLayer();
-        // Paint Div Border if necessary
-        // PAINTS BACKGROUND COLOUR OR BORDERS for DIV - DISABLED FOR COLUMNS (cf. AcceptPageBreak) AT PRESENT in ->PaintDivBB
-        if (!$this->ColActive && $this->blklvl > 0) {
-            if (isset($this->blk[$this->blklvl]['y0']) && $this->y == $this->blk[$this->blklvl]['y0'] && !$this->extrapagebreak) {
-                // mPDF 6 pagebreaktype
-                if (isset($this->blk[$this->blklvl]['startpage'])) {
-                    $this->blk[$this->blklvl]['startpage']++;
-                } else {
-                    $this->blk[$this->blklvl]['startpage'] = 1;
-                }
-            }
-            if (isset($this->blk[$this->blklvl]['y0']) && $this->y > $this->blk[$this->blklvl]['y0'] || $this->flowingBlockAttr['is_table'] || $this->extrapagebreak) {
-                $toplvl = $this->blklvl;
-            } else {
-                $toplvl = $this->blklvl - 1;
-            }
-            $sy = $this->y;
-            for ($bl = 1; $bl <= $toplvl; $bl++) {
-                if (isset($this->blk[$bl]['z-index']) && $this->blk[$bl]['z-index'] > 0) {
-                    $this->BeginLayer($this->blk[$bl]['z-index']);
-                }
-                if (isset($this->blk[$bl]['visibility']) && $this->blk[$bl]['visibility'] && $this->blk[$bl]['visibility'] != 'visible') {
-                    $this->SetVisibility($this->blk[$bl]['visibility']);
-                }
-                $this->PaintDivBB('pagebottom', 0, $bl);
-            }
-            $this->y = $sy;
-            // RESET block y0 and x0 - see below
-        }
-        $this->extrapagebreak = \false;
-        // mPDF 6 pagebreaktype
-        if ($this->visibility != 'visible') {
-            $this->SetVisibility('visible');
-        }
-        $this->EndLayer();
-        // BODY Backgrounds
-        if ($this->page > 0) {
-            $s = '';
-            $s .= $this->PrintBodyBackgrounds();
-            $s .= $this->PrintPageBackgrounds();
-            $this->pages[$this->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', "\n" . $s . "\n" . '\\1', $this->pages[$this->page]);
-            $this->pageBackgrounds = [];
-        }
-        $save_kt = $this->keep_block_together;
-        $this->keep_block_together = 0;
-        $save_cols = \false;
-        /* -- COLUMNS -- */
-        if ($this->ColActive) {
-            $save_cols = \true;
-            $save_nbcol = $this->NbCol;
-            // other values of gap and vAlign will not change by setting Columns off
-            $this->SetColumns(0);
-        }
-        /* -- END COLUMNS -- */
-        $family = $this->FontFamily;
-        $style = $this->FontStyle;
-        $size = $this->FontSizePt;
-        $this->ColumnAdjust = \true;
-        // enables column height adjustment for the page
-        $lw = $this->LineWidth;
-        $dc = $this->DrawColor;
-        $fc = $this->FillColor;
-        $tc = $this->TextColor;
-        $cf = $this->ColorFlag;
-        if ($this->page > 0) {
-            // Page footer
-            $this->InFooter = \true;
-            $this->Reset();
-            $this->pageoutput[$this->page] = [];
-            $this->Footer();
-            // Close page
-            $this->_endpage();
-        }
-        // Start new page
-        $pageBeforeNewPage = $this->page;
-        $this->_beginpage($orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat);
-        $isNewPage = $pageBeforeNewPage !== $this->page;
-        if ($this->docTemplate) {
-            $currentReaderId = $this->currentReaderId;
-            $pagecount = $this->setSourceFile($this->docTemplate);
-            if ($this->page - $this->docTemplateStart > $pagecount) {
-                if ($this->docTemplateContinue) {
-                    if ($this->docTemplateContinue2pages && $pagecount >= 2 && 0 === $this->page % 2) {
-                        $tplIdx = $this->importPage($pagecount - 1);
-                        $this->useTemplate($tplIdx);
-                    } else {
-                        $tplIdx = $this->importPage($pagecount);
-                        $this->useTemplate($tplIdx);
-                    }
-                }
-            } else {
-                $tplIdx = $this->importPage($this->page - $this->docTemplateStart);
-                $this->useTemplate($tplIdx);
-            }
-            $this->currentReaderId = $currentReaderId;
-        }
-        if ($this->pageTemplate) {
-            $this->useTemplate($this->pageTemplate);
-        }
-        // Only add the headers if it's a new page
-        if ($isNewPage) {
-            // Tiling Patterns
-            $this->writer->write('___PAGE___START' . $this->uniqstr);
-            $this->writer->write('___BACKGROUND___PATTERNS' . $this->uniqstr);
-            $this->writer->write('___HEADER___MARKER' . $this->uniqstr);
-        }
-        $this->pageBackgrounds = [];
-        // Set line cap style to square
-        $this->SetLineCap(2);
-        // Set line width
-        $this->LineWidth = $lw;
-        $this->writer->write(\sprintf('%.3F w', $lw * Mpdf::SCALE));
-        // Set font
-        if ($family) {
-            $this->SetFont($family, $style, $size, \true, \true);
-            // forces write
-        }
-        // Set colors
-        $this->DrawColor = $dc;
-        if ($dc != $this->defDrawColor) {
-            $this->writer->write($dc);
-        }
-        $this->FillColor = $fc;
-        if ($fc != $this->defFillColor) {
-            $this->writer->write($fc);
-        }
-        $this->TextColor = $tc;
-        $this->ColorFlag = $cf;
-        // Page header
-        $this->Header();
-        // Restore line width
-        if ($this->LineWidth != $lw) {
-            $this->LineWidth = $lw;
-            $this->writer->write(\sprintf('%.3F w', $lw * Mpdf::SCALE));
-        }
-        // Restore font
-        if ($family) {
-            $this->SetFont($family, $style, $size, \true, \true);
-            // forces write
-        }
-        // Restore colors
-        if ($this->DrawColor != $dc) {
-            $this->DrawColor = $dc;
-            $this->writer->write($dc);
-        }
-        if ($this->FillColor != $fc) {
-            $this->FillColor = $fc;
-            $this->writer->write($fc);
-        }
-        $this->TextColor = $tc;
-        $this->ColorFlag = $cf;
-        $this->InFooter = \false;
-        if ($save_layer > 0) {
-            $this->BeginLayer($save_layer);
-        }
-        if ($save_vis != 'visible') {
-            $this->SetVisibility($save_vis);
-        }
-        /* -- COLUMNS -- */
-        if ($save_cols) {
-            // Restore columns
-            $this->SetColumns($save_nbcol, $this->colvAlign, $this->ColGap);
-        }
-        if ($this->ColActive) {
-            $this->SetCol(0);
-        }
-        /* -- END COLUMNS -- */
-        // RESET BLOCK BORDER TOP
-        if (!$this->ColActive) {
-            for ($bl = 1; $bl <= $this->blklvl; $bl++) {
-                $this->blk[$bl]['y0'] = $this->y;
-                if (isset($this->blk[$bl]['x0'])) {
-                    $this->blk[$bl]['x0'] += $this->MarginCorrection;
-                } else {
-                    $this->blk[$bl]['x0'] = $this->MarginCorrection;
-                }
-                // Added mPDF 3.0 Float DIV
-                $this->blk[$bl]['marginCorrected'][$this->page] = \true;
-            }
-        }
-        $this->table_rotate = $save_tr;
-        // *TABLES*
-        $this->kwt = $save_kwt;
-        $this->keep_block_together = $save_kt;
-        $this->cMarginL = $bak_cml;
-        $this->cMarginR = $bak_cmr;
-        $this->divwidth = $bak_dw;
-        $this->lineheight = $bak_lh;
-    }
-    /**
-     * Get current page number
-     *
-     * @return int
-     */
-    function PageNo()
-    {
-        return $this->page;
-    }
-    function AddSpotColorsFromFile($file)
-    {
-        $colors = @\file($file);
-        if (!$colors) {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Cannot load spot colors file - " . $file);
-        }
-        foreach ($colors as $sc) {
-            list($name, $c, $m, $y, $k) = \preg_split("/\t/", $sc);
-            $c = \intval($c);
-            $m = \intval($m);
-            $y = \intval($y);
-            $k = \intval($k);
-            $this->AddSpotColor($name, $c, $m, $y, $k);
-        }
-    }
-    function AddSpotColor($name, $c, $m, $y, $k)
-    {
-        $name = \strtoupper(\trim($name));
-        if (!isset($this->spotColors[$name])) {
-            $i = \count($this->spotColors) + 1;
-            $this->spotColors[$name] = ['i' => $i, 'c' => $c, 'm' => $m, 'y' => $y, 'k' => $k];
-            $this->spotColorIDs[$i] = $name;
-        }
-    }
-    function SetColor($col, $type = '')
-    {
-        $out = '';
-        if (!$col) {
-            return '';
-        }
-        // mPDF 6
-        if ($col[0] == 3 || $col[0] == 5) {
-            // RGB / RGBa
-            $out = \sprintf('%.3F %.3F %.3F rg', \ord($col[1]) / 255, \ord($col[2]) / 255, \ord($col[3]) / 255);
-        } elseif ($col[0] == 1) {
-            // GRAYSCALE
-            $out = \sprintf('%.3F g', \ord($col[1]) / 255);
-        } elseif ($col[0] == 2) {
-            // SPOT COLOR
-            $out = \sprintf('/CS%d cs %.3F scn', \ord($col[1]), \ord($col[2]) / 100);
-        } elseif ($col[0] == 4 || $col[0] == 6) {
-            // CMYK / CMYKa
-            $out = \sprintf('%.3F %.3F %.3F %.3F k', \ord($col[1]) / 100, \ord($col[2]) / 100, \ord($col[3]) / 100, \ord($col[4]) / 100);
-        }
-        if ($type == 'Draw') {
-            $out = \strtoupper($out);
-        } elseif ($type == 'CodeOnly') {
-            $out = \preg_replace('/\\s(rg|g|k)/', '', $out);
-        }
-        return $out;
-    }
-    function SetDColor($col, $return = \false)
-    {
-        $out = $this->SetColor($col, 'Draw');
-        if ($return) {
-            return $out;
-        }
-        if ($out == '') {
-            return '';
-        }
-        $this->DrawColor = $out;
-        if ($this->page > 0 && (isset($this->pageoutput[$this->page]['DrawColor']) && $this->pageoutput[$this->page]['DrawColor'] != $this->DrawColor || !isset($this->pageoutput[$this->page]['DrawColor']))) {
-            $this->writer->write($this->DrawColor);
-        }
-        $this->pageoutput[$this->page]['DrawColor'] = $this->DrawColor;
-    }
-    function SetFColor($col, $return = \false)
-    {
-        $out = $this->SetColor($col, 'Fill');
-        if ($return) {
-            return $out;
-        }
-        if ($out == '') {
-            return '';
-        }
-        $this->FillColor = $out;
-        $this->ColorFlag = $out != $this->TextColor;
-        if ($this->page > 0 && (isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor || !isset($this->pageoutput[$this->page]['FillColor']))) {
-            $this->writer->write($this->FillColor);
-        }
-        $this->pageoutput[$this->page]['FillColor'] = $this->FillColor;
-    }
-    function SetTColor($col, $return = \false)
-    {
-        $out = $this->SetColor($col, 'Text');
-        if ($return) {
-            return $out;
-        }
-        if ($out == '') {
-            return '';
-        }
-        $this->TextColor = $out;
-        $this->ColorFlag = $this->FillColor != $out;
-    }
-    function SetDrawColor($r, $g = -1, $b = -1, $col4 = -1, $return = \false)
-    {
-        // Set color for all stroking operations
-        $col = [];
-        if ($r == 0 and $g == 0 and $b == 0 && $col4 == -1 or $g == -1) {
-            $col = $this->colorConverter->convert($r, $this->PDFAXwarnings);
-        } elseif ($col4 == -1) {
-            $col = $this->colorConverter->convert('rgb(' . $r . ',' . $g . ',' . $b . ')', $this->PDFAXwarnings);
-        } else {
-            $col = $this->colorConverter->convert('cmyk(' . $r . ',' . $g . ',' . $b . ',' . $col4 . ')', $this->PDFAXwarnings);
-        }
-        $out = $this->SetDColor($col, $return);
-        return $out;
-    }
-    function SetFillColor($r, $g = -1, $b = -1, $col4 = -1, $return = \false)
-    {
-        // Set color for all filling operations
-        $col = [];
-        if ($r == 0 and $g == 0 and $b == 0 && $col4 == -1 or $g == -1) {
-            $col = $this->colorConverter->convert($r, $this->PDFAXwarnings);
-        } elseif ($col4 == -1) {
-            $col = $this->colorConverter->convert('rgb(' . $r . ',' . $g . ',' . $b . ')', $this->PDFAXwarnings);
-        } else {
-            $col = $this->colorConverter->convert('cmyk(' . $r . ',' . $g . ',' . $b . ',' . $col4 . ')', $this->PDFAXwarnings);
-        }
-        $out = $this->SetFColor($col, $return);
-        return $out;
-    }
-    function SetTextColor($r, $g = -1, $b = -1, $col4 = -1, $return = \false)
-    {
-        // Set color for text
-        $col = [];
-        if ($r == 0 and $g == 0 and $b == 0 && $col4 == -1 or $g == -1) {
-            $col = $this->colorConverter->convert($r, $this->PDFAXwarnings);
-        } elseif ($col4 == -1) {
-            $col = $this->colorConverter->convert('rgb(' . $r . ',' . $g . ',' . $b . ')', $this->PDFAXwarnings);
-        } else {
-            $col = $this->colorConverter->convert('cmyk(' . $r . ',' . $g . ',' . $b . ',' . $col4 . ')', $this->PDFAXwarnings);
-        }
-        $out = $this->SetTColor($col, $return);
-        return $out;
-    }
-    function _getCharWidth(&$cw, $u, $isdef = \true)
-    {
-        $w = 0;
-        if ($u == 0) {
-            $w = \false;
-        } elseif (isset($cw[$u * 2 + 1])) {
-            $w = (\ord($cw[$u * 2]) << 8) + \ord($cw[$u * 2 + 1]);
-        }
-        if ($w == 65535) {
-            return 0;
-        } elseif ($w) {
-            return $w;
-        } elseif ($isdef) {
-            return \false;
-        } else {
-            return 0;
-        }
-    }
-    function _charDefined(&$cw, $u)
-    {
-        $w = 0;
-        if ($u == 0) {
-            return \false;
-        }
-        if (isset($cw[$u * 2 + 1])) {
-            $w = (\ord($cw[$u * 2]) << 8) + \ord($cw[$u * 2 + 1]);
-        }
-        return (bool) $w;
-    }
-    function GetCharWidthCore($c)
-    {
-        // Get width of a single character in the current Core font
-        $c = (string) $c;
-        $w = 0;
-        // Soft Hyphens chr(173)
-        if ($c == \chr(173) && $this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') {
-            return 0;
-        } elseif ($this->textvar & TextVars::FC_SMALLCAPS && isset($this->upperCase[\ord($c)])) {
-            // mPDF 5.7.1
-            $charw = $this->CurrentFont['cw'][\chr($this->upperCase[\ord($c)])];
-            if ($charw !== \false) {
-                $charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
-                $w += $charw;
-            }
-        } elseif (isset($this->CurrentFont['cw'][$c])) {
-            $w += $this->CurrentFont['cw'][$c];
-        } elseif (isset($this->CurrentFont['cw'][\ord($c)])) {
-            $w += $this->CurrentFont['cw'][\ord($c)];
-        }
-        $w *= $this->FontSize / 1000;
-        if ($this->minwSpacing || $this->fixedlSpacing) {
-            if ($c == ' ') {
-                $nb_spaces = 1;
-            } else {
-                $nb_spaces = 0;
-            }
-            $w += $this->fixedlSpacing + $nb_spaces * $this->minwSpacing;
-        }
-        return $w;
-    }
-    function GetCharWidthNonCore($c, $addSubset = \true)
-    {
-        // Get width of a single character in the current Non-Core font
-        $c = (string) $c;
-        $w = 0;
-        $unicode = $this->UTF8StringToArray($c, $addSubset);
-        $char = $unicode[0];
-        /* -- CJK-FONTS -- */
-        if ($this->CurrentFont['type'] == 'Type0') {
-            // CJK Adobe fonts
-            if ($char == 173) {
-                return 0;
-            } elseif (isset($this->CurrentFont['cw'][$char])) {
-                $w += $this->CurrentFont['cw'][$char];
-            } elseif (isset($this->CurrentFont['MissingWidth'])) {
-                $w += $this->CurrentFont['MissingWidth'];
-            } else {
-                $w += 500;
-            }
-        } else {
-            /* -- END CJK-FONTS -- */
-            if ($char == 173) {
-                return 0;
-            } elseif ($this->textvar & TextVars::FC_SMALLCAPS && isset($this->upperCase[$char])) {
-                // mPDF 5.7.1
-                $charw = $this->_getCharWidth($this->CurrentFont['cw'], $this->upperCase[$char]);
-                if ($charw !== \false) {
-                    $charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
-                    $w += $charw;
-                } elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
-                    $w += $this->CurrentFont['desc']['MissingWidth'];
-                } elseif (isset($this->CurrentFont['MissingWidth'])) {
-                    $w += $this->CurrentFont['MissingWidth'];
-                } else {
-                    $w += 500;
-                }
-            } else {
-                $charw = $this->_getCharWidth($this->CurrentFont['cw'], $char);
-                if ($charw !== \false) {
-                    $w += $charw;
-                } elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
-                    $w += $this->CurrentFont['desc']['MissingWidth'];
-                } elseif (isset($this->CurrentFont['MissingWidth'])) {
-                    $w += $this->CurrentFont['MissingWidth'];
-                } else {
-                    $w += 500;
-                }
-            }
-        }
-        // *CJK-FONTS*
-        $w *= $this->FontSize / 1000;
-        if ($this->minwSpacing || $this->fixedlSpacing) {
-            if ($c == ' ') {
-                $nb_spaces = 1;
-            } else {
-                $nb_spaces = 0;
-            }
-            $w += $this->fixedlSpacing + $nb_spaces * $this->minwSpacing;
-        }
-        return $w;
-    }
-    function GetCharWidth($c, $addSubset = \true)
-    {
-        if (!$this->usingCoreFont) {
-            return $this->GetCharWidthNonCore($c, $addSubset);
-        } else {
-            return $this->GetCharWidthCore($c);
-        }
-    }
-    function GetStringWidth($s, $addSubset = \true, $OTLdata = \false, $textvar = 0, $includeKashida = \false)
-    {
-        // mPDF 5.7.1
-        // Get width of a string in the current font
-        $s = (string) $s;
-        $cw =& $this->CurrentFont['cw'];
-        $w = 0;
-        $kerning = 0;
-        $lastchar = 0;
-        $nb_carac = 0;
-        $nb_spaces = 0;
-        $kashida = 0;
-        // mPDF ITERATION
-        if ($this->iterationCounter) {
-            $s = \preg_replace('/{iteration ([a-zA-Z0-9_]+)}/', '\\1', $s);
-        }
-        if (!$this->usingCoreFont) {
-            $discards = \substr_count($s, "­");
-            // mPDF 6 soft hyphens [U+00AD]
-            $unicode = $this->UTF8StringToArray($s, $addSubset);
-            if ($this->minwSpacing || $this->fixedlSpacing) {
-                $nb_spaces = \mb_substr_count($s, ' ', $this->mb_enc);
-                $nb_carac = \count($unicode) - $discards;
-                // mPDF 6
-                // mPDF 5.7.1
-                // Use GPOS OTL
-                if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) {
-                    if (isset($OTLdata['group']) && $OTLdata['group']) {
-                        $nb_carac -= \substr_count($OTLdata['group'], 'M');
-                    }
-                }
-            }
-            /* -- CJK-FONTS -- */
-            if ($this->CurrentFont['type'] == 'Type0') {
-                // CJK Adobe fonts
-                foreach ($unicode as $char) {
-                    if ($char == 0xad) {
-                        continue;
-                    }
-                    // mPDF 6 soft hyphens [U+00AD]
-                    if (isset($cw[$char])) {
-                        $w += $cw[$char];
-                    } elseif (isset($this->CurrentFont['MissingWidth'])) {
-                        $w += $this->CurrentFont['MissingWidth'];
-                    } else {
-                        $w += 500;
-                    }
-                }
-            } else {
-                /* -- END CJK-FONTS -- */
-                foreach ($unicode as $i => $char) {
-                    if ($char == 0xad) {
-                        continue;
-                    }
-                    // mPDF 6 soft hyphens [U+00AD]
-                    if ($textvar & TextVars::FC_SMALLCAPS && isset($this->upperCase[$char])) {
-                        $charw = $this->_getCharWidth($cw, $this->upperCase[$char]);
-                        if ($charw !== \false) {
-                            $charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
-                            $w += $charw;
-                        } elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
-                            $w += $this->CurrentFont['desc']['MissingWidth'];
-                        } elseif (isset($this->CurrentFont['MissingWidth'])) {
-                            $w += $this->CurrentFont['MissingWidth'];
-                        } else {
-                            $w += 500;
-                        }
-                    } else {
-                        $charw = $this->_getCharWidth($cw, $char);
-                        if ($charw !== \false) {
-                            $w += $charw;
-                        } elseif (isset($this->CurrentFont['desc']['MissingWidth'])) {
-                            $w += $this->CurrentFont['desc']['MissingWidth'];
-                        } elseif (isset($this->CurrentFont['MissingWidth'])) {
-                            $w += $this->CurrentFont['MissingWidth'];
-                        } else {
-                            $w += 500;
-                        }
-                        // mPDF 5.7.1
-                        // Use GPOS OTL
-                        // ...GetStringWidth...
-                        if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff && !empty($OTLdata)) {
-                            if (isset($OTLdata['GPOSinfo'][$i]['wDir']) && $OTLdata['GPOSinfo'][$i]['wDir'] == 'RTL') {
-                                if (isset($OTLdata['GPOSinfo'][$i]['XAdvanceR']) && $OTLdata['GPOSinfo'][$i]['XAdvanceR']) {
-                                    $w += $OTLdata['GPOSinfo'][$i]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm'];
-                                }
-                            } else {
-                                if (isset($OTLdata['GPOSinfo'][$i]['XAdvanceL']) && $OTLdata['GPOSinfo'][$i]['XAdvanceL']) {
-                                    $w += $OTLdata['GPOSinfo'][$i]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm'];
-                                }
-                            }
-                            // Kashida from GPOS
-                            // Kashida is set as an absolute length value (already set as a proportion based on useKashida %)
-                            if ($includeKashida && isset($OTLdata['GPOSinfo'][$i]['kashida_space']) && $OTLdata['GPOSinfo'][$i]['kashida_space']) {
-                                $kashida += $OTLdata['GPOSinfo'][$i]['kashida_space'];
-                            }
-                        }
-                        if ($textvar & TextVars::FC_KERNING && $lastchar) {
-                            if (isset($this->CurrentFont['kerninfo'][$lastchar][$char])) {
-                                $kerning += $this->CurrentFont['kerninfo'][$lastchar][$char];
-                            }
-                        }
-                        $lastchar = $char;
-                    }
-                }
-            }
-            // *CJK-FONTS*
-        } else {
-            if ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') {
-                $s = \str_replace(\chr(173), '', $s);
-            }
-            $nb_carac = $l = \strlen($s);
-            if ($this->minwSpacing || $this->fixedlSpacing) {
-                $nb_spaces = \substr_count($s, ' ');
-            }
-            for ($i = 0; $i < $l; $i++) {
-                if ($textvar & TextVars::FC_SMALLCAPS && isset($this->upperCase[\ord($s[$i])])) {
-                    // mPDF 5.7.1
-                    $charw = $cw[\chr($this->upperCase[\ord($s[$i])])];
-                    if ($charw !== \false) {
-                        $charw = $charw * $this->smCapsScale * $this->smCapsStretch / 100;
-                        $w += $charw;
-                    }
-                } elseif (isset($cw[$s[$i]])) {
-                    $w += $cw[$s[$i]];
-                } elseif (isset($cw[\ord($s[$i])])) {
-                    $w += $cw[\ord($s[$i])];
-                }
-                if ($textvar & TextVars::FC_KERNING && $i > 0) {
-                    // mPDF 5.7.1
-                    if (isset($this->CurrentFont['kerninfo'][$s[$i - 1]][$s[$i]])) {
-                        $kerning += $this->CurrentFont['kerninfo'][$s[$i - 1]][$s[$i]];
-                    }
-                }
-            }
-        }
-        unset($cw);
-        if ($textvar & TextVars::FC_KERNING) {
-            $w += $kerning;
-        }
-        // mPDF 5.7.1
-        $w *= $this->FontSize / 1000;
-        $w += ($nb_carac + $nb_spaces) * $this->fixedlSpacing + $nb_spaces * $this->minwSpacing;
-        $w += $kashida / Mpdf::SCALE;
-        return $w;
-    }
-    function SetLineWidth($width)
-    {
-        // Set line width
-        $this->LineWidth = $width;
-        $lwout = \sprintf('%.3F w', $width * Mpdf::SCALE);
-        if ($this->page > 0 && (isset($this->pageoutput[$this->page]['LineWidth']) && $this->pageoutput[$this->page]['LineWidth'] != $lwout || !isset($this->pageoutput[$this->page]['LineWidth']))) {
-            $this->writer->write($lwout);
-        }
-        $this->pageoutput[$this->page]['LineWidth'] = $lwout;
-    }
-    function Line($x1, $y1, $x2, $y2)
-    {
-        // Draw a line
-        $this->writer->write(\sprintf('%.3F %.3F m %.3F %.3F l S', $x1 * Mpdf::SCALE, ($this->h - $y1) * Mpdf::SCALE, $x2 * Mpdf::SCALE, ($this->h - $y2) * Mpdf::SCALE));
-    }
-    function Arrow($x1, $y1, $x2, $y2, $headsize = 3, $fill = 'B', $angle = 25)
-    {
-        // F == fill // S == stroke // B == stroke and fill
-        // angle = splay of arrowhead - 1 - 89 degrees
-        if ($fill == 'F') {
-            $fill = 'f';
-        } elseif ($fill == 'FD' or $fill == 'DF' or $fill == 'B') {
-            $fill = 'B';
-        } else {
-            $fill = 'S';
-        }
-        $a = \atan2($y2 - $y1, $x2 - $x1);
-        $b = $a + \deg2rad($angle);
-        $c = $a - \deg2rad($angle);
-        $x3 = $x2 - $headsize * \cos($b);
-        $y3 = $this->h - ($y2 - $headsize * \sin($b));
-        $x4 = $x2 - $headsize * \cos($c);
-        $y4 = $this->h - ($y2 - $headsize * \sin($c));
-        $x5 = $x3 - ($x3 - $x4) / 2;
-        // mid point of base of arrowhead - to join arrow line to
-        $y5 = $y3 - ($y3 - $y4) / 2;
-        $s = '';
-        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S', $x1 * Mpdf::SCALE, ($this->h - $y1) * Mpdf::SCALE, $x5 * Mpdf::SCALE, $y5 * Mpdf::SCALE);
-        $this->writer->write($s);
-        $s = '';
-        $s .= \sprintf('%.3F %.3F m %.3F %.3F l %.3F %.3F l %.3F %.3F l %.3F %.3F l ', $x5 * Mpdf::SCALE, $y5 * Mpdf::SCALE, $x3 * Mpdf::SCALE, $y3 * Mpdf::SCALE, $x2 * Mpdf::SCALE, ($this->h - $y2) * Mpdf::SCALE, $x4 * Mpdf::SCALE, $y4 * Mpdf::SCALE, $x5 * Mpdf::SCALE, $y5 * Mpdf::SCALE);
-        $s .= $fill;
-        $this->writer->write($s);
-    }
-    function Rect($x, $y, $w, $h, $style = '')
-    {
-        // Draw a rectangle
-        if ($style == 'F') {
-            $op = 'f';
-        } elseif ($style == 'FD' or $style == 'DF') {
-            $op = 'B';
-        } else {
-            $op = 'S';
-        }
-        $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F re %s', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$h * Mpdf::SCALE, $op));
-    }
-    function AddFontDirectory($directory)
-    {
-        $this->fontDir[] = $directory;
-        $this->fontFileFinder->setDirectories($this->fontDir);
-    }
-    function AddFont($family, $style = '')
-    {
-        if (empty($family)) {
-            return;
-        }
-        $family = \strtolower($family);
-        $style = \strtoupper($style);
-        $style = \str_replace('U', '', $style);
-        if ($style == 'IB') {
-            $style = 'BI';
-        }
-        $fontkey = $family . $style;
-        // check if the font has been already added
-        if (isset($this->fonts[$fontkey])) {
-            return;
-        }
-        /* -- CJK-FONTS -- */
-        if (\in_array($family, $this->available_CJK_fonts)) {
-            if (empty($this->Big5_widths)) {
-                require __DIR__ . '/../data/CJKdata.php';
-            }
-            $this->AddCJKFont($family);
-            // don't need to add style
-            return;
-        }
-        /* -- END CJK-FONTS -- */
-        if ($this->usingCoreFont) {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("mPDF Error - problem with Font management");
-        }
-        $stylekey = $style;
-        if (!$style) {
-            $stylekey = 'R';
-        }
-        if (!isset($this->fontdata[$family][$stylekey]) || !$this->fontdata[$family][$stylekey]) {
-            throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Font "%s%s%s" is not supported', $family, $style ? ' - ' : '', $style));
-        }
-        /* Setup defaults */
-        $font = ['name' => '', 'type' => '', 'desc' => '', 'panose' => '', 'unitsPerEm' => '', 'up' => '', 'ut' => '', 'strs' => '', 'strp' => '', 'sip' => \false, 'smp' => \false, 'useOTL' => 0, 'fontmetrics' => '', 'haskerninfo' => \false, 'haskernGPOS' => \false, 'hassmallcapsGSUB' => \false, 'BMPselected' => \false, 'GSUBScriptLang' => [], 'GSUBFeatures' => [], 'GSUBLookups' => [], 'GPOSScriptLang' => [], 'GPOSFeatures' => [], 'GPOSLookups' => [], 'rtlPUAstr' => ''];
-        $fontCacheFilename = $fontkey . '.mtx.json';
-        if ($this->fontCache->jsonHas($fontCacheFilename)) {
-            $font = $this->fontCache->jsonLoad($fontCacheFilename);
-        }
-        $ttffile = $this->fontFileFinder->findFontFile($this->fontdata[$family][$stylekey]);
-        $ttfstat = \stat($ttffile);
-        $TTCfontID = isset($this->fontdata[$family]['TTCfontID'][$stylekey]) ? isset($this->fontdata[$family]['TTCfontID'][$stylekey]) : 0;
-        $fontUseOTL = isset($this->fontdata[$family]['useOTL']) ? $this->fontdata[$family]['useOTL'] : \false;
-        $BMPonly = \in_array($family, $this->BMPonly) ? \true : \false;
-        $regenerate = \false;
-        if ($BMPonly && !$font['BMPselected']) {
-            $regenerate = \true;
-        } elseif (!$BMPonly && $font['BMPselected']) {
-            $regenerate = \true;
-        }
-        if ($fontUseOTL && $font['useOTL'] != $fontUseOTL) {
-            $regenerate = \true;
-            $font['useOTL'] = $fontUseOTL;
-        } elseif (!$fontUseOTL && $font['useOTL']) {
-            $regenerate = \true;
-            $font['useOTL'] = 0;
-        }
-        if ($this->fontDescriptor != $font['fontmetrics']) {
-            $regenerate = \true;
-        }
-        // mPDF 6
-        if (empty($font['name']) || $font['originalsize'] != $ttfstat['size'] || $regenerate) {
-            $generator = new MetricsGenerator($this->fontCache, $this->fontDescriptor);
-            $generator->generateMetrics($ttffile, $ttfstat, $fontkey, $TTCfontID, $this->debugfonts, $BMPonly, $font['useOTL'], $fontUseOTL);
-            $font = $this->fontCache->jsonLoad($fontCacheFilename);
-            $cw = $this->fontCache->load($fontkey . '.cw.dat');
-            $glyphIDtoUni = $this->fontCache->load($fontkey . '.gid.dat');
-        } else {
-            if ($this->fontCache->has($fontkey . '.cw.dat')) {
-                $cw = $this->fontCache->load($fontkey . '.cw.dat');
-            }
-            if ($this->fontCache->has($fontkey . '.gid.dat')) {
-                $glyphIDtoUni = $this->fontCache->load($fontkey . '.gid.dat');
-            }
-        }
-        if (isset($this->fontdata[$family]['sip-ext']) && $this->fontdata[$family]['sip-ext']) {
-            $sipext = $this->fontdata[$family]['sip-ext'];
-        } else {
-            $sipext = '';
-        }
-        // Override with values from config_font.php
-        if (isset($this->fontdata[$family]['Ascent']) && $this->fontdata[$family]['Ascent']) {
-            $desc['Ascent'] = $this->fontdata[$family]['Ascent'];
-        }
-        if (isset($this->fontdata[$family]['Descent']) && $this->fontdata[$family]['Descent']) {
-            $desc['Descent'] = $this->fontdata[$family]['Descent'];
-        }
-        if (isset($this->fontdata[$family]['Leading']) && $this->fontdata[$family]['Leading']) {
-            $desc['Leading'] = $this->fontdata[$family]['Leading'];
-        }
-        $i = \count($this->fonts) + $this->extraFontSubsets + 1;
-        $this->fonts[$fontkey] = ['i' => $i, 'name' => $font['name'], 'type' => $font['type'], 'desc' => $font['desc'], 'panose' => $font['panose'], 'unitsPerEm' => $font['unitsPerEm'], 'up' => $font['up'], 'ut' => $font['ut'], 'strs' => $font['strs'], 'strp' => $font['strp'], 'cw' => $cw, 'ttffile' => $ttffile, 'fontkey' => $fontkey, 'used' => \false, 'sip' => $font['sip'], 'sipext' => $sipext, 'smp' => $font['smp'], 'TTCfontID' => $TTCfontID, 'useOTL' => $fontUseOTL, 'useKashida' => isset($this->fontdata[$family]['useKashida']) ? $this->fontdata[$family]['useKashida'] : \false, 'GSUBScriptLang' => $font['GSUBScriptLang'], 'GSUBFeatures' => $font['GSUBFeatures'], 'GSUBLookups' => $font['GSUBLookups'], 'GPOSScriptLang' => $font['GPOSScriptLang'], 'GPOSFeatures' => $font['GPOSFeatures'], 'GPOSLookups' => $font['GPOSLookups'], 'rtlPUAstr' => $font['rtlPUAstr'], 'glyphIDtoUni' => $glyphIDtoUni, 'haskerninfo' => $font['haskerninfo'], 'haskernGPOS' => $font['haskernGPOS'], 'hassmallcapsGSUB' => $font['hassmallcapsGSUB']];
-        if (!$font['sip'] && !$font['smp']) {
-            $subsetRange = \range(32, 127);
-            $this->fonts[$fontkey]['subset'] = \array_combine($subsetRange, $subsetRange);
-        } else {
-            $this->fonts[$fontkey]['subsets'] = [0 => \range(0, 127)];
-            $this->fonts[$fontkey]['subsetfontids'] = [$i];
-        }
-        if ($font['haskerninfo']) {
-            $this->fonts[$fontkey]['kerninfo'] = $font['kerninfo'];
-        }
-        $this->FontFiles[$fontkey] = ['length1' => $font['originalsize'], 'type' => 'TTF', 'ttffile' => $ttffile, 'sip' => $font['sip'], 'smp' => $font['smp']];
-        unset($cw);
-    }
-    function SetFont($family, $style = '', $size = 0, $write = \true, $forcewrite = \false)
-    {
-        $family = \strtolower($family);
-        if (!$this->onlyCoreFonts) {
-            if ($family == 'sans' || $family == 'sans-serif') {
-                $family = $this->sans_fonts[0];
-            }
-            if ($family == 'serif') {
-                $family = $this->serif_fonts[0];
-            }
-            if ($family == 'mono' || $family == 'monospace') {
-                $family = $this->mono_fonts[0];
-            }
-        }
-        if (isset($this->fonttrans[$family]) && $this->fonttrans[$family]) {
-            $family = $this->fonttrans[$family];
-        }
-        if ($family == '') {
-            if ($this->FontFamily) {
-                $family = $this->FontFamily;
-            } elseif ($this->default_font) {
-                $family = $this->default_font;
-            } else {
-                throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("No font or default font set!");
-            }
-        }
-        $this->ReqFontStyle = $style;
-        // required or requested style - used later for artificial bold/italic
-        if ($family == 'csymbol' || $family == 'czapfdingbats' || $family == 'ctimes' || $family == 'ccourier' || $family == 'chelvetica') {
-            if ($this->PDFA || $this->PDFX) {
-                if ($family == 'csymbol' || $family == 'czapfdingbats') {
-                    throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Symbol and Zapfdingbats cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a).");
-                }
-                if ($family == 'ctimes' || $family == 'ccourier' || $family == 'chelvetica') {
-                    if ($this->PDFA && !$this->PDFAauto || $this->PDFX && !$this->PDFXauto) {
-                        $this->PDFAXwarnings[] = "Core Adobe font " . \ucfirst($family) . " cannot be embedded in mPDF, which is required for PDFA1-b or PDFX/1-a. (Embedded font will be substituted.)";
-                    }
-                    if ($family == 'chelvetica') {
-                        $family = 'sans';
-                    }
-                    if ($family == 'ctimes') {
-                        $family = 'serif';
-                    }
-                    if ($family == 'ccourier') {
-                        $family = 'mono';
-                    }
-                }
-                $this->usingCoreFont = \false;
-            } else {
-                $this->usingCoreFont = \true;
-            }
-            if ($family == 'csymbol' || $family == 'czapfdingbats') {
-                $style = '';
-            }
-        } else {
-            $this->usingCoreFont = \false;
-        }
-        // mPDF 5.7.1
-        if ($style) {
-            $style = \strtoupper($style);
-            if ($style == 'IB') {
-                $style = 'BI';
-            }
-        }
-        if (!$size) {
-            $size = $this->FontSizePt;
-        }
-        $fontkey = $family . $style;
-        $stylekey = $style;
-        if (!$stylekey) {
-            $stylekey = "R";
-        }
-        if (!$this->onlyCoreFonts && !$this->usingCoreFont) {
-            if (!isset($this->fonts[$fontkey]) || \count($this->default_available_fonts) != \count($this->available_unifonts)) {
-                // not already added
-                /* -- CJK-FONTS -- */
-                if (\in_array($fontkey, $this->available_CJK_fonts)) {
-                    if (!isset($this->fonts[$fontkey])) {
-                        // already added
-                        if (empty($this->Big5_widths)) {
-                            require __DIR__ . '/../data/CJKdata.php';
-                        }
-                        $this->AddCJKFont($family);
-                        // don't need to add style
-                    }
-                } else {
-                    // Test to see if requested font/style is available - or substitute /* -- END CJK-FONTS -- */
-                    if (!\in_array($fontkey, $this->available_unifonts)) {
-                        // If font[nostyle] exists - set it
-                        if (\in_array($family, $this->available_unifonts)) {
-                            $style = '';
-                        } elseif (\count($this->available_unifonts) == 1) {
-                            $family = $this->available_unifonts[0];
-                            $style = '';
-                        } else {
-                            $found = 0;
-                            // else substitute font of similar type
-                            if (\in_array($family, $this->sans_fonts)) {
-                                $i = \array_intersect($this->sans_fonts, $this->available_unifonts);
-                                if (\count($i)) {
-                                    $i = \array_values($i);
-                                    // with requested style if possible
-                                    if (!\in_array($i[0] . $style, $this->available_unifonts)) {
-                                        $style = '';
-                                    }
-                                    $family = $i[0];
-                                    $found = 1;
-                                }
-                            } elseif (\in_array($family, $this->serif_fonts)) {
-                                $i = \array_intersect($this->serif_fonts, $this->available_unifonts);
-                                if (\count($i)) {
-                                    $i = \array_values($i);
-                                    // with requested style if possible
-                                    if (!\in_array($i[0] . $style, $this->available_unifonts)) {
-                                        $style = '';
-                                    }
-                                    $family = $i[0];
-                                    $found = 1;
-                                }
-                            } elseif (\in_array($family, $this->mono_fonts)) {
-                                $i = \array_intersect($this->mono_fonts, $this->available_unifonts);
-                                if (\count($i)) {
-                                    $i = \array_values($i);
-                                    // with requested style if possible
-                                    if (!\in_array($i[0] . $style, $this->available_unifonts)) {
-                                        $style = '';
-                                    }
-                                    $family = $i[0];
-                                    $found = 1;
-                                }
-                            }
-                            if (!$found) {
-                                // set first available font
-                                $fs = $this->available_unifonts[0];
-                                \preg_match('/^([a-z_0-9\\-]+)([BI]{0,2})$/', $fs, $fas);
-                                // Allow "-"
-                                // with requested style if possible
-                                $ws = $fas[1] . $style;
-                                if (\in_array($ws, $this->available_unifonts)) {
-                                    $family = $fas[1];
-                                    // leave $style as is
-                                } elseif (\in_array($fas[1], $this->available_unifonts)) {
-                                    // or without style
-                                    $family = $fas[1];
-                                    $style = '';
-                                } else {
-                                    // or with the style specified
-                                    $family = $fas[1];
-                                    $style = $fas[2];
-                                }
-                            }
-                        }
-                        $fontkey = $family . $style;
-                    }
-                }
-            }
-            // try to add font (if not already added)
-            $this->AddFont($family, $style);
-            // Test if font is already selected
-            if ($this->FontFamily == $family && $this->FontFamily == $this->currentfontfamily && $this->FontStyle == $style && $this->FontStyle == $this->currentfontstyle && $this->FontSizePt == $size && $this->FontSizePt == $this->currentfontsize && !$forcewrite) {
-                return $family;
-            }
-            $fontkey = $family . $style;
-            // Select it
-            $this->FontFamily = $family;
-            $this->FontStyle = $style;
-            $this->FontSizePt = $size;
-            $this->FontSize = $size / Mpdf::SCALE;
-            $this->CurrentFont =& $this->fonts[$fontkey];
-            if ($write) {
-                $fontout = \sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt);
-                if ($this->page > 0 && (isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout || !isset($this->pageoutput[$this->page]['Font']))) {
-                    $this->writer->write($fontout);
-                }
-                $this->pageoutput[$this->page]['Font'] = $fontout;
-            }
-            // Added - currentfont (lowercase) used in HTML2PDF
-            $this->currentfontfamily = $family;
-            $this->currentfontsize = $size;
-            $this->currentfontstyle = $style;
-            $this->setMBencoding('UTF-8');
-        } else {
-            // if using core fonts
-            if ($this->PDFA || $this->PDFX) {
-                throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Core Adobe fonts cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a) - cannot use option to use core fonts.');
-            }
-            $this->setMBencoding('windows-1252');
-            // Test if font is already selected
-            if ($this->FontFamily == $family and $this->FontStyle == $style and $this->FontSizePt == $size && !$forcewrite) {
-                return $family;
-            }
-            if (!isset($this->CoreFonts[$fontkey])) {
-                if (\in_array($family, $this->serif_fonts)) {
-                    $family = 'ctimes';
-                } elseif (\in_array($family, $this->mono_fonts)) {
-                    $family = 'ccourier';
-                } else {
-                    $family = 'chelvetica';
-                }
-                $this->usingCoreFont = \true;
-                $fontkey = $family . $style;
-            }
-            if (!isset($this->fonts[$fontkey])) {
-                // STANDARD CORE FONTS
-                if (isset($this->CoreFonts[$fontkey])) {
-                    // Load metric file
-                    $file = $family;
-                    if ($family == 'ctimes' || $family == 'chelvetica' || $family == 'ccourier') {
-                        $file .= \strtolower($style);
-                    }
-                    require __DIR__ . '/../data/font/' . $file . '.php';
-                    if (!isset($cw)) {
-                        throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Could not include font metric file "%s"', $file));
-                    }
-                    $i = \count($this->fonts) + $this->extraFontSubsets + 1;
-                    $this->fonts[$fontkey] = ['i' => $i, 'type' => 'core', 'name' => $this->CoreFonts[$fontkey], 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw];
-                    if ($this->useKerning && isset($kerninfo)) {
-                        $this->fonts[$fontkey]['kerninfo'] = $kerninfo;
-                    }
-                } else {
-                    throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Font %s not defined', $fontkey));
-                }
-            }
-            // Test if font is already selected
-            if ($this->FontFamily == $family and $this->FontStyle == $style and $this->FontSizePt == $size && !$forcewrite) {
-                return $family;
-            }
-            // Select it
-            $this->FontFamily = $family;
-            $this->FontStyle = $style;
-            $this->FontSizePt = $size;
-            $this->FontSize = $size / Mpdf::SCALE;
-            $this->CurrentFont =& $this->fonts[$fontkey];
-            if ($write) {
-                $fontout = \sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt);
-                if ($this->page > 0 && (isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout || !isset($this->pageoutput[$this->page]['Font']))) {
-                    $this->writer->write($fontout);
-                }
-                $this->pageoutput[$this->page]['Font'] = $fontout;
-            }
-            // Added - currentfont (lowercase) used in HTML2PDF
-            $this->currentfontfamily = $family;
-            $this->currentfontsize = $size;
-            $this->currentfontstyle = $style;
-        }
-        return $family;
-    }
-    function SetFontSize($size, $write = \true)
-    {
-        // Set font size in points
-        if ($this->FontSizePt == $size) {
-            return;
-        }
-        $this->FontSizePt = $size;
-        $this->FontSize = $size / Mpdf::SCALE;
-        $this->currentfontsize = $size;
-        if ($write) {
-            $fontout = \sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt);
-            // Edited mPDF 3.0
-            if ($this->page > 0 && (isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout || !isset($this->pageoutput[$this->page]['Font']))) {
-                $this->writer->write($fontout);
-            }
-            $this->pageoutput[$this->page]['Font'] = $fontout;
-        }
-    }
-    function AddLink()
-    {
-        // Create a new internal link
-        $n = \count($this->links) + 1;
-        $this->links[$n] = [0, 0];
-        return $n;
-    }
-    function SetLink($link, $y = 0, $page = -1)
-    {
-        // Set destination of internal link
-        if ($y == -1) {
-            $y = $this->y;
-        }
-        if ($page == -1) {
-            $page = $this->page;
-        }
-        $this->links[$link] = [$page, $y];
-    }
-    function Link($x, $y, $w, $h, $link)
-    {
-        $l = [$x * Mpdf::SCALE, $this->hPt - $y * Mpdf::SCALE, $w * Mpdf::SCALE, $h * Mpdf::SCALE, $link];
-        if ($this->keep_block_together) {
-            // don't write yet
-            return;
-        } elseif ($this->table_rotate) {
-            // *TABLES*
-            $this->tbrot_Links[$this->page][] = $l;
-            // *TABLES*
-            return;
-            // *TABLES*
-        } elseif ($this->kwt) {
-            $this->kwt_Links[$this->page][] = $l;
-            return;
-        }
-        if ($this->writingHTMLheader || $this->writingHTMLfooter) {
-            $this->HTMLheaderPageLinks[] = $l;
-            return;
-        }
-        // Put a link on the page
-        $this->PageLinks[$this->page][] = $l;
-        // Save cross-reference to Column buffer
-        $ref = \count($this->PageLinks[$this->page]) - 1;
-        // *COLUMNS*
-        $this->columnLinks[$this->CurrCol][(int) $this->x][(int) $this->y] = $ref;
-        // *COLUMNS*
-    }
-    function Text($x, $y, $txt, $OTLdata = [], $textvar = 0, $aixextra = '', $coordsys = '', $return = \false)
-    {
-        // Output (or return) a string
-        // Called (internally) by Watermark() & _tableWrite() [rotated cells] & TableHeaderFooter() & WriteText()
-        // Called also from classes/svg.php
-        // Expects Font to be set
-        // Expects input to be mb_encoded if necessary and RTL reversed & OTL processed
-        // ARTIFICIAL BOLD AND ITALIC
-        $s = 'q ';
-        if ($this->falseBoldWeight && \strpos($this->ReqFontStyle, "B") !== \false && \strpos($this->FontStyle, "B") === \false) {
-            $s .= '2 Tr 1 J 1 j ';
-            $s .= \sprintf('%.3F w ', $this->FontSize / 130 * Mpdf::SCALE * $this->falseBoldWeight);
-            $tc = \strtoupper($this->TextColor);
-            // change 0 0 0 rg to 0 0 0 RG
-            if ($this->FillColor != $tc) {
-                $s .= $tc . ' ';
-            }
-            // stroke (outline) = same colour as text(fill)
-        }
-        if (\strpos($this->ReqFontStyle, "I") !== \false && \strpos($this->FontStyle, "I") === \false) {
-            $aix = '1 0 0.261799 1 %.3F %.3F Tm';
-        } else {
-            $aix = '%.3F %.3F Td';
-        }
-        $aix = $aixextra . $aix;
-        if ($this->ColorFlag) {
-            $s .= $this->TextColor . ' ';
-        }
-        $this->CurrentFont['used'] = \true;
-        if ($this->usingCoreFont) {
-            $txt2 = \str_replace(\chr(160), \chr(32), $txt);
-        } else {
-            $txt2 = \str_replace(\chr(194) . \chr(160), \chr(32), $txt);
-        }
-        $px = $x;
-        $py = $y;
-        if ($coordsys != 'SVG') {
-            $px = $x * Mpdf::SCALE;
-            $py = ($this->h - $y) * Mpdf::SCALE;
-        }
-        /** ************** SIMILAR TO Cell() ************************ */
-        // IF corefonts AND NOT SmCaps AND NOT Kerning
-        // Just output text
-        if ($this->usingCoreFont && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING)) {
-            $txt2 = $this->writer->escape($txt2);
-            $s .= \sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
-        } elseif (!$this->usingCoreFont && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING) && !(isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff && !empty($OTLdata['GPOSinfo']))) {
-            // IF SIP/SMP
-            if ($this->CurrentFont['sip'] || $this->CurrentFont['smp']) {
-                $txt2 = $this->UTF8toSubset($txt2);
-                $s .= \sprintf('BT ' . $aix . ' %s Tj ET', $px, $py, $txt2);
-            } else {
-                $txt2 = $this->writer->utf8ToUtf16BigEndian($txt2, \false);
-                $txt2 = $this->writer->escape($txt2);
-                $s .= \sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
-            }
-        } else {
-            $s .= $this->applyGPOSpdf($txt2, $aix, $px, $py, $OTLdata, $textvar);
-        }
-        /*         * ************** END ************************ */
-        $s .= ' ';
-        if ($textvar & TextVars::FD_UNDERLINE && $txt != '') {
-            // mPDF 5.7.1
-            $c = \strtoupper($this->TextColor);
-            // change 0 0 0 rg to 0 0 0 RG
-            if ($this->FillColor != $c) {
-                $s .= ' ' . $c . ' ';
-            }
-            if (isset($this->CurrentFont['up']) && $this->CurrentFont['up']) {
-                $up = $this->CurrentFont['up'];
-            } else {
-                $up = -100;
-            }
-            $adjusty = -$up / 1000 * $this->FontSize;
-            if (isset($this->CurrentFont['ut']) && $this->CurrentFont['ut']) {
-                $ut = $this->CurrentFont['ut'] / 1000 * $this->FontSize;
-            } else {
-                $ut = 60 / 1000 * $this->FontSize;
-            }
-            $olw = $this->LineWidth;
-            $s .= ' ' . \sprintf(' %.3F w', $ut * Mpdf::SCALE);
-            $s .= ' ' . $this->_dounderline($x, $y + $adjusty, $txt, $OTLdata, $textvar);
-            $s .= ' ' . \sprintf(' %.3F w', $olw * Mpdf::SCALE);
-            if ($this->FillColor != $c) {
-                $s .= ' ' . $this->FillColor . ' ';
-            }
-        }
-        // STRIKETHROUGH
-        if ($textvar & TextVars::FD_LINETHROUGH && $txt != '') {
-            // mPDF 5.7.1
-            $c = \strtoupper($this->TextColor);
-            // change 0 0 0 rg to 0 0 0 RG
-            if ($this->FillColor != $c) {
-                $s .= ' ' . $c . ' ';
-            }
-            // Superscript and Subscript Y coordinate adjustment (now for striked-through texts)
-            if (isset($this->CurrentFont['desc']['CapHeight']) && $this->CurrentFont['desc']['CapHeight']) {
-                $ch = $this->CurrentFont['desc']['CapHeight'];
-            } else {
-                $ch = 700;
-            }
-            $adjusty = -$ch / 1000 * $this->FontSize * 0.35;
-            if (isset($this->CurrentFont['ut']) && $this->CurrentFont['ut']) {
-                $ut = $this->CurrentFont['ut'] / 1000 * $this->FontSize;
-            } else {
-                $ut = 60 / 1000 * $this->FontSize;
-            }
-            $olw = $this->LineWidth;
-            $s .= ' ' . \sprintf(' %.3F w', $ut * Mpdf::SCALE);
-            $s .= ' ' . $this->_dounderline($x, $y + $adjusty, $txt, $OTLdata, $textvar);
-            $s .= ' ' . \sprintf(' %.3F w', $olw * Mpdf::SCALE);
-            if ($this->FillColor != $c) {
-                $s .= ' ' . $this->FillColor . ' ';
-            }
-        }
-        $s .= 'Q';
-        if ($return) {
-            return $s . " \n";
-        }
-        $this->writer->write($s);
-    }
-    /* -- DIRECTW -- */
-    function WriteText($x, $y, $txt)
-    {
-        // Output a string using Text() but does encoding and text reversing of RTL
-        $txt = $this->purify_utf8_text($txt);
-        if ($this->text_input_as_HTML) {
-            $txt = $this->all_entities_to_utf8($txt);
-        }
-        if ($this->usingCoreFont) {
-            $txt = \mb_convert_encoding($txt, $this->mb_enc, 'UTF-8');
-        }
-        // DIRECTIONALITY
-        if (\preg_match("/([" . $this->pregRTLchars . "])/u", $txt)) {
-            $this->biDirectional = \true;
-        }
-        // *OTL*
-        $textvar = 0;
-        $save_OTLtags = $this->OTLtags;
-        $this->OTLtags = [];
-        if ($this->useKerning) {
-            if ($this->CurrentFont['haskernGPOS']) {
-                $this->OTLtags['Plus'] .= ' kern';
-            } else {
-                $textvar = $textvar | TextVars::FC_KERNING;
-            }
-        }
-        /* -- OTL -- */
-        // Use OTL OpenType Table Layout - GSUB & GPOS
-        if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) {
-            $txt = $this->otl->applyOTL($txt, $this->CurrentFont['useOTL']);
-            $OTLdata = $this->otl->OTLdata;
-        }
-        /* -- END OTL -- */
-        $this->OTLtags = $save_OTLtags;
-        $this->magic_reverse_dir($txt, $this->directionality, $OTLdata);
-        $this->Text($x, $y, $txt, $OTLdata, $textvar);
-    }
-    function WriteCell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = 0, $link = '', $currentx = 0)
-    {
-        // Output a cell using Cell() but does encoding and text reversing of RTL
-        $txt = $this->purify_utf8_text($txt);
-        if ($this->text_input_as_HTML) {
-            $txt = $this->all_entities_to_utf8($txt);
-        }
-        if ($this->usingCoreFont) {
-            $txt = \mb_convert_encoding($txt, $this->mb_enc, 'UTF-8');
-        }
-        // DIRECTIONALITY
-        if (\preg_match("/([" . $this->pregRTLchars . "])/u", $txt)) {
-            $this->biDirectional = \true;
-        }
-        // *OTL*
-        $textvar = 0;
-        $save_OTLtags = $this->OTLtags;
-        $this->OTLtags = [];
-        if ($this->useKerning) {
-            if ($this->CurrentFont['haskernGPOS']) {
-                $this->OTLtags['Plus'] .= ' kern';
-            } else {
-                $textvar = $textvar | TextVars::FC_KERNING;
-            }
-        }
-        /* -- OTL -- */
-        // Use OTL OpenType Table Layout - GSUB & GPOS
-        if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) {
-            $txt = $this->otl->applyOTL($txt, $this->CurrentFont['useOTL']);
-            $OTLdata = $this->otl->OTLdata;
-        }
-        /* -- END OTL -- */
-        $this->OTLtags = $save_OTLtags;
-        $this->magic_reverse_dir($txt, $this->directionality, $OTLdata);
-        $this->Cell($w, $h, $txt, $border, $ln, $align, $fill, $link, $currentx, 0, 0, 'M', 0, \false, $OTLdata, $textvar);
-    }
-    /* -- END DIRECTW -- */
-    function ResetSpacing()
-    {
-        if ($this->ws != 0) {
-            $this->writer->write('BT 0 Tw ET');
-        }
-        $this->ws = 0;
-        if ($this->charspacing != 0) {
-            $this->writer->write('BT 0 Tc ET');
-        }
-        $this->charspacing = 0;
-    }
-    function SetSpacing($cs, $ws)
-    {
-        if (\intval($cs * 1000) == 0) {
-            $cs = 0;
-        }
-        if ($cs) {
-            $this->writer->write(\sprintf('BT %.3F Tc ET', $cs));
-        } elseif ($this->charspacing != 0) {
-            $this->writer->write('BT 0 Tc ET');
-        }
-        $this->charspacing = $cs;
-        if (\intval($ws * 1000) == 0) {
-            $ws = 0;
-        }
-        if ($ws) {
-            $this->writer->write(\sprintf('BT %.3F Tw ET', $ws));
-        } elseif ($this->ws != 0) {
-            $this->writer->write('BT 0 Tw ET');
-        }
-        $this->ws = $ws;
-    }
-    // WORD SPACING
-    function GetJspacing($nc, $ns, $w, $inclCursive, &$cOTLdata)
-    {
-        $kashida_present = \false;
-        $kashida_space = 0;
-        if ($w > 0 && $inclCursive && isset($this->CurrentFont['useKashida']) && $this->CurrentFont['useKashida'] && !empty($cOTLdata)) {
-            for ($c = 0; $c < \count($cOTLdata); $c++) {
-                for ($i = 0; $i < \strlen($cOTLdata[$c]['group']); $i++) {
-                    if (isset($cOTLdata[$c]['GPOSinfo'][$i]['kashida']) && $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > 0) {
-                        $kashida_present = \true;
-                        break 2;
-                    }
-                }
-            }
-        }
-        if ($kashida_present) {
-            $k_ctr = 0;
-            // Number of kashida points
-            $k_total = 0;
-            // Total of kashida values (priority)
-            // Reset word
-            $max_kashida_in_word = 0;
-            $last_kashida_in_word = -1;
-            for ($c = 0; $c < \count($cOTLdata); $c++) {
-                for ($i = 0; $i < \strlen($cOTLdata[$c]['group']); $i++) {
-                    if ($cOTLdata[$c]['group'][$i] == 'S') {
-                        // Save from last word
-                        if ($max_kashida_in_word) {
-                            $k_ctr++;
-                            $k_total = $max_kashida_in_word;
-                        }
-                        // Reset word
-                        $max_kashida_in_word = 0;
-                        $last_kashida_in_word = -1;
-                    }
-                    if (isset($cOTLdata[$c]['GPOSinfo'][$i]['kashida']) && $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > 0) {
-                        if ($max_kashida_in_word) {
-                            if ($cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > $max_kashida_in_word) {
-                                $max_kashida_in_word = $cOTLdata[$c]['GPOSinfo'][$i]['kashida'];
-                                $cOTLdata[$c]['GPOSinfo'][$last_kashida_in_word]['kashida'] = 0;
-                                $last_kashida_in_word = $i;
-                            } else {
-                                $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] = 0;
-                            }
-                        } else {
-                            $max_kashida_in_word = $cOTLdata[$c]['GPOSinfo'][$i]['kashida'];
-                            $last_kashida_in_word = $i;
-                        }
-                    }
-                }
-            }
-            // Save from last word
-            if ($max_kashida_in_word) {
-                $k_ctr++;
-                $k_total = $max_kashida_in_word;
-            }
-            // Number of kashida points = $k_ctr
-            // $useKashida is a % value from CurrentFont/config_fonts.php
-            // % ratio divided between word-spacing and kashida-spacing
-            $kashida_space_ratio = \intval($this->CurrentFont['useKashida']) / 100;
-            $kashida_space = $w * $kashida_space_ratio;
-            $tatw = $this->_getCharWidth($this->CurrentFont['cw'], 0x640);
-            // Only use kashida if each allocated kashida width is > 0.01 x width of a tatweel
-            // Otherwise fontstretch is too small and errors
-            // If not just leave to adjust word-spacing
-            if ($tatw && $kashida_space / $k_ctr / $tatw > 0.01) {
-                for ($c = 0; $c < \count($cOTLdata); $c++) {
-                    for ($i = 0; $i < \strlen($cOTLdata[$c]['group']); $i++) {
-                        if (isset($cOTLdata[$c]['GPOSinfo'][$i]['kashida']) && $cOTLdata[$c]['GPOSinfo'][$i]['kashida'] > 0) {
-                            // At this point kashida is a number representing priority (higher number - higher priority)
-                            // We are now going to set it as an actual length
-                            // This shares it equally amongst words:
-                            $cOTLdata[$c]['GPOSinfo'][$i]['kashida_space'] = 1 / $k_ctr * $kashida_space;
-                        }
-                    }
-                }
-                $w -= $kashida_space;
-            }
-        }
-        $ws = 0;
-        $charspacing = 0;
-        $ww = $this->jSWord;
-        $ncx = $nc - 1;
-        if ($nc == 0) {
-            return [0, 0, 0];
-        } elseif ($this->fixedlSpacing !== \false || $inclCursive) {
-            if ($ns) {
-                $ws = $w / $ns;
-            }
-        } elseif ($nc == 1) {
-            $charspacing = $w;
-        } elseif (!$ns) {
-            $charspacing = $w / $ncx;
-            if ($this->jSmaxChar > 0 && $charspacing > $this->jSmaxChar) {
-                $charspacing = $this->jSmaxChar;
-            }
-        } elseif ($ns == $ncx) {
-            $charspacing = $w / $ns;
-        } else {
-            if ($this->usingCoreFont) {
-                $cs = $w * (1 - $this->jSWord) / $ncx;
-                if ($this->jSmaxChar > 0 && $cs > $this->jSmaxChar) {
-                    $cs = $this->jSmaxChar;
-                    $ww = 1 - $cs * $ncx / $w;
-                }
-                $charspacing = $cs;
-                $ws = $w * $ww / $ns;
-            } else {
-                $cs = $w * (1 - $this->jSWord) / ($ncx - $ns);
-                if ($this->jSmaxChar > 0 && $cs > $this->jSmaxChar) {
-                    $cs = $this->jSmaxChar;
-                    $ww = 1 - $cs * ($ncx - $ns) / $w;
-                }
-                $charspacing = $cs;
-                $ws = $w * $ww / $ns - $charspacing;
-            }
-        }
-        return [$charspacing, $ws, $kashida_space];
-    }
-    /**
-     * Output a cell
-     *
-     * Expects input to be mb_encoded if necessary and RTL reversed
-     *
-     * @since mPDF 5.7.1
-     */
-    function Cell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = 0, $link = '', $currentx = 0, $lcpaddingL = 0, $lcpaddingR = 0, $valign = 'M', $spanfill = 0, $exactWidth = \false, $OTLdata = \false, $textvar = 0, $lineBox = \false)
-    {
-        // NON_BREAKING SPACE
-        if ($this->usingCoreFont) {
-            $txt = \str_replace(\chr(160), \chr(32), $txt);
-        } else {
-            $txt = \str_replace(\chr(194) . \chr(160), \chr(32), $txt);
-        }
-        $oldcolumn = $this->CurrCol;
-        // Automatic page break
-        // Allows PAGE-BREAK-AFTER = avoid to work
-        if (isset($this->blk[$this->blklvl])) {
-            $bottom = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['margin_bottom'];
-        } else {
-            $bottom = 0;
-        }
-        if (!$this->tableLevel && ($this->y + $this->divheight > $this->PageBreakTrigger || $this->y + $h > $this->PageBreakTrigger || $this->y + $h * 2 + $bottom > $this->PageBreakTrigger && (isset($this->blk[$this->blklvl]['page_break_after_avoid']) && $this->blk[$this->blklvl]['page_break_after_avoid'])) && !$this->InFooter && $this->AcceptPageBreak()) {
-            // mPDF 5.7.2
-            $x = $this->x;
-            // Current X position
-            // WORD SPACING
-            $ws = $this->ws;
-            // Word Spacing
-            $charspacing = $this->charspacing;
-            // Character Spacing
-            $this->ResetSpacing();
-            $this->AddPage($this->CurOrientation);
-            // Added to correct for OddEven Margins
-            $x += $this->MarginCorrection;
-            if ($currentx) {
-                $currentx += $this->MarginCorrection;
-            }
-            $this->x = $x;
-            // WORD SPACING
-            $this->SetSpacing($charspacing, $ws);
-        }
-        // Test: to put line through centre of cell: $this->Line($this->x,$this->y+($h/2),$this->x+50,$this->y+($h/2));
-        // Test: to put border around cell as it is specified: $border='LRTB';
-        /* -- COLUMNS -- */
-        // COLS
-        // COLUMN CHANGE
-        if ($this->CurrCol != $oldcolumn) {
-            if ($currentx) {
-                $currentx += $this->ChangeColumn * ($this->ColWidth + $this->ColGap);
-            }
-            $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap);
-        }
-        // COLUMNS Update/overwrite the lowest bottom of printing y value for a column
-        if ($this->ColActive) {
-            if ($h) {
-                $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $h;
-            } else {
-                $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $this->divheight;
-            }
-        }
-        /* -- END COLUMNS -- */
-        if ($w == 0) {
-            $w = $this->w - $this->rMargin - $this->x;
-        }
-        $s = '';
-        if ($fill == 1 && $this->FillColor) {
-            if (isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor || !isset($this->pageoutput[$this->page]['FillColor'])) {
-                $s .= $this->FillColor . ' ';
-            }
-            $this->pageoutput[$this->page]['FillColor'] = $this->FillColor;
-        }
-        if ($lineBox && isset($lineBox['boxtop']) && $txt) {
-            // i.e. always from WriteFlowingBlock/finishFlowingBlock (but not objects -
-            // which only have $lineBox['top'] set)
-            $boxtop = $this->y + $lineBox['boxtop'];
-            $boxbottom = $this->y + $lineBox['boxbottom'];
-            $glyphYorigin = $lineBox['glyphYorigin'];
-            $baseline_shift = $lineBox['baseline-shift'];
-            $bord_boxtop = $bg_boxtop = $boxtop = $boxtop - $baseline_shift;
-            $bord_boxbottom = $bg_boxbottom = $boxbottom = $boxbottom - $baseline_shift;
-            $bord_boxheight = $bg_boxheight = $boxheight = $boxbottom - $boxtop;
-            // If inline element BACKGROUND has bounding box set by parent element:
-            if (isset($lineBox['background-boxtop'])) {
-                $bg_boxtop = $this->y + $lineBox['background-boxtop'] - $lineBox['background-baseline-shift'];
-                $bg_boxbottom = $this->y + $lineBox['background-boxbottom'] - $lineBox['background-baseline-shift'];
-                $bg_boxheight = $bg_boxbottom - $bg_boxtop;
-            }
-            // If inline element BORDER has bounding box set by parent element:
-            if (isset($lineBox['border-boxtop'])) {
-                $bord_boxtop = $this->y + $lineBox['border-boxtop'] - $lineBox['border-baseline-shift'];
-                $bord_boxbottom = $this->y + $lineBox['border-boxbottom'] - $lineBox['border-baseline-shift'];
-                $bord_boxheight = $bord_boxbottom - $bord_boxtop;
-            }
-        } else {
-            $boxtop = $this->y;
-            $boxheight = $h;
-            $boxbottom = $this->y + $h;
-            $baseline_shift = 0;
-            if ($txt != '') {
-                // FONT SIZE - this determines the baseline caculation
-                $bfs = $this->FontSize;
-                // Calculate baseline Superscript and Subscript Y coordinate adjustment
-                $bfx = $this->baselineC;
-                $baseline = $bfx * $bfs;
-                if ($textvar & TextVars::FA_SUPERSCRIPT) {
-                    $baseline_shift = $this->textparam['text-baseline'];
-                } elseif ($textvar & TextVars::FA_SUBSCRIPT) {
-                    $baseline_shift = $this->textparam['text-baseline'];
-                } elseif ($this->bullet) {
-                    $baseline += ($bfx - 0.7) * $this->FontSize;
-                }
-                // Vertical align (for Images)
-                if ($valign == 'T') {
-                    $va = 0.5 * $bfs * $this->normalLineheight;
-                } elseif ($valign == 'B') {
-                    $va = $h - 0.5 * $bfs * $this->normalLineheight;
-                } else {
-                    $va = 0.5 * $h;
-                }
-                // Middle
-                // ONLY SET THESE IF WANT TO CONFINE BORDER +/- FILL TO FIT FONTSIZE - NOT FULL CELL AS IS ORIGINAL FUNCTION
-                // spanfill or spanborder are set in FlowingBlock functions
-                if ($spanfill || !empty($this->spanborddet) || $link != '') {
-                    $exth = 0.2;
-                    // Add to fontsize to increase height of background / link / border
-                    $boxtop = $this->y + $baseline + $va - $this->FontSize * (1 + $exth / 2) * (0.5 + $bfx);
-                    $boxheight = $this->FontSize * (1 + $exth);
-                    $boxbottom = $boxtop + $boxheight;
-                }
-                $glyphYorigin = $baseline + $va;
-            }
-            $boxtop -= $baseline_shift;
-            $boxbottom -= $baseline_shift;
-            $bord_boxtop = $bg_boxtop = $boxtop;
-            $bord_boxbottom = $bg_boxbottom = $boxbottom;
-            $bord_boxheight = $bg_boxheight = $boxheight = $boxbottom - $boxtop;
-        }
-        $bbw = $tbw = $lbw = $rbw = 0;
-        // Border widths
-        if (!empty($this->spanborddet)) {
-            if (!isset($this->spanborddet['B'])) {
-                $this->spanborddet['B'] = ['s' => 0, 'style' => '', 'w' => 0];
-            }
-            if (!isset($this->spanborddet['T'])) {
-                $this->spanborddet['T'] = ['s' => 0, 'style' => '', 'w' => 0];
-            }
-            if (!isset($this->spanborddet['L'])) {
-                $this->spanborddet['L'] = ['s' => 0, 'style' => '', 'w' => 0];
-            }
-            if (!isset($this->spanborddet['R'])) {
-                $this->spanborddet['R'] = ['s' => 0, 'style' => '', 'w' => 0];
-            }
-            $bbw = $this->spanborddet['B']['w'];
-            $tbw = $this->spanborddet['T']['w'];
-            $lbw = $this->spanborddet['L']['w'];
-            $rbw = $this->spanborddet['R']['w'];
-        }
-        if ($fill == 1 || $border == 1 || !empty($this->spanborddet)) {
-            if (!empty($this->spanborddet)) {
-                if ($fill == 1) {
-                    $s .= \sprintf('%.3F %.3F %.3F %.3F re f ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bg_boxtop + $tbw) * Mpdf::SCALE, ($w + $lbw + $rbw) * Mpdf::SCALE, (-$bg_boxheight - $tbw - $bbw) * Mpdf::SCALE);
-                }
-                $s .= ' q ';
-                $dashon = 3;
-                $dashoff = 3.5;
-                $dot = 2.5;
-                if ($tbw) {
-                    $short = 0;
-                    if ($this->spanborddet['T']['style'] == 'dashed') {
-                        $s .= \sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $tbw * $dashon * Mpdf::SCALE, $tbw * $dashoff * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['T']['style'] == 'dotted') {
-                        $s .= \sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $tbw * $dot * Mpdf::SCALE, -$tbw / 2 * Mpdf::SCALE);
-                        $short = $tbw / 2;
-                    } else {
-                        $s .= ' 0 j 0 J [] 0 d ';
-                    }
-                    if ($this->spanborddet['T']['style'] != 'dotted') {
-                        $s .= 'q ';
-                        $s .= \sprintf('%.3F %.3F m ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', $this->x * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
-                        $s .= ' h W n ';
-                        // Ends path no-op & Sets the clipping path
-                    }
-                    $c = $this->SetDColor($this->spanborddet['T']['c'], \true);
-                    if ($this->spanborddet['T']['style'] == 'double') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $tbw / 3 * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw * 5 / 6) * Mpdf::SCALE, ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw * 5 / 6) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 6) * Mpdf::SCALE, ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 6) * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['T']['style'] == 'dotted') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $tbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE);
-                    } else {
-                        $s .= \sprintf(' %s %.3F w ', $c, $tbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw / 2) * Mpdf::SCALE);
-                    }
-                    if ($this->spanborddet['T']['style'] != 'dotted') {
-                        $s .= ' Q ';
-                    }
-                }
-                if ($bbw) {
-                    $short = 0;
-                    if ($this->spanborddet['B']['style'] == 'dashed') {
-                        $s .= \sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $bbw * $dashon * Mpdf::SCALE, $bbw * $dashoff * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['B']['style'] == 'dotted') {
-                        $s .= \sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $bbw * $dot * Mpdf::SCALE, -$bbw / 2 * Mpdf::SCALE);
-                        $short = $bbw / 2;
-                    } else {
-                        $s .= ' 0 j 0 J [] 0 d ';
-                    }
-                    if ($this->spanborddet['B']['style'] != 'dotted') {
-                        $s .= 'q ';
-                        $s .= \sprintf('%.3F %.3F m ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', $this->x * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-                        $s .= ' h W n ';
-                        // Ends path no-op & Sets the clipping path
-                    }
-                    $c = $this->SetDColor($this->spanborddet['B']['c'], \true);
-                    if ($this->spanborddet['B']['style'] == 'double') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $bbw / 3 * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 6) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 6) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw * 5 / 6) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw * 5 / 6) * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['B']['style'] == 'dotted') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $bbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE);
-                    } else {
-                        $s .= \sprintf(' %s %.3F w ', $c, $bbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE, ($this->x + $w + $rbw - $short) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw / 2) * Mpdf::SCALE);
-                    }
-                    if ($this->spanborddet['B']['style'] != 'dotted') {
-                        $s .= ' Q ';
-                    }
-                }
-                if ($lbw) {
-                    $short = 0;
-                    if ($this->spanborddet['L']['style'] == 'dashed') {
-                        $s .= \sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $lbw * $dashon * Mpdf::SCALE, $lbw * $dashoff * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['L']['style'] == 'dotted') {
-                        $s .= \sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $lbw * $dot * Mpdf::SCALE, -$lbw / 2 * Mpdf::SCALE);
-                        $short = $lbw / 2;
-                    } else {
-                        $s .= ' 0 j 0 J [] 0 d ';
-                    }
-                    if ($this->spanborddet['L']['style'] != 'dotted') {
-                        $s .= 'q ';
-                        $s .= \sprintf('%.3F %.3F m ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', $this->x * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', $this->x * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x - $lbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
-                        $s .= ' h W n ';
-                        // Ends path no-op & Sets the clipping path
-                    }
-                    $c = $this->SetDColor($this->spanborddet['L']['c'], \true);
-                    if ($this->spanborddet['L']['style'] == 'double') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $lbw / 3 * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['L']['style'] == 'dotted') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $lbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                    } else {
-                        $s .= \sprintf(' %s %.3F w ', $c, $lbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x - $lbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                    }
-                    if ($this->spanborddet['L']['style'] != 'dotted') {
-                        $s .= ' Q ';
-                    }
-                }
-                if ($rbw) {
-                    $short = 0;
-                    if ($this->spanborddet['R']['style'] == 'dashed') {
-                        $s .= \sprintf(' 0 j 0 J [%.3F %.3F] 0 d ', $rbw * $dashon * Mpdf::SCALE, $rbw * $dashoff * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['R']['style'] == 'dotted') {
-                        $s .= \sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ', 0.001, $rbw * $dot * Mpdf::SCALE, -$rbw / 2 * Mpdf::SCALE);
-                        $short = $rbw / 2;
-                    } else {
-                        $s .= ' 0 j 0 J [] 0 d ';
-                    }
-                    if ($this->spanborddet['R']['style'] != 'dotted') {
-                        $s .= 'q ';
-                        $s .= \sprintf('%.3F %.3F m ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F l ', ($this->x + $w + $rbw) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE);
-                        $s .= ' h W n ';
-                        // Ends path no-op & Sets the clipping path
-                    }
-                    $c = $this->SetDColor($this->spanborddet['R']['c'], \true);
-                    if ($this->spanborddet['R']['style'] == 'double') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $rbw / 3 * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw * 5 / 6) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                    } elseif ($this->spanborddet['R']['style'] == 'dotted') {
-                        $s .= \sprintf(' %s %.3F w ', $c, $rbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                    } else {
-                        $s .= \sprintf(' %s %.3F w ', $c, $rbw * Mpdf::SCALE);
-                        $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxtop + $tbw) * Mpdf::SCALE, ($this->x + $w + $rbw / 2) * Mpdf::SCALE, ($this->h - $bord_boxbottom - $bbw + $short) * Mpdf::SCALE);
-                    }
-                    if ($this->spanborddet['R']['style'] != 'dotted') {
-                        $s .= ' Q ';
-                    }
-                }
-                $s .= ' Q ';
-            } else {
-                // If "border", does not come from WriteFlowingBlock or FinishFlowingBlock
-                if ($fill == 1) {
-                    $op = $border == 1 ? 'B' : 'f';
-                } else {
-                    $op = 'S';
-                }
-                $s .= \sprintf('%.3F %.3F %.3F %.3F re %s ', $this->x * Mpdf::SCALE, ($this->h - $bg_boxtop) * Mpdf::SCALE, $w * Mpdf::SCALE, -$bg_boxheight * Mpdf::SCALE, $op);
-            }
-        }
-        if (\is_string($border)) {
-            // If "border", does not come from WriteFlowingBlock or FinishFlowingBlock
-            $x = $this->x;
-            $y = $this->y;
-            if (\is_int(\strpos($border, 'L'))) {
-                $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', $x * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-            }
-            if (\is_int(\strpos($border, 'T'))) {
-                $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', $x * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE, ($x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE);
-            }
-            if (\is_int(\strpos($border, 'R'))) {
-                $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', ($x + $w) * Mpdf::SCALE, ($this->h - $bord_boxtop) * Mpdf::SCALE, ($x + $w) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-            }
-            if (\is_int(\strpos($border, 'B'))) {
-                $s .= \sprintf('%.3F %.3F m %.3F %.3F l S ', $x * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE, ($x + $w) * Mpdf::SCALE, ($this->h - $bord_boxbottom) * Mpdf::SCALE);
-            }
-        }
-        if ($txt != '') {
-            if ($exactWidth) {
-                $stringWidth = $w;
-            } else {
-                $stringWidth = $this->GetStringWidth($txt, \true, $OTLdata, $textvar) + $this->charspacing * \mb_strlen($txt, $this->mb_enc) / Mpdf::SCALE + $this->ws * \mb_substr_count($txt, ' ', $this->mb_enc) / Mpdf::SCALE;
-            }
-            // Set x OFFSET FOR PRINTING
-            if ($align == 'R') {
-                $dx = $w - $this->cMarginR - $stringWidth - $lcpaddingR;
-            } elseif ($align == 'C') {
-                $dx = ($w - $stringWidth) / 2;
-            } elseif ($align == 'L' or $align == 'J') {
-                $dx = $this->cMarginL + $lcpaddingL;
-            } else {
-                $dx = 0;
-            }
-            if ($this->ColorFlag) {
-                $s .= 'q ' . $this->TextColor . ' ';
-            }
-            // OUTLINE
-            if (isset($this->textparam['outline-s']) && $this->textparam['outline-s'] && !($textvar & TextVars::FC_SMALLCAPS)) {
-                // mPDF 5.7.1
-                $s .= ' ' . \sprintf('%.3F w', $this->LineWidth * Mpdf::SCALE) . ' ';
-                $s .= " {$this->DrawColor} ";
-                $s .= " 2 Tr ";
-            } elseif ($this->falseBoldWeight && \strpos($this->ReqFontStyle, "B") !== \false && \strpos($this->FontStyle, "B") === \false && !($textvar & TextVars::FC_SMALLCAPS)) {
-                // can't use together with OUTLINE or Small Caps	// mPDF 5.7.1	??? why not with SmallCaps ???
-                $s .= ' 2 Tr 1 J 1 j ';
-                $s .= ' ' . \sprintf('%.3F w', $this->FontSize / 130 * Mpdf::SCALE * $this->falseBoldWeight) . ' ';
-                $tc = \strtoupper($this->TextColor);
-                // change 0 0 0 rg to 0 0 0 RG
-                if ($this->FillColor != $tc) {
-                    $s .= ' ' . $tc . ' ';
-                }
-                // stroke (outline) = same colour as text(fill)
-            } else {
-                $s .= " 0 Tr ";
-            }
-            if (\strpos($this->ReqFontStyle, "I") !== \false && \strpos($this->FontStyle, "I") === \false) {
-                // Artificial italic
-                $aix = '1 0 0.261799 1 %.3F %.3F Tm ';
-            } else {
-                $aix = '%.3F %.3F Td ';
-            }
-            $px = ($this->x + $dx) * Mpdf::SCALE;
-            $py = ($this->h - ($this->y + $glyphYorigin - $baseline_shift)) * Mpdf::SCALE;
-            // THE TEXT
-            $txt2 = $txt;
-            $sub = '';
-            $this->CurrentFont['used'] = \true;
-            /*             * ************** SIMILAR TO Text() ************************ */
-            // IF corefonts AND NOT SmCaps AND NOT Kerning
-            // Just output text; charspacing and wordspacing already set by charspacing (Tc) and ws (Tw)
-            if ($this->usingCoreFont && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING)) {
-                $txt2 = $this->writer->escape($txt2);
-                $sub .= \sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
-            } elseif (!$this->usingCoreFont && !$this->ws && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING) && !(isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff && !empty($OTLdata['GPOSinfo']))) {
-                // IF SIP/SMP
-                if (isset($this->CurrentFont['sip']) && $this->CurrentFont['sip'] || isset($this->CurrentFont['smp']) && $this->CurrentFont['smp']) {
-                    $txt2 = $this->UTF8toSubset($txt2);
-                    $sub .= \sprintf('BT ' . $aix . ' %s Tj ET', $px, $py, $txt2);
-                } else {
-                    $txt2 = $this->writer->utf8ToUtf16BigEndian($txt2, \false);
-                    $txt2 = $this->writer->escape($txt2);
-                    $sub .= \sprintf('BT ' . $aix . ' (%s) Tj ET', $px, $py, $txt2);
-                }
-            } elseif (!$this->usingCoreFont && $this->ws && !(isset($this->CurrentFont['sip']) && $this->CurrentFont['sip'] || isset($this->CurrentFont['smp']) && $this->CurrentFont['smp']) && !($textvar & TextVars::FC_SMALLCAPS) && !($textvar & TextVars::FC_KERNING) && !(isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff && (!empty($OTLdata['GPOSinfo']) || \strpos($OTLdata['group'], 'M') !== \false && $this->charspacing))) {
-                $space = " ";
-                $space = $this->writer->utf8ToUtf16BigEndian($space, \false);
-                $space = $this->writer->escape($space);
-                $sub .= \sprintf('BT ' . $aix . ' %.3F Tc [', $px, $py, $this->charspacing);
-                $t = \explode(' ', $txt2);
-                $numt = \count($t);
-                for ($i = 0; $i < $numt; $i++) {
-                    $tx = $t[$i];
-                    $tx = $this->writer->utf8ToUtf16BigEndian($tx, \false);
-                    $tx = $this->writer->escape($tx);
-                    $sub .= \sprintf('(%s) ', $tx);
-                    if ($i + 1 < $numt) {
-                        $adj = -$this->ws * 1000 / $this->FontSizePt;
-                        $sub .= \sprintf('%d(%s) ', $adj, $space);
-                    }
-                }
-                $sub .= '] TJ ';
-                $sub .= ' ET';
-            } else {
-                $sub = $this->applyGPOSpdf($txt, $aix, $px, $py, $OTLdata, $textvar);
-            }
-            /** ************** END SIMILAR TO Text() ************************ */
-            if ($this->shrin_k > 1) {
-                $shrin_k = $this->shrin_k;
-            } else {
-                $shrin_k = 1;
-            }
-            // UNDERLINE
-            if ($textvar & TextVars::FD_UNDERLINE) {
-                // mPDF 5.7.1	// mPDF 6
-                // mPDF 5.7.3  inline text-decoration parameters
-                $c = isset($this->textparam['u-decoration']['color']) ? $this->textparam['u-decoration']['color'] : '';
-                if ($this->FillColor != $c) {
-                    $sub .= ' ' . $c . ' ';
-                }
-                // mPDF 5.7.3  inline text-decoration parameters
-                $decorationfontkey = isset($this->textparam['u-decoration']['fontkey']) ? $this->textparam['u-decoration']['fontkey'] : '';
-                $decorationfontsize = isset($this->textparam['u-decoration']['fontsize']) ? $this->textparam['u-decoration']['fontsize'] / $shrin_k : 0;
-                if (isset($this->fonts[$decorationfontkey]['ut']) && $this->fonts[$decorationfontkey]['ut']) {
-                    $ut = $this->fonts[$decorationfontkey]['ut'] / 1000 * $decorationfontsize;
-                } else {
-                    $ut = 60 / 1000 * $decorationfontsize;
-                }
-                if (isset($this->fonts[$decorationfontkey]['up']) && $this->fonts[$decorationfontkey]['up']) {
-                    $up = $this->fonts[$decorationfontkey]['up'];
-                } else {
-                    $up = -100;
-                }
-                $adjusty = -$up / 1000 * $decorationfontsize + $ut / 2;
-                $ubaseline = isset($this->textparam['u-decoration']['baseline']) ? $glyphYorigin - $this->textparam['u-decoration']['baseline'] / $shrin_k : $glyphYorigin;
-                $olw = $this->LineWidth;
-                $sub .= ' ' . \sprintf(' %.3F w 0 j 0 J ', $ut * Mpdf::SCALE);
-                $sub .= ' ' . $this->_dounderline($this->x + $dx, $this->y + $ubaseline + $adjusty, $txt, $OTLdata, $textvar);
-                $sub .= ' ' . \sprintf(' %.3F w 2 j 2 J ', $olw * Mpdf::SCALE);
-                if ($this->FillColor != $c) {
-                    $sub .= ' ' . $this->FillColor . ' ';
-                }
-            }
-            // STRIKETHROUGH
-            if ($textvar & TextVars::FD_LINETHROUGH) {
-                // mPDF 5.7.1	// mPDF 6
-                // mPDF 5.7.3  inline text-decoration parameters
-                $c = $this->textparam['s-decoration']['color'];
-                if ($this->FillColor != $c) {
-                    $sub .= ' ' . $c . ' ';
-                }
-                // mPDF 5.7.3  inline text-decoration parameters
-                $decorationfontkey = $this->textparam['s-decoration']['fontkey'];
-                $decorationfontsize = $this->textparam['s-decoration']['fontsize'] / $shrin_k;
-                // Use yStrikeoutSize from OS/2 if available
-                if (isset($this->fonts[$decorationfontkey]['strs']) && $this->fonts[$decorationfontkey]['strs']) {
-                    $ut = $this->fonts[$decorationfontkey]['strs'] / 1000 * $decorationfontsize;
-                } elseif (isset($this->fonts[$decorationfontkey]['ut']) && $this->fonts[$decorationfontkey]['ut']) {
-                    $ut = $this->fonts[$decorationfontkey]['ut'] / 1000 * $decorationfontsize;
-                } else {
-                    $ut = 50 / 1000 * $decorationfontsize;
-                }
-                // Use yStrikeoutPosition from OS/2 if available
-                if (isset($this->fonts[$decorationfontkey]['strp']) && $this->fonts[$decorationfontkey]['strp']) {
-                    $up = $this->fonts[$decorationfontkey]['strp'];
-                    $adjusty = -$up / 1000 * $decorationfontsize;
-                } else {
-                    if (isset($this->fonts[$decorationfontkey]['desc']['CapHeight']) && $this->fonts[$decorationfontkey]['desc']['CapHeight']) {
-                        $ch = $this->fonts[$decorationfontkey]['desc']['CapHeight'];
-                    } else {
-                        $ch = 700;
-                    }
-                    $adjusty = -$ch / 1000 * $decorationfontsize * $this->baselineS;
-                }
-                $sbaseline = $glyphYorigin - $this->textparam['s-decoration']['baseline'] / $shrin_k;
-                $olw = $this->LineWidth;
-                $sub .= ' ' . \sprintf(' %.3F w 0 j 0 J ', $ut * Mpdf::SCALE);
-                $sub .= ' ' . $this->_dounderline($this->x + $dx, $this->y + $sbaseline + $adjusty, $txt, $OTLdata, $textvar);
-                $sub .= ' ' . \sprintf(' %.3F w 2 j 2 J ', $olw * Mpdf::SCALE);
-                if ($this->FillColor != $c) {
-                    $sub .= ' ' . $this->FillColor . ' ';
-                }
-            }
-            // mPDF 5.7.3  inline text-decoration parameters
-            // OVERLINE
-            if ($textvar & TextVars::FD_OVERLINE) {
-                // mPDF 5.7.1	// mPDF 6
-                // mPDF 5.7.3  inline text-decoration parameters
-                $c = $this->textparam['o-decoration']['color'];
-                if ($this->FillColor != $c) {
-                    $sub .= ' ' . $c . ' ';
-                }
-                // mPDF 5.7.3  inline text-decoration parameters
-                $decorationfontkey = (int) ((float) $this->textparam['o-decoration']['fontkey'] / $shrin_k);
-                $decorationfontsize = $this->textparam['o-decoration']['fontsize'];
-                if (isset($this->fonts[$decorationfontkey]['ut']) && $this->fonts[$decorationfontkey]['ut']) {
-                    $ut = $this->fonts[$decorationfontkey]['ut'] / 1000 * $decorationfontsize;
-                } else {
-                    $ut = 60 / 1000 * $decorationfontsize;
-                }
-                if (isset($this->fonts[$decorationfontkey]['desc']['CapHeight']) && $this->fonts[$decorationfontkey]['desc']['CapHeight']) {
-                    $ch = $this->fonts[$decorationfontkey]['desc']['CapHeight'];
-                } else {
-                    $ch = 700;
-                }
-                $adjusty = -$ch / 1000 * $decorationfontsize * $this->baselineO;
-                $obaseline = $glyphYorigin - $this->textparam['o-decoration']['baseline'] / $shrin_k;
-                $olw = $this->LineWidth;
-                $sub .= ' ' . \sprintf(' %.3F w 0 j 0 J ', $ut * Mpdf::SCALE);
-                $sub .= ' ' . $this->_dounderline($this->x + $dx, $this->y + $obaseline + $adjusty, $txt, $OTLdata, $textvar);
-                $sub .= ' ' . \sprintf(' %.3F w 2 j 2 J ', $olw * Mpdf::SCALE);
-                if ($this->FillColor != $c) {
-                    $sub .= ' ' . $this->FillColor . ' ';
-                }
-            }
-            // TEXT SHADOW
-            if ($this->textshadow) {
-                // First to process is last in CSS comma separated shadows
-                foreach ($this->textshadow as $ts) {
-                    $s .= ' q ';
-                    $s .= $this->SetTColor($ts['col'], \true) . "\n";
-                    if ($ts['col'][0] == 5 && \ord($ts['col'][4]) < 100) {
-                        // RGBa
-                        $s .= $this->SetAlpha(\ord($ts['col'][4]) / 100, 'Normal', \true, 'F') . "\n";
-                    } elseif ($ts['col'][0] == 6 && \ord($ts['col'][5]) < 100) {
-                        // CMYKa
-                        $s .= $this->SetAlpha(\ord($ts['col'][5]) / 100, 'Normal', \true, 'F') . "\n";
-                    } elseif ($ts['col'][0] == 1 && $ts['col'][2] == 1 && \ord($ts['col'][3]) < 100) {
-                        // Gray
-                        $s .= $this->SetAlpha(\ord($ts['col'][3]) / 100, 'Normal', \true, 'F') . "\n";
-                    }
-                    $s .= \sprintf(' 1 0 0 1 %.4F %.4F cm', $ts['x'] * Mpdf::SCALE, -$ts['y'] * Mpdf::SCALE) . "\n";
-                    $s .= $sub;
-                    $s .= ' Q ';
-                }
-            }
-            $s .= $sub;
-            // COLOR
-            if ($this->ColorFlag) {
-                $s .= ' Q';
-            }
-            // LINK
-            if ($link != '') {
-                $this->Link($this->x, $boxtop, $w, $boxheight, $link);
-            }
-        }
-        if ($s) {
-            $this->writer->write($s);
-        }
-        // WORD SPACING
-        if ($this->ws && !$this->usingCoreFont) {
-            $this->writer->write(\sprintf('BT %.3F Tc ET', $this->charspacing));
-        }
-        $this->lasth = $h;
-        if (\strpos($txt, "\n") !== \false) {
-            $ln = 1;
-            // cell recognizes \n from 
tag - } - if ($ln > 0) { - // Go to next line - $this->y += $h; - if ($ln == 1) { - // Move to next line - if ($currentx != 0) { - $this->x = $currentx; - } else { - $this->x = $this->lMargin; - } - } - } else { - $this->x += $w; - } - } - function applyGPOSpdf($txt, $aix, $x, $y, $OTLdata, $textvar = 0) - { - $sipset = isset($this->CurrentFont['sip']) && $this->CurrentFont['sip'] || isset($this->CurrentFont['smp']) && $this->CurrentFont['smp']; - $smcaps = $textvar & TextVars::FC_SMALLCAPS; - $fontid = $sipset ? $last_fontid = $original_fontid = $this->CurrentFont['subsetfontids'][0] : ($last_fontid = $original_fontid = $this->CurrentFont['i']); - $SmallCapsON = \false; - // state: uppercase/not - $lastSmallCapsON = \false; - // state: uppercase/not - $last_fontsize = $fontsize = $this->FontSizePt; - $last_fontstretch = $fontstretch = 100; - $groupBreak = \false; - $unicode = $this->UTF8StringToArray($txt); - $GPOSinfo = isset($OTLdata['GPOSinfo']) ? $OTLdata['GPOSinfo'] : []; - $charspacing = $this->charspacing * 1000 / $this->FontSizePt; - $wordspacing = $this->ws * 1000 / $this->FontSizePt; - $XshiftBefore = 0; - $XshiftAfter = 0; - $lastYPlacement = 0; - $tj = $sipset ? '<' : '('; - for ($i = 0; $i < \count($unicode); $i++) { - $c = $unicode[$i]; - $tx = ''; - $XshiftBefore = $XshiftAfter; - $XshiftAfter = 0; - $YPlacement = 0; - $groupBreak = \false; - $kashida = 0; - if (!empty($OTLdata)) { - // YPlacement from GPOS - if (isset($GPOSinfo[$i]['YPlacement']) && $GPOSinfo[$i]['YPlacement']) { - $YPlacement = $GPOSinfo[$i]['YPlacement'] * $this->FontSizePt / $this->CurrentFont['unitsPerEm']; - $groupBreak = \true; - } - // XPlacement from GPOS - if (isset($GPOSinfo[$i]['XPlacement']) && $GPOSinfo[$i]['XPlacement']) { - if (!isset($GPOSinfo[$i]['wDir']) || $GPOSinfo[$i]['wDir'] !== 'RTL') { - if (isset($GPOSinfo[$i]['BaseWidth'])) { - $GPOSinfo[$i]['XPlacement'] -= $GPOSinfo[$i]['BaseWidth']; - } - } - // Convert to PDF Text space (thousandths of a unit ); - $XshiftBefore += $GPOSinfo[$i]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; - $XshiftAfter += -$GPOSinfo[$i]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; - } - // Kashida from GPOS - // Kashida is set as an absolute length value, but to adjust text needs to be converted to - // font-related size - if (isset($GPOSinfo[$i]['kashida_space']) && $GPOSinfo[$i]['kashida_space']) { - $kashida = $GPOSinfo[$i]['kashida_space']; - } - if ($c == 32) { - // word spacing - $XshiftAfter += $wordspacing; - } - if (\substr($OTLdata['group'], $i + 1, 1) !== 'M') { - // Don't add inter-character spacing before Marks - $XshiftAfter += $charspacing; - } - // ...applyGPOSpdf... - // XAdvance from GPOS - Convert to PDF Text space (thousandths of a unit ); - if ((isset($GPOSinfo[$i]['wDir']) && $GPOSinfo[$i]['wDir'] !== 'RTL' || !isset($GPOSinfo[$i]['wDir'])) && isset($GPOSinfo[$i]['XAdvanceL']) && $GPOSinfo[$i]['XAdvanceL']) { - $XshiftAfter += $GPOSinfo[$i]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm']; - } elseif (isset($GPOSinfo[$i]['wDir']) && $GPOSinfo[$i]['wDir'] === 'RTL' && isset($GPOSinfo[$i]['XAdvanceR']) && $GPOSinfo[$i]['XAdvanceR']) { - $XshiftAfter += $GPOSinfo[$i]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm']; - } - } else { - // Character & Word spacing - if NOT OTL - $XshiftAfter += $charspacing; - if ($c == 32) { - $XshiftAfter += $wordspacing; - } - } - // IF Kerning done using pairs rather than OTL - if ($textvar & TextVars::FC_KERNING) { - if ($i > 0 && isset($this->CurrentFont['kerninfo'][$unicode[$i - 1]][$unicode[$i]])) { - $XshiftBefore += $this->CurrentFont['kerninfo'][$unicode[$i - 1]][$unicode[$i]]; - } - } - if ($YPlacement !== $lastYPlacement) { - $groupBreak = \true; - } - if ($XshiftBefore) { - // +ve value in PDF moves to the left - // If Fontstretch is ongoing, need to adjust X adjustments because these will be stretched out. - $XshiftBefore *= 100 / $last_fontstretch; - if ($sipset) { - $tj .= \sprintf('>%d<', -$XshiftBefore); - } else { - $tj .= \sprintf(')%d(', -$XshiftBefore); - } - } - // Small-Caps - if ($smcaps) { - if (isset($this->upperCase[$c])) { - $c = $this->upperCase[$c]; - // $this->CurrentFont['subset'][$this->upperCase[$c]] = $this->upperCase[$c]; // add the CAP to subset - $SmallCapsON = \true; - // For $sipset - if (!$lastSmallCapsON) { - // Turn ON SmallCaps - $groupBreak = \true; - $fontstretch = $this->smCapsStretch; - $fontsize = $this->FontSizePt * $this->smCapsScale; - } - } else { - $SmallCapsON = \false; - if ($lastSmallCapsON) { - // Turn OFF SmallCaps - $groupBreak = \true; - $fontstretch = 100; - $fontsize = $this->FontSizePt; - } - } - } - // Prepare Text and Select Font ID - if ($sipset) { - for ($j = 0; $j < 99; $j++) { - $init = \array_search($c, $this->CurrentFont['subsets'][$j]); - if ($init !== \false) { - if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { - $groupBreak = \true; - $fontid = $this->CurrentFont['subsetfontids'][$j]; - } - $tx = \sprintf("%02s", \strtoupper(\dechex($init))); - break; - } - if (\count($this->CurrentFont['subsets'][$j]) < 255) { - $n = \count($this->CurrentFont['subsets'][$j]); - $this->CurrentFont['subsets'][$j][$n] = $c; - if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { - $groupBreak = \true; - $fontid = $this->CurrentFont['subsetfontids'][$j]; - } - $tx = \sprintf("%02s", \strtoupper(\dechex($n))); - break; - } - if (!isset($this->CurrentFont['subsets'][$j + 1])) { - $this->CurrentFont['subsets'][$j + 1] = [0 => 0]; - $this->CurrentFont['subsetfontids'][$j + 1] = \count($this->fonts) + $this->extraFontSubsets + 1; - $this->extraFontSubsets++; - } - } - } else { - $tx = UtfString::code2utf($c); - if ($this->usingCoreFont) { - $tx = \iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $tx); - } else { - $tx = $this->writer->utf8ToUtf16BigEndian($tx, \false); - } - $tx = $this->writer->escape($tx); - } - // If any settings require a new Text Group - if ($groupBreak || $fontstretch != $last_fontstretch) { - $tj .= $sipset ? '>] TJ ' : ')] TJ '; - if ($fontid != $last_fontid || $fontsize != $last_fontsize) { - $tj .= \sprintf(' /F%d %.3F Tf ', $fontid, $fontsize); - } - if ($fontstretch != $last_fontstretch) { - $tj .= \sprintf('%d Tz ', $fontstretch); - } - if ($YPlacement != $lastYPlacement) { - $tj .= \sprintf('%.3F Ts ', $YPlacement); - } - $tj .= $sipset ? '[<' : '[('; - } - // Output the code for the txt character - $tj .= $tx; - $lastSmallCapsON = $SmallCapsON; - $last_fontid = $fontid; - $last_fontsize = $fontsize; - $last_fontstretch = $fontstretch; - // Kashida - if ($kashida) { - $c = 0x640; - // add the Tatweel U+0640 - if (isset($this->CurrentFont['subset'])) { - $this->CurrentFont['subset'][$c] = $c; - } - $kashida *= 1000 / $this->FontSizePt; - $tatw = $this->_getCharWidth($this->CurrentFont['cw'], 0x640); - // Get YPlacement from next Base character - $nextbase = $i + 1; - while ($OTLdata['group'][$nextbase] !== 'C') { - $nextbase++; - } - if (isset($GPOSinfo[$nextbase]) && isset($GPOSinfo[$nextbase]['YPlacement']) && $GPOSinfo[$nextbase]['YPlacement']) { - $YPlacement = $GPOSinfo[$nextbase]['YPlacement'] * $this->FontSizePt / $this->CurrentFont['unitsPerEm']; - } - // Prepare Text and Select Font ID - if ($sipset) { - for ($j = 0; $j < 99; $j++) { - $init = \array_search($c, $this->CurrentFont['subsets'][$j]); - if ($init !== \false) { - if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { - $fontid = $this->CurrentFont['subsetfontids'][$j]; - } - $tx = \sprintf("%02s", \strtoupper(\dechex($init))); - break; - } - if (\count($this->CurrentFont['subsets'][$j]) < 255) { - $n = \count($this->CurrentFont['subsets'][$j]); - $this->CurrentFont['subsets'][$j][$n] = $c; - if ($this->CurrentFont['subsetfontids'][$j] != $last_fontid) { - $fontid = $this->CurrentFont['subsetfontids'][$j]; - } - $tx = \sprintf("%02s", \strtoupper(\dechex($n))); - break; - } - if (!isset($this->CurrentFont['subsets'][$j + 1])) { - $this->CurrentFont['subsets'][$j + 1] = [0 => 0]; - $this->CurrentFont['subsetfontids'][$j + 1] = \count($this->fonts) + $this->extraFontSubsets + 1; - $this->extraFontSubsets++; - } - } - } else { - $tx = UtfString::code2utf($c); - $tx = $this->writer->utf8ToUtf16BigEndian($tx, \false); - $tx = $this->writer->escape($tx); - } - if ($kashida > $tatw) { - // Insert multiple tatweel characters, repositioning the last one to give correct total length - $fontstretch = 100; - $nt = (int) ($kashida / $tatw); - $nudgeback = ($nt + 1) * $tatw - $kashida; - $optx = \str_repeat($tx, $nt); - if ($sipset) { - $optx .= \sprintf('>%d<', $nudgeback); - } else { - $optx .= \sprintf(')%d(', $nudgeback); - } - $optx .= $tx; - // #last - } else { - // Insert single tatweel character and use fontstretch to get correct length - $fontstretch = $kashida / $tatw * 100; - $optx = $tx; - } - $tj .= $sipset ? '>] TJ ' : ')] TJ '; - if ($fontid != $last_fontid || $fontsize != $last_fontsize) { - $tj .= \sprintf(' /F%d %.3F Tf ', $fontid, $fontsize); - } - if ($fontstretch != $last_fontstretch) { - $tj .= \sprintf('%d Tz ', $fontstretch); - } - $tj .= \sprintf('%.3F Ts ', $YPlacement); - $tj .= $sipset ? '[<' : '[('; - // Output the code for the txt character(s) - $tj .= $optx; - $last_fontid = $fontid; - $last_fontstretch = $fontstretch; - $fontstretch = 100; - } - $lastYPlacement = $YPlacement; - } - $tj .= $sipset ? '>' : ')'; - if ($XshiftAfter) { - $tj .= \sprintf('%d', -$XshiftAfter); - } - if ($last_fontid != $original_fontid) { - $tj .= '] TJ '; - $tj .= \sprintf(' /F%d %.3F Tf ', $original_fontid, $fontsize); - $tj .= '['; - } - $tj = $sipset ? \preg_replace('/([^\\\\])<>/', '\\1 ', $tj) : \preg_replace('/([^\\\\])\\(\\)/', '\\1 ', $tj); - return \sprintf(' BT ' . $aix . ' 0 Tc 0 Tw [%s] TJ ET ', $x, $y, $tj); - } - function _kern($txt, $mode, $aix, $x, $y) - { - if ($mode === 'MBTw') { - // Multibyte requiring word spacing - $space = ' '; - // Convert string to UTF-16BE without BOM - $space = $this->writer->utf8ToUtf16BigEndian($space, \false); - $space = $this->writer->escape($space); - $s = \sprintf(' BT ' . $aix, $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE); - $t = \explode(' ', $txt); - foreach ($t as $i => $iValue) { - $tx = $iValue; - $tj = '('; - $unicode = $this->UTF8StringToArray($tx); - foreach ($unicode as $ti => $tiValue) { - if ($ti > 0 && isset($this->CurrentFont['kerninfo'][$unicode[$ti - 1]][$tiValue])) { - $kern = -$this->CurrentFont['kerninfo'][$unicode[$ti - 1]][$tiValue]; - $tj .= \sprintf(')%d(', $kern); - } - $tc = UtfString::code2utf($tiValue); - $tc = $this->writer->utf8ToUtf16BigEndian($tc, \false); - $tj .= $this->writer->escape($tc); - } - $tj .= ')'; - $s .= \sprintf(' %.3F Tc [%s] TJ', $this->charspacing, $tj); - if ($i + 1 < \count($t)) { - $s .= \sprintf(' %.3F Tc (%s) Tj', $this->ws + $this->charspacing, $space); - } - } - $s .= ' ET '; - return $s; - } - if (!$this->usingCoreFont) { - $s = ''; - $tj = '('; - $unicode = $this->UTF8StringToArray($txt); - foreach ($unicode as $i => $iValue) { - if ($i > 0 && isset($this->CurrentFont['kerninfo'][$unicode[$i - 1]][$iValue])) { - $kern = -$this->CurrentFont['kerninfo'][$unicode[$i - 1]][$iValue]; - $tj .= \sprintf(')%d(', $kern); - } - $tx = UtfString::code2utf($iValue); - $tx = $this->writer->utf8ToUtf16BigEndian($tx, \false); - $tj .= $this->writer->escape($tx); - } - $tj .= ')'; - $s .= \sprintf(' BT ' . $aix . ' [%s] TJ ET ', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $tj); - return $s; - } - $s = ''; - $tj = '('; - $l = \strlen($txt); - for ($i = 0; $i < $l; $i++) { - if ($i > 0 && isset($this->CurrentFont['kerninfo'][$txt[$i - 1]][$txt[$i]])) { - $kern = -$this->CurrentFont['kerninfo'][$txt[$i - 1]][$txt[$i]]; - $tj .= \sprintf(')%d(', $kern); - } - $tj .= $this->writer->escape($txt[$i]); - } - $tj .= ')'; - $s .= \sprintf(' BT ' . $aix . ' [%s] TJ ET ', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $tj); - return $s; - } - function MultiCell($w, $h, $txt, $border = 0, $align = '', $fill = 0, $link = '', $directionality = 'ltr', $encoded = \false, $OTLdata = \false, $maxrows = \false) - { - // maxrows is called from mpdfform->TEXTAREA - // Parameter (pre-)encoded - When called internally from form::textarea - - // mb_encoding already done and OTL - but not reverse RTL - if (!$encoded) { - $txt = $this->purify_utf8_text($txt); - if ($this->text_input_as_HTML) { - $txt = $this->all_entities_to_utf8($txt); - } - if ($this->usingCoreFont) { - $txt = \mb_convert_encoding($txt, $this->mb_enc, 'UTF-8'); - } - if (\preg_match("/([" . $this->pregRTLchars . "])/u", $txt)) { - $this->biDirectional = \true; - } - /* -- OTL -- */ - if (!\is_array($OTLdata)) { - unset($OTLdata); - } - // Use OTL OpenType Table Layout - GSUB & GPOS - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $txt = $this->otl->applyOTL($txt, $this->CurrentFont['useOTL']); - $OTLdata = $this->otl->OTLdata; - } - if ($directionality == 'rtl' || $this->biDirectional) { - if (!isset($OTLdata)) { - $unicode = $this->UTF8StringToArray($txt, \false); - $is_strong = \false; - $this->getBasicOTLdata($OTLdata, $unicode, $is_strong); - } - } - /* -- END OTL -- */ - } - if (!$align) { - $align = $this->defaultAlign; - } - // Output text with automatic or explicit line breaks - $cw =& $this->CurrentFont['cw']; - if ($w == 0) { - $w = $this->w - $this->rMargin - $this->x; - } - $wmax = $w - ($this->cMarginL + $this->cMarginR); - if ($this->usingCoreFont) { - $s = \str_replace("\r", '', $txt); - $nb = \strlen($s); - while ($nb > 0 and $s[$nb - 1] == "\n") { - $nb--; - } - } else { - $s = \str_replace("\r", '', $txt); - $nb = \mb_strlen($s, $this->mb_enc); - while ($nb > 0 and \mb_substr($s, $nb - 1, 1, $this->mb_enc) == "\n") { - $nb--; - } - } - $b = 0; - if ($border) { - if ($border == 1) { - $border = 'LTRB'; - $b = 'LRT'; - $b2 = 'LR'; - } else { - $b2 = ''; - if (\is_int(\strpos($border, 'L'))) { - $b2 .= 'L'; - } - if (\is_int(\strpos($border, 'R'))) { - $b2 .= 'R'; - } - $b = \is_int(\strpos($border, 'T')) ? $b2 . 'T' : $b2; - } - } - $sep = -1; - $i = 0; - $j = 0; - $l = 0; - $ns = 0; - $nl = 1; - $rows = 0; - $start_y = $this->y; - if (!$this->usingCoreFont) { - $inclCursive = \false; - if (\preg_match("/([" . $this->pregCURSchars . "])/u", $s)) { - $inclCursive = \true; - } - while ($i < $nb) { - // Get next character - $c = \mb_substr($s, $i, 1, $this->mb_enc); - if ($c === "\n") { - // Explicit line break - // WORD SPACING - $this->ResetSpacing(); - $tmp = \rtrim(\mb_substr($s, $j, $i - $j, $this->mb_enc)); - $tmpOTLdata = \false; - /* -- OTL -- */ - if (isset($OTLdata)) { - $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $i - $j); - $this->otl->trimOTLdata($tmpOTLdata, \false, \true); - $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); - } - /* -- END OTL -- */ - $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, \false, $tmpOTLdata); - if ($maxrows != \false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { - return \false; - } - $i++; - $sep = -1; - $j = $i; - $l = 0; - $ns = 0; - $nl++; - if ($border and $nl == 2) { - $b = $b2; - } - continue; - } - if ($c == " ") { - $sep = $i; - $ls = $l; - $ns++; - } - $l += $this->GetCharWidthNonCore($c); - if ($l > $wmax) { - // Automatic line break - if ($sep == -1) { - // Only one word - if ($i == $j) { - $i++; - } - // WORD SPACING - $this->ResetSpacing(); - $tmp = \rtrim(\mb_substr($s, $j, $i - $j, $this->mb_enc)); - $tmpOTLdata = \false; - /* -- OTL -- */ - if (isset($OTLdata)) { - $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $i - $j); - $this->otl->trimOTLdata($tmpOTLdata, \false, \true); - $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); - } - /* -- END OTL -- */ - $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, \false, $tmpOTLdata); - } else { - $tmp = \rtrim(\mb_substr($s, $j, $sep - $j, $this->mb_enc)); - $tmpOTLdata = \false; - /* -- OTL -- */ - if (isset($OTLdata)) { - $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $sep - $j); - $this->otl->trimOTLdata($tmpOTLdata, \false, \true); - } - /* -- END OTL -- */ - if ($align === 'J') { - // JUSTIFY J using Unicode fonts (Word spacing doesn't work) - // WORD SPACING UNICODE - // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly - $tmp = \str_replace(\chr(194) . \chr(160), \chr(32), $tmp); - $len_ligne = $this->GetStringWidth($tmp, \false, $tmpOTLdata); - $nb_carac = \mb_strlen($tmp, $this->mb_enc); - $nb_spaces = \mb_substr_count($tmp, ' ', $this->mb_enc); - // Take off number of Marks - // Use GPOS OTL - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - if (isset($tmpOTLdata['group']) && $tmpOTLdata['group']) { - $nb_carac -= \substr_count($tmpOTLdata['group'], 'M'); - } - } - list($charspacing, $ws, $kashida) = $this->GetJspacing($nb_carac, $nb_spaces, ($wmax - $len_ligne) * Mpdf::SCALE, $inclCursive, $tmpOTLdata); - $this->SetSpacing($charspacing, $ws); - } - if (isset($OTLdata)) { - $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); - } - $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, \false, $tmpOTLdata); - $i = $sep + 1; - } - if ($maxrows != \false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { - return \false; - } - $sep = -1; - $j = $i; - $l = 0; - $ns = 0; - $nl++; - if ($border and $nl == 2) { - $b = $b2; - } - } else { - $i++; - } - } - // Last chunk - // WORD SPACING - $this->ResetSpacing(); - } else { - while ($i < $nb) { - // Get next character - $c = $s[$i]; - if ($c === "\n") { - // Explicit line break - // WORD SPACING - $this->ResetSpacing(); - $this->Cell($w, $h, \substr($s, $j, $i - $j), $b, 2, $align, $fill, $link); - if ($maxrows != \false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { - return \false; - } - $i++; - $sep = -1; - $j = $i; - $l = 0; - $ns = 0; - $nl++; - if ($border and $nl == 2) { - $b = $b2; - } - continue; - } - if ($c === ' ') { - $sep = $i; - $ls = $l; - $ns++; - } - $l += $this->GetCharWidthCore($c); - if ($l > $wmax) { - // Automatic line break - if ($sep == -1) { - if ($i == $j) { - $i++; - } - // WORD SPACING - $this->ResetSpacing(); - $this->Cell($w, $h, \substr($s, $j, $i - $j), $b, 2, $align, $fill, $link); - } else { - if ($align === 'J') { - $tmp = \rtrim(\substr($s, $j, $sep - $j)); - // JUSTIFY J using Unicode fonts (Word spacing doesn't work) - // WORD SPACING NON_UNICODE/CJK - // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly - $tmp = \str_replace(\chr(160), \chr(32), $tmp); - $len_ligne = $this->GetStringWidth($tmp); - $nb_carac = \strlen($tmp); - $nb_spaces = \substr_count($tmp, ' '); - $tmpOTLdata = []; - list($charspacing, $ws, $kashida) = $this->GetJspacing($nb_carac, $nb_spaces, ($wmax - $len_ligne) * Mpdf::SCALE, \false, $tmpOTLdata); - $this->SetSpacing($charspacing, $ws); - } - $this->Cell($w, $h, \substr($s, $j, $sep - $j), $b, 2, $align, $fill, $link); - $i = $sep + 1; - } - if ($maxrows != \false && isset($this->form) && ($this->y - $start_y) / $h > $maxrows) { - return \false; - } - $sep = -1; - $j = $i; - $l = 0; - $ns = 0; - $nl++; - if ($border and $nl == 2) { - $b = $b2; - } - } else { - $i++; - } - } - // Last chunk - // WORD SPACING - $this->ResetSpacing(); - } - // Last chunk - if ($border and \is_int(\strpos($border, 'B'))) { - $b .= 'B'; - } - if (!$this->usingCoreFont) { - $tmp = \rtrim(\mb_substr($s, $j, $i - $j, $this->mb_enc)); - $tmpOTLdata = \false; - /* -- OTL -- */ - if (isset($OTLdata)) { - $tmpOTLdata = $this->otl->sliceOTLdata($OTLdata, $j, $i - $j); - $this->otl->trimOTLdata($tmpOTLdata, \false, \true); - $this->magic_reverse_dir($tmp, $directionality, $tmpOTLdata); - } - /* -- END OTL -- */ - $this->Cell($w, $h, $tmp, $b, 2, $align, $fill, $link, 0, 0, 0, 'M', 0, \false, $tmpOTLdata); - } else { - $this->Cell($w, $h, \substr($s, $j, $i - $j), $b, 2, $align, $fill, $link); - } - $this->x = $this->lMargin; - } - /* -- DIRECTW -- */ - function Write($h, $txt, $currentx = 0, $link = '', $directionality = 'ltr', $align = '', $fill = 0) - { - if (empty($this->directWrite)) { - $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); - } - $this->directWrite->Write($h, $txt, $currentx, $link, $directionality, $align, $fill); - } - /* -- END DIRECTW -- */ - /* -- HTML-CSS -- */ - function saveInlineProperties() - { - $saved = []; - $saved['family'] = $this->FontFamily; - $saved['style'] = $this->FontStyle; - $saved['sizePt'] = $this->FontSizePt; - $saved['size'] = $this->FontSize; - $saved['HREF'] = $this->HREF; - $saved['textvar'] = $this->textvar; - // mPDF 5.7.1 - $saved['OTLtags'] = $this->OTLtags; - // mPDF 5.7.1 - $saved['textshadow'] = $this->textshadow; - $saved['linewidth'] = $this->LineWidth; - $saved['drawcolor'] = $this->DrawColor; - $saved['textparam'] = $this->textparam; - $saved['lSpacingCSS'] = $this->lSpacingCSS; - $saved['wSpacingCSS'] = $this->wSpacingCSS; - $saved['I'] = $this->I; - $saved['B'] = $this->B; - $saved['colorarray'] = $this->colorarray; - $saved['bgcolorarray'] = $this->spanbgcolorarray; - $saved['border'] = $this->spanborddet; - $saved['color'] = $this->TextColor; - $saved['bgcolor'] = $this->FillColor; - $saved['lang'] = $this->currentLang; - $saved['fontLanguageOverride'] = $this->fontLanguageOverride; - // mPDF 5.7.1 - $saved['display_off'] = $this->inlineDisplayOff; - return $saved; - } - function restoreInlineProperties(&$saved) - { - $FontFamily = $saved['family']; - $this->FontStyle = $saved['style']; - $this->FontSizePt = $saved['sizePt']; - $this->FontSize = $saved['size']; - $this->currentLang = $saved['lang']; - $this->fontLanguageOverride = $saved['fontLanguageOverride']; - // mPDF 5.7.1 - $this->ColorFlag = $this->FillColor != $this->TextColor; - // Restore ColorFlag as well - $this->HREF = $saved['HREF']; - $this->textvar = $saved['textvar']; - // mPDF 5.7.1 - $this->OTLtags = $saved['OTLtags']; - // mPDF 5.7.1 - $this->textshadow = $saved['textshadow']; - $this->LineWidth = $saved['linewidth']; - $this->DrawColor = $saved['drawcolor']; - $this->textparam = $saved['textparam']; - $this->inlineDisplayOff = $saved['display_off']; - $this->lSpacingCSS = $saved['lSpacingCSS']; - if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && \strtoupper($this->lSpacingCSS) != 'NORMAL') { - $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize); - } else { - $this->fixedlSpacing = \false; - } - $this->wSpacingCSS = $saved['wSpacingCSS']; - if ($this->wSpacingCSS && \strtoupper($this->wSpacingCSS) != 'NORMAL') { - $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize); - } else { - $this->minwSpacing = 0; - } - $this->SetFont($FontFamily, $saved['style'], $saved['sizePt'], \false); - $this->currentfontstyle = $saved['style']; - $this->currentfontsize = $saved['sizePt']; - $this->SetStylesArray(['B' => $saved['B'], 'I' => $saved['I']]); - // mPDF 5.7.1 - $this->TextColor = $saved['color']; - $this->FillColor = $saved['bgcolor']; - $this->colorarray = $saved['colorarray']; - $cor = $saved['colorarray']; - if ($cor) { - $this->SetTColor($cor); - } - $this->spanbgcolorarray = $saved['bgcolorarray']; - $cor = $saved['bgcolorarray']; - if ($cor) { - $this->SetFColor($cor); - } - $this->spanborddet = $saved['border']; - } - // Used when ColActive for tables - updated to return first block with background fill OR borders - function GetFirstBlockFill() - { - // Returns the first blocklevel that uses a bgcolor fill - $startfill = 0; - for ($i = 1; $i <= $this->blklvl; $i++) { - if ($this->blk[$i]['bgcolor'] || $this->blk[$i]['border_left']['w'] || $this->blk[$i]['border_right']['w'] || $this->blk[$i]['border_top']['w'] || $this->blk[$i]['border_bottom']['w']) { - $startfill = $i; - break; - } - } - return $startfill; - } - // -------------------------FLOWING BLOCK------------------------------------// - // The following functions were originally written by Damon Kohler // - // --------------------------------------------------------------------------// - function saveFont() - { - $saved = []; - $saved['family'] = $this->FontFamily; - $saved['style'] = $this->FontStyle; - $saved['sizePt'] = $this->FontSizePt; - $saved['size'] = $this->FontSize; - $saved['curr'] =& $this->CurrentFont; - $saved['lang'] = $this->currentLang; - // mPDF 6 - $saved['color'] = $this->TextColor; - $saved['spanbgcolor'] = $this->spanbgcolor; - $saved['spanbgcolorarray'] = $this->spanbgcolorarray; - $saved['bord'] = $this->spanborder; - $saved['border'] = $this->spanborddet; - $saved['HREF'] = $this->HREF; - $saved['textvar'] = $this->textvar; - // mPDF 5.7.1 - $saved['textshadow'] = $this->textshadow; - $saved['linewidth'] = $this->LineWidth; - $saved['drawcolor'] = $this->DrawColor; - $saved['textparam'] = $this->textparam; - $saved['ReqFontStyle'] = $this->ReqFontStyle; - $saved['fixedlSpacing'] = $this->fixedlSpacing; - $saved['minwSpacing'] = $this->minwSpacing; - return $saved; - } - function restoreFont(&$saved, $write = \true) - { - if (!isset($saved) || empty($saved)) { - return; - } - $this->FontFamily = $saved['family']; - $this->FontStyle = $saved['style']; - $this->FontSizePt = $saved['sizePt']; - $this->FontSize = $saved['size']; - $this->CurrentFont =& $saved['curr']; - $this->currentLang = $saved['lang']; - // mPDF 6 - $this->TextColor = $saved['color']; - $this->spanbgcolor = $saved['spanbgcolor']; - $this->spanbgcolorarray = $saved['spanbgcolorarray']; - $this->spanborder = $saved['bord']; - $this->spanborddet = $saved['border']; - $this->ColorFlag = $this->FillColor != $this->TextColor; - // Restore ColorFlag as well - $this->HREF = $saved['HREF']; - $this->fixedlSpacing = $saved['fixedlSpacing']; - $this->minwSpacing = $saved['minwSpacing']; - $this->textvar = $saved['textvar']; - // mPDF 5.7.1 - $this->textshadow = $saved['textshadow']; - $this->LineWidth = $saved['linewidth']; - $this->DrawColor = $saved['drawcolor']; - $this->textparam = $saved['textparam']; - if ($write) { - $this->SetFont($saved['family'], $saved['style'], $saved['sizePt'], \true, \true); - // force output - $fontout = \sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt); - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout || !isset($this->pageoutput[$this->page]['Font']))) { - $this->writer->write($fontout); - } - $this->pageoutput[$this->page]['Font'] = $fontout; - } else { - $this->SetFont($saved['family'], $saved['style'], $saved['sizePt'], \false); - } - $this->ReqFontStyle = $saved['ReqFontStyle']; - } - function newFlowingBlock($w, $h, $a = '', $is_table = \false, $blockstate = 0, $newblock = \true, $blockdir = 'ltr', $table_draft = \false) - { - if (!$a) { - if ($blockdir == 'rtl') { - $a = 'R'; - } else { - $a = 'L'; - } - } - $this->flowingBlockAttr['width'] = $w * Mpdf::SCALE; - // line height in user units - $this->flowingBlockAttr['is_table'] = $is_table; - $this->flowingBlockAttr['table_draft'] = $table_draft; - $this->flowingBlockAttr['height'] = $h; - $this->flowingBlockAttr['lineCount'] = 0; - $this->flowingBlockAttr['align'] = $a; - $this->flowingBlockAttr['font'] = []; - $this->flowingBlockAttr['content'] = []; - $this->flowingBlockAttr['contentB'] = []; - $this->flowingBlockAttr['contentWidth'] = 0; - $this->flowingBlockAttr['blockstate'] = $blockstate; - $this->flowingBlockAttr['newblock'] = $newblock; - $this->flowingBlockAttr['valign'] = 'M'; - $this->flowingBlockAttr['blockdir'] = $blockdir; - $this->flowingBlockAttr['cOTLdata'] = []; - // mPDF 5.7.1 - $this->flowingBlockAttr['lastBidiText'] = ''; - // mPDF 5.7.1 - if (!empty($this->otl)) { - $this->otl->lastBidiStrongType = ''; - } - // *OTL* - } - function finishFlowingBlock($endofblock = \false, $next = '') - { - $currentx = $this->x; - // prints out the last chunk - $is_table = $this->flowingBlockAttr['is_table']; - $table_draft = $this->flowingBlockAttr['table_draft']; - $maxWidth =& $this->flowingBlockAttr['width']; - $stackHeight =& $this->flowingBlockAttr['height']; - $align =& $this->flowingBlockAttr['align']; - $content =& $this->flowingBlockAttr['content']; - $contentB =& $this->flowingBlockAttr['contentB']; - $font =& $this->flowingBlockAttr['font']; - $contentWidth =& $this->flowingBlockAttr['contentWidth']; - $lineCount =& $this->flowingBlockAttr['lineCount']; - $valign =& $this->flowingBlockAttr['valign']; - $blockstate = $this->flowingBlockAttr['blockstate']; - $cOTLdata =& $this->flowingBlockAttr['cOTLdata']; - // mPDF 5.7.1 - $newblock = $this->flowingBlockAttr['newblock']; - $blockdir = $this->flowingBlockAttr['blockdir']; - // *********** BLOCK BACKGROUND COLOR *****************// - if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { - $fill = 0; - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - $fill = 0; - } - $hanger = ''; - // Always right trim! - // Right trim last content and adjust width if needed to justify (later) - if (isset($content[\count($content) - 1]) && \preg_match('/[ ]+$/', $content[\count($content) - 1], $m)) { - $strip = \strlen($m[0]); - $content[\count($content) - 1] = \substr($content[\count($content) - 1], 0, \strlen($content[\count($content) - 1]) - $strip); - /* -- OTL -- */ - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $this->otl->trimOTLdata($cOTLdata[\count($cOTLdata) - 1], \false, \true); - } - /* -- END OTL -- */ - } - // the amount of space taken up so far in user units - $usedWidth = 0; - // COLS - $oldcolumn = $this->CurrCol; - if ($this->ColActive && !$is_table) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - // Print out each chunk - /* -- TABLES -- */ - if ($is_table) { - $ipaddingL = 0; - $ipaddingR = 0; - $paddingL = 0; - $paddingR = 0; - } else { - /* -- END TABLES -- */ - $ipaddingL = $this->blk[$this->blklvl]['padding_left']; - $ipaddingR = $this->blk[$this->blklvl]['padding_right']; - $paddingL = $ipaddingL * Mpdf::SCALE; - $paddingR = $ipaddingR * Mpdf::SCALE; - $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; - $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; - // Added mPDF 3.0 Float DIV - $fpaddingR = 0; - $fpaddingL = 0; - /* -- CSS-FLOAT -- */ - if (\count($this->floatDivs)) { - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); - if ($r_exists) { - $fpaddingR = $r_width; - } - if ($l_exists) { - $fpaddingL = $l_width; - } - } - /* -- END CSS-FLOAT -- */ - $usey = $this->y + 0.002; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0) { - $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - /* -- CSS-IMAGE-FLOAT -- */ - // If float exists at this level - if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { - $fpaddingR += $this->floatmargins['R']['w']; - } - if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { - $fpaddingL += $this->floatmargins['L']['w']; - } - /* -- END CSS-IMAGE-FLOAT -- */ - } - // *TABLES* - $lineBox = []; - $this->_setInlineBlockHeights($lineBox, $stackHeight, $content, $font, $is_table); - if ($is_table && \count($content) == 0) { - $stackHeight = 0; - } - if ($table_draft) { - $this->y += $stackHeight; - $this->objectbuffer = []; - return 0; - } - // While we're at it, check if contains cursive text - // Change NBSP to SPACE. - // Re-calculate contentWidth - $contentWidth = 0; - foreach ($content as $k => $chunk) { - $this->restoreFont($font[$k], \false); - if (!isset($this->objectbuffer[$k]) || isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k]) { - // Soft Hyphens chr(173) - if (!$this->usingCoreFont) { - /* -- OTL -- */ - // mPDF 5.7.1 - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $this->otl->removeChar($chunk, $cOTLdata[$k], "­"); - $this->otl->replaceSpace($chunk, $cOTLdata[$k]); - $content[$k] = $chunk; - } else { - // *OTL* - $content[$k] = $chunk = \str_replace("­", '', $chunk); - $content[$k] = $chunk = \str_replace(\chr(194) . \chr(160), \chr(32), $chunk); - } - // *OTL* - } elseif ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') { - $content[$k] = $chunk = \str_replace(\chr(173), '', $chunk); - $content[$k] = $chunk = \str_replace(\chr(160), \chr(32), $chunk); - } - $contentWidth += $this->GetStringWidth($chunk, \true, isset($cOTLdata[$k]) ? $cOTLdata[$k] : \false, $this->textvar) * Mpdf::SCALE; - } elseif (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { - // LIST MARKERS // mPDF 6 Lists - if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker'] && $this->objectbuffer[$k]['listmarkerposition'] == 'outside') { - // do nothing - } else { - $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * Mpdf::SCALE; - } - } - } - if (isset($font[\count($font) - 1])) { - $lastfontreqstyle = isset($font[\count($font) - 1]['ReqFontStyle']) ? $font[\count($font) - 1]['ReqFontStyle'] : ''; - $lastfontstyle = isset($font[\count($font) - 1]['style']) ? $font[\count($font) - 1]['style'] : ''; - } else { - $lastfontreqstyle = null; - $lastfontstyle = null; - } - if ($blockdir == 'ltr' && $lastfontreqstyle && \strpos($lastfontreqstyle, "I") !== \false && \strpos($lastfontstyle, "I") === \false) { - // Artificial italic - $lastitalic = $this->FontSize * 0.15 * Mpdf::SCALE; - } else { - $lastitalic = 0; - } - // Get PAGEBREAK TO TEST for height including the bottom border/padding - $check_h = \max($this->divheight, $stackHeight); - // This fixes a proven bug... - if ($endofblock && $newblock && $blockstate == 0 && !$content) { - $check_h = 0; - } - // but ? needs to fix potentially more widespread... - // if (!$content) { $check_h = 0; } - if ($this->blklvl > 0 && !$is_table) { - if ($endofblock && $blockstate > 1) { - if ($this->blk[$this->blklvl]['page_break_after_avoid']) { - $check_h += $stackHeight; - } - $check_h += $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; - } - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0 || $endofblock && $blockstate == 3 && $lineCount == 0) { - $check_h += $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - } - // Force PAGE break if column height cannot take check-height - if ($this->ColActive && $check_h > $this->PageBreakTrigger - $this->y0) { - $this->SetCol($this->NbCol - 1); - } - // Avoid just border/background-color moved on to next page - if ($endofblock && $blockstate > 1 && !$content) { - $buff = $this->margBuffer; - } else { - $buff = 0; - } - // PAGEBREAK - if (!$is_table && $this->y + $check_h > $this->PageBreakTrigger + $buff and !$this->InFooter and $this->AcceptPageBreak()) { - $bak_x = $this->x; - // Current X position - // WORD SPACING - $ws = $this->ws; - // Word Spacing - $charspacing = $this->charspacing; - // Character Spacing - $this->ResetSpacing(); - $this->AddPage($this->CurOrientation); - $this->x = $bak_x; - // Added to correct for OddEven Margins - $currentx += $this->MarginCorrection; - $this->x += $this->MarginCorrection; - // WORD SPACING - $this->SetSpacing($charspacing, $ws); - } - /* -- COLUMNS -- */ - // COLS - // COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - $currentx += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - $oldcolumn = $this->CurrCol; - } - if ($this->ColActive && !$is_table) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - /* -- END COLUMNS -- */ - // TOP MARGIN - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $this->blk[$this->blklvl]['margin_top'] && $lineCount == 0 && !$is_table) { - $this->DivLn($this->blk[$this->blklvl]['margin_top'], $this->blklvl - 1, \true, $this->blk[$this->blklvl]['margin_collapse']); - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0 && !$is_table) { - $this->blk[$this->blklvl]['y0'] = $this->y; - $this->blk[$this->blklvl]['startpage'] = $this->page; - if ($this->blk[$this->blklvl]['float']) { - $this->blk[$this->blklvl]['float_start_y'] = $this->y; - } - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - // Paragraph INDENT - $WidthCorrection = 0; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && isset($this->blk[$this->blklvl]['text_indent']) && $lineCount == 0 && !$is_table && $align != 'C') { - $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], \false); - // mPDF 5.7.4 - $WidthCorrection = $ti * Mpdf::SCALE; - } - // PADDING and BORDER spacing/fill - if ($newblock && ($blockstate == 1 || $blockstate == 3) && ($this->blk[$this->blklvl]['padding_top'] || $this->blk[$this->blklvl]['border_top']) && $lineCount == 0 && !$is_table) { - // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom - $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'], -3, \true, \false, 1); - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - $this->x = $currentx; - } - // Added mPDF 3.0 Float DIV - $fpaddingR = 0; - $fpaddingL = 0; - /* -- CSS-FLOAT -- */ - if (\count($this->floatDivs)) { - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); - if ($r_exists) { - $fpaddingR = $r_width; - } - if ($l_exists) { - $fpaddingL = $l_width; - } - } - /* -- END CSS-FLOAT -- */ - $usey = $this->y + 0.002; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0) { - $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - /* -- CSS-IMAGE-FLOAT -- */ - // If float exists at this level - if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { - $fpaddingR += $this->floatmargins['R']['w']; - } - if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { - $fpaddingL += $this->floatmargins['L']['w']; - } - /* -- END CSS-IMAGE-FLOAT -- */ - if ($content) { - // In FinishFlowing Block no lines are justified as it is always last line - // but if CJKorphan has allowed content width to go over max width, use J charspacing to compress line - // JUSTIFICATION J - NOT! - $nb_carac = 0; - $nb_spaces = 0; - $jcharspacing = 0; - $jkashida = 0; - $jws = 0; - $inclCursive = \false; - $dottab = \false; - foreach ($content as $k => $chunk) { - if (!isset($this->objectbuffer[$k]) || isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k]) { - $nb_carac += \mb_strlen($chunk, $this->mb_enc); - $nb_spaces += \mb_substr_count($chunk, ' ', $this->mb_enc); - // mPDF 6 - // Use GPOS OTL - $this->restoreFont($font[$k], \false); - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - if (isset($cOTLdata[$k]['group']) && $cOTLdata[$k]['group']) { - $nb_marks = \substr_count($cOTLdata[$k]['group'], 'M'); - $nb_carac -= $nb_marks; - } - if (\preg_match("/([" . $this->pregCURSchars . "])/u", $chunk)) { - $inclCursive = \true; - } - } - } else { - $nb_carac++; - // mPDF 6 allow spacing for inline object - if ($this->objectbuffer[$k]['type'] == 'dottab') { - $dottab = $this->objectbuffer[$k]['outdent']; - } - } - } - // DIRECTIONALITY RTL - $chunkorder = \range(0, \count($content) - 1); - // mPDF 6 - /* -- OTL -- */ - // mPDF 6 - if ($blockdir == 'rtl' || $this->biDirectional) { - $this->otl->bidiReorder($chunkorder, $content, $cOTLdata, $blockdir); - // From this point on, $content and $cOTLdata may contain more elements (and re-ordered) compared to - // $this->objectbuffer and $font ($chunkorder contains the mapping) - } - /* -- END OTL -- */ - // Remove any XAdvance from OTL data at end of line - // And correct for XPlacement on last character - // BIDI is applied - foreach ($chunkorder as $aord => $k) { - if (\count($cOTLdata)) { - $this->restoreFont($font[$k], \false); - // ...FinishFlowingBlock... - if ($aord == \count($chunkorder) - 1 && isset($cOTLdata[$aord]['group'])) { - // Last chunk on line - $nGPOS = \strlen($cOTLdata[$aord]['group']) - 1; - // Last character - if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL']) || isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'])) { - if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'])) { - $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm']; - } else { - $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm']; - } - $w *= $this->FontSize / 1000; - $contentWidth -= $w * Mpdf::SCALE; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = 0; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = 0; - } - // If last character has an XPlacement set, adjust width calculation, and add to XAdvance to account for it - if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'])) { - $w = -$cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; - $w *= $this->FontSize / 1000; - $contentWidth -= $w * Mpdf::SCALE; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; - } - } - } - } - // if it's justified, we need to find the char/word spacing (or if orphans have allowed length of line to go over the maxwidth) - // If "orphans" in fact is just a final space - ignore this - $lastchar = \mb_substr($content[\count($chunkorder) - 1], \mb_strlen($content[\count($chunkorder) - 1], $this->mb_enc) - 1, 1, $this->mb_enc); - if (\preg_match("/[" . $this->CJKoverflow . "]/u", $lastchar)) { - $CJKoverflow = \true; - } else { - $CJKoverflow = \false; - } - if (($contentWidth + $lastitalic > $maxWidth && $content[\count($chunkorder) - 1] != ' ' || !$endofblock && $align == 'J' && ($next == 'image' || $next == 'select' || $next == 'input' || $next == 'textarea' || $next == 'br' && $this->justifyB4br)) && !($CJKoverflow && $this->allowCJKoverflow)) { - // WORD SPACING - list($jcharspacing, $jws, $jkashida) = $this->GetJspacing($nb_carac, $nb_spaces, $maxWidth - $lastitalic - $contentWidth - $WidthCorrection - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE), $inclCursive, $cOTLdata); - } elseif ($this->checkCJK && $align == 'J' && $CJKoverflow && $this->allowCJKoverflow && $this->CJKforceend) { - // force-end overhang - $hanger = \mb_substr($content[\count($chunkorder) - 1], \mb_strlen($content[\count($chunkorder) - 1], $this->mb_enc) - 1, 1, $this->mb_enc); - if (\preg_match("/[" . $this->CJKoverflow . "]/u", $hanger)) { - $content[\count($chunkorder) - 1] = \mb_substr($content[\count($chunkorder) - 1], 0, \mb_strlen($content[\count($chunkorder) - 1], $this->mb_enc) - 1, $this->mb_enc); - $this->restoreFont($font[$chunkorder[\count($chunkorder) - 1]], \false); - $contentWidth -= $this->GetStringWidth($hanger) * Mpdf::SCALE; - $nb_carac -= 1; - list($jcharspacing, $jws, $jkashida) = $this->GetJspacing($nb_carac, $nb_spaces, $maxWidth - $lastitalic - $contentWidth - $WidthCorrection - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE), $inclCursive, $cOTLdata); - } - } elseif ($contentWidth < $maxWidth - $lastitalic - $WidthCorrection - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE) && !$this->fixedlSpacing) { - if ($this->ws > $this->jSmaxWordLast) { - $jws = $this->jSmaxWordLast; - } - if ($this->charspacing > $this->jSmaxCharLast) { - $jcharspacing = $this->jSmaxCharLast; - } - $check = $maxWidth - $lastitalic - $WidthCorrection - $contentWidth - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE) - $jcharspacing * $nb_carac - $jws * $nb_spaces; - if ($check <= 0) { - $jcharspacing = 0; - $jws = 0; - } - } - $empty = $maxWidth - $lastitalic - $WidthCorrection - $contentWidth - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE); - $empty -= $jcharspacing * ($nb_carac - 1); - // mPDF 6 nb_carac MINUS 1 - $empty -= $jws * $nb_spaces; - $empty -= $jkashida; - $empty /= Mpdf::SCALE; - if (!$is_table) { - $this->maxPosR = \max($this->maxPosR, $this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'] - $empty); - $this->maxPosL = \min($this->maxPosL, $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $empty); - } - $arraysize = \count($chunkorder); - $margins = $this->cMarginL + $this->cMarginR + ($ipaddingL + $ipaddingR + $fpaddingR + $fpaddingR); - if (!$is_table) { - $this->DivLn($stackHeight, $this->blklvl, \false); - } - // false -> don't advance y - $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL; - if ($dottab !== \false && $blockdir == 'rtl') { - $this->x -= $dottab; - } elseif ($align == 'R') { - $this->x += $empty; - } elseif ($align == 'J' && $blockdir == 'rtl') { - $this->x += $empty; - } elseif ($align == 'C') { - $this->x += $empty / 2; - } - // Paragraph INDENT - $WidthCorrection = 0; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && isset($this->blk[$this->blklvl]['text_indent']) && $lineCount == 0 && !$is_table && $align != 'C') { - $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], \false); - // mPDF 5.7.4 - if ($blockdir != 'rtl') { - $this->x += $ti; - } - // mPDF 6 - } - foreach ($chunkorder as $aord => $k) { - // mPDF 5.7 - $chunk = $content[$aord]; - if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { - $xadj = $this->x - $this->objectbuffer[$k]['OUTER-X']; - $this->objectbuffer[$k]['OUTER-X'] += $xadj; - $this->objectbuffer[$k]['BORDER-X'] += $xadj; - $this->objectbuffer[$k]['INNER-X'] += $xadj; - if ($this->objectbuffer[$k]['type'] == 'listmarker') { - $this->objectbuffer[$k]['lineBox'] = $lineBox[-1]; - // Block element details for glyph-origin - } - $yadj = $this->y - $this->objectbuffer[$k]['OUTER-Y']; - if ($this->objectbuffer[$k]['type'] == 'dottab') { - // mPDF 6 DOTTAB - $this->objectbuffer[$k]['lineBox'] = $lineBox[$k]; - // element details for glyph-origin - } - if ($this->objectbuffer[$k]['type'] != 'dottab') { - // mPDF 6 DOTTAB - $yadj += $lineBox[$k]['top']; - } - $this->objectbuffer[$k]['OUTER-Y'] += $yadj; - $this->objectbuffer[$k]['BORDER-Y'] += $yadj; - $this->objectbuffer[$k]['INNER-Y'] += $yadj; - } - $this->restoreFont($font[$k]); - // mPDF 5.7 - if ($is_table && \substr($align, 0, 1) == 'D' && $aord == 0) { - $dp = $this->decimal_align[\substr($align, 0, 2)]; - $s = \preg_split('/' . \preg_quote($dp, '/') . '/', $content[0], 2); - // ? needs to be /u if not core - $s0 = $this->GetStringWidth($s[0], \false); - $this->x += $this->decimal_offset - $s0; - } - $this->SetSpacing($this->fixedlSpacing * Mpdf::SCALE + $jcharspacing, ($this->fixedlSpacing + $this->minwSpacing) * Mpdf::SCALE + $jws); - $this->fixedlSpacing = \false; - $this->minwSpacing = 0; - $save_vis = $this->visibility; - if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { - $this->SetVisibility($this->textparam['visibility']); - } - // *********** SPAN BACKGROUND COLOR ***************** // - if (isset($this->spanbgcolor) && $this->spanbgcolor) { - $cor = $this->spanbgcolorarray; - $this->SetFColor($cor); - $save_fill = $fill; - $spanfill = 1; - $fill = 1; - } - if (!empty($this->spanborddet)) { - if (\strpos($contentB[$k], 'L') !== \false && isset($this->spanborddet['L'])) { - $this->x += $this->spanborddet['L']['w']; - } - if (\strpos($contentB[$k], 'L') === \false) { - $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; - } - if (\strpos($contentB[$k], 'R') === \false) { - $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; - } - } - // WORD SPACING - // mPDF 5.7.1 - $stringWidth = $this->GetStringWidth($chunk, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar); - $nch = \mb_strlen($chunk, $this->mb_enc); - // Use GPOS OTL - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - if (isset($cOTLdata[$aord]['group']) && $cOTLdata[$aord]['group']) { - $nch -= \substr_count($cOTLdata[$aord]['group'], 'M'); - } - } - $stringWidth += $this->charspacing * $nch / Mpdf::SCALE; - $stringWidth += $this->ws * \mb_substr_count($chunk, ' ', $this->mb_enc) / Mpdf::SCALE; - if (isset($this->objectbuffer[$k])) { - if ($this->objectbuffer[$k]['type'] == 'dottab') { - $this->objectbuffer[$k]['OUTER-WIDTH'] += $empty; - $this->objectbuffer[$k]['OUTER-WIDTH'] += $this->objectbuffer[$k]['outdent']; - } - // LIST MARKERS // mPDF 6 Lists - if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker'] && $this->objectbuffer[$k]['listmarkerposition'] == 'outside') { - // do nothing - } else { - $stringWidth = $this->objectbuffer[$k]['OUTER-WIDTH']; - } - } - if ($stringWidth == 0) { - $stringWidth = 1.0E-6; - } - if ($aord == $arraysize - 1) { - // mPDF 5.7 - // mPDF 5.7.1 - if ($this->checkCJK && $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { - // force-end overhang - $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - // mPDF 5.7.1 - $this->Cell($this->GetStringWidth($hanger), $stackHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - // mPDF 5.7.1 - } else { - $this->Cell($stringWidth, $stackHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - // mPDF 5.7.1 - } - } else { - $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - // first or middle part // mPDF 5.7.1 - } - if (!empty($this->spanborddet)) { - if (\strpos($contentB[$k], 'R') !== \false && $aord != $arraysize - 1) { - $this->x += $this->spanborddet['R']['w']; - } - } - // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // - if (isset($spanfill) && $spanfill) { - $fill = $save_fill; - $spanfill = 0; - if ($fill) { - $this->SetFColor($bcor); - } - } - if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { - $this->SetVisibility($save_vis); - } - } - $this->printobjectbuffer($is_table, $blockdir); - $this->objectbuffer = []; - $this->ResetSpacing(); - } - // END IF CONTENT - /* -- CSS-IMAGE-FLOAT -- */ - // Update values if set to skipline - if ($this->floatmargins) { - $this->_advanceFloatMargins(); - } - if ($endofblock && $blockstate > 1) { - // If float exists at this level - if (isset($this->floatmargins['R']['y1'])) { - $fry1 = $this->floatmargins['R']['y1']; - } else { - $fry1 = 0; - } - if (isset($this->floatmargins['L']['y1'])) { - $fly1 = $this->floatmargins['L']['y1']; - } else { - $fly1 = 0; - } - if ($this->y < $fry1 || $this->y < $fly1) { - $drop = \max($fry1, $fly1) - $this->y; - $this->DivLn($drop); - $this->x = $currentx; - } - } - /* -- END CSS-IMAGE-FLOAT -- */ - // PADDING and BORDER spacing/fill - if ($endofblock && $blockstate > 1 && ($this->blk[$this->blklvl]['padding_bottom'] || $this->blk[$this->blklvl]['border_bottom'] || $this->blk[$this->blklvl]['css_set_height']) && !$is_table) { - // If CSS height set, extend bottom - if on same page as block started, and CSS HEIGHT > actual height, - // and does not force pagebreak - $extra = 0; - if (isset($this->blk[$this->blklvl]['css_set_height']) && $this->blk[$this->blklvl]['css_set_height'] && $this->blk[$this->blklvl]['startpage'] == $this->page) { - // predicted height - $h1 = $this->y - $this->blk[$this->blklvl]['y0'] + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; - if ($h1 < $this->blk[$this->blklvl]['css_set_height'] + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['padding_top']) { - $extra = $this->blk[$this->blklvl]['css_set_height'] + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['padding_top'] - $h1; - } - if ($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra > $this->PageBreakTrigger) { - $extra = $this->PageBreakTrigger - ($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); - } - } - // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom - $this->DivLn($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra, -3, \true, \false, 2); - $this->x = $currentx; - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - // SET Bottom y1 of block (used for painting borders) - if ($endofblock && $blockstate > 1 && !$is_table) { - $this->blk[$this->blklvl]['y1'] = $this->y; - } - // BOTTOM MARGIN - if ($endofblock && $blockstate > 1 && $this->blk[$this->blklvl]['margin_bottom'] && !$is_table) { - if ($this->y + $this->blk[$this->blklvl]['margin_bottom'] < $this->PageBreakTrigger and !$this->InFooter) { - $this->DivLn($this->blk[$this->blklvl]['margin_bottom'], $this->blklvl - 1, \true, $this->blk[$this->blklvl]['margin_collapse']); - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - } - // Reset lineheight - $stackHeight = $this->divheight; - } - function printobjectbuffer($is_table = \false, $blockdir = \false) - { - if (!$blockdir) { - $blockdir = $this->directionality; - } - if ($is_table && $this->shrin_k > 1) { - $k = $this->shrin_k; - } else { - $k = 1; - } - $save_y = $this->y; - $save_x = $this->x; - $save_currentfontfamily = $this->FontFamily; - $save_currentfontsize = $this->FontSizePt; - $save_currentfontstyle = $this->FontStyle; - if ($blockdir == 'rtl') { - $rtlalign = 'R'; - } else { - $rtlalign = 'L'; - } - foreach ($this->objectbuffer as $ib => $objattr) { - if ($objattr['type'] == 'bookmark' || $objattr['type'] == 'indexentry' || $objattr['type'] == 'toc') { - $x = $objattr['OUTER-X']; - $y = $objattr['OUTER-Y']; - $this->y = $y - $this->FontSize / 2; - $this->x = $x; - if ($objattr['type'] == 'bookmark') { - $this->Bookmark($objattr['CONTENT'], $objattr['bklevel'], $y - $this->FontSize); - } - // *BOOKMARKS* - if ($objattr['type'] == 'indexentry') { - $this->IndexEntry($objattr['CONTENT']); - } - // *INDEX* - if ($objattr['type'] == 'toc') { - $this->TOC_Entry($objattr['CONTENT'], $objattr['toclevel'], isset($objattr['toc_id']) ? $objattr['toc_id'] : ''); - } - // *TOC* - } elseif ($objattr['type'] == 'annot') { - if ($objattr['POS-X']) { - $x = $objattr['POS-X']; - } elseif ($this->annotMargin != 0) { - $x = -$objattr['OUTER-X']; - } else { - $x = $objattr['OUTER-X']; - } - if ($objattr['POS-Y']) { - $y = $objattr['POS-Y']; - } else { - $y = $objattr['OUTER-Y'] - $this->FontSize / 2; - } - // Create a dummy entry in the _out/columnBuffer with position sensitive data, - // linking $y-1 in the Columnbuffer with entry in $this->columnAnnots - // and when columns are split in length will not break annotation from current line - $this->y = $y - 1; - $this->x = $x - 1; - $this->Line($x - 1, $y - 1, $x - 1, $y - 1); - $this->Annotation($objattr['CONTENT'], $x, $y, $objattr['ICON'], $objattr['AUTHOR'], $objattr['SUBJECT'], $objattr['OPACITY'], $objattr['COLOR'], isset($objattr['POPUP']) ? $objattr['POPUP'] : '', isset($objattr['FILE']) ? $objattr['FILE'] : ''); - } else { - $y = $objattr['OUTER-Y']; - $x = $objattr['OUTER-X']; - $w = $objattr['OUTER-WIDTH']; - $h = $objattr['OUTER-HEIGHT']; - if (isset($objattr['text'])) { - $texto = $objattr['text']; - } - $this->y = $y; - $this->x = $x; - if (isset($objattr['fontfamily'])) { - $this->SetFont($objattr['fontfamily'], '', $objattr['fontsize']); - } - } - // HR - if ($objattr['type'] == 'hr') { - $this->SetDColor($objattr['color']); - switch ($objattr['align']) { - case 'C': - $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; - $empty /= 2; - $x += $empty; - break; - case 'R': - $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; - $x += $empty; - break; - } - $oldlinewidth = $this->LineWidth; - $this->SetLineWidth($objattr['linewidth'] / $k); - $this->y += $objattr['linewidth'] / 2 + $objattr['margin_top'] / $k; - $this->Line($x, $this->y, $x + $objattr['INNER-WIDTH'], $this->y); - $this->SetLineWidth($oldlinewidth); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - // IMAGE - if ($objattr['type'] == 'image') { - // mPDF 5.7.3 TRANSFORMS - if (isset($objattr['transform'])) { - $this->writer->write("\n" . '% BTR'); - // Begin Transform - } - if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->current_layer == 0) { - $this->BeginLayer($objattr['z-index']); - } - if (isset($objattr['visibility']) && $objattr['visibility'] != 'visible' && $objattr['visibility']) { - $this->SetVisibility($objattr['visibility']); - } - if (isset($objattr['opacity'])) { - $this->SetAlpha($objattr['opacity']); - } - $obiw = $objattr['INNER-WIDTH']; - $obih = $objattr['INNER-HEIGHT']; - $sx = $objattr['orig_w'] ? $objattr['INNER-WIDTH'] * Mpdf::SCALE / $objattr['orig_w'] : \INF; - $sy = $objattr['orig_h'] ? $objattr['INNER-HEIGHT'] * Mpdf::SCALE / $objattr['orig_h'] : \INF; - $rotate = 0; - if (isset($objattr['ROTATE'])) { - $rotate = $objattr['ROTATE']; - } - if ($rotate == 90) { - // Clockwise - $obiw = $objattr['INNER-HEIGHT']; - $obih = $objattr['INNER-WIDTH']; - $tr = $this->transformTranslate(0, -$objattr['INNER-WIDTH'], \true); - $tr .= ' ' . $this->transformRotate(90, $objattr['INNER-X'], $objattr['INNER-Y'] + $objattr['INNER-WIDTH'], \true); - $sx = $obiw * Mpdf::SCALE / $objattr['orig_h']; - $sy = $obih * Mpdf::SCALE / $objattr['orig_w']; - } elseif ($rotate == -90 || $rotate == 270) { - // AntiClockwise - $obiw = $objattr['INNER-HEIGHT']; - $obih = $objattr['INNER-WIDTH']; - $tr = $this->transformTranslate($objattr['INNER-WIDTH'], $objattr['INNER-HEIGHT'] - $objattr['INNER-WIDTH'], \true); - $tr .= ' ' . $this->transformRotate(-90, $objattr['INNER-X'], $objattr['INNER-Y'] + $objattr['INNER-WIDTH'], \true); - $sx = $obiw * Mpdf::SCALE / $objattr['orig_h']; - $sy = $obih * Mpdf::SCALE / $objattr['orig_w']; - } elseif ($rotate == 180) { - // Mirror - $tr = $this->transformTranslate($objattr['INNER-WIDTH'], -$objattr['INNER-HEIGHT'], \true); - $tr .= ' ' . $this->transformRotate(180, $objattr['INNER-X'], $objattr['INNER-Y'] + $objattr['INNER-HEIGHT'], \true); - } else { - $tr = ''; - } - $tr = \trim($tr); - if ($tr) { - $tr .= ' '; - } - $gradmask = ''; - // mPDF 5.7.3 TRANSFORMS - $tr2 = ''; - if (isset($objattr['transform'])) { - $maxsize_x = $w; - $maxsize_y = $h; - $cx = $x + $w / 2; - $cy = $y + $h / 2; - \preg_match_all('/(translatex|translatey|translate|scalex|scaley|scale|rotate|skewX|skewY|skew)\\((.*?)\\)/is', $objattr['transform'], $m); - if (\count($m[0])) { - for ($i = 0; $i < \count($m[0]); $i++) { - $c = \strtolower($m[1][$i]); - $v = \trim($m[2][$i]); - $vv = \preg_split('/[ ,]+/', $v); - if ($c == 'translate' && \count($vv)) { - $translate_x = $this->sizeConverter->convert($vv[0], $maxsize_x, \false, \false); - if (\count($vv) == 2) { - $translate_y = $this->sizeConverter->convert($vv[1], $maxsize_y, \false, \false); - } else { - $translate_y = 0; - } - $tr2 .= $this->transformTranslate($translate_x, $translate_y, \true) . ' '; - } elseif ($c == 'translatex' && \count($vv)) { - $translate_x = $this->sizeConverter->convert($vv[0], $maxsize_x, \false, \false); - $tr2 .= $this->transformTranslate($translate_x, 0, \true) . ' '; - } elseif ($c == 'translatey' && \count($vv)) { - $translate_y = $this->sizeConverter->convert($vv[1], $maxsize_y, \false, \false); - $tr2 .= $this->transformTranslate(0, $translate_y, \true) . ' '; - } elseif ($c == 'scale' && \count($vv)) { - $scale_x = $vv[0] * 100; - if (\count($vv) == 2) { - $scale_y = $vv[1] * 100; - } else { - $scale_y = $scale_x; - } - $tr2 .= $this->transformScale($scale_x, $scale_y, $cx, $cy, \true) . ' '; - } elseif ($c == 'scalex' && \count($vv)) { - $scale_x = $vv[0] * 100; - $tr2 .= $this->transformScale($scale_x, 0, $cx, $cy, \true) . ' '; - } elseif ($c == 'scaley' && \count($vv)) { - $scale_y = $vv[1] * 100; - $tr2 .= $this->transformScale(0, $scale_y, $cx, $cy, \true) . ' '; - } elseif ($c == 'skew' && \count($vv)) { - $angle_x = $this->ConvertAngle($vv[0], \false); - if (\count($vv) == 2) { - $angle_y = $this->ConvertAngle($vv[1], \false); - } else { - $angle_y = 0; - } - $tr2 .= $this->transformSkew($angle_x, $angle_y, $cx, $cy, \true) . ' '; - } elseif ($c == 'skewx' && \count($vv)) { - $angle = $this->ConvertAngle($vv[0], \false); - $tr2 .= $this->transformSkew($angle, 0, $cx, $cy, \true) . ' '; - } elseif ($c == 'skewy' && \count($vv)) { - $angle = $this->ConvertAngle($vv[0], \false); - $tr2 .= $this->transformSkew(0, $angle, $cx, $cy, \true) . ' '; - } elseif ($c == 'rotate' && \count($vv)) { - $angle = $this->ConvertAngle($vv[0]); - $tr2 .= $this->transformRotate($angle, $cx, $cy, \true) . ' '; - } - } - } - } - // LIST MARKERS (Images) // mPDF 6 Lists - if (isset($objattr['listmarker']) && $objattr['listmarker'] && $objattr['listmarkerposition'] == 'outside') { - $mw = $objattr['OUTER-WIDTH']; - // NB If change marker-offset, also need to alter in function _getListMarkerWidth - $adjx = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); - if ($objattr['dir'] == 'rtl') { - $objattr['INNER-X'] += $adjx; - } else { - $objattr['INNER-X'] -= $adjx; - $objattr['INNER-X'] -= $mw; - } - } - // mPDF 5.7.3 TRANSFORMS / BACKGROUND COLOR - // Transform also affects image background - if ($tr2) { - $this->writer->write('q ' . $tr2 . ' '); - } - if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { - $bgcol = $objattr['bgcolor']; - $this->SetFColor($bgcol); - $this->Rect($x, $y, $w, $h, 'F'); - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - } - if ($tr2) { - $this->writer->write('Q'); - } - /* -- BACKGROUNDS -- */ - if (isset($objattr['GRADIENT-MASK'])) { - $g = $this->gradient->parseMozGradient($objattr['GRADIENT-MASK']); - if ($g) { - $dummy = $this->gradient->Gradient($objattr['INNER-X'], $objattr['INNER-Y'], $obiw, $obih, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], \true, \true); - $gradmask = '/TGS' . \count($this->gradients) . ' gs '; - } - } - /* -- END BACKGROUNDS -- */ - /* -- IMAGES-WMF -- */ - if (isset($objattr['itype']) && $objattr['itype'] == 'wmf') { - $outstring = \sprintf('q ' . $tr . $tr2 . '%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X'] * Mpdf::SCALE - $sx * $objattr['wmf_x'], ($this->h - $objattr['INNER-Y']) * Mpdf::SCALE + $sy * $objattr['wmf_y'], $objattr['ID']); - // mPDF 5.7.3 TRANSFORMS - } else { - /* -- END IMAGES-WMF -- */ - if (isset($objattr['itype']) && $objattr['itype'] == 'svg') { - $outstring = \sprintf('q ' . $tr . $tr2 . '%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X'] * Mpdf::SCALE - $sx * $objattr['wmf_x'], ($this->h - $objattr['INNER-Y']) * Mpdf::SCALE + $sy * $objattr['wmf_y'], $objattr['ID']); - // mPDF 5.7.3 TRANSFORMS - } else { - $outstring = \sprintf("q " . $tr . $tr2 . "%.3F 0 0 %.3F %.3F %.3F cm " . $gradmask . "/I%d Do Q", $obiw * Mpdf::SCALE, $obih * Mpdf::SCALE, $objattr['INNER-X'] * Mpdf::SCALE, ($this->h - ($objattr['INNER-Y'] + $obih)) * Mpdf::SCALE, $objattr['ID']); - // mPDF 5.7.3 TRANSFORMS - } - } - $this->writer->write($outstring); - // LINK - if (isset($objattr['link'])) { - $this->Link($objattr['INNER-X'], $objattr['INNER-Y'], $objattr['INNER-WIDTH'], $objattr['INNER-HEIGHT'], $objattr['link']); - } - if (isset($objattr['opacity'])) { - $this->SetAlpha(1); - } - // mPDF 5.7.3 TRANSFORMS - // Transform also affects image borders - if ($tr2) { - $this->writer->write('q ' . $tr2 . ' '); - } - if (isset($objattr['border_top']) && $objattr['border_top'] > 0 || isset($objattr['border_left']) && $objattr['border_left'] > 0 || isset($objattr['border_right']) && $objattr['border_right'] > 0 || isset($objattr['border_bottom']) && $objattr['border_bottom'] > 0) { - $this->PaintImgBorder($objattr, $is_table); - } - if ($tr2) { - $this->writer->write('Q'); - } - if (isset($objattr['visibility']) && $objattr['visibility'] != 'visible' && $objattr['visibility']) { - $this->SetVisibility('visible'); - } - if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->current_layer == 0) { - $this->EndLayer(); - } - // mPDF 5.7.3 TRANSFORMS - if (isset($objattr['transform'])) { - $this->writer->write("\n" . '% ETR'); - // End Transform - } - } - if ($objattr['type'] === 'barcode') { - $bgcol = $this->colorConverter->convert(255, $this->PDFAXwarnings); - if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { - $bgcol = $objattr['bgcolor']; - } - $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); - if (isset($objattr['color']) && $objattr['color']) { - $col = $objattr['color']; - } - $this->SetFColor($bgcol); - $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - if (isset($objattr['BORDER-WIDTH'])) { - $this->PaintImgBorder($objattr, $is_table); - } - $barcodeTypes = ['EAN13', 'ISBN', 'ISSN', 'UPCA', 'UPCE', 'EAN8']; - if (\in_array($objattr['btype'], $barcodeTypes, \true)) { - $this->WriteBarcode($objattr['code'], $objattr['showtext'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], 0, 0, 0, 0, 0, $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['bsupp'], isset($objattr['bsupp_code']) ? $objattr['bsupp_code'] : '', $k); - } elseif ($objattr['btype'] === 'QR') { - if (!\class_exists('WP_Ultimo\\Dependencies\\Mpdf\\QrCode\\QrCode') || !\class_exists('WP_Ultimo\\Dependencies\\Mpdf\\QrCode\\Output\\Mpdf')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('WP_Ultimo\\Dependencies\\Mpdf\\QrCode package was not found. Install the package from Packagist with "composer require mpdf/qrcode"'); - } - $barcodeContent = \str_replace('WP_Ultimo\\Dependencies\\r\\n', "\r\n", $objattr['code']); - $barcodeContent = \str_replace('\\n', "\n", $barcodeContent); - $qrcode = new QrCode\QrCode($barcodeContent, $objattr['errorlevel']); - if ($objattr['disableborder']) { - $qrcode->disableBorder(); - } - $bgColor = [255, 255, 255]; - if ($objattr['bgcolor']) { - $bgColor = \array_map(function ($col) { - return \intval(255 * \floatval($col)); - }, \explode(" ", $this->SetColor($objattr['bgcolor'], 'CodeOnly'))); - } - $color = [0, 0, 0]; - if ($objattr['color']) { - $color = \array_map(function ($col) { - return \intval(255 * \floatval($col)); - }, \explode(" ", $this->SetColor($objattr['color'], 'CodeOnly'))); - } - $out = new QrCode\Output\Mpdf(); - $out->output($qrcode, $this, $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'] * 25, $bgColor, $color); - unset($qrcode); - } else { - $this->WriteBarcode2($objattr['code'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['pr_ratio'], $k, $objattr['quiet_zone_left'], $objattr['quiet_zone_right']); - } - } - // TEXT CIRCLE - if ($objattr['type'] == 'textcircle') { - $bgcol = ''; - if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { - $bgcol = $objattr['bgcolor']; - } - $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); - if (isset($objattr['color']) && $objattr['color']) { - $col = $objattr['color']; - } - $this->SetTColor($col); - $this->SetFColor($bgcol); - if ($bgcol) { - $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); - } - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - if (isset($objattr['BORDER-WIDTH'])) { - $this->PaintImgBorder($objattr, $is_table); - } - if (empty($this->directWrite)) { - $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); - } - if (isset($objattr['top-text'])) { - $this->directWrite->CircularText($objattr['INNER-X'] + $objattr['INNER-WIDTH'] / 2, $objattr['INNER-Y'] + $objattr['INNER-HEIGHT'] / 2, $objattr['r'] / $k, $objattr['top-text'], 'top', $objattr['fontfamily'], $objattr['fontsize'] / $k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], isset($objattr['divider']) ? $objattr['divider'] : ''); - } - if (isset($objattr['bottom-text'])) { - $this->directWrite->CircularText($objattr['INNER-X'] + $objattr['INNER-WIDTH'] / 2, $objattr['INNER-Y'] + $objattr['INNER-HEIGHT'] / 2, $objattr['r'] / $k, $objattr['bottom-text'], 'bottom', $objattr['fontfamily'], $objattr['fontsize'] / $k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], isset($objattr['divider']) ? $objattr['divider'] : ''); - } - } - $this->ResetSpacing(); - // LIST MARKERS (Text or bullets) // mPDF 6 Lists - if ($objattr['type'] == 'listmarker') { - if (isset($objattr['fontfamily'])) { - $this->SetFont($objattr['fontfamily'], $objattr['fontstyle'], $objattr['fontsizept']); - } - $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); - if (isset($objattr['colorarray']) && $objattr['colorarray']) { - $col = $objattr['colorarray']; - } - if (isset($objattr['bullet']) && $objattr['bullet']) { - // Used for position "outside" only - $type = $objattr['bullet']; - $size = $objattr['size']; - if ($objattr['listmarkerposition'] == 'inside') { - $adjx = $size / 2; - if ($objattr['dir'] == 'rtl') { - $adjx += $objattr['offset']; - } - $this->x += $adjx; - } else { - $adjx = $objattr['offset']; - $adjx += $size / 2; - if ($objattr['dir'] == 'rtl') { - $this->x += $adjx; - } else { - $this->x -= $adjx; - } - } - $yadj = $objattr['lineBox']['glyphYorigin']; - if (isset($this->CurrentFont['desc']['XHeight']) && $this->CurrentFont['desc']['XHeight']) { - $xh = $this->CurrentFont['desc']['XHeight']; - } else { - $xh = 500; - } - $yadj -= $this->FontSize * $xh / 1000 * 0.625; - // Vertical height of bullet (centre) from baseline= XHeight * 0.625 - $this->y += $yadj; - $this->_printListBullet($this->x, $this->y, $size, $type, $col); - } else { - $this->SetTColor($col); - $w = $this->GetStringWidth($texto); - // NB If change marker-offset, also need to alter in function _getListMarkerWidth - $adjx = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); - if ($objattr['dir'] == 'rtl') { - $align = 'L'; - $this->x += $adjx; - } else { - // Use these lines to set as marker-offset, right-aligned - default - $align = 'R'; - $this->x -= $adjx; - $this->x -= $w; - } - $this->Cell($w, $this->FontSize, $texto, 0, 0, $align, 0, '', 0, 0, 0, 'T', 0, \false, \false, 0, $objattr['lineBox']); - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - } - // DOT-TAB - if ($objattr['type'] == 'dottab') { - if (isset($objattr['fontfamily'])) { - $this->SetFont($objattr['fontfamily'], '', $objattr['fontsize']); - } - $sp = $this->GetStringWidth(' '); - $nb = \floor(($w - 2 * $sp) / $this->GetStringWidth('.')); - if ($nb > 0) { - $dots = ' ' . \str_repeat('.', $nb) . ' '; - } else { - $dots = ' '; - } - $col = $this->colorConverter->convert(0, $this->PDFAXwarnings); - if (isset($objattr['colorarray']) && $objattr['colorarray']) { - $col = $objattr['colorarray']; - } - $this->SetTColor($col); - $save_dh = $this->divheight; - $save_sbd = $this->spanborddet; - $save_textvar = $this->textvar; - // mPDF 5.7.1 - $this->spanborddet = ''; - $this->divheight = 0; - $this->textvar = 0x0; - // mPDF 5.7.1 - $this->Cell($w, $h, $dots, 0, 0, 'C', 0, '', 0, 0, 0, 'T', 0, \false, \false, 0, $objattr['lineBox']); - // mPDF 6 DOTTAB - $this->spanborddet = $save_sbd; - $this->textvar = $save_textvar; - // mPDF 5.7.1 - $this->divheight = $save_dh; - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - /* -- FORMS -- */ - // TEXT/PASSWORD INPUT - if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD')) { - $this->form->print_ob_text($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); - } - // TEXTAREA - if ($objattr['type'] == 'textarea') { - $this->form->print_ob_textarea($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); - } - // SELECT - if ($objattr['type'] == 'select') { - $this->form->print_ob_select($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); - } - // INPUT/BUTTON as IMAGE - if ($objattr['type'] == 'input' && $objattr['subtype'] == 'IMAGE') { - $this->form->print_ob_imageinput($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $is_table); - } - // BUTTON - if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'SUBMIT' || $objattr['subtype'] == 'RESET' || $objattr['subtype'] == 'BUTTON')) { - $this->form->print_ob_button($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir); - } - // CHECKBOX - if ($objattr['type'] == 'input' && $objattr['subtype'] == 'CHECKBOX') { - $this->form->print_ob_checkbox($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $x, $y); - } - // RADIO - if ($objattr['type'] == 'input' && $objattr['subtype'] == 'RADIO') { - $this->form->print_ob_radio($objattr, $w, $h, $texto, $rtlalign, $k, $blockdir, $x, $y); - } - /* -- END FORMS -- */ - } - $this->SetFont($save_currentfontfamily, $save_currentfontstyle, $save_currentfontsize); - $this->y = $save_y; - $this->x = $save_x; - unset($content); - } - function _printListBullet($x, $y, $size, $type, $color) - { - // x and y are the centre of the bullet; size is the width and/or height in mm - $fcol = $this->SetTColor($color, \true); - $lcol = \strtoupper($fcol); - // change 0 0 0 rg to 0 0 0 RG - $this->writer->write(\sprintf('q %s %s', $lcol, $fcol)); - $this->writer->write('0 j 0 J [] 0 d'); - if ($type == 'square') { - $size *= 0.85; - // Smaller to appear the same size as circle/disc - $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F re f', ($x - $size / 2) * Mpdf::SCALE, ($this->h - $y + $size / 2) * Mpdf::SCALE, $size * Mpdf::SCALE, -$size * Mpdf::SCALE)); - } elseif ($type == 'disc') { - $this->Circle($x, $y, $size / 2, 'F'); - // Fill - } elseif ($type == 'circle') { - $lw = $size / 12; - // Line width - $this->writer->write(\sprintf('%.3F w ', $lw * Mpdf::SCALE)); - $this->Circle($x, $y, $size / 2 - $lw / 2, 'S'); - // Stroke - } - $this->writer->write('Q'); - } - // mPDF 6 - // Get previous character and move pointers - function _moveToPrevChar(&$contentctr, &$charctr, $content) - { - $lastchar = \false; - $charctr--; - while ($charctr < 0) { - // go back to previous $content[] - $contentctr--; - if ($contentctr < 0) { - return \false; - } - if ($this->usingCoreFont) { - $charctr = \strlen($content[$contentctr]) - 1; - } else { - $charctr = \mb_strlen($content[$contentctr], $this->mb_enc) - 1; - } - } - if ($this->usingCoreFont) { - $lastchar = $content[$contentctr][$charctr]; - } else { - $lastchar = \mb_substr($content[$contentctr], $charctr, 1, $this->mb_enc); - } - return $lastchar; - } - // Get previous character - function _getPrevChar($contentctr, $charctr, $content) - { - $lastchar = \false; - $charctr--; - while ($charctr < 0) { - // go back to previous $content[] - $contentctr--; - if ($contentctr < 0) { - return \false; - } - if ($this->usingCoreFont) { - $charctr = \strlen($content[$contentctr]) - 1; - } else { - $charctr = \mb_strlen($content[$contentctr], $this->mb_enc) - 1; - } - } - if ($this->usingCoreFont) { - $lastchar = $content[$contentctr][$charctr]; - } else { - $lastchar = \mb_substr($content[$contentctr], $charctr, 1, $this->mb_enc); - } - return $lastchar; - } - function WriteFlowingBlock($s, $sOTLdata) - { - // mPDF 5.7.1 - $currentx = $this->x; - $is_table = $this->flowingBlockAttr['is_table']; - $table_draft = $this->flowingBlockAttr['table_draft']; - // width of all the content so far in points - $contentWidth =& $this->flowingBlockAttr['contentWidth']; - // cell width in points - $maxWidth =& $this->flowingBlockAttr['width']; - $lineCount =& $this->flowingBlockAttr['lineCount']; - // line height in user units - $stackHeight =& $this->flowingBlockAttr['height']; - $align =& $this->flowingBlockAttr['align']; - $content =& $this->flowingBlockAttr['content']; - $contentB =& $this->flowingBlockAttr['contentB']; - $font =& $this->flowingBlockAttr['font']; - $valign =& $this->flowingBlockAttr['valign']; - $blockstate = $this->flowingBlockAttr['blockstate']; - $cOTLdata =& $this->flowingBlockAttr['cOTLdata']; - // mPDF 5.7.1 - $newblock = $this->flowingBlockAttr['newblock']; - $blockdir = $this->flowingBlockAttr['blockdir']; - // *********** BLOCK BACKGROUND COLOR ***************** // - if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { - $fill = 0; - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - $fill = 0; - } - $font[] = $this->saveFont(); - $content[] = ''; - $contentB[] = ''; - $cOTLdata[] = $sOTLdata; - // mPDF 5.7.1 - $currContent =& $content[\count($content) - 1]; - $CJKoverflow = \false; - $Oikomi = \false; - // mPDF 6 - $hanger = ''; - // COLS - $oldcolumn = $this->CurrCol; - if ($this->ColActive && !$is_table) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - /* -- TABLES -- */ - if ($is_table) { - $ipaddingL = 0; - $ipaddingR = 0; - $paddingL = 0; - $paddingR = 0; - $cpaddingadjustL = 0; - $cpaddingadjustR = 0; - // Added mPDF 3.0 - $fpaddingR = 0; - $fpaddingL = 0; - } else { - /* -- END TABLES -- */ - $ipaddingL = $this->blk[$this->blklvl]['padding_left']; - $ipaddingR = $this->blk[$this->blklvl]['padding_right']; - $paddingL = $ipaddingL * Mpdf::SCALE; - $paddingR = $ipaddingR * Mpdf::SCALE; - $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; - $cpaddingadjustL = -$this->cMarginL; - $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; - $cpaddingadjustR = -$this->cMarginR; - // Added mPDF 3.0 Float DIV - $fpaddingR = 0; - $fpaddingL = 0; - /* -- CSS-FLOAT -- */ - if (\count($this->floatDivs)) { - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); - if ($r_exists) { - $fpaddingR = $r_width; - } - if ($l_exists) { - $fpaddingL = $l_width; - } - } - /* -- END CSS-FLOAT -- */ - $usey = $this->y + 0.002; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0) { - $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - /* -- CSS-IMAGE-FLOAT -- */ - // If float exists at this level - if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { - $fpaddingR += $this->floatmargins['R']['w']; - } - if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { - $fpaddingL += $this->floatmargins['L']['w']; - } - /* -- END CSS-IMAGE-FLOAT -- */ - } - // *TABLES* - // OBJECTS - IMAGES & FORM Elements (NB has already skipped line/page if required - in printbuffer) - if (\substr($s, 0, 3) == Mpdf::OBJECT_IDENTIFIER) { - // identifier has been identified! - $objattr = $this->_getObjAttr($s); - $h_corr = 0; - if ($is_table) { - // *TABLES* - $maximumW = $maxWidth / Mpdf::SCALE - ($this->cellPaddingL + $this->cMarginL + $this->cellPaddingR + $this->cMarginR); - // *TABLES* - } else { - // *TABLES* - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0 && !$is_table) { - $h_corr = $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - $maximumW = $maxWidth / Mpdf::SCALE - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w'] + $fpaddingL + $fpaddingR); - } - // *TABLES* - $objattr = $this->inlineObject($objattr['type'], $this->lMargin + $fpaddingL + $contentWidth / Mpdf::SCALE, $this->y + $h_corr, $objattr, $this->lMargin, $contentWidth / Mpdf::SCALE, $maximumW, $stackHeight, \true, $is_table); - // SET LINEHEIGHT for this line ================ RESET AT END - $stackHeight = \max($stackHeight, $objattr['OUTER-HEIGHT']); - $this->objectbuffer[\count($content) - 1] = $objattr; - // if (isset($objattr['vertical-align'])) { $valign = $objattr['vertical-align']; } - // else { $valign = ''; } - // LIST MARKERS // mPDF 6 Lists - if ($objattr['type'] == 'image' && isset($objattr['listmarker']) && $objattr['listmarker'] && $objattr['listmarkerposition'] == 'outside') { - // do nothing - } else { - $contentWidth += $objattr['OUTER-WIDTH'] * Mpdf::SCALE; - } - return; - } - $lbw = $rbw = 0; - // Border widths - if (!empty($this->spanborddet)) { - if (isset($this->spanborddet['L'])) { - $lbw = $this->spanborddet['L']['w']; - } - if (isset($this->spanborddet['R'])) { - $rbw = $this->spanborddet['R']['w']; - } - } - if ($this->usingCoreFont) { - $clen = \strlen($s); - } else { - $clen = \mb_strlen($s, $this->mb_enc); - } - // for every character in the string - for ($i = 0; $i < $clen; $i++) { - // extract the current character - // get the width of the character in points - if ($this->usingCoreFont) { - $c = $s[$i]; - // Soft Hyphens chr(173) - $cw = $this->GetCharWidthCore($c) * Mpdf::SCALE; - if ($this->textvar & TextVars::FC_KERNING && $i > 0) { - // mPDF 5.7.1 - if (isset($this->CurrentFont['kerninfo'][$s[$i - 1]][$c])) { - $cw += $this->CurrentFont['kerninfo'][$s[$i - 1]][$c] * $this->FontSizePt / 1000; - } - } - } else { - $c = \mb_substr($s, $i, 1, $this->mb_enc); - $cw = $this->GetCharWidthNonCore($c, \false) * Mpdf::SCALE; - // mPDF 5.7.1 - // Use OTL GPOS - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff) { - // ...WriteFlowingBlock... - // Only add XAdvanceL (not sure at present whether RTL or LTR writing direction) - // At this point, XAdvanceL and XAdvanceR will balance - if (isset($sOTLdata['GPOSinfo'][$i]['XAdvanceL'])) { - $cw += $sOTLdata['GPOSinfo'][$i]['XAdvanceL'] * (1000 / $this->CurrentFont['unitsPerEm']) * ($this->FontSize / 1000) * Mpdf::SCALE; - } - } - if ($this->textvar & TextVars::FC_KERNING && $i > 0) { - // mPDF 5.7.1 - $lastc = \mb_substr($s, $i - 1, 1, $this->mb_enc); - $ulastc = $this->UTF8StringToArray($lastc, \false); - $uc = $this->UTF8StringToArray($c, \false); - if (isset($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]])) { - $cw += $this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]] * $this->FontSizePt / 1000; - } - } - } - if ($i == 0) { - $cw += $lbw * Mpdf::SCALE; - $contentB[\count($contentB) - 1] .= 'L'; - } - if ($i == $clen - 1) { - $cw += $rbw * Mpdf::SCALE; - $contentB[\count($contentB) - 1] .= 'R'; - } - if ($c == ' ') { - $currContent .= $c; - $contentWidth += $cw; - continue; - } - // Paragraph INDENT - $WidthCorrection = 0; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && isset($this->blk[$this->blklvl]['text_indent']) && $lineCount == 0 && !$is_table && $align != 'C') { - $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], \false); - // mPDF 5.7.4 - $WidthCorrection = $ti * Mpdf::SCALE; - } - // OUTDENT - foreach ($this->objectbuffer as $k => $objattr) { - // mPDF 6 DOTTAB - if ($objattr['type'] == 'dottab') { - $WidthCorrection -= $objattr['outdent'] * Mpdf::SCALE; - break; - } - } - // Added mPDF 3.0 Float DIV - $fpaddingR = 0; - $fpaddingL = 0; - /* -- CSS-FLOAT -- */ - if (\count($this->floatDivs)) { - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); - if ($r_exists) { - $fpaddingR = $r_width; - } - if ($l_exists) { - $fpaddingL = $l_width; - } - } - /* -- END CSS-FLOAT -- */ - $usey = $this->y + 0.002; - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 0) { - $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - /* -- CSS-IMAGE-FLOAT -- */ - // If float exists at this level - if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { - $fpaddingR += $this->floatmargins['R']['w']; - } - if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { - $fpaddingL += $this->floatmargins['L']['w']; - } - /* -- END CSS-IMAGE-FLOAT -- */ - // try adding another char - if ($contentWidth + $cw > $maxWidth - $WidthCorrection - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE) + 0.001) { - // 0.001 is to correct for deviations converting mm=>pts - // it won't fit, output what we already have - $lineCount++; - // contains any content that didn't make it into this print - $savedContent = ''; - $savedContentB = ''; - $savedOTLdata = []; - // mPDF 5.7.1 - $savedFont = []; - $savedObj = []; - $savedPreOTLdata = []; - // mPDF 5.7.1 - $savedPreContent = []; - $savedPreContentB = []; - $savedPreFont = []; - // mPDF 6 - // New line-breaking algorithm - ///////////////////// - // LINE BREAKING - ///////////////////// - $breakfound = \false; - $contentctr = \count($content) - 1; - if ($this->usingCoreFont) { - $charctr = \strlen($currContent); - } else { - $charctr = \mb_strlen($currContent, $this->mb_enc); - } - $checkchar = $c; - $prevchar = $this->_getPrevChar($contentctr, $charctr, $content); - /* -- CJK-FONTS -- */ - // 1) CJK Overflowing a) punctuation or b) Oikomi - // Next character ($c) is suitable to add as overhanging or squeezed punctuation, or Oikomi - if ($CJKoverflow || $Oikomi) { - // If flag already set - $CJKoverflow = \false; - $Oikomi = \false; - $breakfound = \true; - } - if (!$this->usingCoreFont && !$breakfound && $this->checkCJK) { - // Get next/following character (in this chunk) - $followingchar = ''; - if ($i < $clen - 1) { - if ($this->usingCoreFont) { - $followingchar = $s[$i + 1]; - } else { - $followingchar = \mb_substr($s, $i + 1, 1, $this->mb_enc); - } - } - // 1a) Overflow punctuation - if (\preg_match("/[" . $this->pregCJKchars . "]/u", $prevchar) && \preg_match("/[" . $this->CJKoverflow . "]/u", $checkchar) && $this->allowCJKorphans) { - // add character onto this line - $currContent .= $c; - $contentWidth += $cw; - $CJKoverflow = \true; - // Set flag - continue; - } elseif (\preg_match("/[" . $this->pregCJKchars . "]/u", $checkchar) && $this->allowCJKorphans && (\preg_match("/[" . $this->CJKleading . "]/u", $followingchar) || \preg_match("/[" . $this->CJKfollowing . "]/u", $checkchar)) && !\preg_match("/[" . $this->CJKleading . "]/u", $checkchar) && !\preg_match("/[" . $this->CJKfollowing . "]/u", $followingchar) && !(\preg_match("/[0-9\\x{ff10}-\\x{ff19}]/u", $followingchar) && \preg_match("/[0-9\\x{ff10}-\\x{ff19}]/u", $checkchar))) { - // 1b) Try squeezing another character(s) onto this line = Oikomi, if character cannot end line - // or next character cannot start line (and not splitting CJK numerals) - // NB otherwise it move lastchar(s) to next line to keep $c company = Oidashi, which is done below in standard way - // add character onto this line - $currContent .= $c; - $contentWidth += $cw; - $Oikomi = \true; - // Set flag - continue; - } - } - /* -- END CJK-FONTS -- */ - /* -- HYPHENATION -- */ - // AUTOMATIC HYPHENATION - // 2) Automatic hyphen in current word (does not cross tags) - if (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] == 1) { - $currWord = ''; - // Look back and ahead to get current word - for ($ac = $charctr - 1; $ac >= 0; $ac--) { - if ($this->usingCoreFont) { - $addc = \substr($currContent, $ac, 1); - } else { - $addc = \mb_substr($currContent, $ac, 1, $this->mb_enc); - } - if ($addc == ' ') { - break; - } - $currWord = $addc . $currWord; - } - $start = $ac + 1; - for ($ac = $i; $ac < $clen - 1; $ac++) { - if ($this->usingCoreFont) { - $addc = \substr($s, $ac, 1); - } else { - $addc = \mb_substr($s, $ac, 1, $this->mb_enc); - } - if ($addc == ' ') { - break; - } - $currWord .= $addc; - } - $ptr = $this->hyphenator->hyphenateWord($currWord, $charctr - $start); - if ($ptr > -1) { - $breakfound = [$contentctr, $start + $ptr, $contentctr, $start + $ptr, 'hyphen']; - } - } - /* -- END HYPHENATION -- */ - // Search backwards to find first line-break opportunity - while ($breakfound == \false && $prevchar !== \false) { - $cutcontentctr = $contentctr; - $cutcharctr = $charctr; - $prevchar = $this->_moveToPrevChar($contentctr, $charctr, $content); - ///////////////////// - // 3) Break at SPACE - ///////////////////// - if ($prevchar == ' ') { - $breakfound = [$contentctr, $charctr, $cutcontentctr, $cutcharctr, 'discard']; - } elseif ($prevchar == "​") { - // U+200B Zero-width Word Break - $breakfound = [$contentctr, $charctr, $cutcontentctr, $cutcharctr, 'discard']; - } elseif (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] != 2 && ($prevchar == '-' || $prevchar == "‐")) { - // Don't break a URL - // Look back to get first part of current word - $checkw = ''; - for ($ac = $charctr - 1; $ac >= 0; $ac--) { - if ($this->usingCoreFont) { - $addc = \substr($currContent, $ac, 1); - } else { - $addc = \mb_substr($currContent, $ac, 1, $this->mb_enc); - } - if ($addc == ' ') { - break; - } - $checkw = $addc . $checkw; - } - // Don't break if HyphenMinus AND (a URL or before a numeral or before a >) - if (!\preg_match('/(http:|ftp:|https:|www\\.)/', $checkw) && $checkchar != '>' && !\preg_match('/[0-9]/', $checkchar) || $prevchar == "‐") { - $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; - } - } elseif (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] != 2 && !$this->usingCoreFont && $prevchar == "­") { - $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; - $content[$contentctr] = \mb_substr($content[$contentctr], 0, $charctr, $this->mb_enc) . '-' . \mb_substr($content[$contentctr], $charctr + 1, \mb_strlen($content[$contentctr]), $this->mb_enc); - if (!empty($cOTLdata[$contentctr])) { - $cOTLdata[$contentctr]['char_data'][$charctr] = ['bidi_class' => 9, 'uni' => 45]; - $cOTLdata[$contentctr]['group'][$charctr] = 'C'; - } - } elseif (isset($this->textparam['hyphens']) && $this->textparam['hyphens'] != 2 && $this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats' && $prevchar == \chr(173)) { - $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; - $content[$contentctr] = \substr($content[$contentctr], 0, $charctr) . '-' . \substr($content[$contentctr], $charctr + 1); - } elseif (!$this->usingCoreFont && $this->checkCJK && \preg_match("/[" . $this->pregCJKchars . "]/u", $checkchar) && !\preg_match("/[" . $this->CJKfollowing . "]/u", $checkchar) && !\preg_match("/[" . $this->CJKleading . "]/u", $prevchar) && !(\preg_match("/[0-9\\x{ff10}-\\x{ff19}]/u", $prevchar) && \preg_match("/[0-9\\x{ff10}-\\x{ff19}]/u", $checkchar))) { - $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; - } - /* -- END CJK-FONTS -- */ - ///////////////////// - // 8) Break at OBJECT (Break before all objects here - selected objects are moved forward to next line below e.g. dottab) - ///////////////////// - if (isset($this->objectbuffer[$contentctr])) { - $breakfound = [$cutcontentctr, $cutcharctr, $cutcontentctr, $cutcharctr, 'cut']; - } - $checkchar = $prevchar; - } - // If a line-break opportunity found: - if (\is_array($breakfound)) { - $contentctr = $breakfound[0]; - $charctr = $breakfound[1]; - $cutcontentctr = $breakfound[2]; - $cutcharctr = $breakfound[3]; - $type = $breakfound[4]; - // Cache chunks which are already processed, but now need to be passed on to the new line - for ($ix = \count($content) - 1; $ix > $cutcontentctr; $ix--) { - // save and crop off any subsequent chunks - /* -- OTL -- */ - if (!empty($sOTLdata)) { - $tmpOTL = \array_pop($cOTLdata); - $savedPreOTLdata[] = $tmpOTL; - } - /* -- END OTL -- */ - $savedPreContent[] = \array_pop($content); - $savedPreContentB[] = \array_pop($contentB); - $savedPreFont[] = \array_pop($font); - } - // Next cache the part which will start the next line - if ($this->usingCoreFont) { - $savedPreContent[] = \substr($content[$cutcontentctr], $cutcharctr); - } else { - $savedPreContent[] = \mb_substr($content[$cutcontentctr], $cutcharctr, \mb_strlen($content[$cutcontentctr]), $this->mb_enc); - } - $savedPreContentB[] = \preg_replace('/L/', '', $contentB[$cutcontentctr]); - $savedPreFont[] = $font[$cutcontentctr]; - /* -- OTL -- */ - if (!empty($sOTLdata)) { - $savedPreOTLdata[] = $this->otl->splitOTLdata($cOTLdata[$cutcontentctr], $cutcharctr, $cutcharctr); - } - /* -- END OTL -- */ - // Finally adjust the Current content which ends this line - if ($cutcharctr == 0 && $type == 'discard') { - \array_pop($content); - \array_pop($contentB); - \array_pop($font); - \array_pop($cOTLdata); - } - $currContent =& $content[\count($content) - 1]; - if ($this->usingCoreFont) { - $currContent = \substr($currContent, 0, $charctr); - } else { - $currContent = \mb_substr($currContent, 0, $charctr, $this->mb_enc); - } - if (!empty($sOTLdata)) { - $savedPreOTLdata[] = $this->otl->splitOTLdata($cOTLdata[\count($cOTLdata) - 1], \mb_strlen($currContent, $this->mb_enc)); - } - if (\strpos($contentB[\count($contentB) - 1], 'R') !== \false) { - // ??? - $contentB[\count($content) - 1] = \preg_replace('/R/', '', $contentB[\count($content) - 1]); - // ??? - } - if ($type === 'hyphen') { - $hyphen = \in_array(\mb_substr($currContent, -1), ['-', '–', '—'], \true); - if (!$hyphen) { - $currContent .= '-'; - } else { - $savedPreContent[\count($savedPreContent) - 1] = '-' . $savedPreContent[\count($savedPreContent) - 1]; - } - if (!empty($cOTLdata[\count($cOTLdata) - 1])) { - $cOTLdata[\count($cOTLdata) - 1]['char_data'][] = ['bidi_class' => 9, 'uni' => 45]; - $cOTLdata[\count($cOTLdata) - 1]['group'] .= 'C'; - } - } - $savedContent = ''; - $savedContentB = ''; - $savedFont = []; - $savedOTLdata = []; - } - // If no line-break opportunity found - split at current position - // or - Next character ($c) is suitable to add as overhanging or squeezed punctuation, or Oikomi, as set above by: - // 1) CJK Overflowing a) punctuation or b) Oikomi - // in which case $breakfound==1 and NOT array - if (!\is_array($breakfound)) { - $savedFont = $this->saveFont(); - if (!empty($sOTLdata)) { - $savedOTLdata = $this->otl->splitOTLdata($cOTLdata[\count($cOTLdata) - 1], \mb_strlen($currContent, $this->mb_enc)); - } - } - if ($content[\count($content) - 1] == '' && !isset($this->objectbuffer[\count($content) - 1])) { - \array_pop($content); - \array_pop($contentB); - \array_pop($font); - \array_pop($cOTLdata); - $currContent =& $content[\count($content) - 1]; - } - // Right Trim current content - including CJK space, and for OTLdata - // incl. CJK - strip CJK space at end of line   = \xe3\x80\x80 = CJK space - $currContent = $currContent ? \rtrim($currContent) : ''; - if ($this->checkCJK) { - $currContent = \preg_replace("/ \$/", '', $currContent); - } - // *CJK-FONTS* - /* -- OTL -- */ - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $this->otl->trimOTLdata($cOTLdata[\count($cOTLdata) - 1], \false, \true); - // NB also does U+3000 - } - /* -- END OTL -- */ - // Selected OBJECTS are moved forward to next line, unless they come before a space or U+200B (type='discard') - if (isset($this->objectbuffer[\count($content) - 1]) && (!isset($type) || $type != 'discard')) { - $objtype = $this->objectbuffer[\count($content) - 1]['type']; - if ($objtype == 'dottab' || $objtype == 'bookmark' || $objtype == 'indexentry' || $objtype == 'toc' || $objtype == 'annot') { - $savedObj = \array_pop($this->objectbuffer); - } - } - // Decimal alignment (cancel if wraps to > 1 line) - if ($is_table && \substr($align, 0, 1) == 'D') { - $align = \substr($align, 2, 1); - } - $lineBox = []; - $this->_setInlineBlockHeights($lineBox, $stackHeight, $content, $font, $is_table); - // update $contentWidth since it has changed with cropping - $contentWidth = 0; - $inclCursive = \false; - foreach ($content as $k => $chunk) { - if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { - // LIST MARKERS - if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker']) { - if ($this->objectbuffer[$k]['listmarkerposition'] != 'outside') { - $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * Mpdf::SCALE; - } - } else { - $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * Mpdf::SCALE; - } - } elseif (!isset($this->objectbuffer[$k]) || isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k]) { - $this->restoreFont($font[$k], \false); - if ($this->checkCJK && $k == \count($content) - 1 && $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $this->CJKforceend) { - // force-end overhang - $hanger = \mb_substr($chunk, \mb_strlen($chunk, $this->mb_enc) - 1, 1, $this->mb_enc); - // Probably ought to do something with char_data and GPOS in cOTLdata... - $content[$k] = $chunk = \mb_substr($chunk, 0, \mb_strlen($chunk, $this->mb_enc) - 1, $this->mb_enc); - } - // Soft Hyphens chr(173) + Replace NBSP with SPACE + Set inclcursive if includes CURSIVE TEXT - if (!$this->usingCoreFont) { - /* -- OTL -- */ - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] || !empty($sOTLdata)) { - $this->otl->removeChar($chunk, $cOTLdata[$k], "­"); - $this->otl->replaceSpace($chunk, $cOTLdata[$k]); - // NBSP -> space - if (\preg_match("/([" . $this->pregCURSchars . "])/u", $chunk)) { - $inclCursive = \true; - } - $content[$k] = $chunk; - } else { - // *OTL* - $content[$k] = $chunk = \str_replace("­", '', $chunk); - $content[$k] = $chunk = \str_replace(\chr(194) . \chr(160), \chr(32), $chunk); - } - // *OTL* - } elseif ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') { - $content[$k] = $chunk = \str_replace(\chr(173), '', $chunk); - $content[$k] = $chunk = \str_replace(\chr(160), \chr(32), $chunk); - } - $contentWidth += $this->GetStringWidth($chunk, \true, isset($cOTLdata[$k]) ? $cOTLdata[$k] : \false, $this->textvar) * Mpdf::SCALE; - // mPDF 5.7.1 - if (!empty($this->spanborddet)) { - if (isset($this->spanborddet['L']['w']) && \strpos($contentB[$k], 'L') !== \false) { - $contentWidth += $this->spanborddet['L']['w'] * Mpdf::SCALE; - } - if (isset($this->spanborddet['R']['w']) && \strpos($contentB[$k], 'R') !== \false) { - $contentWidth += $this->spanborddet['R']['w'] * Mpdf::SCALE; - } - } - } - } - $lastfontreqstyle = isset($font[\count($font) - 1]['ReqFontStyle']) ? $font[\count($font) - 1]['ReqFontStyle'] : ''; - $lastfontstyle = isset($font[\count($font) - 1]['style']) ? $font[\count($font) - 1]['style'] : ''; - if ($blockdir == 'ltr' && \strpos($lastfontreqstyle, "I") !== \false && \strpos($lastfontstyle, "I") === \false) { - // Artificial italic - $lastitalic = $this->FontSize * 0.15 * Mpdf::SCALE; - } else { - $lastitalic = 0; - } - // NOW FORMAT THE LINE TO OUTPUT - if (!$table_draft) { - // DIRECTIONALITY RTL - $chunkorder = \range(0, \count($content) - 1); - // mPDF 5.7 - /* -- OTL -- */ - // mPDF 6 - if ($blockdir == 'rtl' || $this->biDirectional) { - $this->otl->bidiReorder($chunkorder, $content, $cOTLdata, $blockdir); - // From this point on, $content and $cOTLdata may contain more elements (and re-ordered) compared to - // $this->objectbuffer and $font ($chunkorder contains the mapping) - } - /* -- END OTL -- */ - // Remove any XAdvance from OTL data at end of line - foreach ($chunkorder as $aord => $k) { - if (\count($cOTLdata)) { - $this->restoreFont($font[$k], \false); - // ...WriteFlowingBlock... - if ($aord == \count($chunkorder) - 1 && isset($cOTLdata[$aord]['group'])) { - // Last chunk on line - $nGPOS = \strlen($cOTLdata[$aord]['group']) - 1; - // Last character - if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL']) || isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'])) { - if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'])) { - $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] * 1000 / $this->CurrentFont['unitsPerEm']; - } else { - $w = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] * 1000 / $this->CurrentFont['unitsPerEm']; - } - $w *= $this->FontSize / 1000; - $contentWidth -= $w * Mpdf::SCALE; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = 0; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = 0; - } - // If last character has an XPlacement set, adjust width calculation, and add to XAdvance to account for it - if (isset($cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'])) { - $w = -$cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement'] * 1000 / $this->CurrentFont['unitsPerEm']; - $w *= $this->FontSize / 1000; - $contentWidth -= $w * Mpdf::SCALE; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceL'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; - $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XAdvanceR'] = $cOTLdata[$aord]['GPOSinfo'][$nGPOS]['XPlacement']; - } - } - } - } - // JUSTIFICATION J - $jcharspacing = 0; - $jws = 0; - $nb_carac = 0; - $nb_spaces = 0; - $jkashida = 0; - // if it's justified, we need to find the char/word spacing (or if hanger $this->CJKforceend) - if ($align == 'J' && !$CJKoverflow || $contentWidth + $lastitalic > $maxWidth - $WidthCorrection - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE) + 0.001 && (!$CJKoverflow || $CJKoverflow && !$this->allowCJKoverflow) || $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { - // 0.001 is to correct for deviations converting mm=>pts - // JUSTIFY J (Use character spacing) - // WORD SPACING - // mPDF 5.7 - foreach ($chunkorder as $aord => $k) { - $chunk = isset($content[$aord]) ? $content[$aord] : ''; - if (!isset($this->objectbuffer[$k]) || isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k]) { - $nb_carac += \mb_strlen($chunk, $this->mb_enc); - $nb_spaces += \mb_substr_count($chunk, ' ', $this->mb_enc); - // Use GPOS OTL - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff) { - if (isset($cOTLdata[$aord]['group']) && $cOTLdata[$aord]['group']) { - $nb_carac -= \substr_count($cOTLdata[$aord]['group'], 'M'); - } - } - } else { - $nb_carac++; - } - // mPDF 6 allow spacing for inline object - } - // GetJSpacing adds kashida spacing to GPOSinfo if appropriate for Font - list($jcharspacing, $jws, $jkashida) = $this->GetJspacing($nb_carac, $nb_spaces, $maxWidth - $lastitalic - $contentWidth - $WidthCorrection - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE), $inclCursive, $cOTLdata); - } - // WORD SPACING - $empty = $maxWidth - $lastitalic - $WidthCorrection - $contentWidth - ($this->cMarginL + $this->cMarginR) * Mpdf::SCALE - ($paddingL + $paddingR + ($fpaddingL + $fpaddingR) * Mpdf::SCALE); - $empty -= $jcharspacing * ($nb_carac - 1); - // mPDF 6 nb_carac MINUS 1 - $empty -= $jws * $nb_spaces; - $empty -= $jkashida; - $empty /= Mpdf::SCALE; - $b = ''; - // do not use borders - // Get PAGEBREAK TO TEST for height including the top border/padding - $check_h = \max($this->divheight, $stackHeight); - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $this->blklvl > 0 && $lineCount == 1 && !$is_table) { - $check_h += $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - if ($this->ColActive && $check_h > $this->PageBreakTrigger - $this->y0) { - $this->SetCol($this->NbCol - 1); - } - // PAGEBREAK - // 'If' below used in order to fix "first-line of other page with justify on" bug - if (!$is_table && $this->y + $check_h > $this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { - $bak_x = $this->x; - // Current X position - // WORD SPACING - $ws = $this->ws; - // Word Spacing - $charspacing = $this->charspacing; - // Character Spacing - $this->ResetSpacing(); - $this->AddPage($this->CurOrientation); - $this->x = $bak_x; - // Added to correct for OddEven Margins - $currentx += $this->MarginCorrection; - $this->x += $this->MarginCorrection; - // WORD SPACING - $this->SetSpacing($charspacing, $ws); - } - if ($this->kwt && !$is_table) { - // mPDF 5.7+ - $this->printkwtbuffer(); - $this->kwt = \false; - } - /* -- COLUMNS -- */ - // COLS - // COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - $currentx += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - $oldcolumn = $this->CurrCol; - } - if ($this->ColActive && !$is_table) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - /* -- END COLUMNS -- */ - // TOP MARGIN - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $this->blk[$this->blklvl]['margin_top'] && $lineCount == 1 && !$is_table) { - $this->DivLn($this->blk[$this->blklvl]['margin_top'], $this->blklvl - 1, \true, $this->blk[$this->blklvl]['margin_collapse']); - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - // Update y0 for top of block (used to paint border) - if ($newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 1 && !$is_table) { - $this->blk[$this->blklvl]['y0'] = $this->y; - $this->blk[$this->blklvl]['startpage'] = $this->page; - if ($this->blk[$this->blklvl]['float']) { - $this->blk[$this->blklvl]['float_start_y'] = $this->y; - } - } - // TOP PADDING and BORDER spacing/fill - if ($newblock && ($blockstate == 1 || $blockstate == 3) && ($this->blk[$this->blklvl]['padding_top'] || $this->blk[$this->blklvl]['border_top']) && $lineCount == 1 && !$is_table) { - // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom - $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'], -3, \true, \false, 1); - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - $arraysize = \count($chunkorder); - $margins = $this->cMarginL + $this->cMarginR + ($ipaddingL + $ipaddingR + $fpaddingR + $fpaddingR); - // PAINT BACKGROUND FOR THIS LINE - if (!$is_table) { - $this->DivLn($stackHeight, $this->blklvl, \false); - } - // false -> don't advance y - $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL; - if ($align == 'R') { - $this->x += $empty; - } elseif ($align == 'C') { - $this->x += $empty / 2; - } - // Paragraph INDENT - if (isset($this->blk[$this->blklvl]['text_indent']) && $newblock && ($blockstate == 1 || $blockstate == 3) && $lineCount == 1 && !$is_table && $blockdir != 'rtl' && $align != 'C') { - $ti = $this->sizeConverter->convert($this->blk[$this->blklvl]['text_indent'], $this->blk[$this->blklvl]['inner_width'], $this->blk[$this->blklvl]['InlineProperties']['size'], \false); - // mPDF 5.7.4 - $this->x += $ti; - } - // BIDI magic_reverse moved upwards from here - foreach ($chunkorder as $aord => $k) { - // mPDF 5.7 - $chunk = isset($content[$aord]) ? $content[$aord] : ''; - if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { - $xadj = $this->x - $this->objectbuffer[$k]['OUTER-X']; - $this->objectbuffer[$k]['OUTER-X'] += $xadj; - $this->objectbuffer[$k]['BORDER-X'] += $xadj; - $this->objectbuffer[$k]['INNER-X'] += $xadj; - if ($this->objectbuffer[$k]['type'] == 'listmarker') { - $this->objectbuffer[$k]['lineBox'] = $lineBox[-1]; - // Block element details for glyph-origin - } - $yadj = $this->y - $this->objectbuffer[$k]['OUTER-Y']; - if ($this->objectbuffer[$k]['type'] == 'dottab') { - // mPDF 6 DOTTAB - $this->objectbuffer[$k]['lineBox'] = $lineBox[$k]; - // element details for glyph-origin - } - if ($this->objectbuffer[$k]['type'] != 'dottab') { - // mPDF 6 DOTTAB - $yadj += $lineBox[$k]['top']; - } - $this->objectbuffer[$k]['OUTER-Y'] += $yadj; - $this->objectbuffer[$k]['BORDER-Y'] += $yadj; - $this->objectbuffer[$k]['INNER-Y'] += $yadj; - } - $this->restoreFont($font[$k]); - // mPDF 5.7 - $this->SetSpacing($this->fixedlSpacing * Mpdf::SCALE + $jcharspacing, ($this->fixedlSpacing + $this->minwSpacing) * Mpdf::SCALE + $jws); - // Now unset these values so they don't influence GetStringwidth below or in fn. Cell - $this->fixedlSpacing = \false; - $this->minwSpacing = 0; - $save_vis = $this->visibility; - if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { - $this->SetVisibility($this->textparam['visibility']); - } - // *********** SPAN BACKGROUND COLOR ***************** // - if ($this->spanbgcolor) { - $cor = $this->spanbgcolorarray; - $this->SetFColor($cor); - $save_fill = $fill; - $spanfill = 1; - $fill = 1; - } - if (!empty($this->spanborddet)) { - if (\strpos($contentB[$k], 'L') !== \false) { - $this->x += isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0; - } - if (\strpos($contentB[$k], 'L') === \false) { - $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; - } - if (\strpos($contentB[$k], 'R') === \false) { - $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; - } - } - // WORD SPACING - // StringWidth this time includes any kashida spacing - $stringWidth = $this->GetStringWidth($chunk, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, \true); - $nch = \mb_strlen($chunk, $this->mb_enc); - // Use GPOS OTL - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0xff) { - if (isset($cOTLdata[$aord]['group']) && $cOTLdata[$aord]['group']) { - $nch -= \substr_count($cOTLdata[$aord]['group'], 'M'); - } - } - $stringWidth += $this->charspacing * $nch / Mpdf::SCALE; - $stringWidth += $this->ws * \mb_substr_count($chunk, ' ', $this->mb_enc) / Mpdf::SCALE; - if (isset($this->objectbuffer[$k])) { - // LIST MARKERS // mPDF 6 Lists - if ($this->objectbuffer[$k]['type'] == 'image' && isset($this->objectbuffer[$k]['listmarker']) && $this->objectbuffer[$k]['listmarker'] && $this->objectbuffer[$k]['listmarkerposition'] == 'outside') { - $stringWidth = 0; - } else { - $stringWidth = $this->objectbuffer[$k]['OUTER-WIDTH']; - } - } - if ($stringWidth == 0) { - $stringWidth = 1.0E-6; - } - if ($aord == $arraysize - 1) { - $stringWidth -= $this->charspacing / Mpdf::SCALE; - if ($this->checkCJK && $CJKoverflow && $align == 'J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { - // force-end overhang - $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - $this->Cell($this->GetStringWidth($hanger), $stackHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - } else { - $this->Cell($stringWidth, $stackHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - // mono-style line or last part (skips line) - } - } else { - $this->Cell($stringWidth, $stackHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0, 0, 'M', $fill, \true, isset($cOTLdata[$aord]) ? $cOTLdata[$aord] : \false, $this->textvar, isset($lineBox[$k]) ? $lineBox[$k] : \false); - // first or middle part - } - if (!empty($this->spanborddet)) { - if (\strpos($contentB[$k], 'R') !== \false && $aord != $arraysize - 1) { - $this->x += $this->spanborddet['R']['w']; - } - } - // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // - if (isset($spanfill) && $spanfill) { - $fill = $save_fill; - $spanfill = 0; - if ($fill) { - $this->SetFColor($bcor); - } - } - if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { - $this->SetVisibility($save_vis); - } - } - } elseif ($table_draft) { - $this->y += $stackHeight; - } - if (!$is_table) { - $this->maxPosR = \max($this->maxPosR, $this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin']); - $this->maxPosL = \min($this->maxPosL, $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']); - } - // move on to the next line, reset variables, tack on saved content and current char - if (!$table_draft) { - $this->printobjectbuffer($is_table, $blockdir); - } - $this->objectbuffer = []; - /* -- CSS-IMAGE-FLOAT -- */ - // Update values if set to skipline - if ($this->floatmargins) { - $this->_advanceFloatMargins(); - } - /* -- END CSS-IMAGE-FLOAT -- */ - // Reset lineheight - $stackHeight = $this->divheight; - $valign = 'M'; - $font = []; - $content = []; - $contentB = []; - $cOTLdata = []; - // mPDF 5.7.1 - $contentWidth = 0; - if (!empty($savedObj)) { - $this->objectbuffer[] = $savedObj; - $font[] = $savedFont; - $content[] = ''; - $contentB[] = ''; - $cOTLdata[] = []; - // mPDF 5.7.1 - $contentWidth += $savedObj['OUTER-WIDTH'] * Mpdf::SCALE; - } - if (\count($savedPreContent) > 0) { - for ($ix = \count($savedPreContent) - 1; $ix >= 0; $ix--) { - $font[] = $savedPreFont[$ix]; - $content[] = $savedPreContent[$ix]; - $contentB[] = $savedPreContentB[$ix]; - if (!empty($sOTLdata)) { - $cOTLdata[] = $savedPreOTLdata[$ix]; - } - $this->restoreFont($savedPreFont[$ix]); - $lbw = $rbw = 0; - // Border widths - if (!empty($this->spanborddet)) { - $lbw = isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0; - $rbw = isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0; - } - if ($ix > 0) { - $contentWidth += $this->GetStringWidth($savedPreContent[$ix], \true, isset($savedPreOTLdata[$ix]) ? $savedPreOTLdata[$ix] : \false, $this->textvar) * Mpdf::SCALE; - // mPDF 5.7.1 - if (\strpos($savedPreContentB[$ix], 'L') !== \false) { - $contentWidth += $lbw; - } - if (\strpos($savedPreContentB[$ix], 'R') !== \false) { - $contentWidth += $rbw; - } - } - } - $savedPreContent = []; - $savedPreContentB = []; - $savedPreOTLdata = []; - // mPDF 5.7.1 - $savedPreFont = []; - $content[\count($content) - 1] .= $c; - } else { - $font[] = $savedFont; - $content[] = $savedContent . $c; - $contentB[] = $savedContentB; - $cOTLdata[] = $savedOTLdata; - // mPDF 5.7.1 - } - $currContent =& $content[\count($content) - 1]; - $this->restoreFont($font[\count($font) - 1]); - // mPDF 6.0 - /* -- CJK-FONTS -- */ - // CJK - strip CJK space at start of line - //   = \xe3\x80\x80 = CJK space - if ($this->checkCJK && $currContent == " ") { - $currContent = ''; - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $this->otl->trimOTLdata($cOTLdata[\count($cOTLdata) - 1], \true, \false); - // left trim U+3000 - } - } - /* -- END CJK-FONTS -- */ - $lbw = $rbw = 0; - // Border widths - if (!empty($this->spanborddet)) { - $lbw = isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0; - $rbw = isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0; - } - $contentWidth += $this->GetStringWidth($currContent, \false, isset($cOTLdata[\count($cOTLdata) - 1]) ? $cOTLdata[\count($cOTLdata) - 1] : \false, $this->textvar) * Mpdf::SCALE; - // mPDF 5.7.1 - if (\strpos($savedContentB, 'L') !== \false) { - $contentWidth += $lbw; - } - $CJKoverflow = \false; - $hanger = ''; - } else { - $contentWidth += $cw; - $currContent .= $c; - } - } - unset($content); - unset($contentB); - } - // ----------------------END OF FLOWING BLOCK------------------------------------// - /* -- CSS-IMAGE-FLOAT -- */ - // Update values if set to skipline - function _advanceFloatMargins() - { - // Update floatmargins - L - if (isset($this->floatmargins['L']) && $this->floatmargins['L']['skipline'] && $this->floatmargins['L']['y0'] != $this->y) { - $yadj = $this->y - $this->floatmargins['L']['y0']; - $this->floatmargins['L']['y0'] = $this->y; - $this->floatmargins['L']['y1'] += $yadj; - // Update objattr in floatbuffer - if ($this->floatbuffer[$this->floatmargins['L']['id']]['border_left']['w']) { - $this->floatbuffer[$this->floatmargins['L']['id']]['BORDER-Y'] += $yadj; - } - $this->floatbuffer[$this->floatmargins['L']['id']]['INNER-Y'] += $yadj; - $this->floatbuffer[$this->floatmargins['L']['id']]['OUTER-Y'] += $yadj; - // Unset values - $this->floatbuffer[$this->floatmargins['L']['id']]['skipline'] = \false; - $this->floatmargins['L']['skipline'] = \false; - $this->floatmargins['L']['id'] = ''; - } - // Update floatmargins - R - if (isset($this->floatmargins['R']) && $this->floatmargins['R']['skipline'] && $this->floatmargins['R']['y0'] != $this->y) { - $yadj = $this->y - $this->floatmargins['R']['y0']; - $this->floatmargins['R']['y0'] = $this->y; - $this->floatmargins['R']['y1'] += $yadj; - // Update objattr in floatbuffer - if ($this->floatbuffer[$this->floatmargins['R']['id']]['border_left']['w']) { - $this->floatbuffer[$this->floatmargins['R']['id']]['BORDER-Y'] += $yadj; - } - $this->floatbuffer[$this->floatmargins['R']['id']]['INNER-Y'] += $yadj; - $this->floatbuffer[$this->floatmargins['R']['id']]['OUTER-Y'] += $yadj; - // Unset values - $this->floatbuffer[$this->floatmargins['R']['id']]['skipline'] = \false; - $this->floatmargins['R']['skipline'] = \false; - $this->floatmargins['R']['id'] = ''; - } - } - /* -- END CSS-IMAGE-FLOAT -- */ - /* -- END HTML-CSS -- */ - function _SetTextRendering($mode) - { - if (!($mode == 0 || $mode == 1 || $mode == 2)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Text rendering mode should be 0, 1 or 2 (value : {$mode})"); - } - $tr = $mode . ' Tr'; - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr || !isset($this->pageoutput[$this->page]['TextRendering']))) { - $this->writer->write($tr); - } - $this->pageoutput[$this->page]['TextRendering'] = $tr; - } - function SetTextOutline($params = []) - { - if (isset($params['outline-s']) && $params['outline-s']) { - $this->SetLineWidth($params['outline-WIDTH']); - $this->SetDColor($params['outline-COLOR']); - $tr = '2 Tr'; - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr || !isset($this->pageoutput[$this->page]['TextRendering']))) { - $this->writer->write($tr); - } - $this->pageoutput[$this->page]['TextRendering'] = $tr; - } else { - // Now resets all values - $this->SetLineWidth(0.2); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->_SetTextRendering(0); - $tr = '0 Tr'; - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr || !isset($this->pageoutput[$this->page]['TextRendering']))) { - $this->writer->write($tr); - } - $this->pageoutput[$this->page]['TextRendering'] = $tr; - } - } - function Image($file, $x, $y, $w = 0, $h = 0, $type = '', $link = '', $paint = \true, $constrain = \true, $watermark = \false, $shownoimg = \true, $allowvector = \true) - { - $orig_srcpath = $file; - $this->GetFullPath($file); - $info = $this->imageProcessor->getImage($file, \true, $allowvector, $orig_srcpath); - if (!$info && $paint) { - $info = $this->imageProcessor->getImage($this->noImageFile); - if ($info) { - $file = $this->noImageFile; - $w = $info['w'] * (25.4 / $this->img_dpi); - // 14 x 16px - $h = $info['h'] * (25.4 / $this->img_dpi); - // 14 x 16px - } - } - if (!$info) { - return \false; - } - // Automatic width and height calculation if needed - if ($w == 0 and $h == 0) { - /* -- IMAGES-WMF -- */ - if ($info['type'] === 'wmf') { - // WMF units are twips (1/20pt) - // divide by 20 to get points - // divide by k to get user units - $w = \abs($info['w']) / (20 * Mpdf::SCALE); - $h = \abs($info['h']) / (20 * Mpdf::SCALE); - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] === 'svg') { - // returned SVG units are pts - // divide by k to get user units (mm) - $w = \abs($info['w']) / Mpdf::SCALE; - $h = \abs($info['h']) / Mpdf::SCALE; - } else { - // Put image at default image dpi - $w = $info['w'] / Mpdf::SCALE * (72 / $this->img_dpi); - $h = $info['h'] / Mpdf::SCALE * (72 / $this->img_dpi); - } - } - } - if ($w == 0) { - $w = \abs($h * $info['w'] / $info['h']); - } - if ($h == 0) { - $h = \abs($w * $info['h'] / $info['w']); - } - /* -- WATERMARK -- */ - if ($watermark) { - $maxw = $this->w; - $maxh = $this->h; - // Size = D PF or array - if (\is_array($this->watermark_size)) { - $w = $this->watermark_size[0]; - $h = $this->watermark_size[1]; - } elseif (!\is_string($this->watermark_size)) { - $maxw -= $this->watermark_size * 2; - $maxh -= $this->watermark_size * 2; - $w = $maxw; - $h = \abs($w * $info['h'] / $info['w']); - if ($h > $maxh) { - $h = $maxh; - $w = \abs($h * $info['w'] / $info['h']); - } - } elseif ($this->watermark_size == 'F') { - if ($this->ColActive) { - $maxw = $this->w - ($this->DeflMargin + $this->DefrMargin); - } else { - $maxw = $this->pgwidth; - } - $maxh = $this->h - ($this->tMargin + $this->bMargin); - $w = $maxw; - $h = \abs($w * $info['h'] / $info['w']); - if ($h > $maxh) { - $h = $maxh; - $w = \abs($h * $info['w'] / $info['h']); - } - } elseif ($this->watermark_size == 'P') { - // Default P - $w = $maxw; - $h = \abs($w * $info['h'] / $info['w']); - if ($h > $maxh) { - $h = $maxh; - $w = \abs($h * $info['w'] / $info['h']); - } - } - // Automatically resize to maximum dimensions of page if too large - if ($w > $maxw) { - $w = $maxw; - $h = \abs($w * $info['h'] / $info['w']); - } - if ($h > $maxh) { - $h = $maxh; - $w = \abs($h * $info['w'] / $info['h']); - } - // Position - if (\is_array($this->watermark_pos)) { - $x = $this->watermark_pos[0]; - $y = $this->watermark_pos[1]; - } elseif ($this->watermark_pos == 'F') { - // centred on printable area - if ($this->ColActive) { - // *COLUMNS* - if ($this->mirrorMargins && $this->page % 2 == 0) { - $xadj = $this->DeflMargin - $this->DefrMargin; - } else { - $xadj = 0; - } - // *COLUMNS* - $x = $this->DeflMargin - $xadj + ($this->w - ($this->DeflMargin + $this->DefrMargin)) / 2 - $w / 2; - // *COLUMNS* - } else { - // *COLUMNS* - $x = $this->lMargin + $this->pgwidth / 2 - $w / 2; - } - // *COLUMNS* - $y = $this->tMargin + ($this->h - ($this->tMargin + $this->bMargin)) / 2 - $h / 2; - } else { - // default P - centred on whole page - $x = $this->w / 2 - $w / 2; - $y = $this->h / 2 - $h / 2; - } - /* -- IMAGES-WMF -- */ - if ($info['type'] == 'wmf') { - $sx = $w * Mpdf::SCALE / $info['w']; - $sy = -$h * Mpdf::SCALE / $info['h']; - $outstring = \sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], ($this->h - $y) * Mpdf::SCALE - $sy * $info['y'], $info['i']); - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] == 'svg') { - $sx = $w * Mpdf::SCALE / $info['w']; - $sy = -$h * Mpdf::SCALE / $info['h']; - $outstring = \sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], ($this->h - $y) * Mpdf::SCALE - $sy * $info['y'], $info['i']); - } else { - $outstring = \sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $w * Mpdf::SCALE, $h * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $h)) * Mpdf::SCALE, $info['i']); - } - } - if ($this->watermarkImgBehind) { - $outstring = $this->watermarkImgAlpha . "\n" . $outstring . "\n" . $this->SetAlpha(1, 'Normal', \true) . "\n"; - $this->pages[$this->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', "\n" . $outstring . "\n" . '\\1', $this->pages[$this->page]); - } else { - $this->writer->write($outstring); - } - return 0; - } - // end of IF watermark - /* -- END WATERMARK -- */ - if ($constrain) { - // Automatically resize to maximum dimensions of page if too large - if (isset($this->blk[$this->blklvl]['inner_width']) && $this->blk[$this->blklvl]['inner_width']) { - $maxw = $this->blk[$this->blklvl]['inner_width']; - } else { - $maxw = $this->pgwidth; - } - if ($w > $maxw) { - $w = $maxw; - $h = \abs($w * $info['h'] / $info['w']); - } - if ($h > $this->h - ($this->tMargin + $this->bMargin + 1)) { - // see below - +10 to avoid drawing too close to border of page - $h = $this->h - ($this->tMargin + $this->bMargin + 1); - if ($this->fullImageHeight) { - $h = $this->fullImageHeight; - } - $w = \abs($h * $info['w'] / $info['h']); - } - // Avoid drawing out of the paper(exceeding width limits). - // if ( ($x + $w) > $this->fw ) { - if ($x + $w > $this->w) { - $x = $this->lMargin; - $y += 5; - } - $changedpage = \false; - $oldcolumn = $this->CurrCol; - // Avoid drawing out of the page. - if ($y + $h > $this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { - $this->AddPage($this->CurOrientation); - // Added to correct for OddEven Margins - $x = $x + $this->MarginCorrection; - $y = $this->tMargin; - // mPDF 5.7.3 - $changedpage = \true; - } - /* -- COLUMNS -- */ - // COLS - // COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - $y = $this->y0; - $x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - $this->x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - } - /* -- END COLUMNS -- */ - } - // end of IF constrain - /* -- IMAGES-WMF -- */ - if ($info['type'] == 'wmf') { - $sx = $w * Mpdf::SCALE / $info['w']; - $sy = -$h * Mpdf::SCALE / $info['h']; - $outstring = \sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], ($this->h - $y) * Mpdf::SCALE - $sy * $info['y'], $info['i']); - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] == 'svg') { - $sx = $w * Mpdf::SCALE / $info['w']; - $sy = -$h * Mpdf::SCALE / $info['h']; - $outstring = \sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x * Mpdf::SCALE - $sx * $info['x'], ($this->h - $y) * Mpdf::SCALE - $sy * $info['y'], $info['i']); - } else { - $outstring = \sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $w * Mpdf::SCALE, $h * Mpdf::SCALE, $x * Mpdf::SCALE, ($this->h - ($y + $h)) * Mpdf::SCALE, $info['i']); - } - } - if ($paint) { - $this->writer->write($outstring); - if ($link) { - $this->Link($x, $y, $w, $h, $link); - } - // Avoid writing text on top of the image. // THIS WAS OUTSIDE THE if ($paint) bit!!!!!!!!!!!!!!!! - $this->y = $y + $h; - } - // Return width-height array - $sizesarray['WIDTH'] = $w; - $sizesarray['HEIGHT'] = $h; - $sizesarray['X'] = $x; - // Position before painting image - $sizesarray['Y'] = $y; - // Position before painting image - $sizesarray['OUTPUT'] = $outstring; - $sizesarray['IMAGE_ID'] = $info['i']; - $sizesarray['itype'] = $info['type']; - $sizesarray['set-dpi'] = isset($info['set-dpi']) ? $info['set-dpi'] : 0; - return $sizesarray; - } - // ============================================================= - // ============================================================= - // ============================================================= - // ============================================================= - // ============================================================= - /* -- HTML-CSS -- */ - function _getObjAttr($t) - { - $c = \explode(Mpdf::OBJECT_IDENTIFIER, $t, 2); - $c = \explode(',', $c[1], 2); - foreach ($c as $v) { - $v = \explode('=', $v, 2); - $sp[$v[0]] = \trim($v[1], Mpdf::OBJECT_IDENTIFIER); - } - return \unserialize($sp['objattr']); - } - function inlineObject($type, $x, $y, $objattr, $Lmargin, $widthUsed, $maxWidth, $lineHeight, $paint = \false, $is_table = \false) - { - if ($is_table) { - $k = $this->shrin_k; - } else { - $k = 1; - } - // NB $x is only used when paint=true - // Lmargin not used - $w = 0; - if (isset($objattr['width'])) { - $w = $objattr['width'] / $k; - } - $h = 0; - if (isset($objattr['height'])) { - $h = \abs($objattr['height'] / $k); - } - $widthLeft = $maxWidth - $widthUsed; - $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 10); - if ($this->fullImageHeight) { - $maxHeight = $this->fullImageHeight; - } - // For Images - if (isset($objattr['border_left'])) { - $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left'] + $objattr['margin_right']) / $k; - $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top'] + $objattr['margin_bottom']) / $k; - if ($type == 'image' || $type == 'barcode' || $type == 'textcircle') { - $extraWidth += ($objattr['padding_left'] + $objattr['padding_right']) / $k; - $extraHeight += ($objattr['padding_top'] + $objattr['padding_bottom']) / $k; - } - } - if (!isset($objattr['vertical-align'])) { - if ($objattr['type'] == 'select') { - $objattr['vertical-align'] = 'M'; - } else { - $objattr['vertical-align'] = 'BS'; - } - } - // mPDF 6 - if ($type == 'image' || isset($objattr['subtype']) && $objattr['subtype'] == 'IMAGE') { - if (isset($objattr['itype']) && ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg')) { - $file = $objattr['file']; - $info = $this->formobjects[$file]; - } elseif (isset($objattr['file'])) { - $file = $objattr['file']; - $info = $this->images[$file]; - } - } - if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { - $w = 1.0E-5; - $h = 1.0E-5; - } - // TEST whether need to skipline - if (!$paint) { - if ($type == 'hr') { - // always force new line - if ($y + $h + $lineHeight > $this->PageBreakTrigger && !$this->InFooter && !$is_table) { - return [-2, $w, $h]; - } else { - return [1, $w, $h]; - } - // new line - } else { - // LIST MARKERS // mPDF 6 Lists - $displayheight = $h; - $displaywidth = $w; - if ($objattr['type'] == 'image' && isset($objattr['listmarker']) && $objattr['listmarker']) { - $displayheight = 0; - if ($objattr['listmarkerposition'] == 'outside') { - $displaywidth = 0; - } - } - if ($widthUsed > 0 && $displaywidth > $widthLeft && (!$is_table || $type != 'image')) { - // New line needed - // mPDF 6 Lists - if ($y + $displayheight + $lineHeight > $this->PageBreakTrigger && !$this->InFooter) { - return [-2, $w, $h]; - } - // New page + new line - return [1, $w, $h]; - // new line - } elseif ($widthUsed > 0 && $displaywidth > $widthLeft && $is_table) { - // New line needed in TABLE - return [1, $w, $h]; - // new line - } elseif ($y + $displayheight > $this->PageBreakTrigger && !$this->InFooter && !$is_table) { - return [-1, $w, $h]; - } else { - return [0, $w, $h]; - } - } - } - if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { - $w = 1.0E-5; - $h = 1.0E-5; - $objattr['BORDER-WIDTH'] = 0; - $objattr['BORDER-HEIGHT'] = 0; - $objattr['BORDER-X'] = $x; - $objattr['BORDER-Y'] = $y; - $objattr['INNER-WIDTH'] = 0; - $objattr['INNER-HEIGHT'] = 0; - $objattr['INNER-X'] = $x; - $objattr['INNER-Y'] = $y; - } - if ($type == 'image') { - // Automatically resize to width remaining - if ($w > $widthLeft + 0.0001 && !$is_table) { - // mPDF 5.7.4 0.0001 to allow for rounding errors when w==maxWidth - $w = $widthLeft; - $h = \abs($w * $info['h'] / $info['w']); - } - $img_w = $w - $extraWidth; - $img_h = $h - $extraHeight; - $objattr['BORDER-WIDTH'] = $img_w + $objattr['padding_left'] / $k + $objattr['padding_right'] / $k + ($objattr['border_left']['w'] / $k + $objattr['border_right']['w'] / $k) / 2; - $objattr['BORDER-HEIGHT'] = $img_h + $objattr['padding_top'] / $k + $objattr['padding_bottom'] / $k + ($objattr['border_top']['w'] / $k + $objattr['border_bottom']['w'] / $k) / 2; - $objattr['BORDER-X'] = $x + $objattr['margin_left'] / $k + $objattr['border_left']['w'] / $k / 2; - $objattr['BORDER-Y'] = $y + $objattr['margin_top'] / $k + $objattr['border_top']['w'] / $k / 2; - $objattr['INNER-WIDTH'] = $img_w; - $objattr['INNER-HEIGHT'] = $img_h; - $objattr['INNER-X'] = $x + $objattr['padding_left'] / $k + $objattr['margin_left'] / $k + $objattr['border_left']['w'] / $k; - $objattr['INNER-Y'] = $y + $objattr['padding_top'] / $k + $objattr['margin_top'] / $k + $objattr['border_top']['w'] / $k; - $objattr['ID'] = $info['i']; - } - if ($type == 'input' && $objattr['subtype'] == 'IMAGE') { - $img_w = $w - $extraWidth; - $img_h = $h - $extraHeight; - $objattr['BORDER-WIDTH'] = $img_w + ($objattr['border_left']['w'] / $k + $objattr['border_right']['w'] / $k) / 2; - $objattr['BORDER-HEIGHT'] = $img_h + ($objattr['border_top']['w'] / $k + $objattr['border_bottom']['w'] / $k) / 2; - $objattr['BORDER-X'] = $x + $objattr['margin_left'] / $k + $objattr['border_left']['w'] / $k / 2; - $objattr['BORDER-Y'] = $y + $objattr['margin_top'] / $k + $objattr['border_top']['w'] / $k / 2; - $objattr['INNER-WIDTH'] = $img_w; - $objattr['INNER-HEIGHT'] = $img_h; - $objattr['INNER-X'] = $x + $objattr['margin_left'] / $k + $objattr['border_left']['w'] / $k; - $objattr['INNER-Y'] = $y + $objattr['margin_top'] / $k + $objattr['border_top']['w'] / $k; - $objattr['ID'] = $info['i']; - } - if ($type == 'barcode' || $type == 'textcircle') { - $b_w = $w - $extraWidth; - $b_h = $h - $extraHeight; - $objattr['BORDER-WIDTH'] = $b_w + $objattr['padding_left'] / $k + $objattr['padding_right'] / $k + ($objattr['border_left']['w'] / $k + $objattr['border_right']['w'] / $k) / 2; - $objattr['BORDER-HEIGHT'] = $b_h + $objattr['padding_top'] / $k + $objattr['padding_bottom'] / $k + ($objattr['border_top']['w'] / $k + $objattr['border_bottom']['w'] / $k) / 2; - $objattr['BORDER-X'] = $x + $objattr['margin_left'] / $k + $objattr['border_left']['w'] / $k / 2; - $objattr['BORDER-Y'] = $y + $objattr['margin_top'] / $k + $objattr['border_top']['w'] / $k / 2; - $objattr['INNER-X'] = $x + $objattr['padding_left'] / $k + $objattr['margin_left'] / $k + $objattr['border_left']['w'] / $k; - $objattr['INNER-Y'] = $y + $objattr['padding_top'] / $k + $objattr['margin_top'] / $k + $objattr['border_top']['w'] / $k; - $objattr['INNER-WIDTH'] = $b_w; - $objattr['INNER-HEIGHT'] = $b_h; - } - if ($type == 'textarea') { - // Automatically resize to width remaining - if ($w > $widthLeft && !$is_table) { - $w = $widthLeft; - } - // This used to resize height to maximum remaining on page ? why. Causes problems when in table and causing a new column - // if (($y + $h > $this->PageBreakTrigger) && !$this->InFooter) { - // $h=$this->h - $y - $this->bMargin; - // } - } - if ($type == 'hr') { - if ($is_table) { - $objattr['INNER-WIDTH'] = $maxWidth * $objattr['W-PERCENT'] / 100; - $objattr['width'] = $objattr['INNER-WIDTH']; - $w = $maxWidth; - } else { - if ($w > $maxWidth) { - $w = $maxWidth; - } - $objattr['INNER-WIDTH'] = $w; - $w = $maxWidth; - } - } - if ($type == 'select' || $type == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD')) { - // Automatically resize to width remaining - if ($w > $widthLeft && !$is_table) { - $w = $widthLeft; - } - } - if ($type == 'textarea' || $type == 'select' || $type == 'input') { - if (isset($objattr['fontsize'])) { - $objattr['fontsize'] /= $k; - } - if (isset($objattr['linewidth'])) { - $objattr['linewidth'] /= $k; - } - } - if (!isset($objattr['BORDER-Y'])) { - $objattr['BORDER-Y'] = 0; - } - if (!isset($objattr['BORDER-X'])) { - $objattr['BORDER-X'] = 0; - } - if (!isset($objattr['INNER-Y'])) { - $objattr['INNER-Y'] = 0; - } - if (!isset($objattr['INNER-X'])) { - $objattr['INNER-X'] = 0; - } - // Return width-height array - $objattr['OUTER-WIDTH'] = $w; - $objattr['OUTER-HEIGHT'] = $h; - $objattr['OUTER-X'] = $x; - $objattr['OUTER-Y'] = $y; - return $objattr; - } - /* -- END HTML-CSS -- */ - // ============================================================= - // ============================================================= - // ============================================================= - // ============================================================= - // ============================================================= - function SetLineJoin($mode = 0) - { - $s = \sprintf('%d j', $mode); - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['LineJoin']) && $this->pageoutput[$this->page]['LineJoin'] != $s || !isset($this->pageoutput[$this->page]['LineJoin']))) { - $this->writer->write($s); - } - $this->pageoutput[$this->page]['LineJoin'] = $s; - } - function SetLineCap($mode = 2) - { - $s = \sprintf('%d J', $mode); - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['LineCap']) && $this->pageoutput[$this->page]['LineCap'] != $s || !isset($this->pageoutput[$this->page]['LineCap']))) { - $this->writer->write($s); - } - $this->pageoutput[$this->page]['LineCap'] = $s; - } - function SetDash($black = \false, $white = \false) - { - if ($black and $white) { - $s = \sprintf('[%.3F %.3F] 0 d', $black * Mpdf::SCALE, $white * Mpdf::SCALE); - } else { - $s = '[] 0 d'; - } - if ($this->page > 0 && (isset($this->pageoutput[$this->page]['Dash']) && $this->pageoutput[$this->page]['Dash'] != $s || !isset($this->pageoutput[$this->page]['Dash']))) { - $this->writer->write($s); - } - $this->pageoutput[$this->page]['Dash'] = $s; - } - function SetDisplayPreferences($preferences) - { - // String containing any or none of /HideMenubar/HideToolbar/HideWindowUI/DisplayDocTitle/CenterWindow/FitWindow - $this->DisplayPreferences .= $preferences; - } - function Ln($h = '', $collapsible = 0) - { - // Added collapsible to allow collapsible top-margin on new page - // Line feed; default value is last cell height - $margin = isset($this->blk[$this->blklvl]['outer_left_margin']) ? $this->blk[$this->blklvl]['outer_left_margin'] : 0; - $this->x = $this->lMargin + $margin; - if ($collapsible && $this->y == $this->tMargin && !$this->ColActive) { - $h = 0; - } - if (\is_string($h)) { - $this->y += $this->lasth; - } else { - $this->y += $h; - } - } - /* -- HTML-CSS -- */ - function DivLn($h, $level = -3, $move_y = \true, $collapsible = \false, $state = 0) - { - // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom - // Used in Columns and keep-with-table i.e. "kwt" - // writes background block by block so it can be repositioned - // and also used in writingFlowingBlock at top and bottom of blocks to move y (not to draw/paint anything) - // adds lines (y) where DIV bgcolors are filled in - // this->x is returned as it was - // allows .00001 as nominal height used for bookmarks/annotations etc. - if ($collapsible && \sprintf("%0.4f", $this->y) == \sprintf("%0.4f", $this->tMargin) && !$this->ColActive) { - return; - } - // mPDF 6 Columns - // if ($collapsible && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->y0)) && ($this->ColActive) && $this->CurrCol == 0) { return; } // *COLUMNS* - if ($collapsible && \sprintf("%0.4f", $this->y) == \sprintf("%0.4f", $this->y0) && $this->ColActive) { - return; - } - // *COLUMNS* - // Still use this method if columns or keep-with-table, as it allows repositioning later - // otherwise, now uses PaintDivBB() - if (!$this->ColActive && !$this->kwt) { - if ($move_y && !$this->ColActive) { - $this->y += $h; - } - return; - } - if ($level == -3) { - $level = $this->blklvl; - } - $firstblockfill = $this->GetFirstBlockFill(); - if ($firstblockfill && $this->blklvl > 0 && $this->blklvl >= $firstblockfill) { - $last_x = 0; - $last_w = 0; - $last_fc = $this->FillColor; - $bak_x = $this->x; - $bak_h = $this->divheight; - $this->divheight = 0; - // Temporarily turn off divheight - as Cell() uses it to check for PageBreak - for ($blvl = $firstblockfill; $blvl <= $level; $blvl++) { - $this->x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; - // mPDF 6 - if ($this->blk[$blvl]['bgcolor']) { - $this->SetFColor($this->blk[$blvl]['bgcolorarray']); - } - if ($last_x != $this->lMargin + $this->blk[$blvl]['outer_left_margin'] || $last_w != $this->blk[$blvl]['width'] || $last_fc != $this->FillColor || isset($this->blk[$blvl]['border_top']['s']) && $this->blk[$blvl]['border_top']['s'] || isset($this->blk[$blvl]['border_bottom']['s']) && $this->blk[$blvl]['border_bottom']['s'] || isset($this->blk[$blvl]['border_left']['s']) && $this->blk[$blvl]['border_left']['s'] || isset($this->blk[$blvl]['border_right']['s']) && $this->blk[$blvl]['border_right']['s']) { - $x = $this->x; - $this->Cell($this->blk[$blvl]['width'], $h, '', '', 0, '', 1); - $this->x = $x; - if (!$this->keep_block_together && !$this->writingHTMLheader && !$this->writingHTMLfooter) { - // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom - if ($blvl == $this->blklvl) { - $this->PaintDivLnBorder($state, $blvl, $h); - } else { - $this->PaintDivLnBorder(0, $blvl, $h); - } - } - } - $last_x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; - $last_w = $this->blk[$blvl]['width']; - $last_fc = $this->FillColor; - } - // Reset current block fill - if (isset($this->blk[$this->blklvl]['bgcolorarray'])) { - $bcor = $this->blk[$this->blklvl]['bgcolorarray']; - $this->SetFColor($bcor); - } - $this->x = $bak_x; - $this->divheight = $bak_h; - } - if ($move_y) { - $this->y += $h; - } - } - /* -- END HTML-CSS -- */ - function SetX($x) - { - // Set x position - if ($x >= 0) { - $this->x = $x; - } else { - $this->x = $this->w + $x; - } - } - function SetY($y) - { - // Set y position and reset x - $this->x = $this->lMargin; - if ($y >= 0) { - $this->y = $y; - } else { - $this->y = $this->h + $y; - } - } - function SetXY($x, $y) - { - // Set x and y positions - $this->SetY($y); - $this->SetX($x); - } - function Output($name = '', $dest = '') - { - $this->logger->debug(\sprintf('PDF generated in %.6F seconds', \microtime(\true) - $this->time0), ['context' => LogContext::STATISTICS]); - // Finish document if necessary - if ($this->state < 3) { - $this->Close(); - } - if ($this->debug && \error_get_last()) { - $e = \error_get_last(); - if ($e['type'] < 2048 && $e['type'] != 8 || \intval($e['type']) & \intval(\ini_get("error_reporting"))) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Error detected. PDF file generation aborted: %s', $e['message']), $e['type'], 1, $e['file'], $e['line']); - } - } - if (($this->PDFA || $this->PDFX) && $this->encrypted) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDF/A1-b or PDF/X1-a does not permit encryption of documents.'); - } - if (\count($this->PDFAXwarnings) && ($this->PDFA && !$this->PDFAauto || $this->PDFX && !$this->PDFXauto)) { - if ($this->PDFA) { - $standard = 'PDFA/1-b'; - $option = '$mpdf->PDFAauto'; - } else { - $standard = 'PDFX/1-a '; - $option = '$mpdf->PDFXauto'; - } - $this->logger->warning(\sprintf('PDF could not be generated as it stands as a %s compliant file.', $standard), ['context' => LogContext::PDFA_PDFX]); - $this->logger->warning(\sprintf('These issues can be automatically fixed by mPDF using %s = true;', $option), ['context' => LogContext::PDFA_PDFX]); - $this->logger->warning(\sprintf('Action that mPDF will take to automatically force %s compliance are shown further in the log.', $standard), ['context' => LogContext::PDFA_PDFX]); - $this->PDFAXwarnings = \array_unique($this->PDFAXwarnings); - foreach ($this->PDFAXwarnings as $w) { - $this->logger->warning($w, ['context' => LogContext::PDFA_PDFX]); - } - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDFA/PDFX warnings generated. See log for further details'); - } - $this->logger->debug(\sprintf('Compiled in %.6F seconds', \microtime(\true) - $this->time0), ['context' => LogContext::STATISTICS]); - $this->logger->debug(\sprintf('Peak Memory usage %s MB', \number_format(\memory_get_peak_usage(\true) / (1024 * 1024), 2)), ['context' => LogContext::STATISTICS]); - $this->logger->debug(\sprintf('PDF file size %s kB', \number_format(\strlen($this->buffer) / 1024)), ['context' => LogContext::STATISTICS]); - $this->logger->debug(\sprintf('%d fonts used', \count($this->fonts)), ['context' => LogContext::STATISTICS]); - if (\is_bool($dest)) { - $dest = $dest ? Destination::DOWNLOAD : Destination::FILE; - } - $dest = \strtoupper($dest); - if (empty($dest)) { - if (empty($name)) { - $name = 'mpdf.pdf'; - $dest = Destination::INLINE; - } else { - $dest = Destination::FILE; - } - } - switch ($dest) { - case Destination::INLINE: - if (\headers_sent($filename, $line)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Data has already been sent to output (%s at line %s), unable to output PDF file', $filename, $line)); - } - if ($this->debug && !$this->allow_output_buffering && \ob_get_contents()) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Output has already been sent from the script - PDF file generation aborted.'); - } - // We send to a browser - if (\PHP_SAPI !== 'cli') { - \header('Content-Type: application/pdf'); - if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) || empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { - // don't use length if server using compression - \header('Content-Length: ' . \strlen($this->buffer)); - } - \header('Content-disposition: inline; filename="' . $name . '"'); - \header('Cache-Control: public, must-revalidate, max-age=0'); - \header('Pragma: public'); - \header('X-Generator: mPDF' . ($this->exposeVersion ? ' ' . static::VERSION : '')); - \header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); - \header('Last-Modified: ' . \gmdate('D, d M Y H:i:s') . ' GMT'); - } - echo $this->buffer; - break; - case Destination::DOWNLOAD: - if (\headers_sent()) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Data has already been sent to output, unable to output PDF file'); - } - \header('Content-Description: File Transfer'); - \header('Content-Transfer-Encoding: binary'); - \header('Cache-Control: public, must-revalidate, max-age=0'); - \header('Pragma: public'); - \header('X-Generator: mPDF' . ($this->exposeVersion ? ' ' . static::VERSION : '')); - \header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); - \header('Last-Modified: ' . \gmdate('D, d M Y H:i:s') . ' GMT'); - \header('Content-Type: application/pdf'); - if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) || empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { - // don't use length if server using compression - \header('Content-Length: ' . \strlen($this->buffer)); - } - \header('Content-Disposition: attachment; filename="' . $name . '"'); - echo $this->buffer; - break; - case Destination::FILE: - $f = \fopen($name, 'wb'); - if (!$f) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Unable to create output file %s', $name)); - } - \fwrite($f, $this->buffer, \strlen($this->buffer)); - \fclose($f); - break; - case Destination::STRING_RETURN: - $this->cache->clearOld(); - return $this->buffer; - default: - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Incorrect output destination %s', $dest)); - } - $this->cache->clearOld(); - } - public function OutputBinaryData() - { - return $this->Output(null, Destination::STRING_RETURN); - } - public function OutputHttpInline() - { - return $this->Output(null, Destination::INLINE); - } - /** - * @param string $fileName - */ - public function OutputHttpDownload($fileName) - { - return $this->Output($fileName, Destination::DOWNLOAD); - } - /** - * @param string $fileName - */ - public function OutputFile($fileName) - { - return $this->Output($fileName, Destination::FILE); - } - // ***************************************************************************** - // * - // Protected methods * - // * - // ***************************************************************************** - function _dochecks() - { - // Check for locale-related bug - if (1.1 == 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Do not alter the locale before including mPDF'); - } - // Check for decimal separator - if (\sprintf('%.1f', 1.0) != '1.0') { - \setlocale(\LC_NUMERIC, 'C'); - } - if (\ini_get('mbstring.func_overload')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Mpdf cannot function properly with mbstring.func_overload enabled'); - } - if (!\function_exists('mb_substr')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('mbstring extension must be loaded in order to run mPDF'); - } - if (!\function_exists('mb_regex_encoding')) { - $mamp = ''; - if (\strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN') { - $mamp = ' If using MAMP, there is a bug in its PHP build causing this.'; - } - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('mbstring extension with mbregex support must be loaded in order to run mPDF.' . $mamp); - } - } - function _puthtmlheaders() - { - $this->state = 2; - $nb = $this->page; - for ($n = 1; $n <= $nb; $n++) { - if ($this->mirrorMargins && $n % 2 == 0) { - $OE = 'E'; - } else { - $OE = 'O'; - } - $this->page = $n; - $pn = $this->docPageNum($n); - if ($pn) { - $pnstr = $this->pagenumPrefix . $pn . $this->pagenumSuffix; - } else { - $pnstr = ''; - } - $pnt = $this->docPageNumTotal($n); - if ($pnt) { - $pntstr = $this->nbpgPrefix . $pnt . $this->nbpgSuffix; - } else { - $pntstr = ''; - } - if (isset($this->saveHTMLHeader[$n][$OE])) { - $html = isset($this->saveHTMLHeader[$n][$OE]['html']) ? $this->saveHTMLHeader[$n][$OE]['html'] : ''; - $this->lMargin = $this->saveHTMLHeader[$n][$OE]['ml']; - $this->rMargin = $this->saveHTMLHeader[$n][$OE]['mr']; - $this->tMargin = $this->saveHTMLHeader[$n][$OE]['mh']; - $this->bMargin = $this->saveHTMLHeader[$n][$OE]['mf']; - $this->margin_header = $this->saveHTMLHeader[$n][$OE]['mh']; - $this->margin_footer = $this->saveHTMLHeader[$n][$OE]['mf']; - $this->w = $this->saveHTMLHeader[$n][$OE]['pw']; - $this->h = $this->saveHTMLHeader[$n][$OE]['ph']; - if ($this->w > $this->h) { - $this->hPt = $this->fwPt; - $this->wPt = $this->fhPt; - } else { - $this->hPt = $this->fhPt; - $this->wPt = $this->fwPt; - } - $rotate = isset($this->saveHTMLHeader[$n][$OE]['rotate']) ? $this->saveHTMLHeader[$n][$OE]['rotate'] : null; - $this->Reset(); - $this->pageoutput[$n] = []; - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->x = $this->lMargin; - $this->y = $this->margin_header; - // Replace of page number aliases and date format - $html = $this->aliasReplace($html, $pnstr, $pntstr, $nb); - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = []; - $this->writingHTMLheader = \true; - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $this->writingHTMLheader = \false; - $this->Reset(); - $this->pageoutput[$n] = []; - $s = $this->PrintPageBackgrounds(); - $this->headerbuffer = $s . $this->headerbuffer; - $os = ''; - if ($rotate) { - $os .= \sprintf('q 0 -1 1 0 0 %.3F cm ', $this->w * Mpdf::SCALE); - // To rotate the other way i.e. Header to left of page: - // $os .= sprintf('q 0 1 -1 0 %.3F %.3F cm ',($this->h*Mpdf::SCALE), (($this->rMargin - $this->lMargin )*Mpdf::SCALE)); - } - $os .= $this->headerbuffer; - if ($rotate) { - $os .= ' Q' . "\n"; - } - // Writes over the page background but behind any other output on page - $os = \preg_replace(['/\\\\/', '/\\$/'], ['\\\\\\\\', '\\\\$'], $os); - $this->pages[$n] = \preg_replace('/(___HEADER___MARKER' . $this->uniqstr . ')/', "\n" . $os . "\n" . '\\1', $this->pages[$n]); - $lks = $this->HTMLheaderPageLinks; - foreach ($lks as $lk) { - if ($rotate) { - $lw = $lk[2]; - $lh = $lk[3]; - $lk[2] = $lh; - $lk[3] = $lw; - // swap width and height - $ax = $lk[0] / Mpdf::SCALE; - $ay = $lk[1] / Mpdf::SCALE; - $bx = $ay - $lh / Mpdf::SCALE; - $by = $this->w - $ax; - $lk[0] = $bx * Mpdf::SCALE; - $lk[1] = ($this->h - $by) * Mpdf::SCALE - $lw; - } - $this->PageLinks[$n][] = $lk; - } - /* -- FORMS -- */ - foreach ($this->HTMLheaderPageForms as $f) { - $this->form->forms[$f['n']] = $f; - } - /* -- END FORMS -- */ - } - if (isset($this->saveHTMLFooter[$n][$OE])) { - $html = $this->saveHTMLFooter[$this->page][$OE]['html']; - $this->lMargin = $this->saveHTMLFooter[$n][$OE]['ml']; - $this->rMargin = $this->saveHTMLFooter[$n][$OE]['mr']; - $this->tMargin = $this->saveHTMLFooter[$n][$OE]['mh']; - $this->bMargin = $this->saveHTMLFooter[$n][$OE]['mf']; - $this->margin_header = $this->saveHTMLFooter[$n][$OE]['mh']; - $this->margin_footer = $this->saveHTMLFooter[$n][$OE]['mf']; - $this->w = $this->saveHTMLFooter[$n][$OE]['pw']; - $this->h = $this->saveHTMLFooter[$n][$OE]['ph']; - if ($this->w > $this->h) { - $this->hPt = $this->fwPt; - $this->wPt = $this->fhPt; - } else { - $this->hPt = $this->fhPt; - $this->wPt = $this->fwPt; - } - $rotate = isset($this->saveHTMLFooter[$n][$OE]['rotate']) ? $this->saveHTMLFooter[$n][$OE]['rotate'] : null; - $this->Reset(); - $this->pageoutput[$n] = []; - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->x = $this->lMargin; - $top_y = $this->y = $this->h - $this->margin_footer; - // if bottom-margin==0, corrects to avoid division by zero - if ($this->y == $this->h) { - $top_y = $this->y = $this->h + 0.01; - } - // Replace of page number aliases and date format - $html = $this->aliasReplace($html, $pnstr, $pntstr, $nb); - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = []; - $this->writingHTMLfooter = \true; - $this->InFooter = \true; - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $this->InFooter = \false; - $this->Reset(); - $this->pageoutput[$n] = []; - $fheight = $this->y - $top_y; - $adj = -$fheight; - $s = $this->PrintPageBackgrounds(-$adj); - $this->headerbuffer = $s . $this->headerbuffer; - $this->writingHTMLfooter = \false; - // mPDF 5.7.3 (moved after PrintPageBackgrounds so can adjust position of images in footer) - $os = ''; - $os .= $this->StartTransform(\true) . "\n"; - if ($rotate) { - $os .= \sprintf('q 0 -1 1 0 0 %.3F cm ', $this->w * Mpdf::SCALE); - // To rotate the other way i.e. Header to left of page: - // $os .= sprintf('q 0 1 -1 0 %.3F %.3F cm ',($this->h*Mpdf::SCALE), (($this->rMargin - $this->lMargin )*Mpdf::SCALE)); - } - $os .= $this->transformTranslate(0, $adj, \true) . "\n"; - $os .= $this->headerbuffer; - if ($rotate) { - $os .= ' Q' . "\n"; - } - $os .= $this->StopTransform(\true) . "\n"; - // Writes over the page background but behind any other output on page - $os = \preg_replace(['/\\\\/', '/\\$/'], ['\\\\\\\\', '\\\\$'], $os); - $this->pages[$n] = \preg_replace('/(___HEADER___MARKER' . $this->uniqstr . ')/', "\n" . $os . "\n" . '\\1', $this->pages[$n]); - $lks = $this->HTMLheaderPageLinks; - foreach ($lks as $lk) { - $lk[1] -= $adj * Mpdf::SCALE; - if ($rotate) { - $lw = $lk[2]; - $lh = $lk[3]; - $lk[2] = $lh; - $lk[3] = $lw; - // swap width and height - $ax = $lk[0] / Mpdf::SCALE; - $ay = $lk[1] / Mpdf::SCALE; - $bx = $ay - $lh / Mpdf::SCALE; - $by = $this->w - $ax; - $lk[0] = $bx * Mpdf::SCALE; - $lk[1] = ($this->h - $by) * Mpdf::SCALE - $lw; - } - $this->PageLinks[$n][] = $lk; - } - /* -- FORMS -- */ - foreach ($this->HTMLheaderPageForms as $f) { - $f['y'] += $adj; - $this->form->forms[$f['n']] = $f; - } - /* -- END FORMS -- */ - } - // Customization for https://github.com/mpdf/mpdf/issues/172 - // Replace of page number aliases and date format - $this->pages[$n] = $this->aliasReplace($this->pages[$n], $pnstr, $pntstr, $nb); - } - $this->page = $nb; - $this->state = 1; - } - /* -- ANNOTATIONS -- */ - function Annotation($text, $x = 0, $y = 0, $icon = 'Note', $author = '', $subject = '', $opacity = 0, $colarray = \false, $popup = '', $file = '') - { - if (\is_array($colarray) && \count($colarray) == 3) { - $colarray = $this->colorConverter->convert('rgb(' . $colarray[0] . ',' . $colarray[1] . ',' . $colarray[2] . ')', $this->PDFAXwarnings); - } - if ($colarray === \false) { - $colarray = $this->colorConverter->convert('yellow', $this->PDFAXwarnings); - } - if ($x == 0) { - $x = $this->x; - } - if ($y == 0) { - $y = $this->y; - } - $page = $this->page; - if ($page < 1) { - // Document has not been started - assume it's for first page - $page = 1; - if ($x == 0) { - $x = $this->lMargin; - } - if ($y == 0) { - $y = $this->tMargin; - } - } - if ($this->PDFA || $this->PDFX) { - if ($this->PDFA && !$this->PDFAauto || $this->PDFX && !$this->PDFXauto) { - $this->PDFAXwarnings[] = "Annotation markers cannot be semi-transparent in PDFA1-b or PDFX/1-a, so they may make underlying text unreadable. (Annotation markers moved to right margin)"; - } - $x = $this->w - $this->rMargin * 0.66; - } - if (!$this->annotMargin) { - $y -= $this->FontSize / 2; - } - if (!$opacity && $this->annotMargin) { - $opacity = 1; - } elseif (!$opacity) { - $opacity = $this->annotOpacity; - } - $an = ['txt' => $text, 'x' => $x, 'y' => $y, 'opt' => ['Icon' => $icon, 'T' => $author, 'Subj' => $subject, 'C' => $colarray, 'CA' => $opacity, 'popup' => $popup, 'file' => $file]]; - if ($this->keep_block_together) { - // don't write yet - return; - } elseif ($this->table_rotate) { - $this->tbrot_Annots[$this->page][] = $an; - return; - } elseif ($this->kwt) { - $this->kwt_Annots[$this->page][] = $an; - return; - } - if ($this->writingHTMLheader || $this->writingHTMLfooter) { - $this->HTMLheaderPageAnnots[] = $an; - return; - } - // Put an Annotation on the page - $this->PageAnnots[$page][] = $an; - /* -- COLUMNS -- */ - // Save cross-reference to Column buffer - $ref = isset($this->PageAnnots[$this->page]) ? \count($this->PageAnnots[$this->page]) - 1 : -1; - $this->columnAnnots[$this->CurrCol][\intval($this->x)][\intval($this->y)] = $ref; - /* -- END COLUMNS -- */ - } - /* -- END ANNOTATIONS -- */ - function _enddoc() - { - // @log Writing Headers & Footers - $this->_puthtmlheaders(); - // @log Writing Pages - // Remove references to unused fonts (usually default font) - foreach ($this->fonts as $fk => $font) { - if (isset($font['type']) && $font['type'] == 'TTF' && !$font['used']) { - if ($font['sip'] || $font['smp']) { - foreach ($font['subsetfontids'] as $k => $fid) { - foreach ($this->pages as $pn => $page) { - $this->pages[$pn] = \preg_replace('/\\s\\/F' . $fid . ' \\d[\\d.]* Tf\\s/is', ' ', $this->pages[$pn]); - } - } - } else { - foreach ($this->pages as $pn => $page) { - $this->pages[$pn] = \preg_replace('/\\s\\/F' . $font['i'] . ' \\d[\\d.]* Tf\\s/is', ' ', $this->pages[$pn]); - } - } - } - } - if (\count($this->layers)) { - foreach ($this->pages as $pn => $page) { - \preg_match_all('/\\/OCZ-index \\/ZI(\\d+) BDC(.*?)(EMCZ)-index/is', $this->pages[$pn], $m1); - \preg_match_all('/\\/OCBZ-index \\/ZI(\\d+) BDC(.*?)(EMCBZ)-index/is', $this->pages[$pn], $m2); - \preg_match_all('/\\/OCGZ-index \\/ZI(\\d+) BDC(.*?)(EMCGZ)-index/is', $this->pages[$pn], $m3); - $m = []; - for ($i = 0; $i < 4; $i++) { - $m[$i] = \array_merge($m1[$i], $m2[$i], $m3[$i]); - } - if (\count($m[0])) { - $sortarr = []; - for ($i = 0; $i < \count($m[0]); $i++) { - $key = $m[1][$i] * 2; - if ($m[3][$i] == 'EMCZ') { - $key += 2; - // background first then gradient then normal - } elseif ($m[3][$i] == 'EMCGZ') { - $key += 1; - } - $sortarr[$i] = $key; - } - \asort($sortarr); - foreach ($sortarr as $i => $k) { - $this->pages[$pn] = \str_replace($m[0][$i], '', $this->pages[$pn]); - $this->pages[$pn] .= "\n" . $m[0][$i] . "\n"; - } - $this->pages[$pn] = \preg_replace('/\\/OC[BG]{0,1}Z-index \\/ZI(\\d+) BDC/is', '/OC /ZI\\1 BDC ', $this->pages[$pn]); - $this->pages[$pn] = \preg_replace('/EMC[BG]{0,1}Z-index/is', 'EMC', $this->pages[$pn]); - } - } - } - $this->pageWriter->writePages(); - // @log Writing document resources - $this->resourceWriter->writeResources(); - // Info - $this->writer->object(); - $this->InfoRoot = $this->n; - $this->writer->write('<<'); - // @log Writing document info - $this->metadataWriter->writeInfo(); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // METADATA - if ($this->PDFA || $this->PDFX) { - $this->metadataWriter->writeMetadata(); - } - // OUTPUTINTENT - if ($this->PDFA || $this->PDFX || $this->ICCProfile) { - $this->metadataWriter->writeOutputIntent(); - } - // Associated files - if ($this->associatedFiles) { - $this->metadataWriter->writeAssociatedFiles(); - } - // Catalog - $this->writer->object(); - $this->writer->write('<<'); - // @log Writing document catalog - $this->metadataWriter->writeCatalog(); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // Cross-ref - $o = \strlen($this->buffer); - $this->writer->write('xref'); - $this->writer->write('0 ' . ($this->n + 1)); - $this->writer->write('0000000000 65535 f '); - for ($i = 1; $i <= $this->n; $i++) { - $this->writer->write(\sprintf('%010d 00000 n ', $this->offsets[$i])); - } - // Trailer - $this->writer->write('trailer'); - $this->writer->write('<<'); - $this->metadataWriter->writeTrailer(); - $this->writer->write('>>'); - $this->writer->write('startxref'); - $this->writer->write($o); - $this->buffer .= '%%EOF'; - $this->state = 3; - } - function _beginpage($orientation, $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $pagesel = '', $newformat = '') - { - if (!($pagesel && $this->page == 1 && \sprintf("%0.4f", $this->y) == \sprintf("%0.4f", $this->tMargin))) { - $this->page++; - $this->pages[$this->page] = ''; - } - $this->state = 2; - $resetHTMLHeadersrequired = \false; - if ($newformat) { - $this->_setPageSize($newformat, $orientation); - } - /* -- CSS-PAGE -- */ - // Paged media (page-box) - if ($pagesel || $this->page_box['using']) { - if ($pagesel || $this->page === 1) { - $first = \true; - } else { - $first = \false; - } - if ($this->mirrorMargins && $this->page % 2 === 0) { - $oddEven = 'E'; - } else { - $oddEven = 'O'; - } - if ($pagesel) { - $psel = $pagesel; - } elseif ($this->page_box['current']) { - $psel = $this->page_box['current']; - } else { - $psel = ''; - } - list($orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $hname, $fname, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat) = $this->SetPagedMediaCSS($psel, $first, $oddEven); - if ($this->mirrorMargins && $this->page % 2 === 0) { - if ($hname) { - $ehvalue = 1; - $ehname = $hname; - } else { - $ehvalue = -1; - } - if ($fname) { - $efvalue = 1; - $efname = $fname; - } else { - $efvalue = -1; - } - } else { - if ($hname) { - $ohvalue = 1; - $ohname = $hname; - } else { - $ohvalue = -1; - } - if ($fname) { - $ofvalue = 1; - $ofname = $fname; - } else { - $ofvalue = -1; - } - } - if ($resetpagenum || $pagenumstyle || $suppress) { - $this->PageNumSubstitutions[] = ['from' => $this->page, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; - } - // PAGED MEDIA - CROP / CROSS MARKS from @PAGE - $this->show_marks = $marks; - // Background color - if (isset($bg['BACKGROUND-COLOR'])) { - $cor = $this->colorConverter->convert($bg['BACKGROUND-COLOR'], $this->PDFAXwarnings); - if ($cor) { - $this->bodyBackgroundColor = $cor; - } - } else { - $this->bodyBackgroundColor = \false; - } - /* -- BACKGROUNDS -- */ - if (isset($bg['BACKGROUND-GRADIENT'])) { - $this->bodyBackgroundGradient = $bg['BACKGROUND-GRADIENT']; - } else { - $this->bodyBackgroundGradient = \false; - } - // Tiling Patterns - if (isset($bg['BACKGROUND-IMAGE']) && $bg['BACKGROUND-IMAGE']) { - $ret = $this->SetBackground($bg, $this->pgwidth); - if ($ret) { - $this->bodyBackgroundImage = $ret; - } - } else { - $this->bodyBackgroundImage = \false; - } - /* -- END BACKGROUNDS -- */ - $this->page_box['current'] = $psel; - $this->page_box['using'] = \true; - } - /* -- END CSS-PAGE -- */ - // Page orientation - if (!$orientation) { - $orientation = $this->DefOrientation; - } else { - $orientation = \strtoupper(\substr($orientation, 0, 1)); - if ($orientation != $this->DefOrientation) { - $this->OrientationChanges[$this->page] = \true; - } - } - if ($orientation !== $this->CurOrientation || $newformat) { - // Change orientation - if ($orientation === 'P') { - $this->wPt = $this->fwPt; - $this->hPt = $this->fhPt; - $this->w = $this->fw; - $this->h = $this->fh; - if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation === 'P') { - $this->tMargin = $this->orig_tMargin; - $this->bMargin = $this->orig_bMargin; - $this->DeflMargin = $this->orig_lMargin; - $this->DefrMargin = $this->orig_rMargin; - $this->margin_header = $this->orig_hMargin; - $this->margin_footer = $this->orig_fMargin; - } else { - $resetHTMLHeadersrequired = \true; - } - } else { - $this->wPt = $this->fhPt; - $this->hPt = $this->fwPt; - $this->w = $this->fh; - $this->h = $this->fw; - if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation === 'P') { - $this->tMargin = $this->orig_lMargin; - $this->bMargin = $this->orig_rMargin; - $this->DeflMargin = $this->orig_bMargin; - $this->DefrMargin = $this->orig_tMargin; - $this->margin_header = $this->orig_hMargin; - $this->margin_footer = $this->orig_fMargin; - } else { - $resetHTMLHeadersrequired = \true; - } - } - $this->CurOrientation = $orientation; - $this->ResetMargins(); - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->PageBreakTrigger = $this->h - $this->bMargin; - } - $this->pageDim[$this->page]['w'] = $this->w; - $this->pageDim[$this->page]['h'] = $this->h; - $this->pageDim[$this->page]['outer_width_LR'] = $this->page_box['outer_width_LR'] ?: 0; - $this->pageDim[$this->page]['outer_width_TB'] = $this->page_box['outer_width_TB'] ?: 0; - if (!$this->page_box['outer_width_LR'] && !$this->page_box['outer_width_TB']) { - $this->pageDim[$this->page]['bleedMargin'] = 0; - } elseif ($this->bleedMargin <= $this->page_box['outer_width_LR'] && $this->bleedMargin <= $this->page_box['outer_width_TB']) { - $this->pageDim[$this->page]['bleedMargin'] = $this->bleedMargin; - } else { - $this->pageDim[$this->page]['bleedMargin'] = \min($this->page_box['outer_width_LR'], $this->page_box['outer_width_TB']) - 0.01; - } - // If Page Margins are re-defined - // strlen()>0 is used to pick up (integer) 0, (string) '0', or set value - if (\strlen($mgl) > 0 && $this->DeflMargin != $mgl || \strlen($mgr) > 0 && $this->DefrMargin != $mgr || \strlen($mgt) > 0 && $this->tMargin != $mgt || \strlen($mgb) > 0 && $this->bMargin != $mgb || \strlen($mgh) > 0 && $this->margin_header != $mgh || \strlen($mgf) > 0 && $this->margin_footer != $mgf) { - if (\strlen($mgl) > 0) { - $this->DeflMargin = $mgl; - } - if (\strlen($mgr) > 0) { - $this->DefrMargin = $mgr; - } - if (\strlen($mgt) > 0) { - $this->tMargin = $mgt; - } - if (\strlen($mgb) > 0) { - $this->bMargin = $mgb; - } - if (\strlen($mgh) > 0) { - $this->margin_header = $mgh; - } - if (\strlen($mgf) > 0) { - $this->margin_footer = $mgf; - } - $this->ResetMargins(); - $this->SetAutoPageBreak($this->autoPageBreak, $this->bMargin); - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $resetHTMLHeadersrequired = \true; - } - $this->ResetMargins(); - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->SetAutoPageBreak($this->autoPageBreak, $this->bMargin); - // Reset column top margin - $this->y0 = $this->tMargin; - $this->x = $this->lMargin; - $this->y = $this->tMargin; - $this->FontFamily = ''; - // HEADERS AND FOOTERS // mPDF 6 - if ($ohvalue < 0 || \strtoupper($ohvalue) == 'OFF') { - $this->HTMLHeader = ''; - $resetHTMLHeadersrequired = \true; - } elseif ($ohname && $ohvalue > 0) { - if (\preg_match('/^html_(.*)$/i', $ohname, $n)) { - $name = $n[1]; - } else { - $name = $ohname; - } - if (isset($this->pageHTMLheaders[$name])) { - $this->HTMLHeader = $this->pageHTMLheaders[$name]; - } else { - $this->HTMLHeader = ''; - } - $resetHTMLHeadersrequired = \true; - } - if ($ehvalue < 0 || \strtoupper($ehvalue) == 'OFF') { - $this->HTMLHeaderE = ''; - $resetHTMLHeadersrequired = \true; - } elseif ($ehname && $ehvalue > 0) { - if (\preg_match('/^html_(.*)$/i', $ehname, $n)) { - $name = $n[1]; - } else { - $name = $ehname; - } - if (isset($this->pageHTMLheaders[$name])) { - $this->HTMLHeaderE = $this->pageHTMLheaders[$name]; - } else { - $this->HTMLHeaderE = ''; - } - $resetHTMLHeadersrequired = \true; - } - if ($ofvalue < 0 || \strtoupper($ofvalue) == 'OFF') { - $this->HTMLFooter = ''; - $resetHTMLHeadersrequired = \true; - } elseif ($ofname && $ofvalue > 0) { - if (\preg_match('/^html_(.*)$/i', $ofname, $n)) { - $name = $n[1]; - } else { - $name = $ofname; - } - if (isset($this->pageHTMLfooters[$name])) { - $this->HTMLFooter = $this->pageHTMLfooters[$name]; - } else { - $this->HTMLFooter = ''; - } - $resetHTMLHeadersrequired = \true; - } - if ($efvalue < 0 || \strtoupper($efvalue) == 'OFF') { - $this->HTMLFooterE = ''; - $resetHTMLHeadersrequired = \true; - } elseif ($efname && $efvalue > 0) { - if (\preg_match('/^html_(.*)$/i', $efname, $n)) { - $name = $n[1]; - } else { - $name = $efname; - } - if (isset($this->pageHTMLfooters[$name])) { - $this->HTMLFooterE = $this->pageHTMLfooters[$name]; - } else { - $this->HTMLFooterE = ''; - } - $resetHTMLHeadersrequired = \true; - } - if ($resetHTMLHeadersrequired) { - $this->SetHTMLHeader($this->HTMLHeader); - $this->SetHTMLHeader($this->HTMLHeaderE, 'E'); - $this->SetHTMLFooter($this->HTMLFooter); - $this->SetHTMLFooter($this->HTMLFooterE, 'E'); - } - if ($this->mirrorMargins && $this->page % 2 == 0) { - // EVEN - $this->_setAutoHeaderHeight($this->HTMLHeaderE); - $this->_setAutoFooterHeight($this->HTMLFooterE); - } else { - // ODD or DEFAULT - $this->_setAutoHeaderHeight($this->HTMLHeader); - $this->_setAutoFooterHeight($this->HTMLFooter); - } - // Reset column top margin - $this->y0 = $this->tMargin; - $this->x = $this->lMargin; - $this->y = $this->tMargin; - } - // mPDF 6 - function _setAutoHeaderHeight(&$htmlh) - { - /* When the setAutoTopMargin option is set to pad/stretch, only apply auto header height when a header exists */ - if ($this->HTMLHeader === '' && $this->HTMLHeaderE === '') { - return; - } - if ($this->setAutoTopMargin == 'pad') { - if (isset($htmlh['h']) && $htmlh['h']) { - $h = $htmlh['h']; - } else { - $h = 0; - } - $this->tMargin = $this->margin_header + $h + $this->orig_tMargin; - } elseif ($this->setAutoTopMargin == 'stretch') { - if (isset($htmlh['h']) && $htmlh['h']) { - $h = $htmlh['h']; - } else { - $h = 0; - } - $this->tMargin = \max($this->orig_tMargin, $this->margin_header + $h + $this->autoMarginPadding); - } - } - // mPDF 6 - function _setAutoFooterHeight(&$htmlf) - { - /* When the setAutoTopMargin option is set to pad/stretch, only apply auto footer height when a footer exists */ - if ($this->HTMLFooter === '' && $this->HTMLFooterE === '') { - return; - } - if ($this->setAutoBottomMargin == 'pad') { - if (isset($htmlf['h']) && $htmlf['h']) { - $h = $htmlf['h']; - } else { - $h = 0; - } - $this->bMargin = $this->margin_footer + $h + $this->orig_bMargin; - $this->PageBreakTrigger = $this->h - $this->bMargin; - } elseif ($this->setAutoBottomMargin == 'stretch') { - if (isset($htmlf['h']) && $htmlf['h']) { - $h = $htmlf['h']; - } else { - $h = 0; - } - $this->bMargin = \max($this->orig_bMargin, $this->margin_footer + $h + $this->autoMarginPadding); - $this->PageBreakTrigger = $this->h - $this->bMargin; - } - } - function _endpage() - { - /* -- CSS-IMAGE-FLOAT -- */ - $this->printfloatbuffer(); - /* -- END CSS-IMAGE-FLOAT -- */ - if ($this->visibility != 'visible') { - $this->SetVisibility('visible'); - } - $this->EndLayer(); - // End of page contents - $this->state = 1; - } - function _dounderline($x, $y, $txt, $OTLdata = \false, $textvar = 0) - { - // Now print line exactly where $y secifies - called from Text() and Cell() - adjust position there - // WORD SPACING - $w = $this->GetStringWidth($txt, \false, $OTLdata, $textvar) * Mpdf::SCALE + $this->charspacing * \mb_strlen($txt, $this->mb_enc) + $this->ws * \mb_substr_count($txt, ' ', $this->mb_enc); - // Draw a line - return \sprintf('%.3F %.3F m %.3F %.3F l S', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $x * Mpdf::SCALE + $w, ($this->h - $y) * Mpdf::SCALE); - } - /* -- WATERMARK -- */ - // add a watermark - function watermark($texte, $angle = 45, $fontsize = 96, $alpha = 0.2) - { - if ($this->PDFA || $this->PDFX) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); - } - if (!$this->watermark_font) { - $this->watermark_font = $this->default_font; - } - $this->SetFont($this->watermark_font, "B", $fontsize, \false); - // Don't output - $texte = $this->purify_utf8_text($texte); - if ($this->text_input_as_HTML) { - $texte = $this->all_entities_to_utf8($texte); - } - if ($this->usingCoreFont) { - $texte = \mb_convert_encoding($texte, $this->mb_enc, 'UTF-8'); - } - // DIRECTIONALITY - if (\preg_match("/([" . $this->pregRTLchars . "])/u", $texte)) { - $this->biDirectional = \true; - } - // *OTL* - $textvar = 0; - $save_OTLtags = $this->OTLtags; - $this->OTLtags = []; - if ($this->useKerning) { - if ($this->CurrentFont['haskernGPOS']) { - $this->OTLtags['Plus'] .= ' kern'; - } else { - $textvar = $textvar | TextVars::FC_KERNING; - } - } - /* -- OTL -- */ - // Use OTL OpenType Table Layout - GSUB & GPOS - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $texte = $this->otl->applyOTL($texte, $this->CurrentFont['useOTL']); - $OTLdata = $this->otl->OTLdata; - } - /* -- END OTL -- */ - $this->OTLtags = $save_OTLtags; - $this->magic_reverse_dir($texte, $this->directionality, $OTLdata); - $this->SetAlpha($alpha); - $color = $this->watermarkTextObject ? $this->watermarkTextObject->getColor() : 0; - $this->SetTColor($this->colorConverter->convert($color, $this->PDFAXwarnings)); - $szfont = $fontsize; - $loop = 0; - $maxlen = \min($this->w, $this->h); - // sets max length of text as 7/8 width/height of page - while ($loop == 0) { - $this->SetFont($this->watermark_font, "B", $szfont, \false); - // Don't output - $offset = \sin(\deg2rad($angle)) * ($szfont / Mpdf::SCALE); - $strlen = $this->GetStringWidth($texte, \true, $OTLdata, $textvar); - if ($strlen > $maxlen - $offset) { - $szfont--; - } else { - $loop++; - } - } - $this->SetFont($this->watermark_font, "B", $szfont - 0.1, \true, \true); - // Output The -0.1 is because SetFont above is not written to PDF - // Repeating it will not output anything as mPDF thinks it is set - $adj = \cos(\deg2rad($angle)) * ($strlen / 2); - $opp = \sin(\deg2rad($angle)) * ($strlen / 2); - $wx = $this->w / 2 - $adj + $offset / 3; - $wy = $this->h / 2 + $opp; - $this->Rotate($angle, $wx, $wy); - $this->Text($wx, $wy, $texte, $OTLdata, $textvar); - $this->Rotate(0); - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetAlpha(1); - } - function watermarkImg($src, $alpha = 0.2) - { - if ($this->PDFA || $this->PDFX) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); - } - if ($this->watermarkImgBehind) { - $this->watermarkImgAlpha = $this->SetAlpha($alpha, 'Normal', \true); - } else { - $this->SetAlpha($alpha, $this->watermarkImgAlphaBlend); - } - $this->Image($src, 0, 0, 0, 0, '', '', \true, \true, \true); - if (!$this->watermarkImgBehind) { - $this->SetAlpha(1); - } - } - /* -- END WATERMARK -- */ - function Rotate($angle, $x = -1, $y = -1) - { - if ($x == -1) { - $x = $this->x; - } - if ($y == -1) { - $y = $this->y; - } - if ($this->angle != 0) { - $this->writer->write('Q'); - } - $this->angle = $angle; - if ($angle != 0) { - $angle *= \M_PI / 180; - $c = \cos($angle); - $s = \sin($angle); - $cx = $x * Mpdf::SCALE; - $cy = ($this->h - $y) * Mpdf::SCALE; - $this->writer->write(\sprintf('q %.5F %.5F %.5F %.5F %.3F %.3F cm 1 0 0 1 %.3F %.3F cm', $c, $s, -$s, $c, $cx, $cy, -$cx, -$cy)); - } - } - function CircularText($x, $y, $r, $text, $align = 'top', $fontfamily = '', $fontsize = 0, $fontstyle = '', $kerning = 120, $fontwidth = 100, $divider = '') - { - if (empty($this->directWrite)) { - $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); - } - $this->directWrite->CircularText($x, $y, $r, $text, $align, $fontfamily, $fontsize, $fontstyle, $kerning, $fontwidth, $divider); - } - // From Invoice - function RoundedRect($x, $y, $w, $h, $r, $style = '') - { - $hp = $this->h; - if ($style == 'F') { - $op = 'f'; - } elseif ($style == 'FD' or $style == 'DF') { - $op = 'B'; - } else { - $op = 'S'; - } - $MyArc = 4 / 3 * (\sqrt(2) - 1); - $this->writer->write(\sprintf('%.3F %.3F m', ($x + $r) * Mpdf::SCALE, ($hp - $y) * Mpdf::SCALE)); - $xc = $x + $w - $r; - $yc = $y + $r; - $this->writer->write(\sprintf('%.3F %.3F l', $xc * Mpdf::SCALE, ($hp - $y) * Mpdf::SCALE)); - $this->_Arc($xc + $r * $MyArc, $yc - $r, $xc + $r, $yc - $r * $MyArc, $xc + $r, $yc); - $xc = $x + $w - $r; - $yc = $y + $h - $r; - $this->writer->write(\sprintf('%.3F %.3F l', ($x + $w) * Mpdf::SCALE, ($hp - $yc) * Mpdf::SCALE)); - $this->_Arc($xc + $r, $yc + $r * $MyArc, $xc + $r * $MyArc, $yc + $r, $xc, $yc + $r); - $xc = $x + $r; - $yc = $y + $h - $r; - $this->writer->write(\sprintf('%.3F %.3F l', $xc * Mpdf::SCALE, ($hp - ($y + $h)) * Mpdf::SCALE)); - $this->_Arc($xc - $r * $MyArc, $yc + $r, $xc - $r, $yc + $r * $MyArc, $xc - $r, $yc); - $xc = $x + $r; - $yc = $y + $r; - $this->writer->write(\sprintf('%.3F %.3F l', $x * Mpdf::SCALE, ($hp - $yc) * Mpdf::SCALE)); - $this->_Arc($xc - $r, $yc - $r * $MyArc, $xc - $r * $MyArc, $yc - $r, $xc, $yc - $r); - $this->writer->write($op); - } - function _Arc($x1, $y1, $x2, $y2, $x3, $y3) - { - $h = $this->h; - $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $x1 * Mpdf::SCALE, ($h - $y1) * Mpdf::SCALE, $x2 * Mpdf::SCALE, ($h - $y2) * Mpdf::SCALE, $x3 * Mpdf::SCALE, ($h - $y3) * Mpdf::SCALE)); - } - // ==================================================== - /* -- DIRECTW -- */ - function Shaded_box($text, $font = '', $fontstyle = 'B', $szfont = '', $width = '70%', $style = 'DF', $radius = 2.5, $fill = '#FFFFFF', $color = '#000000', $pad = 2) - { - // F (shading - no line),S (line, no shading),DF (both) - if (empty($this->directWrite)) { - $this->directWrite = new DirectWrite($this, $this->otl, $this->sizeConverter, $this->colorConverter); - } - $this->directWrite->Shaded_box($text, $font, $fontstyle, $szfont, $width, $style, $radius, $fill, $color, $pad); - } - /* -- END DIRECTW -- */ - function UTF8StringToArray($str, $addSubset = \true) - { - $out = []; - $len = \strlen($str); - for ($i = 0; $i < $len; $i++) { - $uni = -1; - $h = \ord($str[$i]); - if ($h <= 0x7f) { - $uni = $h; - } elseif ($h >= 0xc2) { - if ($h <= 0xdf && $i < $len - 1) { - $uni = ($h & 0x1f) << 6 | \ord($str[++$i]) & 0x3f; - } elseif ($h <= 0xef && $i < $len - 2) { - $uni = ($h & 0xf) << 12 | (\ord($str[++$i]) & 0x3f) << 6 | \ord($str[++$i]) & 0x3f; - } elseif ($h <= 0xf4 && $i < $len - 3) { - $uni = ($h & 0xf) << 18 | (\ord($str[++$i]) & 0x3f) << 12 | (\ord($str[++$i]) & 0x3f) << 6 | \ord($str[++$i]) & 0x3f; - } - } - if ($uni >= 0) { - $out[] = $uni; - if ($addSubset && isset($this->CurrentFont['subset'])) { - $this->CurrentFont['subset'][$uni] = $uni; - } - } - } - return $out; - } - // Convert utf-8 string to for Font Subsets - function UTF8toSubset($str) - { - $ret = '<'; - // $str = preg_replace('/'.preg_quote($this->aliasNbPg,'/').'/', chr(7), $str ); // mPDF 6 deleted - // $str = preg_replace('/'.preg_quote($this->aliasNbPgGp,'/').'/', chr(8), $str ); // mPDF 6 deleted - $unicode = $this->UTF8StringToArray($str); - $orig_fid = $this->CurrentFont['subsetfontids'][0]; - $last_fid = $this->CurrentFont['subsetfontids'][0]; - foreach ($unicode as $c) { - /* // mPDF 6 deleted - if ($c == 7 || $c == 8) { - if ($orig_fid != $last_fid) { - $ret .= '> Tj /F'.$orig_fid.' '.$this->FontSizePt.' Tf <'; - $last_fid = $orig_fid; - } - if ($c == 7) { $ret .= $this->aliasNbPgHex; } - else { $ret .= $this->aliasNbPgGpHex; } - continue; - } - */ - if (!$this->_charDefined($this->CurrentFont['cw'], $c)) { - $c = 0; - } - // mPDF 6 - for ($i = 0; $i < 99; $i++) { - // return c as decimal char - $init = \array_search($c, $this->CurrentFont['subsets'][$i]); - if ($init !== \false) { - if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { - $ret .= '> Tj /F' . $this->CurrentFont['subsetfontids'][$i] . ' ' . $this->FontSizePt . ' Tf <'; - $last_fid = $this->CurrentFont['subsetfontids'][$i]; - } - $ret .= \sprintf("%02s", \strtoupper(\dechex($init))); - break; - } elseif (\count($this->CurrentFont['subsets'][$i]) < 255) { - $n = \count($this->CurrentFont['subsets'][$i]); - $this->CurrentFont['subsets'][$i][$n] = $c; - if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { - $ret .= '> Tj /F' . $this->CurrentFont['subsetfontids'][$i] . ' ' . $this->FontSizePt . ' Tf <'; - $last_fid = $this->CurrentFont['subsetfontids'][$i]; - } - $ret .= \sprintf("%02s", \strtoupper(\dechex($n))); - break; - } elseif (!isset($this->CurrentFont['subsets'][$i + 1])) { - // TrueType embedded SUBSETS - $this->CurrentFont['subsets'][$i + 1] = [0 => 0]; - $new_fid = \count($this->fonts) + $this->extraFontSubsets + 1; - $this->CurrentFont['subsetfontids'][$i + 1] = $new_fid; - $this->extraFontSubsets++; - } - } - } - $ret .= '>'; - if ($last_fid != $orig_fid) { - $ret .= ' Tj /F' . $orig_fid . ' ' . $this->FontSizePt . ' Tf <> '; - } - return $ret; - } - /* -- CJK-FONTS -- */ - // from class PDF_Chinese CJK EXTENSIONS - function AddCIDFont($family, $style, $name, &$cw, $CMap, $registry, $desc) - { - $fontkey = \strtolower($family) . \strtoupper($style); - if (isset($this->fonts[$fontkey])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Font already added: {$family} {$style}"); - } - $i = \count($this->fonts) + $this->extraFontSubsets + 1; - $name = \str_replace(' ', '', $name); - if ($family == 'sjis') { - $up = -120; - } else { - $up = -130; - } - // ? 'up' and 'ut' do not seem to be referenced anywhere - $this->fonts[$fontkey] = ['i' => $i, 'type' => 'Type0', 'name' => $name, 'up' => $up, 'ut' => 40, 'cw' => $cw, 'CMap' => $CMap, 'registry' => $registry, 'MissingWidth' => 1000, 'desc' => $desc]; - } - function AddCJKFont($family) - { - if ($this->PDFA || $this->PDFX) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Adobe CJK fonts cannot be embedded in mPDF (required for PDFA1-b and PDFX/1-a)."); - } - if ($family == 'big5') { - $this->AddBig5Font(); - } elseif ($family == 'gb') { - $this->AddGBFont(); - } elseif ($family == 'sjis') { - $this->AddSJISFont(); - } elseif ($family == 'uhc') { - $this->AddUHCFont(); - } - } - function AddBig5Font() - { - // Add Big5 font with proportional Latin - $family = 'big5'; - $name = 'MSungStd-Light-Acro'; - $cw = $this->Big5_widths; - $CMap = 'UniCNS-UTF16-H'; - $registry = ['ordering' => 'CNS1', 'supplement' => 4]; - $desc = ['Ascent' => 880, 'Descent' => -120, 'CapHeight' => 880, 'Flags' => 6, 'FontBBox' => '[-160 -249 1015 1071]', 'ItalicAngle' => 0, 'StemV' => 93]; - $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); - } - function AddGBFont() - { - // Add GB font with proportional Latin - $family = 'gb'; - $name = 'STSongStd-Light-Acro'; - $cw = $this->GB_widths; - $CMap = 'UniGB-UTF16-H'; - $registry = ['ordering' => 'GB1', 'supplement' => 4]; - $desc = ['Ascent' => 880, 'Descent' => -120, 'CapHeight' => 737, 'Flags' => 6, 'FontBBox' => '[-25 -254 1000 880]', 'ItalicAngle' => 0, 'StemV' => 58, 'Style' => '<< /Panose <000000000400000000000000> >>']; - $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); - } - function AddSJISFont() - { - // Add SJIS font with proportional Latin - $family = 'sjis'; - $name = 'KozMinPro-Regular-Acro'; - $cw = $this->SJIS_widths; - $CMap = 'UniJIS-UTF16-H'; - $registry = ['ordering' => 'Japan1', 'supplement' => 5]; - $desc = ['Ascent' => 880, 'Descent' => -120, 'CapHeight' => 740, 'Flags' => 6, 'FontBBox' => '[-195 -272 1110 1075]', 'ItalicAngle' => 0, 'StemV' => 86, 'XHeight' => 502]; - $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); - } - function AddUHCFont() - { - // Add UHC font with proportional Latin - $family = 'uhc'; - $name = 'HYSMyeongJoStd-Medium-Acro'; - $cw = $this->UHC_widths; - $CMap = 'UniKS-UTF16-H'; - $registry = ['ordering' => 'Korea1', 'supplement' => 2]; - $desc = ['Ascent' => 880, 'Descent' => -120, 'CapHeight' => 720, 'Flags' => 6, 'FontBBox' => '[-28 -148 1001 880]', 'ItalicAngle' => 0, 'StemV' => 60, 'Style' => '<< /Panose <000000000600000000000000> >>']; - $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry, $desc); - $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry, $desc); - } - /* -- END CJK-FONTS -- */ - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - function SetDefaultFont($font) - { - // Disallow embedded fonts to be used as defaults in PDFA - if ($this->PDFA || $this->PDFX) { - if (\strtolower($font) == 'ctimes') { - $font = 'serif'; - } - if (\strtolower($font) == 'ccourier') { - $font = 'monospace'; - } - if (\strtolower($font) == 'chelvetica') { - $font = 'sans-serif'; - } - } - $font = $this->SetFont($font); - // returns substituted font if necessary - $this->default_font = $font; - $this->original_default_font = $font; - if (!$this->watermark_font) { - $this->watermark_font = $font; - } - // *WATERMARK* - $this->defaultCSS['BODY']['FONT-FAMILY'] = $font; - $this->cssManager->CSS['BODY']['FONT-FAMILY'] = $font; - } - function SetDefaultFontSize($fontsize) - { - $this->default_font_size = $fontsize; - $this->original_default_font_size = $fontsize; - $this->SetFontSize($fontsize); - $this->defaultCSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; - $this->cssManager->CSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; - } - function SetDefaultBodyCSS($prop, $val) - { - if ($prop) { - $this->defaultCSS['BODY'][\strtoupper($prop)] = $val; - $this->cssManager->CSS['BODY'][\strtoupper($prop)] = $val; - } - } - function SetDirectionality($dir = 'ltr') - { - /* -- OTL -- */ - if (\strtolower($dir) == 'rtl') { - if ($this->directionality != 'rtl') { - // Swop L/R Margins so page 1 RTL is an 'even' page - $tmp = $this->DeflMargin; - $this->DeflMargin = $this->DefrMargin; - $this->DefrMargin = $tmp; - $this->orig_lMargin = $this->DeflMargin; - $this->orig_rMargin = $this->DefrMargin; - $this->SetMargins($this->DeflMargin, $this->DefrMargin, $this->tMargin); - } - $this->directionality = 'rtl'; - $this->defaultAlign = 'R'; - $this->defaultTableAlign = 'R'; - } else { - /* -- END OTL -- */ - $this->directionality = 'ltr'; - $this->defaultAlign = 'L'; - $this->defaultTableAlign = 'L'; - } - // *OTL* - $this->cssManager->CSS['BODY']['DIRECTION'] = $this->directionality; - } - // Return either a number (factor) - based on current set fontsize (if % or em) - or exact lineheight (with 'mm' after it) - function fixLineheight($v) - { - $lh = \false; - if (\preg_match('/^[0-9\\.,]*$/', $v) && $v >= 0) { - return $v + 0; - } elseif (\strtoupper($v) == 'NORMAL' || $v == 'N') { - return 'N'; - // mPDF 6 - } else { - $tlh = $this->sizeConverter->convert($v, $this->FontSize, $this->FontSize, \true); - if ($tlh) { - return $tlh . 'mm'; - } - } - return $this->normalLineheight; - } - function _getNormalLineheight($desc = \false) - { - if (!$desc) { - $desc = $this->CurrentFont['desc']; - } - if (!isset($desc['Leading'])) { - $desc['Leading'] = 0; - } - if ($this->useFixedNormalLineHeight) { - $lh = $this->normalLineheight; - } elseif (isset($desc['Ascent']) && $desc['Ascent']) { - $lh = $this->adjustFontDescLineheight * ($desc['Ascent'] - $desc['Descent'] + $desc['Leading']) / 1000; - } else { - $lh = $this->normalLineheight; - } - return $lh; - } - // Set a (fixed) lineheight to an actual value - either to named fontsize(pts) or default - function SetLineHeight($FontPt = '', $lh = '') - { - if (!$FontPt) { - $FontPt = $this->FontSizePt; - } - $fs = $FontPt / Mpdf::SCALE; - $this->lineheight = $this->_computeLineheight($lh, $fs); - } - function _computeLineheight($lh, $fs = '') - { - if ($this->shrin_k > 1) { - $k = $this->shrin_k; - } else { - $k = 1; - } - if (!$fs) { - $fs = $this->FontSize; - } - if ($lh == 'N') { - $lh = $this->_getNormalLineheight(); - } - if (\preg_match('/mm/', $lh)) { - return (float) $lh / $k; - // convert to number - } elseif ($lh > 0) { - return $fs * $lh; - } - return $fs * $this->normalLineheight; - } - function _setLineYpos(&$fontsize, &$fontdesc, &$CSSlineheight, $blockYpos = \false) - { - $ypos['glyphYorigin'] = 0; - $ypos['baseline-shift'] = 0; - $linegap = 0; - $leading = 0; - if (isset($fontdesc['Ascent']) && $fontdesc['Ascent'] && !$this->useFixedTextBaseline) { - // Fontsize uses font metrics - this method seems to produce results compatible with browsers (except IE9) - $ypos['boxtop'] = $fontdesc['Ascent'] / 1000 * $fontsize; - $ypos['boxbottom'] = $fontdesc['Descent'] / 1000 * $fontsize; - if (isset($fontdesc['Leading'])) { - $linegap = $fontdesc['Leading'] / 1000 * $fontsize; - } - } else { - $ypos['boxtop'] = (0.5 + $this->baselineC) * $fontsize; - $ypos['boxbottom'] = -(0.5 - $this->baselineC) * $fontsize; - } - $fontheight = $ypos['boxtop'] - $ypos['boxbottom']; - if ($this->shrin_k > 1) { - $shrin_k = $this->shrin_k; - } else { - $shrin_k = 1; - } - $leading = 0; - if ($CSSlineheight == 'N') { - $lh = $this->_getNormalLineheight($fontdesc); - $lineheight = $fontsize * $lh; - $leading += $linegap; - // specified in hhea or sTypo in OpenType tables - } elseif (\preg_match('/mm/', $CSSlineheight)) { - $lineheight = (float) $CSSlineheight / $shrin_k; - // convert to number - } elseif ($CSSlineheight > 0) { - $lineheight = $fontsize * $CSSlineheight; - } else { - $lineheight = $fontsize * $this->normalLineheight; - } - // In general, calculate the "leading" - the difference between the fontheight and the lineheight - // and add half to the top and half to the bottom. BUT - // If an inline element has a font-size less than the block element, and the line-height is set as an em or % value - // it will add too much leading below the font and expand the height of the line - so just use the block element exttop/extbottom: - if (\preg_match('/mm/', $CSSlineheight) && ($blockYpos && $ypos['boxtop'] < $blockYpos['boxtop']) && ($blockYpos && $ypos['boxbottom'] > $blockYpos['boxbottom'])) { - $ypos['exttop'] = $blockYpos['exttop']; - $ypos['extbottom'] = $blockYpos['extbottom']; - } else { - $leading += $lineheight - $fontheight; - $ypos['exttop'] = $ypos['boxtop'] + $leading / 2; - $ypos['extbottom'] = $ypos['boxbottom'] - $leading / 2; - } - // TEMP ONLY FOR DEBUGGING ********************************* - // $ypos['lineheight'] = $lineheight; - // $ypos['fontheight'] = $fontheight; - // $ypos['leading'] = $leading; - return $ypos; - } - /* Called from WriteFlowingBlock() and finishFlowingBlock() - Determines the line hieght and glyph/writing position - for each element in the line to be written */ - function _setInlineBlockHeights(&$lineBox, &$stackHeight, &$content, &$font, $is_table) - { - if ($this->shrin_k > 1) { - $shrin_k = $this->shrin_k; - } else { - $shrin_k = 1; - } - $ypos = []; - $bordypos = []; - $bgypos = []; - if ($is_table) { - // FOR TABLE - $fontsize = $this->FontSize; - $fontkey = $this->FontFamily . $this->FontStyle; - $fontdesc = $this->fonts[$fontkey]['desc']; - $CSSlineheight = $this->cellLineHeight; - $line_stacking_strategy = $this->cellLineStackingStrategy; - // inline-line-height [default] | block-line-height | max-height | grid-height - $line_stacking_shift = $this->cellLineStackingShift; - // consider-shifts [default] | disregard-shifts - } else { - // FOR BLOCK FONT - $fontsize = $this->blk[$this->blklvl]['InlineProperties']['size']; - $fontkey = $this->blk[$this->blklvl]['InlineProperties']['family'] . $this->blk[$this->blklvl]['InlineProperties']['style']; - $fontdesc = $this->fonts[$fontkey]['desc']; - $CSSlineheight = $this->blk[$this->blklvl]['line_height']; - // inline-line-height | block-line-height | max-height | grid-height - $line_stacking_strategy = isset($this->blk[$this->blklvl]['line_stacking_strategy']) ? $this->blk[$this->blklvl]['line_stacking_strategy'] : 'inline-line-height'; - // consider-shifts | disregard-shifts - $line_stacking_shift = isset($this->blk[$this->blklvl]['line_stacking_shift']) ? $this->blk[$this->blklvl]['line_stacking_shift'] : 'consider-shifts'; - } - $boxLineHeight = $this->_computeLineheight($CSSlineheight, $fontsize); - // First, set a "strut" using block font at index $lineBox[-1] - $ypos[-1] = $this->_setLineYpos($fontsize, $fontdesc, $CSSlineheight); - // for the block element - always taking the block EXTENDED progression including leading - which may be negative - if ($line_stacking_strategy == 'block-line-height') { - $topy = $ypos[-1]['exttop']; - $bottomy = $ypos[-1]['extbottom']; - } else { - $topy = 0; - $bottomy = 0; - } - // Get text-middle for aligning images/objects - $midpoint = $ypos[-1]['boxtop'] - ($ypos[-1]['boxtop'] - $ypos[-1]['boxbottom']) / 2; - // for images / inline objects / replaced elements - $mta = 0; - // Maximum top-aligned - $mba = 0; - // Maximum bottom-aligned - foreach ($content as $k => $chunk) { - if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]['type'] == 'listmarker') { - $ypos[$k] = $ypos[-1]; - // UPDATE Maximums - if ($line_stacking_strategy == 'block-line-height' || $line_stacking_strategy == 'grid-height' || $line_stacking_strategy == 'max-height') { - // don't include extended block progression of all inline elements - if ($ypos[$k]['boxtop'] > $topy) { - $topy = $ypos[$k]['boxtop']; - } - if ($ypos[$k]['boxbottom'] < $bottomy) { - $bottomy = $ypos[$k]['boxbottom']; - } - } else { - if ($ypos[$k]['exttop'] > $topy) { - $topy = $ypos[$k]['exttop']; - } - if ($ypos[$k]['extbottom'] < $bottomy) { - $bottomy = $ypos[$k]['extbottom']; - } - } - } elseif (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]['type'] == 'dottab') { - // mPDF 6 DOTTAB - $fontsize = $font[$k]['size']; - $fontdesc = $font[$k]['curr']['desc']; - $lh = 1; - $ypos[$k] = $this->_setLineYpos($fontsize, $fontdesc, $lh, $ypos[-1]); - // Lineheight=1 fixed - } elseif (isset($this->objectbuffer[$k])) { - $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; - $va = $this->objectbuffer[$k]['vertical-align']; - if ($va == 'BS') { - // (BASELINE default) - if ($oh > $topy) { - $topy = $oh; - } - } elseif ($va == 'M') { - if ($midpoint + $oh / 2 > $topy) { - $topy = $midpoint + $oh / 2; - } - if ($midpoint - $oh / 2 < $bottomy) { - $bottomy = $midpoint - $oh / 2; - } - } elseif ($va == 'TT') { - if ($ypos[-1]['boxtop'] - $oh < $bottomy) { - $bottomy = $ypos[-1]['boxtop'] - $oh; - $topy = \max($topy, $ypos[-1]['boxtop']); - } - } elseif ($va == 'TB') { - if ($ypos[-1]['boxbottom'] + $oh > $topy) { - $topy = $ypos[-1]['boxbottom'] + $oh; - $bottomy = \min($bottomy, $ypos[-1]['boxbottom']); - } - } elseif ($va == 'T') { - if ($oh > $mta) { - $mta = $oh; - } - } elseif ($va == 'B') { - if ($oh > $mba) { - $mba = $oh; - } - } - } elseif ($content[$k] || $content[$k] === '0') { - // FOR FLOWING BLOCK - $fontsize = $font[$k]['size']; - $fontdesc = $font[$k]['curr']['desc']; - // In future could set CSS line-height from inline elements; for now, use block level: - $ypos[$k] = $this->_setLineYpos($fontsize, $fontdesc, $CSSlineheight, $ypos[-1]); - if (isset($font[$k]['textparam']['text-baseline']) && $font[$k]['textparam']['text-baseline'] != 0) { - $ypos[$k]['baseline-shift'] = $font[$k]['textparam']['text-baseline']; - } - // DO ALIGNMENT FOR BASELINES ******************* - // Until most fonts have OpenType BASE tables, this won't work - // $ypos[$k] compared to $ypos[-1] or $ypos[$k-1] using $dominant_baseline and $baseline_table - // UPDATE Maximums - if ($line_stacking_strategy == 'block-line-height' || $line_stacking_strategy == 'grid-height' || $line_stacking_strategy == 'max-height') { - // don't include extended block progression of all inline elements - if ($line_stacking_shift == 'disregard-shifts') { - if ($ypos[$k]['boxtop'] > $topy) { - $topy = $ypos[$k]['boxtop']; - } - if ($ypos[$k]['boxbottom'] < $bottomy) { - $bottomy = $ypos[$k]['boxbottom']; - } - } else { - if ($ypos[$k]['boxtop'] + $ypos[$k]['baseline-shift'] > $topy) { - $topy = $ypos[$k]['boxtop'] + $ypos[$k]['baseline-shift']; - } - if ($ypos[$k]['boxbottom'] + $ypos[$k]['baseline-shift'] < $bottomy) { - $bottomy = $ypos[$k]['boxbottom'] + $ypos[$k]['baseline-shift']; - } - } - } else { - if ($line_stacking_shift == 'disregard-shifts') { - if ($ypos[$k]['exttop'] > $topy) { - $topy = $ypos[$k]['exttop']; - } - if ($ypos[$k]['extbottom'] < $bottomy) { - $bottomy = $ypos[$k]['extbottom']; - } - } else { - if ($ypos[$k]['exttop'] + $ypos[$k]['baseline-shift'] > $topy) { - $topy = $ypos[$k]['exttop'] + $ypos[$k]['baseline-shift']; - } - if ($ypos[$k]['extbottom'] + $ypos[$k]['baseline-shift'] < $bottomy) { - $bottomy = $ypos[$k]['extbottom'] + $ypos[$k]['baseline-shift']; - } - } - } - // If BORDER set on inline element - if (isset($font[$k]['bord']) && $font[$k]['bord']) { - $bordfontsize = $font[$k]['textparam']['bord-decoration']['fontsize'] / $shrin_k; - $bordfontkey = $font[$k]['textparam']['bord-decoration']['fontkey']; - if ($bordfontkey != $fontkey || $bordfontsize != $fontsize || isset($font[$k]['textparam']['bord-decoration']['baseline'])) { - $bordfontdesc = $this->fonts[$bordfontkey]['desc']; - $bordypos[$k] = $this->_setLineYpos($bordfontsize, $bordfontdesc, $CSSlineheight, $ypos[-1]); - if (isset($font[$k]['textparam']['bord-decoration']['baseline']) && $font[$k]['textparam']['bord-decoration']['baseline'] != 0) { - $bordypos[$k]['baseline-shift'] = $font[$k]['textparam']['bord-decoration']['baseline'] / $shrin_k; - } - } - } - // If BACKGROUND set on inline element - if (isset($font[$k]['spanbgcolor']) && $font[$k]['spanbgcolor']) { - $bgfontsize = $font[$k]['textparam']['bg-decoration']['fontsize'] / $shrin_k; - $bgfontkey = $font[$k]['textparam']['bg-decoration']['fontkey']; - if ($bgfontkey != $fontkey || $bgfontsize != $fontsize || isset($font[$k]['textparam']['bg-decoration']['baseline'])) { - $bgfontdesc = $this->fonts[$bgfontkey]['desc']; - $bgypos[$k] = $this->_setLineYpos($bgfontsize, $bgfontdesc, $CSSlineheight, $ypos[-1]); - if (isset($font[$k]['textparam']['bg-decoration']['baseline']) && $font[$k]['textparam']['bg-decoration']['baseline'] != 0) { - $bgypos[$k]['baseline-shift'] = $font[$k]['textparam']['bg-decoration']['baseline'] / $shrin_k; - } - } - } - } - } - // TOP or BOTTOM aligned images - if ($mta > $topy - $bottomy) { - if ($topy - $mta < $bottomy) { - $bottomy = $topy - $mta; - } - } - if ($mba > $topy - $bottomy) { - if ($bottomy + $mba > $topy) { - $topy = $bottomy + $mba; - } - } - if ($line_stacking_strategy == 'block-line-height') { - // fixed height set by block element (whether present or not) - $topy = $ypos[-1]['exttop']; - $bottomy = $ypos[-1]['extbottom']; - } - $inclusiveHeight = $topy - $bottomy; - // SET $stackHeight taking note of line_stacking_strategy - // NB inclusive height already takes account of need to consider block progression height (excludes leading set by lineheight) - // or extended block progression height (includes leading set by lineheight) - if ($line_stacking_strategy == 'block-line-height') { - // fixed = extended block progression height of block element - $stackHeight = $boxLineHeight; - } elseif ($line_stacking_strategy == 'max-height') { - // smallest height which includes extended block progression height of block element - // and block progression heights of inline elements (NOT extended) - $stackHeight = $inclusiveHeight; - } elseif ($line_stacking_strategy == 'grid-height') { - // smallest multiple of block element lineheight to include - // block progression heights of inline elements (NOT extended) - $stackHeight = $boxLineHeight; - while ($stackHeight < $inclusiveHeight) { - $stackHeight += $boxLineHeight; - } - } else { - // 'inline-line-height' = default // smallest height which includes extended block progression height of block element - // AND extended block progression heights of inline elements - $stackHeight = $inclusiveHeight; - } - $diff = $stackHeight - $inclusiveHeight; - $topy += $diff / 2; - $bottomy -= $diff / 2; - // ADJUST $ypos => lineBox using $stackHeight; lineBox are all offsets from the top of stackHeight in mm - // and SET IMAGE OFFSETS - $lineBox[-1]['boxtop'] = $topy - $ypos[-1]['boxtop']; - $lineBox[-1]['boxbottom'] = $topy - $ypos[-1]['boxbottom']; - // $lineBox[-1]['exttop'] = $topy - $ypos[-1]['exttop']; - // $lineBox[-1]['extbottom'] = $topy - $ypos[-1]['extbottom']; - $lineBox[-1]['glyphYorigin'] = $topy - $ypos[-1]['glyphYorigin']; - $lineBox[-1]['baseline-shift'] = $ypos[-1]['baseline-shift']; - $midpoint = $lineBox[-1]['boxbottom'] - ($lineBox[-1]['boxbottom'] - $lineBox[-1]['boxtop']) / 2; - foreach ($content as $k => $chunk) { - if (isset($this->objectbuffer[$k])) { - $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; - // LIST MARKERS - if ($this->objectbuffer[$k]['type'] == 'listmarker') { - $oh = $fontsize; - } elseif ($this->objectbuffer[$k]['type'] == 'dottab') { - // mPDF 6 DOTTAB - $oh = $font[$k]['size']; - // == $this->objectbuffer[$k]['fontsize']/Mpdf::SCALE; - $lineBox[$k]['boxtop'] = $topy - $ypos[$k]['boxtop']; - $lineBox[$k]['boxbottom'] = $topy - $ypos[$k]['boxbottom']; - $lineBox[$k]['glyphYorigin'] = $topy - $ypos[$k]['glyphYorigin']; - $lineBox[$k]['baseline-shift'] = 0; - // continue; - } - $va = $this->objectbuffer[$k]['vertical-align']; - // = $objattr['vertical-align'] = set as M,T,B,S - if ($va == 'BS') { - // (BASELINE default) - $lineBox[$k]['top'] = $lineBox[-1]['glyphYorigin'] - $oh; - } elseif ($va == 'M') { - $lineBox[$k]['top'] = $midpoint - $oh / 2; - } elseif ($va == 'TT') { - $lineBox[$k]['top'] = $lineBox[-1]['boxtop']; - } elseif ($va == 'TB') { - $lineBox[$k]['top'] = $lineBox[-1]['boxbottom'] - $oh; - } elseif ($va == 'T') { - $lineBox[$k]['top'] = 0; - } elseif ($va == 'B') { - $lineBox[$k]['top'] = $stackHeight - $oh; - } - } elseif ($content[$k] || $content[$k] === '0') { - $lineBox[$k]['boxtop'] = $topy - $ypos[$k]['boxtop']; - $lineBox[$k]['boxbottom'] = $topy - $ypos[$k]['boxbottom']; - // $lineBox[$k]['exttop'] = $topy - $ypos[$k]['exttop']; - // $lineBox[$k]['extbottom'] = $topy - $ypos[$k]['extbottom']; - $lineBox[$k]['glyphYorigin'] = $topy - $ypos[$k]['glyphYorigin']; - $lineBox[$k]['baseline-shift'] = $ypos[$k]['baseline-shift']; - if (isset($bordypos[$k]['boxtop'])) { - $lineBox[$k]['border-boxtop'] = $topy - $bordypos[$k]['boxtop']; - $lineBox[$k]['border-boxbottom'] = $topy - $bordypos[$k]['boxbottom']; - $lineBox[$k]['border-baseline-shift'] = $bordypos[$k]['baseline-shift']; - } - if (isset($bgypos[$k]['boxtop'])) { - $lineBox[$k]['background-boxtop'] = $topy - $bgypos[$k]['boxtop']; - $lineBox[$k]['background-boxbottom'] = $topy - $bgypos[$k]['boxbottom']; - $lineBox[$k]['background-baseline-shift'] = $bgypos[$k]['baseline-shift']; - } - } - } - } - function SetBasePath($str = '') - { - if (isset($_SERVER['HTTP_HOST'])) { - $host = $_SERVER['HTTP_HOST']; - } elseif (isset($_SERVER['SERVER_NAME'])) { - $host = $_SERVER['SERVER_NAME']; - } else { - $host = ''; - } - if (!$str) { - if (isset($_SERVER['SCRIPT_NAME'])) { - $currentPath = \dirname($_SERVER['SCRIPT_NAME']); - } else { - $currentPath = \dirname($_SERVER['PHP_SELF']); - } - $currentPath = \str_replace("\\", "/", $currentPath); - if ($currentPath == '/') { - $currentPath = ''; - } - if ($host) { - // mPDF 6 - if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && $_SERVER['HTTPS'] !== 'off') { - $currpath = 'https://' . $host . $currentPath . '/'; - } else { - $currpath = 'http://' . $host . $currentPath . '/'; - } - } else { - $currpath = ''; - } - $this->basepath = $currpath; - $this->basepathIsLocal = \true; - return; - } - $str = \preg_replace('/\\?.*/', '', $str); - if (!\preg_match('/(http|https|ftp):\\/\\/.*\\//i', $str)) { - $str .= '/'; - } - $str .= 'xxx'; - // in case $str ends in / e.g. http://www.bbc.co.uk/ - $this->basepath = \dirname($str) . "/"; - // returns e.g. e.g. http://www.google.com/dir1/dir2/dir3/ - $this->basepath = \str_replace("\\", "/", $this->basepath); - // If on Windows - $tr = \parse_url($this->basepath); - $this->basepathIsLocal = isset($tr['host']) && $tr['host'] == $host; - } - public function GetFullPath(&$path, $basepath = '') - { - // @todo make return, remove reference - // When parsing CSS need to pass temporary basepath - so links are relative to current stylesheet - if (!$basepath) { - $basepath = $this->basepath; - } - // Fix path value - $path = \str_replace("\\", '/', $path); - // If on Windows - // mPDF 5.7.2 - if (\strpos($path, '//') === 0) { - $scheme = \parse_url($basepath, \PHP_URL_SCHEME); - $scheme = $scheme ?: 'http'; - $path = $scheme . ':' . $path; - } - $path = \preg_replace('|^./|', '', $path); - // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" - if (\strpos($path, '#') === 0) { - return; - } - // Skip schemes not supported by installed stream wrappers - $wrappers = \stream_get_wrappers(); - $pattern = \sprintf('@^(?!%s)[a-z0-9\\.\\-+]+:.*@i', \implode('|', $wrappers)); - if (\preg_match($pattern, $path)) { - return; - } - if (\strpos($path, '../') === 0) { - // It is a relative link - $backtrackamount = \substr_count($path, '../'); - $maxbacktrack = \substr_count($basepath, '/') - 3; - $filepath = \str_replace('../', '', $path); - $path = $basepath; - // If it is an invalid relative link, then make it go to directory root - if ($backtrackamount > $maxbacktrack) { - $backtrackamount = $maxbacktrack; - } - // Backtrack some directories - for ($i = 0; $i < $backtrackamount + 1; $i++) { - $path = \substr($path, 0, \strrpos($path, "/")); - } - $path .= '/' . $filepath; - // Make it an absolute path - return; - } - if ((\strpos($path, ":/") === \false || \strpos($path, ":/") > 10) && !@\is_file($path)) { - // It is a local link. Ignore potential file errors - if (\strpos($path, '/') === 0) { - $tr = \parse_url($basepath); - // mPDF 5.7.2 - $root = ''; - if (!empty($tr['scheme'])) { - $root .= $tr['scheme'] . '://'; - } - $root .= isset($tr['host']) ? $tr['host'] : ''; - $root .= isset($tr['port']) && $tr['port'] ? ':' . $tr['port'] : ''; - // mPDF 5.7.3 - $path = $root . $path; - return; - } - $path = $basepath . $path; - } - // Do nothing if it is an Absolute Link - } - function docPageNum($num = 0, $extras = \false) - { - if ($num < 1) { - $num = $this->page; - } - $type = $this->defaultPageNumStyle; - // set default Page Number Style - $ppgno = $num; - $suppress = 0; - $offset = 0; - $lastreset = 0; - foreach ($this->PageNumSubstitutions as $psarr) { - if ($num >= $psarr['from']) { - if ($psarr['reset']) { - if ($psarr['reset'] > 1) { - $offset = $psarr['reset'] - 1; - } - $ppgno = $num - $psarr['from'] + 1 + $offset; - $lastreset = $psarr['from']; - } - if ($psarr['type']) { - $type = $psarr['type']; - } - if (\strtoupper($psarr['suppress']) == 'ON' || $psarr['suppress'] == 1) { - $suppress = 1; - } elseif (\strtoupper($psarr['suppress']) == 'OFF') { - $suppress = 0; - } - } - } - if ($suppress) { - return ''; - } - $ppgno = $this->_getStyledNumber($ppgno, $type); - if ($extras) { - $ppgno = $this->pagenumPrefix . $ppgno . $this->pagenumSuffix; - } - return $ppgno; - } - function docPageNumTotal($num = 0, $extras = \false) - { - if ($num < 1) { - $num = $this->page; - } - $type = $this->defaultPageNumStyle; - // set default Page Number Style - $ppgstart = 1; - $ppgend = \count($this->pages) + 1; - $suppress = 0; - $offset = 0; - foreach ($this->PageNumSubstitutions as $psarr) { - if ($num >= $psarr['from']) { - if ($psarr['reset']) { - if ($psarr['reset'] > 1) { - $offset = $psarr['reset'] - 1; - } - $ppgstart = $psarr['from'] + $offset; - $ppgend = \count($this->pages) + 1 + $offset; - } - if ($psarr['type']) { - $type = $psarr['type']; - } - if (\strtoupper($psarr['suppress']) == 'ON' || $psarr['suppress'] == 1) { - $suppress = 1; - } elseif (\strtoupper($psarr['suppress']) == 'OFF') { - $suppress = 0; - } - } - if ($num < $psarr['from']) { - if ($psarr['reset']) { - $ppgend = $psarr['from'] + $offset; - break; - } - } - } - if ($suppress) { - return ''; - } - $ppgno = $ppgend - $ppgstart + $offset; - $ppgno = $this->_getStyledNumber($ppgno, $type); - if ($extras) { - $ppgno = $this->pagenumPrefix . $ppgno . $this->pagenumSuffix; - } - return $ppgno; - } - // mPDF 6 - function _getStyledNumber($ppgno, $type, $listmarker = \false) - { - if ($listmarker) { - $reverse = \true; - // Reverse RTL numerals (Hebrew) when using for list - $checkfont = \true; - // Using list - font is set, so check if character is available - } else { - $reverse = \false; - // For pagenumbers, RTL numerals (Hebrew) will get reversed later by bidi - $checkfont = \false; - // For pagenumbers - font is not set, so no check - } - $decToAlpha = new Conversion\DecToAlpha(); - $decToCjk = new Conversion\DecToCjk(); - $decToHebrew = new Conversion\DecToHebrew(); - $decToRoman = new Conversion\DecToRoman(); - $decToOther = new Conversion\DecToOther($this); - $lowertype = \strtolower($type); - if ($lowertype == 'upper-latin' || $lowertype == 'upper-alpha' || $type == 'A') { - $ppgno = $decToAlpha->convert($ppgno, \true); - } elseif ($lowertype == 'lower-latin' || $lowertype == 'lower-alpha' || $type == 'a') { - $ppgno = $decToAlpha->convert($ppgno, \false); - } elseif ($lowertype == 'upper-roman' || $type == 'I') { - $ppgno = $decToRoman->convert($ppgno, \true); - } elseif ($lowertype == 'lower-roman' || $type == 'i') { - $ppgno = $decToRoman->convert($ppgno, \false); - } elseif ($lowertype == 'hebrew') { - $ppgno = $decToHebrew->convert($ppgno, $reverse); - } elseif (\preg_match('/(arabic-indic|bengali|devanagari|gujarati|gurmukhi|kannada|malayalam|oriya|persian|tamil|telugu|thai|urdu|cambodian|khmer|lao|myanmar)/i', $lowertype, $m)) { - $cp = $decToOther->getCodePage($m[1]); - $ppgno = $decToOther->convert($ppgno, $cp, $checkfont); - } elseif ($lowertype == 'cjk-decimal') { - $ppgno = $decToCjk->convert($ppgno); - } - return $ppgno; - } - function docPageSettings($num = 0) - { - // Returns current type (numberstyle), suppression state for this page number; - // reset is only returned if set for this page number - if ($num < 1) { - $num = $this->page; - } - $type = $this->defaultPageNumStyle; - // set default Page Number Style - $ppgno = $num; - $suppress = 0; - $offset = 0; - $reset = ''; - foreach ($this->PageNumSubstitutions as $psarr) { - if ($num >= $psarr['from']) { - if ($psarr['reset']) { - if ($psarr['reset'] > 1) { - $offset = $psarr['reset'] - 1; - } - $ppgno = $num - $psarr['from'] + 1 + $offset; - } - if ($psarr['type']) { - $type = $psarr['type']; - } - if (\strtoupper($psarr['suppress']) == 'ON' || $psarr['suppress'] == 1) { - $suppress = 1; - } elseif (\strtoupper($psarr['suppress']) == 'OFF') { - $suppress = 0; - } - } - if ($num == $psarr['from']) { - $reset = $psarr['reset']; - } - } - if ($suppress) { - $suppress = 'on'; - } else { - $suppress = 'off'; - } - return [$type, $suppress, $reset]; - } - function RestartDocTemplate() - { - $this->docTemplateStart = $this->page; - } - // Page header - function Header($content = '') - { - $this->cMarginL = 0; - $this->cMarginR = 0; - if ($this->mirrorMargins && $this->page % 2 == 0 && $this->HTMLHeaderE || $this->mirrorMargins && $this->page % 2 == 1 && $this->HTMLHeader || !$this->mirrorMargins && $this->HTMLHeader) { - $this->writeHTMLHeaders(); - return; - } - } - /* -- TABLES -- */ - function TableHeaderFooter($content = '', $tablestartpage = '', $tablestartcolumn = '', $horf = 'H', $level = 0, $firstSpread = \true, $finalSpread = \true) - { - if (($horf == 'H' || $horf == 'F') && !empty($content)) { - // mPDF 5.7.2 - $table =& $this->table[1][1]; - // mPDF 5.7.2 - if ($horf == 'F') { - // Table Footer - $firstrow = \count($table['cells']) - $table['footernrows']; - $lastrow = \count($table['cells']) - 1; - } else { - // Table Header - $firstrow = 0; - $lastrow = $table['headernrows'] - 1; - } - if (empty($content[$firstrow])) { - if ($this->debug) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(" must precede in a table"); - } else { - return; - } - } - // Advance down page by half width of top border - if ($horf == 'H') { - // Only if header - if ($table['borders_separate']) { - $adv = $table['border_spacing_V'] / 2 + $table['border_details']['T']['w'] + $table['padding']['T']; - } else { - $adv = $table['max_cell_border_width']['T'] / 2; - } - if ($adv) { - if ($this->table_rotate) { - $this->y += $adv; - } else { - $this->DivLn($adv, $this->blklvl, \true); - } - } - } - $topy = $content[$firstrow][0]['y'] - $this->y; - for ($i = $firstrow; $i <= $lastrow; $i++) { - $y = $this->y; - /* -- COLUMNS -- */ - // If outside columns, this is done in PaintDivBB - if ($this->ColActive) { - // OUTER FILL BGCOLOR of DIVS - if ($this->blklvl > 0) { - $firstblockfill = $this->GetFirstBlockFill(); - if ($firstblockfill && $this->blklvl >= $firstblockfill) { - $divh = $content[$i][0]['h']; - $bak_x = $this->x; - $this->DivLn($divh, -3, \false); - // Reset current block fill - $bcor = $this->blk[$this->blklvl]['bgcolorarray']; - $this->SetFColor($bcor); - $this->x = $bak_x; - } - } - } - /* -- END COLUMNS -- */ - $colctr = 0; - foreach ($content[$i] as $tablehf) { - $colctr++; - $y = Arrays::get($tablehf, 'y', null) - $topy; - $this->y = $y; - // Set some cell values - $x = Arrays::get($tablehf, 'x', null); - if ($this->mirrorMargins && $tablestartpage == 'ODD' && $this->page % 2 == 0) { - // EVEN - $x = $x + $this->MarginCorrection; - } elseif ($this->mirrorMargins && $tablestartpage == 'EVEN' && $this->page % 2 == 1) { - // ODD - $x = $x + $this->MarginCorrection; - } - /* -- COLUMNS -- */ - // Added to correct for Columns - if ($this->ColActive) { - if ($this->directionality == 'rtl') { - // *OTL* - $x -= ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth + $this->ColGap); - // *OTL* - } else { - // *OTL* - $x += ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth + $this->ColGap); - } - // *OTL* - } - /* -- END COLUMNS -- */ - if ($colctr == 1) { - $x0 = $x; - } - // mPDF ITERATION - if ($this->iterationCounter) { - foreach ($tablehf['textbuffer'] as $k => $t) { - if (!\is_array($t[0]) && \preg_match('/{iteration ([a-zA-Z0-9_]+)}/', $t[0], $m)) { - $vname = '__' . $m[1] . '_'; - if (!isset($this->{$vname})) { - $this->{$vname} = 1; - } else { - $this->{$vname}++; - } - $tablehf['textbuffer'][$k][0] = \preg_replace('/{iteration ' . $m[1] . '}/', $this->{$vname}, $tablehf['textbuffer'][$k][0]); - } - } - } - $w = Arrays::get($tablehf, 'w', null); - $h = Arrays::get($tablehf, 'h', null); - $va = Arrays::get($tablehf, 'va', null); - $R = Arrays::get($tablehf, 'R', null); - $direction = Arrays::get($tablehf, 'direction', null); - $mih = Arrays::get($tablehf, 'mih', null); - $border = Arrays::get($tablehf, 'border', null); - $border_details = Arrays::get($tablehf, 'border_details', null); - $padding = Arrays::get($tablehf, 'padding', null); - $this->tabletheadjustfinished = \true; - $textbuffer = Arrays::get($tablehf, 'textbuffer', null); - // Align - $align = Arrays::get($tablehf, 'a', null); - $this->cellTextAlign = $align; - $this->cellLineHeight = Arrays::get($tablehf, 'cellLineHeight', null); - $this->cellLineStackingStrategy = Arrays::get($tablehf, 'cellLineStackingStrategy', null); - $this->cellLineStackingShift = Arrays::get($tablehf, 'cellLineStackingShift', null); - $this->x = $x; - if ($this->ColActive) { - if ($table['borders_separate']) { - $tablefill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; - if ($tablefill) { - $color = $this->colorConverter->convert($tablefill, $this->PDFAXwarnings); - if ($color) { - $xadj = $table['border_spacing_H'] / 2; - $yadj = $table['border_spacing_V'] / 2; - $wadj = $table['border_spacing_H']; - $hadj = $table['border_spacing_V']; - if ($i == $firstrow && $horf == 'H') { - // Top - $yadj += $table['padding']['T'] + $table['border_details']['T']['w']; - $hadj += $table['padding']['T'] + $table['border_details']['T']['w']; - } - if (($i == $lastrow || isset($tablehf['rowspan']) && $i + $tablehf['rowspan'] == $lastrow + 1 || !isset($tablehf['rowspan']) && $i + 1 == $lastrow + 1) && $horf == 'F') { - // Bottom - $hadj += $table['padding']['B'] + $table['border_details']['B']['w']; - } - if ($colctr == 1) { - // Left - $xadj += $table['padding']['L'] + $table['border_details']['L']['w']; - $wadj += $table['padding']['L'] + $table['border_details']['L']['w']; - } - if ($colctr == \count($content[$i])) { - // Right - $wadj += $table['padding']['R'] + $table['border_details']['R']['w']; - } - $this->SetFColor($color); - $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); - } - } - } - } - if ($table['empty_cells'] != 'hide' || !empty($textbuffer) || !$table['borders_separate']) { - $paintcell = \true; - } else { - $paintcell = \false; - } - // Vertical align - if ($R && \intval($R) > 0 && isset($va) && $va != 'B') { - $va = 'B'; - } - if (!isset($va) || empty($va) || $va == 'M') { - $this->y += ($h - $mih) / 2; - } elseif (isset($va) && $va == 'B') { - $this->y += $h - $mih; - } - // TABLE ROW OR CELL FILL BGCOLOR - $fill = 0; - if (isset($tablehf['bgcolor']) && $tablehf['bgcolor'] && $tablehf['bgcolor'] != 'transparent') { - $fill = $tablehf['bgcolor']; - $leveladj = 6; - } elseif (isset($content[$i][0]['trbgcolor']) && $content[$i][0]['trbgcolor'] && $content[$i][0]['trbgcolor'] != 'transparent') { - // Row color - $fill = $content[$i][0]['trbgcolor']; - $leveladj = 3; - } - if ($fill && $paintcell) { - $color = $this->colorConverter->convert($fill, $this->PDFAXwarnings); - if ($color) { - if ($table['borders_separate']) { - if ($this->ColActive) { - $this->SetFColor($color); - $this->Rect($x + $table['border_spacing_H'] / 2, $y + $table['border_spacing_V'] / 2, $w - $table['border_spacing_H'], $h - $table['border_spacing_V'], 'F'); - } else { - $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => \false, 'x' => $x + $table['border_spacing_H'] / 2, 'y' => $y + $table['border_spacing_V'] / 2, 'w' => $w - $table['border_spacing_H'], 'h' => $h - $table['border_spacing_V'], 'col' => $color]; - } - } else { - if ($this->ColActive) { - $this->SetFColor($color); - $this->Rect($x, $y, $w, $h, 'F'); - } else { - $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => \false, 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'col' => $color]; - } - } - } - } - /* -- BACKGROUNDS -- */ - if (isset($tablehf['gradient']) && $tablehf['gradient'] && $paintcell) { - $g = $this->gradient->parseBackgroundGradient($tablehf['gradient']); - if ($g) { - if ($table['borders_separate']) { - $px = $x + $table['border_spacing_H'] / 2; - $py = $y + $table['border_spacing_V'] / 2; - $pw = $w - $table['border_spacing_H']; - $ph = $h - $table['border_spacing_V']; - } else { - $px = $x; - $py = $y; - $pw = $w; - $ph = $h; - } - if ($this->ColActive) { - $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); - } else { - $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => \true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } - if (isset($tablehf['background-image']) && $paintcell) { - if ($tablehf['background-image']['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $tablehf['background-image']['gradient'])) { - $g = $this->gradient->parseMozGradient($tablehf['background-image']['gradient']); - if ($g) { - if ($table['borders_separate']) { - $px = $x + $table['border_spacing_H'] / 2; - $py = $y + $table['border_spacing_V'] / 2; - $pw = $w - $table['border_spacing_H']; - $ph = $h - $table['border_spacing_V']; - } else { - $px = $x; - $py = $y; - $pw = $w; - $ph = $h; - } - if ($this->ColActive) { - $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); - } else { - $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => \true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } elseif ($tablehf['background-image']['image_id']) { - // Background pattern - $n = \count($this->patterns) + 1; - if ($table['borders_separate']) { - $px = $x + $table['border_spacing_H'] / 2; - $py = $y + $table['border_spacing_V'] / 2; - $pw = $w - $table['border_spacing_H']; - $ph = $h - $table['border_spacing_V']; - } else { - $px = $x; - $py = $y; - $pw = $w; - $ph = $h; - } - if ($this->ColActive) { - list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($tablehf['background-image']['orig_w'], $tablehf['background-image']['orig_h'], $pw, $ph, $tablehf['background-image']['resize'], $tablehf['background-image']['x_repeat'], $tablehf['background-image']['y_repeat']); - $this->patterns[$n] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'pgh' => $this->h, 'image_id' => $tablehf['background-image']['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $tablehf['background-image']['x_pos'], 'y_pos' => $tablehf['background-image']['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'itype' => $tablehf['background-image']['itype']]; - if ($tablehf['background-image']['opacity'] > 0 && $tablehf['background-image']['opacity'] < 1) { - $opac = $this->SetAlpha($tablehf['background-image']['opacity'], 'Normal', \true); - } else { - $opac = ''; - } - $this->writer->write(\sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px * Mpdf::SCALE, ($this->h - $py) * Mpdf::SCALE, $pw * Mpdf::SCALE, -$ph * Mpdf::SCALE)); - } else { - $this->tableBackgrounds[$level * 9 + 8][] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'image_id' => $tablehf['background-image']['image_id'], 'orig_w' => $tablehf['background-image']['orig_w'], 'orig_h' => $tablehf['background-image']['orig_h'], 'x_pos' => $tablehf['background-image']['x_pos'], 'y_pos' => $tablehf['background-image']['y_pos'], 'x_repeat' => $tablehf['background-image']['x_repeat'], 'y_repeat' => $tablehf['background-image']['y_repeat'], 'clippath' => '', 'resize' => $tablehf['background-image']['resize'], 'opacity' => $tablehf['background-image']['opacity'], 'itype' => $tablehf['background-image']['itype']]; - } - } - } - /* -- END BACKGROUNDS -- */ - // Cell Border - if ($table['borders_separate'] && $paintcell && $border) { - $this->_tableRect($x + $table['border_spacing_H'] / 2 + $border_details['L']['w'] / 2, $y + $table['border_spacing_V'] / 2 + $border_details['T']['w'] / 2, $w - $table['border_spacing_H'] - $border_details['L']['w'] / 2 - $border_details['R']['w'] / 2, $h - $table['border_spacing_V'] - $border_details['T']['w'] / 2 - $border_details['B']['w'] / 2, $border, $border_details, \false, $table['borders_separate']); - } elseif ($paintcell && $border) { - $this->_tableRect($x, $y, $w, $h, $border, $border_details, \true, $table['borders_separate']); - // true causes buffer - } - // Print cell content - if (!empty($textbuffer)) { - if ($horf == 'F' && \preg_match('/{colsum([0-9]*)[_]*}/', $textbuffer[0][0], $m)) { - $rep = \sprintf("%01." . \intval($m[1]) . "f", $this->colsums[$colctr - 1]); - $textbuffer[0][0] = \preg_replace('/{colsum[0-9_]*}/', $rep, $textbuffer[0][0]); - } - if ($R) { - $cellPtSize = $textbuffer[0][11] / $this->shrin_k; - if (!$cellPtSize) { - $cellPtSize = $this->default_font_size; - } - $cellFontHeight = $cellPtSize / Mpdf::SCALE; - $opx = $this->x; - $opy = $this->y; - $angle = \intval($R); - // Only allow 45 - 90 degrees (when bottom-aligned) or -90 - if ($angle > 90) { - $angle = 90; - } elseif ($angle > 0 && (isset($va) && $va != 'B')) { - $angle = 90; - } elseif ($angle > 0 && $angle < 45) { - $angle = 45; - } elseif ($angle < 0) { - $angle = -90; - } - $offset = \sin(\deg2rad($angle)) * 0.37 * $cellFontHeight; - if (isset($align) && $align == 'R') { - $this->x += $w + $offset - $cellFontHeight / 3 - ($padding['R'] + $border_details['R']['w']); - } elseif (!isset($align) || $align == 'C') { - $this->x += $w / 2 + $offset; - } else { - $this->x += $offset + $cellFontHeight / 3 + ($padding['L'] + $border_details['L']['w']); - } - $str = ''; - foreach ($tablehf['textbuffer'] as $t) { - $str .= $t[0] . ' '; - } - $str = \rtrim($str); - if (!isset($va) || $va == 'M') { - $this->y -= ($h - $mih) / 2; - // Undo what was added earlier VERTICAL ALIGN - if ($angle > 0) { - $this->y += ($h - $mih) / 2 + ($padding['T'] + $border_details['T']['w']) + ($mih - ($padding['T'] + $border_details['T']['w'] + $border_details['B']['w'] + $padding['B'])); - } elseif ($angle < 0) { - $this->y += ($h - $mih) / 2 + ($padding['T'] + $border_details['T']['w']); - } - } elseif (isset($va) && $va == 'B') { - $this->y -= $h - $mih; - // Undo what was added earlier VERTICAL ALIGN - if ($angle > 0) { - $this->y += $h - ($border_details['B']['w'] + $padding['B']); - } elseif ($angle < 0) { - $this->y += $h - $mih + ($padding['T'] + $border_details['T']['w']); - } - } elseif (isset($va) && $va == 'T') { - if ($angle > 0) { - $this->y += $mih - ($border_details['B']['w'] + $padding['B']); - } elseif ($angle < 0) { - $this->y += $padding['T'] + $border_details['T']['w']; - } - } - $this->Rotate($angle, $this->x, $this->y); - $s_fs = $this->FontSizePt; - $s_f = $this->FontFamily; - $s_st = $this->FontStyle; - if (!empty($textbuffer[0][3])) { - // Font Color - $cor = $textbuffer[0][3]; - $this->SetTColor($cor); - } - $this->SetFont($textbuffer[0][4], $textbuffer[0][2], $cellPtSize, \true, \true); - $this->magic_reverse_dir($str, $this->directionality, $textbuffer[0][18]); - $this->Text($this->x, $this->y, $str, $textbuffer[0][18], $textbuffer[0][8]); - // textvar - $this->Rotate(0); - $this->SetFont($s_f, $s_st, $s_fs, \true, \true); - $this->SetTColor(0); - $this->x = $opx; - $this->y = $opy; - } else { - if ($table['borders_separate']) { - // NB twice border width - $xadj = $border_details['L']['w'] + $padding['L'] + $table['border_spacing_H'] / 2; - $wadj = $border_details['L']['w'] + $border_details['R']['w'] + $padding['L'] + $padding['R'] + $table['border_spacing_H']; - $yadj = $border_details['T']['w'] + $padding['T'] + $table['border_spacing_H'] / 2; - } else { - $xadj = $border_details['L']['w'] / 2 + $padding['L']; - $wadj = ($border_details['L']['w'] + $border_details['R']['w']) / 2 + $padding['L'] + $padding['R']; - $yadj = $border_details['T']['w'] / 2 + $padding['T']; - } - $this->divwidth = $w - $wadj; - $this->x += $xadj; - $this->y += $yadj; - $this->printbuffer($textbuffer, '', \true, \false, $direction); - } - } - $textbuffer = []; - /* -- BACKGROUNDS -- */ - if (!$this->ColActive) { - if (isset($content[$i][0]['trgradients']) && ($colctr == 1 || $table['borders_separate'])) { - $g = $this->gradient->parseBackgroundGradient($content[$i][0]['trgradients']); - if ($g) { - $gx = $x0; - $gy = $y; - $gh = $h; - $gw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - if ($table['borders_separate']) { - $gw -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']; - $clx = $x + $table['border_spacing_H'] / 2; - $cly = $y + $table['border_spacing_V'] / 2; - $clw = $w - $table['border_spacing_H']; - $clh = $h - $table['border_spacing_V']; - // Set clipping path - $s = $this->_setClippingPath($clx, $cly, $clw, $clh); - // mPDF 6 - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx + $table['border_spacing_H'] / 2, 'y' => $gy + $table['border_spacing_V'] / 2, 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; - } else { - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } - if (isset($content[$i][0]['trbackground-images']) && ($colctr == 1 || $table['borders_separate'])) { - if ($content[$i][0]['trbackground-images']['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $content[$i][0]['trbackground-images']['gradient'])) { - $g = $this->gradient->parseMozGradient($content[$i][0]['trbackground-images']['gradient']); - if ($g) { - $gx = $x0; - $gy = $y; - $gh = $h; - $gw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - if ($table['borders_separate']) { - $gw -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']; - $clx = $x + $table['border_spacing_H'] / 2; - $cly = $y + $table['border_spacing_V'] / 2; - $clw = $w - $table['border_spacing_H']; - $clh = $h - $table['border_spacing_V']; - // Set clipping path - $s = $this->_setClippingPath($clx, $cly, $clw, $clh); - // mPDF 6 - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx + $table['border_spacing_H'] / 2, 'y' => $gy + $table['border_spacing_V'] / 2, 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; - } else { - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } else { - $image_id = $content[$i][0]['trbackground-images']['image_id']; - $orig_w = $content[$i][0]['trbackground-images']['orig_w']; - $orig_h = $content[$i][0]['trbackground-images']['orig_h']; - $x_pos = $content[$i][0]['trbackground-images']['x_pos']; - $y_pos = $content[$i][0]['trbackground-images']['y_pos']; - $x_repeat = $content[$i][0]['trbackground-images']['x_repeat']; - $y_repeat = $content[$i][0]['trbackground-images']['y_repeat']; - $resize = $content[$i][0]['trbackground-images']['resize']; - $opacity = $content[$i][0]['trbackground-images']['opacity']; - $itype = $content[$i][0]['trbackground-images']['itype']; - $clippath = ''; - $gx = $x0; - $gy = $y; - $gh = $h; - $gw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - if ($table['borders_separate']) { - $gw -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']; - $clx = $x + $table['border_spacing_H'] / 2; - $cly = $y + $table['border_spacing_V'] / 2; - $clw = $w - $table['border_spacing_H']; - $clh = $h - $table['border_spacing_V']; - // Set clipping path - $s = $this->_setClippingPath($clx, $cly, $clw, $clh); - // mPDF 6 - $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx + $table['border_spacing_H'] / 2, 'y' => $gy + $table['border_spacing_V'] / 2, 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => $s, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } else { - $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } - } - } - } - /* -- END BACKGROUNDS -- */ - // TABLE BORDER - if separate OR collapsed and only table border - if (($table['borders_separate'] || $this->simpleTables && !$table['simple']['border']) && $table['border']) { - $halfspaceL = $table['padding']['L'] + $table['border_spacing_H'] / 2; - $halfspaceR = $table['padding']['R'] + $table['border_spacing_H'] / 2; - $halfspaceT = $table['padding']['T'] + $table['border_spacing_V'] / 2; - $halfspaceB = $table['padding']['B'] + $table['border_spacing_V'] / 2; - $tbx = $x; - $tby = $y; - $tbw = $w; - $tbh = $h; - $tab_bord = 0; - $corner = ''; - if ($i == $firstrow && $horf == 'H') { - // Top - $tby -= $halfspaceT + $table['border_details']['T']['w'] / 2; - $tbh += $halfspaceT + $table['border_details']['T']['w'] / 2; - $this->setBorder($tab_bord, Border::TOP); - $corner .= 'T'; - } - if (($i == $lastrow || isset($tablehf['rowspan']) && $i + $tablehf['rowspan'] == $lastrow + 1) && $horf == 'F') { - // Bottom - $tbh += $halfspaceB + $table['border_details']['B']['w'] / 2; - $this->setBorder($tab_bord, Border::BOTTOM); - $corner .= 'B'; - } - if ($colctr == 1 && $firstSpread) { - // Left - $tbx -= $halfspaceL + $table['border_details']['L']['w'] / 2; - $tbw += $halfspaceL + $table['border_details']['L']['w'] / 2; - $this->setBorder($tab_bord, Border::LEFT); - $corner .= 'L'; - } - if ($colctr == \count($content[$i]) && $finalSpread) { - // Right - $tbw += $halfspaceR + $table['border_details']['R']['w'] / 2; - $this->setBorder($tab_bord, Border::RIGHT); - $corner .= 'R'; - } - $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord, $table['border_details'], \false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H']); - } - } - // end column $content - $this->y = $y + $h; - // Update y coordinate - } - // end row $i - unset($table); - $this->colsums = []; - } - } - /* -- END TABLES -- */ - function SetHTMLHeader($header = '', $OE = '', $write = \false) - { - $height = 0; - if (\is_array($header) && isset($header['html']) && $header['html']) { - $Hhtml = $header['html']; - if ($this->setAutoTopMargin) { - if (isset($header['h'])) { - $height = $header['h']; - } else { - $height = $this->_getHtmlHeight($Hhtml); - } - } - } elseif (!\is_array($header) && $header) { - $Hhtml = $header; - if ($this->setAutoTopMargin) { - $height = $this->_getHtmlHeight($Hhtml); - } - } else { - $Hhtml = ''; - } - if ($OE !== 'E') { - $OE = 'O'; - } - if ($OE === 'E') { - if ($Hhtml) { - $this->HTMLHeaderE = []; - $this->HTMLHeaderE['html'] = $Hhtml; - $this->HTMLHeaderE['h'] = $height; - } else { - $this->HTMLHeaderE = ''; - } - } else { - if ($Hhtml) { - $this->HTMLHeader = []; - $this->HTMLHeader['html'] = $Hhtml; - $this->HTMLHeader['h'] = $height; - } else { - $this->HTMLHeader = ''; - } - } - if (!$this->mirrorMargins && $OE == 'E') { - return; - } - if ($Hhtml == '') { - return; - } - if ($this->setAutoTopMargin == 'pad') { - $this->tMargin = $this->margin_header + $height + $this->orig_tMargin; - if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { - $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; - } - } elseif ($this->setAutoTopMargin == 'stretch') { - $this->tMargin = \max($this->orig_tMargin, $this->margin_header + $height + $this->autoMarginPadding); - if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { - $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; - } - } - if ($write && $this->state != 0 && ($this->mirrorMargins && $OE == 'E' && $this->page % 2 == 0 || $this->mirrorMargins && $OE != 'E' && $this->page % 2 == 1 || !$this->mirrorMargins)) { - $this->writeHTMLHeaders(); - } - } - function SetHTMLFooter($footer = '', $OE = '') - { - $height = 0; - if (\is_array($footer) && isset($footer['html']) && $footer['html']) { - $Fhtml = $footer['html']; - if ($this->setAutoBottomMargin) { - if (isset($footer['h'])) { - $height = $footer['h']; - } else { - $height = $this->_getHtmlHeight($Fhtml); - } - } - } elseif (!\is_array($footer) && $footer) { - $Fhtml = $footer; - if ($this->setAutoBottomMargin) { - $height = $this->_getHtmlHeight($Fhtml); - } - } else { - $Fhtml = ''; - } - if ($OE !== 'E') { - $OE = 'O'; - } - if ($OE === 'E') { - if ($Fhtml) { - $this->HTMLFooterE = []; - $this->HTMLFooterE['html'] = $Fhtml; - $this->HTMLFooterE['h'] = $height; - } else { - $this->HTMLFooterE = ''; - } - } else { - if ($Fhtml) { - $this->HTMLFooter = []; - $this->HTMLFooter['html'] = $Fhtml; - $this->HTMLFooter['h'] = $height; - } else { - $this->HTMLFooter = ''; - } - } - if (!$this->mirrorMargins && $OE == 'E') { - return; - } - if ($Fhtml == '') { - return \false; - } - if ($this->setAutoBottomMargin == 'pad') { - $this->bMargin = $this->margin_footer + $height + $this->orig_bMargin; - $this->PageBreakTrigger = $this->h - $this->bMargin; - if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { - $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; - } - } elseif ($this->setAutoBottomMargin == 'stretch') { - $this->bMargin = \max($this->orig_bMargin, $this->margin_footer + $height + $this->autoMarginPadding); - $this->PageBreakTrigger = $this->h - $this->bMargin; - if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { - $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; - } - } - } - function _getHtmlHeight($html) - { - $save_state = $this->state; - if ($this->state == 0) { - $this->AddPage($this->CurOrientation); - } - $this->state = 2; - $this->Reset(); - $this->pageoutput[$this->page] = []; - $save_x = $this->x; - $save_y = $this->y; - $this->x = $this->lMargin; - $this->y = $this->margin_header; - // Replace of page number aliases and date format - $pnstr = $this->pagenumPrefix . $this->docPageNum($this->page) . $this->pagenumSuffix; - $pntstr = $this->nbpgPrefix . $this->docPageNumTotal($this->page) . $this->nbpgSuffix; - $nb = $this->page; - $html = $this->aliasReplace($html, $pnstr, $pntstr, $nb); - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $savepb = $this->pageBackgrounds; - $this->writingHTMLheader = \true; - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $this->writingHTMLheader = \false; - $h = $this->y - $this->margin_header; - $this->Reset(); - // mPDF 5.7.2 - Clear in case Float used in Header/Footer - $this->blk[0]['blockContext'] = 0; - $this->blk[0]['float_endpos'] = 0; - $this->pageoutput[$this->page] = []; - $this->headerbuffer = ''; - $this->pageBackgrounds = $savepb; - $this->x = $save_x; - $this->y = $save_y; - $this->state = $save_state; - if ($save_state == 0) { - unset($this->pages[1]); - $this->page = 0; - } - return $h; - } - // Called internally from Header - function writeHTMLHeaders() - { - if ($this->mirrorMargins && $this->page % 2 == 0) { - $OE = 'E'; - } else { - $OE = 'O'; - } - if ($OE === 'E') { - $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeaderE['html']; - } else { - $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeader['html']; - } - if ($this->forcePortraitHeaders && $this->CurOrientation == 'L' && $this->CurOrientation != $this->DefOrientation) { - $this->saveHTMLHeader[$this->page][$OE]['rotate'] = \true; - $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->tMargin; - $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->bMargin; - $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; - $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; - $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->h; - $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->w; - } else { - $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->lMargin; - $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->rMargin; - $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; - $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; - $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->w; - $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->h; - } - } - function writeHTMLFooters() - { - if ($this->mirrorMargins && $this->page % 2 == 0) { - $OE = 'E'; - } else { - $OE = 'O'; - } - if ($OE === 'E') { - $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooterE['html']; - } else { - $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooter['html']; - } - if ($this->forcePortraitHeaders && $this->CurOrientation == 'L' && $this->CurOrientation != $this->DefOrientation) { - $this->saveHTMLFooter[$this->page][$OE]['rotate'] = \true; - $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->tMargin; - $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->bMargin; - $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->rMargin; - $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->lMargin; - $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; - $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; - $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->h; - $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->w; - } else { - $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->lMargin; - $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->rMargin; - $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->tMargin; - $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->bMargin; - $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; - $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; - $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->w; - $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->h; - } - } - // mPDF 6 - function _shareHeaderFooterWidth($cl, $cc, $cr) - { - // mPDF 6 - $l = \mb_strlen($cl, 'UTF-8'); - $c = \mb_strlen($cc, 'UTF-8'); - $r = \mb_strlen($cr, 'UTF-8'); - $s = \max($l, $r); - $tw = $c + 2 * $s; - if ($tw > 0) { - return [\intval($s * 100 / $tw), \intval($c * 100 / $tw), \intval($s * 100 / $tw)]; - } else { - return [33, 33, 33]; - } - } - // mPDF 6 - // Create an HTML header/footer from array (non-HTML header/footer) - function _createHTMLheaderFooter($arr, $hf) - { - $lContent = isset($arr['L']['content']) ? $arr['L']['content'] : ''; - $cContent = isset($arr['C']['content']) ? $arr['C']['content'] : ''; - $rContent = isset($arr['R']['content']) ? $arr['R']['content'] : ''; - list($lw, $cw, $rw) = $this->_shareHeaderFooterWidth($lContent, $cContent, $rContent); - if ($hf == 'H') { - $valign = 'bottom'; - $vpadding = '0 0 ' . $this->header_line_spacing . 'em 0'; - } else { - $valign = 'top'; - $vpadding = '' . $this->footer_line_spacing . 'em 0 0 0'; - } - if ($this->directionality == 'rtl') { - // table columns get reversed so need different text-alignment - $talignL = 'right'; - $talignR = 'left'; - } else { - $talignL = 'left'; - $talignR = 'right'; - } - $html = ''; - $html .= ''; - $html .= ''; - $html .= ''; - $html .= ''; - $html .= '
' . $lContent . '' . $cContent . '' . $rContent . '
'; - return $html; - } - function DefHeaderByName($name, $arr) - { - if (!$name) { - $name = '_nonhtmldefault'; - } - $html = $this->_createHTMLheaderFooter($arr, 'H'); - $this->pageHTMLheaders[$name]['html'] = $html; - $this->pageHTMLheaders[$name]['h'] = $this->_getHtmlHeight($html); - } - function DefFooterByName($name, $arr) - { - if (!$name) { - $name = '_nonhtmldefault'; - } - $html = $this->_createHTMLheaderFooter($arr, 'F'); - $this->pageHTMLfooters[$name]['html'] = $html; - $this->pageHTMLfooters[$name]['h'] = $this->_getHtmlHeight($html); - } - function SetHeaderByName($name, $side = 'O', $write = \false) - { - if (!$name) { - $name = '_nonhtmldefault'; - } - $this->SetHTMLHeader($this->pageHTMLheaders[$name], $side, $write); - } - function SetFooterByName($name, $side = 'O') - { - if (!$name) { - $name = '_nonhtmldefault'; - } - $this->SetHTMLFooter($this->pageHTMLfooters[$name], $side); - } - function DefHTMLHeaderByName($name, $html) - { - if (!$name) { - $name = '_default'; - } - $this->pageHTMLheaders[$name]['html'] = $html; - $this->pageHTMLheaders[$name]['h'] = $this->_getHtmlHeight($html); - } - function DefHTMLFooterByName($name, $html) - { - if (!$name) { - $name = '_default'; - } - $this->pageHTMLfooters[$name]['html'] = $html; - $this->pageHTMLfooters[$name]['h'] = $this->_getHtmlHeight($html); - } - function SetHTMLHeaderByName($name, $side = 'O', $write = \false) - { - if (!$name) { - $name = '_default'; - } - $this->SetHTMLHeader($this->pageHTMLheaders[$name], $side, $write); - } - function SetHTMLFooterByName($name, $side = 'O') - { - if (!$name) { - $name = '_default'; - } - $this->SetHTMLFooter($this->pageHTMLfooters[$name], $side); - } - function SetHeader($Harray = [], $side = '', $write = \false) - { - $oddhtml = ''; - $evenhtml = ''; - if (\is_string($Harray)) { - if (\strlen($Harray) === 0) { - $oddhtml = ''; - $evenhtml = ''; - } elseif (\strpos($Harray, '|') !== \false) { - $hdet = \explode('|', $Harray); - list($lw, $cw, $rw) = $this->_shareHeaderFooterWidth($hdet[0], $hdet[1], $hdet[2]); - $oddhtml = ''; - $oddhtml .= ''; - $oddhtml .= ''; - $oddhtml .= ''; - $oddhtml .= ''; - $oddhtml .= '
' . $hdet[0] . '' . $hdet[1] . '' . $hdet[2] . '
'; - $evenhtml = ''; - $evenhtml .= ''; - $evenhtml .= ''; - $evenhtml .= ''; - $evenhtml .= ''; - $evenhtml .= '
' . $hdet[2] . '' . $hdet[1] . '' . $hdet[0] . '
'; - } else { - $oddhtml = '
' . $Harray . '
'; - $evenhtml = '
' . $Harray . '
'; - } - } elseif (\is_array($Harray) && !empty($Harray)) { - $odd = null; - $even = null; - if ($side === 'O') { - $odd = $Harray; - } elseif ($side === 'E') { - $even = $Harray; - } else { - $odd = Arrays::get($Harray, 'odd', null); - $even = Arrays::get($Harray, 'even', null); - } - $oddhtml = $this->_createHTMLheaderFooter($odd, 'H'); - $evenhtml = $this->_createHTMLheaderFooter($even, 'H'); - } - if ($side === 'E') { - $this->SetHTMLHeader($evenhtml, 'E', $write); - } elseif ($side === 'O') { - $this->SetHTMLHeader($oddhtml, 'O', $write); - } else { - $this->SetHTMLHeader($oddhtml, 'O', $write); - $this->SetHTMLHeader($evenhtml, 'E', $write); - } - } - function SetFooter($Farray = [], $side = '') - { - $oddhtml = ''; - $evenhtml = ''; - if (\is_string($Farray)) { - if (\strlen($Farray) == 0) { - $oddhtml = ''; - $evenhtml = ''; - } elseif (\strpos($Farray, '|') !== \false) { - $hdet = \explode('|', $Farray); - $oddhtml = ''; - $oddhtml .= ''; - $oddhtml .= ''; - $oddhtml .= ''; - $oddhtml .= ''; - $oddhtml .= '
' . $hdet[0] . '' . $hdet[1] . '' . $hdet[2] . '
'; - $evenhtml = ''; - $evenhtml .= ''; - $evenhtml .= ''; - $evenhtml .= ''; - $evenhtml .= ''; - $evenhtml .= '
' . $hdet[2] . '' . $hdet[1] . '' . $hdet[0] . '
'; - } else { - $oddhtml = '
' . $Farray . '
'; - $evenhtml = '
' . $Farray . '
'; - } - } elseif (\is_array($Farray)) { - $odd = null; - $even = null; - if ($side === 'O') { - $odd = $Farray; - } elseif ($side == 'E') { - $even = $Farray; - } else { - $odd = Arrays::get($Farray, 'odd', null); - $even = Arrays::get($Farray, 'even', null); - } - $oddhtml = $this->_createHTMLheaderFooter($odd, 'F'); - $evenhtml = $this->_createHTMLheaderFooter($even, 'F'); - } - if ($side === 'E') { - $this->SetHTMLFooter($evenhtml, 'E'); - } elseif ($side === 'O') { - $this->SetHTMLFooter($oddhtml, 'O'); - } else { - $this->SetHTMLFooter($oddhtml, 'O'); - $this->SetHTMLFooter($evenhtml, 'E'); - } - } - /* -- WATERMARK -- */ - function SetWatermarkText($txt = '', $alpha = -1) - { - if ($txt instanceof \WP_Ultimo\Dependencies\Mpdf\WatermarkText) { - $this->watermarkTextObject = $txt; - $this->watermarkText = $txt->getText(); - $this->watermarkTextAlpha = $txt->getAlpha(); - $this->watermarkAngle = $txt->getAngle(); - $this->watermark_font = $txt->getFont() === null ? $txt->getFont() : $this->watermark_font; - $this->watermark_size = $txt->getSize(); - return; - } - if ($alpha >= 0) { - $this->watermarkTextAlpha = $alpha; - } - $this->watermarkText = $txt; - } - function SetWatermarkImage($src, $alpha = -1, $size = 'D', $pos = 'F') - { - if ($src instanceof \WP_Ultimo\Dependencies\Mpdf\WatermarkImage) { - $this->watermarkImage = $src->getPath(); - $this->watermark_size = $src->getSize(); - $this->watermark_pos = $src->getPosition(); - $this->watermarkImageAlpha = $src->getAlpha(); - $this->watermarkImgBehind = $src->isBehindContent(); - $this->watermarkImgAlphaBlend = $src->getAlphaBlend(); - return; - } - if ($alpha >= 0) { - $this->watermarkImageAlpha = $alpha; - } - $this->watermarkImage = $src; - $this->watermark_size = $size; - $this->watermark_pos = $pos; - } - /* -- END WATERMARK -- */ - // Page footer - function Footer() - { - /* -- CSS-PAGE -- */ - // PAGED MEDIA - CROP / CROSS MARKS from @PAGE - if ($this->show_marks == 'CROP' || $this->show_marks == 'CROPCROSS') { - // Show TICK MARKS - $this->SetLineWidth(0.1); - // = 0.1 mm - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $l = $this->cropMarkLength; - $m = $this->cropMarkMargin; - // Distance of crop mark from margin - $b = $this->nonPrintMargin; - // Non-printable border at edge of paper sheet - $ax1 = $b; - $bx = $this->page_box['outer_width_LR'] - $m; - $ax = \max($ax1, $bx - $l); - $cx1 = $this->w - $b; - $dx = $this->w - $this->page_box['outer_width_LR'] + $m; - $cx = \min($cx1, $dx + $l); - $ay1 = $b; - $by = $this->page_box['outer_width_TB'] - $m; - $ay = \max($ay1, $by - $l); - $cy1 = $this->h - $b; - $dy = $this->h - $this->page_box['outer_width_TB'] + $m; - $cy = \min($cy1, $dy + $l); - $this->Line($ax, $this->page_box['outer_width_TB'], $bx, $this->page_box['outer_width_TB']); - $this->Line($cx, $this->page_box['outer_width_TB'], $dx, $this->page_box['outer_width_TB']); - $this->Line($ax, $this->h - $this->page_box['outer_width_TB'], $bx, $this->h - $this->page_box['outer_width_TB']); - $this->Line($cx, $this->h - $this->page_box['outer_width_TB'], $dx, $this->h - $this->page_box['outer_width_TB']); - $this->Line($this->page_box['outer_width_LR'], $ay, $this->page_box['outer_width_LR'], $by); - $this->Line($this->page_box['outer_width_LR'], $cy, $this->page_box['outer_width_LR'], $dy); - $this->Line($this->w - $this->page_box['outer_width_LR'], $ay, $this->w - $this->page_box['outer_width_LR'], $by); - $this->Line($this->w - $this->page_box['outer_width_LR'], $cy, $this->w - $this->page_box['outer_width_LR'], $dy); - if ($this->printers_info) { - $hd = \date('Y-m-d H:i') . ' Page ' . $this->page . ' of {nb}'; - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetFont('arial', '', 7.5, \true, \true); - $this->x = $this->page_box['outer_width_LR'] + 1.5; - $this->y = 1; - $this->Cell(0, $this->FontSize, $hd, 0, 0, 'L', 0, '', 0, 0, 0, 'M'); - $this->SetFont($this->default_font, '', $this->original_default_font_size); - } - } - if ($this->show_marks == 'CROSS' || $this->show_marks == 'CROPCROSS') { - $this->SetLineWidth(0.1); - // = 0.1 mm - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $l = 14 / 2; - // longer length of the cross line (half) - $w = 6 / 2; - // shorter width of the cross line (half) - $r = 1.2; - // radius of circle - $m = $this->crossMarkMargin; - // Distance of cross mark from margin - $x1 = $this->page_box['outer_width_LR'] - $m; - $x2 = $this->w - $this->page_box['outer_width_LR'] + $m; - $y1 = $this->page_box['outer_width_TB'] - $m; - $y2 = $this->h - $this->page_box['outer_width_TB'] + $m; - // Left - $this->Circle($x1, $this->h / 2, $r, 'S'); - $this->Line($x1 - $w, $this->h / 2, $x1 + $w, $this->h / 2); - $this->Line($x1, $this->h / 2 - $l, $x1, $this->h / 2 + $l); - // Right - $this->Circle($x2, $this->h / 2, $r, 'S'); - $this->Line($x2 - $w, $this->h / 2, $x2 + $w, $this->h / 2); - $this->Line($x2, $this->h / 2 - $l, $x2, $this->h / 2 + $l); - // Top - $this->Circle($this->w / 2, $y1, $r, 'S'); - $this->Line($this->w / 2, $y1 - $w, $this->w / 2, $y1 + $w); - $this->Line($this->w / 2 - $l, $y1, $this->w / 2 + $l, $y1); - // Bottom - $this->Circle($this->w / 2, $y2, $r, 'S'); - $this->Line($this->w / 2, $y2 - $w, $this->w / 2, $y2 + $w); - $this->Line($this->w / 2 - $l, $y2, $this->w / 2 + $l, $y2); - } - /* -- END CSS-PAGE -- */ - // mPDF 6 - // If @page set non-HTML headers/footers named, they were not read until later in the HTML code - so now set them - if ($this->page == 1) { - if ($this->firstPageBoxHeader) { - if (isset($this->pageHTMLheaders[$this->firstPageBoxHeader])) { - $this->HTMLHeader = $this->pageHTMLheaders[$this->firstPageBoxHeader]; - } - $this->Header(); - } - if ($this->firstPageBoxFooter) { - if (isset($this->pageHTMLfooters[$this->firstPageBoxFooter])) { - $this->HTMLFooter = $this->pageHTMLfooters[$this->firstPageBoxFooter]; - } - } - $this->firstPageBoxHeader = ''; - $this->firstPageBoxFooter = ''; - } - if ($this->mirrorMargins && $this->page % 2 == 0 && $this->HTMLFooterE || $this->mirrorMargins && $this->page % 2 == 1 && $this->HTMLFooter || !$this->mirrorMargins && $this->HTMLFooter) { - $this->writeHTMLFooters(); - } - /* -- WATERMARK -- */ - if ($this->watermarkText && $this->showWatermarkText) { - $this->watermark($this->watermarkText, $this->watermarkAngle, 120, $this->watermarkTextAlpha); - // Watermark text - } - if ($this->watermarkImage && $this->showWatermarkImage) { - $this->watermarkImg($this->watermarkImage, $this->watermarkImageAlpha); - // Watermark image - } - /* -- END WATERMARK -- */ - } - /* -- HTML-CSS -- */ - /** - * Write HTML code to the document - * - * Also used internally to parse HTML into buffers - * - * @param string $html - * @param int $mode Use HTMLParserMode constants. Controls what parts of the $html code is parsed. - * @param bool $init Clears and sets buffers to Top level block etc. - * @param bool $close If false leaves buffers etc. in current state, so that it can continue a block etc. - */ - function WriteHTML($html, $mode = HTMLParserMode::DEFAULT_MODE, $init = \true, $close = \true) - { - /* Check $html is an integer, float, string, boolean or class with __toString(), otherwise throw exception */ - if (\is_scalar($html) === \false) { - if (!\is_object($html) || !\method_exists($html, '__toString')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('WriteHTML() requires $html be an integer, float, string, boolean or an object with the __toString() magic method.'); - } - } - // Check the mode is valid - if (\in_array($mode, HTMLParserMode::getAllModes(), \true) === \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('WriteHTML() requires $mode to be one of the modes defined in HTMLParserMode'); - } - /* Cast $html as a string */ - $html = (string) $html; - // @log Parsing CSS & Headers - if ($init) { - $this->headerbuffer = ''; - $this->textbuffer = []; - $this->fixedPosBlockSave = []; - } - if ($mode === HTMLParserMode::HEADER_CSS) { - $html = ''; - } - // stylesheet only - if ($this->allow_charset_conversion) { - if ($mode === HTMLParserMode::DEFAULT_MODE) { - $this->ReadCharset($html); - } - if ($this->charset_in && $mode !== HTMLParserMode::HTML_HEADER_BUFFER) { - $success = \iconv($this->charset_in, 'UTF-8//TRANSLIT', $html); - if ($success) { - $html = $success; - } - } - } - $html = $this->purify_utf8($html, \false); - if ($init) { - $this->blklvl = 0; - $this->lastblocklevelchange = 0; - $this->blk = []; - $this->initialiseBlock($this->blk[0]); - $this->blk[0]['width'] =& $this->pgwidth; - $this->blk[0]['inner_width'] =& $this->pgwidth; - $this->blk[0]['blockContext'] = $this->blockContext; - } - $zproperties = []; - if ($mode === HTMLParserMode::DEFAULT_MODE || $mode === HTMLParserMode::HEADER_CSS) { - $this->ReadMetaTags($html); - if (\preg_match('/]*href=["\']([^"\'>]*)["\']/i', $html, $m)) { - $this->SetBasePath($m[1]); - } - $html = $this->cssManager->ReadCSS($html); - if ($this->autoLangToFont && !$this->usingCoreFont && \preg_match('/]*lang=[\'\\"](.*?)[\'\\"]/ism', $html, $m)) { - $html_lang = $m[1]; - } - if (\preg_match('/]*dir=[\'\\"]\\s*rtl\\s*[\'\\"]/ism', $html)) { - $zproperties['DIRECTION'] = 'rtl'; - } - // allow in-line CSS for body tag to be parsed // Get tag inline CSS - if (\preg_match('/]*)>(.*?)<\\/body>/ism', $html, $m) || \preg_match('/]*)>(.*)$/ism', $html, $m)) { - $html = $m[2]; - // Changed to allow style="background: url('bg.jpg')" - if (\preg_match('/style=[\\"](.*?)[\\"]/ism', $m[1], $mm) || \preg_match('/style=[\'](.*?)[\']/ism', $m[1], $mm)) { - $zproperties = $this->cssManager->readInlineCSS($mm[1]); - } - if (\preg_match('/dir=[\'\\"]\\s*rtl\\s*[\'\\"]/ism', $m[1])) { - $zproperties['DIRECTION'] = 'rtl'; - } - if (isset($html_lang) && $html_lang) { - $zproperties['LANG'] = $html_lang; - } - if ($this->autoLangToFont && !$this->onlyCoreFonts && \preg_match('/lang=[\'\\"](.*?)[\'\\"]/ism', $m[1], $mm)) { - $zproperties['LANG'] = $mm[1]; - } - } - } - $properties = $this->cssManager->MergeCSS('BLOCK', 'BODY', ''); - if ($zproperties) { - $properties = $this->cssManager->array_merge_recursive_unique($properties, $zproperties); - } - if (isset($properties['DIRECTION']) && $properties['DIRECTION']) { - $this->cssManager->CSS['BODY']['DIRECTION'] = $properties['DIRECTION']; - } - if (!isset($this->cssManager->CSS['BODY']['DIRECTION'])) { - $this->cssManager->CSS['BODY']['DIRECTION'] = $this->directionality; - } else { - $this->SetDirectionality($this->cssManager->CSS['BODY']['DIRECTION']); - } - $this->setCSS($properties, '', 'BODY'); - $this->blk[0]['InlineProperties'] = $this->saveInlineProperties(); - if ($mode === HTMLParserMode::HEADER_CSS) { - return ''; - } - if (!isset($this->cssManager->CSS['BODY'])) { - $this->cssManager->CSS['BODY'] = []; - } - /* -- BACKGROUNDS -- */ - if (isset($properties['BACKGROUND-GRADIENT'])) { - $this->bodyBackgroundGradient = $properties['BACKGROUND-GRADIENT']; - } - if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE']) { - $ret = $this->SetBackground($properties, $this->pgwidth); - if ($ret) { - $this->bodyBackgroundImage = $ret; - } - } - /* -- END BACKGROUNDS -- */ - /* -- CSS-PAGE -- */ - // If page-box is set - if ($this->state == 0 && (isset($this->cssManager->CSS['@PAGE']) && $this->cssManager->CSS['@PAGE'] || isset($this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']) && $this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST'])) { - // mPDF 5.7.3 - $this->page_box['current'] = ''; - $this->page_box['using'] = \true; - list($pborientation, $pbmgl, $pbmgr, $pbmgt, $pbmgb, $pbmgh, $pbmgf, $hname, $fname, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat) = $this->SetPagedMediaCSS('', \false, 'O'); - $this->DefOrientation = $this->CurOrientation = $pborientation; - $this->orig_lMargin = $this->DeflMargin = $pbmgl; - $this->orig_rMargin = $this->DefrMargin = $pbmgr; - $this->orig_tMargin = $this->tMargin = $pbmgt; - $this->orig_bMargin = $this->bMargin = $pbmgb; - $this->orig_hMargin = $this->margin_header = $pbmgh; - $this->orig_fMargin = $this->margin_footer = $pbmgf; - list($pborientation, $pbmgl, $pbmgr, $pbmgt, $pbmgb, $pbmgh, $pbmgf, $hname, $fname, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat) = $this->SetPagedMediaCSS('', \true, 'O'); - // first page - $this->show_marks = $marks; - if ($hname) { - $this->firstPageBoxHeader = $hname; - } - if ($fname) { - $this->firstPageBoxFooter = $fname; - } - } - /* -- END CSS-PAGE -- */ - $parseonly = \false; - $this->bufferoutput = \false; - if ($mode == HTMLParserMode::HTML_PARSE_NO_WRITE) { - $parseonly = \true; - // Close any open block tags - $arr = []; - $ai = 0; - for ($b = $this->blklvl; $b > 0; $b--) { - $this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai); - } - // Output any text left in buffer - if (\count($this->textbuffer)) { - $this->printbuffer($this->textbuffer); - } - $this->textbuffer = []; - } elseif ($mode === HTMLParserMode::HTML_HEADER_BUFFER) { - // Close any open block tags - $arr = []; - $ai = 0; - for ($b = $this->blklvl; $b > 0; $b--) { - $this->tag->CloseTag($this->blk[$b]['tag'], $arr, $ai); - } - // Output any text left in buffer - if (\count($this->textbuffer)) { - $this->printbuffer($this->textbuffer); - } - $this->bufferoutput = \true; - $this->textbuffer = []; - $this->headerbuffer = ''; - $properties = $this->cssManager->MergeCSS('BLOCK', 'BODY', ''); - $this->setCSS($properties, '', 'BODY'); - } - \mb_internal_encoding('UTF-8'); - $html = $this->AdjustHTML($html, $this->tabSpaces); - // Try to make HTML look more like XHTML - if ($this->autoScriptToLang) { - $html = $this->markScriptToLang($html); - } - \preg_match_all('/]*)>(.*?)<\\/htmlpageheader>/si', $html, $h); - for ($i = 0; $i < \count($h[1]); $i++) { - if (\preg_match('/name=[\'|\\"](.*?)[\'|\\"]/', $h[1][$i], $n)) { - $this->pageHTMLheaders[$n[1]]['html'] = $h[2][$i]; - $this->pageHTMLheaders[$n[1]]['h'] = $this->_getHtmlHeight($h[2][$i]); - } - } - \preg_match_all('/]*)>(.*?)<\\/htmlpagefooter>/si', $html, $f); - for ($i = 0; $i < \count($f[1]); $i++) { - if (\preg_match('/name=[\'|\\"](.*?)[\'|\\"]/', $f[1][$i], $n)) { - $this->pageHTMLfooters[$n[1]]['html'] = $f[2][$i]; - $this->pageHTMLfooters[$n[1]]['h'] = $this->_getHtmlHeight($f[2][$i]); - } - } - $html = \preg_replace('//si', '', $html); - $html = \preg_replace('//si', '', $html); - if ($this->state == 0 && ($mode === HTMLParserMode::DEFAULT_MODE || $mode === HTMLParserMode::HTML_BODY)) { - $this->AddPage($this->CurOrientation); - } - if (isset($hname) && \preg_match('/^html_(.*)$/i', $hname, $n)) { - $this->SetHTMLHeader($this->pageHTMLheaders[$n[1]], 'O', \true); - } - if (isset($fname) && \preg_match('/^html_(.*)$/i', $fname, $n)) { - $this->SetHTMLFooter($this->pageHTMLfooters[$n[1]], 'O'); - } - $html = \str_replace('checkSIP = \false; - $this->checkSMP = \false; - $this->checkCJK = \false; - if ($this->onlyCoreFonts) { - $html = $this->SubstituteChars($html); - } else { - if (\preg_match("/([" . $this->pregRTLchars . "])/u", $html)) { - $this->biDirectional = \true; - } - // *OTL* - if (\preg_match("/([\\x{20000}-\\x{2FFFF}])/u", $html)) { - $this->checkSIP = \true; - } - if (\preg_match("/([\\x{10000}-\\x{1FFFF}])/u", $html)) { - $this->checkSMP = \true; - } - /* -- CJK-FONTS -- */ - if (\preg_match("/([" . $this->pregCJKchars . "])/u", $html)) { - $this->checkCJK = \true; - } - /* -- END CJK-FONTS -- */ - } - // Don't allow non-breaking spaces that are converted to substituted chars or will break anyway and mess up table width calc. - $html = \str_replace('160', \chr(32), $html); - $html = \str_replace('', '|', $html); - $html = \str_replace('', '|', $html); - $html = \str_replace('', '|', $html); - // Add new supported tags in the DisableTags function - $html = \strip_tags($html, $this->enabledtags); - // remove all unsupported tags, but the ones inside the 'enabledtags' string - // Explode the string in order to parse the HTML code - $a = \preg_split('/<(.*?)>/ms', $html, -1, \PREG_SPLIT_DELIM_CAPTURE); - // ? more accurate regexp that allows e.g.
- // if changing - also change in fn.SubstituteChars() - // $a = preg_split ('/<((?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+)>/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); - if ($this->mb_enc) { - \mb_internal_encoding($this->mb_enc); - } - $pbc = 0; - $this->subPos = -1; - $cnt = \count($a); - for ($i = 0; $i < $cnt; $i++) { - $e = $a[$i]; - if ($i % 2 == 0) { - // TEXT - if ($this->blk[$this->blklvl]['hide']) { - continue; - } - if ($this->inlineDisplayOff) { - continue; - } - if ($this->inMeter) { - continue; - } - if ($this->inFixedPosBlock) { - $this->fixedPosBlock .= $e; - continue; - } - // *CSS-POSITION* - if (\strlen($e) == 0) { - continue; - } - if ($this->ignorefollowingspaces && !$this->ispre) { - if (\strlen(\ltrim($e)) == 0) { - continue; - } - if ($this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats' && \substr($e, 0, 1) == ' ') { - $this->ignorefollowingspaces = \false; - $e = \ltrim($e); - } - } - $this->OTLdata = null; - // mPDF 5.7.1 - $e = UtfString::strcode2utf($e); - $e = $this->lesser_entity_decode($e); - if ($this->usingCoreFont) { - // If core font is selected in document which is not onlyCoreFonts - substitute with non-core font - if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->subPos < $i && !$this->specialcontent) { - $cnt += $this->SubstituteCharsNonCore($a, $i, $e); - } - // CONVERT ENCODING - $e = \mb_convert_encoding($e, $this->mb_enc, 'UTF-8'); - if ($this->textvar & TextVars::FT_UPPERCASE) { - $e = \mb_strtoupper($e, $this->mb_enc); - } elseif ($this->textvar & TextVars::FT_LOWERCASE) { - $e = \mb_strtolower($e, $this->mb_enc); - } elseif ($this->textvar & TextVars::FT_CAPITALIZE) { - $e = \mb_convert_case($e, \MB_CASE_TITLE, "UTF-8"); - } - // mPDF 5.7.1 - } else { - if ($this->checkSIP && $this->CurrentFont['sipext'] && $this->subPos < $i && (!$this->specialcontent || !$this->useActiveForms)) { - $cnt += $this->SubstituteCharsSIP($a, $i, $e); - } - if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->CurrentFont['type'] != 'Type0' && $this->subPos < $i && (!$this->specialcontent || !$this->useActiveForms)) { - $cnt += $this->SubstituteCharsMB($a, $i, $e); - } - if ($this->textvar & TextVars::FT_UPPERCASE) { - $e = \mb_strtoupper($e, $this->mb_enc); - } elseif ($this->textvar & TextVars::FT_LOWERCASE) { - $e = \mb_strtolower($e, $this->mb_enc); - } elseif ($this->textvar & TextVars::FT_CAPITALIZE) { - $e = \mb_convert_case($e, \MB_CASE_TITLE, "UTF-8"); - } - /* -- OTL -- */ - // Use OTL OpenType Table Layout - GSUB & GPOS - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] && (!$this->specialcontent || !$this->useActiveForms)) { - if (!$this->otl) { - $this->otl = new Otl($this, $this->fontCache); - } - $e = $this->otl->applyOTL($e, $this->CurrentFont['useOTL']); - $this->OTLdata = $this->otl->OTLdata; - $this->otl->removeChar($e, $this->OTLdata, ""); - // Remove ZWNBSP (also Byte order mark FEFF) - } else { - // removes U+200E/U+200F LTR and RTL mark and U+200C/U+200D Zero-width Joiner and Non-joiner - $e = \preg_replace("/[‌‍‎‏]/u", '', $e); - $e = \preg_replace("/[]/u", '', $e); - // Remove ZWNBSP (also Byte order mark FEFF) - } - } - if ($this->tts || $this->ttz || $this->tta) { - $es = \explode('|', $e); - $e = ''; - foreach ($es as $val) { - $e .= \chr($val); - } - } - // FORM ELEMENTS - if ($this->specialcontent) { - /* -- FORMS -- */ - // SELECT tag (form element) - if ($this->specialcontent == "type=select") { - $e = \ltrim($e); - if (!empty($this->OTLdata)) { - $this->otl->trimOTLdata($this->OTLdata, \true, \false); - } - // *OTL* - $stringwidth = $this->GetStringWidth($e); - if (!isset($this->selectoption['MAXWIDTH']) || $stringwidth > $this->selectoption['MAXWIDTH']) { - $this->selectoption['MAXWIDTH'] = $stringwidth; - } - if (!isset($this->selectoption['SELECTED']) || $this->selectoption['SELECTED'] == '') { - $this->selectoption['SELECTED'] = $e; - if (!empty($this->OTLdata)) { - $this->selectoption['SELECTED-OTLDATA'] = $this->OTLdata; - } - // *OTL* - } - // Active Forms - if (isset($this->selectoption['ACTIVE']) && $this->selectoption['ACTIVE']) { - $this->selectoption['ITEMS'][] = ['exportValue' => $this->selectoption['currentVAL'], 'content' => $e, 'selected' => $this->selectoption['currentSEL']]; - } - $this->OTLdata = []; - } else { - $objattr = \unserialize($this->specialcontent); - $objattr['text'] = $e; - $objattr['OTLdata'] = $this->OTLdata; - $this->OTLdata = []; - $te = Mpdf::OBJECT_IDENTIFIER . "type=textarea,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->tdbegin) { - $this->_saveCellTextBuffer($te, $this->HREF); - } else { - $this->_saveTextBuffer($te, $this->HREF); - } - } - /* -- END FORMS -- */ - } elseif ($this->tableLevel) { - /* -- TABLES -- */ - if ($this->tdbegin) { - if ($this->ignorefollowingspaces && !$this->ispre) { - $e = \ltrim($e); - if (!empty($this->OTLdata)) { - $this->otl->trimOTLdata($this->OTLdata, \true, \false); - } - // *OTL* - } - if ($e || $e === '0') { - if ($this->blockjustfinished && $this->cell[$this->row][$this->col]['s'] > 0) { - $this->_saveCellTextBuffer("\n"); - if (!isset($this->cell[$this->row][$this->col]['maxs'])) { - $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; - } elseif ($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { - $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; - } - $this->cell[$this->row][$this->col]['s'] = 0; - // reset - } - $this->blockjustfinished = \false; - if (!isset($this->cell[$this->row][$this->col]['R']) || !$this->cell[$this->row][$this->col]['R']) { - if (isset($this->cell[$this->row][$this->col]['s'])) { - $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($e, \false, $this->OTLdata, $this->textvar); - } else { - $this->cell[$this->row][$this->col]['s'] = $this->GetStringWidth($e, \false, $this->OTLdata, $this->textvar); - } - if (!empty($this->spanborddet)) { - $this->cell[$this->row][$this->col]['s'] += (isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0) + (isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0); - } - } - $this->_saveCellTextBuffer($e, $this->HREF); - if (\substr($this->cell[$this->row][$this->col]['a'], 0, 1) == 'D') { - $dp = $this->decimal_align[\substr($this->cell[$this->row][$this->col]['a'], 0, 2)]; - $s = \preg_split('/' . \preg_quote($dp, '/') . '/', $e, 2); - // ? needs to be /u if not core - $s0 = $this->GetStringWidth($s[0], \false); - if (isset($s[1]) && $s[1]) { - $s1 = $this->GetStringWidth($s[1] . $dp, \false); - } else { - $s1 = 0; - } - if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'])) { - if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'] === \false) { - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'] = []; - } - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = $s0; - } else { - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = \max($s0, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0']); - } - if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'])) { - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = $s1; - } else { - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = \max($s1, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1']); - } - } - $this->nestedtablejustfinished = \false; - $this->linebreakjustfinished = \false; - } - } - /* -- END TABLES -- */ - } else { - if ($this->ignorefollowingspaces && !$this->ispre) { - $e = \ltrim($e); - if (!empty($this->OTLdata)) { - $this->otl->trimOTLdata($this->OTLdata, \true, \false); - } - // *OTL* - } - if ($e || $e === '0') { - $this->_saveTextBuffer($e, $this->HREF); - } - } - if ($e || $e === '0') { - $this->ignorefollowingspaces = \false; - // mPDF 6 - } - if (\substr($e, -1, 1) == ' ' && !$this->ispre && $this->FontFamily != 'csymbol' && $this->FontFamily != 'czapfdingbats') { - $this->ignorefollowingspaces = \true; - } - } else { - // TAG ** - if (isset($e[0]) && $e[0] == '/') { - $endtag = \trim(\strtoupper(\substr($e, 1))); - /* -- CSS-POSITION -- */ - // mPDF 6 - if ($this->inFixedPosBlock) { - if (\in_array($endtag, $this->outerblocktags) || \in_array($endtag, $this->innerblocktags)) { - $this->fixedPosBlockDepth--; - } - if ($this->fixedPosBlockDepth == 0) { - $this->fixedPosBlockSave[] = [$this->fixedPosBlock, $this->fixedPosBlockBBox, $this->page]; - $this->fixedPosBlock = ''; - $this->inFixedPosBlock = \false; - continue; - } - $this->fixedPosBlock .= '<' . $e . '>'; - continue; - } - /* -- END CSS-POSITION -- */ - // mPDF 6 - // Correct for tags where HTML5 specifies optional end tags (see also OpenTag() ) - if ($this->allow_html_optional_endtags && !$parseonly) { - if (isset($this->blk[$this->blklvl]['tag'])) { - $closed = \false; - // li end tag may be omitted if there is no more content in the parent element - if (!$closed && $this->blk[$this->blklvl]['tag'] == 'LI' && $endtag != 'LI' && (\in_array($endtag, $this->outerblocktags) || \in_array($endtag, $this->innerblocktags))) { - $this->tag->CloseTag('LI', $a, $i); - $closed = \true; - } - // dd end tag may be omitted if there is no more content in the parent element - if (!$closed && $this->blk[$this->blklvl]['tag'] == 'DD' && $endtag != 'DD' && (\in_array($endtag, $this->outerblocktags) || \in_array($endtag, $this->innerblocktags))) { - $this->tag->CloseTag('DD', $a, $i); - $closed = \true; - } - // p end tag may be omitted if there is no more content in the parent element and the parent element is not an A element [??????] - if (!$closed && $this->blk[$this->blklvl]['tag'] == 'P' && $endtag != 'P' && (\in_array($endtag, $this->outerblocktags) || \in_array($endtag, $this->innerblocktags))) { - $this->tag->CloseTag('P', $a, $i); - $closed = \true; - } - // option end tag may be omitted if there is no more content in the parent element - if (!$closed && $this->blk[$this->blklvl]['tag'] == 'OPTION' && $endtag != 'OPTION' && (\in_array($endtag, $this->outerblocktags) || \in_array($endtag, $this->innerblocktags))) { - $this->tag->CloseTag('OPTION', $a, $i); - $closed = \true; - } - } - /* -- TABLES -- */ - // Check for Table tags where HTML specifies optional end tags, - if ($endtag == 'TABLE') { - if ($this->lastoptionaltag == 'THEAD' || $this->lastoptionaltag == 'TBODY' || $this->lastoptionaltag == 'TFOOT') { - $this->tag->CloseTag($this->lastoptionaltag, $a, $i); - } - if ($this->lastoptionaltag == 'TR') { - $this->tag->CloseTag('TR', $a, $i); - } - if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { - $this->tag->CloseTag($this->lastoptionaltag, $a, $i); - $this->tag->CloseTag('TR', $a, $i); - } - } - if ($endtag == 'THEAD' || $endtag == 'TBODY' || $endtag == 'TFOOT') { - if ($this->lastoptionaltag == 'TR') { - $this->tag->CloseTag('TR', $a, $i); - } - if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { - $this->tag->CloseTag($this->lastoptionaltag, $a, $i); - $this->tag->CloseTag('TR', $a, $i); - } - } - if ($endtag == 'TR') { - if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { - $this->tag->CloseTag($this->lastoptionaltag, $a, $i); - } - } - /* -- END TABLES -- */ - } - // mPDF 6 - if ($this->blk[$this->blklvl]['hide']) { - if (\in_array($endtag, $this->outerblocktags) || \in_array($endtag, $this->innerblocktags)) { - unset($this->blk[$this->blklvl]); - $this->blklvl--; - } - continue; - } - // mPDF 6 - $this->tag->CloseTag($endtag, $a, $i); - // mPDF 6 - } else { - // OPENING TAG - if ($this->blk[$this->blklvl]['hide']) { - if (\strpos($e, ' ')) { - $te = \strtoupper(\substr($e, 0, \strpos($e, ' '))); - } else { - $te = \strtoupper($e); - } - // mPDF 6 - if ($te == 'THEAD' || $te == 'TBODY' || $te == 'TFOOT' || $te == 'TR' || $te == 'TD' || $te == 'TH') { - $this->lastoptionaltag = $te; - } - if (\in_array($te, $this->outerblocktags) || \in_array($te, $this->innerblocktags)) { - $this->blklvl++; - $this->blk[$this->blklvl]['hide'] = \true; - $this->blk[$this->blklvl]['tag'] = $te; - // mPDF 6 - } - continue; - } - /* -- CSS-POSITION -- */ - if ($this->inFixedPosBlock) { - if (\strpos($e, ' ')) { - $te = \strtoupper(\substr($e, 0, \strpos($e, ' '))); - } else { - $te = \strtoupper($e); - } - $this->fixedPosBlock .= '<' . $e . '>'; - if (\in_array($te, $this->outerblocktags) || \in_array($te, $this->innerblocktags)) { - $this->fixedPosBlockDepth++; - } - continue; - } - /* -- END CSS-POSITION -- */ - $regexp = '|=\'(.*?)\'|s'; - // eliminate single quotes, if any - $e = \preg_replace($regexp, "=\"\$1\"", $e); - // changes anykey=anyvalue to anykey="anyvalue" (only do this inside [some] tags) - if (\substr($e, 0, 10) != 'pageheader' && \substr($e, 0, 10) != 'pagefooter' && \substr($e, 0, 12) != 'tocpagebreak' && \substr($e, 0, 10) != 'indexentry' && \substr($e, 0, 8) != 'tocentry') { - // mPDF 6 (ZZZ99H) - $regexp = '| (\\w+?)=([^\\s>"]+)|si'; - $e = \preg_replace($regexp, " \$1=\"\$2\"", $e); - } - $e = \preg_replace('/ (\\S+?)\\s*=\\s*"/i', " \\1=\"", $e); - // Fix path values, if needed - $orig_srcpath = ''; - if (\stristr($e, "href=") !== \false or \stristr($e, "src=") !== \false) { - $regexp = '/ (href|src)\\s*=\\s*"(.*?)"/i'; - \preg_match($regexp, $e, $auxiliararray); - if (isset($auxiliararray[2])) { - $path = $auxiliararray[2]; - } else { - $path = ''; - } - if (\trim($path) != '' && !(\stristr($e, "src=") !== \false && \substr($path, 0, 4) == 'var:') && \substr($path, 0, 1) != '@') { - $path = \htmlspecialchars_decode($path); - // mPDF 5.7.4 URLs - $orig_srcpath = $path; - $this->GetFullPath($path); - $regexp = '/ (href|src)="(.*?)"/i'; - $e = \preg_replace($regexp, ' \\1="' . $path . '"', $e); - } - } - //END of Fix path values - // Extract attributes - $contents = []; - $contents1 = []; - $contents2 = []; - // Changed to allow style="background: url('bg.jpg')" - // Changed to improve performance; maximum length of \S (attribute) = 16 - // Increase allowed attribute name to 32 - cutting off "toc-even-header-name" etc. - \preg_match_all('/\\S{1,32}=["][^"]*["]/', $e, $contents1); - \preg_match_all('/\\S{1,32}=[\'][^\']*[\']/i', $e, $contents2); - $contents = \array_merge($contents1, $contents2); - \preg_match('/\\S+/', $e, $a2); - $tag = isset($a2[0]) ? \strtoupper($a2[0]) : ''; - $attr = []; - if ($orig_srcpath) { - $attr['ORIG_SRC'] = $orig_srcpath; - } - if (!empty($contents)) { - foreach ($contents[0] as $v) { - // Changed to allow style="background: url('bg.jpg')" - if (\preg_match('/^([^=]*)=["]?([^"]*)["]?$/', $v, $a3) || \preg_match('/^([^=]*)=[\']?([^\']*)[\']?$/', $v, $a3)) { - if (\strtoupper($a3[1]) == 'ID' || \strtoupper($a3[1]) == 'CLASS') { - // 4.2.013 Omits STYLE - $attr[\strtoupper($a3[1])] = \trim(\strtoupper($a3[2])); - } elseif (\preg_match('/^(HEADER|FOOTER)-STYLE/i', $a3[1])) { - $attr[\strtoupper($a3[1])] = \trim(\strtoupper($a3[2])); - } else { - $attr[\strtoupper($a3[1])] = \trim($a3[2]); - } - } - } - } - $this->tag->OpenTag($tag, $attr, $a, $i); - // mPDF 6 - /* -- CSS-POSITION -- */ - if ($this->inFixedPosBlock) { - $this->fixedPosBlockBBox = [$tag, $attr, $this->x, $this->y]; - $this->fixedPosBlock = ''; - $this->fixedPosBlockDepth = 1; - } - /* -- END CSS-POSITION -- */ - if (\preg_match('/\\/$/', $e)) { - $this->tag->CloseTag($tag, $a, $i); - } - } - } - // end TAG - } - // end of foreach($a as $i=>$e) - if ($close) { - // Close any open block tags - for ($b = $this->blklvl; $b > 0; $b--) { - $this->tag->CloseTag($this->blk[$b]['tag'], $a, $i); - } - // Output any text left in buffer - if (\count($this->textbuffer) && !$parseonly) { - $this->printbuffer($this->textbuffer); - } - if (!$parseonly) { - $this->textbuffer = []; - } - /* -- CSS-FLOAT -- */ - // If ended with a float, need to move to end page - $currpos = $this->page * 1000 + $this->y; - if (isset($this->blk[$this->blklvl]['float_endpos']) && $this->blk[$this->blklvl]['float_endpos'] > $currpos) { - $old_page = $this->page; - $new_page = \intval($this->blk[$this->blklvl]['float_endpos'] / 1000); - if ($old_page != $new_page) { - $s = $this->PrintPageBackgrounds(); - // Writes after the marker so not overwritten later by page background etc. - $this->pages[$this->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); - $this->pageBackgrounds = []; - $this->page = $new_page; - $this->ResetMargins(); - $this->Reset(); - $this->pageoutput[$this->page] = []; - } - $this->y = \round($this->blk[$this->blklvl]['float_endpos'] * 1000) % 1000000 / 1000; - // mod changes operands to integers before processing - } - /* -- END CSS-FLOAT -- */ - /* -- CSS-IMAGE-FLOAT -- */ - $this->printfloatbuffer(); - /* -- END CSS-IMAGE-FLOAT -- */ - // Create Internal Links, if needed - if (!empty($this->internallink)) { - foreach ($this->internallink as $k => $v) { - if (\strpos($k, "#") !== \false) { - continue; - } - if (!\is_array($v)) { - continue; - } - $ypos = $v['Y']; - $pagenum = $v['PAGE']; - $sharp = "#"; - while (\array_key_exists($sharp . $k, $this->internallink)) { - $internallink = $this->internallink[$sharp . $k]; - $this->SetLink($internallink, $ypos, $pagenum); - $sharp .= "#"; - } - } - } - $this->bufferoutput = \false; - /* -- CSS-POSITION -- */ - if (\count($this->fixedPosBlockSave)) { - foreach ($this->fixedPosBlockSave as $fpbs) { - $old_page = $this->page; - $this->page = $fpbs[2]; - $this->WriteFixedPosHTML($fpbs[0], 0, 0, 100, 100, 'auto', $fpbs[1]); - // 0,0,10,10 are overwritten by bbox - $this->page = $old_page; - } - $this->fixedPosBlockSave = []; - } - /* -- END CSS-POSITION -- */ - } - } - /* -- CSS-POSITION -- */ - function WriteFixedPosHTML($html, $x, $y, $w, $h, $overflow = 'visible', $bounding = []) - { - // $overflow can be 'hidden', 'visible' or 'auto' - 'auto' causes autofit to size - // Annotations disabled - enabled in mPDF 5.0 - // Links do work - // Will always go on current page (or start Page 1 if required) - // Probably INCOMPATIBLE WITH keep with table, columns etc. - // Called externally or interally via
- // When used internally, $x $y $w $h and $overflow are all overridden by $bounding - $overflow = \strtolower($overflow); - if ($this->state == 0) { - $this->AddPage($this->CurOrientation); - } - $save_y = $this->y; - $save_x = $this->x; - $this->fullImageHeight = $this->h; - $save_cols = \false; - /* -- COLUMNS -- */ - if ($this->ColActive) { - $save_cols = \true; - $save_nbcol = $this->NbCol; - // other values of gap and vAlign will not change by setting Columns off - $this->SetColumns(0); - } - /* -- END COLUMNS -- */ - $save_annots = $this->title2annots; - // *ANNOTATIONS* - $this->writingHTMLheader = \true; - // a FIX to stop pagebreaks etc. - $this->writingHTMLfooter = \true; - $this->InFooter = \true; - // suppresses autopagebreaks - $save_bgs = $this->pageBackgrounds; - $checkinnerhtml = \preg_replace('/\\s/', '', $html); - $rotate = 0; - if ($w > $this->w) { - $x = 0; - $w = $this->w; - } - if ($h > $this->h) { - $y = 0; - $h = $this->h; - } - if ($x > $this->w) { - $x = $this->w - $w; - } - if ($y > $this->h) { - $y = $this->h - $h; - } - if (!empty($bounding)) { - // $cont_ containing block = full physical page (position: absolute) or page inside margins (position: fixed) - // $bbox_ Bounding box is the
which is positioned absolutely/fixed - // top/left/right/bottom/width/height/background*/border*/padding*/margin* are taken from bounding - // font*[family/size/style/weight]/line-height/text*[align/decoration/transform/indent]/color are transferred to $inner - // as an enclosing
(after having checked ID/CLASS) - // $x, $y, $w, $h are inside of $bbox_ = containing box for $inner_ - // $inner_ InnerHTML is the contents of that block to be output - $tag = $bounding[0]; - $attr = $bounding[1]; - $orig_x0 = $bounding[2]; - $orig_y0 = $bounding[3]; - // As in WriteHTML() initialising - $this->blklvl = 0; - $this->lastblocklevelchange = 0; - $this->blk = []; - $this->initialiseBlock($this->blk[0]); - $this->blk[0]['width'] =& $this->pgwidth; - $this->blk[0]['inner_width'] =& $this->pgwidth; - $this->blk[0]['blockContext'] = $this->blockContext; - $properties = $this->cssManager->MergeCSS('BLOCK', 'BODY', ''); - $this->setCSS($properties, '', 'BODY'); - $this->blklvl = 1; - $this->initialiseBlock($this->blk[1]); - $this->blk[1]['tag'] = $tag; - $this->blk[1]['attr'] = $attr; - $this->Reset(); - $p = $this->cssManager->MergeCSS('BLOCK', $tag, $attr); - if (isset($p['ROTATE']) && ($p['ROTATE'] == 90 || $p['ROTATE'] == -90 || $p['ROTATE'] == 180)) { - $rotate = $p['ROTATE']; - } - // mPDF 6 - if (isset($p['OVERFLOW'])) { - $overflow = \strtolower($p['OVERFLOW']); - } - if (\strtolower($p['POSITION']) == 'fixed') { - $cont_w = $this->pgwidth; - // $this->blk[0]['inner_width']; - $cont_h = $this->h - $this->tMargin - $this->bMargin; - $cont_x = $this->lMargin; - $cont_y = $this->tMargin; - } else { - $cont_w = $this->w; - // ABSOLUTE; - $cont_h = $this->h; - $cont_x = 0; - $cont_y = 0; - } - // Pass on in-line properties to the innerhtml - $css = ''; - if (isset($p['TEXT-ALIGN'])) { - $css .= 'text-align: ' . \strtolower($p['TEXT-ALIGN']) . '; '; - } - if (isset($p['TEXT-TRANSFORM'])) { - $css .= 'text-transform: ' . \strtolower($p['TEXT-TRANSFORM']) . '; '; - } - if (isset($p['TEXT-INDENT'])) { - $css .= 'text-indent: ' . \strtolower($p['TEXT-INDENT']) . '; '; - } - if (isset($p['TEXT-DECORATION'])) { - $css .= 'text-decoration: ' . \strtolower($p['TEXT-DECORATION']) . '; '; - } - if (isset($p['FONT-FAMILY'])) { - $css .= 'font-family: ' . \strtolower($p['FONT-FAMILY']) . '; '; - } - if (isset($p['FONT-STYLE'])) { - $css .= 'font-style: ' . \strtolower($p['FONT-STYLE']) . '; '; - } - if (isset($p['FONT-WEIGHT'])) { - $css .= 'font-weight: ' . \strtolower($p['FONT-WEIGHT']) . '; '; - } - if (isset($p['FONT-SIZE'])) { - $css .= 'font-size: ' . \strtolower($p['FONT-SIZE']) . '; '; - } - if (isset($p['LINE-HEIGHT'])) { - $css .= 'line-height: ' . \strtolower($p['LINE-HEIGHT']) . '; '; - } - if (isset($p['TEXT-SHADOW'])) { - $css .= 'text-shadow: ' . \strtolower($p['TEXT-SHADOW']) . '; '; - } - if (isset($p['LETTER-SPACING'])) { - $css .= 'letter-spacing: ' . \strtolower($p['LETTER-SPACING']) . '; '; - } - // mPDF 6 - if (isset($p['FONT-VARIANT-POSITION'])) { - $css .= 'font-variant-position: ' . \strtolower($p['FONT-VARIANT-POSITION']) . '; '; - } - if (isset($p['FONT-VARIANT-CAPS'])) { - $css .= 'font-variant-caps: ' . \strtolower($p['FONT-VARIANT-CAPS']) . '; '; - } - if (isset($p['FONT-VARIANT-LIGATURES'])) { - $css .= 'font-variant-ligatures: ' . \strtolower($p['FONT-VARIANT-LIGATURES']) . '; '; - } - if (isset($p['FONT-VARIANT-NUMERIC'])) { - $css .= 'font-variant-numeric: ' . \strtolower($p['FONT-VARIANT-NUMERIC']) . '; '; - } - if (isset($p['FONT-VARIANT-ALTERNATES'])) { - $css .= 'font-variant-alternates: ' . \strtolower($p['FONT-VARIANT-ALTERNATES']) . '; '; - } - if (isset($p['FONT-FEATURE-SETTINGS'])) { - $css .= 'font-feature-settings: ' . \strtolower($p['FONT-FEATURE-SETTINGS']) . '; '; - } - if (isset($p['FONT-LANGUAGE-OVERRIDE'])) { - $css .= 'font-language-override: ' . \strtolower($p['FONT-LANGUAGE-OVERRIDE']) . '; '; - } - if (isset($p['FONT-KERNING'])) { - $css .= 'font-kerning: ' . \strtolower($p['FONT-KERNING']) . '; '; - } - if (isset($p['COLOR'])) { - $css .= 'color: ' . \strtolower($p['COLOR']) . '; '; - } - if (isset($p['Z-INDEX'])) { - $css .= 'z-index: ' . $p['Z-INDEX'] . '; '; - } - if ($css) { - $html = '
' . $html . '
'; - } - // Copy over (only) the properties to set for border and background - $pb = []; - $pb['MARGIN-TOP'] = isset($p['MARGIN-TOP']) ? $p['MARGIN-TOP'] : ''; - $pb['MARGIN-RIGHT'] = isset($p['MARGIN-RIGHT']) ? $p['MARGIN-RIGHT'] : ''; - $pb['MARGIN-BOTTOM'] = isset($p['MARGIN-BOTTOM']) ? $p['MARGIN-BOTTOM'] : ''; - $pb['MARGIN-LEFT'] = isset($p['MARGIN-LEFT']) ? $p['MARGIN-LEFT'] : ''; - $pb['PADDING-TOP'] = isset($p['PADDING-TOP']) ? $p['PADDING-TOP'] : ''; - $pb['PADDING-RIGHT'] = isset($p['PADDING-RIGHT']) ? $p['PADDING-RIGHT'] : ''; - $pb['PADDING-BOTTOM'] = isset($p['PADDING-BOTTOM']) ? $p['PADDING-BOTTOM'] : ''; - $pb['PADDING-LEFT'] = isset($p['PADDING-LEFT']) ? $p['PADDING-LEFT'] : ''; - $pb['BORDER-TOP'] = isset($p['BORDER-TOP']) ? $p['BORDER-TOP'] : ''; - $pb['BORDER-RIGHT'] = isset($p['BORDER-RIGHT']) ? $p['BORDER-RIGHT'] : ''; - $pb['BORDER-BOTTOM'] = isset($p['BORDER-BOTTOM']) ? $p['BORDER-BOTTOM'] : ''; - $pb['BORDER-LEFT'] = isset($p['BORDER-LEFT']) ? $p['BORDER-LEFT'] : ''; - if (isset($p['BORDER-TOP-LEFT-RADIUS-H'])) { - $pb['BORDER-TOP-LEFT-RADIUS-H'] = $p['BORDER-TOP-LEFT-RADIUS-H']; - } - if (isset($p['BORDER-TOP-LEFT-RADIUS-V'])) { - $pb['BORDER-TOP-LEFT-RADIUS-V'] = $p['BORDER-TOP-LEFT-RADIUS-V']; - } - if (isset($p['BORDER-TOP-RIGHT-RADIUS-H'])) { - $pb['BORDER-TOP-RIGHT-RADIUS-H'] = $p['BORDER-TOP-RIGHT-RADIUS-H']; - } - if (isset($p['BORDER-TOP-RIGHT-RADIUS-V'])) { - $pb['BORDER-TOP-RIGHT-RADIUS-V'] = $p['BORDER-TOP-RIGHT-RADIUS-V']; - } - if (isset($p['BORDER-BOTTOM-LEFT-RADIUS-H'])) { - $pb['BORDER-BOTTOM-LEFT-RADIUS-H'] = $p['BORDER-BOTTOM-LEFT-RADIUS-H']; - } - if (isset($p['BORDER-BOTTOM-LEFT-RADIUS-V'])) { - $pb['BORDER-BOTTOM-LEFT-RADIUS-V'] = $p['BORDER-BOTTOM-LEFT-RADIUS-V']; - } - if (isset($p['BORDER-BOTTOM-RIGHT-RADIUS-H'])) { - $pb['BORDER-BOTTOM-RIGHT-RADIUS-H'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-H']; - } - if (isset($p['BORDER-BOTTOM-RIGHT-RADIUS-V'])) { - $pb['BORDER-BOTTOM-RIGHT-RADIUS-V'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-V']; - } - if (isset($p['BACKGROUND-COLOR'])) { - $pb['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; - } - if (isset($p['BOX-SHADOW'])) { - $pb['BOX-SHADOW'] = $p['BOX-SHADOW']; - } - /* -- BACKGROUNDS -- */ - if (isset($p['BACKGROUND-IMAGE'])) { - $pb['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; - } - if (isset($p['BACKGROUND-IMAGE-RESIZE'])) { - $pb['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; - } - if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { - $pb['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; - } - if (isset($p['BACKGROUND-REPEAT'])) { - $pb['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; - } - if (isset($p['BACKGROUND-POSITION'])) { - $pb['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; - } - if (isset($p['BACKGROUND-GRADIENT'])) { - $pb['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; - } - if (isset($p['BACKGROUND-SIZE'])) { - $pb['BACKGROUND-SIZE'] = $p['BACKGROUND-SIZE']; - } - if (isset($p['BACKGROUND-ORIGIN'])) { - $pb['BACKGROUND-ORIGIN'] = $p['BACKGROUND-ORIGIN']; - } - if (isset($p['BACKGROUND-CLIP'])) { - $pb['BACKGROUND-CLIP'] = $p['BACKGROUND-CLIP']; - } - /* -- END BACKGROUNDS -- */ - $this->setCSS($pb, 'BLOCK', $tag); - // ================================================================ - $bbox_br = $this->blk[1]['border_right']['w']; - $bbox_bl = $this->blk[1]['border_left']['w']; - $bbox_bt = $this->blk[1]['border_top']['w']; - $bbox_bb = $this->blk[1]['border_bottom']['w']; - $bbox_pr = $this->blk[1]['padding_right']; - $bbox_pl = $this->blk[1]['padding_left']; - $bbox_pt = $this->blk[1]['padding_top']; - $bbox_pb = $this->blk[1]['padding_bottom']; - $bbox_mr = $this->blk[1]['margin_right']; - if (isset($p['MARGIN-RIGHT']) && \strtolower($p['MARGIN-RIGHT']) == 'auto') { - $bbox_mr = 'auto'; - } - $bbox_ml = $this->blk[1]['margin_left']; - if (isset($p['MARGIN-LEFT']) && \strtolower($p['MARGIN-LEFT']) == 'auto') { - $bbox_ml = 'auto'; - } - $bbox_mt = $this->blk[1]['margin_top']; - if (isset($p['MARGIN-TOP']) && \strtolower($p['MARGIN-TOP']) == 'auto') { - $bbox_mt = 'auto'; - } - $bbox_mb = $this->blk[1]['margin_bottom']; - if (isset($p['MARGIN-BOTTOM']) && \strtolower($p['MARGIN-BOTTOM']) == 'auto') { - $bbox_mb = 'auto'; - } - if (isset($p['LEFT']) && \strtolower($p['LEFT']) != 'auto') { - $bbox_left = $this->sizeConverter->convert($p['LEFT'], $cont_w, $this->FontSize, \false); - } else { - $bbox_left = 'auto'; - } - if (isset($p['TOP']) && \strtolower($p['TOP']) != 'auto') { - $bbox_top = $this->sizeConverter->convert($p['TOP'], $cont_h, $this->FontSize, \false); - } else { - $bbox_top = 'auto'; - } - if (isset($p['RIGHT']) && \strtolower($p['RIGHT']) != 'auto') { - $bbox_right = $this->sizeConverter->convert($p['RIGHT'], $cont_w, $this->FontSize, \false); - } else { - $bbox_right = 'auto'; - } - if (isset($p['BOTTOM']) && \strtolower($p['BOTTOM']) != 'auto') { - $bbox_bottom = $this->sizeConverter->convert($p['BOTTOM'], $cont_h, $this->FontSize, \false); - } else { - $bbox_bottom = 'auto'; - } - if (isset($p['WIDTH']) && \strtolower($p['WIDTH']) != 'auto') { - $inner_w = $this->sizeConverter->convert($p['WIDTH'], $cont_w, $this->FontSize, \false); - } else { - $inner_w = 'auto'; - } - if (isset($p['HEIGHT']) && \strtolower($p['HEIGHT']) != 'auto') { - $inner_h = $this->sizeConverter->convert($p['HEIGHT'], $cont_h, $this->FontSize, \false); - } else { - $inner_h = 'auto'; - } - // If bottom or right pos are set and not left / top - save this to adjust rotated block later - if ($rotate == 90 || $rotate == -90) { - // mPDF 6 - if ($bbox_left === 'auto' && $bbox_right !== 'auto') { - $rot_rpos = $bbox_right; - } else { - $rot_rpos = \false; - } - if ($bbox_top === 'auto' && $bbox_bottom !== 'auto') { - $rot_bpos = $bbox_bottom; - } else { - $rot_bpos = \false; - } - } - // ================================================================ - if ($checkinnerhtml == '' && $inner_h === 'auto') { - $inner_h = 0.0001; - } - if ($checkinnerhtml == '' && $inner_w === 'auto') { - $inner_w = 2 * $this->GetCharWidth('W', \false); - } - // ================================================================ - // Algorithm from CSS2.1 See http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height - // mPD 5.3.14 - // Special case (not CSS) if all not specified, centre vertically on page - $bbox_top_orig = ''; - if ($bbox_top === 'auto' && $inner_h === 'auto' && $bbox_bottom === 'auto' && $bbox_mt === 'auto' && $bbox_mb === 'auto') { - $bbox_top_orig = $bbox_top; - if ($bbox_mt === 'auto') { - $bbox_mt = 0; - } - if ($bbox_mb === 'auto') { - $bbox_mb = 0; - } - $bbox_top = $orig_y0 - $bbox_mt - $cont_y; - // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' - } elseif ($bbox_top === 'auto' && $inner_h === 'auto' && $bbox_bottom === 'auto') { - $bbox_top_orig = $bbox_top = $orig_y0 - $cont_y; - if ($bbox_mt === 'auto') { - $bbox_mt = 0; - } - if ($bbox_mb === 'auto') { - $bbox_mb = 0; - } - // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' - } elseif ($bbox_top !== 'auto' && $inner_h !== 'auto' && $bbox_bottom !== 'auto') { - if ($bbox_mt === 'auto' && $bbox_mb === 'auto') { - $x = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; - $bbox_mt = $bbox_mb = $x / 2; - } elseif ($bbox_mt === 'auto') { - $bbox_mt = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; - } elseif ($bbox_mb === 'auto') { - $bbox_mb = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; - } else { - $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; - } - } else { - if ($bbox_mt === 'auto') { - $bbox_mt = 0; - } - if ($bbox_mb === 'auto') { - $bbox_mb = 0; - } - if ($bbox_top === 'auto' && $inner_h === 'auto' && $bbox_bottom !== 'auto') { - // solve for $bbox_top when content_h known - $inner_h=='auto' && $bbox_top =='auto' - } elseif ($bbox_top === 'auto' && $bbox_bottom === 'auto' && $inner_h !== 'auto') { - $bbox_top = $orig_y0 - $bbox_mt - $cont_y; - $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; - } elseif ($inner_h === 'auto' && $bbox_bottom === 'auto' && $bbox_top !== 'auto') { - // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' - } elseif ($bbox_top === 'auto' && $inner_h !== 'auto' && $bbox_bottom !== 'auto') { - $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; - } elseif ($inner_h === 'auto' && $bbox_top !== 'auto' && $bbox_bottom !== 'auto') { - $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; - } elseif ($bbox_bottom === 'auto' && $bbox_top !== 'auto' && $inner_h !== 'auto') { - $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; - } - } - // THEN DO SAME FOR WIDTH - // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width - if ($bbox_left === 'auto' && $inner_w === 'auto' && $bbox_right === 'auto') { - if ($bbox_ml === 'auto') { - $bbox_ml = 0; - } - if ($bbox_mr === 'auto') { - $bbox_mr = 0; - } - // IF containing element RTL, should set $bbox_right - $bbox_left = $orig_x0 - $bbox_ml - $cont_x; - // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' - } elseif ($bbox_left !== 'auto' && $inner_w !== 'auto' && $bbox_right !== 'auto') { - if ($bbox_ml === 'auto' && $bbox_mr === 'auto') { - $x = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; - $bbox_ml = $bbox_mr = $x / 2; - } elseif ($bbox_ml === 'auto') { - $bbox_ml = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; - } elseif ($bbox_mr === 'auto') { - $bbox_mr = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; - } else { - $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; - } - } else { - if ($bbox_ml === 'auto') { - $bbox_ml = 0; - } - if ($bbox_mr === 'auto') { - $bbox_mr = 0; - } - if ($bbox_left === 'auto' && $inner_w === 'auto' && $bbox_right !== 'auto') { - // solve for $bbox_left when content_w known - $inner_w=='auto' && $bbox_left =='auto' - } elseif ($bbox_left === 'auto' && $bbox_right === 'auto' && $inner_w !== 'auto') { - // IF containing element RTL, should set $bbox_right - $bbox_left = $orig_x0 - $bbox_ml - $cont_x; - $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; - } elseif ($inner_w === 'auto' && $bbox_right === 'auto' && $bbox_left !== 'auto') { - // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' - } elseif ($bbox_left === 'auto' && $inner_w !== 'auto' && $bbox_right !== 'auto') { - $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; - } elseif ($inner_w === 'auto' && $bbox_left !== 'auto' && $bbox_right !== 'auto') { - $inner_w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; - } elseif ($bbox_right === 'auto' && $bbox_left !== 'auto' && $inner_w !== 'auto') { - $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; - } - } - // ================================================================ - // ================================================================ - /* -- BACKGROUNDS -- */ - if (isset($pb['BACKGROUND-IMAGE']) && $pb['BACKGROUND-IMAGE']) { - $ret = $this->SetBackground($pb, $this->blk[1]['inner_width']); - if ($ret) { - $this->blk[1]['background-image'] = $ret; - } - } - /* -- END BACKGROUNDS -- */ - $bbox_top_auto = $bbox_top === 'auto'; - $bbox_left_auto = $bbox_left === 'auto'; - $bbox_right_auto = $bbox_right === 'auto'; - $bbox_bottom_auto = $bbox_bottom === 'auto'; - $bbox_top = \is_numeric($bbox_top) ? $bbox_top : 0; - $bbox_left = \is_numeric($bbox_left) ? $bbox_left : 0; - $bbox_right = \is_numeric($bbox_right) ? $bbox_right : 0; - $bbox_bottom = \is_numeric($bbox_bottom) ? $bbox_bottom : 0; - $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; - $h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; - $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; - $w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; - // Set (temporary) values for x y w h to do first paint, if values are auto - if ($inner_h === 'auto' && $bbox_top_auto) { - $y = $cont_y + $bbox_mt + $bbox_bt + $bbox_pt; - $h = $cont_h - ($bbox_bottom + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); - } elseif ($inner_h === 'auto' && $bbox_bottom_auto) { - $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; - $h = $cont_h - ($bbox_top + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); - } - if ($inner_w === 'auto' && $bbox_left_auto) { - $x = $cont_x + $bbox_ml + $bbox_bl + $bbox_pl; - $w = $cont_w - ($bbox_right + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); - } elseif ($inner_w === 'auto' && $bbox_right_auto) { - $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; - $w = $cont_w - ($bbox_left + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); - } - $bbox_y = $cont_y + $bbox_top + $bbox_mt; - $bbox_x = $cont_x + $bbox_left + $bbox_ml; - $saved_block1 = $this->blk[1]; - unset($p); - unset($pb); - // ================================================================ - if ($inner_w === 'auto') { - // do a first write - $this->lMargin = $x; - $this->rMargin = $this->w - $w - $x; - // SET POSITION & FONT VALUES - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->pageoutput[$this->page] = []; - $this->x = $x; - $this->y = $y; - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = []; - $this->maxPosR = 0; - $this->maxPosL = $this->w; - // For RTL - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $inner_w = $this->maxPosR - $this->lMargin; - if ($bbox_right_auto) { - $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; - } elseif ($bbox_left_auto) { - $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; - $bbox_x = $cont_x + $bbox_left + $bbox_ml; - $inner_x = $bbox_x + $bbox_bl + $bbox_pl; - $x = $inner_x; - } - $w = $inner_w; - $bbox_y = $cont_y + $bbox_top + $bbox_mt; - $bbox_x = $cont_x + $bbox_left + $bbox_ml; - } - if ($inner_h === 'auto') { - // do a first write - $this->lMargin = $x; - $this->rMargin = $this->w - $w - $x; - // SET POSITION & FONT VALUES - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->pageoutput[$this->page] = []; - $this->x = $x; - $this->y = $y; - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = []; - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $inner_h = $this->y - $y; - if ($overflow != 'hidden' && $overflow != 'visible') { - // constrained - if ($this->y + $bbox_pb + $bbox_bb > $cont_y + $cont_h) { - $adj = $this->y + $bbox_pb + $bbox_bb - ($cont_y + $cont_h); - $inner_h -= $adj; - } - } - if ($bbox_bottom_auto && $bbox_top_orig === 'auto') { - $bbox_bottom = $bbox_top = ($cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb) / 2; - if ($overflow != 'hidden' && $overflow != 'visible') { - // constrained - if ($bbox_top < 0) { - $bbox_top = 0; - $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; - } - } - $bbox_y = $cont_y + $bbox_top + $bbox_mt; - $inner_y = $bbox_y + $bbox_bt + $bbox_pt; - $y = $inner_y; - } elseif ($bbox_bottom_auto) { - $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb; - } elseif ($bbox_top_auto) { - $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; - if ($overflow != 'hidden' && $overflow != 'visible') { - // constrained - if ($bbox_top < 0) { - $bbox_top = 0; - $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; - } - } - $bbox_y = $cont_y + $bbox_top + $bbox_mt; - $inner_y = $bbox_y + $bbox_bt + $bbox_pt; - $y = $inner_y; - } - $h = $inner_h; - $bbox_y = $cont_y + $bbox_top + $bbox_mt; - $bbox_x = $cont_x + $bbox_left + $bbox_ml; - } - $inner_w = $w; - $inner_h = $h; - } - $this->lMargin = $x; - $this->rMargin = $this->w - $w - $x; - // SET POSITION & FONT VALUES - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->pageoutput[$this->page] = []; - $this->x = $x; - $this->y = $y; - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = []; - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $actual_h = $this->y - $y; - $use_w = $w; - $use_h = $h; - $ratio = $actual_h / $use_w; - if ($overflow != 'hidden' && $overflow != 'visible') { - $target = $h / $w; - if ($target > 0) { - if ($ratio / $target > 1) { - $nl = \ceil($actual_h / $this->lineheight); - $l = $use_w * $nl; - $est_w = \sqrt($l * $this->lineheight / $target) * 0.8; - $use_w += $est_w - $use_w - $w / 100; - } - $bpcstart = $ratio / $target; - $bpcctr = 1; - while ($ratio / $target > 1) { - // @log 'Auto-sizing fixed-position block $bpcctr++ - $this->x = $x; - $this->y = $y; - if ($ratio / $target > 1.5 || $ratio / $target < 0.6) { - $use_w += $w / $this->incrementFPR1; - } elseif ($ratio / $target > 1.2 || $ratio / $target < 0.85) { - $use_w += $w / $this->incrementFPR2; - } elseif ($ratio / $target > 1.1 || $ratio / $target < 0.91) { - $use_w += $w / $this->incrementFPR3; - } else { - $use_w += $w / $this->incrementFPR4; - } - $use_h = $use_w * $target; - $this->rMargin = $this->w - $use_w - $x; - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = []; - $this->WriteHTML($html, HTMLParserMode::HTML_HEADER_BUFFER); - $actual_h = $this->y - $y; - $ratio = $actual_h / $use_w; - } - } - } - $shrink_f = $w / $use_w; - // ================================================================ - $this->pages[$this->page] .= '___BEFORE_BORDERS___'; - $block_s = $this->PrintPageBackgrounds(); - // Save to print later inside clipping path - $this->pageBackgrounds = []; - // ================================================================ - if ($rotate == 90 || $rotate == -90) { - // mPDF 6 - $prerotw = $bbox_bl + $bbox_pl + $inner_w + $bbox_pr + $bbox_br; - $preroth = $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb; - $rot_start = " q\n"; - if ($rotate == 90) { - if ($rot_rpos !== \false) { - $adjw = $prerotw; - } else { - $adjw = $preroth; - } - // height before rotation - if ($rot_bpos !== \false) { - $adjh = -$prerotw + $preroth; - } else { - $adjh = 0; - } - } else { - if ($rot_rpos !== \false) { - $adjw = $prerotw - $preroth; - } else { - $adjw = 0; - } - if ($rot_bpos !== \false) { - $adjh = $preroth; - } else { - $adjh = $prerotw; - } - // width before rotation - } - $rot_start .= $this->transformTranslate($adjw, $adjh, \true) . "\n"; - $rot_start .= $this->transformRotate($rotate, $bbox_x, $bbox_y, \true) . "\n"; - $rot_end = " Q\n"; - } elseif ($rotate == 180) { - // mPDF 6 - $rot_start = " q\n"; - $rot_start .= $this->transformTranslate($bbox_bl + $bbox_pl + $inner_w + $bbox_pr + $bbox_br, $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb, \true) . "\n"; - $rot_start .= $this->transformRotate(180, $bbox_x, $bbox_y, \true) . "\n"; - $rot_end = " Q\n"; - } else { - $rot_start = ''; - $rot_end = ''; - } - // ================================================================ - if (!empty($bounding)) { - // WHEN HEIGHT // BOTTOM EDGE IS KNOWN and $this->y is set to the bottom - // Re-instate saved $this->blk[1] - $this->blk[1] = $saved_block1; - // These are only needed when painting border/background - $this->blk[1]['width'] = $bbox_w = $cont_w - $bbox_left - $bbox_ml - $bbox_mr - $bbox_right; - $this->blk[1]['x0'] = $bbox_x; - $this->blk[1]['y0'] = $bbox_y; - $this->blk[1]['startpage'] = $this->page; - $this->blk[1]['y1'] = $bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb; - $this->writer->write($rot_start); - $this->PaintDivBB('', 0, 1); - // Prints borders and sets backgrounds in $this->pageBackgrounds - $this->writer->write($rot_end); - } - $s = $this->PrintPageBackgrounds(); - $s = $rot_start . $s . $rot_end; - $this->pages[$this->page] = \preg_replace('/___BEFORE_BORDERS___/', "\n" . $s . "\n", $this->pages[$this->page]); - $this->pageBackgrounds = []; - $this->writer->write($rot_start); - // Clipping Output - if ($overflow == 'hidden') { - // Bounding rectangle to clip - $clip_y1 = $this->y; - if (!empty($bounding) && $this->y + $bbox_pb + $bbox_bb > $bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb) { - $clip_y1 = $bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb - ($bbox_pb + $bbox_bb); - } - // $op = 'W* n'; // Clipping - $op = 'W n'; - // Clipping alternative mode - $this->writer->write("q"); - $ch = $clip_y1 - $y; - $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F re %s', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$ch * Mpdf::SCALE, $op)); - if (!empty($block_s)) { - $tmp = "q\n" . \sprintf('%.3F %.3F %.3F %.3F re %s', $x * Mpdf::SCALE, ($this->h - $y) * Mpdf::SCALE, $w * Mpdf::SCALE, -$ch * Mpdf::SCALE, $op); - $tmp .= "\n" . $block_s . "\nQ"; - $block_s = $tmp; - } - } - if (!empty($block_s)) { - if ($shrink_f != 1) { - // i.e. autofit has resized the box - $tmp = "q\n" . $this->transformScale($shrink_f * 100, $shrink_f * 100, $x, $y, \true); - $tmp .= "\n" . $block_s . "\nQ"; - $block_s = $tmp; - } - $this->writer->write($block_s); - } - if ($shrink_f != 1) { - // i.e. autofit has resized the box - $this->StartTransform(); - $this->transformScale($shrink_f * 100, $shrink_f * 100, $x, $y); - } - $this->writer->write($this->headerbuffer); - if ($shrink_f != 1) { - // i.e. autofit has resized the box - $this->StopTransform(); - } - if ($overflow == 'hidden') { - // End clipping - $this->writer->write("Q"); - } - $this->writer->write($rot_end); - // Page Links - foreach ($this->HTMLheaderPageLinks as $lk) { - if ($rotate) { - $tmp = $lk[2]; - // Switch h - w - $lk[2] = $lk[3]; - $lk[3] = $tmp; - $lx1 = $lk[0] / Mpdf::SCALE; - $ly1 = $this->h - $lk[1] / Mpdf::SCALE; - if ($rotate == 90) { - $adjx = -($lx1 - $bbox_x) + ($preroth - ($ly1 - $bbox_y)); - $adjy = -($ly1 - $bbox_y) + ($lx1 - $bbox_x); - $lk[2] = -$lk[2]; - } elseif ($rotate == -90) { - $adjx = -($lx1 - $bbox_x) + ($ly1 - $bbox_y); - $adjy = -($ly1 - $bbox_y) - ($lx1 - $bbox_x) + $prerotw; - $lk[3] = -$lk[3]; - } - if ($rot_rpos !== \false) { - $adjx += $prerotw - $preroth; - } - if ($rot_bpos !== \false) { - $adjy += $preroth - $prerotw; - } - $lx1 += $adjx; - $ly1 += $adjy; - $lk[0] = $lx1 * Mpdf::SCALE; - $lk[1] = ($this->h - $ly1) * Mpdf::SCALE; - } - if ($shrink_f != 1) { - // i.e. autofit has resized the box - $lx1 = $lk[0] / Mpdf::SCALE - $x; - $lx2 = $x + $lx1 * $shrink_f; - $lk[0] = $lx2 * Mpdf::SCALE; - $ly1 = $this->h - $lk[1] / Mpdf::SCALE - $y; - $ly2 = $y + $ly1 * $shrink_f; - $lk[1] = ($this->h - $ly2) * Mpdf::SCALE; - $lk[2] *= $shrink_f; - // width - $lk[3] *= $shrink_f; - // height - } - $this->PageLinks[$this->page][] = $lk; - } - foreach ($this->HTMLheaderPageForms as $n => $f) { - if ($shrink_f != 1) { - // i.e. autofit has resized the box - $f['x'] = $x + ($f['x'] - $x) * $shrink_f; - $f['y'] = $y + ($f['y'] - $y) * $shrink_f; - $f['w'] *= $shrink_f; - $f['h'] *= $shrink_f; - $f['style']['fontsize'] *= $shrink_f; - } - $this->form->forms[$f['n']] = $f; - } - // Page Annotations - foreach ($this->HTMLheaderPageAnnots as $lk) { - if ($rotate) { - if ($rotate == 90) { - $adjx = -($lk['x'] - $bbox_x) + ($preroth - ($lk['y'] - $bbox_y)); - $adjy = -($lk['y'] - $bbox_y) + ($lk['x'] - $bbox_x); - } elseif ($rotate == -90) { - $adjx = -($lk['x'] - $bbox_x) + ($lk['y'] - $bbox_y); - $adjy = -($lk['y'] - $bbox_y) - ($lk['x'] - $bbox_x) + $prerotw; - } - if ($rot_rpos !== \false) { - $adjx += $prerotw - $preroth; - } - if ($rot_bpos !== \false) { - $adjy += $preroth - $prerotw; - } - $lk['x'] += $adjx; - $lk['y'] += $adjy; - } - if ($shrink_f != 1) { - // i.e. autofit has resized the box - $lk['x'] = $x + ($lk['x'] - $x) * $shrink_f; - $lk['y'] = $y + ($lk['y'] - $y) * $shrink_f; - } - $this->PageAnnots[$this->page][] = $lk; - } - // Restore - $this->headerbuffer = ''; - $this->HTMLheaderPageLinks = []; - $this->HTMLheaderPageAnnots = []; - $this->HTMLheaderPageForms = []; - $this->pageBackgrounds = $save_bgs; - $this->writingHTMLheader = \false; - $this->writingHTMLfooter = \false; - $this->fullImageHeight = \false; - $this->ResetMargins(); - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->SetXY($save_x, $save_y); - $this->title2annots = $save_annots; - // *ANNOTATIONS* - $this->InFooter = \false; - // turns back on autopagebreaks - $this->pageoutput[$this->page] = []; - $this->pageoutput[$this->page]['Font'] = ''; - /* -- COLUMNS -- */ - if ($save_cols) { - $this->SetColumns($save_nbcol, $this->colvAlign, $this->ColGap); - } - /* -- END COLUMNS -- */ - } - /* -- END CSS-POSITION -- */ - function initialiseBlock(&$blk) - { - $blk['margin_top'] = 0; - $blk['margin_left'] = 0; - $blk['margin_bottom'] = 0; - $blk['margin_right'] = 0; - $blk['padding_top'] = 0; - $blk['padding_left'] = 0; - $blk['padding_bottom'] = 0; - $blk['padding_right'] = 0; - $blk['border_top']['w'] = 0; - $blk['border_left']['w'] = 0; - $blk['border_bottom']['w'] = 0; - $blk['border_right']['w'] = 0; - $blk['direction'] = 'ltr'; - $blk['hide'] = \false; - $blk['outer_left_margin'] = 0; - $blk['outer_right_margin'] = 0; - $blk['cascadeCSS'] = []; - $blk['block-align'] = \false; - $blk['bgcolor'] = \false; - $blk['page_break_after_avoid'] = \false; - $blk['keep_block_together'] = \false; - $blk['float'] = \false; - $blk['line_height'] = ''; - $blk['margin_collapse'] = \false; - } - function border_details($bd) - { - $prop = \preg_split('/\\s+/', \trim($bd)); - if (isset($this->blk[$this->blklvl]['inner_width'])) { - $refw = $this->blk[$this->blklvl]['inner_width']; - } elseif (isset($this->blk[$this->blklvl - 1]['inner_width'])) { - $refw = $this->blk[$this->blklvl - 1]['inner_width']; - } else { - $refw = $this->w; - } - if (\count($prop) == 1) { - $bsize = $this->sizeConverter->convert($prop[0], $refw, $this->FontSize, \false); - if ($bsize > 0) { - return ['s' => 1, 'w' => $bsize, 'c' => $this->colorConverter->convert(0, $this->PDFAXwarnings), 'style' => 'solid']; - } else { - return ['w' => 0, 's' => 0]; - } - } elseif (\count($prop) == 2) { - // 1px solid - if (\in_array($prop[1], $this->borderstyles) || $prop[1] == 'none' || $prop[1] == 'hidden') { - $prop[2] = ''; - } elseif (\in_array($prop[0], $this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden') { - $prop[0] = ''; - $prop[1] = $prop[0]; - $prop[2] = $prop[1]; - } else { - $prop[1] = ''; - $prop[2] = $prop[1]; - } - } elseif (\count($prop) == 3) { - // Change #000000 1px solid to 1px solid #000000 (proper) - if (\substr($prop[0], 0, 1) == '#') { - $tmp = $prop[0]; - $prop[0] = $prop[1]; - $prop[1] = $prop[2]; - $prop[2] = $tmp; - } elseif (\substr($prop[0], 1, 1) == '#') { - $tmp = $prop[1]; - $prop[0] = $prop[2]; - $prop[1] = $prop[0]; - $prop[2] = $tmp; - } elseif (\in_array($prop[0], $this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden') { - $tmp = $prop[0]; - $prop[0] = $prop[1]; - $prop[1] = $tmp; - } - } else { - return ['w' => 0, 's' => 0]; - } - // Size - $bsize = $this->sizeConverter->convert($prop[0], $refw, $this->FontSize, \false); - // color - $coul = $this->colorConverter->convert($prop[2], $this->PDFAXwarnings); - // returns array - // Style - $prop[1] = \strtolower($prop[1]); - if (\in_array($prop[1], $this->borderstyles) && $bsize > 0) { - $on = 1; - } elseif ($prop[1] == 'hidden') { - $on = 1; - $bsize = 0; - $coul = ''; - } elseif ($prop[1] == 'none') { - $on = 0; - $bsize = 0; - $coul = ''; - } else { - $on = 0; - $bsize = 0; - $coul = ''; - $prop[1] = ''; - } - return ['s' => $on, 'w' => $bsize, 'c' => $coul, 'style' => $prop[1], 'dom' => 0]; - } - /* -- END HTML-CSS -- */ - /* -- BORDER-RADIUS -- */ - function _borderPadding($a, $b, &$px, &$py) - { - // $px and py are padding long axis (x) and short axis (y) - $added = 0; - // extra padding - $x = $a - $px; - $y = $b - $py; - // Check if Falls within ellipse of border radius - if (($x + $added) * ($x + $added) / ($a * $a) + ($y + $added) * ($y + $added) / ($b * $b) <= 1) { - return \false; - } - $t = \atan2($y, $x); - $newx = $b / \sqrt($b * $b / ($a * $a) + \tan($t) * \tan($t)); - $newy = $a / \sqrt($a * $a / ($b * $b) + 1 / \tan($t) * (1 / \tan($t))); - $px = \max($px, $a - $newx + $added); - $py = \max($py, $b - $newy + $added); - } - /* -- END BORDER-RADIUS -- */ - /* -- HTML-CSS -- */ - /* -- CSS-PAGE -- */ - function SetPagedMediaCSS($name, $first, $oddEven) - { - if ($oddEven == 'E') { - if ($this->directionality == 'rtl') { - $side = 'R'; - } else { - $side = 'L'; - } - } else { - if ($this->directionality == 'rtl') { - $side = 'L'; - } else { - $side = 'R'; - } - } - $name = \strtoupper($name); - $p = []; - $p['SIZE'] = 'AUTO'; - // Uses mPDF original margins as default - $p['MARGIN-RIGHT'] = \strval($this->orig_rMargin) . 'mm'; - $p['MARGIN-LEFT'] = \strval($this->orig_lMargin) . 'mm'; - $p['MARGIN-TOP'] = \strval($this->orig_tMargin) . 'mm'; - $p['MARGIN-BOTTOM'] = \strval($this->orig_bMargin) . 'mm'; - $p['MARGIN-HEADER'] = \strval($this->orig_hMargin) . 'mm'; - $p['MARGIN-FOOTER'] = \strval($this->orig_fMargin) . 'mm'; - // Basic page + selector - if (isset($this->cssManager->CSS['@PAGE'])) { - $zp = $this->cssManager->CSS['@PAGE']; - } else { - $zp = []; - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - if (isset($p['EVEN-HEADER-NAME']) && $oddEven == 'E') { - $p['HEADER'] = $p['EVEN-HEADER-NAME']; - unset($p['EVEN-HEADER-NAME']); - } - if (isset($p['ODD-HEADER-NAME']) && $oddEven != 'E') { - $p['HEADER'] = $p['ODD-HEADER-NAME']; - unset($p['ODD-HEADER-NAME']); - } - if (isset($p['EVEN-FOOTER-NAME']) && $oddEven == 'E') { - $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; - unset($p['EVEN-FOOTER-NAME']); - } - if (isset($p['ODD-FOOTER-NAME']) && $oddEven != 'E') { - $p['FOOTER'] = $p['ODD-FOOTER-NAME']; - unset($p['ODD-FOOTER-NAME']); - } - // If right/Odd page - if (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>RIGHT']) && $side == 'R') { - $zp = $this->cssManager->CSS['@PAGE>>PSEUDO>>RIGHT']; - } else { - $zp = []; - } - if (isset($zp['SIZE'])) { - unset($zp['SIZE']); - } - if (isset($zp['SHEET-SIZE'])) { - unset($zp['SHEET-SIZE']); - } - // Disallow margin-left or -right on :LEFT or :RIGHT - if (isset($zp['MARGIN-LEFT'])) { - unset($zp['MARGIN-LEFT']); - } - if (isset($zp['MARGIN-RIGHT'])) { - unset($zp['MARGIN-RIGHT']); - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - // If left/Even page - if (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>LEFT']) && $side == 'L') { - $zp = $this->cssManager->CSS['@PAGE>>PSEUDO>>LEFT']; - } else { - $zp = []; - } - if (isset($zp['SIZE'])) { - unset($zp['SIZE']); - } - if (isset($zp['SHEET-SIZE'])) { - unset($zp['SHEET-SIZE']); - } - // Disallow margin-left or -right on :LEFT or :RIGHT - if (isset($zp['MARGIN-LEFT'])) { - unset($zp['MARGIN-LEFT']); - } - if (isset($zp['MARGIN-RIGHT'])) { - unset($zp['MARGIN-RIGHT']); - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - // If first page - if (isset($this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']) && $first) { - $zp = $this->cssManager->CSS['@PAGE>>PSEUDO>>FIRST']; - } else { - $zp = []; - } - if (isset($zp['SIZE'])) { - unset($zp['SIZE']); - } - if (isset($zp['SHEET-SIZE'])) { - unset($zp['SHEET-SIZE']); - } - // Disallow margin-left or -right on :FIRST // mPDF 5.7.3 - if (isset($zp['MARGIN-LEFT'])) { - unset($zp['MARGIN-LEFT']); - } - if (isset($zp['MARGIN-RIGHT'])) { - unset($zp['MARGIN-RIGHT']); - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - // If named page - if ($name) { - if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name])) { - $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name]; - } else { - $zp = []; - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - if (isset($p['EVEN-HEADER-NAME']) && $oddEven == 'E') { - $p['HEADER'] = $p['EVEN-HEADER-NAME']; - unset($p['EVEN-HEADER-NAME']); - } - if (isset($p['ODD-HEADER-NAME']) && $oddEven != 'E') { - $p['HEADER'] = $p['ODD-HEADER-NAME']; - unset($p['ODD-HEADER-NAME']); - } - if (isset($p['EVEN-FOOTER-NAME']) && $oddEven == 'E') { - $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; - unset($p['EVEN-FOOTER-NAME']); - } - if (isset($p['ODD-FOOTER-NAME']) && $oddEven != 'E') { - $p['FOOTER'] = $p['ODD-FOOTER-NAME']; - unset($p['ODD-FOOTER-NAME']); - } - // If named right/Odd page - if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>RIGHT']) && $side == 'R') { - $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>RIGHT']; - } else { - $zp = []; - } - if (isset($zp['SIZE'])) { - unset($zp['SIZE']); - } - if (isset($zp['SHEET-SIZE'])) { - unset($zp['SHEET-SIZE']); - } - // Disallow margin-left or -right on :LEFT or :RIGHT - if (isset($zp['MARGIN-LEFT'])) { - unset($zp['MARGIN-LEFT']); - } - if (isset($zp['MARGIN-RIGHT'])) { - unset($zp['MARGIN-RIGHT']); - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - // If named left/Even page - if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>LEFT']) && $side == 'L') { - $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>LEFT']; - } else { - $zp = []; - } - if (isset($zp['SIZE'])) { - unset($zp['SIZE']); - } - if (isset($zp['SHEET-SIZE'])) { - unset($zp['SHEET-SIZE']); - } - // Disallow margin-left or -right on :LEFT or :RIGHT - if (isset($zp['MARGIN-LEFT'])) { - unset($zp['MARGIN-LEFT']); - } - if (isset($zp['MARGIN-RIGHT'])) { - unset($zp['MARGIN-RIGHT']); - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - // If named first page - if (isset($this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>FIRST']) && $first) { - $zp = $this->cssManager->CSS['@PAGE>>NAMED>>' . $name . '>>PSEUDO>>FIRST']; - } else { - $zp = []; - } - if (isset($zp['SIZE'])) { - unset($zp['SIZE']); - } - if (isset($zp['SHEET-SIZE'])) { - unset($zp['SHEET-SIZE']); - } - // Disallow margin-left or -right on :FIRST // mPDF 5.7.3 - if (isset($zp['MARGIN-LEFT'])) { - unset($zp['MARGIN-LEFT']); - } - if (isset($zp['MARGIN-RIGHT'])) { - unset($zp['MARGIN-RIGHT']); - } - if (\is_array($zp) && !empty($zp)) { - $p = \array_merge($p, $zp); - } - } - $orientation = $mgl = $mgr = $mgt = $mgb = $mgh = $mgf = ''; - $header = $footer = ''; - $resetpagenum = $pagenumstyle = $suppress = ''; - $marks = ''; - $bg = []; - $newformat = ''; - if (isset($p['SHEET-SIZE']) && \is_array($p['SHEET-SIZE'])) { - $newformat = $p['SHEET-SIZE']; - if ($newformat[0] > $newformat[1]) { - // landscape - $newformat = \array_reverse($newformat); - $p['ORIENTATION'] = 'L'; - } else { - $p['ORIENTATION'] = 'P'; - } - $this->_setPageSize($newformat, $p['ORIENTATION']); - } - if (isset($p['SIZE']) && \is_array($p['SIZE']) && !$newformat) { - if ($p['SIZE']['W'] > $p['SIZE']['H']) { - $p['ORIENTATION'] = 'L'; - } else { - $p['ORIENTATION'] = 'P'; - } - } - if (\is_array($p['SIZE'])) { - if ($p['SIZE']['W'] > $this->fw) { - $p['SIZE']['W'] = $this->fw; - } - // mPD 4.2 use fw not fPt - if ($p['SIZE']['H'] > $this->fh) { - $p['SIZE']['H'] = $this->fh; - } - if ($p['ORIENTATION'] == $this->DefOrientation && !$newformat || $newformat && $p['ORIENTATION'] == 'P') { - $outer_width_LR = ($this->fw - $p['SIZE']['W']) / 2; - $outer_width_TB = ($this->fh - $p['SIZE']['H']) / 2; - } else { - $outer_width_LR = ($this->fh - $p['SIZE']['W']) / 2; - $outer_width_TB = ($this->fw - $p['SIZE']['H']) / 2; - } - $pgw = $p['SIZE']['W']; - $pgh = $p['SIZE']['H']; - } else { - // AUTO LANDSCAPE PORTRAIT - $outer_width_LR = 0; - $outer_width_TB = 0; - if (!$newformat) { - if (\strtoupper($p['SIZE']) == 'AUTO') { - $p['ORIENTATION'] = $this->DefOrientation; - } elseif (\strtoupper($p['SIZE']) == 'LANDSCAPE') { - $p['ORIENTATION'] = 'L'; - } else { - $p['ORIENTATION'] = 'P'; - } - } - if ($p['ORIENTATION'] == $this->DefOrientation && !$newformat || $newformat && $p['ORIENTATION'] == 'P') { - $pgw = $this->fw; - $pgh = $this->fh; - } else { - $pgw = $this->fh; - $pgh = $this->fw; - } - } - if (isset($p['HEADER']) && $p['HEADER']) { - $header = $p['HEADER']; - } - if (isset($p['FOOTER']) && $p['FOOTER']) { - $footer = $p['FOOTER']; - } - if (isset($p['RESETPAGENUM']) && $p['RESETPAGENUM']) { - $resetpagenum = $p['RESETPAGENUM']; - } - if (isset($p['PAGENUMSTYLE']) && $p['PAGENUMSTYLE']) { - $pagenumstyle = $p['PAGENUMSTYLE']; - } - if (isset($p['SUPPRESS']) && $p['SUPPRESS']) { - $suppress = $p['SUPPRESS']; - } - if (isset($p['MARKS'])) { - if (\preg_match('/cross/i', $p['MARKS']) && \preg_match('/crop/i', $p['MARKS'])) { - $marks = 'CROPCROSS'; - } elseif (\strtoupper($p['MARKS']) == 'CROP') { - $marks = 'CROP'; - } elseif (\strtoupper($p['MARKS']) == 'CROSS') { - $marks = 'CROSS'; - } - } - if (isset($p['BACKGROUND-COLOR']) && $p['BACKGROUND-COLOR']) { - $bg['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; - } - /* -- BACKGROUNDS -- */ - if (isset($p['BACKGROUND-GRADIENT']) && $p['BACKGROUND-GRADIENT']) { - $bg['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; - } - if (isset($p['BACKGROUND-IMAGE']) && $p['BACKGROUND-IMAGE']) { - $bg['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; - } - if (isset($p['BACKGROUND-REPEAT']) && $p['BACKGROUND-REPEAT']) { - $bg['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; - } - if (isset($p['BACKGROUND-POSITION']) && $p['BACKGROUND-POSITION']) { - $bg['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; - } - if (isset($p['BACKGROUND-IMAGE-RESIZE']) && $p['BACKGROUND-IMAGE-RESIZE']) { - $bg['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; - } - if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { - $bg['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; - } - /* -- END BACKGROUNDS -- */ - if (isset($p['MARGIN-LEFT'])) { - $mgl = $this->sizeConverter->convert($p['MARGIN-LEFT'], $pgw) + $outer_width_LR; - } - if (isset($p['MARGIN-RIGHT'])) { - $mgr = $this->sizeConverter->convert($p['MARGIN-RIGHT'], $pgw) + $outer_width_LR; - } - if (isset($p['MARGIN-BOTTOM'])) { - $mgb = $this->sizeConverter->convert($p['MARGIN-BOTTOM'], $pgh) + $outer_width_TB; - } - if (isset($p['MARGIN-TOP'])) { - $mgt = $this->sizeConverter->convert($p['MARGIN-TOP'], $pgh) + $outer_width_TB; - } - if (isset($p['MARGIN-HEADER'])) { - $mgh = $this->sizeConverter->convert($p['MARGIN-HEADER'], $pgh) + $outer_width_TB; - } - if (isset($p['MARGIN-FOOTER'])) { - $mgf = $this->sizeConverter->convert($p['MARGIN-FOOTER'], $pgh) + $outer_width_TB; - } - if (isset($p['ORIENTATION']) && $p['ORIENTATION']) { - $orientation = $p['ORIENTATION']; - } - $this->page_box['outer_width_LR'] = $outer_width_LR; - // Used in MARKS:crop etc. - $this->page_box['outer_width_TB'] = $outer_width_TB; - return [$orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $header, $footer, $bg, $resetpagenum, $pagenumstyle, $suppress, $marks, $newformat]; - } - /* -- END CSS-PAGE -- */ - /* -- CSS-FLOAT -- */ - // Added mPDF 3.0 Float DIV - CLEAR - function ClearFloats($clear, $blklvl = 0) - { - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($blklvl, \true); - $end = $currpos = $this->page * 1000 + $this->y; - if ($clear == 'BOTH' && ($l_exists || $r_exists)) { - $this->pageoutput[$this->page] = []; - $end = \max($l_max, $r_max, $currpos); - } elseif ($clear == 'RIGHT' && $r_exists) { - $this->pageoutput[$this->page] = []; - $end = \max($r_max, $currpos); - } elseif ($clear == 'LEFT' && $l_exists) { - $this->pageoutput[$this->page] = []; - $end = \max($l_max, $currpos); - } else { - return; - } - $old_page = $this->page; - $new_page = \intval($end / 1000); - if ($old_page != $new_page) { - $s = $this->PrintPageBackgrounds(); - // Writes after the marker so not overwritten later by page background etc. - $this->pages[$this->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); - $this->pageBackgrounds = []; - $this->page = $new_page; - } - $this->ResetMargins(); - $this->pageoutput[$this->page] = []; - $this->y = \round($end * 1000) % 1000000 / 1000; - // mod changes operands to integers before processing - } - // Added mPDF 3.0 Float DIV - function GetFloatDivInfo($blklvl = 0, $clear = \false) - { - // If blklvl specified, only returns floats at that level - for ClearFloats - $l_exists = \false; - $r_exists = \false; - $l_max = 0; - $r_max = 0; - $l_width = 0; - $r_width = 0; - if (\count($this->floatDivs)) { - $currpos = $this->page * 1000 + $this->y; - foreach ($this->floatDivs as $f) { - if ($clear && $f['blockContext'] == $this->blk[$blklvl]['blockContext'] || !$clear && $currpos >= $f['startpos'] && $currpos < $f['endpos'] - 0.001 && $f['blklvl'] > $blklvl && $f['blockContext'] == $this->blk[$blklvl]['blockContext']) { - if ($f['side'] == 'L') { - $l_exists = \true; - $l_max = \max($l_max, $f['endpos']); - $l_width = \max($l_width, $f['w']); - } - if ($f['side'] == 'R') { - $r_exists = \true; - $r_max = \max($r_max, $f['endpos']); - $r_width = \max($r_width, $f['w']); - } - } - } - } - return [$l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width]; - } - /* -- END CSS-FLOAT -- */ - // LIST MARKERS // mPDF 6 Lists - function _setListMarker($listitemtype, $listitemimage, $listitemposition) - { - // if position:inside (and NOT table) - output now as a textbuffer; (so if next is block, will move to new line) - // elseif position:outside (and NOT table) - output in front of first textbuffer output by setting listitem (cf. _saveTextBuffer) - $e = ''; - $this->listitem = ''; - $spacer = ' '; - // IMAGE - if ($listitemimage && $listitemimage != 'none') { - $listitemimage = \trim(\preg_replace('/url\\(["\']*(.*?)["\']*\\)/', '\\1', $listitemimage)); - // ? Restrict maximum height/width of list marker?? - $maxWidth = 100; - $maxHeight = 100; - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['padding_top'] = 0; - $objattr['padding_bottom'] = 0; - $objattr['padding_left'] = 0; - $objattr['padding_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['visibility'] = 'visible'; - $srcpath = $listitemimage; - $orig_srcpath = $listitemimage; - $objattr['vertical-align'] = 'BS'; - // vertical alignment of marker (baseline) - $w = 0; - $h = 0; - // Image file - $info = $this->imageProcessor->getImage($srcpath, \true, \true, $orig_srcpath); - if (!$info) { - return; - } - if ($info['w'] == 0 && $info['h'] == 0) { - $info['h'] = $this->sizeConverter->convert('1em', $this->blk[$this->blklvl]['inner_width'], $this->FontSize, \false); - } - $objattr['file'] = $srcpath; - // Default width and height calculation if needed - if ($w == 0 and $h == 0) { - /* -- IMAGES-WMF -- */ - if ($info['type'] == 'wmf') { - // WMF units are twips (1/20pt) - // divide by 20 to get points - // divide by k to get user units - $w = \abs($info['w']) / (20 * Mpdf::SCALE); - $h = \abs($info['h']) / (20 * Mpdf::SCALE); - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] == 'svg') { - // SVG units are pixels - $w = \abs($info['w']) / Mpdf::SCALE; - $h = \abs($info['h']) / Mpdf::SCALE; - } else { - // Put image at default image dpi - $w = $info['w'] / Mpdf::SCALE * (72 / $this->img_dpi); - $h = $info['h'] / Mpdf::SCALE * (72 / $this->img_dpi); - } - } - } - // IF WIDTH OR HEIGHT SPECIFIED - if ($w == 0) { - $w = \abs($h * $info['w'] / $info['h']); - } - if ($h == 0) { - $h = \abs($w * $info['h'] / $info['w']); - } - if ($w > $maxWidth) { - $w = $maxWidth; - $h = \abs($w * $info['h'] / $info['w']); - } - if ($h > $maxHeight) { - $h = $maxHeight; - $w = \abs($h * $info['w'] / $info['h']); - } - $objattr['type'] = 'image'; - $objattr['itype'] = $info['type']; - $objattr['orig_h'] = $info['h']; - $objattr['orig_w'] = $info['w']; - /* -- IMAGES-WMF -- */ - if ($info['type'] == 'wmf') { - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] == 'svg') { - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - } - } - $objattr['height'] = $h; - $objattr['width'] = $w; - $objattr['image_height'] = $h; - $objattr['image_width'] = $w; - $objattr['dir'] = isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'; - $objattr['listmarker'] = \true; - $objattr['listmarkerposition'] = $listitemposition; - $e = Mpdf::OBJECT_IDENTIFIER . "type=image,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - $this->_saveTextBuffer($e); - if ($listitemposition == 'inside') { - $e = $spacer; - $this->_saveTextBuffer($e); - } - } elseif ($listitemtype == 'disc' || $listitemtype == 'circle' || $listitemtype == 'square') { - // SYMBOL (needs new font) - $objattr = []; - $objattr['type'] = 'listmarker'; - $objattr['listmarkerposition'] = $listitemposition; - $objattr['width'] = 0; - $size = $this->sizeConverter->convert($this->list_symbol_size, $this->FontSize); - $objattr['size'] = $size; - $objattr['offset'] = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); - if ($listitemposition == 'inside') { - $objattr['width'] = $size + $objattr['offset']; - } - $objattr['height'] = $this->FontSize; - $objattr['vertical-align'] = 'T'; - $objattr['text'] = ''; - $objattr['dir'] = isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'; - $objattr['bullet'] = $listitemtype; - $objattr['colorarray'] = $this->colorarray; - $objattr['fontfamily'] = $this->FontFamily; - $objattr['fontsize'] = $this->FontSize; - $objattr['fontsizept'] = $this->FontSizePt; - $objattr['fontstyle'] = $this->FontStyle; - $e = Mpdf::OBJECT_IDENTIFIER . "type=listmarker,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - $this->listitem = $this->_saveTextBuffer($e, '', '', \true); - // true returns array - } elseif (\preg_match('/U\\+([a-fA-F0-9]+)/i', $listitemtype, $m)) { - // SYMBOL 2 (needs new font) - if ($this->_charDefined($this->CurrentFont['cw'], \hexdec($m[1]))) { - $list_item_marker = UtfString::codeHex2utf($m[1]); - } else { - $list_item_marker = '-'; - } - if (\preg_match('/rgb\\(.*?\\)/', $listitemtype, $m)) { - $list_item_color = $this->colorConverter->convert($m[0], $this->PDFAXwarnings); - } else { - $list_item_color = ''; - } - // SAVE then SET COLR - $save_colorarray = $this->colorarray; - if ($list_item_color) { - $this->colorarray = $list_item_color; - } - if ($listitemposition == 'inside') { - $e = $list_item_marker . $spacer; - $this->_saveTextBuffer($e); - } else { - $objattr = []; - $objattr['type'] = 'listmarker'; - $objattr['width'] = 0; - $objattr['height'] = $this->FontSize; - $objattr['vertical-align'] = 'T'; - $objattr['text'] = $list_item_marker; - $objattr['dir'] = isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'; - $objattr['colorarray'] = $this->colorarray; - $objattr['fontfamily'] = $this->FontFamily; - $objattr['fontsize'] = $this->FontSize; - $objattr['fontsizept'] = $this->FontSizePt; - $objattr['fontstyle'] = $this->FontStyle; - $e = Mpdf::OBJECT_IDENTIFIER . "type=listmarker,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - $this->listitem = $this->_saveTextBuffer($e, '', '', \true); - // true returns array - } - // RESET COLOR - $this->colorarray = $save_colorarray; - } else { - // TEXT - $counter = $this->listcounter[$this->listlvl]; - if ($listitemtype == 'none') { - return; - } - $num = $this->_getStyledNumber($counter, $listitemtype, \true); - if ($listitemposition == 'inside') { - $e = $num . $this->list_number_suffix . $spacer; - $this->_saveTextBuffer($e); - } else { - if (isset($this->blk[$this->blklvl]['direction']) && $this->blk[$this->blklvl]['direction'] == 'rtl') { - // REPLACE MIRRORED RTL $this->list_number_suffix e.g. ) -> ( (NB could use Ucdn::$mirror_pairs) - $m = \strtr($this->list_number_suffix, ")]}", "([{") . $num; - } else { - $m = $num . $this->list_number_suffix; - } - $objattr = []; - $objattr['type'] = 'listmarker'; - $objattr['width'] = 0; - $objattr['height'] = $this->FontSize; - $objattr['vertical-align'] = 'T'; - $objattr['text'] = $m; - $objattr['dir'] = isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : 'ltr'; - $objattr['colorarray'] = $this->colorarray; - $objattr['fontfamily'] = $this->FontFamily; - $objattr['fontsize'] = $this->FontSize; - $objattr['fontsizept'] = $this->FontSizePt; - $objattr['fontstyle'] = $this->FontStyle; - $e = Mpdf::OBJECT_IDENTIFIER . "type=listmarker,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - $this->listitem = $this->_saveTextBuffer($e, '', '', \true); - // true returns array - } - } - } - // mPDF Lists - function _getListMarkerWidth(&$currblk, &$a, &$i) - { - $blt_width = 0; - $markeroffset = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); - // Get Maximum number in the list - $maxnum = $this->listcounter[$this->listlvl]; - if ($currblk['list_style_type'] != 'disc' && $currblk['list_style_type'] != 'circle' && $currblk['list_style_type'] != 'square') { - $lvl = 1; - for ($j = $i + 2; $j < \count($a); $j += 2) { - $e = $a[$j]; - if (!$e) { - continue; - } - if ($e[0] == '/') { - // end tag - $e = \strtoupper(\substr($e, 1)); - if ($e == 'OL' || $e == 'UL') { - if ($lvl == 1) { - break; - } - $lvl--; - } - } else { - // opening tag - if (\strpos($e, ' ')) { - $e = \substr($e, 0, \strpos($e, ' ')); - } - $e = \strtoupper($e); - if ($e == 'LI') { - if ($lvl == 1) { - $maxnum++; - } - } elseif ($e == 'OL' || $e == 'UL') { - $lvl++; - } - } - } - } - $decToAlpha = new Conversion\DecToAlpha(); - $decToRoman = new Conversion\DecToRoman(); - $decToOther = new Conversion\DecToOther($this); - switch ($currblk['list_style_type']) { - case 'decimal': - case '1': - $blt_width = $this->GetStringWidth(\str_repeat('5', \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'none': - $blt_width = 0; - break; - case 'upper-alpha': - case 'upper-latin': - case 'A': - $maxnumA = $decToAlpha->convert($maxnum, \true); - if ($maxnum < 13) { - $blt_width = $this->GetStringWidth('D' . $this->list_number_suffix); - } else { - $blt_width = $this->GetStringWidth(\str_repeat('W', \strlen($maxnumA)) . $this->list_number_suffix); - } - break; - case 'lower-alpha': - case 'lower-latin': - case 'a': - $maxnuma = $decToAlpha->convert($maxnum, \false); - if ($maxnum < 13) { - $blt_width = $this->GetStringWidth('b' . $this->list_number_suffix); - } else { - $blt_width = $this->GetStringWidth(\str_repeat('m', \strlen($maxnuma)) . $this->list_number_suffix); - } - break; - case 'upper-roman': - case 'I': - if ($maxnum > 87) { - $bbit = 87; - } elseif ($maxnum > 86) { - $bbit = 86; - } elseif ($maxnum > 37) { - $bbit = 38; - } elseif ($maxnum > 36) { - $bbit = 37; - } elseif ($maxnum > 27) { - $bbit = 28; - } elseif ($maxnum > 26) { - $bbit = 27; - } elseif ($maxnum > 17) { - $bbit = 18; - } elseif ($maxnum > 16) { - $bbit = 17; - } elseif ($maxnum > 7) { - $bbit = 8; - } elseif ($maxnum > 6) { - $bbit = 7; - } elseif ($maxnum > 3) { - $bbit = 4; - } else { - $bbit = $maxnum; - } - $maxlnum = $decToRoman->convert($bbit, \true); - $blt_width = $this->GetStringWidth($maxlnum . $this->list_number_suffix); - break; - case 'lower-roman': - case 'i': - if ($maxnum > 87) { - $bbit = 87; - } elseif ($maxnum > 86) { - $bbit = 86; - } elseif ($maxnum > 37) { - $bbit = 38; - } elseif ($maxnum > 36) { - $bbit = 37; - } elseif ($maxnum > 27) { - $bbit = 28; - } elseif ($maxnum > 26) { - $bbit = 27; - } elseif ($maxnum > 17) { - $bbit = 18; - } elseif ($maxnum > 16) { - $bbit = 17; - } elseif ($maxnum > 7) { - $bbit = 8; - } elseif ($maxnum > 6) { - $bbit = 7; - } elseif ($maxnum > 3) { - $bbit = 4; - } else { - $bbit = $maxnum; - } - $maxlnum = $decToRoman->convert($bbit, \false); - $blt_width = $this->GetStringWidth($maxlnum . $this->list_number_suffix); - break; - case 'disc': - case 'circle': - case 'square': - $size = $this->sizeConverter->convert($this->list_symbol_size, $this->FontSize); - $offset = $this->sizeConverter->convert($this->list_marker_offset, $this->FontSize); - $blt_width = $size + $offset; - break; - case 'arabic-indic': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0x660), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'persian': - case 'urdu': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0x6f0), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'bengali': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0x9e6), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'devanagari': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0x966), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'gujarati': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0xae6), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'gurmukhi': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0xa66), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'kannada': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0xce6), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'malayalam': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(6, 0xd66), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'oriya': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0xb66), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'telugu': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(3, 0xc66), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'tamil': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(9, 0xbe6), \strlen($maxnum)) . $this->list_number_suffix); - break; - case 'thai': - $blt_width = $this->GetStringWidth(\str_repeat($decToOther->convert(5, 0xe50), \strlen($maxnum)) . $this->list_number_suffix); - break; - default: - $blt_width = $this->GetStringWidth(\str_repeat('5', \strlen($maxnum)) . $this->list_number_suffix); - break; - } - return $blt_width + $markeroffset; - } - function _saveTextBuffer($t, $link = '', $intlink = '', $return = \false) - { - // mPDF 6 Lists - $arr = []; - $arr[0] = $t; - if (isset($link) && $link) { - $arr[1] = $link; - } - $arr[2] = $this->currentfontstyle; - if (isset($this->colorarray) && $this->colorarray) { - $arr[3] = $this->colorarray; - } - $arr[4] = $this->currentfontfamily; - $arr[5] = $this->currentLang; - // mPDF 6 - if (isset($intlink) && $intlink) { - $arr[7] = $intlink; - } - // mPDF 6 - // If Kerning set for OTL, and useOTL has positive value, but has not set for this particular script, - // set for kerning via kern table - // e.g. Latin script when useOTL set as 0x80 - if (isset($this->OTLtags['Plus']) && \strpos($this->OTLtags['Plus'], 'kern') !== \false && empty($this->OTLdata['GPOSinfo'])) { - $this->textvar = $this->textvar | TextVars::FC_KERNING; - } - $arr[8] = $this->textvar; - // mPDF 5.7.1 - if (isset($this->textparam) && $this->textparam) { - $arr[9] = $this->textparam; - } - if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) { - $arr[10] = $this->spanbgcolorarray; - } - $arr[11] = $this->currentfontsize; - if (isset($this->ReqFontStyle) && $this->ReqFontStyle) { - $arr[12] = $this->ReqFontStyle; - } - if (isset($this->lSpacingCSS) && $this->lSpacingCSS) { - $arr[14] = $this->lSpacingCSS; - } - if (isset($this->wSpacingCSS) && $this->wSpacingCSS) { - $arr[15] = $this->wSpacingCSS; - } - if (isset($this->spanborddet) && $this->spanborddet) { - $arr[16] = $this->spanborddet; - } - if (isset($this->textshadow) && $this->textshadow) { - $arr[17] = $this->textshadow; - } - if (isset($this->OTLdata) && $this->OTLdata) { - $arr[18] = $this->OTLdata; - $this->OTLdata = []; - } else { - $arr[18] = null; - } - // mPDF 6 Lists - if ($return) { - return $arr; - } - if ($this->listitem) { - $this->textbuffer[] = $this->listitem; - $this->listitem = []; - } - $this->textbuffer[] = $arr; - } - function _saveCellTextBuffer($t, $link = '', $intlink = '') - { - $arr = []; - $arr[0] = $t; - if (isset($link) && $link) { - $arr[1] = $link; - } - $arr[2] = $this->currentfontstyle; - if (isset($this->colorarray) && $this->colorarray) { - $arr[3] = $this->colorarray; - } - $arr[4] = $this->currentfontfamily; - if (isset($intlink) && $intlink) { - $arr[7] = $intlink; - } - // mPDF 6 - // If Kerning set for OTL, and useOTL has positive value, but has not set for this particular script, - // set for kerning via kern table - // e.g. Latin script when useOTL set as 0x80 - if (isset($this->OTLtags['Plus']) && \strpos($this->OTLtags['Plus'], 'kern') !== \false && empty($this->OTLdata['GPOSinfo'])) { - $this->textvar = $this->textvar | TextVars::FC_KERNING; - } - $arr[8] = $this->textvar; - // mPDF 5.7.1 - if (isset($this->textparam) && $this->textparam) { - $arr[9] = $this->textparam; - } - if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) { - $arr[10] = $this->spanbgcolorarray; - } - $arr[11] = $this->currentfontsize; - if (isset($this->ReqFontStyle) && $this->ReqFontStyle) { - $arr[12] = $this->ReqFontStyle; - } - if (isset($this->lSpacingCSS) && $this->lSpacingCSS) { - $arr[14] = $this->lSpacingCSS; - } - if (isset($this->wSpacingCSS) && $this->wSpacingCSS) { - $arr[15] = $this->wSpacingCSS; - } - if (isset($this->spanborddet) && $this->spanborddet) { - $arr[16] = $this->spanborddet; - } - if (isset($this->textshadow) && $this->textshadow) { - $arr[17] = $this->textshadow; - } - if (isset($this->OTLdata) && $this->OTLdata) { - $arr[18] = $this->OTLdata; - $this->OTLdata = []; - } else { - $arr[18] = null; - } - $this->cell[$this->row][$this->col]['textbuffer'][] = $arr; - } - function printbuffer($arrayaux, $blockstate = 0, $is_table = \false, $table_draft = \false, $cell_dir = '') - { - // $blockstate = 0; // NO margins/padding - // $blockstate = 1; // Top margins/padding only - // $blockstate = 2; // Bottom margins/padding only - // $blockstate = 3; // Top & bottom margins/padding - $this->spanbgcolorarray = ''; - $this->spanbgcolor = \false; - $this->spanborder = \false; - $this->spanborddet = []; - $paint_ht_corr = 0; - /* -- CSS-FLOAT -- */ - if (\count($this->floatDivs)) { - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); - if ($this->blk[$this->blklvl]['inner_width'] - $l_width - $r_width < 2 * $this->GetCharWidth('W', \false)) { - // Too narrow to fit - try to move down past L or R float - if ($l_max < $r_max && $this->blk[$this->blklvl]['inner_width'] - $r_width > 2 * $this->GetCharWidth('W', \false)) { - $this->ClearFloats('LEFT', $this->blklvl); - } elseif ($r_max < $l_max && $this->blk[$this->blklvl]['inner_width'] - $l_width > 2 * $this->GetCharWidth('W', \false)) { - $this->ClearFloats('RIGHT', $this->blklvl); - } else { - $this->ClearFloats('BOTH', $this->blklvl); - } - } - } - /* -- END CSS-FLOAT -- */ - $bak_y = $this->y; - $bak_x = $this->x; - $align = ''; - if (!$is_table) { - if (isset($this->blk[$this->blklvl]['align']) && $this->blk[$this->blklvl]['align']) { - $align = $this->blk[$this->blklvl]['align']; - } - // Block-align is set by e.g. <.. align="center"> Takes priority for this block but not inherited - if (isset($this->blk[$this->blklvl]['block-align']) && $this->blk[$this->blklvl]['block-align']) { - $align = $this->blk[$this->blklvl]['block-align']; - } - if (isset($this->blk[$this->blklvl]['direction'])) { - $blockdir = $this->blk[$this->blklvl]['direction']; - } else { - $blockdir = ""; - } - $this->divwidth = $this->blk[$this->blklvl]['width']; - } else { - $align = $this->cellTextAlign; - $blockdir = $cell_dir; - } - $oldpage = $this->page; - // ADDED for Out of Block now done as Flowing Block - if ($this->divwidth == 0) { - $this->divwidth = $this->pgwidth; - } - if (!$is_table) { - $this->SetLineHeight($this->FontSizePt, $this->blk[$this->blklvl]['line_height']); - } - $this->divheight = $this->lineheight; - $old_height = $this->divheight; - // As a failsafe - if font has been set but not output to page - if (!$table_draft) { - $this->SetFont($this->default_font, '', $this->default_font_size, \true, \true); - // force output to page - } - $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, \true, $blockdir, $table_draft); - $array_size = \count($arrayaux); - // Added - Otherwise

did not output top margins/padding for 1st/2nd div - if ($array_size == 0) { - $this->finishFlowingBlock(\true); - } - // true = END of flowing block - // mPDF 6 - // ALL the chunks of textbuffer need to have at least basic OTLdata set - // First make sure each element/chunk has the OTLdata for Bidi set. - for ($i = 0; $i < $array_size; $i++) { - if (empty($arrayaux[$i][18])) { - if (\substr($arrayaux[$i][0], 0, 3) == Mpdf::OBJECT_IDENTIFIER) { - // object identifier has been identified! - $unicode = [0xfffc]; - // Object replacement character - } else { - $unicode = $this->UTF8StringToArray($arrayaux[$i][0], \false); - } - $is_strong = \false; - $this->getBasicOTLdata($arrayaux[$i][18], $unicode, $is_strong); - } - // Gets messed up if try and use core fonts inside a paragraph of text which needs to be BiDi re-ordered or OTLdata set - if (($blockdir == 'rtl' || $this->biDirectional) && isset($arrayaux[$i][4]) && \in_array($arrayaux[$i][4], ['ccourier', 'ctimes', 'chelvetica', 'csymbol', 'czapfdingbats'])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("You cannot use core fonts in a document which contains RTL text."); - } - } - // mPDF 6 - // Process bidirectional text ready for bidi-re-ordering (which is done after line-breaks are established in WriteFlowingBlock etc.) - if (($blockdir == 'rtl' || $this->biDirectional) && !$table_draft) { - if (empty($this->otl)) { - $this->otl = new Otl($this, $this->fontCache); - } - $this->otl->bidiPrepare($arrayaux, $blockdir); - $array_size = \count($arrayaux); - } - // Remove empty items // mPDF 6 - for ($i = $array_size - 1; $i > 0; $i--) { - if (empty($arrayaux[$i][0]) && (isset($arrayaux[$i][16]) && $arrayaux[$i][16] !== '0') && empty($arrayaux[$i][7])) { - unset($arrayaux[$i]); - } - } - // Correct adjoining borders for inline elements - if (isset($arrayaux[0][16])) { - $lastspanborder = $arrayaux[0][16]; - } else { - $lastspanborder = \false; - } - for ($i = 1; $i < $array_size; $i++) { - if (isset($arrayaux[$i][16]) && $arrayaux[$i][16] == $lastspanborder && (!isset($arrayaux[$i][9]['bord-decoration']) && !isset($arrayaux[$i - 1][9]['bord-decoration']) || isset($arrayaux[$i][9]['bord-decoration']) && isset($arrayaux[$i - 1][9]['bord-decoration']) && $arrayaux[$i][9]['bord-decoration'] == $arrayaux[$i - 1][9]['bord-decoration'])) { - if (isset($arrayaux[$i][16]['R'])) { - $lastspanborder = $arrayaux[$i][16]; - } else { - $lastspanborder = \false; - } - $arrayaux[$i][16]['L']['s'] = 0; - $arrayaux[$i][16]['L']['w'] = 0; - $arrayaux[$i - 1][16]['R']['s'] = 0; - $arrayaux[$i - 1][16]['R']['w'] = 0; - } else { - if (isset($arrayaux[$i][16]['R'])) { - $lastspanborder = $arrayaux[$i][16]; - } else { - $lastspanborder = \false; - } - } - } - for ($i = 0; $i < $array_size; $i++) { - // COLS - $oldcolumn = $this->CurrCol; - $vetor = isset($arrayaux[$i]) ? $arrayaux[$i] : null; - if ($i == 0 && $vetor[0] != "\n" && !$this->ispre) { - $vetor[0] = \ltrim($vetor[0]); - if (!empty($vetor[18])) { - $this->otl->trimOTLdata($vetor[18], \true, \false); - } - // *OTL* - } - // FIXED TO ALLOW IT TO SHOW '0' - if (empty($vetor[0]) && !($vetor[0] === '0') && empty($vetor[7])) { - // Ignore empty text and not carrying an internal link - // Check if it is the last element. If so then finish printing the block - if ($i == $array_size - 1) { - $this->finishFlowingBlock(\true); - } - // true = END of flowing block - continue; - } - // Activating buffer properties - if (isset($vetor[11]) && $vetor[11] != '') { - // Font Size - if ($is_table && $this->shrin_k) { - $this->SetFontSize($vetor[11] / $this->shrin_k, \false); - } else { - $this->SetFontSize($vetor[11], \false); - } - } - if (isset($vetor[17]) && !empty($vetor[17])) { - // TextShadow - $this->textshadow = $vetor[17]; - } - if (isset($vetor[16]) && !empty($vetor[16])) { - // Border - $this->spanborddet = $vetor[16]; - $this->spanborder = \true; - } - if (isset($vetor[15])) { - // Word spacing - $this->wSpacingCSS = $vetor[15]; - if ($this->wSpacingCSS && \strtoupper($this->wSpacingCSS) != 'NORMAL') { - $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize) / $this->shrin_k; - // mPDF 5.7.3 - } - } - if (isset($vetor[14])) { - // Letter spacing - $this->lSpacingCSS = $vetor[14]; - if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && \strtoupper($this->lSpacingCSS) != 'NORMAL') { - $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize) / $this->shrin_k; - // mPDF 5.7.3 - } - } - if (isset($vetor[10]) and !empty($vetor[10])) { - // Background color - $this->spanbgcolorarray = $vetor[10]; - $this->spanbgcolor = \true; - } - if (isset($vetor[9]) and !empty($vetor[9])) { - // Text parameters - Outline + hyphens - $this->textparam = $vetor[9]; - $this->SetTextOutline($this->textparam); - // mPDF 5.7.3 inline text-decoration parameters - if ($is_table && $this->shrin_k) { - if (isset($this->textparam['text-baseline'])) { - $this->textparam['text-baseline'] /= $this->shrin_k; - } - if (isset($this->textparam['decoration-baseline'])) { - $this->textparam['decoration-baseline'] /= $this->shrin_k; - } - if (isset($this->textparam['decoration-fontsize'])) { - $this->textparam['decoration-fontsize'] /= $this->shrin_k; - } - } - } - if (isset($vetor[8])) { - // mPDF 5.7.1 - $this->textvar = $vetor[8]; - } - if (isset($vetor[7]) and $vetor[7] != '') { - // internal target: - $ily = $this->y; - if ($this->table_rotate) { - $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page, "tbrot" => \true]; - } elseif ($this->kwt) { - $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page, "kwt" => \true]; - } elseif ($this->ColActive) { - $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page, "col" => $this->CurrCol]; - } elseif (!$this->keep_block_together) { - $this->internallink[$vetor[7]] = ["Y" => $ily, "PAGE" => $this->page]; - } - if (empty($vetor[0])) { - // Ignore empty text - // Check if it is the last element. If so then finish printing the block - if ($i == $array_size - 1) { - $this->finishFlowingBlock(\true); - } - // true = END of flowing block - continue; - } - } - if (isset($vetor[5]) and $vetor[5] != '') { - // Language // mPDF 6 - $this->currentLang = $vetor[5]; - } - if (isset($vetor[4]) and $vetor[4] != '') { - // Font Family - $font = $this->SetFont($vetor[4], $this->FontStyle, 0, \false); - } - if (!empty($vetor[3])) { - // Font Color - $cor = $vetor[3]; - $this->SetTColor($cor); - } - if (isset($vetor[2]) and $vetor[2] != '') { - // Bold,Italic styles - $this->SetStyles($vetor[2]); - } - if (isset($vetor[12]) and $vetor[12] != '') { - // Requested Bold,Italic - $this->ReqFontStyle = $vetor[12]; - } - if (isset($vetor[1]) and $vetor[1] != '') { - // LINK - if (\strpos($vetor[1], ".") === \false && \strpos($vetor[1], "@") !== 0) { - // assuming every external link has a dot indicating extension (e.g: .html .txt .zip www.somewhere.com etc.) - // Repeated reference to same anchor? - while (\array_key_exists($vetor[1], $this->internallink)) { - $vetor[1] = "#" . $vetor[1]; - } - $this->internallink[$vetor[1]] = $this->AddLink(); - $vetor[1] = $this->internallink[$vetor[1]]; - } - $this->HREF = $vetor[1]; - // HREF link style set here ****** - } - // SPECIAL CONTENT - IMAGES & FORM OBJECTS - // Print-out special content - if (\substr($vetor[0], 0, 3) == Mpdf::OBJECT_IDENTIFIER) { - // identifier has been identified! - $objattr = $this->_getObjAttr($vetor[0]); - /* -- TABLES -- */ - if ($objattr['type'] == 'nestedtable') { - if ($objattr['nestedcontent']) { - $level = $objattr['level']; - $table =& $this->table[$level][$objattr['table']]; - if ($table_draft) { - $this->y += $this->table[$level + 1][$objattr['nestedcontent']]['h']; - // nested table height - $this->finishFlowingBlock(\false, 'nestedtable'); - } else { - $cell =& $table['cells'][$objattr['row']][$objattr['col']]; - $this->finishFlowingBlock(\false, 'nestedtable'); - $save_dw = $this->divwidth; - $save_buffer = $this->cellBorderBuffer; - $this->cellBorderBuffer = []; - $ncx = $this->x; - list($dummyx, $w) = $this->_tableGetWidth($table, $objattr['row'], $objattr['col']); - $ntw = $this->table[$level + 1][$objattr['nestedcontent']]['w']; - // nested table width - if (!$this->simpleTables) { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cell['borderbin']); - } else { - $br = $cell['border_details']['R']['w']; - $bl = $cell['border_details']['L']['w']; - } - if ($table['borders_separate']) { - $innerw = $w - $bl - $br - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; - } else { - $innerw = $w - $bl / 2 - $br / 2 - $cell['padding']['L'] - $cell['padding']['R']; - } - } elseif ($this->simpleTables) { - if ($table['borders_separate']) { - $innerw = $w - $table['simple']['border_details']['L']['w'] - $table['simple']['border_details']['R']['w'] - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; - } else { - $innerw = $w - $table['simple']['border_details']['L']['w'] / 2 - $table['simple']['border_details']['R']['w'] / 2 - $cell['padding']['L'] - $cell['padding']['R']; - } - } - if ($cell['a'] == 'C' || $this->table[$level + 1][$objattr['nestedcontent']]['a'] == 'C') { - $ncx += ($innerw - $ntw) / 2; - } elseif ($cell['a'] == 'R' || $this->table[$level + 1][$objattr['nestedcontent']]['a'] == 'R') { - $ncx += $innerw - $ntw; - } - $this->x = $ncx; - $this->_tableWrite($this->table[$level + 1][$objattr['nestedcontent']]); - $this->cellBorderBuffer = $save_buffer; - $this->x = $bak_x; - $this->divwidth = $save_dw; - } - $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, \false, $blockdir, $table_draft); - } - } else { - /* -- END TABLES -- */ - if ($is_table) { - // *TABLES* - $maxWidth = $this->divwidth; - // *TABLES* - } else { - // *TABLES* - $maxWidth = $this->divwidth - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w']); - } - // *TABLES* - /* -- CSS-IMAGE-FLOAT -- */ - // If float (already) exists at this level - if (isset($this->floatmargins['R']) && $this->y <= $this->floatmargins['R']['y1'] && $this->y >= $this->floatmargins['R']['y0']) { - $maxWidth -= $this->floatmargins['R']['w']; - } - if (isset($this->floatmargins['L']) && $this->y <= $this->floatmargins['L']['y1'] && $this->y >= $this->floatmargins['L']['y0']) { - $maxWidth -= $this->floatmargins['L']['w']; - } - /* -- END CSS-IMAGE-FLOAT -- */ - list($skipln) = $this->inlineObject($objattr['type'], '', $this->y, $objattr, $this->lMargin, $this->flowingBlockAttr['contentWidth'] / Mpdf::SCALE, $maxWidth, $this->flowingBlockAttr['height'], \false, $is_table); - // 1 -> New line needed because of width - // -1 -> Will fit width on line but NEW PAGE REQUIRED because of height - // -2 -> Will not fit on line therefore needs new line but thus NEW PAGE REQUIRED - $iby = $this->y; - $oldpage = $this->page; - $oldcol = $this->CurrCol; - if (($skipln == 1 || $skipln == -2) && !isset($objattr['float'])) { - $this->finishFlowingBlock(\false, $objattr['type']); - $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, \false, $blockdir, $table_draft); - } - if (!$table_draft) { - $thispage = $this->page; - if ($this->CurrCol != $oldcol) { - $changedcol = \true; - } else { - $changedcol = \false; - } - // the previous lines can already have triggered page break or column change - if (!$changedcol && $skipln < 0 && $this->AcceptPageBreak() && $thispage == $oldpage) { - $this->AddPage($this->CurOrientation); - // Added to correct Images already set on line before page advanced - // i.e. if second inline image on line is higher than first and forces new page - if (\count($this->objectbuffer)) { - $yadj = $iby - $this->y; - foreach ($this->objectbuffer as $ib => $val) { - if ($this->objectbuffer[$ib]['OUTER-Y']) { - $this->objectbuffer[$ib]['OUTER-Y'] -= $yadj; - } - if ($this->objectbuffer[$ib]['BORDER-Y']) { - $this->objectbuffer[$ib]['BORDER-Y'] -= $yadj; - } - if ($this->objectbuffer[$ib]['INNER-Y']) { - $this->objectbuffer[$ib]['INNER-Y'] -= $yadj; - } - } - } - } - // Added to correct for OddEven Margins - if ($this->page != $oldpage) { - if (($this->page - $oldpage) % 2 == 1) { - $bak_x += $this->MarginCorrection; - } - $oldpage = $this->page; - $y = $this->tMargin - $paint_ht_corr; - $this->oldy = $this->tMargin - $paint_ht_corr; - $old_height = 0; - } - $this->x = $bak_x; - /* -- COLUMNS -- */ - // COLS - // OR COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - if ($this->directionality == 'rtl') { - // *OTL* - $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - // *OTL* - } else { - // *OTL* - $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - } - // *OTL* - $this->x = $bak_x; - $oldcolumn = $this->CurrCol; - $y = $this->y0 - $paint_ht_corr; - $this->oldy = $this->y0 - $paint_ht_corr; - $old_height = 0; - } - /* -- END COLUMNS -- */ - } - /* -- CSS-IMAGE-FLOAT -- */ - if ($objattr['type'] == 'image' && isset($objattr['float'])) { - $fy = $this->y; - // DIV TOP MARGIN/BORDER/PADDING - if ($this->flowingBlockAttr['newblock'] && ($this->flowingBlockAttr['blockstate'] == 1 || $this->flowingBlockAttr['blockstate'] == 3) && $this->flowingBlockAttr['lineCount'] == 0) { - $fy += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; - } - if ($objattr['float'] == 'R') { - $fx = $this->w - $this->rMargin - $objattr['width'] - ($this->blk[$this->blklvl]['outer_right_margin'] + $this->blk[$this->blklvl]['border_right']['w'] + $this->blk[$this->blklvl]['padding_right']); - } elseif ($objattr['float'] == 'L') { - $fx = $this->lMargin + ($this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']); - } - $w = $objattr['width']; - $h = \abs($objattr['height']); - $widthLeft = $maxWidth - $this->flowingBlockAttr['contentWidth'] / Mpdf::SCALE; - $maxHeight = $this->h - ($this->tMargin + $this->margin_header + $this->bMargin + 10); - // For Images - $extraWidth = $objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left'] + $objattr['margin_right']; - $extraHeight = $objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top'] + $objattr['margin_bottom']; - if ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg') { - $file = $objattr['file']; - $info = $this->formobjects[$file]; - } else { - $file = $objattr['file']; - $info = $this->images[$file]; - } - $img_w = $w - $extraWidth; - $img_h = $h - $extraHeight; - if ($objattr['border_left']['w']) { - $objattr['BORDER-WIDTH'] = $img_w + ($objattr['border_left']['w'] + $objattr['border_right']['w']) / 2; - $objattr['BORDER-HEIGHT'] = $img_h + ($objattr['border_top']['w'] + $objattr['border_bottom']['w']) / 2; - $objattr['BORDER-X'] = $fx + $objattr['margin_left'] + $objattr['border_left']['w'] / 2; - $objattr['BORDER-Y'] = $fy + $objattr['margin_top'] + $objattr['border_top']['w'] / 2; - } - $objattr['INNER-WIDTH'] = $img_w; - $objattr['INNER-HEIGHT'] = $img_h; - $objattr['INNER-X'] = $fx + $objattr['margin_left'] + $objattr['border_left']['w']; - $objattr['INNER-Y'] = $fy + $objattr['margin_top'] + $objattr['border_top']['w']; - $objattr['ID'] = $info['i']; - $objattr['OUTER-WIDTH'] = $w; - $objattr['OUTER-HEIGHT'] = $h; - $objattr['OUTER-X'] = $fx; - $objattr['OUTER-Y'] = $fy; - if ($objattr['float'] == 'R') { - // If R float already exists at this level - $this->floatmargins['R']['skipline'] = \false; - if (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { - $this->WriteFlowingBlock($vetor[0], $vetor[18]); - // mPDF 5.7.1 - } elseif (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { - // Final check distance between floats is not now too narrow to fit text - $mw = 2 * $this->GetCharWidth('W', \false); - if ($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['L']['w'] < $mw) { - $this->WriteFlowingBlock($vetor[0], $vetor[18]); - // mPDF 5.7.1 - } else { - $this->floatmargins['R']['x'] = $fx; - $this->floatmargins['R']['w'] = $w; - $this->floatmargins['R']['y0'] = $fy; - $this->floatmargins['R']['y1'] = $fy + $h; - if ($skipln == 1) { - $this->floatmargins['R']['skipline'] = \true; - $this->floatmargins['R']['id'] = \count($this->floatbuffer) + 0; - $objattr['skipline'] = \true; - } - $this->floatbuffer[] = $objattr; - } - } else { - $this->floatmargins['R']['x'] = $fx; - $this->floatmargins['R']['w'] = $w; - $this->floatmargins['R']['y0'] = $fy; - $this->floatmargins['R']['y1'] = $fy + $h; - if ($skipln == 1) { - $this->floatmargins['R']['skipline'] = \true; - $this->floatmargins['R']['id'] = \count($this->floatbuffer) + 0; - $objattr['skipline'] = \true; - } - $this->floatbuffer[] = $objattr; - } - } elseif ($objattr['float'] == 'L') { - // If L float already exists at this level - $this->floatmargins['L']['skipline'] = \false; - if (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { - $this->floatmargins['L']['skipline'] = \false; - $this->WriteFlowingBlock($vetor[0], $vetor[18]); - // mPDF 5.7.1 - } elseif (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { - // Final check distance between floats is not now too narrow to fit text - $mw = 2 * $this->GetCharWidth('W', \false); - if ($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['R']['w'] < $mw) { - $this->WriteFlowingBlock($vetor[0], $vetor[18]); - // mPDF 5.7.1 - } else { - $this->floatmargins['L']['x'] = $fx + $w; - $this->floatmargins['L']['w'] = $w; - $this->floatmargins['L']['y0'] = $fy; - $this->floatmargins['L']['y1'] = $fy + $h; - if ($skipln == 1) { - $this->floatmargins['L']['skipline'] = \true; - $this->floatmargins['L']['id'] = \count($this->floatbuffer) + 0; - $objattr['skipline'] = \true; - } - $this->floatbuffer[] = $objattr; - } - } else { - $this->floatmargins['L']['x'] = $fx + $w; - $this->floatmargins['L']['w'] = $w; - $this->floatmargins['L']['y0'] = $fy; - $this->floatmargins['L']['y1'] = $fy + $h; - if ($skipln == 1) { - $this->floatmargins['L']['skipline'] = \true; - $this->floatmargins['L']['id'] = \count($this->floatbuffer) + 0; - $objattr['skipline'] = \true; - } - $this->floatbuffer[] = $objattr; - } - } - } else { - /* -- END CSS-IMAGE-FLOAT -- */ - $this->WriteFlowingBlock($vetor[0], isset($vetor[18]) ? $vetor[18] : null); - // mPDF 5.7.1 - /* -- CSS-IMAGE-FLOAT -- */ - } - /* -- END CSS-IMAGE-FLOAT -- */ - } - // *TABLES* - } else { - // THE text - if ($this->tableLevel) { - $paint_ht_corr = 0; - } else { - $paint_ht_corr = $this->blk[$this->blklvl]['border_top']['w']; - } - if ($vetor[0] == "\n") { - // We are reading a
now turned into newline ("\n") - if ($this->flowingBlockAttr['content']) { - $this->finishFlowingBlock(\false, 'br'); - } elseif ($is_table) { - $this->y += $this->_computeLineheight($this->cellLineHeight); - } elseif (!$is_table) { - $this->DivLn($this->lineheight); - if ($this->ColActive) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - } - // Added to correct for OddEven Margins - if ($this->page != $oldpage) { - if (($this->page - $oldpage) % 2 == 1) { - $bak_x += $this->MarginCorrection; - } - $oldpage = $this->page; - $y = $this->tMargin - $paint_ht_corr; - $this->oldy = $this->tMargin - $paint_ht_corr; - $old_height = 0; - } - $this->x = $bak_x; - /* -- COLUMNS -- */ - // COLS - // OR COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - if ($this->directionality == 'rtl') { - // *OTL* - $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - // *OTL* - } else { - // *OTL* - $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - } - // *OTL* - $this->x = $bak_x; - $oldcolumn = $this->CurrCol; - $y = $this->y0 - $paint_ht_corr; - $this->oldy = $this->y0 - $paint_ht_corr; - $old_height = 0; - } - /* -- END COLUMNS -- */ - $this->newFlowingBlock($this->divwidth, $this->divheight, $align, $is_table, $blockstate, \false, $blockdir, $table_draft); - } else { - $this->WriteFlowingBlock($vetor[0], $vetor[18]); - // mPDF 5.7.1 - // Added to correct for OddEven Margins - if ($this->page != $oldpage) { - if (($this->page - $oldpage) % 2 == 1) { - $bak_x += $this->MarginCorrection; - $this->x = $bak_x; - } - $oldpage = $this->page; - $y = $this->tMargin - $paint_ht_corr; - $this->oldy = $this->tMargin - $paint_ht_corr; - $old_height = 0; - } - /* -- COLUMNS -- */ - // COLS - // OR COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - if ($this->directionality == 'rtl') { - // *OTL* - $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - // *OTL* - } else { - // *OTL* - $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - } - // *OTL* - $this->x = $bak_x; - $oldcolumn = $this->CurrCol; - $y = $this->y0 - $paint_ht_corr; - $this->oldy = $this->y0 - $paint_ht_corr; - $old_height = 0; - } - /* -- END COLUMNS -- */ - } - } - // Check if it is the last element. If so then finish printing the block - if ($i == $array_size - 1) { - $this->finishFlowingBlock(\true); - // true = END of flowing block - // Added to correct for OddEven Margins - if ($this->page != $oldpage) { - if (($this->page - $oldpage) % 2 == 1) { - $bak_x += $this->MarginCorrection; - $this->x = $bak_x; - } - $oldpage = $this->page; - $y = $this->tMargin - $paint_ht_corr; - $this->oldy = $this->tMargin - $paint_ht_corr; - $old_height = 0; - } - /* -- COLUMNS -- */ - // COLS - // OR COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - if ($this->directionality == 'rtl') { - // *OTL* - $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - // *OTL* - } else { - // *OTL* - $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth + $this->ColGap); - } - // *OTL* - $this->x = $bak_x; - $oldcolumn = $this->CurrCol; - $y = $this->y0 - $paint_ht_corr; - $this->oldy = $this->y0 - $paint_ht_corr; - $old_height = 0; - } - /* -- END COLUMNS -- */ - } - // RESETTING VALUES - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - $this->colorarray = ''; - $this->spanbgcolorarray = ''; - $this->spanbgcolor = \false; - $this->spanborder = \false; - $this->spanborddet = []; - $this->HREF = ''; - $this->textparam = []; - $this->SetTextOutline(); - $this->textvar = 0x0; - // mPDF 5.7.1 - $this->OTLtags = []; - $this->textshadow = ''; - $this->currentfontfamily = ''; - $this->currentfontsize = ''; - $this->currentfontstyle = ''; - $this->currentLang = $this->default_lang; - // mPDF 6 - $this->RestrictUnicodeFonts($this->default_available_fonts); - // mPDF 6 - /* -- TABLES -- */ - if ($this->tableLevel) { - $this->SetLineHeight('', $this->table[1][1]['cellLineHeight']); - // *TABLES* - } else { - /* -- END TABLES -- */ - if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { - $this->SetLineHeight('', $this->blk[$this->blklvl]['line_height']); - // sets default line height - } - } - $this->ResetStyles(); - $this->lSpacingCSS = ''; - $this->wSpacingCSS = ''; - $this->fixedlSpacing = \false; - $this->minwSpacing = 0; - $this->SetDash(); - $this->dash_on = \false; - $this->dotted_on = \false; - } - //end of for(i=0;iReset(); - // mPDF 6 - // PAINT DIV BORDER // DISABLED IN COLUMNS AS DOESN'T WORK WHEN BROKEN ACROSS COLS?? - if ((isset($this->blk[$this->blklvl]['border']) || isset($this->blk[$this->blklvl]['bgcolor']) || isset($this->blk[$this->blklvl]['box_shadow'])) && $blockstate && $this->y != $this->oldy) { - $bottom_y = $this->y; - // Does not include Bottom Margin - if (isset($this->blk[$this->blklvl]['startpage']) && $this->blk[$this->blklvl]['startpage'] != $this->page && $blockstate != 1) { - $this->PaintDivBB('pagetop', $blockstate); - } elseif ($blockstate != 1) { - $this->PaintDivBB('', $blockstate); - } - $this->y = $bottom_y; - $this->x = $bak_x; - } - // Reset Font - $this->SetFontSize($this->default_font_size, \false); - if ($table_draft) { - $ch = $this->y - $bak_y; - $this->y = $bak_y; - $this->x = $bak_x; - return $ch; - } - } - function _setDashBorder($style, $div, $cp, $side) - { - if ($style == 'dashed' && ($side == 'L' || $side == 'R' || $side == 'T' && $div != 'pagetop' && !$cp || $side == 'B' && $div != 'pagebottom')) { - $dashsize = 2; - // final dash will be this + 1*linewidth - $dashsizek = 1.5; - // ratio of Dash/Blank - $this->SetDash($dashsize, $dashsize / $dashsizek + $this->LineWidth * 2); - } elseif ($style == 'dotted' || $side == 'T' && ($div == 'pagetop' || $cp) || $side == 'B' && $div == 'pagebottom') { - // Round join and cap - $this->SetLineJoin(1); - $this->SetLineCap(1); - $this->SetDash(0.001, $this->LineWidth * 3); - } - } - function _setBorderLine($b, $k = 1) - { - $this->SetLineWidth($b['w'] / $k); - $this->SetDColor($b['c']); - if ($b['c'][0] == 5) { - // RGBa - $this->SetAlpha(\ord($b['c'][4]) / 100, 'Normal', \false, 'S'); - // mPDF 5.7.2 - } elseif ($b['c'][0] == 6) { - // CMYKa - $this->SetAlpha(\ord($b['c'][5]) / 100, 'Normal', \false, 'S'); - // mPDF 5.7.2 - } - } - function PaintDivBB($divider = '', $blockstate = 0, $blvl = 0) - { - // Borders & backgrounds are done elsewhere for columns - messes up the repositioning in printcolumnbuffer - if ($this->ColActive) { - return; - } - // *COLUMNS* - if ($this->keep_block_together) { - return; - } - // mPDF 6 - $save_y = $this->y; - if (!$blvl) { - $blvl = $this->blklvl; - } - $x0 = $x1 = $y0 = $y1 = 0; - // Added mPDF 3.0 Float DIV - if (isset($this->blk[$blvl]['bb_painted'][$this->page]) && $this->blk[$blvl]['bb_painted'][$this->page]) { - return; - } - // *CSS-FLOAT* - if (isset($this->blk[$blvl]['x0'])) { - $x0 = $this->blk[$blvl]['x0']; - } - // left - if (isset($this->blk[$blvl]['y1'])) { - $y1 = $this->blk[$blvl]['y1']; - } - // bottom - // Added mPDF 3.0 Float DIV - ensures backgrounds/borders are drawn to bottom of page - if ($y1 == 0) { - if ($divider == 'pagebottom') { - $y1 = $this->h - $this->bMargin; - } else { - $y1 = $this->y; - } - } - $continuingpage = isset($this->blk[$blvl]['startpage']) && $this->blk[$blvl]['startpage'] != $this->page; - if (isset($this->blk[$blvl]['y0'])) { - $y0 = $this->blk[$blvl]['y0']; - } - $h = $y1 - $y0; - $w = $this->blk[$blvl]['width']; - $x1 = $x0 + $w; - // Set border-widths as used here - $border_top = $this->blk[$blvl]['border_top']['w']; - $border_bottom = $this->blk[$blvl]['border_bottom']['w']; - $border_left = $this->blk[$blvl]['border_left']['w']; - $border_right = $this->blk[$blvl]['border_right']['w']; - if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { - $border_top = 0; - } - if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { - $border_bottom = 0; - } - $brTL_H = 0; - $brTL_V = 0; - $brTR_H = 0; - $brTR_V = 0; - $brBL_H = 0; - $brBL_V = 0; - $brBR_H = 0; - $brBR_V = 0; - $brset = \false; - /* -- BORDER-RADIUS -- */ - if (isset($this->blk[$blvl]['border_radius_TL_H'])) { - $brTL_H = $this->blk[$blvl]['border_radius_TL_H']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_TL_V'])) { - $brTL_V = $this->blk[$blvl]['border_radius_TL_V']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_TR_H'])) { - $brTR_H = $this->blk[$blvl]['border_radius_TR_H']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_TR_V'])) { - $brTR_V = $this->blk[$blvl]['border_radius_TR_V']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_BR_H'])) { - $brBR_H = $this->blk[$blvl]['border_radius_BR_H']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_BR_V'])) { - $brBR_V = $this->blk[$blvl]['border_radius_BR_V']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_BL_H'])) { - $brBL_H = $this->blk[$blvl]['border_radius_BL_H']; - $brset = \true; - } - if (isset($this->blk[$blvl]['border_radius_BL_V'])) { - $brBL_V = $this->blk[$blvl]['border_radius_BL_V']; - $brset = \true; - } - if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { - $brTL_H = 0; - $brTL_V = 0; - $brTR_H = 0; - $brTR_V = 0; - } - if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { - $brBL_H = 0; - $brBL_V = 0; - $brBR_H = 0; - $brBR_V = 0; - } - // Disallow border-radius if it is smaller than the border width. - if ($brTL_H < \min($border_left, $border_top)) { - $brTL_H = $brTL_V = 0; - } - if ($brTL_V < \min($border_left, $border_top)) { - $brTL_V = $brTL_H = 0; - } - if ($brTR_H < \min($border_right, $border_top)) { - $brTR_H = $brTR_V = 0; - } - if ($brTR_V < \min($border_right, $border_top)) { - $brTR_V = $brTR_H = 0; - } - if ($brBL_H < \min($border_left, $border_bottom)) { - $brBL_H = $brBL_V = 0; - } - if ($brBL_V < \min($border_left, $border_bottom)) { - $brBL_V = $brBL_H = 0; - } - if ($brBR_H < \min($border_right, $border_bottom)) { - $brBR_H = $brBR_V = 0; - } - if ($brBR_V < \min($border_right, $border_bottom)) { - $brBR_V = $brBR_H = 0; - } - // CHECK FOR radii that sum to > width or height of div ******** - $f = \min($h / ($brTL_V + $brBL_V + 0.001), $h / ($brTR_V + $brBR_V + 0.001), $w / ($brTL_H + $brTR_H + 0.001), $w / ($brBL_H + $brBR_H + 0.001)); - if ($f < 1) { - $brTL_H *= $f; - $brTL_V *= $f; - $brTR_H *= $f; - $brTR_V *= $f; - $brBL_H *= $f; - $brBL_V *= $f; - $brBR_H *= $f; - $brBR_V *= $f; - } - /* -- END BORDER-RADIUS -- */ - $tbcol = $this->colorConverter->convert(255, $this->PDFAXwarnings); - for ($l = 0; $l <= $blvl; $l++) { - if ($this->blk[$l]['bgcolor']) { - $tbcol = $this->blk[$l]['bgcolorarray']; - } - } - // BORDERS - if (isset($this->blk[$blvl]['y0']) && $this->blk[$blvl]['y0']) { - $y0 = $this->blk[$blvl]['y0']; - } - $h = $y1 - $y0; - $w = $this->blk[$blvl]['width']; - if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { - $tbd = $this->blk[$blvl]['border_top']; - $legend = ''; - $legbreakL = 0; - $legbreakR = 0; - // BORDER LEGEND - if (isset($this->blk[$blvl]['border_legend']) && $this->blk[$blvl]['border_legend']) { - $legend = $this->blk[$blvl]['border_legend']; - // Same structure array as textbuffer - $txt = $legend[0] = \ltrim($legend[0]); - if (!empty($legend[18])) { - $this->otl->trimOTLdata($legend[18], \true, \false); - } - // *OTL* - // Set font, size, style, color - $this->SetFont($legend[4], $legend[2], $legend[11]); - if (isset($legend[3]) && $legend[3]) { - $cor = $legend[3]; - $this->SetTColor($cor); - } - $stringWidth = $this->GetStringWidth($txt, \true, $legend[18], $legend[8]); - $save_x = $this->x; - $save_y = $this->y; - $save_currentfontfamily = $this->FontFamily; - $save_currentfontsize = $this->FontSizePt; - $save_currentfontstyle = $this->FontStyle; - $this->y = $y0 - $this->FontSize / 2 + $this->blk[$blvl]['border_top']['w'] / 2; - $this->x = $x0 + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_left']['w']; - // Set the distance from the border line to the text ? make configurable variable - $gap = 0.2 * $this->FontSize; - $legbreakL = $this->x - $gap; - $legbreakR = $this->x + $stringWidth + $gap; - $this->magic_reverse_dir($txt, $this->blk[$blvl]['direction'], $legend[18]); - $fill = ''; - $this->Cell($stringWidth, $this->FontSize, $txt, '', 0, 'C', $fill, '', 0, 0, 0, 'M', $fill, \false, $legend[18], $legend[8]); - // Reset - $this->x = $save_x; - $this->y = $save_y; - $this->SetFont($save_currentfontfamily, $save_currentfontstyle, $save_currentfontsize); - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - if (isset($tbd['s']) && $tbd['s']) { - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('q'); - $this->SetLineWidth(0); - $this->writer->write(\sprintf('%.3F %.3F m ', $x0 * Mpdf::SCALE, ($this->h - $y0) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - $y0) * Mpdf::SCALE)); - $this->writer->write(' h W n '); - // Ends path no-op & Sets the clipping path - } - $this->_setBorderLine($tbd); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $legbreakL -= $border_top / 2; - // because line cap different - $legbreakR += $border_top / 2; - $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'T'); - } elseif ($brTL_V && $brTL_H || $brTR_V && $brTR_H || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $this->SetLineJoin(0); - $this->SetLineCap(0); - } - $s = ''; - if ($brTR_H && $brTR_V) { - $s .= $this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_top / 2, $brTR_V - $border_top / 2, 1, 2, \true) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $w - $border_top / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - } - /* -- BORDER-RADIUS -- */ - if ($brTL_H && $brTL_V) { - if ($legend) { - if ($legbreakR < $x0 + $w - $brTR_H) { - $s .= \sprintf('%.3F %.3F l ', $legbreakR * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - if ($legbreakL > $x0 + $brTL_H) { - $s .= \sprintf('%.3F %.3F m ', $legbreakL * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - $s .= \sprintf('%.3F %.3F l ', ($x0 + $brTL_H) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $brTL_H) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - } else { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $brTL_H) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - $s .= $this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_top / 2, $brTL_V - $border_top / 2, 2, 1) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($legend) { - if ($legbreakR < $x0 + $w) { - $s .= \sprintf('%.3F %.3F l ', $legbreakR * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - if ($legbreakL > $x0) { - $s .= \sprintf('%.3F %.3F m ', $legbreakL * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F l ', $x0 * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $border_top / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - } elseif ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F m ', $x0 * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $border_top / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - } elseif ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F l ', $x0 * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $border_top / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_top / 2)) * Mpdf::SCALE) . "\n"; - } - /* -- BORDER-RADIUS -- */ - } - /* -- END BORDER-RADIUS -- */ - $s .= 'S' . "\n"; - $this->writer->write($s); - if ($tbd['style'] == 'double') { - $this->SetLineWidth($tbd['w'] / 3); - $this->SetDColor($tbcol); - $this->writer->write($s); - } - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('Q'); - } - // Reset Corners and Dash off - $this->SetLineWidth(0.1); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - // Reinstate line above for dotted line divider when block border crosses a page - // elseif ($divider == 'pagetop' || $continuingpage) { - if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { - $tbd = $this->blk[$blvl]['border_bottom']; - if (isset($tbd['s']) && $tbd['s']) { - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('q'); - $this->SetLineWidth(0); - $this->writer->write(\sprintf('%.3F %.3F m ', $x0 * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); - $this->writer->write(' h W n '); - // Ends path no-op & Sets the clipping path - } - $this->_setBorderLine($tbd); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'B'); - } elseif ($brBL_V && $brBL_H || $brBR_V && $brBR_H || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $this->SetLineJoin(0); - $this->SetLineCap(0); - } - $s = ''; - if ($brBL_H && $brBL_V) { - $s .= $this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_bottom / 2, $brBL_V - $border_bottom / 2, 3, 2, \true) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F m ', $x0 * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $border_bottom / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom / 2)) * Mpdf::SCALE) . "\n"; - } - } - /* -- BORDER-RADIUS -- */ - if ($brBR_H && $brBR_V) { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $w - $border_bottom / 2 - $brBR_H) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom / 2)) * Mpdf::SCALE) . "\n"; - $s .= $this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_bottom / 2, $brBR_V - $border_bottom / 2, 4, 1) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom / 2)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $w - $border_bottom / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom / 2)) * Mpdf::SCALE) . "\n"; - } - } - $s .= 'S' . "\n"; - $this->writer->write($s); - if ($tbd['style'] == 'double') { - $this->SetLineWidth($tbd['w'] / 3); - $this->SetDColor($tbcol); - $this->writer->write($s); - } - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('Q'); - } - // Reset Corners and Dash off - $this->SetLineWidth(0.1); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - // Reinstate line below for dotted line divider when block border crosses a page - // elseif ($blockstate == 1 || $divider == 'pagebottom') { - if ($this->blk[$blvl]['border_left']) { - $tbd = $this->blk[$blvl]['border_left']; - if (isset($tbd['s']) && $tbd['s']) { - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('q'); - $this->SetLineWidth(0); - $this->writer->write(\sprintf('%.3F %.3F m ', $x0 * Mpdf::SCALE, ($this->h - $y0) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $border_left) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', $x0 * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); - $this->writer->write(' h W n '); - // Ends path no-op & Sets the clipping path - } - $this->_setBorderLine($tbd); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'L'); - } elseif ($brTL_V && $brTL_H || $brBL_V && $brBL_H || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $this->SetLineJoin(0); - $this->SetLineCap(0); - } - $s = ''; - if ($brTL_V && $brTL_H) { - $s .= $this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_left / 2, $brTL_V - $border_left / 2, 2, 2, \true) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $border_left / 2) * Mpdf::SCALE, ($this->h - $y0) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $border_left / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_left / 2)) * Mpdf::SCALE) . "\n"; - } - } - /* -- BORDER-RADIUS -- */ - if ($brBL_V && $brBL_H) { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $border_left / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_left / 2 - $brBL_V)) * Mpdf::SCALE) . "\n"; - $s .= $this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_left / 2, $brBL_V - $border_left / 2, 3, 1) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $border_left / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $border_left / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_left / 2)) * Mpdf::SCALE) . "\n"; - } - } - $s .= 'S' . "\n"; - $this->writer->write($s); - if ($tbd['style'] == 'double') { - $this->SetLineWidth($tbd['w'] / 3); - $this->SetDColor($tbcol); - $this->writer->write($s); - } - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('Q'); - } - // Reset Corners and Dash off - $this->SetLineWidth(0.1); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($this->blk[$blvl]['border_right']) { - $tbd = $this->blk[$blvl]['border_right']; - if (isset($tbd['s']) && $tbd['s']) { - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('q'); - $this->SetLineWidth(0); - $this->writer->write(\sprintf('%.3F %.3F m ', ($x0 + $w) * Mpdf::SCALE, ($this->h - $y0) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $border_top)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w - $border_right) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_bottom)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F l ', ($x0 + $w) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE)); - $this->writer->write(' h W n '); - // Ends path no-op & Sets the clipping path - } - $this->_setBorderLine($tbd); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], $divider, $continuingpage, 'R'); - } elseif ($brTR_V && $brTR_H || $brBR_V && $brBR_H || $tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $this->SetLineJoin(0); - $this->SetLineCap(0); - } - $s = ''; - if ($brBR_V && $brBR_H) { - $s .= $this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_right / 2, $brBR_V - $border_right / 2, 4, 2, \true) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $w - $border_right / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h)) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F m ', ($x0 + $w - $border_right / 2) * Mpdf::SCALE, ($this->h - ($y0 + $h - $border_right / 2)) * Mpdf::SCALE) . "\n"; - } - } - /* -- BORDER-RADIUS -- */ - if ($brTR_V && $brTR_H) { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $w - $border_right / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_right / 2 + $brTR_V)) * Mpdf::SCALE) . "\n"; - $s .= $this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_right / 2, $brTR_V - $border_right / 2, 1, 1) . "\n"; - } else { - /* -- END BORDER-RADIUS -- */ - if ($tbd['style'] == 'solid' || $tbd['style'] == 'double') { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $w - $border_right / 2) * Mpdf::SCALE, ($this->h - $y0) * Mpdf::SCALE) . "\n"; - } else { - $s .= \sprintf('%.3F %.3F l ', ($x0 + $w - $border_right / 2) * Mpdf::SCALE, ($this->h - ($y0 + $border_right / 2)) * Mpdf::SCALE) . "\n"; - } - } - $s .= 'S' . "\n"; - $this->writer->write($s); - if ($tbd['style'] == 'double') { - $this->SetLineWidth($tbd['w'] / 3); - $this->SetDColor($tbcol); - $this->writer->write($s); - } - if (!$brset && $tbd['style'] != 'dotted' && $tbd['style'] != 'dashed') { - $this->writer->write('Q'); - } - // Reset Corners and Dash off - $this->SetLineWidth(0.1); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - $this->SetDash(); - $this->y = $save_y; - // BACKGROUNDS are disabled in columns/kbt/headers - messes up the repositioning in printcolumnbuffer - if ($this->ColActive || $this->kwt || $this->keep_block_together) { - return; - } - $bgx0 = $x0; - $bgx1 = $x1; - $bgy0 = $y0; - $bgy1 = $y1; - // Defined br values represent the radius of the outer curve - need to take border-width/2 from each radius for drawing the borders - if (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'padding-box') { - $brbgTL_H = \max(0, $brTL_H - $this->blk[$blvl]['border_left']['w']); - $brbgTL_V = \max(0, $brTL_V - $this->blk[$blvl]['border_top']['w']); - $brbgTR_H = \max(0, $brTR_H - $this->blk[$blvl]['border_right']['w']); - $brbgTR_V = \max(0, $brTR_V - $this->blk[$blvl]['border_top']['w']); - $brbgBL_H = \max(0, $brBL_H - $this->blk[$blvl]['border_left']['w']); - $brbgBL_V = \max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w']); - $brbgBR_H = \max(0, $brBR_H - $this->blk[$blvl]['border_right']['w']); - $brbgBR_V = \max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w']); - $bgx0 += $this->blk[$blvl]['border_left']['w']; - $bgx1 -= $this->blk[$blvl]['border_right']['w']; - if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { - $bgy0 += $this->blk[$blvl]['border_top']['w']; - } - if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { - $bgy1 -= $this->blk[$blvl]['border_bottom']['w']; - } - } elseif (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'content-box') { - $brbgTL_H = \max(0, $brTL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); - $brbgTL_V = \max(0, $brTL_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); - $brbgTR_H = \max(0, $brTR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); - $brbgTR_V = \max(0, $brTR_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); - $brbgBL_H = \max(0, $brBL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); - $brbgBL_V = \max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); - $brbgBR_H = \max(0, $brBR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); - $brbgBR_V = \max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); - $bgx0 += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; - $bgx1 -= $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']; - if (($this->blk[$blvl]['border_top']['w'] || $this->blk[$blvl]['padding_top']) && $divider != 'pagetop' && !$continuingpage) { - $bgy0 += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; - } - if (($this->blk[$blvl]['border_bottom']['w'] || $this->blk[$blvl]['padding_bottom']) && $blockstate != 1 && $divider != 'pagebottom') { - $bgy1 -= $this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']; - } - } else { - $brbgTL_H = $brTL_H; - $brbgTL_V = $brTL_V; - $brbgTR_H = $brTR_H; - $brbgTR_V = $brTR_V; - $brbgBL_H = $brBL_H; - $brbgBL_V = $brBL_V; - $brbgBR_H = $brBR_H; - $brbgBR_V = $brBR_V; - } - // Set clipping path - $s = ' q 0 w '; - // Line width=0 - $s .= \sprintf('%.3F %.3F m ', ($bgx0 + $brbgTL_H) * Mpdf::SCALE, ($this->h - $bgy0) * Mpdf::SCALE); - // start point TL before the arc - /* -- BORDER-RADIUS -- */ - if ($brbgTL_H || $brbgTL_V) { - $s .= $this->_EllipseArc($bgx0 + $brbgTL_H, $bgy0 + $brbgTL_V, $brbgTL_H, $brbgTL_V, 2); - // segment 2 TL - } - /* -- END BORDER-RADIUS -- */ - $s .= \sprintf('%.3F %.3F l ', $bgx0 * Mpdf::SCALE, ($this->h - ($bgy1 - $brbgBL_V)) * Mpdf::SCALE); - // line to BL - /* -- BORDER-RADIUS -- */ - if ($brbgBL_H || $brbgBL_V) { - $s .= $this->_EllipseArc($bgx0 + $brbgBL_H, $bgy1 - $brbgBL_V, $brbgBL_H, $brbgBL_V, 3); - // segment 3 BL - } - /* -- END BORDER-RADIUS -- */ - $s .= \sprintf('%.3F %.3F l ', ($bgx1 - $brbgBR_H) * Mpdf::SCALE, ($this->h - $bgy1) * Mpdf::SCALE); - // line to BR - /* -- BORDER-RADIUS -- */ - if ($brbgBR_H || $brbgBR_V) { - $s .= $this->_EllipseArc($bgx1 - $brbgBR_H, $bgy1 - $brbgBR_V, $brbgBR_H, $brbgBR_V, 4); - // segment 4 BR - } - /* -- END BORDER-RADIUS -- */ - $s .= \sprintf('%.3F %.3F l ', $bgx1 * Mpdf::SCALE, ($this->h - ($bgy0 + $brbgTR_V)) * Mpdf::SCALE); - // line to TR - /* -- BORDER-RADIUS -- */ - if ($brbgTR_H || $brbgTR_V) { - $s .= $this->_EllipseArc($bgx1 - $brbgTR_H, $bgy0 + $brbgTR_V, $brbgTR_H, $brbgTR_V, 1); - // segment 1 TR - } - /* -- END BORDER-RADIUS -- */ - $s .= \sprintf('%.3F %.3F l ', ($bgx0 + $brbgTL_H) * Mpdf::SCALE, ($this->h - $bgy0) * Mpdf::SCALE); - // line to TL - // Box Shadow - $shadow = ''; - if (isset($this->blk[$blvl]['box_shadow']) && $this->blk[$blvl]['box_shadow'] && $h > 0) { - foreach ($this->blk[$blvl]['box_shadow'] as $sh) { - // Colors - if ($sh['col'][0] == 1) { - $colspace = 'Gray'; - if ($sh['col'][2] == 1) { - $col1 = '1' . $sh['col'][1] . '1' . $sh['col'][3]; - } else { - $col1 = '1' . $sh['col'][1] . '1' . \chr(100); - } - $col2 = '1' . $sh['col'][1] . '1' . \chr(0); - } elseif ($sh['col'][0] == 4) { - // CMYK - $colspace = 'CMYK'; - $col1 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . \chr(100); - $col2 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . \chr(0); - } elseif ($sh['col'][0] == 5) { - // RGBa - $colspace = 'RGB'; - $col1 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4]; - $col2 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . \chr(0); - } elseif ($sh['col'][0] == 6) { - // CMYKa - $colspace = 'CMYK'; - $col1 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . $sh['col'][5]; - $col2 = '6' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . $sh['col'][4] . \chr(0); - } else { - $colspace = 'RGB'; - $col1 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . \chr(100); - $col2 = '5' . $sh['col'][1] . $sh['col'][2] . $sh['col'][3] . \chr(0); - } - // Use clipping path as set above (and rectangle around page) to clip area outside box - $shadow .= $s; - // Use the clipping path with W* - $shadow .= \sprintf('0 %.3F m %.3F %.3F l ', $this->h * Mpdf::SCALE, $this->w * Mpdf::SCALE, $this->h * Mpdf::SCALE); - $shadow .= \sprintf('%.3F 0 l 0 0 l 0 %.3F l ', $this->w * Mpdf::SCALE, $this->h * Mpdf::SCALE); - $shadow .= 'W n' . "\n"; - $sh['blur'] = \abs($sh['blur']); - // cannot have negative blur value - // Ensure spread/blur do not make effective shadow width/height < 0 - // Could do more complex things but this just adjusts spread value - if (-$sh['spread'] + $sh['blur'] / 2 > \min($w / 2, $h / 2)) { - $sh['spread'] = $sh['blur'] / 2 - \min($w / 2, $h / 2) + 0.01; - } - // Shadow Offset - if ($sh['x'] || $sh['y']) { - $shadow .= \sprintf(' q 1 0 0 1 %.4F %.4F cm', $sh['x'] * Mpdf::SCALE, -$sh['y'] * Mpdf::SCALE) . "\n"; - } - // Set path for INNER shadow - $shadow .= ' q 0 w '; - $shadow .= $this->SetFColor($col1, \true) . "\n"; - if ($col1[0] == 5 && \ord($col1[4]) < 100) { - // RGBa - $shadow .= $this->SetAlpha(\ord($col1[4]) / 100, 'Normal', \true, 'F') . "\n"; - } elseif ($col1[0] == 6 && \ord($col1[5]) < 100) { - // CMYKa - $shadow .= $this->SetAlpha(\ord($col1[5]) / 100, 'Normal', \true, 'F') . "\n"; - } elseif ($col1[0] == 1 && $col1[2] == 1 && \ord($col1[3]) < 100) { - // Gray - $shadow .= $this->SetAlpha(\ord($col1[3]) / 100, 'Normal', \true, 'F') . "\n"; - } - // Blur edges - $mag = 0.5517840000000001; - // Bezier Control magic number for 4-part spline for circle/ellipse - $mag2 = 0.5517840000000001; - // Bezier Control magic number to fill in edge of blurred rectangle - $d1 = $sh['spread'] + $sh['blur'] / 2; - $d2 = $sh['spread'] - $sh['blur'] / 2; - $bl = $sh['blur']; - $x00 = $x0 - $d1; - $y00 = $y0 - $d1; - $w00 = $w + $d1 * 2; - $h00 = $h + $d1 * 2; - // If any border-radius is greater width-negative spread(inner edge), ignore radii for shadow or screws up - $flatten = \false; - if (\max($brbgTR_H, $brbgTL_H, $brbgBR_H, $brbgBL_H) >= $w + $d2) { - $flatten = \true; - } - if (\max($brbgTR_V, $brbgTL_V, $brbgBR_V, $brbgBL_V) >= $h + $d2) { - $flatten = \true; - } - // TOP RIGHT corner - $p1x = $x00 + $w00 - $d1 - $brbgTR_H; - $p1c2x = $p1x + ($d2 + $brbgTR_H) * $mag; - $p1y = $y00 + $bl; - $p2x = $x00 + $w00 - $d1 - $brbgTR_H; - $p2c2x = $p2x + ($d1 + $brbgTR_H) * $mag; - $p2y = $y00; - $p2c1y = $p2y + $bl / 2; - $p3x = $x00 + $w00; - $p3c2x = $p3x - $bl / 2; - $p3y = $y00 + $d1 + $brbgTR_V; - $p3c1y = $p3y - ($d1 + $brbgTR_V) * $mag; - $p4x = $x00 + $w00 - $bl; - $p4y = $y00 + $d1 + $brbgTR_V; - $p4c2y = $p4y - ($d2 + $brbgTR_V) * $mag; - if (-$d2 > \min($brbgTR_H, $brbgTR_V) || $flatten) { - $p1x = $x00 + $w00 - $bl; - $p1c2x = $p1x; - $p2x = $x00 + $w00 - $bl; - $p2c2x = $p2x + $bl * $mag2; - $p3y = $y00 + $bl; - $p3c1y = $p3y - $bl * $mag2; - $p4y = $y00 + $bl; - $p4c2y = $p4y; - } - $shadow .= \sprintf('%.3F %.3F m ', $p1x * Mpdf::SCALE, ($this->h - $p1y) * Mpdf::SCALE); - $shadow .= \sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $p1c2x * Mpdf::SCALE, ($this->h - $p1y) * Mpdf::SCALE, $p4x * Mpdf::SCALE, ($this->h - $p4c2y) * Mpdf::SCALE, $p4x * Mpdf::SCALE, ($this->h - $p4y) * Mpdf::SCALE); - $patch_array[0]['f'] = 0; - $patch_array[0]['points'] = [$p1x, $p1y, $p1x, $p1y, $p2x, $p2c1y, $p2x, $p2y, $p2c2x, $p2y, $p3x, $p3c1y, $p3x, $p3y, $p3c2x, $p3y, $p4x, $p4y, $p4x, $p4y, $p4x, $p4c2y, $p1c2x, $p1y]; - $patch_array[0]['colors'] = [$col1, $col2, $col2, $col1]; - // RIGHT - $p1x = $x00 + $w00; - // control point only matches p3 preceding - $p1y = $y00 + $d1 + $brbgTR_V; - $p2x = $x00 + $w00 - $bl; - // control point only matches p4 preceding - $p2y = $y00 + $d1 + $brbgTR_V; - $p3x = $x00 + $w00 - $bl; - $p3y = $y00 + $h00 - $d1 - $brbgBR_V; - $p4x = $x00 + $w00; - $p4c1x = $p4x - $bl / 2; - $p4y = $y00 + $h00 - $d1 - $brbgBR_V; - if (-$d2 > \min($brbgTR_H, $brbgTR_V) || $flatten) { - $p1y = $y00 + $bl; - $p2y = $y00 + $bl; - } - if (-$d2 > \min($brbgBR_H, $brbgBR_V) || $flatten) { - $p3y = $y00 + $h00 - $bl; - $p4y = $y00 + $h00 - $bl; - } - $shadow .= \sprintf('%.3F %.3F l ', $p3x * Mpdf::SCALE, ($this->h - $p3y) * Mpdf::SCALE); - $patch_array[1]['f'] = 2; - $patch_array[1]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4c1x, $p4y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; - $patch_array[1]['colors'] = [$col1, $col2]; - // BOTTOM RIGHT corner - $p1x = $x00 + $w00 - $bl; - // control points only matches p3 preceding - $p1y = $y00 + $h00 - $d1 - $brbgBR_V; - $p1c2y = $p1y + ($d2 + $brbgBR_V) * $mag; - $p2x = $x00 + $w00; - // control point only matches p4 preceding - $p2y = $y00 + $h00 - $d1 - $brbgBR_V; - $p2c2y = $p2y + ($d1 + $brbgBR_V) * $mag; - $p3x = $x00 + $w00 - $d1 - $brbgBR_H; - $p3c1x = $p3x + ($d1 + $brbgBR_H) * $mag; - $p3y = $y00 + $h00; - $p3c2y = $p3y - $bl / 2; - $p4x = $x00 + $w00 - $d1 - $brbgBR_H; - $p4c2x = $p4x + ($d2 + $brbgBR_H) * $mag; - $p4y = $y00 + $h00 - $bl; - if (-$d2 > \min($brbgBR_H, $brbgBR_V) || $flatten) { - $p1y = $y00 + $h00 - $bl; - $p1c2y = $p1y; - $p2y = $y00 + $h00 - $bl; - $p2c2y = $p2y + $bl * $mag2; - $p3x = $x00 + $w00 - $bl; - $p3c1x = $p3x + $bl * $mag2; - $p4x = $x00 + $w00 - $bl; - $p4c2x = $p4x; - } - $shadow .= \sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $p1x * Mpdf::SCALE, ($this->h - $p1c2y) * Mpdf::SCALE, $p4c2x * Mpdf::SCALE, ($this->h - $p4y) * Mpdf::SCALE, $p4x * Mpdf::SCALE, ($this->h - $p4y) * Mpdf::SCALE); - $patch_array[2]['f'] = 2; - $patch_array[2]['points'] = [$p2x, $p2c2y, $p3c1x, $p3y, $p3x, $p3y, $p3x, $p3c2y, $p4x, $p4y, $p4x, $p4y, $p4c2x, $p4y, $p1x, $p1c2y]; - $patch_array[2]['colors'] = [$col2, $col1]; - // BOTTOM - $p1x = $x00 + $w00 - $d1 - $brbgBR_H; - // control point only matches p3 preceding - $p1y = $y00 + $h00; - $p2x = $x00 + $w00 - $d1 - $brbgBR_H; - // control point only matches p4 preceding - $p2y = $y00 + $h00 - $bl; - $p3x = $x00 + $d1 + $brbgBL_H; - $p3y = $y00 + $h00 - $bl; - $p4x = $x00 + $d1 + $brbgBL_H; - $p4y = $y00 + $h00; - $p4c1y = $p4y - $bl / 2; - if (-$d2 > \min($brbgBR_H, $brbgBR_V) || $flatten) { - $p1x = $x00 + $w00 - $bl; - $p2x = $x00 + $w00 - $bl; - } - if (-$d2 > \min($brbgBL_H, $brbgBL_V) || $flatten) { - $p3x = $x00 + $bl; - $p4x = $x00 + $bl; - } - $shadow .= \sprintf('%.3F %.3F l ', $p3x * Mpdf::SCALE, ($this->h - $p3y) * Mpdf::SCALE); - $patch_array[3]['f'] = 2; - $patch_array[3]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4x, $p4c1y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; - $patch_array[3]['colors'] = [$col1, $col2]; - // BOTTOM LEFT corner - $p1x = $x00 + $d1 + $brbgBL_H; - $p1c2x = $p1x - ($d2 + $brbgBL_H) * $mag; - // control points only matches p3 preceding - $p1y = $y00 + $h00 - $bl; - $p2x = $x00 + $d1 + $brbgBL_H; - $p2c2x = $p2x - ($d1 + $brbgBL_H) * $mag; - // control point only matches p4 preceding - $p2y = $y00 + $h00; - $p3x = $x00; - $p3c2x = $p3x + $bl / 2; - $p3y = $y00 + $h00 - $d1 - $brbgBL_V; - $p3c1y = $p3y + ($d1 + $brbgBL_V) * $mag; - $p4x = $x00 + $bl; - $p4y = $y00 + $h00 - $d1 - $brbgBL_V; - $p4c2y = $p4y + ($d2 + $brbgBL_V) * $mag; - if (-$d2 > \min($brbgBL_H, $brbgBL_V) || $flatten) { - $p1x = $x00 + $bl; - $p1c2x = $p1x; - $p2x = $x00 + $bl; - $p2c2x = $p2x - $bl * $mag2; - $p3y = $y00 + $h00 - $bl; - $p3c1y = $p3y + $bl * $mag2; - $p4y = $y00 + $h00 - $bl; - $p4c2y = $p4y; - } - $shadow .= \sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $p1c2x * Mpdf::SCALE, ($this->h - $p1y) * Mpdf::SCALE, $p4x * Mpdf::SCALE, ($this->h - $p4c2y) * Mpdf::SCALE, $p4x * Mpdf::SCALE, ($this->h - $p4y) * Mpdf::SCALE); - $patch_array[4]['f'] = 2; - $patch_array[4]['points'] = [$p2c2x, $p2y, $p3x, $p3c1y, $p3x, $p3y, $p3c2x, $p3y, $p4x, $p4y, $p4x, $p4y, $p4x, $p4c2y, $p1c2x, $p1y]; - $patch_array[4]['colors'] = [$col2, $col1]; - // LEFT - joins on the right (C3-C4 of previous): f = 2 - $p1x = $x00; - // control point only matches p3 preceding - $p1y = $y00 + $h00 - $d1 - $brbgBL_V; - $p2x = $x00 + $bl; - // control point only matches p4 preceding - $p2y = $y00 + $h00 - $d1 - $brbgBL_V; - $p3x = $x00 + $bl; - $p3y = $y00 + $d1 + $brbgTL_V; - $p4x = $x00; - $p4c1x = $p4x + $bl / 2; - $p4y = $y00 + $d1 + $brbgTL_V; - if (-$d2 > \min($brbgBL_H, $brbgBL_V) || $flatten) { - $p1y = $y00 + $h00 - $bl; - $p2y = $y00 + $h00 - $bl; - } - if (-$d2 > \min($brbgTL_H, $brbgTL_V) || $flatten) { - $p3y = $y00 + $bl; - $p4y = $y00 + $bl; - } - $shadow .= \sprintf('%.3F %.3F l ', $p3x * Mpdf::SCALE, ($this->h - $p3y) * Mpdf::SCALE); - $patch_array[5]['f'] = 2; - $patch_array[5]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4c1x, $p4y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; - $patch_array[5]['colors'] = [$col1, $col2]; - // TOP LEFT corner - $p1x = $x00 + $bl; - // control points only matches p3 preceding - $p1y = $y00 + $d1 + $brbgTL_V; - $p1c2y = $p1y - ($d2 + $brbgTL_V) * $mag; - $p2x = $x00; - // control point only matches p4 preceding - $p2y = $y00 + $d1 + $brbgTL_V; - $p2c2y = $p2y - ($d1 + $brbgTL_V) * $mag; - $p3x = $x00 + $d1 + $brbgTL_H; - $p3c1x = $p3x - ($d1 + $brbgTL_H) * $mag; - $p3y = $y00; - $p3c2y = $p3y + $bl / 2; - $p4x = $x00 + $d1 + $brbgTL_H; - $p4c2x = $p4x - ($d2 + $brbgTL_H) * $mag; - $p4y = $y00 + $bl; - if (-$d2 > \min($brbgTL_H, $brbgTL_V) || $flatten) { - $p1y = $y00 + $bl; - $p1c2y = $p1y; - $p2y = $y00 + $bl; - $p2c2y = $p2y - $bl * $mag2; - $p3x = $x00 + $bl; - $p3c1x = $p3x - $bl * $mag2; - $p4x = $x00 + $bl; - $p4c2x = $p4x; - } - $shadow .= \sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $p1x * Mpdf::SCALE, ($this->h - $p1c2y) * Mpdf::SCALE, $p4c2x * Mpdf::SCALE, ($this->h - $p4y) * Mpdf::SCALE, $p4x * Mpdf::SCALE, ($this->h - $p4y) * Mpdf::SCALE); - $patch_array[6]['f'] = 2; - $patch_array[6]['points'] = [$p2x, $p2c2y, $p3c1x, $p3y, $p3x, $p3y, $p3x, $p3c2y, $p4x, $p4y, $p4x, $p4y, $p4c2x, $p4y, $p1x, $p1c2y]; - $patch_array[6]['colors'] = [$col2, $col1]; - // TOP - joins on the right (C3-C4 of previous): f = 2 - $p1x = $x00 + $d1 + $brbgTL_H; - // control point only matches p3 preceding - $p1y = $y00; - $p2x = $x00 + $d1 + $brbgTL_H; - // control point only matches p4 preceding - $p2y = $y00 + $bl; - $p3x = $x00 + $w00 - $d1 - $brbgTR_H; - $p3y = $y00 + $bl; - $p4x = $x00 + $w00 - $d1 - $brbgTR_H; - $p4y = $y00; - $p4c1y = $p4y + $bl / 2; - if (-$d2 > \min($brbgTL_H, $brbgTL_V) || $flatten) { - $p1x = $x00 + $bl; - $p2x = $x00 + $bl; - } - if (-$d2 > \min($brbgTR_H, $brbgTR_V) || $flatten) { - $p3x = $x00 + $w00 - $bl; - $p4x = $x00 + $w00 - $bl; - } - $shadow .= \sprintf('%.3F %.3F l ', $p3x * Mpdf::SCALE, ($this->h - $p3y) * Mpdf::SCALE); - $patch_array[7]['f'] = 2; - $patch_array[7]['points'] = [$p2x, $p2y, $p3x, $p3y, $p3x, $p3y, $p3x, $p3y, $p4x, $p4c1y, $p4x, $p4y, $p4x, $p4y, $p1x, $p1y]; - $patch_array[7]['colors'] = [$col1, $col2]; - $shadow .= ' h f Q ' . "\n"; - // Close path and Fill the inner solid shadow - if ($bl) { - $shadow .= $this->gradient->CoonsPatchMesh($x00, $y00, $w00, $h00, $patch_array, $x00, $x00 + $w00, $y00, $y00 + $h00, $colspace, \true); - } - if ($sh['x'] || $sh['y']) { - $shadow .= ' Q' . "\n"; - // Shadow Offset - } - $shadow .= ' Q' . "\n"; - // Ends path no-op & Sets the clipping path - } - } - $s .= ' W n '; - // Ends path no-op & Sets the clipping path - if ($this->blk[$blvl]['bgcolor']) { - $this->pageBackgrounds[$blvl][] = ['x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h, 'col' => $this->blk[$blvl]['bgcolorarray'], 'clippath' => $s, 'visibility' => $this->visibility, 'shadow' => $shadow, 'z-index' => $this->current_layer]; - } elseif ($shadow) { - $this->pageBackgrounds[$blvl][] = ['x' => 0, 'y' => 0, 'w' => 0, 'h' => 0, 'shadowonly' => \true, 'col' => '', 'clippath' => '', 'visibility' => $this->visibility, 'shadow' => $shadow, 'z-index' => $this->current_layer]; - } - /* -- BACKGROUNDS -- */ - if (isset($this->blk[$blvl]['gradient'])) { - $g = $this->gradient->parseBackgroundGradient($this->blk[$blvl]['gradient']); - if ($g) { - $gx = $x0; - $gy = $y0; - $this->pageBackgrounds[$blvl][] = ['gradient' => \true, 'x' => $gx, 'y' => $gy, 'w' => $w, 'h' => $h, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s, 'visibility' => $this->visibility, 'z-index' => $this->current_layer]; - } - } - if (isset($this->blk[$blvl]['background-image'])) { - if (isset($this->blk[$blvl]['background-image']['gradient']) && $this->blk[$blvl]['background-image']['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->blk[$blvl]['background-image']['gradient'])) { - $g = $this->gradient->parseMozGradient($this->blk[$blvl]['background-image']['gradient']); - if ($g) { - $gx = $x0; - $gy = $y0; - // origin specifies the background-positioning-area (bpa) - if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { - $gx += $this->blk[$blvl]['border_left']['w']; - $w -= $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']; - if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { - $gy += $this->blk[$blvl]['border_top']['w']; - } - if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { - $gy1 = $y1 - $this->blk[$blvl]['border_bottom']['w']; - } else { - $gy1 = $y1; - } - $h = $gy1 - $gy; - } elseif ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { - $gx += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; - $w -= $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']; - if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { - $gy += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; - } - if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { - $gy1 = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); - } else { - $gy1 = $y1 - $this->blk[$blvl]['padding_bottom']; - } - $h = $gy1 - $gy; - } - if (isset($this->blk[$blvl]['background-image']['size']['w']) && $this->blk[$blvl]['background-image']['size']['w']) { - $size = $this->blk[$blvl]['background-image']['size']; - if ($size['w'] != 'contain' && $size['w'] != 'cover') { - if (\stristr($size['w'], '%')) { - $size['w'] = (float) $size['w']; - $size['w'] /= 100; - $w *= $size['w']; - } elseif ($size['w'] != 'auto') { - $w = $size['w']; - } - if (\stristr($size['h'], '%')) { - $size['h'] = (float) $size['h']; - $size['h'] /= 100; - $h *= $size['h']; - } elseif ($size['h'] != 'auto') { - $h = $size['h']; - } - } - } - $this->pageBackgrounds[$blvl][] = ['gradient' => \true, 'x' => $gx, 'y' => $gy, 'w' => $w, 'h' => $h, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s, 'visibility' => $this->visibility, 'z-index' => $this->current_layer]; - } - } else { - $image_id = $this->blk[$blvl]['background-image']['image_id']; - $orig_w = $this->blk[$blvl]['background-image']['orig_w']; - $orig_h = $this->blk[$blvl]['background-image']['orig_h']; - $x_pos = $this->blk[$blvl]['background-image']['x_pos']; - $y_pos = $this->blk[$blvl]['background-image']['y_pos']; - $x_repeat = $this->blk[$blvl]['background-image']['x_repeat']; - $y_repeat = $this->blk[$blvl]['background-image']['y_repeat']; - $resize = $this->blk[$blvl]['background-image']['resize']; - $opacity = $this->blk[$blvl]['background-image']['opacity']; - $itype = $this->blk[$blvl]['background-image']['itype']; - $size = $this->blk[$blvl]['background-image']['size']; - // origin specifies the background-positioning-area (bpa) - $bpa = ['x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h]; - if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { - $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w']; - $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); - if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { - $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w']; - } else { - $bpa['y'] = $y0; - } - if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { - $bpay = $y1 - $this->blk[$blvl]['border_bottom']['w']; - } else { - $bpay = $y1; - } - $bpa['h'] = $bpay - $bpa['y']; - } elseif ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { - $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; - $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); - if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { - $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; - } else { - $bpa['y'] = $y0 + $this->blk[$blvl]['padding_top']; - } - if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { - $bpay = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); - } else { - $bpay = $y1 - $this->blk[$blvl]['padding_bottom']; - } - $bpa['h'] = $bpay - $bpa['y']; - } - $this->pageBackgrounds[$blvl][] = ['x' => $x0, 'y' => $y0, 'w' => $w, 'h' => $h, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => $s, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype, 'visibility' => $this->visibility, 'z-index' => $this->current_layer, 'size' => $size, 'bpa' => $bpa]; - } - } - /* -- END BACKGROUNDS -- */ - // Float DIV - $this->blk[$blvl]['bb_painted'][$this->page] = \true; - } - /* -- BORDER-RADIUS -- */ - function _EllipseArc($x0, $y0, $rx, $ry, $seg = 1, $part = \false, $start = \false) - { - // Anticlockwise segment 1-4 TR-TL-BL-BR (part=1 or 2) - $s = ''; - if ($rx < 0) { - $rx = 0; - } - if ($ry < 0) { - $ry = 0; - } - $rx *= Mpdf::SCALE; - $ry *= Mpdf::SCALE; - $astart = 0; - if ($seg == 1) { - // Top Right - $afinish = 90; - $nSeg = 4; - } elseif ($seg == 2) { - // Top Left - $afinish = 180; - $nSeg = 8; - } elseif ($seg == 3) { - // Bottom Left - $afinish = 270; - $nSeg = 12; - } else { - // Bottom Right - $afinish = 360; - $nSeg = 16; - } - $astart = \deg2rad((float) $astart); - $afinish = \deg2rad((float) $afinish); - $totalAngle = $afinish - $astart; - $dt = $totalAngle / $nSeg; - // segment angle - $dtm = $dt / 3; - $x0 *= Mpdf::SCALE; - $y0 = ($this->h - $y0) * Mpdf::SCALE; - $t1 = $astart; - $a0 = $x0 + $rx * \cos($t1); - $b0 = $y0 + $ry * \sin($t1); - $c0 = -$rx * \sin($t1); - $d0 = $ry * \cos($t1); - $op = \false; - for ($i = 1; $i <= $nSeg; $i++) { - // Draw this bit of the total curve - $t1 = $i * $dt + $astart; - $a1 = $x0 + $rx * \cos($t1); - $b1 = $y0 + $ry * \sin($t1); - $c1 = -$rx * \sin($t1); - $d1 = $ry * \cos($t1); - if ($i > $nSeg - 4 && (!$part || $part == 1 && $i <= $nSeg - 2 || $part == 2 && $i > $nSeg - 2)) { - if ($start && !$op) { - $s .= \sprintf('%.3F %.3F m ', $a0, $b0); - } - $s .= \sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $a0 + $c0 * $dtm, $b0 + $d0 * $dtm, $a1 - $c1 * $dtm, $b1 - $d1 * $dtm, $a1, $b1); - $op = \true; - } - $a0 = $a1; - $b0 = $b1; - $c0 = $c1; - $d0 = $d1; - } - return $s; - } - /* -- END BORDER-RADIUS -- */ - function PaintDivLnBorder($state = 0, $blvl = 0, $h = 0) - { - // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom - $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $h; - $save_y = $this->y; - $w = $this->blk[$blvl]['width']; - $x0 = $this->x; - // left - $y0 = $this->y; - // top - $x1 = $this->x + $w; - // bottom - $y1 = $this->y + $h; - // bottom - $continuingpage = isset($this->blk[$blvl]['startpage']) && $this->blk[$blvl]['startpage'] != $this->page; - if ($this->blk[$blvl]['border_top'] && ($state == 1 || $state == 3)) { - $tbd = $this->blk[$blvl]['border_top']; - if (isset($tbd['s']) && $tbd['s']) { - $this->_setBorderLine($tbd); - $this->y = $y0 + $tbd['w'] / 2; - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], '', $continuingpage, 'T'); - $this->Line($x0 + $tbd['w'] / 2, $this->y, $x0 + $w - $tbd['w'] / 2, $this->y); - } else { - $this->SetLineJoin(0); - $this->SetLineCap(0); - $this->Line($x0, $this->y, $x0 + $w, $this->y); - } - $this->y += $tbd['w']; - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($this->blk[$blvl]['border_left']) { - $tbd = $this->blk[$blvl]['border_left']; - if (isset($tbd['s']) && $tbd['s']) { - $this->_setBorderLine($tbd); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->y = $y0 + $tbd['w'] / 2; - $this->_setDashBorder($tbd['style'], '', $continuingpage, 'L'); - $this->Line($x0 + $tbd['w'] / 2, $this->y, $x0 + $tbd['w'] / 2, $y0 + $h - $tbd['w'] / 2); - } else { - $this->y = $y0; - $this->SetLineJoin(0); - $this->SetLineCap(0); - $this->Line($x0 + $tbd['w'] / 2, $this->y, $x0 + $tbd['w'] / 2, $y0 + $h); - } - $this->y += $tbd['w']; - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($this->blk[$blvl]['border_right']) { - $tbd = $this->blk[$blvl]['border_right']; - if (isset($tbd['s']) && $tbd['s']) { - $this->_setBorderLine($tbd); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->y = $y0 + $tbd['w'] / 2; - $this->_setDashBorder($tbd['style'], '', $continuingpage, 'R'); - $this->Line($x0 + $w - $tbd['w'] / 2, $this->y, $x0 + $w - $tbd['w'] / 2, $y0 + $h - $tbd['w'] / 2); - } else { - $this->y = $y0; - $this->SetLineJoin(0); - $this->SetLineCap(0); - $this->Line($x0 + $w - $tbd['w'] / 2, $this->y, $x0 + $w - $tbd['w'] / 2, $y0 + $h); - } - $this->y += $tbd['w']; - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($this->blk[$blvl]['border_bottom'] && $state > 1) { - $tbd = $this->blk[$blvl]['border_bottom']; - if (isset($tbd['s']) && $tbd['s']) { - $this->_setBorderLine($tbd); - $this->y = $y0 + $h - $tbd['w'] / 2; - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], '', $continuingpage, 'B'); - $this->Line($x0 + $tbd['w'] / 2, $this->y, $x0 + $w - $tbd['w'] / 2, $this->y); - } else { - $this->SetLineJoin(0); - $this->SetLineCap(0); - $this->Line($x0, $this->y, $x0 + $w, $this->y); - } - $this->y += $tbd['w']; - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - $this->SetDash(); - $this->y = $save_y; - } - function PaintImgBorder($objattr, $is_table) - { - // Borders are disabled in columns - messes up the repositioning in printcolumnbuffer - if ($this->ColActive) { - return; - } - // *COLUMNS* - if ($is_table) { - $k = $this->shrin_k; - } else { - $k = 1; - } - $h = isset($objattr['BORDER-HEIGHT']) ? $objattr['BORDER-HEIGHT'] : 0; - $w = isset($objattr['BORDER-WIDTH']) ? $objattr['BORDER-WIDTH'] : 0; - $x0 = isset($objattr['BORDER-X']) ? $objattr['BORDER-X'] : 0; - $y0 = isset($objattr['BORDER-Y']) ? $objattr['BORDER-Y'] : 0; - // BORDERS - if ($objattr['border_top']) { - $tbd = $objattr['border_top']; - if (!empty($tbd['s'])) { - $this->_setBorderLine($tbd, $k); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], '', '', 'T'); - } - $this->Line($x0, $y0, $x0 + $w, $y0); - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($objattr['border_left']) { - $tbd = $objattr['border_left']; - if (!empty($tbd['s'])) { - $this->_setBorderLine($tbd, $k); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], '', '', 'L'); - } - $this->Line($x0, $y0, $x0, $y0 + $h); - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($objattr['border_right']) { - $tbd = $objattr['border_right']; - if (!empty($tbd['s'])) { - $this->_setBorderLine($tbd, $k); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], '', '', 'R'); - } - $this->Line($x0 + $w, $y0, $x0 + $w, $y0 + $h); - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - if ($objattr['border_bottom']) { - $tbd = $objattr['border_bottom']; - if (!empty($tbd['s'])) { - $this->_setBorderLine($tbd, $k); - if ($tbd['style'] == 'dotted' || $tbd['style'] == 'dashed') { - $this->_setDashBorder($tbd['style'], '', '', 'B'); - } - $this->Line($x0, $y0 + $h, $x0 + $w, $y0 + $h); - // Reset Corners and Dash off - $this->SetLineJoin(2); - $this->SetLineCap(2); - $this->SetDash(); - } - } - $this->SetDash(); - $this->SetAlpha(1); - } - /* -- END HTML-CSS -- */ - function Reset() - { - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - $this->SetAlpha(1); - $this->colorarray = ''; - $this->spanbgcolorarray = ''; - $this->spanbgcolor = \false; - $this->spanborder = \false; - $this->spanborddet = []; - $this->ResetStyles(); - $this->HREF = ''; - $this->textparam = []; - $this->SetTextOutline(); - $this->textvar = 0x0; - // mPDF 5.7.1 - $this->OTLtags = []; - $this->textshadow = ''; - $this->currentLang = $this->default_lang; - // mPDF 6 - $this->RestrictUnicodeFonts($this->default_available_fonts); - // mPDF 6 - $this->SetFont($this->default_font, '', 0, \false); - $this->SetFontSize($this->default_font_size, \false); - $this->currentfontfamily = ''; - $this->currentfontsize = ''; - $this->currentfontstyle = ''; - if ($this->tableLevel && isset($this->table[1][1]['cellLineHeight'])) { - $this->SetLineHeight('', $this->table[1][1]['cellLineHeight']); - } else { - if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { - $this->SetLineHeight('', $this->blk[$this->blklvl]['line_height']); - // sets default line height - } - } - $this->lSpacingCSS = ''; - $this->wSpacingCSS = ''; - $this->fixedlSpacing = \false; - $this->minwSpacing = 0; - $this->SetDash(); - // restore to no dash - $this->dash_on = \false; - $this->dotted_on = \false; - $this->divwidth = 0; - $this->divheight = 0; - $this->cellTextAlign = ''; - $this->cellLineHeight = ''; - $this->cellLineStackingStrategy = ''; - $this->cellLineStackingShift = ''; - $this->oldy = -1; - $bodystyle = []; - if (isset($this->cssManager->CSS['BODY']['FONT-STYLE'])) { - $bodystyle['FONT-STYLE'] = $this->cssManager->CSS['BODY']['FONT-STYLE']; - } - if (isset($this->cssManager->CSS['BODY']['FONT-WEIGHT'])) { - $bodystyle['FONT-WEIGHT'] = $this->cssManager->CSS['BODY']['FONT-WEIGHT']; - } - if (isset($this->cssManager->CSS['BODY']['COLOR'])) { - $bodystyle['COLOR'] = $this->cssManager->CSS['BODY']['COLOR']; - } - if (isset($bodystyle)) { - $this->setCSS($bodystyle, 'BLOCK', 'BODY'); - } - } - /* -- HTML-CSS -- */ - function ReadMetaTags($html) - { - // changes anykey=anyvalue to anykey="anyvalue" (only do this when this happens inside tags) - $regexp = '/ (\\w+?)=([^\\s>"]+)/si'; - $html = \preg_replace($regexp, " \$1=\"\$2\"", $html); - if (\preg_match('/(.*?)<\\/title>/si', $html, $m)) { - $this->SetTitle($m[1]); - } - \preg_match_all('/<meta [^>]*?(name|content)="([^>]*?)" [^>]*?(name|content)="([^>]*?)".*?>/si', $html, $aux); - $firstattr = $aux[1]; - $secondattr = $aux[3]; - for ($i = 0; $i < \count($aux[0]); $i++) { - $name = \strtoupper($firstattr[$i]) == "NAME" ? \strtoupper($aux[2][$i]) : \strtoupper($aux[4][$i]); - $content = \strtoupper($firstattr[$i]) == "CONTENT" ? $aux[2][$i] : $aux[4][$i]; - switch ($name) { - case "KEYWORDS": - $this->SetKeywords($content); - break; - case "AUTHOR": - $this->SetAuthor($content); - break; - case "DESCRIPTION": - $this->SetSubject($content); - break; - } - } - } - function ReadCharset($html) - { - // Charset conversion - if ($this->allow_charset_conversion) { - if (\preg_match('/<head.*charset=([^\'\\"\\s]*).*<\\/head>/si', $html, $m)) { - if (\strtoupper($m[1]) != 'UTF-8') { - $this->charset_in = \strtoupper($m[1]); - } - } - } - } - function setCSS($arrayaux, $type = '', $tag = '') - { - // type= INLINE | BLOCK | TABLECELL // tag= BODY - if (!\is_array($arrayaux)) { - return; - // Removes PHP Warning - } - // mPDF 5.7.3 inline text-decoration parameters - $preceeding_fontkey = $this->FontFamily . $this->FontStyle; - $preceeding_fontsize = $this->FontSize; - $spanbordset = \false; - $spanbgset = \false; - // mPDF 6 - $prevlevel = $this->blklvl == 0 ? 0 : $this->blklvl - 1; - // Set font size first so that e.g. MARGIN 0.83em works on font size for this element - if (isset($arrayaux['FONT-SIZE'])) { - $v = $arrayaux['FONT-SIZE']; - $firstLetter = \substr($v, 0, 1); - if (\is_numeric($firstLetter) || $firstLetter === '.') { - if ($type == 'BLOCK' && $this->blklvl > 0 && isset($this->blk[$this->blklvl - 1]['InlineProperties']) && isset($this->blk[$this->blklvl - 1]['InlineProperties']['size'])) { - $mmsize = $this->sizeConverter->convert($v, $this->blk[$this->blklvl - 1]['InlineProperties']['size']); - } elseif ($type == 'TABLECELL') { - $mmsize = $this->sizeConverter->convert($v, $this->default_font_size / Mpdf::SCALE); - } else { - $mmsize = $this->sizeConverter->convert($v, $this->FontSize); - } - $this->SetFontSize($mmsize * Mpdf::SCALE, \false); - // Get size in points (pt) - } else { - $v = \strtoupper($v); - if (isset($this->fontsizes[$v])) { - $this->SetFontSize($this->fontsizes[$v] * $this->default_font_size, \false); - } - } - if ($tag == 'BODY') { - $this->SetDefaultFontSize($this->FontSizePt); - } - } - // mPDF 6 - if (isset($arrayaux['LANG']) && $arrayaux['LANG']) { - if ($this->autoLangToFont && !$this->usingCoreFont) { - if ($arrayaux['LANG'] != $this->default_lang && $arrayaux['LANG'] != 'UTF-8') { - list($coreSuitable, $mpdf_pdf_unifont) = $this->languageToFont->getLanguageOptions($arrayaux['LANG'], $this->useAdobeCJK); - if ($mpdf_pdf_unifont) { - $arrayaux['FONT-FAMILY'] = $mpdf_pdf_unifont; - } - if ($tag == 'BODY') { - $this->default_lang = $arrayaux['LANG']; - } - } - } - $this->currentLang = $arrayaux['LANG']; - } - // FOR INLINE and BLOCK OR 'BODY' - if (isset($arrayaux['FONT-FAMILY'])) { - $v = $arrayaux['FONT-FAMILY']; - // If it is a font list, get all font types - $aux_fontlist = \explode(",", $v); - $found = 0; - foreach ($aux_fontlist as $f) { - $fonttype = \trim($f); - $fonttype = \preg_replace('/["\']*(.*?)["\']*/', '\\1', $fonttype); - $fonttype = \preg_replace('/ /', '', $fonttype); - $v = \strtolower(\trim($fonttype)); - if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { - $v = $this->fonttrans[$v]; - } - if (!$this->onlyCoreFonts && \in_array($v, $this->available_unifonts) || \in_array($v, ['ccourier', 'ctimes', 'chelvetica']) || $this->onlyCoreFonts && \in_array($v, ['courier', 'times', 'helvetica', 'arial']) || \in_array($v, ['sjis', 'uhc', 'big5', 'gb'])) { - $fonttype = $v; - $found = 1; - break; - } - } - if (!$found) { - foreach ($aux_fontlist as $f) { - $fonttype = \trim($f); - $fonttype = \preg_replace('/["\']*(.*?)["\']*/', '\\1', $fonttype); - $fonttype = \preg_replace('/ /', '', $fonttype); - $v = \strtolower(\trim($fonttype)); - if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { - $v = $this->fonttrans[$v]; - } - if (\in_array($v, $this->sans_fonts) || \in_array($v, $this->serif_fonts) || \in_array($v, $this->mono_fonts)) { - $fonttype = $v; - break; - } - } - } - if ($tag == 'BODY') { - $this->SetDefaultFont($fonttype); - } - $this->SetFont($fonttype, $this->currentfontstyle, 0, \false); - } else { - $this->SetFont($this->currentfontfamily, $this->currentfontstyle, 0, \false); - } - foreach ($arrayaux as $k => $v) { - if ($type != 'INLINE' && $tag != 'BODY' && $type != 'TABLECELL') { - switch ($k) { - // BORDERS - case 'BORDER-TOP': - $this->blk[$this->blklvl]['border_top'] = $this->border_details($v); - if ($this->blk[$this->blklvl]['border_top']['s']) { - $this->blk[$this->blklvl]['border'] = 1; - } - break; - case 'BORDER-BOTTOM': - $this->blk[$this->blklvl]['border_bottom'] = $this->border_details($v); - if ($this->blk[$this->blklvl]['border_bottom']['s']) { - $this->blk[$this->blklvl]['border'] = 1; - } - break; - case 'BORDER-LEFT': - $this->blk[$this->blklvl]['border_left'] = $this->border_details($v); - if ($this->blk[$this->blklvl]['border_left']['s']) { - $this->blk[$this->blklvl]['border'] = 1; - } - break; - case 'BORDER-RIGHT': - $this->blk[$this->blklvl]['border_right'] = $this->border_details($v); - if ($this->blk[$this->blklvl]['border_right']['s']) { - $this->blk[$this->blklvl]['border'] = 1; - } - break; - // PADDING - case 'PADDING-TOP': - $this->blk[$this->blklvl]['padding_top'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'PADDING-BOTTOM': - $this->blk[$this->blklvl]['padding_bottom'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'PADDING-LEFT': - if (($tag == 'UL' || $tag == 'OL') && $v == 'auto') { - $this->blk[$this->blklvl]['padding_left'] = 'auto'; - break; - } - $this->blk[$this->blklvl]['padding_left'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'PADDING-RIGHT': - if (($tag == 'UL' || $tag == 'OL') && $v == 'auto') { - $this->blk[$this->blklvl]['padding_right'] = 'auto'; - break; - } - $this->blk[$this->blklvl]['padding_right'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - // MARGINS - case 'MARGIN-TOP': - $tmp = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - if (isset($this->blk[$this->blklvl]['lastbottommargin'])) { - if ($tmp > $this->blk[$this->blklvl]['lastbottommargin']) { - $tmp -= $this->blk[$this->blklvl]['lastbottommargin']; - } else { - $tmp = 0; - } - } - $this->blk[$this->blklvl]['margin_top'] = $tmp; - break; - case 'MARGIN-BOTTOM': - $this->blk[$this->blklvl]['margin_bottom'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'MARGIN-LEFT': - $this->blk[$this->blklvl]['margin_left'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'MARGIN-RIGHT': - $this->blk[$this->blklvl]['margin_right'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - /* -- BORDER-RADIUS -- */ - case 'BORDER-TOP-LEFT-RADIUS-H': - $this->blk[$this->blklvl]['border_radius_TL_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-TOP-LEFT-RADIUS-V': - $this->blk[$this->blklvl]['border_radius_TL_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-TOP-RIGHT-RADIUS-H': - $this->blk[$this->blklvl]['border_radius_TR_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-TOP-RIGHT-RADIUS-V': - $this->blk[$this->blklvl]['border_radius_TR_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-BOTTOM-LEFT-RADIUS-H': - $this->blk[$this->blklvl]['border_radius_BL_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-BOTTOM-LEFT-RADIUS-V': - $this->blk[$this->blklvl]['border_radius_BL_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-BOTTOM-RIGHT-RADIUS-H': - $this->blk[$this->blklvl]['border_radius_BR_H'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - case 'BORDER-BOTTOM-RIGHT-RADIUS-V': - $this->blk[$this->blklvl]['border_radius_BR_V'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - break; - /* -- END BORDER-RADIUS -- */ - case 'BOX-SHADOW': - $bs = $this->cssManager->setCSSboxshadow($v); - if ($bs) { - $this->blk[$this->blklvl]['box_shadow'] = $bs; - } - break; - case 'BACKGROUND-CLIP': - if (\strtoupper($v) == 'PADDING-BOX') { - $this->blk[$this->blklvl]['background_clip'] = 'padding-box'; - } elseif (\strtoupper($v) == 'CONTENT-BOX') { - $this->blk[$this->blklvl]['background_clip'] = 'content-box'; - } - break; - case 'PAGE-BREAK-AFTER': - if (\strtoupper($v) == 'AVOID') { - $this->blk[$this->blklvl]['page_break_after_avoid'] = \true; - } elseif (\strtoupper($v) == 'ALWAYS' || \strtoupper($v) == 'LEFT' || \strtoupper($v) == 'RIGHT') { - $this->blk[$this->blklvl]['page_break_after'] = \strtoupper($v); - } - break; - // mPDF 6 pagebreaktype - case 'BOX-DECORATION-BREAK': - if (\strtoupper($v) == 'CLONE') { - $this->blk[$this->blklvl]['box_decoration_break'] = 'clone'; - } elseif (\strtoupper($v) == 'SLICE') { - $this->blk[$this->blklvl]['box_decoration_break'] = 'slice'; - } - break; - case 'WIDTH': - if (\strtoupper($v) != 'AUTO') { - $this->blk[$this->blklvl]['css_set_width'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false); - } - break; - // mPDF 6 Lists - // LISTS - case 'LIST-STYLE-TYPE': - $this->blk[$this->blklvl]['list_style_type'] = \strtolower($v); - break; - case 'LIST-STYLE-IMAGE': - $this->blk[$this->blklvl]['list_style_image'] = \strtolower($v); - break; - case 'LIST-STYLE-POSITION': - $this->blk[$this->blklvl]['list_style_position'] = \strtolower($v); - break; - } - //end of switch($k) - } - if ($type != 'INLINE' && $type != 'TABLECELL') { - // All block-level, including BODY tag - switch ($k) { - case 'TEXT-INDENT': - // Computed value - to inherit - $this->blk[$this->blklvl]['text_indent'] = $this->sizeConverter->convert($v, $this->blk[$prevlevel]['inner_width'], $this->FontSize, \false) . 'mm'; - break; - case 'MARGIN-COLLAPSE': - // Custom tag to collapse margins at top and bottom of page - if (\strtoupper($v) == 'COLLAPSE') { - $this->blk[$this->blklvl]['margin_collapse'] = \true; - } - break; - case 'LINE-HEIGHT': - $this->blk[$this->blklvl]['line_height'] = $this->fixLineheight($v); - if (!$this->blk[$this->blklvl]['line_height']) { - $this->blk[$this->blklvl]['line_height'] = 'N'; - } - // mPDF 6 - break; - // mPDF 6 - case 'LINE-STACKING-STRATEGY': - $this->blk[$this->blklvl]['line_stacking_strategy'] = \strtolower($v); - break; - case 'LINE-STACKING-SHIFT': - $this->blk[$this->blklvl]['line_stacking_shift'] = \strtolower($v); - break; - case 'TEXT-ALIGN': - // left right center justify - switch (\strtoupper($v)) { - case 'LEFT': - $this->blk[$this->blklvl]['align'] = "L"; - break; - case 'CENTER': - $this->blk[$this->blklvl]['align'] = "C"; - break; - case 'RIGHT': - $this->blk[$this->blklvl]['align'] = "R"; - break; - case 'JUSTIFY': - $this->blk[$this->blklvl]['align'] = "J"; - break; - } - break; - /* -- BACKGROUNDS -- */ - case 'BACKGROUND-GRADIENT': - if ($type == 'BLOCK') { - $this->blk[$this->blklvl]['gradient'] = $v; - } - break; - /* -- END BACKGROUNDS -- */ - case 'DIRECTION': - if ($v) { - $this->blk[$this->blklvl]['direction'] = \strtolower($v); - } - break; - } - } - // FOR INLINE ONLY - if ($type == 'INLINE') { - switch ($k) { - case 'DISPLAY': - if (\strtoupper($v) == 'NONE') { - $this->inlineDisplayOff = \true; - } - break; - case 'DIRECTION': - break; - } - } - // FOR INLINE ONLY - if ($type == 'INLINE') { - switch ($k) { - // BORDERS - case 'BORDER-TOP': - $this->spanborddet['T'] = $this->border_details($v); - $this->spanborder = \true; - $spanbordset = \true; - break; - case 'BORDER-BOTTOM': - $this->spanborddet['B'] = $this->border_details($v); - $this->spanborder = \true; - $spanbordset = \true; - break; - case 'BORDER-LEFT': - $this->spanborddet['L'] = $this->border_details($v); - $this->spanborder = \true; - $spanbordset = \true; - break; - case 'BORDER-RIGHT': - $this->spanborddet['R'] = $this->border_details($v); - $this->spanborder = \true; - $spanbordset = \true; - break; - case 'VISIBILITY': - // block is set in OpenTag - $v = \strtolower($v); - if ($v == 'visible' || $v == 'hidden' || $v == 'printonly' || $v == 'screenonly') { - $this->textparam['visibility'] = $v; - } - break; - } - //end of switch($k) - } - if ($type != 'TABLECELL') { - // FOR INLINE and BLOCK - switch ($k) { - case 'TEXT-ALIGN': - // left right center justify - if (\strtoupper($v) == 'NOJUSTIFY' && $this->blk[$this->blklvl]['align'] == "J") { - $this->blk[$this->blklvl]['align'] = ""; - } - break; - // bgcolor only - to stay consistent with original html2fpdf - case 'BACKGROUND': - case 'BACKGROUND-COLOR': - $cor = $this->colorConverter->convert($v, $this->PDFAXwarnings); - if ($cor) { - if ($tag == 'BODY') { - $this->bodyBackgroundColor = $cor; - } elseif ($type == 'INLINE') { - $this->spanbgcolorarray = $cor; - $this->spanbgcolor = \true; - $spanbgset = \true; - } else { - $this->blk[$this->blklvl]['bgcolorarray'] = $cor; - $this->blk[$this->blklvl]['bgcolor'] = \true; - } - } elseif ($type != 'INLINE') { - if ($this->ColActive) { - $this->blk[$this->blklvl]['bgcolorarray'] = $this->blk[$prevlevel]['bgcolorarray']; - $this->blk[$this->blklvl]['bgcolor'] = $this->blk[$prevlevel]['bgcolor']; - } - } - break; - case 'VERTICAL-ALIGN': - // super and sub only dealt with here e.g. <SUB> and <SUP> - switch (\strtoupper($v)) { - case 'SUPER': - $this->textvar = $this->textvar | TextVars::FA_SUPERSCRIPT; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FA_SUBSCRIPT; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['text-baseline'])) { - $this->textparam['text-baseline'] += $this->baselineSup * $preceeding_fontsize; - } else { - $this->textparam['text-baseline'] = $this->baselineSup * $preceeding_fontsize; - } - break; - case 'SUB': - $this->textvar = $this->textvar | TextVars::FA_SUBSCRIPT; - $this->textvar = $this->textvar & ~TextVars::FA_SUPERSCRIPT; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['text-baseline'])) { - $this->textparam['text-baseline'] += $this->baselineSub * $preceeding_fontsize; - } else { - $this->textparam['text-baseline'] = $this->baselineSub * $preceeding_fontsize; - } - break; - case 'BASELINE': - $this->textvar = $this->textvar & ~TextVars::FA_SUBSCRIPT; - $this->textvar = $this->textvar & ~TextVars::FA_SUPERSCRIPT; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['text-baseline'])) { - unset($this->textparam['text-baseline']); - } - break; - // mPDF 5.7.3 inline text-decoration parameters - default: - $lh = $this->_computeLineheight($this->blk[$this->blklvl]['line_height']); - $sz = $this->sizeConverter->convert($v, $lh, $this->FontSize, \false); - $this->textvar = $this->textvar & ~TextVars::FA_SUBSCRIPT; - $this->textvar = $this->textvar & ~TextVars::FA_SUPERSCRIPT; - if ($sz) { - if ($sz > 0) { - $this->textvar = $this->textvar | TextVars::FA_SUPERSCRIPT; - } else { - $this->textvar = $this->textvar | TextVars::FA_SUBSCRIPT; - } - if (isset($this->textparam['text-baseline'])) { - $this->textparam['text-baseline'] += $sz; - } else { - $this->textparam['text-baseline'] = $sz; - } - } - } - break; - } - //end of switch($k) - } - // FOR ALL - switch ($k) { - case 'LETTER-SPACING': - $this->lSpacingCSS = $v; - if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && \strtoupper($this->lSpacingCSS) != 'NORMAL') { - $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize); - } - break; - case 'WORD-SPACING': - $this->wSpacingCSS = $v; - if ($this->wSpacingCSS && \strtoupper($this->wSpacingCSS) != 'NORMAL') { - $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize); - } - break; - case 'FONT-STYLE': - // italic normal oblique - switch (\strtoupper($v)) { - case 'ITALIC': - case 'OBLIQUE': - $this->SetStyle('I', \true); - break; - case 'NORMAL': - $this->SetStyle('I', \false); - break; - } - break; - case 'FONT-WEIGHT': - // normal bold // Does not support: bolder, lighter, 100..900(step value=100) - switch (\strtoupper($v)) { - case 'BOLD': - $this->SetStyle('B', \true); - break; - case 'NORMAL': - $this->SetStyle('B', \false); - break; - } - break; - case 'FONT-KERNING': - if (\strtoupper($v) == 'NORMAL' || \strtoupper($v) == 'AUTO' && $this->useKerning) { - /* -- OTL -- */ - if ($this->CurrentFont['haskernGPOS']) { - if (isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] .= ' kern'; - } else { - $this->OTLtags['Plus'] = ' kern'; - } - } else { - // *OTL* - $this->textvar = $this->textvar | TextVars::FC_KERNING; - } - // *OTL* - } elseif (\strtoupper($v) == 'NONE' || \strtoupper($v) == 'AUTO' && !$this->useKerning) { - if (isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] = \str_replace('kern', '', $this->OTLtags['Plus']); - // *OTL* - } - if (isset($this->OTLtags['FFPlus'])) { - $this->OTLtags['FFPlus'] = \preg_replace('/kern[\\d]*/', '', $this->OTLtags['FFPlus']); - } - $this->textvar = $this->textvar & ~TextVars::FC_KERNING; - } - break; - /* -- OTL -- */ - case 'FONT-LANGUAGE-OVERRIDE': - $v = \strtoupper($v); - if (\strpos($v, 'NORMAL') !== \false) { - $this->fontLanguageOverride = ''; - } else { - $this->fontLanguageOverride = \trim($v); - } - break; - case 'FONT-VARIANT-POSITION': - if (isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] = \str_replace(['sups', 'subs'], '', $this->OTLtags['Plus']); - } - switch (\strtoupper($v)) { - case 'SUPER': - $this->OTLtags['Plus'] .= ' sups'; - break; - case 'SUB': - $this->OTLtags['Plus'] .= ' subs'; - break; - case 'NORMAL': - break; - } - break; - case 'FONT-VARIANT-CAPS': - $v = \strtoupper($v); - if (!isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] = ''; - } - $this->OTLtags['Plus'] = \str_replace(['c2sc', 'smcp', 'c2pc', 'pcap', 'unic', 'titl'], '', $this->OTLtags['Plus']); - $this->textvar = $this->textvar & ~TextVars::FC_SMALLCAPS; - // ?????????????? <small-caps> - if (\strpos($v, 'ALL-SMALL-CAPS') !== \false) { - $this->OTLtags['Plus'] .= ' c2sc smcp'; - } elseif (\strpos($v, 'SMALL-CAPS') !== \false) { - if (isset($this->CurrentFont['hassmallcapsGSUB']) && $this->CurrentFont['hassmallcapsGSUB']) { - $this->OTLtags['Plus'] .= ' smcp'; - } else { - $this->textvar = $this->textvar | TextVars::FC_SMALLCAPS; - } - } elseif (\strpos($v, 'ALL-PETITE-CAPS') !== \false) { - $this->OTLtags['Plus'] .= ' c2pc pcap'; - } elseif (\strpos($v, 'PETITE-CAPS') !== \false) { - $this->OTLtags['Plus'] .= ' pcap'; - } elseif (\strpos($v, 'UNICASE') !== \false) { - $this->OTLtags['Plus'] .= ' unic'; - } elseif (\strpos($v, 'TITLING-CAPS') !== \false) { - $this->OTLtags['Plus'] .= ' titl'; - } - break; - case 'FONT-VARIANT-LIGATURES': - $v = \strtoupper($v); - if (!isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] = ''; - } - if (!isset($this->OTLtags['Minus'])) { - $this->OTLtags['Minus'] = ''; - } - if (\strpos($v, 'NORMAL') !== \false) { - $this->OTLtags['Minus'] = \str_replace(['liga', 'clig', 'calt'], '', $this->OTLtags['Minus']); - $this->OTLtags['Plus'] = \str_replace(['dlig', 'hlig'], '', $this->OTLtags['Plus']); - } elseif (\strpos($v, 'NONE') !== \false) { - $this->OTLtags['Minus'] .= ' liga clig calt'; - $this->OTLtags['Plus'] = \str_replace(['dlig', 'hlig'], '', $this->OTLtags['Plus']); - } - if (\strpos($v, 'NO-COMMON-LIGATURES') !== \false) { - $this->OTLtags['Minus'] .= ' liga clig'; - } elseif (\strpos($v, 'COMMON-LIGATURES') !== \false) { - $this->OTLtags['Minus'] = \str_replace(['liga', 'clig'], '', $this->OTLtags['Minus']); - } - if (\strpos($v, 'NO-CONTEXTUAL') !== \false) { - $this->OTLtags['Minus'] .= ' calt'; - } elseif (\strpos($v, 'CONTEXTUAL') !== \false) { - $this->OTLtags['Minus'] = \str_replace('calt', '', $this->OTLtags['Minus']); - } - if (\strpos($v, 'NO-DISCRETIONARY-LIGATURES') !== \false) { - $this->OTLtags['Plus'] = \str_replace('dlig', '', $this->OTLtags['Plus']); - } elseif (\strpos($v, 'DISCRETIONARY-LIGATURES') !== \false) { - $this->OTLtags['Plus'] .= ' dlig'; - } - if (\strpos($v, 'NO-HISTORICAL-LIGATURES') !== \false) { - $this->OTLtags['Plus'] = \str_replace('hlig', '', $this->OTLtags['Plus']); - } elseif (\strpos($v, 'HISTORICAL-LIGATURES') !== \false) { - $this->OTLtags['Plus'] .= ' hlig'; - } - break; - case 'FONT-VARIANT-NUMERIC': - $v = \strtoupper($v); - if (!isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] = ''; - } - if (\strpos($v, 'NORMAL') !== \false) { - $this->OTLtags['Plus'] = \str_replace(['ordn', 'zero', 'lnum', 'onum', 'pnum', 'tnum', 'frac', 'afrc'], '', $this->OTLtags['Plus']); - } - if (\strpos($v, 'ORDINAL') !== \false) { - $this->OTLtags['Plus'] .= ' ordn'; - } - if (\strpos($v, 'SLASHED-ZERO') !== \false) { - $this->OTLtags['Plus'] .= ' zero'; - } - if (\strpos($v, 'LINING-NUMS') !== \false) { - $this->OTLtags['Plus'] .= ' lnum'; - $this->OTLtags['Plus'] = \str_replace('onum', '', $this->OTLtags['Plus']); - } elseif (\strpos($v, 'OLDSTYLE-NUMS') !== \false) { - $this->OTLtags['Plus'] .= ' onum'; - $this->OTLtags['Plus'] = \str_replace('lnum', '', $this->OTLtags['Plus']); - } - if (\strpos($v, 'PROPORTIONAL-NUMS') !== \false) { - $this->OTLtags['Plus'] .= ' pnum'; - $this->OTLtags['Plus'] = \str_replace('tnum', '', $this->OTLtags['Plus']); - } elseif (\strpos($v, 'TABULAR-NUMS') !== \false) { - $this->OTLtags['Plus'] .= ' tnum'; - $this->OTLtags['Plus'] = \str_replace('pnum', '', $this->OTLtags['Plus']); - } - if (\strpos($v, 'DIAGONAL-FRACTIONS') !== \false) { - $this->OTLtags['Plus'] .= ' frac'; - $this->OTLtags['Plus'] = \str_replace('afrc', '', $this->OTLtags['Plus']); - } elseif (\strpos($v, 'STACKED-FRACTIONS') !== \false) { - $this->OTLtags['Plus'] .= ' afrc'; - $this->OTLtags['Plus'] = \str_replace('frac', '', $this->OTLtags['Plus']); - } - break; - case 'FONT-VARIANT-ALTERNATES': - // Only supports historical-forms - $v = \strtoupper($v); - if (!isset($this->OTLtags['Plus'])) { - $this->OTLtags['Plus'] = ''; - } - if (\strpos($v, 'NORMAL') !== \false) { - $this->OTLtags['Plus'] = \str_replace('hist', '', $this->OTLtags['Plus']); - } - if (\strpos($v, 'HISTORICAL-FORMS') !== \false) { - $this->OTLtags['Plus'] .= ' hist'; - } - break; - case 'FONT-FEATURE-SETTINGS': - $v = \strtolower($v); - if (\strpos($v, 'normal') !== \false) { - $this->OTLtags['FFMinus'] = ''; - $this->OTLtags['FFPlus'] = ''; - } else { - if (!isset($this->OTLtags['FFPlus'])) { - $this->OTLtags['FFPlus'] = ''; - } - if (!isset($this->OTLtags['FFMinus'])) { - $this->OTLtags['FFMinus'] = ''; - } - $tags = \preg_split('/[,]/', $v); - foreach ($tags as $t) { - if (\preg_match('/[\\"\']([a-zA-Z0-9]{4})[\\"\']\\s*(on|off|\\d*){0,1}/', $t, $m)) { - if ($m[2] == 'off' || $m[2] === '0') { - if (\strpos($this->OTLtags['FFMinus'], $m[1]) === \false) { - $this->OTLtags['FFMinus'] .= ' ' . $m[1]; - } - $this->OTLtags['FFPlus'] = \preg_replace('/' . $m[1] . '[\\d]*/', '', $this->OTLtags['FFPlus']); - } else { - if ($m[2] == 'on') { - $m[2] = '1'; - } - if (\strpos($this->OTLtags['FFPlus'], $m[1]) === \false) { - $this->OTLtags['FFPlus'] .= ' ' . $m[1] . $m[2]; - } - $this->OTLtags['FFMinus'] = \str_replace($m[1], '', $this->OTLtags['FFMinus']); - } - } - } - } - break; - /* -- END OTL -- */ - case 'TEXT-TRANSFORM': - // none uppercase lowercase // Does support: capitalize - switch (\strtoupper($v)) { - // Not working 100% - case 'CAPITALIZE': - $this->textvar = $this->textvar | TextVars::FT_CAPITALIZE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_UPPERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_LOWERCASE; - // mPDF 5.7.1 - break; - case 'UPPERCASE': - $this->textvar = $this->textvar | TextVars::FT_UPPERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_LOWERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_CAPITALIZE; - // mPDF 5.7.1 - break; - case 'LOWERCASE': - $this->textvar = $this->textvar | TextVars::FT_LOWERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_UPPERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_CAPITALIZE; - // mPDF 5.7.1 - break; - case 'NONE': - break; - $this->textvar = $this->textvar & ~TextVars::FT_UPPERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_LOWERCASE; - // mPDF 5.7.1 - $this->textvar = $this->textvar & ~TextVars::FT_CAPITALIZE; - } - break; - case 'TEXT-SHADOW': - $ts = $this->cssManager->setCSStextshadow($v); - if ($ts) { - $this->textshadow = $ts; - } - break; - case 'HYPHENS': - if (\strtoupper($v) == 'NONE') { - $this->textparam['hyphens'] = 2; - } elseif (\strtoupper($v) == 'AUTO') { - $this->textparam['hyphens'] = 1; - } elseif (\strtoupper($v) == 'MANUAL') { - $this->textparam['hyphens'] = 0; - } - break; - case 'TEXT-OUTLINE': - if (\strtoupper($v) == 'NONE') { - $this->textparam['outline-s'] = \false; - } - break; - case 'TEXT-OUTLINE-WIDTH': - case 'OUTLINE-WIDTH': - switch (\strtoupper($v)) { - case 'THIN': - $v = '0.03em'; - break; - case 'MEDIUM': - $v = '0.05em'; - break; - case 'THICK': - $v = '0.07em'; - break; - } - $w = $this->sizeConverter->convert($v, $this->FontSize, $this->FontSize); - if ($w) { - $this->textparam['outline-WIDTH'] = $w; - $this->textparam['outline-s'] = \true; - } else { - $this->textparam['outline-s'] = \false; - } - break; - case 'TEXT-OUTLINE-COLOR': - case 'OUTLINE-COLOR': - if (\strtoupper($v) == 'INVERT') { - if ($this->colorarray) { - $cor = $this->colorarray; - $this->textparam['outline-COLOR'] = $this->colorConverter->invert($cor); - } else { - $this->textparam['outline-COLOR'] = $this->colorConverter->convert(255, $this->PDFAXwarnings); - } - } else { - $cor = $this->colorConverter->convert($v, $this->PDFAXwarnings); - if ($cor) { - $this->textparam['outline-COLOR'] = $cor; - } - } - break; - case 'COLOR': - // font color - $cor = $this->colorConverter->convert($v, $this->PDFAXwarnings); - if ($cor) { - $this->colorarray = $cor; - $this->SetTColor($cor); - } - break; - } - //end of switch($k) - } - //end of foreach - // mPDF 5.7.3 inline text-decoration parameters - // Needs to be set at the end - after vertical-align = super/sub, so that textparam['text-baseline'] is set - if (isset($arrayaux['TEXT-DECORATION'])) { - $v = $arrayaux['TEXT-DECORATION']; - // none underline line-through (strikeout) // Does not support: blink - if (\stristr($v, 'LINE-THROUGH')) { - $this->textvar = $this->textvar | TextVars::FD_LINETHROUGH; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['text-baseline'])) { - $this->textparam['s-decoration']['baseline'] = $this->textparam['text-baseline']; - } else { - $this->textparam['s-decoration']['baseline'] = 0; - } - $this->textparam['s-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; - $this->textparam['s-decoration']['fontsize'] = $this->FontSize; - $this->textparam['s-decoration']['color'] = \strtoupper($this->TextColor); - // change 0 0 0 rg to 0 0 0 RG - } - if (\stristr($v, 'UNDERLINE')) { - $this->textvar = $this->textvar | TextVars::FD_UNDERLINE; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['text-baseline'])) { - $this->textparam['u-decoration']['baseline'] = $this->textparam['text-baseline']; - } else { - $this->textparam['u-decoration']['baseline'] = 0; - } - $this->textparam['u-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; - $this->textparam['u-decoration']['fontsize'] = $this->FontSize; - $this->textparam['u-decoration']['color'] = \strtoupper($this->TextColor); - // change 0 0 0 rg to 0 0 0 RG - } - if (\stristr($v, 'OVERLINE')) { - $this->textvar = $this->textvar | TextVars::FD_OVERLINE; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['text-baseline'])) { - $this->textparam['o-decoration']['baseline'] = $this->textparam['text-baseline']; - } else { - $this->textparam['o-decoration']['baseline'] = 0; - } - $this->textparam['o-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; - $this->textparam['o-decoration']['fontsize'] = $this->FontSize; - $this->textparam['o-decoration']['color'] = \strtoupper($this->TextColor); - // change 0 0 0 rg to 0 0 0 RG - } - if (\stristr($v, 'NONE')) { - $this->textvar = $this->textvar & ~TextVars::FD_UNDERLINE; - $this->textvar = $this->textvar & ~TextVars::FD_LINETHROUGH; - $this->textvar = $this->textvar & ~TextVars::FD_OVERLINE; - // mPDF 5.7.3 inline text-decoration parameters - if (isset($this->textparam['u-decoration'])) { - unset($this->textparam['u-decoration']); - } - if (isset($this->textparam['s-decoration'])) { - unset($this->textparam['s-decoration']); - } - if (isset($this->textparam['o-decoration'])) { - unset($this->textparam['o-decoration']); - } - } - } - // mPDF 6 - if ($spanbordset) { - // BORDER has been set on this INLINE element - if (isset($this->textparam['text-baseline'])) { - $this->textparam['bord-decoration']['baseline'] = $this->textparam['text-baseline']; - } else { - $this->textparam['bord-decoration']['baseline'] = 0; - } - $this->textparam['bord-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; - $this->textparam['bord-decoration']['fontsize'] = $this->FontSize; - } - if ($spanbgset) { - // BACKGROUND[-COLOR] has been set on this INLINE element - if (isset($this->textparam['text-baseline'])) { - $this->textparam['bg-decoration']['baseline'] = $this->textparam['text-baseline']; - } else { - $this->textparam['bg-decoration']['baseline'] = 0; - } - $this->textparam['bg-decoration']['fontkey'] = $this->FontFamily . $this->FontStyle; - $this->textparam['bg-decoration']['fontsize'] = $this->FontSize; - } - } - /* -- END HTML-CSS -- */ - function SetStyle($tag, $enable) - { - $this->{$tag} = $enable; - $style = ''; - foreach (['B', 'I'] as $s) { - if ($this->{$s}) { - $style .= $s; - } - } - $this->currentfontstyle = $style; - $this->SetFont('', $style, 0, \false); - } - // Set multiple styles at one time - function SetStylesArray($arr) - { - $style = ''; - foreach (['B', 'I'] as $s) { - if (isset($arr[$s])) { - if ($arr[$s]) { - $this->{$s} = \true; - $style .= $s; - } else { - $this->{$s} = \false; - } - } elseif ($this->{$s}) { - $style .= $s; - } - } - $this->currentfontstyle = $style; - $this->SetFont('', $style, 0, \false); - } - // Set multiple styles at one $str e.g. "BI" - function SetStyles($str) - { - $style = ''; - foreach (['B', 'I'] as $s) { - if (\strpos($str, $s) !== \false) { - $this->{$s} = \true; - $style .= $s; - } else { - $this->{$s} = \false; - } - } - $this->currentfontstyle = $style; - $this->SetFont('', $style, 0, \false); - } - function ResetStyles() - { - foreach (['B', 'I'] as $s) { - $this->{$s} = \false; - } - $this->currentfontstyle = ''; - $this->SetFont('', '', 0, \false); - } - function DisableTags($str = '') - { - if ($str == '') { - // enable all tags - // Insert new supported tags in the long string below. - $this->enabledtags = "<a><acronym><address><article><aside><b><bdi><bdo><big><blockquote><br><caption><center><cite><code><del><details><dd><div><dl><dt><em><fieldset><figcaption><figure><font><form><h1><h2><h3><h4><h5><h6><hgroup><hr><i><img><input><ins><kbd><legend><li><main><mark><meter><nav><ol><option><p><pre><progress><q><s><samp><section><select><small><span><strike><strong><sub><summary><sup><table><tbody><td><template><textarea><tfoot><th><thead><time><tr><tt><u><ul><var><footer><header><annotation><bookmark><textcircle><barcode><dottab><indexentry><indexinsert><watermarktext><watermarkimage><tts><ttz><tta><column_break><columnbreak><newcolumn><newpage><page_break><pagebreak><formfeed><columns><toc><tocentry><tocpagebreak><pageheader><pagefooter><setpageheader><setpagefooter><sethtmlpageheader><sethtmlpagefooter>"; - } else { - $str = \explode(",", $str); - foreach ($str as $v) { - $this->enabledtags = \str_replace(\trim($v), '', $this->enabledtags); - } - } - } - /* -- TABLES -- */ - function TableCheckMinWidth($maxwidth, $forcewrap = 0, $textbuffer = [], $checkletter = \false) - { - // mPDF 6 - $acclength = 0; - // mPDF 6 (accumulated length across > 1 chunk) - $acclongest = 0; - // mPDF 6 (accumulated length max across > 1 chunk) - $biggestword = 0; - $toonarrow = \false; - if (\count($textbuffer) == 0 or \count($textbuffer) == 1 && $textbuffer[0][0] == '') { - return 0; - } - foreach ($textbuffer as $chunk) { - $line = $chunk[0]; - $OTLdata = isset($chunk[18]) ? $chunk[18] : null; - // mPDF ITERATION - if ($this->iterationCounter) { - $line = \preg_replace('/{iteration ([a-zA-Z0-9_]+)}/', '\\1', $line); - } - // IMAGES & FORM ELEMENTS - if (\substr($line, 0, 3) == Mpdf::OBJECT_IDENTIFIER) { - // inline object - FORM element or IMAGE! - $objattr = $this->_getObjAttr($line); - if ($objattr['type'] != 'hr' && isset($objattr['width']) && $objattr['width'] / $this->shrin_k > $maxwidth + 0.0001) { - if ($objattr['width'] / $this->shrin_k > $biggestword) { - $biggestword = $objattr['width'] / $this->shrin_k; - } - $toonarrow = \true; - } - continue; - } - if ($line == "\n") { - $acclength = 0; - // mPDF 6 (accumulated length across > 1 chunk) - continue; - } - $line = \trim($line); - if (!empty($OTLdata)) { - $this->otl->trimOTLdata($OTLdata, \true, \true); - } - // *OTL* - // SET FONT SIZE/STYLE from $chunk[n] - // FONTSIZE - if (isset($chunk[11]) and $chunk[11] != '') { - if ($this->shrin_k) { - $this->SetFontSize($chunk[11] / $this->shrin_k, \false); - } else { - $this->SetFontSize($chunk[11], \false); - } - } - // FONTFAMILY - if (isset($chunk[4]) and $chunk[4] != '') { - $font = $this->SetFont($chunk[4], $this->FontStyle, 0, \false); - } - // B I - if (isset($chunk[2]) and $chunk[2] != '') { - $this->SetStyles($chunk[2]); - } - $lbw = $rbw = 0; - // Border widths - if (isset($chunk[16]) && !empty($chunk[16])) { - // Border - $this->spanborddet = $chunk[16]; - $lbw = isset($this->spanborddet['L']['w']) ? $this->spanborddet['L']['w'] : 0; - $rbw = isset($this->spanborddet['R']['w']) ? $this->spanborddet['R']['w'] : 0; - } - if (isset($chunk[15])) { - // Word spacing - $this->wSpacingCSS = $chunk[15]; - if ($this->wSpacingCSS && \strtoupper($this->wSpacingCSS) != 'NORMAL') { - $this->minwSpacing = $this->sizeConverter->convert($this->wSpacingCSS, $this->FontSize) / $this->shrin_k; - // mPDF 5.7.3 - } - } - if (isset($chunk[14])) { - // Letter spacing - $this->lSpacingCSS = $chunk[14]; - if (($this->lSpacingCSS || $this->lSpacingCSS === '0') && \strtoupper($this->lSpacingCSS) != 'NORMAL') { - $this->fixedlSpacing = $this->sizeConverter->convert($this->lSpacingCSS, $this->FontSize) / $this->shrin_k; - // mPDF 5.7.3 - } - } - if (isset($chunk[8])) { - // mPDF 5.7.1 - $this->textvar = $chunk[8]; - } - // mPDF 6 - // If overflow==wrap ($checkletter) OR (No word breaks and contains CJK) - if ($checkletter || !\preg_match('/(\\xe2\\x80\\x8b| )/', \trim($line)) && \preg_match("/([" . $this->pregCJKchars . "])/u", $line)) { - if (\preg_match("/([" . $this->pregCJKchars . "])/u", $line)) { - $checkCJK = \true; - } else { - $checkCJK = \false; - } - $letters = \preg_split('//u', $line); - foreach ($letters as $k => $letter) { - // mPDF 6 - if ($checkCJK) { - if (\preg_match("/[" . $this->CJKleading . "]/u", $letter) && $k > 0) { - $letter = $letters[$k - 1] . $letter; - } - if (\preg_match("/[" . $this->CJKfollowing . "]/u", $letter) && $k < \count($letters) - 1) { - $letter = $letter . $letters[$k + 1]; - } - } - $letterwidth = $this->GetStringWidth($letter, \false, \false, $chunk[8]); - // Pass $textvar ($chunk[8]), but do OTLdata here - // so don't have to split OTLdata for each word - if ($k == 0) { - $letterwidth += $lbw; - } - if ($k == \count($letters) - 1) { - $letterwidth += $rbw; - } - // Warn user that maxwidth is insufficient - if ($letterwidth > $maxwidth + 0.0001) { - if ($letterwidth > $biggestword) { - $biggestword = $letterwidth; - } - $toonarrow = \true; - } - } - } else { - // mPDF 6 - // Need to account for any XAdvance in GPOSinfo (OTLdata = $chunk[18]) - $wordXAdvance = []; - if (isset($chunk[18]) && $chunk[18]) { - \preg_match_all('/(\\xe2\\x80\\x8b| )/', $line, $spaces, \PREG_OFFSET_CAPTURE); - // U+200B Zero Width word boundary, or space - $lastoffset = 0; - $k = -1; - // Added so that if no spaces found, "last word" later is calculated for the one and only word - foreach ($spaces[0] as $k => $m) { - $offset = $m[1]; - // ...TableCheckMinWidth... - // At this point, BIDI not applied, Writing direction is not set, and XAdvanceL balances XAdvanceR - for ($n = $lastoffset; $n < $offset; $n++) { - if (isset($chunk[18]['GPOSinfo'][$n]['XAdvanceL'])) { - if (isset($wordXAdvance[$k])) { - $wordXAdvance[$k] += $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; - } else { - $wordXAdvance[$k] = $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; - } - } - } - $lastoffset = $offset + 1; - } - $k++; - // last word - foreach ($chunk[18]['GPOSinfo'] as $n => $gpos) { - if ($n >= $lastoffset && isset($chunk[18]['GPOSinfo'][$n]['XAdvanceL'])) { - if (isset($wordXAdvance[$k])) { - $wordXAdvance[$k] += $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; - } else { - $wordXAdvance[$k] = $chunk[18]['GPOSinfo'][$n]['XAdvanceL']; - } - } - } - } - $words = \preg_split('/(\\xe2\\x80\\x8b| )/', $line); - // U+200B Zero Width word boundary, or space - foreach ($words as $k => $word) { - $word = \trim($word); - $wordwidth = $this->GetStringWidth($word, \false, \false, $chunk[8]); - // Pass $textvar ($chunk[8]), but do OTLdata here - // so don't have to split OTLdata for each word - if (isset($wordXAdvance[$k])) { - $wordwidth += $wordXAdvance[$k] * 1000 / $this->CurrentFont['unitsPerEm'] * ($this->FontSize / 1000); - } - if ($k == 0) { - $wordwidth += $lbw; - } - if ($k == \count($words) - 1) { - $wordwidth += $rbw; - } - // mPDF 6 - if (\count($words) == 1 && \substr($chunk[0], 0, 1) != ' ') { - $acclength += $wordwidth; - } elseif (\count($words) > 1 && $k == 0 && \substr($chunk[0], 0, 1) != ' ') { - $acclength += $wordwidth; - } else { - $acclength = $wordwidth; - } - $acclongest = \max($acclongest, $acclength); - if (\count($words) == 1 && \substr($chunk[0], -1, 1) == ' ') { - $acclength = 0; - } elseif (\count($words) > 1 && ($k != \count($words) - 1 || \substr($chunk[0], -1, 1) == ' ')) { - $acclength = 0; - } - // Warn user that maxwidth is insufficient - if ($wordwidth > $maxwidth + 0.0001) { - if ($wordwidth > $biggestword) { - $biggestword = $wordwidth; - } - $toonarrow = \true; - } - } - } - // mPDF 6 Accumulated length of biggest word - across multiple chunks - if ($acclongest > $maxwidth + 0.0001) { - if ($acclongest > $biggestword) { - $biggestword = $acclongest; - } - $toonarrow = \true; - } - // RESET FONT SIZE/STYLE - // RESETTING VALUES - // Now we must deactivate what we have used - if (isset($chunk[2]) and $chunk[2] != '') { - $this->ResetStyles(); - } - if (isset($chunk[4]) and $chunk[4] != '') { - $this->SetFont($this->default_font, $this->FontStyle, 0, \false); - } - if (isset($chunk[11]) and $chunk[11] != '') { - $this->SetFontSize($this->default_font_size, \false); - } - $this->spanborddet = []; - $this->textvar = 0x0; - // mPDF 5.7.1 - $this->OTLtags = []; - $this->lSpacingCSS = ''; - $this->wSpacingCSS = ''; - $this->fixedlSpacing = \false; - $this->minwSpacing = 0; - } - // Return -(wordsize) if word is bigger than maxwidth - // ADDED - if ($toonarrow && $this->table_error_report) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Word is too long to fit in table - " . $this->table_error_report_param); - } - if ($toonarrow) { - return -$biggestword; - } else { - return 1; - } - } - function shrinkTable(&$table, $k) - { - $table['border_spacing_H'] /= $k; - $table['border_spacing_V'] /= $k; - $table['padding']['T'] /= $k; - $table['padding']['R'] /= $k; - $table['padding']['B'] /= $k; - $table['padding']['L'] /= $k; - $table['margin']['T'] /= $k; - $table['margin']['R'] /= $k; - $table['margin']['B'] /= $k; - $table['margin']['L'] /= $k; - $table['border_details']['T']['w'] /= $k; - $table['border_details']['R']['w'] /= $k; - $table['border_details']['B']['w'] /= $k; - $table['border_details']['L']['w'] /= $k; - if (isset($table['max_cell_border_width']['T'])) { - $table['max_cell_border_width']['T'] /= $k; - } - if (isset($table['max_cell_border_width']['R'])) { - $table['max_cell_border_width']['R'] /= $k; - } - if (isset($table['max_cell_border_width']['B'])) { - $table['max_cell_border_width']['B'] /= $k; - } - if (isset($table['max_cell_border_width']['L'])) { - $table['max_cell_border_width']['L'] /= $k; - } - if ($this->simpleTables) { - $table['simple']['border_details']['T']['w'] /= $k; - $table['simple']['border_details']['R']['w'] /= $k; - $table['simple']['border_details']['B']['w'] /= $k; - $table['simple']['border_details']['L']['w'] /= $k; - } - $table['miw'] /= $k; - $table['maw'] /= $k; - for ($j = 0; $j < $table['nc']; $j++) { - // columns - $table['wc'][$j]['miw'] = isset($table['wc'][$j]['miw']) ? $table['wc'][$j]['miw'] : 0; - $table['wc'][$j]['maw'] = isset($table['wc'][$j]['maw']) ? $table['wc'][$j]['maw'] : 0; - $table['wc'][$j]['miw'] /= $k; - $table['wc'][$j]['maw'] /= $k; - if (isset($table['decimal_align'][$j]['maxs0']) && $table['decimal_align'][$j]['maxs0']) { - $table['decimal_align'][$j]['maxs0'] /= $k; - } - if (isset($table['decimal_align'][$j]['maxs1']) && $table['decimal_align'][$j]['maxs1']) { - $table['decimal_align'][$j]['maxs1'] /= $k; - } - if (isset($table['wc'][$j]['absmiw']) && $table['wc'][$j]['absmiw']) { - $table['wc'][$j]['absmiw'] /= $k; - } - for ($i = 0; $i < $table['nr']; $i++) { - // rows - $c =& $table['cells'][$i][$j]; - if (isset($c) && $c) { - if (!$this->simpleTables) { - if ($this->packTableData) { - $cell = $this->_unpackCellBorder($c['borderbin']); - $cell['border_details']['T']['w'] /= $k; - $cell['border_details']['R']['w'] /= $k; - $cell['border_details']['B']['w'] /= $k; - $cell['border_details']['L']['w'] /= $k; - $cell['border_details']['mbw']['TL'] /= $k; - $cell['border_details']['mbw']['TR'] /= $k; - $cell['border_details']['mbw']['BL'] /= $k; - $cell['border_details']['mbw']['BR'] /= $k; - $cell['border_details']['mbw']['LT'] /= $k; - $cell['border_details']['mbw']['LB'] /= $k; - $cell['border_details']['mbw']['RT'] /= $k; - $cell['border_details']['mbw']['RB'] /= $k; - $c['borderbin'] = $this->_packCellBorder($cell); - } else { - $c['border_details']['T']['w'] /= $k; - $c['border_details']['R']['w'] /= $k; - $c['border_details']['B']['w'] /= $k; - $c['border_details']['L']['w'] /= $k; - $c['border_details']['mbw']['TL'] /= $k; - $c['border_details']['mbw']['TR'] /= $k; - $c['border_details']['mbw']['BL'] /= $k; - $c['border_details']['mbw']['BR'] /= $k; - $c['border_details']['mbw']['LT'] /= $k; - $c['border_details']['mbw']['LB'] /= $k; - $c['border_details']['mbw']['RT'] /= $k; - $c['border_details']['mbw']['RB'] /= $k; - } - } - $c['padding']['T'] /= $k; - $c['padding']['R'] /= $k; - $c['padding']['B'] /= $k; - $c['padding']['L'] /= $k; - $c['maxs'] = isset($c['maxs']) ? $c['maxs'] /= $k : null; - $c['w'] = isset($c['w']) ? $c['w'] /= $k : null; - $c['s'] = isset($c['s']) ? $c['s'] /= $k : 0; - $c['h'] = isset($c['h']) ? $c['h'] /= $k : null; - $c['miw'] = isset($c['miw']) ? $c['miw'] /= $k : 0; - $c['maw'] = isset($c['maw']) ? $c['maw'] /= $k : 0; - $c['absmiw'] = isset($c['absmiw']) ? $c['absmiw'] /= $k : null; - $c['nestedmaw'] = isset($c['nestedmaw']) ? $c['nestedmaw'] /= $k : null; - $c['nestedmiw'] = isset($c['nestedmiw']) ? $c['nestedmiw'] /= $k : null; - if (isset($c['textbuffer'])) { - foreach ($c['textbuffer'] as $n => $tb) { - if (!empty($tb[16])) { - !isset($c['textbuffer'][$n][16]['T']) || ($c['textbuffer'][$n][16]['T']['w'] /= $k); - !isset($c['textbuffer'][$n][16]['B']) || ($c['textbuffer'][$n][16]['B']['w'] /= $k); - !isset($c['textbuffer'][$n][16]['L']) || ($c['textbuffer'][$n][16]['L']['w'] /= $k); - !isset($c['textbuffer'][$n][16]['R']) || ($c['textbuffer'][$n][16]['R']['w'] /= $k); - } - } - } - unset($c); - } - } - // rows - } - // columns - } - function read_short(&$fh) - { - $s = \fread($fh, 2); - $a = (\ord($s[0]) << 8) + \ord($s[1]); - if ($a & 1 << 15) { - $a = $a - (1 << 16); - } - return $a; - } - function _packCellBorder($cell) - { - if (!\is_array($cell) || !isset($cell)) { - return ''; - } - if (!$this->packTableData) { - return $cell; - } - // = 186 bytes - $bindata = \pack("nnda6A10nnda6A10nnda6A10nnda6A10nd9", $cell['border'], $cell['border_details']['R']['s'], $cell['border_details']['R']['w'], $cell['border_details']['R']['c'], $cell['border_details']['R']['style'], $cell['border_details']['R']['dom'], $cell['border_details']['L']['s'], $cell['border_details']['L']['w'], $cell['border_details']['L']['c'], $cell['border_details']['L']['style'], $cell['border_details']['L']['dom'], $cell['border_details']['T']['s'], $cell['border_details']['T']['w'], $cell['border_details']['T']['c'], $cell['border_details']['T']['style'], $cell['border_details']['T']['dom'], $cell['border_details']['B']['s'], $cell['border_details']['B']['w'], $cell['border_details']['B']['c'], $cell['border_details']['B']['style'], $cell['border_details']['B']['dom'], $cell['border_details']['mbw']['BL'], $cell['border_details']['mbw']['BR'], $cell['border_details']['mbw']['RT'], $cell['border_details']['mbw']['RB'], $cell['border_details']['mbw']['TL'], $cell['border_details']['mbw']['TR'], $cell['border_details']['mbw']['LT'], $cell['border_details']['mbw']['LB'], isset($cell['border_details']['cellposdom']) ? $cell['border_details']['cellposdom'] : 0); - return $bindata; - } - function _getBorderWidths($bindata) - { - if (!$bindata) { - return [0, 0, 0, 0]; - } - if (!$this->packTableData) { - return [$bindata['border_details']['T']['w'], $bindata['border_details']['R']['w'], $bindata['border_details']['B']['w'], $bindata['border_details']['L']['w']]; - } - $bd = \unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); - $cell['border_details']['R']['w'] = $bd['rw']; - $cell['border_details']['L']['w'] = $bd['lw']; - $cell['border_details']['T']['w'] = $bd['tw']; - $cell['border_details']['B']['w'] = $bd['bw']; - return [$bd['tw'], $bd['rw'], $bd['bw'], $bd['lw']]; - } - function _unpackCellBorder($bindata) - { - if (!$bindata) { - return []; - } - if (!$this->packTableData) { - return $bindata; - } - $bd = \unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); - $cell['border'] = $bd['bord']; - $cell['border_details']['R']['s'] = $bd['rs']; - $cell['border_details']['R']['w'] = $bd['rw']; - $cell['border_details']['R']['c'] = \str_pad($bd['rca'], 6, "\x00"); - $cell['border_details']['R']['style'] = \trim($bd['rst']); - $cell['border_details']['R']['dom'] = $bd['rd']; - $cell['border_details']['L']['s'] = $bd['ls']; - $cell['border_details']['L']['w'] = $bd['lw']; - $cell['border_details']['L']['c'] = \str_pad($bd['lca'], 6, "\x00"); - $cell['border_details']['L']['style'] = \trim($bd['lst']); - $cell['border_details']['L']['dom'] = $bd['ld']; - $cell['border_details']['T']['s'] = $bd['ts']; - $cell['border_details']['T']['w'] = $bd['tw']; - $cell['border_details']['T']['c'] = \str_pad($bd['tca'], 6, "\x00"); - $cell['border_details']['T']['style'] = \trim($bd['tst']); - $cell['border_details']['T']['dom'] = $bd['td']; - $cell['border_details']['B']['s'] = $bd['bs']; - $cell['border_details']['B']['w'] = $bd['bw']; - $cell['border_details']['B']['c'] = \str_pad($bd['bca'], 6, "\x00"); - $cell['border_details']['B']['style'] = \trim($bd['bst']); - $cell['border_details']['B']['dom'] = $bd['bd']; - $cell['border_details']['mbw']['BL'] = $bd['mbl']; - $cell['border_details']['mbw']['BR'] = $bd['mbr']; - $cell['border_details']['mbw']['RT'] = $bd['mrt']; - $cell['border_details']['mbw']['RB'] = $bd['mrb']; - $cell['border_details']['mbw']['TL'] = $bd['mtl']; - $cell['border_details']['mbw']['TR'] = $bd['mtr']; - $cell['border_details']['mbw']['LT'] = $bd['mlt']; - $cell['border_details']['mbw']['LB'] = $bd['mlb']; - $cell['border_details']['cellposdom'] = $bd['cpd']; - return $cell; - } - ////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// - ////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// - ////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// - // table Array of (w, h, bc, nr, wc, hr, cells) - // w Width of table - // h Height of table - // nc Number column - // nr Number row - // hr List of height of each row - // wc List of width of each column - // cells List of cells of each rows, cells[i][j] is a cell in the table - function _tableColumnWidth(&$table, $firstpass = \false) - { - $cs =& $table['cells']; - $nc = $table['nc']; - $nr = $table['nr']; - $listspan = []; - if ($table['borders_separate']) { - $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; - } else { - $tblbw = $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2 + $table['margin']['L'] + $table['margin']['R']; - } - // ADDED table['l'][colno] - // = total length of text approx (using $c['s']) in that column - used to approximately distribute col widths in _tableWidth - // - for ($j = 0; $j < $nc; $j++) { - // columns - $wc =& $table['wc'][$j]; - for ($i = 0; $i < $nr; $i++) { - // rows - if (isset($cs[$i][$j]) && $cs[$i][$j]) { - $c =& $cs[$i][$j]; - if ($this->simpleTables) { - if ($table['borders_separate']) { - // NB twice border width - $extrcw = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; - } else { - $extrcw = $table['simple']['border_details']['L']['w'] / 2 + $table['simple']['border_details']['R']['w'] / 2 + $c['padding']['L'] + $c['padding']['R']; - } - } else { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($c['borderbin']); - } else { - $br = $c['border_details']['R']['w']; - $bl = $c['border_details']['L']['w']; - } - if ($table['borders_separate']) { - // NB twice border width - $extrcw = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; - } else { - $extrcw = $bl / 2 + $br / 2 + $c['padding']['L'] + $c['padding']['R']; - } - } - // $mw = $this->GetStringWidth('W') + $extrcw ; - $mw = $extrcw; - // mPDF 6 - if (\substr($c['a'], 0, 1) == 'D') { - $mw = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1'] + $extrcw; - } - $c['absmiw'] = $mw; - if (isset($c['R']) && $c['R']) { - $c['maw'] = $c['miw'] = $this->FontSize + $extrcw; - if (isset($c['w'])) { - // If cell width is specified - if ($c['miw'] < $c['w']) { - $c['miw'] = $c['w']; - } - } - if (!isset($c['colspan'])) { - if ($wc['miw'] < $c['miw']) { - $wc['miw'] = $c['miw']; - } - if ($wc['maw'] < $c['maw']) { - $wc['maw'] = $c['maw']; - } - if ($firstpass) { - if (isset($table['l'][$j])) { - $table['l'][$j] += $c['miw']; - } else { - $table['l'][$j] = $c['miw']; - } - } - } - if ($c['miw'] > $wc['miw']) { - $wc['miw'] = $c['miw']; - } - if ($wc['miw'] > $wc['maw']) { - $wc['maw'] = $wc['miw']; - } - continue; - } - if ($firstpass) { - if (isset($c['s'])) { - $c['s'] += $extrcw; - } - if (isset($c['maxs'])) { - $c['maxs'] += $extrcw; - } - if (isset($c['nestedmiw'])) { - $c['nestedmiw'] += $extrcw; - } - if (isset($c['nestedmaw'])) { - $c['nestedmaw'] += $extrcw; - } - } - // If minimum width has already been set by a nested table or inline object (image/form), use it - if (isset($c['nestedmiw']) && (!isset($this->table[1][1]['overflow']) || $this->table[1][1]['overflow'] != 'visible')) { - $miw = $c['nestedmiw']; - } else { - $miw = $mw; - } - if (isset($c['maxs']) && $c['maxs'] != '') { - $c['s'] = $c['maxs']; - } - // If maximum width has already been set by a nested table, use it - if (isset($c['nestedmaw'])) { - $c['maw'] = $c['nestedmaw']; - } else { - $c['maw'] = $c['s']; - } - if (isset($table['overflow']) && $table['overflow'] == 'visible' && $table['level'] == 1) { - if ($c['maw'] + $tblbw > $this->blk[$this->blklvl]['inner_width']) { - $c['maw'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; - } - } - if (isset($c['nowrap']) && $c['nowrap']) { - $miw = $c['maw']; - } - if (isset($c['wpercent']) && $firstpass) { - if (isset($c['colspan'])) { - // Not perfect - but % set on colspan is shared equally on cols. - for ($k = 0; $k < $c['colspan']; $k++) { - $table['wc'][$j + $k]['wpercent'] = $c['wpercent'] / $c['colspan']; - } - } else { - if (isset($table['w']) && $table['w']) { - $c['w'] = $c['wpercent'] / 100 * ($table['w'] - $tblbw); - } - $wc['wpercent'] = $c['wpercent']; - } - } - if (isset($table['overflow']) && $table['overflow'] == 'visible' && $table['level'] == 1) { - if (isset($c['w']) && $c['w'] + $tblbw > $this->blk[$this->blklvl]['inner_width']) { - $c['w'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; - } - } - if (isset($c['w'])) { - // If cell width is specified - if ($miw < $c['w']) { - $c['miw'] = $c['w']; - } - // Cell min width = that specified - if ($miw > $c['w']) { - $c['miw'] = $c['w'] = $miw; - } - // If width specified is less than minimum allowed (W) increase it - // mPDF 5.7.4 Do not set column width in colspan - // cf. http://www.mpdf1.com/forum/discussion/2221/colspan-bug - if (!isset($c['colspan'])) { - if (!isset($wc['w'])) { - $wc['w'] = 1; - } - // If the Col width is not specified = set it to 1 - } - // mPDF 5.7.3 cf. http://www.mpdf1.com/forum/discussion/1648/nested-table-bug- - $c['maw'] = $c['w']; - } else { - $c['miw'] = $miw; - } - // If cell width not specified -> set Cell min width it to minimum allowed (W) - if (isset($c['miw']) && $c['maw'] < $c['miw']) { - $c['maw'] = $c['miw']; - } - // If Cell max width < Minwidth - increase it to = - if (!isset($c['colspan'])) { - if (isset($c['miw']) && $wc['miw'] < $c['miw']) { - $wc['miw'] = $c['miw']; - } - // Update Col Minimum and maximum widths - if ($wc['maw'] < $c['maw']) { - $wc['maw'] = $c['maw']; - } - if (isset($wc['absmiw']) && $wc['absmiw'] < $c['absmiw'] || !isset($wc['absmiw'])) { - $wc['absmiw'] = $c['absmiw']; - } - // Update Col Minimum and maximum widths - if (isset($table['l'][$j])) { - $table['l'][$j] += $c['s']; - } else { - $table['l'][$j] = $c['s']; - } - } else { - $listspan[] = [$i, $j]; - } - // Check if minimum width of the whole column is big enough for largest word to fit - // mPDF 6 - if (isset($c['textbuffer'])) { - if (isset($table['overflow']) && $table['overflow'] == 'wrap') { - $letter = \true; - } else { - $letter = \false; - } - $minwidth = $this->TableCheckMinWidth($wc['miw'] - $extrcw, 0, $c['textbuffer'], $letter); - } else { - $minwidth = 0; - } - if ($minwidth < 0) { - // increase minimum width - if (!isset($c['colspan'])) { - $wc['miw'] = \max(isset($wc['miw']) ? $wc['miw'] : 0, -$minwidth + $extrcw); - } else { - $c['miw'] = \max(isset($c['miw']) ? $c['miw'] : 0, -$minwidth + $extrcw); - } - } - if (!isset($c['colspan'])) { - if ($wc['miw'] > $wc['maw']) { - $wc['maw'] = $wc['miw']; - } - // update maximum width, if needed - } - } - unset($c); - } - //rows - } - //columns - // COLUMN SPANS - $wc =& $table['wc']; - foreach ($listspan as $span) { - list($i, $j) = $span; - $c =& $cs[$i][$j]; - $lc = $j + $c['colspan']; - if ($lc > $nc) { - $lc = $nc; - } - $wis = $wisa = 0; - $was = $wasa = 0; - $list = []; - for ($k = $j; $k < $lc; $k++) { - if (isset($table['l'][$k])) { - if ($c['R']) { - $table['l'][$k] += $c['miw'] / $c['colspan']; - } else { - $table['l'][$k] += $c['s'] / $c['colspan']; - } - } else { - if ($c['R']) { - $table['l'][$k] = $c['miw'] / $c['colspan']; - } else { - $table['l'][$k] = $c['s'] / $c['colspan']; - } - } - $wis += $wc[$k]['miw']; - // $wis is the sum of the column miw in the colspan - $was += $wc[$k]['maw']; - // $was is the sum of the column maw in the colspan - if (!isset($c['w'])) { - $list[] = $k; - $wisa += $wc[$k]['miw']; - // $wisa is the sum of the column miw in cells with no width specified in the colspan - $wasa += $wc[$k]['maw']; - // $wasa is the sum of the column maw in cells with no width specified in the colspan - } - } - if ($c['miw'] > $wis) { - if (!$wis) { - for ($k = $j; $k < $lc; $k++) { - $wc[$k]['miw'] = $c['miw'] / $c['colspan']; - } - } elseif (!\count($list) && $wis != 0) { - $wi = $c['miw'] - $wis; - for ($k = $j; $k < $lc; $k++) { - $wc[$k]['miw'] += $wc[$k]['miw'] / $wis * $wi; - } - } else { - $wi = $c['miw'] - $wis; - // mPDF 5.7.2 Extra min width distributed proportionately to all cells in colspan without a specified width - // cf. http://www.mpdf1.com/forum/discussion/1607#Item_4 - foreach ($list as $k) { - if (!isset($wc[$k]['w']) || !$wc[$k]['w']) { - $wc[$k]['miw'] += $wc[$k]['miw'] / $wisa * $wi; - } - } - // mPDF 5.7.2 - } - } - if ($c['maw'] > $was) { - if (!$wis) { - for ($k = $j; $k < $lc; $k++) { - $wc[$k]['maw'] = $c['maw'] / $c['colspan']; - } - } elseif (!\count($list) && $was != 0) { - $wi = $c['maw'] - $was; - for ($k = $j; $k < $lc; $k++) { - $wc[$k]['maw'] += $wc[$k]['maw'] / $was * $wi; - } - } else { - $wi = $c['maw'] - $was; - // mPDF 5.7.4 Extra max width distributed evenly to all cells in colspan without a specified width - // cf. http://www.mpdf1.com/forum/discussion/2221/colspan-bug - foreach ($list as $k) { - $wc[$k]['maw'] += $wi / \count($list); - } - } - } - unset($c); - } - $checkminwidth = 0; - $checkmaxwidth = 0; - $totallength = 0; - for ($i = 0; $i < $nc; $i++) { - $checkminwidth += $table['wc'][$i]['miw']; - $checkmaxwidth += $table['wc'][$i]['maw']; - $totallength += isset($table['l']) ? $table['l'][$i] : 0; - } - if (!isset($table['w']) && $firstpass) { - $sumpc = 0; - $notset = 0; - for ($i = 0; $i < $nc; $i++) { - if (isset($table['wc'][$i]['wpercent']) && $table['wc'][$i]['wpercent']) { - $sumpc += $table['wc'][$i]['wpercent']; - } else { - $notset++; - } - } - // If sum of widths as % >= 100% and not all columns are set - // Set a nominal width of 1% for unset columns - if ($sumpc >= 100 && $notset) { - for ($i = 0; $i < $nc; $i++) { - if ((!isset($table['wc'][$i]['wpercent']) || !$table['wc'][$i]['wpercent']) && (!isset($table['wc'][$i]['w']) || !$table['wc'][$i]['w'])) { - $table['wc'][$i]['wpercent'] = 1; - } - } - } - if ($sumpc) { - // if any percents are set - $sumnonpc = 100 - $sumpc; - $sumpc = \max($sumpc, 100); - $miwleft = 0; - $miwleftcount = 0; - $miwsurplusnonpc = 0; - $maxcalcmiw = 0; - $mawleft = 0; - $mawleftcount = 0; - $mawsurplusnonpc = 0; - $maxcalcmaw = 0; - $mawnon = 0; - $miwnon = 0; - for ($i = 0; $i < $nc; $i++) { - if (isset($table['wc'][$i]['wpercent'])) { - $maxcalcmiw = \max($maxcalcmiw, $table['wc'][$i]['miw'] * $sumpc / $table['wc'][$i]['wpercent']); - $maxcalcmaw = \max($maxcalcmaw, $table['wc'][$i]['maw'] * $sumpc / $table['wc'][$i]['wpercent']); - } else { - $miwleft += $table['wc'][$i]['miw']; - $mawleft += $table['wc'][$i]['maw']; - if (!isset($table['wc'][$i]['w'])) { - $miwleftcount++; - $mawleftcount++; - } - } - } - if ($miwleft && $sumnonpc > 0) { - $miwnon = $miwleft * 100 / $sumnonpc; - } - if ($mawleft && $sumnonpc > 0) { - $mawnon = $mawleft * 100 / $sumnonpc; - } - if (($miwnon > $checkminwidth || $maxcalcmiw > $checkminwidth) && $this->keep_table_proportions) { - if ($miwnon > $maxcalcmiw) { - $miwsurplusnonpc = \round($miwnon * $sumnonpc / 100 - $miwleft, 3); - $checkminwidth = $miwnon; - } else { - $checkminwidth = $maxcalcmiw; - } - for ($i = 0; $i < $nc; $i++) { - if (isset($table['wc'][$i]['wpercent'])) { - $newmiw = $checkminwidth * $table['wc'][$i]['wpercent'] / 100; - if ($table['wc'][$i]['miw'] < $newmiw) { - $table['wc'][$i]['miw'] = $newmiw; - } - $table['wc'][$i]['w'] = 1; - } elseif ($miwsurplusnonpc && !$table['wc'][$i]['w']) { - $table['wc'][$i]['miw'] += $miwsurplusnonpc / $miwleftcount; - } - } - } - if ($mawnon > $checkmaxwidth || $maxcalcmaw > $checkmaxwidth) { - if ($mawnon > $maxcalcmaw) { - $mawsurplusnonpc = \round($mawnon * $sumnonpc / 100 - $mawleft, 3); - $checkmaxwidth = $mawnon; - } else { - $checkmaxwidth = $maxcalcmaw; - } - for ($i = 0; $i < $nc; $i++) { - if (isset($table['wc'][$i]['wpercent'])) { - $newmaw = $checkmaxwidth * $table['wc'][$i]['wpercent'] / 100; - if ($table['wc'][$i]['maw'] < $newmaw) { - $table['wc'][$i]['maw'] = $newmaw; - } - $table['wc'][$i]['w'] = 1; - } elseif ($mawsurplusnonpc && !$table['wc'][$i]['w']) { - $table['wc'][$i]['maw'] += $mawsurplusnonpc / $mawleftcount; - } - if ($table['wc'][$i]['maw'] < $table['wc'][$i]['miw']) { - $table['wc'][$i]['maw'] = $table['wc'][$i]['miw']; - } - } - } - if ($checkminwidth > $checkmaxwidth) { - $checkmaxwidth = $checkminwidth; - } - } - } - if (isset($table['wpercent']) && $table['wpercent']) { - $checkminwidth *= 100 / $table['wpercent']; - $checkmaxwidth *= 100 / $table['wpercent']; - } - $checkminwidth += $tblbw; - $checkmaxwidth += $tblbw; - // Table['miw'] set by percent in first pass may be larger than sum of column miw - if (isset($table['miw']) && $checkminwidth > $table['miw'] || !isset($table['miw'])) { - $table['miw'] = $checkminwidth; - } - if (isset($table['maw']) && $checkmaxwidth > $table['maw'] || !isset($table['maw'])) { - $table['maw'] = $checkmaxwidth; - } - $table['tl'] = $totallength; - // mPDF 6 - if ($this->table_rotate) { - $mxw = $this->tbrot_maxw; - } else { - $mxw = $this->blk[$this->blklvl]['inner_width']; - } - if (!isset($table['overflow'])) { - $table['overflow'] = null; - } - if ($table['overflow'] == 'visible') { - return [0, 0]; - } elseif ($table['overflow'] == 'hidden' && !$this->table_rotate && !$this->ColActive && $checkminwidth > $mxw) { - $table['w'] = $table['miw']; - return [0, 0]; - } - // elseif ($table['overflow']=='wrap') { return array(0,0); } // mPDF 6 - if (isset($table['w']) && $table['w']) { - if ($table['w'] >= $checkminwidth && $table['w'] <= $mxw) { - $table['maw'] = $mxw = $table['w']; - } elseif ($table['w'] >= $checkminwidth && $table['w'] > $mxw && $this->keep_table_proportions) { - $checkminwidth = $table['w']; - } elseif ($table['w'] < $checkminwidth && $checkminwidth < $mxw && $this->keep_table_proportions) { - $table['maw'] = $table['w'] = $checkminwidth; - } else { - unset($table['w']); - } - } - $ratio = $checkminwidth / $mxw; - if ($checkminwidth > $mxw) { - return [$ratio + 0.001, $checkminwidth]; - // 0.001 to allow for rounded numbers when resizing - } - unset($cs); - return [0, 0]; - } - function _tableWidth(&$table) - { - $widthcols =& $table['wc']; - $numcols = $table['nc']; - $tablewidth = 0; - if ($table['borders_separate']) { - $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; - } else { - $tblbw = $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2 + $table['margin']['L'] + $table['margin']['R']; - } - if ($table['level'] > 1 && isset($table['w'])) { - if (isset($table['wpercent']) && $table['wpercent']) { - $table['w'] = $temppgwidth = ($table['w'] - $tblbw) * $table['wpercent'] / 100 + $tblbw; - } else { - $temppgwidth = $table['w']; - } - } elseif ($this->table_rotate) { - $temppgwidth = $this->tbrot_maxw; - // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) then allow for this - $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; - if ($enddiv / $temppgwidth < 0.05) { - $temppgwidth -= $enddiv; - } - } else { - if (isset($table['w']) && $table['w'] < $this->blk[$this->blklvl]['inner_width']) { - $notfullwidth = 1; - $temppgwidth = $table['w']; - } elseif ($table['overflow'] == 'visible' && $table['level'] == 1) { - $temppgwidth = null; - } elseif ($table['overflow'] == 'hidden' && !$this->ColActive && isset($table['w']) && $table['w'] > $this->blk[$this->blklvl]['inner_width'] && $table['w'] == $table) { - // $temppgwidth = $this->blk[$this->blklvl]['inner_width']; - $temppgwidth = $table['w']; - } else { - $temppgwidth = $this->blk[$this->blklvl]['inner_width']; - } - } - $totaltextlength = 0; - // Added - to sum $table['l'][colno] - $totalatextlength = 0; - // Added - to sum $table['l'][colno] for those columns where width not set - $percentages_set = 0; - for ($i = 0; $i < $numcols; $i++) { - if (isset($widthcols[$i]['wpercent'])) { - $tablewidth += $widthcols[$i]['maw']; - $percentages_set = 1; - } elseif (isset($widthcols[$i]['w'])) { - $tablewidth += $widthcols[$i]['miw']; - } else { - $tablewidth += $widthcols[$i]['maw']; - } - $totaltextlength += isset($table['l']) ? $table['l'][$i] : 0; - } - if (!$totaltextlength) { - $totaltextlength = 1; - } - $tablewidth += $tblbw; - // Outer half of table borders - if ($tablewidth > $temppgwidth) { - $table['w'] = $temppgwidth; - } elseif ($tablewidth < $temppgwidth && !isset($table['w']) && $percentages_set) { - // if any widths set as percentages and max width fits < page width - $table['w'] = $table['maw']; - } - // if table width is set and is > allowed width - if (isset($table['w']) && $table['w'] > $temppgwidth) { - $table['w'] = $temppgwidth; - } - // IF the table width is now set - Need to distribute columns widths - // mPDF 5.7.3 - // If the table width is already set to the maximum width (e.g. nested table), then use maximum column widths exactly - if (isset($table['w']) && $table['w'] == $tablewidth && !$percentages_set) { - // This sets the columns all to maximum width - for ($i = 0; $i < $numcols; $i++) { - $widthcols[$i] = $widthcols[$i]['maw']; - } - } elseif (isset($table['w'])) { - // elseif the table width is set distribute width using algorithm - $wis = $wisa = 0; - $list = []; - $notsetlist = []; - for ($i = 0; $i < $numcols; $i++) { - $wis += $widthcols[$i]['miw']; - if (!isset($widthcols[$i]['w']) || $widthcols[$i]['w'] && $table['w'] > $temppgwidth && !$this->keep_table_proportions && !$notfullwidth) { - $list[] = $i; - $wisa += $widthcols[$i]['miw']; - $totalatextlength += $table['l'][$i]; - } - } - if (!$totalatextlength) { - $totalatextlength = 1; - } - // Allocate spare (more than col's minimum width) across the cols according to their approx total text length - // Do it by setting minimum width here - if ($table['w'] > $wis + $tblbw) { - // First set any cell widths set as percentages - if ($table['w'] < $temppgwidth || $this->keep_table_proportions) { - for ($k = 0; $k < $numcols; $k++) { - if (isset($widthcols[$k]['wpercent'])) { - $curr = $widthcols[$k]['miw']; - $widthcols[$k]['miw'] = ($table['w'] - $tblbw) * $widthcols[$k]['wpercent'] / 100; - $wis += $widthcols[$k]['miw'] - $curr; - $wisa += $widthcols[$k]['miw'] - $curr; - } - } - } - // Now allocate surplus up to maximum width of each column - $surplus = 0; - $ttl = 0; - // number of surplus columns - if (!\count($list)) { - $wi = $table['w'] - ($wis + $tblbw); - // i.e. extra space to distribute - for ($k = 0; $k < $numcols; $k++) { - $spareratio = $table['l'][$k] / $totaltextlength; - // gives ratio to divide up free space - // Don't allocate more than Maximum required width - save rest in surplus - if ($widthcols[$k]['miw'] + $wi * $spareratio >= $widthcols[$k]['maw']) { - // mPDF 5.7.3 - $surplus += $wi * $spareratio - ($widthcols[$k]['maw'] - $widthcols[$k]['miw']); - $widthcols[$k]['miw'] = $widthcols[$k]['maw']; - } else { - $notsetlist[] = $k; - $ttl += $table['l'][$k]; - $widthcols[$k]['miw'] += $wi * $spareratio; - } - } - } else { - $wi = $table['w'] - ($wis + $tblbw); - // i.e. extra space to distribute - foreach ($list as $k) { - $spareratio = $table['l'][$k] / $totalatextlength; - // gives ratio to divide up free space - // Don't allocate more than Maximum required width - save rest in surplus - if ($widthcols[$k]['miw'] + $wi * $spareratio >= $widthcols[$k]['maw']) { - // mPDF 5.7.3 - $surplus += $wi * $spareratio - ($widthcols[$k]['maw'] - $widthcols[$k]['miw']); - $widthcols[$k]['miw'] = $widthcols[$k]['maw']; - } else { - $notsetlist[] = $k; - $ttl += $table['l'][$k]; - $widthcols[$k]['miw'] += $wi * $spareratio; - } - } - } - // If surplus still left over apportion it across columns - if ($surplus) { - if (\count($notsetlist) && \count($notsetlist) < $numcols) { - // if some are set only add to remaining - otherwise add to all of them - foreach ($notsetlist as $i) { - if ($ttl) { - $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl; - } - } - } elseif (\count($list) && \count($list) < $numcols) { - // If some widths are defined, and others have been added up to their maxmum - foreach ($list as $i) { - $widthcols[$i]['miw'] += $surplus / \count($list); - } - } elseif ($numcols) { - // If all columns - $ttl = \array_sum($table['l']); - if ($ttl) { - for ($i = 0; $i < $numcols; $i++) { - $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl; - } - } - } - } - } - // This sets the columns all to minimum width (which has been increased above if appropriate) - for ($i = 0; $i < $numcols; $i++) { - $widthcols[$i] = $widthcols[$i]['miw']; - } - // TABLE NOT WIDE ENOUGH EVEN FOR MINIMUM CONTENT WIDTH - // If sum of column widths set are too wide for table - $checktablewidth = 0; - for ($i = 0; $i < $numcols; $i++) { - $checktablewidth += $widthcols[$i]; - } - if ($checktablewidth > $temppgwidth + 0.001 - $tblbw) { - $usedup = 0; - $numleft = 0; - for ($i = 0; $i < $numcols; $i++) { - if (isset($widthcols[$i]) && $widthcols[$i] > ($temppgwidth - $tblbw) / $numcols && !isset($widthcols[$i]['w'])) { - $numleft++; - unset($widthcols[$i]); - } else { - $usedup += $widthcols[$i]; - } - } - for ($i = 0; $i < $numcols; $i++) { - if (!isset($widthcols[$i]) || !$widthcols[$i]) { - $widthcols[$i] = ($temppgwidth - $tblbw - $usedup) / $numleft; - } - } - } - } else { - // table has no width defined - $table['w'] = $tablewidth; - for ($i = 0; $i < $numcols; $i++) { - if (isset($widthcols[$i]['wpercent']) && $this->keep_table_proportions) { - $colwidth = $widthcols[$i]['maw']; - } elseif (isset($widthcols[$i]['w'])) { - $colwidth = $widthcols[$i]['miw']; - } else { - $colwidth = $widthcols[$i]['maw']; - } - unset($widthcols[$i]); - $widthcols[$i] = $colwidth; - } - } - if ($table['overflow'] === 'visible' && $table['level'] == 1) { - if ($tablewidth > $this->blk[$this->blklvl]['inner_width']) { - for ($j = 0; $j < $numcols; $j++) { - // columns - for ($i = 0; $i < $table['nr']; $i++) { - // rows - if (isset($table['cells'][$i][$j]) && $table['cells'][$i][$j]) { - $colspan = isset($table['cells'][$i][$j]['colspan']) ? $table['cells'][$i][$j]['colspan'] : 1; - if ($colspan > 1) { - $w = 0; - for ($c = $j; $c < $j + $colspan; $c++) { - $w += $widthcols[$c]; - } - if ($w > $this->blk[$this->blklvl]['inner_width']) { - $diff = $w - ($this->blk[$this->blklvl]['inner_width'] - $tblbw); - for ($c = $j; $c < $j + $colspan; $c++) { - $widthcols[$c] -= $diff * ($widthcols[$c] / $w); - } - $table['w'] -= $diff; - $table['csp'][$j] = $w - $diff; - } - } - } - } - } - } - $pgNo = 0; - $currWc = 0; - for ($i = 0; $i < $numcols; $i++) { - // columns - if (isset($table['csp'][$i])) { - $w = $table['csp'][$i]; - unset($table['csp'][$i]); - } else { - $w = $widthcols[$i]; - } - if ($currWc + $w + $tblbw > $this->blk[$this->blklvl]['inner_width']) { - $pgNo++; - $currWc = $widthcols[$i]; - } else { - $currWc += $widthcols[$i]; - } - $table['colPg'][$i] = $pgNo; - } - } - } - function _tableHeight(&$table) - { - $level = $table['level']; - $levelid = $table['levelid']; - $cells =& $table['cells']; - $numcols = $table['nc']; - $numrows = $table['nr']; - $listspan = []; - $checkmaxheight = 0; - $headerrowheight = 0; - $checkmaxheightplus = 0; - $headerrowheightplus = 0; - $firstrowheight = 0; - $footerrowheight = 0; - $footerrowheightplus = 0; - if ($this->table_rotate) { - $temppgheight = $this->tbrot_maxh; - $remainingpage = $this->tbrot_maxh; - } else { - $temppgheight = $this->h - $this->bMargin - $this->tMargin - $this->kwt_height; - $remainingpage = $this->h - $this->bMargin - $this->y - $this->kwt_height; - // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) - // then allow for this - $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $table['margin']['B']; - if ($remainingpage > $enddiv && $enddiv / $remainingpage < 0.05) { - $remainingpage -= $enddiv; - } elseif ($remainingpage == 0) { - $remainingpage = 0.001; - } - if ($temppgheight > $enddiv && $enddiv / $temppgheight < 0.05) { - $temppgheight -= $enddiv; - } elseif ($temppgheight == 0) { - $temppgheight = 0.001; - } - } - if ($remainingpage < 0) { - $remainingpage = 0.001; - } - if ($temppgheight < 0) { - $temppgheight = 0.001; - } - for ($i = 0; $i < $numrows; $i++) { - // rows - $heightrow =& $table['hr'][$i]; - for ($j = 0; $j < $numcols; $j++) { - // columns - if (isset($cells[$i][$j]) && $cells[$i][$j]) { - $c =& $cells[$i][$j]; - if ($this->simpleTables) { - if ($table['borders_separate']) { - // NB twice border width - $extraWLR = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + ($c['padding']['L'] + $c['padding']['R']) + $table['border_spacing_H']; - $extrh = $table['simple']['border_details']['T']['w'] + $table['simple']['border_details']['B']['w'] + ($c['padding']['T'] + $c['padding']['B']) + $table['border_spacing_V']; - } else { - $extraWLR = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w']) / 2 + ($c['padding']['L'] + $c['padding']['R']); - $extrh = ($table['simple']['border_details']['T']['w'] + $table['simple']['border_details']['B']['w']) / 2 + ($c['padding']['T'] + $c['padding']['B']); - } - } else { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($c['borderbin']); - } else { - $bt = $c['border_details']['T']['w']; - $bb = $c['border_details']['B']['w']; - $br = $c['border_details']['R']['w']; - $bl = $c['border_details']['L']['w']; - } - if ($table['borders_separate']) { - // NB twice border width - $extraWLR = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; - $extrh = $bt + $bb + $c['padding']['T'] + $c['padding']['B'] + $table['border_spacing_V']; - } else { - $extraWLR = $bl / 2 + $br / 2 + $c['padding']['L'] + $c['padding']['R']; - $extrh = $bt / 2 + $bb / 2 + $c['padding']['T'] + $c['padding']['B']; - } - } - if ($table['overflow'] == 'visible' && $level == 1) { - list($x, $cw) = $this->_splitTableGetWidth($table, $i, $j); - } else { - list($x, $cw) = $this->_tableGetWidth($table, $i, $j); - } - // Get CELL HEIGHT - // ++ extra parameter forces wrap to break word - if ($c['R'] && isset($c['textbuffer'])) { - $str = ''; - foreach ($c['textbuffer'] as $t) { - $str .= $t[0] . ' '; - } - $str = \rtrim($str); - $s_fs = $this->FontSizePt; - $s_f = $this->FontFamily; - $s_st = $this->FontStyle; - $this->SetFont($c['textbuffer'][0][4], $c['textbuffer'][0][2], $c['textbuffer'][0][11] / $this->shrin_k, \true, \true); - $tempch = $this->GetStringWidth($str, \true, $c['textbuffer'][0][18], $c['textbuffer'][0][8]); - if ($c['R'] >= 45 && $c['R'] < 90) { - $tempch = \sin(\deg2rad($c['R'])) * $tempch + \sin(\deg2rad($c['R'])) * ($c['textbuffer'][0][11] / Mpdf::SCALE / $this->shrin_k); - } - $this->SetFont($s_f, $s_st, $s_fs, \true, \true); - $ch = $tempch + $extrh; - } else { - if (isset($c['textbuffer']) && !empty($c['textbuffer'])) { - $this->cellLineHeight = $c['cellLineHeight']; - $this->cellLineStackingStrategy = $c['cellLineStackingStrategy']; - $this->cellLineStackingShift = $c['cellLineStackingShift']; - $this->divwidth = $cw - $extraWLR; - $tempch = $this->printbuffer($c['textbuffer'], '', \true, \true); - } else { - $tempch = 0; - } - // Added cellpadding top and bottom. (Lineheight already adjusted) - $ch = $tempch + $extrh; - } - // If height is defined and it is bigger than calculated $ch then update values - if (isset($c['h']) && $c['h'] > $ch) { - $c['mih'] = $ch; - // in order to keep valign working - $ch = $c['h']; - } else { - $c['mih'] = $ch; - } - if (isset($c['rowspan'])) { - $listspan[] = [$i, $j]; - } elseif ($heightrow < $ch) { - $heightrow = $ch; - } - // this is the extra used in _tableWrite to determine whether to trigger a page change - if ($table['borders_separate']) { - if ($i == $numrows - 1 || isset($c['rowspan']) && $i + $c['rowspan'] == $numrows) { - $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; - } else { - $extra = $table['border_spacing_V'] / 2; - } - } else { - if (!$this->simpleTables) { - $extra = $bb / 2; - } elseif ($this->simpleTables) { - $extra = $table['simple']['border_details']['B']['w'] / 2; - } - } - if (isset($table['is_thead'][$i]) && $table['is_thead'][$i]) { - if ($j == 0) { - $headerrowheight += $ch; - $headerrowheightplus += $ch + $extra; - } - } elseif (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { - if ($j == 0) { - $footerrowheight += $ch; - $footerrowheightplus += $ch + $extra; - } - } else { - $checkmaxheight = \max($checkmaxheight, $ch); - $checkmaxheightplus = \max($checkmaxheightplus, $ch + $extra); - } - if ($this->tableLevel == 1 && $i == (isset($table['headernrows']) ? $table['headernrows'] : 0)) { - $firstrowheight = \max($ch, $firstrowheight); - } - unset($c); - } - } - //end of columns - } - //end of rows - $heightrow =& $table['hr']; - foreach ($listspan as $span) { - list($i, $j) = $span; - $c =& $cells[$i][$j]; - $lr = $i + $c['rowspan']; - if ($lr > $numrows) { - $lr = $numrows; - } - $hs = $hsa = 0; - $list = []; - for ($k = $i; $k < $lr; $k++) { - $hs += $heightrow[$k]; - // mPDF 6 - $sh = \false; - // specified height - for ($m = 0; $m < $numcols; $m++) { - // columns - $tc =& $cells[$k][$m]; - if (isset($tc['rowspan'])) { - continue; - } - if (isset($tc['h'])) { - $sh = \true; - break; - } - } - if (!$sh) { - $list[] = $k; - } - } - if ($table['borders_separate']) { - if ($i == $numrows - 1 || $i + $c['rowspan'] == $numrows) { - $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; - } else { - $extra = $table['border_spacing_V'] / 2; - } - } else { - if (!$this->simpleTables) { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($c['borderbin']); - } else { - $bb = $c['border_details']['B']['w']; - } - $extra = $bb / 2; - } elseif ($this->simpleTables) { - $extra = $table['simple']['border_details']['B']['w'] / 2; - } - } - if (!empty($table['is_thead'][$i])) { - $headerrowheight = \max($headerrowheight, $hs); - $headerrowheightplus = \max($headerrowheightplus, $hs + $extra); - } elseif (!empty($table['is_tfoot'][$i])) { - $footerrowheight = \max($footerrowheight, $hs); - $footerrowheightplus = \max($footerrowheightplus, $hs + $extra); - } else { - $checkmaxheight = \max($checkmaxheight, $hs); - $checkmaxheightplus = \max($checkmaxheightplus, $hs + $extra); - } - if ($this->tableLevel == 1 && $i == (isset($table['headernrows']) ? $table['headernrows'] : 0)) { - $firstrowheight = \max($hs, $firstrowheight); - } - if ($c['mih'] > $hs) { - if (!$hs) { - for ($k = $i; $k < $lr; $k++) { - $heightrow[$k] = $c['mih'] / $c['rowspan']; - } - } elseif (!\count($list)) { - // no rows in the rowspan have a height specified, so share amongst all rows equally - $hi = $c['mih'] - $hs; - for ($k = $i; $k < $lr; $k++) { - $heightrow[$k] += $heightrow[$k] / $hs * $hi; - } - } else { - $hi = $c['mih'] - $hs; - // mPDF 6 - foreach ($list as $k) { - $heightrow[$k] += $hi / \count($list); - // mPDF 6 - } - } - } - unset($c); - // If rowspans overlap so that one or more rows do not have a height set... - // i.e. for one or more rows, the only cells (explicit) in that row have rowspan>1 - // so heightrow is still == 0 - if ($heightrow[$i] == 0) { - // Get row extent to analyse above and below - $top = $i; - foreach ($listspan as $checkspan) { - list($cki, $ckj) = $checkspan; - $c =& $cells[$cki][$ckj]; - if (isset($c['rowspan']) && $c['rowspan'] > 1) { - if ($cki + $c['rowspan'] - 1 >= $i) { - $top = \min($top, $cki); - } - } - } - $bottom = $i + $c['rowspan'] - 1; - // Check for overconstrained conditions - for ($k = $top; $k <= $bottom; $k++) { - // if ['hr'] for any of the others is also 0, then abort (too complicated) - if ($k != $i && $heightrow[$k] == 0) { - break 1; - } - // check again that top and bottom are not crossed by rowspans - or abort (too complicated) - if ($k == $top) { - // ???? take account of colspan as well??? - for ($m = 0; $m < $numcols; $m++) { - // columns - if (!isset($cells[$k][$m]) || $cells[$k][$m] == 0) { - break 2; - } - } - } elseif ($k == $bottom) { - // ???? take account of colspan as well??? - for ($m = 0; $m < $numcols; $m++) { - // columns - $c =& $cells[$k][$m]; - if (isset($c['rowspan']) && $c['rowspan'] > 1) { - break 2; - } - } - } - } - // By columns add up col height using ['h'] if set or ['mih'] if not - // Intentionally do not substract border-spacing - $colH = []; - $extH = 0; - $newhr = []; - for ($m = 0; $m < $numcols; $m++) { - // columns - for ($k = $top; $k <= $bottom; $k++) { - if (isset($cells[$k][$m]) && $cells[$k][$m] != 0) { - $c =& $cells[$k][$m]; - if (isset($c['h']) && $c['h']) { - $useh = $c['h']; - } else { - $useh = $c['mih']; - } - if (isset($colH[$m])) { - $colH[$m] += $useh; - } else { - $colH[$m] = $useh; - } - if (!isset($c['rowspan']) || $c['rowspan'] < 2) { - $newhr[$k] = \max(isset($newhr[$k]) ? $newhr[$k] : 0, $useh); - } - } - } - $extH = \max($extH, $colH[$m]); - // mPDF 6 - } - $newhr[$i] = $extH - \array_sum($newhr); - for ($k = $top; $k <= $bottom; $k++) { - $heightrow[$k] = $newhr[$k]; - } - } - unset($c); - } - $table['h'] = \array_sum($heightrow); - unset($heightrow); - if ($table['borders_separate']) { - $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['border_details']['T']['w'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] + $table['padding']['T'] + $table['padding']['B']; - } else { - $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['max_cell_border_width']['T'] / 2 + $table['max_cell_border_width']['B'] / 2; - } - $maxrowheight = $checkmaxheightplus + $headerrowheightplus + $footerrowheightplus; - $maxfirstrowheight = $firstrowheight + $headerrowheightplus + $footerrowheightplus; - // includes thead, 1st row and tfoot - return [$table['h'], $maxrowheight, $temppgheight, $remainingpage, $maxfirstrowheight]; - } - function _tableGetWidth(&$table, $i, $j) - { - $cell =& $table['cells'][$i][$j]; - if ($cell) { - if (isset($cell['x0'])) { - return [$cell['x0'], $cell['w0']]; - } - $x = 0; - $widthcols =& $table['wc']; - for ($k = 0; $k < $j; $k++) { - $x += $widthcols[$k]; - } - $w = $widthcols[$j]; - if (isset($cell['colspan'])) { - for ($k = $j + $cell['colspan'] - 1; $k > $j; $k--) { - $w += $widthcols[$k]; - } - } - $cell['x0'] = $x; - $cell['w0'] = $w; - return [$x, $w]; - } - return [0, 0]; - } - function _splitTableGetWidth(&$table, $i, $j) - { - $cell =& $table['cells'][$i][$j]; - if ($cell) { - if (isset($cell['x0'])) { - return [$cell['x0'], $cell['w0']]; - } - $x = 0; - $widthcols =& $table['wc']; - $pg = $table['colPg'][$j]; - for ($k = 0; $k < $j; $k++) { - if ($table['colPg'][$k] == $pg) { - $x += $widthcols[$k]; - } - } - $w = $widthcols[$j]; - if (isset($cell['colspan'])) { - for ($k = $j + $cell['colspan'] - 1; $k > $j; $k--) { - if ($table['colPg'][$k] == $pg) { - $w += $widthcols[$k]; - } - } - } - $cell['x0'] = $x; - $cell['w0'] = $w; - return [$x, $w]; - } - return [0, 0]; - } - function _tableGetHeight(&$table, $i, $j) - { - $cell =& $table['cells'][$i][$j]; - if ($cell) { - if (isset($cell['y0'])) { - return [$cell['y0'], $cell['h0']]; - } - $y = 0; - $heightrow =& $table['hr']; - for ($k = 0; $k < $i; $k++) { - $y += $heightrow[$k]; - } - $h = $heightrow[$i]; - if (isset($cell['rowspan'])) { - for ($k = $i + $cell['rowspan'] - 1; $k > $i; $k--) { - if (\array_key_exists($k, $heightrow)) { - $h += $heightrow[$k]; - } else { - $this->logger->debug('Possible non-wellformed HTML markup in a table', ['context' => LogContext::HTML_MARKUP]); - } - } - } - $cell['y0'] = $y; - $cell['h0'] = $h; - return [$y, $h]; - } - return [0, 0]; - } - function _tableGetMaxRowHeight($table, $row) - { - if ($row == $table['nc'] - 1) { - return $table['hr'][$row]; - } - $maxrowheight = $table['hr'][$row]; - for ($i = $row + 1; $i < $table['nr']; $i++) { - $cellsset = 0; - for ($j = 0; $j < $table['nc']; $j++) { - if (!empty($table['cells'][$i][$j])) { - if (isset($table['cells'][$i][$j]['colspan'])) { - $cellsset += $table['cells'][$i][$j]['colspan']; - } else { - $cellsset += 1; - } - } - } - if ($cellsset == $table['nc']) { - return $maxrowheight; - } else { - $maxrowheight += $table['hr'][$i]; - } - } - return $maxrowheight; - } - // CHANGED TO ALLOW TABLE BORDER TO BE SPECIFIED CORRECTLY - added border_details - function _tableRect($x, $y, $w, $h, $bord = -1, $details = [], $buffer = \false, $bSeparate = \false, $cort = 'cell', $tablecorner = '', $bsv = 0, $bsh = 0) - { - $cellBorderOverlay = []; - if ($bord == -1) { - $this->Rect($x, $y, $w, $h); - } elseif ($this->simpleTables && $cort == 'cell') { - $this->SetLineWidth($details['L']['w']); - if ($details['L']['c']) { - $this->SetDColor($details['L']['c']); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - $this->SetLineJoin(0); - $this->Rect($x, $y, $w, $h); - } elseif ($bord) { - if (!$bSeparate && $buffer) { - $priority = 'LRTB'; - for ($p = 0; $p < \strlen($priority); $p++) { - $side = $priority[$p]; - $details['p'] = $side; - $dom = 0; - if (isset($details[$side]['w'])) { - $dom += $details[$side]['w'] * 100000; - } - if (isset($details[$side]['style'])) { - $dom += \array_search($details[$side]['style'], $this->borderstyles) * 100; - } - if (isset($details[$side]['dom'])) { - $dom += $details[$side]['dom'] * 10; - } - // Precedence to darker colours at joins - $coldom = 0; - if (isset($details[$side]['c']) && \is_array($details[$side]['c'])) { - if ($details[$side]['c'][0] == 3) { - // RGB - $coldom = 10 - (\ord($details[$side]['c'][1]) * 1.0 + \ord($details[$side]['c'][2]) * 1.0 + \ord($details[$side]['c'][3]) * 1.0) / 76.5; - } - } - // 10 black - 0 white - if ($coldom) { - $dom += $coldom; - } - // Lastly precedence to RIGHT and BOTTOM cells at joins - if (isset($details['cellposdom'])) { - $dom += $details['cellposdom']; - } - $save = \false; - if ($side == 'T' && $this->issetBorder($bord, Border::TOP)) { - $cbord = Border::TOP; - $save = \true; - } elseif ($side == 'L' && $this->issetBorder($bord, Border::LEFT)) { - $cbord = Border::LEFT; - $save = \true; - } elseif ($side == 'R' && $this->issetBorder($bord, Border::RIGHT)) { - $cbord = Border::RIGHT; - $save = \true; - } elseif ($side == 'B' && $this->issetBorder($bord, Border::BOTTOM)) { - $cbord = Border::BOTTOM; - $save = \true; - } - if ($save) { - $this->cellBorderBuffer[] = \pack("A16nCnda6A10d14", \str_pad(\sprintf("%08.7f", $dom), 16, "0", \STR_PAD_LEFT), $cbord, \ord($side), $details[$side]['s'], $details[$side]['w'], $details[$side]['c'], $details[$side]['style'], $x, $y, $w, $h, $details['mbw']['BL'], $details['mbw']['BR'], $details['mbw']['RT'], $details['mbw']['RB'], $details['mbw']['TL'], $details['mbw']['TR'], $details['mbw']['LT'], $details['mbw']['LB'], $details['cellposdom'], 0); - if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset' || $details[$side]['style'] == 'double') { - $details[$side]['overlay'] = \true; - $this->cellBorderBuffer[] = \pack("A16nCnda6A10d14", \str_pad(\sprintf("%08.7f", $dom + 4), 16, "0", \STR_PAD_LEFT), $cbord, \ord($side), $details[$side]['s'], $details[$side]['w'], $details[$side]['c'], $details[$side]['style'], $x, $y, $w, $h, $details['mbw']['BL'], $details['mbw']['BR'], $details['mbw']['RT'], $details['mbw']['RB'], $details['mbw']['TL'], $details['mbw']['TR'], $details['mbw']['LT'], $details['mbw']['LB'], $details['cellposdom'], 1); - } - } - } - return; - } - if (isset($details['p']) && \strlen($details['p']) > 1) { - $priority = $details['p']; - } else { - $priority = 'LTRB'; - } - $Tw = 0; - $Rw = 0; - $Bw = 0; - $Lw = 0; - if (isset($details['T']['w'])) { - $Tw = $details['T']['w']; - } - if (isset($details['R']['w'])) { - $Rw = $details['R']['w']; - } - if (isset($details['B']['w'])) { - $Bw = $details['B']['w']; - } - if (isset($details['L']['w'])) { - $Lw = $details['L']['w']; - } - $x2 = $x + $w; - $y2 = $y + $h; - $oldlinewidth = $this->LineWidth; - for ($p = 0; $p < \strlen($priority); $p++) { - $side = $priority[$p]; - $xadj = 0; - $xadj2 = 0; - $yadj = 0; - $yadj2 = 0; - $print = \false; - if ($Tw && $side == 'T' && $this->issetBorder($bord, Border::TOP)) { - // TOP - $ly1 = $y; - $ly2 = $y; - $lx1 = $x; - $lx2 = $x2; - $this->SetLineWidth($Tw); - if ($cort == 'cell' || \strpos($tablecorner, 'L') !== \false) { - if ($Tw > $Lw) { - $xadj = ($Tw - $Lw) / 2; - } - if ($Tw < $Lw) { - $xadj = ($Tw + $Lw) / 2; - } - } else { - $xadj = $Tw / 2 - $bsh / 2; - } - if ($cort == 'cell' || \strpos($tablecorner, 'R') !== \false) { - if ($Tw > $Rw) { - $xadj2 = ($Tw - $Rw) / 2; - } - if ($Tw < $Rw) { - $xadj2 = ($Tw + $Rw) / 2; - } - } else { - $xadj2 = $Tw / 2 - $bsh / 2; - } - if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['TL'])) { - $xadj = ($Tw - $details['mbw']['TL']) / 2; - } - if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['TR'])) { - $xadj2 = ($Tw - $details['mbw']['TR']) / 2; - } - $print = \true; - } - if ($Lw && $side == 'L' && $this->issetBorder($bord, Border::LEFT)) { - // LEFT - $ly1 = $y; - $ly2 = $y2; - $lx1 = $x; - $lx2 = $x; - $this->SetLineWidth($Lw); - if ($cort == 'cell' || \strpos($tablecorner, 'T') !== \false) { - if ($Lw > $Tw) { - $yadj = ($Lw - $Tw) / 2; - } - if ($Lw < $Tw) { - $yadj = ($Lw + $Tw) / 2; - } - } else { - $yadj = $Lw / 2 - $bsv / 2; - } - if ($cort == 'cell' || \strpos($tablecorner, 'B') !== \false) { - if ($Lw > $Bw) { - $yadj2 = ($Lw - $Bw) / 2; - } - if ($Lw < $Bw) { - $yadj2 = ($Lw + $Bw) / 2; - } - } else { - $yadj2 = $Lw / 2 - $bsv / 2; - } - if (!$bSeparate && $details['mbw']['LT']) { - $yadj = ($Lw - $details['mbw']['LT']) / 2; - } - if (!$bSeparate && $details['mbw']['LB']) { - $yadj2 = ($Lw - $details['mbw']['LB']) / 2; - } - $print = \true; - } - if ($Rw && $side == 'R' && $this->issetBorder($bord, Border::RIGHT)) { - // RIGHT - $ly1 = $y; - $ly2 = $y2; - $lx1 = $x2; - $lx2 = $x2; - $this->SetLineWidth($Rw); - if ($cort == 'cell' || \strpos($tablecorner, 'T') !== \false) { - if ($Rw < $Tw) { - $yadj = ($Rw + $Tw) / 2; - } - if ($Rw > $Tw) { - $yadj = ($Rw - $Tw) / 2; - } - } else { - $yadj = $Rw / 2 - $bsv / 2; - } - if ($cort == 'cell' || \strpos($tablecorner, 'B') !== \false) { - if ($Rw > $Bw) { - $yadj2 = ($Rw - $Bw) / 2; - } - if ($Rw < $Bw) { - $yadj2 = ($Rw + $Bw) / 2; - } - } else { - $yadj2 = $Rw / 2 - $bsv / 2; - } - if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['RT'])) { - $yadj = ($Rw - $details['mbw']['RT']) / 2; - } - if (!$bSeparate && !empty($details['mbw']) && !empty($details['mbw']['RB'])) { - $yadj2 = ($Rw - $details['mbw']['RB']) / 2; - } - $print = \true; - } - if ($Bw && $side == 'B' && $this->issetBorder($bord, Border::BOTTOM)) { - // BOTTOM - $ly1 = $y2; - $ly2 = $y2; - $lx1 = $x; - $lx2 = $x2; - $this->SetLineWidth($Bw); - if ($cort == 'cell' || \strpos($tablecorner, 'L') !== \false) { - if ($Bw > $Lw) { - $xadj = ($Bw - $Lw) / 2; - } - if ($Bw < $Lw) { - $xadj = ($Bw + $Lw) / 2; - } - } else { - $xadj = $Bw / 2 - $bsh / 2; - } - if ($cort == 'cell' || \strpos($tablecorner, 'R') !== \false) { - if ($Bw > $Rw) { - $xadj2 = ($Bw - $Rw) / 2; - } - if ($Bw < $Rw) { - $xadj2 = ($Bw + $Rw) / 2; - } - } else { - $xadj2 = $Bw / 2 - $bsh / 2; - } - if (!$bSeparate && isset($details['mbw']) && isset($details['mbw']['BL'])) { - $xadj = ($Bw - $details['mbw']['BL']) / 2; - } - if (!$bSeparate && isset($details['mbw']) && isset($details['mbw']['BR'])) { - $xadj2 = ($Bw - $details['mbw']['BR']) / 2; - } - $print = \true; - } - // Now draw line - if ($print) { - /* -- TABLES-ADVANCED-BORDERS -- */ - if ($details[$side]['style'] == 'double') { - if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { - if ($details[$side]['c']) { - $this->SetDColor($details[$side]['c']); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); - } - if (isset($details[$side]['overlay']) && $details[$side]['overlay'] || $bSeparate) { - if ($bSeparate && $cort == 'table') { - if ($side == 'T') { - $xadj -= $this->LineWidth / 2; - $xadj2 -= $this->LineWidth; - if ($this->issetBorder($bord, Border::LEFT)) { - $xadj += $this->LineWidth / 2; - } - if ($this->issetBorder($bord, Border::RIGHT)) { - $xadj2 += $this->LineWidth; - } - } - if ($side == 'L') { - $yadj -= $this->LineWidth / 2; - $yadj2 -= $this->LineWidth; - if ($this->issetBorder($bord, Border::TOP)) { - $yadj += $this->LineWidth / 2; - } - if ($this->issetBorder($bord, Border::BOTTOM)) { - $yadj2 += $this->LineWidth; - } - } - if ($side == 'B') { - $xadj -= $this->LineWidth / 2; - $xadj2 -= $this->LineWidth; - if ($this->issetBorder($bord, Border::LEFT)) { - $xadj += $this->LineWidth / 2; - } - if ($this->issetBorder($bord, Border::RIGHT)) { - $xadj2 += $this->LineWidth; - } - } - if ($side == 'R') { - $yadj -= $this->LineWidth / 2; - $yadj2 -= $this->LineWidth; - if ($this->issetBorder($bord, Border::TOP)) { - $yadj += $this->LineWidth / 2; - } - if ($this->issetBorder($bord, Border::BOTTOM)) { - $yadj2 += $this->LineWidth; - } - } - } - $this->SetLineWidth($this->LineWidth / 3); - $tbcol = $this->colorConverter->convert(255, $this->PDFAXwarnings); - for ($l = 0; $l <= $this->blklvl; $l++) { - if ($this->blk[$l]['bgcolor']) { - $tbcol = $this->blk[$l]['bgcolorarray']; - } - } - if ($bSeparate) { - $cellBorderOverlay[] = ['x' => $lx1 + $xadj, 'y' => $ly1 + $yadj, 'x2' => $lx2 - $xadj2, 'y2' => $ly2 - $yadj2, 'col' => $tbcol, 'lw' => $this->LineWidth]; - } else { - $this->SetDColor($tbcol); - $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); - } - } - } elseif (isset($details[$side]['style']) && ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset')) { - if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { - if ($details[$side]['c']) { - $this->SetDColor($details[$side]['c']); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - if ($details[$side]['style'] == 'outset' || $details[$side]['style'] == 'groove') { - $nc = $this->colorConverter->darken($details[$side]['c']); - $this->SetDColor($nc); - } elseif ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { - $nc = $this->colorConverter->lighten($details[$side]['c']); - $this->SetDColor($nc); - } - $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); - } - if (isset($details[$side]['overlay']) && $details[$side]['overlay'] || $bSeparate) { - if ($details[$side]['c']) { - $this->SetDColor($details[$side]['c']); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - $doubleadj = $this->LineWidth / 3; - $this->SetLineWidth($this->LineWidth / 2); - $xadj3 = $yadj3 = $wadj3 = $hadj3 = 0; - if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { - $nc = $this->colorConverter->darken($details[$side]['c']); - if ($bSeparate && $cort == 'table') { - if ($side == 'T') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = -$this->LineWidth / 2; - $wadj3 = $this->LineWidth; - if ($this->issetBorder($bord, Border::LEFT)) { - $xadj3 += $this->LineWidth; - $wadj3 -= $this->LineWidth; - } - if ($this->issetBorder($bord, Border::RIGHT)) { - $wadj3 -= $this->LineWidth * 2; - } - } - if ($side == 'L') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = -$this->LineWidth / 2; - $hadj3 = $this->LineWidth; - if ($this->issetBorder($bord, Border::TOP)) { - $yadj3 += $this->LineWidth; - $hadj3 -= $this->LineWidth; - } - if ($this->issetBorder($bord, Border::BOTTOM)) { - $hadj3 -= $this->LineWidth * 2; - } - } - if ($side == 'B') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = -$this->LineWidth / 2; - $wadj3 = $this->LineWidth; - } - if ($side == 'R') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = -$this->LineWidth / 2; - $hadj3 = $this->LineWidth; - } - } elseif ($side == 'T') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = $this->LineWidth / 2; - $wadj3 = -$this->LineWidth * 2; - } elseif ($side == 'L') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = $this->LineWidth / 2; - $hadj3 = -$this->LineWidth * 2; - } elseif ($side == 'B' && $bSeparate) { - $yadj3 = $this->LineWidth / 2; - $wadj3 = $this->LineWidth / 2; - } elseif ($side == 'R' && $bSeparate) { - $xadj3 = $this->LineWidth / 2; - $hadj3 = $this->LineWidth / 2; - } elseif ($side == 'B') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = $this->LineWidth / 2; - } elseif ($side == 'R') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = $this->LineWidth / 2; - } - } else { - $nc = $this->colorConverter->lighten($details[$side]['c']); - if ($bSeparate && $cort == 'table') { - if ($side == 'T') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = -$this->LineWidth / 2; - $wadj3 = $this->LineWidth; - if ($this->issetBorder($bord, Border::LEFT)) { - $xadj3 += $this->LineWidth; - $wadj3 -= $this->LineWidth; - } - } - if ($side == 'L') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = -$this->LineWidth / 2; - $hadj3 = $this->LineWidth; - if ($this->issetBorder($bord, Border::TOP)) { - $yadj3 += $this->LineWidth; - $hadj3 -= $this->LineWidth; - } - } - if ($side == 'B') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = -$this->LineWidth / 2; - $wadj3 = $this->LineWidth; - if ($this->issetBorder($bord, Border::LEFT)) { - $xadj3 += $this->LineWidth; - $wadj3 -= $this->LineWidth; - } - } - if ($side == 'R') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = -$this->LineWidth / 2; - $hadj3 = $this->LineWidth; - if ($this->issetBorder($bord, Border::TOP)) { - $yadj3 += $this->LineWidth; - $hadj3 -= $this->LineWidth; - } - } - } elseif ($side == 'T') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = $this->LineWidth / 2; - } elseif ($side == 'L') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = $this->LineWidth / 2; - } elseif ($side == 'B' && $bSeparate) { - $yadj3 = $this->LineWidth / 2; - $xadj3 = $this->LineWidth / 2; - } elseif ($side == 'R' && $bSeparate) { - $xadj3 = $this->LineWidth / 2; - $yadj3 = $this->LineWidth / 2; - } elseif ($side == 'B') { - $yadj3 = $this->LineWidth / 2; - $xadj3 = -$this->LineWidth / 2; - $wadj3 = $this->LineWidth; - } elseif ($side == 'R') { - $xadj3 = $this->LineWidth / 2; - $yadj3 = -$this->LineWidth / 2; - $hadj3 = $this->LineWidth; - } - } - if ($bSeparate) { - $cellBorderOverlay[] = ['x' => $lx1 + $xadj + $xadj3, 'y' => $ly1 + $yadj + $yadj3, 'x2' => $lx2 - $xadj2 + $xadj3 + $wadj3, 'y2' => $ly2 - $yadj2 + $yadj3 + $hadj3, 'col' => $nc, 'lw' => $this->LineWidth]; - } else { - $this->SetDColor($nc); - $this->Line($lx1 + $xadj + $xadj3, $ly1 + $yadj + $yadj3, $lx2 - $xadj2 + $xadj3 + $wadj3, $ly2 - $yadj2 + $yadj3 + $hadj3); - } - } - } else { - /* -- END TABLES-ADVANCED-BORDERS -- */ - if ($details[$side]['style'] == 'dashed') { - $dashsize = 2; - // final dash will be this + 1*linewidth - $dashsizek = 1.5; - // ratio of Dash/Blank - $this->SetDash($dashsize, $dashsize / $dashsizek + $this->LineWidth * 2); - } elseif ($details[$side]['style'] == 'dotted') { - $this->SetLineJoin(1); - $this->SetLineCap(1); - $this->SetDash(0.001, $this->LineWidth * 2); - } - if ($details[$side]['c']) { - $this->SetDColor($details[$side]['c']); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); - /* -- TABLES-ADVANCED-BORDERS -- */ - } - /* -- END TABLES-ADVANCED-BORDERS -- */ - // Reset Corners - $this->SetDash(); - // BUTT style line cap - $this->SetLineCap(2); - } - } - if ($bSeparate && \count($cellBorderOverlay)) { - foreach ($cellBorderOverlay as $cbo) { - $this->SetLineWidth($cbo['lw']); - $this->SetDColor($cbo['col']); - $this->Line($cbo['x'], $cbo['y'], $cbo['x2'], $cbo['y2']); - } - } - // $this->SetLineWidth($oldlinewidth); - // $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - } - /* -- TABLES -- */ - /* -- TABLES-ADVANCED-BORDERS -- */ - /* -- END TABLES-ADVANCED-BORDERS -- */ - function setBorder(&$var, $flag, $set = \true) - { - $flag = \intval($flag); - if ($set) { - $set = \true; - } - $var = \intval($var); - $var = $set ? $var | $flag : $var & ~$flag; - } - function issetBorder($var, $flag) - { - $flag = \intval($flag); - $var = \intval($var); - return ($var & $flag) == $flag; - } - function _table2cellBorder(&$tableb, &$cbdb, &$cellb, $bval) - { - if ($tableb && $tableb['w'] > $cbdb['w']) { - $cbdb = $tableb; - $this->setBorder($cellb, $bval); - } elseif ($tableb && $tableb['w'] == $cbdb['w'] && \array_search($tableb['style'], $this->borderstyles) > \array_search($cbdb['style'], $this->borderstyles)) { - $cbdb = $tableb; - $this->setBorder($cellb, $bval); - } - } - // FIX BORDERS ******************************************** - function _fixTableBorders(&$table) - { - if (!$table['borders_separate'] && $table['border_details']['L']['w']) { - $table['max_cell_border_width']['L'] = $table['border_details']['L']['w']; - } - if (!$table['borders_separate'] && $table['border_details']['R']['w']) { - $table['max_cell_border_width']['R'] = $table['border_details']['R']['w']; - } - if (!$table['borders_separate'] && $table['border_details']['T']['w']) { - $table['max_cell_border_width']['T'] = $table['border_details']['T']['w']; - } - if (!$table['borders_separate'] && $table['border_details']['B']['w']) { - $table['max_cell_border_width']['B'] = $table['border_details']['B']['w']; - } - if ($this->simpleTables) { - return; - } - $cells =& $table['cells']; - $numcols = $table['nc']; - $numrows = $table['nr']; - /* -- TABLES-ADVANCED-BORDERS -- */ - if (isset($table['topntail']) && $table['topntail']) { - $tntborddet = $this->border_details($table['topntail']); - } - if (isset($table['thead-underline']) && $table['thead-underline']) { - $thuborddet = $this->border_details($table['thead-underline']); - } - /* -- END TABLES-ADVANCED-BORDERS -- */ - for ($i = 0; $i < $numrows; $i++) { - // Rows - for ($j = 0; $j < $numcols; $j++) { - // Columns - if (isset($cells[$i][$j]) && $cells[$i][$j]) { - $cell =& $cells[$i][$j]; - if ($this->packTableData) { - $cbord = $this->_unpackCellBorder($cell['borderbin']); - } else { - $cbord =& $cells[$i][$j]; - } - // mPDF 5.7.3 - if (!$cbord['border'] && $cbord['border'] !== 0 && isset($table['border']) && $table['border'] && $this->table_border_attr_set) { - $cbord['border'] = $table['border']; - $cbord['border_details'] = $table['border_details']; - } - if (isset($cell['colspan']) && $cell['colspan'] > 1) { - $ccolsp = $cell['colspan']; - } else { - $ccolsp = 1; - } - if (isset($cell['rowspan']) && $cell['rowspan'] > 1) { - $crowsp = $cell['rowspan']; - } else { - $crowsp = 1; - } - $cbord['border_details']['cellposdom'] = ($i + 1) / $numrows / 10000 + ($j + 1) / $numcols / 10; - // Inherit Cell border from Table border - if ($this->table_border_css_set && !$table['borders_separate']) { - if ($i == 0) { - $this->_table2cellBorder($table['border_details']['T'], $cbord['border_details']['T'], $cbord['border'], Border::TOP); - } - if ($i == $numrows - 1 || $i + $crowsp == $numrows) { - $this->_table2cellBorder($table['border_details']['B'], $cbord['border_details']['B'], $cbord['border'], Border::BOTTOM); - } - if ($j == 0) { - $this->_table2cellBorder($table['border_details']['L'], $cbord['border_details']['L'], $cbord['border'], Border::LEFT); - } - if ($j == $numcols - 1 || $j + $ccolsp == $numcols) { - $this->_table2cellBorder($table['border_details']['R'], $cbord['border_details']['R'], $cbord['border'], Border::RIGHT); - } - } - /* -- TABLES-ADVANCED-BORDERS -- */ - $fixbottom = \true; - if (isset($table['topntail']) && $table['topntail']) { - if ($i == 0) { - $cbord['border_details']['T'] = $tntborddet; - $this->setBorder($cbord['border'], Border::TOP); - } - if ($this->tableLevel == 1 && $table['headernrows'] > 0 && $i == $table['headernrows'] - 1) { - $cbord['border_details']['B'] = $tntborddet; - $this->setBorder($cbord['border'], Border::BOTTOM); - $fixbottom = \false; - } elseif ($this->tableLevel == 1 && $table['headernrows'] > 0 && $i == $table['headernrows']) { - if (!$table['borders_separate']) { - $cbord['border_details']['T'] = $tntborddet; - $this->setBorder($cbord['border'], Border::TOP); - } - } - if ($this->tableLevel == 1 && $table['footernrows'] > 0 && $i == $numrows - $table['footernrows'] - 1) { - if (!$table['borders_separate']) { - $cbord['border_details']['B'] = $tntborddet; - $this->setBorder($cbord['border'], Border::BOTTOM); - $fixbottom = \false; - } - } elseif ($this->tableLevel == 1 && $table['footernrows'] > 0 && $i == $numrows - $table['footernrows']) { - $cbord['border_details']['T'] = $tntborddet; - $this->setBorder($cbord['border'], Border::TOP); - } - if ($this->tabletheadjustfinished) { - // $this->tabletheadjustfinished called from tableheader - if (!$table['borders_separate']) { - $cbord['border_details']['T'] = $tntborddet; - $this->setBorder($cbord['border'], Border::TOP); - } - } - if ($i == $numrows - 1 || $i + $crowsp == $numrows) { - $cbord['border_details']['B'] = $tntborddet; - $this->setBorder($cbord['border'], Border::BOTTOM); - } - } - if (isset($table['thead-underline']) && $table['thead-underline']) { - if ($table['borders_separate']) { - if ($i == 0) { - $cbord['border_details']['B'] = $thuborddet; - $this->setBorder($cbord['border'], Border::BOTTOM); - $fixbottom = \false; - } - } else { - if ($this->tableLevel == 1 && $table['headernrows'] > 0 && $i == $table['headernrows'] - 1) { - $cbord['border_details']['T'] = $thuborddet; - $this->setBorder($cbord['border'], Border::TOP); - } elseif ($this->tabletheadjustfinished) { - // $this->tabletheadjustfinished called from tableheader - $cbord['border_details']['T'] = $thuborddet; - $this->setBorder($cbord['border'], Border::TOP); - } - } - } - // Collapse Border - Algorithm for conflicting borders - // Hidden >> Width >> double>solid>dashed>dotted... >> style set on cell>table >> top/left>bottom/right - // Do not turn off border which is overridden - // Needed for page break for TOP/BOTTOM both to be defined in Collapsed borders - // Means it is painted twice. (Left/Right can still disable overridden border) - if (!$table['borders_separate']) { - if (($i < $numrows - 1 || $i + $crowsp < $numrows) && $fixbottom) { - // Bottom - for ($cspi = 0; $cspi < $ccolsp; $cspi++) { - // already defined Top for adjacent cell below - if (isset($cells[$i + $crowsp][$j + $cspi])) { - if ($this->packTableData) { - $adjc = $cells[$i + $crowsp][$j + $cspi]; - $celladj = $this->_unpackCellBorder($adjc['borderbin']); - } else { - $celladj =& $cells[$i + $crowsp][$j + $cspi]; - } - } else { - $celladj = \false; - } - if (isset($celladj['border_details']['T']['s']) && $celladj['border_details']['T']['s'] == 1) { - $csadj = $celladj['border_details']['T']['w']; - $csthis = $cbord['border_details']['B']['w']; - // Hidden - if ($cbord['border_details']['B']['style'] == 'hidden') { - $celladj['border_details']['T'] = $cbord['border_details']['B']; - $this->setBorder($celladj['border'], Border::TOP, \false); - $this->setBorder($cbord['border'], Border::BOTTOM, \false); - } elseif ($celladj['border_details']['T']['style'] == 'hidden') { - $cbord['border_details']['B'] = $celladj['border_details']['T']; - $this->setBorder($cbord['border'], Border::BOTTOM, \false); - $this->setBorder($celladj['border'], Border::TOP, \false); - } elseif ($csthis > $csadj) { - // Width - if (!isset($cells[$i + $crowsp][$j + $cspi]['colspan']) || isset($cells[$i + $crowsp][$j + $cspi]['colspan']) && $cells[$i + $crowsp][$j + $cspi]['colspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['T'] = $cbord['border_details']['B']; - $this->setBorder($cbord['border'], Border::BOTTOM); - } - } elseif ($csadj > $csthis) { - if ($ccolsp < 2) { - // don't overwrite this cell if it spans - $cbord['border_details']['B'] = $celladj['border_details']['T']; - $this->setBorder($celladj['border'], Border::TOP); - } - } elseif (\array_search($cbord['border_details']['B']['style'], $this->borderstyles) > \array_search($celladj['border_details']['T']['style'], $this->borderstyles)) { - // double>solid>dashed>dotted... - if (!isset($cells[$i + $crowsp][$j + $cspi]['colspan']) || isset($cells[$i + $crowsp][$j + $cspi]['colspan']) && $cells[$i + $crowsp][$j + $cspi]['colspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['T'] = $cbord['border_details']['B']; - $this->setBorder($cbord['border'], Border::BOTTOM); - } - } elseif (\array_search($celladj['border_details']['T']['style'], $this->borderstyles) > \array_search($cbord['border_details']['B']['style'], $this->borderstyles)) { - if ($ccolsp < 2) { - // don't overwrite this cell if it spans - $cbord['border_details']['B'] = $celladj['border_details']['T']; - $this->setBorder($celladj['border'], Border::TOP); - } - } elseif ($celladj['border_details']['T']['dom'] > $celladj['border_details']['B']['dom']) { - // Style set on cell vs. table - if ($ccolsp < 2) { - // don't overwrite this cell if it spans - $cbord['border_details']['B'] = $celladj['border_details']['T']; - $this->setBorder($celladj['border'], Border::TOP); - } - } else { - // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT - if (!isset($cells[$i + $crowsp][$j + $cspi]['colspan']) || isset($cells[$i + $crowsp][$j + $cspi]['colspan']) && $cells[$i + $crowsp][$j + $cspi]['colspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['T'] = $cbord['border_details']['B']; - $this->setBorder($cbord['border'], Border::BOTTOM); - } - } - } elseif ($celladj) { - if (!isset($cells[$i + $crowsp][$j + $cspi]['colspan']) || isset($cells[$i + $crowsp][$j + $cspi]['colspan']) && $cells[$i + $crowsp][$j + $cspi]['colspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['T'] = $cbord['border_details']['B']; - } - } - // mPDF 5.7.4 - if ($celladj && $this->packTableData) { - $cells[$i + $crowsp][$j + $cspi]['borderbin'] = $this->_packCellBorder($celladj); - } - unset($celladj); - } - } - if ($j < $numcols - 1 || $j + $ccolsp < $numcols) { - // Right-Left - for ($cspi = 0; $cspi < $crowsp; $cspi++) { - // already defined Left for adjacent cell to R - if (isset($cells[$i + $cspi][$j + $ccolsp])) { - if ($this->packTableData) { - $adjc = $cells[$i + $cspi][$j + $ccolsp]; - $celladj = $this->_unpackCellBorder($adjc['borderbin']); - } else { - $celladj =& $cells[$i + $cspi][$j + $ccolsp]; - } - } else { - $celladj = \false; - } - if ($celladj && $celladj['border_details']['L']['s'] == 1) { - $csadj = $celladj['border_details']['L']['w']; - $csthis = $cbord['border_details']['R']['w']; - // Hidden - if ($cbord['border_details']['R']['style'] == 'hidden') { - $celladj['border_details']['L'] = $cbord['border_details']['R']; - $this->setBorder($celladj['border'], Border::LEFT, \false); - $this->setBorder($cbord['border'], Border::RIGHT, \false); - } elseif ($celladj['border_details']['L']['style'] == 'hidden') { - $cbord['border_details']['R'] = $celladj['border_details']['L']; - $this->setBorder($cbord['border'], Border::RIGHT, \false); - $this->setBorder($celladj['border'], Border::LEFT, \false); - } elseif ($csthis > $csadj) { - if (!isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) || isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) && $cells[$i + $cspi][$j + $ccolsp]['rowspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['L'] = $cbord['border_details']['R']; - $this->setBorder($cbord['border'], Border::RIGHT); - $this->setBorder($celladj['border'], Border::LEFT, \false); - } - } elseif ($csadj > $csthis) { - if ($crowsp < 2) { - // don't overwrite this cell if it spans - $cbord['border_details']['R'] = $celladj['border_details']['L']; - $this->setBorder($cbord['border'], Border::RIGHT, \false); - $this->setBorder($celladj['border'], Border::LEFT); - } - } elseif (\array_search($cbord['border_details']['R']['style'], $this->borderstyles) > \array_search($celladj['border_details']['L']['style'], $this->borderstyles)) { - if (!isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) || isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) && $cells[$i + $cspi][$j + $ccolsp]['rowspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['L'] = $cbord['border_details']['R']; - $this->setBorder($celladj['border'], Border::LEFT, \false); - $this->setBorder($cbord['border'], Border::RIGHT); - } - } elseif (\array_search($celladj['border_details']['L']['style'], $this->borderstyles) > \array_search($cbord['border_details']['R']['style'], $this->borderstyles)) { - if ($crowsp < 2) { - // don't overwrite this cell if it spans - $cbord['border_details']['R'] = $celladj['border_details']['L']; - $this->setBorder($cbord['border'], Border::RIGHT, \false); - $this->setBorder($celladj['border'], Border::LEFT); - } - } elseif ($celladj['border_details']['L']['dom'] > $cbord['border_details']['R']['dom']) { - if ($crowsp < 2) { - // don't overwrite this cell if it spans - $cbord['border_details']['R'] = $celladj['border_details']['L']; - $this->setBorder($celladj['border'], Border::LEFT); - } - } else { - if (!isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) || isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) && $cells[$i + $cspi][$j + $ccolsp]['rowspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['L'] = $cbord['border_details']['R']; - $this->setBorder($cbord['border'], Border::RIGHT); - } - } - } elseif ($celladj) { - // if right-cell border is not set - if (!isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) || isset($cells[$i + $cspi][$j + $ccolsp]['rowspan']) && $cells[$i + $cspi][$j + $ccolsp]['rowspan'] < 2) { - // don't overwrite bordering cells that span - $celladj['border_details']['L'] = $cbord['border_details']['R']; - } - } - // mPDF 5.7.4 - if ($celladj && $this->packTableData) { - $cells[$i + $cspi][$j + $ccolsp]['borderbin'] = $this->_packCellBorder($celladj); - } - unset($celladj); - } - } - } - // Set maximum cell border width meeting at LRTB edges of cell - used for extended cell border - // ['border_details']['mbw']['LT'] = meeting border width - Left border - Top end - if (!$table['borders_separate']) { - $cbord['border_details']['mbw']['BL'] = \max($cbord['border_details']['mbw']['BL'], $cbord['border_details']['L']['w']); - $cbord['border_details']['mbw']['BR'] = \max($cbord['border_details']['mbw']['BR'], $cbord['border_details']['R']['w']); - $cbord['border_details']['mbw']['RT'] = \max($cbord['border_details']['mbw']['RT'], $cbord['border_details']['T']['w']); - $cbord['border_details']['mbw']['RB'] = \max($cbord['border_details']['mbw']['RB'], $cbord['border_details']['B']['w']); - $cbord['border_details']['mbw']['TL'] = \max($cbord['border_details']['mbw']['TL'], $cbord['border_details']['L']['w']); - $cbord['border_details']['mbw']['TR'] = \max($cbord['border_details']['mbw']['TR'], $cbord['border_details']['R']['w']); - $cbord['border_details']['mbw']['LT'] = \max($cbord['border_details']['mbw']['LT'], $cbord['border_details']['T']['w']); - $cbord['border_details']['mbw']['LB'] = \max($cbord['border_details']['mbw']['LB'], $cbord['border_details']['B']['w']); - if ($i + $crowsp < $numrows && isset($cells[$i + $crowsp][$j])) { - // Has Bottom adjoining cell - if ($this->packTableData) { - $adjc = $cells[$i + $crowsp][$j]; - $celladj = $this->_unpackCellBorder($adjc['borderbin']); - } else { - $celladj =& $cells[$i + $crowsp][$j]; - } - $cbord['border_details']['mbw']['BL'] = \max($cbord['border_details']['mbw']['BL'], $celladj ? $celladj['border_details']['L']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['TL'] : 0); - $cbord['border_details']['mbw']['BR'] = \max($cbord['border_details']['mbw']['BR'], $celladj ? $celladj['border_details']['R']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['TR'] : 0); - $cbord['border_details']['mbw']['LB'] = \max($cbord['border_details']['mbw']['LB'], $celladj ? $celladj['border_details']['mbw']['LT'] : 0); - $cbord['border_details']['mbw']['RB'] = \max($cbord['border_details']['mbw']['RB'], $celladj ? $celladj['border_details']['mbw']['RT'] : 0); - unset($celladj); - } - if ($j + $ccolsp < $numcols && isset($cells[$i][$j + $ccolsp])) { - // Has Right adjoining cell - if ($this->packTableData) { - $adjc = $cells[$i][$j + $ccolsp]; - $celladj = $this->_unpackCellBorder($adjc['borderbin']); - } else { - $celladj =& $cells[$i][$j + $ccolsp]; - } - $cbord['border_details']['mbw']['RT'] = \max($cbord['border_details']['mbw']['RT'], $celladj ? $celladj['border_details']['T']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['LT'] : 0); - $cbord['border_details']['mbw']['RB'] = \max($cbord['border_details']['mbw']['RB'], $celladj ? $celladj['border_details']['B']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['LB'] : 0); - $cbord['border_details']['mbw']['TR'] = \max($cbord['border_details']['mbw']['TR'], $celladj ? $celladj['border_details']['mbw']['TL'] : 0); - $cbord['border_details']['mbw']['BR'] = \max($cbord['border_details']['mbw']['BR'], $celladj ? $celladj['border_details']['mbw']['BL'] : 0); - unset($celladj); - } - if ($i > 0 && isset($cells[$i - 1][$j]) && \is_array($cells[$i - 1][$j]) && ($this->packTableData && $cells[$i - 1][$j]['borderbin'] || $cells[$i - 1][$j]['border'])) { - // Has Top adjoining cell - if ($this->packTableData) { - $adjc = $cells[$i - 1][$j]; - $celladj = $this->_unpackCellBorder($adjc['borderbin']); - } else { - $celladj =& $cells[$i - 1][$j]; - } - $cbord['border_details']['mbw']['TL'] = \max($cbord['border_details']['mbw']['TL'], $celladj ? $celladj['border_details']['L']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['BL'] : 0); - $cbord['border_details']['mbw']['TR'] = \max($cbord['border_details']['mbw']['TR'], $celladj ? $celladj['border_details']['R']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['BR'] : 0); - $cbord['border_details']['mbw']['LT'] = \max($cbord['border_details']['mbw']['LT'], $celladj ? $celladj['border_details']['mbw']['LB'] : 0); - $cbord['border_details']['mbw']['RT'] = \max($cbord['border_details']['mbw']['RT'], $celladj ? $celladj['border_details']['mbw']['RB'] : 0); - if ($celladj['border_details']['mbw']['BL']) { - $celladj['border_details']['mbw']['BL'] = \max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['mbw']['BL']); - } - if ($celladj['border_details']['mbw']['BR']) { - $celladj['border_details']['mbw']['BR'] = \max($celladj['border_details']['mbw']['BR'], $cbord['border_details']['mbw']['TR']); - } - if ($this->packTableData) { - $cells[$i - 1][$j]['borderbin'] = $this->_packCellBorder($celladj); - } - unset($celladj); - } - if ($j > 0 && isset($cells[$i][$j - 1]) && \is_array($cells[$i][$j - 1]) && ($this->packTableData && $cells[$i][$j - 1]['borderbin'] || $cells[$i][$j - 1]['border'])) { - // Has Left adjoining cell - if ($this->packTableData) { - $adjc = $cells[$i][$j - 1]; - $celladj = $this->_unpackCellBorder($adjc['borderbin']); - } else { - $celladj =& $cells[$i][$j - 1]; - } - $cbord['border_details']['mbw']['LT'] = \max($cbord['border_details']['mbw']['LT'], $celladj ? $celladj['border_details']['T']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['RT'] : 0); - $cbord['border_details']['mbw']['LB'] = \max($cbord['border_details']['mbw']['LB'], $celladj ? $celladj['border_details']['B']['w'] : 0, $celladj ? $celladj['border_details']['mbw']['RB'] : 0); - $cbord['border_details']['mbw']['BL'] = \max($cbord['border_details']['mbw']['BL'], $celladj ? $celladj['border_details']['mbw']['BR'] : 0); - $cbord['border_details']['mbw']['TL'] = \max($cbord['border_details']['mbw']['TL'], $celladj ? $celladj['border_details']['mbw']['TR'] : 0); - if ($celladj['border_details']['mbw']['RT']) { - $celladj['border_details']['mbw']['RT'] = \max($celladj['border_details']['mbw']['RT'], $cbord['border_details']['mbw']['LT']); - } - if ($celladj['border_details']['mbw']['RB']) { - $celladj['border_details']['mbw']['RB'] = \max($celladj['border_details']['mbw']['RB'], $cbord['border_details']['mbw']['LB']); - } - if ($this->packTableData) { - $cells[$i][$j - 1]['borderbin'] = $this->_packCellBorder($celladj); - } - unset($celladj); - } - // Update maximum cell border width at LRTB edges of table - used for overall table width - if ($j == 0 && $cbord['border_details']['L']['w']) { - $table['max_cell_border_width']['L'] = \max($table['max_cell_border_width']['L'], $cbord['border_details']['L']['w']); - } - if (($j == $numcols - 1 || $j + $ccolsp == $numcols) && $cbord['border_details']['R']['w']) { - $table['max_cell_border_width']['R'] = \max($table['max_cell_border_width']['R'], $cbord['border_details']['R']['w']); - } - if ($i == 0 && $cbord['border_details']['T']['w']) { - $table['max_cell_border_width']['T'] = \max($table['max_cell_border_width']['T'], $cbord['border_details']['T']['w']); - } - if (($i == $numrows - 1 || $i + $crowsp == $numrows) && $cbord['border_details']['B']['w']) { - $table['max_cell_border_width']['B'] = \max($table['max_cell_border_width']['B'], $cbord['border_details']['B']['w']); - } - } - /* -- END TABLES-ADVANCED-BORDERS -- */ - if ($this->packTableData) { - $cell['borderbin'] = $this->_packCellBorder($cbord); - } - unset($cbord); - unset($cell); - } - } - } - unset($cell); - } - // END FIX BORDERS ************************************************************************************ - function _reverseTableDir(&$table) - { - $cells =& $table['cells']; - $numcols = $table['nc']; - $numrows = $table['nr']; - for ($i = 0; $i < $numrows; $i++) { - // Rows - $row = []; - for ($j = $numcols - 1; $j >= 0; $j--) { - // Columns - if (isset($cells[$i][$j]) && $cells[$i][$j]) { - $cell =& $cells[$i][$j]; - $col = $numcols - $j - 1; - if (isset($cell['colspan']) && $cell['colspan'] > 1) { - $col -= $cell['colspan'] - 1; - } - // Nested content - if (isset($cell['textbuffer'])) { - for ($n = 0; $n < \count($cell['textbuffer']); $n++) { - $t = $cell['textbuffer'][$n][0]; - if (\substr($t, 0, 19) == Mpdf::OBJECT_IDENTIFIER . "type=nestedtable") { - $objattr = $this->_getObjAttr($t); - $objattr['col'] = $col; - $cell['textbuffer'][$n][0] = Mpdf::OBJECT_IDENTIFIER . "type=nestedtable,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - $this->table[$this->tableLevel + 1][$objattr['nestedcontent']]['nestedpos'][1] = $col; - } - } - } - $row[$col] = $cells[$i][$j]; - unset($cell); - } - } - for ($f = 0; $f < $numcols; $f++) { - if (!isset($row[$f])) { - $row[$f] = 0; - } - } - $table['cells'][$i] = $row; - } - } - function _tableWrite(&$table, $split = \false, $startrow = 0, $startcol = 0, $splitpg = 0, $rety = 0) - { - $level = $table['level']; - $levelid = $table['levelid']; - $cells =& $table['cells']; - $numcols = $table['nc']; - $numrows = $table['nr']; - $maxbwtop = 0; - if ($this->ColActive && $level == 1) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - if (!$split || $startrow == 0 && $splitpg == 0 || $startrow > 0) { - // TABLE TOP MARGIN - if ($table['margin']['T']) { - if (!$this->table_rotate && $level == 1) { - $this->DivLn($table['margin']['T'], $this->blklvl, \true, 1); - // collapsible - } else { - $this->y += $table['margin']['T']; - } - } - // Advance down page by half width of top border - if ($table['borders_separate']) { - if ($startrow > 0 && (!isset($table['is_thead']) || \count($table['is_thead']) == 0)) { - $adv = $table['border_spacing_V'] / 2; - } else { - $adv = $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; - } - } else { - $adv = $table['max_cell_border_width']['T'] / 2; - } - if (!$this->table_rotate && $level == 1) { - $this->DivLn($adv); - } else { - $this->y += $adv; - } - } - if ($level == 1) { - $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; - $x0 = $this->x; - $y0 = $this->y; - $right = $x0 + $this->blk[$this->blklvl]['inner_width']; - $outerfilled = $this->y; - // Keep track of how far down the outer DIV bgcolor is painted (NB rowspans) - $this->outerfilled = $this->y; - $this->colsums = []; - } else { - $x0 = $this->x; - $y0 = $this->y; - $right = $x0 + $table['w']; - } - if ($this->table_rotate) { - $temppgwidth = $this->tbrot_maxw; - $this->PageBreakTrigger = $pagetrigger = $y0 + $this->blk[$this->blklvl]['inner_width']; - if ($level == 1) { - $this->tbrot_y0 = $this->y - $adv - $table['margin']['T']; - $this->tbrot_x0 = $this->x; - $this->tbrot_w = $table['w']; - if ($table['borders_separate']) { - $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; - } else { - $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['max_cell_border_width']['T']; - } - } - } else { - $this->PageBreakTrigger = $pagetrigger = $this->h - $this->bMargin; - if ($level == 1) { - $temppgwidth = $this->blk[$this->blklvl]['inner_width']; - if (isset($table['a']) and $table['w'] < $this->blk[$this->blklvl]['inner_width']) { - if ($table['a'] == 'C') { - $x0 += ($right - $x0 - $table['w']) / 2; - } elseif ($table['a'] == 'R') { - $x0 = $right - $table['w']; - } - } - } else { - $temppgwidth = $table['w']; - } - } - if (!isset($table['overflow'])) { - $table['overflow'] = null; - } - if ($table['overflow'] == 'hidden' && $level == 1 && !$this->table_rotate && !$this->ColActive) { - // Bounding rectangle to clip - $this->tableClipPath = \sprintf('q %.3F %.3F %.3F %.3F re W n', $x0 * Mpdf::SCALE, $this->h * Mpdf::SCALE, $this->blk[$this->blklvl]['inner_width'] * Mpdf::SCALE, -$this->h * Mpdf::SCALE); - $this->writer->write($this->tableClipPath); - } else { - $this->tableClipPath = ''; - } - if ($table['borders_separate']) { - $indent = $table['margin']['L'] + $table['border_details']['L']['w'] + $table['padding']['L'] + $table['border_spacing_H'] / 2; - } else { - $indent = $table['margin']['L'] + $table['max_cell_border_width']['L'] / 2; - } - $x0 += $indent; - $returny = 0; - $lastCol = 0; - $tableheader = []; - $tablefooter = []; - $tableheaderrowheight = 0; - $tablefooterrowheight = 0; - $footery = 0; - // mPD 3.0 Set the Page & Column where table starts - if ($this->mirrorMargins && $this->page % 2 == 0) { - // EVEN - $tablestartpage = 'EVEN'; - } elseif ($this->mirrorMargins && $this->page % 2 == 1) { - // ODD - $tablestartpage = 'ODD'; - } else { - $tablestartpage = ''; - } - if ($this->ColActive) { - $tablestartcolumn = $this->CurrCol; - } else { - $tablestartcolumn = ''; - } - $y = $h = 0; - for ($i = 0; $i < $numrows; $i++) { - // Rows - if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i] && $level == 1) { - $tablefooterrowheight += $table['hr'][$i]; - $tablefooter[$i][0]['trbackground-images'] = $table['trbackground-images'][$i]; - $tablefooter[$i][0]['trgradients'] = $table['trgradients'][$i]; - $tablefooter[$i][0]['trbgcolor'] = $table['bgcolor'][$i]; - for ($j = $startcol; $j < $numcols; $j++) { - // Columns - if (isset($cells[$i][$j]) && $cells[$i][$j]) { - $cell =& $cells[$i][$j]; - if ($split) { - if ($table['colPg'][$j] != $splitpg) { - continue; - } - list($x, $w) = $this->_splitTableGetWidth($table, $i, $j); - $js = $j - $startcol; - } else { - list($x, $w) = $this->_tableGetWidth($table, $i, $j); - $js = $j; - } - list($y, $h) = $this->_tableGetHeight($table, $i, $j); - $x += $x0; - $y += $y0; - // Get info of tfoot ==>> table footer - $tablefooter[$i][$js]['x'] = $x; - $tablefooter[$i][$js]['y'] = $y; - $tablefooter[$i][$js]['h'] = $h; - $tablefooter[$i][$js]['w'] = $w; - if (isset($cell['textbuffer'])) { - $tablefooter[$i][$js]['textbuffer'] = $cell['textbuffer']; - } else { - $tablefooter[$i][$js]['textbuffer'] = ''; - } - $tablefooter[$i][$js]['a'] = $cell['a']; - $tablefooter[$i][$js]['R'] = $cell['R']; - $tablefooter[$i][$js]['va'] = $cell['va']; - $tablefooter[$i][$js]['mih'] = $cell['mih']; - if (isset($cell['gradient'])) { - $tablefooter[$i][$js]['gradient'] = $cell['gradient']; - // *BACKGROUNDS* - } - if (isset($cell['background-image'])) { - $tablefooter[$i][$js]['background-image'] = $cell['background-image']; - // *BACKGROUNDS* - } - // CELL FILL BGCOLOR - if (!$this->simpleTables) { - if ($this->packTableData) { - $c = $this->_unpackCellBorder($cell['borderbin']); - $tablefooter[$i][$js]['border'] = $c['border']; - $tablefooter[$i][$js]['border_details'] = $c['border_details']; - } else { - $tablefooter[$i][$js]['border'] = $cell['border']; - $tablefooter[$i][$js]['border_details'] = $cell['border_details']; - } - } elseif ($this->simpleTables) { - $tablefooter[$i][$js]['border'] = $table['simple']['border']; - $tablefooter[$i][$js]['border_details'] = $table['simple']['border_details']; - } - $tablefooter[$i][$js]['bgcolor'] = $cell['bgcolor']; - $tablefooter[$i][$js]['padding'] = $cell['padding']; - if (isset($cell['rowspan'])) { - $tablefooter[$i][$js]['rowspan'] = $cell['rowspan']; - } - if (isset($cell['colspan'])) { - $tablefooter[$i][$js]['colspan'] = $cell['colspan']; - } - if (isset($cell['direction'])) { - $tablefooter[$i][$js]['direction'] = $cell['direction']; - } - if (isset($cell['cellLineHeight'])) { - $tablefooter[$i][$js]['cellLineHeight'] = $cell['cellLineHeight']; - } - if (isset($cell['cellLineStackingStrategy'])) { - $tablefooter[$i][$js]['cellLineStackingStrategy'] = $cell['cellLineStackingStrategy']; - } - if (isset($cell['cellLineStackingShift'])) { - $tablefooter[$i][$js]['cellLineStackingShift'] = $cell['cellLineStackingShift']; - } - } - } - } - } - if ($level == 1) { - $this->writer->write('___TABLE___BACKGROUNDS' . $this->uniqstr); - } - $tableheaderadj = 0; - $tablefooteradj = 0; - $tablestartpageno = $this->page; - // Draw Table Contents and Borders - for ($i = 0; $i < $numrows; $i++) { - // Rows - if ($split && $startrow > 0) { - $thnr = isset($table['is_thead']) ? \count($table['is_thead']) : 0; - if ($i >= $thnr && $i < $startrow) { - continue; - } - if ($i == $startrow) { - $returny = $rety - $tableheaderrowheight; - } - } - // Get Maximum row/cell height in row - including rowspan>1 + 1 overlapping - $maxrowheight = $this->_tableGetMaxRowHeight($table, $i); - $skippage = \false; - $newpagestarted = \false; - for ($j = $startcol; $j < $numcols; $j++) { - // Columns - if ($split) { - if ($table['colPg'][$j] > $splitpg) { - break; - } - $lastCol = $j; - } - if (isset($cells[$i][$j]) && $cells[$i][$j]) { - $cell =& $cells[$i][$j]; - if ($split) { - $lastCol = $j + (isset($cell['colspan']) ? $cell['colspan'] - 1 : 0); - list($x, $w) = $this->_splitTableGetWidth($table, $i, $j); - } else { - list($x, $w) = $this->_tableGetWidth($table, $i, $j); - } - list($y, $h) = $this->_tableGetHeight($table, $i, $j); - $x += $x0; - $y += $y0; - $y -= $returny; - if ($table['borders_separate']) { - if (!empty($tablefooter) || $i == $numrows - 1 || isset($cell['rowspan']) && $i + $cell['rowspan'] == $numrows || !isset($cell['rowspan']) && $i + 1 == $numrows) { - $extra = $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; - // $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; - } else { - $extra = $table['border_spacing_V'] / 2; - } - } else { - $extra = $table['max_cell_border_width']['B'] / 2; - } - if ($j == $startcol && ($y + $maxrowheight + $extra > $pagetrigger + 0.001 || ($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $y + $maxrowheight + $tablefooterrowheight + $extra > $pagetrigger && ($this->tableLevel == 1 && $i < $numrows - $table['headernrows'])) && ($y0 > 0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak) { - if (!$skippage) { - $finalSpread = \true; - $firstSpread = \true; - if ($split) { - for ($t = $startcol; $t < $numcols; $t++) { - // Are there more columns to print on a next page? - if ($table['colPg'][$t] > $splitpg) { - $finalSpread = \false; - break; - } - } - if ($startcol > 0) { - $firstSpread = \false; - } - } - if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0) { - $this->y = $y; - $ya = $this->y; - $this->TableHeaderFooter($tablefooter, $tablestartpage, $tablestartcolumn, 'F', $level, $firstSpread, $finalSpread); - if ($this->table_rotate) { - $this->tbrot_h += $this->y - $ya; - } - $tablefooteradj = $this->y - $ya; - } - $y -= $y0; - $returny += $y; - $oldcolumn = $this->CurrCol; - if ($this->AcceptPageBreak()) { - $newpagestarted = \true; - $this->y = $y + $y0; - // Move down to account for border-spacing or - // extra half border width in case page breaks in middle - if ($i > 0 && !$this->table_rotate && $level == 1 && !$this->ColActive) { - if ($table['borders_separate']) { - $adv = $table['border_spacing_V'] / 2; - // If table footer - if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0) { - $adv += $table['padding']['B'] + $table['border_details']['B']['w']; - } - } else { - $maxbwtop = 0; - $maxbwbottom = 0; - if (!$this->simpleTables) { - if (!empty($tablefooter)) { - $maxbwbottom = $table['max_cell_border_width']['B']; - } else { - $brow = $i - 1; - for ($ctj = 0; $ctj < $numcols; $ctj++) { - if (isset($cells[$brow][$ctj]) && $cells[$brow][$ctj]) { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cells[$brow][$ctj]['borderbin']); - } else { - $bb = $cells[$brow][$ctj]['border_details']['B']['w']; - } - $maxbwbottom = \max($maxbwbottom, $bb); - } - } - } - if (!empty($tableheader)) { - $maxbwtop = $table['max_cell_border_width']['T']; - } else { - $trow = $i - 1; - for ($ctj = 0; $ctj < $numcols; $ctj++) { - if (isset($cells[$trow][$ctj]) && $cells[$trow][$ctj]) { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cells[$trow][$ctj]['borderbin']); - } else { - $bt = $cells[$trow][$ctj]['border_details']['T']['w']; - } - $maxbwtop = \max($maxbwtop, $bt); - } - } - } - } elseif ($this->simpleTables) { - $maxbwtop = $table['simple']['border_details']['T']['w']; - $maxbwbottom = $table['simple']['border_details']['B']['w']; - } - $adv = $maxbwbottom / 2; - } - $this->y += $adv; - } - // Rotated table split over pages - needs this->y for borders/backgrounds - if ($i > 0 && $this->table_rotate && $level == 1) { - // $this->y = $y0 + $this->tbrot_w; - } - if ($this->tableClipPath) { - $this->writer->write("Q"); - } - $bx = $x0; - $by = $y0; - if ($table['borders_separate']) { - $bx -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H'] / 2; - if ($tablestartpageno != $this->page) { - // IF already broken across a previous pagebreak - $by += $table['max_cell_border_width']['T'] / 2; - if (empty($tableheader)) { - $by -= $table['border_spacing_V'] / 2; - } - } else { - $by -= $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; - } - } elseif ($tablestartpageno != $this->page && !empty($tableheader)) { - $by += $maxbwtop / 2; - } - $by -= $tableheaderadj; - $bh = $this->y - $by + $tablefooteradj; - if (!$table['borders_separate']) { - $bh -= $adv; - } - if ($split) { - $bw = 0; - for ($t = $startcol; $t < $numcols; $t++) { - if ($table['colPg'][$t] == $splitpg) { - $bw += $table['wc'][$t]; - } - if ($table['colPg'][$t] > $splitpg) { - break; - } - } - if ($table['borders_separate']) { - if ($firstSpread) { - $bw += $table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']; - } else { - $bx += $table['padding']['L'] + $table['border_details']['L']['w']; - $bw += $table['border_spacing_H']; - } - if ($finalSpread) { - $bw += $table['padding']['R'] + $table['border_details']['R']['w'] / 2 + $table['border_spacing_H']; - } - } - } else { - $bw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - } - if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tablefooter) && $i > 0 && $table['border_details']['B']['w']) { - $prevDrawColor = $this->DrawColor; - $lw = $this->LineWidth; - $this->SetLineWidth($this->splitTableBorderWidth); - $this->SetDColor($table['border_details']['B']['c']); - $this->SetLineJoin(0); - $this->SetLineCap(0); - $blx = $bx; - $blw = $bw; - if (!$table['borders_separate']) { - $blx -= $table['max_cell_border_width']['L'] / 2; - $blw += $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2; - } - $this->Line($blx, $this->y + $this->splitTableBorderWidth / 2, $blx + $blw, $this->y + $this->splitTableBorderWidth / 2); - $this->DrawColor = $prevDrawColor; - $this->writer->write($this->DrawColor); - $this->SetLineWidth($lw); - $this->SetLineJoin(2); - $this->SetLineCap(2); - } - if (!$this->ColActive && ($i > 0 || $j > 0)) { - if (isset($table['bgcolor'][-1])) { - $color = $this->colorConverter->convert($table['bgcolor'][-1], $this->PDFAXwarnings); - if ($color) { - if (!$table['borders_separate']) { - $bh -= $table['max_cell_border_width']['B'] / 2; - } - $this->tableBackgrounds[$level * 9][] = ['gradient' => \false, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'col' => $color]; - } - } - /* -- BACKGROUNDS -- */ - if (isset($table['gradient'])) { - $g = $this->gradient->parseBackgroundGradient($table['gradient']); - if ($g) { - $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => \true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - if (isset($table['background-image'])) { - if ($table['background-image']['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'])) { - $g = $this->gradient->parseMozGradient($table['background-image']['gradient']); - if ($g) { - $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => \true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } else { - $image_id = $table['background-image']['image_id']; - $orig_w = $table['background-image']['orig_w']; - $orig_h = $table['background-image']['orig_h']; - $x_pos = $table['background-image']['x_pos']; - $y_pos = $table['background-image']['y_pos']; - $x_repeat = $table['background-image']['x_repeat']; - $y_repeat = $table['background-image']['y_repeat']; - $resize = $table['background-image']['resize']; - $opacity = $table['background-image']['opacity']; - $itype = $table['background-image']['itype']; - $this->tableBackgrounds[$level * 9 + 2][] = ['x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } - } - /* -- END BACKGROUNDS -- */ - } - // $this->AcceptPageBreak() has moved tablebuffer to $this->pages content - if ($this->tableBackgrounds) { - $s = $this->PrintTableBackgrounds(); - if ($this->bufferoutput) { - $this->headerbuffer = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->headerbuffer); - $this->headerbuffer = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->headerbuffer); - } else { - $this->pages[$this->page] = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); - $this->pages[$this->page] = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->pages[$this->page]); - } - $this->tableBackgrounds = []; - } - if ($split) { - if ($i == 0 && $j == 0) { - $y0 = -1; - } elseif ($finalSpread) { - $splitpg = 0; - $startcol = 0; - $startrow = $i; - } else { - $splitpg++; - $startcol = $t; - $returny -= $y; - } - return [\false, $startrow, $startcol, $splitpg, $returny, $y0]; - } - $this->AddPage($this->CurOrientation); - $this->writer->write('___TABLE___BACKGROUNDS' . $this->uniqstr); - if ($this->tableClipPath) { - $this->writer->write($this->tableClipPath); - } - // Added to correct for OddEven Margins - $x = $x + $this->MarginCorrection; - $x0 = $x0 + $this->MarginCorrection; - if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tableheader) && $i > 0 && $table['border_details']['T']['w']) { - $prevDrawColor = $this->DrawColor; - $lw = $this->LineWidth; - $this->SetLineWidth($this->splitTableBorderWidth); - $this->SetDColor($table['border_details']['T']['c']); - $this->SetLineJoin(0); - $this->SetLineCap(0); - $blx += $this->MarginCorrection; - $this->Line($blx, $this->y - $this->splitTableBorderWidth / 2, $blx + $blw, $this->y - $this->splitTableBorderWidth / 2); - $this->DrawColor = $prevDrawColor; - $this->writer->write($this->DrawColor); - $this->SetLineWidth($lw); - $this->SetLineJoin(2); - $this->SetLineCap(2); - } - // Move down to account for half of top border-spacing or - // extra half border width in case page was broken in middle - if ($i > 0 && !$this->table_rotate && $level == 1 && $table['headernrows'] == 0) { - if ($table['borders_separate']) { - $adv = $table['border_spacing_V'] / 2; - } else { - $maxbwtop = 0; - for ($ctj = 0; $ctj < $numcols; $ctj++) { - if (isset($cells[$i][$ctj]) && $cells[$i][$ctj]) { - if (!$this->simpleTables) { - if ($this->packTableData) { - list($bt, $br, $bb, $bl) = $this->_getBorderWidths($cells[$i][$ctj]['borderbin']); - } else { - $bt = $cells[$i][$ctj]['border_details']['T']['w']; - } - $maxbwtop = \max($maxbwtop, $bt); - } elseif ($this->simpleTables) { - $maxbwtop = \max($maxbwtop, $table['simple']['border_details']['T']['w']); - } - } - } - $adv = $maxbwtop / 2; - } - $this->y += $adv; - } - if ($this->table_rotate) { - $this->tbrot_x0 = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; - if ($table['borders_separate']) { - $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; - } else { - $this->tbrot_h = $table['margin']['T'] + $table['max_cell_border_width']['T']; - } - $this->tbrot_y0 = $this->y; - $pagetrigger = $y0 - $tableheaderadj + $this->blk[$this->blklvl]['inner_width']; - } else { - $pagetrigger = $this->PageBreakTrigger; - } - if ($this->kwt_saved && $level == 1) { - $this->kwt_moved = \true; - } - if (!empty($tableheader)) { - $ya = $this->y; - $this->TableHeaderFooter($tableheader, $tablestartpage, $tablestartcolumn, 'H', $level); - if ($this->table_rotate) { - $this->tbrot_h = $this->y - $ya; - } - $tableheaderadj = $this->y - $ya; - } elseif ($i == 0 && !$this->table_rotate && $level == 1 && !$this->ColActive) { - // Advance down page - if ($table['borders_separate']) { - $adv = $table['border_spacing_V'] / 2 + $table['border_details']['T']['w'] + $table['padding']['T']; - } else { - $adv = $table['max_cell_border_width']['T'] / 2; - } - if ($adv) { - if ($this->table_rotate) { - $this->y += $adv; - } else { - $this->DivLn($adv, $this->blklvl, \true); - } - } - } - $outerfilled = 0; - $y = $y0 = $this->y; - } - /* -- COLUMNS -- */ - // COLS - // COLUMN CHANGE - if ($this->CurrCol != $oldcolumn) { - // Added to correct for Columns - $x += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - $x0 += $this->ChangeColumn * ($this->ColWidth + $this->ColGap); - if ($this->CurrCol == 0) { - // just added a page - possibly with tableheader - $y0 = $this->y; - // this->y0 is global used by Columns - $y0 is internal to tablewrite - } else { - $y0 = $this->y0; - // this->y0 is global used by Columns - $y0 is internal to tablewrite - } - $y = $y0; - $outerfilled = 0; - if ($this->CurrCol != 0 && ($this->keepColumns && $this->ColActive) && !empty($tableheader) && $i > 0) { - $this->x = $x; - $this->y = $y; - $this->TableHeaderFooter($tableheader, $tablestartpage, $tablestartcolumn, 'H', $level); - $y0 = $y = $this->y; - } - } - /* -- END COLUMNS -- */ - } - $skippage = \true; - } - $this->x = $x; - $this->y = $y; - if ($this->kwt_saved && $level == 1) { - $this->printkwtbuffer(); - $x0 = $x = $this->x; - $y0 = $y = $this->y; - $this->kwt_moved = \false; - $this->kwt_saved = \false; - } - // Set the Page & Column where table actually starts - if ($i == 0 && $j == 0 && $level == 1) { - if ($this->mirrorMargins && $this->page % 2 == 0) { - // EVEN - $tablestartpage = 'EVEN'; - } elseif ($this->mirrorMargins && $this->page % 2 == 1) { - // ODD - $tablestartpage = 'ODD'; - } else { - $tablestartpage = ''; - } - $tablestartpageno = $this->page; - if ($this->ColActive) { - $tablestartcolumn = $this->CurrCol; - } - // *COLUMNS* - } - // ALIGN - $align = $cell['a']; - /* -- COLUMNS -- */ - // If outside columns, this is done in PaintDivBB - if ($this->ColActive) { - // OUTER FILL BGCOLOR of DIVS - if ($this->blklvl > 0 && $j == 0 && !$this->table_rotate && $level == 1) { - $firstblockfill = $this->GetFirstBlockFill(); - if ($firstblockfill && $this->blklvl >= $firstblockfill) { - $divh = $maxrowheight; - // Last row - if (!isset($cell['rowspan']) && $i == $numrows - 1 || isset($cell['rowspan']) && ($i == $numrows - 1 && $cell['rowspan'] < 2 || $cell['rowspan'] > 1 && $i + $cell['rowspan'] - 1 == $numrows - 1)) { - if ($table['borders_separate']) { - $adv = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; - } else { - $adv = $table['margin']['B'] + $table['max_cell_border_width']['B'] / 2; - } - $divh += $adv; - // last row: fill bottom half of bottom border (y advanced at end) - } - if ($this->y + $divh > $outerfilled) { - // if not already painted by previous rowspan - $bak_x = $this->x; - $bak_y = $this->y; - if ($outerfilled > $this->y) { - $divh = $this->y + $divh - $outerfilled; - $this->y = $outerfilled; - } - $this->DivLn($divh, -3, \false); - $outerfilled = $this->y + $divh; - // Reset current block fill - $bcor = $this->blk[$this->blklvl]['bgcolorarray']; - if ($bcor) { - $this->SetFColor($bcor); - } - $this->x = $bak_x; - $this->y = $bak_y; - } - } - } - } - // TABLE BACKGROUND FILL BGCOLOR - for cellSpacing - if ($this->ColActive) { - if ($table['borders_separate']) { - $fill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; - if ($fill) { - $color = $this->colorConverter->convert($fill, $this->PDFAXwarnings); - if ($color) { - $xadj = $table['border_spacing_H'] / 2; - $yadj = $table['border_spacing_V'] / 2; - $wadj = $table['border_spacing_H']; - $hadj = $table['border_spacing_V']; - if ($i == 0) { - // Top - $yadj += $table['padding']['T'] + $table['border_details']['T']['w']; - $hadj += $table['padding']['T'] + $table['border_details']['T']['w']; - } - if ($j == 0) { - // Left - $xadj += $table['padding']['L'] + $table['border_details']['L']['w']; - $wadj += $table['padding']['L'] + $table['border_details']['L']['w']; - } - if ($i == $numrows - 1 || isset($cell['rowspan']) && $i + $cell['rowspan'] == $numrows || !isset($cell['rowspan']) && $i + 1 == $numrows) { - // Bottom - $hadj += $table['padding']['B'] + $table['border_details']['B']['w']; - } - if ($j == $numcols - 1 || isset($cell['colspan']) && $j + $cell['colspan'] == $numcols || !isset($cell['colspan']) && $j + 1 == $numcols) { - // Right - $wadj += $table['padding']['R'] + $table['border_details']['R']['w']; - } - $this->SetFColor($color); - $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); - } - } - } - } - /* -- END COLUMNS -- */ - if ($table['empty_cells'] != 'hide' || !empty($cell['textbuffer']) || isset($cell['nestedcontent']) && $cell['nestedcontent'] || !$table['borders_separate']) { - $paintcell = \true; - } else { - $paintcell = \false; - } - // Set Borders - $bord = 0; - $bord_det = []; - if (!$this->simpleTables) { - if ($this->packTableData) { - $c = $this->_unpackCellBorder($cell['borderbin']); - $bord = $c['border']; - $bord_det = $c['border_details']; - } else { - $bord = $cell['border']; - $bord_det = $cell['border_details']; - } - } elseif ($this->simpleTables) { - $bord = $table['simple']['border']; - $bord_det = $table['simple']['border_details']; - } - // TABLE ROW OR CELL FILL BGCOLOR - $fill = 0; - if (isset($cell['bgcolor']) && $cell['bgcolor'] && $cell['bgcolor'] != 'transparent') { - $fill = $cell['bgcolor']; - $leveladj = 6; - } elseif (isset($table['bgcolor'][$i]) && $table['bgcolor'][$i] && $table['bgcolor'][$i] != 'transparent') { - // Row color - $fill = $table['bgcolor'][$i]; - $leveladj = 3; - } - if ($fill && $paintcell) { - $color = $this->colorConverter->convert($fill, $this->PDFAXwarnings); - if ($color) { - if ($table['borders_separate']) { - if ($this->ColActive) { - $this->SetFColor($color); - $this->Rect($x + $table['border_spacing_H'] / 2, $y + $table['border_spacing_V'] / 2, $w - $table['border_spacing_H'], $h - $table['border_spacing_V'], 'F'); - } else { - $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => \false, 'x' => $x + $table['border_spacing_H'] / 2, 'y' => $y + $table['border_spacing_V'] / 2, 'w' => $w - $table['border_spacing_H'], 'h' => $h - $table['border_spacing_V'], 'col' => $color]; - } - } else { - if ($this->ColActive) { - $this->SetFColor($color); - $this->Rect($x, $y, $w, $h, 'F'); - } else { - $this->tableBackgrounds[$level * 9 + $leveladj][] = ['gradient' => \false, 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'col' => $color]; - } - } - } - } - /* -- BACKGROUNDS -- */ - if (isset($cell['gradient']) && $cell['gradient'] && $paintcell) { - $g = $this->gradient->parseBackgroundGradient($cell['gradient']); - if ($g) { - if ($table['borders_separate']) { - $px = $x + $table['border_spacing_H'] / 2; - $py = $y + $table['border_spacing_V'] / 2; - $pw = $w - $table['border_spacing_H']; - $ph = $h - $table['border_spacing_V']; - } else { - $px = $x; - $py = $y; - $pw = $w; - $ph = $h; - } - if ($this->ColActive) { - $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); - } else { - $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => \true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } - if (isset($cell['background-image']) && $paintcell) { - if (isset($cell['background-image']['gradient']) && $cell['background-image']['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $cell['background-image']['gradient'])) { - $g = $this->gradient->parseMozGradient($cell['background-image']['gradient']); - if ($g) { - if ($table['borders_separate']) { - $px = $x + $table['border_spacing_H'] / 2; - $py = $y + $table['border_spacing_V'] / 2; - $pw = $w - $table['border_spacing_H']; - $ph = $h - $table['border_spacing_V']; - } else { - $px = $x; - $py = $y; - $pw = $w; - $ph = $h; - } - if ($this->ColActive) { - $this->gradient->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); - } else { - $this->tableBackgrounds[$level * 9 + 7][] = ['gradient' => \true, 'x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } elseif (isset($cell['background-image']['image_id']) && $cell['background-image']['image_id']) { - // Background pattern - $n = \count($this->patterns) + 1; - if ($table['borders_separate']) { - $px = $x + $table['border_spacing_H'] / 2; - $py = $y + $table['border_spacing_V'] / 2; - $pw = $w - $table['border_spacing_H']; - $ph = $h - $table['border_spacing_V']; - } else { - $px = $x; - $py = $y; - $pw = $w; - $ph = $h; - } - if ($this->ColActive) { - list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($cell['background-image']['orig_w'], $cell['background-image']['orig_h'], $pw, $ph, $cell['background-image']['resize'], $cell['background-image']['x_repeat'], $cell['background-image']['y_repeat']); - $this->patterns[$n] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'pgh' => $this->h, 'image_id' => $cell['background-image']['image_id'], 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $cell['background-image']['x_pos'], 'y_pos' => $cell['background-image']['y_pos'], 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat]; - if ($cell['background-image']['opacity'] > 0 && $cell['background-image']['opacity'] < 1) { - $opac = $this->SetAlpha($cell['background-image']['opacity'], 'Normal', \true); - } else { - $opac = ''; - } - $this->writer->write(\sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px * Mpdf::SCALE, ($this->h - $py) * Mpdf::SCALE, $pw * Mpdf::SCALE, -$ph * Mpdf::SCALE)); - } else { - $image_id = $cell['background-image']['image_id']; - $orig_w = $cell['background-image']['orig_w']; - $orig_h = $cell['background-image']['orig_h']; - $x_pos = $cell['background-image']['x_pos']; - $y_pos = $cell['background-image']['y_pos']; - $x_repeat = $cell['background-image']['x_repeat']; - $y_repeat = $cell['background-image']['y_repeat']; - $resize = $cell['background-image']['resize']; - $opacity = $cell['background-image']['opacity']; - $itype = $cell['background-image']['itype']; - $this->tableBackgrounds[$level * 9 + 8][] = ['x' => $px, 'y' => $py, 'w' => $pw, 'h' => $ph, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } - } - } - /* -- END BACKGROUNDS -- */ - if (isset($cell['colspan']) && $cell['colspan'] > 1) { - $ccolsp = $cell['colspan']; - } else { - $ccolsp = 1; - } - if (isset($cell['rowspan']) && $cell['rowspan'] > 1) { - $crowsp = $cell['rowspan']; - } else { - $crowsp = 1; - } - // but still need to do this for repeated headers... - if (!$table['borders_separate'] && $this->tabletheadjustfinished && !$this->simpleTables) { - if (isset($table['topntail']) && $table['topntail']) { - $bord_det['T'] = $this->border_details($table['topntail']); - $bord_det['T']['w'] /= $this->shrin_k; - $this->setBorder($bord, Border::TOP); - } - if (isset($table['thead-underline']) && $table['thead-underline']) { - $bord_det['T'] = $this->border_details($table['thead-underline']); - $bord_det['T']['w'] /= $this->shrin_k; - $this->setBorder($bord, Border::TOP); - } - } - // Get info of first row ==>> table header - // Use > 1 row if THEAD - if (isset($table['is_thead'][$i]) && $table['is_thead'][$i] && $level == 1) { - if ($j == 0) { - $tableheaderrowheight += $table['hr'][$i]; - } - $tableheader[$i][0]['trbackground-images'] = isset($table['trbackground-images'][$i]) ? $table['trbackground-images'][$i] : null; - $tableheader[$i][0]['trgradients'] = isset($table['trgradients'][$i]) ? $table['trgradients'][$i] : null; - $tableheader[$i][0]['trbgcolor'] = isset($table['bgcolor'][$i]) ? $table['bgcolor'][$i] : null; - $tableheader[$i][$j]['x'] = $x; - $tableheader[$i][$j]['y'] = $y; - $tableheader[$i][$j]['h'] = $h; - $tableheader[$i][$j]['w'] = $w; - if (isset($cell['textbuffer'])) { - $tableheader[$i][$j]['textbuffer'] = $cell['textbuffer']; - } else { - $tableheader[$i][$j]['textbuffer'] = ''; - } - $tableheader[$i][$j]['a'] = $cell['a']; - $tableheader[$i][$j]['R'] = $cell['R']; - $tableheader[$i][$j]['va'] = $cell['va']; - $tableheader[$i][$j]['mih'] = $cell['mih']; - $tableheader[$i][$j]['gradient'] = isset($cell['gradient']) ? $cell['gradient'] : null; - // *BACKGROUNDS* - $tableheader[$i][$j]['background-image'] = isset($cell['background-image']) ? $cell['background-image'] : null; - // *BACKGROUNDS* - $tableheader[$i][$j]['rowspan'] = isset($cell['rowspan']) ? $cell['rowspan'] : null; - $tableheader[$i][$j]['colspan'] = isset($cell['colspan']) ? $cell['colspan'] : null; - $tableheader[$i][$j]['bgcolor'] = $cell['bgcolor']; - if (!$this->simpleTables) { - $tableheader[$i][$j]['border'] = $bord; - $tableheader[$i][$j]['border_details'] = $bord_det; - } elseif ($this->simpleTables) { - $tableheader[$i][$j]['border'] = $table['simple']['border']; - $tableheader[$i][$j]['border_details'] = $table['simple']['border_details']; - } - $tableheader[$i][$j]['padding'] = $cell['padding']; - if (isset($cell['direction'])) { - $tableheader[$i][$j]['direction'] = $cell['direction']; - } - if (isset($cell['cellLineHeight'])) { - $tableheader[$i][$j]['cellLineHeight'] = $cell['cellLineHeight']; - } - if (isset($cell['cellLineStackingStrategy'])) { - $tableheader[$i][$j]['cellLineStackingStrategy'] = $cell['cellLineStackingStrategy']; - } - if (isset($cell['cellLineStackingShift'])) { - $tableheader[$i][$j]['cellLineStackingShift'] = $cell['cellLineStackingShift']; - } - } - // CELL BORDER - if ($bord) { - if ($table['borders_separate'] && $paintcell) { - $this->_tableRect($x + $table['border_spacing_H'] / 2 + $bord_det['L']['w'] / 2, $y + $table['border_spacing_V'] / 2 + $bord_det['T']['w'] / 2, $w - $table['border_spacing_H'] - $bord_det['L']['w'] / 2 - $bord_det['R']['w'] / 2, $h - $table['border_spacing_V'] - $bord_det['T']['w'] / 2 - $bord_det['B']['w'] / 2, $bord, $bord_det, \false, $table['borders_separate']); - } elseif (!$table['borders_separate']) { - $this->_tableRect($x, $y, $w, $h, $bord, $bord_det, \true, $table['borders_separate']); - // true causes buffer - } - } - // VERTICAL ALIGN - if ($cell['R'] && \intval($cell['R']) > 0 && \intval($cell['R']) < 90 && isset($cell['va']) && $cell['va'] != 'B') { - $cell['va'] = 'B'; - } - if (!isset($cell['va']) || $cell['va'] == 'M') { - $this->y += ($h - $cell['mih']) / 2; - } elseif (isset($cell['va']) && $cell['va'] == 'B') { - $this->y += $h - $cell['mih']; - } - // NESTED CONTENT - // TEXT (and nested tables) - $this->divwidth = $w; - if (!empty($cell['textbuffer'])) { - $this->cellTextAlign = $align; - $this->cellLineHeight = $cell['cellLineHeight']; - $this->cellLineStackingStrategy = $cell['cellLineStackingStrategy']; - $this->cellLineStackingShift = $cell['cellLineStackingShift']; - if ($level == 1) { - if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { - if (\preg_match('/{colsum([0-9]*)[_]*}/', $cell['textbuffer'][0][0], $m)) { - $rep = \sprintf("%01." . \intval($m[1]) . "f", $this->colsums[$j]); - $cell['textbuffer'][0][0] = \preg_replace('/{colsum[0-9_]*}/', $rep, $cell['textbuffer'][0][0]); - } - } elseif (!isset($table['is_thead'][$i])) { - if (isset($this->colsums[$j])) { - $this->colsums[$j] += $this->toFloat($cell['textbuffer'][0][0]); - } else { - $this->colsums[$j] = $this->toFloat($cell['textbuffer'][0][0]); - } - } - } - $opy = $this->y; - // mPDF ITERATION - if ($this->iterationCounter) { - foreach ($cell['textbuffer'] as $k => $t) { - if (\preg_match('/{iteration ([a-zA-Z0-9_]+)}/', $t[0], $m)) { - $vname = '__' . $m[1] . '_'; - if (!isset($this->{$vname})) { - $this->{$vname} = 1; - } else { - $this->{$vname}++; - } - $cell['textbuffer'][$k][0] = \preg_replace('/{iteration ' . $m[1] . '}/', $this->{$vname}, $cell['textbuffer'][$k][0]); - } - } - } - if ($cell['R']) { - $cellPtSize = $cell['textbuffer'][0][11] / $this->shrin_k; - if (!$cellPtSize) { - $cellPtSize = $this->default_font_size; - } - $cellFontHeight = $cellPtSize / Mpdf::SCALE; - $opx = $this->x; - $angle = \intval($cell['R']); - // Only allow 45 to 89 degrees (when bottom-aligned) or exactly 90 or -90 - if ($angle > 90) { - $angle = 90; - } elseif ($angle > 0 && $angle < 45) { - $angle = 45; - } elseif ($angle < 0) { - $angle = -90; - } - $offset = \sin(\deg2rad($angle)) * 0.37 * $cellFontHeight; - if (isset($cell['a']) && $cell['a'] == 'R') { - $this->x += $w + $offset - $cellFontHeight / 3 - ($cell['padding']['R'] + $table['border_spacing_H'] / 2); - } elseif (!isset($cell['a']) || $cell['a'] == 'C') { - $this->x += $w / 2 + $offset; - } else { - $this->x += $offset + $cellFontHeight / 3 + ($cell['padding']['L'] + $table['border_spacing_H'] / 2); - } - $str = ''; - foreach ($cell['textbuffer'] as $t) { - $str .= $t[0] . ' '; - } - $str = \rtrim($str); - if (!isset($cell['va']) || $cell['va'] == 'M') { - $this->y -= ($h - $cell['mih']) / 2; - // Undo what was added earlier VERTICAL ALIGN - if ($angle > 0) { - $this->y += ($h - $cell['mih']) / 2 + $cell['padding']['T'] + ($cell['mih'] - ($cell['padding']['T'] + $cell['padding']['B'])); - } elseif ($angle < 0) { - $this->y += ($h - $cell['mih']) / 2 + ($cell['padding']['T'] + $table['border_spacing_V'] / 2); - } - } elseif (isset($cell['va']) && $cell['va'] == 'B') { - $this->y -= $h - $cell['mih']; - // Undo what was added earlier VERTICAL ALIGN - if ($angle > 0) { - $this->y += $h - ($cell['padding']['B'] + $table['border_spacing_V'] / 2); - } elseif ($angle < 0) { - $this->y += $h - $cell['mih'] + ($cell['padding']['T'] + $table['border_spacing_V'] / 2); - } - } elseif (isset($cell['va']) && $cell['va'] == 'T') { - if ($angle > 0) { - $this->y += $cell['mih'] - ($cell['padding']['B'] + $table['border_spacing_V'] / 2); - } elseif ($angle < 0) { - $this->y += $cell['padding']['T'] + $table['border_spacing_V'] / 2; - } - } - $this->Rotate($angle, $this->x, $this->y); - $s_fs = $this->FontSizePt; - $s_f = $this->FontFamily; - $s_st = $this->FontStyle; - if (!empty($cell['textbuffer'][0][3])) { - // Font Color - $cor = $cell['textbuffer'][0][3]; - $this->SetTColor($cor); - } - $this->SetFont($cell['textbuffer'][0][4], $cell['textbuffer'][0][2], $cellPtSize, \true, \true); - $this->magic_reverse_dir($str, $this->directionality, $cell['textbuffer'][0][18]); - $this->Text($this->x, $this->y, $str, $cell['textbuffer'][0][18], $cell['textbuffer'][0][8]); - // textvar - $this->Rotate(0); - $this->SetFont($s_f, $s_st, $s_fs, \true, \true); - $this->SetTColor(0); - $this->x = $opx; - } else { - if (!$this->simpleTables) { - if ($bord_det) { - $btlw = $bord_det['L']['w']; - $btrw = $bord_det['R']['w']; - $bttw = $bord_det['T']['w']; - } else { - $btlw = 0; - $btrw = 0; - $bttw = 0; - } - if ($table['borders_separate']) { - $xadj = $btlw + $cell['padding']['L'] + $table['border_spacing_H'] / 2; - $wadj = $btlw + $btrw + $cell['padding']['L'] + $cell['padding']['R'] + $table['border_spacing_H']; - $yadj = $bttw + $cell['padding']['T'] + $table['border_spacing_H'] / 2; - } else { - $xadj = $btlw / 2 + $cell['padding']['L']; - $wadj = ($btlw + $btrw) / 2 + $cell['padding']['L'] + $cell['padding']['R']; - $yadj = $bttw / 2 + $cell['padding']['T']; - } - } elseif ($this->simpleTables) { - if ($table['borders_separate']) { - // NB twice border width - $xadj = $table['simple']['border_details']['L']['w'] + $cell['padding']['L'] + $table['border_spacing_H'] / 2; - $wadj = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $cell['padding']['L'] + $cell['padding']['R'] + $table['border_spacing_H']; - $yadj = $table['simple']['border_details']['T']['w'] + $cell['padding']['T'] + $table['border_spacing_H'] / 2; - } else { - $xadj = $table['simple']['border_details']['L']['w'] / 2 + $cell['padding']['L']; - $wadj = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w']) / 2 + $cell['padding']['L'] + $cell['padding']['R']; - $yadj = $table['simple']['border_details']['T']['w'] / 2 + $cell['padding']['T']; - } - } - $this->decimal_offset = 0; - if (\substr($cell['a'], 0, 1) == 'D') { - if (isset($cell['colspan']) && $cell['colspan'] > 1) { - $this->cellTextAlign = $c['a'] = \substr($cell['a'], 2, 1); - } else { - $smax = $table['decimal_align'][$j]['maxs0']; - $d_content = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1']; - $this->decimal_offset = $smax; - $extra = $w - $d_content - $wadj; - if ($extra > 0) { - if (\substr($cell['a'], 2, 1) == 'R') { - $this->decimal_offset += $extra; - } elseif (\substr($cell['a'], 2, 1) == 'C') { - $this->decimal_offset += $extra / 2; - } - } - } - } - $this->divwidth = $w - $wadj; - if ($this->divwidth == 0) { - $this->divwidth = 0.0001; - } - $this->x += $xadj; - $this->y += $yadj; - $this->printbuffer($cell['textbuffer'], '', \true, \false, $cell['direction']); - } - $this->y = $opy; - } - /* -- BACKGROUNDS -- */ - if (!$this->ColActive) { - if (isset($table['trgradients'][$i]) && ($j == 0 || $table['borders_separate'])) { - $g = $this->gradient->parseBackgroundGradient($table['trgradients'][$i]); - if ($g) { - $gx = $x0; - $gy = $y; - $gh = $h; - $gw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - if ($table['borders_separate']) { - $gw -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']; - $clx = $x + $table['border_spacing_H'] / 2; - $cly = $y + $table['border_spacing_V'] / 2; - $clw = $w - $table['border_spacing_H']; - $clh = $h - $table['border_spacing_V']; - // Set clipping path - $s = $this->_setClippingPath($clx, $cly, $clw, $clh); - // mPDF 6 - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx + $table['border_spacing_H'] / 2, 'y' => $gy + $table['border_spacing_V'] / 2, 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; - } else { - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } - if (isset($table['trbackground-images'][$i]) && ($j == 0 || $table['borders_separate'])) { - if (isset($table['trbackground-images'][$i]['gradient']) && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['trbackground-images'][$i]['gradient'])) { - $g = $this->gradient->parseMozGradient($table['trbackground-images'][$i]['gradient']); - if ($g) { - $gx = $x0; - $gy = $y; - $gh = $h; - $gw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - if ($table['borders_separate']) { - $gw -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']; - $clx = $x + $table['border_spacing_H'] / 2; - $cly = $y + $table['border_spacing_V'] / 2; - $clw = $w - $table['border_spacing_H']; - $clh = $h - $table['border_spacing_V']; - // Set clipping path - $s = $this->_setClippingPath($clx, $cly, $clw, $clh); - // mPDF 6 - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx + $table['border_spacing_H'] / 2, 'y' => $gy + $table['border_spacing_V'] / 2, 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => $s]; - } else { - $this->tableBackgrounds[$level * 9 + 4][] = ['gradient' => \true, 'x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - } else { - $image_id = $table['trbackground-images'][$i]['image_id']; - $orig_w = $table['trbackground-images'][$i]['orig_w']; - $orig_h = $table['trbackground-images'][$i]['orig_h']; - $x_pos = $table['trbackground-images'][$i]['x_pos']; - $y_pos = $table['trbackground-images'][$i]['y_pos']; - $x_repeat = $table['trbackground-images'][$i]['x_repeat']; - $y_repeat = $table['trbackground-images'][$i]['y_repeat']; - $resize = $table['trbackground-images'][$i]['resize']; - $opacity = $table['trbackground-images'][$i]['opacity']; - $itype = $table['trbackground-images'][$i]['itype']; - $clippath = ''; - $gx = $x0; - $gy = $y; - $gh = $h; - $gw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - if ($table['borders_separate']) { - $gw -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']; - $clx = $x + $table['border_spacing_H'] / 2; - $cly = $y + $table['border_spacing_V'] / 2; - $clw = $w - $table['border_spacing_H']; - $clh = $h - $table['border_spacing_V']; - // Set clipping path - $s = $this->_setClippingPath($clx, $cly, $clw, $clh); - // mPDF 6 - $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx + $table['border_spacing_H'] / 2, 'y' => $gy + $table['border_spacing_V'] / 2, 'w' => $gw - $table['border_spacing_V'], 'h' => $gh - $table['border_spacing_H'], 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => $s, 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } else { - $this->tableBackgrounds[$level * 9 + 5][] = ['x' => $gx, 'y' => $gy, 'w' => $gw, 'h' => $gh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } - } - } - } - /* -- END BACKGROUNDS -- */ - // TABLE BORDER - if separate - if (($table['borders_separate'] || $this->simpleTables && !$table['simple']['border']) && $table['border']) { - $halfspaceL = $table['padding']['L'] + $table['border_spacing_H'] / 2; - $halfspaceR = $table['padding']['R'] + $table['border_spacing_H'] / 2; - $halfspaceT = $table['padding']['T'] + $table['border_spacing_V'] / 2; - $halfspaceB = $table['padding']['B'] + $table['border_spacing_V'] / 2; - $tbx = $x; - $tby = $y; - $tbw = $w; - $tbh = $h; - $tab_bord = 0; - $corner = ''; - if ($i == 0) { - // Top - $tby -= $halfspaceT + $table['border_details']['T']['w'] / 2; - $tbh += $halfspaceT + $table['border_details']['T']['w'] / 2; - $this->setBorder($tab_bord, Border::TOP); - $corner .= 'T'; - } - if ($i == $numrows - 1 || isset($cell['rowspan']) && $i + $cell['rowspan'] == $numrows) { - // Bottom - $tbh += $halfspaceB + $table['border_details']['B']['w'] / 2; - $this->setBorder($tab_bord, Border::BOTTOM); - $corner .= 'B'; - } - if ($j == 0) { - // Left - $tbx -= $halfspaceL + $table['border_details']['L']['w'] / 2; - $tbw += $halfspaceL + $table['border_details']['L']['w'] / 2; - $this->setBorder($tab_bord, Border::LEFT); - $corner .= 'L'; - } - if ($j == $numcols - 1 || isset($cell['colspan']) && $j + $cell['colspan'] == $numcols) { - // Right - $tbw += $halfspaceR + $table['border_details']['R']['w'] / 2; - $this->setBorder($tab_bord, Border::RIGHT); - $corner .= 'R'; - } - $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord, $table['border_details'], \false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H']); - } - unset($cell); - // Reset values - $this->Reset(); - } - //end of (if isset(cells)...) - } - // end of columns - $newpagestarted = \false; - $this->tabletheadjustfinished = \false; - /* -- COLUMNS -- */ - if ($this->ColActive) { - if (!$this->table_keep_together && $i < $numrows - 1 && $level == 1) { - $this->breakpoints[$this->CurrCol][] = $y + $h; - } - // mPDF 6 - if (\count($this->cellBorderBuffer)) { - $this->printcellbuffer(); - } - } - /* -- END COLUMNS -- */ - if ($i == $numrows - 1) { - $this->y = $y + $h; - } - // last row jump (update this->y position) - if ($this->table_rotate && $level == 1) { - $this->tbrot_h += $h; - } - } - // end of rows - if (\count($this->cellBorderBuffer)) { - $this->printcellbuffer(); - } - if ($this->tableClipPath) { - $this->writer->write("Q"); - } - $this->tableClipPath = ''; - // Advance down page by half width of bottom border - if ($table['borders_separate']) { - $this->y += $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; - } else { - $this->y += $table['max_cell_border_width']['B'] / 2; - } - if ($table['borders_separate'] && $level == 1) { - $this->tbrot_h += $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] / 2; - } elseif ($level == 1) { - $this->tbrot_h += $table['margin']['B'] + $table['max_cell_border_width']['B'] / 2; - } - $bx = $x0; - $by = $y0; - if ($table['borders_separate']) { - $bx -= $table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H'] / 2; - if ($tablestartpageno != $this->page) { - // IF broken across page - $by += $table['max_cell_border_width']['T'] / 2; - if (empty($tableheader)) { - $by -= $table['border_spacing_V'] / 2; - } - } elseif ($split && $startrow > 0 && empty($tableheader)) { - $by -= $table['border_spacing_V'] / 2; - } else { - $by -= $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V'] / 2; - } - } elseif ($tablestartpageno != $this->page && !empty($tableheader)) { - $by += $maxbwtop / 2; - } - $by -= $tableheaderadj; - $bh = $this->y - $by; - if (!$table['borders_separate']) { - $bh -= $table['max_cell_border_width']['B'] / 2; - } - if ($split) { - $bw = 0; - $finalSpread = \true; - for ($t = $startcol; $t < $numcols; $t++) { - if ($table['colPg'][$t] == $splitpg) { - $bw += $table['wc'][$t]; - } - if ($table['colPg'][$t] > $splitpg) { - $finalSpread = \false; - break; - } - } - if ($startcol == 0) { - $firstSpread = \true; - } else { - $firstSpread = \false; - } - if ($table['borders_separate']) { - $bw += $table['border_spacing_H']; - if ($firstSpread) { - $bw += $table['padding']['L'] + $table['border_details']['L']['w']; - } else { - $bx += $table['padding']['L'] + $table['border_details']['L']['w']; - } - if ($finalSpread) { - $bw += $table['padding']['R'] + $table['border_details']['R']['w']; - } - } - } else { - $bw = $table['w'] - $table['max_cell_border_width']['L'] / 2 - $table['max_cell_border_width']['R'] / 2 - $table['margin']['L'] - $table['margin']['R']; - } - if (!$this->ColActive) { - if (isset($table['bgcolor'][-1])) { - $color = $this->colorConverter->convert($table['bgcolor'][-1], $this->PDFAXwarnings); - if ($color) { - $this->tableBackgrounds[$level * 9][] = ['gradient' => \false, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'col' => $color]; - } - } - /* -- BACKGROUNDS -- */ - if (isset($table['gradient'])) { - $g = $this->gradient->parseBackgroundGradient($table['gradient']); - if ($g) { - $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => \true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } - if (isset($table['background-image'])) { - if (isset($table['background-image']['gradient']) && $table['background-image']['gradient'] && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'])) { - $g = $this->gradient->parseMozGradient($table['background-image']['gradient']); - if ($g) { - $this->tableBackgrounds[$level * 9 + 1][] = ['gradient' => \true, 'x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'gradtype' => $g['type'], 'stops' => $g['stops'], 'colorspace' => $g['colorspace'], 'coords' => $g['coords'], 'extend' => $g['extend'], 'clippath' => '']; - } - } else { - $image_id = $table['background-image']['image_id']; - $orig_w = $table['background-image']['orig_w']; - $orig_h = $table['background-image']['orig_h']; - $x_pos = $table['background-image']['x_pos']; - $y_pos = $table['background-image']['y_pos']; - $x_repeat = $table['background-image']['x_repeat']; - $y_repeat = $table['background-image']['y_repeat']; - $resize = $table['background-image']['resize']; - $opacity = $table['background-image']['opacity']; - $itype = $table['background-image']['itype']; - $this->tableBackgrounds[$level * 9 + 2][] = ['x' => $bx, 'y' => $by, 'w' => $bw, 'h' => $bh, 'image_id' => $image_id, 'orig_w' => $orig_w, 'orig_h' => $orig_h, 'x_pos' => $x_pos, 'y_pos' => $y_pos, 'x_repeat' => $x_repeat, 'y_repeat' => $y_repeat, 'clippath' => '', 'resize' => $resize, 'opacity' => $opacity, 'itype' => $itype]; - } - } - /* -- END BACKGROUNDS -- */ - } - if ($this->tableBackgrounds && $level == 1) { - $s = $this->PrintTableBackgrounds(); - if ($this->table_rotate && !$this->processingHeader && !$this->processingFooter) { - $this->tablebuffer = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->tablebuffer); - if ($level == 1) { - $this->tablebuffer = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->tablebuffer); - } - } elseif ($this->bufferoutput) { - $this->headerbuffer = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->headerbuffer); - if ($level == 1) { - $this->headerbuffer = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->headerbuffer); - } - } else { - $this->pages[$this->page] = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->pages[$this->page]); - if ($level == 1) { - $this->pages[$this->page] = \preg_replace('/(___TABLE___BACKGROUNDS' . $this->uniqstr . ')/', " ", $this->pages[$this->page]); - } - } - $this->tableBackgrounds = []; - } - // TABLE BOTTOM MARGIN - if ($table['margin']['B']) { - if (!$this->table_rotate && $level == 1) { - $this->DivLn($table['margin']['B'], $this->blklvl, \true); - // collapsible - } else { - $this->y += $table['margin']['B']; - } - } - if ($this->ColActive && $level == 1) { - $this->breakpoints[$this->CurrCol][] = $this->y; - } - // *COLUMNS* - if ($split) { - // Are there more columns to print on a next page? - if ($lastCol < $numcols - 1) { - $splitpg++; - $startcol = $lastCol + 1; - return [\false, $startrow, $startcol, $splitpg, $returny, $y0]; - } else { - return [\true, 0, 0, 0, \false, \false]; - } - } - } - // END OF FUNCTION _tableWrite() - /////////////////////////END OF TABLE CODE////////////////////////////////// - /* -- END TABLES -- */ - function _putextgstates() - { - for ($i = 1; $i <= \count($this->extgstates); $i++) { - $this->writer->object(); - $this->extgstates[$i]['n'] = $this->n; - $this->writer->write('<</Type /ExtGState'); - foreach ($this->extgstates[$i]['parms'] as $k => $v) { - $this->writer->write('/' . $k . ' ' . $v); - } - $this->writer->write('>>'); - $this->writer->write('endobj'); - } - } - function SetProtection($permissions = [], $user_pass = '', $owner_pass = null, $length = 40) - { - $this->encrypted = $this->protection->setProtection($permissions, $user_pass, $owner_pass, $length); - } - // ========================================= - // FROM class PDF_Bookmark - function Bookmark($txt, $level = 0, $y = 0) - { - $txt = $this->purify_utf8_text($txt); - if ($this->text_input_as_HTML) { - $txt = $this->all_entities_to_utf8($txt); - } - if ($y == -1) { - if (!$this->ColActive) { - $y = $this->y; - } else { - $y = $this->y0; - } - // If columns are on - mark top of columns - } - // else y is used as set, or =0 i.e. top of page - // DIRECTIONALITY RTL - $bmo = ['t' => $txt, 'l' => $level, 'y' => $y, 'p' => $this->page]; - if ($this->keep_block_together) { - // do nothing - } elseif ($this->table_rotate) { - $this->tbrot_BMoutlines[] = $bmo; - } elseif ($this->kwt) { - $this->kwt_BMoutlines[] = $bmo; - } elseif ($this->ColActive) { - $this->col_BMoutlines[] = $bmo; - } else { - $this->BMoutlines[] = $bmo; - } - } - /** - * Initiate, and Mark a place for the Table of Contents to be inserted - */ - function TOC($tocfont = '', $tocfontsize = 0, $tocindent = 0, $resetpagenum = '', $pagenumstyle = '', $suppress = '', $toc_orientation = '', $TOCusePaging = \true, $TOCuseLinking = \false, $toc_id = 0, $tocoutdent = '') - { - $this->tableOfContents->TOC($tocfont, $tocfontsize, $tocindent, $resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $TOCusePaging, $TOCuseLinking, $toc_id, $tocoutdent); - } - function TOCpagebreakByArray($a) - { - if (!\is_array($a)) { - $a = []; - } - $tocoutdent = isset($a['tocoutdent']) ? $a['tocoutdent'] : (isset($a['outdent']) ? $a['outdent'] : ''); - $TOCusePaging = isset($a['TOCusePaging']) ? $a['TOCusePaging'] : (isset($a['paging']) ? $a['paging'] : \true); - $TOCuseLinking = isset($a['TOCuseLinking']) ? $a['TOCuseLinking'] : (isset($a['links']) ? $a['links'] : ''); - $toc_orientation = isset($a['toc_orientation']) ? $a['toc_orientation'] : (isset($a['toc-orientation']) ? $a['toc-orientation'] : ''); - $toc_mgl = isset($a['toc_mgl']) ? $a['toc_mgl'] : (isset($a['toc-margin-left']) ? $a['toc-margin-left'] : ''); - $toc_mgr = isset($a['toc_mgr']) ? $a['toc_mgr'] : (isset($a['toc-margin-right']) ? $a['toc-margin-right'] : ''); - $toc_mgt = isset($a['toc_mgt']) ? $a['toc_mgt'] : (isset($a['toc-margin-top']) ? $a['toc-margin-top'] : ''); - $toc_mgb = isset($a['toc_mgb']) ? $a['toc_mgb'] : (isset($a['toc-margin-bottom']) ? $a['toc-margin-bottom'] : ''); - $toc_mgh = isset($a['toc_mgh']) ? $a['toc_mgh'] : (isset($a['toc-margin-header']) ? $a['toc-margin-header'] : ''); - $toc_mgf = isset($a['toc_mgf']) ? $a['toc_mgf'] : (isset($a['toc-margin-footer']) ? $a['toc-margin-footer'] : ''); - $toc_ohname = isset($a['toc_ohname']) ? $a['toc_ohname'] : (isset($a['toc-odd-header-name']) ? $a['toc-odd-header-name'] : ''); - $toc_ehname = isset($a['toc_ehname']) ? $a['toc_ehname'] : (isset($a['toc-even-header-name']) ? $a['toc-even-header-name'] : ''); - $toc_ofname = isset($a['toc_ofname']) ? $a['toc_ofname'] : (isset($a['toc-odd-footer-name']) ? $a['toc-odd-footer-name'] : ''); - $toc_efname = isset($a['toc_efname']) ? $a['toc_efname'] : (isset($a['toc-even-footer-name']) ? $a['toc-even-footer-name'] : ''); - $toc_ohvalue = isset($a['toc_ohvalue']) ? $a['toc_ohvalue'] : (isset($a['toc-odd-header-value']) ? $a['toc-odd-header-value'] : 0); - $toc_ehvalue = isset($a['toc_ehvalue']) ? $a['toc_ehvalue'] : (isset($a['toc-even-header-value']) ? $a['toc-even-header-value'] : 0); - $toc_ofvalue = isset($a['toc_ofvalue']) ? $a['toc_ofvalue'] : (isset($a['toc-odd-footer-value']) ? $a['toc-odd-footer-value'] : 0); - $toc_efvalue = isset($a['toc_efvalue']) ? $a['toc_efvalue'] : (isset($a['toc-even-footer-value']) ? $a['toc-even-footer-value'] : 0); - $toc_preHTML = isset($a['toc_preHTML']) ? $a['toc_preHTML'] : (isset($a['toc-preHTML']) ? $a['toc-preHTML'] : ''); - $toc_postHTML = isset($a['toc_postHTML']) ? $a['toc_postHTML'] : (isset($a['toc-postHTML']) ? $a['toc-postHTML'] : ''); - $toc_bookmarkText = isset($a['toc_bookmarkText']) ? $a['toc_bookmarkText'] : (isset($a['toc-bookmarkText']) ? $a['toc-bookmarkText'] : ''); - $resetpagenum = isset($a['resetpagenum']) ? $a['resetpagenum'] : ''; - $pagenumstyle = isset($a['pagenumstyle']) ? $a['pagenumstyle'] : ''; - $suppress = isset($a['suppress']) ? $a['suppress'] : ''; - $orientation = isset($a['orientation']) ? $a['orientation'] : ''; - $mgl = isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : ''); - $mgr = isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : ''); - $mgt = isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : ''); - $mgb = isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : ''); - $mgh = isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : ''); - $mgf = isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : ''); - $ohname = isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : ''); - $ehname = isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : ''); - $ofname = isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : ''); - $efname = isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : ''); - $ohvalue = isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0); - $ehvalue = isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0); - $ofvalue = isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0); - $efvalue = isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0); - $toc_id = isset($a['toc_id']) ? $a['toc_id'] : (isset($a['name']) ? $a['name'] : 0); - $pagesel = isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : ''); - $toc_pagesel = isset($a['toc_pagesel']) ? $a['toc_pagesel'] : (isset($a['toc-pageselector']) ? $a['toc-pageselector'] : ''); - $sheetsize = isset($a['sheetsize']) ? $a['sheetsize'] : (isset($a['sheet-size']) ? $a['sheet-size'] : ''); - $toc_sheetsize = isset($a['toc_sheetsize']) ? $a['toc_sheetsize'] : (isset($a['toc-sheet-size']) ? $a['toc-sheet-size'] : ''); - $this->TOCpagebreak('', '', '', $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); - } - function TOCpagebreak($tocfont = '', $tocfontsize = '', $tocindent = '', $TOCusePaging = \true, $TOCuseLinking = '', $toc_orientation = '', $toc_mgl = '', $toc_mgr = '', $toc_mgt = '', $toc_mgb = '', $toc_mgh = '', $toc_mgf = '', $toc_ohname = '', $toc_ehname = '', $toc_ofname = '', $toc_efname = '', $toc_ohvalue = 0, $toc_ehvalue = 0, $toc_ofvalue = 0, $toc_efvalue = 0, $toc_preHTML = '', $toc_postHTML = '', $toc_bookmarkText = '', $resetpagenum = '', $pagenumstyle = '', $suppress = '', $orientation = '', $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $toc_id = 0, $pagesel = '', $toc_pagesel = '', $sheetsize = '', $toc_sheetsize = '', $tocoutdent = '') - { - // Start a new page - if ($this->state == 0) { - $this->AddPage(); - } - if ($this->y == $this->tMargin && (!$this->mirrorMargins || $this->mirrorMargins && $this->page % 2 == 1)) { - // Don't add a page - if ($this->page == 1 && \count($this->PageNumSubstitutions) == 0) { - if (!$suppress) { - $suppress = 'off'; - } - // $this->PageNumSubstitutions[] = array('from'=>1, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); - } - $this->PageNumSubstitutions[] = ['from' => $this->page, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; - } else { - $this->AddPage($orientation, 'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $sheetsize); - } - $this->tableOfContents->TOCpagebreak($tocfont, $tocfontsize, $tocindent, $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); - } - function TOC_Entry($txt, $level = 0, $toc_id = 0) - { - if ($this->ColActive) { - $ily = $this->y0; - } else { - $ily = $this->y; - } - // use top of columns - $linkn = $this->AddLink(); - $uid = '__mpdfinternallink_' . $linkn; - if ($this->table_rotate) { - $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page, "tbrot" => \true]; - } elseif ($this->kwt) { - $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page, "kwt" => \true]; - } elseif ($this->ColActive) { - $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page, "col" => $this->CurrCol]; - } elseif (!$this->keep_block_together) { - $this->internallink[$uid] = ["Y" => $ily, "PAGE" => $this->page]; - } - $this->internallink['#' . $uid] = $linkn; - $this->SetLink($linkn, $ily, $this->page); - if (\strtoupper($toc_id) == 'ALL') { - $toc_id = '_mpdf_all'; - } elseif (!$toc_id) { - $toc_id = 0; - } else { - $toc_id = \strtolower($toc_id); - } - $btoc = ['t' => $txt, 'l' => $level, 'p' => $this->page, 'link' => $linkn, 'toc_id' => $toc_id]; - if ($this->keep_block_together) { - // do nothing - } elseif ($this->table_rotate) { - $this->tbrot_toc[] = $btoc; - } elseif ($this->kwt) { - $this->kwt_toc[] = $btoc; - } elseif ($this->ColActive) { - // *COLUMNS* - $this->col_toc[] = $btoc; - // *COLUMNS* - } else { - $this->tableOfContents->_toc[] = $btoc; - } - } - /* -- END TOC -- */ - // ====================================================== - function MovePages($target_page, $start_page, $end_page = -1) - { - // move a page/pages EARLIER in the document - if ($end_page < 1) { - $end_page = $start_page; - } - $n_toc = $end_page - $start_page + 1; - // Set/Update PageNumSubstitutions changes before moving anything - if (\count($this->PageNumSubstitutions)) { - $tp_present = \false; - $sp_present = \false; - $ep_present = \false; - foreach ($this->PageNumSubstitutions as $k => $v) { - if ($this->PageNumSubstitutions[$k]['from'] == $target_page) { - $tp_present = \true; - if ($this->PageNumSubstitutions[$k]['suppress'] != 'on' && $this->PageNumSubstitutions[$k]['suppress'] != 1) { - $this->PageNumSubstitutions[$k]['suppress'] = 'off'; - } - } - if ($this->PageNumSubstitutions[$k]['from'] == $start_page) { - $sp_present = \true; - if ($this->PageNumSubstitutions[$k]['suppress'] != 'on' && $this->PageNumSubstitutions[$k]['suppress'] != 1) { - $this->PageNumSubstitutions[$k]['suppress'] = 'off'; - } - } - if ($this->PageNumSubstitutions[$k]['from'] == $end_page + 1) { - $ep_present = \true; - if ($this->PageNumSubstitutions[$k]['suppress'] != 'on' && $this->PageNumSubstitutions[$k]['suppress'] != 1) { - $this->PageNumSubstitutions[$k]['suppress'] = 'off'; - } - } - } - if (!$tp_present) { - list($tp_type, $tp_suppress, $tp_reset) = $this->docPageSettings($target_page); - } - if (!$sp_present) { - list($sp_type, $sp_suppress, $sp_reset) = $this->docPageSettings($start_page); - } - if (!$ep_present) { - list($ep_type, $ep_suppress, $ep_reset) = $this->docPageSettings($start_page - 1); - } - } - $last = []; - // store pages - for ($i = $start_page; $i <= $end_page; $i++) { - $last[] = $this->pages[$i]; - } - // move pages - for ($i = $start_page - 1; $i >= $target_page; $i--) { - $this->pages[$i + $n_toc] = $this->pages[$i]; - } - // Put toc pages at insert point - for ($i = 0; $i < $n_toc; $i++) { - $this->pages[$target_page + $i] = $last[$i]; - } - /* -- BOOKMARKS -- */ - // Update Bookmarks - foreach ($this->BMoutlines as $i => $o) { - if ($o['p'] >= $target_page) { - $this->BMoutlines[$i]['p'] += $n_toc; - } - } - /* -- END BOOKMARKS -- */ - // Update Page Links - if (\count($this->PageLinks)) { - $newarr = []; - foreach ($this->PageLinks as $i => $o) { - foreach ($this->PageLinks[$i] as $key => $pl) { - if (\strpos($pl[4], '@') === 0) { - $p = \substr($pl[4], 1); - if ($p >= $start_page && $p <= $end_page) { - $this->PageLinks[$i][$key][4] = '@' . ($p + ($target_page - $start_page)); - } elseif ($p >= $target_page && $p < $start_page) { - $this->PageLinks[$i][$key][4] = '@' . ($p + $n_toc); - } - } - } - if ($i >= $start_page && $i <= $end_page) { - $newarr[$i + ($target_page - $start_page)] = $this->PageLinks[$i]; - } elseif ($i >= $target_page && $i < $start_page) { - $newarr[$i + $n_toc] = $this->PageLinks[$i]; - } else { - $newarr[$i] = $this->PageLinks[$i]; - } - } - $this->PageLinks = $newarr; - } - // OrientationChanges - if (\count($this->OrientationChanges)) { - $newarr = []; - foreach ($this->OrientationChanges as $p => $v) { - if ($p >= $start_page && $p <= $end_page) { - $newarr[$p + ($target_page - $start_page)] = $this->OrientationChanges[$p]; - } elseif ($p >= $target_page && $p < $start_page) { - $newarr[$p + $n_toc] = $this->OrientationChanges[$p]; - } else { - $newarr[$p] = $this->OrientationChanges[$p]; - } - } - \ksort($newarr); - $this->OrientationChanges = $newarr; - } - // Page Dimensions - if (\count($this->pageDim)) { - $newarr = []; - foreach ($this->pageDim as $p => $v) { - if ($p >= $start_page && $p <= $end_page) { - $newarr[$p + ($target_page - $start_page)] = $this->pageDim[$p]; - } elseif ($p >= $target_page && $p < $start_page) { - $newarr[$p + $n_toc] = $this->pageDim[$p]; - } else { - $newarr[$p] = $this->pageDim[$p]; - } - } - \ksort($newarr); - $this->pageDim = $newarr; - } - // HTML Headers & Footers - if (\count($this->saveHTMLHeader)) { - $newarr = []; - foreach ($this->saveHTMLHeader as $p => $v) { - if ($p >= $start_page && $p <= $end_page) { - $newarr[$p + ($target_page - $start_page)] = $this->saveHTMLHeader[$p]; - } elseif ($p >= $target_page && $p < $start_page) { - $newarr[$p + $n_toc] = $this->saveHTMLHeader[$p]; - } else { - $newarr[$p] = $this->saveHTMLHeader[$p]; - } - } - \ksort($newarr); - $this->saveHTMLHeader = $newarr; - } - if (\count($this->saveHTMLFooter)) { - $newarr = []; - foreach ($this->saveHTMLFooter as $p => $v) { - if ($p >= $start_page && $p <= $end_page) { - $newarr[$p + ($target_page - $start_page)] = $this->saveHTMLFooter[$p]; - } elseif ($p >= $target_page && $p < $start_page) { - $newarr[$p + $n_toc] = $this->saveHTMLFooter[$p]; - } else { - $newarr[$p] = $this->saveHTMLFooter[$p]; - } - } - \ksort($newarr); - $this->saveHTMLFooter = $newarr; - } - // Update Internal Links - if (\count($this->internallink)) { - foreach ($this->internallink as $key => $o) { - if (\is_array($o) && $o['PAGE'] >= $start_page && $o['PAGE'] <= $end_page) { - $this->internallink[$key]['PAGE'] += $target_page - $start_page; - } elseif (\is_array($o) && $o['PAGE'] >= $target_page && $o['PAGE'] < $start_page) { - $this->internallink[$key]['PAGE'] += $n_toc; - } - } - } - // Update Links - if (\count($this->links)) { - foreach ($this->links as $key => $o) { - if ($o[0] >= $start_page && $o[0] <= $end_page) { - $this->links[$key][0] += $target_page - $start_page; - } - if ($o[0] >= $target_page && $o[0] < $start_page) { - $this->links[$key][0] += $n_toc; - } - } - } - // Update Form fields - if (\count($this->form->forms)) { - foreach ($this->form->forms as $key => $f) { - if ($f['page'] >= $start_page && $f['page'] <= $end_page) { - $this->form->forms[$key]['page'] += $target_page - $start_page; - } - if ($f['page'] >= $target_page && $f['page'] < $start_page) { - $this->form->forms[$key]['page'] += $n_toc; - } - } - } - /* -- ANNOTATIONS -- */ - // Update Annotations - if (\count($this->PageAnnots)) { - $newarr = []; - foreach ($this->PageAnnots as $p => $anno) { - if ($p >= $start_page && $p <= $end_page) { - $np = $p + ($target_page - $start_page); - foreach ($anno as $o) { - $newarr[$np][] = $o; - } - } elseif ($p >= $target_page && $p < $start_page) { - $np = $p + $n_toc; - foreach ($anno as $o) { - $newarr[$np][] = $o; - } - } else { - $newarr[$p] = $this->PageAnnots[$p]; - } - } - $this->PageAnnots = $newarr; - unset($newarr); - } - /* -- END ANNOTATIONS -- */ - // Update TOC pages - if (\count($this->tableOfContents->_toc)) { - foreach ($this->tableOfContents->_toc as $key => $t) { - if ($t['p'] >= $start_page && $t['p'] <= $end_page) { - $this->tableOfContents->_toc[$key]['p'] += $target_page - $start_page; - } - if ($t['p'] >= $target_page && $t['p'] < $start_page) { - $this->tableOfContents->_toc[$key]['p'] += $n_toc; - } - } - } - // Update PageNumSubstitutions - if (\count($this->PageNumSubstitutions)) { - $newarr = []; - foreach ($this->PageNumSubstitutions as $k => $v) { - if ($this->PageNumSubstitutions[$k]['from'] >= $start_page && $this->PageNumSubstitutions[$k]['from'] <= $end_page) { - $this->PageNumSubstitutions[$k]['from'] += $target_page - $start_page; - $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; - } elseif ($this->PageNumSubstitutions[$k]['from'] >= $target_page && $this->PageNumSubstitutions[$k]['from'] < $start_page) { - $this->PageNumSubstitutions[$k]['from'] += $n_toc; - $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; - } else { - $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; - } - } - if (!$sp_present) { - $newarr[$target_page] = ['from' => $target_page, 'suppress' => $sp_suppress, 'reset' => $sp_reset, 'type' => $sp_type]; - } - if (!$tp_present) { - $newarr[$target_page + $n_toc] = ['from' => $target_page + $n_toc, 'suppress' => $tp_suppress, 'reset' => $tp_reset, 'type' => $tp_type]; - } - if (!$ep_present && $end_page > \count($this->pages)) { - $newarr[$end_page + 1] = ['from' => $end_page + 1, 'suppress' => $ep_suppress, 'reset' => $ep_reset, 'type' => $ep_type]; - } - \ksort($newarr); - $this->PageNumSubstitutions = []; - foreach ($newarr as $v) { - $this->PageNumSubstitutions[] = $v; - } - } - } - function DeletePages($start_page, $end_page = -1) - { - // move a page/pages EARLIER in the document - if ($end_page < 1) { - $end_page = $start_page; - } - $n_tod = $end_page - $start_page + 1; - $last_page = \count($this->pages); - $n_atend = $last_page - $end_page + 1; - // move pages - for ($i = 0; $i < $n_atend; $i++) { - $this->pages[$start_page + $i] = $this->pages[$end_page + 1 + $i]; - } - // delete pages - for ($i = 0; $i < $n_tod; $i++) { - unset($this->pages[$last_page - $i]); - } - /* -- BOOKMARKS -- */ - // Update Bookmarks - foreach ($this->BMoutlines as $i => $o) { - if ($o['p'] >= $end_page) { - $this->BMoutlines[$i]['p'] -= $n_tod; - } elseif ($p < $start_page) { - unset($this->BMoutlines[$i]); - } - } - /* -- END BOOKMARKS -- */ - // Update Page Links - if (\count($this->PageLinks)) { - $newarr = []; - foreach ($this->PageLinks as $i => $o) { - foreach ($this->PageLinks[$i] as $key => $pl) { - if (\strpos($pl[4], '@') === 0) { - $p = \substr($pl[4], 1); - if ($p > $end_page) { - $this->PageLinks[$i][$key][4] = '@' . ($p - $n_tod); - } elseif ($p < $start_page) { - unset($this->PageLinks[$i][$key]); - } - } - } - if ($i > $end_page) { - $newarr[$i - $n_tod] = $this->PageLinks[$i]; - } elseif ($p < $start_page) { - $newarr[$i] = $this->PageLinks[$i]; - } - } - $this->PageLinks = $newarr; - } - // OrientationChanges - if (\count($this->OrientationChanges)) { - $newarr = []; - foreach ($this->OrientationChanges as $p => $v) { - if ($p > $end_page) { - $newarr[$p - $t_tod] = $this->OrientationChanges[$p]; - } elseif ($p < $start_page) { - $newarr[$p] = $this->OrientationChanges[$p]; - } - } - \ksort($newarr); - $this->OrientationChanges = $newarr; - } - // Page Dimensions - if (\count($this->pageDim)) { - $newarr = []; - foreach ($this->pageDim as $p => $v) { - if ($p > $end_page) { - $newarr[$p - $n_tod] = $this->pageDim[$p]; - } elseif ($p < $start_page) { - $newarr[$p] = $this->pageDim[$p]; - } - } - \ksort($newarr); - $this->pageDim = $newarr; - } - // HTML Headers & Footers - if (\count($this->saveHTMLHeader)) { - foreach ($this->saveHTMLHeader as $p => $v) { - if ($p > $end_page) { - $newarr[$p - $n_tod] = $this->saveHTMLHeader[$p]; - } elseif ($p < $start_page) { - $newarr[$p] = $this->saveHTMLHeader[$p]; - } - } - \ksort($newarr); - $this->saveHTMLHeader = $newarr; - } - if (\count($this->saveHTMLFooter)) { - $newarr = []; - foreach ($this->saveHTMLFooter as $p => $v) { - if ($p > $end_page) { - $newarr[$p - $n_tod] = $this->saveHTMLFooter[$p]; - } elseif ($p < $start_page) { - $newarr[$p] = $this->saveHTMLFooter[$p]; - } - } - \ksort($newarr); - $this->saveHTMLFooter = $newarr; - } - // Update Internal Links - foreach ($this->internallink as $key => $o) { - if ($o['PAGE'] > $end_page) { - $this->internallink[$key]['PAGE'] -= $n_tod; - } elseif ($o['PAGE'] < $start_page) { - unset($this->internallink[$key]); - } - } - // Update Links - foreach ($this->links as $key => $o) { - if ($o[0] > $end_page) { - $this->links[$key][0] -= $n_tod; - } elseif ($o[0] < $start_page) { - unset($this->links[$key]); - } - } - // Update Form fields - foreach ($this->form->forms as $key => $f) { - if ($f['page'] > $end_page) { - $this->form->forms[$key]['page'] -= $n_tod; - } elseif ($f['page'] < $start_page) { - unset($this->form->forms[$key]); - } - } - /* -- ANNOTATIONS -- */ - // Update Annotations - if (\count($this->PageAnnots)) { - $newarr = []; - foreach ($this->PageAnnots as $p => $anno) { - if ($p > $end_page) { - foreach ($anno as $o) { - $newarr[$p - $n_tod][] = $o; - } - } elseif ($p < $start_page) { - $newarr[$p] = $this->PageAnnots[$p]; - } - } - \ksort($newarr); - $this->PageAnnots = $newarr; - } - /* -- END ANNOTATIONS -- */ - // Update PageNumSubstitutions - foreach ($this->PageNumSubstitutions as $k => $v) { - if ($this->PageNumSubstitutions[$k]['from'] > $end_page) { - $this->PageNumSubstitutions[$k]['from'] -= $n_tod; - } elseif ($this->PageNumSubstitutions[$k]['from'] < $start_page) { - unset($this->PageNumSubstitutions[$k]); - } - } - unset($newarr); - $this->page = \count($this->pages); - } - // ====================================================== - /* -- INDEX -- */ - // FROM class PDF_Ref == INDEX - function IndexEntry($txt, $xref = '') - { - if ($xref) { - $this->IndexEntrySee($txt, $xref); - return; - } - // Search the reference (AND Ref/PageNo) in the array - $Present = \false; - if ($this->keep_block_together) { - // do nothing - } elseif ($this->kwt) { - $size = \count($this->kwt_Reference); - for ($i = 0; $i < $size; $i++) { - if (isset($this->kwt_Reference[$i]['t']) && $this->kwt_Reference[$i]['t'] == $txt) { - $Present = \true; - if ($this->page != $this->kwt_Reference[$i]['op']) { - $this->kwt_Reference[$i]['op'] = $this->page; - } - } - } - if (!$Present) { - // If not found, add it - $this->kwt_Reference[] = ['t' => $txt, 'op' => $this->page]; - } - } else { - $size = \count($this->Reference); - for ($i = 0; $i < $size; $i++) { - if (isset($this->Reference[$i]['t']) && $this->Reference[$i]['t'] == $txt) { - $Present = \true; - if (!\in_array($this->page, $this->Reference[$i]['p'])) { - $this->Reference[$i]['p'][] = $this->page; - } - } - } - if (!$Present) { - // If not found, add it - $this->Reference[] = ['t' => $txt, 'p' => [$this->page]]; - } - } - } - // Added function to add a reference "Elephants. See Chickens" - function IndexEntrySee($txta, $txtb) - { - if ($this->directionality == 'rtl') { - // *OTL* - // ONLY DO THIS IF NOT IN TAGS - if ($txta == \strip_tags($txta)) { - $txta = \str_replace(':', ' - ', $txta); - // *OTL* - } - if ($txtb == \strip_tags($txtb)) { - $txtb = \str_replace(':', ' - ', $txtb); - // *OTL* - } - } else { - // *OTL* - if ($txta == \strip_tags($txta)) { - $txta = \str_replace(':', ', ', $txta); - } - if ($txtb == \strip_tags($txtb)) { - $txtb = \str_replace(':', ', ', $txtb); - } - } - // *OTL* - $this->Reference[] = ['t' => $txta . ' - see ' . $txtb, 'p' => []]; - } - private function filesInDir($directory) - { - $files = []; - foreach (new \DirectoryIterator($directory) as $v) { - if ($v->isDir() || $v->isDot()) { - continue; - } - $files[] = $v->getPathname(); - } - return $files; - } - function InsertIndex($usedivletters = 1, $useLinking = \false, $indexCollationLocale = '', $indexCollationGroup = '') - { - $size = \count($this->Reference); - if ($size == 0) { - return \false; - } - // $spacer used after named entry - // $sep separates number [groups], $joiner joins numbers in range - // e.g. "elephant 73, 97-99" = elephant[$spacer]73[$sep]97[$joiner]99 - // $subEntrySeparator separates main and subentry (if $this->indexUseSubentries == false;) e.g. - // Mammal:elephant => Mammal[$subEntrySeparator]elephant - // $subEntryInset specifies what precedes a subentry (if $this->indexUseSubentries == true;) e.g. - // Mammal:elephant => [$subEntryInset]elephant - $spacer = "  "; - if ($this->directionality == 'rtl') { - $sep = '، '; - $joiner = '-'; - $subEntrySeparator = '، '; - $subEntryInset = ' - '; - } else { - $sep = ', '; - $joiner = '-'; - $subEntrySeparator = ', '; - $subEntryInset = ' - '; - } - for ($i = 0; $i < $size; $i++) { - $txt = $this->Reference[$i]['t']; - $txt = \strip_tags($txt); - // mPDF 6 - $txt = $this->purify_utf8($txt); - $this->Reference[$i]['uf'] = $txt; - // Unformatted e.g. pure utf-8 encoded characters, no mark-up/tags - // Used for ordering and collation - } - if ($usedivletters) { - if ($indexCollationGroup && \in_array(\strtolower($indexCollationGroup), \array_map(function ($v) { - return \strtolower(\basename($v, '.php')); - }, $this->filesInDir(__DIR__ . '/../data/collations/')))) { - $collation = (require __DIR__ . '/../data/collations/' . $indexCollationGroup . '.php'); - } else { - $collation = []; - } - for ($i = 0; $i < $size; $i++) { - if ($this->Reference[$i]['uf']) { - $l = \mb_substr($this->Reference[$i]['uf'], 0, 1, 'UTF-8'); - if (isset($indexCollationGroup) && $indexCollationGroup) { - $uni = $this->UTF8StringToArray($l); - $ucode = $uni[0]; - if (isset($collation[$ucode])) { - $this->Reference[$i]['d'] = UtfString::code2utf($collation[$ucode]); - } else { - $this->Reference[$i]['d'] = \mb_strtolower($l, 'UTF-8'); - } - } else { - $this->Reference[$i]['d'] = \mb_strtolower($l, 'UTF-8'); - } - } - } - } - // Alphabetic sort of the references - $originalLocale = \setlocale(\LC_COLLATE, 0); - if ($indexCollationLocale) { - \setlocale(\LC_COLLATE, $indexCollationLocale); - } - \usort($this->Reference, function ($a, $b) { - return \strcoll(\strtolower($a['uf']), \strtolower($b['uf'])); - }); - if ($indexCollationLocale) { - \setlocale(\LC_COLLATE, $originalLocale); - } - $html = '<div class="mpdf_index_main">'; - $lett = ''; - $last_lett = ''; - $mainentry = ''; - for ($i = 0; $i < $size; $i++) { - if ($this->Reference[$i]['t']) { - if ($usedivletters) { - $lett = $this->Reference[$i]['d']; - if ($lett != $last_lett) { - $html .= '<div class="mpdf_index_letter">' . $lett . '</div>'; - } - } - $txt = $this->Reference[$i]['t']; - // Sub-entries e.g. Mammals:elephant - // But allow for tags e.g. <b>Mammal</b>:elephants - $a = \preg_split('/(<.*?>)/', $txt, -1, \PREG_SPLIT_DELIM_CAPTURE); - $txt = ''; - $marker = \false; - foreach ($a as $k => $e) { - if ($k % 2 == 0 && !$marker) { - if (\strpos($e, ':') !== \false) { - // == SubEntry - if ($this->indexUseSubentries) { - // If the Main entry does not have any page numbers associated with it - // create and insert an entry - list($txtmain, $sub) = \preg_split('/[:]/', $e, 2); - if (\strip_tags($txt . $txtmain) != $mainentry) { - $html .= '<div class="mpdf_index_entry">' . $txt . $txtmain . '</div>'; - $mainentry = \strip_tags($txt . $txtmain); - } - $txt = $subEntryInset; - $e = $sub; - // Only replace first one - } else { - $e = \preg_replace('/[:]/', $subEntrySeparator, $e, 1); - // Only replace first one - } - $marker = \true; - // Don't replace any more once the subentry marker has been found - } - } - $txt .= $e; - } - if (!$marker) { - $mainentry = \strip_tags($txt); - } - $html .= '<div class="mpdf_index_entry">'; - $html .= $txt; - $ppp = $this->Reference[$i]['p']; - // = array of page numbers to point to - if (\count($ppp)) { - \sort($ppp); - $newarr = []; - $range_start = $ppp[0]; - $range_end = 0; - $html .= $spacer; - for ($zi = 1; $zi < \count($ppp); $zi++) { - if ($ppp[$zi] == $ppp[$zi - 1] + 1) { - $range_end = $ppp[$zi]; - } else { - if ($range_end) { - if ($range_end == $range_start + 1) { - if ($useLinking) { - $html .= '<a class="mpdf_index_link" href="@' . $range_start . '">'; - } - $html .= $this->docPageNum($range_start); - if ($useLinking) { - $html .= '</a>'; - } - $html .= $sep; - if ($useLinking) { - $html .= '<a class="mpdf_index_link" href="@' . $ppp[$zi - 1] . '">'; - } - $html .= $this->docPageNum($ppp[$zi - 1]); - if ($useLinking) { - $html .= '</a>'; - } - $html .= $sep; - } - } else { - if ($useLinking) { - $html .= '<a class="mpdf_index_link" href="@' . $ppp[$zi - 1] . '">'; - } - $html .= $this->docPageNum($ppp[$zi - 1]); - if ($useLinking) { - $html .= '</a>'; - } - $html .= $sep; - } - $range_start = $ppp[$zi]; - $range_end = 0; - } - } - if ($range_end) { - if ($useLinking) { - $html .= '<a class="mpdf_index_link" href="@' . $range_start . '">'; - } - $html .= $this->docPageNum($range_start); - if ($range_end == $range_start + 1) { - if ($useLinking) { - $html .= '</a>'; - } - $html .= $sep; - if ($useLinking) { - $html .= '<a class="mpdf_index_link" href="@' . $range_end . '">'; - } - $html .= $this->docPageNum($range_end); - if ($useLinking) { - $html .= '</a>'; - } - } else { - $html .= $joiner; - $html .= $this->docPageNum($range_end); - if ($useLinking) { - $html .= '</a>'; - } - } - } else { - if ($useLinking) { - $html .= '<a class="mpdf_index_link" href="@' . $ppp[\count($ppp) - 1] . '">'; - } - $html .= $this->docPageNum($ppp[\count($ppp) - 1]); - if ($useLinking) { - $html .= '</a>'; - } - } - } - } - $html .= '</div>'; - $last_lett = $lett; - } - $html .= '</div>'; - $save_fpb = $this->fixedPosBlockSave; - $this->WriteHTML($html); - $this->fixedPosBlockSave = $save_fpb; - $this->breakpoints[$this->CurrCol][] = $this->y; - // *COLUMNS* - } - /* -- END INDEX -- */ - function AcceptPageBreak() - { - if (\count($this->cellBorderBuffer)) { - $this->printcellbuffer(); - } - // *TABLES* - /* -- COLUMNS -- */ - if ($this->ColActive == 1) { - if ($this->CurrCol < $this->NbCol - 1) { - // Go to the next column - $this->CurrCol++; - $this->SetCol($this->CurrCol); - $this->y = $this->y0; - $this->ChangeColumn = 1; - // Number (and direction) of columns changed +1, +2, -2 etc. - // DIRECTIONALITY RTL - if ($this->directionality == 'rtl') { - $this->ChangeColumn = -$this->ChangeColumn; - } - // *OTL* - // Stay on the page - return \false; - } else { - // Go back to the first column - NEW PAGE - if (\count($this->columnbuffer)) { - $this->printcolumnbuffer(); - } - $this->SetCol(0); - $this->y0 = $this->tMargin; - $this->ChangeColumn = -($this->NbCol - 1); - // DIRECTIONALITY RTL - if ($this->directionality == 'rtl') { - $this->ChangeColumn = -$this->ChangeColumn; - } - // *OTL* - // Page break - return \true; - } - } elseif ($this->table_rotate) { - if ($this->tablebuffer) { - $this->printtablebuffer(); - } - return \true; - } else { - // *COLUMNS* - $this->ChangeColumn = 0; - return $this->autoPageBreak; - } - // *COLUMNS* - return $this->autoPageBreak; - } - // ----------- COLUMNS --------------------- - /* -- COLUMNS -- */ - function SetColumns($NbCol, $vAlign = '', $gap = 5) - { - // NbCol = number of columns - // Anything less than 2 turns columns off - if ($NbCol < 2) { - // SET COLUMNS OFF - if ($this->ColActive) { - $this->ColActive = 0; - if (\count($this->columnbuffer)) { - $this->printcolumnbuffer(); - } - $this->NbCol = 1; - $this->ResetMargins(); - $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; - $this->divwidth = 0; - $this->Ln(); - } - $this->ColActive = 0; - $this->columnbuffer = []; - $this->ColDetails = []; - $this->columnLinks = []; - $this->columnAnnots = []; - $this->columnForms = []; - $this->col_BMoutlines = []; - $this->col_toc = []; - $this->breakpoints = []; - } else { - // SET COLUMNS ON - if ($this->ColActive) { - $this->ColActive = 0; - if (\count($this->columnbuffer)) { - $this->printcolumnbuffer(); - } - $this->ResetMargins(); - } - if (isset($this->y) && $this->y > $this->tMargin) { - $this->Ln(); - } - $this->NbCol = $NbCol; - $this->ColGap = $gap; - $this->divwidth = 0; - $this->ColActive = 1; - $this->ColumnAdjust = \true; - // enables column height adjustment for the page - $this->columnbuffer = []; - $this->ColDetails = []; - $this->columnLinks = []; - $this->columnAnnots = []; - $this->columnForms = []; - $this->col_BMoutlines = []; - $this->col_toc = []; - $this->breakpoints = []; - if (\strtoupper($vAlign) == 'J' || \strtoupper($vAlign) == 'JUSTIFY') { - $vAlign = 'J'; - } else { - $vAlign = ''; - } - $this->colvAlign = $vAlign; - // Save the ordinate - $absL = $this->DeflMargin - $gap / 2; - $absR = $this->DefrMargin - $gap / 2; - $PageWidth = $this->w - $absL - $absR; - // virtual pagewidth for calculation only - $ColWidth = ($PageWidth - $gap * $NbCol) / $NbCol; - $this->ColWidth = $ColWidth; - /* -- OTL -- */ - if ($this->directionality == 'rtl') { - for ($i = 0; $i < $this->NbCol; $i++) { - $this->ColL[$i] = $absL + $gap / 2 + ($NbCol - ($i + 1)) * ($PageWidth / $NbCol); - $this->ColR[$i] = $this->ColL[$i] + $ColWidth; - // NB This is not R margin -> R pos - } - } else { - /* -- END OTL -- */ - for ($i = 0; $i < $this->NbCol; $i++) { - $this->ColL[$i] = $absL + $gap / 2 + $i * ($PageWidth / $NbCol); - $this->ColR[$i] = $this->ColL[$i] + $ColWidth; - // NB This is not R margin -> R pos - } - } - // *OTL* - $this->pgwidth = $ColWidth; - $this->SetCol(0); - $this->y0 = $this->y; - } - $this->x = $this->lMargin; - } - function SetCol($CurrCol) - { - // Used internally to set column by number: 0 is 1st column - // Set position on a column - $this->CurrCol = $CurrCol; - $x = $this->ColL[$CurrCol]; - $xR = $this->ColR[$CurrCol]; - // NB This is not R margin -> R pos - if ($this->mirrorMargins && $this->page % 2 == 0) { - // EVEN - $x += $this->MarginCorrection; - $xR += $this->MarginCorrection; - } - $this->SetMargins($x, $this->w - $xR, $this->tMargin); - } - function AddColumn() - { - $this->NewColumn(); - $this->ColumnAdjust = \false; - // disables all column height adjustment for the page. - } - function NewColumn() - { - if ($this->ColActive == 1) { - if ($this->CurrCol < $this->NbCol - 1) { - // Go to the next column - $this->CurrCol++; - $this->SetCol($this->CurrCol); - $this->y = $this->y0; - $this->ChangeColumn = 1; - // DIRECTIONALITY RTL - if ($this->directionality == 'rtl') { - $this->ChangeColumn = -$this->ChangeColumn; - } - // *OTL* - // Stay on the page - } else { - // Go back to the first column - // Page break - if (\count($this->columnbuffer)) { - $this->printcolumnbuffer(); - } - $this->AddPage($this->CurOrientation); - $this->SetCol(0); - $this->y0 = $this->tMargin; - $this->ChangeColumn = -($this->NbCol - 1); - // DIRECTIONALITY RTL - if ($this->directionality == 'rtl') { - $this->ChangeColumn = -$this->ChangeColumn; - } - // *OTL* - } - $this->x = $this->lMargin; - } else { - $this->AddPage($this->CurOrientation); - } - } - function printcolumnbuffer() - { - // Columns ended (but page not ended) -> try to match all columns - unless disabled by using a custom column-break - if (!$this->ColActive && $this->ColumnAdjust && !$this->keepColumns) { - // Calculate adjustment to add to each column to calculate rel_y value - $this->ColDetails[0]['add_y'] = 0; - $last_col = 0; - // Recursively add previous column's height - for ($i = 1; $i < $this->NbCol; $i++) { - if (isset($this->ColDetails[$i]['bottom_margin']) && $this->ColDetails[$i]['bottom_margin']) { - // If any entries in the column - $this->ColDetails[$i]['add_y'] = $this->ColDetails[$i - 1]['bottom_margin'] - $this->y0 + $this->ColDetails[$i - 1]['add_y']; - $last_col = $i; - // Last column actually printed - } - } - // Calculate value for each position sensitive entry as though for one column - foreach ($this->columnbuffer as $key => $s) { - $t = $s['s']; - if ($t == 'ACROFORM') { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - $this->columnbuffer[$key]['s'] = ''; - } elseif (\preg_match('/BT \\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) Td/', $t)) { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - } elseif (\preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ [\\-]{0,1}\\d+\\.\\d\\d+ re/', $t)) { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - } elseif (\preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) m/', $t)) { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - } elseif (\preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) l/', $t)) { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - } elseif (\preg_match('/q \\d+\\.\\d\\d+ 0 0 \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) cm \\/(I|FO)\\d+ Do Q/', $t)) { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - } elseif (\preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ c/', $t)) { - $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; - } - } - foreach ($this->internallink as $key => $f) { - if (\is_array($f) && isset($f['col'])) { - $this->internallink[$key]['rel_y'] = $f['Y'] + $this->ColDetails[$f['col']]['add_y'] - $this->y0; - } - } - $breaks = []; - foreach ($this->breakpoints as $c => $bpa) { - foreach ($bpa as $rely) { - $breaks[] = $rely + $this->ColDetails[$c]['add_y'] - $this->y0; - } - } - if (isset($this->ColDetails[$last_col]['bottom_margin'])) { - $lcbm = $this->ColDetails[$last_col]['bottom_margin']; - } else { - $lcbm = 0; - } - $sum_h = $this->ColDetails[$last_col]['add_y'] + $lcbm - $this->y0; - // $sum_h = max($this->ColDetails[$last_col]['add_y'] + $this->ColDetails[$last_col]['bottom_margin'] - $this->y0, end($breaks)); - $target_h = $sum_h / $this->NbCol; - $cbr = []; - for ($i = 1; $i < $this->NbCol; $i++) { - $th = $sum_h * $i / $this->NbCol; - foreach ($breaks as $bk => $val) { - if ($val > $th) { - if (!$bk || $val - $th < $th - $breaks[$bk - 1]) { - $cbr[$i - 1] = $val; - } else { - $cbr[$i - 1] = $breaks[$bk - 1]; - } - break; - } - } - } - $cbr[$this->NbCol - 1] = $sum_h; - // mPDF 6 - // Avoid outputing with 1st column empty - if (isset($cbr[0]) && $cbr[0] == 0) { - for ($i = 0; $i < $this->NbCol - 1; $i++) { - $cbr[$i] = $cbr[$i + 1]; - } - } - // Now update the columns - divide into columns of approximately equal value - $last_new_col = 0; - $yadj = 0; - // mm - $xadj = 0; - $last_col_bottom = 0; - $lowest_bottom_y = 0; - $block_bottom = 0; - $newcolumn = 0; - foreach ($this->columnbuffer as $key => $s) { - if (isset($s['rel_y'])) { - // only process position sensitive data - if ($s['rel_y'] >= $cbr[$newcolumn]) { - $newcolumn++; - } else { - $newcolumn = $last_new_col; - } - $block_bottom = \max($block_bottom, $s['rel_y'] + $s['h']); - if ($this->directionality == 'rtl') { - // *OTL* - $xadj = -(($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap)); - // *OTL* - } else { - // *OTL* - $xadj = ($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap); - } - // *OTL* - if ($last_new_col != $newcolumn) { - // Added new column - $last_col_bottom = $this->columnbuffer[$key]['rel_y']; - $block_bottom = 0; - } - $yadj = $s['rel_y'] - $s['y'] - $last_col_bottom + $this->y0; - // callback function - $t = $s['s']; - // mPDF 5.7+ - $t = $this->columnAdjustPregReplace('Td', $xadj, $yadj, '/BT (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) Td/', $t); - $t = $this->columnAdjustPregReplace('re', $xadj, $yadj, '/(\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) ([\\-]{0,1}\\d+\\.\\d\\d+) re/', $t); - $t = $this->columnAdjustPregReplace('l', $xadj, $yadj, '/(\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) l/', $t); - $t = $this->columnAdjustPregReplace('img', $xadj, $yadj, '/q (\\d+\\.\\d\\d+) 0 0 (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) cm \\/(I|FO)/', $t); - $t = $this->columnAdjustPregReplace('draw', $xadj, $yadj, '/(\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) m/', $t); - $t = $this->columnAdjustPregReplace('bezier', $xadj, $yadj, '/(\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) (\\d+\\.\\d\\d+) c/', $t); - $this->columnbuffer[$key]['s'] = $t; - $this->columnbuffer[$key]['newcol'] = $newcolumn; - $this->columnbuffer[$key]['newy'] = $s['y'] + $yadj; - $last_new_col = $newcolumn; - $clb = $s['y'] + $yadj + $s['h']; - // bottom_margin of current - if (isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb > $this->ColDetails[$newcolumn]['max_bottom'] || !isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb) { - $this->ColDetails[$newcolumn]['max_bottom'] = $clb; - } - if ($clb > $lowest_bottom_y) { - $lowest_bottom_y = $clb; - } - // Adjust LINKS - if (isset($this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->PageLinks[$this->page][$ref][0] += $xadj * Mpdf::SCALE; - $this->PageLinks[$this->page][$ref][1] -= $yadj * Mpdf::SCALE; - unset($this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - // Adjust FORM FIELDS - if (isset($this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->form->forms[$ref]['x'] += $xadj; - $this->form->forms[$ref]['y'] += $yadj; - unset($this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - /* -- ANNOTATIONS -- */ - if (isset($this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])]; - if ($this->PageAnnots[$this->page][$ref]['x'] < 0) { - $this->PageAnnots[$this->page][$ref]['x'] -= $xadj; - } else { - $this->PageAnnots[$this->page][$ref]['x'] += $xadj; - } - $this->PageAnnots[$this->page][$ref]['y'] += $yadj; - // unlike PageLinks, Page annots has y values from top in mm - unset($this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - /* -- END ANNOTATIONS -- */ - } - } - /* -- BOOKMARKS -- */ - // Adjust Bookmarks - foreach ($this->col_BMoutlines as $v) { - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $this->y0, 'p' => $v['p']]; - } - /* -- END BOOKMARKS -- */ - /* -- TOC -- */ - // Adjust ToC - foreach ($this->col_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - $this->links[$v['link']][1] = $this->y0; - } - /* -- END TOC -- */ - // Adjust column length to be equal - if ($this->colvAlign == 'J') { - foreach ($this->columnbuffer as $key => $s) { - if (isset($s['rel_y'])) { - // only process position sensitive data - // Set ratio to expand y values or heights - if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom'] != $this->y0) { - $ratio = ($lowest_bottom_y - $this->y0) / ($this->ColDetails[$s['newcol']]['max_bottom'] - $this->y0); - } else { - $ratio = 1; - } - if ($ratio > 1 && $ratio <= $this->max_colH_correction) { - $yadj = ($s['newy'] - $this->y0) * ($ratio - 1); - // Adjust LINKS - if (isset($this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->PageLinks[$this->page][$ref][1] -= $yadj * Mpdf::SCALE; - // y value - $this->PageLinks[$this->page][$ref][3] *= $ratio; - // height - unset($this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - // Adjust FORM FIELDS - if (isset($this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->form->forms[$ref]['x'] += $xadj; - $this->form->forms[$ref]['y'] += $yadj; - unset($this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - /* -- ANNOTATIONS -- */ - if (isset($this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->PageAnnots[$this->page][$ref]['y'] += $yadj; - unset($this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - /* -- END ANNOTATIONS -- */ - } - } - } - foreach ($this->internallink as $key => $f) { - if (\is_array($f) && isset($f['col'])) { - $last_col_bottom = 0; - for ($nbc = 0; $nbc < $this->NbCol; $nbc++) { - if ($f['rel_y'] >= $cbr[$nbc]) { - $last_col_bottom = $cbr[$nbc]; - } - } - $yadj = $f['rel_y'] - $f['Y'] - $last_col_bottom + $this->y0; - $f['Y'] += $yadj; - unset($f['col']); - unset($f['rel_y']); - $this->internallink[$key] = $f; - } - } - $last_col = -1; - $trans_on = \false; - foreach ($this->columnbuffer as $key => $s) { - if (isset($s['rel_y'])) { - // only process position sensitive data - // Set ratio to expand y values or heights - if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom'] != $this->y0) { - $ratio = ($lowest_bottom_y - $this->y0) / ($this->ColDetails[$s['newcol']]['max_bottom'] - $this->y0); - } else { - $ratio = 1; - } - if ($ratio > 1 && $ratio <= $this->max_colH_correction) { - // Start Transformation - $this->pages[$this->page] .= $this->StartTransform(\true) . "\n"; - $this->pages[$this->page] .= $this->transformScale(100, $ratio * 100, $x = '', $this->y0, \true) . "\n"; - $trans_on = \true; - } - } - // Now output the adjusted values - $this->pages[$this->page] .= $s['s'] . "\n"; - if (isset($s['rel_y']) && $ratio > 1 && $ratio <= $this->max_colH_correction) { - // only process position sensitive data - // Stop Transformation - $this->pages[$this->page] .= $this->StopTransform(\true) . "\n"; - $trans_on = \false; - } - } - if ($trans_on) { - $this->pages[$this->page] .= $this->StopTransform(\true) . "\n"; - } - } else { - // if NOT $this->colvAlign == 'J' - // Now output the adjusted values - foreach ($this->columnbuffer as $s) { - $this->pages[$this->page] .= $s['s'] . "\n"; - } - } - if ($lowest_bottom_y > 0) { - $this->y = $lowest_bottom_y; - } - } elseif ($this->colvAlign == 'J' && $this->ColumnAdjust && !$this->keepColumns) { - // calculate the lowest bottom margin - $lowest_bottom_y = 0; - foreach ($this->columnbuffer as $key => $s) { - // Only process output data - $t = $s['s']; - if ($t == 'ACROFORM' || \preg_match('/BT \\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) Td/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ [\\-]{0,1}\\d+\\.\\d\\d+ re/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) l/', $t) || \preg_match('/q \\d+\\.\\d\\d+ 0 0 \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) cm \\/(I|FO)\\d+ Do Q/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) m/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ c/', $t)) { - $clb = $s['y'] + $s['h']; - if (isset($this->ColDetails[$s['col']]['max_bottom']) && $clb > $this->ColDetails[$s['col']]['max_bottom'] || !isset($this->ColDetails[$s['col']]['max_bottom'])) { - $this->ColDetails[$s['col']]['max_bottom'] = $clb; - } - if ($clb > $lowest_bottom_y) { - $lowest_bottom_y = $clb; - } - $this->columnbuffer[$key]['rel_y'] = $s['y']; - // Marks position sensitive data to process later - if ($t == 'ACROFORM') { - $this->columnbuffer[$key]['s'] = ''; - } - } - } - // Adjust column length equal - foreach ($this->columnbuffer as $key => $s) { - // Set ratio to expand y values or heights - if (isset($this->ColDetails[$s['col']]['max_bottom']) && $this->ColDetails[$s['col']]['max_bottom']) { - $ratio = ($lowest_bottom_y - $this->y0) / ($this->ColDetails[$s['col']]['max_bottom'] - $this->y0); - } else { - $ratio = 1; - } - if ($ratio > 1 && $ratio <= $this->max_colH_correction) { - $yadj = ($s['y'] - $this->y0) * ($ratio - 1); - // Adjust LINKS - if (isset($s['rel_y'])) { - // only process position sensitive data - // otherwise triggers for all entries in column buffer (.e.g. formatting) and makes below adjustments more than once - if (isset($this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->PageLinks[$this->page][$ref][1] -= $yadj * Mpdf::SCALE; - // y value - $this->PageLinks[$this->page][$ref][3] *= $ratio; - // height - unset($this->columnLinks[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - // Adjust FORM FIELDS - if (isset($this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->form->forms[$ref]['x'] += $xadj; - $this->form->forms[$ref]['y'] += $yadj; - unset($this->columnForms[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - /* -- ANNOTATIONS -- */ - if (isset($this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])])) { - $ref = $this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])]; - $this->PageAnnots[$this->page][$ref]['y'] += $yadj; - unset($this->columnAnnots[$s['col']][\intval($s['x'])][\intval($s['y'])]); - } - /* -- END ANNOTATIONS -- */ - } - } - } - /* -- BOOKMARKS -- */ - // Adjust Bookmarks - foreach ($this->col_BMoutlines as $v) { - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $this->y0, 'p' => $v['p']]; - } - /* -- END BOOKMARKS -- */ - /* -- TOC -- */ - // Adjust ToC - foreach ($this->col_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - $this->links[$v['link']][1] = $this->y0; - } - /* -- END TOC -- */ - $trans_on = \false; - foreach ($this->columnbuffer as $key => $s) { - if (isset($s['rel_y'])) { - // only process position sensitive data - // Set ratio to expand y values or heights - if (isset($this->ColDetails[$s['col']]['max_bottom']) && $this->ColDetails[$s['col']]['max_bottom']) { - $ratio = ($lowest_bottom_y - $this->y0) / ($this->ColDetails[$s['col']]['max_bottom'] - $this->y0); - } else { - $ratio = 1; - } - if ($ratio > 1 && $ratio <= $this->max_colH_correction) { - // Start Transformation - $this->pages[$this->page] .= $this->StartTransform(\true) . "\n"; - $this->pages[$this->page] .= $this->transformScale(100, $ratio * 100, $x = '', $this->y0, \true) . "\n"; - $trans_on = \true; - } - } - // Now output the adjusted values - $this->pages[$this->page] .= $s['s'] . "\n"; - if (isset($s['rel_y']) && $ratio > 1 && $ratio <= $this->max_colH_correction) { - // Stop Transformation - $this->pages[$this->page] .= $this->StopTransform(\true) . "\n"; - $trans_on = \false; - } - } - if ($trans_on) { - $this->pages[$this->page] .= $this->StopTransform(\true) . "\n"; - } - if ($lowest_bottom_y > 0) { - $this->y = $lowest_bottom_y; - } - } else { - // Just reproduce the page as it was - // If page has not ended but height adjustment was disabled by custom column-break - adjust y - $lowest_bottom_y = 0; - if (!$this->ColActive && (!$this->ColumnAdjust || $this->keepColumns)) { - // calculate the lowest bottom margin - foreach ($this->columnbuffer as $key => $s) { - // Only process output data - $t = $s['s']; - if ($t === 'ACROFORM' || \preg_match('/BT \\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) Td/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ [\\-]{0,1}\\d+\\.\\d\\d+ re/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) l/', $t) || \preg_match('/q \\d+\\.\\d\\d+ 0 0 \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) cm \\/(I|FO)\\d+ Do Q/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) m/', $t) || \preg_match('/\\d+\\.\\d\\d+ (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ c/', $t)) { - $clb = $s['y'] + $s['h']; - if (isset($this->ColDetails[$s['col']]['max_bottom']) && $clb > $this->ColDetails[$s['col']]['max_bottom'] || !isset($this->ColDetails[$s['col']]['max_bottom']) && $clb) { - $this->ColDetails[$s['col']]['max_bottom'] = $clb; - } - if ($clb > $lowest_bottom_y) { - $lowest_bottom_y = $clb; - } - } - } - } - foreach ($this->columnbuffer as $key => $s) { - if ($s['s'] != 'ACROFORM') { - $this->pages[$this->page] .= $s['s'] . "\n"; - } - } - if ($lowest_bottom_y > 0) { - $this->y = $lowest_bottom_y; - } - /* -- BOOKMARKS -- */ - // Output Bookmarks - foreach ($this->col_BMoutlines as $v) { - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $v['p']]; - } - /* -- END BOOKMARKS -- */ - /* -- TOC -- */ - // Output ToC - foreach ($this->col_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - } - /* -- END TOC -- */ - } - foreach ($this->internallink as $key => $f) { - if (isset($this->internallink[$key]['col'])) { - unset($this->internallink[$key]['col']); - } - if (isset($this->internallink[$key]['rel_y'])) { - unset($this->internallink[$key]['rel_y']); - } - } - $this->columnbuffer = []; - $this->ColDetails = []; - $this->columnLinks = []; - $this->columnAnnots = []; - $this->columnForms = []; - $this->col_BMoutlines = []; - $this->col_toc = []; - $this->breakpoints = []; - } - // mPDF 5.7+ - function columnAdjustPregReplace($type, $xadj, $yadj, $pattern, $subject) - { - \preg_match($pattern, $subject, $matches); - if (!\count($matches)) { - return $subject; - } - if (!isset($matches[3])) { - $matches[3] = 0; - } - if (!isset($matches[4])) { - $matches[4] = 0; - } - if (!isset($matches[5])) { - $matches[5] = 0; - } - if (!isset($matches[6])) { - $matches[6] = 0; - } - return \str_replace($matches[0], $this->columnAdjustAdd($type, Mpdf::SCALE, $xadj, $yadj, $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]), $subject); - } - /* -- END COLUMNS -- */ - // ================================================================== - /* -- TABLES -- */ - function printcellbuffer() - { - if (\count($this->cellBorderBuffer)) { - \sort($this->cellBorderBuffer); - foreach ($this->cellBorderBuffer as $cbb) { - $cba = \unpack("A16dom/nbord/A1side/ns/dbw/a6ca/A10style/dx/dy/dw/dh/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd/dover/", $cbb); - $side = $cba['side']; - $color = \str_pad($cba['ca'], 6, "\x00"); - $details = []; - $details[$side]['dom'] = (float) $cba['dom']; - $details[$side]['s'] = $cba['s']; - $details[$side]['w'] = $cba['bw']; - $details[$side]['c'] = $color; - $details[$side]['style'] = \trim($cba['style']); - $details['mbw']['BL'] = $cba['mbl']; - $details['mbw']['BR'] = $cba['mbr']; - $details['mbw']['RT'] = $cba['mrt']; - $details['mbw']['RB'] = $cba['mrb']; - $details['mbw']['TL'] = $cba['mtl']; - $details['mbw']['TR'] = $cba['mtr']; - $details['mbw']['LT'] = $cba['mlt']; - $details['mbw']['LB'] = $cba['mlb']; - $details['cellposdom'] = $cba['cpd']; - $details['p'] = $side; - if ($cba['over'] == 1) { - $details[$side]['overlay'] = \true; - } else { - $details[$side]['overlay'] = \false; - } - $this->_tableRect($cba['x'], $cba['y'], $cba['w'], $cba['h'], $cba['bord'], $details, \false, \false); - } - $this->cellBorderBuffer = []; - } - } - // ================================================================== - function printtablebuffer() - { - if (!$this->table_rotate) { - $this->pages[$this->page] .= $this->tablebuffer; - foreach ($this->tbrot_Links as $p => $l) { - foreach ($l as $v) { - $this->PageLinks[$p][] = $v; - } - } - $this->tbrot_Links = []; - /* -- ANNOTATIONS -- */ - foreach ($this->tbrot_Annots as $p => $l) { - foreach ($l as $v) { - $this->PageAnnots[$p][] = $v; - } - } - $this->tbrot_Annots = []; - /* -- END ANNOTATIONS -- */ - /* -- BOOKMARKS -- */ - // Output Bookmarks - foreach ($this->tbrot_BMoutlines as $v) { - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $v['p']]; - } - $this->tbrot_BMoutlines = []; - /* -- END BOOKMARKS -- */ - /* -- TOC -- */ - // Output ToC - foreach ($this->tbrot_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - } - $this->tbrot_toc = []; - /* -- END TOC -- */ - return; - } - // elseif rotated - $lm = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']; - $pw = $this->blk[$this->blklvl]['inner_width']; - // Start Transformation - $this->pages[$this->page] .= $this->StartTransform(\true) . "\n"; - if ($this->table_rotate > 1) { - // clockwise - if ($this->tbrot_align == 'L') { - $xadj = $this->tbrot_h; - // align L (as is) - } elseif ($this->tbrot_align == 'R') { - $xadj = $lm - $this->tbrot_x0 + $pw; - // align R - } else { - $xadj = $lm - $this->tbrot_x0 + ($pw + $this->tbrot_h) / 2; - // align C - } - $yadj = 0; - } else { - // anti-clockwise - if ($this->tbrot_align == 'L') { - $xadj = 0; - // align L (as is) - } elseif ($this->tbrot_align == 'R') { - $xadj = $lm - $this->tbrot_x0 + ($pw - $this->tbrot_h); - // align R - } else { - $xadj = $lm - $this->tbrot_x0 + ($pw - $this->tbrot_h) / 2; - // align C - } - $yadj = $this->tbrot_w; - } - $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj, \true) . "\n"; - $this->pages[$this->page] .= $this->transformRotate($this->table_rotate, $this->tbrot_x0, $this->tbrot_y0, \true) . "\n"; - // Now output the adjusted values - $this->pages[$this->page] .= $this->tablebuffer; - foreach ($this->tbrot_Links as $p => $l) { - foreach ($l as $v) { - $w = $v[2] / Mpdf::SCALE; - $h = $v[3] / Mpdf::SCALE; - $ax = $v[0] / Mpdf::SCALE - $this->tbrot_x0; - $ay = ($this->hPt - $v[1]) / Mpdf::SCALE - $this->tbrot_y0; - if ($this->table_rotate > 1) { - // clockwise - $bx = $this->tbrot_x0 + $xadj - $ay - $h; - $by = $this->tbrot_y0 + $yadj + $ax; - } else { - $bx = $this->tbrot_x0 + $xadj + $ay; - $by = $this->tbrot_y0 + $yadj - $ax - $w; - } - $v[0] = $bx * Mpdf::SCALE; - $v[1] = ($this->h - $by) * Mpdf::SCALE; - $v[2] = $h * Mpdf::SCALE; - // swap width and height - $v[3] = $w * Mpdf::SCALE; - $this->PageLinks[$p][] = $v; - } - } - $this->tbrot_Links = []; - foreach ($this->internallink as $key => $f) { - if (\is_array($f) && isset($f['tbrot'])) { - $f['Y'] = $this->tbrot_y0; - $f['PAGE'] = $this->page; - unset($f['tbrot']); - $this->internallink[$key] = $f; - } - } - /* -- ANNOTATIONS -- */ - foreach ($this->tbrot_Annots as $p => $l) { - foreach ($l as $v) { - $ax = \abs($v['x']) - $this->tbrot_x0; - // abs because -ve values are internally set and held for reference if annotMargin set - $ay = $v['y'] - $this->tbrot_y0; - if ($this->table_rotate > 1) { - // clockwise - $bx = $this->tbrot_x0 + $xadj - $ay; - $by = $this->tbrot_y0 + $yadj + $ax; - } else { - $bx = $this->tbrot_x0 + $xadj + $ay; - $by = $this->tbrot_y0 + $yadj - $ax; - } - if ($v['x'] < 0) { - $v['x'] = -$bx; - } else { - $v['x'] = $bx; - } - $v['y'] = $by; - $this->PageAnnots[$p][] = $v; - } - } - $this->tbrot_Annots = []; - /* -- END ANNOTATIONS -- */ - /* -- BOOKMARKS -- */ - // Adjust Bookmarks - foreach ($this->tbrot_BMoutlines as $v) { - $v['y'] = $this->tbrot_y0; - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $this->page]; - } - /* -- END BOOKMARKS -- */ - /* -- TOC -- */ - // Adjust ToC - uses document page number - foreach ($this->tbrot_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $this->page, 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - $this->links[$v['link']][1] = $this->tbrot_y0; - } - /* -- END TOC -- */ - $this->tbrot_BMoutlines = []; - $this->tbrot_toc = []; - // Stop Transformation - $this->pages[$this->page] .= $this->StopTransform(\true) . "\n"; - $this->y = $this->tbrot_y0 + $this->tbrot_w; - $this->x = $this->lMargin; - $this->tablebuffer = ''; - } - /** - * Keep-with-table This buffers contents of h1-6 to keep on page with table - */ - function printkwtbuffer() - { - if (!$this->kwt_moved) { - foreach ($this->kwt_buffer as $s) { - $this->pages[$this->page] .= $s['s'] . "\n"; - } - foreach ($this->kwt_Links as $p => $l) { - foreach ($l as $v) { - $this->PageLinks[$p][] = $v; - } - } - $this->kwt_Links = []; - /* -- ANNOTATIONS -- */ - foreach ($this->kwt_Annots as $p => $l) { - foreach ($l as $v) { - $this->PageAnnots[$p][] = $v; - } - } - $this->kwt_Annots = []; - /* -- END ANNOTATIONS -- */ - /* -- INDEX -- */ - // Output Reference (index) - foreach ($this->kwt_Reference as $v) { - $Present = 0; - for ($i = 0; $i < \count($this->Reference); $i++) { - if ($this->Reference[$i]['t'] == $v['t']) { - $Present = 1; - if (!\in_array($v['op'], $this->Reference[$i]['p'])) { - $this->Reference[$i]['p'][] = $v['op']; - } - } - } - if ($Present == 0) { - $this->Reference[] = ['t' => $v['t'], 'p' => [$v['op']]]; - } - } - $this->kwt_Reference = []; - /* -- END INDEX -- */ - /* -- BOOKMARKS -- */ - // Output Bookmarks - foreach ($this->kwt_BMoutlines as $v) { - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $v['p']]; - } - $this->kwt_BMoutlines = []; - /* -- END BOOKMARKS -- */ - /* -- TOC -- */ - // Output ToC - foreach ($this->kwt_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $v['p'], 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - } - $this->kwt_toc = []; - /* -- END TOC -- */ - $this->pageoutput[$this->page] = []; - // mPDF 6 - return; - } - // Start Transformation - $this->pages[$this->page] .= $this->StartTransform(\true) . "\n"; - $xadj = $this->lMargin - $this->kwt_x0; - // $yadj = $this->y - $this->kwt_y0 ; - $yadj = $this->tMargin - $this->kwt_y0; - $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj, \true) . "\n"; - // Now output the adjusted values - foreach ($this->kwt_buffer as $s) { - $this->pages[$this->page] .= $s['s'] . "\n"; - } - // Adjust hyperLinks - foreach ($this->kwt_Links as $p => $l) { - foreach ($l as $v) { - $bx = $this->kwt_x0 + $xadj; - $by = $this->kwt_y0 + $yadj; - $v[0] = $bx * Mpdf::SCALE; - $v[1] = ($this->h - $by) * Mpdf::SCALE; - $this->PageLinks[$p][] = $v; - } - } - foreach ($this->internallink as $key => $f) { - if (\is_array($f) && isset($f['kwt'])) { - $f['Y'] += $yadj; - $f['PAGE'] = $this->page; - unset($f['kwt']); - $this->internallink[$key] = $f; - } - } - /* -- ANNOTATIONS -- */ - foreach ($this->kwt_Annots as $p => $l) { - foreach ($l as $v) { - $bx = $this->kwt_x0 + $xadj; - $by = $this->kwt_y0 + $yadj; - if ($v['x'] < 0) { - $v['x'] = -$bx; - } else { - $v['x'] = $bx; - } - $v['y'] = $by; - $this->PageAnnots[$p][] = $v; - } - } - /* -- END ANNOTATIONS -- */ - /* -- BOOKMARKS -- */ - // Adjust Bookmarks - foreach ($this->kwt_BMoutlines as $v) { - if ($v['y'] != 0) { - $v['y'] += $yadj; - } - $this->BMoutlines[] = ['t' => $v['t'], 'l' => $v['l'], 'y' => $v['y'], 'p' => $this->page]; - } - /* -- END BOOKMARKS -- */ - /* -- INDEX -- */ - // Adjust Reference (index) - foreach ($this->kwt_Reference as $v) { - $Present = 0; - // Search the reference (AND Ref/PageNo) in the array - for ($i = 0; $i < \count($this->Reference); $i++) { - if ($this->Reference[$i]['t'] == $v['t']) { - $Present = 1; - if (!\in_array($this->page, $this->Reference[$i]['p'])) { - $this->Reference[$i]['p'][] = $this->page; - } - } - } - if ($Present == 0) { - $this->Reference[] = ['t' => $v['t'], 'p' => [$this->page]]; - } - } - /* -- END INDEX -- */ - /* -- TOC -- */ - // Adjust ToC - foreach ($this->kwt_toc as $v) { - $this->tableOfContents->_toc[] = ['t' => $v['t'], 'l' => $v['l'], 'p' => $this->page, 'link' => $v['link'], 'toc_id' => $v['toc_id']]; - $this->links[$v['link']][0] = $this->page; - $this->links[$v['link']][1] += $yadj; - } - /* -- END TOC -- */ - $this->kwt_Links = []; - $this->kwt_Annots = []; - $this->kwt_Reference = []; - $this->kwt_BMoutlines = []; - $this->kwt_toc = []; - // Stop Transformation - $this->pages[$this->page] .= $this->StopTransform(\true) . "\n"; - $this->kwt_buffer = []; - $this->y += $this->kwt_height; - $this->pageoutput[$this->page] = []; - // mPDF 6 - } - /* -- END TABLES -- */ - function printfloatbuffer() - { - if (\count($this->floatbuffer)) { - $this->objectbuffer = $this->floatbuffer; - $this->printobjectbuffer(\false); - $this->objectbuffer = []; - $this->floatbuffer = []; - $this->floatmargins = []; - } - } - function Circle($x, $y, $r, $style = 'S') - { - $this->Ellipse($x, $y, $r, $r, $style); - } - function Ellipse($x, $y, $rx, $ry, $style = 'S') - { - if ($style === 'F') { - $op = 'f'; - } elseif ($style === 'FD' or $style === 'DF') { - $op = 'B'; - } else { - $op = 'S'; - } - $lx = 4 / 3 * (\M_SQRT2 - 1) * $rx; - $ly = 4 / 3 * (\M_SQRT2 - 1) * $ry; - $h = $this->h; - $this->writer->write(\sprintf('%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c', ($x + $rx) * Mpdf::SCALE, ($h - $y) * Mpdf::SCALE, ($x + $rx) * Mpdf::SCALE, ($h - ($y - $ly)) * Mpdf::SCALE, ($x + $lx) * Mpdf::SCALE, ($h - ($y - $ry)) * Mpdf::SCALE, $x * Mpdf::SCALE, ($h - ($y - $ry)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x - $lx) * Mpdf::SCALE, ($h - ($y - $ry)) * Mpdf::SCALE, ($x - $rx) * Mpdf::SCALE, ($h - ($y - $ly)) * Mpdf::SCALE, ($x - $rx) * Mpdf::SCALE, ($h - $y) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x - $rx) * Mpdf::SCALE, ($h - ($y + $ly)) * Mpdf::SCALE, ($x - $lx) * Mpdf::SCALE, ($h - ($y + $ry)) * Mpdf::SCALE, $x * Mpdf::SCALE, ($h - ($y + $ry)) * Mpdf::SCALE)); - $this->writer->write(\sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c %s', ($x + $lx) * Mpdf::SCALE, ($h - ($y + $ry)) * Mpdf::SCALE, ($x + $rx) * Mpdf::SCALE, ($h - ($y + $ly)) * Mpdf::SCALE, ($x + $rx) * Mpdf::SCALE, ($h - $y) * Mpdf::SCALE, $op)); - } - /* -- DIRECTW -- */ - function AutosizeText($text, $w, $font, $style, $szfont = 72) - { - $text = ' ' . $text . ' '; - $this->SetFont($font, $style, $szfont, \false); - $text = $this->purify_utf8_text($text); - if ($this->text_input_as_HTML) { - $text = $this->all_entities_to_utf8($text); - } - if ($this->usingCoreFont) { - $text = \mb_convert_encoding($text, $this->mb_enc, 'UTF-8'); - } - // DIRECTIONALITY - if (\preg_match("/([" . $this->pregRTLchars . "])/u", $text)) { - $this->biDirectional = \true; - } - $textvar = 0; - $save_OTLtags = $this->OTLtags; - $this->OTLtags = []; - if ($this->useKerning) { - if ($this->CurrentFont['haskernGPOS']) { - $this->OTLtags['Plus'] .= ' kern'; - } else { - $textvar = $textvar | TextVars::FC_KERNING; - } - } - /* -- OTL -- */ - // Use OTL OpenType Table Layout - GSUB & GPOS - if (isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL']) { - $text = $this->otl->applyOTL($text, $this->CurrentFont['useOTL']); - $OTLdata = $this->otl->OTLdata; - } - /* -- END OTL -- */ - $this->OTLtags = $save_OTLtags; - $this->magic_reverse_dir($text, $this->directionality, $OTLdata); - $width = $this->sizeConverter->convert($w); - $loop = 0; - while ($loop == 0) { - $this->SetFont($font, $style, $szfont, \false); - $sz = $this->GetStringWidth($text, \true, $OTLdata, $textvar); - if ($sz > $w) { - $szfont--; - } else { - $loop++; - } - } - $this->SetFont($font, $style, $szfont, \true, \true); - $this->Cell($w, 0, $text, 0, 0, "C", 0, '', 0, 0, 0, 'M', 0, \false, $OTLdata, $textvar); - } - /* -- END DIRECTW -- */ - // ==================================================== - // ==================================================== - function magic_reverse_dir(&$chunk, $dir, &$chunkOTLdata) - { - /* -- OTL -- */ - if ($this->usingCoreFont) { - return 0; - } - if ($chunk == '') { - return 0; - } - if ($this->biDirectional || $dir == 'rtl') { - // check if string contains RTL text - // including any added from OTL tables (in PUA) - $pregRTLchars = $this->pregRTLchars; - if (isset($this->CurrentFont['rtlPUAstr']) && $this->CurrentFont['rtlPUAstr']) { - $pregRTLchars .= $this->CurrentFont['rtlPUAstr']; - } - if (!\preg_match("/[" . $pregRTLchars . "]/u", $chunk) && $dir != 'rtl') { - return 0; - } - // Chunk doesn't contain RTL characters - $unicode = $this->UTF8StringToArray($chunk, \false); - $isStrong = \false; - if (empty($chunkOTLdata)) { - $this->getBasicOTLdata($chunkOTLdata, $unicode, $isStrong); - } - $useGPOS = isset($this->CurrentFont['useOTL']) && $this->CurrentFont['useOTL'] & 0x80; - // NB Returned $chunk may be a shorter string (with adjusted $cOTLdata) by removal of LRE, RLE etc embedding codes. - list($chunk, $rtl_content) = $this->otl->bidiSort($unicode, $chunk, $dir, $chunkOTLdata, $useGPOS); - return $rtl_content; - } - /* -- END OTL -- */ - return 0; - } - /* -- OTL -- */ - function getBasicOTLdata(&$chunkOTLdata, $unicode, &$is_strong) - { - if (empty($this->otl)) { - $this->otl = new Otl($this, $this->fontCache); - } - $chunkOTLdata['group'] = ''; - $chunkOTLdata['GPOSinfo'] = []; - $chunkOTLdata['char_data'] = []; - foreach ($unicode as $char) { - $ucd_record = Ucdn::get_ucd_record($char); - $chunkOTLdata['char_data'][] = ['bidi_class' => $ucd_record[2], 'uni' => $char]; - if ($ucd_record[2] == 0 || $ucd_record[2] == 3 || $ucd_record[2] == 4) { - $is_strong = \true; - } - // contains strong character - if ($ucd_record[0] == Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) { - $chunkOTLdata['group'] .= 'M'; - } elseif ($char == 32 || $char == 12288) { - $chunkOTLdata['group'] .= 'S'; - } else { - $chunkOTLdata['group'] .= 'C'; - } - } - } - function _setBidiCodes($mode = 'start', $bdf = '') - { - $s = ''; - if ($mode == 'end') { - // PDF comes before PDI to close isolate-override (e.g. "LRILROPDFPDI") - if (\strpos($bdf, 'PDF') !== \false) { - $s .= UtfString::code2utf(0x202c); - } - // POP DIRECTIONAL FORMATTING - if (\strpos($bdf, 'PDI') !== \false) { - $s .= UtfString::code2utf(0x2069); - } - // POP DIRECTIONAL ISOLATE - } elseif ($mode == 'start') { - // LRI comes before LRO to open isolate-override (e.g. "LRILROPDFPDI") - if (\strpos($bdf, 'LRI') !== \false) { - // U+2066 LRI - $s .= UtfString::code2utf(0x2066); - } elseif (\strpos($bdf, 'RLI') !== \false) { - // U+2067 RLI - $s .= UtfString::code2utf(0x2067); - } elseif (\strpos($bdf, 'FSI') !== \false) { - // U+2068 FSI - $s .= UtfString::code2utf(0x2068); - } - if (\strpos($bdf, 'LRO') !== \false) { - // U+202D LRO - $s .= UtfString::code2utf(0x202d); - } elseif (\strpos($bdf, 'RLO') !== \false) { - // U+202E RLO - $s .= UtfString::code2utf(0x202e); - } elseif (\strpos($bdf, 'LRE') !== \false) { - // U+202A LRE - $s .= UtfString::code2utf(0x202a); - } elseif (\strpos($bdf, 'RLE') !== \false) { - // U+202B RLE - $s .= UtfString::code2utf(0x202b); - } - } - return $s; - } - /* -- END OTL -- */ - function SetSubstitutions() - { - $subsarray = []; - require __DIR__ . '/../data/subs_win-1252.php'; - $this->substitute = []; - foreach ($subsarray as $key => $val) { - $this->substitute[UtfString::code2utf($key)] = $val; - } - } - function SubstituteChars($html) - { - // only substitute characters between tags - if (\count($this->substitute)) { - $a = \preg_split('/(<.*?>)/ms', $html, -1, \PREG_SPLIT_DELIM_CAPTURE); - $html = ''; - foreach ($a as $i => $e) { - if ($i % 2 == 0) { - $e = \strtr($e, $this->substitute); - } - $html .= $e; - } - } - return $html; - } - function SubstituteCharsSIP(&$writehtml_a, &$writehtml_i, &$writehtml_e) - { - if (\preg_match("/^(.*?)([\\x{20000}-\\x{2FFFF}]+)(.*)/u", $writehtml_e, $m)) { - if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { - $font = $this->CurrentFont['sipext']; - if (!\in_array($font, $this->available_unifonts)) { - return 0; - } - $writehtml_a[$writehtml_i] = $writehtml_e = $m[1]; - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); - $this->subPos = $writehtml_i; - return 4; - } - } - return 0; - } - /** - * If core font is selected in document which is not onlyCoreFonts - substitute with non-core font - */ - function SubstituteCharsNonCore(&$writehtml_a, &$writehtml_i, &$writehtml_e) - { - // Ignore if in Textarea - if ($writehtml_i > 0 && \strtolower(\substr($writehtml_a[$writehtml_i - 1], 0, 8)) == 'textarea') { - return 0; - } - if (\mb_convert_encoding(\mb_convert_encoding($writehtml_e, $this->mb_enc, "UTF-8"), "UTF-8", $this->mb_enc) == $writehtml_e) { - return 0; - } - $cw =& $this->CurrentFont['cw']; - $unicode = $this->UTF8StringToArray($writehtml_e, \false); - $start = -1; - $end = 0; - $flag = 0; - $ftype = ''; - $u = []; - if (!$this->subArrMB) { - require __DIR__ . '/../data/subs_core.php'; - $this->subArrMB['a'] = $aarr; - $this->subArrMB['s'] = $sarr; - $this->subArrMB['z'] = $zarr; - } - foreach ($unicode as $c => $char) { - if (($char > 127 || $flag == 1 && $char == 32) && $char != 173 && (!isset($this->subArrMB['a'][$char]) || $flag == 1 && $char == 32) && ($char < 1536 || $char > 1791 && $char < 2304 || $char > 3455)) { - if ($flag == 0) { - $start = $c; - } - $flag = 1; - $u[] = $char; - } elseif ($flag > 0) { - $end = $c - 1; - break; - } - } - if ($flag > 0 && !$end) { - $end = \count($unicode) - 1; - } - if ($start == -1) { - return 0; - } - // Try in backup subs font - if (!\is_array($this->backupSubsFont)) { - $this->backupSubsFont = ["{$this->backupSubsFont}"]; - } - foreach ($this->backupSubsFont as $bsfctr => $bsf) { - if ($this->fonttrans[$bsf] == 'chelvetica' || $this->fonttrans[$bsf] == 'ctimes' || $this->fonttrans[$bsf] == 'ccourier') { - continue; - } - $font = $bsf; - unset($cw); - $cw = ''; - if (isset($this->fonts[$font])) { - $cw =& $this->fonts[$font]['cw']; - } elseif ($this->fontCache->has($font . '.cw.dat')) { - $cw = $this->fontCache->load($font . '.cw.dat'); - } else { - $prevFontFamily = $this->FontFamily; - $prevFontStyle = $this->currentfontstyle; - $prevFontSizePt = $this->FontSizePt; - $this->SetFont($bsf, '', '', \false); - $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, \false); - } - if (!$cw) { - continue; - } - $l = 0; - foreach ($u as $char) { - if ($char == 173 || $this->_charDefined($cw, $char) || $char > 1536 && $char < 1791 || $char > 2304 && $char < 3455) { - $l++; - } else { - if ($l == 0 && $bsfctr == \count($this->backupSubsFont) - 1) { - // Not found even in last backup font - $cont = \mb_substr($writehtml_e, $start + 1); - $writehtml_e = \mb_substr($writehtml_e, 0, $start + 1, 'UTF-8'); - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['', $cont]); - $this->subPos = $writehtml_i + 1; - return 2; - } else { - break; - } - } - } - if ($l > 0) { - $patt = \mb_substr($writehtml_e, $start, $l, 'UTF-8'); - if (\preg_match("/(.*?)(" . \preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { - $writehtml_e = $m[1]; - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); - $this->subPos = $writehtml_i + 3; - return 4; - } - } - } - unset($cw); - return 0; - } - function SubstituteCharsMB(&$writehtml_a, &$writehtml_i, &$writehtml_e) - { - // Ignore if in Textarea - if ($writehtml_i > 0 && \strtolower(\substr($writehtml_a[$writehtml_i - 1], 0, 8)) == 'textarea') { - return 0; - } - $cw =& $this->CurrentFont['cw']; - $unicode = $this->UTF8StringToArray($writehtml_e, \false); - $start = -1; - $end = 0; - $flag = 0; - $ftype = ''; - $u = []; - foreach ($unicode as $c => $char) { - if (($flag == 0 || $flag == 2) && (!$this->_charDefined($cw, $char) || $flag == 2 && $char == 32) && $this->checkSIP && $char > 131071) { - // Unicode Plane 2 (SIP) - if (\in_array($this->FontFamily, $this->available_CJK_fonts)) { - return 0; - } - if ($flag == 0) { - $start = $c; - } - $flag = 2; - $u[] = $char; - // elseif (($flag == 0 || $flag==1) && $char != 173 && !$this->_charDefined($cw,$char) && ($char<1423 || ($char>3583 && $char < 11263))) { - } elseif (($flag == 0 || $flag == 1) && $char != 173 && (!$this->_charDefined($cw, $char) || $flag == 1 && $char == 32) && ($char < 1536 || $char > 1791 && $char < 2304 || $char > 3455)) { - if ($flag == 0) { - $start = $c; - } - $flag = 1; - $u[] = $char; - } elseif ($flag > 0) { - $end = $c - 1; - break; - } - } - if ($flag > 0 && !$end) { - $end = \count($unicode) - 1; - } - if ($start == -1) { - return 0; - } - if ($flag == 2) { - // SIP - // Check if current CJK font has a ext-B related font - if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { - $font = $this->CurrentFont['sipext']; - unset($cw); - $cw = ''; - if (isset($this->fonts[$font])) { - $cw =& $this->fonts[$font]['cw']; - } elseif ($this->fontCache->has($font . '.cw.dat')) { - $cw = $this->fontCache->load($font . '.cw.dat'); - } else { - $prevFontFamily = $this->FontFamily; - $prevFontStyle = $this->currentfontstyle; - $prevFontSizePt = $this->FontSizePt; - $this->SetFont($font, '', '', \false); - $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, \false); - } - if (!$cw) { - return 0; - } - $l = 0; - foreach ($u as $char) { - if ($this->_charDefined($cw, $char) || $char > 131071) { - $l++; - } else { - break; - } - } - if ($l > 0) { - $patt = \mb_substr($writehtml_e, $start, $l); - if (\preg_match("/(.*?)(" . \preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { - $writehtml_e = $m[1]; - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); - $this->subPos = $writehtml_i + 3; - return 4; - } - } - } - // Check Backup SIP font (defined in Config\FontVariables) - if (isset($this->backupSIPFont) && $this->backupSIPFont) { - if ($this->currentfontfamily != $this->backupSIPFont) { - $font = $this->backupSIPFont; - } else { - unset($cw); - return 0; - } - unset($cw); - $cw = ''; - if (isset($this->fonts[$font])) { - $cw =& $this->fonts[$font]['cw']; - } elseif ($this->fontCache->has($font . '.cw.dat')) { - $cw = $this->fontCache->load($font . '.cw.dat'); - } else { - $prevFontFamily = $this->FontFamily; - $prevFontStyle = $this->currentfontstyle; - $prevFontSizePt = $this->FontSizePt; - $this->SetFont($this->backupSIPFont, '', '', \false); - $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, \false); - } - if (!$cw) { - return 0; - } - $l = 0; - foreach ($u as $char) { - if ($this->_charDefined($cw, $char) || $char > 131071) { - $l++; - } else { - break; - } - } - if ($l > 0) { - $patt = \mb_substr($writehtml_e, $start, $l); - if (\preg_match("/(.*?)(" . \preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { - $writehtml_e = $m[1]; - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); - $this->subPos = $writehtml_i + 3; - return 4; - } - } - } - return 0; - } - // FIRST TRY CORE FONTS (when appropriate) - if (!$this->PDFA && !$this->PDFX && !$this->biDirectional) { - // mPDF 6 - $repl = []; - if (!$this->subArrMB) { - require __DIR__ . '/../data/subs_core.php'; - $this->subArrMB['a'] = $aarr; - $this->subArrMB['s'] = $sarr; - $this->subArrMB['z'] = $zarr; - } - if (isset($this->subArrMB['a'][$u[0]])) { - $font = 'tta'; - $ftype = 'C'; - foreach ($u as $char) { - if (isset($this->subArrMB['a'][$char])) { - $repl[] = $this->subArrMB['a'][$char]; - } else { - break; - } - } - } elseif (isset($this->subArrMB['z'][$u[0]])) { - $font = 'ttz'; - $ftype = 'C'; - foreach ($u as $char) { - if (isset($this->subArrMB['z'][$char])) { - $repl[] = $this->subArrMB['z'][$char]; - } else { - break; - } - } - } elseif (isset($this->subArrMB['s'][$u[0]])) { - $font = 'tts'; - $ftype = 'C'; - foreach ($u as $char) { - if (isset($this->subArrMB['s'][$char])) { - $repl[] = $this->subArrMB['s'][$char]; - } else { - break; - } - } - } - if ($ftype == 'C') { - $patt = \mb_substr($writehtml_e, $start, \count($repl)); - if (\preg_match("/(.*?)(" . \preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { - $writehtml_e = $m[1]; - \array_splice($writehtml_a, $writehtml_i + 1, 0, [$font, \implode('|', $repl), '/' . $font, $m[3]]); - // e.g. <tts> - $this->subPos = $writehtml_i + 3; - return 4; - } - return 0; - } - } - // LASTLY TRY IN BACKUP SUBS FONT - if (!\is_array($this->backupSubsFont)) { - $this->backupSubsFont = ["{$this->backupSubsFont}"]; - } - foreach ($this->backupSubsFont as $bsfctr => $bsf) { - if ($this->currentfontfamily != $bsf) { - $font = $bsf; - } else { - continue; - } - unset($cw); - $cw = ''; - if (isset($this->fonts[$font])) { - $cw =& $this->fonts[$font]['cw']; - } elseif ($this->fontCache->has($font . '.cw.dat')) { - $cw = $this->fontCache->load($font . '.cw.dat'); - } else { - $prevFontFamily = $this->FontFamily; - $prevFontStyle = $this->currentfontstyle; - $prevFontSizePt = $this->FontSizePt; - $this->SetFont($bsf, '', '', \false); - $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, \false); - if ($this->fontCache->has($font . '.cw.dat')) { - $cw = $this->fontCache->load($font . '.cw.dat'); - } - } - if (!$cw) { - continue; - } - $l = 0; - foreach ($u as $char) { - if ($char == 173 || $this->_charDefined($cw, $char) || $char > 1536 && $char < 1791 || $char > 2304 && $char < 3455) { - // Arabic and Indic - $l++; - } else { - if ($l == 0 && $bsfctr == \count($this->backupSubsFont) - 1) { - // Not found even in last backup font - $cont = \mb_substr($writehtml_e, $start + 1); - $writehtml_e = \mb_substr($writehtml_e, 0, $start + 1); - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['', $cont]); - $this->subPos = $writehtml_i + 1; - return 2; - } else { - break; - } - } - } - if ($l > 0) { - $patt = \mb_substr($writehtml_e, $start, $l); - if (\preg_match("/(.*?)(" . \preg_quote($patt, '/') . ")(.*)/u", $writehtml_e, $m)) { - $writehtml_e = $m[1]; - \array_splice($writehtml_a, $writehtml_i + 1, 0, ['span style="font-family: ' . $font . '"', $m[2], '/span', $m[3]]); - $this->subPos = $writehtml_i + 3; - return 4; - } - } - } - unset($cw); - return 0; - } - function setHiEntitySubstitutions() - { - $entarr = (include __DIR__ . '/../data/entity_substitutions.php'); - foreach ($entarr as $key => $val) { - $this->entsearch[] = '&' . $key . ';'; - $this->entsubstitute[] = UtfString::code2utf($val); - } - } - function SubstituteHiEntities($html) - { - // converts html_entities > ASCII 127 to unicode - // Leaves in particular < to distinguish from tag marker - if (\count($this->entsearch)) { - $html = \str_replace($this->entsearch, $this->entsubstitute, $html); - } - return $html; - } - /** - * Edited v1.2 Pass by reference; option to continue if invalid UTF-8 chars - */ - function is_utf8(&$string) - { - if ($string === \mb_convert_encoding(\mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) { - return \true; - } - if ($this->ignore_invalid_utf8) { - $string = \mb_convert_encoding(\mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32"); - return \true; - } - return \false; - } - /** - * For HTML - * - * Checks string is valid UTF-8 encoded - * converts html_entities > ASCII 127 to UTF-8 - * Only exception - leaves low ASCII entities e.g. < & etc. - * Leaves in particular < to distinguish from tag marker - */ - function purify_utf8($html, $lo = \true) - { - if (!$this->is_utf8($html)) { - while (\mb_convert_encoding(\mb_convert_encoding($html, "UTF-32", "UTF-8"), "UTF-8", "UTF-32") !== $html) { - $a = @\iconv('UTF-8', 'UTF-8', $html); - $error = \error_get_last(); - if ($error && $error['message'] === 'iconv(): Detected an illegal character in input string') { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid input characters. Did you set $mpdf->in_charset properly?'); - } - $pos = $start = \strlen($a); - $err = ''; - while (\ord(\substr($html, $pos, 1)) > 128) { - $err .= '[[#' . \ord(\substr($html, $pos, 1)) . ']]'; - $pos++; - } - $this->logger->error($err, ['context' => LogContext::UTF8]); - $html = \substr($html, $pos); - } - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("HTML contains invalid UTF-8 character(s). See log for further details"); - } - $html = \preg_replace("/\r/", "", $html); - // converts html_entities > ASCII 127 to UTF-8 - // Leaves in particular < to distinguish from tag marker - $html = $this->SubstituteHiEntities($html); - // converts all &#nnn; or &#xHHH; to UTF-8 multibyte - // If $lo==true then includes ASCII < 128 - $html = UtfString::strcode2utf($html, $lo); - return $html; - } - /** - * For TEXT - */ - function purify_utf8_text($txt) - { - // Make sure UTF-8 string of characters - if (!$this->is_utf8($txt)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Text contains invalid UTF-8 character(s)"); - } - $txt = \preg_replace("/\r/", "", $txt); - return $txt; - } - function all_entities_to_utf8($txt) - { - // converts txt_entities > ASCII 127 to UTF-8 - // Leaves in particular < to distinguish from tag marker - $txt = $this->SubstituteHiEntities($txt); - // converts all &#nnn; or &#xHHH; to UTF-8 multibyte - $txt = UtfString::strcode2utf($txt); - $txt = $this->lesser_entity_decode($txt); - return $txt; - } - /* -- BARCODES -- */ - /** - * UPC/EAN barcode - * - * EAN13, EAN8, UPCA, UPCE, ISBN, ISSN - * Accepts 12 or 13 digits with or without - hyphens - */ - function WriteBarcode($code, $showtext = 1, $x = '', $y = '', $size = 1, $border = 0, $paddingL = 1, $paddingR = 1, $paddingT = 2, $paddingB = 2, $height = 1, $bgcol = \false, $col = \false, $btype = 'ISBN', $supplement = '0', $supplement_code = '', $k = 1) - { - if (empty($code)) { - return; - } - $codestr = $code; - $code = \preg_replace('/\\-/', '', $code); - $this->barcode = new Barcode(); - if ($btype == 'ISSN' || $btype == 'ISBN') { - $arrcode = $this->barcode->getBarcodeArray($code, 'EAN13'); - } else { - $arrcode = $this->barcode->getBarcodeArray($code, $btype); - } - if ($arrcode === \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Error in barcode string: ' . $codestr); - } - if (($btype === 'EAN13' || $btype === 'ISBN' || $btype === 'ISSN') && \strlen($code) === 12 || $btype == 'UPCA' && \strlen($code) === 11 || $btype == 'UPCE' && \strlen($code) === 11 || $btype == 'EAN8' && \strlen($code) === 7) { - $code .= $arrcode['checkdigit']; - if (\stristr($codestr, '-')) { - $codestr .= '-' . $arrcode['checkdigit']; - } else { - $codestr .= $arrcode['checkdigit']; - } - } - if ($btype === 'ISBN') { - $codestr = 'ISBN ' . $codestr; - } - if ($btype === 'ISSN') { - $codestr = 'ISSN ' . $codestr; - } - if (empty($x)) { - $x = $this->x; - } - if (empty($y)) { - $y = $this->y; - } - // set foreground color - $prevDrawColor = $this->DrawColor; - $prevTextColor = $this->TextColor; - $prevFillColor = $this->FillColor; - $lw = $this->LineWidth; - $this->SetLineWidth(0.01); - $size /= $k; - // in case resized in a table - $xres = $arrcode['nom-X'] * $size; - $llm = $arrcode['lightmL'] * $arrcode['nom-X'] * $size; - // Left Light margin - $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; - // Right Light margin - $bcw = $arrcode["maxw"] * $xres; - // Barcode width = Should always be 31.35mm * $size - $fbw = $bcw + $llm + $rlm; - // Full barcode width incl. light margins - $ow = $fbw + $paddingL + $paddingR; - // Full overall width incl. user-defined padding - $fbwi = $fbw - 2; - // Full barcode width incl. light margins - 2mm - for isbn string - // cf. http://www.gs1uk.org/downloads/bar_code/Bar coding getting it right.pdf - $num_height = 3 * $size; - // Height of numerals - $fbh = $arrcode['nom-H'] * $size * $height; - // Full barcode height incl. numerals - $bch = $fbh - 1.5 * $size; - // Barcode height of bars (3mm for numerals) - if ($btype == 'EAN13' && $showtext || $btype == 'ISSN' || $btype == 'ISBN') { - // Add height for ISBN string + margin from top of bars - $tisbnm = 1.5 * $size; - // Top margin between isbn (if shown) & bars - $codestr_fontsize = 2.1 * $size; - $paddingT += $codestr_fontsize + $tisbnm; - } - $oh = $fbh + $paddingT + $paddingB; - // Full overall height incl. user-defined padding - // PRINT border background color - $xpos = $x; - $ypos = $y; - if ($col) { - $this->SetDColor($col); - $this->SetTColor($col); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - if ($bgcol) { - $this->SetFColor($bgcol); - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - } - if (!$bgcol && !$col) { - // fn. called directly - not via HTML - if ($border) { - $fillb = 'DF'; - } else { - $fillb = 'F'; - } - $this->Rect($xpos, $ypos, $ow, $oh, $fillb); - } - // PRINT BARS - $xpos = $x + $paddingL + $llm; - $ypos = $y + $paddingT; - if ($col) { - $this->SetFColor($col); - } else { - $this->SetFColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - if ($arrcode !== \false) { - foreach ($arrcode["bcode"] as $v) { - $bw = $v["w"] * $xres; - if ($v["t"]) { - // draw a vertical bar - $this->Rect($xpos, $ypos, $bw, $bch, 'F'); - } - $xpos += $bw; - } - } - // print text - $prevFontFamily = $this->FontFamily; - $prevFontStyle = $this->FontStyle; - $prevFontSizePt = $this->FontSizePt; - // ISBN string - if ($btype === 'EAN13' && $showtext || $btype === 'ISBN' || $btype === 'ISSN') { - if ($this->onlyCoreFonts) { - $this->SetFont('chelvetica'); - } else { - $this->SetFont('sans'); - } - if ($bgcol) { - $this->SetFColor($bgcol); - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - } - $this->x = $x + $paddingL + 1; - // 1mm left margin (cf. $fbwi above) - // max width is $fbwi - $loop = 0; - while ($loop == 0) { - $this->SetFontSize($codestr_fontsize * 1.4 * Mpdf::SCALE, \false); - // don't write - $sz = $this->GetStringWidth($codestr); - if ($sz > $fbwi) { - $codestr_fontsize -= 0.1; - } else { - $loop++; - } - } - $this->SetFont('', '', $codestr_fontsize * 1.4 * Mpdf::SCALE, \true, \true); - // * 1.4 because font height is only 7/10 of given mm - // WORD SPACING - if ($fbwi > $sz) { - $xtra = $fbwi - $sz; - $charspacing = $xtra / (\strlen($codestr) - 1); - if ($charspacing) { - $this->writer->write(\sprintf('BT %.3F Tc ET', $charspacing * Mpdf::SCALE)); - } - } - $this->y = $y + $paddingT - $codestr_fontsize - $tisbnm; - $this->Cell($fbw, $codestr_fontsize, $codestr); - if ($charspacing) { - $this->writer->write('BT 0 Tc ET'); - } - } - // Bottom NUMERALS - // mPDF 5.7.4 - if ($this->onlyCoreFonts) { - $this->SetFont('ccourier'); - $fh = 1.3; - } else { - $this->SetFont('ocrb'); - $fh = 1.06; - } - $charRO = ''; - if ($btype === 'EAN13' || $btype === 'ISBN' || $btype === 'ISSN') { - $outerfontsize = 3; - // Inner fontsize = 3 - $outerp = $xres * 4; - $innerp = $xres * 2.5; - $textw = $bcw * 0.5 - $outerp - $innerp; - $chars = 6; - // number of numerals in each half - $charLO = \substr($code, 0, 1); - // Left Outer - $charLI = \substr($code, 1, 6); - // Left Inner - $charRI = \substr($code, 7, 6); - // Right Inner - if (!$supplement) { - $charRO = '>'; - // Right Outer - } - } elseif ($btype === 'UPCA') { - $outerfontsize = 2.3; - // Inner fontsize = 3 - $outerp = $xres * 10; - $innerp = $xres * 2.5; - $textw = $bcw * 0.5 - $outerp - $innerp; - $chars = 5; - $charLO = \substr($code, 0, 1); - // Left Outer - $charLI = \substr($code, 1, 5); - // Left Inner - $charRI = \substr($code, 6, 5); - // Right Inner - $charRO = \substr($code, 11, 1); - // Right Outer - } elseif ($btype === 'UPCE') { - $outerfontsize = 2.3; - // Inner fontsize = 3 - $outerp = $xres * 4; - $innerp = 0; - $textw = $bcw * 0.5 - $outerp - $innerp; - $chars = 3; - $upce_code = $arrcode['code']; - $charLO = \substr($code, 0, 1); - // Left Outer - $charLI = \substr($upce_code, 0, 3); - // Left Inner - $charRI = \substr($upce_code, 3, 3); - // Right Inner - $charRO = \substr($code, 11, 1); - // Right Outer - } elseif ($btype === 'EAN8') { - $outerfontsize = 3; - // Inner fontsize = 3 - $outerp = $xres * 4; - $innerp = $xres * 2.5; - $textw = $bcw * 0.5 - $outerp - $innerp; - $chars = 4; - $charLO = '<'; - // Left Outer - $charLI = \substr($code, 0, 4); - // Left Inner - $charRI = \substr($code, 4, 4); - // Right Inner - if (!$supplement) { - $charRO = '>'; - // Right Outer - } - } - $this->SetFontSize($outerfontsize / 3 * 3 * $fh * $size * Mpdf::SCALE); - // 3mm numerals (FontSize is larger to account for space above/below characters) - if (!$this->usingCoreFont) { - // character width at 3mm - $cw = $this->_getCharWidth($this->CurrentFont['cw'], 32) * 3 * $fh * $size / 1000; - } else { - $cw = 600 * 3 * $fh * $size / 1000; - } - // Outer left character - $y_text = $y + $paddingT + $bch - $num_height / 2; - $y_text_outer = $y + $paddingT + $bch - $num_height * ($outerfontsize / 3) / 2; - $this->x = $x + $paddingL - $cw * ($outerfontsize / 3) * 0.1; - // 0.1 is correction as char does not fill full width; - $this->y = $y_text_outer; - $this->Cell($cw, $num_height, $charLO); - // WORD SPACING for inner chars - $xtra = $textw - $cw * $chars; - $charspacing = $xtra / ($chars - 1); - if ($charspacing) { - $this->writer->write(\sprintf('BT %.3F Tc ET', $charspacing * Mpdf::SCALE)); - } - if ($bgcol) { - $this->SetFColor($bgcol); - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - } - $this->SetFontSize(3 * $fh * $size * Mpdf::SCALE); - // 3mm numerals (FontSize is larger to account for space above/below characters) - // Inner left half characters - $this->x = $x + $paddingL + $llm + $outerp; - $this->y = $y_text; - $this->Cell($textw, $num_height, $charLI, 0, 0, '', 1); - // Inner right half characters - $this->x = $x + $paddingL + $llm + $bcw * 0.5 + $innerp; - $this->y = $y_text; - $this->Cell($textw, $num_height, $charRI, 0, 0, '', 1); - if ($charspacing) { - $this->writer->write('BT 0 Tc ET'); - } - // Outer Right character - $this->SetFontSize($outerfontsize / 3 * 3 * $fh * $size * Mpdf::SCALE); - // 3mm numerals (FontSize is larger to account for space above/below characters) - $this->x = $x + $paddingL + $llm + $bcw + $rlm - $cw * ($outerfontsize / 3) * 0.9; - // 0.9 is correction as char does not fill full width - $this->y = $y_text_outer; - $this->Cell($cw * ($outerfontsize / 3), $num_height, $charRO, 0, 0, 'R'); - if ($supplement) { - // EAN-2 or -5 Supplement - // PRINT BARS - $supparrcode = $this->barcode->getBarcodeArray($supplement_code, 'EAN' . $supplement); - if ($supparrcode === \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Error in barcode string (supplement): ' . $codestr . ' ' . $supplement_code); - } - if (\strlen($supplement_code) != $supplement) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Barcode supplement incorrect: ' . $supplement_code); - } - $llm = $fbw - ($arrcode['lightmR'] - $supparrcode['sepM']) * $arrcode['nom-X'] * $size; - // Left Light margin - $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; - // Right Light margin - $bcw = $supparrcode["maxw"] * $xres; - // Barcode width = Should always be 31.35mm * $size - $fbw = $bcw + $llm + $rlm; - // Full barcode width incl. light margins - $ow = $fbw + $paddingL + $paddingR; - // Full overall width incl. user-defined padding - $bch = $fbh - 1.5 * $size - ($num_height + 0.5); - // Barcode height of bars (3mm for numerals) - $xpos = $x + $paddingL + $llm; - $ypos = $y + $paddingT + $num_height + 0.5; - if ($col) { - $this->SetFColor($col); - } else { - $this->SetFColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - if ($supparrcode !== \false) { - foreach ($supparrcode["bcode"] as $v) { - $bw = $v["w"] * $xres; - if ($v["t"]) { - // draw a vertical bar - $this->Rect($xpos, $ypos, $bw, $bch, 'F'); - } - $xpos += $bw; - } - } - // Characters - if ($bgcol) { - $this->SetFColor($bgcol); - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - } - $this->SetFontSize(3 * $fh * $size * Mpdf::SCALE); - // 3mm numerals (FontSize is larger to account for space above/below characters) - $this->x = $x + $paddingL + $llm; - $this->y = $y + $paddingT; - $this->Cell($bcw, $num_height, $supplement_code, 0, 0, 'C'); - // Outer Right character (light margin) - $this->SetFontSize($outerfontsize / 3 * 3 * $fh * $size * Mpdf::SCALE); - // 3mm numerals (FontSize is larger to account for space above/below characters) - $this->x = $x + $paddingL + $llm + $bcw + $rlm - $cw * 0.9; - // 0.9 is correction as char does not fill full width - $this->y = $y + $paddingT; - $this->Cell($cw * ($outerfontsize / 3), $num_height, '>', 0, 0, 'R'); - } - // Restore ************** - $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt); - $this->DrawColor = $prevDrawColor; - $this->TextColor = $prevTextColor; - $this->FillColor = $prevFillColor; - $this->SetLineWidth($lw); - $this->SetY($y); - } - /** - * POSTAL and OTHER barcodes - */ - function WriteBarcode2($code, $x = '', $y = '', $size = 1, $height = 1, $bgcol = \false, $col = \false, $btype = 'IMB', $print_ratio = '', $k = 1, $quiet_zone_left = null, $quiet_zone_right = null) - { - if (empty($code)) { - return; - } - $this->barcode = new Barcode(); - $arrcode = $this->barcode->getBarcodeArray($code, $btype, $print_ratio, $quiet_zone_left, $quiet_zone_right); - if (empty($x)) { - $x = $this->x; - } - if (empty($y)) { - $y = $this->y; - } - $prevDrawColor = $this->DrawColor; - $prevTextColor = $this->TextColor; - $prevFillColor = $this->FillColor; - $lw = $this->LineWidth; - $this->SetLineWidth(0.01); - $size /= $k; - // in case resized in a table - $xres = $arrcode['nom-X'] * $size; - if ($btype === 'IMB' || $btype === 'RM4SCC' || $btype === 'KIX' || $btype === 'POSTNET' || $btype === 'PLANET') { - $llm = $arrcode['quietL'] / $k; - // Left Quiet margin - $rlm = $arrcode['quietR'] / $k; - // Right Quiet margin - $tlm = $blm = $arrcode['quietTB'] / $k; - $height = 1; - // Overrides - } elseif (\in_array($btype, ['C128A', 'C128B', 'C128C', 'C128RAW', 'EAN128A', 'EAN128B', 'EAN128C', 'C39', 'C39+', 'C39E', 'C39E+', 'S25', 'S25+', 'I25', 'I25+', 'I25B', 'I25B+', 'C93', 'MSI', 'MSI+', 'CODABAR', 'CODE11'])) { - $llm = $arrcode['lightmL'] * $xres; - // Left Quiet margin - $rlm = $arrcode['lightmR'] * $xres; - // Right Quiet margin - $tlm = $blm = $arrcode['lightTB'] * $xres * $height; - } - $bcw = $arrcode["maxw"] * $xres; - $fbw = $bcw + $llm + $rlm; - // Full barcode width incl. light margins - $bch = $arrcode["nom-H"] * $size * $height; - $fbh = $bch + $tlm + $blm; - // Full barcode height - // PRINT border background color - $xpos = $x; - $ypos = $y; - if ($col) { - $this->SetDColor($col); - $this->SetTColor($col); - } else { - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $this->SetTColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - if ($bgcol) { - $this->SetFColor($bgcol); - } else { - $this->SetFColor($this->colorConverter->convert(255, $this->PDFAXwarnings)); - } - // PRINT BARS - if ($col) { - $this->SetFColor($col); - } else { - $this->SetFColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - } - $xpos = $x + $llm; - if ($arrcode !== \false) { - foreach ($arrcode["bcode"] as $v) { - $bw = $v["w"] * $xres; - if ($v["t"]) { - $ypos = $y + $tlm + $bch * $v['p'] / $arrcode['maxh']; - $this->Rect($xpos, $ypos, $bw, $v['h'] * $bch / $arrcode['maxh'], 'F'); - } - $xpos += $bw; - } - } - // PRINT BEARER BARS - if ($btype == 'I25B' || $btype == 'I25B+') { - $this->Rect($x, $y, $fbw, $arrcode['lightTB'] * $xres * $height, 'F'); - $this->Rect($x, $y + $tlm + $bch, $fbw, $arrcode['lightTB'] * $xres * $height, 'F'); - } - // Restore ************** - $this->DrawColor = $prevDrawColor; - $this->TextColor = $prevTextColor; - $this->FillColor = $prevFillColor; - $this->SetLineWidth($lw); - $this->SetY($y); - } - /* -- END BARCODES -- */ - function StartTransform($returnstring = \false) - { - if ($returnstring) { - return 'q'; - } else { - $this->writer->write('q'); - } - } - function StopTransform($returnstring = \false) - { - if ($returnstring) { - return 'Q'; - } else { - $this->writer->write('Q'); - } - } - function transformScale($s_x, $s_y, $x = '', $y = '', $returnstring = \false) - { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - if ($s_x == 0 or $s_y == 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Please do not use values equal to zero for scaling'); - } - $y = ($this->h - $y) * Mpdf::SCALE; - $x *= Mpdf::SCALE; - // calculate elements of transformation matrix - $s_x /= 100; - $s_y /= 100; - $tm = []; - $tm[0] = $s_x; - $tm[1] = 0; - $tm[2] = 0; - $tm[3] = $s_y; - $tm[4] = $x * (1 - $s_x); - $tm[5] = $y * (1 - $s_y); - // scale the coordinate system - if ($returnstring) { - return $this->_transform($tm, \true); - } else { - $this->_transform($tm); - } - } - function transformTranslate($t_x, $t_y, $returnstring = \false) - { - // calculate elements of transformation matrix - $tm = []; - $tm[0] = 1; - $tm[1] = 0; - $tm[2] = 0; - $tm[3] = 1; - $tm[4] = $t_x * Mpdf::SCALE; - $tm[5] = -$t_y * Mpdf::SCALE; - // translate the coordinate system - if ($returnstring) { - return $this->_transform($tm, \true); - } else { - $this->_transform($tm); - } - } - function transformRotate($angle, $x = '', $y = '', $returnstring = \false) - { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - $angle = -$angle; - $y = ($this->h - $y) * Mpdf::SCALE; - $x *= Mpdf::SCALE; - // calculate elements of transformation matrix - $tm = []; - $tm[0] = \cos(\deg2rad($angle)); - $tm[1] = \sin(\deg2rad($angle)); - $tm[2] = -$tm[1]; - $tm[3] = $tm[0]; - $tm[4] = $x + $tm[1] * $y - $tm[0] * $x; - $tm[5] = $y - $tm[0] * $y - $tm[1] * $x; - // rotate the coordinate system around ($x,$y) - if ($returnstring) { - return $this->_transform($tm, \true); - } else { - $this->_transform($tm); - } - } - /** - * mPDF 5.7.3 TRANSFORMS - */ - function transformSkew($angle_x, $angle_y, $x = '', $y = '', $returnstring = \false) - { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - $angle_x = -$angle_x; - $angle_y = -$angle_y; - $x *= Mpdf::SCALE; - $y = ($this->h - $y) * Mpdf::SCALE; - // calculate elements of transformation matrix - $tm = []; - $tm[0] = 1; - $tm[1] = \tan(\deg2rad($angle_y)); - $tm[2] = \tan(\deg2rad($angle_x)); - $tm[3] = 1; - $tm[4] = -$tm[2] * $y; - $tm[5] = -$tm[1] * $x; - // skew the coordinate system - if ($returnstring) { - return $this->_transform($tm, \true); - } else { - $this->_transform($tm); - } - } - function _transform($tm, $returnstring = \false) - { - if ($returnstring) { - return \sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]); - } else { - $this->writer->write(\sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); - } - } - // AUTOFONT ========================= - function markScriptToLang($html) - { - if ($this->onlyCoreFonts) { - return $html; - } - $n = ''; - $a = \preg_split('/<(.*?)>/ms', $html, -1, \PREG_SPLIT_DELIM_CAPTURE); - foreach ($a as $i => $e) { - if ($i % 2 == 0) { - // ignore if in Textarea - if ($i > 0 && \strtolower(\substr($a[$i - 1], 1, 8)) == 'textarea') { - $a[$i] = $e; - continue; - } - $e = UtfString::strcode2utf($e); - $e = $this->lesser_entity_decode($e); - $earr = $this->UTF8StringToArray($e, \false); - $scriptblock = 0; - $scriptblocks = []; - $scriptblocks[0] = 0; - $chardata = []; - $subchunk = 0; - $charctr = 0; - foreach ($earr as $char) { - $ucd_record = Ucdn::get_ucd_record($char); - $sbl = $ucd_record[6]; - if ($sbl && $sbl != 40 && $sbl != 102) { - if ($scriptblock == 0) { - $scriptblock = $sbl; - $scriptblocks[$subchunk] = $scriptblock; - } elseif ($scriptblock > 0 && $scriptblock != $sbl) { - // NEW (non-common) Script encountered in this chunk. - // Start a new subchunk - $subchunk++; - $scriptblock = $sbl; - $charctr = 0; - $scriptblocks[$subchunk] = $scriptblock; - } - } - $chardata[$subchunk][$charctr]['script'] = $sbl; - $chardata[$subchunk][$charctr]['uni'] = $char; - $charctr++; - } - // If scriptblock[x] = common & non-baseScript - // and scriptblock[x+1] = baseScript - // Move common script from end of x to start of x+1 - for ($sch = 0; $sch < $subchunk; $sch++) { - if ($scriptblocks[$sch] > 0 && $scriptblocks[$sch] != $this->baseScript && $scriptblocks[$sch + 1] == $this->baseScript) { - $end = \count($chardata[$sch]) - 1; - while ($chardata[$sch][$end]['script'] == 0 && $end > 1) { - // common script - $tmp = \array_pop($chardata[$sch]); - \array_unshift($chardata[$sch + 1], $tmp); - $end--; - } - } - } - $o = ''; - for ($sch = 0; $sch <= $subchunk; $sch++) { - if (isset($chardata[$sch])) { - $s = ''; - for ($j = 0; $j < \count($chardata[$sch]); $j++) { - $s .= UtfString::code2utf($chardata[$sch][$j]['uni']); - } - // ZZZ99 Undo lesser_entity_decode as above - but only for <>& - $s = \str_replace("&", "&", $s); - $s = \str_replace("<", "<", $s); - $s = \str_replace(">", ">", $s); - // Check Vietnamese if Latin script - even if Basescript - if ($scriptblocks[$sch] == Ucdn::SCRIPT_LATIN && $this->autoVietnamese && \preg_match("/([" . $this->scriptToLanguage->getLanguageDelimiters('viet') . "])/u", $s)) { - $o .= '<span lang="vi" class="lang_vi">' . $s . '</span>'; - } elseif ($scriptblocks[$sch] == Ucdn::SCRIPT_ARABIC && $this->autoArabic) { - // Check Arabic for different languages if Arabic script - even if Basescript - if (\preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('sindhi') . "]/u", $s)) { - $o .= '<span lang="sd" class="lang_sd">' . $s . '</span>'; - } elseif (\preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('urdu') . "]/u", $s)) { - $o .= '<span lang="ur" class="lang_ur">' . $s . '</span>'; - } elseif (\preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('pashto') . "]/u", $s)) { - $o .= '<span lang="ps" class="lang_ps">' . $s . '</span>'; - } elseif (\preg_match("/[" . $this->scriptToLanguage->getLanguageDelimiters('persian') . "]/u", $s)) { - $o .= '<span lang="fa" class="lang_fa">' . $s . '</span>'; - } elseif ($this->baseScript != Ucdn::SCRIPT_ARABIC && $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch])) { - $o .= '<span lang="' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '" class="lang_' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '">' . $s . '</span>'; - } else { - // Just output chars - $o .= $s; - } - } elseif ($scriptblocks[$sch] > 0 && $scriptblocks[$sch] != $this->baseScript && $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch])) { - // Identify Script block if not Basescript, and mark up as language - // Encase in <span> - $o .= '<span lang="' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '" class="lang_' . $this->scriptToLanguage->getLanguageByScript($scriptblocks[$sch]) . '">'; - $o .= $s; - $o .= '</span>'; - } else { - // Just output chars - $o .= $s; - } - } - } - $a[$i] = $o; - } else { - $a[$i] = '<' . $e . '>'; - } - } - $n = \implode('', $a); - return $n; - } - /* -- COLUMNS -- */ - /** - * Callback function from function printcolumnbuffer in mpdf - */ - function columnAdjustAdd($type, $k, $xadj, $yadj, $a, $b, $c = 0, $d = 0, $e = 0, $f = 0) - { - if ($type === 'Td') { - // xpos,ypos - $a += $xadj * $k; - $b -= $yadj * $k; - return 'BT ' . \sprintf('%.3F %.3F', $a, $b) . ' Td'; - } elseif ($type === 're') { - // xpos,ypos,width,height - $a += $xadj * $k; - $b -= $yadj * $k; - return \sprintf('%.3F %.3F %.3F %.3F', $a, $b, $c, $d) . ' re'; - } elseif ($type === 'l') { - // xpos,ypos,x2pos,y2pos - $a += $xadj * $k; - $b -= $yadj * $k; - return \sprintf('%.3F %.3F l', $a, $b); - } elseif ($type === 'img') { - // width,height,xpos,ypos - $c += $xadj * $k; - $d -= $yadj * $k; - return \sprintf('q %.3F 0 0 %.3F %.3F %.3F', $a, $b, $c, $d) . ' cm /' . $e; - } elseif ($type === 'draw') { - // xpos,ypos - $a += $xadj * $k; - $b -= $yadj * $k; - return \sprintf('%.3F %.3F m', $a, $b); - } elseif ($type === 'bezier') { - // xpos,ypos,x2pos,y2pos,x3pos,y3pos - $a += $xadj * $k; - $b -= $yadj * $k; - $c += $xadj * $k; - $d -= $yadj * $k; - $e += $xadj * $k; - $f -= $yadj * $k; - return \sprintf('%.3F %.3F %.3F %.3F %.3F %.3F', $a, $b, $c, $d, $e, $f) . ' c'; - } - } - /* -- END COLUMNS -- */ - // mPDF 5.7.3 TRANSFORMS - function ConvertAngle($s, $makepositive = \true) - { - if (\preg_match('/([\\-]*[0-9\\.]+)(deg|grad|rad)/i', $s, $m)) { - $angle = $m[1] + 0; - if (\strtolower($m[2]) == 'deg') { - $angle = $angle; - } elseif (\strtolower($m[2]) == 'grad') { - $angle *= 360 / 400; - } elseif (\strtolower($m[2]) == 'rad') { - $angle = \rad2deg($angle); - } - while ($angle >= 360) { - $angle -= 360; - } - while ($angle <= -360) { - $angle += 360; - } - if ($makepositive) { - // always returns an angle between 0 and 360deg - if ($angle < 0) { - $angle += 360; - } - } - } else { - $angle = $s + 0; - } - return $angle; - } - function lesser_entity_decode($html) - { - // supports the most used entity codes (only does ascii safe characters) - $html = \str_replace("<", "<", $html); - $html = \str_replace(">", ">", $html); - $html = \str_replace("'", "'", $html); - $html = \str_replace(""", '"', $html); - $html = \str_replace("&", "&", $html); - return $html; - } - function AdjustHTML($html, $tabSpaces = 8) - { - $limit = \ini_get('pcre.backtrack_limit'); - if (0 >= (int) $limit) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('mPDF will not process HTML with disabled pcre.backtrack_limit to prevent unexpected behaviours, please set a positive backtrack limit.', $limit)); - } - if (\strlen($html) > (int) $limit) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('The HTML code size is larger than pcre.backtrack_limit %d. You should use WriteHTML() with smaller string lengths. Pass your HTML in smaller chunks.', $limit)); - } - \preg_match_all("/(<annotation.*?>)/si", $html, $m); - if (\count($m[1])) { - for ($i = 0; $i < \count($m[1]); $i++) { - $sub = \preg_replace("/\n/si", Mpdf::OBJECT_IDENTIFIER, $m[1][$i]); - $html = \preg_replace('/' . \preg_quote($m[1][$i], '/') . '/si', $sub, $html); - } - } - \preg_match_all("/(<svg.*?<\\/svg>)/si", $html, $svgi); - if (\count($svgi[0])) { - for ($i = 0; $i < \count($svgi[0]); $i++) { - $file = $this->cache->write('/_tempSVG' . \uniqid(\random_int(1, 100000), \true) . '_' . $i . '.svg', $svgi[0][$i]); - $html = \str_replace($svgi[0][$i], '<img src="' . $file . '" />', $html); - } - } - // Remove javascript code from HTML (should not appear in the PDF file) - $html = \preg_replace('/<script.*?<\\/script>/is', '', $html); - // Remove special comments - $html = \preg_replace('/<!--mpdf/i', '', $html); - $html = \preg_replace('/mpdf-->/i', '', $html); - // Remove comments from HTML (should not appear in the PDF file) - $html = \preg_replace('/<!--.*?-->/s', '', $html); - $html = \preg_replace('/\\f/', '', $html); - // replace formfeed by nothing - $html = \preg_replace('/\\r/', '', $html); - // replace carriage return by nothing - // Well formed XHTML end tags - $html = \preg_replace('/<(br|hr)>/i', "<\\1 />", $html); - // mPDF 6 - $html = \preg_replace('/<(br|hr)\\/>/i', "<\\1 />", $html); - // Get rid of empty <thead></thead> etc - $html = \preg_replace('/<tr>\\s*<\\/tr>/i', '', $html); - $html = \preg_replace('/<thead>\\s*<\\/thead>/i', '', $html); - $html = \preg_replace('/<tfoot>\\s*<\\/tfoot>/i', '', $html); - $html = \preg_replace('/<table[^>]*>\\s*<\\/table>/i', '', $html); - // Remove spaces at end of table cells - $html = \preg_replace("/[ \n\r]+<\\/t(d|h)/", '</t\\1', $html); - $html = \preg_replace("/[ ]*<dottab\\s*[\\/]*>[ ]*/", '<dottab />', $html); - // Concatenates any Substitute characters from symbols/dingbats - $html = \str_replace('</tts><tts>', '|', $html); - $html = \str_replace('</ttz><ttz>', '|', $html); - $html = \str_replace('</tta><tta>', '|', $html); - $html = \preg_replace('/<br \\/>\\s*/is', "<br />", $html); - $html = \preg_replace('/<wbr[ \\/]*>\\s*/is', "­", $html); - // Preserve '\n's in content between the tags <pre> and </pre> - if (\preg_match('/<pre/', $html)) { - $html_a = \preg_split('/(\\<\\/?pre[^\\>]*\\>)/', $html, -1, 2); - $h = []; - $c = 0; - foreach ($html_a as $s) { - if ($c > 1 && \preg_match('/^<\\/pre/i', $s)) { - $c--; - $s = \preg_replace('/<\\/pre/i', '</innerpre', $s); - } elseif ($c > 0 && \preg_match('/^<pre/i', $s)) { - $c++; - $s = \preg_replace('/<pre/i', '<innerpre', $s); - } elseif (\preg_match('/^<pre/i', $s)) { - $c++; - } elseif (\preg_match('/^<\\/pre/i', $s)) { - $c--; - } - \array_push($h, $s); - } - $html = \implode('', $h); - } - $thereispre = \preg_match_all('#<pre(.*?)>(.*?)</pre>#si', $html, $temp); - // Preserve '\n's in content between the tags <textarea> and </textarea> - $thereistextarea = \preg_match_all('#<textarea(.*?)>(.*?)</textarea>#si', $html, $temp2); - $html = \preg_replace('/[\\n]/', ' ', $html); - // replace linefeed by spaces - $html = \preg_replace('/[\\t]/', ' ', $html); - // replace tabs by spaces - // Converts < to < when not a tag - $html = \preg_replace('/<([^!\\/a-zA-Z_:])/i', '<\\1', $html); - // mPDF 5.7.3 - $html = \preg_replace("/[ ]+/", ' ', $html); - $html = \preg_replace('/\\/li>\\s+<\\/(u|o)l/i', '/li></\\1l', $html); - $html = \preg_replace('/\\/(u|o)l>\\s+<\\/li/i', '/\\1l></li', $html); - $html = \preg_replace('/\\/li>\\s+<\\/(u|o)l/i', '/li></\\1l', $html); - $html = \preg_replace('/\\/li>\\s+<li/i', '/li><li', $html); - $html = \preg_replace('/<(u|o)l([^>]*)>[ ]+/i', '<\\1l\\2>', $html); - $html = \preg_replace('/[ ]+<(u|o)l/i', '<\\1l', $html); - // Make self closing tabs valid XHTML - // Tags which are self-closing: 1) Replaceable and 2) Non-replaced items - $selftabs = 'input|hr|img|br|barcode|dottab'; - $selftabs2 = 'indexentry|indexinsert|bookmark|watermarktext|watermarkimage|column_break|columnbreak|newcolumn|newpage|page_break|pagebreak|formfeed|columns|toc|tocpagebreak|setpageheader|setpagefooter|sethtmlpageheader|sethtmlpagefooter|annotation'; - // Fix self-closing tags which don't close themselves - $html = \preg_replace('/(<(' . $selftabs . '|' . $selftabs2 . ')[^>\\/]*)>/i', '\\1 />', $html); - // Fix self-closing tags that don't include a space between the tag name and the closing slash - $html = \preg_replace('/(<(' . $selftabs . '|' . $selftabs2 . '))\\/>/i', '\\1 />', $html); - $iterator = 0; - while ($thereispre) { - // Recover <pre attributes>content</pre> - $temp[2][$iterator] = \preg_replace('/<([^!\\/a-zA-Z_:])/', '<\\1', $temp[2][$iterator]); - // mPDF 5.7.2 // mPDF 5.7.3 - $temp[2][$iterator] = \preg_replace_callback("/^([^\n\t]*?)\t/m", [$this, 'tabs2spaces_callback'], $temp[2][$iterator]); - // mPDF 5.7+ - $temp[2][$iterator] = \preg_replace('/\\t/', \str_repeat(" ", $tabSpaces), $temp[2][$iterator]); - $temp[2][$iterator] = \preg_replace('/\\n/', "<br />", $temp[2][$iterator]); - $temp[2][$iterator] = \str_replace('\\', "\\\\", $temp[2][$iterator]); - // $html = preg_replace('#<pre(.*?)>(.*?)</pre>#si','<erp'.$temp[1][$iterator].'>'.$temp[2][$iterator].'</erp>',$html,1); - $html = \preg_replace('#<pre(.*?)>(.*?)</pre>#si', '<erp' . $temp[1][$iterator] . '>' . \str_replace('$', '\\$', $temp[2][$iterator]) . '</erp>', $html, 1); - // mPDF 5.7+ - $thereispre--; - $iterator++; - } - $iterator = 0; - while ($thereistextarea) { - // Recover <textarea attributes>content</textarea> - $temp2[2][$iterator] = \preg_replace('/\\t/', \str_repeat(" ", $tabSpaces), $temp2[2][$iterator]); - $temp2[2][$iterator] = \str_replace('\\', "\\\\", $temp2[2][$iterator]); - $html = \preg_replace('#<textarea(.*?)>(.*?)</textarea>#si', '<aeratxet' . $temp2[1][$iterator] . '>' . \trim($temp2[2][$iterator]) . '</aeratxet>', $html, 1); - $thereistextarea--; - $iterator++; - } - // Restore original tag names - $html = \str_replace("<erp", "<pre", $html); - $html = \str_replace("</erp>", "</pre>", $html); - $html = \str_replace("<aeratxet", "<textarea", $html); - $html = \str_replace("</aeratxet>", "</textarea>", $html); - $html = \str_replace("</innerpre", "</pre", $html); - $html = \str_replace("<innerpre", "<pre", $html); - $html = \preg_replace('/<textarea([^>]*)><\\/textarea>/si', '<textarea\\1> </textarea>', $html); - $html = \preg_replace('/(<table[^>]*>)\\s*(<caption)(.*?<\\/caption>)(.*?<\\/table>)/si', '\\2 position="top"\\3\\1\\4\\2 position="bottom"\\3', $html); - // *TABLES* - if ($this->use_kwt) { - $returnHtml = \preg_replace('/<(h[1-6])([^>]*(?<!\\/))(>[^>]*<\\/\\1>\\s*<table)/si', '<\\1\\2 keep-with-table="1"\\3', $html); - /* If no errors then save the return value */ - if (\preg_last_error() === \PREG_NO_ERROR) { - $html = $returnHtml; - } - } - $html = \preg_replace('/' . Mpdf::OBJECT_IDENTIFIER . '/', "\n", $html); - // Fixes <p>₹</p> which browser copes with even though it is wrong! - $html = \preg_replace("/(&#[x]{0,1}[0-9a-f]{1,5})</i", "\\1;<", $html); - return $html; - } - // mPDF 5.7+ - function tabs2spaces_callback($matches) - { - return \stripslashes($matches[1]) . \str_repeat(' ', $this->tabSpaces - \mb_strlen(\stripslashes($matches[1])) % $this->tabSpaces); - } - // mPDF 5.7+ - function date_callback($matches) - { - return \date($matches[1]); - } - // ========== OVERWRITE SEARCH STRING IN A PDF FILE ================ - function OverWrite($file_in, $search, $replacement, $dest = Destination::DOWNLOAD, $file_out = "mpdf") - { - $pdf = \file_get_contents($file_in); - if (!\is_array($search)) { - $x = $search; - $search = [$x]; - } - if (!\is_array($replacement)) { - $x = $replacement; - $replacement = [$x]; - // mPDF 5.7.4 - } - if (!$this->onlyCoreFonts && !$this->usingCoreFont) { - foreach ($search as $k => $val) { - $search[$k] = $this->writer->utf8ToUtf16BigEndian($search[$k], \false); - $search[$k] = $this->writer->escape($search[$k]); - $replacement[$k] = $this->writer->utf8ToUtf16BigEndian($replacement[$k], \false); - $replacement[$k] = $this->writer->escape($replacement[$k]); - } - } else { - foreach ($replacement as $k => $val) { - $replacement[$k] = \mb_convert_encoding($replacement[$k], $this->mb_enc, 'utf-8'); - $replacement[$k] = $this->writer->escape($replacement[$k]); - } - } - // Get xref into array - $xref = []; - \preg_match("/xref\n0 (\\d+)\n(.*?)\ntrailer/s", $pdf, $m); - $xref_objid = $m[1]; - \preg_match_all('/(\\d{10}) (\\d{5}) (f|n)/', $m[2], $x); - for ($i = 0; $i < \count($x[0]); $i++) { - $xref[] = [(int) $x[1][$i], $x[2][$i], $x[3][$i]]; - } - $changes = []; - \preg_match("/<<\\s*\\/Type\\s*\\/Pages\\s*\\/Kids\\s*\\[(.*?)\\]\\s*\\/Count/s", $pdf, $m); - \preg_match_all("/(\\d+) 0 R /s", $m[1], $o); - $objlist = $o[1]; - foreach ($objlist as $obj) { - if ($this->compress) { - \preg_match("/" . ($obj + 1) . " 0 obj\n<<\\s*\\/Filter\\s*\\/FlateDecode\\s*\\/Length (\\d+)>>\nstream\n(.*?)\nendstream\n/s", $pdf, $m); - } else { - \preg_match("/" . ($obj + 1) . " 0 obj\n<<\\s*\\/Length (\\d+)>>\nstream\n(.*?)\nendstream\n/s", $pdf, $m); - } - $s = $m[2]; - if (!$s) { - continue; - } - $oldlen = $m[1]; - if ($this->encrypted) { - $s = $this->protection->rc4($this->protection->objectKey($obj + 1), $s); - } - if ($this->compress) { - $s = \gzuncompress($s); - } - foreach ($search as $k => $val) { - $s = \str_replace($search[$k], $replacement[$k], $s); - } - if ($this->compress) { - $s = \gzcompress($s); - } - if ($this->encrypted) { - $s = $this->protection->rc4($this->protection->objectKey($obj + 1), $s); - } - $newlen = \strlen($s); - $changes[$xref[$obj + 1][0]] = $newlen - $oldlen + (\strlen($newlen) - \strlen($oldlen)); - if ($this->compress) { - $newstr = $obj + 1 . " 0 obj\n<</Filter /FlateDecode /Length " . $newlen . ">>\nstream\n" . $s . "\nendstream\n"; - } else { - $newstr = $obj + 1 . " 0 obj\n<</Length " . $newlen . ">>\nstream\n" . $s . "\nendstream\n"; - } - $pdf = \str_replace($m[0], $newstr, $pdf); - } - // Update xref in PDF - \krsort($changes); - $newxref = "xref\n0 " . $xref_objid . "\n"; - foreach ($xref as $v) { - foreach ($changes as $ck => $cv) { - if ($v[0] > $ck) { - $v[0] += $cv; - } - } - $newxref .= \sprintf('%010d', $v[0]) . ' ' . $v[1] . ' ' . $v[2] . " \n"; - } - $newxref .= "trailer"; - $pdf = \preg_replace("/xref\n0 \\d+\n.*?\ntrailer/s", $newxref, $pdf); - // Update startxref in PDF - \preg_match("/startxref\n(\\d+)\n%%EOF/s", $pdf, $m); - $startxref = $m[1]; - $startxref += \array_sum($changes); - $pdf = \preg_replace("/startxref\n(\\d+)\n%%EOF/s", "startxref\n" . $startxref . "\n%%EOF", $pdf); - // OUTPUT - switch ($dest) { - case Destination::INLINE: - if (isset($_SERVER['SERVER_NAME'])) { - // We send to a browser - \header('Content-Type: application/pdf'); - \header('Content-Length: ' . \strlen($pdf)); - \header('Content-disposition: inline; filename=' . $file_out); - } - echo $pdf; - break; - case Destination::FILE: - if (!$file_out) { - $file_out = 'mpdf.pdf'; - } - $f = \fopen($file_out, 'wb'); - if (!$f) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Unable to create output file: ' . $file_out); - } - \fwrite($f, $pdf, \strlen($pdf)); - \fclose($f); - break; - case Destination::STRING_RETURN: - return $pdf; - case Destination::DOWNLOAD: - // Download file - default: - if (isset($_SERVER['HTTP_USER_AGENT']) and \strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) { - \header('Content-Type: application/force-download'); - } else { - \header('Content-Type: application/octet-stream'); - } - \header('Content-Length: ' . \strlen($pdf)); - \header('Content-disposition: attachment; filename=' . $file_out); - echo $pdf; - break; - } - } - function Thumbnail($file, $npr = 3, $spacing = 10) - { - // $npr = number per row - $w = ($this->pgwidth + $spacing) / $npr - $spacing; - $oldlinewidth = $this->LineWidth; - $this->SetLineWidth(0.02); - $this->SetDColor($this->colorConverter->convert(0, $this->PDFAXwarnings)); - $h = 0; - $maxh = 0; - $x = $_x = $this->lMargin; - $_y = $this->tMargin; - if ($this->y == 0) { - $y = $_y; - } else { - $y = $this->y; - } - $pagecount = $this->setSourceFile($file); - for ($n = 1; $n <= $pagecount; $n++) { - $tplidx = $this->importPage($n); - $size = $this->useTemplate($tplidx, $x, $y, $w); - $this->Rect($x, $y, $size['width'], $size['height']); - $h = \max($h, $size['height']); - $maxh = \max($h, $maxh); - if ($n % $npr == 0) { - if ($y + $h + $spacing + $maxh > $this->PageBreakTrigger && $n != $pagecount) { - $this->AddPage(); - $x = $_x; - $y = $_y; - } else { - $y += $h + $spacing; - $x = $_x; - $h = 0; - } - } else { - $x += $w + $spacing; - } - } - $this->SetLineWidth($oldlinewidth); - } - function SetPageTemplate($tplidx = '') - { - if (!isset($this->importedPages[$tplidx])) { - $this->pageTemplate = ''; - return \false; - } - $this->pageTemplate = $tplidx; - } - function SetDocTemplate($file = '', $continue = 0, $continue2pages = 0) - { - $this->docTemplate = $file; - $this->docTemplateContinue = $continue; - $this->docTemplateContinue2pages = $continue2pages; - if ($this->docTemplateContinue2pages) { - // Enable continue when continue2pages is set - $this->docTemplateContinue = $this->docTemplateContinue2pages; - } - } - /* -- END IMPORTS -- */ - // JAVASCRIPT - function _set_object_javascript($string) - { - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/S /JavaScript '); - $this->writer->write('/JS ' . $this->writer->string($string)); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } - function SetJS($script) - { - $this->js = $script; - } - /** - * This function takes the last comma or dot (if any) to make a clean float, ignoring thousand separator, currency or any other letter - * - * @param string $num - * @see http://php.net/manual/de/function.floatval.php#114486 - * @return float - */ - public function toFloat($num) - { - $dotPos = \strrpos($num, '.'); - $commaPos = \strrpos($num, ','); - $sep = $dotPos > $commaPos && $dotPos ? $dotPos : ($commaPos > $dotPos && $commaPos ? $commaPos : \false); - if (!$sep) { - return \floatval(\preg_replace('/[^0-9]/', '', $num)); - } - return \floatval(\preg_replace('/[^0-9]/', '', \substr($num, 0, $sep)) . '.' . \preg_replace('/[^0-9]/', '', \substr($num, $sep + 1, \strlen($num)))); - } - public function getFontDescriptor() - { - return $this->fontDescriptor; - } - /** - * Temporarily return the method to preserve example 44 yearbook - */ - public function _out($s) - { - $this->writer->write($s); - } - /** - * @param string $html - * @param string $PAGENO - * @param string $NbPgGp - * @param string $NbPg - * @return string - */ - protected function aliasReplace($html, $PAGENO, $NbPgGp, $NbPg) - { - // Replaces for header and footer - $html = \str_replace('{PAGENO}', $PAGENO, $html); - $html = \str_replace($this->aliasNbPgGp, $NbPgGp, $html); - // {nbpg} - $html = \str_replace($this->aliasNbPg, $NbPg, $html); - // {nb} - // Replaces for the body - $html = \str_replace(\mb_convert_encoding('{PAGENO}', 'UTF-16BE', 'UTF-8'), \mb_convert_encoding($PAGENO, 'UTF-16BE', 'UTF-8'), $html); - $html = \str_replace(\mb_convert_encoding($this->aliasNbPgGp, 'UTF-16BE', 'UTF-8'), \mb_convert_encoding($NbPgGp, 'UTF-16BE', 'UTF-8'), $html); - // {nbpg} - $html = \str_replace(\mb_convert_encoding($this->aliasNbPg, 'UTF-16BE', 'UTF-8'), \mb_convert_encoding($NbPg, 'UTF-16BE', 'UTF-8'), $html); - // {nb} - // Date replace - $html = \preg_replace_callback('/\\{DATE\\s+(.*?)\\}/', [$this, 'date_callback'], $html); - // mPDF 5.7 - return $html; - } -} diff --git a/dependencies/mpdf/mpdf/src/MpdfException.php b/dependencies/mpdf/mpdf/src/MpdfException.php deleted file mode 100644 index 9a2bb74..0000000 --- a/dependencies/mpdf/mpdf/src/MpdfException.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class MpdfException extends \ErrorException -{ -} diff --git a/dependencies/mpdf/mpdf/src/MpdfImageException.php b/dependencies/mpdf/mpdf/src/MpdfImageException.php deleted file mode 100644 index 33b11f4..0000000 --- a/dependencies/mpdf/mpdf/src/MpdfImageException.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class MpdfImageException extends \WP_Ultimo\Dependencies\Mpdf\MpdfException -{ -} diff --git a/dependencies/mpdf/mpdf/src/Otl.php b/dependencies/mpdf/mpdf/src/Otl.php deleted file mode 100644 index 91d240c..0000000 --- a/dependencies/mpdf/mpdf/src/Otl.php +++ /dev/null @@ -1,6220 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -use WP_Ultimo\Dependencies\Mpdf\Strict; -use WP_Ultimo\Dependencies\Mpdf\Css\TextVars; -use WP_Ultimo\Dependencies\Mpdf\Fonts\FontCache; -use WP_Ultimo\Dependencies\Mpdf\Shaper\Indic; -use WP_Ultimo\Dependencies\Mpdf\Shaper\Myanmar; -use WP_Ultimo\Dependencies\Mpdf\Shaper\Sea; -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -class Otl -{ - use Strict; - const _OTL_OLD_SPEC_COMPAT_1 = \true; - const _DICT_NODE_TYPE_SPLIT = 0x1; - const _DICT_NODE_TYPE_LINEAR = 0x2; - const _DICT_INTERMEDIATE_MATCH = 0x3; - const _DICT_FINAL_MATCH = 0x4; - private $mpdf; - private $fontCache; - var $arabLeftJoining; - var $arabRightJoining; - var $arabTransparentJoin; - var $arabTransparent; - var $GSUBdata; - var $GPOSdata; - var $GSUBfont; - var $fontkey; - var $ttfOTLdata; - var $glyphIDtoUni; - var $_pos; - var $GSUB_offset; - var $GPOS_offset; - var $MarkAttachmentType; - var $MarkGlyphSets; - var $GlyphClassMarks; - var $GlyphClassLigatures; - var $GlyphClassBases; - var $GlyphClassComponents; - var $Ignores; - var $LuCoverage; - var $OTLdata; - var $assocLigs; - var $assocMarks; - var $shaper; - var $restrictToSyllable; - var $lbdicts; - // Line-breaking dictionaries - var $LuDataCache; - var $arabGlyphs; - var $current_fh; - var $Entry; - var $Exit; - var $GDEFdata; - var $GPOSLookups; - var $GSLuCoverage; - var $GSUB_length; - var $GSUBLookups; - var $schOTLdata; - var $lastBidiStrongType; - var $debugOTL = \false; - public function __construct(Mpdf $mpdf, FontCache $fontCache) - { - $this->mpdf = $mpdf; - $this->fontCache = $fontCache; - $this->current_fh = ''; - $this->lbdicts = []; - $this->LuDataCache = []; - } - function applyOTL($str, $useOTL) - { - if (!$this->arabLeftJoining) { - $this->arabic_initialise(); - } - $this->OTLdata = []; - if (\trim($str) == '') { - return $str; - } - if (!$useOTL) { - return $str; - } - // 1. Load GDEF data - //============================== - $this->fontkey = $this->mpdf->CurrentFont['fontkey']; - $this->glyphIDtoUni = $this->mpdf->CurrentFont['glyphIDtoUni']; - $fontCacheFilename = $this->fontkey . '.GDEFdata.json'; - if (!isset($this->GDEFdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { - $font = $this->fontCache->jsonLoad($fontCacheFilename); - $this->GSUB_offset = $this->GDEFdata[$this->fontkey]['GSUB_offset'] = $font['GSUB_offset']; - $this->GPOS_offset = $this->GDEFdata[$this->fontkey]['GPOS_offset'] = $font['GPOS_offset']; - $this->GSUB_length = $this->GDEFdata[$this->fontkey]['GSUB_length'] = $font['GSUB_length']; - $this->MarkAttachmentType = $this->GDEFdata[$this->fontkey]['MarkAttachmentType'] = $font['MarkAttachmentType']; - $this->MarkGlyphSets = $this->GDEFdata[$this->fontkey]['MarkGlyphSets'] = $font['MarkGlyphSets']; - $this->GlyphClassMarks = $this->GDEFdata[$this->fontkey]['GlyphClassMarks'] = $font['GlyphClassMarks']; - $this->GlyphClassLigatures = $this->GDEFdata[$this->fontkey]['GlyphClassLigatures'] = $font['GlyphClassLigatures']; - $this->GlyphClassComponents = $this->GDEFdata[$this->fontkey]['GlyphClassComponents'] = $font['GlyphClassComponents']; - $this->GlyphClassBases = $this->GDEFdata[$this->fontkey]['GlyphClassBases'] = $font['GlyphClassBases']; - } else { - $this->GSUB_offset = $this->GDEFdata[$this->fontkey]['GSUB_offset']; - $this->GPOS_offset = $this->GDEFdata[$this->fontkey]['GPOS_offset']; - $this->GSUB_length = $this->GDEFdata[$this->fontkey]['GSUB_length']; - $this->MarkAttachmentType = $this->GDEFdata[$this->fontkey]['MarkAttachmentType']; - $this->MarkGlyphSets = $this->GDEFdata[$this->fontkey]['MarkGlyphSets']; - $this->GlyphClassMarks = $this->GDEFdata[$this->fontkey]['GlyphClassMarks']; - $this->GlyphClassLigatures = $this->GDEFdata[$this->fontkey]['GlyphClassLigatures']; - $this->GlyphClassComponents = $this->GDEFdata[$this->fontkey]['GlyphClassComponents']; - $this->GlyphClassBases = $this->GDEFdata[$this->fontkey]['GlyphClassBases']; - } - // 2. Prepare string as HEX string and Analyse character properties - //================================================================= - $earr = $this->mpdf->UTF8StringToArray($str, \false); - $scriptblock = 0; - $scriptblocks = []; - $scriptblocks[0] = 0; - $vstr = ''; - $OTLdata = []; - $subchunk = 0; - $charctr = 0; - foreach ($earr as $char) { - $ucd_record = Ucdn::get_ucd_record($char); - $sbl = $ucd_record[6]; - // Special case - Arabic End of Ayah - if ($char == 1757) { - $sbl = Ucdn::SCRIPT_ARABIC; - } - if ($sbl && $sbl != 40 && $sbl != 102) { - if ($scriptblock == 0) { - $scriptblock = $sbl; - $scriptblocks[$subchunk] = $scriptblock; - } elseif ($scriptblock > 0 && $scriptblock != $sbl) { - // ************************************************* - // NEW (non-common) Script encountered in this chunk. Start a new subchunk - $subchunk++; - $scriptblock = $sbl; - $charctr = 0; - $scriptblocks[$subchunk] = $scriptblock; - } - } - $OTLdata[$subchunk][$charctr]['general_category'] = $ucd_record[0]; - $OTLdata[$subchunk][$charctr]['bidi_type'] = $ucd_record[2]; - //$OTLdata[$subchunk][$charctr]['combining_class'] = $ucd_record[1]; - //$OTLdata[$subchunk][$charctr]['bidi_type'] = $ucd_record[2]; - //$OTLdata[$subchunk][$charctr]['mirrored'] = $ucd_record[3]; - //$OTLdata[$subchunk][$charctr]['east_asian_width'] = $ucd_record[4]; - //$OTLdata[$subchunk][$charctr]['normalization_check'] = $ucd_record[5]; - //$OTLdata[$subchunk][$charctr]['script'] = $ucd_record[6]; - $charasstr = $this->unicode_hex($char); - if (\strpos($this->GlyphClassMarks, $charasstr) !== \false) { - $OTLdata[$subchunk][$charctr]['group'] = 'M'; - } elseif ($char == 32 || $char == 12288) { - $OTLdata[$subchunk][$charctr]['group'] = 'S'; - } else { - $OTLdata[$subchunk][$charctr]['group'] = 'C'; - } - $OTLdata[$subchunk][$charctr]['uni'] = $char; - $OTLdata[$subchunk][$charctr]['hex'] = $charasstr; - $charctr++; - } - /* PROCESS EACH SUBCHUNK WITH DIFFERENT SCRIPTS */ - for ($sch = 0; $sch <= $subchunk; $sch++) { - $this->OTLdata = $OTLdata[$sch]; - $scriptblock = $scriptblocks[$sch]; - // 3. Get Appropriate Scripts, and Shaper engine from analysing text and list of available scripts/langsys in font - //============================== - // Based on actual script block of text, select shaper (and line-breaking dictionaries) - if (Ucdn::SCRIPT_DEVANAGARI <= $scriptblock && $scriptblock <= Ucdn::SCRIPT_MALAYALAM) { - $this->shaper = "I"; - } elseif ($scriptblock == Ucdn::SCRIPT_ARABIC || $scriptblock == Ucdn::SCRIPT_SYRIAC) { - $this->shaper = "A"; - } elseif ($scriptblock == Ucdn::SCRIPT_NKO || $scriptblock == Ucdn::SCRIPT_MANDAIC) { - $this->shaper = "A"; - } elseif ($scriptblock == Ucdn::SCRIPT_KHMER) { - $this->shaper = "K"; - } elseif ($scriptblock == Ucdn::SCRIPT_THAI) { - $this->shaper = "T"; - } elseif ($scriptblock == Ucdn::SCRIPT_LAO) { - $this->shaper = "L"; - } elseif ($scriptblock == Ucdn::SCRIPT_SINHALA) { - $this->shaper = "S"; - } elseif ($scriptblock == Ucdn::SCRIPT_MYANMAR) { - $this->shaper = "M"; - } elseif ($scriptblock == Ucdn::SCRIPT_NEW_TAI_LUE) { - $this->shaper = "E"; - } elseif ($scriptblock == Ucdn::SCRIPT_CHAM) { - $this->shaper = "E"; - } elseif ($scriptblock == Ucdn::SCRIPT_TAI_THAM) { - $this->shaper = "E"; - } else { - $this->shaper = ""; - } - // Get scripttag based on actual text script - $scripttag = Ucdn::$uni_scriptblock[$scriptblock]; - $GSUBscriptTag = ''; - $GSUBlangsys = ''; - $GPOSscriptTag = ''; - $GPOSlangsys = ''; - $is_old_spec = \false; - $ScriptLang = $this->mpdf->CurrentFont['GSUBScriptLang']; - if (\count($ScriptLang)) { - list($GSUBscriptTag, $is_old_spec) = $this->_getOTLscriptTag($ScriptLang, $scripttag, $scriptblock, $this->shaper, $useOTL, 'GSUB'); - if ($this->mpdf->fontLanguageOverride && \strpos($ScriptLang[$GSUBscriptTag], $this->mpdf->fontLanguageOverride) !== \false) { - $GSUBlangsys = \str_pad($this->mpdf->fontLanguageOverride, 4); - } elseif ($GSUBscriptTag && isset($ScriptLang[$GSUBscriptTag]) && $ScriptLang[$GSUBscriptTag] != '') { - $GSUBlangsys = $this->_getOTLLangTag($this->mpdf->currentLang, $ScriptLang[$GSUBscriptTag]); - } - } - $ScriptLang = $this->mpdf->CurrentFont['GPOSScriptLang']; - // NB If after GSUB, the same script/lang exist for GPOS, just use these... - if ($GSUBscriptTag && $GSUBlangsys && isset($ScriptLang[$GSUBscriptTag]) && \strpos($ScriptLang[$GSUBscriptTag], $GSUBlangsys) !== \false) { - $GPOSlangsys = $GSUBlangsys; - $GPOSscriptTag = $GSUBscriptTag; - } elseif (\count($ScriptLang)) { - list($GPOSscriptTag, $dummy) = $this->_getOTLscriptTag($ScriptLang, $scripttag, $scriptblock, $this->shaper, $useOTL, 'GPOS'); - if ($GPOSscriptTag && $this->mpdf->fontLanguageOverride && \strpos($ScriptLang[$GPOSscriptTag], $this->mpdf->fontLanguageOverride) !== \false) { - $GPOSlangsys = \str_pad($this->mpdf->fontLanguageOverride, 4); - } elseif ($GPOSscriptTag && isset($ScriptLang[$GPOSscriptTag]) && $ScriptLang[$GPOSscriptTag] != '') { - $GPOSlangsys = $this->_getOTLLangTag($this->mpdf->currentLang, $ScriptLang[$GPOSscriptTag]); - } - } - // This is just for the font_dump_OTL utility to set script and langsys override - // $mpdf->overrideOTLsettings does not exist, this is never called - /*if (isset($this->mpdf->overrideOTLsettings) && isset($this->mpdf->overrideOTLsettings[$this->fontkey])) { - $GSUBscriptTag = $GPOSscriptTag = $this->mpdf->overrideOTLsettings[$this->fontkey]['script']; - $GSUBlangsys = $GPOSlangsys = $this->mpdf->overrideOTLsettings[$this->fontkey]['lang']; - }*/ - if (!$GSUBscriptTag && !$GSUBlangsys && !$GPOSscriptTag && !$GPOSlangsys) { - // Remove ZWJ and ZWNJ - for ($i = 0; $i < \count($this->OTLdata); $i++) { - if ($this->OTLdata[$i]['uni'] == 8204 || $this->OTLdata[$i]['uni'] == 8205) { - \array_splice($this->OTLdata, $i, 1); - } - } - $this->schOTLdata[$sch] = $this->OTLdata; - $this->OTLdata = []; - continue; - } - // Don't use MYANMAR shaper unless using v2 scripttag - if ($this->shaper == 'M' && $GSUBscriptTag != 'mym2') { - $this->shaper = ''; - } - $GSUBFeatures = isset($this->mpdf->CurrentFont['GSUBFeatures'][$GSUBscriptTag][$GSUBlangsys]) ? $this->mpdf->CurrentFont['GSUBFeatures'][$GSUBscriptTag][$GSUBlangsys] : \false; - $GPOSFeatures = isset($this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys]) ? $this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys] : \false; - $this->assocLigs = []; - // Ligatures[$posarr lpos] => nc - $this->assocMarks = []; - // assocMarks[$posarr mpos] => array(compID, ligPos) - if (!isset($this->GDEFdata[$this->fontkey]['GSUBGPOStables'])) { - $this->ttfOTLdata = $this->GDEFdata[$this->fontkey]['GSUBGPOStables'] = $this->fontCache->load($this->fontkey . '.GSUBGPOStables.dat', 'rb'); - if (!$this->ttfOTLdata) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Can\'t open file ' . $this->fontCache->tempFilename($this->fontkey . '.GSUBGPOStables.dat')); - } - } else { - $this->ttfOTLdata = $this->GDEFdata[$this->fontkey]['GSUBGPOStables']; - } - if ($this->debugOTL) { - $this->_dumpproc('BEGIN', '-', '-', '-', '-', -1, '-', 0); - } - //////////////////////////////////////////////////////////////// - ///////// LINE BREAKING FOR KHMER, THAI + LAO ///////////////// - //////////////////////////////////////////////////////////////// - // Insert U+200B at word boundaries using dictionaries - if ($this->mpdf->useDictionaryLBR && ($this->shaper == "K" || $this->shaper == "T" || $this->shaper == "L")) { - // Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries - $this->seaLineBreaking(); - } elseif ($this->mpdf->useTibetanLBR && $scriptblock == Ucdn::SCRIPT_TIBETAN) { - // Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries - $this->tibetanLineBreaking(); - } - //////////////////////////////////////////////////////////////// - ////////// GSUB ///////////////////////////////// - //////////////////////////////////////////////////////////////// - if ($useOTL & 0xff && $GSUBscriptTag && $GSUBlangsys && $GSUBFeatures) { - // 4. Load GSUB data, Coverage & Lookups - //================================================================= - $this->GSUBfont = $this->fontkey . '.GSUB.' . $GSUBscriptTag . '.' . $GSUBlangsys; - if (!isset($this->GSUBdata[$this->GSUBfont])) { - $fontCacheFilename = $this->GSUBfont . '.json'; - if ($this->fontCache->jsonHas($fontCacheFilename)) { - $font = $this->fontCache->jsonLoad($fontCacheFilename); - $this->GSUBdata[$this->GSUBfont]['rtlSUB'] = $font['rtlSUB']; - $this->GSUBdata[$this->GSUBfont]['finals'] = $font['finals']; - if ($this->shaper == 'I') { - $this->GSUBdata[$this->GSUBfont]['rphf'] = $font['rphf']; - $this->GSUBdata[$this->GSUBfont]['half'] = $font['half']; - $this->GSUBdata[$this->GSUBfont]['pref'] = $font['pref']; - $this->GSUBdata[$this->GSUBfont]['blwf'] = $font['blwf']; - $this->GSUBdata[$this->GSUBfont]['pstf'] = $font['pstf']; - } - } else { - $this->GSUBdata[$this->GSUBfont] = ['rtlSUB' => [], 'rphf' => [], 'rphf' => [], 'pref' => [], 'blwf' => [], 'pstf' => [], 'finals' => '']; - } - } - $fontCacheFilename = $this->fontkey . '.GSUBdata.json'; - if (!isset($this->GSUBdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { - $this->GSLuCoverage = $this->GSUBdata[$this->fontkey]['GSLuCoverage'] = $this->fontCache->jsonLoad($fontCacheFilename); - } else { - $this->GSLuCoverage = $this->GSUBdata[$this->fontkey]['GSLuCoverage']; - } - $this->GSUBLookups = $this->mpdf->CurrentFont['GSUBLookups']; - // 5(A). GSUB - Shaper - ARABIC - //============================== - if ($this->shaper == 'A') { - //----------------------------------------------------------------------------------- - // a. Apply initial GSUB Lookups (in order specified in lookup list but only selecting from certain tags) - //----------------------------------------------------------------------------------- - $tags = 'locl ccmp'; - $omittags = ''; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \true); - } - $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); - //----------------------------------------------------------------------------------- - // b. Apply context-specific forms GSUB Lookups (initial, isolated, medial, final) - //----------------------------------------------------------------------------------- - // Arab and Syriac are the only scripts requiring the special joining - which takes the place of - // isol fina medi init rules in GSUB (+ fin2 fin3 med2 in Syriac syrc) - $tags = 'isol fina fin2 fin3 medi med2 init'; - $omittags = ''; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \true); - } - $this->arabGlyphs = $this->GSUBdata[$this->GSUBfont]['rtlSUB']; - $gcms = \explode("| ", $this->GlyphClassMarks); - $gcm = []; - foreach ($gcms as $g) { - $gcm[\hexdec($g)] = 1; - } - $this->arabTransparentJoin = $this->arabTransparent + $gcm; - $this->arabic_shaper($usetags, $GSUBscriptTag); - //----------------------------------------------------------------------------------- - // c. Set Kashida points (after joining occurred - medi, fina, init) but before other substitutions - //----------------------------------------------------------------------------------- - //if ($scriptblock == Ucdn::SCRIPT_ARABIC ) { - for ($i = 0; $i < \count($this->OTLdata); $i++) { - // Put the kashida marker on the character BEFORE which is inserted the kashida - // Kashida marker is inverse of priority i.e. Priority 1 => 7, Priority 7 => 1. - // Priority 1 User-inserted Kashida 0640 = Tatweel - // The user entered a Kashida in a position - // Position: Before the user-inserted kashida - if ($this->OTLdata[$i]['uni'] == 0x640) { - $this->OTLdata[$i]['GPOSinfo']['kashida'] = 8; - // Put before the next character - } elseif ($this->OTLdata[$i]['uni'] == 0xfeb3 || $this->OTLdata[$i]['uni'] == 0xfeb4 || $this->OTLdata[$i]['uni'] == 0xfebb || $this->OTLdata[$i]['uni'] == 0xfebc) { - $checkpos = $i + 1; - while (isset($this->OTLdata[$checkpos]) && \strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - if (isset($this->OTLdata[$checkpos])) { - $this->OTLdata[$checkpos]['GPOSinfo']['kashida'] = 7; - // Put after marks on next character - } - } elseif ($this->OTLdata[$i]['uni'] == 0xfe94 || $this->OTLdata[$i]['uni'] == 0xfea2 || $this->OTLdata[$i]['uni'] == 0xfeaa) { - $this->OTLdata[$i]['GPOSinfo']['kashida'] = 6; - } elseif ($this->OTLdata[$i]['uni'] == 0xfe8e || $this->OTLdata[$i]['uni'] == 0xfec2 || $this->OTLdata[$i]['uni'] == 0xfede || $this->OTLdata[$i]['uni'] == 0xfeda || $this->OTLdata[$i]['uni'] == 0xfb93) { - $this->OTLdata[$i]['GPOSinfo']['kashida'] = 5; - } elseif ($this->OTLdata[$i]['uni'] == 0xfeae || $this->OTLdata[$i]['uni'] == 0xfef2 || $this->OTLdata[$i]['uni'] == 0xfef0 || $this->OTLdata[$i]['uni'] == 0xfef4 || $this->OTLdata[$i]['uni'] == 0xfbe9 || $this->OTLdata[$i]['uni'] == 0xfbfd || $this->OTLdata[$i]['uni'] == 0xfbff) { - $checkpos = $i - 1; - while (isset($this->OTLdata[$checkpos]) && \strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - if (isset($this->OTLdata[$checkpos]) && $this->OTLdata[$checkpos]['uni'] == 0xfe92) { - $this->OTLdata[$checkpos]['GPOSinfo']['kashida'] = 4; - // ******* Before preceding BAA - } - } elseif ($this->OTLdata[$i]['uni'] == 0xfeee || $this->OTLdata[$i]['uni'] == 0xfeca || $this->OTLdata[$i]['uni'] == 0xfed6 || $this->OTLdata[$i]['uni'] == 0xfed2) { - $this->OTLdata[$i]['GPOSinfo']['kashida'] = 3; - } - // Priority 7 Other connecting characters - // Final form - // Connecting to previous character - // Position: Before the character - /* This isn't in the spec, but using MS WORD as a basis, give a lower priority to the 3 characters already checked - in (5) above. Test case: - خْرَىٰ - فَتُذَكِّر - */ - if (!isset($this->OTLdata[$i]['GPOSinfo']['kashida'])) { - if (\strpos($this->GSUBdata[$this->GSUBfont]['finals'], $this->OTLdata[$i]['hex']) !== \false) { - // ANY OTHER FINAL FORM - $this->OTLdata[$i]['GPOSinfo']['kashida'] = 2; - } elseif (\strpos('0FEAE 0FEF0 0FEF2', $this->OTLdata[$i]['hex']) !== \false) { - // not already included in 5 above - $this->OTLdata[$i]['GPOSinfo']['kashida'] = 1; - } - } - } - //----------------------------------------------------------------------------------- - // d. Apply Presentation Forms GSUB Lookups (+ any discretionary) - Apply one at a time in Feature order - //----------------------------------------------------------------------------------- - $tags = 'rlig calt liga clig mset'; - $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \false); - } - $ts = \explode(' ', $usetags); - foreach ($ts as $ut) { - // - Apply one at a time in Feature order - $this->_applyGSUBrules($ut, $GSUBscriptTag, $GSUBlangsys); - } - //----------------------------------------------------------------------------------- - // e. NOT IN SPEC - // If space precedes a mark -> substitute a   before the Mark, to prevent line breaking Test: - //----------------------------------------------------------------------------------- - for ($ptr = 1; $ptr < \count($this->OTLdata); $ptr++) { - if ($this->OTLdata[$ptr]['general_category'] == Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK && $this->OTLdata[$ptr - 1]['uni'] == 32) { - $this->OTLdata[$ptr - 1]['uni'] = 0xa0; - $this->OTLdata[$ptr - 1]['hex'] = '000A0'; - } - } - } elseif ($this->shaper == 'I' || $this->shaper == 'K' || $this->shaper == 'S') { - $this->restrictToSyllable = \true; - //----------------------------------------------------------------------------------- - // a. First decompose/compose split mattras - // (normalize) ??????? Nukta/Halant order etc ?????????????????????????????????????????????????????????????????????????? - //----------------------------------------------------------------------------------- - for ($ptr = 0; $ptr < \count($this->OTLdata); $ptr++) { - $char = $this->OTLdata[$ptr]['uni']; - $sub = Indic::decompose_indic($char); - if ($sub) { - $newinfo = []; - for ($i = 0; $i < \count($sub); $i++) { - $newinfo[$i] = []; - $ucd_record = Ucdn::get_ucd_record($sub[$i]); - $newinfo[$i]['general_category'] = $ucd_record[0]; - $newinfo[$i]['bidi_type'] = $ucd_record[2]; - $charasstr = $this->unicode_hex($sub[$i]); - if (\strpos($this->GlyphClassMarks, $charasstr) !== \false) { - $newinfo[$i]['group'] = 'M'; - } else { - $newinfo[$i]['group'] = 'C'; - } - $newinfo[$i]['uni'] = $sub[$i]; - $newinfo[$i]['hex'] = $charasstr; - } - \array_splice($this->OTLdata, $ptr, 1, $newinfo); - $ptr += \count($sub) - 1; - } - /* Only Composition-exclusion exceptions that we want to recompose. */ - if ($this->shaper == 'I') { - if ($char == 0x9af && isset($this->OTLdata[$ptr + 1]) && $this->OTLdata[$ptr + 1]['uni'] == 0x9bc) { - $sub = 0x9df; - $newinfo = []; - $newinfo[0] = []; - $ucd_record = Ucdn::get_ucd_record($sub); - $newinfo[0]['general_category'] = $ucd_record[0]; - $newinfo[0]['bidi_type'] = $ucd_record[2]; - $newinfo[0]['group'] = 'C'; - $newinfo[0]['uni'] = $sub; - $newinfo[0]['hex'] = $this->unicode_hex($sub); - \array_splice($this->OTLdata, $ptr, 2, $newinfo); - } - } - } - //----------------------------------------------------------------------------------- - // b. Analyse characters - group as syllables/clusters (Indic); invalid diacritics; add dotted circle - //----------------------------------------------------------------------------------- - $indic_category_string = ''; - foreach ($this->OTLdata as $eid => $c) { - Indic::set_indic_properties($this->OTLdata[$eid], $scriptblock); - // sets ['indic_category'] and ['indic_position'] - //$c['general_category'] - //$c['combining_class'] - //$c['uni'] = $char; - $indic_category_string .= Indic::$indic_category_char[$this->OTLdata[$eid]['indic_category']]; - } - $broken_syllables = \false; - if ($this->shaper == 'I') { - Indic::set_syllables($this->OTLdata, $indic_category_string, $broken_syllables); - } elseif ($this->shaper == 'S') { - Indic::set_syllables_sinhala($this->OTLdata, $indic_category_string, $broken_syllables); - } elseif ($this->shaper == 'K') { - Indic::set_syllables_khmer($this->OTLdata, $indic_category_string, $broken_syllables); - } - $indic_category_string = ''; - //----------------------------------------------------------------------------------- - // c. Initial Re-ordering (Indic / Khmer / Sinhala) - //----------------------------------------------------------------------------------- - // Find base consonant - // Decompose/compose and reorder Matras - // Reorder marks to canonical order - $indic_config = Indic::$indic_configs[$scriptblock]; - $dottedcircle = \false; - if ($broken_syllables) { - if ($this->mpdf->_charDefined($this->mpdf->fonts[$this->fontkey]['cw'], 0x25cc)) { - $dottedcircle = []; - $ucd_record = Ucdn::get_ucd_record(0x25cc); - $dottedcircle[0]['general_category'] = $ucd_record[0]; - $dottedcircle[0]['bidi_type'] = $ucd_record[2]; - $dottedcircle[0]['group'] = 'C'; - $dottedcircle[0]['uni'] = 0x25cc; - $dottedcircle[0]['indic_category'] = Indic::OT_DOTTEDCIRCLE; - $dottedcircle[0]['indic_position'] = Indic::POS_BASE_C; - $dottedcircle[0]['hex'] = '025CC'; - // TEMPORARY ***** - } - } - Indic::initial_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $broken_syllables, $indic_config, $scriptblock, $is_old_spec, $dottedcircle); - //----------------------------------------------------------------------------------- - // d. Apply initial and basic shaping forms GSUB Lookups (one at a time) - //----------------------------------------------------------------------------------- - if ($this->shaper == 'I' || $this->shaper == 'S') { - $tags = 'locl ccmp nukt akhn rphf rkrf pref blwf half pstf vatu cjct'; - } elseif ($this->shaper == 'K') { - $tags = 'locl ccmp pref blwf abvf pstf cfar'; - } - $this->_applyGSUBrulesIndic($tags, $GSUBscriptTag, $GSUBlangsys, $is_old_spec); - //----------------------------------------------------------------------------------- - // e. Final Re-ordering (Indic / Khmer / Sinhala) - //----------------------------------------------------------------------------------- - // Reorder matras - // Reorder reph - // Reorder pre-base reordering consonants: - Indic::final_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $indic_config, $scriptblock, $is_old_spec); - //----------------------------------------------------------------------------------- - // f. Apply 'init' feature to first syllable in word (indicated by ['mask']) Indic::FLAG(Indic::INIT); - //----------------------------------------------------------------------------------- - if ($this->shaper == 'I' || $this->shaper == 'S') { - $tags = 'init'; - $this->_applyGSUBrulesIndic($tags, $GSUBscriptTag, $GSUBlangsys, $is_old_spec); - } - //----------------------------------------------------------------------------------- - // g. Apply Presentation Forms GSUB Lookups (+ any discretionary) - //----------------------------------------------------------------------------------- - $tags = 'pres abvs blws psts haln rlig calt liga clig mset'; - $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \false); - } - if ($this->shaper == 'K') { - // Features are applied one at a time, working through each codepoint - $this->_applyGSUBrulesSingly($usetags, $GSUBscriptTag, $GSUBlangsys); - } else { - $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); - } - $this->restrictToSyllable = \false; - } elseif ($this->shaper == 'M') { - $this->restrictToSyllable = \true; - //----------------------------------------------------------------------------------- - // a. Analyse characters - group as syllables/clusters (Myanmar); invalid diacritics; add dotted circle - //----------------------------------------------------------------------------------- - $myanmar_category_string = ''; - foreach ($this->OTLdata as $eid => $c) { - Myanmar::set_myanmar_properties($this->OTLdata[$eid]); - // sets ['myanmar_category'] and ['myanmar_position'] - $myanmar_category_string .= Myanmar::$myanmar_category_char[$this->OTLdata[$eid]['myanmar_category']]; - } - $broken_syllables = \false; - Myanmar::set_syllables($this->OTLdata, $myanmar_category_string, $broken_syllables); - $myanmar_category_string = ''; - //----------------------------------------------------------------------------------- - // b. Re-ordering (Myanmar mym2) - //----------------------------------------------------------------------------------- - $dottedcircle = \false; - if ($broken_syllables) { - if ($this->mpdf->_charDefined($this->mpdf->fonts[$this->fontkey]['cw'], 0x25cc)) { - $dottedcircle = []; - $ucd_record = Ucdn::get_ucd_record(0x25cc); - $dottedcircle[0]['general_category'] = $ucd_record[0]; - $dottedcircle[0]['bidi_type'] = $ucd_record[2]; - $dottedcircle[0]['group'] = 'C'; - $dottedcircle[0]['uni'] = 0x25cc; - $dottedcircle[0]['myanmar_category'] = Myanmar::OT_DOTTEDCIRCLE; - $dottedcircle[0]['myanmar_position'] = Myanmar::POS_BASE_C; - $dottedcircle[0]['hex'] = '025CC'; - } - } - Myanmar::reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $broken_syllables, $dottedcircle); - //----------------------------------------------------------------------------------- - // c. Apply initial and basic shaping forms GSUB Lookups (one at a time) - //----------------------------------------------------------------------------------- - $tags = 'locl ccmp rphf pref blwf pstf'; - $this->_applyGSUBrulesMyanmar($tags, $GSUBscriptTag, $GSUBlangsys); - //----------------------------------------------------------------------------------- - // d. Apply Presentation Forms GSUB Lookups (+ any discretionary) - //----------------------------------------------------------------------------------- - $tags = 'pres abvs blws psts haln rlig calt liga clig mset'; - $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \false); - } - $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); - $this->restrictToSyllable = \false; - } elseif ($this->shaper == 'E') { - /* HarfBuzz says: If the designer designed the font for the 'DFLT' script, - * use the default shaper. Otherwise, use the SEA shaper. - * Note that for some simple scripts, there may not be *any* - * GSUB/GPOS needed, so there may be no scripts found! */ - $this->restrictToSyllable = \true; - //----------------------------------------------------------------------------------- - // a. Analyse characters - group as syllables/clusters (Indic); invalid diacritics; add dotted circle - //----------------------------------------------------------------------------------- - $sea_category_string = ''; - foreach ($this->OTLdata as $eid => $c) { - Sea::set_sea_properties($this->OTLdata[$eid], $scriptblock); - // sets ['sea_category'] and ['sea_position'] - //$c['general_category'] - //$c['combining_class'] - //$c['uni'] = $char; - $sea_category_string .= Sea::$sea_category_char[$this->OTLdata[$eid]['sea_category']]; - } - $broken_syllables = \false; - Sea::set_syllables($this->OTLdata, $sea_category_string, $broken_syllables); - $sea_category_string = ''; - //----------------------------------------------------------------------------------- - // b. Apply locl and ccmp shaping forms - before initial re-ordering; GSUB Lookups (one at a time) - //----------------------------------------------------------------------------------- - $tags = 'locl ccmp'; - $this->_applyGSUBrulesSingly($tags, $GSUBscriptTag, $GSUBlangsys); - //----------------------------------------------------------------------------------- - // c. Initial Re-ordering - //----------------------------------------------------------------------------------- - // Find base consonant - // Decompose/compose and reorder Matras - // Reorder marks to canonical order - $dottedcircle = \false; - if ($broken_syllables) { - if ($this->mpdf->_charDefined($this->mpdf->fonts[$this->fontkey]['cw'], 0x25cc)) { - $dottedcircle = []; - $ucd_record = Ucdn::get_ucd_record(0x25cc); - $dottedcircle[0]['general_category'] = $ucd_record[0]; - $dottedcircle[0]['bidi_type'] = $ucd_record[2]; - $dottedcircle[0]['group'] = 'C'; - $dottedcircle[0]['uni'] = 0x25cc; - $dottedcircle[0]['sea_category'] = Sea::OT_GB; - $dottedcircle[0]['sea_position'] = Sea::POS_BASE_C; - $dottedcircle[0]['hex'] = '025CC'; - // TEMPORARY ***** - } - } - Sea::initial_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $broken_syllables, $scriptblock, $dottedcircle); - //----------------------------------------------------------------------------------- - // d. Apply basic shaping forms GSUB Lookups (one at a time) - //----------------------------------------------------------------------------------- - $tags = 'pref abvf blwf pstf'; - $this->_applyGSUBrulesSingly($tags, $GSUBscriptTag, $GSUBlangsys); - //----------------------------------------------------------------------------------- - // e. Final Re-ordering - //----------------------------------------------------------------------------------- - Sea::final_reordering($this->OTLdata, $this->GSUBdata[$this->GSUBfont], $scriptblock); - //----------------------------------------------------------------------------------- - // f. Apply Presentation Forms GSUB Lookups (+ any discretionary) - //----------------------------------------------------------------------------------- - $tags = 'pres abvs blws psts'; - $omittags = 'locl ccmp nukt akhn rphf rkrf pref blwf abvf half pstf cfar vatu cjct init medi fina isol med2 fin2 fin3 ljmo vjmo tjmo'; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \false); - } - $this->_applyGSUBrules($usetags, $GSUBscriptTag, $GSUBlangsys); - $this->restrictToSyllable = \false; - } else { - // DEFAULT - //----------------------------------------------------------------------------------- - // a. First decompose/compose in Thai / Lao - Tibetan - //----------------------------------------------------------------------------------- - // Decomposition for THAI or LAO - /* This function implements the shaping logic documented here: - * - * http://linux.thai.net/~thep/th-otf/shaping.html - * - * The first shaping rule listed there is needed even if the font has Thai - * OpenType tables. - * - * - * The following is NOT specified in the MS OT Thai spec, however, it seems - * to be what Uniscribe and other engines implement. According to Eric Muller: - * - * When you have a SARA AM, decompose it in NIKHAHIT + SARA AA, *and* move the - * NIKHAHIT backwards over any tone mark (0E48-0E4B). - * - * <0E14, 0E4B, 0E33> -> <0E14, 0E4D, 0E4B, 0E32> - * - * This reordering is legit only when the NIKHAHIT comes from a SARA AM, not - * when it's there to start with. The string <0E14, 0E4B, 0E4D> is probably - * not what a user wanted, but the rendering is nevertheless nikhahit above - * chattawa. - * - * Same for Lao. - * - * Thai Lao - * SARA AM: U+0E33 U+0EB3 - * SARA AA: U+0E32 U+0EB2 - * Nikhahit: U+0E4D U+0ECD - * - * Testing shows that Uniscribe reorder the following marks: - * Thai: <0E31,0E34..0E37,0E47..0E4E> - * Lao: <0EB1,0EB4..0EB7,0EC7..0ECE> - * - * Lao versions are the same as Thai + 0x80. - */ - if ($this->shaper == 'T' || $this->shaper == 'L') { - for ($ptr = 0; $ptr < \count($this->OTLdata); $ptr++) { - $char = $this->OTLdata[$ptr]['uni']; - if (($char & ~0x80) == 0xe33) { - // if SARA_AM (U+0E33 or U+0EB3) - $NIKHAHIT = $char + 0x1a; - $SARA_AA = $char - 1; - $sub = [$SARA_AA, $NIKHAHIT]; - $newinfo = []; - $ucd_record = Ucdn::get_ucd_record($sub[0]); - $newinfo[0]['general_category'] = $ucd_record[0]; - $newinfo[0]['bidi_type'] = $ucd_record[2]; - $charasstr = $this->unicode_hex($sub[0]); - if (\strpos($this->GlyphClassMarks, $charasstr) !== \false) { - $newinfo[0]['group'] = 'M'; - } else { - $newinfo[0]['group'] = 'C'; - } - $newinfo[0]['uni'] = $sub[0]; - $newinfo[0]['hex'] = $charasstr; - $this->OTLdata[$ptr] = $newinfo[0]; - // Substitute SARA_AM => SARA_AA - $ntones = 0; - // number of (preceding) tone marks - // IS_TONE_MARK ((x) & ~0x0080, 0x0E34 - 0x0E37, 0x0E47 - 0x0E4E, 0x0E31) - while (isset($this->OTLdata[$ptr - 1 - $ntones]) && (($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x80) == 0xe31 || ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x80) >= 0xe34 && ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x80) <= 0xe37 || ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x80) >= 0xe47 && ($this->OTLdata[$ptr - 1 - $ntones]['uni'] & ~0x80) <= 0xe4e)) { - $ntones++; - } - $newinfo = []; - $ucd_record = Ucdn::get_ucd_record($sub[1]); - $newinfo[0]['general_category'] = $ucd_record[0]; - $newinfo[0]['bidi_type'] = $ucd_record[2]; - $charasstr = $this->unicode_hex($sub[1]); - if (\strpos($this->GlyphClassMarks, $charasstr) !== \false) { - $newinfo[0]['group'] = 'M'; - } else { - $newinfo[0]['group'] = 'C'; - } - $newinfo[0]['uni'] = $sub[1]; - $newinfo[0]['hex'] = $charasstr; - // Insert NIKAHIT - \array_splice($this->OTLdata, $ptr - $ntones, 0, $newinfo); - $ptr++; - } - } - } - if ($scriptblock == Ucdn::SCRIPT_TIBETAN) { - // ========================= - // Reordering TIBETAN - // ========================= - // Tibetan does not need to need a shaper generally, as long as characters are presented in the correct order - // so we will do one minor change here: - // From ICU: If the present character is a number, and the next character is a pre-number combining mark - // then the two characters are reordered - // From MS OTL spec the following are Digit modifiers (Md): 0F18–0F19, 0F3E–0F3F - // Digits: 0F20–0F33 - // On testing only 0x0F3F (pre-based mark) seems to need re-ordering - for ($ptr = 0; $ptr < \count($this->OTLdata) - 1; $ptr++) { - if (Indic::in_range($this->OTLdata[$ptr]['uni'], 0xf20, 0xf33) && $this->OTLdata[$ptr + 1]['uni'] == 0xf3f) { - $tmp = $this->OTLdata[$ptr + 1]; - $this->OTLdata[$ptr + 1] = $this->OTLdata[$ptr]; - $this->OTLdata[$ptr] = $tmp; - } - } - // ========================= - // Decomposition for TIBETAN - // ========================= - /* Recommended, but does not seem to change anything... - for($ptr=0; $ptr<count($this->OTLdata); $ptr++) { - $char = $this->OTLdata[$ptr]['uni']; - $sub = Indic::decompose_indic($char); - if ($sub) { - $newinfo = array(); - for($i=0;$i<count($sub);$i++) { - $newinfo[$i] = array(); - $ucd_record = Ucdn::get_ucd_record($sub[$i]); - $newinfo[$i]['general_category'] = $ucd_record[0]; - $newinfo[$i]['bidi_type'] = $ucd_record[2]; - $charasstr = $this->unicode_hex($sub[$i]); - if (strpos($this->GlyphClassMarks, $charasstr)!==false) { $newinfo[$i]['group'] = 'M'; } - else { $newinfo[$i]['group'] = 'C'; } - $newinfo[$i]['uni'] = $sub[$i]; - $newinfo[$i]['hex'] = $charasstr; - } - array_splice($this->OTLdata, $ptr, 1, $newinfo); - $ptr += count($sub)-1; - } - } - */ - } - //----------------------------------------------------------------------------------- - // b. Apply all GSUB Lookups (in order specified in lookup list) - //----------------------------------------------------------------------------------- - $tags = 'locl ccmp pref blwf abvf pstf pres abvs blws psts haln rlig calt liga clig mset RQD'; - // pref blwf abvf pstf required for Tibetan - // " RQD" is a non-standard tag in Garuda font - presumably intended to be used by default ? "ReQuireD" - // Being a 3 letter tag is non-standard, and does not allow it to be set by font-feature-settings - /* ?Add these until shapers witten? - Hangul: ljmo vjmo tjmo - */ - $omittags = ''; - $useGSUBtags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $useGSUBtags = $this->_applyTagSettings($tags, $GSUBFeatures, $omittags, \false); - } - // APPLY GSUB rules (as long as not Latin + SmallCaps - but not OTL smcp) - if (!($this->mpdf->textvar & TextVars::FC_SMALLCAPS && $scriptblock == Ucdn::SCRIPT_LATIN && \strpos($useGSUBtags, 'smcp') === \false)) { - $this->_applyGSUBrules($useGSUBtags, $GSUBscriptTag, $GSUBlangsys); - } - } - } - // Shapers - KHMER & THAI & LAO - Replace Word boundary marker with U+200B - // Also TIBETAN (no shaper) - //======================================================= - if ($this->shaper == "K" || $this->shaper == "T" || $this->shaper == "L" || $scriptblock == Ucdn::SCRIPT_TIBETAN) { - // Set up properties to insert a U+200B character - $newinfo = []; - //$newinfo[0] = array('general_category' => 1, 'bidi_type' => 14, 'group' => 'S', 'uni' => 0x200B, 'hex' => '0200B'); - $newinfo[0] = ['general_category' => Ucdn::UNICODE_GENERAL_CATEGORY_FORMAT, 'bidi_type' => Ucdn::BIDI_CLASS_BN, 'group' => 'S', 'uni' => 0x200b, 'hex' => '0200B']; - // Then insert U+200B at (after) all word end boundaries - for ($i = \count($this->OTLdata) - 1; $i > 0; $i--) { - // Make sure after GSUB that wordend has not been moved - check next char is not in the same syllable - if (isset($this->OTLdata[$i]['wordend']) && $this->OTLdata[$i]['wordend'] && isset($this->OTLdata[$i + 1]['uni']) && (!isset($this->OTLdata[$i + 1]['syllable']) || !isset($this->OTLdata[$i + 1]['syllable']) || $this->OTLdata[$i + 1]['syllable'] != $this->OTLdata[$i]['syllable'])) { - \array_splice($this->OTLdata, $i + 1, 0, $newinfo); - $this->_updateLigatureMarks($i, 1); - } elseif ($this->OTLdata[$i]['uni'] == 0x2e) { - // Word end if Full-stop. - \array_splice($this->OTLdata, $i + 1, 0, $newinfo); - $this->_updateLigatureMarks($i, 1); - } - } - } - // Shapers - INDIC & ARABIC & KHMER & SINHALA & MYANMAR - Remove ZWJ and ZWNJ - //======================================================= - if ($this->shaper == 'I' || $this->shaper == 'S' || $this->shaper == 'A' || $this->shaper == 'K' || $this->shaper == 'M') { - // Remove ZWJ and ZWNJ - for ($i = 0; $i < \count($this->OTLdata); $i++) { - if ($this->OTLdata[$i]['uni'] == 8204 || $this->OTLdata[$i]['uni'] == 8205) { - \array_splice($this->OTLdata, $i, 1); - $this->_updateLigatureMarks($i, -1); - } - } - } - //////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////// - ////////// GPOS ///////////////////////////////// - //////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////// - if ($useOTL & 0xff && $GPOSscriptTag && $GPOSlangsys && $GPOSFeatures) { - $this->Entry = []; - $this->Exit = []; - // 6. Load GPOS data, Coverage & Lookups - //================================================================= - $fontCacheFilename = $this->mpdf->CurrentFont['fontkey'] . '.GPOSdata.json'; - if (!isset($this->GPOSdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { - $this->LuCoverage = $this->GPOSdata[$this->fontkey]['LuCoverage'] = $this->fontCache->jsonLoad($fontCacheFilename); - } else { - $this->LuCoverage = $this->GPOSdata[$this->fontkey]['LuCoverage']; - } - $this->GPOSLookups = $this->mpdf->CurrentFont['GPOSLookups']; - // 7. Select Feature tags to use (incl optional) - //============================== - $tags = 'abvm blwm mark mkmk curs cpsp dist requ'; - // Default set - // 'requ' is not listed in the Microsoft registry of Feature tags - // Found in Arial Unicode MS, it repositions the baseline for punctuation in Kannada script - // ZZZ96 - // Set kern to be included by default in non-Latin script (? just when shapers used) - // Kern is used in some fonts to reposition marks etc. and is essential for correct display - //if ($this->shaper) {$tags .= ' kern'; } - if ($scriptblock != Ucdn::SCRIPT_LATIN) { - $tags .= ' kern'; - } - $omittags = ''; - $usetags = $tags; - if (!empty($this->mpdf->OTLtags)) { - $usetags = $this->_applyTagSettings($tags, $GPOSFeatures, $omittags, \false); - } - // 8. Get GPOS LookupList from Feature tags - //============================== - $LookupList = []; - foreach ($GPOSFeatures as $tag => $arr) { - if (\strpos($usetags, $tag) !== \false) { - foreach ($arr as $lu) { - $LookupList[$lu] = $tag; - } - } - } - \ksort($LookupList); - // 9. Apply GPOS Lookups (in order specified in lookup list but selecting from specified tags) - //============================== - // APPLY THE GPOS RULES (as long as not Latin + SmallCaps - but not OTL smcp) - if (!($this->mpdf->textvar & TextVars::FC_SMALLCAPS && $scriptblock == Ucdn::SCRIPT_LATIN && \strpos($useGSUBtags, 'smcp') === \false)) { - $this->_applyGPOSrules($LookupList, $is_old_spec); - // (sets: $this->OTLdata[n]['GPOSinfo'] XPlacement YPlacement XAdvance Entry Exit ) - } - // 10. Process cursive text - //============================== - if (\count($this->Entry) || \count($this->Exit)) { - // RTL - $incurs = \false; - for ($i = \count($this->OTLdata) - 1; $i >= 0; $i--) { - if (isset($this->Entry[$i]) && isset($this->Entry[$i]['Y']) && $this->Entry[$i]['dir'] == 'RTL') { - $nextbase = $i - 1; - // Set as next base ignoring marks (next base reading RTL in logical oder - while (isset($this->OTLdata[$nextbase]['hex']) && \strpos($this->GlyphClassMarks, $this->OTLdata[$nextbase]['hex']) !== \false) { - $nextbase--; - } - if (isset($this->Exit[$nextbase]) && isset($this->Exit[$nextbase]['Y'])) { - $diff = $this->Entry[$i]['Y'] - $this->Exit[$nextbase]['Y']; - if ($incurs === \false) { - $incurs = $diff; - } else { - $incurs += $diff; - } - for ($j = $i - 1; $j >= $nextbase; $j--) { - if (isset($this->OTLdata[$j]['GPOSinfo']['YPlacement'])) { - $this->OTLdata[$j]['GPOSinfo']['YPlacement'] += $incurs; - } else { - $this->OTLdata[$j]['GPOSinfo']['YPlacement'] = $incurs; - } - } - if (isset($this->Exit[$i]['X']) && isset($this->Entry[$nextbase]['X'])) { - $adj = -($this->Entry[$i]['X'] - $this->Exit[$nextbase]['X']); - // If XAdvance is aplied - in order for PDF to position the Advance correctly need to place it on: - // in RTL - the current glyph or the last of any associated marks - if (isset($this->OTLdata[$nextbase + 1]['GPOSinfo']['XAdvance'])) { - $this->OTLdata[$nextbase + 1]['GPOSinfo']['XAdvance'] += $adj; - } else { - $this->OTLdata[$nextbase + 1]['GPOSinfo']['XAdvance'] = $adj; - } - } - } else { - $incurs = \false; - } - } elseif (\strpos($this->GlyphClassMarks, $this->OTLdata[$i]['hex']) !== \false) { - continue; - } else { - $incurs = \false; - } - } - // LTR - $incurs = \false; - for ($i = 0; $i < \count($this->OTLdata); $i++) { - if (isset($this->Exit[$i]) && isset($this->Exit[$i]['Y']) && $this->Exit[$i]['dir'] == 'LTR') { - $nextbase = $i + 1; - // Set as next base ignoring marks - while (\strpos($this->GlyphClassMarks, $this->OTLdata[$nextbase]['hex']) !== \false) { - $nextbase++; - } - if (isset($this->Entry[$nextbase]) && isset($this->Entry[$nextbase]['Y'])) { - $diff = $this->Exit[$i]['Y'] - $this->Entry[$nextbase]['Y']; - if ($incurs === \false) { - $incurs = $diff; - } else { - $incurs += $diff; - } - for ($j = $i + 1; $j <= $nextbase; $j++) { - if (isset($this->OTLdata[$j]['GPOSinfo']['YPlacement'])) { - $this->OTLdata[$j]['GPOSinfo']['YPlacement'] += $incurs; - } else { - $this->OTLdata[$j]['GPOSinfo']['YPlacement'] = $incurs; - } - } - if (isset($this->Exit[$i]['X']) && isset($this->Entry[$nextbase]['X'])) { - $adj = -($this->Exit[$i]['X'] - $this->Entry[$nextbase]['X']); - // If XAdvance is aplied - in order for PDF to position the Advance correctly need to place it on: - // in LTR - the next glyph, ignoring marks - if (isset($this->OTLdata[$nextbase]['GPOSinfo']['XAdvance'])) { - $this->OTLdata[$nextbase]['GPOSinfo']['XAdvance'] += $adj; - } else { - $this->OTLdata[$nextbase]['GPOSinfo']['XAdvance'] = $adj; - } - } - } else { - $incurs = \false; - } - } elseif (\strpos($this->GlyphClassMarks, $this->OTLdata[$i]['hex']) !== \false) { - continue; - } else { - $incurs = \false; - } - } - } - } - // end GPOS - if ($this->debugOTL) { - $this->_dumpproc('END', '-', '-', '-', '-', 0, '-', 0); - exit; - } - $this->schOTLdata[$sch] = $this->OTLdata; - $this->OTLdata = []; - } - // END foreach subchunk - // 11. Re-assemble and return text string - //============================== - $newGPOSinfo = []; - $newOTLdata = []; - $newchar_data = []; - $newgroup = ''; - $e = ''; - $ectr = 0; - for ($sch = 0; $sch <= $subchunk; $sch++) { - for ($i = 0; $i < \count($this->schOTLdata[$sch]); $i++) { - if (isset($this->schOTLdata[$sch][$i]['GPOSinfo'])) { - $newGPOSinfo[$ectr] = $this->schOTLdata[$sch][$i]['GPOSinfo']; - } - $newchar_data[$ectr] = ['bidi_class' => $this->schOTLdata[$sch][$i]['bidi_type'], 'uni' => $this->schOTLdata[$sch][$i]['uni']]; - $newgroup .= $this->schOTLdata[$sch][$i]['group']; - $e .= UtfString::code2utf($this->schOTLdata[$sch][$i]['uni']); - if (isset($this->mpdf->CurrentFont['subset'])) { - $this->mpdf->CurrentFont['subset'][$this->schOTLdata[$sch][$i]['uni']] = $this->schOTLdata[$sch][$i]['uni']; - } - $ectr++; - } - } - $this->OTLdata['GPOSinfo'] = $newGPOSinfo; - $this->OTLdata['char_data'] = $newchar_data; - $this->OTLdata['group'] = $newgroup; - // This leaves OTLdata::GPOSinfo, ::bidi_type, & ::group - return $e; - } - function _applyTagSettings($tags, $Features, $omittags = '', $onlytags = \false) - { - if (empty($this->mpdf->OTLtags['Plus']) && empty($this->mpdf->OTLtags['Minus']) && empty($this->mpdf->OTLtags['FFPlus']) && empty($this->mpdf->OTLtags['FFMinus'])) { - return $tags; - } - // Use $tags as starting point - $usetags = $tags; - // Only set / unset tags which are in the font - // Ignore tags which are in $omittags - // If $onlytags, then just unset tags which are already in the Tag list - $fp = $fm = $ffp = $ffm = ''; - // Font features to enable - set by font-variant-xx - if (isset($this->mpdf->OTLtags['Plus'])) { - $fp = $this->mpdf->OTLtags['Plus']; - } - \preg_match_all('/([a-zA-Z0-9]{4})/', $fp, $m); - for ($i = 0; $i < \count($m[0]); $i++) { - $t = $m[1][$i]; - // Is it a valid tag? - if (isset($Features[$t]) && \strpos($omittags, $t) === \false && (!$onlytags || \strpos($tags, $t) !== \false)) { - $usetags .= ' ' . $t; - } - } - // Font features to disable - set by font-variant-xx - if (isset($this->mpdf->OTLtags['Minus'])) { - $fm = $this->mpdf->OTLtags['Minus']; - } - \preg_match_all('/([a-zA-Z0-9]{4})/', $fm, $m); - for ($i = 0; $i < \count($m[0]); $i++) { - $t = $m[1][$i]; - // Is it a valid tag? - if (isset($Features[$t]) && \strpos($omittags, $t) === \false && (!$onlytags || \strpos($tags, $t) !== \false)) { - $usetags = \str_replace($t, '', $usetags); - } - } - // Font features to enable - set by font-feature-settings - if (isset($this->mpdf->OTLtags['FFPlus'])) { - $ffp = $this->mpdf->OTLtags['FFPlus']; - // Font Features - may include integer: salt4 - } - \preg_match_all('/([a-zA-Z0-9]{4})([\\d+]*)/', $ffp, $m); - for ($i = 0; $i < \count($m[0]); $i++) { - $t = $m[1][$i]; - // Is it a valid tag? - if (isset($Features[$t]) && \strpos($omittags, $t) === \false && (!$onlytags || \strpos($tags, $t) !== \false)) { - $usetags .= ' ' . $m[0][$i]; - // - may include integer: salt4 - } - } - // Font features to disable - set by font-feature-settings - if (isset($this->mpdf->OTLtags['FFMinus'])) { - $ffm = $this->mpdf->OTLtags['FFMinus']; - } - \preg_match_all('/([a-zA-Z0-9]{4})/', $ffm, $m); - for ($i = 0; $i < \count($m[0]); $i++) { - $t = $m[1][$i]; - // Is it a valid tag? - if (isset($Features[$t]) && \strpos($omittags, $t) === \false && (!$onlytags || \strpos($tags, $t) !== \false)) { - $usetags = \str_replace($t, '', $usetags); - } - } - return $usetags; - } - function _applyGSUBrules($usetags, $scriptTag, $langsys) - { - // Features from all Tags are applied together, in Lookup List order. - // For Indic - should be applied one syllable at a time - // - Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' - // if $this->restrictToSyllable is true - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; - $LookupList = []; - foreach ($GSUBFeatures as $tag => $arr) { - if (\strpos($usetags, $tag) !== \false) { - foreach ($arr as $lu) { - $LookupList[$lu] = $tag; - } - } - } - \ksort($LookupList); - foreach ($LookupList as $lu => $tag) { - $Type = $this->GSUBLookups[$lu]['Type']; - $Flag = $this->GSUBLookups[$lu]['Flag']; - $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $tagInt = 1; - if (\preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { - $tagInt = $m[1]; - } - $ptr = 0; - // Test each glyph sequentially - while ($ptr < \count($this->OTLdata)) { - // whilst there is another glyph ..0064 - $currGlyph = $this->OTLdata[$ptr]['hex']; - $currGID = $this->OTLdata[$ptr]['uni']; - $shift = 1; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { - // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) - if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { - // Get rules from font GSUB subtable - $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, $subtable_offset - $this->GSUB_offset, $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $tag, 0, $tagInt); - if ($shift) { - break; - } - } - } - if ($shift == 0) { - $shift = 1; - } - $ptr += $shift; - } - } - } - function _applyGSUBrulesSingly($usetags, $scriptTag, $langsys) - { - // Features are applied one at a time, working through each codepoint - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; - $tags = \explode(' ', $usetags); - foreach ($tags as $usetag) { - $LookupList = []; - foreach ($GSUBFeatures as $tag => $arr) { - if (\strpos($usetags, $tag) !== \false) { - foreach ($arr as $lu) { - $LookupList[$lu] = $tag; - } - } - } - \ksort($LookupList); - $ptr = 0; - // Test each glyph sequentially - while ($ptr < \count($this->OTLdata)) { - // whilst there is another glyph ..0064 - $currGlyph = $this->OTLdata[$ptr]['hex']; - $currGID = $this->OTLdata[$ptr]['uni']; - $shift = 1; - foreach ($LookupList as $lu => $tag) { - $Type = $this->GSUBLookups[$lu]['Type']; - $Flag = $this->GSUBLookups[$lu]['Flag']; - $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $tagInt = 1; - if (\preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { - $tagInt = $m[1]; - } - foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { - // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) - if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { - // Get rules from font GSUB subtable - $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, $subtable_offset - $this->GSUB_offset, $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $tag, 0, $tagInt); - if ($shift) { - break 2; - } - } - } - } - if ($shift == 0) { - $shift = 1; - } - $ptr += $shift; - } - } - } - function _applyGSUBrulesMyanmar($usetags, $scriptTag, $langsys) - { - // $usetags = locl ccmp rphf pref blwf pstf'; - // applied to all characters - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; - // ALL should be applied one syllable at a time - // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' - $tags = \explode(' ', $usetags); - foreach ($tags as $usetag) { - $LookupList = []; - foreach ($GSUBFeatures as $tag => $arr) { - if ($tag == $usetag) { - foreach ($arr as $lu) { - $LookupList[$lu] = $tag; - } - } - } - \ksort($LookupList); - foreach ($LookupList as $lu => $tag) { - $Type = $this->GSUBLookups[$lu]['Type']; - $Flag = $this->GSUBLookups[$lu]['Flag']; - $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $tagInt = 1; - if (\preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { - $tagInt = $m[1]; - } - $ptr = 0; - // Test each glyph sequentially - while ($ptr < \count($this->OTLdata)) { - // whilst there is another glyph ..0064 - $currGlyph = $this->OTLdata[$ptr]['hex']; - $currGID = $this->OTLdata[$ptr]['uni']; - $shift = 1; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { - // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) - if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { - // Get rules from font GSUB subtable - $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, $subtable_offset - $this->GSUB_offset, $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $usetag, 0, $tagInt); - if ($shift) { - break; - } - } - } - if ($shift == 0) { - $shift = 1; - } - $ptr += $shift; - } - } - } - } - function _applyGSUBrulesIndic($usetags, $scriptTag, $langsys, $is_old_spec) - { - // $usetags = 'locl ccmp nukt akhn rphf rkrf pref blwf half pstf vatu cjct'; then later - init - // rphf, pref, blwf, half, abvf, pstf, and init are only applied where ['mask'] indicates: Indic::FLAG(Indic::RPHF); - // The rest are applied to all characters - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; - // ALL should be applied one syllable at a time - // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' - $tags = \explode(' ', $usetags); - foreach ($tags as $usetag) { - $LookupList = []; - foreach ($GSUBFeatures as $tag => $arr) { - if ($tag == $usetag) { - foreach ($arr as $lu) { - $LookupList[$lu] = $tag; - } - } - } - \ksort($LookupList); - foreach ($LookupList as $lu => $tag) { - $Type = $this->GSUBLookups[$lu]['Type']; - $Flag = $this->GSUBLookups[$lu]['Flag']; - $MarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $tagInt = 1; - if (\preg_match('/' . $tag . '([0-9]{1,2})/', $usetags, $m)) { - $tagInt = $m[1]; - } - $ptr = 0; - // Test each glyph sequentially - while ($ptr < \count($this->OTLdata)) { - // whilst there is another glyph ..0064 - $currGlyph = $this->OTLdata[$ptr]['hex']; - $currGID = $this->OTLdata[$ptr]['uni']; - $shift = 1; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $c => $subtable_offset) { - // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) - if (isset($this->GSLuCoverage[$lu][$c][$currGID])) { - if (\strpos('rphf pref blwf half pstf cfar init', $usetag) !== \false) { - // only apply when mask indicates - $mask = 0; - switch ($usetag) { - case 'rphf': - $mask = 1 << Indic::RPHF; - break; - case 'pref': - $mask = 1 << Indic::PREF; - break; - case 'blwf': - $mask = 1 << Indic::BLWF; - break; - case 'half': - $mask = 1 << Indic::HALF; - break; - case 'pstf': - $mask = 1 << Indic::PSTF; - break; - case 'cfar': - $mask = 1 << Indic::CFAR; - break; - case 'init': - $mask = 1 << Indic::INIT; - break; - } - if (!($this->OTLdata[$ptr]['mask'] & $mask)) { - continue; - } - } - // Get rules from font GSUB subtable - $shift = $this->_applyGSUBsubtable($lu, $c, $ptr, $currGlyph, $currGID, $subtable_offset - $this->GSUB_offset, $Type, $Flag, $MarkFilteringSet, $this->GSLuCoverage[$lu][$c], 0, $usetag, $is_old_spec, $tagInt); - if ($shift) { - break; - } - } elseif (static::_OTL_OLD_SPEC_COMPAT_1 && $Type == 4 && !$is_old_spec && \strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', $currGlyph) !== \false) { - // only apply when 'pref blwf pstf' tags, and when mask indicates - if (\strpos('pref blwf pstf', $usetag) !== \false) { - $mask = 0; - switch ($usetag) { - case 'pref': - $mask = 1 << Indic::PREF; - break; - case 'blwf': - $mask = 1 << Indic::BLWF; - break; - case 'pstf': - $mask = 1 << Indic::PSTF; - break; - } - if (!($this->OTLdata[$ptr]['mask'] & $mask)) { - continue; - } - $nextGlyph = $this->OTLdata[$ptr + 1]['hex']; - $nextGID = $this->OTLdata[$ptr + 1]['uni']; - if (isset($this->GSLuCoverage[$lu][$c][$nextGID])) { - // Get rules from font GSUB subtable - $shift = $this->_applyGSUBsubtableSpecial($lu, $c, $ptr, $currGlyph, $currGID, $nextGlyph, $nextGID, $subtable_offset - $this->GSUB_offset, $Type, $this->GSLuCoverage[$lu][$c]); - if ($shift) { - break; - } - } - } - } - } - if ($shift == 0) { - $shift = 1; - } - $ptr += $shift; - } - } - } - } - function _applyGSUBsubtableSpecial($lookupID, $subtable, $ptr, $currGlyph, $currGID, $nextGlyph, $nextGID, $subtable_offset, $Type, $LuCoverage) - { - // Special case for Indic - // Check to substitute Halant-Consonant in PREF, BLWF or PSTF - // i.e. new spec but GSUB tables have Consonant-Halant in Lookups e.g. FreeSerif, which - // incorrectly just moved old spec tables to new spec. Uniscribe seems to cope with this - // See also ttffontsuni.php - $this->seek($subtable_offset); - $SubstFormat = $this->read_ushort(); - // Subtable contains Consonant - Halant - // Text string contains Halant ($CurrGlyph) - Consonant ($nextGlyph) - // Halant has already been matched, and already checked that $nextGID is in Coverage table - //////////////////////////////////////////////////////////////////////////////// - // Only does: LookupType 4: Ligature Substitution Subtable : n to 1 - //////////////////////////////////////////////////////////////////////////////// - $Coverage = $subtable_offset + $this->read_ushort(); - $NextGlyphPos = $LuCoverage[$nextGID]; - $LigSetCount = $this->read_short(); - $this->skip($NextGlyphPos * 2); - $LigSet = $subtable_offset + $this->read_short(); - $this->seek($LigSet); - $LigCount = $this->read_short(); - // LigatureSet i.e. all starting with the same Glyph $nextGlyph [Consonant] - $LigatureOffset = []; - for ($g = 0; $g < $LigCount; $g++) { - $LigatureOffset[$g] = $LigSet + $this->read_ushort(); - } - for ($g = 0; $g < $LigCount; $g++) { - // Ligature tables - $this->seek($LigatureOffset[$g]); - $LigGlyph = $this->read_ushort(); - $substitute = $this->glyphToChar($LigGlyph); - $CompCount = $this->read_ushort(); - if ($CompCount != 2) { - return 0; - } - // Only expecting to work with 2:1 (and no ignore characters in between) - $gid = $this->read_ushort(); - $checkGlyph = $this->glyphToChar($gid); - // Other component/input Glyphs starting at position 2 (arrayindex 1) - if ($currGID == $checkGlyph) { - $match = \true; - } else { - $match = \false; - break; - } - $GlyphPos = []; - $GlyphPos[] = $ptr; - $GlyphPos[] = $ptr + 1; - if ($match) { - $shift = $this->GSUBsubstitute($ptr, $substitute, 4, $GlyphPos); - // GlyphPos contains positions to set null - if ($shift) { - return 1; - } - } - } - return 0; - } - function _applyGSUBsubtable($lookupID, $subtable, $ptr, $currGlyph, $currGID, $subtable_offset, $Type, $Flag, $MarkFilteringSet, $LuCoverage, $level, $currentTag, $is_old_spec, $tagInt) - { - $ignore = $this->_getGCOMignoreString($Flag, $MarkFilteringSet); - // Lets start - $this->seek($subtable_offset); - $SubstFormat = $this->read_ushort(); - //////////////////////////////////////////////////////////////////////////////// - // LookupType 1: Single Substitution Subtable : 1 to 1 - //////////////////////////////////////////////////////////////////////////////// - if ($Type == 1) { - // Flag = Ignore - if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { - return 0; - } - $CoverageOffset = $subtable_offset + $this->read_ushort(); - $GlyphPos = $LuCoverage[$currGID]; - //=========== - // Format 1: - //=========== - if ($SubstFormat == 1) { - // Calculated output glyph indices - $DeltaGlyphID = $this->read_short(); - $this->seek($CoverageOffset); - $glyphs = $this->_getCoverageGID(); - $GlyphID = $glyphs[$GlyphPos] + $DeltaGlyphID; - } elseif ($SubstFormat == 2) { - // Specified output glyph indices - $GlyphCount = $this->read_ushort(); - $this->skip($GlyphPos * 2); - $GlyphID = $this->read_ushort(); - } - $substitute = $this->glyphToChar($GlyphID); - $shift = $this->GSUBsubstitute($ptr, $substitute, $Type); - if ($this->debugOTL && $shift) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - return 1; - } - return 0; - } elseif ($Type == 2) { - // Flag = Ignore - if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { - return 0; - } - $Coverage = $subtable_offset + $this->read_ushort(); - $GlyphPos = $LuCoverage[$currGID]; - $this->skip(2); - $this->skip($GlyphPos * 2); - $Sequences = $subtable_offset + $this->read_short(); - $this->seek($Sequences); - $GlyphCount = $this->read_short(); - $SubstituteGlyphs = []; - for ($g = 0; $g < $GlyphCount; $g++) { - $sgid = $this->read_ushort(); - $SubstituteGlyphs[] = $this->glyphToChar($sgid); - } - $shift = $this->GSUBsubstitute($ptr, $SubstituteGlyphs, $Type); - if ($this->debugOTL && $shift) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - return $shift; - } - return 0; - } elseif ($Type == 3) { - // Flag = Ignore - if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { - return 0; - } - $Coverage = $subtable_offset + $this->read_ushort(); - $AlternateSetCount = $this->read_short(); - ///////////////////////////////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Need to set alternate IF set by CSS3 font-feature for a tag - // i.e. if this is 'salt' alternate may be set to 2 - // default value will be $alt=1 ( === index of 0 in list of alternates) - $alt = 1; - // $alt=1 points to Alternative[0] - if ($tagInt > 1) { - $alt = $tagInt; - } - ///////////////////////////////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if ($alt == 0) { - return 0; - } - // If specified alternate not present, cancel [ or could default $alt = 1 ?] - $GlyphPos = $LuCoverage[$currGID]; - $this->skip($GlyphPos * 2); - $AlternateSets = $subtable_offset + $this->read_short(); - $this->seek($AlternateSets); - $AlternateGlyphCount = $this->read_short(); - if ($alt > $AlternateGlyphCount) { - return 0; - } - // If specified alternate not present, cancel [ or could default $alt = 1 ?] - $this->skip(($alt - 1) * 2); - $GlyphID = $this->read_ushort(); - $substitute = $this->glyphToChar($GlyphID); - $shift = $this->GSUBsubstitute($ptr, $substitute, $Type); - if ($this->debugOTL && $shift) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - return 1; - } - return 0; - } elseif ($Type == 4) { - // Flag = Ignore - if ($this->_checkGCOMignore($Flag, $currGlyph, $MarkFilteringSet)) { - return 0; - } - $Coverage = $subtable_offset + $this->read_ushort(); - $FirstGlyphPos = $LuCoverage[$currGID]; - $LigSetCount = $this->read_short(); - $this->skip($FirstGlyphPos * 2); - $LigSet = $subtable_offset + $this->read_short(); - $this->seek($LigSet); - $LigCount = $this->read_short(); - // LigatureSet i.e. all starting with the same first Glyph $currGlyph - $LigatureOffset = []; - for ($g = 0; $g < $LigCount; $g++) { - $LigatureOffset[$g] = $LigSet + $this->read_ushort(); - } - for ($g = 0; $g < $LigCount; $g++) { - // Ligature tables - $this->seek($LigatureOffset[$g]); - $LigGlyph = $this->read_ushort(); - // Output Ligature GlyphID - $substitute = $this->glyphToChar($LigGlyph); - $CompCount = $this->read_ushort(); - $spos = $ptr; - $match = \true; - $GlyphPos = []; - $GlyphPos[] = $spos; - for ($l = 1; $l < $CompCount; $l++) { - $gid = $this->read_ushort(); - $checkGlyph = $this->glyphToChar($gid); - // Other component/input Glyphs starting at position 2 (arrayindex 1) - $spos++; - //while $this->OTLdata[$spos]['uni'] is an "ignore" => spos++ - while (isset($this->OTLdata[$spos]) && \strpos($ignore, $this->OTLdata[$spos]['hex']) !== \false) { - $spos++; - } - if (isset($this->OTLdata[$spos]) && $this->OTLdata[$spos]['uni'] == $checkGlyph) { - $GlyphPos[] = $spos; - } else { - $match = \false; - break; - } - } - if ($match) { - $shift = $this->GSUBsubstitute($ptr, $substitute, $Type, $GlyphPos); - // GlyphPos contains positions to set null - if ($this->debugOTL && $shift) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - return $spos - $ptr + 1 - ($CompCount - 1); - } - } - } - return 0; - } elseif ($Type == 5) { - //=========== - // Format 1: Simple Context Glyph Substitution - //=========== - if ($SubstFormat == 1) { - $CoverageTableOffset = $subtable_offset + $this->read_ushort(); - $SubRuleSetCount = $this->read_ushort(); - $SubRuleSetOffset = []; - for ($b = 0; $b < $SubRuleSetCount; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $SubRuleSetOffset[] = $offset; - } else { - $SubRuleSetOffset[] = $subtable_offset + $offset; - } - } - // SubRuleSet tables: All contexts beginning with the same glyph - // Select the SubRuleSet required using the position of the glyph in the coverage table - $GlyphPos = $LuCoverage[$currGID]; - if ($SubRuleSetOffset[$GlyphPos] > 0) { - $this->seek($SubRuleSetOffset[$GlyphPos]); - $SubRuleCnt = $this->read_ushort(); - $SubRule = []; - for ($b = 0; $b < $SubRuleCnt; $b++) { - $SubRule[$b] = $SubRuleSetOffset[$GlyphPos] + $this->read_ushort(); - } - for ($b = 0; $b < $SubRuleCnt; $b++) { - // EACH RULE - $this->seek($SubRule[$b]); - $InputGlyphCount = $this->read_ushort(); - $SubstCount = $this->read_ushort(); - $Backtrack = []; - $Lookahead = []; - $Input = []; - $Input[0] = $this->OTLdata[$ptr]['uni']; - for ($r = 1; $r < $InputGlyphCount; $r++) { - $gid = $this->read_ushort(); - $Input[$r] = $this->glyphToChar($gid); - } - $matched = $this->checkContextMatch($Input, $Backtrack, $Lookahead, $ignore, $ptr); - if ($matched) { - if ($this->debugOTL) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - for ($p = 0; $p < $SubstCount; $p++) { - // EACH LOOKUP - $SequenceIndex[$p] = $this->read_ushort(); - $LookupListIndex[$p] = $this->read_ushort(); - } - for ($p = 0; $p < $SubstCount; $p++) { - // Apply $LookupListIndex at $SequenceIndex - if ($SequenceIndex[$p] >= $InputGlyphCount) { - continue; - } - $lu = $LookupListIndex[$p]; - $luType = $this->GSUBLookups[$lu]['Type']; - $luFlag = $this->GSUBLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SequenceIndex[$p]]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GSUB_offset, $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return $shift; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - } - } - return 0; - } elseif ($SubstFormat == 2) { - $CoverageTableOffset = $subtable_offset + $this->read_ushort(); - $InputClassDefOffset = $subtable_offset + $this->read_ushort(); - $SubClassSetCnt = $this->read_ushort(); - $SubClassSetOffset = []; - for ($b = 0; $b < $SubClassSetCnt; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $SubClassSetOffset[] = $offset; - } else { - $SubClassSetOffset[] = $subtable_offset + $offset; - } - } - $InputClasses = $this->_getClasses($InputClassDefOffset); - for ($s = 0; $s < $SubClassSetCnt; $s++) { - // $SubClassSet is ordered by input class-may be NULL - // Select $SubClassSet if currGlyph is in First Input Class - if ($SubClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { - $this->seek($SubClassSetOffset[$s]); - $SubClassRuleCnt = $this->read_ushort(); - $SubClassRule = []; - for ($b = 0; $b < $SubClassRuleCnt; $b++) { - $SubClassRule[$b] = $SubClassSetOffset[$s] + $this->read_ushort(); - } - for ($b = 0; $b < $SubClassRuleCnt; $b++) { - // EACH RULE - $this->seek($SubClassRule[$b]); - $InputGlyphCount = $this->read_ushort(); - $SubstCount = $this->read_ushort(); - $Input = []; - for ($r = 1; $r < $InputGlyphCount; $r++) { - $Input[$r] = $this->read_ushort(); - } - $inputClass = $s; - $inputGlyphs = []; - $inputGlyphs[0] = $InputClasses[$inputClass]; - if ($InputGlyphCount > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { - $classindex = $Input[$gcl]; - if (isset($InputClasses[$classindex])) { - $inputGlyphs[$gcl] = $InputClasses[$classindex]; - } else { - $inputGlyphs[$gcl] = ''; - } - } - } - // Class 0 contains all the glyphs NOT in the other classes - $class0excl = []; - for ($gc = 1; $gc <= \count($InputClasses); $gc++) { - if (\is_array($InputClasses[$gc])) { - $class0excl = $class0excl + $InputClasses[$gc]; - } - } - $backtrackGlyphs = []; - $lookaheadGlyphs = []; - $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl); - if ($matched) { - if ($this->debugOTL) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - for ($p = 0; $p < $SubstCount; $p++) { - // EACH LOOKUP - $SequenceIndex[$p] = $this->read_ushort(); - $LookupListIndex[$p] = $this->read_ushort(); - } - for ($p = 0; $p < $SubstCount; $p++) { - // Apply $LookupListIndex at $SequenceIndex - if ($SequenceIndex[$p] >= $InputGlyphCount) { - continue; - } - $lu = $LookupListIndex[$p]; - $luType = $this->GSUBLookups[$lu]['Type']; - $luFlag = $this->GSUBLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SequenceIndex[$p]]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GSUB_offset, $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return $shift; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - } - } - } - return 0; - } elseif ($SubstFormat == 3) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GSUB Lookup Type " . $Type . " Format " . $SubstFormat . " not TESTED YET."); - } - } elseif ($Type == 6) { - //=========== - // Format 1: - //=========== - // Format 1: Simple Chaining Context Glyph Substitution - if ($SubstFormat == 1) { - $Coverage = $subtable_offset + $this->read_ushort(); - $GlyphPos = $LuCoverage[$currGID]; - $ChainSubRuleSetCount = $this->read_ushort(); - // All of the ChainSubRule tables defining contexts that begin with the same first glyph are grouped together and defined in a ChainSubRuleSet table - $this->skip($GlyphPos * 2); - $ChainSubRuleSet = $subtable_offset + $this->read_ushort(); - $this->seek($ChainSubRuleSet); - $ChainSubRuleCount = $this->read_ushort(); - for ($s = 0; $s < $ChainSubRuleCount; $s++) { - $ChainSubRule[$s] = $ChainSubRuleSet + $this->read_ushort(); - } - for ($s = 0; $s < $ChainSubRuleCount; $s++) { - $this->seek($ChainSubRule[$s]); - $BacktrackGlyphCount = $this->read_ushort(); - $Backtrack = []; - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $gid = $this->read_ushort(); - $Backtrack[] = $this->glyphToChar($gid); - } - $Input = []; - $Input[0] = $this->OTLdata[$ptr]['uni']; - $InputGlyphCount = $this->read_ushort(); - for ($b = 1; $b < $InputGlyphCount; $b++) { - $gid = $this->read_ushort(); - $Input[$b] = $this->glyphToChar($gid); - } - $LookaheadGlyphCount = $this->read_ushort(); - $Lookahead = []; - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $gid = $this->read_ushort(); - $Lookahead[] = $this->glyphToChar($gid); - } - $matched = $this->checkContextMatch($Input, $Backtrack, $Lookahead, $ignore, $ptr); - if ($matched) { - if ($this->debugOTL) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - $SubstCount = $this->read_ushort(); - for ($p = 0; $p < $SubstCount; $p++) { - // SubstLookupRecord - $SubstLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); - $SubstLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); - } - for ($p = 0; $p < $SubstCount; $p++) { - // Apply $SubstLookupRecord[$p]['LookupListIndex'] at $SubstLookupRecord[$p]['SequenceIndex'] - if ($SubstLookupRecord[$p]['SequenceIndex'] >= $InputGlyphCount) { - continue; - } - $lu = $SubstLookupRecord[$p]['LookupListIndex']; - $luType = $this->GSUBLookups[$lu]['Type']; - $luFlag = $this->GSUBLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SubstLookupRecord[$p]['SequenceIndex']]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GSUB_offset, $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return $shift; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - } - return 0; - } elseif ($SubstFormat == 2) { - // NB Format 2 specifies fixed class assignments (identical for each position in the backtrack, input, or lookahead sequence) and exclusive classes (a glyph cannot be in more than one class at a time) - $CoverageTableOffset = $subtable_offset + $this->read_ushort(); - $BacktrackClassDefOffset = $subtable_offset + $this->read_ushort(); - $InputClassDefOffset = $subtable_offset + $this->read_ushort(); - $LookaheadClassDefOffset = $subtable_offset + $this->read_ushort(); - $ChainSubClassSetCnt = $this->read_ushort(); - $ChainSubClassSetOffset = []; - for ($b = 0; $b < $ChainSubClassSetCnt; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $ChainSubClassSetOffset[] = $offset; - } else { - $ChainSubClassSetOffset[] = $subtable_offset + $offset; - } - } - $BacktrackClasses = $this->_getClasses($BacktrackClassDefOffset); - $InputClasses = $this->_getClasses($InputClassDefOffset); - $LookaheadClasses = $this->_getClasses($LookaheadClassDefOffset); - for ($s = 0; $s < $ChainSubClassSetCnt; $s++) { - // $ChainSubClassSet is ordered by input class-may be NULL - // Select $ChainSubClassSet if currGlyph is in First Input Class - if ($ChainSubClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { - $this->seek($ChainSubClassSetOffset[$s]); - $ChainSubClassRuleCnt = $this->read_ushort(); - $ChainSubClassRule = []; - for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { - $ChainSubClassRule[$b] = $ChainSubClassSetOffset[$s] + $this->read_ushort(); - } - for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { - // EACH RULE - $this->seek($ChainSubClassRule[$b]); - $BacktrackGlyphCount = $this->read_ushort(); - for ($r = 0; $r < $BacktrackGlyphCount; $r++) { - $Backtrack[$r] = $this->read_ushort(); - } - $InputGlyphCount = $this->read_ushort(); - for ($r = 1; $r < $InputGlyphCount; $r++) { - $Input[$r] = $this->read_ushort(); - } - $LookaheadGlyphCount = $this->read_ushort(); - for ($r = 0; $r < $LookaheadGlyphCount; $r++) { - $Lookahead[$r] = $this->read_ushort(); - } - // These contain classes of glyphs as arrays - // $InputClasses[(class)] e.g. 0x02E6,0x02E7,0x02E8 - // $LookaheadClasses[(class)] - // $BacktrackClasses[(class)] - // These contain arrays of classIndexes - // [Backtrack] [Lookahead] and [Input] (Input is from the second position only) - $inputClass = $s; - //??? - $inputGlyphs = []; - $inputGlyphs[0] = $InputClasses[$inputClass]; - if ($InputGlyphCount > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { - $classindex = $Input[$gcl]; - if (isset($InputClasses[$classindex])) { - $inputGlyphs[$gcl] = $InputClasses[$classindex]; - } else { - $inputGlyphs[$gcl] = ''; - } - } - } - // Class 0 contains all the glyphs NOT in the other classes - $class0excl = []; - for ($gc = 1; $gc <= \count($InputClasses); $gc++) { - if (isset($InputClasses[$gc])) { - $class0excl = $class0excl + $InputClasses[$gc]; - } - } - if ($BacktrackGlyphCount) { - for ($gcl = 0; $gcl < $BacktrackGlyphCount; $gcl++) { - $classindex = $Backtrack[$gcl]; - if (isset($BacktrackClasses[$classindex])) { - $backtrackGlyphs[$gcl] = $BacktrackClasses[$classindex]; - } else { - $backtrackGlyphs[$gcl] = ''; - } - } - } else { - $backtrackGlyphs = []; - } - // Class 0 contains all the glyphs NOT in the other classes - $bclass0excl = []; - for ($gc = 1; $gc <= \count($BacktrackClasses); $gc++) { - if (isset($BacktrackClasses[$gc])) { - $bclass0excl = $bclass0excl + $BacktrackClasses[$gc]; - } - } - if ($LookaheadGlyphCount) { - for ($gcl = 0; $gcl < $LookaheadGlyphCount; $gcl++) { - $classindex = $Lookahead[$gcl]; - if (isset($LookaheadClasses[$classindex])) { - $lookaheadGlyphs[$gcl] = $LookaheadClasses[$classindex]; - } else { - $lookaheadGlyphs[$gcl] = ''; - } - } - } else { - $lookaheadGlyphs = []; - } - // Class 0 contains all the glyphs NOT in the other classes - $lclass0excl = []; - for ($gc = 1; $gc <= \count($LookaheadClasses); $gc++) { - if (isset($LookaheadClasses[$gc])) { - $lclass0excl = $lclass0excl + $LookaheadClasses[$gc]; - } - } - $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl, $bclass0excl, $lclass0excl); - if ($matched) { - if ($this->debugOTL) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - $SubstCount = $this->read_ushort(); - for ($p = 0; $p < $SubstCount; $p++) { - // EACH LOOKUP - $SequenceIndex[$p] = $this->read_ushort(); - $LookupListIndex[$p] = $this->read_ushort(); - } - for ($p = 0; $p < $SubstCount; $p++) { - // Apply $LookupListIndex at $SequenceIndex - if ($SequenceIndex[$p] >= $InputGlyphCount) { - continue; - } - $lu = $LookupListIndex[$p]; - $luType = $this->GSUBLookups[$lu]['Type']; - $luFlag = $this->GSUBLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SequenceIndex[$p]]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GSUB_offset, $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return $shift; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - } - } - } - return 0; - } elseif ($SubstFormat == 3) { - $BacktrackGlyphCount = $this->read_ushort(); - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $CoverageBacktrackOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $InputGlyphCount = $this->read_ushort(); - for ($b = 0; $b < $InputGlyphCount; $b++) { - $CoverageInputOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $LookaheadGlyphCount = $this->read_ushort(); - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $CoverageLookaheadOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $SubstCount = $this->read_ushort(); - $save_pos = $this->_pos; - // Save the point just after PosCount - $CoverageBacktrackGlyphs = []; - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $this->seek($CoverageBacktrackOffset[$b]); - $glyphs = $this->_getCoverage(); - $CoverageBacktrackGlyphs[$b] = \implode("|", $glyphs); - } - $CoverageInputGlyphs = []; - for ($b = 0; $b < $InputGlyphCount; $b++) { - $this->seek($CoverageInputOffset[$b]); - $glyphs = $this->_getCoverage(); - $CoverageInputGlyphs[$b] = \implode("|", $glyphs); - } - $CoverageLookaheadGlyphs = []; - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $this->seek($CoverageLookaheadOffset[$b]); - $glyphs = $this->_getCoverage(); - $CoverageLookaheadGlyphs[$b] = \implode("|", $glyphs); - } - $matched = $this->checkContextMatchMultiple($CoverageInputGlyphs, $CoverageBacktrackGlyphs, $CoverageLookaheadGlyphs, $ignore, $ptr); - if ($matched) { - if ($this->debugOTL) { - $this->_dumpproc('GSUB', $lookupID, $subtable, $Type, $SubstFormat, $ptr, $currGlyph, $level); - } - $this->seek($save_pos); - // Return to just after PosCount - for ($p = 0; $p < $SubstCount; $p++) { - // SubstLookupRecord - $SubstLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); - $SubstLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); - } - for ($p = 0; $p < $SubstCount; $p++) { - // Apply $SubstLookupRecord[$p]['LookupListIndex'] at $SubstLookupRecord[$p]['SequenceIndex'] - if ($SubstLookupRecord[$p]['SequenceIndex'] >= $InputGlyphCount) { - continue; - } - $lu = $SubstLookupRecord[$p]['LookupListIndex']; - $luType = $this->GSUBLookups[$lu]['Type']; - $luFlag = $this->GSUBLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GSUBLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SubstLookupRecord[$p]['SequenceIndex']]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GSUBLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGSUBsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GSUB_offset, $luType, $luFlag, $luMarkFilteringSet, $this->GSLuCoverage[$lu][$luc], 1, $currentTag, $is_old_spec, $tagInt); - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return isset($shift) ? $shift : 0; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - return 0; - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GSUB Lookup Type " . $Type . " not supported."); - } - } - function _updateLigatureMarks($pos, $n) - { - if ($n > 0) { - // Update position of Ligatures and associated Marks - // Foreach lig/assocMarks - // Any position lpos or mpos > $pos + count($substitute) - // $this->assocMarks = array(); // assocMarks[$pos mpos] => array(compID, ligPos) - // $this->assocLigs = array(); // Ligatures[$pos lpos] => nc - for ($p = \count($this->OTLdata) - 1; $p >= $pos + $n; $p--) { - if (isset($this->assocLigs[$p])) { - $tmp = $this->assocLigs[$p]; - unset($this->assocLigs[$p]); - $this->assocLigs[$p + $n] = $tmp; - } - } - for ($p = \count($this->OTLdata) - 1; $p >= 0; $p--) { - if (isset($this->assocMarks[$p])) { - if ($this->assocMarks[$p]['ligPos'] >= $pos + $n) { - $this->assocMarks[$p]['ligPos'] += $n; - } - if ($p >= $pos + $n) { - $tmp = $this->assocMarks[$p]; - unset($this->assocMarks[$p]); - $this->assocMarks[$p + $n] = $tmp; - } - } - } - } elseif ($n < 1) { - // glyphs removed - $nrem = -$n; - // Update position of pre-existing Ligatures and associated Marks - for ($p = $pos + 1; $p < \count($this->OTLdata); $p++) { - if (isset($this->assocLigs[$p])) { - $tmp = $this->assocLigs[$p]; - unset($this->assocLigs[$p]); - $this->assocLigs[$p - $nrem] = $tmp; - } - } - for ($p = 0; $p < \count($this->OTLdata); $p++) { - if (isset($this->assocMarks[$p])) { - if ($this->assocMarks[$p]['ligPos'] >= $pos) { - $this->assocMarks[$p]['ligPos'] -= $nrem; - } - if ($p > $pos) { - $tmp = $this->assocMarks[$p]; - unset($this->assocMarks[$p]); - $this->assocMarks[$p - $nrem] = $tmp; - } - } - } - } - } - function GSUBsubstitute($pos, $substitute, $Type, $GlyphPos = null) - { - // LookupType 1: Simple Substitution Subtable : 1 to 1 - // LookupType 3: Alternate Forms : 1 to 1(n) - if ($Type == 1 || $Type == 3) { - $this->OTLdata[$pos]['uni'] = $substitute; - $this->OTLdata[$pos]['hex'] = $this->unicode_hex($substitute); - return 1; - } elseif ($Type == 2) { - for ($i = 0; $i < \count($substitute); $i++) { - $uni = $substitute[$i]; - $newOTLdata[$i] = []; - $newOTLdata[$i]['uni'] = $uni; - $newOTLdata[$i]['hex'] = $this->unicode_hex($uni); - // Get types of new inserted chars - or replicate type of char being replaced - // $bt = Ucdn::get_bidi_class($uni); - // if (!$bt) { - $bt = $this->OTLdata[$pos]['bidi_type']; - // } - if (\strpos($this->GlyphClassMarks, $newOTLdata[$i]['hex']) !== \false) { - $gp = 'M'; - } elseif ($uni == 32) { - $gp = 'S'; - } else { - $gp = 'C'; - } - // Need to update matra_type ??? of new glyphs inserted ??????????????????????????????????????? - $newOTLdata[$i]['bidi_type'] = $bt; - $newOTLdata[$i]['group'] = $gp; - // Need to update details of new glyphs inserted - $newOTLdata[$i]['general_category'] = $this->OTLdata[$pos]['general_category']; - if ($this->shaper == 'I' || $this->shaper == 'K' || $this->shaper == 'S') { - $newOTLdata[$i]['indic_category'] = $this->OTLdata[$pos]['indic_category']; - $newOTLdata[$i]['indic_position'] = $this->OTLdata[$pos]['indic_position']; - } elseif ($this->shaper == 'M') { - $newOTLdata[$i]['myanmar_category'] = $this->OTLdata[$pos]['myanmar_category']; - $newOTLdata[$i]['myanmar_position'] = $this->OTLdata[$pos]['myanmar_position']; - } - if (isset($this->OTLdata[$pos]['mask'])) { - $newOTLdata[$i]['mask'] = $this->OTLdata[$pos]['mask']; - } - if (isset($this->OTLdata[$pos]['syllable'])) { - $newOTLdata[$i]['syllable'] = $this->OTLdata[$pos]['syllable']; - } - } - if ($this->shaper == 'K' || $this->shaper == 'T' || $this->shaper == 'L') { - if ($this->OTLdata[$pos]['wordend']) { - $newOTLdata[\count($substitute) - 1]['wordend'] = \true; - } - } - \array_splice($this->OTLdata, $pos, 1, $newOTLdata); - // Replace 1 with n - // Update position of Ligatures and associated Marks - // count($substitute)-1 is the number of glyphs added - $nadd = \count($substitute) - 1; - $this->_updateLigatureMarks($pos, $nadd); - return \count($substitute); - } elseif ($Type == 4) { - // Create Ligatures and associated Marks - $firstGlyph = $this->OTLdata[$pos]['hex']; - // If all components of the ligature are marks (and in the same syllable), we call this a mark ligature. - $contains_marks = \false; - $contains_nonmarks = \false; - if (isset($this->OTLdata[$pos]['syllable'])) { - $current_syllable = $this->OTLdata[$pos]['syllable']; - } else { - $current_syllable = 0; - } - for ($i = 0; $i < \count($GlyphPos); $i++) { - // If subsequent components are not Marks as well - don't ligate - $unistr = $this->OTLdata[$GlyphPos[$i]]['hex']; - if ($this->restrictToSyllable && isset($this->OTLdata[$GlyphPos[$i]]['syllable']) && $this->OTLdata[$GlyphPos[$i]]['syllable'] != $current_syllable) { - return 0; - } - if (\strpos($this->GlyphClassMarks, $unistr) !== \false) { - $contains_marks = \true; - } else { - $contains_nonmarks = \true; - } - } - if ($contains_marks && !$contains_nonmarks) { - // Mark Ligature (all components are Marks) - $firstMarkAssoc = ''; - if (isset($this->assocMarks[$pos])) { - $firstMarkAssoc = $this->assocMarks[$pos]; - } - // If all components of the ligature are marks, we call this a mark ligature. - for ($i = 1; $i < \count($GlyphPos); $i++) { - // If subsequent components are not Marks as well - don't ligate - // $unistr = $this->OTLdata[$GlyphPos[$i]]['hex']; - // if (strpos($this->GlyphClassMarks, $unistr )===false) { return; } - $nextMarkAssoc = ''; - if (isset($this->assocMarks[$GlyphPos[$i]])) { - $nextMarkAssoc = $this->assocMarks[$GlyphPos[$i]]; - } - // If first component was attached to a previous ligature component, - // all subsequent components should be attached to the same ligature - // component, otherwise we shouldn't ligate them. - // If first component was NOT attached to a previous ligature component, - // all subsequent components should also NOT be attached to any ligature component, - if ($firstMarkAssoc != $nextMarkAssoc) { - // unless they are attached to the first component itself! - // if (!is_array($nextMarkAssoc) || $nextMarkAssoc['ligPos']!= $pos) { return; } - // Update/Edit - In test with myanmartext font - // င်္က္ကျြွေိ - // => Lookup 17 E003 E066B E05A 102D - // E003 and 102D should form a mark ligature, but 102D is already associated with (non-mark) ligature E05A - // So instead of disallowing the mark ligature to form, just dissociate... - if (!\is_array($nextMarkAssoc) || $nextMarkAssoc['ligPos'] != $pos) { - unset($this->assocMarks[$GlyphPos[$i]]); - } - } - } - /* - * - If it *is* a mark ligature, we don't allocate a new ligature id, and leave - * the ligature to keep its old ligature id. This will allow it to attach to - * a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH, - * and LAM,LAM,HEH form a ligature, they will leave SHADDA and FATHA wit a - * ligature id and component value of 2. Then if SHADDA,FATHA form a ligature - * later, we don't want them to lose their ligature id/component, otherwise - * GPOS will fail to correctly position the mark ligature on top of the - * LAM,LAM,HEH ligature. - */ - // So if is_array($firstMarkAssoc) - the new (Mark) ligature should keep this association - $lastPos = $GlyphPos[\count($GlyphPos) - 1]; - } else { - /* - * - Ligatures cannot be formed across glyphs attached to different components - * of previous ligatures. Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and - * LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother. - * However, it would be wrong to ligate that SHADDA,FATHA sequence. - * There is an exception to this: If a ligature tries ligating with marks that - * belong to it itself, go ahead, assuming that the font designer knows what - * they are doing (otherwise it can break Indic stuff when a matra wants to - * ligate with a conjunct...) - */ - /* - * - If a ligature is formed of components that some of which are also ligatures - * themselves, and those ligature components had marks attached to *their* - * components, we have to attach the marks to the new ligature component - * positions! Now *that*'s tricky! And these marks may be following the - * last component of the whole sequence, so we should loop forward looking - * for them and update them. - * - * Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a - * 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature - * id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature - * form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to - * the new ligature with a component value of 2. - * - * This in fact happened to a font... See: - * https://bugzilla.gnome.org/show_bug.cgi?id=437633 - */ - $currComp = 0; - for ($i = 0; $i < \count($GlyphPos); $i++) { - if ($i > 0 && isset($this->assocLigs[$GlyphPos[$i]])) { - // One of the other components is already a ligature - $nc = $this->assocLigs[$GlyphPos[$i]]; - } else { - $nc = 1; - } - // While next char to right is a mark (but not the next matched glyph) - // ?? + also include a Mark Ligature here - $ic = 1; - while (($i == \count($GlyphPos) - 1 || isset($GlyphPos[$i + 1]) && $GlyphPos[$i] + $ic < $GlyphPos[$i + 1]) && isset($this->OTLdata[$GlyphPos[$i] + $ic]) && \strpos($this->GlyphClassMarks, $this->OTLdata[$GlyphPos[$i] + $ic]['hex']) !== \false) { - $newComp = $currComp; - if (isset($this->assocMarks[$GlyphPos[$i] + $ic])) { - // One of the inbetween Marks is already associated with a Lig - // OK as long as it is associated with the current Lig - // if ($this->assocMarks[($GlyphPos[$i]+$ic)]['ligPos'] != ($GlyphPos[$i]+$ic)) { die("Problem #1"); } - $newComp += $this->assocMarks[$GlyphPos[$i] + $ic]['compID']; - } - $this->assocMarks[$GlyphPos[$i] + $ic] = ['compID' => $newComp, 'ligPos' => $pos]; - $ic++; - } - $currComp += $nc; - } - $lastPos = $GlyphPos[\count($GlyphPos) - 1] + $ic - 1; - $this->assocLigs[$pos] = $currComp; - // Number of components in new Ligature - } - // Now remove the unwanted glyphs and associated metadata - $newOTLdata[0] = []; - // Get types of new inserted chars - or replicate type of char being replaced - // $bt = Ucdn::get_bidi_class($substitute); - // if (!$bt) { - $bt = $this->OTLdata[$pos]['bidi_type']; - // } - if (\strpos($this->GlyphClassMarks, $this->unicode_hex($substitute)) !== \false) { - $gp = 'M'; - } elseif ($substitute == 32) { - $gp = 'S'; - } else { - $gp = 'C'; - } - // Need to update details of new glyphs inserted - $newOTLdata[0]['general_category'] = $this->OTLdata[$pos]['general_category']; - $newOTLdata[0]['bidi_type'] = $bt; - $newOTLdata[0]['group'] = $gp; - // KASHIDA: If forming a ligature when the last component was identified as a kashida point (final form) - // If previous/first component of ligature is a medial form, then keep this as a kashida point - // TEST (Arabic Typesetting) يَنتُم - $ka = 0; - if (isset($this->OTLdata[$GlyphPos[\count($GlyphPos) - 1]]['GPOSinfo']['kashida'])) { - $ka = $this->OTLdata[$GlyphPos[\count($GlyphPos) - 1]]['GPOSinfo']['kashida']; - } - if ($ka == 1 && isset($this->OTLdata[$pos]['form']) && $this->OTLdata[$pos]['form'] == 3) { - $newOTLdata[0]['GPOSinfo']['kashida'] = $ka; - } - $newOTLdata[0]['uni'] = $substitute; - $newOTLdata[0]['hex'] = $this->unicode_hex($substitute); - if ($this->shaper == 'I' || $this->shaper == 'K' || $this->shaper == 'S') { - $newOTLdata[0]['indic_category'] = $this->OTLdata[$pos]['indic_category']; - $newOTLdata[0]['indic_position'] = $this->OTLdata[$pos]['indic_position']; - } elseif ($this->shaper == 'M') { - $newOTLdata[0]['myanmar_category'] = $this->OTLdata[$pos]['myanmar_category']; - $newOTLdata[0]['myanmar_position'] = $this->OTLdata[$pos]['myanmar_position']; - } - if (isset($this->OTLdata[$pos]['mask'])) { - $newOTLdata[0]['mask'] = $this->OTLdata[$pos]['mask']; - } - if (isset($this->OTLdata[$pos]['syllable'])) { - $newOTLdata[0]['syllable'] = $this->OTLdata[$pos]['syllable']; - } - $newOTLdata[0]['is_ligature'] = \true; - \array_splice($this->OTLdata, $pos, 1, $newOTLdata); - // GlyphPos contains array of arr_pos to set null - not necessarily contiguous - // +- Remove any assocMarks or assocLigs from the main components (the ones that are deleted) - for ($i = \count($GlyphPos) - 1; $i > 0; $i--) { - $gpos = $GlyphPos[$i]; - \array_splice($this->OTLdata, $gpos, 1); - unset($this->assocLigs[$gpos]); - unset($this->assocMarks[$gpos]); - } - // $this->assocLigs = array(); // Ligatures[$posarr lpos] => nc - // $this->assocMarks = array(); // assocMarks[$posarr mpos] => array(compID, ligPos) - // Update position of pre-existing Ligatures and associated Marks - // Start after first GlyphPos - // count($GlyphPos)-1 is the number of glyphs removed from string - for ($p = $GlyphPos[0] + 1; $p < \count($this->OTLdata) + \count($GlyphPos) - 1; $p++) { - $nrem = 0; - // Number of Glyphs removed at this point in the string - for ($i = 0; $i < \count($GlyphPos); $i++) { - if ($i > 0 && $p > $GlyphPos[$i]) { - $nrem++; - } - } - if (isset($this->assocLigs[$p])) { - $tmp = $this->assocLigs[$p]; - unset($this->assocLigs[$p]); - $this->assocLigs[$p - $nrem] = $tmp; - } - if (isset($this->assocMarks[$p])) { - $tmp = $this->assocMarks[$p]; - unset($this->assocMarks[$p]); - if ($tmp['ligPos'] > $GlyphPos[0]) { - $tmp['ligPos'] -= $nrem; - } - $this->assocMarks[$p - $nrem] = $tmp; - } - } - return 1; - } else { - return 0; - } - } - //////////////////////////////////////////////////////////////// - ////////// ARABIC ///////////////////////////////// - //////////////////////////////////////////////////////////////// - private function arabic_initialise() - { - // cf. http://unicode.org/Public/UNIDATA/ArabicShaping.txt - // http://unicode.org/Public/UNIDATA/extracted/DerivedJoiningType.txt - // JOIN TO FOLLOWING LETTER IN LOGICAL ORDER (i.e. AS INITIAL/MEDIAL FORM) = Unicode Left-Joining (+ Dual-Joining + Join_Causing 00640) - $this->arabLeftJoining = [ - 0x620 => 1, - 0x626 => 1, - 0x628 => 1, - 0x62a => 1, - 0x62b => 1, - 0x62c => 1, - 0x62d => 1, - 0x62e => 1, - 0x633 => 1, - 0x634 => 1, - 0x635 => 1, - 0x636 => 1, - 0x637 => 1, - 0x638 => 1, - 0x639 => 1, - 0x63a => 1, - 0x63b => 1, - 0x63c => 1, - 0x63d => 1, - 0x63e => 1, - 0x63f => 1, - 0x640 => 1, - 0x641 => 1, - 0x642 => 1, - 0x643 => 1, - 0x644 => 1, - 0x645 => 1, - 0x646 => 1, - 0x647 => 1, - 0x649 => 1, - 0x64a => 1, - 0x66e => 1, - 0x66f => 1, - 0x678 => 1, - 0x679 => 1, - 0x67a => 1, - 0x67b => 1, - 0x67c => 1, - 0x67d => 1, - 0x67e => 1, - 0x67f => 1, - 0x680 => 1, - 0x681 => 1, - 0x682 => 1, - 0x683 => 1, - 0x684 => 1, - 0x685 => 1, - 0x686 => 1, - 0x687 => 1, - 0x69a => 1, - 0x69b => 1, - 0x69c => 1, - 0x69d => 1, - 0x69e => 1, - 0x69f => 1, - 0x6a0 => 1, - 0x6a1 => 1, - 0x6a2 => 1, - 0x6a3 => 1, - 0x6a4 => 1, - 0x6a5 => 1, - 0x6a6 => 1, - 0x6a7 => 1, - 0x6a8 => 1, - 0x6a9 => 1, - 0x6aa => 1, - 0x6ab => 1, - 0x6ac => 1, - 0x6ad => 1, - 0x6ae => 1, - 0x6af => 1, - 0x6b0 => 1, - 0x6b1 => 1, - 0x6b2 => 1, - 0x6b3 => 1, - 0x6b4 => 1, - 0x6b5 => 1, - 0x6b6 => 1, - 0x6b7 => 1, - 0x6b8 => 1, - 0x6b9 => 1, - 0x6ba => 1, - 0x6bb => 1, - 0x6bc => 1, - 0x6bd => 1, - 0x6be => 1, - 0x6bf => 1, - 0x6c1 => 1, - 0x6c2 => 1, - 0x6cc => 1, - 0x6ce => 1, - 0x6d0 => 1, - 0x6d1 => 1, - 0x6fa => 1, - 0x6fb => 1, - 0x6fc => 1, - 0x6ff => 1, - /* Arabic Supplement */ - 0x750 => 1, - 0x751 => 1, - 0x752 => 1, - 0x753 => 1, - 0x754 => 1, - 0x755 => 1, - 0x756 => 1, - 0x757 => 1, - 0x758 => 1, - 0x75c => 1, - 0x75d => 1, - 0x75e => 1, - 0x75f => 1, - 0x760 => 1, - 0x761 => 1, - 0x762 => 1, - 0x763 => 1, - 0x764 => 1, - 0x765 => 1, - 0x766 => 1, - 0x767 => 1, - 0x768 => 1, - 0x769 => 1, - 0x76a => 1, - 0x76d => 1, - 0x76e => 1, - 0x76f => 1, - 0x770 => 1, - 0x772 => 1, - 0x775 => 1, - 0x776 => 1, - 0x777 => 1, - 0x77a => 1, - 0x77b => 1, - 0x77c => 1, - 0x77d => 1, - 0x77e => 1, - 0x77f => 1, - /* Extended Arabic */ - 0x8a0 => 1, - 0x8a2 => 1, - 0x8a3 => 1, - 0x8a4 => 1, - 0x8a5 => 1, - 0x8a6 => 1, - 0x8a7 => 1, - 0x8a8 => 1, - 0x8a9 => 1, - /* 'syrc' Syriac */ - 0x712 => 1, - 0x713 => 1, - 0x714 => 1, - 0x71a => 1, - 0x71b => 1, - 0x71c => 1, - 0x71d => 1, - 0x71f => 1, - 0x720 => 1, - 0x721 => 1, - 0x722 => 1, - 0x723 => 1, - 0x724 => 1, - 0x725 => 1, - 0x726 => 1, - 0x727 => 1, - 0x729 => 1, - 0x72b => 1, - 0x72d => 1, - 0x72e => 1, - 0x74e => 1, - 0x74f => 1, - /* N'Ko */ - 0x7ca => 1, - 0x7cb => 1, - 0x7cc => 1, - 0x7cd => 1, - 0x7ce => 1, - 0x7cf => 1, - 0x7d0 => 1, - 0x7d1 => 1, - 0x7d2 => 1, - 0x7d3 => 1, - 0x7d4 => 1, - 0x7d5 => 1, - 0x7d6 => 1, - 0x7d7 => 1, - 0x7d8 => 1, - 0x7d9 => 1, - 0x7da => 1, - 0x7db => 1, - 0x7dc => 1, - 0x7dd => 1, - 0x7de => 1, - 0x7df => 1, - 0x7e0 => 1, - 0x7e1 => 1, - 0x7e2 => 1, - 0x7e3 => 1, - 0x7e4 => 1, - 0x7e5 => 1, - 0x7e6 => 1, - 0x7e7 => 1, - 0x7e8 => 1, - 0x7e9 => 1, - 0x7ea => 1, - 0x7fa => 1, - /* Mandaic */ - 0x841 => 1, - 0x842 => 1, - 0x843 => 1, - 0x844 => 1, - 0x845 => 1, - 0x847 => 1, - 0x848 => 1, - 0x84a => 1, - 0x84b => 1, - 0x84c => 1, - 0x84d => 1, - 0x84e => 1, - 0x850 => 1, - 0x851 => 1, - 0x852 => 1, - 0x853 => 1, - 0x855 => 1, - /* ZWJ U+200D */ - 0x200d => 1, - ]; - /* JOIN TO PREVIOUS LETTER IN LOGICAL ORDER (i.e. AS FINAL/MEDIAL FORM) = Unicode Right-Joining (+ Dual-Joining + Join_Causing) */ - $this->arabRightJoining = [ - 0x620 => 1, - 0x622 => 1, - 0x623 => 1, - 0x624 => 1, - 0x625 => 1, - 0x626 => 1, - 0x627 => 1, - 0x628 => 1, - 0x629 => 1, - 0x62a => 1, - 0x62b => 1, - 0x62c => 1, - 0x62d => 1, - 0x62e => 1, - 0x62f => 1, - 0x630 => 1, - 0x631 => 1, - 0x632 => 1, - 0x633 => 1, - 0x634 => 1, - 0x635 => 1, - 0x636 => 1, - 0x637 => 1, - 0x638 => 1, - 0x639 => 1, - 0x63a => 1, - 0x63b => 1, - 0x63c => 1, - 0x63d => 1, - 0x63e => 1, - 0x63f => 1, - 0x640 => 1, - 0x641 => 1, - 0x642 => 1, - 0x643 => 1, - 0x644 => 1, - 0x645 => 1, - 0x646 => 1, - 0x647 => 1, - 0x648 => 1, - 0x649 => 1, - 0x64a => 1, - 0x66e => 1, - 0x66f => 1, - 0x671 => 1, - 0x672 => 1, - 0x673 => 1, - 0x675 => 1, - 0x676 => 1, - 0x677 => 1, - 0x678 => 1, - 0x679 => 1, - 0x67a => 1, - 0x67b => 1, - 0x67c => 1, - 0x67d => 1, - 0x67e => 1, - 0x67f => 1, - 0x680 => 1, - 0x681 => 1, - 0x682 => 1, - 0x683 => 1, - 0x684 => 1, - 0x685 => 1, - 0x686 => 1, - 0x687 => 1, - 0x688 => 1, - 0x689 => 1, - 0x68a => 1, - 0x68b => 1, - 0x68c => 1, - 0x68d => 1, - 0x68e => 1, - 0x68f => 1, - 0x690 => 1, - 0x691 => 1, - 0x692 => 1, - 0x693 => 1, - 0x694 => 1, - 0x695 => 1, - 0x696 => 1, - 0x697 => 1, - 0x698 => 1, - 0x699 => 1, - 0x69a => 1, - 0x69b => 1, - 0x69c => 1, - 0x69d => 1, - 0x69e => 1, - 0x69f => 1, - 0x6a0 => 1, - 0x6a1 => 1, - 0x6a2 => 1, - 0x6a3 => 1, - 0x6a4 => 1, - 0x6a5 => 1, - 0x6a6 => 1, - 0x6a7 => 1, - 0x6a8 => 1, - 0x6a9 => 1, - 0x6aa => 1, - 0x6ab => 1, - 0x6ac => 1, - 0x6ad => 1, - 0x6ae => 1, - 0x6af => 1, - 0x6b0 => 1, - 0x6b1 => 1, - 0x6b2 => 1, - 0x6b3 => 1, - 0x6b4 => 1, - 0x6b5 => 1, - 0x6b6 => 1, - 0x6b7 => 1, - 0x6b8 => 1, - 0x6b9 => 1, - 0x6ba => 1, - 0x6bb => 1, - 0x6bc => 1, - 0x6bd => 1, - 0x6be => 1, - 0x6bf => 1, - 0x6c0 => 1, - 0x6c1 => 1, - 0x6c2 => 1, - 0x6c3 => 1, - 0x6c4 => 1, - 0x6c5 => 1, - 0x6c6 => 1, - 0x6c7 => 1, - 0x6c8 => 1, - 0x6c9 => 1, - 0x6ca => 1, - 0x6cb => 1, - 0x6cc => 1, - 0x6cd => 1, - 0x6ce => 1, - 0x6cf => 1, - 0x6d0 => 1, - 0x6d1 => 1, - 0x6d2 => 1, - 0x6d3 => 1, - 0x6d5 => 1, - 0x6ee => 1, - 0x6ef => 1, - 0x6fa => 1, - 0x6fb => 1, - 0x6fc => 1, - 0x6ff => 1, - /* Arabic Supplement */ - 0x750 => 1, - 0x751 => 1, - 0x752 => 1, - 0x753 => 1, - 0x754 => 1, - 0x755 => 1, - 0x756 => 1, - 0x757 => 1, - 0x758 => 1, - 0x759 => 1, - 0x75a => 1, - 0x75b => 1, - 0x75c => 1, - 0x75d => 1, - 0x75e => 1, - 0x75f => 1, - 0x760 => 1, - 0x761 => 1, - 0x762 => 1, - 0x763 => 1, - 0x764 => 1, - 0x765 => 1, - 0x766 => 1, - 0x767 => 1, - 0x768 => 1, - 0x769 => 1, - 0x76a => 1, - 0x76b => 1, - 0x76c => 1, - 0x76d => 1, - 0x76e => 1, - 0x76f => 1, - 0x770 => 1, - 0x771 => 1, - 0x772 => 1, - 0x773 => 1, - 0x774 => 1, - 0x775 => 1, - 0x776 => 1, - 0x777 => 1, - 0x778 => 1, - 0x779 => 1, - 0x77a => 1, - 0x77b => 1, - 0x77c => 1, - 0x77d => 1, - 0x77e => 1, - 0x77f => 1, - /* Extended Arabic */ - 0x8a0 => 1, - 0x8a2 => 1, - 0x8a3 => 1, - 0x8a4 => 1, - 0x8a5 => 1, - 0x8a6 => 1, - 0x8a7 => 1, - 0x8a8 => 1, - 0x8a9 => 1, - 0x8aa => 1, - 0x8ab => 1, - 0x8ac => 1, - /* 'syrc' Syriac */ - 0x710 => 1, - 0x712 => 1, - 0x713 => 1, - 0x714 => 1, - 0x715 => 1, - 0x716 => 1, - 0x717 => 1, - 0x718 => 1, - 0x719 => 1, - 0x71a => 1, - 0x71b => 1, - 0x71c => 1, - 0x71d => 1, - 0x71e => 1, - 0x71f => 1, - 0x720 => 1, - 0x721 => 1, - 0x722 => 1, - 0x723 => 1, - 0x724 => 1, - 0x725 => 1, - 0x726 => 1, - 0x727 => 1, - 0x728 => 1, - 0x729 => 1, - 0x72a => 1, - 0x72b => 1, - 0x72c => 1, - 0x72d => 1, - 0x72e => 1, - 0x72f => 1, - 0x74d => 1, - 0x74e => 1, - 0x74f, - /* N'Ko */ - 0x7ca => 1, - 0x7cb => 1, - 0x7cc => 1, - 0x7cd => 1, - 0x7ce => 1, - 0x7cf => 1, - 0x7d0 => 1, - 0x7d1 => 1, - 0x7d2 => 1, - 0x7d3 => 1, - 0x7d4 => 1, - 0x7d5 => 1, - 0x7d6 => 1, - 0x7d7 => 1, - 0x7d8 => 1, - 0x7d9 => 1, - 0x7da => 1, - 0x7db => 1, - 0x7dc => 1, - 0x7dd => 1, - 0x7de => 1, - 0x7df => 1, - 0x7e0 => 1, - 0x7e1 => 1, - 0x7e2 => 1, - 0x7e3 => 1, - 0x7e4 => 1, - 0x7e5 => 1, - 0x7e6 => 1, - 0x7e7 => 1, - 0x7e8 => 1, - 0x7e9 => 1, - 0x7ea => 1, - 0x7fa => 1, - /* Mandaic */ - 0x841 => 1, - 0x842 => 1, - 0x843 => 1, - 0x844 => 1, - 0x845 => 1, - 0x847 => 1, - 0x848 => 1, - 0x84a => 1, - 0x84b => 1, - 0x84c => 1, - 0x84d => 1, - 0x84e => 1, - 0x850 => 1, - 0x851 => 1, - 0x852 => 1, - 0x853 => 1, - 0x855 => 1, - 0x840 => 1, - 0x846 => 1, - 0x849 => 1, - 0x84f => 1, - 0x854 => 1, - /* Right joining */ - /* ZWJ U+200D */ - 0x200d => 1, - ]; - /* VOWELS = TRANSPARENT-JOINING = Unicode Transparent-Joining type (not just vowels) */ - $this->arabTransparent = [ - 0x610 => 1, - 0x611 => 1, - 0x612 => 1, - 0x613 => 1, - 0x614 => 1, - 0x615 => 1, - 0x616 => 1, - 0x617 => 1, - 0x618 => 1, - 0x619 => 1, - 0x61a => 1, - 0x64b => 1, - 0x64c => 1, - 0x64d => 1, - 0x64e => 1, - 0x64f => 1, - 0x650 => 1, - 0x651 => 1, - 0x652 => 1, - 0x653 => 1, - 0x654 => 1, - 0x655 => 1, - 0x656 => 1, - 0x657 => 1, - 0x658 => 1, - 0x659 => 1, - 0x65a => 1, - 0x65b => 1, - 0x65c => 1, - 0x65d => 1, - 0x65e => 1, - 0x65f => 1, - 0x670 => 1, - 0x6d6 => 1, - 0x6d7 => 1, - 0x6d8 => 1, - 0x6d9 => 1, - 0x6da => 1, - 0x6db => 1, - 0x6dc => 1, - 0x6df => 1, - 0x6e0 => 1, - 0x6e1 => 1, - 0x6e2 => 1, - 0x6e3 => 1, - 0x6e4 => 1, - 0x6e7 => 1, - 0x6e8 => 1, - 0x6ea => 1, - 0x6eb => 1, - 0x6ec => 1, - 0x6ed => 1, - /* Extended Arabic */ - 0x8e4 => 1, - 0x8e5 => 1, - 0x8e6 => 1, - 0x8e7 => 1, - 0x8e8 => 1, - 0x8e9 => 1, - 0x8ea => 1, - 0x8eb => 1, - 0x8ec => 1, - 0x8ed => 1, - 0x8ee => 1, - 0x8ef => 1, - 0x8f0 => 1, - 0x8f1 => 1, - 0x8f2 => 1, - 0x8f3 => 1, - 0x8f4 => 1, - 0x8f5 => 1, - 0x8f6 => 1, - 0x8f7 => 1, - 0x8f8 => 1, - 0x8f9 => 1, - 0x8fa => 1, - 0x8fb => 1, - 0x8fc => 1, - 0x8fd => 1, - 0x8fe => 1, - /* Arabic ligatures in presentation form (converted in 'ccmp' in e.g. Arial and Times ? need to add others in this range) */ - 0xfc5e => 1, - 0xfc5f => 1, - 0xfc60 => 1, - 0xfc61 => 1, - 0xfc62 => 1, - /* 'syrc' Syriac */ - 0x70f => 1, - 0x711 => 1, - 0x730 => 1, - 0x731 => 1, - 0x732 => 1, - 0x733 => 1, - 0x734 => 1, - 0x735 => 1, - 0x736 => 1, - 0x737 => 1, - 0x738 => 1, - 0x739 => 1, - 0x73a => 1, - 0x73b => 1, - 0x73c => 1, - 0x73d => 1, - 0x73e => 1, - 0x73f => 1, - 0x740 => 1, - 0x741 => 1, - 0x742 => 1, - 0x743 => 1, - 0x744 => 1, - 0x745 => 1, - 0x746 => 1, - 0x747 => 1, - 0x748 => 1, - 0x749 => 1, - 0x74a => 1, - /* N'Ko */ - 0x7eb => 1, - 0x7ec => 1, - 0x7ed => 1, - 0x7ee => 1, - 0x7ef => 1, - 0x7f0 => 1, - 0x7f1 => 1, - 0x7f2 => 1, - 0x7f3 => 1, - /* Mandaic */ - 0x859 => 1, - 0x85a => 1, - 0x85b => 1, - ]; - } - private function arabic_shaper($usetags, $scriptTag) - { - $chars = []; - for ($i = 0; $i < \count($this->OTLdata); $i++) { - $chars[] = $this->OTLdata[$i]['hex']; - } - $crntChar = null; - $prevChar = null; - $nextChar = null; - $output = []; - $max = \count($chars); - for ($i = $max - 1; $i >= 0; $i--) { - $crntChar = $chars[$i]; - if ($i > 0) { - $prevChar = \hexdec($chars[$i - 1]); - } else { - $prevChar = null; - } - if ($prevChar && isset($this->arabTransparentJoin[$prevChar]) && isset($chars[$i - 2])) { - $prevChar = \hexdec($chars[$i - 2]); - if ($prevChar && isset($this->arabTransparentJoin[$prevChar]) && isset($chars[$i - 3])) { - $prevChar = \hexdec($chars[$i - 3]); - if ($prevChar && isset($this->arabTransparentJoin[$prevChar]) && isset($chars[$i - 4])) { - $prevChar = \hexdec($chars[$i - 4]); - } - } - } - if ($crntChar && isset($this->arabTransparentJoin[\hexdec($crntChar)])) { - // If next_char = RightJoining && prev_char = LeftJoining: - if (isset($chars[$i + 1]) && $chars[$i + 1] && isset($this->arabRightJoining[\hexdec($chars[$i + 1])]) && $prevChar && isset($this->arabLeftJoining[$prevChar])) { - $output[] = $this->get_arab_glyphs($crntChar, 1, $chars, $i, $scriptTag, $usetags); - // <final> form - } else { - $output[] = $this->get_arab_glyphs($crntChar, 0, $chars, $i, $scriptTag, $usetags); - // <isolated> form - } - continue; - } - if (\hexdec($crntChar) < 128) { - $output[] = [$crntChar, 0]; - $nextChar = $crntChar; - continue; - } - // 0=ISOLATED FORM :: 1=FINAL :: 2=INITIAL :: 3=MEDIAL - $form = 0; - if ($prevChar && isset($this->arabLeftJoining[$prevChar])) { - $form++; - } - if ($nextChar && isset($this->arabRightJoining[\hexdec($nextChar)])) { - $form += 2; - } - $output[] = $this->get_arab_glyphs($crntChar, $form, $chars, $i, $scriptTag, $usetags); - $nextChar = $crntChar; - } - $ra = \array_reverse($output); - for ($i = 0; $i < \count($this->OTLdata); $i++) { - $this->OTLdata[$i]['uni'] = \hexdec($ra[$i][0]); - $this->OTLdata[$i]['hex'] = $ra[$i][0]; - $this->OTLdata[$i]['form'] = $ra[$i][1]; - // Actaul form substituted 0=ISOLATED FORM :: 1=FINAL :: 2=INITIAL :: 3=MEDIAL - } - } - private function get_arab_glyphs($char, $type, &$chars, $i, $scriptTag, $usetags) - { - // Optional Feature settings // doesn't control Syriac at present - if ($type === 0 && \strpos($usetags, 'isol') === \false || $type === 1 && \strpos($usetags, 'fina') === \false || $type === 2 && \strpos($usetags, 'init') === \false || $type === 3 && \strpos($usetags, 'medi') === \false) { - return [$char, 0]; - } - // 0=ISOLATED FORM :: 1=FINAL :: 2=INITIAL :: 3=MEDIAL (:: 4=MED2 :: 5=FIN2 :: 6=FIN3) - $retk = -1; - // Alaph 00710 in Syriac - if ($scriptTag == 'syrc' && $char == '00710') { - // if there is a preceding (base?) character *** should search back to previous base - ignoring vowels and change $n - // set $n as the position of the last base; for now we'll just do this: - $n = $i - 1; - // if the preceding (base) character cannot be joined to - // not in $this->arabLeftJoining i.e. not a char which can join to the next one - if (isset($chars[$n]) && isset($this->arabLeftJoining[\hexdec($chars[$n])])) { - // if in the middle of Syriac words - if (isset($chars[$i + 1]) && \preg_match('/[\\x{0700}-\\x{0745}]/u', UtfString::code2utf(\hexdec($chars[$n]))) && \preg_match('/[\\x{0700}-\\x{0745}]/u', UtfString::code2utf(\hexdec($chars[$i + 1]))) && isset($this->arabGlyphs[$char][4])) { - $retk = 4; - } elseif (!isset($chars[$i + 1]) || !\preg_match('/[\\x{0700}-\\x{0745}]/u', UtfString::code2utf(\hexdec($chars[$i + 1])))) { - // if preceding base character IS (00715|00716|0072A) - if (\strpos('0715|0716|072A', $chars[$n]) !== \false && isset($this->arabGlyphs[$char][6])) { - $retk = 6; - } elseif (isset($this->arabGlyphs[$char][5])) { - $retk = 5; - } - } - } - if ($retk != -1) { - return [$this->arabGlyphs[$char][$retk], $retk]; - } else { - return [$char, 0]; - } - } - if (($type > 0 || $type === 0) && isset($this->arabGlyphs[$char][$type])) { - $retk = $type; - } elseif ($type == 3 && isset($this->arabGlyphs[$char][1])) { - // if <medial> not defined, but <final>, return <final> - $retk = 1; - } elseif ($type == 2 && isset($this->arabGlyphs[$char][0])) { - // if <initial> not defined, but <isolated>, return <isolated> - $retk = 0; - } - if ($retk != -1) { - $match = \true; - // If GSUB includes a Backtrack or Lookahead condition (e.g. font ArabicTypesetting) - if (isset($this->arabGlyphs[$char]['prel'][$retk]) && $this->arabGlyphs[$char]['prel'][$retk]) { - $ig = 1; - foreach ($this->arabGlyphs[$char]['prel'][$retk] as $k => $v) { - // $k starts 0, 1... - if (!isset($chars[$i - $ig - $k])) { - $match = \false; - } elseif (\strpos($v, $chars[$i - $ig - $k]) === \false) { - while (\strpos($this->arabGlyphs[$char]['ignore'][$retk], $chars[$i - $ig - $k]) !== \false) { - // ignore - $ig++; - } - if (!isset($chars[$i - $ig - $k])) { - $match = \false; - } elseif (\strpos($v, $chars[$i - $ig - $k]) === \false) { - $match = \false; - } - } - } - } - if (isset($this->arabGlyphs[$char]['postl'][$retk]) && $this->arabGlyphs[$char]['postl'][$retk]) { - $ig = 1; - foreach ($this->arabGlyphs[$char]['postl'][$retk] as $k => $v) { - // $k starts 0, 1... - if (!isset($chars[$i + $ig + $k])) { - $match = \false; - } elseif (\strpos($v, $chars[$i + $ig + $k]) === \false) { - while (\strpos($this->arabGlyphs[$char]['ignore'][$retk], $chars[$i + $ig + $k]) !== \false) { - // ignore - $ig++; - } - if (!isset($chars[$i + $ig + $k])) { - $match = \false; - } elseif (\strpos($v, $chars[$i + $ig + $k]) === \false) { - $match = \false; - } - } - } - } - if ($match) { - return [$this->arabGlyphs[$char][$retk], $retk]; - } else { - return [$char, 0]; - } - } else { - return [$char, 0]; - } - } - //////////////////////////////////////////////////////////////// - ///////////////// LINE BREAKING /////////////////////// - //////////////////////////////////////////////////////////////// - ///////////// TIBETAN LINE BREAKING /////////////////// - //////////////////////////////////////////////////////////////// - // Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries - private function tibetanLineBreaking() - { - for ($ptr = 0; $ptr < \count($this->OTLdata); $ptr++) { - // Break opportunities at U+0F0B Tsheg or U=0F0D - if (isset($this->OTLdata[$ptr]['uni']) && ($this->OTLdata[$ptr]['uni'] == 0xf0b || $this->OTLdata[$ptr]['uni'] == 0xf0d)) { - if (isset($this->OTLdata[$ptr + 1]['uni']) && ($this->OTLdata[$ptr + 1]['uni'] == 0xf0d || $this->OTLdata[$ptr + 1]['uni'] == 0xf0e)) { - continue; - } - // Set end of word marker in OTLdata at matchpos - $this->OTLdata[$ptr]['wordend'] = \true; - } - } - } - /** - * South East Asian Linebreaking (Thai, Khmer and Lao) using dictionary of words - * - * Sets $this->OTLdata[$i]['wordend']=true at possible end of word boundaries - */ - private function seaLineBreaking() - { - // Load Line-breaking dictionary - if (!isset($this->lbdicts[$this->shaper]) && \file_exists(__DIR__ . '/../data/linebrdict' . $this->shaper . '.dat')) { - $this->lbdicts[$this->shaper] = \file_get_contents(__DIR__ . '/../data/linebrdict' . $this->shaper . '.dat'); - } - $dict =& $this->lbdicts[$this->shaper]; - // Find all word boundaries and mark end of word $this->OTLdata[$i]['wordend']=true on last character - // If Thai, allow for possible suffixes (not in Lao or Khmer) - // repeater/ellision characters - // (0x0E2F); // Ellision character THAI_PAIYANNOI 0x0E2F UTF-8 0xE0 0xB8 0xAF - // (0x0E46); // Repeat character THAI_MAIYAMOK 0x0E46 UTF-8 0xE0 0xB9 0x86 - // (0x0EC6); // Repeat character LAO UTF-8 0xE0 0xBB 0x86 - $rollover = []; - $ptr = 0; - while ($ptr < \count($this->OTLdata) - 3) { - if (\count($rollover)) { - $matches = $rollover; - $rollover = []; - } else { - $matches = $this->checkwordmatch($dict, $ptr); - } - if (\count($matches) == 1) { - $matchpos = $matches[0]; - // Check for repeaters - if so $matchpos++ - if (isset($this->OTLdata[$matchpos + 1]['uni']) && ($this->OTLdata[$matchpos + 1]['uni'] == 0xe2f || $this->OTLdata[$matchpos + 1]['uni'] == 0xe46 || $this->OTLdata[$matchpos + 1]['uni'] == 0xec6)) { - $matchpos++; - } - // Set end of word marker in OTLdata at matchpos - $this->OTLdata[$matchpos]['wordend'] = \true; - $ptr = $matchpos + 1; - } elseif (empty($matches)) { - $ptr++; - // Move past any ASCII characters - while (isset($this->OTLdata[$ptr]['uni']) && $this->OTLdata[$ptr]['uni'] >> 8 == 0) { - $ptr++; - } - } else { - // Multiple matches - $secondmatch = \false; - for ($m = \count($matches) - 1; $m >= 0; $m--) { - //for ($m=0;$m<count($matches);$m++) { - $firstmatch = $matches[$m]; - $matches2 = $this->checkwordmatch($dict, $firstmatch + 1); - if (\count($matches2)) { - // Set end of word marker in OTLdata at matchpos - $this->OTLdata[$firstmatch]['wordend'] = \true; - $ptr = $firstmatch + 1; - $rollover = $matches2; - $secondmatch = \true; - break; - } - } - if (!$secondmatch) { - // Set end of word marker in OTLdata at end of longest first match - $this->OTLdata[$matches[\count($matches) - 1]]['wordend'] = \true; - $ptr = $matches[\count($matches) - 1] + 1; - // Move past any ASCII characters - while (isset($this->OTLdata[$ptr]['uni']) && $this->OTLdata[$ptr]['uni'] >> 8 == 0) { - $ptr++; - } - } - } - } - } - private function checkwordmatch(&$dict, $ptr) - { - /* - Node type: Split. - Divide at < 98 >= 98 - Offset for >= 98 == 79 (long 4-byte unsigned) - - Node type: Linear match. - Char = 97 - - Intermediate match - - Final match - */ - $dictptr = 0; - $ok = \true; - $matches = []; - while ($ok) { - $x = \ord($dict[$dictptr]); - $c = $this->OTLdata[$ptr]['uni'] & 0xff; - if ($x == static::_DICT_INTERMEDIATE_MATCH) { - //echo "DICT_INTERMEDIATE_MATCH: ".dechex($c).'<br />'; - // Do not match if next character in text is a Mark - if (isset($this->OTLdata[$ptr]['uni']) && \strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === \false) { - $matches[] = $ptr - 1; - } - $dictptr++; - } elseif ($x == static::_DICT_FINAL_MATCH) { - //echo "DICT_FINAL_MATCH: ".dechex($c).'<br />'; - // Do not match if next character in text is a Mark - if (isset($this->OTLdata[$ptr]['uni']) && \strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === \false) { - $matches[] = $ptr - 1; - } - return $matches; - } elseif ($x == static::_DICT_NODE_TYPE_LINEAR) { - //echo "DICT_NODE_TYPE_LINEAR: ".dechex($c).'<br />'; - $dictptr++; - $m = \ord($dict[$dictptr]); - if ($c == $m) { - $ptr++; - if ($ptr > \count($this->OTLdata) - 1) { - $next = \ord($dict[$dictptr + 1]); - if ($next == static::_DICT_INTERMEDIATE_MATCH || $next == static::_DICT_FINAL_MATCH) { - // Do not match if next character in text is a Mark - if (isset($this->OTLdata[$ptr]['uni']) && \strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === \false) { - $matches[] = $ptr - 1; - } - } - return $matches; - } - $dictptr++; - continue; - } else { - //echo "DICT_NODE_TYPE_LINEAR NOT: ".dechex($c).'<br />'; - return $matches; - } - } elseif ($x == static::_DICT_NODE_TYPE_SPLIT) { - //echo "DICT_NODE_TYPE_SPLIT ON ".dechex($d).": ".dechex($c).'<br />'; - $dictptr++; - $d = \ord($dict[$dictptr]); - if ($c < $d) { - $dictptr += 5; - } else { - $dictptr++; - // Unsigned long 32-bit offset - $offset = \ord($dict[$dictptr]) * 16777216 + (\ord($dict[$dictptr + 1]) << 16) + (\ord($dict[$dictptr + 2]) << 8) + \ord($dict[$dictptr + 3]); - $dictptr = $offset; - } - } else { - //echo "PROBLEM: ".($x).'<br />'; - $ok = \false; - // Something has gone wrong - } - } - return $matches; - } - //////////////////////////////////////////////////////////////// - ////////// GPOS /////////////////////////////////////// - //////////////////////////////////////////////////////////////// - private function _applyGPOSrules($LookupList, $is_old_spec = \false) - { - foreach ($LookupList as $lu => $tag) { - $Type = $this->GPOSLookups[$lu]['Type']; - $Flag = $this->GPOSLookups[$lu]['Flag']; - $MarkFilteringSet = ''; - if (isset($this->GPOSLookups[$lu]['MarkFilteringSet'])) { - $MarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; - } - $ptr = 0; - // Test each glyph sequentially - while ($ptr < \count($this->OTLdata)) { - // whilst there is another glyph ..0064 - $currGlyph = $this->OTLdata[$ptr]['hex']; - $currGID = $this->OTLdata[$ptr]['uni']; - $shift = 1; - foreach ($this->GPOSLookups[$lu]['Subtables'] as $c => $subtable_offset) { - // NB Coverage only looks at glyphs for position 1 (esp. 7.3 and 8.3) - if (isset($this->LuCoverage[$lu][$c][$currGID])) { - // Get rules from font GPOS subtable - if (isset($this->OTLdata[$ptr]['bidi_type'])) { - // No need to check bidi_type - just a check that it exists - $shift = $this->_applyGPOSsubtable($lu, $c, $ptr, $currGlyph, $currGID, $subtable_offset - $this->GPOS_offset + $this->GSUB_length, $Type, $Flag, $MarkFilteringSet, $this->LuCoverage[$lu][$c], $tag, 0, $is_old_spec); - if ($shift) { - break; - } - } - } - } - if ($shift == 0) { - $shift = 1; - } - $ptr += $shift; - } - } - } - ////////////////////////////////////////////////////////////////////////////////// - // GPOS Types - // Lookup Type 1: Single Adjustment Positioning Subtable Adjust position of a single glyph - // Lookup Type 2: Pair Adjustment Positioning Subtable Adjust position of a pair of glyphs - // Lookup Type 3: Cursive Attachment Positioning Subtable Attach cursive glyphs - // Lookup Type 4: MarkToBase Attachment Positioning Subtable Attach a combining mark to a base glyph - // Lookup Type 5: MarkToLigature Attachment Positioning Subtable Attach a combining mark to a ligature - // Lookup Type 6: MarkToMark Attachment Positioning Subtable Attach a combining mark to another mark - // Lookup Type 7: Contextual Positioning Subtables Position one or more glyphs in context - // Lookup Type 8: Chaining Contextual Positioning Subtable Position one or more glyphs in chained context - // Lookup Type 9: Extension positioning - ////////////////////////////////////////////////////////////////////////////////// - private function _applyGPOSvaluerecord($basepos, $Value) - { - // If current glyph is a mark with a defined width, any XAdvance is considered to REPLACE the character Advance Width - // Test case <div style="font-family:myanmartext">င်္က္ကျြွေိ</div> - if (\strpos($this->GlyphClassMarks, $this->OTLdata[$basepos]['hex']) !== \false) { - $cw = \round($this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$basepos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000); - // convert back to font design units - } else { - $cw = 0; - } - $apos = $this->_getXAdvancePos($basepos); - if (isset($Value['XAdvance']) && $Value['XAdvance'] - $cw != 0) { - // However DON'T REPLACE the character Advance Width if Advance Width is negative - // Test case <div style="font-family: dejavusansmono">ру́сский</div> - if ($Value['XAdvance'] < 0) { - $cw = 0; - } - // For LTR apply XAdvanceL to the last mark following the base = at $apos - // For RTL apply XAdvanceR to base = at $basepos - if (isset($this->OTLdata[$apos]['GPOSinfo']['XAdvanceL'])) { - $this->OTLdata[$apos]['GPOSinfo']['XAdvanceL'] += $Value['XAdvance'] - $cw; - } else { - $this->OTLdata[$apos]['GPOSinfo']['XAdvanceL'] = $Value['XAdvance'] - $cw; - } - if (isset($this->OTLdata[$basepos]['GPOSinfo']['XAdvanceR'])) { - $this->OTLdata[$basepos]['GPOSinfo']['XAdvanceR'] += $Value['XAdvance'] - $cw; - } else { - $this->OTLdata[$basepos]['GPOSinfo']['XAdvanceR'] = $Value['XAdvance'] - $cw; - } - } - // Any XPlacement (? and Y Placement) apply to base and marks (from basepos to apos) - for ($a = $basepos; $a <= $apos; $a++) { - if (isset($Value['XPlacement'])) { - if (isset($this->OTLdata[$a]['GPOSinfo']['XPlacement'])) { - $this->OTLdata[$a]['GPOSinfo']['XPlacement'] += $Value['XPlacement']; - } else { - $this->OTLdata[$a]['GPOSinfo']['XPlacement'] = $Value['XPlacement']; - } - } - if (isset($Value['YPlacement'])) { - if (isset($this->OTLdata[$a]['GPOSinfo']['YPlacement'])) { - $this->OTLdata[$a]['GPOSinfo']['YPlacement'] += $Value['YPlacement']; - } else { - $this->OTLdata[$a]['GPOSinfo']['YPlacement'] = $Value['YPlacement']; - } - } - } - } - // If XAdvance is aplied to $ptr - in order for PDF to position the Advance correctly need to place it on - // the last of any Marks which immediately follow the current glyph - private function _getXAdvancePos($pos) - { - // NB Not all fonts have all marks specified in GlyphClassMarks - // If the current glyph is not a base (but a mark) then ignore this, and apply to the current position - if (\strpos($this->GlyphClassMarks, $this->OTLdata[$pos]['hex']) !== \false) { - return $pos; - } - while (isset($this->OTLdata[$pos + 1]['hex']) && \strpos($this->GlyphClassMarks, $this->OTLdata[$pos + 1]['hex']) !== \false) { - $pos++; - } - return $pos; - } - private function _applyGPOSsubtable($lookupID, $subtable, $ptr, $currGlyph, $currGID, $subtable_offset, $Type, $Flag, $MarkFilteringSet, $LuCoverage, $tag, $level, $is_old_spec) - { - if (($Flag & 0x1) == 1) { - $dir = 'RTL'; - } else { - // only used for Type 3 - $dir = 'LTR'; - } - $ignore = $this->_getGCOMignoreString($Flag, $MarkFilteringSet); - // Lets start - $this->seek($subtable_offset); - $PosFormat = $this->read_ushort(); - //////////////////////////////////////////////////////////////////////////////// - // LookupType 1: Single adjustment Adjust position of a single glyph (e.g. SmallCaps/Sups/Subs) - //////////////////////////////////////////////////////////////////////////////// - if ($Type == 1) { - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - $Coverage = $subtable_offset + $this->read_ushort(); - $ValueFormat = $this->read_ushort(); - $Value = $this->_getValueRecord($ValueFormat); - } elseif ($PosFormat == 2) { - $Coverage = $subtable_offset + $this->read_ushort(); - $ValueFormat = $this->read_ushort(); - $ValueCount = $this->read_ushort(); - $GlyphPos = $LuCoverage[$currGID]; - $this->skip($GlyphPos * 2 * $this->count_bits($ValueFormat)); - $Value = $this->_getValueRecord($ValueFormat); - } - $this->_applyGPOSvaluerecord($ptr, $Value); - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return 1; - } elseif ($Type == 2) { - $Coverage = $subtable_offset + $this->read_ushort(); - $ValueFormat1 = $this->read_ushort(); - $ValueFormat2 = $this->read_ushort(); - $sizeOfPair = 2 * $this->count_bits($ValueFormat1) + 2 * $this->count_bits($ValueFormat2); - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - $PairSetCount = $this->read_ushort(); - $PairSetOffset = []; - for ($p = 0; $p < $PairSetCount; $p++) { - $PairSetOffset[] = $subtable_offset + $this->read_ushort(); - } - for ($p = 0; $p < $PairSetCount; $p++) { - if (isset($LuCoverage[$currGID]) && $LuCoverage[$currGID] == $p) { - $this->seek($PairSetOffset[$p]); - //PairSet table - $PairValueCount = $this->read_ushort(); - for ($pv = 0; $pv < $PairValueCount; $pv++) { - //PairValueRecord - $gid = $this->read_ushort(); - $SecondGlyph = $this->glyphToChar($gid); - $FirstGlyph = $this->OTLdata[$ptr]['uni']; - $checkpos = $ptr; - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - if (isset($this->OTLdata[$checkpos]) && $this->OTLdata[$checkpos]['uni'] == $SecondGlyph) { - $matchedpos = $checkpos; - } else { - $matchedpos = \false; - } - if ($matchedpos !== \false) { - $Value1 = $this->_getValueRecord($ValueFormat1); - $Value2 = $this->_getValueRecord($ValueFormat2); - if ($ValueFormat1) { - $this->_applyGPOSvaluerecord($ptr, $Value1); - } - if ($ValueFormat2) { - $this->_applyGPOSvaluerecord($matchedpos, $Value2); - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return $matchedpos - $ptr + 1; - } - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return $matchedpos - $ptr; - } else { - $this->skip($sizeOfPair); - } - } - } - } - return 0; - } elseif ($PosFormat == 2) { - $ClassDef1 = $subtable_offset + $this->read_ushort(); - $ClassDef2 = $subtable_offset + $this->read_ushort(); - $Class1Count = $this->read_ushort(); - $Class2Count = $this->read_ushort(); - $sizeOfValueRecords = $Class1Count * $Class2Count * $sizeOfPair; - //$this->skip($sizeOfValueRecords ); ???? NOT NEEDED - // NB Class1Count includes Class 0 even though it is not defined by $ClassDef1 - // i.e. Class1Count = 5; Class1 will contain array(indices 1-4); - $Class1 = $this->_getClassDefinitionTable($ClassDef1); - $Class2 = $this->_getClassDefinitionTable($ClassDef2); - $FirstGlyph = $this->OTLdata[$ptr]['uni']; - $checkpos = $ptr; - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - if (isset($this->OTLdata[$checkpos])) { - $matchedpos = $checkpos; - } else { - return 0; - } - $SecondGlyph = $this->OTLdata[$matchedpos]['uni']; - for ($i = 0; $i < $Class1Count; $i++) { - if (isset($Class1[$i]) && \count($Class1[$i])) { - $FirstClassPos = \array_search($FirstGlyph, $Class1[$i]); - if ($FirstClassPos === \false) { - continue; - } else { - for ($j = 0; $j < $Class2Count; $j++) { - if (isset($Class2[$j]) && \count($Class2[$j])) { - $SecondClassPos = \array_search($SecondGlyph, $Class2[$j]); - if ($SecondClassPos === \false) { - continue; - } - // Get ValueRecord[$i][$j] - $offs = $i * $Class2Count * $sizeOfPair + $j * $sizeOfPair; - $this->seek($subtable_offset + 16 + $offs); - $Value1 = $this->_getValueRecord($ValueFormat1); - $Value2 = $this->_getValueRecord($ValueFormat2); - if ($ValueFormat1) { - $this->_applyGPOSvaluerecord($ptr, $Value1); - } - if ($ValueFormat2) { - $this->_applyGPOSvaluerecord($matchedpos, $Value2); - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return $matchedpos - $ptr + 1; - } - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return $matchedpos - $ptr; - } - } - } - } - } - return 0; - } - } elseif ($Type == 3) { - $this->skip(4); - // Need default XAdvance for glyph - $pdfWidth = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], \hexdec($currGlyph)); - // DON'T convert back to design units - $CPos = $LuCoverage[$currGID]; - $this->skip($CPos * 4); - $EntryAnchor = $this->read_ushort(); - $ExitAnchor = $this->read_ushort(); - if ($EntryAnchor != 0) { - $EntryAnchor += $subtable_offset; - list($x, $y) = $this->_getAnchorTable($EntryAnchor); - if ($dir == 'RTL') { - if (\round($pdfWidth) == \round($x * 1000 / $this->mpdf->CurrentFont['unitsPerEm'])) { - $x = 0; - } else { - $x = $x - $pdfWidth * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - } - } - $this->Entry[$ptr] = ['X' => $x, 'Y' => $y, 'dir' => $dir]; - } - if ($ExitAnchor != 0) { - $ExitAnchor += $subtable_offset; - list($x, $y) = $this->_getAnchorTable($ExitAnchor); - if ($dir == 'LTR') { - if (\round($pdfWidth) == \round($x * 1000 / $this->mpdf->CurrentFont['unitsPerEm'])) { - $x = 0; - } else { - $x = $x - $pdfWidth * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - } - } - $this->Exit[$ptr] = ['X' => $x, 'Y' => $y, 'dir' => $dir]; - } - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return 1; - } elseif ($Type == 4) { - $MarkCoverage = $subtable_offset + $this->read_ushort(); - //$MarkCoverage is already set in $LuCoverage 00065|00073 etc - $BaseCoverage = $subtable_offset + $this->read_ushort(); - $ClassCount = $this->read_ushort(); - // Number of classes defined for marks = Number of mark glyphs in the MarkCoverage table - $MarkArray = $subtable_offset + $this->read_ushort(); - // Offset to MarkArray table - $BaseArray = $subtable_offset + $this->read_ushort(); - // Offset to BaseArray table - $this->seek($BaseCoverage); - $BaseGlyphs = \implode('|', $this->_getCoverage()); - $checkpos = $ptr; - $checkpos--; - // ZZZ93 - // In Lohit-Kannada font (old-spec), rules specify a Type 4 GPOS to attach below-forms to base glyph - // the repositioning does not happen in MS Word, and shouldn't happen comparing with other fonts - // ?Why not - // This Fix blocks the GPOS rule if the "mark" is not actually classified as a mark in the GlyphClasses of GDEF - // but only in Indic old-spec. - // Test cases: ನ್ನು and ಕ್ರೌ - if ($this->shaper == 'I' && $is_old_spec && \strpos($this->GlyphClassMarks, $this->OTLdata[$ptr]['hex']) === \false) { - return; - } - // "To identify the base glyph that combines with a mark, the text-processing client must look backward in the glyph string from the mark to the preceding base glyph." - while (isset($this->OTLdata[$checkpos]) && \strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - if (isset($this->OTLdata[$checkpos]) && \strpos($BaseGlyphs, $this->OTLdata[$checkpos]['hex']) !== \false) { - $matchedpos = $checkpos; - } else { - $matchedpos = \false; - } - if ($matchedpos !== \false) { - // Get the relevant MarkRecord - $MarkPos = $LuCoverage[$currGID]; - $MarkRecord = $this->_getMarkRecord($MarkArray, $MarkPos); - // e.g. Array ( [Class] => 0 [AnchorX] => -549 [AnchorY] => 1548 ) - //Mark Class is = $MarkRecord['Class'] - // Get the relevant BaseRecord - $this->seek($BaseArray); - $BaseCount = $this->read_ushort(); - $BasePos = \strpos($BaseGlyphs, $this->OTLdata[$matchedpos]['hex']) / 6; - // Move to the BaseRecord we want - $nSkip = 2 * $BasePos * $ClassCount; - $this->skip($nSkip); - // Read BaseRecord we want for appropriate Class - $nSkip = 2 * $MarkRecord['Class']; - $this->skip($nSkip); - $BaseRecordOffset = $BaseArray + $this->read_ushort(); - list($x, $y) = $this->_getAnchorTable($BaseRecordOffset); - $BaseRecord = ['AnchorX' => $x, 'AnchorY' => $y]; - // e.g. Array ( [AnchorX] => 660 [AnchorY] => 1556 ) - // Need default XAdvance for Base glyph - $BaseWidth = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$matchedpos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - // convert back to font design units - $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $BaseWidth; - // And any intervening (ignored) characters - if ($ptr - $matchedpos > 1) { - for ($i = $matchedpos + 1; $i < $ptr; $i++) { - $BaseWidthExtra = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$i]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - // convert back to font design units - $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] += $BaseWidthExtra; - } - } - // Align to previous Glyph by attachment - so need to add to previous placement values - $prevXPlacement = isset($this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement'] : 0; - $prevYPlacement = isset($this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement'] : 0; - $this->OTLdata[$ptr]['GPOSinfo']['XPlacement'] = $prevXPlacement + $BaseRecord['AnchorX'] - $MarkRecord['AnchorX']; - $this->OTLdata[$ptr]['GPOSinfo']['YPlacement'] = $prevYPlacement + $BaseRecord['AnchorY'] - $MarkRecord['AnchorY']; - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return 1; - } - return 0; - } elseif ($Type == 5) { - $MarkCoverage = $subtable_offset + $this->read_ushort(); - //$MarkCoverage is already set in $LuCoverage 00065|00073 etc - $LigatureCoverage = $subtable_offset + $this->read_ushort(); - $ClassCount = $this->read_ushort(); - // Number of classes defined for marks = Number of mark glyphs in the MarkCoverage table - $MarkArray = $subtable_offset + $this->read_ushort(); - // Offset to MarkArray table - $LigatureArray = $subtable_offset + $this->read_ushort(); - // Offset to LigatureArray table - $this->seek($LigatureCoverage); - $LigatureGlyphs = \implode('|', $this->_getCoverage()); - $checkpos = $ptr; - $checkpos--; - // "To position a combining mark using a MarkToLigature attachment subtable, the text-processing client must work backward from the mark to the preceding ligature glyph." - while (isset($this->OTLdata[$checkpos]) && \strpos($this->GlyphClassMarks, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - if (isset($this->OTLdata[$checkpos]) && \strpos($LigatureGlyphs, $this->OTLdata[$checkpos]['hex']) !== \false) { - $matchedpos = $checkpos; - } else { - $matchedpos = \false; - } - if ($matchedpos !== \false) { - // Get the relevant MarkRecord - $MarkPos = $LuCoverage[$currGID]; - $MarkRecord = $this->_getMarkRecord($MarkArray, $MarkPos); - // e.g. Array ( [Class] => 0 [AnchorX] => -549 [AnchorY] => 1548 ) - //Mark Class is = $MarkRecord['Class'] - // Get the relevant LigatureRecord - $this->seek($LigatureArray); - $LigatureCount = $this->read_ushort(); - $LigaturePos = \strpos($LigatureGlyphs, $this->OTLdata[$matchedpos]['hex']) / 6; - // Move to the LigatureAttach table Record we want - $nSkip = 2 * $LigaturePos; - $this->skip($nSkip); - $LigatureAttachOffset = $LigatureArray + $this->read_ushort(); - $this->seek($LigatureAttachOffset); - $ComponentCount = $this->read_ushort(); - $offsets = []; - for ($comp = 0; $comp < $ComponentCount; $comp++) { - // ComponentRecords - for ($class = 0; $class < $ClassCount; $class++) { - $offsets[$comp][$class] = $this->read_ushort(); - } - } - // Get the specific component for this mark attachment - if (isset($this->assocLigs[$matchedpos]) && isset($this->assocMarks[$ptr]['ligPos']) && $this->assocMarks[$ptr]['ligPos'] == $matchedpos) { - $component = $this->assocMarks[$ptr]['compID']; - } else { - $component = $ComponentCount - 1; - } - $offset = $offsets[$component][$MarkRecord['Class']]; - if ($offset != 0) { - $LigatureRecordOffset = $offset + $LigatureAttachOffset; - list($x, $y) = $this->_getAnchorTable($LigatureRecordOffset); - $LigatureRecord = ['AnchorX' => $x, 'AnchorY' => $y]; - // Need default XAdvance for Ligature glyph - $LigatureWidth = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$matchedpos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - // convert back to font design units - $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $LigatureWidth; - // And any intervening (ignored)characters - if ($ptr - $matchedpos > 1) { - for ($i = $matchedpos + 1; $i < $ptr; $i++) { - $LigatureWidthExtra = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$i]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - // convert back to font design units - $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] += $LigatureWidthExtra; - } - } - // Align to previous Ligature by attachment - so need to add to previous placement values - if (isset($this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement'])) { - $prevXPlacement = $this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement']; - } else { - $prevXPlacement = 0; - } - if (isset($this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement'])) { - $prevYPlacement = $this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement']; - } else { - $prevYPlacement = 0; - } - $this->OTLdata[$ptr]['GPOSinfo']['XPlacement'] = $prevXPlacement + $LigatureRecord['AnchorX'] - $MarkRecord['AnchorX']; - $this->OTLdata[$ptr]['GPOSinfo']['YPlacement'] = $prevYPlacement + $LigatureRecord['AnchorY'] - $MarkRecord['AnchorY']; - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return 1; - } - } - return 0; - } elseif ($Type == 6) { - $Mark1Coverage = $subtable_offset + $this->read_ushort(); - // Combining Mark - //$Mark1Coverage is already set in $LuCoverage 0065|0073 etc - $Mark2Coverage = $subtable_offset + $this->read_ushort(); - // Base Mark - $ClassCount = $this->read_ushort(); - // Number of classes defined for marks = No. of Combining mark1 glyphs in the MarkCoverage table - $Mark1Array = $subtable_offset + $this->read_ushort(); - // Offset to MarkArray table - $Mark2Array = $subtable_offset + $this->read_ushort(); - // Offset to Mark2Array table - $this->seek($Mark2Coverage); - $Mark2Glyphs = \implode('|', $this->_getCoverage()); - $checkpos = $ptr; - $checkpos--; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - if (isset($this->OTLdata[$checkpos]) && \strpos($Mark2Glyphs, $this->OTLdata[$checkpos]['hex']) !== \false) { - $matchedpos = $checkpos; - } else { - $matchedpos = \false; - } - if ($matchedpos !== \false) { - // Get the relevant MarkRecord - $Mark1Pos = $LuCoverage[$currGID]; - $Mark1Record = $this->_getMarkRecord($Mark1Array, $Mark1Pos); - // e.g. Array ( [Class] => 0 [AnchorX] => -549 [AnchorY] => 1548 ) - //Mark Class is = $Mark1Record['Class'] - // Get the relevant Mark2Record - $this->seek($Mark2Array); - $Mark2Count = $this->read_ushort(); - $Mark2Pos = \strpos($Mark2Glyphs, $this->OTLdata[$matchedpos]['hex']) / 6; - // Move to the Mark2Record we want - $nSkip = 2 * $Mark2Pos * $ClassCount; - $this->skip($nSkip); - // Read Mark2Record we want for appropriate Class - $nSkip = 2 * $Mark1Record['Class']; - $this->skip($nSkip); - $Mark2RecordOffset = $Mark2Array + $this->read_ushort(); - list($x, $y) = $this->_getAnchorTable($Mark2RecordOffset); - $Mark2Record = ['AnchorX' => $x, 'AnchorY' => $y]; - // e.g. Array ( [AnchorX] => 660 [AnchorY] => 1556 ) - // Need default XAdvance for Mark2 glyph - $Mark2Width = $this->mpdf->_getCharWidth($this->mpdf->CurrentFont['cw'], $this->OTLdata[$matchedpos]['uni']) * $this->mpdf->CurrentFont['unitsPerEm'] / 1000; - // convert back to font design units - // IF combining marks are set on different components of a ligature glyph, do not apply this rule - // Test: arabictypesetting: إِلَىٰٓ - // Test: arabictypesetting: بَّيْنَكُمْ - $prevLig = -1; - $thisLig = -1; - $prevComp = -1; - $thisComp = -1; - if (isset($this->assocMarks[$matchedpos])) { - $prevLig = $this->assocMarks[$matchedpos]['ligPos']; - $prevComp = $this->assocMarks[$matchedpos]['compID']; - } - if (isset($this->assocMarks[$ptr])) { - $thisLig = $this->assocMarks[$ptr]['ligPos']; - $thisComp = $this->assocMarks[$ptr]['compID']; - } - // However IF Mark2 (first in logical order, i.e. being attached to) is not associated with a base, carry on - // This happens in Indic when the Mark being attached to e.g. [Halant Ma lig] -> MatraU, [U+0B4D + U+B2E as E0F5]-> U+0B41 become E135 - if (!\defined("OMIT_OTL_FIX_1") || OMIT_OTL_FIX_1 != 1) { - /* OTL_FIX_1 */ - if (isset($this->assocMarks[$matchedpos]) && ($prevLig != $thisLig || $prevComp != $thisComp)) { - return 0; - } - } else { - /* Original code */ - if ($prevLig != $thisLig || $prevComp != $thisComp) { - return 0; - } - } - if (!\defined("OMIT_OTL_FIX_2") || OMIT_OTL_FIX_2 != 1) { - /* OTL_FIX_2 */ - if (!isset($this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) || !$this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) { - $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $Mark2Width; - } - } - // ZZZ99Q - Test Case font-family: garuda น้ำ - if (isset($this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) && $this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']) { - $this->OTLdata[$ptr]['GPOSinfo']['BaseWidth'] = $this->OTLdata[$matchedpos]['GPOSinfo']['BaseWidth']; - } - // Align to previous Mark by attachment - so need to add the previous placement values - $prevXPlacement = isset($this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['XPlacement'] : 0; - $prevYPlacement = isset($this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement']) ? $this->OTLdata[$matchedpos]['GPOSinfo']['YPlacement'] : 0; - $this->OTLdata[$ptr]['GPOSinfo']['XPlacement'] = $prevXPlacement + $Mark2Record['AnchorX'] - $Mark1Record['AnchorX']; - $this->OTLdata[$ptr]['GPOSinfo']['YPlacement'] = $prevYPlacement + $Mark2Record['AnchorY'] - $Mark1Record['AnchorY']; - if ($this->debugOTL) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - return 1; - } - return 0; - } elseif ($Type == 7) { - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); - } elseif ($PosFormat == 2) { - $CoverageTableOffset = $subtable_offset + $this->read_ushort(); - $InputClassDefOffset = $subtable_offset + $this->read_ushort(); - $PosClassSetCnt = $this->read_ushort(); - $PosClassSetOffset = []; - for ($b = 0; $b < $PosClassSetCnt; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $PosClassSetOffset[] = $offset; - } else { - $PosClassSetOffset[] = $subtable_offset + $offset; - } - } - $InputClasses = $this->_getClasses($InputClassDefOffset); - for ($s = 0; $s < $PosClassSetCnt; $s++) { - // $ChainPosClassSet is ordered by input class-may be NULL - // Select $PosClassSet if currGlyph is in First Input Class - if ($PosClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { - $this->seek($PosClassSetOffset[$s]); - $PosClassRuleCnt = $this->read_ushort(); - $PosClassRule = []; - for ($b = 0; $b < $PosClassRuleCnt; $b++) { - $PosClassRule[$b] = $PosClassSetOffset[$s] + $this->read_ushort(); - } - for ($b = 0; $b < $PosClassRuleCnt; $b++) { - // EACH RULE - $this->seek($PosClassRule[$b]); - $InputGlyphCount = $this->read_ushort(); - $PosCount = $this->read_ushort(); - $Input = []; - for ($r = 1; $r < $InputGlyphCount; $r++) { - $Input[$r] = $this->read_ushort(); - } - $inputClass = $s; - $inputGlyphs = []; - $inputGlyphs[0] = $InputClasses[$inputClass]; - if ($InputGlyphCount > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { - $classindex = $Input[$gcl]; - if (isset($InputClasses[$classindex])) { - $inputGlyphs[$gcl] = $InputClasses[$classindex]; - } else { - $inputGlyphs[$gcl] = ''; - } - } - } - // Class 0 contains all the glyphs NOT in the other classes - $class0excl = []; - for ($gc = 1; $gc <= \count($InputClasses); $gc++) { - if (\is_array($InputClasses[$gc])) { - $class0excl = $class0excl + $InputClasses[$gc]; - } - } - $backtrackGlyphs = []; - $lookaheadGlyphs = []; - $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl); - if ($matched) { - for ($p = 0; $p < $PosCount; $p++) { - // EACH LOOKUP - $SequenceIndex[$p] = $this->read_ushort(); - $LookupListIndex[$p] = $this->read_ushort(); - } - for ($p = 0; $p < $PosCount; $p++) { - // Apply $LookupListIndex at $SequenceIndex - if ($SequenceIndex[$p] >= $InputGlyphCount) { - continue; - } - $lu = $LookupListIndex[$p]; - $luType = $this->GPOSLookups[$lu]['Type']; - $luFlag = $this->GPOSLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SequenceIndex[$p]]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GPOSLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGPOSsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GPOS_offset + $this->GSUB_length, $luType, $luFlag, $luMarkFilteringSet, $this->LuCoverage[$lu][$luc], $tag, 1, $is_old_spec); - if ($this->debugOTL && $shift) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return $shift; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - } - } - } - return 0; - } elseif ($PosFormat == 3) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GPOS Lookup Type " . $Type . ", Format " . $PosFormat . " not supported."); - } - } elseif ($Type == 8) { - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); - return 0; - } elseif ($PosFormat == 2) { - $CoverageTableOffset = $subtable_offset + $this->read_ushort(); - $BacktrackClassDefOffset = $subtable_offset + $this->read_ushort(); - $InputClassDefOffset = $subtable_offset + $this->read_ushort(); - $LookaheadClassDefOffset = $subtable_offset + $this->read_ushort(); - $ChainPosClassSetCnt = $this->read_ushort(); - $ChainPosClassSetOffset = []; - for ($b = 0; $b < $ChainPosClassSetCnt; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $ChainPosClassSetOffset[] = $offset; - } else { - $ChainPosClassSetOffset[] = $subtable_offset + $offset; - } - } - $BacktrackClasses = $this->_getClasses($BacktrackClassDefOffset); - $InputClasses = $this->_getClasses($InputClassDefOffset); - $LookaheadClasses = $this->_getClasses($LookaheadClassDefOffset); - for ($s = 0; $s < $ChainPosClassSetCnt; $s++) { - // $ChainPosClassSet is ordered by input class-may be NULL - // Select $ChainPosClassSet if currGlyph is in First Input Class - if ($ChainPosClassSetOffset[$s] > 0 && isset($InputClasses[$s][$currGID])) { - $this->seek($ChainPosClassSetOffset[$s]); - $ChainPosClassRuleCnt = $this->read_ushort(); - $ChainPosClassRule = []; - for ($b = 0; $b < $ChainPosClassRuleCnt; $b++) { - $ChainPosClassRule[$b] = $ChainPosClassSetOffset[$s] + $this->read_ushort(); - } - for ($b = 0; $b < $ChainPosClassRuleCnt; $b++) { - // EACH RULE - $this->seek($ChainPosClassRule[$b]); - $BacktrackGlyphCount = $this->read_ushort(); - $Backtrack = []; - for ($r = 0; $r < $BacktrackGlyphCount; $r++) { - $Backtrack[$r] = $this->read_ushort(); - } - $InputGlyphCount = $this->read_ushort(); - $Input = []; - for ($r = 1; $r < $InputGlyphCount; $r++) { - $Input[$r] = $this->read_ushort(); - } - $LookaheadGlyphCount = $this->read_ushort(); - $Lookahead = []; - for ($r = 0; $r < $LookaheadGlyphCount; $r++) { - $Lookahead[$r] = $this->read_ushort(); - } - $inputClass = $s; - //??? - $inputGlyphs = []; - $inputGlyphs[0] = $InputClasses[$inputClass]; - if ($InputGlyphCount > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $InputGlyphCount; $gcl++) { - $classindex = $Input[$gcl]; - if (isset($InputClasses[$classindex])) { - $inputGlyphs[$gcl] = $InputClasses[$classindex]; - } else { - $inputGlyphs[$gcl] = ''; - } - } - } - // Class 0 contains all the glyphs NOT in the other classes - $class0excl = []; - for ($gc = 1; $gc <= \count($InputClasses); $gc++) { - if (isset($InputClasses[$gc]) && \is_array($InputClasses[$gc])) { - $class0excl = $class0excl + $InputClasses[$gc]; - } - } - if ($BacktrackGlyphCount) { - $backtrackGlyphs = []; - for ($gcl = 0; $gcl < $BacktrackGlyphCount; $gcl++) { - $classindex = $Backtrack[$gcl]; - if (isset($BacktrackClasses[$classindex])) { - $backtrackGlyphs[$gcl] = $BacktrackClasses[$classindex]; - } else { - $backtrackGlyphs[$gcl] = ''; - } - } - } else { - $backtrackGlyphs = []; - } - // Class 0 contains all the glyphs NOT in the other classes - $bclass0excl = []; - for ($gc = 1; $gc <= \count($BacktrackClasses); $gc++) { - if (isset($BacktrackClasses[$gc]) && \is_array($BacktrackClasses[$gc])) { - $bclass0excl = $bclass0excl + $BacktrackClasses[$gc]; - } - } - if ($LookaheadGlyphCount) { - $lookaheadGlyphs = []; - for ($gcl = 0; $gcl < $LookaheadGlyphCount; $gcl++) { - $classindex = $Lookahead[$gcl]; - if (isset($LookaheadClasses[$classindex])) { - $lookaheadGlyphs[$gcl] = $LookaheadClasses[$classindex]; - } else { - $lookaheadGlyphs[$gcl] = ''; - } - } - } else { - $lookaheadGlyphs = []; - } - // Class 0 contains all the glyphs NOT in the other classes - $lclass0excl = []; - for ($gc = 1; $gc <= \count($LookaheadClasses); $gc++) { - if (isset($LookaheadClasses[$gc]) && \is_array($LookaheadClasses[$gc])) { - $lclass0excl = $lclass0excl + $LookaheadClasses[$gc]; - } - } - $matched = $this->checkContextMatchMultipleUni($inputGlyphs, $backtrackGlyphs, $lookaheadGlyphs, $ignore, $ptr, $class0excl, $bclass0excl, $lclass0excl); - if ($matched) { - $PosCount = $this->read_ushort(); - $SequenceIndex = []; - $LookupListIndex = []; - for ($p = 0; $p < $PosCount; $p++) { - // EACH LOOKUP - $SequenceIndex[$p] = $this->read_ushort(); - $LookupListIndex[$p] = $this->read_ushort(); - } - for ($p = 0; $p < $PosCount; $p++) { - // Apply $LookupListIndex at $SequenceIndex - if ($SequenceIndex[$p] >= $InputGlyphCount) { - continue; - } - $lu = $LookupListIndex[$p]; - $luType = $this->GPOSLookups[$lu]['Type']; - $luFlag = $this->GPOSLookups[$lu]['Flag']; - $luMarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; - $luptr = $matched[$SequenceIndex[$p]]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GPOSLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGPOSsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GPOS_offset + $this->GSUB_length, $luType, $luFlag, $luMarkFilteringSet, $this->LuCoverage[$lu][$luc], $tag, 1, $is_old_spec); - if ($this->debugOTL && $shift) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - break; - } - } - } - if (!\defined("OMIT_OTL_FIX_3") || OMIT_OTL_FIX_3 != 1) { - return $shift; - } else { - return $InputGlyphCount; - // should be + matched ignores in Input Sequence - } - } - } - } - } - return 0; - } elseif ($PosFormat == 3) { - $BacktrackGlyphCount = $this->read_ushort(); - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $CoverageBacktrackOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $InputGlyphCount = $this->read_ushort(); - for ($b = 0; $b < $InputGlyphCount; $b++) { - $CoverageInputOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $LookaheadGlyphCount = $this->read_ushort(); - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $CoverageLookaheadOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $PosCount = $this->read_ushort(); - $save_pos = $this->_pos; - // Save the point just after PosCount - $CoverageBacktrackGlyphs = []; - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $this->seek($CoverageBacktrackOffset[$b]); - $glyphs = $this->_getCoverage(); - $CoverageBacktrackGlyphs[$b] = \implode("|", $glyphs); - } - $CoverageInputGlyphs = []; - for ($b = 0; $b < $InputGlyphCount; $b++) { - $this->seek($CoverageInputOffset[$b]); - $glyphs = $this->_getCoverage(); - $CoverageInputGlyphs[$b] = \implode("|", $glyphs); - } - $CoverageLookaheadGlyphs = []; - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $this->seek($CoverageLookaheadOffset[$b]); - $glyphs = $this->_getCoverage(); - $CoverageLookaheadGlyphs[$b] = \implode("|", $glyphs); - } - $matched = $this->checkContextMatchMultiple($CoverageInputGlyphs, $CoverageBacktrackGlyphs, $CoverageLookaheadGlyphs, $ignore, $ptr); - if ($matched) { - $this->seek($save_pos); - // Return to just after PosCount - for ($p = 0; $p < $PosCount; $p++) { - // PosLookupRecord - $PosLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); - $PosLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); - } - for ($p = 0; $p < $PosCount; $p++) { - // Apply $PosLookupRecord[$p]['LookupListIndex'] at $PosLookupRecord[$p]['SequenceIndex'] - if ($PosLookupRecord[$p]['SequenceIndex'] >= $InputGlyphCount) { - continue; - } - $lu = $PosLookupRecord[$p]['LookupListIndex']; - $luType = $this->GPOSLookups[$lu]['Type']; - $luFlag = $this->GPOSLookups[$lu]['Flag']; - if (isset($this->GPOSLookups[$lu]['MarkFilteringSet'])) { - $luMarkFilteringSet = $this->GPOSLookups[$lu]['MarkFilteringSet']; - } else { - $luMarkFilteringSet = ''; - } - $luptr = $matched[$PosLookupRecord[$p]['SequenceIndex']]; - $lucurrGlyph = $this->OTLdata[$luptr]['hex']; - $lucurrGID = $this->OTLdata[$luptr]['uni']; - foreach ($this->GPOSLookups[$lu]['Subtables'] as $luc => $lusubtable_offset) { - $shift = $this->_applyGPOSsubtable($lu, $luc, $luptr, $lucurrGlyph, $lucurrGID, $lusubtable_offset - $this->GPOS_offset + $this->GSUB_length, $luType, $luFlag, $luMarkFilteringSet, $this->LuCoverage[$lu][$luc], $tag, 1, $is_old_spec); - if ($this->debugOTL && $shift) { - $this->_dumpproc('GPOS', $lookupID, $subtable, $Type, $PosFormat, $ptr, $currGlyph, $level); - } - if ($shift) { - break; - } - } - } - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GPOS Lookup Type " . $Type . ", Format " . $PosFormat . " not supported."); - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("GPOS Lookup Type " . $Type . " not supported."); - } - } - ////////////////////////////////////////////////////////////////////////////////// - // GPOS / GSUB / GCOM (common) functions - ////////////////////////////////////////////////////////////////////////////////// - private function checkContextMatch($Input, $Backtrack, $Lookahead, $ignore, $ptr) - { - // Input etc are single numbers - GSUB Format 6.1 - // Input starts with (1=>xxx) - // return false if no match, else an array of ptr for matches (0=>0, 1=>3,...) - $current_syllable = isset($this->OTLdata[$ptr]['syllable']) ? $this->OTLdata[$ptr]['syllable'] : 0; - // BACKTRACK - $checkpos = $ptr; - for ($i = 0; $i < \count($Backtrack); $i++) { - $checkpos--; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!isset($this->OTLdata[$checkpos]) || $this->OTLdata[$checkpos]['uni'] != $Backtrack[$i]) { - return \false; - } - } - // INPUT - $matched = [0 => $ptr]; - $checkpos = $ptr; - for ($i = 1; $i < \count($Input); $i++) { - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (isset($this->OTLdata[$checkpos]) && $this->OTLdata[$checkpos]['uni'] == $Input[$i]) { - $matched[] = $checkpos; - } else { - return \false; - } - } - // LOOKAHEAD - for ($i = 0; $i < \count($Lookahead); $i++) { - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!isset($this->OTLdata[$checkpos]) || $this->OTLdata[$checkpos]['uni'] != $Lookahead[$i]) { - return \false; - } - } - return $matched; - } - private function checkContextMatchMultiple($Input, $Backtrack, $Lookahead, $ignore, $ptr, $class0excl = '', $bclass0excl = '', $lclass0excl = '') - { - // Input etc are string/array of glyph strings - GSUB Format 5.2, 5.3, 6.2, 6.3, GPOS Format 7.2, 7.3, 8.2, 8.3 - // Input starts with (1=>xxx) - // return false if no match, else an array of ptr for matches (0=>0, 1=>3,...) - // $class0excl is the string of glyphs in all classes except Class 0 (GSUB 5.2, 6.2, GPOS 7.2, 8.2) - // $bclass0excl & $lclass0excl are the same for lookahead and backtrack (GSUB 6.2, GPOS 8.2) - $current_syllable = isset($this->OTLdata[$ptr]['syllable']) ? $this->OTLdata[$ptr]['syllable'] : 0; - // BACKTRACK - $checkpos = $ptr; - for ($i = 0; $i < \count($Backtrack); $i++) { - $checkpos--; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!$Backtrack[$i] && isset($this->OTLdata[$checkpos]) && \strpos($bclass0excl, $this->OTLdata[$checkpos]['hex']) !== \false) { - return \false; - } elseif (!isset($this->OTLdata[$checkpos]) || \strpos($Backtrack[$i], $this->OTLdata[$checkpos]['hex']) === \false) { - return \false; - } - } - // INPUT - $matched = [0 => $ptr]; - $checkpos = $ptr; - for ($i = 1; $i < \count($Input); $i++) { - // Start at 1 - already matched the first InputGlyph - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!$Input[$i] && isset($this->OTLdata[$checkpos]) && \strpos($class0excl, $this->OTLdata[$checkpos]['hex']) === \false) { - $matched[] = $checkpos; - } elseif (isset($this->OTLdata[$checkpos]) && \strpos($Input[$i], $this->OTLdata[$checkpos]['hex']) !== \false) { - $matched[] = $checkpos; - } else { - return \false; - } - } - // LOOKAHEAD - for ($i = 0; $i < \count($Lookahead); $i++) { - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!$Lookahead[$i] && isset($this->OTLdata[$checkpos]) && \strpos($lclass0excl, $this->OTLdata[$checkpos]['hex']) !== \false) { - return \false; - } elseif (!isset($this->OTLdata[$checkpos]) || \strpos($Lookahead[$i], $this->OTLdata[$checkpos]['hex']) === \false) { - return \false; - } - } - return $matched; - } - private function checkContextMatchMultipleUni($Input, $Backtrack, $Lookahead, $ignore, $ptr, $class0excl = [], $bclass0excl = [], $lclass0excl = []) - { - // Input etc are array of glyphs - GSUB Format 5.2, 5.3, 6.2, 6.3, GPOS Format 7.2, 7.3, 8.2, 8.3 - // Input starts with (1=>xxx) - // return false if no match, else an array of ptr for matches (0=>0, 1=>3,...) - // $class0excl is array of glyphs in all classes except Class 0 (GSUB 5.2, 6.2, GPOS 7.2, 8.2) - // $bclass0excl & $lclass0excl are the same for lookahead and backtrack (GSUB 6.2, GPOS 8.2) - $current_syllable = isset($this->OTLdata[$ptr]['syllable']) ? $this->OTLdata[$ptr]['syllable'] : 0; - // BACKTRACK - $checkpos = $ptr; - for ($i = 0; $i < \count($Backtrack); $i++) { - $checkpos--; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos--; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!$Backtrack[$i] && isset($this->OTLdata[$checkpos]) && isset($bclass0excl[$this->OTLdata[$checkpos]['uni']])) { - return \false; - } elseif (!isset($this->OTLdata[$checkpos]) || !isset($Backtrack[$i][$this->OTLdata[$checkpos]['uni']])) { - return \false; - } - } - // INPUT - $matched = [0 => $ptr]; - $checkpos = $ptr; - for ($i = 1; $i < \count($Input); $i++) { - // Start at 1 - already matched the first InputGlyph - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!$Input[$i] && isset($this->OTLdata[$checkpos]) && !isset($class0excl[$this->OTLdata[$checkpos]['uni']])) { - $matched[] = $checkpos; - } elseif (isset($this->OTLdata[$checkpos]) && isset($Input[$i][$this->OTLdata[$checkpos]['uni']])) { - $matched[] = $checkpos; - } else { - return \false; - } - } - // LOOKAHEAD - for ($i = 0; $i < \count($Lookahead); $i++) { - $checkpos++; - while (isset($this->OTLdata[$checkpos]) && \strpos($ignore, $this->OTLdata[$checkpos]['hex']) !== \false) { - $checkpos++; - } - // If outside scope of current syllable - return no match - if ($this->restrictToSyllable && isset($this->OTLdata[$checkpos]['syllable']) && $this->OTLdata[$checkpos]['syllable'] != $current_syllable) { - return \false; - } elseif (!$Lookahead[$i] && isset($this->OTLdata[$checkpos]) && isset($lclass0excl[$this->OTLdata[$checkpos]['uni']])) { - return \false; - } elseif (!isset($this->OTLdata[$checkpos]) || !isset($Lookahead[$i][$this->OTLdata[$checkpos]['uni']])) { - return \false; - } - } - return $matched; - } - private function _getClassDefinitionTable($offset) - { - if (isset($this->LuDataCache[$this->fontkey][$offset])) { - $GlyphByClass = $this->LuDataCache[$this->fontkey][$offset]; - } else { - $this->seek($offset); - $ClassFormat = $this->read_ushort(); - $GlyphClass = []; - $GlyphByClass = []; - if ($ClassFormat == 1) { - $StartGlyph = $this->read_ushort(); - $GlyphCount = $this->read_ushort(); - for ($i = 0; $i < $GlyphCount; $i++) { - $GlyphClass[$i]['startGlyphID'] = $StartGlyph + $i; - $GlyphClass[$i]['endGlyphID'] = $StartGlyph + $i; - $GlyphClass[$i]['class'] = $this->read_ushort(); - for ($g = $GlyphClass[$i]['startGlyphID']; $g <= $GlyphClass[$i]['endGlyphID']; $g++) { - $GlyphByClass[$GlyphClass[$i]['class']][] = $this->glyphToChar($g); - } - } - } elseif ($ClassFormat == 2) { - $tableCount = $this->read_ushort(); - for ($i = 0; $i < $tableCount; $i++) { - $GlyphClass[$i]['startGlyphID'] = $this->read_ushort(); - $GlyphClass[$i]['endGlyphID'] = $this->read_ushort(); - $GlyphClass[$i]['class'] = $this->read_ushort(); - for ($g = $GlyphClass[$i]['startGlyphID']; $g <= $GlyphClass[$i]['endGlyphID']; $g++) { - $GlyphByClass[$GlyphClass[$i]['class']][] = $this->glyphToChar($g); - } - } - } - \ksort($GlyphByClass); - $this->LuDataCache[$this->fontkey][$offset] = $GlyphByClass; - } - return $GlyphByClass; - } - private function count_bits($n) - { - for ($c = 0; $n; $c++) { - $n &= $n - 1; - // clear the least significant bit set - } - return $c; - } - private function _getValueRecord($ValueFormat) - { - // Common ValueRecord for GPOS - // Only returns 3 possible: $vra['XPlacement'] $vra['YPlacement'] $vra['XAdvance'] - $vra = []; - // Horizontal adjustment for placement - in design units - if (($ValueFormat & 0x1) == 0x1) { - $vra['XPlacement'] = $this->read_short(); - } - // Vertical adjustment for placement - in design units - if (($ValueFormat & 0x2) == 0x2) { - $vra['YPlacement'] = $this->read_short(); - } - // Horizontal adjustment for advance - in design units (only used for horizontal writing) - if (($ValueFormat & 0x4) == 0x4) { - $vra['XAdvance'] = $this->read_short(); - } - // Vertical adjustment for advance - in design units (only used for vertical writing) - if (($ValueFormat & 0x8) == 0x8) { - $this->read_short(); - } - // Offset to Device table for horizontal placement-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x10) == 0x10) { - $this->read_ushort(); - } - // Offset to Device table for vertical placement-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x20) == 0x20) { - $this->read_ushort(); - } - // Offset to Device table for horizontal advance-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x40) == 0x40) { - $this->read_ushort(); - } - // Offset to Device table for vertical advance-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x80) == 0x80) { - $this->read_ushort(); - } - return $vra; - } - private function _getAnchorTable($offset = 0) - { - if ($offset) { - $this->seek($offset); - } - $AnchorFormat = $this->read_ushort(); - $XCoordinate = $this->read_short(); - $YCoordinate = $this->read_short(); - // Format 2 specifies additional link to contour point; Format 3 additional Device table - return [$XCoordinate, $YCoordinate]; - } - private function _getMarkRecord($offset, $MarkPos) - { - $this->seek($offset); - $MarkCount = $this->read_ushort(); - $this->skip($MarkPos * 4); - $Class = $this->read_ushort(); - $MarkAnchor = $offset + $this->read_ushort(); - // = Offset to anchor table - list($x, $y) = $this->_getAnchorTable($MarkAnchor); - $MarkRecord = ['Class' => $Class, 'AnchorX' => $x, 'AnchorY' => $y]; - return $MarkRecord; - } - private function _getGCOMignoreString($flag, $MarkFilteringSet) - { - // If ignoreFlag set, combine all ignore glyphs into -> "(?:( 0FBA1| 0FBA2| 0FBA3)*)" - // else "()" - // for Input - set on secondary Lookup table if in Context, and set Backtrack and Lookahead on Context Lookup - $str = ""; - $ignoreflag = 0; - // Flag & 0xFF?? = MarkAttachmentType - if ($flag & 0xff00) { - // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" - // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table - $MarkAttachmentType = $flag >> 8; - $ignoreflag = $flag; - $str = $this->MarkAttachmentType[$MarkAttachmentType]; - } - // Flag & 0x0010 = UseMarkFilteringSet - if ($flag & 0x10) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("This font [" . $this->fontkey . "] contains MarkGlyphSets - Not tested yet"); - // Change also in ttfontsuni.php - if ($MarkFilteringSet == '') { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("This font [" . $this->fontkey . "] contains MarkGlyphSets - but MarkFilteringSet not set"); - } - $str = $this->MarkGlyphSets[$MarkFilteringSet]; - } - // If Ignore Marks set, supercedes any above - // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) - if (($flag & 0x8) == 0x8 && ($flag & 0xff00) == 0) { - $ignoreflag = 8; - $str = $this->GlyphClassMarks; - } - // Flag & 0x0004 = Ignore Ligatures - if (($flag & 0x4) == 0x4) { - $ignoreflag += 4; - if ($str) { - $str .= "|"; - } - $str .= $this->GlyphClassLigatures; - } - // Flag & 0x0002 = Ignore BaseGlyphs - if (($flag & 0x2) == 0x2) { - $ignoreflag += 2; - if ($str) { - $str .= "|"; - } - $str .= $this->GlyphClassBases; - } - if ($str) { - return "((?:(?:" . $str . "))*)"; - } else { - return "()"; - } - } - private function _checkGCOMignore($flag, $glyph, $MarkFilteringSet) - { - $ignore = \false; - // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) - if ($flag & 0x8 && ($flag & 0xff00) == 0 && \strpos($this->GlyphClassMarks, $glyph)) { - $ignore = \true; - } - if ($flag & 0x4 && \strpos($this->GlyphClassLigatures, $glyph)) { - $ignore = \true; - } - if ($flag & 0x2 && \strpos($this->GlyphClassBases, $glyph)) { - $ignore = \true; - } - // Flag & 0xFF?? = MarkAttachmentType - if ($flag & 0xff00) { - // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" - // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table - if (\strpos($this->MarkAttachmentType[$flag >> 8], $glyph)) { - $ignore = \true; - } - } - // Flag & 0x0010 = UseMarkFilteringSet - if ($flag & 0x10 && \strpos($this->MarkGlyphSets[$MarkFilteringSet], $glyph)) { - $ignore = \true; - } - return $ignore; - } - /** - * Bidi algorithm - * - * These functions are called from mpdf after GSUB/GPOS has taken place - * At this stage the bidi-type is in string form - * - * Bidirectional Character Types - * ============================= - * Type Description General Scope - * Strong - * L Left-to-Right LRM, most alphabetic, syllabic, Han ideographs, non-European or non-Arabic digits, ... - * LRE Left-to-Right Embedding LRE - * LRO Left-to-Right Override LRO - * R Right-to-Left RLM, Hebrew alphabet, and related punctuation - * AL Right-to-Left Arabic Arabic, Thaana, and Syriac alphabets, most punctuation specific to those scripts, ... - * RLE Right-to-Left Embedding RLE - * RLO Right-to-Left Override RLO - * Weak - * PDF Pop Directional Format PDF - * EN European Number European digits, Eastern Arabic-Indic digits, ... - * ES European Number Separator Plus sign, minus sign - * ET European Number Terminator Degree sign, currency symbols, ... - * AN Arabic Number Arabic-Indic digits, Arabic decimal and thousands separators, ... - * CS Common Number Separator Colon, comma, full stop (period), No-break space, ... - * NSM Nonspacing Mark Characters marked Mn (Nonspacing_Mark) and Me (Enclosing_Mark) in the Unicode Character Database - * BN Boundary Neutral Default ignorables, non-characters, and control characters, other than those explicitly given other types. - * Neutral - * B Paragraph Separator Paragraph separator, appropriate Newline Functions, higher-level protocol paragraph determination - * S Segment Separator Tab - * WS Whitespace Space, figure space, line separator, form feed, General Punctuation spaces, ... - * ON Other Neutrals All other characters, including OBJECT REPLACEMENT CHARACTER - */ - public function bidiSort($ta, $str, $dir, &$chunkOTLdata, $useGPOS) - { - $pel = 0; - // paragraph embedding level - $maxlevel = 0; - $numchars = \count($chunkOTLdata['char_data']); - // Set the initial paragraph embedding level - if ($dir == 'rtl') { - $pel = 1; - } else { - $pel = 0; - } - // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. - // Current Embedding Level - $cel = $pel; - // directional override status (-1 is Neutral) - $dos = -1; - $remember = []; - // Array of characters data - $chardata = []; - // Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase. - // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached. - for ($i = 0; $i < $numchars; ++$i) { - if ($chunkOTLdata['char_data'][$i]['uni'] == 8235) { - // RLE - // X2. With each RLE, compute the least greater odd embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + $cel % 2 + 1; - if ($next_level < 62) { - $remember[] = ['num' => 8235, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = -1; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8234) { - // LRE - // X3. With each LRE, compute the least greater even embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + 2 - $cel % 2; - if ($next_level < 62) { - $remember[] = ['num' => 8234, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = -1; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8238) { - // RLO - // X4. With each RLO, compute the least greater odd embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + $cel % 2 + 1; - if ($next_level < 62) { - $remember[] = ['num' => 8238, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = Ucdn::BIDI_CLASS_R; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8237) { - // LRO - // X5. With each LRO, compute the least greater even embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + 2 - $cel % 2; - if ($next_level < 62) { - $remember[] = ['num' => 8237, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = Ucdn::BIDI_CLASS_L; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8236) { - // PDF - // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override. - if (\count($remember)) { - $last = \count($remember) - 1; - if ($remember[$last]['num'] == 8235 || $remember[$last]['num'] == 8234 || $remember[$last]['num'] == 8238 || $remember[$last]['num'] == 8237) { - $match = \array_pop($remember); - $cel = $match['cel']; - $dos = $match['dos']; - } - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 10) { - // NEW LINE - // Reset to start values - $cel = $pel; - $dos = -1; - $remember = []; - } else { - // X6. For all types besides RLE, LRE, RLO, LRO, and PDF: - // a. Set the level of the current character to the current embedding level. - // b. When the directional override status is not neutral, reset the current character type to directional override status. - if ($dos != -1) { - $chardir = $dos; - } else { - $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; - } - // stores string characters and other information - if (isset($chunkOTLdata['GPOSinfo'][$i])) { - $gpos = $chunkOTLdata['GPOSinfo'][$i]; - } else { - $gpos = ''; - } - $chardata[] = ['char' => $chunkOTLdata['char_data'][$i]['uni'], 'level' => $cel, 'type' => $chardir, 'group' => $chunkOTLdata['group'][$i], 'GPOSinfo' => $gpos]; - } - } - $numchars = \count($chardata); - // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. - // Paragraph separators are not included in the embedding. - // X9. Remove all RLE, LRE, RLO, LRO, and PDF codes. - // This is effectively done by only saving other codes to chardata - // X10. Determine the start-of-sequence (sor) and end-of-sequence (eor) types, either L or R, for each isolating run sequence. These depend on the higher of the two levels on either side of the sequence boundary: - // For sor, compare the level of the first character in the sequence with the level of the character preceding it in the paragraph or if there is none, with the paragraph embedding level. - // For eor, compare the level of the last character in the sequence with the level of the character following it in the paragraph or if there is none, with the paragraph embedding level. - // If the higher level is odd, the sor or eor is R; otherwise, it is L. - $prelevel = $pel; - $postlevel = $pel; - $cel = $prelevel; - // current embedding level - for ($i = 0; $i < $numchars; ++$i) { - $level = $chardata[$i]['level']; - if ($i == 0) { - $left = $prelevel; - } else { - $left = $chardata[$i - 1]['level']; - } - if ($i == $numchars - 1) { - $right = $postlevel; - } else { - $right = $chardata[$i + 1]['level']; - } - $chardata[$i]['sor'] = \max($left, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; - $chardata[$i]['eor'] = \max($right, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; - } - // 3.3.3 Resolving Weak Types - // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used. - // Nonspacing marks are now resolved based on the previous characters. - // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_NSM) { - if ($i == 0 || $chardata[$i]['level'] != $chardata[$i - 1]['level']) { - $chardata[$i]['type'] = $chardata[$i]['sor']; - } else { - $chardata[$i]['type'] = $chardata[$i - 1]['type']; - } - } - } - // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number. - $prevlevel = -1; - $levcount = 0; - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { - $found = \false; - for ($j = $levcount; $j >= 0; $j--) { - if ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_AL) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; - $found = \true; - break; - } elseif ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$j]['type'] == Ucdn::BIDI_CLASS_R) { - $found = \true; - break; - } - } - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - // W3. Change all ALs to R. - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_R; - } - } - // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type. - for ($i = 1; $i < $numchars; ++$i) { - if ($i + 1 < $numchars && $chardata[$i]['level'] == $chardata[$i + 1]['level'] && $chardata[$i]['level'] == $chardata[$i - 1]['level']) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES && $chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_EN && $chardata[$i + 1]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_EN && $chardata[$i + 1]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_AN && $chardata[$i + 1]['type'] == Ucdn::BIDI_CLASS_AN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; - } - } - } - // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers. - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET) { - if ($i > 0 && $chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_EN && $chardata[$i]['level'] == $chardata[$i - 1]['level']) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - } else { - $j = $i + 1; - while ($j < $numchars && $chardata[$j]['level'] == $chardata[$i]['level']) { - if ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - break; - } elseif ($chardata[$j]['type'] != Ucdn::BIDI_CLASS_ET) { - break; - } - ++$j; - } - } - } - } - // W6. Otherwise, separators and terminators change to Other Neutral. - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_ON; - } - } - //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { - if ($i == 0) { - // Start of Level run - if ($chardata[$i]['sor'] == Ucdn::BIDI_CLASS_L) { - $chardata[$i]['type'] = $chardata[$i]['sor']; - } - } else { - for ($j = $i - 1; $j >= 0; $j--) { - if ($chardata[$j]['level'] != $chardata[$i]['level']) { - // Level run boundary - if ($chardata[$j + 1]['sor'] == Ucdn::BIDI_CLASS_L) { - $chardata[$i]['type'] = $chardata[$j + 1]['sor']; - } - break; - } elseif ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_L) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_L; - break; - } elseif ($chardata[$j]['type'] == Ucdn::BIDI_CLASS_R) { - break; - } - } - } - } - } - // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS) { - $left = -1; - // LEFT - if ($i == 0) { - // first char - $left = $chardata[$i]['sor']; - } elseif ($chardata[$i - 1]['level'] != $chardata[$i]['level']) { - // run boundary - $left = $chardata[$i]['sor']; - } elseif ($chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_L) { - $left = Ucdn::BIDI_CLASS_L; - } elseif ($chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_EN || $chardata[$i - 1]['type'] == Ucdn::BIDI_CLASS_AN) { - $left = Ucdn::BIDI_CLASS_R; - } - // RIGHT - $right = -1; - $j = $i; - // move to the right of any following neutrals OR hit a run boundary - while (($chardata[$j]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$j]['type'] == Ucdn::BIDI_CLASS_WS) && $j <= $numchars - 1) { - if ($j == $numchars - 1) { - // last char - $right = $chardata[$j]['eor']; - break; - } elseif ($chardata[$j + 1]['level'] != $chardata[$j]['level']) { - // run boundary - $right = $chardata[$j]['eor']; - break; - } elseif ($chardata[$j + 1]['type'] == Ucdn::BIDI_CLASS_L) { - $right = Ucdn::BIDI_CLASS_L; - break; - } elseif ($chardata[$j + 1]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$j + 1]['type'] == Ucdn::BIDI_CLASS_EN || $chardata[$j + 1]['type'] == Ucdn::BIDI_CLASS_AN) { - $right = Ucdn::BIDI_CLASS_R; - break; - } - $j++; - } - if ($left > -1 && $left == $right) { - $chardata[$i]['orig_type'] = $chardata[$i]['type']; - // Need to store the original 'WS' for reference in L1 below - $chardata[$i]['type'] = $left; - } - } - } - // N2. Any remaining neutrals take the embedding direction - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS) { - $chardata[$i]['type'] = $chardata[$i]['level'] % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; - $chardata[$i]['orig_type'] = $chardata[$i]['type']; - // Need to store the original 'WS' for reference in L1 below - } - } - // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. - // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. - for ($i = 0; $i < $numchars; ++$i) { - $odd = $chardata[$i]['level'] % 2; - if ($odd) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['level'] += 1; - } - } else { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_R) { - $chardata[$i]['level'] += 1; - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['level'] += 2; - } - } - $maxlevel = \max($chardata[$i]['level'], $maxlevel); - } - // NB - // Separate into lines at this point************ - // - // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: - // 1. Segment separators (Tab) 'S', - // 2. Paragraph separators 'B', - // 3. Any sequence of whitespace characters 'WS' preceding a segment separator or paragraph separator, and - // 4. Any sequence of whitespace characters 'WS' at the end of the line. - // The types of characters used here are the original types, not those modified by the previous phase cf N1 and N2******* - // Because a Paragraph Separator breaks lines, there will be at most one per line, at the end of that line. - for ($i = $numchars - 1; $i > 0; $i--) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS || isset($chardata[$i]['orig_type']) && $chardata[$i]['orig_type'] == Ucdn::BIDI_CLASS_WS) { - $chardata[$i]['level'] = $pel; - } else { - break; - } - } - // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher. - for ($j = $maxlevel; $j > 0; $j--) { - $ordarray = []; - $revarr = []; - $onlevel = \false; - for ($i = 0; $i < $numchars; ++$i) { - if ($chardata[$i]['level'] >= $j) { - $onlevel = \true; - // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true. - if (isset(Ucdn::$mirror_pairs[$chardata[$i]['char']]) && $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R) { - $chardata[$i]['char'] = Ucdn::$mirror_pairs[$chardata[$i]['char']]; - } - $revarr[] = $chardata[$i]; - } else { - if ($onlevel) { - $revarr = \array_reverse($revarr); - $ordarray = \array_merge($ordarray, $revarr); - $revarr = []; - $onlevel = \false; - } - $ordarray[] = $chardata[$i]; - } - } - if ($onlevel) { - $revarr = \array_reverse($revarr); - $ordarray = \array_merge($ordarray, $revarr); - } - $chardata = $ordarray; - } - $group = ''; - $e = ''; - $GPOS = []; - $cctr = 0; - $rtl_content = 0x0; - foreach ($chardata as $cd) { - $e .= UtfString::code2utf($cd['char']); - $group .= $cd['group']; - if ($useGPOS && \is_array($cd['GPOSinfo'])) { - $GPOS[$cctr] = $cd['GPOSinfo']; - $GPOS[$cctr]['wDir'] = $cd['level'] % 2 ? 'RTL' : 'LTR'; - } - if ($cd['type'] == Ucdn::BIDI_CLASS_L) { - $rtl_content |= 1; - } elseif ($cd['type'] == Ucdn::BIDI_CLASS_R) { - $rtl_content |= 2; - } - $cctr++; - } - $chunkOTLdata['group'] = $group; - if ($useGPOS) { - $chunkOTLdata['GPOSinfo'] = $GPOS; - } - return [$e, $rtl_content]; - } - /** - * The following versions for BidiSort work on amalgamated chunks to process the whole paragraph - * - * Firstly set the level in the OTLdata - called from fn printbuffer() [_bidiPrepare] - * Secondly re-order - called from fn writeFlowingBlock and FinishFlowingBlock, when already divided into lines. [_bidiReorder] - */ - public function bidiPrepare(&$para, $dir) - { - // Set the initial paragraph embedding level - $pel = 0; - // paragraph embedding level - if ($dir == 'rtl') { - $pel = 1; - } - // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. - // Current Embedding Level - $cel = $pel; - // directional override status (-1 is Neutral) - $dos = -1; - $remember = []; - $controlchars = \false; - $strongrtl = \false; - $diid = 0; - // direction isolate ID - $dictr = 0; - // direction isolate counter - // Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase. - // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached. - $numchunks = \count($para); - for ($nc = 0; $nc < $numchunks; $nc++) { - $chunkOTLdata =& $para[$nc][18]; - $numchars = \count($chunkOTLdata['char_data']); - for ($i = 0; $i < $numchars; ++$i) { - if ($chunkOTLdata['char_data'][$i]['uni'] == 8235) { - // RLE - // X2. With each RLE, compute the least greater odd embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + $cel % 2 + 1; - if ($next_level < 62) { - $remember[] = ['num' => 8235, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = -1; - $controlchars = \true; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8234) { - // LRE - // X3. With each LRE, compute the least greater even embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + 2 - $cel % 2; - if ($next_level < 62) { - $remember[] = ['num' => 8234, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = -1; - $controlchars = \true; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8238) { - // RLO - // X4. With each RLO, compute the least greater odd embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + $cel % 2 + 1; - if ($next_level < 62) { - $remember[] = ['num' => 8238, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = Ucdn::BIDI_CLASS_R; - $controlchars = \true; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8237) { - // LRO - // X5. With each LRO, compute the least greater even embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + 2 - $cel % 2; - if ($next_level < 62) { - $remember[] = ['num' => 8237, 'cel' => $cel, 'dos' => $dos]; - $cel = $next_level; - $dos = Ucdn::BIDI_CLASS_L; - $controlchars = \true; - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8236) { - // PDF - // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override. - if (\count($remember)) { - $last = \count($remember) - 1; - if ($remember[$last]['num'] == 8235 || $remember[$last]['num'] == 8234 || $remember[$last]['num'] == 8238 || $remember[$last]['num'] == 8237) { - $match = \array_pop($remember); - $cel = $match['cel']; - $dos = $match['dos']; - } - } - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8294 || $chunkOTLdata['char_data'][$i]['uni'] == 8295 || $chunkOTLdata['char_data'][$i]['uni'] == 8296) { - // LRI // RLI // FSI - // X5a. With each RLI: - // X5b. With each LRI: - // X5c. With each FSI, apply rules P2 and P3 for First Strong character - // Set the RLI/LRI/FSI embedding level to the embedding level of the last entry on the directional status stack. - if ($dos != -1) { - $chardir = $dos; - } else { - $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; - } - $chunkOTLdata['char_data'][$i]['level'] = $cel; - $chunkOTLdata['char_data'][$i]['type'] = $chardir; - $chunkOTLdata['char_data'][$i]['diid'] = $diid; - $fsi = ''; - // X5c. With each FSI, apply rules P2 and P3 within the isolate run for First Strong character - if ($chunkOTLdata['char_data'][$i]['uni'] == 8296) { - // FSI - $lvl = 0; - $nc2 = $nc; - $i2 = $i; - while (!($nc2 == $numchunks - 1 && $i2 == \count($para[$nc2][18]['char_data']) - 1)) { - // while not at end of last chunk - $i2++; - if ($i2 >= \count($para[$nc2][18]['char_data'])) { - $nc2++; - $i2 = 0; - } - if ($lvl > 0) { - continue; - } - if ($para[$nc2][18]['char_data'][$i2]['uni'] == 8294 || $para[$nc2][18]['char_data'][$i2]['uni'] == 8295 || $para[$nc2][18]['char_data'][$i2]['uni'] == 8296) { - $lvl++; - continue; - } - if ($para[$nc2][18]['char_data'][$i2]['uni'] == 8297) { - $lvl--; - if ($lvl < 0) { - break; - } - } - if ($para[$nc2][18]['char_data'][$i2]['bidi_class'] === Ucdn::BIDI_CLASS_L || $para[$nc2][18]['char_data'][$i2]['bidi_class'] == Ucdn::BIDI_CLASS_AL || $para[$nc2][18]['char_data'][$i2]['bidi_class'] === Ucdn::BIDI_CLASS_R) { - $fsi = $para[$nc2][18]['char_data'][$i2]['bidi_class']; - break; - } - } - // if fsi not found, fsi is same as paragraph embedding level - if (!$fsi && $fsi !== 0) { - if ($pel == 1) { - $fsi = Ucdn::BIDI_CLASS_R; - } else { - $fsi = Ucdn::BIDI_CLASS_L; - } - } - } - if ($chunkOTLdata['char_data'][$i]['uni'] == 8294 || $fsi === Ucdn::BIDI_CLASS_L) { - // LRI or FSI-L - // Compute the least even embedding level greater than the embedding level of the last entry on the directional status stack. - $next_level = $cel + 2 - $cel % 2; - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8295 || $fsi == Ucdn::BIDI_CLASS_R || $fsi == Ucdn::BIDI_CLASS_AL) { - // RLI or FSI-R - // Compute the least odd embedding level greater than the embedding level of the last entry on the directional status stack. - $next_level = $cel + $cel % 2 + 1; - } - // Increment the isolate count by one, and push an entry consisting of the new embedding level, - // neutral directional override status, and true directional isolate status onto the directional status stack. - $remember[] = ['num' => $chunkOTLdata['char_data'][$i]['uni'], 'cel' => $cel, 'dos' => $dos, 'diid' => $diid]; - $cel = $next_level; - $dos = -1; - $diid = ++$dictr; - // Set new direction isolate ID after incrementing direction isolate counter - $controlchars = \true; - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 8297) { - // PDI - // X6a. With each PDI, perform the following steps: - // Pop the last entry from the directional status stack and decrement the isolate count by one. - while (\count($remember)) { - $last = \count($remember) - 1; - if ($remember[$last]['num'] == 8294 || $remember[$last]['num'] == 8295 || $remember[$last]['num'] == 8296) { - $match = \array_pop($remember); - $cel = $match['cel']; - $dos = $match['dos']; - $diid = $match['diid']; - break; - } elseif ($remember[$last]['num'] == 8235 || $remember[$last]['num'] == 8234 || $remember[$last]['num'] == 8238 || $remember[$last]['num'] == 8237) { - $match = \array_pop($remember); - } - } - // In all cases, set the PDI’s level to the embedding level of the last entry on the directional status stack left after the steps above. - // NB The level assigned to an isolate initiator is always the same as that assigned to the matching PDI. - if ($dos != -1) { - $chardir = $dos; - } else { - $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; - } - $chunkOTLdata['char_data'][$i]['level'] = $cel; - $chunkOTLdata['char_data'][$i]['type'] = $chardir; - $chunkOTLdata['char_data'][$i]['diid'] = $diid; - $controlchars = \true; - } elseif ($chunkOTLdata['char_data'][$i]['uni'] == 10) { - // NEW LINE - // Reset to start values - $cel = $pel; - $dos = -1; - $remember = []; - } else { - // X6. For all types besides RLE, LRE, RLO, LRO, and PDF: - // a. Set the level of the current character to the current embedding level. - // b. When the directional override status is not neutral, reset the current character type to directional override status. - if ($dos != -1) { - $chardir = $dos; - } else { - $chardir = $chunkOTLdata['char_data'][$i]['bidi_class']; - if ($chardir == Ucdn::BIDI_CLASS_R || $chardir == Ucdn::BIDI_CLASS_AL) { - $strongrtl = \true; - } - } - $chunkOTLdata['char_data'][$i]['level'] = $cel; - $chunkOTLdata['char_data'][$i]['type'] = $chardir; - $chunkOTLdata['char_data'][$i]['diid'] = $diid; - } - } - // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. - // Paragraph separators are not included in the embedding. - // X9. Remove all RLE, LRE, RLO, LRO, and PDF codes. - if ($controlchars) { - $this->removeChar($para[$nc][0], $para[$nc][18], "‪"); - $this->removeChar($para[$nc][0], $para[$nc][18], "‫"); - $this->removeChar($para[$nc][0], $para[$nc][18], "‬"); - $this->removeChar($para[$nc][0], $para[$nc][18], "‭"); - $this->removeChar($para[$nc][0], $para[$nc][18], "‮"); - \preg_replace("/\\x{202a}-\\x{202e}/u", '', $para[$nc][0]); - } - } - // Remove any blank chunks made by removing directional codes - $numchunks = \count($para); - for ($nc = $numchunks - 1; $nc >= 0; $nc--) { - if (\count($para[$nc][18]['char_data']) == 0) { - \array_splice($para, $nc, 1); - } - } - if ($dir != 'rtl' && !$strongrtl && !$controlchars) { - return; - } - $numchunks = \count($para); - // X10. Determine the start-of-sequence (sor) and end-of-sequence (eor) types, either L or R, for each isolating run sequence. These depend on the higher of the two levels on either side of the sequence boundary: - // For sor, compare the level of the first character in the sequence with the level of the character preceding it in the paragraph or if there is none, with the paragraph embedding level. - // For eor, compare the level of the last character in the sequence with the level of the character following it in the paragraph or if there is none, with the paragraph embedding level. - // If the higher level is odd, the sor or eor is R; otherwise, it is L. - for ($ir = 0; $ir <= $dictr; $ir++) { - $prelevel = $pel; - $postlevel = $pel; - $firstchar = \true; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - $right = $postlevel; - $nc2 = $nc; - $i2 = $i; - while (!($nc2 == $numchunks - 1 && $i2 == \count($para[$nc2][18]['char_data']) - 1)) { - // while not at end of last chunk - $i2++; - if ($i2 >= \count($para[$nc2][18]['char_data'])) { - $nc2++; - $i2 = 0; - } - if (isset($para[$nc2][18]['char_data'][$i2]['diid']) && $para[$nc2][18]['char_data'][$i2]['diid'] == $ir) { - $right = $para[$nc2][18]['char_data'][$i2]['level']; - break; - } - } - $level = $chardata[$i]['level']; - if ($firstchar || $level != $prelevel) { - $chardata[$i]['sor'] = \max($prelevel, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; - } - if ($nc == $numchunks - 1 && $i == $numchars - 1 || $level != $right) { - $chardata[$i]['eor'] = \max($right, $level) % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; - } - $prelevel = $level; - $firstchar = \false; - } - } - } - // 3.3.3 Resolving Weak Types - // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used. - // Nonspacing marks are now resolved based on the previous characters. - // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. - for ($ir = 0; $ir <= $dictr; $ir++) { - $prevtype = 0; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_NSM) { - if (isset($chardata[$i]['sor'])) { - $chardata[$i]['type'] = $chardata[$i]['sor']; - } else { - $chardata[$i]['type'] = $prevtype; - } - } - $prevtype = $chardata[$i]['type']; - } - } - } - // W2. Search backward from each instance of a European number until the first strong type (R, L, AL or sor) is found. If an AL is found, change the type of the European number to Arabic number. - for ($ir = 0; $ir <= $dictr; $ir++) { - $laststrongtype = -1; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - if (isset($chardata[$i]['sor'])) { - $laststrongtype = $chardata[$i]['sor']; - } - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN && $laststrongtype == Ucdn::BIDI_CLASS_AL) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; - } - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL) { - $laststrongtype = $chardata[$i]['type']; - } - } - } - } - // W3. Change all ALs to R. - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (isset($chardata[$i]['type']) && $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_R; - } - } - } - // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type. - for ($ir = 0; $ir <= $dictr; $ir++) { - $prevtype = -1; - $nexttype = -1; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - // Get next type - $nexttype = -1; - $nc2 = $nc; - $i2 = $i; - while (!($nc2 == $numchunks - 1 && $i2 == \count($para[$nc2][18]['char_data']) - 1)) { - // while not at end of last chunk - $i2++; - if ($i2 >= \count($para[$nc2][18]['char_data'])) { - $nc2++; - $i2 = 0; - } - if (isset($para[$nc2][18]['char_data'][$i2]['diid']) && $para[$nc2][18]['char_data'][$i2]['diid'] == $ir) { - $nexttype = $para[$nc2][18]['char_data'][$i2]['type']; - break; - } - } - if (!isset($chardata[$i]['sor']) && !isset($chardata[$i]['eor'])) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES && $prevtype == Ucdn::BIDI_CLASS_EN && $nexttype == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $prevtype == Ucdn::BIDI_CLASS_EN && $nexttype == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS && $prevtype == Ucdn::BIDI_CLASS_AN && $nexttype == Ucdn::BIDI_CLASS_AN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_AN; - } - } - $prevtype = $chardata[$i]['type']; - } - } - } - // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers. - for ($ir = 0; $ir <= $dictr; $ir++) { - $prevtype = -1; - $nexttype = -1; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - if (isset($chardata[$i]['sor'])) { - $prevtype = $chardata[$i]['sor']; - } - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET) { - if ($prevtype == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - } elseif (!isset($chardata[$i]['eor'])) { - $nexttype = -1; - $nc2 = $nc; - $i2 = $i; - while (!($nc2 == $numchunks - 1 && $i2 == \count($para[$nc2][18]['char_data']) - 1)) { - // while not at end of last chunk - $i2++; - if ($i2 >= \count($para[$nc2][18]['char_data'])) { - $nc2++; - $i2 = 0; - } - if (!isset($para[$nc2][18]['char_data'][$i2]['diid']) || $para[$nc2][18]['char_data'][$i2]['diid'] != $ir) { - continue; - } - $nexttype = $para[$nc2][18]['char_data'][$i2]['type']; - if (isset($para[$nc2][18]['char_data'][$i2]['sor'])) { - break; - } - if ($nexttype == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_EN; - break; - } elseif ($nexttype != Ucdn::BIDI_CLASS_ET) { - break; - } - } - } - } - $prevtype = $chardata[$i]['type']; - } - } - } - // W6. Otherwise, separators and terminators change to Other Neutral. - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (isset($chardata[$i]['type']) && ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ET || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_ES || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_CS)) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_ON; - } - } - } - //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. - for ($ir = 0; $ir <= $dictr; $ir++) { - $laststrongtype = -1; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - if (isset($chardata[$i]['sor'])) { - $laststrongtype = $chardata[$i]['sor']; - } - if (isset($chardata[$i]['type']) && $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN && $laststrongtype == Ucdn::BIDI_CLASS_L) { - $chardata[$i]['type'] = Ucdn::BIDI_CLASS_L; - } - if (isset($chardata[$i]['type']) && ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AL)) { - $laststrongtype = $chardata[$i]['type']; - } - } - } - } - // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. - for ($ir = 0; $ir <= $dictr; $ir++) { - $laststrongtype = -1; - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (!isset($chardata[$i]['diid']) || $chardata[$i]['diid'] != $ir) { - continue; - } - // Ignore characters in a different isolate run - if (isset($chardata[$i]['sor'])) { - $laststrongtype = $chardata[$i]['sor']; - } - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS) { - $left = -1; - // LEFT - if ($laststrongtype == Ucdn::BIDI_CLASS_R || $laststrongtype == Ucdn::BIDI_CLASS_EN || $laststrongtype == Ucdn::BIDI_CLASS_AN) { - $left = Ucdn::BIDI_CLASS_R; - } elseif ($laststrongtype == Ucdn::BIDI_CLASS_L) { - $left = Ucdn::BIDI_CLASS_L; - } - // RIGHT - $right = -1; - // move to the right of any following neutrals OR hit a run boundary - if (isset($chardata[$i]['eor'])) { - $right = $chardata[$i]['eor']; - } else { - $nexttype = -1; - $nc2 = $nc; - $i2 = $i; - while (!($nc2 == $numchunks - 1 && $i2 == \count($para[$nc2][18]['char_data']) - 1)) { - // while not at end of last chunk - $i2++; - if ($i2 >= \count($para[$nc2][18]['char_data'])) { - $nc2++; - $i2 = 0; - } - if (!isset($para[$nc2][18]['char_data'][$i2]['diid']) || $para[$nc2][18]['char_data'][$i2]['diid'] != $ir) { - continue; - } - $nexttype = $para[$nc2][18]['char_data'][$i2]['type']; - if ($nexttype == Ucdn::BIDI_CLASS_R || $nexttype == Ucdn::BIDI_CLASS_EN || $nexttype == Ucdn::BIDI_CLASS_AN) { - $right = Ucdn::BIDI_CLASS_R; - break; - } elseif ($nexttype == Ucdn::BIDI_CLASS_L) { - $right = Ucdn::BIDI_CLASS_L; - break; - } elseif (isset($para[$nc2][18]['char_data'][$i2]['eor'])) { - $right = $para[$nc2][18]['char_data'][$i2]['eor']; - break; - } - } - } - if ($left > -1 && $left == $right) { - $chardata[$i]['orig_type'] = $chardata[$i]['type']; - // Need to store the original 'WS' for reference in L1 below - $chardata[$i]['type'] = $left; - } - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_R || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN) { - $laststrongtype = $chardata[$i]['type']; - } - } - } - } - // N2. Any remaining neutrals take the embedding direction - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (isset($chardata[$i]['type']) && ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_ON || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_WS)) { - $chardata[$i]['orig_type'] = $chardata[$i]['type']; - // Need to store the original 'WS' for reference in L1 below - $chardata[$i]['type'] = $chardata[$i]['level'] % 2 ? Ucdn::BIDI_CLASS_R : Ucdn::BIDI_CLASS_L; - } - } - } - // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. - // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. - for ($nc = 0; $nc < $numchunks; $nc++) { - $chardata =& $para[$nc][18]['char_data']; - $numchars = \count($chardata); - for ($i = 0; $i < $numchars; ++$i) { - if (isset($chardata[$i]['level'])) { - $odd = $chardata[$i]['level'] % 2; - if ($odd) { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_L || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['level'] += 1; - } - } else { - if ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_R) { - $chardata[$i]['level'] += 1; - } elseif ($chardata[$i]['type'] == Ucdn::BIDI_CLASS_AN || $chardata[$i]['type'] == Ucdn::BIDI_CLASS_EN) { - $chardata[$i]['level'] += 2; - } - } - } - } - } - // Remove Isolate formatters - $numchunks = \count($para); - if ($controlchars) { - for ($nc = 0; $nc < $numchunks; $nc++) { - $this->removeChar($para[$nc][0], $para[$nc][18], "⁦"); - $this->removeChar($para[$nc][0], $para[$nc][18], "⁧"); - $this->removeChar($para[$nc][0], $para[$nc][18], "⁨"); - $this->removeChar($para[$nc][0], $para[$nc][18], "⁩"); - \preg_replace("/\\x{2066}-\\x{2069}/u", '', $para[$nc][0]); - } - // Remove any blank chunks made by removing directional codes - for ($nc = $numchunks - 1; $nc >= 0; $nc--) { - if (\count($para[$nc][18]['char_data']) == 0) { - \array_splice($para, $nc, 1); - } - } - } - } - /** - * Reorder, once divided into lines - */ - public function bidiReorder(&$chunkorder, &$content, &$cOTLdata, $blockdir) - { - $bidiData = []; - // First combine into one array (and get the highest level in use) - $numchunks = \count($content); - $maxlevel = 0; - for ($nc = 0; $nc < $numchunks; $nc++) { - $numchars = isset($cOTLdata[$nc]['char_data']) ? \count($cOTLdata[$nc]['char_data']) : 0; - for ($i = 0; $i < $numchars; ++$i) { - $carac = ['level' => 0]; - if (isset($cOTLdata[$nc]['GPOSinfo'][$i])) { - $carac['GPOSinfo'] = $cOTLdata[$nc]['GPOSinfo'][$i]; - } - $carac['uni'] = $cOTLdata[$nc]['char_data'][$i]['uni']; - if (isset($cOTLdata[$nc]['char_data'][$i]['type'])) { - $carac['type'] = $cOTLdata[$nc]['char_data'][$i]['type']; - } - if (isset($cOTLdata[$nc]['char_data'][$i]['level'])) { - $carac['level'] = $cOTLdata[$nc]['char_data'][$i]['level']; - } - if (isset($cOTLdata[$nc]['char_data'][$i]['orig_type'])) { - $carac['orig_type'] = $cOTLdata[$nc]['char_data'][$i]['orig_type']; - } - $carac['group'] = $cOTLdata[$nc]['group'][$i]; - $carac['chunkid'] = $chunkorder[$nc]; - // gives font id and/or object ID - $maxlevel = \max(isset($carac['level']) ? $carac['level'] : 0, $maxlevel); - $bidiData[] = $carac; - } - } - if ($maxlevel === 0) { - return; - } - $numchars = \count($bidiData); - // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: - // 1. Segment separators (Tab) 'S', - // 2. Paragraph separators 'B', - // 3. Any sequence of whitespace characters 'WS' preceding a segment separator or paragraph separator, and - // 4. Any sequence of whitespace characters 'WS' at the end of the line. - // The types of characters used here are the original types, not those modified by the previous phase cf N1 and N2******* - // Because a Paragraph Separator breaks lines, there will be at most one per line, at the end of that line. - // Set the initial paragraph embedding level - if ($blockdir === 'rtl') { - $pel = 1; - } else { - $pel = 0; - } - for ($i = $numchars - 1; $i > 0; $i--) { - if ($bidiData[$i]['type'] == Ucdn::BIDI_CLASS_WS || isset($bidiData[$i]['orig_type']) && $bidiData[$i]['orig_type'] == Ucdn::BIDI_CLASS_WS) { - $bidiData[$i]['level'] = $pel; - } else { - break; - } - } - // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher. - for ($j = $maxlevel; $j > 0; $j--) { - $ordarray = []; - $revarr = []; - $onlevel = \false; - for ($i = 0; $i < $numchars; ++$i) { - if ($bidiData[$i]['level'] >= $j) { - $onlevel = \true; - // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true. - if (isset(Ucdn::$mirror_pairs[$bidiData[$i]['uni']]) && $bidiData[$i]['type'] == Ucdn::BIDI_CLASS_R) { - $bidiData[$i]['uni'] = Ucdn::$mirror_pairs[$bidiData[$i]['uni']]; - } - $revarr[] = $bidiData[$i]; - } else { - if ($onlevel) { - $revarr = \array_reverse($revarr); - $ordarray = \array_merge($ordarray, $revarr); - $revarr = []; - $onlevel = \false; - } - $ordarray[] = $bidiData[$i]; - } - } - if ($onlevel) { - $revarr = \array_reverse($revarr); - $ordarray = \array_merge($ordarray, $revarr); - } - $bidiData = $ordarray; - } - $content = []; - $cOTLdata = []; - $chunkorder = []; - $nc = -1; - // New chunk order ID - $chunkid = -1; - foreach ($bidiData as $carac) { - if ($carac['chunkid'] != $chunkid) { - $nc++; - $chunkorder[$nc] = $carac['chunkid']; - $cctr = 0; - $content[$nc] = ''; - $cOTLdata[$nc]['group'] = ''; - } - if ($carac['uni'] != 0xfffc) { - // Object replacement character (65532) - $content[$nc] .= UtfString::code2utf($carac['uni']); - $cOTLdata[$nc]['group'] .= $carac['group']; - if (!empty($carac['GPOSinfo'])) { - if (isset($carac['GPOSinfo'])) { - $cOTLdata[$nc]['GPOSinfo'][$cctr] = $carac['GPOSinfo']; - } - $cOTLdata[$nc]['GPOSinfo'][$cctr]['wDir'] = $carac['level'] % 2 ? 'RTL' : 'LTR'; - } - } - $chunkid = $carac['chunkid']; - $cctr++; - } - } - public function splitOTLdata(&$cOTLdata, $OTLcutoffpos, $OTLrestartpos = '') - { - if (!$OTLrestartpos) { - $OTLrestartpos = $OTLcutoffpos; - } - $newOTLdata = ['GPOSinfo' => [], 'char_data' => []]; - $newOTLdata['group'] = \substr($cOTLdata['group'], $OTLrestartpos); - $cOTLdata['group'] = \substr($cOTLdata['group'], 0, $OTLcutoffpos); - if (isset($cOTLdata['GPOSinfo']) && $cOTLdata['GPOSinfo']) { - foreach ($cOTLdata['GPOSinfo'] as $k => $val) { - if ($k >= $OTLrestartpos) { - $newOTLdata['GPOSinfo'][$k - $OTLrestartpos] = $val; - } - if ($k >= $OTLcutoffpos) { - unset($cOTLdata['GPOSinfo'][$k]); - //$cOTLdata['GPOSinfo'][$k] = array(); - } - } - } - if (isset($cOTLdata['char_data'])) { - $newOTLdata['char_data'] = \array_slice($cOTLdata['char_data'], $OTLrestartpos); - \array_splice($cOTLdata['char_data'], $OTLcutoffpos); - } - // Not necessary - easier to debug - if (isset($cOTLdata['GPOSinfo'])) { - \ksort($cOTLdata['GPOSinfo']); - } - if (isset($newOTLdata['GPOSinfo'])) { - \ksort($newOTLdata['GPOSinfo']); - } - return $newOTLdata; - } - public function sliceOTLdata($OTLdata, $pos, $len) - { - $newOTLdata = ['GPOSinfo' => [], 'char_data' => []]; - $newOTLdata['group'] = \substr($OTLdata['group'], $pos, $len); - if ($OTLdata['GPOSinfo']) { - foreach ($OTLdata['GPOSinfo'] as $k => $val) { - if ($k >= $pos && $k < $pos + $len) { - $newOTLdata['GPOSinfo'][$k - $pos] = $val; - } - } - } - if (isset($OTLdata['char_data'])) { - $newOTLdata['char_data'] = \array_slice($OTLdata['char_data'], $pos, $len); - } - // Not necessary - easier to debug - if ($newOTLdata['GPOSinfo']) { - \ksort($newOTLdata['GPOSinfo']); - } - return $newOTLdata; - } - /** - * Remove one or more occurrences of $char (single character) from $txt and adjust OTLdata - */ - public function removeChar(&$txt, &$cOTLdata, $char) - { - while (\mb_strpos($txt, $char, 0, $this->mpdf->mb_enc) !== \false) { - $pos = \mb_strpos($txt, $char, 0, $this->mpdf->mb_enc); - $newGPOSinfo = []; - $cOTLdata['group'] = \substr_replace($cOTLdata['group'], '', $pos, 1); - if ($cOTLdata['GPOSinfo']) { - foreach ($cOTLdata['GPOSinfo'] as $k => $val) { - if ($k > $pos) { - $newGPOSinfo[$k - 1] = $val; - } elseif ($k != $pos) { - $newGPOSinfo[$k] = $val; - } - } - $cOTLdata['GPOSinfo'] = $newGPOSinfo; - } - if (isset($cOTLdata['char_data'])) { - \array_splice($cOTLdata['char_data'], $pos, 1); - } - $txt = \preg_replace("/" . $char . "/", '', $txt, 1); - } - } - /** - * Remove one or more occurrences of $char (single character) from $txt and adjust OTLdata - */ - public function replaceSpace(&$txt, &$cOTLdata) - { - $char = \chr(194) . \chr(160); - // NBSP - while (\mb_strpos($txt, $char, 0, $this->mpdf->mb_enc) !== \false) { - $pos = \mb_strpos($txt, $char, 0, $this->mpdf->mb_enc); - if ($cOTLdata['char_data'][$pos]['uni'] == 160) { - $cOTLdata['char_data'][$pos]['uni'] = 32; - } - $txt = \preg_replace("/" . $char . "/", ' ', $txt, 1); - } - } - public function trimOTLdata(&$cOTLdata, $Left = \true, $Right = \true) - { - $len = !\is_array($cOTLdata) || $cOTLdata['char_data'] === null ? 0 : \count($cOTLdata['char_data']); - $nLeft = 0; - $nRight = 0; - for ($i = 0; $i < $len; $i++) { - if ($cOTLdata['char_data'][$i]['uni'] == 32 || $cOTLdata['char_data'][$i]['uni'] == 12288) { - $nLeft++; - } else { - break; - } - } - for ($i = $len - 1; $i >= 0; $i--) { - if ($cOTLdata['char_data'][$i]['uni'] == 32 || $cOTLdata['char_data'][$i]['uni'] == 12288) { - $nRight++; - } else { - break; - } - } - // Trim Right - if ($Right && $nRight) { - $cOTLdata['group'] = \substr($cOTLdata['group'], 0, \strlen($cOTLdata['group']) - $nRight); - if ($cOTLdata['GPOSinfo']) { - foreach ($cOTLdata['GPOSinfo'] as $k => $val) { - if ($k >= $len - $nRight) { - unset($cOTLdata['GPOSinfo'][$k]); - } - } - } - if (isset($cOTLdata['char_data'])) { - for ($i = 0; $i < $nRight; $i++) { - \array_pop($cOTLdata['char_data']); - } - } - } - // Trim Left - if ($Left && $nLeft) { - $cOTLdata['group'] = \substr($cOTLdata['group'], $nLeft); - if ($cOTLdata['GPOSinfo']) { - $newPOSinfo = []; - foreach ($cOTLdata['GPOSinfo'] as $k => $val) { - if ($k >= $nLeft) { - $newPOSinfo[$k - $nLeft] = $cOTLdata['GPOSinfo'][$k]; - } - } - $cOTLdata['GPOSinfo'] = $newPOSinfo; - } - if (isset($cOTLdata['char_data'])) { - for ($i = 0; $i < $nLeft; $i++) { - \array_shift($cOTLdata['char_data']); - } - } - } - } - //////////////////////////////////////////////////////////////// - ////////// GENERAL OTL FUNCTIONS ///////////////// - //////////////////////////////////////////////////////////////// - private function glyphToChar($gid) - { - return (\ord($this->glyphIDtoUni[$gid * 3]) << 16) + (\ord($this->glyphIDtoUni[$gid * 3 + 1]) << 8) + \ord($this->glyphIDtoUni[$gid * 3 + 2]); - } - private function unicode_hex($unicode_dec) - { - return \str_pad(\strtoupper(\dechex($unicode_dec)), 5, '0', \STR_PAD_LEFT); - } - private function seek($pos) - { - $this->_pos = $pos; - } - private function skip($delta) - { - $this->_pos += $delta; - } - private function read_short() - { - $a = (\ord($this->ttfOTLdata[$this->_pos]) << 8) + \ord($this->ttfOTLdata[$this->_pos + 1]); - if ($a & 1 << 15) { - $a = $a - (1 << 16); - } - $this->_pos += 2; - return $a; - } - private function read_ushort() - { - $a = (\ord($this->ttfOTLdata[$this->_pos]) << 8) + \ord($this->ttfOTLdata[$this->_pos + 1]); - $this->_pos += 2; - return $a; - } - private function _getCoverageGID() - { - // Called from Lookup Type 1, Format 1 - returns glyphIDs rather than hexstrings - // Need to do this separately to cache separately - // Otherwise the same as fn below _getCoverage - $offset = $this->_pos; - if (isset($this->LuDataCache[$this->fontkey]['GID'][$offset])) { - $g = $this->LuDataCache[$this->fontkey]['GID'][$offset]; - } else { - $g = []; - $CoverageFormat = $this->read_ushort(); - if ($CoverageFormat == 1) { - $CoverageGlyphCount = $this->read_ushort(); - for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { - $glyphID = $this->read_ushort(); - $g[] = $glyphID; - } - } - if ($CoverageFormat == 2) { - $RangeCount = $this->read_ushort(); - for ($r = 0; $r < $RangeCount; $r++) { - $start = $this->read_ushort(); - $end = $this->read_ushort(); - $StartCoverageIndex = $this->read_ushort(); - // n/a - for ($glyphID = $start; $glyphID <= $end; $glyphID++) { - $g[] = $glyphID; - } - } - } - $this->LuDataCache[$this->fontkey]['GID'][$offset] = $g; - } - return $g; - } - private function _getCoverage() - { - $offset = $this->_pos; - if (isset($this->LuDataCache[$this->fontkey][$offset])) { - $g = $this->LuDataCache[$this->fontkey][$offset]; - } else { - $g = []; - $CoverageFormat = $this->read_ushort(); - if ($CoverageFormat == 1) { - $CoverageGlyphCount = $this->read_ushort(); - for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { - $glyphID = $this->read_ushort(); - $g[] = $this->unicode_hex($this->glyphToChar($glyphID)); - } - } - if ($CoverageFormat == 2) { - $RangeCount = $this->read_ushort(); - for ($r = 0; $r < $RangeCount; $r++) { - $start = $this->read_ushort(); - $end = $this->read_ushort(); - $StartCoverageIndex = $this->read_ushort(); - // n/a - for ($glyphID = $start; $glyphID <= $end; $glyphID++) { - $g[] = $this->unicode_hex($this->glyphToChar($glyphID)); - } - } - } - $this->LuDataCache[$this->fontkey][$offset] = $g; - } - return $g; - } - private function _getClasses($offset) - { - if (isset($this->LuDataCache[$this->fontkey][$offset])) { - $GlyphByClass = $this->LuDataCache[$this->fontkey][$offset]; - } else { - $this->seek($offset); - $ClassFormat = $this->read_ushort(); - $GlyphByClass = []; - if ($ClassFormat == 1) { - $StartGlyph = $this->read_ushort(); - $GlyphCount = $this->read_ushort(); - for ($i = 0; $i < $GlyphCount; $i++) { - $startGlyphID = $StartGlyph + $i; - $endGlyphID = $StartGlyph + $i; - $class = $this->read_ushort(); - // Note: Font FreeSerif , tag "blws" - // $BacktrackClasses[0] is defined ? a mistake in the font ??? - // Let's ignore for now - if ($class > 0) { - for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { - if ($this->glyphToChar($g)) { - $GlyphByClass[$class][$this->glyphToChar($g)] = 1; - } - } - } - } - } elseif ($ClassFormat == 2) { - $tableCount = $this->read_ushort(); - for ($i = 0; $i < $tableCount; $i++) { - $startGlyphID = $this->read_ushort(); - $endGlyphID = $this->read_ushort(); - $class = $this->read_ushort(); - // Note: Font FreeSerif , tag "blws" - // $BacktrackClasses[0] is defined ? a mistake in the font ??? - // Let's ignore for now - if ($class > 0) { - for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { - if ($this->glyphToChar($g)) { - $GlyphByClass[$class][$this->glyphToChar($g)] = 1; - } - } - } - } - } - $this->LuDataCache[$this->fontkey][$offset] = $GlyphByClass; - } - return $GlyphByClass; - } - private function _getOTLscriptTag($ScriptLang, $scripttag, $scriptblock, $shaper, $useOTL, $mode) - { - // ScriptLang is the array of available script/lang tags supported by the font - // $scriptblock is the (number/code) for the script of the actual text string based on Unicode properties (Ucdn::$uni_scriptblock) - // $scripttag is the default tag derived from $scriptblock - /* - http://www.microsoft.com/typography/otspec/ttoreg.htm - http://www.microsoft.com/typography/otspec/scripttags.htm - Values for useOTL - Bit dn hn Value - 1 1 0x0001 GSUB/GPOS - Latin scripts - 2 2 0x0002 GSUB/GPOS - Cyrillic scripts - 3 4 0x0004 GSUB/GPOS - Greek scripts - 4 8 0x0008 GSUB/GPOS - CJK scripts (excluding Hangul-Jamo) - 5 16 0x0010 (Reserved) - 6 32 0x0020 (Reserved) - 7 64 0x0040 (Reserved) - 8 128 0x0080 GSUB/GPOS - All other scripts (including all RTL scripts, complex scripts with shapers etc) - NB If change for RTL - cf. function magic_reverse_dir in mpdf.php to update - */ - if ($scriptblock == Ucdn::SCRIPT_LATIN) { - if (!($useOTL & 0x1)) { - return ['', \false]; - } - } elseif ($scriptblock == Ucdn::SCRIPT_CYRILLIC) { - if (!($useOTL & 0x2)) { - return ['', \false]; - } - } elseif ($scriptblock == Ucdn::SCRIPT_GREEK) { - if (!($useOTL & 0x4)) { - return ['', \false]; - } - } elseif ($scriptblock >= Ucdn::SCRIPT_HIRAGANA && $scriptblock <= Ucdn::SCRIPT_YI) { - if (!($useOTL & 0x8)) { - return ['', \false]; - } - } else { - if (!($useOTL & 0x80)) { - return ['', \false]; - } - } - // If availabletags includes scripttag - choose - if (isset($ScriptLang[$scripttag])) { - return [$scripttag, \false]; - } - // If INDIC (or Myanmar) and available tag not includes new version, check if includes old version & choose old version - if ($shaper) { - switch ($scripttag) { - case 'bng2': - if (isset($ScriptLang['beng'])) { - return ['beng', \true]; - } - // fallthrough - case 'dev2': - if (isset($ScriptLang['deva'])) { - return ['deva', \true]; - } - // fallthrough - case 'gjr2': - if (isset($ScriptLang['gujr'])) { - return ['gujr', \true]; - } - // fallthrough - case 'gur2': - if (isset($ScriptLang['guru'])) { - return ['guru', \true]; - } - // fallthrough - case 'knd2': - if (isset($ScriptLang['knda'])) { - return ['knda', \true]; - } - // fallthrough - case 'mlm2': - if (isset($ScriptLang['mlym'])) { - return ['mlym', \true]; - } - // fallthrough - case 'ory2': - if (isset($ScriptLang['orya'])) { - return ['orya', \true]; - } - // fallthrough - case 'tml2': - if (isset($ScriptLang['taml'])) { - return ['taml', \true]; - } - // fallthrough - case 'tel2': - if (isset($ScriptLang['telu'])) { - return ['telu', \true]; - } - // fallthrough - case 'mym2': - if (isset($ScriptLang['mymr'])) { - return ['mymr', \true]; - } - } - } - // choose DFLT if present - if (isset($ScriptLang['DFLT'])) { - return ['DFLT', \false]; - } - // else choose dflt if present - if (isset($ScriptLang['dflt'])) { - return ['dflt', \false]; - } - // else return no scriptTag - if (isset($ScriptLang['latn'])) { - return ['latn', \false]; - } - // else return no scriptTag - return ['', \false]; - } - // LangSys tags - private function _getOTLLangTag($ietf, $available) - { - // http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes - // http://www.microsoft.com/typography/otspec/languagetags.htm - // IETF tag = e.g. en-US, und-Arab, sr-Cyrl cf. class LangToFont - if ($available == '') { - return ''; - } - $tags = $ietf ? \preg_split('/-/', $ietf) : []; - $lang = ''; - $country = ''; - $script = ''; - $lang = isset($tags[0]) ? \strtolower($tags[0]) : ''; - if (isset($tags[1]) && $tags[1]) { - if (\strlen($tags[1]) == 2) { - $country = \strtolower($tags[1]); - } - } - if (isset($tags[2]) && $tags[2]) { - $country = \strtolower($tags[2]); - } - if ($lang != '' && isset(Ucdn::$ot_languages[$lang])) { - $langsys = Ucdn::$ot_languages[$lang]; - } elseif ($lang != '' && $country != '' && isset(Ucdn::$ot_languages[$lang . '' . $country])) { - $langsys = Ucdn::$ot_languages[$lang . '' . $country]; - } else { - $langsys = "DFLT"; - } - if (\strpos($available, $langsys) === \false) { - if (\strpos($available, "DFLT") !== \false) { - return "DFLT"; - } else { - return ''; - } - } - return $langsys; - } - private function _dumpproc($GPOSSUB, $lookupID, $subtable, $Type, $Format, $ptr, $currGlyph, $level) - { - echo '<div style="padding-left: ' . $level * 2 . 'em;">'; - echo $GPOSSUB . ' LookupID #' . $lookupID . ' Subtable#' . $subtable . ' Type: ' . $Type . ' Format: ' . $Format . '<br />'; - echo '<div style="font-family:monospace">'; - echo 'Glyph position: ' . $ptr . ' Current Glyph: ' . $currGlyph . '<br />'; - for ($i = 0; $i < \count($this->OTLdata); $i++) { - if ($i == $ptr) { - echo '<b>'; - } - echo $this->OTLdata[$i]['hex'] . ' '; - if ($i == $ptr) { - echo '</b>'; - } - } - echo '<br />'; - for ($i = 0; $i < \count($this->OTLdata); $i++) { - if ($i == $ptr) { - echo '<b>'; - } - echo \str_pad($this->OTLdata[$i]['uni'], 5) . ' '; - if ($i == $ptr) { - echo '</b>'; - } - } - echo '<br />'; - if ($GPOSSUB == 'GPOS') { - for ($i = 0; $i < \count($this->OTLdata); $i++) { - if (!empty($this->OTLdata[$i]['GPOSinfo'])) { - echo $this->OTLdata[$i]['hex'] . ' &#x' . $this->OTLdata[$i]['hex'] . '; '; - \print_r($this->OTLdata[$i]['GPOSinfo']); - echo ' '; - } - } - } - echo '</div>'; - echo '</div>'; - } -} diff --git a/dependencies/mpdf/mpdf/src/OtlDump.php b/dependencies/mpdf/mpdf/src/OtlDump.php deleted file mode 100644 index f880da8..0000000 --- a/dependencies/mpdf/mpdf/src/OtlDump.php +++ /dev/null @@ -1,3993 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -// Define the value used in the "head" table of a created TTF file -// 0x74727565 "true" for Mac -// 0x00010000 for Windows -// Either seems to work for a font embedded in a PDF file -// when read by Adobe Reader on a Windows PC(!) -use WP_Ultimo\Dependencies\Mpdf\Fonts\GlyphOperator; -if (!\defined('_TTF_MAC_HEADER')) { - \define("_TTF_MAC_HEADER", \false); -} -// Recalculate correct metadata/profiles when making subset fonts (not SIP/SMP) -// e.g. xMin, xMax, maxNContours -if (!\defined('_RECALC_PROFILE')) { - \define("_RECALC_PROFILE", \false); -} -// mPDF 5.7.1 -if (!\function_exists('WP_Ultimo\\Dependencies\\Mpdf\\unicode_hex')) { - function unicode_hex($unicode_dec) - { - return \sprintf("%05s", \strtoupper(\dechex($unicode_dec))); - } -} -class OtlDump -{ - var $GPOSFeatures; - // mPDF 5.7.1 - var $GPOSLookups; - // mPDF 5.7.1 - var $GPOSScriptLang; - // mPDF 5.7.1 - var $ignoreStrings; - // mPDF 5.7.1 - var $MarkAttachmentType; - // mPDF 5.7.1 - var $MarkGlyphSets; - // mPDF 7.5.1 - var $GlyphClassMarks; - // mPDF 5.7.1 - var $GlyphClassLigatures; - // mPDF 5.7.1 - var $GlyphClassBases; - // mPDF 5.7.1 - var $GlyphClassComponents; - // mPDF 5.7.1 - var $GSUBScriptLang; - // mPDF 5.7.1 - var $rtlPUAstr; - // mPDF 5.7.1 - var $rtlPUAarr; - // mPDF 5.7.1 - var $fontkey; - // mPDF 5.7.1 - var $useOTL; - // mPDF 5.7.1 - var $panose; - var $maxUni; - var $sFamilyClass; - var $sFamilySubClass; - var $sipset; - var $smpset; - var $_pos; - var $numTables; - var $searchRange; - var $entrySelector; - var $rangeShift; - var $tables; - var $otables; - var $filename; - var $fh; - var $glyphPos; - var $charToGlyph; - var $ascent; - var $descent; - var $name; - var $familyName; - var $styleName; - var $fullName; - var $uniqueFontID; - var $unitsPerEm; - var $bbox; - var $capHeight; - var $stemV; - var $italicAngle; - var $flags; - var $underlinePosition; - var $underlineThickness; - var $charWidths; - var $defaultWidth; - var $maxStrLenRead; - var $numTTCFonts; - var $TTCFonts; - var $maxUniChar; - var $kerninfo; - var $mode; - var $glyphToChar; - var $fontRevision; - var $glyphdata; - var $glyphIDtoUn; - var $restrictedUse; - var $GSUBFeatures; - var $GSUBLookups; - var $glyphIDtoUni; - var $GSLuCoverage; - var $version; - private $mpdf; - public function __construct(Mpdf $mpdf) - { - $this->mpdf = $mpdf; - $this->maxStrLenRead = 200000; - // Maximum size of glyf table to read in as string (otherwise reads each glyph from file) - } - function getMetrics($file, $fontkey, $TTCfontID = 0, $debug = \false, $BMPonly = \false, $kerninfo = \false, $useOTL = 0, $mode = null) - { - // mPDF 5.7.1 - $this->mode = $mode; - $this->useOTL = $useOTL; - // mPDF 5.7.1 - $this->fontkey = $fontkey; - // mPDF 5.7.1 - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open file "%s"', $file)); - } - $this->_pos = 0; - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->otables = []; - $this->kerninfo = []; - $this->ascent = 0; - $this->descent = 0; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->version = $version = $this->read_ulong(); - $this->panose = []; - if ($version == 0x4f54544f) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Fonts with postscript outlines are not supported (%s)', $file)); - } - if ($version == 0x74746366 && !$TTCfontID) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("TTCfontID for a TrueType Collection has to be defined in ttfontdata configuration key (" . $file . ")"); - } - if (!\in_array($version, [0x10000, 0x74727565]) && !$TTCfontID) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Not a TrueType font: version=" . $version); - } - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000])) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error parsing TrueType Collection: version=" . $version . " - " . $file); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - } - $this->readTableDirectory($debug); - $this->extractInfo($debug, $BMPonly, $kerninfo, $useOTL); - \fclose($this->fh); - } - function readTableDirectory($debug = \false) - { - $this->numTables = $this->read_ushort(); - $this->searchRange = $this->read_ushort(); - $this->entrySelector = $this->read_ushort(); - $this->rangeShift = $this->read_ushort(); - $this->tables = []; - for ($i = 0; $i < $this->numTables; $i++) { - $record = []; - $record['tag'] = $this->read_tag(); - $record['checksum'] = [$this->read_ushort(), $this->read_ushort()]; - $record['offset'] = $this->read_ulong(); - $record['length'] = $this->read_ulong(); - $this->tables[$record['tag']] = $record; - } - if ($debug) { - $this->checksumTables(); - } - } - function checksumTables() - { - // Check the checksums for all tables - foreach ($this->tables as $t) { - if ($t['length'] > 0 && $t['length'] < $this->maxStrLenRead) { - // 1.02 - $table = $this->get_chunk($t['offset'], $t['length']); - $checksum = $this->calcChecksum($table); - if ($t['tag'] == 'head') { - $up = \unpack('n*', \substr($table, 8, 4)); - $adjustment[0] = $up[1]; - $adjustment[1] = $up[2]; - $checksum = $this->sub32($checksum, $adjustment); - } - $xchecksum = $t['checksum']; - if ($xchecksum != $checksum) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('TTF file "%s": invalid checksum %s table: %s (expected %s)', $this->filename, \dechex($checksum[0]) . \dechex($checksum[1]), $t['tag'], \dechex($xchecksum[0]) . \dechex($xchecksum[1]))); - } - } - } - } - function sub32($x, $y) - { - $xlo = $x[1]; - $xhi = $x[0]; - $ylo = $y[1]; - $yhi = $y[0]; - if ($ylo > $xlo) { - $xlo += 1 << 16; - $yhi += 1; - } - $reslo = $xlo - $ylo; - if ($yhi > $xhi) { - $xhi += 1 << 16; - } - $reshi = $xhi - $yhi; - $reshi = $reshi & 0xffff; - return [$reshi, $reslo]; - } - function calcChecksum($data) - { - if (\strlen($data) % 4) { - $data .= \str_repeat("\x00", 4 - \strlen($data) % 4); - } - $len = \strlen($data); - $hi = 0x0; - $lo = 0x0; - for ($i = 0; $i < $len; $i += 4) { - $hi += (\ord($data[$i]) << 8) + \ord($data[$i + 1]); - $lo += (\ord($data[$i + 2]) << 8) + \ord($data[$i + 3]); - $hi += $lo >> 16 & 0xffff; - $lo = $lo & 0xffff; - } - return [$hi, $lo]; - } - function get_table_pos($tag) - { - $offset = isset($this->tables[$tag]['offset']) ? $this->tables[$tag]['offset'] : null; - $length = isset($this->tables[$tag]['length']) ? $this->tables[$tag]['length'] : null; - return [$offset, $length]; - } - function seek($pos) - { - $this->_pos = $pos; - \fseek($this->fh, $this->_pos); - } - function skip($delta) - { - $this->_pos = $this->_pos + $delta; - \fseek($this->fh, $delta, \SEEK_CUR); - } - function seek_table($tag, $offset_in_table = 0) - { - $tpos = $this->get_table_pos($tag); - $this->_pos = $tpos[0] + $offset_in_table; - \fseek($this->fh, $this->_pos); - return $this->_pos; - } - function read_tag() - { - $this->_pos += 4; - return \fread($this->fh, 4); - } - function read_short() - { - $this->_pos += 2; - $s = \fread($this->fh, 2); - $a = (\ord($s[0]) << 8) + \ord($s[1]); - if ($a & 1 << 15) { - $a = $a - (1 << 16); - } - return $a; - } - function unpack_short($s) - { - $a = (\ord($s[0]) << 8) + \ord($s[1]); - if ($a & 1 << 15) { - $a = $a - (1 << 16); - } - return $a; - } - function read_ushort() - { - $this->_pos += 2; - $s = \fread($this->fh, 2); - return (\ord($s[0]) << 8) + \ord($s[1]); - } - function read_ulong() - { - $this->_pos += 4; - $s = \fread($this->fh, 4); - // if large uInt32 as an integer, PHP converts it to -ve - return \ord($s[0]) * 16777216 + (\ord($s[1]) << 16) + (\ord($s[2]) << 8) + \ord($s[3]); - // 16777216 = 1<<24 - } - function get_ushort($pos) - { - \fseek($this->fh, $pos); - $s = \fread($this->fh, 2); - return (\ord($s[0]) << 8) + \ord($s[1]); - } - function get_ulong($pos) - { - \fseek($this->fh, $pos); - $s = \fread($this->fh, 4); - // iF large uInt32 as an integer, PHP converts it to -ve - return \ord($s[0]) * 16777216 + (\ord($s[1]) << 16) + (\ord($s[2]) << 8) + \ord($s[3]); - // 16777216 = 1<<24 - } - function pack_short($val) - { - if ($val < 0) { - $val = \abs($val); - $val = ~$val; - $val += 1; - } - return \pack("n", $val); - } - function splice($stream, $offset, $value) - { - return \substr($stream, 0, $offset) . $value . \substr($stream, $offset + \strlen($value)); - } - function _set_ushort($stream, $offset, $value) - { - $up = \pack("n", $value); - return $this->splice($stream, $offset, $up); - } - function _set_short($stream, $offset, $val) - { - if ($val < 0) { - $val = \abs($val); - $val = ~$val; - $val += 1; - } - $up = \pack("n", $val); - return $this->splice($stream, $offset, $up); - } - function get_chunk($pos, $length) - { - \fseek($this->fh, $pos); - if ($length < 1) { - return ''; - } - return \fread($this->fh, $length); - } - function get_table($tag) - { - list($pos, $length) = $this->get_table_pos($tag); - if ($length == 0) { - return ''; - } - \fseek($this->fh, $pos); - return \fread($this->fh, $length); - } - function add($tag, $data) - { - if ($tag == 'head') { - $data = $this->splice($data, 8, "\x00\x00\x00\x00"); - } - $this->otables[$tag] = $data; - } - ///////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////// - function extractInfo($debug = \false, $BMPonly = \false, $kerninfo = \false, $useOTL = 0) - { - $this->panose = []; - $this->sFamilyClass = 0; - $this->sFamilySubClass = 0; - /////////////////////////////////// - // name - Naming table - /////////////////////////////////// - $name_offset = $this->seek_table("name"); - $format = $this->read_ushort(); - if ($format != 0 && $format != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error loading font: Unknown name table format " . $format); - } - $numRecords = $this->read_ushort(); - $string_data_offset = $name_offset + $this->read_ushort(); - $names = [1 => '', 2 => '', 3 => '', 4 => '', 6 => '']; - $K = \array_keys($names); - $nameCount = \count($names); - for ($i = 0; $i < $numRecords; $i++) { - $platformId = $this->read_ushort(); - $encodingId = $this->read_ushort(); - $languageId = $this->read_ushort(); - $nameId = $this->read_ushort(); - $length = $this->read_ushort(); - $offset = $this->read_ushort(); - if (!\in_array($nameId, $K)) { - continue; - } - $N = ''; - if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { - // Microsoft, Unicode, US English, PS Name - $opos = $this->_pos; - $this->seek($string_data_offset + $offset); - if ($length % 2 != 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error loading font: PostScript name is UTF-16BE string of odd length"); - } - $length /= 2; - $N = ''; - while ($length > 0) { - $char = $this->read_ushort(); - $N .= \chr($char); - $length -= 1; - } - $this->_pos = $opos; - $this->seek($opos); - } else { - if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { - // Macintosh, Roman, English, PS Name - $opos = $this->_pos; - $N = $this->get_chunk($string_data_offset + $offset, $length); - $this->_pos = $opos; - $this->seek($opos); - } - } - if ($N && $names[$nameId] == '') { - $names[$nameId] = $N; - $nameCount -= 1; - if ($nameCount == 0) { - break; - } - } - } - if ($names[6]) { - $psName = $names[6]; - } else { - if ($names[4]) { - $psName = \preg_replace('/ /', '-', $names[4]); - } else { - if ($names[1]) { - $psName = \preg_replace('/ /', '-', $names[1]); - } else { - $psName = ''; - } - } - } - if (!$psName) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error loading font: Could not find PostScript font name: " . $this->filename); - } - if ($debug) { - for ($i = 0; $i < \count($psName); $i++) { - $c = $psName[$i]; - $oc = \ord($c); - if ($oc > 126 || \strpos(' [](){}<>/%', $c) !== \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("psName=" . $psName . " contains invalid character " . $c . " ie U+" . \ord($c)); - } - } - } - $this->name = $psName; - if ($names[1]) { - $this->familyName = $names[1]; - } else { - $this->familyName = $psName; - } - if ($names[2]) { - $this->styleName = $names[2]; - } else { - $this->styleName = 'Regular'; - } - if ($names[4]) { - $this->fullName = $names[4]; - } else { - $this->fullName = $psName; - } - if ($names[3]) { - $this->uniqueFontID = $names[3]; - } else { - $this->uniqueFontID = $psName; - } - if ($names[6]) { - $this->fullName = $names[6]; - } - /////////////////////////////////// - // head - Font header table - /////////////////////////////////// - $this->seek_table("head"); - if ($debug) { - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Unknown head table version ' . $ver_maj . '.' . $ver_min); - } - $this->fontRevision = $this->read_ushort() . $this->read_ushort(); - $this->skip(4); - $magic = $this->read_ulong(); - if ($magic != 0x5f0f3cf5) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Invalid head table magic ' . $magic); - } - $this->skip(2); - } else { - $this->skip(18); - } - $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); - $scale = 1000 / $unitsPerEm; - $this->skip(16); - $xMin = $this->read_short(); - $yMin = $this->read_short(); - $xMax = $this->read_short(); - $yMax = $this->read_short(); - $this->bbox = [$xMin * $scale, $yMin * $scale, $xMax * $scale, $yMax * $scale]; - $this->skip(3 * 2); - $indexToLocFormat = $this->read_ushort(); - $glyphDataFormat = $this->read_ushort(); - if ($glyphDataFormat != 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Unknown glyph data format ' . $glyphDataFormat); - } - /////////////////////////////////// - // hhea metrics table - /////////////////////////////////// - // ttf2t1 seems to use this value rather than the one in OS/2 - so put in for compatibility - if (isset($this->tables["hhea"])) { - $this->seek_table("hhea"); - $this->skip(4); - $hheaAscender = $this->read_short(); - $hheaDescender = $this->read_short(); - $this->ascent = $hheaAscender * $scale; - $this->descent = $hheaDescender * $scale; - } - /////////////////////////////////// - // OS/2 - OS/2 and Windows metrics table - /////////////////////////////////// - if (isset($this->tables["OS/2"])) { - $this->seek_table("OS/2"); - $version = $this->read_ushort(); - $this->skip(2); - $usWeightClass = $this->read_ushort(); - $this->skip(2); - $fsType = $this->read_ushort(); - if ($fsType == 0x2 || ($fsType & 0x300) != 0) { - global $overrideTTFFontRestriction; - if (!$overrideTTFFontRestriction) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Font file ' . $this->filename . ' cannot be embedded due to copyright restrictions.'); - } - $this->restrictedUse = \true; - } - $this->skip(20); - $sF = $this->read_short(); - $this->sFamilyClass = $sF >> 8; - $this->sFamilySubClass = $sF & 0xff; - $this->_pos += 10; - //PANOSE = 10 byte length - $panose = \fread($this->fh, 10); - $this->panose = []; - for ($p = 0; $p < \strlen($panose); $p++) { - $this->panose[] = \ord($panose[$p]); - } - $this->skip(26); - $sTypoAscender = $this->read_short(); - $sTypoDescender = $this->read_short(); - if (!$this->ascent) { - $this->ascent = $sTypoAscender * $scale; - } - if (!$this->descent) { - $this->descent = $sTypoDescender * $scale; - } - if ($version > 1) { - $this->skip(16); - $sCapHeight = $this->read_short(); - $this->capHeight = $sCapHeight * $scale; - } else { - $this->capHeight = $this->ascent; - } - } else { - $usWeightClass = 500; - if (!$this->ascent) { - $this->ascent = $yMax * $scale; - } - if (!$this->descent) { - $this->descent = $yMin * $scale; - } - $this->capHeight = $this->ascent; - } - $this->stemV = 50 + \intval(\pow($usWeightClass / 65.0, 2)); - /////////////////////////////////// - // post - PostScript table - /////////////////////////////////// - $this->seek_table("post"); - if ($debug) { - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - if ($ver_maj < 1 || $ver_maj > 4) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Unknown post table version ' . $ver_maj); - } - } else { - $this->skip(4); - } - $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; - $this->underlinePosition = $this->read_short() * $scale; - $this->underlineThickness = $this->read_short() * $scale; - $isFixedPitch = $this->read_ulong(); - $this->flags = 4; - if ($this->italicAngle != 0) { - $this->flags = $this->flags | 64; - } - if ($usWeightClass >= 600) { - $this->flags = $this->flags | 262144; - } - if ($isFixedPitch) { - $this->flags = $this->flags | 1; - } - /////////////////////////////////// - // hhea - Horizontal header table - /////////////////////////////////// - $this->seek_table("hhea"); - if ($debug) { - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error loading font: Unknown hhea table version %s', $ver_maj)); - } - $this->skip(28); - } else { - $this->skip(32); - } - $metricDataFormat = $this->read_ushort(); - if ($metricDataFormat != 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Unknown horizontal metric data format ' . $metricDataFormat); - } - $numberOfHMetrics = $this->read_ushort(); - if ($numberOfHMetrics == 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Number of horizontal metrics is 0'); - } - /////////////////////////////////// - // maxp - Maximum profile table - /////////////////////////////////// - $this->seek_table("maxp"); - if ($debug) { - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Unknown maxp table version ' . $ver_maj); - } - } else { - $this->skip(4); - } - $numGlyphs = $this->read_ushort(); - /////////////////////////////////// - // cmap - Character to glyph index mapping table - /////////////////////////////////// - $cmap_offset = $this->seek_table("cmap"); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 1 || $platformID == 0) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - if (!$unicode_cmap_offset) { - $unicode_cmap_offset = $cmap_offset + $offset; - } - if ($BMPonly) { - break; - } - } - } else { - if (($platformID == 3 && $encodingID == 10 || $platformID == 0) && !$BMPonly) { - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 12) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - } - $this->seek($save_pos); - } - if (!$unicode_cmap_offset) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Font (' . $this->filename . ') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)'); - } - $sipset = \false; - $smpset = \false; - // mPDF 5.7.1 - $this->GSUBScriptLang = []; - $this->rtlPUAstr = ''; - $this->rtlPUAarr = []; - $this->GSUBFeatures = []; - $this->GSUBLookups = []; - $this->GPOSScriptLang = []; - $this->GPOSFeatures = []; - $this->GPOSLookups = []; - $this->glyphIDtoUni = ''; - // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above - if ($format == 12 && !$BMPonly) { - $this->maxUniChar = 0; - $this->seek($unicode_cmap_offset + 4); - $length = $this->read_ulong(); - $limit = $unicode_cmap_offset + $length; - $this->skip(4); - $nGroups = $this->read_ulong(); - $glyphToChar = []; - $charToGlyph = []; - for ($i = 0; $i < $nGroups; $i++) { - $startCharCode = $this->read_ulong(); - $endCharCode = $this->read_ulong(); - $startGlyphCode = $this->read_ulong(); - if ($endCharCode > 0x20000 && $endCharCode < 0x2ffff) { - $sipset = \true; - } else { - if ($endCharCode > 0x10000 && $endCharCode < 0x1ffff) { - $smpset = \true; - } - } - $offset = 0; - for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { - $glyph = $startGlyphCode + $offset; - $offset++; - if ($unichar < 0x30000) { - $charToGlyph[$unichar] = $glyph; - $this->maxUniChar = \max($unichar, $this->maxUniChar); - $glyphToChar[$glyph][] = $unichar; - } - } - } - } else { - $glyphToChar = []; - $charToGlyph = []; - $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); - } - $this->sipset = $sipset; - $this->smpset = $smpset; - /////////////////////////////////// - // mPDF 5.7.1 - // Map Unmapped glyphs - from $numGlyphs - if ($this->useOTL) { - $bctr = 0xe000; - for ($gid = 1; $gid < $numGlyphs; $gid++) { - if (!isset($glyphToChar[$gid])) { - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - // Avoid overwriting a glyph already mapped in PUA - if ($bctr > 0xf8ff && $bctr < 0x2ceb0) { - if (!$BMPonly) { - $bctr = 0x2ceb0; - // Use unassigned area 0x2CEB0 to 0x2F7FF (space for 10,000 characters) - $this->sipset = $sipset = \true; - // forces subsetting; also ensure charwidths are saved - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $this->filename)); - } - } - $glyphToChar[$gid][] = $bctr; - $charToGlyph[$bctr] = $gid; - $this->maxUniChar = \max($bctr, $this->maxUniChar); - $bctr++; - } - } - } - $this->glyphToChar = $glyphToChar; - $this->charToGlyph = $charToGlyph; - /////////////////////////////////// - // mPDF 5.7.1 OpenType Layout tables - $this->GSUBScriptLang = []; - $this->rtlPUAstr = ''; - $this->rtlPUAarr = []; - if ($useOTL) { - $this->_getGDEFtables(); - list($this->GSUBScriptLang, $this->GSUBFeatures, $this->GSUBLookups, $this->rtlPUAstr, $this->rtlPUAarr) = $this->_getGSUBtables(); - list($this->GPOSScriptLang, $this->GPOSFeatures, $this->GPOSLookups) = $this->_getGPOStables(); - $this->glyphIDtoUni = \str_pad('', 256 * 256 * 3, "\x00"); - foreach ($glyphToChar as $gid => $arr) { - if (isset($glyphToChar[$gid][0])) { - $char = $glyphToChar[$gid][0]; - if ($char != 0 && $char != 65535) { - $this->glyphIDtoUni[$gid * 3] = \chr($char >> 16); - $this->glyphIDtoUni[$gid * 3 + 1] = \chr($char >> 8 & 0xff); - $this->glyphIDtoUni[$gid * 3 + 2] = \chr($char & 0xff); - } - } - } - } - /////////////////////////////////// - /////////////////////////////////// - // hmtx - Horizontal metrics table - /////////////////////////////////// - $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); - /////////////////////////////////// - // kern - Kerning pair table - /////////////////////////////////// - if ($kerninfo) { - // Recognises old form of Kerning table - as required by Windows - Format 0 only - $kern_offset = $this->seek_table("kern"); - $version = $this->read_ushort(); - $nTables = $this->read_ushort(); - // subtable header - $sversion = $this->read_ushort(); - $slength = $this->read_ushort(); - $scoverage = $this->read_ushort(); - $format = $scoverage >> 8; - if ($kern_offset && $version == 0 && $format == 0) { - // Format 0 - $nPairs = $this->read_ushort(); - $this->skip(6); - for ($i = 0; $i < $nPairs; $i++) { - $left = $this->read_ushort(); - $right = $this->read_ushort(); - $val = $this->read_short(); - if (\count($glyphToChar[$left]) == 1 && \count($glyphToChar[$right]) == 1) { - if ($left != 32 && $right != 32) { - $this->kerninfo[$glyphToChar[$left][0]][$glyphToChar[$right][0]] = \intval($val * $scale); - } - } - } - } - } - } - ///////////////////////////////////////////////////////////////////////////////////////// - function _getGDEFtables() - { - /////////////////////////////////// - // GDEF - Glyph Definition - /////////////////////////////////// - // http://www.microsoft.com/typography/otspec/gdef.htm - if (isset($this->tables["GDEF"])) { - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h1>GDEF table</h1>'); - } - $gdef_offset = $this->seek_table("GDEF"); - // ULONG Version of the GDEF table-currently 0x00010000 - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - // Version 0x00010002 of GDEF header contains additional Offset to a list defining mark glyph set definitions (MarkGlyphSetDef) - $GlyphClassDef_offset = $this->read_ushort(); - $AttachList_offset = $this->read_ushort(); - $LigCaretList_offset = $this->read_ushort(); - $MarkAttachClassDef_offset = $this->read_ushort(); - if ($ver_min == 2) { - $MarkGlyphSetsDef_offset = $this->read_ushort(); - } - // GlyphClassDef - $this->seek($gdef_offset + $GlyphClassDef_offset); - /* - 1 Base glyph (single character, spacing glyph) - 2 Ligature glyph (multiple character, spacing glyph) - 3 Mark glyph (non-spacing combining glyph) - 4 Component glyph (part of single character, spacing glyph) - */ - $GlyphByClass = $this->_getClassDefinitionTable(); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h2>Glyph classes</h2>'); - } - if (isset($GlyphByClass[1]) && \count($GlyphByClass[1]) > 0) { - $this->GlyphClassBases = $this->formatClassArr($GlyphByClass[1]); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>Glyph class 1</h3>'); - $this->mpdf->WriteHTML('<h5>Base glyph (single character, spacing glyph)</h5>'); - $html = ''; - $html .= '<div class="glyphs">'; - foreach ($GlyphByClass[1] as $g) { - $html .= '&#x' . $g . '; '; - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - } - } else { - $this->GlyphClassBases = ''; - } - if (isset($GlyphByClass[2]) && \count($GlyphByClass[2]) > 0) { - $this->GlyphClassLigatures = $this->formatClassArr($GlyphByClass[2]); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>Glyph class 2</h3>'); - $this->mpdf->WriteHTML('<h5>Ligature glyph (multiple character, spacing glyph)</h5>'); - $html = ''; - $html .= '<div class="glyphs">'; - foreach ($GlyphByClass[2] as $g) { - $html .= '&#x' . $g . '; '; - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - } - } else { - $this->GlyphClassLigatures = ''; - } - if (isset($GlyphByClass[3]) && \count($GlyphByClass[3]) > 0) { - $this->GlyphClassMarks = $this->formatClassArr($GlyphByClass[3]); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>Glyph class 3</h3>'); - $this->mpdf->WriteHTML('<h5>Mark glyph (non-spacing combining glyph)</h5>'); - $html = ''; - $html .= '<div class="glyphs">'; - foreach ($GlyphByClass[3] as $g) { - $html .= '◌&#x' . $g . '; '; - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - } - } else { - $this->GlyphClassMarks = ''; - } - if (isset($GlyphByClass[4]) && \count($GlyphByClass[4]) > 0) { - $this->GlyphClassComponents = $this->formatClassArr($GlyphByClass[4]); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>Glyph class 4</h3>'); - $this->mpdf->WriteHTML('<h5>Component glyph (part of single character, spacing glyph)</h5>'); - $html = ''; - $html .= '<div class="glyphs">'; - foreach ($GlyphByClass[4] as $g) { - $html .= '&#x' . $g . '; '; - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - } - } else { - $this->GlyphClassComponents = ''; - } - $Marks = $GlyphByClass[3]; - // to use for MarkAttachmentType - /* Required for GPOS - // Attachment List - if ($AttachList_offset) { - $this->seek($gdef_offset+$AttachList_offset ); - } - The Attachment Point List table (AttachmentList) identifies all the attachment points defined in the GPOS table and their associated glyphs so a client can quickly access coordinates for each glyph's attachment points. As a result, the client can cache coordinates for attachment points along with glyph bitmaps and avoid recalculating the attachment points each time it displays a glyph. Without this table, processing speed would be slower because the client would have to decode the GPOS lookups that define attachment points and compile the points in a list. - - The Attachment List table (AttachList) may be used to cache attachment point coordinates along with glyph bitmaps. - - The table consists of an offset to a Coverage table (Coverage) listing all glyphs that define attachment points in the GPOS table, a count of the glyphs with attachment points (GlyphCount), and an array of offsets to AttachPoint tables (AttachPoint). The array lists the AttachPoint tables, one for each glyph in the Coverage table, in the same order as the Coverage Index. - AttachList table - Type Name Description - Offset Coverage Offset to Coverage table - from beginning of AttachList table - uint16 GlyphCount Number of glyphs with attachment points - Offset AttachPoint[GlyphCount] Array of offsets to AttachPoint tables-from beginning of AttachList table-in Coverage Index order - - An AttachPoint table consists of a count of the attachment points on a single glyph (PointCount) and an array of contour indices of those points (PointIndex), listed in increasing numerical order. - - AttachPoint table - Type Name Description - uint16 PointCount Number of attachment points on this glyph - uint16 PointIndex[PointCount] Array of contour point indices -in increasing numerical order - - See Example 3 - http://www.microsoft.com/typography/otspec/gdef.htm - */ - // Ligature Caret List - // The Ligature Caret List table (LigCaretList) defines caret positions for all the ligatures in a font. - // Not required for mDPF - // MarkAttachmentType - if ($MarkAttachClassDef_offset) { - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h1>Mark Attachment Types</h1>'); - } - $this->seek($gdef_offset + $MarkAttachClassDef_offset); - $MarkAttachmentTypes = $this->_getClassDefinitionTable(); - foreach ($MarkAttachmentTypes as $class => $glyphs) { - if (\is_array($Marks) && \count($Marks)) { - $mat = \array_diff($Marks, $MarkAttachmentTypes[$class]); - \sort($mat, \SORT_STRING); - } else { - $mat = []; - } - $this->MarkAttachmentType[$class] = $this->formatClassArr($mat); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>Mark Attachment Type: ' . $class . '</h3>'); - $html = ''; - $html .= '<div class="glyphs">'; - foreach ($glyphs as $g) { - $html .= '◌&#x' . $g . '; '; - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - } - } - } else { - $this->MarkAttachmentType = []; - } - // MarkGlyphSets only in Version 0x00010002 of GDEF - if ($ver_min == 2 && $MarkGlyphSetsDef_offset) { - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h1>Mark Glyph Sets</h1>'); - } - $this->seek($gdef_offset + $MarkGlyphSetsDef_offset); - $MarkSetTableFormat = $this->read_ushort(); - $MarkSetCount = $this->read_ushort(); - $MarkSetOffset = []; - for ($i = 0; $i < $MarkSetCount; $i++) { - $MarkSetOffset[] = $this->read_ulong(); - } - for ($i = 0; $i < $MarkSetCount; $i++) { - $this->seek($MarkSetOffset[$i]); - $glyphs = $this->_getCoverage(); - $this->MarkGlyphSets[$i] = $this->formatClassArr($glyphs); - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>Mark Glyph Set class: ' . $i . '</h3>'); - $html = ''; - $html .= '<div class="glyphs">'; - foreach ($glyphs as $g) { - $html .= '◌&#x' . $g . '; '; - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - } - } - } else { - $this->MarkGlyphSets = []; - } - } else { - $this->mpdf->WriteHTML('<div>GDEF table not defined</div>'); - } - //echo $this->GlyphClassMarks ; exit; - //print_r($GlyphClass); exit; - //print_r($GlyphByClass); exit; - } - function _getClassDefinitionTable($offset = 0) - { - if ($offset > 0) { - $this->seek($offset); - } - // NB Any glyph not included in the range of covered GlyphIDs automatically belongs to Class 0. This is not returned by this function - $ClassFormat = $this->read_ushort(); - $GlyphByClass = []; - if ($ClassFormat == 1) { - $StartGlyph = $this->read_ushort(); - $GlyphCount = $this->read_ushort(); - for ($i = 0; $i < $GlyphCount; $i++) { - $gid = $StartGlyph + $i; - $class = $this->read_ushort(); - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); - } - } else { - if ($ClassFormat == 2) { - $tableCount = $this->read_ushort(); - for ($i = 0; $i < $tableCount; $i++) { - $startGlyphID = $this->read_ushort(); - $endGlyphID = $this->read_ushort(); - $class = $this->read_ushort(); - for ($gid = $startGlyphID; $gid <= $endGlyphID; $gid++) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); - } - } - } - } - \ksort($GlyphByClass); - return $GlyphByClass; - } - function _getGSUBtables() - { - /////////////////////////////////// - // GSUB - Glyph Substitution - /////////////////////////////////// - if (isset($this->tables["GSUB"])) { - $this->mpdf->WriteHTML('<h1>GSUB Tables</h1>'); - $ffeats = []; - $gsub_offset = $this->seek_table("GSUB"); - $this->skip(4); - $ScriptList_offset = $gsub_offset + $this->read_ushort(); - $FeatureList_offset = $gsub_offset + $this->read_ushort(); - $LookupList_offset = $gsub_offset + $this->read_ushort(); - // ScriptList - $this->seek($ScriptList_offset); - $ScriptCount = $this->read_ushort(); - for ($i = 0; $i < $ScriptCount; $i++) { - $ScriptTag = $this->read_tag(); - // = "beng", "deva" etc. - $ScriptTableOffset = $this->read_ushort(); - $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; - } - // Script Table - foreach ($ffeats as $t => $o) { - $ls = []; - $this->seek($o); - $DefLangSys_offset = $this->read_ushort(); - if ($DefLangSys_offset > 0) { - $ls['DFLT'] = $DefLangSys_offset + $o; - } - $LangSysCount = $this->read_ushort(); - for ($i = 0; $i < $LangSysCount; $i++) { - $LangTag = $this->read_tag(); - // = - $LangTableOffset = $this->read_ushort(); - $ls[$LangTag] = $o + $LangTableOffset; - } - $ffeats[$t] = $ls; - } - //print_r($ffeats); exit; - // Get FeatureIndexList - // LangSys Table - from first listed langsys - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = []; - $langsystable_offset = $o; - $this->seek($langsystable_offset); - $LookUpOrder = $this->read_ushort(); - //==NULL - $ReqFeatureIndex = $this->read_ushort(); - if ($ReqFeatureIndex != 0xffff) { - $FeatureIndex[] = $ReqFeatureIndex; - } - $FeatureCount = $this->read_ushort(); - for ($i = 0; $i < $FeatureCount; $i++) { - $FeatureIndex[] = $this->read_ushort(); - // = index of feature - } - $ffeats[$st][$t] = $FeatureIndex; - } - } - //print_r($ffeats); exit; - // Feauture List => LookupListIndex es - $this->seek($FeatureList_offset); - $FeatureCount = $this->read_ushort(); - $Feature = []; - for ($i = 0; $i < $FeatureCount; $i++) { - $Feature[$i] = ['tag' => $this->read_tag()]; - $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $FeatureCount; $i++) { - $this->seek($Feature[$i]['offset']); - $this->read_ushort(); - // null - $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); - $Feature[$i]['LookupListIndex'] = []; - for ($c = 0; $c < $Lookupcount; $c++) { - $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); - } - } - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = $ffeats[$st][$t]; - foreach ($FeatureIndex as $k => $fi) { - $ffeats[$st][$t][$k] = $Feature[$fi]; - } - } - } - //===================================================================================== - $gsub = []; - $GSUBScriptLang = []; - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $langsys) { - $lg = []; - foreach ($langsys as $ft) { - $lg[$ft['LookupListIndex'][0]] = $ft; - } - // list of Lookups in order they need to be run i.e. order listed in Lookup table - \ksort($lg); - foreach ($lg as $ft) { - $gsub[$st][$t][$ft['tag']] = $ft['LookupListIndex']; - } - if (!isset($GSUBScriptLang[$st])) { - $GSUBScriptLang[$st] = ''; - } - $GSUBScriptLang[$st] .= $t . ' '; - } - } - //print_r($gsub); exit; - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>GSUB Scripts & Languages</h3>'); - $this->mpdf->WriteHTML('<div class="glyphs">'); - $html = ''; - if (\count($gsub)) { - foreach ($gsub as $st => $g) { - $html .= '<h5>' . $st . '</h5>'; - foreach ($g as $l => $t) { - $html .= '<div><a href="font_dump_OTL.php?script=' . $st . '&lang=' . $l . '">' . $l . '</a></b>: '; - foreach ($t as $tag => $o) { - $html .= $tag . ' '; - } - $html .= '</div>'; - } - } - } else { - $html .= '<div>No entries in GSUB table.</div>'; - } - $this->mpdf->WriteHTML($html); - $this->mpdf->WriteHTML('</div>'); - return 0; - } - //===================================================================================== - // Get metadata and offsets for whole Lookup List table - $this->seek($LookupList_offset); - $LookupCount = $this->read_ushort(); - $GSLookup = []; - $Offsets = []; - $SubtableCount = []; - for ($i = 0; $i < $LookupCount; $i++) { - $Offsets[$i] = $LookupList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $LookupCount; $i++) { - $this->seek($Offsets[$i]); - $GSLookup[$i]['Type'] = $this->read_ushort(); - $GSLookup[$i]['Flag'] = $flag = $this->read_ushort(); - $GSLookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $GSLookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); - } - // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure - if (($flag & 0x10) == 0x10) { - $GSLookup[$i]['MarkFilteringSet'] = $this->read_ushort(); - } - // else { $GSLookup[$i]['MarkFilteringSet'] = ''; } - // Lookup Type 7: Extension - if ($GSLookup[$i]['Type'] == 7) { - // Overwrites new offset (32-bit) for each subtable, and a new lookup Type - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $this->seek($GSLookup[$i]['Subtables'][$c]); - $ExtensionPosFormat = $this->read_ushort(); - $type = $this->read_ushort(); - $GSLookup[$i]['Subtables'][$c] = $GSLookup[$i]['Subtables'][$c] + $this->read_ulong(); - } - $GSLookup[$i]['Type'] = $type; - } - } - //print_r($GSLookup); exit; - //===================================================================================== - // Process Whole LookupList - Get LuCoverage = Lookup coverage just for first glyph - $this->GSLuCoverage = []; - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $GSLookup[$i]['SubtableCount']; $c++) { - $this->seek($GSLookup[$i]['Subtables'][$c]); - $PosFormat = $this->read_ushort(); - if ($GSLookup[$i]['Type'] == 5 && $PosFormat == 3) { - $this->skip(4); - } else { - if ($GSLookup[$i]['Type'] == 6 && $PosFormat == 3) { - $BacktrackGlyphCount = $this->read_ushort(); - $this->skip(2 * $BacktrackGlyphCount + 2); - } - } - // NB Coverage only looks at glyphs for position 1 (i.e. 5.3 and 6.3) // NEEDS TO READ ALL ******************** - $Coverage = $GSLookup[$i]['Subtables'][$c] + $this->read_ushort(); - $this->seek($Coverage); - $glyphs = $this->_getCoverage(); - $this->GSLuCoverage[$i][$c] = \implode('|', $glyphs); - } - } - // $this->GSLuCoverage and $GSLookup - //===================================================================================== - $s = '<?php -$GSLuCoverage = ' . \var_export($this->GSLuCoverage, \true) . '; -?>'; - //===================================================================================== - $s = '<?php -$GlyphClassBases = \'' . $this->GlyphClassBases . '\'; -$GlyphClassMarks = \'' . $this->GlyphClassMarks . '\'; -$GlyphClassLigatures = \'' . $this->GlyphClassLigatures . '\'; -$GlyphClassComponents = \'' . $this->GlyphClassComponents . '\'; -$MarkGlyphSets = ' . \var_export($this->MarkGlyphSets, \true) . '; -$MarkAttachmentType = ' . \var_export($this->MarkAttachmentType, \true) . '; -?>'; - //===================================================================================== - //===================================================================================== - //===================================================================================== - // Now repeats as original to get Substitution rules - //===================================================================================== - //===================================================================================== - //===================================================================================== - // Get metadata and offsets for whole Lookup List table - $this->seek($LookupList_offset); - $LookupCount = $this->read_ushort(); - $Lookup = []; - for ($i = 0; $i < $LookupCount; $i++) { - $Lookup[$i]['offset'] = $LookupList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $LookupCount; $i++) { - $this->seek($Lookup[$i]['offset']); - $Lookup[$i]['Type'] = $this->read_ushort(); - $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); - $Lookup[$i]['SubtableCount'] = $this->read_ushort(); - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['offset'] + $this->read_ushort(); - } - // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure - if (($flag & 0x10) == 0x10) { - $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); - } else { - $Lookup[$i]['MarkFilteringSet'] = ''; - } - // Lookup Type 7: Extension - if ($Lookup[$i]['Type'] == 7) { - // Overwrites new offset (32-bit) for each subtable, and a new lookup Type - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); - $ExtensionPosFormat = $this->read_ushort(); - $type = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ulong(); - } - $Lookup[$i]['Type'] = $type; - } - } - //print_r($Lookup); exit; - //===================================================================================== - // Process (1) Whole LookupList - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); - $SubstFormat = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['Format'] = $SubstFormat; - /* - Lookup['Type'] Enumeration table for glyph substitution - Value Type Description - 1 Single Replace one glyph with one glyph - 2 Multiple Replace one glyph with more than one glyph - 3 Alternate Replace one glyph with one of many glyphs - 4 Ligature Replace multiple glyphs with one glyph - 5 Context Replace one or more glyphs in context - 6 Chaining Context Replace one or more glyphs in chained context - 7 Extension Substitution Extension mechanism for other substitutions (i.e. this excludes the Extension type substitution itself) - 8 Reverse chaining context single Applied in reverse order, replace single glyph in chaining context - */ - // LookupType 1: Single Substitution Subtable - if ($Lookup[$i]['Type'] == 1) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - if ($SubstFormat == 1) { - // Calculated output glyph indices - $Lookup[$i]['Subtable'][$c]['DeltaGlyphID'] = $this->read_short(); - } else { - if ($SubstFormat == 2) { - // Specified output glyph indices - $GlyphCount = $this->read_ushort(); - for ($g = 0; $g < $GlyphCount; $g++) { - $Lookup[$i]['Subtable'][$c]['Glyphs'][] = $this->read_ushort(); - } - } - } - } else { - if ($Lookup[$i]['Type'] == 2) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SequenceCount'] = $SequenceCount = $this->read_short(); - for ($s = 0; $s < $SequenceCount; $s++) { - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $SequenceCount; $s++) { - // Sequence Tables - $this->seek($Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); - } - } - } else { - if ($Lookup[$i]['Type'] == 3) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['AlternateSetCount'] = $AlternateSetCount = $this->read_short(); - for ($s = 0; $s < $AlternateSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $AlternateSetCount; $s++) { - // AlternateSet Tables - $this->seek($Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); - } - } - } else { - if ($Lookup[$i]['Type'] == 4) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['LigSetCount'] = $LigSetCount = $this->read_short(); - for ($s = 0; $s < $LigSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $LigSetCount; $s++) { - // LigatureSet Tables - $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g] = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] + $this->read_ushort(); - } - } - for ($s = 0; $s < $LigSetCount; $s++) { - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { - // Ligature tables - $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g]); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount'] = $this->read_ushort(); - for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l] = $this->read_ushort(); - } - } - } - } else { - if ($Lookup[$i]['Type'] == 5) { - // Format 1: Context Substitution - if ($SubstFormat == 1) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubRuleSetCount'] = $SubRuleSetCount = $this->read_short(); - for ($s = 0; $s < $SubRuleSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $SubRuleSetCount; $s++) { - // SubRuleSet Tables - $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] + $this->read_ushort(); - } - } - for ($s = 0; $s < $SubRuleSetCount; $s++) { - // SubRule Tables - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { - // Ligature tables - $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g]); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount'] = $this->read_ushort(); - // "Input"::[GlyphCount - 1]::Array of input GlyphIDs-start with second glyph - for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount']; $l++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['Input'][$l] = $this->read_ushort(); - } - // "SubstLookupRecord"::[SubstCount]::Array of SubstLookupRecords-in design order - for ($l = 0; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount']; $l++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['SequenceIndex'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['LookupListIndex'] = $this->read_ushort(); - } - } - } - } else { - if ($SubstFormat == 2) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubClassSetCnt'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = 0; - } else { - $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; - } - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Lookup[$i]['Type'] . ", Format " . $SubstFormat . " not supported (ttfontsuni.php)."); - } - } - } else { - if ($Lookup[$i]['Type'] == 6) { - // Format 1: Simple Chaining Context Glyph Substitution p255 - if ($SubstFormat == 1) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - } else { - if ($SubstFormat == 2) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['InputClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $offset; - } else { - $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; - } - } - } else { - if ($SubstFormat == 3) { - $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['InputGlyphCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['CoverageInput'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['CoverageLookahead'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['SubstCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex'] = $this->read_ushort(); - /* - Substitution Lookup Record - All contextual substitution subtables specify the substitution data in a Substitution Lookup Record (SubstLookupRecord). Each record contains a SequenceIndex, which indicates the position where the substitution will occur in the glyph sequence. In addition, a LookupListIndex identifies the lookup to be applied at the glyph position specified by the SequenceIndex. - */ - } - } - } - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Lookup Type " . $Lookup[$i]['Type'] . " not supported."); - } - } - } - } - } - } - } - } - //print_r($Lookup); exit; - //===================================================================================== - // Process (2) Whole LookupList - // Get Coverage tables and prepare preg_replace - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; - // LookupType 1: Single Substitution Subtable 1 => 1 - if ($Lookup[$i]['Type'] == 1) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(\false); - for ($g = 0; $g < \count($glyphs); $g++) { - $replace = []; - $substitute = []; - $replace[] = unicode_hex($this->glyphToChar[$glyphs[$g]][0]); - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - if (isset($Lookup[$i]['Subtable'][$c]['DeltaGlyphID'])) { - // Format 1 - $substitute[] = unicode_hex($this->glyphToChar[$glyphs[$g] + $Lookup[$i]['Subtable'][$c]['DeltaGlyphID']][0]); - } else { - // Format 2 - $substitute[] = unicode_hex($this->glyphToChar[$Lookup[$i]['Subtable'][$c]['Glyphs'][$g]][0]); - } - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; - } - } else { - if ($Lookup[$i]['Type'] == 2) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(); - for ($g = 0; $g < \count($glyphs); $g++) { - $replace = []; - $substitute = []; - $replace[] = $glyphs[$g]; - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - if (!isset($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) || \count($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) == 0) { - continue; - } - // Illegal for GlyphCount to be 0; either error in font, or something has gone wrong - lets carry on for now! - foreach ($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID'] as $sub) { - $substitute[] = unicode_hex($this->glyphToChar[$sub][0]); - } - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; - } - } else { - if ($Lookup[$i]['Type'] == 3) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(); - for ($g = 0; $g < \count($glyphs); $g++) { - $replace = []; - $substitute = []; - $replace[] = $glyphs[$g]; - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - for ($gl = 0; $gl < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['GlyphCount']; $gl++) { - $gid = $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['SubstituteGlyphID'][$gl]; - $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); - } - //$gid = $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['SubstituteGlyphID'][0]; - //$substitute[] = unicode_hex($this->glyphToChar[$gid][0]); - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; - } - if ($i == 166) { - \print_r($Lookup[$i]['Subtable']); - exit; - } - } else { - if ($Lookup[$i]['Type'] == 4) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(); - $LigSetCount = $Lookup[$i]['Subtable'][$c]['LigSetCount']; - for ($s = 0; $s < $LigSetCount; $s++) { - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { - $replace = []; - $substitute = []; - $replace[] = $glyphs[$s]; - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { - $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l]; - $rpl = unicode_hex($this->glyphToChar[$gid][0]); - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $rpl, $Lookup[$i]['MarkFilteringSet'])) { - continue 2; - } - $replace[] = $rpl; - } - $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph']; - $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute, 'CompCount' => $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']]; - } - } - } else { - if ($Lookup[$i]['Type'] == 5) { - // Format 1: Context Substitution - if ($SubstFormat == 1) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { - $SubRuleSet = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]; - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph'] = $CoverageGlyphs[$s]; - for ($r = 0; $r < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $r++) { - $GlyphCount = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['GlyphCount']; - for ($g = 1; $g < $GlyphCount; $g++) { - $glyphID = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['Input'][$g]; - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - } - } - } else { - if ($SubstFormat == 2) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['ClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { - if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s]); - $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt'] = $SubClassRuleCnt = $this->read_ushort(); - $SubClassRule = []; - for ($b = 0; $b < $SubClassRuleCnt; $b++) { - $SubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $SubClassRule[$b]; - } - } - } - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { - $SubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt']; - for ($b = 0; $b < $SubClassRuleCnt; $b++) { - if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b]); - $Rule = []; - $Rule['InputGlyphCount'] = $this->read_ushort(); - $Rule['SubstCount'] = $this->read_ushort(); - for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { - $Rule['Input'][$r] = $this->read_ushort(); - } - for ($r = 0; $r < $Rule['SubstCount']; $r++) { - $Rule['SequenceIndex'][$r] = $this->read_ushort(); - $Rule['LookupListIndex'][$r] = $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $Rule; - } - } - } - } else { - if ($SubstFormat == 3) { - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = \implode("|", $glyphs); - } - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Lookup Type 5, SubstFormat 3 not tested. Please report this with the name of font used - " . $this->fontkey); - } - } - } - } else { - if ($Lookup[$i]['Type'] == 6) { - // Format 1: Simple Chaining Context Glyph Substitution p255 - if ($SubstFormat == 1) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - $ChainSubRuleSetCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; - for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s]); - $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount'] = $this->read_ushort(); - for ($r = 0; $r < $ChainSubRuleCnt; $r++) { - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r] = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s] + $this->read_ushort(); - } - } - for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { - $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount']; - for ($r = 0; $r < $ChainSubRuleCnt; $r++) { - // ChainSubRule - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r]); - $BacktrackGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphCount'] = $this->read_ushort(); - for ($g = 0; $g < $BacktrackGlyphCount; $g++) { - $glyphID = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - $InputGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphCount'] = $this->read_ushort(); - for ($g = 1; $g < $InputGlyphCount; $g++) { - $glyphID = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - $LookaheadGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphCount'] = $this->read_ushort(); - for ($g = 0; $g < $LookaheadGlyphCount; $g++) { - $glyphID = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - $SubstCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SubstCount'] = $this->read_ushort(); - for ($lu = 0; $lu < $SubstCount; $lu++) { - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SequenceIndex'][$lu] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookupListIndex'][$lu] = $this->read_ushort(); - } - } - } - } else { - if ($SubstFormat == 2) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - $BacktrackClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['BacktrackClasses'] = $BacktrackClasses; - $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['InputClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; - $LookaheadClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['LookaheadClasses'] = $LookaheadClasses; - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { - if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s]); - $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt'] = $ChainSubClassRuleCnt = $this->read_ushort(); - $ChainSubClassRule = []; - for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { - $ChainSubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $ChainSubClassRule[$b]; - } - } - } - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { - $ChainSubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt']; - for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { - if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b]); - $Rule = []; - $Rule['BacktrackGlyphCount'] = $this->read_ushort(); - for ($r = 0; $r < $Rule['BacktrackGlyphCount']; $r++) { - $Rule['Backtrack'][$r] = $this->read_ushort(); - } - $Rule['InputGlyphCount'] = $this->read_ushort(); - for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { - $Rule['Input'][$r] = $this->read_ushort(); - } - $Rule['LookaheadGlyphCount'] = $this->read_ushort(); - for ($r = 0; $r < $Rule['LookaheadGlyphCount']; $r++) { - $Rule['Lookahead'][$r] = $this->read_ushort(); - } - $Rule['SubstCount'] = $this->read_ushort(); - for ($r = 0; $r < $Rule['SubstCount']; $r++) { - $Rule['SequenceIndex'][$r] = $this->read_ushort(); - $Rule['LookupListIndex'][$r] = $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $Rule; - } - } - } - } else { - if ($SubstFormat == 3) { - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs'][] = \implode("|", $glyphs); - } - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = \implode("|", $glyphs); - // Don't use above value as these are ordered numerically not as need to process - } - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageLookahead'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs'][] = \implode("|", $glyphs); - } - } - } - } - } - } - } - } - } - } - } - } - //===================================================================================== - //===================================================================================== - //===================================================================================== - $st = $this->mpdf->OTLscript; - $t = $this->mpdf->OTLlang; - $langsys = $gsub[$st][$t]; - $lul = []; - // array of LookupListIndexes - $tags = []; - // corresponding array of feature tags e.g. 'ccmp' - foreach ($langsys as $tag => $ft) { - foreach ($ft as $ll) { - $lul[$ll] = $tag; - } - } - \ksort($lul); - // Order the Lookups in the order they are in the GUSB table, regardless of Feature order - $this->_getGSUBarray($Lookup, $lul, $st); - //print_r($lul); exit; - } - //print_r($Lookup); exit; - return [$GSUBScriptLang, $gsub, $GSLookup, $rtlPUAstr, $rtlPUAarr]; - } - ///////////////////////////////////////////////////////////////////////////////////////// - // GSUB functions - function _getGSUBarray(&$Lookup, &$lul, $scripttag, $level = 1, $coverage = '', $exB = '', $exL = '') - { - // Process (3) LookupList for specific Script-LangSys - // Generate preg_replace - $html = ''; - if ($level == 1) { - $html .= '<bookmark level="0" content="GSUB features">'; - } - foreach ($lul as $i => $tag) { - $html .= '<div class="level' . $level . '">'; - $html .= '<h5 class="level' . $level . '">'; - if ($level == 1) { - $html .= '<bookmark level="1" content="' . $tag . ' [#' . $i . ']">'; - } - $html .= 'Lookup #' . $i . ' [tag: <span style="color:#000066;">' . $tag . '</span>]</h5>'; - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - if ($ignore) { - $html .= '<div class="ignore">Ignoring: ' . $ignore . '</div> '; - } - $Type = $Lookup[$i]['Type']; - $Flag = $Lookup[$i]['Flag']; - if (($Flag & 0x1) == 1) { - $dir = 'RTL'; - } else { - $dir = 'LTR'; - } - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $html .= '<div class="subtable">Subtable #' . $c; - if ($level == 1) { - $html .= '<bookmark level="2" content="Subtable #' . $c . '">'; - } - $html .= '</div>'; - $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; - // LookupType 1: Single Substitution Subtable - if ($Lookup[$i]['Type'] == 1) { - $html .= '<div class="lookuptype">LookupType 1: Single Substitution Subtable</div>'; - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; - if ($level == 2 && \strpos($coverage, $inputGlyphs[0]) === \false) { - continue; - } - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUni($inputGlyphs[0]) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntity($inputGlyphs[0]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; - $html .= '</div>'; - } - } else { - if ($Lookup[$i]['Type'] == 2) { - $html .= '<div class="lookuptype">LookupType 2: Multiple Substitution Subtable</div>'; - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']; - if ($level == 2 && \strpos($coverage, $inputGlyphs[0]) === \false) { - continue; - } - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUni($inputGlyphs[0]) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntity($inputGlyphs[0]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed"> ' . $this->formatEntityArr($substitute) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  <span class="unicode">' . $this->formatUniArr($substitute) . '</span> '; - $html .= '</div>'; - } - } else { - if ($Lookup[$i]['Type'] == 3) { - $html .= '<div class="lookuptype">LookupType 3: Alternate Forms</div>'; - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; - if ($level == 2 && \strpos($coverage, $inputGlyphs[0]) === \false) { - continue; - } - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUni($inputGlyphs[0]) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntity($inputGlyphs[0]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; - if (\count($Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']) > 1) { - for ($alt = 1; $alt < \count($Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']); $alt++) { - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][$alt]; - $html .= '  |   ALT #' . $alt . '   '; - $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; - $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; - } - } - $html .= '</div>'; - } - } else { - if ($Lookup[$i]['Type'] == 4) { - $html .= '<div class="lookuptype">LookupType 4: Ligature Substitution Subtable</div>'; - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; - if ($level == 2 && \strpos($coverage, $inputGlyphs[0]) === \false) { - continue; - } - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUniArr($inputGlyphs) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntityArr($inputGlyphs) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed"> ' . $this->formatEntity($substitute) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  <span class="unicode">' . $this->formatUni($substitute) . '</span> '; - $html .= '</div>'; - } - } else { - if ($Lookup[$i]['Type'] == 5) { - $html .= '<div class="lookuptype">LookupType 5: Contextual Substitution Subtable</div>'; - // Format 1: Context Substitution - if ($SubstFormat == 1) { - $html .= '<div class="lookuptypesub">Format 1: Context Substitution</div>'; - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { - // SubRuleSet - $subRule = []; - $html .= '<div class="rule">Subrule Set: ' . $s . '</div>'; - foreach ($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'] as $rctr => $rule) { - // SubRule - $html .= '<div class="rule">SubRule: ' . $rctr . '</div>'; - $inputGlyphs = []; - if ($rule['GlyphCount'] > 1) { - $inputGlyphs = $rule['InputGlyphs']; - } - $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph']; - \ksort($inputGlyphs); - $nInput = \count($inputGlyphs); - $exampleI = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - $html .= '</div>'; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['SubstLookupRecord'][$b]['LookupListIndex']; - $seqIndex = $rule['SubstLookupRecord'][$b]['SequenceIndex']; - // GENERATE exampleI[<seqIndex] .... exampleI[>seqIndex] - $exB = ''; - $exL = ''; - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - $exB .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - $exL .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; - } - $exL .= '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } else { - if ($SubstFormat == 2) { - $html .= '<div class="lookuptypesub">Format 2: Class-based Context Glyph Substitution</div>'; - foreach ($Lookup[$i]['Subtable'][$c]['SubClassSet'] as $inputClass => $cscs) { - $html .= '<div class="rule">Input Class: ' . $inputClass . '</div>'; - for ($cscrule = 0; $cscrule < $cscs['SubClassRuleCnt']; $cscrule++) { - $html .= '<div class="rule">Rule: ' . $cscrule . '</div>'; - $rule = $cscs['SubClassRule'][$cscrule]; - $inputGlyphs = []; - $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; - if ($rule['InputGlyphCount'] > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { - $classindex = $rule['Input'][$gcl]; - $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; - } - } - // Class 0 contains all the glyphs NOT in the other classes - $class0excl = \implode('|', $Lookup[$i]['Subtable'][$c]['InputClasses']); - $exampleI = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - if (!$inputGlyphs[$ff]) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; - $exampleI[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; - } else { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - } - $html .= '</div>'; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['LookupListIndex'][$b]; - $seqIndex = $rule['SequenceIndex'][$b]; - // GENERATE exampleI[<seqIndex] .... exampleI[>seqIndex] - $exB = ''; - $exL = ''; - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - if (!$inputGlyphs[$ip]) { - $exB .= '[*]'; - } else { - $exB .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; - } - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - if (!$inputGlyphs[$ip]) { - $exL .= '[*]'; - } else { - $exL .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; - } - } - $exL .= '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } else { - if ($SubstFormat == 3) { - $html .= '<div class="lookuptypesub">Format 3: Coverage-based Context Glyph Substitution </div>'; - // IgnoreMarks flag set on main Lookup table - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; - $CoverageInputGlyphs = \implode('|', $inputGlyphs); - $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; - $exampleI = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - $html .= '</div>'; - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { - $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; - $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; - // GENERATE exampleI[<seqIndex] .... exampleI[>seqIndex] - $exB = ''; - $exL = ''; - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - $exB .= $exampleI[$ip] . '‍'; - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - $exL .= $exampleI[$ip] . '‍'; - } - $exL .= '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } - //print_r($Lookup[$i]); - //print_r($volt[(count($volt)-1)]); exit; - } else { - if ($Lookup[$i]['Type'] == 6) { - $html .= '<div class="lookuptype">LookupType 6: Chaining Contextual Substitution Subtable</div>'; - // Format 1: Simple Chaining Context Glyph Substitution p255 - if ($SubstFormat == 1) { - $html .= '<div class="lookuptypesub">Format 1: Simple Chaining Context Glyph Substitution </div>'; - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $s++) { - // ChainSubRuleSet - $subRule = []; - $html .= '<div class="rule">Subrule Set: ' . $s . '</div>'; - $firstInputGlyph = $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'][$s]; - // First input gyyph - foreach ($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'] as $rctr => $rule) { - $html .= '<div class="rule">SubRule: ' . $rctr . '</div>'; - // ChainSubRule - $inputGlyphs = []; - if ($rule['InputGlyphCount'] > 1) { - $inputGlyphs = $rule['InputGlyphs']; - } - $inputGlyphs[0] = $firstInputGlyph; - \ksort($inputGlyphs); - $nInput = \count($inputGlyphs); - if ($rule['BacktrackGlyphCount']) { - $backtrackGlyphs = $rule['BacktrackGlyphs']; - } else { - $backtrackGlyphs = []; - } - if ($rule['LookaheadGlyphCount']) { - $lookaheadGlyphs = $rule['LookaheadGlyphs']; - } else { - $lookaheadGlyphs = []; - } - $exampleB = []; - $exampleI = []; - $exampleL = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = \count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { - $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; - $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); - } - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - for ($ff = 0; $ff < \count($lookaheadGlyphs); $ff++) { - $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; - $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); - } - $html .= '</div>'; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['LookupListIndex'][$b]; - $seqIndex = $rule['SequenceIndex'][$b]; - // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] - $exB = ''; - $exL = ''; - if (\count($exampleB)) { - $exB .= '<span class="backtrack">' . \implode('‍', $exampleB) . '</span>'; - } - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - $exB .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - $exL .= $this->formatEntity($inputGlyphs[$ip]) . '‍'; - } - $exL .= '</span>'; - } - if (\count($exampleL)) { - $exL .= '<span class="lookahead">' . \implode('‍', $exampleL) . '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } else { - if ($SubstFormat == 2) { - $html .= '<div class="lookuptypesub">Format 2: Class-based Chaining Context Glyph Substitution </div>'; - foreach ($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'] as $inputClass => $cscs) { - $html .= '<div class="rule">Input Class: ' . $inputClass . '</div>'; - for ($cscrule = 0; $cscrule < $cscs['ChainSubClassRuleCnt']; $cscrule++) { - $html .= '<div class="rule">Rule: ' . $cscrule . '</div>'; - $rule = $cscs['ChainSubClassRule'][$cscrule]; - // These contain classes of glyphs as strings - // $Lookup[$i]['Subtable'][$c]['InputClasses'][(class)] e.g. 02E6|02E7|02E8 - // $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][(class)] - // $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][(class)] - // These contain arrays of classIndexes - // [Backtrack] [Lookahead] and [Input] (Input is from the second position only) - $inputGlyphs = []; - $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; - if ($rule['InputGlyphCount'] > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { - $classindex = $rule['Input'][$gcl]; - $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; - } - } - // Class 0 contains all the glyphs NOT in the other classes - $class0excl = \implode('|', $Lookup[$i]['Subtable'][$c]['InputClasses']); - $nInput = $rule['InputGlyphCount']; - if ($rule['BacktrackGlyphCount']) { - for ($gcl = 0; $gcl < $rule['BacktrackGlyphCount']; $gcl++) { - $classindex = $rule['Backtrack'][$gcl]; - $backtrackGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][$classindex]; - } - } else { - $backtrackGlyphs = []; - } - if ($rule['LookaheadGlyphCount']) { - for ($gcl = 0; $gcl < $rule['LookaheadGlyphCount']; $gcl++) { - $classindex = $rule['Lookahead'][$gcl]; - $lookaheadGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][$classindex]; - } - } else { - $lookaheadGlyphs = []; - } - $exampleB = []; - $exampleI = []; - $exampleL = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = \count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { - if (!$backtrackGlyphs[$ff]) { - $html .= '<div>Backtrack #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; - $exampleB[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; - } else { - $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; - $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); - } - } - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - if (!$inputGlyphs[$ff]) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; - $exampleI[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; - } else { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - } - for ($ff = 0; $ff < \count($lookaheadGlyphs); $ff++) { - if (!$lookaheadGlyphs[$ff]) { - $html .= '<div>Lookahead #' . $ff . ': <span class="unchanged"> [NOT ' . $this->formatEntityStr($class0excl) . '] </span></div>'; - $exampleL[] = '[NOT ' . $this->formatEntityFirst($class0excl) . ']'; - } else { - $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; - $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); - } - } - $html .= '</div>'; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['LookupListIndex'][$b]; - $seqIndex = $rule['SequenceIndex'][$b]; - // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] - $exB = ''; - $exL = ''; - if (\count($exampleB)) { - $exB .= '<span class="backtrack">' . \implode('‍', $exampleB) . '</span>'; - } - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - if (!$inputGlyphs[$ip]) { - $exB .= '[*]'; - } else { - $exB .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; - } - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - if (!$inputGlyphs[$ip]) { - $exL .= '[*]'; - } else { - $exL .= $this->formatEntityFirst($inputGlyphs[$ip]) . '‍'; - } - } - $exL .= '</span>'; - } - if (\count($exampleL)) { - $exL .= '<span class="lookahead">' . \implode('‍', $exampleL) . '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - } - } - //print_r($Lookup[$i]['Subtable'][$c]); exit; - } else { - if ($SubstFormat == 3) { - $html .= '<div class="lookuptypesub">Format 3: Coverage-based Chaining Context Glyph Substitution </div>'; - // IgnoreMarks flag set on main Lookup table - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; - $CoverageInputGlyphs = \implode('|', $inputGlyphs); - $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; - if ($Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']) { - $backtrackGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs']; - } else { - $backtrackGlyphs = []; - } - if ($Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']) { - $lookaheadGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs']; - } else { - $lookaheadGlyphs = []; - } - $exampleB = []; - $exampleI = []; - $exampleL = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = \count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { - $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; - $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); - } - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - for ($ff = 0; $ff < \count($lookaheadGlyphs); $ff++) { - $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; - $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); - } - $html .= '</div>'; - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { - $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; - $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; - // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] - $exB = ''; - $exL = ''; - if (\count($exampleB)) { - $exB .= '<span class="backtrack">' . \implode('‍', $exampleB) . '</span>'; - } - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - $exB .= $exampleI[$ip] . '‍'; - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - $exL .= $exampleI[$ip] . '‍'; - } - $exL .= '</span>'; - } - if (\count($exampleL)) { - $exL .= '<span class="lookahead">' . \implode('‍', $exampleL) . '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGSUBarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - } - } - } - } - } - } - } - } - } - } - $html .= '</div>'; - } - if ($level == 1) { - $this->mpdf->WriteHTML($html); - } else { - return $html; - } - //print_r($Lookup); exit; - } - //===================================================================================== - //===================================================================================== - // mPDF 5.7.1 - function _checkGSUBignore($flag, $glyph, $MarkFilteringSet) - { - $ignore = \false; - // Flag & 0x0008 = Ignore Marks - if (($flag & 0x8) == 0x8 && \strpos($this->GlyphClassMarks, $glyph)) { - $ignore = \true; - } - if (($flag & 0x4) == 0x4 && \strpos($this->GlyphClassLigatures, $glyph)) { - $ignore = \true; - } - if (($flag & 0x2) == 0x2 && \strpos($this->GlyphClassBases, $glyph)) { - $ignore = \true; - } - // Flag & 0xFF?? = MarkAttachmentType - if ($flag & 0xff00 && \strpos($this->MarkAttachmentType[$flag >> 8], $glyph)) { - $ignore = \true; - } - // Flag & 0x0010 = UseMarkFilteringSet - if ($flag & 0x10 && \strpos($this->MarkGlyphSets[$MarkFilteringSet], $glyph)) { - $ignore = \true; - } - return $ignore; - } - function _getGSUBignoreString($flag, $MarkFilteringSet) - { - // If ignoreFlag set, combine all ignore glyphs into -> "((?:(?: FBA1| FBA2| FBA3))*)" - // else "()" - // for Input - set on secondary Lookup table if in Context, and set Backtrack and Lookahead on Context Lookup - $str = ""; - $ignoreflag = 0; - // Flag & 0xFF?? = MarkAttachmentType - if ($flag & 0xff00) { - $MarkAttachmentType = $flag >> 8; - $ignoreflag = $flag; - //$str = $this->MarkAttachmentType[$MarkAttachmentType]; - $str = "MarkAttachmentType[" . $MarkAttachmentType . "] "; - } - // Flag & 0x0010 = UseMarkFilteringSet - if ($flag & 0x10) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("This font " . $this->fontkey . " contains MarkGlyphSets"); - $str = "Mark Glyph Set: "; - $str .= $this->MarkGlyphSets[$MarkFilteringSet]; - } - // If Ignore Marks set, supercedes any above - // Flag & 0x0008 = Ignore Marks - if (($flag & 0x8) == 0x8) { - $ignoreflag = 8; - //$str = $this->GlyphClassMarks; - $str = "Mark Glyphs "; - } - // Flag & 0x0004 = Ignore Ligatures - if (($flag & 0x4) == 0x4) { - $ignoreflag += 4; - if ($str) { - $str .= "|"; - } - //$str .= $this->GlyphClassLigatures; - $str .= "Ligature Glyphs "; - } - // Flag & 0x0002 = Ignore BaseGlyphs - if (($flag & 0x2) == 0x2) { - $ignoreflag += 2; - if ($str) { - $str .= "|"; - } - //$str .= $this->GlyphClassBases; - $str .= "Base Glyphs "; - } - if ($str) { - return $str; - } else { - return ""; - } - } - // GSUB Patterns - /* - BACKTRACK INPUT LOOKAHEAD - ================================== ================== ================================== - (FEEB|FEEC)(ign) ¦(FD12|FD13)(ign) ¦(0612)¦(ign) (0613)¦(ign) (FD12|FD13)¦(ign) (FEEB|FEEC) - ---------------- ---------------- ----- ------------ --------------- --------------- - Backtrack 1 Backtrack 2 Input 1 Input 2 Lookahead 1 Lookahead 2 - -------- --- --------- --- ---- --- ---- --- --------- --- ------- - \${1} \${2} \${3} \${4} \${5+} \${6+} \${7+} \${8+} - - nBacktrack = 2 nInput = 2 nLookahead = 2 - - nBsubs = 2xnBack nIsubs = (nBsubs+) nLsubs = (nBsubs+nIsubs+) 2xnLookahead - "\${1}\${2} " (nInput*2)-1 "\${5+} \${6+}" - "REPL" - - ¦\${1}\${2} ¦\${3}\${4} ¦REPL¦\${5+} \${6+}¦\${7+} \${8+}¦ - - - INPUT nInput = 5 - ============================================================ - ¦(0612)¦(ign) (0613)¦(ign) (0614)¦(ign) (0615)¦(ign) (0615)¦ - \${1} \${2} \${3} \${4} \${5} \${6} \${7} \${8} \${9} (All backreference numbers are + nBsubs) - ----- ------------ ------------ ------------ ------------ - Input 1 Input 2 Input 3 Input 4 Input 5 - - A====== SequenceIndex=1 ; Lookup match nGlyphs=1 - B=================== SequenceIndex=1 ; Lookup match nGlyphs=2 - C=============================== SequenceIndex=1 ; Lookup match nGlyphs=3 - D======================= SequenceIndex=2 ; Lookup match nGlyphs=2 - E===================================== SequenceIndex=2 ; Lookup match nGlyphs=3 - F====================== SequenceIndex=4 ; Lookup match nGlyphs=2 - - All backreference numbers are + nBsubs - A - "REPL\${2} \${3}\${4} \${5}\${6} \${7}\${8} \${9}" - B - "REPL\${2}\${4} \${5}\${6} \${7}\${8} \${9}" - C - "REPL\${2}\${4}\${6} \${7}\${8} \${9}" - D - "\${1} REPL\${2}\${4}\${6} \${7}\${8} \${9}" - E - "\${1} REPL\${2}\${4}\${6}\${8} \${9}" - F - "\${1}\${2} \${3}\${4} \${5} REPL\${6}\${8}" - */ - function _makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context - // $lookupGlyphs = array of glyphs (single Glyphs) making up Lookup Input sequence - $mLen = \count($lookupGlyphs); - // nGlyphs in the secondary Lookup match - $nInput = \count($inputGlyphs); - // nGlyphs in the Primary Input sequence - $str = ""; - for ($i = 0; $i < $nInput; $i++) { - if ($i > 0) { - $str .= $ignore . " "; - } - if ($i >= $seqIndex && $i < $seqIndex + $mLen) { - $str .= "" . $lookupGlyphs[$i - $seqIndex] . ""; - } else { - $str .= "" . $inputGlyphs[$i] . ""; - } - } - return $str; - } - function _makeGSUBinputMatch($inputGlyphs, $ignore) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context - // $lookupGlyphs = array of glyphs making up Lookup Input sequence - if applicable - $str = ""; - for ($i = 1; $i <= \count($inputGlyphs); $i++) { - if ($i > 1) { - $str .= $ignore . " "; - } - $str .= "" . $inputGlyphs[$i - 1] . ""; - } - return $str; - } - function _makeGSUBbacktrackMatch($backtrackGlyphs, $ignore) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ - // $backtrackGlyphs = array of glyphstrings making up Backtrack sequence - // 3 2 1 0 - // each item being e.g. E0AD|E0AF|F1FD - $str = ""; - for ($i = \count($backtrackGlyphs) - 1; $i >= 0; $i--) { - $str .= "" . $backtrackGlyphs[$i] . " " . $ignore . " "; - } - return $str; - } - function _makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ - // $lookaheadGlyphs = array of glyphstrings making up Lookahead sequence - // 0 1 2 3 - // each item being e.g. E0AD|E0AF|F1FD - $str = ""; - for ($i = 0; $i < \count($lookaheadGlyphs); $i++) { - $str .= $ignore . " " . $lookaheadGlyphs[$i] . ""; - } - return $str; - } - function _makeGSUBinputReplacement($nInput, $REPL, $ignore, $nBsubs, $mLen, $seqIndex) - { - // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" - // $nInput nGlyphs in the Primary Input sequence - // $REPL replacement glyphs from secondary lookup - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // $nBsubs Number of Backtrack substitutions (= 2x Number of Backtrack glyphs) - // $mLen nGlyphs in the secondary Lookup match - if no secondary lookup, should=$nInput - // $seqIndex Sequence Index to apply the secondary match - if ($ignore == "()") { - $ign = \false; - } else { - $ign = \true; - } - $str = ""; - if ($nInput == 1) { - $str = $REPL; - } else { - if ($nInput > 1) { - if ($mLen == $nInput) { - // whole string replaced - $str = $REPL; - if ($ign) { - // for every nInput over 1, add another replacement backreference, to move IGNORES after replacement - for ($x = 2; $x <= $nInput; $x++) { - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - } - } else { - // if only part of string replaced: - for ($x = 1; $x < $seqIndex + 1; $x++) { - if ($x == 1) { - $str .= '\\' . ($nBsubs + 1); - } else { - if ($ign) { - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - $str .= ' \\' . ($nBsubs + 1 + 2 * ($x - 1)); - } - } - if ($seqIndex > 0) { - $str .= " "; - } - $str .= $REPL; - if ($ign) { - for ($x = \max($seqIndex + 1, 2); $x < $seqIndex + 1 + $mLen; $x++) { - // move IGNORES after replacement - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - } - for ($x = $seqIndex + 1 + $mLen; $x <= $nInput; $x++) { - if ($ign) { - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - $str .= ' \\' . ($nBsubs + 1 + 2 * ($x - 1)); - } - } - } - } - return $str; - } - ////////////////////////////////////////////////////////////////////////////////// - function _getCoverage($convert2hex = \true) - { - $g = []; - $CoverageFormat = $this->read_ushort(); - if ($CoverageFormat == 1) { - $CoverageGlyphCount = $this->read_ushort(); - for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { - $glyphID = $this->read_ushort(); - if ($convert2hex) { - $g[] = unicode_hex($this->glyphToChar[$glyphID][0]); - } else { - $g[] = $glyphID; - } - } - } - if ($CoverageFormat == 2) { - $RangeCount = $this->read_ushort(); - for ($r = 0; $r < $RangeCount; $r++) { - $start = $this->read_ushort(); - $end = $this->read_ushort(); - $StartCoverageIndex = $this->read_ushort(); - // n/a - for ($gid = $start; $gid <= $end; $gid++) { - $glyphID = $gid; - if ($convert2hex) { - $g[] = unicode_hex($this->glyphToChar[$glyphID][0]); - } else { - $g[] = $glyphID; - } - } - } - } - return $g; - } - ////////////////////////////////////////////////////////////////////////////////// - function _getClasses($offset) - { - $this->seek($offset); - $ClassFormat = $this->read_ushort(); - $GlyphByClass = []; - if ($ClassFormat == 1) { - $StartGlyph = $this->read_ushort(); - $GlyphCount = $this->read_ushort(); - for ($i = 0; $i < $GlyphCount; $i++) { - $startGlyphID = $StartGlyph + $i; - $endGlyphID = $StartGlyph + $i; - $class = $this->read_ushort(); - for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { - if ($this->glyphToChar[$g][0]) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); - } - } - } - } else { - if ($ClassFormat == 2) { - $tableCount = $this->read_ushort(); - for ($i = 0; $i < $tableCount; $i++) { - $startGlyphID = $this->read_ushort(); - $endGlyphID = $this->read_ushort(); - $class = $this->read_ushort(); - for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { - if ($this->glyphToChar[$g][0]) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); - } - } - } - } - } - $gbc = []; - foreach ($GlyphByClass as $class => $garr) { - $gbc[$class] = \implode('|', $garr); - } - return $gbc; - } - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - function _getGPOStables() - { - /////////////////////////////////// - // GPOS - Glyph Positioning - /////////////////////////////////// - if (isset($this->tables["GPOS"])) { - $this->mpdf->WriteHTML('<h1>GPOS Tables</h1>'); - $ffeats = []; - $gpos_offset = $this->seek_table("GPOS"); - $this->skip(4); - $ScriptList_offset = $gpos_offset + $this->read_ushort(); - $FeatureList_offset = $gpos_offset + $this->read_ushort(); - $LookupList_offset = $gpos_offset + $this->read_ushort(); - // ScriptList - $this->seek($ScriptList_offset); - $ScriptCount = $this->read_ushort(); - for ($i = 0; $i < $ScriptCount; $i++) { - $ScriptTag = $this->read_tag(); - // = "beng", "deva" etc. - $ScriptTableOffset = $this->read_ushort(); - $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; - } - // Script Table - foreach ($ffeats as $t => $o) { - $ls = []; - $this->seek($o); - $DefLangSys_offset = $this->read_ushort(); - if ($DefLangSys_offset > 0) { - $ls['DFLT'] = $DefLangSys_offset + $o; - } - $LangSysCount = $this->read_ushort(); - for ($i = 0; $i < $LangSysCount; $i++) { - $LangTag = $this->read_tag(); - // = - $LangTableOffset = $this->read_ushort(); - $ls[$LangTag] = $o + $LangTableOffset; - } - $ffeats[$t] = $ls; - } - // Get FeatureIndexList - // LangSys Table - from first listed langsys - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = []; - $langsystable_offset = $o; - $this->seek($langsystable_offset); - $LookUpOrder = $this->read_ushort(); - //==NULL - $ReqFeatureIndex = $this->read_ushort(); - if ($ReqFeatureIndex != 0xffff) { - $FeatureIndex[] = $ReqFeatureIndex; - } - $FeatureCount = $this->read_ushort(); - for ($i = 0; $i < $FeatureCount; $i++) { - $FeatureIndex[] = $this->read_ushort(); - // = index of feature - } - $ffeats[$st][$t] = $FeatureIndex; - } - } - //print_r($ffeats); exit; - // Feauture List => LookupListIndex es - $this->seek($FeatureList_offset); - $FeatureCount = $this->read_ushort(); - $Feature = []; - for ($i = 0; $i < $FeatureCount; $i++) { - $Feature[$i] = ['tag' => $this->read_tag()]; - $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $FeatureCount; $i++) { - $this->seek($Feature[$i]['offset']); - $this->read_ushort(); - // null - $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); - $Feature[$i]['LookupListIndex'] = []; - for ($c = 0; $c < $Lookupcount; $c++) { - $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); - } - } - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = $ffeats[$st][$t]; - foreach ($FeatureIndex as $k => $fi) { - $ffeats[$st][$t][$k] = $Feature[$fi]; - } - } - } - //print_r($ffeats); exit; - //===================================================================================== - $gpos = []; - $GPOSScriptLang = []; - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $langsys) { - $lg = []; - foreach ($langsys as $ft) { - $lg[$ft['LookupListIndex'][0]] = $ft; - } - // list of Lookups in order they need to be run i.e. order listed in Lookup table - \ksort($lg); - foreach ($lg as $ft) { - $gpos[$st][$t][$ft['tag']] = $ft['LookupListIndex']; - } - if (!isset($GPOSScriptLang[$st])) { - $GPOSScriptLang[$st] = ''; - } - $GPOSScriptLang[$st] .= $t . ' '; - } - } - if ($this->mode == 'summary') { - $this->mpdf->WriteHTML('<h3>GPOS Scripts & Languages</h3>'); - $html = ''; - if (\count($gpos)) { - foreach ($gpos as $st => $g) { - $html .= '<h5>' . $st . '</h5>'; - foreach ($g as $l => $t) { - $html .= '<div><a href="font_dump_OTL.php?script=' . $st . '&lang=' . $l . '">' . $l . '</a></b>: '; - foreach ($t as $tag => $o) { - $html .= $tag . ' '; - } - $html .= '</div>'; - } - } - } else { - $html .= '<div>No entries in GPOS table.</div>'; - } - $this->mpdf->WriteHTML($html); - $this->mpdf->WriteHTML('</div>'); - return 0; - } - //===================================================================================== - // Get metadata and offsets for whole Lookup List table - $this->seek($LookupList_offset); - $LookupCount = $this->read_ushort(); - $Lookup = []; - $Offsets = []; - $SubtableCount = []; - for ($i = 0; $i < $LookupCount; $i++) { - $Offsets[$i] = $LookupList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $LookupCount; $i++) { - $this->seek($Offsets[$i]); - $Lookup[$i]['Type'] = $this->read_ushort(); - $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); - $Lookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $Lookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); - } - // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure - if (($flag & 0x10) == 0x10) { - $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); - } - // else { $Lookup[$i]['MarkFilteringSet'] = ''; } - // Lookup Type 9: Extension - if ($Lookup[$i]['Type'] == 9) { - // Overwrites new offset (32-bit) for each subtable, and a new lookup Type - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $this->seek($Lookup[$i]['Subtables'][$c]); - $ExtensionPosFormat = $this->read_ushort(); - $type = $this->read_ushort(); - $Lookup[$i]['Subtables'][$c] = $Lookup[$i]['Subtables'][$c] + $this->read_ulong(); - } - $Lookup[$i]['Type'] = $type; - } - } - //===================================================================================== - $st = $this->mpdf->OTLscript; - $t = $this->mpdf->OTLlang; - $langsys = $gpos[$st][$t]; - $lul = []; - // array of LookupListIndexes - $tags = []; - // corresponding array of feature tags e.g. 'ccmp' - if (\count($langsys)) { - foreach ($langsys as $tag => $ft) { - foreach ($ft as $ll) { - $lul[$ll] = $tag; - } - } - } - \ksort($lul); - // Order the Lookups in the order they are in the GUSB table, regardless of Feature order - $this->_getGPOSarray($Lookup, $lul, $st); - //print_r($lul); exit; - return [$GPOSScriptLang, $gpos, $Lookup]; - } - // end if GPOS - } - ////////////////////////////////////////////////////////////////////////////////// - //===================================================================================== - //===================================================================================== - //===================================================================================== - ///////////////////////////////////////////////////////////////////////////////////////// - // GPOS functions - function _getGPOSarray(&$Lookup, $lul, $scripttag, $level = 1, $lcoverage = '', $exB = '', $exL = '') - { - // Process (3) LookupList for specific Script-LangSys - $html = ''; - if ($level == 1) { - $html .= '<bookmark level="0" content="GPOS features">'; - } - foreach ($lul as $luli => $tag) { - $html .= '<div class="level' . $level . '">'; - $html .= '<h5 class="level' . $level . '">'; - if ($level == 1) { - $html .= '<bookmark level="1" content="' . $tag . ' [#' . $luli . ']">'; - } - $html .= 'Lookup #' . $luli . ' [tag: <span style="color:#000066;">' . $tag . '</span>]</h5>'; - $ignore = $this->_getGSUBignoreString($Lookup[$luli]['Flag'], $Lookup[$luli]['MarkFilteringSet']); - if ($ignore) { - $html .= '<div class="ignore">Ignoring: ' . $ignore . '</div> '; - } - $Type = $Lookup[$luli]['Type']; - $Flag = $Lookup[$luli]['Flag']; - if (($Flag & 0x1) == 1) { - $dir = 'RTL'; - } else { - $dir = 'LTR'; - } - for ($c = 0; $c < $Lookup[$luli]['SubtableCount']; $c++) { - $html .= '<div class="subtable">Subtable #' . $c; - if ($level == 1) { - $html .= '<bookmark level="2" content="Subtable #' . $c . '">'; - } - $html .= '</div>'; - // Lets start - $subtable_offset = $Lookup[$luli]['Subtables'][$c]; - $this->seek($subtable_offset); - $PosFormat = $this->read_ushort(); - //////////////////////////////////////////////////////////////////////////////// - // LookupType 1: Single adjustment Adjust position of a single glyph (e.g. SmallCaps/Sups/Subs) - //////////////////////////////////////////////////////////////////////////////// - if ($Lookup[$luli]['Type'] == 1) { - $html .= '<div class="lookuptype">LookupType 1: Single adjustment [Format ' . $PosFormat . ']</div>'; - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - $Coverage = $subtable_offset + $this->read_ushort(); - $ValueFormat = $this->read_ushort(); - $Value = $this->_getValueRecord($ValueFormat); - $this->seek($Coverage); - $glyphs = $this->_getCoverage(); - // Array of Hex Glyphs - for ($g = 0; $g < \count($glyphs); $g++) { - if ($level == 2 && \strpos($lcoverage, $glyphs[$g]) === \false) { - continue; - } - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUni($glyphs[$g]) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed" style="font-feature-settings:\'' . $tag . '\' 1;"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= ' <span class="unicode">'; - if ($Value['XPlacement']) { - $html .= ' Xpl: ' . $Value['XPlacement'] . ';'; - } - if ($Value['YPlacement']) { - $html .= ' YPl: ' . $Value['YPlacement'] . ';'; - } - if ($Value['XAdvance']) { - $html .= ' Xadv: ' . $Value['XAdvance']; - } - $html .= '</span>'; - $html .= '</div>'; - } - } else { - if ($PosFormat == 2) { - $Coverage = $subtable_offset + $this->read_ushort(); - $ValueFormat = $this->read_ushort(); - $ValueCount = $this->read_ushort(); - $Values = []; - for ($v = 0; $v < $ValueCount; $v++) { - $Values[] = $this->_getValueRecord($ValueFormat); - } - $this->seek($Coverage); - $glyphs = $this->_getCoverage(); - // Array of Hex Glyphs - for ($g = 0; $g < \count($glyphs); $g++) { - if ($level == 2 && \strpos($lcoverage, $glyphs[$g]) === \false) { - continue; - } - $Value = $Values[$g]; - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUni($glyphs[$g]) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed" style="font-feature-settings:\'' . $tag . '\' 1;"> ' . $this->formatEntity($glyphs[$g]) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= ' <span class="unicode">'; - if ($Value['XPlacement']) { - $html .= ' Xpl: ' . $Value['XPlacement'] . ';'; - } - if ($Value['YPlacement']) { - $html .= ' YPl: ' . $Value['YPlacement'] . ';'; - } - if ($Value['XAdvance']) { - $html .= ' Xadv: ' . $Value['XAdvance']; - } - $html .= '</span>'; - $html .= '</div>'; - } - } - } - } else { - if ($Lookup[$luli]['Type'] == 2) { - $html .= '<div class="lookuptype">LookupType 2: Pair adjustment e.g. Kerning [Format ' . $PosFormat . ']</div>'; - $Coverage = $subtable_offset + $this->read_ushort(); - $ValueFormat1 = $this->read_ushort(); - $ValueFormat2 = $this->read_ushort(); - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - $PairSetCount = $this->read_ushort(); - $PairSetOffset = []; - for ($p = 0; $p < $PairSetCount; $p++) { - $PairSetOffset[] = $subtable_offset + $this->read_ushort(); - } - $this->seek($Coverage); - $glyphs = $this->_getCoverage(); - // Array of Hex Glyphs - for ($p = 0; $p < $PairSetCount; $p++) { - if ($level == 2 && \strpos($lcoverage, $glyphs[$p]) === \false) { - continue; - } - $this->seek($PairSetOffset[$p]); - // First Glyph = $glyphs[$p] - // Takes too long e.g. Calibri font - just list kerning pairs with this: - $html .= '<div class="glyphs">'; - $html .= '<span class="unchanged"> ' . $this->formatEntity($glyphs[$p]) . ' </span>'; - //PairSet table - $PairValueCount = $this->read_ushort(); - for ($pv = 0; $pv < $PairValueCount; $pv++) { - //PairValueRecord - $gid = $this->read_ushort(); - $SecondGlyph = unicode_hex($this->glyphToChar[$gid][0]); - $Value1 = $this->_getValueRecord($ValueFormat1); - $Value2 = $this->_getValueRecord($ValueFormat2); - // If RTL pairs, GPOS declares a XPlacement e.g. -180 for an XAdvance of -180 to take - // account of direction. mPDF does not need the XPlacement adjustment - if ($dir == 'RTL' && $Value1['XPlacement']) { - $Value1['XPlacement'] -= $Value1['XAdvance']; - } - if ($ValueFormat2) { - // If RTL pairs, GPOS declares a XPlacement e.g. -180 for an XAdvance of -180 to take - // account of direction. mPDF does not need the XPlacement adjustment - if ($dir == 'RTL' && $Value2['XPlacement'] && $Value2['XAdvance']) { - $Value2['XPlacement'] -= $Value2['XAdvance']; - } - } - $html .= ' ' . $this->formatEntity($SecondGlyph) . ' '; - /* - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">'.$this->formatUni($glyphs[$p]).' </span> '; - if ($level==2 && $exB) { $html .= $exB; } - $html .= '<span class="unchanged"> '.$this->formatEntity($glyphs[$p]).$this->formatEntity($SecondGlyph).'</span>'; - if ($level==2 && $exL) { $html .= $exL; } - $html .= '  » »  '; - if ($level==2 && $exB) { $html .= $exB; } - $html .= '<span class="changed" style="font-feature-settings:\''.$tag.'\' 1;"> '.$this->formatEntity($glyphs[$p]).$this->formatEntity($SecondGlyph).'</span>'; - if ($level==2 && $exL) { $html .= $exL; } - $html .= ' <span class="unicode">'; - if ($Value1['XPlacement']) { $html .= ' Xpl[1]: '.$Value1['XPlacement'].';'; } - if ($Value1['YPlacement']) { $html .= ' YPl[1]: '.$Value1['YPlacement'].';'; } - if ($Value1['XAdvance']) { $html .= ' Xadv[1]: '.$Value1['XAdvance']; } - if ($Value2['XPlacement']) { $html .= ' Xpl[2]: '.$Value2['XPlacement'].';'; } - if ($Value2['YPlacement']) { $html .= ' YPl[2]: '.$Value2['YPlacement'].';'; } - if ($Value2['XAdvance']) { $html .= ' Xadv[2]: '.$Value2['XAdvance']; } - $html .= '</span>'; - $html .= '</div>'; - */ - } - $html .= '</div>'; - } - } else { - if ($PosFormat == 2) { - $ClassDef1 = $subtable_offset + $this->read_ushort(); - $ClassDef2 = $subtable_offset + $this->read_ushort(); - $Class1Count = $this->read_ushort(); - $Class2Count = $this->read_ushort(); - $sizeOfPair = 2 * $this->count_bits($ValueFormat1) + 2 * $this->count_bits($ValueFormat2); - $sizeOfValueRecords = $Class1Count * $Class2Count * $sizeOfPair; - // NB Class1Count includes Class 0 even though it is not defined by $ClassDef1 - // i.e. Class1Count = 5; Class1 will contain array(indices 1-4); - $Class1 = $this->_getClassDefinitionTable($ClassDef1); - $Class2 = $this->_getClassDefinitionTable($ClassDef2); - $this->seek($subtable_offset + 16); - for ($i = 0; $i < $Class1Count; $i++) { - for ($j = 0; $j < $Class2Count; $j++) { - $Value1 = $this->_getValueRecord($ValueFormat1); - $Value2 = $this->_getValueRecord($ValueFormat2); - // If RTL pairs, GPOS declares a XPlacement e.g. -180 for an XAdvance of -180 - // of direction. mPDF does not need the XPlacement adjustment - if ($dir == 'RTL' && $Value1['XPlacement'] && $Value1['XAdvance']) { - $Value1['XPlacement'] -= $Value1['XAdvance']; - } - if ($ValueFormat2) { - if ($dir == 'RTL' && $Value2['XPlacement'] && $Value2['XAdvance']) { - $Value2['XPlacement'] -= $Value2['XAdvance']; - } - } - for ($c1 = 0; $c1 < \count($Class1[$i]); $c1++) { - $FirstGlyph = $Class1[$i][$c1]; - if ($level == 2 && \strpos($lcoverage, $FirstGlyph) === \false) { - continue; - } - for ($c2 = 0; $c2 < \count($Class2[$j]); $c2++) { - $SecondGlyph = $Class2[$j][$c2]; - if (!$Value1['XPlacement'] && !$Value1['YPlacement'] && !$Value1['XAdvance'] && !$Value2['XPlacement'] && !$Value2['YPlacement'] && !$Value2['XAdvance']) { - continue; - } - $html .= '<div class="substitution">'; - $html .= '<span class="unicode">' . $this->formatUni($FirstGlyph) . ' </span> '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="unchanged"> ' . $this->formatEntity($FirstGlyph) . $this->formatEntity($SecondGlyph) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= '  » »  '; - if ($level == 2 && $exB) { - $html .= $exB; - } - $html .= '<span class="changed" style="font-feature-settings:\'' . $tag . '\' 1;"> ' . $this->formatEntity($FirstGlyph) . $this->formatEntity($SecondGlyph) . '</span>'; - if ($level == 2 && $exL) { - $html .= $exL; - } - $html .= ' <span class="unicode">'; - if ($Value1['XPlacement']) { - $html .= ' Xpl[1]: ' . $Value1['XPlacement'] . ';'; - } - if ($Value1['YPlacement']) { - $html .= ' YPl[1]: ' . $Value1['YPlacement'] . ';'; - } - if ($Value1['XAdvance']) { - $html .= ' Xadv[1]: ' . $Value1['XAdvance']; - } - if ($Value2['XPlacement']) { - $html .= ' Xpl[2]: ' . $Value2['XPlacement'] . ';'; - } - if ($Value2['YPlacement']) { - $html .= ' YPl[2]: ' . $Value2['YPlacement'] . ';'; - } - if ($Value2['XAdvance']) { - $html .= ' Xadv[2]: ' . $Value2['XAdvance']; - } - $html .= '</span>'; - $html .= '</div>'; - } - } - } - } - } - } - } else { - if ($Lookup[$luli]['Type'] == 3) { - $html .= '<div class="lookuptype">LookupType 3: Cursive attachment </div>'; - $Coverage = $subtable_offset + $this->read_ushort(); - $EntryExitCount = $this->read_ushort(); - $EntryAnchors = []; - $ExitAnchors = []; - for ($i = 0; $i < $EntryExitCount; $i++) { - $EntryAnchors[$i] = $this->read_ushort(); - $ExitAnchors[$i] = $this->read_ushort(); - } - $this->seek($Coverage); - $Glyphs = $this->_getCoverage(); - for ($i = 0; $i < $EntryExitCount; $i++) { - // Need default XAdvance for glyph - $pdfWidth = $this->mpdf->_getCharWidth($this->mpdf->fonts[$this->fontkey]['cw'], \hexdec($Glyphs[$i])); - $EntryAnchor = $EntryAnchors[$i]; - $ExitAnchor = $ExitAnchors[$i]; - $html .= '<div class="glyphs">'; - $html .= '<span class="unchanged">' . $this->formatEntity($Glyphs[$i]) . ' </span> '; - $html .= '<span class="unicode"> ' . $this->formatUni($Glyphs[$i]) . ' => '; - if ($EntryAnchor != 0) { - $EntryAnchor += $subtable_offset; - list($x, $y) = $this->_getAnchorTable($EntryAnchor); - if ($dir == 'RTL') { - if (\round($pdfWidth) == \round($x * 1000 / $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'])) { - $x = 0; - } else { - $x = $x - $pdfWidth * $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'] / 1000; - } - } - $html .= " Entry X: " . $x . " Y: " . $y . "; "; - } - if ($ExitAnchor != 0) { - $ExitAnchor += $subtable_offset; - list($x, $y) = $this->_getAnchorTable($ExitAnchor); - if ($dir == 'LTR') { - if (\round($pdfWidth) == \round($x * 1000 / $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'])) { - $x = 0; - } else { - $x = $x - $pdfWidth * $this->mpdf->fonts[$this->fontkey]['desc']['unitsPerEm'] / 1000; - } - } - $html .= " Exit X: " . $x . " Y: " . $y . "; "; - } - $html .= '</span></div>'; - } - } else { - if ($Lookup[$luli]['Type'] == 4) { - $html .= '<div class="lookuptype">LookupType 4: MarkToBase attachment </div>'; - $MarkCoverage = $subtable_offset + $this->read_ushort(); - $BaseCoverage = $subtable_offset + $this->read_ushort(); - $this->seek($MarkCoverage); - $MarkGlyphs = $this->_getCoverage(); - $this->seek($BaseCoverage); - $BaseGlyphs = $this->_getCoverage(); - $firstMark = ''; - $html .= '<div class="glyphs">Marks: '; - for ($i = 0; $i < \count($MarkGlyphs); $i++) { - if ($level == 2 && \strpos($lcoverage, $MarkGlyphs[$i]) === \false) { - continue; - } else { - if (!$firstMark) { - $firstMark = $MarkGlyphs[$i]; - } - } - $html .= ' ' . $this->formatEntity($MarkGlyphs[$i]) . ' '; - } - $html .= '</div>'; - if (!$firstMark) { - return; - } - $html .= '<div class="glyphs">Bases: '; - for ($j = 0; $j < \count($BaseGlyphs); $j++) { - $html .= ' ' . $this->formatEntity($BaseGlyphs[$j]) . ' '; - } - $html .= '</div>'; - // Example - $html .= '<div class="glyphs" style="font-feature-settings:\'' . $tag . '\' 1;">Example(s): '; - for ($j = 0; $j < \min(\count($BaseGlyphs), 20); $j++) { - $html .= ' ' . $this->formatEntity($BaseGlyphs[$j]) . $this->formatEntity($firstMark, \true) . '   '; - } - $html .= '</div>'; - } else { - if ($Lookup[$luli]['Type'] == 5) { - $html .= '<div class="lookuptype">LookupType 5: MarkToLigature attachment </div>'; - $MarkCoverage = $subtable_offset + $this->read_ushort(); - //$MarkCoverage is already set in $lcoverage 00065|00073 etc - $LigatureCoverage = $subtable_offset + $this->read_ushort(); - $ClassCount = $this->read_ushort(); - // Number of classes defined for marks = Number of mark glyphs in the MarkCoverage table - $MarkArray = $subtable_offset + $this->read_ushort(); - // Offset to MarkArray table - $LigatureArray = $subtable_offset + $this->read_ushort(); - // Offset to LigatureArray table - $this->seek($MarkCoverage); - $MarkGlyphs = $this->_getCoverage(); - $this->seek($LigatureCoverage); - $LigatureGlyphs = $this->_getCoverage(); - $firstMark = ''; - $html .= '<div class="glyphs">Marks: <span class="unchanged">'; - $MarkRecord = []; - for ($i = 0; $i < \count($MarkGlyphs); $i++) { - if ($level == 2 && \strpos($lcoverage, $MarkGlyphs[$i]) === \false) { - continue; - } else { - if (!$firstMark) { - $firstMark = $MarkGlyphs[$i]; - } - } - // Get the relevant MarkRecord - $MarkRecord[$i] = $this->_getMarkRecord($MarkArray, $i); - //Mark Class is = $MarkRecord[$i]['Class'] - $html .= ' ' . $this->formatEntity($MarkGlyphs[$i]) . ' '; - } - $html .= '</span></div>'; - if (!$firstMark) { - return; - } - $this->seek($LigatureArray); - $LigatureCount = $this->read_ushort(); - $LigatureAttach = []; - $html .= '<div class="glyphs">Ligatures: <span class="unchanged">'; - for ($j = 0; $j < \count($LigatureGlyphs); $j++) { - // Get the relevant LigatureRecord - $LigatureAttach[$j] = $LigatureArray + $this->read_ushort(); - $html .= ' ' . $this->formatEntity($LigatureGlyphs[$j]) . ' '; - } - $html .= '</span></div>'; - /* - for ($i=0;$i<count($MarkGlyphs);$i++) { - $html .= '<div class="glyphs">'; - $html .= '<span class="unchanged">'.$this->formatEntity($MarkGlyphs[$i]).'</span>'; - - for ($j=0;$j<count($LigatureGlyphs);$j++) { - $this->seek($LigatureAttach[$j]); - $ComponentCount = $this->read_ushort(); - $html .= '<span class="unchanged">'.$this->formatEntity($LigatureGlyphs[$j]).'</span>'; - $offsets = array(); - for ($comp=0;$comp<$ComponentCount;$comp++) { - // ComponentRecords - for ($class=0;$class<$ClassCount;$class++) { - $offset = $this->read_ushort(); - if ($offset!= 0 && $class == $MarkRecord[$i]['Class']) { - - $html .= ' ['.$comp.'] '; - - } - } - } - } - $html .= '</span></div>'; - } - */ - } else { - if ($Lookup[$luli]['Type'] == 6) { - $html .= '<div class="lookuptype">LookupType 6: MarkToMark attachment </div>'; - $Mark1Coverage = $subtable_offset + $this->read_ushort(); - // Combining Mark - //$Mark1Coverage is already set in $LuCoverage 0065|0073 etc - $Mark2Coverage = $subtable_offset + $this->read_ushort(); - // Base Mark - $ClassCount = $this->read_ushort(); - // Number of classes defined for marks = No. of Combining mark1 glyphs in the MarkCoverage table - $this->seek($Mark1Coverage); - $Mark1Glyphs = $this->_getCoverage(); - $this->seek($Mark2Coverage); - $Mark2Glyphs = $this->_getCoverage(); - $firstMark = ''; - $html .= '<div class="glyphs">Marks: <span class="unchanged">'; - for ($i = 0; $i < \count($Mark1Glyphs); $i++) { - if ($level == 2 && \strpos($lcoverage, $Mark1Glyphs[$i]) === \false) { - continue; - } else { - if (!$firstMark) { - $firstMark = $Mark1Glyphs[$i]; - } - } - $html .= ' ' . $this->formatEntity($Mark1Glyphs[$i]) . ' '; - } - $html .= '</span></div>'; - if ($firstMark) { - $html .= '<div class="glyphs">Bases: <span class="unchanged">'; - for ($j = 0; $j < \count($Mark2Glyphs); $j++) { - $html .= ' ' . $this->formatEntity($Mark2Glyphs[$j]) . ' '; - } - $html .= '</span></div>'; - // Example - $html .= '<div class="glyphs" style="font-feature-settings:\'' . $tag . '\' 1;">Example(s): <span class="changed">'; - for ($j = 0; $j < \min(\count($Mark2Glyphs), 20); $j++) { - $html .= ' ' . $this->formatEntity($Mark2Glyphs[$j]) . $this->formatEntity($firstMark, \true) . '   '; - } - $html .= '</span></div>'; - } - } else { - if ($Lookup[$luli]['Type'] == 7) { - $html .= '<div class="lookuptype">LookupType 7: Context positioning [Format ' . $PosFormat . ']</div>'; - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not YET TESTED."); - } else { - if ($PosFormat == 2) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not YET TESTED."); - } else { - if ($PosFormat == 3) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not YET TESTED."); - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Type . ", Format " . $PosFormat . " not supported."); - } - } - } - } else { - if ($Lookup[$luli]['Type'] == 8) { - $html .= '<div class="lookuptype">LookupType 8: Chained Context positioning [Format ' . $PosFormat . ']</div>'; - //=========== - // Format 1: - //=========== - if ($PosFormat == 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); - } else { - if ($PosFormat == 2) { - $html .= '<div>GPOS Lookup Type 8: Format 2 not yet supported in OTL dump</div>'; - continue; - /* NB When developing - cf. GSUB 6.2 */ - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Type . " Format " . $PosFormat . " not TESTED YET."); - } else { - if ($PosFormat == 3) { - $BacktrackGlyphCount = $this->read_ushort(); - $CoverageBacktrackOffset = []; - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $CoverageBacktrackOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $InputGlyphCount = $this->read_ushort(); - $CoverageInputOffset = []; - for ($b = 0; $b < $InputGlyphCount; $b++) { - $CoverageInputOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $LookaheadGlyphCount = $this->read_ushort(); - $CoverageLookaheadOffset = []; - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $CoverageLookaheadOffset[] = $subtable_offset + $this->read_ushort(); - // in glyph sequence order - } - $PosCount = $this->read_ushort(); - $PosLookupRecord = []; - for ($p = 0; $p < $PosCount; $p++) { - // PosLookupRecord - $PosLookupRecord[$p]['SequenceIndex'] = $this->read_ushort(); - $PosLookupRecord[$p]['LookupListIndex'] = $this->read_ushort(); - } - $backtrackGlyphs = []; - for ($b = 0; $b < $BacktrackGlyphCount; $b++) { - $this->seek($CoverageBacktrackOffset[$b]); - $backtrackGlyphs[$b] = \implode('|', $this->_getCoverage()); - } - $inputGlyphs = []; - for ($b = 0; $b < $InputGlyphCount; $b++) { - $this->seek($CoverageInputOffset[$b]); - $inputGlyphs[$b] = \implode('|', $this->_getCoverage()); - } - $lookaheadGlyphs = []; - for ($b = 0; $b < $LookaheadGlyphCount; $b++) { - $this->seek($CoverageLookaheadOffset[$b]); - $lookaheadGlyphs[$b] = \implode('|', $this->_getCoverage()); - } - $exampleB = []; - $exampleI = []; - $exampleL = []; - $html .= '<div class="context">CONTEXT: '; - for ($ff = \count($backtrackGlyphs) - 1; $ff >= 0; $ff--) { - $html .= '<div>Backtrack #' . $ff . ': <span class="unicode">' . $this->formatUniStr($backtrackGlyphs[$ff]) . '</span></div>'; - $exampleB[] = $this->formatEntityFirst($backtrackGlyphs[$ff]); - } - for ($ff = 0; $ff < \count($inputGlyphs); $ff++) { - $html .= '<div>Input #' . $ff . ': <span class="unchanged"> ' . $this->formatEntityStr($inputGlyphs[$ff]) . ' </span></div>'; - $exampleI[] = $this->formatEntityFirst($inputGlyphs[$ff]); - } - for ($ff = 0; $ff < \count($lookaheadGlyphs); $ff++) { - $html .= '<div>Lookahead #' . $ff . ': <span class="unicode">' . $this->formatUniStr($lookaheadGlyphs[$ff]) . '</span></div>'; - $exampleL[] = $this->formatEntityFirst($lookaheadGlyphs[$ff]); - } - $html .= '</div>'; - for ($p = 0; $p < $PosCount; $p++) { - $lup = $PosLookupRecord[$p]['LookupListIndex']; - $seqIndex = $PosLookupRecord[$p]['SequenceIndex']; - // GENERATE exampleB[n] exampleI[<seqIndex] .... exampleI[>seqIndex] exampleL[n] - $exB = ''; - $exL = ''; - if (\count($exampleB)) { - $exB .= '<span class="backtrack">' . \implode('‍', $exampleB) . '</span>'; - } - if ($seqIndex > 0) { - $exB .= '<span class="inputother">'; - for ($ip = 0; $ip < $seqIndex; $ip++) { - $exB .= $exampleI[$ip] . '‍'; - } - $exB .= '</span>'; - } - if (\count($inputGlyphs) > $seqIndex + 1) { - $exL .= '<span class="inputother">'; - for ($ip = $seqIndex + 1; $ip < \count($inputGlyphs); $ip++) { - $exL .= '‍' . $exampleI[$ip]; - } - $exL .= '</span>'; - } - if (\count($exampleL)) { - $exL .= '<span class="lookahead">' . \implode('‍', $exampleL) . '</span>'; - } - $html .= '<div class="sequenceIndex">Substitution Position: ' . $seqIndex . '</div>'; - $lul2 = [$lup => $tag]; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // Pass $inputGlyphs[$seqIndex] e.g. 00636|00645|00656 - // to level 2 and only apply if first Replace glyph is in this list - $html .= $this->_getGPOSarray($Lookup, $lul2, $scripttag, 2, $inputGlyphs[$seqIndex], $exB, $exL); - } - } - } - } - } - } - } - } - } - } - } - } - } - $html .= '</div>'; - } - if ($level == 1) { - $this->mpdf->WriteHTML($html); - } else { - return $html; - } - //print_r($Lookup); exit; - } - //===================================================================================== - //===================================================================================== - // GPOS FUNCTIONS - //===================================================================================== - function count_bits($n) - { - for ($c = 0; $n; $c++) { - $n &= $n - 1; - // clear the least significant bit set - } - return $c; - } - function _getValueRecord($ValueFormat) - { - // Common ValueRecord for GPOS - // Only returns 3 possible: $vra['XPlacement'] $vra['YPlacement'] $vra['XAdvance'] - $vra = []; - // Horizontal adjustment for placement-in design units - if (($ValueFormat & 0x1) == 0x1) { - $vra['XPlacement'] = $this->read_short(); - } - // Vertical adjustment for placement-in design units - if (($ValueFormat & 0x2) == 0x2) { - $vra['YPlacement'] = $this->read_short(); - } - // Horizontal adjustment for advance-in design units (only used for horizontal writing) - if (($ValueFormat & 0x4) == 0x4) { - $vra['XAdvance'] = $this->read_short(); - } - // Vertical adjustment for advance-in design units (only used for vertical writing) - if (($ValueFormat & 0x8) == 0x8) { - $this->read_short(); - } - // Offset to Device table for horizontal placement-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x10) == 0x10) { - $this->read_ushort(); - } - // Offset to Device table for vertical placement-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x20) == 0x20) { - $this->read_ushort(); - } - // Offset to Device table for horizontal advance-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x40) == 0x40) { - $this->read_ushort(); - } - // Offset to Device table for vertical advance-measured from beginning of PosTable (may be NULL) - if (($ValueFormat & 0x80) == 0x80) { - $this->read_ushort(); - } - return $vra; - } - function _getAnchorTable($offset = 0) - { - if ($offset) { - $this->seek($offset); - } - $AnchorFormat = $this->read_ushort(); - $XCoordinate = $this->read_short(); - $YCoordinate = $this->read_short(); - // Format 2 specifies additional link to contour point; Format 3 additional Device table - return [$XCoordinate, $YCoordinate]; - } - function _getMarkRecord($offset, $MarkPos) - { - $this->seek($offset); - $MarkCount = $this->read_ushort(); - $this->skip($MarkPos * 4); - $Class = $this->read_ushort(); - $MarkAnchor = $offset + $this->read_ushort(); - // = Offset to anchor table - list($x, $y) = $this->_getAnchorTable($MarkAnchor); - $MarkRecord = ['Class' => $Class, 'AnchorX' => $x, 'AnchorY' => $y]; - return $MarkRecord; - } - ////////////////////////////////////////////////////////////////////////////////// - // Recursively get composite glyph data - function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) - { - $depth++; - $maxdepth = \max($maxdepth, $depth); - if (\count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) { - foreach ($this->glyphdata[$originalGlyphIdx]['compGlyphs'] as $glyphIdx) { - $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours); - } - } else { - if ($this->glyphdata[$originalGlyphIdx]['nContours'] > 0 && $depth > 0) { - // simple - $contours += $this->glyphdata[$originalGlyphIdx]['nContours']; - $points += $this->glyphdata[$originalGlyphIdx]['nPoints']; - } - } - $depth--; - } - ////////////////////////////////////////////////////////////////////////////////// - // Recursively get composite glyphs - function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) - { - $glyphPos = $this->glyphPos[$originalGlyphIdx]; - $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; - if (!$glyphLen) { - return; - } - $this->seek($start + $glyphPos); - $numberOfContours = $this->read_short(); - if ($numberOfContours < 0) { - $this->skip(8); - $flags = GlyphOperator::MORE; - while ($flags & GlyphOperator::MORE) { - $flags = $this->read_ushort(); - } - $glyphIdx = $this->read_ushort(); - if (!isset($glyphSet[$glyphIdx])) { - $glyphSet[$glyphIdx] = \count($subsetglyphs); - // old glyphID to new glyphID - $subsetglyphs[$glyphIdx] = \true; - } - $savepos = \ftell($this->fh); - $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs); - $this->seek($savepos); - if ($flags & GlyphOperator::WORDS) { - $this->skip(4); - } else { - $this->skip(2); - } - if ($flags & GlyphOperator::SCALE) { - $this->skip(2); - } else { - if ($flags & GlyphOperator::XYSCALE) { - $this->skip(4); - } else { - if ($flags & GlyphOperator::TWOBYTWO) { - $this->skip(8); - } - } - } - } - } - ////////////////////////////////////////////////////////////////////////////////// - function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) - { - $start = $this->seek_table("hmtx"); - $aw = 0; - $this->charWidths = \str_pad('', 256 * 256 * 2, "\x00"); - if ($this->maxUniChar > 65536) { - $this->charWidths .= \str_pad('', 256 * 256 * 2, "\x00"); - } - // Plane 1 SMP - if ($this->maxUniChar > 131072) { - $this->charWidths .= \str_pad('', 256 * 256 * 2, "\x00"); - } - // Plane 2 SMP - $nCharWidths = 0; - if ($numberOfHMetrics * 4 < $this->maxStrLenRead) { - $data = $this->get_chunk($start, $numberOfHMetrics * 4); - $arr = \unpack("n*", $data); - } else { - $this->seek($start); - } - for ($glyph = 0; $glyph < $numberOfHMetrics; $glyph++) { - if ($numberOfHMetrics * 4 < $this->maxStrLenRead) { - $aw = $arr[$glyph * 2 + 1]; - } else { - $aw = $this->read_ushort(); - $lsb = $this->read_ushort(); - } - if (isset($glyphToChar[$glyph]) || $glyph == 0) { - if ($aw >= 1 << 15) { - $aw = 0; - } - // 1.03 Some (arabic) fonts have -ve values for width - // although should be unsigned value - comes out as e.g. 65108 (intended -50) - if ($glyph == 0) { - $this->defaultWidth = $scale * $aw; - continue; - } - foreach ($glyphToChar[$glyph] as $char) { - //$this->charWidths[$char] = intval(round($scale*$aw)); - if ($char != 0 && $char != 65535) { - $w = \intval(\round($scale * $aw)); - if ($w == 0) { - $w = 65535; - } - if ($char < 196608) { - $this->charWidths[$char * 2] = \chr($w >> 8); - $this->charWidths[$char * 2 + 1] = \chr($w & 0xff); - $nCharWidths++; - } - } - } - } - } - $data = $this->get_chunk($start + $numberOfHMetrics * 4, $numGlyphs * 2); - $arr = \unpack("n*", $data); - $diff = $numGlyphs - $numberOfHMetrics; - $w = \intval(\round($scale * $aw)); - if ($w == 0) { - $w = 65535; - } - for ($pos = 0; $pos < $diff; $pos++) { - $glyph = $pos + $numberOfHMetrics; - if (isset($glyphToChar[$glyph])) { - foreach ($glyphToChar[$glyph] as $char) { - if ($char != 0 && $char != 65535) { - if ($char < 196608) { - $this->charWidths[$char * 2] = \chr($w >> 8); - $this->charWidths[$char * 2 + 1] = \chr($w & 0xff); - $nCharWidths++; - } - } - } - } - } - // NB 65535 is a set width of 0 - // First bytes define number of chars in font - $this->charWidths[0] = \chr($nCharWidths >> 8); - $this->charWidths[1] = \chr($nCharWidths & 0xff); - } - function getHMetric($numberOfHMetrics, $gid) - { - $start = $this->seek_table("hmtx"); - if ($gid < $numberOfHMetrics) { - $this->seek($start + $gid * 4); - $hm = \fread($this->fh, 4); - } else { - $this->seek($start + ($numberOfHMetrics - 1) * 4); - $hm = \fread($this->fh, 2); - $this->seek($start + $numberOfHMetrics * 2 + $gid * 2); - $hm .= \fread($this->fh, 2); - } - return $hm; - } - function getLOCA($indexToLocFormat, $numGlyphs) - { - $start = $this->seek_table('loca'); - $this->glyphPos = []; - if ($indexToLocFormat == 0) { - $data = $this->get_chunk($start, $numGlyphs * 2 + 2); - $arr = \unpack("n*", $data); - for ($n = 0; $n <= $numGlyphs; $n++) { - $this->glyphPos[] = $arr[$n + 1] * 2; - } - } else { - if ($indexToLocFormat == 1) { - $data = $this->get_chunk($start, $numGlyphs * 4 + 4); - $arr = \unpack("N*", $data); - for ($n = 0; $n <= $numGlyphs; $n++) { - $this->glyphPos[] = $arr[$n + 1]; - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Unknown location table format ' . $indexToLocFormat); - } - } - } - // CMAP Format 4 - function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph) - { - $this->maxUniChar = 0; - $this->seek($unicode_cmap_offset + 2); - $length = $this->read_ushort(); - $limit = $unicode_cmap_offset + $length; - $this->skip(2); - $segCount = $this->read_ushort() / 2; - $this->skip(6); - $endCount = []; - for ($i = 0; $i < $segCount; $i++) { - $endCount[] = $this->read_ushort(); - } - $this->skip(2); - $startCount = []; - for ($i = 0; $i < $segCount; $i++) { - $startCount[] = $this->read_ushort(); - } - $idDelta = []; - for ($i = 0; $i < $segCount; $i++) { - $idDelta[] = $this->read_short(); - } - // ???? was unsigned short - $idRangeOffset_start = $this->_pos; - $idRangeOffset = []; - for ($i = 0; $i < $segCount; $i++) { - $idRangeOffset[] = $this->read_ushort(); - } - for ($n = 0; $n < $segCount; $n++) { - $endpoint = $endCount[$n] + 1; - for ($unichar = $startCount[$n]; $unichar < $endpoint; $unichar++) { - if ($idRangeOffset[$n] == 0) { - $glyph = $unichar + $idDelta[$n] & 0xffff; - } else { - $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; - $offset = $idRangeOffset_start + 2 * $n + $offset; - if ($offset >= $limit) { - $glyph = 0; - } else { - $glyph = $this->get_ushort($offset); - if ($glyph != 0) { - $glyph = $glyph + $idDelta[$n] & 0xffff; - } - } - } - $charToGlyph[$unichar] = $glyph; - if ($unichar < 196608) { - $this->maxUniChar = \max($unichar, $this->maxUniChar); - } - $glyphToChar[$glyph][] = $unichar; - } - } - } - function formatUni($char) - { - $x = \preg_replace('/^[0]*/', '', $char); - $x = \str_pad($x, 4, '0', \STR_PAD_LEFT); - $d = \hexdec($x); - if ($d > 57343 && $d < 63744 || $d > 122879 && $d < 126977) { - $id = 'M'; - } else { - $id = 'U'; - } - return $id . '+' . $x; - } - function formatEntity($char, $allowjoining = \false) - { - $char = \preg_replace('/^[0]/', '', $char); - $x = '&#x' . $char . ';'; - if (\strpos($this->GlyphClassMarks, $char) !== \false) { - if (!$allowjoining) { - $x = '◌' . $x; - } - } - return $x; - } - function formatUniArr($arr) - { - $s = []; - foreach ($arr as $c) { - $x = \preg_replace('/^[0]*/', '', $c); - $d = \hexdec($x); - if ($d > 57343 && $d < 63744 || $d > 122879 && $d < 126977) { - $id = 'M'; - } else { - $id = 'U'; - } - $s[] = $id . '+' . \str_pad($x, 4, '0', \STR_PAD_LEFT); - } - return \implode(', ', $s); - } - function formatEntityArr($arr) - { - $s = []; - foreach ($arr as $c) { - $c = \preg_replace('/^[0]/', '', $c); - $x = '&#x' . $c . ';'; - if (\strpos($this->GlyphClassMarks, $c) !== \false) { - $x = '◌' . $x; - } - $s[] = $x; - } - return \implode(' ', $s); - // ZWNJ? ‍ - } - function formatClassArr($arr) - { - $s = []; - foreach ($arr as $c) { - $x = \preg_replace('/^[0]*/', '', $c); - $d = \hexdec($x); - if ($d > 57343 && $d < 63744 || $d > 122879 && $d < 126977) { - $id = 'M'; - } else { - $id = 'U'; - } - $s[] = $id . '+' . \str_pad($x, 4, '0', \STR_PAD_LEFT); - } - return \implode(', ', $s); - } - function formatUniStr($str) - { - $s = []; - $arr = \explode('|', $str); - foreach ($arr as $c) { - $x = \preg_replace('/^[0]*/', '', $c); - $d = \hexdec($x); - if ($d > 57343 && $d < 63744 || $d > 122879 && $d < 126977) { - $id = 'M'; - } else { - $id = 'U'; - } - $s[] = $id . '+' . \str_pad($x, 4, '0', \STR_PAD_LEFT); - } - return \implode(', ', $s); - } - function formatEntityStr($str) - { - $s = []; - $arr = \explode('|', $str); - foreach ($arr as $c) { - $c = \preg_replace('/^[0]/', '', $c); - $x = '&#x' . $c . ';'; - if (\strpos($this->GlyphClassMarks, $c) !== \false) { - $x = '◌' . $x; - } - $s[] = $x; - } - return \implode(' ', $s); - // ZWNJ? ‍ - } - function formatEntityFirst($str) - { - $arr = \explode('|', $str); - $char = \preg_replace('/^[0]/', '', $arr[0]); - $x = '&#x' . $char . ';'; - if (\strpos($this->GlyphClassMarks, $char) !== \false) { - $x = '◌' . $x; - } - return $x; - } -} diff --git a/dependencies/mpdf/mpdf/src/Output/Destination.php b/dependencies/mpdf/mpdf/src/Output/Destination.php deleted file mode 100644 index bdfd515..0000000 --- a/dependencies/mpdf/mpdf/src/Output/Destination.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Output; - -class Destination -{ - const FILE = 'F'; - const DOWNLOAD = 'D'; - const STRING_RETURN = 'S'; - const INLINE = 'I'; -} diff --git a/dependencies/mpdf/mpdf/src/PageBox.php b/dependencies/mpdf/mpdf/src/PageBox.php deleted file mode 100644 index 6028af4..0000000 --- a/dependencies/mpdf/mpdf/src/PageBox.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class PageBox implements \ArrayAccess -{ - private $container = []; - public function __construct() - { - $this->container = ['current' => null, 'outer_width_LR' => null, 'outer_width_TB' => null, 'using' => null]; - } - #[\ReturnTypeWillChange] - public function offsetSet($offset, $value) - { - if (!$this->offsetExists($offset)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid key to set for PageBox'); - } - $this->container[$offset] = $value; - } - #[\ReturnTypeWillChange] - public function offsetExists($offset) - { - return \array_key_exists($offset, $this->container); - } - #[\ReturnTypeWillChange] - public function offsetUnset($offset) - { - if (!$this->offsetExists($offset)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid key to set for PageBox'); - } - $this->container[$offset] = null; - } - #[\ReturnTypeWillChange] - public function offsetGet($offset) - { - if (!$this->offsetExists($offset)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Invalid key to set for PageBox'); - } - return $this->container[$offset]; - } -} diff --git a/dependencies/mpdf/mpdf/src/PageFormat.php b/dependencies/mpdf/mpdf/src/PageFormat.php deleted file mode 100644 index 2d816f8..0000000 --- a/dependencies/mpdf/mpdf/src/PageFormat.php +++ /dev/null @@ -1,83 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class PageFormat -{ - /** - * This method returns an array of width and height of given named format. - * - * Returned values are milimeters multiplied by scale factor of 72 / 25.4 - * - * @param string $name - * @return float[] Width and height of given format - */ - public static function getSizeFromName($name) - { - $format = \strtoupper($name); - $formats = [ - '4A0' => [4767.87, 6740.79], - '2A0' => [3370.39, 4767.87], - 'A0' => [2383.94, 3370.39], - 'A1' => [1683.78, 2383.94], - 'A2' => [1190.55, 1683.78], - 'A3' => [841.89, 1190.55], - 'A4' => [595.28, 841.89], - 'A5' => [419.53, 595.28], - 'A6' => [297.64, 419.53], - 'A7' => [209.76, 297.64], - 'A8' => [147.4, 209.76], - 'A9' => [104.88, 147.4], - 'A10' => [73.7, 104.88], - 'B0' => [2834.65, 4008.19], - 'B1' => [2004.09, 2834.65], - 'B2' => [1417.32, 2004.09], - 'B3' => [1000.63, 1417.32], - 'B4' => [708.66, 1000.63], - 'B5' => [498.9, 708.66], - 'B6' => [354.33, 498.9], - 'B7' => [249.45, 354.33], - 'B8' => [175.75, 249.45], - 'B9' => [124.72, 175.75], - 'B10' => [87.87, 124.72], - 'C0' => [2599.37, 3676.54], - 'C1' => [1836.85, 2599.37], - 'C2' => [1298.27, 1836.85], - 'C3' => [918.4299999999999, 1298.27], - 'C4' => [649.13, 918.4299999999999], - 'C5' => [459.21, 649.13], - 'C6' => [323.15, 459.21], - 'C7' => [229.61, 323.15], - 'C8' => [161.57, 229.61], - 'C9' => [113.39, 161.57], - 'C10' => [79.37, 113.39], - 'RA0' => [2437.8, 3458.27], - 'RA1' => [1729.13, 2437.8], - 'RA2' => [1218.9, 1729.13], - 'RA3' => [864.5700000000001, 1218.9], - 'RA4' => [609.45, 864.5700000000001], - 'SRA0' => [2551.18, 3628.35], - 'SRA1' => [1814.17, 2551.18], - 'SRA2' => [1275.59, 1814.17], - 'SRA3' => [907.09, 1275.59], - 'SRA4' => [637.8, 907.09], - 'LETTER' => [612.0, 792.0], - 'LEGAL' => [612.0, 1008.0], - 'LEDGER' => [1224.0, 792.0], - 'TABLOID' => [792.0, 1224.0], - 'EXECUTIVE' => [521.86, 756.0], - 'FOLIO' => [612.0, 936.0], - 'B' => [362.83, 561.26], - // 'B' format paperback size 128x198mm - 'A' => [314.65, 504.57], - // 'A' format paperback size 111x178mm - 'DEMY' => [382.68, 612.28], - // 'Demy' format paperback size 135x216mm - 'ROYAL' => [433.7, 663.3], - ]; - if (!isset($formats[$format])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Unknown page format %s', $format)); - } - return $formats[$format]; - } -} diff --git a/dependencies/mpdf/mpdf/src/Pdf/Protection.php b/dependencies/mpdf/mpdf/src/Pdf/Protection.php deleted file mode 100644 index 390fe53..0000000 --- a/dependencies/mpdf/mpdf/src/Pdf/Protection.php +++ /dev/null @@ -1,309 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Pdf; - -use WP_Ultimo\Dependencies\Mpdf\Pdf\Protection\UniqidGenerator; -class Protection -{ - /** - * @var string - */ - private $lastRc4Key; - /** - * @var string - */ - private $lastRc4KeyC; - /** - * @var bool - */ - private $useRC128Encryption; - /** - * @var string - */ - private $encryptionKey; - /** - * @var string - */ - private $padding; - /** - * @var string - */ - private $uniqid; - /** - * @var string - */ - private $oValue; - /** - * @var string - */ - private $uValue; - /** - * @var string - */ - private $pValue; - /** - * @var int[] Array of permission => byte representation - */ - private $options; - /** - * @var \Mpdf\Pdf\Protection\UniqidGenerator - */ - private $uniqidGenerator; - public function __construct(UniqidGenerator $uniqidGenerator) - { - if (!\function_exists('random_int') || !\function_exists('random_bytes')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Unable to set PDF file protection, CSPRNG Functions are not available. ' . 'Use paragonie/random_compat polyfill or upgrade to PHP 7.'); - } - $this->uniqidGenerator = $uniqidGenerator; - $this->lastRc4Key = ''; - $this->padding = "(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08" . "..\x00\xb6\xd0h>\x80/\f\xa9\xfedSiz"; - $this->useRC128Encryption = \false; - $this->options = [ - 'print' => 4, - // bit 3 - 'modify' => 8, - // bit 4 - 'copy' => 16, - // bit 5 - 'annot-forms' => 32, - // bit 6 - 'fill-forms' => 256, - // bit 9 - 'extract' => 512, - // bit 10 - 'assemble' => 1024, - // bit 11 - 'print-highres' => 2048, - ]; - } - /** - * @param array $permissions - * @param string $user_pass - * @param string $owner_pass - * @param int $length - * - * @return bool - */ - public function setProtection($permissions = [], $user_pass = '', $owner_pass = null, $length = 40) - { - if (\is_string($permissions) && \strlen($permissions) > 0) { - $permissions = [$permissions]; - } elseif (!\is_array($permissions)) { - return \false; - } - $protection = $this->getProtectionBitsFromOptions($permissions); - if ($length === 128) { - $this->useRC128Encryption = \true; - } elseif ($length !== 40) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDF protection only allows lenghts of 40 or 128'); - } - if ($owner_pass === null) { - $owner_pass = \bin2hex(\random_bytes(23)); - } - $this->generateEncryptionKey($user_pass, $owner_pass, $protection); - return \true; - } - /** - * Compute key depending on object number where the encrypted data is stored - * - * @param int $n - * - * @return string - */ - public function objectKey($n) - { - if ($this->useRC128Encryption) { - $len = 16; - } else { - $len = 10; - } - return \substr($this->md5toBinary($this->encryptionKey . \pack('VXxx', $n)), 0, $len); - } - /** - * RC4 is the standard encryption algorithm used in PDF format - * - * @param string $key - * @param string $text - * - * @return string - */ - public function rc4($key, $text) - { - if ($this->lastRc4Key != $key) { - $k = \str_repeat($key, \round(256 / \strlen($key)) + 1); - $rc4 = \range(0, 255); - $j = 0; - for ($i = 0; $i < 256; $i++) { - $t = $rc4[$i]; - $j = ($j + $t + \ord($k[$i])) % 256; - $rc4[$i] = $rc4[$j]; - $rc4[$j] = $t; - } - $this->lastRc4Key = $key; - $this->lastRc4KeyC = $rc4; - } else { - $rc4 = $this->lastRc4KeyC; - } - $len = \strlen($text); - $a = 0; - $b = 0; - $out = ''; - for ($i = 0; $i < $len; $i++) { - $a = ($a + 1) % 256; - $t = $rc4[$a]; - $b = ($b + $t) % 256; - $rc4[$a] = $rc4[$b]; - $rc4[$b] = $t; - $k = $rc4[($rc4[$a] + $rc4[$b]) % 256]; - $out .= \chr(\ord($text[$i]) ^ $k); - } - return $out; - } - /** - * @return mixed - */ - public function getUseRC128Encryption() - { - return $this->useRC128Encryption; - } - /** - * @return mixed - */ - public function getUniqid() - { - return $this->uniqid; - } - /** - * @return mixed - */ - public function getOValue() - { - return $this->oValue; - } - /** - * @return mixed - */ - public function getUValue() - { - return $this->uValue; - } - /** - * @return mixed - */ - public function getPValue() - { - return $this->pValue; - } - private function getProtectionBitsFromOptions($permissions) - { - // bit 31 = 1073741824 - // bit 32 = 2147483648 - // bits 13-31 = 2147479552 - // bits 13-32 = 4294963200 + 192 = 4294963392 - $protection = 4294963392; - // bits 7, 8, 13-32 - foreach ($permissions as $permission) { - if (!isset($this->options[$permission])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Invalid permission type "%s"', $permission)); - } - if ($this->options[$permission] > 32) { - $this->useRC128Encryption = \true; - } - if (isset($this->options[$permission])) { - $protection += $this->options[$permission]; - } - } - return $protection; - } - private function oValue($user_pass, $owner_pass) - { - $tmp = $this->md5toBinary($owner_pass); - if ($this->useRC128Encryption) { - for ($i = 0; $i < 50; ++$i) { - $tmp = $this->md5toBinary($tmp); - } - } - if ($this->useRC128Encryption) { - $keybytelen = 128 / 8; - } else { - $keybytelen = 40 / 8; - } - $owner_rc4_key = \substr($tmp, 0, $keybytelen); - $enc = $this->rc4($owner_rc4_key, $user_pass); - if ($this->useRC128Encryption) { - $len = \strlen($owner_rc4_key); - for ($i = 1; $i <= 19; ++$i) { - $key = ''; - for ($j = 0; $j < $len; ++$j) { - $key .= \chr(\ord($owner_rc4_key[$j]) ^ $i); - } - $enc = $this->rc4($key, $enc); - } - } - return $enc; - } - private function uValue() - { - if ($this->useRC128Encryption) { - $tmp = $this->md5toBinary($this->padding . $this->hexToString($this->uniqid)); - $enc = $this->rc4($this->encryptionKey, $tmp); - $len = \strlen($tmp); - for ($i = 1; $i <= 19; ++$i) { - $key = ''; - for ($j = 0; $j < $len; ++$j) { - $key .= \chr(\ord($this->encryptionKey[$j]) ^ $i); - } - $enc = $this->rc4($key, $enc); - } - $enc .= \str_repeat("\x00", 16); - return \substr($enc, 0, 32); - } else { - return $this->rc4($this->encryptionKey, $this->padding); - } - } - private function generateEncryptionKey($user_pass, $owner_pass, $protection) - { - // Pad passwords - $user_pass = \substr($user_pass . $this->padding, 0, 32); - $owner_pass = \substr($owner_pass . $this->padding, 0, 32); - $this->oValue = $this->oValue($user_pass, $owner_pass); - $this->uniqid = $this->uniqidGenerator->generate(); - // Compute encyption key - if ($this->useRC128Encryption) { - $keybytelen = 128 / 8; - } else { - $keybytelen = 40 / 8; - } - $prot = \sprintf('%032b', $protection); - $perms = \chr(\bindec(\substr($prot, 24, 8))); - $perms .= \chr(\bindec(\substr($prot, 16, 8))); - $perms .= \chr(\bindec(\substr($prot, 8, 8))); - $perms .= \chr(\bindec(\substr($prot, 0, 8))); - $tmp = $this->md5toBinary($user_pass . $this->oValue . $perms . $this->hexToString($this->uniqid)); - if ($this->useRC128Encryption) { - for ($i = 0; $i < 50; ++$i) { - $tmp = $this->md5toBinary(\substr($tmp, 0, $keybytelen)); - } - } - $this->encryptionKey = \substr($tmp, 0, $keybytelen); - $this->uValue = $this->uValue(); - $this->pValue = $protection; - } - private function md5toBinary($string) - { - return \pack('H*', \md5($string)); - } - private function hexToString($hs) - { - $s = ''; - $len = \strlen($hs); - if ($len % 2 != 0) { - $hs .= '0'; - ++$len; - } - for ($i = 0; $i < $len; $i += 2) { - $s .= \chr(\hexdec($hs[$i] . $hs[$i + 1])); - } - return $s; - } -} diff --git a/dependencies/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php b/dependencies/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php deleted file mode 100644 index 073ced8..0000000 --- a/dependencies/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Pdf\Protection; - -class UniqidGenerator -{ - public function __construct() - { - if (!\function_exists('random_int') || !\function_exists('random_bytes')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Unable to set PDF file protection, CSPRNG Functions are not available. ' . 'Use paragonie/random_compat polyfill or upgrade to PHP 7.'); - } - } - /** - * @return string - */ - public function generate() - { - $chars = 'ABCDEF1234567890'; - $id = ''; - for ($i = 0; $i < 32; $i++) { - $id .= $chars[\random_int(0, 15)]; - } - return \md5($id); - } -} diff --git a/dependencies/mpdf/mpdf/src/ServiceFactory.php b/dependencies/mpdf/mpdf/src/ServiceFactory.php deleted file mode 100644 index 739efee..0000000 --- a/dependencies/mpdf/mpdf/src/ServiceFactory.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -use WP_Ultimo\Dependencies\Mpdf\Color\ColorConverter; -use WP_Ultimo\Dependencies\Mpdf\Color\ColorModeConverter; -use WP_Ultimo\Dependencies\Mpdf\Color\ColorSpaceRestrictor; -use WP_Ultimo\Dependencies\Mpdf\File\LocalContentLoader; -use WP_Ultimo\Dependencies\Mpdf\Fonts\FontCache; -use WP_Ultimo\Dependencies\Mpdf\Fonts\FontFileFinder; -use WP_Ultimo\Dependencies\Mpdf\Http\CurlHttpClient; -use WP_Ultimo\Dependencies\Mpdf\Http\SocketHttpClient; -use WP_Ultimo\Dependencies\Mpdf\Image\ImageProcessor; -use WP_Ultimo\Dependencies\Mpdf\Pdf\Protection; -use WP_Ultimo\Dependencies\Mpdf\Pdf\Protection\UniqidGenerator; -use WP_Ultimo\Dependencies\Mpdf\Writer\BaseWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\BackgroundWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\ColorWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\BookmarkWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\FontWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\FormWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\ImageWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\JavaScriptWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\MetadataWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\OptionalContentWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\PageWriter; -use WP_Ultimo\Dependencies\Mpdf\Writer\ResourceWriter; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -class ServiceFactory -{ - /** - * @var \Mpdf\Container\ContainerInterface|null - */ - private $container; - public function __construct($container = null) - { - $this->container = $container; - } - public function getServices(Mpdf $mpdf, LoggerInterface $logger, $config, $languageToFont, $scriptToLanguage, $fontDescriptor, $bmp, $directWrite, $wmf) - { - $sizeConverter = new SizeConverter($mpdf->dpi, $mpdf->default_font_size, $mpdf, $logger); - $colorModeConverter = new ColorModeConverter(); - $colorSpaceRestrictor = new ColorSpaceRestrictor($mpdf, $colorModeConverter); - $colorConverter = new ColorConverter($mpdf, $colorModeConverter, $colorSpaceRestrictor); - $tableOfContents = new TableOfContents($mpdf, $sizeConverter); - $cacheBasePath = $config['tempDir'] . '/mpdf'; - $cache = new Cache($cacheBasePath, $config['cacheCleanupInterval']); - $fontCache = new FontCache(new Cache($cacheBasePath . '/ttfontdata', $config['cacheCleanupInterval'])); - $fontFileFinder = new FontFileFinder($config['fontDir']); - if ($this->container && $this->container->has('httpClient')) { - $httpClient = $this->container->get('httpClient'); - } elseif (\function_exists('curl_init')) { - $httpClient = new CurlHttpClient($mpdf, $logger); - } else { - $httpClient = new SocketHttpClient($logger); - } - $localContentLoader = $this->container && $this->container->has('localContentLoader') ? $this->container->get('localContentLoader') : new LocalContentLoader(); - $assetFetcher = new AssetFetcher($mpdf, $localContentLoader, $httpClient, $logger); - $cssManager = new CssManager($mpdf, $cache, $sizeConverter, $colorConverter, $assetFetcher); - $otl = new Otl($mpdf, $fontCache); - $protection = new Protection(new UniqidGenerator()); - $writer = new BaseWriter($mpdf, $protection); - $gradient = new Gradient($mpdf, $sizeConverter, $colorConverter, $writer); - $formWriter = new FormWriter($mpdf, $writer); - $form = new Form($mpdf, $otl, $colorConverter, $writer, $formWriter); - $hyphenator = new Hyphenator($mpdf); - $imageProcessor = new ImageProcessor($mpdf, $otl, $cssManager, $sizeConverter, $colorConverter, $colorModeConverter, $cache, $languageToFont, $scriptToLanguage, $assetFetcher, $logger); - $tag = new Tag($mpdf, $cache, $cssManager, $form, $otl, $tableOfContents, $sizeConverter, $colorConverter, $imageProcessor, $languageToFont); - $fontWriter = new FontWriter($mpdf, $writer, $fontCache, $fontDescriptor); - $metadataWriter = new MetadataWriter($mpdf, $writer, $form, $protection, $logger); - $imageWriter = new ImageWriter($mpdf, $writer); - $pageWriter = new PageWriter($mpdf, $form, $writer, $metadataWriter); - $bookmarkWriter = new BookmarkWriter($mpdf, $writer); - $optionalContentWriter = new OptionalContentWriter($mpdf, $writer); - $colorWriter = new ColorWriter($mpdf, $writer); - $backgroundWriter = new BackgroundWriter($mpdf, $writer); - $javaScriptWriter = new JavaScriptWriter($mpdf, $writer); - $resourceWriter = new ResourceWriter($mpdf, $writer, $colorWriter, $fontWriter, $imageWriter, $formWriter, $optionalContentWriter, $backgroundWriter, $bookmarkWriter, $metadataWriter, $javaScriptWriter, $logger); - return ['otl' => $otl, 'bmp' => $bmp, 'cache' => $cache, 'cssManager' => $cssManager, 'directWrite' => $directWrite, 'fontCache' => $fontCache, 'fontFileFinder' => $fontFileFinder, 'form' => $form, 'gradient' => $gradient, 'tableOfContents' => $tableOfContents, 'tag' => $tag, 'wmf' => $wmf, 'sizeConverter' => $sizeConverter, 'colorConverter' => $colorConverter, 'hyphenator' => $hyphenator, 'localContentLoader' => $localContentLoader, 'httpClient' => $httpClient, 'assetFetcher' => $assetFetcher, 'imageProcessor' => $imageProcessor, 'protection' => $protection, 'languageToFont' => $languageToFont, 'scriptToLanguage' => $scriptToLanguage, 'writer' => $writer, 'fontWriter' => $fontWriter, 'metadataWriter' => $metadataWriter, 'imageWriter' => $imageWriter, 'formWriter' => $formWriter, 'pageWriter' => $pageWriter, 'bookmarkWriter' => $bookmarkWriter, 'optionalContentWriter' => $optionalContentWriter, 'colorWriter' => $colorWriter, 'backgroundWriter' => $backgroundWriter, 'javaScriptWriter' => $javaScriptWriter, 'resourceWriter' => $resourceWriter]; - } - public function getServiceIds() - { - return ['otl', 'bmp', 'cache', 'cssManager', 'directWrite', 'fontCache', 'fontFileFinder', 'form', 'gradient', 'tableOfContents', 'tag', 'wmf', 'sizeConverter', 'colorConverter', 'hyphenator', 'localContentLoader', 'httpClient', 'assetFetcher', 'imageProcessor', 'protection', 'languageToFont', 'scriptToLanguage', 'writer', 'fontWriter', 'metadataWriter', 'imageWriter', 'formWriter', 'pageWriter', 'bookmarkWriter', 'optionalContentWriter', 'colorWriter', 'backgroundWriter', 'javaScriptWriter', 'resourceWriter']; - } -} diff --git a/dependencies/mpdf/mpdf/src/Shaper/Indic.php b/dependencies/mpdf/mpdf/src/Shaper/Indic.php deleted file mode 100644 index 5c73b2d..0000000 --- a/dependencies/mpdf/mpdf/src/Shaper/Indic.php +++ /dev/null @@ -1,3194 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Shaper; - -use WP_Ultimo\Dependencies\Mpdf\Ucdn; -class Indic -{ - /* FROM hb-ot-shape-complex-indic-private.hh */ - // indic_category - const OT_X = 0; - const OT_C = 1; - const OT_V = 2; - const OT_N = 3; - const OT_H = 4; - const OT_ZWNJ = 5; - const OT_ZWJ = 6; - const OT_M = 7; - /* Matra or Dependent Vowel */ - const OT_SM = 8; - const OT_VD = 9; - const OT_A = 10; - const OT_NBSP = 11; - const OT_DOTTEDCIRCLE = 12; - /* Not in the spec, but special in Uniscribe. /Very very/ special! */ - const OT_RS = 13; - /* Register Shifter, used in Khmer OT spec */ - const OT_COENG = 14; - const OT_REPHA = 15; - const OT_RA = 16; - /* Not explicitly listed in the OT spec, but used in the grammar. */ - const OT_CM = 17; - /* Visual positions in a syllable from left to right. */ - /* FROM hb-ot-shape-complex-indic-private.hh */ - // indic_position - const POS_START = 0; - const POS_RA_TO_BECOME_REPH = 1; - const POS_PRE_M = 2; - const POS_PRE_C = 3; - const POS_BASE_C = 4; - const POS_AFTER_MAIN = 5; - const POS_ABOVE_C = 6; - const POS_BEFORE_SUB = 7; - const POS_BELOW_C = 8; - const POS_AFTER_SUB = 9; - const POS_BEFORE_POST = 10; - const POS_POST_C = 11; - const POS_AFTER_POST = 12; - const POS_FINAL_C = 13; - const POS_SMVD = 14; - const POS_END = 15; - /* - * Basic features. - * These features are applied in order, one at a time, after initial_reordering. - */ - /* - * Must be in the same order as the indic_features array. Ones starting with _ are F_GLOBAL - * Ones without the _ are only applied where the mask says! - */ - const _NUKT = 0; - const _AKHN = 1; - const RPHF = 2; - const _RKRF = 3; - const PREF = 4; - const BLWF = 5; - const HALF = 6; - const ABVF = 7; - const PSTF = 8; - const CFAR = 9; - // Khmer only - const _VATU = 10; - const _CJCT = 11; - const INIT = 12; - // Based on indic_category used to make string to find syllables - // OT_ to string character (using e.g. OT_C from INDIC) hb-ot-shape-complex-indic-private.hh - public static $indic_category_char = [ - 'x', - 'C', - 'V', - 'N', - 'H', - 'Z', - 'J', - 'M', - 'S', - 'v', - 'A', - /* Spec gives Andutta U+0952 as OT_A. However, testing shows that Uniscribe - * treats U+0951..U+0952 all as OT_VD - see set_indic_properties */ - 's', - 'D', - 'F', - /* Register shift Khmer only */ - 'G', - /* Khmer only */ - 'r', - /* 0D4E (dot reph) only one in Malayalam */ - 'R', - 'm', - ]; - public static function set_indic_properties(&$info, $scriptblock) - { - $u = $info['uni']; - $type = self::indic_get_categories($u); - $cat = $type & 0x7f; - $pos = $type >> 8; - /* - * Re-assign category - */ - if ($u == 0x17d1) { - $cat = self::OT_X; - } - if ($cat == self::OT_X && self::in_range($u, 0x17cb, 0x17d3)) { - /* Khmer Various signs */ - /* These are like Top Matras. */ - $cat = self::OT_M; - $pos = self::POS_ABOVE_C; - } - if ($u == 0x17c6) { - $cat = self::OT_N; - } - /* Khmer Bindu doesn't like to be repositioned. */ - if ($u == 0x17d2) { - $cat = self::OT_COENG; - } - /* Khmer coeng */ - /* The spec says U+0952 is OT_A. However, testing shows that Uniscribe - * treats U+0951..U+0952 all as OT_VD. - * TESTS: - * U+092E,U+0947,U+0952 - * U+092E,U+0952,U+0947 - * U+092E,U+0947,U+0951 - * U+092E,U+0951,U+0947 - * */ - //if ($u == 0x0952) $cat = self::OT_A; - if (self::in_range($u, 0x951, 0x954)) { - $cat = self::OT_VD; - } - if ($u == 0x200c) { - $cat = self::OT_ZWNJ; - } elseif ($u == 0x200d) { - $cat = self::OT_ZWJ; - } elseif ($u == 0x25cc) { - $cat = self::OT_DOTTEDCIRCLE; - } elseif ($u == 0xa71) { - $cat = self::OT_SM; - } - /* GURMUKHI ADDAK. More like consonant medial. like 0A75. */ - if ($cat == self::OT_REPHA) { - /* There are two kinds of characters marked as Repha: - * - The ones that are GenCat=Mn are already positioned visually, ie. after base. (eg. Khmer) - * - The ones that are GenCat=Lo is encoded logically, ie. beginning of syllable. (eg. Malayalam) - * - * We recategorize the first kind to look like a Nukta and attached to the base directly. - */ - if ($info['general_category'] == Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) { - $cat = self::OT_N; - } - } - /* - * Re-assign position. - */ - if (self::FLAG($cat) & (self::FLAG(self::OT_C) | self::FLAG(self::OT_CM) | self::FLAG(self::OT_RA) | self::FLAG(self::OT_V) | self::FLAG(self::OT_NBSP) | self::FLAG(self::OT_DOTTEDCIRCLE))) { - // = CONSONANT_FLAGS like is_consonant - if ($scriptblock == Ucdn::SCRIPT_KHMER) { - $pos = self::POS_BELOW_C; - } else { - $pos = self::POS_BASE_C; - } - /* Will recategorize later based on font lookups. */ - if (self::is_ra($u)) { - $cat = self::OT_RA; - } - } elseif ($cat == self::OT_M) { - $pos = self::matra_position($u, $pos); - } elseif ($cat == self::OT_SM || $cat == self::OT_VD) { - $pos = self::POS_SMVD; - } - if ($u == 0xb01) { - $pos = self::POS_BEFORE_SUB; - } - /* Oriya Bindu is BeforeSub in the spec. */ - $info['indic_category'] = $cat; - $info['indic_position'] = $pos; - } - // syllable_type - const CONSONANT_SYLLABLE = 0; - const VOWEL_SYLLABLE = 1; - const STANDALONE_CLUSTER = 2; - const BROKEN_CLUSTER = 3; - const NON_INDIC_CLUSTER = 4; - public static function set_syllables(&$o, $s, &$broken_syllables) - { - $ptr = 0; - $syllable_serial = 1; - $broken_syllables = \false; - while ($ptr < \strlen($s)) { - $match = ''; - $syllable_length = 1; - $syllable_type = self::NON_INDIC_CLUSTER; - // CONSONANT_SYLLABLE Consonant syllable - // From OT spec: - if (\preg_match('/^([CR]m*[N]?(H[ZJ]?|[ZJ]H))*[CR]m*[N]?[A]?(H[ZJ]?|[M]*[N]?[H]?)?[S]?[v]{0,2}/', \substr($s, $ptr), $ma)) { - // From HarfBuzz: - //if (preg_match('/^r?([CR]J?(Z?[N]{0,2})?[ZJ]?H(J[N]?)?){0,4}[CR]J?(Z?[N]{0,2})?A?((([ZJ]?H(J[N]?)?)|HZ)|(HJ)?([ZJ]{0,3}M[N]?(H|JHJR)?){0,4})?(S[Z]?)?[v]{0,2}/', substr($s,$ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::CONSONANT_SYLLABLE; - } elseif (\preg_match('/^(RH|r)?V[N]?([ZJ]?H[CR]m*|J[CR]m*)?([M]*[N]?[H]?)?[S]?[v]{0,2}/', \substr($s, $ptr), $ma)) { - // From HarfBuzz: - //else if (preg_match('/^(RH|r)?V(Z?[N]{0,2})?(J|([ZJ]?H(J[N]?)?[CR]J?(Z?[N]{0,2})?){0,4}((([ZJ]?H(J[N]?)?)|HZ)|(HJ)?([ZJ]{0,3}M[N]?(H|JHJR)?){0,4})?(S[Z]?)?[v]{0,2})/', substr($s,$ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::VOWEL_SYLLABLE; - } elseif (($ptr == 0 || $o[$ptr - 1]['general_category'] < Ucdn::UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER || $o[$ptr - 1]['general_category'] > Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) && \preg_match('/^(RH|r)?[sD][N]?([ZJ]?H[CR]m*)?([M]*[N]?[H]?)?[S]?[v]{0,2}/', \substr($s, $ptr), $ma)) { - // From HarfBuzz: - // && (preg_match('/^(RH|r)?[sD](Z?[N]{0,2})?(([ZJ]?H(J[N]?)?)[CR]J?(Z?[N]{0,2})?){0,4}((([ZJ]?H(J[N]?)?)|HZ)|(HJ)?([ZJ]{0,3}M[N]?(H|JHJR)?){0,4})?(S[Z]?)?[v]{0,2}/', substr($s,$ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::STANDALONE_CLUSTER; - } elseif (\preg_match('/^(RH|r)?[N]?([ZJ]?H[CR])?([M]*[N]?[H]?)?[S]?[v]{0,2}/', \substr($s, $ptr), $ma)) { - // From HarfBuzz: - //else if (preg_match('/^(RH|r)?(Z?[N]{0,2})?(([ZJ]?H(J[N]?)?)[CR]J?(Z?[N]{0,2})?){0,4}((([ZJ]?H(J[N]?)?)|HZ)|(HJ)?([ZJ]{0,3}M[N]?(H|JHJR)?){0,4})(S[Z]?)?[v]{0,2}/', substr($s,$ptr), $ma)) { - if (\strlen($ma[0])) { - // May match blank - $syllable_length = \strlen($ma[0]); - $syllable_type = self::BROKEN_CLUSTER; - $broken_syllables = \true; - } - } - for ($i = $ptr; $i < $ptr + $syllable_length; $i++) { - $o[$i]['syllable'] = $syllable_serial << 4 | $syllable_type; - } - $ptr += $syllable_length; - $syllable_serial++; - if ($syllable_serial == 16) { - $syllable_serial = 1; - } - } - } - public static function set_syllables_sinhala(&$o, $s, &$broken_syllables) - { - $ptr = 0; - $syllable_serial = 1; - $broken_syllables = \false; - while ($ptr < \strlen($s)) { - $match = ''; - $syllable_length = 1; - $syllable_type = self::NON_INDIC_CLUSTER; - // CONSONANT_SYLLABLE Consonant syllable - // From OT spec: - if (\preg_match('/^([CR]HJ|[CR]JH){0,8}[CR][HM]{0,3}[S]{0,1}/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::CONSONANT_SYLLABLE; - } elseif (\preg_match('/^V[S]{0,1}/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::VOWEL_SYLLABLE; - } - for ($i = $ptr; $i < $ptr + $syllable_length; $i++) { - $o[$i]['syllable'] = $syllable_serial << 4 | $syllable_type; - } - $ptr += $syllable_length; - $syllable_serial++; - if ($syllable_serial == 16) { - $syllable_serial = 1; - } - } - } - public static function set_syllables_khmer(&$o, $s, &$broken_syllables) - { - $ptr = 0; - $syllable_serial = 1; - $broken_syllables = \false; - while ($ptr < \strlen($s)) { - $match = ''; - $syllable_length = 1; - $syllable_type = self::NON_INDIC_CLUSTER; - // CONSONANT_SYLLABLE Consonant syllable - if (\preg_match('/^r?([CR]J?((Z?F)?[N]{0,2})?[ZJ]?G(JN?)?){0,4}[CR]J?((Z?F)?[N]{0,2})?A?((([ZJ]?G(JN?)?)|GZ)|(GJ)?([ZJ]{0,3}MN?(H|JHJR)?){0,4})?(G([CR]J?((Z?F)?[N]{0,2})?|V))?(SZ?)?[v]{0,2}/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::CONSONANT_SYLLABLE; - } elseif (\preg_match('/^(RH|r)?V((Z?F)?[N]{0,2})?(J|([ZJ]?G(JN?)?[CR]J?((Z?F)?[N]{0,2})?){0,4}((([ZJ]?G(JN?)?)|GZ)|(GJ)?([ZJ]{0,3}MN?(H|JHJR)?){0,4})?(G([CR]J?((Z?F)?[N]{0,2})?|V))?(SZ?)?[v]{0,2})/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::VOWEL_SYLLABLE; - } elseif (\preg_match('/^(RH|r)?((Z?F)?[N]{0,2})?(([ZJ]?G(JN?)?)[CR]J?((Z?F)?[N]{0,2})?){0,4}((([ZJ]?G(JN?)?)|GZ)|(GJ)?([ZJ]{0,3}MN?(H|JHJR)?){0,4})(G([CR]J?((Z?F)?[N]{0,2})?|V))?(SZ?)?[v]{0,2}/', \substr($s, $ptr), $ma)) { - if (\strlen($ma[0])) { - // May match blank - $syllable_length = \strlen($ma[0]); - $syllable_type = self::BROKEN_CLUSTER; - $broken_syllables = \true; - } - } - for ($i = $ptr; $i < $ptr + $syllable_length; $i++) { - $o[$i]['syllable'] = $syllable_serial << 4 | $syllable_type; - } - $ptr += $syllable_length; - $syllable_serial++; - if ($syllable_serial == 16) { - $syllable_serial = 1; - } - } - } - public static function initial_reordering(&$info, $GSUBdata, $broken_syllables, $indic_config, $scriptblock, $is_old_spec, $dottedcircle) - { - self::update_consonant_positions($info, $GSUBdata); - if ($broken_syllables && $dottedcircle) { - self::insert_dotted_circles($info, $dottedcircle); - } - $count = \count($info); - if (!$count) { - return; - } - $last = 0; - $last_syllable = $info[0]['syllable']; - for ($i = 1; $i < $count; $i++) { - if ($last_syllable != $info[$i]['syllable']) { - self::initial_reordering_syllable($info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec, $last, $i); - $last = $i; - $last_syllable = $info[$last]['syllable']; - } - } - self::initial_reordering_syllable($info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec, $last, $count); - } - public static function update_consonant_positions(&$info, $GSUBdata) - { - $count = \count($info); - for ($i = 0; $i < $count; $i++) { - if ($info[$i]['indic_position'] == self::POS_BASE_C) { - $c = $info[$i]['uni']; - // If would substitute... - if (isset($GSUBdata['pref'][$c])) { - $info[$i]['indic_position'] = self::POS_POST_C; - } elseif (isset($GSUBdata['blwf'][$c])) { - $info[$i]['indic_position'] = self::POS_BELOW_C; - } elseif (isset($GSUBdata['pstf'][$c])) { - $info[$i]['indic_position'] = self::POS_POST_C; - } - } - } - } - public static function insert_dotted_circles(&$info, $dottedcircle) - { - $idx = 0; - $last_syllable = 0; - while ($idx < \count($info)) { - $syllable = $info[$idx]['syllable']; - $syllable_type = $syllable & 0xf; - if ($last_syllable != $syllable && $syllable_type == self::BROKEN_CLUSTER) { - $last_syllable = $syllable; - $dottedcircle[0]['syllable'] = $info[$idx]['syllable']; - /* Insert dottedcircle after possible Repha. */ - while ($idx < \count($info) && $last_syllable == $info[$idx]['syllable'] && $info[$idx]['indic_category'] == self::OT_REPHA) { - $idx++; - } - \array_splice($info, $idx, 0, $dottedcircle); - } else { - $idx++; - } - } - // I am not sue how this code below got in here, since $idx should now be > count($info) and thus invalid. - // In case I am missing something(!) I'll leave a warning here for now: - if (isset($info[$idx])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Unexpected error occurred in Indic processing'); - } - // In case of final bloken cluster... - //$syllable = $info[$idx]['syllable']; - //$syllable_type = ($syllable & 0x0F); - //if ($last_syllable != $syllable && $syllable_type == self::BROKEN_CLUSTER) { - // $dottedcircle[0]['syllable'] = $info[$idx]['syllable']; - // array_splice($info, $idx, 0, $dottedcircle); - //} - } - /* Rules from: - * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */ - public static function initial_reordering_syllable(&$info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec, $start, $end) - { - /* vowel_syllable: We made the vowels look like consonants. So uses the consonant logic! */ - /* broken_cluster: We already inserted dotted-circles, so just call the standalone_cluster. */ - /* standalone_cluster: We treat NBSP/dotted-circle as if they are consonants, so we should just chain. */ - $syllable_type = $info[$start]['syllable'] & 0xf; - if ($syllable_type == self::NON_INDIC_CLUSTER) { - return; - } - if ($syllable_type == self::BROKEN_CLUSTER || $syllable_type == self::STANDALONE_CLUSTER) { - //if ($uniscribe_bug_compatible) { - /* For dotted-circle, this is what Uniscribe does: - * If dotted-circle is the last glyph, it just does nothing. - * i.e. It doesn't form Reph. */ - if ($info[$end - 1]['indic_category'] == self::OT_DOTTEDCIRCLE) { - return; - } - } - /* 1. Find base consonant: - * - * The shaping engine finds the base consonant of the syllable, using the - * following algorithm: starting from the end of the syllable, move backwards - * until a consonant is found that does not have a below-base or post-base - * form (post-base forms have to follow below-base forms), or that is not a - * pre-base reordering Ra, or arrive at the first consonant. The consonant - * stopped at will be the base. - * - * o If the syllable starts with Ra + Halant (in a script that has Reph) - * and has more than one consonant, Ra is excluded from candidates for - * base consonants. - */ - $base = $end; - $has_reph = \false; - $limit = $start; - if ($scriptblock != Ucdn::SCRIPT_KHMER) { - /* -> If the syllable starts with Ra + Halant (in a script that has Reph) - * and has more than one consonant, Ra is excluded from candidates for - * base consonants. */ - if (\count($GSUBdata['rphf']) && $start + 3 <= $end && ($indic_config[4] == self::REPH_MODE_IMPLICIT && !self::is_joiner($info[$start + 2]) || $indic_config[4] == self::REPH_MODE_EXPLICIT && $info[$start + 2]['indic_category'] == self::OT_ZWJ)) { - /* See if it matches the 'rphf' feature. */ - //$glyphs = array($info[$start]['uni'], $info[$start + 1]['uni']); - //if ($indic_plan->rphf->would_substitute ($glyphs, count($glyphs), true, face)) { - if (isset($GSUBdata['rphf'][$info[$start]['uni']]) && self::is_halant_or_coeng($info[$start + 1])) { - $limit += 2; - while ($limit < $end && self::is_joiner($info[$limit])) { - $limit++; - } - $base = $start; - $has_reph = \true; - } - } elseif ($indic_config[4] == self::REPH_MODE_LOG_REPHA && $info[$start]['indic_category'] == self::OT_REPHA) { - $limit += 1; - while ($limit < $end && self::is_joiner($info[$limit])) { - $limit++; - } - $base = $start; - $has_reph = \true; - } - } - switch ($indic_config[2]) { - // base_pos - case self::BASE_POS_LAST: - /* -> starting from the end of the syllable, move backwards */ - $i = $end; - $seen_below = \false; - do { - $i--; - /* -> until a consonant is found */ - if (self::is_consonant($info[$i])) { - /* -> that does not have a below-base or post-base form - * (post-base forms have to follow below-base forms), */ - if ($info[$i]['indic_position'] != self::POS_BELOW_C && ($info[$i]['indic_position'] != self::POS_POST_C || $seen_below)) { - $base = $i; - break; - } - if ($info[$i]['indic_position'] == self::POS_BELOW_C) { - $seen_below = \true; - } - /* -> or that is not a pre-base reordering Ra, - * - * IMPLEMENTATION NOTES: - * - * Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped - * by the logic above already. - */ - /* -> or arrive at the first consonant. The consonant stopped at will - * be the base. */ - $base = $i; - } else { - /* A ZWJ after a Halant stops the base search, and requests an explicit - * half form. - * [A ZWJ before a Halant, requests a subjoined form instead, and hence - * search continues. This is particularly important for Bengali - * sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya] */ - if ($start < $i && $info[$i]['indic_category'] == self::OT_ZWJ && $info[$i - 1]['indic_category'] == self::OT_H) { - if (!\defined("OMIT_INDIC_FIX_1") || OMIT_INDIC_FIX_1 != 1) { - $base = $i; - } - // INDIC_FIX_1 - break; - } - // ZKI8 - if ($start < $i && $info[$i]['indic_category'] == self::OT_ZWNJ) { - break; - } - } - } while ($i > $limit); - break; - case self::BASE_POS_FIRST: - /* In scripts without half forms (eg. Khmer), the first consonant is always the base. */ - if (!$has_reph) { - $base = $limit; - } - /* Find the last base consonant that is not blocked by ZWJ. If there is - * a ZWJ right before a base consonant, that would request a subjoined form. */ - for ($i = $limit; $i < $end; $i++) { - if (self::is_consonant($info[$i]) && $info[$i]['indic_position'] == self::POS_BASE_C) { - if ($limit < $i && $info[$i - 1]['indic_category'] == self::OT_ZWJ) { - break; - } else { - $base = $i; - } - } - } - /* Mark all subsequent consonants as below. */ - for ($i = $base + 1; $i < $end; $i++) { - if (self::is_consonant($info[$i]) && $info[$i]['indic_position'] == self::POS_BASE_C) { - $info[$i]['indic_position'] = self::POS_BELOW_C; - } - } - break; - } - /* -> If the syllable starts with Ra + Halant (in a script that has Reph) - * and has more than one consonant, Ra is excluded from candidates for - * base consonants. - * - * Only do this for unforced Reph. (ie. not for Ra,H,ZWJ. */ - if ($scriptblock != Ucdn::SCRIPT_KHMER) { - if ($has_reph && $base == $start && $limit - $base <= 2) { - /* Have no other consonant, so Reph is not formed and Ra becomes base. */ - $has_reph = \false; - } - } - /* 2. Decompose and reorder Matras: - * - * Each matra and any syllable modifier sign in the cluster are moved to the - * appropriate position relative to the consonant(s) in the cluster. The - * shaping engine decomposes two- or three-part matras into their constituent - * parts before any repositioning. Matra characters are classified by which - * consonant in a conjunct they have affinity for and are reordered to the - * following positions: - * - * o Before first half form in the syllable - * o After subjoined consonants - * o After post-form consonant - * o After main consonant (for above marks) - * - * IMPLEMENTATION NOTES: - * - * The normalize() routine has already decomposed matras for us, so we don't - * need to worry about that. - */ - /* 3. Reorder marks to canonical order: - * - * Adjacent nukta and halant or nukta and vedic sign are always repositioned - * if necessary, so that the nukta is first. - * - * IMPLEMENTATION NOTES: - * - * Use the combining Class from Unicode categories? to bubble_sort. - */ - /* Reorder characters */ - for ($i = $start; $i < $base; $i++) { - $info[$i]['indic_position'] = \min(self::POS_PRE_C, $info[$i]['indic_position']); - } - if ($base < $end) { - $info[$base]['indic_position'] = self::POS_BASE_C; - } - /* Mark final consonants. A final consonant is one appearing after a matra, - * ? only in Khmer. */ - for ($i = $base + 1; $i < $end; $i++) { - if ($info[$i]['indic_category'] == self::OT_M) { - for ($j = $i + 1; $j < $end; $j++) { - if (self::is_consonant($info[$j])) { - $info[$j]['indic_position'] = self::POS_FINAL_C; - break; - } - } - break; - } - } - /* Handle beginning Ra */ - if ($scriptblock != Ucdn::SCRIPT_KHMER) { - if ($has_reph) { - $info[$start]['indic_position'] = self::POS_RA_TO_BECOME_REPH; - } - } - /* For old-style Indic script tags, move the first post-base Halant after - * last consonant. Only do this if there is *not* a Halant after last - * consonant. Otherwise it becomes messy. */ - if ($is_old_spec) { - for ($i = $base + 1; $i < $end; $i++) { - if ($info[$i]['indic_category'] == self::OT_H) { - for ($j = $end - 1; $j > $i; $j--) { - if (self::is_consonant($info[$j]) || $info[$j]['indic_category'] == self::OT_H) { - break; - } - } - if ($info[$j]['indic_category'] != self::OT_H && $j > $i) { - /* Move Halant to after last consonant. */ - self::_move_info_pos($info, $i, $j + 1); - } - break; - } - } - } - /* Attach misc marks to previous char to move with them. */ - $last_pos = self::POS_START; - for ($i = $start; $i < $end; $i++) { - if (self::FLAG($info[$i]['indic_category']) & (self::FLAG(self::OT_ZWJ) | self::FLAG(self::OT_ZWNJ) | self::FLAG(self::OT_N) | self::FLAG(self::OT_RS) | self::FLAG(self::OT_H) | self::FLAG(self::OT_COENG))) { - $info[$i]['indic_position'] = $last_pos; - if ($info[$i]['indic_category'] == self::OT_H && $info[$i]['indic_position'] == self::POS_PRE_M) { - /* - * Uniscribe doesn't move the Halant with Left Matra. - * TEST: U+092B,U+093F,U+094DE - * We follow. This is important for the Sinhala - * U+0DDA split matra since it decomposes to U+0DD9,U+0DCA - * where U+0DD9 is a left matra and U+0DCA is the virama. - * We don't want to move the virama with the left matra. - * TEST: U+0D9A,U+0DDA - */ - for ($j = $i; $j > $start; $j--) { - if ($info[$j - 1]['indic_position'] != self::POS_PRE_M) { - $info[$i]['indic_position'] = $info[$j - 1]['indic_position']; - break; - } - } - } - } elseif ($info[$i]['indic_position'] != self::POS_SMVD) { - $last_pos = $info[$i]['indic_position']; - } - } - /* Re-attach ZWJ, ZWNJ, and halant to next char, for after-base consonants. */ - $last_halant = $end; - for ($i = $base + 1; $i < $end; $i++) { - if (self::is_halant_or_coeng($info[$i])) { - $last_halant = $i; - } elseif (self::is_consonant($info[$i])) { - for ($j = $last_halant; $j < $i; $j++) { - if ($info[$j]['indic_position'] != self::POS_SMVD) { - $info[$j]['indic_position'] = $info[$i]['indic_position']; - } - } - } - } - if ($scriptblock == Ucdn::SCRIPT_KHMER) { - /* KHMER_FIX_2 */ - /* Move Coeng+RO (Halant,Ra) sequence before base consonant. */ - for ($i = $base + 1; $i < $end; $i++) { - if (self::is_halant_or_coeng($info[$i]) && self::is_ra($info[$i + 1]['uni'])) { - $info[$i]['indic_position'] = self::POS_PRE_C; - $info[$i + 1]['indic_position'] = self::POS_PRE_C; - break; - } - } - } - /* - if (!defined("OMIT_INDIC_FIX_2") || OMIT_INDIC_FIX_2 != 1) { - // INDIC_FIX_2 - $ZWNJ_found = false; - $POST_ZWNJ_c_found = false; - for ($i = $base + 1; $i < $end; $i++) { - if ($info[$i]['indic_category'] == self::OT_ZWNJ) { $ZWNJ_found = true; } - else if ($ZWNJ_found && $info[$i]['indic_category'] == self::OT_C) { $POST_ZWNJ_c_found = true; } - else if ($POST_ZWNJ_c_found && $info[$i]['indic_position'] == self::POS_BEFORE_SUB) { $info[$i]['indic_position'] = self::POS_AFTER_SUB; } - } - } - */ - /* Setup masks now */ - for ($i = $start; $i < $end; $i++) { - $info[$i]['mask'] = 0; - } - if ($scriptblock == Ucdn::SCRIPT_KHMER) { - /* Find a Coeng+RO (Halant,Ra) sequence and mark it for pre-base processing. */ - $mask = self::FLAG(self::PREF); - for ($i = $base; $i < $end - 1; $i++) { - /* KHMER_FIX_1 From $start (not base) */ - if (self::is_halant_or_coeng($info[$i]) && self::is_ra($info[$i + 1]['uni'])) { - $info[$i]['mask'] |= self::FLAG(self::PREF); - $info[$i + 1]['mask'] |= self::FLAG(self::PREF); - /* Mark the subsequent stuff with 'cfar'. Used in Khmer. - * Read the feature spec. - * This allows distinguishing the following cases with MS Khmer fonts: - * U+1784,U+17D2,U+179A,U+17D2,U+1782 [C+Coeng+RO+Coeng+C] => Should activate CFAR - * U+1784,U+17D2,U+1782,U+17D2,U+179A [C+Coeng+C+Coeng+RO] => Should NOT activate CFAR - */ - for ($j = $i + 2; $j < $end; $j++) { - $info[$j]['mask'] |= self::FLAG(self::CFAR); - } - break; - } - } - } - /* Sit tight, rock 'n roll! */ - self::bubble_sort($info, $start, $end - $start); - /* Find base again */ - $base = $end; - for ($i = $start; $i < $end; $i++) { - if ($info[$i]['indic_position'] == self::POS_BASE_C) { - $base = $i; - break; - } - } - if ($scriptblock != Ucdn::SCRIPT_KHMER) { - /* Reph */ - for ($i = $start; $i < $end; $i++) { - if ($info[$i]['indic_position'] == self::POS_RA_TO_BECOME_REPH) { - $info[$i]['mask'] |= self::FLAG(self::RPHF); - } - } - /* Pre-base */ - $mask = self::FLAG(self::HALF); - for ($i = $start; $i < $base; $i++) { - $info[$i]['mask'] |= $mask; - } - } - /* Post-base */ - $mask = self::FLAG(self::BLWF) | self::FLAG(self::ABVF) | self::FLAG(self::PSTF); - for ($i = $base + 1; $i < $end; $i++) { - $info[$i]['mask'] |= $mask; - } - if ($scriptblock != Ucdn::SCRIPT_KHMER) { - if (!\defined("OMIT_INDIC_FIX_3") || OMIT_INDIC_FIX_3 != 1) { - /* INDIC_FIX_3 */ - /* Find a (pre-base) Consonant, Halant,Ra sequence and mark Halant|Ra for below-base BLWF processing. */ - // TEST CASE ক্র্ক in FreeSans versus Vrinda - if ($base - $start >= 3) { - for ($i = $start; $i < $base - 2; $i++) { - if (self::is_consonant($info[$i])) { - if (self::is_halant_or_coeng($info[$i + 1]) && self::is_ra($info[$i + 2]['uni'])) { - // If would substitute Halant+Ra...BLWF - if (isset($GSUBdata['blwf'][$info[$i + 2]['uni']])) { - $info[$i + 1]['mask'] |= self::FLAG(self::BLWF); - $info[$i + 2]['mask'] |= self::FLAG(self::BLWF); - } elseif (self::is_halant_or_coeng($info[$i + 3])) { - $info[$i + 2]['mask'] |= self::FLAG(self::RPHF); - $info[$i + 3]['mask'] |= self::FLAG(self::RPHF); - } - break; - } - } - } - } - } - } - if ($is_old_spec && $scriptblock == Ucdn::SCRIPT_DEVANAGARI) { - /* Old-spec eye-lash Ra needs special handling. From the spec: - * "The feature 'below-base form' is applied to consonants - * having below-base forms and following the base consonant. - * The exception is vattu, which may appear below half forms - * as well as below the base glyph. The feature 'below-base - * form' will be applied to all such occurrences of Ra as well." - * - * Test case: U+0924,U+094D,U+0930,U+094d,U+0915 - * with Sanskrit 2003 font. - * - * However, note that Ra,Halant,ZWJ is the correct way to - * request eyelash form of Ra, so we wouldbn't inhibit it - * in that sequence. - * - * Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915 - */ - for ($i = $start; $i + 1 < $base; $i++) { - if ($info[$i]['indic_category'] == self::OT_RA && $info[$i + 1]['indic_category'] == self::OT_H && ($i + 2 == $base || $info[$i + 2]['indic_category'] != self::OT_ZWJ)) { - $info[$i]['mask'] |= self::FLAG(self::BLWF); - $info[$i + 1]['mask'] |= self::FLAG(self::BLWF); - } - } - } - if ($scriptblock != Ucdn::SCRIPT_KHMER) { - if (\count($GSUBdata['pref']) && $base + 2 < $end) { - /* Find a Halant,Ra sequence and mark it for pre-base processing. */ - for ($i = $base + 1; $i + 1 < $end; $i++) { - // If old_spec find Ra-Halant... - if (isset($GSUBdata['pref'][$info[$i + 1]['uni']]) && self::is_halant_or_coeng($info[$i]) && self::is_ra($info[$i + 1]['uni']) || $is_old_spec && isset($GSUBdata['pref'][$info[$i]['uni']]) && self::is_halant_or_coeng($info[$i + 1]) && self::is_ra($info[$i]['uni'])) { - $info[$i++]['mask'] |= self::FLAG(self::PREF); - $info[$i++]['mask'] |= self::FLAG(self::PREF); - break; - } - } - } - } - /* Apply ZWJ/ZWNJ effects */ - for ($i = $start + 1; $i < $end; $i++) { - if (self::is_joiner($info[$i])) { - $non_joiner = $info[$i]['indic_category'] == self::OT_ZWNJ; - $j = $i; - while ($j > $start) { - if (\defined("OMIT_INDIC_FIX_4") && OMIT_INDIC_FIX_4 == 1) { - // INDIC_FIX_4 = do nothing - carry on // - // ZWNJ should block H C from forming blwf post-base - need to unmask backwards beyond first consonant arrived at // - if (!self::is_consonant($info[$j])) { - break; - } - } - $j--; - /* ZWJ/ZWNJ should disable CJCT. They do that by simply - * being there, since we don't skip them for the CJCT - * feature (ie. F_MANUAL_ZWJ) */ - /* A ZWNJ disables HALF. */ - if ($non_joiner) { - $info[$j]['mask'] &= ~(self::FLAG(self::HALF) | self::FLAG(self::BLWF)); - } - } - } - } - } - public static function final_reordering(&$info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec) - { - $count = \count($info); - if (!$count) { - return; - } - $last = 0; - $last_syllable = $info[0]['syllable']; - for ($i = 1; $i < $count; $i++) { - if ($last_syllable != $info[$i]['syllable']) { - self::final_reordering_syllable($info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec, $last, $i); - $last = $i; - $last_syllable = $info[$last]['syllable']; - } - } - self::final_reordering_syllable($info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec, $last, $count); - } - public static function final_reordering_syllable(&$info, $GSUBdata, $indic_config, $scriptblock, $is_old_spec, $start, $end) - { - /* 4. Final reordering: - * - * After the localized forms and basic shaping forms GSUB features have been - * applied (see below), the shaping engine performs some final glyph - * reordering before applying all the remaining font features to the entire - * cluster. - */ - /* Find base again */ - for ($base = $start; $base < $end; $base++) { - if ($info[$base]['indic_position'] >= self::POS_BASE_C) { - if ($start < $base && $info[$base]['indic_position'] > self::POS_BASE_C) { - $base--; - } - break; - } - } - if ($base == $end && $start < $base && $info[$base - 1]['indic_category'] != self::OT_ZWJ) { - $base--; - } - while ($start < $base && isset($info[$base]) && ($info[$base]['indic_category'] == self::OT_H || $info[$base]['indic_category'] == self::OT_N)) { - $base--; - } - /* o Reorder matras: - * - * If a pre-base matra character had been reordered before applying basic - * features, the glyph can be moved closer to the main consonant based on - * whether half-forms had been formed. Actual position for the matra is - * defined as "after last standalone halant glyph, after initial matra - * position and before the main consonant". If ZWJ or ZWNJ follow this - * halant, position is moved after it. - */ - if ($start + 1 < $end && $start < $base) { - /* Otherwise there can't be any pre-base matra characters. */ - /* If we lost track of base, alas, position before last thingy. */ - $new_pos = $base == $end ? $base - 2 : $base - 1; - /* Malayalam / Tamil do not have "half" forms or explicit virama forms. - * The glyphs formed by 'half' are Chillus or ligated explicit viramas. - * We want to position matra after them. - */ - if ($scriptblock != Ucdn::SCRIPT_MALAYALAM && $scriptblock != Ucdn::SCRIPT_TAMIL) { - while ($new_pos > $start && !self::is_one_of($info[$new_pos], self::FLAG(self::OT_M) | self::FLAG(self::OT_H) | self::FLAG(self::OT_COENG))) { - $new_pos--; - } - /* If we found no Halant we are done. - * Otherwise only proceed if the Halant does - * not belong to the Matra itself! */ - if (self::is_halant_or_coeng($info[$new_pos]) && $info[$new_pos]['indic_position'] != self::POS_PRE_M) { - /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ - if ($new_pos + 1 < $end && self::is_joiner($info[$new_pos + 1])) { - $new_pos++; - } - } else { - $new_pos = $start; - } - /* No move. */ - } - if ($start < $new_pos && $info[$new_pos]['indic_position'] != self::POS_PRE_M) { - /* Now go see if there's actually any matras... */ - for ($i = $new_pos; $i > $start; $i--) { - if ($info[$i - 1]['indic_position'] == self::POS_PRE_M) { - $old_pos = $i - 1; - //memmove (&info[$old_pos], &info[$old_pos + 1], ($new_pos - $old_pos) * sizeof ($info[0])); - self::_move_info_pos($info, $old_pos, $new_pos + 1); - if ($old_pos < $base && $base <= $new_pos) { - /* Shouldn't actually happen. */ - $base--; - } - $new_pos--; - } - } - } - } - /* o Reorder reph: - * - * Reph's original position is always at the beginning of the syllable, - * (i.e. it is not reordered at the character reordering stage). However, - * it will be reordered according to the basic-forms shaping results. - * Possible positions for reph, depending on the script, are; after main, - * before post-base consonant forms, and after post-base consonant forms. - */ - /* If there's anything after the Ra that has the REPH pos, it ought to be halant. - * Which means that the font has failed to ligate the Reph. In which case, we - * shouldn't move. */ - if ($start + 1 < $end && $info[$start]['indic_position'] == self::POS_RA_TO_BECOME_REPH && $info[$start + 1]['indic_position'] != self::POS_RA_TO_BECOME_REPH) { - $reph_pos = $indic_config[3]; - $skip_to_reph_step_5 = \false; - $skip_to_reph_move = \false; - /* 1. If reph should be positioned after post-base consonant forms, - * proceed to step 5. - */ - if ($reph_pos == self::REPH_POS_AFTER_POST) { - $skip_to_reph_step_5 = \true; - } - /* 2. If the reph repositioning class is not after post-base: target - * position is after the first explicit halant glyph between the - * first post-reph consonant and last main consonant. If ZWJ or ZWNJ - * are following this halant, position is moved after it. If such - * position is found, this is the target position. Otherwise, - * proceed to the next step. - * - * Note: in old-implementation fonts, where classifications were - * fixed in shaping engine, there was no case where reph position - * will be found on this step. - */ - if (!$skip_to_reph_step_5) { - $new_reph_pos = $start + 1; - while ($new_reph_pos < $base && !self::is_halant_or_coeng($info[$new_reph_pos])) { - $new_reph_pos++; - } - if ($new_reph_pos < $base && self::is_halant_or_coeng($info[$new_reph_pos])) { - /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */ - if ($new_reph_pos + 1 < $base && self::is_joiner($info[$new_reph_pos + 1])) { - $new_reph_pos++; - } - $skip_to_reph_move = \true; - } - } - /* 3. If reph should be repositioned after the main consonant: find the - * first consonant not ligated with main, or find the first - * consonant that is not a potential pre-base reordering Ra. - */ - if ($reph_pos == self::REPH_POS_AFTER_MAIN && !$skip_to_reph_move && !$skip_to_reph_step_5) { - $new_reph_pos = $base; - /* XXX Skip potential pre-base reordering Ra. */ - while ($new_reph_pos + 1 < $end && $info[$new_reph_pos + 1]['indic_position'] <= self::POS_AFTER_MAIN) { - $new_reph_pos++; - } - if ($new_reph_pos < $end) { - $skip_to_reph_move = \true; - } - } - /* 4. If reph should be positioned before post-base consonant, find - * first post-base classified consonant not ligated with main. If no - * consonant is found, the target position should be before the - * first matra, syllable modifier sign or vedic sign. - */ - /* This is our take on what step 4 is trying to say (and failing, BADLY). */ - if ($reph_pos == self::REPH_POS_AFTER_SUB && !$skip_to_reph_move && !$skip_to_reph_step_5) { - $new_reph_pos = $base; - while ($new_reph_pos < $end && isset($info[$new_reph_pos + 1]['indic_position']) && !(self::FLAG($info[$new_reph_pos + 1]['indic_position']) & (self::FLAG(self::POS_POST_C) | self::FLAG(self::POS_AFTER_POST) | self::FLAG(self::POS_SMVD)))) { - $new_reph_pos++; - } - if ($new_reph_pos < $end) { - $skip_to_reph_move = \true; - } - } - /* 5. If no consonant is found in steps 3 or 4, move reph to a position - * immediately before the first post-base matra, syllable modifier - * sign or vedic sign that has a reordering class after the intended - * reph position. For example, if the reordering position for reph - * is post-main, it will skip above-base matras that also have a - * post-main position. - */ - if (!$skip_to_reph_move) { - /* Copied from step 2. */ - $new_reph_pos = $start + 1; - while ($new_reph_pos < $base && !self::is_halant_or_coeng($info[$new_reph_pos])) { - $new_reph_pos++; - } - if ($new_reph_pos < $base && self::is_halant_or_coeng($info[$new_reph_pos])) { - /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */ - if ($new_reph_pos + 1 < $base && self::is_joiner($info[$new_reph_pos + 1])) { - $new_reph_pos++; - } - $skip_to_reph_move = \true; - } - } - /* 6. Otherwise, reorder reph to the end of the syllable. - */ - if (!$skip_to_reph_move) { - $new_reph_pos = $end - 1; - while ($new_reph_pos > $start && $info[$new_reph_pos]['indic_position'] == self::POS_SMVD) { - $new_reph_pos--; - } - /* - * If the Reph is to be ending up after a Matra,Halant sequence, - * position it before that Halant so it can interact with the Matra. - * However, if it's a plain Consonant,Halant we shouldn't do that. - * Uniscribe doesn't do this. - * TEST: U+0930,U+094D,U+0915,U+094B,U+094D - */ - //if (!$hb_options.uniscribe_bug_compatible && self::is_halant_or_coeng($info[$new_reph_pos])) { - if (self::is_halant_or_coeng($info[$new_reph_pos])) { - for ($i = $base + 1; $i < $new_reph_pos; $i++) { - if ($info[$i]['indic_category'] == self::OT_M) { - /* Ok, got it. */ - $new_reph_pos--; - } - } - } - } - /* Move */ - self::_move_info_pos($info, $start, $new_reph_pos + 1); - if ($start < $base && $base <= $new_reph_pos) { - $base--; - } - } - /* o Reorder pre-base reordering consonants: - * - * If a pre-base reordering consonant is found, reorder it according to - * the following rules: - */ - if (\count($GSUBdata['pref']) && $base + 1 < $end) { - /* Otherwise there can't be any pre-base reordering Ra. */ - for ($i = $base + 1; $i < $end; $i++) { - if ($info[$i]['mask'] & self::FLAG(self::PREF)) { - /* 1. Only reorder a glyph produced by substitution during application - * of the <pref> feature. (Note that a font may shape a Ra consonant with - * the feature generally but block it in certain contexts.) - */ - // ??? Need to TEST if actual substitution has occurred - if ($i + 1 == $end || ($info[$i + 1]['mask'] & self::FLAG(self::PREF)) == 0) { - /* - * 2. Try to find a target position the same way as for pre-base matra. - * If it is found, reorder pre-base consonant glyph. - * - * 3. If position is not found, reorder immediately before main - * consonant. - */ - $new_pos = $base; - /* Malayalam / Tamil do not have "half" forms or explicit virama forms. - * The glyphs formed by 'half' are Chillus or ligated explicit viramas. - * We want to position matra after them. - */ - if ($scriptblock != Ucdn::SCRIPT_MALAYALAM && $scriptblock != Ucdn::SCRIPT_TAMIL) { - while ($new_pos > $start && !self::is_one_of($info[$new_pos - 1], self::FLAG(self::OT_M) | self::FLAG(self::OT_H) | self::FLAG(self::OT_COENG))) { - $new_pos--; - } - /* In Khmer coeng model, a V,Ra can go *after* matras. If it goes after a - * split matra, it should be reordered to *before* the left part of such matra. */ - if ($new_pos > $start && $info[$new_pos - 1]['indic_category'] == self::OT_M) { - $old_pos = $i; - for ($i = $base + 1; $i < $old_pos; $i++) { - if ($info[$i]['indic_category'] == self::OT_M) { - $new_pos--; - break; - } - } - } - } - if ($new_pos > $start && self::is_halant_or_coeng($info[$new_pos - 1])) { - /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ - if ($new_pos < $end && self::is_joiner($info[$new_pos])) { - $new_pos++; - } - } - $old_pos = $i; - self::_move_info_pos($info, $old_pos, $new_pos); - if ($new_pos <= $base && $base < $old_pos) { - $base++; - } - } - break; - } - } - } - /* Apply 'init' to the Left Matra if it's a word start. */ - if ($info[$start]['indic_position'] == self::POS_PRE_M && ($start == 0 || ($info[$start - 1]['general_category'] < Ucdn::UNICODE_GENERAL_CATEGORY_FORMAT || $info[$start - 1]['general_category'] > Ucdn::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) { - $info[$start]['mask'] |= self::FLAG(self::INIT); - } - /* - * Finish off and go home! - */ - } - public static function _move_info_pos(&$info, $from, $to) - { - $t = []; - $t[0] = $info[$from]; - if ($from > $to) { - \array_splice($info, $from, 1); - \array_splice($info, $to, 0, $t); - } else { - \array_splice($info, $to, 0, $t); - \array_splice($info, $from, 1); - } - } - public static $ra_chars = [ - 0x930 => 1, - /* Devanagari */ - 0x9b0 => 1, - /* Bengali */ - 0x9f0 => 1, - /* Bengali (Assamese) */ - 0xa30 => 1, - /* Gurmukhi */ - /* No Reph */ - 0xab0 => 1, - /* Gujarati */ - 0xb30 => 1, - /* Oriya */ - 0xbb0 => 1, - /* Tamil */ - /* No Reph */ - 0xc30 => 1, - /* Telugu */ - /* Reph formed only with ZWJ */ - 0xcb0 => 1, - /* Kannada */ - 0xd30 => 1, - /* Malayalam */ - /* No Reph, Logical Repha */ - 0xdbb => 1, - /* Sinhala */ - /* Reph formed only with ZWJ */ - 0x179a => 1, - ]; - public static function is_ra($u) - { - return isset(self::$ra_chars[$u]); - } - public static function is_one_of($info, $flags) - { - if (isset($info['is_ligature']) && $info['is_ligature']) { - return \false; - } - /* If it ligated, all bets are off. */ - return !!(self::FLAG($info['indic_category']) & $flags); - } - public static function is_joiner($info) - { - return self::is_one_of($info, self::FLAG(self::OT_ZWJ) | self::FLAG(self::OT_ZWNJ)); - } - /* Vowels and placeholders treated as if they were consonants. */ - public static function is_consonant($info) - { - return self::is_one_of($info, self::FLAG(self::OT_C) | self::FLAG(self::OT_CM) | self::FLAG(self::OT_RA) | self::FLAG(self::OT_V) | self::FLAG(self::OT_NBSP) | self::FLAG(self::OT_DOTTEDCIRCLE)); - } - public static function is_halant_or_coeng($info) - { - return self::is_one_of($info, self::FLAG(self::OT_H) | self::FLAG(self::OT_COENG)); - } - // From hb-private.hh - public static function in_range($u, $lo, $hi) - { - if ((($lo ^ $hi) & $lo) == 0 && (($lo ^ $hi) & $hi) == ($lo ^ $hi) && (($lo ^ $hi) & ($lo ^ $hi) + 1) == 0) { - return ($u & ~($lo ^ $hi)) == $lo; - } else { - return $lo <= $u && $u <= $hi; - } - } - // From hb-private.hh - public static function FLAG($x) - { - return 1 << $x; - } - // BELOW from hb-ot-shape-complex-indic.cc - /* - * Indic configurations. - */ - // base_position - const BASE_POS_FIRST = 0; - const BASE_POS_LAST = 1; - // reph_position - const REPH_POS_DEFAULT = 10; - // POS_BEFORE_POST, - const REPH_POS_AFTER_MAIN = 5; - // POS_AFTER_MAIN, - const REPH_POS_BEFORE_SUB = 7; - // POS_BEFORE_SUB, - const REPH_POS_AFTER_SUB = 9; - // POS_AFTER_SUB, - const REPH_POS_BEFORE_POST = 10; - // POS_BEFORE_POST, - const REPH_POS_AFTER_POST = 12; - // POS_AFTER_POST - // reph_mode - const REPH_MODE_IMPLICIT = 0; - /* Reph formed out of initial Ra,H sequence. */ - const REPH_MODE_EXPLICIT = 1; - /* Reph formed out of initial Ra,H,ZWJ sequence. */ - const REPH_MODE_VIS_REPHA = 2; - /* Encoded Repha character, no reordering needed. */ - const REPH_MODE_LOG_REPHA = 3; - /* Encoded Repha character, needs reordering. */ - /* - struct of indic_configs{ - KEY - script; - 0 - has_old_spec; - 1 - virama; - 2 - base_pos; - 3 - reph_pos; - 4 - reph_mode; - }; - */ - public static $indic_configs = [ - /* index is SCRIPT_number from UCDN */ - 9 => [\true, 0x94d, 1, 10, 0], - 10 => [\true, 0x9cd, 1, 9, 0], - 11 => [\true, 0xa4d, 1, 7, 0], - 12 => [\true, 0xacd, 1, 10, 0], - 13 => [\true, 0xb4d, 1, 5, 0], - 14 => [\true, 0xbcd, 1, 12, 0], - 15 => [\true, 0xc4d, 1, 12, 1], - 16 => [\true, 0xccd, 1, 12, 0], - 17 => [\true, 0xd4d, 1, 5, 3], - 18 => [\false, 0xdca, 0, 5, 1], - /* Sinhala */ - 30 => [\false, 0x17d2, 0, 10, 2], - /* Khmer */ - 84 => [\false, 0xa9c0, 1, 10, 0], - ]; - /* - // from "hb-ot-shape-complex-indic-table.cc" - - const ISC_A = 0; // INDIC_SYLLABIC_CATEGORY_AVAGRAHA Avagraha - const ISC_Bi = 8; // INDIC_SYLLABIC_CATEGORY_BINDU Bindu - const ISC_C = 1; // INDIC_SYLLABIC_CATEGORY_CONSONANT Consonant - const ISC_CD = 1; // INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD Consonant_Dead - const ISC_CF = 17; // INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL Consonant_Final - const ISC_CHL = 1; // INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER Consonant_Head_Letter - const ISC_CM = 17; // INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL Consonant_Medial - const ISC_CP = 11; // INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER Consonant_Placeholder - const ISC_CR = 15; // INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA Consonant_Repha - const ISC_CS = 1; // INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED Consonant_Subjoined - const ISC_ML = 0; // INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER Modifying_Letter - const ISC_N = 3; // INDIC_SYLLABIC_CATEGORY_NUKTA Nukta - const ISC_x = 0; // INDIC_SYLLABIC_CATEGORY_OTHER Other - const ISC_RS = 13; // INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER Register_Shifter - const ISC_TL = 0; // INDIC_SYLLABIC_CATEGORY_TONE_LETTER Tone_Letter - const ISC_TM = 3; // INDIC_SYLLABIC_CATEGORY_TONE_MARK Tone_Mark - const ISC_V = 4; // INDIC_SYLLABIC_CATEGORY_VIRAMA Virama - const ISC_Vs = 8; // INDIC_SYLLABIC_CATEGORY_VISARGA Visarga - const ISC_Vo = 2; // INDIC_SYLLABIC_CATEGORY_VOWEL Vowel - const ISC_M = 7; // INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT Vowel_Dependent - const ISC_VI = 2; // INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT Vowel_Independent - const IMC_B = 8; // INDIC_MATRA_CATEGORY_BOTTOM Bottom - const IMC_BR = 11; // INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT Bottom_And_Right - const IMC_I = 15; // INDIC_MATRA_CATEGORY_INVISIBLE Invisible - const IMC_L = 3; // INDIC_MATRA_CATEGORY_LEFT Left - const IMC_LR = 11; // INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT Left_And_Right - const IMC_x = 15; // INDIC_MATRA_CATEGORY_NOT_APPLICABLE Not_Applicable - const IMC_O = 5; // INDIC_MATRA_CATEGORY_OVERSTRUCK Overstruck - const IMC_R = 11; // INDIC_MATRA_CATEGORY_RIGHT Right - const IMC_T = 6; // INDIC_MATRA_CATEGORY_TOP Top - const IMC_TB = 8; // INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM Top_And_Bottom - const IMC_TBR = 11; // INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT Top_And_Bottom_And_Right - const IMC_TL = 6; // INDIC_MATRA_CATEGORY_TOP_AND_LEFT Top_And_Left - const IMC_TLR = 11; // INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT Top_And_Left_And_Right - const IMC_TR = 11; // INDIC_MATRA_CATEGORY_TOP_AND_RIGHT Top_And_Right - const IMC_VOL = 2; // INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT Visual_Order_Left - If in original table = _(C,x), that = ISC_C,IMC_x - Value is IMC_x << 8 (or IMC_x * 256) = 3840 - plus ISC_C = 1, so = 3841 - */ - public static $indic_table = [ - /* Devanagari (0900..097F) */ - /* 0900 */ - 3848, - 3848, - 3848, - 3848, - 3842, - 3842, - 3842, - 3842, - /* 0908 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - /* 0910 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0918 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0920 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0928 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0930 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0938 */ - 3841, - 3841, - 1543, - 2823, - 3843, - 3840, - 2823, - 775, - /* 0940 */ - 2823, - 2055, - 2055, - 2055, - 2055, - 1543, - 1543, - 1543, - /* 0948 */ - 1543, - 2823, - 2823, - 2823, - 2823, - 2052, - 775, - 2823, - /* 0950 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 1543, - 2055, - 2055, - /* 0958 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0960 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 0968 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0970 */ - 3840, - 3840, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - /* 0978 */ - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* Bengali (0980..09FF) */ - /* 0980 */ - 3840, - 3848, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0988 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - 3840, - 3842, - /* 0990 */ - 3842, - 3840, - 3840, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0998 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 09A0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 09A8 */ - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 09B0 */ - 3841, - 3840, - 3841, - 3840, - 3840, - 3840, - 3841, - 3841, - /* 09B8 */ - 3841, - 3841, - 3840, - 3840, - 3843, - 3840, - 2823, - 775, - /* 09C0 */ - 2823, - 2055, - 2055, - 2055, - 2055, - 3840, - 3840, - 775, - /* 09C8 */ - 775, - 3840, - 3840, - 2823, - 2823, - 2052, - 3841, - 3840, - /* 09D0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 2823, - /* 09D8 */ - 3840, - 3840, - 3840, - 3840, - 3841, - 3841, - 3840, - 3841, - /* 09E0 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 09E8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 09F0 */ - 3841, - 3841, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 09F8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Gurmukhi (0A00..0A7F) */ - /* 0A00 */ - 3840, - 3848, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0A08 */ - 3842, - 3842, - 3842, - 3840, - 3840, - 3840, - 3840, - 3842, - /* 0A10 */ - 3842, - 3840, - 3840, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0A18 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0A20 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0A28 */ - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0A30 */ - 3841, - 3840, - 3841, - 3841, - 3840, - 3841, - 3841, - 3840, - /* 0A38 */ - 3841, - 3841, - 3840, - 3840, - 3843, - 3840, - 2823, - 775, - /* 0A40 */ - 2823, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - 1543, - /* 0A48 */ - 1543, - 3840, - 3840, - 1543, - 1543, - 2052, - 3840, - 3840, - /* 0A50 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0A58 */ - 3840, - 3841, - 3841, - 3841, - 3841, - 3840, - 3841, - 3840, - /* 0A60 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0A68 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0A70 */ - 3848, - 3840, - 13841, - 13841, - 3840, - 3857, - 3840, - 3840, - /* 0A78 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Gujarati (0A80..0AFF) */ - /* 0A80 */ - 3840, - 3848, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0A88 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - 3842, - /* 0A90 */ - 3842, - 3842, - 3840, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0A98 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0AA0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0AA8 */ - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0AB0 */ - 3841, - 3840, - 3841, - 3841, - 3840, - 3841, - 3841, - 3841, - /* 0AB8 */ - 3841, - 3841, - 3840, - 3840, - 3843, - 3840, - 2823, - 775, - /* 0AC0 */ - 2823, - 2055, - 2055, - 2055, - 2055, - 1543, - 3840, - 1543, - /* 0AC8 */ - 1543, - 2823, - 3840, - 2823, - 2823, - 2052, - 3840, - 3840, - /* 0AD0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0AD8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0AE0 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 0AE8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0AF0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0AF8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Oriya (0B00..0B7F) */ - /* 0B00 */ - 3840, - 3848, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0B08 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - 3840, - 3842, - /* 0B10 */ - 3842, - 3840, - 3840, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0B18 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0B20 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0B28 */ - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0B30 */ - 3841, - 3840, - 3841, - 3841, - 3840, - 3841, - 3841, - 3841, - /* 0B38 */ - 3841, - 3841, - 3840, - 3840, - 3843, - 3840, - 2823, - 1543, - /* 0B40 */ - 2823, - 2055, - 2055, - 2055, - 2055, - 3840, - 3840, - 775, - /* 0B48 */ - 1543, - 3840, - 3840, - 2823, - 2823, - 2052, - 3840, - 3840, - /* 0B50 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 1543, - 2823, - /* 0B58 */ - 3840, - 3840, - 3840, - 3840, - 3841, - 3841, - 3840, - 3841, - /* 0B60 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 0B68 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0B70 */ - 3840, - 3841, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0B78 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Tamil (0B80..0BFF) */ - /* 0B80 */ - 3840, - 3840, - 3848, - 3840, - 3840, - 3842, - 3842, - 3842, - /* 0B88 */ - 3842, - 3842, - 3842, - 3840, - 3840, - 3840, - 3842, - 3842, - /* 0B90 */ - 3842, - 3840, - 3842, - 3842, - 3842, - 3841, - 3840, - 3840, - /* 0B98 */ - 3840, - 3841, - 3841, - 3840, - 3841, - 3840, - 3841, - 3841, - /* 0BA0 */ - 3840, - 3840, - 3840, - 3841, - 3841, - 3840, - 3840, - 3840, - /* 0BA8 */ - 3841, - 3841, - 3841, - 3840, - 3840, - 3840, - 3841, - 3841, - /* 0BB0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0BB8 */ - 3841, - 3841, - 3840, - 3840, - 3840, - 3840, - 2823, - 2823, - /* 0BC0 */ - 1543, - 2055, - 2055, - 3840, - 3840, - 3840, - 775, - 775, - /* 0BC8 */ - 775, - 3840, - 2823, - 2823, - 2823, - 1540, - 3840, - 3840, - /* 0BD0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 2823, - /* 0BD8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0BE0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0BE8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0BF0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0BF8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Telugu (0C00..0C7F) */ - /* 0C00 */ - 3840, - 3848, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0C08 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - 3842, - 3842, - /* 0C10 */ - 3842, - 3840, - 3842, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0C18 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0C20 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0C28 */ - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0C30 */ - 3841, - 3841, - 3841, - 3841, - 3840, - 3841, - 3841, - 3841, - /* 0C38 */ - 3841, - 3841, - 3840, - 3840, - 3840, - 3840, - 1543, - 1543, - /* 0C40 */ - 1543, - 2823, - 2823, - 2823, - 2823, - 3840, - 1543, - 1543, - /* 0C48 */ - 2055, - 3840, - 1543, - 1543, - 1543, - 1540, - 3840, - 3840, - /* 0C50 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 1543, - 2055, - 3840, - /* 0C58 */ - 3841, - 3841, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0C60 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 0C68 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0C70 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0C78 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Kannada (0C80..0CFF) */ - /* 0C80 */ - 3840, - 3840, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0C88 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - 3842, - 3842, - /* 0C90 */ - 3842, - 3840, - 3842, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0C98 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0CA0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0CA8 */ - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0CB0 */ - 3841, - 3841, - 3841, - 3841, - 3840, - 3841, - 3841, - 3841, - /* 0CB8 */ - 3841, - 3841, - 3840, - 3840, - 3843, - 3840, - 2823, - 1543, - /* 0CC0 */ - 2823, - 2823, - 2823, - 2823, - 2823, - 3840, - 1543, - 2823, - /* 0CC8 */ - 2823, - 3840, - 2823, - 2823, - 1543, - 1540, - 3840, - 3840, - /* 0CD0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 2823, - 2823, - 3840, - /* 0CD8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3841, - 3840, - /* 0CE0 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 0CE8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0CF0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0CF8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Malayalam (0D00..0D7F) */ - /* 0D00 */ - 3840, - 3840, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0D08 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - 3842, - 3842, - /* 0D10 */ - 3842, - 3840, - 3842, - 3842, - 3842, - 3841, - 3841, - 3841, - /* 0D18 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0D20 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0D28 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0D30 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0D38 */ - 3841, - 3841, - 3841, - 3840, - 3840, - 3840, - 2823, - 2823, - /* 0D40 */ - 2823, - 2823, - 2823, - 2055, - 2055, - 3840, - 775, - 775, - /* 0D48 */ - 775, - 3840, - 2823, - 2823, - 2823, - 1540, - 3855, - 3840, - /* 0D50 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 2823, - /* 0D58 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0D60 */ - 3842, - 3842, - 2055, - 2055, - 3840, - 3840, - 3840, - 3840, - /* 0D68 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0D70 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0D78 */ - 3840, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* Sinhala (0D80..0DFF) */ - /* 0D80 */ - 3840, - 3840, - 3848, - 3848, - 3840, - 3842, - 3842, - 3842, - /* 0D88 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - /* 0D90 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3840, - /* 0D98 */ - 3840, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0DA0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0DA8 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0DB0 */ - 3841, - 3841, - 3840, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 0DB8 */ - 3841, - 3841, - 3841, - 3841, - 3840, - 3841, - 3840, - 3840, - /* 0DC0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3840, - /* 0DC8 */ - 3840, - 3840, - 1540, - 3840, - 3840, - 3840, - 3840, - 2823, - /* 0DD0 */ - 2823, - 2823, - 1543, - 1543, - 2055, - 3840, - 2055, - 3840, - /* 0DD8 */ - 2823, - 775, - 1543, - 775, - 2823, - 2823, - 2823, - 2823, - /* 0DE0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0DE8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 0DF0 */ - 3840, - 3840, - 2823, - 2823, - 3840, - 3840, - 3840, - 3840, - /* 0DF8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Vedic Extensions (1CD0..1CFF) */ - /* 1CD0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1CD8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1CE0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1CE8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1CF0 */ - 3840, - 3840, - 3848, - 3848, - 3840, - 3840, - 3840, - 3840, - /* 1CF8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - ]; - public static $khmer_table = [ - /* Khmer (1780..17FF) */ - /* 1780 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1788 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1790 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1798 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 17A0 */ - 3841, - 3841, - 3841, - 3842, - 3842, - 3842, - 3842, - 3842, - /* 17A8 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - /* 17B0 */ - 3842, - 3842, - 3842, - 3842, - 3840, - 3840, - 2823, - 1543, - /* 17B8 */ - 1543, - 1543, - 1543, - 2055, - 2055, - 2055, - 1543, - 2823, - /* 17C0 */ - 2823, - 775, - 775, - 775, - 2823, - 2823, - 3848, - 3848, - /* 17C8 */ - 2823, - 3853, - 3853, - 3840, - 3855, - 3840, - 3840, - 3840, - /* 17D0 */ - 3840, - 1540, - 3844, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 17D8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 17E0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 17E8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 17F0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 17F8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - ]; - // from "hb-ot-shape-complex-indic-table.cc" - public static function indic_get_categories($u) - { - if (0x900 <= $u && $u <= 0xdff) { - return self::$indic_table[$u - 0x900 + 0]; - // offset 0 for Most "indic" - } - if (0x1cd0 <= $u && $u <= 0x1d00) { - return self::$indic_table[$u - 0x1cd0 + 1152]; - // offset for Vedic extensions - } - if (0x1780 <= $u && $u <= 0x17ff) { - return self::$khmer_table[$u - 0x1780]; - // Khmer - } - if ($u == 0xa0) { - return 3851; - // (ISC_CP | (IMC_x << 8)) - } - if ($u == 0x25cc) { - return 3851; - // (ISC_CP | (IMC_x << 8)) - } - return 3840; - // (ISC_x | (IMC_x << 8)) - } - // BELOW from hb-ot-shape-complex-indic.cc - /* - * Indic shaper. - */ - public static function IN_HALF_BLOCK($u, $Base) - { - return ($u & ~0x7f) == $Base; - } - public static function IS_DEVA($u) - { - return self::IN_HALF_BLOCK($u, 0x900); - } - public static function IS_BENG($u) - { - return self::IN_HALF_BLOCK($u, 0x980); - } - public static function IS_GURU($u) - { - return self::IN_HALF_BLOCK($u, 0xa00); - } - public static function IS_GUJR($u) - { - return self::IN_HALF_BLOCK($u, 0xa80); - } - public static function IS_ORYA($u) - { - return self::IN_HALF_BLOCK($u, 0xb00); - } - public static function IS_TAML($u) - { - return self::IN_HALF_BLOCK($u, 0xb80); - } - public static function IS_TELU($u) - { - return self::IN_HALF_BLOCK($u, 0xc00); - } - public static function IS_KNDA($u) - { - return self::IN_HALF_BLOCK($u, 0xc80); - } - public static function IS_MLYM($u) - { - return self::IN_HALF_BLOCK($u, 0xd00); - } - public static function IS_SINH($u) - { - return self::IN_HALF_BLOCK($u, 0xd80); - } - public static function IS_KHMR($u) - { - return self::IN_HALF_BLOCK($u, 0x1780); - } - public static function MATRA_POS_LEFT($u) - { - return self::POS_PRE_M; - } - public static function MATRA_POS_RIGHT($u) - { - return self::IS_DEVA($u) ? self::POS_AFTER_SUB : (self::IS_BENG($u) ? self::POS_AFTER_POST : (self::IS_GURU($u) ? self::POS_AFTER_POST : (self::IS_GUJR($u) ? self::POS_AFTER_POST : (self::IS_ORYA($u) ? self::POS_AFTER_POST : (self::IS_TAML($u) ? self::POS_AFTER_POST : (self::IS_TELU($u) ? $u <= 0xc42 ? self::POS_BEFORE_SUB : self::POS_AFTER_SUB : (self::IS_KNDA($u) ? $u < 0xcc3 || $u > 0xcd6 ? self::POS_BEFORE_SUB : self::POS_AFTER_SUB : (self::IS_MLYM($u) ? self::POS_AFTER_POST : (self::IS_SINH($u) ? self::POS_AFTER_SUB : (self::IS_KHMR($u) ? self::POS_AFTER_POST : self::POS_AFTER_SUB)))))))))); - /* default */ - } - public static function MATRA_POS_TOP($u) - { - return self::IS_DEVA($u) ? self::POS_AFTER_SUB : (self::IS_GURU($u) ? self::POS_AFTER_POST : (self::IS_GUJR($u) ? self::POS_AFTER_SUB : (self::IS_ORYA($u) ? self::POS_AFTER_MAIN : (self::IS_TAML($u) ? self::POS_AFTER_SUB : (self::IS_TELU($u) ? self::POS_BEFORE_SUB : (self::IS_KNDA($u) ? self::POS_BEFORE_SUB : (self::IS_SINH($u) ? self::POS_AFTER_SUB : (self::IS_KHMR($u) ? self::POS_AFTER_POST : self::POS_AFTER_SUB)))))))); - /* default */ - } - public static function MATRA_POS_BOTTOM($u) - { - return self::IS_DEVA($u) ? self::POS_AFTER_SUB : (self::IS_BENG($u) ? self::POS_AFTER_SUB : (self::IS_GURU($u) ? self::POS_AFTER_POST : (self::IS_GUJR($u) ? self::POS_AFTER_POST : (self::IS_ORYA($u) ? self::POS_AFTER_SUB : (self::IS_TAML($u) ? self::POS_AFTER_POST : (self::IS_TELU($u) ? self::POS_BEFORE_SUB : (self::IS_KNDA($u) ? self::POS_BEFORE_SUB : (self::IS_MLYM($u) ? self::POS_AFTER_POST : (self::IS_SINH($u) ? self::POS_AFTER_SUB : (self::IS_KHMR($u) ? self::POS_AFTER_POST : self::POS_AFTER_SUB)))))))))); - /* default */ - } - public static function matra_position($u, $side) - { - switch ($side) { - case self::POS_PRE_C: - return self::MATRA_POS_LEFT($u); - case self::POS_POST_C: - return self::MATRA_POS_RIGHT($u); - case self::POS_ABOVE_C: - return self::MATRA_POS_TOP($u); - case self::POS_BELOW_C: - return self::MATRA_POS_BOTTOM($u); - } - return $side; - } - // vowel matras that have to be split into two parts. - // From Harfbuzz (old) - // New HarfBuzz uses /src/hb-ucdn/ucdn.c and unicodedata_db.h for full method of decomposition for all characters - // Should always fully decompose and then recompose back, but we will just do the split matras - public static function decompose_indic($ab) - { - $sub = []; - switch ($ab) { - /* - * Decompose split matras. - */ - /* bengali */ - case 0x9cb: - $sub[0] = 0x9c7; - $sub[1] = 0x9be; - return $sub; - case 0x9cc: - $sub[0] = 0x9c7; - $sub[1] = 0x9d7; - return $sub; - /* oriya */ - case 0xb48: - $sub[0] = 0xb47; - $sub[1] = 0xb56; - return $sub; - case 0xb4b: - $sub[0] = 0xb47; - $sub[1] = 0xb3e; - return $sub; - case 0xb4c: - $sub[0] = 0xb47; - $sub[1] = 0xb57; - return $sub; - /* tamil */ - case 0xbca: - $sub[0] = 0xbc6; - $sub[1] = 0xbbe; - return $sub; - case 0xbcb: - $sub[0] = 0xbc7; - $sub[1] = 0xbbe; - return $sub; - case 0xbcc: - $sub[0] = 0xbc6; - $sub[1] = 0xbd7; - return $sub; - /* telugu */ - case 0xc48: - $sub[0] = 0xc46; - $sub[1] = 0xc56; - return $sub; - /* kannada */ - case 0xcc0: - $sub[0] = 0xcbf; - $sub[1] = 0xcd5; - return $sub; - case 0xcc7: - $sub[0] = 0xcc6; - $sub[1] = 0xcd5; - return $sub; - case 0xcc8: - $sub[0] = 0xcc6; - $sub[1] = 0xcd6; - return $sub; - case 0xcca: - $sub[0] = 0xcc6; - $sub[1] = 0xcc2; - return $sub; - case 0xccb: - $sub[0] = 0xcc6; - $sub[1] = 0xcc2; - $sub[2] = 0xcd5; - return $sub; - /* malayalam */ - case 0xd4a: - $sub[0] = 0xd46; - $sub[1] = 0xd3e; - return $sub; - case 0xd4b: - $sub[0] = 0xd47; - $sub[1] = 0xd3e; - return $sub; - case 0xd4c: - $sub[0] = 0xd46; - $sub[1] = 0xd57; - return $sub; - /* sinhala */ - // NB Some fonts break with these Sinhala decomps (although this is Uniscribe spec) - // Can check if character would be substituted by pstf and only decompose if true - // e.g. if (isset($GSUBdata['pstf'][$ab])) - would need to pass $GSUBdata as parameter to this function - case 0xdda: - $sub[0] = 0xdd9; - $sub[1] = 0xdca; - return $sub; - case 0xddc: - $sub[0] = 0xdd9; - $sub[1] = 0xdcf; - return $sub; - case 0xddd: - $sub[0] = 0xdd9; - $sub[1] = 0xdcf; - $sub[2] = 0xdca; - return $sub; - case 0xdde: - $sub[0] = 0xdd9; - $sub[1] = 0xddf; - return $sub; - /* khmer */ - case 0x17be: - $sub[0] = 0x17c1; - $sub[1] = 0x17be; - return $sub; - case 0x17bf: - $sub[0] = 0x17c1; - $sub[1] = 0x17bf; - return $sub; - case 0x17c0: - $sub[0] = 0x17c1; - $sub[1] = 0x17c0; - return $sub; - case 0x17c4: - $sub[0] = 0x17c1; - $sub[1] = 0x17c4; - return $sub; - case 0x17c5: - $sub[0] = 0x17c1; - $sub[1] = 0x17c5; - return $sub; - /* tibetan - included here although does not use Inidc shaper in other ways */ - case 0xf73: - $sub[0] = 0xf71; - $sub[1] = 0xf72; - return $sub; - case 0xf75: - $sub[0] = 0xf71; - $sub[1] = 0xf74; - return $sub; - case 0xf76: - $sub[0] = 0xfb2; - $sub[1] = 0xf80; - return $sub; - case 0xf77: - $sub[0] = 0xfb2; - $sub[1] = 0xf81; - return $sub; - case 0xf78: - $sub[0] = 0xfb3; - $sub[1] = 0xf80; - return $sub; - case 0xf79: - $sub[0] = 0xfb3; - $sub[1] = 0xf71; - $sub[2] = 0xf80; - return $sub; - case 0xf81: - $sub[0] = 0xf71; - $sub[1] = 0xf80; - return $sub; - } - return \false; - } - public static function bubble_sort(&$arr, $start, $len) - { - if ($len < 2) { - return; - } - $k = $start + $len - 2; - while ($k >= $start) { - for ($j = $start; $j <= $k; $j++) { - if ($arr[$j]['indic_position'] > $arr[$j + 1]['indic_position']) { - $t = $arr[$j]; - $arr[$j] = $arr[$j + 1]; - $arr[$j + 1] = $t; - } - } - $k--; - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Shaper/Myanmar.php b/dependencies/mpdf/mpdf/src/Shaper/Myanmar.php deleted file mode 100644 index 9ad8e71..0000000 --- a/dependencies/mpdf/mpdf/src/Shaper/Myanmar.php +++ /dev/null @@ -1,711 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Shaper; - -class Myanmar -{ - /* FROM hb-ot-shape-complex-indic-private.hh */ - // indic_category - const OT_X = 0; - const OT_C = 1; - const OT_V = 2; - const OT_N = 3; - const OT_H = 4; - const OT_ZWNJ = 5; - const OT_ZWJ = 6; - const OT_M = 7; - /* Matra or Dependent Vowel */ - const OT_SM = 8; - const OT_VD = 9; - const OT_A = 10; - const OT_NBSP = 11; - const OT_DOTTEDCIRCLE = 12; - /* Not in the spec, but special in Uniscribe. /Very very/ special! */ - const OT_RS = 13; - /* Register Shifter, used in Khmer OT spec */ - const OT_COENG = 14; - const OT_REPHA = 15; - const OT_RA = 16; - /* Not explicitly listed in the OT spec, but used in the grammar. */ - const OT_CM = 17; - /* FROM hb-ot-shape-complex-myanmar.hh */ - // myanmar_category - const OT_DB = 3; - // same as Indic::OT_N; /* Dot below */ - const OT_GB = 12; - // same as Indic::OT_DOTTEDCIRCLE; - const OT_AS = 18; - /* Asat */ - const OT_D = 19; - /* Digits except zero */ - const OT_D0 = 20; - /* Digit zero */ - const OT_MH = 21; - /* Various consonant medial types */ - const OT_MR = 22; - /* Various consonant medial types */ - const OT_MW = 23; - /* Various consonant medial types */ - const OT_MY = 24; - /* Various consonant medial types */ - const OT_PT = 25; - /* Pwo and other tones */ - const OT_VABV = 26; - const OT_VBLW = 27; - const OT_VPRE = 28; - const OT_VPST = 29; - const OT_VS = 30; - /* Variation selectors */ - /* Visual positions in a syllable from left to right. */ - /* FROM hb-ot-shape-complex-myanmar-private.hh */ - // myanmar_position - const POS_START = 0; - const POS_RA_TO_BECOME_REPH = 1; - const POS_PRE_M = 2; - const POS_PRE_C = 3; - const POS_BASE_C = 4; - const POS_AFTER_MAIN = 5; - const POS_ABOVE_C = 6; - const POS_BEFORE_SUB = 7; - const POS_BELOW_C = 8; - const POS_AFTER_SUB = 9; - const POS_BEFORE_POST = 10; - const POS_POST_C = 11; - const POS_AFTER_POST = 12; - const POS_FINAL_C = 13; - const POS_SMVD = 14; - const POS_END = 15; - // Based on myanmar_category used to make string to find syllables - // OT_ to string character (using e.g. OT_C from MYANMAR) hb-ot-shape-complex-myanmar-private.hh - public static $myanmar_category_char = [ - 'x', - 'C', - 'V', - 'N', - 'H', - 'Z', - 'J', - 'x', - 'S', - 'x', - 'A', - 'x', - 'D', - 'x', - 'x', - 'x', - 'R', - 'x', - 'a', - /* As Asat */ - 'd', - /* Digits except zero */ - 'o', - /* Digit zero */ - 'k', - /* Medial types */ - 'l', - /* Medial types */ - 'm', - /* Medial types */ - 'n', - /* Medial types */ - 'p', - /* Pwo and other tones */ - 'v', - /* Vowel aboVe */ - 'b', - /* Vowel Below */ - 'e', - /* Vowel prE */ - 't', - /* Vowel posT */ - 's', - ]; - public static function set_myanmar_properties(&$info) - { - $u = $info['uni']; - $type = self::myanmar_get_categories($u); - $cat = $type & 0x7f; - $pos = $type >> 8; - /* - * Re-assign category - * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze - */ - if (self::in_range($u, 0xfe00, 0xfe0f)) { - $cat = self::OT_VS; - } elseif ($u == 0x200c) { - $cat = self::OT_ZWNJ; - } elseif ($u == 0x200d) { - $cat = self::OT_ZWJ; - } - switch ($u) { - case 0x2d: - case 0xa0: - case 0xd7: - case 0x2012: - case 0x2013: - case 0x2014: - case 0x2015: - case 0x2022: - case 0x25cc: - case 0x25fb: - case 0x25fc: - case 0x25fd: - case 0x25fe: - $cat = self::OT_GB; - break; - case 0x1004: - case 0x101b: - case 0x105a: - $cat = self::OT_RA; - break; - case 0x1032: - case 0x1036: - $cat = self::OT_A; - break; - case 0x103a: - $cat = self::OT_AS; - break; - case 0x1041: - case 0x1042: - case 0x1043: - case 0x1044: - case 0x1045: - case 0x1046: - case 0x1047: - case 0x1048: - case 0x1049: - case 0x1090: - case 0x1091: - case 0x1092: - case 0x1093: - case 0x1094: - case 0x1095: - case 0x1096: - case 0x1097: - case 0x1098: - case 0x1099: - $cat = self::OT_D; - break; - case 0x1040: - $cat = self::OT_D; - /* XXX The spec says D0, but Uniscribe doesn't seem to do. */ - break; - case 0x103e: - case 0x1060: - $cat = self::OT_MH; - break; - case 0x103c: - $cat = self::OT_MR; - break; - case 0x103d: - case 0x1082: - $cat = self::OT_MW; - break; - case 0x103b: - case 0x105e: - case 0x105f: - $cat = self::OT_MY; - break; - case 0x1063: - case 0x1064: - case 0x1069: - case 0x106a: - case 0x106b: - case 0x106c: - case 0x106d: - case 0xaa7b: - $cat = self::OT_PT; - break; - case 0x1038: - case 0x1087: - case 0x1088: - case 0x1089: - case 0x108a: - case 0x108b: - case 0x108c: - case 0x108d: - case 0x108f: - case 0x109a: - case 0x109b: - case 0x109c: - $cat = self::OT_SM; - break; - } - if ($cat == self::OT_M) { - switch ($pos) { - case self::POS_PRE_C: - $cat = self::OT_VPRE; - $pos = self::POS_PRE_M; - break; - case self::POS_ABOVE_C: - $cat = self::OT_VABV; - break; - case self::POS_BELOW_C: - $cat = self::OT_VBLW; - break; - case self::POS_POST_C: - $cat = self::OT_VPST; - break; - } - } - $info['myanmar_category'] = $cat; - $info['myanmar_position'] = $pos; - } - // syllable_type - const CONSONANT_SYLLABLE = 0; - const BROKEN_CLUSTER = 3; - const NON_MYANMAR_CLUSTER = 4; - public static function set_syllables(&$o, $s, &$broken_syllables) - { - $ptr = 0; - $syllable_serial = 1; - $broken_syllables = \false; - while ($ptr < \strlen($s)) { - $match = ''; - $syllable_length = 1; - $syllable_type = self::NON_MYANMAR_CLUSTER; - // CONSONANT_SYLLABLE Consonant syllable - // From OT spec: - if (\preg_match('/^(RaH)?([C|R]|V|d|D)[s]?(H([C|R|V])[s]?)*(H|[a]*[n]?[l]?((m[k]?|k)[a]?)?[e]*[v]*[b]*[A]*(N[a]?)?(t[k]?[a]*[v]*[A]*(N[a]?)?)*(p[A]*(N[a]?)?)*S*[J|Z]?)/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::CONSONANT_SYLLABLE; - } elseif (\preg_match('/^(RaH)?s?(H|[a]*[n]?[l]?((m[k]?|k)[a]?)?[e]*[v]*[b]*[A]*(N[a]?)?(t[k]?[a]*[v]*[A]*(N[a]?)?)*(p[A]*(N[a]?)?)*S*[J|Z]?)/', \substr($s, $ptr), $ma)) { - if (\strlen($ma[0])) { - // May match blank - $syllable_length = \strlen($ma[0]); - $syllable_type = self::BROKEN_CLUSTER; - $broken_syllables = \true; - } - } - for ($i = $ptr; $i < $ptr + $syllable_length; $i++) { - $o[$i]['syllable'] = $syllable_serial << 4 | $syllable_type; - } - $ptr += $syllable_length; - $syllable_serial++; - if ($syllable_serial == 16) { - $syllable_serial = 1; - } - } - } - public static function reordering(&$info, $GSUBdata, $broken_syllables, $dottedcircle) - { - if ($broken_syllables && $dottedcircle) { - self::insert_dotted_circles($info, $dottedcircle); - } - $count = \count($info); - if (!$count) { - return; - } - $last = 0; - $last_syllable = $info[0]['syllable']; - for ($i = 1; $i < $count; $i++) { - if ($last_syllable != $info[$i]['syllable']) { - self::reordering_syllable($info, $GSUBdata, $last, $i); - $last = $i; - $last_syllable = $info[$last]['syllable']; - } - } - self::reordering_syllable($info, $GSUBdata, $last, $count); - } - public static function insert_dotted_circles(&$info, $dottedcircle) - { - $idx = 0; - $last_syllable = 0; - while ($idx < \count($info)) { - $syllable = $info[$idx]['syllable']; - $syllable_type = $syllable & 0xf; - if ($last_syllable != $syllable && $syllable_type == self::BROKEN_CLUSTER) { - $last_syllable = $syllable; - $dottedcircle[0]['syllable'] = $info[$idx]['syllable']; - \array_splice($info, $idx, 0, $dottedcircle); - } else { - $idx++; - } - } - // In case of final bloken cluster... - $syllable = $info[$idx]['syllable']; - $syllable_type = $syllable & 0xf; - if ($last_syllable != $syllable && $syllable_type == self::BROKEN_CLUSTER) { - $dottedcircle[0]['syllable'] = $info[$idx]['syllable']; - \array_splice($info, $idx, 0, $dottedcircle); - } - } - /* Rules from: - * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */ - public static function reordering_syllable(&$info, $GSUBdata, $start, $end) - { - /* vowel_syllable: We made the vowels look like consonants. So uses the consonant logic! */ - /* broken_cluster: We already inserted dotted-circles, so just call the standalone_cluster. */ - $syllable_type = $info[$start]['syllable'] & 0xf; - if ($syllable_type == self::NON_MYANMAR_CLUSTER) { - return; - } - if ($syllable_type == self::BROKEN_CLUSTER) { - //if ($uniscribe_bug_compatible) { - /* For dotted-circle, this is what Uniscribe does: - * If dotted-circle is the last glyph, it just does nothing. - * i.e. It doesn't form Reph. */ - if ($info[$end - 1]['myanmar_category'] == self::OT_DOTTEDCIRCLE) { - return; - } - } - $base = $end; - $has_reph = \false; - $limit = $start; - if ($start + 3 <= $end && $info[$start]['myanmar_category'] == self::OT_RA && $info[$start + 1]['myanmar_category'] == self::OT_AS && $info[$start + 2]['myanmar_category'] == self::OT_H) { - $limit += 3; - $base = $start; - $has_reph = \true; - } - if (!$has_reph) { - $base = $limit; - } - for ($i = $limit; $i < $end; $i++) { - if (self::is_consonant($info[$i])) { - $base = $i; - break; - } - } - /* Reorder! */ - $i = $start; - for (; $i < $start + ($has_reph ? 3 : 0); $i++) { - $info[$i]['myanmar_position'] = self::POS_AFTER_MAIN; - } - for (; $i < $base; $i++) { - $info[$i]['myanmar_position'] = self::POS_PRE_C; - } - if ($i < $end) { - $info[$i]['myanmar_position'] = self::POS_BASE_C; - $i++; - } - $pos = self::POS_AFTER_MAIN; - /* The following loop may be ugly, but it implements all of - * Myanmar reordering! */ - for (; $i < $end; $i++) { - if ($info[$i]['myanmar_category'] == self::OT_MR) { - /* Pre-base reordering */ - $info[$i]['myanmar_position'] = self::POS_PRE_C; - continue; - } - if ($info[$i]['myanmar_position'] < self::POS_BASE_C) { - /* Left matra */ - continue; - } - if ($pos == self::POS_AFTER_MAIN && $info[$i]['myanmar_category'] == self::OT_VBLW) { - $pos = self::POS_BELOW_C; - $info[$i]['myanmar_position'] = $pos; - continue; - } - if ($pos == self::POS_BELOW_C && $info[$i]['myanmar_category'] == self::OT_A) { - $info[$i]['myanmar_position'] = self::POS_BEFORE_SUB; - continue; - } - if ($pos == self::POS_BELOW_C && $info[$i]['myanmar_category'] == self::OT_VBLW) { - $info[$i]['myanmar_position'] = $pos; - continue; - } - if ($pos == self::POS_BELOW_C && $info[$i]['myanmar_category'] != self::OT_A) { - $pos = self::POS_AFTER_SUB; - $info[$i]['myanmar_position'] = $pos; - continue; - } - $info[$i]['myanmar_position'] = $pos; - } - /* Sit tight, rock 'n roll! */ - self::bubble_sort($info, $start, $end - $start); - } - public static function is_one_of($info, $flags) - { - if (isset($info['is_ligature']) && $info['is_ligature']) { - return \false; - } - /* If it ligated, all bets are off. */ - return !!(self::FLAG($info['myanmar_category']) & $flags); - } - /* Vowels and placeholders treated as if they were consonants. */ - public static function is_consonant($info) - { - return self::is_one_of($info, self::FLAG(self::OT_C) | self::FLAG(self::OT_CM) | self::FLAG(self::OT_RA) | self::FLAG(self::OT_V) | self::FLAG(self::OT_NBSP) | self::FLAG(self::OT_GB)); - } - // From hb-private.hh - public static function in_range($u, $lo, $hi) - { - if ((($lo ^ $hi) & $lo) == 0 && (($lo ^ $hi) & $hi) == ($lo ^ $hi) && (($lo ^ $hi) & ($lo ^ $hi) + 1) == 0) { - return ($u & ~($lo ^ $hi)) == $lo; - } else { - return $lo <= $u && $u <= $hi; - } - } - // From hb-private.hh - public static function FLAG($x) - { - return 1 << $x; - } - public static function FLAG_RANGE($x, $y) - { - return self::FLAG($y + 1) - self::FLAG($x); - } - // BELOW from hb-ot-shape-complex-indic.cc - // see INDIC for details - public static $myanmar_table = [ - /* Myanmar (1000..109F) */ - /* 1000 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1008 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1010 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1018 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1020 */ - 3841, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - /* 1028 */ - 3842, - 3842, - 3842, - 2823, - 2823, - 1543, - 1543, - 2055, - /* 1030 */ - 2055, - 775, - 1543, - 1543, - 1543, - 1543, - 3848, - 3843, - /* 1038 */ - 3848, - 3844, - 1540, - 3857, - 3857, - 3857, - 3857, - 3841, - /* 1040 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1048 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1050 */ - 3841, - 3841, - 3842, - 3842, - 3842, - 3842, - 2823, - 2823, - /* 1058 */ - 2055, - 2055, - 3841, - 3841, - 3841, - 3841, - 3857, - 3857, - /* 1060 */ - 3857, - 3841, - 2823, - 3843, - 3843, - 3841, - 3841, - 2823, - /* 1068 */ - 2823, - 3843, - 3843, - 3843, - 3843, - 3843, - 3841, - 3841, - /* 1070 */ - 3841, - 1543, - 1543, - 1543, - 1543, - 3841, - 3841, - 3841, - /* 1078 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1080 */ - 3841, - 3841, - 3857, - 2823, - 775, - 1543, - 1543, - 3843, - /* 1088 */ - 3843, - 3843, - 3843, - 3843, - 3843, - 3843, - 3841, - 3843, - /* 1090 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1098 */ - 3840, - 3840, - 3843, - 3843, - 2823, - 1543, - 3840, - 3840, - /* Myanmar Extended-A (AA60..AA7F) */ - /* AA60 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* AA68 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* AA70 */ - 3840, - 3841, - 3841, - 3841, - 3840, - 3840, - 3840, - 3840, - /* AA78 */ - 3840, - 3840, - 3841, - 3843, - 3840, - 3840, - 3840, - 3840, - ]; - // from "hb-ot-shape-complex-indic-table.cc" - public static function myanmar_get_categories($u) - { - if (0x1000 <= $u && $u <= 0x109f) { - return self::$myanmar_table[$u - 0x1000 + 0]; - // offset 0 for Most "myanmar" - } - if (0xaa60 <= $u && $u <= 0xaa7f) { - return self::$myanmar_table[$u - 0xaa60 + 160]; - // offset for extensions - } - if ($u == 0xa0) { - return 3851; - // (ISC_CP | (IMC_x << 8)) - } - if ($u == 0x25cc) { - return 3851; - // (ISC_CP | (IMC_x << 8)) - } - return 3840; - // (ISC_x | (IMC_x << 8)) - } - public static function bubble_sort(&$arr, $start, $len) - { - if ($len < 2) { - return; - } - $k = $start + $len - 2; - while ($k >= $start) { - for ($j = $start; $j <= $k; $j++) { - if ($arr[$j]['myanmar_position'] > $arr[$j + 1]['myanmar_position']) { - $t = $arr[$j]; - $arr[$j] = $arr[$j + 1]; - $arr[$j + 1] = $t; - } - } - $k--; - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Shaper/Sea.php b/dependencies/mpdf/mpdf/src/Shaper/Sea.php deleted file mode 100644 index 5359ea7..0000000 --- a/dependencies/mpdf/mpdf/src/Shaper/Sea.php +++ /dev/null @@ -1,652 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Shaper; - -class Sea -{ - // South East Asian shaper - // sea_category - const OT_X = 0; - const OT_C = 1; - const OT_IV = 2; - # Independent Vowel - const OT_T = 3; - # Tone Marks - const OT_H = 4; - # Halant - const OT_A = 10; - # Anusvara - const OT_GB = 12; - # Generic Base (OT_DOTTEDCIRCLE in Indic) - const OT_CM = 17; - # Consonant Medial - const OT_MR = 22; - # Medial Ra - const OT_VABV = 26; - const OT_VBLW = 27; - const OT_VPRE = 28; - const OT_VPST = 29; - // ? From Indic categories - const OT_ZWNJ = 5; - const OT_ZWJ = 6; - const OT_M = 7; - const OT_SM = 8; - const OT_VD = 9; - const OT_NBSP = 11; - const OT_RS = 13; - const OT_COENG = 14; - const OT_REPHA = 15; - const OT_RA = 16; - /* Visual positions in a syllable from left to right. */ - // sea_position - const POS_START = 0; - const POS_RA_TO_BECOME_REPH = 1; - const POS_PRE_M = 2; - const POS_PRE_C = 3; - const POS_BASE_C = 4; - const POS_AFTER_MAIN = 5; - const POS_ABOVE_C = 6; - const POS_BEFORE_SUB = 7; - const POS_BELOW_C = 8; - const POS_AFTER_SUB = 9; - const POS_BEFORE_POST = 10; - const POS_POST_C = 11; - const POS_AFTER_POST = 12; - const POS_FINAL_C = 13; - const POS_SMVD = 14; - const POS_END = 15; - // Based on sea_category used to make string to find syllables - // OT_ to string character (using e.g. OT_C from INDIC) hb-ot-shape-complex-sea-private.hh - public static $sea_category_char = ['x', 'C', 'V', 'T', 'H', 'x', 'x', 'x', 'x', 'x', 'A', 'x', 'G', 'x', 'x', 'x', 'x', 'M', 'x', 'x', 'x', 'x', 'R', 'x', 'x', 'x', 'a', 'b', 'p', 't']; - public static function set_sea_properties(&$info, $scriptblock) - { - $u = $info['uni']; - $type = self::sea_get_categories($u); - $cat = $type & 0x7f; - $pos = $type >> 8; - /* - * Re-assign category - */ - // Medial Ra - if ($u == 0x1a55 || $u == 0xaa34) { - $cat = self::OT_MR; - } - /* - * Re-assign position. - */ - if ($cat == self::OT_M) { - // definitely "OT_M" in HarfBuzz - although this does not seem to have been defined ? should be OT_MR - switch ($pos) { - case self::POS_PRE_C: - $cat = self::OT_VPRE; - break; - case self::POS_ABOVE_C: - $cat = self::OT_VABV; - break; - case self::POS_BELOW_C: - $cat = self::OT_VBLW; - break; - case self::POS_POST_C: - $cat = self::OT_VPST; - break; - } - } - $info['sea_category'] = $cat; - $info['sea_position'] = $pos; - } - // syllable_type - const CONSONANT_SYLLABLE = 0; - const BROKEN_CLUSTER = 1; - const NON_SEA_CLUSTER = 2; - public static function set_syllables(&$o, $s, &$broken_syllables) - { - $ptr = 0; - $syllable_serial = 1; - $broken_syllables = \false; - while ($ptr < \strlen($s)) { - $match = ''; - $syllable_length = 1; - $syllable_type = self::NON_SEA_CLUSTER; - // CONSONANT_SYLLABLE Consonant syllable - if (\preg_match('/^(C|V|G)(p|a|b|t|HC|M|R|T|A)*/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::CONSONANT_SYLLABLE; - } elseif (\preg_match('/^(p|a|b|t|HC|M|R|T|A)+/', \substr($s, $ptr), $ma)) { - $syllable_length = \strlen($ma[0]); - $syllable_type = self::BROKEN_CLUSTER; - $broken_syllables = \true; - } - for ($i = $ptr; $i < $ptr + $syllable_length; $i++) { - $o[$i]['syllable'] = $syllable_serial << 4 | $syllable_type; - } - $ptr += $syllable_length; - $syllable_serial++; - if ($syllable_serial == 16) { - $syllable_serial = 1; - } - } - } - public static function initial_reordering(&$info, $GSUBdata, $broken_syllables, $scriptblock, $dottedcircle) - { - if ($broken_syllables && $dottedcircle) { - self::insert_dotted_circles($info, $dottedcircle); - } - $count = \count($info); - if (!$count) { - return; - } - $last = 0; - $last_syllable = $info[0]['syllable']; - for ($i = 1; $i < $count; $i++) { - if ($last_syllable != $info[$i]['syllable']) { - self::initial_reordering_syllable($info, $GSUBdata, $scriptblock, $last, $i); - $last = $i; - $last_syllable = $info[$last]['syllable']; - } - } - self::initial_reordering_syllable($info, $GSUBdata, $scriptblock, $last, $count); - } - public static function insert_dotted_circles(&$info, $dottedcircle) - { - $idx = 0; - $last_syllable = 0; - while ($idx < \count($info)) { - $syllable = $info[$idx]['syllable']; - $syllable_type = $syllable & 0xf; - if ($last_syllable != $syllable && $syllable_type == self::BROKEN_CLUSTER) { - $last_syllable = $syllable; - $dottedcircle[0]['syllable'] = $info[$idx]['syllable']; - \array_splice($info, $idx, 0, $dottedcircle); - } else { - $idx++; - } - } - } - public static function initial_reordering_syllable(&$info, $GSUBdata, $scriptblock, $start, $end) - { - /* broken_cluster: We already inserted dotted-circles, so just call the standalone_cluster. */ - $syllable_type = $info[$start]['syllable'] & 0xf; - if ($syllable_type == self::NON_SEA_CLUSTER) { - return; - } - if ($syllable_type == self::BROKEN_CLUSTER) { - /* For dotted-circle, this is what Uniscribe does: - * If dotted-circle is the last glyph, it just does nothing. */ - if ($info[$end - 1]['sea_category'] == self::OT_GB) { - return; - } - } - $base = $start; - $i = $start; - for (; $i < $base; $i++) { - $info[$i]['sea_position'] = self::POS_PRE_C; - } - if ($i < $end) { - $info[$i]['sea_position'] = self::POS_BASE_C; - $i++; - } - for (; $i < $end; $i++) { - if (isset($info[$i]['sea_category']) && $info[$i]['sea_category'] == self::OT_MR) { - /* Pre-base reordering */ - $info[$i]['sea_position'] = self::POS_PRE_C; - continue; - } - if (isset($info[$i]['sea_category']) && $info[$i]['sea_category'] == self::OT_VPRE) { - /* Left matra */ - $info[$i]['sea_position'] = self::POS_PRE_M; - continue; - } - $info[$i]['sea_position'] = self::POS_AFTER_MAIN; - } - /* Sit tight, rock 'n roll! */ - self::bubble_sort($info, $start, $end - $start); - } - public static function final_reordering(&$info, $GSUBdata, $scriptblock) - { - $count = \count($info); - if (!$count) { - return; - } - $last = 0; - $last_syllable = $info[0]['syllable']; - for ($i = 1; $i < $count; $i++) { - if ($last_syllable != $info[$i]['syllable']) { - self::final_reordering_syllable($info, $GSUBdata, $scriptblock, $last, $i); - $last = $i; - $last_syllable = $info[$last]['syllable']; - } - } - self::final_reordering_syllable($info, $GSUBdata, $scriptblock, $last, $count); - } - public static function final_reordering_syllable(&$info, $GSUBdata, $scriptblock, $start, $end) - { - /* - * Nothing to do here at present! - */ - } - public static $sea_table = [ - /* New Tai Lue (1980..19DF) */ - /* 1980 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1988 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1990 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1998 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 19A0 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 19A8 */ - 3841, - 3841, - 3841, - 3841, - 3840, - 3840, - 3840, - 3840, - /* 19B0 */ - 2823, - 2823, - 2823, - 2823, - 2823, - 775, - 775, - 775, - /* 19B8 */ - 2823, - 2823, - 775, - 2823, - 2823, - 2823, - 2823, - 2823, - /* 19C0 */ - 2823, - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - /* 19C8 */ - 3843, - 3843, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 19D0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 19D8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Tai Tham (1A20..1AAF) */ - /* 1A20 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1A28 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1A30 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1A38 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1A40 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* 1A48 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3842, - 3842, - 3842, - /* 1A50 */ - 3842, - 3842, - 3842, - 3841, - 3841, - 3857, - 3857, - 3857, - /* 1A58 */ - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - 3840, - /* 1A60 */ - 3844, - 2823, - 1543, - 2823, - 2823, - 1543, - 1543, - 1543, - /* 1A68 */ - 1543, - 2055, - 2055, - 1543, - 2055, - 2823, - 775, - 775, - /* 1A70 */ - 775, - 775, - 775, - 1543, - 1543, - 3843, - 3843, - 3843, - /* 1A78 */ - 3843, - 3843, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1A80 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1A88 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1A90 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1A98 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1AA0 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* 1AA8 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* Cham (AA00..AA5F) */ - /* AA00 */ - 3842, - 3842, - 3842, - 3842, - 3842, - 3842, - 3841, - 3841, - /* AA08 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* AA10 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* AA18 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* AA20 */ - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - 3841, - /* AA28 */ - 3841, - 1543, - 1543, - 1543, - 1543, - 2055, - 1543, - 775, - /* AA30 */ - 775, - 1543, - 2055, - 3857, - 3857, - 3857, - 3857, - 3840, - /* AA38 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* AA40 */ - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - /* AA48 */ - 3857, - 3857, - 3857, - 3857, - 3857, - 3857, - 3840, - 3840, - /* AA50 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - /* AA58 */ - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - 3840, - ]; - public static function sea_get_categories($u) - { - if (0x1980 <= $u && $u <= 0x19df) { - return self::$sea_table[$u - 0x1980]; - // offset 0 for New Tai Lue - } - if (0x1a20 <= $u && $u <= 0x1aaf) { - return self::$sea_table[$u - 0x1a20 + 96]; - // offset for Tai Tham - } - if (0xaa00 <= $u && $u <= 0xaa5f) { - return self::$sea_table[$u - 0xaa00 + 96 + 144]; - // Cham - } - if ($u == 0xa0) { - return 3851; - // (ISC_CP | (IMC_x << 8)) - } - if ($u == 0x25cc) { - return 3851; - // (ISC_CP | (IMC_x << 8)) - } - return 3840; - // (ISC_x | (IMC_x << 8)) - } - public static function bubble_sort(&$arr, $start, $len) - { - if ($len < 2) { - return; - } - $k = $start + $len - 2; - while ($k >= $start) { - for ($j = $start; $j <= $k; $j++) { - if ($arr[$j]['sea_position'] > $arr[$j + 1]['sea_position']) { - $t = $arr[$j]; - $arr[$j] = $arr[$j + 1]; - $arr[$j + 1] = $t; - } - } - $k--; - } - } -} diff --git a/dependencies/mpdf/mpdf/src/SizeConverter.php b/dependencies/mpdf/mpdf/src/SizeConverter.php deleted file mode 100644 index 74ee4f1..0000000 --- a/dependencies/mpdf/mpdf/src/SizeConverter.php +++ /dev/null @@ -1,125 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Mpdf\Log\Context as LogContext; -use WP_Ultimo\Dependencies\Mpdf\PsrLogAwareTrait\PsrLogAwareTrait; -class SizeConverter implements \WP_Ultimo\Dependencies\Psr\Log\LoggerAwareInterface -{ - use PsrLogAwareTrait; - private $dpi; - private $defaultFontSize; - /** - * @var \Mpdf\Mpdf - */ - private $mpdf; - public function __construct($dpi, $defaultFontSize, Mpdf $mpdf, LoggerInterface $logger) - { - $this->dpi = $dpi; - $this->defaultFontSize = $defaultFontSize; - $this->mpdf = $mpdf; - $this->logger = $logger; - } - /** - * Depends of maxsize value to make % work properly. Usually maxsize == pagewidth - * For text $maxsize = $fontsize - * Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize - * - * @param mixed $size - * @param mixed $maxsize - * @param mixed $fontsize - * @param mixed $usefontsize Set false for e.g. margins - will ignore fontsize for % values - * - * @return float Final size in mm - */ - public function convert($size = 5, $maxsize = 0, $fontsize = \false, $usefontsize = \true) - { - $size = \trim(\strtolower($size)); - $res = \preg_match('/^(?P<size>[-0-9.,]+([eE]\\-?[0-9]+)?)?(?P<unit>[%a-z-]+)?$/', $size, $parts); - if (!$res) { - // ignore definition - $this->logger->warning(\sprintf('Invalid size representation "%s"', $size), ['context' => LogContext::CSS_SIZE_CONVERSION]); - } - $unit = !empty($parts['unit']) ? $parts['unit'] : null; - $size = !empty($parts['size']) ? (float) $parts['size'] : 0.0; - switch ($unit) { - case 'mm': - // do nothing - break; - case 'cm': - $size *= 10; - break; - case 'pt': - $size *= 1 / Mpdf::SCALE; - break; - case 'rem': - $size *= $this->mpdf->default_font_size / Mpdf::SCALE; - break; - case '%': - if ($fontsize && $usefontsize) { - $size *= $fontsize / 100; - } else { - $size *= $maxsize / 100; - } - break; - case 'in': - // mm in an inch - $size *= 25.4; - break; - case 'pc': - // PostScript picas - $size *= 38.1 / 9; - break; - case 'ex': - // Approximates "ex" as half of font height - $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.5); - break; - case 'em': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 1); - break; - case 'thin': - $size = 1 * (25.4 / $this->dpi); - break; - case 'medium': - $size = 3 * (25.4 / $this->dpi); - // Commented-out dead code from legacy method - // $size *= $this->multiplyFontSize($fontsize, $maxsize, 1); - break; - case 'thick': - $size = 5 * (25.4 / $this->dpi); - // 5 pixel width for table borders - break; - case 'xx-small': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.7); - break; - case 'x-small': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.77); - break; - case 'small': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 0.86); - break; - case 'large': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 1.2); - break; - case 'x-large': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 1.5); - break; - case 'xx-large': - $size *= $this->multiplyFontSize($fontsize, $maxsize, 2); - break; - case 'px': - default: - $size *= 25.4 / $this->dpi; - break; - } - return $size; - } - private function multiplyFontSize($fontsize, $maxsize, $ratio) - { - if ($fontsize) { - return $fontsize * $ratio; - } - return $maxsize * $ratio; - } -} diff --git a/dependencies/mpdf/mpdf/src/Strict.php b/dependencies/mpdf/mpdf/src/Strict.php deleted file mode 100644 index 6e20b93..0000000 --- a/dependencies/mpdf/mpdf/src/Strict.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -trait Strict -{ - /** - * @param string $name method name - * @param array $args arguments - */ - public function __call($name, $args) - { - $class = \method_exists($this, $name) ? 'parent' : \get_class($this); - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Call to undefined method {$class}::{$name}()"); - } - /** - * @param string $name lowercase method name - * @param array $args arguments - */ - public static function __callStatic($name, $args) - { - $class = \get_called_class(); - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Call to undefined static function {$class}::{$name}()"); - } - /** - * @param string $name property name - */ - public function &__get($name) - { - $class = \get_class($this); - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Cannot read an undeclared property {$class}::\${$name}"); - } - /** - * @param string $name property name - * @param mixed $value property value - */ - public function __set($name, $value) - { - $class = \get_class($this); - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Cannot write to an undeclared property {$class}::\${$name}"); - } - /** - * @param string $name property name - * @throws \Kdyby\StrictObjects\\Mpdf\MpdfException - */ - public function __isset($name) - { - $class = \get_class($this); - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Cannot read an undeclared property {$class}::\${$name}"); - } - /** - * @param string $name property name - * @throws \Kdyby\StrictObjects\\Mpdf\MpdfException - */ - public function __unset($name) - { - $class = \get_class($this); - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("Cannot unset the property {$class}::\${$name}."); - } -} diff --git a/dependencies/mpdf/mpdf/src/TTFontFile.php b/dependencies/mpdf/mpdf/src/TTFontFile.php deleted file mode 100644 index d00f508..0000000 --- a/dependencies/mpdf/mpdf/src/TTFontFile.php +++ /dev/null @@ -1,4514 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -use WP_Ultimo\Dependencies\Mpdf\Fonts\FontCache; -use WP_Ultimo\Dependencies\Mpdf\Fonts\GlyphOperator; -// NOTE*** If you change the defined constants below, be sure to delete all temporary font data files in /ttfontdata/ -// to force mPDF to regenerate cached font files. -if (!\defined('_OTL_OLD_SPEC_COMPAT_2')) { - \define('_OTL_OLD_SPEC_COMPAT_2', \true); -} -// Define the value used in the "head" table of a created TTF file -// 0x74727565 "true" for Mac -// 0x00010000 for Windows -// Either seems to work for a font embedded in a PDF file -// when read by Adobe Reader on a Windows PC(!) -if (!\defined('_TTF_MAC_HEADER')) { - \define('_TTF_MAC_HEADER', \false); -} -// Recalculate correct metadata/profiles when making subset fonts (not SIP/SMP) -// e.g. xMin, xMax, maxNContours -if (!\defined('_RECALC_PROFILE')) { - \define('_RECALC_PROFILE', \false); -} -// mPDF 5.7.1 -if (!\function_exists('WP_Ultimo\\Dependencies\\Mpdf\\unicode_hex')) { - function unicode_hex($unicode_dec) - { - return \sprintf("%05s", \strtoupper(\dechex($unicode_dec))); - } -} -/** - * TTFontFile class - * - * This class is based on The ReportLab Open Source PDF library - * written in Python - http://www.reportlab.com/software/opensource/ - * together with ideas from the OpenOffice source code and others. - * This header must be retained in any redistribution or - * modification of the file. - * - * @author Ian Back <ianb@bpm1.com> - * @license LGPL - */ -class TTFontFile -{ - use Strict; - private $fontCache; - private $fontDescriptor; - var $GPOSFeatures; - var $GPOSLookups; - var $GPOSScriptLang; - var $MarkAttachmentType; - var $MarkGlyphSets; - var $GlyphClassMarks; - var $GlyphClassLigatures; - var $GlyphClassBases; - var $GlyphClassComponents; - var $GSUBScriptLang; - var $rtlPUAstr; - var $fontkey; - var $useOTL; - var $maxUni; - var $sFamilyClass; - var $sFamilySubClass; - var $sipset; - var $smpset; - var $_pos; - var $numTables; - var $searchRange; - var $entrySelector; - var $rangeShift; - var $tables; - var $otables; - var $filename; - var $fh; - var $glyphPos; - var $charToGlyph; - var $ascent; - var $descent; - var $lineGap; - var $hheaascent; - var $hheadescent; - var $hhealineGap; - var $advanceWidthMax; - var $typoAscender; - var $typoDescender; - var $typoLineGap; - var $usWinAscent; - var $usWinDescent; - var $strikeoutSize; - var $strikeoutPosition; - var $name; - var $familyName; - var $styleName; - var $fullName; - var $uniqueFontID; - var $unitsPerEm; - var $bbox; - var $capHeight; - var $xHeight; - var $stemV; - var $italicAngle; - var $flags; - var $underlinePosition; - var $underlineThickness; - var $charWidths; - var $defaultWidth; - var $maxStrLenRead; - var $numTTCFonts; - var $TTCFonts; - var $maxUniChar; - var $kerninfo; - var $haskernGPOS; - var $hassmallcapsGSUB; - var $codeToGlyph; - var $glyphdata; - var $LuCoverage; - public $panose; - public $version; - public $fontRevision; - public $restrictedUse; - public $glyphIDtoUni; - public $glyphToChar; - public $GSUBFeatures; - public $GSUBLookups; - public $GSLuCoverage; - public function __construct(FontCache $fontCache, $fontDescriptor) - { - $this->fontCache = $fontCache; - $this->fontDescriptor = $fontDescriptor; - // Maximum size of glyf table to read in as string (otherwise reads each glyph from file) - $this->maxStrLenRead = 200000; - } - public function getMetrics($file, $fontkey, $TTCfontID = 0, $debug = \false, $BMPonly = \false, $useOTL = 0) - { - $this->useOTL = $useOTL; - $this->fontkey = $fontkey; - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open font file "%s"', $file)); - } - $this->_pos = 0; - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->otables = []; - $this->kerninfo = []; - $this->haskernGPOS = []; - $this->hassmallcapsGSUB = []; - $this->ascent = 0; - $this->descent = 0; - $this->lineGap = 0; - $this->hheaascent = 0; - $this->hheadescent = 0; - $this->hhealineGap = 0; - $this->xHeight = 0; - $this->capHeight = 0; - $this->panose = []; - $this->sFamilyClass = 0; - $this->sFamilySubClass = 0; - $this->typoAscender = 0; - $this->typoDescender = 0; - $this->typoLineGap = 0; - $this->usWinAscent = 0; - $this->usWinDescent = 0; - $this->advanceWidthMax = 0; - $this->strikeoutSize = 0; - $this->strikeoutPosition = 0; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->version = $version = $this->read_ulong(); - $this->panose = []; - if ($version === 0x4f54544f) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Fonts with postscript outlines are not supported (%s)', $file)); - } - if ($version === 0x74746366 && !$TTCfontID) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('TTCfontID for a TrueType Collection is not defined in mPDF "fontdata" configuration (%s)', $file)); - } - if (!\in_array($version, [0x10000, 0x74727565], \true) && !$TTCfontID) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Not a TrueType font: version=%s)', $version)); - } - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000], \true)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error parsing TrueType Collection: version=%s - (%s)', $version, $file)); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - } - $this->readTableDirectory($debug); - $this->extractInfo($debug, $BMPonly, $useOTL); - \fclose($this->fh); - } - function readTableDirectory($debug = \false) - { - $this->numTables = $this->read_ushort(); - $this->searchRange = $this->read_ushort(); - $this->entrySelector = $this->read_ushort(); - $this->rangeShift = $this->read_ushort(); - $this->tables = []; - for ($i = 0; $i < $this->numTables; $i++) { - $record = []; - $record['tag'] = $this->read_tag(); - $record['checksum'] = [$this->read_ushort(), $this->read_ushort()]; - $record['offset'] = $this->read_ulong(); - $record['length'] = $this->read_ulong(); - $this->tables[$record['tag']] = $record; - } - if ($debug) { - $this->checksumTables(); - } - } - function checksumTables() - { - // Check the checksums for all tables - foreach ($this->tables as $t) { - if ($t['length'] > 0 && $t['length'] < $this->maxStrLenRead) { - // 1.02 - $table = $this->get_chunk($t['offset'], $t['length']); - $checksum = $this->calcChecksum($table); - if ($t['tag'] === 'head') { - $up = \unpack('n*', \substr($table, 8, 4)); - $adjustment[0] = $up[1]; - $adjustment[1] = $up[2]; - $checksum = $this->sub32($checksum, $adjustment); - } - $xchecksum = $t['checksum']; - if ($xchecksum != $checksum) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('TTF file "%s": invalid checksum %s table: %s (expected %s)', $this->filename, \dechex($checksum[0]) . \dechex($checksum[1]), $t['tag'], \dechex($xchecksum[0]) . \dechex($xchecksum[1]))); - } - } - } - } - function sub32($x, $y) - { - $xlo = $x[1]; - $xhi = $x[0]; - $ylo = $y[1]; - $yhi = $y[0]; - if ($ylo > $xlo) { - $xlo += 1 << 16; - ++$yhi; - } - $reslo = $xlo - $ylo; - if ($yhi > $xhi) { - $xhi += 1 << 16; - } - $reshi = $xhi - $yhi; - $reshi &= 0xffff; - return [$reshi, $reslo]; - } - function calcChecksum($data) - { - if (\strlen($data) % 4) { - $data .= \str_repeat("\x00", 4 - \strlen($data) % 4); - } - $len = \strlen($data); - $hi = 0x0; - $lo = 0x0; - for ($i = 0; $i < $len; $i += 4) { - $hi += (\ord($data[$i]) << 8) + \ord($data[$i + 1]); - $lo += (\ord($data[$i + 2]) << 8) + \ord($data[$i + 3]); - $hi += $lo >> 16 & 0xffff; - $lo &= 0xffff; - } - $hi &= 0xffff; - return [$hi, $lo]; - } - function get_table_pos($tag) - { - if (!isset($this->tables[$tag])) { - return [0, 0]; - } - $offset = $this->tables[$tag]['offset']; - $length = $this->tables[$tag]['length']; - return [$offset, $length]; - } - function seek($pos) - { - $this->_pos = $pos; - \fseek($this->fh, $this->_pos); - } - function skip($delta) - { - $this->_pos = $this->_pos + $delta; - \fseek($this->fh, $delta, \SEEK_CUR); - } - function seek_table($tag, $offset_in_table = 0) - { - $tpos = $this->get_table_pos($tag); - $this->_pos = $tpos[0] + $offset_in_table; - \fseek($this->fh, $this->_pos); - return $this->_pos; - } - function read_tag() - { - $this->_pos += 4; - return \fread($this->fh, 4); - } - function read_short() - { - $this->_pos += 2; - $s = \fread($this->fh, 2); - $a = (\ord($s[0]) << 8) + \ord($s[1]); - if ($a & 1 << 15) { - $a = $a - (1 << 16); - } - return $a; - } - function unpack_short($s) - { - $a = (\ord($s[0]) << 8) + \ord($s[1]); - if ($a & 1 << 15) { - $a = $a - (1 << 16); - } - return $a; - } - function read_ushort() - { - $this->_pos += 2; - $s = \fread($this->fh, 2); - return (\ord($s[0]) << 8) + \ord($s[1]); - } - function read_ulong() - { - $this->_pos += 4; - $s = \fread($this->fh, 4); - // if large uInt32 as an integer, PHP converts it to -ve - return \ord($s[0]) * 16777216 + (\ord($s[1]) << 16) + (\ord($s[2]) << 8) + \ord($s[3]); - // 16777216 = 1<<24 - } - function get_ushort($pos) - { - \fseek($this->fh, $pos); - $s = \fread($this->fh, 2); - return (\ord($s[0]) << 8) + \ord($s[1]); - } - function get_ulong($pos) - { - \fseek($this->fh, $pos); - $s = \fread($this->fh, 4); - // iF large uInt32 as an integer, PHP converts it to -ve - return \ord($s[0]) * 16777216 + (\ord($s[1]) << 16) + (\ord($s[2]) << 8) + \ord($s[3]); - // 16777216 = 1<<24 - } - function pack_short($val) - { - if ($val < 0) { - $val = \abs($val); - $val = ~$val; - ++$val; - } - return \pack('n', $val); - } - function splice($stream, $offset, $value) - { - return \substr($stream, 0, $offset) . $value . \substr($stream, $offset + \strlen($value)); - } - function _set_ushort($stream, $offset, $value) - { - $up = \pack("n", $value); - return $this->splice($stream, $offset, $up); - } - function _set_short($stream, $offset, $val) - { - if ($val < 0) { - $val = \abs($val); - $val = ~$val; - $val += 1; - } - $up = \pack("n", $val); - return $this->splice($stream, $offset, $up); - } - function get_chunk($pos, $length) - { - \fseek($this->fh, $pos); - if ($length < 1) { - return ''; - } - $data = \fread($this->fh, $length); - // fix for #1504 - // if fread is used to read from a compressed / buffered stream (e.g. phar://...) - // the $length parameter will be ignored - fread is limited in size (usually 8192 bytes) - // to fix this, the data length must be checked after reading. If the read was incomplete, - // try to read the rest of the data - $dataLen = \strlen($data); - while ($dataLen < $length && !\feof($this->fh)) { - $data .= \fread($this->fh, $length - $dataLen); - $dataLen = \strlen($data); - } - return $data; - } - function get_table($tag) - { - list($pos, $length) = $this->get_table_pos($tag); - if ($length == 0) { - return ''; - } - \fseek($this->fh, $pos); - return \fread($this->fh, $length); - } - function add($tag, $data) - { - if ($tag === 'head') { - $data = $this->splice($data, 8, "\x00\x00\x00\x00"); - } - $this->otables[$tag] = $data; - } - function getCTG($file, $TTCfontID = 0, $debug = \false, $useOTL = \false) - { - // Only called if font is not to be used as embedded subset i.e. NOT called for SIP/SMP fonts - $this->useOTL = $useOTL; - // mPDF 5.7.1 - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open file "%s"', $file)); - } - $this->_pos = 0; - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->skip(4); - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000], \true)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf("Error parsing TrueType Collection: version=%s (%s)", $version, $file)); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - } - $this->readTableDirectory($debug); - // cmap - Character to glyph index mapping table - $cmap_offset = $this->seek_table('cmap'); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 1) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } elseif ($platformID == 0) { - // Unicode -- assume all encodings are compatible - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - $this->seek($save_pos); - } - $glyphToChar = []; - $charToGlyph = []; - $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); - // Map Unmapped glyphs - from $numGlyphs - if ($useOTL) { - $this->seek_table("maxp"); - $this->skip(4); - $numGlyphs = $this->read_ushort(); - $bctr = 0xe000; - for ($gid = 1; $gid < $numGlyphs; $gid++) { - if (!isset($glyphToChar[$gid])) { - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - // Avoid overwriting a glyph already mapped in PUA - if ($bctr > 0xf8ff) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Font "%s" cannot map all included glyphs into Private Use Area U+E000-U+F8FF; cannot use useOTL on this font', $file)); - } - $glyphToChar[$gid][] = $bctr; - $charToGlyph[$bctr] = $gid; - $bctr++; - } - } - } - \fclose($this->fh); - return $charToGlyph; - } - function getTTCFonts($file) - { - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open file "%s"', $file)); - } - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->version = $version = $this->read_ulong(); - if ($version === 0x74746366) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000], \true)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf("Error parsing TrueType Collection: version=%s (%s)", $version, $file)); - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf("Not a TrueType Collection: version=%s (%s)", $version, $file)); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - } - function extractInfo($debug = \false, $BMPonly = \false, $useOTL = 0) - { - // Values are all set to 0 or blank at start of getMetrics - // name - Naming table - $name_offset = $this->seek_table("name"); - $format = $this->read_ushort(); - if ($format != 0 && $format != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error loading font: Unknown name table format {$format} for font {$this->filename}"); - } - $numRecords = $this->read_ushort(); - $string_data_offset = $name_offset + $this->read_ushort(); - $names = [1 => '', 2 => '', 3 => '', 4 => '', 6 => '']; - $K = \array_keys($names); - $nameCount = \count($names); - for ($i = 0; $i < $numRecords; $i++) { - $platformId = $this->read_ushort(); - $encodingId = $this->read_ushort(); - $languageId = $this->read_ushort(); - $nameId = $this->read_ushort(); - $length = $this->read_ushort(); - $offset = $this->read_ushort(); - if (!\in_array($nameId, $K)) { - continue; - } - $N = ''; - if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { - // Microsoft, Unicode, US English, PS Name - $opos = $this->_pos; - $this->seek($string_data_offset + $offset); - if ($length % 2 != 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error loading font: PostScript name is UTF-16BE string of odd length for font {$this->filename}"); - } - $length /= 2; - $N = ''; - while ($length > 0) { - $char = $this->read_ushort(); - $N .= \chr($char); - $length -= 1; - } - $this->_pos = $opos; - $this->seek($opos); - } elseif ($platformId == 1 && $encodingId == 0 && $languageId == 0) { - // Macintosh, Roman, English, PS Name - $opos = $this->_pos; - $N = $this->get_chunk($string_data_offset + $offset, $length); - $this->_pos = $opos; - $this->seek($opos); - } - if ($N && $names[$nameId] == '') { - $names[$nameId] = $N; - $nameCount -= 1; - if ($nameCount == 0) { - break; - } - } - } - if ($names[6]) { - $psName = $names[6]; - } elseif ($names[4]) { - $psName = \preg_replace('/ /', '-', $names[4]); - } elseif ($names[1]) { - $psName = \preg_replace('/ /', '-', $names[1]); - } else { - $psName = ''; - } - if (!$psName) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Error loading font: Could not find PostScript font name '{$this->filename}'"); - } - // CHECK IF psName valid (PadaukBook contains illegal characters in Name ID 6 i.e. Postscript Name) - $psNameInvalid = \false; - $nameLength = \strlen($psName); - for ($i = 0; $i < $nameLength; $i++) { - $c = $psName[$i]; - $oc = \ord($c); - if ($oc > 126 || \strpos(' [](){}<>/%', $c) !== \false) { - //throw new \Mpdf\Exception\FontException("psName=".$psName." contains invalid character ".$c." ie U+".ord(c)); - $psNameInvalid = \true; - break; - } - } - if ($psNameInvalid && $names[4]) { - $psName = \preg_replace('/ /', '-', $names[4]); - } - $this->name = $psName; - if ($names[1]) { - $this->familyName = $names[1]; - } else { - $this->familyName = $psName; - } - if ($names[2]) { - $this->styleName = $names[2]; - } else { - $this->styleName = 'Regular'; - } - if ($names[4]) { - $this->fullName = $names[4]; - } else { - $this->fullName = $psName; - } - if ($names[3]) { - $this->uniqueFontID = $names[3]; - } else { - $this->uniqueFontID = $psName; - } - if (!$psNameInvalid && $names[6]) { - $this->fullName = $names[6]; - } - // head - Font header table - $this->seek_table('head'); - if ($debug) { - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Unknown head table version ' . $ver_maj . '.' . $ver_min); - } - $this->fontRevision = $this->read_ushort() . $this->read_ushort(); - $this->skip(4); - $magic = $this->read_ulong(); - if ($magic !== 0x5f0f3cf5) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Invalid head table magic ' . $magic); - } - $this->skip(2); - } else { - $this->skip(18); - } - $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); - $scale = 1000 / $unitsPerEm; - $this->skip(16); - $xMin = $this->read_short(); - $yMin = $this->read_short(); - $xMax = $this->read_short(); - $yMax = $this->read_short(); - $this->bbox = [$xMin * $scale, $yMin * $scale, $xMax * $scale, $yMax * $scale]; - $this->skip(3 * 2); - $indexToLocFormat = $this->read_ushort(); - $glyphDataFormat = $this->read_ushort(); - if ($glyphDataFormat != 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error loading font: Unknown glyph data format %s', $glyphDataFormat)); - } - // hhea metrics table - if (isset($this->tables["hhea"])) { - $this->seek_table("hhea"); - $this->skip(4); - $hheaAscender = $this->read_short(); - $hheaDescender = $this->read_short(); - $hheaLineGap = $this->read_short(); - $hheaAdvanceWidthMax = $this->read_ushort(); - $this->hheaascent = $hheaAscender * $scale; - $this->hheadescent = $hheaDescender * $scale; - $this->hhealineGap = $hheaLineGap * $scale; - $this->advanceWidthMax = $hheaAdvanceWidthMax * $scale; - } - // OS/2 - OS/2 and Windows metrics table - $use_typo_metrics = \false; - if (isset($this->tables["OS/2"])) { - $this->seek_table("OS/2"); - $version = $this->read_ushort(); - $this->skip(2); - $usWeightClass = $this->read_ushort(); - $this->skip(2); - $fsType = $this->read_ushort(); - if ($fsType == 0x2 || ($fsType & 0x300) != 0) { - $this->restrictedUse = \true; - } - $this->skip(16); - $yStrikeoutSize = $this->read_short(); - $yStrikeoutPosition = $this->read_short(); - $this->strikeoutSize = $yStrikeoutSize * $scale; - $this->strikeoutPosition = $yStrikeoutPosition * $scale; - $sF = $this->read_short(); - $this->sFamilyClass = $sF >> 8; - $this->sFamilySubClass = $sF & 0xff; - $this->_pos += 10; - //PANOSE = 10 byte length - $panose = \fread($this->fh, 10); - $this->panose = []; - $panoseLenght = \strlen($panose); - for ($p = 0; $p < $panoseLenght; $p++) { - $this->panose[] = \ord($panose[$p]); - } - $this->skip(20); - $fsSelection = $this->read_ushort(); - $use_typo_metrics = ($fsSelection & 0x80) === 0x80; - // bit#7 = USE_TYPO_METRICS - $this->skip(4); - $sTypoAscender = $this->read_short(); - $sTypoDescender = $this->read_short(); - $sTypoLineGap = $this->read_short(); - if ($sTypoAscender) { - $this->typoAscender = $sTypoAscender * $scale; - } - if ($sTypoDescender) { - $this->typoDescender = $sTypoDescender * $scale; - } - if ($sTypoLineGap) { - $this->typoLineGap = $sTypoLineGap * $scale; - } - $usWinAscent = $this->read_ushort(); - $usWinDescent = $this->read_ushort(); - if ($usWinAscent) { - $this->usWinAscent = $usWinAscent * $scale; - } - if ($usWinDescent) { - $this->usWinDescent = $usWinDescent * $scale; - } - if ($version > 1) { - $this->skip(8); - $sxHeight = $this->read_short(); - $this->xHeight = $sxHeight * $scale; - $sCapHeight = $this->read_short(); - $this->capHeight = $sCapHeight * $scale; - } - } else { - $usWeightClass = 400; - } - $this->stemV = 50 + (int) ($usWeightClass / 65.0) ** 2; - // FONT DESCRIPTOR METRICS - if ($this->fontDescriptor === 'winTypo') { - $this->ascent = $this->typoAscender; - $this->descent = $this->typoDescender; - $this->lineGap = $this->typoLineGap; - } elseif ($this->fontDescriptor === 'mac') { - $this->ascent = $this->hheaascent; - $this->descent = $this->hheadescent; - $this->lineGap = $this->hhealineGap; - } else { - // $this->fontDescriptor === 'win' - $this->ascent = $this->usWinAscent; - $this->descent = -$this->usWinDescent; - $this->lineGap = 0; - // Special case - if either the winAscent or winDescent are greater than the - // font bounding box yMin yMax, then reduce them accordingly. - // This works with Myanmar Text (Windows 8 version) to give a - // line-height normal that is equivalent to that produced in browsers. - // Also Khmer OS = compatible with MSWord, Wordpad and browser. - if ($this->ascent > $this->bbox[3]) { - $this->ascent = $this->bbox[3]; - } - if ($this->descent < $this->bbox[1]) { - $this->descent = $this->bbox[1]; - } - // Override case - if the USE_TYPO_METRICS bit is set on OS/2 fsSelection - // this is telling the font to use the sTypo values and not the usWinAscent values. - // This works as a fix with Cambria Math to give a normal line-height; - // at present, this is the only font I have found with this bit set; - // although note that MS WordPad and windows FF browser uses the big line-height from winAscent - // but Word 2007 get it right - if ($use_typo_metrics && $this->typoAscender) { - $this->ascent = $this->typoAscender; - $this->descent = $this->typoDescender; - $this->lineGap = $this->typoLineGap; - } - } - // post - PostScript table - $this->seek_table('post'); - if ($debug) { - $ver_maj = $this->read_ushort(); - if ($ver_maj < 1 || $ver_maj > 4) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error loading font: Unknown post table version %s', $ver_maj)); - } - } else { - $this->skip(4); - } - $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; - $this->underlinePosition = $this->read_short() * $scale; - $this->underlineThickness = $this->read_short() * $scale; - $isFixedPitch = $this->read_ulong(); - $this->flags = 4; - if ($this->italicAngle != 0) { - $this->flags |= 64; - } - if ($usWeightClass >= 600) { - $this->flags |= 262144; - } - if ($isFixedPitch) { - $this->flags |= 1; - } - // hhea - Horizontal header table - $this->seek_table('hhea'); - if ($debug) { - $ver_maj = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error loading font: Unknown hhea table version %s', $ver_maj)); - } - $this->skip(28); - } else { - $this->skip(32); - } - $metricDataFormat = $this->read_ushort(); - if ($metricDataFormat != 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error loading font: Unknown horizontal metric data format "%s"', $metricDataFormat)); - } - $numberOfHMetrics = $this->read_ushort(); - if ($numberOfHMetrics == 0) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Error loading font: Number of horizontal metrics is 0'); - } - // maxp - Maximum profile table - $this->seek_table('maxp'); - if ($debug) { - $ver_maj = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error loading font: Unknown maxp table version %s', $ver_maj)); - } - } else { - $this->skip(4); - } - $numGlyphs = $this->read_ushort(); - // cmap - Character to glyph index mapping table - $cmap_offset = $this->seek_table('cmap'); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 1 || $platformID == 0) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - if (!$unicode_cmap_offset) { - $unicode_cmap_offset = $cmap_offset + $offset; - } - if ($BMPonly) { - break; - } - } - } elseif (($platformID == 3 && $encodingID == 10 || $platformID == 0) && !$BMPonly) { - // Microsoft, Unicode Format 12 table HKCS - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 12) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - $this->seek($save_pos); - } - if (!$unicode_cmap_offset) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $this->filename)); - } - $sipset = \false; - $smpset = \false; - $this->rtlPUAstr = ''; - $this->GSUBScriptLang = []; - $this->GSUBFeatures = []; - $this->GSUBLookups = []; - $this->GPOSScriptLang = []; - $this->GPOSFeatures = []; - $this->GPOSLookups = []; - $this->glyphIDtoUni = ''; - // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above - if ($format == 12 && !$BMPonly) { - $this->maxUniChar = 0; - $this->seek($unicode_cmap_offset + 4); - $length = $this->read_ulong(); - $limit = $unicode_cmap_offset + $length; - $this->skip(4); - $nGroups = $this->read_ulong(); - $glyphToChar = []; - $charToGlyph = []; - for ($i = 0; $i < $nGroups; $i++) { - $startCharCode = $this->read_ulong(); - $endCharCode = $this->read_ulong(); - $startGlyphCode = $this->read_ulong(); - // ZZZ98 - if ($endCharCode > 0x20000 && $endCharCode < 0x2ffff) { - $sipset = \true; - } elseif ($endCharCode > 0x10000 && $endCharCode < 0x1ffff) { - $smpset = \true; - } - $offset = 0; - for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { - $glyph = $startGlyphCode + $offset; - $offset++; - // ZZZ98 - if ($unichar < 0x30000) { - $charToGlyph[$unichar] = $glyph; - $this->maxUniChar = \max($unichar, $this->maxUniChar); - $glyphToChar[$glyph][] = $unichar; - } - } - } - } else { - $glyphToChar = []; - $charToGlyph = []; - $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); - } - $this->sipset = $sipset; - $this->smpset = $smpset; - // Map Unmapped glyphs (or glyphs mapped to upper PUA U+F00000 onwards i.e. > U+2FFFF) - from $numGlyphs - if ($this->useOTL) { - $bctr = 0xe000; - for ($gid = 1; $gid < $numGlyphs; $gid++) { - if (!isset($glyphToChar[$gid])) { - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - // Avoid overwriting a glyph already mapped in PUA - // ZZZ98 - if ($bctr > 0xf8ff && $bctr < 0x2ceb0) { - if (!$BMPonly) { - $bctr = 0x2ceb0; - // Use unassigned area 0x2CEB0 to 0x2F7FF (space for 10,000 characters) - $this->sipset = $sipset = \true; - // forces subsetting; also ensure charwidths are saved - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('The font "%s" does not have enough space to map all (unmapped) included glyphs into Private Use Area U+E000-U+F8FF', $names[1])); - } - } - $glyphToChar[$gid][] = $bctr; - $charToGlyph[$bctr] = $gid; - $this->maxUniChar = \max($bctr, $this->maxUniChar); - $bctr++; - } - } - } - $this->glyphToChar = $glyphToChar; - $this->GSUBScriptLang = []; - $this->rtlPUAstr = ''; - if ($useOTL) { - $this->_getGDEFtables(); - list($this->GSUBScriptLang, $this->GSUBFeatures, $this->GSUBLookups, $this->rtlPUAstr) = $this->_getGSUBtables(); - list($this->GPOSScriptLang, $this->GPOSFeatures, $this->GPOSLookups) = $this->_getGPOStables(); - $this->glyphIDtoUni = \str_pad('', 256 * 256 * 3, "\x00"); - foreach ($glyphToChar as $gid => $arr) { - if (isset($glyphToChar[$gid][0])) { - $char = $glyphToChar[$gid][0]; - if ($char != 0 && $char != 65535) { - $this->glyphIDtoUni[$gid * 3] = \chr($char >> 16); - $this->glyphIDtoUni[$gid * 3 + 1] = \chr($char >> 8 & 0xff); - $this->glyphIDtoUni[$gid * 3 + 2] = \chr($char & 0xff); - } - } - } - } - // if xHeight and/or CapHeight are not available from OS/2 (e.g. eraly versions) - // Calculate from yMax of 'x' or 'H' Glyphs... - if ($this->xHeight == 0) { - if (isset($charToGlyph[0x78])) { - $gidx = $charToGlyph[0x78]; - // U+0078 (LATIN SMALL LETTER X) - $start = $this->seek_table('loca'); - if ($indexToLocFormat == 0) { - $this->skip($gidx * 2); - $locax = $this->read_ushort() * 2; - } elseif ($indexToLocFormat == 1) { - $this->skip($gidx * 4); - $locax = $this->read_ulong(); - } - $start = $this->seek_table('glyf'); - $this->skip($locax); - $this->skip(8); - $yMaxx = $this->read_short(); - $this->xHeight = $yMaxx * $scale; - } - } - if ($this->capHeight == 0) { - if (isset($charToGlyph[0x48])) { - $gidH = $charToGlyph[0x48]; - // U+0048 (LATIN CAPITAL LETTER H) - $start = $this->seek_table('loca'); - if ($indexToLocFormat == 0) { - $this->skip($gidH * 2); - $locaH = $this->read_ushort() * 2; - } elseif ($indexToLocFormat == 1) { - $this->skip($gidH * 4); - $locaH = $this->read_ulong(); - } - $start = $this->seek_table('glyf'); - $this->skip($locaH); - $this->skip(8); - $yMaxH = $this->read_short(); - $this->capHeight = $yMaxH * $scale; - } else { - $this->capHeight = $this->ascent; - } - // final default is to set it = to Ascent - } - // hmtx - Horizontal metrics table - $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); - // kern - Kerning pair table - // Recognises old form of Kerning table - as required by Windows - Format 0 only - $kern_offset = $this->seek_table("kern"); - $version = $this->read_ushort(); - $nTables = $this->read_ushort(); - // subtable header - $sversion = $this->read_ushort(); - $slength = $this->read_ushort(); - $scoverage = $this->read_ushort(); - $format = $scoverage >> 8; - if ($kern_offset && $version == 0 && $format == 0) { - // Format 0 - $nPairs = $this->read_ushort(); - $this->skip(6); - for ($i = 0; $i < $nPairs; $i++) { - $left = $this->read_ushort(); - $right = $this->read_ushort(); - $val = $this->read_short(); - if (isset($glyphToChar[$left]) && \count($glyphToChar[$left]) == 1 && isset($glyphToChar[$right]) && \count($glyphToChar[$right]) == 1) { - if ($left != 32 && $right != 32) { - $this->kerninfo[$glyphToChar[$left][0]][$glyphToChar[$right][0]] = \intval($val * $scale); - } - } - } - } - } - function _getGDEFtables() - { - // http://www.microsoft.com/typography/otspec/gdef.htm - if (isset($this->tables["GDEF"])) { - $gdef_offset = $this->seek_table("GDEF"); - // ULONG Version of the GDEF table-currently 0x00010000 - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - $GlyphClassDef_offset = $this->read_ushort(); - $AttachList_offset = $this->read_ushort(); - $LigCaretList_offset = $this->read_ushort(); - $MarkAttachClassDef_offset = $this->read_ushort(); - // Version 0x00010002 of GDEF header contains additional Offset to a list defining mark glyph set definitions (MarkGlyphSetDef) - if ($ver_min == 2) { - $MarkGlyphSetsDef_offset = $this->read_ushort(); - } - // GlyphClassDef - if ($GlyphClassDef_offset) { - $this->seek($gdef_offset + $GlyphClassDef_offset); - // 1 Base glyph (single character, spacing glyph) - // 2 Ligature glyph (multiple character, spacing glyph) - // 3 Mark glyph (non-spacing combining glyph) - // 4 Component glyph (part of single character, spacing glyph) - $GlyphByClass = $this->_getClassDefinitionTable(); - } else { - $GlyphByClass = []; - } - if (isset($GlyphByClass[1]) && \count($GlyphByClass[1]) > 0) { - $this->GlyphClassBases = ' ' . \implode('| ', $GlyphByClass[1]); - } else { - $this->GlyphClassBases = ''; - } - if (isset($GlyphByClass[2]) && \count($GlyphByClass[2]) > 0) { - $this->GlyphClassLigatures = ' ' . \implode('| ', $GlyphByClass[2]); - } else { - $this->GlyphClassLigatures = ''; - } - if (isset($GlyphByClass[3]) && \count($GlyphByClass[3]) > 0) { - $this->GlyphClassMarks = ' ' . \implode('| ', $GlyphByClass[3]); - } else { - $this->GlyphClassMarks = ''; - } - if (isset($GlyphByClass[4]) && \count($GlyphByClass[4]) > 0) { - $this->GlyphClassComponents = ' ' . \implode('| ', $GlyphByClass[4]); - } else { - $this->GlyphClassComponents = ''; - } - if (isset($GlyphByClass[3]) && \count($GlyphByClass[3]) > 0) { - $Marks = $GlyphByClass[3]; - } else { - // to use for MarkAttachmentType - $Marks = []; - } - /* Required for GPOS - // Attachment List - if ($AttachList_offset) { - $this->seek($gdef_offset+$AttachList_offset ); - } - The Attachment Point List table (AttachmentList) identifies all the attachment points defined in the GPOS table and their associated glyphs so a client can quickly access coordinates for each glyph's attachment points. As a result, the client can cache coordinates for attachment points along with glyph bitmaps and avoid recalculating the attachment points each time it displays a glyph. Without this table, processing speed would be slower because the client would have to decode the GPOS lookups that define attachment points and compile the points in a list. - - The Attachment List table (AttachList) may be used to cache attachment point coordinates along with glyph bitmaps. - - The table consists of an offset to a Coverage table (Coverage) listing all glyphs that define attachment points in the GPOS table, a count of the glyphs with attachment points (GlyphCount), and an array of offsets to AttachPoint tables (AttachPoint). The array lists the AttachPoint tables, one for each glyph in the Coverage table, in the same order as the Coverage Index. - AttachList table - Type Name Description - Offset Coverage Offset to Coverage table - from beginning of AttachList table - uint16 GlyphCount Number of glyphs with attachment points - Offset AttachPoint[GlyphCount] Array of offsets to AttachPoint tables-from beginning of AttachList table-in Coverage Index order - - An AttachPoint table consists of a count of the attachment points on a single glyph (PointCount) and an array of contour indices of those points (PointIndex), listed in increasing numerical order. - - AttachPoint table - Type Name Description - uint16 PointCount Number of attachment points on this glyph - uint16 PointIndex[PointCount] Array of contour point indices -in increasing numerical order - - See Example 3 - http://www.microsoft.com/typography/otspec/gdef.htm - */ - // Ligature Caret List - // The Ligature Caret List table (LigCaretList) defines caret positions for all the ligatures in a font. - // Not required for mDPF - // MarkAttachmentType - if ($MarkAttachClassDef_offset) { - $this->seek($gdef_offset + $MarkAttachClassDef_offset); - $MarkAttachmentTypes = $this->_getClassDefinitionTable(); - foreach ($MarkAttachmentTypes as $class => $glyphs) { - if (\is_array($Marks) && \count($Marks)) { - $mat = \array_diff($Marks, $MarkAttachmentTypes[$class]); - \sort($mat, \SORT_STRING); - } else { - $mat = []; - } - $this->MarkAttachmentType[$class] = ' ' . \implode('| ', $mat); - } - } else { - $this->MarkAttachmentType = []; - } - // MarkGlyphSets only in Version 0x00010002 of GDEF - if ($ver_min == 2 && $MarkGlyphSetsDef_offset) { - $this->seek($gdef_offset + $MarkGlyphSetsDef_offset); - $MarkSetTableFormat = $this->read_ushort(); - $MarkSetCount = $this->read_ushort(); - $MarkSetOffset = []; - for ($i = 0; $i < $MarkSetCount; $i++) { - $MarkSetOffset[] = $this->read_ulong(); - } - for ($i = 0; $i < $MarkSetCount; $i++) { - $this->seek($MarkSetOffset[$i]); - $glyphs = $this->_getCoverage(); - $this->MarkGlyphSets[$i] = ' ' . \implode('| ', $glyphs); - } - } else { - $this->MarkGlyphSets = []; - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to set font "%s" to use OTL as it does not include OTL tables (or at least not a GDEF table).', $this->filename)); - } - $GSUB_offset = 0; - $GPOS_offset = 0; - $GSUB_length = 0; - $s = ''; - if (isset($this->tables['GSUB'])) { - $GSUB_offset = $this->seek_table('GSUB'); - $GSUB_length = $this->tables['GSUB']['length']; - $s .= \fread($this->fh, $this->tables['GSUB']['length']); - } - if (isset($this->tables['GPOS'])) { - $GPOS_offset = $this->seek_table('GPOS'); - $s .= \fread($this->fh, $this->tables['GPOS']['length']); - } - if ($s) { - $this->fontCache->write($this->fontkey . '.GSUBGPOStables.dat', $s); - } - $font = ['GSUB_offset' => $GSUB_offset, 'GPOS_offset' => $GPOS_offset, 'GSUB_length' => $GSUB_length, 'GlyphClassBases' => $this->GlyphClassBases, 'GlyphClassMarks' => $this->GlyphClassMarks, 'GlyphClassLigatures' => $this->GlyphClassLigatures, 'GlyphClassComponents' => $this->GlyphClassComponents, 'MarkGlyphSets' => $this->MarkGlyphSets, 'MarkAttachmentType' => $this->MarkAttachmentType]; - $this->fontCache->jsonWrite($this->fontkey . '.GDEFdata.json', $font); - } - function _getClassDefinitionTable() - { - // NB Any glyph not included in the range of covered GlyphIDs automatically belongs to Class 0. This is not returned by this function - $ClassFormat = $this->read_ushort(); - $GlyphByClass = []; - if ($ClassFormat == 1) { - $StartGlyph = $this->read_ushort(); - $GlyphCount = $this->read_ushort(); - for ($i = 0; $i < $GlyphCount; $i++) { - $gid = $StartGlyph + $i; - $class = $this->read_ushort(); - // Several fonts (mainly dejavu.../Freeserif etc) have a MarkAttachClassDef Format 1, where StartGlyph is 0 and GlyphCount is 1 - // This doesn't seem to do anything useful? - // Freeserif does not have $this->glyphToChar[0] allocated and would throw an error, so check if isset: - if (isset($this->glyphToChar[$gid][0])) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); - } - } - } elseif ($ClassFormat == 2) { - $tableCount = $this->read_ushort(); - for ($i = 0; $i < $tableCount; $i++) { - $startGlyphID = $this->read_ushort(); - $endGlyphID = $this->read_ushort(); - $class = $this->read_ushort(); - for ($gid = $startGlyphID; $gid <= $endGlyphID; $gid++) { - if (isset($this->glyphToChar[$gid][0])) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$gid][0]); - } - } - } - } - foreach ($GlyphByClass as $class => $glyphs) { - \sort($GlyphByClass[$class], \SORT_STRING); - // SORT makes it easier to read in development ? order not important ??? - } - \ksort($GlyphByClass); - return $GlyphByClass; - } - /** - * GSUB - Glyph Substitution - */ - function _getGSUBtables() - { - if (!isset($this->tables['GSUB'])) { - return [[], [], [], '']; - } - $ffeats = []; - $gsub_offset = $this->seek_table('GSUB'); - $this->skip(4); - $ScriptList_offset = $gsub_offset + $this->read_ushort(); - $FeatureList_offset = $gsub_offset + $this->read_ushort(); - $LookupList_offset = $gsub_offset + $this->read_ushort(); - // ScriptList - $this->seek($ScriptList_offset); - $ScriptCount = $this->read_ushort(); - for ($i = 0; $i < $ScriptCount; $i++) { - $ScriptTag = $this->read_tag(); - // = "beng", "deva" etc. - $ScriptTableOffset = $this->read_ushort(); - $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; - } - // Script Table - foreach ($ffeats as $t => $o) { - $ls = []; - $this->seek($o); - $DefLangSys_offset = $this->read_ushort(); - if ($DefLangSys_offset > 0) { - $ls['DFLT'] = $DefLangSys_offset + $o; - } - $LangSysCount = $this->read_ushort(); - for ($i = 0; $i < $LangSysCount; $i++) { - $LangTag = $this->read_tag(); - // = - $LangTableOffset = $this->read_ushort(); - $ls[$LangTag] = $o + $LangTableOffset; - } - $ffeats[$t] = $ls; - } - // Get FeatureIndexList - // LangSys Table - from first listed langsys - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = []; - $langsystable_offset = $o; - $this->seek($langsystable_offset); - $LookUpOrder = $this->read_ushort(); - //==NULL - $ReqFeatureIndex = $this->read_ushort(); - if ($ReqFeatureIndex != 0xffff) { - $FeatureIndex[] = $ReqFeatureIndex; - } - $FeatureCount = $this->read_ushort(); - for ($i = 0; $i < $FeatureCount; $i++) { - $FeatureIndex[] = $this->read_ushort(); - // = index of feature - } - $ffeats[$st][$t] = $FeatureIndex; - } - } - // Feauture List => LookupListIndex es - $this->seek($FeatureList_offset); - $FeatureCount = $this->read_ushort(); - $Feature = []; - for ($i = 0; $i < $FeatureCount; $i++) { - $tag = $this->read_tag(); - if ($tag == 'smcp') { - $this->hassmallcapsGSUB = \true; - } - $Feature[$i] = ['tag' => $tag]; - $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $FeatureCount; $i++) { - $this->seek($Feature[$i]['offset']); - $this->read_ushort(); - // null [FeatureParams] - $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); - $Feature[$i]['LookupListIndex'] = []; - for ($c = 0; $c < $Lookupcount; $c++) { - $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); - } - } - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = $ffeats[$st][$t]; - foreach ($FeatureIndex as $k => $fi) { - $ffeats[$st][$t][$k] = $Feature[$fi]; - } - } - } - $gsub = []; - $GSUBScriptLang = []; - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $langsys) { - $lg = []; - foreach ($langsys as $ft) { - $lg[$ft['LookupListIndex'][0]] = $ft; - } - // list of Lookups in order they need to be run i.e. order listed in Lookup table - \ksort($lg); - foreach ($lg as $ft) { - $gsub[$st][$t][$ft['tag']] = $ft['LookupListIndex']; - } - if (!isset($GSUBScriptLang[$st])) { - $GSUBScriptLang[$st] = ''; - } - $GSUBScriptLang[$st] .= $t . ' '; - } - } - // Get metadata and offsets for whole Lookup List table - $this->seek($LookupList_offset); - $LookupCount = $this->read_ushort(); - $GSLookup = []; - $Offsets = []; - $SubtableCount = []; - for ($i = 0; $i < $LookupCount; $i++) { - $Offsets[$i] = $LookupList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $LookupCount; $i++) { - $this->seek($Offsets[$i]); - $GSLookup[$i]['Type'] = $this->read_ushort(); - $GSLookup[$i]['Flag'] = $flag = $this->read_ushort(); - $GSLookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $GSLookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); - } - // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure - if (($flag & 0x10) == 0x10) { - $GSLookup[$i]['MarkFilteringSet'] = $this->read_ushort(); - } else { - $GSLookup[$i]['MarkFilteringSet'] = ''; - } - // Lookup Type 7: Extension - if ($GSLookup[$i]['Type'] == 7) { - // Overwrites new offset (32-bit) for each subtable, and a new lookup Type - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $this->seek($GSLookup[$i]['Subtables'][$c]); - $ExtensionPosFormat = $this->read_ushort(); - $type = $this->read_ushort(); - $ext_offset = $this->read_ulong(); - $GSLookup[$i]['Subtables'][$c] = $GSLookup[$i]['Subtables'][$c] + $ext_offset; - } - $GSLookup[$i]['Type'] = $type; - } - } - // Process Whole LookupList - Get LuCoverage = Lookup coverage just for first glyph - $this->GSLuCoverage = []; - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $GSLookup[$i]['SubtableCount']; $c++) { - $this->seek($GSLookup[$i]['Subtables'][$c]); - $PosFormat = $this->read_ushort(); - if ($GSLookup[$i]['Type'] == 5 && $PosFormat == 3) { - $this->skip(4); - } elseif ($GSLookup[$i]['Type'] == 6 && $PosFormat == 3) { - $BacktrackGlyphCount = $this->read_ushort(); - $this->skip(2 * $BacktrackGlyphCount + 2); - } - // NB Coverage only looks at glyphs for position 1 (i.e. 5.3 and 6.3) // NEEDS TO READ ALL ******************** - $Coverage = $GSLookup[$i]['Subtables'][$c] + $this->read_ushort(); - $this->seek($Coverage); - $glyphs = $this->_getCoverage(\false, 2); - $this->GSLuCoverage[$i][$c] = $glyphs; - } - } - // $this->GSLuCoverage and $GSLookup - $this->fontCache->jsonWrite($this->fontkey . '.GSUBdata.json', $this->GSLuCoverage); - // Now repeats as original to get Substitution rules - // Get metadata and offsets for whole Lookup List table - $this->seek($LookupList_offset); - $LookupCount = $this->read_ushort(); - $Lookup = []; - for ($i = 0; $i < $LookupCount; $i++) { - $Lookup[$i]['offset'] = $LookupList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $LookupCount; $i++) { - $this->seek($Lookup[$i]['offset']); - $Lookup[$i]['Type'] = $this->read_ushort(); - $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); - $Lookup[$i]['SubtableCount'] = $this->read_ushort(); - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['offset'] + $this->read_ushort(); - } - // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure - if (($flag & 0x10) == 0x10) { - $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); - } else { - $Lookup[$i]['MarkFilteringSet'] = ''; - } - // Lookup Type 7: Extension - if ($Lookup[$i]['Type'] == 7) { - // Overwrites new offset (32-bit) for each subtable, and a new lookup Type - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); - $ExtensionPosFormat = $this->read_ushort(); - $type = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ulong(); - } - $Lookup[$i]['Type'] = $type; - } - } - // Process (1) Whole LookupList - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $this->seek($Lookup[$i]['Subtable'][$c]['Offset']); - $SubstFormat = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['Format'] = $SubstFormat; - /* - Lookup['Type'] Enumeration table for glyph substitution - Value Type Description - 1 Single Replace one glyph with one glyph - 2 Multiple Replace one glyph with more than one glyph - 3 Alternate Replace one glyph with one of many glyphs - 4 Ligature Replace multiple glyphs with one glyph - 5 Context Replace one or more glyphs in context - 6 Chaining Context Replace one or more glyphs in chained context - 7 Extension Substitution Extension mechanism for other substitutions (i.e. this excludes the Extension type substitution itself) - 8 Reverse chaining context single Applied in reverse order, replace single glyph in chaining context - */ - // LookupType 1: Single Substitution Subtable - if ($Lookup[$i]['Type'] == 1) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - if ($SubstFormat == 1) { - // Calculated output glyph indices - $Lookup[$i]['Subtable'][$c]['DeltaGlyphID'] = $this->read_short(); - } elseif ($SubstFormat == 2) { - // Specified output glyph indices - $GlyphCount = $this->read_ushort(); - for ($g = 0; $g < $GlyphCount; $g++) { - $Lookup[$i]['Subtable'][$c]['Glyphs'][] = $this->read_ushort(); - } - } - } elseif ($Lookup[$i]['Type'] == 2) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SequenceCount'] = $SequenceCount = $this->read_short(); - for ($s = 0; $s < $SequenceCount; $s++) { - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $SequenceCount; $s++) { - // Sequence Tables - $this->seek($Lookup[$i]['Subtable'][$c]['Sequences'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['GlyphCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['Sequences'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); - } - } - } elseif ($Lookup[$i]['Type'] == 3) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['AlternateSetCount'] = $AlternateSetCount = $this->read_short(); - for ($s = 0; $s < $AlternateSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $AlternateSetCount; $s++) { - // AlternateSet Tables - $this->seek($Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['GlyphCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['AlternateSets'][$s]['SubstituteGlyphID'][] = $this->read_ushort(); - } - } - } elseif ($Lookup[$i]['Type'] == 4) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['LigSetCount'] = $LigSetCount = $this->read_short(); - for ($s = 0; $s < $LigSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $LigSetCount; $s++) { - // LigatureSet Tables - $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g] = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Offset'] + $this->read_ushort(); - } - } - for ($s = 0; $s < $LigSetCount; $s++) { - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { - // Ligature tables - $this->seek($Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigatureOffset'][$g]); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount'] = $this->read_ushort(); - for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { - $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l] = $this->read_ushort(); - } - } - } - } elseif ($Lookup[$i]['Type'] == 5) { - // Format 1: Context Substitution - if ($SubstFormat == 1) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubRuleSetCount'] = $SubRuleSetCount = $this->read_short(); - for ($s = 0; $s < $SubRuleSetCount; $s++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_short(); - } - for ($s = 0; $s < $SubRuleSetCount; $s++) { - // SubRuleSet Tables - $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset']); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount'] = $this->read_short(); - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['Offset'] + $this->read_ushort(); - } - } - for ($s = 0; $s < $SubRuleSetCount; $s++) { - // SubRule Tables - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $g++) { - // Ligature tables - $this->seek($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleOffset'][$g]); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount'] = $this->read_ushort(); - // "Input"::[GlyphCount - 1]::Array of input GlyphIDs-start with second glyph - for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['GlyphCount']; $l++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['Input'][$l] = $this->read_ushort(); - } - // "SubstLookupRecord"::[SubstCount]::Array of SubstLookupRecords-in design order - for ($l = 0; $l < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstCount']; $l++) { - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['SequenceIndex'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$g]['SubstLookupRecord'][$l]['LookupListIndex'] = $this->read_ushort(); - } - } - } - } elseif ($SubstFormat == 2) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubClassSetCnt'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = 0; - } else { - $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; - } - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("GPOS Lookup Type " . $Lookup[$i]['Type'] . ", Format " . $SubstFormat . " not supported (ttfontsuni.php)."); - } - } elseif ($Lookup[$i]['Type'] == 6) { - // Format 1: Simple Chaining Context Glyph Substitution p255 - if ($SubstFormat == 1) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - } elseif ($SubstFormat == 2) { - $Lookup[$i]['Subtable'][$c]['CoverageTableOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['InputClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset'] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $b++) { - $offset = $this->read_ushort(); - if ($offset == 0x0) { - $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $offset; - } else { - $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $offset; - } - } - } elseif ($SubstFormat == 3) { - $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['InputGlyphCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['CoverageInput'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['CoverageLookahead'][] = $Lookup[$i]['Subtable'][$c]['Offset'] + $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['SubstCount'] = $this->read_ushort(); - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { - $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex'] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex'] = $this->read_ushort(); - // Substitution Lookup Record - // All contextual substitution subtables specify the substitution data in a Substitution Lookup Record - // (SubstLookupRecord). Each record contains a SequenceIndex, which indicates the position where the substitution - // will occur in the glyph sequence. In addition, a LookupListIndex identifies the lookup to be applied at the - // glyph position specified by the SequenceIndex. - } - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Lookup Type "%s" not supported.', $Lookup[$i]['Type'])); - } - } - } - // Process (2) Whole LookupList - // Get Coverage tables and prepare preg_replace - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; - // LookupType 1: Single Substitution Subtable 1 => 1 - if ($Lookup[$i]['Type'] == 1) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(\false); - for ($g = 0; $g < \count($glyphs); $g++) { - $replace = []; - $substitute = []; - $replace[] = unicode_hex($this->glyphToChar[$glyphs[$g]][0]); - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - if (isset($Lookup[$i]['Subtable'][$c]['DeltaGlyphID'])) { - // Format 1 - $substitute[] = unicode_hex($this->glyphToChar[$glyphs[$g] + $Lookup[$i]['Subtable'][$c]['DeltaGlyphID']][0]); - } else { - // Format 2 - $substitute[] = unicode_hex($this->glyphToChar[$Lookup[$i]['Subtable'][$c]['Glyphs'][$g]][0]); - } - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; - } - } elseif ($Lookup[$i]['Type'] == 2) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(); - for ($g = 0; $g < \count($glyphs); $g++) { - $replace = []; - $substitute = []; - $replace[] = $glyphs[$g]; - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - if (!isset($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) || \count($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID']) == 0) { - continue; - } - // Illegal for GlyphCount to be 0; either error in font, or something has gone wrong - lets carry on for now! - foreach ($Lookup[$i]['Subtable'][$c]['Sequences'][$g]['SubstituteGlyphID'] as $sub) { - $substitute[] = unicode_hex($this->glyphToChar[$sub][0]); - } - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; - } - } elseif ($Lookup[$i]['Type'] == 3) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(); - for ($g = 0; $g < \count($glyphs); $g++) { - $replace = []; - $substitute = []; - $replace[] = $glyphs[$g]; - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - $gid = $Lookup[$i]['Subtable'][$c]['AlternateSets'][$g]['SubstituteGlyphID'][0]; - if (!isset($this->glyphToChar[$gid][0])) { - continue; - } - $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute]; - } - } elseif ($Lookup[$i]['Type'] == 4) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $glyphs = $this->_getCoverage(); - $LigSetCount = $Lookup[$i]['Subtable'][$c]['LigSetCount']; - for ($s = 0; $s < $LigSetCount; $s++) { - for ($g = 0; $g < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['LigCount']; $g++) { - $replace = []; - $substitute = []; - $replace[] = $glyphs[$s]; - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $replace[0], $Lookup[$i]['MarkFilteringSet'])) { - continue; - } - for ($l = 1; $l < $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']; $l++) { - $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['GlyphID'][$l]; - $rpl = unicode_hex($this->glyphToChar[$gid][0]); - // Flag = Ignore - if ($this->_checkGSUBignore($Lookup[$i]['Flag'], $rpl, $Lookup[$i]['MarkFilteringSet'])) { - continue 2; - } - $replace[] = $rpl; - } - $gid = $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['LigGlyph']; - if (!isset($this->glyphToChar[$gid][0])) { - continue; - } - $substitute[] = unicode_hex($this->glyphToChar[$gid][0]); - $Lookup[$i]['Subtable'][$c]['subs'][] = ['Replace' => $replace, 'substitute' => $substitute, 'CompCount' => $Lookup[$i]['Subtable'][$c]['LigSet'][$s]['Ligature'][$g]['CompCount']]; - } - } - } elseif ($Lookup[$i]['Type'] == 5) { - // Format 1: Context Substitution - if ($SubstFormat == 1) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { - $SubRuleSet = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]; - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph'] = $CoverageGlyphs[$s]; - for ($r = 0; $r < $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRuleCount']; $r++) { - $GlyphCount = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['GlyphCount']; - for ($g = 1; $g < $GlyphCount; $g++) { - $glyphID = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['Input'][$g]; - $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - } - } - } elseif ($SubstFormat == 2) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['ClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { - if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s]); - $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt'] = $SubClassRuleCnt = $this->read_ushort(); - $SubClassRule = []; - for ($b = 0; $b < $SubClassRuleCnt; $b++) { - $SubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $SubClassRule[$b]; - } - } - } - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubClassSetCnt']; $s++) { - if ($Lookup[$i]['Subtable'][$c]['SubClassSetOffset'][$s] > 0) { - $SubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRuleCnt']; - for ($b = 0; $b < $SubClassRuleCnt; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b]); - $Rule = []; - $Rule['InputGlyphCount'] = $this->read_ushort(); - $Rule['SubstCount'] = $this->read_ushort(); - for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { - $Rule['Input'][$r] = $this->read_ushort(); - } - for ($r = 0; $r < $Rule['SubstCount']; $r++) { - $Rule['SequenceIndex'][$r] = $this->read_ushort(); - $Rule['LookupListIndex'][$r] = $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['SubClassSet'][$s]['SubClassRule'][$b] = $Rule; - } - } - } - } elseif ($SubstFormat == 3) { - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = \implode("|", $glyphs); - } - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Lookup Type 5, SubstFormat 3 not tested. Please report this with the name of font used - " . $this->fontkey); - } - } elseif ($Lookup[$i]['Type'] == 6) { - // Format 1: Simple Chaining Context Glyph Substitution p255 - if ($SubstFormat == 1) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - $ChainSubRuleSetCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; - for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s]); - $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount'] = $this->read_ushort(); - for ($r = 0; $r < $ChainSubRuleCnt; $r++) { - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r] = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetOffset'][$s] + $this->read_ushort(); - } - } - for ($s = 0; $s < $ChainSubRuleSetCnt; $s++) { - $ChainSubRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleCount']; - for ($r = 0; $r < $ChainSubRuleCnt; $r++) { - // ChainSubRule - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRuleOffset'][$r]); - $BacktrackGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphCount'] = $this->read_ushort(); - for ($g = 0; $g < $BacktrackGlyphCount; $g++) { - $glyphID = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['BacktrackGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - $InputGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphCount'] = $this->read_ushort(); - for ($g = 1; $g < $InputGlyphCount; $g++) { - $glyphID = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['InputGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - $LookaheadGlyphCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphCount'] = $this->read_ushort(); - for ($g = 0; $g < $LookaheadGlyphCount; $g++) { - $glyphID = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookaheadGlyphs'][$g] = unicode_hex($this->glyphToChar[$glyphID][0]); - } - $SubstCount = $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SubstCount'] = $this->read_ushort(); - for ($lu = 0; $lu < $SubstCount; $lu++) { - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['SequenceIndex'][$lu] = $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'][$r]['LookupListIndex'][$lu] = $this->read_ushort(); - } - } - } - } elseif ($SubstFormat == 2) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageTableOffset']); - $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'] = $CoverageGlyphs = $this->_getCoverage(); - $BacktrackClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['BacktrackClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['BacktrackClasses'] = $BacktrackClasses; - $InputClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['InputClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['InputClasses'] = $InputClasses; - $LookaheadClasses = $this->_getClasses($Lookup[$i]['Subtable'][$c]['LookaheadClassDefOffset']); - $Lookup[$i]['Subtable'][$c]['LookaheadClasses'] = $LookaheadClasses; - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { - if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s]); - $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt'] = $ChainSubClassRuleCnt = $this->read_ushort(); - $ChainSubClassRule = []; - for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { - $ChainSubClassRule[$b] = $Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] + $this->read_ushort(); - $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $ChainSubClassRule[$b]; - } - } - } - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubClassSetCnt']; $s++) { - if (isset($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt'])) { - $ChainSubClassRuleCnt = $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRuleCnt']; - } else { - $ChainSubClassRuleCnt = 0; - } - for ($b = 0; $b < $ChainSubClassRuleCnt; $b++) { - if ($Lookup[$i]['Subtable'][$c]['ChainSubClassSetOffset'][$s] > 0) { - $this->seek($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b]); - $Rule = []; - $Rule['BacktrackGlyphCount'] = $this->read_ushort(); - for ($r = 0; $r < $Rule['BacktrackGlyphCount']; $r++) { - $Rule['Backtrack'][$r] = $this->read_ushort(); - } - $Rule['InputGlyphCount'] = $this->read_ushort(); - for ($r = 1; $r < $Rule['InputGlyphCount']; $r++) { - $Rule['Input'][$r] = $this->read_ushort(); - } - $Rule['LookaheadGlyphCount'] = $this->read_ushort(); - for ($r = 0; $r < $Rule['LookaheadGlyphCount']; $r++) { - $Rule['Lookahead'][$r] = $this->read_ushort(); - } - $Rule['SubstCount'] = $this->read_ushort(); - for ($r = 0; $r < $Rule['SubstCount']; $r++) { - $Rule['SequenceIndex'][$r] = $this->read_ushort(); - $Rule['LookupListIndex'][$r] = $this->read_ushort(); - } - $Lookup[$i]['Subtable'][$c]['ChainSubClassSet'][$s]['ChainSubClassRule'][$b] = $Rule; - } - } - } - } elseif ($SubstFormat == 3) { - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageBacktrack'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs'][] = \implode("|", $glyphs); - } - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageInput'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs'][] = \implode("|", $glyphs); - // Don't use above value as these are ordered numerically not as need to process - } - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']; $b++) { - $this->seek($Lookup[$i]['Subtable'][$c]['CoverageLookahead'][$b]); - $glyphs = $this->_getCoverage(); - $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs'][] = \implode("|", $glyphs); - } - } - } - } - } - $GSUBScriptLang = []; - $rtlpua = []; - // All glyphs added to PUA [for magic_reverse] - foreach ($gsub as $st => $scripts) { - foreach ($scripts as $t => $langsys) { - $lul = []; - // array of LookupListIndexes - $tags = []; - // corresponding array of feature tags e.g. 'ccmp' - foreach ($langsys as $tag => $ft) { - foreach ($ft as $ll) { - $lul[$ll] = $tag; - } - } - \ksort($lul); - // Order the Lookups in the order they are in the GUSB table, regardless of Feature order - $volt = $this->_getGSUBarray($Lookup, $lul, $st); - // Interrogate $volt - // isol, fin, medi, init(arab syrc) into $rtlSUB for use in ArabJoin - // but also identify all RTL chars in PUA for magic_reverse (arab syrc hebr thaa nko samr) - // identify reph, matras, vatu, half forms etc for Indic for final re-ordering - $rtl = []; - $rtlSUB = []; - $finals = ''; - if (\strpos('arab syrc hebr thaa nko samr', $st) !== \false) { - // all RTL scripts [any/all languages] ? Mandaic - foreach ($volt as $v) { - // isol fina fin2 fin3 medi med2 for Syriac - // ISOLATED FORM :: FINAL :: INITIAL :: MEDIAL :: MED2 :: FIN2 :: FIN3 - if (\strpos('isol fina init medi fin2 fin3 med2', $v['tag']) !== \false) { - $key = $v['match']; - $key = \preg_replace('/[\\(\\)]*/', '', $key); - $sub = $v['replace']; - if ($v['tag'] === 'isol') { - $kk = 0; - } elseif ($v['tag'] === 'fina') { - $kk = 1; - } elseif ($v['tag'] === 'init') { - $kk = 2; - } elseif ($v['tag'] === 'medi') { - $kk = 3; - } elseif ($v['tag'] === 'med2') { - $kk = 4; - } elseif ($v['tag'] === 'fin2') { - $kk = 5; - } elseif ($v['tag'] === 'fin3') { - $kk = 6; - } - $rtl[$key][$kk] = $sub; - if (isset($v['prel']) && \count($v['prel'])) { - $rtl[$key]['prel'][$kk] = $v['prel']; - } - if (isset($v['postl']) && \count($v['postl'])) { - $rtl[$key]['postl'][$kk] = $v['postl']; - } - if (isset($v['ignore']) && $v['ignore']) { - $rtl[$key]['ignore'][$kk] = $v['ignore']; - } - $rtlpua[] = $sub; - } else { - // Add any other glyphs which are in PUA - if (isset($v['context']) && $v['context']) { - foreach ($v['rules'] as $vs) { - $matchCount = \count($vs['match']); - for ($i = 0; $i < $matchCount; $i++) { - if (isset($vs['replace'][$i]) && \preg_match('/^0[A-F0-9]{4}$/', $vs['match'][$i])) { - if (\preg_match('/^0[EF][A-F0-9]{3}$/', $vs['replace'][$i])) { - $rtlpua[] = $vs['replace'][$i]; - } - } - } - } - } else { - \preg_match_all('/\\((0[A-F0-9]{4})\\)/', $v['match'], $m); - $matchCount = \count($m[0]); - for ($i = 0; $i < $matchCount; $i++) { - $sb = \explode(' ', $v['replace']); - foreach ($sb as $sbg) { - if (\preg_match('/(0[EF][A-F0-9]{3})/', $sbg, $mr)) { - $rtlpua[] = $mr[1]; - } - } - } - } - } - } - // For kashida, need to determine all final forms except ones already identified by kashida priority rules (see \Mpdf\Otl) - foreach ($rtl as $base => $variants) { - if (isset($variants[1])) { - // i.e. final form - if (\strpos('0FE8E 0FE94 0FEA2 0FEAA 0FEAE 0FEC2 0FEDA 0FEDE 0FB93 0FECA 0FED2 0FED6 0FEEE 0FEF0 0FEF2', $variants[1]) === \false) { - // not already included - // This version does not exclude RA (0631) FEAE; Ya (064A) FEF2; Alef Maqsurah (0649) FEF0 which - // are selected in priority if connected to a medial Bah - //if (strpos('0FE8E 0FE94 0FEA2 0FEAA 0FEC2 0FEDA 0FEDE 0FB93 0FECA 0FED2 0FED6 0FEEE', $variants[1])===false) { // not already included - $finals .= $variants[1] . ' '; - } - } - } - \ksort($rtl); - $rtlSUB = $rtl; - } - // INDIC - Dynamic properties - $rphf = []; - $half = []; - $pref = []; - $blwf = []; - $pstf = []; - if (\strpos('dev2 bng2 gur2 gjr2 ory2 tml2 tel2 knd2 mlm2 deva beng guru gujr orya taml telu knda mlym', $st) !== \false) { - // all INDIC scripts [any/all languages] - if (\strpos('deva beng guru gujr orya taml telu knda mlym', $st) !== \false) { - $is_old_spec = \true; - } else { - $is_old_spec = \false; - } - // First get 'locl' substitutions (reversed!) - $loclsubs = []; - foreach ($volt as $v) { - if (\strpos('locl', $v['tag']) !== \false) { - $key = $v['match']; - $key = \preg_replace('/[\\(\\)]*/', '', $key); - $sub = $v['replace']; - if ($key && \strlen(\trim($key)) == 5 && $sub) { - $loclsubs[$sub] = $key; - } - } - } - foreach ($volt as $v) { - // <rphf> <half> <pref> <blwf> <pstf> - // defines consonant types: - // Reph <rphf> - // Half forms <half> - // Pre-base-reordering forms of Ra/Rra <pref> - // Below-base forms <blwf> - // Post-base forms <pstf> - // applied together with <locl> feature to input sequences consisting of two characters - // This is done for each consonant - // for <rphf> and <half>, features are applied to Consonant + Halant combinations - // for <pref>, <blwf> and <pstf>, features are applied to Halant + Consonant combinations - // Old version eg 'deva' <pref>, <blwf> and <pstf>, features are applied to Consonant + Halant - // Some malformed fonts still do Consonant + Halant for these - so match both?? - // If these two glyphs form a ligature, with no additional glyphs in context - // this means the consonant has the corresponding form - // Currently set to cope with both - // See also classes/otl.php - if (\strpos('rphf half pref blwf pstf', $v['tag']) !== \false) { - if (isset($v['context']) && $v['context'] && $v['nBacktrack'] == 0 && $v['nLookahead'] == 0) { - foreach ($v['rules'] as $vs) { - if (\count($vs['match']) == 2 && \count($vs['replace']) == 1) { - $sub = $vs['replace'][0]; - // If Halant Cons <pref>, <blwf> and <pstf> in New version only - if (\strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', $vs['match'][0]) !== \false && \strpos('pref blwf pstf', $v['tag']) !== \false && !$is_old_spec) { - $key = $vs['match'][1]; - $tag = $v['tag']; - if (isset($loclsubs[$key])) { - ${$tag}[$loclsubs[$key]] = $sub; - } - $tmp =& ${$tag}; - $tmp[\hexdec($key)] = \hexdec($sub); - } elseif (\strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', $vs['match'][1]) !== \false && (\strpos('rphf half', $v['tag']) !== \false || \strpos('pref blwf pstf', $v['tag']) !== \false && ($is_old_spec || _OTL_OLD_SPEC_COMPAT_2))) { - $key = $vs['match'][0]; - $tag = $v['tag']; - if (isset($loclsubs[$key])) { - ${$tag}[$loclsubs[$key]] = $sub; - } - $tmp =& ${$tag}; - $tmp[\hexdec($key)] = \hexdec($sub); - } - } - } - } elseif (!isset($v['context'])) { - $key = $v['match']; - $key = \preg_replace('/[\\(\\)]*/', '', $key); - $sub = $v['replace']; - if ($key && \strlen(\trim($key)) == 11 && $sub) { - // If Cons Halant <rphf> and <half> always - // and <pref>, <blwf> and <pstf> in Old version - // If Halant Cons <pref>, <blwf> and <pstf> in New version only - if (\strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', \substr($key, 0, 5)) !== \false && \strpos('pref blwf pstf', $v['tag']) !== \false && !$is_old_spec) { - $key = \substr($key, 6, 5); - $tag = $v['tag']; - if (isset($loclsubs[$key])) { - ${$tag}[$loclsubs[$key]] = $sub; - } - $tmp =& ${$tag}; - $tmp[\hexdec($key)] = \hexdec($sub); - } elseif (\strpos('0094D 009CD 00A4D 00ACD 00B4D 00BCD 00C4D 00CCD 00D4D', \substr($key, 6, 5)) !== \false && (\strpos('rphf half', $v['tag']) !== \false || \strpos('pref blwf pstf', $v['tag']) !== \false && ($is_old_spec || _OTL_OLD_SPEC_COMPAT_2))) { - $key = \substr($key, 0, 5); - $tag = $v['tag']; - if (isset($loclsubs[$key])) { - ${$tag}[$loclsubs[$key]] = $sub; - } - $tmp =& ${$tag}; - $tmp[\hexdec($key)] = \hexdec($sub); - } - } - } - } - } - } - if (\count($rtl) || \count($rphf) || \count($half) || \count($pref) || \count($blwf) || \count($pstf) || $finals) { - $font = ['rtlSUB' => $rtlSUB, 'finals' => $finals, 'rphf' => $rphf, 'half' => $half, 'pref' => $pref, 'blwf' => $blwf, 'pstf' => $pstf]; - $this->fontCache->jsonWrite($this->fontkey . '.GSUB.' . $st . '.' . $t . '.json', $font); - } - if (!isset($GSUBScriptLang[$st])) { - $GSUBScriptLang[$st] = ''; - } - $GSUBScriptLang[$st] .= $t . ' '; - } - } - // All RTL glyphs from font added to (or already in) PUA [reqd for magic_reverse] - $rtlPUAstr = ''; - if (\count($rtlpua)) { - $rtlpua = \array_unique($rtlpua); - \sort($rtlpua); - $n = \count($rtlpua); - for ($i = 0; $i < $n; $i++) { - if (\hexdec($rtlpua[$i]) < \hexdec('E000') || \hexdec($rtlpua[$i]) > \hexdec('F8FF')) { - unset($rtlpua[$i]); - } - } - \sort($rtlpua, \SORT_STRING); - $rangeid = -1; - $range = []; - $prevgid = -2; - // for each character - foreach ($rtlpua as $gidhex) { - $gid = \hexdec($gidhex); - if ($gid == $prevgid + 1) { - $range[$rangeid]['end'] = $gidhex; - $range[$rangeid]['count']++; - } else { - // new range - $rangeid++; - $range[$rangeid] = []; - $range[$rangeid]['start'] = $gidhex; - $range[$rangeid]['end'] = $gidhex; - $range[$rangeid]['count'] = 1; - } - $prevgid = $gid; - } - foreach ($range as $rg) { - if ($rg['count'] == 1) { - $rtlPUAstr .= "\\x{" . $rg['start'] . "}"; - } elseif ($rg['count'] == 2) { - $rtlPUAstr .= "\\x{" . $rg['start'] . "}\\x{" . $rg['end'] . "}"; - } else { - $rtlPUAstr .= "\\x{" . $rg['start'] . "}-\\x{" . $rg['end'] . "}"; - } - } - } - return [$GSUBScriptLang, $gsub, $GSLookup, $rtlPUAstr]; - } - // GSUB functions - function _getGSUBarray(&$Lookup, &$lul, $scripttag) - { - // Process (3) LookupList for specific Script-LangSys - // Generate preg_replace - $volt = []; - $reph = ''; - $matraE = ''; - $vatu = ''; - foreach ($lul as $i => $tag) { - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $SubstFormat = $Lookup[$i]['Subtable'][$c]['Format']; - // LookupType 1: Single Substitution Subtable - if ($Lookup[$i]['Type'] == 1) { - $subCount = \count($Lookup[$i]['Subtable'][$c]['subs']); - for ($s = 0; $s < $subCount; $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; - // Ignore has already been applied earlier on - $repl = $this->_makeGSUBinputMatch($inputGlyphs, "()"); - $subs = $this->_makeGSUBinputReplacement(1, $substitute, "()", 0, 1, 0); - $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 1]; - } - } elseif ($Lookup[$i]['Type'] == 2) { - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = \implode(" ", $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute']); - // Ignore has already been applied earlier on - $repl = $this->_makeGSUBinputMatch($inputGlyphs, "()"); - $subs = $this->_makeGSUBinputReplacement(1, $substitute, "()", 0, 1, 0); - $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 2]; - } - } elseif ($Lookup[$i]['Type'] == 3) { - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; - // Ignore has already been applied earlier on - $repl = $this->_makeGSUBinputMatch($inputGlyphs, "()"); - $subs = $this->_makeGSUBinputReplacement(1, $substitute, "()", 0, 1, 0); - $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 3]; - } - } elseif ($Lookup[$i]['Type'] == 4) { - for ($s = 0; $s < \count($Lookup[$i]['Subtable'][$c]['subs']); $s++) { - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['subs'][$s]['Replace']; - $substitute = $Lookup[$i]['Subtable'][$c]['subs'][$s]['substitute'][0]; - // Ignore has already been applied earlier on - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - $repl = $this->_makeGSUBinputMatch($inputGlyphs, $ignore); - $subs = $this->_makeGSUBinputReplacement(\count($inputGlyphs), $substitute, $ignore, 0, \count($inputGlyphs), 0); - $volt[] = ['match' => $repl, 'replace' => $subs, 'tag' => $tag, 'key' => $inputGlyphs[0], 'type' => 4, 'CompCount' => $Lookup[$i]['Subtable'][$c]['subs'][$s]['CompCount'], 'Lig' => $substitute]; - } - } elseif ($Lookup[$i]['Type'] == 5) { - // Format 1: Context Substitution - if ($SubstFormat == 1) { - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['SubRuleSetCount']; $s++) { - // SubRuleSet - $subRule = []; - foreach ($Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['SubRule'] as $rule) { - // SubRule - $inputGlyphs = []; - if ($rule['GlyphCount'] > 1) { - $inputGlyphs = $rule['InputGlyphs']; - } - $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['SubRuleSet'][$s]['FirstGlyph']; - \ksort($inputGlyphs); - $nInput = \count($inputGlyphs); - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); - $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => '', 'match' => $contextInputMatch, 'nBacktrack' => 0, 'nInput' => $nInput, 'nLookahead' => 0, 'rules' => []]; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['SubstLookupRecord'][$b]['LookupListIndex']; - $seqIndex = $rule['SubstLookupRecord'][$b]['SequenceIndex']; - // $Lookup[$lup] = secondary Lookup - for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { - if (\count($Lookup[$lup]['Subtable'][$lus]['subs'])) { - foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { - $lookupGlyphs = $luss['Replace']; - $mLen = \count($lookupGlyphs); - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // then apply the substitution - if (\strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === \false) { - continue; - } - $REPL = \implode(" ", $luss['substitute']); - if (\strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== \false && $scripttag == 'arab') { - $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; - } else { - $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0]]; - } - } - } - } - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } elseif ($SubstFormat == 2) { - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - foreach ($Lookup[$i]['Subtable'][$c]['SubClassSet'] as $inputClass => $cscs) { - for ($cscrule = 0; $cscrule < $cscs['SubClassRuleCnt']; $cscrule++) { - $rule = $cscs['SubClassRule'][$cscrule]; - $inputGlyphs = []; - $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; - if ($rule['InputGlyphCount'] > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { - $classindex = $rule['Input'][$gcl]; - if (isset($Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex])) { - $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; - } else { - $inputGlyphs[$gcl] = ''; - } - } - } - $nInput = $rule['InputGlyphCount']; - $nIsubs = 2 * $nInput - 1; - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); - $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => '', 'match' => $contextInputMatch, 'nBacktrack' => 0, 'nInput' => $nInput, 'nLookahead' => 0, 'rules' => []]; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['LookupListIndex'][$b]; - $seqIndex = $rule['SequenceIndex'][$b]; - // $Lookup[$lup] = secondary Lookup - for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { - if (isset($Lookup[$lup]['Subtable'][$lus]['subs']) && \count($Lookup[$lup]['Subtable'][$lus]['subs'])) { - foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { - $lookupGlyphs = $luss['Replace']; - $mLen = \count($lookupGlyphs); - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // then apply the substitution - if (\strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === \false) { - continue; - } - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); - $REPL = \implode(" ", $luss['substitute']); - // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" - if (\strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== \false && $scripttag == 'arab') { - $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; - } else { - $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0]]; - } - } - } - } - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } elseif ($SubstFormat == 3) { - // IgnoreMarks flag set on main Lookup table - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; - $CoverageInputGlyphs = \implode('|', $inputGlyphs); - $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; - if ($Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']) { - $backtrackGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs']; - } else { - $backtrackGlyphs = []; - } - // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ - $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); - if ($Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']) { - $lookaheadGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs']; - } else { - $lookaheadGlyphs = []; - } - // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ - $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); - $nBsubs = 2 * \count($backtrackGlyphs); - $nIsubs = 2 * $nInput - 1; - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); - $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => $contextInputMatch . $lookaheadMatch, 'nBacktrack' => \count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => \count($lookaheadGlyphs), 'rules' => []]; - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { - $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; - $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; - for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { - if (\count($Lookup[$lup]['Subtable'][$lus]['subs'])) { - foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { - $lookupGlyphs = $luss['Replace']; - $mLen = \count($lookupGlyphs); - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // then apply the substitution - if (\strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === \false) { - continue; - } - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); - $REPL = \implode(" ", $luss['substitute']); - if (\strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== \false && $scripttag == 'arab') { - $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; - } else { - $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0]]; - } - } - } - } - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } elseif ($Lookup[$i]['Type'] == 6) { - // Format 1: Simple Chaining Context Glyph Substitution p255 - if ($SubstFormat == 1) { - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - for ($s = 0; $s < $Lookup[$i]['Subtable'][$c]['ChainSubRuleSetCount']; $s++) { - // ChainSubRuleSet - $subRule = []; - $firstInputGlyph = $Lookup[$i]['Subtable'][$c]['CoverageGlyphs'][$s]; - // First input gyyph - foreach ($Lookup[$i]['Subtable'][$c]['ChainSubRuleSet'][$s]['ChainSubRule'] as $rule) { - // ChainSubRule - $inputGlyphs = []; - if ($rule['InputGlyphCount'] > 1) { - $inputGlyphs = $rule['InputGlyphs']; - } - $inputGlyphs[0] = $firstInputGlyph; - \ksort($inputGlyphs); - $nInput = \count($inputGlyphs); - if ($rule['BacktrackGlyphCount']) { - $backtrackGlyphs = $rule['BacktrackGlyphs']; - } else { - $backtrackGlyphs = []; - } - $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); - if ($rule['LookaheadGlyphCount']) { - $lookaheadGlyphs = $rule['LookaheadGlyphs']; - } else { - $lookaheadGlyphs = []; - } - $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); - $nBsubs = 2 * \count($backtrackGlyphs); - $nIsubs = 2 * $nInput - 1; - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); - $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => $contextInputMatch . $lookaheadMatch, 'nBacktrack' => \count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => \count($lookaheadGlyphs), 'rules' => []]; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['LookupListIndex'][$b]; - $seqIndex = $rule['SequenceIndex'][$b]; - // $Lookup[$lup] = secondary Lookup - for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { - if (\count($Lookup[$lup]['Subtable'][$lus]['subs'])) { - foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { - $lookupGlyphs = $luss['Replace']; - $mLen = \count($lookupGlyphs); - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // then apply the substitution - if (\strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === \false) { - continue; - } - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); - $REPL = \implode(" ", $luss['substitute']); - if (\strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== \false && $scripttag == 'arab') { - $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; - } else { - $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0]]; - } - } - } - } - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } elseif ($SubstFormat == 2) { - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - foreach ($Lookup[$i]['Subtable'][$c]['ChainSubClassSet'] as $inputClass => $cscs) { - for ($cscrule = 0; $cscrule < $cscs['ChainSubClassRuleCnt']; $cscrule++) { - $rule = $cscs['ChainSubClassRule'][$cscrule]; - // These contain classes of glyphs as strings - // $Lookup[$i]['Subtable'][$c]['InputClasses'][(class)] e.g. 02E6|02E7|02E8 - // $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][(class)] - // $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][(class)] - // These contain arrays of classIndexes - // [Backtrack] [Lookahead] and [Input] (Input is from the second position only) - $inputGlyphs = []; - if (isset($Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass])) { - $inputGlyphs[0] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$inputClass]; - } else { - $inputGlyphs[0] = ''; - } - if ($rule['InputGlyphCount'] > 1) { - // NB starts at 1 - for ($gcl = 1; $gcl < $rule['InputGlyphCount']; $gcl++) { - $classindex = $rule['Input'][$gcl]; - if (isset($Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex])) { - $inputGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['InputClasses'][$classindex]; - } else { - $inputGlyphs[$gcl] = ''; - } - } - } - $nInput = $rule['InputGlyphCount']; - if ($rule['BacktrackGlyphCount']) { - for ($gcl = 0; $gcl < $rule['BacktrackGlyphCount']; $gcl++) { - $classindex = $rule['Backtrack'][$gcl]; - if (isset($Lookup[$i]['Subtable'][$c]['BacktrackClasses'][$classindex])) { - $backtrackGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['BacktrackClasses'][$classindex]; - } else { - $backtrackGlyphs[$gcl] = ''; - } - } - } else { - $backtrackGlyphs = []; - } - // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ - $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); - if ($rule['LookaheadGlyphCount']) { - for ($gcl = 0; $gcl < $rule['LookaheadGlyphCount']; $gcl++) { - $classindex = $rule['Lookahead'][$gcl]; - if (isset($Lookup[$i]['Subtable'][$c]['LookaheadClasses'][$classindex])) { - $lookaheadGlyphs[$gcl] = $Lookup[$i]['Subtable'][$c]['LookaheadClasses'][$classindex]; - } else { - $lookaheadGlyphs[$gcl] = ''; - } - } - } else { - $lookaheadGlyphs = []; - } - // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ - $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); - $nBsubs = 2 * \count($backtrackGlyphs); - $nIsubs = 2 * $nInput - 1; - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); - $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => $contextInputMatch . $lookaheadMatch, 'nBacktrack' => \count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => \count($lookaheadGlyphs), 'rules' => []]; - for ($b = 0; $b < $rule['SubstCount']; $b++) { - $lup = $rule['LookupListIndex'][$b]; - $seqIndex = $rule['SequenceIndex'][$b]; - // $Lookup[$lup] = secondary Lookup - for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { - if (\count($Lookup[$lup]['Subtable'][$lus]['subs'])) { - foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { - $lookupGlyphs = $luss['Replace']; - $mLen = \count($lookupGlyphs); - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // then apply the substitution - if (\strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === \false) { - continue; - } - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); - $REPL = \implode(" ", $luss['substitute']); - // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" - if (\strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== \false && $scripttag == 'arab') { - $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; - } else { - $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0]]; - } - } - } - } - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } elseif ($SubstFormat == 3) { - // IgnoreMarks flag set on main Lookup table - $ignore = $this->_getGSUBignoreString($Lookup[$i]['Flag'], $Lookup[$i]['MarkFilteringSet']); - $inputGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageInputGlyphs']; - $CoverageInputGlyphs = \implode('|', $inputGlyphs); - $nInput = $Lookup[$i]['Subtable'][$c]['InputGlyphCount']; - if ($Lookup[$i]['Subtable'][$c]['BacktrackGlyphCount']) { - $backtrackGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageBacktrackGlyphs']; - } else { - $backtrackGlyphs = []; - } - // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ - $backtrackMatch = $this->_makeGSUBbacktrackMatch($backtrackGlyphs, $ignore); - if ($Lookup[$i]['Subtable'][$c]['LookaheadGlyphCount']) { - $lookaheadGlyphs = $Lookup[$i]['Subtable'][$c]['CoverageLookaheadGlyphs']; - } else { - $lookaheadGlyphs = []; - } - // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ - $lookaheadMatch = $this->_makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore); - $nBsubs = 2 * \count($backtrackGlyphs); - $nIsubs = 2 * $nInput - 1; - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, [], 0); - $subRule = ['context' => 1, 'tag' => $tag, 'matchback' => $backtrackMatch, 'match' => $contextInputMatch . $lookaheadMatch, 'nBacktrack' => \count($backtrackGlyphs), 'nInput' => $nInput, 'nLookahead' => \count($lookaheadGlyphs), 'rules' => []]; - for ($b = 0; $b < $Lookup[$i]['Subtable'][$c]['SubstCount']; $b++) { - $lup = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['LookupListIndex']; - $seqIndex = $Lookup[$i]['Subtable'][$c]['SubstLookupRecord'][$b]['SequenceIndex']; - for ($lus = 0; $lus < $Lookup[$lup]['SubtableCount']; $lus++) { - if (empty($Lookup[$lup]['Subtable'][$lus]['subs']) || !\is_array($Lookup[$lup]['Subtable'][$lus]['subs'])) { - continue; - } - foreach ($Lookup[$lup]['Subtable'][$lus]['subs'] as $luss) { - $lookupGlyphs = $luss['Replace']; - // Only apply if the (first) 'Replace' glyph from the - // Lookup list is in the [inputGlyphs] at ['SequenceIndex'] - // then apply the substitution - if (\strpos($inputGlyphs[$seqIndex], $lookupGlyphs[0]) === \false) { - continue; - } - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - $contextInputMatch = $this->_makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex); - $REPL = \implode(" ", $luss['substitute']); - if (\strpos("isol fina fin2 fin3 medi med2 init ", $tag) !== \false && $scripttag == 'arab') { - $volt[] = ['match' => $lookupGlyphs[0], 'replace' => $REPL, 'tag' => $tag, 'prel' => $backtrackGlyphs, 'postl' => $lookaheadGlyphs, 'ignore' => $ignore]; - } else { - $subRule['rules'][] = ['type' => $Lookup[$lup]['Type'], 'match' => $lookupGlyphs, 'replace' => $luss['substitute'], 'seqIndex' => $seqIndex, 'key' => $lookupGlyphs[0]]; - } - } - } - } - if (\count($subRule['rules'])) { - $volt[] = $subRule; - } - } - } - } - } - return $volt; - } - function _checkGSUBignore($flag, $glyph, $MarkFilteringSet) - { - $ignore = \false; - // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) - if (($flag & 0x8) == 0x8 && ($flag & 0xff00) == 0 && \strpos($this->GlyphClassMarks, $glyph)) { - $ignore = \true; - } - if (($flag & 0x4) == 0x4 && \strpos($this->GlyphClassLigatures, $glyph)) { - $ignore = \true; - } - if (($flag & 0x2) == 0x2 && \strpos($this->GlyphClassBases, $glyph)) { - $ignore = \true; - } - // Flag & 0xFF?? = MarkAttachmentType - if ($flag & 0xff00) { - // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" - // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table - if (\strpos($this->MarkAttachmentType[$flag >> 8], $glyph)) { - $ignore = \true; - } - } - // Flag & 0x0010 = UseMarkFilteringSet - if ($flag & 0x10 && \strpos($this->MarkGlyphSets[$MarkFilteringSet], $glyph)) { - $ignore = \true; - } - return $ignore; - } - function _getGSUBignoreString($flag, $MarkFilteringSet) - { - // If ignoreFlag set, combine all ignore glyphs into -> "((?:(?: FBA1| FBA2| FBA3))*)" - // else "()" - // for Input - set on secondary Lookup table if in Context, and set Backtrack and Lookahead on Context Lookup - $str = ""; - $ignoreflag = 0; - // Flag & 0xFF?? = MarkAttachmentType - if ($flag & 0xff00) { - // "a lookup must ignore any mark glyphs that are not in the specified mark attachment class" - // $this->MarkAttachmentType is already adjusted for this i.e. contains all Marks except those in the MarkAttachmentClassDef table - $MarkAttachmentType = $flag >> 8; - $ignoreflag = $flag; - $str = $this->MarkAttachmentType[$MarkAttachmentType]; - } - // Flag & 0x0010 = UseMarkFilteringSet - if ($flag & 0x10) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Font \"" . $this->fontkey . "\" contains MarkGlyphSets which is not supported"); - $str = $this->MarkGlyphSets[$MarkFilteringSet]; - } - // If Ignore Marks set, supercedes any above - // Flag & 0x0008 = Ignore Marks - (unless already done with MarkAttachmentType) - if (($flag & 0x8) == 0x8 && ($flag & 0xff00) == 0) { - $ignoreflag = 8; - $str = $this->GlyphClassMarks; - } - // Flag & 0x0004 = Ignore Ligatures - if (($flag & 0x4) == 0x4) { - $ignoreflag += 4; - if ($str) { - $str .= "|"; - } - $str .= $this->GlyphClassLigatures; - } - // Flag & 0x0002 = Ignore BaseGlyphs - if (($flag & 0x2) == 0x2) { - $ignoreflag += 2; - if ($str) { - $str .= "|"; - } - $str .= $this->GlyphClassBases; - } - if ($str) { - // This originally returned e.g. ((?:(?:[IGNORE8]))*) when NOT specific to a Lookup e.g. rtlSub in - // arabictypesetting.GSUB.arab.DFLT.php - // This would save repeatedly saving long text strings if used multiple times - // When writing e.g. arabictypesetting.GSUB.arab.DFLT.php to file, included as $ignore[8] - // Would need to also write the $ignore array to that file - // // If UseMarkFilteringSet (specific to the Lookup) return the string - // if (($flag & 0x0010) && ($flag & 0x0008) != 0x0008) { - // return "((?:(?:" . $str . "))*)"; - // } - // else { return "((?:(?:" . "[IGNORE".$ignoreflag."]" . "))*)"; } - // // e.g. ((?:(?: 0031| 0032| 0033| 0034| 0045))*) - // But never finished coding it to add the $ignore array to the file, and it doesn't seem to occur often enough to be worth - // writing. So just output it as a string: - return "((?:(?:" . $str . "))*)"; - } else { - return "()"; - } - } - // GSUB Patterns - /* - BACKTRACK INPUT LOOKAHEAD - ================================== ================== ================================== - (FEEB|FEEC)(ign) ¦(FD12|FD13)(ign) ¦(0612)¦(ign) (0613)¦(ign) (FD12|FD13)¦(ign) (FEEB|FEEC) - ---------------- ---------------- ----- ------------ --------------- --------------- - Backtrack 1 Backtrack 2 Input 1 Input 2 Lookahead 1 Lookahead 2 - -------- --- --------- --- ---- --- ---- --- --------- --- ------- - \${1} \${2} \${3} \${4} \${5+} \${6+} \${7+} \${8+} - - nBacktrack = 2 nInput = 2 nLookahead = 2 - - nBsubs = 2xnBack nIsubs = (nBsubs+) nLsubs = (nBsubs+nIsubs+) 2xnLookahead - "\${1}\${2} " (nInput*2)-1 "\${5+} \${6+}" - "REPL" - - ¦\${1}\${2} ¦\${3}\${4} ¦REPL¦\${5+} \${6+}¦\${7+} \${8+}¦ - - - INPUT nInput = 5 - ============================================================ - ¦(0612)¦(ign) (0613)¦(ign) (0614)¦(ign) (0615)¦(ign) (0615)¦ - \${1} \${2} \${3} \${4} \${5} \${6} \${7} \${8} \${9} (All backreference numbers are + nBsubs) - ----- ------------ ------------ ------------ ------------ - Input 1 Input 2 Input 3 Input 4 Input 5 - - A====== SequenceIndex=1 ; Lookup match nGlyphs=1 - B=================== SequenceIndex=1 ; Lookup match nGlyphs=2 - C=============================== SequenceIndex=1 ; Lookup match nGlyphs=3 - D======================= SequenceIndex=2 ; Lookup match nGlyphs=2 - E===================================== SequenceIndex=2 ; Lookup match nGlyphs=3 - F====================== SequenceIndex=4 ; Lookup match nGlyphs=2 - - All backreference numbers are + nBsubs - A - "REPL\${2} \${3}\${4} \${5}\${6} \${7}\${8} \${9}" - B - "REPL\${2}\${4} \${5}\${6} \${7}\${8} \${9}" - C - "REPL\${2}\${4}\${6} \${7}\${8} \${9}" - D - "\${1} REPL\${2}\${4}\${6} \${7}\${8} \${9}" - E - "\${1} REPL\${2}\${4}\${6}\${8} \${9}" - F - "\${1}\${2} \${3}\${4} \${5} REPL\${6}\${8}" - */ - function _makeGSUBcontextInputMatch($inputGlyphs, $ignore, $lookupGlyphs, $seqIndex) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context - // $lookupGlyphs = array of glyphs (single Glyphs) making up Lookup Input sequence - $mLen = \count($lookupGlyphs); - // nGlyphs in the secondary Lookup match - $nInput = \count($inputGlyphs); - // nGlyphs in the Primary Input sequence - $str = ""; - for ($i = 0; $i < $nInput; $i++) { - if ($i > 0) { - $str .= $ignore . " "; - } - if ($i >= $seqIndex && $i < $seqIndex + $mLen) { - $str .= "(" . $lookupGlyphs[$i - $seqIndex] . ")"; - } else { - $str .= "(" . $inputGlyphs[$i] . ")"; - } - } - return $str; - } - function _makeGSUBinputMatch($inputGlyphs, $ignore) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(0612)¦(ignore) (0613)¦(ignore) (0614)¦ - // $inputGlyphs = array of glyphs(glyphstrings) making up Input sequence in Context - // $lookupGlyphs = array of glyphs making up Lookup Input sequence - if applicable - $str = ""; - for ($i = 1; $i <= \count($inputGlyphs); $i++) { - if ($i > 1) { - $str .= $ignore . " "; - } - $str .= "(" . $inputGlyphs[$i - 1] . ")"; - } - return $str; - } - function _makeGSUBbacktrackMatch($backtrackGlyphs, $ignore) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(FEEB|FEEC)(ignore) ¦(FD12|FD13)(ignore) ¦ - // $backtrackGlyphs = array of glyphstrings making up Backtrack sequence - // 3 2 1 0 - // each item being e.g. E0AD|E0AF|F1FD - $str = ""; - for ($i = \count($backtrackGlyphs) - 1; $i >= 0; $i--) { - $str .= "(" . $backtrackGlyphs[$i] . ")" . $ignore . " "; - } - return $str; - } - function _makeGSUBlookaheadMatch($lookaheadGlyphs, $ignore) - { - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // Returns e.g. ¦(ignore) (FD12|FD13)¦(ignore) (FEEB|FEEC)¦ - // $lookaheadGlyphs = array of glyphstrings making up Lookahead sequence - // 0 1 2 3 - // each item being e.g. E0AD|E0AF|F1FD - $str = ""; - for ($i = 0; $i < \count($lookaheadGlyphs); $i++) { - $str .= $ignore . " (" . $lookaheadGlyphs[$i] . ")"; - } - return $str; - } - function _makeGSUBinputReplacement($nInput, $REPL, $ignore, $nBsubs, $mLen, $seqIndex) - { - // Returns e.g. "REPL\${6}\${8}" or "\${1}\${2} \${3} REPL\${4}\${6}\${8} \${9}" - // $nInput nGlyphs in the Primary Input sequence - // $REPL replacement glyphs from secondary lookup - // $ignore = "((?:(?: FBA1| FBA2| FBA3))*)" or "()" - // $nBsubs Number of Backtrack substitutions (= 2x Number of Backtrack glyphs) - // $mLen nGlyphs in the secondary Lookup match - if no secondary lookup, should=$nInput - // $seqIndex Sequence Index to apply the secondary match - if ($ignore == "()") { - $ign = \false; - } else { - $ign = \true; - } - $str = ""; - if ($nInput == 1) { - $str = $REPL; - } elseif ($nInput > 1) { - if ($mLen == $nInput) { - // whole string replaced - $str = $REPL; - if ($ign) { - // for every nInput over 1, add another replacement backreference, to move IGNORES after replacement - for ($x = 2; $x <= $nInput; $x++) { - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - } - } else { - // if only part of string replaced: - for ($x = 1; $x < $seqIndex + 1; $x++) { - if ($x == 1) { - $str .= '\\' . ($nBsubs + 1); - } else { - if ($ign) { - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - $str .= ' \\' . ($nBsubs + 1 + 2 * ($x - 1)); - } - } - if ($seqIndex > 0) { - $str .= " "; - } - $str .= $REPL; - if ($ign) { - for ($x = \max($seqIndex + 1, 2); $x < $seqIndex + 1 + $mLen; $x++) { - // move IGNORES after replacement - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - } - for ($x = $seqIndex + 1 + $mLen; $x <= $nInput; $x++) { - if ($ign) { - $str .= '\\' . ($nBsubs + 2 * ($x - 1)); - } - $str .= ' \\' . ($nBsubs + 1 + 2 * ($x - 1)); - } - } - } - return $str; - } - function _getCoverage($convert2hex = \true, $mode = 1) - { - $g = []; - $ctr = 0; - $CoverageFormat = $this->read_ushort(); - if ($CoverageFormat == 1) { - $CoverageGlyphCount = $this->read_ushort(); - for ($gid = 0; $gid < $CoverageGlyphCount; $gid++) { - $glyphID = $this->read_ushort(); - $uni = $this->glyphToChar[$glyphID][0]; - if ($convert2hex) { - $g[] = unicode_hex($uni); - } elseif ($mode == 2) { - $g[$uni] = $ctr; - $ctr++; - } else { - $g[] = $glyphID; - } - } - } - if ($CoverageFormat == 2) { - $RangeCount = $this->read_ushort(); - for ($r = 0; $r < $RangeCount; $r++) { - $start = $this->read_ushort(); - $end = $this->read_ushort(); - $StartCoverageIndex = $this->read_ushort(); - // n/a - for ($glyphID = $start; $glyphID <= $end; $glyphID++) { - $uni = $this->glyphToChar[$glyphID][0]; - if ($convert2hex) { - $g[] = unicode_hex($uni); - } elseif ($mode == 2) { - $uni = $g[$uni] = $ctr; - $ctr++; - } else { - $g[] = $glyphID; - } - } - } - } - return $g; - } - function _getClasses($offset) - { - $this->seek($offset); - $ClassFormat = $this->read_ushort(); - $GlyphByClass = []; - if ($ClassFormat == 1) { - $StartGlyph = $this->read_ushort(); - $GlyphCount = $this->read_ushort(); - for ($i = 0; $i < $GlyphCount; $i++) { - $startGlyphID = $StartGlyph + $i; - $endGlyphID = $StartGlyph + $i; - $class = $this->read_ushort(); - for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { - if (isset($this->glyphToChar[$g][0])) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); - } - } - } - } elseif ($ClassFormat == 2) { - $tableCount = $this->read_ushort(); - for ($i = 0; $i < $tableCount; $i++) { - $startGlyphID = $this->read_ushort(); - $endGlyphID = $this->read_ushort(); - $class = $this->read_ushort(); - for ($g = $startGlyphID; $g <= $endGlyphID; $g++) { - if ($this->glyphToChar[$g][0]) { - $GlyphByClass[$class][] = unicode_hex($this->glyphToChar[$g][0]); - } - } - } - } - $gbc = []; - foreach ($GlyphByClass as $class => $garr) { - $gbc[$class] = \implode('|', $garr); - } - return $gbc; - } - function _getGPOStables() - { - /////////////////////////////////// - // GPOS - Glyph Positioning - /////////////////////////////////// - if (!isset($this->tables["GPOS"])) { - return [[], [], []]; - } - $ffeats = []; - $gpos_offset = $this->seek_table("GPOS"); - $this->skip(4); - $ScriptList_offset = $gpos_offset + $this->read_ushort(); - $FeatureList_offset = $gpos_offset + $this->read_ushort(); - $LookupList_offset = $gpos_offset + $this->read_ushort(); - // ScriptList - $this->seek($ScriptList_offset); - $ScriptCount = $this->read_ushort(); - for ($i = 0; $i < $ScriptCount; $i++) { - $ScriptTag = $this->read_tag(); - // = "beng", "deva" etc. - $ScriptTableOffset = $this->read_ushort(); - $ffeats[$ScriptTag] = $ScriptList_offset + $ScriptTableOffset; - } - // Script Table - foreach ($ffeats as $t => $o) { - $ls = []; - $this->seek($o); - $DefLangSys_offset = $this->read_ushort(); - if ($DefLangSys_offset > 0) { - $ls['DFLT'] = $DefLangSys_offset + $o; - } - $LangSysCount = $this->read_ushort(); - for ($i = 0; $i < $LangSysCount; $i++) { - $LangTag = $this->read_tag(); - // = - $LangTableOffset = $this->read_ushort(); - $ls[$LangTag] = $o + $LangTableOffset; - } - $ffeats[$t] = $ls; - } - // Get FeatureIndexList - // LangSys Table - from first listed langsys - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = []; - $langsystable_offset = $o; - $this->seek($langsystable_offset); - $LookUpOrder = $this->read_ushort(); - //==NULL - $ReqFeatureIndex = $this->read_ushort(); - if ($ReqFeatureIndex != 0xffff) { - $FeatureIndex[] = $ReqFeatureIndex; - } - $FeatureCount = $this->read_ushort(); - for ($i = 0; $i < $FeatureCount; $i++) { - $FeatureIndex[] = $this->read_ushort(); - // = index of feature - } - $ffeats[$st][$t] = $FeatureIndex; - } - } - // Feauture List => LookupListIndex es - $this->seek($FeatureList_offset); - $FeatureCount = $this->read_ushort(); - $Feature = []; - for ($i = 0; $i < $FeatureCount; $i++) { - $tag = $this->read_tag(); - if ($tag === 'kern') { - $this->haskernGPOS = \true; - } - $Feature[$i] = ['tag' => $tag]; - $Feature[$i]['offset'] = $FeatureList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $FeatureCount; $i++) { - $this->seek($Feature[$i]['offset']); - $this->read_ushort(); - // null - $Feature[$i]['LookupCount'] = $Lookupcount = $this->read_ushort(); - $Feature[$i]['LookupListIndex'] = []; - for ($c = 0; $c < $Lookupcount; $c++) { - $Feature[$i]['LookupListIndex'][] = $this->read_ushort(); - } - } - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $o) { - $FeatureIndex = $ffeats[$st][$t]; - foreach ($FeatureIndex as $k => $fi) { - $ffeats[$st][$t][$k] = $Feature[$fi]; - } - } - } - $gpos = []; - $GPOSScriptLang = []; - foreach ($ffeats as $st => $scripts) { - foreach ($scripts as $t => $langsys) { - $lg = []; - foreach ($langsys as $ft) { - $lg[$ft['LookupListIndex'][0]] = $ft; - } - // list of Lookups in order they need to be run i.e. order listed in Lookup table - \ksort($lg); - foreach ($lg as $ft) { - $gpos[$st][$t][$ft['tag']] = $ft['LookupListIndex']; - } - if (!isset($GPOSScriptLang[$st])) { - $GPOSScriptLang[$st] = ''; - } - $GPOSScriptLang[$st] .= $t . ' '; - } - } - // Get metadata and offsets for whole Lookup List table - $this->seek($LookupList_offset); - $LookupCount = $this->read_ushort(); - $Lookup = []; - $Offsets = []; - $SubtableCount = []; - for ($i = 0; $i < $LookupCount; $i++) { - $Offsets[$i] = $LookupList_offset + $this->read_ushort(); - } - for ($i = 0; $i < $LookupCount; $i++) { - $this->seek($Offsets[$i]); - $Lookup[$i]['Type'] = $this->read_ushort(); - $Lookup[$i]['Flag'] = $flag = $this->read_ushort(); - $Lookup[$i]['SubtableCount'] = $SubtableCount[$i] = $this->read_ushort(); - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $Lookup[$i]['Subtables'][$c] = $Offsets[$i] + $this->read_ushort(); - } - // MarkFilteringSet = Index (base 0) into GDEF mark glyph sets structure - if (($flag & 0x10) === 0x10) { - $Lookup[$i]['MarkFilteringSet'] = $this->read_ushort(); - } else { - $Lookup[$i]['MarkFilteringSet'] = ''; - } - // Lookup Type 9: Extension - if ($Lookup[$i]['Type'] == 9) { - // Overwrites new offset (32-bit) for each subtable, and a new lookup Type - for ($c = 0; $c < $SubtableCount[$i]; $c++) { - $this->seek($Lookup[$i]['Subtables'][$c]); - $ExtensionPosFormat = $this->read_ushort(); - $type = $this->read_ushort(); - $Lookup[$i]['Subtables'][$c] = $Lookup[$i]['Subtables'][$c] + $this->read_ulong(); - } - $Lookup[$i]['Type'] = $type; - } - } - // Process Whole LookupList - Get LuCoverage = Lookup coverage just for first glyph - $this->LuCoverage = []; - for ($i = 0; $i < $LookupCount; $i++) { - for ($c = 0; $c < $Lookup[$i]['SubtableCount']; $c++) { - $this->seek($Lookup[$i]['Subtables'][$c]); - $PosFormat = $this->read_ushort(); - if ($Lookup[$i]['Type'] == 7 && $PosFormat == 3) { - $this->skip(4); - } elseif ($Lookup[$i]['Type'] == 8 && $PosFormat == 3) { - $BacktrackGlyphCount = $this->read_ushort(); - $this->skip(2 * $BacktrackGlyphCount + 2); - } - // NB Coverage only looks at glyphs for position 1 (i.e. 7.3 and 8.3) // NEEDS TO READ ALL ******************** - // NB For e.g. Type 4, this may be the Coverage for the Mark - $Coverage = $Lookup[$i]['Subtables'][$c] + $this->read_ushort(); - $this->seek($Coverage); - $glyphs = $this->_getCoverage(\false, 2); - $this->LuCoverage[$i][$c] = $glyphs; - } - } - $this->fontCache->jsonWrite($this->fontkey . '.GPOSdata.json', $this->LuCoverage); - return [$GPOSScriptLang, $gpos, $Lookup]; - } - function makeSubset($file, &$subset, $TTCfontID = 0, $debug = \false, $useOTL = \false) - { - $this->useOTL = $useOTL; - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open file %s', $file)); - } - $this->_pos = 0; - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->otables = []; - $this->ascent = 0; - $this->descent = 0; - $this->strikeoutSize = 0; - $this->strikeoutPosition = 0; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->skip(4); - $this->maxUni = 0; - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000], \true)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error parsing TrueType Collection: version=%s - %s', $version, $file)); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - } - $this->readTableDirectory($debug); - // head - Font header table - $this->seek_table('head'); - $this->skip(50); - $indexToLocFormat = $this->read_ushort(); - $glyphDataFormat = $this->read_ushort(); - // hhea - Horizontal header table - $this->seek_table('hhea'); - $this->skip(32); - $metricDataFormat = $this->read_ushort(); - $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); - // maxp - Maximum profile table - $this->seek_table('maxp'); - $this->skip(4); - $numGlyphs = $this->read_ushort(); - // cmap - Character to glyph index mapping table - $cmap_offset = $this->seek_table('cmap'); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 1 || $platformID == 0) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - $this->seek($save_pos); - } - if (!$unicode_cmap_offset) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Font "%s" does not have Unicode cmap (platform 3, encoding 1, format 4, or platform 0 [any encoding] format 4)', $this->filename)); - } - $glyphToChar = []; - $charToGlyph = []; - $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); - // Map Unmapped glyphs - from $numGlyphs - if ($useOTL) { - $bctr = 0xe000; - for ($gid = 1; $gid < $numGlyphs; $gid++) { - if (!isset($glyphToChar[$gid])) { - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - // Avoid overwriting a glyph already mapped in PUA - if ($bctr > 0xf8ff) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException($file . " : WARNING - Font cannot map all included glyphs into Private Use Area U+E000 - U+F8FF; cannot use useOTL on this font"); - } - $glyphToChar[$gid][] = $bctr; - $charToGlyph[$bctr] = $gid; - $bctr++; - } - } - } - $this->charToGlyph = $charToGlyph; - $this->glyphToChar = $glyphToChar; - // hmtx - Horizontal metrics table - $scale = 1; - // not used - $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); - // loca - Index to location - $this->getLOCA($indexToLocFormat, $numGlyphs); - $subsetglyphs = [0 => 0, 1 => 1, 2 => 2]; - $subsetCharToGlyph = []; - foreach ($subset as $code) { - if (isset($this->charToGlyph[$code])) { - $subsetglyphs[$this->charToGlyph[$code]] = $code; - // Old Glyph ID => Unicode - $subsetCharToGlyph[$code] = $this->charToGlyph[$code]; - // Unicode to old GlyphID - } - $this->maxUni = \max($this->maxUni, $code); - } - list($start, $dummy) = $this->get_table_pos('glyf'); - $glyphSet = []; - \ksort($subsetglyphs); - $n = 0; - $fsLastCharIndex = 0; - // maximum Unicode index (character code) in this font, according to the cmap subtable for platform ID 3 and platform- specific encoding ID 0 or 1. - foreach ($subsetglyphs as $originalGlyphIdx => $uni) { - $fsLastCharIndex = \max($fsLastCharIndex, $uni); - $glyphSet[$originalGlyphIdx] = $n; - // old glyphID to new glyphID - $n++; - } - $codeToGlyph = []; - \ksort($subsetCharToGlyph); - foreach ($subsetCharToGlyph as $uni => $originalGlyphIdx) { - $codeToGlyph[$uni] = $glyphSet[$originalGlyphIdx]; - } - $this->codeToGlyph = $codeToGlyph; - \ksort($subsetglyphs); - foreach ($subsetglyphs as $originalGlyphIdx => $uni) { - $this->getGlyphs($originalGlyphIdx, $start, $glyphSet, $subsetglyphs); - } - $numGlyphs = $numberOfHMetrics = \count($subsetglyphs); - // name - table copied from the original - // MS spec says that "Platform and encoding ID's in the name table should be consistent with those in the cmap table. - // If they are not, the font will not load in Windows" - // Doesn't seem to be a problem? - $this->add('name', $this->get_table('name')); - // tables copied from the original - $tags = ['cvt ', 'fpgm', 'prep', 'gasp']; - foreach ($tags as $tag) { - if (isset($this->tables[$tag])) { - $this->add($tag, $this->get_table($tag)); - } - } - // post - PostScript - if (isset($this->tables['post'])) { - $opost = $this->get_table('post'); - $post = "\x00\x03\x00\x00" . \substr($opost, 4, 12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - $this->add('post', $post); - } - // Sort CID2GID map into segments of contiguous codes - \ksort($codeToGlyph); - unset($codeToGlyph[0]); - $rangeid = 0; - $range = []; - $prevcid = -2; - $prevglidx = -1; - // for each character - foreach ($codeToGlyph as $cid => $glidx) { - if ($cid == $prevcid + 1 && $glidx == $prevglidx + 1) { - $range[$rangeid][] = $glidx; - } else { - // new range - $rangeid = $cid; - $range[$rangeid] = []; - $range[$rangeid][] = $glidx; - } - $prevcid = $cid; - $prevglidx = $glidx; - } - // cmap - Character to glyph mapping - $segCount = \count($range) + 1; - // + 1 Last segment has missing character 0xFFFF - $searchRange = 1; - $entrySelector = 0; - while ($searchRange * 2 <= $segCount) { - $searchRange *= 2; - ++$entrySelector; - } - $searchRange *= 2; - $rangeShift = $segCount * 2 - $searchRange; - $length = 16 + 8 * $segCount + ($numGlyphs + 1); - $cmap = [ - 0, - 3, - // Index : version, number of encoding subtables - 0, - 0, - // Encoding Subtable : platform (UNI=0), encoding 0 - 0, - 28, - // Encoding Subtable : offset (hi,lo) - 0, - 3, - // Encoding Subtable : platform (UNI=0), encoding 3 - 0, - 28, - // Encoding Subtable : offset (hi,lo) - 3, - 1, - // Encoding Subtable : platform (MS=3), encoding 1 - 0, - 28, - // Encoding Subtable : offset (hi,lo) - 4, - $length, - 0, - // Format 4 Mapping subtable: format, length, language - $segCount * 2, - $searchRange, - $entrySelector, - $rangeShift, - ]; - // endCode(s) - foreach ($range as $start => $subrange) { - $endCode = $start + (\count($subrange) - 1); - $cmap[] = $endCode; - // endCode(s) - } - $cmap[] = 0xffff; - // endCode of last Segment - $cmap[] = 0; - // reservedPad - // startCode(s) - foreach ($range as $start => $subrange) { - $cmap[] = $start; - // startCode(s) - } - $cmap[] = 0xffff; - // startCode of last Segment - // idDelta(s) - foreach ($range as $start => $subrange) { - $idDelta = -($start - $subrange[0]); - $n += \count($subrange); - $cmap[] = $idDelta; - // idDelta(s) - } - $cmap[] = 1; - // idDelta of last Segment - // idRangeOffset(s) - foreach ($range as $subrange) { - $cmap[] = 0; - // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 - } - $cmap[] = 0; - // idRangeOffset of last Segment - foreach ($range as $subrange) { - foreach ($subrange as $glidx) { - $cmap[] = $glidx; - } - } - $cmap[] = 0; - // Mapping for last character - $cmapstr = ''; - foreach ($cmap as $cm) { - $cmapstr .= \pack('n', $cm); - } - $this->add('cmap', $cmapstr); - // glyf - Glyph data - list($glyfOffset, $glyfLength) = $this->get_table_pos('glyf'); - if ($glyfLength < $this->maxStrLenRead) { - $glyphData = $this->get_table('glyf'); - } - $offsets = []; - $glyf = ''; - $pos = 0; - $hmtxstr = ''; - $xMinT = 0; - $yMinT = 0; - $xMaxT = 0; - $yMaxT = 0; - $advanceWidthMax = 0; - $minLeftSideBearing = 0; - $minRightSideBearing = 0; - $xMaxExtent = 0; - $maxPoints = 0; - // points in non-compound glyph - $maxContours = 0; - // contours in non-compound glyph - $maxComponentPoints = 0; - // points in compound glyph - $maxComponentContours = 0; - // contours in compound glyph - $maxComponentElements = 0; - // number of glyphs referenced at top level - $maxComponentDepth = 0; - // levels of recursion, set to 0 if font has only simple glyphs - $this->glyphdata = []; - foreach ($subsetglyphs as $originalGlyphIdx => $uni) { - // hmtx - Horizontal Metrics - $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); - $hmtxstr .= $hm; - $offsets[] = $pos; - $glyphPos = $this->glyphPos[$originalGlyphIdx]; - $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; - if ($glyfLength < $this->maxStrLenRead) { - $data = \substr($glyphData, $glyphPos, $glyphLen); - } else { - if ($glyphLen > 0) { - $data = $this->get_chunk($glyfOffset + $glyphPos, $glyphLen); - } else { - $data = ''; - } - } - if ($glyphLen > 0) { - if (_RECALC_PROFILE) { - $xMin = $this->unpack_short(\substr($data, 2, 2)); - $yMin = $this->unpack_short(\substr($data, 4, 2)); - $xMax = $this->unpack_short(\substr($data, 6, 2)); - $yMax = $this->unpack_short(\substr($data, 8, 2)); - $xMinT = \min($xMinT, $xMin); - $yMinT = \min($yMinT, $yMin); - $xMaxT = \max($xMaxT, $xMax); - $yMaxT = \max($yMaxT, $yMax); - $aw = $this->unpack_short(\substr($hm, 0, 2)); - $lsb = $this->unpack_short(\substr($hm, 2, 2)); - $advanceWidthMax = \max($advanceWidthMax, $aw); - $minLeftSideBearing = \min($minLeftSideBearing, $lsb); - $minRightSideBearing = \min($minRightSideBearing, $aw - $lsb - ($xMax - $xMin)); - $xMaxExtent = \max($xMaxExtent, $lsb + ($xMax - $xMin)); - } - $up = \unpack("n", \substr($data, 0, 2)); - } - if ($glyphLen > 2 && $up[1] & 1 << 15) { - // If number of contours <= -1 i.e. composiste glyph - $pos_in_glyph = 10; - $flags = GlyphOperator::MORE; - $nComponentElements = 0; - while ($flags & GlyphOperator::MORE) { - $nComponentElements += 1; - // number of glyphs referenced at top level - $up = \unpack("n", \substr($data, $pos_in_glyph, 2)); - $flags = $up[1]; - $up = \unpack("n", \substr($data, $pos_in_glyph + 2, 2)); - $glyphIdx = $up[1]; - $this->glyphdata[$originalGlyphIdx]['compGlyphs'][] = $glyphIdx; - $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); - $pos_in_glyph += 4; - if ($flags & GlyphOperator::WORDS) { - $pos_in_glyph += 4; - } else { - $pos_in_glyph += 2; - } - if ($flags & GlyphOperator::SCALE) { - $pos_in_glyph += 2; - } elseif ($flags & GlyphOperator::XYSCALE) { - $pos_in_glyph += 4; - } elseif ($flags & GlyphOperator::TWOBYTWO) { - $pos_in_glyph += 8; - } - } - $maxComponentElements = \max($maxComponentElements, $nComponentElements); - } elseif (_RECALC_PROFILE && $glyphLen > 2 && $up[1] < 1 << 15 && $up[1] > 0) { - // Number of contours > 0 simple glyph - $nContours = $up[1]; - $this->glyphdata[$originalGlyphIdx]['nContours'] = $nContours; - $maxContours = \max($maxContours, $nContours); - // Count number of points in simple glyph - $pos_in_glyph = 10 + $nContours * 2 - 2; - // Last endContourPoint - $up = \unpack("n", \substr($data, $pos_in_glyph, 2)); - $points = $up[1] + 1; - $this->glyphdata[$originalGlyphIdx]['nPoints'] = $points; - $maxPoints = \max($maxPoints, $points); - } - $glyf .= $data; - $pos += $glyphLen; - if ($pos % 4 != 0) { - $padding = 4 - $pos % 4; - $glyf .= \str_repeat("\x00", $padding); - $pos += $padding; - } - } - if (_RECALC_PROFILE) { - foreach ($this->glyphdata as $originalGlyphIdx => $val) { - $maxdepth = $depth = -1; - $points = 0; - $contours = 0; - $this->getGlyphData($originalGlyphIdx, $maxdepth, $depth, $points, $contours); - $maxComponentDepth = \max($maxComponentDepth, $maxdepth); - $maxComponentPoints = \max($maxComponentPoints, $points); - $maxComponentContours = \max($maxComponentContours, $contours); - } - } - $offsets[] = $pos; - $this->add('glyf', $glyf); - // hmtx - Horizontal Metrics - $this->add('hmtx', $hmtxstr); - // loca - Index to location - $locastr = ''; - if ($pos + 1 >> 1 > 0xffff) { - $indexToLocFormat = 1; - // long format - foreach ($offsets as $offset) { - $locastr .= \pack("N", $offset); - } - } else { - $indexToLocFormat = 0; - // short format - foreach ($offsets as $offset) { - $locastr .= \pack("n", $offset / 2); - } - } - $this->add('loca', $locastr); - // head - Font header - $head = $this->get_table('head'); - $head = $this->_set_ushort($head, 50, $indexToLocFormat); - if (_RECALC_PROFILE) { - $head = $this->_set_short($head, 36, $xMinT); - // for all glyph bounding boxes - $head = $this->_set_short($head, 38, $yMinT); - // for all glyph bounding boxes - $head = $this->_set_short($head, 40, $xMaxT); - // for all glyph bounding boxes - $head = $this->_set_short($head, 42, $yMaxT); - // for all glyph bounding boxes - $head[17] = \chr($head[17] & ~(1 << 4)); - // Unset Bit 4 (as hdmx/LTSH tables not included) - } - $this->add('head', $head); - // hhea - Horizontal Header - $hhea = $this->get_table('hhea'); - $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); - if (_RECALC_PROFILE) { - $hhea = $this->_set_ushort($hhea, 10, $advanceWidthMax); - $hhea = $this->_set_short($hhea, 12, $minLeftSideBearing); - $hhea = $this->_set_short($hhea, 14, $minRightSideBearing); - $hhea = $this->_set_short($hhea, 16, $xMaxExtent); - } - $this->add('hhea', $hhea); - // maxp - Maximum Profile - $maxp = $this->get_table('maxp'); - $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); - if (_RECALC_PROFILE) { - $maxp = $this->_set_ushort($maxp, 6, $maxPoints); - // points in non-compound glyph - $maxp = $this->_set_ushort($maxp, 8, $maxContours); - // contours in non-compound glyph - $maxp = $this->_set_ushort($maxp, 10, $maxComponentPoints); - // points in compound glyph - $maxp = $this->_set_ushort($maxp, 12, $maxComponentContours); - // contours in compound glyph - $maxp = $this->_set_ushort($maxp, 28, $maxComponentElements); - // number of glyphs referenced at top level - $maxp = $this->_set_ushort($maxp, 30, $maxComponentDepth); - // levels of recursion, set to 0 if font has only simple glyphs - } - $this->add('maxp', $maxp); - // OS/2 - OS/2 - if (isset($this->tables['OS/2'])) { - $os2_offset = $this->seek_table("OS/2"); - if (_RECALC_PROFILE) { - $fsSelection = $this->get_ushort($os2_offset + 62); - $fsSelection = $fsSelection & ~(1 << 6); - // 2-byte bit field containing information concerning the nature of the font patterns - // bit#0 = Italic; bit#5=Bold - // Match name table's font subfamily string - // Clear bit#6 used for 'Regular' and optional - } - // NB Currently this method never subsets characters above BMP - // Could set nonBMP bit according to $this->maxUni - $nonBMP = $this->get_ushort($os2_offset + 46); - $nonBMP = $nonBMP & ~(1 << 9); - // Unset Bit 57 (indicates non-BMP) - for interactive forms - $os2 = $this->get_table('OS/2'); - if (_RECALC_PROFILE) { - $os2 = $this->_set_ushort($os2, 62, $fsSelection); - $os2 = $this->_set_ushort($os2, 66, $fsLastCharIndex); - $os2 = $this->_set_ushort($os2, 42, 0x0); - // ulCharRange (ulUnicodeRange) bits 24-31 | 16-23 - $os2 = $this->_set_ushort($os2, 44, 0x0); - // ulCharRange (Unicode ranges) bits 8-15 | 0-7 - $os2 = $this->_set_ushort($os2, 46, $nonBMP); - // ulCharRange (Unicode ranges) bits 56-63 | 48-55 - $os2 = $this->_set_ushort($os2, 48, 0x0); - // ulCharRange (Unicode ranges) bits 40-47 | 32-39 - $os2 = $this->_set_ushort($os2, 50, 0x0); - // ulCharRange (Unicode ranges) bits 88-95 | 80-87 - $os2 = $this->_set_ushort($os2, 52, 0x0); - // ulCharRange (Unicode ranges) bits 72-79 | 64-71 - $os2 = $this->_set_ushort($os2, 54, 0x0); - // ulCharRange (Unicode ranges) bits 120-127 | 112-119 - $os2 = $this->_set_ushort($os2, 56, 0x0); - // ulCharRange (Unicode ranges) bits 104-111 | 96-103 - } - $os2 = $this->_set_ushort($os2, 46, $nonBMP); - // Unset Bit 57 (indicates non-BMP) - for interactive forms - $this->add('OS/2', $os2); - } - \fclose($this->fh); - // Put the TTF file together - $stm = ''; - $this->endTTFile($stm); - return $stm; - } - function makeSubsetSIP($file, &$subset, $TTCfontID = 0, $debug = \false, $useOTL = 0) - { - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open file "%s"', $file)); - } - $this->filename = $file; - $this->_pos = 0; - $this->useOTL = $useOTL; - // mPDF 5.7.1 - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->otables = []; - $this->ascent = 0; - $this->descent = 0; - $this->strikeoutSize = 0; - $this->strikeoutPosition = 0; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->skip(4); - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000])) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("ERROR - Error parsing TrueType Collection: version=" . $version . " - " . $file); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - } - $this->readTableDirectory($debug); - // head - Font header table - $this->seek_table('head'); - $this->skip(50); - $indexToLocFormat = $this->read_ushort(); - $glyphDataFormat = $this->read_ushort(); - // hhea - Horizontal header table - $this->seek_table('hhea'); - $this->skip(32); - $metricDataFormat = $this->read_ushort(); - $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); - // maxp - Maximum profile table - $this->seek_table('maxp'); - $this->skip(4); - $numGlyphs = $this->read_ushort(); - // cmap - Character to glyph index mapping table - $cmap_offset = $this->seek_table('cmap'); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 10 || $platformID == 0) { - // Microsoft, Unicode Format 12 table HKCS - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 12) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - if ($platformID == 3 && $encodingID == 1 || $platformID == 0) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - $unicode_cmap_offset = $cmap_offset + $offset; - } - } - $this->seek($save_pos); - } - if (!$unicode_cmap_offset) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $file)); - } - // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above - if ($format == 12) { - $this->maxUniChar = 0; - $this->seek($unicode_cmap_offset + 4); - $length = $this->read_ulong(); - $limit = $unicode_cmap_offset + $length; - $this->skip(4); - $nGroups = $this->read_ulong(); - $glyphToChar = []; - $charToGlyph = []; - for ($i = 0; $i < $nGroups; $i++) { - $startCharCode = $this->read_ulong(); - $endCharCode = $this->read_ulong(); - $startGlyphCode = $this->read_ulong(); - $offset = 0; - for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { - $glyph = $startGlyphCode + $offset; - $offset++; - // ZZZ98 - if ($unichar < 0x30000) { - $charToGlyph[$unichar] = $glyph; - $this->maxUniChar = \max($unichar, $this->maxUniChar); - $glyphToChar[$glyph][] = $unichar; - } - } - } - } else { - $glyphToChar = []; - $charToGlyph = []; - $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); - } - // Map Unmapped glyphs - from $numGlyphs - if ($useOTL) { - $bctr = 0xe000; - for ($gid = 1; $gid < $numGlyphs; $gid++) { - if (!isset($glyphToChar[$gid])) { - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - // Avoid overwriting a glyph already mapped in PUA - // ZZZ98 - if ($bctr > 0xf8ff && $bctr < 0x2ceb0) { - $bctr = 0x2ceb0; - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - } - $glyphToChar[$gid][] = $bctr; - $charToGlyph[$bctr] = $gid; - $this->maxUniChar = \max($bctr, $this->maxUniChar); - $bctr++; - } - } - } - // hmtx - Horizontal metrics table - $scale = 1; - // not used here - $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); - // loca - Index to location - $this->getLOCA($indexToLocFormat, $numGlyphs); - $glyphMap = [0 => 0]; - $glyphSet = [0 => 0]; - $codeToGlyph = []; - // Set a substitute if ASCII characters do not have glyphs - if (isset($charToGlyph[0x3f])) { - $subs = $charToGlyph[0x3f]; - } else { - // Question mark - $subs = $charToGlyph[32]; - } - foreach ($subset as $code) { - if (isset($charToGlyph[$code])) { - $originalGlyphIdx = $charToGlyph[$code]; - } elseif ($code < 128) { - $originalGlyphIdx = $subs; - } else { - $originalGlyphIdx = 0; - } - if (!isset($glyphSet[$originalGlyphIdx])) { - $glyphSet[$originalGlyphIdx] = \count($glyphMap); - $glyphMap[] = $originalGlyphIdx; - } - $codeToGlyph[$code] = $glyphSet[$originalGlyphIdx]; - } - list($start, $dummy) = $this->get_table_pos('glyf'); - $n = 0; - while ($n < \count($glyphMap)) { - $originalGlyphIdx = $glyphMap[$n]; - $glyphPos = $this->glyphPos[$originalGlyphIdx]; - $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; - ++$n; - if (!$glyphLen) { - continue; - } - $this->seek($start + $glyphPos); - $numberOfContours = $this->read_short(); - if ($numberOfContours < 0) { - $this->skip(8); - $flags = GlyphOperator::MORE; - while ($flags & GlyphOperator::MORE) { - $flags = $this->read_ushort(); - $glyphIdx = $this->read_ushort(); - if (!isset($glyphSet[$glyphIdx])) { - $glyphSet[$glyphIdx] = \count($glyphMap); - $glyphMap[] = $glyphIdx; - } - if ($flags & GlyphOperator::WORDS) { - $this->skip(4); - } else { - $this->skip(2); - } - if ($flags & GlyphOperator::SCALE) { - $this->skip(2); - } elseif ($flags & GlyphOperator::XYSCALE) { - $this->skip(4); - } elseif ($flags & GlyphOperator::TWOBYTWO) { - $this->skip(8); - } - } - } - } - $numGlyphs = $n = \count($glyphMap); - $numberOfHMetrics = $n; - // MS spec says that "Platform and encoding ID's in the name table should be consistent with those in the cmap table. - // If they are not, the font will not load in Windows" - // Doesn't seem to be a problem? - // Needs to have a name entry in 3,0 (e.g. symbol) - original font will be 3,1 (i.e. Unicode) - $name = $this->get_table('name'); - $name_offset = $this->seek_table("name"); - $format = $this->read_ushort(); - $numRecords = $this->read_ushort(); - $string_data_offset = $name_offset + $this->read_ushort(); - for ($i = 0; $i < $numRecords; $i++) { - $platformId = $this->read_ushort(); - $encodingId = $this->read_ushort(); - if ($platformId == 3 && $encodingId == 1) { - $pos = 6 + $i * 12 + 2; - $name = $this->_set_ushort($name, $pos, 0x0); - // Change encoding to 3,0 rather than 3,1 - } - $this->skip(8); - } - $this->add('name', $name); - // OS/2 - if (isset($this->tables['OS/2'])) { - $os2 = $this->get_table('OS/2'); - $os2 = $this->_set_ushort($os2, 42, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 44, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 46, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 48, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 50, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 52, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 54, 0x0); - // ulCharRange (Unicode ranges) - $os2 = $this->_set_ushort($os2, 56, 0x0); - // ulCharRange (Unicode ranges) - // Set Symbol character only in ulCodePageRange - $os2 = $this->_set_ushort($os2, 78, 0x8000); - // ulCodePageRange = Bit #31 Symbol **** 78 = Bit 16-31 - $os2 = $this->_set_ushort($os2, 80, 0x0); - // ulCodePageRange = Bit #31 Symbol **** 80 = Bit 0-15 - $os2 = $this->_set_ushort($os2, 82, 0x0); - // ulCodePageRange = Bit #32- Symbol **** 82 = Bits 48-63 - $os2 = $this->_set_ushort($os2, 84, 0x0); - // ulCodePageRange = Bit #32- Symbol **** 84 = Bits 32-47 - $os2 = $this->_set_ushort($os2, 64, 0x1); - // FirstCharIndex - $os2 = $this->_set_ushort($os2, 66, \count($subset)); - // LastCharIndex - // Set PANOSE first bit to 5 for Symbol - $os2 = $this->splice($os2, 32, \chr(5) . \chr(0) . \chr(1) . \chr(0) . \chr(1) . \chr(0) . \chr(0) . \chr(0) . \chr(0) . \chr(0)); - $this->add('OS/2', $os2); - } - //tables copied from the original - $tags = ['cvt ', 'fpgm', 'prep', 'gasp']; - foreach ($tags as $tag) { - // 1.02 - if (isset($this->tables[$tag])) { - $this->add($tag, $this->get_table($tag)); - } - } - // post - PostScript - if (isset($this->tables['post'])) { - $opost = $this->get_table('post'); - $post = "\x00\x03\x00\x00" . \substr($opost, 4, 12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; - } - $this->add('post', $post); - // hhea - Horizontal Header - $hhea = $this->get_table('hhea'); - $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); - $this->add('hhea', $hhea); - // maxp - Maximum Profile - $maxp = $this->get_table('maxp'); - $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); - $this->add('maxp', $maxp); - // CMap table Formats [1,0,]6 and [3,0,]4 - // Sort CID2GID map into segments of contiguous codes - $rangeid = 0; - $range = []; - $prevcid = -2; - $prevglidx = -1; - // for each character - foreach ($subset as $cid => $code) { - $glidx = $codeToGlyph[$code]; - if ($cid == $prevcid + 1 && $glidx == $prevglidx + 1) { - $range[$rangeid][] = $glidx; - } else { - // new range - $rangeid = $cid; - $range[$rangeid] = []; - $range[$rangeid][] = $glidx; - } - $prevcid = $cid; - $prevglidx = $glidx; - } - // cmap - Character to glyph mapping - $segCount = \count($range) + 1; - // + 1 Last segment has missing character 0xFFFF - $searchRange = 1; - $entrySelector = 0; - while ($searchRange * 2 <= $segCount) { - $searchRange = $searchRange * 2; - $entrySelector = $entrySelector + 1; - } - $searchRange = $searchRange * 2; - $rangeShift = $segCount * 2 - $searchRange; - $length = 16 + 8 * $segCount + ($numGlyphs + 1); - $cmap = [ - 4, - $length, - 0, - // Format 4 Mapping subtable: format, length, language - $segCount * 2, - $searchRange, - $entrySelector, - $rangeShift, - ]; - // endCode(s) - foreach ($range as $start => $subrange) { - $endCode = $start + (\count($subrange) - 1); - $cmap[] = $endCode; - // endCode(s) - } - $cmap[] = 0xffff; - // endCode of last Segment - $cmap[] = 0; - // reservedPad - // startCode(s) - foreach ($range as $start => $subrange) { - $cmap[] = $start; - // startCode(s) - } - $cmap[] = 0xffff; - // startCode of last Segment - // idDelta(s) - foreach ($range as $start => $subrange) { - $idDelta = -($start - $subrange[0]); - $n += \count($subrange); - $cmap[] = $idDelta; - // idDelta(s) - } - $cmap[] = 1; - // idDelta of last Segment - // idRangeOffset(s) - foreach ($range as $subrange) { - $cmap[] = 0; - // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 - } - $cmap[] = 0; - // idRangeOffset of last Segment - foreach ($range as $subrange) { - foreach ($subrange as $glidx) { - $cmap[] = $glidx; - } - } - $cmap[] = 0; - // Mapping for last character - $cmapstr4 = ''; - foreach ($cmap as $cm) { - $cmapstr4 .= \pack("n", $cm); - } - // cmap - Character to glyph mapping - $entryCount = \count($subset); - $length = 10 + $entryCount * 2; - $off = 20 + $length; - $hoff = $off >> 16; - $loff = $off & 0xffff; - $cmap = [ - 0, - 2, - // Index : version, number of subtables - 1, - 0, - // Subtable : platform, encoding - 0, - 20, - // offset (hi,lo) - 3, - 0, - // Subtable : platform, encoding // See note above for 'name' - $hoff, - $loff, - // offset (hi,lo) - 6, - $length, - // Format 6 Mapping table: format, length - 0, - 1, - // language, First char code - $entryCount, - ]; - $cmapstr = ''; - foreach ($subset as $code) { - $cmap[] = $codeToGlyph[$code]; - } - foreach ($cmap as $cm) { - $cmapstr .= \pack("n", $cm); - } - $cmapstr .= $cmapstr4; - $this->add('cmap', $cmapstr); - // hmtx - Horizontal Metrics - $hmtxstr = ''; - for ($n = 0; $n < $numGlyphs; $n++) { - $originalGlyphIdx = $glyphMap[$n]; - $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); - $hmtxstr .= $hm; - } - $this->add('hmtx', $hmtxstr); - // glyf - Glyph data - list($glyfOffset, $glyfLength) = $this->get_table_pos('glyf'); - if ($glyfLength < $this->maxStrLenRead) { - $glyphData = $this->get_table('glyf'); - } - $offsets = []; - $glyf = ''; - $pos = 0; - for ($n = 0; $n < $numGlyphs; $n++) { - $offsets[] = $pos; - $originalGlyphIdx = $glyphMap[$n]; - $glyphPos = $this->glyphPos[$originalGlyphIdx]; - $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; - if ($glyfLength < $this->maxStrLenRead) { - $data = \substr($glyphData, $glyphPos, $glyphLen); - } else { - if ($glyphLen > 0) { - $data = $this->get_chunk($glyfOffset + $glyphPos, $glyphLen); - } else { - $data = ''; - } - } - if ($glyphLen > 0) { - $up = \unpack('n', \substr($data, 0, 2)); - } - if ($glyphLen > 2 && $up[1] & 1 << 15) { - $pos_in_glyph = 10; - $flags = GlyphOperator::MORE; - while ($flags & GlyphOperator::MORE) { - $up = \unpack('n', \substr($data, $pos_in_glyph, 2)); - $flags = $up[1]; - $up = \unpack('n', \substr($data, $pos_in_glyph + 2, 2)); - $glyphIdx = $up[1]; - $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); - $pos_in_glyph += 4; - if ($flags & GlyphOperator::WORDS) { - $pos_in_glyph += 4; - } else { - $pos_in_glyph += 2; - } - if ($flags & GlyphOperator::SCALE) { - $pos_in_glyph += 2; - } elseif ($flags & GlyphOperator::XYSCALE) { - $pos_in_glyph += 4; - } elseif ($flags & GlyphOperator::TWOBYTWO) { - $pos_in_glyph += 8; - } - } - } - $glyf .= $data; - $pos += $glyphLen; - if ($pos % 4 != 0) { - $padding = 4 - $pos % 4; - $glyf .= \str_repeat("\x00", $padding); - $pos += $padding; - } - } - $offsets[] = $pos; - $this->add('glyf', $glyf); - // loca - Index to location - $locastr = ''; - if ($pos + 1 >> 1 > 0xffff) { - $indexToLocFormat = 1; - // long format - foreach ($offsets as $offset) { - $locastr .= \pack("N", $offset); - } - } else { - $indexToLocFormat = 0; - // short format - foreach ($offsets as $offset) { - $locastr .= \pack("n", $offset / 2); - } - } - $this->add('loca', $locastr); - // head - Font header - $head = $this->get_table('head'); - $head = $this->_set_ushort($head, 50, $indexToLocFormat); - $this->add('head', $head); - \fclose($this->fh); - $stm = ''; - $this->endTTFile($stm); - return $stm; - } - function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) - { - $depth++; - $maxdepth = \max($maxdepth, $depth); - if (\count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) { - foreach ($this->glyphdata[$originalGlyphIdx]['compGlyphs'] as $glyphIdx) { - $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours); - } - } elseif ($this->glyphdata[$originalGlyphIdx]['nContours'] > 0 && $depth > 0) { - // simple - $contours += $this->glyphdata[$originalGlyphIdx]['nContours']; - $points += $this->glyphdata[$originalGlyphIdx]['nPoints']; - } - $depth--; - } - function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) - { - $glyphPos = $this->glyphPos[$originalGlyphIdx]; - $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; - if (!$glyphLen) { - return; - } - $this->seek($start + $glyphPos); - $numberOfContours = $this->read_short(); - if ($numberOfContours < 0) { - $this->skip(8); - $flags = GlyphOperator::MORE; - while ($flags & GlyphOperator::MORE) { - $flags = $this->read_ushort(); - $glyphIdx = $this->read_ushort(); - if (!isset($glyphSet[$glyphIdx])) { - $glyphSet[$glyphIdx] = \count($subsetglyphs); - // old glyphID to new glyphID - $subsetglyphs[$glyphIdx] = \true; - } - $savepos = \ftell($this->fh); - $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs); - $this->seek($savepos); - if ($flags & GlyphOperator::WORDS) { - $this->skip(4); - } else { - $this->skip(2); - } - if ($flags & GlyphOperator::SCALE) { - $this->skip(2); - } elseif ($flags & GlyphOperator::XYSCALE) { - $this->skip(4); - } elseif ($flags & GlyphOperator::TWOBYTWO) { - $this->skip(8); - } - } - } - } - function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) - { - $start = $this->seek_table('hmtx'); - $aw = 0; - $this->charWidths = \str_pad('', 256 * 256 * 2, "\x00"); - if ($this->maxUniChar > 65536) { - $this->charWidths .= \str_pad('', 256 * 256 * 2, "\x00"); - } - // Plane 1 SMP - if ($this->maxUniChar > 131072) { - $this->charWidths .= \str_pad('', 256 * 256 * 2, "\x00"); - } - // Plane 2 SMP - $nCharWidths = 0; - if ($numberOfHMetrics * 4 < $this->maxStrLenRead) { - $data = $this->get_chunk($start, $numberOfHMetrics * 4); - $arr = \unpack('n*', $data); - } else { - $this->seek($start); - } - for ($glyph = 0; $glyph < $numberOfHMetrics; $glyph++) { - if ($numberOfHMetrics * 4 < $this->maxStrLenRead) { - $aw = $arr[$glyph * 2 + 1]; - } else { - $aw = $this->read_ushort(); - $lsb = $this->read_ushort(); - } - if (isset($glyphToChar[$glyph]) || $glyph == 0) { - if ($aw >= 1 << 15) { - $aw = 0; - } - // 1.03 Some (arabic) fonts have -ve values for width - // although should be unsigned value - comes out as e.g. 65108 (intended -50) - if ($glyph === 0) { - $this->defaultWidth = $scale * $aw; - continue; - } - foreach ($glyphToChar[$glyph] as $char) { - if ($char != 0 && $char != 65535) { - $w = (int) \round($scale * $aw); - if ($w === 0) { - $w = 65535; - } - if ($char < 196608) { - $this->charWidths[$char * 2] = \chr($w >> 8); - $this->charWidths[$char * 2 + 1] = \chr($w & 0xff); - $nCharWidths++; - } - } - } - } - } - $data = $this->get_chunk($start + $numberOfHMetrics * 4, $numGlyphs * 2); - $arr = \unpack("n*", $data); - $diff = $numGlyphs - $numberOfHMetrics; - $w = (int) \round($scale * $aw); - if ($w === 0) { - $w = 65535; - } - for ($pos = 0; $pos < $diff; $pos++) { - $glyph = $pos + $numberOfHMetrics; - if (isset($glyphToChar[$glyph])) { - foreach ($glyphToChar[$glyph] as $char) { - if ($char != 0 && $char != 65535) { - if ($char < 196608) { - $this->charWidths[$char * 2] = \chr($w >> 8); - $this->charWidths[$char * 2 + 1] = \chr($w & 0xff); - $nCharWidths++; - } - } - } - } - } - // NB 65535 is a set width of 0 - // First bytes define number of chars in font - $this->charWidths[0] = \chr($nCharWidths >> 8); - $this->charWidths[1] = \chr($nCharWidths & 0xff); - } - function getHMetric($numberOfHMetrics, $gid) - { - $start = $this->seek_table("hmtx"); - if ($gid < $numberOfHMetrics) { - $this->seek($start + $gid * 4); - $hm = \fread($this->fh, 4); - } else { - $this->seek($start + ($numberOfHMetrics - 1) * 4); - $hm = \fread($this->fh, 2); - $this->seek($start + $numberOfHMetrics * 2 + $gid * 2); - $hm .= \fread($this->fh, 2); - } - return $hm; - } - function getLOCA($indexToLocFormat, $numGlyphs) - { - $start = $this->seek_table('loca'); - $this->glyphPos = []; - if ($indexToLocFormat == 0) { - $data = $this->get_chunk($start, $numGlyphs * 2 + 2); - $arr = \unpack("n*", $data); - for ($n = 0; $n <= $numGlyphs; $n++) { - $this->glyphPos[] = $arr[$n + 1] * 2; - } - } elseif ($indexToLocFormat == 1) { - $data = $this->get_chunk($start, $numGlyphs * 4 + 4); - $arr = \unpack("N*", $data); - for ($n = 0; $n <= $numGlyphs; $n++) { - $this->glyphPos[] = $arr[$n + 1]; - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException('Unknown location table format ' . $indexToLocFormat); - } - } - /** - * CMAP Format 4 - */ - function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph) - { - $this->maxUniChar = 0; - $this->seek($unicode_cmap_offset + 2); - $length = $this->read_ushort(); - $limit = $unicode_cmap_offset + $length; - $this->skip(2); - $segCount = $this->read_ushort() / 2; - $this->skip(6); - $endCount = []; - for ($i = 0; $i < $segCount; $i++) { - $endCount[] = $this->read_ushort(); - } - $this->skip(2); - $startCount = []; - for ($i = 0; $i < $segCount; $i++) { - $startCount[] = $this->read_ushort(); - } - $idDelta = []; - for ($i = 0; $i < $segCount; $i++) { - $idDelta[] = $this->read_short(); - } - // ???? was unsigned short - $idRangeOffset_start = $this->_pos; - $idRangeOffset = []; - for ($i = 0; $i < $segCount; $i++) { - $idRangeOffset[] = $this->read_ushort(); - } - for ($n = 0; $n < $segCount; $n++) { - $endpoint = $endCount[$n] + 1; - for ($unichar = $startCount[$n]; $unichar < $endpoint; $unichar++) { - if ($idRangeOffset[$n] == 0) { - $glyph = $unichar + $idDelta[$n] & 0xffff; - } else { - $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; - $offset = $idRangeOffset_start + 2 * $n + $offset; - if ($offset >= $limit) { - $glyph = 0; - } else { - $glyph = $this->get_ushort($offset); - if ($glyph != 0) { - $glyph = $glyph + $idDelta[$n] & 0xffff; - } - } - } - $charToGlyph[$unichar] = $glyph; - if ($unichar < 196608) { - $this->maxUniChar = \max($unichar, $this->maxUniChar); - } - $glyphToChar[$glyph][] = $unichar; - } - } - } - function endTTFile(&$stm) - { - $stm = ''; - $numTables = \count($this->otables); - $searchRange = 1; - $entrySelector = 0; - while ($searchRange * 2 <= $numTables) { - $searchRange *= 2; - $entrySelector += 1; - } - $searchRange *= 16; - $rangeShift = $numTables * 16 - $searchRange; - // Header - if (_TTF_MAC_HEADER) { - $stm .= \pack('Nnnnn', 0x74727565, $numTables, $searchRange, $entrySelector, $rangeShift); - // Mac - } else { - $stm .= \pack('Nnnnn', 0x10000, $numTables, $searchRange, $entrySelector, $rangeShift); - // Windows - } - // Table directory - $tables = $this->otables; - \ksort($tables); - $offset = 12 + $numTables * 16; - foreach ($tables as $tag => $data) { - if ($tag === 'head') { - $head_start = $offset; - } - $stm .= $tag; - $checksum = $this->calcChecksum($data); - $stm .= \pack('nn', $checksum[0], $checksum[1]); - $stm .= \pack('NN', $offset, \strlen($data)); - $paddedLength = \strlen($data) + 3 & ~3; - $offset += $paddedLength; - } - // Table data - foreach ($tables as $tag => $data) { - $data .= "\x00\x00\x00"; - $stm .= \substr($data, 0, \strlen($data) & ~3); - } - $checksum = $this->calcChecksum($stm); - $checksum = $this->sub32([0xb1b0, 0xafba], $checksum); - $chk = \pack("nn", $checksum[0], $checksum[1]); - $stm = $this->splice($stm, $head_start + 8, $chk); - return $stm; - } - function repackageTTF($file, $TTCfontID = 0, $debug = \false, $useOTL = \false) - { - $this->useOTL = $useOTL; - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Unable to open file "%s"', $file)); - } - $this->_pos = 0; - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->otables = []; - $this->ascent = 0; - $this->descent = 0; - $this->strikeoutSize = 0; - $this->strikeoutPosition = 0; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->skip(4); - $this->maxUni = 0; - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000], \true)) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Error parsing TrueType Collection: version=%s - %s', $version, $file)); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - } - $this->readTableDirectory($debug); - $tags = ['OS/2', 'glyf', 'head', 'hhea', 'hmtx', 'loca', 'maxp', 'name', 'post', 'cvt ', 'fpgm', 'gasp', 'prep']; - foreach ($tags as $tag) { - if (isset($this->tables[$tag])) { - $this->add($tag, $this->get_table($tag)); - } - } - if ($useOTL) { - // maxp - Maximum profile table - $this->seek_table('maxp'); - $this->skip(4); - $numGlyphs = $this->read_ushort(); - // cmap - Character to glyph index mapping table - $cmap_offset = $this->seek_table('cmap'); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 1 || $platformID == 0) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - $this->seek($save_pos); - } - if (!$unicode_cmap_offset) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Font "%s" does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)', $this->filename)); - } - $glyphToChar = []; - $charToGlyph = []; - $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph); - // Map Unmapped glyphs - from $numGlyphs - $bctr = 0xe000; - for ($gid = 1; $gid < $numGlyphs; $gid++) { - if (!isset($glyphToChar[$gid])) { - while (isset($charToGlyph[$bctr])) { - $bctr++; - } - // Avoid overwriting a glyph already mapped in PUA (6,400) - if ($bctr > 0xf8ff) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException("Problem. Trying to repackage TF file; not enough space for unmapped glyphs"); - } - $glyphToChar[$gid][] = $bctr; - $charToGlyph[$bctr] = $gid; - $bctr++; - } - } - // Sort CID2GID map into segments of contiguous codes - unset($charToGlyph[65535]); - unset($charToGlyph[0]); - \ksort($charToGlyph); - $rangeid = 0; - $range = []; - $prevcid = -2; - $prevglidx = -1; - // for each character - foreach ($charToGlyph as $cid => $glidx) { - if ($cid == $prevcid + 1 && $glidx == $prevglidx + 1) { - $range[$rangeid][] = $glidx; - } else { - // new range - $rangeid = $cid; - $range[$rangeid] = []; - $range[$rangeid][] = $glidx; - } - $prevcid = $cid; - $prevglidx = $glidx; - } - // CMap table - // cmap - Character to glyph mapping - $segCount = \count($range) + 1; - // + 1 Last segment has missing character 0xFFFF - $searchRange = 1; - $entrySelector = 0; - while ($searchRange * 2 <= $segCount) { - $searchRange *= 2; - ++$entrySelector; - } - $searchRange *= 2; - $rangeShift = $segCount * 2 - $searchRange; - $length = 16 + 8 * $segCount + ($numGlyphs + 1); - $cmap = [ - 0, - 3, - // Index : version, number of encoding subtables - 0, - 0, - // Encoding Subtable : platform (UNI=0), encoding 0 - 0, - 28, - // Encoding Subtable : offset (hi,lo) - 0, - 3, - // Encoding Subtable : platform (UNI=0), encoding 3 - 0, - 28, - // Encoding Subtable : offset (hi,lo) - 3, - 1, - // Encoding Subtable : platform (MS=3), encoding 1 - 0, - 28, - // Encoding Subtable : offset (hi,lo) - 4, - $length, - 0, - // Format 4 Mapping subtable: format, length, language - $segCount * 2, - $searchRange, - $entrySelector, - $rangeShift, - ]; - // endCode(s) - foreach ($range as $start => $subrange) { - $endCode = $start + (\count($subrange) - 1); - $cmap[] = $endCode; - // endCode(s) - } - $cmap[] = 0xffff; - // endCode of last Segment - $cmap[] = 0; - // reservedPad - // startCode(s) - foreach ($range as $start => $subrange) { - $cmap[] = $start; - // startCode(s) - } - $cmap[] = 0xffff; - // startCode of last Segment - // idDelta(s) - foreach ($range as $start => $subrange) { - $idDelta = -($start - $subrange[0]); - $cmap[] = $idDelta; - // idDelta(s) - } - $cmap[] = 1; - // idDelta of last Segment - // idRangeOffset(s) - foreach ($range as $subrange) { - $cmap[] = 0; - // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 - } - $cmap[] = 0; - // idRangeOffset of last Segment - foreach ($range as $subrange) { - foreach ($subrange as $glidx) { - $cmap[] = $glidx; - } - } - $cmap[] = 0; - // Mapping for last character - $cmapstr = ''; - foreach ($cmap as $cm) { - $cmapstr .= \pack('n', $cm); - } - $this->add('cmap', $cmapstr); - } else { - $this->add('cmap', $this->get_table('cmap')); - } - \fclose($this->fh); - $stm = ''; - $this->endTTFile($stm); - return $stm; - } -} diff --git a/dependencies/mpdf/mpdf/src/TTFontFileAnalysis.php b/dependencies/mpdf/mpdf/src/TTFontFileAnalysis.php deleted file mode 100644 index d9cea70..0000000 --- a/dependencies/mpdf/mpdf/src/TTFontFileAnalysis.php +++ /dev/null @@ -1,441 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class TTFontFileAnalysis extends TTFontFile -{ - // Used to get font information from files in directory - function extractCoreInfo($file, $TTCfontID = 0) - { - $this->filename = $file; - $this->fh = \fopen($file, 'rb'); - if (!$this->fh) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('ERROR - Can\'t open file ' . $file); - } - $this->_pos = 0; - $this->charWidths = ''; - $this->glyphPos = []; - $this->charToGlyph = []; - $this->tables = []; - $this->otables = []; - $this->ascent = 0; - $this->descent = 0; - $this->numTTCFonts = 0; - $this->TTCFonts = []; - $this->version = $version = $this->read_ulong(); - $this->panose = []; - // mPDF 5.0 - if ($version == 0x4f54544f) { - throw new \WP_Ultimo\Dependencies\Mpdf\Exception\FontException(\sprintf('Fonts with postscript outlines are not supported (%s)', $file)); - } - if ($version == 0x74746366) { - if ($TTCfontID > 0) { - $this->version = $version = $this->read_ulong(); - // TTC Header version now - if (!\in_array($version, [0x10000, 0x20000])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("ERROR - NOT ADDED as Error parsing TrueType Collection: version=" . $version . " - " . $file); - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("ERROR - Error parsing TrueType Collection - " . $file); - } - $this->numTTCFonts = $this->read_ulong(); - for ($i = 1; $i <= $this->numTTCFonts; $i++) { - $this->TTCFonts[$i]['offset'] = $this->read_ulong(); - } - $this->seek($this->TTCFonts[$TTCfontID]['offset']); - $this->version = $version = $this->read_ulong(); - // TTFont version again now - $this->readTableDirectory(\false); - } else { - if (!\in_array($version, [0x10000, 0x74727565])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("ERROR - NOT ADDED as Not a TrueType font: version=" . $version . " - " . $file); - } - $this->readTableDirectory(\false); - } - /* Included for testing... - $cmap_offset = $this->seek_table("cmap"); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i=0;$i<$cmapTableCount;$i++) { - $x[$i]['platformId'] = $this->read_ushort(); - $x[$i]['encodingId'] = $this->read_ushort(); - $x[$i]['offset'] = $this->read_ulong(); - $save_pos = $this->_pos; - $x[$i]['format'] = $this->get_ushort($cmap_offset + $x[$i]['offset'] ); - $this->seek($save_pos ); - } - print_r($x); exit; - */ - /////////////////////////////////// - // name - Naming table - /////////////////////////////////// - /* Test purposes - displays table of names - $name_offset = $this->seek_table("name"); - $format = $this->read_ushort(); - if ($format != 0 && $format != 1) // mPDF 5.3.73 - die("Unknown name table format ".$format); - $numRecords = $this->read_ushort(); - $string_data_offset = $name_offset + $this->read_ushort(); - for ($i=0;$i<$numRecords; $i++) { - $x[$i]['platformId'] = $this->read_ushort(); - $x[$i]['encodingId'] = $this->read_ushort(); - $x[$i]['languageId'] = $this->read_ushort(); - $x[$i]['nameId'] = $this->read_ushort(); - $x[$i]['length'] = $this->read_ushort(); - $x[$i]['offset'] = $this->read_ushort(); - - $N = ''; - if ($x[$i]['platformId'] == 1 && $x[$i]['encodingId'] == 0 && $x[$i]['languageId'] == 0) { // Roman - $opos = $this->_pos; - $N = $this->get_chunk($string_data_offset + $x[$i]['offset'] , $x[$i]['length'] ); - $this->_pos = $opos; - $this->seek($opos); - } - else { // Unicode - $opos = $this->_pos; - $this->seek($string_data_offset + $x[$i]['offset'] ); - $length = $x[$i]['length'] ; - if ($length % 2 != 0) - $length -= 1; - // die("PostScript name is UTF-16BE string of odd length"); - $length /= 2; - $N = ''; - while ($length > 0) { - $char = $this->read_ushort(); - $N .= (chr($char)); - $length -= 1; - } - $this->_pos = $opos; - $this->seek($opos); - } - $x[$i]['names'][$nameId] = $N; - } - print_r($x); exit; - */ - $name_offset = $this->seek_table("name"); - $format = $this->read_ushort(); - if ($format != 0 && $format != 1) { - // mPDF 5.3.73 - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("ERROR - NOT ADDED as Unknown name table format " . $format . " - " . $file); - } - $numRecords = $this->read_ushort(); - $string_data_offset = $name_offset + $this->read_ushort(); - $names = [1 => '', 2 => '', 3 => '', 4 => '', 6 => '']; - $K = \array_keys($names); - $nameCount = \count($names); - for ($i = 0; $i < $numRecords; $i++) { - $platformId = $this->read_ushort(); - $encodingId = $this->read_ushort(); - $languageId = $this->read_ushort(); - $nameId = $this->read_ushort(); - $length = $this->read_ushort(); - $offset = $this->read_ushort(); - if (!\in_array($nameId, $K)) { - continue; - } - $N = ''; - if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { - // Microsoft, Unicode, US English, PS Name - $opos = $this->_pos; - $this->seek($string_data_offset + $offset); - if ($length % 2 != 0) { - $length += 1; - } - $length /= 2; - $N = ''; - while ($length > 0) { - $char = $this->read_ushort(); - $N .= \chr($char); - $length -= 1; - } - $this->_pos = $opos; - $this->seek($opos); - } elseif ($platformId == 1 && $encodingId == 0 && $languageId == 0) { - // Macintosh, Roman, English, PS Name - $opos = $this->_pos; - $N = $this->get_chunk($string_data_offset + $offset, $length); - $this->_pos = $opos; - $this->seek($opos); - } - if ($N && $names[$nameId] == '') { - $names[$nameId] = $N; - $nameCount -= 1; - if ($nameCount == 0) { - break; - } - } - } - if ($names[6]) { - $psName = \preg_replace('/ /', '-', $names[6]); - } elseif ($names[4]) { - $psName = \preg_replace('/ /', '-', $names[4]); - } elseif ($names[1]) { - $psName = \preg_replace('/ /', '-', $names[1]); - } else { - $psName = ''; - } - if (!$names[1] && !$psName) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException("ERROR - NOT ADDED as Could not find valid font name - " . $file); - } - $this->name = $psName; - if ($names[1]) { - $this->familyName = $names[1]; - } else { - $this->familyName = $psName; - } - if ($names[2]) { - $this->styleName = $names[2]; - } else { - $this->styleName = 'Regular'; - } - /////////////////////////////////// - // head - Font header table - /////////////////////////////////// - $this->seek_table("head"); - $ver_maj = $this->read_ushort(); - $ver_min = $this->read_ushort(); - if ($ver_maj != 1) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('ERROR - NOT ADDED as Unknown head table version ' . $ver_maj . '.' . $ver_min . " - " . $file); - } - $this->fontRevision = $this->read_ushort() . $this->read_ushort(); - $this->skip(4); - $magic = $this->read_ulong(); - if ($magic != 0x5f0f3cf5) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('ERROR - NOT ADDED as Invalid head table magic ' . $magic . " - " . $file); - } - $this->skip(2); - $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); - $scale = 1000 / $unitsPerEm; - $this->skip(24); - $macStyle = $this->read_short(); - $this->skip(4); - $indexLocFormat = $this->read_short(); - /////////////////////////////////// - // OS/2 - OS/2 and Windows metrics table - /////////////////////////////////// - $sFamily = ''; - $panose = ''; - $fsSelection = ''; - if (isset($this->tables["OS/2"])) { - $this->seek_table("OS/2"); - $this->skip(30); - $sF = $this->read_short(); - $sFamily = $sF >> 8; - $this->_pos += 10; - //PANOSE = 10 byte length - $panose = \fread($this->fh, 10); - $this->panose = []; - for ($p = 0; $p < \strlen($panose); $p++) { - $this->panose[] = \ord($panose[$p]); - } - $this->skip(20); - $fsSelection = $this->read_short(); - } - /////////////////////////////////// - // post - PostScript table - /////////////////////////////////// - $this->seek_table("post"); - $this->skip(4); - $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; - $this->skip(4); - $isFixedPitch = $this->read_ulong(); - /////////////////////////////////// - // cmap - Character to glyph index mapping table - /////////////////////////////////// - $cmap_offset = $this->seek_table("cmap"); - $this->skip(2); - $cmapTableCount = $this->read_ushort(); - $unicode_cmap_offset = 0; - for ($i = 0; $i < $cmapTableCount; $i++) { - $platformID = $this->read_ushort(); - $encodingID = $this->read_ushort(); - $offset = $this->read_ulong(); - $save_pos = $this->_pos; - if ($platformID == 3 && $encodingID == 1 || $platformID == 0) { - // Microsoft, Unicode - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 4) { - if (!$unicode_cmap_offset) { - $unicode_cmap_offset = $cmap_offset + $offset; - } - } - } elseif ($platformID == 3 && $encodingID == 10 || $platformID == 0) { - // Microsoft, Unicode Format 12 table HKCS - $format = $this->get_ushort($cmap_offset + $offset); - if ($format == 12) { - $unicode_cmap_offset = $cmap_offset + $offset; - break; - } - } - $this->seek($save_pos); - } - if (!$unicode_cmap_offset) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('ERROR - Font (' . $this->filename . ') NOT ADDED as it is not Unicode encoded, and cannot be used by mPDF'); - } - $rtl = \false; - $indic = \false; - $cjk = \false; - $sip = \false; - $smp = \false; - $pua = \false; - $puaag = \false; - $glyphToChar = []; - $unAGlyphs = ''; - // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above - if ($format == 12) { - $this->seek($unicode_cmap_offset + 4); - $length = $this->read_ulong(); - $limit = $unicode_cmap_offset + $length; - $this->skip(4); - $nGroups = $this->read_ulong(); - for ($i = 0; $i < $nGroups; $i++) { - $startCharCode = $this->read_ulong(); - $endCharCode = $this->read_ulong(); - $startGlyphCode = $this->read_ulong(); - if ($endCharCode > 0x20000 && $endCharCode < 0x2a6df || $endCharCode > 0x2f800 && $endCharCode < 0x2fa1f) { - $sip = \true; - } - if ($endCharCode > 0x10000 && $endCharCode < 0x1ffff) { - $smp = \true; - } - if ($endCharCode > 0x590 && $endCharCode < 0x77f || $endCharCode > 0xfe70 && $endCharCode < 0xfeff || $endCharCode > 0xfb50 && $endCharCode < 0xfdff) { - $rtl = \true; - } - if ($endCharCode > 0x900 && $endCharCode < 0xdff) { - $indic = \true; - } - if ($endCharCode > 0xe000 && $endCharCode < 0xf8ff) { - $pua = \true; - if ($endCharCode > 0xf500 && $endCharCode < 0xf7ff) { - $puaag = \true; - } - } - if ($endCharCode > 0x2e80 && $endCharCode < 0x4dc0 || $endCharCode > 0x4e00 && $endCharCode < 0xa4cf || $endCharCode > 0xac00 && $endCharCode < 0xd7af || $endCharCode > 0xf900 && $endCharCode < 0xfaff || $endCharCode > 0xfe30 && $endCharCode < 0xfe4f) { - $cjk = \true; - } - $offset = 0; - // Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs - if (isset($this->tables['post'])) { - for ($unichar = $startCharCode; $unichar <= $endCharCode; $unichar++) { - $glyph = $startGlyphCode + $offset; - $offset++; - $glyphToChar[$glyph][] = $unichar; - } - } - } - } else { - // Format 4 CMap - $this->seek($unicode_cmap_offset + 2); - $length = $this->read_ushort(); - $limit = $unicode_cmap_offset + $length; - $this->skip(2); - $segCount = $this->read_ushort() / 2; - $this->skip(6); - $endCount = []; - for ($i = 0; $i < $segCount; $i++) { - $endCount[] = $this->read_ushort(); - } - $this->skip(2); - $startCount = []; - for ($i = 0; $i < $segCount; $i++) { - $startCount[] = $this->read_ushort(); - } - $idDelta = []; - for ($i = 0; $i < $segCount; $i++) { - $idDelta[] = $this->read_short(); - } - $idRangeOffset_start = $this->_pos; - $idRangeOffset = []; - for ($i = 0; $i < $segCount; $i++) { - $idRangeOffset[] = $this->read_ushort(); - } - for ($n = 0; $n < $segCount; $n++) { - if ($endCount[$n] > 0x590 && $endCount[$n] < 0x77f || $endCount[$n] > 0xfe70 && $endCount[$n] < 0xfeff || $endCount[$n] > 0xfb50 && $endCount[$n] < 0xfdff) { - $rtl = \true; - } - if ($endCount[$n] > 0x900 && $endCount[$n] < 0xdff) { - $indic = \true; - } - if ($endCount[$n] > 0x2e80 && $endCount[$n] < 0x4dc0 || $endCount[$n] > 0x4e00 && $endCount[$n] < 0xa4cf || $endCount[$n] > 0xac00 && $endCount[$n] < 0xd7af || $endCount[$n] > 0xf900 && $endCount[$n] < 0xfaff || $endCount[$n] > 0xfe30 && $endCount[$n] < 0xfe4f) { - $cjk = \true; - } - if ($endCount[$n] > 0xe000 && $endCount[$n] < 0xf8ff) { - $pua = \true; - if ($endCount[$n] > 0xf500 && $endCount[$n] < 0xf7ff) { - $puaag = \true; - } - } - // Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs - if (isset($this->tables['post'])) { - $endpoint = $endCount[$n] + 1; - for ($unichar = $startCount[$n]; $unichar < $endpoint; $unichar++) { - if ($idRangeOffset[$n] == 0) { - $glyph = $unichar + $idDelta[$n] & 0xffff; - } else { - $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; - $offset = $idRangeOffset_start + 2 * $n + $offset; - if ($offset >= $limit) { - $glyph = 0; - } else { - $glyph = $this->get_ushort($offset); - if ($glyph != 0) { - $glyph = $glyph + $idDelta[$n] & 0xffff; - } - } - } - $glyphToChar[$glyph][] = $unichar; - } - } - } - } - $bold = \false; - $italic = \false; - $ftype = ''; - if ($macStyle & 1 << 0) { - $bold = \true; - } elseif ($fsSelection & 1 << 5) { - $bold = \true; - } - // 5 BOLD Characters are emboldened - if ($macStyle & 1 << 1) { - $italic = \true; - } elseif ($fsSelection & 1 << 0) { - $italic = \true; - } elseif ($this->italicAngle != 0) { - $italic = \true; - } - if ($isFixedPitch) { - $ftype = 'mono'; - } elseif ($sFamily > 0 && $sFamily < 8) { - $ftype = 'serif'; - } elseif ($sFamily == 8) { - $ftype = 'sans'; - } elseif ($sFamily == 10) { - $ftype = 'cursive'; - } - // Use PANOSE - if ($panose) { - $bFamilyType = \ord($panose[0]); - if ($bFamilyType == 2) { - $bSerifStyle = \ord($panose[1]); - if (!$ftype) { - if ($bSerifStyle > 1 && $bSerifStyle < 11) { - $ftype = 'serif'; - } elseif ($bSerifStyle > 10) { - $ftype = 'sans'; - } - } - $bProportion = \ord($panose[3]); - if ($bProportion == 9 || $bProportion == 1) { - $ftype = 'mono'; - } - // ==1 i.e. No Fit needed for OCR-a and -b - } elseif ($bFamilyType == 3) { - $ftype = 'cursive'; - } - } - \fclose($this->fh); - return [$this->familyName, $bold, $italic, $ftype, $TTCfontID, $rtl, $indic, $cjk, $sip, $smp, $puaag, $pua, $unAGlyphs]; - } -} diff --git a/dependencies/mpdf/mpdf/src/TableOfContents.php b/dependencies/mpdf/mpdf/src/TableOfContents.php deleted file mode 100644 index 318567a..0000000 --- a/dependencies/mpdf/mpdf/src/TableOfContents.php +++ /dev/null @@ -1,800 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -use WP_Ultimo\Dependencies\Mpdf\Utils\Arrays; -use WP_Ultimo\Dependencies\DeepCopy\DeepCopy; -class TableOfContents -{ - private $mpdf; - private $sizeConverter; - var $_toc; - var $TOCmark; - var $TOCoutdent; - // mPDF 5.6.31 - var $TOCpreHTML; - var $TOCpostHTML; - var $TOCbookmarkText; - var $TOCusePaging; - var $TOCuseLinking; - var $TOCorientation; - var $TOC_margin_left; - var $TOC_margin_right; - var $TOC_margin_top; - var $TOC_margin_bottom; - var $TOC_margin_header; - var $TOC_margin_footer; - var $TOC_odd_header_name; - var $TOC_even_header_name; - var $TOC_odd_footer_name; - var $TOC_even_footer_name; - var $TOC_odd_header_value; - var $TOC_even_header_value; - var $TOC_odd_footer_value; - var $TOC_even_footer_value; - var $TOC_page_selector; - var $TOC_resetpagenum; - // mPDF 6 - var $TOC_pagenumstyle; - // mPDF 6 - var $TOC_suppress; - // mPDF 6 - var $TOCsheetsize; - var $m_TOC; - /** - * @var bool Determine if the TOC should be cloned to calculate the correct page numbers - */ - protected $tocTocPaintBegun = \false; - public function __construct(Mpdf $mpdf, SizeConverter $sizeConverter) - { - $this->mpdf = $mpdf; - $this->sizeConverter = $sizeConverter; - $this->_toc = []; - $this->TOCmark = 0; - $this->m_TOC = []; - } - /** - * Mark the TOC Paint as having begun - */ - public function beginTocPaint() - { - $this->tocTocPaintBegun = \true; - } - public function TOCpagebreak($tocfont = '', $tocfontsize = '', $tocindent = '', $TOCusePaging = \true, $TOCuseLinking = '', $toc_orientation = '', $toc_mgl = '', $toc_mgr = '', $toc_mgt = '', $toc_mgb = '', $toc_mgh = '', $toc_mgf = '', $toc_ohname = '', $toc_ehname = '', $toc_ofname = '', $toc_efname = '', $toc_ohvalue = 0, $toc_ehvalue = 0, $toc_ofvalue = 0, $toc_efvalue = 0, $toc_preHTML = '', $toc_postHTML = '', $toc_bookmarkText = '', $resetpagenum = '', $pagenumstyle = '', $suppress = '', $orientation = '', $mgl = '', $mgr = '', $mgt = '', $mgb = '', $mgh = '', $mgf = '', $ohname = '', $ehname = '', $ofname = '', $efname = '', $ohvalue = 0, $ehvalue = 0, $ofvalue = 0, $efvalue = 0, $toc_id = 0, $pagesel = '', $toc_pagesel = '', $sheetsize = '', $toc_sheetsize = '', $tocoutdent = '', $toc_resetpagenum = '', $toc_pagenumstyle = '', $toc_suppress = '') - { - if (\strtoupper($toc_id) == 'ALL') { - $toc_id = '_mpdf_all'; - } elseif (!$toc_id) { - $toc_id = 0; - } else { - $toc_id = \strtolower($toc_id); - } - if ($TOCusePaging === \false || \strtolower($TOCusePaging) == "off" || $TOCusePaging === 0 || $TOCusePaging === "0" || $TOCusePaging === "") { - $TOCusePaging = \false; - } else { - $TOCusePaging = \true; - } - if (!$TOCuseLinking) { - $TOCuseLinking = \false; - } - if ($toc_id) { - $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; - $this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent; - $this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation; - $this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking; - $this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging; - if ($toc_preHTML) { - $this->m_TOC[$toc_id]['TOCpreHTML'] = $toc_preHTML; - } - if ($toc_postHTML) { - $this->m_TOC[$toc_id]['TOCpostHTML'] = $toc_postHTML; - } - if ($toc_bookmarkText) { - $this->m_TOC[$toc_id]['TOCbookmarkText'] = $toc_bookmarkText; - } - $this->m_TOC[$toc_id]['TOC_margin_left'] = $toc_mgl; - $this->m_TOC[$toc_id]['TOC_margin_right'] = $toc_mgr; - $this->m_TOC[$toc_id]['TOC_margin_top'] = $toc_mgt; - $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $toc_mgb; - $this->m_TOC[$toc_id]['TOC_margin_header'] = $toc_mgh; - $this->m_TOC[$toc_id]['TOC_margin_footer'] = $toc_mgf; - $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $toc_ohname; - $this->m_TOC[$toc_id]['TOC_even_header_name'] = $toc_ehname; - $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $toc_ofname; - $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $toc_efname; - $this->m_TOC[$toc_id]['TOC_odd_header_value'] = $toc_ohvalue; - $this->m_TOC[$toc_id]['TOC_even_header_value'] = $toc_ehvalue; - $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $toc_ofvalue; - $this->m_TOC[$toc_id]['TOC_even_footer_value'] = $toc_efvalue; - $this->m_TOC[$toc_id]['TOC_page_selector'] = $toc_pagesel; - $this->m_TOC[$toc_id]['TOC_resetpagenum'] = $toc_resetpagenum; - // mPDF 6 - $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = $toc_pagenumstyle; - // mPDF 6 - $this->m_TOC[$toc_id]['TOC_suppress'] = $toc_suppress; - // mPDF 6 - $this->m_TOC[$toc_id]['TOCsheetsize'] = $toc_sheetsize; - } else { - $this->TOCmark = $this->mpdf->page; - $this->TOCoutdent = $tocoutdent; - $this->TOCorientation = $toc_orientation; - $this->TOCuseLinking = $TOCuseLinking; - $this->TOCusePaging = $TOCusePaging; - if ($toc_preHTML) { - $this->TOCpreHTML = $toc_preHTML; - } - if ($toc_postHTML) { - $this->TOCpostHTML = $toc_postHTML; - } - if ($toc_bookmarkText) { - $this->TOCbookmarkText = $toc_bookmarkText; - } - $this->TOC_margin_left = $toc_mgl; - $this->TOC_margin_right = $toc_mgr; - $this->TOC_margin_top = $toc_mgt; - $this->TOC_margin_bottom = $toc_mgb; - $this->TOC_margin_header = $toc_mgh; - $this->TOC_margin_footer = $toc_mgf; - $this->TOC_odd_header_name = $toc_ohname; - $this->TOC_even_header_name = $toc_ehname; - $this->TOC_odd_footer_name = $toc_ofname; - $this->TOC_even_footer_name = $toc_efname; - $this->TOC_odd_header_value = $toc_ohvalue; - $this->TOC_even_header_value = $toc_ehvalue; - $this->TOC_odd_footer_value = $toc_ofvalue; - $this->TOC_even_footer_value = $toc_efvalue; - $this->TOC_page_selector = $toc_pagesel; - $this->TOC_resetpagenum = $toc_resetpagenum; - // mPDF 6 - $this->TOC_pagenumstyle = $toc_pagenumstyle; - // mPDF 6 - $this->TOC_suppress = $toc_suppress; - // mPDF 6 - $this->TOCsheetsize = $toc_sheetsize; - } - } - /** - * Initiate, and Mark a place for the Table of Contents to be inserted - */ - public function TOC($tocfont = '', $tocfontsize = 0, $tocindent = 0, $resetpagenum = '', $pagenumstyle = '', $suppress = '', $toc_orientation = '', $TOCusePaging = \true, $TOCuseLinking = \false, $toc_id = 0, $tocoutdent = '', $toc_resetpagenum = '', $toc_pagenumstyle = '', $toc_suppress = '') - { - if (\strtoupper($toc_id) == 'ALL') { - $toc_id = '_mpdf_all'; - } elseif (!$toc_id) { - $toc_id = 0; - } else { - $toc_id = \strtolower($toc_id); - } - // To use odd and even pages - // Cannot start table of contents on an even page - if ($this->mpdf->mirrorMargins && $this->mpdf->page % 2 == 0) { - // EVEN - if ($this->mpdf->ColActive) { - if (\count($this->mpdf->columnbuffer)) { - $this->mpdf->printcolumnbuffer(); - } - } - $this->mpdf->AddPage($this->mpdf->CurOrientation, '', $resetpagenum, $pagenumstyle, $suppress); - } else { - $this->mpdf->PageNumSubstitutions[] = ['from' => $this->mpdf->page, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; - } - if ($toc_id) { - $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; - $this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent; - $this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation; - $this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking; - $this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging; - $this->m_TOC[$toc_id]['TOC_resetpagenum'] = $toc_resetpagenum; - // mPDF 6 - $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = $toc_pagenumstyle; - // mPDF 6 - $this->m_TOC[$toc_id]['TOC_suppress'] = $toc_suppress; - // mPDF 6 - } else { - $this->TOCmark = $this->mpdf->page; - $this->TOCoutdent = $tocoutdent; - $this->TOCorientation = $toc_orientation; - $this->TOCuseLinking = $TOCuseLinking; - $this->TOCusePaging = $TOCusePaging; - $this->TOC_resetpagenum = $toc_resetpagenum; - // mPDF 6 - $this->TOC_pagenumstyle = $toc_pagenumstyle; - // mPDF 6 - $this->TOC_suppress = $toc_suppress; - // mPDF 6 - } - } - public function insertTOC() - { - /* - * Fix the TOC page numbering problem - * - * To do this, the current class is deep cloned and then the TOC functionality run. The correct page - * numbers are calculated when the TOC pages are moved into position in the cloned object (see Mpdf::MovePages). - * It's then a matter of copying the correct page numbers to the original object and letting the TOC functionality - * run as per normal. - * - * See https://github.com/mpdf/mpdf/issues/642 - */ - if (!$this->tocTocPaintBegun) { - $copier = new DeepCopy(\true); - $tocClassClone = $copier->copy($this); - $tocClassClone->beginTocPaint(); - $tocClassClone->insertTOC(); - $this->_toc = $tocClassClone->_toc; - } - $notocs = 0; - if ($this->TOCmark) { - $notocs = 1; - } - $notocs += \count($this->m_TOC); - if ($notocs == 0) { - return; - } - if (\count($this->m_TOC)) { - \reset($this->m_TOC); - } - $added_toc_pages = 0; - if ($this->mpdf->ColActive) { - $this->mpdf->SetColumns(0); - } - if ($this->mpdf->mirrorMargins && $this->mpdf->page % 2 == 1) { - // ODD - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $extrapage = \true; - } else { - $extrapage = \false; - } - for ($toci = 0; $toci < $notocs; $toci++) { - if ($toci == 0 && $this->TOCmark) { - $toc_id = 0; - $toc_page = $this->TOCmark; - $tocoutdent = $this->TOCoutdent; - $toc_orientation = $this->TOCorientation; - $TOCuseLinking = $this->TOCuseLinking; - $TOCusePaging = $this->TOCusePaging; - $toc_preHTML = $this->TOCpreHTML; - $toc_postHTML = $this->TOCpostHTML; - $toc_bookmarkText = $this->TOCbookmarkText; - $toc_mgl = $this->TOC_margin_left; - $toc_mgr = $this->TOC_margin_right; - $toc_mgt = $this->TOC_margin_top; - $toc_mgb = $this->TOC_margin_bottom; - $toc_mgh = $this->TOC_margin_header; - $toc_mgf = $this->TOC_margin_footer; - $toc_ohname = $this->TOC_odd_header_name; - $toc_ehname = $this->TOC_even_header_name; - $toc_ofname = $this->TOC_odd_footer_name; - $toc_efname = $this->TOC_even_footer_name; - $toc_ohvalue = $this->TOC_odd_header_value; - $toc_ehvalue = $this->TOC_even_header_value; - $toc_ofvalue = $this->TOC_odd_footer_value; - $toc_efvalue = $this->TOC_even_footer_value; - $toc_page_selector = $this->TOC_page_selector; - $toc_resetpagenum = $this->TOC_resetpagenum; - // mPDF 6 - $toc_pagenumstyle = $this->TOC_pagenumstyle; - // mPDF 6 - $toc_suppress = $this->TOC_suppress; - // mPDF 6 - $toc_sheet_size = isset($this->TOCsheetsize) ? $this->TOCsheetsize : ''; - } else { - $arr = \current($this->m_TOC); - $toc_id = \key($this->m_TOC); - $toc_page = $this->m_TOC[$toc_id]['TOCmark']; - $tocoutdent = $this->m_TOC[$toc_id]['TOCoutdent']; - $toc_orientation = $this->m_TOC[$toc_id]['TOCorientation']; - $TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking']; - $TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging']; - if (isset($this->m_TOC[$toc_id]['TOCpreHTML'])) { - $toc_preHTML = $this->m_TOC[$toc_id]['TOCpreHTML']; - } else { - $toc_preHTML = ''; - } - if (isset($this->m_TOC[$toc_id]['TOCpostHTML'])) { - $toc_postHTML = $this->m_TOC[$toc_id]['TOCpostHTML']; - } else { - $toc_postHTML = ''; - } - if (isset($this->m_TOC[$toc_id]['TOCbookmarkText'])) { - $toc_bookmarkText = $this->m_TOC[$toc_id]['TOCbookmarkText']; - } else { - $toc_bookmarkText = ''; - } - // *BOOKMARKS* - $toc_mgl = $this->m_TOC[$toc_id]['TOC_margin_left']; - $toc_mgr = $this->m_TOC[$toc_id]['TOC_margin_right']; - $toc_mgt = $this->m_TOC[$toc_id]['TOC_margin_top']; - $toc_mgb = $this->m_TOC[$toc_id]['TOC_margin_bottom']; - $toc_mgh = $this->m_TOC[$toc_id]['TOC_margin_header']; - $toc_mgf = $this->m_TOC[$toc_id]['TOC_margin_footer']; - $toc_ohname = $this->m_TOC[$toc_id]['TOC_odd_header_name']; - $toc_ehname = $this->m_TOC[$toc_id]['TOC_even_header_name']; - $toc_ofname = $this->m_TOC[$toc_id]['TOC_odd_footer_name']; - $toc_efname = $this->m_TOC[$toc_id]['TOC_even_footer_name']; - $toc_ohvalue = $this->m_TOC[$toc_id]['TOC_odd_header_value']; - $toc_ehvalue = $this->m_TOC[$toc_id]['TOC_even_header_value']; - $toc_ofvalue = $this->m_TOC[$toc_id]['TOC_odd_footer_value']; - $toc_efvalue = $this->m_TOC[$toc_id]['TOC_even_footer_value']; - $toc_page_selector = $this->m_TOC[$toc_id]['TOC_page_selector']; - $toc_resetpagenum = $this->m_TOC[$toc_id]['TOC_resetpagenum']; - // mPDF 6 - $toc_pagenumstyle = $this->m_TOC[$toc_id]['TOC_pagenumstyle']; - // mPDF 6 - $toc_suppress = $this->m_TOC[$toc_id]['TOC_suppress']; - // mPDF 6 - $toc_sheet_size = isset($this->m_TOC[$toc_id]['TOCsheetsize']) ? $this->m_TOC[$toc_id]['TOCsheetsize'] : ''; - \next($this->m_TOC); - } - // mPDF 5.6.31 - if (!$toc_orientation) { - $toc_orientation = $this->mpdf->DefOrientation; - } - // mPDF 6 number style and suppress now picked up from section preceding ToC - list($tp_pagenumstyle, $tp_suppress, $tp_reset) = $this->mpdf->docPageSettings($toc_page - 1); - if ($toc_resetpagenum) { - $tp_reset = $toc_resetpagenum; - // mPDF 6 - } - if ($toc_pagenumstyle) { - $tp_pagenumstyle = $toc_pagenumstyle; - // mPDF 6 - } - if ($toc_suppress || $toc_suppress === '0') { - $tp_suppress = $toc_suppress; - // mPDF 6 - } - $this->mpdf->AddPage($toc_orientation, '', $tp_reset, $tp_pagenumstyle, $tp_suppress, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_page_selector, $toc_sheet_size); - // mPDF 6 - $this->mpdf->writingToC = \true; - // mPDF 5.6.38 - /* - * Ensure the TOC Page Number Style doesn't effect the TOC Numbering (added automatically in `AddPage()` above) - * Ensure the page numbers show in the TOC when the 'suppress' setting is enabled - * @see https://github.com/mpdf/mpdf/issues/792 - * @see https://github.com/mpdf/mpdf/issues/777 - */ - if (isset($tocClassClone)) { - $this->mpdf->PageNumSubstitutions = \array_map(function ($sub) { - $sub['suppress'] = ''; - return $sub; - }, $tocClassClone->mpdf->PageNumSubstitutions); - } - // mPDF 5.6.31 - $tocstart = \count($this->mpdf->pages); - if (isset($toc_preHTML) && $toc_preHTML) { - $this->mpdf->WriteHTML($toc_preHTML); - } - // mPDF 5.6.19 - $html = '<div class="mpdf_toc" id="mpdf_toc_' . $toc_id . '">'; - foreach ($this->_toc as $t) { - if ($t['toc_id'] === '_mpdf_all' || $t['toc_id'] === $toc_id) { - $html .= '<div class="mpdf_toc_level_' . $t['l'] . '">'; - if ($TOCuseLinking) { - $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_' . $t['link'] . '">'; - } - $html .= '<span class="mpdf_toc_t_level_' . $t['l'] . '">' . $t['t'] . '</span>'; - if ($TOCuseLinking) { - $html .= '</a>'; - } - if (!$tocoutdent) { - $tocoutdent = '0'; - } - if ($TOCusePaging) { - $html .= ' <dottab outdent="' . $tocoutdent . '" /> '; - if ($TOCuseLinking) { - $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_' . $t['link'] . '">'; - } - $html .= '<span class="mpdf_toc_p_level_' . $t['l'] . '">' . $this->mpdf->docPageNum($t['p']) . '</span>'; - if ($TOCuseLinking) { - $html .= '</a>'; - } - } - $html .= '</div>'; - } - } - $html .= '</div>'; - $this->mpdf->WriteHTML($html); - if (isset($toc_postHTML) && $toc_postHTML) { - $this->mpdf->WriteHTML($toc_postHTML); - } - $this->mpdf->writingToC = \false; - // mPDF 5.6.38 - $this->mpdf->AddPage($toc_orientation, 'E'); - $n_toc = $this->mpdf->page - $tocstart + 1; - if ($toci == 0 && $this->TOCmark) { - $TOC_start = $tocstart; - $TOC_end = $this->mpdf->page; - $TOC_npages = $n_toc; - } else { - $this->m_TOC[$toc_id]['start'] = $tocstart; - $this->m_TOC[$toc_id]['end'] = $this->mpdf->page; - $this->m_TOC[$toc_id]['npages'] = $n_toc; - } - } - $s = ''; - $s .= $this->mpdf->PrintBodyBackgrounds(); - $s .= $this->mpdf->PrintPageBackgrounds(); - $this->mpdf->pages[$this->mpdf->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', "\n" . $s . "\n" . '\\1', $this->mpdf->pages[$this->mpdf->page]); - $this->mpdf->pageBackgrounds = []; - //Page footer - $this->mpdf->InFooter = \true; - $this->mpdf->Footer(); - $this->mpdf->InFooter = \false; - // 2nd time through to move pages etc. - $added_toc_pages = 0; - if (\count($this->m_TOC)) { - \reset($this->m_TOC); - } - for ($toci = 0; $toci < $notocs; $toci++) { - if ($toci == 0 && $this->TOCmark) { - $toc_id = 0; - $toc_page = $this->TOCmark + $added_toc_pages; - $toc_orientation = $this->TOCorientation; - $TOCuseLinking = $this->TOCuseLinking; - $TOCusePaging = $this->TOCusePaging; - $toc_bookmarkText = $this->TOCbookmarkText; - // *BOOKMARKS* - $tocstart = $TOC_start; - $tocend = $n = $TOC_end; - $n_toc = $TOC_npages; - } else { - $arr = \current($this->m_TOC); - $toc_id = \key($this->m_TOC); - $toc_page = $this->m_TOC[$toc_id]['TOCmark'] + $added_toc_pages; - $toc_orientation = $this->m_TOC[$toc_id]['TOCorientation']; - $TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking']; - $TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging']; - $toc_bookmarkText = Arrays::get($this->m_TOC[$toc_id], 'TOCbookmarkText', null); - // *BOOKMARKS* - $tocstart = $this->m_TOC[$toc_id]['start']; - $tocend = $n = $this->m_TOC[$toc_id]['end']; - $n_toc = $this->m_TOC[$toc_id]['npages']; - \next($this->m_TOC); - } - // Now pages moved - $added_toc_pages += $n_toc; - $this->mpdf->MovePages($toc_page, $tocstart, $tocend); - $this->mpdf->pgsIns[$toc_page] = $tocend - $tocstart + 1; - /* -- BOOKMARKS -- */ - // Insert new Bookmark for Bookmark - if ($toc_bookmarkText) { - $insert = -1; - foreach ($this->mpdf->BMoutlines as $i => $o) { - if ($o['p'] < $toc_page) { - // i.e. before point of insertion - $insert = $i; - } - } - $txt = $this->mpdf->purify_utf8_text($toc_bookmarkText); - if ($this->mpdf->text_input_as_HTML) { - $txt = $this->mpdf->all_entities_to_utf8($txt); - } - $newBookmark[0] = ['t' => $txt, 'l' => 0, 'y' => 0, 'p' => $toc_page]; - \array_splice($this->mpdf->BMoutlines, $insert + 1, 0, $newBookmark); - } - /* -- END BOOKMARKS -- */ - } - // Delete empty page that was inserted earlier - if ($extrapage) { - unset($this->mpdf->pages[\count($this->mpdf->pages)]); - $this->mpdf->page--; - // Reset page pointer - } - /* Fix the over adjustment of the TOC and Page Substitutions values */ - if (isset($tocClassClone)) { - $this->_toc = $tocClassClone->_toc; - $this->mpdf->PageNumSubstitutions = $tocClassClone->mpdf->PageNumSubstitutions; - unset($tocClassClone); - } - } - public function openTagTOC($attr) - { - if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { - $tocoutdent = $attr['OUTDENT']; - } else { - $tocoutdent = ''; - } - // mPDF 5.6.19 - if (isset($attr['RESETPAGENUM']) && $attr['RESETPAGENUM']) { - $resetpagenum = $attr['RESETPAGENUM']; - } else { - $resetpagenum = ''; - } - if (isset($attr['PAGENUMSTYLE']) && $attr['PAGENUMSTYLE']) { - $pagenumstyle = $attr['PAGENUMSTYLE']; - } else { - $pagenumstyle = ''; - } - if (isset($attr['SUPPRESS']) && $attr['SUPPRESS']) { - $suppress = $attr['SUPPRESS']; - } else { - $suppress = ''; - } - if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { - $toc_orientation = $attr['TOC-ORIENTATION']; - } else { - $toc_orientation = ''; - } - if (isset($attr['PAGING']) && (\strtoupper($attr['PAGING']) == 'OFF' || $attr['PAGING'] === '0')) { - $paging = \false; - } else { - $paging = \true; - } - if (isset($attr['LINKS']) && (\strtoupper($attr['LINKS']) == 'ON' || $attr['LINKS'] == 1)) { - $links = \true; - } else { - $links = \false; - } - if (isset($attr['NAME']) && $attr['NAME']) { - $toc_id = \strtolower($attr['NAME']); - } else { - $toc_id = 0; - } - $this->TOC('', 0, 0, $resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $paging, $links, $toc_id, $tocoutdent); - // mPDF 5.6.19 5.6.31 - } - public function openTagTOCPAGEBREAK($attr) - { - if (isset($attr['NAME']) && $attr['NAME']) { - $toc_id = \strtolower($attr['NAME']); - } else { - $toc_id = 0; - } - if ($toc_id) { - if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { - $this->m_TOC[$toc_id]['TOCoutdent'] = $attr['OUTDENT']; - } else { - $this->m_TOC[$toc_id]['TOCoutdent'] = ''; - } - // mPDF 5.6.19 - if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { - $this->m_TOC[$toc_id]['TOCorientation'] = $attr['TOC-ORIENTATION']; - } else { - $this->m_TOC[$toc_id]['TOCorientation'] = ''; - } - if (isset($attr['PAGING']) && (\strtoupper($attr['PAGING']) == 'OFF' || $attr['PAGING'] === '0')) { - $this->m_TOC[$toc_id]['TOCusePaging'] = \false; - } else { - $this->m_TOC[$toc_id]['TOCusePaging'] = \true; - } - if (isset($attr['LINKS']) && (\strtoupper($attr['LINKS']) == 'ON' || $attr['LINKS'] == 1)) { - $this->m_TOC[$toc_id]['TOCuseLinking'] = \true; - } else { - $this->m_TOC[$toc_id]['TOCuseLinking'] = \false; - } - $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->m_TOC[$toc_id]['TOC_margin_footer'] = ''; - if (isset($attr['TOC-MARGIN-RIGHT'])) { - $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->sizeConverter->convert($attr['TOC-MARGIN-RIGHT'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-LEFT'])) { - $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->sizeConverter->convert($attr['TOC-MARGIN-LEFT'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-TOP'])) { - $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->sizeConverter->convert($attr['TOC-MARGIN-TOP'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-BOTTOM'])) { - $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->sizeConverter->convert($attr['TOC-MARGIN-BOTTOM'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-HEADER'])) { - $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->sizeConverter->convert($attr['TOC-MARGIN-HEADER'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-FOOTER'])) { - $this->m_TOC[$toc_id]['TOC_margin_footer'] = $this->sizeConverter->convert($attr['TOC-MARGIN-FOOTER'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $this->m_TOC[$toc_id]['TOC_even_header_name'] = $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $this->m_TOC[$toc_id]['TOC_even_footer_name'] = ''; - if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { - $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $attr['TOC-ODD-HEADER-NAME']; - } - if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { - $this->m_TOC[$toc_id]['TOC_even_header_name'] = $attr['TOC-EVEN-HEADER-NAME']; - } - if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { - $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $attr['TOC-ODD-FOOTER-NAME']; - } - if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { - $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $attr['TOC-EVEN-FOOTER-NAME']; - } - $this->m_TOC[$toc_id]['TOC_odd_header_value'] = $this->m_TOC[$toc_id]['TOC_even_header_value'] = $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 0; - if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '1' || \strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'ON')) { - $this->m_TOC[$toc_id]['TOC_odd_header_value'] = 1; - } elseif (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '-1' || \strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'OFF')) { - $this->m_TOC[$toc_id]['TOC_odd_header_value'] = -1; - } - if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '1' || \strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'ON')) { - $this->m_TOC[$toc_id]['TOC_even_header_value'] = 1; - } elseif (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '-1' || \strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'OFF')) { - $this->m_TOC[$toc_id]['TOC_even_header_value'] = -1; - } - if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '1' || \strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'ON')) { - $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = 1; - } elseif (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '-1' || \strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'OFF')) { - $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = -1; - } - if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '1' || \strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'ON')) { - $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 1; - } elseif (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '-1' || \strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'OFF')) { - $this->m_TOC[$toc_id]['TOC_even_footer_value'] = -1; - } - if (isset($attr['TOC-RESETPAGENUM']) && $attr['TOC-RESETPAGENUM']) { - $this->m_TOC[$toc_id]['TOC_resetpagenum'] = $attr['TOC-RESETPAGENUM']; - } else { - $this->m_TOC[$toc_id]['TOC_resetpagenum'] = ''; - } - // mPDF 6 - if (isset($attr['TOC-PAGENUMSTYLE']) && $attr['TOC-PAGENUMSTYLE']) { - $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = $attr['TOC-PAGENUMSTYLE']; - } else { - $this->m_TOC[$toc_id]['TOC_pagenumstyle'] = ''; - } - // mPDF 6 - if (isset($attr['TOC-SUPPRESS']) && ($attr['TOC-SUPPRESS'] || $attr['TOC-SUPPRESS'] === '0')) { - $this->m_TOC[$toc_id]['TOC_suppress'] = $attr['TOC-SUPPRESS']; - } else { - $this->m_TOC[$toc_id]['TOC_suppress'] = ''; - } - // mPDF 6 - if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { - $this->m_TOC[$toc_id]['TOC_page_selector'] = $attr['TOC-PAGE-SELECTOR']; - } else { - $this->m_TOC[$toc_id]['TOC_page_selector'] = ''; - } - if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { - $this->m_TOC[$toc_id]['TOCsheetsize'] = $attr['TOC-SHEET-SIZE']; - } else { - $this->m_TOC[$toc_id]['TOCsheetsize'] = ''; - } - if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { - $this->m_TOC[$toc_id]['TOCpreHTML'] = \htmlspecialchars_decode($attr['TOC-PREHTML'], \ENT_QUOTES); - } - if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { - $this->m_TOC[$toc_id]['TOCpostHTML'] = \htmlspecialchars_decode($attr['TOC-POSTHTML'], \ENT_QUOTES); - } - if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { - $this->m_TOC[$toc_id]['TOCbookmarkText'] = \htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'], \ENT_QUOTES); - } - // *BOOKMARKS* - } else { - if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { - $this->TOCoutdent = $attr['OUTDENT']; - } else { - $this->TOCoutdent = ''; - } - // mPDF 5.6.19 - if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { - $this->TOCorientation = $attr['TOC-ORIENTATION']; - } else { - $this->TOCorientation = ''; - } - if (isset($attr['PAGING']) && (\strtoupper($attr['PAGING']) == 'OFF' || $attr['PAGING'] === '0')) { - $this->TOCusePaging = \false; - } else { - $this->TOCusePaging = \true; - } - if (isset($attr['LINKS']) && (\strtoupper($attr['LINKS']) == 'ON' || $attr['LINKS'] == 1)) { - $this->TOCuseLinking = \true; - } else { - $this->TOCuseLinking = \false; - } - $this->TOC_margin_left = $this->TOC_margin_right = $this->TOC_margin_top = $this->TOC_margin_bottom = $this->TOC_margin_header = $this->TOC_margin_footer = ''; - if (isset($attr['TOC-MARGIN-RIGHT'])) { - $this->TOC_margin_right = $this->sizeConverter->convert($attr['TOC-MARGIN-RIGHT'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-LEFT'])) { - $this->TOC_margin_left = $this->sizeConverter->convert($attr['TOC-MARGIN-LEFT'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-TOP'])) { - $this->TOC_margin_top = $this->sizeConverter->convert($attr['TOC-MARGIN-TOP'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-BOTTOM'])) { - $this->TOC_margin_bottom = $this->sizeConverter->convert($attr['TOC-MARGIN-BOTTOM'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-HEADER'])) { - $this->TOC_margin_header = $this->sizeConverter->convert($attr['TOC-MARGIN-HEADER'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['TOC-MARGIN-FOOTER'])) { - $this->TOC_margin_footer = $this->sizeConverter->convert($attr['TOC-MARGIN-FOOTER'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - $this->TOC_odd_header_name = $this->TOC_even_header_name = $this->TOC_odd_footer_name = $this->TOC_even_footer_name = ''; - if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { - $this->TOC_odd_header_name = $attr['TOC-ODD-HEADER-NAME']; - } - if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { - $this->TOC_even_header_name = $attr['TOC-EVEN-HEADER-NAME']; - } - if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { - $this->TOC_odd_footer_name = $attr['TOC-ODD-FOOTER-NAME']; - } - if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { - $this->TOC_even_footer_name = $attr['TOC-EVEN-FOOTER-NAME']; - } - $this->TOC_odd_header_value = $this->TOC_even_header_value = $this->TOC_odd_footer_value = $this->TOC_even_footer_value = 0; - if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '1' || \strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'ON')) { - $this->TOC_odd_header_value = 1; - } elseif (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE'] == '-1' || \strtoupper($attr['TOC-ODD-HEADER-VALUE']) == 'OFF')) { - $this->TOC_odd_header_value = -1; - } - if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '1' || \strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'ON')) { - $this->TOC_even_header_value = 1; - } elseif (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE'] == '-1' || \strtoupper($attr['TOC-EVEN-HEADER-VALUE']) == 'OFF')) { - $this->TOC_even_header_value = -1; - } - if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '1' || \strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'ON')) { - $this->TOC_odd_footer_value = 1; - } elseif (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE'] == '-1' || \strtoupper($attr['TOC-ODD-FOOTER-VALUE']) == 'OFF')) { - $this->TOC_odd_footer_value = -1; - } - if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '1' || \strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'ON')) { - $this->TOC_even_footer_value = 1; - } elseif (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE'] == '-1' || \strtoupper($attr['TOC-EVEN-FOOTER-VALUE']) == 'OFF')) { - $this->TOC_even_footer_value = -1; - } - if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { - $this->TOC_page_selector = $attr['TOC-PAGE-SELECTOR']; - } else { - $this->TOC_page_selector = ''; - } - if (isset($attr['TOC-RESETPAGENUM']) && $attr['TOC-RESETPAGENUM']) { - $this->TOC_resetpagenum = $attr['TOC-RESETPAGENUM']; - } else { - $this->TOC_resetpagenum = ''; - } - // mPDF 6 - if (isset($attr['TOC-PAGENUMSTYLE']) && $attr['TOC-PAGENUMSTYLE']) { - $this->TOC_pagenumstyle = $attr['TOC-PAGENUMSTYLE']; - } else { - $this->TOC_pagenumstyle = ''; - } - // mPDF 6 - if (isset($attr['TOC-SUPPRESS']) && ($attr['TOC-SUPPRESS'] || $attr['TOC-SUPPRESS'] === '0')) { - $this->TOC_suppress = $attr['TOC-SUPPRESS']; - } else { - $this->TOC_suppress = ''; - } - // mPDF 6 - if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { - $this->TOCsheetsize = $attr['TOC-SHEET-SIZE']; - } else { - $this->TOCsheetsize = ''; - } - if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { - $this->TOCpreHTML = \htmlspecialchars_decode($attr['TOC-PREHTML'], \ENT_QUOTES); - } - if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { - $this->TOCpostHTML = \htmlspecialchars_decode($attr['TOC-POSTHTML'], \ENT_QUOTES); - } - if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { - $this->TOCbookmarkText = \htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'], \ENT_QUOTES); - } - } - if ($this->mpdf->y == $this->mpdf->tMargin && (!$this->mpdf->mirrorMargins || $this->mpdf->mirrorMargins && $this->mpdf->page % 2 == 1)) { - if ($toc_id) { - $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; - } else { - $this->TOCmark = $this->mpdf->page; - } - // Don't add a page - if ($this->mpdf->page == 1 && \count($this->mpdf->PageNumSubstitutions) == 0) { - $resetpagenum = ''; - $pagenumstyle = ''; - $suppress = ''; - if (isset($attr['RESETPAGENUM'])) { - $resetpagenum = $attr['RESETPAGENUM']; - } - if (isset($attr['PAGENUMSTYLE'])) { - $pagenumstyle = $attr['PAGENUMSTYLE']; - } - if (isset($attr['SUPPRESS'])) { - $suppress = $attr['SUPPRESS']; - } - if (!$suppress) { - $suppress = 'off'; - } - $this->mpdf->PageNumSubstitutions[] = ['from' => 1, 'reset' => $resetpagenum, 'type' => $pagenumstyle, 'suppress' => $suppress]; - } - return [\true, $toc_id]; - } - // No break - continues as PAGEBREAK... - return [\false, $toc_id]; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag.php b/dependencies/mpdf/mpdf/src/Tag.php deleted file mode 100644 index 57bb1f0..0000000 --- a/dependencies/mpdf/mpdf/src/Tag.php +++ /dev/null @@ -1,176 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -use WP_Ultimo\Dependencies\Mpdf\Strict; -use WP_Ultimo\Dependencies\Mpdf\Color\ColorConverter; -use WP_Ultimo\Dependencies\Mpdf\Image\ImageProcessor; -use WP_Ultimo\Dependencies\Mpdf\Language\LanguageToFontInterface; -class Tag -{ - use Strict; - /** - * @var \Mpdf\Mpdf - */ - private $mpdf; - /** - * @var \Mpdf\Cache - */ - private $cache; - /** - * @var \Mpdf\CssManager - */ - private $cssManager; - /** - * @var \Mpdf\Form - */ - private $form; - /** - * @var \Mpdf\Otl - */ - private $otl; - /** - * @var \Mpdf\TableOfContents - */ - private $tableOfContents; - /** - * @var \Mpdf\SizeConverter - */ - private $sizeConverter; - /** - * @var \Mpdf\Color\ColorConverter - */ - private $colorConverter; - /** - * @var \Mpdf\Image\ImageProcessor - */ - private $imageProcessor; - /** - * @var \Mpdf\Language\LanguageToFontInterface - */ - private $languageToFont; - /** - * @param \Mpdf\Mpdf $mpdf - * @param \Mpdf\Cache $cache - * @param \Mpdf\CssManager $cssManager - * @param \Mpdf\Form $form - * @param \Mpdf\Otl $otl - * @param \Mpdf\TableOfContents $tableOfContents - * @param \Mpdf\SizeConverter $sizeConverter - * @param \Mpdf\Color\ColorConverter $colorConverter - * @param \Mpdf\Image\ImageProcessor $imageProcessor - * @param \Mpdf\Language\LanguageToFontInterface $languageToFont - */ - public function __construct(Mpdf $mpdf, Cache $cache, CssManager $cssManager, Form $form, Otl $otl, TableOfContents $tableOfContents, SizeConverter $sizeConverter, ColorConverter $colorConverter, ImageProcessor $imageProcessor, LanguageToFontInterface $languageToFont) - { - $this->mpdf = $mpdf; - $this->cache = $cache; - $this->cssManager = $cssManager; - $this->form = $form; - $this->otl = $otl; - $this->tableOfContents = $tableOfContents; - $this->sizeConverter = $sizeConverter; - $this->colorConverter = $colorConverter; - $this->imageProcessor = $imageProcessor; - $this->languageToFont = $languageToFont; - } - /** - * @param string $tag The tag name - * @return \Mpdf\Tag\Tag - */ - private function getTagInstance($tag) - { - $className = self::getTagClassName($tag); - if (\class_exists($className)) { - return new $className($this->mpdf, $this->cache, $this->cssManager, $this->form, $this->otl, $this->tableOfContents, $this->sizeConverter, $this->colorConverter, $this->imageProcessor, $this->languageToFont); - } - } - /** - * Returns the fully qualified name of the class handling the rendering of the given tag - * - * @param string $tag The tag name - * @return string The fully qualified name - */ - public static function getTagClassName($tag) - { - static $map = ['BARCODE' => 'BarCode', 'BLOCKQUOTE' => 'BlockQuote', 'COLUMN_BREAK' => 'ColumnBreak', 'COLUMNBREAK' => 'ColumnBreak', 'DOTTAB' => 'DotTab', 'FIELDSET' => 'FieldSet', 'FIGCAPTION' => 'FigCaption', 'FORMFEED' => 'FormFeed', 'HGROUP' => 'HGroup', 'INDEXENTRY' => 'IndexEntry', 'INDEXINSERT' => 'IndexInsert', 'NEWCOLUMN' => 'NewColumn', 'NEWPAGE' => 'NewPage', 'PAGEFOOTER' => 'PageFooter', 'PAGEHEADER' => 'PageHeader', 'PAGE_BREAK' => 'PageBreak', 'PAGEBREAK' => 'PageBreak', 'SETHTMLPAGEFOOTER' => 'SetHtmlPageFooter', 'SETHTMLPAGEHEADER' => 'SetHtmlPageHeader', 'SETPAGEFOOTER' => 'SetPageFooter', 'SETPAGEHEADER' => 'SetPageHeader', 'TBODY' => 'TBody', 'TFOOT' => 'TFoot', 'THEAD' => 'THead', 'TEXTAREA' => 'TextArea', 'TEXTCIRCLE' => 'TextCircle', 'TOCENTRY' => 'TocEntry', 'TOCPAGEBREAK' => 'TocPageBreak', 'VAR' => 'VarTag', 'WATERMARKIMAGE' => 'WatermarkImage', 'WATERMARKTEXT' => 'WatermarkText']; - $className = 'WP_Ultimo\\Dependencies\\Mpdf\\Tag\\'; - $className .= isset($map[$tag]) ? $map[$tag] : \ucfirst(\strtolower($tag)); - return $className; - } - public function OpenTag($tag, $attr, &$ahtml, &$ihtml) - { - // Correct for tags where HTML5 specifies optional end tags excluding table elements (cf WriteHTML() ) - if ($this->mpdf->allow_html_optional_endtags) { - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['tag'])) { - $closed = \false; - // li end tag may be omitted if immediately followed by another li element - if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'LI' && $tag == 'LI') { - $this->CloseTag('LI', $ahtml, $ihtml); - $closed = \true; - } - // dt end tag may be omitted if immediately followed by another dt element or a dd element - if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'DT' && ($tag == 'DT' || $tag == 'DD')) { - $this->CloseTag('DT', $ahtml, $ihtml); - $closed = \true; - } - // dd end tag may be omitted if immediately followed by another dd element or a dt element - if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'DD' && ($tag == 'DT' || $tag == 'DD')) { - $this->CloseTag('DD', $ahtml, $ihtml); - $closed = \true; - } - // p end tag may be omitted if immediately followed by an address, article, aside, blockquote, div, dl, - // fieldset, form, h1, h2, h3, h4, h5, h6, hgroup, hr, main, nav, ol, p, pre, section, table, ul - if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'P' && ($tag == 'P' || $tag == 'DIV' || $tag == 'H1' || $tag == 'H2' || $tag == 'H3' || $tag == 'H4' || $tag == 'H5' || $tag == 'H6' || $tag == 'UL' || $tag == 'OL' || $tag == 'TABLE' || $tag == 'PRE' || $tag == 'FORM' || $tag == 'ADDRESS' || $tag == 'BLOCKQUOTE' || $tag == 'CENTER' || $tag == 'DL' || $tag == 'HR' || $tag == 'ARTICLE' || $tag == 'ASIDE' || $tag == 'FIELDSET' || $tag == 'HGROUP' || $tag == 'MAIN' || $tag == 'NAV' || $tag == 'SECTION')) { - $this->CloseTag('P', $ahtml, $ihtml); - $closed = \true; - } - // option end tag may be omitted if immediately followed by another option element - // (or if it is immediately followed by an optgroup element) - if (!$closed && $this->mpdf->blk[$this->mpdf->blklvl]['tag'] == 'OPTION' && $tag == 'OPTION') { - $this->CloseTag('OPTION', $ahtml, $ihtml); - $closed = \true; - } - // Table elements - see also WriteHTML() - if (!$closed && ($tag == 'TD' || $tag == 'TH') && $this->mpdf->lastoptionaltag == 'TD') { - $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); - $closed = \true; - } - // *TABLES* - if (!$closed && ($tag == 'TD' || $tag == 'TH') && $this->mpdf->lastoptionaltag == 'TH') { - $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); - $closed = \true; - } - // *TABLES* - if (!$closed && $tag == 'TR' && $this->mpdf->lastoptionaltag == 'TR') { - $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); - $closed = \true; - } - // *TABLES* - if (!$closed && $tag == 'TR' && $this->mpdf->lastoptionaltag == 'TD') { - $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); - $this->CloseTag('TR', $ahtml, $ihtml); - $this->CloseTag('THEAD', $ahtml, $ihtml); - $closed = \true; - } - // *TABLES* - if (!$closed && $tag == 'TR' && $this->mpdf->lastoptionaltag == 'TH') { - $this->CloseTag($this->mpdf->lastoptionaltag, $ahtml, $ihtml); - $this->CloseTag('TR', $ahtml, $ihtml); - $this->CloseTag('THEAD', $ahtml, $ihtml); - $closed = \true; - } - // *TABLES* - } - } - if ($object = $this->getTagInstance($tag)) { - return $object->open($attr, $ahtml, $ihtml); - } - } - public function CloseTag($tag, &$ahtml, &$ihtml) - { - if ($object = $this->getTagInstance($tag)) { - return $object->close($ahtml, $ihtml); - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/A.php b/dependencies/mpdf/mpdf/src/Tag/A.php deleted file mode 100644 index 9470c6f..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/A.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class A extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - if (isset($attr['NAME']) && $attr['NAME'] != '') { - $e = ''; - /* -- BOOKMARKS -- */ - if ($this->mpdf->anchor2Bookmark) { - $objattr = []; - $objattr['CONTENT'] = \htmlspecialchars_decode($attr['NAME'], \ENT_QUOTES); - $objattr['type'] = 'bookmark'; - if (!empty($attr['LEVEL'])) { - $objattr['bklevel'] = $attr['LEVEL']; - } else { - $objattr['bklevel'] = 0; - } - $e = Mpdf::OBJECT_IDENTIFIER . "type=bookmark,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - } - /* -- END BOOKMARKS -- */ - if ($this->mpdf->tableLevel) { - // *TABLES* - $this->mpdf->_saveCellTextBuffer($e, '', $attr['NAME']); - // *TABLES* - } else { - // *TABLES* - $this->mpdf->_saveTextBuffer($e, '', $attr['NAME']); - //an internal link (adds a space for recognition) - } - // *TABLES* - } - if (isset($attr['HREF'])) { - $this->mpdf->InlineProperties['A'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('INLINE', 'A', $attr); - if (!empty($properties)) { - $this->mpdf->setCSS($properties, 'INLINE'); - } - $this->mpdf->HREF = $attr['HREF']; - // mPDF 5.7.4 URLs - } - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->HREF = ''; - if (isset($this->mpdf->InlineProperties['A'])) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['A']); - } - unset($this->mpdf->InlineProperties['A']); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Acronym.php b/dependencies/mpdf/mpdf/src/Tag/Acronym.php deleted file mode 100644 index 154f32e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Acronym.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Acronym extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Address.php b/dependencies/mpdf/mpdf/src/Tag/Address.php deleted file mode 100644 index 3b6da6e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Address.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Address extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Annotation.php b/dependencies/mpdf/mpdf/src/Tag/Annotation.php deleted file mode 100644 index 783826e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Annotation.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Annotation extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - //if (isset($attr['CONTENT']) && !$this->mpdf->writingHTMLheader && !$this->mpdf->writingHTMLfooter) { // Stops annotations in FixedPos - if (isset($attr['CONTENT'])) { - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['CONTENT'] = \htmlspecialchars_decode($attr['CONTENT'], \ENT_QUOTES); - $objattr['type'] = 'annot'; - $objattr['POPUP'] = ''; - } else { - return; - } - if (isset($attr['POS-X'])) { - $objattr['POS-X'] = $attr['POS-X']; - } else { - $objattr['POS-X'] = 0; - } - if (isset($attr['POS-Y'])) { - $objattr['POS-Y'] = $attr['POS-Y']; - } else { - $objattr['POS-Y'] = 0; - } - if (isset($attr['ICON'])) { - $objattr['ICON'] = $attr['ICON']; - } else { - $objattr['ICON'] = 'Note'; - } - if (isset($attr['AUTHOR'])) { - $objattr['AUTHOR'] = $attr['AUTHOR']; - } elseif (isset($attr['TITLE'])) { - $objattr['AUTHOR'] = $attr['TITLE']; - } else { - $objattr['AUTHOR'] = ''; - } - if (isset($attr['FILE'])) { - $objattr['FILE'] = $attr['FILE']; - } else { - $objattr['FILE'] = ''; - } - if (isset($attr['SUBJECT'])) { - $objattr['SUBJECT'] = $attr['SUBJECT']; - } else { - $objattr['SUBJECT'] = ''; - } - if (isset($attr['OPACITY']) && $attr['OPACITY'] > 0 && $attr['OPACITY'] <= 1) { - $objattr['OPACITY'] = $attr['OPACITY']; - } elseif ($this->mpdf->annotMargin) { - $objattr['OPACITY'] = 1; - } else { - $objattr['OPACITY'] = $this->mpdf->annotOpacity; - } - if (isset($attr['COLOR'])) { - $cor = $this->colorConverter->convert($attr['COLOR'], $this->mpdf->PDFAXwarnings); - if ($cor) { - $objattr['COLOR'] = $cor; - } else { - $objattr['COLOR'] = $this->colorConverter->convert('yellow', $this->mpdf->PDFAXwarnings); - } - } else { - $objattr['COLOR'] = $this->colorConverter->convert('yellow', $this->mpdf->PDFAXwarnings); - } - if (isset($attr['POPUP']) && !empty($attr['POPUP'])) { - $pop = \preg_split('/\\s+/', \trim($attr['POPUP'])); - if (\count($pop) > 1) { - $objattr['POPUP'] = $pop; - } else { - $objattr['POPUP'] = \true; - } - } - $e = Mpdf::OBJECT_IDENTIFIER . "type=annot,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->mpdf->tableLevel) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$e]; - } else { - // *TABLES* - $this->mpdf->textbuffer[] = [$e]; - } - // *TABLES* - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Article.php b/dependencies/mpdf/mpdf/src/Tag/Article.php deleted file mode 100644 index 0eac237..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Article.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Article extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Aside.php b/dependencies/mpdf/mpdf/src/Tag/Aside.php deleted file mode 100644 index 00fbf1d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Aside.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Aside extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/B.php b/dependencies/mpdf/mpdf/src/Tag/B.php deleted file mode 100644 index a93aa4e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/B.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class B extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/BarCode.php b/dependencies/mpdf/mpdf/src/Tag/BarCode.php deleted file mode 100644 index ef9fe3f..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/BarCode.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class BarCode extends Tag -{ - /** - * @var \Mpdf\Barcode - */ - protected $barcode; - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->ignorefollowingspaces = \false; - if (!empty($attr['CODE'])) { - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['padding_top'] = 0; - $objattr['padding_bottom'] = 0; - $objattr['padding_left'] = 0; - $objattr['padding_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['quiet_l'] = 0; - $objattr['quiet_r'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['code'] = $attr['CODE']; - if (isset($attr['TYPE'])) { - $objattr['btype'] = \strtoupper(\trim($attr['TYPE'])); - } else { - $objattr['btype'] = 'EAN13'; - } - // default - if (\preg_match('/^(EAN13|ISBN|ISSN|EAN8|UPCA|UPCE)P([25])$/', $objattr['btype'], $m)) { - $objattr['btype'] = $m[1]; - $objattr['bsupp'] = $m[2]; - if (\preg_match('/^(\\S+)\\s+(.*)$/', $objattr['code'], $mm)) { - $objattr['code'] = $mm[1]; - $objattr['bsupp_code'] = $mm[2]; - } - } else { - $objattr['bsupp'] = 0; - } - if (isset($attr['TEXT']) && $attr['TEXT'] == 1) { - $objattr['showtext'] = 1; - } else { - $objattr['showtext'] = 0; - } - if (isset($attr['SIZE']) && $attr['SIZE'] > 0) { - $objattr['bsize'] = $attr['SIZE']; - } else { - $objattr['bsize'] = 1; - } - if (isset($attr['HEIGHT']) && $attr['HEIGHT'] > 0) { - $objattr['bheight'] = $attr['HEIGHT']; - } else { - $objattr['bheight'] = 1; - } - if (isset($attr['PR']) && $attr['PR'] > 0) { - $objattr['pr_ratio'] = $attr['PR']; - } else { - $objattr['pr_ratio'] = ''; - } - if (isset($attr['QUIET_ZONE_LEFT']) && \is_numeric($attr['QUIET_ZONE_LEFT'])) { - $objattr['quiet_zone_left'] = $attr['QUIET_ZONE_LEFT']; - } else { - $objattr['quiet_zone_left'] = null; - } - if (isset($attr['QUIET_ZONE_RIGHT']) && \is_numeric($attr['QUIET_ZONE_RIGHT'])) { - $objattr['quiet_zone_right'] = $attr['QUIET_ZONE_RIGHT']; - } else { - $objattr['quiet_zone_right'] = null; - } - $properties = $this->cssManager->MergeCSS('', 'BARCODE', $attr); - if (isset($properties['DISPLAY']) && \strtolower($properties['DISPLAY']) === 'none') { - return; - } - if (isset($properties['MARGIN-TOP'])) { - $objattr['margin_top'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $objattr['margin_bottom'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'])) { - $objattr['margin_left'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-RIGHT'])) { - $objattr['margin_right'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-TOP'])) { - $objattr['padding_top'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-BOTTOM'])) { - $objattr['padding_bottom'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-LEFT'])) { - $objattr['padding_left'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-RIGHT'])) { - $objattr['padding_right'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['BORDER-TOP'])) { - $objattr['border_top'] = $this->mpdf->border_details($properties['BORDER-TOP']); - } - if (isset($properties['BORDER-BOTTOM'])) { - $objattr['border_bottom'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - } - if (isset($properties['BORDER-LEFT'])) { - $objattr['border_left'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - } - if (isset($properties['BORDER-RIGHT'])) { - $objattr['border_right'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - } - if (isset($properties['VERTICAL-ALIGN'])) { - $objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - if (isset($properties['COLOR']) && $properties['COLOR'] != '') { - $objattr['color'] = $this->colorConverter->convert($properties['COLOR'], $this->mpdf->PDFAXwarnings); - } else { - $objattr['color'] = \false; - } - if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { - $objattr['bgcolor'] = $this->colorConverter->convert($properties['BACKGROUND-COLOR'], $this->mpdf->PDFAXwarnings); - } else { - $objattr['bgcolor'] = \false; - } - $this->barcode = new \WP_Ultimo\Dependencies\Mpdf\Barcode(); - if (\in_array($objattr['btype'], ['EAN13', 'ISBN', 'ISSN', 'UPCA', 'UPCE', 'EAN8'])) { - $code = \preg_replace('/\\-/', '', $objattr['code']); - $arrcode = $this->barcode->getBarcodeArray($code, $objattr['btype'], '', $objattr['quiet_l'], $objattr['quiet_r']); - if ($objattr['bsupp'] == 2 || $objattr['bsupp'] == 5) { - // EAN-2 or -5 Supplement - $supparrcode = $this->barcode->getBarcodeArray($objattr['bsupp_code'], 'EAN' . $objattr['bsupp'], '', $objattr['quiet_l'], $objattr['quiet_r']); - $w = ($arrcode['maxw'] + $arrcode['lightmL'] + $arrcode['lightmR'] + $supparrcode['maxw'] + $supparrcode['sepM']) * $arrcode['nom-X'] * $objattr['bsize']; - } else { - $w = ($arrcode['maxw'] + $arrcode['lightmL'] + $arrcode['lightmR']) * $arrcode['nom-X'] * $objattr['bsize']; - } - $h = $arrcode['nom-H'] * $objattr['bsize'] * $objattr['bheight']; - // Add height for ISBN string + margin from top of bars - if ($objattr['showtext'] && $objattr['btype'] === 'EAN13' || $objattr['btype'] === 'ISBN' || $objattr['btype'] === 'ISSN') { - $tisbnm = 1.5 * $objattr['bsize']; - // Top margin between TOP TEXT (isbn - if shown) & bars - $isbn_fontsize = 2.1 * $objattr['bsize']; - $h += $isbn_fontsize + $tisbnm; - } - } elseif ($objattr['btype'] === 'QR') { - // QR-code - $w = $h = $objattr['bsize'] * 25; - // Factor of 25mm (default) - $objattr['errorlevel'] = 'L'; - if (isset($attr['ERROR'])) { - $objattr['errorlevel'] = $attr['ERROR']; - } - $objattr['disableborder'] = \false; - if (isset($attr['DISABLEBORDER'])) { - $objattr['disableborder'] = (bool) $attr['DISABLEBORDER']; - } - } elseif (\in_array($objattr['btype'], ['IMB', 'RM4SCC', 'KIX', 'POSTNET', 'PLANET'])) { - $arrcode = $this->barcode->getBarcodeArray($objattr['code'], $objattr['btype'], '', $objattr['quiet_l'], $objattr['quiet_r']); - $w = $arrcode['maxw'] * $arrcode['nom-X'] * $objattr['bsize'] + $arrcode['quietL'] + $arrcode['quietR']; - $h = $arrcode['nom-H'] * $objattr['bsize'] + 2 * $arrcode['quietTB']; - } elseif (\in_array($objattr['btype'], ['C128A', 'C128B', 'C128C', 'C128RAW', 'EAN128A', 'EAN128B', 'EAN128C', 'C39', 'C39+', 'C39E', 'C39E+', 'S25', 'S25+', 'I25', 'I25+', 'I25B', 'I25B+', 'C93', 'MSI', 'MSI+', 'CODABAR', 'CODE11'])) { - $arrcode = $this->barcode->getBarcodeArray($objattr['code'], $objattr['btype'], $objattr['pr_ratio'], $objattr['quiet_zone_left'], $objattr['quiet_zone_right']); - $w = ($arrcode['maxw'] + $arrcode['lightmL'] + $arrcode['lightmR']) * $arrcode['nom-X'] * $objattr['bsize']; - $h = (2 * $arrcode['lightTB'] * $arrcode['nom-X'] + $arrcode['nom-H']) * $objattr['bsize'] * $objattr['bheight']; - } else { - return; - } - $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; - $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; - $objattr['type'] = 'barcode'; - $objattr['height'] = $h + $extraheight; - $objattr['width'] = $w + $extrawidth; - $objattr['barcode_height'] = $h; - $objattr['barcode_width'] = $w; - /* -- CSS-IMAGE-FLOAT -- */ - if (!$this->mpdf->ColActive && !$this->mpdf->tableLevel && !$this->mpdf->listlvl && !$this->mpdf->kwt) { - if (isset($properties['FLOAT']) && (\strtoupper($properties['FLOAT']) === 'RIGHT' || \strtoupper($properties['FLOAT']) === 'LEFT')) { - $objattr['float'] = \strtoupper(\substr($properties['FLOAT'], 0, 1)); - } - } - /* -- END CSS-IMAGE-FLOAT -- */ - $e = Mpdf::OBJECT_IDENTIFIER . "type=barcode,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - /* -- TABLES -- */ - // Output it to buffers - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - } else { - /* -- END TABLES -- */ - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - // *TABLES* - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Bdi.php b/dependencies/mpdf/mpdf/src/Tag/Bdi.php deleted file mode 100644 index 789dfcf..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Bdi.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Bdi extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Bdo.php b/dependencies/mpdf/mpdf/src/Tag/Bdo.php deleted file mode 100644 index 0e524c1..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Bdo.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Bdo extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Big.php b/dependencies/mpdf/mpdf/src/Tag/Big.php deleted file mode 100644 index 5dd3871..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Big.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Big extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/BlockQuote.php b/dependencies/mpdf/mpdf/src/Tag/BlockQuote.php deleted file mode 100644 index 9a96bbb..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/BlockQuote.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class BlockQuote extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/BlockTag.php b/dependencies/mpdf/mpdf/src/Tag/BlockTag.php deleted file mode 100644 index 0e83819..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/BlockTag.php +++ /dev/null @@ -1,1058 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Conversion\DecToAlpha; -use WP_Ultimo\Dependencies\Mpdf\Conversion\DecToRoman; -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Utils\Arrays; -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -abstract class BlockTag extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - // mPDF 6 Lists - $this->mpdf->lastoptionaltag = ''; - // mPDF 6 bidi - // Block - // If unicode-bidi set on current clock, any embedding levels, isolates, or overrides are closed (not inherited) - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { - $blockpost = $this->mpdf->_setBidiCodes('end', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); - if ($blockpost) { - $this->mpdf->OTLdata = []; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($blockpost); - } else { - $this->mpdf->_saveTextBuffer($blockpost); - } - } - } - $p = $this->cssManager->PreviewBlockCSS($tag, $attr); - if (isset($p['DISPLAY']) && \strtolower($p['DISPLAY']) === 'none') { - $this->mpdf->blklvl++; - $this->mpdf->blk[$this->mpdf->blklvl]['hide'] = \true; - $this->mpdf->blk[$this->mpdf->blklvl]['tag'] = $tag; - // mPDF 6 - return; - } - if ($tag === 'CAPTION') { - // position is written in AdjstHTML - $divpos = 'T'; - if (isset($attr['POSITION']) && \strtolower($attr['POSITION']) === 'bottom') { - $divpos = 'B'; - } - $cappos = 'T'; - if (isset($attr['ALIGN']) && \strtolower($attr['ALIGN']) === 'bottom') { - $cappos = 'B'; - } elseif (isset($p['CAPTION-SIDE']) && \strtolower($p['CAPTION-SIDE']) === 'bottom') { - $cappos = 'B'; - } - if (isset($attr['ALIGN'])) { - unset($attr['ALIGN']); - } - if ($cappos != $divpos) { - $this->mpdf->blklvl++; - $this->mpdf->blk[$this->mpdf->blklvl]['hide'] = \true; - $this->mpdf->blk[$this->mpdf->blklvl]['tag'] = $tag; - // mPDF 6 - return; - } - } - /* -- FORMS -- */ - if ($tag === 'FORM') { - $this->form->formMethod = 'POST'; - if (isset($attr['METHOD']) && \strtolower($attr['METHOD']) === 'get') { - $this->form->formMethod = 'GET'; - } - $this->form->formAction = ''; - if (isset($attr['ACTION'])) { - $this->form->formAction = $attr['ACTION']; - } - } - /* -- END FORMS -- */ - /* -- CSS-POSITION -- */ - if (isset($p['POSITION']) && (\strtolower($p['POSITION']) === 'fixed' || \strtolower($p['POSITION']) === 'absolute') && $this->mpdf->blklvl == 0) { - if ($this->mpdf->inFixedPosBlock) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Cannot nest block with position:fixed or position:absolute'); - } - $this->mpdf->inFixedPosBlock = \true; - return; - } - /* -- END CSS-POSITION -- */ - // Start Block - $this->mpdf->ignorefollowingspaces = \true; - $lastbottommargin = 0; - if ($this->mpdf->blockjustfinished && !\count($this->mpdf->textbuffer) && $this->mpdf->y != $this->mpdf->tMargin && $this->mpdf->collapseBlockMargins) { - $lastbottommargin = $this->mpdf->lastblockbottommargin; - } - $this->mpdf->lastblockbottommargin = 0; - $this->mpdf->blockjustfinished = \false; - $this->mpdf->InlineBDF = []; - // mPDF 6 - $this->mpdf->InlineBDFctr = 0; - // mPDF 6 - $this->mpdf->InlineProperties = []; - $this->mpdf->divbegin = \true; - $this->mpdf->linebreakjustfinished = \false; - /* -- TABLES -- */ - if ($this->mpdf->tableLevel) { - // If already something on the line - if ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] > 0 && !$this->mpdf->nestedtablejustfinished) { - $this->mpdf->_saveCellTextBuffer("\n"); - if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; - // reset - } - // Cannot set block properties inside table - use Bold to indicate h1-h6 - if ($tag === 'CENTER' && $this->mpdf->tdbegin) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['a'] = $this->getAlign('center'); - } - $this->mpdf->InlineProperties['BLOCKINTABLE'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('', $tag, $attr); - if (!empty($properties)) { - $this->mpdf->setCSS($properties, 'INLINE'); - } - // mPDF 6 Lists - if ($tag === 'UL' || $tag === 'OL') { - $this->mpdf->listlvl++; - if (isset($attr['START'])) { - $this->mpdf->listcounter[$this->mpdf->listlvl] = (int) $attr['START'] - 1; - } else { - $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; - } - $this->mpdf->listitem = []; - if ($tag === 'OL') { - $this->mpdf->listtype[$this->mpdf->listlvl] = 'decimal'; - } elseif ($tag === 'UL') { - if ($this->mpdf->listlvl % 3 == 1) { - $this->mpdf->listtype[$this->mpdf->listlvl] = 'disc'; - } elseif ($this->mpdf->listlvl % 3 == 2) { - $this->mpdf->listtype[$this->mpdf->listlvl] = 'circle'; - } else { - $this->mpdf->listtype[$this->mpdf->listlvl] = 'square'; - } - } - } - // mPDF 6 Lists - in Tables - if ($tag === 'LI') { - if ($this->mpdf->listlvl == 0) { - //in case of malformed HTML code. Example:(...)</p><li>Content</li><p>Paragraph1</p>(...) - $this->mpdf->listlvl++; - // first depth level - $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; - } - $this->mpdf->listcounter[$this->mpdf->listlvl]++; - $this->mpdf->listitem = []; - //if in table - output here as a tabletextbuffer - //position:inside OR position:outside (always output in table as position:inside) - $decToAlpha = new DecToAlpha(); - $decToRoman = new DecToRoman(); - switch ($this->mpdf->listtype[$this->mpdf->listlvl]) { - case 'upper-alpha': - case 'upper-latin': - case 'A': - $blt = $decToAlpha->convert($this->mpdf->listcounter[$this->mpdf->listlvl]) . $this->mpdf->list_number_suffix; - break; - case 'lower-alpha': - case 'lower-latin': - case 'a': - $blt = $decToAlpha->convert($this->mpdf->listcounter[$this->mpdf->listlvl], \false) . $this->mpdf->list_number_suffix; - break; - case 'upper-roman': - case 'I': - $blt = $decToRoman->convert($this->mpdf->listcounter[$this->mpdf->listlvl]) . $this->mpdf->list_number_suffix; - break; - case 'lower-roman': - case 'i': - $blt = $decToRoman->convert($this->mpdf->listcounter[$this->mpdf->listlvl]) . $this->mpdf->list_number_suffix; - break; - case 'decimal': - case '1': - $blt = $this->mpdf->listcounter[$this->mpdf->listlvl] . $this->mpdf->list_number_suffix; - break; - default: - $blt = '-'; - if ($this->mpdf->listlvl % 3 == 1 && $this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 8226)) { - $blt = "•"; - } elseif ($this->mpdf->listlvl % 3 == 2 && $this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 9900)) { - $blt = "⚬"; - } elseif ($this->mpdf->listlvl % 3 == 0 && $this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 9642)) { - $blt = "▪"; - } - // ▪ - break; - } - // change to   spaces - if ($this->mpdf->usingCoreFont) { - $ls = \str_repeat(\chr(160) . \chr(160), ($this->mpdf->listlvl - 1) * 2) . $blt . ' '; - } else { - $ls = \str_repeat("  ", ($this->mpdf->listlvl - 1) * 2) . $blt . ' '; - } - $this->mpdf->_saveCellTextBuffer($ls); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $this->mpdf->GetStringWidth($ls); - } - return; - } - /* -- END TABLES -- */ - if ($this->mpdf->lastblocklevelchange == 1) { - $blockstate = 1; - } elseif ($this->mpdf->lastblocklevelchange < 1) { - $blockstate = 0; - } - // NO margins/padding - $this->mpdf->printbuffer($this->mpdf->textbuffer, $blockstate); - $this->mpdf->textbuffer = []; - $save_blklvl = $this->mpdf->blklvl; - $save_blk = $this->mpdf->blk; - $this->mpdf->Reset(); - $pagesel = ''; - /* -- CSS-PAGE -- */ - if (isset($p['PAGE'])) { - $pagesel = $p['PAGE']; - } - // mPDF 6 (uses $p - preview of properties so blklvl can be incremented after page-break) - /* -- END CSS-PAGE -- */ - // If page-box has changed AND/OR PAGE-BREAK-BEFORE - // mPDF 6 (uses $p - preview of properties so blklvl can be imcremented after page-break) - if (!$this->mpdf->tableLevel && ($pagesel && (!$this->mpdf->page_box['current'] || $pagesel != $this->mpdf->page_box['current']) || isset($p['PAGE-BREAK-BEFORE']) && $p['PAGE-BREAK-BEFORE'])) { - // mPDF 6 pagebreaktype - $startpage = $this->mpdf->page; - $pagebreaktype = $this->mpdf->defaultPagebreakType; - $this->mpdf->lastblocklevelchange = -1; - if ($this->mpdf->ColActive) { - $pagebreaktype = 'cloneall'; - } - if ($pagesel && (!$this->mpdf->page_box['current'] || $pagesel != $this->mpdf->page_box['current'])) { - $pagebreaktype = 'cloneall'; - } - $this->mpdf->_preForcedPagebreak($pagebreaktype); - if (isset($p['PAGE-BREAK-BEFORE'])) { - if (\strtoupper($p['PAGE-BREAK-BEFORE']) === 'RIGHT') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-ODD', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); - } elseif (\strtoupper($p['PAGE-BREAK-BEFORE']) === 'LEFT') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-EVEN', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); - } elseif (\strtoupper($p['PAGE-BREAK-BEFORE']) === 'ALWAYS') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); - } elseif ($this->mpdf->page_box['current'] != $pagesel) { - $this->mpdf->AddPage($this->mpdf->CurOrientation, '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); - } - // *CSS-PAGE* - } elseif (!$this->mpdf->page_box['current'] || $pagesel != $this->mpdf->page_box['current']) { - $this->mpdf->AddPage($this->mpdf->CurOrientation, '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); - } - /* -- END CSS-PAGE -- */ - // mPDF 6 pagebreaktype - $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); - } - // mPDF 6 pagebreaktype - moved after pagebreak - $this->mpdf->blklvl++; - $currblk =& $this->mpdf->blk[$this->mpdf->blklvl]; - $this->mpdf->initialiseBlock($currblk); - $prevblk =& $this->mpdf->blk[$this->mpdf->blklvl - 1]; - $currblk['tag'] = $tag; - $currblk['attr'] = $attr; - $properties = $this->cssManager->MergeCSS('BLOCK', $tag, $attr); - // mPDF 6 - moved to after page-break-before - // mPDF 6 page-break-inside:avoid - if (isset($properties['PAGE-BREAK-INSIDE']) && \strtoupper($properties['PAGE-BREAK-INSIDE']) === 'AVOID' && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together && !isset($attr['PAGEBREAKAVOIDCHECKED'])) { - // avoid re-iterating using PAGEBREAKAVOIDCHECKED; set in CloseTag - $currblk['keep_block_together'] = 1; - $currblk['array_i'] = $ihtml; - // mPDF 6 - $this->mpdf->kt_y00 = $this->mpdf->y; - $this->mpdf->kt_p00 = $this->mpdf->page; - $this->mpdf->keep_block_together = 1; - } - if ($lastbottommargin && !empty($properties['MARGIN-TOP']) && empty($properties['FLOAT'])) { - $currblk['lastbottommargin'] = $lastbottommargin; - } - if (isset($properties['Z-INDEX']) && $this->mpdf->current_layer == 0) { - $v = (int) $properties['Z-INDEX']; - if ($v > 0) { - $currblk['z-index'] = $v; - $this->mpdf->BeginLayer($v); - } - } - // mPDF 6 Lists - // List-type set by attribute - if ($tag === 'OL' || $tag === 'UL' || $tag === 'LI') { - if (!empty($attr['TYPE'])) { - $listtype = $attr['TYPE']; - switch ($listtype) { - case 'A': - $listtype = 'upper-latin'; - break; - case 'a': - $listtype = 'lower-latin'; - break; - case 'I': - $listtype = 'upper-roman'; - break; - case 'i': - $listtype = 'lower-roman'; - break; - case '1': - $listtype = 'decimal'; - break; - } - $currblk['list_style_type'] = $listtype; - } - } - $this->mpdf->setCSS($properties, 'BLOCK', $tag); - //name(id/class/style) found in the CSS array! - $currblk['InlineProperties'] = $this->mpdf->saveInlineProperties(); - if (isset($properties['VISIBILITY'])) { - $v = \strtolower($properties['VISIBILITY']); - if (($v === 'hidden' || $v === 'printonly' || $v === 'screenonly') && $this->mpdf->visibility === 'visible' && !$this->mpdf->tableLevel) { - $currblk['visibility'] = $v; - $this->mpdf->SetVisibility($v); - } - } - // mPDF 6 - if (!empty($attr['ALIGN'])) { - $currblk['block-align'] = $this->getAlign($attr['ALIGN']); - } - if (isset($properties['HEIGHT'])) { - $currblk['css_set_height'] = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->h - $this->mpdf->tMargin - $this->mpdf->bMargin, $this->mpdf->FontSize, \false); - if ($currblk['css_set_height'] + $this->mpdf->y > $this->mpdf->PageBreakTrigger && $this->mpdf->y > $this->mpdf->tMargin + 5 && $currblk['css_set_height'] < $this->mpdf->h - ($this->mpdf->tMargin + $this->mpdf->bMargin)) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } - } else { - $currblk['css_set_height'] = \false; - } - // Added mPDF 3.0 Float DIV - if (isset($prevblk['blockContext'])) { - $currblk['blockContext'] = $prevblk['blockContext']; - } - // *CSS-FLOAT* - if (isset($properties['CLEAR'])) { - $this->mpdf->ClearFloats(\strtoupper($properties['CLEAR']), $this->mpdf->blklvl - 1); - } - // *CSS-FLOAT* - $currblk['padding_left'] = \is_numeric($currblk['padding_left']) ? $currblk['padding_left'] : 0; - $currblk['padding_right'] = \is_numeric($currblk['padding_right']) ? $currblk['padding_right'] : 0; - $container_w = $prevblk['inner_width']; - $bdr = $currblk['border_right']['w']; - $bdl = $currblk['border_left']['w']; - $pdr = $currblk['padding_right']; - $pdl = $currblk['padding_left']; - $setwidth = 0; - if (isset($currblk['css_set_width'])) { - $setwidth = $currblk['css_set_width']; - } - /* -- CSS-FLOAT -- */ - if (isset($properties['FLOAT']) && \strtoupper($properties['FLOAT']) === 'RIGHT' && !$this->mpdf->ColActive) { - // Cancel Keep-Block-together - $currblk['keep_block_together'] = \false; - $this->mpdf->kt_y00 = 0; - $this->mpdf->keep_block_together = 0; - $this->mpdf->blockContext++; - $currblk['blockContext'] = $this->mpdf->blockContext; - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); - // DIV is too narrow for text to fit! - $maxw = $container_w - $l_width - $r_width; - $doubleCharWidth = 2 * $this->mpdf->GetCharWidth('W', \false); - if ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr > $maxw || $maxw - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) < 2 * $this->mpdf->GetCharWidth('W', \false)) { - // Too narrow to fit - try to move down past L or R float - if ($l_max < $r_max && $setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr <= $container_w - $r_width && $container_w - $r_width - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $doubleCharWidth) { - $this->mpdf->ClearFloats('LEFT', $this->mpdf->blklvl - 1); - } elseif ($r_max < $l_max && $setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr <= $container_w - $l_width && $container_w - $l_width - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $doubleCharWidth) { - $this->mpdf->ClearFloats('RIGHT', $this->mpdf->blklvl - 1); - } else { - $this->mpdf->ClearFloats('BOTH', $this->mpdf->blklvl - 1); - } - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); - } - if ($r_exists) { - $currblk['margin_right'] += $r_width; - } - $currblk['float'] = 'R'; - $currblk['float_start_y'] = $this->mpdf->y; - if (isset($currblk['css_set_width'])) { - $currblk['margin_left'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); - $currblk['float_width'] = $setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']; - } else { - // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width - // and do borders and backgrounds - For now - just set to maximum width left - if ($l_exists) { - $currblk['margin_left'] += $l_width; - } - $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); - $currblk['float_width'] = $currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']; - } - } elseif (isset($properties['FLOAT']) && \strtoupper($properties['FLOAT']) === 'LEFT' && !$this->mpdf->ColActive) { - // Cancel Keep-Block-together - $currblk['keep_block_together'] = \false; - $this->mpdf->kt_y00 = 0; - $this->mpdf->keep_block_together = 0; - $this->mpdf->blockContext++; - $currblk['blockContext'] = $this->mpdf->blockContext; - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); - // DIV is too narrow for text to fit! - $maxw = $container_w - $l_width - $r_width; - $doubleCharWidth = 2 * $this->mpdf->GetCharWidth('W', \false); - if ($setwidth + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr > $maxw || $maxw - ($currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) < 2 * $this->mpdf->GetCharWidth('W', \false)) { - // Too narrow to fit - try to move down past L or R float - if ($l_max < $r_max && $setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr <= $container_w - $r_width && $container_w - $r_width - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $doubleCharWidth) { - $this->mpdf->ClearFloats('LEFT', $this->mpdf->blklvl - 1); - } elseif ($r_max < $l_max && $setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr <= $container_w - $l_width && $container_w - $l_width - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $doubleCharWidth) { - $this->mpdf->ClearFloats('RIGHT', $this->mpdf->blklvl - 1); - } else { - $this->mpdf->ClearFloats('BOTH', $this->mpdf->blklvl - 1); - } - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); - } - if ($l_exists) { - $currblk['margin_left'] += $l_width; - } - $currblk['float'] = 'L'; - $currblk['float_start_y'] = $this->mpdf->y; - if ($setwidth) { - $currblk['margin_right'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); - $currblk['float_width'] = $setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']; - } else { - // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width - // and do borders and backgrounds - For now - just set to maximum width left - if ($r_exists) { - $currblk['margin_right'] += $r_width; - } - $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); - $currblk['float_width'] = $currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']; - } - } else { - // Don't allow overlap - if floats present - adjust padding to avoid overlap with Floats - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); - $maxw = $container_w - $l_width - $r_width; - $pdl = \is_numeric($pdl) ? $pdl : 0; - $pdr = \is_numeric($pdr) ? $pdr : 0; - $doubleCharWidth = 2 * $this->mpdf->GetCharWidth('W', \false); - if ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr > $maxw || $maxw - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) < $doubleCharWidth) { - // Too narrow to fit - try to move down past L or R float - if ($l_max < $r_max && $setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr <= $container_w - $r_width && $container_w - $r_width - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) > $doubleCharWidth) { - $this->mpdf->ClearFloats('LEFT', $this->mpdf->blklvl - 1); - } elseif ($r_max < $l_max && $setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr <= $container_w - $l_width && $container_w - $l_width - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) > $doubleCharWidth) { - $this->mpdf->ClearFloats('RIGHT', $this->mpdf->blklvl - 1); - } else { - $this->mpdf->ClearFloats('BOTH', $this->mpdf->blklvl - 1); - } - list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); - } - if ($r_exists) { - $currblk['padding_right'] = \max($r_width - $currblk['margin_right'] - $bdr, $pdr); - } - if ($l_exists) { - $currblk['padding_left'] = \max($l_width - $currblk['margin_left'] - $bdl, $pdl); - } - } - /* -- END CSS-FLOAT -- */ - /* -- BORDER-RADIUS -- */ - // Automatically increase padding if required for border-radius - if ($this->mpdf->autoPadding && !$this->mpdf->ColActive) { - $currblk['border_radius_TL_H'] = Arrays::get($currblk, 'border_radius_TL_H', 0); - $currblk['border_radius_TL_V'] = Arrays::get($currblk, 'border_radius_TL_V', 0); - $currblk['border_radius_TR_H'] = Arrays::get($currblk, 'border_radius_TR_H', 0); - $currblk['border_radius_TR_V'] = Arrays::get($currblk, 'border_radius_TR_V', 0); - $currblk['border_radius_BL_H'] = Arrays::get($currblk, 'border_radius_BL_H', 0); - $currblk['border_radius_BL_V'] = Arrays::get($currblk, 'border_radius_BL_V', 0); - $currblk['border_radius_BR_H'] = Arrays::get($currblk, 'border_radius_BR_H', 0); - $currblk['border_radius_BR_V'] = Arrays::get($currblk, 'border_radius_BR_V', 0); - if ($currblk['border_radius_TL_H'] > $currblk['padding_left'] && $currblk['border_radius_TL_V'] > $currblk['padding_top']) { - if ($currblk['border_radius_TL_H'] > $currblk['border_radius_TL_V']) { - $this->mpdf->_borderPadding($currblk['border_radius_TL_H'], $currblk['border_radius_TL_V'], $currblk['padding_left'], $currblk['padding_top']); - } else { - $this->mpdf->_borderPadding($currblk['border_radius_TL_V'], $currblk['border_radius_TL_H'], $currblk['padding_top'], $currblk['padding_left']); - } - } - if ($currblk['border_radius_TR_H'] > $currblk['padding_right'] && $currblk['border_radius_TR_V'] > $currblk['padding_top']) { - if ($currblk['border_radius_TR_H'] > $currblk['border_radius_TR_V']) { - $this->mpdf->_borderPadding($currblk['border_radius_TR_H'], $currblk['border_radius_TR_V'], $currblk['padding_right'], $currblk['padding_top']); - } else { - $this->mpdf->_borderPadding($currblk['border_radius_TR_V'], $currblk['border_radius_TR_H'], $currblk['padding_top'], $currblk['padding_right']); - } - } - if ($currblk['border_radius_BL_H'] > $currblk['padding_left'] && $currblk['border_radius_BL_V'] > $currblk['padding_bottom']) { - if ($currblk['border_radius_BL_H'] > $currblk['border_radius_BL_V']) { - $this->mpdf->_borderPadding($currblk['border_radius_BL_H'], $currblk['border_radius_BL_V'], $currblk['padding_left'], $currblk['padding_bottom']); - } else { - $this->mpdf->_borderPadding($currblk['border_radius_BL_V'], $currblk['border_radius_BL_H'], $currblk['padding_bottom'], $currblk['padding_left']); - } - } - if ($currblk['border_radius_BR_H'] > $currblk['padding_right'] && $currblk['border_radius_BR_V'] > $currblk['padding_bottom']) { - if ($currblk['border_radius_BR_H'] > $currblk['border_radius_BR_V']) { - $this->mpdf->_borderPadding($currblk['border_radius_BR_H'], $currblk['border_radius_BR_V'], $currblk['padding_right'], $currblk['padding_bottom']); - } else { - $this->mpdf->_borderPadding($currblk['border_radius_BR_V'], $currblk['border_radius_BR_H'], $currblk['padding_bottom'], $currblk['padding_right']); - } - } - } - /* -- END BORDER-RADIUS -- */ - // Hanging indent - if negative indent: ensure padding is >= indent - if (!isset($currblk['text_indent'])) { - $currblk['text_indent'] = null; - } - if (!isset($currblk['inner_width'])) { - $currblk['inner_width'] = null; - } - $cbti = $this->sizeConverter->convert($currblk['text_indent'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - if ($cbti < 0) { - $hangind = -$cbti; - if (isset($currblk['direction']) && $currblk['direction'] === 'rtl') { - // *OTL* - $currblk['padding_right'] = \max($currblk['padding_right'], $hangind); - // *OTL* - } else { - // *OTL* - $currblk['padding_left'] = \max($currblk['padding_left'], $hangind); - } - // *OTL* - } - if (isset($currblk['css_set_width'])) { - if (isset($properties['MARGIN-LEFT'], $properties['MARGIN-RIGHT']) && \strtolower($properties['MARGIN-LEFT']) === 'auto' && \strtolower($properties['MARGIN-RIGHT']) === 'auto') { - // Try to reduce margins to accomodate - if still too wide, set margin-right/left=0 (reduces width) - $anyextra = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); - if ($anyextra > 0) { - $currblk['margin_left'] = $currblk['margin_right'] = $anyextra / 2; - } else { - $currblk['margin_left'] = $currblk['margin_right'] = 0; - } - } elseif (isset($properties['MARGIN-LEFT']) && \strtolower($properties['MARGIN-LEFT']) === 'auto') { - // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) - $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); - if ($currblk['margin_left'] < 0) { - $currblk['margin_left'] = 0; - } - } elseif (isset($properties['MARGIN-RIGHT']) && \strtolower($properties['MARGIN-RIGHT']) === 'auto') { - // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) - $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); - if ($currblk['margin_right'] < 0) { - $currblk['margin_right'] = 0; - } - } else { - if ($currblk['direction'] === 'rtl') { - // *OTL* - // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) - $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); - // *OTL* - if ($currblk['margin_left'] < 0) { - // *OTL* - $currblk['margin_left'] = 0; - // *OTL* - } - // *OTL* - } else { - // *OTL* - // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) - $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); - if ($currblk['margin_right'] < 0) { - $currblk['margin_right'] = 0; - } - } - // *OTL* - } - } - $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; - $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; - $currblk['width'] = $this->mpdf->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); - $currblk['inner_width'] = $currblk['width'] - ($currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); - // Check DIV is not now too narrow to fit text - $mw = 2 * $this->mpdf->GetCharWidth('W', \false); - if ($currblk['inner_width'] < $mw) { - $currblk['padding_left'] = 0; - $currblk['padding_right'] = 0; - $currblk['border_left']['w'] = 0.2; - $currblk['border_right']['w'] = 0.2; - $currblk['margin_left'] = 0; - $currblk['margin_right'] = 0; - $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; - $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; - $currblk['width'] = $this->mpdf->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); - $currblk['inner_width'] = $this->mpdf->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); - // if ($currblk['inner_width'] < $mw) { throw new \Mpdf\MpdfException("DIV is too narrow for text to fit!"); } - } - $this->mpdf->x = $this->mpdf->lMargin + $currblk['outer_left_margin']; - /* -- BACKGROUNDS -- */ - if (!empty($properties['BACKGROUND-IMAGE']) && !$this->mpdf->kwt && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together) { - $ret = $this->mpdf->SetBackground($properties, $currblk['inner_width']); - if ($ret) { - $currblk['background-image'] = $ret; - } - } - /* -- END BACKGROUNDS -- */ - /* -- TABLES -- */ - if ($this->mpdf->use_kwt && isset($attr['KEEP-WITH-TABLE']) && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together) { - $this->mpdf->kwt = \true; - $this->mpdf->kwt_y0 = $this->mpdf->y; - //$this->mpdf->kwt_x0 = $this->mpdf->x; - $this->mpdf->kwt_x0 = $this->mpdf->lMargin; - // mPDF 6 - $this->mpdf->kwt_height = 0; - $this->mpdf->kwt_buffer = []; - $this->mpdf->kwt_Links = []; - $this->mpdf->kwt_Annots = []; - $this->mpdf->kwt_moved = \false; - $this->mpdf->kwt_saved = \false; - $this->mpdf->kwt_Reference = []; - $this->mpdf->kwt_BMoutlines = []; - $this->mpdf->kwt_toc = []; - } else { - /* -- END TABLES -- */ - $this->mpdf->kwt = \false; - } - // *TABLES* - // Save x,y coords in case we need to print borders... - $currblk['y0'] = $this->mpdf->y; - $currblk['initial_y0'] = $this->mpdf->y; - // mPDF 6 - $currblk['x0'] = $this->mpdf->x; - $currblk['initial_x0'] = $this->mpdf->x; - // mPDF 6 - $currblk['initial_startpage'] = $this->mpdf->page; - $currblk['startpage'] = $this->mpdf->page; - // mPDF 6 - $this->mpdf->oldy = $this->mpdf->y; - $this->mpdf->lastblocklevelchange = 1; - // mPDF 6 Lists - if ($tag === 'OL' || $tag === 'UL') { - $this->mpdf->listlvl++; - if (!empty($attr['START'])) { - $this->mpdf->listcounter[$this->mpdf->listlvl] = (int) $attr['START'] - 1; - } else { - $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; - } - $this->mpdf->listitem = []; - // List-type - if (empty($currblk['list_style_type'])) { - if ($tag === 'OL') { - $currblk['list_style_type'] = 'decimal'; - } elseif ($tag === 'UL') { - if ($this->mpdf->listlvl % 3 == 1) { - $currblk['list_style_type'] = 'disc'; - } elseif ($this->mpdf->listlvl % 3 == 2) { - $currblk['list_style_type'] = 'circle'; - } else { - $currblk['list_style_type'] = 'square'; - } - } - } - // List-image - if (empty($currblk['list_style_image'])) { - $currblk['list_style_image'] = 'none'; - } - // List-position - if (empty($currblk['list_style_position'])) { - $currblk['list_style_position'] = 'outside'; - } - // Default indentation using padding - if (\strtolower($this->mpdf->list_auto_mode) === 'mpdf' && isset($currblk['list_style_position']) && $currblk['list_style_position'] === 'outside' && isset($currblk['list_style_image']) && $currblk['list_style_image'] === 'none' && (!isset($currblk['list_style_type']) || !\preg_match('/U\\+([a-fA-F0-9]+)/i', $currblk['list_style_type']))) { - $autopadding = $this->mpdf->_getListMarkerWidth($currblk, $ahtml, $ihtml); - if ($this->mpdf->listlvl > 1 || $this->mpdf->list_indent_first_level) { - $autopadding += $this->sizeConverter->convert($this->mpdf->list_indent_default, $currblk['inner_width'], $this->mpdf->FontSize, \false); - } - // autopadding value is applied to left or right according - // to dir of block. Once a CSS value is set for padding it overrides this default value. - if (isset($properties['PADDING-RIGHT']) && $properties['PADDING-RIGHT'] === 'auto' && isset($currblk['direction']) && $currblk['direction'] === 'rtl') { - $currblk['padding_right'] = $autopadding; - } elseif (isset($properties['PADDING-LEFT']) && $properties['PADDING-LEFT'] === 'auto') { - $currblk['padding_left'] = $autopadding; - } - } else { - // Initial default value is set by $this->mpdf->list_indent_default in config.php; this value is applied to left or right according - // to dir of block. Once a CSS value is set for padding it overrides this default value. - if (isset($properties['PADDING-RIGHT']) && $properties['PADDING-RIGHT'] === 'auto' && isset($currblk['direction']) && $currblk['direction'] === 'rtl') { - $currblk['padding_right'] = $this->sizeConverter->convert($this->mpdf->list_indent_default, $currblk['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($properties['PADDING-LEFT']) && $properties['PADDING-LEFT'] === 'auto') { - $currblk['padding_left'] = $this->sizeConverter->convert($this->mpdf->list_indent_default, $currblk['inner_width'], $this->mpdf->FontSize, \false); - } - } - } - // mPDF 6 Lists - if ($tag === 'LI') { - if ($this->mpdf->listlvl == 0) { - // in case of malformed HTML code. Example:(...)</p><li>Content</li><p>Paragraph1</p>(...) - $this->mpdf->listlvl++; - // first depth level - $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; - } - if (!isset($attr['PAGEBREAKAVOIDCHECKED']) || !$attr['PAGEBREAKAVOIDCHECKED']) { - $this->mpdf->listcounter[$this->mpdf->listlvl]++; - } - $this->mpdf->listitem = []; - // Listitem-type - $this->mpdf->_setListMarker($currblk['list_style_type'], $currblk['list_style_image'], $currblk['list_style_position']); - } - // mPDF 6 Bidirectional formatting for block elements - $bdf = \false; - $bdf2 = ''; - $popd = ''; - // Get current direction - $currdir = 'ltr'; - if (isset($currblk['direction'])) { - $currdir = $currblk['direction']; - } - if (isset($attr['DIR']) && $attr['DIR'] != '') { - $currdir = \strtolower($attr['DIR']); - } - if (isset($properties['DIRECTION'])) { - $currdir = \strtolower($properties['DIRECTION']); - } - // mPDF 6 bidi - // cf. http://www.w3.org/TR/css3-writing-modes/#unicode-bidi - if (isset($properties['UNICODE-BIDI']) && (\strtolower($properties['UNICODE-BIDI']) === 'bidi-override' || \strtolower($properties['UNICODE-BIDI']) === 'isolate-override')) { - if ($currdir === 'rtl') { - $bdf = 0x202e; - $popd = 'RLOPDF'; - } else { - $bdf = 0x202d; - $popd = 'LROPDF'; - } - // U+202D LRO - } elseif (isset($properties['UNICODE-BIDI']) && \strtolower($properties['UNICODE-BIDI']) === 'plaintext') { - $bdf = 0x2068; - $popd = 'FSIPDI'; - // U+2068 FSI - } - if ($bdf) { - if ($bdf2) { - $bdf2 = UtfString::code2utf($bdf); - } - $this->mpdf->OTLdata = []; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer(UtfString::code2utf($bdf) . $bdf2); - } else { - $this->mpdf->_saveTextBuffer(UtfString::code2utf($bdf) . $bdf2); - } - $this->mpdf->biDirectional = \true; - $currblk['bidicode'] = $popd; - } - } - public function close(&$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - // mPDF 6 bidi - // Block - // If unicode-bidi set, any embedding levels, isolates, or overrides started by this box are closed - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { - $blockpost = $this->mpdf->_setBidiCodes('end', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); - if ($blockpost) { - $this->mpdf->OTLdata = []; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($blockpost); - } else { - $this->mpdf->_saveTextBuffer($blockpost); - } - } - } - $this->mpdf->ignorefollowingspaces = \true; - //Eliminate exceeding left-side spaces - $this->mpdf->blockjustfinished = \true; - $this->mpdf->lastblockbottommargin = $this->mpdf->blk[$this->mpdf->blklvl]['margin_bottom']; - // mPDF 6 Lists - if ($tag === 'UL' || $tag === 'OL') { - if ($this->mpdf->listlvl > 0 && $this->mpdf->tableLevel) { - if (isset($this->mpdf->listtype[$this->mpdf->listlvl])) { - unset($this->mpdf->listtype[$this->mpdf->listlvl]); - } - } - $this->mpdf->listlvl--; - $this->mpdf->listitem = []; - } - if ($tag === 'LI') { - $this->mpdf->listitem = []; - } - if (\preg_match('/^H\\d/', $tag) && !$this->mpdf->tableLevel && !$this->mpdf->writingToC) { - if (isset($this->mpdf->h2toc[$tag]) || isset($this->mpdf->h2bookmarks[$tag])) { - $content = ''; - if (\count($this->mpdf->textbuffer) == 1) { - $content = $this->mpdf->textbuffer[0][0]; - } else { - for ($i = 0; $i < \count($this->mpdf->textbuffer); $i++) { - if (0 !== \strpos($this->mpdf->textbuffer[$i][0], Mpdf::OBJECT_IDENTIFIER)) { - //inline object - $content .= $this->mpdf->textbuffer[$i][0]; - } - } - } - /* -- TOC -- */ - if (isset($this->mpdf->h2toc[$tag])) { - $objattr = []; - $objattr['type'] = 'toc'; - $objattr['toclevel'] = $this->mpdf->h2toc[$tag]; - $objattr['CONTENT'] = \htmlspecialchars($content); - $e = Mpdf::OBJECT_IDENTIFIER . "type=toc,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - \array_unshift($this->mpdf->textbuffer, [$e]); - } - /* -- END TOC -- */ - /* -- BOOKMARKS -- */ - if (isset($this->mpdf->h2bookmarks[$tag])) { - $objattr = []; - $objattr['type'] = 'bookmark'; - $objattr['bklevel'] = $this->mpdf->h2bookmarks[$tag]; - $objattr['CONTENT'] = $content; - $e = Mpdf::OBJECT_IDENTIFIER . "type=toc,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - \array_unshift($this->mpdf->textbuffer, [$e]); - } - /* -- END BOOKMARKS -- */ - } - } - /* -- TABLES -- */ - if ($this->mpdf->tableLevel) { - if ($this->mpdf->linebreakjustfinished) { - $this->mpdf->blockjustfinished = \false; - } - if (isset($this->mpdf->InlineProperties['BLOCKINTABLE'])) { - if ($this->mpdf->InlineProperties['BLOCKINTABLE']) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['BLOCKINTABLE']); - } - unset($this->mpdf->InlineProperties['BLOCKINTABLE']); - } - if ($tag === 'PRE') { - $this->mpdf->ispre = \false; - } - return; - } - /* -- END TABLES -- */ - $this->mpdf->lastoptionaltag = ''; - $this->mpdf->divbegin = \false; - $this->mpdf->linebreakjustfinished = \false; - $this->mpdf->x = $this->mpdf->lMargin + $this->mpdf->blk[$this->mpdf->blklvl]['outer_left_margin']; - /* -- CSS-FLOAT -- */ - // If float contained in a float, need to extend bottom to allow for it - $currpos = $this->mpdf->page * 1000 + $this->mpdf->y; - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['float_endpos']) && $this->mpdf->blk[$this->mpdf->blklvl]['float_endpos'] > $currpos) { - $old_page = $this->mpdf->page; - $new_page = (int) ($this->mpdf->blk[$this->mpdf->blklvl]['float_endpos'] / 1000); - if ($old_page != $new_page) { - $s = $this->mpdf->PrintPageBackgrounds(); - // Writes after the marker so not overwritten later by page background etc. - $this->mpdf->pages[$this->mpdf->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->mpdf->pages[$this->mpdf->page]); - $this->mpdf->pageBackgrounds = []; - $this->mpdf->page = $new_page; - $this->mpdf->ResetMargins(); - $this->mpdf->Reset(); - $this->mpdf->pageoutput[$this->mpdf->page] = []; - } - // mod changes operands to integers before processing - $this->mpdf->y = \round($this->mpdf->blk[$this->mpdf->blklvl]['float_endpos'] * 1000) % 1000000 / 1000; - } - /* -- END CSS-FLOAT -- */ - //Print content - $blockstate = 0; - if ($this->mpdf->lastblocklevelchange == 1) { - $blockstate = 3; - } elseif ($this->mpdf->lastblocklevelchange == -1) { - $blockstate = 2; - } - // Bottom margins/padding only - // called from after e.g. </table> </div> </div> ... Outputs block margin/border and padding - if (\count($this->mpdf->textbuffer) && $this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1]) { - if (0 !== \strpos($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0], Mpdf::OBJECT_IDENTIFIER)) { - // not special content - // Right trim last content and adjust OTLdata - if (\preg_match('/[ ]+$/', $this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0], $m)) { - $strip = \strlen($m[0]); - $this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0] = \substr($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0], 0, \strlen($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0]) - $strip); - /* -- OTL -- */ - if (!empty($this->mpdf->CurrentFont['useOTL'])) { - $this->otl->trimOTLdata($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][18], \false); - // mPDF 6 ZZZ99K - } - /* -- END OTL -- */ - } - } - } - if (\count($this->mpdf->textbuffer) == 0 && $this->mpdf->lastblocklevelchange != 0) { - /*$this->mpdf->newFlowingBlock( - $this->mpdf->blk[$this->mpdf->blklvl]['width'], - $this->mpdf->lineheight, - '', - false, - 2, - true, - (isset($this->mpdf->blk[$this->mpdf->blklvl]['direction']) ? $this->mpdf->blk[$this->mpdf->blklvl]['direction'] : 'ltr') - );*/ - $this->mpdf->newFlowingBlock($this->mpdf->blk[$this->mpdf->blklvl]['width'], $this->mpdf->lineheight, '', \false, $blockstate, \true, isset($this->mpdf->blk[$this->mpdf->blklvl]['direction']) ? $this->mpdf->blk[$this->mpdf->blklvl]['direction'] : 'ltr'); - $this->mpdf->finishFlowingBlock(\true); - // true = END of flowing block - $this->mpdf->PaintDivBB('', $blockstate); - } else { - $this->mpdf->printbuffer($this->mpdf->textbuffer, $blockstate); - } - $this->mpdf->textbuffer = []; - if ($this->mpdf->kwt) { - $this->mpdf->kwt_height = $this->mpdf->y - $this->mpdf->kwt_y0; - } - /* -- CSS-IMAGE-FLOAT -- */ - $this->mpdf->printfloatbuffer(); - /* -- END CSS-IMAGE-FLOAT -- */ - if ($tag === 'PRE') { - $this->mpdf->ispre = \false; - } - /* -- CSS-FLOAT -- */ - if ($this->mpdf->blk[$this->mpdf->blklvl]['float'] === 'R') { - // If width not set, here would need to adjust and output buffer - $s = $this->mpdf->PrintPageBackgrounds(); - // Writes after the marker so not overwritten later by page background etc. - $this->mpdf->pages[$this->mpdf->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->mpdf->pages[$this->mpdf->page]); - $this->mpdf->pageBackgrounds = []; - $this->mpdf->Reset(); - $this->mpdf->pageoutput[$this->mpdf->page] = []; - for ($i = $this->mpdf->blklvl - 1; $i >= 0; $i--) { - if (isset($this->mpdf->blk[$i]['float_endpos'])) { - $this->mpdf->blk[$i]['float_endpos'] = \max($this->mpdf->blk[$i]['float_endpos'], $this->mpdf->page * 1000 + $this->mpdf->y); - } else { - $this->mpdf->blk[$i]['float_endpos'] = $this->mpdf->page * 1000 + $this->mpdf->y; - } - } - $this->mpdf->floatDivs[] = ['side' => 'R', 'startpage' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'], 'y0' => $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'startpos' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'] * 1000 + $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'endpage' => $this->mpdf->page, 'y1' => $this->mpdf->y, 'endpos' => $this->mpdf->page * 1000 + $this->mpdf->y, 'w' => $this->mpdf->blk[$this->mpdf->blklvl]['float_width'], 'blklvl' => $this->mpdf->blklvl, 'blockContext' => $this->mpdf->blk[$this->mpdf->blklvl - 1]['blockContext']]; - $this->mpdf->y = $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y']; - $this->mpdf->page = $this->mpdf->blk[$this->mpdf->blklvl]['startpage']; - $this->mpdf->ResetMargins(); - $this->mpdf->pageoutput[$this->mpdf->page] = []; - } - if ($this->mpdf->blk[$this->mpdf->blklvl]['float'] === 'L') { - // If width not set, here would need to adjust and output buffer - $s = $this->mpdf->PrintPageBackgrounds(); - // Writes after the marker so not overwritten later by page background etc. - $this->mpdf->pages[$this->mpdf->page] = \preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->mpdf->pages[$this->mpdf->page]); - $this->mpdf->pageBackgrounds = []; - $this->mpdf->Reset(); - $this->mpdf->pageoutput[$this->mpdf->page] = []; - for ($i = $this->mpdf->blklvl - 1; $i >= 0; $i--) { - if (isset($this->mpdf->blk[$i]['float_endpos'])) { - $this->mpdf->blk[$i]['float_endpos'] = \max($this->mpdf->blk[$i]['float_endpos'], $this->mpdf->page * 1000 + $this->mpdf->y); - } else { - $this->mpdf->blk[$i]['float_endpos'] = $this->mpdf->page * 1000 + $this->mpdf->y; - } - } - $this->mpdf->floatDivs[] = ['side' => 'L', 'startpage' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'], 'y0' => $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'startpos' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'] * 1000 + $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'endpage' => $this->mpdf->page, 'y1' => $this->mpdf->y, 'endpos' => $this->mpdf->page * 1000 + $this->mpdf->y, 'w' => $this->mpdf->blk[$this->mpdf->blklvl]['float_width'], 'blklvl' => $this->mpdf->blklvl, 'blockContext' => $this->mpdf->blk[$this->mpdf->blklvl - 1]['blockContext']]; - $this->mpdf->y = $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y']; - $this->mpdf->page = $this->mpdf->blk[$this->mpdf->blklvl]['startpage']; - $this->mpdf->ResetMargins(); - $this->mpdf->pageoutput[$this->mpdf->page] = []; - } - /* -- END CSS-FLOAT -- */ - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['visibility']) && $this->mpdf->blk[$this->mpdf->blklvl]['visibility'] !== 'visible') { - $this->mpdf->SetVisibility('visible'); - } - $page_break_after = ''; - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['page_break_after'])) { - $page_break_after = $this->mpdf->blk[$this->mpdf->blklvl]['page_break_after']; - } - // Reset values - $this->mpdf->Reset(); - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['z-index']) && $this->mpdf->blk[$this->mpdf->blklvl]['z-index'] > 0) { - $this->mpdf->EndLayer(); - } - // mPDF 6 page-break-inside:avoid - if ($this->mpdf->blk[$this->mpdf->blklvl]['keep_block_together']) { - $movepage = \false; - // If page-break-inside:avoid section has broken to new page but fits on one side - then move: - if ($this->mpdf->page - $this->mpdf->kt_p00 == 1 && $this->mpdf->y < $this->mpdf->kt_y00) { - $movepage = \true; - } - if ($this->mpdf->page - $this->mpdf->kt_p00 > 0) { - for ($i = $this->mpdf->page; $i > $this->mpdf->kt_p00; $i--) { - unset($this->mpdf->pages[$i]); - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bb_painted'][$i])) { - unset($this->mpdf->blk[$this->mpdf->blklvl]['bb_painted'][$i]); - } - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['marginCorrected'][$i])) { - unset($this->mpdf->blk[$this->mpdf->blklvl]['marginCorrected'][$i]); - } - if (isset($this->mpdf->pageoutput[$i])) { - unset($this->mpdf->pageoutput[$i]); - } - } - $this->mpdf->page = $this->mpdf->kt_p00; - } - $this->mpdf->keep_block_together = 0; - $this->mpdf->pageoutput[$this->mpdf->page] = []; - $this->mpdf->y = $this->mpdf->kt_y00; - $ihtml = $this->mpdf->blk[$this->mpdf->blklvl]['array_i'] - 1; - $ahtml[$ihtml + 1] .= ' pagebreakavoidchecked="true";'; - // avoid re-iterating; read in OpenTag() - unset($this->mpdf->blk[$this->mpdf->blklvl]); - $this->mpdf->blklvl--; - for ($blklvl = 1; $blklvl <= $this->mpdf->blklvl; $blklvl++) { - $this->mpdf->blk[$blklvl]['y0'] = $this->mpdf->blk[$blklvl]['initial_y0']; - $this->mpdf->blk[$blklvl]['x0'] = $this->mpdf->blk[$blklvl]['initial_x0']; - $this->mpdf->blk[$blklvl]['startpage'] = $this->mpdf->blk[$blklvl]['initial_startpage']; - } - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['x0'])) { - $this->mpdf->x = $this->mpdf->blk[$this->mpdf->blklvl]['x0']; - } else { - $this->mpdf->x = $this->mpdf->lMargin; - } - $this->mpdf->lastblocklevelchange = 0; - $this->mpdf->ResetMargins(); - if ($movepage) { - $this->mpdf->AddPage(); - } - return; - } - if ($this->mpdf->blklvl > 0) { - // ==0 SHOULDN'T HAPPEN - NOT XHTML - if ($this->mpdf->blk[$this->mpdf->blklvl]['tag'] == $tag) { - unset($this->mpdf->blk[$this->mpdf->blklvl]); - $this->mpdf->blklvl--; - } - //else { echo $tag; exit; } // debug - forces error if incorrectly nested html tags - } - $this->mpdf->lastblocklevelchange = -1; - // Reset Inline-type properties - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties'])) { - $this->mpdf->restoreInlineProperties($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties']); - } - $this->mpdf->x = $this->mpdf->lMargin + $this->mpdf->blk[$this->mpdf->blklvl]['outer_left_margin']; - if (!$this->mpdf->tableLevel && $page_break_after) { - $save_blklvl = $this->mpdf->blklvl; - $save_blk = $this->mpdf->blk; - $save_silp = $this->mpdf->saveInlineProperties(); - $save_ilp = $this->mpdf->InlineProperties; - $save_bflp = $this->mpdf->InlineBDF; - $save_bflpc = $this->mpdf->InlineBDFctr; - // mPDF 6 - // mPDF 6 pagebreaktype - $startpage = $this->mpdf->page; - $pagebreaktype = $this->mpdf->defaultPagebreakType; - if ($this->mpdf->ColActive) { - $pagebreaktype = 'cloneall'; - } - // mPDF 6 pagebreaktype - $this->mpdf->_preForcedPagebreak($pagebreaktype); - if ($page_break_after === 'RIGHT') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-ODD'); - } elseif ($page_break_after === 'LEFT') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-EVEN'); - } else { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } - // mPDF 6 pagebreaktype - $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); - $this->mpdf->InlineProperties = $save_ilp; - $this->mpdf->InlineBDF = $save_bflp; - $this->mpdf->InlineBDFctr = $save_bflpc; - // mPDF 6 - $this->mpdf->restoreInlineProperties($save_silp); - } - // mPDF 6 bidi - // Block - // If unicode-bidi set, any embedding levels, isolates, or overrides reopened in the continuing block - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { - $blockpre = $this->mpdf->_setBidiCodes('start', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); - if ($blockpre) { - $this->mpdf->OTLdata = []; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($blockpre); - } else { - $this->mpdf->_saveTextBuffer($blockpre); - } - } - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Bookmark.php b/dependencies/mpdf/mpdf/src/Tag/Bookmark.php deleted file mode 100644 index 4687588..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Bookmark.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Bookmark extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - if (isset($attr['CONTENT'])) { - $objattr = []; - $objattr['CONTENT'] = \htmlspecialchars_decode($attr['CONTENT'], \ENT_QUOTES); - $objattr['type'] = 'bookmark'; - if (!empty($attr['LEVEL'])) { - $objattr['bklevel'] = $attr['LEVEL']; - } else { - $objattr['bklevel'] = 0; - } - $e = Mpdf::OBJECT_IDENTIFIER . "type=bookmark,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->mpdf->tableLevel) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$e]; - } else { - // *TABLES* - $this->mpdf->textbuffer[] = [$e]; - } - // *TABLES* - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Br.php b/dependencies/mpdf/mpdf/src/Tag/Br.php deleted file mode 100644 index 451818d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Br.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Br extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - // Added mPDF 3.0 Float DIV - CLEAR - if (isset($attr['STYLE'])) { - $properties = $this->cssManager->readInlineCSS($attr['STYLE']); - if (isset($properties['CLEAR'])) { - $this->mpdf->ClearFloats(\strtoupper($properties['CLEAR']), $this->mpdf->blklvl); - } - // *CSS-FLOAT* - } - // mPDF 6 bidi - // Inline - // If unicode-bidi set, any embedding levels, isolates, or overrides started by - // the inline box are closed at the br and reopened on the other side - $blockpre = ''; - $blockpost = ''; - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { - $blockpre = $this->mpdf->_setBidiCodes('end', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); - $blockpost = $this->mpdf->_setBidiCodes('start', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); - } - // Inline - // If unicode-bidi set, any embedding levels, isolates, or overrides started by - // the inline box are closed at the br and reopened on the other side - $inlinepre = ''; - $inlinepost = ''; - $iBDF = []; - if (\count($this->mpdf->InlineBDF)) { - foreach ($this->mpdf->InlineBDF as $k => $ib) { - foreach ($ib as $ib2) { - $iBDF[$ib2[1]] = $ib2[0]; - } - } - if (\count($iBDF)) { - \ksort($iBDF); - for ($i = \count($iBDF) - 1; $i >= 0; $i--) { - $inlinepre .= $this->mpdf->_setBidiCodes('end', $iBDF[$i]); - } - for ($i = 0; $i < \count($iBDF); $i++) { - $inlinepost .= $this->mpdf->_setBidiCodes('start', $iBDF[$i]); - } - } - } - /* -- TABLES -- */ - if ($this->mpdf->tableLevel) { - if ($this->mpdf->blockjustfinished) { - $this->mpdf->_saveCellTextBuffer($blockpre . $inlinepre . "\n" . $inlinepost . $blockpost); - } - $this->mpdf->_saveCellTextBuffer($blockpre . $inlinepre . "\n" . $inlinepost . $blockpost); - if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; - // reset - } else { - /* -- END TABLES -- */ - if (\count($this->mpdf->textbuffer)) { - $this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0] = \preg_replace('/ $/', '', $this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][0]); - if (!empty($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][18])) { - $this->otl->trimOTLdata($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1][18], \false); - } - // *OTL* - } - $this->mpdf->_saveTextBuffer($blockpre . $inlinepre . "\n" . $inlinepost . $blockpost); - } - // *TABLES* - $this->mpdf->ignorefollowingspaces = \true; - $this->mpdf->blockjustfinished = \false; - $this->mpdf->linebreakjustfinished = \true; - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Caption.php b/dependencies/mpdf/mpdf/src/Tag/Caption.php deleted file mode 100644 index 25a700c..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Caption.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Caption extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Center.php b/dependencies/mpdf/mpdf/src/Tag/Center.php deleted file mode 100644 index 60a1471..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Center.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Center extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Cite.php b/dependencies/mpdf/mpdf/src/Tag/Cite.php deleted file mode 100644 index 9d14a72..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Cite.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Cite extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Code.php b/dependencies/mpdf/mpdf/src/Tag/Code.php deleted file mode 100644 index fcc80e8..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Code.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Code extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/ColumnBreak.php b/dependencies/mpdf/mpdf/src/Tag/ColumnBreak.php deleted file mode 100644 index d8633d0..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/ColumnBreak.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class ColumnBreak extends NewColumn -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Columns.php b/dependencies/mpdf/mpdf/src/Tag/Columns.php deleted file mode 100644 index b80e7f4..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Columns.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Columns extends Tag -{ - /** - * @param string $tag - * @return \Mpdf\Tag\Tag - */ - private function getTagInstance($tag) - { - $className = \WP_Ultimo\Dependencies\Mpdf\Tag::getTagClassName($tag); - if (\class_exists($className)) { - return new $className($this->mpdf, $this->cache, $this->cssManager, $this->form, $this->otl, $this->tableOfContents, $this->sizeConverter, $this->colorConverter, $this->imageProcessor, $this->languageToFont); - } - return null; - } - public function open($attr, &$ahtml, &$ihtml) - { - if (isset($attr['COLUMN-COUNT']) && ($attr['COLUMN-COUNT'] || $attr['COLUMN-COUNT'] === '0')) { - // Close any open block tags - for ($b = $this->mpdf->blklvl; $b > 0; $b--) { - if ($t = $this->getTagInstance($this->mpdf->blk[$b]['tag'])) { - $t->close($ahtml, $ihtml); - } - } - if (!empty($this->mpdf->textbuffer)) { - //Output previously buffered content - $this->mpdf->printbuffer($this->mpdf->textbuffer); - $this->mpdf->textbuffer = []; - } - if (!empty($attr['VALIGN'])) { - if ($attr['VALIGN'] === 'J') { - $valign = 'J'; - } else { - $valign = $this->getAlign($attr['VALIGN']); - } - } else { - $valign = ''; - } - if (!empty($attr['COLUMN-GAP'])) { - $this->mpdf->SetColumns($attr['COLUMN-COUNT'], $valign, $attr['COLUMN-GAP']); - } else { - $this->mpdf->SetColumns($attr['COLUMN-COUNT'], $valign); - } - } - $this->mpdf->ignorefollowingspaces = \true; - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Dd.php b/dependencies/mpdf/mpdf/src/Tag/Dd.php deleted file mode 100644 index f6c6b14..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Dd.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Dd extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Del.php b/dependencies/mpdf/mpdf/src/Tag/Del.php deleted file mode 100644 index 5ec76f5..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Del.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Del extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Details.php b/dependencies/mpdf/mpdf/src/Tag/Details.php deleted file mode 100644 index 352c401..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Details.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Details extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Div.php b/dependencies/mpdf/mpdf/src/Tag/Div.php deleted file mode 100644 index ee113f1..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Div.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Div extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Dl.php b/dependencies/mpdf/mpdf/src/Tag/Dl.php deleted file mode 100644 index a7bad70..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Dl.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Dl extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/DotTab.php b/dependencies/mpdf/mpdf/src/Tag/DotTab.php deleted file mode 100644 index fa357a8..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/DotTab.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class DotTab extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $objattr = []; - $objattr['type'] = 'dottab'; - $dots = \str_repeat('.', 3) . ' '; - // minimum number of dots - $objattr['width'] = $this->mpdf->GetStringWidth($dots); - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['height'] = 0; - $objattr['colorarray'] = $this->mpdf->colorarray; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['vertical_align'] = 'BS'; - // mPDF 6 DOTTAB - $properties = $this->cssManager->MergeCSS('INLINE', 'DOTTAB', $attr); - if (isset($properties['OUTDENT'])) { - $objattr['outdent'] = $this->sizeConverter->convert($properties['OUTDENT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['OUTDENT'])) { - $objattr['outdent'] = $this->sizeConverter->convert($attr['OUTDENT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } else { - $objattr['outdent'] = 0; - } - $objattr['fontfamily'] = $this->mpdf->FontFamily; - $objattr['fontsize'] = $this->mpdf->FontSizePt; - $e = Mpdf::OBJECT_IDENTIFIER . "type=dottab,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - /* -- TABLES -- */ - // Output it to buffers - if ($this->mpdf->tableLevel) { - if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; - // reset - $this->mpdf->_saveCellTextBuffer($e); - } else { - /* -- END TABLES -- */ - $this->mpdf->_saveTextBuffer($e); - } - // *TABLES* - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Dt.php b/dependencies/mpdf/mpdf/src/Tag/Dt.php deleted file mode 100644 index c1c1dac..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Dt.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Dt extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Em.php b/dependencies/mpdf/mpdf/src/Tag/Em.php deleted file mode 100644 index 29462c5..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Em.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Em extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/FieldSet.php b/dependencies/mpdf/mpdf/src/Tag/FieldSet.php deleted file mode 100644 index c22a63f..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/FieldSet.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class FieldSet extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/FigCaption.php b/dependencies/mpdf/mpdf/src/Tag/FigCaption.php deleted file mode 100644 index fd56ce8..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/FigCaption.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class FigCaption extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Figure.php b/dependencies/mpdf/mpdf/src/Tag/Figure.php deleted file mode 100644 index 4908914..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Figure.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Figure extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Font.php b/dependencies/mpdf/mpdf/src/Tag/Font.php deleted file mode 100644 index fa44075..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Font.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Font extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Footer.php b/dependencies/mpdf/mpdf/src/Tag/Footer.php deleted file mode 100644 index 8b48bf8..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Footer.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Footer extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Form.php b/dependencies/mpdf/mpdf/src/Tag/Form.php deleted file mode 100644 index 8920228..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Form.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Form extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/FormFeed.php b/dependencies/mpdf/mpdf/src/Tag/FormFeed.php deleted file mode 100644 index c77ed55..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/FormFeed.php +++ /dev/null @@ -1,164 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class FormFeed extends Tag -{ - public $toc_id; - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - if (isset($attr['SHEET-SIZE'])) { - // Convert to same types as accepted in initial mPDF() A4, A4-L, or array(w,h) - $prop = \preg_split('/\\s+/', \trim($attr['SHEET-SIZE'])); - if (\count($prop) == 2) { - $newformat = [$this->sizeConverter->convert($prop[0]), $this->sizeConverter->convert($prop[1])]; - } else { - $newformat = $attr['SHEET-SIZE']; - } - } else { - $newformat = ''; - } - $save_blklvl = $this->mpdf->blklvl; - $save_blk = $this->mpdf->blk; - $save_silp = $this->mpdf->saveInlineProperties(); - $save_ilp = $this->mpdf->InlineProperties; - $save_bflp = $this->mpdf->InlineBDF; - $save_bflpc = $this->mpdf->InlineBDFctr; - // mPDF 6 - $mgr = $mgl = $mgt = $mgb = $mgh = $mgf = ''; - if (isset($attr['MARGIN-RIGHT'])) { - $mgr = $this->sizeConverter->convert($attr['MARGIN-RIGHT'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['MARGIN-LEFT'])) { - $mgl = $this->sizeConverter->convert($attr['MARGIN-LEFT'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['MARGIN-TOP'])) { - $mgt = $this->sizeConverter->convert($attr['MARGIN-TOP'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['MARGIN-BOTTOM'])) { - $mgb = $this->sizeConverter->convert($attr['MARGIN-BOTTOM'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['MARGIN-HEADER'])) { - $mgh = $this->sizeConverter->convert($attr['MARGIN-HEADER'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - if (isset($attr['MARGIN-FOOTER'])) { - $mgf = $this->sizeConverter->convert($attr['MARGIN-FOOTER'], $this->mpdf->w, $this->mpdf->FontSize, \false); - } - $ohname = $ehname = $ofname = $efname = ''; - if (isset($attr['ODD-HEADER-NAME'])) { - $ohname = $attr['ODD-HEADER-NAME']; - } - if (isset($attr['EVEN-HEADER-NAME'])) { - $ehname = $attr['EVEN-HEADER-NAME']; - } - if (isset($attr['ODD-FOOTER-NAME'])) { - $ofname = $attr['ODD-FOOTER-NAME']; - } - if (isset($attr['EVEN-FOOTER-NAME'])) { - $efname = $attr['EVEN-FOOTER-NAME']; - } - $ohvalue = $ehvalue = $ofvalue = $efvalue = 0; - if (isset($attr['ODD-HEADER-VALUE']) && ($attr['ODD-HEADER-VALUE'] == '1' || \strtoupper($attr['ODD-HEADER-VALUE']) === 'ON')) { - $ohvalue = 1; - } elseif (isset($attr['ODD-HEADER-VALUE']) && ($attr['ODD-HEADER-VALUE'] == '-1' || \strtoupper($attr['ODD-HEADER-VALUE']) === 'OFF')) { - $ohvalue = -1; - } - if (isset($attr['EVEN-HEADER-VALUE']) && ($attr['EVEN-HEADER-VALUE'] == '1' || \strtoupper($attr['EVEN-HEADER-VALUE']) === 'ON')) { - $ehvalue = 1; - } elseif (isset($attr['EVEN-HEADER-VALUE']) && ($attr['EVEN-HEADER-VALUE'] == '-1' || \strtoupper($attr['EVEN-HEADER-VALUE']) === 'OFF')) { - $ehvalue = -1; - } - if (isset($attr['ODD-FOOTER-VALUE']) && ($attr['ODD-FOOTER-VALUE'] == '1' || \strtoupper($attr['ODD-FOOTER-VALUE']) === 'ON')) { - $ofvalue = 1; - } elseif (isset($attr['ODD-FOOTER-VALUE']) && ($attr['ODD-FOOTER-VALUE'] == '-1' || \strtoupper($attr['ODD-FOOTER-VALUE']) === 'OFF')) { - $ofvalue = -1; - } - if (isset($attr['EVEN-FOOTER-VALUE']) && ($attr['EVEN-FOOTER-VALUE'] == '1' || \strtoupper($attr['EVEN-FOOTER-VALUE']) === 'ON')) { - $efvalue = 1; - } elseif (isset($attr['EVEN-FOOTER-VALUE']) && ($attr['EVEN-FOOTER-VALUE'] == '-1' || \strtoupper($attr['EVEN-FOOTER-VALUE']) === 'OFF')) { - $efvalue = -1; - } - if (isset($attr['ORIENTATION']) && (\strtoupper($attr['ORIENTATION']) === 'L' || \strtoupper($attr['ORIENTATION']) === 'LANDSCAPE')) { - $orient = 'L'; - } elseif (isset($attr['ORIENTATION']) && (\strtoupper($attr['ORIENTATION']) === 'P' || \strtoupper($attr['ORIENTATION']) === 'PORTRAIT')) { - $orient = 'P'; - } else { - $orient = $this->mpdf->CurOrientation; - } - $pagesel = ''; - if (!empty($attr['PAGE-SELECTOR'])) { - $pagesel = $attr['PAGE-SELECTOR']; - } - // mPDF 6 pagebreaktype - $pagebreaktype = $this->mpdf->defaultPagebreakType; - if ($tag === 'FORMFEED') { - $pagebreaktype = 'slice'; - } - // can be overridden by PAGE-BREAK-TYPE - $startpage = $this->mpdf->page; - if (isset($attr['PAGE-BREAK-TYPE'])) { - if (\strtolower($attr['PAGE-BREAK-TYPE']) === 'cloneall' || \strtolower($attr['PAGE-BREAK-TYPE']) === 'clonebycss' || \strtolower($attr['PAGE-BREAK-TYPE']) === 'slice') { - $pagebreaktype = \strtolower($attr['PAGE-BREAK-TYPE']); - } - } - if ($tag === 'TOCPAGEBREAK') { - $pagebreaktype = 'cloneall'; - } elseif ($this->mpdf->ColActive) { - $pagebreaktype = 'cloneall'; - } elseif ($mgr !== '' || $mgl !== '' || $mgt !== '' || $mgb !== '' || $mgh !== '' || $mgf !== '' || $ohname !== '' || $ehname !== '' || $ofname !== '' || $efname !== '' || $ohvalue || $ehvalue || $ofvalue || $efvalue || $orient != $this->mpdf->CurOrientation || $newformat || $pagesel) { - $pagebreaktype = 'cloneall'; - } - // mPDF 6 pagebreaktype - $this->mpdf->_preForcedPagebreak($pagebreaktype); - $this->mpdf->ignorefollowingspaces = \true; - $resetpagenum = ''; - $pagenumstyle = ''; - $suppress = ''; - if (isset($attr['RESETPAGENUM'])) { - $resetpagenum = $attr['RESETPAGENUM']; - } - if (isset($attr['PAGENUMSTYLE'])) { - $pagenumstyle = $attr['PAGENUMSTYLE']; - } - if (isset($attr['SUPPRESS'])) { - $suppress = $attr['SUPPRESS']; - } - $type = ''; - if ($tag === 'TOCPAGEBREAK') { - $type = 'NEXT-ODD'; - } elseif (isset($attr['TYPE'])) { - $type = \strtoupper($attr['TYPE']); - } - if ($type === 'E' || $type === 'EVEN') { - $this->mpdf->AddPage($orient, 'E', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat); - } elseif ($type === 'O' || $type === 'ODD') { - $this->mpdf->AddPage($orient, 'O', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat); - } elseif ($type === 'NEXT-ODD') { - $this->mpdf->AddPage($orient, 'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat); - } elseif ($type === 'NEXT-EVEN') { - $this->mpdf->AddPage($orient, 'NEXT-EVEN', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat); - } else { - $this->mpdf->AddPage($orient, '', $resetpagenum, $pagenumstyle, $suppress, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $pagesel, $newformat); - } - /* -- TOC -- */ - if ($tag === 'TOCPAGEBREAK') { - if ($this->toc_id) { - $this->tableOfContents->m_TOC[$this->toc_id]['TOCmark'] = $this->mpdf->page; - } else { - $this->tableOfContents->TOCmark = $this->mpdf->page; - } - } - /* -- END TOC -- */ - // mPDF 6 pagebreaktype - $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); - $this->mpdf->InlineProperties = $save_ilp; - $this->mpdf->InlineBDF = $save_bflp; - $this->mpdf->InlineBDFctr = $save_bflpc; - // mPDF 6 - $this->mpdf->restoreInlineProperties($save_silp); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/H1.php b/dependencies/mpdf/mpdf/src/Tag/H1.php deleted file mode 100644 index 433e45d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/H1.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class H1 extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/H2.php b/dependencies/mpdf/mpdf/src/Tag/H2.php deleted file mode 100644 index f1f31d4..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/H2.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class H2 extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/H3.php b/dependencies/mpdf/mpdf/src/Tag/H3.php deleted file mode 100644 index 96dc81c..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/H3.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class H3 extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/H4.php b/dependencies/mpdf/mpdf/src/Tag/H4.php deleted file mode 100644 index e8fd160..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/H4.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class H4 extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/H5.php b/dependencies/mpdf/mpdf/src/Tag/H5.php deleted file mode 100644 index 76fb096..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/H5.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class H5 extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/H6.php b/dependencies/mpdf/mpdf/src/Tag/H6.php deleted file mode 100644 index 66a66a6..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/H6.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class H6 extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/HGroup.php b/dependencies/mpdf/mpdf/src/Tag/HGroup.php deleted file mode 100644 index 62072ac..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/HGroup.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class HGroup extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Header.php b/dependencies/mpdf/mpdf/src/Tag/Header.php deleted file mode 100644 index f00215b..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Header.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Header extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Hr.php b/dependencies/mpdf/mpdf/src/Tag/Hr.php deleted file mode 100644 index c6ad1f7..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Hr.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Utils\NumericString; -class Hr extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - // Added mPDF 3.0 Float DIV - CLEAR - if (isset($attr['STYLE'])) { - $properties = $this->cssManager->readInlineCSS($attr['STYLE']); - if (isset($properties['CLEAR'])) { - $this->mpdf->ClearFloats(\strtoupper($properties['CLEAR']), $this->mpdf->blklvl); - } - // *CSS-FLOAT* - } - $this->mpdf->ignorefollowingspaces = \true; - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $properties = $this->cssManager->MergeCSS('', 'HR', $attr); - if (isset($properties['MARGIN-TOP'])) { - $objattr['margin_top'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $objattr['margin_bottom'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['WIDTH'])) { - $objattr['width'] = $this->sizeConverter->convert($properties['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - } elseif (isset($attr['WIDTH']) && $attr['WIDTH'] != '') { - $objattr['width'] = $this->sizeConverter->convert($attr['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - } - if (isset($properties['TEXT-ALIGN'])) { - $objattr['align'] = $this->getAlign($properties['TEXT-ALIGN']); - } elseif (isset($attr['ALIGN']) && $attr['ALIGN'] != '') { - $objattr['align'] = $this->getAlign($attr['ALIGN']); - } - if (isset($properties['MARGIN-LEFT']) && \strtolower($properties['MARGIN-LEFT']) === 'auto') { - $objattr['align'] = 'R'; - } - if (isset($properties['MARGIN-RIGHT']) && \strtolower($properties['MARGIN-RIGHT']) === 'auto') { - $objattr['align'] = 'L'; - if (isset($properties['MARGIN-RIGHT']) && \strtolower($properties['MARGIN-RIGHT']) === 'auto' && isset($properties['MARGIN-LEFT']) && \strtolower($properties['MARGIN-LEFT']) === 'auto') { - $objattr['align'] = 'C'; - } - } - if (isset($properties['COLOR'])) { - $objattr['color'] = $this->colorConverter->convert($properties['COLOR'], $this->mpdf->PDFAXwarnings); - } elseif (isset($attr['COLOR']) && $attr['COLOR'] != '') { - $objattr['color'] = $this->colorConverter->convert($attr['COLOR'], $this->mpdf->PDFAXwarnings); - } - if (isset($properties['HEIGHT'])) { - $objattr['linewidth'] = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - /* -- TABLES -- */ - if ($this->mpdf->tableLevel) { - $objattr['W-PERCENT'] = 100; - if (isset($properties['WIDTH']) && NumericString::containsPercentChar($properties['WIDTH'])) { - $properties['WIDTH'] = NumericString::removePercentChar($properties['WIDTH']); - // make "90%" become simply "90" - $objattr['W-PERCENT'] = $properties['WIDTH']; - } - if (isset($attr['WIDTH']) && NumericString::containsPercentChar($attr['WIDTH'])) { - $attr['WIDTH'] = NumericString::removePercentChar($attr['WIDTH']); - // make "90%" become simply "90" - $objattr['W-PERCENT'] = $attr['WIDTH']; - } - } - /* -- END TABLES -- */ - $objattr['type'] = 'hr'; - $objattr['height'] = $objattr['linewidth'] + $objattr['margin_top'] + $objattr['margin_bottom']; - $e = Mpdf::OBJECT_IDENTIFIER . "type=image,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - /* -- TABLES -- */ - // Output it to buffers - if ($this->mpdf->tableLevel) { - if ($this->mpdf->cell) { - if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; - // reset - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - } - } else { - /* -- END TABLES -- */ - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - // *TABLES* - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/I.php b/dependencies/mpdf/mpdf/src/Tag/I.php deleted file mode 100644 index 7b6a12d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/I.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class I extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Img.php b/dependencies/mpdf/mpdf/src/Tag/Img.php deleted file mode 100644 index 870157d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Img.php +++ /dev/null @@ -1,341 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Img extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->ignorefollowingspaces = \false; - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['padding_top'] = 0; - $objattr['padding_bottom'] = 0; - $objattr['padding_left'] = 0; - $objattr['padding_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - if (isset($attr['SRC'])) { - $srcpath = $attr['SRC']; - $orig_srcpath = isset($attr['ORIG_SRC']) ? $attr['ORIG_SRC'] : ''; - $properties = $this->cssManager->MergeCSS('', 'IMG', $attr); - if (isset($properties['DISPLAY']) && \strtolower($properties['DISPLAY']) === 'none') { - return; - } - if (isset($properties['Z-INDEX']) && $this->mpdf->current_layer == 0) { - $v = (int) $properties['Z-INDEX']; - if ($v > 0) { - $objattr['z-index'] = $v; - } - } - $objattr['visibility'] = 'visible'; - if (isset($properties['VISIBILITY'])) { - $v = \strtolower($properties['VISIBILITY']); - if (($v === 'hidden' || $v === 'printonly' || $v === 'screenonly') && $this->mpdf->visibility === 'visible') { - $objattr['visibility'] = $v; - } - } - // VSPACE and HSPACE converted to margins in MergeCSS - if (isset($properties['MARGIN-TOP'])) { - $objattr['margin_top'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $objattr['margin_bottom'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'])) { - $objattr['margin_left'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-RIGHT'])) { - $objattr['margin_right'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-TOP'])) { - $objattr['padding_top'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-BOTTOM'])) { - $objattr['padding_bottom'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-LEFT'])) { - $objattr['padding_left'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-RIGHT'])) { - $objattr['padding_right'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['BORDER-TOP'])) { - $objattr['border_top'] = $this->mpdf->border_details($properties['BORDER-TOP']); - } - if (isset($properties['BORDER-BOTTOM'])) { - $objattr['border_bottom'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - } - if (isset($properties['BORDER-LEFT'])) { - $objattr['border_left'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - } - if (isset($properties['BORDER-RIGHT'])) { - $objattr['border_right'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - } - if (isset($properties['VERTICAL-ALIGN'])) { - $objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - $w = 0; - $h = 0; - if (isset($properties['WIDTH'])) { - $w = $this->sizeConverter->convert($properties['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['WIDTH'])) { - $w = $this->sizeConverter->convert($attr['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['HEIGHT'])) { - $h = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['HEIGHT'])) { - $h = $this->sizeConverter->convert($attr['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - $maxw = $maxh = $minw = $minh = \false; - if (isset($properties['MAX-WIDTH'])) { - $maxw = $this->sizeConverter->convert($properties['MAX-WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['MAX-WIDTH'])) { - $maxw = $this->sizeConverter->convert($attr['MAX-WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MAX-HEIGHT'])) { - $maxh = $this->sizeConverter->convert($properties['MAX-HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['MAX-HEIGHT'])) { - $maxh = $this->sizeConverter->convert($attr['MAX-HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MIN-WIDTH'])) { - $minw = $this->sizeConverter->convert($properties['MIN-WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['MIN-WIDTH'])) { - $minw = $this->sizeConverter->convert($attr['MIN-WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MIN-HEIGHT'])) { - $minh = $this->sizeConverter->convert($properties['MIN-HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['MIN-HEIGHT'])) { - $minh = $this->sizeConverter->convert($attr['MIN-HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { - $objattr['opacity'] = $properties['OPACITY']; - } - if ($this->mpdf->HREF) { - if (\strpos($this->mpdf->HREF, '.') === \false && \strpos($this->mpdf->HREF, '@') !== 0) { - $href = $this->mpdf->HREF; - while (\array_key_exists($href, $this->mpdf->internallink)) { - $href = '#' . $href; - } - $this->mpdf->internallink[$href] = $this->mpdf->AddLink(); - $objattr['link'] = $this->mpdf->internallink[$href]; - } else { - $objattr['link'] = $this->mpdf->HREF; - } - } - $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; - $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; - // mPDF 5.7.3 TRANSFORMS - if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { - $objattr['bgcolor'] = $this->colorConverter->convert($properties['BACKGROUND-COLOR'], $this->mpdf->PDFAXwarnings); - } - /* -- BACKGROUNDS -- */ - if (isset($properties['GRADIENT-MASK']) && \preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $properties['GRADIENT-MASK'])) { - $objattr['GRADIENT-MASK'] = $properties['GRADIENT-MASK']; - } - /* -- END BACKGROUNDS -- */ - // mPDF 6 - $interpolation = \false; - if (!empty($properties['IMAGE-RENDERING'])) { - $interpolation = \false; - if (\strtolower($properties['IMAGE-RENDERING']) === 'crisp-edges') { - $interpolation = \false; - } elseif (\strtolower($properties['IMAGE-RENDERING']) === 'optimizequality') { - $interpolation = \true; - } elseif (\strtolower($properties['IMAGE-RENDERING']) === 'smooth') { - $interpolation = \true; - } elseif (\strtolower($properties['IMAGE-RENDERING']) === 'auto') { - $interpolation = $this->mpdf->interpolateImages; - } - $info['interpolation'] = $interpolation; - } - // Image file - $info = $this->imageProcessor->getImage($srcpath, \true, \true, $orig_srcpath, $interpolation); - // mPDF 6 - if (!$info) { - $info = $this->imageProcessor->getImage($this->mpdf->noImageFile); - if ($info) { - $srcpath = $this->mpdf->noImageFile; - $w = $info['w'] * (25.4 / $this->mpdf->img_dpi); - $h = $info['h'] * (25.4 / $this->mpdf->img_dpi); - } - } - if (!$info) { - return; - } - $image_orientation = 0; - if (isset($attr['ROTATE'])) { - $image_orientation = $attr['ROTATE']; - } elseif (isset($properties['IMAGE-ORIENTATION'])) { - $image_orientation = $properties['IMAGE-ORIENTATION']; - } - if ($image_orientation) { - if ($image_orientation == 90 || $image_orientation == -90 || $image_orientation == 270) { - $tmpw = $info['w']; - $info['w'] = $info['h']; - $info['h'] = $tmpw; - } - $objattr['ROTATE'] = $image_orientation; - } - $objattr['file'] = $srcpath; - //Default width and height calculation if needed - if ($w == 0 && $h == 0) { - /* -- IMAGES-WMF -- */ - if ($info['type'] === 'wmf') { - // WMF units are twips (1/20pt) - // divide by 20 to get points - // divide by k to get user units - $w = \abs($info['w']) / (20 * Mpdf::SCALE); - $h = \abs($info['h']) / (20 * Mpdf::SCALE); - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] === 'svg') { - // SVG units are pixels - $w = \abs($info['w']) / Mpdf::SCALE; - $h = \abs($info['h']) / Mpdf::SCALE; - } else { - //Put image at default image dpi - $w = $info['w'] / Mpdf::SCALE * (72 / $this->mpdf->img_dpi); - $h = $info['h'] / Mpdf::SCALE * (72 / $this->mpdf->img_dpi); - } - } - if (isset($properties['IMAGE-RESOLUTION'])) { - if (\preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi'] > 0) { - $w *= $this->mpdf->img_dpi / $info['set-dpi']; - $h *= $this->mpdf->img_dpi / $info['set-dpi']; - } elseif (\preg_match('/(\\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) { - $dpi = $m[1]; - if ($dpi > 0) { - $w *= $this->mpdf->img_dpi / $dpi; - $h *= $this->mpdf->img_dpi / $dpi; - } - } - } - } - // IF WIDTH OR HEIGHT SPECIFIED - if ($w == 0) { - $w = $info['h'] ? \abs($h * $info['w'] / $info['h']) : \INF; - } - if ($h == 0) { - $h = $info['w'] ? \abs($w * $info['h'] / $info['w']) : \INF; - } - if ($minw && $w < $minw) { - $w = $minw; - $h = $info['w'] ? \abs($w * $info['h'] / $info['w']) : \INF; - } - if ($maxw && $w > $maxw) { - $w = $maxw; - $h = $info['w'] ? \abs($w * $info['h'] / $info['w']) : \INF; - } - if ($minh && $h < $minh) { - $h = $minh; - $w = $info['h'] ? \abs($h * $info['w'] / $info['h']) : \INF; - } - if ($maxh && $h > $maxh) { - $h = $maxh; - $w = $info['h'] ? \abs($h * $info['w'] / $info['h']) : \INF; - } - // Resize to maximum dimensions of page - $maxWidth = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; - $maxHeight = $this->mpdf->h - ($this->mpdf->tMargin + $this->mpdf->bMargin + 1); - if ($this->mpdf->fullImageHeight) { - $maxHeight = $this->mpdf->fullImageHeight; - } - if ($w + $extrawidth > $maxWidth + 0.0001) { - // mPDF 5.7.4 0.0001 to allow for rounding errors when w==maxWidth - $w = $maxWidth - $extrawidth; - $h = \abs($w * $info['h'] / $info['w']); - } - if ($h + $extraheight > $maxHeight) { - $h = $maxHeight - $extraheight; - $w = \abs($h * $info['w'] / $info['h']); - } - $objattr['type'] = 'image'; - $objattr['itype'] = $info['type']; - $objattr['orig_h'] = $info['h']; - $objattr['orig_w'] = $info['w']; - /* -- IMAGES-WMF -- */ - if ($info['type'] === 'wmf') { - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] === 'svg') { - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - } - } - $objattr['height'] = $h + $extraheight; - $objattr['width'] = $w + $extrawidth; - $objattr['image_height'] = $h; - $objattr['image_width'] = $w; - /* -- CSS-IMAGE-FLOAT -- */ - if (!$this->mpdf->ColActive && !$this->mpdf->tableLevel && !$this->mpdf->listlvl && !$this->mpdf->kwt) { - if (isset($properties['FLOAT']) && (\strtoupper($properties['FLOAT']) === 'RIGHT' || \strtoupper($properties['FLOAT']) === 'LEFT')) { - $objattr['float'] = \strtoupper(\substr($properties['FLOAT'], 0, 1)); - } - } - /* -- END CSS-IMAGE-FLOAT -- */ - // mPDF 5.7.3 TRANSFORMS - if (isset($properties['TRANSFORM']) && !$this->mpdf->ColActive && !$this->mpdf->kwt) { - $objattr['transform'] = $properties['TRANSFORM']; - } - $e = Mpdf::OBJECT_IDENTIFIER . "type=image,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - /* -- TABLES -- */ - // Output it to buffers - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - } else { - /* -- END TABLES -- */ - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - // *TABLES* - /* -- ANNOTATIONS -- */ - if ($this->mpdf->title2annots && isset($attr['TITLE'])) { - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['CONTENT'] = $attr['TITLE']; - $objattr['type'] = 'annot'; - $objattr['POS-X'] = 0; - $objattr['POS-Y'] = 0; - $objattr['ICON'] = 'Comment'; - $objattr['AUTHOR'] = ''; - $objattr['SUBJECT'] = ''; - $objattr['OPACITY'] = $this->mpdf->annotOpacity; - $objattr['COLOR'] = $this->colorConverter->convert('yellow', $this->mpdf->PDFAXwarnings); - $e = Mpdf::OBJECT_IDENTIFIER . "type=annot,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->mpdf->tableLevel) { - // *TABLES* - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$e]; - // *TABLES* - } else { - // *TABLES* - $this->mpdf->textbuffer[] = [$e]; - } - // *TABLES* - } - /* -- END ANNOTATIONS -- */ - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/IndexEntry.php b/dependencies/mpdf/mpdf/src/Tag/IndexEntry.php deleted file mode 100644 index 3adae70..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/IndexEntry.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class IndexEntry extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - if (!empty($attr['CONTENT'])) { - if (!empty($attr['XREF'])) { - $this->mpdf->IndexEntry(\htmlspecialchars_decode($attr['CONTENT'], \ENT_QUOTES), $attr['XREF']); - return; - } - $objattr = []; - $objattr['CONTENT'] = \htmlspecialchars_decode($attr['CONTENT'], \ENT_QUOTES); - $objattr['type'] = 'indexentry'; - $objattr['vertical-align'] = 'T'; - $e = Mpdf::OBJECT_IDENTIFIER . "type=indexentry,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->mpdf->tableLevel) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$e]; - } else { - // *TABLES* - $this->mpdf->textbuffer[] = [$e]; - } - // *TABLES* - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/IndexInsert.php b/dependencies/mpdf/mpdf/src/Tag/IndexInsert.php deleted file mode 100644 index ca6a838..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/IndexInsert.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class IndexInsert extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $indexCollationLocale = ''; - if (isset($attr['COLLATION'])) { - $indexCollationLocale = $attr['COLLATION']; - } - $indexCollationGroup = ''; - if (isset($attr['COLLATION-GROUP'])) { - $indexCollationGroup = $attr['COLLATION-GROUP']; - } - $usedivletters = 1; - if (isset($attr['USEDIVLETTERS']) && (\strtoupper($attr['USEDIVLETTERS']) === 'OFF' || $attr['USEDIVLETTERS'] == -1 || $attr['USEDIVLETTERS'] === '0')) { - $usedivletters = 0; - } - $links = isset($attr['LINKS']) && (\strtoupper($attr['LINKS']) === 'ON' || $attr['LINKS'] == 1); - $this->mpdf->InsertIndex($usedivletters, $links, $indexCollationLocale, $indexCollationGroup); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/InlineTag.php b/dependencies/mpdf/mpdf/src/Tag/InlineTag.php deleted file mode 100644 index 105ed7c..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/InlineTag.php +++ /dev/null @@ -1,232 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -abstract class InlineTag extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - /* -- ANNOTATIONS -- */ - if ($this->mpdf->title2annots && isset($attr['TITLE'])) { - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['CONTENT'] = $attr['TITLE']; - $objattr['type'] = 'annot'; - $objattr['POS-X'] = 0; - $objattr['POS-Y'] = 0; - $objattr['ICON'] = 'Comment'; - $objattr['AUTHOR'] = ''; - $objattr['SUBJECT'] = ''; - $objattr['OPACITY'] = $this->mpdf->annotOpacity; - $objattr['COLOR'] = $this->colorConverter->convert('yellow', $this->mpdf->PDFAXwarnings); - $annot = Mpdf::OBJECT_IDENTIFIER . "type=annot,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - } - /* -- END ANNOTATIONS -- */ - // mPDF 5.7.3 Inline tags - if (!isset($this->mpdf->InlineProperties[$tag])) { - $this->mpdf->InlineProperties[$tag] = [$this->mpdf->saveInlineProperties()]; - } else { - $this->mpdf->InlineProperties[$tag][] = $this->mpdf->saveInlineProperties(); - } - if (isset($annot)) { - // *ANNOTATIONS* - if (!isset($this->mpdf->InlineAnnots[$tag])) { - $this->mpdf->InlineAnnots[$tag] = []; - } - // *ANNOTATIONS* - $this->mpdf->InlineAnnots[$tag][] = $annot; - } - // *ANNOTATIONS* - $properties = $this->cssManager->MergeCSS('INLINE', $tag, $attr); - if (!empty($properties)) { - $this->mpdf->setCSS($properties, 'INLINE'); - } - // mPDF 6 Bidirectional formatting for inline elements - $bdf = \false; - $bdf2 = ''; - $popd = ''; - // Get current direction - $currdir = 'ltr'; - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['direction'])) { - $currdir = $this->mpdf->blk[$this->mpdf->blklvl]['direction']; - } - if ($this->mpdf->tableLevel && isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['direction']) && $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['direction'] === 'rtl') { - $currdir = 'rtl'; - } - if (isset($attr['DIR']) && $attr['DIR'] != '') { - $currdir = \strtolower($attr['DIR']); - } - if (isset($properties['DIRECTION'])) { - $currdir = \strtolower($properties['DIRECTION']); - } - // mPDF 6 bidi - // cf. http://www.w3.org/TR/css3-writing-modes/#unicode-bidi - if ($tag === 'BDO') { - if (isset($attr['DIR']) && \strtolower($attr['DIR']) === 'rtl') { - $bdf = 0x202e; - $popd = 'RLOPDF'; - } elseif (isset($attr['DIR']) && \strtolower($attr['DIR']) === 'ltr') { - $bdf = 0x202d; - $popd = 'LROPDF'; - } - // U+202D LRO - } elseif ($tag === 'BDI') { - if (isset($attr['DIR']) && \strtolower($attr['DIR']) === 'rtl') { - $bdf = 0x2067; - $popd = 'RLIPDI'; - } elseif (isset($attr['DIR']) && \strtolower($attr['DIR']) === 'ltr') { - $bdf = 0x2066; - $popd = 'LRIPDI'; - } else { - $bdf = 0x2068; - $popd = 'FSIPDI'; - } - // U+2068 FSI - } elseif (isset($properties['UNICODE-BIDI']) && \strtolower($properties['UNICODE-BIDI']) === 'bidi-override') { - if ($currdir === 'rtl') { - $bdf = 0x202e; - $popd = 'RLOPDF'; - } else { - $bdf = 0x202d; - $popd = 'LROPDF'; - } - // U+202D LRO - } elseif (isset($properties['UNICODE-BIDI']) && \strtolower($properties['UNICODE-BIDI']) === 'embed') { - if ($currdir === 'rtl') { - $bdf = 0x202b; - $popd = 'RLEPDF'; - } else { - $bdf = 0x202a; - $popd = 'LREPDF'; - } - // U+202A LRE - } elseif (isset($properties['UNICODE-BIDI']) && \strtolower($properties['UNICODE-BIDI']) === 'isolate') { - if ($currdir === 'rtl') { - $bdf = 0x2067; - $popd = 'RLIPDI'; - } else { - $bdf = 0x2066; - $popd = 'LRIPDI'; - } - // U+2066 LRI - } elseif (isset($properties['UNICODE-BIDI']) && \strtolower($properties['UNICODE-BIDI']) === 'isolate-override') { - if ($currdir === 'rtl') { - $bdf = 0x2067; - $bdf2 = 0x202e; - $popd = 'RLIRLOPDFPDI'; - } else { - $bdf = 0x2066; - $bdf2 = 0x202d; - $popd = 'LRILROPDFPDI'; - } - // U+2066 LRI // U+202D LRO - } elseif (isset($properties['UNICODE-BIDI']) && \strtolower($properties['UNICODE-BIDI']) === 'plaintext') { - $bdf = 0x2068; - $popd = 'FSIPDI'; - // U+2068 FSI - } else { - if (isset($attr['DIR']) && \strtolower($attr['DIR']) === 'rtl') { - $bdf = 0x202b; - $popd = 'RLEPDF'; - } elseif (isset($attr['DIR']) && \strtolower($attr['DIR']) === 'ltr') { - $bdf = 0x202a; - $popd = 'LREPDF'; - } - // U+202A LRE - } - if ($bdf) { - // mPDF 5.7.3 Inline tags - if (!isset($this->mpdf->InlineBDF[$tag])) { - $this->mpdf->InlineBDF[$tag] = [[$popd, $this->mpdf->InlineBDFctr]]; - } else { - $this->mpdf->InlineBDF[$tag][] = [$popd, $this->mpdf->InlineBDFctr]; - } - $this->mpdf->InlineBDFctr++; - if ($bdf2) { - $bdf2 = UtfString::code2utf($bdf); - } - $this->mpdf->OTLdata = []; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer(UtfString::code2utf($bdf) . $bdf2); - } else { - $this->mpdf->_saveTextBuffer(UtfString::code2utf($bdf) . $bdf2); - } - $this->mpdf->biDirectional = \true; - } - } - public function close(&$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - $annot = \false; - // mPDF 6 - $bdf = \false; - // mPDF 6 - // mPDF 5.7.3 Inline tags - if ($tag === 'PROGRESS' || $tag === 'METER') { - if (!empty($this->mpdf->InlineProperties[$tag])) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties[$tag]); - } - unset($this->mpdf->InlineProperties[$tag]); - if (!empty($this->mpdf->InlineAnnots[$tag])) { - $annot = $this->mpdf->InlineAnnots[$tag]; - } - // *ANNOTATIONS* - unset($this->mpdf->InlineAnnots[$tag]); - // *ANNOTATIONS* - } else { - if (isset($this->mpdf->InlineProperties[$tag]) && \count($this->mpdf->InlineProperties[$tag])) { - $tmpProps = \array_pop($this->mpdf->InlineProperties[$tag]); - // mPDF 5.7.4 - $this->mpdf->restoreInlineProperties($tmpProps); - } - if (isset($this->mpdf->InlineAnnots[$tag]) && \count($this->mpdf->InlineAnnots[$tag])) { - // *ANNOTATIONS* - $annot = \array_pop($this->mpdf->InlineAnnots[$tag]); - // *ANNOTATIONS* - } - // *ANNOTATIONS* - if (isset($this->mpdf->InlineBDF[$tag]) && \count($this->mpdf->InlineBDF[$tag])) { - // mPDF 6 - $bdfarr = \array_pop($this->mpdf->InlineBDF[$tag]); - $bdf = $bdfarr[0]; - } - } - /* -- ANNOTATIONS -- */ - if ($annot) { - // mPDF 6 - if ($this->mpdf->tableLevel) { - // *TABLES* - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$annot]; - // *TABLES* - } else { - // *TABLES* - $this->mpdf->textbuffer[] = [$annot]; - } - // *TABLES* - } - /* -- END ANNOTATIONS -- */ - // mPDF 6 bidi - // mPDF 6 Bidirectional formatting for inline elements - if ($bdf) { - $popf = $this->mpdf->_setBidiCodes('end', $bdf); - $this->mpdf->OTLdata = []; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($popf); - } else { - $this->mpdf->_saveTextBuffer($popf); - } - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Input.php b/dependencies/mpdf/mpdf/src/Tag/Input.php deleted file mode 100644 index cd784e1..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Input.php +++ /dev/null @@ -1,388 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -class Input extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - $this->mpdf->ignorefollowingspaces = \false; - if (!isset($attr['TYPE'])) { - $attr['TYPE'] = 'TEXT'; - } - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['type'] = 'input'; - if (isset($attr['DISABLED'])) { - $objattr['disabled'] = \true; - } - if (isset($attr['READONLY'])) { - $objattr['readonly'] = \true; - } - if (isset($attr['REQUIRED'])) { - $objattr['required'] = \true; - } - if (isset($attr['SPELLCHECK']) && \strtolower($attr['SPELLCHECK']) === 'true') { - $objattr['spellcheck'] = \true; - } - if (isset($attr['TITLE'])) { - $objattr['title'] = $attr['TITLE']; - } elseif (isset($attr['ALT'])) { - $objattr['title'] = $attr['ALT']; - } else { - $objattr['title'] = ''; - } - $objattr['title'] = UtfString::strcode2utf($objattr['title']); - $objattr['title'] = $this->mpdf->lesser_entity_decode($objattr['title']); - if ($this->mpdf->onlyCoreFonts) { - $objattr['title'] = \mb_convert_encoding($objattr['title'], $this->mpdf->mb_enc, 'UTF-8'); - } - if ($this->mpdf->useActiveForms && isset($attr['NAME'])) { - $objattr['fieldname'] = $attr['NAME']; - } - if (isset($attr['VALUE'])) { - $attr['VALUE'] = UtfString::strcode2utf($attr['VALUE']); - $attr['VALUE'] = $this->mpdf->lesser_entity_decode($attr['VALUE']); - if ($this->mpdf->onlyCoreFonts) { - $attr['VALUE'] = \mb_convert_encoding($attr['VALUE'], $this->mpdf->mb_enc, 'UTF-8'); - } - $objattr['value'] = $attr['VALUE']; - } - $this->mpdf->InlineProperties['INPUT'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('', 'INPUT', $attr); - $objattr['vertical-align'] = ''; - if (isset($properties['FONT-FAMILY'])) { - $this->mpdf->SetFont($properties['FONT-FAMILY'], $this->mpdf->FontStyle, 0, \false); - } - if (isset($properties['FONT-SIZE']) && $properties['FONT-SIZE'] !== 'auto') { - $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $this->mpdf->default_font_size / Mpdf::SCALE); - $this->mpdf->SetFontSize($mmsize * Mpdf::SCALE, \false); - } - if (isset($properties['COLOR'])) { - $objattr['color'] = $this->colorConverter->convert($properties['COLOR'], $this->mpdf->PDFAXwarnings); - } - $objattr['fontfamily'] = $this->mpdf->FontFamily; - $objattr['fontsize'] = $this->mpdf->FontSizePt; - if ($this->mpdf->useActiveForms) { - if (isset($attr['ALIGN'])) { - $objattr['text_align'] = $this->getAlign($attr['ALIGN']); - } elseif (isset($properties['TEXT-ALIGN'])) { - $objattr['text_align'] = $this->getAlign($properties['TEXT-ALIGN']); - } - if (isset($properties['BORDER-TOP-COLOR'])) { - $objattr['border-col'] = $this->colorConverter->convert($properties['BORDER-TOP-COLOR'], $this->mpdf->PDFAXwarnings); - } - if (isset($properties['BACKGROUND-COLOR'])) { - $objattr['background-col'] = $this->colorConverter->convert($properties['BACKGROUND-COLOR'], $this->mpdf->PDFAXwarnings); - } - } - $type = ''; - $texto = ''; - $height = $this->mpdf->FontSize; - $width = 0; - $spacesize = $this->mpdf->GetCharWidth(' ', \false); - $w = 0; - if (isset($properties['WIDTH'])) { - $w = $this->sizeConverter->convert($properties['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - } - if ($properties['VERTICAL-ALIGN']) { - $objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - switch (\strtoupper($attr['TYPE'])) { - case 'HIDDEN': - $this->mpdf->ignorefollowingspaces = \true; - //Eliminate exceeding left-side spaces - if ($this->mpdf->useActiveForms) { - $this->form->SetFormText(0, 0, $objattr['fieldname'], $objattr['value'], $objattr['value'], '', 0, '', \true); - } - if ($this->mpdf->InlineProperties[$tag]) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties[$tag]); - } - unset($this->mpdf->InlineProperties[$tag]); - return; - case 'CHECKBOX': - //Draw Checkbox - $type = 'CHECKBOX'; - if (isset($attr['CHECKED'])) { - $objattr['checked'] = \true; - } else { - $objattr['checked'] = \false; - } - $width = $this->mpdf->FontSize; - $height = $this->mpdf->FontSize; - break; - case 'RADIO': - //Draw Radio button - $type = 'RADIO'; - if (isset($attr['CHECKED'])) { - $objattr['checked'] = \true; - } - $width = $this->mpdf->FontSize; - $height = $this->mpdf->FontSize; - break; - /* -- IMAGES-CORE -- */ - case 'IMAGE': - // Draw an Image button - if (isset($attr['SRC'])) { - $type = 'IMAGE'; - $srcpath = $attr['SRC']; - $orig_srcpath = $attr['ORIG_SRC']; - // VSPACE and HSPACE converted to margins in MergeCSS - if (isset($properties['MARGIN-TOP'])) { - $objattr['margin_top'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $objattr['margin_bottom'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'])) { - $objattr['margin_left'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-RIGHT'])) { - $objattr['margin_right'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['BORDER-TOP'])) { - $objattr['border_top'] = $this->mpdf->border_details($properties['BORDER-TOP']); - } - if (isset($properties['BORDER-BOTTOM'])) { - $objattr['border_bottom'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - } - if (isset($properties['BORDER-LEFT'])) { - $objattr['border_left'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - } - if (isset($properties['BORDER-RIGHT'])) { - $objattr['border_right'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - } - $objattr['padding_top'] = 0; - $objattr['padding_bottom'] = 0; - $objattr['padding_left'] = 0; - $objattr['padding_right'] = 0; - if (isset($properties['VERTICAL-ALIGN'])) { - $objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - $w = 0; - $h = 0; - if (isset($properties['WIDTH'])) { - $w = $this->sizeConverter->convert($properties['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - } - if (isset($properties['HEIGHT'])) { - $h = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - } - $extraheight = $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; - $extrawidth = $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; - // Image file - $info = $this->imageProcessor->getImage($srcpath, \true, \true, $orig_srcpath); - if (!$info) { - $info = $this->imageProcessor->getImage($this->mpdf->noImageFile); - if ($info) { - $srcpath = $this->mpdf->noImageFile; - $w = $info['w'] * (25.4 / $this->mpdf->img_dpi); - $h = $info['h'] * (25.4 / $this->mpdf->img_dpi); - } - } - if (!$info) { - break; - } - if ($info['cs'] === 'Indexed') { - $objattr['Indexed'] = \true; - } - $objattr['file'] = $srcpath; - //Default width and height calculation if needed - if ($w == 0 && $h == 0) { - /* -- IMAGES-WMF -- */ - if ($info['type'] === 'wmf') { - // WMF units are twips (1/20pt) - // divide by 20 to get points - // divide by k to get user units - $w = \abs($info['w']) / (20 * Mpdf::SCALE); - $h = \abs($info['h']) / (20 * Mpdf::SCALE); - } else { - /* -- END IMAGES-WMF -- */ - if ($info['type'] === 'svg') { - // SVG units are pixels - $w = \abs($info['w']) / Mpdf::SCALE; - $h = \abs($info['h']) / Mpdf::SCALE; - } else { - //Put image at default image dpi - $w = $info['w'] / Mpdf::SCALE * (72 / $this->mpdf->img_dpi); - $h = $info['h'] / Mpdf::SCALE * (72 / $this->mpdf->img_dpi); - } - } - if (isset($properties['IMAGE-RESOLUTION'])) { - if (\preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi'] > 0) { - $w *= $this->mpdf->img_dpi / $info['set-dpi']; - $h *= $this->mpdf->img_dpi / $info['set-dpi']; - } elseif (\preg_match('/(\\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) { - $dpi = $m[1]; - if ($dpi > 0) { - $w *= $this->mpdf->img_dpi / $dpi; - $h *= $this->mpdf->img_dpi / $dpi; - } - } - } - } - // IF WIDTH OR HEIGHT SPECIFIED - if ($w == 0) { - $w = $h * $info['w'] / $info['h']; - } - if ($h == 0) { - $h = $w * $info['h'] / $info['w']; - } - // Resize to maximum dimensions of page - $maxWidth = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; - $maxHeight = $this->mpdf->h - ($this->mpdf->tMargin + $this->mpdf->bMargin + 10); - if ($this->mpdf->fullImageHeight) { - $maxHeight = $this->mpdf->fullImageHeight; - } - if ($w + $extrawidth > $maxWidth + 0.0001) { - // mPDF 5.7.4 0.0001 to allow for rounding errors when w==maxWidth - $w = $maxWidth - $extrawidth; - $h = $w * $info['h'] / $info['w']; - } - if ($h + $extraheight > $maxHeight) { - $h = $maxHeight - $extraheight; - $w = $h * $info['w'] / $info['h']; - } - $height = $h + $extraheight; - $width = $w + $extrawidth; - $objattr['type'] = 'image'; - $objattr['itype'] = $info['type']; - $objattr['orig_h'] = $info['h']; - $objattr['orig_w'] = $info['w']; - /* -- IMAGES-WMF -- */ - if ($info['type'] === 'wmf') { - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - /* -- END IMAGES-WMF -- */ - } else { - if ($info['type'] === 'svg') { - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - } - } - $objattr['height'] = $h + $extraheight; - $objattr['width'] = $w + $extrawidth; - $objattr['image_height'] = $h; - $objattr['image_width'] = $w; - $objattr['ID'] = $info['i']; - $texto = 'X'; - if ($this->mpdf->useActiveForms) { - if (isset($attr['ONCLICK'])) { - $objattr['onClick'] = $attr['ONCLICK']; - } - $objattr['type'] = 'input'; - $type = 'IMAGE'; - } - break; - } - /* -- END IMAGES-CORE -- */ - case 'BUTTON': - // Draw a button - case 'SUBMIT': - case 'RESET': - $type = \strtoupper($attr['TYPE']); - if ($type === 'IMAGE') { - $type = 'BUTTON'; - } - // src path not found - if (isset($attr['NOPRINT'])) { - $objattr['noprint'] = \true; - } - if (!isset($attr['VALUE'])) { - $objattr['value'] = \ucfirst(\strtolower($type)); - } - $texto = ' ' . $objattr['value'] . ' '; - $width = $this->mpdf->GetStringWidth($texto) + $this->form->form_element_spacing['button']['outer']['h'] * 2 + $this->form->form_element_spacing['button']['inner']['h'] * 2; - $height = $this->mpdf->FontSize + $this->form->form_element_spacing['button']['outer']['v'] * 2 + $this->form->form_element_spacing['button']['inner']['v'] * 2; - if ($this->mpdf->useActiveForms && isset($attr['ONCLICK'])) { - $objattr['onClick'] = $attr['ONCLICK']; - } - break; - case 'PASSWORD': - case 'TEXT': - default: - if ($type == '') { - $type = 'TEXT'; - } - if (\strtoupper($attr['TYPE']) === 'PASSWORD') { - $type = 'PASSWORD'; - } - if ($properties['FONT-SIZE'] === 'auto' && $this->mpdf->useActiveForms) { - $objattr['use_auto_fontsize'] = \true; - } - if (isset($attr['VALUE'])) { - if ($type === 'PASSWORD') { - $num_stars = \mb_strlen($attr['VALUE'], $this->mpdf->mb_enc); - $texto = \str_repeat('*', $num_stars); - } else { - $texto = $attr['VALUE']; - } - } - $xw = $this->form->form_element_spacing['input']['outer']['h'] * 2 + $this->form->form_element_spacing['input']['inner']['h'] * 2; - $xh = $this->form->form_element_spacing['input']['outer']['v'] * 2 + $this->form->form_element_spacing['input']['inner']['v'] * 2; - if ($w) { - $width = $w + $xw; - } else { - $width = 20 * $spacesize + $xw; - } - // Default width in chars - if (isset($attr['SIZE']) && \ctype_digit($attr['SIZE'])) { - $width = $attr['SIZE'] * $spacesize + $xw; - } - $height = $this->mpdf->FontSize + $xh; - if (isset($attr['MAXLENGTH']) && \ctype_digit($attr['MAXLENGTH'])) { - $objattr['maxlength'] = $attr['MAXLENGTH']; - } - if ($this->mpdf->useActiveForms) { - if (isset($attr['ONCALCULATE'])) { - $objattr['onCalculate'] = $attr['ONCALCULATE']; - } elseif (isset($attr['ONCHANGE'])) { - $objattr['onCalculate'] = $attr['ONCHANGE']; - } - if (isset($attr['ONVALIDATE'])) { - $objattr['onValidate'] = $attr['ONVALIDATE']; - } - if (isset($attr['ONKEYSTROKE'])) { - $objattr['onKeystroke'] = $attr['ONKEYSTROKE']; - } - if (isset($attr['ONFORMAT'])) { - $objattr['onFormat'] = $attr['ONFORMAT']; - } - } - break; - } - $objattr['subtype'] = $type; - $objattr['text'] = $texto; - $objattr['width'] = $width; - $objattr['height'] = $height; - $e = Mpdf::OBJECT_IDENTIFIER . "type=input,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - /* -- TABLES -- */ - // Output it to buffers - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - } else { - /* -- END TABLES -- */ - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - // *TABLES* - if ($this->mpdf->InlineProperties[$tag]) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties[$tag]); - } - unset($this->mpdf->InlineProperties[$tag]); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Ins.php b/dependencies/mpdf/mpdf/src/Tag/Ins.php deleted file mode 100644 index a580d83..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Ins.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Ins extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Kbd.php b/dependencies/mpdf/mpdf/src/Tag/Kbd.php deleted file mode 100644 index 00fe188..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Kbd.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Kbd extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Legend.php b/dependencies/mpdf/mpdf/src/Tag/Legend.php deleted file mode 100644 index b4a9cce..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Legend.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Legend extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->InlineProperties['LEGEND'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('INLINE', 'LEGEND', $attr); - if (!empty($properties)) { - $this->mpdf->setCSS($properties, 'INLINE'); - } - } - public function close(&$ahtml, &$ihtml) - { - if (\count($this->mpdf->textbuffer) && !$this->mpdf->tableLevel) { - $leg = $this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1]; - unset($this->mpdf->textbuffer[\count($this->mpdf->textbuffer) - 1]); - $this->mpdf->textbuffer = \array_values($this->mpdf->textbuffer); - $this->mpdf->blk[$this->mpdf->blklvl]['border_legend'] = $leg; - $this->mpdf->blk[$this->mpdf->blklvl]['margin_top'] += $leg[11] / 2 / Mpdf::SCALE; - $this->mpdf->blk[$this->mpdf->blklvl]['padding_top'] += $leg[11] / 2 / Mpdf::SCALE; - } - if (isset($this->mpdf->InlineProperties['LEGEND'])) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['LEGEND']); - } - unset($this->mpdf->InlineProperties['LEGEND']); - $this->mpdf->ignorefollowingspaces = \true; - //Eliminate exceeding left-side spaces - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Li.php b/dependencies/mpdf/mpdf/src/Tag/Li.php deleted file mode 100644 index 83c0ffc..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Li.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Li extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Main.php b/dependencies/mpdf/mpdf/src/Tag/Main.php deleted file mode 100644 index 8f2a8f3..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Main.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Main extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Mark.php b/dependencies/mpdf/mpdf/src/Tag/Mark.php deleted file mode 100644 index 27feccb..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Mark.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Mark extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Meter.php b/dependencies/mpdf/mpdf/src/Tag/Meter.php deleted file mode 100644 index fe39806..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Meter.php +++ /dev/null @@ -1,426 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Meter extends InlineTag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - $this->mpdf->inMeter = \true; - $max = 1; - if (!empty($attr['MAX'])) { - $max = $attr['MAX']; - } - $min = 0; - if (!empty($attr['MIN']) && $tag === 'METER') { - $min = $attr['MIN']; - } - if ($max < $min) { - $max = $min; - } - $value = ''; - if (isset($attr['VALUE']) && ($attr['VALUE'] || $attr['VALUE'] === '0')) { - $value = $attr['VALUE']; - if ($value < $min) { - $value = $min; - } elseif ($value > $max) { - $value = $max; - } - } - $low = $min; - if (!empty($attr['LOW'])) { - $low = $attr['LOW']; - } - if ($low < $min) { - $low = $min; - } elseif ($low > $max) { - $low = $max; - } - $high = $max; - if (!empty($attr['HIGH'])) { - $high = $attr['HIGH']; - } - if ($high < $low) { - $high = $low; - } elseif ($high > $max) { - $high = $max; - } - if (!empty($attr['OPTIMUM'])) { - $optimum = $attr['OPTIMUM']; - } else { - $optimum = $min + ($max - $min) / 2; - } - if ($optimum < $min) { - $optimum = $min; - } elseif ($optimum > $max) { - $optimum = $max; - } - $type = ''; - if (!empty($attr['TYPE'])) { - $type = $attr['TYPE']; - } - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['padding_top'] = 0; - $objattr['padding_bottom'] = 0; - $objattr['padding_left'] = 0; - $objattr['padding_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $properties = $this->cssManager->MergeCSS('INLINE', $tag, $attr); - if (isset($properties['DISPLAY']) && \strtolower($properties['DISPLAY']) === 'none') { - return; - } - $objattr['visibility'] = 'visible'; - if (isset($properties['VISIBILITY'])) { - $v = \strtolower($properties['VISIBILITY']); - if (($v === 'hidden' || $v === 'printonly' || $v === 'screenonly') && $this->mpdf->visibility === 'visible') { - $objattr['visibility'] = $v; - } - } - if (isset($properties['MARGIN-TOP'])) { - $objattr['margin_top'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $objattr['margin_bottom'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'])) { - $objattr['margin_left'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-RIGHT'])) { - $objattr['margin_right'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-TOP'])) { - $objattr['padding_top'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-BOTTOM'])) { - $objattr['padding_bottom'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-LEFT'])) { - $objattr['padding_left'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-RIGHT'])) { - $objattr['padding_right'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['BORDER-TOP'])) { - $objattr['border_top'] = $this->mpdf->border_details($properties['BORDER-TOP']); - } - if (isset($properties['BORDER-BOTTOM'])) { - $objattr['border_bottom'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - } - if (isset($properties['BORDER-LEFT'])) { - $objattr['border_left'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - } - if (isset($properties['BORDER-RIGHT'])) { - $objattr['border_right'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - } - if (isset($properties['VERTICAL-ALIGN'])) { - $objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - $w = 0; - $h = 0; - if (isset($properties['WIDTH'])) { - $w = $this->sizeConverter->convert($properties['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['WIDTH'])) { - $w = $this->sizeConverter->convert($attr['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['HEIGHT'])) { - $h = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['HEIGHT'])) { - $h = $this->sizeConverter->convert($attr['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { - $objattr['opacity'] = $properties['OPACITY']; - } - if ($this->mpdf->HREF) { - if (\strpos($this->mpdf->HREF, '.') === \false && \strpos($this->mpdf->HREF, '@') !== 0) { - $href = $this->mpdf->HREF; - while (\array_key_exists($href, $this->mpdf->internallink)) { - $href = '#' . $href; - } - $this->mpdf->internallink[$href] = $this->mpdf->AddLink(); - $objattr['link'] = $this->mpdf->internallink[$href]; - } else { - $objattr['link'] = $this->mpdf->HREF; - } - } - $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; - $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; - $svg = $this->makeSVG($type, $value, $max, $min, $optimum, $low, $high); - //Save to local file - $srcpath = $this->cache->write('/_tempSVG' . \uniqid(\random_int(1, 100000), \true) . '_' . \strtolower($tag) . '.svg', $svg); - $orig_srcpath = $srcpath; - $this->mpdf->GetFullPath($srcpath); - $info = $this->imageProcessor->getImage($srcpath, \true, \true, $orig_srcpath); - if (!$info) { - $info = $this->imageProcessor->getImage($this->mpdf->noImageFile); - if ($info) { - $srcpath = $this->mpdf->noImageFile; - $w = $info['w'] * (25.4 / $this->mpdf->img_dpi); - $h = $info['h'] * (25.4 / $this->mpdf->img_dpi); - } - } - if (!$info) { - return; - } - $objattr['file'] = $srcpath; - // Default width and height calculation if needed - if ($w == 0 && $h == 0) { - // SVG units are pixels - $w = $this->mpdf->FontSize / (10 / Mpdf::SCALE) * \abs($info['w']) / Mpdf::SCALE; - $h = $this->mpdf->FontSize / (10 / Mpdf::SCALE) * \abs($info['h']) / Mpdf::SCALE; - } - // IF WIDTH OR HEIGHT SPECIFIED - if ($w == 0) { - $w = $info['h'] ? \abs($h * $info['w'] / $info['h']) : \INF; - } - if ($h == 0) { - $h = $info['w'] ? \abs($w * $info['h'] / $info['w']) : \INF; - } - // Resize to maximum dimensions of page - $maxWidth = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; - $maxHeight = $this->mpdf->h - ($this->mpdf->tMargin + $this->mpdf->bMargin + 1); - if ($this->mpdf->fullImageHeight) { - $maxHeight = $this->mpdf->fullImageHeight; - } - if ($w + $extrawidth > $maxWidth + 0.0001) { - // mPDF 5.7.4 0.0001 to allow for rounding errors when w==maxWidth - $w = $maxWidth - $extrawidth; - $h = \abs($w * $info['h'] / $info['w']); - } - if ($h + $extraheight > $maxHeight) { - $h = $maxHeight - $extraheight; - $w = \abs($h * $info['w'] / $info['h']); - } - $objattr['type'] = 'image'; - $objattr['itype'] = $info['type']; - $objattr['orig_h'] = $info['h']; - $objattr['orig_w'] = $info['w']; - $objattr['wmf_x'] = $info['x']; - $objattr['wmf_y'] = $info['y']; - $objattr['height'] = $h + $extraheight; - $objattr['width'] = $w + $extrawidth; - $objattr['image_height'] = $h; - $objattr['image_width'] = $w; - $e = Mpdf::OBJECT_IDENTIFIER . "type=image,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - } else { - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - } - public function close(&$ahtml, &$ihtml) - { - parent::close($ahtml, $ihtml); - $this->mpdf->ignorefollowingspaces = \false; - $this->mpdf->inMeter = \false; - } - protected function makeSVG($type, $value, $max, $min, $optimum, $low, $high) - { - if ($type == '2') { - ///////////////////////////////////////////////////////////////////////////////////// - ///////// CUSTOM <meter type="2"> - ///////////////////////////////////////////////////////////////////////////////////// - $h = 10; - $w = 160; - $border_radius = 0.143; - // Factor of Height - $svg = '<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg width="' . $w . 'px" height="' . $h . 'px" viewBox="0 0 ' . $w . ' ' . $h . '" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g> - - -<defs> -<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(222, 222, 222)" /> -<stop offset="20%" stop-color="rgb(232, 232, 232)" /> -<stop offset="25%" stop-color="rgb(232, 232, 232)" /> -<stop offset="100%" stop-color="rgb(182, 182, 182)" /> -</linearGradient> - -</defs> -'; - $svg .= '<rect x="0" y="0" width="' . $w . '" height="' . $h . '" fill="#f4f4f4" stroke="none" />'; - // LOW to HIGH region - //if ($low && $high && ($low != $min || $high != $max)) { - if ($low && $high) { - $barx = ($low - $min) / ($max - $min) * $w; - $barw = ($high - $low) / ($max - $min) * $w; - $svg .= '<rect x="' . $barx . '" y="0" width="' . $barw . '" height="' . $h . '" fill="url(#GrGRAY)" stroke="#888888" stroke-width="0.5px" />'; - } - // OPTIMUM Marker (? AVERAGE) - if ($optimum) { - $barx = ($optimum - $min) / ($max - $min) * $w; - $barw = $h / 2; - $barcol = '#888888'; - $svg .= '<rect x="' . $barx . '" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $barw . '" height="' . $h . '" fill="' . $barcol . '" stroke="none" />'; - } - // VALUE Marker - if ($value) { - if ($min != $low && $value < $low) { - $col = 'orange'; - } elseif ($max != $high && $value > $high) { - $col = 'orange'; - } else { - $col = '#008800'; - } - $cx = ($value - $min) / ($max - $min) * $w; - $cy = $h / 2; - $rx = $h / 3.5; - $ry = $h / 2.2; - $svg .= '<ellipse fill="' . $col . '" stroke="#000000" stroke-width="0.5px" cx="' . $cx . '" cy="' . $cy . '" rx="' . $rx . '" ry="' . $ry . '"/>'; - } - // BoRDER - $svg .= '<rect x="0" y="0" width="' . $w . '" height="' . $h . '" fill="none" stroke="#888888" stroke-width="0.5px" />'; - $svg .= '</g></svg>'; - } elseif ($type == '3') { - ///////////////////////////////////////////////////////////////////////////////////// - ///////// CUSTOM <meter type="2"> - ///////////////////////////////////////////////////////////////////////////////////// - $h = 10; - $w = 100; - $border_radius = 0.143; - // Factor of Height - $svg = '<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg width="' . $w . 'px" height="' . $h . 'px" viewBox="0 0 ' . $w . ' ' . $h . '" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g> - - -<defs> -<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(222, 222, 222)" /> -<stop offset="20%" stop-color="rgb(232, 232, 232)" /> -<stop offset="25%" stop-color="rgb(232, 232, 232)" /> -<stop offset="100%" stop-color="rgb(182, 182, 182)" /> -</linearGradient> - -</defs> -'; - $svg .= '<rect x="0" y="0" width="' . $w . '" height="' . $h . '" fill="#f4f4f4" stroke="none" />'; - // LOW to HIGH region - if ($low && $high && ($low != $min || $high != $max)) { - //if ($low && $high) { - $barx = ($low - $min) / ($max - $min) * $w; - $barw = ($high - $low) / ($max - $min) * $w; - $svg .= '<rect x="' . $barx . '" y="0" width="' . $barw . '" height="' . $h . '" fill="url(#GrGRAY)" stroke="#888888" stroke-width="0.5px" />'; - } - // OPTIMUM Marker (? AVERAGE) - if ($optimum) { - $barx = ($optimum - $min) / ($max - $min) * $w; - $barw = $h / 2; - $barcol = '#888888'; - $svg .= '<rect x="' . $barx . '" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $barw . '" height="' . $h . '" fill="' . $barcol . '" stroke="none" />'; - } - // VALUE Marker - if ($value) { - if ($min != $low && $value < $low) { - $col = 'orange'; - } elseif ($max != $high && $value > $high) { - $col = 'orange'; - } else { - $col = 'orange'; - } - $cx = ($value - $min) / ($max - $min) * $w; - $cy = $h / 2; - $rx = $h / 2.2; - $ry = $h / 2.2; - $svg .= '<ellipse fill="' . $col . '" stroke="#000000" stroke-width="0.5px" cx="' . $cx . '" cy="' . $cy . '" rx="' . $rx . '" ry="' . $ry . '"/>'; - } - // BoRDER - $svg .= '<rect x="0" y="0" width="' . $w . '" height="' . $h . '" fill="none" stroke="#888888" stroke-width="0.5px" />'; - $svg .= '</g></svg>'; - } else { - ///////////////////////////////////////////////////////////////////////////////////// - ///////// DEFAULT <meter> - ///////////////////////////////////////////////////////////////////////////////////// - $h = 10; - $w = 50; - $border_radius = 0.143; - // Factor of Height - $svg = '<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg width="' . $w . 'px" height="' . $h . 'px" viewBox="0 0 ' . $w . ' ' . $h . '" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g> - -<defs> -<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(222, 222, 222)" /> -<stop offset="20%" stop-color="rgb(232, 232, 232)" /> -<stop offset="25%" stop-color="rgb(232, 232, 232)" /> -<stop offset="100%" stop-color="rgb(182, 182, 182)" /> -</linearGradient> - -<linearGradient id="GrRED" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(255, 162, 162)" /> -<stop offset="20%" stop-color="rgb(255, 218, 218)" /> -<stop offset="25%" stop-color="rgb(255, 218, 218)" /> -<stop offset="100%" stop-color="rgb(255, 0, 0)" /> -</linearGradient> - -<linearGradient id="GrGREEN" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(102, 230, 102)" /> -<stop offset="20%" stop-color="rgb(218, 255, 218)" /> -<stop offset="25%" stop-color="rgb(218, 255, 218)" /> -<stop offset="100%" stop-color="rgb(0, 148, 0)" /> -</linearGradient> - -<linearGradient id="GrBLUE" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(102, 102, 230)" /> -<stop offset="20%" stop-color="rgb(238, 238, 238)" /> -<stop offset="25%" stop-color="rgb(238, 238, 238)" /> -<stop offset="100%" stop-color="rgb(0, 0, 128)" /> -</linearGradient> - -<linearGradient id="GrORANGE" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(255, 186, 0)" /> -<stop offset="20%" stop-color="rgb(255, 238, 168)" /> -<stop offset="25%" stop-color="rgb(255, 238, 168)" /> -<stop offset="100%" stop-color="rgb(255, 155, 0)" /> -</linearGradient> -</defs> - -<rect x="0" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $w . '" height="' . $h . '" fill="url(#GrGRAY)" stroke="none" /> -'; - if ($value) { - $barw = ($value - $min) / ($max - $min) * $w; - if ($optimum < $low) { - if ($value < $low) { - $barcol = 'url(#GrGREEN)'; - } elseif ($value > $high) { - $barcol = 'url(#GrRED)'; - } else { - $barcol = 'url(#GrORANGE)'; - } - } elseif ($optimum > $high) { - if ($value < $low) { - $barcol = 'url(#GrRED)'; - } elseif ($value > $high) { - $barcol = 'url(#GrGREEN)'; - } else { - $barcol = 'url(#GrORANGE)'; - } - } else { - if ($value < $low) { - $barcol = 'url(#GrORANGE)'; - } elseif ($value > $high) { - $barcol = 'url(#GrORANGE)'; - } else { - $barcol = 'url(#GrGREEN)'; - } - } - $svg .= '<rect x="0" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $barw . '" height="' . $h . '" fill="' . $barcol . '" stroke="none" />'; - } - $svg .= '</g></svg>'; - } - return $svg; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Nav.php b/dependencies/mpdf/mpdf/src/Tag/Nav.php deleted file mode 100644 index c2f8dbc..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Nav.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Nav extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/NewColumn.php b/dependencies/mpdf/mpdf/src/Tag/NewColumn.php deleted file mode 100644 index a9bec12..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/NewColumn.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class NewColumn extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->ignorefollowingspaces = \true; - $this->mpdf->NewColumn(); - $this->mpdf->ColumnAdjust = \false; - // disables all column height adjustment for the page. - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/NewPage.php b/dependencies/mpdf/mpdf/src/Tag/NewPage.php deleted file mode 100644 index c6f290b..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/NewPage.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class NewPage extends FormFeed -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Ol.php b/dependencies/mpdf/mpdf/src/Tag/Ol.php deleted file mode 100644 index bc9dc69..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Ol.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Ol extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Option.php b/dependencies/mpdf/mpdf/src/Tag/Option.php deleted file mode 100644 index 2418ab9..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Option.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -class Option extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = ''; - $this->mpdf->selectoption['ACTIVE'] = \true; - $this->mpdf->selectoption['currentSEL'] = \false; - if (empty($this->mpdf->selectoption)) { - $this->mpdf->selectoption['MAXWIDTH'] = ''; - $this->mpdf->selectoption['SELECTED'] = ''; - } - if (isset($attr['SELECTED'])) { - $this->mpdf->selectoption['SELECTED'] = ''; - $this->mpdf->selectoption['currentSEL'] = \true; - } - if (isset($attr['VALUE'])) { - $attr['VALUE'] = UtfString::strcode2utf($attr['VALUE']); - $attr['VALUE'] = $this->mpdf->lesser_entity_decode($attr['VALUE']); - if ($this->mpdf->onlyCoreFonts) { - $attr['VALUE'] = \mb_convert_encoding($attr['VALUE'], $this->mpdf->mb_enc, 'UTF-8'); - } - } - $this->mpdf->selectoption['currentVAL'] = $attr['VALUE']; - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->selectoption['ACTIVE'] = \false; - $this->mpdf->lastoptionaltag = ''; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/P.php b/dependencies/mpdf/mpdf/src/Tag/P.php deleted file mode 100644 index c7e0128..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/P.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class P extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/PageBreak.php b/dependencies/mpdf/mpdf/src/Tag/PageBreak.php deleted file mode 100644 index aaf4c23..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/PageBreak.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class PageBreak extends FormFeed -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/PageFooter.php b/dependencies/mpdf/mpdf/src/Tag/PageFooter.php deleted file mode 100644 index 26fc384..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/PageFooter.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class PageFooter extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - $this->mpdf->ignorefollowingspaces = \true; - $pname = '_nonhtmldefault'; - if ($attr['NAME']) { - $pname = $attr['NAME']; - } - // mPDF 6 - $p = []; - // mPDF 6 - $p['L'] = []; - $p['C'] = []; - $p['R'] = []; - $p['L']['font-style'] = ''; - $p['C']['font-style'] = ''; - $p['R']['font-style'] = ''; - if (isset($attr['CONTENT-LEFT'])) { - $p['L']['content'] = $attr['CONTENT-LEFT']; - } - if (isset($attr['CONTENT-CENTER'])) { - $p['C']['content'] = $attr['CONTENT-CENTER']; - } - if (isset($attr['CONTENT-RIGHT'])) { - $p['R']['content'] = $attr['CONTENT-RIGHT']; - } - if (isset($attr['HEADER-STYLE']) || isset($attr['FOOTER-STYLE'])) { - // font-family,size,weight,style,color - if ($tag === 'PAGEHEADER') { - $properties = $this->cssManager->readInlineCSS($attr['HEADER-STYLE']); - } else { - $properties = $this->cssManager->readInlineCSS($attr['FOOTER-STYLE']); - } - if (isset($properties['FONT-FAMILY'])) { - $p['L']['font-family'] = $properties['FONT-FAMILY']; - $p['C']['font-family'] = $properties['FONT-FAMILY']; - $p['R']['font-family'] = $properties['FONT-FAMILY']; - } - if (isset($properties['FONT-SIZE'])) { - $p['L']['font-size'] = $this->sizeConverter->convert($properties['FONT-SIZE']) * Mpdf::SCALE; - $p['C']['font-size'] = $this->sizeConverter->convert($properties['FONT-SIZE']) * Mpdf::SCALE; - $p['R']['font-size'] = $this->sizeConverter->convert($properties['FONT-SIZE']) * Mpdf::SCALE; - } - if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT'] === 'bold') { - $p['L']['font-style'] = 'B'; - $p['C']['font-style'] = 'B'; - $p['R']['font-style'] = 'B'; - } - if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE'] === 'italic') { - $p['L']['font-style'] .= 'I'; - $p['C']['font-style'] .= 'I'; - $p['R']['font-style'] .= 'I'; - } - if (isset($properties['COLOR'])) { - $p['L']['color'] = $properties['COLOR']; - $p['C']['color'] = $properties['COLOR']; - $p['R']['color'] = $properties['COLOR']; - } - } - if (isset($attr['HEADER-STYLE-LEFT']) || isset($attr['FOOTER-STYLE-LEFT'])) { - if ($tag === 'PAGEHEADER') { - $properties = $this->cssManager->readInlineCSS($attr['HEADER-STYLE-LEFT']); - } else { - $properties = $this->cssManager->readInlineCSS($attr['FOOTER-STYLE-LEFT']); - } - if (isset($properties['FONT-FAMILY'])) { - $p['L']['font-family'] = $properties['FONT-FAMILY']; - } - if (isset($properties['FONT-SIZE'])) { - $p['L']['font-size'] = $this->sizeConverter->convert($properties['FONT-SIZE']) * Mpdf::SCALE; - } - if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT'] === 'bold') { - $p['L']['font-style'] = 'B'; - } - if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE'] === 'italic') { - $p['L']['font-style'] .= 'I'; - } - if (isset($properties['COLOR'])) { - $p['L']['color'] = $properties['COLOR']; - } - } - if (isset($attr['HEADER-STYLE-CENTER']) || isset($attr['FOOTER-STYLE-CENTER'])) { - if ($tag === 'PAGEHEADER') { - $properties = $this->cssManager->readInlineCSS($attr['HEADER-STYLE-CENTER']); - } else { - $properties = $this->cssManager->readInlineCSS($attr['FOOTER-STYLE-CENTER']); - } - if (isset($properties['FONT-FAMILY'])) { - $p['C']['font-family'] = $properties['FONT-FAMILY']; - } - if (isset($properties['FONT-SIZE'])) { - $p['C']['font-size'] = $this->sizeConverter->convert($properties['FONT-SIZE']) * Mpdf::SCALE; - } - if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT'] === 'bold') { - $p['C']['font-style'] = 'B'; - } - if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE'] === 'italic') { - $p['C']['font-style'] .= 'I'; - } - if (isset($properties['COLOR'])) { - $p['C']['color'] = $properties['COLOR']; - } - } - if (isset($attr['HEADER-STYLE-RIGHT']) || isset($attr['FOOTER-STYLE-RIGHT'])) { - if ($tag === 'PAGEHEADER') { - $properties = $this->cssManager->readInlineCSS($attr['HEADER-STYLE-RIGHT']); - } else { - $properties = $this->cssManager->readInlineCSS($attr['FOOTER-STYLE-RIGHT']); - } - if (isset($properties['FONT-FAMILY'])) { - $p['R']['font-family'] = $properties['FONT-FAMILY']; - } - if (isset($properties['FONT-SIZE'])) { - $p['R']['font-size'] = $this->sizeConverter->convert($properties['FONT-SIZE']) * Mpdf::SCALE; - } - if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT'] === 'bold') { - $p['R']['font-style'] = 'B'; - } - if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE'] === 'italic') { - $p['R']['font-style'] .= 'I'; - } - if (isset($properties['COLOR'])) { - $p['R']['color'] = $properties['COLOR']; - } - } - if (!empty($attr['LINE'])) { - // 0|1|on|off - $lineset = 0; - if ($attr['LINE'] == '1' || \strtoupper($attr['LINE']) === 'ON') { - $lineset = 1; - } - $p['line'] = $lineset; - } - // mPDF 6 - if ($tag === 'PAGEHEADER') { - $this->mpdf->DefHeaderByName($pname, $p); - } else { - $this->mpdf->DefFooterByName($pname, $p); - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/PageHeader.php b/dependencies/mpdf/mpdf/src/Tag/PageHeader.php deleted file mode 100644 index 1c928bf..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/PageHeader.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class PageHeader extends PageFooter -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Pre.php b/dependencies/mpdf/mpdf/src/Tag/Pre.php deleted file mode 100644 index 6abfe95..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Pre.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Pre extends BlockTag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->ispre = \true; - // ADDED - Prevents left trim of textbuffer in printbuffer() - parent::open($attr, $ahtml, $ihtml); - // TODO: Change the autogenerated stub - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Progress.php b/dependencies/mpdf/mpdf/src/Tag/Progress.php deleted file mode 100644 index fb05953..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Progress.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Progress extends Meter -{ - protected function makeSVG($type, $value, $max, $min, $optimum, $low, $high) - { - $svg = ''; - if ($type == '2') { - ///////////////////////////////////////////////////////////////////////////////////// - ///////// CUSTOM <progress type="2"> - ///////////////////////////////////////////////////////////////////////////////////// - } else { - ///////////////////////////////////////////////////////////////////////////////////// - ///////// DEFAULT <progress> - ///////////////////////////////////////////////////////////////////////////////////// - $h = 10; - $w = 100; - $border_radius = 0.143; - // Factor of Height - if ($value or $value === '0') { - $fill = 'url(#GrGRAY)'; - } else { - $fill = '#f8f8f8'; - } - $svg = '<svg width="' . $w . 'px" height="' . $h . 'px" viewBox="0 0 ' . $w . ' ' . $h . '"><g> - -<defs> -<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(222, 222, 222)" /> -<stop offset="20%" stop-color="rgb(232, 232, 232)" /> -<stop offset="25%" stop-color="rgb(232, 232, 232)" /> -<stop offset="100%" stop-color="rgb(182, 182, 182)" /> -</linearGradient> - -<linearGradient id="GrGREEN" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> -<stop offset="0%" stop-color="rgb(102, 230, 102)" /> -<stop offset="20%" stop-color="rgb(218, 255, 218)" /> -<stop offset="25%" stop-color="rgb(218, 255, 218)" /> -<stop offset="100%" stop-color="rgb(0, 148, 0)" /> -</linearGradient> - -</defs> - -<rect x="0" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $w . '" height="' . $h . '" fill="' . $fill . '" stroke="none" /> -'; - if ($value) { - $barw = ($value - $min) / ($max - $min) * $w; - $barcol = 'url(#GrGREEN)'; - $svg .= '<rect x="0" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $barw . '" height="' . $h . '" fill="' . $barcol . '" stroke="none" />'; - } - // Borders - $svg .= '<rect x="0" y="0" rx="' . $h * $border_radius . 'px" ry="' . $h * $border_radius . 'px" width="' . $w . '" height="' . $h . '" fill="none" stroke="#888888" stroke-width="0.5px" />'; - if ($value) { - // $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />'; - } - $svg .= '</g></svg>'; - } - return $svg; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Q.php b/dependencies/mpdf/mpdf/src/Tag/Q.php deleted file mode 100644 index 6a4a67a..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Q.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Q extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/S.php b/dependencies/mpdf/mpdf/src/Tag/S.php deleted file mode 100644 index 0380c5d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/S.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class S extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Samp.php b/dependencies/mpdf/mpdf/src/Tag/Samp.php deleted file mode 100644 index a05af70..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Samp.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Samp extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Section.php b/dependencies/mpdf/mpdf/src/Tag/Section.php deleted file mode 100644 index 9841710..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Section.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Section extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Select.php b/dependencies/mpdf/mpdf/src/Tag/Select.php deleted file mode 100644 index 8c17001..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Select.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Select extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = ''; - // Save current HTML specified optional endtag - $this->mpdf->InlineProperties['SELECT'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('', 'SELECT', $attr); - if (isset($properties['FONT-FAMILY'])) { - $this->mpdf->SetFont($properties['FONT-FAMILY'], $this->mpdf->FontStyle, 0, \false); - } - if (isset($properties['FONT-SIZE'])) { - $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $this->mpdf->default_font_size / Mpdf::SCALE); - $this->mpdf->SetFontSize($mmsize * Mpdf::SCALE, \false); - } - if (isset($attr['SPELLCHECK']) && \strtolower($attr['SPELLCHECK']) === 'true') { - $this->mpdf->selectoption['SPELLCHECK'] = \true; - } - if (isset($properties['COLOR'])) { - $this->mpdf->selectoption['COLOR'] = $this->colorConverter->convert($properties['COLOR'], $this->mpdf->PDFAXwarnings); - } - $this->mpdf->specialcontent = 'type=select'; - if (isset($attr['DISABLED'])) { - $this->mpdf->selectoption['DISABLED'] = $attr['DISABLED']; - } - if (isset($attr['READONLY'])) { - $this->mpdf->selectoption['READONLY'] = $attr['READONLY']; - } - if (isset($attr['REQUIRED'])) { - $this->mpdf->selectoption['REQUIRED'] = $attr['REQUIRED']; - } - if (isset($attr['EDITABLE'])) { - $this->mpdf->selectoption['EDITABLE'] = $attr['EDITABLE']; - } - if (isset($attr['TITLE'])) { - $this->mpdf->selectoption['TITLE'] = $attr['TITLE']; - } - if (isset($attr['MULTIPLE'])) { - $this->mpdf->selectoption['MULTIPLE'] = $attr['MULTIPLE']; - } - if (isset($attr['SIZE']) && $attr['SIZE'] > 1) { - $this->mpdf->selectoption['SIZE'] = $attr['SIZE']; - } - if ($this->mpdf->useActiveForms) { - if (isset($attr['NAME'])) { - $this->mpdf->selectoption['NAME'] = $attr['NAME']; - } - if (isset($attr['ONCHANGE'])) { - $this->mpdf->selectoption['ONCHANGE'] = $attr['ONCHANGE']; - } - } - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->ignorefollowingspaces = \false; - $this->mpdf->lastoptionaltag = ''; - $texto = ''; - $OTLdata = \false; - if (isset($this->mpdf->selectoption['SELECTED'])) { - $texto = $this->mpdf->selectoption['SELECTED']; - } - if (isset($this->mpdf->selectoption['SELECTED-OTLDATA'])) { - $OTLdata = $this->mpdf->selectoption['SELECTED-OTLDATA']; - } - if ($this->mpdf->useActiveForms) { - $w = $this->mpdf->selectoption['MAXWIDTH']; - } else { - $w = $this->mpdf->GetStringWidth($texto, \true, $OTLdata); - } - if ($w == 0) { - $w = 5; - } - $objattr['type'] = 'select'; - $objattr['text'] = $texto; - $objattr['OTLdata'] = $OTLdata; - if (isset($this->mpdf->selectoption['NAME'])) { - $objattr['fieldname'] = $this->mpdf->selectoption['NAME']; - } - if (isset($this->mpdf->selectoption['READONLY'])) { - $objattr['readonly'] = \true; - } - if (isset($this->mpdf->selectoption['REQUIRED'])) { - $objattr['required'] = \true; - } - if (isset($this->mpdf->selectoption['SPELLCHECK'])) { - $objattr['spellcheck'] = \true; - } - if (isset($this->mpdf->selectoption['EDITABLE'])) { - $objattr['editable'] = \true; - } - if (isset($this->mpdf->selectoption['ONCHANGE'])) { - $objattr['onChange'] = $this->mpdf->selectoption['ONCHANGE']; - } - if (isset($this->mpdf->selectoption['ITEMS'])) { - $objattr['items'] = $this->mpdf->selectoption['ITEMS']; - } - if (isset($this->mpdf->selectoption['MULTIPLE'])) { - $objattr['multiple'] = $this->mpdf->selectoption['MULTIPLE']; - } - if (isset($this->mpdf->selectoption['DISABLED'])) { - $objattr['disabled'] = $this->mpdf->selectoption['DISABLED']; - } - if (isset($this->mpdf->selectoption['TITLE'])) { - $objattr['title'] = $this->mpdf->selectoption['TITLE']; - } - if (isset($this->mpdf->selectoption['COLOR'])) { - $objattr['color'] = $this->mpdf->selectoption['COLOR']; - } - if (isset($this->mpdf->selectoption['SIZE'])) { - $objattr['size'] = $this->mpdf->selectoption['SIZE']; - } - $rows = 1; - if (isset($objattr['size']) && $objattr['size'] > 1) { - $rows = $objattr['size']; - } - $objattr['fontfamily'] = $this->mpdf->FontFamily; - $objattr['fontsize'] = $this->mpdf->FontSizePt; - $objattr['width'] = $w + $this->form->form_element_spacing['select']['outer']['h'] * 2 + $this->form->form_element_spacing['select']['inner']['h'] * 2 + $this->mpdf->FontSize * 1.4; - $objattr['height'] = $this->mpdf->FontSize * $rows + $this->form->form_element_spacing['select']['outer']['v'] * 2 + $this->form->form_element_spacing['select']['inner']['v'] * 2; - $e = Mpdf::OBJECT_IDENTIFIER . "type=select,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - // Output it to buffers - if ($this->mpdf->tableLevel) { - // *TABLES* - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - // *TABLES* - } else { - // *TABLES* - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - // *TABLES* - $this->mpdf->selectoption = []; - $this->mpdf->specialcontent = ''; - if ($this->mpdf->InlineProperties['SELECT']) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['SELECT']); - } - unset($this->mpdf->InlineProperties['SELECT']); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php b/dependencies/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php deleted file mode 100644 index 26ccd53..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class SetHtmlPageFooter extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - $this->mpdf->ignorefollowingspaces = \true; - $pname = '_default'; - if (!empty($attr['NAME'])) { - $pname = $attr['NAME']; - } elseif ($tag === 'SETPAGEHEADER' || $tag === 'SETPAGEFOOTER') { - $pname = '_nonhtmldefault'; - } - // mPDF 6 - if (!empty($attr['PAGE'])) { - // O|odd|even|E|ALL|[blank] - $side = 'odd'; - if (\strtoupper($attr['PAGE']) === 'O' || \strtoupper($attr['PAGE']) === 'ODD') { - $side = 'odd'; - } elseif (\strtoupper($attr['PAGE']) === 'E' || \strtoupper($attr['PAGE']) === 'EVEN') { - $side = 'even'; - } elseif (\strtoupper($attr['PAGE']) === 'ALL') { - $side = 'both'; - } - } else { - $side = 'odd'; - } - if (!empty($attr['VALUE'])) { - // -1|1|on|off - $set = 1; - if ($attr['VALUE'] == '1' || \strtoupper($attr['VALUE']) === 'ON') { - $set = 1; - } elseif ($attr['VALUE'] == '-1' || \strtoupper($attr['VALUE']) === 'OFF') { - $set = 0; - } - } else { - $set = 1; - } - $write = 0; - if (!empty($attr['SHOW-THIS-PAGE']) && ($tag === 'SETHTMLPAGEHEADER' || $tag === 'SETPAGEHEADER')) { - $write = 1; - } - if ($side === 'odd' || $side === 'both') { - if ($set && ($tag === 'SETHTMLPAGEHEADER' || $tag === 'SETPAGEHEADER')) { - $this->mpdf->SetHTMLHeader($this->mpdf->pageHTMLheaders[$pname], 'O', $write); - } elseif ($set && ($tag === 'SETHTMLPAGEFOOTER' || $tag === 'SETPAGEFOOTER')) { - $this->mpdf->SetHTMLFooter($this->mpdf->pageHTMLfooters[$pname], 'O'); - } elseif ($tag === 'SETHTMLPAGEHEADER' || $tag === 'SETPAGEHEADER') { - $this->mpdf->SetHTMLHeader('', 'O'); - } else { - $this->mpdf->SetHTMLFooter('', 'O'); - } - } - if ($side === 'even' || $side === 'both') { - if ($set && ($tag === 'SETHTMLPAGEHEADER' || $tag === 'SETPAGEHEADER')) { - $this->mpdf->SetHTMLHeader($this->mpdf->pageHTMLheaders[$pname], 'E', $write); - } elseif ($set && ($tag === 'SETHTMLPAGEFOOTER' || $tag === 'SETPAGEFOOTER')) { - $this->mpdf->SetHTMLFooter($this->mpdf->pageHTMLfooters[$pname], 'E'); - } elseif ($tag === 'SETHTMLPAGEHEADER' || $tag === 'SETPAGEHEADER') { - $this->mpdf->SetHTMLHeader('', 'E'); - } else { - $this->mpdf->SetHTMLFooter('', 'E'); - } - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php b/dependencies/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php deleted file mode 100644 index 5694f4e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class SetHtmlPageHeader extends SetHtmlPageFooter -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/SetPageFooter.php b/dependencies/mpdf/mpdf/src/Tag/SetPageFooter.php deleted file mode 100644 index 4a6800f..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/SetPageFooter.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class SetPageFooter extends SetHtmlPageFooter -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/SetPageHeader.php b/dependencies/mpdf/mpdf/src/Tag/SetPageHeader.php deleted file mode 100644 index 13b351b..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/SetPageHeader.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class SetPageHeader extends SetHtmlPageFooter -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Small.php b/dependencies/mpdf/mpdf/src/Tag/Small.php deleted file mode 100644 index 83d8f11..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Small.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Small extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Span.php b/dependencies/mpdf/mpdf/src/Tag/Span.php deleted file mode 100644 index 49eeb9d..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Span.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Span extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Strike.php b/dependencies/mpdf/mpdf/src/Tag/Strike.php deleted file mode 100644 index e75747a..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Strike.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Strike extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Strong.php b/dependencies/mpdf/mpdf/src/Tag/Strong.php deleted file mode 100644 index 08d4692..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Strong.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Strong extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Sub.php b/dependencies/mpdf/mpdf/src/Tag/Sub.php deleted file mode 100644 index 5efc8a5..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Sub.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Sub extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/SubstituteTag.php b/dependencies/mpdf/mpdf/src/Tag/SubstituteTag.php deleted file mode 100644 index 09b9f11..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/SubstituteTag.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -abstract class SubstituteTag extends Tag -{ - public function close(&$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - if ($this->mpdf->InlineProperties[$tag]) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties[$tag]); - } - unset($this->mpdf->InlineProperties[$tag]); - $ltag = \strtolower($tag); - $this->mpdf->{$ltag} = \false; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Summary.php b/dependencies/mpdf/mpdf/src/Tag/Summary.php deleted file mode 100644 index 613905f..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Summary.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Summary extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Sup.php b/dependencies/mpdf/mpdf/src/Tag/Sup.php deleted file mode 100644 index d38ea5e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Sup.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Sup extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/TBody.php b/dependencies/mpdf/mpdf/src/Tag/TBody.php deleted file mode 100644 index e2295de..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/TBody.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class TBody extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->tablethead = 0; - $this->mpdf->tabletfoot = 0; - $this->mpdf->lastoptionaltag = 'TBODY'; - // Save current HTML specified optional endtag - $this->cssManager->tbCSSlvl++; - $this->cssManager->MergeCSS('TABLE', 'TBODY', $attr); - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = ''; - unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); - $this->cssManager->tbCSSlvl--; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/TFoot.php b/dependencies/mpdf/mpdf/src/Tag/TFoot.php deleted file mode 100644 index 2416835..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/TFoot.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -// TODO: Extend THEAD instead? -class TFoot extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = 'TFOOT'; - // Save current HTML specified optional endtag - $this->cssManager->tbCSSlvl++; - $this->mpdf->tabletfoot = 1; - $this->mpdf->tablethead = 0; - $properties = $this->cssManager->MergeCSS('TABLE', 'TFOOT', $attr); - if (isset($properties['FONT-WEIGHT'])) { - $this->mpdf->tfoot_font_weight = ''; - if (\strtoupper($properties['FONT-WEIGHT']) === 'BOLD') { - $this->mpdf->tfoot_font_weight = 'B'; - } - } - if (isset($properties['FONT-STYLE'])) { - $this->mpdf->tfoot_font_style = ''; - if (\strtoupper($properties['FONT-STYLE']) === 'ITALIC') { - $this->mpdf->tfoot_font_style = 'I'; - } - } - if (isset($properties['FONT-VARIANT'])) { - $this->mpdf->tfoot_font_smCaps = ''; - if (\strtoupper($properties['FONT-VARIANT']) === 'SMALL-CAPS') { - $this->mpdf->tfoot_font_smCaps = 'S'; - } - } - if (isset($properties['VERTICAL-ALIGN'])) { - $this->mpdf->tfoot_valign_default = $properties['VERTICAL-ALIGN']; - } - if (isset($properties['TEXT-ALIGN'])) { - $this->mpdf->tfoot_textalign_default = $properties['TEXT-ALIGN']; - } - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = ''; - unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); - $this->cssManager->tbCSSlvl--; - $this->mpdf->tabletfoot = 0; - $this->mpdf->ResetStyles(); - $this->mpdf->tfoot_font_weight = ''; - $this->mpdf->tfoot_font_style = ''; - $this->mpdf->tfoot_font_smCaps = ''; - $this->mpdf->tfoot_valign_default = ''; - $this->mpdf->tfoot_textalign_default = ''; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/THead.php b/dependencies/mpdf/mpdf/src/Tag/THead.php deleted file mode 100644 index 5067591..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/THead.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class THead extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = 'THEAD'; - // Save current HTML specified optional endtag - $this->cssManager->tbCSSlvl++; - $this->mpdf->tablethead = 1; - $this->mpdf->tabletfoot = 0; - $properties = $this->cssManager->MergeCSS('TABLE', 'THEAD', $attr); - if (isset($properties['FONT-WEIGHT'])) { - $this->mpdf->thead_font_weight = ''; - if (\strtoupper($properties['FONT-WEIGHT']) === 'BOLD') { - $this->mpdf->thead_font_weight = 'B'; - } - } - if (isset($properties['FONT-STYLE'])) { - $this->mpdf->thead_font_style = ''; - if (\strtoupper($properties['FONT-STYLE']) === 'ITALIC') { - $this->mpdf->thead_font_style = 'I'; - } - } - if (isset($properties['FONT-VARIANT'])) { - $this->mpdf->thead_font_smCaps = ''; - if (\strtoupper($properties['FONT-VARIANT']) === 'SMALL-CAPS') { - $this->mpdf->thead_font_smCaps = 'S'; - } - } - if (isset($properties['VERTICAL-ALIGN'])) { - $this->mpdf->thead_valign_default = $properties['VERTICAL-ALIGN']; - } - if (isset($properties['TEXT-ALIGN'])) { - $this->mpdf->thead_textalign_default = $properties['TEXT-ALIGN']; - } - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = ''; - unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); - $this->cssManager->tbCSSlvl--; - $this->mpdf->tablethead = 0; - $this->mpdf->tabletheadjustfinished = \true; - $this->mpdf->ResetStyles(); - $this->mpdf->thead_font_weight = ''; - $this->mpdf->thead_font_style = ''; - $this->mpdf->thead_font_smCaps = ''; - $this->mpdf->thead_valign_default = ''; - $this->mpdf->thead_textalign_default = ''; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Table.php b/dependencies/mpdf/mpdf/src/Tag/Table.php deleted file mode 100644 index 09dcda9..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Table.php +++ /dev/null @@ -1,1147 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Css\Border; -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class Table extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->tdbegin = \false; - $this->mpdf->lastoptionaltag = ''; - // Disable vertical justification in columns - if ($this->mpdf->ColActive) { - $this->mpdf->colvAlign = ''; - } - // *COLUMNS* - if ($this->mpdf->lastblocklevelchange == 1) { - $blockstate = 1; - } elseif ($this->mpdf->lastblocklevelchange < 1) { - $blockstate = 0; - } - // NO margins/padding - // called from block after new div e.g. <div> ... <table> ... Outputs block top margin/border and padding - if (\count($this->mpdf->textbuffer) == 0 && $this->mpdf->lastblocklevelchange == 1 && !$this->mpdf->tableLevel && !$this->mpdf->kwt) { - $this->mpdf->newFlowingBlock($this->mpdf->blk[$this->mpdf->blklvl]['width'], $this->mpdf->lineheight, '', \false, 1, \true, $this->mpdf->blk[$this->mpdf->blklvl]['direction']); - $this->mpdf->finishFlowingBlock(\true); - // true = END of flowing block - } elseif (!$this->mpdf->tableLevel && \count($this->mpdf->textbuffer)) { - $this->mpdf->printbuffer($this->mpdf->textbuffer, $blockstate); - } - $this->mpdf->textbuffer = []; - $this->mpdf->lastblocklevelchange = -1; - if ($this->mpdf->tableLevel) { - // i.e. now a nested table coming... - // Save current level table - $this->mpdf->cell['PARENTCELL'] = $this->mpdf->saveInlineProperties(); - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['baseProperties'] = $this->mpdf->base_table_properties; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] = $this->mpdf->cell; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currrow'] = $this->mpdf->row; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currcol'] = $this->mpdf->col; - } - $this->mpdf->tableLevel++; - $this->cssManager->tbCSSlvl++; - if ($this->mpdf->tableLevel > 1) { - // inherit table properties from cell in which nested - //$this->mpdf->base_table_properties['FONT-KERNING'] = ($this->mpdf->textvar & TextVars::FC_KERNING); // mPDF 6 - $this->mpdf->base_table_properties['LETTER-SPACING'] = $this->mpdf->lSpacingCSS; - $this->mpdf->base_table_properties['WORD-SPACING'] = $this->mpdf->wSpacingCSS; - // mPDF 6 - $direction = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['direction']; - $txta = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['a']; - $cellLineHeight = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['cellLineHeight']; - $cellLineStackingStrategy = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['cellLineStackingStrategy']; - $cellLineStackingShift = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['cellLineStackingShift']; - } - if (isset($this->mpdf->tbctr[$this->mpdf->tableLevel])) { - $this->mpdf->tbctr[$this->mpdf->tableLevel]++; - } else { - $this->mpdf->tbctr[$this->mpdf->tableLevel] = 1; - } - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['level'] = $this->mpdf->tableLevel; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['levelid'] = $this->mpdf->tbctr[$this->mpdf->tableLevel]; - if ($this->mpdf->tableLevel > $this->mpdf->innermostTableLevel) { - $this->mpdf->innermostTableLevel = $this->mpdf->tableLevel; - } - if ($this->mpdf->tableLevel > 1) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nestedpos'] = [$this->mpdf->row, $this->mpdf->col, $this->mpdf->tbctr[$this->mpdf->tableLevel - 1]]; - } - //++++++++++++++++++++++++++++ - $this->mpdf->cell = []; - $this->mpdf->col = -1; - //int - $this->mpdf->row = -1; - //int - $table =& $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]; - // New table - any level - $table['direction'] = $this->mpdf->directionality; - $table['bgcolor'] = \false; - $table['va'] = \false; - $table['txta'] = \false; - $table['topntail'] = \false; - $table['thead-underline'] = \false; - $table['border'] = \false; - $table['border_details']['R']['w'] = 0; - $table['border_details']['L']['w'] = 0; - $table['border_details']['T']['w'] = 0; - $table['border_details']['B']['w'] = 0; - $table['border_details']['R']['style'] = ''; - $table['border_details']['L']['style'] = ''; - $table['border_details']['T']['style'] = ''; - $table['border_details']['B']['style'] = ''; - $table['max_cell_border_width']['R'] = 0; - $table['max_cell_border_width']['L'] = 0; - $table['max_cell_border_width']['T'] = 0; - $table['max_cell_border_width']['B'] = 0; - $table['padding']['L'] = \false; - $table['padding']['R'] = \false; - $table['padding']['T'] = \false; - $table['padding']['B'] = \false; - $table['margin']['L'] = \false; - $table['margin']['R'] = \false; - $table['margin']['T'] = \false; - $table['margin']['B'] = \false; - $table['a'] = \false; - $table['border_spacing_H'] = \false; - $table['border_spacing_V'] = \false; - $table['decimal_align'] = \false; - $this->mpdf->Reset(); - $this->mpdf->InlineProperties = []; - $this->mpdf->InlineBDF = []; - // mPDF 6 - $this->mpdf->InlineBDFctr = 0; - // mPDF 6 - $table['nc'] = $table['nr'] = 0; - $this->mpdf->tablethead = 0; - $this->mpdf->tabletfoot = 0; - $this->mpdf->tabletheadjustfinished = \false; - // mPDF 6 - if ($this->mpdf->tableLevel > 1) { - // inherit table properties from cell in which nested - $table['direction'] = $direction; - $table['txta'] = $txta; - $table['cellLineHeight'] = $cellLineHeight; - $table['cellLineStackingStrategy'] = $cellLineStackingStrategy; - $table['cellLineStackingShift'] = $cellLineStackingShift; - } - $lastbottommargin = 0; - if ($this->mpdf->blockjustfinished && !\count($this->mpdf->textbuffer) && $this->mpdf->y != $this->mpdf->tMargin && $this->mpdf->collapseBlockMargins && $this->mpdf->tableLevel == 1) { - $lastbottommargin = $this->mpdf->lastblockbottommargin; - } - $this->mpdf->lastblockbottommargin = 0; - $this->mpdf->blockjustfinished = \false; - if ($this->mpdf->tableLevel == 1) { - $table['headernrows'] = 0; - $table['footernrows'] = 0; - $this->mpdf->base_table_properties = []; - } - // ADDED CSS FUNCIONS FOR TABLE - if ($this->cssManager->tbCSSlvl == 1) { - $properties = $this->cssManager->MergeCSS('TOPTABLE', 'TABLE', $attr); - } else { - $properties = $this->cssManager->MergeCSS('TABLE', 'TABLE', $attr); - } - $w = ''; - if (isset($properties['WIDTH'])) { - $w = $properties['WIDTH']; - } elseif (!empty($attr['WIDTH'])) { - $w = $attr['WIDTH']; - } - if (isset($attr['ALIGN']) && \array_key_exists(\strtolower($attr['ALIGN']), self::ALIGN)) { - $table['a'] = $this->getAlign($attr['ALIGN']); - } - if (!$table['a']) { - if ($table['direction'] === 'rtl') { - $table['a'] = 'R'; - } else { - $table['a'] = 'L'; - } - } - if (!empty($properties['DIRECTION'])) { - $table['direction'] = \strtolower($properties['DIRECTION']); - } elseif (!empty($attr['DIR'])) { - $table['direction'] = \strtolower($attr['DIR']); - } elseif ($this->mpdf->tableLevel == 1) { - $table['direction'] = $this->mpdf->blk[$this->mpdf->blklvl]['direction']; - } - if (isset($properties['BACKGROUND-COLOR'])) { - if ($table['bgcolor'] === \false) { - // @todo cleaner initialization - $table['bgcolor'] = []; - } - $table['bgcolor'][-1] = $properties['BACKGROUND-COLOR']; - } elseif (isset($properties['BACKGROUND'])) { - if ($table['bgcolor'] === \false) { - $table['bgcolor'] = []; - } - $table['bgcolor'][-1] = $properties['BACKGROUND']; - } elseif (isset($attr['BGCOLOR'])) { - if ($table['bgcolor'] === \false) { - $table['bgcolor'] = []; - } - $table['bgcolor'][-1] = $attr['BGCOLOR']; - } - if (isset($properties['VERTICAL-ALIGN']) && \array_key_exists(\strtolower($properties['VERTICAL-ALIGN']), self::ALIGN)) { - $table['va'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - if (isset($properties['TEXT-ALIGN']) && \array_key_exists(\strtolower($properties['TEXT-ALIGN']), self::ALIGN)) { - $table['txta'] = $this->getAlign($properties['TEXT-ALIGN']); - } - if (!empty($properties['AUTOSIZE']) && $this->mpdf->tableLevel == 1) { - $this->mpdf->shrink_this_table_to_fit = $properties['AUTOSIZE']; - if ($this->mpdf->shrink_this_table_to_fit < 1) { - $this->mpdf->shrink_this_table_to_fit = 0; - } - } - if (!empty($properties['ROTATE']) && $this->mpdf->tableLevel == 1) { - $this->mpdf->table_rotate = $properties['ROTATE']; - } - if (isset($properties['TOPNTAIL'])) { - $table['topntail'] = $properties['TOPNTAIL']; - } - if (isset($properties['THEAD-UNDERLINE'])) { - $table['thead-underline'] = $properties['THEAD-UNDERLINE']; - } - if (isset($properties['BORDER'])) { - $bord = $this->mpdf->border_details($properties['BORDER']); - if ($bord['s']) { - $table['border'] = Border::ALL; - $table['border_details']['R'] = $bord; - $table['border_details']['L'] = $bord; - $table['border_details']['T'] = $bord; - $table['border_details']['B'] = $bord; - } - } - if (isset($properties['BORDER-RIGHT'])) { - if ($table['direction'] === 'rtl') { - // *OTL* - $table['border_details']['R'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - // *OTL* - } else { - // *OTL* - $table['border_details']['R'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - } - // *OTL* - $this->mpdf->setBorder($table['border'], Border::RIGHT, $table['border_details']['R']['s']); - } - if (isset($properties['BORDER-LEFT'])) { - if ($table['direction'] === 'rtl') { - // *OTL* - $table['border_details']['L'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - // *OTL* - } else { - // *OTL* - $table['border_details']['L'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - } - // *OTL* - $this->mpdf->setBorder($table['border'], Border::LEFT, $table['border_details']['L']['s']); - } - if (isset($properties['BORDER-BOTTOM'])) { - $table['border_details']['B'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - $this->mpdf->setBorder($table['border'], Border::BOTTOM, $table['border_details']['B']['s']); - } - if (isset($properties['BORDER-TOP'])) { - $table['border_details']['T'] = $this->mpdf->border_details($properties['BORDER-TOP']); - $this->mpdf->setBorder($table['border'], Border::TOP, $table['border_details']['T']['s']); - } - $this->mpdf->table_border_css_set = 0; - if ($table['border']) { - $this->mpdf->table_border_css_set = 1; - } - // mPDF 6 - if (!empty($properties['LANG'])) { - if ($this->mpdf->autoLangToFont && !$this->mpdf->usingCoreFont) { - if ($properties['LANG'] != $this->mpdf->default_lang && $properties['LANG'] !== 'UTF-8') { - list($coreSuitable, $mpdf_pdf_unifont) = $this->languageToFont->getLanguageOptions($properties['LANG'], $this->mpdf->useAdobeCJK); - if ($mpdf_pdf_unifont) { - $properties['FONT-FAMILY'] = $mpdf_pdf_unifont; - } - } - } - $this->mpdf->currentLang = $properties['LANG']; - } - if (isset($properties['FONT-FAMILY'])) { - $this->mpdf->default_font = $properties['FONT-FAMILY']; - $this->mpdf->SetFont($this->mpdf->default_font, '', 0, \false); - } - $this->mpdf->base_table_properties['FONT-FAMILY'] = $this->mpdf->FontFamily; - if (isset($properties['FONT-SIZE'])) { - if ($this->mpdf->tableLevel > 1) { - $tableFontSize = $this->sizeConverter->convert($this->mpdf->base_table_properties['FONT-SIZE']); - $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $tableFontSize); - } else { - $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $this->mpdf->default_font_size / Mpdf::SCALE); - } - if ($mmsize) { - $this->mpdf->default_font_size = $mmsize * Mpdf::SCALE; - $this->mpdf->SetFontSize($this->mpdf->default_font_size, \false); - } - } - $this->mpdf->base_table_properties['FONT-SIZE'] = $this->mpdf->FontSize . 'mm'; - if (isset($properties['FONT-WEIGHT'])) { - if (\strtoupper($properties['FONT-WEIGHT']) === 'BOLD') { - $this->mpdf->base_table_properties['FONT-WEIGHT'] = 'BOLD'; - } - } - if (isset($properties['FONT-STYLE'])) { - if (\strtoupper($properties['FONT-STYLE']) === 'ITALIC') { - $this->mpdf->base_table_properties['FONT-STYLE'] = 'ITALIC'; - } - } - if (isset($properties['COLOR'])) { - $this->mpdf->base_table_properties['COLOR'] = $properties['COLOR']; - } - if (isset($properties['FONT-KERNING'])) { - $this->mpdf->base_table_properties['FONT-KERNING'] = $properties['FONT-KERNING']; - } - if (isset($properties['LETTER-SPACING'])) { - $this->mpdf->base_table_properties['LETTER-SPACING'] = $properties['LETTER-SPACING']; - } - if (isset($properties['WORD-SPACING'])) { - $this->mpdf->base_table_properties['WORD-SPACING'] = $properties['WORD-SPACING']; - } - // mPDF 6 - if (isset($properties['HYPHENS'])) { - $this->mpdf->base_table_properties['HYPHENS'] = $properties['HYPHENS']; - } - if (!empty($properties['LINE-HEIGHT'])) { - $table['cellLineHeight'] = $this->mpdf->fixLineheight($properties['LINE-HEIGHT']); - } elseif ($this->mpdf->tableLevel == 1) { - $table['cellLineHeight'] = $this->mpdf->blk[$this->mpdf->blklvl]['line_height']; - } - if (!empty($properties['LINE-STACKING-STRATEGY'])) { - $table['cellLineStackingStrategy'] = \strtolower($properties['LINE-STACKING-STRATEGY']); - } elseif ($this->mpdf->tableLevel == 1 && isset($this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_strategy'])) { - $table['cellLineStackingStrategy'] = $this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_strategy']; - } else { - $table['cellLineStackingStrategy'] = 'inline-line-height'; - } - if (!empty($properties['LINE-STACKING-SHIFT'])) { - $table['cellLineStackingShift'] = \strtolower($properties['LINE-STACKING-SHIFT']); - } elseif ($this->mpdf->tableLevel == 1 && isset($this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_shift'])) { - $table['cellLineStackingShift'] = $this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_shift']; - } else { - $table['cellLineStackingShift'] = 'consider-shifts'; - } - if (isset($properties['PADDING-LEFT'])) { - $table['padding']['L'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-RIGHT'])) { - $table['padding']['R'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-TOP'])) { - $table['padding']['T'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-BOTTOM'])) { - $table['padding']['B'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-TOP'])) { - if ($lastbottommargin) { - $tmp = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - if ($tmp > $lastbottommargin) { - $properties['MARGIN-TOP'] = (int) $properties['MARGIN-TOP'] - $lastbottommargin; - } else { - $properties['MARGIN-TOP'] = 0; - } - } - $table['margin']['T'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $table['margin']['B'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'])) { - $table['margin']['L'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-RIGHT'])) { - $table['margin']['R'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'], $properties['MARGIN-RIGHT']) && \strtolower($properties['MARGIN-LEFT']) === 'auto' && \strtolower($properties['MARGIN-RIGHT']) === 'auto') { - $table['a'] = 'C'; - } elseif (isset($properties['MARGIN-LEFT']) && \strtolower($properties['MARGIN-LEFT']) === 'auto') { - $table['a'] = 'R'; - } elseif (isset($properties['MARGIN-RIGHT']) && \strtolower($properties['MARGIN-RIGHT']) === 'auto') { - $table['a'] = 'L'; - } - if (isset($properties['BORDER-COLLAPSE']) && \strtoupper($properties['BORDER-COLLAPSE']) === 'SEPARATE') { - $table['borders_separate'] = \true; - } else { - $table['borders_separate'] = \false; - } - // mPDF 5.7.3 - if (isset($properties['BORDER-SPACING-H'])) { - $table['border_spacing_H'] = $this->sizeConverter->convert($properties['BORDER-SPACING-H'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['BORDER-SPACING-V'])) { - $table['border_spacing_V'] = $this->sizeConverter->convert($properties['BORDER-SPACING-V'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - // mPDF 5.7.3 - if (!$table['borders_separate']) { - $table['border_spacing_H'] = $table['border_spacing_V'] = 0; - } - if (isset($properties['EMPTY-CELLS'])) { - $table['empty_cells'] = \strtolower($properties['EMPTY-CELLS']); - // 'hide' or 'show' - } else { - $table['empty_cells'] = ''; - } - if (isset($properties['PAGE-BREAK-INSIDE']) && \strtoupper($properties['PAGE-BREAK-INSIDE']) === 'AVOID' && $this->mpdf->tableLevel == 1 && !$this->mpdf->writingHTMLfooter) { - $this->mpdf->table_keep_together = \true; - } elseif ($this->mpdf->tableLevel == 1) { - $this->mpdf->table_keep_together = \false; - } - if (isset($properties['PAGE-BREAK-AFTER']) && $this->mpdf->tableLevel == 1) { - $table['page_break_after'] = \strtoupper($properties['PAGE-BREAK-AFTER']); - } - /* -- BACKGROUNDS -- */ - if (isset($properties['BACKGROUND-GRADIENT']) && !$this->mpdf->kwt && !$this->mpdf->ColActive) { - $table['gradient'] = $properties['BACKGROUND-GRADIENT']; - } - if (!empty($properties['BACKGROUND-IMAGE']) && !$this->mpdf->kwt && !$this->mpdf->ColActive) { - $ret = $this->mpdf->SetBackground($properties, $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - if ($ret) { - $table['background-image'] = $ret; - } - } - /* -- END BACKGROUNDS -- */ - if (isset($properties['OVERFLOW'])) { - $table['overflow'] = \strtolower($properties['OVERFLOW']); - // 'hidden' 'wrap' or 'visible' or 'auto' - if (($this->mpdf->ColActive || $this->mpdf->tableLevel > 1) && $table['overflow'] === 'visible') { - unset($table['overflow']); - } - } - if (isset($attr['CELLPADDING'])) { - $table['cell_padding'] = $attr['CELLPADDING']; - } else { - $table['cell_padding'] = \false; - } - if (isset($attr['BORDER']) && $attr['BORDER'] == '1') { - $this->mpdf->table_border_attr_set = 1; - $bord = $this->mpdf->border_details('#000000 1px solid'); - if ($bord['s']) { - $table['border'] = Border::ALL; - $table['border_details']['R'] = $bord; - $table['border_details']['L'] = $bord; - $table['border_details']['T'] = $bord; - $table['border_details']['B'] = $bord; - } - } else { - $this->mpdf->table_border_attr_set = 0; - } - if ($w) { - $maxwidth = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; - if ($table['borders_separate']) { - $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['border_details']['L']['w'] / 2 + $table['border_details']['R']['w'] / 2; - } else { - $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2; - } - if (\strpos($w, '%') && $this->mpdf->tableLevel == 1 && !$this->mpdf->ignore_table_percents) { - // % needs to be of inner box without table margins etc. - $maxwidth -= $tblblw; - $wmm = $this->sizeConverter->convert($w, $maxwidth, $this->mpdf->FontSize, \false); - $table['w'] = $wmm + $tblblw; - } - if (\strpos($w, '%') && $this->mpdf->tableLevel > 1 && !$this->mpdf->ignore_table_percents && $this->mpdf->keep_table_proportions) { - $table['wpercent'] = (int) $w; - // makes 80% -> 80 - } - if (!\strpos($w, '%') && !$this->mpdf->ignore_table_widths) { - $wmm = $this->sizeConverter->convert($w, $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - $table['w'] = $wmm + $tblblw; - } - if (!$this->mpdf->keep_table_proportions) { - if (isset($table['w']) && $table['w'] > $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']) { - $table['w'] = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; - } - } - } - if (isset($attr['AUTOSIZE']) && $this->mpdf->tableLevel == 1) { - $this->mpdf->shrink_this_table_to_fit = $attr['AUTOSIZE']; - if ($this->mpdf->shrink_this_table_to_fit < 1) { - $this->mpdf->shrink_this_table_to_fit = 1; - } - } - if (isset($attr['ROTATE']) && $this->mpdf->tableLevel == 1) { - $this->mpdf->table_rotate = $attr['ROTATE']; - } - //++++++++++++++++++++++++++++ - if ($this->mpdf->table_rotate) { - $this->mpdf->tbrot_Links = []; - $this->mpdf->tbrot_Annots = []; - $this->mpdf->tbrotForms = []; - $this->mpdf->tbrot_BMoutlines = []; - $this->mpdf->tbrot_toc = []; - } - if ($this->mpdf->kwt) { - if ($this->mpdf->table_rotate) { - $this->mpdf->table_keep_together = \true; - } - $this->mpdf->kwt = \false; - $this->mpdf->kwt_saved = \true; - } - //++++++++++++++++++++++++++++ - $this->mpdf->plainCell_properties = []; - unset($table); - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = ''; - unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); - $this->cssManager->tbCSSlvl--; - $this->mpdf->ignorefollowingspaces = \true; - //Eliminate exceeding left-side spaces - // mPDF 5.7.3 - // In case a colspan (on a row after first row) exceeded number of columns in table - for ($k = 0; $k < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']; $k++) { - for ($l = 0; $l < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc']; $l++) { - if (!isset($this->mpdf->cell[$k][$l])) { - for ($n = $l - 1; $n >= 0; $n--) { - if (isset($this->mpdf->cell[$k][$n]) && $this->mpdf->cell[$k][$n] != 0) { - break; - } - } - $this->mpdf->cell[$k][$l] = ['a' => 'C', 'va' => 'M', 'R' => \false, 'nowrap' => \false, 'bgcolor' => \false, 'padding' => ['L' => \false, 'R' => \false, 'T' => \false, 'B' => \false], 'gradient' => \false, 's' => 0, 'maxs' => 0, 'textbuffer' => [], 'dfs' => $this->mpdf->FontSize]; - if (!$this->mpdf->simpleTables) { - $this->mpdf->cell[$k][$l]['border'] = 0; - $this->mpdf->cell[$k][$l]['border_details']['R'] = ['s' => 0, 'w' => 0, 'c' => \false, 'style' => 'none', 'dom' => 0]; - $this->mpdf->cell[$k][$l]['border_details']['L'] = ['s' => 0, 'w' => 0, 'c' => \false, 'style' => 'none', 'dom' => 0]; - $this->mpdf->cell[$k][$l]['border_details']['T'] = ['s' => 0, 'w' => 0, 'c' => \false, 'style' => 'none', 'dom' => 0]; - $this->mpdf->cell[$k][$l]['border_details']['B'] = ['s' => 0, 'w' => 0, 'c' => \false, 'style' => 'none', 'dom' => 0]; - $this->mpdf->cell[$k][$l]['border_details']['mbw'] = ['BL' => 0, 'BR' => 0, 'RT' => 0, 'RB' => 0, 'TL' => 0, 'TR' => 0, 'LT' => 0, 'LB' => 0]; - if ($this->mpdf->packTableData) { - $this->mpdf->cell[$k][$l]['borderbin'] = $this->mpdf->_packCellBorder($this->mpdf->cell[$k][$l]); - unset($this->mpdf->cell[$k][$l]['border'], $this->mpdf->cell[$k][$l]['border_details']); - } - } - } - } - } - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] = $this->mpdf->cell; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['wc'] = \array_pad([], $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc'], ['miw' => 0, 'maw' => 0]); - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['hr'] = \array_pad([], $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr'], 0); - // Move table footer <tfoot> row to end of table - if (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) && \count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'])) { - $tfrows = []; - foreach ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'] as $r => $val) { - if ($val) { - $tfrows[] = $r; - } - } - $temp = []; - $temptf = []; - foreach ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] as $k => $row) { - if (\in_array($k, $tfrows)) { - $temptf[] = $row; - } else { - $temp[] = $row; - } - } - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'] = []; - for ($i = \count($temp); $i < \count($temp) + \count($temptf); $i++) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'][$i] = \true; - } - // Update nestedpos row references - if (isset($this->mpdf->table[$this->mpdf->tableLevel + 1]) && \count($this->mpdf->table[$this->mpdf->tableLevel + 1])) { - foreach ($this->mpdf->table[$this->mpdf->tableLevel + 1] as $nid => $nested) { - $this->mpdf->table[$this->mpdf->tableLevel + 1][$nid]['nestedpos'][0] -= \count($temptf); - } - } - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] = \array_merge($temp, $temptf); - // Update other arays set on row number - // [trbackground-images] [trgradients] - $temptrbgi = []; - $temptrbgg = []; - $temptrbgc = []; - if (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][-1])) { - $temptrbgc[-1] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][-1]; - } - for ($k = 0; $k < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']; $k++) { - if (!\in_array($k, $tfrows)) { - $temptrbgi[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k]) ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k] : null; - $temptrbgg[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k]) ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k] : null; - $temptrbgc[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k]) ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k] : null; - } - } - for ($k = 0; $k < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']; $k++) { - if (\in_array($k, $tfrows)) { - $temptrbgi[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k]) ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k] : null; - $temptrbgg[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k]) ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k] : null; - $temptrbgc[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k]) ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k] : null; - } - } - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'] = $temptrbgi; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'] = $temptrbgg; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] = $temptrbgc; - // Should Update all other arays set on row number, but cell properties have been set so not needed - // [bgcolor] [trborder-left] [trborder-right] [trborder-top] [trborder-bottom] - } - if ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['direction'] === 'rtl') { - $this->mpdf->_reverseTableDir($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]); - } - // Fix Borders ********************************************* - $this->mpdf->_fixTableBorders($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]); - if ($this->mpdf->ColActive) { - $this->mpdf->table_rotate = 0; - } - // *COLUMNS* - if ($this->mpdf->table_rotate != 0) { - $this->mpdf->tablebuffer = ''; - // Max width for rotated table - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 1); - $this->mpdf->tbrot_maxh = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; - // Max width for rotated table - $this->mpdf->tbrot_align = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['a']; - } - $this->mpdf->shrin_k = 1; - if ($this->mpdf->shrink_tables_to_fit < 1) { - $this->mpdf->shrink_tables_to_fit = 1; - } - if (!$this->mpdf->shrink_this_table_to_fit) { - $this->mpdf->shrink_this_table_to_fit = $this->mpdf->shrink_tables_to_fit; - } - if ($this->mpdf->tableLevel > 1) { - // deal with nested table - $this->mpdf->_tableColumnWidth($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]], \true); - $tmiw = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['miw']; - $tmaw = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['maw']; - $tl = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['tl']; - // Go down to lower table level - $this->mpdf->tableLevel--; - // Reset lower level table - $this->mpdf->base_table_properties = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['baseProperties']; - // mPDF 5.7.3 - $this->mpdf->default_font = $this->mpdf->base_table_properties['FONT-FAMILY']; - $this->mpdf->SetFont($this->mpdf->default_font, '', 0, \false); - $this->mpdf->default_font_size = $this->sizeConverter->convert($this->mpdf->base_table_properties['FONT-SIZE']) * Mpdf::SCALE; - $this->mpdf->SetFontSize($this->mpdf->default_font_size, \false); - $this->mpdf->cell = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells']; - if (isset($this->mpdf->cell['PARENTCELL'])) { - if ($this->mpdf->cell['PARENTCELL']) { - $this->mpdf->restoreInlineProperties($this->mpdf->cell['PARENTCELL']); - } - unset($this->mpdf->cell['PARENTCELL']); - } - $this->mpdf->row = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currrow']; - $this->mpdf->col = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currcol']; - $objattr = []; - $objattr['type'] = 'nestedtable'; - $objattr['nestedcontent'] = $this->mpdf->tbctr[$this->mpdf->tableLevel + 1]; - $objattr['table'] = $this->mpdf->tbctr[$this->mpdf->tableLevel]; - $objattr['row'] = $this->mpdf->row; - $objattr['col'] = $this->mpdf->col; - $objattr['level'] = $this->mpdf->tableLevel; - $e = Mpdf::OBJECT_IDENTIFIER . "type=nestedtable,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - $this->mpdf->_saveCellTextBuffer($e); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $tl; - if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; - // reset - if (isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw']) && $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw'] < $tmaw || !isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw'] = $tmaw; - } - if (isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw']) && $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw'] < $tmiw || !isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw'])) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw'] = $tmiw; - } - $this->mpdf->tdbegin = \true; - $this->mpdf->nestedtablejustfinished = \true; - $this->mpdf->ignorefollowingspaces = \true; - return; - } - $this->mpdf->cMarginL = 0; - $this->mpdf->cMarginR = 0; - $this->mpdf->cMarginT = 0; - $this->mpdf->cMarginB = 0; - $this->mpdf->cellPaddingL = 0; - $this->mpdf->cellPaddingR = 0; - $this->mpdf->cellPaddingT = 0; - $this->mpdf->cellPaddingB = 0; - if (isset($this->mpdf->table[1][1]['overflow']) && $this->mpdf->table[1][1]['overflow'] === 'visible') { - if ($this->mpdf->kwt || $this->mpdf->table_rotate || $this->mpdf->table_keep_together || $this->mpdf->ColActive) { - $this->mpdf->kwt = \false; - $this->mpdf->table_rotate = 0; - $this->mpdf->table_keep_together = \false; - //throw new \Mpdf\MpdfException("mPDF Warning: You cannot use CSS overflow:visible together with any of these functions: - // 'Keep-with-table', rotated tables, page-break-inside:avoid, or columns"); - } - $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1], \true); - $this->mpdf->_tableWidth($this->mpdf->table[1][1]); - } else { - if (!$this->mpdf->kwt_saved) { - $this->mpdf->kwt_height = 0; - } - list($check, $tablemiw) = $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1], \true); - $save_table = $this->mpdf->table; - $reset_to_minimum_width = \false; - $added_page = \false; - if ($check > 1) { - if ($check > $this->mpdf->shrink_this_table_to_fit && $this->mpdf->table_rotate) { - if ($this->mpdf->y != $this->mpdf->tMargin) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $this->mpdf->kwt_moved = \true; - } - $added_page = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - //$check = $tablemiw/$this->mpdf->tbrot_maxw; // undo any shrink - $check = 1; - // undo any shrink - } - $reset_to_minimum_width = \true; - } - if ($reset_to_minimum_width) { - $this->mpdf->shrin_k = $check; - $this->mpdf->default_font_size /= $this->mpdf->shrin_k; - $this->mpdf->SetFontSize($this->mpdf->default_font_size, \false); - $this->mpdf->shrinkTable($this->mpdf->table[1][1], $this->mpdf->shrin_k); - $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1]); - // repeat - // Starting at $this->mpdf->innermostTableLevel - // Shrink table values - and redo columnWidth - for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { - for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { - $this->mpdf->shrinkTable($this->mpdf->table[$lvl][$nid], $this->mpdf->shrin_k); - $this->mpdf->_tableColumnWidth($this->mpdf->table[$lvl][$nid]); - } - } - } - // Set table cell widths for top level table - // Use $shrin_k to resize but don't change again - $this->mpdf->SetLineHeight('', $this->mpdf->table[1][1]['cellLineHeight']); - // Top level table - $this->mpdf->_tableWidth($this->mpdf->table[1][1]); - } - // Now work through any nested tables setting child table[w'] = parent cell['w'] - // Now do nested tables _tableWidth - for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { - for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { - // HERE set child table width = cell width - list($parentrow, $parentcol, $parentnid) = $this->mpdf->table[$lvl][$nid]['nestedpos']; - $c =& $this->mpdf->table[$lvl - 1][$parentnid]['cells'][$parentrow][$parentcol]; - if (isset($c['colspan']) && $c['colspan'] > 1) { - $parentwidth = 0; - for ($cs = 0; $cs < $c['colspan']; $cs++) { - $parentwidth += $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol + $cs]; - } - } else { - $parentwidth = $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol]; - } - //$parentwidth -= ALLOW FOR PADDING ETC. in parent cell - if (!$this->mpdf->simpleTables) { - if ($this->mpdf->packTableData) { - list($bt, $br, $bb, $bl) = $this->mpdf->_getBorderWidths($c['borderbin']); - } else { - $br = $c['border_details']['R']['w']; - $bl = $c['border_details']['L']['w']; - } - if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { - $parentwidth -= $br + $bl + $c['padding']['L'] + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; - } else { - $parentwidth -= $br / 2 + $bl / 2 + $c['padding']['L'] + $c['padding']['R']; - } - } elseif ($this->mpdf->simpleTables) { - if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { - $parentwidth -= $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; - } else { - $parentwidth -= $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] / 2 + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w'] / 2 + $c['padding']['L'] + $c['padding']['R']; - } - } - if (!empty($this->mpdf->table[$lvl][$nid]['wpercent']) && $lvl > 1) { - $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; - } elseif ($parentwidth > $this->mpdf->table[$lvl][$nid]['maw']) { - $this->mpdf->table[$lvl][$nid]['w'] = $this->mpdf->table[$lvl][$nid]['maw']; - } else { - $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; - } - unset($c); - $this->mpdf->_tableWidth($this->mpdf->table[$lvl][$nid]); - } - } - // Starting at $this->mpdf->innermostTableLevel - // Cascade back up nested tables: setting heights back up the tree - for ($lvl = $this->mpdf->innermostTableLevel; $lvl > 0; $lvl--) { - for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { - list($tableheight, $maxrowheight, $fullpage, $remainingpage, $maxfirstrowheight) = $this->mpdf->_tableHeight($this->mpdf->table[$lvl][$nid]); - } - } - if ($this->mpdf->table[1][1]['overflow'] === 'visible') { - if ($maxrowheight > $fullpage) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('mPDF Warning: A Table row is greater than available height. You cannot use CSS overflow:visible'); - } - if ($maxfirstrowheight > $remainingpage) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } - $r = 0; - $c = 0; - $p = 0; - $y = 0; - $finished = \false; - while (!$finished) { - list($finished, $r, $c, $p, $y, $y0) = $this->mpdf->_tableWrite($this->mpdf->table[1][1], \true, $r, $c, $p, $y); - if (!$finished) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - // If printed something on first spread, set same y - if ($r == 0 && $y0 > -1) { - $this->mpdf->y = $y0; - } - } - } - } else { - $recalculate = 1; - $forcerecalc = \false; - // RESIZING ALGORITHM - if ($maxrowheight > $fullpage) { - $recalculate = $this->tbsqrt($maxrowheight / $fullpage, 1); - $forcerecalc = \true; - } elseif ($this->mpdf->table_rotate) { - // NB $remainingpage == $fullpage == the width of the page - if ($tableheight > $remainingpage) { - // If can fit on remainder of page whilst respecting autsize value.. - if ($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1) <= $this->mpdf->shrink_this_table_to_fit) { - $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); - } elseif (!$added_page) { - if ($this->mpdf->y != $this->mpdf->tMargin) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $this->mpdf->kwt_moved = \true; - } - $added_page = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - // 0.001 to force it to recalculate - $recalculate = 1 / $this->mpdf->shrin_k + 0.001; - // undo any shrink - } - } else { - $recalculate = 1; - } - } elseif ($this->mpdf->table_keep_together || $this->mpdf->table[1][1]['nr'] == 1 && !$this->mpdf->writingHTMLfooter) { - if ($tableheight > $fullpage) { - if ($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $fullpage, 1) <= $this->mpdf->shrink_this_table_to_fit) { - $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); - } elseif ($this->mpdf->tableMinSizePriority) { - $this->mpdf->table_keep_together = \false; - $recalculate = 1.001; - } else { - if ($this->mpdf->y != $this->mpdf->tMargin) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $this->mpdf->kwt_moved = \true; - } - $added_page = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); - } - } elseif ($tableheight > $remainingpage) { - // If can fit on remainder of page whilst respecting autsize value.. - if ($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1) <= $this->mpdf->shrink_this_table_to_fit) { - $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); - } else { - if ($this->mpdf->y != $this->mpdf->tMargin) { - // mPDF 6 - if ($this->mpdf->AcceptPageBreak()) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } elseif ($this->mpdf->ColActive && $tableheight > $this->mpdf->h - $this->mpdf->bMargin - $this->mpdf->y0) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } - $this->mpdf->kwt_moved = \true; - } - $added_page = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - $recalculate = 1.001; - } - } else { - $recalculate = 1; - } - } else { - $recalculate = 1; - } - if ($recalculate > $this->mpdf->shrink_this_table_to_fit && !$forcerecalc) { - $recalculate = $this->mpdf->shrink_this_table_to_fit; - } - $iteration = 1; - // RECALCULATE - while ($recalculate != 1) { - $this->mpdf->shrin_k1 = $recalculate; - $this->mpdf->shrin_k *= $recalculate; - $this->mpdf->default_font_size /= $this->mpdf->shrin_k1; - $this->mpdf->SetFontSize($this->mpdf->default_font_size, \false); - $this->mpdf->SetLineHeight('', $this->mpdf->table[1][1]['cellLineHeight']); - $this->mpdf->table = $save_table; - if ($this->mpdf->shrin_k != 1) { - $this->mpdf->shrinkTable($this->mpdf->table[1][1], $this->mpdf->shrin_k); - } - $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1]); - // repeat - // Starting at $this->mpdf->innermostTableLevel - // Shrink table values - and redo columnWidth - for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { - for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { - if ($this->mpdf->shrin_k != 1) { - $this->mpdf->shrinkTable($this->mpdf->table[$lvl][$nid], $this->mpdf->shrin_k); - } - $this->mpdf->_tableColumnWidth($this->mpdf->table[$lvl][$nid]); - } - } - // Set table cell widths for top level table - // Top level table - $this->mpdf->_tableWidth($this->mpdf->table[1][1]); - // Now work through any nested tables setting child table[w'] = parent cell['w'] - // Now do nested tables _tableWidth - for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { - for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { - // HERE set child table width = cell width - list($parentrow, $parentcol, $parentnid) = $this->mpdf->table[$lvl][$nid]['nestedpos']; - $c =& $this->mpdf->table[$lvl - 1][$parentnid]['cells'][$parentrow][$parentcol]; - if (isset($c['colspan']) && $c['colspan'] > 1) { - $parentwidth = 0; - for ($cs = 0; $cs < $c['colspan']; $cs++) { - $parentwidth += $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol + $cs]; - } - } else { - $parentwidth = $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol]; - } - //$parentwidth -= ALLOW FOR PADDING ETC.in parent cell - if (!$this->mpdf->simpleTables) { - if ($this->mpdf->packTableData) { - list($bt, $br, $bb, $bl) = $this->mpdf->_getBorderWidths($c['borderbin']); - } else { - $br = $c['border_details']['R']['w']; - $bl = $c['border_details']['L']['w']; - } - if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { - $parentwidth -= $br + $bl + $c['padding']['L'] + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; - } else { - $parentwidth -= $br / 2 + $bl / 2 + $c['padding']['L'] + $c['padding']['R']; - } - } elseif ($this->mpdf->simpleTables) { - if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { - $parentwidth -= $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; - } else { - $parentwidth -= ($this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w']) / 2 + $c['padding']['L'] + $c['padding']['R']; - } - } - if (!empty($this->mpdf->table[$lvl][$nid]['wpercent']) && $lvl > 1) { - $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; - } elseif ($parentwidth > $this->mpdf->table[$lvl][$nid]['maw']) { - $this->mpdf->table[$lvl][$nid]['w'] = $this->mpdf->table[$lvl][$nid]['maw']; - } else { - $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; - } - unset($c); - $this->mpdf->_tableWidth($this->mpdf->table[$lvl][$nid]); - } - } - // Starting at $this->mpdf->innermostTableLevel - // Cascade back up nested tables: setting heights back up the tree - for ($lvl = $this->mpdf->innermostTableLevel; $lvl > 0; $lvl--) { - for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { - list($tableheight, $maxrowheight, $fullpage, $remainingpage, $maxfirstrowheight) = $this->mpdf->_tableHeight($this->mpdf->table[$lvl][$nid]); - } - } - // RESIZING ALGORITHM - if ($maxrowheight > $fullpage) { - $recalculate = $this->tbsqrt($maxrowheight / $fullpage, $iteration); - $iteration++; - } elseif ($this->mpdf->table_rotate && $tableheight > $remainingpage && !$added_page) { - // If can fit on remainder of page whilst respecting autosize value.. - if ($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration) <= $this->mpdf->shrink_this_table_to_fit) { - $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); - $iteration++; - } else { - if (!$added_page) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $added_page = \true; - $this->mpdf->kwt_moved = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - } - // 0.001 to force it to recalculate - $recalculate = 1 / $this->mpdf->shrin_k + 0.001; - // undo any shrink - } - } elseif ($this->mpdf->table_keep_together || $this->mpdf->table[1][1]['nr'] == 1 && !$this->mpdf->writingHTMLfooter) { - if ($tableheight > $fullpage) { - if ($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $fullpage, $iteration) <= $this->mpdf->shrink_this_table_to_fit) { - $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); - $iteration++; - } elseif ($this->mpdf->tableMinSizePriority) { - $this->mpdf->table_keep_together = \false; - $recalculate = 1 / $this->mpdf->shrin_k + 0.001; - } else { - if (!$added_page && $this->mpdf->y != $this->mpdf->tMargin) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $added_page = \true; - $this->mpdf->kwt_moved = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - } - $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); - $iteration++; - } - } elseif ($tableheight > $remainingpage) { - // If can fit on remainder of page whilst respecting autosize value.. - if ($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration) <= $this->mpdf->shrink_this_table_to_fit) { - $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); - $iteration++; - } else { - if (!$added_page) { - // mPDF 6 - if ($this->mpdf->AcceptPageBreak()) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } elseif ($this->mpdf->ColActive && $tableheight > $this->mpdf->h - $this->mpdf->bMargin - $this->mpdf->y0) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } - $added_page = \true; - $this->mpdf->kwt_moved = \true; - $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; - } - //$recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; - $recalculate = 1 / $this->mpdf->shrin_k + 0.001; - // undo any shrink - } - } else { - $recalculate = 1; - } - } else { - $recalculate = 1; - } - } - if ($maxfirstrowheight > $remainingpage && !$added_page && !$this->mpdf->table_rotate && !$this->mpdf->ColActive && !$this->mpdf->table_keep_together && !$this->mpdf->writingHTMLheader && !$this->mpdf->writingHTMLfooter) { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - $this->mpdf->kwt_moved = \true; - } - // keep-with-table: if page has advanced, print out buffer now, else done in fn. _Tablewrite() - if ($this->mpdf->kwt_saved && $this->mpdf->kwt_moved) { - $this->mpdf->printkwtbuffer(); - $this->mpdf->kwt_moved = \false; - $this->mpdf->kwt_saved = \false; - } - // Recursively writes all tables starting at top level - $this->mpdf->_tableWrite($this->mpdf->table[1][1]); - if ($this->mpdf->table_rotate && $this->mpdf->tablebuffer) { - $this->mpdf->PageBreakTrigger = $this->mpdf->h - $this->mpdf->bMargin; - $save_tr = $this->mpdf->table_rotate; - $save_y = $this->mpdf->y; - $this->mpdf->table_rotate = 0; - $this->mpdf->y = $this->mpdf->tbrot_y0; - $h = $this->mpdf->tbrot_w; - $this->mpdf->DivLn($h, $this->mpdf->blklvl); - $this->mpdf->table_rotate = $save_tr; - $this->mpdf->y = $save_y; - $this->mpdf->printtablebuffer(); - } - $this->mpdf->table_rotate = 0; - } - $this->mpdf->x = $this->mpdf->lMargin + $this->mpdf->blk[$this->mpdf->blklvl]['outer_left_margin']; - $this->mpdf->maxPosR = \max($this->mpdf->maxPosR, $this->mpdf->x + $this->mpdf->table[1][1]['w']); - $this->mpdf->blockjustfinished = \true; - $this->mpdf->lastblockbottommargin = $this->mpdf->table[1][1]['margin']['B']; - //Reset values - $page_break_after = ''; - if (isset($this->mpdf->table[1][1]['page_break_after'])) { - $page_break_after = $this->mpdf->table[1][1]['page_break_after']; - } - // Keep-with-table - $this->mpdf->kwt = \false; - $this->mpdf->kwt_y0 = 0; - $this->mpdf->kwt_x0 = 0; - $this->mpdf->kwt_height = 0; - $this->mpdf->kwt_buffer = []; - $this->mpdf->kwt_Links = []; - $this->mpdf->kwt_Annots = []; - $this->mpdf->kwt_moved = \false; - $this->mpdf->kwt_saved = \false; - $this->mpdf->kwt_Reference = []; - $this->mpdf->kwt_BMoutlines = []; - $this->mpdf->kwt_toc = []; - $this->mpdf->shrin_k = 1; - $this->mpdf->shrink_this_table_to_fit = 0; - $this->mpdf->table = []; - //array - $this->mpdf->tableLevel = 0; - $this->mpdf->tbctr = []; - $this->mpdf->innermostTableLevel = 0; - $this->cssManager->tbCSSlvl = 0; - $this->cssManager->tablecascadeCSS = []; - $this->mpdf->cell = []; - //array - $this->mpdf->col = -1; - //int - $this->mpdf->row = -1; - //int - $this->mpdf->Reset(); - $this->mpdf->cellPaddingL = 0; - $this->mpdf->cellPaddingT = 0; - $this->mpdf->cellPaddingR = 0; - $this->mpdf->cellPaddingB = 0; - $this->mpdf->cMarginL = 0; - $this->mpdf->cMarginT = 0; - $this->mpdf->cMarginR = 0; - $this->mpdf->cMarginB = 0; - $this->mpdf->default_font_size = $this->mpdf->original_default_font_size; - $this->mpdf->default_font = $this->mpdf->original_default_font; - $this->mpdf->SetFontSize($this->mpdf->default_font_size, \false); - $this->mpdf->SetFont($this->mpdf->default_font, '', 0, \false); - $this->mpdf->SetLineHeight(); - if (isset($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties'])) { - $this->mpdf->restoreInlineProperties($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties']); - } - if ($page_break_after) { - $save_blklvl = $this->mpdf->blklvl; - $save_blk = $this->mpdf->blk; - $save_silp = $this->mpdf->saveInlineProperties(); - $save_ilp = $this->mpdf->InlineProperties; - $save_bflp = $this->mpdf->InlineBDF; - $save_bflpc = $this->mpdf->InlineBDFctr; - // mPDF 6 - // mPDF 6 pagebreaktype - $startpage = $this->mpdf->page; - $pagebreaktype = $this->mpdf->defaultPagebreakType; - if ($this->mpdf->ColActive) { - $pagebreaktype = 'cloneall'; - } - // mPDF 6 pagebreaktype - $this->mpdf->_preForcedPagebreak($pagebreaktype); - if ($page_break_after === 'RIGHT') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-ODD'); - } elseif ($page_break_after === 'LEFT') { - $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-EVEN'); - } else { - $this->mpdf->AddPage($this->mpdf->CurOrientation); - } - // mPDF 6 pagebreaktype - $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); - $this->mpdf->InlineProperties = $save_ilp; - $this->mpdf->InlineBDF = $save_bflp; - $this->mpdf->InlineBDFctr = $save_bflpc; - // mPDF 6 - $this->mpdf->restoreInlineProperties($save_silp); - } - } - /** - * This function determines the shrink factor when resizing tables - * val is the table_height / page_height_available - * returns a scaling factor used as $shrin_k to resize the table - * Overcompensating will be quicker but may unnecessarily shrink table too much - * Undercompensating means it will reiterate more times (taking more processing time) - */ - private function tbsqrt($val, $iteration = 3) - { - // Alters number of iterations until it returns $val itself - Must be > 2 - $k = 4; - // Probably best guess and most accurate - if ($iteration === 1) { - return \sqrt($val); - } - // Faster than using sqrt (because it won't undercompensate), and gives reasonable results - // return 1 + (($val - 1) / 2); - $x = 2 - ($iteration - 2) / ($k - 2); - if ($x === 0) { - $ret = $val + 1.0E-5; - } elseif ($x < 0) { - $ret = 1 + \pow(2, $iteration - 2 - $k) / 1000; - } else { - $ret = 1 + ($val - 1) / $x; - } - return $ret; - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Tag.php b/dependencies/mpdf/mpdf/src/Tag/Tag.php deleted file mode 100644 index 84730ed..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Tag.php +++ /dev/null @@ -1,85 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Strict; -use WP_Ultimo\Dependencies\Mpdf\Cache; -use WP_Ultimo\Dependencies\Mpdf\Color\ColorConverter; -use WP_Ultimo\Dependencies\Mpdf\CssManager; -use WP_Ultimo\Dependencies\Mpdf\Form; -use WP_Ultimo\Dependencies\Mpdf\Image\ImageProcessor; -use WP_Ultimo\Dependencies\Mpdf\Language\LanguageToFontInterface; -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Otl; -use WP_Ultimo\Dependencies\Mpdf\SizeConverter; -use WP_Ultimo\Dependencies\Mpdf\TableOfContents; -abstract class Tag -{ - use Strict; - /** - * @var \Mpdf\Mpdf - */ - protected $mpdf; - /** - * @var \Mpdf\Cache - */ - protected $cache; - /** - * @var \Mpdf\CssManager - */ - protected $cssManager; - /** - * @var \Mpdf\Form - */ - protected $form; - /** - * @var \Mpdf\Otl - */ - protected $otl; - /** - * @var \Mpdf\TableOfContents - */ - protected $tableOfContents; - /** - * @var \Mpdf\SizeConverter - */ - protected $sizeConverter; - /** - * @var \Mpdf\Color\ColorConverter - */ - protected $colorConverter; - /** - * @var \Mpdf\Image\ImageProcessor - */ - protected $imageProcessor; - /** - * @var \Mpdf\Language\LanguageToFontInterface - */ - protected $languageToFont; - const ALIGN = ['left' => 'L', 'center' => 'C', 'right' => 'R', 'top' => 'T', 'text-top' => 'TT', 'middle' => 'M', 'baseline' => 'BS', 'bottom' => 'B', 'text-bottom' => 'TB', 'justify' => 'J']; - public function __construct(Mpdf $mpdf, Cache $cache, CssManager $cssManager, Form $form, Otl $otl, TableOfContents $tableOfContents, SizeConverter $sizeConverter, ColorConverter $colorConverter, ImageProcessor $imageProcessor, LanguageToFontInterface $languageToFont) - { - $this->mpdf = $mpdf; - $this->cache = $cache; - $this->cssManager = $cssManager; - $this->form = $form; - $this->otl = $otl; - $this->tableOfContents = $tableOfContents; - $this->sizeConverter = $sizeConverter; - $this->colorConverter = $colorConverter; - $this->imageProcessor = $imageProcessor; - $this->languageToFont = $languageToFont; - } - public function getTagName() - { - $tag = \get_class($this); - return \strtoupper(\str_replace('WP_Ultimo\\Dependencies\\Mpdf\\Tag\\', '', $tag)); - } - protected function getAlign($property) - { - $property = \strtolower($property); - return \array_key_exists($property, self::ALIGN) ? self::ALIGN[$property] : ''; - } - public abstract function open($attr, &$ahtml, &$ihtml); - public abstract function close(&$ahtml, &$ihtml); -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Td.php b/dependencies/mpdf/mpdf/src/Tag/Td.php deleted file mode 100644 index 857f65a..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Td.php +++ /dev/null @@ -1,418 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Css\Border; -use WP_Ultimo\Dependencies\Mpdf\Css\TextVars; -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -class Td extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $tag = $this->getTagName(); - $this->mpdf->ignorefollowingspaces = \true; - $this->mpdf->lastoptionaltag = $tag; - // Save current HTML specified optional endtag - $this->cssManager->tbCSSlvl++; - $this->mpdf->InlineProperties = []; - $this->mpdf->InlineBDF = []; - // mPDF 6 - $this->mpdf->InlineBDFctr = 0; - // mPDF 6 - $this->mpdf->tdbegin = \true; - $this->mpdf->col++; - while (isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col])) { - $this->mpdf->col++; - } - // Update number column - if ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc'] < $this->mpdf->col + 1) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc'] = $this->mpdf->col + 1; - } - $table =& $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]; - $c = ['a' => \false, 'R' => \false, 'nowrap' => \false, 'bgcolor' => \false, 'padding' => ['L' => \false, 'R' => \false, 'T' => \false, 'B' => \false]]; - if ($this->mpdf->simpleTables && $this->mpdf->row == 0 && $this->mpdf->col == 0) { - $table['simple']['border'] = \false; - $table['simple']['border_details']['R']['w'] = 0; - $table['simple']['border_details']['L']['w'] = 0; - $table['simple']['border_details']['T']['w'] = 0; - $table['simple']['border_details']['B']['w'] = 0; - $table['simple']['border_details']['R']['style'] = ''; - $table['simple']['border_details']['L']['style'] = ''; - $table['simple']['border_details']['T']['style'] = ''; - $table['simple']['border_details']['B']['style'] = ''; - } elseif (!$this->mpdf->simpleTables) { - $c['border'] = \false; - $c['border_details']['R']['w'] = 0; - $c['border_details']['L']['w'] = 0; - $c['border_details']['T']['w'] = 0; - $c['border_details']['B']['w'] = 0; - $c['border_details']['mbw']['BL'] = 0; - $c['border_details']['mbw']['BR'] = 0; - $c['border_details']['mbw']['RT'] = 0; - $c['border_details']['mbw']['RB'] = 0; - $c['border_details']['mbw']['TL'] = 0; - $c['border_details']['mbw']['TR'] = 0; - $c['border_details']['mbw']['LT'] = 0; - $c['border_details']['mbw']['LB'] = 0; - $c['border_details']['R']['style'] = ''; - $c['border_details']['L']['style'] = ''; - $c['border_details']['T']['style'] = ''; - $c['border_details']['B']['style'] = ''; - $c['border_details']['R']['s'] = 0; - $c['border_details']['L']['s'] = 0; - $c['border_details']['T']['s'] = 0; - $c['border_details']['B']['s'] = 0; - $c['border_details']['R']['c'] = $this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings); - $c['border_details']['L']['c'] = $this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings); - $c['border_details']['T']['c'] = $this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings); - $c['border_details']['B']['c'] = $this->colorConverter->convert(0, $this->mpdf->PDFAXwarnings); - $c['border_details']['R']['dom'] = 0; - $c['border_details']['L']['dom'] = 0; - $c['border_details']['T']['dom'] = 0; - $c['border_details']['B']['dom'] = 0; - $c['border_details']['cellposdom'] = 0; - } - if ($table['va']) { - $c['va'] = $table['va']; - } - if ($table['txta']) { - $c['a'] = $table['txta']; - } - if ($this->mpdf->table_border_attr_set && $table['border_details']) { - if (!$this->mpdf->simpleTables) { - $c['border_details']['R'] = $table['border_details']['R']; - $c['border_details']['L'] = $table['border_details']['L']; - $c['border_details']['T'] = $table['border_details']['T']; - $c['border_details']['B'] = $table['border_details']['B']; - $c['border'] = $table['border']; - $c['border_details']['L']['dom'] = 1; - $c['border_details']['R']['dom'] = 1; - $c['border_details']['T']['dom'] = 1; - $c['border_details']['B']['dom'] = 1; - } elseif ($this->mpdf->simpleTables && $this->mpdf->row == 0 && $this->mpdf->col == 0) { - $table['simple']['border_details']['R'] = $table['border_details']['R']; - $table['simple']['border_details']['L'] = $table['border_details']['L']; - $table['simple']['border_details']['T'] = $table['border_details']['T']; - $table['simple']['border_details']['B'] = $table['border_details']['B']; - $table['simple']['border'] = $table['border']; - } - } - // INHERITED THEAD CSS Properties - if ($this->mpdf->tablethead) { - if ($this->mpdf->thead_valign_default) { - $c['va'] = $this->getAlign($this->mpdf->thead_valign_default); - } - if ($this->mpdf->thead_textalign_default) { - $c['a'] = $this->getAlign($this->mpdf->thead_textalign_default); - } - if ($this->mpdf->thead_font_weight === 'B') { - $this->mpdf->SetStyle('B', \true); - } - if ($this->mpdf->thead_font_style === 'I') { - $this->mpdf->SetStyle('I', \true); - } - if ($this->mpdf->thead_font_smCaps === 'S') { - $this->mpdf->textvar |= TextVars::FC_SMALLCAPS; - } - // mPDF 5.7.1 - } - // INHERITED TFOOT CSS Properties - if ($this->mpdf->tabletfoot) { - if ($this->mpdf->tfoot_valign_default) { - $c['va'] = $this->getAlign($this->mpdf->tfoot_valign_default); - } - if ($this->mpdf->tfoot_textalign_default) { - $c['a'] = $this->getAlign($this->mpdf->tfoot_textalign_default); - } - if ($this->mpdf->tfoot_font_weight === 'B') { - $this->mpdf->SetStyle('B', \true); - } - if ($this->mpdf->tfoot_font_style === 'I') { - $this->mpdf->SetStyle('I', \true); - } - if ($this->mpdf->tfoot_font_style === 'S') { - $this->mpdf->textvar |= TextVars::FC_SMALLCAPS; - } - // mPDF 5.7.1 - } - if ($this->mpdf->trow_text_rotate) { - $c['R'] = $this->mpdf->trow_text_rotate; - } - $this->mpdf->cell_border_dominance_L = 0; - $this->mpdf->cell_border_dominance_R = 0; - $this->mpdf->cell_border_dominance_T = 0; - $this->mpdf->cell_border_dominance_B = 0; - $properties = $this->cssManager->MergeCSS('TABLE', $tag, $attr); - $properties = $this->cssManager->array_merge_recursive_unique($this->mpdf->base_table_properties, $properties); - $this->mpdf->Reset(); - // mPDF 6 ????????????????????? - $this->mpdf->setCSS($properties, 'TABLECELL', $tag); - $c['dfs'] = $this->mpdf->FontSize; - // Default Font size - if (isset($properties['BACKGROUND-COLOR'])) { - $c['bgcolor'] = $properties['BACKGROUND-COLOR']; - } elseif (isset($properties['BACKGROUND'])) { - $c['bgcolor'] = $properties['BACKGROUND']; - } elseif (isset($attr['BGCOLOR'])) { - $c['bgcolor'] = $attr['BGCOLOR']; - } - /* -- BACKGROUNDS -- */ - if (isset($properties['BACKGROUND-GRADIENT'])) { - $c['gradient'] = $properties['BACKGROUND-GRADIENT']; - } else { - $c['gradient'] = \false; - } - if (!empty($properties['BACKGROUND-IMAGE']) && !$this->mpdf->keep_block_together) { - $ret = $this->mpdf->SetBackground($properties, $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); - if ($ret) { - $c['background-image'] = $ret; - } - } - /* -- END BACKGROUNDS -- */ - if (isset($properties['VERTICAL-ALIGN'])) { - $c['va'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } elseif (isset($attr['VALIGN'])) { - $c['va'] = $this->getAlign($attr['VALIGN']); - } - if (!empty($properties['TEXT-ALIGN'])) { - if (0 === \strpos($properties['TEXT-ALIGN'], 'D')) { - $c['a'] = $properties['TEXT-ALIGN']; - } else { - $c['a'] = $this->getAlign($properties['TEXT-ALIGN']); - } - } - if (!empty($attr['ALIGN'])) { - if (\strtolower($attr['ALIGN']) === 'char') { - if (!empty($attr['CHAR'])) { - $char = \html_entity_decode($attr['CHAR']); - $char = UtfString::strcode2utf($char); - $d = \array_search($char, $this->mpdf->decimal_align); - if ($d !== \false) { - $c['a'] = $d . 'R'; - } - } else { - $c['a'] = 'DPR'; - } - } else { - $c['a'] = $this->getAlign($attr['ALIGN']); - } - } - // mPDF 6 - $c['direction'] = $table['direction']; - if (isset($attr['DIR']) && $attr['DIR'] != '') { - $c['direction'] = \strtolower($attr['DIR']); - } - if (isset($properties['DIRECTION'])) { - $c['direction'] = \strtolower($properties['DIRECTION']); - } - if (!$c['a']) { - if (isset($c['direction']) && $c['direction'] === 'rtl') { - $c['a'] = 'R'; - } else { - $c['a'] = 'L'; - } - } - $c['cellLineHeight'] = $table['cellLineHeight']; - if (isset($properties['LINE-HEIGHT'])) { - $c['cellLineHeight'] = $this->mpdf->fixLineheight($properties['LINE-HEIGHT']); - } - $c['cellLineStackingStrategy'] = $table['cellLineStackingStrategy']; - if (isset($properties['LINE-STACKING-STRATEGY'])) { - $c['cellLineStackingStrategy'] = \strtolower($properties['LINE-STACKING-STRATEGY']); - } - $c['cellLineStackingShift'] = $table['cellLineStackingShift']; - if (isset($properties['LINE-STACKING-SHIFT'])) { - $c['cellLineStackingShift'] = \strtolower($properties['LINE-STACKING-SHIFT']); - } - if (isset($properties['TEXT-ROTATE']) && ($properties['TEXT-ROTATE'] || $properties['TEXT-ROTATE'] === '0')) { - $c['R'] = $properties['TEXT-ROTATE']; - } - if (isset($properties['BORDER'])) { - $bord = $this->mpdf->border_details($properties['BORDER']); - if ($bord['s']) { - if (!$this->mpdf->simpleTables) { - $c['border'] = Border::ALL; - $c['border_details']['R'] = $bord; - $c['border_details']['L'] = $bord; - $c['border_details']['T'] = $bord; - $c['border_details']['B'] = $bord; - $c['border_details']['L']['dom'] = $this->mpdf->cell_border_dominance_L; - $c['border_details']['R']['dom'] = $this->mpdf->cell_border_dominance_R; - $c['border_details']['T']['dom'] = $this->mpdf->cell_border_dominance_T; - $c['border_details']['B']['dom'] = $this->mpdf->cell_border_dominance_B; - } elseif ($this->mpdf->simpleTables && $this->mpdf->row == 0 && $this->mpdf->col == 0) { - $table['simple']['border'] = Border::ALL; - $table['simple']['border_details']['R'] = $bord; - $table['simple']['border_details']['L'] = $bord; - $table['simple']['border_details']['T'] = $bord; - $table['simple']['border_details']['B'] = $bord; - } - } - } - if (!$this->mpdf->simpleTables) { - if (!empty($properties['BORDER-RIGHT'])) { - $c['border_details']['R'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - $this->mpdf->setBorder($c['border'], Border::RIGHT, $c['border_details']['R']['s']); - $c['border_details']['R']['dom'] = $this->mpdf->cell_border_dominance_R; - } - if (!empty($properties['BORDER-LEFT'])) { - $c['border_details']['L'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - $this->mpdf->setBorder($c['border'], Border::LEFT, $c['border_details']['L']['s']); - $c['border_details']['L']['dom'] = $this->mpdf->cell_border_dominance_L; - } - if (!empty($properties['BORDER-BOTTOM'])) { - $c['border_details']['B'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - $this->mpdf->setBorder($c['border'], Border::BOTTOM, $c['border_details']['B']['s']); - $c['border_details']['B']['dom'] = $this->mpdf->cell_border_dominance_B; - } - if (!empty($properties['BORDER-TOP'])) { - $c['border_details']['T'] = $this->mpdf->border_details($properties['BORDER-TOP']); - $this->mpdf->setBorder($c['border'], Border::TOP, $c['border_details']['T']['s']); - $c['border_details']['T']['dom'] = $this->mpdf->cell_border_dominance_T; - } - } elseif ($this->mpdf->simpleTables && $this->mpdf->row == 0 && $this->mpdf->col == 0) { - if (!empty($properties['BORDER-LEFT'])) { - $bord = $this->mpdf->border_details($properties['BORDER-LEFT']); - if ($bord['s']) { - $table['simple']['border'] = Border::ALL; - } else { - $table['simple']['border'] = 0; - } - $table['simple']['border_details']['R'] = $bord; - $table['simple']['border_details']['L'] = $bord; - $table['simple']['border_details']['T'] = $bord; - $table['simple']['border_details']['B'] = $bord; - } - } - if ($this->mpdf->simpleTables && $this->mpdf->row == 0 && $this->mpdf->col == 0 && !$table['borders_separate'] && $table['simple']['border']) { - $table['border_details'] = $table['simple']['border_details']; - $table['border'] = $table['simple']['border']; - } - // Border set on TR (if collapsed only) - if (!$table['borders_separate'] && !$this->mpdf->simpleTables && isset($table['trborder-left'][$this->mpdf->row])) { - if ($this->mpdf->col == 0) { - $left = $this->mpdf->border_details($table['trborder-left'][$this->mpdf->row]); - $c['border_details']['L'] = $left; - $this->mpdf->setBorder($c['border'], Border::LEFT, $c['border_details']['L']['s']); - } - $c['border_details']['B'] = $this->mpdf->border_details($table['trborder-bottom'][$this->mpdf->row]); - $this->mpdf->setBorder($c['border'], Border::BOTTOM, $c['border_details']['B']['s']); - $c['border_details']['T'] = $this->mpdf->border_details($table['trborder-top'][$this->mpdf->row]); - $this->mpdf->setBorder($c['border'], Border::TOP, $c['border_details']['T']['s']); - } - if ($this->mpdf->packTableData && !$this->mpdf->simpleTables) { - $c['borderbin'] = $this->mpdf->_packCellBorder($c); - unset($c['border'], $c['border_details']); - } - if (isset($properties['PADDING-LEFT'])) { - $c['padding']['L'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-RIGHT'])) { - $c['padding']['R'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-BOTTOM'])) { - $c['padding']['B'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-TOP'])) { - $c['padding']['T'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - $w = ''; - if (isset($properties['WIDTH'])) { - $w = $properties['WIDTH']; - } elseif (isset($attr['WIDTH'])) { - $w = $attr['WIDTH']; - } - if ($w) { - if (\strpos($w, '%') && !$this->mpdf->ignore_table_percents) { - $c['wpercent'] = (float) $w; - } elseif (!\strpos($w, '%') && !$this->mpdf->ignore_table_widths) { - $c['w'] = $this->sizeConverter->convert($w, $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - } - if (isset($properties['HEIGHT']) && !\strpos($properties['HEIGHT'], '%')) { - $c['h'] = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } elseif (isset($attr['HEIGHT']) && !\strpos($attr['HEIGHT'], '%')) { - $c['h'] = $this->sizeConverter->convert($attr['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['WHITE-SPACE'])) { - if (\strtoupper($properties['WHITE-SPACE']) === 'NOWRAP') { - $c['nowrap'] = 1; - } - } - if (isset($attr['TEXT-ROTATE'])) { - $c['R'] = $attr['TEXT-ROTATE']; - } - if (!empty($attr['NOWRAP'])) { - $c['nowrap'] = 1; - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col] = $c; - unset($c); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; - $cs = $rs = 1; - if (isset($attr['COLSPAN']) && \preg_match('/^\\d+$/', $attr['COLSPAN']) && $attr['COLSPAN'] > 1) { - $cs = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['colspan'] = $attr['COLSPAN']; - } - if ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc'] < $this->mpdf->col + $cs) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc'] = $this->mpdf->col + $cs; - } - // following code moved outside if... - for ($l = $this->mpdf->col; $l < $this->mpdf->col + $cs; $l++) { - if ($l - $this->mpdf->col) { - $this->mpdf->cell[$this->mpdf->row][$l] = 0; - } - } - if (isset($attr['ROWSPAN']) && \preg_match('/^\\d+$/', $attr['ROWSPAN']) && $attr['ROWSPAN'] > 1) { - $rs = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['rowspan'] = $attr['ROWSPAN']; - } - for ($k = $this->mpdf->row; $k < $this->mpdf->row + $rs; $k++) { - for ($l = $this->mpdf->col; $l < $this->mpdf->col + $cs; $l++) { - if ($k - $this->mpdf->row || $l - $this->mpdf->col) { - $this->mpdf->cell[$k][$l] = 0; - } - } - } - unset($table); - } - public function close(&$ahtml, &$ihtml) - { - if ($this->mpdf->tableLevel) { - $this->mpdf->lastoptionaltag = 'TR'; - unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); - $this->cssManager->tbCSSlvl--; - if (!$this->mpdf->tdbegin) { - return; - } - $this->mpdf->tdbegin = \false; - // Added for correct calculation of cell column width - otherwise misses the last line if not end </p> etc. - if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { - if (!\is_array($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col])) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('You may have an error in your HTML code e.g. </td></td>'); - } - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; - } - // Remove last <br> if at end of cell - $ntb = 0; - if (isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'])) { - $ntb = \count($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer']); - } - if ($ntb > 1 && $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][$ntb - 1][0] === "\n") { - unset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][$ntb - 1]); - } - if ($this->mpdf->tablethead) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead'][$this->mpdf->row] = \true; - if ($this->mpdf->tableLevel == 1) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['headernrows'] = \max($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['headernrows'], $this->mpdf->row + 1); - } - } - if ($this->mpdf->tabletfoot) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'][$this->mpdf->row] = \true; - if ($this->mpdf->tableLevel == 1) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['footernrows'] = \max($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['footernrows'], $this->mpdf->row + 1 - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['headernrows']); - } - } - $this->mpdf->Reset(); - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/TextArea.php b/dependencies/mpdf/mpdf/src/Tag/TextArea.php deleted file mode 100644 index 907c41f..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/TextArea.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class TextArea extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - if (isset($attr['DISABLED'])) { - $objattr['disabled'] = \true; - } - if (isset($attr['READONLY'])) { - $objattr['readonly'] = \true; - } - if (isset($attr['REQUIRED'])) { - $objattr['required'] = \true; - } - if (isset($attr['SPELLCHECK']) && \strtolower($attr['SPELLCHECK']) === 'true') { - $objattr['spellcheck'] = \true; - } - if (isset($attr['TITLE'])) { - $objattr['title'] = $attr['TITLE']; - if ($this->mpdf->onlyCoreFonts) { - $objattr['title'] = \mb_convert_encoding($objattr['title'], $this->mpdf->mb_enc, 'UTF-8'); - } - } - if ($this->mpdf->useActiveForms) { - if (isset($attr['NAME'])) { - $objattr['fieldname'] = $attr['NAME']; - } - $this->form->form_element_spacing['textarea']['outer']['v'] = 0; - $this->form->form_element_spacing['textarea']['inner']['v'] = 0; - if (isset($attr['ONCALCULATE'])) { - $objattr['onCalculate'] = $attr['ONCALCULATE']; - } elseif (isset($attr['ONCHANGE'])) { - $objattr['onCalculate'] = $attr['ONCHANGE']; - } - if (isset($attr['ONVALIDATE'])) { - $objattr['onValidate'] = $attr['ONVALIDATE']; - } - if (isset($attr['ONKEYSTROKE'])) { - $objattr['onKeystroke'] = $attr['ONKEYSTROKE']; - } - if (isset($attr['ONFORMAT'])) { - $objattr['onFormat'] = $attr['ONFORMAT']; - } - } - $this->mpdf->InlineProperties['TEXTAREA'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('', 'TEXTAREA', $attr); - if (isset($properties['FONT-FAMILY'])) { - $this->mpdf->SetFont($properties['FONT-FAMILY'], '', 0, \false); - } - if (isset($properties['FONT-SIZE']) && $properties['FONT-SIZE'] !== 'auto') { - $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $this->mpdf->default_font_size / Mpdf::SCALE); - $this->mpdf->SetFontSize($mmsize * Mpdf::SCALE, \false); - } - if (isset($properties['COLOR'])) { - $objattr['color'] = $this->colorConverter->convert($properties['COLOR'], $this->mpdf->PDFAXwarnings); - } - $objattr['fontfamily'] = $this->mpdf->FontFamily; - $objattr['fontsize'] = $this->mpdf->FontSizePt; - if ($this->mpdf->useActiveForms) { - if (isset($properties['TEXT-ALIGN'])) { - $objattr['text_align'] = $this->getAlign($properties['TEXT-ALIGN']); - } elseif (isset($attr['ALIGN'])) { - $objattr['text_align'] = $this->getAlign($attr['ALIGN']); - } - if (isset($properties['OVERFLOW']) && \strtolower($properties['OVERFLOW']) === 'hidden') { - $objattr['donotscroll'] = \true; - } - if (isset($properties['BORDER-TOP-COLOR'])) { - $objattr['border-col'] = $this->colorConverter->convert($properties['BORDER-TOP-COLOR'], $this->mpdf->PDFAXwarnings); - } - if (isset($properties['BACKGROUND-COLOR'])) { - $objattr['background-col'] = $this->colorConverter->convert($properties['BACKGROUND-COLOR'], $this->mpdf->PDFAXwarnings); - } - } - $this->mpdf->SetLineHeight('', $this->form->textarea_lineheight); - $w = 0; - $h = 0; - if (isset($properties['WIDTH'])) { - $w = $this->sizeConverter->convert($properties['WIDTH'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['HEIGHT'])) { - $h = $this->sizeConverter->convert($properties['HEIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['VERTICAL-ALIGN'])) { - $objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']); - } - $colsize = 20; - //HTML default value - $rowsize = 2; - //HTML default value - if (isset($attr['COLS'])) { - $colsize = (int) $attr['COLS']; - } - if (isset($attr['ROWS'])) { - $rowsize = (int) $attr['ROWS']; - } - $charsize = $this->mpdf->GetCharWidth('w', \false); - if ($w) { - $colsize = \round(($w - $this->form->form_element_spacing['textarea']['outer']['h'] * 2 - $this->form->form_element_spacing['textarea']['inner']['h'] * 2) / $charsize); - } - if ($h) { - $rowsize = \round(($h - $this->form->form_element_spacing['textarea']['outer']['v'] * 2 - $this->form->form_element_spacing['textarea']['inner']['v'] * 2) / $this->mpdf->lineheight); - } - $objattr['type'] = 'textarea'; - $objattr['width'] = $colsize * $charsize + $this->form->form_element_spacing['textarea']['outer']['h'] * 2 + $this->form->form_element_spacing['textarea']['inner']['h'] * 2; - $objattr['height'] = $rowsize * $this->mpdf->lineheight + $this->form->form_element_spacing['textarea']['outer']['v'] * 2 + $this->form->form_element_spacing['textarea']['inner']['v'] * 2; - $objattr['rows'] = $rowsize; - $objattr['cols'] = $colsize; - if ($properties['FONT-SIZE'] === 'auto' && $this->mpdf->useActiveForms) { - $objattr['use_auto_fontsize'] = \true; - } - $this->mpdf->specialcontent = \serialize($objattr); - if ($this->mpdf->tableLevel) { - // *TABLES* - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - // *TABLES* - } - // *TABLES* - } - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->ignorefollowingspaces = \false; - $this->mpdf->specialcontent = ''; - if ($this->mpdf->InlineProperties['TEXTAREA']) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['TEXTAREA']); - } - unset($this->mpdf->InlineProperties['TEXTAREA']); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/TextCircle.php b/dependencies/mpdf/mpdf/src/Tag/TextCircle.php deleted file mode 100644 index a7c3ba1..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/TextCircle.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Utils\UtfString; -class TextCircle extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $objattr = []; - $objattr['margin_top'] = 0; - $objattr['margin_bottom'] = 0; - $objattr['margin_left'] = 0; - $objattr['margin_right'] = 0; - $objattr['padding_top'] = 0; - $objattr['padding_bottom'] = 0; - $objattr['padding_left'] = 0; - $objattr['padding_right'] = 0; - $objattr['width'] = 0; - $objattr['height'] = 0; - $objattr['border_top']['w'] = 0; - $objattr['border_bottom']['w'] = 0; - $objattr['border_left']['w'] = 0; - $objattr['border_right']['w'] = 0; - $objattr['top-text'] = ''; - $objattr['bottom-text'] = ''; - $objattr['r'] = 20; - // radius (default value here for safety) - $objattr['space-width'] = 120; - $objattr['char-width'] = 100; - $this->mpdf->InlineProperties['TEXTCIRCLE'] = $this->mpdf->saveInlineProperties(); - $properties = $this->cssManager->MergeCSS('INLINE', 'TEXTCIRCLE', $attr); - if (isset($properties['DISPLAY']) && \strtolower($properties['DISPLAY']) === 'none') { - return; - } - if (isset($attr['R'])) { - $objattr['r'] = $this->sizeConverter->convert($attr['R'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($attr['TOP-TEXT'])) { - $objattr['top-text'] = UtfString::strcode2utf($attr['TOP-TEXT']); - $objattr['top-text'] = $this->mpdf->lesser_entity_decode($objattr['top-text']); - if ($this->mpdf->onlyCoreFonts) { - $objattr['top-text'] = \mb_convert_encoding($objattr['top-text'], $this->mpdf->mb_enc, 'UTF-8'); - } - } - if (isset($attr['BOTTOM-TEXT'])) { - $objattr['bottom-text'] = UtfString::strcode2utf($attr['BOTTOM-TEXT']); - $objattr['bottom-text'] = $this->mpdf->lesser_entity_decode($objattr['bottom-text']); - if ($this->mpdf->onlyCoreFonts) { - $objattr['bottom-text'] = \mb_convert_encoding($objattr['bottom-text'], $this->mpdf->mb_enc, 'UTF-8'); - } - } - if (!empty($attr['SPACE-WIDTH'])) { - $objattr['space-width'] = $attr['SPACE-WIDTH']; - } - if (!empty($attr['CHAR-WIDTH'])) { - $objattr['char-width'] = $attr['CHAR-WIDTH']; - } - // VISIBILITY - $objattr['visibility'] = 'visible'; - if (isset($properties['VISIBILITY'])) { - $v = \strtolower($properties['VISIBILITY']); - if (($v === 'hidden' || $v === 'printonly' || $v === 'screenonly') && $this->mpdf->visibility === 'visible') { - $objattr['visibility'] = $v; - } - } - if (isset($properties['FONT-SIZE'])) { - if (\strtolower($properties['FONT-SIZE']) === 'auto') { - if ($objattr['top-text'] && $objattr['bottom-text']) { - $objattr['fontsize'] = -2; - } else { - $objattr['fontsize'] = -1; - } - } else { - $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $this->mpdf->default_font_size / Mpdf::SCALE); - $this->mpdf->SetFontSize($mmsize * Mpdf::SCALE, \false); - $objattr['fontsize'] = $this->mpdf->FontSizePt; - } - } - if (isset($attr['DIVIDER'])) { - $objattr['divider'] = UtfString::strcode2utf($attr['DIVIDER']); - $objattr['divider'] = $this->mpdf->lesser_entity_decode($objattr['divider']); - if ($this->mpdf->onlyCoreFonts) { - $objattr['divider'] = \mb_convert_encoding($objattr['divider'], $this->mpdf->mb_enc, 'UTF-8'); - } - } - if (isset($properties['COLOR'])) { - $objattr['color'] = $this->colorConverter->convert($properties['COLOR'], $this->mpdf->PDFAXwarnings); - } - $objattr['fontstyle'] = ''; - if (isset($properties['FONT-WEIGHT'])) { - if (\strtoupper($properties['FONT-WEIGHT']) === 'BOLD') { - $objattr['fontstyle'] .= 'B'; - } - } - if (isset($properties['FONT-STYLE'])) { - if (\strtoupper($properties['FONT-STYLE']) === 'ITALIC') { - $objattr['fontstyle'] .= 'I'; - } - } - if (isset($properties['FONT-FAMILY'])) { - $this->mpdf->SetFont($properties['FONT-FAMILY'], $this->mpdf->FontStyle, 0, \false); - } - $objattr['fontfamily'] = $this->mpdf->FontFamily; - // VSPACE and HSPACE converted to margins in MergeCSS - if (isset($properties['MARGIN-TOP'])) { - $objattr['margin_top'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-BOTTOM'])) { - $objattr['margin_bottom'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-LEFT'])) { - $objattr['margin_left'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['MARGIN-RIGHT'])) { - $objattr['margin_right'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-TOP'])) { - $objattr['padding_top'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-BOTTOM'])) { - $objattr['padding_bottom'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-LEFT'])) { - $objattr['padding_left'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['PADDING-RIGHT'])) { - $objattr['padding_right'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, \false); - } - if (isset($properties['BORDER-TOP'])) { - $objattr['border_top'] = $this->mpdf->border_details($properties['BORDER-TOP']); - } - if (isset($properties['BORDER-BOTTOM'])) { - $objattr['border_bottom'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); - } - if (isset($properties['BORDER-LEFT'])) { - $objattr['border_left'] = $this->mpdf->border_details($properties['BORDER-LEFT']); - } - if (isset($properties['BORDER-RIGHT'])) { - $objattr['border_right'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); - } - if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { - $objattr['opacity'] = $properties['OPACITY']; - } - if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { - $objattr['bgcolor'] = $this->colorConverter->convert($properties['BACKGROUND-COLOR'], $this->mpdf->PDFAXwarnings); - } else { - $objattr['bgcolor'] = \false; - } - if ($this->mpdf->HREF) { - if (\strpos($this->mpdf->HREF, '.') === \false && \strpos($this->mpdf->HREF, '@') !== 0) { - $href = $this->mpdf->HREF; - while (\array_key_exists($href, $this->mpdf->internallink)) { - $href = '#' . $href; - } - $this->mpdf->internallink[$href] = $this->mpdf->AddLink(); - $objattr['link'] = $this->mpdf->internallink[$href]; - } else { - $objattr['link'] = $this->mpdf->HREF; - } - } - $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; - $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; - $w = $objattr['r'] * 2; - $h = $w; - $objattr['height'] = $h + $extraheight; - $objattr['width'] = $w + $extrawidth; - $objattr['type'] = 'textcircle'; - $e = Mpdf::OBJECT_IDENTIFIER . "type=image,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - /* -- TABLES -- */ - // Output it to buffers - if ($this->mpdf->tableLevel) { - $this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF); - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width']; - } else { - /* -- END TABLES -- */ - $this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF); - } - // *TABLES* - if ($this->mpdf->InlineProperties['TEXTCIRCLE']) { - $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['TEXTCIRCLE']); - } - unset($this->mpdf->InlineProperties['TEXTCIRCLE']); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Th.php b/dependencies/mpdf/mpdf/src/Tag/Th.php deleted file mode 100644 index 6c1c8b8..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Th.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Th extends Td -{ - public function close(&$ahtml, &$ihtml) - { - $this->mpdf->SetStyle('B', \false); - parent::close($ahtml, $ihtml); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Time.php b/dependencies/mpdf/mpdf/src/Tag/Time.php deleted file mode 100644 index ab27db0..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Time.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Time extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Toc.php b/dependencies/mpdf/mpdf/src/Tag/Toc.php deleted file mode 100644 index 2cd9185..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Toc.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Toc extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - //added custom-tag - set Marker for insertion later of ToC - $this->tableOfContents->openTagTOC($attr); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/TocEntry.php b/dependencies/mpdf/mpdf/src/Tag/TocEntry.php deleted file mode 100644 index 50b6a6c..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/TocEntry.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -class TocEntry extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - if (!empty($attr['CONTENT'])) { - $objattr = []; - $objattr['CONTENT'] = \htmlspecialchars_decode($attr['CONTENT'], \ENT_QUOTES); - $objattr['type'] = 'toc'; - $objattr['vertical-align'] = 'T'; - if (!empty($attr['LEVEL'])) { - $objattr['toclevel'] = $attr['LEVEL']; - } else { - $objattr['toclevel'] = 0; - } - if (!empty($attr['NAME'])) { - $objattr['toc_id'] = $attr['NAME']; - } else { - $objattr['toc_id'] = 0; - } - $e = Mpdf::OBJECT_IDENTIFIER . "type=toc,objattr=" . \serialize($objattr) . Mpdf::OBJECT_IDENTIFIER; - if ($this->mpdf->tableLevel) { - $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$e]; - } else { - // *TABLES* - $this->mpdf->textbuffer[] = [$e]; - } - // *TABLES* - } - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/TocPageBreak.php b/dependencies/mpdf/mpdf/src/Tag/TocPageBreak.php deleted file mode 100644 index 94e9bbb..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/TocPageBreak.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class TocPageBreak extends FormFeed -{ - public function open($attr, &$ahtml, &$ihtml) - { - list($isbreak, $toc_id) = $this->tableOfContents->openTagTOCPAGEBREAK($attr); - $this->toc_id = $toc_id; - if ($isbreak) { - return; - } - parent::open($attr, $ahtml, $ihtml); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Tr.php b/dependencies/mpdf/mpdf/src/Tag/Tr.php deleted file mode 100644 index 39dbd63..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Tr.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -use WP_Ultimo\Dependencies\Mpdf\Css\Border; -class Tr extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->lastoptionaltag = 'TR'; - // Save current HTML specified optional endtag - $this->cssManager->tbCSSlvl++; - $this->mpdf->row++; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']++; - $this->mpdf->col = -1; - $properties = $this->cssManager->MergeCSS('TABLE', 'TR', $attr); - if (!$this->mpdf->simpleTables && (!isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['borders_separate']) || !$this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['borders_separate'])) { - if (!empty($properties['BORDER-LEFT'])) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trborder-left'][$this->mpdf->row] = $properties['BORDER-LEFT']; - } - if (!empty($properties['BORDER-RIGHT'])) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trborder-right'][$this->mpdf->row] = $properties['BORDER-RIGHT']; - } - if (!empty($properties['BORDER-TOP'])) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trborder-top'][$this->mpdf->row] = $properties['BORDER-TOP']; - } - if (!empty($properties['BORDER-BOTTOM'])) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trborder-bottom'][$this->mpdf->row] = $properties['BORDER-BOTTOM']; - } - } - if (isset($properties['BACKGROUND-COLOR'])) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] : []; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$this->mpdf->row] = $properties['BACKGROUND-COLOR']; - } elseif (isset($attr['BGCOLOR'])) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] : []; - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$this->mpdf->row] = $attr['BGCOLOR']; - } - /* -- BACKGROUNDS -- */ - if (isset($properties['BACKGROUND-GRADIENT']) && !$this->mpdf->kwt && !$this->mpdf->ColActive) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$this->mpdf->row] = $properties['BACKGROUND-GRADIENT']; - } - // FIXME: undefined variable $currblk - if (!empty($properties['BACKGROUND-IMAGE']) && !$this->mpdf->kwt && !$this->mpdf->ColActive) { - $ret = $this->mpdf->SetBackground($properties, $currblk['inner_width']); - if ($ret) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$this->mpdf->row] = $ret; - } - } - /* -- END BACKGROUNDS -- */ - if (isset($properties['TEXT-ROTATE'])) { - $this->mpdf->trow_text_rotate = $properties['TEXT-ROTATE']; - } - if (isset($attr['TEXT-ROTATE'])) { - $this->mpdf->trow_text_rotate = $attr['TEXT-ROTATE']; - } - if ($this->mpdf->tablethead) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead'][$this->mpdf->row] = \true; - } - if ($this->mpdf->tabletfoot) { - $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'][$this->mpdf->row] = \true; - } - } - public function close(&$ahtml, &$ihtml) - { - if ($this->mpdf->tableLevel) { - // If Border set on TR - Update right border - if (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trborder-left'][$this->mpdf->row])) { - $c =& $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]; - if ($c) { - if ($this->mpdf->packTableData) { - $cell = $this->mpdf->_unpackCellBorder($c['borderbin']); - } else { - $cell = $c; - } - $cell['border_details']['R'] = $this->mpdf->border_details($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trborder-right'][$this->mpdf->row]); - $this->mpdf->setBorder($cell['border'], Border::RIGHT, $cell['border_details']['R']['s']); - if ($this->mpdf->packTableData) { - $c['borderbin'] = $this->mpdf->_packCellBorder($cell); - unset($c['border'], $c['border_details']); - } else { - $c = $cell; - } - } - } - $this->mpdf->lastoptionaltag = ''; - unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); - $this->cssManager->tbCSSlvl--; - $this->mpdf->trow_text_rotate = ''; - $this->mpdf->tabletheadjustfinished = \false; - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Tt.php b/dependencies/mpdf/mpdf/src/Tag/Tt.php deleted file mode 100644 index cdde763..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Tt.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Tt extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Tta.php b/dependencies/mpdf/mpdf/src/Tag/Tta.php deleted file mode 100644 index 3e637c1..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Tta.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Tta extends SubstituteTag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->tta = \true; - $this->mpdf->InlineProperties['TTA'] = $this->mpdf->saveInlineProperties(); - if (\in_array($this->mpdf->FontFamily, $this->mpdf->mono_fonts)) { - $this->mpdf->setCSS(['FONT-FAMILY' => 'ccourier'], 'INLINE'); - } elseif (\in_array($this->mpdf->FontFamily, $this->mpdf->serif_fonts)) { - $this->mpdf->setCSS(['FONT-FAMILY' => 'ctimes'], 'INLINE'); - } else { - $this->mpdf->setCSS(['FONT-FAMILY' => 'chelvetica'], 'INLINE'); - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Tts.php b/dependencies/mpdf/mpdf/src/Tag/Tts.php deleted file mode 100644 index c70b035..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Tts.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Tts extends SubstituteTag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->tts = \true; - $this->mpdf->InlineProperties['TTS'] = $this->mpdf->saveInlineProperties(); - $this->mpdf->setCSS(['FONT-FAMILY' => 'csymbol', 'FONT-WEIGHT' => 'normal', 'FONT-STYLE' => 'normal'], 'INLINE'); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Ttz.php b/dependencies/mpdf/mpdf/src/Tag/Ttz.php deleted file mode 100644 index 1958509..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Ttz.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Ttz extends SubstituteTag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $this->mpdf->ttz = \true; - $this->mpdf->InlineProperties['TTZ'] = $this->mpdf->saveInlineProperties(); - $this->mpdf->setCSS(['FONT-FAMILY' => 'czapfdingbats', 'FONT-WEIGHT' => 'normal', 'FONT-STYLE' => 'normal'], 'INLINE'); - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/U.php b/dependencies/mpdf/mpdf/src/Tag/U.php deleted file mode 100644 index 4144975..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/U.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class U extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/Ul.php b/dependencies/mpdf/mpdf/src/Tag/Ul.php deleted file mode 100644 index abebf9e..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/Ul.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class Ul extends BlockTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/VarTag.php b/dependencies/mpdf/mpdf/src/Tag/VarTag.php deleted file mode 100644 index c22925b..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/VarTag.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class VarTag extends InlineTag -{ -} diff --git a/dependencies/mpdf/mpdf/src/Tag/WatermarkImage.php b/dependencies/mpdf/mpdf/src/Tag/WatermarkImage.php deleted file mode 100644 index 6f6a98a..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/WatermarkImage.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class WatermarkImage extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $src = ''; - if (isset($attr['SRC'])) { - $src = $attr['SRC']; - } - $alpha = -1; - if (isset($attr['ALPHA']) && $attr['ALPHA'] > 0) { - $alpha = $attr['ALPHA']; - } - $size = 'D'; - if (!empty($attr['SIZE'])) { - $size = $attr['SIZE']; - if (\strpos($size, ',')) { - $size = \explode(',', $size); - } - } - $pos = 'P'; - if (!empty($attr['POSITION'])) { - // mPDF 5.7.2 - $pos = $attr['POSITION']; - if (\strpos($pos, ',')) { - $pos = \explode(',', $pos); - } - } - $this->mpdf->SetWatermarkImage($src, $alpha, $size, $pos); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Tag/WatermarkText.php b/dependencies/mpdf/mpdf/src/Tag/WatermarkText.php deleted file mode 100644 index c6afe91..0000000 --- a/dependencies/mpdf/mpdf/src/Tag/WatermarkText.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Tag; - -class WatermarkText extends Tag -{ - public function open($attr, &$ahtml, &$ihtml) - { - $txt = ''; - if (!empty($attr['CONTENT'])) { - $txt = \htmlspecialchars_decode($attr['CONTENT'], \ENT_QUOTES); - } - $alpha = -1; - if (isset($attr['ALPHA']) && $attr['ALPHA'] > 0) { - $alpha = $attr['ALPHA']; - } - $this->mpdf->SetWatermarkText($txt, $alpha); - } - public function close(&$ahtml, &$ihtml) - { - } -} diff --git a/dependencies/mpdf/mpdf/src/Ucdn.php b/dependencies/mpdf/mpdf/src/Ucdn.php deleted file mode 100644 index c9e0f62..0000000 --- a/dependencies/mpdf/mpdf/src/Ucdn.php +++ /dev/null @@ -1,1195 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class Ucdn -{ - /* HarfBuzz ucdn/unicodedata_db.h */ - /* HarfBuzz ucdn/ucdn.c */ - /* HarfBuzz ucdn/ucdn.h */ - const SCRIPT_COMMON = 0; - const SCRIPT_LATIN = 1; - const SCRIPT_GREEK = 2; - const SCRIPT_CYRILLIC = 3; - const SCRIPT_ARMENIAN = 4; - const SCRIPT_HEBREW = 5; - const SCRIPT_ARABIC = 6; - const SCRIPT_SYRIAC = 7; - const SCRIPT_THAANA = 8; - const SCRIPT_DEVANAGARI = 9; - const SCRIPT_BENGALI = 10; - const SCRIPT_GURMUKHI = 11; - const SCRIPT_GUJARATI = 12; - const SCRIPT_ORIYA = 13; - const SCRIPT_TAMIL = 14; - const SCRIPT_TELUGU = 15; - const SCRIPT_KANNADA = 16; - const SCRIPT_MALAYALAM = 17; - const SCRIPT_SINHALA = 18; - const SCRIPT_THAI = 19; - const SCRIPT_LAO = 20; - const SCRIPT_TIBETAN = 21; - const SCRIPT_MYANMAR = 22; - const SCRIPT_GEORGIAN = 23; - const SCRIPT_HANGUL = 24; - const SCRIPT_ETHIOPIC = 25; - const SCRIPT_CHEROKEE = 26; - const SCRIPT_CANADIAN_ABORIGINAL = 27; - const SCRIPT_OGHAM = 28; - const SCRIPT_RUNIC = 29; - const SCRIPT_KHMER = 30; - const SCRIPT_MONGOLIAN = 31; - const SCRIPT_HIRAGANA = 32; - const SCRIPT_KATAKANA = 33; - const SCRIPT_BOPOMOFO = 34; - const SCRIPT_HAN = 35; - const SCRIPT_YI = 36; - const SCRIPT_OLD_ITALIC = 37; - const SCRIPT_GOTHIC = 38; - const SCRIPT_DESERET = 39; - const SCRIPT_INHERITED = 40; - const SCRIPT_TAGALOG = 41; - const SCRIPT_HANUNOO = 42; - const SCRIPT_BUHID = 43; - const SCRIPT_TAGBANWA = 44; - const SCRIPT_LIMBU = 45; - const SCRIPT_TAI_LE = 46; - const SCRIPT_LINEAR_B = 47; - const SCRIPT_UGARITIC = 48; - const SCRIPT_SHAVIAN = 49; - const SCRIPT_OSMANYA = 50; - const SCRIPT_CYPRIOT = 51; - const SCRIPT_BRAILLE = 52; - const SCRIPT_BUGINESE = 53; - const SCRIPT_COPTIC = 54; - const SCRIPT_NEW_TAI_LUE = 55; - const SCRIPT_GLAGOLITIC = 56; - const SCRIPT_TIFINAGH = 57; - const SCRIPT_SYLOTI_NAGRI = 58; - const SCRIPT_OLD_PERSIAN = 59; - const SCRIPT_KHAROSHTHI = 60; - const SCRIPT_BALINESE = 61; - const SCRIPT_CUNEIFORM = 62; - const SCRIPT_PHOENICIAN = 63; - const SCRIPT_PHAGS_PA = 64; - const SCRIPT_NKO = 65; - const SCRIPT_SUNDANESE = 66; - const SCRIPT_LEPCHA = 67; - const SCRIPT_OL_CHIKI = 68; - const SCRIPT_VAI = 69; - const SCRIPT_SAURASHTRA = 70; - const SCRIPT_KAYAH_LI = 71; - const SCRIPT_REJANG = 72; - const SCRIPT_LYCIAN = 73; - const SCRIPT_CARIAN = 74; - const SCRIPT_LYDIAN = 75; - const SCRIPT_CHAM = 76; - const SCRIPT_TAI_THAM = 77; - const SCRIPT_TAI_VIET = 78; - const SCRIPT_AVESTAN = 79; - const SCRIPT_EGYPTIAN_HIEROGLYPHS = 80; - const SCRIPT_SAMARITAN = 81; - const SCRIPT_LISU = 82; - const SCRIPT_BAMUM = 83; - const SCRIPT_JAVANESE = 84; - const SCRIPT_MEETEI_MAYEK = 85; - const SCRIPT_IMPERIAL_ARAMAIC = 86; - const SCRIPT_OLD_SOUTH_ARABIAN = 87; - const SCRIPT_INSCRIPTIONAL_PARTHIAN = 88; - const SCRIPT_INSCRIPTIONAL_PAHLAVI = 89; - const SCRIPT_OLD_TURKIC = 90; - const SCRIPT_KAITHI = 91; - const SCRIPT_BATAK = 92; - const SCRIPT_BRAHMI = 93; - const SCRIPT_MANDAIC = 94; - const SCRIPT_CHAKMA = 95; - const SCRIPT_MEROITIC_CURSIVE = 96; - const SCRIPT_MEROITIC_HIEROGLYPHS = 97; - const SCRIPT_MIAO = 98; - const SCRIPT_SHARADA = 99; - const SCRIPT_SORA_SOMPENG = 100; - const SCRIPT_TAKRI = 101; - const SCRIPT_UNKNOWN = 102; - public static function get_ucd_record($code) - { - if ($code >= 0x110000) { - $index = 0; - } else { - $index = self::$index0[$code >> 8] << 5; - $offset = $code >> 3 & (1 << 5) - 1; - $index = self::$index1[$index + $offset] << 3; - $offset = $code & (1 << 3) - 1; - $index = self::$index2[$index + $offset]; - } - return self::$ucd_records[$index]; - } - public static function get_general_category($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[0]; - } - public static function get_combining_class($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[1]; - } - public static function get_bidi_class($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[2]; - } - public static function get_mirrored($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[3]; - } - public static function get_east_asian_width($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[4]; - } - public static function get_normalization_check($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[5]; - } - public static function get_script($code) - { - $ucd_record = self::get_ucd_record($code); - return $ucd_record[6]; - } - // mPDF added - public static $uni_scriptblock = [ - /* SCRIPT_COMMON */ - 0 => '', - /* SCRIPT_LATIN */ - 1 => 'latn', - /* SCRIPT_GREEK */ - 2 => 'grek', - /* SCRIPT_CYRILLIC */ - 3 => 'cyrl', - /* SCRIPT_ARMENIAN */ - 4 => 'armn', - /* SCRIPT_HEBREW */ - 5 => 'hebr', - /* SCRIPT_ARABIC */ - 6 => 'arab', - /* SCRIPT_SYRIAC */ - 7 => 'syrc', - /* SCRIPT_THAANA */ - 8 => 'thaa', - /* SCRIPT_DEVANAGARI */ - 9 => 'dev2', - /* SCRIPT_BENGALI */ - 10 => 'bng2', - /* SCRIPT_GURMUKHI */ - 11 => 'gur2', - /* SCRIPT_GUJARATI */ - 12 => 'gjr2', - /* SCRIPT_ORIYA */ - 13 => 'ory2', - /* SCRIPT_TAMIL */ - 14 => 'tml2', - /* SCRIPT_TELUGU */ - 15 => 'tel2', - /* SCRIPT_KANNADA */ - 16 => 'knd2', - /* SCRIPT_MALAYALAM */ - 17 => 'mlm2', - /* SCRIPT_SINHALA */ - 18 => 'sinh', - /* SCRIPT_THAI */ - 19 => 'thai', - /* SCRIPT_LAO */ - 20 => 'lao ', - /* SCRIPT_TIBETAN */ - 21 => 'tibt', - /* SCRIPT_MYANMAR */ - 22 => 'mym2', - /* SCRIPT_GEORGIAN */ - 23 => 'geor', - /* SCRIPT_HANGUL */ - 24 => 'jamo', - /* there is also a hang tag, but we want to activate jamo features if present */ - /* SCRIPT_ETHIOPIC */ - 25 => 'ethi', - /* SCRIPT_CHEROKEE */ - 26 => 'cher', - /* SCRIPT_CANADIAN_ABORIGINAL */ - 27 => 'cans', - /* SCRIPT_OGHAM */ - 28 => 'ogam', - /* SCRIPT_RUNIC */ - 29 => 'runr', - /* SCRIPT_KHMER */ - 30 => 'khmr', - /* SCRIPT_MONGOLIAN */ - 31 => 'mong', - /* SCRIPT_HIRAGANA */ - 32 => 'kana', - /* SCRIPT_KATAKANA */ - 33 => 'kana', - /* SCRIPT_BOPOMOFO */ - 34 => 'bopo', - /* SCRIPT_HAN */ - 35 => 'hani', - /* SCRIPT_YI */ - 36 => 'yi ', - /* SCRIPT_OLD_ITALIC */ - 37 => 'ital', - /* SCRIPT_GOTHIC */ - 38 => 'goth', - /* SCRIPT_DESERET */ - 39 => 'dsrt', - /* SCRIPT_INHERITED */ - 40 => '', - /* SCRIPT_TAGALOG */ - 41 => 'tglg', - /* SCRIPT_HANUNOO */ - 42 => 'hano', - /* SCRIPT_BUHID */ - 43 => 'buhd', - /* SCRIPT_TAGBANWA */ - 44 => 'tagb', - /* SCRIPT_LIMBU */ - 45 => 'limb', - /* SCRIPT_TAI_LE */ - 46 => 'tale', - /* SCRIPT_LINEAR_B */ - 47 => 'linb', - /* SCRIPT_UGARITIC */ - 48 => 'ugar', - /* SCRIPT_SHAVIAN */ - 49 => 'shaw', - /* SCRIPT_OSMANYA */ - 50 => 'osma', - /* SCRIPT_CYPRIOT */ - 51 => 'cprt', - /* SCRIPT_BRAILLE */ - 52 => 'brai', - /* SCRIPT_BUGINESE */ - 53 => 'bugi', - /* SCRIPT_COPTIC */ - 54 => 'copt', - /* SCRIPT_NEW_TAI_LUE */ - 55 => 'talu', - /* SCRIPT_GLAGOLITIC */ - 56 => 'glag', - /* SCRIPT_TIFINAGH */ - 57 => 'tfng', - /* SCRIPT_SYLOTI_NAGRI */ - 58 => 'sylo', - /* SCRIPT_OLD_PERSIAN */ - 59 => 'xpeo', - /* SCRIPT_KHAROSHTHI */ - 60 => 'khar', - /* SCRIPT_BALINESE */ - 61 => 'bali', - /* SCRIPT_CUNEIFORM */ - 62 => 'xsux', - /* SCRIPT_PHOENICIAN */ - 63 => 'phnx', - /* SCRIPT_PHAGS_PA */ - 64 => 'phag', - /* SCRIPT_NKO */ - 65 => 'nko ', - /* SCRIPT_SUNDANESE */ - 66 => 'sund', - /* SCRIPT_LEPCHA */ - 67 => 'lepc', - /* SCRIPT_OL_CHIKI */ - 68 => 'olck', - /* SCRIPT_VAI */ - 69 => 'vai ', - /* SCRIPT_SAURASHTRA */ - 70 => 'saur', - /* SCRIPT_KAYAH_LI */ - 71 => 'kali', - /* SCRIPT_REJANG */ - 72 => 'rjng', - /* SCRIPT_LYCIAN */ - 73 => 'lyci', - /* SCRIPT_CARIAN */ - 74 => 'cari', - /* SCRIPT_LYDIAN */ - 75 => 'lydi', - /* SCRIPT_CHAM */ - 76 => 'cham', - /* SCRIPT_TAI_THAM */ - 77 => 'lana', - /* SCRIPT_TAI_VIET */ - 78 => 'tavt', - /* SCRIPT_AVESTAN */ - 79 => 'avst', - /* SCRIPT_EGYPTIAN_HIEROGLYPHS */ - 80 => 'egyp', - /* SCRIPT_SAMARITAN */ - 81 => 'samr', - /* SCRIPT_LISU */ - 82 => 'lisu', - /* SCRIPT_BAMUM */ - 83 => 'bamu', - /* SCRIPT_JAVANESE */ - 84 => 'java', - /* SCRIPT_MEETEI_MAYEK */ - 85 => 'mtei', - /* SCRIPT_IMPERIAL_ARAMAIC */ - 86 => 'armi', - /* SCRIPT_OLD_SOUTH_ARABIAN */ - 87 => 'sarb', - /* SCRIPT_INSCRIPTIONAL_PARTHIAN */ - 88 => 'prti', - /* SCRIPT_INSCRIPTIONAL_PAHLAVI */ - 89 => 'phli', - /* SCRIPT_OLD_TURKIC */ - 90 => 'orkh', - /* SCRIPT_KAITHI */ - 91 => 'kthi', - /* SCRIPT_BATAK */ - 92 => 'batk', - /* SCRIPT_BRAHMI */ - 93 => 'brah', - /* SCRIPT_MANDAIC */ - 94 => 'mand', - /* SCRIPT_CHAKMA */ - 95 => 'cakm', - /* SCRIPT_MEROITIC_CURSIVE */ - 96 => 'merc', - /* SCRIPT_MEROITIC_HIEROGLYPHS */ - 97 => 'mero', - /* SCRIPT_MIAO */ - 98 => 'plrd', - /* SCRIPT_SHARADA */ - 99 => 'shrd', - /* SCRIPT_SORA_SOMPENG */ - 100 => 'sora', - /* SCRIPT_TAKRI */ - 101 => 'takr', - /* SCRIPT_UNKNOWN */ - 102 => '', - ]; - public static $ot_languages = [ - 'aa' => 'AFR ', - /* Afar */ - 'ab' => 'ABK ', - /* Abkhazian */ - 'abq' => 'ABA ', - /* Abaza */ - 'ada' => 'DNG ', - /* Dangme */ - 'ady' => 'ADY ', - /* Adyghe */ - 'af' => 'AFK ', - /* Afrikaans */ - 'aii' => 'SWA ', - /* Swadaya Aramaic */ - 'aiw' => 'ARI ', - /* Aari */ - 'alt' => 'ALT ', - /* [Southern] Altai */ - 'am' => 'AMH ', - /* Amharic */ - 'amf' => 'HBN ', - /* Hammer-Banna */ - 'ar' => 'ARA ', - /* Arabic */ - 'arn' => 'MAP ', - /* Mapudungun */ - 'as' => 'ASM ', - /* Assamese */ - 'ath' => 'ATH ', - /* Athapaskan [family] */ - 'atv' => 'ALT ', - /* [Northern] Altai */ - 'av' => 'AVR ', - /* Avaric */ - 'awa' => 'AWA ', - /* Awadhi */ - 'ay' => 'AYM ', - /* Aymara */ - 'az' => 'AZE ', - /* Azerbaijani */ - 'ba' => 'BSH ', - /* Bashkir */ - 'bai' => 'BML ', - /* Bamileke [family] */ - 'bal' => 'BLI ', - /* Baluchi */ - 'bci' => 'BAU ', - /* Baule */ - 'bcq' => 'BCH ', - /* Bench */ - 'be' => 'BEL ', - /* Belarussian */ - 'bem' => 'BEM ', - /* Bemba (Zambia) */ - 'ber' => 'BER ', - /* Berber [family] */ - 'bfq' => 'BAD ', - /* Badaga */ - 'bft' => 'BLT ', - /* Balti */ - 'bfy' => 'BAG ', - /* Baghelkhandi */ - 'bg' => 'BGR ', - /* Bulgarian */ - 'bhb' => 'BHI ', - /* Bhili */ - 'bho' => 'BHO ', - /* Bhojpuri */ - 'bik' => 'BIK ', - /* Bikol */ - 'bin' => 'EDO ', - /* Bini */ - 'bjt' => 'BLN ', - /* Balanta-Ganja */ - 'bla' => 'BKF ', - /* Blackfoot */ - 'ble' => 'BLN ', - /* Balanta-Kentohe */ - 'bm' => 'BMB ', - /* Bambara */ - 'bn' => 'BEN ', - /* Bengali */ - 'bo' => 'TIB ', - /* Tibetan */ - 'br' => 'BRE ', - /* Breton */ - 'bra' => 'BRI ', - /* Braj Bhasha */ - 'brh' => 'BRH ', - /* Brahui */ - 'bs' => 'BOS ', - /* Bosnian */ - 'btb' => 'BTI ', - /* Beti (Cameroon) */ - 'bxr' => 'RBU ', - /* Russian Buriat */ - 'byn' => 'BIL ', - /* Bilen */ - 'ca' => 'CAT ', - /* Catalan */ - 'ce' => 'CHE ', - /* Chechen */ - 'ceb' => 'CEB ', - /* Cebuano */ - 'chp' => 'CHP ', - /* Chipewyan */ - 'chr' => 'CHR ', - /* Cherokee */ - 'ckt' => 'CHK ', - /* Chukchi */ - 'cop' => 'COP ', - /* Coptic */ - 'cr' => 'CRE ', - /* Cree */ - 'crh' => 'CRT ', - /* Crimean Tatar */ - 'crj' => 'ECR ', - /* [Southern] East Cree */ - 'crl' => 'ECR ', - /* [Northern] East Cree */ - 'crm' => 'MCR ', - /* Moose Cree */ - 'crx' => 'CRR ', - /* Carrier */ - 'cs' => 'CSY ', - /* Czech */ - 'cu' => 'CSL ', - /* Church Slavic */ - 'cv' => 'CHU ', - /* Chuvash */ - 'cwd' => 'DCR ', - /* Woods Cree */ - 'cy' => 'WEL ', - /* Welsh */ - 'da' => 'DAN ', - /* Danish */ - 'dap' => 'NIS ', - /* Nisi (India) */ - 'dar' => 'DAR ', - /* Dargwa */ - 'de' => 'DEU ', - /* German */ - 'din' => 'DNK ', - /* Dinka */ - 'dje' => 'DJR ', - /* Djerma */ - 'dng' => 'DUN ', - /* Dungan */ - 'doi' => 'DGR ', - /* Dogri */ - 'dsb' => 'LSB ', - /* Lower Sorbian */ - 'dv' => 'DIV ', - /* Dhivehi */ - 'dyu' => 'JUL ', - /* Jula */ - 'dz' => 'DZN ', - /* Dzongkha */ - 'ee' => 'EWE ', - /* Ewe */ - 'efi' => 'EFI ', - /* Efik */ - 'el' => 'ELL ', - /* Modern Greek (1453-) */ - 'grc' => 'PGR ', - /* Polytonic Greek */ - 'en' => 'ENG ', - /* English */ - 'eo' => 'NTO ', - /* Esperanto */ - 'eot' => 'BTI ', - /* Beti (Côte d'Ivoire) */ - 'es' => 'ESP ', - /* Spanish */ - 'et' => 'ETI ', - /* Estonian */ - 'eu' => 'EUQ ', - /* Basque */ - 'eve' => 'EVN ', - /* Even */ - 'evn' => 'EVK ', - /* Evenki */ - 'fa' => 'FAR ', - /* Persian */ - 'ff' => 'FUL ', - /* Fulah */ - 'fi' => 'FIN ', - /* Finnish */ - 'fil' => 'PIL ', - /* Filipino */ - 'fj' => 'FJI ', - /* Fijian */ - 'fo' => 'FOS ', - /* Faroese */ - 'fon' => 'FON ', - /* Fon */ - 'fr' => 'FRA ', - /* French */ - 'fur' => 'FRL ', - /* Friulian */ - 'fy' => 'FRI ', - /* Western Frisian */ - 'ga' => 'IRI ', - /* Irish */ - 'gaa' => 'GAD ', - /* Ga */ - 'gag' => 'GAG ', - /* Gagauz */ - 'gbm' => 'GAW ', - /* Garhwali */ - 'gd' => 'GAE ', - /* Scottish Gaelic */ - 'gez' => 'GEZ ', - /* Ge'ez */ - 'gl' => 'GAL ', - /* Galician */ - 'gld' => 'NAN ', - /* Nanai */ - 'gn' => 'GUA ', - /* Guarani */ - 'gon' => 'GON ', - /* Gondi */ - 'grt' => 'GRO ', - /* Garo */ - 'gru' => 'SOG ', - /* Sodo Gurage */ - 'gu' => 'GUJ ', - /* Gujarati */ - 'guk' => 'GMZ ', - /* Gumuz */ - 'gv' => 'MNX ', - /* Manx Gaelic */ - 'ha' => 'HAU ', - /* Hausa */ - 'har' => 'HRI ', - /* Harari */ - 'haw' => 'HAW ', - /* Hawaiin */ - 'he' => 'IWR ', - /* Hebrew */ - 'hi' => 'HIN ', - /* Hindi */ - 'hil' => 'HIL ', - /* Hiligaynon */ - 'hnd' => 'HND ', - /* [Southern] Hindko */ - 'hne' => 'CHH ', - /* Chattisgarhi */ - 'hno' => 'HND ', - /* [Northern] Hindko */ - 'hoc' => 'HO ', - /* Ho */ - 'hoj' => 'HAR ', - /* Harauti */ - 'hr' => 'HRV ', - /* Croatian */ - 'hsb' => 'USB ', - /* Upper Sorbian */ - 'ht' => 'HAI ', - /* Haitian */ - 'hu' => 'HUN ', - /* Hungarian */ - 'hy' => 'HYE ', - /* Armenian */ - 'id' => 'IND ', - /* Indonesian */ - 'ig' => 'IBO ', - /* Igbo */ - 'igb' => 'EBI ', - /* Ebira */ - 'ijo' => 'IJO ', - /* Ijo [family] */ - 'ilo' => 'ILO ', - /* Ilokano */ - 'inh' => 'ING ', - /* Ingush */ - 'is' => 'ISL ', - /* Icelandic */ - 'it' => 'ITA ', - /* Italian */ - 'iu' => 'INU ', - /* Inuktitut */ - 'ja' => 'JAN ', - /* Japanese */ - 'jv' => 'JAV ', - /* Javanese */ - 'ka' => 'KAT ', - /* Georgian */ - 'kaa' => 'KRK ', - /* Karakalpak */ - 'kam' => 'KMB ', - /* Kamba (Kenya) */ - 'kar' => 'KRN ', - /* Karen [family] */ - 'kbd' => 'KAB ', - /* Kabardian */ - 'kdr' => 'KRM ', - /* Karaim */ - 'kdt' => 'KUY ', - /* Kuy */ - 'kex' => 'KKN ', - /* Kokni */ - 'kfr' => 'KAC ', - /* Kachchi */ - 'kfy' => 'KMN ', - /* Kumaoni */ - 'kha' => 'KSI ', - /* Khasi */ - 'khb' => 'XBD ', - /* Tai Lue */ - 'khw' => 'KHW ', - /* Khowar */ - 'ki' => 'KIK ', - /* Kikuyu */ - 'kjh' => 'KHA ', - /* Khakass */ - 'kk' => 'KAZ ', - /* Kazakh */ - 'kl' => 'GRN ', - /* Kalaallisut */ - 'kln' => 'KAL ', - /* Kalenjin */ - 'km' => 'KHM ', - /* Central Khmer */ - 'kmb' => 'MBN ', - /* [North] Mbundu */ - 'kmw' => 'KMO ', - /* Komo (Democratic Republic of Congo) */ - 'kn' => 'KAN ', - /* Kannada */ - 'ko' => 'KOR ', - /* Korean */ - 'koi' => 'KOP ', - /* Komi-Permyak */ - 'kok' => 'KOK ', - /* Konkani */ - 'kpe' => 'KPL ', - /* Kpelle */ - 'kpv' => 'KOZ ', - /* Komi-Zyrian */ - 'kpy' => 'KYK ', - /* Koryak */ - 'kqy' => 'KRT ', - /* Koorete */ - 'kr' => 'KNR ', - /* Kanuri */ - 'kri' => 'KRI ', - /* Krio */ - 'krl' => 'KRL ', - /* Karelian */ - 'kru' => 'KUU ', - /* Kurukh */ - 'ks' => 'KSH ', - /* Kashmiri */ - 'ku' => 'KUR ', - /* Kurdish */ - 'kum' => 'KUM ', - /* Kumyk */ - 'kvd' => 'KUI ', - /* Kui (Indonesia) */ - 'kxc' => 'KMS ', - /* Komso */ - 'kxu' => 'KUI ', - /* Kui (India) */ - 'ky' => 'KIR ', - /* Kirghiz */ - 'la' => 'LAT ', - /* Latin */ - 'lad' => 'JUD ', - /* Ladino */ - 'lb' => 'LTZ ', - /* Luxembourgish */ - 'lbe' => 'LAK ', - /* Lak */ - 'lbj' => 'LDK ', - /* Ladakhi */ - 'lez' => 'LEZ ', - /* Lezgi */ - 'lg' => 'LUG ', - /* Luganda */ - 'lif' => 'LMB ', - /* Limbu */ - 'lld' => 'LAD ', - /* Ladin */ - 'lmn' => 'LAM ', - /* Lambani */ - 'ln' => 'LIN ', - /* Lingala */ - 'lo' => 'LAO ', - /* Lao */ - 'lt' => 'LTH ', - /* Lithuanian */ - 'lu' => 'LUB ', - /* Luba-Katanga */ - 'lua' => 'LUB ', - /* Luba-Kasai */ - 'luo' => 'LUO ', - /* Luo (Kenya and Tanzania) */ - 'lus' => 'MIZ ', - /* Mizo */ - 'luy' => 'LUH ', - /* Luhya [macrolanguage] */ - 'lv' => 'LVI ', - /* Latvian */ - 'lzz' => 'LAZ ', - /* Laz */ - 'mai' => 'MTH ', - /* Maithili */ - 'mdc' => 'MLE ', - /* Male (Papua New Guinea) */ - 'mdf' => 'MOK ', - /* Moksha */ - 'mdy' => 'MLE ', - /* Male (Ethiopia) */ - 'men' => 'MDE ', - /* Mende (Sierra Leone) */ - 'mg' => 'MLG ', - /* Malagasy */ - 'mhr' => 'LMA ', - /* Low Mari */ - 'mi' => 'MRI ', - /* Maori */ - 'mk' => 'MKD ', - /* Macedonian */ - 'ml' => 'MLR ', - /* Malayalam reformed (MAL is Malayalam Traditional) */ - 'mn' => 'MNG ', - /* Mongolian */ - 'mnc' => 'MCH ', - /* Manchu */ - 'mni' => 'MNI ', - /* Manipuri */ - 'mnk' => 'MND ', - /* Mandinka */ - 'mns' => 'MAN ', - /* Mansi */ - 'mnw' => 'MON ', - /* Mon */ - 'mo' => 'MOL ', - /* Moldavian */ - 'moh' => 'MOH ', - /* Mohawk */ - 'mpe' => 'MAJ ', - /* Majang */ - 'mr' => 'MAR ', - /* Marathi */ - 'mrj' => 'HMA ', - /* High Mari */ - 'ms' => 'MLY ', - /* Malay */ - 'mt' => 'MTS ', - /* Maltese */ - 'mwr' => 'MAW ', - /* Marwari */ - 'my' => 'BRM ', - /* Burmese */ - 'mym' => 'MEN ', - /* Me'en */ - 'myv' => 'ERZ ', - /* Erzya */ - 'nag' => 'NAG ', - /* Naga-Assamese */ - 'nb' => 'NOR ', - /* Norwegian Bokmål */ - 'nco' => 'SIB ', - /* Sibe */ - 'nd' => 'NDB ', - /* [North] Ndebele */ - 'ne' => 'NEP ', - /* Nepali */ - 'new' => 'NEW ', - /* Newari */ - 'ng' => 'NDG ', - /* Ndonga */ - 'ngl' => 'LMW ', - /* Lomwe */ - 'niu' => 'NIU ', - /* Niuean */ - 'niv' => 'GIL ', - /* Gilyak */ - 'nl' => 'NLD ', - /* Dutch */ - 'nn' => 'NYN ', - /* Norwegian Nynorsk */ - 'no' => 'NOR ', - /* Norwegian (deprecated) */ - 'nod' => 'NTA ', - /* Northern Tai */ - 'nog' => 'NOG ', - /* Nogai */ - 'nqo' => 'NKO ', - /* N'Ko */ - 'nr' => 'NDB ', - /* [South] Ndebele */ - 'nsk' => 'NAS ', - /* Naskapi */ - 'nso' => 'SOT ', - /* [Northern] Sotho */ - 'ny' => 'CHI ', - /* Nyanja */ - 'nyn' => 'NKL ', - /* Nkole */ - 'oc' => 'OCI ', - /* Occitan (post 1500) */ - 'oj' => 'OJB ', - /* Ojibwa */ - 'ojs' => 'OCR ', - /* Oji-Cree */ - 'om' => 'ORO ', - /* Oromo */ - 'or' => 'ORI ', - /* Oriya */ - 'os' => 'OSS ', - /* Ossetian */ - 'pa' => 'PAN ', - /* Panjabi */ - 'pce' => 'PLG ', - /* [Ruching] Palaung */ - 'pi' => 'PAL ', - /* Pali */ - 'pl' => 'PLK ', - /* Polish */ - 'pll' => 'PLG ', - /* [Shwe] Palaung */ - 'plp' => 'PAP ', - /* Palpa */ - 'prs' => 'DRI ', - /* Dari */ - 'ps' => 'PAS ', - /* Pushto */ - 'pt' => 'PTG ', - /* Portuguese */ - 'raj' => 'RAJ ', - /* Rajasthani */ - 'rbb' => 'PLG ', - /* [Rumai] Palaung */ - 'ria' => 'RIA ', - /* Riang (India) */ - 'ril' => 'RIA ', - /* Riang (Myanmar) */ - 'rki' => 'ARK ', - /* Arakanese */ - 'rm' => 'RMS ', - /* Rhaeto-Romanic */ - 'ro' => 'ROM ', - /* Romanian */ - 'rom' => 'ROY ', - /* Romany */ - 'ru' => 'RUS ', - /* Russian */ - 'rue' => 'RSY ', - /* Rusyn */ - 'rw' => 'RUA ', - /* Ruanda */ - 'sa' => 'SAN ', - /* Sanskrit */ - 'sah' => 'YAK ', - /* Yakut */ - 'sat' => 'SAT ', - /* Santali */ - 'sck' => 'SAD ', - /* Sadri */ - 'scs' => 'SLA ', - /* [North] Slavey */ - 'sd' => 'SND ', - /* Sindhi */ - 'se' => 'NSM ', - /* Northern Sami */ - 'seh' => 'SNA ', - /* Sena */ - 'sel' => 'SEL ', - /* Selkup */ - 'sg' => 'SGO ', - /* Sango */ - 'shn' => 'SHN ', - /* Shan */ - 'si' => 'SNH ', - /* Sinhala */ - 'sid' => 'SID ', - /* Sidamo */ - 'sjd' => 'KSM ', - /* Kildin Sami */ - 'sk' => 'SKY ', - /* Slovak */ - 'skr' => 'SRK ', - /* Seraiki */ - 'sl' => 'SLV ', - /* Slovenian */ - 'sm' => 'SMO ', - /* Samoan */ - 'sma' => 'SSM ', - /* Southern Sami */ - 'smj' => 'LSM ', - /* Lule Sami */ - 'smn' => 'ISM ', - /* Inari Sami */ - 'sms' => 'SKS ', - /* Skolt Sami */ - 'snk' => 'SNK ', - /* Soninke */ - 'so' => 'SML ', - /* Somali */ - 'sq' => 'SQI ', - /* Albanian */ - 'sr' => 'SRB ', - /* Serbian */ - 'srr' => 'SRR ', - /* Serer */ - 'ss' => 'SWZ ', - /* Swazi */ - 'st' => 'SOT ', - /* [Southern] Sotho */ - 'suq' => 'SUR ', - /* Suri */ - 'sv' => 'SVE ', - /* Swedish */ - 'sva' => 'SVA ', - /* Svan */ - 'sw' => 'SWK ', - /* Swahili */ - 'swb' => 'CMR ', - /* Comorian */ - 'syr' => 'SYR ', - /* Syriac */ - 'ta' => 'TAM ', - /* Tamil */ - 'tab' => 'TAB ', - /* Tabasaran */ - 'tcy' => 'TUL ', - /* Tulu */ - 'te' => 'TEL ', - /* Telugu */ - 'tem' => 'TMN ', - /* Temne */ - 'tg' => 'TAJ ', - /* Tajik */ - 'th' => 'THA ', - /* Thai */ - 'ti' => 'TGY ', - /* Tigrinya */ - 'tig' => 'TGR ', - /* Tigre */ - 'tk' => 'TKM ', - /* Turkmen */ - 'tn' => 'TNA ', - /* Tswana */ - 'to' => 'TGN ', - /* Tonga (Tonga Islands) */ - 'tr' => 'TRK ', - /* Turkish */ - 'tru' => 'TUA ', - /* Turoyo Aramaic */ - 'ts' => 'TSG ', - /* Tsonga */ - 'tt' => 'TAT ', - /* Tatar */ - 'tw' => 'TWI ', - /* Twi */ - 'ty' => 'THT ', - /* Tahitian */ - 'tyv' => 'TUV ', - /* Tuvin */ - 'udm' => 'UDM ', - /* Udmurt */ - 'ug' => 'UYG ', - /* Uighur */ - 'uk' => 'UKR ', - /* Ukrainian */ - 'umb' => 'MBN ', - /* [South] Mbundu */ - 'unr' => 'MUN ', - /* Mundari */ - 'ur' => 'URD ', - /* Urdu */ - 'uz' => 'UZB ', - /* Uzbek */ - 've' => 'VEN ', - /* Venda */ - 'vi' => 'VIT ', - /* Vietnamese */ - 'vmw' => 'MAK ', - /* Makua */ - 'wbm' => 'WA ', - /* Wa */ - 'wbr' => 'WAG ', - /* Wagdi */ - 'wo' => 'WLF ', - /* Wolof */ - 'xal' => 'KLM ', - /* Kalmyk */ - 'xh' => 'XHS ', - /* Xhosa */ - 'xom' => 'KMO ', - /* Komo (Sudan) */ - 'xsl' => 'SSL ', - /* South Slavey */ - 'yi' => 'JII ', - /* Yiddish */ - 'yid' => 'JII ', - /* Yiddish */ - 'yo' => 'YBA ', - /* Yoruba */ - 'yso' => 'NIS ', - /* Nisi (China) */ - 'zne' => 'ZND ', - /* Zande */ - 'zu' => 'ZUL ', - /* Zulu */ - 'zh-cn' => 'ZHS ', - /* Chinese (China) */ - 'zh-hk' => 'ZHH ', - /* Chinese (Hong Kong) */ - 'zh-mo' => 'ZHT ', - /* Chinese (Macao) */ - 'zh-sg' => 'ZHS ', - /* Chinese (Singapore) */ - 'zh-tw' => 'ZHT ', - ]; - // hb-unicode.h - const UNICODE_GENERAL_CATEGORY_CONTROL = 0; - /* Cc */ - const UNICODE_GENERAL_CATEGORY_FORMAT = 1; - /* Cf */ - const UNICODE_GENERAL_CATEGORY_UNASSIGNED = 2; - /* Cn */ - const UNICODE_GENERAL_CATEGORY_PRIVATE_USE = 3; - /* Co */ - const UNICODE_GENERAL_CATEGORY_SURROGATE = 4; - /* Cs */ - const UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER = 5; - /* Ll */ - const UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER = 6; - /* Lm */ - const UNICODE_GENERAL_CATEGORY_OTHER_LETTER = 7; - /* Lo */ - const UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER = 8; - /* Lt */ - const UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER = 9; - /* Lu */ - const UNICODE_GENERAL_CATEGORY_SPACING_MARK = 10; - /* Mc */ - const UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK = 11; - /* Me */ - const UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK = 12; - /* Mn */ - const UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER = 13; - /* Nd */ - const UNICODE_GENERAL_CATEGORY_LETTER_NUMBER = 14; - /* Nl */ - const UNICODE_GENERAL_CATEGORY_OTHER_NUMBER = 15; - /* No */ - const UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION = 16; - /* Pc */ - const UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION = 17; - /* Pd */ - const UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION = 18; - /* Pe */ - const UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION = 19; - /* Pf */ - const UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION = 20; - /* Pi */ - const UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION = 21; - /* Po */ - const UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION = 22; - /* Ps */ - const UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL = 23; - /* Sc */ - const UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL = 24; - /* Sk */ - const UNICODE_GENERAL_CATEGORY_MATH_SYMBOL = 25; - /* Sm */ - const UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL = 26; - /* So */ - const UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR = 27; - /* Zl */ - const UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR = 28; - /* Zp */ - const UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR = 29; - /* Zs */ - function general_category_is_mark($gen_cat) - { - return $gen_cat == self::UNICODE_GENERAL_CATEGORY_SPACING_MARK || $gen_cat == self::UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK || $gen_cat == self::UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK; - // define UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) - //if (FLAG(gen_cat) & (FLAG(UNICODE_GENERAL_CATEGORY_SPACING_MARK) | FLAG(UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | FLAG(UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) { return true; } - } - const BIDI_CLASS_L = 0; - const BIDI_CLASS_LRE = 1; - const BIDI_CLASS_LRO = 2; - const BIDI_CLASS_R = 3; - const BIDI_CLASS_AL = 4; - const BIDI_CLASS_RLE = 5; - const BIDI_CLASS_RLO = 6; - const BIDI_CLASS_PDF = 7; - const BIDI_CLASS_EN = 8; - const BIDI_CLASS_ES = 9; - const BIDI_CLASS_ET = 10; - const BIDI_CLASS_AN = 11; - const BIDI_CLASS_CS = 12; - const BIDI_CLASS_NSM = 13; - const BIDI_CLASS_BN = 14; - const BIDI_CLASS_B = 15; - const BIDI_CLASS_S = 16; - const BIDI_CLASS_WS = 17; - const BIDI_CLASS_ON = 18; - // UNIDATA_VERSION 6.2.0 - /* a list of unique database records */ - /* struct { - category; - combining; - bidi_class; - mirrored; - east_asian_width; - normalization_check; - script; - } - */ - private static $ucd_records = [[2, 0, 18, 0, 5, 0, 102], [0, 0, 14, 0, 5, 0, 0], [0, 0, 16, 0, 5, 0, 0], [0, 0, 15, 0, 5, 0, 0], [0, 0, 17, 0, 5, 0, 0], [29, 0, 17, 0, 3, 0, 0], [21, 0, 18, 0, 3, 0, 0], [21, 0, 10, 0, 3, 0, 0], [23, 0, 10, 0, 3, 0, 0], [22, 0, 18, 1, 3, 0, 0], [18, 0, 18, 1, 3, 0, 0], [25, 0, 9, 0, 3, 0, 0], [21, 0, 12, 0, 3, 0, 0], [17, 0, 9, 0, 3, 0, 0], [13, 0, 8, 0, 3, 0, 0], [25, 0, 18, 1, 3, 0, 0], [25, 0, 18, 0, 3, 0, 0], [9, 0, 0, 0, 3, 0, 1], [24, 0, 18, 0, 3, 0, 0], [16, 0, 18, 0, 3, 0, 0], [5, 0, 0, 0, 3, 0, 1], [29, 0, 12, 0, 5, 0, 0], [21, 0, 18, 0, 4, 0, 0], [23, 0, 10, 0, 4, 0, 0], [26, 0, 18, 0, 3, 0, 0], [24, 0, 18, 0, 4, 0, 0], [26, 0, 18, 0, 5, 0, 0], [7, 0, 0, 0, 4, 0, 1], [20, 0, 18, 1, 5, 0, 0], [1, 0, 14, 0, 4, 0, 0], [26, 0, 18, 0, 4, 0, 0], [26, 0, 10, 0, 4, 0, 0], [25, 0, 10, 0, 4, 0, 0], [15, 0, 8, 0, 4, 0, 0], [5, 0, 0, 0, 5, 0, 0], [19, 0, 18, 1, 5, 0, 0], [15, 0, 18, 0, 4, 0, 0], [9, 0, 0, 0, 5, 0, 1], [9, 0, 0, 0, 4, 0, 1], [25, 0, 18, 0, 4, 0, 0], [5, 0, 0, 0, 4, 0, 1], [5, 0, 0, 0, 5, 0, 1], [7, 0, 0, 0, 5, 0, 1], [8, 0, 0, 0, 5, 0, 1], [6, 0, 0, 0, 5, 0, 1], [6, 0, 18, 0, 5, 0, 0], [6, 0, 0, 0, 5, 0, 0], [24, 0, 18, 0, 5, 0, 0], [6, 0, 18, 0, 4, 0, 0], [6, 0, 0, 0, 4, 0, 0], [24, 0, 18, 0, 5, 0, 34], [12, 230, 13, 0, 4, 0, 40], [12, 232, 13, 0, 4, 0, 40], [12, 220, 13, 0, 4, 0, 40], [12, 216, 13, 0, 4, 0, 40], [12, 202, 13, 0, 4, 0, 40], [12, 1, 13, 0, 4, 0, 40], [12, 240, 13, 0, 4, 0, 40], [12, 0, 13, 0, 4, 0, 40], [12, 233, 13, 0, 4, 0, 40], [12, 234, 13, 0, 4, 0, 40], [9, 0, 0, 0, 5, 0, 2], [5, 0, 0, 0, 5, 0, 2], [24, 0, 18, 0, 5, 0, 2], [2, 0, 18, 0, 5, 0, 102], [6, 0, 0, 0, 5, 0, 2], [21, 0, 18, 0, 5, 0, 0], [9, 0, 0, 0, 4, 0, 2], [5, 0, 0, 0, 4, 0, 2], [9, 0, 0, 0, 5, 0, 54], [5, 0, 0, 0, 5, 0, 54], [25, 0, 18, 0, 5, 0, 2], [9, 0, 0, 0, 5, 0, 3], [9, 0, 0, 0, 4, 0, 3], [5, 0, 0, 0, 4, 0, 3], [5, 0, 0, 0, 5, 0, 3], [26, 0, 0, 0, 5, 0, 3], [12, 230, 13, 0, 5, 0, 3], [12, 230, 13, 0, 5, 0, 40], [11, 0, 13, 0, 5, 0, 3], [9, 0, 0, 0, 5, 0, 4], [6, 0, 0, 0, 5, 0, 4], [21, 0, 0, 0, 5, 0, 4], [5, 0, 0, 0, 5, 0, 4], [21, 0, 0, 0, 5, 0, 0], [17, 0, 18, 0, 5, 0, 4], [23, 0, 10, 0, 5, 0, 4], [12, 220, 13, 0, 5, 0, 5], [12, 230, 13, 0, 5, 0, 5], [12, 222, 13, 0, 5, 0, 5], [12, 228, 13, 0, 5, 0, 5], [12, 10, 13, 0, 5, 0, 5], [12, 11, 13, 0, 5, 0, 5], [12, 12, 13, 0, 5, 0, 5], [12, 13, 13, 0, 5, 0, 5], [12, 14, 13, 0, 5, 0, 5], [12, 15, 13, 0, 5, 0, 5], [12, 16, 13, 0, 5, 0, 5], [12, 17, 13, 0, 5, 0, 5], [12, 18, 13, 0, 5, 0, 5], [12, 19, 13, 0, 5, 0, 5], [12, 20, 13, 0, 5, 0, 5], [12, 21, 13, 0, 5, 0, 5], [12, 22, 13, 0, 5, 0, 5], [17, 0, 3, 0, 5, 0, 5], [12, 23, 13, 0, 5, 0, 5], [21, 0, 3, 0, 5, 0, 5], [12, 24, 13, 0, 5, 0, 5], [12, 25, 13, 0, 5, 0, 5], [7, 0, 3, 0, 5, 0, 5], [1, 0, 11, 0, 5, 0, 6], [25, 0, 18, 0, 5, 0, 6], [25, 0, 4, 0, 5, 0, 6], [21, 0, 10, 0, 5, 0, 6], [23, 0, 4, 0, 5, 0, 6], [21, 0, 12, 0, 5, 0, 0], [21, 0, 4, 0, 5, 0, 6], [26, 0, 18, 0, 5, 0, 6], [12, 230, 13, 0, 5, 0, 6], [12, 30, 13, 0, 5, 0, 6], [12, 31, 13, 0, 5, 0, 6], [12, 32, 13, 0, 5, 0, 6], [21, 0, 4, 0, 5, 0, 0], [7, 0, 4, 0, 5, 0, 6], [6, 0, 4, 0, 5, 0, 0], [12, 27, 13, 0, 5, 0, 40], [12, 28, 13, 0, 5, 0, 40], [12, 29, 13, 0, 5, 0, 40], [12, 30, 13, 0, 5, 0, 40], [12, 31, 13, 0, 5, 0, 40], [12, 32, 13, 0, 5, 0, 40], [12, 33, 13, 0, 5, 0, 40], [12, 34, 13, 0, 5, 0, 40], [12, 220, 13, 0, 5, 0, 40], [12, 220, 13, 0, 5, 0, 6], [13, 0, 11, 0, 5, 0, 0], [21, 0, 11, 0, 5, 0, 6], [12, 35, 13, 0, 5, 0, 40], [1, 0, 11, 0, 5, 0, 0], [6, 0, 4, 0, 5, 0, 6], [13, 0, 8, 0, 5, 0, 6], [26, 0, 4, 0, 5, 0, 6], [21, 0, 4, 0, 5, 0, 7], [1, 0, 4, 0, 5, 0, 7], [7, 0, 4, 0, 5, 0, 7], [12, 36, 13, 0, 5, 0, 7], [12, 230, 13, 0, 5, 0, 7], [12, 220, 13, 0, 5, 0, 7], [7, 0, 4, 0, 5, 0, 8], [12, 0, 13, 0, 5, 0, 8], [13, 0, 3, 0, 5, 0, 65], [7, 0, 3, 0, 5, 0, 65], [12, 230, 13, 0, 5, 0, 65], [12, 220, 13, 0, 5, 0, 65], [6, 0, 3, 0, 5, 0, 65], [26, 0, 18, 0, 5, 0, 65], [21, 0, 18, 0, 5, 0, 65], [7, 0, 3, 0, 5, 0, 81], [12, 230, 13, 0, 5, 0, 81], [6, 0, 3, 0, 5, 0, 81], [21, 0, 3, 0, 5, 0, 81], [7, 0, 3, 0, 5, 0, 94], [12, 220, 13, 0, 5, 0, 94], [21, 0, 3, 0, 5, 0, 94], [12, 27, 13, 0, 5, 0, 6], [12, 28, 13, 0, 5, 0, 6], [12, 29, 13, 0, 5, 0, 6], [12, 0, 13, 0, 5, 0, 9], [10, 0, 0, 0, 5, 0, 9], [7, 0, 0, 0, 5, 0, 9], [12, 7, 13, 0, 5, 0, 9], [12, 9, 13, 0, 5, 0, 9], [12, 230, 13, 0, 5, 0, 9], [13, 0, 0, 0, 5, 0, 9], [21, 0, 0, 0, 5, 0, 9], [6, 0, 0, 0, 5, 0, 9], [12, 0, 13, 0, 5, 0, 10], [10, 0, 0, 0, 5, 0, 10], [7, 0, 0, 0, 5, 0, 10], [12, 7, 13, 0, 5, 0, 10], [12, 9, 13, 0, 5, 0, 10], [13, 0, 0, 0, 5, 0, 10], [23, 0, 10, 0, 5, 0, 10], [15, 0, 0, 0, 5, 0, 10], [26, 0, 0, 0, 5, 0, 10], [12, 0, 13, 0, 5, 0, 11], [10, 0, 0, 0, 5, 0, 11], [7, 0, 0, 0, 5, 0, 11], [12, 7, 13, 0, 5, 0, 11], [12, 9, 13, 0, 5, 0, 11], [13, 0, 0, 0, 5, 0, 11], [12, 0, 13, 0, 5, 0, 12], [10, 0, 0, 0, 5, 0, 12], [7, 0, 0, 0, 5, 0, 12], [12, 7, 13, 0, 5, 0, 12], [12, 9, 13, 0, 5, 0, 12], [13, 0, 0, 0, 5, 0, 12], [21, 0, 0, 0, 5, 0, 12], [23, 0, 10, 0, 5, 0, 12], [12, 0, 13, 0, 5, 0, 13], [10, 0, 0, 0, 5, 0, 13], [7, 0, 0, 0, 5, 0, 13], [12, 7, 13, 0, 5, 0, 13], [12, 9, 13, 0, 5, 0, 13], [13, 0, 0, 0, 5, 0, 13], [26, 0, 0, 0, 5, 0, 13], [15, 0, 0, 0, 5, 0, 13], [12, 0, 13, 0, 5, 0, 14], [7, 0, 0, 0, 5, 0, 14], [10, 0, 0, 0, 5, 0, 14], [12, 9, 13, 0, 5, 0, 14], [13, 0, 0, 0, 5, 0, 14], [15, 0, 0, 0, 5, 0, 14], [26, 0, 18, 0, 5, 0, 14], [23, 0, 10, 0, 5, 0, 14], [10, 0, 0, 0, 5, 0, 15], [7, 0, 0, 0, 5, 0, 15], [12, 0, 13, 0, 5, 0, 15], [12, 9, 13, 0, 5, 0, 15], [12, 84, 13, 0, 5, 0, 15], [12, 91, 13, 0, 5, 0, 15], [13, 0, 0, 0, 5, 0, 15], [15, 0, 18, 0, 5, 0, 15], [26, 0, 0, 0, 5, 0, 15], [10, 0, 0, 0, 5, 0, 16], [7, 0, 0, 0, 5, 0, 16], [12, 7, 13, 0, 5, 0, 16], [12, 0, 0, 0, 5, 0, 16], [12, 0, 13, 0, 5, 0, 16], [12, 9, 13, 0, 5, 0, 16], [13, 0, 0, 0, 5, 0, 16], [10, 0, 0, 0, 5, 0, 17], [7, 0, 0, 0, 5, 0, 17], [12, 0, 13, 0, 5, 0, 17], [12, 9, 13, 0, 5, 0, 17], [13, 0, 0, 0, 5, 0, 17], [15, 0, 0, 0, 5, 0, 17], [26, 0, 0, 0, 5, 0, 17], [10, 0, 0, 0, 5, 0, 18], [7, 0, 0, 0, 5, 0, 18], [12, 9, 13, 0, 5, 0, 18], [12, 0, 13, 0, 5, 0, 18], [21, 0, 0, 0, 5, 0, 18], [7, 0, 0, 0, 5, 0, 19], [12, 0, 13, 0, 5, 0, 19], [12, 103, 13, 0, 5, 0, 19], [12, 9, 13, 0, 5, 0, 19], [23, 0, 10, 0, 5, 0, 0], [6, 0, 0, 0, 5, 0, 19], [12, 107, 13, 0, 5, 0, 19], [21, 0, 0, 0, 5, 0, 19], [13, 0, 0, 0, 5, 0, 19], [7, 0, 0, 0, 5, 0, 20], [12, 0, 13, 0, 5, 0, 20], [12, 118, 13, 0, 5, 0, 20], [6, 0, 0, 0, 5, 0, 20], [12, 122, 13, 0, 5, 0, 20], [13, 0, 0, 0, 5, 0, 20], [7, 0, 0, 0, 5, 0, 21], [26, 0, 0, 0, 5, 0, 21], [21, 0, 0, 0, 5, 0, 21], [12, 220, 13, 0, 5, 0, 21], [13, 0, 0, 0, 5, 0, 21], [15, 0, 0, 0, 5, 0, 21], [12, 216, 13, 0, 5, 0, 21], [22, 0, 18, 1, 5, 0, 21], [18, 0, 18, 1, 5, 0, 21], [10, 0, 0, 0, 5, 0, 21], [12, 129, 13, 0, 5, 0, 21], [12, 130, 13, 0, 5, 0, 21], [12, 0, 13, 0, 5, 0, 21], [12, 132, 13, 0, 5, 0, 21], [12, 230, 13, 0, 5, 0, 21], [12, 9, 13, 0, 5, 0, 21], [26, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 22], [10, 0, 0, 0, 5, 0, 22], [12, 0, 13, 0, 5, 0, 22], [12, 7, 13, 0, 5, 0, 22], [12, 9, 13, 0, 5, 0, 22], [13, 0, 0, 0, 5, 0, 22], [21, 0, 0, 0, 5, 0, 22], [12, 220, 13, 0, 5, 0, 22], [26, 0, 0, 0, 5, 0, 22], [9, 0, 0, 0, 5, 0, 23], [7, 0, 0, 0, 5, 0, 23], [6, 0, 0, 0, 5, 0, 23], [7, 0, 0, 0, 2, 0, 24], [7, 0, 0, 0, 5, 0, 24], [7, 0, 0, 0, 5, 0, 25], [12, 230, 13, 0, 5, 0, 25], [21, 0, 0, 0, 5, 0, 25], [15, 0, 0, 0, 5, 0, 25], [26, 0, 18, 0, 5, 0, 25], [7, 0, 0, 0, 5, 0, 26], [17, 0, 18, 0, 5, 0, 27], [7, 0, 0, 0, 5, 0, 27], [21, 0, 0, 0, 5, 0, 27], [29, 0, 17, 0, 5, 0, 28], [7, 0, 0, 0, 5, 0, 28], [22, 0, 18, 1, 5, 0, 28], [18, 0, 18, 1, 5, 0, 28], [7, 0, 0, 0, 5, 0, 29], [14, 0, 0, 0, 5, 0, 29], [7, 0, 0, 0, 5, 0, 41], [12, 0, 13, 0, 5, 0, 41], [12, 9, 13, 0, 5, 0, 41], [7, 0, 0, 0, 5, 0, 42], [12, 0, 13, 0, 5, 0, 42], [12, 9, 13, 0, 5, 0, 42], [7, 0, 0, 0, 5, 0, 43], [12, 0, 13, 0, 5, 0, 43], [7, 0, 0, 0, 5, 0, 44], [12, 0, 13, 0, 5, 0, 44], [7, 0, 0, 0, 5, 0, 30], [12, 0, 13, 0, 5, 0, 30], [10, 0, 0, 0, 5, 0, 30], [12, 9, 13, 0, 5, 0, 30], [21, 0, 0, 0, 5, 0, 30], [6, 0, 0, 0, 5, 0, 30], [23, 0, 10, 0, 5, 0, 30], [12, 230, 13, 0, 5, 0, 30], [13, 0, 0, 0, 5, 0, 30], [15, 0, 18, 0, 5, 0, 30], [21, 0, 18, 0, 5, 0, 31], [17, 0, 18, 0, 5, 0, 31], [12, 0, 13, 0, 5, 0, 31], [29, 0, 17, 0, 5, 0, 31], [13, 0, 0, 0, 5, 0, 31], [7, 0, 0, 0, 5, 0, 31], [6, 0, 0, 0, 5, 0, 31], [12, 228, 13, 0, 5, 0, 31], [7, 0, 0, 0, 5, 0, 45], [12, 0, 13, 0, 5, 0, 45], [10, 0, 0, 0, 5, 0, 45], [12, 222, 13, 0, 5, 0, 45], [12, 230, 13, 0, 5, 0, 45], [12, 220, 13, 0, 5, 0, 45], [26, 0, 18, 0, 5, 0, 45], [21, 0, 18, 0, 5, 0, 45], [13, 0, 0, 0, 5, 0, 45], [7, 0, 0, 0, 5, 0, 46], [7, 0, 0, 0, 5, 0, 55], [10, 0, 0, 0, 5, 0, 55], [13, 0, 0, 0, 5, 0, 55], [15, 0, 0, 0, 5, 0, 55], [26, 0, 18, 0, 5, 0, 55], [26, 0, 18, 0, 5, 0, 30], [7, 0, 0, 0, 5, 0, 53], [12, 230, 13, 0, 5, 0, 53], [12, 220, 13, 0, 5, 0, 53], [10, 0, 0, 0, 5, 0, 53], [21, 0, 0, 0, 5, 0, 53], [7, 0, 0, 0, 5, 0, 77], [10, 0, 0, 0, 5, 0, 77], [12, 0, 13, 0, 5, 0, 77], [12, 9, 13, 0, 5, 0, 77], [12, 230, 13, 0, 5, 0, 77], [12, 220, 13, 0, 5, 0, 77], [13, 0, 0, 0, 5, 0, 77], [21, 0, 0, 0, 5, 0, 77], [6, 0, 0, 0, 5, 0, 77], [12, 0, 13, 0, 5, 0, 61], [10, 0, 0, 0, 5, 0, 61], [7, 0, 0, 0, 5, 0, 61], [12, 7, 13, 0, 5, 0, 61], [10, 9, 0, 0, 5, 0, 61], [13, 0, 0, 0, 5, 0, 61], [21, 0, 0, 0, 5, 0, 61], [26, 0, 0, 0, 5, 0, 61], [12, 230, 13, 0, 5, 0, 61], [12, 220, 13, 0, 5, 0, 61], [12, 0, 13, 0, 5, 0, 66], [10, 0, 0, 0, 5, 0, 66], [7, 0, 0, 0, 5, 0, 66], [10, 9, 0, 0, 5, 0, 66], [12, 9, 13, 0, 5, 0, 66], [13, 0, 0, 0, 5, 0, 66], [7, 0, 0, 0, 5, 0, 92], [12, 7, 13, 0, 5, 0, 92], [10, 0, 0, 0, 5, 0, 92], [12, 0, 13, 0, 5, 0, 92], [10, 9, 0, 0, 5, 0, 92], [21, 0, 0, 0, 5, 0, 92], [7, 0, 0, 0, 5, 0, 67], [10, 0, 0, 0, 5, 0, 67], [12, 0, 13, 0, 5, 0, 67], [12, 7, 13, 0, 5, 0, 67], [21, 0, 0, 0, 5, 0, 67], [13, 0, 0, 0, 5, 0, 67], [13, 0, 0, 0, 5, 0, 68], [7, 0, 0, 0, 5, 0, 68], [6, 0, 0, 0, 5, 0, 68], [21, 0, 0, 0, 5, 0, 68], [21, 0, 0, 0, 5, 0, 66], [12, 1, 13, 0, 5, 0, 40], [10, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 0], [6, 0, 0, 0, 5, 0, 3], [12, 234, 13, 0, 5, 0, 40], [12, 214, 13, 0, 5, 0, 40], [12, 202, 13, 0, 5, 0, 40], [12, 233, 13, 0, 5, 0, 40], [8, 0, 0, 0, 5, 0, 2], [29, 0, 17, 0, 5, 0, 0], [1, 0, 14, 0, 5, 0, 0], [1, 0, 14, 0, 5, 0, 40], [1, 0, 0, 0, 5, 0, 0], [1, 0, 3, 0, 5, 0, 0], [17, 0, 18, 0, 4, 0, 0], [17, 0, 18, 0, 5, 0, 0], [20, 0, 18, 0, 4, 0, 0], [19, 0, 18, 0, 4, 0, 0], [22, 0, 18, 0, 5, 0, 0], [20, 0, 18, 0, 5, 0, 0], [27, 0, 17, 0, 5, 0, 0], [28, 0, 15, 0, 5, 0, 0], [1, 0, 1, 0, 5, 0, 0], [1, 0, 5, 0, 5, 0, 0], [1, 0, 7, 0, 5, 0, 0], [1, 0, 2, 0, 5, 0, 0], [1, 0, 6, 0, 5, 0, 0], [21, 0, 10, 0, 4, 0, 0], [21, 0, 10, 0, 5, 0, 0], [16, 0, 18, 0, 5, 0, 0], [25, 0, 12, 0, 5, 0, 0], [22, 0, 18, 1, 5, 0, 0], [18, 0, 18, 1, 5, 0, 0], [25, 0, 18, 0, 5, 0, 0], [15, 0, 8, 0, 5, 0, 0], [25, 0, 9, 0, 5, 0, 0], [6, 0, 0, 0, 4, 0, 1], [23, 0, 10, 0, 1, 0, 0], [11, 0, 13, 0, 5, 0, 40], [9, 0, 0, 0, 5, 0, 0], [5, 0, 0, 0, 4, 0, 0], [26, 0, 10, 0, 5, 0, 0], [25, 0, 18, 1, 5, 0, 0], [15, 0, 18, 0, 5, 0, 0], [14, 0, 0, 0, 4, 0, 1], [14, 0, 0, 0, 5, 0, 1], [25, 0, 18, 1, 4, 0, 0], [25, 0, 10, 0, 5, 0, 0], [22, 0, 18, 1, 2, 0, 0], [18, 0, 18, 1, 2, 0, 0], [26, 0, 0, 0, 4, 0, 0], [26, 0, 0, 0, 5, 0, 52], [9, 0, 0, 0, 5, 0, 56], [5, 0, 0, 0, 5, 0, 56], [26, 0, 18, 0, 5, 0, 54], [12, 230, 13, 0, 5, 0, 54], [21, 0, 18, 0, 5, 0, 54], [15, 0, 18, 0, 5, 0, 54], [5, 0, 0, 0, 5, 0, 23], [7, 0, 0, 0, 5, 0, 57], [6, 0, 0, 0, 5, 0, 57], [21, 0, 0, 0, 5, 0, 57], [12, 9, 13, 0, 5, 0, 57], [26, 0, 18, 0, 2, 0, 35], [26, 0, 18, 0, 2, 0, 0], [29, 0, 17, 0, 0, 0, 0], [21, 0, 18, 0, 2, 0, 0], [6, 0, 0, 0, 2, 0, 35], [7, 0, 0, 0, 2, 0, 0], [14, 0, 0, 0, 2, 0, 35], [17, 0, 18, 0, 2, 0, 0], [22, 0, 18, 0, 2, 0, 0], [18, 0, 18, 0, 2, 0, 0], [12, 218, 13, 0, 2, 0, 40], [12, 228, 13, 0, 2, 0, 40], [12, 232, 13, 0, 2, 0, 40], [12, 222, 13, 0, 2, 0, 40], [10, 224, 0, 0, 2, 0, 24], [6, 0, 0, 0, 2, 0, 0], [7, 0, 0, 0, 2, 0, 32], [12, 8, 13, 0, 2, 0, 40], [24, 0, 18, 0, 2, 0, 0], [6, 0, 0, 0, 2, 0, 32], [7, 0, 0, 0, 2, 0, 33], [6, 0, 0, 0, 2, 0, 33], [7, 0, 0, 0, 2, 0, 34], [26, 0, 0, 0, 2, 0, 0], [15, 0, 0, 0, 2, 0, 0], [26, 0, 0, 0, 2, 0, 24], [26, 0, 18, 0, 2, 0, 24], [15, 0, 0, 0, 4, 0, 0], [15, 0, 18, 0, 2, 0, 0], [26, 0, 0, 0, 2, 0, 33], [7, 0, 0, 0, 2, 0, 35], [2, 0, 18, 0, 2, 0, 35], [2, 0, 18, 0, 2, 0, 102], [7, 0, 0, 0, 2, 0, 36], [6, 0, 0, 0, 2, 0, 36], [26, 0, 18, 0, 2, 0, 36], [7, 0, 0, 0, 5, 0, 82], [6, 0, 0, 0, 5, 0, 82], [21, 0, 0, 0, 5, 0, 82], [7, 0, 0, 0, 5, 0, 69], [6, 0, 0, 0, 5, 0, 69], [21, 0, 18, 0, 5, 0, 69], [13, 0, 0, 0, 5, 0, 69], [7, 0, 0, 0, 5, 0, 3], [21, 0, 18, 0, 5, 0, 3], [6, 0, 18, 0, 5, 0, 3], [7, 0, 0, 0, 5, 0, 83], [14, 0, 0, 0, 5, 0, 83], [12, 230, 13, 0, 5, 0, 83], [21, 0, 0, 0, 5, 0, 83], [24, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 58], [12, 0, 13, 0, 5, 0, 58], [12, 9, 13, 0, 5, 0, 58], [10, 0, 0, 0, 5, 0, 58], [26, 0, 18, 0, 5, 0, 58], [15, 0, 0, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 64], [21, 0, 18, 0, 5, 0, 64], [10, 0, 0, 0, 5, 0, 70], [7, 0, 0, 0, 5, 0, 70], [12, 9, 13, 0, 5, 0, 70], [21, 0, 0, 0, 5, 0, 70], [13, 0, 0, 0, 5, 0, 70], [13, 0, 0, 0, 5, 0, 71], [7, 0, 0, 0, 5, 0, 71], [12, 0, 13, 0, 5, 0, 71], [12, 220, 13, 0, 5, 0, 71], [21, 0, 0, 0, 5, 0, 71], [7, 0, 0, 0, 5, 0, 72], [12, 0, 13, 0, 5, 0, 72], [10, 0, 0, 0, 5, 0, 72], [10, 9, 0, 0, 5, 0, 72], [21, 0, 0, 0, 5, 0, 72], [12, 0, 13, 0, 5, 0, 84], [10, 0, 0, 0, 5, 0, 84], [7, 0, 0, 0, 5, 0, 84], [12, 7, 13, 0, 5, 0, 84], [10, 9, 0, 0, 5, 0, 84], [21, 0, 0, 0, 5, 0, 84], [6, 0, 0, 0, 5, 0, 84], [13, 0, 0, 0, 5, 0, 84], [7, 0, 0, 0, 5, 0, 76], [12, 0, 13, 0, 5, 0, 76], [10, 0, 0, 0, 5, 0, 76], [13, 0, 0, 0, 5, 0, 76], [21, 0, 0, 0, 5, 0, 76], [6, 0, 0, 0, 5, 0, 22], [7, 0, 0, 0, 5, 0, 78], [12, 230, 13, 0, 5, 0, 78], [12, 220, 13, 0, 5, 0, 78], [6, 0, 0, 0, 5, 0, 78], [21, 0, 0, 0, 5, 0, 78], [7, 0, 0, 0, 5, 0, 85], [10, 0, 0, 0, 5, 0, 85], [12, 0, 13, 0, 5, 0, 85], [21, 0, 0, 0, 5, 0, 85], [6, 0, 0, 0, 5, 0, 85], [12, 9, 13, 0, 5, 0, 85], [13, 0, 0, 0, 5, 0, 85], [2, 0, 18, 0, 2, 0, 24], [4, 0, 0, 0, 5, 0, 102], [3, 0, 0, 0, 4, 0, 102], [2, 0, 18, 0, 4, 0, 102], [12, 26, 13, 0, 5, 0, 5], [25, 0, 9, 0, 5, 0, 5], [24, 0, 4, 0, 5, 0, 6], [18, 0, 18, 0, 5, 0, 0], [16, 0, 18, 0, 2, 0, 0], [21, 0, 12, 0, 2, 0, 0], [21, 0, 10, 0, 2, 0, 0], [25, 0, 9, 0, 2, 0, 0], [17, 0, 9, 0, 2, 0, 0], [25, 0, 18, 1, 2, 0, 0], [25, 0, 18, 0, 2, 0, 0], [23, 0, 10, 0, 2, 0, 0], [21, 0, 18, 0, 0, 0, 0], [21, 0, 10, 0, 0, 0, 0], [23, 0, 10, 0, 0, 0, 0], [22, 0, 18, 1, 0, 0, 0], [18, 0, 18, 1, 0, 0, 0], [25, 0, 9, 0, 0, 0, 0], [21, 0, 12, 0, 0, 0, 0], [17, 0, 9, 0, 0, 0, 0], [13, 0, 8, 0, 0, 0, 0], [25, 0, 18, 1, 0, 0, 0], [25, 0, 18, 0, 0, 0, 0], [9, 0, 0, 0, 0, 0, 1], [24, 0, 18, 0, 0, 0, 0], [16, 0, 18, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 1], [21, 0, 18, 0, 1, 0, 0], [22, 0, 18, 1, 1, 0, 0], [18, 0, 18, 1, 1, 0, 0], [7, 0, 0, 0, 1, 0, 33], [6, 0, 0, 0, 1, 0, 0], [7, 0, 0, 0, 1, 0, 24], [26, 0, 18, 0, 0, 0, 0], [26, 0, 18, 0, 1, 0, 0], [25, 0, 18, 0, 1, 0, 0], [1, 0, 18, 0, 5, 0, 0], [7, 0, 0, 0, 5, 0, 47], [14, 0, 18, 0, 5, 0, 2], [15, 0, 18, 0, 5, 0, 2], [26, 0, 18, 0, 5, 0, 2], [7, 0, 0, 0, 5, 0, 73], [7, 0, 0, 0, 5, 0, 74], [7, 0, 0, 0, 5, 0, 37], [15, 0, 0, 0, 5, 0, 37], [7, 0, 0, 0, 5, 0, 38], [14, 0, 0, 0, 5, 0, 38], [7, 0, 0, 0, 5, 0, 48], [21, 0, 0, 0, 5, 0, 48], [7, 0, 0, 0, 5, 0, 59], [21, 0, 0, 0, 5, 0, 59], [14, 0, 0, 0, 5, 0, 59], [9, 0, 0, 0, 5, 0, 39], [5, 0, 0, 0, 5, 0, 39], [7, 0, 0, 0, 5, 0, 49], [7, 0, 0, 0, 5, 0, 50], [13, 0, 0, 0, 5, 0, 50], [7, 0, 3, 0, 5, 0, 51], [7, 0, 3, 0, 5, 0, 86], [21, 0, 3, 0, 5, 0, 86], [15, 0, 3, 0, 5, 0, 86], [7, 0, 3, 0, 5, 0, 63], [15, 0, 3, 0, 5, 0, 63], [21, 0, 18, 0, 5, 0, 63], [7, 0, 3, 0, 5, 0, 75], [21, 0, 3, 0, 5, 0, 75], [7, 0, 3, 0, 5, 0, 97], [7, 0, 3, 0, 5, 0, 96], [7, 0, 3, 0, 5, 0, 60], [12, 0, 13, 0, 5, 0, 60], [12, 220, 13, 0, 5, 0, 60], [12, 230, 13, 0, 5, 0, 60], [12, 1, 13, 0, 5, 0, 60], [12, 9, 13, 0, 5, 0, 60], [15, 0, 3, 0, 5, 0, 60], [21, 0, 3, 0, 5, 0, 60], [7, 0, 3, 0, 5, 0, 87], [15, 0, 3, 0, 5, 0, 87], [21, 0, 3, 0, 5, 0, 87], [7, 0, 3, 0, 5, 0, 79], [21, 0, 18, 0, 5, 0, 79], [7, 0, 3, 0, 5, 0, 88], [15, 0, 3, 0, 5, 0, 88], [7, 0, 3, 0, 5, 0, 89], [15, 0, 3, 0, 5, 0, 89], [7, 0, 3, 0, 5, 0, 90], [15, 0, 11, 0, 5, 0, 6], [10, 0, 0, 0, 5, 0, 93], [12, 0, 13, 0, 5, 0, 93], [7, 0, 0, 0, 5, 0, 93], [12, 9, 13, 0, 5, 0, 93], [21, 0, 0, 0, 5, 0, 93], [15, 0, 18, 0, 5, 0, 93], [13, 0, 0, 0, 5, 0, 93], [12, 0, 13, 0, 5, 0, 91], [10, 0, 0, 0, 5, 0, 91], [7, 0, 0, 0, 5, 0, 91], [12, 9, 13, 0, 5, 0, 91], [12, 7, 13, 0, 5, 0, 91], [21, 0, 0, 0, 5, 0, 91], [1, 0, 0, 0, 5, 0, 91], [7, 0, 0, 0, 5, 0, 100], [13, 0, 0, 0, 5, 0, 100], [12, 230, 13, 0, 5, 0, 95], [7, 0, 0, 0, 5, 0, 95], [12, 0, 13, 0, 5, 0, 95], [10, 0, 0, 0, 5, 0, 95], [12, 9, 13, 0, 5, 0, 95], [13, 0, 0, 0, 5, 0, 95], [21, 0, 0, 0, 5, 0, 95], [12, 0, 13, 0, 5, 0, 99], [10, 0, 0, 0, 5, 0, 99], [7, 0, 0, 0, 5, 0, 99], [10, 9, 0, 0, 5, 0, 99], [21, 0, 0, 0, 5, 0, 99], [13, 0, 0, 0, 5, 0, 99], [7, 0, 0, 0, 5, 0, 101], [12, 0, 13, 0, 5, 0, 101], [10, 0, 0, 0, 5, 0, 101], [10, 9, 0, 0, 5, 0, 101], [12, 7, 13, 0, 5, 0, 101], [13, 0, 0, 0, 5, 0, 101], [7, 0, 0, 0, 5, 0, 62], [14, 0, 0, 0, 5, 0, 62], [21, 0, 0, 0, 5, 0, 62], [7, 0, 0, 0, 5, 0, 80], [7, 0, 0, 0, 5, 0, 98], [10, 0, 0, 0, 5, 0, 98], [12, 0, 13, 0, 5, 0, 98], [6, 0, 0, 0, 5, 0, 98], [10, 216, 0, 0, 5, 0, 0], [10, 226, 0, 0, 5, 0, 0], [12, 230, 13, 0, 5, 0, 2], [25, 0, 0, 0, 5, 0, 0], [13, 0, 8, 0, 5, 0, 0], [26, 0, 0, 0, 2, 0, 32]]; - /* Mirror unicode characters. Bidirectional Algorithm, at http://www.unicode.org/unicode/reports/tr9/ */ - public static $mirror_pairs = [40 => 41, 41 => 40, 60 => 62, 62 => 60, 91 => 93, 93 => 91, 123 => 125, 125 => 123, 171 => 187, 187 => 171, 3898 => 3899, 3899 => 3898, 3900 => 3901, 3901 => 3900, 5787 => 5788, 5788 => 5787, 8249 => 8250, 8250 => 8249, 8261 => 8262, 8262 => 8261, 8317 => 8318, 8318 => 8317, 8333 => 8334, 8334 => 8333, 8712 => 8715, 8713 => 8716, 8714 => 8717, 8715 => 8712, 8716 => 8713, 8717 => 8714, 8725 => 10741, 8764 => 8765, 8765 => 8764, 8771 => 8909, 8786 => 8787, 8787 => 8786, 8788 => 8789, 8789 => 8788, 8804 => 8805, 8805 => 8804, 8806 => 8807, 8807 => 8806, 8808 => 8809, 8809 => 8808, 8810 => 8811, 8811 => 8810, 8814 => 8815, 8815 => 8814, 8816 => 8817, 8817 => 8816, 8818 => 8819, 8819 => 8818, 8820 => 8821, 8821 => 8820, 8822 => 8823, 8823 => 8822, 8824 => 8825, 8825 => 8824, 8826 => 8827, 8827 => 8826, 8828 => 8829, 8829 => 8828, 8830 => 8831, 8831 => 8830, 8832 => 8833, 8833 => 8832, 8834 => 8835, 8835 => 8834, 8836 => 8837, 8837 => 8836, 8838 => 8839, 8839 => 8838, 8840 => 8841, 8841 => 8840, 8842 => 8843, 8843 => 8842, 8847 => 8848, 8848 => 8847, 8849 => 8850, 8850 => 8849, 8856 => 10680, 8866 => 8867, 8867 => 8866, 8870 => 10974, 8872 => 10980, 8873 => 10979, 8875 => 10981, 8880 => 8881, 8881 => 8880, 8882 => 8883, 8883 => 8882, 8884 => 8885, 8885 => 8884, 8886 => 8887, 8887 => 8886, 8905 => 8906, 8906 => 8905, 8907 => 8908, 8908 => 8907, 8909 => 8771, 8912 => 8913, 8913 => 8912, 8918 => 8919, 8919 => 8918, 8920 => 8921, 8921 => 8920, 8922 => 8923, 8923 => 8922, 8924 => 8925, 8925 => 8924, 8926 => 8927, 8927 => 8926, 8928 => 8929, 8929 => 8928, 8930 => 8931, 8931 => 8930, 8932 => 8933, 8933 => 8932, 8934 => 8935, 8935 => 8934, 8936 => 8937, 8937 => 8936, 8938 => 8939, 8939 => 8938, 8940 => 8941, 8941 => 8940, 8944 => 8945, 8945 => 8944, 8946 => 8954, 8947 => 8955, 8948 => 8956, 8950 => 8957, 8951 => 8958, 8954 => 8946, 8955 => 8947, 8956 => 8948, 8957 => 8950, 8958 => 8951, 8968 => 8969, 8969 => 8968, 8970 => 8971, 8971 => 8970, 9001 => 9002, 9002 => 9001, 10088 => 10089, 10089 => 10088, 10090 => 10091, 10091 => 10090, 10092 => 10093, 10093 => 10092, 10094 => 10095, 10095 => 10094, 10096 => 10097, 10097 => 10096, 10098 => 10099, 10099 => 10098, 10100 => 10101, 10101 => 10100, 10179 => 10180, 10180 => 10179, 10181 => 10182, 10182 => 10181, 10184 => 10185, 10185 => 10184, 10187 => 10189, 10189 => 10187, 10197 => 10198, 10198 => 10197, 10205 => 10206, 10206 => 10205, 10210 => 10211, 10211 => 10210, 10212 => 10213, 10213 => 10212, 10214 => 10215, 10215 => 10214, 10216 => 10217, 10217 => 10216, 10218 => 10219, 10219 => 10218, 10220 => 10221, 10221 => 10220, 10222 => 10223, 10223 => 10222, 10627 => 10628, 10628 => 10627, 10629 => 10630, 10630 => 10629, 10631 => 10632, 10632 => 10631, 10633 => 10634, 10634 => 10633, 10635 => 10636, 10636 => 10635, 10637 => 10640, 10638 => 10639, 10639 => 10638, 10640 => 10637, 10641 => 10642, 10642 => 10641, 10643 => 10644, 10644 => 10643, 10645 => 10646, 10646 => 10645, 10647 => 10648, 10648 => 10647, 10680 => 8856, 10688 => 10689, 10689 => 10688, 10692 => 10693, 10693 => 10692, 10703 => 10704, 10704 => 10703, 10705 => 10706, 10706 => 10705, 10708 => 10709, 10709 => 10708, 10712 => 10713, 10713 => 10712, 10714 => 10715, 10715 => 10714, 10741 => 8725, 10744 => 10745, 10745 => 10744, 10748 => 10749, 10749 => 10748, 10795 => 10796, 10796 => 10795, 10797 => 10798, 10798 => 10797, 10804 => 10805, 10805 => 10804, 10812 => 10813, 10813 => 10812, 10852 => 10853, 10853 => 10852, 10873 => 10874, 10874 => 10873, 10877 => 10878, 10878 => 10877, 10879 => 10880, 10880 => 10879, 10881 => 10882, 10882 => 10881, 10883 => 10884, 10884 => 10883, 10891 => 10892, 10892 => 10891, 10897 => 10898, 10898 => 10897, 10899 => 10900, 10900 => 10899, 10901 => 10902, 10902 => 10901, 10903 => 10904, 10904 => 10903, 10905 => 10906, 10906 => 10905, 10907 => 10908, 10908 => 10907, 10913 => 10914, 10914 => 10913, 10918 => 10919, 10919 => 10918, 10920 => 10921, 10921 => 10920, 10922 => 10923, 10923 => 10922, 10924 => 10925, 10925 => 10924, 10927 => 10928, 10928 => 10927, 10931 => 10932, 10932 => 10931, 10939 => 10940, 10940 => 10939, 10941 => 10942, 10942 => 10941, 10943 => 10944, 10944 => 10943, 10945 => 10946, 10946 => 10945, 10947 => 10948, 10948 => 10947, 10949 => 10950, 10950 => 10949, 10957 => 10958, 10958 => 10957, 10959 => 10960, 10960 => 10959, 10961 => 10962, 10962 => 10961, 10963 => 10964, 10964 => 10963, 10965 => 10966, 10966 => 10965, 10974 => 8870, 10979 => 8873, 10980 => 8872, 10981 => 8875, 10988 => 10989, 10989 => 10988, 10999 => 11000, 11000 => 10999, 11001 => 11002, 11002 => 11001, 11778 => 11779, 11779 => 11778, 11780 => 11781, 11781 => 11780, 11785 => 11786, 11786 => 11785, 11788 => 11789, 11789 => 11788, 11804 => 11805, 11805 => 11804, 11808 => 11809, 11809 => 11808, 11810 => 11811, 11811 => 11810, 11812 => 11813, 11813 => 11812, 11814 => 11815, 11815 => 11814, 11816 => 11817, 11817 => 11816, 12296 => 12297, 12297 => 12296, 12298 => 12299, 12299 => 12298, 12300 => 12301, 12301 => 12300, 12302 => 12303, 12303 => 12302, 12304 => 12305, 12305 => 12304, 12308 => 12309, 12309 => 12308, 12310 => 12311, 12311 => 12310, 12312 => 12313, 12313 => 12312, 12314 => 12315, 12315 => 12314, 65113 => 65114, 65114 => 65113, 65115 => 65116, 65116 => 65115, 65117 => 65118, 65118 => 65117, 65124 => 65125, 65125 => 65124, 65288 => 65289, 65289 => 65288, 65308 => 65310, 65310 => 65308, 65339 => 65341, 65341 => 65339, 65371 => 65373, 65373 => 65371, 65375 => 65376, 65376 => 65375, 65378 => 65379, 65379 => 65378]; - /* index tables for the database records */ - private static $index0 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 55, 56, 57, 57, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 69, 70, 70, 71, 69, 70, 70, 72, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 70, 70, 70, 88, 89, 90, 91, 92, 70, 93, 70, 94, 95, 70, 70, 70, 70, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 97, 97, 97, 98, 99, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 100, 100, 100, 100, 101, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 102, 102, 103, 70, 70, 70, 70, 104, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 105, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 106, 107, 108, 109, 110, 111, 112, 113, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 114, 70, 115, 116, 117, 118, 119, 120, 121, 122, 70, 70, 70, 70, 70, 70, 70, 70, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 123, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 124, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 76, 76, 127, 126, 126, 126, 126, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 129, 130, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 131, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 131]; - private static $index1 = [0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 29, 31, 32, 33, 34, 35, 27, 30, 29, 27, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 27, 27, 49, 27, 27, 27, 27, 27, 27, 27, 50, 51, 52, 27, 53, 54, 53, 54, 54, 54, 54, 54, 55, 54, 54, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 65, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 100, 101, 101, 101, 101, 102, 103, 101, 101, 101, 101, 101, 101, 104, 105, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 106, 107, 108, 108, 108, 109, 110, 111, 112, 112, 112, 112, 113, 114, 115, 116, 117, 118, 119, 120, 106, 121, 121, 121, 122, 123, 106, 124, 125, 126, 127, 128, 128, 128, 128, 129, 130, 131, 132, 133, 134, 135, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 145, 145, 146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150, 151, 152, 153, 106, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 106, 106, 106, 106, 106, 106, 106, 106, 169, 170, 106, 106, 106, 106, 106, 106, 171, 172, 173, 174, 175, 176, 176, 176, 176, 176, 176, 177, 178, 179, 180, 176, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 106, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 106, 224, 225, 226, 106, 227, 228, 229, 230, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 106, 241, 242, 243, 244, 245, 242, 246, 247, 248, 249, 250, 106, 251, 252, 253, 254, 255, 256, 257, 258, 258, 257, 259, 260, 261, 262, 263, 264, 265, 266, 106, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 106, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287, 288, 106, 289, 290, 291, 292, 293, 294, 295, 296, 294, 294, 297, 298, 295, 299, 300, 301, 106, 106, 302, 106, 303, 304, 304, 304, 304, 304, 305, 306, 307, 308, 309, 310, 106, 106, 106, 106, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 106, 106, 106, 106, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 331, 331, 331, 333, 334, 335, 336, 337, 338, 339, 338, 338, 338, 340, 341, 342, 343, 344, 106, 106, 106, 106, 345, 345, 345, 345, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 345, 356, 357, 349, 358, 359, 359, 359, 359, 360, 361, 362, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, 368, 367, 366, 366, 366, 366, 366, 367, 366, 366, 366, 366, 367, 368, 367, 366, 368, 366, 366, 366, 366, 366, 366, 366, 367, 366, 366, 366, 366, 366, 366, 366, 366, 369, 370, 371, 372, 373, 366, 366, 374, 375, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, 106, 378, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 381, 382, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 386, 106, 387, 388, 389, 106, 390, 390, 391, 106, 392, 392, 393, 106, 394, 395, 396, 106, 397, 397, 397, 397, 397, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 412, 412, 412, 413, 412, 412, 412, 412, 412, 412, 106, 412, 412, 412, 412, 412, 414, 379, 379, 379, 379, 379, 379, 379, 379, 415, 106, 416, 416, 416, 417, 418, 419, 420, 421, 422, 423, 424, 424, 424, 425, 426, 106, 427, 427, 427, 427, 427, 428, 429, 429, 430, 431, 432, 433, 434, 434, 434, 434, 435, 435, 436, 437, 438, 438, 438, 438, 438, 438, 439, 440, 441, 442, 443, 444, 445, 446, 445, 446, 447, 448, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 449, 450, 450, 450, 450, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 462, 462, 463, 464, 465, 466, 467, 467, 467, 467, 468, 469, 470, 471, 472, 472, 472, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 481, 481, 482, 106, 106, 106, 106, 106, 106, 106, 106, 483, 106, 484, 485, 486, 487, 488, 106, 54, 54, 54, 54, 489, 490, 56, 56, 56, 56, 56, 491, 492, 493, 54, 494, 54, 54, 54, 495, 56, 56, 56, 496, 497, 498, 499, 500, 501, 106, 106, 502, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 503, 504, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 505, 506, 507, 508, 505, 506, 505, 506, 507, 508, 505, 509, 505, 506, 505, 507, 505, 510, 505, 510, 505, 510, 511, 512, 513, 514, 515, 516, 505, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 56, 538, 539, 540, 539, 541, 106, 106, 542, 543, 544, 545, 546, 106, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 559, 561, 562, 563, 564, 565, 566, 567, 568, 569, 568, 570, 571, 568, 572, 568, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 583, 583, 589, 590, 591, 592, 593, 583, 583, 594, 574, 595, 596, 583, 583, 597, 583, 583, 568, 598, 599, 568, 600, 601, 602, 603, 603, 603, 603, 603, 603, 603, 603, 604, 568, 568, 605, 606, 574, 574, 607, 568, 568, 568, 568, 573, 608, 568, 609, 106, 568, 568, 568, 568, 610, 106, 106, 106, 568, 611, 106, 106, 612, 612, 612, 612, 612, 613, 613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 615, 616, 612, 612, 617, 617, 617, 617, 617, 617, 617, 617, 617, 618, 617, 617, 617, 617, 618, 568, 617, 617, 619, 568, 620, 569, 621, 622, 623, 624, 569, 568, 619, 572, 568, 574, 625, 626, 622, 627, 568, 568, 568, 568, 628, 568, 568, 568, 629, 630, 568, 568, 568, 568, 568, 631, 568, 632, 568, 631, 633, 634, 617, 617, 635, 617, 617, 617, 636, 568, 568, 568, 568, 568, 568, 637, 568, 568, 572, 568, 568, 638, 639, 612, 640, 640, 641, 568, 568, 568, 568, 568, 642, 643, 644, 645, 646, 647, 574, 574, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 649, 650, 650, 651, 583, 583, 574, 652, 597, 653, 654, 655, 656, 657, 658, 659, 574, 660, 583, 661, 662, 663, 664, 645, 574, 574, 586, 652, 664, 665, 666, 667, 583, 583, 583, 583, 668, 669, 583, 583, 583, 583, 670, 671, 672, 645, 673, 674, 568, 568, 568, 568, 568, 568, 574, 574, 675, 676, 677, 678, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 679, 679, 679, 679, 679, 680, 681, 681, 681, 681, 681, 682, 683, 684, 685, 686, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 687, 688, 689, 690, 691, 691, 691, 691, 692, 693, 694, 694, 694, 694, 694, 694, 694, 695, 696, 697, 366, 366, 368, 106, 368, 368, 368, 368, 368, 368, 368, 368, 698, 698, 698, 698, 699, 700, 701, 702, 703, 704, 529, 705, 106, 106, 106, 106, 106, 106, 106, 106, 706, 706, 706, 707, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 708, 106, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 709, 106, 106, 106, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 721, 721, 721, 721, 721, 721, 721, 721, 722, 723, 724, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 726, 727, 728, 728, 728, 728, 729, 730, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 731, 732, 733, 728, 728, 728, 734, 710, 710, 710, 710, 711, 106, 725, 725, 735, 735, 735, 736, 737, 738, 733, 733, 733, 739, 740, 741, 735, 735, 735, 742, 737, 738, 733, 733, 733, 733, 743, 741, 733, 744, 745, 745, 745, 745, 745, 746, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 733, 733, 733, 747, 748, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 749, 733, 733, 733, 747, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 752, 753, 568, 568, 568, 568, 568, 568, 568, 568, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 754, 753, 753, 753, 753, 753, 753, 755, 755, 756, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 757, 758, 758, 758, 758, 758, 758, 759, 106, 760, 760, 760, 760, 760, 761, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 763, 762, 762, 764, 765, 106, 106, 101, 101, 101, 101, 101, 766, 767, 768, 101, 101, 101, 769, 770, 770, 770, 770, 770, 770, 770, 770, 771, 772, 773, 106, 64, 64, 774, 775, 776, 27, 777, 27, 27, 27, 27, 27, 27, 27, 778, 779, 27, 780, 781, 106, 27, 782, 106, 106, 106, 106, 106, 106, 106, 106, 106, 783, 784, 785, 786, 786, 787, 788, 789, 790, 791, 791, 791, 791, 791, 791, 792, 106, 793, 794, 794, 794, 794, 794, 795, 796, 797, 798, 799, 800, 801, 801, 802, 803, 804, 805, 806, 806, 807, 808, 809, 809, 810, 811, 812, 813, 364, 364, 364, 814, 815, 816, 816, 816, 816, 816, 817, 818, 819, 820, 821, 822, 106, 106, 106, 106, 823, 823, 823, 823, 823, 824, 825, 106, 826, 827, 828, 829, 345, 345, 830, 831, 832, 832, 832, 832, 832, 832, 833, 834, 835, 106, 106, 836, 837, 838, 839, 106, 840, 840, 840, 106, 368, 368, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 837, 837, 837, 837, 841, 842, 843, 844, 845, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 847, 106, 365, 365, 848, 849, 365, 365, 365, 365, 365, 850, 851, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 852, 851, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 852, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 852, 853, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 855, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 857, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 858, 753, 753, 753, 753, 859, 106, 860, 861, 121, 862, 863, 864, 865, 121, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 866, 867, 868, 106, 869, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 870, 106, 106, 128, 128, 128, 128, 128, 128, 128, 128, 871, 128, 128, 128, 128, 128, 128, 106, 106, 106, 106, 106, 128, 872, 873, 873, 874, 875, 501, 106, 876, 877, 878, 879, 880, 881, 882, 883, 884, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 885, 886, 887, 888, 889, 890, 891, 891, 892, 893, 894, 894, 895, 896, 897, 898, 897, 897, 897, 897, 899, 900, 900, 900, 901, 902, 902, 902, 903, 904, 905, 106, 906, 907, 908, 907, 907, 909, 907, 907, 910, 907, 911, 907, 911, 106, 106, 106, 106, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 912, 913, 914, 914, 914, 914, 914, 915, 603, 916, 916, 916, 916, 916, 916, 917, 918, 919, 920, 568, 609, 106, 106, 106, 106, 106, 106, 603, 603, 603, 603, 603, 921, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 922, 922, 922, 923, 924, 924, 924, 924, 924, 924, 925, 106, 106, 106, 106, 106, 926, 926, 926, 927, 928, 106, 929, 929, 930, 931, 106, 106, 106, 106, 106, 106, 932, 932, 932, 933, 934, 934, 934, 934, 935, 934, 936, 106, 106, 106, 106, 106, 937, 937, 937, 937, 937, 938, 938, 938, 938, 938, 939, 939, 939, 939, 939, 939, 940, 940, 940, 941, 942, 943, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 944, 945, 946, 946, 946, 946, 947, 948, 949, 949, 950, 951, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 952, 952, 953, 954, 955, 955, 955, 956, 106, 106, 106, 106, 106, 106, 106, 106, 957, 957, 957, 957, 958, 958, 958, 959, 106, 106, 106, 106, 106, 106, 106, 106, 960, 961, 962, 963, 964, 964, 965, 966, 967, 106, 968, 969, 970, 970, 970, 971, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 972, 972, 972, 972, 972, 972, 973, 974, 975, 975, 976, 977, 978, 978, 979, 980, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 981, 981, 981, 981, 981, 981, 981, 981, 981, 982, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 983, 983, 983, 984, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 985, 986, 986, 986, 986, 986, 986, 987, 988, 989, 990, 991, 992, 993, 106, 106, 994, 995, 995, 995, 995, 995, 996, 997, 998, 106, 999, 999, 999, 1000, 1001, 1002, 1003, 1004, 1004, 1004, 1005, 1006, 1007, 1008, 1009, 106, 106, 106, 106, 106, 106, 106, 1010, 1011, 1011, 1011, 1011, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1018, 1018, 1018, 1018, 1018, 1019, 1020, 106, 1021, 1022, 106, 106, 106, 106, 106, 106, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1024, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1026, 106, 1027, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1029, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 1030, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1032, 106, 1033, 1034, 1034, 1034, 1034, 1035, 106, 1036, 1037, 1038, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1039, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 1040, 106, 603, 603, 603, 603, 1041, 1042, 603, 603, 603, 603, 603, 603, 1043, 1044, 1045, 1046, 1047, 1048, 603, 603, 603, 1049, 603, 603, 603, 603, 603, 1040, 106, 106, 106, 106, 919, 919, 919, 919, 919, 919, 919, 919, 1050, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 610, 106, 914, 914, 1051, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1052, 1052, 1052, 1053, 1054, 1054, 1055, 1052, 1052, 1056, 1057, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1058, 1059, 1060, 1056, 1061, 1062, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1063, 1064, 1065, 1066, 1054, 1054, 1054, 1067, 1068, 1069, 1070, 1054, 1054, 1055, 1052, 1052, 1056, 1054, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1055, 1052, 1052, 1056, 1054, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1055, 1052, 1052, 1056, 1054, 1054, 1054, 1052, 1052, 1052, 1053, 1054, 1054, 1071, 1052, 1052, 1052, 1072, 1054, 1054, 1073, 1074, 1052, 1052, 1075, 1054, 1054, 1076, 1055, 1052, 1052, 1077, 1054, 1054, 1078, 1079, 1052, 1052, 1080, 1054, 1054, 1054, 1081, 1052, 1052, 1052, 1072, 1054, 1054, 1073, 1082, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 128, 128, 128, 1085, 1086, 1087, 1088, 1089, 1090, 1085, 1091, 1085, 1087, 1087, 1092, 128, 1093, 128, 1094, 1095, 1093, 128, 1094, 106, 106, 106, 106, 106, 106, 1096, 106, 568, 568, 568, 568, 568, 609, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 609, 106, 568, 610, 636, 610, 636, 568, 636, 568, 106, 106, 106, 106, 613, 1097, 615, 615, 615, 1098, 615, 615, 615, 615, 615, 615, 615, 1099, 615, 615, 615, 615, 615, 1100, 106, 106, 106, 106, 106, 106, 106, 106, 1101, 603, 603, 603, 1102, 106, 733, 733, 733, 733, 733, 1103, 733, 1104, 1105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 1106, 106, 1107, 568, 568, 568, 568, 568, 568, 568, 568, 1108, 568, 568, 609, 106, 568, 568, 568, 568, 1109, 611, 106, 106, 568, 568, 1106, 106, 568, 568, 568, 568, 568, 568, 568, 610, 1110, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 1111, 568, 568, 568, 568, 568, 568, 568, 1112, 609, 106, 568, 568, 568, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 1113, 568, 568, 568, 568, 568, 568, 568, 568, 1114, 568, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 568, 568, 568, 568, 1112, 106, 106, 106, 106, 106, 106, 106, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 609, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 1115, 753, 753, 753, 753, 753, 751, 751, 751, 751, 751, 751, 754, 753, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 752, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 856, 856, 856, 857, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 1116, 1117, 106, 106, 106, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 106, 106, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 1119]; - private static $index2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 16, 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 21, 22, 8, 8, 23, 8, 24, 22, 25, 26, 27, 28, 16, 29, 30, 18, 31, 32, 33, 33, 25, 34, 22, 22, 25, 33, 27, 35, 36, 36, 36, 22, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 39, 38, 37, 37, 37, 37, 37, 38, 40, 40, 40, 41, 41, 41, 41, 40, 41, 40, 40, 40, 41, 40, 40, 41, 41, 40, 41, 40, 40, 41, 41, 41, 39, 40, 40, 40, 41, 40, 41, 40, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 40, 37, 40, 37, 41, 37, 41, 37, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 38, 40, 37, 40, 38, 40, 37, 41, 37, 41, 40, 37, 41, 37, 41, 37, 41, 38, 40, 38, 40, 37, 40, 37, 41, 37, 40, 40, 38, 40, 37, 40, 37, 41, 37, 41, 38, 40, 37, 41, 37, 41, 37, 37, 41, 37, 41, 37, 41, 41, 41, 37, 37, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 41, 37, 37, 37, 37, 41, 37, 37, 41, 37, 37, 37, 41, 41, 41, 37, 37, 41, 37, 37, 41, 37, 41, 37, 41, 37, 37, 41, 37, 41, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 37, 41, 37, 37, 41, 41, 42, 37, 41, 41, 41, 42, 42, 42, 42, 37, 43, 41, 37, 43, 41, 37, 43, 41, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 41, 37, 41, 41, 37, 43, 41, 37, 41, 37, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 37, 37, 41, 37, 37, 41, 41, 37, 41, 37, 37, 37, 37, 41, 41, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 25, 47, 45, 48, 45, 48, 48, 48, 45, 48, 45, 45, 49, 46, 47, 47, 47, 47, 47, 47, 25, 25, 25, 25, 47, 25, 47, 25, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 50, 50, 45, 47, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53, 53, 53, 52, 54, 53, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 53, 53, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 57, 51, 53, 53, 53, 51, 51, 51, 53, 53, 58, 51, 51, 51, 53, 53, 53, 53, 51, 52, 53, 53, 51, 59, 60, 60, 59, 60, 60, 59, 51, 51, 51, 51, 51, 61, 62, 61, 62, 45, 63, 61, 62, 64, 64, 65, 62, 62, 62, 66, 64, 64, 64, 64, 64, 63, 47, 61, 66, 61, 61, 61, 64, 61, 64, 61, 61, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 67, 67, 67, 67, 67, 67, 67, 61, 61, 62, 62, 62, 62, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 62, 68, 68, 68, 68, 68, 68, 68, 62, 62, 62, 62, 62, 61, 62, 62, 61, 61, 61, 62, 62, 62, 61, 62, 61, 62, 61, 62, 61, 62, 61, 62, 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 62, 62, 62, 62, 61, 62, 71, 61, 62, 61, 61, 62, 62, 61, 61, 61, 72, 73, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 76, 77, 77, 78, 78, 77, 79, 79, 72, 75, 72, 75, 72, 75, 72, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 75, 64, 64, 64, 64, 64, 64, 64, 64, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 64, 64, 81, 82, 82, 82, 82, 82, 82, 64, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 64, 84, 85, 64, 64, 64, 64, 86, 64, 87, 88, 88, 88, 88, 87, 88, 88, 88, 89, 87, 88, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 87, 88, 88, 87, 88, 88, 89, 90, 88, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 108, 106, 88, 87, 106, 99, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 64, 64, 64, 64, 64, 109, 109, 109, 106, 106, 64, 64, 64, 110, 110, 110, 110, 110, 64, 111, 111, 112, 113, 113, 114, 115, 116, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 121, 122, 64, 64, 116, 122, 123, 123, 123, 123, 123, 123, 123, 123, 124, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 125, 126, 127, 128, 129, 130, 131, 132, 78, 78, 133, 134, 118, 118, 118, 118, 118, 134, 118, 118, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 113, 136, 136, 116, 123, 123, 137, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 116, 123, 118, 118, 118, 118, 118, 118, 118, 138, 117, 118, 118, 118, 118, 134, 118, 139, 139, 118, 118, 117, 134, 118, 118, 134, 123, 123, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 123, 123, 123, 141, 141, 123, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 64, 143, 144, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 146, 147, 146, 146, 147, 146, 146, 147, 147, 147, 146, 147, 147, 146, 147, 146, 146, 146, 147, 146, 147, 146, 147, 146, 147, 146, 146, 64, 64, 144, 144, 144, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 64, 64, 64, 64, 64, 64, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 153, 152, 154, 154, 155, 156, 156, 156, 154, 64, 64, 64, 64, 64, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 158, 158, 158, 159, 158, 158, 158, 158, 158, 64, 64, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 64, 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, 162, 64, 64, 163, 64, 123, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 64, 64, 64, 64, 64, 64, 64, 118, 118, 134, 118, 118, 134, 118, 118, 118, 134, 134, 134, 164, 165, 166, 118, 118, 118, 134, 118, 118, 134, 134, 118, 118, 118, 118, 64, 167, 167, 167, 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 167, 168, 170, 169, 168, 168, 168, 167, 167, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 171, 168, 168, 169, 78, 133, 172, 172, 167, 167, 167, 169, 169, 167, 167, 84, 84, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 175, 169, 169, 169, 169, 169, 169, 64, 169, 169, 169, 169, 169, 169, 169, 64, 176, 177, 177, 64, 178, 178, 178, 178, 178, 178, 178, 178, 64, 64, 178, 178, 64, 64, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 64, 178, 178, 178, 178, 178, 178, 178, 64, 178, 64, 64, 64, 178, 178, 178, 178, 64, 64, 179, 178, 177, 177, 177, 176, 176, 176, 176, 64, 64, 177, 177, 64, 64, 177, 177, 180, 178, 64, 64, 64, 64, 64, 64, 64, 64, 177, 64, 64, 64, 64, 178, 178, 64, 178, 178, 178, 176, 176, 64, 64, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 178, 178, 182, 182, 183, 183, 183, 183, 183, 183, 184, 182, 64, 64, 64, 64, 64, 185, 185, 186, 64, 187, 187, 187, 187, 187, 187, 64, 64, 64, 64, 187, 187, 64, 64, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 64, 187, 187, 187, 187, 187, 187, 187, 64, 187, 187, 64, 187, 187, 64, 187, 187, 64, 64, 188, 64, 186, 186, 186, 185, 185, 64, 64, 64, 64, 185, 185, 64, 64, 185, 185, 189, 64, 64, 64, 185, 64, 64, 64, 64, 64, 64, 64, 187, 187, 187, 187, 64, 187, 64, 64, 64, 64, 64, 64, 64, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 187, 187, 187, 185, 64, 64, 64, 191, 191, 192, 64, 193, 193, 193, 193, 193, 193, 193, 193, 193, 64, 193, 193, 193, 64, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 64, 193, 193, 193, 193, 193, 193, 193, 64, 193, 193, 64, 193, 193, 193, 193, 193, 64, 64, 194, 193, 192, 192, 192, 191, 191, 191, 191, 191, 64, 191, 191, 192, 64, 192, 192, 195, 64, 64, 193, 64, 64, 64, 64, 64, 64, 64, 193, 193, 191, 191, 64, 64, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 198, 64, 64, 64, 64, 64, 64, 64, 199, 200, 200, 64, 201, 201, 201, 201, 201, 201, 201, 201, 64, 64, 201, 201, 64, 64, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 64, 201, 201, 201, 201, 201, 201, 201, 64, 201, 201, 64, 201, 201, 201, 201, 201, 64, 64, 202, 201, 200, 199, 200, 199, 199, 199, 199, 64, 64, 200, 200, 64, 64, 200, 200, 203, 64, 64, 64, 64, 64, 64, 64, 64, 199, 200, 64, 64, 64, 64, 201, 201, 64, 201, 201, 201, 199, 199, 64, 64, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, 201, 206, 206, 206, 206, 206, 206, 64, 64, 207, 208, 64, 208, 208, 208, 208, 208, 208, 64, 64, 64, 208, 208, 208, 64, 208, 208, 208, 208, 64, 64, 64, 208, 208, 64, 208, 64, 208, 208, 64, 64, 64, 208, 208, 64, 64, 64, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 64, 64, 64, 64, 209, 209, 207, 209, 209, 64, 64, 64, 209, 209, 209, 64, 209, 209, 209, 210, 64, 64, 208, 64, 64, 64, 64, 64, 64, 209, 64, 64, 64, 64, 64, 64, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 213, 213, 213, 213, 213, 213, 214, 213, 64, 64, 64, 64, 64, 64, 215, 215, 215, 64, 216, 216, 216, 216, 216, 216, 216, 216, 64, 216, 216, 216, 64, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 64, 216, 216, 216, 216, 216, 64, 64, 64, 216, 217, 217, 217, 215, 215, 215, 215, 64, 217, 217, 217, 64, 217, 217, 217, 218, 64, 64, 64, 64, 64, 64, 64, 219, 220, 64, 216, 216, 64, 64, 64, 64, 64, 64, 216, 216, 217, 217, 64, 64, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, 223, 64, 64, 224, 224, 64, 225, 225, 225, 225, 225, 225, 225, 225, 64, 225, 225, 225, 64, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 64, 225, 225, 225, 225, 225, 64, 64, 226, 225, 224, 227, 224, 224, 224, 224, 224, 64, 227, 224, 224, 64, 224, 224, 228, 229, 64, 64, 64, 64, 64, 64, 64, 224, 224, 64, 64, 64, 64, 64, 64, 64, 225, 64, 225, 225, 228, 228, 64, 64, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 64, 225, 225, 64, 64, 64, 64, 64, 64, 64, 231, 231, 64, 232, 232, 232, 232, 232, 232, 232, 232, 64, 232, 232, 232, 64, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 64, 64, 232, 231, 231, 231, 233, 233, 233, 233, 64, 231, 231, 231, 64, 231, 231, 231, 234, 232, 64, 64, 64, 64, 64, 64, 64, 64, 231, 232, 232, 233, 233, 64, 64, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 236, 236, 236, 236, 236, 236, 64, 64, 64, 237, 232, 232, 232, 232, 232, 232, 64, 64, 238, 238, 64, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 64, 64, 64, 239, 239, 239, 239, 239, 239, 239, 239, 64, 239, 239, 239, 239, 239, 239, 239, 239, 239, 64, 239, 64, 64, 64, 64, 240, 64, 64, 64, 64, 238, 238, 238, 241, 241, 241, 64, 241, 64, 238, 238, 238, 238, 238, 238, 238, 238, 64, 64, 238, 238, 242, 64, 64, 64, 64, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, 243, 243, 244, 244, 244, 244, 245, 245, 246, 64, 64, 64, 64, 247, 243, 243, 243, 243, 243, 243, 248, 244, 249, 249, 249, 249, 244, 244, 244, 250, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 64, 64, 64, 64, 64, 252, 252, 64, 252, 64, 64, 252, 252, 64, 252, 64, 64, 252, 64, 64, 64, 64, 64, 64, 252, 252, 252, 252, 64, 252, 252, 252, 252, 252, 252, 252, 64, 252, 252, 252, 64, 252, 64, 252, 64, 64, 252, 252, 64, 252, 252, 252, 252, 253, 252, 252, 253, 253, 253, 253, 254, 254, 64, 253, 253, 252, 64, 64, 252, 252, 252, 252, 252, 64, 255, 64, 256, 256, 256, 256, 253, 253, 64, 64, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 64, 64, 252, 252, 252, 252, 258, 259, 259, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 259, 260, 259, 259, 259, 261, 261, 259, 259, 259, 259, 259, 259, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 259, 261, 259, 261, 259, 264, 265, 266, 265, 266, 267, 267, 258, 258, 258, 258, 258, 258, 258, 258, 64, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 64, 64, 64, 64, 268, 269, 270, 271, 270, 270, 270, 270, 270, 269, 269, 269, 269, 270, 267, 269, 270, 272, 272, 273, 260, 272, 272, 258, 258, 258, 258, 258, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 64, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 64, 259, 259, 259, 259, 259, 259, 259, 259, 261, 259, 259, 259, 259, 259, 259, 64, 259, 259, 260, 260, 260, 260, 260, 274, 274, 274, 274, 260, 260, 64, 64, 64, 64, 64, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 277, 277, 277, 277, 276, 277, 277, 277, 277, 277, 278, 276, 279, 279, 276, 276, 277, 277, 275, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 281, 281, 281, 281, 281, 281, 275, 275, 275, 275, 275, 275, 276, 276, 277, 277, 275, 275, 275, 275, 277, 277, 277, 275, 276, 276, 276, 275, 275, 276, 276, 276, 276, 276, 276, 276, 275, 275, 275, 277, 277, 277, 277, 275, 275, 275, 275, 275, 277, 276, 276, 277, 277, 276, 276, 276, 276, 276, 276, 282, 275, 276, 280, 280, 276, 276, 276, 277, 283, 283, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 64, 284, 64, 64, 64, 64, 64, 284, 64, 64, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 84, 286, 285, 285, 285, 287, 287, 287, 287, 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, 289, 289, 289, 64, 289, 289, 289, 289, 64, 64, 289, 289, 289, 289, 289, 289, 289, 64, 289, 289, 289, 64, 64, 290, 290, 290, 291, 291, 291, 291, 291, 291, 291, 291, 291, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 64, 64, 64, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 64, 64, 64, 64, 64, 64, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 64, 64, 64, 295, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 297, 297, 296, 298, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 301, 64, 64, 64, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 84, 84, 84, 303, 303, 303, 64, 64, 64, 64, 64, 64, 64, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 64, 304, 304, 304, 304, 305, 305, 306, 64, 64, 64, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 309, 84, 84, 64, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 311, 311, 64, 64, 64, 64, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 64, 312, 312, 312, 64, 313, 313, 64, 64, 64, 64, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 315, 315, 315, 315, 315, 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, 315, 316, 316, 315, 315, 315, 315, 315, 315, 315, 315, 315, 317, 315, 318, 318, 318, 319, 318, 318, 318, 320, 314, 321, 64, 64, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 64, 64, 64, 64, 64, 64, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 64, 64, 64, 64, 64, 64, 324, 324, 66, 66, 324, 66, 325, 324, 324, 324, 324, 326, 326, 326, 327, 64, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 64, 64, 64, 64, 64, 64, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 330, 329, 329, 329, 329, 329, 331, 329, 64, 64, 64, 64, 64, 296, 296, 296, 296, 296, 296, 64, 64, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 64, 64, 64, 333, 333, 333, 334, 334, 334, 334, 333, 333, 334, 334, 334, 64, 64, 64, 64, 334, 334, 333, 334, 334, 334, 334, 334, 334, 335, 336, 337, 64, 64, 64, 64, 338, 64, 64, 64, 339, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 64, 64, 341, 341, 341, 341, 341, 64, 64, 64, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 64, 64, 64, 64, 343, 343, 343, 343, 343, 343, 343, 343, 343, 342, 342, 342, 342, 342, 342, 342, 343, 343, 64, 64, 64, 64, 64, 64, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 64, 64, 64, 346, 346, 347, 347, 347, 347, 347, 347, 347, 347, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 349, 350, 351, 351, 351, 64, 64, 352, 352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 354, 355, 354, 355, 355, 355, 355, 355, 355, 355, 64, 356, 354, 355, 354, 354, 355, 355, 355, 355, 355, 355, 355, 355, 354, 354, 354, 354, 354, 354, 355, 355, 357, 357, 357, 357, 357, 357, 357, 357, 64, 64, 358, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 64, 64, 64, 64, 64, 64, 360, 360, 360, 360, 360, 360, 360, 361, 360, 360, 360, 360, 360, 360, 64, 64, 362, 362, 362, 362, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 363, 362, 362, 362, 362, 362, 363, 362, 363, 363, 363, 363, 363, 362, 363, 366, 364, 364, 364, 364, 364, 364, 364, 64, 64, 64, 64, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 371, 370, 370, 370, 370, 370, 370, 370, 369, 369, 369, 369, 369, 369, 369, 369, 369, 64, 64, 64, 372, 372, 373, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 373, 372, 372, 372, 372, 373, 373, 372, 372, 375, 376, 373, 373, 374, 374, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 374, 374, 374, 374, 374, 374, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 379, 380, 381, 381, 380, 380, 380, 381, 380, 381, 381, 381, 382, 382, 64, 64, 64, 64, 64, 64, 64, 64, 383, 383, 383, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 385, 385, 385, 385, 385, 385, 385, 386, 386, 386, 386, 386, 386, 386, 386, 385, 385, 386, 387, 64, 64, 64, 388, 388, 388, 388, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 64, 64, 64, 384, 384, 384, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 392, 392, 392, 392, 392, 392, 393, 393, 394, 394, 394, 394, 394, 394, 394, 394, 78, 78, 78, 84, 395, 133, 133, 133, 133, 133, 78, 78, 133, 133, 133, 133, 78, 396, 395, 395, 395, 395, 395, 395, 395, 397, 397, 397, 397, 133, 397, 397, 397, 397, 396, 396, 78, 397, 397, 64, 41, 41, 41, 41, 41, 41, 62, 62, 62, 62, 62, 75, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 44, 44, 44, 44, 65, 65, 65, 65, 65, 41, 41, 41, 41, 41, 398, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 78, 78, 133, 78, 78, 78, 78, 78, 78, 78, 133, 78, 78, 399, 400, 133, 401, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 64, 64, 64, 64, 64, 402, 133, 78, 133, 37, 41, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 62, 62, 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 64, 64, 61, 61, 61, 61, 61, 61, 64, 64, 64, 61, 64, 61, 64, 61, 64, 61, 403, 403, 403, 403, 403, 403, 403, 403, 62, 62, 62, 62, 62, 64, 62, 62, 61, 61, 61, 61, 403, 63, 62, 63, 63, 63, 62, 62, 62, 64, 62, 62, 61, 61, 61, 61, 403, 63, 63, 63, 62, 62, 62, 62, 64, 64, 62, 62, 61, 61, 61, 61, 64, 63, 63, 63, 61, 61, 61, 61, 61, 63, 63, 63, 64, 64, 62, 62, 62, 64, 62, 62, 61, 61, 61, 61, 403, 63, 63, 64, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 405, 406, 406, 407, 408, 409, 410, 410, 409, 409, 409, 22, 66, 411, 412, 413, 414, 411, 412, 413, 414, 22, 22, 22, 66, 22, 22, 22, 22, 415, 416, 417, 418, 419, 420, 421, 21, 422, 423, 422, 422, 423, 22, 66, 66, 66, 28, 35, 22, 66, 66, 22, 424, 424, 66, 66, 66, 425, 426, 427, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 428, 66, 424, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 404, 405, 405, 405, 405, 405, 64, 64, 64, 64, 64, 405, 405, 405, 405, 405, 405, 429, 44, 64, 64, 33, 429, 429, 429, 429, 429, 430, 430, 428, 426, 427, 431, 429, 33, 33, 33, 33, 429, 429, 429, 429, 429, 430, 430, 428, 426, 427, 64, 44, 44, 44, 44, 44, 64, 64, 64, 247, 247, 247, 247, 247, 247, 247, 247, 247, 432, 247, 247, 23, 247, 247, 247, 247, 247, 247, 64, 64, 64, 64, 64, 78, 78, 395, 395, 78, 78, 78, 78, 395, 395, 395, 78, 78, 433, 433, 433, 433, 78, 433, 433, 433, 395, 395, 78, 133, 78, 395, 395, 133, 133, 133, 133, 78, 64, 64, 64, 64, 64, 64, 64, 26, 26, 434, 30, 26, 30, 26, 434, 26, 30, 34, 434, 434, 434, 34, 34, 434, 434, 434, 435, 26, 434, 30, 26, 428, 434, 434, 434, 434, 434, 26, 26, 26, 30, 30, 26, 434, 26, 67, 26, 434, 26, 37, 38, 434, 434, 436, 34, 434, 434, 37, 434, 34, 397, 397, 397, 397, 34, 26, 26, 34, 34, 434, 434, 437, 428, 428, 428, 428, 434, 34, 34, 34, 34, 26, 428, 26, 26, 41, 274, 438, 438, 438, 36, 36, 438, 438, 438, 438, 438, 438, 36, 36, 36, 36, 438, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 440, 440, 440, 440, 439, 439, 440, 440, 440, 440, 440, 440, 440, 440, 440, 37, 41, 440, 440, 440, 440, 36, 64, 64, 64, 64, 64, 64, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 428, 428, 26, 26, 26, 26, 428, 26, 26, 428, 26, 26, 428, 26, 26, 26, 26, 26, 26, 26, 428, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 428, 428, 26, 26, 39, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 39, 437, 441, 441, 437, 428, 428, 39, 441, 437, 437, 441, 437, 437, 428, 39, 428, 441, 430, 442, 428, 441, 437, 428, 428, 428, 441, 437, 437, 441, 39, 441, 441, 437, 437, 39, 437, 39, 437, 39, 39, 39, 39, 441, 441, 437, 441, 437, 437, 437, 437, 437, 39, 39, 39, 39, 428, 437, 428, 437, 441, 441, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 441, 437, 437, 437, 441, 428, 428, 428, 428, 428, 441, 437, 437, 437, 428, 428, 428, 428, 428, 428, 428, 428, 428, 437, 441, 39, 437, 428, 441, 441, 441, 441, 437, 437, 441, 441, 428, 428, 441, 441, 437, 437, 441, 441, 437, 437, 441, 441, 437, 437, 437, 437, 437, 428, 428, 437, 437, 437, 437, 428, 428, 39, 428, 428, 437, 39, 428, 428, 428, 428, 428, 428, 428, 428, 437, 437, 428, 39, 437, 437, 437, 428, 428, 428, 428, 428, 437, 441, 428, 437, 437, 437, 437, 437, 428, 428, 437, 437, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 428, 428, 437, 437, 437, 437, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 437, 437, 26, 26, 26, 26, 26, 26, 26, 443, 444, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 26, 428, 26, 26, 26, 26, 26, 26, 26, 26, 274, 26, 26, 26, 26, 26, 428, 428, 428, 428, 428, 428, 428, 428, 428, 26, 26, 26, 26, 428, 428, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 64, 64, 64, 64, 64, 36, 36, 36, 36, 36, 36, 36, 36, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 438, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 30, 30, 26, 30, 30, 30, 30, 30, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 30, 26, 30, 26, 30, 26, 30, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, 26, 30, 30, 30, 30, 26, 30, 30, 26, 39, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 274, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 30, 30, 26, 30, 26, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 36, 36, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 26, 26, 26, 26, 437, 428, 428, 437, 437, 426, 427, 428, 437, 437, 428, 437, 437, 437, 428, 428, 428, 428, 428, 437, 437, 437, 437, 428, 428, 428, 428, 428, 437, 437, 437, 428, 428, 428, 437, 437, 437, 437, 9, 10, 9, 10, 9, 10, 9, 10, 426, 427, 446, 446, 446, 446, 446, 446, 446, 446, 428, 428, 428, 426, 427, 9, 10, 426, 427, 426, 427, 426, 427, 426, 427, 426, 427, 428, 428, 437, 437, 437, 437, 437, 437, 428, 428, 428, 428, 428, 428, 428, 428, 437, 428, 428, 428, 428, 437, 437, 437, 437, 437, 428, 437, 437, 428, 428, 426, 427, 426, 427, 437, 428, 428, 428, 428, 437, 428, 437, 437, 437, 428, 428, 437, 437, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 428, 428, 426, 427, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 428, 437, 437, 437, 437, 428, 428, 437, 428, 437, 428, 428, 437, 428, 437, 437, 437, 437, 428, 428, 428, 428, 428, 437, 437, 428, 428, 428, 428, 437, 437, 437, 437, 428, 437, 437, 428, 428, 437, 437, 428, 428, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 428, 428, 437, 437, 437, 437, 437, 437, 437, 437, 428, 437, 437, 437, 437, 437, 437, 437, 437, 428, 428, 428, 428, 428, 437, 428, 437, 428, 428, 428, 437, 437, 437, 437, 437, 428, 428, 428, 428, 437, 428, 428, 428, 437, 437, 437, 437, 437, 428, 437, 428, 428, 428, 428, 428, 428, 428, 26, 26, 428, 428, 428, 428, 428, 428, 64, 64, 64, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30, 64, 64, 64, 64, 64, 64, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 64, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 64, 37, 41, 37, 37, 37, 41, 41, 37, 41, 37, 41, 37, 41, 37, 37, 37, 37, 41, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 44, 44, 37, 37, 69, 70, 69, 70, 70, 449, 449, 449, 449, 449, 449, 69, 70, 69, 70, 450, 450, 450, 69, 70, 64, 64, 64, 64, 64, 451, 451, 451, 451, 452, 451, 451, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 64, 453, 64, 64, 64, 64, 64, 453, 64, 64, 454, 454, 454, 454, 454, 454, 454, 454, 64, 64, 64, 64, 64, 64, 64, 455, 456, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 457, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 28, 35, 28, 35, 66, 66, 66, 28, 35, 66, 28, 35, 66, 66, 66, 66, 66, 66, 66, 66, 66, 410, 66, 66, 410, 66, 28, 35, 66, 66, 28, 35, 426, 427, 426, 427, 426, 427, 426, 427, 66, 66, 66, 66, 66, 45, 66, 66, 410, 410, 64, 64, 64, 64, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 64, 458, 458, 458, 458, 458, 458, 458, 458, 458, 64, 64, 64, 64, 458, 458, 458, 458, 458, 458, 64, 64, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 64, 64, 64, 64, 460, 461, 461, 461, 459, 462, 463, 464, 443, 444, 443, 444, 443, 444, 443, 444, 443, 444, 459, 459, 443, 444, 443, 444, 443, 444, 443, 444, 465, 466, 467, 467, 459, 464, 464, 464, 464, 464, 464, 464, 464, 464, 468, 469, 470, 471, 472, 472, 465, 473, 473, 473, 473, 473, 459, 459, 464, 464, 464, 462, 463, 461, 459, 26, 64, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 64, 64, 475, 475, 476, 476, 477, 477, 474, 465, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 461, 473, 479, 479, 478, 64, 64, 64, 64, 64, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 64, 64, 64, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 64, 481, 481, 482, 482, 482, 482, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 480, 480, 480, 64, 64, 64, 64, 64, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 484, 484, 64, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 481, 481, 481, 481, 481, 481, 485, 485, 485, 485, 485, 485, 485, 485, 459, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 483, 483, 483, 483, 484, 484, 484, 481, 481, 486, 486, 486, 486, 486, 486, 486, 481, 481, 481, 481, 459, 459, 459, 459, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 64, 481, 481, 481, 481, 481, 481, 481, 459, 459, 459, 459, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 459, 459, 488, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 488, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 489, 489, 489, 489, 488, 490, 490, 490, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 492, 491, 491, 491, 491, 491, 491, 491, 64, 64, 64, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 64, 494, 494, 494, 494, 494, 494, 494, 494, 495, 495, 495, 495, 495, 495, 496, 496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 499, 499, 499, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 497, 497, 64, 64, 64, 64, 72, 75, 72, 75, 72, 75, 501, 77, 79, 79, 79, 502, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 502, 503, 64, 64, 64, 64, 64, 64, 64, 77, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 506, 506, 507, 507, 507, 507, 507, 507, 47, 47, 47, 47, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 37, 41, 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 41, 44, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 37, 41, 37, 37, 41, 45, 508, 508, 37, 41, 37, 41, 64, 37, 41, 37, 41, 64, 64, 64, 64, 37, 41, 37, 64, 64, 64, 64, 64, 44, 44, 41, 42, 42, 42, 42, 42, 509, 509, 510, 509, 509, 509, 511, 509, 509, 509, 509, 510, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 512, 512, 510, 510, 512, 513, 513, 513, 513, 64, 64, 64, 64, 514, 514, 514, 514, 514, 514, 274, 274, 247, 436, 64, 64, 64, 64, 64, 64, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 516, 516, 516, 516, 517, 517, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 519, 64, 64, 64, 64, 64, 64, 64, 64, 64, 520, 520, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 64, 64, 64, 64, 64, 64, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 169, 169, 169, 169, 169, 169, 174, 174, 174, 169, 64, 64, 64, 64, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 524, 524, 524, 524, 524, 525, 525, 525, 526, 526, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 529, 530, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 531, 287, 287, 287, 287, 287, 64, 64, 64, 532, 532, 532, 533, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 533, 533, 532, 532, 532, 532, 533, 533, 532, 533, 533, 533, 536, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 64, 538, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 64, 64, 64, 64, 537, 537, 540, 540, 540, 540, 540, 540, 540, 540, 540, 541, 541, 541, 541, 541, 541, 542, 542, 541, 541, 542, 542, 541, 541, 64, 540, 540, 540, 541, 540, 540, 540, 540, 540, 540, 540, 540, 541, 542, 64, 64, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 64, 64, 544, 544, 544, 544, 545, 275, 275, 275, 275, 275, 275, 283, 283, 283, 275, 276, 64, 64, 64, 64, 546, 546, 546, 546, 546, 546, 546, 546, 547, 546, 547, 547, 548, 546, 546, 547, 547, 546, 546, 546, 546, 546, 547, 547, 546, 547, 546, 64, 64, 64, 64, 64, 64, 64, 64, 546, 546, 549, 550, 550, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 552, 553, 553, 552, 552, 554, 554, 551, 555, 555, 552, 556, 64, 64, 289, 289, 289, 289, 289, 289, 64, 551, 551, 551, 552, 552, 553, 552, 552, 553, 552, 552, 554, 552, 556, 64, 64, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 64, 64, 64, 64, 64, 64, 287, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 287, 64, 64, 64, 64, 288, 288, 288, 288, 288, 288, 288, 64, 64, 64, 64, 288, 288, 288, 288, 288, 288, 288, 288, 288, 64, 64, 64, 64, 559, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 559, 560, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 560, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 490, 490, 488, 488, 490, 490, 490, 490, 490, 490, 41, 41, 41, 41, 41, 41, 41, 64, 64, 64, 64, 83, 83, 83, 83, 83, 64, 64, 64, 64, 64, 109, 562, 109, 109, 563, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 64, 109, 109, 109, 109, 109, 64, 109, 64, 109, 109, 64, 109, 109, 64, 109, 109, 123, 123, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 64, 64, 64, 64, 64, 64, 64, 64, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 413, 565, 64, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 114, 26, 64, 64, 58, 58, 58, 58, 58, 58, 58, 58, 461, 461, 461, 461, 461, 461, 461, 466, 467, 461, 64, 64, 64, 64, 64, 64, 461, 465, 465, 566, 566, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 466, 467, 461, 461, 466, 467, 461, 461, 461, 461, 566, 566, 566, 567, 461, 567, 64, 461, 567, 461, 461, 465, 443, 444, 443, 444, 443, 444, 568, 461, 461, 569, 570, 571, 571, 572, 64, 461, 573, 568, 461, 64, 64, 64, 64, 123, 123, 123, 123, 123, 64, 123, 123, 123, 123, 123, 123, 123, 64, 64, 405, 64, 574, 574, 575, 576, 575, 574, 574, 577, 578, 574, 579, 580, 581, 580, 580, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 580, 574, 583, 584, 583, 574, 574, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 577, 574, 578, 586, 587, 586, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 577, 584, 578, 584, 577, 578, 589, 590, 591, 589, 589, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 64, 64, 64, 594, 594, 594, 594, 594, 594, 64, 64, 594, 594, 594, 64, 64, 64, 576, 576, 584, 586, 595, 576, 576, 64, 596, 597, 597, 597, 597, 596, 596, 64, 64, 598, 598, 598, 26, 30, 64, 64, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 64, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 64, 599, 599, 599, 64, 599, 599, 64, 599, 599, 599, 599, 599, 599, 599, 64, 64, 599, 599, 599, 64, 64, 64, 64, 64, 84, 66, 84, 64, 64, 64, 64, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 64, 64, 64, 274, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 601, 601, 601, 601, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 601, 64, 64, 64, 64, 64, 274, 274, 274, 274, 274, 133, 64, 64, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 64, 64, 64, 604, 604, 604, 604, 604, 604, 604, 604, 604, 64, 64, 64, 64, 64, 64, 64, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 64, 606, 606, 606, 606, 64, 64, 64, 64, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, 607, 607, 607, 607, 607, 607, 607, 607, 608, 64, 64, 64, 64, 64, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 64, 610, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 64, 64, 64, 64, 612, 613, 613, 613, 613, 613, 64, 64, 614, 614, 614, 614, 614, 614, 614, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 616, 616, 616, 616, 616, 616, 616, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 64, 64, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 64, 64, 64, 64, 64, 64, 619, 619, 619, 619, 619, 619, 64, 64, 619, 64, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 64, 619, 619, 64, 64, 64, 619, 64, 64, 619, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 64, 621, 622, 622, 622, 622, 622, 622, 622, 622, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 624, 624, 624, 624, 624, 624, 64, 64, 64, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 64, 64, 64, 64, 64, 627, 628, 628, 628, 628, 628, 628, 628, 628, 629, 629, 629, 629, 629, 629, 629, 629, 64, 64, 64, 64, 64, 64, 629, 629, 630, 631, 631, 631, 64, 631, 631, 64, 64, 64, 64, 64, 631, 632, 631, 633, 630, 630, 630, 630, 64, 630, 630, 630, 64, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 64, 64, 64, 64, 633, 634, 632, 64, 64, 64, 64, 635, 636, 636, 636, 636, 636, 636, 636, 636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 64, 64, 64, 64, 64, 64, 64, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 639, 639, 640, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 64, 64, 64, 642, 642, 642, 642, 642, 642, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 64, 64, 644, 644, 644, 644, 644, 644, 644, 644, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 64, 64, 64, 64, 64, 646, 646, 646, 646, 646, 646, 646, 646, 647, 647, 647, 647, 647, 647, 647, 647, 647, 64, 64, 64, 64, 64, 64, 64, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 64, 649, 650, 649, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 652, 653, 653, 653, 653, 653, 653, 653, 64, 64, 64, 64, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 656, 656, 657, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 657, 657, 657, 656, 656, 656, 656, 657, 657, 659, 660, 661, 661, 662, 661, 661, 661, 661, 64, 64, 64, 64, 64, 64, 663, 663, 663, 663, 663, 663, 663, 663, 663, 64, 64, 64, 64, 64, 64, 64, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 64, 64, 64, 64, 64, 64, 665, 665, 665, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 667, 667, 667, 667, 667, 668, 667, 667, 667, 667, 667, 667, 669, 669, 64, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 671, 671, 671, 671, 64, 64, 64, 64, 672, 672, 673, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 673, 673, 673, 672, 672, 672, 672, 672, 672, 672, 672, 672, 673, 675, 674, 674, 674, 674, 676, 676, 676, 676, 64, 64, 64, 64, 64, 64, 64, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 64, 64, 64, 64, 64, 64, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 679, 680, 679, 680, 680, 679, 679, 679, 679, 679, 679, 681, 682, 683, 683, 683, 683, 683, 683, 683, 683, 683, 683, 64, 64, 64, 64, 64, 64, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 64, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 64, 64, 64, 64, 64, 686, 686, 686, 686, 64, 64, 64, 64, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 64, 504, 64, 64, 64, 64, 64, 64, 64, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 64, 64, 64, 688, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, 64, 64, 64, 64, 64, 64, 64, 64, 690, 690, 690, 690, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, 478, 474, 64, 64, 64, 64, 64, 64, 274, 274, 274, 274, 274, 274, 64, 64, 274, 274, 274, 274, 274, 274, 274, 64, 64, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 692, 692, 395, 395, 395, 274, 274, 274, 693, 692, 692, 692, 692, 692, 405, 405, 405, 405, 405, 405, 405, 405, 133, 133, 133, 133, 133, 133, 133, 133, 274, 274, 78, 78, 78, 78, 78, 133, 133, 274, 274, 274, 274, 274, 274, 78, 78, 78, 78, 274, 274, 602, 602, 694, 694, 694, 602, 64, 64, 514, 514, 64, 64, 64, 64, 64, 64, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34, 34, 434, 64, 434, 434, 64, 64, 434, 64, 64, 434, 434, 64, 64, 434, 434, 434, 434, 64, 434, 434, 34, 34, 64, 34, 64, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34, 34, 34, 434, 434, 64, 434, 434, 434, 434, 64, 64, 434, 434, 434, 434, 434, 434, 434, 434, 64, 434, 434, 434, 434, 434, 434, 434, 64, 34, 34, 434, 434, 64, 434, 434, 434, 434, 64, 434, 434, 434, 434, 434, 64, 434, 64, 64, 64, 434, 434, 434, 434, 434, 434, 434, 64, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 64, 434, 695, 34, 34, 34, 34, 34, 34, 34, 34, 34, 437, 34, 34, 34, 34, 34, 34, 434, 434, 434, 434, 434, 434, 434, 434, 434, 695, 34, 34, 34, 34, 34, 34, 34, 34, 34, 437, 34, 34, 434, 434, 434, 434, 434, 695, 34, 34, 34, 34, 34, 34, 34, 34, 34, 437, 34, 34, 34, 34, 34, 34, 434, 434, 434, 434, 434, 434, 434, 434, 434, 695, 34, 437, 34, 34, 34, 34, 34, 34, 34, 34, 434, 34, 64, 64, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 123, 123, 123, 123, 64, 123, 123, 123, 64, 123, 123, 64, 123, 64, 64, 123, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 64, 123, 123, 123, 123, 64, 123, 64, 123, 64, 64, 64, 64, 64, 64, 123, 64, 64, 64, 64, 123, 64, 123, 64, 123, 64, 123, 123, 123, 64, 123, 64, 123, 64, 123, 64, 123, 64, 123, 123, 123, 123, 64, 123, 64, 123, 123, 64, 123, 123, 123, 123, 123, 123, 123, 123, 123, 64, 64, 64, 64, 64, 123, 123, 123, 64, 123, 123, 123, 111, 111, 64, 64, 64, 64, 64, 64, 33, 33, 33, 64, 64, 64, 64, 64, 445, 445, 445, 445, 445, 445, 274, 64, 445, 445, 26, 26, 64, 64, 64, 64, 445, 445, 445, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 274, 274, 697, 481, 481, 64, 64, 64, 64, 64, 481, 481, 481, 64, 64, 64, 64, 64, 481, 64, 64, 64, 64, 64, 64, 64, 481, 481, 64, 64, 64, 64, 64, 64, 26, 64, 64, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 64, 64, 64, 26, 26, 26, 26, 26, 64, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 26, 64, 64, 64, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 26, 26, 26, 489, 489, 489, 489, 489, 489, 488, 490, 490, 490, 490, 490, 490, 490, 64, 64, 64, 405, 64, 64, 64, 64, 64, 64, 405, 405, 405, 405, 405, 405, 405, 405, 561, 561, 561, 561, 561, 560, 64, 64]; -} diff --git a/dependencies/mpdf/mpdf/src/Utils/Arrays.php b/dependencies/mpdf/mpdf/src/Utils/Arrays.php deleted file mode 100644 index 2ca6c55..0000000 --- a/dependencies/mpdf/mpdf/src/Utils/Arrays.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Utils; - -class Arrays -{ - public static function get($array, $key, $default = null) - { - if (\is_array($array) && \array_key_exists($key, $array)) { - return $array[$key]; - } - if (\func_num_args() < 3) { - throw new \InvalidArgumentException(\sprintf('Array does not contain key "%s"', $key)); - } - return $default; - } - /** - * Returns an array of all k-combinations from an input array of n elements, where k equals 1..n. - * Elements will be sorted and unique in every combination. - * - * Example: array[one, two] will give: - * [ - * [one], - * [two], - * [one, two] - * ] - * @param array $array - * @return array - */ - public static function allUniqueSortedCombinations($array) - { - $input = \array_unique($array); - if (\count($input) <= 1) { - return [$input]; - } - \sort($input); - $combinations = []; - foreach ($input as $value) { - $combinations[] = [$value]; - } - $n = \count($input); - for ($k = 2; $k <= $n; $k++) { - $combinations = \array_merge($combinations, self::combinations($input, $k)); - } - return $combinations; - } - /** - * Returns an array of unique k-combinations from an input array. - * - * Example: array=[one, two, three] and k=2 will give: - * [ - * [one, two], - * [one, three] - * ] - * @param array $array - * @param int $k - * @return array - */ - public static function combinations($array, $k) - { - $n = \count($array); - $combinations = []; - $indexes = \range(0, $k - 1); - $maxIndexes = \range($n - $k, $n - 1); - do { - $combination = []; - foreach ($indexes as $index) { - $combination[] = $array[$index]; - } - $combinations[] = $combination; - $anotherCombination = \false; - $resetFromIndex = -1; - for ($i = $k - 1; $i >= 0; $i--) { - if ($indexes[$i] < $maxIndexes[$i]) { - $indexes[$i]++; - $anotherCombination = \true; - break; - } - $resetFromIndex = $i; - } - if ($resetFromIndex > 0) { - for ($i = $resetFromIndex; $i < $k; $i++) { - $indexes[$i] = $indexes[$i - 1] + 1; - } - } - } while ($anotherCombination); - return $combinations; - } -} diff --git a/dependencies/mpdf/mpdf/src/Utils/NumericString.php b/dependencies/mpdf/mpdf/src/Utils/NumericString.php deleted file mode 100644 index c008900..0000000 --- a/dependencies/mpdf/mpdf/src/Utils/NumericString.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Utils; - -class NumericString -{ - public static function containsPercentChar($string) - { - return \strstr($string, '%'); - } - public static function removePercentChar($string) - { - return \str_replace('%', '', $string); - } -} diff --git a/dependencies/mpdf/mpdf/src/Utils/PdfDate.php b/dependencies/mpdf/mpdf/src/Utils/PdfDate.php deleted file mode 100644 index a8d2a4c..0000000 --- a/dependencies/mpdf/mpdf/src/Utils/PdfDate.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Utils; - -class PdfDate -{ - /** - * PDF documents use the internal date format: (D:YYYYMMDDHHmmSSOHH'mm'). The date format has these parts: - * - * YYYY The full four-digit year. (For example, 2004) - * MM The month from 01 to 12. - * DD The day from 01 to 31. - * HH The hour from 00 to 23. - * mm The minute from 00 to 59. - * SS The seconds from 00 to 59. - * O The relationship of local time to Universal Time (UT), as denoted by one of the characters +, -, or Z. - * HH The absolute value of the offset from UT in hours specified as 00 to 23. - * mm The absolute value of the offset from UT in minutes specified as 00 to 59. - * - * @return string - */ - public static function format($date) - { - $z = \date('O'); - // +0200 - $offset = \substr($z, 0, 3) . "'" . \substr($z, 3, 2) . "'"; - // +02'00' - return \date('YmdHis', $date) . $offset; - } -} diff --git a/dependencies/mpdf/mpdf/src/Utils/UtfString.php b/dependencies/mpdf/mpdf/src/Utils/UtfString.php deleted file mode 100644 index d023f99..0000000 --- a/dependencies/mpdf/mpdf/src/Utils/UtfString.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Utils; - -class UtfString -{ - /** - * Converts all the &#nnn; and &#xhhh; in a string to Unicode - * - * @since mPDF 5.7 - * @param string $str - * @param bool $lo - * - * @return string - */ - public static function strcode2utf($str, $lo = \true) - { - $str = \preg_replace_callback('/\\&\\#(\\d+)\\;/m', function ($matches) use($lo) { - return static::code2utf($matches[1], $lo ? 1 : 0); - }, $str); - $str = \preg_replace_callback('/\\&\\#x([0-9a-fA-F]+)\\;/m', function ($matches) use($lo) { - return static::codeHex2utf($matches[1], $lo ? 1 : 0); - }, $str); - return $str; - } - /** - * @param int $num - * @param bool $lo - * - * @return string - */ - public static function code2utf($num, $lo = \true) - { - // Returns the utf string corresponding to the unicode value - if ($num < 128) { - return $lo ? \chr($num) : '&#' . $num . ';'; - } - if ($num < 2048) { - return \chr(($num >> 6) + 192) . \chr(($num & 63) + 128); - } - if ($num < 65536) { - return \chr(($num >> 12) + 224) . \chr(($num >> 6 & 63) + 128) . \chr(($num & 63) + 128); - } - if ($num < 2097152) { - return \chr(($num >> 18) + 240) . \chr(($num >> 12 & 63) + 128) . \chr(($num >> 6 & 63) + 128) . \chr(($num & 63) + 128); - } - return '?'; - } - public static function codeHex2utf($hex, $lo = \true) - { - $num = \hexdec($hex); - if ($num < 128 && !$lo) { - return '&#x' . $hex . ';'; - } - return static::code2utf($num, $lo); - } -} diff --git a/dependencies/mpdf/mpdf/src/Watermark.php b/dependencies/mpdf/mpdf/src/Watermark.php deleted file mode 100644 index 70e7b9e..0000000 --- a/dependencies/mpdf/mpdf/src/Watermark.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -interface Watermark -{ -} diff --git a/dependencies/mpdf/mpdf/src/WatermarkImage.php b/dependencies/mpdf/mpdf/src/WatermarkImage.php deleted file mode 100644 index cf980cf..0000000 --- a/dependencies/mpdf/mpdf/src/WatermarkImage.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class WatermarkImage implements \WP_Ultimo\Dependencies\Mpdf\Watermark -{ - const SIZE_DEFAULT = 'D'; - const SIZE_FIT_PAGE = 'P'; - const SIZE_FIT_FRAME = 'F'; - const POSITION_CENTER_PAGE = 'P'; - const POSITION_CENTER_FRAME = 'F'; - /** @var string */ - private $path; - /** @var mixed */ - private $size; - /** @var mixed */ - private $position; - /** @var float */ - private $alpha; - /** @var bool */ - private $behindContent; - /** @var string */ - private $alphaBlend; - public function __construct($path, $size = self::SIZE_DEFAULT, $position = self::POSITION_CENTER_PAGE, $alpha = -1, $behindContent = \false, $alphaBlend = 'Normal') - { - $this->path = $path; - $this->size = $size; - $this->position = $position; - $this->alpha = $alpha; - $this->behindContent = $behindContent; - $this->alphaBlend = $alphaBlend; - } - public function getPath() - { - return $this->path; - } - public function getSize() - { - return $this->size; - } - public function getPosition() - { - return $this->position; - } - public function getAlpha() - { - return $this->alpha; - } - public function isBehindContent() - { - return $this->behindContent; - } - public function getAlphaBlend() - { - return $this->alphaBlend; - } -} diff --git a/dependencies/mpdf/mpdf/src/WatermarkText.php b/dependencies/mpdf/mpdf/src/WatermarkText.php deleted file mode 100644 index e82c0a5..0000000 --- a/dependencies/mpdf/mpdf/src/WatermarkText.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf; - -class WatermarkText implements \WP_Ultimo\Dependencies\Mpdf\Watermark -{ - /** @var string */ - private $text; - /** @var int */ - private $size; - /** @var int */ - private $angle; - /** @var mixed */ - private $color; - /** @var float */ - private $alpha; - /** @var string */ - private $font; - public function __construct($text, $size = 96, $angle = 45, $color = 0, $alpha = 0.2, $font = null) - { - $this->text = $text; - $this->size = $size; - $this->angle = $angle; - $this->color = $color; - $this->alpha = $alpha; - $this->font = $font; - } - public function getText() - { - return $this->text; - } - public function getSize() - { - return $this->size; - } - public function getAngle() - { - return $this->angle; - } - public function getColor() - { - return $this->color; - } - public function getAlpha() - { - return $this->alpha; - } - public function getFont() - { - return $this->font; - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/BackgroundWriter.php b/dependencies/mpdf/mpdf/src/Writer/BackgroundWriter.php deleted file mode 100644 index 505a4bc..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/BackgroundWriter.php +++ /dev/null @@ -1,382 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Writer; - -use WP_Ultimo\Dependencies\Mpdf\Strict; -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -final class BackgroundWriter -{ - use Strict; - /** - * @var \Mpdf\Mpdf - */ - private $mpdf; - /** - * @var \Mpdf\Writer\BaseWriter - */ - private $writer; - public function __construct(Mpdf $mpdf, BaseWriter $writer) - { - $this->mpdf = $mpdf; - $this->writer = $writer; - } - public function writePatterns() - { - $patternCount = \count($this->mpdf->patterns); - for ($i = 1; $i <= $patternCount; $i++) { - $x = $this->mpdf->patterns[$i]['x']; - $y = $this->mpdf->patterns[$i]['y']; - $w = $this->mpdf->patterns[$i]['w']; - $h = $this->mpdf->patterns[$i]['h']; - $pgh = $this->mpdf->patterns[$i]['pgh']; - $orig_w = $this->mpdf->patterns[$i]['orig_w']; - $orig_h = $this->mpdf->patterns[$i]['orig_h']; - $image_id = $this->mpdf->patterns[$i]['image_id']; - $itype = $this->mpdf->patterns[$i]['itype']; - if (isset($this->mpdf->patterns[$i]['bpa'])) { - $bpa = $this->mpdf->patterns[$i]['bpa']; - } else { - $bpa = []; - // background positioning area - } - if ($this->mpdf->patterns[$i]['x_repeat']) { - $x_repeat = \true; - } else { - $x_repeat = \false; - } - if ($this->mpdf->patterns[$i]['y_repeat']) { - $y_repeat = \true; - } else { - $y_repeat = \false; - } - $x_pos = $this->mpdf->patterns[$i]['x_pos']; - if (\false !== \strpos($x_pos, '%')) { - $x_pos = (float) $x_pos; - $x_pos /= 100; - if (isset($bpa['w']) && $bpa['w']) { - $x_pos = $bpa['w'] * $x_pos - $orig_w / Mpdf::SCALE * $x_pos; - } else { - $x_pos = $w * $x_pos - $orig_w / Mpdf::SCALE * $x_pos; - } - } - $y_pos = $this->mpdf->patterns[$i]['y_pos']; - if (\false !== \strpos($y_pos, '%')) { - $y_pos = (float) $y_pos; - $y_pos /= 100; - if (isset($bpa['h']) && $bpa['h']) { - $y_pos = $bpa['h'] * $y_pos - $orig_h / Mpdf::SCALE * $y_pos; - } else { - $y_pos = $h * $y_pos - $orig_h / Mpdf::SCALE * $y_pos; - } - } - if (isset($bpa['x']) && $bpa['x']) { - $adj_x = ($x_pos + $bpa['x']) * Mpdf::SCALE; - } else { - $adj_x = ($x_pos + $x) * Mpdf::SCALE; - } - if (isset($bpa['y']) && $bpa['y']) { - $adj_y = ($pgh - $y_pos - $bpa['y']) * Mpdf::SCALE - $orig_h; - } else { - $adj_y = ($pgh - $y_pos - $y) * Mpdf::SCALE - $orig_h; - } - $img_obj = \false; - if ($itype === 'svg' || $itype === 'wmf') { - foreach ($this->mpdf->formobjects as $fo) { - if ($fo['i'] == $image_id) { - $img_obj = $fo['n']; - $fo_w = $fo['w']; - $fo_h = -$fo['h']; - $wmf_x = $fo['x']; - $wmf_y = $fo['y']; - break; - } - } - } else { - foreach ($this->mpdf->images as $img) { - if ($img['i'] == $image_id) { - $img_obj = $img['n']; - break; - } - } - } - if (!$img_obj) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Problem: Image object not found for background pattern ' . $img['i']); - } - $this->writer->object(); - $this->writer->write('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); - if ($itype === 'svg' || $itype === 'wmf') { - $this->writer->write('/XObject <</FO' . $image_id . ' ' . $img_obj . ' 0 R >>'); - // ******* ADD ANY ExtGStates, Shading AND Fonts needed for the FormObject - // Set in classes/svg array['fo'] = true - // Required that _putshaders comes before _putpatterns in _putresources - // This adds any resources associated with any FormObject to every Formobject - overkill but works! - if (\count($this->mpdf->extgstates)) { - $this->writer->write('/ExtGState <<'); - foreach ($this->mpdf->extgstates as $k => $extgstate) { - if (isset($extgstate['fo']) && $extgstate['fo']) { - if (isset($extgstate['trans'])) { - $this->writer->write('/' . $extgstate['trans'] . ' ' . $extgstate['n'] . ' 0 R'); - } else { - $this->writer->write('/GS' . $k . ' ' . $extgstate['n'] . ' 0 R'); - } - } - } - $this->writer->write('>>'); - } - /* -- BACKGROUNDS -- */ - if (isset($this->mpdf->gradients) && \count($this->mpdf->gradients) > 0) { - $this->writer->write('/Shading <<'); - foreach ($this->mpdf->gradients as $id => $grad) { - if (isset($grad['fo']) && $grad['fo']) { - $this->writer->write('/Sh' . $id . ' ' . $grad['id'] . ' 0 R'); - } - } - $this->writer->write('>>'); - } - /* -- END BACKGROUNDS -- */ - $this->writer->write('/Font <<'); - foreach ($this->mpdf->fonts as $font) { - if (!$font['used'] && $font['type'] === 'TTF') { - continue; - } - if (isset($font['fo']) && $font['fo']) { - if ($font['type'] === 'TTF' && ($font['sip'] || $font['smp'])) { - foreach ($font['n'] as $k => $fid) { - $this->writer->write('/F' . $font['subsetfontids'][$k] . ' ' . $font['n'][$k] . ' 0 R'); - } - } else { - $this->writer->write('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); - } - } - } - $this->writer->write('>>'); - } else { - $this->writer->write('/XObject <</I' . $image_id . ' ' . $img_obj . ' 0 R >>'); - } - $this->writer->write('>>'); - $this->writer->write('endobj'); - $this->writer->object(); - $this->mpdf->patterns[$i]['n'] = $this->mpdf->n; - $this->writer->write('<< /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 2'); - $this->writer->write('/Resources ' . ($this->mpdf->n - 1) . ' 0 R'); - $this->writer->write(\sprintf('/BBox [0 0 %.3F %.3F]', $orig_w, $orig_h)); - if ($x_repeat) { - $this->writer->write(\sprintf('/XStep %.3F', $orig_w)); - } else { - $this->writer->write(\sprintf('/XStep %d', 99999)); - } - if ($y_repeat) { - $this->writer->write(\sprintf('/YStep %.3F', $orig_h)); - } else { - $this->writer->write(\sprintf('/YStep %d', 99999)); - } - if ($itype === 'svg' || $itype === 'wmf') { - $this->writer->write(\sprintf('/Matrix [1 0 0 -1 %.3F %.3F]', $adj_x, $adj_y + $orig_h)); - $s = \sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $orig_w / $fo_w, -$orig_h / $fo_h, -($orig_w / $fo_w) * $wmf_x, $orig_w / $fo_w * $wmf_y, $image_id); - } else { - $this->writer->write(\sprintf('/Matrix [1 0 0 1 %.3F %.3F]', $adj_x, $adj_y)); - $s = \sprintf('q %.3F 0 0 %.3F 0 0 cm /I%d Do Q', $orig_w, $orig_h, $image_id); - } - if ($this->mpdf->compress) { - $this->writer->write('/Filter /FlateDecode'); - $s = \gzcompress($s); - } - $this->writer->write('/Length ' . \strlen($s) . '>>'); - $this->writer->stream($s); - $this->writer->write('endobj'); - } - } - public function writeShaders() - { - $maxid = \count($this->mpdf->gradients); - // index for transparency gradients - foreach ($this->mpdf->gradients as $id => $grad) { - if (empty($grad['is_mask']) && ($grad['type'] == 2 || $grad['type'] == 3)) { - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/FunctionType 3'); - $this->writer->write('/Domain [0 1]'); - $fn = []; - $bd = []; - $en = []; - for ($i = 0; $i < \count($grad['stops']) - 1; $i++) { - $fn[] = $this->mpdf->n + 1 + $i . ' 0 R'; - $en[] = '0 1'; - if ($i > 0) { - $bd[] = \sprintf('%.3F', $grad['stops'][$i]['offset']); - } - } - $this->writer->write('/Functions [' . \implode(' ', $fn) . ']'); - $this->writer->write('/Bounds [' . \implode(' ', $bd) . ']'); - $this->writer->write('/Encode [' . \implode(' ', $en) . ']'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - $f1 = $this->mpdf->n; - for ($i = 0; $i < \count($grad['stops']) - 1; $i++) { - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/FunctionType 2'); - $this->writer->write('/Domain [0 1]'); - $this->writer->write('/C0 [' . $grad['stops'][$i]['col'] . ']'); - $this->writer->write('/C1 [' . $grad['stops'][$i + 1]['col'] . ']'); - $this->writer->write('/N 1'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } - } - if ($grad['type'] == 2 || $grad['type'] == 3) { - if (isset($grad['trans']) && $grad['trans']) { - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/FunctionType 3'); - $this->writer->write('/Domain [0 1]'); - $fn = []; - $bd = []; - $en = []; - for ($i = 0; $i < \count($grad['stops']) - 1; $i++) { - $fn[] = $this->mpdf->n + 1 + $i . ' 0 R'; - $en[] = '0 1'; - if ($i > 0) { - $bd[] = \sprintf('%.3F', $grad['stops'][$i]['offset']); - } - } - $this->writer->write('/Functions [' . \implode(' ', $fn) . ']'); - $this->writer->write('/Bounds [' . \implode(' ', $bd) . ']'); - $this->writer->write('/Encode [' . \implode(' ', $en) . ']'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - $f2 = $this->mpdf->n; - for ($i = 0; $i < \count($grad['stops']) - 1; $i++) { - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/FunctionType 2'); - $this->writer->write('/Domain [0 1]'); - $this->writer->write(\sprintf('/C0 [%.3F]', $grad['stops'][$i]['opacity'])); - $this->writer->write(\sprintf('/C1 [%.3F]', $grad['stops'][$i + 1]['opacity'])); - $this->writer->write('/N 1'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } - } - } - if (empty($grad['is_mask'])) { - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/ShadingType ' . $grad['type']); - if (isset($grad['colorspace'])) { - $this->writer->write('/ColorSpace /Device' . $grad['colorspace']); - // Can use CMYK if all C0 and C1 above have 4 values - } else { - $this->writer->write('/ColorSpace /DeviceRGB'); - } - if ($grad['type'] == 2) { - $this->writer->write(\sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3])); - $this->writer->write('/Function ' . $f1 . ' 0 R'); - $this->writer->write('/Extend [' . $grad['extend'][0] . ' ' . $grad['extend'][1] . '] '); - $this->writer->write('>>'); - } elseif ($grad['type'] == 3) { - // x0, y0, r0, x1, y1, r1 - // at this this time radius of inner circle is 0 - $ir = 0; - if (isset($grad['coords'][5]) && $grad['coords'][5]) { - $ir = $grad['coords'][5]; - } - $this->writer->write(\sprintf('/Coords [%.3F %.3F %.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $ir, $grad['coords'][2], $grad['coords'][3], $grad['coords'][4])); - $this->writer->write('/Function ' . $f1 . ' 0 R'); - $this->writer->write('/Extend [' . $grad['extend'][0] . ' ' . $grad['extend'][1] . '] '); - $this->writer->write('>>'); - } elseif ($grad['type'] == 6) { - $this->writer->write('/BitsPerCoordinate 16'); - $this->writer->write('/BitsPerComponent 8'); - if ($grad['colorspace'] === 'CMYK') { - $this->writer->write('/Decode[0 1 0 1 0 1 0 1 0 1 0 1]'); - } elseif ($grad['colorspace'] === 'Gray') { - $this->writer->write('/Decode[0 1 0 1 0 1]'); - } else { - $this->writer->write('/Decode[0 1 0 1 0 1 0 1 0 1]'); - } - $this->writer->write('/BitsPerFlag 8'); - $this->writer->write('/Length ' . \strlen($grad['stream'])); - $this->writer->write('>>'); - $this->writer->stream($grad['stream']); - } - $this->writer->write('endobj'); - } - $this->mpdf->gradients[$id]['id'] = $this->mpdf->n; - // set pattern object - $this->writer->object(); - $out = '<< /Type /Pattern /PatternType 2'; - $out .= ' /Shading ' . $this->mpdf->gradients[$id]['id'] . ' 0 R'; - $out .= ' >>'; - $out .= "\n" . 'endobj'; - $this->writer->write($out); - $this->mpdf->gradients[$id]['pattern'] = $this->mpdf->n; - if (isset($grad['trans']) && $grad['trans']) { - // luminosity pattern - $transid = $id + $maxid; - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/ShadingType ' . $grad['type']); - $this->writer->write('/ColorSpace /DeviceGray'); - if ($grad['type'] == 2) { - $this->writer->write(\sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3])); - $this->writer->write('/Function ' . $f2 . ' 0 R'); - $this->writer->write('/Extend [' . $grad['extend'][0] . ' ' . $grad['extend'][1] . '] '); - $this->writer->write('>>'); - } elseif ($grad['type'] == 3) { - // x0, y0, r0, x1, y1, r1 - // at this this time radius of inner circle is 0 - $ir = 0; - if (isset($grad['coords'][5]) && $grad['coords'][5]) { - $ir = $grad['coords'][5]; - } - $this->writer->write(\sprintf('/Coords [%.3F %.3F %.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $ir, $grad['coords'][2], $grad['coords'][3], $grad['coords'][4])); - $this->writer->write('/Function ' . $f2 . ' 0 R'); - $this->writer->write('/Extend [' . $grad['extend'][0] . ' ' . $grad['extend'][1] . '] '); - $this->writer->write('>>'); - } elseif ($grad['type'] == 6) { - $this->writer->write('/BitsPerCoordinate 16'); - $this->writer->write('/BitsPerComponent 8'); - $this->writer->write('/Decode[0 1 0 1 0 1]'); - $this->writer->write('/BitsPerFlag 8'); - $this->writer->write('/Length ' . \strlen($grad['stream_trans'])); - $this->writer->write('>>'); - $this->writer->stream($grad['stream_trans']); - } - $this->writer->write('endobj'); - $this->mpdf->gradients[$transid]['id'] = $this->mpdf->n; - $this->writer->object(); - $this->writer->write('<< /Type /Pattern /PatternType 2'); - $this->writer->write('/Shading ' . $this->mpdf->gradients[$transid]['id'] . ' 0 R'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - $this->mpdf->gradients[$transid]['pattern'] = $this->mpdf->n; - $this->writer->object(); - // Need to extend size of viewing box in case of transformations - $str = 'q /a0 gs /Pattern cs /p' . $transid . ' scn -' . $this->mpdf->wPt / 2 . ' -' . $this->mpdf->hPt / 2 . ' ' . 2 * $this->mpdf->wPt . ' ' . 2 * $this->mpdf->hPt . ' re f Q'; - $filter = $this->mpdf->compress ? '/Filter /FlateDecode ' : ''; - $p = $this->mpdf->compress ? \gzcompress($str) : $str; - $this->writer->write('<< /Type /XObject /Subtype /Form /FormType 1 ' . $filter); - $this->writer->write('/Length ' . \strlen($p)); - $this->writer->write('/BBox [-' . $this->mpdf->wPt / 2 . ' -' . $this->mpdf->hPt / 2 . ' ' . 2 * $this->mpdf->wPt . ' ' . 2 * $this->mpdf->hPt . ']'); - $this->writer->write('/Group << /Type /Group /S /Transparency /CS /DeviceGray >>'); - $this->writer->write('/Resources <<'); - $this->writer->write('/ExtGState << /a0 << /ca 1 /CA 1 >> >>'); - $this->writer->write('/Pattern << /p' . $transid . ' ' . $this->mpdf->gradients[$transid]['pattern'] . ' 0 R >>'); - $this->writer->write('>>'); - $this->writer->write('>>'); - $this->writer->stream($p); - $this->writer->write('endobj'); - $this->writer->object(); - $this->writer->write('<< /Type /Mask /S /Luminosity /G ' . ($this->mpdf->n - 1) . ' 0 R >>' . "\n" . 'endobj'); - $this->writer->object(); - $this->writer->write('<< /Type /ExtGState /SMask ' . ($this->mpdf->n - 1) . ' 0 R /AIS false >>' . "\n" . 'endobj'); - if (isset($grad['fo']) && $grad['fo']) { - $this->mpdf->extgstates[] = ['n' => $this->mpdf->n, 'trans' => 'TGS' . $id, 'fo' => \true]; - } else { - $this->mpdf->extgstates[] = ['n' => $this->mpdf->n, 'trans' => 'TGS' . $id]; - } - } - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/BaseWriter.php b/dependencies/mpdf/mpdf/src/Writer/BaseWriter.php deleted file mode 100644 index 0b8268a..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/BaseWriter.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Writer; - -use WP_Ultimo\Dependencies\Mpdf\Strict; -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -use WP_Ultimo\Dependencies\Mpdf\Pdf\Protection; -final class BaseWriter -{ - use Strict; - /** - * @var \Mpdf\Mpdf - */ - private $mpdf; - /** - * @var \Mpdf\Pdf\Protection - */ - private $protection; - public function __construct(Mpdf $mpdf, Protection $protection) - { - $this->mpdf = $mpdf; - $this->protection = $protection; - } - public function write($s, $ln = \true) - { - if ($this->mpdf->state === 2) { - $this->endPage($s, $ln); - } else { - $this->mpdf->buffer .= $s . ($ln ? "\n" : ''); - } - } - public function string($s) - { - if ($this->mpdf->encrypted) { - $s = $this->protection->rc4($this->protection->objectKey($this->mpdf->currentObjectNumber), $s); - } - return '(' . $this->escape($s) . ')'; - } - public function object($obj_id = \false, $onlynewobj = \false) - { - if (!$obj_id) { - $obj_id = ++$this->mpdf->n; - } - // Begin a new object - if (!$onlynewobj) { - $this->mpdf->offsets[$obj_id] = \strlen($this->mpdf->buffer); - $this->write($obj_id . ' 0 obj'); - $this->mpdf->currentObjectNumber = $obj_id; - // for later use with encryption - } - } - public function stream($s) - { - if ($this->mpdf->encrypted) { - $s = $this->protection->rc4($this->protection->objectKey($this->mpdf->currentObjectNumber), $s); - } - $this->write('stream'); - $this->write($s); - $this->write('endstream'); - } - public function utf16BigEndianTextString($s) - { - $s = $this->utf8ToUtf16BigEndian($s, \true); - if ($this->mpdf->encrypted) { - $s = $this->protection->rc4($this->protection->objectKey($this->mpdf->currentObjectNumber), $s); - } - return '(' . $this->escape($s) . ')'; - } - // Converts UTF-8 strings to UTF16-BE. - public function utf8ToUtf16BigEndian($str, $setbom = \true) - { - if ($this->mpdf->checkSIP && \preg_match("/([\\x{20000}-\\x{2FFFF}])/u", $str)) { - if (!\in_array($this->mpdf->currentfontfamily, ['gb', 'big5', 'sjis', 'uhc', 'gbB', 'big5B', 'sjisB', 'uhcB', 'gbI', 'big5I', 'sjisI', 'uhcI', 'gbBI', 'big5BI', 'sjisBI', 'uhcBI'])) { - $str = \preg_replace("/[\\x{20000}-\\x{2FFFF}]/u", \chr(0), $str); - } - } - if ($this->mpdf->checkSMP && \preg_match("/([\\x{10000}-\\x{1FFFF}])/u", $str)) { - $str = \preg_replace("/[\\x{10000}-\\x{1FFFF}]/u", \chr(0), $str); - } - $outstr = ''; - // string to be returned - if ($setbom) { - $outstr .= "\xfe\xff"; - // Byte Order Mark (BOM) - } - $outstr .= \mb_convert_encoding($str, 'UTF-16BE', 'UTF-8'); - return $outstr; - } - public function escape($s) - { - return \strtr($s, [')' => '\\)', '(' => '\\(', '\\' => '\\\\', \chr(13) => '\\r']); - } - public function escapeSlashes($s) - { - return \strtr($s, ['/' => '#2F']); - } - /** - * Un-escapes a PDF string - * - * @param string $s - * @return string - */ - public function unescape($s) - { - $out = ''; - for ($count = 0, $n = \strlen($s); $count < $n; $count++) { - if ($count === $n - 1 || $s[$count] !== '\\') { - $out .= $s[$count]; - } else { - switch ($s[++$count]) { - case ')': - case '(': - case '\\': - $out .= $s[$count]; - break; - case 'f': - $out .= \chr(0xc); - break; - case 'b': - $out .= \chr(0x8); - break; - case 't': - $out .= \chr(0x9); - break; - case 'r': - $out .= \chr(0xd); - break; - case 'n': - $out .= \chr(0xa); - break; - case "\r": - if ($count !== $n - 1 && $s[$count + 1] === "\n") { - $count++; - } - break; - case "\n": - break; - default: - // Octal-Values - $ord = \ord($s[$count]); - if ($ord >= \ord('0') && $ord <= \ord('9')) { - $oct = '' . $s[$count]; - $ord = \ord($s[$count + 1]); - if ($ord >= \ord('0') && $ord <= \ord('9')) { - $oct .= $s[++$count]; - $ord = \ord($s[$count + 1]); - if ($ord >= \ord('0') && $ord <= \ord('9')) { - $oct .= $s[++$count]; - } - } - $out .= \chr(\octdec($oct)); - } else { - $out .= $s[$count]; - } - } - } - } - return $out; - } - private function endPage($s, $ln) - { - if ($this->mpdf->bufferoutput) { - $this->mpdf->headerbuffer .= $s . "\n"; - } elseif ($this->mpdf->ColActive && !$this->mpdf->processingHeader && !$this->mpdf->processingFooter) { - // Captures everything in buffer for columns; Almost everything is sent from fn. Cell() except: - // Images sent from Image() or - // later sent as write($textto) in printbuffer - // Line() - if (\preg_match('/q \\d+\\.\\d\\d+ 0 0 (\\d+\\.\\d\\d+) \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ cm \\/(I|FO)\\d+ Do Q/', $s, $m)) { - // Image data - $h = $m[1] / Mpdf::SCALE; - // Update/overwrite the lowest bottom of printing y value for a column - $this->mpdf->ColDetails[$this->mpdf->CurrCol]['bottom_margin'] = $this->mpdf->y + $h; - } elseif ($this->mpdf->tableLevel > 0 && \preg_match('/\\d+\\.\\d\\d+ \\d+\\.\\d\\d+ \\d+\\.\\d\\d+ ([\\-]{0,1}\\d+\\.\\d\\d+) re/', $s, $m)) { - // Rect in table - $h = $m[1] / Mpdf::SCALE; - // Update/overwrite the lowest bottom of printing y value for a column - $this->mpdf->ColDetails[$this->mpdf->CurrCol]['bottom_margin'] = \max($this->mpdf->ColDetails[$this->mpdf->CurrCol]['bottom_margin'], $this->mpdf->y + $h); - } elseif (isset($this->mpdf->ColDetails[$this->mpdf->CurrCol]['bottom_margin'])) { - $h = $this->mpdf->ColDetails[$this->mpdf->CurrCol]['bottom_margin'] - $this->mpdf->y; - } else { - $h = 0; - } - if ($h < 0) { - $h = -$h; - } - $this->mpdf->columnbuffer[] = [ - 's' => $s, - // Text string to output - 'col' => $this->mpdf->CurrCol, - // Column when printed - 'x' => $this->mpdf->x, - // x when printed - 'y' => $this->mpdf->y, - // this->y when printed (after column break) - 'h' => $h, - ]; - } elseif ($this->mpdf->table_rotate && !$this->mpdf->processingHeader && !$this->mpdf->processingFooter) { - // Captures eveything in buffer for rotated tables; - $this->mpdf->tablebuffer .= $s . "\n"; - } elseif ($this->mpdf->kwt && !$this->mpdf->processingHeader && !$this->mpdf->processingFooter) { - // Captures eveything in buffer for keep-with-table (h1-6); - $this->mpdf->kwt_buffer[] = [ - 's' => $s, - // Text string to output - 'x' => $this->mpdf->x, - // x when printed - 'y' => $this->mpdf->y, - ]; - } elseif ($this->mpdf->keep_block_together && !$this->mpdf->processingHeader && !$this->mpdf->processingFooter) { - // do nothing - } else { - $this->mpdf->pages[$this->mpdf->page] .= $s . ($ln ? "\n" : ''); - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/BookmarkWriter.php b/dependencies/mpdf/mpdf/src/Writer/BookmarkWriter.php deleted file mode 100644 index c0c7a49..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/BookmarkWriter.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php - -namespace WP_Ultimo\Dependencies\Mpdf\Writer; - -use WP_Ultimo\Dependencies\Mpdf\Strict; -use WP_Ultimo\Dependencies\Mpdf\Mpdf; -final class BookmarkWriter -{ - use Strict; - /** - * @var \Mpdf\Mpdf - */ - private $mpdf; - /** - * @var \Mpdf\Writer\BaseWriter - */ - private $writer; - public function __construct(Mpdf $mpdf, BaseWriter $writer) - { - $this->mpdf = $mpdf; - $this->writer = $writer; - } - public function writeBookmarks() - { - $nb = \count($this->mpdf->BMoutlines); - if ($nb === 0) { - return; - } - $bmo = $this->mpdf->BMoutlines; - $this->mpdf->BMoutlines = []; - $lastlevel = -1; - for ($i = 0; $i < \count($bmo); $i++) { - if ($bmo[$i]['l'] > 0) { - while ($bmo[$i]['l'] - $lastlevel > 1) { - // If jump down more than one level, insert a new entry - $new = $bmo[$i]; - $new['t'] = "[" . $new['t'] . "]"; - // Put [] around text/title to highlight - $new['l'] = $lastlevel + 1; - $lastlevel++; - $this->mpdf->BMoutlines[] = $new; - } - } - $this->mpdf->BMoutlines[] = $bmo[$i]; - $lastlevel = $bmo[$i]['l']; - } - $nb = \count($this->mpdf->BMoutlines); - $lru = []; - $level = 0; - foreach ($this->mpdf->BMoutlines as $i => $o) { - if ($o['l'] > 0) { - $parent = $lru[$o['l'] - 1]; - // Set parent and last pointers - $this->mpdf->BMoutlines[$i]['parent'] = $parent; - $this->mpdf->BMoutlines[$parent]['last'] = $i; - if ($o['l'] > $level) { - // Level increasing: set first pointer - $this->mpdf->BMoutlines[$parent]['first'] = $i; - } - } else { - $this->mpdf->BMoutlines[$i]['parent'] = $nb; - } - if ($o['l'] <= $level and $i > 0) { - // Set prev and next pointers - $prev = $lru[$o['l']]; - $this->mpdf->BMoutlines[$prev]['next'] = $i; - $this->mpdf->BMoutlines[$i]['prev'] = $prev; - } - $lru[$o['l']] = $i; - $level = $o['l']; - } - // Outline items - $n = $this->mpdf->n + 1; - foreach ($this->mpdf->BMoutlines as $i => $o) { - $this->writer->object(); - $this->writer->write('<writer->utf16BigEndianTextString($o['t'])); - $this->writer->write('/Parent ' . ($n + $o['parent']) . ' 0 R'); - if (isset($o['prev'])) { - $this->writer->write('/Prev ' . ($n + $o['prev']) . ' 0 R'); - } - if (isset($o['next'])) { - $this->writer->write('/Next ' . ($n + $o['next']) . ' 0 R'); - } - if (isset($o['first'])) { - $this->writer->write('/First ' . ($n + $o['first']) . ' 0 R'); - } - if (isset($o['last'])) { - $this->writer->write('/Last ' . ($n + $o['last']) . ' 0 R'); - } - if (isset($this->mpdf->pageDim[$o['p']]['h'])) { - $h = $this->mpdf->pageDim[$o['p']]['h']; - } else { - $h = 0; - } - $this->writer->write(\sprintf('/Dest [%d 0 R /XYZ 0 %.3F null]', 1 + 2 * $o['p'], ($h - $o['y']) * Mpdf::SCALE)); - if (isset($this->mpdf->bookmarkStyles) && isset($this->mpdf->bookmarkStyles[$o['l']])) { - // font style - $bms = $this->mpdf->bookmarkStyles[$o['l']]['style']; - $style = 0; - if (\strpos($bms, 'B') !== \false) { - $style += 2; - } - if (\strpos($bms, 'I') !== \false) { - $style += 1; - } - $this->writer->write(\sprintf('/F %d', $style)); - // Colour - $col = $this->mpdf->bookmarkStyles[$o['l']]['color']; - if (isset($col) && \is_array($col) && \count($col) == 3) { - $this->writer->write(\sprintf('/C [%.3F %.3F %.3F]', $col[0] / 255, $col[1] / 255, $col[2] / 255)); - } - } - $this->writer->write('/Count 0>>'); - $this->writer->write('endobj'); - } - // Outline root - $this->writer->object(); - $this->mpdf->OutlineRoot = $this->mpdf->n; - $this->writer->write('<writer->write('/Last ' . ($n + $lru[0]) . ' 0 R>>'); - $this->writer->write('endobj'); - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/ColorWriter.php b/dependencies/mpdf/mpdf/src/Writer/ColorWriter.php deleted file mode 100644 index ef7f28e..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/ColorWriter.php +++ /dev/null @@ -1,36 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - } - public function writeSpotColors() - { - foreach ($this->mpdf->spotColors as $name => $color) { - $this->writer->object(); - $this->writer->write('[/Separation /' . \str_replace(' ', '#20', $name)); - $this->writer->write('/DeviceCMYK <<'); - $this->writer->write('/Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0] '); - $this->writer->write(\sprintf('/C1 [%.3F %.3F %.3F %.3F] ', $color['c'] / 100, $color['m'] / 100, $color['y'] / 100, $color['k'] / 100)); - $this->writer->write('/FunctionType 2 /Domain [0 1] /N 1>>]'); - $this->writer->write('endobj'); - $this->mpdf->spotColors[$name]['n'] = $this->mpdf->n; - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/FontWriter.php b/dependencies/mpdf/mpdf/src/Writer/FontWriter.php deleted file mode 100644 index ee35824..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/FontWriter.php +++ /dev/null @@ -1,605 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - $this->fontCache = $fontCache; - $this->fontDescriptor = $fontDescriptor; - } - public function writeFonts() - { - foreach ($this->mpdf->FontFiles as $fontkey => $info) { - // TrueType embedded - if (isset($info['type']) && $info['type'] === 'TTF' && !$info['sip'] && !$info['smp']) { - $used = \true; - $asSubset = \false; - foreach ($this->mpdf->fonts as $k => $f) { - if (isset($f['fontkey']) && $f['fontkey'] === $fontkey && $f['type'] === 'TTF') { - $used = $f['used']; - if ($used) { - $nChars = (\ord($f['cw'][0]) << 8) + \ord($f['cw'][1]); - $usage = (int) (\count($f['subset']) * 100 / $nChars); - $fsize = $info['length1']; - // Always subset the very large TTF files - if ($fsize > $this->mpdf->maxTTFFilesize * 1024) { - $asSubset = \true; - } elseif ($usage < $this->mpdf->percentSubset) { - $asSubset = \true; - } - } - if ($this->mpdf->PDFA || $this->mpdf->PDFX) { - $asSubset = \false; - } - $this->mpdf->fonts[$k]['asSubset'] = $asSubset; - break; - } - } - if ($used && !$asSubset) { - // Font file embedding - $this->writer->object(); - $this->mpdf->FontFiles[$fontkey]['n'] = $this->mpdf->n; - $originalsize = $info['length1']; - if ($this->mpdf->repackageTTF || $this->mpdf->fonts[$fontkey]['TTCfontID'] > 0 || $this->mpdf->fonts[$fontkey]['useOTL'] > 0) { - // mPDF 5.7.1 - // First see if there is a cached compressed file - if ($this->fontCache->has($fontkey . '.ps.z') && $this->fontCache->jsonHas($fontkey . '.ps.json')) { - $font = $this->fontCache->load($fontkey . '.ps.z'); - $originalsize = $this->fontCache->jsonLoad($fontkey . '.ps.json'); - // sets $originalsize (of repackaged font) - } else { - $ttf = new TTFontFile($this->fontCache, $this->fontDescriptor); - $font = $ttf->repackageTTF($this->mpdf->FontFiles[$fontkey]['ttffile'], $this->mpdf->fonts[$fontkey]['TTCfontID'], $this->mpdf->debugfonts, $this->mpdf->fonts[$fontkey]['useOTL']); - // mPDF 5.7.1 - $originalsize = \strlen($font); - $font = \gzcompress($font); - unset($ttf); - $this->fontCache->binaryWrite($fontkey . '.ps.z', $font); - $this->fontCache->jsonWrite($fontkey . '.ps.json', $originalsize); - } - } elseif ($this->fontCache->has($fontkey . '.z')) { - $font = $this->fontCache->load($fontkey . '.z'); - } else { - $font = \file_get_contents($this->mpdf->FontFiles[$fontkey]['ttffile']); - $font = \gzcompress($font); - $this->fontCache->binaryWrite($fontkey . '.z', $font); - } - $this->writer->write('<writer->write('/Filter /FlateDecode'); - $this->writer->write('/Length1 ' . $originalsize); - $this->writer->write('>>'); - $this->writer->stream($font); - $this->writer->write('endobj'); - } - } - } - foreach ($this->mpdf->fonts as $k => $font) { - // Font objects - $type = $font['type']; - $name = $font['name']; - if ($type === 'TTF' && (!isset($font['used']) || !$font['used'])) { - continue; - } - // @log Writing fonts - if (isset($font['asSubset'])) { - $asSubset = $font['asSubset']; - } else { - $asSubset = ''; - } - if ($type === 'Type0') { - // Adobe CJK Fonts - $this->mpdf->fonts[$k]['n'] = $this->mpdf->n + 1; - $this->writer->object(); - $this->writer->write('<writeType0($font); - } elseif ($type === 'core') { - // Standard font - $this->mpdf->fonts[$k]['n'] = $this->mpdf->n + 1; - if ($this->mpdf->PDFA || $this->mpdf->PDFX) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('Core fonts are not allowed in PDF/A1-b or PDFX/1-a files (Times, Helvetica, Courier etc.)'); - } - $this->writer->object(); - $this->writer->write('<writer->write('/BaseFont /' . $name); - $this->writer->write('/Subtype /Type1'); - if ($name !== 'Symbol' && $name !== 'ZapfDingbats') { - $this->writer->write('/Encoding /WinAnsiEncoding'); - } - $this->writer->write('>>'); - $this->writer->write('endobj'); - } elseif ($type === 'TTF' && ($font['sip'] || $font['smp'])) { - // TrueType embedded SUBSETS for SIP (CJK extB containing Supplementary Ideographic Plane 2) - // Or Unicode Plane 1 - Supplementary Multilingual Plane - if (!$font['used']) { - continue; - } - $ssfaid = 'AA'; - $ttf = new TTFontFile($this->fontCache, $this->fontDescriptor); - $subsetCount = \count($font['subsetfontids']); - for ($sfid = 0; $sfid < $subsetCount; $sfid++) { - $this->mpdf->fonts[$k]['n'][$sfid] = $this->mpdf->n + 1; - // NB an array for subset - $subsetname = 'MPDF' . $ssfaid . '+' . $font['name']; - $ssfaid++; - /* For some strange reason a subset ($sfid > 0) containing less than 97 characters causes an error - so fill up the array */ - for ($j = \count($font['subsets'][$sfid]); $j < 98; $j++) { - $font['subsets'][$sfid][$j] = 0; - } - $subset = $font['subsets'][$sfid]; - unset($subset[0]); - $ttfontstream = $ttf->makeSubsetSIP($font['ttffile'], $subset, $font['TTCfontID'], $this->mpdf->debugfonts, $font['useOTL']); - // mPDF 5.7.1 - $ttfontsize = \strlen($ttfontstream); - $fontstream = \gzcompress($ttfontstream); - $widthstring = ''; - $toUnistring = ''; - foreach ($font['subsets'][$sfid] as $cp => $u) { - $w = $this->mpdf->_getCharWidth($font['cw'], $u); - if ($w !== \false) { - $widthstring .= $w . ' '; - } else { - $widthstring .= \round($ttf->defaultWidth) . ' '; - } - if ($u > 65535) { - $utf8 = \chr(($u >> 18) + 240) . \chr(($u >> 12 & 63) + 128) . \chr(($u >> 6 & 63) + 128) . \chr(($u & 63) + 128); - $utf16 = \mb_convert_encoding($utf8, 'UTF-16BE', 'UTF-8'); - $l1 = \ord($utf16[0]); - $h1 = \ord($utf16[1]); - $l2 = \ord($utf16[2]); - $h2 = \ord($utf16[3]); - $toUnistring .= \sprintf("<%02s> <%02s%02s%02s%02s>\n", \strtoupper(\dechex($cp)), \strtoupper(\dechex($l1)), \strtoupper(\dechex($h1)), \strtoupper(\dechex($l2)), \strtoupper(\dechex($h2))); - } else { - $toUnistring .= \sprintf("<%02s> <%04s>\n", \strtoupper(\dechex($cp)), \strtoupper(\dechex($u))); - } - } - // Additional Type1 or TrueType font - $this->writer->object(); - $this->writer->write('<writer->write('/BaseFont /' . $subsetname); - $this->writer->write('/Subtype /TrueType'); - $this->writer->write('/FirstChar 0 /LastChar ' . (\count($font['subsets'][$sfid]) - 1)); - $this->writer->write('/Widths ' . ($this->mpdf->n + 1) . ' 0 R'); - $this->writer->write('/FontDescriptor ' . ($this->mpdf->n + 2) . ' 0 R'); - $this->writer->write('/ToUnicode ' . ($this->mpdf->n + 3) . ' 0 R'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // Widths - $this->writer->object(); - $this->writer->write('[' . $widthstring . ']'); - $this->writer->write('endobj'); - // Descriptor - $this->writer->object(); - $s = '< $v) { - if ($kd === 'Flags') { - $v |= 4; - $v &= ~32; - } - // SYMBOLIC font flag - $s .= ' /' . $kd . ' ' . $v . "\n"; - } - $s .= '/FontFile2 ' . ($this->mpdf->n + 2) . ' 0 R'; - $this->writer->write($s . '>>'); - $this->writer->write('endobj'); - // ToUnicode - $this->writer->object(); - $toUni = "/CIDInit /ProcSet findresource begin\n"; - $toUni .= "12 dict begin\n"; - $toUni .= "begincmap\n"; - $toUni .= "/CIDSystemInfo\n"; - $toUni .= "< <%02s>\n", strtoupper(dechex(count($font['subsets'][$sfid])-1))); - $toUni .= "endcodespacerange\n"; - $toUni .= \count($font['subsets'][$sfid]) . " beginbfchar\n"; - $toUni .= $toUnistring; - $toUni .= "endbfchar\n"; - $toUni .= "endcmap\n"; - $toUni .= "CMapName currentdict /CMap defineresource pop\n"; - $toUni .= "end\n"; - $toUni .= "end\n"; - $this->writer->write('<>'); - $this->writer->stream($toUni); - $this->writer->write('endobj'); - // Font file - $this->writer->object(); - $this->writer->write('<writer->write('/Filter /FlateDecode'); - $this->writer->write('/Length1 ' . $ttfontsize); - $this->writer->write('>>'); - $this->writer->stream($fontstream); - $this->writer->write('endobj'); - } - // foreach subset - unset($ttf); - } elseif ($type === 'TTF') { - // TrueType embedded SUBSETS or FULL - $this->mpdf->fonts[$k]['n'] = $this->mpdf->n + 1; - if ($asSubset) { - $ssfaid = 'A'; - $ttf = new TTFontFile($this->fontCache, $this->fontDescriptor); - $fontname = 'MPDFA' . $ssfaid . '+' . $font['name']; - $subset = $font['subset']; - unset($subset[0]); - $ttfontstream = $ttf->makeSubset($font['ttffile'], $subset, $font['TTCfontID'], $this->mpdf->debugfonts, $font['useOTL']); - $ttfontsize = \strlen($ttfontstream); - $fontstream = \gzcompress($ttfontstream); - $codeToGlyph = $ttf->codeToGlyph; - unset($codeToGlyph[0]); - } else { - $fontname = $font['name']; - } - // Type0 Font - // A composite font - a font composed of other fonts, organized hierarchically - $this->writer->object(); - $this->writer->write('<writer->write('/Subtype /Type0'); - $this->writer->write('/BaseFont /' . $fontname . ''); - $this->writer->write('/Encoding /Identity-H'); - $this->writer->write('/DescendantFonts [' . ($this->mpdf->n + 1) . ' 0 R]'); - $this->writer->write('/ToUnicode ' . ($this->mpdf->n + 2) . ' 0 R'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // CIDFontType2 - // A CIDFont whose glyph descriptions are based on TrueType font technology - $this->writer->object(); - $this->writer->write('<writer->write('/Subtype /CIDFontType2'); - $this->writer->write('/BaseFont /' . $fontname . ''); - $this->writer->write('/CIDSystemInfo ' . ($this->mpdf->n + 2) . ' 0 R'); - $this->writer->write('/FontDescriptor ' . ($this->mpdf->n + 3) . ' 0 R'); - if (isset($font['desc']['MissingWidth'])) { - $this->writer->write('/DW ' . $font['desc']['MissingWidth'] . ''); - } - if (!$asSubset && $this->fontCache->has($font['fontkey'] . '.cw')) { - $w = $this->fontCache->load($font['fontkey'] . '.cw'); - $this->writer->write($w); - } else { - $this->writeTTFontWidths($font, $asSubset, $asSubset ? $ttf->maxUni : 0); - } - $this->writer->write('/CIDToGIDMap ' . ($this->mpdf->n + 4) . ' 0 R'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // ToUnicode - $this->writer->object(); - $toUni = "/CIDInit /ProcSet findresource begin\n"; - $toUni .= "12 dict begin\n"; - $toUni .= "begincmap\n"; - $toUni .= "/CIDSystemInfo\n"; - $toUni .= "<writer->write('<>'); - $this->writer->stream($toUni); - $this->writer->write('endobj'); - // CIDSystemInfo dictionary - $this->writer->object(); - $this->writer->write('<writer->write('/Ordering (UCS)'); - $this->writer->write('/Supplement 0'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // Font descriptor - $this->writer->object(); - $this->writer->write('<writer->write('/FontName /' . $fontname); - foreach ($font['desc'] as $kd => $v) { - if ($asSubset && $kd === 'Flags') { - $v |= 4; - $v &= ~32; - } - // SYMBOLIC font flag - $this->writer->write(' /' . $kd . ' ' . $v); - } - if ($font['panose']) { - $this->writer->write(' /Style << /Panose <' . $font['panose'] . '> >>'); - } - if ($asSubset) { - $this->writer->write('/FontFile2 ' . ($this->mpdf->n + 2) . ' 0 R'); - } elseif ($font['fontkey']) { - // obj ID of a stream containing a TrueType font program - $this->writer->write('/FontFile2 ' . $this->mpdf->FontFiles[$font['fontkey']]['n'] . ' 0 R'); - } - $this->writer->write('>>'); - $this->writer->write('endobj'); - // Embed CIDToGIDMap - // A specification of the mapping from CIDs to glyph indices - if ($asSubset) { - $cidtogidmap = \str_pad('', 256 * 256 * 2, "\x00"); - foreach ($codeToGlyph as $cc => $glyph) { - $cidtogidmap[$cc * 2] = \chr($glyph >> 8); - $cidtogidmap[$cc * 2 + 1] = \chr($glyph & 0xff); - } - $cidtogidmap = \gzcompress($cidtogidmap); - } else { - // First see if there is a cached CIDToGIDMapfile - if ($this->fontCache->has($font['fontkey'] . '.cgm')) { - $cidtogidmap = $this->fontCache->load($font['fontkey'] . '.cgm'); - } else { - $ttf = new TTFontFile($this->fontCache, $this->fontDescriptor); - $charToGlyph = $ttf->getCTG($font['ttffile'], $font['TTCfontID'], $this->mpdf->debugfonts, $font['useOTL']); - $cidtogidmap = \str_pad('', 256 * 256 * 2, "\x00"); - foreach ($charToGlyph as $cc => $glyph) { - $cidtogidmap[$cc * 2] = \chr($glyph >> 8); - $cidtogidmap[$cc * 2 + 1] = \chr($glyph & 0xff); - } - unset($ttf); - $cidtogidmap = \gzcompress($cidtogidmap); - $this->fontCache->binaryWrite($font['fontkey'] . '.cgm', $cidtogidmap); - } - } - $this->writer->object(); - $this->writer->write('<writer->write('/Filter /FlateDecode'); - $this->writer->write('>>'); - $this->writer->stream($cidtogidmap); - $this->writer->write('endobj'); - // Font file - if ($asSubset) { - $this->writer->object(); - $this->writer->write('<writer->write('/Filter /FlateDecode'); - $this->writer->write('/Length1 ' . $ttfontsize); - $this->writer->write('>>'); - $this->writer->stream($fontstream); - $this->writer->write('endobj'); - unset($ttf); - } - } else { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Unsupported font type: %s (%s)', $type, $name)); - } - } - } - private function writeTTFontWidths(&$font, $asSubset, $maxUni) - { - $character = ['startcid' => 1, 'rangeid' => 0, 'prevcid' => -2, 'prevwidth' => -1, 'interval' => \false, 'range' => []]; - $fontCacheFilename = $font['fontkey'] . '.cw127.json'; - if ($asSubset && $this->fontCache->jsonHas($fontCacheFilename)) { - $character = $this->fontCache->jsonLoad($fontCacheFilename); - $character['startcid'] = 128; - } - // for each character - $cwlen = $asSubset ? $maxUni + 1 : \strlen($font['cw']) / 2; - for ($cid = $character['startcid']; $cid < $cwlen; $cid++) { - if ($cid == 128 && $asSubset && !$this->fontCache->has($fontCacheFilename)) { - $character = ['rangeid' => $character['rangeid'], 'prevcid' => $character['prevcid'], 'prevwidth' => $character['prevwidth'], 'interval' => $character['interval'], 'range' => $character['range']]; - $this->fontCache->jsonWrite($fontCacheFilename, $character); - } - $character1 = isset($font['cw'][$cid * 2]) ? $font['cw'][$cid * 2] : ''; - $character2 = isset($font['cw'][$cid * 2 + 1]) ? $font['cw'][$cid * 2 + 1] : ''; - if ($character1 === "\x00" && $character2 === "\x00") { - continue; - } - $width = (\ord($character1) << 8) + \ord($character2); - if ($width === 65535) { - $width = 0; - } - if ($asSubset && $cid > 255 && (!isset($font['subset'][$cid]) || !$font['subset'][$cid])) { - continue; - } - if ($asSubset && $cid > 0xffff) { - continue; - } - // mPDF 6 - if (!isset($font['dw']) || isset($font['dw']) && $width != $font['dw']) { - if ($cid === $character['prevcid'] + 1) { - // consecutive CID - if ($width === $character['prevwidth']) { - if (isset($character['range'][$character['rangeid']][0]) && $width === $character['range'][$character['rangeid']][0]) { - $character['range'][$character['rangeid']][] = $width; - } else { - \array_pop($character['range'][$character['rangeid']]); - // new range - $character['rangeid'] = $character['prevcid']; - $character['range'][$character['rangeid']] = []; - $character['range'][$character['rangeid']][] = $character['prevwidth']; - $character['range'][$character['rangeid']][] = $width; - } - $character['interval'] = \true; - $character['range'][$character['rangeid']]['interval'] = \true; - } else { - if ($character['interval']) { - // new range - $character['rangeid'] = $cid; - $character['range'][$character['rangeid']] = []; - $character['range'][$character['rangeid']][] = $width; - } else { - $character['range'][$character['rangeid']][] = $width; - } - $character['interval'] = \false; - } - } else { - // new range - $character['rangeid'] = $cid; - $character['range'][$character['rangeid']] = []; - $character['range'][$character['rangeid']][] = $width; - $character['interval'] = \false; - } - $character['prevcid'] = $cid; - $character['prevwidth'] = $width; - } - } - $w = $this->writeFontRanges($character['range']); - $this->writer->write($w); - if (!$asSubset) { - $this->fontCache->binaryWrite($font['fontkey'] . '.cw', $w); - } - } - private function writeFontRanges(&$range) - { - // optimize ranges - $prevk = -1; - $nextk = -1; - $prevint = \false; - foreach ($range as $k => $ws) { - $cws = \count($ws); - if ($k == $nextk and !$prevint and (!isset($ws['interval']) or $cws < 4)) { - if (isset($range[$k]['interval'])) { - unset($range[$k]['interval']); - } - $range[$prevk] = \array_merge($range[$prevk], $range[$k]); - unset($range[$k]); - } else { - $prevk = $k; - } - $nextk = $k + $cws; - if (isset($ws['interval'])) { - if ($cws > 3) { - $prevint = \true; - } else { - $prevint = \false; - } - unset($range[$k]['interval']); - --$nextk; - } else { - $prevint = \false; - } - } - // output data - $w = ''; - foreach ($range as $k => $ws) { - if (\count(\array_count_values($ws)) === 1) { - // interval mode is more compact - $w .= ' ' . $k . ' ' . ($k + \count($ws) - 1) . ' ' . $ws[0]; - } else { - // range mode - $w .= ' ' . $k . ' [ ' . \implode(' ', $ws) . ' ]' . "\n"; - } - } - return '/W [' . $w . ' ]'; - } - private function writeFontWidths(&$font, $cidoffset = 0) - { - \ksort($font['cw']); - unset($font['cw'][65535]); - $rangeid = 0; - $range = []; - $prevcid = -2; - $prevwidth = -1; - $interval = \false; - // for each character - foreach ($font['cw'] as $cid => $width) { - $cid -= $cidoffset; - if (!isset($font['dw']) || isset($font['dw']) && $width != $font['dw']) { - if ($cid === $prevcid + 1) { - // consecutive CID - if ($width === $prevwidth) { - if ($width === $range[$rangeid][0]) { - $range[$rangeid][] = $width; - } else { - \array_pop($range[$rangeid]); - // new range - $rangeid = $prevcid; - $range[$rangeid] = []; - $range[$rangeid][] = $prevwidth; - $range[$rangeid][] = $width; - } - $interval = \true; - $range[$rangeid]['interval'] = \true; - } else { - if ($interval) { - // new range - $rangeid = $cid; - $range[$rangeid] = []; - $range[$rangeid][] = $width; - } else { - $range[$rangeid][] = $width; - } - $interval = \false; - } - } else { - // new range - $rangeid = $cid; - $range[$rangeid] = []; - $range[$rangeid][] = $width; - $interval = \false; - } - $prevcid = $cid; - $prevwidth = $width; - } - } - $this->writer->write($this->writeFontRanges($range)); - } - // from class PDF_Chinese CJK EXTENSIONS - public function writeType0(&$font) - { - // Type0 - $this->writer->write('/Subtype /Type0'); - $this->writer->write('/BaseFont /' . $font['name'] . '-' . $font['CMap']); - $this->writer->write('/Encoding /' . $font['CMap']); - $this->writer->write('/DescendantFonts [' . ($this->mpdf->n + 1) . ' 0 R]'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // CIDFont - $this->writer->object(); - $this->writer->write('<writer->write('/Subtype /CIDFontType0'); - $this->writer->write('/BaseFont /' . $font['name']); - $cidinfo = '/Registry ' . $this->writer->string('Adobe'); - $cidinfo .= ' /Ordering ' . $this->writer->string($font['registry']['ordering']); - $cidinfo .= ' /Supplement ' . $font['registry']['supplement']; - $this->writer->write('/CIDSystemInfo <<' . $cidinfo . '>>'); - $this->writer->write('/FontDescriptor ' . ($this->mpdf->n + 1) . ' 0 R'); - if (isset($font['MissingWidth'])) { - $this->writer->write('/DW ' . $font['MissingWidth'] . ''); - } - $this->writeFontWidths($font, 31); - $this->writer->write('>>'); - $this->writer->write('endobj'); - // Font descriptor - $this->writer->object(); - $s = '< $v) { - if ($k !== 'Style') { - $s .= ' /' . $k . ' ' . $v . ''; - } - } - $this->writer->write($s . '>>'); - $this->writer->write('endobj'); - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/FormWriter.php b/dependencies/mpdf/mpdf/src/Writer/FormWriter.php deleted file mode 100644 index d3b0a21..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/FormWriter.php +++ /dev/null @@ -1,48 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - } - public function writeFormObjects() - { - foreach ($this->mpdf->formobjects as $file => $info) { - $this->writer->object(); - $this->mpdf->formobjects[$file]['n'] = $this->mpdf->n; - $this->writer->write('<writer->write('/Subtype /Form'); - $this->writer->write('/Group ' . ($this->mpdf->n + 1) . ' 0 R'); - $this->writer->write('/BBox [' . $info['x'] . ' ' . $info['y'] . ' ' . ($info['w'] + $info['x']) . ' ' . ($info['h'] + $info['y']) . ']'); - if ($this->mpdf->compress) { - $this->writer->write('/Filter /FlateDecode'); - } - $data = $this->mpdf->compress ? \gzcompress($info['data']) : $info['data']; - $this->writer->write('/Length ' . \strlen($data) . '>>'); - $this->writer->stream($data); - unset($this->mpdf->formobjects[$file]['data']); - $this->writer->write('endobj'); - // Required for SVG transparency (opacity) to work - $this->writer->object(); - $this->writer->write('<writer->write('/S /Transparency'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/ImageWriter.php b/dependencies/mpdf/mpdf/src/Writer/ImageWriter.php deleted file mode 100644 index 412ab14..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/ImageWriter.php +++ /dev/null @@ -1,100 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - } - public function writeImages() - { - $filter = $this->mpdf->compress ? '/Filter /FlateDecode ' : ''; - foreach ($this->mpdf->images as $file => $info) { - $this->writer->object(); - $this->mpdf->images[$file]['n'] = $this->mpdf->n; - $this->writer->write('<writer->write('/Subtype /Image'); - $this->writer->write('/Width ' . $info['w']); - $this->writer->write('/Height ' . $info['h']); - if (isset($info['interpolation']) && $info['interpolation']) { - $this->writer->write('/Interpolate true'); - // mPDF 6 - image interpolation shall be performed by a conforming reader - } - if (isset($info['masked'])) { - $this->writer->write('/SMask ' . ($this->mpdf->n - 1) . ' 0 R'); - } - // set color space - $icc = \false; - if (isset($info['icc']) && $info['icc'] !== \false) { - // ICC Colour Space - $icc = \true; - $this->writer->write('/ColorSpace [/ICCBased ' . ($this->mpdf->n + 1) . ' 0 R]'); - } elseif ($info['cs'] === 'Indexed') { - if ($this->mpdf->PDFX || $this->mpdf->PDFA && $this->mpdf->restrictColorSpace === 3) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDFA1-b and PDFX/1-a files do not permit using mixed colour space (' . $file . ').'); - } - $this->writer->write('/ColorSpace [/Indexed /DeviceRGB ' . (\strlen($info['pal']) / 3 - 1) . ' ' . ($this->mpdf->n + 1) . ' 0 R]'); - } else { - $this->writer->write('/ColorSpace /' . $info['cs']); - if ($info['cs'] === 'DeviceCMYK') { - if ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace !== 3) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDFA1-b does not permit Images using mixed colour space (' . $file . ').'); - } - if ($info['type'] === 'jpg') { - $this->writer->write('/Decode [1 0 1 0 1 0 1 0]'); - } - } elseif (($this->mpdf->PDFX || $this->mpdf->PDFA && $this->mpdf->restrictColorSpace === 3) && $info['cs'] === 'DeviceRGB') { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('PDFA1-b and PDFX/1-a files do not permit using mixed colour space (' . $file . ').'); - } - } - $this->writer->write('/BitsPerComponent ' . $info['bpc']); - if (isset($info['f']) && $info['f']) { - $this->writer->write('/Filter /' . $info['f']); - } - if (isset($info['parms'])) { - $this->writer->write($info['parms']); - } - if (isset($info['trns']) && \is_array($info['trns'])) { - $trns = ''; - $maskCount = \count($info['trns']); - for ($i = 0; $i < $maskCount; $i++) { - $trns .= $info['trns'][$i] . ' ' . $info['trns'][$i] . ' '; - } - $this->writer->write('/Mask [' . $trns . ']'); - } - $this->writer->write('/Length ' . \strlen($info['data']) . '>>'); - $this->writer->stream($info['data']); - unset($this->mpdf->images[$file]['data']); - $this->writer->write('endobj'); - if ($icc) { - // ICC colour profile - $this->writer->object(); - $icc = $this->mpdf->compress ? \gzcompress($info['icc']) : $info['icc']; - $this->writer->write('<>'); - $this->writer->stream($icc); - $this->writer->write('endobj'); - } elseif ($info['cs'] === 'Indexed') { - // Palette - $this->writer->object(); - $pal = $this->mpdf->compress ? \gzcompress($info['pal']) : $info['pal']; - $this->writer->write('<<' . $filter . '/Length ' . \strlen($pal) . '>>'); - $this->writer->stream($pal); - $this->writer->write('endobj'); - } - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/JavaScriptWriter.php b/dependencies/mpdf/mpdf/src/Writer/JavaScriptWriter.php deleted file mode 100644 index f276abd..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/JavaScriptWriter.php +++ /dev/null @@ -1,38 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - } - public function writeJavascript() - { - $this->writer->object(); - $this->mpdf->n_js = $this->mpdf->n; - $this->writer->write('<<'); - $this->writer->write('/Names [(EmbeddedJS) ' . (1 + $this->mpdf->n) . ' 0 R ]'); - $this->writer->write('>>'); - $this->writer->write('endobj'); - $this->writer->object(); - $this->writer->write('<<'); - $this->writer->write('/S /JavaScript'); - $this->writer->write('/JS ' . $this->writer->string($this->mpdf->js)); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/MetadataWriter.php b/dependencies/mpdf/mpdf/src/Writer/MetadataWriter.php deleted file mode 100644 index f99efc7..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/MetadataWriter.php +++ /dev/null @@ -1,699 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - $this->form = $form; - $this->protection = $protection; - $this->logger = $logger; - } - public function writeMetadata() - { - $this->writer->object(); - $this->mpdf->MetadataRoot = $this->mpdf->n; - $Producer = 'mPDF' . ($this->mpdf->exposeVersion ? ' ' . Mpdf::VERSION : ''); - $z = \date('O'); - // +0200 - $offset = \substr($z, 0, 3) . ':' . \substr($z, 3, 2); - $CreationDate = \date('Y-m-d\\TH:i:s') . $offset; - // 2006-03-10T10:47:26-05:00 2006-06-19T09:05:17Z - $uuid = \sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', \random_int(0, 0xffff), \random_int(0, 0xffff), \random_int(0, 0xffff), \random_int(0, 0xfff) | 0x4000, \random_int(0, 0x3fff) | 0x8000, \random_int(0, 0xffff), \random_int(0, 0xffff), \random_int(0, 0xffff)); - $m = '' . "\n"; - // begin = FEFF BOM - $m .= ' ' . "\n"; - $m .= ' ' . "\n"; - $m .= ' ' . "\n"; - $m .= ' ' . $Producer . '' . "\n"; - if (!empty($this->mpdf->keywords)) { - $m .= ' ' . $this->mpdf->keywords . '' . "\n"; - } - $m .= ' ' . "\n"; - $m .= ' ' . "\n"; - $m .= ' ' . $CreationDate . '' . "\n"; - $m .= ' ' . $CreationDate . '' . "\n"; - $m .= ' ' . $CreationDate . '' . "\n"; - if (!empty($this->mpdf->creator)) { - $m .= ' ' . $this->mpdf->creator . '' . "\n"; - } - $m .= ' ' . "\n"; - // DC elements - $m .= ' ' . "\n"; - $m .= ' application/pdf' . "\n"; - if (!empty($this->mpdf->title)) { - $m .= ' - - ' . $this->mpdf->title . ' - - ' . "\n"; - } - if (!empty($this->mpdf->keywords)) { - $m .= ' - - ' . $this->mpdf->keywords . ' - - ' . "\n"; - } - if (!empty($this->mpdf->subject)) { - $m .= ' - - ' . $this->mpdf->subject . ' - - ' . "\n"; - } - if (!empty($this->mpdf->author)) { - $m .= ' - - ' . $this->mpdf->author . ' - - ' . "\n"; - } - $m .= ' ' . "\n"; - if (!empty($this->mpdf->additionalXmpRdf)) { - $m .= $this->mpdf->additionalXmpRdf; - } - // This bit is specific to PDFX-1a - if ($this->mpdf->PDFX) { - $m .= ' ' . "\n"; - } elseif ($this->mpdf->PDFA) { - if (\strpos($this->mpdf->PDFAversion, '-') === \false) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('PDFA version (%s) is not valid. (Use: 1-B, 3-B, etc.)', $this->mpdf->PDFAversion)); - } - list($part, $conformance) = \explode('-', \strtoupper($this->mpdf->PDFAversion)); - $m .= ' ' . "\n"; - $m .= ' ' . $part . '' . "\n"; - $m .= ' ' . $conformance . '' . "\n"; - if ($part === '1' && $conformance === 'B') { - $m .= ' 2005' . "\n"; - } - $m .= ' ' . "\n"; - } - $m .= ' ' . "\n"; - $m .= ' uuid:' . $uuid . '' . "\n"; - $m .= ' ' . "\n"; - $m .= ' ' . "\n"; - $m .= ' ' . "\n"; - $m .= \str_repeat(\str_repeat(' ', 100) . "\n", 20); - // 2-4kB whitespace padding required - $m .= ''; - // "r" read only - $this->writer->write('<>'); - $this->writer->stream($m); - $this->writer->write('endobj'); - } - public function writeInfo() - { - $this->writer->write('/Producer ' . $this->writer->utf16BigEndianTextString('mPDF' . ($this->mpdf->exposeVersion ? ' ' . $this->getVersionString() : ''))); - if (!empty($this->mpdf->title)) { - $this->writer->write('/Title ' . $this->writer->utf16BigEndianTextString($this->mpdf->title)); - } - if (!empty($this->mpdf->subject)) { - $this->writer->write('/Subject ' . $this->writer->utf16BigEndianTextString($this->mpdf->subject)); - } - if (!empty($this->mpdf->author)) { - $this->writer->write('/Author ' . $this->writer->utf16BigEndianTextString($this->mpdf->author)); - } - if (!empty($this->mpdf->keywords)) { - $this->writer->write('/Keywords ' . $this->writer->utf16BigEndianTextString($this->mpdf->keywords)); - } - if (!empty($this->mpdf->creator)) { - $this->writer->write('/Creator ' . $this->writer->utf16BigEndianTextString($this->mpdf->creator)); - } - foreach ($this->mpdf->customProperties as $key => $value) { - $this->writer->write('/' . $key . ' ' . $this->writer->utf16BigEndianTextString($value)); - } - $now = PdfDate::format(\time()); - $this->writer->write('/CreationDate ' . $this->writer->string('D:' . $now)); - $this->writer->write('/ModDate ' . $this->writer->string('D:' . $now)); - if ($this->mpdf->PDFX) { - $this->writer->write('/Trapped/False'); - $this->writer->write('/GTS_PDFXVersion(PDF/X-1a:2003)'); - } - } - public function writeOutputIntent() - { - $this->writer->object(); - $this->mpdf->OutputIntentRoot = $this->mpdf->n; - $this->writer->write('<mpdf->ICCProfile, '.icc')); - if ($this->mpdf->PDFA) { - $this->writer->write('/S /GTS_PDFA1'); - if ($this->mpdf->ICCProfile) { - $this->writer->write('/Info (' . $ICCProfile . ')'); - $this->writer->write('/OutputConditionIdentifier (Custom)'); - $this->writer->write('/OutputCondition ()'); - } else { - $this->writer->write('/Info (sRGB IEC61966-2.1)'); - $this->writer->write('/OutputConditionIdentifier (sRGB IEC61966-2.1)'); - $this->writer->write('/OutputCondition ()'); - } - $this->writer->write('/DestOutputProfile ' . ($this->mpdf->n + 1) . ' 0 R'); - } elseif ($this->mpdf->PDFX) { - // always a CMYK profile - $this->writer->write('/S /GTS_PDFX'); - if ($this->mpdf->ICCProfile) { - $this->writer->write('/Info (' . $ICCProfile . ')'); - $this->writer->write('/OutputConditionIdentifier (Custom)'); - $this->writer->write('/OutputCondition ()'); - $this->writer->write('/DestOutputProfile ' . ($this->mpdf->n + 1) . ' 0 R'); - } else { - $this->writer->write('/Info (CGATS TR 001)'); - $this->writer->write('/OutputConditionIdentifier (CGATS TR 001)'); - $this->writer->write('/OutputCondition (CGATS TR 001 (SWOP))'); - $this->writer->write('/RegistryName (http://www.color.org)'); - } - } - $this->writer->write('>>'); - $this->writer->write('endobj'); - if ($this->mpdf->PDFX && !$this->mpdf->ICCProfile) { - return; - } - $this->writer->object(); - if ($this->mpdf->ICCProfile) { - if (!\file_exists($this->mpdf->ICCProfile)) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Unable to find ICC profile "%s"', $this->mpdf->ICCProfile)); - } - $s = \file_get_contents($this->mpdf->ICCProfile); - } else { - $s = \file_get_contents(__DIR__ . '/../../data/iccprofiles/sRGB_IEC61966-2-1.icc'); - } - if ($this->mpdf->compress) { - $s = \gzcompress($s); - } - $this->writer->write('<<'); - if ($this->mpdf->PDFX || $this->mpdf->PDFA && $this->mpdf->restrictColorSpace === 3) { - $this->writer->write('/N 4'); - } else { - $this->writer->write('/N 3'); - } - if ($this->mpdf->compress) { - $this->writer->write('/Filter /FlateDecode '); - } - $this->writer->write('/Length ' . \strlen($s) . '>>'); - $this->writer->stream($s); - $this->writer->write('endobj'); - } - public function writeAssociatedFiles() - { - if (!\function_exists('gzcompress')) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('ext-zlib is required for compression of associated files'); - } - // for each file, we create the spec object + the stream object - foreach ($this->mpdf->associatedFiles as $k => $file) { - // spec - $this->writer->object(); - $this->mpdf->associatedFiles[$k]['_root'] = $this->mpdf->n; - // we store the root ref of object for future reference (e.g. /EmbeddedFiles catalog) - $this->writer->write('<writer->string($file['name'])); - if ($file['description']) { - $this->writer->write('/Desc ' . $this->writer->string($file['description'])); - } - $this->writer->write('/Type /Filespec'); - $this->writer->write('/EF <<'); - $this->writer->write('/F ' . ($this->mpdf->n + 1) . ' 0 R'); - $this->writer->write('/UF ' . ($this->mpdf->n + 1) . ' 0 R'); - $this->writer->write('>>'); - if ($file['AFRelationship']) { - $this->writer->write('/AFRelationship /' . $file['AFRelationship']); - } - $this->writer->write('/UF ' . $this->writer->string($file['name'])); - $this->writer->write('>>'); - $this->writer->write('endobj'); - $fileContent = null; - if (isset($file['path'])) { - $fileContent = @\file_get_contents($file['path']); - } elseif (isset($file['content'])) { - $fileContent = $file['content']; - } - if (!$fileContent) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException(\sprintf('Cannot access associated file - %s', $file['path'])); - } - $filestream = \gzcompress($fileContent); - $this->writer->object(); - $this->writer->write('<writer->write('/Subtype /' . $this->writer->escapeSlashes($file['mime'])); - } - $this->writer->write('/Length ' . \strlen($filestream)); - $this->writer->write('/Filter /FlateDecode'); - if (isset($file['path'])) { - $this->writer->write('/Params <writer->string('D:' . PdfDate::format(\filemtime($file['path']))) . ' >>'); - } else { - $this->writer->write('/Params <writer->string('D:' . PdfDate::format(\time())) . ' >>'); - } - $this->writer->write('>>'); - $this->writer->stream($filestream); - $this->writer->write('endobj'); - } - // AF array - $this->writer->object(); - $refs = []; - foreach ($this->mpdf->associatedFiles as $file) { - $refs[] = '' . $file['_root'] . ' 0 R'; - } - $this->writer->write('[' . \implode(' ', $refs) . ']'); - $this->writer->write('endobj'); - $this->mpdf->associatedFilesRoot = $this->mpdf->n; - } - public function writeCatalog() - { - $this->writer->write('/Type /Catalog'); - $this->writer->write('/Pages 1 0 R'); - if (\is_string($this->mpdf->currentLang)) { - $this->writer->write(\sprintf('/Lang (%s)', $this->mpdf->currentLang)); - } elseif (\is_string($this->mpdf->default_lang)) { - $this->writer->write(\sprintf('/Lang (%s)', $this->mpdf->default_lang)); - } - if ($this->mpdf->ZoomMode === 'fullpage') { - $this->writer->write('/OpenAction [3 0 R /Fit]'); - } elseif ($this->mpdf->ZoomMode === 'fullwidth') { - $this->writer->write('/OpenAction [3 0 R /FitH null]'); - } elseif ($this->mpdf->ZoomMode === 'real') { - $this->writer->write('/OpenAction [3 0 R /XYZ null null 1]'); - } elseif (!\is_string($this->mpdf->ZoomMode)) { - $this->writer->write('/OpenAction [3 0 R /XYZ null null ' . $this->mpdf->ZoomMode / 100 . ']'); - } elseif ($this->mpdf->ZoomMode === 'none') { - // do not write any zoom mode / OpenAction - } else { - $this->writer->write('/OpenAction [3 0 R /XYZ null null null]'); - } - if ($this->mpdf->LayoutMode === 'single') { - $this->writer->write('/PageLayout /SinglePage'); - } elseif ($this->mpdf->LayoutMode === 'continuous') { - $this->writer->write('/PageLayout /OneColumn'); - } elseif ($this->mpdf->LayoutMode === 'twoleft') { - $this->writer->write('/PageLayout /TwoColumnLeft'); - } elseif ($this->mpdf->LayoutMode === 'tworight') { - $this->writer->write('/PageLayout /TwoColumnRight'); - } elseif ($this->mpdf->LayoutMode === 'two') { - if ($this->mpdf->mirrorMargins) { - $this->writer->write('/PageLayout /TwoColumnRight'); - } else { - $this->writer->write('/PageLayout /TwoColumnLeft'); - } - } - // Bookmarks - if (\count($this->mpdf->BMoutlines) > 0) { - $this->writer->write('/Outlines ' . $this->mpdf->OutlineRoot . ' 0 R'); - $this->writer->write('/PageMode /UseOutlines'); - } - // Fullscreen - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'FullScreen'))) { - $this->writer->write('/PageMode /FullScreen'); - } - // Metadata - if ($this->mpdf->PDFA || $this->mpdf->PDFX) { - $this->writer->write('/Metadata ' . $this->mpdf->MetadataRoot . ' 0 R'); - } - // OutputIntents - if ($this->mpdf->PDFA || $this->mpdf->PDFX || $this->mpdf->ICCProfile) { - $this->writer->write('/OutputIntents [' . $this->mpdf->OutputIntentRoot . ' 0 R]'); - } - // Associated files - if ($this->mpdf->associatedFilesRoot) { - $this->writer->write('/AF ' . $this->mpdf->associatedFilesRoot . ' 0 R'); - $names = []; - foreach ($this->mpdf->associatedFiles as $file) { - $names[] = $this->writer->string($file['name']) . ' ' . $file['_root'] . ' 0 R'; - } - $this->writer->write('/Names << /EmbeddedFiles << /Names [' . \implode(' ', $names) . '] >> >>'); - } - // Forms - if (\count($this->form->forms) > 0) { - $this->form->_putFormsCatalog(); - } - if ($this->mpdf->js !== null) { - $this->writer->write('/Names << /JavaScript ' . $this->mpdf->n_js . ' 0 R >> '); - } - if ($this->mpdf->DisplayPreferences || $this->mpdf->directionality === 'rtl' || $this->mpdf->mirrorMargins) { - $this->writer->write('/ViewerPreferences<<'); - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'HideMenubar'))) { - $this->writer->write('/HideMenubar true'); - } - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'HideToolbar'))) { - $this->writer->write('/HideToolbar true'); - } - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'HideWindowUI'))) { - $this->writer->write('/HideWindowUI true'); - } - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'DisplayDocTitle'))) { - $this->writer->write('/DisplayDocTitle true'); - } - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'CenterWindow'))) { - $this->writer->write('/CenterWindow true'); - } - if (\is_int(\strpos($this->mpdf->DisplayPreferences, 'FitWindow'))) { - $this->writer->write('/FitWindow true'); - } - // PrintScaling is PDF 1.6 spec. - if (!$this->mpdf->PDFA && !$this->mpdf->PDFX && \is_int(\strpos($this->mpdf->DisplayPreferences, 'NoPrintScaling'))) { - $this->writer->write('/PrintScaling /None'); - } - if ($this->mpdf->directionality === 'rtl') { - $this->writer->write('/Direction /R2L'); - } - // Duplex is PDF 1.7 spec. - if ($this->mpdf->mirrorMargins && !$this->mpdf->PDFA && !$this->mpdf->PDFX) { - // if ($this->mpdf->DefOrientation=='P') $this->writer->write('/Duplex /DuplexFlipShortEdge'); - $this->writer->write('/Duplex /DuplexFlipLongEdge'); - // PDF v1.7+ - } - $this->writer->write('>>'); - } - if ($this->mpdf->open_layer_pane && ($this->mpdf->hasOC || \count($this->mpdf->layers))) { - $this->writer->write('/PageMode /UseOC'); - } - if ($this->mpdf->hasOC || \count($this->mpdf->layers)) { - $p = $v = $h = $l = $loff = $lall = $as = ''; - if ($this->mpdf->hasOC) { - if (($this->mpdf->hasOC & 1) === 1) { - $p = $this->mpdf->n_ocg_print . ' 0 R'; - } - if (($this->mpdf->hasOC & 2) === 2) { - $v = $this->mpdf->n_ocg_view . ' 0 R'; - } - if (($this->mpdf->hasOC & 4) === 4) { - $h = $this->mpdf->n_ocg_hidden . ' 0 R'; - } - $as = "<> <>"; - } - if (\count($this->mpdf->layers)) { - foreach ($this->mpdf->layers as $k => $layer) { - if (isset($this->mpdf->layerDetails[$k]) && \strtolower($this->mpdf->layerDetails[$k]['state']) === 'hidden') { - $loff .= $layer['n'] . ' 0 R '; - } else { - $l .= $layer['n'] . ' 0 R '; - } - $lall .= $layer['n'] . ' 0 R '; - } - } - $this->writer->write("/OCProperties <writer->write("/Order [{$v} {$p} {$h} {$lall}] "); - if ($as) { - $this->writer->write("/AS [{$as}] "); - } - $this->writer->write('>>>>'); - } - } - /** - * @since 5.7.2 - */ - public function writeAnnotations() - { - $nb = $this->mpdf->page; - for ($n = 1; $n <= $nb; $n++) { - if (isset($this->mpdf->PageLinks[$n]) || isset($this->mpdf->PageAnnots[$n]) || \count($this->form->forms) > 0) { - $wPt = $this->mpdf->pageDim[$n]['w'] * Mpdf::SCALE; - $hPt = $this->mpdf->pageDim[$n]['h'] * Mpdf::SCALE; - // Links - if (isset($this->mpdf->PageLinks[$n])) { - foreach ($this->mpdf->PageLinks[$n] as $key => $pl) { - $this->writer->object(); - $annot = ''; - $rect = \sprintf('%.3F %.3F %.3F %.3F', $pl[0], $pl[1], $pl[0] + $pl[2], $pl[1] - $pl[3]); - $annot .= '<writer->utf16BigEndianTextString($pl[4]); - $annot .= ' /NM ' . $this->writer->string(\sprintf('%04u-%04u', $n, $key)); - $annot .= ' /M ' . $this->writer->string('D:' . \date('YmdHis')); - $annot .= ' /Border [0 0 0]'; - // Use this (instead of /Border) to specify border around link - // $annot .= ' /BS <mpdf->PDFA || $this->mpdf->PDFX) { - $annot .= ' /F 28'; - } - if (\strpos($pl[4], '@') === 0) { - $p = \substr($pl[4], 1); - // $h=isset($this->mpdf->OrientationChanges[$p]) ? $wPt : $hPt; - $htarg = $this->mpdf->pageDim[$p]['h'] * Mpdf::SCALE; - $annot .= \sprintf(' /Dest [%d 0 R /XYZ 0 %.3F null]>>', 1 + 2 * $p, $htarg); - } elseif (\is_string($pl[4])) { - $annot .= ' /A <writer->string($pl[4]) . '>> >>'; - } else { - $l = $this->mpdf->links[$pl[4]]; - // may not be set if #link points to non-existent target - if (isset($this->mpdf->pageDim[$l[0]]['h'])) { - $htarg = $this->mpdf->pageDim[$l[0]]['h'] * Mpdf::SCALE; - } else { - $htarg = $this->mpdf->h * Mpdf::SCALE; - } - // doesn't really matter - $annot .= \sprintf(' /Dest [%d 0 R /XYZ 0 %.3F null]>>', 1 + 2 * $l[0], $htarg - $l[1] * Mpdf::SCALE); - } - $this->writer->write($annot); - $this->writer->write('endobj'); - } - } - /* -- ANNOTATIONS -- */ - if (isset($this->mpdf->PageAnnots[$n])) { - foreach ($this->mpdf->PageAnnots[$n] as $key => $pl) { - $fileAttachment = (bool) $pl['opt']['file']; - if ($fileAttachment && !$this->mpdf->allowAnnotationFiles) { - $this->logger->warning('Embedded files for annotations have to be allowed explicitly with "allowAnnotationFiles" config key'); - $fileAttachment = \false; - } - $this->writer->object(); - $annot = ''; - $pl['opt'] = \array_change_key_case($pl['opt'], \CASE_LOWER); - $x = $pl['x']; - if ($this->mpdf->annotMargin != 0 || $x == 0 || $x < 0) { - // Odd page, intentional non-strict comparison - $x = $wPt / Mpdf::SCALE - $this->mpdf->annotMargin; - } - $w = $h = 0; - $a = $x * Mpdf::SCALE; - $b = $hPt - $pl['y'] * Mpdf::SCALE; - $annot .= '<mpdf->n + 1) . ' 0 R>>'; - $annot .= '>>'; - } else { - $annot .= '/Subtype /Text'; - $w = 20; - $h = 20; - // mPDF 6 - } - $rect = \sprintf('%.3F %.3F %.3F %.3F', $a, $b - $h, $a + $w, $b); - $annot .= ' /Rect [' . $rect . ']'; - // contents = description of file in free text - $annot .= ' /Contents ' . $this->writer->utf16BigEndianTextString($pl['txt']); - $annot .= ' /NM ' . $this->writer->string(\sprintf('%04u-%04u', $n, 2000 + $key)); - $annot .= ' /M ' . $this->writer->string('D:' . \date('YmdHis')); - $annot .= ' /CreationDate ' . $this->writer->string('D:' . \date('YmdHis')); - $annot .= ' /Border [0 0 0]'; - if ($this->mpdf->PDFA || $this->mpdf->PDFX) { - $annot .= ' /F 28'; - $annot .= ' /CA 1'; - } elseif ($pl['opt']['ca'] > 0) { - $annot .= ' /CA ' . $pl['opt']['ca']; - } - $annotcolor = ' /C ['; - if (isset($pl['opt']['c']) && $pl['opt']['c']) { - $col = $pl['opt']['c']; - if ($col[0] == 3 || $col[0] == 5) { - $annotcolor .= \sprintf('%.3F %.3F %.3F', \ord($col[1]) / 255, \ord($col[2]) / 255, \ord($col[3]) / 255); - } elseif ($col[0] == 1) { - $annotcolor .= \sprintf('%.3F', \ord($col[1]) / 255); - } elseif ($col[0] == 4 || $col[0] == 6) { - $annotcolor .= \sprintf('%.3F %.3F %.3F %.3F', \ord($col[1]) / 100, \ord($col[2]) / 100, \ord($col[3]) / 100, \ord($col[4]) / 100); - } else { - $annotcolor .= '1 1 0'; - } - } else { - $annotcolor .= '1 1 0'; - } - $annotcolor .= ']'; - $annot .= $annotcolor; - // Usually Author - // Use as Title for fileattachment - if (isset($pl['opt']['t']) && \is_string($pl['opt']['t'])) { - $annot .= ' /T ' . $this->writer->utf16BigEndianTextString($pl['opt']['t']); - } - if ($fileAttachment) { - $iconsapp = ['Paperclip', 'Graph', 'PushPin', 'Tag']; - } else { - $iconsapp = ['Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph']; - } - if (isset($pl['opt']['icon']) && \in_array($pl['opt']['icon'], $iconsapp)) { - $annot .= ' /Name /' . $pl['opt']['icon']; - } elseif ($fileAttachment) { - $annot .= ' /Name /PushPin'; - } else { - $annot .= ' /Name /Note'; - } - if (!$fileAttachment) { - // Subj is PDF 1.5 spec. - if (!$this->mpdf->PDFA && !$this->mpdf->PDFX && isset($pl['opt']['subj'])) { - $annot .= ' /Subj ' . $this->writer->utf16BigEndianTextString($pl['opt']['subj']); - } - if (!empty($pl['opt']['popup'])) { - $annot .= ' /Open true'; - $annot .= ' /Popup ' . ($this->mpdf->n + 1) . ' 0 R'; - } else { - $annot .= ' /Open false'; - } - } - $annot .= ' /P ' . $pl['pageobj'] . ' 0 R'; - $annot .= '>>'; - $this->writer->write($annot); - $this->writer->write('endobj'); - if ($fileAttachment) { - $file = @\file_get_contents($pl['opt']['file']); - if (!$file) { - throw new \WP_Ultimo\Dependencies\Mpdf\MpdfException('mPDF Error: Cannot access file attachment - ' . $pl['opt']['file']); - } - $filestream = \gzcompress($file); - $this->writer->object(); - $this->writer->write('<writer->write('/Length ' . \strlen($filestream)); - $this->writer->write('/Filter /FlateDecode'); - $this->writer->write('>>'); - $this->writer->stream($filestream); - $this->writer->write('endobj'); - } elseif (!empty($pl['opt']['popup'])) { - $this->writer->object(); - $annot = ''; - if (\is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][0])) { - $x = $pl['opt']['popup'][0] * Mpdf::SCALE; - } else { - $x = $pl['x'] * Mpdf::SCALE; - } - if (\is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][1])) { - $y = $hPt - $pl['opt']['popup'][1] * Mpdf::SCALE; - } else { - $y = $hPt - $pl['y'] * Mpdf::SCALE; - } - if (\is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][2])) { - $w = $pl['opt']['popup'][2] * Mpdf::SCALE; - } else { - $w = 180; - } - if (\is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][3])) { - $h = $pl['opt']['popup'][3] * Mpdf::SCALE; - } else { - $h = 120; - } - $rect = \sprintf('%.3F %.3F %.3F %.3F', $x, $y - $h, $x + $w, $y); - $annot .= '<writer->string('D:' . \date('YmdHis')); - if ($this->mpdf->PDFA || $this->mpdf->PDFX) { - $annot .= ' /F 28'; - } - $annot .= ' /Parent ' . ($this->mpdf->n - 1) . ' 0 R'; - $annot .= '>>'; - $this->writer->write($annot); - $this->writer->write('endobj'); - } - } - } - // Active Forms - if (\count($this->form->forms) > 0) { - $this->form->_putFormItems($n, $hPt); - } - } - } - // Active Forms - Radio Button Group entries - // Output Radio Button Group form entries (radio_on_obj_id already determined) - if (\count($this->form->form_radio_groups)) { - $this->form->_putRadioItems($n); - } - } - public function writeEncryption() - { - $this->writer->write('/Filter /Standard'); - if ($this->protection->getUseRC128Encryption()) { - $this->writer->write('/V 2'); - $this->writer->write('/R 3'); - $this->writer->write('/Length 128'); - } else { - $this->writer->write('/V 1'); - $this->writer->write('/R 2'); - } - $this->writer->write('/O (' . $this->writer->escape($this->protection->getOValue()) . ')'); - $this->writer->write('/U (' . $this->writer->escape($this->protection->getUValue()) . ')'); - $this->writer->write('/P ' . $this->protection->getPValue()); - } - public function writeTrailer() - { - $this->writer->write('/Size ' . ($this->mpdf->n + 1)); - $this->writer->write('/Root ' . $this->mpdf->n . ' 0 R'); - $this->writer->write('/Info ' . $this->mpdf->InfoRoot . ' 0 R'); - if ($this->mpdf->encrypted) { - $this->writer->write('/Encrypt ' . $this->mpdf->enc_obj_id . ' 0 R'); - $this->writer->write('/ID [<' . $this->protection->getUniqid() . '> <' . $this->protection->getUniqid() . '>]'); - } else { - $uniqid = \md5(\time() . $this->mpdf->buffer); - $this->writer->write('/ID [<' . $uniqid . '> <' . $uniqid . '>]'); - } - } - private function getVersionString() - { - $return = Mpdf::VERSION; - $headFile = __DIR__ . '/../../.git/HEAD'; - if (\file_exists($headFile)) { - $ref = \file($headFile); - $path = \explode('/', $ref[0], 3); - $branch = isset($path[2]) ? \trim($path[2]) : ''; - $revFile = __DIR__ . '/../../.git/refs/heads/' . $branch; - if ($branch && \file_exists($revFile)) { - $rev = \file($revFile); - $rev = \substr($rev[0], 0, 7); - $return .= ' (' . $rev . ')'; - } - } - return $return; - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/ObjectWriter.php b/dependencies/mpdf/mpdf/src/Writer/ObjectWriter.php deleted file mode 100644 index 9f0e657..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/ObjectWriter.php +++ /dev/null @@ -1,48 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - } - public function writeImportedObjects() - { - if (\is_array($this->mpdf->parsers) && \count($this->mpdf->parsers) > 0) { - foreach ($this->mpdf->parsers as $filename => $p) { - $this->mpdf->current_parser = $this->mpdf->parsers[$filename]; - if (\is_array($this->mpdf->_obj_stack[$filename])) { - while ($n = \key($this->mpdf->_obj_stack[$filename])) { - $nObj = $this->mpdf->current_parser->resolveObject($this->mpdf->_obj_stack[$filename][$n][1]); - $this->writer->object($this->mpdf->_obj_stack[$filename][$n][0]); - if ($nObj[0] == pdf_parser::TYPE_STREAM) { - $this->mpdf->pdf_write_value($nObj); - } else { - $this->mpdf->pdf_write_value($nObj[1]); - } - $this->writer->write('endobj'); - $this->mpdf->_obj_stack[$filename][$n] = null; - // free memory - unset($this->mpdf->_obj_stack[$filename][$n]); - \reset($this->mpdf->_obj_stack[$filename]); - } - } - } - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/OptionalContentWriter.php b/dependencies/mpdf/mpdf/src/Writer/OptionalContentWriter.php deleted file mode 100644 index ae0b3bc..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/OptionalContentWriter.php +++ /dev/null @@ -1,57 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - } - public function writeOptionalContentGroups() - { - if ($this->mpdf->hasOC) { - $this->writer->object(); - $this->mpdf->n_ocg_print = $this->mpdf->n; - $this->writer->write('<writer->string('Print only')); - $this->writer->write('/Usage <> /View <>>>>>'); - $this->writer->write('endobj'); - $this->writer->object(); - $this->mpdf->n_ocg_view = $this->mpdf->n; - $this->writer->write('<writer->string('Screen only')); - $this->writer->write('/Usage <> /View <>>>>>'); - $this->writer->write('endobj'); - $this->writer->object(); - $this->mpdf->n_ocg_hidden = $this->mpdf->n; - $this->writer->write('<writer->string('Hidden')); - $this->writer->write('/Usage <> /View <>>>>>'); - $this->writer->write('endobj'); - } - if (\count($this->mpdf->layers)) { - \ksort($this->mpdf->layers); - foreach ($this->mpdf->layers as $id => $layer) { - $this->writer->object(); - $this->mpdf->layers[$id]['n'] = $this->mpdf->n; - if (isset($this->mpdf->layerDetails[$id]['name']) && $this->mpdf->layerDetails[$id]['name']) { - $name = $this->mpdf->layerDetails[$id]['name']; - } else { - $name = $layer['name']; - } - $this->writer->write('<writer->utf16BigEndianTextString($name) . '>>'); - $this->writer->write('endobj'); - } - } - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/PageWriter.php b/dependencies/mpdf/mpdf/src/Writer/PageWriter.php deleted file mode 100644 index 8537d58..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/PageWriter.php +++ /dev/null @@ -1,238 +0,0 @@ -mpdf = $mpdf; - $this->form = $form; - $this->writer = $writer; - $this->metadataWriter = $metadataWriter; - } - public function writePages() - { - $nb = $this->mpdf->page; - $filter = $this->mpdf->compress ? '/Filter /FlateDecode ' : ''; - if ($this->mpdf->DefOrientation === 'P') { - $defwPt = $this->mpdf->fwPt; - $defhPt = $this->mpdf->fhPt; - } else { - $defwPt = $this->mpdf->fhPt; - $defhPt = $this->mpdf->fwPt; - } - $annotid = 3 + 2 * $nb; - // Active Forms - $totaladdnum = 0; - for ($n = 1; $n <= $nb; $n++) { - if (isset($this->mpdf->PageLinks[$n])) { - $totaladdnum += \count($this->mpdf->PageLinks[$n]); - } - /* -- ANNOTATIONS -- */ - if (isset($this->mpdf->PageAnnots[$n])) { - foreach ($this->mpdf->PageAnnots[$n] as $k => $pl) { - if (!empty($pl['opt']['popup']) || !empty($pl['opt']['file'])) { - $totaladdnum += 2; - } else { - $totaladdnum++; - } - } - } - /* -- END ANNOTATIONS -- */ - /* -- FORMS -- */ - if (\count($this->form->forms) > 0) { - $this->form->countPageForms($n, $totaladdnum); - } - /* -- END FORMS -- */ - } - /* -- FORMS -- */ - // Make a note in the radio button group of the obj_id it will have - $ctr = 0; - if (\count($this->form->form_radio_groups)) { - foreach ($this->form->form_radio_groups as $name => $frg) { - $this->form->form_radio_groups[$name]['obj_id'] = $annotid + $totaladdnum + $ctr; - $ctr++; - } - } - /* -- END FORMS -- */ - // Select unused fonts (usually default font) - $unused = []; - foreach ($this->mpdf->fonts as $fk => $font) { - if (isset($font['type']) && $font['type'] === 'TTF' && !$font['used']) { - $unused[] = $fk; - } - } - for ($n = 1; $n <= $nb; $n++) { - $thispage = $this->mpdf->pages[$n]; - if (isset($this->mpdf->OrientationChanges[$n])) { - $hPt = $this->mpdf->pageDim[$n]['w'] * Mpdf::SCALE; - $wPt = $this->mpdf->pageDim[$n]['h'] * Mpdf::SCALE; - $owidthPt_LR = $this->mpdf->pageDim[$n]['outer_width_TB'] * Mpdf::SCALE; - $owidthPt_TB = $this->mpdf->pageDim[$n]['outer_width_LR'] * Mpdf::SCALE; - } else { - $wPt = $this->mpdf->pageDim[$n]['w'] * Mpdf::SCALE; - $hPt = $this->mpdf->pageDim[$n]['h'] * Mpdf::SCALE; - $owidthPt_LR = $this->mpdf->pageDim[$n]['outer_width_LR'] * Mpdf::SCALE; - $owidthPt_TB = $this->mpdf->pageDim[$n]['outer_width_TB'] * Mpdf::SCALE; - } - // Remove references to unused fonts (usually default font) - foreach ($unused as $fk) { - if ($this->mpdf->fonts[$fk]['sip'] || $this->mpdf->fonts[$fk]['smp']) { - foreach ($this->mpdf->fonts[$fk]['subsetfontids'] as $k => $fid) { - $thispage = \preg_replace('/\\s\\/F' . $fid . ' \\d[\\d.]* Tf\\s/is', ' ', $thispage); - } - } else { - $thispage = \preg_replace('/\\s\\/F' . $this->mpdf->fonts[$fk]['i'] . ' \\d[\\d.]* Tf\\s/is', ' ', $thispage); - } - } - // Clean up repeated /GS1 gs statements - // For some reason using + for repetition instead of {2,20} crashes PHP Script Interpreter ??? - $thispage = \preg_replace('/(\\/GS1 gs\\n){2,20}/', "/GS1 gs\n", $thispage); - $thispage = \preg_replace('/(\\s*___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . '\\s*)/', ' ', $thispage); - $thispage = \preg_replace('/(\\s*___HEADER___MARKER' . $this->mpdf->uniqstr . '\\s*)/', ' ', $thispage); - $thispage = \preg_replace('/(\\s*___PAGE___START' . $this->mpdf->uniqstr . '\\s*)/', ' ', $thispage); - $thispage = \preg_replace('/(\\s*___TABLE___BACKGROUNDS' . $this->mpdf->uniqstr . '\\s*)/', ' ', $thispage); - // mPDF 5.7.3 TRANSFORMS - while (\preg_match('/(\\% BTR(.*?)\\% ETR)/is', $thispage, $m)) { - $thispage = \preg_replace('/(\\% BTR.*?\\% ETR)/is', '', $thispage, 1) . "\n" . $m[2]; - } - // Page - $this->writer->object(); - $this->writer->write('<writer->write('/Parent 1 0 R'); - if (isset($this->mpdf->OrientationChanges[$n])) { - $this->writer->write(\sprintf('/MediaBox [0 0 %.3F %.3F]', $hPt, $wPt)); - // If BleedBox is defined, it must be larger than the TrimBox, but smaller than the MediaBox - $bleedMargin = $this->mpdf->pageDim[$n]['bleedMargin'] * Mpdf::SCALE; - if ($bleedMargin && ($owidthPt_TB || $owidthPt_LR)) { - $x0 = $owidthPt_TB - $bleedMargin; - $y0 = $owidthPt_LR - $bleedMargin; - $x1 = $hPt - $owidthPt_TB + $bleedMargin; - $y1 = $wPt - $owidthPt_LR + $bleedMargin; - $this->writer->write(\sprintf('/BleedBox [%.3F %.3F %.3F %.3F]', $x0, $y0, $x1, $y1)); - } - $this->writer->write(\sprintf('/TrimBox [%.3F %.3F %.3F %.3F]', $owidthPt_TB, $owidthPt_LR, $hPt - $owidthPt_TB, $wPt - $owidthPt_LR)); - if ($this->mpdf->displayDefaultOrientation) { - if ($this->mpdf->DefOrientation === 'P') { - $this->writer->write('/Rotate 270'); - } else { - $this->writer->write('/Rotate 90'); - } - } - } else { - // elseif($wPt != $defwPt || $hPt != $defhPt) { - $this->writer->write(\sprintf('/MediaBox [0 0 %.3F %.3F]', $wPt, $hPt)); - $bleedMargin = $this->mpdf->pageDim[$n]['bleedMargin'] * Mpdf::SCALE; - if ($bleedMargin && ($owidthPt_TB || $owidthPt_LR)) { - $x0 = $owidthPt_LR - $bleedMargin; - $y0 = $owidthPt_TB - $bleedMargin; - $x1 = $wPt - $owidthPt_LR + $bleedMargin; - $y1 = $hPt - $owidthPt_TB + $bleedMargin; - $this->writer->write(\sprintf('/BleedBox [%.3F %.3F %.3F %.3F]', $x0, $y0, $x1, $y1)); - } - $this->writer->write(\sprintf('/TrimBox [%.3F %.3F %.3F %.3F]', $owidthPt_LR, $owidthPt_TB, $wPt - $owidthPt_LR, $hPt - $owidthPt_TB)); - } - $this->writer->write('/Resources 2 0 R'); - // Important to keep in RGB colorSpace when using transparency - if (!$this->mpdf->PDFA && !$this->mpdf->PDFX) { - if ($this->mpdf->restrictColorSpace === 3) { - $this->writer->write('/Group << /Type /Group /S /Transparency /CS /DeviceCMYK >> '); - } elseif ($this->mpdf->restrictColorSpace === 1) { - $this->writer->write('/Group << /Type /Group /S /Transparency /CS /DeviceGray >> '); - } else { - $this->writer->write('/Group << /Type /Group /S /Transparency /CS /DeviceRGB >> '); - } - } - $annotsnum = 0; - $embeddedfiles = []; - // mPDF 5.7.2 /EmbeddedFiles - if (isset($this->mpdf->PageLinks[$n])) { - $annotsnum += \count($this->mpdf->PageLinks[$n]); - } - if (isset($this->mpdf->PageAnnots[$n])) { - foreach ($this->mpdf->PageAnnots[$n] as $k => $pl) { - if (!empty($pl['opt']['file'])) { - $embeddedfiles[$annotsnum + 1] = \true; - } - // mPDF 5.7.2 /EmbeddedFiles - if (!empty($pl['opt']['popup']) || !empty($pl['opt']['file'])) { - $annotsnum += 2; - } else { - $annotsnum++; - } - $this->mpdf->PageAnnots[$n][$k]['pageobj'] = $this->mpdf->n; - } - } - // Active Forms - $formsnum = 0; - if (\count($this->form->forms) > 0) { - foreach ($this->form->forms as $val) { - if ($val['page'] == $n) { - $formsnum++; - } - } - } - if ($annotsnum || $formsnum) { - $s = '/Annots [ '; - for ($i = 0; $i < $annotsnum; $i++) { - if (!isset($embeddedfiles[$i])) { - $s .= $annotid + $i . ' 0 R '; - } - // mPDF 5.7.2 /EmbeddedFiles - } - $annotid += $annotsnum; - /* -- FORMS -- */ - if (\count($this->form->forms) > 0) { - $this->form->addFormIds($n, $s, $annotid); - } - /* -- END FORMS -- */ - $s .= '] '; - $this->writer->write($s); - } - $this->writer->write('/Contents ' . ($this->mpdf->n + 1) . ' 0 R>>'); - $this->writer->write('endobj'); - // Page content - $this->writer->object(); - $p = $this->mpdf->compress ? \gzcompress($thispage) : $thispage; - $this->writer->write('<<' . $filter . '/Length ' . \strlen($p) . '>>'); - $this->writer->stream($p); - $this->writer->write('endobj'); - } - $this->metadataWriter->writeAnnotations(); - // mPDF 5.7.2 - // Pages root - $this->mpdf->offsets[1] = \strlen($this->mpdf->buffer); - $this->writer->write('1 0 obj'); - $this->writer->write('<writer->write($kids . ']'); - $this->writer->write('/Count ' . $nb); - $this->writer->write(\sprintf('/MediaBox [0 0 %.3F %.3F]', $defwPt, $defhPt)); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } -} diff --git a/dependencies/mpdf/mpdf/src/Writer/ResourceWriter.php b/dependencies/mpdf/mpdf/src/Writer/ResourceWriter.php deleted file mode 100644 index 129c78e..0000000 --- a/dependencies/mpdf/mpdf/src/Writer/ResourceWriter.php +++ /dev/null @@ -1,193 +0,0 @@ -mpdf = $mpdf; - $this->writer = $writer; - $this->colorWriter = $colorWriter; - $this->fontWriter = $fontWriter; - $this->imageWriter = $imageWriter; - $this->formWriter = $formWriter; - $this->optionalContentWriter = $optionalContentWriter; - $this->backgroundWriter = $backgroundWriter; - $this->bookmarkWriter = $bookmarkWriter; - $this->metadataWriter = $metadataWriter; - $this->javaScriptWriter = $javaScriptWriter; - $this->logger = $logger; - } - public function writeResources() - { - if ($this->mpdf->hasOC || \count($this->mpdf->layers)) { - $this->optionalContentWriter->writeOptionalContentGroups(); - } - $this->mpdf->_putextgstates(); - $this->colorWriter->writeSpotColors(); - // @log Compiling Fonts - $this->fontWriter->writeFonts(); - // @log Compiling Images - $this->imageWriter->writeImages(); - $this->formWriter->writeFormObjects(); - $this->mpdf->writeImportedPagesAndResolvedObjects(); - $this->backgroundWriter->writeShaders(); - $this->backgroundWriter->writePatterns(); - // Resource dictionary - $this->mpdf->offsets[2] = \strlen($this->mpdf->buffer); - $this->writer->write('2 0 obj'); - $this->writer->write('<writer->write('/Font <<'); - foreach ($this->mpdf->fonts as $font) { - if (isset($font['type']) && $font['type'] === 'TTF' && !$font['used']) { - continue; - } - if (isset($font['type']) && $font['type'] === 'TTF' && ($font['sip'] || $font['smp'])) { - foreach ($font['n'] as $k => $fid) { - $this->writer->write('/F' . $font['subsetfontids'][$k] . ' ' . $font['n'][$k] . ' 0 R'); - } - } else { - $this->writer->write('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R'); - } - } - $this->writer->write('>>'); - if (\count($this->mpdf->spotColors)) { - $this->writer->write('/ColorSpace <<'); - foreach ($this->mpdf->spotColors as $color) { - $this->writer->write('/CS' . $color['i'] . ' ' . $color['n'] . ' 0 R'); - } - $this->writer->write('>>'); - } - if (\count($this->mpdf->extgstates)) { - $this->writer->write('/ExtGState <<'); - foreach ($this->mpdf->extgstates as $k => $extgstate) { - if (isset($extgstate['trans'])) { - $this->writer->write('/' . $extgstate['trans'] . ' ' . $extgstate['n'] . ' 0 R'); - } else { - $this->writer->write('/GS' . $k . ' ' . $extgstate['n'] . ' 0 R'); - } - } - $this->writer->write('>>'); - } - /* -- BACKGROUNDS -- */ - if ($this->mpdf->gradients !== null && \count($this->mpdf->gradients) > 0) { - // mPDF 5.7.3 - $this->writer->write('/Shading <<'); - foreach ($this->mpdf->gradients as $id => $grad) { - $this->writer->write('/Sh' . $id . ' ' . $grad['id'] . ' 0 R'); - } - $this->writer->write('>>'); - /* - // ??? Not needed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - $this->writer->write('/Pattern <<'); - foreach ($this->mpdf->gradients as $id => $grad) { - $this->writer->write('/P'.$id.' '.$grad['pattern'].' 0 R'); - } - $this->writer->write('>>'); - */ - } - /* -- END BACKGROUNDS -- */ - if (\count($this->mpdf->images) || \count($this->mpdf->formobjects) || \count($this->mpdf->getImportedPages())) { - $this->writer->write('/XObject <<'); - foreach ($this->mpdf->images as $image) { - $this->writer->write('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R'); - } - foreach ($this->mpdf->formobjects as $formobject) { - $this->writer->write('/FO' . $formobject['i'] . ' ' . $formobject['n'] . ' 0 R'); - } - /* -- IMPORTS -- */ - foreach ($this->mpdf->getImportedPages() as $pageData) { - $this->writer->write('/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R'); - } - /* -- END IMPORTS -- */ - $this->writer->write('>>'); - } - /* -- BACKGROUNDS -- */ - if (\count($this->mpdf->patterns)) { - $this->writer->write('/Pattern <<'); - foreach ($this->mpdf->patterns as $k => $patterns) { - $this->writer->write('/P' . $k . ' ' . $patterns['n'] . ' 0 R'); - } - $this->writer->write('>>'); - } - /* -- END BACKGROUNDS -- */ - if ($this->mpdf->hasOC || \count($this->mpdf->layers)) { - $this->writer->write('/Properties <<'); - if ($this->mpdf->hasOC) { - $this->writer->write('/OC1 ' . $this->mpdf->n_ocg_print . ' 0 R /OC2 ' . $this->mpdf->n_ocg_view . ' 0 R /OC3 ' . $this->mpdf->n_ocg_hidden . ' 0 R '); - } - if (\count($this->mpdf->layers)) { - foreach ($this->mpdf->layers as $id => $layer) { - $this->writer->write('/ZI' . $id . ' ' . $layer['n'] . ' 0 R'); - } - } - $this->writer->write('>>'); - } - $this->writer->write('>>'); - $this->writer->write('endobj'); - // end resource dictionary - $this->bookmarkWriter->writeBookmarks(); - if (!empty($this->mpdf->js)) { - $this->javaScriptWriter->writeJavascript(); - } - if ($this->mpdf->encrypted) { - $this->writer->object(); - $this->mpdf->enc_obj_id = $this->mpdf->n; - $this->writer->write('<<'); - $this->metadataWriter->writeEncryption(); - $this->writer->write('>>'); - $this->writer->write('endobj'); - } - } -} diff --git a/dependencies/mpdf/mpdf/src/functions-dev.php b/dependencies/mpdf/mpdf/src/functions-dev.php deleted file mode 100644 index 4836354..0000000 --- a/dependencies/mpdf/mpdf/src/functions-dev.php +++ /dev/null @@ -1,15 +0,0 @@ -06>8?8bmf8@+C(> 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¬?6Z~(;0{M#Gc2r%w4;M;R6Njt+i;iB;SK)jU{2O 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 diff --git a/dependencies/mpdf/mpdf/ttfonts/DejaVuSansCondensed.ttf b/dependencies/mpdf/mpdf/ttfonts/DejaVuSansCondensed.ttf deleted file mode 100644 index 6065234560f179d8ff547d75b67959822891dd7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690388 zcmZ@g1y~zR)93D*y1StT>a;+;)ZGH4kfKHE?(XjH?(XjH?(VMtC3gw5@AtpY!|lxM z*v`(*?(L;700ICY8xI8V32Ridx`BZJncUcDiRxkD5u;yDJYe9h0RS3by?$gP|93N@ z0J76t0GK_zdZQ*)mp!aF1fYbT0H9uvY*fatUBMo$3>6g&`S#I?_LTLnk7NK;^j-ic zq(pa4&kHzng#e&_(BS#qAtg4kQ$XjA04T0C_*cZ*(^3EezyY#M9Rp`#6S{R6urPlf z0L*Ss8_bP!*khRd_CEk|s=d))HqIchVD1+Hn9a}!6pTwu@2ay0iWvP<0l>a7-jSNb zOe4x0`kDhk<(~=3(e^rzKF$S*_@zew)Pl$_U*R)+jjLq2bkJ<)OJ!Ry=rRoLLK z=txOUOP^n`K$79>OaK(5lvGDbdHkJ$N=7`;H~>a-f@6)y0jNJZ%^>GCTlfml0g{Y} z(HI632m~QdfTTa?fnR^9g6)eTKwhSPhwvDe#Xr9=<+lP(#}mN^?E&!5oj=Azv_~(w z`iwuw_%r_d(;H}MLVrJPi3ScDT(IE-3SdU$2!I4AfCdkq0%`+wfVx0EAQGq# zGyoa`jey2L6QC*33}_CtFvijfXbrRh+5+u>_JAE&2`m5x0)v2Ez+~VlFc=sOi~wc< z%YcO-1PlkR0|S5wzflELf@B(-R3P9Ppg z1QLKGU@njhbOKU1(pWOfIgrv=m+|P0bn3l z77PM|!4R+HC6c`Q0fDW(& z7z@UMPGASv5sU{Dz(n9N@B~Z(lfe|Q6POC7f$3ld*ct2sb_KhE-N7DUPp}u*8|(x2 z1r~$-!2aL>a3DAc91IQthl0bv;ot~xBsdBj4UPfFg5$vP-~@0YI0>8#P64Na)4=KA z3~(km3!Dwk0q27A!1>?;a3Qz|TnsJ&mx9Z{<=_f%CAbP)4Xy##g6qKb;0ACbxCz`0 zZUMJ~+raJM4sa*93)~Iv0r!IY!2RF>@E~{yJPaNIkAla*@FDmJd<;GTpMuZ8=im$QCHM+_ z4ZZ>2g73ih;0N#{_zC=hip(bC_9t`$_eFyazlBbyih(UKU4rJ2o-_~Lq(vXP%)@D zR01jqm4Zq`Wgs8O7xIJrp#UflDhmZc!B7ZP4k`~-fGR?jpvq7cC={v+RfEEya3}(* z4%L8aLbagUP#vf)R1b=T>O&2nhEOA@G1LTV3N?e8LoJ||P%Ef4)COt`wS(G2b|?yp zhGHNG)B%cx;vgr~5sHTrphPGMN`_LPPEab82Bkw8P-mzM)D`Lmb%%ODJ)vGuZ>SH{ z7wQM~hXz0cp+V4KXb3bE8U_uAMnEH>QP5~;3^W!R2aSg&Kog-!&}3)|G!>c#O^0Sc zGoe|~Y-kQN7n%pnhZaB!p+(SQXbH3wS_UnLRzNGERnTf^4YU?o2d#%T09S!~&_-wz zv>Dn0ZH2Z$+o2uMPG}dj8`=Zyh4w-Fp##7T;3jYjxC>kZ?m!2jL(pO92y_%W1|5e^ zKqsM7&}rxlbQU@Xorf+!7okhgW#|fY6}kpphi*VOpx=nixjx(D5d9zYMFN6=&F z3G@_t20e#fKrf+J&}--o^cH#ty@x(PAE8gsXXp#`75WB!hkigmp<Vt&BwQbE05^mi!HwZ2a8tM$+#GHJw}e~4 zt>HFsTeuzE9<~E>;3zm6j)5I;2RIgvgPm|kI37-b6X7H{8BT#a!KrW>oDOHeo#8IP z47e-Y4ek#2fP2Ed;NEZ_xG&rf?hg-u2f~Bk!SE1xC_D@v4v&CG!lU5P@ECY3JPsZY zPk<-Fli$9;MwpTcrH8-o)0g87s89+#qbh%DZC6`4zGY$!mHrb z@EUk6ybfLuZ-6(#o8Zmx7I-VX4c-p#fOo>X;N9>ZcrUyU-VYyu55kAw!|)OKD0~b) z4xfNe!l&TV@EQ0ld=5SjUw|*dm*C6r75FNA4ZaTFfN#RL;M?#W_%3`8z7IcuAHt8| z$M6&QDf|q64!?k3!mr@h@EiCo{0@E(e}F&2pWx5%7x*ju4gL=QfPccj;NS2c1VBIp zLSO_zPy|D8gg{7yLTH3RScF4(L_kDDLS#fiR768`#D-);vLiW=oJcMtH6X}KYM*1Lqk$y;jWB@V{8H5Z*h9Es$e6S;-lM(!YYk$cE}$k7>c6=N}?1>qYTQT9Ll2tDxwl9qYA2`8mgl7&4K1bbD_D>JZN4tADSO6 zfEGjxp@q>RXi>BnS{yBbmPAXTrO`5|59*8h87I;JG!QL|2BE=d2wDy;k5)h{qLt9f zXcaURt%_Dd!_aUv07C)yE>M-$LQGzm>cQ_xOmDw>9-qZw#tvn7w(M{-PbPKu_-G**Qcc44bUFdFf54soKhweuYpa;=I=wb8-dK5i|9!F20 zC(%>rY4i+w7CncaM=zik(M#xM^a^?vy@p;#Z=g5PTj*`{4tf{8hu%jYpbybU=wtK= z`V@VJK1W}mFVR=%YxE8J7JY}lM?at+(NE}S^b7hG{f2%=f1p3nU+8c24+dZ$24OIU zU?_%RI7VP3MqxC@U@XRAJSJcwCSfwBU@E3zI%dPNVcD@9SWYY#mK)21<;C)0`LP06 zL97r~7%PGm#fo9Yu@YEGtQ1xnD}(u9zL+28j|E_XSXnFx3&ujQa#(q+0#*^LgjL3> zV4+x5tQr=Eg<}y|b*u(f6RU;Q#_C{ov3gh}Rv&ACHN+ZWjj<+JQ>+=*9BYBK#9Cpk zu{Ky+tR2=KvtvxuQkdSiXCzF0r3KQ;gxhz-I9V?(f^*f4B3HUb-ojlxD_W3aK^gP>yNTVxZew?_yVyPKKK1~6h&{p{V^6TB z*fZ=o_5yo}y~18&Z?L!6JM2C70sDx3!aiePu&>xR>^t@Y`-%O+eq(=d00(ghhj9c) zaSX?C0w-|_r*Q^naSrEk0T*!zmvIGGaShjT8=ei%j_1I0;<@nLcpf}2o)6ED7r+bR zh48|75xgi~3@?tCz)Rw#@X~l0+z0o?{cwLg01w2=;z4*Y9)g#{%i|UBig+cwGF}A_ z#jE1g@Gv|akHD+rHSn5vExa~f2d|6Q!z1zfcmup4-Ux4uH^H0Y&G6=U3%n)X3U7_K z!Q0~P@b?^+=+L@39a-8SjF3#k=9% z@g8_jycgaZ?}PWn`{DiZ0r)_C5Iz_mf)B-q;luF}_(*&dJ{li`kHyE~+ucvMtl>#8Q+3$#kb+x@g4Y1d>6hO--GYP_u>2T1NcGw5Pldxf*-|?;m7e4_(}W} zei}c6pT*DN=kW{pMf?(e8NY&G#joMl@f-L}{1$#2zk}b!@8S3H2lzw$5&jr|fqqL`|X=QJbhk)FtW>kwkr>0nw0XL^LLv5KW0@M027A(UNFIv?kgR zZHab7d%{jc5z#~p;UGE?u|yoyr)0hGZkMG1-J{N;V^#lP$=WWGk{Y*@kRO zwjQO-d6m3IUMFvmH_2P%ZSoFzm%K;bCm)ax$w%a4@(KBrd`3Pe zUyv`!SLAE*4f&RQN4_UNkRQoUJDi@WT%0uO)@=^Jz0#re&5LK8e zLKUToQN^heR7t87RhlY8`B1);ALUO4P=QogDu@cELa1_7d8z_ck*Y*hrm9e(R8^`P z6-I?q5ma@m233=)Mb)P2P<5$#R3ufOYCtul8c~g@CR9_Z8P%L>LA9h>QLU*qR9mVY z)t<6bQB*V)Lpi7pR4f%oIjN3RJe5EtQb|-Yl|pr*QmHg5oywp(Q(dU8R5z+S)r0Cu z^`d%HeW<=vKdL`9fEq{*q6Sk#sG-y_YB)858cB_!MpI*`vD7$fJT-xuNKK+9Q&Xs^ z)HG^3HG`T-&7x*gbEvu0JZe6*fLcf`q83w2sHN00YB{xnT1l;sH4;|>Ns_RI!T?PPE%*7 zv(!22JavJ(NL`{XQ&*^~)HUilb%VM|-J)(&cc{D6J?cL7fO<$hq8?LEsHfC3>N)j- zdP%*aUQ=(Vx70i8J@tY5NPVI{Q(vgB)Hmuo^@I9J{i1$Te`tUPX^4htghpwM#%Y2k zX^N(4hGuDw=4pWzX^EC;g;r^e)`9iF2HHkvqq75>fi1v6ItQ>3*aRG+a{~Q={lE}9 z7oD5V1FWF)()sB8bOE{`U5GAB7om#+hv{N;ak>Ouk}gG;rpwSiz;0j2wC&neIY&rMuDH=^k`Xx)?nC#b`_cXB0rWt65IvY4LJy^f z(ZlHx^hn?fJ&GPpkD*)3L26`jCiQY_ap|{f8=1*_L z`UZWIzD3`r@6dPYd-Q$!0sWAEL_emV&`;@S^mF2LIR`Um}!{zd<$|1bapG7tkZ2!k>hgEIs}G898I48t-U!!rUSG7=**3ZpU_ zqcb)p8Bz)0 z2}~lB#3VB*OeZFlNn_HP45l;Fh3U$4W4bdvn4U~8rZ>}v>C5zE`ZEKVfy^LgFf)W1 z$_!(MGb5Oh%qV6wGlm(nFB0k<}&k` z`OE@lA+v~C%q#(>GfRPKz#C>6vz%GMtYlU(tC=;xB4#bKj#&?kXErb!nN7@QW(%{G z*~V;Vb}&1cUCeG^CbNgx%j{$JGY6Q1%pvA5bA&m{9Al0%CzzAWDdseDhB?ceW6m=d zn2XFM<}!1IxyoE)t^-S$8_Z4S7IT}q!`x-=G547V%tPi8^O$+UJY}9S&zTp@OXd~x znt8*#W!?c}nD@*F<|8l>n8bWyJ~LmKugo{*JM)A2$^2q|Gk;is1zCuNS%gJdjKx`k zC0UB4S%zgjQW7#;?$#!Jp*#tI`O=6ST6t)wa%BHdDYzEtz?ZS3tyRqHb9&Asx z7u%cd!}ewSvHjTr>_B!9JD4594rPb2!`Tt+NOlxEnjOQAWyi7O*$M1Kb`m?8ox)CK zr?J!78SG4U7CW1r!_H;rvGdsl>_T=CyO>?VE@hXo%h?s|N_G{ynq9-LW!JIm*$wPQ zb`!gq-NJ5Vx3SyV9qdka7rUF?!|rAGvHRHr>_PSrdzd}K9%YZQ$JrC?N%j^r>_heu`xhAM8)|7yFz2!vP$~K^)8>9LixF&Ji5R zQ5?-N9LsSW&k3B!Nu10noXTmO&e^zZTy`!8my^rI<>vBmdAWRCey#vlkSoL$=8AAd zxnf*#t^`+-E5()O%5XlMFXzYka{*i+SC$Lng1Hc`99N#Jz*Xcbah16$TqswStHy|7KV&BbsIt^*g##c@uqBNxvlaEV+Jm&~Pbow!skjZ5b;xXxS`t}EA#>(2GydUCzE z-drE9FV~Oj&kf)Pa)Y?R+z@UkH;fz3jo?Odqqx!B7;Y>#jvLQS;3jgDxXIiUZYnp8 zo6gPPW^%K*+1wm%E;o;x&n@5Yn zmOICt=Pqy;xl7z-?h1F6yT)DTZg4lbTik8#4tJNk$KB^1a1Xgh++*$u_mq3aJ?CC< zFS%FTYwivAmV3v&=RR;Bxli0@?hE&o`^J6eesDjzU)*o*4-fDl5AiUM@F94@S%KFz8W9K zhw~A9b-o5)ldr|s=Iiiv`FeaLU!QNlH{=`fjrk^gQ@$DBoNvLmj-^Go=p{4#zyzk*-Mui{tpYxuSNI(|LBf#1k) z;y3eK_^tdlemlQ|-^uUdck_Grz5G6YKYxHf$RFYl^GEoj{4xGGe}X^BpW;vRXZW-H zIsQCZ}_+TJN`ZYf&a*V;y?3W_^xB)%Mq!h% zS=b_M6}Ac6g&o39VVAI5*dy!}_6hri1HwV!kZ@QyA{-Tt3CD#K!b#zja9TJcoE6Rq z=Ye}B0LqI3D1QW!b{w1*i>vLHWyonEyY%1Yq5>kR%|D>7wuw{ z7%j$#4zYt6E5?aVv7;C-CWwh*l9()}h@He#F-=StGsMnf7qP3@P3$iA5POQf#NJ{b zv9H)q>@N-w2a1El!Qv2cs5nd+SxK3OzZV)$$o5aoH z7ICY%P24W-5O<2Z#NFZ^aj&>f+%Fyw4~mDx!{QO~sCY~~E}jriil@ZW;u-O*cuqVo zUJx&em&D8B74fQgO}sAN5O0dN#M|N>@veAJye~cwABvB}$Kn(5srXEMF1`?7im$}i z;v4a;_)dH;eh@#3pTy7N7xAn3P5dtY5Pyol#NXl{36MYul3)puPzjT8iI7N%l4yyM zSc#K(NsvTIl4MDdR7sO`$tGo!vP(InoKh|+x0FZ9E9H~&O9iBYQX#3ZR75H&6_bif zC8Uy4DXFwnM)Hw-B|phu3XlS&vQm%~EQLtrr1DY)siIU#sw`EJLZzxwH7QIAmm;L< zQVpr5R7X@E3P8YB&thDbxDVbXAEgfvnbC5@KGNMogO(s*ftG*Ox)O_rueQ>AIrbZLe( zQ<^2smgY!vrFqhPX@Rs*S|lx&mPkvbWzuqKg|t#yC9Rg$NNc5a(t2rwv{Bk5ZI-r3 zTcvH%c4>#SQ`#l%mi9<{rG3(V>40=lIwT#Ijz~wPW72Wygmh9mC7qVeNN1&U(s}8E zbWyq_U6!s$SEXyxb?Jt5Q@SPHmhMP*rF+tS>4Ef6dL%uTo=8unXVP=&h4fN-CB2s3 zNN=Tg(tGKH^ildGeU`pRU!`x-cj<@pQ~D+Smj1|q49buU%ZQB1n2gJWOv;o@%Z$v* zoXpFDEXtBB%ZjYZnykw6o%L#I#oFpg9DRL({RZf%B;HpFS)neNA4^4 zll#j9m&+^UmGUZiwY)}NE3cE+%Nyj4z+PaVyh+|H zZ;`jk+vM%?4tb}%OWrN-k@w2`gOTI1Nk?+d)Sf04h+-{kM|5BaD3Oa3kYQ2+&0AO%(s1ywKwR|thvD1}xS zg;h9(R|G{=Bt=#fMO8FKS8Pf)CA*SC$*JU0aw~b1yh=VLzfwRcs1#BPD@Bx|N-?Fl zQbH-Ilu}A7WfUL9SMgK)l>jABDXRo2!AgiyPARWcP%0{wl*&pKB~+=ZR8zu~a3w;i zuGCO!Dz%i_N*$%HQcsCg>MISDhDsx)vC>3osx(uYD=n0kN-L$c(ne{kv{TwEb|p%Q zR$>%~(m{z;;uNRSQHfU)ltd*-Nmf#nPD-khrlczwN@t~u(pBlEbXR&PJ(XTcZ>5jY zSLvtpR|Y5pl|jm2Wr#9V8Kw+ZMkphdQOam#j51akr;Jx7C=-=Q%4B7VGF6$TOjl+o zGnHA&Y-NrzSDB~GR~9G>l|{;8Wr?y>S*9#kRwyf#Rmy5*jj~o*r>s{tC>xbc%4TJY zvQ^opY*%(DJC$9^Ze@?MSJ|iRR}Lr#l|#y5<%n`rIi?&}PADgpQ_5-OjB-{vr<_+V zC>NDW%4Ow>a#gveTvu)=HSITSU zjq+A`r@U7_C?Azi%4g+^@>Th!d{=%bKb2p`&qn{KfC{RR3af~Us+fwagi5NEN~?^@ zs+`KJf-0(#DyxdBs+y{+HZ_}?UCp89RCB4h)jVomHJ_SaEua=u3#o8t0`(HHC0Vh)71>Mv)V=Ns&-Smt3A}7YA?07+DGlH z_EY<-1Jr@)Aa$@hL>;OQQ-`Y~)RF2ab+kH09jlI0$Ey?6iRvVEvN}bbs!mgMV7(I!B$W&Qs^B3)F?`B6YF4L|v*bQMnJ+x<}os?o;=x2h@Y=A@#6&L_Mk=Q;(}B)RXEd^|X3MJ*%Em&#M>I zi|QryvU)|ms$NsCt2fk}>MixQdPlvh-c#?Z57dY1BlWTRM1870Q=h9Z)R*cj^|ks& zeXG7x->VM!-T`bPsaP=hpBLo`&wG+ZMzQlm6lV>DLd zG+q-lQIj-TQ#4i6G+nc4*|h9h4lSpaOUte0(ei5fwES8Dt)Ny&E36gKifYBQ;#vu< zq*h8Rt(DPyG+)h6^Vb5jK&`A6qy=jsS~;z}Rza(%RnjVJRkTp8s#Z-4)55g~t-4l2 ztEtt}YHM}0x>`LgQmd~u&>Cuuw8mN!t*O>bYp%7>T57Gd)><2_t=3L!ui3RIEn17w z99jo0R*Tb|T1PEjOVARvBrRD>(K>0VTAG%wWoVtXE?QTuo7P?Hq4m^yX}z^RT3@Z7 z)?XW-4b%o{gS8>rP;HntTpOW{)JAEewK3XQZJahrsq3zUmX}h&O+Fos+wqHA-9n=nKhqWWxQSF#^Tsxti)J|!qwKLjT?VNUAyP#dv zE@_vwE811VCSv9-s&6W%VFESP#+5>E-nbdPTjGURkfAhw4@JYI>L+u1DzA^%{Cj zy_Q~EucO!1>*6`^+vsiec6xi=u1D$7dW`PS zJLs``obJ>+>hXGlo~S43$$E<3Nl(?&^mIK#@2q#xyXxKa?s^Zsr`}8Nt@qLU>izWo z`T%{PK1d&|57CF}!}Q_$2z{hJN*}F{(Z}lJ^zr%xeWE@|pR7;Or|Q%6>G}+Pranub zthtvZ`T~8SzDQrJFVUCk%k<^?3Vo%%N?)z7(bwwh^!54%eWSif->h%Zx9Z#U z?fMRVr@l+yt?$wI>ihKl`T_l*en>y8AJLEM$Moa+3H_vgN-r7-rhZGmt>4k_>i6{f`UCx;{z!kUKhdA+&-CZ|3;m`3N`I}t(ckLt z^!NG){iFU#|Ezz}zv|!g@A?n@r~XU-t^ctBHqZvyU>jmXZI}(W5jN6B*=QSMV{M#` zw+S}UCfQ`0VpDCJO}E)>*=*TuIczy?xoo*@d2D%Y`E2=Z1#AUvg=~dwMQlZF#caiG zC2S>arEH~bWo$k+Uz?xJ-xgpCw3W35*@A5$wsN-ewhFe2wo10jwkozzTUA>%TbM1} z7GbMyt6{5Yt7WTgt7EHct7nU})weaUHMBLdHMTXeHMKRfHMg~}wY0UewYIgfwY9ag zwYS-AQMPDXjLl)|V2icI*_^hHws>2DEs;#?kRI19CC-tAhbG#iQW!=P194S8IGEke@?T7YSx0B z9qC$`dg+dtFj3p%O}qs#@v*56M^b`4DaIL%)v-rsq&u(#cSF?iFeg|5R>vHCg1bTL zxCWVEJg|DET#_kQ&m))Qk*jCQC7D4>vb+AFO=_|+*>HGLEbK^%#UrgjCR>AyGzXdN zZpg@(DAOl0*#lt>O`EBv&4wPEsUDjRO`EA^)5zpbb2oIO%#hG&nK04Vqb1#=rLifV z?rxCAt|>})O;HnbiZaY8YGQexVR_%g^ghGgpiNSpNwH{#>q$28_)lhdAiRk+g&Af` zH_P;h?ve#=kp=FS31cnIv2}MhNK4nObT=MoLUK}U8Xn~eb-V+u8kd|Lk5^4kPBHw) zqpY^Ev6j-DUGa3YMI)0_97$+37cUy^dJ6*#u9u%)>Ia=GzAMbi1 z35Kssf;}-R#%}iFbuC-S}-4(V)Cf+IH785@`G8ZQ?a?MO;@q&i~UGlNFPC8rv{ zO?5q?NGFu+MC-fNr?{R_w^ZB}fb=fO?f@7q9G(`(JJRAjBS}b3PGQnh>Qd;x?AydU8!t(wv4vp5QfgGqi9&ySbitOKU*g%@z*t9!DF0 z9>cUF6UGfV-R?{v4F^qb!sT`cXJ-fDnm8Ar#wH}E8$LRdj44QW#F%_Ymu^W(baa9< zIzGmTi#>sH!^UVFsrCfcjo1@9JCYOZshk`0jtCEH=}vk)th?F9m@QPN7F4Grl+Y2X zR|~4w5lZTag_?`RZZg30)r~Y8<6q*ruqI}c;coaQF-~Kq(wu4Lvf(rS#yM}l zJF_`&w~2at-O4h1P1M^Pn`-au$n15axWmjMKJ;&ky!~&S3N_Y|=^SPEf<&mbc@TDM z_rR-LlNoEaSaoxpv1U`-Y~tMw9%(K2WV2;0+%&^lR1+hNgm4QHMh2KlI=UMutR)oI z9g69WRW}!Zth>Q8lAJ!i5oN75$ZCVFHiQaw6(Kh(W%q)3Xt*hDceqS?nt!oy&c9Ii z=3si|+8oU3j{J*-Oa2Qb8+!Q2R1d^8{ELM%f@7{Da|3dfZPSLUY@0Tk{Kdj${Dm@& zqLW>vF4|R&n6xYi-PnypITDh)(CL{l(jqxF4(Vn*uo~u6n={VVbJaDoz&T>knCOhu z1Sqlzl$?RKbeEIvuBS0KMk$R-?(8t;#)61&&vxdp06y~X{N|JY#+gWW)ijfjNzQ^8 zQTFIh_CSUs zf~sb<(PoR(acy3WEut&i{rn?L;Q$}Hx>*9#jIGI{`B|;M)dpB?pw*fy#V^2IDSiQ# z0|6mcf2h?~wc2V{8)miPRvUp^dmwI4i%xZ>q_b9Q))_R)JyXVBVr;I_?(xUC3OX9& zo;#xmTKi_2Yu_Z@Pq&1_CBeF%9v<;8%*7@DMTt&GHg;gHqZL{+RA{V=5sx*UGo3E$ z$H%(1V`DRLCK)9-A%RG>C#Jb}FFeljJI*CW7>9CG-f3zhoyI)7#Vk#sOhTeFCMLmQ zZn_CZa;J0d?b5rQAPGhZ!xK%tT%s$djeXlPljt%-Cb^!jEuC{iUQyFXPyn86Oun(R zTX5NQrZrZlzjwQvb3;r@AbdU4*9#brZ?d4$d_9XhkpNiMVMm*oSNA zj*@4cqeiHb<6+~lAbHZ*43CQ}805508TNFq5`*BHcs$*5&FIN;c0e**C!GxQ(BK{e z+S#QC?`*Q;U97g7)w**(ID+f`mm0LY%LeQUwQI*PVA?ttxE6(+1@`!rmF5{4#%cG|FjDa32oLNQ8vY?u;{oPE~hD#qF%ysgP<+N8=qU&B#Jmj^kFqE!haP zlZ#c%;))ryZ2zHnTqI(;+Y?;p93;jV6lR=5jB!EfX-K*eQ!L%Ro=okb*18R~)@`V@ zZbPkg8)~iFP;1?WMv!r787YobXL2g*o_!BScJx4|=Boa@l~W$NoF$n&H0|#U@sPBU|2%?wZR%uW;FC`=8FNv7sE=dM~cWsTv z`7XgYZMudaba1AorMqS*I?kY^Im9$abaImMijYa^kerd49+!n8WmRJAg@zu++$T(g zcJHzl>^_T_uoRtaEb8=Br#&e)!#K7Ya@s#6S9lDv>Isf}T%Pv=#Y1%s-$NubQqt|w z@rDrX8lwf{DG3>A28~E`CbK zcbuaWqX>794S>yjw{(%+HQfM6b9M}fHjWvouDN%0yAMbPz_>Pl_i@L?;W<|rFzX7J z`)FchcNFdlzd_~WGK`aGYDQv$JtN(~3HO=D0FBb`YUv$^v@%YafFR3x9 zMzKnY$uRT?ZpS<&%^=8G7MDja>!x`y)s1=9iic_>oa-d#I$N2EWDLn|(|v?96tnKY zc`(71SFQx|5Jb1sUlbRMk-iBIj}6?l>$(P?H90*BI5RmtsNl&^4}o!|sRv=*x$41m zSM05~S7&$Q4DLF08g^6{-Me#ms7CImdtkvcgC2sr)OZkga{2p}rL2Rcp^`LTXIz8G zI#V7AE-KX-6YKDxt_iiLy2^!%Iny!LodzB*DKis2B-TBx9!&jfl08(`ow6Q`GxOGi zQbq)<++__XGBMsQG!){bP*8$5tk7QR*1_^HOJ&`xu=ZwL*Jv7%T<4##unK1eo zcg9+X?Arg*QjEh?lGAk=7;i98@yW*Px--oH#TaAv@0RY2w;TM)E{fVMB{|l(b1@E& zSwzf~2ry67{?>`w-#StITPJG&0CQ*d4={IT{{XW-`3IQw$v?oXPyPYssop=(tfT&c z=1JZ^(5zejf#!+bKhQj}`v+Qj11)`lmcBqsUtk314p2;TMpS|;1V+4#L$@c~Ua~og zvX-?V9}^Fz9V5*vn zMcoaYZj8;c4;ybPuu=VB!(G(<8pC7_H~){DjHT1=}c@Egl-h)`q1JQpwlv8GR$L#jPXE% zI}5Uek2B^x3#z&2Js~5>xNgltCb}i3XBl>cc`4x^VO~o3Ti18~5msm;tk6c7FE{=X zR;i1y>PCcBHzKT(7h#pW2(yF+`1rWr9(;X_yAlr+=<9|2yijIufR`5Nh01!NATJc` zh0He;!$w)JwX$Z41o(t`xXOBL`33}%q0!w^jSpkaXiu-NSDUX_o1a&kpVwnQj}{+4 zub+NiKmELZ`g#5I^J=!gx*Owr#<{+=;Ag|^iujXK{=3wu5gS|F_y*7fqHiEr2g1t6^y*7fqHiEr2 zLcBIYyf#9-HbT5MLcBIYyf#9-HbTs`6%gpv7L=*YW6PKYYc_m+JiWd?9$UUX9$UUX z9$UUX9$UUX9$UUXp7Hqlc*f)FW3J_ZK+oFn_4V2c@n_w;uxEZ*cfIvs9*?~F;TsYl zh8vrQvxCzS1p1N79M%s z`M>E@lXwpcmEi>?_pGEQXC!&UEV-xVZ<3oU-D!M{^yo0T{vuJ4>7HIH*$cAn9nsUl z#=G`M4<;C295d34H{47@RvX5NHk>JvQU(sned4@R&Est`mrdPc``dOI2DL_mqw_<0>b{k?LVpy8jQN-15JS zvhh~@udrO({$E=Be`&Vb#-~N|ChYG4+2a474xzU79oyrlafJ9=RIF`}GCsb=8$W8X z=1DXzPyVLJ;l@z^8L;dc{y#L<_;p2`H_EK*7T=30_5W8WQ~n20u3=n$#K*Z($eUDh z-2b43r~StR+3`PUjsHi)jVpkEy%(Dpk+HjOIlYm{_?M!4dH#-~?&bWOZj9wWc8sz7 zhsHK`q#Jjb)(o)eSuv&B|41#xby@!J2(lTR|2sjl8SMYNhiMdNe0jADGsY(gFXFQM zpNVkU{SPsh!RdA8zrBXY|KBSZRU|n&F5YWaFqW75UD@N5U@Wb_2wZJ@)>X>I|Am^R zq?&oS4X9R@3wM9r@o3{5f1wt)RcNY(s>V=^+%r~5*7Q@2A^ewW$y!CInpK3VMR4X1 z$h;QKACh@c(fb7me}PH!^M_Dq7M=g0c)vG$rMzF9Jrq9D{Ho{0t*?9@T(|oF)va56|I*DY2)DMR@G#!`ah69P zZ~aKigNxo@ig+pBADVb5YLmZitF6_kX8bRz>{@*PL|t|*xqoP;pVrG>Ktzzz!jbwP z!%DaRL9`^TP1t%346t4U1FYA;0P8g{zCkRQO1kbg?MZZ1N0Jw=ZY%+dPKDV$ARQhZ=Ygq~UNRM)Nexf;GBi&1 zfV8o&y>Ly#n5CMj_cguAixqsg*@N)zB+SH_GIpn>xJenZ{X1*f5ics^+!D zw8+B4)OU7C^*UEOi$G-Nup%iz**YP^TYIl4w07keJm z`b1<+j^MeP^>o|pQLfF<={|ECLS8krJxdlvWrm!N&5}hinXxjyoqBXq-MwTgb5N9V zt>?+UbZ?w!V=M5GX=j!!O2`sFx@#6S(O%_re5PAeoL42)(aXUYpPDnX$f#moA8BKK zc!wCJ)^?OBSVP9bsxF6BX^X z#dOQU!=z-*qWCNV$^S>)mj~8Sm3`m2lbbe4o2?s_wQne>Na>wB+f`KVy)$Fk_f?jr zP0|+Hq%=uOK^9w}B1@5_NU3Z>!Geeg1=&=JfEL^k1rd==M0|nQS9qZ`!}mMq`ORdK z_Wl0;zNG0n&zW=1bJk}&XPz1ER?l#93#KGnzFA)sNQXm{VaKm%w(fXdS?mUm=hIrC zVxrZnnAiT9NRSb|)1} z@cXn@sIo~*Tppu1HDanIwYqN7M%PW+=+e>zOtdtqSki8nmL{ap(xhTyKT)xy9WHH7 zDlNr9o0CdQdg#*Tq|#Cxv^gP-HYXKJanR z!kiS7R(Zvwgje*(%~RJ{@pTGNf@LiLu<(~JSR}AsCN8JYB{y}+MctXnl$NMuyTzn= zb~-(FI?49Tq)|2vMvi9}laAZPWN__b(s8?(46Z#~bJ`6%?S@VBtEw->LGvrpXns|( z6bH@8DlNr9L##?mhRUWPR;48qXwwjjG#X-6EbRvku_`U?2Mw`EqghqO(h}+NwrN&X zPt#VV8^Wg93{TU=Y134sN~Arf!2)SCm8)3Vb0=+;lj3mFd2`a9JINxkxxrkXU%HM+ z8?GbLj?42**Gbm{jhc>EN(n|OB^afYV3cUoRQVEYrId)2QlgX`1E3!%c`EtE$z9!Z z!H*X9cQ5W-g3~f^S=^wQyF+4a!Y!^54>YlJOGQ_tGS?L;%XLM{!j_lyo^EM}@}BF7 zyyki$uem(#bUiVFI$k1ix*qHDS(h&oo9m0jhD|Lve2!tdp%Ynkcso0kGO?LihOMCK z%BAVbrRmD0>B{xlhIH#YlvCX@TTx~!%4|iMGg%fA>ZY@iNX~AVZ78!1WsXEyBv-dA zlB-+hn3maw3dfSs%$}(EvP0t%%QyRRyhh)jzX2AP~|98ISOP= zZjCk8SYwUlYb;N_-whJh>y+%KGrRG+5$G}``bJ!VNTPV3g3)mUc=IAjZ&H`l_@GI> zT#@9*n=(oMe%Nn%6QEmJsgeS{xNyO^UUObe#?GtB*m*S>JFg~V=hbBFJlaS+_S9of zJ@(YA$@=kXvVJ`F++)wZnv9&s5%6jhYk}%8dhY$LT>7in>ysC4!NmAZt9SmI^?Dfxv4{L>aZ#cBji>Nxs^k1<&Ya7 zaO>V<_+FD!(5{1NH}j8HFNgn9uZ)C(A)CRGUaI3d&<2%%os z2=xX+s5cNoy@3$wc`DA7c|u71GEabsU*-ug@yk2`CVrVGz{FoAewi<%6Ti$CVB#0j zTbwELhmiPX{s0rd%pYLlm-#5pl=(o&@sjxf%<+=>0L<}{`2fuElKBA4_6orP%=RYp zBLoNO94{d_#hF5I5E8!-9Kggc1P3tj3&8H3L!$s z@e)D=nBygc2r$P>jDUbSUqYAw6TjT}0L=9wroJKsIYp-sO8=lR5SISgV#>pF=^xYx zK9_oJG2!94)N6|g53sC5TTFO>Wn7_hNO=+IicmKQ6R)szq)WeSG2sCwUNPYTCVnyD z0VaMi-2s;Iw8eB+w8eCXko^_Y9bn=W(;Z;qwb);acrBSvC>_#XOXkzIh}V+&v@Q1A zB7TegF0tPw;xDn^CE_n}yi3GiB3^l)sc7SUCOuCj;w=$xiFixITOwY0rKt!-N6Oj6 zYZI?cyf*RL#4DFCQI7cK@+Dy6m&=!ciB~RN0w!L$bcxG3#4DFC0TZt%Er5y7;W&%( zf^?3vLws^66Y1=)T+Rf{{>tS{z#M0nc;)6$(UxnN2-#nk{dI}oC4NyxkdOFX;&(aT zF7dnUw@dt@yr3NMi}F&m<+>+A_S++Vyn>|X(IbA3_&tudNBkb~i^_v~h+kA5z{Kxy z+(qHRl?C=+uf zRR`(pzsNO!iC^Rz!0dmS_(i@!I`NBq1DN!dF)+V2|$!BfyS(|*; zCZDy*XKnIXn|#(LpS8(nZSq;0eAXtPwaI5~@>!dF)+V2|$!BfyS(|*;CZDy*XKnIX zn|#(LpS8(nZSq;0eAXskwaHg)@>QFB)h1uH$yafBD(g=agQ6{R5<;#wk&^&(y@{Lz znCndx1HfGGD3EO+IatPut|vHuD3EO+IatPut|vHuIc1p5u9P(v{eAyvicF30<@@0p7*&$zc$d?`RV~70MAwPD=j~()3hy2(f zKX%BE9r9y`{MaEscI0JvykS{yr%MSUnL%!^gA3I`9EIQ=N4*9Y}zU+`MJLJm_ z`LaX4?2s=zX4s05yMKlL{Gr#O0iaE8NB z=oQXy2n)T!*^R&)f1Jz^W;u?(%kjsF44)_EWd2>sGc?{7UCxio`JwR^=|ZPyyag=$ z4d*seFXxA*+oH?)aXCLO=f~yzz;w%UBG1rpi*m9)T*@;p<(WXPRulu$^MLwTKzbg? z)e1b9eg@RX0@Cw9u2$f=tn+|+SwOukpk5YGFAJ!b1=Py|>SY1-vVi;`5R-K=AU_Dm z2LkeefP5ez9|)+A1>^$(`9MHE5ReZ93%?ZACTS$r1t^oeL#92klqKR_W|jBKzbjL-Up=j0qK1}dLNM92c-7_ z^{{|+KOo%?NcRKM{eW~oAl(nRp91cufOJ0~-496j1JeC~bUz^74@ma|(*1yRKcGGq zkp2gx{{iWLK>8n${s*N00qK80`X7+~2c-W2>3%@EACT?`r27Hsen7e(knRVh`vK{G zK)N50?gym%0qK4~x*t$q3P|4r(({0HJRm&?xX*%QpHXiJs5b=E8v@ePfb=vVJq<`t z1Jcug^fVwn4MZNW=CI&9iRBx(NJTQcDb=9jgI+>yplWy@5!n6FdJv3j~eHv z(FT<&W26!#HY>SC*f2kdjh&T@(0oRkW@+To>iL25Q2qg>)yherjXjjjmQE1`;1gX5-V4>) zG*Ew-1bAmejlp4QcN!NDM~@heE=i+sh?VqLCF=gRq-lbpC4C}r;}Pi~G-_WEGD=6L zl{WUL(FT<&a-PwPyxw5OG)NsUJhM+eeqgG!b5 zs6=V`QN#TiNTaPsjhfEZfl&#=PU>_u!;a=O*d%@;B`(e)b-eZHQPs2#j!IxjJ(o>V zQpc0)%*jegt}`ca{V{rt)i2dS!!b$!8kQ!p`eXG%s$V9-v9fBG>7e1*q@IRlNv!c$ zl;mz&mPU~?8AFw*d)0Vc`nd6oG}>@nQd7ejNv!es^l{_zG}?5+@E|muIUH|LJ}otd z2IbgNaGj7&QsbG!(fMh#VIVl$SMWNJYK;pxrPu>K7k$w6!wad_A(Qoud;nIrL0qbLfPLnH(vO ziJ5xR#4I*F@7cO^!h}p+Ny{f>s!GzD{5 zMm>`wMKdvzD^1K|lTpv)l2OmpmGommCR38uxPMw{*lEJ$O@=bns=^0p@< z11G1+3WTRqMq3XZz2N#rCuDNSSY&d@SY&df6;I6MN)xl#WGphdWGpguB`u$j$&{ou zYL~5gvKqDDR*C9V-6%=b(Po{RHlkVQPeG|kBbPEdI$oDau#MM65(w^jlhGYaVvX?X znv5=7yCzYjE)jpnjYv(RI#pV!Q>B$UH7(k#pQNCwe@U;jQa_Pa>eQqSO-ao7K_!<8{^baOMIjL}(pN*C9>U5ltBpO&JkQ84*nx z5ltBpO&JkQ84*nx5ltBpO&JkQ84*nx5ltBpO&JkQ84*nx5ltBpO&JkQ84*nx5ltBp zP1_Mo7!gev5lt8oO&AeP7!gev5lt2mO%@SN77iO%f4J5)n-j5ls>iO%f4J z5)n-j5ls>iO%f4J5)qGxBOVb)JR**GL>%#mIHD;uqA4_@DKz2{aYR#SM3Z(zQ)on! zM?{lHM3Z*JBjSiAkccMjh^CN;Ce(-~)QBeRh$hsCCe(-~lZZ#c5s!o;nouJi2}d-c zMl_*DG;v2Xp++=uM>L^EG@(W`p++=uM>L^EG@(W`p++>JMl_*DJQ9w0BplI%8qu^9 z(X zkA5Q_{YE_cjd=7M@#r_=(Qm{nS`m+cBOU=qJOYk*1RU|mH{y|R#3SE`N4*h`dLth7 zMm*|`$Sf|Cm&S>m0%419kh*W4{qX|5-K|ZIUoZI8piZ!!X zZ0uPuZx9Z2;Y~mnhex29zVZ{7yo!$39vg>!;f_q=w!krdz$B7i$NOf}61D(>PXq z5+AQ$AxI$Ir(pnnN&wZTBrbhQA>F40(tSz*>4tD`Y+8=9UmNa7k~7nhBuNSjE4O9} zD@Vx56jlzHlPRnmFt?Aea=_fc!pZ@20}Cq$%*9-piC1P}R#}8`!W*m0$Ie|ccxLy4 zC4EA3{IbZN7OzVqbn6$xY4AX&w6o%y%ldkCX50uUxpiGI(bR>5OGw9rRihX;i?C{o zx1rSiWXpEC(poTW~pBkEen@{3Cn843xy(z9_02p0i`3x>-e0-4L>4qPhWQ$3%4l%#Mlb2G~nl z*3~Riew7Kstvc{OO`C?RIhL= z$NRFLM4dx1ZWZ#1B6&rTyrNjGw!wA4;=VpDOF(>{Gq{*FkS>T~hnk{x=F|h6%_=&c zRTLc$VX0jYzs{&7Qp}ck=^tFI=A#cs$;)~rlZLSubY?*Y8B;9 zGD7YaQBVPMw}^rYn7c(3Rlr=KqNoDq=!v2Vn4>3(DqyZlDyq;}>wECl_d?Nupd~hS zpMlT3D1oIjNwdeoPs+e@h-m6#0XSCc9T)?e2M-_vjpB1!MfL1LEF0TDI9Hvp4K(2y zJ_CV|fb?$(s_tI4ccA364>QQ(H`HmVCjN>h!Oh3Q%rToQSmwrj9%6eC}Q&* zxI*v7hfUy#8?UZ2uXGs88$wCnVmNO{U7ZUX5t*-C)ORi{XxICaTkOCVe#R)g@QcQD z8>>qVOZP(6jU*1|@$=M&FW`r& zH>1);Ua%;wSd>;QN-Gu|Ai#e!^wz#5-DBq9vy+4U-34@aL0{u=_oU4fS=8r~6v4JA zvRDvV`WGz1cU+c0{{^W~A7)8T0FaAwLBYkM;9^m5v21IC@+Q4_05=rWCqI^JMM^N( zHk|698E0tuYvd!5XZUF)%c2TwQ3bZ_>R2_pN-1MqTpJW{EIVq{b$7z+On>{lZn)aS zM?Z#JK+L)Z_;rTI>F%lef2`*JrA<_qEeb>y1tN>GD zWy^`0(2NC3Ax^@yFb?Yl3ke$tjg`K+rSa-BSBjSF_O`MDDTKEc3|8);E=zQvdl#tYM*fRJoBTFQJJd;+4Y21QR)GWDBkIYU| zbCSUPY_*umQH~o&Oy!nE{o0~_ZBf6rs9#%UyHOp$LgfIpYtnR2;AROH4K5s5uz2Be z!B+OiN;1Adt9LWSFN@-rMe)m`_+?T2vM7F86u&HrUslB$i(4G}`&v4p87IaA9~i@@ zU)7g%1P{e9ODyP?B^Gpqq$-raEJ|P&B`}K;m_-T9q6B790<$QAS(LymN?;b%a*JxY zMbXQm=w(s#vM7346um65q+6C)(h-t=R6~3s35o=WMTX9cJ>9Y>Ygv@FEU~8}-5vwW z`AB*CTC9h%Se=HwJA{qD$#0F zni;iIkN~ww*t4L3UnfoJ@QoVTntZI$GZ6QQit5{>gEImAS|Y{8No zK0*#*K9Z~wNmhv@t3;AjBFQR|WR*y=O4Jxj)EG`YiOM@0)8bl}p z7+)F$EW!mn`T!Pf5dJ$+;mmA>GK+NJiHwoTfE|)FLGET)eC-fnNoBwpRhmJl1>ZYF z22W*x2dXrKkPE(ehzz<7@RpZmU>mrw`R1X;HxCgCz2cjPfOQkf!xhN=4Lsl|(5}c= z50TCm@DvKK9;zm~nF`nfxxj$}BB%4+LyPYoA{474-aS+mc*7OQ4Gv^r3usv6%ZEs3 z3n-=INXow%yL|D@@&xv2|iy)r|(l%V0Ym?_q4$hkv z_GF)PX;1`KFGMaGkmm~r;QX+wyP*Fc({-AJN`mFeE3IXqx;DDgUE z9}d}vL-yg2eK_T)31oThY4WMG`dL_Z$#7S!sgkNqGs_m>@LYZ9R%f3mPt-?&&Qw;4 zg+2HjO}iu}LW)Y-MUsZ?2m0ftuy4$ruO9Czj|Ue+mR2lt0B2wL{Fmmdqo0dlDj8H> z^?WBOkI#B(QIgLH%9g_#|s%w^1oy{?#>K$~y zvX4h}tLBW;8L(DxxY{*N+9|-ES%6kI%&^X{aj?)B^_}DH<=yonU5ta)gOf7>*veq6 zva9tYlk6*bI7I@rhg1XA4SHSq4#VksPSXcc8}%HAdX7Uq$Dy9%P|tA!Z@gIZ^e6fH zyBiQ@TSaTILu;@@&Bmc-!*`ltn&G0SW`lQ}Wzi3B%4Gdcmcdq=Rdr}&^6+-18kue# zZtWy{BTNy!(sJoARU?N&qeIomp=#t%HFBsLIW!16Vb}y6d>-XLsf${XL#@c6R^(7C za;OzK)QTKxMGmzhhgy+Ct;nHP?2uE`%chci6$_htwsTjFbjNF+)b9zp!D{a;lrfE{E+z+-~%Ah#Y zW;$EMlWp7_V!B9QuDtS$a>8F-YEmxGwB2HLa72RJlAhcX@2?@=xEi;(zfBBp;{q;vhyL=1nu z(hi!4U7CnpnuuMRh+QWt;M!hSceC==4zuP0SzY+bt|sMaLfzbjgL9g7)-DXJEi0WxAAc=@;07%WoNTo|w}wFw%*iC+2i3fpo4RnkDE~0_j{s zlyd1-0_ogHH1yJ~1k#1I(5(cl^xQ}^^wO;a(#7mSw-SJfpK`8CIhSrF@SJOiaxUFU zAYEj8m*x?d<`I|X5trr>m*x?d<`H@Uwp^M=T$)E*nn&mb7|)59<`H@UMmoox<`I{2 zBz*u|E-kq(Ex9f&xh^faE-kq(Ex9f&xh^faE^Vb=aJKRG{Je~EFMj69!+kZylY~4 z`*)_xN`~uq!m^S)auZM9J^=<>vILJT!6QrX$PzrV1dlAiBTMke z54KN zhR4fM9xq3Er2ii2zef`WT#!pSo-x8PJYm_vaKuhnsIW&92AsAto#Rd};PFt=BNy;U z{XJ5BxE7akr1~DIzDMfrk*a&7>K>`ON2>0Ts(YmB9;v#=d$Atx#p1T2;NiVkPu@bY z@O1>Hv;FcG3eq`#yg%#l{;bFAOdhQa9<2->tqdM1Fuq41_0r1Vkpg?9z#b{EM=OIz z3ha>r;~Nt!FOrV@JN9@QecmFmhj~WDMt$I(aPYF0^@5Fe9rkJ1@=gRJs!Pz zetBwYN~PS7PaNWOW66S^si|po^phPkrq636D&|qYd37lkmtSJTeK7Hgu0n!XuOLXhZkNBs?++k4(ZNbMVLoIG6#>$!Q(NX$74Q^$9x`-`8*!;dAwIer|A}*rsF7?OOq#69@R0A>X=7$%%eI+ z=i)eeW;v=_9#t)msurDxBOjMERV|OI7M+RXIkyy5Esv^}M^($Cs^wAD@~CRTGO6bg z-;QA@BoW_eAuQ{}=L;kJCJbz)LQ;G(KcCFcr<&zc&GN|%eKJFz%+Mz@^vMi;GDDw= zl`k(|T0U8!PgdxY75Y@He6m8Hij_}R=#v%tWQ9Iip-)!mlNI`8g+5uKPgdxY75Zd_ zK3SnpR_K!z`qYkmvP7RO(I-pv$r63CM4v3tCrk9n5`D5npDfWQOZ3SSeX>NKEYT-R z^vM!^vP7RO(I-pv$r63CM4v3tCrk9n67j_znQyX0pNf%BmgrM4!bb#|kMmE($R|tm z$r63CM4yV0PuA#DG4jbGeX>ZOEYc^7^!ciZ&$}})J_=s4PM>#Ye6moVEYv3p^~pkg zvQVEa)F%t|`KpP}S517fRG%!>CrkCoQhl;ipDfjv7dtJVEY&AV^~q9wvQ(ce)hA2! z$x?l?RG%!>CrkCoQhl;ipDfiUOZCZ8eX>-aEY&AV^=Y{G$x?l?RG%!>CrkCoQhl;i zpDfiUOZCZ8eX>-a*MNPpRG%!>CrkCI)c90te7-8;Q>pQ()c7>r`&4Rt-d^#k)c90t zeDW#0wITCPpREzkKp9pZv=w|MF?P_o>|YRBn9oEuVbLC*ShPw|w#~ zpM1+F-}1?~eDW=ye9I@_^2xV+@-3fy%O~IR$+vtO$$j!KpZv=w|MJPdeDW`!{L3f* z^2xt^@-LtK%P0Tx$-jK^FQ5F&mlr-QpGuKWrO2mJ%j6Hq%Ts02g)-?vne$oZe3m(%WzJ`r^I7J6mN}ng z&S#n9RA#%&YY=v~T!ttzdJS(KL z71G%X>1>5`wn92vA)T#|&Q?fgE2Og((%A~>Y=v~TLONR^ovo10R!C<$;I$I%~t&q-ENM|dgvlY_W3h8WxbhbkJS0VkYkp5Lj|0<+^71F;7>0gEPuR{7) zA^oe6{#8i-Dx`lE?uQE3Rh8?h%Jo#`da6>+tMi|e2w z_tS?iVA1;mu9tv%4}Ia{+9>l=PoXbdq;tHer_dKJ(%D|>DfESlbdDGG6#BwNI@?P< zg}!icO_k$CJ%zq-k$03L?kD=fMLOq;dJ28vBAx4ndJ28vBAxR^J%v7TkUm@v6$axP*7edZ+$axMq&!On2_=JKUZ-g2jLfv14db|;8dvxsK*cA{PQC zevu0S6TirXfQet^LVPlU_(d)RO#C7j0w#Wu3jq_q$c2E3U*tl-#4qv=VB#0K5HRtJ zT!>Fq5WmQUfQet^Lcqi?av@;i7r78H@e3aWO#C8W0VaNt3jq_q$b}VK#vh@ce}o!8 zLOuToHGYJ8{t;^Y2=)9U)c6tV`A4YnBh>ScP~%6a=O3ZQk5JElh2Q8vNc=MXfQetm zA29LD_yZ<>8GpdUFXIoG_+|V76TgfSE$?1g~YKd~1AmUYP^vI>vL5VE~u4+PBi z3ZDhc_6nZ`Ec3)8GQb=!;j@6*AK|lr*&ne7R(M2)kmJR5$0IPLvwq>DfLXuT`v9{( z;hPm6fgxml!Z!hPytpnsu1kDGT;_-CkVjY*e1u!lMUSd@qDLX*_=p|_nByw?5nzrh z*PX|8=ZSt)@kB2|$o7ezQsFrULe?+#Ai!*&*nEW92mF%qXQLl9-pK z`Dv`2#+(^eS|W*gX_}wL%4y7*QA|rDF)vN?(^z>%u@3J8YquM452@K9LOo3g^|T<= z%LwiTghqK z*#+Dh62Ficz{D?P1~Bo9I1iZkMVtpr{36Z+CVmm;0TaKFA;82hWC-pQiC@Hdz{D?P z2{7>sSprP_LXH5l-$IT6v)^)j0hs+3@enZkEyowQo-gxa3%LT!c@c62nBy+w3NXiA z$Q5AX7jgxd_=Q{nCVnATfQet!0=SP9{BF(3_w<-OJqz%sU!sC1JwZ*49v=0iY1Fs@ z^Es!48aL7fWwn@ml-ir=w07cZTj#<7oF32bhJ*WMiYUQ3pJ1ob4VWl6>Q#<(%tD^k9dH1ER9i);}M20`Y!v|9l;8EW|3of$tEbbiWoG;C3Rq*MZ zc%KlLZB_epg47`i4Rg8&1a6wQU{Uu%#=B6E>0{@^Q=3A{mVmW2ovHfG)PW>p!}7i^ zNo(#=qjFkj53{5(TrI`LFQzW)Uc^}MAS)Z!kLRb&m*feHyLCMRNpr_8W@DNL`r!e9 ztw;*BL?usoJ<=I@3u>lLw zt%@xdun^s<*m41r0+z!`y>K-%Z~kC!uR@rtX6cPcOz!-=4gnf2$-WG zk{CRqvV9_n0hangiW(tBk&vQBNKquDs1cIygcLPGiW(tBjgX>7NKqrCs1Z`s2q|iW z6g5JM8X;MINTx%J4m_F4c!%6-A-7t{trl{th1_Z(w^+z67IKS)++v|vRN?tl<}DP9 zDqtCxkeevvCJMQU@b&tsiVH33#Fo(hzelf_&@bs6^E(%v`M>3Gc39TA?EjX*8?HjT z9^V#8d57iQ^S4{Yr$#&&v4N(Jc(lz{3VmFILg%){7B$Zqv7=i7j;Of>3ES3JE=^K& zS2=JR*k)^mWe4vjWa)P6XtLe1J*pj+%Pnx;k}cS#;1TUnwu&M)DZDiSYoiL&>B)sjHhHH?{ zt_g7k>!xEopM1lM9*wFfFsKxVcT+Hv1QSyt*hV>C0kX>c8WUi;L|r^ zr7L)3QI)ctqUDJxsaZIH%d-@HN7I{@?UI`?Xa=Fr^i_6V7)=%)a$5f&r1DWBM;H~G zL8mjxJ7jW?X!MlKgKXP(#R$rygi9^x@54(d&^DHI&RH;br){2RuqB0unalPI4?q9k z3TxK&eb3h+ymKq>r$+Q9j!;A=dJ_jMq7%G{*AK#fY`LTY z_#~0Ql7NY}K#l~i1fB%G1Z4>-5>zFqNuV*n3yDCH4vI4+5PU_!R}_3j!B-S~MZs4T zd_}=m6nsU&R}_3j!B-S~MZsqYB1;fig2+;caK5RYAyCf{sAmZHOf>?KY6Jq+2n4DT z2vj2ws74@AjXO;Jd_}>hJB>uar#lTu@aawi5`4PTfCQiJ zG$6sJI}J$i=}rR@e7f)WgsI@ueFr4?;G9J@$r5~)^v@D}mh{gOe3taj5`32Q&k}r= z^v@D}CFvg=r>m+K3nkFg3lIww%~IFpCkAj!RH7*NANj<&(Zkc zfJ3zt{x>Ah81Tt&fiwoV+|ZD81&%fZ(pAIFhCsS%eBxUm-CVfP5J)PM=He^flBk=D zZ+L4++KDfC3nZ0EJMsB$Nz~(lk9P|s&2LF5P`R}i_$U4^_ce6?|2}R~39!!B-W0Rl!#kd{x0$6?|2}R~39!!B-W0Rl!#kd^N#W z6MQwnR}*|S!B-P}HNjUCd^N#W6MQwnR}*|S!B-P}HNjUCe1YH#1YaQd0*%iLbe&$H z>+}L$rx)lty+GIL!4oQ0vKQz&y+GHA7a(+EsO$7XU8fgHouTf77wSHEq3#3TkdOj` zFBE*C;0qPL5UREWs!l+vP6Vn>1gbIwsxkzsG6bqJ1gbIwsxkzuOf?>mYCHnfcm%5P zVW^2Q0zssSF(5&ti7_C-r-?Bj!KaBaAi<}JF(ARGi7_C-r-?Bj!KbNk2-RI<*W?$F z)Tt>gAZfg&w1A}Xn$iN2#%oF&hMLkMkj86D3rGz)0%^4-v48}FCP9FtoqDH+q28$o zq@3QAfMh)NrUWESa-}Vhz>7p3ImhZSiF2JgM4~CV7Iv zQ&lS$P!gy*0jW9>sL4T~sz#uyMxd%jpsGfo8jnC>K%g)nP#6#>342203`VIngAsD^qPQ=D#54M1R%kumj)ogr^c(VPpAv_8jzaM6&3?g0B*R^kBhLi9mX=T+O-gJvzZBU4dH?okepl zJQIAHa{&^3nsWgXe429s5`3C-0TO(ga{&^3nsed1cY;qdFhGJ&s}X>tV_JUzq$daN zLv)igS3{y8(p(LY^hgHM)$9yk)DsLctgeuISI9klh3LvS)LS%bavI+qMCTG%-_&=m9y!sk1D zbE6tDGn|4m+;NOri1#NzNdfTiu51yfXyBC21k@Q%=}fZPx}0hSE?vz~HUQlu1t?QU z3Mli30F`1U8-U?#0EV-2%epNP! zD+`m?IA=*GoYASTxfKpjgC(n_EHg40BZE)u$*P{AKAEljJTXr-J8J+k(~+IET6RwW z7|sS@c&U_SsT39tHzE)OZEAXK&z}L`XMNbbi{~??Je<<9K)LwuJ}sG2HO2Vm&WI@o zT+Ti(hE}=+RDOJ_p_)85yXN*4_E$}j&t1%z1LC5`5Enf0`Lk*!E^~@BNNqCyk|)gM zi6o9&wZnOE2g*+JsCcA@-m6uHH-iGwAyPm(cploCk{ShMvQ@L$GTYv(Wp=s(GPPy4 zy;sZZbOmIxW#-b$PM-oY*)ki|t7T}F0*12%Gc#QPFx&+InQR$a;{_S=qJT`c46X5k z40%yNCR-_sw3J0!%4V~(+3ajKJDV-D2Ry9TOcyd6!VBDNZEiN3o2|{uX7jSyylgf< zn+^LSVJxs6WV4mC*|1rLvz4>ivg<9#t~UUgam%i^AiLfGWU^(~TaaCE05aLK>n+Hx zHvpMz+4UA=$OUX4*=*VM7G&2OfZ^K0?0N$*JRkrv*|O^`%&s>8nQYnh7G~EQfK0aR zdJD7b4L~MacD;q!^#&l5ExX=uB{kE9?0O5c>kU9ATXwyL+4Tk>lP$a6LRoK$guzSP zOhpwLFJ|IaCSJsfP!#QT*QxJ0)U4$J%dnNl52DJ)Nm z!Kc^oV#l5LERb2aaOIVGQqHUgIPuCp$;<}acx9hth75P)vrn=}%bBeMKVQQm>z1?4 z0g%qEdXi26e1T=F&TJj^B$F+(k6cJJnc6a&3LeF>wPm)BdXlMa#OP$U4qTCCvQ@I< z24EN|fZ^IInGFJ;W!Y?*-2yLWnYIDQ)Rx&TaBh~(mRaoTNd{?lekz$&3~y-JY#9;? z|7cmH8F~s&X<4M%ImMF<((Ig8vU3U`lPx=^mF%1X$Yje-7G$r?fMh4Dnw?~BXD;_{5TZS0HwOeLD0A#Xds0=*6WwT{x0Z%e*%g#bII|~3Z*|OWL zn&Dk8fK0aR@K&?K3m}s%yJf1`EdxMhYvJdC;l)$yl=vL7`qCsE?Z+2 zi2P~)bGiG+)EDZ^ypj9dZmoCcr|;i&_kM>Tx7$<4Puu%*qrlx-$Lw}@?y$SZFW>Ef zPd+*9xVjw+$KPGp>27oS*t_edcf9hyJ$z;F&mDN!al73;6b7s{oE;$T$m4(j|5P%t zg-DZx{qHVJ$G`n&-@V)1`MZ6y^_v}^|7L6V=l9M%kUwv~Pd<*#EfdX;rkfvH=KriQ zKWH}JkIjF_=6_E&|J7{%*BbM^>E^rNtQ6jj&3D$A|GCEe=N9wrE#^OB^R3UDf3KQv z#^&EF^NrV!EWEMCd>t8IKhk{d)qM)DZ82Zn$9yF={~DVwTjpOTnlG&}{~Vhywwr%C z+kD|6^ZD5P1G4|&Z1cI_f2Hu;+2-%RVm|x39ShIK=I?eie;b>>iOpZf=C5M&nKkCq zn|CQZ9h;kXF@I^9zlhBzE@&$}v6K1p$>!s+xhXaui_M?K=1*huC$afxY(5g3569+1 zvH4(|`Qr_f0qNjm;me zG4F}ZAI9e0vH648ysOLnezSS!9n%YUcA0ly38Aq<;FGU4Y7Iscg7X2kInClGuK@=wXm+syl!o4;kv2j z+E(-0M)TXTdCi*fg==DS&3N-_6uNqidDWH8g{wYoUfFD3vBmt>6+2+@}%(IS~ zR5)w8d1h=bkIgfh&1K`vrH$rbYz}NO`?r`&wwR}HF&D>XUu^cq=E7;_X|Z`~TeWcN zk>-NfoPV}C4?s_BcE@H{Y|f3%IkDOKd2{v_^W<^nNwN9W*gPRNk3X)laQqhYxJL8X z$x{o*TIMmac{DH|T{VxIWFBd>7LMG(JYu4G_yH3NhsWk&P3EDodC0-7g+pTV;8ydX z*gOzV4vftM_HQj5Fu~k^=kbO8Tg_SH&9B5}w8jkAm_cmT@_QF*Tg>W1X5~P0zu5e8 zY<}sB?S(H*G{3lSOW}*{=DuGTU)XoQPg=|`j5j|Yo8{Q_y@>^Xi|M(o1#hD1I!y() z)pVLndl$1b-n5EM1uHg-P3FvfnhG<=oBK4GGxlyM%xE?DZZJP*nR|V9dSS0F^Ru66 zFMM{o`I&a}(|b-Ye7a)pIo;f2dQ)MK7IS)&xqEDO#O8mrnA6bDY3=52UFNP^%w5oh zUAoMj$D2E01b2$f9k-aDs+v;)OpVPQy38pUsVT8J8HFZKH7CX9#Mqn=o9)QZ9-D3G zYg^T9J=<*QGMi&_{J6=5@v%7$xyMa5n_{!E)oh5(vB)+yHpfgf>$}W4JgmbCm}DZ= zj6tz>JZb^UeE)XlEzH%jKsg<}fq@mDr~o^Q|nBDZVq0psOd zf9^r^Ewf}kTo=?e=Uz6SF*oGi0G2w`zd5%$cT4Upv}K~vmpeCqR{jX2JXv@qw-&#B zc>auWz40ts_n@&d_gwDVW?g<(?t0@n^lNkOgWO8|jDOZ&nY%If zta+k&y7{7UL0w1P?RB$qt7Qbt*}2uId#x%{-(xIC-_`F~s`mV{y4l8t+*@_C$IL<9 zKUX~h=6mx;phrEqhw-7?f^mU)5n8IA?wosO%mH=#pgd|Ab2fUN%k`N~?o`Ci z%H5T_C%3n`Cbt?j>HgMxg%412UEM3_^J?SL{0F&b%pmufTuRO+plZ9TW7QGi|~&{F!&fTMjhFeDNfs z{*=p4GN#6lA7JbnKYG&TC&nM0^sSTQ*Nrb86#vBtPc$!x?=e@!oyHAu=i2z5YvVb_ z_3H0hnHtc>GSbFm!GlM-cQ|n;ME5ma@m(oUh0?~hu?JE z6_0&+zx?W<50Brxj4kN=h5x4u0$UbQ+uX=3}7jy>{@-R|Z0T|T(9i z#J{zTTKtG@?9*e+sC)UbO>;KKtBmEF=WKdx?q*|oylOM*+Jrq473#1i&^PP~wVRx2 zZRTOd`*G7Xaij4;p>F8e4MWf7_uc?vuiJguC+)_XT#OZ!^GcJjkDh<@s(}OIJL8`k z`>FPwV7#2)FTWByAvXb4o?yHY@0eeCi!S?fWLSx^c!shaKY#SmI96qHpH%aUIL26S z#_z9mQO+Fr8S+gkH`>i;`*O8$ULF1zfKOY!sSJMX-T zzrtbhGx5{-d&Vf?*EUKw#{Kby@v6ArxYSr~oM~JNyuZYTeH(Zi(Vl5-1!sCmjlvto zXX1yA>PF);Teobe>!0<&tS!%N(CuG^{4b#`JAq0eqvPh_xd597>u?M%I$~9-4PBo% z=H$=ZddEDYXU4JNn&n47y0G^rhyM1%FC8)Ezcy^xu*~?@=NDbG|FSjJ+S5hr?~k2$ z>*Af`w{`uOps#t<|7i@0A`W%fkBWB47VYT3_u#fcm;dLAE8};!9{r=)2i-g8jvuYR zdfj&~Tz%z52X2@*@4mx+{jc-P>AOCD`Ah$rK7CWsTC@86tJg1E+<(^Yd)&L*Zoj?f zYj*%G#`pwK?im<|yk5y5mZdgDgw<-u|2TGx%`@Nl$xrSZx~VXI>ucsSTT8dcHyX3C zc+}io_Q`AJzfl(aLd`d*SjoywnwT5ebPUjw`CktG`O}Af`W0hL{I3s={=vzIe}DG6 zjT_hP|1E5<4e=E%E%7`5_^SFb+vtktXE2`&lleRRBY2hTr$aOsNt&)2S6wf4FTSFJr}w|ma}(Qkh9qx0_B z?LVGa{lee>{=(`fjLv}-D+cg~u>u{fn~1jTki%Gcdf~KBP?S>3@E0`dQ4 zsE5eDvGbR2zrXpd58`J(2`@2r!Qh>RLEIGsWQ;f3k2%q3dHZk1WW9xMh`+i^{+eVE z_4;`p1Gc8F1ET?+tai3qKF>djpE$1Tz!pc_G~Lj7z~d)K9!)(SRrCY7hF(Z%$fn%M zg{W@58hgVqCK--V2)CYM-t_S~bt}yG;%~)QZZv+o-uSJmcat%@5Scd%ZnXl{@20vH zD(}bVm^a`4p6uOBof8~gr_N;FV7|98-e-Nh&qiaBs_%SE>Jb=2Q;ngLMJ9A8wzIvB zKBgXDn=V)s3T`MA56thy;!Z>_m8`Mb{R>pOQv@1paJf4CQ)bluM$TYJ(a z&evC7T`r#-|M&HMPakvXjq~T6{L!TYe?9r|)8qfSXnp*AfBzY0o<3j{H#};5rLXpt z_|>iXsjI(x%Vn3`dP_X(;Qc>(>ZvUU9<*|3x5+R6@U({yTX}J1zn=KMpWP7u&7{MJ1hPu{!Kml*$g`K7fokCaSdpcAodWDT$(BWDfWeCAIJ%|lboySD6QoEv{#?Xi1Nt{3ITg6r*ul5Nvu38#_i(}eWO zCYxrQW^`P6>7`f3FB#)6Sh@0o_>0DGe)CHI;#F6@|7yHT{ue_pt-AP<3-Uejm-?2R zzIgple|XW&6L;JE?Wg{PeLoL-=oZZXRNxT`qdAW2O~PF4mTPOx0ax93PyEf`-`;=! zZ-c)%@svL-jeiBv<7C4+;}3;7&z*8|{AB!m{6hTX$)`L!YnE|?G0&K9-0&6jAN?ro z%6_01C8=)uGzrn{7mdk=84tz(i2IB|W0kQ8YyGVF;=(>3FEe&9W*DC{rmT;ziO+-3 zvIcEc<1z*Hfq!e-tLQKO?lTV`>dv1xbYA|>t=B8s8f_SQZG+@DA4Gn&1DUt2<36)) z=$`zfp|>}xtg|)@d03M&4l%|7bbY#(3NqbS;;SaNAS!O%{_!7;mlnjA$3Kt1W6U+a zu<}2H{$A zK7jo~iqRtdeH-&vZQMAt5RZn|<-4}*m49-m%>2e_$gkuJ)#vJJVv~KMLk%F$cvQ-60fSufAt?2ykEXMbe2MW zQGVIbtgWx*e?3&>_=9b;R0e(*@tpA9eTpLwBOY$Gg_O zvSqKjS3ZV1qi6=!X(7P;D0x0NLN1ckr2o(V;fc52dg6({|NRMLN8^b2uJ{f7e&0B< za8UdJVtg#gCsR&g3`iN zgF!izjF$Grw7$^m|M>Act7k8KVxzJ4%~uD9o_hWK3okrB|M29?&xz+7=dPJEbW!2C zKRkcwgZV>;-dP1|qSu<1OFxJ4-xC=0cF;YGkmv*_uc z#UBsN{$qdN@8?~&;mnJBpT6(oKcDh=;g+9!?s-e+cJDfMuNOAH@Yk99{3eXPaZc~o zcHLp`pWgAr>yU?xPqtuA7NT$9v`UdxT`JTqjypES9oWBHp3`Cp*5ZwzW49t7^aQL` z;VD>Et&jk6Z8zTkoge&Q-Tm>__>*`mR^#A%&p!K}dGXd0<3GoLFg|O5^#NB(ufc~E zt;WB6%g`r}8XJr|9)Sk%+{aVu-s0ZNeKD7-e+~H5+SgeXamS|m;saPB%IhfEUiXgr!yahe@}9!wX6b-JrAr$Fn~Xz@!#2f-8P9Bj{J!#W1DjT>`K7HN z=Fb|sz{IjrltJl$;7vz54ex-#F%$gT8vl;V(X)FZG-?r~id}KXcH~*EjTZ z{_N&Qe%gNS#WQAX*mFyWAMSo%6FwaMSQoc>w zhUVK?@~uiWFjq#G&bs-Ydv2a}X%t?4UjA=n;#MV)i!UVFXv%rmd;wbzE-cQ?Ld zG#l;4=R0(}RlRQmMXPSNqRV=CL=T;u71qpf{d)U`#rMDQ#{G+Lh;!(~HP@gM=EnTV zAN}+8u1+H`#^N{Vj3==pYFto%-8i&+Vs1x0iz3h|VS|lsAETIU{g}FOL-kERzGe20 zjywLL+5d{)G@4%9{GaRdSDktBZR7GMpYZ6Dwtd%UKWF$xqcH)h|4WZwbMIZ(qYD_D z&jQh%=!2r-lTgUfbe16Vc zC9~Xy{rqpX9ZeSGh$vxL&FH_^FYdeWy4!C1!cC`s|3~>-hEB|1f5Y{U-ZHeRe&W#e z-Cggh_J1G!J_>b+EfQ0x^pm@8#ZTSrk8iA>_*O3e$zS4Qbe^VMi%`r&dXT(VeD}+r zJ2}(^F8RYx*L7Z7|LM2%*rI)Pd!X)-a>Q-78Sngl=&k(T&&Rpj>L+epV7xZ;@1Z;M z9YZgnPs8m|v{|*Je&R>83!%RHc^K>eK$~?BCuMs*-2F+?{YSri=iv2s+}3mId280s zJMG-7Z@aC0{i5Er=0#sy`u?kGFm76>1|xs{&DZ_pyF;t$X5Te$&eznM(Bld`nzLue zl@jBj^LDzg?e*(ZIy7`wW>a@< z_~-+UYyJbYU)ksM##QqteV9BY|G`exJuh8@cHh3N?Xy$Od)wPKKRR>|hO}pH0a7LA zWiIHAn*TikjFKyqE;wus%E%QnqiYU7>ubkf;Q#QdzdUyM-JK`ibL`+bUtL>Xd(kg{ zeB#Y@U%uM{Ml-W9k)bHPG+-N+QUq94&!wrw#l0WO?8}ICy z`<{6_+M;BEadoq`?M3tQ4(|sz`1r!z@rAF{&E9&HdFRJBsx}`Ced-$I(=x||2_^i4 zLTPp!y#Cj}+VtyRt&cz4^unJup~M>VRQ31qjpmxIr>eFZIR`k#pe%F+*cg*~N&pr5vxm|}JeD0%{U-iw(i4A zj{}Z>#5)@+>vz_216HoF^4j{HKU7lHNc>ZjGN2425N?xJOa^XQG`bZX9e?}sIR_u! z1(fG}x%}5_I?wg}b33p3Yx&V*R)4tevK^;h_MHzeJ9hPzFTHnl|LTEj-hJsRg=3TP zEbKW&rFR;d3+}mx`c)iIn^>nzR=>br2v5H0xVbAE3-#kKIqI;r$DeZ3v2!mNTNpF` z;-e4#wpqOA(BKPod9(1PgO9xD&~RTJJxHB3#TOembwvLl`59_yceG*U7|-CWX~Grl zxB&oNbG6YOU-y4Fdk=u9jxSz#=iV)L>1b307Fc_sTR~K$V?{&+6bp6~MMX{QV6U+S zJEF0rDb}d5q-uI%il&%m5~GRH{G+n7-|x)aT^38;d!Gpk!|aqZXHGw7uw~%%X8sm* z=8eEbKhlI@@A2@Wi)n%3kz@-KJ|9G6Bf>Sr-OEcE1{VkWx_eO<7B#b5$5}lyzr1zp z%S;wCbH1AHcKz7#>*|gJ&0DCI+YK!&`+UqM_?CP<2xXYUg1z8%`d*KTm~IMi;|}x- zAr(kMBDglLrVt!M!dwLZ`>tnE#KO@m2PWBnD(8Lr+G}ro6j5S0T+zJw3!h$D$=mMR z$39wliy8jb^v3?WzWVO^SK$L{i)kXfrD4+KZL$cd&tkGj7fXaC!dtKycPEmo`kxqe z!r#|F;MAxSVR;du<04LuIN|5-Z$6oKA~>&O_~?GiMvhpqeB_Ab>h~WNyx(bB*QkOH zA58k7Sx{i$2L}=K<&?Ez z<_jV6{CzbIBjW zh7BD$Y}g+qi|yYnF1*x#Kw8>>{+9|1FZb`?e?Y(fmp62t+G){-&C5ED@7!f()Vb@| z&&3oOE>9RgoUkv|+iegeK{hK-w<5#Nu>%F6m_-rOIuva++YhFqV&@P{E;S@-7p z`M$Je+o7iZ&oya$_rs6wfRAHuqu6K4uQ)qZ=L3(nuy5hCg-9wESzVPeRVh5Pm9f_6 zmC=hV^ZHFG*}res=+TiyU1R2VE!*+$>PhJdL#8UdXDY{dbbeHi;z`9z^n(Zc`#;yX z@yma9PmNAqHMt4kze2ZMJqg>kQTR_hg~{4o{)4ctzgT^q(NzAUH=p5m`Q0;YXJ59{ z@hy%5bgwDsUY4*ei8}!E^oB}LH4BXAdHnwAel>lybBz=>EpKy?cPdM=W2@`Ttdk@~aB|FWtOY@nVr-pTF-)Wg)XX-?c_^{I?(Fgz!?tDKOm`!!YG5#4wQU4|MRX@{ILo!#`jfID?ne zsmkx-?mh!>I*wO(w&k5ASq9GS%W=86adElBdvzEa)S`L$j2Sz38zxTdojQJeYHI%6 z_H9~Ej#+T@aPguO7#8E62d|YrQgC@_?b75D=I6@rty<+N<+aG)fC#18`}k}&e;=Fw zu$=Ul{z|Db5$ghNqcw+xN5G9;#m+!XnDH<6to3J~4lFz?xy^)bJ*S7vFXdN4)OwRA zG>v5Kvts&~%`+P}UNCMc|B)Qzx^!i^vIt|^{e;y8!zcR**%y5W@81?ODXQ(*&cnv# z4oe=;e_+OdfXw)qg5bFu`{;Ar#`m4I$kSs+qi0fM6OzV7b?(^3&AY(WtuVJ|4n(A6 z{Vm0+*%KgTDG9Ifub04{P=fW8LJrCUPxXC7>J#FhMkqA);<{z`tfGaB%A5MvX#7lI zOw+Cj^;*vxGF~XEl~% zKL!|4D24|5kKbd&JjkLn2yQoSO!E|rPxlsK;X%#2j&3(-aGg5yUF)}N<1-M(E*g6# z&h|OOx0>!}3X34Wso%0=?|d-p7_X<+QgWM5u~=J9Ao`TXK2z%n`c$8II^hE7FN8IT zmY}&LJc&yvC=v_bas2p>9j8w1$euJgD{E3d$dJC#wKHeFzIyu1wSpZb3%74yxOh9( zLHg}-^=mu*aTm@l7AXHY#L9UF2+&__k^MXP+OqoctTU_*t8=F6TboTc6EPxZu*M(} zU1X`w4t#Smzu*K}`{O0tps;9g?bK zG{j|uutztPd~L*Y;CKsR=k~Yn+dHgH;jmsi(*_(E0>@hK-Yxx2Cd11|jwm0Lj+i$v z{fVBna8?i84r>-ZC(~FZh@@tn$vaTrolSj0ySZBXct`)BYVBE$_JC^bDUNo3YR7rY zdB;P)s7I2cv*Ln3` zQG*6{i%L)Df5SVL(!3zPVEc~Av4zbaER}vTg=~|?6}Thyg%$@&Mbt`ssb=PlYh#>c z9jQ5nw(!7J$CZ%TaNcZj_=spA!)IG7|5RNFc6ofNewX1->>pIEonR;1{k3-Je{6*qzm*(c`9_St2JOE(wVP!-R-{t` zOf+dyN}KeqeCXb7iiXiQGotgv4=ePZMus+ z1Z%L{^~83w-npIjCi@3fYp3yLdqA~z+Our;r*_b)N?nwpuKuE?@0u91Fop;#LmfVX zy)c&N^4u|OGaosIZDCvVNj!{4%wX^Fuo>(f_TCJN0Rc`Aww*Af8odEOcSQbyh?0Eh z2Adp-3JAo3#At#LDO{x9q*}Pa2ki$T*<{govCfQKJ>bn70plW8r@i^B**rbA7wg9w zO?@k6P3ET9IC4%Eyw!J2rary$)#&czm&!kOEV?^6s`5|u*gBHc*iLSqooC~nU z!3G=#y&f8wyO5{7rTFcTTOPCeK+Pas-_^Y5%Eglx)shXN9Ydc_d-rt5qL{d6JLQcF z8{97~WqpaMaOBjY7xk0g{`$suH41Xt_Gu9~X2tLWM;kUM^J$VjII4fwh)%_WpF7ZG zRQ}TW57!djPJ|8ToN**z&;xrl>bfW3pC_~zKDk{fsn#B0A4l0*t=+}mt{darj-Uo@ zUZs@UfphRv7+--+$%u$W(#pifO>U4=Y zGwr=wFsL6Z%Q~EqaWZH9w>@Ld&)N67lT%~P*(=iDp{yfQI%}7a#jiccIP-Q`7!2(* zrcIxIa&MKF1F=Dx2SmbaB%i9z*U!X$V$lHFshca{IFjuB0={u*2YhF1{U2#Bd~&-| zQmvifD90Hi+ijNtqgjyCEV}NtP|!c4?r$;gJbd3?v==(J+peSCSF8v95HM0gzqQ$H zP>Gc~MjBtV>&8$!XeaqARN!hoA$>|TvSl+{{a>Ck`DZ;k5_Iao0%r)kmy*t8TFazN*+yU$g_hd9pvj-MPK+ z$?Zx>wRRd`jH7I=)=qGd0zw{8EwFVa?bn4PBjSzm6^?8e)vQ#Utn{`)6!6WVM@zBrA+ z(jF4JH}$pTH>Z>JJv3x*ih$h~vfm2WrAydNl(2iWz3|EHN=dbLf{`3&jMg4O_EIr^ zrWn6)0R90^37bD~s>&_<{{Xx6rytE!U?--gF?NUZ-kGnESw~uwg zU4e{fr*+UXgLIR+(+wg@Sk-@x&Z2DA9cKyE`x~3;f|Sj@t~mGSQw<)5&oHl$J(Vr^ zoERT+6?}eZr;$y{7PdyTLpIRw5`0F;Ti(bX5PS@{tIij2BU)nA6_VnDb;|zZbr$a+ zxVooeW_%9q)%)X4>()8-?~VQ~p3vU|`#Pp?jRP_2Fi+L^Sf^Z%<;m+&7HjK){Achn z(RwWU31U4K`+5vLjUE`M7wy;EPcQdNa+n4D)2PGG8f_^A9*Fow=-My?hIrCN`VXHg z|C$AsFIn{*F2bE9pzS17CX2`N3SX(n%8!%xt>mp&OuLB$)+$a_>i4%K~ z{b`TQ^)196@i}{cW1PT^$NNi|LmCEbo%>6eLq9;fHa>8pfxsE`6S%Qej_<%3^b_r% zKaTZ}vacVIZ_6e+)-x3Cvj1Y;Lfb>M6V6!083pM-5$kE8jSn9$_(PCVl0~Z#?6;~v z#z8-vU32|LiIe0pAZGT{9 z%tPxJINPuR-y1&r?z`{G9==3TXZk*6W#4^Aa@sh|-5mG{{hchy z(lAbz2>8)4GBgKaG1oUQpO_DybbkIG)`g$%v~zTI&$RxZvZA6geoDGgvG!lE&<>_7 z;8cKeO{^XI3fjLwdkbR(V6fGhXM=O-lqM!Yw`|=7-ID$9qP?Es9^tGl)Mf+B1n;-~ zkH!(OXLL_5xejW_iM zE}$Q9q=lwu9YlM7$Zjg4+=Qpw9j@-aL_7E&$>BKPAbrk%`SSHSyb=4!ddGT5@w0v_@lm~R8i%tpBipeMbF>w690Gjm zYwdc`o@!r{N-=~qcc7SC_AlZ-4538SuDmbWwf?|s(cjxo$+VrXHvVhWAMKb5FnXlF zZU&$*ty=#c0;V&N0aqaVBZdeVqF1q=y5fWay+L+?$M6E3KFS)#@ofljJh?FTJp>+Y z{CXn4g+NlJ)0hdMNq`r_#Pu*He5lZVpzz@?;FGVF=l48PJ~8GMgkY3sj9HHO$<66w zmg6H5Uiw24F8V|P7wE@m2karwjR&VG>}$> z(6z{o9|3oVo2#pb$*7rG)$9EC9dA@r#Af9zzWh;q{H~N%nZ4BK*a6!&m9H8;`)g76 z?)(jYsdD0HLvuO|)5qEV{#uwz?>=J= zBH60U8uxilPHDULo0L~&ybHx;1P4!>j=h2g!^R-!1EPUQt_c>f5i&671LT@Kq7L97 zqFwfvJPp=@>it03|(Y&mcuS3 z4KLni`EQ7+jdi$Yor>W_d;(j;7G+N1-}3L6FY}vHWu=Z|zZ zQ_mu7<;!PJcaHsN&ZR#dMrr{q%DRoO9oiaZ551Z&e!_TrAj`yYWApj7Vtb&AhL@K# zy!RD&A0}W=cpoY8z7yg70PReUfJRXaE8+JFf#0(KR0Ob7dOQ9C7rA zywXzG4$%*%Ql!ZT!=V?C6tXY%M7yW+ddMb2{psF%3pqoshwd%)Hz}{HuhTkF31X_A z;=qG+MR7E51b$2F4~AWz;#koBBef5d?Y4)Yb7M^eAL>ctGXWpm4CNK$JhW3!$fk_z z@}1&r>*IWgA__5-IK38cd;509?b{;e)_QiI^$avRB^qewh@)wOABdES|KK+k(HRy5 zOOUWY!^nslimLJRr?8s%_!;;kB5QtK@#|uXWpnS;kMSKv*I-}LmL+5avPxlRkz&76 zH;cd>-C9WdO~)>(`b*vBb3p@~`b!#6NHm~&e@O!#A79XbCyYN4aKpGbmr~sqy3tst zT+h2`r;&|HY5oPL^+=lW==iq;@7|^ZSCK2C{o;HPzw8))i|%{5U$l=A_(S89?u77R z^zVYnuA8QSCIuNX*({9HQM4z6zOM&9LpDHIGu^NZYS(OfqCc|MsefnDU+RkBLrTd2 z>P;GBRe!P#q95?YpKO4bw;%ATwAwwwO3)5&tWI~jM?>T|T7M}Y_Y~*o+@JXWF_mNo zqYj^Nj8FFh{RH0PQ;zZJUeL(ey$1e4dKR&sF7Rtf$yAFBG9goGqKNR^vNglsETcO& zHERyyjF0FVgC0ouM zWshzjdt?_t0oWeF8YTeujB2@njXieR3sePBnIr>LhlQVK;A0?5c?1s11M5L0#2Hj- z#UoHKdX%%uvrcfrx!{k;eX1q&7djWPPdXAUl>tARnR=*KEM+^H*T(j;zRp@*zekBq zM_5C4bZL+7)@wbw>-SnWfA!6^uk=0GYOyDsIB!p#8{#Eoq^V|Z5oe3Y8>g@zmg0!B zL>x9V#4928XiMzDITjnke^mKQRlH@jd@6TvT*>O~aWisCqbYC5XERuPmd$tY52k&V zJ@~_^zudk1%hV4C8;14j#fS2Zd=noU7xzha78tCBHDevJvVrTA19QwYoUAKP&DBE0 z4jmZCx4-czXeQ~6m??9Fo|?cFpz6;LE80hSS7ZYv{lwosZ?%{h8Eft>?9epp z6NAp9qgLKul9N4Z~R%L%n!vd7>WCX`o?q94wV z^{_vWF1c%|uSb}8Mxaxs)Vc|HT*e37raMfcuFL-NQ z=CyBbog6*qpD(Wb%a)nh=7kGicyV%vHiL3wQkU~TV>iW4&1@H#UyLlS`m6)8`~E29 zm2CTaKixQg?ycI!dM&O3C#HgUeSvda>C*Q2| zQ$@wkwNW;w4hzo7z5*xOC^#!AiR4gsqOYo~JbT`uJvmP#A8ykU^u*_v zLa(R11+uru*j5?=Arp|Fz!iW-)$qReP-Y1p`prCFQC4V$%RFTQQPH>7im9vMrQ4({H( z%Mk0`x4G5VBc?){7)ADR}kwA;Xe-Im5oJM^}mbYWrNFfIo? zAtMCZXAi@iu5j9jNNPg+)mzF_Gin9X6a>-->#1xl_VLkF3&RBVPC> zKih9zla;Ia&3pXkx8G+qs%2o@;CI%NkRkFT5ieuU^~BJGc|op6DsrcH=y~}V646?p zTfgrvtB1azdx|}`mBMNu%g}irsW@-||HB;NC8cg{TthbS+Z#VX6u{BJzfJj*2tj9p zS$i6?Hgz*c`Ed`K+F7BrNg7#{oTQJN5#HNuy)RQdG3sKadurz330N-H0PZjBL~g)e z2WmKSMa$RjIzmv$1zUJmWvzJ2#@hQUPcaQnLhZ`h}_(ZOYnH= zgDYz1O58q?|7Xkxtce;Du?0p^Kt9QHxH;N)WOG0Ow4lb8AT^$nNd}}HHHRRbq#`tA z?8Jn`qem&BBsuA`S%ou;uIn2;ynP}p<#d^P^Wp8CDaqM6yHH}UIg(1cb`>zAJFh2u z4c++=@F&WnsJio7KI^ed(IOw$kz5Rl{TwU!+uMw_6hOxO5UgSUG(2#`78jTppYF#>Bd4!U5w-(G& zKRLJl;nGj+8Muw^@;jBSMc(VrNSi!1O5Y%sU@UpvN3a2SiO3>X5(-^$#FAbiG9Od~ zvr3@^v+7&;`)AFf)SE9e63*>Ph_?8d?sVl*pa(fSrW!M-qaiv{5Z7xVoHCjx~_pA$&fR@8h^=o)8zc z8ZVFJ{p?-4>!%O1dpLyB>d8ON#3g*&NiMC*0D@e@{}px>Pmy6zEjQR6zyYic4tEJM zS4$4A`0*E!986Ih?64y_n6IXg4lO{=7FXjb9%g*1HeCaM@6n^dnz+wsnK1 zvu>6w{V+Q}ADO`|8#WCN`7%11>TqR1wi-hAAesvR6Vd5UiK^2APgnKWnR()!#mEmD z{Or_$uMHmhQlInRtb3)y!t|N5`fP~RNBQ_1*gEg|fck;G6Z;Gb3p;H#SClT^)S{kW ze02Z*%^*c+Iug-mqe}X}Vyg>Yy%Oi>rCBvK;tnS59~SBdl=Keq41^>`YGnxP+jG#? z(tTU@|IJ)?#kX@o5^IfmKDqg-GFCt4VVAt#oA#g7ANu%S0e^Vidh2a;iad8A%x6 zG!8L(zH$S})dK_`%lzsLO;gltJ=n95PlRYvwQDJw2+^u~?$nlj5K?;T&*wTNP$AE9 zQy*-R>`tJcl;3T)J2|+dW_QY+(V^F+W5V$Cu#4oD`tvxCQrrIwrv%-KtVD(}=vK0z zTibw(-%7fr&lhwn9ZDtB#e&XtGQ2BJ%TESsfv%!<735Y=QCkF;59O#VVSa{={JYh2 zcsaj~Xo0=+R`BnY#@k=Jb^hF~SGOyT4Gos_FV6Az_%ybJbv?#fEPeIWq5SZ>x1o>v z|M@OU8u}{Dci8s5kbMBFKpGfQc^Ji_!=m6PBy{3QULneJ=WY$^l)H1)oP!7Wt)3qZ z90K8BISo`keqawKr@DASF-|FB_0&HrUCynSaI1t~l&;ADKrs_>f65=hl>j*;3qg>6 zaEQBqeZH@P2T)>o>pp8C0c?sf^s3jOq4f-6HGZoDB`hIkRZ;s?msXOGBU4IGLwm(pQ8LNAmwYej5%=pz+eC67`EOQm>fH79t-q4ed3H{bC zCqm?=rFb&B$qpeE8kV=0G8_(xe*M>NVS}yl>Sn$oyC6L!e(~bUvH6pyXHT9yHZgJK zqWFZ3?6-ZJxmRS1@p((G7R_*XLq)2Fw0Z0u^L4J84^+}g1`ZElnAeXK04XRdc{3*! zWY3tCKd!Q5aeQ)mK@MM`Znnm=jMC@(_stkIwqZl4A#Uz7imoon8{Z<5{kC}@_u7~c zzi4G*qL^<8Pf|YtjC?WqBZJFmGMXMr5YcF*DMoj*?q%~adcTYep#o(LA{{6$CB1-M zWmosE<#o#w5*J{2Qh?mu?pzZSi@7M@bb&S(WNx`PU)Rt;jBjp-vn8PVdb$|Eu9c{y zp1tBz;!*~p-obdL`xI*CVe4Mi4bn*h&w7vF^7L%=ns42Dtl_P&z+tnL$hCX<@Sph2 z_6>$E1sscU_EeuN0Ouxj3uup-8 z28MfkxgfmTWb_RPV>Ojid)D!mY7gsVmh$tO_^@YOn=iIn`E9m}0yq|}Ra@=jfsB2a z$G=N!-Xvhg9myd_HAhkp~5^<4Skclc!htiqb&WL}#yl1S{PYDSL9`|Nx5$Yz@+85Keeg33Pd>}OX zRreRhbh}M^fPeC_IynE%#gPzi2A{lwGqJFFY#f@5Y@RqPH{fD4+TAgLs9)nrOpD6A ziT_wi1?$W&&{u{0hv8OQH=u-;wUzSezCZU$zR!q18Fl(?njBE`B>Ci7lmRpn?H0Ry zP~#Zc^;xtb+Nm9~k?DwR*ONutNHIZT%_9xPv}Rpv_;abft$i`>|C^6AcGJfBT(kpGB}|O9Wq6x-$whR{fD%Ca{nQ=cb)p@IL05;()h&j2WjII94JQ4 zs6b-CeBwN6P@EQ>htYcg{-$ec(rAk)kAAjUm)H?k0blcNPWm%4-FTe(+?l%+iNNrsxW+q#QW_%F(Ey6Nc1vMr6b$B zanD{^k5uX)*vi;1!ckb5#GN@WaT;{zcVjMmYKyyD0YMO90ox{zC52)+2m#Y=-Ec3VGoIXcpGrfbL{}*mNCQNmNi79r}6Vv7J*v0njCz?mS4c+dt`{7W+S52j3v5B&)7 zIDRBiLs}zCAAPIIR226ns;fmtELqqovLa)k_1_^Gj!J6}Z*J?I!cr5Av`!_BHwVJ{sn;tl4kFLJagAL9Q!09YtnVs zRoXcEOWIt3_F`)HHXDw!*=PqX&}W;d9iJ5K{YAS;+-(6z^dvYs-ECto`qP~@=?Yml zn-$|^BF`m7^XWb-`fnEN>_+k0qW=l>2izM1?vC~3V;spVTIusxkz5aQDTV_-&g%Vb z9P@(aIQoY>`Zq()SXW1XiXlBmyw1^|;Nxwg@tcW#wbHi{;|m&zdqv}8<>(*hfTy>K z#+Ut@Atsc@m;J@~dfXg)f7{FWK2(g~N{+9pG`{T}w0D!^tM$eB;9(dCl}eOIF~02I zO!=M0xBZNE8Bcgl`4r#Va}Ol1qxEA}oJ%YH3CH?T+Fz`{xquIDF2 z=fwE3zuKmdxjmAgpi-(APq4pm|dxV%b80KxVk5D@>7UK}tW4dMV zJ5XI=P*l z7{vxY_)^5Lz)>xp;f|;sp>g zCF;Al_^oQ&_DF8gRemX^osZYc&vb4Xn%X=6Xu;&k1xNFHr-qhWgA$UMDKRN2k>5|6 zXLzYK^F8)HKT|)hW6!mn14KZA;!pZORH+FqxAgVN{q19OyX)*0#}zLl`eY0Z`(cVWkhu-eM*j41mcQ9L zi%Ja1azj;Pq1ez`6dfWuCi$$4Rq8JA9sCXLQU{W;N>>G)k$mk4=Cf1M7+50=KXJEF|__QAOm-BkG7%~}SH&W}!9l=`ilp7x58p5{M_gmGbZH2tXZJT<&@=TZ3 zto+f-nqg>%G56T=4F|y^Oq7xP)G?i@k|wd~V;?6Ltyr}vAA7`KgP0_g>t&lgMf1uY!h75%d&5!}?J0;yt0q1(K!1d2ZF;0{&rN z73|kYE|Kf4+J&*H(*nw?7IxIW*oUng8(_noCg*=&MD9XgZCw}l?bFt(dOJ2j>w_G8 zLjNanz1`r^0k$%f$nu6$UG+1W%qEK&<)IkrtfG3iQvZYLtZOFU$kJY)$?F|&9Tk=U zpKMDd<$oS5aX;&n0}t5_wqp>tR5oJI{k0-CmbpgiFIXG0S9mIG3LLJ5xvZGWpJETa zE$#@{i3k@yBjgl#23aUBLa4LCFzjnVaaEF2jIJJ|GT$8i(o3kkJtiV7BXdymR@Rsr zwTgb8I(k%Q_Smt7{Ii!rQOs-f)SruH#-=mFN$er-gAW7T8ciQmc(SEm<;c2qwzO@F zI^6*QZ!u3bvu)`X{sq)QMOVYNQ@w@UOnzdk+}n<;80o4TE;Z#rBHrnUL7;i-p1LR8;iNL4&eVeqMfwxoz3vTFYfz>dFE2 zYFo2v)R^Syg&L%8ZmXC$waZ znmK6Dz^PGD%#zrw8EO_LBvR2r9~3og(V~BJV1Qq}R*6ZAO9w~0Z+kXibC;mOfBU$o ziW{mNKGUc*5Q=!Bi~2U`MgzbP)^;y%cPz}YGO%0tHmL00+J3EWVeVlI6Gvh4h&}`C zCHStnwCDe7gGZIt5#{(WF1Q)|ys~Z?#ivkc1t_hI;(`U2L?9*AT=69p$^NnH)?SM@ z|9JI}TS|ttT-B{EE?L>4RYmO8@2~tK$5KN9Tda|ZaU3Rl;lKj1qezO3=a%$Hnh}$n z61#Zw_55jPUOK|cR~Iku7U${NvLbfEl&?SgiC5D7C7cm)qg0y!S|B4+ujl_MmKG?5 z+WC?E?f(j;J%B*kcUHaoloI+ZA7L!wPXA!&2-tWySt9^)6ojC{wqz4C_-PeywjWhC z99_3gR-=CYc{Rm4n#xnd^t@gfV_jdi-d>e@eOcLTs#HxpR>&q8->8zI5^n_9V)Wjq zvrKt@uo$usvWAiSi=y{U<_O#whB8;~?s(s3(56nQ^Gp8ZSIgNy*3UX_>bO-I&Bv6V z|6d88Yg~I;E0}-!G!=GNnpl58Lg5J>i)oO@HUjh1G5A0S4$`%zXn%%FU{R51qJl<| ze}@RS$?T41QFPclB7{UtgFEPh(S)k!Ug}6Cp>Dn5Y!c5{)P0~V=sPi^*QQ}U4VR;; zZ*c3VP5nY!6k7k8;pUFwzI}$Dtc4N;87_7Co$w64p|L3R>vxXT^lnlrtNqqI@ST6~ znu|zDKD3qRvU&$-ts?$T#88pF-&_@iqjBO8#ruGay`zvS6uSRQ2H`06%avnRBvlB0 z`!jf`$epD67N9&1t}92OI=XAuO8&cR7uCn*HOjaQ!C+sMsRvM7S2qead4u6E8RNkq z2Efrv*DuIbm?pL2%*_6>4~&)iPA})q=!%%I*iWCo1A9^Mo##Kbw*BPTu}?oecI*@V zA2%MXmA>!i7R+J$StkD5KgT+q|G-bOo~#M}>&Z_72GU-7Lfk9Ju8gAG#GLlnQ*ANM z5vckTQM=YU6@2ZH-Kuh+Jq(qno&EgO@TywQ!}mR0wrQx^#U6+%=A^qvxjWv%!&oiG zgoGeO1%WV#C=((V)xt~;9C&IKdSx2U<&i@447wO>92(uQ2g#9tNl;~P(&rKPe`E8W z&6~BNvrLqrRr1PsXLg~C{VPh(zV7Dw{tj9@<%$Zr;YxA8YKXTV(3fr!$eSuIt+)O{ z3A<8!p=8;ge^&hY*K#G2|5+mQWqBbv(b=IOQa_qYPKe9UfubauMd&aJa+wtnFJK|Qv>O%qo z_&Ge$bc?@fHalvxi?bhLD-iYGEhIfVDkVeo5MddP5Cx;BIh1sIS^u43vv9lnYa#iA zK&vBTve$I)Fd%VRTsPz5TEQ(BiHh+2rO?><(+1lM!%wbZ?9(bFuFIg=ZJWDx=#kgQ z9I^vJ*Hk3FvZH&4L_3`UY-R0&$LI_h;6e19apeDv&Y+0=7u5-kux%JDjyW9(2Pg~V zOyivARC})7wSQxFkE#%R=R);wi^#c$^PY^M(w0KC>KjsIh&vf_VCIoIK~=I{gkOXK z04Mo;WMSc@9~LfJzWlG8lNp0D24(Ng%&cuS?N(Cj_V2s2C?QeFda!2oj-3cA`lqzC zRf|KR&peYm{PZfeb>P5^48otPIYpEeat8!Olcj(qDk%|OIMwiok;?tr$98AGHVD;x z{$kJYdp}&dxm$U@Xekmpb@m)h6deBtv%SvDvOK;*whY5J*i$WGbqlwIYuW~bZyu%? z5?+bJQy_z!6)1)$uE;z@EDQp$az9gHHLagDYLZa2fpuxTXyFf+r}l54yyDuR$Lm7} zV&hoQa^D6=%MpfY>98d=;qxUQbdBVtJap$IczAN0qXZ7V~h%8a_j1{7cQv zr>;X}W@%2w+W-UPo$0toqx8sAQ(@Ms_VXolV7h78$8!BF9ZX8FsS@F%rP~E=5n}-I zt=Z@3aGtUogHf58KkLTlamk5&qLY&Ql_V#|cAL3y>FCZ~qPmWaj*lCdzNzQSBL~#` z6x+!TqU~^NMeXw!AMr1dks0ZcAsbt@j*V{9rf%IPdm1!Ii5auVzM=A1 z?OYSF-e<)9#d@6Whjt5CD7GLhiCC`O6vh4`D5w1TKxj~}mn0=&af_Dab;07YUKuee zJbVNee+2=ycZ*BZs}m+){&3=yYRlQ4lDd3Ibhid#z4EDtEn79)!p|U+kd>Y!={QR{ zkH|P0o+6Hb-T|mB-mr9{t^f5#LKU6;@3#`@5(yf@@?#eQnR{z1`_4mYu^ zAS4{b4%aYVhx1c=@=G&{pZr_{`&H?}N-m##@?#D68QhYDgTx=d$6bQ|5#GTt)EfjA zYSNukzDaPnnz)qt4L&zPKERRnO8)@|2hp<}y(VsDuFI@{Rz1QI5wWjpS9+SGK5!ng2mvl5Gwv#-A{AHZM8I{5v;p*f1b8G@xO_ z#_WbNz4GcS{pRG(oi}f8?wo$Fr~waFG-}YgXZ-No+~M&(TQ`8{LUbq%d;5Q#yY>aX zshg!M&E3_~O%#*I+~&r?!Hvxg8^eXL()!!5r0HGf&7C{1>-3~yidSV*%Z_uzzQj$*NFeLr8yJab^VN&$JC)SG|BsS}n)>2w_CT7WcQmjaG6hHkrEkIo z9fQ;)L`M628Y05F=VOm*Xc-QdsC0=|#{gsc(U?_=feXo;)rW>Itlq_#A7}UY7L`%t z=!GAOx+rmi>nN|XF7#4`eTH{#OSnV6WjDmVs_(d&P=z6Uf&9L-d)>O-J9paE4iacd z;~@I@JPxfLU}jWP#QyW}a}WGXwnK#6Q4AKOP}e+mb>l`JuuVNxR#thVtW0fyeRW6Q z^_Y{eEX37rd&pZ{(377RZ{EGo^kVe-{^JlG3J4UpLosgF*hB&+xOC2VMaA zgRz={0ey?(6ZCkrNYSg>PxLMxtmldi^SMgxpLRyzvzYzG_@*GxYmX2%z5M&{%UMJv zW7paR*7Iy1%lctpzTLV)>0iJ8>;E)-upqGmmaIF7*eJ7r8J&x!YlXS8ei7qZMIBg- z$41_tHKp{@yG9rWWd9^RiggI75agDGC%h*p*aujvbm@R3Gl~@>3$F5K)|5fX@%&ch zfI%7Acz1MPMn=EB>$kA^)&skDtM%B`$d=>smR!5z=1$L!BK~thVnR9lyAo~{p0roY zxySZ1-Z>d2@~{M8WqyjBuNsoueO_wsF6n97V<(A;+G{5feNebLCFzS9T{{1B9aS-g z?JUj7DpQK+o3lHWqK8{w9uX2Ol2Zh}{$I}ND$hFT|JR)N?s-P>I14@R4SGF^3FR(A9~g4VVweTUG-DMD==bz`ty?J zGaR8~JK9*-tR^X`8xx!o#~=!|j@rd5az1yiUo!mm4Qm{UJrXaWkqVj%ecF*rWZrR) z9em{;@AnGc^_Za+<4uoomFuX#u=$HPAgaSoHfv}WkQY@DOFs`UcTK?|&0h&#u*e04 zN*66C-eA4Bq1f><%^S}>_eSOR8|&8HP%9sMoCb419)%{0XLMjy1($M(CO%@p1V&J*ewOv-6J*TX@u!CR2P+Ma*N|J*XT-H}}v-e&z- zCNJZ2#=RPzziaA@ZGT{kpq-RUn}&LAMs*At7}|bPQn6>)+ycRHEEe2S$$;42Q8)dA zS$OL5_2uP<-l_Gv`MuLh%ERsWnEi9cTL1OAmFu+6y?;{umtN2jpM&h;gZaE3ozFqb zoagPC)hcS|+N#N6k10L-IgPW2r~f~`#Zy_!SflDK9>j)<&l4_5ONtXUwcA+4n?5Vn z_sIVEr(J8SKkTzrtOQp@yzawvg+S6k+!b&#iWwySV`snY<#jw{t>lo(Pu4SKWlA@? zXaXMKU5|YZW@d=!-gDHscJ+R||jUOst$$dp=* zmW|%MmEGhoyh>GkGs|$J@g;1Bf0A9h*Ntw=8-3oKtHbnA1KEOI)b<3GQrMgV;~r(^Zr>v=0&{WE*psHrSdqa=4v4x9W2!O{jMs zT=q^DRyKMi&Ozoz{h%K~YcmiP7T6*3cLj9V1etNwJ-ZdGn;vR2kz-Z)haFd{=WqGp zGsFRX!$L!}xHsx4{^Dg#ZNyIsj+|MD921rsX0S@lb;vfawIZ4?toI?#2! zE5=7GJTnuPlD`9o9RYpFlcHqoSQ_D{clmT+flc@Bdp2Fcz|Yu<%$eKf&f8j)$ykYc zD(?4F5p;`lQP^y1GcES!Ag>?!u1j$U^UJ*o@No^+0 z9}>jP=jOj1wJSb;w>coQ&AhEKF}Xu}uW#d{)W5ZI4N^VvCVTj%_QA@9tv5#G`mC?f zZt(sB3F~ms4($ytdWT1(9~XVkieAPuzZa>5A6}d6kF_KN-?TTl{OIj1{10ETdx&9u z`THNxBV4QoJ;Eg);Hq2?raeZb8X97JA@d^7ndE4k0a+zb4WBZdPxk889q(uL3~b)g zhi!bBU*K=*KYpugm(2m@;;e_S+Ic?H4F)V80Nyo(jDVFwe#$(LcNSgF^WvkREs^YP z>niR-WrFB@5FewD6*N)!0)-EXrpCcjxQ+JuR?n=K(L2{#pS3#xzuqJ8$b(+uQjkBg zTEy5qBQiYUQ4EoafS0EiorbVE(qM4pg@wWlMjkS`l!wvsc8x4g+)Ab_wa+DHQWmz8OA5QM5H9{upca#RmRUJ_m{^YIcE?&HE3^ z$boFWUrWxK54zzF$(-`99+S-1LMT^s!w~2E5c34Uv!!E*Dl@>Gs+o?eXMcIYtZHdz zGDb+%BshXq@J|%R>Rww>Tcm=C+4zdADH%!e=8Po)ZY4GHUnyiO_7CDouRk>CJGE%P zFoAReWH1FlTNt%;(tr_VeIs3GJZO>FHWAyVv%=ZN8Qlc;5_*VT@xm)A;nFP%jDcS? zxWmEZP!=+1M_ezs+2i7q|2KQsu;H63RG-O7!xna%?B&_=fZ5e;%j^^T3a0s3r#vz? zPzEE5$TR{kA`WO%n&|2HdFA6+eZ>EU;~`aoTAVADZjSy$DcNB zWBmM-HIKYXeN(*YEFPs+F3^+IkWKesF&_a(jp|!im$VN*Zby{F#Mz{1@g-9=y+%O9 zSUYZ|_SmjbT{@3mx^QN<*u>IFU!#Y%GE71Ae0ToZd z>>Rw^WcK&;psPi%q3+t}65Rbo@bp79c8@Md3wj1GqrUfW`_k#Xa;{xo8q=+vFZQ;F zC)sPH!lz8cnyNhLgUY$w)CD&x9FXS11I(-r1nJ_tl&KyX20-gEr!;1GWKbh8iTE=fOkFv++b4Pyo zQ)!MSkhp&HVHN2CVY8E-$oJo`z?h#ti8k=fVnUivtBHy8uMI0pbF?^x3I~$pLi zkQ50WaEt8$POeNwziC0j?6-2&RXj;~yTOWT(ZpXV17+-+79t#{WWl^c4^}$G5hqvP zS534Y+*O`rO2&FZbogktCuT7oY#n0XDl3y=!wkn6A`tiML|O>!u?)ttQ2sqhgzc@AB8MK z@+}KNQ4&utKTQ~T!d8WFU`7~#)4G&ZN}6?_>H={g{NiQCKMfR;!tzJ<$=-DnZB^Yt84Rn{9(0>t zY$tmjuiIKIxI>6-HG~0Pt#uv9PD?NoqKAXox_En|tR1rN=nfe@O`#D^ixS$BlqL)m zLFicGfJHx1GO^_Mg9e%6j)P6j zo_BSFJKW22(qukza?Sn!6gKy93rNY`awL`WG=(I32`vw1E_e)ck>?p7ivnTr0hdcNwYtzuk7yB zyU*xDg9bgJLb3Xh_Ne#(0r^~6uNZ5BKBGU0HCZHY_`gBML%Z3#K)(LlJIY6nMG&Dt zzBLnj-n6bWdOTS4pBP8z&BG~e&C(kHEkTHy4?P8%pc7TDiQcR$$*Z} zI~mSIv`CPBq?Vl;Hyb(R(cx;Rg{P03URxU#^P@iJm#Lcqbv}%{jQ2&wp!*u@G_i_n0Mxus1FM6RH zBe25OEt<#n@6xhCgC_2rPkigm3Cgg1fAc^OkHof!2lZmVk-o7?KZO+{$JeMLj#~b# zT%=rJ`dMdE-58`uv~N*=Wn~nPTI-?sdArKlUhy-<<1*dL`djR{@hg&lnWwv14Pz4$ zrmQo5bpW=m=mY3Nc%t5BIk;c2v%80p9Vf_4iBy2>=#HtW9rK{w#;LbwrbkDm&+MK0 zbMM~OKf}PGNiFk~N(IXiAIPJRs<(Uh{yDYx%=D<}bZsu2U%V0LNH8TVwky4l=+^%R zj0^T^)M=38QL|QhY+iPBcUKNsUfw@# zY)E-e*R9#{$wQ;NbWMGsU7I#7F?{Qhk-p5Y{doOg-i?iS?H-+-7n@$IrbkYLI(4E0 z5+hnf%eDWh4_5XWUq&X8&OOl6VDJq5lO0D;Pj}wSaPr>L!-tpN6YzBE#|&YCfnf&a zMcxbDUT4P*7JEnVAH>z%q%+3iLvS`QVJ%sBZT8Ncv+=;G7aPSl$$6do2`aC$C0D82 zHT^918{dSUUbO#%cq`RuJVXOKjaPCHi>uxTVU`ggRb$;^)9>BG!>VErXVqU=C+J0> z1O!XgsmSPN{Y+^|ICoZi57&qcDg63B-)P;W{}bmuQjFsctu28s;a_8Wcu`xqs$lA*IHQ`G?!KY$2k(g~3{1fO_7@jLGnzpG6B?z{E)AE2SW>|1tQ zp;th4WHw{B`B?Tm`xd`ty4MWNm0yr!T$k>hAjT0PMq*s zhh)Q~m8(|aGi;KfhtgcU?+yG!D#xT_$BZr%_5}!juK!-SU@~G|-smdbuR?o{fJZ?X zJIG6v*1JQel$1^#dXHZ@DsLqo7F}t$8Lc=*&d`zra$;J)S#exV*s>iGMyNlIp4|Bi-?2oLx8zQt=B``Nz{ z`}{(GOYJT2mrjx-Eqp02Z~wMv%BFW_(nG{-x^`!5HujA&T3-$;zchBV4W)@9RuiihrV8NL? ztnGK-@g;{gCMPeZv6yZ=s_2u90la~Y1TsaQQLWTy56LvChPIT!2tOEDs^(^PWZRI| zp~d?No2{0e1AYJ&qO@w&u1#o)C8$y3{sEI(w~6gJGbA#iOUDio5ecbH8V(N_+OlPI z)YJ~4A%?m`y=vD6>kaVmbgR*zMa$%YAtAMDxsUa!Uq85Y3vUna8lKHt#HY7wU$X|S znb!3Y_D}ahbvFZS?zDO3;!l6gJbrA}|E|w`aW7c&2mJIu|KL&2mfwDhtP9 z#zF;kVz8e%$oib5n}fcP3sg_4B@Y16XFo@d{(0z<^kRbUeh3rj2ZNnV>K*7EFp~L*EC3ESj2_KPS z^+2C~=wlSr6`T{NZ?OKgQ1C?7lzQH~M}2KJYfVEF+hEWJld`pP1Wkdq7KUNA9(ZF7 z8NQViX@IuM{)SmPHvr328`*hUKQ}{jTTjqTld`#zQgUg1h}q=}AuEZurHCqeTfg1C zyFW~pFXQ*B)q=G}37Tml-w^c(#Fv4WR8;WoM~|}FMwfTrefK^5%KEJSj?K*|V$`W# zAjz^MzJkDu*QiMj^EX+a9g&q)(A(mxn#MM6-Mo2Zbe{}kT*!d#UAp-`Q`5z_PP6bp zfB$Bl0mw7Q-a6^Ow>1M@#yLCo8>7EvI{|o^lx=dq*oQaPndX3@lmtxHyHc!(h0rKu z0Rkek{-eLiCmHt&z5*W2^NWmoc@K7q=Ig4zX={exS(MYZIP^9tr*+5hFJM)90`mro zvn1LH0mlzt){Nst-?Gd5XTD=6o(yjXSp}?3X_Om{zA;WPXX1CUI0wk#s@Xx`eZ5YM zsg<6RJh0A~nk$)prJ=clb?F!?J^X4LXlO=jR?Y4qf1h4A1(I?U*2S#v>(BAM#y7h_BF(FIH#5x4uZfSqITb z%mdEQ@$i@>MmJ&zz$tG1mLIeY0G@TP9P#gMaXznEui1u)wnEv4dB$@OKF0RGz-BB3 zRwc95x@y(9as0^i9U=jYp=O;2e<1r9G%>(x9fwZAJErfzexEZe(seN96CFdE3-t9E z6z@Ae(|Dsq$cDDs>R8=G{dc6_s#*{(3~!JGM96l~y@=GtEt=P>JH2Mj)P60q)hp9l zw~Pq)?b3}+n(DZQiwX98HC;AytcbaQAAh~aQ3XJKJ2?a^*?)@hbG zM0YXkQS|>r_QyRYLmv=3Yd+w42k`t)8Hz7#Zw_eNHo)9|e14xk6DRiRlh1z(3MUAM z2W8AAaL>ZL2LPYLkd?)}D&Pl%hmI$3ZXBP=zr&1p4cI~3R@>W@EwT+`{DUzj*|v)@ z3&2*0Ne1_qOTtA+9f7VD|aSlZy(M889&+rbmUAA<};9?L0 z)zGjIVj&?^3o1l0`SbSSc^B%Bu9G#m-k93-SKT-B_|m@Y8AV;c{&}{ZUuR;y4S+Lg zwq>9Jiz~<64-#$eXzL@|N&r9E=7#xtVm?8i@4JX~y76#ZEbiBT(+VE$pcOcqniyv= zoelAb`_N3$)`Fk4^&s6tSy{y+coUr)KL8lS*x^{&pW1A~MU@*-cx8T8HFO z6|omWLXu=FOp2v~wT35lpWCa?NcUQ?nQeMK7ZbZ6p`ylw6G4~?1n^_j8h$RQWM zxBdcLeNox78IzEQAINgGGW$5A%AwxZ2SM9 ztC9M1wg}_LBI;7acadH~bU=#*qjVM#_`>sj8ZMX-A5){YOK=nWcZRnbw`<(Hk1|1N z)VNli`t@2?|B>VleMcd8STwmq$RGSP;b0}#|0!f9!9QpVz{}UbQ%OET)i4Ktf0B%2 z=W#{_IDyYa7-DUcO&`N@)TDB%HkOU2@r$-Hw0X%kz$ggvQa58foro%Ev8&(NVq~=_ z&lsAJ;!5Y1$AdYy9h2uqnkN0nIcb~XD|q_)>C`V9=W7!5gw7XS4N>i8Yff=7^DQnG zq=iqRbIAkU;lKm%E`zW%TSr3+=647OpaWZLVb4RbXA3&ZtY#;{6oM;Mrs~qGw-*oY zJS?ZChqJuexRFn%+?+aY&LV4*Mh4rc7i-q56%g3BI3d1X-6o^<)~@UL3G!Sm{bJ00 z3Fq%8YA#Cs5`~=+N9Ry5!@{I4O&P1??dI)5y&Bi{4VW|}*)O7Hh^J4zCIR_MW|B|% zhsDLO7Z)4y{OZ*XZfzV<=+eliZk>?k#^KXk+N@W)LsiFF)zV+IWg1uM{JjHoM|CRx z*1?ZW^tG97kL{e`zY%`kW($Df2W8R3H%{a6(8Mz#VnsnfihucU1F;?}h9LN=kN1f#sz0!MNwg_jVvZU5Aw5(9qx%-4fQK zWk5F%50=HEqJKo?J{q^VCb1$|_a$Vw(-?6sbgZLBk8wW(c)&<@kzPUffVNSsFIY2K zTM8NjFE(yVMnKw4`j3)BLPJB6{oR^1bJH!!V!hBw6guhfRoJ0&D+=0+}9iTEUoqZ+J>}| z+J&^e-~Pk2v;sf+{o&(wxY3rM@$rfD^BLQ9`l0M@0ojM9^J~75zCKYt*prueBiW~7 zKJ)}9J?OjGrd>%PFf(L_(l+l}i{|Ex70O)>@AIEgkCUS0X! zZhQr}Ow`qrmK(cM4v74YP9|th4W-Q8O*6Y;sJml)+pgM`a`K47z1w@oh&%ng0yKs@ zx-h>w<|Zy}Lj;C9iHnxu;=(X~4aPbS<9Al(gfZUa&E)pLHNqJmfn?5p<+rp~Cj+}C zOy*~j2*03L9>F*($lh%BE5X8OFRsUF5GP~yn&w02IcaC%d&q6oJxND2mrMEXGQPVM zr?31j4SRD}>!C+J96c}pQSEukNWs4&a@WG*qT-?&PgDB_J2~J?=K0(XyOUr!f6eJE zmt4f5Oh&Z~eCG-!fKBeWYj`NH&t5Cz7UzZN*67ryCLUTCs~VY)RU6uB8J!4iQ8y^=XgVTbrP zi%E+@->0>~lHT|hYEh9!Yb-;GVPkL~Hhs-~qMfomM~*$_2P%sD=cG_JR}MzoQ$=6T z@Z2-?IamnLf``#<{H1aHjy0U4epe*EYh^@GqVJ&9NL|$LNc=XI+f==Wc%+nS@9AV8 z7kcLhwD(lK4~mC(IluepP+CFXks; z1S*MZ;G=Se9#Lx*pXeN8yf4Ck%#KhoaGdG-<}SXM4DaKUj+Wg~3&={7`3mX#avbq; z9j4;?Z#Tf9^2P&?tL;;*F&$Mm!F3<>hms+vBG0($n+jskGdA3SHZ|6KAnJF4?)WL{2M_ataD? z`6EACP{8b1qXJwG#NjeqZr#3h3x~}NyM0R?i;6#B+v?bGE;Yv5TEIqy9nIVeyct1N z*G`H#ALIRK##%g}zNeid-fL^ProDr9+KD;Ro_!4%lN?9-8RjU?E~U9z(8;<9a_90h z;{SvaxqivpnI)nfQCAITwHoT9(b@^v$!Jj>FP%xRqmy-&wWK<4)Q3`M9+U}PupDV+ z`DV6{$H+1IS!^GQ$HPQrR#Kw>O^jbTgH^PH=o8>yIr*{<8QgCbn&Ssa<*|)KG~LIvx(-4ktuVh8i$xGjVTyo zLbi{iuR92k3?C<=kVFwNAP%l1Xs4sax3%|xGe+c_!u=uGVeV9e z%8>#YiAifa=zrKcU_fT(=`*he#BbIAz?v@a)(r(jESTAzJplnL58@z>qM}Q`tX#?O z{d}pYXz0O%OFsDEDC=_W+_|&-^652emZ59R8F(kz8}~x}T_>tqjy>I`YJHUZa)r2$ zSSLK6T=7H$dLp^W7&Rz^{cxonk)sZp;U?SDnY@&#E}lmo4RTKf?K3(kXhwv%{{cS3 z_JwwO;X%;K3Me^fKL@cDCy0j1@wl&(8{1Mt6zhq8HB-S0S^#8KHgHIx#B;DH2CINO z#3tevge+bT(m(Faw@&d34(u^@YQUNSYd&(R<>1;lYIwhJSJUQwo6owPGIHX~gUnW{ z{p97i#iiel9DSEPVXpdZ-?VGqHotF+xbgj)uipf?x-H&74 z9e|6#M@J`A0m5gk4^As^c0$T!5u3>tY%J%!PDCdiU>cslLT*3r!Oe6syU1tqS4r{w z5AMdo_OK4j&KjpJe8VpiKG>rVioeI!N5>+poxzWehy&K+Th?(uPc7tsxyQEbdO+T< zkC2nzZUvJqk%MMzHo)q8oa;{KmxE{FO~iQ;e3WVp01U~Jz$a8$Gi);o2!Y543|~0t ziyvNnJZe_f^e?}do|V-$a4B1MVGIxL+^$z-WX}8zF>w<*XwB495&3ieSN^6=`OM-< zVSr22GG-dgn>Fq^;mYNS=|3I6keE^j=q2hC$f?L_^Q6%LlgUvn>V{QYMzZKA;;zsu ztkgv$*He-R#NFQ`FRp)R&w!dyyL}=f0%F1=LqE^Rn2tgON+hnWZE@pz^=icJA{%v= zef|0a2O?k>Kw?IT$R}S78#4B`D_|qcP~JY)3bAo^kWERavI19-=1vZY=-zWx7q`ZZ z8++;RGfCo(as&OOnJheNN_uqv@Ca>7XIGz=EhH}_-VONZBff^abMlD^+=uL8g${u! zih~XxD&wgP8P~-fW1^L#-QOP6gx0LH2#P+U;;BZ~xd_@Q_?NjNfm%ok0AmoCV?CYuUApoWD4#_gL8)1uKT# zkuKq#U7(}TLxjAE=scXn|`n?oQ)*e#T}IDg)ZF3Hv4${pyS| z#n`)pC+^2J;E#L^$~5uw1(JKUQy1KrP3Bh*GR>Iy9~(hE4;hs>vk^E$boxCwV`l0~dy6!72Qy2pm5YVBv@$a!TtyyxZ~b-F zvi$rf(s}(Q_Km(m0(p1`h1e0+GR}o*&h-Ww-8)gc#F~G~e^ux%_B5S|AnKelqwW=7 zX`C@P8~7UmxZE0#OBGN z5rN7!v~R2w??4G2LuH_dnp=@@SIG|;2pH89*;0bMSQ{uEU{+b>MU)lsUevSK1`xQ& zkR_7aN5j;ek}O{vmwx=SCqG>*n>KFM(foTj09Ft@X0>rP;Vih6T#i1>2qz47X>wvx zc&(JLZV{d%Z|8HaC|kt*=u!RmbXFYkx|4VpoJ84M*>OY5qxASL_JHI3fa^ zIa!&ZeL?08U*aSesCjg;HG)Y_*eYbZR_EQU6}_Sz?!TYYyY85uk_=W(o>{;tTn;MhxbDs_fW!9 zt&ANlD?8eT_?iU)%-u~|HJ?8}!xj{@T+*`ZPaSfY_^eZb=3jUa8xAp5|c0{zjBWGIq=D)+u3Tcy$czUqA;D=GI;O10|wX*6~r zTP5I0$X3i3f5o{$num~QVV6gY0nud!ja(cFG4Ppwgmj6QP5nbZ0OkOkg_@}kE&m>J z#XRW`J*gPrLmyN;l^^I_flrNujE<-d9G66Vn}Q#3+7s5&&)3G<+MKvI1Z867-fpZ% zXj$hmtZZDLcI?dCcnjACKV|il5FI za`)~Ix#jV@jD5!+m#($s&t~npM9o%VB~-covhS1aR={pg5lZIMuX$b@JA6LoaC=^!`#Z; zdgca?cCk;2WKP`@nd}tn8s5MrC{t?|%70r{sGlq?E?mayg*w+RF{#&s zKP(!_gwp;)Q?jzA91@#6^Kjva9ubW7>M^1)xkoR?B6=YBd3atv%4WUH&*S6OeQuGT z$2PsmOi90VaZ*b8Q8_ea(nV}}j6*W&Q1PAiGwd5vqPe2l3dpRhn=CnF7x_6l>S!Cu zUceJG?+)7K^Md)}-M0nr}^Z9yyNK6>jnBfz|a=_uGG8W`psgo zoxaEM6nkNZ#e4^9`e;%RO(FKax1X^@Vm~5o1c?Ju`T!AZaO8oppE=2!R+bc#BXAN= zIw4#J<5+#KN$t8N{SUWm+Kw6f)wP}J-Md3?n}*EDt|a!bXVZ54A8|9r>1fwgePg?= zF>&~%=WIB9{+jL-wSm=MJgtLo>X?UZHSYY(z{oMIHr?ibDYx|xlU>?vZ3md7@Hlaf ztr_8~7DN}s%An0bjg=h879mRc!xka8DEcn9q+}-y4vlv1+__>r&&ZfG2`)fbA#8aX z%e6anOF9c1!);+~IHc{V*dbtlQ0x$dD3otQXQF3;_n}X<_PxscWMu?GKcd1I7=icv zNJYGljP%ail?Vy(t1th`N|Ya@XYg?u=|5e(kTI#eHig_Y$|g#0nV+we$jFEP-6$Jp zOn8H?fVV4l6@v1+4Bc6^tvDi2_4Vu6@x6x~9v2Y!1(XB#|@; zl0+y3dVBlE21%l6{)KB-zkgSX08KuE&GnJ6Q&1KatLOupEgm+q}TO zeuFMCklGDm_rSo#6elX1+=Pku*k3qL2Jp_29!!~ntumBdx&iF;T zH`4R4xBdJiM<>ZT@1wz=uz{@P?y38io`r?=>u^;1aOWrdyay~8OQoLSBhO#w*Z2$l zX&%Q{u?TjF-OO$i>3u_g-chprYsE6AL7$^}uEtR_g=&Ied{7}FM_>y%`@kH6uAQ-I ztiLE?0rgt(^kVijuEoydtijixZ5+8imU;6l?4)y~{)V)FrsKSVFE8?F{(vuH34dZb zXgh_6>v{vOopC`XCHm)1d<`AYY=kAj8$z)cQGS)D84S@Nrzq7VA%w%mTo>cl`P}xu zN6m4uX);%pHAmC8ft|O;(4Cpj1;!&(;y!4R& zeEG+sg-I=J=G(T7nPt;0Vb7j~gae1!`p;PXEi;4pi7jRP>gcf}Q_uhU>-p4?V>6k1 z*%sC+CeIgoBHZ4NdCZGy4z{x%o?}gDS$T0|marJtT>xDq_sddB1PY>gj4arjCcu z*-}7fP5~dFIgl|ysE7m>%2F^?QZh5O@O728ZI7KYJZ}H~xcDknUcJa|TYH!))+bM6~SH<1prly@;nC0GX zLh8}7)Dfkn!3je&S%*$@{grJ8XRYqxQ+K|#Xa8wqQ)iysv^Hnm^w1v&_4nK{loXZel|Mk zoAep>o_3CQ4eFZIx3+28xRFhOPj`o3hE7a+HFH2vn~psrrp0E2`S)HH64bJxeV0*# z0$jSa>fqtp$j-ib`_O^?j?MORo7PSaT5ny)(axcfql1+_ik@g2TDG(GJb7n-{=(MI z-Bw4mc1{>DbLoVJHr^hv*qazT*@b#{@7S?(o32hCTVhkA6`M;4)^IUm{y;mlC@{i| zs=%s-JPOJ!p;W7bpC;?cUnp1fwUn`K*suYsxA$vm{bjSr)#ZP!T(#;I4_$VG)xG)R zIQx+O`pvxjWg`Z!^6k1U`E>5eU%xCxX7>Cehm>`VhyC#%;Ee;}4YJh!-KT&nRfqMH zU!1-57k?|&THB{jc=qDZM&@OX-DZ4#^Y7`KdBU9aKOEpc=dr15!0FN1pU1phv_IpM541r?Y#l+SoQy#vRZd}{sMip^p!kS|X5xecQ4t8s ziHPDh`~~m9;`u*jHckDlExR9a_H{C|;lHpbt$d{RfN4Qv+7XS12%&VgEOoli_OPG)YrhyG0MT8gH{u-HdAUuW;ghXZ!jMW#eVFG#alaKKu>S z`84s;XlgApmK)Z$M_GWBTH1!2H#daVL@>r)*$y44F`do8T!8ulw2(I|1q^^usI%s# z%8pfqzOVT2QJ$7PBgaj;$1M0uh_q`~Wshg`Qx@a~_FXt^*5Trv2?+@UckhhTA{i-c zYphc{!QCS!Wi83r-Deg*lcXQYH-eZnV%*dE{?#HZYse@Uo*gjzaeY(c15099e z(<>?}V&VL-aIK#-C2VJ~Z@cZ=^}lT2UTs{(?pj^>-&ZH%z^2O=FfPSj<&OQ<6*LV? z4PNadoVYL*QPmqwm(n-*$M%=P4);3g%~ow<606T9aXL%59d!2H+UxIoPu`t>t@zqT zHnLbVq{1leO^$Y28Z%;PJQwdJRlF85IXp$||1OPN5sX|QF|c3%-vx1hNaqzsv5;A$N0#r7+~XR67QyIHuil*t!7IiATru zj`r3t4WgkUc%bxkSOotECqjiY;|R(1#)rcaoRt;9$yq$EMEcsh+Mz3uAypqVYN?Q%YYJ1}dchh0bUv4nqftDkMR--^FFvK&9ct!J&aYGN@bqW@#98 zn>fHx-uq$QT4-MXC7L%cZdlo?iI^v3X^rAb+$yeVOkeyl_7bnQ>$f;45v)8?q;F9?`oK(RN43MZ(qr z4-wu)-iVp=#EQp1Ruuoe_@81ReioaLVnzpfBHQ|=09^u4BJdvBLWP9`mA>9Z6q4`} z9PaE>{nVb~7-1F_s4_k(+M6Bb5yb;#pK5rLD;;^V6h_i2M7da!mR7=kuZAirE+{Zy zp*3LQCNIbMj1k4~w)%bOAyX+10M;MySVdpKd6A=GTY{Q|^RQesY2y4;g1wD#ugd#Q z8h17c`pg@itZf7s!-nQ+suNBoNL8@-60{XFCe@46HadDW$Zu*=+IYUFlxJ(Kxigzm zd@)ryHi9{A*{t{1;>d6w{PdM!9P&S696Q7~oHf4GpP=6bkQd?BW7zrRcQ=9~$_k`f z5=f5P37QX2{K9YX?JR+{{{55VKfe0hQo5%1wEXP7Q8<8=0616*3DeQaRMPtRnwuet zTOR=7P=CI(RO(QA`@7$N z|Bl(9@k_b6(gncyu0CH%Leux}ea*_Kk=urIT=p(o&F|4sHN*4+S`w7ek91F z>lEgVGvn;u+~roR8$ZFGtMILiTLGLfTjR~@ni>3LWSk*8IjpmCPN_8F9=DQAj`5(M zN`K-($0ZYP{jHP?ENCKqr$1CaMP~ddr7I(vxI$hiMe3WNUD&QQuGnLUj$xh}08G?l zL|I=K*d##Hq0EpKUj2YdsXo5GQvLg^;jGDXSMgI{jIA(oU$j1L=O;z`%Z_hfzWU(Q z-XA63(f)Gt;PhRNP0!~3__VwIjR79HAI$rpC^IcR%Qo^{GbdVitRrGl==>p2Y0zo_ zi)r@m*YEygztoqaSu~H{Hr3vJ+f?(&K&$rBS1AYNv+ZK$xi) zJ=6a!IiKgP{vabY!QdbY!3r3lf9zq3-ypfg3%pG1UMv=^Uc{O9z2v5)JYrB>Nt*)r zaN{`m1#MXVw_Y8~zv62uV~DVJl{}if*y>yf$BmV_5=Ll_l!~L2sbQcukWXFn%J>fBXlUA;$DCm} zt@-Q`Pq)D(jm%n%(u^)&BaeYCcnoO4d9*>baLM{d!P3??UcR*M?y?J!TvtTVXy}6$ zF*GO6T)%#%?9A1xXUcGj&SmDq8kgZ19WPknzAw{kx4d%h++|D4%jeEru`D;WVIHhD z{DW_JtF453Ga8r z^H@J@I;vSAPR^h`C(q-Hc3e1|md1LQNl8y%u?>9kmd(-ygoFva(^32*`oV5B&>Js} zw`5uRPg$vCd8CAhjnW%E&rcYySNo~B*9iw4R>f<8OL)1^QnOMifRhXe~!wK6mW9I}#h2L`*!s@Es1iuvOu`aJ_k& z3&{=#A!7e~DU8_3JxQ=zy{B}I*zNI8erK&%BHzky|8jx_A7l35x2*B8yUY1dp2yeo zp``a7!`b6Q&~5|rj8|EJVFiLX&CJ!fB}kPNUneVUPxC8+>n3F=(RJn5>TTby8oWh} z-S+ME_|K)K+K6{-+XedHnC;aos_pys)vL@_kKLmmCEzs;_(L|FTEbEYk2qlwf^C$V zu+%T;>cpJ6tPy`aH|KAb7XRegPwZytZ+w%+eeMFueE!>5X_?*5FRnd&;{gZQBH*+* z?^O8RgG3)mfMH$aGBy@IRYP5Agb9=3#RWUnMkf*ojg5V6RC6?KJE^m%GyStpr}0J^ zyjSDewr<(%(ZrxbX2z3_&)-On=MBheya?U@CBMMhGW*Aw&9_eeXsg7`R#`H$+ASyL zwa?6d@)^0JFFeIiu+NL}>z0P*v>A8R(^dmX`E;hDx@nZ81T0^|w$Yz0bU7mVV6^md7pO6JWg zzdnDp++itC`qsBuzuRo*opLX#5y&62y@Ga%Gs^|+Aq!*Q!r-Xuf<8#bG4MO(&tvpalJ94HH5>bx{*rWn?bE*& z?c)3t5uZf-(vXbz-<(nr*3^?y*2e_o^;x)n0iBXEHG6cxN^wNWl`-m}DE2rL#WgKH zZuI&A!2yHp=roi~%LdQJT#A9K#+XY@Ua2eKc6STeV^L&vZh1CBQD(}siMG=7I_OGn zA~qV?Rz`~}uBh!aMmyDcC16rq$ZlWZGuWYz_=W?8>inbhF_O+l~;;& z61>t_7gXTYS=w31w?*~Mv!8K*ohyTqbagzBK7AeFQv0Mc6@_jE$kWo2URL}Y(tMi! zQpBGY@~66oANL^#mIJ8;n2D#M9mL|{y+L?S_*u1QL1RoHT>n&|Xl@O$SSc zp;{p(<_iVAGLA-+XD~J+>5G}o86TID5;uMh+wVOoeBI5P>%u2_7kNz%UwiA;+VII< zY`@_Fsm=2XJ0!~;7v6S~{1bYCGsEA*I!7cBcoHJ`8S>2X%e@lx7v!(-sQ$%{3m7KG z?L+t?#ywEXw;20#6=3r&FRovnN1&fKkE$^e{CIEi`~pmN1D=N*LR7Rex&ky6QLn%A z%Zmo}DQev|fz>HuUkr&o%Ix_clR9=}f4<$S^aq~yi_%|po-A)>yNcc%EoLP}tL3Y2 zw<^67Uhv1d3_MS~{~eyJ{aJYdZ_b}@7-r>AL3>E=v}jo=@%m-v}5d9t+b!yP*c-)e>SDR_f%*Ma`;ZuFbbW^^*l3FxD^lGYOS zA^DkzEO6hT9?FiBC%kwuVX{7__&3p4GK+{$K+Ezt?nhmr8O)Pxg%k$`{nw9>LGWOp z5Ak62fHe2y<;&)OYR-`nSZBqd#VeP6@Pakqe?KXicQd;IZ5>r`nqNLO?%VNci`Ny& zH&>8-W(6NRBIzlA_8lM4e5o~See1@Svzz%_K|3(dNjlO?E{ZWto? zVwVH7VcJ!WJCYLDE?c?y@Cp<54`*h_<}X`5ujD8G4{M;w3f>+2VC3qrcg2>3iukn# z3{FSt4>El$=r zC_u(KS5@mX6V!dhhEq3goaD#(@u+^X0|^DIRZ_3us!HxBlSsfL zQ}FO%fj)VOs^N(CHKVY;##D{aMWvm{H3orJwlA;=wnzCRK|xVw;Tz^!#Afh0zX3~6 zy*>;S1hZI8yLL6d^daA`(o*Ohx@71b9ss&PLod=b$S7{8l0z0nbJdJ3Ldr=2VHu^R z#~LjYM~9CYJSc^Z2p?=CjnywT&d7RPd4Bk{eZ{p5CO1~A_=byf$lW1r+T>@RFX6wf zF&rI!{X7+cLrpK}1%H4BJL5v34R8aYcg1K=)B)aEg#=Sdi+q#F#PvQ+>p(;uSa*5k z7!Zn`zs(<4dwyZzBCBx=1i3iet^bPO6TCn$_T>H`HjdY&SxO8XY-T#jO{qiHGgRNF zrtup!%ox)JUw-qpRR89(bmaOL{ty30YNUTm|B<=(o8+he3~SyBYd#q`@bC9!Svz_E zohwDx?(UN!_RsnH8#SXChjr*bV%zu-fitkt)M|c}v(c zotS;i@fg4>B~^|K7DnS*7}tNdE6c{U#Q5&)XGVN=A%uP=?VI~eT{?*H)S=nnAT!`rfNEiX^tm%MGV*fQd%mvpvlP- zU{r_`|E&G2e$4P--(>Ap zlg5oLn04Q7edZKR7_=facSs8h_ntNmt?D;v9mC9SCIy7D-kTF*Yt0_osJ4sy5+@ti z-s@Q1!~qfQJ!-9ITVq-{`W1t;(G-W$9HL0X=DMM7ykjyA;bK#;U`~ zA4I>P#FIqlr3OjpEWK^)o$NaLRv0}heZ+J2vyN${6K;eI?v&BmQ)`L%fcD$;Cj1if zg;vm4eqL@NO}rEBWlDXt;;}j>U6bm4C^YijKAe248#~%{@~wDOh%WZAPHBZ{H-i&8 zX0-N_?;E;6dKGn{9rb37p$qWQN}DkGZE;KS1CQrg`pD6KSBF*ejHa<^%zNnz6@od%W& z+!y^&?6GuGL&}9tV}ciuLkoDm!d%R->sw+B6oh3kP9v7z!UEBAl7o!6R&xgnYgzH5 zt5L1GSG-49*X}seCCJUmb38x4?}zX8Ik6MC*TmS^iR|ix*pm%C`KLZO|CR-L*~0kI z{&EK#_u{yS`N^a8i;)YwnBTjBYWfy8rJ$S4lE1vk?=#)RXU{VDTV9^=?Ab&bBVxpK z5r7fJ*}A@Oj7ExQTdj64;jl_mFI~iY23OiI<><$$v9YNiA5Dorcj?mmhO~=^7JqiJ zh<#dg@w4))a$@;bqRS-vO$MBrQ=X2iLVB?9bfgkR9aD@JHm8VR^CCe2g%Lo!tc@vp zg<^uM-LpYyago-AO7fL&%P$+_#tv_v}S<4n-L5>HRnwS z)x9%o!=w%5y2h*l5Rr~oeb#o(R(6Yw^v`RiGck2<)6BHCuKB8fUXk5aHP_WPZPv!3 zVV&AXT09w(m6iIug|1dzTT5|E*Ze2k8u=U#)oEza#?rQKt%Agivf{Zz>zJ5XTAG>E z8Ip1I)3hOUh0-u4s~6?Jdb)j~i3y_R=-Omq{?9*cUsQRG{V}TI`&yR98AfjAw=r*b zO(X3q{594z)UIOg_0P6!8{1373 zgiNk|Xyk_bAdfP1KKv*=kNo9`uXL=6aH=Na(jJ3R##vsI&oAuQx37j+o0YZjOBQnE z{0-KJrCzTTVK?zF`RzGt^!t@Quy2G-g8HBpF@%;Fq-YT~Plh@v_W8`5g$tfX_UsuH zj6*5555Uj%Z;!0q@`jmj+EiJY{^~~)C+N?x5{%!cqEH?w7Yn*&?2bx5?rPN^rSgwF zGXC_C)A6U%HcdDaeG zv?^PwD(ulwL~N+LNVm5sTXNp0oAj%}{GYhGKut4(Rtu#ve% z9TSr}7UuY9uUu8#w6bkzuU=t|^nJ9=jcV&6;cbKdO1zgmst_?8YK^j5)u;Eotn9$i zY0OyLd}Et%n;iERfq3U7>fc?|4TUYmh&h=-%|c~6e(~$CrcBkGW_8wV-Xx2)sqtK8 zoxF=*Ps#jBdzJr@BI5vS!jm^6HD4LVz|0*zwHj9|7k3v#hQAp(mCZ|GuCN=*e9;&D z&q3!GX_4BImBDgs22C)oOS*Bbzl(XU^qVo+&>CV7dl>~FHYuJW8kw^jrldoFrmur_ zjSKDnuix+=Q3SVFuUJ$PT+X!1CAw5=;^Oj6bj>=0r~lWtx?jb&hNk|a%c_<&Ry8hl z-PAHmk{R5vs{@pirX1g$}>f9#@Fi--`&sEM$2rBweGH{CX52st|(9GqeWF9!DG|rNAVRbO=r87o zI4ooGmynr`{vVNcQ@!!yNF;5_{UO(N^Sz2M;!zBkPTzzQ@@ z0X&&q=|5}r@}(T4pTJ&n3u#S>w626(l<3ERa8RU#`~-U9zu#&4@+EZt2gtu(%ziIn zr#JC$N_bs*=P*y!P(B81QjFGudZG0&Q-jl>%28w!8(oS{C$h}qVpiUb_hiVujul(L-?Q3jatn#{X^~@AH3lA6L}mzdWEn@d(!FT`ws1`7}OB;{rLu z&1jkzq<(ofFqrg#DSVQgg4zwZf1B=Kq5EQ;PH3IP-Z8}JRL=QGsYG!)?9U8+aw z=$)(PC)yyN6vb#Z0N+&nxk?+={Fl9F6?xY1U_KM$SG<^F9N5DYD+C=2ZTMj$k#$iUIzZJ~sjXtPMZQ$EEih$6TRvh)u>+Zt z!KpehwvfE4L+?#y!CW|2`MEno72hh+Mj8`zHB_PlYgcO^$b=O>UPnsTtrHMZBbnB% z)82iU%a>P=X3~tvRmS8?V*>qE+7cU1%#YR`ZNbkAGG5)+o0g`toR+Qkfxp|}@6|TW z7V~Qb!O|Gx!hS>@FlBBuCdXD%MD+o26y~WJT%{!wE9q3QafCE;G|YPr8a67nD`{eq#9?T_Y71dgDHQ7gR?8ByZ4s9Thzs@5mq1=GU6-=iLh zNK|!MQXVEe*6KWyjZu%PlGcdM-bclhh%v-YX6{HHcJykG_ESAQ)5g;Pln63?{=X<0 zt-~JZxv<8H*e+!vn9O^rnX$%_#waI)ob|+kSk=jye7?K`nMrF>v;w!*aE2&)Y!B_P zM%|1CfOom!2c=l(2ex|pK~$lR;tI)yX{CeV4Ntf$e>V_mQ-|@RL!qT_+hkKZtSUGsKcWT+KbrVyaOUH=4?G}}s9o>EL+>HL7o_*7@ zW_IXv_+Uwxot1^%4jc1Ymd=gbyfdz|#yhq$)63cQi>;G4T%DeMzj#=~u^n=juk6t# zdH8_9W*#8}6Nk7B+qHZg!2v!$%?r&m#GXK}wIC4CbgNB_W+Xr(0HXw30w{*(02qKp z1(3E93IYaJmdSy$Kb_ildhh0~`cIE??$yw-y@#z!=*S)&M}#)-6YJ2qk!^EVSL+5& z&Ac4jP3qjJYqtRVX~*XV$wp0^*_v23aWS=N*2GL|HuuZ?IC-Nkc;foFVOuA5sbl7v zGG$J{;4SIh{8LvA*!XLLg^9+*qQNE;v%1FiEzKL5*Y2D5`BAroq~RXnBfB?s3mqBw z7ifJdcmU$>;rpJ(K$Ai3O9c-|1`kkb=uI=4E$)9#c#hcd6Phu=bNIzv)tyXrFQnzz z$Q;4L+_{7(KE;KLec{U=iC!6gfaHXITcD zc$T}oV(EMtOD{ofH2nrCx%@Q^8GFsprztM*nw4_&htiIwE}!_~#lAoPR7U_S(ZRTq zk3TMnGmL`XS7M<7PX$KAoRmRmqDLGs=Q(`tS%gImreMzKGdx;=jLOf+jisY>42vEX zJF27cSi}pxryY6Qh{7iP8~*hfwvgwYWp!AcvwXDxB|FMPr7+2wPhczb57af&EmLT) zh|8dL14R_;woLi}G`QSIT{|W0vD*4+_+#yMg$DoYU4N-bVNp@}20jk!I6hClpb%kY zEiwL0fWt57*U|uos-O}wUwCOc9ywBm7|#*Ilps$93>QHEm>>TNp`J;~dMp4O0x$+d zdKhqyOcvnPluw0*i*?-u+@e@h%0m!_bnqgCO$hU| z%9fm^?mo(ROlO}eD?2q?su~XS=NG`FJfsW!x@d0!WL=7vq4qEsm9w|vA&dcp+xe7N#|FK;=e2Q zYB9#~yU3{tM_Ur=Vt=or*i0u;H%*Pjv~V;E-$bXbC9E~<0kQp^#1Z#W>S3X);D|}&d$A- zIOL097niH2SwEIC`awjOt=;^k6VnR{rqg)pfu4Q~JE1GpKcrKu3`<7_6B5V`E>m@M zc%m`~iuuloj$P{E6=*YZ?vIxzXXWFN}AsB zyMx=Ub96g5XWPnEZ{m+94Y#xN-rLgBI)4qDy)Hh!e}7m`03W_Uz{gnBN>e9q{2n-w zpaalU1C7(6|+mrKVy>NKU$dG$OmY zYRC7&e?0J+JmFn|NO&eutp>v~+6De#i9Of^7w;8^gnBPpcQk+Ajr6-c8%V!%pYg1y zh`qWaW!4miid>ot4`gHZJ+tg& zdIZ&Uv>tc3EicixFK)eqxk^5i5K_Wp(N=Se6~T@QJ;b{f)f%Mm9Sx3BemnjeqA*AG z<M1O+7R*u?w$i=X#XqEQyw9ngPqVx z6DV@Ql;^3Y6+Njl8WpBIZ;XrOBEMy!pljFRek?{@SH_4-uoz){;(N6|(k5z8Gq&nE^2->Fia=|caTp#w zuh1`1|5Us0U-ZiqvhXP6B&qZZ&r_bEi`u@0cpjD#+*j(KiuS$fX<;Y9{oIOEnyEB@ zHdQC;C4mF;QBrtqHj zG@$m?+M|4ltqQ#4KgD=Yi+P}bd9Jb^j|pDi;Vqh<1Lhs1!Xrh%eotJYCI1iLDNxP?-()uPsMnE zlkx^-{Nnj{hkM1&0&c2lz9{_pmx+jDz%4cqg>ts#L` zhTWyr+VchfF9v*I$8@zO&zvEMpqgG(#H9LRgJ2Gs*3QL*FMLNqvXg9&51UpJ?vpM} zsi`H=czrP5-!WdYlQN|&9eRM{0J8?cB+X0y9Vs9oww-z&*t6dzqz%7cU2_7Ve86qo z{I3p8&zDWcu1C;er3OXqlRb`jE$A@LkwtTWEw$^+phIP-O58No3*nJl&nU`WAwR&z zL0BhUE;CmjM9Q7?X)czF#*6lhFmCxain;J_SA~S&Ao<23 zORW_vTO1f9IR^&GtKWD~=CYJb?TrAQQ>>SXl2Zj83ka>YCn6Sb&8*vZ%y{`Sy;FN> z8c#l%nwmNmd1Ddr9a`xyZ}{gKS;(|&b)9fEf{w#XP*z7I*USs=2-*&SXU7~rteX(L7a-23wTlDb{XHJ>oPxAy{xrTYx z6Jx3j(V(trP|A>?qL5b&G^S9sI|7=kq_uv~4#uv8aTgq93{?Ix4F7CL{_UeUUz8iYxHqFklo7z0D60 z65cQ6ylMI<5_VN>iM-$l9}&uLO)vpa5qi2XwP-7#bBC7u2H)a+83q1Ut~c zQos&gH^`s=2j~%z*03Z016)Urumh;T@_q;nUB&;=Lkyt4A&F{C0T=T4DN^UV{l5n~ za>~x4qW=QN#7-QD5HE z=@o+-Lv2%yp>p64`5*~_g^h%Qvm7Y!(gCI35poHW)!X=HS!oOTi37WL9c0~@$)!tg zxjB1vdi)Xg@xz(^j!kY|k#1bQwfu_{`YrmcYYNye7&_XgJd&?q13~*1N~{g#lBiUW zVnHkgy-A+C;FnK}ckM435EC-4EK(mEXBV*>Wl(ER=C^IWO@3rZfE0BGYI$LNkTDE(1_bXG zVgLjJL%jh9)uhX=s*=D1epdgwsse#x-7WuHwf5Fm2P|+T2txErWz3LcDqA+zp)85W z@3BD$=GS};n|TJYP2Zq=GB4)|QLq(=>`lf@SRImO^hkdt35LxT<8Q2{`N%j_a0T&q zD5^q7t);}p!zxJmQz(^2dag(xHYS+~4)-5sE?F{@jZJ?eq9C4VSrDw%n3}eY{`#r~ zh6 z3H6IyaNVC+BXJ6qmmvkbQWgezVCJS|Fm`mBrX+%EM(dNM8TvU=N%`hq`6f@~i8tg= z=Bf$dh$<-2e_ujb;hGZu2Fc=>9%4=@p6@8;2TfVTrNMj&LMWU>Br~`}={Izaxtbfh z3I6RWOwHs3ItnA^M+J$8;s$(@_)i$FN>r#)0Pz1)#oZ{by7n7 z@eAJGdt0>3Uw@jrtNC<|_`S314)5K(SftsBJ(bG;COsLNn76n_-A?&A#;G$>^v=$J z&v$^2&ZvX8122RR+Y%Qz)7gvRs53-qQymU)OXe=MoVM`%Gk*T? ztc>NVAG?&zJEvW|?mNEm;;e0kvK-_|W=Baos`9VHmo3^vg&EN%*(}i}E1%JE)RpV= zW(B3IdCP^Yg{FBx=F`;?v(?mPEdFa2jkZ7|j5lKZu2p;Ry@4Xc2dZ{tQ&`W*(~43? zJva(ZvBq?$zkhf7=-qvLbe4jbM^y+0UxyR;v!!yF(N6 z+fqo0usIsitx1+qe97SH7HV+Ld%|JFELAUhO=mKuD2kGZvO)iHC+q#m0w>l6a~pxV zIal`cKW2thZ%TZ7^nzk!w!^91*xA`V`&m`~_IoF#I>>2GN*q8P(ovP6lc*%jlo})G z$)bFU5&@u$?Xl)C#)jt^iE6Z@_^+v7Sg3TV`kIvNZ)UW$;;aU_P9hh}+S*1{9;|JQ z$rVd!nrMWa&$LhBwU%2uN3?J+>mL%`HF;>4&58f;Kg-;rXTh~b~}Z}~OWkUH*=v~cshAwHN3tZQ07WiF0Yt>er^A7x@N zcw@!3xW&xq-ygFmW5!TJwT~XjOAHfm@MrGKoqqw9^%_lu*5!LqA4td&WRp-A0lGPa z9#n9orD6REB5pC+ak1IG-O3BWQ{u($!vcrGi$iFeD(a2OHj2|7NM!mX2sf4O-?yRzOJ?lGJD8*unYr_`1G`mGq*q4UTU zy>Fwc;S;A0(Ssw~H@)o@(_Y()@Uwi9T(J7yny|1n_f~uF<6n&aaGZaK^nK5EjPbIa zwr6blqaA78?HhF)9nG8@!Wks+7&>DB;AAE6xaO$HP=>KO(hO9z@G;X2=|1N~_6!A$ zvsqZ#qeprUv~YKfoIPasCaM3br`!7v-gNV)8=D7F?aF=K$K`HbliuU6*TTj|>q7OY zAoqcG(pJHw1r8YS!OVGQng7mF(@)F|DszvXv3o|0dl}ZMc4W`c)%VthdkTabvwJF? zVkXvE{sQf3i4M_1V~sO$AmiOPUt@)7j(7&^(F7Nb>6t1ZgWzCdv}cvWS&)c7vR(L~ z*a4xf%etj+KDI40i0>^c1AA*1p4_ETqb|we(sg~$%w6Mse8%s}lxmfukP?b>3OK&3 z_)$9pyxqg73(d^Ri;!GQ4*Cgx$U=abDlt0h(gW}PoGq$0oFEv^I^C~j!JQVZUKi#Y z9~IH8?T~?eocnJJS@P%6QO-S*=4~Ic;>+C7pibFkZUa9^OWQcaqtl9?58L(VrM>${ z*AXGEwGm44g>xJGI{x0Z2Wllrz9zW3##Sx-iA?;-oYil{0`dUV-yHjD+Jft zh5-Ivs$vL>0#Awg-={dnEd$WV9 z2vOXJPjX`m^OtvRHNJFkFmmTd|hD!5BoN4y$Q>eQ4*j||I6h}-z1+1_kKT4ra-r@URqq`;=;p~0P2MpqbpvomzXf-KMSr=gwe z#`KVOaEE{lZFA>}PRo9e>q*bXc?U8S{50I!kZEiZCzGKy40i z0P|v?sm`cnRmI_n#5r1N3ZWk1;19jv?EPm%yRr3JH+>y`kKZLWW#HysV|PuFmw>Vo zyyk*m-9!wWA1-M7I$%~lUe))IGmO3hX}zJp(0RnZIOn!1I1XIqMvukU`O9mIdX%}x zE*&vqXL)WoJJVukB0eI4X=u)I{UEo zt}!zPh(+b)6`YroYf;EAUgJupIQT;Z_#BnK9Hrm)D{bahe5ZMdHd|xvpeUp(TiY-z zL;@hjRGSBW9i(vMNAo#Xq*`;F`2!YS1Ughb$S`sw`~j)wy$T zt&R$wUXr9WYG__!+l2EwYwFYs%{e*sm%lrWT|X!!eAexCePRn==g;_}a5Sk3Lar(V zkF!#ECgCaZIIM;$S8Y`hwMwWe5V8lbw0uyNM4}w9&5XuWoY!2$o`&w=YGcKGY=kH% zcC^x9H8DYKXzB0$`q0m90$o#fWOhIHNy3srG?gpN_}1!PL0KhF`(0x_?xfVI7rW;C zga!0gPKhw6B+2it!LAHWZt;s zg7nVeb3obtwV(d2r)*`~H*Z;;GWR}U1kj?b>w6aP+5t~VZfBSpQJEuJaey76p~L^z@DdpPCtXSr6L)80!p%{;q?HUAgMWGRB0re|ci^$Ual3GjfNDC10C z%8^mzI>c5aN;CDdNfunPk3=s#r_|M?_#Z7I*xm804kjxqtLf`Y8_Hd#Ihx{198rte zn9{~Wea+>2jvd=m);DLcm)GE&zGYJ{p$ne-^J%m7>B6cq4^&Brje+8LP+FJ;wY#V$h6oy z=$w|KQp%_Cfj3KEwIAL$$c7G1EZen8#USI+|X+Q;6GlRfyB#08EbYJa|_~MuRn-_&~Wxk2?qsDAX z^}PGVo++1B>N7(J`dV4}4wOBkn)X(4&5 zkj%I2OIF9!(JR=~p@DvJ$)ZFrePfOH5L)k%^3N<0ITeUyp$J4|jCxt2!Vp**OH2(7 z2?CmFFy^DRr=04FbZO8Nq zm46v~d|HxAN^yGY>^N6zpLW4b9jxkGJGonV#CSVMTL1n_RT#45U!^XfE2j@8b9&pX zNpyz%D{c| zVNj|^bwN=)epFROZY(NUd1KP3_%ZuR=@w%~R%xnpVD9v6I?mW{^V*=^)3WHeR~35- z^VRYB98Y{x zu0j3AjD~$O)5ccR)bg3ezlecz6HU@+l1Jelk%)MDg01}rO^k+?iA5P6I50Q74W&=m$XW;);B=u6X zv8akh8_$wwxa2OqqUN5EQL~I7@2xjcmCJ}(LM%-ZQnOzb5W0aAwPs?4Nji+Vz#n}m z{7w~LO$>(D3&SSnfF@BhDJSL$5DBQEs-Zl1Rz&_o#3e!vq^88W&Cprx+E3~oT3v1E z(Qin2?D*1tX%$m zA2cT2*U}?(@btCaD@r#N2D+scFB_ibUeQz^?A9{SU~3;+2-G>>;LCS{PP}Rga0`%M z^C{H&O$vj9%4_YplqIuAZ3@#2kn1+wAy>tWsJ^{@M0DiHZNrIU)d}fj=)mRq1ze;{ zD+1Z3ENi+Cdlt_J?q5Zw~!Th6Zj)a2&>&Gm5(+uDa6g zf!y2}s;eV54ht*Gi~TmKe;eoOYRl-1-l6;U(Jc?&GBsWW+ouvrVuNz0XQ}Xcq=mcu zWTr30_zqkza3_UM;kVGLX&RGPMDQTJA-OQrLNk8ab7Cpc6Ni$R@YwR*-|Q}njp#o& z`+{5A(A0KCscsgAgn)4=MQQFz1JdBZ7Zn*dXNe(T*?9W#Ww@7d3_{nc)Es&AjI zbUg0Q>Ncp~&)ol4BQUDF-yj!v+MY$9ewsv1WduNWRv;%#xk=20%R?T72La*X!AQ{P zkQuN;^BbEGs=6rt4t-)DV83cpl|!4(1u;4E@&YN1=r^}ZY?n~`R?hnkmW>JZO2~9` z2xc)(F}-3z1CJJQ1!-aZ+WRQJ?^!ro4PcLs7;AU=wGV5VIA%v--l5%_J2VJs*V!v6 zG%~(rw7p+E&TO@Esi{aF+1W3=_xPl4p`*(N8-mJa2^w)bdjPu3*TEoC|FX04ezx|F znT4qR!_3xTiJS9&64v~m;tp?5k+Tamr|i^|oInHBUDqX)hrue``i;{TByknyV$!~# z$t(8c*?Zaq_$7=Olw**Fel$O;$}T>;FfMm?uhx>>I=G|amDoKfesBjbL(am&gyx23 z^{^KwZ|k^Zt$eJdcZb2T>F=HzZQQ%Zw|!WvHY3*doK9NKH5zluQd$Q0nvga)Vdk*p zHnV1+n3MbM@8s>^Dg35MPM{e)tAd3H)ki~Al7@EhBn2n9bJ+VnISMD5&rWeAkOL}S z&Vy?Z^@+8&P~O}TI*PR%+12r0Zp>qS@{*h|&-Q~7vgf9_v~Aa^^`NRzabYzN%;0w0=d4fOxmSA*JOLCQpB-ZE9hX-r&8biG9<0p+%L$IxJr_Yr^n8?E#iq ze?&brG6bM?ecUg(6Z8R`{9NKXAewXrz~L@J{1aXRY7-6>GX3=(`Ghsm#|JvK3hU6l zZ)>0aT_YQ`4E4DZn(W!sC9=JzT}&&|Yt^tAxj|D%s-1sIK-8=Si{?xWrp`%2)1Bf| zI{Lb&wvB7vI?1z%BH3CU>T%)x;p9fmZ5j*MU@!h}#c!(H|9=_3!Pex60FG+TRGU~Xhm&}2VG)(o3~G} zZ)GJb_1ptPeGzxOo7#V4aSZEX$cQyKdIx$r`h}JCi*rlrOTWliy?D;V;@)Y^?3-6K z^NDm$T$I)dijMNM9Tr)@%CLrcfC8=m1=T^+e&SdYbpkxtFbc5<5G+x<-A?_15+mM8Ps|1_|nLV86m^QzS}8nYCduykhk?*r-Z!mNsaIU|4p~K zYd3{$Cf%+=VD?{h`}uuIiQ0Nc|^zW3GNWo?5C%y!{>T!oF%kcH7^0ZW(Yc( z;(BhQ>kej)+IaMkgru>Eh4;Q^jvrJHjlgYCKe%Vm2KR|`+MouaJrn)H?!-VB5l^V= zdZZ)y**LVSq5_R7?X&}7pFH@uuj7Tc@KsgdzvCO6m+JdAzH)$ZLtTUedd}$j>Kj4d zCv`C9{=^M_Nxi4a7tqz2{+l9IHT!_6AI_>)7eBex;}(=;&~wJ9>S@!eLpEUUQ5+Lf zjJd}KQp=|%gVQ`bFf|#HYS_lMt?k=)tzxlbKt94X_VU)+Zu#UX4=gb`5p$H%3WyM= z8~g(ibjt?aBwmBAyd&u1FEVgE55m{1xiN#=H)R5X&6xm5$?IGIjG8GC08o_~y(@1| ztjbt6tti8%GPQhFR?htXVPXB}=TuGpy26-OQaGG`6j!>TZ{H22*ogW3#>#BIdB!7c z(3It!dw1);YDA*c+$XcRZE8tJ50;M95;0_^CU!JVIk~WJK+WUGp@3hNTjiGOXE>k# zDWf=4LVCg(FT{WA-NeFlFA5C#`iiex$MKIb ziIWH8^(61p1UemZrm?oeCQO4z&p&=0_v<)1y=TuYegq7qxag-XU0nO6+K+-h_*{WD zn1z3SD+a6(bYH{TN}hPeL$TDXM9(_KzLsOedGH9IC7a%dueC?zABTqb@|X-R;r*Om zfq%TKe?H$7xoXq19wMoPs=?#@jr+4o$Y4JF%k$?~@D~Z-{19+vVMOr`hj8zT+FIPt z@}We~ZcuDXP->*uE)wJ5;=Z;LeFGQbbXS~t zX3gzd1v6j3Ysp$jJ!`)KEp0WQ*5+}zfA|X&wXM}@<^fM@Sfe#`Jnx6YOs!|lqT|&u z>hKCQz`4-C!;b-L!E5OpO^}E1_qadrNglBl@{le3GZL?8q+As?R1KPNr?Uz&MP4L|3FemyV&L9IlKccdp-%L-^t6Wh=>#mVfCBU$g}Wd-@# zHYRJ0+Zx-3p^-E?l07FsE6^8NH{h2ELH`$yV4~%kO=-+j2)d<#gAxE3{Rr?n`jlNpp4;w3cSAz$~3MGI1 zUU`8G?5?_OM&sj>_lMXy#iynQdHJ_;_KfQo?B?IAb5{3rhiIQg?Bs%3C0T>Qteb3a z&^V;mjQnzLfe(S8D=rlof|X+)W@i#&Z%sS%rH* ze#boDFwT)9`PEYA>QUAF6yX;a=q_UynrAScqj|ShFMO%uQjNDV#rxuIk_nmMS2LJk zpaJ+5GC@>%;MFDJuAwv_H6yw@IS7YDEnIudIE#**{JsYVNR4YaJp3IM5&?aXo!od^ z*;ZpUseFEs_Ayq{vFDc5pz~kwP8EDeiab=%^G)3Z_g$!r4mHK&7Sx%dLa3uxr@@N` zck;6I$%>8cGAJW=S_hZ!nBhBAPaGIk*~`#6czD+pPUEM|64m{i>5=Ta#xs zgQZm?)|MrMLVA)Sv`ZGIjii+_(53G=yfJmSe1&r6lDf zW48~}k?i8`m6%3Ia!z$BZ6fPvXF0Fo`iztTVNUgo&y1A|$d%I{R`j~u#2&Tsl@@6& zf<5dKh)&22y!Sul@Wo$h?gn(Ak-!Tw#dTL@3-Y(2WO2{FrKN|r!ywU|@xvFs_l?ni zp-Kx?ruZH^p5f3t<1ke&Kp>+9zsu2Js3M1m=E?WW|9f(X{X(<7x{i?ZUP4~3pt{Th zw=m6TLs=R*QMN9}jq|uRQP>ak#^XJ~U>v9v>Mn{LtR(+kmcE(e_Li|Klq>(X_xb2) z@lq1*(s)?@{@&S>hXl;sK3HyC6BN0EfSc$~%{8if)l7OK(ozTs5V&E2jpWlG+i>x8 zLZW+Y`|}B%MGq<`Xw#7@hXdD`^bPlMPIP7%|RcmFGKzy!m8w9R_p4D z1Pf9-YNyp?$`7Og`}2F;{}g@wqtlm`5z@xgJx&95OPWpaN$ z4<|Tz6o#6IaFA|ZxC=UZNTlAv+>pXPTf=*gY_lym-1oTL|KXC={-;;Ym@)k5q|R0~ zGbKZ(okP+{B!?Belr{oZcwUf>go!y@UF)y2=EiuNvHA?@E$M6>JnSsDTG)HJhC8=- zQuE#d=?mkhl45BW65cZ$Ccgc|oR0nhwiawby9KHaAU0kk_k}&=X+Kv>9J&bUwIyT# zt{5UkHMgZ7*fc!TAl=wSy1KxmJ8yK@5^t%PLI2GjLMp7b_D>y=#;y|o(p|;Ljx-8Z zG%BsUFvV+OXz%%(xXg(@$C7SD|YnZA8)bsOKd zL2fOYHm=uDyUfDQtzXxb9yzmTlf zqYovc_)G`VVnt2jU+wp^+jDlBA0rd+D4x~S-jwrnF0fk|j~_^n1vZr52je$>$THU0 z_%X}k7agYotQd|&#Sx4c6V9xtNqwt9wvIW&Ti7*f?k&p&^%^&Ksjn-r_3EB(?da5; zd6O&O*V>n``!U8J2W#yDgND>T8((=TA=y>dxjFWp*cjsF;840#ALHVvQwm?sr)T?h z@~fGzP00hcX8632dkzJB{NNS7XV2ai_Eh|W)GIVpfW{M}C`{&iAj89yH$Y15lOr=i ze0_t`<6G#xBLY(cy;7ngyCg)$x(9hRbDkV;yjB-TomZa*Ee)|4 zP+Vnvsj`x0FEUmxdWnCE4Zi(^z#8vsr`LHO_R`!#-CmUYYA^rp>2+U3a~9OPM0l^z zCw@XIna&qo#p$J-t`B4*J*@o|nvUI6IQ0V@2H$mBd+s6lq&z%~Z;!+V*o}ehtXsDr z3I4Y03(|6(`$WV?N3~Y^HP+iYTM$RvZ3Wm&dm_!#p?S0HUO`wQpz7F|TPb|y==J%m zt||nW(Mj$C45J^P*5P>wqLhugOo?Z7aH?x)ILxmH>?6MTiZ_-4QJ=|!YFx)@j}(tB zEkC5yDmqu6%&az_R^{&LnzN~0ez|{eR#q@$Z0Y!r7~5u{0o}UIN#A%XBJ!iQDaAbk z`-JxBHmzU{bZ3dCEB##h7Ii{N%PhvBZHbWwRSxc)2SzP zyY?86Ox8_@ZcnHUA*Z0jU4?G<19evDjA);T_L=7P+5@Z+{f~T5w4Y~jXfIWtXN|}T zo*z&q)rNp_=6=f9?~0%4`9H<;Bk(Eq`r#X2SLSml%!T%B-Kw>D@e@9Ry(wdr+9~ZsU6`EbSwC#D}e^-oswa%G*+Yxc{jY_XxdP5Mtfb4={-_ zrfL&wEjSP(u3A$eB6GdT`Gua-!kBgTMg--ZiQhNT2b09r<0i03F(bE7yay+*Wg44iAG3_XsxsDXe&Kkf`o7p^AAI z|4p7?n?8C^YSGC4fA`&*PsogJsXe+5>l#T&lc*}^rp-bJr+MnDETj5QuIk)2SKl(x zXM%-qSHJktzWaynh-*$9+mY124qU#o-{9chdPC8IiLpPfYacUp+@MpJg0>R}VqiNy zDb01L-z;VPMyI9{GB;diIQ)WU`2w#1xd3=k(e6VZqap^FDgPZWPD+j@S6f&pm3gjk zOomV!euXL)gaq;ixkcuUxA4l%UgFWxbq#4;-)+$F(z14GCEd4GeNg+tB>*lvxpdXE zZ8t`3BXqp}x3wMLMl9*wqRC6&Z5r+ww4|sw%!N?*c2Bks8{^d6;wasoRdg!8SIR7F z7+N!KK7wccRi4Qc1a4EIu71$PMtr6w&iMz2VAFJ3YdxPL1Y24O^CN_jKHGME)ONt) z;*(muvC#O6eL&h*oqpaqwkWrH>j#J9dnaMQtTAlKVI}uf6B6HF?~(izAgM4+!&tr; z%b*mfFi6FaderYgC!=IFwse;NhRwKYDKibnv6$pT1Wxy_xJ3G40Caj@#RW4DQg(!791s;pWSy zA1ULs5#uWA z&tvVBMxuR@X!oZ^c@pGjYVCO?1bFLtb>W*>L6FoGzL~V%z@>+TafQIa(K;=7;fAOo zSZixiAgMUfCACq**xbzaDKSB@USYvuDQzuU656&SNlf0_f95CSh92$3UNos{OcxCs zF{#rWd3d(m#7XaHWznE%PO-N~!<+`qn>!gSEgS>uFFVV#=msq}=J96Z-I13j9O;|%^Hqy`Zci19-&_(nk zY@ZN6m?Z;v&SPB&popFL4mOiwX{md0lBacmVjb${71}Jezh9Ewfug8vx+J-Ca=R_f zbU8(t6~x2aE;7o&CdaZ-i=-saj~z3bXEGb|)9!)c-k!^5#JhE__KR53rV|D4X0U_u z$3j1@sXWE*Wv=_&?Lgq z7z6jPKoEp^4u>^?J>m2alpx0L z_D#u|NWEKdfbZexW;o05VnvR3x5Mdumo?D4^qVuk`=H>S3kL#UZoA>DrS_UIZo3t& zV6fS8bD=Z~s5(9$o*Q=_nTc>0e338pViz_RjcUW5M{bQKbZJi5h*2BULq|jpiV2C@ z(e1M|4!3!l?zm=730}C%pWq_Nvu5o0a z?jg1wVVU46DW*znMz=LyrTNV}Jkw!P?BZCzv7@^cPbF~pm>s=_n;!_s+lu3KR1Uwv?YDYXCd?W& z)mu5YY|+dRe_+O(iMAck;U2I$x9T z(^EPv^p0nNICFV4&r`lO*xnTq7DT&bMnz|2L`P*7FS@*F(Pib2_?+$uZMx^|e_T=V zcq3lY%$AQxmdeK>D-~`s)UPLh9=bV;a$^mxL)`N-vpdBGv`R{jTc(7K?`+%H!Yh4Z zLQ6YK%akcxu8F^Vg7(vn#wx`U&B@yNY8&iAzuGfu+wJfKP<*QT=!dlq+wn*56?T`4`9!) z`olY%@OBWFV6Be2x{wJDwk<1NeCO?tmfBYq2RiC1b?!aB9w6lp8L^hxnfhF-tfI@i zb{ad3y+psTF47M4>;BJvRUw28P%{qdty3T@nPS(tWu@MC{(IhTR^DxN+R8>YKB0{p zRk|k38|~yD;3b82?{S<(nnoKjA+BDdgrKT#o4Hf!>-`z~Jh~_@xDiikVIBV`slDQ? z*0KqnVKj5pV{eXngfTM5MF4)6(0?3r1bkyz5J*USMu^P)Pn@eHCD z3KZvUmLY8uTq9e{ThbFoWXH58_IjT)?vC~oOSaCOlJ4N#Ix2p}6a=ll0-TX@5PQm2ZDqgz*kAz(2o`5#(*xk z*w}}KTUiIALmk=Bw8z5IeRH#XDD}yjyKh-h#}OP0ny zFcQtXWM|oDj|n4D zoSr=eo=&JWb4B<6aNhO;ZyxWM{fWID9eX5VT}Yp9#WUx29@VIxr9Nw4wx>s%>~j^QA~b#Si8tD2OCfn8ist0GzfIzz5{E; zb#pZI(A!xaQ;rAgs0HOH_14yU#oAr5&LBwx3P@Y_Y5;CEeK~;sO}et3 z*VxW4za(AJrB4(GqLVOp2QB27upe!6d z2?}?!a>y=#=(bJ5tgxfHw2#7#-Y<5O1&GPKIVi?Z_WVYKOMnr-t}0OLhzD zIeK8l#d+6{Z6xGG@ty;>j;xIdc?3JUR=!GVb&(IwFsvq?6vpZLiyTK1R*21k%T9K87`VD}RIbS}lK`Evl2J@vs+p z8pLjKw16!#_b1|SwZGQ1Tyhrgz1<($)&6+ir%rw+2+xar&_BjUyLevYUX;CnSLA(^ ziJA$u5$IoS-(haI52RYf#@t>fPvlS2G|m1?dmufk*=ue`9A?fd1(4-(b8~y0ep=Hm z8q`y~&NrE#N1P%05qTTsZ}cPbHcEQ!c>#Y3?(^a~B2&A4oW>~VR>CUZYWKrE%RFBu z+R=}Py=XDN_ohFdbE=acLOxBvTf(lr)t^6U%&zhN`11lk0hfJ%`FYVk#@xSsYqUT3 zFV6>Q?sK||+)=&~fLvj^X1mA<_T_RW+6T)c&_3l~?YLwW{o^?yFOIB{>G{Gs?SAwD zOI6$D#b`%AEO&I{Vi0PbU4Sn|t!GS94Eqf6jAI21U)^ z_{%@N?$1ZSr?v;k4TawPGuILzc}v;gi^z3o6VQ*E>%j42c$=y@4Pgi2y5879)y!IB zMyPl8aFbq7`H?KdfB!O#I<2<8d$gk`EMcIVq0OfL?7^SR$o?*4w+M-XUG7vv^v6E# z*~%)Scud0+)x8i~o?8UP5o(z; zzi*r!Jy^A8zP?Fo_QbD#tDZRO@`nU##qsalh=89jE`IIyayqpMZ|+F>c_q{3LS6b`5DIYI{7W=gUD|| zA85I;9C9G?U&!6_SnJ=yr{?a(1YG{O=YYF8spb9HEuXEv2RnC3PS~C7)N5-W60!UJ zvq>%7hmZkJvli|8Pl$s}=(qjy4u89j>#68pu>&3=zXt1nfVm5}djD6r;sAGV^LxU+ zsd+hJe-Zsmtvx2MmL6f9P-Nvv2qx})f)*AgnXM8}An=)dolwYtDTcj9+!5y@v<#UZ zXkmy!s^2ZjOKTnHoR~kmUr4Xr$e)%t*av&IX>Q@^8H0pF+L=#?uUq1V(Ib_d<^jGX z7TO5%pIJF=+{=So%w~f#onv>k4~z3mHq_TA&d5q_pVgUoG&z!Zko}BXJ!4C0yt~KJ zLcM=mr`}72oSD~xJnTh80J?~{g!6^_5$<=e)+YR6t-5w5*4j+%*WusB)b2LkGOxj@ z?MevR7uP;xE#7Vi{oqkZ6L=!6Y0b`@@6+-e8tAO9)r|lgBB!QI;iK~Q8YXgW9*B(6 zjL-4D`n*_=Lta$N*W-}8FwgI`%2d%GW>jKMuT|iQ&`*2JN#?>HYnAEZZ}VJRtIUAB zt8@AS#a+}Cnp2$Wk|%dTuuHt$#pA8nK3OAWcFs@F>>L~9*uu`+H*V72@X6EPO#2;V zo2J%dqGFq^!v=i4i!D-blv*BWp7nMH0C7M3U*Fn4rOApL=4w0(C8VP6+ze7;ugVoJ z#10O!wo_$@CV2X{v}~4{m4W}8HP-ukX1PsY2D~&VG#Ne*gH0O9Ld4-W6@K5XTl{Nb$*1P8R~*D=`3>p3+SXfhTxd@Zp4-B9du#Uzbqf5lliza0MHQgR^I`kz_s@OU9vV;QJZy zeX8(tt+BE$7MgH#s-<+L<|Xkyi2aYpcI?=p_@o|AeKr5}^H=eFeY}i$j~?p+ICIJI zfN{@(1Jd{8nQ?H%|5V$9N9t7zk$Q_tk@I4SG@FO z63ymMqjy{&)tH{ISx~oMUcI6MpqH+20Fc?bVf4n)h&$hc70>DU(RS!jy22sFbN!_e z#t6W868K*SKD;knC4py%bj^76;X!IImz}P`iA*oQRxfFwub-tHdv~Ij_?B1Hxs;R7 zSlGdXDD1iVa38Lhs>dquCdZ3vKsC8O&a-I9Z%^U-nUT>%X_t!@V`1jXkD5dM0!|fx zJdx(v^Qz`&WzDaeM`8}7CJY)g=F-@)m&?ls#U;xhmgI$p=aux0hAu*bVr*01xT)T0S86QDNZc;vSZk0>`Er4Nm6_3bQb{Xe_LpvH8mRx9X?W z)lb=_7o_it7i<%aV=s>!A=)F1keS35>7H@yDf)+u(woXx;$CG`i-7GY8k)6fk8!JU zuN+1;8?$O|NZxcWz~IlyjigeZi{zq*LsrAdxcg+>K4fLiN~JXm=`kbjY8Lx+n&3Ik zAHf}*{oABwH9rDTDmA*ms=f6LiY>7ast@JQ(38dl-qTXr0d^d8#!9AiALk|6@>80{ zZUeoUzGm{)r9QlRUd zJ}m$YvW0e5I@b`&6P&!DaM6Ns0nrV}R)^LpQeqP|5{ozS(;iine*Kwi_jynMn&+ZJ-$qu z#Fa!UU1~f?JBVkwZsKSSyv3=eCj{y#6&OFjElTxS-z%)IlK5(pV*Anu&w%ZmemE0_ z^S+6QNqLwi95T*a(4%^pQxUey11F`xy4tSns&CPvMW1DW(vi#<9Ti7nJ5M@cT#ea! zX;yM<%z!?|bsQG@_dAOwEbcXd5Tgqq7qTn4VI0s-*lKQxK@iEUirv5+Qr=b4R9w!m zmer7t1s($c*Bk*?3yufQ?G#fsJ6@uXnUWg1pxKt}B3A6T_5mIq;pCSpb}7FkGcz-v zyd*yKZ`#2moct75RX~j{+@7d8XwFOF7lfvUO0B^_b^|)}^0<=79|INNqNh6{ik<{Z z1vs1YYsvrBGqUN*QhC~|NlVd_*+%j6k_;Fklye-CuiAcqE!+X0iqg7n;tGW4N@g6) z)S$!;Roq_1#0_Y>{I#W$Gk;&o#y55fsybH%E5*i>nGIV7R-NnIEuaVqwcg>N-VMREO4l=Ihh5)A8WK!zTq9L#8v#Nuz`+p?~_KN-X8f6mnFM6a^NiMH( zz5L&)(GVqcf@i9);CH2o81uieAe?i@R{yrk`1h#n1}^%zQO9q{o&JZhe_y)Pc<(iY z91fy6t@NYcDtv7jxp-UsY1+d0Ncn4-_$*q!C-v116sw^U_B*&3JUn!+)+pKHF>$!m zXGznz@ZdCuo|O~7d8bhJYoxa<(hg)Fxj4HA?ERCBx!1ta?SY1naY_;m!hJdzL#+3W zJA7DcaZw$AC)Ny~VhnBxf~|38v@4lC^UlP|%8BS{_Md-p7_;POQmW}0eW-$(F)7v9 zfJR^2@>G7dj6QydXX?Pp0pwG?aM7O%cl5*}D}5tBc`)z0heKL$czjdszz1%Q4enu- zy#emdE-E~A#Q&pBaz54<6vHGMTe@tCh+AF;RET%CDxJb4gKFr>iy438FUR^W}Sc*@1Jiiz9q^5Ns z4jtbwXnxxKJe_gzr;F0JaL=Zir(GKUw#Ea!TJex+sjxYUW&?YSyQ@7!e@>XG1>gmk zO9@}x3gZWK2pb7dT)-1p9+s}wyk3`^ZAtybK+=vJIl|VF0X;t&R9G~4;@pv=zUtYt zC?YmCqG(Q=#Od-JR!-hEe$Vveu5ppl9NFjJX?B-2V-{FBzW2`FynM4K9&1o-ztwcy%CMMs8s`!>8G`gt4nAIc0uzWaKk9`6z2|N zb%Z2EMn*;9tLon8q`txC^Uqg$ChZ`_RTm~?{E~owl8%3``S{YOS4c^{TZgi;*zuZA zq{tl$z>kTw-^efJc^H>do^Y|nF<{}sL*eENlpUb7 z%C!0j;IO6JgC`&HtF4WzGf57VZG94nMN;qH?25sC%nVdb$`c1{?b?3Vlgv;<$dC7f zt(x1|t~qpwt)qE1R+fZW1bDc}yC+Wx%e*$QbpJy3xA6pR^U*t_O4HM<*#`~XawGlc zpZ|c%Io0Gd2V_L&q2?9Q5zb-dyuh6hFgM`rV5E+pFjBH=CD@7X3dMW(?~eyfV&!!s`8;F z@oD+)?W!R62)B{NhGgf~h%8S&xINn?sFm}tX3|T+6A0U0^MTa*>%FCg$L<4=+h5QX zqt7Li>86w8 zX+n-K2^_YEG+j`|D!Tm1v8R9W@5WW%oc@ls(9xTp5K=JU`mmQ@EAE@;sf9S}lrCh3T@jw1e@4udzV5t#u`#k&zK}>#!~zYcAaAQhu?DEv`x*ct#q@ zF|H|DSg?)^s(0}lLcTVZZ71YCDWK*mdw=9eK2`#7rh@J~>us{zLdL^_VST8rogP*R zBSEz7qN1YMZ(Ft!a``$T&k6A%Nn4pc^Om0Rk&M~5&lo;9ML$}}u5P=4>og7+(^;ZP ze#JQO{W>v|d21Z||Ko9FS&S3&^I7*prwBQ=n|;9tk_W$9r4A%%I@LZ?BIGCFp}i*g zZ7$;QuQ$?-nidbfA2G~62-zP?!PsEQhLhD09>SC8q1+7H^UrW+yh+fF+0M;cI=VQt zq?R*#^{!kok9>Cmd|b9{D_J_vNREH(&|GV=(orGrRY+f$nQs1B(~_ihAe-0Fe)s9q zPZU-@V+ILf7v?I;G%~N=g=d7U3JFRG_v=0IY%z=6y85-=e+#;`6ct%2zrhgLXehl2 zY|{@j_vCNcg?Dm$SF&#(9Lu$?%o>u9{h?d|%yNefr`(ltP$ZC+B$$X3y|ik{T-;YK zfVewn{O8xM#JnK~j+x_VZ{H!rP(bucmHUS0cjmBPJ1(k*ObQr)^Zy4h$UnStP^qHA zFqi$FzPK8(Y9w@UnXK+(1-|MA4GSy)!xnOsbwQzI=vH>G3OTxKZvI=|pEr%VV=JRC z`wy|E*J{qP;}H?-R*atue1tC%`27FoOQhR1hS$DiB6z%5_~3uoIR)+nHpQ6-Y0kDb z>K|%E0Q1K!egannu$hi#)vO_kyy8ADyn7j!K@K4gjYf89Y{%oD*|gpIlH|b0Ir1-y zA4mjoyEFd7c^lb6wzfEV{Dm(vY*1cEHSJ(~f??+xYFfYTd+aeC*NNCC6wp`;V+YZP zqI$sib6;!YZXmXZ0JzQl#bZru!;6%Bc#kwBEi?3SL)h8hTpj2ZrD*~gLw;u8o`0@y zC7@~H^t*(~@u3@pJSB73zQu&@A=`+B3cvTqZr( zP2*wq_4A}DcZ;04cpZu-X;MIoKb7I2MJV4PQP&f@!|S<;o7%AI{Msn-+AA}a z!T}Sf5^?qbAkaiJX=s=D7YxPYA-jHf}IC;y@$y_!6%BeFukqqO#WWg=osEh;D@(IPB; zxSRSz;?5EdoLhWsuCe30DYUMxhEP~xd$fvpgMXy6wjh&6!DNwr{QG}c`qI7dIyWgP zoY+uHG>@&C)64Mjtq0D2Se4ePwTqspz5zt8aU+PQ8hjbB`X(XQ=9az7enbJ;LGpfm z?Xyow{{e)ulenIy`*ftnJsgcU*nSQ-zaLNKwX?`fm^@Ut&(CK-D8Av|owVbuzd%ArD7#`@{9@XU8(+2aa@|W>g_5wf zYb!t`$QswlpX6KMf5_Wji@?gdL)Lh<4~uU0sO#mimHItF3%T)>SI#r3 z4{?f)9I~Pm&nzN~E<;DJ*ytI1oLH4FDOKCqdA@$vA37N?Ptka26XXTPGL4S^eEBJ- z;j8P4W9@r7Ud4{Qq=b0`7d7tQ?SkDrLg3An5S@!HN)H88fY z2J$>yBj1p@Rge0IpSk?m^3d3bD0w^^Vr)S#kY?RJ{^S#~hh>L{hx7HunqSf1U@g|1 zwcUY(R@(;OApozApeAapu25r%KWwm_mz!mLA!!1^t0}-?3>oBSa)lLrPa$X@Y281Z zL;xnZ_VJ_-&%W*hWfX;2&#lvk4c1C{H(_Re?vs}-uMSl8F$nOl5(mvx|ft5+4kF6fpTI~ar6&D!^I!#rS= zU2KBGB%X9Jd223>I_6py72SE7;ugDUb+44{!yip0?DOHhEG^tN9L?x8x9kRFsHVoa zfc;RrSB+B@lNGRr%Qr_l2z1mK$i_I>#@2e^?eN6H!hU57M!%1Yk3CCRGBU0~ud!wE zHiEk{ujbXqY>aAKcn`h^emz!ifn+C$e%P?C>X1PTuvc&s-+O zMT}~Ufnkv(SlgiQ!go{ryAnC6JB0VEE`9UZ9cHP-KIQha@i{nfRW+I&$a=l1xWT zB*C|?8qaiLuU_n72#l#_SnYST8}v|Ja|97xT|`tY@=Lbjgk4=wSh%{fq_v|RNlfhA z+gA_e#ixyH)39CYrp?X{#Hob~zEzfZc#;%a{IGqwU#3wX-1}!UD6luh@Cz9j$DmCI zL3G-5@|^Rt_9o6sx~KC6U3eb5PMk~(@NAGbOPE9(oq!5^BcY{ZFzKQ2pMI3Wbaud%k5v~}gdmtB z+3W4GNiodCgK$?`XqpJH1%wPF| z4Su}>B;!_>VMvTQgSpGDav8FT(Hy@wNeElpFf4kx8Z1LiSqPpfLO_Q7f!rCw$jg>> zVU#Ae@{jQwQ5@LT(+M*)`e4gwpEm8X!+py(M`y63>`Z#Q9oEE_co-j%1UiFwwB}a>R0(*?QWdop%ZJ*$mBuMweB`luMZ6i)$-YG2@ zU^8mBkJ%13dD>R8U|Is1`L%W!@$sQvz7rp@Z{G1Q(XF3N$n-{QOJYKsbMr?> zw^Qbj-fpb+{STAuqGP)Bafz^*(JR8MTOXWL>@S}uHpG4!PS}aRIVo0dY%zFRuG>39 z`$a@WBkoFBw2AiZNrny#LW&Wv)$Ee*vG;XOkR7bL1>=kzo`8qH*nMissZ&#w!wYWR z!vA=*w)WL(#a`1$N1$cxp=zDbNNawT|6)VoA4UBHffjM84(BEq*wp-b;=>akj!sHX zO;wH`IB@=aYHBKEN7U?K?$%h%HK>b|sMh5o*uQldQ64Wp!||e;9<_tyKzSYb zjrBy0O;Cu08*ELfWF(3}e_P~IMM%VhTWlP{Ay@B?tbhAhLBfvdy?Y>e5>RmZ@|eWR z$%ViEIcf#_=^JV{Ws32~S!LwH4St)yF=|l_}*+a8z^kPDKv%oL&C`HeKA+&IRkp?;ud!E=3@UYN!}$R2k*@9&V^I1M?Tz4F}Ss3F|m502=NdA{Tv8^zox4HGkJx)?$Ge*_P@%bf)c zFrDNyAZ|MOUw8vL@PP-YxK*BB9XXOrW3_*9SQl}|cwK1h%QGYo#*Lvkn-D>YWog@xKf)cAku&E<9A zuoaM6L5@Q>NXFUp^7Km&n#|w2sicSV)ZzaC$OP}*@K}I$fehZ{x#RoYyDQ1Dr&}7u z56oe|)rD)lfLuC13hO~svi{^Nv|O!Ie*Qq zt2L*&U+*6A#aworG=FVVv6h9{gRf;NupZDdcSLp2Gx7cZ={nYwDUxo=l(*NgcnTP6 zSh8jo%a$L>qcEDKrX#-vuC5=^z~Z=|I$cdbhlkfqjB{rzd=gI-@oAdslfvzFwqhd0 zMZiOAO)&Lz5FBB z1r!ZoJ6s#vtsa#|)|n|~+z=TYd}J^g8W0dX`aXS6^(>d5pXSYxB;)-ObwC#@Y* z-4qN3y+NKp`-Le_kcJi!rkL{tI0r3Q&2M`kzwI8%lkP&1tgS@8{a-1B)^BnMb@K)^ zvq6WRTVLfEqSzm2)ieQtCHY?@6JBQ#h8c&4$rV!jnh)49;u|0xzDVxB$rxaY`oB&w z03(^>sG}wv(=|E&4a+y#R1Y8p;rTyDRI0luRVP_OGwpMWs@QL1oP!shmX&>aLs}0H z%OG&#e~I}Wb=}Ib4h6nkwm}f!c>e+_o%^^R`EIGDjhjU<&zbyhDe&q?MA4>IF8Gb2 z+WX2~?M8mS53$hboi&ygM3i~RxZEi`Oao7X(Csc8%x+;j>Nv8Ct&>k1KQR7CZ2!7X z0z1qbB3ZB%EE>xWIph?Pw{8EPxv<|@ZvZlZG_vp&z#=>350l@4ufP`zA*Ud`ThU|T;BbAr-oHmU-+Op$QlEDwtQ>6Jb$BY~_VEp?F z_uTt=->Z2n5c<`>_MTD!*c$S^#h?P9Q*VU}x6ruD_}yKte6f|~KiS#C$JnRD6DxR* zJJ@(65r1XFXjfKGeuvekS@c`vI%6^0{~KG2sz{!Z9cF2ikOL%*#;%LszCC8EiUY5I zcmW)&d7YcZYYZ$yFdfubT1wrIl+D~YVc3yBZ(kyk+=Ix6b}s(%o%tt7%YDewUt?ds zsuHwF)eyxE{c!#PZ!CYk?n^xe%ogQ#@-+6@=IPz?CT5PF{%~{k4RVXtBY)P&itC&~ zg-bdPov^54#~(lJnrrSB_@jD5@dFRHz(?F*Re zaSpm$x^kh@=sEa$8K(jB!dJbe^y4UYj@>2(5=Gmy%j|cABM_=JWE{>{y*gD{h6Mjf z_K0;PL#XAeN0i(r3&?cx!1%4I7}v2MRb0Tgp9SAq0T<{57{}KpIb|)Vhbq;eEiXm0q=U+C({1A_=aT#E)SbWf zvq!}45uwJ#k`;L%)qKppzIXQyIZ@M0`ku96KjHiqm{xBjPGd>V4kLRthSLvw#xz8> z!I+RgaaJnOgAC%v9$URZYj10&-Hy2%CskhliY#F%<%M*`>hFFebo7JD{F;GE{fnRO zAURuicVb^K<6=&;o@~2v3G&fU!}I%f^wByPlW0k&$_xKakwOepTu^6l6E*!YpFbg9 z^|8LjezO~e>{}68PnwbDWOL0C+(Wh7Nh{HB;PX! zn6dw`kS@RQsiMZO_JQJ~>L;;-*lTb^D(J=~gL^>5o3Kltu|KiHRdZd$4T$o8v* zRLq!;zUXJ&h~M`cZ&fTUXOEBU?Iwl1=!d@g*FMm?qc1^g&QjHkVv=uSG%pWTX0S4L z?jn1+eefW>B6}B&+Bm!0H`E)5pC&_|%7w3%oqa~W`TFXDMIUo{ zpy;a>_;THbr6(}WkhQR|a2zv$U!a8gAmnN3+4;;!qy?vUpop0n>4ci^$d>PkjXd}G z1tTFJoVd--FrQ7@0}Q=#d6@e@$b(3AB62pF5H1p^ymVn-+`G@dAaPgjkl>wc`RA0D zoc@trXQjxtc#@W6^}&NuKBS?7^@jQW5;o+paU0vd;iK}1_oxfWBYnv)%!;jJ=h>|( z94}t4MwAEIUBJsyWLr>+8-)1;b$7*Dyp2_GFqcz)^t7uMIp|=H=7pS`%5#LCU;}z> zy76d9FR3B>;z`cBUO%$)B>H=jiSiPyeN6~){_G3x?bxqZF0=2*Q+9#jrYd+0T%Ir( zyG{7Smfz`0tERnlkbK3i&^E@8nZn`c zJiagZVhR7torDhN0ni#WK*L_PsoXVj!l4SRIbFE?inNknR7YaljycsC+|=tCxQz-Gs-cP<*9y7eotGc6-*;>oJLS-pRo^_SBr8@dUAKu`KFlsr z`pZ2x{h}>ft6y~{kw<8R@%+jUb0j{?dt;9Tj65>n_DI-ptWHWJ$h$|!ZK&L|e%@(f zN$Ad{$6D8fYBv}!wXS8ij5vE=#6wddztAxSK)GowsYY)nvX|UTh1+qJmB0CR38Z5H zA$v*o({FOm?*5UjAw8cjdbpY7PbN6uqnOMh*Xh=MhuLEGKD)|tDA_>%u6Y6&x&M2h z+yEUKsCf{`PhC3=rRLEGKTs4_ddmI}_Rkx)h}>Y8e);ezt0jhK_coI+q#E|ehTDIA za+BPtv6r4OH!KnSKspg;NK!PFjWw@EbDo*?aUtSu1s|M!Q#p+eZv{FU=@*lPZxQ|GU4WBJ3!Ou|^QiK- z7DddQ-@ABr!Rm28@?siOp;I;r{Y2J4yg*8_0(>yg8VmmR`lz>Q$HPltXOji zhrF&^^X9vBMdgdEikOZ)AYQ;H&`PjX5+YD0%+?$i{L(=jFo9|GhMTY1j4vE&dq09T+>(ZdQt}6f7itNw(HUyH(=-T%U6?DLcS51%JlzwN)^?~9*GYEG?UKgFEF8D}St*{50EmWZ``lCXhKj8N}?1<&JirI?9adERZYv%Bu z?=iy+X)=4n?4`zrN9T61lJ6z>YS771@ONsV|Ftn1K0ttFfL@tO%E=XLOAJYX4m;Uo zdMtH1y>d4$CKeoef8vhRdr!!CX>?fBFiA7Kd+#K+ssHd@?3>-2SRnsKIz4OSSEo1c z;oDh~v~}6e^HQ6BQzoZmq-s7I)O${!LlXyWyv!f3c~d>h#Pl&!^ ze#kMJlf*05z}ChLsoRvS;$-6IV`U=8@L7D0-NqI-uHg=%?F>t&ojj0Tx^RIXV?kwX zSXl{QO+16`!+t_4`q)tH9}%PmNYF(vjjnyu>osx%XB|a1Z%bUx;Xfm;LikKzh z-{b)_z-_MxEm-5$Y9N&@fC*7rvUMcq@-L5XUVMX`DYj{$q+MDMyXjuiT9#Oxw`T3S zEqUX2wZ6u`XZ}~&)M^Y_?%TQn>FR{=ItrFqV$iq)K1V0fK6}) zrzG?bJ9^liX`t2M7C&6oip&yZCt#Nysf98UfvL0F2@GoFlg2SaZ?iD=kLEyazHClL zR_Y@D1?#_QQ1T=8N%8gP&#y~83=gE1i^EI!ZeHh$@5(l$$;HD*c^KFO_GH&*hJV>7 z05cGDK%enu;{7G8NVHYPi(Zqmw6-T6n8C3xnSJs&g3c*tsTkk!9 z?zNI}LFGU9Z?V}tTZI>+NhM#Q5}uVA94aK&i;%w&EH(r17A#-G$J(xM_Q$z(tHvBG zJ7}>1ht$}(Q(v{`eOS?>NBjxyNS=ND4m565wRsz)@qSBN5T#N==9eji+SoFNfmD>#W^n*u28(YB+0M{PWK@uIuW79Z`mZ`E% z>VTUhzhySi>r43vM8NK#ll3LoK8#5$#<+_nfmZq2hQ>KbV`7gnLA+eKaM;RBj*|E) zKH6=a!?Uk07WZRyN-mAK_Iohz%ho>omH#QRChPgij;9ao+J5-LfWG{{f3dv2Z5&uY!7_08APF*YY? zy(`b=m&Okqd%?ijkkh>qb{y>fT+`sqkvAX;p{H^DkdGOtIe&lgn z^R?5mogc9)?7{a}e!hUN3q1mT1U*6-i;6~S0Jla&53%hd#M{YPj1-=oC1GTXNB2Gc zRSC;raqHU8dGXhIc7i)eA(Cw!FBWt88xIf2U=eq7t<8rb<)Js>fR8C>>UO~YC0~PJ zV&X#cB0%XMK$917ZIZ)GKAA7UYH|YaKXmd8*0=b6cE**5(C*)`zvWz(ynHdw3aw+f z#@5$vhet7%3H~B}MDKM_gr=cv54Q}ACCc%S1k+$t5!x8`>Lh%-lRvHe=@es)PjEKi zyY7i+S$`=3E1>Jl3gR_|Z@Y8}DPMVrE8Jub%txyI-~sVT_%-0u4kZ#~lo4;J0f-24 zJRG2Rab!YorKs=*MfI-zd|>^Uy^Z-rWHlFmCo#i4_VYJqk$Ja*jadEZ#&ur~`eysy zsFeaXHKk#$}lo)>@{Tzz$ zNAb#){14Vxe${=>Xnsp7Sv|JXxcv&6=pop$otPKh}^K`wfbZMkB8zXZlNYXvv}>#(W8%yzY++?4Y)!(O2w& z;hoe#gB1p!#E|>kVCv42ew@xMVUB7B}pSvi$R+G%>r@^jZtM z3~U$^HN8{NQr3`$X7hsw{C8$84=G*9x3InwT5j?_ew?2ZbB{OE&VuZEo3yRelQ609 z@pKw{8@y8I>rY$F!h=+_k+(l-4n0y=FpVm8==k5`hVNhl+5K-BfBBZbEAQQB{^_!% zTcR3u-6ns&B(YX47_=Eu-0dq@ZcBsN+p}Nro^Lh}U7LLH-ih(eT10ec-pn^AKRapL znnMLFU{6r89k+&OH43W~3MU%vpc2oiv|GdzXVnfuY52erZs60Jm)QLBZNGw*ZX2Cg z^VK8Qku5B_cMrC(k$kFaoo`?M$R^e9A+1y4w!-{Pp=@bv!eWJ^Saj@(LRZpUu2hoZ zH4XiXs7;WKL1z+rma>s+4(*n{`&wSC`R*%rfpy+=Vb|URL4K?i*7FY@KjwZvzhUxE zSgHR0)mO|K8L+MH?fiS&C>I>WH1;V*6GOZF)%v8F@tricj zjLhMiHXJ*AYDVh1aGt`7RQxIJ4XwQ%nnRHxGbdHY%8`5rj+IaNWWu8Q9+t5q8*pr-FA7&5 zkfbkbZLhUY`gB`rB9>$tx%p4Mg+`G1&C zXT&E;^18m^Wz z6kkhN_z2#W;TWDitj9q-2HDfBnQdca4sLf8^Lu2;2&mh!{m*2&q~+%Z5a z5;nxxi<}L;?9;h?`ZE}*va3rku-!vWbKKh=9^J4_WN>g^r!Fmeu`AQ|@kO7dRW=ZbnBVxap+q?KcaOCniz$j##--Qp5igh9E8}819XATK$h&Z+- zmRHEHw)Uqr$JDtYPq2SBPI}#C#`k%Pzny%e?CSNnoc%0C@-+O!ix1?S?|kt>SGgBo z|H(w0VA}+?i8V|NbSykPqn?Aw#FW(w|JD!Ln`VyiLdnCM!RIyIZqII9JGXfd)A8)} z(ghgzTD06KxqlmR$QC86IUWi9XQKH(Y-|g|<&bIoA0rNo6J*f71@#Q3wh`(a2N`aSFI5b{D12u3&N*8Gf8#BsZ!c;?IpU4Ac zm|URA4#)Cm@VRW?PFuT3o*1bA!nB|alJfzQ2j z=f)p=44d>*uh=VW^5#3|FW!)x4aeu6iEv;aicrQM9zAV{Eflrm|D+?V?)9H+GZwA2?6R zEE7JBZp{7JcdX5clZ*E54Dvug`NA(pk30vWZqwIp05YT82>XZ&L#(X51z7YGkv1A! z9B?NV_gOa}@6@+vw((74v+iH}xcFlX>S2VR)ih6(@)>FUmj)T?M0)Ne#PMNWj4VuPZvRYG*-MX#tu+O_R z%(Vf+?qhWa;Of%L(FX2DfEYn7a*sCn`NfY58W;2l&Irw9BWv%q{{9iOo0`3z$vEABi|RQ3Y)zvJuCP|$vLC+NfB$v6%h_oxbEtMd zu9!xmsW(geGPT=|pAMfqLwv1gB5QupUdJaLV9{+th-B*6NS5=0n_Muw)4IPc)C}6G z+*yKr*?QRL{Kd4ZiL+E_vKy(pI^9umua+p+Ucrrftt-FlyW>u_)|!rNj8YF+4nhuF zh#NZypBcmdmMli@SZ=Gy)O=YU!)_RG<%MC+L*P1uy3G|B@+kr1xPYyc#{jk+%EtnB zm2$v#*4<=b=$t4APPjN4x`)cxM|0-KG(qLZ z{)w9P1$>G*>UE-3b^hy`n0SJp_`QlZOyK>z8XWLV;C0f0U)AC0!UW#aHR}t!r>oVk z!hh+Bz)Qc!{Sw+*Yy|Mi@WdeOhYlasUZJ&Ku2d+`)ZS6YSGLvSVl4LVHalTh&m!_z zgf`W%GfR#rKM5Fd(haFVdsx6=)-0YqNP}hxkf!xBOd}jsevflD0Z8HE&C=w6eyAX5 z$dx^%Ozj{MkEPcWXp2)>aQXWANEu5mEXksG6h>$wa*B#_m@U79XB0wRUJ~qF*%oc% zMO!m_UqwxcqsIP-AZLuAM;NjIK@-mJymSdoN(@8T$rf-#TTf{u+BN_na+fLDRX8)a z;)YG+ylwaHZ8^_avPAaGO$rT3%H8;D5zTLf-gxYRlP@e3qq0CWzWu=78sB~x0n|$_ zXd>Qw`#~}ZmDWptYLz=Spd+jirL|^I5z<8djwj-MTK-P@QEuQ>{@hFaE$~W((m;%f za(@SyL|139yVLo{c^EB>g*qMwr73KL+_lP>%3Xh;{%Ukmre->oQy!6&!OhuU8eJ~F zqEBAnV*>gF`%Q0XD|yFkN7m`nS)XfkSFYsZe+*Ye-8q!M!LW#-jRva6{?gXvj_hV` zu9%Oqeu$XAWt#J7Wt_jzX}XVvoR`T{MR~uS+ZgB9Vk$|LR5-HjOTHvPs3bP z1+FS{N!6i`tCUyOp;gL7A8wkI2px*@>Nx4m8Q|1hA>~d*yEZy33#1!)bDD#P}O0-)vPbz|5mfUp#RUB^#y$J<%95_)T}SyKdDw<8CNlW z;4|4kf`_>w704Yh@5s6;<0MBI0;O*Zo8@{rY~VCDFo$0h^$JZ4Vt$&KV`k>6vr_Q5 z2xnrpkQ~zODj16**v~Dh&A(1IUk_A(A`6cO2F#T9M*R(Z0#;Q8gt&&#nFtF)&vgM1GqJFCJKeFKjGH^A1$1fXr90@M$~*fMAz z2~SP_&a-hntzkolw>hM+mpgdjBudi8Oz^4vVe--#hH_=st zZ#@OSr#Vt69f#~gzUX~;9IEiA5Q=i}NjjGH&u@=kq>VW;|I;;c?X2&wUHdL;MbS~R zC!iT~L;DxnI_nIY=YnQsEQ-MMzi2FsI8Lq!K%1oNVT zOB*cal8vAN<(f%)p&wCB^Bd*VXOu^Mhz1$=;UF}F*H_4=lcr=99!$t7I(#^%sO$xQ zbEfP?=?o)#r5}v!)mVxC0%j+L2I+yI!QRLR?Ie;3eN*-+up8wYW306mvT{?#oWa;P zt*F0I)NjrZe5|NXwsWjfUsFre$M`9H)@~%ZSJoH$7Su{DA4}!>7N|}00j;PUvO7u4 zH=FA8pxhSaPJ&0MPgEJ}Q@`}KHR}ubwhH_z^*0Lm_SNYJ{ILQ)`0^e-M8C7%p=Nyn z-=SLl>wrV>oy0uW<4Qf^68ZlNq!XA+%ABbpS2Cq$kPM44Wd+@%;v#x=O-$?@KdYc* z((L>^>EDEoaZ&M|V!N`*t!B?$IA!)ssf&Q=4VXCs=Eu+yRbZNXs=_MNhBxaOmDsIU zczo2;>G`vBw-n4ukpAr&+bKROu44k5%rXt7GiOg(ICD1flg3>Z<7m*(Y_B@*o@%*| zC|AZ8GK~6)u2JgSRE&$KTCUV5zOoA4fxT^Wd!wdM61iWLDmvmwa!!%PTG0#|>ykA) zRC#$%KLiPQM*Tp0<;u#TLNCb6H{~QBR@8yUdijnuC2xOMw16Ui#`&PE{q+hwYuynj)YlYB&(?YQ;<;563CEEjyMF~@@iA8O8Vl!Fh(IZkwAn^hToWtAo`Kcr0N z!^t_D*ePO!#_H|wV1y#?M!IPpV|)-rQ2L|J`)H zkDUZRs?1BOFXjPqq5;XMC&auL^Ps%~zs5Wcu1-(IJSIMTXdZ{utS{h0GT*DO%;T`? z^i<4a@a2Q^IJ{eWqNrOZ=9X^-e` zG~QL(RhKI#KSS4Eosz`Nlvl-ei|!$HQ6?nl5$h;+ABNXT&ZkF;|crcE$o5P4!(d9A98Pz zGAZvZKOrrq8)9(}JU~O%L>;9quDd0lSkdVy*QBWS%vRX53SCdMz*qNpAGd0Y`WnkM zdr5bywjxfo)qtyQhH__U{m(#xP9JBiuZ^!#KSA|HNhU4S`gHU`r$^t^ITBBF>l3T_ zmZH9pfkf0MnM5n4zM#ihpG1^Y$h?srC+fGT531Dq`vm;nHR}ubz2C1d=y%rltw|5{ zOAo$Or$?*MpIo!PfKMKCCH>dI2f-iJ7AaU1-;&}UkSV%%*38Gi1|jAFM^cVZWVKMN z&pzmT$`Mb<_k3dbfbS{fT#2awHhE08ej=VC*Oso7pUi?C9ESP%K&HFB8ly%P-_g0k z3i<}%j`v0jCm)PYI5=>P?IKzt_~ zRH~~j;=TRfX&{fI@C*26$w8kV-%rIfpG&15U z?o7E-xB zTd5DB900nUvFZG2mHGlcmBagk?*Lw^@TorG)sL@PUu!Kn>Bj>KBou-Q~Te&)dIc3rz`#?v~}1@Dy3mxCvQN;2Gxy;4wdiE+UXZ!`U*X> z{|7z9hwAi<5p!rx&H4iVoEr5N`sdZ8N6=3R6Ca{~e$Dy<{`|`NG;t^+5jezQrpFR%^#~=o1x@HD$(R5Lg*Uu1oTWcf=hL*41h)wG`Qv&CCBnba#S0 zw|qirDf50{M*H5SPk3;tb~|6k zPZ}gCNoLt>eU@=7HM)m=^`_kGoc)a(GXxfmx?7 zsHi_i)L&o2XR%Z3mx}t}iNY)G80w#XL(Tfa$Jv0|kVCxfXsoZ$v+;xUIO&NGR3B8S z@M8r0qMG#u{GuB575a;7(gXUP^x(^T^eFUiu32Be-(0Oe`Dg^+7%xz;C_dT-*c!+# zt!u@&A#c)NYP$7USl;<7dD7W)g{+hxwS2TI0pm=zsTgm|xS+nJ6Sn{9l(>~O{wI@y z_YqfUf-lN?+echKj%!^+C+r(g ze8f!pGrCt|=hE$a)}B&7tUJk0UC!upk3atMFdi>SqR*`HmxuYy8gR`N81`y>K!J}$ zC+tv4ey7&%*;1zvI;sgJhsGrL#eAZ6nzBh>=dr6`~I@W=20 z6qrU3tjJ~l*+$Zivy(Cc-Qy^Z9IL={V;BQ9NY^Y{W@(2A3H zmqicDNgvWle( zq-K3F|Bk$0U;mQEO@EYqhu;`|S-{s%rE=X(9d@M^o|67R`AcC}kJYR%?4FwcK&_1R z1^nYR>!aLB555rnRqG4*Cu-Ig@K03Mr#UBI&;)9K6>{f~!^e2r2-BT17>#2rCO;;7 z9WCdx1n+^uG%Acs<1~2j4E^> zUI7bCA&UzYWN5FHbAy}o({3pVC@~&X|FSxNI|w+~9aqXVd8+;FAnYf~(a$P0B3}%v z1$$wG#0sT&T@Z~*v6#C0*))(;0s?~qrW-3_7{uD@LGa*kE zW0jkS+{1Hu3yJ&GEt=4$R8-Y{QJt z_Ro0DO!K}!KZBV8!Y|B@Ps9ZnJ#o{=36c-!GdHYxG24MtjTpnV6?;Waeuqkr_KiO! z<@2U5FPFWPC-d-zzV9)D zK~0&(P9DB}<=PT64l6C?y)#SggVJLl#E{M&Qp|y!A~JaRPG&){ zlrh%1s_Vhs?=+CbKLu@&fAmklRo_m-l{4s`is8`9GHmTVG^B&HqwEv`<4<<7Q$!dK zH^L=-2HVt0tP3mP3SXM|W?Zn+l>*Ar(Ebq1zyJ90{fDJ2f9iq-Q?(vjAKbispM2`& zb7n7B;2P(eyj#rUzl`)6;RdL%D62=^W3dHXg2&TK9};|?zIFNRIm^lSy?^`W1B?ay zXyKF7SSZV0A3F0)@pR#Z1_2tEK>DbTeR_WMZhb zhzMY--v@eil83*)Tg!I72FDGFDQlLFVp{g;NhEk`V>~=V-NRk&kO@0BIY?F>Qv$Jd3*vT%Jen>2A~?AXZMzVQZrkur(6MPrZd?Oa_t3%)2hL;u0K5oaSVA&}w{ zB%sDrRIV0Km8OLrL&c6cwDaxb+pgXEy?YA}gw?D(f*ogkjmg-NXT5? zlTwD{1?9;|Va9Wh%t6{ebj#8)De(#aCvIz?FfPV$VI>{@qw|D{>X#Q_Iso?^7ynTa z;cHSR74q_TxC8d^`aSy!t01>Xh))@_bjwgfj1jq9Qa+Xl`T%axWx;4?mAOJ7-%pNW z$0~4-4i8_QI;pTqvJ{K2=(rKLw4c3~KlOj&#@&TZv`B?+RkN~`EpXoe5G5~Ad0x10 z&-%kmgR4L^g_Ba&gh!0>uY#KGQPQ+3Q@0E;6+DNGit$!uROD`%YJ`l|EXQsI^hFoU z8`5*8bp8Qv5_;pMUcDVXvxLkSq5plVWqLU~-SqG0@8{vk8aA9fK4a1Hv`v+%UP=ns z^a)y)>fw>XuGKYErJ?I)i_*J?@9++wEig`YV%1!H3^9fO3*8t^CrgZ>- ze9jWl56XY;FZ?T~>UKb63-4h=9=^BIB zdm7RuK1n;Ou>)Qj#eBbz5MT{2*^ajHz&qGm?NY2MYuFy#cUC1) ziBk1yrYbSt1$}P5E}IZn}8KR@wJC@gW?{7UvYIWGFey|5Z|kkfOxj z@?{H{FA|5C?&al8IhC18Kr<-a@Q<9NW)F2%b*=V7+ zC#hsBSyxF{f>q64z|R|#mc~?MEopli3e%;!<=ZPz6K+~(FI91i+$Gb70yp`rCq9Im zUKk{+uB0^J4mJ6|BMOx?u$)bBW8WYRjGte?vMW-RfH>F4S~FnU1`&_Rg4JB+#hsjY3GDl1zU1w=QA6TT+=N{UWFG( zczf2JuTe5;8W~e;jIymcB=)Oa#CMWiYwaEEPyMQVhhTT1^{l>`EQ2DQ{zYZEh+*Kn ziC*8Fev5wOQhk~eR1f7XjOAE6l%XHSa+|8mQ_&oRAxQOKx( zA%s?It;nX5dIMo47)CiH7!WqByR7Koftpf-+uKOgm{#;f$ez|(NSMf{Q95HBBhyP_ zOxtM|5U)&KE6dSOXMIr3a*|Db`|9Nw)9KiAbk+w;`>MjBa#26z{c_VwqJG%>a7-_W z`r(!3LiV?7N>IPHID;)jT^Mv_OH=4gJg%WI0ecjRQT1a5y@Lm4rbTt1RZuW%c7E$^ zQ7wal^YRBK7HIm!we1=m-L+#>)~rb*=gb+I)NWgLc&DM;w#}R~cSalZ0B>1J+x2k* zr;kZ6_*{v#a%cMkNYxb%DFeN-6cdyhX_0i!f|jkF6_#bI(E3g6WtzGR*u%J)SYrb=Uf5RDjB!ts>4#w-bN>F`Vo#H^pZg^-sRAE9Iv8yZe zG+-F_>P23HskeZgD;*Mh;KUEDv*UZP zz)a|RSRF??$bzH}MEk^HZ+p4%p+gnXwnK+X@0OH_z#q>mxeJsg&CoVLZL6GvQ6qgg z#LDI#I&_FaX@@A3cIfWiyCrOj2>O+kP@kHktv}5Hr9h{BQ}S@Qy& zq@W+0QgZh_I+>u8a_yK&Ej1nmzTqqw$i&556h8!+KDl|LabubqnHoJ>duMD`x(H5{ zWua}=9N;G4x*}^rnk#dFoh|LKEmR{5cuQ7PR?R%%D0P#lVF&hl^{`Y0lI}fk>2Q*AZ}$PGJ+r@XhGpGj4S|9 z$kj4H_S3V!`f~)m@KBV#KQnn}LRSF|JUvz_+_x_QFRbaa@Gmdsce11_vu7LD6%_$I z=*dJUFG@Kk@J5*|-ncfGeXIkduOI!Ld-TYpSNC&wY?pHQ1%B$~OWY;ya_0`3flsj6 zu+1Vby3%$k<)%l;#*=-3EpMy&%~-$AbW!dm%7ZB1QmJ2u^uCj+Qr_NJ{_a67FX&Wb zd9XHBsZZrq>W5U81Ab-wuu3@9;D?JmPxkI9dnM;d8|iGCj6rB9uP7fOZQKsp@Vj?R z-iY7nmETd+t)aY+;MJ5w`EdNh^A!+^cnMk21{?cY>?_+|t!z&p zjW7gi8YVGRirkd}7Br=7tHP=d?>(4TFP*;3(m~hh%LMm**wx@y;xHWw9QNK59<6-RSCnJ z3)|_UB$^{8y|g~4UsZ0a>J-c?NZMpRqx2V{Sg379`$`zPuK+`ga}~L*grm%H0Shzl z6F$52&U^5x!K{R9+8c1i*j9n7&IMKP5$tO4Z)0XancV&$jv9C>an*VTTw*NW!}Vc& z@8Kkk0<3rb54<15ZN#t6Rakr37PC&7cILF%MKgBrrOy{E5R*3l(&zK%8|NIahi4n> zVD922Q!|(cnQVx5GGvl&XCTkP+}x3Na4{6*;V{{jy*YlOd@^gt94;a-*bevG-@J(X zEzU~kj`ATdN#pLA~cpbM{UbM4qYUIJ20H_5hMoSijM%*C@q%b5BjSX*hT+&dXEgIE_$=yu3WCR9pYe->my~_If*fuE8d4KLSCb0+jF_aYJ>=P*L{Qe$-Pf0gCGTaQ+{5KQy?5h^ z<-hPOawmzxyl4mCRC5XK>XSASGAp(;(HS#anaMt8wb@R&A#aU0bc6B8!g&5m1{-zp z4^8Syet9LIyMo}!KNxP{KsbJ6dY@1C8Quu;#jCl9A&VUz#PpH(jerQ=j1kxGA`^>l z;Z-*?>?u17fr@db1}$`1<1h7M-P~Tom#7xbx%2OaIn6yrq91{G3Qx zJ#u7Z*qP}&`={iLy8m0(u5%MNck7!FA3H5&fFY7~?UFmcXWU0D@|%LTZ3p3FL7)E1 zmcQxq`8Q2I_S@6iwSCa|2^0GD-+nSRwc*r`k?!t0oh{5gJ=vT!eflIOZb(hf9oV+b zh~WoYpajBP4=hr=&b(*u|AS zAPN$o-rhrELwg~_UuoiCfBzxr`y$sRB}R1)9TprK9F(ze)}+u*-MY<F_F`?YeOyJTDF z^!7)C+DCW1CQUTV;lKVt%OZ>?_@i+`Tb;=p6flA&ug3U7uOnKESEn)j+m;)7 zT8c85rG;<76Sac|3|+&A?PMonhR!g;IY)5hixqHn;`YpwiJaB0tfBgD2lGz%+e$5(7 z9xHc!x@yI)T`QjRr>x=gzaeMOs4s&}#%Sirf6%D{M|(Vxp+dzS&WJOKD+X}TqjQ0? z^ACKxHNBym z%ta0-(-{dB2(VR#`hfCnQlFY8IyY%o;W#NJlH97fuqCaQ(a_b?%Yj&7hO!oKZ&;IVWF=9c=azB4` zF?CbOf>iKLHW>_^W&j_ZV8hyD%%IFjDXGc~x{PEKuVv%SOHyBg9y}jq)M5;R+(0xS zMVAi!mE3nr%E8{yUrTRv4(*pR<>yawb3gfcN=iyl$BWa>j~};H>Y}QyvRTnF(b2PK zBDEgEV@=301bFam3z;kj?Y*^zc}}cX=B> zzr=N0`Q|eNQwOtaDn6+f9=q+&y!pLR4vy^Sw?#c-i!&GE($82ImtJwLTSFhfR?FpL z-d;n0p+Dc!cZ#~I@}IR|FT2B583t=pYheU$%~8e5^uYkckkYmzBWYD z`v`?5-89?emt?se;TbCW8y_s~g(Z^S88%3LmoE8qrQvJ&c|mgT>)nn_nzVY?kt5;z z$9(w>@mdCq7@e#9TIfEwo#xPdGX7{k0B=3QeX_S8=%qujJ?XefwOOCY(Rd zKl$#v62M-$=g5%``^KFXu$f6~-bmvk<_+|`qUNiDHR|^YiuF3VclNNX?C%X5rM}A+ zf$pFUlC$3&aO^sBju|*ri2*}?>)fH zG$(IMaSde4ijUASiYsAs!yX;(=j!I>+VAj=xK{Xy!($_kd7Yvh9XiGLFIdcf(zx&+ zot&b(J36wY@)j*ZLu^_gfniWLcegqXN5_x+1YJizfLm^>;;xF>xzc@oG=Fc;*w~(X z4S&8Gos%=>#h=<4hH)|7cWjS|={I=rwd?7FF<#V%m4KuANJe&ymaHq;VC+1NZx_@b zq10z00TP_Uf6{Qn9b6bW0-Q_M-Yq|o!aTq*)DM*w%8uG+l&!(Apt8lTzA#2YcY-t4 zxMmbKOVyc3_CIi(xkdEo-uK){{G996rAtUiRHvB282l6lrO4*@`tfxh){REzoc|$b zw1tK9M876Y;uCi6NQj4~SNii>?GFSUx=IM|=p43j%osi(M|&5qY$cYTV2k-^wZ6$C z)R!@Ss0&6B`NU)P?hGpxzpE>LN8TWLfBt@>bK13?=IYQj1XW+I=@6M3H=OE=F=+@` zkVe45G6#!U0?Be$f|*~g;X?`iMm7LX#f6iMsq{`q8_Y|zfgqxKq2X`sT|<);Bg~2T zy`TY+0GfyPGNA6feq(3$jhvg=sCrIng9G5d7|!5D;-?q{*G}gWJ#t4Z{yF95zh5qHprX4at4`CU4l7+&6jLxU*kl z4L^=81VP9Pkrv{vID#JvHoOO47O5zeUb(Yh#T=_}+eyFzAX`Gv*s3Az@iQbNI4CG+ zeituKf4iI%{{WZZE_rc1ygU;I_y_b(+`467K)`?jPF`KYmup(NxOD64>f++swVR6z z!;Rqfu1>8QJ2-ah-N;1~*w#O@lec$6^MJq}6T`ytCiVynFmLGW?bX@6wK6xQRf6}H z;J(lbbla!U1VW0;>>n-d;o|D*(u1~b787R{FU`@;;AdO4THUHuzmU+Ep&@*qah~e{ z%bHe6v?{SipoFH32sx?U#`r2mR?;}y+1ro#WJGJ{mK`SLFnL*2Cr2kRDFgAao9_%{=lDsfQ&7*G^algSiX<6A`UO7E`^3y$gLgF>E$F*xWo0S`0 zZjS5KD{eE%wG;GkB48Nhnu1&u;BwB{|Jn5Y`^R2gy8qBph-rK24E=%lT{RGIBZ0d= z@)GL`4_wHFg5NIy3r3+_#6~i1+ZAd>U7=Z9vBguoyt)J@`ub&LIQaQ@OUqfhWO+)0 zzpsyHTjV0l@6bWM*0fn%1EL@#!PhS{lPJIDoYIoowC?aoT(~-6V!HcG%h%B1#`v9+0s(#+!vX`FHyhBXZe2UuhzL8|jQ)aQ&dwiW*sT0-#CiL8c_sN1V{L5OgR{iHOvq8O zPKMpXuCj^Xl1^}p(F)GmO01cjoGJbw`4O|+-N7vWgU#T`F?c;bYE0x{o1sJHw1=T# zVWIRFTNLQur!T+Ww~v2de|bp77y*YeMx=uk0sX(nD5`Vks2XF$dX=xMK1fEq=nLt} zMHr)xDFVcBZGxg1D+JGIYxSzB)k_PxtsYDdY7-C`*sfjswMo6>;+9P7+9iW|xW{0M zn99$*hXw}LuP4}=n79fab!^WOaX#K&o^(j35~l^}e_DBBwiy?mN=8e76~x~^Ae7zJ zj~&u}WMG?dL2EzTzGT{}4Awt7DN`>W_a2tr3cqPr836y3_r z(<|QB%d@3Viu>#?ot>TK6CXwSc6W2p>Ff0adS5|NQyVXDn-;a}Sfti(;NzoE1pc$# z63zdQh$50-Vuy%V2GC>jV!dAxxOz|QtZ~C^eRq%eULN@A74NYoDr!}LmzTS{o16O( zA0HcUpN?ZYMMZTQ+tJ6{CQ}}9w|#JMd-|(mQB3z*rVR!+u3N{~ZJQ~|f*qHU06V-jB%%Ln`7T?QK z=HmE(4iEM+x@UVoR;xcMZ8WveS33ZJQBqUbFf%P_t|~EGy39`bjWi-7tV54}Lx_e~s@%r{6m1KI>chDV0an}RnE#`j4YMtH!}DZqoA z7Ua5BxO>$QD%wt(?BSlibY_rC$4+qrh7NV~_K6q~7^t!4pG@%gPx4P-dA)n9Xabuy z4X5zAI%nnrejQrXRXt}>f<2&>=6nEP*0((&= z=9ZM51Y?bVh&Bp5`;}e4?ixCL_yl+NZr!wB?C-&MMY|@rxsGFTJ@!-I(!l@mkaa{X z;o+GnGfymbjb2DvhP^|_I4`fvOeb&eh!LaYl`NOf?d|I3@0ZNd42x3RG;K0l@F`6? zCq31aiRdR5Q${O^k4nS@3giKw#wPW3!|9iPe657|e_)3W(zzk_b{%_pc@7!kI4Ep* zU?9f$f?!rR@OVw!_?B1fJ-?6R~S)Z> zI`Q#7zwm66{{F!G2!P6 zS{b-1cqo*4EO!m zGNfzaO1ga}e{??w3)k*zo%w6CmZ1+r!t#cW^lzin2ps|XPiQTmA7OYH9)(e*!C7_n z?a?6-`BROaFotHn?5bmcpO<&b=G{9-M|U2RF$(#jZTmUedV0EsXimiPscroxj|uTf z>e7A7+CK63@5LwO7xir4Ai1t<*w9g-ZQ1l47(ZL!o&wn+?c|JbreGYcIN+O`)AYa= z*v9zXlU`*sO>Ek7g+tt)+!yKi=)6K|a1D=jo?!Y;Nler48f(it@YfxCOXw2fHk2)Q zRURVg>mbTy7$nLvf#bH6C+Q_@$Esy%@19HJr5s6biUqh@2Az+YMrEH@l#O_2CasXO zQFgkbtRc#jdS57IBx@)uk@BFsNY;dwq;M~`bjVg{6+0q=$VGMuwi!7~m*#Xzv&&%L zr}XTZn%c8xiX^x3wm8JEmj(p#1CrhJ+);UXqef4svml{>eO#IV8qQSEV2iTJ(ioI| zRYAixo}h6<+^s3iNOKBtTOs5D`NGa2SuZ>whVV5xn&yHMv7FFtd-No+0E@ydn~Qyl zMjpHW;ONLApRHS0&7QS#<*eDOq>ijPvu@V>fNSfMpZ850h>d##PCcC+n6^{0|K`@M zZ_eGi1sW-~L$MH@=~^*AGr-FZh@a8AjdTn2D*ZtgAE`XE40dZRez?QNjT_|?*h$+} z!ta)pFq;wh8p|f~H>QBGR!2{KVsyiiBEzI_e3_EY{jyZ~3?(NOOJw3K~;%AG8 z^d?2hQM_{U`>QXVFrSPz8dePVeN=VP$YCWx#O4sGKgl0P*)5%HaymkTt}gxkmhAX+ zCDt68SE;bbp&`G9gu)`HSXk^|vu}9;CxJBWgRdV{+yYKJ9?>hQq66LoeofSXk}lmow1=v=^fU3cC%Td z#?~pmerdg8)9TmPcCxjJ?U6ULsBlW{`t=(3Ib^YY~og|M2%bjkRrCU zlT*viUFNuXdV06S0j+p157$=Faf#v4EuAA;xw|1e}dYZPGNpP7lf6aJz>hE70u|0HdynD?s{Ht`_{wg{xcDZ}c;+ z7X*P){r$#;f_vuwS}Dl4|5TO;?OCzmCYA}NwW==@mgOa3bqBu*bo>v$NeK-*Rq>mA zylVJOpyh>f8j-}DYAJnJO@)K=Dt3jgOspL(``2Q5>lHU!%IJZZCWSlaf zRW+K*c5ph>jzPCNe$BwRLh{x$C4HDaWuV zF~r_)Z8L`^A5nh+HwkdbCjyTu*3V9USs7}VrH68h@_W4!nlwooK7slitI}eIFI8kt zRj}>dJ2ZHQrvT+u6HFH})r#t*kFYiB3M|<Pp91Hf{AWLM{uTe(uP;k0U(aIODh{-m=TaVchKQbdmF1_= zzE)+0I^$h3oCb$y1-8k=QX}5eOIoHZKcy)H0t3T4OsAzS798lNv2QX?7Kljlhj?mP zWf3G<+S_-E^YW}%+`0rcZJF-wp)pqgiY2sI+fL`7Bw)?!53vFNXxwQHU5n(`xbKjj z&+298^S`sS&AFcaYnZ~`a4ZtYryv_i>q~lr$_4<8Zm#O%T0vv#;Y3(hcoc)M){O2x zXI^wnO!Td7UafU3Q`g#+Z>VhtZ`;dG+Z@Z!eBosmBqkE4qt20#%It5sZ4NR~~rjdrGVD59-gt>!5qN76w&*gLH4ho8i z2^y5)Y3J!_x7NeP%hOi7Ejf8%y^cgfr+TxJlV{^|enDbn{l2_)J=d_2*S3X(FU39Fhd4J0 za*?a8$c5tZPpD&Dm`f&c*q8EyuC}He4aFwVCLn2Hxeb@}1 zlN%fo5}eBx@yUJQ2ngFJO#}>zarqc!OjtjFu(k>?#^|xsi#QzCqD7C`X|RYHme%c> z#d>==xcRwgzEUY8^GJrWDT4;@9UBigpGb}0)sq82M-TuYvHH>{Ex^A>9->(T|DO`zjz&;fa2KH{7hu<^86wzVXa(`n~QsBoTaOp2oomhC}RQT+1yhOFOZ`CR^+F->3gF75$PNYMtP)CpU=}|;Y^kCkWW(gA-5;Ok7r1u6Xn{df~mp+8H|@BIG=`woDpj_3c|_uk#no1LAVot>SX-8ZY?k{%TgT9I{uMvO5Ivj8jatGXo|GJ8Q_YwTpRs6e;;LqjnJcbZm@VOvQu=5Z4;2(4e z{-?^n?55Jc{Rn+GmHzG4^wD1)Z3;jKaTtxxW7IDS9h_;F+UbiRw^7zFDaWz~%QkB7 zBlrbBx55V<;A!+81=i245|>YZ$%FSV(bo&NrDTm6@bPkgocpS>;RD{4!%xd|TH&9d z6IvX9PAmKq8k~pV^eZI~{Z#N7E=8bUly>Mf3pCH#x z6`UXi&PFT!CEVojTm!*H*o43JlYxI)_!O_(P&p&F4ZNIHmRAd&`YsshGp%VXRikTb zvhhXrfM0U5^g@khDZ#CO$QJ}hUQdlRiOV%t#dlTtTBTX_cL?OI(7!9Y3jQ2_l{JyW zReadIYE`b^bNR(_I)~Aua&9BxB0(?aP*yCZAAqlnn;-eOX^BrZ@2obD^Mi7VJhauS zoWAGsQ1Ru}x^g~;T-SmV$WO&be;!wD@Ekt=5VZmw@S~1{vyvO9KiEcJI z$142`L?7}5U9J}&a`*s@GtdVdbV)DPDfkP}pONY~Nay1KqY(7V;46$*`G1x3pU>gg zDU>3$zwmMIPL$|mIpM=Dj92&<5i5gyRD4dK<~E}Qdxzf5b(Cu6PyY^$Q}H4@E$A46JcLjDsqG1-_Ou<-%pdNj zCHz;d?*a}5h5c!SeoR*JHN5?ZHG>YcQ8=v3pTc{5{0>*}L7(623ZKXdR&;dwoAA+p zhqbjN7jXrL+wdrrxZ->6gOAe^|F$%i`#5{#{;lwDOL$)ma^Sh$+7zI_#)MP5s1|DP9`y4M`kyo* zOqu8BXr5#%?f8kn&yW5GzV0{ZOTP6(=&p|V0)7Yd*KPeG@JYFG^g^xX2FnHg@peP!38P{&lPXh>jU>dUsL5*Q3{d=J4()d{;jU^#*GT*+SHt!r}Z( zzYg;r-X#55qXoR+5q#rg@S*pZaf-obYkc@Mnn~;pzJ_Q?-;u*H5C0P%`OXWueQAlW z*rN+A@i8CW<^2mh)O%eEL7=?@<<;~~0^|d}2`*vXt;)^j-{o@psT>aLA?eid|0}0I zswFo(k>0AFW841(8o9=Iao8f9Jrn!vAa#qyICNoZ>IKg zI1$hZyDJp>(_tS!;q-eF9bu_Bm*Yo(ek=c-ZmUNOf)N~Y1AE9bjO{jlq6OQ5YRC?+ z_94Ms-4mH_?cKY(eot+IG4S;)xk+%HFli6#T$A(4vpd4V%jJsg6R&W3ydKblI6;rL zG4M@sc!eI)N*O^8yT;G7%gEvMytVi4i@j>r)vV6W-x22Dvxd{bxYq_E|B4w*(hfNO z@t8Jpq9f!YdGOph?(~nJAXFkI*ry9o|6xZ{++DgmrEpkE;F-jNWm^i~U{3Kbf8V{h zqGC+9pU>|2R?REW3GTaK?$U|MTF7P_LNOZBxDI0E0dG2VM~Mqu zM}~MBi|8A`72ER*`WATTtCuB22M8aw?V^rsr_zTnBbs2xZpU>yDD=_iNxC;- zV@j;g$ZIiLTF`HSPbQ4>!|7j!t>W}OO09e4bvAyGwMF4a=P{ufUkcM9C%wmn$I!2| zmO-vGyeF0;E%WN`3L@5JN@!j_$JUVhh!e5Khln0)(T&=%d?DXA$julJ`Ma!z@+wO zw`i{);BP8$TV8hHBQ5|sN?hQ&gx{bu9&p430PmyH!RP|~G;EuPp7ck-e_0CS`orTC zTz?e&mnDpDJ3hrPf(R3OsM3f2V6MZQUrUiAz)?=c-@^3=c#ywM--!MsRo`xKeQU<| zXn|h}L(KW-^e>~{QtJ(Q9r~*oe=gTIh5m#V_=V6nTij#@Eg%3D<0_M&v*bQZkLVO*t z^F{Bus%sR$VVyyruTeNZ@FGFyW$A#upGDr!c`6($02@B<2f|0cQO5yJ{g$Wp+pAno zDEAor(w1u`ozidTc)zv8Cp)3gpU?uor%tgG|D;d-rr?jIDP849RQs(JKFNpo+g9GL zR`OB%4U$2>y@#LZw+RZp(U>!qQY-;$14sxyyyB}&Lc2$xT!?1Q1ZX$2*{Npy;QxW2 z^%#7NH=^639~Anq*PJr-kJ1kcePz7;lOHpD_1f0-(e9-*cdPVm?VbcZ9wGf`r*G2> zo3C#3y{}7ixLj?%y3O~#P98ht&3$REM_pC^XK+2@zBJdP5h`5af4B8dRZl&p2DX@Od(j(u!U$B_qBAB0q4G!CabfS+G}kB zok@JHbX}6T-9$MXzBGp0m+v_o~KA-rmV% zt%)o0G2SV=%o^H5$TBvC>;l|e++Q^4D>J?lc_`gG8n_LLjjpwVu z;WqWllyLmeyN5PzKA)^sq@Q(f1;>Z@l$8sa#j02@x@$X>^8qnwTF0zuTiF z9OIAU>kVf#Pqe_d!F7g9b03GVGn{=aTyJ<&v!R&|e0&=}FHLGerv>~n3^?)0{VvXb zC;)mxy%lS}$H4DefeASJR+mY3M+{{&=j#k-Ruddr@Cf|UW`gU`4^;}jW)H97td+{C zv~ag6r=_{YpS@|NkeaQWf%6-RiAQgE$*R~d)UWNQz^4%WvULo{p9eoq>4$zGfPPTh z_bB{sf> z_-A+R&q%&h56TH-%3I2}MupGgaJzhUf&ynh0y9 zeHASzqo-NE;7=!^J$S~jzJ~0%2J<#iAN#1!%K0;{#r)Y?*vL5EFFE{4y)}x%mp=l( zYYif}^(^4C!9$3s;GeNV@d1Aw@TD!_m#l+09n>xCYym&3j4SI+zz?*5zp3C`KLR|C z_lrXRC50dB`;WjcTf;bgv|DJyWgq*veqk2%nKC9?^^5o=>JJrT1)7Ok==~#bd%s}3 zb9{!mb(azX%_5*~c(R@_rf0xvQUoU(nk} z;djZQvcsug6#O$S{X8yb1%7G3m;^Jbw96N8>~lj_CLx2vRrw-EPJsev9)P#9D|og=eU`_cHOqIU z^{)6Dub*OJu)|at>VFh|*Rv&@+Na>3F+LuCsq^FEXY(Hqf0NYJRxj6Ih5k#V5RZXh zc30qJR}{OQ!qNd!CCJNQj?*XbcBcsM;2CCVKF489>2p;0Jzl0+9(bm!;yRTgIPquA zV;%8#?HVpC+Gs%^Vh@6NdlY_`foVIOWToJrVM&jLUus3C8UHMUQay&wn>3T#;9OP; z{g+tAW8s%o`XsBRod2|J&Ogm!phNKY0S^_^)VZ(KIM;9FvPu(%qt$jj1cBWuoK_Sz z*@BjCwE|b|XlwiXlKN~3mteEpsazqKdm2RvA>CHvT(?<$Mq1H&oRdFCGDDNV#Z8)o z(I&;u8;|%F965Y`)PK0Cj$<2KCuVZIN9Vhnnv<>IIx&krTX&E><@G9d_NG;-7qhaE z54cY3$;-922jFkIjX&%ia=a3br;Imhhobj4X=?y{+u%A8QpRUR*P38e2hTyHo^yTxc%GhA#1m*jlz&xRNzcsW`;F{|kPWarvHDKk!>0ng?d_|9le=<~h(cKD#YX#?4`Vlzf zZy-baC_ceE{SUa;|A2e{6VBz2)zhQ&Ih-8o=6b2URL z>~x4>qzXqpsyxX~hZq!#dQ?#CAIYC=bclf*AkZi8PQ@qt9AYR`;cm8ixor+Hj8@^0 zH}Dnv+s9^?g`Lyz*ap}BVS{UClH*2jZm+0bn#&%s8`69m{v&n__+;N(;`8-A;tT40 z@GQ(>Gkw4f&$PntfVc+Y`oM=iA#M^b_26+O1>VI5*UZ#lwpZdB+D;@NF%*-(-f+{Z z*jtVdxK6})L3_BJqPVI;*Ji(1v2;;LM*qRnB0RQ6&KCw*4^j(IKeIoFm0^xXydsP( zC?WZ?`SU*2ejxu|F7ByS+H+9ri!&8wL=XW$eFwGK!XIb{;^X2@wgQorNgQsU&kUG9 zT8wWFr+BThp8TgBqIvF7eAH)Ke?F`FwF-Tb>xq{56fe@!JcxC%>X&gz5l_|!kof~H zD}Vl(aAl4g&9EC~lPZ7q8=h5jT-Xn^^EC8?&eVm7(H!%r=01m4Nf*T=qJfAAw{V7= z*qg>bl-ZAGd|i!a)GD3fPAZof`l5x*Y<*(=7oXcncXOx?VW%~P^MaaimYQ^z!*QxB zgu}lexc*}s+;E+0LA{u9gbcuSqJsAwJ|}Y-^74jf6+G(?fTwaDRN%*~+(uge1U!Pn zV~G!saN$d?n;PW*E$%|}>PS|Nw=@6XDi^DZD{ae7fyg1x& zz2(}1%Zs;PJ!b@4Cn`3uUUP)k2c5&&;AZ$;&E6J#kd7*JpKZwpm!kqdMpLgcma!jC zV?PA|8v7E-SB-U&d^sFrzrrS8ofnsH3gg+~kf9Db{ycaL70sG$ zL|s|g@n<_QR&VJ)M$8mrlzItceG1B41l+>gkGUA1cSyeoeTXK`S29V^d?p@wNq2f!nv$|mVL!z$YdU(!Q2ZtezHvPw_E&y(K#mA54^X9 zqy((s)lC)s#2=nx>GJD91-hzhJnH|!|M8nLV z-#@>pqOW{RzQ8gbDbL)Ha^J*?`c-UJ%WtPT1mZ(<=XE&PIMKG?hs`3ADp$|hd3&Us z!d-AP4{RnC)862$98(xV8LKm9K;jp5DcH(SVK`^JrkVZbGOhUItq4%sQqZqrlMvgt zVw3j9b0m=Gl%J4Gf;CkvN1LccN`g>ie=`NJ#kH)T+)yi@X8pA{<NGX8VOE0V|M?XTC z>+YE|cJ7)nbC>XN;j_;!Ty*Rh$)50+iL<4d=mq5H!AGH(Efao`SK%YAJlGb<3c8NI zHD14f3k0dZ02d!}xSq?<2nia+lnWOuI|&6yBH`$YRUAdq981A`?KNTCg$s=)1snKG zb6J?oR)`b%SOK-m=g*51W#}sM6SwV!ePGJ*W5h|V1l%joAABjdobfDut+M^t8jQ0o z0Z3o!(gKgQc&406lwkkUL=H$N^6sKC*tpk)sd2YmOeRsi`|GzOtd|%m$x< zBS+-qjw}#|Jay#g`VEJV)Z~mDnKN+YNMYmV71dj|R4?DM6ckVc20nG<$Wv&L<>f~t z@b`M=d-SM$w@xZ02~65Ga>SmI!r%W#`{gyf{r2`P`9g&}RwA;=_SjwkIuIm{L2Aq! zTnF&7YtZfn8R?Vh`UI#d>>Hj7bSGPg1J(o@y@MO;V1tWK10JeCnx6|ai?pJP45A5a zP7baUCc>>~^7XKT=OZ*j90(rj;K^y}mFJ+@7PhwB`i5dV@h%h-%AYuTbR~=I@RKarrBCf|i&g$d> zApS=(%0+o{(QB+7Q{oKIYb5Ou?faP1cVHZZYMiVO1UlL1#O`1Z4!^~Z@EKXT*&XRa zv~L9lY$M4Ak=|(}HKhE-ER265Jrnbwe;yidIz5COrFiX9N#8*Fq}S{4S?4BVJi0jH zO-g#zPH;Nr<2z`?u;Ybw@AMd)8)?*QbuXMb^Fnw+OlknzC_dMwy)o-ta@UJ{2dvJ| zk2Q62>y{}0Dr+<4yl7KVmyu>aRE_!jXYE4q81feJ*+@_G6|+7sd+WTcPw-si@j*!G zf%{a0aB58w?tR3zUAZoozw?ef@%k0EMLs=Y!eV4Mox6BqIkg34b&}3YKTRnsAxTG& zF;GHVf`ohTupQU0$P+*MNS=JQ?8t6_7uaefnMK-6 z)-VDWFtZUiZj59%6v^S_Y16q%wbbemy!Lxq3NX!+F$4&E{E>q=2~h$iqnX+ogr$l=ff=?w)AL}&af0j*d$k!=&RKJ5rhJ)>O$Ax(LZBwpg!j zrVA5Ze{k*M(r1@wZ+w6L?3YeWCv|>*-_h;FTyv3K6mCh*kQZvgOsY51%c+>zgp@sd zCJ8fl?Vcq$TV7zt7A<_1=BC#8p-$?x%0?p_Q(HS})~;PM1a^@Lxikf;{V9$WCkyC5 z-k+d>oA#WAwiu5hof1Hn5tEBD+n+yw9=;2Pq}=qm;#F|DT2GMPLia)(0s+uD81Yk~ z{i`@uKOK93MEeNo20&#JAN!oT^rbmr&oX#|f)F^pX6mr@`6MZV@W-DhGK{ywT3 z<+s6$(Df*|aVwaP- zJyRt?(4`F=ax%A9H%Sn+X#+3@PspwqZ;N3`!SP?v1^5G=nzyB2wC(9^D&+>mVOMw} zxHbqcMzacqeag{-$ZPN;d{Up0>qu^+I|_r#;<*siEWtcw=74&(_MPyWS9uT$=P_)y5q=Ha@*$hjv?j z{;}us@$b1~`On|JcK!D4>(_1*P2{4{e1g0RY9Bxx;GA-1@}!w!c{Oml;yrn~OIzUM z5tk>~@)_Wj_vhpX%-vv4(-PuAMff0j`C2)5y+$?y?gg)o^BUg)+@a&#S2eZpk}Q=I*nC>V(@QJ4*lFo zS@A2ncW)b*VCr5yV8Ec9>TR_pB?kePrY4$36(pKWi3OwJC6<=E8XWo$*wMwyYrw!2 zOLB8=U%y;ArwtiDO$lVR9&LsXLpcJBETBY)l;2vwLgfz^x;Q(hm?@cfj~?@LlDl3`4+#zq>cM}4I{|t3*9&{Wub&3qkc%zDrx^|ppI?-u zI5sw2$eC7?=78Jk=;-LkitgRo`Xwc#Rd375UA{FZcMO;8+1$dInB0NLG!`QqFL!k? z^zXkj*4u0Qie&?HrcYPI%4SU{RD@rcm`F0FyVmoxla+ZNilvTW!JT!JFBQv|SU2rt z`R!u5ex;ao1^ZM+ye{TR36MP3#VX+wOSqIkeiZJC7fbN$kU9oPQ}M+yIM$(}C%M0c zoSRxUL8puYozBtS!-$Te9$^y(^zA!f)UXKr8>SPMHNgrkUA}b5!zGJXpzcDHD?vF} zTNlcCfzH$$p^>=!X0%#pRR7?RkYJs#VlfI)(Ire+yclIEUoGXcAv=q9KAL-0STsRR z0Xr^h>I@`+rHniF)URDv^0_m|`XAwdI28F0bCkS*@KvhN@Wo;l=5hR`<~qac-Zj}j!;>LL3UUn@YZq|_G47MA%Gp>^c3B0y|jj+SYtP|M;aXety zZ&AyR2CRg`3hc06$N^a-R3nGtVLL1Xuyq{vTr1d<9M)imO+?#pkFcN@4%uPNWsloo zgttgUK1u<5I4Um$L&OaAzG#O{gLd+~mBIl#40uu-Uhk=vFyws%&km!SVaNsf499!9 z8HPG?giWaTpdIE9y*efaquy5(7<6tRoH9{+6Y&EL&$o^gAI)ha9m#<*Q!LH)EiUN2 zZ{)Y~U#!iyqxNR^+&$vCvuB?hvAd_RNOoX%WIusf=CZT6TF5N;FtaIXZ}02}a?c0Z zy#>Qk`SenG@=}bva%-K`OP7rGK@9H5qnifI39x)H;Ed{1+&Ns(7=pDUb)*9DA1HF-*KFLe&~pcQ$0N$*Se=92ChwU>bP&;hJU%N|DZZ| zWs5+7`D z@7_0xi{!WDTk@y7D?5v$_Y{tlwDpc18{o#H&*nle2E*6E*%)T)817ck3sY=>C|OPl zZk8YK+-bPZ7E8nH0a_%EV&mij}b5aiuO>SQ+d8VQgX&Qa{k>E{uSfs#+uk4 zP1V<*efGr{U%zTz)w|aM^Ai)<76<4dLOtuJ^%5;`6XI zQ&$dq775?Xh;D;-4nKyw9qJtI;gX=I8u_bP zpyf%10KS&r89xWI5->{#Vs#e|#zNg(LXB9uD~Ftst%;mCqsR|0D=(aBJrYc!hlw5S zb0}ff3%|d1<;2tY_uFe%Uf76#>~_MeK7GXJKm1Vsb<-v>k#2spd{(uoO8G+w!Jk#Q z6Y19vKZLyb-R*6zfrmC4*iifZ8I;`DezS%LowufOMyaWI_8!ctAxhS*mR;fsV#n&;4Olqt{a6@dYooptZPZh48Qw<65L|L( z6roBa*Z>}2#Jxm3+ZcxV|F3yS3N`uOij^x@2=k>&$1)d9x!k~Zes{NWX6m%Ac_W68 z9A3G2)XwCctKWU8aDUJ2ZG#t9jab?Bh0V9$7(6@-ZTk61rhDSyEj?SZwbZg&d*kM< z^)CmxZ&-XPp_BLj(In?K&=V7E;sdnBPt}-c%4qGYoq_ zBf)EXTJg99Bge1eIlxg02*6c!P%Eeu-1vNU?c1N~*4N4(ACjzcm;3m8FY6-JX+IX_ zo474=Bg_Bg+QXA90=M%{m+ODIrp=*s`gr69szlr+L~{-OjQ33!;uprY2Jdiq!-haI zN-jB_K0qI!b9Hld^}rvLe@eCF8qsJ@NF*oMgg=~VdXc>Hwim8%@DcR!vX3CJrxWB8 zJ`L*&x91J28-7E65Oh9%5o6ECuM1)x*GJZAOK(gpc>9$q&lsbBjAzv=?-opi@n(Tc ztn!HUH^zEYF~$OWbH0LL8?l8#w$TM`M;r;G3a&Y%Vl*AA7m_}=TwqJ&<-+8zE&J%9KrLg47A-_<{7tKdGcm81(D4O8{W2r3rNR;>@H#;;$n`CwY9ACKqkz8@fL%CN@ zPZ3F_EYLzj)xRko6wh#rks1$aro-Smx<)-YJZoBDN@P^uyqtJ*r1$Nd zD2EPh-F&(RB)K7Zw3mas^TPrM!~O_gKX;dodprxeO|ETV9fu9**U6)s|8R3!&-|>e z;V~n8Q`&cMbjcnvu~)CTMVai>K6jU({xJ!0C2JBxz1+Ng;^$h{2So<9Yv<gVZ_sO%gW8^{vPq{uSs5JV|PLJWpLkD)y>$Bcdg_Ym(|nBm>kz0=BRc}pjc zEgM~uwYza&V22JJJv(-wu@ep*ragvm8u2cnkP}~R*_Vu1;wY;zld=Tk{bCFZZn5C0 zTl7TP^psq`$S&{q8B{f4_<)iFGmF2OmzO!Ys&sr-bX+w1tGlOvbZlpLK^pT*&g9G& z?uofToL5n?psza{ z>Fw6{U-@oue+11C>nJH%HxFDz)2wbnecU}mtOctbo&Y+OGFj4l;QRtMeJDlF$v+aF zTl`Mdwry4KEG`;8Zs@R*5o5BGdn8O@+L2R=CN7@WyR5ADp&Gx#@3X0F+6Q%hHLE4R zpzKeI-Iu3V|&ue-zUO@zITfX*ag+)^`P8t@B~nLYAID#QDRB7z9p zxZ5pZ5He`OK}(igGb`j$(d^)mw10E{nF-~Wioa-d-}6J^8{LGSO(&y|?k>MRefF(l zi~P`OyYP(Oyf`@%=lANvJ`%7c9h4cd1Q!8Df|IvX=Y;$na?xG)O(|TUVY=AQd=s+Xonv6K+*fK z8W%H7CYVu3*C{&Ufez(5&eKwx1I%3Gi{r(*F7oTWU6^~9+uEem87W;8Q_sF}tY`Q1 zDVM)pp4DAv`7@rq?--V~Tw738m9wmB@vzZB?tOYz%M;j=ZE;=dveIT%WhG(_iTc5Y zG!FH9;e(@+)`0ANFy<5691yQ@lE%p!J zXQtg+y?@%L?4DeYnPAm{>7Q8|aqDgj`l%c0$VVOS=qW@gl{q#ia-aLXC2Q9%xu?DH&F5dd1`)%T05%Zq}>N0WCg| z*1I*$y)<*KunXW_Wq7^^fBdOD$L;e0p$To9>V#c$XKCHac2W5~(gI$-4F*>Lu7D#N zah7p&XV%s#WOjYOSFV~Us@6&#ptt9={dNwpPetqVQ zaG{}r2rvhgfA<@lzr8?PcZm zH%tcP(rH zi+mRT`ze-q&N;a(D9Y0iu;jm6bf$M*28@sD;w`NBKU+%ntsHaqLD*kUp7oS3RP|1F z6Kh+QGuxaa9T;?V)zed_KE3MdpyHczOp6yJ^Yy^I5;%M_W3lM?qp^bYekf zC0xqA>iWCUMH=NDa7=z#e&tvIkE@-)J3m`cZ-@qQ9ISFegkSMnuzm(**@|)8hE}<> zq~jTt>GJf}(;;Q;)zk2{&6q4NGiKz-n9S1&aeaIB&hCwU>2Z&U>bz&y%3D z-stmA@EXE2@!&^Y$hVk-R8{1PYSU=PkRbaZ3E`z-W$~ne@nyp@D>F$0yU!LjlX8j= zhfkU`JRdh|HnGA>mt?5xwic@A+eE6@9||eeKD}}8KIXq~&tEsL|Mk~(+Vvsc=7TpE z_zkpXP}U`|Z}A!O`;jtclAi*)L5S zdbS<(x@3JEo9I5QZ#F}p+Mr)`ERTOKlW$7voS(I6MQ z`|n}DWQ}{KRE4`(ER?XzK?$inM@~082X+c@cJ&H~jOiTY;p!3O(K*yL-YX`-C!mYh z@RAHuyjQ1oa?j|vA-n5}y2XSV<2pDRT-z8^^ZKUy2UZO!FlMx6ZQ42obawM{ZmXY} zRX+2H&~4fWeqAi*uCCkOx7;<{H^M8xCnO-OXX@OW@~elc7e%?7O{oFJp`*knInN$y@@{d)T)ItB$rIY#(8hsP$bnBU(Rj13c# zACv!M8fWSn{Kob- zE2#@(YROC-8@}`2K8FB@<8Vq+Ha!Vv0Jn9Vs$rj&*YBYM!h-4+ht() zl`GDRPF}t-UDCbXrHr;g%x%7H zKg<~DLb~b>1RB~QumQ!3%O)kvUDkPOK}Od;eJ=Fr6MOo|XK@wt;)jhbT{3;vwAnLe zo?2A4?835XvkMM|4$5C$(tq)cr>B6AtgMC81+8K1gF$q1x{rx4; z*)=deRp`)_6;F%v?3ACmGp}=p6&>zPn{V{%v${=Y`U=n2M+5|UCTFrGM^`KzI5*8a z#mh0q+ac8)9F-b&?eMFW^P_skiI`LG;~dZ$$lHfj0E{G=pqNS8Nu%C(riNff6_~RN zl-{Tlb<8;^H!*8oQhLwy^<8_eE9ukLXJS#0X)~E)5Bbw03Eu9dBRpBVw`Y$xC9j>f zX?4!9?c0Ua%E8a&jFy+nf3ia6zA2>FaLdDu=x-ma@s>dM{jft}%WgrAISnai+Z9^m zreo$x&^U(pV}H>9_@TNwVX9@53HMIjzmFTIOm%fgfguHNlOJx|hP@S@217nsRwAFX z{34$#DLbNO#Ay76ZT;>$dD3^JYbRkNoVksF@&&`2WC1i+;)hY%Z7IDe)HeMKX#iIh z;CRBkf--IwW;XgscOFJccN(#lfFBTt`HIf9(Os~Sv{#;BipM<5oZzmy;hHx@!*Kr) z#f8W~Ku68oK~NU4B4S-#R{SmuU4MAR@0MfhrSa8;qn9lkU0A(1Av!vNz8AA|^^>Iw zjeg?$OSjZdZp@JGG$k(GB1~KJ+G}g*JEy!n2j7;SRaliuIO(dVQGde)h@XZjruW>n6Ohuupe+zI=P(o@q~Y&s@nInrfH) ze6Z=?m#ZpcvRQ0maSq89^9j%0N^5JrjwDT?7?IhD-vF)(5W0i5Q1p;>XeeNgZunj?{MwDrEUUBymL2Zl`Fm^gv1@|*%H_YbJuxnw z(2oJMlM+mc@pVSU>!zPVFwUqrVZP>}lEtH$29c;nxnzZKK5qx`M>92>&C@s)SZ zQc?1I3H}%R`>tKCuer!Xw=VYwrG|(p|GQH;T*m#qtyT6C4 zr=v?pkMzR+37vhfR3^1$9liYHyh2CUGp)BN>A=D{F}Y($uN~ZPx<{CokDsHDe?nJN zPv5@UXDog7CFK_n4DojD*yzsgx4p1xbZ5#l|r@YeM*C)frFJZ*t*QQN~yZu3xpI=zK=d6_Oez_!-q3QdG^uK(C6#!|cJZWk>UgN>8fp=Ni;IWXP1l(TkT9 z7KTM6rz}fONlDJ@o0^=Q(yz;^Li}6x^eFER=Z}nw2$-4DZAM~LfTwR*bx6}g=e5|HmiF0$)eAI_<)oO7aGy9N2US7)oRYs-k?!}H(GA6{5FXZN1U%1Wbu z>F^F+UKn1ru&7JWgsSCB=VXnNhV(C#xAe}MFn<0ve?u&yALMV*UO-z!1w*jcjMm$TMGF|3ww1>n-ZQqYUzvriXGqetX%PI z)}krSi0_R3?(W1W%QY6{?&jvcIyGeQpb(3`fya|#-;uu+ayzY9Oz|b#4%A1b;ld$h zgn96h#nOg_N0Vcx*dUl9?U&%U4aI~omX+ua(=~6P>9JF;9>QfgJO;$13A^uMXYB6x z*}I>;D*wa+ufB5rDx)nhzO82|PNGe{Z$3XZ`SS@P3N`sTPB-gG|^^}P0mmv{B_ zO-msRW&Uc;-r2lkYNlIZ zF-2p0&dDh39++cHO^-;6A6HzxIJP_^uOK3=XMA$}xRDEI#1y?!xAEyi3m4B{vQT?w zWS~n#Y?!}8Tj%^9xuaa%#zc5V#YaUL+By&H-lwpmRzAjtTHa=xJ&P!!&_J+HjyB8kJ~9joM>!Zx9coXrl)BiSX(o5I1l?1bf0Y0T0l zfAQ-vb#^3$%TrXH#ag(+VdeKhfiuSi?7H+*(yb$q=J)3rnJJID#`M5LX zr?fY$@USiC5qG@GVzI-PStR?gdqpU$>0k}SJN=g^mWFxMti^PSn3agkRQP@5JLT$Fx0X27VJUm~-!l9Oesbjj;wA2DX*}Hh`3eRh zaw-l#1cX>TI$2pA=baVn=wGEbN5W`ePG#&OtHiE zxl83A<%e&3KIs$X=-Dl(dz8`WK6hBB&K3RV&)=S(o)IvK20YJ6c@w&e-V5MU09;z~ zdYo9apMPoY*n@rg2{$&z#O)qadfkFe50cwyI0Lu?0z2g(fzKWAncm;lX`ZCQUHJe*WzEerX}2O6E7Qs;=OOP?C&p*dQLu7IV2)-*fFiiIAxa4T)(i6?g249I|RMbKF}vQ zvo{p5fAIS3X?{lczQ&4#mn!l`ul!7Y>BOCoCCRJ$hvion)@(d|_0>(>&S+*>ztf)4 zMq}TDd^_;(54qFQ%RfjkB{~OTui4oxAkfX^nh<~mg`(3sJ)6*N=#wmbb#eCCVN0Kp zpOIgC@ifaiR?o6dH@@NIB$}Ml^HsvE>&vn`M6tMAY|PnLOUmA#cLc`(*!GaXqO@to^ubF;rtO%#tLH!qOO$_n zt9;_u17|+_zWguL%`_Xau698`(kT|3yQfrXrlV*!2h#38p~qAoNbO{-uwWUQnHFCi z=F?%{-DO3kX~X7~KEq1Py+=;}bisg_@aWFLZtc800zwOirws2CF*tw5&gqjAONS3W zUNNbw1M54XhtsjZ;Edv<$Jb2pbPMV}X!F{!3x>q!=S0W5cL?waiu4N(ip&_dZBb5~ zhgVW(-{fgK>PkjcrjY}z>2Li?I|uI&4WxD`F~(3QY@-q5%12vMNKsWgh5NPwuyjy7 zVq4Ua@W=z8fHv^7`Tm29iN-GPB{N_1{os)7lmD5WALH#A?$gfE)ycEl(30t0y*kUU z7+K)(uE)n_=$zpd2m1R=*~;AfyRA98G|DB)SNp5Wf&Q-DJ6XQyId=PsrTyP6PRtDR z^Kx*FOYq99N*g<_`lX&iU(adTL%aL+jq-w-%sw^ua2s>~827eV-J*T)?ZlU1gWAGw zVX9CL_KPnyH3>PE9|gCDdUm#+C!7Lqg7q!^bezeZjDnAZVqw{_C7LLhb)q2ZLj~Gf z3?f*?7-CG%uStk^ z)atc+rcR3=?rbWIH+4;q2_M#{AiH~rm%ATgv?-xuI(O<(l#yh1j_BalDIkB!vSQul zapPhP{b$ZzziMAMqnD$1n7`gtXOP@Iy*xs+z82FLOP9sEM@3}>r1mUHHrEana9j6A zzZd08@;h?=z>e%bOFcSmZnoUE#a`j&h;FHi#PR99LW`#z zk{{xwyB8c-pWm3UZF{J%Z>XcOt$TZ4$JxcB+FMSs+hzqw+>vEt@yzh*&Cdd#{3(A zu|{4U78I`f#88IaXntrKm$TBqqBGZKKJ0Mt(?$J*&k=Ygma(xTmqlCptTU(XDlq4y zeQ_dUMBL)Fp8_bvSSH}tL3}$2AIX(tyHpPt5-)0Zr)M53yBU?%HGQ;i?AWAp>v#P} zd1TqjI#notHYmTG!IrfV_TUuOPtZDejYP4$H0}2I&ofnd+b4ab{W+>%-_|&v!8@>&ybs^^{ntS=9%x&GnTpe}o3LL}aE$M#X&7T#?pO(LTF**7zzap{ zl&V??fcxjfn}-@O!N@R)2P^|hGkDt_g33Lp4v_%@lM>pxg}XUA7^J$Hi^Kd} z{W|+gesNw7j+~JYOTSIC1BQh59NZWBm=2|^f#2xBZ>nw)%fjBWa-cQf=(xUgrljvU zHhPuig;lHATiT(6r%xZ8JAGPX<^1`gX+G!-w%*Wf)270X;QX939e##uYz)*gH?Zx- zqf`{DikH5{TOBf7{#&vvKEZUKFac4ei}-qiRk5@OEJqwC_mM43WM>)PqBH#VWq{F9 zev=2CQdtU{cNKjnk%!c#2>w=E?#=tt-oLs^AlF%hFCGdjjVlN7lCSc%FK#cBzhQCJe>YaM?pQ#`4NELPh;8I7!PK<${(W(& z{307D=gBc_k-VJIn_T|ZU!F4)8^pa}~l>$ri=mU*BTe^z9{xXK@^7h3n?(r2_m<`sSh_RZ3M|*aCZ4xg&<{A1i_SR4*DaVqC~g)^-Qa`> zned%uwr$g;tn6V8kRUhUYbS7gJ-ypOB?9oxs1UxS5vQAk264ZFF**L`6}l9M_aI9h z>&?Pt<3xD_OU1>|d*nA){8TpX?xH{c`s>dz+ay_@UMDOYGE6R)H_1=S<$ZAYY7A^f zEQ?|B!Kgp34fJV)jRdJaA?DU1D@&Iu6U!^nCq zw#NZh^11*AXG;RmeuSbCVVQJEUMD|wiG9%^jJNC*I|y%Ck}+0tAoHWZbwDKB1Ce75 zQ(lu2Fy%9?2u($_0%OJnn^UyGL5>*qzE*CZ;FblYuae^s?j3n|0V*g14gM|%Uy(H_#;9u$e0*Z7U2%N{mp{IH8tUBJU&$d=wa zHXtTrqzICW;^(=*Ltp{QJ5g|s%}KBv6gCOagCE9+5qMHu!;gGIeB)}n#ZMOf7zk7Al zzmAl}bz$u`4?200;iB;}p{VTPG3`*ftSL#XuHIYQuVTVP(oyg#b;dX{D7*hHIOVS) zCt*X%?$$K>EP6P7HXrtqLvI)Fje&j}wq*>PI&1I{w=pH9V}6}6xP9D#XTJHMFujA5 z%l>CJj@^_!sGzKC z{G7bmP#`XCPLfs)9Yg~78%ox&50eh0)XhZm1MzcM(Y+(7E&A9iK zCUp%$O*AF&4U^`86DC>p@SiwJPBLX2nJ~2Rn`NUvnDZ%foj*S+`t7>@oAGX5_u@H8 zF@p!bwqe-TOd&&PGxEJzEAZAA^V>3VxcskAmfjhgzNp*&H-my2V!KQqkx>5O;AciW zeK9=)d@;K1LX3eVxTUf=yJC#RTS%8v*kx%<>RmNNDE>Bl@D*8IHfo_{ zH&vcHU?;pqdE0X;fA%ruhpOd?KjnFA{%p^QK7alQecSUA`|}~K>bE^d{g{tz{Ogt8 zR$?>!E)gAhhstN+6WGuY`iyZG)qLNilxc^DDsXx(d}1r7qjOERa>?v$bF2q&9qrtM zK4L#wdRJe)&rA~~t+2uMqwH|dCpggu&uY0gZ~fyr@aQ?==?gg?Vokadj;HXS%8qfk z8S^*gpwrR4U*H3u@g5uTfzMQ4LNr~0>!;h{pigjmjT`bgua5SD6?}g0rjAww_LkY@drCRRDpw!0m4?> zbL}(s=X%XZiqR|l^LycRbdQ|!Sxfi6s`tcc28c?3QTvtmG=K+QIh^QgF>fm6^cU>q zY|rtVo)eyKs-2G`E%+G4_H(!i^47ry>F7Q+(8FhKI>*CjDlh(IgX`AV;ZzUcoDXn_ za?SEWtOuWwn^#;S@kpB@vNiS0-q0~U38x*zsD3a#}xR_Ytf(W)g4d8&k0a| zG1cv%kiP=aZe>rhsW_-xWqA({!A6`df09*x!QA1#%kqOSPJbakfLkvxccdZMCNCv_ z0B3Ki*-|#~;Z-`T%c7V^<6LPq-r>70e=Jir1@Z;`z=IQJBP06X%~mbW;PVMWwC&x9 zDq{g`^5>{ilr8du&wJdz_35`gvTIhXsA*!AHvZ(bY~+i!3Qu0V^3fYYt>yb=>((q| zw{4ukv$D0H>JGz6Ivle`{pw!1jS;v;d{)BL+EP9^L!cb_b1|vn!7*dy6svTz$9K0r zz2Bo*GQEkv-WQt1CYTgfEjs0qU22+_Mh|l*-sy8a|neXoE)7gG=r52 zc{WO0vF<)l_)+Ek-+#Yf`BC9%gTv$&$3F2Yk?qY&`K_X2iz9nUl7j5#K2Z(oMf{P^ zUA9>%RGHO~y(EY8QJ{HWyAOA3V?K5f3nc<0-?3&VSsYCaM%da%4_%C#L=r|8+5 zc@LyZjomnT&?o+hKGrb`|2WCT>rq=F7G9mgN~pS~gZ9?^Fi)P#Yo%6Eo&V--qO}lj z6ZV98-S(DUog(k$EZADul=WbqJcpPOUj-|SiJC;Mqx2$|iy1;>dT1yUli6?bCt{l^ zO@D2dD$*Gbjx+tj~6)F8b4SMAu=;o z8`_S^ayu5zi)^2repD=)*R-F}F{+mQ1S30+6Z2r$fa;dKoioG26Vrt#xq%lrO8sQh z16s|Ap)ODYEaIRJE*{tf6K|Y)VwD{K@f5k1G(!l*M>bQ4mJbbMx*z7T)m%r|sA2NM z`WAgow5YtTONg#XNI11}75l)}E0)jjQLYg_;ic^z!zmN3P|Y>%@8Tf!-D+CVC&5!z zgO*t3d*~5|v2CT$nm~<1D>pBrZ+w#9Q!aj;ql4q) zLL>eCUA&W{b29RBv$9Paws&Q}%b&2{koV8UEjuo^TS}n6f3Ue*ZjU%)fQO5VYmhOn zZ>A~K-#;*ApWGlsr5~jLAj7Ken)Z&$r#aXZKz(XwhO=mAk~U40C@Y1l@t+zc4ctKW zCU4(h>YWKDb7H#sxcCJiZj}%m?d$KdzH?H1KQNiu+mzJVB|S1MEvxZeSoQil@yZVS!AG_JIzg zwqd+u2-DC|8fPhyFHT{8@|`KTxOQ)=#<4V(HqX|&mONpflNeD3D#o}`t7{r$8>Hfi z9Xo{R=D|6#=^#~2eMa^hWrJb46?+E_FbQX=Qf|kYx#?lOt@-_WB_?9)BVI4` z8(|}5XiF!X2JP4(o*)V^wJ;2aMTDbZSlDSq zVCoz1+stcAp6Q%1N)flPe;zjW#lcjTjcR(x3dqnmx8ovF!8`qArUhGbl>VT8-7Br+ zyK*KTQ6_JPk661%Y0Ho=iOIr98@t9vM}&rjgc}p1e47s2gMd&wryL74v0c~im9r^uQt7z5@j-mxwyKzg+xZjn#C`uMlTOFt?!CKoQV2mpNl2rYR1#W%5CQ~9NGJ&qAOR@`=@5DdMVc6- zhAv8grHTj$iWEh}@+W4O+eKDy_d3kcki9kX6DS9GiS~q zioJ1IM9WqYQS};mktqUSfkPJ6Oo$~w+6n_3`FrTsL7l}(h7^~vxGe>S$PFkwqaCU> zCR8JFfX1?J5J*#es8qh}>MB)&8#HXvyhXz>|9T!(@Tq>ICe0_T*3UZR$j=)TSNHL* z?hcCasd5c(pWIwKsRrS#S{j63yyz6I!GlAd1`nlaNB9E$hWa^03zChk3vwOC5U+zT zb_?=#uj<*%F6^>yBy3iZH+G0yKf8KDWRpe>g0My0v#x)5!)Vz!ygd2&TpvT?PWel2 zobtbTk=jQT)j$}v5aSb8+U>fAY?(gzKs13&+oH7luQ%T~pg{x$vU zmUS>(wnDiIWorcZC)Ek4QH!1^U+x)vQ%0*;yGB5rB>#XK_{K%ucz6VqtAH{U8~F#i zdmx-TsD4F!tWYkvvWHU^W^=hZRh&1?_$gP`t$vX4T{$ycu%v&F!oG{6mAb%EW{I6` zKYk)_usG)6ie*pE8^U57gp2t{qglAKv9M9m;v**k(1#U@Y+5D6W077WV}&WuFu^R+ zQ`xMKShBJwU%C6YK4NI1_ZtQf1_?7C8VMeGf(0-G? zK&VD%cbK0qVjZNZOAALSKRRiV%fsnHfblcKIFL|oloYtL;pCssXsRQx#%ZuGDyMbUawwqQs$uR8JS5v>eb6{ z(ITQ-yPa{JqoQlq;)fgqOUTU8&kg9+ta0OJy#_otdS?I4?OFu;`T4hrNlxky{2hV+ zJ3Iao+JqdbhJtj^K~@FmQ_Ix!MSN)7j`m$6TC~hBLBqK$u|7#`%HoGY`X?pFv_U?L z;1=yR_b*99h@Cdl$sb@oVXWz(Wnve&m*$*RoK~+E_I8;igy_v);(Y3RE|} z3`-Q***AEf8`*5W*vlV^eQbXA4Ovg`m}Y9zwb619IkXJz#>B52LZl-;*lvjX(bq=6 zhTTF()yW!V|7l&LR*RMqUEA+K9kpyxt5(a}`B7ws*G_6suU>S#sv zw`@_frrIEz+7%Jg8)@Rgk_}=;r}8L{JF3jnb zB-n)X9NGpM?@5@;vrO&cqX3%8lZg(z!$BL3PxPFe$HR7gbc81HFvS}IF`3`=9N9Jo zefBxOW5SQ&QBL+HURU~{y2v2phhW@`joL+;;KKqhL7Si94^WaONM`_9b?STM<47yo zr0v!Qn}RE#y^AkQmI}0b2t9&(&p~gk18>02 zOq!1bI~^m2w8L45zHRn%)q z1StRb37XUlN>VQ}lf!{>;ez2tG3G}jK+j$~J>E`7ict$*>X~Z}hsyEehFb+S0(zvd zB|UI>81z6M>y5clAl4V{Gb2O#{)&1%i2&uFIG#_fDd|rH-`X867cLlX7n&E5>`axk z-Rc9#H36U7L9Xy|nvRybN4_t*2fs1hv)h`~zE!#UQ0n90cev&zf* zm+9&39ad%}yR82(d_p^MI|U>`Tq(?kk1Uk`Jbd`sv)O05%LG;J9oNpO3O zd)N&%Xm@oW%p({04wK2x6Dx*L`yhiKo{5kn2ZoSNGn;QnHl{Pl;?t~HHgUiJ(ON77 zO(Dm_b~-VBN7sfosXyy{b~t_{pN_ebolhWv0!K_5w64Q$kvVtyBwi1YW5pjMg&(gu zVtiZX?!>DNpV&@(!k;PT(~il(r(G97o;0s?v`#stM<}BjX$yC7q%+evsf z(aD%&4o~IntYgmVzf!Ae z;EzQ5V|REJL*bGLRVV3M0^hS5uEmLZQdeF$kBw0hd+OR8{fjo+d0|i6UZNl6N7&1I z!HYzpO7Js!;cD$XZUX}oMTMx(CIP-jVWG+ZfPhGyPIfyy#GQ$lVt-7!%~wSR$u^mz$7&S`+#KU2Lq{qL9sIDI!>5E}X} zSf^jKP`f{#l@kx>KOdVy%hJEYdo7k&k<|;EKk&xJO8>RP?+& zIXoCpS-E@zs`%ra;g@G)30{iWNzj*&ho1EC$I_lD3u_c(Y4I8Znw&gpU79y6LF~uu zW9IezYsCu=Y!KjBO^W21{ET)Oc3VdFL`rywEiqVspkee}7HgA_AH%#6ONckoOIVAj z%_+`$alnB+3@)K0DEmqAgqGYoe>Pliw@cR%*Z-Mh+bwti_Ml6^=Q%3|?AJebWY>C=%v(nwT~>M6FPG56$*@`L5z@3|HFSjj;o>ZbT`%hbmx%$k5QXlnWyD zfn*|WA~-?-Vk+zU`|mt}-5^H9G`xc|Q4I^Kud#lEm%GZP9KrP?)0QA(xdu6r!to9S z>SEik`whVR^`iZ}?|uosAKy!0^~Ax;mn+!>8SR$&Le4)y&a^WY{WH)G216aT0suON z-GS%OV7`bTErk~}Z7FBKAnvfM*g17~zi|6}_(Q-<8$7shH|vLeu{f(je_pYU2mE4L zxFZ*hgzs(#Z4eG=5Z!!w0W+N##w*)?Ex18Kxv^DjVQecPt5+`+<^isqeC1YQ4KPp& zHu-Q2@oLal*mH-oBoH+PaYQOJ9O8Xovk_>U?f#(YckfIaH<;feIp`JWqM8)?4K|Iw z$|2b}XfFrJ)Gn3{U`o+Au#k8Nk0Bw#CFN6$Y`^$fqJxn5K!R@DhK=;A9T>$hrHUOV zhaQ=yokzQs^=qUQrk;a?1Rx|#)jbuj;Vg=0u@6P0zC3O2T*dd!o&PA$o~DLNP53mA zKCNe*MuTSMW}_>iFN}oVrTM-lM?~}m^knCZU)x#elgc#LIsbn%A7PnPY;>LXmw*96 z&@>oEbz`mYdG%VVD0Epb%+$tW``aLwRYPZ=LR%|q&*}l8p{hKC5y5LTW22@f-nm-? z9Sa@IXvA!YQeH~!J`E0o!K971r^<5GyOf)-Ee&GOyVBKead;&uAF1@gMjFxGa2Ak4 z3ov}olok!XzhcjVT~EKKm95sOVRYo2uvYaNRV!=WvBT{6qGf%2p|O@ykH6iyHg*72 zWF0G4t?t`jyj`)Xk8kbHzP{DH4dq^~T1-eYpX$|XH4cfXR?S-dnc|PnRHspRePxg8 zHEQ{L*KiYeYgVt}R=KiUjq0ej67$O%_W5NkV}40?fEcgsG3QaAWtLKtHe=xNvUqE| zua%m-6;I)=VKgi%p2ayPazKk8vSE%vhsPF=tE3BL)4@PujH`wD>`l=nUueZkQzOMP zt60WH%C&E_oNSgLFHvq6A7-g9;={IO0IOyZd zURusl37&o8g~>e|B;SwoPW3}=5`ZKy*>faXPrii?{hJm)KI2od4*N zct000_w7VG*ieMWC}U`<$Y4T7#V}$TWo^HFuk6&P6IMRk38R85b~`xGfccC1E%Y9T zHbo8w*dW-k2uBH@_)xg#=|#t;@bszJzxx6I(bfYBZx);Rr~%r|xh;4)C#*+eP zpfQjD&KXAo53P}Bg-^MCGLer@YMf*<#Yki2GCqYY8S_ijUK)az7 z2{Q0`!OR{Ry;3&~Pj2Q{p=QkXn9O16zYcBc9rf~f@qOL;ZKE58Z%oQS~rCy4~~dx)OtvA>iOMS;2ZH;syF0CF~>44 zo$3sJcyHSVzEe-3e;K3BZduvSR?-uQ@haM^dYi*#ws^?cvT`(V}L(Br0P7i(ZeVQydCyExZg#Ar0(bxyI@^uocrPe$Bmcb{ZM{S;4MugPVqpqTV8avzK?I=EP=)FX zi37)_w@%wHP8Mw65Yli=dVW;>)P1bw_JWOWh!fskarS~m;!)>##^U`HH$BO}Uhbj= z%!~}NtaF&w;`#N-Q}!YHZT-;!wSw23ZI|*o0^l-_4k%anld`2uxAn`Gu3ft{Mv1lc zs9mkQ@o6Z@i5ESBY|mp)1LaqTM)1Q#!;cRWFYsSQz=ynSVW4`u@I9^aqc)|V4aBqf zvkA4%tw=mmJ7wrd!9p7ZsPrc!&-gZjNd{ zecD_;PJeNiIEMLD%r3f~J8gRV=rZa=KCW~2qHYOn<0&@q$XjgS>5Z&w_l4R0H=&-_ z=#CxY_%6DhJ9T<&beY11O0Yw=V$+eg#HOdo zR!$vd2g0@uVDrY>A?P=7`ZHtgTtT;zOCjOx<_m4bBNn|C$4Yo@^z$XO(NU0XaNUiP zj&uB6n}i9FZFs@PIn%}@wiDMNTV~tDet>M5N2GWN+1lw+S{Skw@tcJDMA!Mq*_t@4hfHCOGvi1D@v_8ZH9dy#;QXf{CWq%O@wUO(q=svq|3;r zQC?84pmmv`XRxP;PgbtjYDu{-7L(NL=r0!NVCjHx_g}20UC?`7(2hSmV4nV`v~8Km z^*M}$WS1_!z^xa=BunQ%XPc)#JYdu#_7tfH01vv2)-}+jFkfOUM9s3j!u#oY%EH1y z{6+mG?f7v$R9BC!Q2ekjfSFEWT_O(a4WN;CXCIb!UzKxV~QxCEeS!U78%4g<4$f^y?G$l&;{S4Y_fi_xWK>7;Mh1_(S zB@kAK7Rq(vj!Uf}Eb? z^|KOZI7?L$lOBwGiKrsaka1JbmDw zhm~=S5;JtntiVSk%B-|ZCMHovxf?X;p9Z&rr})$KnynzFv_!c3N8FrcFcn*Kuu|HEUd>VXN@A z!zU;9?Adu%yQWdW0Rb(;+YO72o;z&pRQB9mW{&Ur?C1`0d`>N&HUTNw;W0x-?AbPU zNG-pp&<^-C`>udmSBNex8g%(1hZs0R?wlvnfw75JDTzXK9VhiTp$kTau?b3vCz{#~ zBbvJ8IB04=bV_1MNAYaHT&-N;{d{HYN9qh)L(+X{L$t4q?xRtMGHu(V2TJPKdd)LuFkIiK zKCr%Mx&0Z8{(+<)Wu_F;{^$r*v7jC72Z2OZRqpz?kM1UJeau>YEwYDnP6=WW;)Xgy zv%SbJ_|%B6erD0Uap|HK|AE)ldyHGQb?=$*$jERd!mG*z1ZNSh{}w$$fBPKs09a-e z;zn@21HH7W7B90!^9n>3zX&**Q0Gc@{Rrn>y{k{J?v3nNd)k=IG1#}8@{CV*jVu@y zSDUEF?8bT=W4--qCHMv0K6~_yQ)ORS_U_qVgZvVF`A_0Uad+yh4b+#|9MPG3nH!J} zkQ3Fpd3ojr4`F>nMtwzRr48;$n@Q%qMi0X(=iIz2@#4$8s~vbR<-fLddq@3ftEUWo z{dwZ!9^h?}@JPGS)EEEv^YWOl0od|A0WXFP_B~NO#tH_dCzt=hD3RAAehpqzIp{4n3-vN#oJfZ&9)R}XJNW4Jo34cee5_(13~ld{Y(5xhq!8 zTf-AsT~;5bW?azs^2mGV&fU{LEL|Ra8AGlfhvT)0X(e(;00Bn!NOAE0K4t@-V*BkKG^u4?kgAZ9DKfZ zIvT+ug(XJqPFnB=Ip_j1CV}?bN%bU2BO^(MCQzP98T_Hp7D-Bc0;;=oY!?^P%%HYH zYKzRwuEQ#p>D;k>hnNuK%StKjG6#1VJ}t6t>lnYf)+&*8W7_+Huh_P6k;Iw!vRapE zFRvTb(^DLEe#x3u>ojWZx^cZc^|fwI;)jmt7~mno*q82&I}aNg9{^rdDT6rh+7%g1 z(@dFib_&LSJ4vPkMDMB-%4Oqe; zw~?kX7{6xFzV%Y=ptR&lfBuVhQd*LwKRenHgJAvsH|aXX9pXN>a#))(4soLnsKw#S zQsRE9{FUPnzZa|qmugUV{Y^Fe%Q|^V1y%mbN<#Z4ospoNG*`yi?--v+TaefhU1dSq zenfv^+=BkVCLcqA$Sx^ku{Z^M5vuL}G=+*o?MqS9wQ}PI+m;ID>GzLaAh-Z&+v9%7+e%54fJ+0?mAg z=lpoypVUg#uA`>K$8T-lCJma!&PK6bVJ%;q4>s(49FTl?NL$Fk2h!?GMl6^nO7U0q z_O=8gD%wSD{}mgZeBsQ99ANGevq>_NI^At~+t}UzgbfzauBitY$&E>g=Xa!jT;Jxk z_%73qJ&g^F2_sFPsC8AGd0sKGXq%Wz?|cj1Efo`45Cf|vpJ73cXK)YC6m7FVv()qn z>#lw&;e5>U#4Z3CpOq8%Y{C0U z7C^Z1JmC(i@BwfV1>YL?B_)_6v2$9S5+bcKFX}~do{Va?9|SLb0T`Dfv<~U7^vRrE z)}mEhoRYXEb-*jVGv}7ov`UM5c3rK6ywR;g3svFfRtYI|sc~F(LEm+O?^zXaFzb|q zQB@qHLyd`g1F!}KpX|T7Tgu{!npSR3W}jEm`>gHWb5SMDTy{=o?^gyWAw9daGIOrA z=+NzrlmuKVDlP$kDQl)pQofM!@&wTA1uR}Nb&b*c328()Zbed-J*1HVGX7(ymts1n zvGlkBi<8rGGPCwXMsH}_IgO{svGf<^H?Q-?iV^GD&qbrgTtRGuE*A)Z=?QCI$x+OOZR#C%+&_3byjJ3p`IV3qPB6aG9$ z)W@On>=MB_f|rLHr#kTSmq~Y|km$gQP@>ro5&{p|!_9H6!W5Nj5wQuI<64J9%vwbI zVfzO@|8lu9=1S|*`|QjZu`lEKmn*1dw>9a#Xs%0it_Pi2@V`m@>8M%qOwi6kquP~V zzAmk$QL!mm>lUr*+q&!O{;2a_BiAhA$-c5)8?YI1VzF6R=V6S@E zDh98y{@y%6Qc#t3vb_kIl5RKz{KqAqb^ex9io($*RXoacpTr9Dn5Cxtbkk z|(5?R&R-7M0;2+=KnD zAIacb^)l(RBfn!I86t~aAJM2-lci?QQR}e4TKyp)%MK85qT6`9eqE)NQ8R&$x`7@? zTfc|CO5TE}YD~|k-hHY*rG8gh*Ot-DQrB|XJ08=u>}#r8<7?TLRIZQ;mi=Ety%rgJ zC5wB!#ijR47jSW7b~fw~Z*pL64-GbSK~#r!bCQh9iKE?TE}s?}Y&7iX4sB;A$;;hK z-DWOR2373R6ZBL$(p>6_7G=e1%;76aC4w&vnOfMhF~x2DL$vj9c~-)cG>Flw?IJCy zT>eRi?+=|bWLBxxxv#NP6C^y|FWA|~zq8#&+!6ZbWXSV#NiRHhPtih8q4z1b{<LjI(aHXjKX(3cE}q2MlfEmi8>b#J#&D!vBg5J;f*S)kBd09>je*>=lIt*DS&rgT z14%8^vr8L`83XvfWE#sYEjn};rx6>rh&B{**f{4Q-v;(r1K+@KRr3w>!i(k=5U6V5 z0g8si2Jf==%*4vV6ZJk)l37@DaSA>WT^wVv{9M7l748N5R=t7$%KWu`tBk&DiU8bC zF-}Fn-zCRbgi`oR6U4B4pi0R5Rh2AX{37yEK1HjDbR?l4`N)D4t!2FspK2-_d#7Uc zW?d8CO6uCor~F+uPOat>Qm<7jc~iW2x4ciYu1Rktc5PO@;vKO>-uz0f)v$eszS~+h z?HhuV&-#W&ZR-~s+n|=xO|8`+Hn!iks8HiZ)0W%%c4*&_{OP1~Fy=|RebL&UMjDNJ ziuN=L^jujB4gLb3{sRpKWH$n52j~p47{6n0!T$u@(w^kb@4wX#V|2v#(z3qH-jeq< zE#4?sBv8(IUwL1D$9}(~{Tj%m_?YUDF2Zb?R|0EcsDJ8huN2f0~673 z2+vGaKBltpV}e5Up=ln`pgu$iyS!kJ$b5G)w`wRXz+iG}hWn8R2XC~hRE4i=()eqn z{+hvh6wbihx0)zWbHyI)H+a;vQ^%%FJ9Z4YYqhp%-nzxMZPf=fCtr)K3$vHB+1-hE zT3Mi9<7lyv2pDbX8q(B+rHQnJa@j$eH67ZfrOi(3+ctb)Kw!}7k)xKaR5owBYgJ=2 z;yMf*xF};xgSvGGM~{1D!^DZN%DzYSu642FD#jFoo`+T&?gF~qk7v&Ocs;mFTckR7_-P@@w|c&ByB(5OXg@a zSHTXqfs7F(4vhfI;)yk+lK>LU9WDz|b18t%TJ#Hr~^tb!E5F12e}D?-Vt2!GGwo!yI$B&b$61?`_)Qm-nB(+b5yG7H0#D?{IH%=bn zSGTU0hk_sKJqnw7x?4!w1`U0hRBIIJ@0VVq#-Q#&9U3(7_NiE|7NW6e{u2!Sd5I#| z(B_O?5NLynT&s=rJIN1TAG01Yc;ol*7JA1Uqt{`XdC?yIl(Lz%c=o@*AwGEaob|5J z7o=UDVCPG6B^Lkz&q=iG?B}h#wpBkyxhhT;eTse@Cg)#<*^H-M3|RUO|4Nj;kbgLC zVJD`EtFrot08N-mRZ(L6V@b2 z)()!Zy#!@MowA&$vvr|YsxRnFf}w7Mo-YTHA!j2(kc>H$ZIdz(GY1;CspLbXT)(}K zjkdB;Hco|0l|>|$EK8PvEHH@qQL(*Zsa53dV;=ekGHn2;eXpn&QM z;lWvQR0RV|VsWxVburh}*rKYJQI8d!^@!MOsuGK;KZ9tg2<42PpjYEJ=t^}Lqs7?w zd6|v8+^5BtAh$Fud%Y?KiSv{*wg~=XsPU${f2u#&s6Tw4En#`iO9^9x_>I41_CTy7 z1{2sW7#gKR151oDszvJc+_U5fm z((WVw#^mdJ=du3v`tKVRbfD6zeS6BWj2`#u4cs>-@Xd;=_w6Y!HujMGo-|>ur42@8 z0M_>z)-@4Z6Bv#i+Dg*|>We=}ePhHIFTXPxP44?z0HEVAyL@D9{L}=&7|ey*baS927g1Z z61SYMN@#7nY`ryU-=h0l_a0o^SIjamqc%12WAI$n&y|cBj4N$9@X*{7x(PCs_>#+cUIchEv}`i znp-ENIIon}E?r*oT@Q7ch{%dC@a^K0DpjGxyX4;P@*~*uq0t+o{bbK6AP>Ps`XnI)%Hlr-Vx%Hh5Oct zAGjf>UJmJ1ywFm)^?YwbR*p6yX+}ShC+|E?UJx7;lz^6cY(%6>qlpYwUSY542T~d| zeVn?sVd=}eg@knNlb+O}ON3a+4)xT3=k3QW|NO>V%DeNdNB*c-RYfH_go?|WmBp{E zE|;wq1Tp*9QeQz6ySHucA@*!5J*P7?2({xQMcp9h>4t7~jB`dql7p2pkUisQGd$Q? zN6L{B4W$$u$JkIXdy4MFonH9uqx#iQQ(Jw7dIMQg-VOo?X4M9u2ltS?Sl*;=e+FGeBT>Q5Qs zQ&#bf0V%BaR_hryKS+ErYVUM$b;-Upv$j}Ii%CJO(b#=6Shb~l*RpRjdX}U`BU%vG zj%}a84qb)dCDML&ZHSnr@IXFg{Q_2R#q8z!L7vrTMH&LE{A#g#`n9^ey}q{h%2aHL zyk1Laybg;EX~O+&HHwtj>y*9 zC;I|fF(yrAUZ%kC0H$>iYcL=AFOC~sW&2U_VMEnHV%DH^G2;$5O)Hp&DQL;Ep5Z3V zOT~;cFyJH`s`%J`6swTs@4q5g9dt)f5n;N+a?=MH`i=TuZ>%W0!Glj2)sndLY_}E0 zW+8ER3fsw2#a7#Sr5;N?&yFtLJ(ph=*ZTJt*Uq!-IR(>L4oGqKX*bFxO_P@#3t<-o z1Tt^LIlwMZaGE&B7%nXr{^|wskga5aj7{9SWcb$O)0z45$70*LiLB%NrDI00y*=v{ zwAsRkbP?kxthn>W1o6epU+%Cv1)^*hrCd}kZ#ka^KE&h3X*2EkV0ow-3x>-HI?gj7 zINSr{JK_+a`i5M95*{Hg3PJd`9h)Kky!;94{lx_F*8HWTM<_icK7DN$wpik04S`R5 zTfqM4Vte4g$4m!JuWCu^0Gj^<`qhz{yvf$aB$q%hZl)AsXUbk8X}QhHC} zzr4z-o<8;BqLs(yFH9dueZvJtB*I!L{>2{P3VV+GAL6&B_UgG~s$PZP+CP2TpKrdp za$x$x`Nvi+dhyh0anoqi2a8&0N!owlm!Y*Anq(7x=|uoJG9cOC(@vk#;d@C+gUdtn zhqBJ%#RI&azI#aiko}K9sq&#DObKG6Mczt%^h&Xs4Kqka-#J(m3Opa!@nE#47y*B{ zJCG~Xh-`=7A_O71a9r|}-%s7qv)5FKM;v5h59k+okHPtafoJ-D7A5i6zD7?Qy^`mx zWW&U2ag#&?JUir^iL#|)cN{#4evC46$pA(d@qVp7SGYobPOtLjwCU3gAy3`Ws~3d4 zawTiHXpyU&(KY}x9d@b{ru$>k2Gu9ktit8|mnpqTrt>kC2913k+;$pMPm0rjXsk*6ta-!TPF|`tb3oy zv6wL*RC`DPtz5bCm+(U?SC*MA*|`&WXr{__mXL7=`-H5kuoAZ@=2#653S*PZRd_BZYPzxK_zDn7ZcOpOX?SqE4 zXpxjBK>?g$c`9d!nScz|>)O_ zG&a0swNYF6OI%N?zf!o6`~C5{v|}n+p^`60OrSf>W+=L_WE5UxxKWGV7MFOuFZV_a zV{OFoVG&P?%sbQQ{gxAYjz{nc`B!hlfkQEeK^5M_7x1gH8AYMs@fQpXeblX3@2>eI zyvWguZP&=32A7!&W_Be%zb|qQ_I^AdkbS>n@DBXZ*em!1Cxm+!&H>^&70+gKh?g8il*7-{kAn^ELiRsC^2z;hvpt z$8&Pe7i#TfKEIB~3b(0!9tpCcwjtm7AT0oMq6PuhumvOQ9OBSC!Jl`j^A%0T(oPYRbpESBm>x2Bj zG2&Q0mQ~uSOM-(Fx*i%i;!xLwVEo{E#7Me+XK+U5q=}0cOq!UPF&NhqCoNb!aZ+Z+ z9I@64<8g?U4RPf|K|6^A^N{-g!V8HjCPhs|rjbPDla z-jV-K_I&fzAF_V_Wz~=*gQTu z8(T7R{&gi3*MWm>s1uL>p%3saM~}YyZ)jGS;EVn>y{fanmc{rVVoE?uCzD1x|4Xd_ zMf?wJC~ACWW?tstj?p86>($>ndGh8h7ycDjZAT?`A31Wv=vmDgHyYb+&cXdJ%sc$? zzh={=Z@A+G-45W=xfdnSzB`5g5A3O9#UwV4uBvQV+6ZvFjjH|2>bzbxE;!eloTLT8n=Fr=D|_$LPoCpXK~3en!kcHlN@7 z_w*O{9U42JbN?5rX_WkTdMkvt)!+U1`pR35x5YG*%rQ5?i0h8MEPi;$@&(3HjP9(7 zVlDiSdZ;j-Z!aF778Kr9-PYoqn^c#9rzAYu(?R?=V9K#1-U$rDL_a$a2+O67)1EG( zg_18BxtLj?9fo>Pyu~_>6o}J!p zk1ZUk=8xrhGx?%Y&oH}$wQc(Tar&FunwgKTX+ASa7A0UA*&_VBHt;Uvc*0E0=g~EK zNIs+ZYo%!7p878(X_C*NEvYz5-@*s*qU@D%pJ+MlPaqgW-APr8;Ox+;vL3@G9lm3;JUacL9m z-{SI)(xtd!ZN^H(gxn}@rxx-m+5=jDCcLr^F(#vVqJ>divO6qfC=OF^sBaXX3}ZD# z93kcx!}ZjedhH0lgX);}YZ)-;q%iE_l}>YN!S4tOVi0_oMo z>jT(sQ4^&9NfpRP4iMvrR^F%-`L^Sdc=Gve)grb2ruwk-;k$vSSgtE$Lzz4@#A4P| zGL~sMAd;N_a?1exdSjXI{=ShNn#YF>P0E|HaqcH#4@>%F?#3y3Nkc>8n|FxpyI*|A z8*i(d8ri*R%cjw-XN=f1d1K$jEn6<`yK(ZS5i?pxsWN13 zAgKrKXrwa!QLMxFtb^RvsNJ$YI_lip_=Ixa#kl;VoXAjYlN}ky{#cV%4!M{rkX-#} zaKMC_X3e1(axq=TpWHE<)OE#|ZT#H+v@PM~D^-g;oD-$a5I=ha#@&9cR~jOf-)`IH zrB7Qyd!b!8U>dW1=BI^2xat@^n15wkqKwT~zOa31wJKi}=2AOiMUQY6=56d-r=CcB z;@p=$e8mC%9sQjHe3{$}Kk3f}md=koE7{|D`f~?(d*1$lK2q+8Utpd@JK~vX2H=hW zT&y;*Iw}S9xWU8aj`y$te(!y8b1lnb*s!uz+|p|PU@MGLzr$&vbgb*qLSOZRN7qWi z&_V*jAs+(4`NC{B*tl`+X74K4PDUaGopfvP#TN{KkYZ337!1_xn7a%~s-24m)VQ{NF!% zREZP#{yWx8*{nVTUnM*?j@Yp8>>*((-+Yt8^%BuwG{zYE?ng-j%1=6PTJ@PTM)WfQVR1Ur+Ba8$7< zo1GC6*+e(#uM_6ch(*`1(+d`dHzl{h2u^P&`FZ}OUVkxS%syoMT5CDjHJkV-hj$yp z()C!Zv~A|60E2u?1`G)y(2F2I;rcOm^Ju-kUQdE~6Ng51+x#6)`QB#$x+H24n8(Uv z4U)=-Q+YcD0MP|p?^83r)A#XiAR$rTdkMMTHuJYh_7420F&uy*7otz{F0cT1>GfNG z$G&G*E*18_#1l(Bix3i8pkxM>c=%1;rL_dDzIsX2616356l>_%oAEc1!cUJ9R_}i9q%>8zW}f zE-C({%Ar`O2lF>694lvQ@jP35LL6=vg(fjm@wZ(j-t}^r7t{k7 zKTLLMaEJbqUgQWIk4;zZZitGeFO40+SXb$w?+ObDh!5k*`p$7liJQjr6n)pd?N;m7 zd%UN<({S4JWTisgdQs7d*0eskIs0v~?;J&rlM3&?W2L1N>BBz>{OOt^^3!a?qFFIA?AxR+hw2qCT7uRMeqY2@;4E;AOEQX3MuB@_b_CS{ zoTPt(gM7ihyOI+>EIvP}`-E|ukzBGDyRvJ0{we*=cM)7m!mi5 zrCuFlpVFI4%m|u^7I($`w+}NnTsJo`qn9$)3+?L-(6 zUYzAkXWw{dEj+CclKnpn_7lNIm(gT|DNS_g7l7^4JDMd0hx>aeHz~Uq@<-A?Wf<#= zyo&hG&;J;6g)ewR>)mZURR4tj5vFLpd)Lr0rgYeV1<+XNAu^+f5u~6t!luG%wgHAM zsF(!1jZ*`c9blgqu+NFM(&g;IUaaQPqiHf4VWTW`Kr|^3O%AY;z<_wOvWM*PW>tXA zz+{g&v%i%+B*V?Zm5&g3<_JOS;<);Y5VR7}XpiA38I5MAbFPd=yI};S-2ghImcH@i z*tC*iYNXpmV=d17g|uoZM%k|Ks9Fq`PAY?J8%YSpzavaTd<(Vcu}|b##ZpCBm2Sn+ z8mNoM;NoGaN6BEaM|@!Q0t+1*#bpO@WuW+WFB@fLqxXs1JPH;?aqy(Qeod%fd#onL z5C=qBrU0l-;#)Nr@zO33P)ydZOF0aVvK%-p#oFEy9LYB865oKx1_V^N8*vq0SP?>O z#Y|g~;(?`Ddt8GN7og^d0SHH6M;~oJ&nO&$WuK==06Q&3E-+=ZMF2yv1vA$APqNX9 zhph<9d@`pKR8{Nnn@BA(O}w}D*!B0KE{OYVA@lim!V2qz{U4`e zf989lAPSt#Z}9AMJvBU zFK1Vt_4h{bANrFkJ)YrJDQ*wDW>kwM0P!3Ynqx#Fs#y6Cj115aiWqeA3fuPQgqu50 zi?41bvhu8#7$PowIdRsa;VVB)6F0a0!RmyF<)+hR!^{dE$SkA3Xoj@JYk-e9Bm0f)YKKAs>Itp-8hivw#_Mak-%nBbfqc zf^s>pI|~%AeZc+og8F=p9+#2VU3|m()e}?sVex^eYW9!5Z`D_0=}df%s~qKR+igBf zUv004Qh40$^L+z{u>=n{fE~|cDA?N{=+pV(tPj{i!efhdV6pOHR$%3nVqV%ZZO{+y znV@%QHbHJfBWTwV*ljEzikxa4*e?CYIn(1r4_-Y1mHMkq6e&V8S{taG3 z^*jZym@D=Dz$asMi9$2@Ex?%88~mc*X)f`HkMUa^S>(FeICJrU;?2exixf-gz@oaYPY+m1Ix5*;7Vl5FLp7M9fn!$X?8KXdP&w zT_QQuPQ|^rn|3Ph#%ZfdMH3l1AA45K73BPzqJX`XNOwmZusec`JvDX2l8Gnvd#9G1 z64m&_U#A~gk}F!8E5wN7sfEq&>NjHeGv5`kezrUOy(po^utA?b32v~b#hr8t#R9t{ zlvxR68<$Kt$t%9UoUN%0_twMkV^-{sX}^dG+~5U(ljddnzgixC^` zaHoUbxfrdyWdsyxWHK6<4!$DN(XkMQ$w2qcnMd>_)+YNkv6UbWuCyp>~LNi}4AzN5(rJOVJH{ zLJ_9bh}`?nSrESCRA44{ZY~1}>ifnmEA5#4j%7;y&$Gs{^MYyDUbtB^BdRSleBEEG2xL z78`9*CltQuObEGTmv}d&Eg!dO`Ad79xd|O93-`{I`puDNk~Du+51HT#Stcp#CSk@N zOfo-_TRPl4_0i)=CjXpXM!BAsha{6iUn6r&vhgy<tkd;j1_@99ttMd&xIeJE&HqU-Yi5%H?50)ggn6pz<-zhUWLhc)o zBXgT29`Pv4zzfBr6sd48!oQ5%ndYARh*ZAx1u_@B1@AnwQlO8IB0 z_eFTf49_^Cz}-CU&&QL1KAcg;Ry{8dNkExGZC`8>i)9Ybb&U5Hclj}Kw`ALAzN#Cg z*rX^)ENzfKirDfGER|;SKLg`@^o*PwzJZdM%0!#O7mYu9?oM_cjX#kxZOS%LqMZX2 zex-yS%VbLGy6aP*|Cq0*iFl+2+@F17T>^M@{^rY>b> z(q?NX$d`s?Ftj}5U&}50S`8{}tG-L`a3R*UYA37$RvyNUc10IeFSQ274IkueL?%gO zda%GBV#4AMtTwE%7#0XZOQCM0e}vcHmNO!CM5g%RgDo>hqz)g}+e*d(6bli7y_$B;Fe(FD|o||Be4?OHO7+$Ddx!$&j=@%Mz5U%3|s1gqB1aZ7)7R zlwot&Lq0{EWt~qv!iKN|CrEa);XkO1BgjD7I$!+4bq2Pk}%~I#jk+@x|JdHo0yqUV!}>Ok)QnV@X+;@Iedlu&3y5d=MExr7mYd6S^YTvX+ax^po0hG4 z*x>s>A@Eq?W;j!P8`p)M7kDin8J~QAor{^%1vfA*arjvXaItDVo zcCdM^QqryBIgUKjIKY}Ky8y>RYdoF-8uwHKJroZ`4dk8yGjL*e-)Ymt7Ev(menA2I zf}Pv4MKoj!7c5{oEO+5TF++dI?(rJ0zb-21*ItL$<6CUb>uL4`{ml^l5{LcJ@Ul{` zbjQM}+{YdY#^nXvkDyy_b*4pC&`%CY>5~g*#*SXNN0B|+SObl~Dv7aH<^@>f!$aga zPR%GU?ibuFC>WccKehlDtbD!>sP%S-FP}=2+=-?ySS&!r`3R^qD7a?J#K2!VG47v;_9bnM2AFaw+^eZO zo1>K5aUeb|DkS(BuS!~(%KhCe!lac6n8g+Lc1qibHlA)lmE-jl;v9cOhA~_&u;e2x z3kUPhckmppmSer3H!6hUtuy=`SaG3 zaHzK+R>a?BnM`H>g#Wla=1oS<;*O?d(*VAdL&(;ZVG zgzm{|vj$iVYtOo4N;Z^@V>8(zwu-&V_OK)D19lFF0o}#HEM?Fj{6f6ktN8oX33m_k zcCQlZ7lI3X^z^FY?_Vc8JPcV&yj`vXU9L5kYu9J~>U-B`{_5JbtShd+dj9|B`(PLP zE&m^`UE%-V(D_fwy2{NWt5nvWQH6h1nVPI%v;Z*ALM=t7PCaBF%xP~aYTNc9YyXp9 zyE=8+`F-dY>+2iq$LjgD_rsqUYrKD8ys;Nce6)Z20m`AY{f#~Acco69D}H~LE%~hR z(5Vv7q6m=IIfc^r{sZI9w`92zpH4YGxfTFSfL}~|{IvgGD!g{-lIn8_@0~lVKAmkfIt2!H3JUBTh`)pK z)wurWum85xzkPoH|3sBR|2Ki++rYpTzJZ+r^>`OJ%Z=MK;z4I^E~$s5_O&1;0;-Y0 zHpY>&xGcN*Pai#&ziqxYcc#?4g&yoHc0tq?!AElFiyR)QlvBzrC#|dA!k*rW(8d+@ z-*G)(U(6>GD$VplQJi*Cv*C)y9vLm?X<#8+94EOmi#r|W4uj@4k0jl$e>jwHprkkc zVQhD3sOS+UdJG-P!YPE4UtrIP6}Ib2KXL-vUK7b$+e~pQQ}m-({z$(-zM~Z|?wYCt zO=hK=^d)T-z0^kPRD8y2BJNMYTIND|KV5!)w&+K7s5%+<<3KYrd1L*lzv(mQTu5#u zfzx6!@5jbpw2i;SCLsLcp%qh(hja!3jfvN^Lc|SWwTk({J1372k`q8!pI8J~?>so@ z4GfQqcp%T`6V)}&(<3oX(lLsFg?YcZzV?}v7j_8R$3?ueOZ+7kFAnKr#339HF@xnQ z8Z40+W910AkXH5h4ZWIPjpPnHNw;yEl(f4G~chi52PxI62%H*edDyqig5b=ys4 z6}!TlGDZJg%+qh%ezBKh-C%<#uw+pu8}{zCEO;=^4pUSC%mosr7lHIAkm0P`*f|ID zj^yT97TmOLfeBGX3}GGEZ62hA+$>E?xSPV2P!CTJcQ2kWF6n08%B^`siYNDAlX)ef z>z|2Qw&7F`p%BEw0@w_Qp7VEa$_w`pF=byQ{#$6A7UsFiN)b2s^9?O&mxpdFY*Az(~3>G-A687k? zvfX%K4d~+o^qcBumXR`}h+G3VPGvBADVD97Be(sb_iYub-?U7)ymZ6fXM5*Mn5%S~ zVzJCKp=pp8i-H3vzXx(9!7D;b_J~m6J;H+eZXMkI=g7#PItM*%+&XeF zSeu^T8}OE1ez?ehXOlD#Z?L{4HWG1RenN?h)mXe-u_cI4Qn#JGc z#~#hnW|B{%uqAs4w?qjYTpM<)$yEcJP;uT>$vsBygWw=?5_2~?4xp+V?Pn{kmBq@Y z&61PfPfl*u)N!$D+IicT)24lCJO5W&S~>l7|9%np>DS+JfrJ&+ZZBMTTin1a#0R~s znbv4?lqDu}r3LsxF(ryW)D)hE_Vo;TU`_UD9;$_~VC?F#Pjtf~aJ*S~WT?9`_duh@ zjT_O+{H6K%OJ7F7#;gzjGnKPmy>{;Eg`ZtJd+qu5+!x<|`^C9$Z9Dnr^~ML=5K)7( zqLvi>pwj%r9@83u(-`O&g&-U`i(@DPacC^geKENO`I_CT`m%0e8%G_wcJ0upjbU3K z)ne7QGIK3)k%z7ne`4dWML95dka%0aE8ZS7c$<2?f99}bvj+_tX^UYifBaF5_!0el zwrH$Y#u!5$4>`xg#Ked9TWuS^n#LAAoo|*hm=AyBE$s$mAXoI@Zt_ETVHlmzrFv*? zrcnCC18`0kM>~~bfQwVRC9=f#;;P7cizV#X%@W>vbb}2oVkS29HSyKDb>gd6S+A4- zy|MH?{lEOCI4;_4DOBzdk+_he6$=JB3)Jz}_bR|C>?GT0+?e7~4&;IQGCFDf|uDYQ|fxfVn=4@e?TQ0#TBtyiSpTa_}Gr9?Cw3YTJ;|> zqJN{liGNEpduGWFR&MW#)jO+H+u6itP|se2ssxsnYp^Ni=^SWIH(OYcrx&?`FbEYh z6dp#NqJO{$?;n?(9EbmRyY#95+*qy5xVXG+d-4i)o!#Gb;NSAHF{5u~`r|9DS9N85&#gWn#sDBJ2?fJ$oi}>D5bIR|mYd2Lo*R9(zqI-N?`_7%)$Ho6GL)Q~KbxKT%@08eyO-vp?fByL7iA zbtko>lO22X=!iDt3o;)ppC{X&(YJ2~{gM*4$dWuQG{LMq1!bj}fiRzR0 zs^DIhyayYO?p0xZ1lAoGy8`=foMjf>llI@0JlKD;9?YbBYjE#~;~xBwYnZS7recZ! zK3|DXW=LSb3BzChE7h4wr5$htPTz(k5tZ;M=A#@U4NbBN^ogZhe-vm&x2QE9mw!}+c_=8abBJ_nr#;8 z4+XudJLy%o(ks=u3f`Xw?j91m*8X@k!`DZ4ta&o6XmcnP<3bFO2X%O zCQHr%Wu0Q0ZakAEwiVuz&!9b(g0qHyDteTFV?5&u$MK94PSI^@vuJw;JyWHOUljuj1vwxMc+d|kg|e@?!a%R^qWWRG9YE~QxWJ*FV}GU? zkkkXRKZ6$N0kj|U-Smh07ftz>t2 zznO101@!*?zxM+BwP|P0oH=vm%$YM=bUq^bd@wz@1w4+Wgfigy+nd8hJL}=03_|1JzX zehUmUWCw3}L~qGE1cQhvDyG8_jHlCc2v^{=s2QhvG_D|5`C87hLv-I954p9DCt6AH zc99?F?V?URKfdNDazu0Y3Fdj}D~{8v<8r)$!wg30p{PyUc+YEztJg>5D`FzoR)Ds| z)5}NcSC${7s31LhZEqS-Wsc@agVF)2X#1s4|1goGbW|FVhiRws@ zPI=j4{0zYgk)P8a=Q%pD@;ry~*r7aUG~-prfM_Y5AA&~>)!V)~-_~#N9Hesu(+DI5`&%<>{=GCIPA<5P z&dfvA7uET_G{JHNRrAIO_Ltu)hwDsvEAxM7=@wqdQ*kC2!rf4gh!#AEbZO8?1k(Z& zeRNiXgnVqW4-L}k@1)~tz)N+0!l48|4MG_t2EkRXDi5V`lOzGH&Rs*}8}GF(sBZy^Z;Z_-I~+1Dv5XJ5G!dZ=y%cxJnEx_-o`=xBl%D*;A=A7*P!H_6va&Lc=fd=McCiQ*_~6=fDCl!F+?T@SHhyz%Fp^CNjnU^(K0g z=PTk0SU46zA>zv8bBu2SMM+OKZ39s$E?z>5JT5R9!V7OD-l9R030om>gGLo} zDDcSr;fQ{qV+ScXEs`mm3OFq`i_(~r3pxYt6<{B;V;w*ID#}Bv>6j8U6hzjguX!dx zN)mVo>MTMn9>iLRnuJU&$Vqw@Oj$gTMnX5zy=v=mYWdagKv3cxA1Gvy;9Kk1wEDo*%8;ukOm`GvqGPlMhlAmpjRIs9J>7;gv5qu|3A0(IVF3T4e{%->B=2^yUDy-+nneGfcO&@^=J zs2txV&z+x=!R$y4=lOFE5^`i|qkogmBZUq`kFW3B$Eq_qUt5C%7ixE+>q&E#HiFY2 zy3RWUpV3=7xDj4Wvy$4H+D*H6qTQA@N)7&7?_q-1H0v~Y{%*co9t+CYej`s~M|SMl zR9iy^(`(p0JVoPDp8tbbS3iVxaISxZB~FbzbYBx}?!!j>d|2SWRXCLM#quEp@8jXE z((j|cwN7v zHk23Crz#dJ%7cJFFvGxno?^TYl?VESJ|S2jFRxh-3tF~_@`Pl;({WvEs60Jgus~j( zo=%^$p!Z-FL+vYH`txcG;&3|okn2sAhw-f1_+k)pQecL9T^6e$=N`UuQ_%d>}3DaD^ ze$^bNc54%6?DoqO&0%^QHkYUKb&;ohp;egtt3JjB)5!&`!@9KzlWu4gCT(aFMxSpL zM&E547S%c|q=MJ$M@F;?gPoZeZ-cNH_J_hCQJe||UA_#zS_Wk|!nDZA^j%IC+!GLb z*88IW@)1k7dgDGO(%|+0YfscEzQ@cWGMa9(o4HD}`ZJ^H0q1u;(WY6q)9L zUvXI4=&3+`0x^M(Kn@VY5yYPvj0XANacVn3?I(^0zU9F{1`mAbl6Os_6qmM@^s?GfLm;r6Fxom$2m_I0c{QYXYJSaNs~@AX{7h^K!xV zIlLGP_UN$DclpOw<$8FzdQA`#rBvL-nG+?T-Y@O2SQtef7`F;mOhP`=10=y1JyWJ@k zaV3#|lU%R8=Kl(=DN7_5DPgbrzhbYB{QPri{^y_jH%Rm0N8>*K26i8>mnh!@*u0S| z4L<`SHF7b(wt*|eLk0AF*UFXuP@_v1ImlQ3L_Oyon|nh4{nvb9iOH=oTmO(RV|U!a ze%rT?HHGeX-YIgOuasZa7)l1JtGPGL{ONq74En{%SiYViNW6MWSwfkc_i-G(1Fb}_+cX(eCCLs zt5mfAE3c3-=L1jEH_rR}%ROf{J+@i;OCbL?+J)V{`Bl+mWbk>q%+Hp{34Z^lMCr7w zsT)})Ki>4YUrGtA@RL>N&x7{<2ROhd6<(}M|E1v;{Q1&2y}b5n;HmRutiS(x`bN`$ znF12&FXsdKwDLUL|H>;mNuEDXR`~-f;9|kw^f{5ASk~12E`asfU33{+au)}q6)o{S zQ;|5s&LwuDr(;ykgFR`8llN*KcSjp080sMt@=+I_E_~iJ3oe>?lJLZTEpPmD@K>6~ zgIawM&r-1-z4VF@d`8sJSG*~%V!R2ykvFGcW?n->9%dM_$$3@ZbQMU zuNoQ}*t__K3!L-j&&iwl)$E4Z?Cm+YygO&k99;No!<;!6W+7CzH{`WLT%Ky~><0E8 zQn7dPZ*12<7tCqb4(~jx{M7{wgyzp`*W^%^$;E|@C4tY2mM$$M1D7r>VV9RSF7>}! zxO7P&{g%H6mMmGyPAy%sggvx$=~D7-W8pFuXk6OJPAB}f?FydT90s1ty=?0|mp&ipI91xRMvCz-494a8>{h+7iA6piLAi z#7qU_4Pq!yH4RW=cr0R~(Sh&h^0<5qP^E!NYV#OC@42KV{PwvHPjgtCF@Su)JX7gC zYry1&2IIov6l`>F48cR(a%$5*$Rs&IK*V8c3Fk1`a00fQxTSypQMmcC=piDn<}i$wF1`nX+$mQFJ_vN>(bmZ?UwSS$HgUL|(oWzT`M{f& zLS7~>1rg3+3WXsbpPmnl*WcitCCN)`=pp~bW_-7X#{%#Ae5mw)&-)|tX#m}ep zty<+14CD0*!V}YU5%64{Pc!U%*Cy%}=%SyIf^9gqo!p5nDxRiz9t~q^nf&rx z5w}gfcs|k==98^Kx^9E#U_PXPs+VaQH zak*g1Wulx{ycmsbI8DcknY<6P_}<{m*g*kb;@Cc+z}y{<#<7P2-tIhbagKlt{_5oc zHte%-!B;lHRtq1zHxTT$@Rk+12;4YmaNt1NdrPy5b1O@_7f6eWvhwprmR1yZ*?^Bl zIbDjo7x>o}XO((K=JqbBe5c3y9%(}#7)pPRjGSb(20jkH2TV~>c)zt%p(o{<%!1BU z3sO9}T{{oxP>?BmTYoIMkEoFq;T^%}h?BKd#_ii#X z)0>Gu@5de6$2c4@?O)wh+lo5m=bN60ipp@wKf5xbW*!fGbX*>F>2*z03bgd5aD0oF zyF^E2-0g2XPE*0F9PAx7eDV{2>@7ysEe|Ly0 z>+|2KiSA^-c5}PC5hJc_HrZZZTwKqt!IeJv-{_1OCWAMAuB7l;mJMD#^j;Y{VhY_4 z*sLEr_Q3wf&+OkncHFqJ`}d!DeE)&5W2yCxhfYn$->HY*Xnx}TBbcA?Yi{L!rm%N} zyWB}lSAspf{tW5;_!-jc@yFStXC7ydP$|@*Nmp_=x%SOB*)}$oZF}?033~74{q?`( zOHwuP3TN@}<%@&6!7#4OSN?eXQyeXA@^u=}pIgIAbao_LuFM$6kLcXz?JF~;6=WIb zIc!B+n6JuP3UZFC@~#Ut^wn9j6+COQOvnczd_?e_b{y^$f##I-5H^5pi;iuKO({@Y} z*=2^>=Jy95wnjO+O^h~zxW>ywj5g;5Z~3i{G4q#myl#-msa=#SeAL?@v8RP7&Fv1t za9BC&(uXv*PjNI2Cb`@2M{=>EU~l@CJj2H_Rza3NJ%0StdY-&4)NTmoSsbD-EGM}2 zfi(SaOo%1AF1;lmVQ=#++1t?H*jWY7kUZ1$EuL5EnL@sR&FJ%J1FT!yI9v{NG>byU zAA1n#-ht2pFcu18ZyOh5w_YXX*n?#JbdD`0OTdfH!Q~%znLZC#dA_BbP64f|aEhFc z7G{@`Ct1cpY8#iNdPP)cF@5gAV{G3wBnNO@=5X__!Ep=vf_W~NGeE5Z=4Mzp?9F4s zHK7iyS0V&kur6W@0(|h{Xe(&JWDt$@(?eu%O{j$+;syJrjz|u7i_D23N|)`0$azIr zNbdjLFt?tL*Q-^2aMX(LLZYU`PTr7mWH;y^UQSxkzZTl9lIkISmz->D95HH1>E4Dp zyZ8Kk54|*b-MYz>)~=m|?$C&C!D+HtZ-<`AHFtal2pt2Y!;yhQx*|d0TXFwO+)Eef z@W4HP6c?^&gZUy`u0m@Sv32>Oc!U?PtJ<1lqR+O16YGv4NVyJ`Lpz^(FlU<&-!LDB z5?y*uhr30l)qpM7e;IIm2tU??xViX8D+kQ!-@k#`T4sGDw{hsu#-VIq^X%`6c^T%L zJmqtu&?_g3SHyKe)rmPJAiE+WmnjX}ec(ev*J+I=@M&&{Ch(|^Ygvj5S2e}^KH2#S z+3^b5$)>%+roR&Sk-YJh_|Njc!hbob>08#cY86pn@usX=b?J8b9+JI%JA1cjID2>d zcERt0xZ^e)s6U^<2lWBCb3H6a-BgZrjz8#Qxkj1KdZoU!p7YDL>2^16d)J?%dx?-%@@seFnWnq}N+<9kk)~x<;5MzqiF?NAO=R#NgRLwwS0;Z1HFlgDHx8SPPYl^p|zj}*#ujj*4WwCqV8h= zjnf|Z^vdF;GXWV@rtgr!sDD!ikU<9jsq*<85Zq1G2*9`+|0rJ+j6xUPaD%iIfLx7y zQ97y)Lx*=F2L>(y2%!IV&bL~4sL)|>RoDz!*I}f{n>nd~DO?#3b8wJnXbuhq#VmQV zP*7ZvA9O~Ng@p23hx`Ns()s0LrA~ejEdbuisaDs)NuT&rr^-hha&1#5rR>tnD4Xlf zLU9FeJ1if$IT*%yn<$~J7|?6 zmrI<{pdTtt+z7*Q1{uM-R16>J8s3XTH<5!B-&0X~s^oIXr@lbdKYY^3Eb{A_8q<-= z?AwQ@9PAX>L<&`vomFIslxZ4!S*@gtr}#b%d@q%L;v-*()XF<5yIWPs*gcgJtNf02 zdC@1I`uq6DC%X<;jy^Rtp8ZoDsD}Qtiz^pP6#+TB6XMDXgDHXgF_)Xvcj(_yQ`8TY zDJ#Y0EKKx5Vdj@k^1bOkQYzcDgOC@cQI2mOj6oFJ7FLpBTO=&7(Zr zDJOdd{rknCY4I})OI&^8>cftD3uhF{vT4gmW6osJJ|i*NjR$Tk1uh-MDK?Y?EMnVt zDx6Shc))=dS}Hte_<%6@yD0McEbvN@h7X8`SXvqmjxTeUN(ChV;lct5JiX=+yF05j8|=CK)i58sh=XQrlj-Z%aIvZXt=zd;v!AsQ&=ESFRUBSDK?mvf^KO&CbMfabC>yPqu zUR8rXB#hr7V`;mlb#l6tc@0K~yG)zqArf3{O21`L>P?rV4yo`|1QGS2IiK9I_p>>p zmQblIvtz^H+9jPbi&olPH(r-Zt9n?SlLsun%r;*(EU&x9YVFY@@I{6~%+XXym*hw- zC)*e)W6DmVOmaF^OvbES)vSPp)l4t_APSgnJ(XvLVO^T#eN;S#ll8rPFX_Zx@Y>}v@ z*zK}PC5uFis*D(_gby06v&tk29hA|k)nx();chCKHIK&_DM@RIr>CNI_Y9@kxssHXC)2DvNy^S; zR>*y*kLQjlTW)*(_1m^g8In@mXWEqd`YF@;6eW@O=fo_qjlDQ1COV^*CiHsEClEWs8@W@CJF5A$W(Ih^psQH6k3X75w3nL>76Q!sy z$u1J?j!sb3glGZ}S78wp=!%ThwAe^sn?{6DRb&6KB!-74TBL9^Rk#GIwj^ml7m`L!|M8ZuVN}n}Z(~_+O#hFZ0F%l~W zx8?o)mhcFKhfC23VPOf;s17wnpnjJ=3pU?*n&G9AXi9M>D-t>C1gg*z!XxGQ{HUn> zcsVj0r~@kLRBMvam}Dj4K$Qu-gjy2A!V)bMy#rax;Z4m&OT6eXVoeASPq30OUbF;I zS6X-mNT3ltf`!9o(IXJe7+BWayy(6FK?;Hd5Nu!p(XgF_TQ%jf#%JMq@GCJ8(oKV5 zC9DV!7)}{pfM3;%hTjM*-3XToRSgmam)E#Z!9|W@r>39oDpdcv+bFL6w{fpxJOP(Q zxU};B_yN9H;brW~OyLi`Z7C3x+J3mI*#9|6#+7+ol_?F+a#{0iLucFbQ?tu5B1YaI zN#)=6HYz4_yf?pVyDB*`A-Ax{r*UR2COpC&L0qOC{5i}do*QE$Raclf*^KWSV#W6q z6P~GvgYPcW{qbhi6>h@k7!#S;D*l75@;n-ceDp{Wf!(bFevU(GQ9w)tQChN!_&Syc zm{QEhmZtayb*}E+DQ=#YS6(x6ar?;YP0PpCr=~iit!ep1ljq097kG-uHOZzZHQB1= zMoP(cBk7Q2iqev7#&#wp39lu|rbsQxt_5E^ha#J0L=Moq6Cze zgx-~(v&p%;Z4r$>d=HIh{SLD#R((j?MB4{mWOoMs%GXpW+-}iU>9CtaoX{y!`XrbE zz~Dl1Uy(=WrKE<8TuY|1>Q&2G-z&3pumQxxE|6zP3^~m(ndGqTGRV@+m=8g3OPrWS z5`uGJe1vx|QYO_FQ)A$9a%Mm(tAB~vEgk8gFy$RumTn5%82Ir5EBB72B`#NdCA|q9 zRL{?#e5kz7{af4Id_K@RL#|?gexd9g`I!!}fhO`$jhl^souxF?L2 z#s{8f@$azCsWYfEIxnG!e0s^>gOKjZsP-sB67%DalyjI5#qtx7uJTW&yGz3`tmt0S zOUk&XJLN;RkX>Y7vxTQfkHhzo9w(a&IQIBgGU;yi5qph&e7B@c?A3Ep-k`y?x%6B1 z600Vsi0>IP{pqLKuIG>xN12kCo;{B zJGN{0F=M2oE_>~P1@jLK>N|NRdlP&0-kjMmV9Fmk zR!zly+BDpUSe&C*t~h;q#mdox!shKd83>%*HCG-sn)y$kCh}-Y)W(N?Z=u{d7{5OvAAK?|^ zFVZ7yCeZ#Vn>ov3sXaJv!GS>o8fKDqoXY{ZUU>mJUVai! ztERv#*cpveEMUtIorBFqdoDk9YWeb0f4Schy_Ws+xu@B;#PZy*>i?{l#{G5E#+P2& zxaqGQqiwr@^|Pc9U=}5kw?+i7=MHJ`2RnAmoUt=tNxOJp|HTUj56z?Wh1f3+9=h=5!Ts|g zdVFy2_xIvI9VzaC&j(LF#V!+a>NFwCCAzln5InHUr}1$`gvkJl!lf{3xE}pG4Yq_` z4gGP-K)qqEVY%TJ!*1A}oiaRccpnfK^8?%YNSVPqK6kz77K1AKuP_F|H@<%Xgld7> z8B|(|H>tG`u24?{9e7(kTUtF+h~6sbLM(O@{=yx=@mD8tI#t!neSP`L%4F{6OB3%n zsi_R@q^Bz_$>1;OKYBK#tjy)a=+EKiN%79Ht0xYAlNT9j@|QoRjDad^b6G^^WWPDN zbA*p=)|AoipDxf}SG@oFCHls>mAl{Gw&SfgcW!@+mMk1Hc;UjqLl$mIa5@qb9nOT% z{Y(tJjb@omn#CL~leuQqihE2X-Yr?I!f7>oY<9?q88pEQQ83+Zx2eX!*ItjNTJ4Su zBc+x0bjX%=n^#qBtd}{zw~K7B=GbC; zr?@1^mC`%Lo@3oWcHMVi7h71pv%38_cAh!O*Cc6Nd%OldKK%99hYx-G?ZGjtSC1LD zYSkxB45l%useyShZg-3;HI)wYv@=I(HhW%Fc;H)GyQpvoWqFZil}y0=(xGap=CClQ zLV<;}DCZp9e3B}b^&|)whp82MnwnU%N z+%G_3h?oI$A9NlUgwp1|;}ax^gknv@<4w6cKfW$@m`30+!~8+rOc#eD1` zt@xX5ubthx<@K`{4$hx{aQ?kniHV{A|B2QjA~P)(#T1c6d=|}Q#*1n)WwLzLZnLL@ zwjB0!Y66MbGE7#xH6w6AOLy37!yGwIYW(cehz>Kt*wNCs?k-naK|%t_ zFh_PP4||(kV1siCSslCZw$axeI){vego0G*nJyc<6n6aq9-{aB(6taReZJg(;KGFi z`@ei(#ly>&KTPZ??NU(QE3k0YcGw*dc@$3{=wg9AU%QHvfnoBO2jaIxw@heH`z1Qa(#(om! zpb^7-zP-J_P^~FFJaL|ggRi_;zn&}O*Vn)J%E1VH>XBkq6RfG3ozalCHR_Jr=d6e& zBzDD|+jppIY<7pUb7m?QsrmSF5aa&qpl`8n+2)3J-tD#U)zSME%rP&WS0>4mly|gC z<#31k*J({geKU)Mxs5@2BbW|)@75_b^aF#Wrm1NZ-jN~u7lY1xW%nsKH}2A>%4B)c z^*u7!2jxoCbknGZ9h=v5Roj)1SU(J!n#NtO5f+R;()Bk{c(DI^gx_M z#D0(l5G(sm>B1t6gSwB@?|?%F~z?#5w+%LR9-;3FO> z=5s{M*qR?QLSI~=hvpz9^rbn7uax}1EDVstQhc3SLgQ#$omxyT()c>1 z8;n~RjUB9()FPfz61ebxvyPyWv*Bs9oJ>AzOp|>7IBQIo${xWLpE|y#rAxl)XZiJ; zvtenp{cdFrtLbOb%vsKn?aZ`eS>Vo*4mvc(rK;g0i!7mV6=r;E?ry(MtqDV8O0T$>Z?ul$4)MMI}{qs@G!>6ou$3CQKKloY$2 zj!<@KAWBgh^eL*ACOi(87Gt<4s+lV^;{DOF1)bDr|1D~m^lrGs&M21l(7yC3R>IoTld9(HQ!?Bsv%kezoz53$ z-bDKQYE{KDG$AE_W&cdlxladka&AMvAw8t5@-@R6u06iFKCebm>la=6k2xZG$ADom z;o;%Yozugkj9Rox=@6?~jtH|el3ze$ChggkZ(gD>Jdzc2&Ax!BZFX+NF<$ZQt(@9B{`;nVi zDL@6=^^Z$_3?Z z>%7> z&xp@5rA{Hv;dSieFaJ$Sd-i2tPf0ap#b=}?<@zj%-u4cA_iphfOM;H?T_j2QP~Hh% z(-XDkvt|tKwqmTtLV&{R3Wj-*zE~@SR1I~0iO-3(SG%joXU!1WA<#TuLquIAE>Dzt z6z61Xw>zz07RFezq^PySoz_SYZ%@;=srKg)av4h62)qSN?qTRnleQv=jGxnc| z`7x^49q4o@I|AFhzF1eZrBJ#)+m#TP7jrkc*ttC3X|54ETS4;kd~ zeOZwcUj#KQv`tC5@kI&Yopa-gA|oj7@x^gYOL9eSTbOJxsdDpa6G{UCscCMP8zdzj zu^m`^w(>6UlnQQW$gp89 z>`v9(1!<|+CaJko9sHKYZ^imeS_{ie6hNEucf@IDz=W0y6)1h!GsL{8(|mto%E0cHT*mMFtH;Ulu_RO2g#99 z+b?W3`{0^LrcK4tFfKOyqVUj@R_6Kt!t1aa%8E~vmvI&@>flqjV~Y}KWB|6s zi<77L4eUDA;m~gY8Kmn1vGN-ZLW8XexA%tY3_PJNGHiF!7u@-!v|G0xJ-hbq-nD1< zZgFJnXksQfFFtzQXaF*1OlMl28Boc*s=^d9vCJuX>*@m3OeWRVvgg7+t*bj~t*om{ z7){9NYWWDieJ+uX{LZ$^G%$vcG5)vRUD>+qifYPb3X0w3Z;7^Wb8SmT5nxX97V9^h zp@pHz>n_4KH*X`=Vbdf|M4W`M_ATg#lMx6eNH?k`O{lJJAANgO)k{W_P*ugAHqqnN zz2!i*y?{NPnA<(QM>)v1LlXUfH$tFBCOvs0urH*)@%tXRJHP$Vx4K`S>Vdd!ZeN_? z|0YQqkXK22PMwBkm^#gdAMi1CIuUhPefc-E#WQFN)WK#4_@zEj55M6kFq{M?ZfG5} zkta>@W`Ja%L4$n)lxP~)rIlK^u!z}`e!H_<_nuw5_wL%WN4IXYG~XTQ5Kk{Ny--(2CYl4Ju1@m0%E$zFK~+|DMK)X4Eye#f zZv^U>*-qXFqyzn&-|v^J_{{)o1n9j~8M?TEhUM7%zYX%`Ukr~Lo;JK|_z35reQEdx zXQKVb@Qb0za2ZNVEE147;vv~k^c0aYSTCSskra#%7#JW0XvJk1`Z40;11v67&EXQ0 zDSjB5*UJY972mN^&qoNCuQUVvmX8(ulr&c@+(=3!}RDVnN?VTl(}0ute+KtizDb~AGL~M!{Dw{G>wDy%T~2$Llu!LqJm zRL$JuiLNA5f-6Dk^76d;RCac(mGsM^MT68{DP-SiHFapm&TlJz=jen=)f$`sng7Np zbAI-a_V156?WA6FyVO~g>3QF0J@uT2#JOX8Oe;DPp=Q}5tu8DTjgO=*lY>2qWic1~ z(fM!;^dWRwqSd+8InCKKk>yQQD-^S(azm2kFnuce)ppj1awTDC;4>-C>8y91jy1cG z&$*{(4DLC1%2>6uT}9{ijisqEdD@ID>twSv*Hf`@;h0I2CdCe$(>*W8Y@Tf0rj?uH zyUm$Xp$;1}``m>IiEPor1vPWZi)^_Yd)#9hn^c|~V~!i!Exr1&z1AFiL~7yDnA%Y} zZ`No3(D8M1QG|KVo?+pGcI=U84YRIPjNyGfm0?ro*uI&a5gVacuQQL0t?Qa@*6u7a zwV$3>I;+4~bT_-{#mFbaOc*hlc24NR`O*=T?hrPxiUdO(1-dc5bY%eXmw5RrUW%o6R@CRu z4jc_1COLZ<$NGP{Z9>cvnr{ss9v%oQ4j*n-&fU^~AWrh!S1}^)jS13-7mk*e$E=${ zeev-lDa_DMAvWD#aj&Nh5|z;oMbwj_h?vEakK5T6v%|7u%=Z!cvKyHe@==G zT@Qx$1pUnB3g(U!+m+HNA4OPEKT-hfA4#$0^YyG#p$J@czGyG|H0xnE6ojLX}r`-Bm5J1hITzh6=^b9Q+5mF#l(?GJ@-$<(x7 zvDL|YhmDBa=t$jg5DI;`1fXqz;6 z?Wr^jHOzz;o4XAU7*4>x?hMAUmvDa1JBAMopBla}{L}CwNki)ahd{r_#jOHUy*}P- zF41Hh?UJgn89N-DZv1X zA+AJmmHGHn@Zv&C9vK^Ll~ zA)W-=fe2?ZhfNO~eeEXJIUL0uH7$d#Rn^9 zex#GVh7yTd?e+{04o9_0bfAND>{s)>$K6>@G0I`#_DUL~xMC})yrd$<5@ydX@Xt@} z)F(|k6k$}t!u)yVaphS_WrZ^{d(<8+e7U#{bsA?A(VM$aJ7umJJ zyw)?Z6#GY`5-Ba|KBQ+#yf@B!z&*Zwl1X#tX7(T4(-9SslQdlo@0e7XIy7f_Z`HzeJ90zt(IXegA9fGbN^j zqt!B;h(&0)*Xi&&onD928%_yvCY7n94`Pc0<>P|II=FCd$ z9mQeRT$NO60VmS1p;Q7Fnn|>&vyWdJA)R_iTDWEZ-ko3wb2WFTvtJ7Z5N!hm!{b7uWB-k$p$b+_YyUX*f3gZvR>GSno-bdh@YS;6O2H zRp2ivfB?sKmqmNHZx(%BBhBI~CL~RQw>WVcCw=eC^tp4Vvty*@(I=mL^vrWOri-k4 z{=IEqJWtlM?JuZ@1Lrmo<0crJ-}&je_dj8O`zPzhGKtDA5f}T4{GIT*Jn$|JR^Hr%D1&F61{^}A%M0MHDtTeN0JzKJrs@a*z7a$h zkaeoMiBff(qKs1mY!epc7AnfFKtP$M;6IgiDbOijrv~1*3qgHV^^U+_)oWDzr{#CR z%>1;f-bM4(>ww#R&^x`0aW!7FF4$n2R|ptba`EwXBwh4?M8Pe}iye@oy|CN%fd-^5 z))yaF-ea$v8A3{K*zo11#=Zry?9{v0k#T!yrKFUf+0o(7ol>VgPbud%m$8@cc!X_! zw|9|xZCnJYc>5|nJI%iJos3L_Vi zm8Z_L!#`2UpnuXaiw7z#YahBvC|UG#U(MTvjb}!s~A%G5XFt1fd_qx=;f+J za1{!rMX@d_xzNG6ROR*JxJaz3hyhR)D|&dQw|44lG0$yR^e~w*bNS*1oATyOGkO=z zh&Oq{jhSlc;67s~_gSYED;egSv#O@8|C?fKc)EP%wWr^8Mh~bJA=K&aS^#AIRZSm2j{rT2K)uUg1VrrwcPvG+As_EYzURG{)@@yN->l&hE4)RE zB|8&`OnYJ8d=sIO%AF5J(vgkntiGoY3So3j(I2>tP6T#yI#zhBL)NnEU~cmjTex;6Sw@es7xv!q02%u5Zg^_FwVplq zIQ<$9qF}-V8=aR~KXQ_keX)rAM4pk^{=mfJDxDVCZahF9Vms#i^cxu?vu+$Fy^nI3 ztcE0vN+rOW17cE9S*ZX?Dl3Ed-E1<%pG!Q@9dTQZj8>pa9m0;UTz!&lxNKle>~5>` z&YM=8AbWkOp0YAedTC&NX;n!{RjIThREbcf=&x}bpFX>rII)-T2KLgC6Hncd)uBUH zcBf9+{Fl|ClQ&cyy?Wet8u|p<_#Ntrnut1h`IX*e(D+?32g5&7-fk66=#2=UgmBaE zq{nv=-a38j{6pb9eJFoD9AARv^Zc()-!}Y@(&PIdl&_}`g^TpCKw5nHYo$r~J61Nj zU~bvZP>cEHSi@v^z=Gz9pKFTt<9ZyZSRn604FhQzl58nFZa5(H!es~4Fc70KDS~he zF$64wi{Fr>A=r{KpQLgNYW*3(;Hmr>5rk6@WQBEmkSO-W;S0Sd7fm%dC%a>(?7)+; zvGpRW=)0G%QNL1W0s9X0+dTM^gbf()9MJcsdNTO-U9N^t_26t$cXN+!{ft>ElzJ{8 z8M|q5)@--Fr6pBWC8d3-v1(d%H6Hu}ankre*ei0^HOJU-=3NZSwFHt#Zez3AKX5$h z%y&}S9U!kC$a7DPOIyyiE>DY-0v!hpT3B1x0k@7F>gwJn3usi}2ezJVz`?#IGM_!i zx|7FAC(@Zb#kvGC%8O5(DlYGn>)m)uCZv`BFLeV=Ia7R~GDsOIUeEt!-FThI4Ag0= zJMRE1IMD8YTetgq=Xf`6^yc;vbwu63-`cbrR}BdZtrGMORS}O^aDt15RxQOv2woXb zKCg_ob#2gQ)z#Cgu5KwZ;CEW4LtX7cy;XSYuoG>YW>iZ{Z1m=UvN&Jky!h%pj$D8A z|8JM0(05=Egz6V)km7qON-vcf_@>7`pO;G~Gs&;d)I}WYnzMhD`@TwSdMtu4{F)*w z1iBLTlG;TQn;!oqm3~@Az7VNX7C0;BB<3zQwqFg^k;)*el5u-0q|2cVkms=hGUlEx zqfbub8z5`c(0}$NHb7Pe+oC-*%GZlXN5pIwQU;my(>S*Gt~+zH`~KFj9-E}=Zb~P6 z*c)DDz{WSL;@FFuZ-wZ4^8+uiMeOp#D0SfRm$4mT(`Pl&Qbc5h^gPaWpLH=tuG{(J zm@#4KMamR?9wVJcTM2mFT%`w%9#^?@krY5Uxqu6O1VHnZf)nGb!-4Je#nK?Q_os1W z@?HCKv-bCzhdTbbbhWV#({1|S(Tp+!sdo&gv;Gb?^x0zwbUGkH9u;4mZ0j->ZB8nJ5i#3(2 z^kXMk>fWVR_G=?I2yG-`mLRVFA>XS$p_iE9=hk^#J{asG?~U zq;ZFyFZ!bV8S>@xX|##1La<;kM6RL$-hR9+c$NLn`0;D*x@+>5?p;*WyTq5%W9`K8>w0FFvjF>c!v;7fk=9_f&AN6i`;G<3 zhJn8J0|vDBJ!38CcW&3NbNvb}WCN?-LEqZRsvsugw=Ka<7<~&&$ssLUbLXAgX5CCykd{`zohmuFpHje;SEA+Pp;^xbU+^-!_BUBLF439HME*_F+$Q%+q zGVy$AA$yfVM;NHmRua#GE>YTMcVFe)>;1>EpGR8)4;WV(jmnFwSo+GinggApQ4Zm@ zEout-ZMwnW<|gBOOo4eBL?ZBJSDDW$G&-QxNh@mGH`)WmbL51 zfYqA^FY1@PU#yItwr?c~uJ?5{IyQAt_b z-h6|-PrPruxh*>>(l&#X&p3LrTW7#^1aQ3oT-ZcU17XN185jm&4d6&mQ7}M3F##WO zu+{o_$1YM%kC4(kw{5$Vy%HGA{<>?&+G*FkF>U&rvfo*zq$`7urBUHLmljoMo3 zFqzG=W;R2PIcw;m98_kb?ul5_;?8fH4e8UA+f=mmR4O9nKav*mfo+Bet*|X zA0K;+g`aGchWEK{@$47L-=DeZ;GPwoZmXEM+%l}kygX<1qO$T%o#wW4WSQe0MpJ+W zCbC;qE9%#Q+mH}cM9iEW`ptrYpPTuq8i)ZVC8g0`74(s2f$kGBjCd@8F9KIt8L^ac zBN}|9liOdLexir3DraHmvXSgwvU*2$w;i`1nQhD}S=4?_LNXy4cUf*)yZo9I$3eQ} zqBAR2ieI6edtv!?XAgh)@{;Q=vVXB@?8&iDXWdn=%}*HizBJ5gL6egA|LUJ0?IvBX zIscx2zTEYRCkGxIbH=|p@cJcE`}F$PM16J{uEiX?Jv2}lmu)ynhCn9_0t=2E_)wb0 z`JAo}0QcLibh-2t`H4Xx*y-Y-!(VkKV*=lh=%@j^KHAkk5?hsbl3RC9TlEN$Sm2RW z({}DOTZSyY{=WOJUp&MD?KqHTsJProEe8(E@q!k|z~X`kC3IQRf5RE4n;^Pv^71h? zHPY$RQqAeknVRi)P*o8`DW=Nat>>w7z0U>73?E8yX0g8jcu9D!?(^r!Kal_FBlvq;~*XM zB8YdXl#TD}n)u+%bt{&ypOx9rxMSU{vAG>e-0N;#dfn>V(zCKMW|5M?3vM&2x2{#r z`R|ZFeq!ov_ushhJ$WIK$)aeNvs^!KJW z=rIQr7Q13g3;XpiE_692eTkU2lc>zz8+-Teoz9*sex$Tt^?>fZ`}BHeA|~5rZ?9f` z`t<6R#-1;Fq^y6x0X=&6>GRG6$WAHXS9NG(ELanbN*ek=shbj))mCh^`EZ7T=C%?q zm83)OCtli0>@nXx5O37bLh4VXQt6%!_%7>fnEL{sF13F9VAh%_a* zd-fi4V)De!X&KDy%Cb8%o%nCha!D^rQcgnFplvmSHfKf}jggs~2i0sFl$DSpNr8vi z8zi5tAj{0ovgfXy@%%N(G`-TQ$z{EU4eM1VYu3tintaXkGp>EE%xPvTQU@z=^6! zwjlEO8y2B}(NZkiIJg}KaY?+7=@=KyzzI3{RWyT&(N=u(!GZ%=ZT^V%BE=G@zIAH; zF&ME`p8RX>(1`egxY)v2spP$O)zNVU@p1WaB>O&ZCmLT6gIB3j>Y=Q-!kGBNxbOkB zUwY#TVv)c!Vw3+j`u2YI$N{=B(68s~supdvCR;7ZHmrBT*MsZ&dlV(gVo8bSU$L7* zBP*v3Rb-3XYD=+1r&z5J9M}^hb1ae3HhZ!qI@Myanj%TW*lpqAmSp5*K}MEnS(2LQ zxP;;a{O{sqDt%&1LQw+#=cNYhQb|%lLP=a)NkUnS|7H4les(;M7(XOBP(`KG96aK~ zSXLN#gXXhO|6bkst%3sw$lz=mDaqk!HhY>K|7~e@68JTR{zj$nG*7zCmhRzSZ1MCB zVh??Qt$83^>J}a@;@f%Ja3l49kWIdp9I192PiC{HMoRH_@v;0Ncmo1DdC@GAKFN}@LCtFL~cPh0+ zdMf+W$TfYdvm?W;iQcT7>g??5oGfpmEi5v-x-WwIRCuB+rJXvINithNwvqw=hqvzl zjH<~0&%C#9d+#;dvb*U$yJ?V+gai^2Ab|i0z4tEC<)kT!1r@0(g4oa#+bKoGf*nz? z_jc#m&vGhchyQ2ZCL}1=e%}4F$!1=gH}jqEeCOL|`OM|`rT1p_&uB_ZYs#pM(tU!X zw8-r)DlKwBUIuDME~WL#-`i07e<1#kLSf^1;;L6-|Ml_f))H+t$6r;8r$m{VMO6G^RoWC!z-b#!j9P?v1W<8B=r?j3UZje6a<37MHsJvPAJuU>hTmE8v&zKT_noXdDKOR2+&;yFdEO| zUZT)RHak(U6O1-1QzbC%5?ewr6x@=+_PoOO{DP7Bx$UhwheqenYMoj&Qipgus_T{4 zt_h^LOyL2wcBf5ij?{)y>QWi*xvHB&W>+AvX0xh=FYW#Af`#w&DwXg@=1wdwo;Y_3 z*c+|hrPI0K!=cx^PaTAGQUch8nk+g`xS_e_dLW<46B*K&p58bl;xPmDu5W2>2z&JA zCi?bGr6p@t%v-X0^^$oj(0}=P*4U{@OAwXy|7WFTAQoc@0A_KuW`0iv%>6Cey*>y3 z2kS9e8h_y74!tf`-g`z#aV+HI-sGI2SgdSDudS$sUmG}( z(Yda*iREMrf!aY^muRr*U#?J+w)kV*>Uh~l=Uta1YetXm$eA-o2>yd531Ek8-n9l5 z!k!4LR${jQ+p7=gOc;UiXBQuC>c6?boWk;AB{Fe=;kf^79ig+a_7F#68DTI?$68U3 zwW0tXi;N%aUMm=(DliAT)(bfJ1(}0HFm`s$=vq~5qSpyj3W)7N+APGZz(Nurwj@&l z$35+L6%EiLu^9O%jjaYVN!c{T;89?2$4;>irX`0=mD++LxBk1>W3EvF4q>GkA119`uG@7{o9oqXJ5>?<2Apx{yFyh^q2H%Q^ zB8VASB(U@b;oOYGkcLQ5JY*)CB=AAyLmz)t8r+mya@o*u{gFnng#+f_UL(JaxCV2= z$y@1{^z)LTgHmrDYkgNuKiw?7o_P4-YhUi4{io;2#kcSbXAvP!gk$hiwI@71;L3qO zGA50}$|6gW1rux(1`)hB*ao<@V144H(0(UmQ}X?jQyo(E#FK|+2cD+WqeA?hnfLcQ zc8J^wH_g#^R2F{SsE}5+-?4LSKzNycHOO8|icT~Q(op)B_?uPSSNA^n%JM9FrT*}lWZU@I~&m`$Z)O9QB!fp=Crv>Z`VnUd$DX|6z zcm`*fd7_3QghxZ@W*j8DF6yb7r+btyJJPP=XGZy|0fyIxnGdB@zSYLpACxxoZSUSW z()M0iw!E>9Yj8%7R0=0QE-b#_rgHalRpl>ERZEFcL2sWWm98R8T60J{qxBY07oHOz6o=J87o&G#Il zDFT&Ve_w-e@{3V)K}-KrAIH~n`(J$P#B#`}qz4}00CBlt&{w{cJk>iMS5etS z4Eutinz&2Oy{iQo=EbqTO?U@bJr+BOitPX>W&hT2L-Wjr+H8Zy7r>Sw-~ntNbVJZA zq5y3jra=T3m|&5Z5lDL>1C|u=6%UTKO)@7*=h_I`PG zAm$$7e4_G=Evj+Tl>9H=Ls{$F7()L%MI;q_{tG=2=5%L zEm^bICVjoQ^u$E9jF=VlRuPE?O6X_L_bvURSuLHrKm7bO6TNTy3u<0*vijOlVG?om zS-fuTBiR|!_i}j!f9dST%m;_*pE-TZJ(izfg&zEI$Z_{#j9{;acB~N)>KR3y3wA1$ zIAMamH4#=V^t=N%m_!8#Qt~k7i=}~;nyoluE;A7>re4iGBvrXKWoWM>J{&wOsGXZK zHP?}tN<45}gM-xT@7#-ILl4mtx8AXZTU6b+ndnIx(Qj_5StOKHY@cxPl4tiWENIit zzvQd2UtRyyL3-@;y-k?Gd$C=pl$^vP?0KHzd1eWMp(-IPf=sZXkDxjTMQ{(ww;4Ehlia@JjoA`c z?8O%Aa|LfbY92NS85$zdirNjE#`^Mx)YhdtPrtS`>$cUlO37oUvLI8C$Yo@^3 z#w0AUX@*durCo>IJ=|>muH46N3^w(rrc26gPi&10>L^u$MrSBX*u8%@SLW#>11gNO+q6;${8I z|K} z-8q5eY1G%s6LrE}f&7d*SzdSW4K_na^Z_;qK~!20G6Zi7NwIZ?Bt=4@0l{j(32zEC zXBT&R0vwG$y-BhmzLl=H3OlQC*e^JV`v`TVCj5DAh8UCj4Ken`yod$yTL!Qjf-=NM z!Ws$SBS*M_t4){8;Q1M|$t+2_gvN!iWZ^1DC?l4|<8 zL_!Rg)4llDr~C?OIayYGSs&t+Na!hq?#DON^_P)_45z?sJ%cv&LqCHE^JORr4@x-h zGBQ(8&{YCmXF3W5A9R(>I1C0sn3#V%x)2QGVUVn75jSrOzpGz?MLA*w=Ps<@ef=WN zRhYUmt(jFK&6@kE?l4X;y74uPoR`n;&Q?@v$qul9mV97)g^BfzE5t2PsC$44YjU+sg_u zD$ob8U__>I5xw(m1$+=E;SX03W3eo3Ur82j!obbUj#yvu4VNzXSXh`foiV}0ZO+WF z4CQVfYRW%loyy;zm7SSYolUZ`u_6wvLlMFdu;g*FAk2zT0oV{IY$;&OGIqZ-iR%iOJm%fPMw2hHnJ~hz zCr6|q@j)OahlJM{S{CL8iU5Tg@D~2&X0X?|+g21|)W{FK02=V91upSiQBedF1@Yi) z4MXA!AQEE^5E@=o1aCv|ag64@P9_#Q`wo{&cF?CK`uf|oX_GAz^IbRSkR3&Gg)a4{ z2TTvNIwot4@hNXy6+_HZDqo>rC+TPQuU6fhclqL6KbO(^VtlkwJ}p}!wB4-XCCIwF z-8jHV+9V6~{8V!J{hXtf>kVJ0rjVbL2>Y$xKMJz#^>Ts!Ff|i7BiuuW3bNzo^wIQM zS^T@0Fxd6Iu&-`iv5cM+1Vg$&YO$IKnpJs9depE_&Jm|P+s4tII{q%rQyPK340qnE zCet4c^qVwuW3^F5dI>uE`4neK-<$t1D&Hz(bm=h#nuzi5#DT>v?S-DrEdoFp}8g7oa2%y8TnA-zDEnW3U9Bo+FctPAV+YbvRehq88_1@sQ|Or)!F{PjF@x@EB76Gy zp+W5Kvm5%udhE>(e8*Z5MRU;`v|cL10rV}RIYcTlc)t${NW7d+!zB+}GyT=k^ihLq zCS@$x5XjK1h`0V8sJt?2Xx#SeSwCF6~=W^JUm(FcA9IQV9`z-^$5#$0j5Si0tScm5oj;=$U| z0C`26UlwWSlsXrMfI0sKXmA&h&Gb_))3RdI=Ji>lEBX$}sUI?=KG?550F750Y&;RfQrw| z@6{{6u&iuDtis#W!b^wbPg{D?w8bm8tO@k(IQ=`I#U1LisIqcVAEKRX)s8Kar7jpZ zX5lTHue@8`5&!)l>p{1r@GvYCcX;t5cn3LxfB$si#*kw_uKAQ6r9*!Q1o#8_@rOBQ zeA$1YyO8<2)@D2GlF*-sSu=j$LUjM{=-g}ng-%ID-t$di7vyv&?5!n`7ocP5sbQDU?}uO+gS2rn_(L?$xGGm8idQYBzhz%ZIcb`hsLdBwsQ_a+%r zm|WE+Y}C;ghDq-Asz;6qXWsp-W1TsZ7p~)mYf|Q^Z?Hblabg=c=`Nm^NFI>!{p@Wo za#wO>g2%-_U~xYr*)jxz&gp6Ck_KVdkQFhGeq|Ag6lAT3@L4BHsjP!X|rKw7IddmW*g6^>`AfbDt^mbuYZtlgPlQPk-pT$9% zpxw`hj;uauq(}!6`Sg0^gb0D#21FnnF_w!78Sv6X9u=_N31&;MFm4;nc0hn6!gyjZ zZUwdoftXSNZVn7{5tQ5D<^_meBG1fcJII8$htcad-NMsl#~XDH>6l5=BI@=u2}yz0l*K|Ym@yxi z9C+1L0e{9K!YPS}zW;($OrybKS=sKAVge1eaV6qi6G+Ac%pwSKksw1c$eBPSrj`VT z@yKNeDJ96sEMXoB1&AXIxv;N7kU7g^k0{915JaMUIhp<1NP5RLhv@p_L&>i1U zVrvGeIo3iCT(y_p{A@FqOkBB^!v5p!Ki00XIr=ucQaA7~=w~=mxiQO3^V{V1FNVa8 zbnY9&$%tE?BA0*ALigTCX7wGP$-fZf3u#1M+e+z0`d6Jkdh17i+r>mN;s-vDer`cP zuF>G$m`A@HW0ul)6w;wzUoOxugejTKpE?nP$lxl2meUKKkIhQva0#3DZy*ba7-$$K z7NAs+8P?f{r6z=$1WY3P0LoDFhki2#*KxP}VOZ0qo#d8ZfspLq)HLi5x4^lejh}v# zX63BQmu{TD;EJV}&swRuX$BWx{aXnC@FMs8;}V_={{}+uN*;fnd+|~Fz5B54;XyLF zL|C|$Ah=-bLO~*z4SHC2c-*gG2pDk0n8XR=00X<|N1P8-u|af2vNXTd#6p9uC z`b#%o66&2Mym`fL?$4VflcaQh>PGnpJGqNbS$k?~#flGCET3PV{bqS}%a)dw0k`Kf z-S2t~&|%?4F*cOx)!3`S4cHQjJLoAPlEFa(eo1V@HExf==(b0~4wngzI&Q}RR)~Kr zL{E>As89dE{Waa4Y%#%;$CYum6t5CqJXLUuWHsO*>G8fS=u%;^NW8Jf3o*FtjsLtM zWaHV_cejYk?k=Cb-0?zJ>&V?_+tl4UZpV2}cBs3X4E*heQ5HOH`yu-AKW+8@p)=4u z{ub2dJ^3$sNG6}Bhh*G&PIh-&`l~*-Lz12FpY}Q=_WFM}vhi2W4stiB{sj(5yyxk6 z{J?omcB4pl>0cs?>^E?m56$1w|1sqL57>2HF#Y=grGM>)_}M||rUU;2DAOO$Ge$j0 z3)b(hd1}MzU7Iv2X(2M^a3jVv8`+vi8{=hjP>?Er3 z6X!d77R22bf9C*p(~R@d>~56rE|F`_Hv+BaIobV8cZp9r&yAOp5&-U$L9cV-)L zi5@BWom;wd*xsF(jj)#)ksbnZB@#~3Bl$m#mUiRPt@y+x|559H;*8wZYkY)^eCA?){&`4;^w>PQ+MA@%I?}n zD(<|K9(l2<-0v^1>gDrc*}}SYZrh^3seik5De!(ai|q^-M*q{M#@Cicz22yYHT^$o z_B*~_on1itSq_{o*gAjR_OniTQZO99X&*=2Q6Cxr@OjSzxQ@+d-vdbX97869{R&Fw zyeXyIAuu5Q=dbNJoq&KhTKX@VaAWtdCGv8-lk^N)mBf_GTZO7qk391X8_z^epu{y< z;%bQ9!3E>*@?Q4+41Uh$ec&5A^E!z67Pz%t`5bzj$LiSQd=u`+nM8gDZr$1YyU(-x z*NHwGQuu7V341HNi4e`3kD#g;;P^IZ>-W2E`hG7-=2nuy z2cJHexgqnwGY62CY2d+U4rXo0oJSWD?2vFD{q|u}dH?AXuZF*Q4h~E(jY7tN z36WV3(QXK%JTIn#Ko_8CkFtbvu$P($!iZ%2MW?DAgRMh0#yBAwspPL1*&G~M_RgDS z?SYojmy?o|Y6&U1e2A^ZUUP~%JX{^u-@_fI$IHqu=>H&JnI0gLfwvXQs|!WW$QM6<6UVnUK+mZJ~(y?>Q=5223{NQ|Kf&*Z4YKr)e$c=EpSJ#qDw~}-c6(0m3;U2ih38DjsR*>^-Jb2RXRCm}eA3J_ zUm_XG+gNoJ%>OEcamyFKkV6X^mSE5XBm@$phehy&ME9gDKrsUM6IeeB3ScBQnF?aU zp`U+Q@k@O6&p$8!nLG4YLFkXaa2XlfTZe2L`eS_4--m3!eMe?G`RPxdg2!{RKVG=- z+tOshmy2!kmij0l* z$pyiT+D-S*d`U8A===c)V@D`^jFv;S`=(nqrCkiNKT2`OfXgYR<@N z&dM2_ncjSxz^{LPI~^X(;ldFKtsHpY$%WXer7T+8G;rhQD+Uj&E08=naYTOph>7jF zxio9Xqv5}7yZ(|NZ`)>Gb0x{+{z|sXf*CvZ-7s|M4f}Rv_}JLqedb-n?H-56XdN&= zDJkEEIU2*f?EFSPNX%8tT=AQU-;73yNpi$*sE(i;=t{2>Gy1?B`HXsr87P2+FuZAC z*j`>buWw01dh)e?-CCYstMgx*oZe8zogv$9ewDt&q%+|&LlN2Xl`DB$mfHaLP?HE#%P>q%WZuMr zz!QW8Xf!$xIWi$^Yrc4bKR9@1Uu{NoPBtkDj4(x`8CiuX9mnk9@lBzif8sD>rnaV^ zwuod^M2pNMFrqLk9Wl!JH8uG;wS5P3oWW!Ynv4On30vk8k`v;&erA%@ukn+V-VRAl zN)Az)v6OPzDcPJm#hdc!fPTm=R4-Me2sZ`1Mjz5kF6x~dE;f(r?H`)Hvae~@fU6ti zE5;i1f2dHZmyNq5=A6*385qv(t)K4iJuYpXsqf0_OXLk#54%j+Ynjr zXEYYY1`LQ5HDwO(!$G?3b1~QCRR29b~tjvt8bdF2Q&dAQp%u462TA{9DUT%OrsBDjaLy~6}7f<(I zGl`c>^{9OL%gFNlWR-imbiy^nTUblZ#7Bij&TidXked+0XhX*^p znQJO5Yw*wL$tV^`s?LN~Oe!fFy)&Ga8jeI#U#scE?lYHq9DQmmW^;DB|ArCm?IUjR zgF|6Bd?|P;6+D_)4z9&X>#$cEV#P7qjEMr$AUz$}6AXVMgCWAfBEW|boc=N9BG$m_ z#PEmR&#;71k{HshTOLFV5Uu>K}nuaW@Z^_=Sj$3viC%w>NXwO^!10g@G&uiB>`3t4o zh08duRa2Q9oczwjtYCekI#!iq30!(G$c6jR4!^a+-GG*}4 zo9^B@eE810ZyL(h8Xh^LTM#F314`n~U@UT;2TN~aTWm!ouGG_iE|pZAK2j=irk?&( zxPd;ihs5ZRJLpgn+e1ZJ@wau@z%s+B2UW!+-$qXVIaRX!^bv^=IsIv>aKkP1**)|x zcia)b^A=LP2W^ma<{m$Z7HE*kEd=Z-!1Iw{l8sf9B+IwJgPxC?enkiQDjE0ksev*% z_kuZor{uo)A!BWh&75b;G6YP8ep@Slqr76t-vbBrto4 z1WKkv@}U?uRz>fZEz~Q!jO;U*fO+gg*R+ z;W~2nPGiTlSxWjdQ7CWGzd`CgG47;;if59#`Sa<+=-1V>T{Z^!l2nL*&xFTXZ`LoL z6v^^!QCP^a(JD*LhL1i8IXYSHq(t^49@Z=bQ3sJolTmpjh=KhAYzEXCo2Juuj!#X` z(-GT44z7m2Mh9=5=36puE0j|^Cw3-SA`@28M<%YLkCfUc_ac3NeosTcdB&MDm4sfI zmKJ~h>J!(#z^BYd0;ZXn&SRuN7L8x^89jXC%uS(5H?T}h1~C!S;;vLo{35!iWrC{$ zySBt$ps%ZX<;_ImrukX)**Erl!0>S=T`lX7zKI@Z!Ajm2ILg`3X7mrMAVvoohpvHR zeT9q_W&L9vX33(kkuJ+5B@QN&+qy;(fuK{SP2)Lw^6d@to7xijv6iqgy=2b94aX*u zTDl+Uq|nz%9g@V5E?ZGZ1{D-#(GLow%4(LXkd7#AVYo3lL;IlP|Tl}KNqZ@=^s z03Xj~4Zmw0sp-mrHSuiDFG=+$?7eS%CbnrdX+N6<>+x@Xlllv7`3`xw%B4Rbi(Cyb zilK-|=exKLAQT8YmIc z!<$+M4<1^CgMfe0;6W`#*%hA@e7g9#LUQ9>D~2roq%eMYY+fun*bXKuJv@I_Npz5d z6;mWhclcBKwT!&Ky>)eZC=}`4uVvJIqlaG{4yo^)wqY8n8GYHKG{59SdU)Dp9UV@G zV`Q)LRpll5S$Ph}@QTtk9M*K zS&7m)xSJZK^Cz=QDkH5WLL%s)_e4yvFrG7yK^Sx?s~oe{aQI>S9(hC%F5oQ zgHxkF{j~n)p9?Y@d-blYs0e1dKP~ulz>t-9k(&x$81PBar^_pIiX&;6nQ7@o1FI@qlJ#mexnbl6bg}d!I?j{Y_s;QS?(AEcYF0k9`P*+dKcujPs{7tKX8i4S zsmcAOZJ7T2N2TQ0qZ>v(kMaq-J0ttTsy-KHL-H5PeX7K=2oEyi%*T>HisOy^V#qg+ zjsp_iun>98E&xQud>P2&#k4Tzbod-l@cn-JDVjRCl=Zq-Q~mIfwS!Bu`0*qPTi9 zaojb7jH5SBKRpPlj6~Nm+~^z1tZOJ^oaOL)_*wEK@R;>Wq!HrSCfMdq#yP=jv;KeACImdpfskG^xoDwd|U5wzt6|Y!&_O|q!_UN=#Fv7 zTJyx%jv}iiBW*@m*^KnCh`{NroEC9dxf|(M#8jTuR@t|%u5V3i^Z3b4UFE!DVxnK| zn?Y}&H%$Mzx}-EGJ1;Lgqj%AU?jplsGMwlo_eh=s?Prl#ohgT~EOW6gkr53hBTnD5 z|Mcno_nf};j>U`bV1L{fPZBHr{K=>2=fwK>+QWy}t~-1fs?YBF&Z(`thI1ZF;LX!y zqoj|dp{os`2W<90COM}KPanK^^??JcFFttb^!kQr(;Dihb6;+H@x@J7A3Jtc%LNy- zv@BYL*wjkY^$hAVfon|@qxhJUpY3d&qO2pnxQI}a z|I0(%k@f4zU+R%H&FOMGoIYQ@*Y9+?Ja(tQrn<0KT2^juR%U5*ZDDzOR!$CzvG}xe z?)JIZ-7a5`yJKs*@0Kj>_<(EE8J*tRwA6Z+Td&jU-N|*SX$?-d{uXC)cK${EYcI;r zb2-IwZGW-6`9FPt@wf`IQJN&F$0!dLy{XxfA+9DpXifrP*iKxWb?1N&Xu)o@rTjxM z{^KkBCaE_MVCqxT-SahoUanuDp9sP1%#zreqVfbVOJeMSrl3dh<#qkauPz_O^_dl5j*z+RW!4fa|uE1!Qj zK-&(JKMM;a&A?1(5eYUl19uz}3_?iqWjy)lQF--k!zLcd99hK-VqIt&ZsiY_=fJrWw{dgxNC=08@;24V~WKUt4&8 zVXd!zdh4d2ubn+?Kx7~%9hllMd=4?(|9;{4k!g81hkEr2-JF*;a(vOaS z06G>$uGHJW>%(f;#mzH1u17xUNVK!=0t@%!?jL_l$+`OYar*YW>03~B&h^W7{g7b6 z@0BrLd-}q?sM@zpOpTgo^9`MKn;6Z7Wr!H^ky0^e5PysE3k+C0$PJvp33Sj>{0ttv zZ0XWvjU=j(>es|(^ zTyuOGu`I{Cn7&?z_|OpanHq8Ru=vHCY>2uB8x3hI1`Yr_j0pF_ur(8(zmdfxgJit9 zo!;>Ikt3h4V%=Fq>X*|#25OSqRA=t$Hc>X4>Xy(>50$7~Q93JCQfi!=$>A{yeB+^nrKxUU0$Q zMe#R}k>Hd%D}Rh0yX)GQU%B>f`iiyh6#DKljCYWp;r}Xp$YLzJ#v8nsxFr}d-=#(q8hTJPtl)-PyMi|v3kOfi7_u2u;qeXB>Uk~z06j&cIT7y#hZ(D zA=4QEj7KDpTsSD11-+mLxf7CLzz~yP7Zss?NLWcoRo-=qZLx*T78wue$0cmE$Vk55 zck8wToay0hX$5b@?|!v}?-T#(z_!GxZK+cxO`7x){fPeg_*7OR$;8Qdt{K}pb!zL_ zO#%1f#Xe3owRJ+`#DvxnC6^4QH#c2UvS2~UB~4`XV3ZgRNfPZ8p2w(qASp39>7164 zu10pYn+5)}B;H;9U{NiGo=xv;yF}ZgwWmKgrzhcajwFHe^hKD`qw#e4IUS=%&N<}U z#J=_HU3dS4v*VxwkB|q81XL!7NCd+HcH8RrC9%};EJqnWqTtI`mDsO)c`i)OKU$J6 z-T8Ze`1|f6*GXa_ruZ-9^F4)b2WN8^?xj|ob|LMjyYR_#I{z;Rl}vQGM~zB$PT+Qr z^0<-l$LjXr*kxDi>~0Tz^&C+A>miq&9q&Z8{W8Rtw6h&#&JTy4kYW>~3u@ed1xGmj z`9Z}0;T%Z5dd`vJ_u&xfqgu3hj-<}PV5UM?q-}|c$xmbJ0~{J zBZGy7=R4U^PzI#NE*&1pw zO5h|u;#cQY>>h|u;yIMqZnwyvXbWNGjCITNOec(rK{OD1(|v%$p11Kck4)L=2=hdt z%JexRKEKaqvglPfaE85#LBj|8HKqW^OVuiKZ9`V3&7n1@)H!ZnpGv!1tyjriyd*g^ zzMf1xj%_jGw>;W0-(<9EO-@0gl52ITI-}8KlL>0Mn;7&KhsxyQ1(iapi5Sg#lS3j^ zD>O>7_C={&BTuvWvNbB5)?rEU)F-nt4>P;qmdUeCCR0toY__|S!&M$%o>G-;Pj;tN zC)+$Sjnz4;*_YPv(h`Lrv+E6Bn^B|JOQkks1+*I7+ygl6&>@?)QL8bcs5RoW7F(ZV zogjYU7RdwPXeKfrN+S~=6WV|<6CN2V*sKI@`GH6%aoDMBIG4Q@p~)2HFyn}`^sMN8 zR-|Ax*~C54Q@U%$8r${0PtpQ9omQ*U1z3UoaQAcBk@5YXq7RH&-%saom{UA;9!-O2h7^Uz?MMbuAva2&FBrYCv{>mD+`_5DT|Y%)0zzk zcReghBLF^&c#m?Tq}?gG;1!}InBc-tv+Cs45UkD*O`PeQ<#9grwBIdH%IIU79 zQ_8LVTguZ?{V7O0s@JAC(!&{PsgdLqwO&YHHIS6P(7dcb=0dKd=UuYs;^r6V(SfVd z1rRV_C?lL540%IpJQr|ehBM0Rn=PjtN|ju}<3}M^DIH3sLe3843MCHy!Ii8mlTmMw zbLlNopW_a4 zhzo>=)IC8TT&D+~J4O#I_q&5eyIQ5vTJ0V@7ce?hYC)-0kr{-0qHai-nxB+N<#IDJ z@8d@-NVzxV8m&yK^yxJLcUpLCI1q6f^?JQGC6E*G7!~EA%i3Br2Cw?1m((GRs-^9+ zP`Scx%Za3Wd|JKU;0}a}0$HgkL6=GIQ_xo=f?Os;po}2JpCoZ4lZ!`O**S-u7dvl_ zUo4Yr^#-HWVl?Qrs6#xmAcHoJxZ-mTJ1=(LI#Sn5hHhzg_jr{F(3^N>*398;!-kG*ojr5; z;<+=1w+*k2jGZ!J`nZc$UVhoC#ZxCunJ{g_ii_xTpL9~N!eovVYcWTU9z$`C=j(Q;P+%2WpDdaBcsDl=gi8B9$8Z*n5+UY!*-kR)(85 z${g~Xvyoc+w+Z7W_Z+~9zZxtI9Wi$eB;zLt_SVi6b_sVtW==9;tIq;>Mj*!;vatjc ze*i2)<)92_#J`}?loF8zV{84TZL8N1lDl>G)U}Om8(J>;x+25l$*B1Hl9ml^jccdQ z-kM9#tXbVw%DtW{y!9+tQ!|;qdCd>U&LlrvaL@ev0YSKbl3n_C)6lq5%pTI7Q zL?9*Jh5 zN}M@+93hwZExH_a8sQ}N6qnI!vHNuT3|)0i09>t9Pyj-Nxb2~QM4l>$oP)a@Ps|*( zNEH4IyPm7%5tJ(^y@DyvDv#*WYV1axMkkZGREE~2twSV6fj8>~K4VIbH0&~{qyi_) zOi|0yvWQ7TaxKmzE~q$~ulE(^ z>v*D9D0xmLk&auSfQk7CFO$j8IIgN{&Ek=4$rm%agDZ^7TmOCyrZM^hBqra$TczDo=GVZ~WnmNhQ z$30Rond2j~uglk|RZ^9=*jYd))s9ljO%eifRX8Nfd#y^D+8Xv5)j37EDHT~hF0ayM z2pgn=UQsYpr?lA`bSkCb-~~;!Brqt?`kF#@1g=xDv zBP*{|qc-Rj3X4r4%rlyE`V=dSN~IC7o5JRq9G<_o!>@HFsBQ`3Bj+Y9OS&lO(xi=` z09J9732=kq5o2Cus1?}CkXl4+n7u{JwE$Ux1O*KLf<;o15|d8!6B*bjYKZ`K;WLF> zfN$bipb^9SPV|wA*AUAN)DogGpt*>xI27PD`nUu9Hg8WKpWzIwulBUn2L^q$P^#(e zunn1ATJH7b6knQFd?=EVCp`2F#5U9w9ikW8P>J?Lbv*O(qj;Tv;oZ%%C} z8L0ISSXgZJ8mCm3RHqDsBi!(kSx zwSrz=Hemr#8-324&qfE9kH~Rq3h&G>c6i=i?@3;L|4Y}+4E;4U$D<<)leK>>n$xFO zWJHRBjMML2yL$+iuCW^7tP!cp$kIUi35}UCeWlDZf8&bj1I8X-xBQ!tQ=VvWR^}v| z`RwAN%@a~nFg`NmncODCpg%SxIS}2Riktug*nUcct#lDgT?S4@EFhp^QxO@4C`L>n zViMqU&L(XVyAK{uR%ABCsEL{y8B<^27ZyrJe4@-@0b2q|cF9yEYIf!2R+(Rw$rQGZ zw=Pw$-k@Ie4cBXL{Py^hI&w96gDc_Ur^(VhDb1NoUeRgd_o&@kXd86MXr)m*^=j~) zykJb7j~(n4g@jbf-AY0JwXI(?=C+q{D(;spn>1TCk)_7?>iE=$IPA1$j(=aQRCB#M z9*p{R22MIJeoD%HuCZXh0nA6eSEDrx60KgP(I@|)jX%y+0WLXYv+x&5Z^Yl&pz{vF zwq3!j+exC&K?D*Nek}}3g`x;-LVS$r_9Mj4z~N8ApT(cTRMK!DwbMaNhX8%g5OwsVh+_`VeB~zcF`{=%BNT$Q)a?mH| z+HWdP4eG#nYjwe{!nBD?0ZYt$Q7tFOOT$CY!# z_Qs#kt6|tF;rw~Y8Xe7^OkS48$EiV>wHmov?^J6H*f>I?P;1?K@&+kXDB~T1LZRZy z?Cw~!pY3b8pmfLWnoV0Yn_fLi6x{NM;#1?Rzr2X+tyUIa5|zeJ&Eup7U3``{S+7y) zwGzRs)p+$KRlcDlO!!CccGtY%p;1hexQ|b z#(@8cn6W#4(j?rI8-D}7^{eMJ|9Q*c+AwF7=;MBU(o z3WGtbHM3dkR^$y_^^iq)2hSC_3>KH|Bl@?a-P(y- zJ5m|-R;S-3m+LJT?4LctY|)x+nM7gHMbu-~AOAole4cDAC4yS3v83wXrcb|cv(cXC zG;oGssokh@xyL+8Pp@~Tcs1(epuv^JYwUK5_nwo7iK>^|ndggW9r?~D4-olVYSwR_ z?YkuGLH=3hhZF=LAc1s!SOSi&5A$J$aT(TYLjnIBUC4GcBA1g@^ck{=&W?XV=a8#8 z_xkVaPnw;$uq3@40%+9d-wa3$l14HkIRS1 zm)Mhb3$>6h$W;DbIye3v7a&)0LD0{xXLwk2lL!)$vS{0`)^S^3d+l|uF#f_D@fW#* zH@F2~lW*f!aPzG^IhNUk6~UXN*$3z_Ln5oTy}_nUbv zk95l$bPJjKhNSPe9e46Wza>}UoqxmqAK`u-;>^)r1b!O)5p2T4{@d6Vd8`s_@ma*5 zSihcrNAFt?S0OEFTz~&j`W?|8C0fbto9PwtF`GHnW-^~-Za&52y?5ecxLxlcH#uzQ z*k9+IF~nA(sJ*}tfsYdk;vo<57bQg9Vhs1vLmeHYrsMvO4w{M5$*Ve8`F_bPVh15u z!|Eo>2Z3!sfpg z#Xe?WS0Y&4L8!(13v7ONB?jJ*J2IzjS5;Z6FUxB4g?shhHF{3p%JQN0j(!qFUT%GB zc~#Zy(Yt#03j4EcR)3_tVo%%bn#%IldVBxVKjr4t4=t~%=5A`}Up021Ylvidactno z+Pa3N6CbRr$_V8<9HES={`XH@+E7WTD2`T_9~FYz9n zc<>-yacIIJ;yrYTtT`yonFi?m4nyZxjh28d6zNSTIb^Ff%_dwI*>P13%&g z-t9ZEw06-%>`tFMaZ&Bk1HJ*7(c;C$(aZt9gG<%GEds zi;+-34lxX>)4sqKW)Y1LiWQ9^8ik=sr{f(X%so7O*?r<&(XNNk>F(+hwV&$>D=x!b z)uDFo0j=UuPGNL<>eJHtd$8>eHs0~{PfM%!BtxQpRH4}Fp;r{G^z>J1i+4e@>F zKAN0v*0V=X@(Nwxw~upmEEQ*wrP|#hJHYFq1k1*qa!Y(t0g1y?4)hfLr z*p^>7BH*){OjaL)81vhL3cX4l8djQt&G~GKU??2$=cZ3d&+`RCDJcr8P8AH5j0mzv z18oI`!-F0Ndo(z_FxDDS=mlfSaNb=#A)r+omEnoSrQ^dsx7BJ-36C%BH72YyO3kU` zDsuc9y+avEOAn_+bLQtnQ^M(K5v4<~iKNv`@@w#DM0_;GZn21u7Eg>QjcQHWxXQGM zR&Q6PrlyB|rP=dy*`w)UrBiNBWuXBWg9gx*!@_rL9TE8^;4$Mgpk@#!Btvp`3{+0A zjaVo!3D`Wx9p~Qj>t{N-6!_DyI#9#eIz%dg$2+qNBs6!OFYdalt06cRM>0WLVqKTT zCa@N;HsD??Wb8Z9_+Q`D<5(Q@&UT+u2YdMJ<1F8O=R?1~smC!daartoqf((z8kI(D zsfAXEM=4gD(*^sCMnM!hjX|k28;mw=_hz#haiEmRjaHk(W5$sRa-G3!u{j;s*h?}%UR2m>3{w&w%oEDd}t8$~>4(8HfRI;j+>?kU>0tW`A(c*NQ?TJx(H#Sl*v>?qMFbU}Qx15H%mk_rvBy4aBslAF??))ARPZM4B* z7$~N|kI`s1yPXzvTYyR22?P8UuY>sfC!A?8%4G zSgBN*O-}eqILxZVkp^D_)6HW{2AuH5oK2mC|f>;u1tct&+Y49}3v~R3^O2 z?ZK;zP~OWGCUyh|1e2P*3r+{D879~xdo;?VQdvzJBMB+AHYdvp2hpX1r2tFpiuit&)Tc8ul(#s>A7acvv%(=yZ=piSw%oH13e_BjdJA zqEKlpG6S?wHi_~kXTgTDK&ht7FG|>-#={nM`O1sNPn!UH#^Q^(FPX`Kn0M`jeTZ3$ z%4c6lzumcunCHwdE(1T;U4N`=23swibF-5ICZ--TE@G~n|LvqtdrMPwRdr?Gist5# zBb%Em`XVoMbyEwy_aC+^9IEek-?Yj58~a6|Ea=y`fAX~Z`qhWR|DwI=$WQV<_!tF? z#)FcL2vD^NCIluzjg4P_I<|?$E)C=j`mCRp)A9hhd0+eld3+yvf;_R0JRU#6-?ExK zPm5O5aq&Mt_Z;Wszl`5UuZ`bNX3}f90c0lN&YiV?DcFwb-L>=LvVC476))M2&6Ka( zPBxRx+sSoQwf!F$n1s*cU(<&WcZ`%KoPqS??Elm(#3f}Q=Knq6J8*0fv`rlM^P28~ z2w>m{yn#)`&sQ!kD9p&fW~i2ojKYG&g#{Uzh=0Xq2L*HYK@ZV;AMHhZ?W4W9EdCR_ zGb_Kitg260aekK5o;d1LB_46%PUy^_*NMG#E`wDxue9pfZJ@Vdv(s;m+KMPNWLu{`VlV65Z`lbkDfje8+1CEkm#QNdT4?k@E zkXTz+(NU!N52Ts2Tuhqj=s)}ll9K-P%?IgQ4?al350cZg4m*0+5$qg59wr8CM)zwp zJ5O6|1v2OkVfZth9myE)7x)l<{k$YFw=K|y-?@Qby?NghBqudYBYN?R-oy7_gb#js z@42r%O?SSH-?x!umf3l`aEpVzPY&roi<}ZkAvp0vN5Uhws*LAthOBUDEtA z8G7-{To3>tt5*H0C0mK%`={wQ4bV_O-0<{KZWXON%D0@`2n++}SXPo9bNNr5p5Me2 z36Tge*JQ){&h}Y&pU&96iJqX>Y}!s|kRP{ix{NG{&s{>7k+LPEoRlviWpo)okIksU z@9CR`;*>HL(f}mbiD&S8hU_?l_Yv4LlY~u>Ee$w;AQ>_V04fUj4w<-x#7AadMK_6G z^aFa$Rg559B}pQ$()2Ir7oX$r3z|+|`+``$_?)m%0rcS#)VT_E3XrJ~pJ*$HMFfBj z;wp=hmJtZ4*mipB%$cvvoJkMUQ8UTzH^`oubfoz822St~A3J{h*fF9xPQT+^@lT2N zIQ^b}cbsVAf99O@`{QEUyJS@Mmab~q=H+MKg_PU#$;L`Lzm3kXARFVyxB^zVqK#Zp zN#}8e+(WdsjvR#gU>++Rm`D!R(OPa^{7Q15j`p1h_>^F+xfA>}(?o!XV1FCJgQ$i; zWx4O_$Sw2;r;h(XDrkFM9c?ES@gF%AJwk2~zKuT&NB_)018F9ih)mmcbO$*(a1c33 zv2%|CJYqt|>&CH!3<_#S1RjcD!iRX|`U!!OGqZ__HyKPJ><5G|9$zR*7SU5PI0UsK zBg(uv_?j_;UO}WY;(sS{!qF?|fa1@XaU~gb4H-*sx`yt)@=ChkqKZkAsDfNWXOW)(k3&b85PT$lkn4Md ziNQx$9bIrpz?b!p!I$-q@RG@7-H+sP+WSYkbn;}n^zXDcdHnBWo$xId6(en$KaV!y zzl!`wzb5z2n@{egU;n1gb796ywvv`*Y?WC?@7lVR-nEQAOzM`A7Sws|rF8wBchL2h z(rd}gOUaTu?j%bt?O7kgGgA!X!bZUqfl>hD!bXC(@serZ!&~@uQb=ETogS(9e%jO@ zD(Pdd(-%p>>!h+0PI&b8Z|KfC`nLrO>EG(;&Tr`LWY{-kLLJd9TtIYnWWqP>U0pbx zg9A($la0rmK{y6fNQlS)mYZZO3IscrKs_vg7!~_rhrOm(%SZ&>l1%2)d1M>ioJ?xyf67SM?x{F}{sJu~d(!E2k~f^b zethon+WNUC=xf7CcRC}T?4~8;IXXQZi_otRCwcXA>uZnCeUx+`PTxc(hWq`HhXs&_ zeYk0{Zh=uyomx021z2KLwu+RkLWgmlJXuobMi#A3whv$rp?t9wX1H6zu+AnE>g`z7*S*hO1Jhf7gYI%hWM+iCdD4Q@L=Dn0&{^iL(VVy49@NA zt>ovu#w_ym^6r~E*hiG}XIKl&g_FHP!*%=)pOuSC%9TZw@{&83`)K`)+P-%Uu$XnB z-OQ;Wq5ZPr@(|VzbK7W4YVH;aci#h+_w)$!)cUWu(n5Bb05?vUo2ROX;ywqZ5s|CZ}SQ-}7s80~W=+9%wlvqqw04vOT)BTx8^jNP~e zw`FFtR>f`@>$PSJc6BkyvazIipe`a<*a{@>(K_YE$=;|<)k-#O9T1(I99g!m;=TZ{ zkc6thl8u(4tdxm)T}yYBW_F*HlF~nQO-bNEFa5SbTl&YOq(qjltJtRZGA2$o^y@x2 zp(s0LQuoZ#eI;GI{fs28(5R-l1GG%+<1ZAuQVzkvb?fA~tJRK<3ye zQ-FU(&!Hf>WlEqSJAYtu_dWsTp!uM|AbMFqQGV)xf~=sxs)P`)fXbc~egUzOV>1H+ z(#J-b1NE2gF8?O{dTG z$cqT~@XD~}=mZ~w&C@&5(lf+FPV|Z~_DqQM_RKZ-h}s-$rl&`EL_U9^sx+&jZ+J>d zc;AYwQhL@qh9`+R{ZlR7Q%j?@37OM3BzXl5TRLviY%tz7W74>#!-Bjln`UGrXk+@P zcDJMs=$1(M7;kTcJx#{OXAhEHQ&|t*-4i>@^ z^M;p}4$n&r6M_->J2=!53s03y=dFUydqjK;)-a3P>rb65RG05!*;1bK23&&Wn=CJm zr3QK7fwd>Raa|#Fzmq}m#j9+#^o(@;*=(z9x#{vxZgs9H3k&usN%5ArL{oP1(9o3V z#JI$`q?EKd$=Rk9oZX34Z<6AY&9N~-=i6+;$~C%J_F82A z8kjKHWYgfLOz_|p9E1Qb;i;yqlpa3C%zDmAPkCCkM4k&vr$Y+(n zOI2FG==A8+DaPJ$X7y#LCwV5sIADHeAAx6yLklhPJ5Tz`pt4XEfH|(WaY`yO`;j=P zd<>@9QYgRXg+7_{2SD3Lq(OCllB5|1nY#)*-aIl5d*hFi3m6la5H#D|VgkY>KxVOQ z*UCD2oLOQWzRYmBD`qkRBURR+%fg`yApnLT&B}nRyi%4O9g=HBYDJdV+P`~7COD8e z1s`R3($QyV0o8(D1^zs3Y`Av}_*NNvmIY7nr}Qm25~Rp3unKWt4D)|QP>~8rmAc8u zLwap8`oKzVi#)3*aI7o#gGU+U=V`Jsv7l1;H zf?I2H)lLlza5IB?=>MpJtH}`?wqdc-YExFL&4yW{OhS%`+&cjto-jAl@~Dnyu(wCR zJDm8mDKIP}NLiQ<$_NWIac^X@Y@!m8F@Y{QdLd;<4)(MhY<$8|3lA?YJR~UB3v0UJp#|aL`1YC_ z8e}qIjW;~JAT%7`T%j@8&ksp`aBPR|Yj}{@_~9dxlVVH(0j9WY=ay`CLKi%VOiN6Q zACnLhYmQG$&x%WoiB3qUOi4{j>eW2CB|0FWS5nfbVR5l6@g$^;jiHg=zGr>49*mq~ zppTEQZzy~{Z_yiO8T^8>yF^8VVPp*QGjX+nh8{h9gXKq%>EK{r&v$(MCQcH)Jy=#x zPvi{<@f0~4WzcW&(t3pX`uf1Y5nRK;A>XrpUQe6+04gOcBC1Pvke`8k=kI;nZNBJ< zgG1zJ!M@@hhQNWPqPLM{g_l3ZaZi!|R~zn4Xq=Y2qWAC)Ln8cmdKrB^^jA3TJMo67 z?2sUKz5~vTqOc+r4sVN#1EZY}qXRv^)^fFX>ik0-nSG2tI-E#^DNEBnLKwU?lxrs7 zS(`1qH7`9%muQe%Y^%EtMqXLQG#KPnOp(vOJw3yMe#K(RNWVQj6W_SYoK{{~+%>zq zEvH-WUVD0!WU|ZbKD|oY*rM2cFMVV?e0Yr8PR8E5g^bzGj(l%Nv}r>~Xkz-zg8Z53 ziExU>uJa4n^*vo;t-1FPE5AR#JKUeL>qGJ-nbY3hh6i2tFkNxr0lMO0x{R!TnB4uq z0dn`l%;s91lXxHo$$rgI%^A(hIMso5B9QO@vpI=QkA9j>It=j`0Tg|R!0j?d6xOjD zWZzJZTX@73<+MsdxULiu{*UG+TTrkm`vEe_kc(+aLQi81t)!1O%~6Wzqdo!x?q+yl zYLW*XV3gZTg*^R#G)ei5_ESnGFJE@dQs_JC70JHbG*fACUShotLM2YaI(;w5kVT2D zfanlLy~Sq4H@xTR(ID8jQD@N^m2bG*v*>Y;Z{*M;*c|&t4sQ3Qlh)eP*3;GOyZTP+ zsY}(5TOViNmrhyl#AP-6uCBG7yi|>3_~yRbSTnP1{>=INzSu-U=FTkp>Z`JubLn>* zzu1R|Wix9wZfbf@zg6FpkWK1)w295A!&1~C3O+~Ty-sfs-H+Dm zM7wt{`_PnqxR|#GSIK+#R_}#7ytf~vr}xg>d+gYrnS1G}N7<_HqoiW*%st1B;V~KV zsO9yl*Q@Y1vueteDtu;Cy;1cB{?PXk%^ey+-h*L$aL^r2g__eHAqrgR4l_T6?zSe* z>1EEL4$H?}`uXe->rj0E^z)@L%ZFGi&;EdK_Tu{4q1M6d#dSQWv<^A@Uwn%n&8&EA z6Mc6d2|mHD~zISnaD&K~;RLpd|ED^70Oy9ZBk`4IhX zAF<+^_3dnp>1(kTYfS5KBWt9N)eW5y&A#Po30taVZiblGVHgI8UB9M*b6nJ~=b9a&l$Yu1R{sCxS67IXSayQc_rGXjoG6q+~tv`30t?cOBZ5 zJ;+Q?O%5{($d!Z)NLiVgnT&kA(U{7BrwMbc={Xtc5fKsI{+l-Yd*dQKBd1$N1}?%g z(ybxEo9Q*3cf`2raaJq-MR@CoadU8pH9doQE<*}6_vTH=jU-Jkkd+vftP$)5%S*4x zdD9{zB48@&sTm0#oDnagb$Danih09Ihqs||vhNv(Uw_%M9J>axkvVn}lqs#Ecgq8- zG9O`v-pcBqV^*xBfLbhbf@$!ws;=+?$Du%L z)FZsKFd{!HH8mUYyFXK`3EW@A z$qaLU#=p1t*rG+pq~pZ9jQ+-rCq9GdZ_)_m?hoQUi2kb68_Y>n$!0`eG?2r+q$Y34S!RwnjUeZ4Z#*@XcokLZ1aNkGi?7+S)lJg%}B%p zxDEXdNMSa|=fpFq6yc^aTMQPND9Rm@4*Th>r%(bh<8%e(!~%RrMssCR$(AS`#g5znU1Y;P`HpZU^hsT$FfBS# zN1rSqoGv0Mx#45nkpU%?vOCc?Dl*ZFP9_g}S)!!jas#nfv1jB#IvLLxZJX>Daqe2S zUqm%|w))M;DR&D*_H4tJ{6W=t)j5FN*m;ATgi)v)j9VPNgxqT=j&)dn0YD-aALO1r zoAodT9+XCRATG|Z=# zgn6jr&_oCf4$zolkC2&-L_=mArl0KJM=u@bwucz$6G$~K^l5tqM_wd7-yrkf;J7zv-8uR)g-XF`<}~g{{GShD zS%XtS%(%nIjwIj!fjFgMM8Fua=a?HWSBmL3&R2>bPQ8&T<2?t9t~zb5GfzA_!;k~R z5abblyYVuz$$9is9hqFqfx9JE4ji+?hLq(fWrh4xEo9Y=QW>wNG92kelOFb~Y6*9U zacYLC$bgu6jSYzBcL6vlBb)5w5#49g&mPj1bfxbhNI@3Kr0+|UlzTjppCf=yC4G!O zMk-;abdnzDz9qxyaa_eJ&mr#IlQf90&<3Fl%&V}^Ua?0T^e3!<*t^^C?tuCZC;1b%*a-IeWHs?FRD(zR_Y4-Dp@CN!3Re<@?CbugcG_ zvgh#g7~R-g+^T&~jx+19Mn($-YgyxE|DA^sZCHxd!#o=cf!U@UTd+xImc0$C3*yQG zp_P$^+Yt#*5{O_0rxM1{Fufk$tn_|?{=p-1dqD%D-=Dkk?JFc`1<6`|wtsFx|B{0} ziW1Y3Q&VDlWRvB`$@}mO5tQ2{IyVTX3q3so0xaptet}xg2vb__-F?Z#>rcJ#&AF@_ zOBz0#{bW&zB|a=XJ$rsp*;HFfR4D1jjgabD-4-@p7Ir|_43;C5$)ljsLCJlKtc(Pz zPvsiRV=1d2^b}sGn}Y)i<|PO3sD0orbF3+K*u0vIjKrh_gz?D8s7cREL|Bo;#7yz0 zM8A}T$=#MtUH$I6tEb=9ZE`|faH72=Bs4jFc8`MD>B(%?kL!XS>>7Bb0QwTCKK z%Q(W(M|}Jwt94R*JT8OdP=_@`AEK|fg}5w(Rhr}2$4Uh5n)rnH_AwWDVF}%Es%ute zVcw>^!pzLtx>+|4 zJUbWRXmoeGX0gl>2rgo%D(|w_8b3`Jmo?t=;l+t=7KEwKew@IsyIRJWVpr zt{*_3JPW1DOAo9quq6~Dtn`&}PQ*Q1tU!pgAQKzU0$4YV#btRl1MACdC}d+E!w#>E z$`^Ya!t$}j563G$A(VbK(=Cj6soUVFMSA8yMfc zvP(>1?~&y_^zc^IGcYbVH!`url(S?4+iT-Ab?~KKE3AQ*g-M<4#RLrodQlAO!|HEl zu7Ox3Q87>e2hLc7axgAip(B%NNBs>*s!)T`Ql}-Sx+fNd_RF=w;`sD!shP2{Jn1uX zjIqEHr&~2SFvc7)wz#{msf(@GDDS%wjVIoc6=_SF@@jU-*iqhI{R{qefG_lm%bpRH zm)lLCCR*Iv78x{h$aMdHDbZaA9`C1Bzc+xHek z2kIjVDju6s0@<5MuL#Gr7EKIlDR&L3;DMpR5C~4)Psg&AP=9pywxxIW?9n4{`J!FB zk4_msa%UWV29}H+J)K_Z*Js1pqlce;{?P}v-c!;qqfa5dv2XuVkMG~NdRgB-0N+$r zEN(J$1?(I#Van0nyB06+-lIp)+GX2z(<>Q$ z`Yv0&Z~x;@?cYbVg?%#mmE5!Sfk&Tz_VCfQ8~XGE3sK%x`mY*QlgNW&7G%22g zgxK0U7A>ad*WI&ry;gsf7Sb%5|Mhp|jW7O1Ui;oXuP?*Z6e6#&nyi5V9QhAPU%&RA zb@Y7g9SgPk?`grmzMy&EeNA2`?~+&KayMffoQQD{OTENI@Fz^9e=(Y31)x}({=n;(;+2GE8_k~H<&-tS<*>vDA^@Ftfob}Fd8KCZZN~S zanfOOKb$L{RMR*X25K=}5a-NsCyf1{m~VL{icU&t0EQuinU}SLMWn z^rmNo`;ayca1mvc1!Y7d%)xdVt}wm9GZGJliqwf9lfh}PXTlW8X?^+wuV5Zry(Qr=1J7F5LCwnpE{y2!z=#POf4ZPHz^!hfC{!t12&3ckP8-%4^%c`RG-syijRX zB^N5LG;RwYp0PVcTE+S;Cwv4FafdI;+w5%TG8n^(90x&%4NCYiGFh!HOQaFGDUWZr zt{ypKaZbsI6kGK7rQBq?c;3Ml7+fovmA7nHm$>733FSQ#hxd&Ax$N#O3y*@yuJ~A+ z;}g$9A-EueW1I?BY&SVL1U)7?+yqNjYq%YHY@2P#@JVwrhE@(4vU>UGNi${@)(joI zr2FYtX8Q=^Tc8-aU_(&ou9)DS1$hOV%li!)9GQ76!npt5@ptp{fhX@mw*dJBvpZ+Z z27;iq**Q3e-5PVGN&o#Xn}!@-vEu0#Mbqc746u63g$ws`{h8dm(j=uhO~9j8XaF+V za=@mROtOz0GB$1e?AhacR1Y6q+x_@U&pa5>ohLITsRbUt#0O0tF?@1F#);6N6T5ew z_9DlbdhAyBFsvdplNvZbV$BV0EGvYM1WSB zcBJmqvAU849^(All1B~fJ*fq9bnBQYQ^t&)GKEW~zkT{2>2KS1Jl?~5$c_;6{!kp~ zaitjxz2(N8coWGctr91lJVZZujP#fGv?y?q{VG2m2fNu`oU_e@$+5SZ!FQ#As8-*i zHYT>quGJ#mB03+1P^}Q-mk|R84Ie&e;0PLeeE($1%7yFKFRWZd;11)p-i1AS_wG^HyEzXNTH#?9 zg1ocFrf?6f-qFN(nXL-ut)Lxy_WX&XbtjK*?YGdAv2Ns`-jl4ACH;mD?N?IS0$*t$ z@%r=|>Fl;0rwV)rZx4$o-G=~#T+=^ToFoSh7Ht0BAFIjZQU3cBFXh};HA6?14mAt_sy+Yy+?b>zd;a$5Pe*emq_dmFD z1?|A2@qR7Q_JI9b9E(%Nys$$7LXbnImcR);JLV=It3y;35ld^>pfCl-u$QfE!SY+_ zcXuwHGIa|67T-yNYt?J%%O7x1fo!`j?OZ{+Z&){X{_VHVp9_=wH#e-SnKyUtyqb05 zC*7@c=h8p+@1lRqoonsR?uh5E{lpV@4a@kg-M8m8TwX68D=J*JoPPND3HsskWh`{j zvgIW8#N#9tcZys%>txjoX}3KNm)Hf(FcAWjlOD z{9>goSaQ_i$Dv~=Lsb(=6!-O=;`+>)i#~m;@7A&&b>$nju3fxrb@jYEZqMIPS-Q9A z=u6Y->{}s&mtOC)d0^jr%9q}E-_rbr1$W;{ zwX4?C&wPA7d-mmz!^0j5Mbag~c0O`LA*C+4 zv}EaR)k})Qx6Igj0mLng%~K zfQz5?E&T)y0FHA%pjYXsP%d!is=IgYynEG7erJ0`fuuO)Ckh@KbKz-cvMN8$H6K~) zQ5I>iCaIHG2$cx{qzFoZJ^*IY=pt-TiF7$O7nR7lkR!*rXXr@q9Lqb7}M^*#G{-LqQN zm{#AjYrlN=KTGcVr zm8qS(PCPE(fij5I=xA?VY!w0%LU}S69ItO%9>_KBw(HvvzKOfN4IY!I_3H(5-uCYH zd16ev9CMZ*sbOMml<|dtbIk0!uo5y<+rlvB&CiWv)(qJ9OrquCoSfQ;`L(0c>5CKBuNR}*L)eKg^ApbSZH{c~6aKbw z=O3In{pBM?+bSzJqeYyyHx~;1fd|1T#sauYQh1W$# zO&K?4;@ZWt=hr4$_D4m(a(dx@zDIktVDn>@?;KXkEvSheOLc4~5PN}UeO%kBaS?Q$ zQd&f=*1=3_cN@qd1~v2=$$LN3Ywp2Sd)PQ>8YRb{bW>cKmQ0vLw5z3&{}e3DXG%%= zhF$|V_j&!&`LkV$V#pKNOK+WmVh`z9bku!Im)&QvJRBDO@ypLbCn53cJ3ijB_|KS< zxXzPddg)@7g0ZmmvdCv|V&oxRZd@^Jes6P`(zi2?^RpIV zxL%w*Yw?R@+6#+jVc4cGJ~=b-X2Ui2_LAz`mSR*cZW@Opn#Sg@F&K}>pv-M(pPVjj zime1dF5=mIOBre%ixkQbY$58}6SS4K<$`?MqsI33&ya=Jo_nZV5r-NZF);-cgDi{} zTbJvTp`oOLgp&-?1H$l0Y2VK-LKtRrcno#w7T(x_l{HFN3AeJLF)#-8a*P&iakp)z z2CxY=@t1Ltvqin8cHG0GuNXwD;qmrhg|f+$tJMYJMU$NdKj#Mz|(i zllSsrKWBjP`+ZWyZm#Bqp3-)*i91^_iKLrU-cN@8HelzZHU>Q>DZ1Q+gN3q zug%8%v7tes_c1vh$tQk|Bt%>p=udb1g#@K1BJfI}|55v=p%#-KzAZ!fgrol8Y(Qdq zP>3Iysps}(rR!-;0K7`+4XN0z*FO^!o1T>(8}y7mJv=Pcpbzr$4xlwy&TK{(5L^$s z#Mz7aXURsoh#ND6Y>|n=c;lpBi*!N%gck=!JfSI_ViyvKBH#~`eR%c_C!C1*#x1yX ziGERCeb#E_*V0{N7AuTAL+aStwfecPaD%Pasbza$2Q2{JA>q*=(5U5stqjxwT!=ez z<;oGdtG^TY$&K{gHEZa*8@W-^G3Q6A_dVi8VY$L%=556!_%R>8_ObjU!g4B50msX5 ztdaG(?;wWODWNZ}WUCS8dxUWB5-RzxqqhnFZs@|TBL0Z{3GW!Rutj?Ke3H}u!u>4W zuck+8e@A+vd8hGD@f7?SGdmZS)PugRK;C_lMk#S zTj{)2_P6=H2NbRy;AGew((e^l$^C*qdT6lSl#>nk!Ls(lU6WRFEB{TNqyzSlxpbSf za_@EW>vbB6exmR?*-ds|rzcps9fuQm6F3R*3-pw58WvoTZ#V?9!TgYzbKpK+M|hoy zw-BEDZRwa-q`B*Yq=o$4rCguA%Os!2u`&DWb%~y%S?3Z+s5@@%Fmp^6R1vn07Ic9I zlMxO^xXnT9xNWbDSt@yR)spw)+^@^_O3!mQ&LuE-61=V)rYB^Wa$Wzz#A=7I8>c4W zO~_<{4_rnxqe?aY&VJN1hD)d-PmZAj?vN||>49_HjsrCG94Pn10YE>Ul0F?n{*@zr$|W#(!fqMV0dB`RIJxza0V;f$ubC>o4BUKV zY33Eg%!rk{nyNi!@9@Ao9}))mA}1TpE2nf87bpO zUtW3FrxQnIvg^VD2gqCGtpgy6r{)gQ8{^0;=mQjcx@b)-;%+3vS{z=RvTbJ9PY#^n znqaBVv} zTOB1V(B)(tEjkMVP!rxvviUzB=$XG`MZEUF*ICdfmeW<;8p-lT{^irU6!TGJI5`Hm@TKFZH+Hh+Fm;&mGS*{ugUKW_H)1CotTw{*UM;C#D$0KvOhX9u?x_rzLTGW-o0`vaX+%KXSy+KRS{ei;E5P zFlDA@j*g`xO(iJCtfS8w@9x*H&%+FtS!6P3^{_nuLo^tx&0#qhY?6C%5a4`rU0j zcB~8PJ}{Dwj2#VX1Pg(2vE*1J;mdsgWSx}oWK}13cZL$QviId@vvHB*vKtY z=807f;K4k1Fx5a4gUm$G>)&_`ZF+7d&gqVH#w6O8avlP)y8#7*fdl z+dre1a2X#Q!S`;mw`5@)0(`6Ah3Bewr&QcQr6^`a>9nZaHFRJ&ycPScwdSt&V-f0! znOR##cag0vkxm~&>7pvuzBtV~(nWlL{~ErpL0yB~00<@DvpmuMv3$s;t~=${}(?jI8g3*1`<(Y;2y01gzQMmvyT+9f>0rHFr3y&pXhwOMJ^|Y%;H2O)9E;iPV^8tu|g1#P)8AbP|%9V zj<;F>^AIkH+@?T3?N5TpLqpg4A;wgdx2W?+Dws_o8sb?mcyL3QU6{SzaYqpM4FY;< z@c>88d9Skwn21zB#$P8QpWvyy6NR6&j7FNDG0qxP8p--RBMYk55gPH$Xk=)YMwkbH zMs&BRQ;AgWAW|imgOH2W4kDdkMB;n*CikjD8pepk3wI#$B9c}*h*Yi;2|pzK6?9{!?2669PV0wc*k(*qaJJfPu=n)zcuN} zEmQli?IFwd6nchRueD&0UBi6J#PJCl$a1XC0(5ZHM5h%)tTt}F$AqqQAxFpnfgjc_ z>8`Yw&e8LTfTSrc45VkgVY_~k|E*&1hOU73?LnS5usJjS-XO2Sb81iWGJTHQNS`4k z(jx604WBh!5YqUrl81c@rWu^(0Gv7g3pQr*IRpdN5aUhQRD~hIpJ(x==+Y(WCGqrM zN3>(6PW|f$9O1D%58%z`Y92PHGcctRrysdBXU~q2Ub=Ki&ho;apHD?TmWOB#BTs=g zkl7#_U~O+OKO*g=bT7Axud~K~#1 z#M`=;mK^U>W-Z8%?vkfoM+Iv?sHP8A&ta%e44gHtcERN7?3^}v zLGAdNgNCHUc%TvoD(HjNALxRj^R4B*Pn48)&+8IhkZ&#PbG)Q9k8~ZAmY&|N66md1 z0`x{^DtDtMT~n&?ZO`r%z4I+5leuS6WyR?6ha5MoZ)*HX*C58>{91QS8Tb$kOHdQ* zptSP(4EW$Mt;ULsjI7aQvBjY!%fD<9-lWtCYaB35P?9K&v{`ix^g#7_`l?q{+UQXq z|9NrL=+tPh`g+eUsiQ|-{PW{cqtl{2Nssf@Qr63rmC%QRJ;>@kWVJ_-xwvm7^yFoG z=rYeBD3O(wFAuBiTWmIPr^e95wb#Z}EUKC^b?TI=MHOS}#|~Yr+$c8wprwJN+Dqj}r&Tda+tA2Hvw8l>IP=FGkL@2+JFrtS5X8Gy(qs0n zz{hk!rmv$E-H{Kf$z+!O&oNDnZ6KdbX1IRd-mvVsDy<> z?W6oSdbEkEYMmHOec3vOvt-t#>vK#xBZ^<6)!uM>;vZ`c88c^ZyGIyC$go`Bx#Vjl4WBFq z3AqZ+>{_jd{7g=dXMpK^$6a>5Q_5@o9rC%9=S-tH>dX&3-C(=EQ}ef%2Ib3Tw3kMO z(|TGynbk+(54%?RUCw|D+;$8Fnt)+1(zr%1`=-^VOQvc@i({_EF zylgFvQbzk}RDO3PEy_UsItH&JX8~z;MrE57V_6YxUx*#G_6V_weRZ)9XgXorEh28 zcP3AB+I6O!j^?E`Tx8>ZCX>XEVs6g#Aok3Kk1gK0$ZLytF8RP8Sx#G|aqs`yELYAC zdbP;!Qhu9hTEU}@v}zkw`x#e!)OWHzi2UuRagm*7I5&smY`@@Xn`vESrOh;oOgP(D zd+=J3iJQXhNFMk8uYLLfUW+o_`Kk7Q?ZI)yDq3)*XS1G#1BL zkMH*C*1S(^ul^lNtCZcbw5l9+CXY%pC2xCmQ`?V|b{)ynoOT__<6e)Bm8bMavi{dX zHr?f<^)&AC(RvzpI8ONm4O^7y(m%>F(^{J5@Kj#3mew6VCrw&Q+Z=9l9<-guDQ9h` zQRSdxX`9R9&EY!fs>(`xdGJoAZ%5Lqa@CnU&1u(}aypY&;ji5OIw&vgr*)T?_S3d5 zFYV`1;j6S%`P?3_n$y3%JSzO=G;A+V>-BK9m7C{v%Jj|CwrmF-$)l!GnjFrYyfM@0kAKMhC!YKaGow-2{$XKiy_p z7x`;5jmr0qq;;XeP3xkDO9X6`o3y*3z^h zXKj|P!fQ^8j=*g{PYd~L69;#E-TK-#X{D6iv9#{|?pPj`zDnNKdFzgMt9{!|@b6q6 z_j=qcuR?!!{g*v!wI7sugF3gs*IhnT{kJ_hPWf#Oo=gAOW|?i#wKaI|_&I6PTH5At zo6E0zp4R2pJx!ba=uPX^Tz+p3*GX4ZCfmz{cQOtgNvq0LXYw?sU1!SaSYCzx3V)mH zobAb9`)S?frTw(6%S-!tRQM__RX(@JtLF4?FOLepISt#((|SFeZKd_Rt;>JwY1?lH z9m%7nQRPUz?+D%0w4KST@~1O-n)9hMc@-R;H1AAawcJ~Q0sR;KfV|$MYp&}ymkW#y zEz&fXx7N}$hoj=zT3Yx1zhihQylOpdbNt#%+ZLWT&!g%Lt>fShw_|DDWws-5oA>|i z=W&88NwOugFb!`qk5<}|;Ra&HBO zi~iriaX{Ab+f3^&f9-=!X-^t7N@-#1}IUjDG*D0Gf zPup_+up@bzx1WyWX{-HoB(IX@R_f)Xx!MLgQeJbKcP6iUJv&#vA}?zH&>4B`SRQwI z>{y=G<*{RV)$&ySsdCd19;kHeOkTCT=KQ;ra&H}mQ%*Zy?ycoj%TeW2z3&X2)jYQX zL*>z}+C$6d>)W=6 z=Cf3LX#2Z+_V5SVwuiZ(5r&;8KELX|z734ShzzI&V@F$tuiP~}Y z+Xb%+4QAo;g@)hx`AgZZ%1!t)p$KTiR`vu{0 zgZYBsWxpLqRn9Xz?|zz8PIKIdfK=#w^t)h$L(V#rnA!t9&z#$MBli5%(%34A?cf1QerA8 z8e0BB>4<{fy-nsK_1eV33A@z=r$^oEf)lVqx;e#zWoWJ1q zrmBpXG-T{0{zJWWx9$FkUN7v+|2lQ#mWIrGM@@C{V6M>99ghH8f}Wib4GGo6epzQfGiPy6=uelRudKws(iAArG%+}stw;D=0xQzi){etio`;7_}6)AfF+ zA@hNLx;eYWpIuynU=feArqv&tY2`J<0!>ZgiBiB<4gx^;^FlG2nB-zQnHjJ zqxAPfUvTBp83n1!G_rXfoc&>Wa)<*wvJDibd?B6T%29aqb1DUf3sCK6=HDU*(WXyGY6|5=6h>ML*g_zXO74(gpUZSH8Hk zdN()`3LN-SQ+{!9#pO4LEZ=n)zt21)e?992=LV92W?;ehZuB;7qu78e#X}lgWwhP5EmV4`PU4P>Bf7GAYa<3cyEG{sML=wX~^wxY(w~f1~asY8zi0G zC7tC4iM=~tk(C3b1@+Pb?%sOtf2~f45{N&<34}w5TdGqfIYTj%ox z|4)45j1?{8Mphn%+4GRL-`dbTi zA%D;)4|cb2)hTXoJ?Hbty1TaeuR2A2>!mVw?E)WXxSHUzgWb)_(BZ_fOF2Q;fAemH z!xKNHFjlnB55IXe(!YY#0?E7eKOG}QYLTBD`>CFW$%Qtr7hxx@`S@VOAz^1YZE`i? zFI_=_JI|mSNi4k>DZ^gN?nCM4Bq>rZUHE;~Dd|5?9DGKa<0y;^!yUKXQ5ep=IcS)S zHiFnvtTcAM+rnFIaLwRas@k5FqKN@*iMa|7INWtOtcWt#7laKZ3 zr88#sk8|+jRqz|9qZLe{vE{I^wb@3UMecZ-qa()pvcgSLKwl zDgGXH>md*UIXyi5hvwcku7A2EQCGLVccy_MX|D~)7(PFGeE;X4?>|0zfAt7GeMm*L zEUa+x-udO(-u#|N)|GVI%Em2~mOP7gg~+>Ro_QBi=%q*`Zk;HSb*oQD?4BMz=qF$E_Sn5jzAxgAQ0ZGTpUWgCkFH&|nF;7`_UCBhV=LH=TbV5W1 z!jo&4zI^w}`xtg^QY|;RCepDUg*#2}s{3H;w)g62+Nx8sNE2I=NH-&((h!|EDsiVZ zHg~y!V&KX_xEIiypuue*5&lm8`P%7MJ|4SQGJ(zpJ0B0;OTXT`W*S7 zYWN79Zp00xTb0{X6#eVi2>LaN7;%jFgrP@rG%V@It#52zFHD=Fl?FH(6nEg6NhGg7 z$(!^Hm+WX!K&6RyW)&|bjI}E@l(^Lj^OQy&cyINWUsgXD;_Qfmx8DBsSJelDn|eh$ z>VZ4$_S)0ZuWF0_@*sQgH*!f~iA&kZYX8r=Jg8J~_|i;N@e@vewxxZxDOBF<%G+_QlRS}1+nB<){_{misXD{Hxm8xU}U`AU+7176Q^$lrAL^(j_*FI}F;w&Ff= zXHuji-$;eRmkvR^aoTaAn{n_U>o+DzQ{=I{efT-1;5OmYZ@5=m!k69$eCQOCrl;s5 zypGw_9%c)qd6irci{Xzi!RJk;Q}_-c{~~ehx#mHa=N8`~n)m5Q_MZEJ#L4p+K`arD zpnvm%_8yFx0GmNzUREqm#wIGWsFEkh2TyR*=r+0?S4YSPD1*&~T=E)`O`jv@eN|Y+ zGB+&eA1XmUnjw6Te@AG>6J(BzEAsV2nZSmBt?^lnR)3FD2Rtvv^90`^ls#RCQq=Ut zqJ^c`{7U}qo?dy*y(2$I4pwIdAO1&V_}ts>>9z3F>^r29a&J0Hz>WS>j@qe>E5CmBmZm~WMpUF}%sdLpiO}Ew4x-$e05SWa4 zKt7KtejTxzg$X74M<}fhIpxdORgjmZA8OZC(4L%uo2!zL92#=0{!e`Pa(DW)2UDqT zGnmp3N-bO=>yRURi|KG3tg@>;r3$XXa`P&%CZX0qm6MxPpl_av zy(|5(wj`|)OSHq#7c$S9%ohj~+F()kRvaJCn9434UD_2s($PCb*}qbIDq$7haGGS) zlgu;crE&EQ6FxeBhQ41`PKV_+rgHnd&^rL?+U-0$8lI*SMI);F|?2XQo>wvcdTC8Grm1TTHyZ_lJj zY?l`B?TGe5mAKCex-GUR5Ti1R8dpbQBxr+ z7oD=+2{|P3DoiGaLZS-yuTPj9vNhUfuy3Uuk$4p>+7Z88EwN#Oqa9Hz@W1ZFUo8X7 zbWo6K5pB0serFT>5hUX@{XjaRmO#{qhr3K|Lwb)@KSJU21n)q6C(vLMTFe(;*Yax)lnb$OB(J(PUeY554;jFBZx)M zlYrh=2j`X01rwCOUpDwb#DEuKgqv%|E3st4uCn2qeZ4)`R*g6`Vbs3C!#DYPd#E8XBQ-|d*=>T@(A-1(9m zO?(_{He@uPWWPv{lF{S@9d;+i3f)Dza_NyZbp1sVF@8LQK`+Xoo z{`RNn8zcg2Rsl^gFVc-8j*Oz4FaA-1#Vdsl^JF{?%Zf#x_nf^B`*IBDJ z%cXz0*VDb!W|d|7)}5&9ChURav4}RJq6^E-$)OC()25qF#;sO^lPC^l%u}aohX+TE z+~z4V)fxJstT;N~G0o8f9*OsCIWWFC$r9b><=uU>y+jUrpL*gY_viRm;=eUq%a z$V*YLvZa_B@~iyC9d9vbbcY8U1g05bM3LdS>tL@!^*Y0yVgLDAZu34)bExqjVu0{B z%nN)WH%9iWH(*1TSWNtsVN&%8ZhPg}lhPde5x3(Mw@xS@Cz)U5E{`X*(*3VUW-^Go z{4)AV!UIlC6C6aufO!Vdo3J}fu#a)FlG||{K#p+hPIBAn$5ORWPS=l@K}rAR-g{Xx z)3dN{13sE=Vt^R!z(rQ0iUj#dtke^9JVvCu83zDAQ&ZYyuzWE@I77BQo#Ou$_S*8-;S&(Xzcx@H}6wgZJleNn}0E z`&RbFJBv#b9~Zq@9@)1x%Yq0SLOF98-0%lq!~Cy`-gHszw=}PwM1EUKHZndGp{(_e zvgD#*umgY4}BKqvDDi-w0}q=Rta zhkK2)N&k>~aW8T&Nkvn+TCP@F&j;9lvi~IG?3Tws&_D^0^+Gv1wnAN&is zx^O;u;_bJ|*|*-Z$1TKjc;jVwPwsnVNVNE z#PEbC^iz8&{{%Nj+HMa5C!A@RS8RicB}CFafAFz?NVWFHrYxK6kMn~$AKJx{6?xY+ zmWZ#4cG&Hqg&-rC13NB!UFU2vSN}1CJHS04RgoOJlibE#BDc|<_N)9j@))hOAEuSS z(Fp_l*(~omCCe`^saRd28=uxDiyN4KeV8|zfa4*$jI8EGvYIaI$9=_>LR31F|i2QT#AopCI^r4)U%azV4`5QlT;DLQ};32F3 zm~dyyJ9RQTm?E(C8XbaFU{3;AkpORVKmb=m#tjYBGu%Yc-zPRePv&vshK2-*A4#c% zc*e&Ky=R9&GwOLx;FUWJT^y^o5QcgOFl#IWiMYuLUP5A=FR`?^1OM{G5)=}x)1JKch7zA%XQ&2XX$j|ZNQF@ zV+CVl(O~AW+G1|92SyA**yRRkVMVDF!)N8+p8ND`Cwecdexs_kd+|F@k-h)<@($_T zl{NR=vxa*vq;5H#NmkrHMf&-b`|E$j>7zLxU%K}hZm@KH-RjkAAtgnPhlB*-Ikf&n zO{Nkb7VQ{oTk_@n-wqc82^QSyB{xT_Xp!9?7DbquL<*Eb^7~D=kK3+X&7qU6$)I6m_dW*{qi{1!K^J zs+L1cGleepQ$obw8=mAV?5~L*?QNLL3g0ViLz#n7|7c-S^E}h}KNlPO&WcG1`C8FAW#k2$_e?WPnUeS^B4La z>H5pg52cI?Pd)YFhfh6qLHOaD8!7);vyvPq#^*JFDm;PtZqBiyzrN_&;wThRLt> z_rD@MX-5ON@o&(FV{{ch2Rx41JH!Jd;*Vh@$>tXQLG@(fdsOrM5^lm>FTKhA$37H2 z+1&(YU@rCb*P!E$m&3BKjt2F|^00=5f#(p-m4u!?UHs9GUq}{x_m>?XaUYz2>gfv? z$h`l2BYuRM(&18nI(#LDmpoQK1b>k0h>#Crsj!6Akz_K2$p2&SyW^rfp15!KxuPaU zI(ESm4mCEay<$P^id~AJV($%m@4ZsQjs^s*s8O*bme{){n%G;4`b%P>!n3~L+2@X? z`Q`U{|9by;6Ysd^x#xCgXJ%(+XJ=*|$;;{tO^c{5 z!%-QWy+R+J-HAVaaCG*F5w$y2f`kUX>gjZa${Ajh)PkW&|A>XqAUSTq%Cb%A*#1g9 ze}W^`9y}K52XM@7$@8q#Z+8BzC&sjD9UD~9vqDKa@6urR{Ebt+l)0Vjg!U-VSzawvLEpb#{u`4-T*S(tqVQtl~PQHS?~ayp8SEP*hWPWNqNy zA>TTcZa2i&cY_D<7TVW=7hsLbi9%6nAJjpZoh$iiwH9V&g2ZVmbk9)CkG#(fQJ+8p zl!9+9TOTeEYYKRyK0MQR)<=W0ENHR3vpsTaaHN)}1&Bv@lhJHKREa%B<~hS@Ou?pz zdg4FV4(Z&gb%Pp{MoyeKDr4*3aWOGHR@d=u)23-3<=is0Lv*iumxuLOH*=BrUi@d{ zS{9pt!%oXCA6$B~YnzdoXGiwq>8z@RQ}^KsZwuLhR2p|bOhyYG^M;8+dJ0p91R2}j z@7MC)%)jlT)lI`LKiSeEDDArBmicluoBc;U?@Bo}kzp?rZB+ zIR#iNabz6(oE04_j^N8cwIM&2eVCpdFYNSfFlTDx!WoJf;-BJd@lOl?cXhGm>EPfi zEi6de50b~NS>$nVn6AnX{SJhz+UQ>+Zt&$^;WPT}8$WDj1D9H5oA(;x|J|2GtCSx! za_IGb@yRg@hMeD*bvNu=!m7)4MtT&0)z^ubX>LDY za((f8^S;AK;6wWF>DT{J%u?~SZ2pf1ko?I|0!70v3<)9}wD>R?;Y8tBALtm)|1y_H zgf^JR$6KM}z|17uF_%phe7sG{`BZz?@M+@D`X!=Ao@&3S z8An`r>a-m@ggz}!Je)p#CY!-(DAjiD+J$~fh_ZU74p@=UyU+E!%NH{q$S_Thy@;;c-Ud0&lj>AUz%pB=2qxGRZs zHm0l&oXA>?3BT5UXSy<3HKg&KJWGyClvVDaKiG}v4<|sPKb+(043bLI3XzYHhOj2A zV{2J@hq!lSz4+_1?WQHOW^di&*50MpjEBA{-IJYI^=X;TEOt@G&Lij6@95U9$M|V8 zW`;?sisq9lrJXhNwukm`!=mo%L~Yo;|2k?PJC!|bM)Cn$8 z)89sjGQ1x(pM6~)M(yv+Zm)ca-XI7Fm%0zH^mUALAP*{_Cyg%yC}+_XM+p+MI6}@5 zJz>B4D6;2h*Rbj0@8*snM~8+x>@bU8U&drQhlg%iUu<`w@HSs04q+kFGhLO+=;Y#T zR7^E+3(gI`(-7&$X*DUd_T1ux>XVzoFH)RN8Vj17GbLTPOtOe$n zD{xjAQ8YH3fzfE0A?KIkE@jXc;%?2ONJnbzn?wUTVWluQ>% zhBs+P*TFblb}U_a#Et5!(~`;22XK=Bd65q{-X4xtd_ZF4@>K;Nf0N<3Yt(3QqgnCD z80IxStprZJ-Rjc8rN>}#J7h;pnhT4bve$_XPE0R_Zr7=AFrJG?kEZiUX?%yq8hiFI zD_vTECtAw!RmAw@>>`d}@}SWQn9&}JCxp1UydN0DNlGzSM;~XUsi@#kzvSlV!Gk_$ zyqinv_9NnU$u=&0PI-qW9ghtemF^w9pTeRu?;336W3;IbOIjqg#imJlw3Ml?A+a4X->m9AyoUDlrE_=T|&W@{dUYR z$HuZy_7#tRQUI5|SSHIMSXd|bQtc}{(2Z^$V*%&)^B_RW}i6G~s2AmZ{aGPR? zJ`z||{4_nIMBR5I);e`O*sN4^mE$QvpVu9c6*_o-=m-dz;%#OgXJ5}<1E<8-OGc`X zLdWyFJWaJ^FQ)lGco>Yn$gV}YfR%x*LdG@;2`Btf?^XwEf5uv4@-32+PxMQ57Ds`e zxjQFfG|XGk@ep<6_}rOi8=KaT@)G?(K2kUNupDrs=_&6%#X}eU7P2oULu*qX!9CSm z+1ClVgw}M-zp9vj2FwkUl#WtvRFLutItPE<%X3YY`YTG+;^9-pUp?4ar?1MW^Gghv zH|6VY=|cT=WtEA^j;!PK;}xZxsui4A>epuRr@o$*!J08&<@ByyOq`Q=5oL{`hL(gE zNyGeflssa=FdWT>7GQLpVx=^cwwOn8PdDM%nhZ;vyU0Ai_J1Z)Khj6x2m{QZ&`*fBrjA?kg zl%8Itj`)(DKZ!gPr7BE{UE+e2m)*gOTR}J2z7Rr+qrn7~u3(*n!Fxb6m>ms@bFYIz z)y2$`JBRLR&L-4tonF5x8(Sh{$blAO_E0sQcVIIo{H6?5-_B--ct>@DNEvr5dp$2b z**aIaHdpeJs; zL+^ZesSgIcCh|yXvfnKL(uW&hSvh!s+&)TeQQf6(=>x2UE9)25-69;sInSDAJ|XN# zlRnC8%Rb?Kb2s0w_7qR6z;p05E7gQoRKL%`v9T-Qhh2kAH?ochDRKas&a@7KZ;vh> zGDE1HJA7L&26j!mY5N>m;M~Jb3)3bP?=$^fe<{@8s49D?4<|m|rP(#v*R_89MQObb z{kUNiR{iep>Sk}}VWiX(H+xU_^2EWW3a*e62U0y8drcGXI$fK~=BTf(TrYL{A{%2A ze{I~oYtf!k?2GRXd2ll;l(tJgd4a!pQcXfJUe9)yHciAYKWUU)tl`XWf^axe8~2A&40z=N;# z^Q6poajoD8d4p4ev66KQ@Znf~m^>{;N3#QbiLAQ&KsKF;pMS_MW;jvEu#DB8zRXcn zJf7(HY+FXzH2!v>h0jR2eV1L0`mMv@_AAv9A~UV-yqKMtVl}&U^xRv3Ddm1^z%2DE zsTkPL`D|9mAP+|$!__oracJp2OJnDVF+%OJbLtK!rd&Ae3hO4?L%%Lp+d?H&ANog#L>Z>mR2UELVyc7GO8928!Dc3WEX!FVH-VJ@VaZ$ zOH^SU=kIq3Nd=jc)hX&w-dBH&HJN`#c zmcL1f^-`aUSDxkemoL7X6)(};Nj(hdGk)B-@7>6Y1gHy%zf%u#@3<4su5TGrr*1YF zNXirBx5;@+@=n7HweORUrpud ziaYmHAwV_x)CG8^-DPtC3GrM_4*V*&lTAl^?{B=T_70b6>Ej)yjbN>#b~X!Zs%CO$ zACfG4m&7WKiMMHvzB2k5=VFd}plR#s#{e!j85D^Je-C@^u9p^)sl2Pbhnu3*65hq@ zxWqBflKf0^zY;yfH$6SnKg6G&jZ5%Job^FiK?Yl!%CYP0p@*2s02H6UOM_M_Hle%UPkLBSst*Zryt>=_J2-lB3w<*3Pr~(W@zsiX?*Pn*xJMq*VZm=wOI1xvE$4a`Z*<9}~b6ZS1kNLGg;@(ZoL!bJs7* zy3Y~?&iamGy>AQeLE-}M6Nmiw;rwf~;Hoy;ERbHUNI1Hq4eX+lz01g#jL;C-7@$(d zs0rBlyMY|Ha|79?tOwY#3)Po1R2E%SFZR`H^?33I-ikL!-hj5|puw4Fi}ta}PX%G& zAz$`pe*VA#_0WL>tiry1h8yrreRvNp!JY$TuJk(_l^Xf42{PJ~!1u0b(@0qlxW+EK za+|JMJ4xR;;NvLp9r3YQS50QOO9zJZR=K#AuK+#RYdWG!Fcnl*iWYi(IPWBTI7(`PKsKJd{kr6;%w1Fj(JSKbJ#w=0sN}3E$>efP)=vY4Isg}E(M}=4E_P%z zra?LnE1aSC6>Zp?TVjHU=kaPE>}058)VAF9n(_=VXteRbZ}ZSb?l*!yyy254qWKg2 zr?kHyf-V?tkm*>kKVmKHZu&3}c!U4AB|c-jv(9JGiOoD7z_wM##Np42YuP1af4TGS zALT&+ITKx6?I8lNqX(g&IfXqxIq!~E>U6@t_U2K|I`Y2sUNPi&z$fQj;-uk^BTB(N z?moBU1NLK9Yxj8_9!#1z>`4SvCCRB(*dJ~HJIqY>x>Xjq(ypFORLPw`4(KQe*Jv~v zd@XXT&);8z>_Ymo(TgHSN?CPb=dw|YB1asZ&Nob3J@EL#j(V3FYWTD@^wA35m~Z=^ z7$APqB-PlH1CI}2?uk#+l(nJZTOUk(lAhg=V?@rZmLt`vO+F60~qKZ29! z#k*&)tr_t1v#rE^*-MD?l;PTMup=mcgZYZB3vB#3f*<5Q%II(3?)%RP(T-g>A!du| z-!g3Ri71vJMzTe!Pxf0rL7k;w879Z4G|f9ck`8j0+xnM>)8K@K-Y*azW}VcyQRDr& z_^sT5CK*N3h&Z3PU74J9UhkXzhf&qz7xqOd3Lkc#coy$H4 z4v1yiONmA)51sbPFL#uh5@(TUtd52=if^YmOb+-cenb3+*{PLTF@X&sny)lhnJ)6f zL*sbJrD`A$7~CDsIH*1c>}x>j`T6^}f%C!g*g$s%mvMXA7{vC6+0Ejq3~{dpFVCpH zy$3&i^XBQ`-hD^0DtoHAm#+$2ZDc>&-F_p*^?g-YrN;i3-P0?v+6Wi(Vl^wKyIt~c z)Y$)$TY5!tM%>2c$f-){?w9?6IgG)8{dd@mk z5wfNh{61bp{fl1v)L*zWy$CQH zPy`U#K}-RDKN#)G*s1`G7Q4shef#(Gefx;RvXVfnC9quxKCEpZ51@fb9it+d)g-d` zkbm6Wt-_L&?d)#$d%drEaO0*J4TfdXZge5K=d;XADE4BMhNBe>3R(R$AR{A|k6OL!qBI z>GWK15?R^HF)^3L!^A{!zyIlhXUE1|W@Qs6KHL%>$}$ItptL9SIeg1QqL;P@YL$^B z?PSd^2+4ie1I-XUGI*3ST&=}VXD=Z&4ela7g95b48Is(#xwVhPS$^eeAXzW%9!(z? zlYR!cDkye?^s-Gi>wlu3s=aL*+ED1i`^p#i%shHJukCI5C)@i|lr*59|Bad~_VMHY ziK5O>NW@oR&ufxG}w^lx6~y0B~Mm?c&Pn@dw-uj%68XcjzOYFhrY zq$#P_f#N>M`j7~0r77q*@kyF!Fo>NBwbE4LN&n373ahUg6c6BNr-M7%g#wDOU+Cu> zpow98!UB};LTtO~47P<4xZhEWfsuEj;j8v$13H&+m_K&hJm=@X{PNs+-ng;z9m;eT ztHnjJNvZ2qqJ$T{rrSR77bt5yVGQ~supXuL%uIse5jAZL$>ei@H zw~n{BGDm)>1_eU=*d4OF3i!*av!Q_?u^|VeGk7ueKN$$p{sKySK(acJuS$lUO!^v@ zHsom?{62T=R3R<+Q)9=*yAM|1;0ZYB&9n!fiwI!C{BM{T*r}|BiJNmqZr^|H+Wze$ z=iJmVQpa!H8;Oy677ZhoX~2kuE(&5~)BJlMJ^=oE^EcU$($>}YlUUK_D6I{oT@8%n zfuHpAKBc|d=Pv@~FYJ{hLf439vT^khbVI(iM0gY$t4?yIjslM8YEiR0mEWiqU!<>`&R%T`In94g&(^p~J$=;B>J5>x(+UP^E!qXxHWdNF1LxOk|;VyFV zKxN?+dn_g>N`W2UQKn40E+MJClFl@0*RGP;WHju`$k^rOTeYqmzmVOrP*HP}!?kLj zSl?=1=g!sqN;uc`g^%NXCQGa07h0oR08Av}5m_fj@y=5}<|ovNVY)=6HqM%MqF7eg zgCJ%in|wRT=(I$|iWT4Q!S^+^@0l4^m6^@I#U^hv%vz#)()WqtcV3#Em$9(Oi^RGr z@V1zqG-U}Ve=dHH?`vq^!yW-)cnvZA);96`5*|!&(dI)3*b_$7XQAs@aoBJNxU{%F z*6FhSbw>J|@BS~=`}mvh{xj?S7X|L)TDJ3Zf%~@h^FQxN{o#Za`Kx^G+uF(BuO~f; z=OtA6p0~CCJg48g7?-X6Cj?cV=RK(fv?G6&=e|X2`6E2o+JPG;Upu*Y!#8=_v9%8@ z(Y+v_coO6V;LqF6KjFV% z`xYASC-~n+uY&OB@<~B_YJBxEJ~g`Jy|2Nk!T<YU3>kzeSrVpgS;^4{sX1K5j?r z_n+`wa9lP%&x@bD_$eT)cn&pR&d zzJ`Z_c=IHV!t;6WYva<|`5157{eOZdZ#!DQTKjq7%!{{=+t;4Y%g@^L8r}0guie+4 z&wD>F9zKRgYo{RmxpcudpbPm)hZt^fBke6%uZzoTAK(kISI`%mL5D(QEqT~$-ccWe zI~l(IKBQlMdopGI{3$G6^m+K~*~2FpNxTLH=O;b7^W#I_)!L?^tZdUleSFA5pIEb_ zPgt9%E%+YSV$m@>iBSH2FGepCca!_7Z%zypaS=+T?y8OPn?OG5224L2F*1$dGg5Vm) zI@*gt|CMF`h+x**r@RJy?lL)*;{-?9%CxV}NVyUSM4^9oKaw zU)sw(UtmBwUYPBJl|=)za8h?=wz#`|@#5vIg7{+=QaIQ*qT1yLqlV62_2waaq8eVwv}RbZ9GO>sB7r?TMnwQH}l zN25JZR|%%}J|mkE>u$7n#fnQE!-@@!y2DxPu6@#%x+8uTD)Pr%?qrAs*eY0t5REy8 zYT|{sF0P8_hHCFCvjNzfp33?YAFRXMLRKGCqMQqJ;%~pP`r-t-!gn*oG5MWQeuoeS ze7$1y%JK9BzG_J0MarU*ir-rtPV@5kmC@m}#6zMuX1#wV_dej4ZR*WfyI}UCM`{&w z!rHRdJGHGh6BJy756?^A9zm!*{G0Zq_LTKGWj(*CJtw`tSlsZPFJG!J6%>plkonE+ zG%mEs!j<*PCTp9t2*Uq~^q72YLJ4O%2KdhO#mW9ARAH>$KRi-;A}-v>2FPph5}yKE z7#RXK@%<`XSJ#K@j2v?g_#5!yQ6XnTMV&7$D1l1WRfKC;`v_+QC2?U*Zl~>+Qj|KD z;MBl%3w}TK@Yl5i|9F@ozJ~1grx$CM@$ip2knr(T9AGVQr_@Ql`h8`-N<0^R z*;W>TlMc2DOf8N)hDV0pfTf6xU(@82x4)eySc*C|8!6jG0>XV}#>dZ`6C1|@k0vD@ zD)ig;w~^Gm^MP{j#pyH8pRwi7#0hp3i5G?6imQnCcLZu`qB0fN9RVJoOCWn4z!{X# z;f`rQ-X16irnu`XUBW{X)Xfu)J`(*hGT1fN@^AJE{)x(LikQY%sgOYG0Cq{GeK@X5 z1fgxsXjI-|$^x0jmM!-7ozQzE64(F+;OH)nn(AO& z4ivEo=5|0XA1!+cZ!|h=!rCED)jfWkxr-rH9T6Lwku74Cc+skla|PZZxxqN*%RO01 z?66RRmN?3O(NDWBii&-Km{6!IE1nnwFuxoq!V2yCQvt#P?VC*Qi5)6*)t^=G&z!kU z9WzTQCbkSH$?mW43c1F=x$M%&f)NQ%^)J6f8TlBf>fWe~}^NnQkk zLv~SXeiw520K;>@0G&rWcd`wwiEV$dvaFn9uii@%FSd#o+w|e81Aj>npuQXbKD!;w zPpd9N{KR+}f@`Ge?6}_-a**<2Jarv_D-*u8`!Eyx9kjP_0`rq(v!jeog=dlW`y8;t zg;XCnUhPcK_)t;w#@=OSvY5=w@6~08zW(|UABuPJOax1HwT~%EGa-Z;fAuQ=_S)5} z*VMXK^=tCaTJ%XVEk^(g_30oZv8;V6(wdSRE*6_uK*ww;It|RsY?6NA+^+QV=hLAY zy|87bifr*c4$3);KDpyFG343vGpApmh%+{Nev|n*a=yy(122WcFiuZL*qVeL)Nj-9 zu*-%Y<9`4XzEK1)L-->M867Qnt{BeV=wft3zF_V?fGc+AEU+X4V6!*Zwbe}}Uyl|? zq3sLMXG;5|zd9;zj*9CJ*1r}0;oA0`?R!V*;5M7d%?*NBplaMmDwLPP0YZV61=c-E zH#}sb4GHD$`0=8``0>p8_vQHU%E58tvTtk(3)|Fd>88-oO`&XxyjUhL)RS}(D)#36 zs^OHlxGDN-aUXQ89l!X(p|$w1wkl`S;^L<9Dr*^Q?eN7Hj;)z4uA2JGxN$BC2?>TE zyoqLbW4#vty?F88{PB{%7BBv5iF_Be&HmsPD!`EZ<;eE2H ze5OVY`&*MaG`F~s=9VUFXfENJ<_^~#!`nqeS2=ee)i67tPmagNvgI*`u5+`h8@j%S zRrgt4$aOn7iPecgrHLUR1lq{` z-Xy<=;US-hVaw?eaUKu-%QNcQe}5)BD&I4J#e;a-2f>lc)juW9sh=J^fwwk1hV2Lo z3%krkn)ngyXfj)NjvP7i^PZn6l@=?3V%eE95~ul|#SQ@(LO9=q znelLuo<$8EP?&)Y#lztHoq*G<1nNwVJSUHH0`R>A^(pPhCUN8L+RM?!M3E-z6JIDW$cDRn&xth42ox8IeE7pI-B)*tLlMq*{ zvKrU9+a2rky3YJB=tIK&$ItVwInTooruL~O1ntAq9v`>{7|l&|hdh@1@dqw6tu-zZ zflCy&#G`Ea?L17aCEM60I!n2Nl>)P_u8A~Q_mI58?k~`fs8m0tjkS`&#sR5&R%~wY zC1h{DVg^yKo~tb&t*X~tj;5e9S{a@Kwn~s&;4}Qs!#GnP8pIoz{Wvtp{Dk_P0 zDUOvwVsY50Zmojm&CQM;HF|XTh~X1ZJfTCURSB%Sisd=!lXG#xrDo+p(ev-djCXXb z@J)>pC4z&O%noX~mi?UFk~9m`)ex=p>4rqqu0TWytr2DLuIwAj#k^hHG=iV34?#1K zzYHDKt#uG8oOJ5eJ-pT4-YMO>ckHlw9h;%1%CZs5$B*Bpe8KKYAb$Ma!O`QJ8r}e5 zW^l_S_J_I!B_!5g<>9CvAx>-us==!(VS~}S%*eaH8X@o_3`)b+jnQv*sfh#1T`Gx*PveA{tISJXw)pY_1rE& zts1ruZr$SM^NDPSTj!7oUq?rm^vtN@wL>C!bbJscfgKUs2| z;2|C30iLHBO0t1o=52hksKk;)cT{s&DXy(l-^j6Gy{GgAuNrloF&0@}v=D;4U|Se@Y?FLsG-WScKqS7{t;wM{X{cr+GiO3A<2OT--2*PqZxN+6Jq-O7fuFD;RT0Ru7=z1JF5N8HowqLGpkDJX-CV1?`bn0~^D87C*q*|P zXydd+o6?Eab&)|-uOvR>(Zk$z-5@)ZE6H8msb{LO!F%ZI4t2PXbvf5cmMyUqLG6;` zn~of_t@kE71zIe*i#`@TB&jaGbG0M9!Pfyl80N4GjD6sZsxG)&4RNq4R=7Z1?jjy2 z+*&az8M&gRSO<}YwfU3e=9Sd1Y-p?^M!k5!7CuA3SJ|{lS49tzDAtP}SG$hT(5ZM7 zSQ-EZ!tG(;me#@WDWEU{Lh+>K`$=rNx%%ftWA6Gv|J!ZK;-65XtX=2H8#e6EgFg0o z--%*^hGTYRR(#xSI05t%Y|Dmq^*c13lMiP{j;IH$SY|pXasA5^s}VyfX;~wVU3;x8$nGibikr+g zT1*2Aqea3)f8fE3BBeb(Id*Rsdu!+$I@Gu=4=$8|M$0y=&pYlrw;?tYl9KAKA0WhA zZT$BZ4b96P*&lS7>(^&);S;hp?C2ZG+vW2OU`=X-2LsR*1!WX>NAh`Svr7(hk2Zza zB~>#_(paI5HWcHwGEodaS`uA&ZCBfRX!FF04}bSokb?u_BJii^Z2Vr*tGJ{W1-M#uXh1*? z?c`ut^Crz24?7VT=;>M2K4-)m*t#QK)jss_TEWF&7vx5p=9FAgkt?n79_R8|RFg z^cvRrw5Noa)|FB>jDT)f3SKiRHDp zc5G1(QpF>62UR=Lf4ha?fzL=!`;DaMFpUGGqT848hzfr3RK-gTZLL;H=I`m*R1lSF zE5SC`o;BO2ZM~L+Vj$yGLr``i$7Urx*Ai`dqD{lmf>^z(U`v1Sc5yk?Ez#{DhX z-IDd~x8V6fXczUEtTAhZ6a0_(M*pO9=aSBzH9CohTe8yh9kzhS3xmf`0l&^zfnx`g z!S_HGG^ZFmghbinPR68;T4c<-GhW z_CSmp73QFX*oTeG-dcFzD7J9aK*Q^+`^2NAA`>2@Z&{P2tjxZvTei%;d2_aKdcS7N zmNgio28RxGb%y`Q0yxN~0vysLfvN%=&|R*Sw?r9C5)d-8_^jI#BOQ0879KwF_V+Qv z3#adPjEebwR_j{DxNosqt>e@arlzfD&uZONKOtfAg{6NkUAGQz7bYhpj0~AEEo8Lt zNa;6nR6oMAjMXa~4qTK(WPeo+7q0m=CctrbgWayraeU{|o;QJ%N^a#U>E@AM7&&J({v0T4)xkeut6z8H z22I&&>Ls}$uGO#mcB#l_`lV?5Ll%5HRlzeR^6u#DPy)!##f@rz`8bn7hQdHFXDt*C z4C76iwpzSfy_%U+`;=|I>xUkA^5nqK^}dfEZ$qlq>SxcyfM=rLQvI*VQ4!*>`dS>0 zh!W?QE?$f=RKZ?I5zIf0GqqB9(q$ygXG{soGSy6MA0MrZi`mSQFpTHVQH0N{V`V>9 z+}W>Q^ZE@&bX``~T9VIjgLe4U?YwL8a`pTyZpBx+1_e)A(W(v&R^qM-{y$`ygy4GIqcH8XV1=wMg=TiQI<7n^2PK=-D@4}%HxycpzJ+5Ypl3?X_k<=(QysF(75E?Waq@j6ucl{F$zv_CYXu*u2bPhhXe zO=;@8e%SsePxcR6@0*m8l7#5)^WcUxYjB2QR0Ip;b}TRgiC<2j`BLn555V5l>Sy_Q z*hE>s@O9DN6Ge&>W1%}*7+WPQaq#@9qHo5H8;>cPgDNoUE$Wr!?DJ&^a9kSvK(u%$ z(hS9O`B%#SJp79V2MKFGO_}BLaSs2A$ZaVp+a5p8;o%(qt*oXQFG-^|A-Kw8Z>fK-T`@NV; zBc*Hy1+gS|CKqk4Q^Hx3j{4P6MCK>DG-8KV=m% zP5IB9CXEGFwbU+r9Qw8B7uJZaT}!@pY1ys(**Id~3YN#q!MBKKiz5<_-(ZEPXk*ro z#v*BbqF$j%*gUt<)@r>O@e1&YgU^?;Ant*jVY%NQ`Ms)gug&4REf}jCE|0^x#3jpf4Njn9u#Q z8T+xi;xIF~)_YzkTWnB=O&pbQ{w$w;1SF9(IcjJQSfpJ;K4fynk;%314ezuwHujCW z1JToRrE!BcAE^K!{f_Emj+67AW+VOP6BwU4(^emoyh^B>^NRKuZEhufxI{P8DX@Ry zz!zA#Ai>fP`Nu{xovn@|@_hXe#vy$sQrar0$u0d#{`w$z`F`w=b9+wio>HNeXB3NM zb!Pk))#uTqH%7TQs{B79P6> zTV1QBh_FjzV?96(1$?vwWAemGqc&jCbeEqCgg$DW(!xUn%F{1L#6h;23>rkTsvn>v zzmD?DlV7{U2L&x|xp|Y%hGAb1uUk5_OtkUg*TXjWB+V|fd7FCIp<>HfvsZm?U!~=o zSu5EBq(ZzXQ+Cgnm5vW*QM@|yQiHe_ii-g z?wK;Q^$)%T4@ujb{0rnIgvIRY;c9@@YywGuK@W>F9EDU`bTD_Zi1JLl67^1GEb!dL zN<@P1WRcOBlT&u8r`g{vM0+;KXG){!AuFtHdx7^p**2X?jkc{7NJH4+vSI{Vcw0a& zVt~vLYAZ(CV@vN9qAMHJKwNw69a%S`&s?(e0Jk9=d`E3#-eO#YKF{ zv2mi|X9;|8uG0I0hOLcjdfFd$1NsD6CE=V=&=qA=i9mJ0vE7>3&nOeOy-?MfDDn#K z?a2pZ;wYV=AO@cS-eu#u#ny+$1RjRT70E$ur`VLnqD z^JW9OU;n%J5e>;!dj+TI{#ClM zWzlLjyR7IbG2pv>tbL^t%3cTibD6$Ndnafkughnq^^G);c%yl%UxImy$iJK#i7u|h zewY!`7fWtnIeUCPEfxcc5|W7~rLk5Rap3A;_N%8j(zbep$Wp^^*{UIS5yd@Oqo!YW z&s!6*PdWR2Q^s0qqAKG3>N#Z)9rsQdTfS^x+c+ z!xtMnVBwDAlxssN$cE}Hw116e`!-95er3u;COUH62&_so4EHf-u;YjoB61_hZqOPb zgT)oMu8d?GMudlt5aA=k!tmK}f6}B$J=Ilgu^7Pz_Ut)%GTKsf4fsNRKY0d)Me|P+ zUziNe?vh^C1QQF%JS)XqrGHiKp-b~x5v*66F8xjHu5dGr>Q{F}K+Q3Ad(5lqHMZ@% z`1pBk$9jG_v;CAcYP)T{BSJbx=)VYwis)9>d%&nN;ozE3hTo{(i|sJ49eoaOu$+UWZ5$2*VE1^EsPGteJ=5u^(tPVtVw zlYKi`j||phm-vs^F1|v)5A-@zjxYDVvhp^&5Yb2emJKuwrujw@dHXUlOoQL9(7vmO zIF^2Bw;1#ac{M0MN&DxcEMa9)XqS~dAkv>8JnP|knC8z8vJQ_=8tkad?)%DAa+k{O zq5<@iroYTP%DrD5St7in=*hO|FGH>}-DD+!kHvSez;INGkMr@y?0N+yVI&K}*Z4k? zNAoy*PZQXT+(RE8_l58aWv`p-FRN?2@K`+48R16T@;$SysIUxVYA5~W?5IHHKAve0 zgs0|vCbfttJB;)0s9sV%z~Ej0791qNjM?gwT^q0e0S zd*t*vC8vGBVQoJh_d2q}8XVbC8XV|zth@&}=w5!@qv|w`Gqt-ahOvj(kaiEqs!n!f zE`Gvu`pktNaM;F~(>{J-?K2(sI_glXhvw zUEHU-CzQ)enQC;R1m)vWO_Bio62DMrHX$xezVO+ZKGVJb@}1Gry?b|cKb-yc?3KE| zyL=OCKXFs>;BD01Y9PHEibX}epBojW-RmC}rKZwte)wM>`G06UrFd6$JH~@|Lka76 ze8?|A)r&|LG%HGCv7PW_@_5oHMSM`zFqI?r!#e*v8O4_#!jbMW>t< zokbJBz4ejpT1Yh7%-9jWalLwJ9dt_o)jibRp>!mn=(F_Ie6%` z1_PY!(7c_8k3Wn~xvG}Zdimon~wZg$5UC*URE=!eE3J3?JHr1`qLA-q+u z3`2b3Ddx|=JU+I=teBq^slaDZ+q(Ar|JGS~xfAnCV65HVvfB1sCZ+BsH z*$lv___U-QqE4=^JOXnX>*o$7GKilx#?C76ZFQ#A4ri;ny3bK>p zMKkgK3A@9tvhm_KwTgO#H{pX(?(pdk>I<4bpd*m54&$dd2Rp@#aBVxJ0Kgq@=F}mm zn6O~?io4?Ny1gse9yXh2iTPpzYr=2>3!5yai@u_x*v-ZxnkKI$)M1Royi3Z!bBU<%5qSW@5rgdCwsHIKX|}SiPG#3B>vn*>^=(|$LemM zmcHs>=3w!6RHT5@$O?BM6X5oPjp>iN;o8i=c0NrGCk({T&jIrh_OP8;a`7_ZS&UYOb^!J(AKVCF?;rf|bjM>@~ zW&Er%>O09}v_!J^w8;7E=1Ay;=kL2RM`CDGSt;QmMB2JjO3j*-)0l2p{> z6h2}nue`G}u!Jh1&)1BC53lGZa7jm2ja?Rg@oOiu13ZPb4TjW8Wr5vA9v|%#2JX$*+WFVq5KwRY)1`iKpMOI)7Z;`sx}hdtCg@mYo?idK-)9 zC%`th;hPGE`s3EqY_N5n#XP3D9>(}Z%jn-DZLD-Y>7M0^A?lggb z!f$>)PN@85a)HPR6SW=ol*G97iQo2nA?BQ7A=jR;TOOi1ySHbLIL;b0IaVd3!OqPi z{#?EI$KB(HpbII_?ki`F$7LjjorjyfkDPG^y|bN%pWfo{;pd@zCxS%#6u7CJa2jqs z^>;RoaWO~1QB|TC=Plt7ZmX~3J?^HM#CP+HJHxh3*XEb82Jl6)1%es~^Ru&HLTd=K z-9ea)a|Ijn)r;HL?FGwnHg9QS`>1RBslv zkOgybOKgJB@e+GiiQ{4&z)KvKrV_u%O^Q%ro};rxQh%jUM_37*ho_jswE&UFfhIL{4)H z61f~{p{{qpU7fp|4tG&#>E_tBoE`rD*1_X5>>ai{%(Q349-t`e8*xtjD4wRCGHk2% zdXG4=R?KB%V_Cxt?2csrrr19V>?ua?5*b&7C%bur1?^;uurOe{DjyywndqPR!2w#p zsvqnz#a)3|xqGXrN#zIwu4?Oj_Sa|S8Dr_I`4WdEGbb+y42@;2*h}>f92i*@DBR8b zl)Ybd!XZ+v7dozAzh2DN=B?og`Y9~!dSY-&i?U}QQJ0>qoo^jFnqCmw0Qa;TF*qiP~^C5W21Mb zA@hv&&Yq}$jXc`lmTNe~83G&R$XtLo1j#{`b4vZQcW`jUeD<_zYaCDFq}P|`_gIk+ z!cRQq{f>`k2jbSnD?5&~e~D6hTbapVN?SMq=c+!Gxpl+XI`$>2Cl>rEB60I~#)_q8 zZSHeo+Omb6=H}paJ?0fz9U5LiN2@-Bkps%r7_yJ5^f92aEe`nFyK2@NZep9;iDBKu za5hN&lh~-KlAeB|`-38t#mI4)@NCUY$Td4yxz&`-YNqzX(!9akqP~J3#)!f^~ zoiTOAnsuutA!||8McwF)SrDZ!C$2J#XSI(US-&ALa6`OE3}M24ta^u+60_Lw1*}7O z4uAXx9F~??M8!E&og;p<&Oe26DcyZg9omOE`Je=QdF9trH5U(WLle>OKqE@f?Q~8o zWg|Pe?=AO(TK9)z^{4!3=r0Z~0-kf`BsiPEOyZTPcuhX|J4O5F(A z?vKSzZSnK+7-TsX+C)pL&C4c0uP)s(HuTzK+C>5erW^VV#A{Gqz;(&lz?M$CJz4lcIfa^`{smoJYIs|OC`&U5)%Hf9cs6+v7t z60knpGjlxK7keO4B*#aznX|I_5cD?)W4vnIO}ZH7s8tC{8^Rk4Da|%TfISM8nq6FJ z@qtMpT5V?btjL(PYa_Eg_GYmfMvIo#*FW=z`8_D)L_ zSGRWTH+gE$&JRQzpjPsGDAv8CM`$~dR&J7Big$p`$hNmrXp7ilHd@#hsO$SVbmQBU zZ))-PY&Y8@D&9(09sl0NuZrk# z+ZlRUsA8CVEu*b=#_8xWyy*)%Ej$}(_g|IBTFqG9)U#BU3#2u8HT8(LU z{o0R+Ds_ryCAXxqajw6zCC=*6#NpyM_!oIx}oR5%CB6Os)!_E?x{=He=zbW!a&joQ*wo@`0F|l%UhrX)S<5 zI*-c({kc~l9Qt8w?)JX!ZkkL5D!_>+m5}W#u;6!8A2ZHMBCGFjeu$>u zf7olbm+hWBc{2ZrBbDp=pGt3Zz5Y?w597ojb{^H4!&w7%M@(LmDb5}soJxIQoQ&}n zp}c=ad%$j3o}utQ#EAvy_4D>a@37?Y+1U+C5`SsY=^dO6H%G08$%fGv*(QQUE)bz_ z#oI~q;pAw|viJWyVZbwdp&ZBm94M|cHdFm^PNEpJ;ZJ28v&5fJMfz6um&(|C zcKbFH-yQ`{aHfJh6NGSL21MFPFdnXS1dO@7ff)@bW3H8qr-K3HNfh-(wc>T0`}AdY zaqM!@M#ZOg_@Lt!oW0TMP)G4}ZKh`I&B=-V(syx@!aW1T zL9rwC*iYNLDQgGytM-C5W=Ctb9=)sP_{B@-Er?;Iu4jG0Iv9LQ_Sz^`6)8evft+Y# zEDH>~K$l>}lw(!F`tyY0hb_Nvcq#P>Um#|QIp+0lKipzs<9431!&r7@wwtKQGB007 zQTDn&iXT&H6H2kRSrea3lo^fP3YpjWiI%zj{{3PDDwnSNsPUR-ah`D9kDJF1h=dtF zF$ch0Qd-6|4@eW`!pvwW){d1n1zT6U(vVnht#>$$3XFnhtmGa5K${C1juvV-Vo+|M z7zulQ?Rh-^qF_hHh2m|tXTj!eI5HK_#gSq*eH#1hb<%}-b0rB@7i`{CT)Z8>GJD%c z9mqMX!95-}9j%YKo8ki=49HR2xya(T?A2HH16<ufoc&L4MW@+We<-|*?qG@3|!5l!6wfhPI7%gP~4%E#T=Nb|16KXnNF zVM2z3K6D~Dv?F=FXbB^IUYIpBO_cEY@iTsWGCctYj<6}}WI4J(@h47tcE?`gQZX1F z#e4AO7Ud;a=1L5M=px&V`p0&G$NcSz+h?CI=hWwiR=M@hJ*&5^aMh zB_O{{C45BvFEjuv{WA>e{^${a|7`qS>pqeocdyDI%M7Ggi7$2hNz-iHo})0kKaa`mZSO(zreKcSO9 z**o{Ma@v0dfRy$74*wMd=xqsusjif@pUFDPdDtwkPW>b#*J-k`i2nf`LyE>}@7nw~ zh`1Feq+4i47St`Dq6IH={N4&){J+tHv`y6i(l6r70U=N zEp-<$R|w}alt}E>jMk_+{H?z|T$wsHxcF~bbva2aq=(VKHp_EuJ zujokp1#Zy~_9n14ke`H z#elE)4sG~tN|>9EUI*0h!88CXZj_ZtC>LzSLP%*x3xRJNjtxm1qmguwFvz_EnQ)=u zyTG{ebZ_fAAz2PGKUH#iP02f8TbEjY`jZ$l@=X{;^unu+C76xqG;X+iG-k+KF2wA| zzjJr*QMS9eJn-43O>(K^wyju*NGV^wUvl!%pr9Cicx1E}{)^74Cz&9mbLWmn+AL8w z%(GbH+O?%ravE*eXwT57qg%zwf9`jY^HXR#YDQ&xC( z>&C4b^snXjWtCYqcdi;T>_nH2T_SpR>(*s-g9cT+Hq?p>Y}&KW=7!A-9Xl+a+%<#- z;$FUAN(u%tethK`_3GECh6u>Y_D+>7T^f2+aQ~w6+Ia~*de}Q41hQnQDqpq__A*y0 zR-t9^^rSYOKPyviPFOD%-g9oNe8X+isIoV!QN1BTwI25c2K43kZ;p(36($&>nu|A5}JKN8d2ZfT5o140K>#(77;`L(k{Pr!{5A4^j z-Iy_~xl@foHI7_A)A@5hmd1t-lX<)w`lszxGCbU~mm*j9^)uF2Y^3B}wyZ+w(2mPy zH13iAK%EcH$-XbgC1qTK=qz#W_dmiZBS2{`*m5@h5yY(& zKD|c^{{J`V)I=m*JV$VKqLziB+4s4yk?({^FQpEUWn+k3OaUS)Bd!IjS~-Sri87jC z6QzlGH#;O)QQGty$WoC2l1u2bM@4)NceHLJ-i;ZfWN2g-tu!3wA#GOUO}uk1Q-p#IBp96nGw~ju!gA*I@UJvZAHu1>M<#0 zkXZgMO&^}!e)I6(>yG(b+#Hp$bK20RmR$-$6*1qStCyfXH(X%FNUcaN^+#=d?El~o zA^880_a1;%6kY%D&h9OgKzbpeq~4p5-f4kA0t5(z8hQ^s^nmmxihziKfLK7IND;9i z#@>5xXsdFl_zXo9qk4?bG*;%MA+39k+M7 z9XYLf&f2~2zJ0rA^}McQ(Yz%$Etyx;QEeNt+)NOnU_j7xDMTDEcBp>$h#}4Xh4de> zKrY^BgK4DU$8swp?#!^l#!f__DFl`ni_m!?*~C2eWhE~R8jU&Ews*MD?~ zJYjp1Ts2|C%)A6&C!Fx4Qc9(hG5%0^@tT?TaPga+PcBIngX}+uL08{CH(@(kqVy=O zIcJOqJ=ks%s-bA#&=n>e+R3KknhnLufHPVTHIM8vtw09nb@JP(U9zVAb&Mq||5mmrx(= zOsDO@CSdgsflh6B`2t$rRVk-*-LJII;Q_TMUD?^RiL{*$X#MWG`p$UuP~kMZ#@Y!N z1zRh8k5$PO^e&Vobg|OZ?c%7`!P!0M^_Ks5WXP6DLo$+r zTOkzLOD>k|cee`8!5iZ9$k5G`homP#_JP|H*~ipHycPFWq>E>2OyK2qR$d|dm}B+j zp-d)fev*C2B&374gl2(i=FoKE)fyA>dZS$Ij&ig^OK`6Nq{XTIG;yiN_LXv7`_Jgw zPs7b=`t~ifUG%Gz>)_9*rG2Hmmi9AhXtjV&dNFbpb{ov^K2a14CPd7(DL@ux1f*Keum)(ysxc& zyfxhCq5TZf+PKU^`x&IY;Y+l?P4+R|DNSemeN?y??T=;f)AA~%e3GylZW$~r+K${^ z`awz+EJ3$2IMd0gnohhN^=bKjeYvjv6l_UpY_TxSf>l^@x0;MTqi?J_c+X<_!_Ei0JUsrIyN+KM**Z=BF1dM! zG2#LHxA}p_wqmQm7)zIuE4pNjZ$C10S#h_1mMNs=mT?oVS<@?eaL?TEl-|9_s=OgF zQCD;%Igg%iAK$V~WSqT6cx%6^u*8IA`E0CUew;^P4|<=`1Uk^*!=682ykxkU6TzDy z(kx)daAZ31kl7FAmLSZt&;{%*9b>dTRu20MGt7`__=lGpd{{Z`FRffyVn1wJ#M)06 zuazs&{wus+`(dSh%*1G)y`}BgKUUgDS(%CYacxF zL%Ai0x6j@>;HTxh{S=|lbf*J;TF%>7%7u;cLxyL>pV01m=$GKx$9SFCo9!6}M^&DJ z$F&K9VQPF>P;y#M!IJ#;(%|wBM-81dO+J-)FzKNog@gMZFKjnP>^*tX;BNU)hI z)GH!x4w-uIw#^UzkR2A3_SLinRj+}*91dd$9TUi35y#1_Jep2+bb z4VgnW)I4FhQThh$o&uhduwHIuI3V7QICr9e*&~i#KgvRoaa__vGSf1%kwcsY`H+VR z=XH_62WNB-HS&MMfp zAZxFWnc`RTgfyPQ8}tpAKe?4u26#f9_R}LK_{%F8m3C4xA9P`^f_EV@&b<3-?Jm_23 za@1c0{;jL|Q|=CU@SUT+uAF|y%f%m!S&sI1VAhLJ>(g?jeO)=)hpyxB&^g_q>t1C# zkinyt3rlRWF0&?oIXdobvME3mK{r+cdY)zQs5Yl&Tf+7PJgUv9+JxNl zBvel@8x{FH;!Je^9*rtuqgxPZ)pOgB$kEoMyGl!|lG0~?^bw2|R$uG^n={C@zB0l{ ztKOUWXG!s+)2D7yKc1bQR7JLo_}F@Xz;&Bm`xi*y(KeduF+htVD6(f zvn6P#RxS|RYbFD#&7*#{f3yL&MaO2oEzf@IeX{oz(|a>!t+`?eszV>(6quB))XUB= zAgOBXD`fBcZ^^Sw@7=WIiZ!!luzL1ICQ!m`Mf^qZw_*ywY8_NY3|+y%5DGP{Z&PHA z8k5$;xI>yg?ZnVd86~D7F}Gzvi`cZjoBH=_-6~S;ua$V6(oQJTKXk&O*OXuyvRHXL zBQx_2T01}Rc9I4-+5vschDXI<(@l`viW2|)f& zGKXc0)Ga_DZ;$~DDp<01Sjk_Q~OZ4PZ82p_Xwt zs9m6xnJ7FAjz<79g=3j>U6fgsGDltcTl94bb(d>(QI;Z9p)M~|>el>ecn#a}|3KXp zT3z@GDJZilWoo;@hA%|PY(m|Y&UH~{QRv3r0N!1~2=PtnGmLe3uNW&&pv~UqE79hv znk@1x%11brTY|1(bZ2kz{S?r6PqWUbzgl0PmWzcbSL?I4s?IPx#OlB7rehv*=#14h zcuU)dAGrs%fYrFB2BTSphn9IT4H zY4{(?*_ZL>3!v zubxAdz&IEp48}^umrfSXFndGwr7M{)t@?88Ez@7`Ir-Ab!mG}DLGg8!a$$ANi&6pe zIbr)UUvUBJcLOHPpHOZI`kK-JmULHXBZY_huCPgApNLDvEx=8Ihx)E4SK(oA6`DOG zeT#C+5vHf4p}bt|&dRg(<-C0cPpW(S6duKQWpCB?b-rt=Fj{M$mGkzMa-HvyEI#VN zcd}5Q3~(mH^M8}m)5&*ACZ|+-I{7wAxubpN^MU88&xfc#&2mq58te#WL5EVs;STJ`J9OVot70Cm{8Rt=cZO; zZ<}}pP~&rx^dtPr_IRM+SkNn7-3+B!vgv=y{Du^i@__NhmHl`0EZlMPw=Wi!?CEu7 z!ArXqk9oaf!psq3yU@@;KeMUIOk%R8+!U5IrPun1!Bs_FW|unpVKjne4Q~OBJIqT) z0$o438W>{tZ(r=vD>-7q^lpP5Ul^O+Jx?#y7EO>JCtsY|5h}m&mdlg$gP|C5&wX+5RgEzis#rPq#g%el0ref>Q!<|s z{Khl$F(Vmm>F!;&6vbFiDa)hgY;7ise4lye8zcMo>yN>|bmPe3k0vCH8$YwSU5A@H zn8h9|_6^#6^^$(WlBzbWi!xiPIyO&V5YZ8Oi1*2HA~as)>aSX;A4z4Hz6DOyhHHtm zP0Wu3{~x4&B%Z?nBZW{k`b9I&VIT!6ESoH`^T7zIc`wV@f+b6m^S(qD+y4^(ho6sZ zCR!G>pD{40s=Ivls=Za~w!Gb?h{jr2AJR$ag=8@UdcetNMY-y;vbRjH`7}#se#m6N z3LjMVX`YW~#Pj1q06-=)y6M3Q$85~W$3%yZA&?Vt!(3H|OIyo zkOQc>v|)DlAV>H8Y6p|i75f4y|C^;VnNBrKWAX#J;N{Kp**HDMWSYID;}rCr&&n~Y zLe^8oe#}2WxoHh6$Ly<>v-T6kGmy)vD95=b^!E*(y9xcU8b|eVHfMvoMA1X!CP);< z1=93Fvgqkwl_*w|MAbIsDAlCKxBrPwjV~zqz)7;k4c%#N7jqM7)jW2_{K;444_+|x zu%%V&-2MeimX2@puwUk_r!>E9lcDX57tO5dGrEmTulqSUhvmp@S#M8MRCMD;;C< zwooZtG$?Fv#?`|&_lU9<{%~aOG8Gon5Wtd1C6Cd$uI}|@b%MK_%@Zior`)ZOamn~L zRj+E0djx4fkwP#Hcz~$LULx0BhE+`VAR|io*GzYvKtjle28asd7ba1Lk?3NXQV%7DYyS z00tj=PRyyBKza-gT1f-QBnql@qWRlq+t2^<%U#d?Gqn4x35V}G>1bHqsqdHx0GGw{ z8m_KQ>lp3?gm}h&&e6$Hi;r(^KZfbUa(g`}`VKu{3LdJo$GjxXWAik(t7$pqfhFj1 z&MW#>;Vq?$B?#UP<+-@dQBLu&1U;!Q7iM8D?PBN%y+R#hkv~hVvBMcoB4O4Y-%80t zOH{{Tmj^cosAT{fkmO`xKaHWw=Ksl8Z5w?gH*dkn4@WE-nmIi0j)B*2`1!wE<0g@A z$DgtBBd6Ps6a`l=W1tfKf)-6CBJ{9=)VN{fWB4(R=&G=9buq-N}i5M5vjo5D(- zxcB7j(#c)3V@KviwDcW6zII&%%4;!P5{)mTxzho%%KH~%U&iO*^xaT>) z$Qsp-lXjxMCFljE9A9z1OIw+J_o7n1oYv=SMMn6Pp~=Q^u4_@WzOojDw`%+152&xM zMJ1Cp+FBI8SJ$GF$#%9DHA(Jk^kMC%h<4Wg^$f2`a!XU7fuMe81`p!B(i{$_(mq}B zrhb`jt&6o!SB7bM8`eIL8&V$>@j|M5YF;wMLXM;84U&W!{8S1#%N)ijoh<)YC0kvU&P-hWSGct=mVn4e)E>J8E7>Ys*nB!o%C+NM+m9lp&VH>IJZ} z+K+l}Kz5g;aVaqosT2C)NaOw7H(t30xNsS#YXQ(;REYvMDq}9|6oG7eC$jQTNQt0uKpxl2FB@o#!(^OG;S$!#FB`AMGe&(J+wMlk zx9V-c?xbru7MiAjkNX_yXrH^1s5v~Xk6)X)XO|Bg-5tpgI^WfGPi)Vkskii7^Oa#X zCvs*={QbS6L&lPTE#nq1Uen7jI-AphY(#&EVX!-fl}IS=L)$p0Xe+f8lI|jlADA|d z#zGCdRoaP5@QqU}RAVrWymYV-vF5-2C@hRW(z@B;L2U4Ah_75E;$9CGD=${g68PsuTD|6QLDQQ)G(;ph#Y53@>?Spy;WcMCm zN$55?j`jDZp&R;Zr|4z1KRRBOn5;V2YW*rvTiW&NXL#4~R@(RQo?Vao8k3_Y6)rg- z_hv8{f^aG(EiPFBBQ}P@(QeqG^zKPj&r?tW11NE#01cH>w$8+DD&!oc{@{B`Io5Z? z$Dw~aflhROHHj9k*T^KqgP>=HSLr-W<3)Ki0&<$ETGfRb_VQ+Rr!brhC>FB2zD2x0!%-8(-{f z&qL23HaE4oVm0%*7u|(guwPE6X{k71M>aDEm_G>VCFPMFVp<1fbwP2!=c#?-Tl*y> z_Kq)l`MEP)d}4d;U%I7y<4SRcaa2p+)T9Nz=Jw&FRYZPKUP@e6a$-#TxTV*$oYi|! z{_tUAnp;~xQuyG1KFjJnBX41OLKP{Dv+kPJIxwZ6eN?wWy{U`>c4du;(u~gL91IqQ z(u_a46h@(>WRqgD)x|J~4oUa7l+K{bVF#O4Os-hfz2h#D!xq9;;j!6%QV?BGP&}j5 zQdK;Lt%Q*lYv>Bt{PL>u`HKps&RIvARaGr1!W!6^V#;f_1|?n%o?wFx7nZFbx`+ZK`pC_I}dK35Zuv9c|aQ?rjOe;407kRF2mv$znB8CzJ#@NBh6re|EO^BA*Za5bCpElq9B8i z&dcl4XG2NH@QC=-q5%<>StX0xb?7i-+T_rvRta5uiPH4N&kvq(WR`pm3+ubP-9EJU z)lr#IiLIK&cg^eBZ9;3))z4QQJ81HcNsDN|a!To>4n7Gph-u%LG5Zz`>d?%WjTQL1 zY%K{fTk@>z1Ny3QZXacBOeuG)jWu9x34AN4`9Yd!`VnLLPw>rbT!rigNxa-JftCN| zRQ@fkZ@$A(f3;E{<%S8YoYz;%g<#0RM9d#*`)lO?F}zTY_Gvk<&&t7*0cd{`%0n<7 z5uaovr+Zb|re%yzq0nAjz2zpK5E4yhCE?nEc+w2cGTJ`SF52^G2sn$R1s~VcJa;Z+d3)D`Ok%<1|CF3Y36mT*eg` zC5<8H-XiDr9=E@C{0H*L=@{b!=LhAJzvLF;QE?TZKT-3ebjtJ22Ni2_WLVVe0|-5I|Geba`3vmPBX8g@Dd8IbhYt!nupnlT#T?8gY138M;F;2 z5&O22nn}&p+OM#)IJii2QcDMn@4yERX4!Y?-PE{29NB1cv3b(ZYOz>P48i@-*M~HZ z$w01*FNZwxVAtk;N4_z>vuwpb)8r{@tL}Na+0^&QigCwwfIPH++Gf7-H)bEv9q8sb zO<6X4fRJYjtQMD?x{Ck!-uHihkV)a5yaQ6CAov7y|Ee@{qZwr|Cy zauRuu{-yc9rQS$E9(zKL0bE956Xf7L=;{kAt_@ZWXek2fk+BxsOOq2DX$T1*IRUv* zl7AF_!=VuoO;v(V^Sb#{Xdj*^?peSev`@gb6EnpE zQbYbGe=oN0kz2^k?LPr3r10pBL`bRY?8C$q`#a>P>SEr8@g20$jJJUn)bA_odmP{4 z8&=;)d1(CI!9$uC8gdfl4~jEh;vfG&`dmtm0l6OMpAnJU&t@dYD#<QpZE%ip; z^CRtz1=X=9iT9pVohq4Z*D zg2@-T0#FWJ_McO9SoD{c{q7!Fk zuLio4e_FPD^^ChM9gW|~-`KXv{}~i3k2Ag>WShTu(VqR~qYR+krkdZ7YyK?sFPlRk z_EbE}Nmtz8EH0L>WxrG`HWVY5Q>FanI^=enfdBTd!?$Cwr*1XyHsf39FJy1ZHLS{z zCsoQrGYngf?XKQtxM$xn3M$ighHmJG)(xc^3mM5@uCRw=9G+cgd&Q1Bd+g&FJa8-- zEdft18!CXwDu&1lH<8(7_BF_~w*49$Y2LF*{87AP3T49-`*{1PDPo!ZmMQ29@(H-6 zfscVWodYW$aY`_NE}dc@4%ggfe`H^ynp;9*E#~uzFIDcV*s){rP0Bx|g;S;!o?|~> z4_|jXd8u+;_-n7>H@P!@lQ!AYLW|2uM)?4Hk@$9K@w^-N%qymNf+oh59De8$V8Hc> z)V0$7%wqC-CDjklh<}J{*2x0-N^VEh#0EB|ewBI~9|3*X9fXh~gy2FlVsXTaLQWCL ziKLSbT~ZL0x8fc1Z<#;;7UKV={Mnl`I;N+0obe`!R(`AG?;?+{TzPzD`ZwQ@UW-#B z+NLZb1>bxlKdJow9DA$C)@qEQ7F1KvbZr?(UTTQ(_s7W{dfd=_;);q-5cYfRx07#G z?zAKt-w!v37c z4)jIo+y-Qrio$wC(;#t`!!R$K~ zb^0jpy5L<4{*Fw+JA6;NDDS%QceFm~#@j?4tv}^E^uzj7-+>pO7>hV8hIN94w#lE! zI^KiC+Hk4IU`Gv(0|M=|Uy7SrkHRlw4+(7#?W*<73}o-+g)WJNL+NM{U*~iF9p`@|ohU zYgeJ76TKOhI-V%J=3lzDiME_!U|74;oAyatP-V?PM=Phlo{moNp$?Z|cY4=W4=p<5 zqTuT?5;!D!TqrE)k5Nz(9CT+rd#I?;p2 zI?DMm$8ztb2j^0$hYpus* z7d<*!tdHKTF8V;Lwb7fk$@qeLsBfaZd!jdo3VrkT>f*JEx6&e@ysgeQIsT^F>nV7u z__LZGU{w1B7bzX-S0vIyJtjK@W0q<Xbm;V_svl|1#W(2wKHTJ#K~ zQjfI@y`t3gNJri$m&&^90Z(NV)KyRI)2T&0E|jw3ZS~tHN|e=)jH&hLzp4(U z9Q0(Lxc7|~JCNQmYaOnQjgIGusDqcr@j^H)Cr@G-gVSd>FuBo`nk;my;b>F z>1m>EdQ}f_c&bP7aiTZsftsG`s$&Z^7-v{b4{dU}Rw1o}FOI&QTJ+pEr3cqMfR15Z zM?Ga^QNE+LM_ioRQ#kDb7seN&*At%Ut>VnJ1#6E)*47@SH^m+8GWiBIJ;BH*hk#)wqB+SwGba=O(%cs`%w@IG9}kHM zZ+&s>>p#D+zd&Zbo1L7T{q8f7?b=1k=_kn#k3H7uvB!+>KYjl<<0s2sy!^5FoqeTQ zyuvJAV?Qm49Yg@ss@lKs^f!fja^8482cQUV1Gn9Pr0Eh-yi!g_Y-aT7>#zS*zVRdx*S`F+@qKx(yiQ&t@1c12G;Hn3I-9eb ztRxHRR%#w|Ku!)yM>xYYP!b2n7s*c8U*daG{>5OlPZQVK*NMlf&ocV8!tHBcm)RGW zso&4T_s!W!3CFiI5c`nyi2Z&s*#14PZt**L()d36%$K&o`g+@4N zkOH9=^#){)Hts$qG)Cm_hkf=RFFL#I@QM|OH!L1IP+qNEe~kN0_|?a@``U!wcw?yH z>&bodtGnh~I%Jdom9d+T_mR2$(&Or>hJGR8_sWmTkKG&2XfPItEOVg&;75`*L>~dV zyhm({JNUjHGe*V#{O@IDMr^APYi^ULi|rV%f++oh%xsA%F3R6e*+Y;`dw`E2nzTQmCE`R!%K z`BV_lrzG5m0e~w+A^TL;1aulhBz%U!#I7Zzl5XrPZ_byu67cZ|8Hu|j4$HrsJpbTH zI)h(97|Q8-EAkDyv$ z2pw0^W)=ekdx;VgB;xxd;>g`ck77CEn%VQ$gaM(UF=D5>d9F9 zA5>;n)SNaX82>`7IvEfljUo=SA*`3OIBR4B@%HzR%nRCPJl=R*XbKX|47Q1 zl{c5&xHr0D+rFv$uM?ks1edK$xoYakhp=)|`28!S;Kq5Y%1$1vCN~#L#F7#F$3HFyxA) z&(LrFhT;-ps6IywgNghrnYEZ079;D^oA$%;TOZ)gl337@>fksAD^_g+A+2!`n@ke5l{|hzE=1sLCOJy(9wQ5~ zsyM1c4d2lfABpb2Fu%>dHB-4`-zhEdMj(KO{se1Ur>pNHF(+^#&?jgQH^ky+I0+vk zAD8cdaC{*j(!{Qe-W03d7E5`Jo$1DM)(_Qh4j2hK!R50pB-4Yo^YWeKT7t#HQSvfO z7!~rp@*QKy7KO(4H^mJ5M%y9$d{bP>cw|GH5oog+n|aVCUBqDxLM?|-jN`zhSVZvG z%9Br!{SQfj;oLP^PvCQ^~X?74;W^jUQt2i(I8v}7GOnG2?K#Oqw;bqW}H_8#Ykm zOcan0RoV#ph0_(zxL`^#I!$7s9YCB{ zo_YQH^&BMQ0PMVZk=x5+V@Y@1v=KnM#Ke?!2=fiHVb5P+gfuKXZr#~4S6V#NgbD!X z7#3L3J;4S({71WGG~r;-y+#x&sf;Ac?}98R&zw2A;DG(%)FUV54dShwCbk@D!-fO<`&Z1I zMaLC#XCm*!N~|D+v0Fu=0_lvZqfJ0CG5H6C21c>@*3iQKDk&&^?!GDaP5M)O@KKVa?@B!A6 zv<@=T0=fnIlG27f%Y*#L)3;ugm4z#h?vUR_ zy3mp%#^WuLJME}GY3M((u+!GE&bd3w%534%nXiEP{3mpt9J8VnF zT}R)wldhoBOZf!pwLj}5w-U<__6(y}Yj(3EWQ9=-o60~qD<5DeqWR-!+Fk!B>857p z{51p8?7=JEBPqQesCeoH`OV3b7GEvDV`$aVXXcak8^ru)#&#hm&z~?BmpRf&zD<)F z+DAYxuzX4E=u=(eKt~dGW|`?!pRoM;Lx&2eP)au2OzB23?7P>hZ-b~~-`OX)zU~yh zYla;2D2^~mGrZ^&vktvaiL>ZuSKt?5sjYsGj34OL?tGv*`Bm*}l zU|ztT00FgGc4F44zyCh<(Vu@VNhwdk|6@{O%gSQO(UjO}(_#%P<(IJ;;79o-(izGo zh;*v{uw_f>(UvW3bEF0BlGn+x>yo9Rww-O0*OO1yVLH<51;-o}NA)qom`_t|j^eWv zTM(ov!}*ePC{zO3iF6Y&%aIVuj*ra{4%iz2LCXsj|+B(9=0DhHG?`< zCMj|kSI2ac+F+k=EIMCBu9sfbsbiha(qMDeQBh2075zlr4Hq5N+etIMYrj%eOPDN{ z%boSANt-Cj4*zpbx(ly{y~zs5+wT`1Glg`Kkc_*PgVmKwFr1q#0k~d`LKRMv~z7wbS z-jKR}_N$MKt1Rp_taR$MqVkj-OFw&d$bFNge|$spmQGL0jP}dyn!j>r55Le}i_0@} zt-c*|3+4~E$+?{-j2Kjse zvIy7}mR#sOQwVG_IK@yX@C#v>(do>eR9eL4WY~IADjzMJc~pM$sh!K0&mOT#sm(q%-=I z(5pc0bSpQpt4Qur`Ncm-2I)$=j=^c7-?*YFvkjMyu?avD2Esq=$-d=wI_^}A!e47t zU?Bd7u`eO!a_y-VAKRY9j~_|KTW^x&x858hpOepi^s#(~x5!k8ZI3jY{zZ~=Y<>h> zg@EfO);4T&&41vg^f__*HTHej0W*_eSHS{YuyR7a5l5SAa2c5bro0{ocCvjjey%6) zD!9T%=+D~3ma{s9RLN+ir*&kjb_OpE{U5o3Ri)`b?BKunk zXl393nsb~2G0-SnZ`^^^llA2&x9Vm1Aa2Hc&P7<#z?{UfZtfa`pW|PHnuu4et-K`Z$MxXN{gXZ-r-Af~GIod%lMPUl}<5U0HkZ*RV%~ z_J=tg^@rj47WRxU@jM^8>sjb76O~9jA3}f0uqjMbm*E+44CzYtp6}nF&)>86ebx5{ zANIb8J%bD4G4{S6e~)~u-?R7q+4CXD)F15q0QP(wlEre52-v;^{QnD^i$7!ZQFs8a zh1DOV))xi(9J)k(Z=$-_Bn(!cr9as75cUjs**t9$hVu6qBgyPNC_(Xazy}q@`xF0S z??1)%K&mk?i?ay#J29AH|+2{e29R@E&6b^?`+P4|^WNp22m4 zi9L_y^#KpBKaM@qF}IApACCcKVDixx@?mBX+BPVQWH(&+u@I;g;Uj;9k>J+&g+g0A z|MSmsx1Yr8AAWdD%KX&S`6=?p2tNKIFSfUm7n5z`@3xrj z_rfJ#k7l8hCZWS@$Oelr(>W2bNQ`#uyv>dy_LHMXf~^lpke?t0N_+s}G=u_+%D{U1 zJvd^B1FU{D+J)QVG4)}Ko0U$3CX*y#vcsM(lL;9=CsY$0tNg>^J-e@~dqKL7vy#xyz?sbG(eau{(b|={&A;m|?-;vPa*NKQ(lo z`N!*1j_uhY&jK7`&nZulHivgpSR~+;eI>nN%Phm)U3Wr< zp)DGhpgP6?&!j!IUa;AefYcI0ip|xC=^3zRot`Ejub&uCwm>41CRIKn{w**3%Z6?~ zJ@nYo7b~P4Wp9ln{GU=hJ)kw%;QEF{0b} zPrv{3GuieRNm($J_>i!1!5-`?CIL zzaAu7<#Pig0*Eaj!hTweyno$;Z@>NEy89zZ%nRE;`u5w8w!dI67pD*U`s`$rN!(*L zi|iaXf89Vh2JNamAIDRXR}nF8$y)!R(oiQNo@>*fTUFaG~`>+4FVKt$(oRF!sD2 z^`lsQ=s~o%7w!Gc-iNbimB%J(yW)KX>Ibs=ZP~M9uHpH=a7K#ftTGw7Zddc+nv7gm zJLSy5+~jobi$6;(adyyToW$DKzUR7q1LkH&J_W#|o^LW47qj|KXP)ui>C7yioz9Zt zSv{+0GR|k;qdhG*4cKS>Hai-QE@^GuU zyPR@@;(Lal^by`a#_BVC*fS0N@FG{1Leom*ZKP-Px`4hWMqA#0 z3GA{C0+woPJ9n;}aX)AOi=5lo5qWpNO={M5g1F!Q9nHJze8#=K#rcf;idFhE?&37` zMZFTxoZS%tqWfox({Q$1K1yQ8xSZ~$=bYb^-WKUOXF7jD6I$ta)GNY&?&q9o$W*#v zpS298PH`%?(0xO(<~F+z>d+OtV73)`nG!^*P{U{Hd||dR|7>oA)aY zuZ~W1?F4Qjp&W4U`>xomy8-;%Z z)Nzj$d3wK;A;XcIXuzBUHj!okA%02{Bczh55p0hF2uB(rqmltrm&6FUgeU}bZliL5 zxINXAQh+K4oHj-pvq$torA?g)L1HLqj5s8BV}frwO;xU{OjFx)<2seTEMKjsjU!2j zM+FM-K%bg7jVl3zFFQ@|n6aqrz|Q5mkshOmMpcASrzNEWowj%MhXO2#?`ZKik-an< zM3?bj00v62YaFU_X{Q~ z%_toGqMnjoB&?$u<0!|O%p0EvtcY@{d{xFUc6zwxGg5(?dHu}n_^~6lY$zBwWAdT99;y+LZLMp}xSJ@g48QHY^2qxYhgL@=_I4-^4=L7Yo--(p zI5ioYgYOFbDN?=)KOH*?-=UigE2T)_g>g*FAt#P8rOJs@d8!oPT(0R{EGU~opmTYB zGo=sJ(Vw#Rd8`oan-}nM!vm}xtn2XljJLG@m6&5pAsD@!=LUL5C}sj!6m+0!BL?;e z6;tWOp4;RPm9g>S==h|ArKQ?9P}6X8o-tZFfP<*d|F1XDE1z?J~{J--mw`)(=)Gqd;2v>R`70A;=rz%Z3yX@kU7{w<52WG zXrJcoadQz}R}~0dz(FL#aAfUTTgzs%$wcuvTdd*F>XxWW&va{bQG&>lzZHL}LO#)K z_S$ndNK4oDp|!V3pV;EA6`!*sJ_-L;{f@4{wr8t*Zgc<@=<2c7plMlaKjfy33<>pX zjo(6ghJ^UHKHp94Mtm+dG(5o1&#!H0Y+P6y{N^7XWHnb>=V&ESU);BCX(9ial3-EMbrwV%_;vBt^ zJra>fH!zvYV$v0}yh9v#S4_P_N&W$N`uqC&wh8VT97fS>6D0rAa5PDCU!dHdF$%vF zwFwXKCC$7*9kQt69t;iG6LH$H!bD*zuxD)3Fr;&X)grhtlNQHnbvcb#W!?hy7DDN@ z3uY5*LCh;770snE96C^p4lV)oyK$16ZNM$6+{yg`fIP$ z4PvXR+y)_LoiB_KW(jMBD-ku@>NIjS>64iF@rgkzjbx=ds)kZg6o>*gno z!MfgYcZ`ee;11MAOie)r!68(4hlPMQzP{2Qbq*7ckj8l>?ArW9Vef@(+Wmz=wbG6O z>xP1E*3xO@`Uq_-fu!n{vlsKQM?~e@Rq<))KC(-k|0uYNMW zP_i^)F87{Pjh^7$=cu{DLSc!pyjJVHH@lhgILdlV&6EsZFnDbpF3V6Ixw8&j{8NE09llhqFg1aE&Q+@RAyO z`#_653=*(vs+;n4sChBzH-sjQiB)(@s7A*$ye6JzAA~UfpT|C?GW)=zVCbo*DLFSv zGuy#wJa}x)vzU1#X(Q~b3nFu4O)jrV@8rWK2;H&UkVjuCgw0Mf45K9@9}mB{7!7XG z7g|+kUTB}!$q!mh$3~5}E&&A$aX-Z{qrXxIh=p)mVl?y}579W)(nV2GjW6pf6D0DGcU9jn@NYP{!q;VyTM zHI?P;h3(c5edWSV9$&p6L%VL9t{yf!CPE#X9Z|Xqu*bbI^PE}FW?7FDE_mP4!F%_3 z)9u2;PIHYmbS{zY*AQ{I^zkXL1>~}bV>Li#G@Fd;3uRrwvqh=%9rTe1ruG|ZXUZQ& zDys>>kx@!mF@&xwG|c$?2ih;RKV3$lYLMwe(wqhay|731F&nzBFiIGQ9n*A+tVcVb zA=n#TjdAyd1y9De*F-Ult}~G5$xQc_Qro?X_h~j6mzz<7I?pr#^>kBw18rgt4vp6| zH9pwzK;nfE+WzAO#2a1XHlu{O%F4p_rjXzIIiO7-Zgt)5>LzDPBMj{(XH{d3Zx1#a z~O2jMpNx`&ingdyHyE~U(Ve3 z#>T(AgraVv|MC$OZ~OpAhL6L(=dx2Olw-&JUg2)x8Q}%t72%Dhke(>b_R$o`rScIj zM4SxIT!6F_s#9(IneuVCw#noet&KjF%Z zrZS{F29N96JLtkC?lkieq3l2OJS12}J|>*&`8GOouVY_Rgu&>T(c+e_G5+lWY+^Sb zm!g+Fw$1h?shs%}^5vKKUOJg6oYzE%!@ z%=3E78^TvkGuI{er!JN_Ui$T!iy)wv#Y#?-%d8f+=eZN3uzzSE&Qf5nrTzrZ#gY`R zGuc4UZS`@S7ixMo{^Y(h+vQMF6O-7JCUWsl__-&#_o)o$FdX|V^{z?1ZedfIC!QJ7 zFo&@TToDg!()p3vT3#KFWK-BHo|&ijP1JK^D(~o?ip$Qs)Hdkq2HEA|b9!L(<>H2V zWWMH`c=AiBZ&EM!wQ1k2uG>o4zpHmWio|8%uX-ycmx&AOQFPqm_3F7r)vraKi;KnY zf5Wr&Jasg^YjQFDT@P~h|CS5vS@HyA(y417AoYvCy?D}h2|eR~ODO+sfBE7IswYXh zB<2<}qN=i6yI=i})6A<)v6pD2@?z<6&*J=l(cktY;Qtq0a8JX`$v@Kyf ztAw2{o;kBO^{2U+5viAZy(1avYM!#QU0>T9REjM%Y(6+FJSn{AjU;Ji(f`}x)rgS9WhZitjZ|D(G4$X^^0oOD zuuHfco>gZzP1>3&IDHvTj~6q%aVcf?B1b(gsT6Deq`JREJ*%<e4&5 z89VZl&=T&@JHK=B=h;i{&O6nEABSA1a*#36JXgtu%I?U*^=0>qt8AMLORKj?=55;y z)Biezy2yp9tBWy2Z>rA4U);DDb%Iu2D=o8KvqoHH-)Nru*P(6Adf2SnST0oMJ2f8) z?i^GunS=0gD~gFE(KRUk%0ecsTZaclMX4$0>|Z-~LySD?;dC(8G*jyvd1REn>71zK zk>RISwE@l{(8V@&%gK6>uvedDnB&P1SmslnenCwcirj$t$cE}`FLVZTmE)|bgZ^Sy zn$(YF*`ZkzSWeVX<2em-q#}2~uJ?@u9rPSd4t}6Zl#8hZU139T`WeX$ky6i*Q3B}> zf7BAA){mvOkpX#nUGo}-vTR>N(S%Vx!VwlTIe2N6OPUAvst%lNcX?*E$bv?-~M!Q$E%kK63 z%nS80gMCjfv{P+BWz4Zzph>AGd8B`ie&94QQQz=FGc-M+>3Mq^VXaly;B1CMd-wGm z!S$>vV*xMZ@iC1te%eUpgVszd^RqFznpo39o^K|{DXlNBs1Ld!3AfdW9gAA~wPBiy zWpG9o(}31;EKT8zITye4w={_D7Z%bZL@9}+xsb_Qyc)}*r6@yWo6**#~Z3qQ) z)3Y}Gb%nLe+1`_-aTB@Mglf#}&dv=w#vIRcuH`}XOg*i%NoOv-PV`7q;^#i2H=!}$ ziO#k=+~GPm!bk^w}ZZm1}$^Fy|x4OKr8~zQZcw2`)G)mc_eA$%&Q9_aw9A*uL6q$`X?N)u zU5~lvJ@>H}OPOoj<4!Ce>g5!BYKYF2E{iyow-R#6<5}KIjDBr_`+;gcRF8vI=R@cs z61=pb_U0G-pehZb;|d{`;|PoAiZKeal-j3WTA-xAhuDp$t3-5WsXlJwoD21WG510j zdNRPhB*=O%B6*(7bgzk2omfxEkLG)F_@A71>Kr3@_DC8eHy-J4soyTX0Gi6tjf^B- z5TXA$>OpMl3pu*lX3lv~J<_fTsIO~63m)hSb=sglKhsMw_sEjQnb}Rxq(&IuFwH#J zX3lv~FPM9LbwJ}#Q$^^Sh^O-|Y7q5;*lf$Xh|yNfF4JPIH2v8AK%v7!>;*Hbun%haB;)i zBVjI(uDVb-ZlUFuw7N#Z#Z<>^>>!%l!JW8X(z~93xpclM$q&7#*}=|nb(UYKmguk- zK7@;qH<N>37%^N3!VdeSrgXTBANYbbGfOV$b{~4k5BsG`7 zB5Ha;<(jP4qpJUs^dcWky}mT^oBsd8o7P6CZXjJA`y2lS*X;kG-(8Ebpsi1N$ZzW8 zjWf%Q@1E2xVerAAFXr;%`Aj%>NLW=U=VRe6ZaR6|mn9}uub%7`9OCaw zkB0MI>%2v&Kj}pl-?niHM>!SOXPtAQ7Jz0qK16A+_uU(8;x?tM%r*R_bQVvjk17 z0nKV>-ME_atkCVS4gFjv&=)DL?;06#m2sM-(al$Iq;7O%9iSyV>45GXwsyKW3hX8K z6P)U~h_|{{pseb9jJv^Spw$|&y+9}Ljw`9qb>J8I_UkpA{1qm4SztsAxP8 z|0sWQZF#w&PkDLuqlP}GPE|j8inNwKHvPHm+@@vA%*&T8`{mrGUw$z!|K;y@&E#B- z!1A!Lw!?&2Ax+2>x}yCMAv7d72=SGepwO6{>=@)SrTcGc?^w!|GD(az${b@D+m%E# zYjfY^ZV@?~vm?4qzBjBHX=|V30+r~u?AIr@5W^LD@`rg>NMXz6HI}$RU*G)toH?)G z{PmzX3)x^Obpu*HCXWz(ZI6HaG1Vh1$DI!LevN?~DPFU4a)s8xafr7#+jj)a9lGl3;GpFZ;U#_g7nk?w)+H|>bg_TH(y6^C0e5$q?A{pc zNtBf7pBWqz9FrZD?IkH>@Jr>8UcMM z$R*WFglyzB`L;IU;ca$+StIx7Eb5xssZ;l|B}>Xu$ESOX z;4c$jZ*DLQEWUEnfc^mi3nN;$ntptGP%y>Sl~?(~q()#%qRpn@Ac|csq||B&47OM? z9+AS^nFLe`QHpqpyx6KF1%FBg(VsUZB_}5>?w;2?Ix8#h$^peCB^&ncpFH_a6njet z`~Ix#v178bv$MvG&CViIW(2ipIiPr7dU$y8z>RB527UJ4i%XU^YfkCns+)2fK^4dV zi6K#5B6~_qlwVpwtny@U(fK9K_M`ZBSzFxVYG!?5790A1q941jPs+(x3;+7tTndjd+X$sbYewbUh~MD z%i^CNYT07IfSXby!f)KTe&C?_^SPXp zMKj0o(J(G63p8PQ(R6auUFeTH)EaJ0a5)MM;mW{D=VPk>AWg*IoSmEL?Shw{+*4HS#UX)~xgvarx!a(qs3O;?F(DO7H#b-SfRS^BRGxG1H%FcRnq9i5J+%#`aT0^)Z`V>9nK@la*vxWtYV(-+L2w=jKDg15+2e;*q1)thg86B=3( z9eecH-FL@E>*pbVSjbsIzEBLzqBTGvL*`I(fFFg{55O85YU7Ic8hnk{ZN2uo?b`;G zEF96icvR`Yfu*C!9IxzMDT#de@h2aC_{qUn;%9dv>&Sxr`{nER&-2dib)QcfW2J{? z`jbq8DaGGgEB(|W(&q+w2f22Sd|;8c{P{&bKqkv8+2|aMAwlV#idT2?UnqYqf4(rF)2cx^>GqO3{R?t(Y4^Unle_LeAkQN^ zZ@sN+^6tJp4X=CcUvRklG#KhyoeQsUsKvMN78x&m3yxQ5gYoj(vG5Addi)A+@oj)# zp~@j0MGccfXQ#qD^z=T3x5(7)Q*hV^H5Bst9SX0IsnehE7CEo{365u;FutLfHrSc) z3UP0J32$l8C|`op1h!Vgq*iq#yh2p-BfLe$-H+gKb`eJ5=F|qldI3&^SLij&hwzpJ z7wAK9dJPoDHI!Nnbs)SVk(d61x3p=5|G??dRp=`;SkKk(Ja|Qe+I$CZk@ntqP{&FG z$BDD!;1y1q-{374p8N(5Z{G$>YVA&gSHOGr8N5ZL7N6lcImq+~;_B3ANEh-18bPkZ zXK0w#t<7PW?8$ze;9|el;xEW)-WjqwKacaP!4|jPS@4QMPQHS-e5u1%FbM%dd-w|p z;7J<6|7qSh2PI^Ie7(F~KJG$K=k*5hANz0i^PJzF~x$ zDi1yCg{FR^yEXvpw6p5~xHi*T^T9bSQ`pQ}k90INDqkBi-rCM};N`8k?8>7!Z+OI_ z?6m=}*~4{!r<%aJ7$~Q6BIcA)^}=ugMsICkH_Xnh1GPq(wr*p$yD+d`Dm2uXtqpZA z?bkYR_S$51<98BbTlMRO`i<1uaI4KOtpl0*Oi{OaBe7miIUAp~!K&GtbwHS=pgnhVrI6-Zzd2_*PGsx~uEx_2G9 zLq5J>8;J!=w%W{hqg#VQYlDnv(P`;SX8yjk&?{SazNsL20XecDsqm&wz8gc*ZtRt1 zk8tIp(NU_CglL^cd&3d0-h1(y3`U?Hc3jaC-FOV zEIs;O9G?*v#@E`n2sH>f&(2!I5v|XM<2Vl#MqVJ+bvS+v!kbikbORfK_){MJL%lD^ zalb$hNarXv2vH~JvEk@B`;?jw)LaM@ItVn5Aw`8sx%fXy3N(_yIAb7*tIdm(?j0k4 z`u*4+zaRa*{K=?W$R_#JNa|~jl24IqCMR zFF8!2S_{SVPc5Jbnf)L#~i{8Ix`L+IL(o+0hX4tc)(70Ii<*|kw$@&xHd^2pP_ z+Rw`d@|SBDx;|QB?M2YHOn85$Z)GdsyI+ncrvPyY`N(z(UG9|U$zO?QIjp3DH(b3_ z?T_NF!QYa?@1bqrQdjfxbG3KC5OVG#)S1F{QhPbsMcS&A!=|#iuH+{b^7C?mijJJ` zj*q^50Sx%e51EC6S0tH2o^)qYCZ#y;9j-OkoSMgrGgnNtZjrCjL1x3 zt?)4V&&tUN2{J|J{(sbc2Vhji_V>)aThd6|Y&N}ZvK!J#PY4Mm^iTsKKp>&_9*Q&p z5fDN%h$!VDU8SjjQF(}pih_y?JOor!RD2H=6cx?x&G(zRd$YSqDEj>Wzwe9w*u8US z&YYP!bLPy|jLw$%6C)4&ulbVUYES*8iKG|s&tk>{QxOB4P16sCt zV~Wx;PjfSSZ}Utwz`2@vsN&CH&eE|@{HBNPqz{X&(P*@4Z48bZ;9m{+FsscmCNuxn zWa3oee9XLEg-tDsTed77;~nea)toMFS)7+w?B^Bh;TPj@R`mZF3S(rs7$jt(>#d(dnGz&P``YdtEmky8dq6e z)MZ0fTCDM*(q3c6?I>$oU@Gnt>?w+#!F`HN1#QcAj2qLd^dVzxTGoaxMb(w#io$C( z(p&lc2IXi3&5~m;RxO{p_vHAKPt8vYDm2pY@cpg#PFTKt!rs>V!^5euFeq*QQ+U01 z>hh`=k1avFyOVZxV_n*5mgAOLKf+c{V@U#8gFP!KRA0m|pp8S>?CFyH~F9t?~h{4uG) z3+8?dG2?$mBUoTUiXiqM6FA#{R1;xFd@wFXBxYwN0m0tQn|bN|Qicr^yppmIl$Bk3 zD(Shj9Fv$cOmfZ3@lvNJZJjqbzp`bT$}6X(zqcyH-Pe_NF@~l_#`~qXC&VQSQNd=j zw^wL{r;krg&#WJ$&wkA6neF4_6&~v4V=@Ov3CVE@ZY})cBGW>RovEv@N3hyksPTzK z&N}+a6Q-QB=W2Vo`=)!khGm$O16%myxVB7>j*Up1og18(XwXM`wTy1Dj?S)5jn4Is z)cYqU1+{!2DZ(6+p68O|lNyj>$_#b&O4E6GgqOJZg|=)l`{10EyilD>Nrb!bWk2a+ zKd+F~l@(Kj4<{~~i2sAz=zYRN1AWhaL|4cm!r{b=F9)o%cKhg~>KW06K7n0ZW<|L) zD{R>{(5EnZMl&zn=!|~d%zo}35k4*4;)=48(uLR{qs}wRCor)4Ln9_k81Yc|z(AiU zPn|I+R!C3EDvEP!;S=HE?q}}SFJrXMtGg{v;mKFl1-yK*_Q$w{o}YGhbqQ{k;FaT= zJFa(nc}7%fv9CEG(5&wr8r;2maA%5F+GDOWb&oaLLq9| zClf;?jWMYG<$wGmAg(c4YW@$GXeQHHSrA>gwqH9qQ9ol(6*q z2p^5t5Z9s2LWdcKjX7{avPzaW_KzJJFf`b6s4J}++BzYj_0ZuVA#~5IR;^|wQB6^Z zyD>VkV@kphQ%ba_mo`1dC$!y=gp`hn(MDt;`Uiw~dWbD|FRDx$nLi`&sol9J^!gLI zyPpc4+Ga#j<)Zku3GG`ykU#s|nTr?C{C0N!135(rZClMYDqB2UgzGR2k#X^qj~ zIGCca5!DzayxV1TmoB3h`L*!$OZD`RjSL3ph0bHTbQyEaKO{1ifeL=9UVf?8wDRdM z_1l(F{`jwzAI+uJk4@?t92C;M*YwsSLIOv$p5Ci_NKi=8?kej zbAGDy*{LUMmOPe_GPuR^F_YS7WVD|&W_gRjDG84)sd-XEcFbM2QL|%dLgv7Nu4Cp* zp13cos3>dS#L08UbS)T|nXq(+X5+HC*3){eSMS`gw8xY6OXu{fsOUFmsXqDfw6NUX zURsQ#_IZUr--}EqIoQ=|%l5S>A5G;GR58rzlE11QrwtC@b&=jA0!tZLK1R{U=;I%g znPpUG82yE|oiozAbV<+XEVy(T-L)&eSWY&yn;&R6<+!aXmtK-mq#9vD&%$-H*R`kr zY7;oXI(A^7Sl6;wua>#R#ksc6OU@=X3{R&S5FIN?(t0}fbN4tJBkiICq)Ty6^d4SQ zGm`ywmc9H2SeeNr1G}*Wq#gQ)(@aBjC@AU$bzw|5p%+9teAnKg0;umjODmSme{TNl ztgczssq+uce;}(U>zzB6ACnoUDMiEb3jQnJd~-$d%$dc?=iWP3fGg<>o5~OKN_ID+ z2SyaR7W$Ll5& z@v<_rvP@ZWZKkskibX;KbmqtiM8azx)vOV|8yF;9XdN^_nps`=ZjZuhYqe^y^s?1Z<#GC$*|98c0HsgWjO^KaxJ_Q%nd~f;tC8+k z>Q(vNrU+bUaJXMUc#J7CJTNCh`tC#N52`ss{ljts!!u1W;eooakWi)Z{B%KxwJg!o z>+L76T-o@RceBK0h!^Y!g$&;iyId;$GVi{6q~ml_?vXK(XpZQt%%=Jwrs2-Z2aP7Q z4=Qpfp0gYdD}IoUUr^k*2PzeyOyiV7vNZ$D9bb}bZqD?wRdf~BeVxju^gDJ^|L&5- zrREL=%!1iMzfk02qpdqZF8*u*j~qb(tCXfyKI@zK{z|BIXg|4pEn%gx6O#siEe2KI z6V(4*Y1LA0APop;pAujR`Qa6{>dtEXk!h2Lnsh-2b;qa z8e@O~7-QC}%~_ZeIq20pv@AqdDM*VZyjEEp@Y=?Pq!-*T$TC#i7S>* ze7|qs_a`o2G126Lk*dc5e8-g!6v8QjtYuiK*udG z291tN+##jxNc>e9RZe<*ApIi!`a!dI#BAFDYrUnSDQkqMud3TW z&DQ$Zg3q&;Xmc8ux8>y9TeiG?l784R!L*XDGADG(Nj-cxjrOv4< zfMpZ8*EgyggWAk%mCY|2)GAy5q?jtl_}DAXM_5k1+e<$RnnraXyom7j);d%n(_c+g zp;8(2`I*#XCSAQzsjAKDQD-Nela4wUnqHrHZjv=0Rkf%2#t%oZawp@^kIFy zB!4U5f);hXZt%j{0W;=rIX3yZLrE1`;-$6=PmJ7=xMbX;SdFYJ`m`b+^lhbU@ut6X zc^a7+OHn5ffZ=kNYFw@~?#;;hg=4w?q|R%ibmqUH>>8HsXGN(gpZ8F1Y)rPd8@o#> z3pOIVq2Mm%NyXF_1`hE_^MhfWk%n%r*JsK--LXy8Y*NGL-C0;`5`SrE3Q9Gsr_UKX zu%)T_HK}GcC3HL`4@^ous)%i)_EoLw*gM!55#Z$>Myb%maK?Id^OW&wI+hCWN?+5E zcg}4cK1_8Hr@ZAMyMYm%*)BRZz~G|GQEQT%>Oz*`Cfk~_nInqrkA<*EhwpdN`AxL7 z_@u2eq!G4Ow?2GN&EKH0g&&nhRz9Vnch~!lZEfIwejVBV9{WuRy+*4wVv1_QZ8B&y zLmCX)NEVLSX(qdM9HTpnU`F_z%BgG6C)D}?|4f?rxUf2lx<+Nkga*1&k8tbitZ)zN z8W z76$5z3Xgq|-=-kOQ;NHLy;z@d(s+;qRlP1_R!$mWHmYLV8`%`Vl)?YOJz!dgkv^v3 zXc=iU|Ls$yqG6AnUH{m*$A)!lB;2%nqp`3=74GMM68mUZ-__gaM{jKHF?`jk;S4>t zHW286&f}ceGAQuMl|biy&gMiu7^|4KYX);`jMVGcVlf+yjCX2XRTN!dDWDGyIbs`V zu3@9=UTr2;EybU8uWd9Da_-&`4!TGlPuZFd=MnlyF)r>fWp}i)1Rt@&@}V*m*r(_B zo)*w4OP2~&@(7^J!#}wP(@uIr{w)9|HT8AN>iAx@Dm^Dw)W+U#eSW=kDShBxTsiCY zV6=8ty%ckqb<)+0$Bam2EhHly7lb)J*#-EHx|z;GrH`h?@|p-ur@hnpqKI8?n^wVU z)Og}jdF4YC>c3z;SeYxjUu&6tZSqy_IJ2VI%z_otVVt?2F^Bbl7Jp@of&7aGWk69r?>Vs8WzC`A#+a$$Pxjm5G|@ZF z^7&tBgS~U;`Z@F!=PJKf*LCEZ)pt0TF0; z_nHtQmX%Y_a%q8m(!$pt8t8ud4U6=X)Nf2^)KEGsHnO}tCpK#6(AcQ*F=6%-*z@%gttOrtuX4hhbXodw;%2_Ks$Cy{C?CP$sKWx4L%! zC9;=?&6C5h?#FgjlzBlTi;Bt%foj`oMuX8$;GjC?qydA&&jKS z@5>7rlGdSh?CZG9UiIa3fegMk_Lqz)9mc>2jDcD?&(ab{bavvO6W1u}W{ofqC{j+KO%I1;0o(X0Ua;_5}BS#V7+h zD-1?@`uEg`IBkL_8|3{x$7{90MZsD@`1`BqAAGpSFt78@%kvh8|7{iKC@=ClXLHCt z+e^i2Cf0zPn43|y0_rd~cC;88$&2cDwvs6gP)5@FDVx-qFMdjW?`cFd78vy?tY&`Z zY!K4xSoXBuyt_fsSYqt*;!Q%he^wUXOSat;=Op`%g?2I>@46%`HWa&W8+8Eb#JzRh z&AYD^Pj4WEw8*({(68^V55=2zS~a$KILRLRn0>5f`qGFSD0|#RTRIHe>`ocy8fAWA z4jW8Ze^l1r?njT_vMsSmA2+H}u}?vIhfv#gQ)v5)0=8FuFU2bQDr39lgmd+Y4^<8A zpU&xovR8?=+rHeWw>cX4;HVHDdeom-qu&z2ku<*4pxWIFR8VT*xq1!&4L zyZ6GBYPzM8x?fn`Or}+Ch4GNJUZQbX*4OI1W160WGly zK>pge=UmkP-VA86*nia$a4x=Qy$#?F8z2zAh68YVa6Fks7L(;<4Ove%k!`34evdEv zp@1k2wKbudH>gd~r*MdI)f*x3ED9bG#c{dVY0{mU zg_k;>jeK>mS-IjFgDchh8!{k1W?X;|?T06LjIrvLReo z1g3U{(pyqm1xL0D9=af{mDwB?)+#*AY;KjhU|3MAsNhyD8m&i*b>Vt_Sct(d!g?t* zA|mw1QH33c5AN1>%q)0=1c&vhtZysH;$yus}9RZP%0sh7aiyPhMllbxEZT4+YK@(eMz4vwYiaHhHZ-1D+Zk`526)epqa5%}VyTHi{0T@BOSU zHt6Lk-6BH_aAc0~c2&6>Lo&So!Zf3%(o9rT#0v8%-ASPdaZjC=s(O6kj(r*2#6avu`M7F|vkonuFRT`S0>$Q~#kT z80$~cZ_JIwK2x=<`MdqrPH_byR65ORuPOcE?{ZMH+h|(UWEkIXs6UzGq^|k?IM>j3 zQV_zWrLQhs`l@uL(WJ(5@8O;fIJJ?Ck69K0pJv0b~4?Mipuqlk9h?ZS73 z0x-8=cMb8`sBK?JIVg4aBHyXyl)WMADBglX;D0+)x9<-n$<5mPug%QSw&8Vo+F|f( z)nb2$tz3lTri*oGb#_n;g^#d(nz13KMtj#+L)*5OH6fqZr8St>to5@t-Su+^Wo2x>F8t&Ari`q?bN#!unQg2L znn;c5ks6QknAE<;fZ4S0gUYXw1#mzm* z(<^b|N$XqhE==@pmgKJ$yfVGg79|9TvBlGS^_pJH{+-eL2kgt;K;>J`^M;USoys5B z0^3yP;&E=DAEYkQ?E_cb#uZDSNZ+*>n1AZq=ht&tZ~B6QxalYhvXI17KKH0 zuPw+6X&sX=<>v{;*bwQ58#xohqrbgmiizysazsg#u5gyulI+YBPq)Ksu3TAt*xfT_ z;u5b}g}SJc5iR?pwHo_pvy%%w@GCQ;n8gY28u_$y~CI)=yG!Dzf!j}})x zR9rD*UjM!eM=vbtKW}Dv@!|xAmxYzACl1Ix`C%UeY--9rW7ciWZqyDnI>8;lWeB>KT*Qb``*9^Uf0Q#y=tnBsZ^ zv%J}lUfJM-AHnj$##RQVV|tvN>?xmBzDR`~1He(8E?#rmb~d$T75CgrQuks+;GHnP2i z!(5;GwECr0tJ%q7LbAcyu~mM6e^P>AU!Hhowe&FkIU#nG%2i5S#{YzD>0i{lVA7a5 z6%}*FOe&CW(B{^Y@;mymt7>#?g5*Kxt$EhDh682QJ6y=No}^ySC0`i^cMs!((X;)f zNmr7eqdRnl2co4*3!_xS^LqEs+1AfA+AtdGIFHyzl0f)^Rev4a?_S~PD=ZZ z7}0m+sJsU5N>*230dWg2on)~*|vFinQ+xW=#^rLMnwoW$;Ft3Un- zUnCQLcc{-6EcWJY!JU0CP~p`pS6-FsHnVncCF$_f zF2NZ|7xcW|WHs4Lo+XFLE95o2P37m+AZM%;d~OGOz|0P(Ab>g@Zj_x@?FSt1a3WI6 zh9Uf6ga=g|mbv4>M~zlF`pC{b!XD7#q${%;G&oVj&J{&EJyCY%QqTCz!ZL=29jJ;j z`-{t__s$;Qf8f~cH6zEYdPp7A;y3Bl+Zhq!k~I^oTeUP^EuGUgqk2E-TW`OzYIfRj z%^-u9bX`Zin`xy>Dr(X+bxLxY>Mo}sRfEL}7u{gL0X_j^_R8lV_l*wr?5ivFbs4A< zuILh5Cg>huo1z2OW%$js&D7trOlXv@wqL&#OcQwUu9>EEf|$wq;IG1o!-Q0$$xfhf45VS zh26A;+LC_Jt)uetBx@Br7b&*RjA$Lzqe5HQD}F%x_Wcv8PMoN+f0IP5yVh;3TD5qX zxr5t~A+A{9b0sA>Bc+2Z6_8H&O_4qLUF{R(eR7uIr$nivKtyO+YuQf7LK5(mwU+Ii ztdl4)%Y~hLQr%S+)!e+vf?F^XmHQJheqfwa=c2~WB0$JA)Jd%FN60j{1jvXOVESam zXzANA%PyM&RXSH!>fdR$*()hFK2Yn)CCo=xhV!&FJJyy3cuN2Aqh4Ox!1&l?&$xM= zt-;fav&NT}K~6`FUbR>q+~QZrX=b>vbj^6n`N-7l3#+4E0G*h{?=LiyJ*u5ynB26DQFVcJZ@+YeEp6by^%woovGS z-9zLJa^_w-jh_bhhqnVXNYwug1(%7nS?)E9<9__&4g++hNsav~egF`96A{=sm-@5k zcT;gAMvcqKPTu$NGl^}|$5_t)U(t8;`Tlv?eKhffVbOVM+N<)hbe-_LHZ3nQvVEL3 zF*Y-=|2p@8<|g@E`W=+s=y2EeMcvxF3Elr!mES))l=o}dKEOTF&^bP$Su;&?q*r37 zA<`qTUE4TQ`E1coAL!vOW?&uA@vea`(4@hg&`c&XSeTXF?eTz_bPU9dx#Y7q8rf4nJ@amt3kcKyH?Ip2o^VZX-aMN* z^Ct+oam>Mger!7P_RosXkxu|*HNH|H`+w!80Qy);+g2^QbUF4xtG02SItF`BZJXj9 z+_6(!+g2YO>(ZqK7RCtXlZrgBH8U@){Kdj*FT`Dv`}zG7*t$nEV@Ck1BLDB-Izj85 z`IWO{hnaiDsQ(Wxo)DKGSr8pKIy`0jcl?CfM7VHBt^QxUfkJw4Rcw5x%#6cKe(ZOb zcw!ga3}1&au%`}_W6&wEoY-K%R?OI7@Za80Vl%rSj%Z z>?zvxi~vs;(Y64f_Ki%9Rk!J$;|x16HoN!CUP;T*I#E8{5swLDa~}a8Hq-E z2LyYXahsBKjo+r^72+URs%0wlk;z z5H9|&tM!gUx>io_`t7$nwo5P5`P}oYoOy3Jt_jPYCi2;MOb->`KXyfoJ*Ddt%p=U)Oo0XWi%*gNF#Q=w;cC! z-e&LIKx2^lJFIlVqtJwD7u%TR%gzSq9Ck-$MjBg+GD#`v{vqxW(NhL>i_D5o(}#J6 zMo$*Xio!D0Igy_3sfn5qGrWVtnt7x(*9@QO&1m;i{UAMO%U5R(NNJGN#nm;8KYTq>C_L0@Y`lR7J!1L*Y_Xk3V%e(*aiZxZQ)ThAw)o(I zGh$06C#9sa?z%Qw*i1|)1MYB3Lu?rM7}=PiA1#{DQtWOwesrFVdTIWe{QR7p%(Bs~ zJNd8p=(}SFC*uNTn!7Xi#X-yd{p<^qGJ|FUt<*u?4vRyL4~F|Yn;&@js{()ab8cA}nVC=Cn`>MZ&_ou1sK^Biwg zCl}54H_L|)Ry9iwi}v@+@=?bmM8^l@QS&IOVFj4hEj&{doG|x+@aTB^TyPN zjX{w*7r))Xxj8w_d{X^g^dYTsA`EW&G#}xQp6gTNI=5(->Qj@GgF8pNB^4#4tnTMo z;}(&j4~@?#^w+mfO$rD~k91@0ULm<@{DiCUf@zI*XNy$zys%1=B@{Omuy^Z3tGmFPhYH#emJ_vh}8axz8Zu0{muB;?5V4_)JQM%&ClMI9gul_{?g+^ zRDM43Va9M>lFl`~a6p`!x|uP4!b`1!cDC20mafe`Pitm(SlhjX3df*kD#mRr%3V}A zln$8Pud6Z8EjTwUFfXB{pKHA=v-Z~*a7ta4ZSe@|Tw};qo@LoLq$|&|>>JP~Hl4GA zz6f1nKpjAO_&gg+!yW z#$QeAf`Ym_QYo#`MvD=|Y)BGj2+Q%AFN~1ZfFGR5X8cLF=ttr;Vq*NTSfsz$n`jOB zq?2?@elO(n_l&JRwVFvQ4rwa*tP4%UXuGWx3`m2iM`VjJYIHOk|PF6}D zsv7kHV)EO>!qxN0+`4QzzIa{T72#~-kcIb<&dTA4&%(DjhTG^oqtG$55HxDPdO95x zI))bXg6d#B9Tv{%DB+FhB-6)KK~2y}rlZ9pP0+E0%XCx+ZTy%GiGoHI#L7*NkU*AB z$``MzifnwL7U}4^Y`jmT7i79pzN&`5XZ*4E)9mkY?>tebiLTmsK338UD!N*J6J0fr zNn6&_p=bi~s#K!dp*{x>2ck=(aQI+r`n;!SX5iw$<2!{Xc6RB!?dy*QM;Wc7cB;?S zKBSuWhv9rh#io=N`&9F4A40aEgE60er>c<0I5xJxsRU#W?p(KS=eBLC3dv=Mlt)kO zV0xyRR6>74Tu&y$x`>SQH0G#+H0ZdZF^XxztjsX!$DjA_+`iX4rE}=^ae`{nV565* z^67i3irTFkCl^#u@3b~4NMBb+$7+U&i(S&N9yNtLBeX*8M5)@*zP5Km@Gf0`N9yEv z!a&=*!E!o79OC!H2rZ{)G{=GFLYD!kQKM?AFx-iz{auVIpuxMb8kV0!Iz|)u%6uyC zZ0Q`{_0)_Nx3Mx9qE#JenG-L=!OJ6@rdica80y4}oUR1vP-bBs-pT1%esa2gc!zX! zI^Ln2!d%V^OZTRY&zE@_oYJWtbICo2K;bm32;0<2n z^tQ6AmbwgN@6^-j6-PcTH&t`$hQhbdB*45STA`-S7iS{4oku-s0_!V2%uB*k`iUk; zXSsZny03&<^b=T585y!s4w?04R(bFJgBOlCa_qB`XIowG)$6fS;tv*I>6?G!04DnH zA?U5Of(d$V0?SLifPVCQ80Hi&Abcjm1JG~yO+>a~R?w;$uXRzqn)->?I z7t<44eOX7O&#BLgCn8(~)8w#G-4bf@rGG#Cc+G<4XL38uhb~_zom4N;o*-uR0$~Ph zPL1CM&I7YKjBgI)Y0_Ef?xxeyK1UTSIS4aJ-lxBfj_G8v*`|a|1m?;l(Bzj`@wFZ z+aJ~V)h>Es$fo1x8E=bVRR19SfV5XRuOsWeQaz=$F* z4f`{1>&T`b_t47~r{eith%VW0A>L-mBAGcmQzO%Zz zTHO|P&EwEMa{5SH3~3`G@YiUI5sH0P{9QQK$pK+c&}&_IjHBr``YA zz574ZqeHI)zyD6le;;%XUcrC7^b*y)WOWUtdb)(_rT@I~^n=yR_O7RgORVhlqRhw~ zR&FDjPj!%HoEy}bY-sg^PruyoGO zKz*aS>ywG$mJetLIUQ!aL#A(wUmtt+K_1z%+7_4W1}`TO7gj&&DGlQZq)hd8?Umg^;O>_g4~(>(E{lsk zE6ZAaZ1YPzI%mTLkzT$yQ<(LM@SoZ%st9otbsPEQ7Rzm}N0{8*BaK=0NuxBLcTJPpFdx>&8aMS1 z+%p<&9Ldc6DD0bHp;xbGaz@#LK$Hffx$0?Y^2*Pj-trIHw(mS4>m|!W#c9tE9o0wp zj5&Xvr+vR3x#7q=kVSFII}Z)Y-tg8#a=UW+dL~0LP0)|bxN{D_e=Tg0^MFh?$OPR( z$;Bo=>YhqD8s~GDT>jW{hfG*caL9v?MPe?-67+9$Rn(4*{X$!57~Kqfqdr$HB|mCC z#QG1{dpv$KLZFr$QurRXC&5V6AdPTS&V%a^TQ;;9qn47$mW1WO^|*~ExyQ@Bo}QIi z6572geEul?u$qmSjd*fQ;Y+`%Pf{%uHAo}OuIH&fkucj@X-{NJgSO!E9)S36Y+lIx zlrartQbd`CW9~t0R2BNeTiCO6a%^mtz%@)YC_ODWvQf$TY>LIG>>DK!nP=Smsn?bl}w5 z&qlvT&mneF5P4e;`<6b8Hi6BeV)dni)=U?$UM0eBTg?tJq3n@*VPrr`hdBpC59|3= zvy)qD1UmT%TE71BWtvk`O{E|IUGvSR);X-XWEtYLV6j3=K}j_t=POKyw`@a-)un?D zHYO>{5bUC*Hp(^K?^U3Fa( z6F(|lFxrYSb?%}CZ$2hXq{AM1aQ8<)5s{5gJU<=oQ;Cr!@ZLH49=}_b)pX#!^USrE zk?9cUJjF(3bjop$a}k~LGc_!tO_wmag}#zIxuUb^5a~RP+ezc_F-=@pO<$7=s;#~@ z8(d^*FrQ}a#kG%3)A`bA4#}#89~!1>Vatmps!u3rtk)b8)+d8rfnBJ^#0RYpTb=26 z*dRy>E*bP7q8B$yV|TG!chU8`XuNceP6Gw7YU8?|bDK`#^w_yXNAByXu{><0u+y`C zD~(mSQpoW<&?mT_QcnbrK8#0b@cNR;L}6q5sM^&&E0<6qx~maI#xtW=Z~Lj41n?^5wmhxG+kj+bmnxLw&O4YLP%9`dN8W_&VB zR2*e(Ed(NZb$uS(K7SNt6j;xvkyHzy>PJ|Q(3sIuxe8Yt&>D5y+WEGbn!=Zy23i2| z)i8eSsjT~HjkMMwArvZ89xTOLA{*z&hW@+dXq|uj?pdPto61x5)g8;IV^dwn zOr6WP)AET^mJQ43lp&KV+4f=i$+`hnB9}$TmM~vBziSsd+%a*XWDzz>7W$f9?~5#r zq8l7i`3h^4Wav9hq>GmG;yR^1ojsLfBDA>xFCn7t%wEWljmcwkEh$H@Rvl;%pXqr%e`b6$@`{dU33znI2iNba zdc6`up;y>UUK}A^k}h4PPo1HY=2WW|)y}V$7l2qAK5wkoD@dcZ&Hv?8(#Lb?BzroW zR#DQ`>y`R+PN|-fGqb4`@F&lQ&+!}8P*Z%y$oF|On4X7mCr^xF;yF$p<%w}#{_u94 zQJZIaO4egQt%?Q(bJqp68>BQ6|g?swur zn&VUz4mwGeTWAS3U*-Bpm~l+qR(g}ZFHd`Hb1|li6uGsld7-bKqa(J9^-Xvhe_73TvQ`JjzM=!l>i2?ZAdLWs=Bc zOqA0?bF*}8Lgbj5k62F0F=9BU_jk&>K0V93KDCm!Eiu>QN*{B_N(a?0MJhdE^~&0+Fs*K=IQG}Lp@ zZjN<-M@=XEA)U9kfx}{;V+;ITUH#L&bsh5qmRFn|%Fnc&6EBXOs7jq$0VA0MH;&52 zsU@7b5mwt3uiPh?zLV?3Sri(w;>d|G!#Yb|J+vvkJ8|OBC{BFP&2~2G>Z~or+PYXx z1a><&Sw_?a@x7BLgeB@r>T`nGYbcs;3E`jOyF|;L)zC87cVTfZH;6;UcMxZoQygbH zc*o;7(`hH+2-H{)KjuOX4hfq3E9iVzbeTC^~ic@Mv8&n$x zBqnZ7OibL8m^eUv<>YYuon-p_kW```hPL*EJ!JHuOrKM}wqaE5KWN?i%R!;fFNdWg zvs7QyhQpB}T=m5t=bn*Dm~JQg;D_;oiupt|O51Fw6m)h6{pQ?Gsdl3HkY%2#!t$WF z(30~6Pb-j3Qi=E-_6x&F1mrz~yNYHYbNL<>d|?|sCbPV4O~rP3{}{XP(9X$|mTuhj z_4R%mJ9l2yW&1YikFjk>4!iNKu**8+AOASELzrWU#}Bf67aI0LLfk)9XCMocr8VM3 zc>lmhh*+7Aklzk2Ba@|Vw(vwcU)tszuKo>sb47J0;im}i7U%bM7sZR%w}aOT`2s#a z_4Ii7GYC&5U#R_*aK4xBjy-ecqZESuXTE=|>?`x|MBz)RQ&Zu%;V_ov-}pWEO-iD# zixJN0;FE*=>FZcWvE_q(aSzwlh;Q=Si#7u_)p?|XFOIrQ+6F#;khZBOF<&S@jO;wO zm$|Q0qS#t_ubI!^?{Dh8OdosOGJW^}sjk;)I9(6*Bp%M_B3wA5glp#Wa7M2_T&BZ) ziex^MRUGCl5d37%tP{`N(vVRqkR0D=#!lH4m5RFkdNKxTYr$m+9ETnNNV`n#K?L9_93t z#W=CIjZOg%XB&80L$Z)pAN~gqKjs)t#=s{dSIvCAPRQZZQ}NvrAJw!*_?t?&;u|Ke z;PKy5!dZOy)NSMbsU`zfo|t@yeztlz%Y8ph%=eFlqc?D0HR&w(0W>imKzq1MhxvAK zI*>PY8KkcPJ@gNm9^TXWs`>WxkVnu(h)kEgUk&L)dO2TGY2D+*XNs_0=F@u7iO&>x z!f-yV7oGUDg~Kn?U87S`vn6OM*E_cV^X8xJ)drliN?Q}>(EGc zP7w?0YHU+6pIdCGK{aYrMohw^ebN<|X4TAHv_rxK%Zt)$u0Cso@ifnJqHi--m3p%{ z=JWVwe$9Ior@3{N9$PEr@0%w5D~G!{m#!bLb{*%tHtU#HlRvD2ZnR#@GP)Tvg4dgF zw;$}Iu1QVFS!5bY-I>eq{I*fh`&`yP1FsR>rpJZ{*6EvKmbvBms+K<7+(&dDz}fO% z+kma?zVFnGP6(Ok1qNKy`9p^|F)(GsMq7TGV&vCc$?rZYhh;n`&2vQ4+49=xmFiaV zc+Ke0fCqh8?y7S>F_DL#lf$8vZQ&{p z9)8|2oGhw)TVv$mXL)#{uwC7up3YSCSD8*CIi$WUhl36am+9ET$s+3>CpsyL-h#Y4 z@{@uQ-qsJC__2j^x$}mvrO6L=XTx&w@I*)c`JBOnhbK9PLoaUAI?_o}_(6Z3=s+h) z;YT{Fa-?Gmm-&J3qrwmRlV*ofKRjIKCz%u~;VKUvF7smxxA~QA0i6qSJ&V6* zyUTP^=#SQmj2~S2^%@VC>AsSx$9EFMdlEYqL^#j*Ce<+6c z_`Dmd7L+ai8*%TOj=uNei!bUP^;P{#`XgRgO-D%3AZ(tupzbTNJK{%>Xv9y$uPJG@ zxc`Won^}6<{KO56S?oTgOk9$NrM1_eZPB}DM$(L-9k-SA-8*R4J8gRQjE~Z4)dvqB zRuyginxN8iUe;NkP`&K3hItj@ zHVo`SYT3aQkyjv2s=~Wa80G%n@u!0R>ECI9d$H@8@`|T|j_L7TbM5-kgKz6=Zr`3K zfBB8g)j&^M33{f0BGA_c6bUc$x`gVuz-H@nSo6 zBC~^8J3oHHyd3%YAI_N$>xX=4Wgpqp7%wQ|h*1KqRn+s4T`H$u8+m(lWMl&hj_ST|NOX<*dY10Q_4X;z4o zqXhm&4@QmJeCg9|vx6<04Q)q0x_)?Cpmm0@A)w8eM;{%ThO`$2Eix>M=6PiIr5g_mf3L8)jfd&3gbZ*-`F!NUf02t4ZFd4LKy-P#<$yT{b6ScW>GePH|oz%V2PHAW#t}$2_#RZ=@?3iU>wPkkHA*@^CI4O)@ zT_z;o-ymB3yOz57P3iggtg@fl|5!GCM4Rkv*VARgx1(?3O;+!g6Bn(Ru)^Q%RN08_ zL0T0$WAmue-IwDY8iCV59wQ!#+diR__aEPV_v+qL`kLQVb%wUHwq4pd+dyxA_v*fP zp;@?2QMUq*F4)n|2cL>^py_52_)8xawoJa0X#Wn&^cfE+=5U`=?#R**kciPFENnU{r3VY!fbNt&%~ zDIJ$K{+_S-nx3TFq`^}5@4=ea=}_9PX#_#7S$+4cSml*nxD7p!f4-PFDQf zg)a_XpbL=*6$|q5W)V~oI8SIc`FNujWvWW(L()9DQX2F8fwk+_tXa4A!1MI+=l8E& z_voYR*6znIT-VYU4j&%SzyE;4hox?kTI!}esY0x^>i&ItKeb(&{p}ah>}^jK7Z>;5 zww*4y@-1Dm{i)ux|EZJj{Cq?DO8V}n8}Gh-`t;lH-254(47vI9J8wIdArQSEWA$I* zA3hq`d&RC7c6HQW{rOUC7Zb$-%WLN?uZacP$$zmhhsRn*+_a1kH{KLsRodI;zbKcE z;(}{z{!%lxbN@=YW(Zw{q9?3}grdi-hpdO55Q?ma{(1qW8tXJ+Z|D-)PIIuzTyQ2>vD;)l&+RgJ45*nk2=5FGxLhI1#tYifrs-*KrnzIK z9duNLto8n>FDi8lqh->Q@v>&TRP&p-|EBOYQ_--mtOYkM$xP$1zQM;7o|oA%ucq>A zm}iJ|kPh^c*3(Lxy8S0tWVENW%ZrYYszU2?7gpV%eZHq}+8B_^znAvju=Z%o1M`sJ zqXW)JIE`dD!00rFMbeGZz*q;xA1RHZ+hgSlVB;2kHj#cQ{cb6hctOS^?hT|nzWH2&4YUsmfl%=Tc_IwGCryf%spN< zGRZo|C16WhvpZ_+KVGgMzv|mc-3#)A*`i!eP)ZrNkQ;M0t=VROY1p!s-BM43U2foY zhfkT|tloJOW|ZA5yiqp2YWxa+*Z0ch;j_d;KfTA}i$=7`$#y$kKBTOD2;;R@z##ur z{Nj<+L%KC`ar~znW(P>#%82aZ@%1i(B|nOBH7QBIh)71SeQm*<5XzQXzTsyr&7m2xA*0FPk#?zx>{=E<9gwxEo|yAP<&N-!s;P-hyg;y z^`p5l`N8b-EjV*eQ#=d)1EM-;= z%DvD&7Zh>kfXNrQRH0%b*z{iH>|z{b!=MwZ&NV7Tv4*7L(Sy>B7mvKp_;t3(WEG*z z3%T7Uz9&7g?=;wZulmu`*6}s+RFBqRswZ1v_4V6_PYE0H8;0Mu#LjADHdtHe1?iQ`a!XOFUwwl|RguCegLCf1q=WOt0Cxqt)+SH1cuH>J=`Q=C)oa z9+G}vMvso9N0&*zi|CtjN3`p9_#eysWwCKm5i6N9Ee6djSwkoaBJkt}=~dch!Cw**2u-FRNgbqJ?Nxu+s>Y@(-*&x>wV)ty z}A8E^(byePzp0*xr-9fiD&-T=}V zLDP5^xJ5{`AAmT~h!YK-qLDWG8rEhBPzjs>E(3^b@&LfU31u?%0YJ;N7}$j6NyIk? z04YExpaPf$tO3pv5{tO8h#QNzv4?=uz*Rz;CjiK|Ir43eeBtOw;y@=3bmBlK9?$W3 zj>mI6dj{Qj(2WP(_&vaJ-~vP#;Ry&&KzIVe6A+%j!fz0g7!4rLMC6%>JQFR1B>4fz zJE;oT0UQOuXVP^-l2t$mkPZ|9!-2WLI$$qw0=Nv^A|%BFhz1Zh1^K2R-xTDVf_z)J z01-eo&=VL9EC4nD2Z58o72r009>E)k1zH28z+_+}RPYoHXE3@ih-0yV%H;2L2| zK%`XwkOFi9Du7wQK|=Dgfuq1_LJIJ%0BKvh0K6fZK$0!uL*~+o=XP16(7da~W`& zkS?*n2Eal{*U`Wg0QnX50rmn{3F(IP-M~k;Wx!TKx_bk7?tYSx9x1>q0A=c#0Bj

|q`x1K0HAFB%YaJYEFl9BHUMD*5Hz)^s` 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 WBGH#2=jjgXu#A^zS( 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 Om=*td20mm4{{I1X6+G|& diff --git a/dependencies/mpdf/mpdf/ttfonts/DejaVuSerifCondensed.ttf b/dependencies/mpdf/mpdf/ttfonts/DejaVuSerifCondensed.ttf deleted file mode 100644 index 3291fc506c9622ed3ebe5f17bffc6e31524e9593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334040 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

    -Ou(;b2@oo$80Bu|E%f$m(Uc} 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 kWZY8KD*& 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%0Db&Z=o{#w7$*SBMVDC;3_9wUu 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 |FG$&3I|Dv*glRFKg|c*G&(*SXeR>Im-j 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

      #4*8&fgRhvN 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

      |>IhL1)l|ZsWPzG#oh7MoI8SvMnJ2 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%0Ams;Mc*2hRI)|%0LZ02TkQz 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 z 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Ð|I*_Pmc|eXR0!=O_ztl& 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

      {Km06}m`8NJpazW+4S6t=gcV89M@2ivJvFlH~ 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

      &Jk=|Y>~e^lVu#3a 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
      eAy~A7gTw~yMfg>UHH5U%zt(|@WI7|p> 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

      CL zv-Kc6XK)0&B8M89nmZ?1Fu297#dIu&7Z-C=Zoaj(wQgPNmVOlz8C3z};>~w+wd}3*?+m|K2mj$G>nNaXSjYv^n(AHH@qr*(*V0PeIpjzwqj+M z+Yo{U_a5v34`Xh~`XiVJXh(|`Bl8~7?a1+AyNj;Wt9bnju&@JVuIe82IVPuA&+l

      xDEryezMpy< z9g@bJ+i*I7uZDJ@NJ1mHDwht>8%tz3^!X}QcK+l?bL3|d?}`6ho4ks=X=Z!{sq*0G zJV*?9a$=J3A4a1&fRn0`G=o+`UOf~EV6Dt3W#7l>9gc8 z`<{{*+PH1cK~{1;0Q1De@@Z?5P6;L(m)Z#1kR05G{n=?=HK) zRGR&QyEz>VgkYi-9`qNRn|f9(mtA6aUwxp#8TN#HZb!Quu^Zi1Wz0B~>$IYw3nvP* z98Pq|jYX@|O8*y4Qq*U3^hMMABq^SAnGg$w>pusJ`Um1^!;|Ffwx_6{$J)7s;cmW_ z!6vd3Ht2S2TbK#3V5D0z3}JNn7Dh7QeHlJ0`EitMh(#hLWsF-v7l|>ZJg97fA&??X zi!^gtweB9A;V{^SjG1M~1CZCoxEn;c;aNd9o5oAL@FZs+#Y|!W83qMxWn@bZCkraU z~`P%xg%J)#$Z(6?2CNPKKs%vnw7RIt9m|OA<{c zF~=Z;${SRwyko4!UO;(3K5cjGg+`tj- zS?PGomVNsf%lIMeWF$HpkhO>V^cTQsCp(MhxL8R)*;zn$+XLNgBs1F6%8a{t9n;-@ zS=Kkg&4P4F##ik-_xSS!LQs(I!P!sI_7moo&S+4KyJaN-F{UcO{Ykx!maOavKV6g- z`D+D)n;6DHIDRpHaVhx;Jdy<0?B9A85=NGExbV+DJ72PMxvC1?+~A@^82GrpN}rJz zGD&cb?U7br9cPr@+!L;hmdjY|Rq{?s=g3r_>b%^VZ#EZ0Z;I2{? zGr6QzE^r85V7o94!&SvhU`en*&*a(at~;k2YeR-+#aT|EQB3pIk0NI>1343>X2Q1M z7V5$^l9*S&d?gWSn%=#K@#CPT23X=jM4w2mO0jxPO77rNDvp)vu+J z@$h_eg<2WmSRVOR`d3EA@voqF11ki51Hvgf%WDx%53pC0=Bxg~lc)(umd8K)HNwtY zvVOq`zR6yf z1LTt!!z~#sNwRpc6zc-cGEOfd3+2JZ(#UNV{D$#iLX;iXR!N3FB}V85~R zyto4A1>ZC3kSt=vB#IW&1233tKFEQa?T`bvWIe8+ewrpL$p?cg@C7&TKYaZDv!AB7gO2)A zpZ-N^UvB^08?-Equb`3Qkg`P#RZs2M&18~S$hT(|&4+Jlpe&Ls{r_v_eDALy-pA~Z zY8#5&_P>6mP{(AU_IPcJan1hj$5g^l<3B5-nD$@0EE&g?y%U)H~??yg@Ld7?+ zIXqP)&ur~0>dfWnQ>ZL-@|^;+Rt1{1DiFTetksLfvcdH>H6lrF_$`$bhZX+fS80tk zQaSNEMeX@(6>fr4ex6mPo+o+XAU7(ps+B#wE4hb>m1=10kMphN9kucX?@GSGhPB^# z8*dwz^k2gw)UmbblKyRMEq#1z`3*d~1;wU{H}%vrpCJtIk!K7$A138`?Oy2kipE0Q zn)P>_dGNEZ(Nk~8+E<8uq_21rOXAmL?JXwqjg%eQ-Gf*XcN66nwSys9-$GM{-&AG> zcQVyB?I~G1*{5Ar%6;e1_Gh}OC~;j-F1MV2^tE69HTw91{9Z6+YCrw_moz-Y=89s4 z)ho8q?_QKOCo4LHc^Pz*+ew^6}QRQISML-IyC!YvZtE;j3+!&G8N|$J;Q%1Fbs^ z)>!4z^C!e}(U0^RiZ(u!Buw2U|xCrj1u;*00-$y$e6*_bx+a)E~~ls8V( z72C8<@D=;juQB$^Ijq>zpJ#d9(-^U#72Do>*OB{Qc=emKZqNn5`D3@DkCGS&vb!GuoPOqcR!WR2Gp%cOzDVzW8A@2a6ECq(FDRF>I(t6- zHd~u$yw0sn@O!W}RRtu(kG?kZiY?7>>Y)S(sRN#Dj!q7y2p=!=upOE}sSC2AT_+11qPplbv|V zI~}yM?K}Y7!!EfOi)?wZvWo3zmGdVLoP`}1RUc8gw>Ys1AEDjtQ$_9IwaQ*D%CJ|` zjo6UfeEW*2Wj9GYjJhAiC%UD|M*jT9B9R63y$1<(yN^#HZ_=NM;9c)?i+de0XM`yy7@qgfTB$yV4ywm7%`=Y3I2Ar|4YlDL7veE7pOtB75CB1t012?y;WSR+^cju1G^1)Yk7OxomSs!UO0s2J zZn9;^isLwT%Do^Yd!6Uac$3}qeTg@jcwe&droPD8Oa_kX?%kenjLjp!i~$Tr8|g;lz%p!bokX zrvK~01;~=jy_X+mv&+k%KMPdzM$XR=uVq}6ik-~Id|8>sBb}xL!%aSPotYNMd_W5 zPL7e6=7Tw9*9Cf%=cjJ>sRDEDHK(&AolbzVzG6Y`;Fh!J9>)tPvLM|Z@Jm#d1va~MW%0JOg#kdC z9A#XZR{|0a8W%`#6ozOSBd-YM7zRcG0!3)!T~^%%rGf})6t2LdFwTUZi)&~ui`nF; zTH~+3q=RH2E~=KSmhF!o@yeJz0vO7Q2||$I;={#4+7XOmhRTVs-4RScY{QKPQkFgTOn4i;-Zzrd zk1#oXg!+7|n9){(%*{Yj=a(Rw&OB9~L(JowKWA=I3M z=P}@L4Sjxye>M8r!Q(9-f`$>iuECBeYA^on(lhf3b0#JMnKD`cL+Q7uZ?w6YgC|ch zl2yof+ebU zC+fQQLQkMOUJLzBFO8YTST?WsTDfZ6isTP$FDxnv`m$+z6OGRDqx9M3I6e#H;4rN0 z0BkRCfd$BXFD(5eUiH$D=xbA9y##I0Ci1h2*?CF07uYKR15}JEE_b|9_f?_C!v`oxFjeiyk%U_lx%3pe{c2`KW#DlRi z8VYMwmbi?l_{3XT@yq1>(M{|6Otf!Z8I1cfHU_#;)_-g>9b>0#WfHSLkgbd;7-$&E z#K7Tt8Ux^v7RE?za6qabvw!4 z)Es0Fc-Hsgt@}+g{uV-xiqu;R`F;rbF;mEi8wWz(+7$BE-SiK&NXS7hN=>Ro)0&qW zMz21#6$+MM%`4}PL3H|5&+8>+ZJ<MDZ{3{*?HbZ;{5yvAkKhFEkoKdhZgC1D%2hTqb^=}rO_QV#s4Q7 z-B-<=$g4NdkG=XDehjRV7)5LREKL2+D#n+f5GFj_cpb0W2-@^xs4uC+Id(u>v+QMV z0!`C&b7CklHMes6UH858aT3^9HT{!B4{wZp7QzXxh##NOe^w>5+?OZEbMxZ7fJM)Xt5!G|9?8M5Od!lUz&1Klyq3weQ#Tj}zo+?ds2-?Lfee@qP z=Lis$nRXl-9pbZeqnIo`APv7-=!h%|bMm*h8f_vsP3p6*)h#A%Un^Jrc6TP|1&OMh zKA4T=9K7(5^*1lWDj=u&!?B^svJ**1$(2fLt+vJH*bF!GPK28uF890;|0IxlDIS-e%kMFB%k<*%Nmy5jSpy-j%DfTTYOXBUgKZpI>X!bEeFLK zR*WBqV%=FcUVvg%>P7=Ej+0{TBgLA4V(o3{6N)~wsaQV&EU~FrV@$Ee#!ba~$W*K+ zO~rZ=gG2EGQjBLz#oFJX>E+aLwCg2OtX=!?V`mhD8cEIJ4aVVPKrkLLubQI`DnK)^ z>LwK8D6X25XeveEaLsuOC_2`T9X*N2;W&L2UO#^Fn$t&*^#X+sp7b-0wlU~b32H;N zEB#5WV@Xk_1W9>QK_?gPzVES5e)@ByIJireC}1}B5VtfEk9(1R;fxnR0HnV}IsSRa z;hS%L=+O_o{E1J}=Mgu5nlg}U@udSSkVYPHfuRrU^B<>wWLVSZ7zI1@u*7&Q$2HQ! z8C9S9r}Yqt8YEhVc;xJ_%(q;oG%WLogg?4CuB@m1;EBh}HJ5)|#rtc4AIy@ zsfHZWsXt|Rm<7>FgnOOtFoSf;-_&K&5CUPmhCA%FMGRLr6N&nl@rHh?X{_Nr6tG@_ zzJb8~nkKc^5|7*+$PVJI8|desgP(W9bEF?P+yebLVkRXMr~^2mk4+;9g&b*sB~#DR z$2Gd?-l*&MUN9blGxv}}G?{v}(Y?l0y3s~=$W*$a7wDG`HStTYVV9sWi`#5gF{Yq@ z2iT{Lui!R&=w7&2+B+V3nuPlW^^MX%_=a1bVNGVmSJf^ocB5Wf^!Exl2|^>m@t4Rm=)z zLJ|scN!Q+0%UW;IN${hR&9VFLicBg0CBe$8XIP%JT;+FfYo3+pmMKhJTH}hY|ABw| zJ#*PL7llWdkSGkYd-84*#PNgD(FwTgTKg@oOKv(LYQ} z+>Q5#x7{~aPJ558Ke@^66)=GuKL}TyQ$3MTw5@v%IehXP|I`w|J!b0M7x@ozozHLA zxsO75KCc)rLa%;Me#Xz#jW6J*-d?YM`f^f6=v9xDahqN-Qbwj%AZ3Je*_|;ju-OJV zikH&bQS0o&d1DE&(&Bk2-`d>l0%9e6-5x6~EH2H?^Th!s$~D4Y1?LjY&&yK;HpgNwl) z^N_Z|CZr{nO_PBiP>m!;o*66icypN?9mD`BG@BwF#Qqm#SO+uqUf^0w%T7KlfbJ;?*>XZYV*Z}JmUE17il!I^N{qm!Ks=CzE^LXt0?Xzb>4_zMTMa zU7tj<(e-9$lB27368&;SBzL%JtkSlftn0oDGpKX^5U5{$B7=Yg7F z??{sT6q*>Qa}LEr^YVk|Y4!%Q*GjCsLcD>07d!4BzbrZ7ZF}a%t&PEiL*C&Fwf3}5 z-rmj}PX;yj4B8jwqq3w$1F2-9oGl6|*Gt05^(XCuWaa;Masup-lnlPXlx=gasi4Y* zp^zh%4omXx9ntaO^l0GONI*=u6g5!HTVkQGzbMP{h{q!c&XCw>L?nsEf^p&o2D}L$ z$C+3;KX-up9I+?qBMk7WTN@DHZo~vEP1N=2rZGu}gLCqsxek-;x@FUInrU>(K03$p zG#8VWdK6I8{QM>63E~uO;uQ>R|D90#2Cm0WN{3Oh`;fG_#xf0r!fGt zsYkRmftzLQH501dCe5JIERR+b9{ofn<>OfUigp0T^}$$h--5=`jFRUE#z#taj|gJ? zVoGYSRI={mnM;aZ>1xzfXk5b7_{z3?D~2e5sPT)QSg7P0w%NUbsAA2hD`|J__)lFH z%7&}!dNHz^+0Mwgl{W1arOfkK?VZOG_Xel8>-uDqs_neK!`%2WY<$Vw_^C#x#5TS( zNgH2c8{fvpmsk=;PoS;C)SzI4C39#%$7YC_fCj~(K|z96#?G&Wf-wY$Vfxy^<1IY` zGd%ZtI2KO?Lrj;@u!d*sF;k~h2}cKH7&<-Bnt$~}qCrE!kr2!oI_OKI&?zG2yzGqn ziA0IN+R=P|GbCzUaVkf?-7=Nz>Zeh?bQlmWgFm_aF#0^$J-yiYN8!Ubhai{YPI14% zb=-uN4PZ0{f{LNKKGQVz;}Mz`^QM9TA-lV2?4)zLrmnj$7*6k-9XEqaxH+5%*b)*j zVM`c{XP(`jMrSNR2R61FXO|eGhlyo;a!fJOP>&-}nj?wfnR5(x2yojNYPNp}ZzDl=LhXcS**wiWP!W3%(=7u%TY?5*Fxiv|WC-|kbc=x1 zAlrT$_Ea{w?6QNpV)WQd%q@6lV~G*VVj<}cxucTpMLIq^})3-llg&=v}c~spboPy~8v1nCV@Oay6(2*vz_)!PmKkb{&X^>pn@10b0l+R-p8gM~r2RAZX80>l{ZD=nW$hibYbb1$u6EY{ z{)bRo;^n$U_)DB|h)Z)%@{e+zRh%&+a+__i^X?p>L&wx*I`lg0PI>^39z;HGWtz z9)ucK*iX=$4)SE?{_-E+YxWB7Q1qSWjeQs?vvU4x|Dc?Il3upz6adYgH;%f#5BT8M z<}R*(8?U>7@LgNpvC~(zVg&Enk;6wJG&JtpFs&}&>8S}L2%+kDb}>p8*qG#m@jxB#zyv+6b|N<; zazZgy>!j{Ms~=Jr#0I|2#%vcf{_V|-K)4pPd?Nc@%oX9whKQHY4;QMLwEbWds~_qa zAreTh)t5OkxoL#1WNNm^nnUpi2A)m{mPbT!$RP?sVcc??t>8^7LCd~z?aBGQsDyS3B-SO+r6BUSxhLua+eCdEdj$x6uPW9kTpGz~i1lextU+aQdWgjO zG*MX$ou-FFL}h{bAYlFJu9)U+U&FY+C(b|r{nt!!z5@(+=Z%cx`})1x#rbB4^DXC% zvg`X+y|jIF(muR#@Vs#df&S`wyhl}0n8L4pL;CK=nZ)l?*7ol^2sy{sZE`;E${buh zbjuxg-do8#mKCrGfJHw|asL0V??xh zYF82Xx0m4c*WOMv`@;}>p-8Xs0uA< z2HDyrvbsCL1AL*!v)Y-9lGM#DLh7O>fw(tLFzOH^gDqnNsc+eIo!a;E>j%8 zvGeculQ>#*AH+*NZxqJ9uNP4W@gd>tQ&9rx`U*u=V{*fH@DPvKr5c@s9H1)ERNvrS zAxCX^iV`?EM2u)(<_uR250Exm#E{M@h9FIf=6pm(Xn+D<3EWQ^nmHb#0I`q_Fz6ko zCQ?yi7I3{1rXV6(1X&?PiTsM3A4)27qv7EGJ1|vHtjE@OtLajEpzh%xKMnl6P}#Y+ zJUy77IMVPG;)7lvO(Z`j{4W1Zt1mmAPVTrSY*}6KXc${KH=n2R;vuOuryRRU8!vjI zbJy1Ws*-qktdUO)g?tw4zL`T4Kxzsbf5*9mv%&!`!`;sPDyQ$p-cz1j0Pn_ibpsWz z&UHDQ0C(N3I02Nq)EbTn9N#>$@cL~Rx;L4y-kTKTFf2mCJe!1Kc<`*DaPjS)CQ0}T+Kbf1>Ek6?je_ADwb2BC0Io<1RY)!C!>JV@jw2tRWvK}5=o zi`)Na;-}aeE{$#)^s_ z;I1X!;k9QnF)iv-lErW^I6PQO3sIlySYMDd8y){h@p8ctc`NT77wl3vSqh8D{PbmK zd_JstFOi*QK05A-rW_8z0y-d!kcgN3(O@DxmX)KyYFM^p(Vw&NUm;6P$dcI~x57Qm zCpe;OD?y%s{3qz(!TK8K9>uUYmdrzkbFb-*jsD)Z*?qH*b>Hke2-|{Qw}&At^QM^1 zEBYh}%cG|3JX-HgnvW)xuB31c$dd%BCx$5Oo-p4!q3GAq&(zFc0d%9;w$r(ek#Jpi z7y|Y_2-u_Or}>J-n>ujMedibxjs(Q(t#>>^CVmnPq8*_GNh8)aLtMsp6r{%{jO#$9 zV;n;`4c=rBaZ_{K6KZ#8{S-63+*N28O7&hX+u?zo(*)@f$akueJ zu5&Hby6lhyV?TUh%ofeU!vHRpaNM^-F0BD{81{Gtft}sMd=0Wtz`Jf5Cp^)UBuzai z>vFx9wj?)1g`k2sihc&fP%ZjckN$F?-h%~pS_9;`v_L`FA20BY#lOGF^o|D=g#1P` zNz(XmFY zcCA+ir6iDwT?=L#UHkb7K_uKe@d86#xrvDR$g%)kc+~e#m2?I3pX>j+7xa~+)2h{D9;a94!Rrja@w*#0_wIlp?wxGj0$O%DIkwnb74{q?ZLy{iAx{xmmZ1yX zfiUNR!T|bBgo#|E=PY)DECCt}<7W~IP2If%pGwv{i6kjdB8H6{#>NdGtGQ;+IrFq( z=Em@p#l)T@!Q2{9nJcH3+VH+})O{u4O2%+;elPZ7J+^zqE!ue1raBdms@O~GU*`Yl zgpVJ&e$)~d(pg-4iKqBKY|ism3c}q=&^_beU5&=Y??t@hFW%=UMBR2dC)(yA6-li9 zMb@7xbMv(N={oV!b*3Hk7f*vz5SLRAL9ds|5Mj0cF(>s_zt!*jR-*z*Qc712P~|^QTk?BbP>Q#h zK)K`KuxQOVdj#XuW1M(Oc)5phc*|Lm7uRds5qWHcDfysOGre1QfcXte+_S{_*OeIA zUq@mrQvmL(CfHJS zLS$t;)SFOqf*KO%NK#<_9))>r{swGjT~34RLr6#FG{2l{#71{d4&4y)+OlzH+#5{@ z53G;vo_RDF7#z!bB4O|F)Ihxuh)Y7=_Z0s>1A;3wXpwB|4{PzcvafJtWWVa>ZK73` zwMJul&HViO z)0ZdX@%Q5V9}}|d@0GX(PUkwP2NTt5cgn*?cSC6`bmEH)haU`cGAsf7!Z}>G=CnCu z$&Bp(?aO~{+q_Bvrmw}nkI7+Rky@(`5||!ewD8uhNZM-*TqFfCm|>L z9A?r*Ow1t8EGuabsUjj7{lY zQn4I=H*M3+OCe`U>{DS62RyNTzI0@Z&^l=Yq4ki>9r^A_-&4ZRO$41|av|jQ zYj!6Xtgl_?L$%dGr!{TAl7!kJ*aNIbmE`eeVS(*UkgIY_9JMrCD%cxF$^l~00JA$G za|=QN+JaC8`V$Dz!vKaL8>sXcAu3{{Jlb105gB@c-th8h9p+UZa5*s5rafWCB*&km zl|CEuJK|Ya#t)vrVtOo^DmQ}a$%*8|j_O@Q!D1>atGJ_Ja=)s&9g(7((RjsGab|+a zCjZ36jbQzrfct3eSkxss6_qWCVZZJc;#iZ5^Kvn61k)b3vE$b2`f$@2qLXiIXUC1w zDOO=BOm_B8oCWgnVJtNor=>dVnK(+9RVNUG>jIOyou)QK z{>vr{F@%8i`CY;|ocn`5!!Yg2x3*Y@8&~kq@?SsMC!l@pDPep&lkoa|+U2yty*uZu za3^?XMQ)M%I7xqZh!M%s*h`SeO1Nw08oH;hD@{YDjag!3_XT$57?EvMvFZkho-q#! z`9|PXuuUdMT}NXXM@_*t`IvtAJlLik^aJRX?3BmmD2((WB8*YkID|@FCmLh9tPrD6 zz%(99|29Wf0Wh8(X=+IYqy)eosYFwovd|i;flw+7-cCQ+fUe*6EZTj+e)SZ|(;I_o zLXCUYpA-T&j+PS{OTg&~`$B>Eh*Ol(F}dIir5xp=BnJj2MEhJepN>SH5_T$OK`q6f zZ8k4%jNn%fTAC4iI2^It#B4s`3MDOmUpQIJy1Z4v;#z8FMy9j?yU)Qvc{lj8e-eAU z!d*|jvsC?tt7DAsMD}M8k$R6N4G1U;E~8m&-5$2F-6h6{*4@qKB{5Lck_8e4{Jg80t^+K7s2M4QrRgm52%oX+^GdpPZgIsMHf8_1khNC z>SlBaA@xu)zmHidFU>5iNf(9e7K{?Qz$r;^4R+<*Ig6mVg7s2ei^T%MFOR3<<)nT6 zR|Lu8-|kJQnu_wW2Q)4?M+hBrLpJ3Xb?PGT^?dx+|O*T#?5grbHGs;Q&2+8q?hpx!~m8w_JCm9Nu?X^ zwV%!t>ZNOEE&d&!o!0Dw_oCYsa$pP&=C3!#sFS61^?a6gWC3s4k+V0dv(Q5n$Scso zDR|dLm1d$0sB8JkSc~p^S?k)Js(;%(e`yE)w#H9*)Nj+F$-kd8@xJXH^xOM16K99t zy0a3>*uA6+eyg|g;>N_c-mWL|5&lovp6=j|_q?inod^p%`9<1|JOyOi&|APdWYEoP z-fNZ&eZ&IPmVq{P&d37_*RjX}*e+vY5&GAJ{xLfaZe39H{*VB;9HZ`S1pg;CW^`fY z2S>c|-}nvz-mIBBY)|ojIUTO=j3^Y8C;?o){lTyXhn9VYKW>}WtdD_E6Q+rAJMnUP*+RvI{G}G>Jb_l5j zlyt^Hh-){mwWe4e2Pw&HrXRMH{Jl~H0rG=BLV!|An$afnM2bkvB}rTmCPopBWafmw zF&5ASU>RC-BKffVOE{bFNbz7eC&k15!gFVKW1LfJcD12+Ja&818y3MYsN@4Xa^?Ms zYztengNfK!So~EXyZ-wY2dG4fk(|R8UJ#$U#~F#Gqs~A~LPPf#%F1A(r zaNW?T83wf-9xjkB;XW~ESD;IinmbKmicTg)dy+vVrjue;Aq5wZW*ZtDF5)#UTCTF_ zh|S>!IRrsAUAVW6R2KGhST&;X0I#|+go1_m^+HS^`NNPt!f#?y8#({~eQRTGA`|*@ z*tyrO5Z!(O-HUCNzYvkO?m}d(OlEb zy)`AcB60xl;yOOkmN?3LxI?!gN2eKbR0XQd$NUE$rCX3e$bdnTy!GvSueP%^>R%l}D;ZP&p!_0nNFdZ9w9B#Gw#_0E+5>6_zh0j*J zn3ZLH%Ng|vmi#VCW;jL%N3K&{wwP@n zQdq4(IAYVy1U-J*(`&=O;3`J00VOB0wK&z?owTBbb<^B8HE3h)Lr*_ zW=AoUg7SEzK^UmGYQ8qxU@QjRvn&*32#_EORBMCv;XQPk4&qRc=9;bX9s7@8i&u=* zvpCrqoM-en9vq{|?XTO^{i~-4DPUxF;6);=ZWBW&c{i*t1LN0FrbjT12pS}xBJ{7c z?UV(&s6is_m#Ced22Yp*0cmLaDAblQx`IT2SlpnBO}JXP(qHiwM}paK-7g)SQ9wD> zvZo_M{;z%S#UY%C!=0GR+pL1sp6~|5Dn<=i_QQGAJ16>S|Azw>(~&VF53OUEI%?g_v>`VA=#TAO<=->)9J^c6Gy3*jA`0z z0hkYq)e#HCZR_v050#=NA9y?`(}595nU$-9{BSm1f{qGYc;mzTyznh6oC;EJXp_l{{>3$?WF`CBkMCN(AA2f4^y3Ux5BOBo!#~Bu=%K>7)dCx zo0&!9I8-#?hpRL(35Fg5&voYZAEHOQ!Hf(qA~tZe)?6Y(X$)7Ol|`CWjB;ikI4a$( zt&O$X<9HJ~izX?<4T?Y9HEaGrj(S0iNsv7lZB`j;)1lxzSTdeUk;M{n6@KFxigi7Bh)Ok?@(gSY_<@zRokM3$zepJ z?Mzn#D~ZwOe#!N{zwiv7sX4XjagP%5RL81{)8dt_yM`l5D(6YBj7CPrv#&iNH&-h$ zX*uhS`n?`W5(P2fi{ym6PEDlBf%LIK_u!mdnQ_+Urv$rS4G)A10Ywv4KiO03#y@Pl z0KNQjPcM(*mijABzX25`)Ulz1cWu`}n&3E#liXLQtYv2(t2*yH;y~iyfx6zlK!Zu? zD907!W~kqGRVDqr&D6!)>T8+c&2WMb;;5mih@1)OK4^04r5bDZ4lckrJD95Kj=C;4 zyZ4$YoKx&K(6ChFW}tG=qi-Apz+&EEbF0zDz9Tmf10xL=+OzjKGsbSD4xzTkPu+YQ z9qGPV9O*cM8pPwQyXT)&Uz!>-i{`7#tZ^_v*?4yT_8havLbmwNP~l&*T0N1tlwWqj zC`;|?&<#jl!~}6=(ATJgpwZ^Gc`P1)buDp^Cz^V!r_6=rA4Hk?6X-$EUhx=&Wz!=7j^> zwOF{by_^xW7`0RctsOrrr1}x`7)esiP`pY9foydWvnyHuT3yJ(uE9KxmD-dvLbZz} zjZ#7Y;Uoe_Vr66FEZ0BETimW_#4GT=ShX6dh?w+f5y3u>1`S`pHtKSD1y8g&lc=OJ zgI2*Vds7j~ZufZvu+O_JRrIHoz;h|9awO=MZ6k6Z8jU8Bjmn5a%=#2mUV}E&m%qSE z9N|Pu$jsluAwkRPsc;Jr{n3bR5cT!5^xOp_4S+q+W@xVI52c~Je3~*Do&j2|o=|l+ z-5iAabu;QP2Thmh_yZ}tJv<^ZHw#POBJUcb3Py-3IHeFmJpwnhkwQ#f(i|2NLOG}J zQtqwjx4y-Hrr-M2iproT0q{FFriLzI$oeJpL#}^dV|?RRxd*Y%TRBv{4HZti3vH1! zt_iKA`3qgyR8iR^PPH+%kdBS9rrIQ&sfY-5jdLY4q-Qo&cVL-n5=s>#rE+0TSPXsNlA9SnUsa{pur{WU*MQDNls(rLS{2?$bEO2$$d< zp$a9PBafA$Jh^R(3&o+A^vCc(?Ap#7c2Ji{=XGAe7#ABFWPnRTc@K}b%6n9)dtJ0i zcAkxH0rtB~&&(%O=YyoTuV_3QYnx&&;zWo0Z7TBAtl27ktp0}=xII}Qkw@^A(g5FRU16&L2`e*0I@AaGn8T6o$gd_~85+9X$84)_xzaHf# zxfaWdS8?yrb%*Ru7z&?7X4w5^C(F18vnaixu0`F$JWT+sTX*lQ8p(9d&(839~|j=bFOw>9?Qh5kCx5WV9< zch&@4gNOvEm>v-cv2uxc)?4T-dBRhakXZ|5Y;2C-0YvJiABJ`Y%LxjK%EWb*sSPb0 zBEvDEqIr612OgTcAQI&&~ zwI-jd?_3NwR|abes)67#9<24bj1y`!lSl`65o~|~-iGT{?lT$3%W`(_=-2@ac#HUL zPN!9ogaeIrv{p@pr~iHQ+PHliQ?Zs%#iTDA=LNe1cv%n?+blItPE>QLf}E{otdm1t z8F@CFQ%sSgC9IEZe77fS6Wq^n9XsVs+;t-bVy8F|(DiQBZ0Rpzlohx#`saY6IWE_T z!i_>KBW8|wh!wK*A;rkz9PFmaMs;G_sYG!10830`)|rQ~{~=N6Mr0$)ak6wgeUKEumGwc!c@{Itf4k%o31P5@fNDO=?kW z(@Rq#nhmyEA6ABZw&=X)m@_@pj73Av_JrDuC;k+H^n-*i{1Wor;lOf4{eo50h&rR9wSuv@=|ZrK*cqnw5M zc@G7rhZ*m3S2VLG)D!0oW0e3cB0`YWgz1p9C9D8x5K3Od?-*^vN+DiDrcek;ZlKm6 zBuTqN%oo$su0 zr6R_J!?woBVw6U4j|u_g3+(tSTQfZUxyaE3BsQ0*F1B&80>1}62;Jwm+1;{L62(9$ zf*@S2y5}dd?uzR17wkZ|BK_jD2-o|x;$TV*BxT!yC}ukRmCbGu1E@0Fd9m)U4+I>_ z@*$6>R^216zv!yCystQeoG;2i#rKg|CF?vN~D)1-RWV}^LBct@K?m`o-b z{DBUl8U;98QP%EZTRTZs(N0E@@ANUR(HDY;K^Z~}pVSP&11a^X9bSQJfv`=Z8MlT9 zx#6y$_?QQR`=wagvXu}&^jVNFGI(CEc71WIq!j((N~2i0&5`s6LhJudus!PvrsI?R z`w+T@ugq|(4x}AtVsC%=wm>3KEz5#0?Bc+9Vq=@(=ms|ZTI+3^4J!6w1B(Ip|r9|w-}m6 z63Tun50_7tgjyhAv&RD8v_sdkk$qBU4dd=ybVI@yTf7B>Pz1_yTtq{>CzS!r^*1Wg<~h$c*92;UKn6gQq{a0!_VO z_z{Z(Wjp|(F@?EfWzjuGeSt34N~;*)@TU_(#ZPz~U`7!`!%SH<-G;rDVPe;uz8Is? zz-^MiCR6^4;KP*hM2{`nSG)r5hZ633(;MuO$E%Y+xhLxL$zBW%LxxF23PVVPb6pce zTQU`~ie41_oB<&Ui0ljD+Mo+}G{u1dIl@7rG|;OgABCn}ruvor}QwbTn3Y(fsiEA_|EwLC>Of21jy3b&M4Fb2g!8 z?a>koaOfC&&@-fddWh*d>T!^B3Ut`$*>)o{77dAZkIDdNyf@`L`Cm>3JaTQ&2bH&5 zw_s<9i#xOVpoqezQV7U?O>zNf*2Us~It13_gwv`z?1+SeY9OR(Q4RT3{^I}G_}0eH z^G@VeSIAZwX~K(V*tHlp)7){z5OBO^CEkb=jtsZFpmrSIFj-g&vt34-`mZf+fkmna z;l@G%hNA*-j(k!aW$*R}|G%*Q+fUbPL~$*DPRL*ae>wv>6;R~Z{KFx65{5zdeU{Mr*LIzX zI2&R_3=}GM<=yp#lv^57CMNC<2GvjI|4)lYj1QoXt~ruOMKZx?J|yCA{iBWbjWxc7 zI^KD%lOXS{Uhh<@=um7L9uW9@0iOkLgDw#SyG5IiCg^EKV@_8-;?4hY&3PD(s#C8c z-1I3{y-rL0J{}qs_xHc{-50-M$J;KVIajbI{0Vp>Ojeyv7dJ9u>~66Fk^g7EVV zAO42A7Z2Hg3~Fith?}LZTj1g|qB(3(o#5THP1Lc-!|@@nhvj1kVa!wY7(rtIbFNHn zMNtA>XH02vZ!w>a4!*q(Zj95iKcwb{y+~P!fQyC1U?RiY?H0j_2?>(j;vEQ_H7 zj-2Qb+pB1`vGHMa>)2}Oy|H0}g3aO(wN!OLvHLePbBy0FGfYQVyWvc(~Jg=1miU`cdKtl6CY5IMgNwqZa>fD9D1W)UA`35~IK02`5& zP?^DZT%S~BrfZ#5Yy#kIGUGN}q)7R$|9U)#8FkSlH~=Lnl(rApB*lVBjy5|cIg0U6 zWwcos&4>~Ch3RJem;J-#0A@OS9Jy-3A@rv!y2F#hsmZxOnDzvB-XCwQA%Ym@?&3Ni zRjRJ}q&$EMu84zXp^V`6#aaT`Dxzq$2inQN zd|Js(S_(3}F>?7)96_u;!+nv^f8DIPUZg<6n4p2kwbek%0>BN!O1B!6uX&*xGglrn z8KMh8VEs*bFoUL!T_BmUBeT^J7|=^VothxvMyv@PLUVp0g>48WstmaWk@5P0>1WXs z8JsMjm#;g0{)A(ggvN_rW`g|Bka>ch!FV!HG*B0YAQ#ZCZBy$}^r3i3k}(~nSQ-+y z4VmXBdPC$jMRrx>?c?P|Hh-S?IYNpyX&2ncA8$^F|4SPE{+CKR7*Ag^5?*Cf<8d9? z1Byj+XwI#H?l8oBi&t@9y5U{cO=P9vz;>qUdbVk#@rXKW$({`}YB^JOh^spSi)_+D z86()Shz*`O=TBxBY@-D55DX8xjT}%pJ^)ZEcErbUL696+omLxg49F6i)`d|CB`;i^ zAp&rjN(4#!nVr1D;YhdypMO#jy*|6ov0H?pIp2!E<2TEpfLpUTj<$mcBl!335G|gB zHRN+W>_*Mg<=ibfH6<{c-wR-%+tN^?*<+G5N_`>xS%zP8!DGZk(i~MC<)$u@+4j-> zQ#T6uhLkVohG}QbG(h;+`?=AM%mhUqf}l{VkWA<)w@OPbz|BVM8!;nMERB>$#~vIo z7rw3Gtx5SWvwIim3EZhz>Lrt!zSnPDn~p%Yi>>`U2EXnXA2D=6 z9FW)P=ev?4@m(Thz z9Z*@Do|=IxfUjGwKnHKC7{=3`%H^kLm>+XjBLM|l`{_%nIL~Ii&JDi zJ~_P*YkJyhAhx6`XnPjr(g6Qe->`KsQPr}=si~p-K$a=wYzvULt zHiXVPrx*@8Li3oYsj^HXVTOqGDuYTgb$X#uHbp5ll`*0@C`_Qu16++%K@E}RV`x1p zC9?gy%I1x!*ez_4XzpeIDZdN{-|u!wmU6l}O1oAW9q)R)#etNqSa`nwfFBQFNR>kk zHHYq|jT*>|&aY_RiKG0kV*9{)XY(PG^$@q8KZ^ZPP*12*EeI9*-tL5GcaY>pEoh5h z!;c-fbU)yik0G%@g|9>&i_D_YK=%_HpTX8oi|(!8k7gZMeo7Yh*N@cy+w8#Cv}jOa zD^|TuXK1uEdFi70c7LsCo(#RiT<*xy?(J*jIX55Ri@4Wf+!1tt)w>~v+oal_jV?1Y zZ{sx&*{c{>q7ezcNmV_AlBZqH?XhXhF$z)21Z{pEwD~!lUgi%mpbp*N6dalQKu#dj zhUdn1pI)d=g#Mb^X-P43G!Oa#=!I)|UaFA?~9g&d&b{{}S?N zHB?u1JIi4NA$drfA$HADECjS*?Etg9~$N$Dab0j;0am8K%j-zCx5*X9b2uLf(uh65*+o08WxNGl@LXRqawG5qFDL zn}bKZY2B4lLO#ze2Zw7n-r))blj9jFlX1!XOImKZ8f&FwyVvgItxix`3hVzzuwL7> zD>t8+wR*LxCPtHXhCSdn{(`%U|GGHB-N5}PIwNBliEkML44Q@)mr}DqmoeOYUcV8x z_CmL$aC6ugP)*V`w7|};BQB7A7G>Dy1vc8=IEqZ;QN`Hn$8?1HTJz|BRAm5*Mu~

      *Iw1Q4QlncAk&KhuUg*cxl0>WPbwjoj#mr73~H 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 XY&#~4q5;Y7|aquioOhV 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⋙eK`_$a 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

      >6zj`aRMbFzxQxtZS3Lg@K4^1|o<8 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

      (6-ydjw z?^2$s$BZr%LNUxg{9HYVJvD@A_tnPiV1GsTVsxkn!2rd#LTd@L!8ABTBGKH*!zhG{ zW}ih)FoA~?fGH%X6a$ttM{-%sh5T!1}CBM{3+EH zN}*JYw~cuSgruRYOJ&-CGHX_FAmz7M2`2&|IEKb7HG!qU*tB1M*Moocia$PS89gwb z*YXE3PQ7wsU~bn;=+;-iLA0crrxB8NgUx zUZp~f~=GEThnb=Ye;#T zCamYYO^cR_q{&Q>ga84i(_4>WN2b7ex|-|jC-$q)U4i^6d|P^egWie88D<$0C`R?EIsyXy3}nOK(fg-FL9FN1=H<=icXy3i9&kyW6G+VqkvUR(x*sAS*gva2Yok1_+8^B==V{$+UlQ49Fn&6T|nxP;V z2+>^xvNuFUq(!O$UR=a%e>RmV86G?fG+sBHr-b}39lk|_MwwK>P<4LieV!G(m z#C;yTFrmB%XHQ(ZOY}Mor3C~c4KJlGV%7$Z)C~|8cP3>psqnZ>qEt7ZZ<<8@3>E^C zUm*aN#4si)f{(51&LbWK1Bz~g%XRUeAYN8PG&M~m!USL`v=a`nipPcLNdRNU&WtDk!6>Rsxy&rBxG-{a10#GIns_QF}#7>yEche4H^2$H!l z53T`}X^7(^z~bNm`W;DNG*+rd&Nss%T?I8T#Tg_p%CkQUe$rG$H{O9?-Y!0aKv%&t zLt`|KkB12b5uFqS%(iu{Q9Xb`Mu9D*??{@XoFMRb9MeQqMd*&Uvx7v|*P%YDlMW;j z0fuR@04ZkZ2%q&S<#8w#%y4Y$2F7qd?)kiQ3O5KA&d}?lNWPnbT4+KVs>CkVgp`SN zA98&x^2jL>i99w;3<;rxlH_9aEcyw+Qj(%DSa69_n)EJ1Se;o}9afpVfaqmHF`4cG z@f;-$9?r{B=6`BnFS^jplfm*3qTOn+p;|Bm$V(*Y%4J}%#s%s6EPFlMXSW(~JK zjeN=Fb%7ehTyDMcIEjPOxrT{B<+Je5K4=s*oH+3fP%us^))}H;U0_Tba;%7Ors?xL zNoWZ03m@PY7A$T*p@a1O^ojuo;xkj`+WD?p$)N^`Y7Hx!?a_YE<46 zNkzObyRDEdE00I4>DE_D57bf?lxb462TF3W3PK#&<#DHf@ka}(pvPq3(Aw)dNa$!Q z-FQ6}>X=e?(Yeg%))A5r4E}A@w8r5b>r0r(ZHxuija*pRNalSGgL&Xgwyj0#$skl@vI#4$3k&HX5%d8&Ux1xs#$OI19a1F;a5Qak z9!Htk5grlHiaHXBaEgBpH2y?OI_ zUkYxX)jb*nM`EGe2bz24y#XI-#zvF>fXgwgf>8>Ka7P~9whf`l-$c`!JW1J)EnZ z*LX5HSle`u#~=7@eb!|_@}v4cIuyU+-uNDZLw0P48uImptAZf|A~MN2BmMcIohK3{2QS%4!G5 zG_pTNIZ*~cM`x0Zn z%WqS=d{2BqGW0cpn%pX?emh5Q#KK`U-IWTutSASR^U8_5n`Bje<_Hw9UbsfGr-+kD zNN+~21x6KME;FwMk@hj70GZ$_G#FPWbtJS^jucclomG(n{X68Y@SY6y5awniDx9Cu zd_-~f!YTzg{`dqg+1KP1TZ_HP%v?gibm@x47j?>@CGHwHXJ_|lDkyK*&(pwf@zL%* z;!rP1Fl6w04B`{s1;NrhHgtX}y`agXDj_(#U9VE7ctQ84?Tc zSYwJ83A2^LN+^Uw#|U6sJIsI&jihQj7-r)MCunIWXcv=}$(D?4OAPHoa1Q2#gk_aE zk;1qU)V`J#%VEXM%x0x|5QVfICX|2Jq4kG&%XuXd59iE;uc?*pF-CdcK2=EF*VuOq z+q!?e)EL=5xem}8uPJKs1fs0Il1ehH(rq{kow$33dT^M2bCXP6LhP!D;$@SqGa35mzkL;E5LJ6 z)EUOA4N1R7OJ*h^CPZgLM4ueQ(%C4e8Kj(rg#5j-hZ^={*eHlXwKC_0^&(E6V68*F zb(&SZ&J^ojKnJNNdpP(~v#eLp-W~^n>(gf@18d-ka-ehHVFyMo z?(%`lgbvV6(5CzwWjlIb>KpgT10&aL@pG^|Q}mN9f9avPM`0b9jK#$ogX2 zP9&bwSv(y>kl}O#c}d*AIx7cP&q}+~x^OyV?5Sq9s$jONTEvTmZb%gT73&_HP>yH9aY=F!xe)`=?fBUvIqHSz z!FcE}p6K7$p=+!@=k>o4AGwM^DZlNc z1(=sB?I=#3<^zE`jT6(KjD!GVh}%nsXr7B1Gu;U6M0qrKs#9a|rCp-{M5&Rps>ygG zHH;>06jczO$eL%G^0#1!dH}K8s9+)%Xj(`BXk{kpX-_=IMiCKzDO4-E=ZYEip?ihd z6B|rr$J5cV^EX~{;|b#Uc(VcLx$f)tf6Oat+58}C#z%^Y!Ks0Gx`=sS4_;@pmNVHr z)QjT6bHUaB!h3xW?{yUsI{N=e=8&GM6|T1eO`dJ7kEkTIG9VEU*am}>f-e*(tL(a~ zxX>8NOrO%q*!eO`pp|KfP_rZvd2G2AJCDH{)_&^{v>-T`4_R>t&?^uGF$B0K*n#jM znjcf4S_w2rq9G6zs58uhe8~v%{I!NLr<>8Ur`g2pt9Cbj@Bir=#Sd1jM?A2~E;jEp zUw^&z^Y8NLrjfBab?YHK3Nu)i?_nDujQ1odqELbljw`JO{6?PJT=P_vtV0igOarM4 z=B{L=X=KSYD_If*$U+DU>jIxiO;->QKuZ;=xVojvIFSvAHjFwcRs_7rzHyxK+;kpv z>i~&^O-bxpF^!=;V~vBCpJp3(u2|8pde*TpZMykp+kIF1*g*2qKE`z$f{&oayF1B8 z7&@$z1V3t=GC;@C^KIp|3Qep03w|9lEDa8|L$5FYVtEv={|nZR;?tn|EVyF(l>c1Y zKZ${q5Lrdp23M7N8?BIe4=()-46!$YE2qy0os>+nNn%VYlOX9~dU}|ObVWjsQKXBX z(tJQt03`T0A@Y&YW*hA|<0^4#wM;h%>D!3~Ho#O3ENsGBV?a}Z|7lzB_qTXkBczE! zgun5+HUc0X$|jm&Cw62G1C-FYyX2_OY$G@s{qd7Ctu4^WMx&Ra6}`RpO!_oNr7@tL z;29Hb6d|b_F-2|-*QV#qsgvPMIvEJaM%nnK3wVhCorneVY17m>n*;Fl-A_#B3ghB{ zq?V1|Se>n=lSMQ79f*KDxOe|-@w#hvU0zG3hF%^h*xml>$Qw7@vbVk-!}9V=d-O^s zB3qMFdtSB6_wrZl*pM0=rq~3%Uny{N_9#D=yeFOXghgGq_iF<2ina;#9GWiLtA3!C zzln8QHqBuJhvV4^Y~V1()qCqL1b+!EI%=i`b}fZ0wye}Z9j@?Fb+}!qn(XqnrfJg_ z@Hwiv(;%VkqhkbGNgLcVI9s@wj?&z^Z9DDTg1@zi8Z%ozXHFuhkwP}X;-;y+^(*0%UdrQB$u;p>=4maXbOLal@+ZBH@i>5q zNx7D=RTM}8=y%5DLI#;m93)@@Tw;)AS*Oe(Oxl6 z;7&mAI=n$sZ(%?`2xID5hc6Bnf_84vny$A(r!*&gIC>X&4#T38QgZYzgcxTG(O^pS zE-$eV*`Pqui#BMfQO|gbKA5qhyl1 zd3$bt!ncCN_qutxTWz(`uIz>Q1bg-Mcx>|z2h zCEp6PA&7o1)$IW|ZG#Mc47`oJ$|z4+Rwa}cT3WK^wuQ~y0`?oHk``KJnjr6`@^%eG zVv^;o_AXO&kLhdtl8m>$xr@O_wy~D<_TyAgo8L#xyT{O$>)Ruy*Be1|S6?*dp=YOu z(8DWj7kW{!T_`2$wU27E$AmCJAi7O%LE>(xZuK&Du5NY0!a}%Pm@F3MT;OghEH>0= zs|>v{!*{l)@GBqy;j>Mvd^9)P{n$7*>j{~+e_Nx8eb~UeH?x?51Zua zv{tNBs|I;P1~oJ@4R$Zn+A$E9S^?sc8A3ZEs+EAa2u0UeI{Eh^uhWbsMmmwSAR7hU(mE{JN5~qh0ku%xZ4rMMZ5G$XanSY& zE5L{cJZ69>j#e(RP{EamC%ANV0fAPP3+cEov;q8$0X~mRwxv78{AjxZDqrxD+p2>`J@8fo7PX)h#RsBHYvY%V|b;xo^@FqKQs zA_Do3>707}#rLWQy0z&thN+rU!{S>sNxoYVe;+d*AxZF5%I?32>#$4rb+}G5z;Z-^4%v&*jf=$-f7FqIeeb zAxegS)_?xZ%XMHir1!4?!wf+s2NRp9%E~hRkkq9y58&XTXb9kj^=~YvaD!+Hh>76f z0f9nP*H#F6!rIGbj&e>PizbC;ExEJ-+Dr!Ji%$T1R0FHA$9DJO9yTe?d*YeZsN>)0 za1z#GX!)1uJ^!ZHEZ!TZ=PNA#RQ-YBB(UmnNnz+LEd<){4b7+%Y<%8JhmmO87OJ{tj(saMaNI0oGneIHCzmmYr#ZNI!UVYyoq_ z;3_#XnaaD3+?RyDB{{-w#Olw?omf0)$Ki_~nw(wC6l0#GDt`0$;g?@{_m0S5z8EgJ zi?-@(;xij=+;woXv-B<187Pm}zU1u&kM7@fZQW$_n4{K=jcYHo79Ykul@w`W5uZm3 zqHb>@@B#zl9>8%|_-<5;1b6}&hW0U9p20|@2m`HeRP&?2*xcZrB5HWnOgb(!IqwkCJ7?&LxZF+^_lUeFJ=)p?<)@8vvc;MA%AjL zy0p>k$wkf++H~`+Uq83Jc;VQzKU*EHdQ!R2-|>D^o#T1Kx!BjIdB1N|zS*-6VEwPg z>)+@7z7f+g$o}N}$v))!uU+$gvJd(GYxVc@`GUQc41cBD(|_^5Pv>!&?3HG+kiFhT z_9W+T(0R0@!z->FfHxqU^57@}Mu%P%=}UtX#cVg+&>vh@85s#zWVRI=l#4M{2b(e)TzSh=kq`Kd>&tUA3ZO>-@2CBe z@4t4<`)U2<`+NRXzW;&V`_=bi%<2Ee?DvSR5#A4bVn6cNefx>? z@Bg3j_a}RRzlef=a0LD$t30q4-$kAYp4_0EnMJ~E)CjC2yKOUfq>wNhi{t^nr4F7r zr;!BLE-lg&U+Ub^(Q)FdtW{uxRG#LcE7J^n;0ijC!E_xqy_iVdjfhY6JX}2z)dkr4 z#La6r4hiL+wY&j4K|QeNHhrRJf^82!i3gFTXeF7_ zNTH{Z<4tByz+u8~bi$IM0+NLjUpXWt0F`d|M;N#VQGn(E*9k413RVK25Yw@_@<_xZ z0rro_l|}z}8WDi5KoxZl_xid*1zh_HL*z}{D%n)`pN33C-IVr+^KbZ^;V9idVqW^7r!2Xy$1Qd-rlACZ@}J3w`N>HenQA0vHdXr5MGl6 zYakuj8mSY`+k(zM)uHVee~Uq>nBZC?*ftD#$Z%b&VX9J%Stm8fAmFAsBT95D-4D}VX?CPNF-eQ-r;Lv)kiPK(U5W zK*yg112L$nZ6VHGKA>IZ(bZ+b zNy^^V6s;*EfZUnQ*pydRfyUs4#u)yiao8H^He_)Ui9*fT-#At>MA+Zh4BFXYXWsHC z*Ax=?Cz#qa;UhBW7H-#~2UfWhecH9I$1LYUQm-A3{Wp zLBS@Le*jlMb;Mzsl#dr*Uv`28asOl4i4x0z#7n^4E9hVt=%5Z|2i8Hmm)78fU(s>w zx1I&`)`3FYuN#)37?1qKtc-IWvjJTA2In=0IIgfP|HAMk_M@{eQk zBOJ>tMOYB{sh=VmUuy<1CHKUY=txXJ+JSj}bppeh%k1dh`N zDeBPckv{{Mg!2~HoEsiJ*{^PTL#`{&ok-Wt)Y{OCq50XAdOUmG!eFVKjpftXckJCz z>`Tn-Sg-nd&LXWh-FGF_I9W?+gw`84TU}z4S;8ibbQZiQYEpHxGcFf?3gj$aY%eYL zTxEn7dyc#~7JE#3@mcUCnEY0yn+;nvR>k%#@+7zM2Dx!GIcXNuEf?|8U8ThigrYI- ziKE31QV$PmWW;_>&9vrxOZaY(7THVd9p?2O_h|x96e6HitIbL=r?2)|OPEtaoa-Il zmaFz^kq)nY-??dDxGx*yaE3jRe(kbR7ViiiCf-2O7;uCm$BQwy(YB6$MqgrSi}d@R z<*yrVP#;A-4Sn|1F{c&4VDk_lt9S_Zb|7#-Y7nlsV}m12Kv)s8at#8CAz48~>s$(s zT36r(!EKc;H;rZ|n5uy{G#I98fV0*vbD^>f1LxXVnPiY4u-!Es+^gScQWGZNYtj+?z>gG1@`y?2Z0skA8&Fl8pYPYpI_Gr^hj zH;To{484|~>OOPRq?v3LakasQn0u6J5GJf&$1K;!00|iQ0WD?wVP~{pB2gDALXPsv zj^g1v;Sjyr3Cs5fu%2kXvz^iucm>pI*JuE90gPcR8_^1Z7K78Hd9kowRPDv%+?ffd+f~VDfaknaM#i;=zKTXi|7W^Ah&9@bHb6? z(0y_)^XUEeJzSop&pg%i@NCL1s{Qrt{@ZoEMH16@-+RNpdPy!>dVV4~ySe#xeT{(+ zrLlJBVeRthY(>Umrq#2^)j%T-A){IutLGdx`$4V@LoOMH2(p`Vn5@%@tVAH7g)X30 z!;*pOWk>oCK97)<9KnG4-DCIot z$Lpb2JGiFkJi4U)P+1UGVdwN_wEzPZ1d+p`2BTH5KByE{*q$n^tWE7cZH2kf3PoE~ zm{lmF3)A`#U$>5-^&r+jVVbZ|OhTr^*IzGry{}oSRRkOHb9-ubI9>J7g3Xp6zVH4= zH}qF)P_E*2VzIe-HaRh$maA5(@4I1T$$Co(r-d_z`}sxqtWna8q&1^M)*7gj1XEG2 zMx;)&q1zEM0VP5@(gx#MYY;9u^V*T($-l-T&GHU`APMc>IcyO*QD7CSVeTL zV1*R6Ck6Hdr?TWxR78mem*Sz&h0Jdl8Ii55cwl}|*Jm~z3S0Ha50})s6EX?{ai_6C z^im>9_#;1T`+05rFe~Pm)NoZU**tLzU6Ppflt-~j(F`bDVX!vNH$H+_55|w*NmnM? z!@x$KoLY&+5kML}Yy41|u}GS8lU6@)+ii~@jwB!X)Ff;L?O(%M$R* za76H0@}FZxN4g&s%}=eNK0Lkft?{@0du^@F2){7&pRju}wl)vLs+xmSlePnc;PAQZ*SM`GPeC$x4E&U?w*W}EoX zI+slMrry(%?b99o1fI8vjO)*&GHNF;9|`p!77B~vVLj8i8q6H{QD@XZpLRxFiVvWC249MnVn(eRbiG8)Q?42B!E<;tHM~ zxD#6!F+FasBC)j*5*eOA02Cew3y~S#Fcup-wCS!ptaqKiO;r1r;<{SWS9pjOK!0Ca%B$yXFBh9}ha}P)OGg5N>n}NX%G4FqhGt z1EyR5MyHE^QNW$+H~KK&=)>^Ye4`H&bI>~6p1jAoEa-WmL1ruFMkg35B1NG`5AvgToJo3thC*;jrwRl`UQk)iQbi3cVqt>FABo(Tq|6<5hw3;a>M)U4<@2Zy z3`>c14kis2?S+RY%ah{LsY-LpsyJ}(Vri!Pf$5^UmD|14bosbfkN%9ADMWt<_kNLT z!YBckdb!7w>W^S25#>U?)eRadYpi37=$2|c7j_eeQeEIJz zLK6e7j2xRJ${jY1T1 z)Qog0pk|`ak;dE`Vav^qiQmnLt8z*k!k(fnYKWt+p;0`h8Noi2+Z6Dr={6mbw<)v| zsO^!IO9$XWbWI#`(7IR-4i5ve2`IQR>7m@fCnGc3AWBLwZv+lH?EM5Wbi>E1TqlTclz7H>P}Qrp-jMG78IEv{&@9+56;RhKPFD~_WZ8q zmaY2-1|05uVX-mP3*}z@zR$F}PwTtSKEjUL@F`%`7G+Sm3yNikH85jUGh)$j#RQRb zTAPf=iq;TI->Il)dYS#yN*!s2f)QQj&h+A7E28<^A#w*6FJt z&eO=*Ah7y4hT=3k32AC}7=Mo&!4w)Z^X%I`Gr2_4C1{%&@Z%`~!154|(cP1S;povS zISfcnb9W4r{m@y)SaprCYU+WC!)yTbQV*172WcC^g8DAzYFkxzYZxajQOBEp|NH=p^{2fn*e+_dwX7aXDUt16Y{e^dVyu`l)4+^fgF z4WRxC0}%>XR_zGIxanH@KnL2b%zL^c%4WFP;_f6?$>`2<+N_w`w^&{J_hz*E==#}ox zmBl?9u6fhTUlA#cH!@KQc0YD|pcpl}CgP1yZTNMIjZAVx=1@->DDUJLknSmt0gD_1 zlAycf8$gD(<8kMpLfP?1-{zDtAYdPkYW!qMB#o2 zmS!S=$B)$z>t~W7->Rg0P`qRU`K$Qs0B} zyRc8%ym`x12_je+83>13D3x_E94}6gB0{qv0~9nDn!kKt(&~0Qyw-pvW^7)6#bd`` zyV0}dS4Qj1HCwN`{JWQ&c-_@o9y{M)&3KGOM>clO+easbLA4m{Mz`8|<4qsh|MY9J zra(4R9oW0&vGz4p|M;HKi)z96cAKw`bHI5s-(#c7+x4gnVK0VaYc8UuIphXI%Mn_5 z#QLr?6PAEz&X@l?heJ~YfxNWS9FwJyQF3m~^lT&KZiqNcPNt4zc}bWpEJbYhwQcSk zp9|q*_uIdoP)Oy=Nsd~ZSnY@N>L2}n_gC+c8M12eCWkY{v4l%S+%}5%_57kaHj*i* zweA=1zIQE>SE@`WQ_fIweq=;~c`HUD;3s~eUXD9y7iqQ5(2dk+c7|pB6ltFqz^Ipl z6E6iPiMlp`Ra&K6H-@U}Zo-;Lc^t)3k{w5bhPDGW)(RE6HlVUvVTBQz{0Wdx+kY zZ8jpjTF}@aP+12?$1z$RZic`b5F00&WROSP+rD&mL(Gob&Q{0d-f)^wFs+?k-L@!`{K!(cF`s{OH7h$>}kq z28z*iV>%NX8BHaVvtIY!?U70~cFp1M)xwb@+bgSvfgHYp{rhu;V0$|G9qk4^1Prc;J&&C# z_5@}Tv5Y}1*c&yto{7BpR$u=@I|FnXUAgNY?H*jm^@s<1Rwa-N{apPw^~3NwN6aA8Mk7JuOa8?81VuOy zJ7(P>E|@d&ZCDU)>^8Mak#~u#faF|jS21B)yno|`!vRyMc+S}H=3>-l_=LFP{U^5E zbz;N$ciq>_mzziS4J;Im{)H>6SAFW%O`hyVb$aa3k>=3idCfwqx^=peIrjR^<=uDe z*>>lyL321z$Zzsly|slAUtll$893Y*aJLkdJLP<`mbDifw=MQ0^>;J#2!XSJ{u~b+ z!{)6!ZH%x5Du5aBhIP5HTw!n#wg7cREr_sAGl0a2n+0aR5|{w7G%#Yh`lU(nIw}Pa zh`Uk>AXxi->Id(=yZcNJToa4E3c%{*_uji<$Cc%i>T}rNDwKEIIf^2}*h&nq!H#kk z2MJ=DL<(^Z$WmhO+J+SMS>fDTic^?<1qve$DE)2-1Zc}-5TKe;-4iK{#u_U$#*>ZR z75{o0_Pr0f9{%Hp4Pk4*>M%AAUfeiykKX(t_WeQRFtgZ`lyaWLwN@^4u2(Xb4zu`Z z+6BZj{8;j{Uhq<^n=nu0+SD0LzqMGi*rl?s4B^t)09debo&%Jweqxh?x zSJWnMJFt3v7mh`{3)hKDg4b@|&oLX}l`kS@tDy>rt~pYGX1!4-p^J)>DpOA2l}ty5QKLZ; z_=l)2yS7{fd1D4Q+2`~N3=-gk2)T?05d*S^Rx5o!(|zY{w=GP0eA(p1Z~W7Dyz}!D z=U;W@`HA@Liw85-0b5|H z&D=GwEN|XXdFM<8WF!5o8Z_8NQ~99M9>OXU(|VX4Fa`yac!)f!c|?LfCDonS)kUkUa|9i?zMqY&%v!O zal*mr&-$d{op{y}vJpOsgwr@V6mm+OM$02%1wfPNbq3N%*FoqM@G@|lQ1Fz-4XG^4 zObw~+Aa|n%DV+yi0xyr`m%{9|_zqcMyDqE+Y)DAS2s zlR8Xr#C?Xm(aO5156<D`;fhg`5wGZXQ=|4aH$^x>WO=g zcp|L*!i_?aCbW4`Cg&7A1wIv5E>S4R!XE*`gIJMPfrx0VVkQw$uR=_2000rJCx5~C zrWvWnCxzXY8W^P8KklP(zFG>|Xh#w5AVt)~)<%>^L7zz$QCT9^2(bP?rP~|d)Ci)3n643moo!!v*VKAp`pLf zFaaD!(rIzV!iZ)n>rsme#dT0o^I}=fuHQoH(KOkRAzvq@WeR*QhQ8x70pHAE*CadB z9&jmH$?D2obZZ-M}LPRUf7#lj~qDrG9ZrpDn#pL zLb5L068V%k`0laB=6Kj$%0zP$JMsaCE0>HUkM+Rr6>#)KAU!fZlFk{z`D!hXIkE=k zK*ZI@&<8aFd>OrS)CQ$1u|h8km}tw?BR{nUQHZKjqo!0erMU}`gF&O6l(_Eo1vg+g z5U?gHQxroUIFBgcD(`hlQOyNIwDe{vcw*qu)GtMfdJ1d}9AD5yP`A|rlEy^YBJpx_ z6L2hKFNpYnT|xAc5)VYImhplQnUu+gnrzq*A3t(@CSC7-rkWot`AYYJ znVt8EyS{SHRXA@DMnYYQbk8;_e{_bYVcDE%c$(s921QF6FJ6SjpbA^0utX_Rp}kTypZR?P(bW%r{;|hD_u0pv_*}00+3wfG*b^UwPsMqFPyJi? zfHK$}6UxmBDEnFkC%#zk49Kfvz}t~yn^?gCz?=@yBF4lNaSgO#Y$OTWLE(xn4>>lA zZigsHPudvGxUqx8+Qcgo#;ef4F+q?mWE!Yum?mIEdPagvA}FN#Fj|c6Q);QT^frbx zjmzSzW3&4PGhcb*w{MPYHy00DCfAJu=s5$Xt_iUsQ86&sNcfZ_izt@Q~b5^TlF_yv*SL#i!0(meE(74oYM-RJ(}%lB}4(GH2bNJ z&8zG}U;%&@JRq9Ff-r+~Jq5t5X7OMbVXG($xs6Cw#^((`OQwg$hti4a+-y~SG&i+9 z5wK;FxlOyHt_=Tt4}SiO{PQ2ApTGPQ@pF-cEhUu8b=5Kpc$yaOVx>kjD(x63F+(ec z{Do+^7JeaAb2>hzCli%kvk`B`L5B&^AT_B1ZAIjZk`0kw6@l&oI#yGNbtW)+%u?Wj zw=DOLm=3uE$?E1yeJSHjGpUJ@Ez`~rnnDd0HS7*$MviZ}(lb^n460_M-RQutjo&gM5g;RiTGbjI&Z6{|y6#gO|MMav916tMT2pDBE6cRkT zY=e?61|%*hoR4ptpWp6whf=BF<8IYIa3~jz$KuH-?;Uteh5~ru&3@0YVnh)v40-;6 z#?olmhR_g_ZzPGyQx!9VNHk>sIdn%F2&s^Yft^GBElwtYvG4}^TjE$z%*SoVa}<4W zKM%;_0O`r+4dWXnuB;OUnVlL_G$7uO2s4ZZ4?L2YcEAg~yDgmf9BXgl$XWv0x(X(+ z71V`#nwat{4z!z$x>(HW@uB(hMVX<^#rf_2%%8+E17!n$EDgnqUy9`B54tv$lG{tU zU7KIXgw4_JAC__@U$FoAkVs^shG_S(Y)nKfHi{Y0^Av(+e^vRA-p_#&BJu@XqHY;H zKnR?)-N7Y=;v(^drC4UCFaWJrrWVWbG>q1e4mhaRAWrm^z>(wjG{6BSLL!3VGfK&z z3Pa`iG-tYmcT3eZ*|ty9Bhr-0Qp1NbK;8$`VK^7+5Xyye?DkhH7*L!lE9|n3e_Rxk zvm(^}F$>cMbDx{KaDFGx8WE4y9o;`mzpCFx{O_5FDZ2ZDy^AmFO%^$LkmA!c*5+KS zjSX4q>+}jcgl1WCk;^^kJA&%2Tqa0#aicXd6|5j+nj-4P zVhVu+{-j!wog&>uJ3;=mFm^;(nk#^-Fh%x*-ckrSv>jetidX@V2TR1=f?u70lVz{k z2uG%xzMeEVQCP%*V*2PM6W*E42d=v7vf^}kpXZgY3>LcoITpQ4SO$ik{fh@4n!fL< zSG*~jo9=E)-7(McpP2vrVA3N|MhcZr|&?r}=dSdTxD2EW~`sD%d>yWF9^} zszg&Q=mthSGNQ_Lp~sf5(b7Bd$reDV)NKJt`_kfBErM2rxs}15Jy5`Tx-FmrrVGjI z-ywTgZ3|cqnmohS@SlBKDD`Zi`?d6|dgdTL1AE~5j~az<9-ugrSUJ$n(?X6PF6BZ- zxE47n8nPW&1UU+zlSmq!NZMo#8WSz(D{4X(xQ~gYUoF;g?OgFcw-8 zMBoutN{YZ(xG3l+9TcMIB&coFf+--HgP;x4XpkO7$21UahH}z{;JPJoFIpvwSsaE7 zVedhQBbHg?Id*Lpe?xxb&$8W5mvTcNB4_cO?knVZ2*NHRN{*@yq&mQQxWGnxUV(H= zY_I|p+o?xgpi{1e!dDu{0E16;0TT}#riW8j9(;=K4s18^P_zQ9UqPWuGuUALkX~@+8Q;eNucMdmAPVdf66nIGDppytzz^F(D zafJ&#DCAgZ+9$C>fcR|lvqJ55d!UJWVA4qYaVg)keSe)H+$@0KbJdV+fql@@__eu@ zGY)@krUTid&t&T@fvv!AYH84J(413JLPJ*V=HbjF(cX?Quoi*d3J>#fQ_C2&Y!bIY zb3vjDb|yvCK{Gww=h9W}%ZY#K9$W2j$H@^tqi*gUt>=5^>bZk;$BVzkgOOhAw7SSX zXHsd&>{S~B2!Q##ecPf`gj|gqJ~&HHmSI=Z8FZL1ERGH%afWEz2rAB~|Iq1zd(sh8 zwBoi`uu?i`R)kC=Qe%FEyH=s@sa0XBDoA3ylU0Fbpc0aEgyM9!lqDNP5s_ry+|*q` z^`l~_px31*=L8LMUBO3W4ou^vd95rmm_gOTpf1ijF55l2b!)x6Cp(!P>HcgW7|MMv zGB6d^*hp&2I+xIo^#c70-YAMkhu|{8N9GJl zlTL9tIz<*tGe%Q-*+L5waI`K(uo-HGP(h^|YH~vS;{&fd_sZ)IzAE1M`q3ZlJAYqo zP<;G^zXCJer|F%es?_^a;r`Z_2yL%^YI z0-iw+E`_DIZ>u8-ki_F5)h!yLV`icO5trHyrZYLfyw^!SOq-YCV_|DB_f#nU8F5Dj zm;H->LcdGz=NUX$_qwtq^%Wr_qXlrUWddc~YbdHx$ZVuvMEVjsAPzDpxgk=o2<^Yb zdLZp0UEPkyU&5|P9~RS%6z+;dyAM>-*!x@HCkZ-1Hx7~Cy?7gXS5fh&CKM8$39-}+ z4H2SImztLI+&`4A}z4H{hJWd~*gipKunlnpz zgF*qJ8(EyRL3%*SoSS+dBJ%1vQ6e4};=pD|6vsDCPgffGw-+C~^4MeVykvIQ`?uXT zJO76IN%8Rm+pd4dtv6q_bL;LqKmOX|m%aXG_lX1hw`6;Ep!#43dF5?-v`cr0iS}Ke zPJ#Lp>8R*;jvQPe&4Zr}0WW3{x4nFuP)ik+LZNs;ve7Vto^%kly{9R}6jT~@!K)A< zwuTE2oFy>GYbP)o$B(J~rj-*WeQke-`@1dvF_ipyKG2JA^bPLE`5&ddlkv@qr}|q< zeg~TwV!!i7J>Es%zi!$Vp7Qhmr@uks{y*k#R^r<3S^W*!@h`=5>bp44xm50atJu^4 zJS^obu6|_O%V|s~xd811XN0m}#1ri_Cp1i1;`{}YP@i-Kf}v=f%s7q0ZX|~24dIWx z9qDEO4kVM81uzgJmI(B4WcmgPF)=zkjdhUX#6^1$vY#t?%EoMr+&KHA zU#dCv_ksP5(FtZjFiTUzc)}&akRAJIl-H@Ru5-e1?{{L%*At|;hr1Kn71Rib$f#A< z&n%Z#NG^y0!5S5Ze5i`FtiC0?C&)TS3YsoJLPO1Yh)QWLYmv!meyR#+F(R(zC`zIe zjNR3zc}`XPmH8@e_7tE&mn(% z6sz+|X%irqYf)OAsH49+oW=LF(!fK>Q;?6vL9H^q#6R-#t@ekR%$Ct1L?O<4IF}9gmX2?= zRUnbEHaR^~+>xpHq6_JABtA|99+6!vPeUK^Sulz*2g{2?BsCViNZ%9_h1WC)PfvYC zD+cxbQ+=HTg3|y`W7%-?S+EGmJlYn{H7M_8gpG9(FntIdUmlS_DhQOh`TzmyFvsnY z>}ag?WnJ;~5~+Clb;h)&bzxKL&w5U+z@Lv0H=IT<(HH;&_Ss{IV1p#$*Dl~9qY8%< zyO9xAXRu}~AVo(W!8P~zDO}sMy;NLoSGa^hV{kCp4Q2J7=wzUwIq@_mP8mo?kBjUT z3XmZasQ5UJWX%m6hZ?qmxzOe9E_r*shcJH33j*ksz zF{g3thJCLb-n41>j+`s&E4v38TW{HU+3x1Krk$CiH|`!edhX7hz55uxyQuW;W0dH6 z_c3c>o&|COQ{;Dx|H((kv1NLdiVEi|^(n^S;stC|4{6eZxW3kp|3j0f=fM5&e{~9c zHk4^qDoj3{b0F~s@fE~iSEC|M`$C!}l}CGh%wWcrcfe~;Po{XQ+)SW7QzdnXn2pTjz+r#(TZ z)>@ukaizH4v$yah_5^>1o+80)DnQyJ2=`veu|2b2D3JeANRpM{a5C z*xoq!-tG%;D2|U8D~GS!dT6-e@tS?Hjl-BU5e>|ZmbPpvU2sMH(%sv4=dx}%hCn(o zuuVS?6q~~rl$1yHiPV@^qStI(BypOghc_dDBb|C(@|%$WUEmw2^7_sE5k5l(7(xbC zlwoRFro@L0vu+@NQypfs$2hkb==ha?1^Vy zIPHOc36S6g5XVSQ!BB#YPLlRluP%W7Ijw(nsma?V<#wdqA~cuNgV*jG;7h!?wJk1bXah-YZ< z_)G2hnb#cv&0gNNQd-dMV6s#Q#i8&_@JCzY4i(EyxFQ-9`KZ?8^p(4pWN5SOpq**+x{3 zXbl&DmrAILcbIS$ctIM)$~8!kozU(i&Qn9^q^O zz)kINvW!Clnl_6Qas@INlP+(i0%_@uijd;qk}yf7$e^W{-XlEHYms+GGGn>1RmGWP z@Q#`7SJ3DJy(D?Rvud_m%Ebr!mC5>ndVXkZf(8~aP9v)DgAx}dTlgQqMUih4E}EVF zSBZ;uAJFq@j>QZm_@`;*Z&%@AB&emUY0;3M(}EakVdx>IT&$SD5f9PT6l6CoS~J{^ z`%*X=s~1U??e(BCN;`<(2wBB;m0K`LjjP?@CU;VZ(q{2p9ZS=y)Y4qUDJO!}AA5cF zWT8@(r+jT(vo7u6jOdo?7wh9}s}FlWvSG|^Rc84dr)u9l{lrTJ&zwNTG-(~S=?&h{`ZtK>3uO680hSZlONJx^%NWq$C$DPlAc&~LDVk|kD2dHh-NS*r6$AMl*`C#;PF70RtT#|-tyHrxZMQ+gp1EKU!eKwgCeGcz$hNSqp? zn91vpNp^S+ir(~EYJ~F3Fcap4a{Qiqj$d}q{l`Y~g$wg}@r~DCbM@rx z^%q=x)1Ak#S;RA&R_|8d1CKPJERt7}=fJEyh(Hs3(;05YLft^LHlYvu6wyZ)aBnS0 zamwf54`zdYTFb z0Fmi}7D%>Yu7r*NJ!ZP1RPo1$-?FU|-6WKJ@TQ%`h3!Mxg1jFL(DTLg%g-zA8ZGId zq&!v{av~T;A9qH_YB4y9T$4vc78)I)@(ZaZDHUPBK_}p+7j!`)G&}Kh%u&f-#xQ!l;WQl$REXlb&wi6L4PJBTSziA<+tf*J#=e z+xQ6O;xQah8!B6X9RQZ1(@8d-uBQ?PW=oIVA}t>87C*n|o_?=oPbTa>{7<&*+;dMi z`{s3;Eg#O#W~X|MdQ(~2v#&0P#Os#-2H5!?1k-a0P+o@P_9fg$Gb(gWZ02cWEoyW6TLsFPdFpsPzTYczVZiso!?&Y_-8hF{2LZM zft`N4+u^Uyx_lcq;Xlv>oj&yg38&jT?6f;a?Ln)YR+wogfzN*@1*`J8h=Hip$sibz=13sJk$>F=X+%d|1;T;Ah@s*bAM} zIRATYm*S*<4-LnJ><0Zm?ERwz4Dv8R>fdMIYZk*6n+cQIUA~anV7J=CA^EBLE^jDd zGrDX}TO#a86#Jjz5%4n~!q5DuVH}v?s}$;dv7hi`|__7kG;;g!4geBH+`Uz{OfBU=O1&L|YxjG*`mR zJW>iL08=Hbg9xc0rqX`v6mtS;5$4iuTK>8<>Pz^&-pt7GVq`CWVX@gP+2N54STE08 zea=8UJG?j&*~6dO%@+H};xPNp<&VKun}%Dw9+OAd)RRx)xy7F@ht%I&{t|Y3R3Q;^ z6?eXcWLy*rdrlfTfTu%{;Ks8;>d8bN1T*V#-sqPK1wB}L9Jc~A%S+=^>T6V^#o@UA zOQzxXf7@#|rML1P2rKsBErwfQ zN7#2yy<_Uz5xD{)e$u|rql-@8>q1^wMY52?4#)E)yXthS9~nD18uz)Jf#9|oCv1CJ zeV6($p4nmwDZi#4gP-5R&uQVck}332%p)*`vi$n;U#gFb+YGnj^?Ze1k3C3#K^1d& z{g;MY6{j*pGi|*vLrRL6ZopzU5Fe=0fgi57iYQ5Vl{so4XT+ySQ`}LKKsA%R7v|w; zh9c6RXqJF5D3r9lVQApM8CZb&X!I%&ea!_X5FH#?L>kNMIsp*_y+!r{J*!!g-IoFgR2- zn9EjSH<(q^kkM$!2k?d>n3rPtBkH@AiwuXb3)>VlxX@q^B51goRKX-Jg$pYRbw|=f zB!I-2ZvqsM9Jj*f#E9pGMn7J_o?*wR+y*Dcewp2t{5q7!FYJkV7U%E>{$KrNBs$=B z*Ef#3-S2h-pQioN?+e(iT|LtMx2Nd5p1(XG=HPRJh!D|kM1nl+AhXzmxc3DQ9%ep0 zbRK%~A7lr}Z2Q+l&#A6D9KY;U!wK$2_4)fVb|A1^Xy%WD4e!s7Ge%;H!0i30p^eL*sK1E&r1NCv`Vw@K%D#a%hs#IFpf=DwI+%+zas|Nzwj`euD42Wwq|bv%eIy~^r3$g3cTW6Nl7!TLqb%8v zA&hun&m>O@z9$QOgV9(#5*bgz(tT>&U`-l~7Mv2Z!Do)mRt?VNKp|OpLn-eH<_t#T z5E?)Xc3~}>4b`E@JeGMqTf}QS)yG7^um?USg*)+ne%~&v%cx-oUQ6P&Tj(`$8TRf+ z*gK2Kqr8E(ZFzZFg-;$ZjN>(5m&d>$;rc56?)`?{ICdUo2U|CFEed_{5X*Yl$xvs! zEOydK!&fZ)zGSsIU3~SR-OImZcep+HYIIED1)3Z$(M5s_M$A`IsY>ebuJQ3*8U_bL~r+jMpZP@EC!3xs~$$CMLiTif7GO zqtv^EpB(80-qNE^e9C72HaSoHu}ycPHZy)6{>@L~=RJXcGpih=y9EkrT8REhB%l39 zLLuLZy@gRvQ_O)2h(7}nj`mieX%`N@iyX+4WHx7_{ulW6AdbCE<#?~yxyzh@e>Du4 z4q{<~r6KyY*w+t*e2;{Z4qAO@B9vs0&wn`i_f^yfl|AZLe%C$l_xAul2LG>qMc-KR z9g2Fha;^Fuob~x-n*o3ZUV8%T@foZ?op)gE#9nN z2pkEMOKtUz%Bpbs2c1;fF-H{(9zcHR6G@vnI#q>Seqtaln(1`+*|<6%k6j;&W1Y@d z-y}xWFL<|`MwkCsePQa$i}-PPj>hsYlxx&?;5kyts^1=Q2mSW=KpDS$0zeU*AA&q> zE^O-CrN?GgAEd8dyi-1d_>_99YEVD_yY9Kt-*fS--1N`u2M@pZL+Y){*VNBrKWDpt zO}{ey`w68XhSZbrdsF;dqx&3r4M?e-P?VHXT4N0wp^V>piZZ8_B!}}S08D1XSzdp} z?zClME?+clH+mc{TRQ6ULjl<6KFjM3KiWTx9=pq$j`!Z_roSa#dA9H1nLdGMdR~8~ z-|#aD<=4wMh~vxOkTz=KzQzFd0PT(Vz&0w6_h!6^amV<8$1};KhVmOR6waUlHeCdMCEi zbT06R^o3OzZw>o#o$_I&eLnE7)^t;}uCKQ)In~)COFvg*16mg}J3@YWiMMrxO5OX> z@xDh2Mdd&vaS@wQA(U%rJVyl3S^4(adS{$J({8}lTzv_y;iWJxlYip~k#aDmSJn0D=$XKoImbVh{Ctw@qjlW@H)? z%?KNjPLWPI?J?5p@re<0S$;!*nQ{c!XU{CaO<>_Jj0`ZC%m$OkY)+>qeX7x@(*K#t zrA*pwa)%uzlf#r2!xO{Fl+9xlu0(V=KH+ffa0sI#Q64EbY8N@fSz%12BGFVdl!{xN z>aEVhFFRi~+v6^e$($O?4owTA(PFY2o$*LBA3o>~Lrrj67#x+s^F|6&(P4w?h-KpC z@Q}^1U=ss@NIgHBuQW`?jMcPIc3YaevN3leGqGU;tU>%w0HIOD&v2)W!3#m84H#yY z&lGS-%xWO$1|ptq3uB8GQ0bYQh+y5#oyl!C1B`B(mRzJ95Rn_P)r!#F(y31}=9t+0j85CH~ea`KeE!sQd5&iYy-hOv;_V)4Cd;m~M6^?3d2C^{G( z38 zJgW^c_eR)jlh`aYJEdi4cEa*;F-ESZm!CS-8Iw;p#(k1w#3CH?F4@OM5P25RR9~oT zBWS26Ie`@LoF!Y>$pSB9K5d8_Z>g;q!mP6Cxk!n6-?-R(@Thon%G6;;urE{*7!G4i zTX-0;G3l~7946IhG8Jv%d-$QR%^D3B*RG9*lnci&6&WbGre0M%IIzWUbsm*ZoS(U5 z+~PK?&c^oQnB5()SVt1B&4J0Mc(1d|&x?P>Ugwlo$f_~V~Ww;IPpiY2~CRxHJT&qNnic%_OqOJnBPcs9LZ3T#UN+%B+j?IPZ zw4j`&AGnFYI5wWV{Z_CT^9fqA9voS)s8-Le+e^7X z{i3vZt9z^&KNrtLnl8_)Hayb+*bq=5snD*5o0Mbro{B_^^rr&Pp?0cMl+Ib+*p(~caX6nK!q5-61$S8H1azg|y6Qp+WOl`9pDiKH!z*t4r457a@PY70V zi0qrQOd71EKP5si3^bb;Q#b?oF7|n^$!5&)`= z%6DPw1=2C33cjF$8@W@Yz)W0nhqn`x>j2&?1VnRq88LUvyOeOmu+0E(2)-<06=Kwp zWTq!i&}?qtlbVgNc04oTkU(+CZ0Sl2QM65|H7H7C@Dm$EHsvheH%&0t867a#=fwn3D-A4JM&w_nRvOU4syU%CNWXuMCO-jEm%lwT%jg*x zE~a0du>rp0X|Kjh$1~|-I_PPG+{vIN(RXLHNkv4@8;BHhWosgnZ>SH~0aVsN{6{@_(%amdLaX>liCm=XesB&({eI zj!aUxfRY%jgLHn$4&(km+`Leo1I;1Nri8)i zapWSVpin2ytH#Y4VKh4}-8(|giou<#q}_1m>Bt_R+Yq<9jbUMTyTk#X?ME|*tATd~ zeC`V#UGST>9J+RE;>O#A!D=yyOW(iku-WW1S|^7qGjx!G`;(Ivd%d}^B`Ba0Ae59C zR(=fIO9FEfP`ECZM^ z%|4QSq+mu<$BeRMw%G?p@IUd#^cj95`U3xJEye{VmlB7;OT9CzqAw~SkgVL=xQn7L z5~4Lshul`PZDzwjW4bf|2z}NO?0y8nmo+T*`*NGloz9l)@&C)%djL36UFpJgt5nLN zN-C+8b81N~bxWOdPxthMo}6bGW;`$q3^@!LY{1}vS+KD;V6Sb~gk9TfBWW6gv5m)R z&91{+Sl%q&#fkOr2M+seugy9@>wV{zx*1r9-*`G)RZCU(o_p>I-}#Q0n_QrsQDcn_ z7tHPT-{|Ldm*QPKI-p5Ty-a%?_Qtmn{~ROz7p0TAr?zC{v&EX@wPr7m`J(qF#eD0I z6*Wgd43z#Z1q^K%;0JgBMVU<)X*iH*UW?e(6WG<}UKm<^gCk`7BTZt1@@wUg0zT=p zXQ(DfX!Q_T5T?MUqSB8`Il81Ft;UTJs6awwtQ=cLRRPHiW@Ad^Ha<>=z};F%bBCCF zpdc1e>F5mj1F`CwHPu+|ze+t&Z3UY%-6vHPT`4E4nlilAIiMt`1_q`QmbhJyr-Hc+ z~{7v307)=7l8CJI076znJh6(un}cH@*FN_V28Zb^XR0D1}9Cj`k!<>6G|&5(Ui^nBN#-~|Tw z@W3$NEII)!F+Z4td}b@RQ2uplEWUh0Se!}s_z&d6=!iU2;wH(#`Q;;_@aZe}jFiIL zzp-}X<)PRI3gpWID=3bLHw%lzwAV*#4;=Ndu~R~Xqnb66NTFG1fte6eG0jA+vVlg`zadOd&QE3*`N9|5eG@YdxO;FoRZYyzD1xKB6=%EA28Kxg>T`$+T=bFtH zUsSZIp|sx<_n58LM6lEoPK1l20cH7Bw(iE6+)deq1EcU{MA7Wgi{a9Q-Q~5|ve`&~ zX1<(U{?7LLb$Bj>hmmKcSkHw9#(BwM2#M!+2g&6;K##e4zRT zET|1p9#OQSu|?h?C(wY?nu=@*_1>~>6ltWZ{eCId8}M%oyB)GE6IVlpF`G-X`ZkA0 z9L4u?{{?vz_9N{7I8a2_7#PH*8h=t!mI&#R`)%b=OXFy15XKfs)uoCe;;2=!^iR%68}T*CuiIu^w+)y;<0lR6eK1KA zhUk|kNavJEh3tXoQ_H`$vVJp7NmOllcjEgtP#MR!V5Fr{00X32W%bc~u{yG5j<&^w zw>1XJPQ!_SfbgK~s(=`71ZC=Bj|>wag*FYpXo^#Bb8HF&WErfUG8rnvLp*n16>ql$ z;#r4XS8Xn9GIXKFG-p7~WZ3~P$of(;3#STpv#5E^7F!~*H5?aHal5+wZP{eEGwob& zFdk(4^^(cs6k&iT0(0QoX3`bIvRBV69G>&q)}SG7ZnI*N>@Hg-2B)T^0*K+=63&IJ z=RUM?(Dg0J^`WqPy-Q1s^$>nAzx*P57VBZ^d~(-1F)M_ViG| zCyHlV^L@_oL{GFgv(aMl+hvp6=CurRc}B@9=I(ajXTftZNw(v>F?%{V>Rbe%Y3tn8 z(+Lz}tu3LK34l%Q1}}kbz`tS5wdD8^N^ph7jtAVFblf|Y7OIJshI#y@Eg22jryx!& z4`?Hr$7;5ZjqW>Cwl?hk<-g-9^?sLk*YT>$gbsuX>&L}|uJ zMnNrKfo=g!4^1DjM=X#a3k!>w(cKt|BN#-@(-A}ferwYEs6Uy`Hh5&ntF}GkWOuX# zxRWglh$NsI7?;A;z#mZDhF1dFseCe9c4j$MlOIAr%{DrW!IA(XNvS?A$!EkS4x~E+5Se}LOyOnGZ zpz?|vE<1yjDu@o~gWXgsOSMPcbD1^waN7fw=a)f*^PDw2kJv_ABfm({sDVn}Ao*N_ z$!(AiKhqe&=o*FBzk#ld(m)(w#D8k-#jH2-5Lb0ObTS1M$&g>;U7DU**t82mi?T7m z>-Zr?agEo4$b$nlhEx0XzBy(#&Hw~ion12WA+?xZLt(5g6;Bh0jQyN0No&GMUU4*QymOUgrioI#fm{$%1gEjb2kppb3;IuOn2D| z*|;b-W{M*ene}Z}3TCInlvhxtwHx-3S50ejYEZAZQj=IOi$gM7_F7D4>#i95gv#=> zq7(Dp1Mcc~3W(*c*alfr7DATF;jLMkQ^QOESM?;Aa7OC&r9MM1_f67;eWaHsm8D+p zJy0PRxeQ3Hlgpjt33cwH5`T5?B!t;K1hG!Sj&6Ic#M=(QO%}sKo(DZiboth&DHJV~ zi-d+iz6=H;;+}9Pd1*bpik2BLq6PBVb^!AHnt*;Pz(>zGeyyD&dxm4bh zJ!|LC>`YQSmtrckH&0WkMo@$t_*D$Q0)pjUWRv9QPLl76i24wCReERA?xnw z^b4u__G;4MWm9=KOGFM6Xb*NWe9`AHe_@7gd$F@P~WKK{y@{P6T=F?02 z3}v-XXbBq(ry$!4zREFyGXfV zs5=7=d);kum^Jr!P&YHC))RJ{=rFroS|Fw_|Hh-SII?B&fZ1gasp*QxAx0Hd&zVGz z*=@dDbSbV#OtG1Lo(cA&!ZdWCZ2OTcndb)f zPT9gXFUWp3-C0PTFWXd4B^5p3R(&ShNHsd>TJMV;40+s4gfdp#>0n|gNN>RPqZKjV zDAu+?F%O=N@HY^C>sm`~7tbhBvrJC@N||adYN$D)bx#m0sleMT2((erW`R~#HN=tf zO$mtOk|bMeoU%h#+YUE)N(m?4QbM#lW0aE6$>n#!Op?31^h^T@B1?;g_$3K5Eeh@3 zmAn*H8s)d7eKoR-5aIp!TYNs*=kY?mUrep_MFZBOJ_(sPHO3N^BbtA0n1Z_yZml*H zC2=3B_1;!b^#|-YaIW?{MYI@#{z5*2y#!k*C9I{&>Ji$30c498YR&P}OM_fRp+>(s zsI=ygih%kWS58h2j>GClGLEc%ynlpKbCUd@KM*wra)LA@cPM}FWd8oJ^7QYWr#}*G&i?T!;<6{OUatG2(ESUr z3=w)Po?eO>$6}Foq)bcg6TM-V_-Vu5V~I*h4EH@W{#!#wU5NzN|u@i0^bpYMrLI zN%#;jQTxzs77`6y-%I3BnqaIqMYN>`z?*osczHgmFZ_lI3Dvt9>b8sb=5Ya&&P(!x zRPyA5g0z#*Nko#eDbt5@iSCiqqmkmlS*7ViD92y^-Q#CF9M}AO)?|069+TT*5BJSG z9cI4=AucVP_miPLGL-|D4c)K3b5ME_-^VG66Q}!i0iz4%NM1c%=xsE3=XQchM(~28 z*2>@;Jxr^IN=PQK@pvD?K5RMaINmpe+w8^tnh?WpD=BGV8>V9CR<(mEn&APi>hrjqz6*HR=qHHdAOQum`sa3 z7b8lp_nY5T>$6*q2c7A#TeVlRGujl(jekJDfxm_Gli%w&jjIl zhk02zrL%@~m>gXjhd59M?c@+K>3cO=L6z_!jgk^t-oVHr0F?JQOqsAMWFKmk11>sIJP0c&>>hPB3RNiR=Y z5=9egI*6w&LhT`u`HEHe&B}CJ7Frw;aCIanXtU5Q590?k@Ib9x0+0dmeh8ZX#FEs`pp_QE2totN)0RCr&;6 ztFKem%MD0Pv+oodpEMh%(7vRB92WmdnX6V5d@$%OR3X#Gr9LW3etm$#6ey0SPUz^- zTSw96NvWq~Od{H5=1J0#$0q{@Kf`~aR!*P>?4M)I6UtpLOaEOJ;X`@?>x%^8U}yixbTux1~h z-?qc1xt-31;Nd$aoLRTm{L1^JCmgRP*yPsH8kd=sInJTW)Zc=$lgg)26KFJlHV6?= zEtI2rGIY#=iYpqWY9QH1nsB zJ#6-1dh9(cwdL(GuV>7fD16ATtUelw)&{0#_(sj~2j@{SrkiP6syO1YOD#i#U?FS3l158Ua(+ncU|$an zqh&CgX2dZ0yFk>k!>ehRsOv^9SsdR{)=f6+APPzjI2}<-bmYkTOOH6^F=h8e&*q4` zs;c35?CXh;SpySB+V}B$D(QeLn`vaC+v^q&Q{9Pz?Z`r|(yP0@qwD=H**TfN&YIb8 zPP^O(BWR~USn^`$r(#Y#sT9E7{e0&M`i_1dK_xGEw+Y}hx}IIo`DXXJmT?{XW#@%I zdHv$@E8>mfpCf)jhu>YmGM{AQKu6O#*xPwo_($R2!P(bqFt(Fv01Pwd=L0i4b!Dc1 zU@}C1O)9xC!?%XY<~}0LSv}B5yJZV);eRZpvc1(_OHg7?6SkhytT>Xz@kG8D>p!fB zP4HCby7peUucwp8Jz z$~eASQ9|m@AZ5D(Fgt0<1z|;l8H)fZi0*cwDFB^OIukVvbh^z#CWFKlZhbYqEhc_y;00mTei69rAhUq>J#da$yV0XnZipT2Fw0y+9ud;XO_OVMUGwXm<ZyjK0PxaqsXV=nfd0^>5=Gg z9eP&JOqX!Jnne?Ux+u9yTHUfQu)da5MqR#KA|c%#O61B;(S{00NfJd{&TjSSHg}{x z5-upVFx@NSNaClMh`~1VwC349hsm8S$2}&O z-|jafdybrH_vYOpe%;B*Y%z_E?aTPna zE03e-U4}>w%?Wk9Zc}&2_5jV0icS;ci>$~gT<29er8+!VKuZNa8|}g<1$PQyWN1l* z$f@#X;IQQj-sTX=1<_?VvG2(+gm4qV2vYBll63d*tQY`&)GG5&O8IbisxU*8b;L~7 z$kh3h!he~=P38@6G_K9SOr()w`xkL`%bLI7RgDpn>lpCy|0*|PRy-V_j1 z*e7Z6*K9)C0rnX5wNg-yXHHtM`%(-xCdL+T|epIfKpIQY{u`l8imE_Cy>OW+ZE;9bwzkT z9VO_#1>r5Cn|-`SP6VgKCG3E7D>yp)gtr4D zK(d%b#W^)lrhaR@aWeKJ$T9*3@h^ZN+QDWXjunAr%WAWR#|jaC3jDE}+ROk(Ymuc?FxD#$InH*Q)@RR+xj?d)gowdz85GYJz9ij(dgy!b^Qq8%7&}}1 z2G)HDV;{$Sy}!}GSY3QT_@;Cb#{M2U?gM;m@A40XUv@U*y#GY>=|+RUAGls zQbz>TTzXhPyY`gvSwPpY%Y^@2yUBdj2jDGG0bx!#H2PzwdF43P4WsqX~% zk;7CfNi0Ha6jX!wj%6UVDc~I8tK~sj208>;nYKR!m^S5g+me@-6t;Z#TqGl4#R2BE z7ocr6@?%DcB24@N=GbvzAr{T#(vf0CkLhAOSeqZbbZWlQpUw1(t?kpPawZloIlY1T zsnTM3EULtZOR>`WfyJ|4{c$~=?eAZpbyHK_~3#wAf~r z#g1GfQ0Wq4Q?TWUA;jM;UBre&D96q*A1#8Vwh(+lx|$=`2-O@KZTiXmBjgqxj(XRM z!J$A;NVs}SReaIWV>Sn1a*QSXd+ze^?-W#l@WnjRoVg;S=MIrJNMQ#ys?=A=n710#yu zhK~|LCl$eiUse9q%fI^QEBgDIUxSY#l+wm9fTV32ffTT zsc%>}gW@ADFP(z)R(63>@Pya}m>IMDH9kIvgXB)}9IVHKH0lZeXWh6S#p1WJA3?s( z$GF84W~R;)G`}=1Ht;@C_&fK4^A)etIQ*4+*cbTw%fb@g|4w``TN%gheU>oFh<+^j z3`Y}9mXIC<^b&Qot7cCRS@@vzNS+1{A7!htQCFIQqjYe^AJ>EAj|X+bA9rv5!iS7- zhpsgJr(~3#H^Zl%aDD9yw-U$~!IhH%zm7EvD2OcPujLFmJ1%Cx;o5(@fqKt z&sIN)&%PVOBy$@(9_b$8m+&ZIY4e(pKx0XA2^wT+6d@iC^OdG>PQ$tAa|t@R&TuP{ zu&5ewHnfgHeE3ZNv5J%*!~l+AJCNowAb5GFac>{QqF66 z3{X8mz#K-K4sWY~d2QCzmN-C%t)1Fz;2cI234Imn-p2x#V7^DMQ82P88n${4r;$+w zRzOt(h0x%<(5!YhBF^98xRjtWz&r(j#hczVj|Q9S&igJ39{$^-$C<+slxtCQc%(MD zBT`BR7tM-nG5z(m!Bl1c)Ke2?f1`M`q`fn@Z}0K=NPN_#Y#t~S@-CkmE!>#gVo@y~ zS1u9JHi?Fgr8)aL?Me3UoxjFh-pl8bzKn=pg+(v{y@$W-e^WSYS=ot zBmb^wY5AL#E7R<^)r<|Bq{n@{@2-pgE?u3PovW;^eDH>`#)lf^*BFvS0@;Q7Dq4JWuC>w4!!iayQLZoLjTH}YE^?t&BtRFo zjRqQWnV|8UxMC$zVxdS0cfYZ0utyuHM< z{J@rSe(nCk{0Q57{$+2v{p^9L^^So%2iE1%>#k&|*Rgmlx=CJ$*PULUDjl)qGb0zK zCX45poc=%|-#x4FEOh31g2Qz@;a^~Z=-D^oY`a7J9G*Rl(+UhMW;h2lzWjskctSvD zyVY^S*4WmyH7xSuY^I~&dOpq`=kN28&N~#5Y>}05F@f=@a9!uk#yGepeg~!XLE%!^ zvsnRcd?6i-OUIc%Gb9?xLxS?89^*3m$fcL^_ryIP75CA4v6qD+o@TlGS$o7A*)q=c zuN&vL@cqs=1(AQ&Q?S*ehyv{q+P(B?RpZmh|K_x|EfBHtYk*5~ zmV}m21?8IL4Mlp0_onHmei+TH7reqa6T2Z5Blh)rt8sWrUfHp!K@@laLWX~jSRy8q zN0b84kD~|O9&ceV+3?B^dxY6#2kNInv!jJzYWZSz7YJqs?S-P7eX!_uhMk&u$U7Ym zDDFznmcE2n_IuihTUHIXDJ~&f7UVB^iqsg>~oIKbf9Yx$PHi6?uuM-}DvG86w z2sd(AzmxlR*nU(516)$Kn5zk5eS+@?(C>$AxTt#4;!P9P9HD%~EP{eiS6M=YJ6Fq* z-Kbw63joMu9f&Os?u5-It!!Y;EAExO+3B;_jBQ)UINd?HV)k35!%B1JbQTZ{1bEc7kVcK=PL6#2?YxDe9NcVOYBR? zN+TWs{A8*6cU;N7&0*R zNplkDv>+nj0n{Wi%e-W6x1U58ljK*|yF zd7~M(bk(B0?vc<2=l%z021~t6{;-spmXPzK{neQg_p@J+3=1FZd=dK#+x|F&2<2DC)3MKoKGh=g8m7VOpTmG^V9d)?1%avTT;47M(p9$>O z=6V9Kszt*$!B!0+=L(5h(d!hwhEg|?UPR6n_@l64Rp3yhhV0sk+tH42I=cuZn~11C zjI22t#$!!@e*hcXq%q6`AdgbH71hmb^g%|i*tp{J<1Y$ulEQVfUw`rBg;)5w)I89B} zDF7uR;Yek{tr8xz9SjlboYVynYk3`v1v*0I8Juwty26x5PBo4>shbk32fmLU;c_Nw zmZYL7IOz-79A@1K)%MKBpW{`V0MB_JH{m{%;42>+;`qUU&t*5802%jJc#a!GV>f5EYhKAr*n{j9_DC zL83(T4ZFeUIK`eB7wxvBJ{?TTlTuCdXz1?=W}|Ea@{thVC43)qq6-OhPzNPk%SVb8 zJzG&)hK%k21O*vg%EKe3RL2YfSVvh3qN((OuhloR#3$cZ!2;JRR zr-mAMP^Vmd=!*fHQVnFQs4a@=j)AZmEQUN0m&81Ft3&l?LSA3C=#2)`^|*JymGo%% zWWEQNp9AmRS(t~93&Ja)rzU+OKFuWQa_qiEo|y?)gtwzkL=8xYt^irUcOe?qqmG@@ zFT~VIN>dTQ|JMq_p+d?!!nkp+xBNO3GMDoU|{%ci9R z896S;6eQjJx*kw{Qq7Z=`jR^O5V|#gMA7{2fTxJt#C={UJ}SJ7IA{=vK=_nIBFa-? zw$p^_!@M?C-cF~R;NUmYHajt~+^b#zPf`j8=vt%4=|JI;M6s5N$I}sDV@+9)GbHVh zhhphWDdEqUVivR0rn}u5^;>shp7PQN&`fCowdcgw)pQZ+geS;QVu-FijHE3wNAP@Fn?2&)6lcY5d)i*c?`xNT zD7@5p9&7b<=Qpo_`wsW;*5&^KXX8`I5JqYDkzWnhnbVd*0U<$l-1zi-flOkUSx?$^ zm#a76SpKi6dd%Ob_6_RvS=+^1nNPZb;&`lXmQT@puND8C^+S#|vi*Rn5hynSBm=@o z0A5fR8id)XOadQ6``k+~AP;wkWQRg$3<@92e6Cl6&1O=<+*A*IY`9-9Ifu8M=T0~S z2r(Acc>Ahrre?S1tEh<0Qc{R@ZkIISgtP~oQ`nPq544kjkitEHCl%#Om|BUZ7N-wH z3rE%z8&Nho`vNX+#<5jxC?21*L$Z`r(c0VfA7{l+3*VDADi-ww)cL>heK0IOBAk|H zz`1yW=~99}|D~Np;Rl^hLmz+>4*CGDB=Ia6-?&;3(2)T|*Z7Cq05cnoP6Lp8X-4-K zGND-PdLxK7= zyOJa)!t!^R-1!GErX3dG&XAlCnoOdtkOulft#L$|$~hTSPIU{qX3#EaocgS#AxGPm zWU3kkzcVse#M6v`B+L^$zLnT9?9@ISQ_NSIuoA^2L>tiFgX} z*d%==E}`E3GJdV{uQmR)kG{5X*=xZ+h*%q!PYPiJi9-b6B0t@ZU&7?A&u z&Di4qV~__3d9OzSxH&XofXId@H2`l2RbT`rM7KvCQYXcaeQ0O~IssOGrj#@OWsJ%s zNG=rgKvhOS=(~Ez=Wzx6ZV$*G9P0XdEIlZh&7$As63uR>R}-a*TUI>5gm3I(luzrv zaLnTfN7O)|82qbZjoEikA8$lr84o;{Pq7JQyf8JJJIgpP7O;-rfLs=Y{YH$8P(RRW zZ8Js31T*?K62VWrYi<{*VH=_qE4dTS^C?JRgF|$6Da#j*+7*GW2jGF0AJYNB;~*x~ zA{em>Zh4cM>Y6P8IpMGcKz(%bP$nyu&YHAFouxNzTsTsiuGcTxo6C>I+-JwwnE&vo zhEhwP-`yCUomjhfP+J>Xd((MtO|xo)(5I!&&%uMS8TvU$o)0uMLd={354<}#{S3+% zvQN-cZ^>-jEYd=)0CmxjY}^b0n3|u9Sd6@n$8r&1p>$5^-t8N&x@F(?YrivcR<++h zv3Jc&H~v#1_sMJC`tIA==Io7={c8f7wk;s2PW!`!d3{NI2X^~p7llb=&fR^AGZQ|h zXxsqqg}0F9dfZLfPVoL<(>iftlC&TqNdH-&$w@%+g*f|4=6xosXU<}cA6{?no1Iwi zwA&k8;}a^jHPe$UAA_A=vd@dh1UIabE{4}rYbjjm`0&;UJ|bX* z6C!(4BYab;G9AsRp8n13|GV`gFMi|kTc`j0iraG8C!gTYRPOvIdrEve=2ysB#Da)^ zklx{dmpwIjadpkEk>q>Bk-xg(E+#zJ5&refncEjG}ORw&xqOcnW-Une5O3UMi$GB__TM*CLW3uVirB9gxEgwRKYv8 zuK(^UY)SLR!*f@R1~%UpykBz`G6~p2z<06xfZHDiK4%-inYRaVz6_u*%;fi zfBRU(8F0E}8=D`RpInd6s^w5EYc_W4t z>{Pfi^i$Vg=+-9$cw#?*0%G0-mb6AYm8S|`0o_!gLL3B+?p51rkm`hRs`F50hGU`) z8@Dkuyn zr1J?k*!hX{VLnE=*P`?$#q37T7}wD6GW?3XOgUGJ{8_BylQd3t9CEA1xS7WJ^_#?V zg`Y|L;Tyaec!|F%P2$?4c#mxu!?piSS;eQ{WL!&m+kb`~k>`0^cq+p8mLI|OH2w{7 zt&%rq`DZ>Ye0%vtj2p4kMO^=|G0vV@{soQWo^BP7ujV21?9$G2tK;htpU5CSab_O! z+sIoU#(0)h@J>8G3B1u_=X#8PA2yr?d_(=zd5%{QSbdEK1+z&l0l?xSLmZuZjI9VtX_o{k&53cE4&*W*5nw|*X<`-v z(IHaWGLs#T7SM8q0I)(UPB{DSi3uDL8mAY086z`<7v{4i~u{sQ}6?+*Uo@|EE%kUWm8qa2D9!--1z zl5N+;(i@$z@ZxY}e{6C3alY2ZyjL)fapr#A{QjVuM@}$A39#Z{JLCEjxIQWTP`K@k zyzsMpJy!C_N#U7Se?#j>`C@Pj=P6H25(QLbTA z;)w`P2_&zt<({*`^TNl@xc+zejDJL&Ke~+~<97-q^JiY45T04dRi81w^8QKTuI10r zIF#H+#2@2xk=;a&JU@ctjq97Mk!yW7B&vk-z^GNw8&ot*(ge(!i5z9PI0%6i`AGn% zcnj_2DIi8po@g-7MY%M!qr4G)RD+tSK$Jw(F|=K7z=TGd;GPSDO#o450ze7q#EL-> zPH9j!MiLRxlLoB%!8+NIfC+WE5#b;aNdt81%fWK$J)g0sdy4+rST&JL_j~R3N@#bX zO8H$^Bpi$6-#)o6qg~|gnZ05|rC)PLwLqqp8Kqorkk4DEK)GeiXJ~>}p67aLerTNL z#}gVOM*8k7RS&Gr-JPqW;TJG>{BQb=_v&69`GsbT^SS10_GMbL)z9GLpTuXxUnYrI z8Taz>m%Hz8@gzHs0;xdjY-7j7n=y{8Fs<3#Px$-uoUsW0eE9sAvUlU1C~J&5jpc9i zd^PcX&rj zN+BP%FT$EDF(&BzGZB{0kEMJ;v#OmBLdZ}oT#SXL#Z>R>Q{c}g!}f^7;!)W1lnXz* z*IiW8gPDZe`g?QY%m2!5W=>j*>zduCqxq)iUdA|{8yw`6=f!i=`0}&tm~s8R2k5Vk zAlAF`8qeXM#%TC7WddoYR^IDeaUI5^kG*mHJaKk)&XW&r<<}cI=C@%#2So{=jhM1H z#&rjB&A123uiYcOjPV3R_6nc$Ze*&u3Lp=W0dCuX@660jlCcBv_;_^ zT{K14f`u)c<`xB50$Mf)M5KpXV1VXQoeo&S5D)0mKs5^-DTwNlt|vk{m{tU!z-AEL zy9sdB5)c~a?a|121W`544ZMshrZhOkLKLZ_>{^g)i>}EF?*wK9oeh)$9x$*3sXFok zd4v`H0Vxo#_HWili{ZZhlxgq4tH0VZz!Ft8AjUSkSx?oGuzfr<)RWyfuJs*V$PVn9 z*)lYv^)<57;`(!E?Lj_|1$us3FZLt8E-Sf3jEi^hapX+#J;;6{?8eM>U#EE!AEkL_ z4|4t89mhHw@0Vb2JM;bc^}rg@-(ww<>{j8|{PSVYi8lWJ)y}u@{$JInb5y!?7N-F}A zYo94^*rm)*TbMIgbHlW2)1}CGNBYu29tWAL(jCw4$jg`Q+M;D&{nt(Vw5)0U5%waB ztSR-|+;gh+oVSRdJG>_qlMijXzJI=F_r-(LftbF23?0G-b|i}~Yf;HK2KLqPEKqBv zOT|yXmOUn*tq~9xfWHI6M@jcMC#K-;Q=a%{mt=0vwo^p>IFlmY8ri@-8UQNJ&>Dsl z(6+@n3s(zOS>zG4a)`LK1e_*tr2yFH$*>ehR3M0k1T8#wLQZt8@tpVxus2HYm>Ffu z$+hdN{#@MqyH}(K`seixgRg#hTE9N;_9Q_WUES8z;=flfn=27fxfm6O-=1`xIcM z{fz!%WqkSD-EpuzojFc>mtP+hwvqkVy`Jan5s#Is zjPl?!@H}9<`?vYh+TX4%&-dfsSKspf|5CMzcHl&1XfWjQ7TsMuz;E*l{J-n)m7Vjh zn?F<<%_-U5dfcMdiyLp;^cT}Bkboa{*K_$hugk6H)yKGw4GHh-JVrW`=iZMY6My~V z&QD#qZhCJ$Vv$hd2*|$S23Q;?Wh-W_Ab;+xu5%%ZAzVR`yIs zVU9<~w)cjR;x=Zi1+I3jC|TK$;JhtAX3U>sO>$Fh>fl*pj$l3zEfqp6n3)`YZ624O z410A47=#UcAI;}^WZO)98M}&*6`0S?kD)LAhTV;PVG0&6V!+gyx#?=q83O?z4mw@~ z3dG*+3!5)~z2!r65`O*NAS;5B!ebqIE(7y7x-%%}Rr*rmwi$||?rpj?Y$m^@F zUc0N}%YVT!84Br<~o+CTY@GbA;y5S+=0Cd2Abalqd>|$Wa z^X58ai!kH;%crpi7CT=DV)ky}OvZVB2hl4Wvp`>wfCxNK1;9AMM(}u%_#voxixI#? zz_SVrKbXic^K)td3xN>HI768;R652Pnae=zR_M-Odq;3wI4QhCSTU z&_J_PYsHED0A1+_htkK-Q?QMo!0)7`62X~?kR_R_;I;(z1VwZ!#%VvEu7WDbRsh)} z1f<*EI9SbLiF!|>FqDeS0N|hn)-g=j#3amDY@U{d7dCeRDVEpcRRC2GIb8{okvu_5 z$Unj>yvqQoOswEn{9`t^BC=9=!8XWIEElj+B^f#nxJm&)mh(1tfh=y5r5Lb)q-^EYqQXfbJD;#nr?7@ zequCld5IhWbPx`XT*1;4X}<+&Nsgo@7|t7>S{lxvM#p&I|M8#$k*s<&@s=uo$~Qir z#clO_*U!c9Y*=#00)H-1 zwZCC6D>e9nJK6s}Mdv@>?Tpue8}x*q_~skO4WI8}^7;7neD9#%f^CFWK8x$*9-iu; zvRyFD2OwWso#^->=p1E@@GI<9BLisAHT0q%Z#z}Q;fX9SAQKcywewtv3B0NqqC>;p z;?e|9ntU4z3Zjsj;dLk^OLYDi7P+1s#s%z4b4Po}<$5%-L$W1kKk$6$eu3w!8VYg*JE=-ClHsPoU_U)+U)^|8kn0Dyt!YPUn`*&K z@Hk3kgKFVVKQAK8L&FFqlern_KKGCR@N*~iy$dkQS6a>ep0l07B;W(bH>#<8WLS}7<~Ud!ck%r)i=4yH*w>)D!9_u5O6OP0 zSMvM*B|BF*jx%LIXgi^W+V-w0qS&Ae0ty@{NCpDDLWT1~t5T>~ASaX7i_ z%|fk}#ZRDdu~Pv$dQbFlp0>3(coQ6KoXArOT4~`tBH~ag5*@9BRgM0wAi^M9Y3~glzgxEvPp~=FVhOuriph)UT zy*A02hp{93=V=v)oSkZ=8$*RUFOexAvP#$zE?|_qu6Ii@u@eEZARq@aw$!3!9N0j@ z>VvC-J?&5eIlKL!Td7LkhtYge9RQJx1-U(kW|M3d6Z0+qM+ptO%o?c7W!Wx=!N%v- zLS75Hr~3n`0r7Kgm+n$5TNW#Uz@RrIJDh;Bu(WPd5)O0BFKG#_5=@5TA$6n_bNKw$ zbf}&ozh@Hb@K&sY9lg@Gf%W<0LVJqV!i(BgDsrVhOQ>@tz~&+?#O@lkQ;sRZHY`Mp z6XC{)^8<`s>q%rd^(d8IgH)kuMTwRo9LChg$a*f0HrK14@>l93qZ3=nXqLRKE!&{l zX4OaM7dP+NNqnMBx3{?+CPWerH<7%0RnY0-nkjBa3hI)zQk__j3o-q?6|<;Ujc(U( zoO`1P7Sm2MPkt|8#{`r3 zgCw2hMX`w9(6?jkf1$R!$j7#cDRw1|$?p_O;sboF46ND<(p9)FiaOa(@jP5kd^i06 zx8gd)RB`MH#O~g?&2+I8gO%6^OZB*LLU^N@}YoyC&mF8MX zsor3`enYK!Wn*cr@ylerbqjQjHh@rhWpLj?k_JJYQHs6Q{-NQq^*fGSc**5gUwadc z-{5UtM}pIwgRCUL)AiWE@Y=<#yRW{UUbU$+?sBEt-x!&m+jsEtD{tU`Q}jMos!bj` z_kv5VqKl5H&7&km6Rc_iY?Haonm@|o=6Yj{O_>HDUFcqn=DgC%4@Pqn3fLR&8_?nC zjmXVaa@^subPHgq_$H|j>6~p7rU>4{cq>>ZrXI~RJ#gEl7w6FOz37hqH7@OyoXe|*Rn=*Hll~!IEvM7vY9iKSIkfzxq`-?-qh-_2r_1t;e+0WIm z*BkP_D$@6`D%GlqNoC`Yez@5?mZ-%-sZ1zQOGJAtoBq##Y}G~+)giw-HB_TU?)a-$ zUU1PL`+!`tbuO2_AQhoQ{J;Vyf#%5LJgx{6z=N&<*W|L$9>7`C>YIapPugB;1yc2T z8;3x-BdxiciLH3x810h-)q^kt)jKk&j1tX{}RnNZ84C@au{K zNbiK-fZwJjU6M4`s3>k`H%T?cVxEJz4B=eq2p;hQ7R0$!gZ(}zUX(-*Uwy3eWAS17 z8=O6s&Yz3FkdpWb!4xn|CXvawRcO0OPxxVPSO5>kw=}mtR(j6C87Ei;oN?I0Bze?} z+Sufz6A-%~bwHI_DdV-20To5ojjlx2jQ~afT@hxw03{H`Ze9X^yNSo8ke5yQhHXrD zu!0Ru{&Edxq^F@Y<@i+D`nE?P>wX4F|5 z@q#CpB1vZl5SOuuA842iyw<^$;5Q6!oH}*5;g0{_9MeP zea?rMj@`8V`eIKcqWMNhS8}ZBh48R?g+rhWfIJfp&nSm&7m3tyhKOzn7Mtn@J&;%c z#?j!yB|{pHYqw_t&nlFW>Roc6&c%+$5L#$mZ?JFZD+PowZP61C=L&3*RcI>FdQ%t# zfz!Xv)^w{qxpgwIAzd7a>vOZiaZh#M)PASOW%b81(SXg@nDm7E>uG;^`|W$;+ZvPS zZ9Bid`QnNeVy6#0))PyZI~l;k2}!`<_|rJ9yeRzHN9@7De_B)~V{6{x zj|a^@TPkHPlB{-duaK`Vb9w7xSMmE-`0rgzDt`Y5{`+h7?;$Y{58f;Twom(k*S}LO zcS!8#0;YL?2EW3imJ>Q-;o2ul`C8v zbe-74Ux&8FcSN93hrIgw@{hak69ZQ3jKAaKU&Qrc;kUqi6+AH`cenb!G5p*W#O!QT36yAL-{^9hY~D|?Q|k8Z-eyml{y1G|`i=54&9@Xqc$ zukeY)g!_f3FwZOF--c{{7xAX7b|%(n3tzJ`#}rXq^NP*~PSI*|9R`^u9rh9CM0FHu zIB@t_;oP8nh&5U&ydFSnK_JiBa1d;?WFVmiOlOEka3QB~>~Tc1kHkmgXPvVG&`FsO z#Lr_E@Ko%GSc7Zcbe4Aol2fs+krWVB?A&H*w`b^z^<~Z`L2DTys%mqF9a(5no+#QbrsrK49&-3zH z_aJbRXVki5o$inz$G}$HPx8H51OMZ04SZK-y5qd&SbQJuCwS>meCkJ5@1NHq<9$NH z$AtThS7;vaTvY38P+|CX>@>`m zfpeQDInn+Mv$b+w8{;9&FGi?>P}s%u1%`YA9|k<_k5+ga0L^YXZ7VBXN*&R z{~6&Z-Vghe^0j#VUcO%7U=cq}`wRyMW>f7;I9`n}D3*uA~VgSAQ%Qw8Xt@DyNZM+6uPO)q7#Bfe1 z{GIUM!e71awdYq~+a~-<_)B^XXFc|&R(Oc>321R#1&$~L3~ z@WPyWQVK;1^drz?D5gVlJ3QLjvmKJXf%p;IJyXz6!+2#wIijFE8wEEqCn{JMXBk2hg2Du%!DDy4c zvq7$}By^JL?Q7Lor5d~TdiNz$Vc;s=hHA|Hy4SX^zP3%6WzLn?y1ZD%{_vQ$v+Fwdbzd{~Tz_|O;5Bh0 zSp|Im8g|KZWCuu-?6Fg%xuL(gtiJ@s_Y{0(=-kH!vBQF$^Mw!L_50~{)XIKWIL01g z$ANPX2uOEQtqnM~7*7owb{KCKKpA*2)Jk9jW)D5|rJ^^R>kIAOx-Vmoc-fZVm4`G{ z59O-kAqyZs^uF&F3het}=*v)^9K{lV3iu)7dYu>KI$mlEytfg;k1&D-keHMGPF6b< zB!x==Os8-OiI$E#fDzb@t-+QJAW+_ot_A!7HWS+BEQ!v3u#xuuwCpJQJobcCzgtzx z5mzqCMusDfNZxLqc~2swpqaaUXBz3Po`^%F`$VTsah9Er+&Ju41h!>leTz8VanQ$= zW{@HYW$f1=FF*`ZiZ_ga6(z|j*#OcS^0s;@yA6Iu$7qX~@i~8Nfs9tvvr(@>Ufe+# zObEDPiBry>o9PgDq@WgtbVq;SfwV)knoNOMFbqBuYi~(+T0&ErO|@M(6v?Kv!l5sg zt6taHafbu!7#@p~KtG*QEIR6Rh}qdpZqwz)-2V%r!x~VNWyDD++5moY;w&Lz5*XGw zGYEMH8VH2*MFrqOY=A4m?BO_YOm&G>Wj6b(wF9~8E$glEs5{tW+PNO=d3OY4l)`#Y zO9;kZrz`kx4}#cLS~FnvCtM*ZDE208L0h;iq5HVqqnbe3E?H11i2q5bLpsEsVMicm z1)&aJ=q4&|Q2Pl_7Jc)0zp<8|>M77p6Q%fNL+h2h@jU(;@1^NO_2rUa_5`Wj4l;Uh zdzU0zuvjC#1;%g>7aHgxI1Ti8h&JK*4A$W(^Y9eq`-mPBHEnrzO}+G~%hzq$JDXO* z0bl=MD89Sj7PI=SXd@5i0Tqdt@8!#i+dbs+vLpTenVb72D?7~08qz%KX79{85Ut7* zc&&Gc9_l0E%^fE-387>=@QzLLfe~IC$pc+%by71>!U^NMy;z(-CWo zO!;jg)x}*B=+{p{Ae1dr<`%-k9a99V_!81@q%ldt!03Rd{cT@1;Z|yjOR@P}LH5i= zHIGBmO#02pP59-t6?QDD`aDVqRUNX^WAm^(<3)GaI)!%PZj(G4nBww-%+F2ipV&o+ z+m?u_bxG+)9Dt04P1G$(Bmk@kv!`VW8ks<%dPM5fTE~v1Y32(+U>9{=-_wq;ZQgvGW^d({W1?0rNgBK*AMYLp{z`-d4D>Ep>@6EY0;mRrk^zk$ zF?A!g=STe3+mtZV!>E2<-I<_$rfKC*g1PN09NDxd9*&zQd&1T^n`(X6b=ji&&e_eg zxws>9SImBaU$$JcHJ0+={>08Jo!_#@*&bAxW(YB5rC64N^;dX%IE4=W5bm5r9&rnh z?L`fd2ge5>HeE~_k77hg4ge%fQ_pblzk>FoZ3V|6}e=pd-7g zbK$!8)?Bx$?yY&AC#gy*RY|4NtkT?S^*qY$p4@h~-R;@I28@mIzz~v{BqU(WBMgrW zyg*jnk}yNw&x3?O0$v$;O(sI}LRR90N3sGuLZGGh?Q?EP>b7j-AO5xe5VzE&q3iCm z&mO=1ZLjEZDFGQ|nXzE;ji-IUtj!;Axp2q+aPv#ThlLNIw-9BlDU2R%uBu^QoUJc?18&)Gwm7X$ zVE{H6EZt_wZE+YA)!tsgG+rF-_t?OAK9|(QkoRBAc8ASnwkS5)>`)>e6y>1v=-x)L zw8deun-I*{u@>HJ#de{XAQb{hci5vUrhw-`NybbIo~OO}RpCE`M}c;J4cjV+Sw!Mw zB~oj+B!5+NlQ9S6855&iWjZn9rftPAHQ&+q@6t493)&t-&5I5A8??S0L{TI-DxsNC z`%YuY0w&Bl<`{Y!m_sKR4V(iTG8L)d48#aCH$byvIXzCV*zInSqETCnbgc+01n}B< z?@&Awk40r`j}r8F;wY5cjMCE7cw+3&V)2mIhrvyo-G$;y%6_Ea5Tw4cG5)D=NQt`r za#)a}Dom6EXa$tlE%gOY^RbNEhSx=#Nj2BY0du7{px>)+!;hRm4mU|PV%m7A`4CR9 zPjJC7TY*(1FJK*tmLfd`3wW@LP3;6()E$iB@}X`#gnOn>qfbLv1|m?ZkS8BfJECQ z5%4LBjn{5E6|$=it5FghF4gMxnsa?-F#H~SdODl4S_8Fg?}*(#nurP#^y!PJnSKv( zSe1Mb_-1?%5tJ!|UR#Fkwae&x?W$yox=~G%FncB|9u!uGETce6=`4s5pa*z35VPU< zahb9O@MmMYB-0d&@K5gA?AVDf)oVtJMK;?7Ip_{K;-4Kqf-ps>9mGrbI#$hf!4-Kk+A?fe^&T{a5o|caE0(08l6yu zY^aBh8Jq)vtR$HY?IdNo5Xm4egiOy!ZArWUkB8KV?1GIhgMoGXsNsSg$C`_=5YS*h zog&ylaE`?M4~zy8X~E+XWQeWhE5y85Ur)ou|DsxcC%g7hwazy4P$#gDKVz4&rb1gb9a_c#-Kh zA`dd;Vv!ZcnU#PA7e3gVQ@)hESpYX=(lKB$o6voVS$%qsb%nk>LQ_LpOXv`^c z!sB$h#n3~R7#J}ntLd=!sryGqm9*?sn*Ic6OlK=0cT|bkGA6sx=&-APyCCMwX2B*I zMGPC;MHgny11^uGxc8(4qe-=%kB>_tMoa~R!|=Ft2ja{UqD*pDG4LxX1TqM-1f&yY zt||7PUDeH$RI;-5I89~tKyUdy$+@cJjYF8_7ky{fT&7N$s&5gDZ5v3 z8bw!7k+TuM@DF%`m9RbhXz!nA>u3sMDMz04NMdq{%?2hpwW?xb9&9;*N*brWriM`<8;0@=)9oW6&#}Qgg+m_^=!F z;#&3#uYH3nlaU9Tj)#BK6AS!pbHC$a55m;L8B5S)54!B;{YG<-GbE2F4jMRe(EAC% zmwpHLtZrx-+Gx77c$IAnPNboG0c@EN{S3ou(FUX1#uT`1&cDSV=Q9D z+n_cI`B**G*i=4i~F)qb_$K4*5!k`sQavukbMN znA4~!{|0T;0)P1n)I^(SMHZ^Kj8?TOxzv5tcIN7Oi#^$zwUt44BE4R& zR;PN@_TxCL85{?ATUsg&;59v;fRD@j`X-hr9|4X`!DRzIEwyRDFlbUcRu{tM(e^w9 zMbqA+m>Otimg&2z9xV^-C)rv!4U!dG3B$-LEP6J>ph^T@qT87;SrDI^vC&?@4JAt8 zCjDLXE?+pJ7FI`(&(DTJUg52$vuE~JY63i~)jT~F17)Ec2x9rM5OGAX8s>4-7DD)!W zWd?SZ2ZnU@V2LoH_>ow;V(B0EdTdf4)NFbbG6DEhxe)GKeOuBmn+3B3T%2t824Xqi z9SI>7$d@Hqw&h~~#V3P09Rm{nF?%kzyyA?bM{X7*qs`@ajwe{HLS!-IuOWsc{NW)3 zR{v?UJkmwtO#TK)aE3ZW$i)>wix+?#S)ubsgtZ>ZRcb>lA7$Hc{9}uB#NcIQGngz7 zr7A}8m4Z-R5aP7hFA7gMqCt1q@!TuNqEM=dV5 z-6eiPk3|m@SuiS~_SzOc2m5rK{4VMT8F;5mh3Kq12TA zlFK1$p?jeKlpP~cc-hh~4HfV|!FRte;Fbiq7-$2gU@T7f8%dNWn#GyReG_}if-e?( z{BWo`oXNJp9GHPkwuap4oQUqeY*Il5D;Na{$!M=-Nb!i+5DptI3L-S!D7)10LFYuj z*X#3|Q@uHhw-oCySA^cIJ7y7MVXK1&F#;+AMga?rOjHwAfN}Vs=trcwXn2q&rnEV_ z1xwX-^XmEx!+op`%`{A9{a6U&YMe$ikCv|06iQ9Gys@Yl#KH$lE*n$b=48xdH5(-nyPta8y@BN1 z(Lmz2qY3%*A0f{FSKLV-ussJ1r%=}?J2HR{O&_l1LRC8mQ+}+fP2+>D7 z;@^Z#OS2S29Oi#LTwR}KpJ}IYFbQB3wdEDyc3jxaf}I~HA$yiibkv1obT}w7Ok+C@ zO6i(pp+j2e!>5CkfgMz}QT%B87**NvRp#CG3la1I@Ka=2Gnq@Dh5o}{kYPzrJ0|se zQwP(oo^=o;h!F%){L)Q33gjjb$O=Cda>cEASIB90t3h|%ayDwuyMy7(O*aQ+kHad7 z-k?2gDn`5#l9A-W##AetwT+F$hx}&OK)@fllCgTD?yMErh;XMfTu53%drTfU+;U&BtdtoXG9{S$dMA$K8vxm>6RjlZy97Wvx25Qj% z4K-*RPI{86#VkwlDQuq;Rd*P9=(hF6uq89RS_DBmax??U6^<5B?3S_RnHg7VR<{lc zkJ+O^SKMa$)z6pITsRbs?L9Vj)SNfI*6Vc!bE!XJRcv3tD2D5~aSWm0|HREN8qNqm zCwv3%Ev8qp^_3Lp3q#+i6->xCu0E{9WTLkdj?g=^5K`WbPj?r?8!aDS|Z8kdL~!Jnf>u!;9{ z1QU;lVAdCSm0*a+Hz=(FKfs{;N2~3XtLulj+8*M7NQwUq@JJ^VzsCO7sWAvf4RNt{ z4B|bsf_FZ=48;U<$YEqkfJP~v2zfcJ1`e7|oK4|ClSiSktx?TRmw^3%S?wfi`?t-H znKahR^J3-#QCXlq0uK%K(gK+y8h<41r9g(&6#_{RNZsOzp|TKH)S4-pN=Tx~Bpai$ z%VTo6LMlwH9d+96YQyax4LDT0RWhRD;8K$B&QqyDiAcz^HUXW9Co=JkPlrS9kTc{q znoOca6wHVSL|4pYF-!FK?Ha^|Lq;=VCZ~Wx#F<`{Al$MWMF??|*Vq3Z@^2XS7(n$) zl|4!}SfL%e4YpLZoyQ6Zs`#~}03?gxhbyj~DXxJ^dG;hR`#?dqRF_wGU#UR9!nJwe zQF{p;bKf?@hH#L#bHL|l z7}SDzdNZ@Tkb}_PQ*HaYblYpLunz{+!&NS>wpw;4(Ep}1(2U||h?S#D$W-uQIBYP~EPqc7H%t zZpirLSQBFdb{}>Zb`w4kGCjz0(_Z9zdkt7etd+UmBp_A~iM2a{GgNKYudai87QDP# zg94~>6|%5NkOi^|hYJFuY>O?SyD@7eUvc9@o4T&!h6L8(<_Sm45*wHxil z^ek#~s92_KQtqT;so6!@Ywe@EAt5&5HOK+f)D{gN+pP+zDD4&wRGY^Eqn%hojM8MI z6fFEhx&L~)INAe;iX`ok;ekbaRv}=?dX}pI#ecLJPAkJ$V6RLYf6lTYnn4;(GHCO} zF=QhSd(A!xcXVmUf^Skxy4#J!( z0rt$)SNtnPdIiI4yU)DqlM(dywzY_%cCn;UQh9-2NpKZFE2g03UK+FjEXl^ zdh$e5ZFu!9$n6ke_lFctQOzJ?-|Zma-@7q-azM_^~VU-8ca0 z(pD(2Ri!TkExT3eg@Zv?%wDiZAJ9K;mF=Cu9cBBVWk=awxD829+=hgKeSj>@=<|LK z`2lgkH4JYsbfQ$p&!E$rp}L461855<;WP(aJR(F3DGee-S|7$`*{^8Ety|ItpEb3m zI14e07uhng0=YjeO!X6+r{f5s#tNa8;T_l9;SymXD1g)v(v&E&4y%PXhFM6xOJDe) z$?ZYxV-27`Y;rn7-fXbqe1C7FDux74Fn?(5>|}IOaRv_y&zih0Dk$wmyV$09+GX~gg3FeL3 zPQO5jEFv^YUd80MlMc6Rjea!dv?s*h3cOQLoRTdd+3xV!>Gz9RnMQkn!`aRRvW zj)!JcvF^L$iIK!T)c3*3pumqt7i#AEzfx%MY!Ls32};8MH7YF?8uV{QgubVi@Goxs zvTV)1yVveWeJ2?aKOA_cF@{aDp`{_~lr?I(Ic@Fnzf;6D!gGFPHLYjCtC7FdR-QJ zwr7BO^>6+sa55#@%7=fYObpeGL%!RuFi=`)VQHla#j&lXTyt0=zk#Es9u_L^_=?bp z)xT~s#w43P;Lm%0=~<_G-(ztZOFqnsnu-m0_siyrBld)pH6dqrI{fzY8-MBZMuv_8 zA>uOHWrtUZIx2W?g5fWOYr=nsKg9dOwSYl>Kn$`Y8h>^EQYEsm6@E{`4)(J&WA7UryuMX?|Xv=!=;#b~V#_W^E*ilObp`uwy}~uohlK)B+SiK7J0Jo& z1{>+TLB#WchZ6X70UL<130$Yi?nH>+xfLPc8scjZ&7(TO_?@TmQis=b;-tX!shRd4c}*u*_|d+U!<6Z{7+$|`Jni1 z-0J~wWuZ#fmIk#j44${%2~+fM2!kS?Eq=pnOSihoU^)y4qbS50wO-{uq?)6jsHX6a z>o}4e0xQjc#0St9*gGIoxzWI#;`^m=h0**Xq#flwgeSqdpi52mgfK~Fv~Pu}-jOHf zQnMC0_@wG~rBcq|MMw#N2G|3#>uiBjKUzs7V;{jzFyM|%jkf-_jULU)%2Qsv zX{b#S^ZvT_5S@{(MH1tFftmq>k}?17?9k$n-S2xc>v#4aj9SO$<^GD%U5JI0Pll7> z{A3K22jcq*8N0V9a9YN`?`kNTkexPB_T)fzLAg&&Q3D)e(u)?a&l7wK`@4Kmz*p zX2uQ|g~p7i;E4Vej)WEO3!k~;=_?DbcScT!~Eq4E_1&tum~>=A&^_N|dqR z0$?xAfZa%X!wGr;ZO5Ww4yJ1iegDDf^3WTGZu?MaI1q|2iWlZ@9_XF9`4g?A%Qh0t zl5L?L$a{b{u>(PI#Q@lo7KHSIX_6iXk}%)SSd$8vd}nWIt&cGc>V-B8z1#5qbe|5? zs3xK6L7NV3>YBq7Ofzv3{A3NN_CDs!u@|rVCX4Kvx_~}_u3X;_AsdQo@Xs90m4F}L zySn%KUWX+XP7j|GqB^V#l20UC{WGbZos3X2=?jL7{WooHZuE-3wE1q}=H2GcUi+Lm z@L9+Jul*ukdjf2DInsI@0_N>HAp-CkLVz8$Q?RUjB_;2Vb)pRA7ERd53!CwiI?)Jc&X>D3j-&9)+Z{SqRBBmkZz#km;(rWqL_&G_QV0u z-1pl37E#H0d-}&Sc8^I(DWEA6Hl7!Md-H^}i1&z{KVV!1?$oVMNgA(e1`jRU>AsQw zrvF=#LI15d=d+uCE7U|Y;sy)iV|}`^E!Jtk62Axyc{)V=5}+iSUi>H2E?>EF8UG3I z!^e#|d`hzg*EXM*-X>jAiWZajA4sCi=FgMe;IE7KU^?KV2K32j-Vfw1owQ0qOcS&N zi!wnNM2s(hafpNK$M|;~JcjRR9i-W~gG#$eVfQTmN|RtAhUPe#RtyW+uD18%?W%@Z z{9b^q@KZ+MUOG1Bp>0QCPca(+J}%;lcG+qE1jT{%LTPzrKXi@?1WTjZ>_Mm|03*lL z_7P@j%Yq7PT9_2jL16a>brte>bcXmJJ4A4r;$pFv$qtia*K6Dq(c!3JhG~sNgLQfb z)AfM#Hu<0B(8Ab=aA2Wvr4_Ol<-nLNANHi13nr^|Y}DiM56QN%2kim5e5@vg7A&`% zI5d)MR#f@qo&&)NS@>XZ0>zwbf9hBa{+5C&?!@Z+zFzf!Lmu&;@;dhp`p^wbnC+uJ zc~76{@hk>yV!kJ^TDj_!nC%^ebBPbUe4vzT5VR`nr=JkB3#; zJvZYAot&`L#J^x-`;HhZ=>g zJFM(LmYr5Z}wrZgpfty7A zIQA01JY>i51wbI^CgE??=?)BT-x%?n{4LqLSG`}k*D{ko)Lcr5a&W@xOH`+aZktYw zH_A58Vc%T#P`FypDznO;1t%P0nMwL>ve++0M^>iutEa)0IuRJ{QBUSVfpjD%M#h#C zMXy;b>-T|Vc^TXVXR)i1cCTPqnPizRkwloCs#e!sj6RS=O6Ce89pRr%GLdrg)V{gi zK2lxZ!=P!MBYWuQj~t}SaIV^3xVnCvi+bTWePLmcWV+D8Q5{#bad^w_NiddPItlGO zgnfJgF^J98TOA>%*&YWe4fUp4HZ$h1D|1Iq-HewplmQdB=J6%zNHhm3=KyPhJp>;I zN3|ofhzb_=vz`l9nRkzcg^#d9~eFCo)f54=|FUYemOqC;yUUCM#K|6HEdZ!V)Q3$gN3;4Y7s*P4TuJ zTP##sT7;oUwu}dohp@Xog$D0$bScE1)fggwGAX3#Q}P?)WAbNFdTFgJ-26<@5tIXS zMq47<8k)xd_@&T-d}(ND;|rwuD@rj{ab^7Yn-2%}dgPf2?rmjtUwX9PB2=Ap|K)BUG7bhNK6i02*JY z>Kn8HC^P}cMgZHC(HTJxfCxe`w5Llmnih6%!2}=*l8w+72 zlsfdTMWZ>ikjWVR-rAD!!0gLQTv}ujua|pM_NVs`ABTudu?xngwEahF<76*_vG^G5wyyOO`qWk4W9A ze!}Dqgp-Bp0JAW(yM=)Ci|TVuV|k!9GDY_2Fv>DVxnaqs{aYhyj3Ww1KuJ-6Kz-ZC z#JJ$cv42qyvh+EGW**v7sMfpjzY$+O?aqL0j$VIr!slHKTBXv#x3bHl``_0{mvDYJg8_ih zl9=nFt0Obysti%m)yWU8?_;mG57*m(CE(0f^)oxoCSAw*RTy8UlO1p2r^Y#j)m@Q%R&d9X2+REc}hEj;~ZbcvF)R{w>=CZ zVvp8;0L?NZfH`Y+Imy_$(^#KEluj0+0yJnc@U~iO7B7sb>y~K$6vJxn!`Kskk}456 zXjW_$E!UqcE+FPj^b1I)j$KM*JY6?IE(0+$zKI+^iWNJ~_>yDee-Exqugr?3ST$w} zE*hJYvyb*pPWC#iuDN?{g3%sa6vWD8qNh4imE-wrUn||{ef_EMxsi>%bh>qRy06LI zH`_CvZlwHvI=#w+txO}6>WimB(sUEGCbx4TDLJqxFj!9y-a0X+I?Bc7*$V^Z*5O=P zJWfZ9oaXArUy7fS9z{-L6g@1b`9n5a%3tTXPOSSn`5O9u=tGTnj=G!NP$A`-LBMNK zK^V=K$+Ka5ti1t9fNWurmI}6t6`U+q#Zp1Bo6|6wU6#{eJQ&~Ow&Pf7{N9KyTUr#S zhIMa*k4B%^qPDY`2=rh-1Dz6OG5iFOuuKYB)wFda6lNi3!3H=)&0BuvQ}RDg^}(T} z>%S{ZA1J4K7iGy|!sOt_Z>TvFd6+jd32%I(Z)!0p*D_z;c;~mLr&9fULJl$I6|ByR zDopOUBTR-*fdTE;*d5V#gS?bX+Ou_B8ge$wxq$C%R{@RJehb-DLJN-9eeFa@_}q^sSBqOJ z26L_)g#YAi5kKiEa&O~3Tu-GhF@5|!rl1bYJi0eu#BnWBA)wo%^-#uXldL z^sjw;b^R{=ARqjHkqAD7)3ei>Wze)him5di%ED>dBh@P9JNqVT>KDF}C5EN}er z(#IQBNUzgChn@oa<))!?D{+Ke8eG4V$9%7{JkWl_kFFy3SJxk6{|KYdeATsrH$g?f z5b4owg>KN|l zp0|1B*lOC_3c$Mj%5McCm5Jb@Ja+%dIqw=XGd}?>k}XQy2rG27>`fr87(8;mwurC@ zIKiu^1$y8IM^KsgW16U0pJ8U8Q(%cfAq5u)okFRSa<2Y*Ct{}9Cqnh4h|(UXT3?0z z1aa~sU~1@A1jPyrj!*M|XIjy+IR5@o5L*IAPPqqy-b9u>WP)O#EQ3C0kzy0{nbz9! zJgyU<%*_x$1(#JaveP*GLZu5W!xDCFhQeI%+C%`_@0o_#(agZ)u@wd^@}bCu9O;Wv zj&9A62R-<%?LvkLpQ0y2PFM2C8<*A4?BuBc2EjrLswyb1V#_NB7lVNlZ@G82Uicch z+P?`-T>Fk?@RH9}-HV#vB~xwrNZ+GbM5Myh`5wE;SV?XCBjVHprpIT-_60AH+x=mF zvSu_^y63Qmox{B0zY|`wTS1lCU>$9p2EJk4(-pNQ`VpLTg}neA#8sLFqTnP{C9#G8 zlkHR~ylqvfa^VhD0sO%15D7oT%Ke&;&Z8T-Y*k~mMI4ozDiZNg4GTrs>JYR6WKW8( z!Z}MUbKC=ij;b5Ym>RfT zU77De4KKLpaU6c{nW@pn#`nxNe9%+^-eHMz7hLXElfC#lM5x%Z4Y2 z2Xj5hZ~(+2E!rVql$Iz>$g7KgwX5wJ~@7fDeWUH9|iJ36{3lTs7q#RBbvKvQT% zVZ;RDasnKQmG|g#k~MVFh*g%hPIO~H5{XJ2OZa~-o_az|g1Z}W`IflEzhh<2zbXp# z#+?PQK{!pI-R>bx{Mb&b@y0hS0~wGv?yKvAT;m2=)H{eN-Hv;ZG!C$N6s4Is+OgeKYzz_^ zL`2+C(+G*F%cRMmlrS*74RlM(_aonN$5d7xV}vE%odW7A7xGtDl|k8s-C3;QKoK9d znMCKp+&oqPby@9co&4$QKA>qyLK`3aCx24#Qr^M>Ccw846g%P+?WG;&}Tq>jmp zDvO@}ZJqXPA|Bhf$ANYYq3~H%iKyMe?}H>rsYbz=)GR zhRN>jFm{BY`WSHJNOHs#Y-T*by);gYJ#bjzT12L(*{B6MGY8QRs#-s1ho?M|G!7F> z-AW_N@4M|V-b%T#`n#3&yFn@^RppIelf5e_0V_wSrnq=|=+=%ZP!Y`RPuFJea(a$< zQBVvG)UxWVvhfF`u|Eh-JiTXW3Bso`FqIH%vyl&8FiY}msOI)p@zRd!;o@H|E$!*r zOdI5%#qIqCroVb;MD8UeWcmwEJY@BJ2@pg@5>GMlvx^KB=9zoP&2G3G)h*g-ifgQe z!PflZyWDM6p>0T9HJYsixyn%7UTzfm!oBb=y1I3BgWE~8(4fV*!MbFV|HTnnn3|k= zBno{L_WFnAjmJnd|C3bpBRS#ju4bN9A76wX4*Gwc?(xPqdvg6IAYZsVPDvkvJkA^L z5ip~YsjeU3S9huFO(_QIiri^-fFw|>Uy`*L6S6#qi{-< z4p1Mh@8ws1Z=OWFcL876t7s>-%--4^#uM-}N4cLlT3x?`fB(@t==+aSHwm?nTk!pQ zEyTiCTIoebnOgoWnuYJgS-mli?!R^)1icsV%T95sMb_e|+R4nKwlUhigBpUsoplaf zL_j#&zQxnNl@e=>@Yn|J0MHnGh;>O_v*nYA=uXUf){B;@JMN~>N7S|Pqqkh7Py0M; zy~g9zx!O@OVRON7T;1qlTA=Dkx9UZvhl~yHlCW5jb-?xN8T=VHK%5tJNAbket+2o! z28X2&$s3=nEQSWpxN^9AMic5`);;}mwU0eG|Aedm#I1`Hjc`^L{CWS(p>jw{%nv|G zR_?%@$=ba`tE2rJ^W+QffvP-*(Uank(b5kdXjMKQzjdZj?|HZphn- ztx8kEV(`x$9zCeEqO=7i6Uv4jcZ)09jDSg1S}xLnNSn8d61O(h#F`_3b(Cn2%LPya#a&(vo|g@UEbvb^uxyqyB7I?Ln!E+k zGvH4MmlmBxu-^g``+j~M{nR^d`Kg3_6k-*Z;5AI{bZ=#Zu0ljzizoBMvuDtT$Pp*g zm0|o%8|PbGH78s*MSvK*LLYwKgV8}qzLCAoeGKPWNegyQZ}GnBcB1n)w%Sue*?WaA zurr!ynVR$2-5QH%IqqmIN+ZDu;g%0GkK&iU%DeC%cZ%-7bpF`+8+we!*iHwd>p1zA zX~PGYXW{DGky&`dJWIZ+*9JTJehAZ$r=x^+L)XE2fm0INEykLpCp^e&;8xm=T~xd4 zRK{=|GdPX}jZyUW!=54RR?|gJBsK^Svu1Y%XeBf7*`0KaaLGF~o&`nRIFWucD-;Kg zi|V=5vc+rECuDAXhcVKfkIgeYY@BFTPWVIEof=%s)zG#Ii$FDm0uy&f0-@pIEtk}F zM!zX2Q+F*CdxotR^io3Bvl9*w6_J&(t`16`Pw1g0$rD>a-Vb?J3AG-pl7^EayBQpo zxn022Av&H*GN=-wYzNm?M~VdOKv3C95u&G+La0f*>&YQ?yRgh5u`VowFTq`)`()6H zq^dl)X5ozsYi}ti>~=Va{Dw(O+yVU%-!E_cFGtV8lMQoex_oZN7+kbe%O`SgJhyl7 z_{o94C(nE*GX>AdqB}KR4md;c7&RSyO5ohyebuFcS31R?p5jFQ>|R*RUm+wr?GmF~ zjr*ue-Ssk)6UG8YYgj%C51E$jUXpC9^9U1UE{D<&iO zNYc|4pF6xySe2hMiNbhbC~{!+*)#P$1+{BDNoV5X^U#?VFvc$zU6UvswDCoEGB-rl zGe3T0J&Q~EN|Cio#iW}yNFDrs{Z?LQ4k-hsq1vu9dWC3Od|v(@52Rg315>3REs%bO z=_HvvQ~VWzXy%))i9ZARHo)2TAwwrYIBp#!q1HRS)ZesnMeSpEv#y)9F-Ak8t7nF( zXJ&w_CsDz7FC>cq7(iuMDkCNYBMY>XkQ10Gq}0zlLdrO-VoVSpC4OH=Xk-vPB~}D% zfed+_b}yeHq{@OH|6vOTsb&zG+6}&7+}Is9jSJg89cZv&@n__#vafmI&_E&(o%9{4 zl@A2Mt0PaIe#{$dRQ3&)Z5uC;W}Zas^u49T{vDRa;Xwn%WdfXf`_QSKgXjCTO3mT($JLPFEz5StqkASMN502;%6dgiu~*`5KKAu9x4t#wSVS_NfvF&zVQz*$4K_wAifs*G-P;(p%aJo;Wo#{ zgWn2MBn~$f+6`uNbVbTA?a5TR_Fzb7Jrts`mNhBlfuZ5TrqWB-6fv>0*kBl!rx$g% zj?E8&lGxVG*tn5kv9686+syUGTla&oHB?kGTd)AB>jAIFzP;A*O<9?C_cWSOSFAd7 zdN$~rzir5UOD8coRdqI9-y%CR8=Pb&MlgAMQpJ!*>YttM57!(QRz7&8I2g2Y^MbpE zeju|e(}ej%HTcExXSuqb;gSN$jYv9($!v0kx(=eYfoTPb2db<*hvka6eN}=Qx|Oz< z(hNN^t-gxLl%grb5>+Z#V$MsGQPD)7PcMFCKz+OBR*SS{N(<1s`j@KOG1E={k)_Dn zB|AMj+o6WnRqx7aWWL*lyL5Rh8>YJ5?Oh%0+Avk>jgn{7Cq7=

      4;@2C@=oeN2AqKOJW|6$>N#krD;580}nAMK;?W{l+RVcV-Q4X6vH<7XlC1eVrT_$Cq9KDqLwVc9L3c3 z#Aw?L_S|72_tfem`1U>~KV&Zmcdlz?ZGm^TTUqE>a-8Dzl9i_AjXV5-naNWj7j?0$ zc866^0onO((sLDhO{7Awo^}FaY!YV|r8U>LsVI0P;cmwf zXh%`E*Ag85`rfJ-E5?LBVY-=$Up_W_dEr27a8%E(_z_ z`|YzHnVp|m>|-sbZw1Vtfw?0>^|R-7+g_)tHR32eb_k+sRwQkssu})NASg^ii9Imw z{KB@Y2rocy7`nP%cS7uELMi$gB7biexj8TGa!I?EsZW<$k-B>d?rU*3+q4DK zY*L8DN|ull>0n&gk^boh`WLZjZs^{C$$Zk7A4V(t_I;Or@kXos#gk@Z;O<5`WO|d+ zrNT0g9XMP4=vJPr%O!(Y`bj340@Di^*^Yw&<#$L1b8TV{l1b{SgSZo7!6t5aJY<8N z5c`1;dN8_J3S2DNUBseMNL}d4f>t5E$WC7`3l;$o))!4DzyAE6GKJEE_XUmSlTFeL z)?@lq*JeF`0=$LyG*V$BE8BnR*MFVcE9T?Vh^XJp?6O{)m#H?-?J~$?#Vj7P>vhm% z2QvqM%uawkV}SXY0BU({{TVa6JtI{`3RGCiVNwHyC1$7lxSei?)m^N#o~lyCd*=hQ zFo*rZL{!1Y@tFSjNPh5#g1ATE-)H5)8GRfNf{Ixjb9ITSU>MV&*;Sq#?V2O0HkeQvSm~+Rf8P-Dn&(ETT zT)W8hRrj}e&*X3UUMcgx!VmHK_!ORHoMt_cHSkky*Xr#)g^21|fWeNK1sJ%{cv_x# zGZF)|UqG8pPa9+Hml!ddf^?nIq}nb=+r8BoASQYiErx*{I1M`ED(*I8W4FiHM*2Q_ z>AH*xoedos0n8yR9_%BV6xfD+4)3fLPBANZF(ZO9JhWhs6|P5j-gbEDtsLBG-%%;| zM3?Oc(H;$=@yr#rbfrR0uhM~U=2;CeoPB_*uxhW?!e;k_9RLN zy4Sr@pQOvK9d~1WGj&R;kIA<5AbK#n?2KZe^;WyUoRXx z@JK3iZ^SX+ub0&0*glX?*5pIN6HJUkDhwufa*vqjfuxzJ1h_M zF%aB`ACG0414iaI)2tr74E%W~NOm8?eL&BU-3MRfH2)0g8QkR}`wOEy#w^Wvowg)U zNDc5$6HA2Bq{sN;$&NZPDkVizNoy#82$0c(zJ>6o` zN@Li)>slO?2d>w_dRQj&v;eL?TqTdwG8-tD;&=m4MA>55_~AXnOH0}2 zpKWZClu@+CO?y)A3wgkKusl4_GwEb4ep^q}G+B%Iy}kKZP;iX+Wa;wH%}=xnD+lB5 zaDm6$f}uye7fkdS%##-x2M)MlV9^AS-w`_`C%x;g(lOx%p`&2Mf#k4nSK&AAu#f%_qS&b`(ha|aj1DdYjSiT9x^f!l)o zkps{=d0Iwm$m2fK@H~gA32ihZ5chBOSlf0gY=JP8l%a-QVf-@`E_z{V_3;f43#&ZP z5Y~;TQRE*5KPXi%Fp<%#uDSeqf-@R4kzglw59N?_TX3|%l~HR9!R3zH4XX|E%o3}P zhIE7hR07u}Al@eXkB6H_7jjnn#S3BeWb63*jW+)tA?)(@Phg7{d-bQEh@AIEMscE| z&0mT~?e?h?L;1|iP1<7~`&>k@nHMVNMl3k2e_>%*+{@+7&H?tt18#5>q$$KCn<+6< zC^1LmWh<**giP#4jX?=TDvwcA4w-o%Wbf7l`H+Y#J-%`^>DuE)J% z4!HCJ^#{NofIV$=b>sDpYA37AN=UfKdiBXn)hB~lBu9ztEqE34i24b&ZS{^PNMEKy zT5EY+xW+-2{0GUNBVPk!J=&Mtg5y{i_y%by9fVE?z~4D#u5>jM*v}x_R-c&YS^Tf4 zS5uP!PtrQlc*ApnhWO`l3F-cA$Vho(fIZa52WrRdqfEvdmzl1=4oEZ92_a(+3~jr? zoyw47BxdSS>fN6JMVkgrIfOzs)`h*S>q(XtuvN!21DOI zmobMco~$J%Pdi0hXd&3UzdC;9(1`!{Zal4Ix*qk7jae6i7*kHykDjQ~`E6u3zJghl zzd@C7g`SZy#)7a1L}6`vy%S`|MdD}mLGKnnq?b0<7`*UHfV2`5jte`!v6Mx#I_c7M zn^7F`+lAoZ8f^ixacFx+?)VgVG~7vB?hSi-nif-NI4#+|mB?sn^3w0s8*g8g0sVDN zoXlsuHfzOH_F?JUMZ9P1U&VX=A*xLm`CP2#1n-BFb($arbRE578bpiW$M1L<+nEKr2EHt!H8m1rVj5>c#4@aaM3uH8V|7Q6iOUVug2pk6 zk54gI9Z+Jyw4C+l<9Rh!&V`&l$yaGizhS&mI@wyzhUATJC>f#RF8fk$XEf{!Su5Vq z-IK+>QvGm$8l!8%#)mh)g5J~D5Ct7TSJnXLFcC)(fng&KAL7Ds5Jg*>agzejgLle{ zYX(1adVbs%bOuGdWdn9=!m4Q&1c@LQ*`B-A-!_>t7XC0egly{_y7c7Yi9T<|?QM*e z9Kn1pRPf^gHoomJDpy8x1D=WxTTx?Pn+=OYtf(^M{r(otpafQ>F~iT%_IGUvZ&D&N zjGUJC*3zy*yaXFu!3Q5YX7u)vxjDNOyqz$0kqu$M`~h-k+vtb8R7-?QM}Y*lK1?^n zfzueG8v@|b2xYTcg&>&V6-@wFjqtba1E?DD9ahV8(0|wG-uTGV0v#P`VHdeanHxjM zl$!or`LP^QQjneuPsKZTU7nhSfn#qE7v<&7YGlfxZ4H?bRek`i{z`7FBv5s?v6m&VdiG1D;@*VH#Hzh`Y=VXpUl-#@Pad zBhYU76#Gx5_EkKG{WB+13%%aMrGb&Wcz>bCe)?E( z%;rkY;yty+TQ(nq4)2S^)rNlrJY`g%#*1{#!0`*s)7;2Q`9I8( z1DIlV?crNksaQXYz}>PrHRO8nM9+htFNoq{*^{weH;eP>d(0F|y`K3OHowYun41wz zf$QkY>~%I5xcxeG=+o@=r;wk6#TfobFQ=0~B1lz>`6E8h03R$+o&A-Z5D{oGCq&pF zTFbUuATUlv4p8I4*4^NIM)rO(I4{ZzPu+1a_T?Kr&d1LZoc;D4K#=Cl<@`htc9}1_Q|87sWSt zte2nl+IF%hUvgaQBR4+vu47lihPHutdGjmqG0<^fz&P@=V`Vnb%5>aAI!=BCszw6m z_dFo0`GReD1=aO4?{9d2AjivQ8ZN!C5Qbebycu%+2I4>`bejapBP z|7pX+0{AA8s=L_)HQla$783On$`?(zRUR8MuBZv##-6RN@8^;0?0zzavx_iz_w1iV zNB=y3{hssm`aQSfS3CqG`G#t{b#?s+udcL?klMF^nE;{DGQQ&oYai{XuAn=IiC9{X zL%G43y7maPXkd`1t)g7`eWzsq0d8%_}5Ao z!=UwNp%1J{?ffck(h#r0nttnd-SWilf!veosMm_t&m0WcwW6RAV|e=a8lz9Lp}02mpFud38EF zmJIpsId{wc{HSzt>i*y9HOhfed*W0yR6QWc!D+KmykF1Zu6=&EFX>*4lqOWCRZ{Ns zSn5l^kd4R~Nf|4}d`>gXARZXB$TA^C!+nthm15BoJTVoezV7P%Q%@|cd+ zY>FsP2Nmu&zb9VYd>w4Jo$if+)rJ`7r~?&&t3WfpK>v|%z;%I0$+>^6l8wjm74hPF zE>$eVW1l7ed*9|8asNJzycc_)1T4Afkkx7T@u{SjdM}NvpVb_lalld!7Qvfr_%y z*A;9S!(9_L<~MIcH|dYT@QU9LKkhct{xDQYG&=|`eYhz>dN6SAni)(EvI%lR0g{p^ z-uIXHi4}*G5Ks5yFPPFMd-jqfV1cw`uULi#1xp$K_B>)d{2TbUL7=;NAO3CnNHu^@ z)BGr_AKNzn5VipEIIHFTcZud1Es*hk!)F-h6-T{xQq0Y!Q1c}RuebQHDW-0CpF#6`EK_&Da6G zJ7yHOY$dCl>4)E-IY+`$@ti=fq7khex8Y<}e@(xI=elEy!X?<*9n+5gM;aW9-lxc( zszBQPj-ybS*CMSej9(e}ah zas9Zk>=lJ>eYl{93N@{sQJhh$hj7b&#z-XcF$$&Eco0ci|D&nu$yqcc;-V)>L($*l^wvJ zyyWo5P1iO^{3n7F-7=N%Nxe|;ibEhw=2r;E%w+zN%{StX{H=a>rl{VjzkUR-|DFCi z!?Cc}tDE1&>;K$+o%+S>^#?Zp7heAs&W`$xNybfdzo6*cL>CFW%jt$Xr!JDyJarc5 z(Cp&PI~A&t8Y%>9DOB5gSQ}lzH9`dg^WWsI12c4p0Rj|UW);_a^rL=&*7dY+udgri zn+Fuk;tGB5A_9rd$|8Nbau=Qb%5nDRE%+6SyRsMk6t1OZ5obR(F-3>$R9g;CVboih znVV;~vw&-h?Vnf*ydI90#wO@m20&job?^v%I-_IB-OF&LfSg`4!5(2G}xi+GN zf+ocgsYEc~Wv-4Le2cqzuO`FvMVedy>c(Uf(AIIhP$|0qEKScEXqkWq8~YS0g7^Qw7pktAEe!L z+7dKCyE1@RftHP-IDiU1NM+XS5zd4)1{Ni(qwBILg~$y6lci#3z(D;bV(9}}*2nFZ zp{0`-bfq$GE7fjDw+!R`nMkj0Mu>Q32XG5HEqeJ;E2cK4DF&D3WRjsNlk7! zc#KD36Zv^|&a2jRPyb5YVj9SZUSGv1TCIsbuM%%e^;LUHwdT=2(U&rNE7z=+*m5~C zDf6TH1S*FWi zSjJc%8q2!trNmwt)cPUOI^c+G5-o*Bp+F41Sc41n1Ia1N?sT?*9|ih>W&u%a=cPmP z&Mru_!N1ehz(3M*L8AB*l;~Q7@|+aO(T~OA1Ni6ydRhVYfwiJXW*3QW%%IIK$90y9x#-w0#7zIxm?iL*P739Caj9AHm zJVXGTwhhL3B=ZPE^$)bP4gt4`Wp^r-=={Pjqv3!kuLsacaTJNq<|h3f@g3yPEm^~V zQY?m#6pLLmoD!Z8zK-7?rdFbxXWb7DYQv@?4B*+*hJM3MczR$x{8!tqdKZug@L>jTCC)9rq27*Tpz^CsV4$ zJUJP;ZD``$cy|8MeZTREl-Md~#lr)Dx2kbEV?5_6;S1s%wgt>E-YxVXsizhpyssgG zUI$wh04Sb5Y+$H&0<5bT09cDH1?Z)<64;@m>%nytx?N{*VG{WxmZq;9yKA5MS$W9+$ZMtJSzn;v66~2NS+z>L5sQQEujJ9+(pD#`!WHWeVCf2yI$3 zRcmyqb^5y6XgkNTWK7GidpcgTVAhmVZEw+}^3!7{m@o-%m%Vjo?})dMI~MTvjy{4# zcJBi9(R;FkQte(Zu8ZfvN5LjP_oU4hh(!agXXT1_X-+(mRYQZmeIc)e^OS38TqZeD zZ#JjWO9##dWk;+~$VPFGaE_DW3UoDrj^t@pY3o7?(Qb5H)gc4WJ+gQXigW=Fz~W9F zK-Mua0$E0MO#smx6}O#8QV@%_!;HL&vBy%~%*~i$*&{dgOaqkoL6*@ALu9h11aZaq z-Q{Mr_4=jWsYxL&dj>8KecuG)MDPO5X3E$rBK<$BD+6N>&mEX4OwI`Lpj^JI@3Y3m zjXw@VCTAs~AF=+wZN3wmYY2yQ46!~zgGtcj5LL1iJ08pmZ^%^@RrM`1fy{MlViC8EHpH08ocV~$Cm@<+wbWZ%D$buw z95_+;c)WqWBcU?PoIAe~w7bn<^)w+sX${?VF>s5V8W(2%snb)KltOs2%a(w$;LSGf4ubN;e+0 zG^g|Me@UNt@X%mCu|1&6RNgxxm`}g! zXtT8E`23VBoDIsN=&2VRMwb!Nw2M~3HB<6?tj?fPK9DSh`)?XxHvAg97a6qGZZ~wW z!J@2Beslt?4HbZjtS5?+(}@pyh!5a#bj#Xdcnu>hU57)+;$9l|2@trdBPA%22c{eb zuw#fKa@cY`1gqlDjrmO~Z*pb~X4X++DX@|#IV5rAu?usr?`_V3iUC~(=b}@|M^BF} zzIkbC^is5RS@Z#GHtv+&gWtLE%jd=qfAbNSQC zO+-;ZU}*;53tB%uW~o06N>7{GQPL%fcrat_gb?!75SP&iZ>Lp&%G(hRWXxk0SPwXH zr@C&Si?l$Jnq~AJl;dh&((vR*nty zc?v!cxj3uWC1vibT|8$W^OJFW&67eQ<(sD10)Fi#;k&RO8TjuO<9qYz2MkY+nV%l+ zxO?~k^GS2&wzE{DiTGmlY+!u0a>oWkfiq>AjKef^>#p=N^}+>KFoWShAzS!vU)?ea1PsVu-Y8< za%{bxLEY#3!p8Nlg9nnmF7ofcflE~VJ?R$4QN{N`H+YQXv#V7GeI>7yD-5e|nfQ;~5pe>+4a?qoB$wp&_AplFW zRSe{XS#EDABw>fkhBk2bU}M-0kY*N}<#EeidXmAcwo3jzlV?Mrboq{td99*&pw$Jq z-Z0YeXX&!BxX`qHC?4x$b-8!5*}^jI+*1h8XdLX$5`t4P#U=qTH`b-6Lc0veMvg3E z^i*DkZ0#b4m>t5}a^i96cv)eDRbmTu*d)xkFg_|H86v`|6W<&N{B(IRPm|T@ZZH@A zGINK7j=J^;>Yc*RdS7Ay@dq#}s3?b(8>bMd7Wr<*4b(Dxc(-TPVN(G0aq7Z$hB$=j zvAaBIfOjHo)hRB@gaK=nsop$}r!1obKwKAI)9o_72z$xptY<4dSN8%-9%=3VBF~&T5-!I4HfoQIKL0*c@WB)E}9$?9*JE2qM zE$Q0w3T$}?AdFYy^lD!=$2uH(e7lXa4Wy2*WO2V?N0A5Q=CisnCF;2sEI3g zZR?g^HyX0>aX#nCeDl2cpy9pJgQ(%W4Qyys!d(x8nfe zswVMWU&Ur{0skky7k>bUQQUk^xLHiGm?n?&d40F`<3|+3Yd`c^oGsy^&%kg1yeU2t z+StZ!zKRxIcQ;;NU5|U(g*wIQ6bMD?G;hLcLu)pP?fFIW*DViey){_P6kFN3vru$> zD8wNKy9P-&?;D~d#n?2mK1yf!kt?=@5S&*gTRYZ>}OD81+<>T7*-^NZ4g zc))PZ@JU0bKza%xn0d~3q~1}?2?G?-jV0HAqv)sQh?MzcG09F;eN({J%YDuA? zBEn~ewyVT6F2G)5nL)paeHVfh`qQ)>|Qnk4@M4Ky~QIWx)^#Q(^Se?G)RHCKe>Qgg9&?=`UZ?!6d3A<120)5vrGocW+ z&u3Ma)#Zw%!%_cGEP>h+ouSc%Gkn_Z}dy>uYQU0E+ca~Yzc^QTr zw08UPXR)!26MaBGQ6PPktJ*_2QRN|a=m-eg4=LK+IH=P&(bI}{5})qHiJsg`-*A!` zD?v<2TLq@^>hu!5I!%l!g!*|1Sy>1BgXwVZCL7;A?OE$7-}eAJ+y`#MSMA~{`s%W} z=E?W4ree{f1!>`T10#XuF?PI7oL#@8v2{qh923I;fZTx(hj3^*ohL1LpoF7etO{6e zs%wKp5RHB_?$?$!h`(ZXn;lM*OO%avqea5`Sp%ZgXpSYY0M+5|OGJH@{OnXZ=kkcE z$qb&_QlKXWl?ZwgIPQ~ftHotefdX^L5szs1xnq(!6URJ(-C~hKC6g68BFo`Nu)$cu zKY|q!Hml9}t~q~PG)a<@_c%?eJCTTn{f$h-fkAuxI;*>!@IXtx8i>*H|HFnTJIp3k zwAtiW5;pGX2(ekm@wgo5XfJ*Bqv}3VM#Cpfk0sNBu^L^!Xz^ZVVKN7hJTo-|Mz_N zmZa{s!{muuRdsJkRo{2Mv%Ke=_q4(%uTXOxj1q~;I!5KNaa-jCF0T}+^ON4Q(!l<5 zEA!+FT`x9E+h9Qvqqgrg50+a|mS~L5P@<6$UX*(AUQB)`%XImM(aWNkampa&;We5bC;E znLeQ%EIh8Kq|HthG;l9vMoQLHkHZYzKpnTF1_~gf16J797erWxmsvX_CSTVo{6~Tq z4ybY`c!NT#K&nago&&MUYD!~Hc^+Asu&JCuUX~ISQw#><>_j1byjCzlT6B6{wm1_G zWQ3!1vBSOdBdhx2`_ z^(v&=l>A#vNoXyf&i6qsw4S6zYti_8-k9eUu7vEKH#C;X5sTH$-!rX%+ad4wE7)%( zca8fx*YeSRtE9bCkssT@Xy+UiW38OUZll+fc6++q;#s{9zk!SB<{6jX(LGMP-Hm={ zzIk`C8Qm5yWACDu>Gwpb!0u5{6_Kw^t_NAVN( zU)JCe{G{pwI`~lV%#K2(Ga=Y-Aefv`tpeNof1>@#-n#WV<-V<7ce{c(_Xom}V77Zf zt1~IJTD4ZG7c$q!&z&Aiw3sm1RNve$A%E(={62M-|Ep=m&h{;PZxQzG{aq#xnT4Y{ z=UBHxP%1P^ose?(pSd)39D5Bi9oy}~@rHY%fxXAJ1H1U*&3lDQisRO(<|TMX3e63n zB)z`#kGH&jul)KOm;v{^ViEVhkKKPC|4DW~^92-_tuf90!q4G~pc!Ry^~IY%!0-7W zYUvjUDMl3oT9Qe2;B(2Y0?O>rB978hdKuGbz=n)gLOfwrW~FV>1Tg`%q8m}AzAUEk zEM9J<83Pbz$xGE^CaNPCBG#>zBDX-AAZ_1@CP${{AO+9{ly9>F_=E8mO~mA40MP;^ zOBZY?KR~d>kR?{ZNtDmKHTw_;2TLZiS#xCmAsS3r>IEglV}Q+JX8nV7fn?|RoYN)@ zwjcP%aM)pxrfJ(jQ3w0dNIW7pdAcGi|$W8V8Apii&kw{Uiwt$ z55{~t^I~akeekkZ?;FiotV;gum``izN-TBH%?vMP2cQ4cfh9EeYqct^<+U!`yZ5L5k^4k|D=pq6h?wDF#Q7fS$gWj@UHxaO+-Xa_{YdF;Cn(4P$;$ zUi62UF~3U2{3_jTrAol7RuRKQ#SIwq4K_qeoWY5mS)m(d(77o-jH_3f*>*F=__H=T zyBqd5Q{}#lRJ*%EU75`pyLjV%($E)Ak{LfJ&}M=D*&a)=ilGFy@NXk11`rTdj_1Z;QgsP&A0);{B1_OBWtw>!ktx< z&fb~x4IH28Q;oowyW8$vz$P1Tn>ElG%)NLmG)p5T^tGUI12SY}C&~ecd z?JMZ5!Awv$){}xI_mKUT-97I<+nw_6v)cTZZ8oKb>GB^4Yw+p1xNgFb(MpB*QBvkS zOm;K9En2X7GNn5C)@jDEkS5={f_=15o4<|P{M*I4ZHt#fc{CW-+G_~CsPt6e?M7fT zJyBP=-a&fK&(xXw1HrZD9y{x{_6_%q=2Ql)L1hvGojK3W4{`lddaY%jN9+0Wu|I!Z zHP+voD=U>c+*lqtV>Nu=r()mdZQ=KY!`u{f$ggn3kv?zYZ15_2=Slo}(L+pf4xpTZ zE_B2RS=cDRcTCSvwGwi0ZGAGnEjpn=oUFIM=_-p|Sc)#@-gZ%~Qx7v}J%ra$RjP9w zOEEnU5$&;wy-+NiINu9ZQ|l9*AZ13$IHB$1ET1sh*9^lZ8H2>k44V_xkS9TEg7SMfln9eay3d^&^C|?Tt=6M7o{d&bqlfGKf7Y7yR^F;M>Y-{33-i;@DouH%hyy~a9_wHphVoXpvZ5FF|2N$br$5w@B{in0#|h7RX5At5-kqZjd5ZQoxCCyjzZ=NDmv!x zv_um6Cmms|DWS#%HT+|RPEeS2!b`WU#aofaK)$Esi`nB!odzy7Y_5hkDL_;N{dxOW z=ij>i>9eJQz)bM&Ljo)*hDyla9dYhqbkO}NN0mKV>C29>T<6#@#YAIJqb=)O*i7L|r`@|LIk4bo2=H1_!uBmmliG;;(*0K0E zYf#z*qf6eVJHlh9CDoM--+z6?*Op(sCZf}O_2ymKe}#XrI;%4pjV|TC=uAv0{+=ac zRsMs#o9xHF0NJkY(B3~j*_LRnh0c+D4B)#k*?wGj9R6ojaBcfu;3#8xfihLg+m>PZws zHkYlU0k0lFKg1>coS^%av#7?m`)FJw=jy( zDDYLFL7*j)JxOWZm2%vQ6M-N^K0#^*Y#>r;L&xO9wEf#5Y&P4&V2bBe!PG$T1AIrH z>x^HeR~r;YLL+Ru=VteiE$qGoU}L98AMP-on4A42y;TVqL#xKHcp<(ZI! zSNXh&#}!6FEhq$?U}Sj2l6<^`-Lu$!fxwMAuMj53hkm)}_lL^hu0|}S7m_Ze-p`jR z*fQD1(Vk^s<30xVR}@r}a|sxa^iWQq)y}~=q(%!*MV|4(tY2(f%wa=V#a$x?mEX)s z&{F`f2B=1;5ui!NSu1Oj6}@;_!R9n6sN9b1V~$Gh1e9!no|HOVy+r5~!nqTW*l77; z#9RvfUxvab!zjfOZEXgUWXX%9Iuv$E6(hRjVg6oU@k2Y`WJd!=bb%gpxVQY3O!vk; zDZ#1_7I?#lW4^4hga2B6Vo%)RAAGPlyZ%b-p?fDxhE7{F_sdU?7zD@Dz?0vG|NT!` zr+(B)%@be42-9Cwtp<{Yh%{MSpmywrK=t7fwsH|#Ii$O4?NErqcilgkM+zJ2uo(NXYDEgQ%ZvMexFnejiIy7;2aHaii`4RwsZ|LW`` z!&CXN(cRS*PQ2#dd9l5yzbQZXy8ge#E!PZz2M<^(&afuOZC~mt_*`Ek zCiup3PK}w5?kzM0S~o13PiC{72NmA4xsbKfWJW0y(;Jhts|6uLH0LXo*-XM*Rf1i^GD>xl1{Ucm*P*IsUz+F z!XJR!mB6SMOx{lU3`=_V0JqMaquCqc=mM-Im_yi-Y#^<%EzaA&*D^9c&qx(u^H#9~ z!Z(HWm||7wQ?S1bT%1SJ`SWI9cy@W^AVvPDC=bD3Yfed}LR9Am36r9FwEM`xJ)Jw` zFqjgQZ6KlnX2foXh8Z5r{&7&42Wo*DZ_*lp+%lDy(ke2gA)Br;ncZ0T+Lxyn`UY$& zqur8A>CEkAln%8~|9->h;yowSq2nD9!Bj9-9yKy8XW$cVLr0-MW%9dI*40G~pYAFJ zR5r6NU)d8wLiUFHXUC6Rw7cwn!4vTce$t75c=LZVJ4TotI(O4#$xxX}p0bCLV0b8! z1Mx>2$YY2)2d^KbmEtOJJQ`|85?f)OOa(0hn~lmD3A7`?4FnR@%+IRushozhiz=$* zuGlsU$1YG0CaFCcV`C^v3P-zAMk_x<-K5})Ej=JNvQt=OR9`_iGNDAF4Ini$pF>0k zB}sKR(2`j5ddySy{84yn4_f2Rrw-ZeDz!W82?X460B#ggn`*J;L!*ZIk?y2(&q^r` z8i9shgsqHFr`V+0we`17uh8eLh37Vuq>Qq{DVsOT@eSShna|zeJ%?Y19fc zv;WdsTDUpx;}RPc^=V@@iHZt!r1S`7q_dT+e)fcK&KH~EZBd6M3^Rosu44&xR+`K~ zAz{l&JShz)bv4g9IW5xhFm{O|Wi7-5xJQR1Xe*e5yc0nel_Qe)duWkONYYV@BEThQ z7?3Mh-nRt@|&#;{DEk**||Da_v%0j99In=~tcUMrQFSmR?~M#z#k1L*s4n zeMbkZ?PGmSxCD6}gXi!xn~Q?(PiT|oBqIT!6)qR$<%M5CMV?X|$h?It^A=h&%%hrt zM+Kk=woCFE;4p3Gd;9vCqdOPJ>Lpn>XN2Z_iCGkXi2Y@}+R3=QI75^%e-omRunJtn)!++NckFdZ<)&2XRR5G1!T^YK2CzHw^D%^$Y?hPTB$q;{CyGTfl|Sw#ip6aZ-}O?9G;G+KAs{72-{Dy+>ZVhpK4qS5yy z=Aj!}0tbyjo~+nCj%81y-w%{)oH!1rf+pPOZDMf>Hwbo-rn~L=wRZ#=%r(pLPC)Ha zCr-&S}><8G#HGn{XNBI$F_J4Yj_=Nc#Rm;y;v_wIEi{6R_Zd+4?2GbWLum&jTMfq zoy7_xY9q@?*(4|gIF>Og&1C7PVF7ADmfL-bKvKvspIA@gsH3-$qr$wkB>5ojKN^2T zt@r57f@J;-lh>y&%_G(dI?5~Sc}4%giGNF3KXj&`wDUmci~!w8l_*q#+U5_JtQy3A z8_y^*D?MhtrJZ;JIY7s(!X!kpzRXbAycqBMNjki$CNR$|P-=?or(SKc-K#h8^}K=E zL*xdaUuLN$F;paOMJ#YD%h;Z>)C&dmA}1D6cIMnuFLQ(~HAl)KVm4x*4zNQI0G8Cs z6NywKPyJC`p1_iMY*GNEup$K?n8!h}8s^skDe+MoBC8YMuUsVci+}fn{Up(}5hznk zqFX}J-V}m^louLi9|FY`3o`!_*uV1GE~N4G`pYNFy(*JKg6fbR$PMoN_3kma1CYw5 zR*DOg!%H*$c9YhuZj9#4HYM}_bmoPkAfExqG{tvsv$#WvdXypJGe+2fB_p4&$P%$d zs-3Q~LRUgZO+}F-zG~E{F=0mBp+~(7RED0Z484jJwH^ie#P5!2Rw&#eL)c0%Tr?4u zLkiG8Lk<>!9;!GiD%8_Ub)E&jC?Kbf z34eEhpb`WMFd4$#Nduni{Mk=Mg(r7ja@TqkGkTX%qs9MpZsGkT*_1{%80?+dY~k$b zMEx(KRZLNgWDnK(zp56izJZJtscoHBqtV;-ZmeL)p+)J0))Gv+SKKFJM}tuvF9=RR zoJ=1757Q5;=9a$31PTR9j_51ZP0%Bo6T$vwH-!6)E!}`EU|=uq#t^k_AFUZvktzG-~}f z0w()n#_WnK_>fVjvZ|iC$8bb%*WrZ280HCD_{mCEr`G5*OE!})so>G7W#;+ohLh*5 zdN^)+IBpU2M^gQOgctY0&Y?~U0*LBDlFBNB$ErC9n64-$`yq?qMq;uEqoO(^# zK{~`L!cYgTG-U{>W@&l5nO&oEO$KZbWYA(iHG*{8npLdm1SF5zi9xL`kkf#3%Mh|# zeXKi*efEHNwzQJu)#^PCrLEfF*X~@^+i_+YbN{Yyx*q}<&h?z~@Qc=|JUTq?SWI@1 zwU*le_gC||`awMj<6!@X$X6iD{RhHlnSMOYHK%S@fFqLqA7QF*1p1Eb{{$8V;5vq) zh$%em#9DT;5^un2k}7mhV1>YsowA{T4>eN&VkpbAYj&iyK^#EhhW`h77KV`#r_{Jq z69coQL*T|n@)da5t3ohvADu~LfOdY`+5xpclt6fe!q34|+?#D_tFQ!B&fd}bg~n_LDsd$TI_ z-@>@OdjT3vV6UR#f`);Bn>Gl^8tO5W@+xHqn7m^&EyDATkJaj!hASgArO)I>ooFpzLMJ)5AUN8spfL z+#*zKq2Fa#36F}o{=@tbZ{}HAvY$z(`wxx!R9D|fGHP*Kla{-B1G!|#z5-5+5o>p+ zyHGgLlk@NF;9fqM$ootClaxT1$x+Gn{;c3Eav>B zJimiCYZ1L`@Z*le+xgJgM6agHH{Pc(Mj~FoHIkAvd!uSaS5B5k@)aB0BoI~_s*Vm8 zI^`)6F)oG35~rM~aL8bfvbxeyv=37E!am0lTC~2+@@$xa>|#XJF7g`dj1s2~Ey_v~ zU8sQ;J>V)pFAFu!`H0A5)9cBOlUSmmrGz5rJGCZd$K9+@3{puRBl8)h42yKKiD;;x z_Cz(c`d-qq?K1w6CRKcJ>DbtS+t%sS>)f?d=2W?RxOX%+Qnl&6*S136D(X5r?#yDI zKHT{D>ET+cBj_{<-I>VvU{9_R&!%Pj^Y8Q81hXlUuAJuH&r#A`MoNq*4T+P0P2;TM zUuxjA%jP-2)|9Eu8R7&L<1jEN=Qpu8n9%UD*)UN7Il6NvVX6~lX2S<3>Gur+WNA$@ zO*{$h%DOq@CM>Byhn+I$S}Y_jkz9!fr&_W!vX3oAOoBAgrv2KTej_W`{Ns*JcOo3I zyEM9r(j8(FXx0VdLy>qw^V+*6%wKz7ha((`c{^R2r%hI^Y@gNP&d6}YJ@||7k|+On zvYwP`pzV-L%#LmBW``RrJKUg-m;p9U7jg-)6|K}+C9OJ7M%~LYz%4HWpS&c-ax!=T ztBjfM7?A-MW0n~xF^Hf9*NF)!2U=`VWrL;BQ@>wxfT|JTgi~{@LXVd%Hj#7TXF#H1 zzBSuR`q8bC{3BpgZT#e2R#uKY;cf2E=x*-(b?jfL%m9wLBj(hAO-@3(_v)Pw+p-y! z&fUw}{<7A5zIGV(1tufldZR&OVk^EcW&52^qeOvnw&Vv1H#cwoz7WIN&!PI@0X8>G z^2;&Xq3w>Vi_O?xP=nF~jwMqlgMzW-O{E;e^pZ$Y4Abf*qJTy(*jlOjKrB($4XQ=K zSStYClZc)LqBi0noX9?Cn&sd0<=YhRx_cfG^2)590eCV2<+vaud6)Y!;j!H~3i|$xj+ENtO0oGKvK` zjRomGKvIOz1oZ-&?xhn{RxdTjzN5ED-R5l>p>h`~PS(VvcIuFZ*^vTEP%}74LjM62 z)nj{lQ1Twlx}BRn$>@nmwayujX}WFExWaSJ)>TDqv`VW`3xXM?@@hTO(+zqQ8X`8!qP1#k4kiRFem9&_r|g{e%?))jUhF2*|u)xhrp^@vGRDFb`1Z{w$rnc-$u)lN<|oldasjeQKKj41nDH)Tuv#UG8Ktw`inFR_ znh8PBhLi~;%Z_eS;@g3bN(!L?Vy4R0nj8RKD2f-!l!piqjZzdNdf-ZeRT|HE2qKS! z3B!F57vt#eLPAiVQlf>uy1Nr}sA1RX&UZwa3GL^PYIT|1z?wEZA0AhzTnUN;X#(_o zMw>U=?U+UvN`#bZS3GJeWtR>&jCx1@zQvBNueTR{SHN$LHFti*r;SU~0Dky4>$ z)*^w@p;TCHfL@bPhgt18GS;tkbw~6g1M1E@PC)wwDhYVXgylxPsvK8ZlbS22GSz6V z3H?k*?8Tcy+>;zNi_0qv9-{~|KM_Qen~ez7rFY}RP~h1x5h!Ywn*HV5%a$k$K1h&90%~`VCjOGYe|spkn`dPvN^(*e>PME2ya83rRoOcP zw?~#=OgorObJ{A7_KNe5fANcVO8IU;`I(B%Ne0d1O#QsPhMAv-tp4WBKVy1y4*4fy ztw~GH62pqQG|HBsP$^;3uD(UW1lSO)eJf6NU0fWBlZ-s|>7Z(<#W84~L&Bt$W#%gj zO~Xc%Dcm zQ65MuAcRCM32*FD=gN(rq-bY)8^;w!sIlIZAgGjj0GD_-(o`CiT4B_95*A}#_9i)dzb%x1XpEjR1MbHf7@eWV5emP+uXT@HXq$C5bVw6l}V z_Zy77RDUY~8uPYD&daBcBx@W>2=?U3Z4HCWHU{<>pn;}3Va#=7m8J+4xXA3+1at(C)Hr0=V{dGF2l z-29*5qD^xxGwfB9t28x5VrTJ?T!V>Lv}^ELm8|*GfKRMpABue-`E$a@saOBP97rD? zda~YywzZB%XV*cs#TU2xytOW;TJ5zuwR-659o^19(%*x=zQOc0{sp@)zoQZk-fSrr zF+T)63}|IFnm9KCH-7kf;!of&! zAssZTG+zo^lv;4e|EsWm^Z!v?2Cq<_17iwoG8mQUw_AzJ9EuNmA5VGAF$7x@ja;OO z7^J!P{Uu3m)wE6WAAj3FJIem*Bljze%ASZ?Z)$#=z3?I7OQ{5X1nqqald`X&vnmg; zPXrNTpQm{9L-?*id|R484;f>;$RYZIl*GgdAvO+|lL>=7oTgIVDWwJYW~0f`(4aRM z)|gKFf)kN$qe)Rs+TZ~JX;g(e>M2(sg!VB(ok{lQ(bKn6=f8XNtN42{4iO)OnuuYX z5__DJ0WwZtGoq6MTQzBB=_9mHrSut?os#Q;D3;y1mKGwV&g>X{luk`xNux4?o;4_c z8V%A%pxPyd{m_kB(2wcky?>@43FIG=014y|HI6HPMH%4tQ%|tTt!iXPI#-A z76hNfvu_6oe`KFxz;Y6Yza(~nmWvg2pw{~mPT3X|qp__-%FRkZ{n2rK6 zGn&ZJ5-0@Y1T?DgP{SxDA}(j?4^aVGrOe1ii~Ls>*SsBFs{>bkCfkf)jMm5I6MMeK zVaV$oPWz8!4Y;WIuoaMRJQJ2%Q z(V2sLA{k!*Yt2Sw3-iVp0*;cW;I=povoOuNw5NxlQi7~eBM1%6>YSzlG;WPf&Mz#% zCFjJ54S<<9Fij+X%`|GBCgHQ^?I=mda^mo4aB%9BE0CoaUmUn2a#-y7Zi-yGx-a@8 zCzAd{>l@yT3Mq~H`;I7_L#WG{}3lFOx72N9V{l~X=7qU z8&|_%7Wg%Yf0};ARYA@SvEqpiKXidfL9ma9s&e&AEilK0HTy_M?j+3_$?ZV7C*l7M`^Sj4O38ML$(sx!r)OX76`;Z>Nrl!>U*sP=x?V$i9F=nMjf=RYTOVTvAjFwoxx zYFa|*IH}AG`E@on4=6F!xp$OXRRY~O^wPk1QbLH0#&b~yhe*C`6p|A-ggy#LFE!n^ zqZ^=XZI=SZvt7JLEM8R2hdjksM*9^mRBf>)OzZ0K6UXKcO^(fAOqE6(=p1QelA(Oj z=P@MuX4d&U|9MNAB0&mJ>`LdsiP7;>-myb&qt>D{r4|O&`C`cKR%Pvry*ec(0JXpC zL&7j*>=4U2$R+-8po^@65nr4KzDDp4`kM(Z^Nx^{;H5mw47P9t=*^~nU}%(`;v^2W zIDjOoSSQe-g0HP4Adx1hw7(yPaV)R~T(d6$&8FB%$Gg2g(!r(d4gU~$fb>SSm5=r$ zs(}J3my@Gs)EeE(vNQET&?oy%uA@$OI%vs`KQS@fHF($~*W6qUET-65(ICk&Nb;V;le;2e1{viK%(Ps?n6Wx77qwg7=nQs>- zc%)i|vE{(f9By{#|5G3r77{^J?(jGN0kZuJzEhn;E)Hc0@CQk@%d9ZGOr^bE)}P_+ zl*JsGOb2~qVg=$<2DsPYxx(3{&JI-bGFf*Zec5t*iK>+oy@b^h39Fp6-1Q43S(g}* z+K!^zwM$g6n?*vhvOK89SOSyQJ|8Id6^!cCG#dU{-$lDtH?XqS>sBB)Ihr+Ft(^{| z!8{ln7%Wbig+lJ{Wln(~w;!C*EY}9Gr*yXemVZh3b!0J~;gGo9nq=R z>*mEwWMp(x_Lj?mh!P8wfLKuZjBM0E=qOP*%h3jt8MQ`|5N5jIVIe~#y+Ec9`U5U3 zX>%`j7@dp`vo=-I_@l*4En13R)bJ|434hzH-3)c9d>PMK zH|{ETqM_bkm>8)xqJdh_b=r%R&p*k`h&AV zS5Cr5Eio(Ah9WRp8wfi^*J!Z9LYXM63R5(wN96!ZYJ&$&BU^LGK2;aeV#wwlrSPBo zv)6E#P1@(a5bUD-Ybe)W8XBJFUwrMGS{zwugWrEX89{EfBjYYl^;4fN&&6;4AO5@i z*Wf+%$lc$F2w*qm+6RMgul9k)%MpTz`UPU#lm?YL(Ci?^36!7PEma^7ODa+z2Oc#F zzeIXQ`;CCnzL+(+)1l%scN-3&I0L;6U#sKO84UW&veo3vh8?c!hT|8_te=6cne-WP z21iga)G89zCTU&yGs2tStIu%3X0iq|0r?3YIGZ@iJ~5F{SE)pnBf3ASm`#c;cGF!j zE-ZBeIlAS$kjZI(8~SVLcyca^^$Ou2o?njHkgB=kafCb!RRv)(IlNm zGTbJ6ob`-QI|cDV>RCd# zz&wHPwhP$Ow`U+=y{+ckt~W5*6r++@y7ZDdJJd0qC@S|*S<@4XQXw|@BxF(nxld^4 zNB0s70iTkprtKETe$@3&!T_eGJa4?g2p|;T0iZtpKwRZh4-&|+?o^r1~wayO1%0+NfYl*EPy4G{eC2P}-3RFypmVgrm zekEqGx*K?hDUa1f$?1~q^J;^`pYA_EL5-WzS6Fee6OHAZ7$94L)^ZgZ`SAiZ@<-4$ z+B`t5Si}S|Ovjqev{asVTRT6i-XjaLzr2spouidsA)gUfI~Z2S5)~$xvFLMXc0=9X zKZZM`;z8Exl!w>M_X<+4h=J+@q2J-UXFUXFzBOO!$#Mw~%Z`Q7{l#lL_xa+JHuy~6!G zZ)D!*F)7A5$0l@9wDXCg=vW29{eZMrI`Dr{=T})e4I|7|8G%Q>$&K`pe*9Fid1Jfz z;j;KToYmK@;%nHAhw<>~a_hB+=>)v?KJ4DZj67Ui$Axv)+SptvvpC9KZuw8rZGNDe z;xFLMuit>8z4ie1O3&HK9SR#hp?I+><(4j5`ll)kC}> z#co&B`(rm`$yB8=rAm#0GT}+BnOC)=>U3tQdv;c0l90r0WK}qL@p^|0AK#Sz=1x1niXUacK%X0B6MT=-zd6P{+e~XHNcA7ur@HxR=602Oa z%u+H#6kcEoYtFW%Hgbg?Izmb2Ur*Rt4)-jbF27y$VlpdOkqNf$>Jvi^tVk3MoaiHO zMaryEV9eg^?Gt;@YqaU-CWu~zdIv1TyKb~^y4*8_M8WbAlt;)B3t6aNli5E791@MI zHUg?CwT3boM6^c7kKN|5CGjS<;{;@&dq%@QsV{`|13_=cc&2B~o8>iTx03IShmH<4 zY8I=0c)@S5WOH**Z@hNCI+e{$p1pCvfAp}?;@1TEXCs-OxI5ET?>fsH+?GVB+t)X# zX_-Chk~-nu`Fo#5&l@!P)1${9-}x1ub1YX!4)S_!x4~lzYA4xVf_wMWdYd{~C!yNd89{)aub6h&`h!w zWiPPyGP2IC649ti6c$P@k0fFax6fHG&5XrAAMr|J(G_#udL<{^^Tnl+MR)HN21n~T$plT?**kWFpFbM zN4fOWndyxOhL=Lw%+PQ;(c{%$KR9!}`tj>0UhRza)W%19J)q4Crjx@dpUPph@VxsY zA)I*nk93?Gd;CM;hGH3d$OG)X#P-_2weqMQ7c2VjZ7M2xbd}k$jcEHpd`wN)l9p-) z==?9@%1lv=kXA&$-ykL+Sh*N(Le4dWy=ZR}p2sy1yuf3JRWC1)<+cxu+232E? zs#zXR^3umCaCH?JkchFWIl3)1oKTMu@{Mgi?$>U$s zK6Bwo@l%%{nP2_o7mOZj{l3ZX?%Q}Cy5OIMAMrne)(2ZZ>>Yq)=x*3IKQ^?JjX@w4 z-kG68-HA$LHkJkXU$k9NtO25WdH)!byN+4}9DeFEL{||2kxiq;ou`%bW55qy#!Bw3 zp0q@S0LTZ2dF z&m2AM*rck-oMbUsAkzlJWphj1AkdPsG9?+H-=ii?OWIPB7&jiLDrFo$ToQhFrIr~@ zIzL@oxo<_8P5L9%FF%?M{`qpxgBzpek}qNnURya^>^^<)%2X{F8L||$CPUB}@KsY| zCm*aY@ceXl?~+|>uq@XrQ(qogj`}+b{Cj)Ga#O2a|5z_hE$c@Q`0bXR|M+vJ$#B<; zwTZ;^#iPApi!V^9A9?ojz#* z3;U|S`9qaUNJ9Qz`ytuauPeUO*1bwzcnLYi5I2GR!#Tu9f6k$uTFiA)`TPsU~>Twx3wTWTPimf ztl}}q1Nto)(J2Qr_XV5N+fxU@8g^Ft`L+lP-d-I*hoeO$Azv_jrpsE)S2n!N+>oS3Qu=*R+j5)1yAYf?AWQS@axQsVAnAabCi-&gT% zbn%7Nj)lJI$JQ=>^p`($@u1%yj(PkC2hQCXT7UKY#-o!v|LgVH=As(1kS>aohVO0aCetvQ($tNXj(S5m9pVv|%^BEkDxf2n1hhJsrs<$oIp_)a z;ag)&1vSU4VjRz^>^7F{=^&M1Bj@`~vr`kP577q0k;dVV+gjLXwMwu}3l-}iV1G}J@6I+g(>gXM1`6FnFI)YZo*j7lj|3@5Nv!TQ3 z3$VjmTjcrd(!u(*Ps9^ly=!^JbZ$BudF!dA_n)fsU(EJ~vVk zyoRG9eaVBRm3K=kp9HNat^7(7D-YZm7NDi0j3=if#ICO>ZW!Pb9Yq^1+W^0$>isM+ z?x)UXByuxY@@54KA{`8( z8E9#{rgM~K)fZXA6#Af(b2zV2do$iA4j;sg8-2~gwk9*v(C)41@H8oLT@sgYOCNk= zagg3(2bm%9IBnp_58S?yJlj+<)Gnr^Z{0_?$HwSt;q)Zv06@2SS+oz>fd zW!l$6ng?&+*cSpZ_n;?jHJ4-YME6@y#TO1w!zNn3oz?uyCV+!3T*eq=V;-sQCo zw#y&O0PC`3T&Ymn8I4)j9ys;HXN;ZQtJV4Tmh;BDFv}6@M zc$Q_?#1l~JDs+HQ3GS@z^9pUSvpP6}BP-gV;u|{7pDK?{9aud?FD)IxjT6KIC_0gz z0@IP)g2>tMOCS!1rXU(w4-1=CZLQfQ)E5A)q{xUIx%Sz-#V|`&nVP-nEX(1L8Jb!? z-Yl4g>Bru))`_-JS2M_oS#^GO=7M#4y3#hw(=%_qckbRkz20O}RbM^$`nEAtm@kn{ zKYD($U#m5m*9Ru-K8y>ir29rO@!jc2IeGP|skys`*4vi&)oU+&X{b+c(-~Bwvw!n? z--Wwo^OrAw>dM@Evue9;;&k0tOQfm`mEPsQOxfJ{KhpuEd%r6D9p;Um<*xE6u62cW zJ%o)6T_I;J6h->G^MWB}eG@Sv@-Bm;Lt29}YY1y_?coE;dSx=3!FXgG#5 zUAPMyXam(17wVf`SUYl(OuD#%R)2B+94>hw3KHoRseQaaq5u^yo`f5KlrgntHILX@ z%NtA-09jA{|l#``9lMH;$kwrgShx|$-@hp(zp91`NUQfC;(X2bl5sUZO4XyYdJg3g*egelL4Y3GqD zY@#HsPEvHX*gS=z1xSQJk{$Sic0B8so`HI&glADEJK{Og7^e`aalz4b2t(6g+jRBR zNoSxkr)8-yM}*66i)oEreIlYrYg*W1NH-Z37tT$U#c$q`sCF~FGH7*Y!p;QUQ#Q=3X*_! zknnVADAP+;UXh$h)gNE$*%(Nu%7>iKe*BR)Oq~Ona6YO9pK1Dy8)r9+j?14IYn<$l zO{P#dgR-&9b_df*c%J7 zhmr+guUliZUl>e=@)w#5lq3)U1yAff>SWYe{*40%KXCrS`v*2I{q}pFJ}K~8waH|- z^2)2<`WB|c`SkiOrP-vlbjJhNf9ASJm+#D!%EH{7<;CNdKlbs9VeDs--7H+k4FuW||L?$Sc^_i!hy zrb08!az)HpmhQsw!aDQA*~*cb3y;5akz{z~+Kq)&E#cKzEION@bQ}DxSiHMq@^WSG z`WioEnJlb6^11tOe3}l@^T%dRmm+~Eaw$gMw3wJmR{V~QXJ_}Ww*8^cgIit89p)_@ z!6B23FP4;3sSMUdF^6>oQ$lAAVJwBLnAr;y7(Lj8lMGlHbVyD!v|G#0(%g1*wec{A z&5iA*vAh+Nyye&i*;<;DNG!YCO1?9B$Q8gO2y7@{auiD+ z+rVmjF?I#TrkieiV2zHz67gNZSK7+ed#4%bSD?;0#IT#{(!eC$GAwl`CfD%xnPt5F zfK5!()asmlGgcYfpq<3xGDc-JvDjkw+VF&moee4Oxz$~kTp)G^WPX-gfDyK>DUjP@ zM**LBu>Isv@xLu06g$`7!EIieE_VckMmjsf`-7FKHUzSGZKYB6gx#J_Pi187Y7hSc zff92pFk&8a|BY#Q%!OecWr%d6h5ERRarB)&@@%c_4g@;Ll z+f6m5u}hKAQn_Vo(A#K)4$Wqt$4*OtF!h;|(;Jlb9dn>#cvfN0S}`ir<6_jYyMj%h zr_7jwOch)i9ip732PxYj=F?&(G+5nZ5^0ok2s?UIVYy}9NEAV@!=iv9KIlLdc zx<9qXLY_7bEGa)XGjP~1=HalCPcmxzeBS}2mQrqYxk_jG_j|(e?jybP52#+RFV5_O zP~`3Y;-bcEG^lC`CPd^AP6jY`0b38o($<1TF7^JQHavB<+dJi$pcRh+0JjEj1QdZ+p{T zs!z_4-yvqHfYOh02)GyIy&5=^J(R5s!A+&>6mUTQRm#Iag|NmLBS-UsZ_$#H{v)&y z%MSZffT&p6mu6)3QpsVx{f~oyQT5raNMVJ8r=$`r8AH#HsX!-$onLnd3AlL zb~KPFuRlKNua9;|K{Dm(EO!ncI0aNM>~mYx!svqWigha2IF-`}yAE_`ONVQd$&Lpm5|0IAK}RGvW}K1j(C6VJP#1O!xI<1f z<214ID2|m!f$ys!9VLt-?x~0|oSGz?)J2Lj$?QuK#Xqbm+rLetx&|c0Il%nLfhzVB z{n+F%Kn9==TjNyN%#9NR1I;lSK=nAt7MkO>EoVoro5qizy#yIlP^@6?u4t2zAW=<; zk$;gQl0+U_i53~u0Azt~hj%1c0K0}VDVFTwr*5(BUwcK0o-xk0>v}@X5{~I}SXZp+Pv<3mYLV@MuZg-^1t$XF}r~iP(ZhqMJUljfucozu4 z`CGE_GV=m)zrzKilCM$8GR>8Vv~syZ?KXtb+o^|vvlBpOw~B)#@33!Z!$?RAo1mOF zYsYRTB;RWfXq3G5joQA$vn35!}mF545d65YPI2(WdlG}u4GhDeOq z!~%-U$)KIMvLh@vaRcb?r34I4ozqG_Q=<3ofu=!#2gS`v9s&9QUQ!TH>(&wKT z=y`Nbr;lf@Pb)m-n9UaSD}9wHf2sHU^o0W3uDL6OkSD#F+Qq5leEFKrQ-};Ej@D8W zn=coR4W8udX@9|@$qXo~T9YL=f^*PQ!RSl)3J=-ZaYYMx-h03W5LL<}D>02$gced}S)6~v>U~lItgs)61 zn+u)cu1@SFd~M~Aq2uo2-ow4b$GKL5^jtUeT!N{u1iXgUF^YgWM8IfaJjO7RW2do8 zF!s;jMg^|6wD<=MNG;UA)99`%OdMMF(8FaE>s?{i>&gwh$6IbbSrnhA&3}Kfd2XAs z99#EGn|Z%gd<@U_(#|eC3rN=j68tLR->oRYcU+WQiI<@z?>;x-r1*e%txtw41k<7 zzcEMv%h_6V<&NOm9P3^wxx3oI^_fhtG<-|Ieue*&nYo{PCY>C;H*T2|lEuv7Nh83% z8w-6aZN~;M%nM%{sgY~bnERX8XP&%o{PN}V=Wh$Y4<5ag&dA~S&fgDC-Wtb0)^SZ= z$@Q;O&Ufc;6yIk#-#BV+ALeUZD@4+FH>B^ra`SF0`8{L^@^_P>&r>-I9Msc*Y>z|k zP+m%ENK+P31l4Msrh6Lb{G{TiG!p3bax;y*EQ#ME#pV@^&y{>yL@yWx)pnXBkEvY^ zwT27R43lY1uaVqMFGB7fh1|uiK#!a!PN_F-fzxO2zCjWO2i1f@kno{en)-1mKyM`~ zN9hp~wdqn%;}FdpY);!-`Tljh%!#L$p@*i|a7V+oxqkBOdAjbfi{p4#v)}f4J*vQm z#vYN<2b_%@il9YOC5&Sun1Y9zigwzy4J>$JA z#qNFx)6Tz)K4cELnT!dp&IcwcMNQmm=nwijRGS~1ewYt7j*pgB*Q|BBC!z>gtlibw zd?Z;v8H_BGz^;xaFw@F0U+G=-Zu8-}qn6tLwCOzlVZwhB(`OO{2u(hY z<4KffS&X)MVdOw{czvL|kuKM|Ehxcqnqo8Mm1SKedt!FBS8vrSzx>%AP^$mb~q+C z)TrhkvVDqt`31$KX=dj$rRdf1JsCK-pquF(8NGfqGqln_l=Q+nF3zqdb5gi4``}#3 zNg_ewL-o;wM}0>49;ZX4X$L%>KVb8smL*k#ynmRvs-jX4kH^kPDaqr>mRoklOUay7 zB>GupDm)(4U>%T+8o(Gfl2Xp=ZWgOS_%<5pDmv(k>=E;AG$7Au7CNIM4&oBsYJM?yS|8~QbGV$ z!8S3VSM92)n730yn&_RJ9T+%yzuCrypht!U{wuOiG7bOaciQfY%WSIie+E}aS#dmY z=oVLJ`Q?+m#^4I&JI3I+_AM-3pCR{#|F-0uTs7;JsJwB-HN$>?UiSL{rOX4_wgUs0ERW@ z%QqHQ&rw`;OBmLC&$*u-mGK~|Ptc-wWs_^7(*pB%5l7J%&tOcq0bijJMC};OH>2`q zO_|`FBIz#lu$Z^EkQAq&)K48joS#@PkrXdOaVaIU873e?DidxhrFsPfxCHA_V@sHV zS3{qeM47M{(?Rl-M7~Jq9G58)nu=H!*-t7VE}}BuoTCCJ(dNNRd0M`99#erulx+=L z(A~AHF)th%=awP`Yb+|5q!jc=x=$au>-kd@#?D=s-Gy?N67hWRYF;&;nNEd2dR8z> zv*BcA9gKZb*R~L`5WVLF!cz*q%ft_#3GDbP)1@3DyHeiGtajc@6 zgB&$|m~B&$X+xVc<<=l0SR5R~CG_I~EJ$F%)4O0nnt9u4m;g4RvSYg$EpPQnfl(i0 z4e2AWppVVT*_xCz#H571Ne**so)N6fBjLoR%=Hn8IG}?O+mfKjw-YE@NYyT z$yt*7B$gT&IGT?b0^SSO2$YN1H7Fw70z2XD$oCQvpzTM#56~}ZBj1>=);xPO{d zcdI&1Sf^-5nusO^1~gDKoD!uU`%lU{qS~xd?+!$C-;q(eaAcTI2S2ZUbawh~1+quZ zV1xEzjioq_&|0osJ=hidD1{i<)Al)fb>AM{f6OvnD-P|RrR5`ZmhP|g-hJfp#?H4c zU#2~!ypM)cAr_qzehZ8nF7zapxJzK7dy2orH9^e|LJJHCCe3xNy!8khG1cq>HzW=b zI!EEqW2PDy3Ymw09~vEiWIx$+ACT-myyh>8r^)4iy4XCiz2%ma+6mStcH$7k0L;b? z?9(2GP2fY+%0=<#Ff$q*)?1gQ69>Ny9@^G}(z6Fyz)Ep~_zX7JeF7VqqM{rJO4-5m zNy9u$7&uOVgvH-Acbd*1BF-?=cOh^0S$g5JU98aVU$=>qRJ`{f{C;YWc+4gu0Y&*e z@h*6HoY?gUwjL$a3ESthL(_|^2Op!io9u6@0D*waP%S z!>2-gYFOJ)Jalbg{9E5JC2ZS|raOX3P?)BEGZ`(|yoofwYI1~3Hd}7QPz?)?%Aeh3}%Lcn+DEZ_4%oGTP!yWJuYVbICr)nasX& zE6?mho;b4>ip^w2oPppX*BO;`5lDHVZyJ+i9}w?$Y_|)G<`<7fCBk{( z>HqZl^pp3GU%B$!;rhmf@%+OJmbEHse~Ya4w*koF#V>u=Y&Qq=p@H{zD2%eN^gj^$ z8PKcx8(^_Q~y8WYyH=Mwyb=3{ph0# znq;LhDpe}Ms0Avyy=S+TTnf7X1B}<&BB^|&s-fC9iwYeSx|`h7ZenBIGD>1?BuJ7o zs{U6#R#K!V}ds)y3wApY2@rt+71+3 zIH5}sRf%d`#k$IF4a9xd_iWosxhgif>#h3Q{^sjf+Xb+yiLR*}3Sgi8b^f2^^4HF` zpSgN&x8_wfT{(OBQPjLP`K!AHuha|jH~eovHtXcYgXOQY2(q5#!id=tL#l>HoY;xV2+@L;ADU5R2;wJa-_+`&HF`(FCZ=G`m_I3H z)I9(MuzI&aN|J4WG-7SrK0ctN!pMm+f`t@5uQA*Ph6>^IktaWRrd+gCLTtZ24n9et-J%ig@8A(a;{?OZA%MuL)pB_@UxyrZY#mPjD>@;j~mI7b>?bY}G7M z#JJVXY#1enl1yQu%7jW#SlNzeo6)uH*{cE;Ey9GAmE~v<4ZbNDJ1YGRh?Q7CFW_b< znI^{t^PSN#+DtRY8G|Rf?O)Iv0V5V_tQH;s2o3on{`5A6&LVMAbZwVp&uZ;ci|wRN zl5}N_w@nwPj;!3X+Fy3-q7IASo(`ZCt#W$k=}$iLhNW{blMP4h9r4T?H%@OX+;!;L z*`=3C?s$5VADzBb>8}hPTyl72==&Izs;w=S!dW*}sufiCADFn%Jv)-reU@yHe9p7r zr2ZKWQxT|hS3c=^ob>MERzf=I-3jsrx)Bkwnb;UXC%1i(@-s;%-9!!rXTlaRHflu} zONAL7KHHmW%pj;TyJJEK5ujE*nX}O3V~3eEBRk6B3?1b>+6i*ZrR=sh>$e=~cLIq4 z4#7br*e?Zn^vFj$rRIwxC)t_a2lcWO?W-IgoIhf!{dnrEe6$^YWrSZ^sL-*#6~1MM zdhD^QjmK9qA?*+jx7U(sV;zvi0d(qoaeqb`spO&*;tiJNsR&f$1UR;Cl^H5qc1GGy zI31hfq2J3UGa^$W_oi$z4(`5E%`Vh1N%`Ye7m<=Qy1KE{G{qyK$5P{PkJ!GzQpu(I zAT47*l`nB(6j@_YFJPe|pr~gWLq89SGpX^B&97}IivhB|Lq<`K<)m~mt4m^zmdm-< zcQv$xJR-og>7G!y4Z~4a)##}Q>x)u$7Z{`LT$)sK<_DE-XiS7I{S@mRc&6p!x_3$E4amV%!lq@>{#m z8gAPXywME9Hlaez6lb+`R>V$N=Bj{5NagCl6ERLTU>Zc)1gw()*O70BioDH)vxf0I zlelcjcda{CaM!9&bxmc%Z$0&{YyBn3)^A@sxwvweK}hPk^0`9~4?OXicUWm&v1{|C zwWa#h3Cv1CeJU}I-iBgI<*2=qhm?aqRG}%K@B>)nfF6bs(y#zOP@B3}U_6PX{QsGI z?>M>A>P-0FTRGRQoO8~(I;*2vYDuk}rO{|clanS7On?~#3?K}cXuviOfV~D>x4Jcn zu^BL4z}OfJ^g6;Uw%3+T{&_LXqSp7E_ulFtX~5s_`{P^hZ|SbCZcW|uzVCU@dCqg5 zGc8|GXenyrmCQ};w}~`4*{;C;ps7+iEaQ3`kxm+qGzXWvG{kLT!&IgjO||U+Tw1h} zN8u#6dG*gr;;+;z)fF?k18G;996p4 zCRhggq3V2$FxUX=117!*z z)DcT-y|b(5viI7A1kKCq1Ndl^4PK>OVG6kd8kPL4QHk-j4y+Jmj*h_r3MVEHsIUxT zqo)w)cFGHeS^;J;DMaJ`EVaIJvoxxhs9Rxb9>NhwqKClj^6QHA?YkKPau$%2)CRzS z#$Vh47s^Ak+jr75V`(0Jz)**i+H^eXSdVM>f}zm8A?$@ar^1eY5PQfsDXj|<3IzyY z;%Tfg?02;(qth03xnpDH&Q2YlY#cc=ziDH0K%G(@Kf zvr5uXe3h32YMOL@CgoRPdehk&WtT5GEplN|_8uEhqD{ld2=3Y_-ihv9krrSMM6PE! zTL@!!hFF-50fIHGQ-!0<16hhR1L(XTHP_(9NFS;_%DOv-lqpas$Wlq}RnHAV!$C+* zzx3*DJ-co-WA+G|ZhE!bGDh z8h2#BM!5M=?nXYs^?kG+goKYV32~)4$I*bkBLnrYBA}x77ubp{%wk0#T5$@$f2=Aq zh|W}dTQ)Z40M}SPA+Ly$&Y!}{KVg?n*@8s_S_eL)Di|J{ou^eheFBv@Bj-z7+O>tn1LV>qJ1L>;9G2XNv2qSjkkPX> zhHojh!jhvbgvI1gB*H(5?@ldZS#xdzbbH6d{@%lESr0I%7o9%gn4CBb>K}6KKOiIH zFe!ak1I*TSV!h4cg9#- zm%(Ve=6;adx{S4Uw_>CuVX9>k4dz-Wr!ZbSO*iqC-OUb~yPhiOsJZJ^_sBDd<%ZA! z@I{vKV%kzccBCDET?~vV5c5M_W%w>ssIYS=tV?0dsSAvy7LYQLB}q08bb4^pV0Q`=;MxMPlGy-VF0#)_jG2h*B4sel}qv~tyAUkqkx zJ%=4M#yN$I7`LAkp&b;5Z&mnXh=>_8aUX@RJ=7-3DPGQl5}(z^HJ&ta~agnu!>i4F7~C^RCybo;o&v=LhfEbKP5i zboYm(M<03TsrDy7-Wc_^ccjnohOIY~ZpJ+y<)6HXWHTPy(Z1#8?qr}?aFr<+9q47e zjQIaSL`$TXkz^SY6NG3(uBj=F;!#i}$P<19cavdasy!!@Y1q)IKq-{sx6v#jS-=%s z_9XLlYOUdetq!HNN$MU;k@QaeHNW-%N#mWkVf&4B2FVm^`fxzI0eeH{URkqRec#8Qpy7Q+LBW z2;q}*obF@Qavvtb^VBq8Ur{X7uMm(iS)oa~XzS>}SVrbA`yI-axDFy0CUjUqC4yXM zN0iJS@`pL1k&_>U1Pm3hl5}zmgQ$bimhHH(UL^=;jO8TVb_2>XRT%bLEV?^C_@Qt9 z<$Dl=Pc~Ai^?aw3CRTykC^TmZdkzde-hbh#H=NW73mD$2yXV`hfA(!e;3FqIHli35 z{PAH>2zbq0HBs^E-*eZSKXbiK#yAGONYl`N_>(KTk#@jhb5+)qgbwtI?4Zz;1iP@N zB;fe}wWg#lthi0Sw6-ys$U(;_7|UyYNjbV_wsm2|$`p)3Sq&K}*x> zcV|kSZ4Pf@+x4seIc}FuL9xZv zpc*fbWK!NfrKV$Wif~j^d5IzzlHY@D!!Fz*!1@Vuz5xq3L$V7)bYnh@~9ns!G8z~Duwpr4gdF`qXc z%h}Z@qIsLzX!f#}rl@@YKn$Jmh=W6U+gy5kosJ~2(ktUL1U9rB{FZ52BF1k)80o2^*Nr4Owlxq#(%^O44lR4nL17|hX;H<0T_A$T2(;eZ zKp6r{*$*%h^FSGbR9h6{3#9R=1F9>pe;1tvSbv2ELwrAyWg-2C7zm-$$itXM-Xzg5 zmh-jN1gq>om6}d+7<_c4E3K62p}N1d+Q^q|T+ zknY$h@UVw4VT5g{v90x~1$N6qJ^Sw%=I>N=cx3gCwI;Q>c6D;9VzDr3ok5#g)J|<` zx7~K`@Sbjqp+!BUg@2;!JI|4J7o;xBc*rej{dKsWDHy8YPs!kV@fo|T z(i)y1SVPL!;ZR8|3z$4|WHjZw!ufi4c!DVtB1xk`7*6IlmCOE@ro?1;a<6OHGo(2# z%^o}b9?FHO*GWx|^Hp-;gO7evmt;K2Kyb7I8YI8}@Nl^_$b;A1=GA%dU3+@z1@It? z{`wSdIOR@b+F~zbp2be?Jl8K$v^0chDTz}8*0e&D3&Ny3s*D_CBy@>XGJ0DZeIq+o zGFJ{a+$ft-PONGI?&X4~ME6z&ZV!mm&;;q7pumWm7{1P_wOh^M#@_PrcYDH{M9gMK4$bbWR2HXptsY78pU5Yj z&SZYBWo(W;yLf9lWp-fvOD*-9qn-Ips%CrNnlbJ=J27$JB&Opqz9`*MLr{#S{^dYZ zB3Z^*qt^s}&|HSjHpN_yM!(6VwwtVCH%t>mme=bb#5$2{OjKAxbgd9q7@A*28KkeZ zva~TTQlo6r(GNIKgM+D?1Rod?bWvH@4!d?)a4N@ER7M(bHU_4XLssf$Wq~Qi`(dk6 zRB(w-^!)A3?BTIPg~Gv!!|B!?a}u4x->`k_Bm1tu{@}y2 zJKk`Z-h0OlTaL`u4%6=+uFo7BKSR=`s2Yv)U*l}5!vKE0=&kGV7^IEic@&nTxGAhG z<65U%7Wfx0)AG%7hT-AyTv{7Fq7C1YroW3Ibcm9>vm(>MhKqxy4LP`Xw7j~Gr|b@z z8t8HNh)H4W4hR2$U6ZsY1L=%Ak^0gTCO?E_c#MV$@iqPxsLWvwg9#r6hrq?ikuK^X z2YZMl;{r@Fj?`p$Of>^LlBC__RFSF)qTKna7dg^&i{k)zslnBRC4w>+Sl05~5!$1J z1Yn$3glGq;dr~7yrX5=B?rA0bg<`P))wF@;+4b+3Yuap1|H-Y}PC)mJY{_$x%k%se z{>{+HJIGO@hQJ>h?y#vOkgp_`$;z^keW<>X4J0=g0kMmC zv2Ubg4f+wv2Tr!-j8zU2(H6iikqQ1okH6pUR&N_Gx+31z_PIm30>8iIwrKV5_*iR) zn43Ghz53M2&7U!iSw%Du4)i+ujJT93P(#=T(LNs4)n0OC*(ZNgmVQk7pw!e)vUERb zz(>u(sy_G;Nv$WV24ncph=Dken!-u?&~^tE?u~?JT4>+nvt~)cx_3DwMD1?Cgqu?kM8_mM(9U4rdkn$FzdD$%nx5*8ppHUFx7n&Gq`?} z|BuTns;!uab&8=B@R20MscleVHIP)rV*!WQTzx0h5vswY(U@dgyKi9WmVuHd0|{kD z@pxvei4??hk?6i0if_y;Dc@AqLSbONL?m*(n6>kd2;T-ARowuY;|v~8 z7*7gUM$x{D_)%NRzlQnL2f_RvAP1Wkx)AZr<tTQbNuM6PM^ZRbK0O_$zG$L@B;^5f^fd-R&~&^oxQ_##f@i`6Kb?3% zW3a~3tTdbje+C2)dQf=Y3YuKk@06>a7oBmqd+^Xfht_$pUVG&ABUe8<{q)Er9zP(K zJ0l}knqXvP{IeAM4}3OhgI>oG^(u;IcFL}LUEPzpY7D^o~J#D8P;YDGH`YRxD$5Z8oa1`PKmUU`u5 z%7aXU1MCx^3UdE`FCwFvn<*zUfK4G8MGXj)={7}BOj1-%JD0~!B@POqSIg#LT+7o2*|CsIKk&rI_AOGuj z@4NenU%UIsPo6!g5(KryV%>Y{=^M8meqeM_2=9ZUa;oh$ZX?~?FqC!&8gc53>M%5& zpbZC2r$1AB+0Vf(*3_8B=hweWKmWS$)Y|X=v;1@R`(IXFzyh(JANAK&huFNSGti!0 zped)z2js{t-snO3jYgFmV3*SYYAQKdmF~cb0e%4an939=^Ys@=1d3bSj(#!K)FRkx zS^QC!MG{#epo>+hMu89HX3;9PS6-^Ub{dzxe5?HGR=adJUaeyhm})U7Yd~y>QqQey zQIRx}*bVJG3piXJ7^EFI9-+?q-agP$F2^Bm<%CqJQ-SD+j9ftoSY52E`Gs|Q%&sc zgk#!KU&|M@G`6Ojn;I=kK~AG~-|Y zgwbXkUj6p^{?%%J$?k>DDD`6hbi-c!8`T!l(*}78%%QYm4_Rpr<)oEn zfQ2AG2G*4e9s^(E5S&Gt5oJQ(bnsIQ%j(q{M3+Q~c`0u;q59=#%T9zz5t~3Ghpp&V zkW%n`s8~>e1MP!(;7cfLFydt2>OxXMGIf$3LI_}~;+m60EH2{kC4V$kqiq9y_5|}3 zgD|(<1bie%E`tIwWy4mxq-dp{Fk|QwVSd`mjjj zK!c@n&{CDyQqdBVQ(s%E78KkzR`NG2)HqbaS{)T>QCQV{N?xm>-Qh-c#GEfB?2%x* zI(-0(m5-II-aWyQX`7=R44VflHrh;-T?U+mr7-P?a8}jAu7cxxP3p&!_<5(r>1%-Eu7H ztn!E;HHk4|;(4JqwC@O6>xAP%v3%_G?bLURdLF^6tQNt*2^Z5}sgRI7<=I(+DlpK? zs)65ZFn*dE}_{58wus{~fO^s4RG?Wj4YKzo~Ni&7J@xv29tc!DM!8tlQ$A zgbhPd%T`C!%d157^XFT^5&xY28O1Y_x#QKwUn)hre#&rcaE)D6s_Y34xCl+ zuo+N&H;c2Ia%GXDdk?K}?iI;}j%XL7c}Z%=MN-6;TyD4)vmZ+WP8VlD(hq-Qzz=0k zC-OKkDPpIBHUt%FtH54TZ+muv=c6ayeSWA_9|>h=Eq0sn=|as{uKUglo?91JKf>?d z-R0d8A>z{-T;l2%cz3pJ7EMA6&Ov}r-~>SkU?N(B`(t^kjHEGKq^ahZ^^RSn0d;M; z?p5cZ{#Q3#l*GI}_EJ?U>n_q5=CFa=L3t89FoveVQ`E3Y;T%vW?G+nR%5iboCI2vG z@3HPl8QY+YF(!Lt_-hEMNgND8?zjq4u%uDL5E!N)ddsY1$AywA@vY4wOECo-l3Fxw3`%#F@Qm*pg_t7#I+kHY^^OeHITg`j9(CP{?&K4!>Mq}n{bBH z`A{S`-`#SwGAg>xuf9DP3Iz|vI)#q~YpGo=XG~X)#yg#OW#{ff_O+GY3)}eT?gwPVRJ?5M>XIM(InvWeLbew1~f>Q|`Z zLMB9wg~K(4hDdsaF32=Y(AQaUK<#4>idgugp-t0JUI?Q5! zn(OQ7#5tPOBS%ISkS5^^+I_7CoW6XuXJSphXiHhr2XLQBIoK3EzGN;n1nU*Mql2Of zyQ3El#6ZabJEEUO;(+j85VTfrGz|-KU@XC|6fHn}R5FpOPLz1C6!FRXOV=9gJ^Aob z{N`mwlnWGYewd8&x$(#Dxb02n%j4UQ8IR7S5~-Bg!k1x+%X_~(a^TL_o>~1OAHLzv zgXO8A@x!fDrmFo1w&%##*aa`1eVF?r<=K7BUT5vuYj}3xF`=ep$9FDlGEmZC0nBe; z7ATShhG79rasWwWU;&JACPu&vED)9VA=o2i53onT7NC7dRDWr>jOVvg5*39I(Xv)> z)TkAL;jwf%`v@Lzk)eRzO64KNP^^5%xY-%ZqeFr33WL!F!C-CX<7h(__+*Ra+F%k~ z(|*?2Xl}|A+P*k?KIIOmylPV_;7{7MSDQ04IUKLo&)!WY{mO_54#3Gkwc4rZgLIr9M-rCKosZyccXh?A^g{?tF1+sSB-ZRtjF3ZOo zs_TmHj5Fx9=WIwGti)lg#BO9A7gR$dlUrF+8`|0SLM358te)1w>L{HWh9xh0fmo)y z*UP>^flk8gqG4$WjL8dJ+1wguBv+N#*SZK3RiJ?N6OUWOD>lVsMVFOJt3=suA=H&~ zlg;OTBZTFIvqf)ZWg-*kXw@}OrCJPT+phEHd5hX+@_1s-#!%?&MClZ7FgV=BXuxXr zq%#SB@qV{mbh|~nn|H@M{71&e99E;dGnINMskT-!{JSpwNL4mvFlyGO-ji$DAI@(z z72h2b?bd{c97WR`8ybp<>9pufr&qsGsqV1BSNm{Lzk&G-ACSzxoqPshFvVe*$Ws7E zmYp%dMsNyn1IRNa8|)4ISi+cK?0l*?fb~PdS{|@JB+-c=Pi>xPhW{*izf^s=vwD<27P!P~#1=c}F?`+?!3Qml6!$RK zx6tQB_LIb!Mr%|6U*PBT6kepOJ?{$X?N-?SVOSj?`#N3$ueZn#Va7vb@DO1dl^_II zpDd*~tk4jpvX$tyh3Fs)bQi0U@5m<)8f1wp!K+gql3%#v^hnBo-_V(N zoZqg`hXbWba%<;ydQ$%2n--lzlc)Ese&{=Ue1>GJ4guV0uY7%i=TN!)1K~}0Mjd+L zhS2xbFVdL{6_Yq~l;%|+DUAnhVv-lW0Qd6K^CDxxG64-jfAr)|rER7yo zL-CwFdqdLV2O(&_vU%`?4PseYU8zWzklRyfvi6Vy+&HZvX1e)lC7A>Sgce;Dx)B5u^Pb_mMnQ*9PE$X(^zm=_=eRwi*zhcifn#S{u z#ai=_c-`>V#B!cl6!v6sT?6(ULe1&-xV{|JEBIk zL74_GM(ALd9$B{#qnjvg<;(mJ#{kT*@}yFEoH?&Oz7lvs^z;Hcr6C z7`-%Fm1fz7?Ugp&3;Wrgbh5>7ALCD1Bp8;9|Z zqrv1GCrHU}6b*+xG#aQ9%{ZOcD%OE?v=_yG)_{I|NGgGzNZS)GY7}=gM02DjL>`gp zxxEE*b!d`R_*K-_u-V&hG%+iauC2z^5#C@UYc{S#Wf1Y@sv4Wqso0$srsE6*oSOr` z)67K-VNrwvTNF74%+>T_F|uI+{tD~#jwqCpW@{Tm!2~w_URoUA6U}$h;;6Wh%Rf-f zFdsjOj*_o(eJArLPKd6M7ztd8G!MKoNj-dUoy#*-ryh~{3^{-FkPNLzWf*&|L5kZ` zSR#<8=_+W*^$#%O>6PqHQ0SJt_+>ERyz)%}MSO}GsePmjFtMK|9uzwWIkc7a8ss`i z$|#9TS-`3UuskzxGt1g=V~T_@NFGMzv9W<=Nyl=`k{cyD8)zGnU6h>-ITE)^h1@yJ zW55aB$~?ReITpH=;e1Hmj8x6wi&!0y-a@Hc&KU*v4E?tq9ej5RZGGw4eHJ|>%B&3X$s3Q|q2tkopqFOXXGnDeLteZzQhd272iiIv-` z#>(xi_L?h1Eu_@}wGc$Z-fV-Ga!Fh6BIrUnfG|R5bAK&8jJTbxl^ zcaJFfkiAM<7x1%26UxHGkq5_#NDQS>{QEe38U^2NHZ)0UbCB1OB4OZ(m`}AK`NxX0 zb!NCSEp|q^mb$cl!USGSppcJ6{JN z!LMoU2Fma~`68!#JR*#LwV-GRUtTr=EHsOeBx2ItwEZ%8eiK44){a+)XwkS~p( zA}xPc1%xKYKIsN(%oionrBQ=Ix->SseHSg<1Y3)i;~7Eg3UDQoQN=PYIqY#(^F!09 z-bPhIj@?%mtZ2DSvKubIl!U-#!=$3^yRf*!BTTJejI`H*Q1+W_(kB)dR~P{fPKM)T zbqJu8gSx)JhzmF1JJ(ub)ga8WMDxvV5q>cYlgQ}^2tglk!+_urXxrBzubrv{cU4n z<07wi zy|=mCV3CHT8iICQ!@g{?a2CRkFjAt**r>F2V53s&Dab(d3S=NiRT4gg47L}iHAVnO z?_lohD7_5I2@+Vps`>9E+_@O8@!j&X@Xki00R5P?WBlzX8YNt&pBhTvlw zubu|YfD)n;Q3V7MjsQ8%ieF9vIlbVI<*TD?PGLio6(Z}MvWaR1U`w>TU zBW~i(4%YGT-qV%L_<5h*<`ts;h~sVHM0oSXIJiVB#li|L-+RCMhvn?*B)^dNbky@> zi<6GOy9yXdYyeRHWNiMWWjLTv1C#t%accwgW$IF*QUhR9 zmhFyIaMX&rI*z2Y6^rvs%g`O4VS>lf9<&8YCR%Gh9ZpW_E+X79+I-POt=4tceO*0M^lG);WT=6Ob93dBTlf(y|2O3OT8WA7VZM19eAK_< z`cW1WMZJiLI&w@zQ=!&kqPbd>{4fqLBcTqjNEIx}JR|(iU~Pd4(b@qOqDwP^_e`t+ zOIbspA&K~bh7rXC{4!u*+`Np0S{cUrWjb{4LFm1o1lox2GitiPro$yLb^5+3XurFjP<}0YgwUVE@Z$*JcO1DJoK+^udB* zUN3U8;E8vqx1L{5#WrB<6c}|!tA~KI6VyIL3#BAz{I_mh{QJoWUtay%hTLp348Il| z4X}7QINFG3*13%`oeDlp*80={^_<@|q_gCcYJ*GO_rZ9OU&O{;eR&i7xxYH{L^Iut znv@+ralE=m#z$lvlrZ2a?%x%g`J2?}xNfr{*bL|hso%k$c^dsRsRvG`p<}{&=U_zH zaV_a{go+~NB|-@`ylysPZ7|bdDKSd!PA0U0ORUVXqE=Xfh~T|gM_n7BG5%vL8-sm| zurFp-A=D5njUhG=FF+R$hFZa4kt#}qj9n;J*x)M|yGF+Do8%N?NF@1>G@U)$cqY|m&!ln>)`0mVjXxW5KY3nbGKq274;iC=uX^B!909+BxsuiYQ2db7 zYZQ8`ALMsT&G=uOHvyhC>Pwe@i24$(O%3c|hFvYiz|2Dt1g=IL zq+deBLas(2R|Bo1?1~h^0;n4_6_g4gfV9Zf0Qm%n#iBS;Hwppv?7LD$avvZ?f)Y#L z#VNg#V>Q~T(22&@#xHt{=v;%@(#rKK2V=k7C-6qvu7=Guwkyv6KI~Wi$5)rzt~%#r z6AtGYY^T22$bh&3~67N=l^iVSY;patW?T zDz$1nGpc+zV~t+6Dn;;J0Qfd*Q|fsU7)Uk?wgR|(TJY^17yDW^t6FP7qJUk2lSxPk z)eNa_kwZ?_HwQ@jf`)|9HXtcNEADZSHZ+I`bfm`0b^_L4#+Jl{PL9h!w{J40Jzyr> z3Ai$JggJ?*74qLI`Bpz%3ApYUkDRf%orVUqg45pP{w;yY)1AX3Pc^%9cK6BHc!jT8 zwmlKx%`RW5>}Z+1!}(`E)=jN`DUEwK1#I(Cb_TLsmHTb3pJ4ZH0$2pYHc_mqV8y|N zW7uo6KU{q|J|?yZ#F6s|!Y<3qUNP=9T;ET7g-~wH)CjN+wg80b zmbDST6E0&TY9Ak<_7q{_(v#U?k`=DRYA0zl$&DQYdrCn7_)CJ;&uoCM0ZQ4m;Cqp) zfT8s4Jjgj4t9rU=H=uH?)H>Oj_#o~3J8>W;g30sPCyzG?s+CcEIt=GpPX0Gm7h~fE zexFz-Ux??*3I7gX80XH)=!O);bJ-e9;tb#6a>o|vo0z_i2~tL^16i&_D9?mSrBaC? zGA`ZXR0N{a5W+J7eKiH5SXev`@tVTdejKdnt36M%HL-6bn0#9@w)*6z2WpM2o-0L! zhc7*t9hRSneA(pMT7|iDT;D;y%-SS!k+Lv=Xn17fJ;#b%5Z+!gnhbW@ySN;&YeC%iGmM1*==DocCnBK+ zDu!fRWape=W4x9YZRqB^&Y!>Qy7wKcPBhAX55HWglme^Y`@$Fa}UC2akNp7 zb_dUwXKNPb9{d0A`F`nh2^*g4R}WqJT*5mqxi>#o2@iJ;XN;6*UqbIYoiVMx*#t2| z3SlSus*-~)W2~HwmCR|a5LJT1kLZbk{}`gDmzf>{XkhaC5e;noEXkb>n-P3^u z#_7NU<6nB=bGLo}!}Nxv*Xe2A~3HU_0 z0LxD$Oe0N)r3OQY8LB`OfkzMWwA3bEzO3YYdp*rgv*o@GmsKf5!>gK#fD3&?5fA8HVXBoM zyneH(!vCL51^W6`ruwBOO5H*y;^wz2Cfas>%|yb9OYUo#h{bk4P_VuV_0>^b60u#B zVmm;6>#%Ll@V5n0c1htQn~B>bi8oagRSprP;V`nq}1r4y_Rk$ zdk%yEAXrql)Uj?8GL(R0#;*7b4uX@wD#_?4dpKjb)-85zIGR+hbp(94*5OM17=r-% zDqP4_MS?XDlHnT~1*I4y!TggON&xwml?_csv#qQV`;7evEOd;zzP zlcQncfKWpoPn0p}aDx0rNkEPD98n<_wI|9`rCJzAz{VlyrOw@rRDHA~>~eL)B? zShhd5x@E9WMlQz~f0FXW*K%u41n4nqW=DV&`M)wp^w2|IBS%E>>`+OjV-9k}OD_q{ zjX?V~b3{5XKf`%Rb7k&5GM{iMmNdhQl+bMf`4T!Q=qPmJ74GT?u^}*<$G*}FHi%S8 zeQdISCBZv#EeN|1CHCA6DS-`xZd*xh$96EI=LbD6OPto}BhO)=7DK3)P!54P6*w^H zfkHCnhF&upBqs$}0~Ff9uP7|y%y>6&9)Lr%GXrMGPhCExlz8O6?sb_pn#1|hI2n%b zR>S+1a^bz(Pac_EBa3|Q!GD&w2D@(twWSL8q&%%iGNB%rfHiPrus5>G9g|{2O6870 z%NMy$upx=gX2*jQjfY%EUd{sajM@ZqJUmD?V<_HQ@9zO&tpfk*_Fpa^;#Z61j0y`lhTY)h2 z7_B`~dzd;+L_{LwCBBdHxPICZA*QxrlxZF7mbC?OZha4phCV9ZUh7uPR=CU$s{F*p0xB7t>Q)}07(BY<@kg~C`N zur7n81uB4&gK|9(eGb>dfUF4B9w~#O0SyS^M51sei%r_>xFI5RE#Qg_kt6gu`rwGL zmDdudB@JX6`C#7^fkGKU)csJFKqRncB{%&6fE8*u9~52(gik8k()<9TeM0kHCQD`A zPGz=$Ea$jR{@gjDyT_18oX0c+HIYAe_#B>XAcJZSO#w#6{+EfMiI{J(+?pfmVmfTp z*&W0L<*px4C&XCW=;s-TlE?JpWpN}IuoOW- zrlv`$gZCl*2i%FNlmcpM$v`nGr(nMJYBGfidJ5y2qS(I z*ELAra6;6FgR%gzyr+TtgF_(|T1ei|S;zFU;aF6l9zryZpegjV)BYQQO!Nh-%O6TI zxkFkL}26G?3eGf@DSc9!M*j;Hv@gn_#S` zgUQp!n)yg8>C%s#ce`%ocg`YPx8%#cOX<+gJwC{BqQUiw>a&D3t(o&L(yc8!c>8(K~ z>W&|UNpk{iF;Sx4HXQvz3G@@?n3L53d{A!XkXj@7g`n6Eckr7uvSTTlN;9-SC-w?3 z_y99iUDNB!GxlV^;02l{Z~bfgW=+GGw3q_eS?o)j#t^YaeS-Iv2PKZ@KChuMOH|ZhW2cob>sHR4T%ix zWrhY>lbUs@l8LRo(IrEn)2lg zpoIs&f0jWDUXLD)p6tDB@MlswqsQCa64=C98CvjU6llR$hwFjxHxo`sacf-(c5Bc;^HW`KLpY?5WQM&@y@LLfxo5=6&ZBW`@%Zt|u0 zp##Z1!q&pZeEXKW>g`u(p@b!`FBF={=c+kJZnSvXbLlTOW#6m+%5aN!4V4bB{x5Pj zh>J!LEB=th110WtEFQ=s5TJ+|UIxwv`jBg30R#;KD^eCVhF^hh0r?e_6)2wqvRuL< zP=rvy*DOT{W(K80B*PBxLZubSi+v7oF$KFI=>}E`;~A+_b~F4&Dfk-sl?4i$vMM6O zAfd9-BOh7|8z`|FjW z^(%AXLNZngGt2%%Y2+%S{#`8^j)vm%RbM7L<*_+jChRW~koaTfV{_d5xqgg1EG{n( zEGpBuu*sIKa(NmTztz5+Vu~k&h8qN-B%g^Obn`71gEgr~iS^bX6ql?-oF^(eG3#TF zzR%CRBa&58*7Tq-N(9yvVsffm3F0!RHi>=&a_hF+AhC^b0G8PpokNc5J!B-q_*k>x zD;I(eTiv07rupo7txYF78~o?7o-@wZ`aY+OMgi3UEU$=;y$5@ff4nuh;ez=XK)MbCL+`C^ROC|Fvmf`7Q~Qu zeuWjV0O4bQK;K8w8|VUvBW9%Xt$cdWsmkB-cD38nnvBM7?Kms77=Ldn;os-3?{lPP z3iRLo6#ir9gdgHFrMVA6pG2#-hA9j@EhH{KBYYP)f*aj^lr6fjWMEIif%7zOLA$c- zko~KJY)Z5z7s^AD7PKb>wHrs2WN3@gsa^e&zojypubVu4{h3nW=vMa~!p&NzIkDsD zy|b#LDfCyY-Ye?}F@ne=0(8EqBiD2k|Uh^)3Dvf2h_k3gzJEnlkG9x%nSNB%%+ z;(?%t*GbulUZh~%Lo$Fc6}AB*W|8v&yoKL$;?t^>&j$g9HR@!$iEjJMYuKlJO!?Tg z%u!CVdQ^yBUQ$)?x#0`AcXFgwpnP&FKbfk_akj~Mlc22W+gGX@ZKpWgr@(JYh$cg!eQyKI)*+jG~0hTiFxuw!7?h*Qb@|&O7)_Fpw=~ z&ImW-;g8@wqsewJvw>Qx2_`eajJtgEEL*=A)-MJ-gi!Oi_WEIV1gPjdR97}HAvM=4 zU5L2BLEIZeN`nQ(@z#>hbCI5v9U{(8^)eoykB5|T!*ILsqttb>#u3Xk*6SFRH z&UUMCi?Xiq1)(#h(Qp5?!Z>>4p~0nv{>?Wo|2dw?MaoftVX?A(C!?P_iGGTEl2u>b zOl|}&i{cXON#F&FnvrBDNSdP#5n3}RJ|tpjwEoHGb^vu`7>DLZfVCP$u&lEru`yhR$WuuOZ;XmugJPB+#DB2JczydQT$z2Q> ztw1qQ*~G3vQfF5V3_H%U2)nGkBn3&)MFoR$k{^mhkmsR-FwRlf(dRiW9->xPE1%Wn zp-c+uTu}67Q}B|B0fxSM3w?SqAl?}9e!v^SQ;g6vN%RlFW=tJQUkvCbMiZgb~SjdV_mh6Cwz zARNWgLHWjh`E|k_m~R2LVeNe#>(8^sAuj|@atNl1p6JZg$5gTqn+eWHEv0$_4t{ljOOFf%uc zUM!{pKre z9pB;oF9-J>SpCuJzr}93ootLcF5;-JV8i+Fa7X3yA!n*)91}D1*=7uL;(<0n5sMh| z6hJ}-i>`EtLm_}9y&cH#;h9;$jMP#g;huf7G4V5Vjn1!_)rFXh$Kg3X@Mqk|7Oua7se&(7hq|D)<0kkU5y6e+GrEqwMG zdc<&gkOywY(@Cyu4N~t=!;?ha8(2_uZy@j`VOx3{^bSZ~fIx8E<`~^S6;aZ$<5UBV zAthOLnjI);h7bqo7s2S@P=Ep~H%(@+)(Vh5z>R(vKssi)Ujd}AnPY&Y^E)VdQ9YI6 zO%X@D6l75PYHna9A)~B7VO!|W~9VXBac@VNWURcF!=SJ}gPy}g>q8n@+uQ0EJur=zp!)`#o9qk6REfrxu zU_+ALjGgZcFz_r4b_p&$snEd=X;MmsnKlaKSna@kC4w3xBQE|WyW5MFd|ZUYPFdeJ z19PFZ^omyM!S%Pv%sdPBR=-C^+c7-bG{+;sSUg&tKfHaYnxH_p#Z9=r61 zYY&RJ^>U1-xD|{duCF1Ao(T#(8suCvz0T%_fwb2a@#wB*7R6vPTN&=f9D(2M< zafri3jA@-vlcOe9Wm5jKrt3erFJqN5lnxBTZdbk$YrkFXGFr4Qvn+D}nJ?%Z#EQ4l zj^y{>ag2lxOp*E4>f3L6)HE7xR{i{EFgpe!2lbGO$sBazbd-hFvqJ6i->V+N8J^&N ziz8}&t0{%C@8IUpGlNc8x&YZwU<&S$;lf~UIkLtHMn!qUP$alEn)-pHY{`(LwkV^# zH52H0SXQBkM+ydjx@2hUXjTz@|=lUj^I6%NINO@2ujmjGtv_`Z+QB@$D1?`qB?=J$)Y)wCTewoE)pGV z+r;O}wg+QwytE;i2|KUUim66x$9Mg)83-+hQ@1$nafi(zs%}YyirJ&>KT@atd=en6 z&7HFNAQ&gC7KGoq{HLlj(B~Vb?&|GLey;-Pic7kH`)2xM?0NSc|ZPK_~_+VR8K%8%l08S5R;RA~6br1P*YLm4Iz0M^)1G<30gtUJO)- z$mrF;Bd-3uF|5x*=*uY-RHgcu#TiToVyTmUpU*E`%x%@FoK8(P4f2-;eQ`N|CX;5* zbJ-<~UVavHrFA%vN0jqLoMDLlLP(ckC}=~n$_O(Eo|Jd%*el73&|BiwaOpaT<4PJh zcZ_NykVVkphZ<_zS0M+&X-XhrYj|84=FiCkJu+LX%~l&uv&HGOn1#{i)<$EiJLGbO zWUa2%KNF5!{v_gnB==T%qEp`mQxoLq!KVXg5W~R%>Y<`KEZW`xgRiH=6bV3|nDPiC zoAN~Z#F7!P%QGs`;|s>9cmuFYfuT_}KsbO;Ya=8UlKK`a<2<2gqc!3uD#%zefd&=1 zT(6t?0QCLp@Qs$9MpiIpZ)Uz1jb++FS5XgjEpJ40JHX?&dCKu-D`vA~Rr{=|P(kn2 ziy=eQ6^JCG$#QGkh#tcS)ZEbJp9seo#%#m>N^-xUaN@jpV(<^BNeunC#N$Q~X`wPa z9vpRA1d()S;|fB`x~!4cO2e|M4WxcT4Uj}octk=+8a(`x!R++V0q4;@OV1w1tX+%4 z%dDeA!E4EAv%6&vAO)$M5}wT{og$Y%f}hWM-d6rH#VqfC)%jFP>W58z>XokatRaVV+t)O z8yEO@o;vxf?>u$gyUuq@#i7oz&WktPb?LhF3>9YL^;AEZ|PYie6 zWlO^sC^m}3TL){q?tIsEC*FO0+8!0BYmLbuXc zX~b8gJnVvwQ?dj)6;T9S>P%9bPg@3rCgq$z2(!$1%ZllRxF1!RgmL~TM9jgcywMnfN9+-OM)>E(l#$Aa*`Y%4bSRU%uUU$fsm`Ep7 zLla@f_YSZ3m*$U)D$Y5(CX1XjO6=uu|SZ~;g5oA;wLsWhn z8TN>)K2nW7HXX`39OYc~;q6DA`I5`+tQvJzyTu=gMr|g8%~$sM%e!udWf#oR(n5Lf zqrqG*aQptn8!LtC8{ZHp`s`lqzRA&DUX`j6jCQ-x?wsOJP723h*X@YCs26&=iJ>YN z(frY?5>zn@3 zRGMc7UUE27tdE^@ELU42W3w=p!0d;=4cRxwBbav2bEAv70LDF~pP$oCGiMJT&2l1d0`6=WCt(jIji zE(3H8Dtn35KDHf4k&m?Ss4Is1Jihnoa8Ap%4%qgj7&KSr+($GMO=Xb*tZG&C{E+GM@d)h4ryN)Z~U|nl{UpS~Faq^h_J3NAnT<_Yt*C&w72C zlhFsOi;wfSjQ|9taejLFd;H%Br?BpA?hiS@zwG|TI;~%rCY(6%a*Ozq zKwBQ&n}7_V3#{kB#}!Q1Ok1>OAXFafI`#|(V1n1#smQq>#Rdri;>-^S*(C8l0?1?L);;X zL_UtaSrI-#mcOf!4wN%Kttz-qedI<4!ZRn}-F;V(}dc*~m)wRYzmzXtneD(%ro ztivbXx45ShvyF~lXRHW@SmXFu^nqj7-;)_`DE{hCh3jFz1@12hQS6CLDGgJ>IhAo8 zK;+chl*VvgCL45$5Pb|9$U!|NRYg>M$$F$qrc{N&xFOOW7&k6hZw9w8R3ISUKyuy0 zAKQta7NB4xMNw_XNGy(yiWgkgz{CtqrCRr7PMFZ8Wp@MJvAQI|6cm_kz8e4w$oGjXSLgyY z8iWvjfh@jv=Y8X8<3}I0SN+hJbyUnIkIffr1)NrQl&*=xMOS^a7JGblBpBb-IoT{0 zzI;0tKu8(KwjP~~KGZW5!|xf{8Ouey&f_CH_o_4nc4M^WO_B0K`N#uvv$q^NQH!2f z_<2iNlLNvbtjSiW9nof;KpY77HG--oo7UXR(N#k33)5S$Qq+dvW`jiiFuad8^ekhX zGc}H>6)A|df*=mjbk^4jEgA|BZK*C=;N@hngvva1IhiNLjUod03%=CI*aW*%NPzT$ z9#i=$OdnDt<_&doWe5r$1IuOvUsL3$mN+##3~);nTcSI0YQwT*8w1xv@;GcoybK79 zKr&K}AKAXQk{B_5g#kn77Z@)jA4zwrW`5MuDUbNghCs0xNDqbc z31fP;VT)VOJa%qp^nFibMgDiJv@le#C7UDn9ro47iZP3!oGPX?Rg|jWH@g8#p%8V4 zO;1ehx}6GElpp+1D6+NK#=WShEX1NC>+C<=;KZERisiux5oukZK}CA@1bybCbA8m3(;R7Y5R3DQyy5ftD%nv#f8vKWjq zg-5VfiQ`S7dcTS}U+_dCVAADaHdkViEa;dt@@oJ(I|;~B!gtWm)FdpGtZ3V^jXksm zYYs>GUJkH$CSdXFAxBYP%vw75ON~aYSGn(Pow0-hK9AMv4tl#Tw+W2E(n#gT+aH|^ zwQZJ&$6DDB)AI*+KW>jTx1F=7R7Sl+x9mHK zvn9-+p?jVBtKX&YRZ85iD~y#wlfwU3A+4}UFGyFh(SH$Dg$U$04-|JXjucbY{jafB z$k@v!(dVZLFkoIvdGsp%*Lf>xP>HX}U5Rdalfqs3+FP!suQcOp^p$U1`Vs1T9H37B zB$HP*CvvxG^wkJ18h@<#(%J;(Fh$KF@=~ak2N03_4m`(f%Wt)>i!B z3y^)5QKeN(UHXG&^LbvRUmR_Gn#09p!jJZa9{vqO2+_Vd{KYh+9^~&{mIJkU`PE<3@1RUZ z|LVL9=6>DIZNsa*^bVMi^!?Z62_}c+S6`xcAU;O_?jact{=EF^^Y-WXI=y>J{>@X> z7x_AS(rtLs-skPoi+G3@RlFf9v;QvNReyh6tVfnjr`25@HQ@z*DrPRge`MvlTuoOH(o=;Z}JM&qNFV8AOWb zc_78?Uhj|p<3&pK&~dWmU+{HW?0sjr_p+n+EzpuhX>t}ni#U3JKivCkQJUKh&t*n_ z(%-T2xAa$N6Wul3+v||N_D#I{y4d^baIfx=b|XrL2(I)OU%}TeIiv$e@OQyO2n)XO zW&Fe|O2>}l>nTU?zYq65FG{CBH#`jMJ9;OFpXXjgZQjv)X}EVrT)N@r7yg)nvpaJ5 z(XGS1XT_!4mM=VyA3e`~il@w}Pom zxc8XYf8sZOhkonBju*Jsb5HS$^x|ppkD!zBR`gSTfZxG0HQ)C-dhdp}{sJ5buE&@E znLfY^6gcY5U;k@*v5Lm8C2#QaU!u=}0|-@&NmH)W9yWg9H-7(9&%THs_ueH=`9R0& zg50|c>HB*@6#Fm=NxuV;nI5;yU4Z!e=eRE;bod(gx7@e5f8po(Mf$s6aZEY6W885N zxgO*m!sk5CeH7wRFCp;z3U`s`an784Q2D4h=i-zJ+I=T6ul6=*)jolG{97^8;O}{w zAN?G!cHmQ_Kt~$~aJC(U?IUPlxdQ{ZUIU`hIXw8&+|PJ3k4{Ct%@6bAz>{a_p|~oK z>~pzX-+Sn8yq01&;E5xNX-an_@qp-f5#?a0`|2b6L7s9&E}UL z#Lf6US&z%x@hX3m_IO#g!|E)MJeE1w@+*GhE9LiC%%Q8vuP}EFq<8iwbY;@_qu^^N z22CI?H>x(cBq7=-H-;!L;IHV0z4|StZu%pN+RMSph*SD|b*4 zE&_oVYH?&2w%etl5D7_xm;G-t;T^ng;RDj=6Bf0i+4L|5V12@Baq0K~zWY7B$!Peg zR!~2!(P_2cz#iaN4@V3cpEu@ls$F(nOhs6^sEz1CY79qq7)7JQf`118qqdrdEGn~3 zW%TiEmplJnaob_$B?BibhJhr-qw+c zf+g>F7Wj-xt=h#4Jisi0uNwq|T79=CkhYssevi*<;5$}lxKRENC+dakDK z>kMZ7U+VQvr}GbawVGGGuH)HPs@T0=d$Oeq`z;-9qHJ}!tl6|NW2)<-0gJ<735NXc zSkP}4Z4PJ1ulKs$v8cM^ZH3-fBVYMou9 zQfmaw{esE?ac->X)F7P%Bgr}AiAMbnA|3G;rO zn&P>51QaT8%C)#EH|%UQ_W&br^LJ&t-R%9r2S4y z>q0RhI0sZ1Qvd)Y{X~{01)5QOg~%df1GYrTO1Q6)h5|uuu&=67c#Q`F&aac7pi6q` zS(Z6=-60-Y>o}I)h>Ap_neq%9OiHJg|H+$93CEwlZI3r&(iYtwUy?^vFky9NN`d`1 zzNK5t4Aq+Hp|9?Hgn#7V!ddG>IxR+%cx_Y4L;*!eMv#lHur9ldy{E;cE=#H) zFeGIj>fz>4jt4VC?#QMN4wq~n>P@ER>>4gFNkqntPA@3{o(r-MVCPFNZXas04YnLRz!nJ%5#vPGc1EnueTKM701^SB&m zaa&QV1i?S(213bX3g1D6Xsju@@tq&IHiq*UR}e2sRXip}ogmhdwg9i#!rI}`9&nMQ z4yCFQI|6#Jm^0@ly2KVp-g$vpkYIB^-tyC~kWBPT;6eeRYoJ+(LIcQqxrtQ0|DiEWIC2xh-|0PiZKseQ@;PT`&Cy0O zRS6cuiO#)8x1O#z7DGvk+H4z}Z+LEg%8_2+J9?MiVtBVd5exp<=4?1!5BO8jP(k#0 zLzV3IgOO%4^8YaQ)6=u`%yiGb&m@`5Op?hS zk_jYaBMC{sAX^{^vgiZEP*q)k3O*840)pau@vSM!29Eg znO+HV&;9+*@}2K|=S0k$s3k&Yf{ChIcYei|E`*gkm$^LTe+=JKLMr$$*SC@-r(i-% zEdgyM{UBhkJOFnH2LbV5TS_9;e%k?yb=q-Q3?&P7CW(n^uyr{yEh&bAJ55d*0D+8QoDnaSMCUeVs4_RvSnyiHQ$zm?L1`@Hc_Abzw#r@}syLjv z7(6w29c*6()}Iz(C-mS_HKz?nCXXc#)>#_(AQzQxD>PGrgEu}f0FbStiZ&S*g|c!n;&uE?CiX$xIf)h zjnzfZgV&vY=q=}0*S5}^!JG^;HPPZrH>Gq#|Yo^5iO-N3P`QdX1?z-g~KD+lq zsiZdglby`)CjM`1xrBcxyE1@qc#iJcYk2M~w^v~sfD$-RDJv-Pb5*f~f1!)=NiawTKu}4(l;$UVCNILzcm3RX`VrL!}cfyYJobJNNnYf=* zBXN=gsp*K#Q$9UEeXQ)o)VJF)nNBvJ@#@17eO_Zs`9DoMvpE^! z|5l7fM0yU6$65aZxO-c9w_8(N$%vS{tH9j{|&!1Oxn74DDc~q{mT|LFgdDtka^q;smbp0dNLhy7c%VUM8g= zGs0i0vBX-X5%@+zp35w3b=fCMV=t)=h;h5-;S=@!)tJd1-_EzyW{n;RzfS$MKUOsV zn_M>e?+L_8&mPa1rF0^AX!%q)-$+|*nS2<}?7aNXs>g+OZj}#k{awT+<1jHmC$;C0 ztJQvR7d=&wT%V^(eYJT)KG#a!&LvXxrU6AvCrUW55yV!&Zp4(sY!G?@8*+z`oa$l- zdap7X`s$e%y2@zigst0tzL$&rtXqD5J)bK(bL$26XOaC`qCfli{+0cM-2$LyH0#^k z7m5?Pe4$isvlWD-MfFSHVY*bQ4lF)JV1#6+#vB$u?Ia+fyNk^!?O_NX2Z9dQo1ejf zTV&(a8Uq@ySkK_-?cBqh4qHTsnr%kdbkQ=4;s|N<3Cje-YFhP`N%AfXZDsUuR2?dN+mB}q9np1m< zYkQ{>F21bcLcK!Aj}P2V2DTj%V4 zN&?s*HYP5pRYoVx0dzx04AwNz z5IgxQR{Jud(`X^lsN`0%Nklrub8ln|{A-@l>CVx|A3M>^n9Fgwt_kEsx%Q5=)`4=w z@U~Jl*=l8zt#7!dw%6|Y^gZ_HOtE-QvZuVsk~DjrT$#?x(<>}gSj=@YiE8VbHK#c4y`5q=whe~$(dG*ue& z?^WQh2cUT?DC{3Ok->{Ps8p0Q`ZClJkVvofrYD6q2p^OvskMX4#Y5iuToFwRobLNVj?6i_TDSy2QJz-*ag_nH}}) z{MNL_n^_y@*M4nydr+EuL6p*%i^P4;UcSs?REbpbNLRY6su3aHj{AyPN4-Ky%2xXh z%6U2t4B{~LD?B}T>7X#r^Swps{)t+hUATB*V=I@cSCzuTdg1S$8y2Bl}AsW zXiXh-&u%II$McESAcO8{^;b6?0$~+$*Ii>cy%N zmq<#^09~=r7%F=xX8U6tl594wG(NH`OSj>15Hocs$wzr5i!Sh9MHSoh*>V9eV?dP7 z!@qX@gWknGt#T|7^Xtk;YmQl2-BJWvq61?Uv2 z!F9T0P`OSsQEMt#t<`>-&1j^N9`oHf+MKb`MZ`|*o{T^$E2D!n<3EpY<8VE; zw+}ix&PdLcwvzB#Gd+F~I=p^-#IPm}2dC@!br+~uXeMHgl^J4&Zy|HW|Fc*`2{O4I z-IbbSGoV3n783Xyd54<6{=x%m#S0I8WWQzl$bm}j#LR(=%~9Atv#S;$~XpQ25Nw0rzt4A)2Nfr^$PGE zJq`oDy?IP5bo8cxIavm`Y#R>NW{{?|6Q_pa5&Fb%9w`dSibEj>qok*Z+asWwJWiNT zF`^#(FI9!p;psbeKKyZcaw(B=oNN`(zBik7c%4R*V=B{Fotj!{)OQzdKJseDo1-a3FAv2@l+xZvwChU^O35+32sHh=(rV$7vh zkEb#%M=*8XWY<&{1EFLf=n9VMih;CUif0>3=XAl+p~=&aSYyk4(;C*>O!xZYlF0vE zEHHK9Lc$AfVZg|LDciMW3u+=y&YHWNFj-63fN?Y{4O(#lUVaNTl=KcG{7P zO(7<3oL+#&jyY=T+Hc@-bTsL_vP?_4+gIU~8^Mt>clssX%9H;Syc$ZrYyQ_s8Y#3?Qpv6PrKY6 zvOmvq)*lI9LT!4-$ZNP^bCjhy%>9N)c8v=qD4d`|HC*aBVOgA1kV^4hC`s@8S^nZL zBY&ZZPwdXd`NL>41{Vh!t0d<}iA4i;4H50#fIXAMX)A2{0|w)bLMYl(l%gpHgK;;G zs<)wQU{`yM|B<_NYA&~PF%1N&9B`b76>Tj!Rt{~=C-2{0E;rQ$Z_KduS3RXl#4I)w zh7j1He$&2`#ioZ0x7!66K3XjXvBdpxdyO~iYM2z4nAR@%U zXU4I^zK8DOA+qwWX8_ziXvN!3DARA0e>DZAo?iS)%(C@yII^Zb9-ld#P)yl0-BqKVkR-eUxsbO4n3@@SxDY&Y9iB zMdo^D%1k+u`vnSRq|0Uz$mt_`GA%a>9vhG^*+9{5RnE{~YWya&e;NzNZ!yJowM*4h zwCZ^Dwp-_}DSH@*q4heCx74(jTJUi00M&UXL!U8)md>AEPL`ADU1vPiaUil^G+$<(Bfb~xpBqdxBOEUpYclw6pUPv3OxHv9KtZk^`f0a+eu zUT|cRzAuXrX@m>>7;!TV1)6&l8=^9#In@|Uh_z2;WtI@I7!oqJNFMS6B-0-$A)=xf zBvEKMn)MI|x}h?kfvO7iAZ?4!z@uQ5pDI9IB&rH^uusee`$*`gl<_gd+>BP98DnrR zw9~+(8qw8sZdizbfswzN0Z#YW4eFRSptY;@!X4g_@6qe7-*MfK^E+JWPEr0+GVH9h zRzI}mu*$1(>RncEz?b70Bn+1fqMRWP9H@&s!@oR zG~Fy(@rVu@#vPbEVKCcS71xU(0f3k3@n|^pG(ZsgDjjA_V4EcJ3My$JX9_`(nxp4a z*837#uz{DrP;j*t6(y}o^FV0mPLeA}pAQ zgpBkWcnAoJ(de84ji8m@O;`I4>VYw61mS~4TuE^wt}3|=YKEazwr&0`RR*C_RnQfv(DOF z{$KY6R=>=DPwO!`9QumQ>9jrisM$01Ri{0*vwrbLVRv$?BB8_|PEERpf30Ef zpST9E2w#WS-NJoB*{Vx@p+%@<#uv#%aSy6?V8&p}k|8;8XE|F}MJ=Eb&0J!Qaq3cc zyxN;b$eCBJPks{Gf)c)l4yqKTe+!7bIkvud9&Q#QL==|eS+ZDHQtI6}2nxh1U$n0W zoiSRg(Vc-pYznX=#MPmSXQr$i5egF!m??5&_=V6BD6|{y-u&z^KT1>x9&f&&5PYKnzGHbWND2n>bTK%* z<5x6x(~U%-MB|&)!(YNIXBt`-eI1=k8XLqN!w@Ud6S9!UPT>qQ-^lzZr*>BR1_J6j z1`}QYZXJy^LTs8TxW$n9(N+eZ9sf3HS%IZbR^@u(Bz~Y~D>``eU~tk<%rX0*n}nEYXdb<7ubRip1R%ZVy{umAGRsEfaZKI8Ie(~_#jup$zMVGoR( z1{HqWr4dPm!Hfn(kiO203IKoq4Dg`O0n-V}MBRnk(BU1HcpbfDD-XC4bPjweJ5{-cW)>S!*EMrQM3KW`J zs}l>jGCsUs7krJa+Aq84-Itqm`IN=qW#noDPHPOYDhkvN2Q*8#UW3M!pwI{XUWgsd zFqmYP)>06{$n=ugjUaZ9M@eTX^w2-7j8d8#bcFz@ComqDWwx;-xNmk zlFjCpz0{s-pW0eVI~x}BsY=n~Jbv5|3pkD+clu(&TqcOrSkfCcdRHz~ayh3Ofz&nO zi3vHd+>A9Nk~N~WO?i^&X-!9Mj?lEn;UY8Ru58$O7L>&wD4V2NlN!B^9PA1YRKtfY z$Y9`)rg5GyoQEU^R4AhNg93$uegkEJ7EA)BwZN(xeYLvISrV}OghDaGtOjB}$VUAM zR#i>pU}|JR0F8@y1)xnpTd}ERj?EIA=UW)LD5&coErV_XjZ$EnsRg4I2>OKKa=k42 z+*HRxwOYb=x>bOF9ek{@Bw!0PKQy5UB3hE*4($TN4TPU(FNLnEl0a@`P0CxLSi#=K z#yg>FfFu)52q>acgg~mrKP2bmT5UcWrI&N&%_nC{ot24m2Mxw()o(UctCAEAh4??0 zMagK?3m>Q)sPI3L7d$tFi(+!I_ZPO)ceosuL zvJZbMU7u>{QI=2->c6mOi~7aWpsF&ThFp^kcOklxiyK(XoE0e*c;`sL7`*_QIurO* zi2cAw8FirQM@eGWxv@Z=jgo32UShBU8ttiAAa(1IRcL4++F~CVq1{Ilbnp!Xu8>0K zs6*#LyA?+qIF{02W^Hu(PBVof7b8V>S6GXpPIz-;HNA6ux>DFa2^L~hWenF%u6rEm z)#jcHd#bKfWb#+D^(@99G&ZeQB};GKS@rqNDJc;0xXfm!u(XdqXHJ)*JKMweXO8$a z!JGLH*m7y-@CKvPY}HxScEMbP&&Y5B{~xGnGSsERtOO>1m>=vX*(RGL+RRM7NZib< z?8vM@OF{bC*RvW}4@{j+LBvQL!V20Rx=`y*9~uy_kRG%YElh-Cm&BAlIRMPNsYIH# z!ogDFqjIQnd>s7S`YgjlaAYRgPjwzJRQbQvTb;KowT?gW-f0~_xu#y3-4)-n&{0Ja zme`TKm9p?zv(}jWpZ?h`t!rlFr*58KwCLV#briz$5kG<`@=v>hR_G&GA|etgVZ?zWhy=H916yKcjZ>{J5A2rC)ma`0<$I4zK99 zPEIx|6P3Nf@75FG()x8Fqt`Q?&orHud|=<_KbqR*54&!tX?&h>@ zbNMps>4uPpm$=(USppdjsW;S2h{u5KG(otfTF-|sQj9Xkco_((V9D95tN|etG|Gr_ z<}gAE59j9vl)yqQEt=@*kQbo6ps-JRQ93tl!KJ+6d*D|Zqbv$&Tg@%IYpiG^V8H8U z;99l8zqaN`?QZV8aKqyd-FnlW)f?8<*8U{aL@LWv;5YzT|0Jf z+j_CGm3MpNlc&O>@M%xt6!2?yW}=*de}(@U?#MBY_F+L9tsgK^s8l)yDEy(I;I+K6 zj#d%8_hlNAXKa@S;OiTfZ#vLF4sCW?OWHDuU1vtbQKl2P!iIDpM zMy|!xs7_XiT+~TzTh6D8;cUQgU_29CSl2QcGA|kto|e7v+rn4{#5NL-b9iS%LS+7()=N$Pw2yr^Taqlt6?8K##L8DQ90& zm^B3dgF!?s%AfRK5R?|B)7G^<-wT9))(t%mWN_W)w1RJ8XMZ~APb>{v4+cW`rbvJG z@%fcDB}$P#e#?%`0PvWt&3)eP5UsXAa74f0f8lG^x|E3ereb>-6ke^8UlXksVlFaO zap*#VQHy)?ON`ndJbvuRqvv+3RAXubpE^0Aau_q_E$N+SA8Tf^jaDYz{ImVH-m$jz zg5@@~Rs{~NYfeu1MH{}b7ZbNzZ+z;hXt^xCBT6lQ_?PJLHDM?J6s!sb&j{OU1QjXb z_Vjg(9IdmGTY;O1E93eOs!~8&>l=v5#<5HqBm63y7)D=HQZLkbjIE_2IMq#I1}iEe z5HaI=IwV)?elbqo762j1M&cjvJ}F_^C^c|NHkxe!r8m2ipiKYqp=Fml9nK`;r2_{R z&+gdw%>CH|M<@O*wC6}WbE6+u;=2wjAIpcGqBNCm?%6W&jN{sw1NSiIxC%3@4yQ!U=a^MhCLiE8(*mk|OjYGf z2?wkz)IMOA56!k08`}=t@?bK&usHMcU~9W6)G183{a){fT_K0f=rLx!`9qbh zTlOr zbXEX6gMV&=JrZXU+F!oT!43#Up>^l{2*LN=A- zb4UzCM?(Rw$Ao}t0?mP*luf*rde|S*k5m7Qizo5Gh`bOPB%%rn~i~ zxnP_NC)(Nh`7xWL7L!WBN+ejj@z_mo+O=n8->qjC8#{$`=wT-y)qjYU)DG({K`9(e zTYTPNGPh-I=Z+JRn4%d6r8oop@NXlYPH}I;WGYdEKppP;NqT}bIH4vqNuGI{%tKE- zj;D54`{PWicpST1sI^7q8JPpH2RkIFCkPEn;8e`uM;0K&1EWf+Q&vh!eOWpj5QOL( zv*`A>dk*BcJuyKUhay0v9F!|vdlps^gGTKJbo7A`zF|6n|G|a3PCq!gc*vMZ1jPK5 z>)Uhts==9syw-!QD$Vie!x(XDcfuz>I(=ki`|-?NSkk(a=e@pwd&v;h|CdU9-DL;hN;8aX-D!41? z1!6()M(+i;h4eNdJl#W=n_ZD;8qXR5%t^7Ah^|l)@0md302!E|QO*vP1=iZ5wXZGK z+M~7QN@Xgu^O0inTXHPXfU9NKsoIP>O4lqkrYaH`3dxzN*f)y)UHO#%2e0tkG)Ehm ziRG#9#M%=vN5F11+taHPUr9uxpRZ};3MH(C;pYX4EwkPmx;JzY4kYXzO zL?n}lhx3s#1jZ|%m8!yvQ?aN(WI(E&gVnyC0d;yG4n4YU=#=#IDm)rTH3w!ULU@H{ znk?ZkQ9|2n2<-pm3r=1TI*C+^ZH`Y+tM)6QW-8On%*~mNX7$;NxABLQwFge*cPwQN z2C~UF`68j<%W{F&SD?yA_^p<~C-TH}l5iEWC{^A5kKdIaxo7m!K{ali!J z5fELMzzN{CgXo%Ff+y=_$&&?eV0Y7Oe|JG)Jt}m^UV>b`B9InPihC?tMcKucs_wzZ zA}9d8sX07j(%xOd$`VI+nUQm<+wna}aMo7v5z6YsI3>1H6NbrRnxwBWEYR6rviFwp zE9~u~ut&~0qk&OymWhR-^be`aMxQC?8(l=CP{}w!m580*5rWwyoUM9(Z zG{uZ|l{zk20)cbcfX*s9?hN}gfzAh?Ubye}ZJLLMmwrF}TydKvc>7I9CMTMU{w;wP z|CBj0llNCjA03n#9##U0;Y~3|KnD+W4K{cJrwVR0 zJVwt6IvzT<;23v}EVwX)opy;+(aLrrb|uH>^eU?ey$1@f>t-R&NllMK`Or$32*<9^gt9RbHx^}1ilTvwy zJse0>n6?_q&NWvi5drJREPn;V>Tdo8=SshWS8O?u}39bL+K+b zNyb0A627v1y11j1zT0fHrdp}x<^0_juDdTbIseg0@pvVFQuqwgZy_ixiBI3uepw2%1uj_*I)c%AkxM^%Kd_G6kbElRKVylMFBNqm6C6CqQZpi44yqx?K_$9 zyOZVGfXTor1=|n%{OBNfiB*c?%!-P}qTDY4YFZeA3Q_8+SW%#nvKTxF(oQXg64`{B z6G4*3_^=@;g}cKN%qtO+-5N$>@)D@A`QEAP8Wx1t-m__gYFePkoC%3G>UmOM%&;| zF0L(htaHb#CwJ!J?$Ytj&i5RS$iYcW!MI)X^BMkSSJ+vQlD2rvrcJKShuph&%QKVm z?)Is)H)^v7B4P21eyIdqT8bY(;=d37+Q2M1%}x-}5hFfC^aQ6|qMVX}QWBfCg6vHN zs|C;`3y)RMB*SC(!)#Ns|K~0vLyK1fvi-wGN^I*rUOuRpEFWJ2MZI76jUlm zlq6K~jA7lfXg0HGLO?Al1&Ia$0f{wnLDiISQ&9bLwNqs3~4nRk_3xKo!Kkot+6og=Tsa;yeqj#yRhltZkZxySDRxHyZq@Ala)o|{C6o|CqVU3!Y9+c*&NSkG z7U^f`_cYOB1|MpJIO-98e9MW9RF6x=^OG{jpOIuPUE6x|%^zR*tgk-X%zpHS@XXSg zQuUUjr(ZhopgNOte$gj~gU>u;Psf9Avsn0)-xuR&%b(kKJ~iQ8o7i3Qn@Un76OFEI z_!5I43ZF&C>lil6(tXmf>SVO1h_yK|w@TV;apou1195D9W8`xvR)MXDvw&PGZ0~8% z;6fULucI)6od6!rWF~-zo}XblDr#;~KZx4sbVd|>9JM$BdxB`sWA3sF`e*a3!(0LV zb8j}gw!@eeqv8|pR5qaXrB`bF$4r@^rZW`$5eS@3?THtrjI)MVTPm~q`$xhK)ZdfP ze1eV{Is%kk0fb;3JT_|K!Du!qlahkqEGspcx>NfS+Yt+y69|JtP@PDKP^9h7Rf*jN z;!@XF9pu>eHpZV7NT^ojg`|8g#_N;`I|t&E~`Ht#;p;!?DgSi;w=wzJIcpZFaxg@lF41>vs-W8u{Oklzm31 z3;=BOdHkiNc5y!7Sh-H9HD%dqzvV)F&yLEwPhPmMlS^Q-&#q|xa{TaBp~}A#ckh#I zFA!+`l(@=FqrRtWqD!N)4azKS@0V3{1Iw(;#SN@o8jRby3D_5v8;!PNMh&nS0m_54 z@&n`{SeD6lS<@vPC&{uh68K(#xcI6(8LyWHki2f!gh&IInCZlIDWm@Hxo{e>KB33q zwsuwMOMt70uua9=CI?8Nb~ZP%V})Zk%KonAgt}e(%*Uf)Y%AG$P#Y*5oH~2&>PoPk zJ#6=3U+r0+B|jMz^OC>FFA0kt-@YxwF9)&{>Cn0P+BS7AewRNy&VM87)A)nu&P_yP z37;pDh9_6>q8|w-P}9vqf@Hv0c79k9&{(9_+krR^m>A=-*%}iQok6m^tJG~>>Mg@s z%Qm)q4PCHxPqBkL$riNXq~mAEqD6L!8N-aL_C*buU&N?!Z#RtDS;i@xX!nXZjRS{2 zBC~N&5w+k9%!O*IPADu|5^d}D{bCy<=*B08J#LXnZ1CrI;>ZZ_k3DxrQxeFav- zv1PEM;`WpbTC2NS9ZrMHS|Neb!4*#I+xPJ4V~^6{<7_%=Z=nu3r&d>+qQ~W5+gsf# zyHq>RF2(bU-QjOILIJnm;fnn9yqM@5J$(M`HiIh?@LK#H=Oe5}5p~#ZV;0P=CyW8! zZ(dqh<-L(o$ho{b9Q)oAE{nzWgv-s|ff7&u9zL+bJqo zk@Z55Q-m&!qNOss#D;AdkFC!c=odKw{spxQ0B_76P-fZBu|`r3yLwr=0X-*2KNzEq z5E4ve)?BZMf}Gp}=vv4!P>kE`?7S*j6zgZSszmr~f>5E*`%+YuUj<{q#O~i0BXTHX z(_Xt3le0U#I{ngh_kUMoj_nz*&!^?mTBOPcJW-$IOGj+w?Y#4A-sz}AqkDbq+{vy5 z;9MhemoG-$$Fw~hRC0~)2%lp9^gfP_k>E@!1f4Pr)Ts6yWja{O?9vqDm|*=n9YK$h zSb&T}bOz6oZ6rj$TMrfjK4nMRxw{9Ma_TOD+`jj8d}o04K&Qd`B^a$`$&CU``1ZujD6-=5!V$qN&^ zt{vaWJA7GwG23YDRc!P_hE=49_X$)_4a=a7#v%@#hz^T5He6oxh-5~RMV5_KVO`$V z)8Ui^s)T5=W}1$NKQq`QLb5rG3BnvQLERqOnOLrPmCSO3_1WBb|8&WeQ^AT-?Qb;G znMQf(^!Z~4ij%QO+4jh77fw9BYr9K&$|pqve89ecZu)4#{e&YM@~gi(Oq{s>+MV%3 z%G@I1OhMpr8K9QXG?(c{q!h6SOSSK2LqcwxWvV3W$~7V4f3U>(SpYDJ0xVJSMd&@a zz`!a8cBRSy$c?mNqqrn?GMF0zj zkv)ql+CYH216rs4x<^i)TfY9))CpH=JR3fDf)`Xez22xF)2huj(cxaS)+-12v&G^6 z;QxL1sjU-lb9e%3XJk5atg~W-HjhScu;9jcjdyw_o1XvbYD2tJGe62JksBEJkHV)u z#u2zh#R;TCh~Nsd6p3>KR|;;Y5B|Z&qE*j;NTxA}cz7^@DfLR0M!e2`l7+7%xF5`c zis*)Z-psk8u?!Q2)qqabSB;f%hPYmoia8AI$LPwCXqtv)S5N~%Matj^T@1mA4QU|{ z^;Yr4CWVH1T1vP02ly0*?}B^JKmH%7!^c~RyYII9YBfoel2X+l=XXN(s2uY&t+|_S zxyb+1JFdB~6tA@+!-wzXFWy;<;;&`&x$|Nq8+gMRaR9wN4s8cIBNi9~SBMq_poj%q zoQH|10WeY-1(Mk{Fcbz`CFl%M{X*GkkAa!W&?|Np0NW=d7ea4_%`3sUiG*AMTi)I*THhfBC*j6exnbdu^tt| z0b%wIyv)9sMk9}rCc=>{yZ$DKxp8_ngNc164AvxWg$j;>Hbg_fYbKigP>;m7WTPcze5#GtM%4M+!KuqKQw%YlDoai{}s4qd$|+b z@30J*DDarI+y~CnVWsc612olAZ<Q&Xw>b_6>8o~++j;~-l@8!r zlus;F*CU2FTm=}dy;Jzf@hl#_K_g8VO7x@()qO1Ab@c5bNK2qLp(ol`?O0_OAO$-O z3{I7Y$!hLHp^-rEr`(jL6C-nC~I_-g%hAY7Sh&c}?}HS^v|bGzZo7K7G3kuL;{`TGCjZ92=C);XphJH1UG z&^?C#{yDeerxDkl;{vF5{|uZpifiagC-KryAR_PX`>8rF!j2~3zE-ph#SN&SB_|H1+4|Es&^V%J!tq{pPjCT=6dE7U*xJ=@2>Qp1mp`2M=p zY(v){e_rYOa|0vv$ZV{~&tsqVXd$;u1X8RH#2$JG&C#nH5lAEOctjvY3!I3hxC^Wx zWYLgnY#L$1%TXw#8~qu&{9kCT?7HvzV~;kBhDbD|jYU$GMx~L-Hd~o&o&U*s_qEfj zZ@yzM|Levg5J{aj=KD7re`5H)cSN8!7#;Zoh>XI&e-u58COAZ_c>yD0rH`w|G6MAG z>TF?8orsZvQa6uTcVv!5=D-0Bt04c3PAGv zV{B<&uL+xcK`UUdL!roKbKwmjQ_&MBoireA?$(*-4`2!+Dl=^a9CNZv3CIdds2c=5 zkd72PugqWQC~-pC7y$+&w`y8YS;0{gKI(XL?2u>r+6y0k_Tuc?*6m+D_^3hl+CH(?hb2Iec;ueu-M7SA5Q2;g+MKLQe2J_kja4s}TSwh6kRr_Pq zckW0l7IAs&qtTSd`*I@4+d6<%;R{(5*mJ;TXsC5iD7`y|w0~SY4+M@-Y zy(H@GZjJ?9CdUpa2lX7dC!?sk@sY?VWMrm7iNuV!J?JPa#5Yui^h4%Lw7O6F6M?bN zxZdkLcFg4u;7_N2X4_0YruR5g=J6AgQw!;gt9WV-O?p>770bIUx7+*pmp{aU=7oo zP}i8#hT1N<2Y{>vn4h@ABOVi7lZ1biAO|M z^tuQU0mQ^lix!Jlih3K3IVt+)8?U>#y0tpH(ms2@nyg@o&{nHNrRcqGL)9$Y;Fr}J zIS-9SciQ7=mPPyg!tPzW_wo}v@13hnyj}e5JMK7ZnFx5?-bu41j7?Ym!n>%0FMfSr<<@{#e;yw zx-`A1xoJ>;F}Z?X%vW`U0j{# zTgl_w0dd~6)Oh=gHyE}|ue6f;%%P}Zw&9=JQtXH+YlM##i%x^|bysJ8>#Z$KC|Im) zNzCWG^;w5?%#{|$CAY&0d1~}IUIlmN-!WefY#$8{OoS06L*yxd)KEt2Yo_QlXdr6M zb`=GcONkqaIk3^zz^+((j{UnR=Prpgrk%B9-4RHUs^r0Pnw#L?|94D zKisf;*Nv;ItKSa$nuQKOmuq?@-f-u_R-VY7+ZKf_A6#D9IeS-e>8|%2Lsn$h#1jPFN@v(||M9OUz` z^!yC@GN9|+lZdmS!eo_LU^P$~{#?oKV3Cb}KyzAv%W*TWOhFVEFh#xA27y52)X5<^ z(O=nYIJx=Ljcm5o1o!BPGu3vke*BR~j#mp;ecs#nIq!+o_)_etBpU2Lzh?jKMWGb^ zl;h5i-R-#gi{VeM{MKf@4<6q;p>%aS2bhZu1EaPj{6j_f2d6U7C56CMkpW<|+)4+s z0U&>9pwr|tjnO9{^#}t6(1)N3UT3GKEa&)~$|lCrRZ2+EekZt8g%W4o8Dl^Z1vi`* zC9~TgM58VQkyyEPsS%BbX}hWT)Aek+I^r4}e`{%ZZMk$f+YYX*-g|cHU?HHLKXH7X zw_U|JIJ4j`q$cOj&yI)vcg1t+ZMFGxq4Y#H5Zk%9u*vhozHQ{gY1D#j<1Ee#6fId% zLG+}K-;IL+_?0di1PO_#=B`q124s{dZNyfKSJ~8<7JheKZ;L1xU=o-QQ97~onADuS ztZ@bxlA@V+dfg2>meeEmkb~LyX6h3qIXzz=-xD)yzI*?54`20FEB%|HP|SB%q#;$} zmhQ=O{GWgQ>Th87AA7~4mpO2FKWMX#9TP5aPd(3Y&dXW;U+|8LkSFiUG&&MzD+`#a z7wtIIfE4Z|q=p6P5dc8$V1x&QZP3%>rAt*-_F-Z-`U3L6|tkVvw`*UkNI_Bm(6PYP5vvw%JXCw zANO7Ug77!6%k?<;-!2ml0HIgm^TH<}w=QyP*vUy#XF=U7?3006F_D&Bj2qviPX=oC zO&<9?QT2Q<2_P^VS;zYd^;$WGb7DylGXSPyQjKWUW7En}TyoYN1kOkA{ES@YE5H5K zuYPR!hq*NW@%YqSV$v6T@hJbpn5gl0hkyLv{k+864m~g*mR}#nup=ISU+3kY3jc_| z?-)1EJ;(L^^!IgOkTgNBbYs_aweRrLxpm;&_M7y#$FfxR$)L{u_JauLZ(>e6LTF~Y z)Gc4?Nq7+Snk3c|kl^|HWr_YBWvFF9Ri_KmJaM||At&e~PWHOV2HrMd-44oSv(&`v z*>DC3xHFmY5i7ZH`s+#?02)&)IJm)G)rHkK^euFp2*8kW2fS|BXN=l-%wD|yn#Cr1 zW^3CP(={*lsX20j-??{9uEnw|gAg& zD~+Okd#iKoSm*azp)tRoR|{$l_NRF*{O>hnwf`jDi7^=T3~cEpbvp+c(8;Vrvw`fL z^VsEK!v0#yTRS{@NI=N=uBQaGUn&M@$pu=@@PTNDymA$g*5{aH1V=bKpadE{7-PRq zi5xioEj#q3|*XZRG(0(*A;<>LpHai_Q(7?L_Yqtg4m6U;p~y71isn zw!<2~U&DAr!1ONvP_-9-cLUeq{#dDd1~X>Pj9ELXfd-=TB#|m;CEY@e4nVh!$0BkG zr>&7c2fGi>OojKZ@Dw-n+z8ie!lN~nH6cAeeghd?438LN$BMW(eLowV^%G~OX=53B z%A$yHsfe^~$KYhokDR?{M5fh?m2p6380o!$rV-bhL7G0`EKUy_@kjI0kAbRk#X;_Y z{2^N9%x$ok&;s5|-Xe;?$s~S9!ahxwxZ>B@xzfH?jwb!CgmHe~gTM3OuGz8A9O2WG z{JF_ApFeq^P%W=S?^5oH*`YzRNOO z7<0MC@-w<@=TsxUdrv1_Ol1pOOIpJ}-1hzpxPu~W{}-tJ6PS{KYI2w^SQ7Syk@ENe zXUYLD!O#GRY<)FrK&l}p&ZZ`i=4N~>r>895gHO?G6L3ImEVJzkEZ_8f8ct0h^KBLgAH@7jqS+RA(tyACX^s4K1(m&uE?oNf|vct-CYrrWq= zFMRYKxlr7-x4h@3X402Q*RhW3{;#|rRo)xF$9K~4y>fLqX}h+XDJ0ysfXkDg%TC>% zj-B}BZ!f^ixF?CruL*wvAC*OK?LNiB62FmA|LBSgycLHIQOHZIY4p@w*irzSVle^T z4H2ILT_i-t1kXY(v^t5gsW3DHLSH}Xr4h`o2&R(Gp-AmiFiA5o1zl;Px3V!c_S;nE zp^LW3{l~Z|oBa)gu1UMUn7c``DPJW&;SWsT>j{S+J-YPP^Rt=xg9r1&cRzk0ySybG zN-dOkSS&Zx7w>xfA8K1=F%%WvGFQe%+T`~8_w0Ib?}U%H-FBBLIKF2#DOsHA;@0)| z+}It?xwn?nyDuJN96(TT1Oax5Lz}4|rMMH@@Ya0|T?r+{0H<|e^+h$Xkkt$eC0N2i zW-)*h!n!sh^oDy{%pLbR;s|#*I%(=E*^PQOE*p0gy9TK_=|Iwr5q1d9gXlyXW`Uz% zA)VT>js+b7n2Vwki@mHkVPeuioxITag5w}kq!OfVOEviut@P2j6b$o%%U2fn>MF{O zJH@}04B?^);nbHNn%T1?%dY6roi{K2WOV)5-Sgq@{VSfmj*U9~JRY{ItqpSQ@%x&w zBDGT?B`pIemFfO-GTX(`V4z*t_X-=W3KO@*1wY62a!5ma4vc`{9n+CdVVS%|r&CnP z6!jBSR}@fMDi95n5aM=4cwy0+F8l~YS*y;ZvI)cgRa&cVPuOo18#$l7?wcz9mCxX8 z^CvR0?Ga(C&uq7;TrOl02Em~g)vy0_HJC5>4raa4RC4AR|4yuURl8g&v(+5>XFB_r ze}X?g1RoRR!tgVFJKl1auMHf^lX5C6Rh-0E8R$j3$BYkpZigB%0$30j+?e~J7Z%2I zC6E|3Yt4E}*3q>kts{g(XU&O&o2aFP4-LQMHkOOuw}z7WZ^WaazY)KeNQH*BKRDy} z`&Fu`8&W&$PN&N6*QJ+)`0KA7s{Q$o>3;H;FJJ!O{CDv#A~XxD#ow^!r6iY;akU}% zT?_sFlq48A5f6R@k#f=d>#Gfy{3u<7yst9e z0F_CcwoNCrdF+rDkDM1A**k-NS1g>K=1+}BFPz_gZB`8Bk2+<8#gQrUucbqR->;4} zhmYQP>+)162L)B0#;O=7w>wC5fYJ%l0Sg#n%$L~Ps&QbLG(vxX^K zJjVQ&L=}-6j2Ny*+U+B!l%NDyM^(Wn>vba?WDS0n8r$hBym0>Hh1)Y?`t>i2OYyoe z=XajEHx*FtUNi;*`mJkn&u?HfLKaPc*XN(NviD*Tav zT?F*6bKLJLO3ti>HgIUU^Y|;fs{>VBbixKI-75ogm_B8Y5(1vTIxu9}&kR&8fFy`% zz9^y?kP#?<(Si_AvAbb~wFb>1Ua=C-JQ7cFUgXI+i7+*TbW?$MLYbNS^2Mr59Y^ie7hWvig6jcxW4n9w|M7jTbJ9Df7*(uaYv-q zpAO&8&(2PNc6N6zKe>c6MFfBXILbw0)5OVFClp^DtHKn6g7O7$I2Qt&hPf;a4n3=% z)0cV?*aB5mgh5LYaJu_x)~00861oQwTh~BYfepWBE1~Ux1cT*+ly$R0+d$J^Ix416 zTxr-`c^+Y|7s7GsX$Ynh{G09%NXnIBdo$h%SKK#X26BRY=DO`uv5>=`jOX(UyAl)E z9I6)g?60J!hR;l;(^I^fFFBu?zaylTz2P*-1e0!e>Bwwzwd_~FvyMH*uCa9e)AR}R zb%^ut5T2zT3@tPb2 z)JxCeQ_K(ph=lwI*^s&_)Tf>K_n*8)nbWq}y1wUo&Ct)f3(sSQblnb!Ah+&de>&Np z1RCVl-Rw^<{i#8rvR-d4;Jb_TCo)mrl_oC1!e}W#y8uE`@Kj%Ldz&^p#3e_g+eN-( zaC_^`#W#F&)aoVFr>{3cNx0q1;s_6-{z7@4mBzH6ff0*)^NTpg)MUG|>llHFtr&M; z#6sn^U7evJX`{SE)?!5gdBp_LieoC%WKzuKd=}B*w3*EYv)-cN`NHwYmZg^b4>N1Z zPfZ?2DEj??L7X(2W|sM%nfwK@+P;`6W_;095o>YEnfdbWplXcgyp5fAZW(@Ze^vRR z-~C(rJ`g)*7WVzTeD1or;UA3rD*q?&A0ccLVw+6{Hs#nuC(uV8)vJ6Ns17(RjfWS3 z-|g#JhN6d;>~kzG5Q~b3AQM%cbkK1x3{G+k2I^z_(H~-jJ0i-Et|Ask5WJ?U4m8ZK z5}}yud0}awh*aSamvZDImE2^*jgnA{efL%qbC61IqGT=njZ=roGrqD}5Nu{F8}VZs zi-+eGRh)rKc`ztZM<|34ib9`^_J#Jf>@I70dM?C9^cC@3eFF<22Evj3?1}tNJQ0=@ zU9ueJZth#1nx@gErXh};f50DW42>YQld=f7WyWBC|J}B9^Jnk~q zMUk346*Csb^0HvRR$oJPO-F;0mksYu!h_*|7sI(!|M#5*CgP?+TLF^@6cfjg#0@OY zM72(7dm9&KJzZ*!1ZW_hvgzmvDQ9Xln?)_FV}K1%w}v`g;0Um#;Z)iRc`@S{%TDmk ziR?Z5Pac_^|IuO5Z8kPanc~!PYIZJqLq6VIofa`DKXGVBG$QF-E}azl;JdbO|8Dbo zlXGlO;^4u~>}O8wxNS;&ed@n$yYuspuAG1P;qxby{OKo`UsVxyn8Vt~zL^dP7pT<+ zCT7tAZ}p4WIIXdv4z%LGrvCX~u2K9~9D~l!_te3kbyd%E>lisqke}fs3X zx9UP^;S+w%hv(%N{21OC;^;4op%D2fl5(kAGby?)NZ8U>Y77cd9lAX<5XC#Ti41$7Qu8U^&z z1@;99Cj*=E*+?mxbVjN;Oagj!>z=5b!C^pi97;17ZpK;BSXll9Km-&z93{-lVot|` z_y>RqmQspac0>sKz{y~rQ=5tiHM$rXi?n9oNcpxgTORl$+pC52vDws)`E;Z-)%KUm zwt!;kW}gY*l~zN7`F10JLLQu!+iyoSoY(DAavqsT%ZC= zFiD%2vPD&#x)Ylz-Qo zpSgY4>YKKr{-}svS?gEvkzKXM*+X{@e`~|FB6o7(+^ho!%9B=+3HO6$-hD{PwGceT z2XyQxP{diFU=Pl*2j>_$2BYwh!wdo;!(cev&mg6w*V*dECLN4eue((e&J<)`_P`wh znRV6%ZYA+13_-$K8fZ7Bg9apjUde8Zwu%N zvyP2{1S~(-$@Us*U(?=wzwy3bd-28hmiCTYEiOaQfAYzr$G@@VnA2mPUtqz9KR18i z`uqOi*$@7y-{%Va(>Fig&Q$suQWl*>%@8Ks53x00YbngvMD=FvbpHjD0gBrhh_~l zyK#R!@Go`lkA4w{C#Z~+yS=2`-SHBI~Lh5IFe5b^&Rf%O801Tp+ z29k1ONK}~o zeLZb^gsHsnNf;;XiPZb0@AXR51fkVE*m$~eh)5r8bgia|Ye1N+a(-y2wuV5@8e*QW z=R;!l+U@5rM8}7}KAnyyU>$2XHWmnsRl@0n;1$C$mp>>p!-ZUEYWdb1haYIh2x|$Y z-{J|l-CNuI+MXQ_XlXW!8HdFnQ(pc$@_;Jry22gi{sU@}l(~4=!Rq;209t@N$6;F! z9S+V@ghjTLdi&wijU_^5y|_`}d)oojO+|`cIIk(9ejkB6)}?{U##M3hR1CsY;p7nx zu#8)}#(vOUv-J+abR)r1CT)zIqMo7usXB?PAH`3XfeQ3IH0-qo%yTC`9>PFaXA4uQ zo45C;X3$Kc{t;Yt+&6(c%whd1B@6S*YlrAc;|}it7q$z_ciO$k6h5NM;IXfZ&KUhZ zUIwKCOn6LrCoLsdQr*as2g)1h$Apj8(P&`akiJMUhMV#x0k|Z+7W@_*CjR?9`Mlj@ zcl&LzoA+C#MgH8Plof+Da5j9+nM|TJ?yaUh!GPCRDXnCt!v4puUo6iUd>ZvGzbBA( zxkLQE-5IkN5On3=!yK3f43NnlQtJu+f#N#0=nyNR*^x z;CeGQHeuf#s|~bDy5i*m5?(Pxe3`5O2BmUvy_k|D7vc3%@<>DHZd@21Oe8oJ6QzNlEf6S1R|bZwHc@&0C|i3hB*xgugr` zxA@h1RIUy`TTfnN`J;Ee|HT)d{lHg;A0Bljj=Y=@wSc#RiJ_PXA*WG?lHYo&|HmJA z_G>Q;#m&Bif)D+Kj)phP!PjE zjF-SyWg<2LYfK1)1liHCV6<7I4qw6Uf-*(sg)Tgd6=M!8MzR^9YCp%CXKYzdkm-PM z%4{iBhYa-j#exP9$CWI2)1@@{pT8=%U=|n$CQ81Vtn>S73BY2XY03Q3rd{}#Htq5) z2GOd+WUC;Yj8+7~0W1){LYRbYCI~w#k*6p!6Lc$3xGxQytd`#(2q4Kvy)#IdIVVAu z(1!;nzJaG~P{*XxsDQ?5X=LGX$6zPa8O0iFE`riW3cDP7$kZXpjv;+9h9$NM4CGXd zA~zuM!RQ2BPokuc^WkzQutgvZ0e!&!ptNEro0#u(MX%0fkjYS?00*o501y!}n;R>M$w(;>$<<9_#OYG%#8_ubHTrVtz_#2bQNor&PFL%uNn(+a3Rw}EuOPi>9l<|$969f3bot-yv2Xs7l4bdu7wfloO}!BiF} ziTtSz4i>aXeQls)KVq#96_lgsO0hv(6QXxt#qN^|M~k&SOynwke!5IrAP{|(lj$D$ zKu79(qiCtZC>k=zCdRGgFKN6v4Ak@K}PXE5D*u#>QPo!+U^Rgm|izkrSxoqMls zO1Ncee`bE0Yw`FSA@6_we*olU6BWw=zXRWdjc?#ztd0~uEJ_mS!3T6pv5|sD^AtNM zdQSKpJCSM$LL~yf3Yb3}UeAHk(AQ`IdcgvAIvO-WgWJM#HrCZ-Od_pY6J=hSzZY(T zx|sa7qsMk1;ZF}geDuKnW5PQ51!`OlzkL74{@caU`#$nfI{!b%`F{@YE=4_=0KGd0 z)8jxVf>>l|QjD51UdAtj&<}_|Y$(vp1XzeZ0f8Th`9uk-qkT7{Pq@8wS8P2a9tUI^ zh7T~OLGW?k$nXIpQWiEqD7g{89C$#$nMx{=*m$2b97l=_;H;wEhb{-P?bw6P^8A+) z9sb~W_(LjFuCgcBSUGa!*9QYp3NE=l&u8$;{938``-dUc;B#Jk^ULY)d?)?#f!Tt` zqnugc`*=So?!BYQAYH9z!h4C~z2E~j0tF#aGCHa0Qa5p_XT?jh+Suebu(^JOLH!Xl zYWgk)h`69{w62f1keC~k#M}VT7*Khx44;m z#exzNNNHASE(l4{l|aK1Rfwi(u^CO_3^$c#v+k{nNvpw~I?yT2ccRkb@R>zP%qCh9 zr(PxKx6Fx^Mx-8~GSaou+%Kl<`cfa|BLW!jBhie9}Pk?)FlTWL4nG)QauWib=Ik^~Ag8zD&AW ztb?xJS=X?7;QoS^&Nif5eqK=2P~JsFEr6&{)bqg;C&^Oo5lFx^Iv`S@?kad$>?TJA zlrql3<%bD&gpd@WCeU0IZ%~Oha8f)4J$z7KiyDq*9M$+tA-Nb-C}pT4CPi^5LMS=B|Z1w>jm)e6)zNRe%wE$gP~ zD5LazQsyaP){@AB$%Np2MBfO4 z&ajuH4@O9)14c#0L#|~2E36PeDCCNxL-CMMsFK7maq`j1AQXJ|#VsP?yQF_Bg(2x~ zZEqPIXlZXX1|xHS9jHHdRpaC|I)il2J=|S49$R%z{ebvrt!j4;rq3PQKKj1&ptZ`Z zVoTK2O)RPOx2@`#yLmKBdn7!1cI)(lx*7xR36=Dz_89BaIMoEN#l({ng;+-rFSu0d z2rH1_lD<%$bS$gDyI0{)RGy?-FgO(xDu6t?6|gF@7Au|iXV63h2dW^f3?vOGnL30q zX0-~tSst@;Zcm64+p*}`E@#{jj!?!TqUadRfVfDv&#NSu=-NjdTL?9v3W*v}Z!DPR zbB~ovm3;5jSI^@Hqzq_PgnAv;yIVOMz5#mMYP=?PbTyYj;gM&@e=?kXM z+}p8m|DNI2(b3kn@v*jbOHaMnS!3PNHoSPtIa~1mS=w86%u@|yS0%bmep`V7nA2FK zl7p!iGuF%1UVFR1b}XymG~sO_ac9s4*h7*=@xY}fsMQ~mB&lz^j}Qckk3uNG%A-;a z#eU#6(V^qyb|QQz$tI*{WCs{SHjsk28Uv{ox$qee<&RN#ky}w9E}k_tB9*v*W`F>< zN+yXN3_xc!m0{0#df^)}xhfi|3L4h1?yg7}8B0kABRi@P&HKjX`AL@4spaDopPI-+ z5{-xuino|Tofq~@gnI|WI~EO0$I6=m_3`soY}~wR?bT=A@9(sziE4LXU3XF#_FQxB zl^f37`^MN8Hm^E=&@0>*UGb@n-cxPC#zg3Xn>KIWaNgz3HRifx=M*YUs`)uZF&N;R zTB@uO8unDp& zv%_6<)!}|jz&g2$hMs=4L7Hl9wwdI^nFX+WOfHZ+MjZ8t_m7PIy`H&JyQ<@ZDs|R#zc3kCdvuS zwsbDS_V6Be}wKR`G|ymW0@r^{vC)O8vRx|r7yi1_0E)R)g{v@F@&->}?U z>kY)6uBQ5(C!Mm9{9j&=Gf?A6CxA(cMo%@>#=g36!GfuDLt8VMc!8+5^X%*Aev(Z- z)p<%s%gNF4VB7e3ThFRBC$ZbBd5}I#PeDdz?1akgvS+K!3u$L|IC8Pn=)@9C zC)$#6@hTV`=u?)fuJxO_v0Ds+(aQ!T`!SA|fS3d+01>q+hHN-{Ump0-w(MvzsvfR^ zKx|u-@KlL1lg-zgAc2@_j5pXqk=A7$AM)5j&Z>|#nC@*`DvlMVV%@?IoHZIvbw;C| zsVGUtMhM1{>4m55SojHleKb@aC{M;cAKZQDyrTrF)Xy%=$24T-1XXMUZWagQtcScn ziiZ*h9H?-JsX)MI7+)BN=?f!#?_y>WiREaF2MO3u-bpx$vK9UKdaQ!t|4!Mm7-dbf z0akVaa`XpeXNuey&kXlUt)L@wiW095nNip$-8D?RXpD?>r3%qy>=mj}G1JODo>Op| zpdRK7v!1;rEDWhp2XzHw!$vxi=9B!Q^%OvaUCb#+Wbb2A#LqmwWcL|UV^@|}SC=2y zw0zs5XtKr_Y6#W)$9KIp_su}lK(n`8t4sBU*X*TXs%A4 zf|N>NKjGp9ViL<7&_M%v=wbX(3?Hloj9NeIfaj%$Ab2F;*M+B+g0SsyrKFOTOMhhdt~k{SJ#e3Vnt85 z%scn_Gj?v>b1tnlRjG!4-h#DeLe~ACl{OdRjP&+`)U3VSppMZfYq; zq{Gt*x`G;uFd8%Mz$sBGzB&ws4RTGFF+y#l?-Y1e--jg`?IsDqg%|N0^o(Qzm4Im8@_)jAI@pHyDIYB$h$Qe32qFf-I(=4vUB}zGHQBk&aQ~lt?^&gyju&Z7zGgKKJ z6`nG&Vla>z?ydEu8^Yqc%4+xf1~={Y8lv6eev8{)Whz4&72rk{f!;ZHbmiLS!61qu z;eV(pLQKH>_bESCvMGA$v^?N<6lPdI@8i9#Da`ZE`l{As2peM&QO&)5Zk zBrBB9qAD0D!-6<0PH~ww2sOA_+j?kqv?0zwx}9?`#(H2kQ(7i6oFUqBVW}g?wl?G3 zkL?5SQAR;oV4VB0*MjhP5r(7@D?&+QKoZbBcqM5d3Zk0J@U;^#^9qu3H8R_oWj~h= zDEisCsbnD;g>372=MOvrAF6F^^0{m6^%eFy6u)5Te1ko?st$En?LH4;%9N_&6s=|O zdOH1eR+G(Sc&iXwKmok^ngA1xZxnD9KO}~$iWz$0HORtgSVD)WQhTNuBCa!;>yc-Y zrSN{qgcWS2r4*P_mLk!FjUVN3ZnJ z*a`(5;3I1QFakDy7A*(6R5o%9WUID1X2$zxhU}U0C_V+yl#PRbop3v%++=2H4;4Tw zHzcMO^YNsn3)P*-?1ZdhGYERtz()@_8o^SCDlAn{q&Sn75^CSa`3U1OU%J;HUe-Gu zaW#&#g_|b^e5opj(@_=nxO-EpnhZX7Q)RWSy3%Z}3lBu=8ispAy{lSkFS}G!d4#&~ z{I6CI_qA${z))jqal~RZRfsAV>gX(O9~iD`?cX(bc0-4wQdFQFfNHNFYi}O(nHPQF zswJnp+#gxk&TF20algWvZ>N5R7ScwDC+d;IDj82CcqGFH87C=&@40rxLLfD8#o2_Jr1|jCN4ni`>#;Nd%!Cyg{mvwI7I5<93hbUrJV-SaiUWW`5mM~Mw1*@}X zf(W#t=mD+fD4onH-vd?;@;v~7aZ1U@jGlL2=^9%iV1i|O{1G}vtRG1aE$jiRpe;sb{S^?W)0=m zG>|(1R&3~ajkp2)PY9z#r9+7Td}(yj#2u|d;%FqaPw+Q2z2dS!BL4iM(KFDXsp*pM z&_B;DxM0_Uyh8L}^r?*#F}3FIyKB^zk==8@QsJv;89DM@Q8xEib&$R~a^#b|E`5*< zW5_)jA|EW}aAc^uFRE`q)nt`+;?Ff!0Far1 zPWs6Jj^Lz$Xe~D3Yd{F>7?DGZhfc_7Uy{m1;;*coRW~R2`M8$3j|2v_aj74G;5E`B zMO8R}_k507OQ3-=K$T2_d>lr?(FEMElq&6z9ayQoQeR1YCkX|a|H7*m<_?^52!w%t zbT}B}e%aWZUc4ktd2FlCai{*+;cD(|?rIFT{{Er0?aSA;7ZTorEPW$lIO_XZ9P`zsItizl3B>Mg6 zNKxfD^?hR}x7F<5E*>ENWxXC3Q?q!_Cgp}>GdXAMw%K}n+=2!SSXbO{QK5c|$KF^OF21M7Q zXflIt8o?rX4zZ0)w2dr&ssN;9{1p5F<`KQI%_RRz!WJju7e!b(0>oycy7t6;^Cd3c zUgK5AyBZ)X--U6fo#U^W-0`?q3(9@-$NcN+U06?bKr3a<;0bL00@_h6Yyt~F-(w>r!6leVLhIOF zUTrB0`UAU$(}OKTH+76$cW%#_@CpY4T{jObXrGuoY0U-dY}i`!%(l%v?G4G`V$aUL zQ!a=^{(N`@MMy&REvHRvI}0`@<+=YWY|Ioi$%hq+vGnmVnp#ae@fSc&PFpTntyB;S z2#N!~*KXL6fca4B&R~kYt%?pI!|9lGK)M?YC`Une!tSXs$7kY>S%)(~7-l6Cz$rOn zLNtyFHNkdiLXiM>+>vI3QCP}&Yg1$Z4Xxmcf!v3W5^`@uV~s$c+6CuHGFQX_VYImu z9nrNHjO_f-g8q|jwF@VI9BLnEul0ExzB)%B*w*iMgwRSkbn{x5-(^-Wx#q!}w+wqe zcKzx1o;f(((Lef;wuK2_MXkA_(&XxEZ5e188EIK`TKN2LUU|jSucCsC0oaj0qlUPB?{I?~K6a?EtY;szph zwz*>g+1pB{4E+ViOp47_A8$|h4=j*8rM1JJ1C->TBctRd++ET+4AshCFufPWvgVl^ zlWxlHE^%tA4jERvDuQ00W!w7Um7(aWM5nFd)Qx)wM%KAbpIn;AO)VU#X&epgETpe@{*>}Y9ywA^O%wTIp}y=c%s)I3^OZ!VjdSUEk~(KT&JHI1Ltf5mkF z`o-1$NaZDqIwQT^eGC1m$$0v-Ub4ergKtw0;nclB>LTaYK# z=zKNO9!NLF@b(V$NDnj}d9XK>UbUsU@1)_DaHq>y;i>Cy+*t3asB+uF_J-;P^;h0< zUtDbK-98+3B%_IjWiEg1rVThn6XxMk$j1=H_p5QHkkMTr7)XD}0|XbdLcS3W4yZwp z4e-Gs082RQ;Np^0&>c~7&M?Zj$gVP1(W@Z7U-BLWpcqtv*nHgMN7G{Kcta#~>?3oQ zsaFF`xe@85661d(;?YeCqBu^H=YBLX!W1AN&7KW3m&J27BK$0SLQq&Aaub@3b$p1D zgA^;!=XC65ghdQboYM>rFV)GWr|#)R8QBV6fju}aQeGSjM8KhpPMi4n#94hocwqy! zh_^A;?zy!TlW%ghcTB}LpAr}w^jaxxyWO!agkYdNQ%w+k^lE^f(>u`dP>K!$Zk+Rm$NSgwcnp z`ZGSHN0G0>id9;J1S)vGQ7Z!fqS#~<=WZ-nD0k}2!hY>CX%-K&Y8Zi&8?7?k*zeLC z1WakFwuN$u_^jR2t>jS;yrWV4-qUl&^oDI`Tr;?0Q*VDRHYC<`2et=;+wc7R)L3$H zx7hHZzD-RxELeY4+p49lAKZ3&&DpERHigex{_mBB*ZRZA%q|P}{H{?oRQ8^}cgvYj z{K$s~Zuk6e$;Nz<#*G(x6g#nFL~T4&8?v#}OpC;L(rw0S?I4;|HTGNG*gc`H>W!iQnhlqACElsY4!o8gZWz>km;hoMPcHc_-SORP*v zdB*_-K$1)i{E+ZR0xLqENAy>NI}KXNLN+?MG|wV=)F$78r7XeL3YMoRqbg24L0P`Z z6CUnd-O((IJ|$(*rph4vj$Ey2V`8MyZz&g1uJJ_vMlWpfCm?s)l~2j)M=U3iErJ@n zw5)8^iUm3rW^|KWU~!ynv04>5v7+W$wVfIRH(c>=8vf4@X`@u z*p1@K&8IxRVVA`bY(l}!#KOH3B*BJH>yKMp>A6=sT%GETB%)4RR?!k@i0_ZDTiihc zEZExHR^xY2-3gm>{d%^qQ5R9s_CS9Gse@n;voDQocOfk?AQ zS-uzaqP83F)ulWjS2fB~>kB(;Xra0xT$f)j?m&PaPr_)0Z`q^Q)j&p&zOrjeS2j*j z6wR4GMd|Ci6K@I;l5Hg4$5>-4#xUw;tdj!45G)Z4@WY0n1ffRYV6gr(ehS{lAe$37 zZsjVR{t(qY%vcbB%v7Tn50u&b#25Wf)X)K*Q0xwUv7pav@qE^eW4v&A+UE`}sF#^0 zy$`MXx4xF1pf?_LgjWG^d8pm9<;q8wNVpgvmAL}A@>dh5HHTYcolOB>#OO23W#kv( zQPdi|S+_O*1fF&(yOnH+{Fl|~T)p(gS6KtZ(?-(h=uw!ERLw{zc0pA|3E~1V(Uy`Z zmoXns{?xfJ%HE$Swd+f8Em3fz9`Emg+lLp3R6gaZcViJUAE1m{cYL)q}GqVY>|sST5tY zW}giJ160ca#Tj5c79ALzR!0dR*#_Q74F=s&(|~Y4M@Vt>#-hm9)SAh{LBk-py-=k~ zLtjd8qo|AFz@T$@yUKaYZtNmmV~A-v>(eMiv~mgZex|}G&;Y1Y$5@9rbG9(mbDtjH zoTzDDwP#JMbHcZJ<<#1JJFsztg801FfHT|xFipto%B1mfXvvF6Jy%^q>IS?INtuv= z>Lf5O4jSySM0*bw?o6|NHWbtwv&YI4fn${#blq@q%EW6D>8WYc{8L47uxeq|Wj0>Zy%KUG7-i-m}YpPHIP8 z?!p~AR)tXACSY>+uDED=$>nPXyruvMp;bF}T7>g-*d%O?8deD)Wh#d zxX9b_o=XvbqWWBY>5Lz*3TT#}ORM`SIurqXJ*^vbnBts?OOH_s!eX-9mL+E<56g0Q zvV9o~09mgCV1_~!4xM9M z5GL~QuZQw&+is#rB$*E`-3-nn4eSY5Xm z>#o}zj>3p`B+p;ewk;UCbjkWFrX#84yG~7=wOehCEgoxbXlwB~s@#Fb4r}|=2UlG< zJG#0rNFdc<-zOUy>-(I6mb#O+C4!-N_erPso$@ay54uNSS65(eHe+roaJrd7h8lIb zM*opP%nz`;}&ey4TW~Nzkdv8iMnw!Hppl>GwKdBgRv-?LWms~+INxv0f0rY--1TshsrDc z(dIGK`Yxz3_?mjkil<`)RO#5ESDz^qR4cMqavZZ!7y$G`;`RmkzGE?~=1O z?A|lB@3DpJZ`#$cW96RR)9)Ley!TV5pVr>pJiV%|Z)~7>@r@@hduZcX7k_Hat>81+ zL_cF}uopSCKh$$=Y&eVof0MvJK8eObOu|9y9o1}+a?=2F2wCRU;20&_P=_aikN(T+ zssz5(+hzg}XPohOP;h0|<)or2Zu&2r*R#R;06vE3zgc`WkAMS|I14gBaELvjmWs>m z2?Rs+^9c&aQWy_c4a{*4Nj_{$$?!Hzt7>Y60%6H(T4wqbY;2>u-I$PW2yuBK-)E8G zB#3ov$5ot?CSX@M4dQxj!tmK@Lzo3fKXn0MDFlJXMNHdK6u5BD@J}>8+9GHBs^7pM7Am68xVYAU$&X-rV0zTDgX{Pg3`>|l{zZ-k7jf5b7wvEQ4lRCOU%`?>uj}Z*cF5pZr1uhL)WC`S%Tt@56gjoUKQH?+>tc zr9LSwTo8k};KF)QD63pi5V0({`t^dV48O-aSJ-B}#0Iu5P!LIf_Yizghmimek+k1c1mDKV(VffQgfvrcoZ1;v1+@bM=JpinD6r0IJ~ zEv0B1Y1XzBC*_(G@+{L!d0~~+lozIC()fUsn3(|>g!VAiHqTTdYbc|j&Ily)2r_Tm z;p>3PBv5}i>Xt_txd~}Gx@+i+gFkRMByN-8D=eY$k+SNbYxDHz?$vWonNbbSR;O-y zf5U=?i5m6vk)3Cy7ccg1)|M?^v{7s;^NqDc)7}2tgCEg+W68s5i`{M+ue)l4HyZVR zA}wAY+p=|2>%y4ZF!$}P6GLN^FeCH&PQe+cS9wOBakA|Y*||CnTFAfk8g3maYUqYN zo3mDi+9AuWT(2w_ZQxJR4Jasksfp{9%3=m%RLmgTM8NT}CUW7`bTz>;lyV$;w;=et zY%^7~&FzRC*^#UwVa5a-RB(ty%Zm&pwGu?53w_M3l`dZ7)NnXs#1R`UE+9)$t_|BD zO1Tx8HUvjAO~A9_P+2%Q7IuEOREgj+gkE_xA)yCIXd$-q(H!Z}s&>jJ?wa0o(sWC_ z#or$pY#JZ`-uBb12Nu~Ik}svIPal;b)2XwUzW#yhw~bBiYG@1v7gcO)So^+<5B}ik zm&o$_?8TQmuPnq)FEh1~aF9OvN8yw2Rt~;P-X5)NByFNL!T&f zuK;DGw7q|nvxiv9Ogr(r3EZX9vF(V4W@@R1hmE|<2rK~-T+HSptU)FPk&AkRKzs38 z{kvIx1)Uo$#sFSFVR|1$0oGqM9|ZWjiGCao=mcP1j|R~Bjm|Y~>J03VYxF)-4Qa-k zu)oWb%#_2fD}}sr=NN?BbuSk}#{{y@I@y;;0g$YTK{Ql!jZY{higqZn#I(~s8;&$l zL=sjpg^ZmztpG-JP^$|^W0a?l-A+eS#*v;V4;M?YAXe#EC@wvD>v+fJqq1=y|77=q zy224~hiQ#^7Kb?s=X_xCS2G`=vh#PMesl3 z8Jp4idf~JB7xARcXp_Aj9QilY&x@bftjZVFhs1wAOuwnZZ(g7=_9grq4|*XS=4!zR`dGzx@51{J9dp|CIQt&8Q-XkMFDV31tqSt;#at56JbntFt=8Y8 zPsjHkCLVe6uZTJEyzLt6-^3gFA1O#6d>Fsx@nz@<^qRQKc8%&1KSxSM>38M%zpB@Y z2W{6V_p7b>=a2f%0l!y{?jxM)li~@!j~n+s18c}4UQm>lf5Qy~YBjt>&j)|<81jt4 zd&-5YrxOng5;U77FPI?FgL1G&ME#9=CjJ_3;HFHxxQYlfxfYp$6ONfiwdivYM zzut7#?i*e@`;49EopJp~cguHj=U+r|I6Pa$n`)zYh@Xwt@{_zyP*om0G34{A1)r_z zqzXRs80-;Av*wF5`dyCK8<5Gg9`TNI{8{DC)%m=5S+#;ko5WA^uN}oBWB!QxDb<4S z9#lV)fAy&EYV#iwudBD?yH!dp`Ve78#_;rf&9eNP*sHY0fzic1@mbCAXV@b240xtn z`E$Ac{olmL@!29Ss;p>!4i^!KLB1&-R=)&$<@3ny#XdleHZo%v21fnZy z*j`uP;j1595$oR9IFR&q1_O?;TZ>+_D?0RXHFx0D&}i$3KZGBIthFXp4F{T>-lS_J zlG;@lPkLRAC@*iiWPRhJ@tq%$Ys`d2@^SG4n?;+Hdll;nyC3rXY0#DyX{alQy+Gqu z6={&X;x?wCZWQfv{1z)y-6x*HxQ#_xRsJpL2m0;fMVcl)B7UrGvz1$4&(8@w41Nom z`nI;#R&J{-(yB1-1)^Dhhr7vfMH=a&d74_q!$iXEa98>|%ZPUTUoGAr74hjZt#EA(xXMhps%DFr% zrCXFU*cAaG>hO-XDrDmm%z_|0bbQxfApzn<2P6YUKq>H7L#>?1=JKn!Rq_M73M|d(`WS&n>I-29}90*S#2LM#v$F%7zUew>pMolJw?E{?lcyu!4<9#5-yrAVV^w(&DV=M{f@k=UrMhdz2C|0nU0 z=I8KkH0Mw9^{A6baSf?XrsYd%B1beEWPEYlMPiO=kn=jNOkAjDn1u~2=) zR&K|h(P?J!0Wqq6(`L0V6|2gPq88P_{m zTa4>1D_)Q8v4d$Vj-vVbzAK9~v$#OG)NkOvD@8(`;rmvJ4}$h>+&7T_n||LiJd1_y zs|KOHuHt90D@Vi_Uk`g)e-D%LqH?dA#r4)IIsHAX;OQQI76gim@B0xo#J|Pf*J&19 zZ!z6hkhGBVLGLll<4!7$)5LyZC%)L1i-?-xXRgL?xAM5n#c|c*GUaDlGx%~!kw(1Q ziT5qH0AruFQU%kUK^1+Fw6I{;2M*BjqSy2RD<@A zw!mhEx7H-CY`O*W7lWmGini2d)!v73l4lO(w_=<6AE2E|zhyppVZCnBR)cmLXjd}L zr@STZB7SQZ6n|?}z9SZ?H-fewv~@hroZq9|CwlQdYZV25)4Hk2?-60;-$2_^q?z;Y z6FZgL<$LSnETBy?4ez1TVskHwQ$z~)z%%F1go)X)XuYiVU&Y#OP|J<*{dgWfw z&MS`d&HYT=#WXy#{#zqxitws4Nk03iHGC%oSK8e`a1iQQV6Laj{rR zYg4U-g|4qT@L8^#<-|W+Gp|_0xai>Z>Ly(v`GWO2psm9_viZLj*YF3ihG|{X8kYO1 z68AOG{DN=xtLLxU6y|&tzMJCbJJDJ``+(u1s8`{HL}7_h?pB zagF{gmnlD29{{aI5jqX;t9*<0yOm`lEHLy0lQiIyPY2EbwiXv^Gb&d@K~SQE{0kLF zfL5}mGt?oh8fFDtYrexXYKn3oC}Ry>!{*Z<;KN2Jy(AYxF{1CJggDorm{$QJAzNq` zQXGawWwXPZ^Ez5u>^@{!sEy$XN42ooM73igyw6dsTCG~OeIM(C{9my5>PU{N+wyN0 z_TC&IoBX~W)@BB`2o+|L$Ii8brkyfR=r8Y3XQpMkvVcbC;*QNONdsspH zJkz?tS2^!StdA+WhuTxT9?8*BmR-G=A>r*^WHOgzspZIzUAot|; z6wxYHXjfs}Ld7W#^0;c{b>$aYJLJ^axSpJ26J+LYzAwvk9_JC4Vg1sxEX%*8U(XEM zN%U?NZ^MR>zpWCNi}mV57{_axe_H|CF#XoP9oLZhzySVPSnlkg>+#w*D6fGpbdNQ~ zdl;Z&dzrSjNUK!-Cu8xHm|A=Kz=9GU#kv9v8li)&>r*V zRq-9WK>>&Wur^`rT?dKcy^iV8({E8hhD zI{o?M;;ZUcZ4qU^>qSuS#nPqsqUZm*{`~jz^C$H2Z=x>nmuwOB)*3s;PZh@F`M<6| ze=9#{Vf+-v%jbWN>G%a*KmSP{PtW-PKYwBTl{}v4`}q0k4yt0yH>x@Knc_ez-lH6nFQG*kmxQwdRRLEM3gn}}ke-ZM=$PUG+=5!ACgEAj zDCCng*uSP$not3xl^dmoskVobQE?WTi4z!LR`CbJ@*I}&0jr#8P2nq;key}H=@daY z<5-WBbw1rKQQCJ>h{oFf_G+uSdG4{6M%je&D>wM9j;7?Iq4tz;7CKShWoc?KRGi`! z^`TMNZjh1|M}TJj zi=!9)h)SSwdS#NBWw0MojV4<|j8ZAkOeUM?puBo8mJYf}$=Fze+?|i!v^vL|DdzJ^>Fy%9#%OMZwkFP)-L5>Ym@LM8uqrZNRG@oSr^%`qE_?XPGM^ZmkDjzqG#J=6S4lYVNru13&QBs+mpRx*DHf z%H=o3eXyIN$o}Y1t_0uz2Xf?SzIXrs$9Htj`#d+0vsno;E{$$Nc| zTn$|i#a{Rv?~z7br})Hu(4j;hxhl29DfJKci}pP@r(8GcVK)RbUB`M#1-1P zxXx#QXnMe=3Y>FsUvEAj?o)4u&ic$Cbe#BYL1$qPF4cA1RjlKhcs%sGxK5`>n7)|l zQD6(+(CYDCdzF`zyK&!U{rV~KOLYfy=-!RL26aiv_21I3^HaV~OX2#eM_YpDycHb= zX7CHxM$Dfn^(|e8;=~HNJ|4Q&qwCOLGF=~!=jZDqZ~OS`6aV)pXYqY89(FYG=S}E? zahyfDnet3?5rW**3Uj!JeEd|t5OoT4{h4)zB7m2ofEsCsoUhYd3tT#Sa|*PInt?`5 zLAIbzP>RYBjHP-YTaYPWP0=SSYIdS}-%Ls>+##tPkYYuZAyH%d=*p0gL?y)`DHmfB zTOq~zc%1cd4*Iy4umv+iR4xcQ1KCql-oT6^5&%YN(b7`F%<>MTs8f_`r!O zccab-BZ153b;qkkt^Csy*7HWC@1l+_XlB$r|NFJQU*a0zBT|LPc}cLI9#Wpy=LMa* zWXGCJeH8Q3S(ul?qF!$i!g6_rE8e}jG2Xi8Bre`E@B#5)t{1=qba zDM%{R&|IM{Y z^W2~OUV~?}Fbi`3E#Un}^5ds0ZwmWw0q;MepT%^!|0?nu#RV+S?od2Thvkb7j?aR= z7`~CHdPn|Mrein5t82sQ`UdEHlj7q3tJf;o1evdm9L1T5rBJ_^ic9K!qER&sd8+1W z#Rla}aUCcXL=;fDepZXPk=Rs;U;!W}=>0fb%LMd%;=sC_`iL`?Ds`F*!cRpza4`CuBB!uadrk>G1FAGWE|=cB)dQ>f<3(!;((= z0M{>!zd)t&B;%hwG6s5K{5~E}^bZ^vE*U?iUanssHXZ0m`8@e4q3PG(z;yT)_2;=< z*CC%J9a4EW(euB;_%=yLbdc!x=;QbC_36H!<@@sW^DpK13Dj?*=ghyz^uqNU<#_1Q zJ6Xrd@xRD7%JJ&8`RACfkB3oor^b8}70kB|zAyNxwc}g}{)H77Ni~fkNGausXcNU%pd+>vF z?mX{#TpgZO`8=4%NA&Bb_&WM{(wXx5LY_PE3+Dem9#8!I7W1tz{vsYv^!FcGAn(BA zU2;75`S1}V=!Nl(ay;n!n4h>l_INb^d-d1Y<1SPoX+^~Fld$Y5I*4w;*u%56l~!zA z13pxx5GgNgeFRZtzdjBd0y`E10611`P1ivJz(z3Oj1O>NLMACxbpjcN&GxZMLzUI- zk0jc9Ngn$g+3F6eVg{@(;S)ntcfddbp$*a)@v|t2+K|903I;i{Tato8!EWC7jO29_ zn1nOq;)(g)E-IQWeeLy4jlSwykEtcHHWUt|EH!nP=@8%BxU%q;mg2tOIzCk6sB+a^ zZmD+p5?{LVs{8J}>gs#_pS=ExYp?t8RX5#s)P9GJ_NI7Ndq1r=WJ!GqeEu5vS#}IR zDT4S7eQpkz0PpTfJXtCUMWP|AVg8)aGt+($mxI-6$sB#z5p>A72^rm zjv^~F1M@szKs-lUBJsS#o-@=Y+9&~jW(>Wo9PWsn{vNRB%B!q?g5+d;lmS{@IthqF z{WGjr3xc?-R3!i9#FKE~=t=m=F_Kw5r*tm*j++ayo@F$Ap1O#ZdrQuVv?JH@UZgph zU*no$L9R}e`pGlqTE((Pnx902AlX=N&%hasRfkdYk^7}l-Scv+VnP+Wf$lhjoK%zI zqr_r#T%p>jRj7bYLF{n%iC1NB@${%R&mFq==y$Iu92aM&r*|Lsrnl)QM3x2e{a}aV zjJR640w)9O3Er2A*&zLWjLfOzR|}+Cw^X+;pa0Q zzhIe+@md7$wO4r*@f@}CyYl)pUOkh}VH2-|`n}@yFW~Fb_{UhM7p{LXU!UkhM;6K_ z!u8v5&NJ)JzlWc{hp!)nj5=TC_w~{HLa#Hu4bN|ePZz#h-A7v(KPArBpZ{`xe)@&R zGEJ}@IIJv&UxJdq(3PfBf_XYQ;k6SO5(;kUsn|AD?Bi@U7xgV&kj#y+L=!Vhk~4$I zkAkpjA{mBCHB`f>B{k!fwR6Yu&A2T?&A#ekCpzl8VBputLMSyzpp{inmf~whv%~S( zpBbM*QHn~F+2xOR_V#g`zAgr6)}YIm%@~kd)de8WBxK#Z z=D;RK4$j}HmJ&2T7a`)JmrJQBNIsaL-z_Zn3Y1WBSE7Q-&XM$B^KfYe6{9)aIMq_9 zqOw)DM%7(~t>E_uzP@@{TVtrvJ5sx`W7TPaz>i#^p?IjfHQZcR*RZ~C)fUlT5Pg_` zo@cF}Z5fktC-zO?sCmPC!fXF4g^Hjxr1gH&*)~o}YeTUBs!}fd2vN+*!Nu<#R8eUx znH$jOZBcTj7o~PFJ29HK203pDs@}rq-eG(*%xNkaKjzKi@4&oS<-9?%TI9S@bz~=@ zW3&kD`~I0pYTJUE)MF;0mODJ5wscn+X{HV;Mmb|eA@VB4OIgvVzzcuttjQlCqaiZ} z)I?SlsISO)a?N0*S%(Y;P#N{n%Ku-?pm^|-Ef@Elciv_1bpp@TCs3=KnK|vW|N5sU zPwvM$+Natu&tDzc(jq#)PfPc80 z5E)ydh4}gv%GHnr8|8S&fxWsMv-5s0jGq!q)cq_UE@66M{JA`y?3`kZ_=NCwQlR)0b94dWc*q=UcEy(=SWA%cto7>zI5M*k625_*X!f2#dw<> zPrg^!#@}MwxL;WS$^Gt@G3w$4k+##D%(`QZRKc%L9+9bFz(QDb=s^nnbRFkl)FJ$k zO>^bNG|J)4Ds>cz5Ym_voCZo}9U7JbV3%u^rIlO5(qiLb7oas$OC;H=*if;n+I}AsCVc!%Msu zl);Tg4AioE#=_}lxehr^9aJHHtb;QBV+5@ni#1`IMlm*o6V0qq3bRZtWeK3*xW%4z zd#Hbvk{N`nBSWDjf`1irucY%^R;{5_clSS@sUtr2awJ~S#nQ&PL!Uk2)M!^7V?<}B zr|er64qYC4vfGc^D<z`Rotu z&{5;}i+v{?zh5ZFjpy@&*v;~@^!jw)J<8$yD|my_>$9CHq~E%9y!0(R$G(Na_$lrC z`ul#1->WcwN@rS?6bQJf8FT@gIVn zxo6c&CF4!F{-L9;4`3kAR~qxhz6-uS&__(C>+jP($nx_ZidSII(Re4G=N|RnFu&I> zBs+X-VLbH9KK*@Rk<5>W-FuHdzqd0Tzrb~B^XKyTdHpghuMhn~bd{GOkO_uz+%0Okx5bH1FPPt_; zm$L!#ilf2+r`w>~lMjtTQR9Q^xMizP)JYgYQR?-A>Zygs5*jy_&`_D5^KgLW;cAy? z8DT=P2o#P$LRh8>70IZzH~Mvz5uP4)QkTr@LV*nDeBq2?QQqC#4b-X3^p^>s!t4t8 zJm;Jf?3#Ne;_gGGxN>KFtZj5v#P5x&)76QxnuewaHl#MZ*%=TXkHJ%aOKYn2%GTD= zk+{3B)gP%phBvpoXWpPy8>`jIRL<*h1QEwU_O#BdtPh1zj$;=EaOmhEdoQDB4i51M z2E7-aQNN}lS77{?R8Jv}^x{AB?M>p6D;qaTuJredfsrz2e6;0gwk&U*yQRPt5oq`n# zd$x=)%2-e?R41BMYhx5wpYd@@QwXj)So7eYuD2M}&NU_p`9P8LULC?e@0W*Nfv^>~ zZ_>nHkKDMobuwIQM@w{Jv5Z|+AJ}$s$C6Q5GW08#wQb)q?uiU_ii=Vo+p(=VRO@%! zT{g>=j~j&z?N0X(t+?{^xvv+hu8N&oueH>Vwgi#^pM~T~9CJ>Dc!)9&+yi?E}z9Pl!3?K^qPm`uI1I|M3l`--_`@k`wy) zKeC?MFJ@TpTvZsarnD`POZ$O5y9tu!9-`+T1EKDC}+s=u#+lr{S53_KPm#oA+vYL9XKP3K~qJuQP9+c zqNxBQ4x(Q=ETwd6wxeYbuE`#JNJvYm@i3K?g?-9KO#%+vtSK7cmC*zAOU~mC)yq-~ zF_q!cR(XNHqU41uLpE}cZl>IYQ4zuSSM27ZHB%xLGI&!^L(}- z4&Dyi=M*Iy#;&GP4-ww7S*wGD7MY@eeNjbEb2UmB)AkytgfyW5)@lShK@&S241G~4I-x(NDn|Bg$+)yIzEQzbIQx^c$aDZ4z*_|kf# z$E?@i1U^ZC93l}}Cr606^ri{;pPm*w1Ro0Pa*qf5VR8!*x2REr17X5!d6UdJw^Cug zj!r6X3h`8M!-m8^!#VL;-9!7#du5yYg!I~;JI^%#yE6?;DXzg~wAbNh{IJfgW7pIY z<$M2!HHG%FnIwYm(4K*%J30nL1l8l6?HQU}C|x!G%pBCn z%7{|2pa1~;JX9}$0zvP6H3KeTiFP&k`yKVBmdaWvxN479JwHbk?>kB+7GWLm?~u7hUggKm+d}2GcbPX?Mz8ExF_81NhRey|ftZ*?1qVpr z!PIPDdJ^Jz1Rs(R6mZEEr*Sq}Q4TKxj-eb9O459ilqQE;c?aZ&w-v5{isb(Xl0-YP z#D4Gdu=K=&Tm9SoRCxc+RGfFT059$xdG6fI=T1l((!(sjCBEu-`JIKm|C!DCg8bIU z6Ml;@%`Vpe1^m_&# zEuSCPe@?d}ZfCpTKw-_P4Z0oiOSU7vO!WMH{5;Z*_}u*X{6Xlq`?Sq$M|?%O0e9f> zY)4#A*N46E0^1SA>x&n4J7SdW2#hCx7_NT>`@;gTbpE1bqhzzn#yf-t8BgYVrJfsS zPs;cREY{v}(r)ZYNhfpd^7}M3kQhs&?8QvGtK2NOsMUC;uMcv9NBi4%V=pGsrkTeH~z*T&>$Vj6*a@EI--9_end4aEPY( z{JIqTv`c8+h)a}5v7TD_`W~Er%hew+y;E_5{s*RG9}3+MK-muS<3Xf&J zl+#It&Q>Jg@|(Z|0A48sK^gVhe$X-3q(Dd^N^^?eA`3h2f0 zT1ekl|I7R2(}nSBx4y65;C*$7==q-`z6Oj0@1Mi-O;_-;b$nkg{ ztsDEwh>VKD^Slnf1U=`pvJ-TShuv7fV4y`SZ1gnp9cHSNIS+4@lGsdVG82aAZ%WO^ z!=2Crt@sdt9zgSWVCkHQRy$Ef3W&p-uH(T3-+-bZ^J%# zRp;ju%%8pdUN$`cCdtn};?F*vpY!7wm4naRt_!=DMr4|ayeE#7Cq);qfK(^q8(^V4pmIbr{j$kF{xLcmAUMBj6kRZ%XJZ z^XC#h|7RFAjpX;$#?PYnZOD9!-YfqG=q<=W2K`*3cOLu((|?KUzpj3d=qaMdKJzHk z;T6^@)b9{|8PQXp{yx*6#`te)(?rMOQ_b;fUt#+H(sLrG6?Eov`oLR6R~k@XYCzm(F6|8jiiTcvd3zof_Bko=d|A^uBx>bE>TkIZzf zj`p>-kTe)`v?CAAtMjNqeT=`mlfPS;pUOYP-@Sz2eMWvK5F5aoH+=RX{048S<d_@w^@-J?@a}k;fw^ zxiCKM{1fx%RlL_t{JvAl&3FS^sU!IZ_&fYk`#AG_3RR5gyOsIHI?tbnv7j+ur+|HB zzTQTB#Z?Ufc|8$fdgnLp2OX=;(2sQ-)uzM<(_{A__bdNb&?lL%Q(~Iwsk^|}Jl3W5 zytatOE5BxX{J_gP{VBX3(Vt;@`oJGB4?|e5BkF5-zuioAe;mI8eVpku50bv}-tRHJ z8uTTw4-52$?=l_z{OCIK^v*}WQyjlmrFoFoiG5ejgTVO3yq_gK^#w!;abE@WJ>1wKIzsMj#R7YjSnJ9FOv{dLee?xZaiqfC!|k;daG)CYM!7Z>K?)+ay*kJU{) z4~t<}u;jR&=HW2to3&N^OfN7!ea)MAZ<2>9?}u}k>UO-${E+nL!9Ph~>3_C_{;MLr zq2XsG^j{b0o%O#cq5q;tj}77pi}!t{NKZLAK9+wKcGMd1C!(!9v#`49eSZh~T1khz zC5|qHk2{}#5%k|OA65zjzd^&D4}tzB=HX3|lzH~7AizG9n{ z;d1@Z`^xn;xnI7oq| z#}oaGW5&~UU?Z6JoPZA9WIFR0I$i%!(9hE8h3kV(HiGGFNuMgvaebyUf3z+b{PaAv zSSLG4$C=K>c+Kom2cX9!{S2m`r_+at&bI9Lv2G)#y*mA~Ob3^=ACWC zNp!7CxdC=ofev|Yg1yP~>vVb_#zPL9zEz;}I*ek!d{KowH_=I&u5%q$8(oL!&x8KZ z3Fvg4hjse(^W#aLn{a;M>s(txhdehus?$G8bdu)=2gz;Iw~3B*_!7S_)~6xD^#9Q5 zZ!w+5e~anx{qua?z;u%5bcTqSU{f;vi%h5ax|`<(HYL+Pz;wuS!S%FS^jp(Yf_XAjIOeeVk z`DS{8=vvosiF`nvR5{+Lb*)oMHBhgxP{;yLqXhs;oxvef8%6f^=9xKt5-bURMjsRa7fA)RWXr&8%~9&7vk#wvrnXRH6iO z#zXxTYEk(Bg zm@SQnF3NaQ;pjq3-IV?KoR8VVbnIv1nj?|N9i`S%mi%2k4y~` zdMWEKz-ZU%dam+bgBA=~4e@2fQ%?A}sPxVZOS#HRs*sCsR`j&hZE@ONB3_Yh_isVl z+hjZy$N&E@?(@duUSC{WpIX|9viVCoJ74z23sn9WYpiJVn0_eN{BtF`hW8ZNLfBK! zVG0W4H5F@ks~rDJxp(As?g3rePM*%c%#VlvE@BSI@z3M*g6pWnV3Il7!b?cDOy;-c z4}*^X!Qb>CY{G@`@zXae@|WhNJ&j$dUCDOj6smN~U!6(TqW-&^`FB&w?Z^Dii{E{L zo&jfb`jtz)gyqj7?5_`Ff5pv{>s>aZ*?qHoN1`8K`ilMG68cKN#e4BtbZ z{}1SE)Hgt%$X}lSU6KAK=v(;t`8sCL=b5+pS3n;@ezClMx!Ie4e;#(V;=yLw&+=+9 zy)WdIpXHUL(|D#sUImo9CGSvcm*!&eg_5gV3v;3RAphxne@~I8I1%ADL*UT|wF>ZJ z<&9V$=E)UxOy7(;$)8jILiCwGf=4TmUFN{}m8iBXdAIVn|5?I2Y2)T_@Au;ls`{C= zkU1DH>3a%vW$zYfodO+URyp2i9tTRSNLPQ4`%Wmx6Qip!y(Qlx{>EnpvIQYY9df-$ z`U|*@q_6bL_mcO$yKrB#=k0gquMb|w&0Y;?vf}kgrvHF>y-w%#6Gh$d1C4Y8)4}WS zvu>dEy@7eUPPvwOI+@>^{~x{weRme0<<}{9@OQNKp;fUq@RsVI_$;!Bok z{1rFsRnUVXV+S%eQ%|L(D-h`7vH}&H!CAxAr9*@hLI#n9zXEa+F8Mp>a(cbxiO?2X zvojQQIfEgQaD_rHXCSD)Xbpz^|8})^l0JrtMjvCb(@cW7ops(R*QD^HM~o`GJ~#`FpVooQ<{@A%Hcx$p(<8RB`m$W z$U605ol{uz(vBp%2PX`+3$G^gPtqZyqp&!!kFhE*@@#MdtwT*Gu z3!WWvZOieXn^`{MY6p0{0$c9F;@%r2e^v$P47=4664<`|DtM_(IJvLhQjVdIf<9{y`B!zO4pp0Cg#IDBbEdAT5di z5h#)j>;&q!duXOJWjwc3n!EK62RCmf8KwUooZqhR_k-e(0y$RZ)A;%du8+^Sen3Hw z6iUFM>&t)m`tqXournC3++95f%w zHs}FW*@j>QJ@;*Me-vNNf5BF+Rf^w$M7#)#9m+Gn@z(;G%^g8ewS=Cunijc}vZo7; zTpd-gPZ4Ovbf6R&N`6q?0wXudu1NvkJTF9gxqa`2s>vK_Y>&0|t=won+pKD83o6Tv zb&c;%xt8}-yH9r zUj`rlt$26b8@y=A;i(EQ{+{lQat#0Q-iG6EUBY)KP@&lh*rPd%es34s{<8mBwua&G zHGsoskejcdGAiU@8NqU>chx-CxtGv)gN-ARu2e&NvaY;Ztvy@pu>1R#wYDv6jW@?s z*T532fqJn+yhwNx^KMav-D))N&ePhkfc_NI&ro0qf_}zpOwTV9Pbs%z{2raYhv{^k zmw5b{*f%u(Ob7^}B=Z-G$FQDysQ*e6+u4wm=>NtijG0a-F_e^dAI?;xP+`u%mBce< z^rM|Mxg8eZE|C)Aw&6n@A6j5yQ_cA}lJzq-pn_-I_N>*3W`zBj78JM3s+CRnd!~X? zXq8M5#ieF7cetIyMUy$lDZ>|K5Fe-1li$Owr=JmFJE*bk?UC8 z}01NEG~cf=KPN8&vp_uesmt|u6X&=~cuT*tnQG1>vo zdCP(^YGJeF(CLi^;XG{h2z}XzT2vc1JCIC}2k?2(ifmmd1UXe}=j{TW&sUch^S!1L z)#w~I2p6NNzuHAD6R4!6elNvz1o?Kym)MY|Z zCawd5_)qt23A$JT7}a=*c`hpR^a}#O_#`}8;%;n!0^oJu} z-^N~%gcz~B(+-W49m|TN2ONQD+^?KHtjmObeq>GBKWb%qe{@wT7xMc;X?^{W!yk_Z zoM(>b!+vihD^(V1wN(RR7SF?s(wtU>bJ!E?cY+mYc;flsB&e9s{ll6z__%WnNOQ(>j z^x{81xWBg0KafsVU;Bsuj&an%`WzbqX6zcgzdA0Tl8Wu9W?YHN zY6_b@D$`P$O<5-JcYCjPZLh3u$JrdmR5s^iwTiP@?HT}>V>l~nc*`>|Dp9EZP4h@I zrL;_5G61N1*JA}p*dd$S6&PFAELp&q)UjE#R`^2NwFL~TSe;u>?Y1~h3y14jV@ttta>2U3epD+*8zZ!_1Z&raG@s+uj2`^MVO;{*s|Awh?C-fwgJ_a69LN8g6Ap zp%ubT-O3-j86nTAPWPO;4mpglAb>H(sBNcUXZW#xyvuS9PbdY^ec zBI)8iJdrLc+1*5P&f6-@k)!G)LYybHK!7T*eniO;sWcCjfnl<0#C)Ul#RTXC7{h(I zu!IXs8j+l>T{v4-uf>JKxNuljFT))-@(b#1Xq}(L4EN-R3N+o$D###?dVnY!qZYAK zHI1%i6mrec#qCSDc;+F{&}D~lbp6f5c89RzP1^*c)4Or|zOyg5?AjZtYcKZ3vPxsuow;UY^4zgl=f{DbZRh2ZR#86VlFk=i@8#j3vb&w*XPF!Wv+P~BA7nu5ejFRZV&PwW3=moT9$!7n)UZMTt(>& zCDC6LKW+#b9n@Kf$bw_kz}n-H1Wy;;M~BdnK@S@bIqMDq{Mz>U_>(zddL$oFNt6_IvbZ z@#CQ(m)ZP`(UP%0pbz2u@qG4e{{1%#-{s#6KbF=meoSj;pWyFx%5}V#Y2|e6PfvoQ zqfjeLAv}&7URVHbAZ&ELN!q}c%bJD#WQgiTr(5KLHjN|oDQDQ6nh z9K#MoVU_gW^#`dZgTF`IWDTpB6U>R_wVk>{~Ue?a08n5a_#XV^LHY4f4IW6(M#O zqbr_DbD&0LG_fTE@lR!dQ~ZSEo{`5&!5)l)-cY}&q)r%Tl$TOVghn;#3Gb{xOI~I= zy-3U1efbj<}f~ja3fz<};mVz|5tTUP@ISq=D zA(c0;{A%M+`1;f{&rE&&>oec@#?0|w4=hv%7W<#q{%D`S z(f)k(>odw(7E?4pEw0 zD@+to{2fu?q-h#l%{<21hY+$hG9;IIV)dxWmHeqb#Ed$0#;PT` ze&0K{MpvD)XMZ{p7~Fl^fwh-yu9ti+@kU>LX`1ePazEZH>_8`gAHXD zbTlKlD9@nBVEt3g{0B88@Gi-ndSKU{U+p<~)1H?*$Haf`e5G?K#%pZlBhm$8Q_g`B zk0R6_Z~Aep#U_fJx)eDfS`Cvd13k+|F+L z2RN|V$}Z%3ScBT85;$W^BDO&y@ToVDfT#?2){KhH<8%DGR;_Gie(_OM09^~YpJXHC zk9q)fjCphOBSxvR{6{foZCMd!aS16IWM2MD_Fyhi?iiM31UgcBg)q+(>?YF#&(#de z8qmDC+pJ?lkJM@oN3HhA(3r(G zy#1r2qju3g%HOk&_cWh)&k((5SbI-vrEPolJ)K9JzG~Z~y{CX=)+V9>oRO%bQ2e6p+IV7Si!ZJnO^SHmu0tVuQdA6?ZY<9sqbsG4ey{m4p<>c z6;<$`Bzu|jpCso?Xcu4T@}*PT!LK9>Z%>}Wub7~$JkNf>zJ_@90PJ40N9%aeJw}1) zR!(LNWCryYrfv3v51(=4Glh~PSY}`A#M#bF{|`wUTv-r};zvM5Y2iAdWu#Hle7dSH z%|ox7o?1Jk=|yfVNn}IpIogz}?SN)g>md%Pm1r|mn*mw%LSO|EP(_|7h=3Qq;Vr0T zH7Yx;??*hsmyUoLA@ckkVjVSZB-)-(~(=ExC3g&TExs|^1ZS4H48Rur#Zb|GY?MJA9g0c`a1!@4!oVLmA^oH@eNXkjMW^FVF zsT_y}hAvbQK4}?*n6GUZgG2vhvKfuA!|q%f?#=Yo63J?R8alZ_w3|lO`>Ka#2B&+o z#WefjKr%Cc?HTV|6&Uz#1bnxKJ+)OP`ig73w~Vl2Jv0D`e0 zlaQ4|WBrKW$G$eHYhc%V4Ud-Y`fr)^E1&ysFERb=@o(mSy;jf=VYnYd9$Vtgg7Bs8 z-29r)mjK@SqWBre(sv6VC)riF2EA`YpKFB9$_)B5!N6?dB%)$N$eaNDMAKet`!%zs zUv9c67!64ixE~{2p>oO1q0pl*^gMwgOeKp0!RJlm5!Is{YkH3e%SMyO+lT+y$)n~p z6kCi`%}81p&-@E}CCKk&Mqu{r>5kC0)q@*S2~Soro^JE(nHd{OmwH?QnSDGpH5#;9 z686N%gxltD2Jp)G&4tc$(yc4MhNt$fmEXT|9{(Mom7j~p#4jPg=#tRfh@88%_ExRp zX9!H<5Gljh4b(xHV)a$^JP_UB2xXlVO_s{Q_~hB=aLU^XOW(BF8}TR8Yu4@9r3o{d zH0Wd~YJI}S$4|&oO_ECm&N@Fg??H;GFoThdf85kJ#j-j6%Lz`xPe{-qoi)Y=8#s33)PS91E<~k%I_VG16J)u{7 zI#DO(?w~gt_Qu@2r}$=ifUc*>*xmF5Z~WvF@EqxoEA9(tPI*FD&%4qiUi)R@dHl7| zRb;B0&w~^B<(I`hL|4Lpt*q7lvNYMazB!0_g03f>0o^G}Ivm&Np3?p@@)8@ZZxPR- z=d2t@J>N^jhvckq&F2r(Q`oY={|b-bsYI=hup7|tPw024_I)dlYv0G(+TWGOS%Tl$ z#`p6(Q00bbC5V6bNjbW<@&oN@D?eZ_cE5K}yhNJh@BK*U2JNp1+yLHVA3X){u@Co~ zR(>V+i$4C0r-UEky5pk`|zFAgWlma?}hLBLGfe{ zJnNLVjDcTC?9HqoWwE-$v>!lna2SLuv6p!vGx8%|cn%)MAa|2f9#*L3ZL{VyM}aw2 z3DTwpA0x_H!`0FV;r7|Fk-6Jfjqu-MM^x~GymsGK)QP(V>yh637FLo{f)&;-c>Rr) zrdU%QNMZp2$LJtNYt$pU+`*HTQi&jj1kUixVRd$~TG-QD0{Q2r1ra@MR~GF8Tp z5+D(2rKM4qJB9kgsXA&tE{?uW9Ua zGz~}eFlQcfG_6MT!AG|n0>jL^*RmWGwTO*Ci{G4YI9FO_S7-XdUhkr zOBqPdN#tRHJ-8h*2-kx?;wQ0il#`OTajb>&Xxp!4k@Cw_e~>5zvJr<@^!Py@2AdA# z(KIXFic4{liJX*z%s|;*!ObBhzgi=MJWqOVTGK4E29{pE)fI{i&u$u@+ZxO^suP)y z1cL!Nl<-)kjOB+#14Y2GM= zR-3tdiKipO>d9ylqJeh2gm#R4_)zwm#cJ1K+jScAL~Y@O;(FLDc>_^rimaP()a4Y{ zLxREP3Xrjzo1jkC3&VC`Jh4Gw4}s*Ui8TffES5BEhI+ZbxM^l|zEBzL-7+`1{?oEG z8urJ$$z)F`mS8_CmF?krvNBr9_vGa0L~dwy_-Rkrmx8yZeqm)(Un-g`@U^ICZ^HPc zWUKWN)~oyQ5u*DP`*-LeU&314E>QkVRwF{El?Yk|bsKb8Uq-HZ8qKs4;n{)N$W(1h z+DKTcElEc`C5E0lUIbZ3PV=t2r@H`a02DCux=riWZ4$4e&vong-kcK4`2OoKBT3Q? z2@I)K3j-vPs0S%n zA(cK@0_sGFq3s*ghQ;_Fy3ZY<`yHUCgTR9r72r6CH=#{hIhPff73h$M1mXC9@-_!* zwMxtgo4^~<_7mQQTCAu#No`l0Y}4+wpbc)U<3H;@?|fFGe%6Oi_S3H%WI4vr_F1(3 zl=suGoWt@A_gWu88~0v3RG_vcAyPb)DvwhPonJ}v^{>Z&9LGSKFfBa?a0dSj%ygN#EMb) zCfmZt?!rPWkX}f?;2%p9{??xNO3*&6UZ`119o^?vU zb68SPQ702NiIs~>H-kPK*f8#fU1FZ;;a?{kS6b8WO4U{a0y;cj?K$4kj{6D?J0y1P zdVjSQ=Xn<6NEO)farxaB0xOTpl&i6AcTsOxCr?xeck#r6lpC9;-x)kg2rVjgK^3A5 zP)2Zuf<_gdt+zti2$6U;A*(aEJXvi|%Y5sd=8O|cLOUXJ7j=aDR47R{I4{rHQz1uj z14(<;8E}f`C<-?yO&78_QhG;0jU$J)nuE_D=_2_))|^9q$HCEQjdggUB9#q?YZx`d zUsKSIpFtJno--q=Oo^x>bpox-y&v7Y=MM&pd7sYZ@v!S<>)c|GN8evDx?F~V!9aX; zXT%-qT<`Zd?HAqf)`O|tlF6>uyA>J44EDud^EkOZ0`9d?aCvg&pSdtHr4w_-gHrP>W1C3BN=_Z9B~YlXWsbF_Xi@; zN-AnERt78vm)jf;#zvoJPe`4AT=#%zw>Ua>_jvk^!PV@nbk&__fBL?s^{X~o z^!pA=zQ8ZmBicvkM_z^JLGP15OSVchKGm8!3~z3LBeq)sqEaCMBkr=v9)Q7COYYt> za>I}jnWMSM7fE%-F_Nfn1|~{iZmL%gAUCwrCa@8MvalA^NCsVT9OFtw6Ol!_6?G7n4w(KM1VDKZRi9Lst=A>ZW{9sX+x?FB*qVJ zw=Ut4XV%B|F{h&Zy*M(FPer1xpj9!OpcP$lUSj@l&id>(zyILq-3EupY>b9eZ`-l{ zoZR|xy@i>*0lnl~y}2*o%PMZgQHXxBYPBE6U_N>GeNPWKo$@c1uHX0eJr}+Ma*qt2 zu^M)wVT>ZY5WJeDMdJ#_Dla&y#z1`mjBeY<+gmYi8H#~Fw1p9K0KQZKJ%kb3*n}!t zQF_k=m<0pn2B^ zc-EG7P!_gzC!z{*P>sQ+4y8Eb^}wJDb10%5Fw~N^)?wb|#VaRG^%|;I>T{spY>HW| zj$|O*xi{>OSSaPj++hcuex-MCz$?f8Re--jfc?~yi?dPJbLt*E$_-}RTsP9(rhLXMITYKL9Yp>mS93Kn zn&nEBSA1=zU1|W(t7cSbjZMx&21ZtIB>INEeDx;Wpl%^>;0VEh3RD}`O`L`}F=(IU zIj|Pwm?d#o)Z84T>x0oy?O04T^J9Vd=)==xIAlJ`k>^@-!};m{dfF9CSoP^#Phf}H zvTafFl(!6(rlPW#%mkBSdD!UGz3~!BciutIaJF7B`z4(#IFJ~gv%BG22t+;Sg+ffZ zZZ_l(1zqvfzeh6Dflz#AGV2TH6jQ8_i0DiD!fIDx&OPldPY)0Il9^a`D%~@sc!CCJ zDtM+bIx-C&C9e#k9@j@vFXT5uD?qcZ9|yJu(F1Y7v~|9*$+W-PG6^u)S1|vr8jO9- za!p;0DRop^8M6IpyEv~I5CyPK_zJ1o}iUJT2=j?7n=V zikv6XB-7qOyb&rhPzjJ*X*UMbM6F=k+wOc^v_xjJ zjl_mMn|sG=Tcv>idB0zhLcw^7O+6p#5d%-LtKX}5V$M)l-}zlABB6qy-sW?$tlMwZ ziGf8Wo(lc+cZF4J|D?FRfdKQml$ZRGc#8I7J?8Cs@pIsd61+S^z`srkzZF_uTEQ9@ z1maHHo_lNE`BBRi>=uBLW$cjcO$~yegaJCSIK~K67mmfhCzZEv$w9i8jP0$UOozcR>Ct4zhw+`NJmwp?#j4$6qOY@Z z#%qN^02>j`CwUc`No3^bJJ}>w-a}01$d2&3kXD7)ydsxyb7DkI18xKtC6upPF6Gaq zya~*Tl9IGKo0_`>YZSJET0M&ozgCu0bNisHv7SQofWLP4mQA8MdKLTEjT<9B|4wfB z$Fh8W&IW4$`XlU*HoHk9c^#dcqvrD?Pt+#+jpVwS=;IGtUXwB=T@8BAxlF^yGZj- zT_md;aputOy9z~~H&SN@S;qmT%VADEYcQw7yhGc^0h-NW&DAo=8<(q-2?#aVBu@jO z5VT0Y9d-xFw1t-EMM`rMDo4T)t6shy=Q#y}U(@GmE{-&Zl~ynVp?aj5a6Obx6-UQr zX!TZ=X75OI00=bNS=HzsP{G_tQ&F00N19t)4|#)$4Dl-tL4zo6hwP1%vg*}!d`a&m zI5Gi7(9&OYIUWt-@q(#qI=Y_c5hwAm?)Uhku5;iQPM6DmGO zCZ+1&|8*sWPe66G^vQay8i%$$7~wr8-q8-a-??eK6Y%w&9=Fr$^aJQ1dsF^cs#tCG z&)0kU4WtYDocUxVncA06tQqtzn)C)qa%byX(#6MuJ(2n!U2eC@!2JC`i;YcJqM|ER zkW2<~`-*hOx&`Zf#m>(L(u#YVMKZVprJyGrD@79Nx$^L$+w!itMk-S9Pe(?wjg2l* zXXvfn#PV;E)J8xb~5)4=1wpaMP&~g(kXGXA>XxY)*-gIslHJz&PMK24| z=G|$34H%W@mS^XecJe)jZw4lq8=9;N)5P-3>J8helO3I+mB}^e#G3mm>gf=^;GG!% z-mePWJ}1CFH*rMW7CzSOKcZi*Z0mQEbg?`mOyFRfyu5*0mN(O$0j z_EPgAaW=AM=Tdrb86*B>x__n2zVJEkzA$q3!w&@ReABQ!7-Lz7-D@@)2i})XS;I*- z9D$Tqyt&ti`LH=ZQ+3y`y)E#;<1bwroN$HAMwUA08+AtPV&}T{U6ZIyi)!}~6zB64i`eLBF!Lta$4PaOR7E-%~7=WFWG5SD2+O;2U<0 zZy=#RWW26Ht?AOdn3{8tY?6W+pz(HLyfavFQcZ%9I-%4QH++BYlp8B90Z*)Wc4>y~ zXKz^F`S96OyXM&0jO8Mom-lZkq}Y*8eSR~$vGZ-wwpi(Wmqoq4^19{He#I{?fEg&Sb_s;NcDFi6(ufJWx3pft7W#-%8w{q8!RIo{uTv^}W(nn79Z zWu=y0_FxBVC$+|&YAe}GBa=i4nO1L-4trft>85+3f$$IjO0BF)Fvd4~6+}VcZxUX9 zpb-SMi0sBKy@5vp3@FQ1IZs+J1Wtt4WOBq>x;iZFWnAKb`P=WM?T#A~e|R4-}48ioKG9V{sowP<+` zc3adbQ}sAXRw=5ir>5F)5(ZHWa13@F$`o`ZHIAPNQy~3f9aym13t3I|5!k`)Ay%vh zmLBV65a2ZY;odjDF$?}G8WY9@d4~1I1i4?iKFXeWTPv_JP+^OKk?yFJi(8)NMBVCVCeP~W=2xx@89>HY4z-Z+dD(w^bV-!V0uIX^bKP#L!Q6%%U= zEKJ60gMsOJvY#fgasN#G0BW$^BDB&({ir~c(RN{{o0lsuA+EcomMzbzrcrF&Rbpjz zY)-XyjrRlV;ufdE(PnQ|jY3x+skWj8B8n(v9ek#+eg>_ucrt}tE?gtw5FALM~nuqu8>kH(a;xgv_N zvJW#4KuiN4W7*EXKRGv$(RV(tlS0{riSxWYqx#Nw^}{{8clQkISy4aUQ@MVl0_(2T zAilMyM;Gk>!05LZ6Rf8PHct7pv2*1|>hLo5=;Gr)8ojp`rNc=5-b+?T>{cKI2^;b! z@m$oOufWgTN|HR9(gr35#hF7J%$AdaKM4~?3|N1qnS+V01avcs(y4Ag1i}baOqq^Q zA@Lj+O>-zDPDnTMGZSTyl_vq@K%Z1%UMi2$Es=6^NT^5({xPvu9!R^)EMX8A4GCse z(gVHK_u{|Ague3?{Y30`{3jkX_4F2X?Y6E|?lC>RG`qBbe`gOyCH%tJL}YPxaRL9p zS9HL4m-RP^55X6+4u0r20595#;+MA0#D{trxQSA2UM8!4$Z1iTSMF$rYibg?!}pMM zc7Zk^aKiW3)LBCHUs-96A8pq)hEkUa=c+D1jarb^Ltvl#_yzSUZQpxg{}WZd?}f4N z1&^rC=rMg$Ir8Ylj$c2fdFyj>vwTFg<&QPZN0u!%Gd4dfeLni@+n#s?U93%~yevBv z?2ci1ITQ}!()dq*wTWNK$;Pi(Z>Up6gwFDt=N_;osTJ!^H?w3^A0rl7R- zsJk^w;@yHvU4jtVJfu9dVb7TtTznZC1vPmYdY(1Xyg>PkP#;;?cj#j3yN4Hz*OTH0 z!hxa(+R?#T4@V7DdH^-4g)&0mOy2;!!vW-?Ut_!+$OtvjA?Y2UIk4h}oBL8ZFeT^E zaaSt0gyC)mOn3jL!9Y10kzKmf!L!{*hSt7iN40bPuB*z!@wmrqTPk_d5wF|okmO*l zysA{a_{=Gn(cIHmIDFf6!%MgCDr~>{LH12!JmpE-H^{ZcbH_KI*}Q79Y_OS)5<7i7 zUfrC@1Z!v3*!!zH7V@dun$ZRO1vmET##di@N9PWQVt45Z{Yo-bOAVT9vrCQ90L#rD z7>-$VGtr@4jf`{Vx($;zT(x)ja59e+`6b3i5A3S#*>v?I+3--d$I1S!SikgLvz7AI zcXK_)wlXIAft{3Ly+`(mFmc5|4a{E66Xgz9nwg`j!^7iis8-FO=ecFmAO&}qWFZB) zpNdL5z}%LV059;_^q|VI)t@IgsanFm(5ztYtf-Fnkl+tyN)@zYq9zTRWR6Wu(lA)Y z95i)*qff7SQN12xR8OdXwwZbLGH}8fmnZDXAfZO#ts|w?7tZd{mt0Aw`;B9v;mm+{_4;jvx4hZ3 z!?##oNcV0kV$I9oYx}|1N`Gr$-;1V3x*IkJB+FpF3f7bvpH`L^^bQQWCC&f_IRT#AsJ0R=x|V2Yj1gw@X9g3c5uG;>`Dw=2*?Ri++M28~ z?9UruTJqP{T(Nlf7mSgZ8s3k?Y)Y)#Wb~d zFQjH4X#OhkLy-LjvHH&uS{|AKR3p+VaRb4t5S^yTSP|**q+oI=3}6x>2vxFRGjAv2 zyfH^+qy!o>7+vBS#1v5T4B5?r5vkCSK+bnH>!8XEMgsyMY2R8sqA_w5*Cxd&5^<=y z7eX&Uret6xk%%i=#+rELPxXm_lKf%L7>McHdQYGyVxHdWI_K&)1h0A11@2vQSs(1` zr$6StXWhtU0f;j;*x^7P1j#GT|eat*+AjiB?9n(E_32oO0L!zsuQbcB^gHRD}K03X80 z0GU0Y*}#D|Y4>Y8Kd{UFyq;zM2p(6fqGUYf?Sb_Kf$iLkCcul>_V_aZJ7Q~#DGy7| zU?kbw7^PD)5g20gKy6-#)^Pe$DKIse1+~Tcv0dgB?9p9gHb68+&7z_0YZ%xeUOTOe zT7dVg2D=BDJ-d7X%pu`mcg{6dot5!NeN4964pw(u8H=upSKsr)vBA;4@v{R#pVttw zoK;*n7#ly(Gx>PuPsQF_t5Z8p`6^-;bQJp+eSh{7%zIVQ@y?w2t+y z-nXsr?x&7lE?#7wIdgBVx^M3^wp8#n5Abw<08JSME8;;lG`yJ>5rPpA9NjkPB{TRG zBF_;m;3HHFfEp4<0=Gm?Zz5^oFy=`jF(HYp=0H1kQ5vv>f@vo*PzBf@9=Y^U_LEM8 z{e(Tx*~LD-cjnA9@eT}jo4dq!iXX;acB#-BqAwrN;Gkj^TNt_0d$n^tYI$(|HXos} zhi4a}I#pDasxSn$`!sW5U!~>XwL%;yaR@UZ=Bd@k;a`1&5ZlS=>*&K0ck{vblmN2i zlm#>>_HfY{6*))>Hng-B*bZWZjb(6*4b?e;)_~6zueZGjtYl!`)>*Om%2C&bMoCUt z-TuzwHl<=$?0@51rL+EAd@wMNlnsG-alvNJE%d3Y)EgbB<*F{>iOdlTgK(x z%~pGDK|ii90Giko-zVgxi)5$m*5hws$NPb6K-=ADJA}5kqwV*+?Y&}JuoL#gcINRL zL^p5y7ql&MJj#p5f29BT5xVy|_Wa5p#ES{>cl>{|5&GMC1O5^=a18hr>XUf2&ny3_ z^?Ciig80gBR}d~PEy6YvgryBQJA&^bGY3MyPA2C7!$Hz9kH$>iMV&TxjV+Jv&rQW6TY|LIRU{p>3@d|Rh~WkP!MD>vYGA6p5r zlr+bmDD&%x_bat{&9RH>06}{K8Pq0sPc4{Zbe@W|0IyqJ*NUc#}3+E(8ZM1-! zQ}`m|kt5-w-SMG7aX6*AW2c(AJJ6v7z*Ys-2BiJN0`iVHoE`$M1Fz0tlAx`c51Ek- zvDXY_{`f6tT=kVVJ;>yjzx=67#p}-KESxf&!{T+9e)5*5&u5=|=K1}{Z@xr)=F~wY zy7&<2DadK;!12E!8WUJ&-O2}$?}~P1!Hhte&Rf|dqn$P4UPOid16|*QNX|L20?$x| z@N}vkZU!AMSf>N3k`WwCJlaOOYm7Pa_7U3<0SCkIyTL9J^|`suCb4q-S@v&;y}>*D za%JbrA6LE$+|X|^yTD$f?GA7&9k7l>`&SCnoc6zuME|=xzg>Bd_kRK* zSR*Un2F~b(1GY7&V$j3k7-bgNK+#aY8qwEGuX8X%&6&4Sav zh#xKVZ-gM|=%EWuFOaH`C3_*0?1266Xg5TJ!sL)7uU*#2wXB6zzp9;Y!?ktVKyD-N zxUg+ASlmucJD+&vH%_jd7oeRNkEr>=v1aH{#9BcuiBCZ zCqwxCZk$bNbT%ccL|Jp%88S9NNNx}Fo)oZ8E|33TiEE?Ma`$ZjAvKp=&GjSd)NT;a zP9n5s|44JrrPh#71+F_JT|t_a%@9;arsjs>=HWS5YVh^_e?oEOjU(X|E*S2PqZn!; zHW+bI4FZ9YGX^22L;nv5?-S0F!DKMFoo*8<*1CIAJ)i>`c zFLLV5hs0veBRfj@p+I)f;Xo*Z*Qu0pjZm&aybU(eUn35Wa$H^ZT_8e*EF+(>4z+1s z0>183;BN)+zB%Dba8`9St|5&wBcy;pF4SqKI&K)%!7$3h@Ki?-L|mL?kRIDb-lc8x z(HSLa^m|0e9psIYen-!!T(^y)KG!UT%@L98)C#08O;C0z*u1CHC&4tw4M3a`iJ#JV z$fJLSL42Vye&zbg#MOpiIp9#7(ZP^Qn=;Q|WeJ@RkM{1kWu(0Qw$3-EcC7QbygM%{ zyZt0b@cDSSJ0Ckx@r38QZPjT?`fBQGY#rNSr~V&I$@G*+Q!>qw=$H~Z)20Mjj$Sh* zz)H5~`FJnK<{PjoQy->{K(6?XE72QK7KnbF3H8Ev9e^vE>kcwSLQ;cIX96NU;{8aUEvu}>-O zQn4|=6>D4dO`~o0|IK_ej@ImMEj+0Nc`)GLqP+!f4#FDZFv13K_CFy3c7ZcI7%R(z z)nv^PF*^ca5hqC z%^A#3MQJ)m)FL#j&xndH2;l-#1EUktA*gBUASg}Wh^hmO79E>z!dgHHM&JVXu|fGK zX_oKpdF3At z7)vJ>+go|ud4UacY{6wzLIqJG1MEA9GtR*N^asuMtPa47GQh2&1GEI711B)HY93Y= zNWCr$tcxNT1Q!oAs`H>>V^u991+o?#+>(3fx=f+>5bY2SOyK0SESv!|0V?eBHT1g| ze$R!t41_o@LVtuJLVws1kZaGbV9-Vmkg_p={vJ8(uwGPss7P_1w*8zm~ z5cB%dwLw~bSbz@+IL*|wGrkDRKs&W`F3M-o%xVzb`~aq^hbBqtN?u*LimPW+yfQK= zZKOpvjDQ{zql^Nq20iXO7lm#-qc9V7dwQHmZm`Neq(pj0ljm)G^JG3PXVST)UeV}s z#mnCO1{DzCG)3d963x$!XlZ@*`bb z{HCx^T(s1K)o$ zR#g=MH=Q!9-pD~k<36?KzpkNi*EM4p_~a3tDyK2?9+ z;Pd+Q^Dk)43AwrZ2o_CKJhCj=L^tdWI@7X_jvk$O^o1awB?Fx<8~LY+f13HHg@0P< zQ?-dE*fo}|4jsDM==0IZ%`Z|Un047sr}SXJ+JLFHp@)M$b<0lrqsDidnlX7f9!tWt z7MGV3@tx?Bq|Zku-u(OqdI-V{mQ#t{=$+VYqE4y5xSXcT%NhQeR zyES5boliFHd+kks{SHpf0GYbl`I)sFX@ekmRtUT(kMJ_MdYUCgo!JQaV005`et3#d zULbOqfS^E_x$)s7Agy zTPHH7WYbwBqbNoKHk0JPFc}C+l1XpXJH+9rcZYX!-fIp;0#{`{=EL{sjKR#VgTCDQ zvCx*EoGa_o3xl(vb3^?uqtV!J^SnJTem#6(cF|$f)vW_c$(M^H6V`OS{jIyfl9l|g*ny)KMNj3K#FQd!r`Pnhy;p&t(f35 zKf$?9sGmhFpb|J&p^ODIh?TPW*Po!3qHBh5#Ueu^MM~vkIvlET<=CSW-+SThoIDHi zvQQWV{X%68hvFc_2>*=IXA75JrMDKY6PZPTr3Q6b1dBBijh6;P;a3TXb(;&t(%>o0 zoKBJyuL7)%t9pqEL4lz|Uv1_`R$GP&F&UJg*zfL>6^3EwNSP`#E=hA{O*^&wJR z$+MesLkGYiM2W}Z+2KYkRfvvCHoY?HtFG?r$%GPSomFo)=O(j#*=z1I6&$Ah7qf70 zbu^SuMfbMMlHR)2xnV3GN}jPlXpf0b*}l7R*-c_2YEQ7R$#?493CDz%i{?(LX}Jlj zm^+Tyq@?_aKa9OPcc!Ci1rukjn5Zo5DYN#(3qv$HO&8|Ik6BY_){;knm|Awb{FnnD zeIkF-az+7fS#Q_ah-bJ^{iVt_6RZe7~?W3 zjxVQ*=_;2SsuZjQ&S6*DRv}j&q-9)msUEnj2sIx}Va_lgnXbm~;-igZA8um~slmA1 zPJ?f3_?^s8dz9BhW&$ix_L4WyJJ1tL?(!Fx$|KiYQuFQ(n*3gq_55@DKI!|Hk~nu} zY2#@$S2rXQ1Kw1qml=)zYiGa8?pLbOy%7iOl@LFcN2{wp&dyo0+28pYGg>G>i2-wa zf%H+-&6yFtF0{r-2Ac*}$N1dxxk&&rT#I%ed>mG7=fk9FZM9LQpD+}j^T*Yl@ z>j1cgAuh_{w2NHeoRJ3HCw)|jM?D6=E)`FtEj^*^SN4b3@0qBktXGZAo;DEmc#3h~ z?(og&^|uyn?$qc&?cUA3pXr?p8N_?tL8~-4^sZ~))7Z4%;w?t<+nmAh=xOzRm%a6x zD>I>}7`Sv@$*=S#t0SXR;iv&~Kt9`j;xWYQyrt_`K=xcXHCS_`(ySg;Q}7(5IF9b5 zY9mvD3{{T{Arcsn??fF%L#m1m!cl_bYDCTV;y9bYkWeY)Wh>HQ6HOxF2{OEj3UMI4 zt2vBu970?Ga8xNypqx(-e8ZT{adDPx1B{aBb~hFhnc&`{w96RKp$3hZxNmnoJ-%^k z@k8s+3!gVxU$BRD=CxzR%&q2VJQLrMkETkgJ=a}4J~%HvvU|4jc&)O1W-wuj-LP$8 z^Twgr!hR+1A3d0u&U(wyl6PQVp~vUS#z#}v4y=YL7h_~w`FqKYd|$&XgfRl|p!7)u zu?&(pl|ewG!6pSEM4_$-AGg%eb`Ph_R*Hnz=@c*lG)7%n^<|AnU2@ZNL@oCnYvzwU zI<@h??$MgvGDKLloHt>SgR2ydsBW)G<18M~v0GmDxV<1ng?|$jMxYfE` zq*J;RM+ID%D*x^u`Gpdlw($8X;S1AdSK00H!dzK8$^F^uH4^<}o?v2EO^7yEZIl#7 za8?F*uv$h@d*T{%0kx+=@En?hiNWp;6dT80gSimP>Ed|M+K}AA4GX7rK6qLpu9wF` zj)o&VYO@BEeEqE1==%AEcwkGg;P)7<%zeRTzV_Qvwp}+$%1HA&UHJYpOmw$DgHYq+-06(Id%Ew?MUN)GD;OR#CZ2IJ7 zzpn?U0sa}}pAq^5U}U+(dzSfUFMYPq`PE4vdoH%l$Ou9Rv5j)k4~Y2^QoLb*wg)3U zy#}Mn=MNPB42{M9+C|Q=EN~zZKp)$(-bq`Apyt5okmS_q31Ka2EDGF-tL`W8Q(}Yf z2wHsuZdaC!P*5H&tQw86n9Ch66oYdIN<${2ORU>AR1@BTo#pYETXCnrAldL);!<+W zbgx%BeSC{Ad%EdwCrYkzXw;DQ)<1eUyQ5T5!nyh3MJazF%@68TOL6#BOYmxb1=V?I zSC(sPKa@g>Z0ZIzA%u@Z7MjJ{3G_|@XcCgP>Xzr)v1pxu45AB|g%~gk0#Z(Mw`b%i zB`)*;mIrsVhg;r|@2%8|cxXvRqF9mvU__g6ydg0MLZFb|6t_!2NGRNassJF|?B!-R z)ePq~GB)JfXP*%!{T74cRUct_}Mr68iA##+Ysn{p>wRKdd8)nxB5{12KqW; zkE9C`3vjM5APBYEv>;c6En-2qzjQPFo3hxuvV-@tuRJ8J6Xg1?5G;fD|j zPIHx5nG*N19|1|VLHL!>($V~Auo7hYYOmok6S9y}RwBZgM=E4;pWsO%+V!qPh4eqw zqh!Gx;ZErGf|liQM5Yj;6Zq_8H@%Tj7OHp<9H%aR)N)Zy1c9gEOLk!dn6D+w$jAbO zp}xv2A`U2?yOoKL(I%9HA5g6i;V1<8sHKZc@MWM|gWk#f^c;GtGGSV9E3PyxO3TRa zY(@}V7^+g}GG8WOY$yFBMqUB}YCFuGq{JIf+CTwC)RY{U$*`}xKmlwJafDouniR#o zvu|26IFLvNV+QkFPdGCYb&e;_Srgi`Fjj9EjIz-u`qNjQs~a8nK626gQs?vqU0f-_ zd14e<-}E~UF7!p~F`p@z_4Q2d-WY!4{&RZonIBrau3`&&V)nEyx+}5cOh?$XG!V(N z)a9LO{{d6A;46(GEEQ9TIaJ``{xNJ`}GVIQ>6y7v-D-U4Z`xgI&)D*YsjHw&(o&`Y2mjdBpkPBIEdW^>(~|8Xjea64 z-;yp9{|FTIPT^_+>F(OHhB@(&9H;}UqSS0uKPU(mjLhf*N7W?uRxDS*9@{xhbkFhh zE$TK<54>q=5{9$oV4z4iQZ-iwEA?gK1!ASmF!z^kb3G*6Jarx%4EJ}&0Lud~cBDIU zO9Jc(blez1ur{E4b z;&98hp+1v&^wL$vbZ_d)_hj_?>vpn0Y1|vUFwP3;r86e_JtaVp`u1j%9wieU%Usvz ze8W=1>`(Z5O-|XVtMzX)Rh}$46YO$VG4BcvRZF=Hg0@5<1l#qK*e5I4CqJU`UTw34 zXUV~Nt7=88Xe&%|O%1yz9dvikwy~iLV-*`|6$1?9K8lDI3iocAc$BXRnEsZVCopi6 zi8Y9LFYcyLlSuMQ`&~b&oswQhEHbIIMV2p;^I1@h0Fp23#RA8+H57{Otr7IQe;|>< zuGatrmE!A81kwW*3Fs;UvLN15gf13_hF~#zCz<%<)3L(Lx_5>Xjn1cHCcM+kK*HBN^q zWI|~cs+1LilqDku7n>dzGXL-^vgE+hGY)G4gSd~tINcHS1gBf~3!PqNmrzGrXeN#c-AfPVh{CEEvfiP__(`@1!Cz~H zPIa=8Gr{o`R-_aZ!x37MqYA=#kvtyhQHTT9NZqw_cZQJ|UL#lc)2hM@yM2&&B!KpL z#5RzMCxf&TRX^4%k||VyN+9H@)JU-hoR7a8`Y501uh=6`tHWZlc2%r5b_y*dgP~H+ zAF^M+RPTK_92P%NnJRDIl(&}neL1z6#$!`qq+xJ?MsLD!kh5grymYK!T&ZA^{ zfJ_t>o|K*xKMhG}2o2wbB;*wO*)}@j*MlII`yewN6e`lBASAzz9tVXyLrpb)ydX5p zT$aMK?7}y7W$^=eRzI8t-{Q|g?i}HpTy~DU|;%_j^NT-G?x-qDdpG;(Mwh^${D5Y3(eeancbw$%`Q!eCJ+zi-62-SV0CVIA6rv%g=Hxi)W>^|KZJKrgTXut-?k|2 z`W1~!dgVEs-w&{8Owx(>AJOE;4qL;%BU{B1+s&TjZ64hBdyJ0=>?if1^M3#aN)&Fz zF9+ghN?4wI+Oq4D=8=x@(9%9NY4m1`QEZBuhy^=I*2Q3S6H0Ou5pS zUA=}9TLSUF3#)1eBBYgNW4S{0I+|;!5EJD}5Q^0kvW3W38tm{8Drf^dp?8x_okR;{ z^CkOIx26qGexcWd3)~5%LqZH}3U+*cY%kBRihX42z(tLoksHRVwvgLwszr1zeWV^S z>QOeQZ_mDWC*%avvE0n&Yj12sGmHJ>>EJDw30ptKgR@Xb=4-Fs(?@n#sR(*JH@-C}LC&07s8jo@v6+Kz@JEQI`x$8ok*CM2n>|OsT?G`_e93!6* zfQoO!P)L=c6dpZl!G;I@Tj9~g3MJ*$SJVZp=mohsO^dLf3@d9Z&C#RnnzmRGs{z|e zv&0>Ulne=V1s1hAfd`VO2dRxhmX3xXVx*PjT%q2e-;9}Y_XE}d5nox>JNj0k5qMZw z442&z-UYF&II%lw98lknXk7%VlH?8A*Dyv9zWs(0bLjax0j*DByGa_!bclsQ8_`J{ zESJB@F@^ub4!e6>96+?gk)i%WmnEd6^{6T8$`%)T<2$lCn^M{^Q1qIdrC`A7O1sZr zGqQRA+ma?-dczxTt4E90UTfiF#T%JL{8YGM)Vsdt(G7$y9^E}O;<87~Q@gI&(QAsz z()w$|`h9y>Ma4Dg`hj7Sp83X&;H5}IEv^D@wF(7sr}&X0+MIj~`_U2T->WqL#d5?Y zp@^2DrcT0d5#h6RAK7gYoMeF{0v-LOG{j05!axmWOyL4p}Ad8|{6mOCZdgMpO zxfg@-f_O8|XZg7q82t%;eHA~CulxzM=jb}e#|lp5J-7_HY;P3?#V1z2CJ564##MVZ z&|JEAW4zC$Z{hZlgQ(VVe|M)}EsROn-Duax_v%-EB7R?d0Mde43W)E;Gbq;VB^>~d z*!6ml9do1b6D`(EWeB8cm-%MaD)X?WGR2%rkRqGzT5A|=pgB=%uhIlchchvZOfR+o zYGpyL*Rsh5s}M@5y(^n?O}v0@kh3$|1Cdp%y`Zf#gr6c`UVFWEwq9;dVLeiEJSx{V zU1?8g;6&)`Y6T{fc2!z6e8OfTjIHG);(!L$N>`ELV*~}&(5XH(y=E;Io;th=#52Zo zb;LnJfS#IR-{3(%WZc5)L8K3t_i&u62VGiJHBjr zSKd;-#qE=iD>FtV@wK@39d8PXW68BfXtLg*$GAUNNe&F8mPY-njb3Dgb{UI>c-9l2 z9NebCg*xZ5t@DZ_peQ;>gm-q{m{lZ2k>r~{di-kvi{oB)BY0+CzSxKjulKrclg8`0 zxIY%CtS?Wk!~7aSSGTjLFuw)%UiQ?tu0@+;l?TI(sq4nNzuQcl{QxR|Peyiowo z0@p44I^hGau-rvguO*Zq^}UK;$Nl0$uOe|G+#yuN&~^LfsdQ?46}+I2m$j?(wPZa@4UU7hzE`}6k~A4j_gjrGLuX=u+AzsTR?WV^np zwd(D#V{{Mzf{4g5J8t~CV=+y_ba7qTawi&{_gJ-HL-(%%`6{*_Z~QLNQaJ}e`xgC zXGac-_k82}iRXSfaXp?BS^3}CD}TqI!w{N?B*G`+jPM+!ox)>KvKw-fF$Z4-9>rdm zxbDn1jXx)PM-Co8U%Us;#QSyMhvG@3w}}u&&=y&Fg1sPF(6(Q+iVtHyWO!S@bS~c8 zjyotkc{ttU^0v}~{^^ZUId1f-1%#xWTlgXY; zCL3gBvOzWi1i}s~$QD9C_DylA3MdFDYOM>kRuL@)EVk8lCJ8EPTVAzRt+i@f?4qyM zwr|z8)^2aBB~O0ebMEuZLIQ2yzW@K{_y2tUv`%K8_1t^UJ@?#mzULfm?K>^&^*q@E z@ym4+g!rKCdfASh;Ano|0r8RgQ_p_qYSl*hY|V8X?;Sh*w060MxD$A@`(=d^c0iap zlo3CZ*nBg4vW-BUy!*D=07pTsWSe&R#G%FRi^Q}qStqIwe@RTc$j$H18Gc4vh4$`u zu2p(b^;$Uv3g{nb%N+iR)~f~37i-Z!Z*l(=4}V+RsJZBRt!()I1bQ>kPrc|Tk8+S| zJVX$b%@x?uSrKO{tVmW)vSvj<5G7rAaCne|taNTz47{~eHjFGt9Si@!ZpyG$6L!~7 zY?K=Mn6iGk@JICw2-OYik>(k&Xf7Cuob*Y@Q|Y+&xKK3{TK(6Z@FElWMr|ST}T*C?MiW> zUBI)!B$kX&a74xT+u8bPrw~c!=?04Wm z-~RpJKIBS40N=$JuQGU0IFCCwiP8@ty1c zqBQ_FS-&;YPx~ylcTjO^g-mS@g&VOyPaa>(1SY3sx(b~EZU1uqxzV~C^BVNV z<^t+`A=L^@+YU)`YLq7uxDp&0%=RNfKN)ce6syI%+H+R zh2lf?0nc7IG&K0Z;^%Hmwr$m}H)LDEa2fD^Tj_e$K8#&LoUEbiUq%1AVbi0UG)|*e zQ){UV0_+MvNg)0JfC=tHAILT3T(kD-`gIffhdx|4;T^D?n$|DAetqB0jwg3^d;oFx zq?9Fi{`2BDkR_LE|3&nmj|zw1*LuWTuqMplTJk9BhltXCg|j&-aA@~uGe|ufStVpn zN478&5CYKvq>yC+_4pJB;8ei(5L{l6d{#|EWUoes+r}5I-jr0k)0U*g${Svwj$gX; zv7}6AhRf@8r&!G@hlOjtr#ruA$j7Tyw>k)Uccn58*yH#G~`UC1awHK&Z_M_~DhcnQa?*pYx4J;5cIjCB-g1}hPA9?~vZw?r>B)}udm zcTcWdBEIpJ$&#s>oBF`IphxnKK@ZkxDGjK&J>tPxE`T1axw4{Fzk^fuI}ije>2Xo= zVGS0j2mtr+Q`5kJp3(rBpeUUJd|LGZTHnjn$MmsF)~#DoIk~%A{Eq2*ZSq$p^))p! zNs1bsM}F)@w;;nPnaD8XDe@Q#zm-cq(vLjIT~3&6M*=^ttzkPI_JjsyvNxmzBXOHe zMjGBtQjv{FHh4PhgB>9ibfORxpj{B9VILJGB%=$&1U7;un{&S1%%p~5B)8If3&%GG zm+9L!k#e$L+?J9veoXVc>v7v#2>~tW5%dqR0 zA}~j zcsH-{Zp=X>+oDQo5&v1b3)XmVbd86B&||Lgl=h0(cn{Y2)Fgb;8lPsxak<7Lg>PEI z8t*2@yyB3OSFZBWr6O^uk5gh|%e|?|@S2a+2{nd(fxNKwMom>&aGj?$Qs^N}-k2dy z8ZC`fa+vCo=9mo00bqX&k)qc1y<-THPVo|S>kry@LUv%WR%^`XbH*Gf%%-A`=cAIl zWZVcp-$GMRP!w=XiGj*)EpJw9u$H{jCpxjSFYi-wv>X~+u0 z8QD>>4k;=It%h_0JK9fEp+lrNA#5jBFHCTRy#PqzLg^h2JT#UZAN$GdMy@Omd1n7}$B4`>Q zekvvIy*5Nhp?E3w2a?O7qakttZ^VmBV3_qcTeP>|ZQWRK|Ki)ey+#>+{I1u^H-7(( zHyRhtUi{2mCqLP{V;(w`>_RNB?18>B4Q>AANMk zr`FV?579pzsNixFZ%q zaqqbE-HU?1xOeDt>nG@c)}}*o1Jsu9eQ&r|Re%wA1c} z9BkPz^f_eS5K1*_KzEI}H#TGCy;j=s3enYbeY@}9GAm7BHa zRPB^JmW5*>9NRCC;XMg7s<7@djd+hmuAN2)2_#BwRu%odp6fSKD~CRZG!4|Z33OV_ z`?aWKG3XS{es8_#(%)~tzUPQ=wro&0(fw%k@D}YR^>f(wdg0ARNhZSOV01_~GUqs| zaf4S7t^t1lx$G?{BSo1_0mEjzI_<+7vBssF%eQtDa&TT`Q9$vP>|M;FPGD zBTA*%AqBU-1JVy9%Dy%G2Kg$OZ;cfe(ob$kxpX=lgbK2+;O&+PVW*b`xZw%pca!c# zDLsk5`OQaQ*w|zVJ$MWH7?MC$~^v40^qqFuI`NK8Z8uenx zo&(xZ@htOH!SH7E-ymI&{)0c=)PZ?y@59)x0RKCn50UhQH3d0_sQ=Vxwjnc>P;>}s zHl2A*y>NZYABVoSp#|(#E2j1A>KOXVt~TKx`CRY}wp+$?F}IB@M$zXAwA~L?BG9O9 zJ@YEh@QbqazhJ68DyE6-j_d!df6%sTnaPho0L?YP1Y|4E1J_G_4tG5$MiSq_bjh08 zDA>UOBq6OEl+oA6+9@$E*#TrtXSQ!__`_@L#Q&ezHxTj*E5|^(X#?@G4J4aBwN9sL z`$$XoWt%z#{bd_S8dV`q#>O~i1+k+e*b3r9p4-x(&0nwGr0+~wo-(hkQUAFpY;1cF zKSZN`A}F@%i+|kSeqvEo)yx)AEovsrs;ca}`|g>u2p=(a_y^iS^pOu0J`0sskgJz^ z$y*=QrDPaJB)gDwDaIlhx)gkU5%Lik%P4DGw9lihT|#gDPc*85EYhn6vgwnwu3XZ$ z1`6pDy+sxk(zdd)a|=iGRvr}8hyy8$$Tt+#y37uPfh8TzA|%$PK0B!Yys_=>v%76- zTjSmBUk$#Z|Bd<$&i2>QWwFk~H~j}QKleFwAjy>&k9}9^r@aBN z5&W^yTVSw0>N4smOh&BRMnAcf3YLG;PC;vgsbog2vVcWIt;sZOka#vfNxWB0-d5{| zcDJ{yyB8S@J+p7-OuWO5HF`bPSr_o-{Vra=+@?xNImQ7fqy$oi-UJhH#6ng$SIp#G zZezQ%P}fhOXZFpUfC;m|v2Ey86)zmxt=6?Qib7t0WqYvx-jDTHu>3UMk7I|_PpOtu zv?iMK3jkGREL#ZxO(oGHG3up#$cFk$v=>X>T$eR%fl*&A5mbcm@Fn?!;BZqr2lsg7I4 zTN5Yh!HIJ0o!a~AW1yj0VZJ8~GJa&p9FL$Lj717|!VY496!0L7;Hg5;M|x?h(BAJF zTGMA&@9!FVFlBCvIIOL(bgB2-R}8J`QdjkA;;?;Aiot7f??c8}r}4g+#zpT_Xr0B_ zBNT_fKuN6yI>7v}YVXfY8G2xfdVdPP;gS`215%as4n2ssuCUWvFG-mLe?NGe--mJk zqNQ9s!@LkXc0?ZIIdC1;qZ?soZ-`aGCSHIw)G#u}%?D{$M|aT1o9b$g!CWxs18D)6 z5_&n9;a2e};4ptO^u~JiuAxiUt7E{m`@}wQ@V35fl2`e?pzk5@s`Qt@reUdKyWYc= z*@j)uIEK8b^9XN4mJP$qQ5yo_e>fV~W#N z9IWIty@g06i>Oj*$Dq)XI70yiEwF8i%o^C%QBfqe7?7pFQuR*D=4x+MS$$^q`1TY> zTXSaij0u+H#)Nl~AW=}z|plyZ2xoqOnC1b}f zUeVFxaxUv!%Ju@RbsY-n%)h}mM4O=Y4Q0nv$k%~_)R0#t!YK{riWN{rmMleR?BVmNtC)hs*G9H|?%>u`Xu38)NWg zLtj^wZY4?EDn5a}>@=jJDGOa(4c(|bkA51>$5smKsJ2zN7@PSsXMVDDso`sTQRiGE zGlpN*E)%EZ{*vsRkOz6gL%{NU5j~Isue8ie!$1%ix~+Cq19r_yz$uzG^j

      0`O#{ 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

    1. IYEyBm073-pb{MvlsuBJtF=L7?Cl;Z?~hihwRlO$D$&K z39}cR6ls=0g@fp;&7j27qXp+F!giE{G%dh4blLc%cu`$P7EsKEU=OJ#EOS~=%d}w| zvJFjYmgQd?4v0y{9@%)o@pNXbT4l02-Con)v+lI|(=!J5WR2z5-MG8fFFs`IJcNt_ zv&o=4WB2^%M5yyq^ZM&CKQ}Js**}P1=aEf$1^X1{BBRnz4X?NWj6#A??^-I9@Mn## zp`*?KVAaL`VeOCc-`l@odh~!QWbSnKbzbqibrfHW=kHw{LyZ4_@p!4-cs^5yP= zMNF*{jVjy12x#plMG(6E61KSP2;yB`aDA5#?^;F|CQ$B}A_M4L=nMTchWO8rYp8)A zm(GPU?daXNCg-l7E8-viOioVTbp5>V9_u?w@0ae9-f4Nl_D=H`q|a2pU~T!{rlp}Oe!1zbvgvBDrIjXT`0+(p2Yzt_n z*8TxUSKHA!s0vIXUcphVh%>68OxlqFh9xf&cRH1yp3{H7Z)*75@IlAWjtd9J8s*s? zQ*J};%dZ|e7)zvY5MLDygxza>oy%-0-?zJNbsX;8`K!jqHpYVo z`P?KHpA!r0r+l2ieRD34lVC+eY&}94YkDwFdvBbw#=DehZiM-hj~5INY6r?~;h5Fg zg7HL787$y`WTOXz6>SS>?+q6F4o58?D;Nj{tEeE5dLS2jmPY%~wSkcKHciTr+~u4I zUpG@o46Gk_>NM6q?dx|Y^A1aJE4z0nW{WyIPaFCjE<^hAfuoUh>fok^#jN+6ZO^_Z zcDydxagM1lr%$ufsIL@(->ZT6!B&VksA7NR+*Ho%PpxV+&{9q6z;l4*6*)=nmS&QB zT2vnLSdh=9jM;V}V8myBF&rDHK7Y8-!MXRz$4UE&)vrD?*DE(K6vzJHs2gC}(mB zt0PlwmU_M%y6OiZJZMi5Wvq6EG9>_@wX_Dn(4xw;tz`;P-6`4HkLBaT=E#(YI;cmM zeF1eQS(VcVFf_^r0ceb}XdLx~iwMN&BW4CH(adO{s5ZwpygW5l^KL)y<>8biVqp!t zt?-LOk&I1!XiZY%D8$+M))ES`nV2e{_LZY9UF7QdG!r$Vr~#zov0V>ZqruLXjLuSH zG@^k#kyw02oD%PYJb@fL8|c#V)A}%A(a;60B#vzZfx-#CYzI(`lk|8a3VgJjJj>4M z!G3{MD*%K9Besk*4K_dsqBx|i!Y0At)HA|i)}1|joQ)K+8v8>vnu_`+T_+~SMk9k^ zXH>jTC#5EKbj-G

      4n{^v2%jKtR-iCtu<3| zXI;bWQHQBg>d4jzNE{5ZT@{#>Q72>ZGinv~Ug|^ zhF5Znaj`^@qr^)r3Yp3(&M!TjUg%E(D9w#JR*1);N08oqhM3!y?GH}b*vdpc)RKh2Aeh`+}^pnk%q zt@KmZ>t~dkX9!a|%4az0!zI}RQ8tb^=Bgf>QD=mz(nn}|yT!bKLRwXft?0O7=<)=Z zk+Fb2=^dRk#!<(6v%_VnSx^6FbI@&xoB!!YC*I4>HrZSrzuW8XTwx6shMeB~AOj5b z_n5u&M`hj4#R8BqBlu~7ms*pbKTv+f`0Q72d(X+2t@ozW;b^Hide)g$gFRc%<_fdB zhcji0t;Bw1KfoL|5Tb<~8LYG_mVX~HFQ3BAe3Z>A_^?0Qxv1EOs*^dqBS+IK%vD=ao)H;MfH+Z}LPMLJ^LraG4DsYDaWx}olWK6<w)j9u#RZK9-26Q?%VG?w)MQE&y&?^nO4;Gnf1Pu%dBPJSW|Kg z+ipO8Ax)pv5wce&BAfTV>Fo3GTvu^L;%>LvtCO@ETRJlCj|9eQ`l37S3R(=2TyKs1 zo7fN8CXbN7mWSx##;9>X7Fr47V^EBcVbjiP+zHfE%<@;PS*TFSWyOx&L>?W?Mr~l) zXK^U_IpgqCb`esGND_iJH4jOsh;@TQ7(ka&h)({d!`4ibK~mNLtyhpWkQ!Q&gVYIP zgys=hAWL7Gc1jJk@lX{HqB?2d{7h_c77xQ8mQxtEzd_Lz2&~B$HWfz0x$5-6L({wV zO$|>UIyik`M{#R;#OrT}_r-S4`$E2mH##vqect4ro$*xJ-aoeK^4W8)Lwk;|lV7qo zVVz_U4v2a^pof#_fpyY~(_(=E17NG|l-d~wJrK#kxjf975#&%yLKWKyp%O4_w{4Oz z26}ioaI6==u~cocOOGkgBL{kT$ts~U2M}_H;Zmh)7+XLKHMGc<*@o@IxdmzGpaHEH zg#v2g7YYT`3daBe*agvneDUmp(-ST?%HhdIq8zCVRU#8Z#jQn~pFLVSGVPTdAzL`P zwmiB%nhBcx?o@7Fe(iyzML8!f!I`!Indp_MluS#2WFB&UJIIw0t&nQa9Q1$oPe1z7 z4+K}iU}=V>X7Ge8)t_rRPT<8tC>(SYTKFBkC3;Ij3p3q_(3Tv*P`FJ0*oy1sw4cEb z0kFyi2C9Mr7^JRWhvJ9Ikj4<`3}c?#gQE{4&!m$H_S*kiYp_`JereXB2FBi1+GO`V2VOwoa+VEy`MVFW$qx!}&OHTP-xDdi;WO z9gGi{%rHID;QnIxQcM|KP-^;5$kxVlP5TKbmJ5NPAA`g1m4ma|{efV2aLd=q;4Fj# zFOcfb$AVvjXy9T3M`Dz^=Bmn6@TxIt{U`7JLjs2^ZW8 zC*?Sp7m@_y1v<3i;A*WxoETgIF%8YQVhu1>Ww-NG%N?Qjxal;DP>pgSVpZgOL5^W# z%I*S~yA}&r7I?9Qp6u#Ih&pU#${a!?TM}GiP+F7$H>M)hk#Lb&`JX7ROP#0qAJGaa zHRjLee{e(hqLbwUO*YTMKkr^C<9?1k#eRl;inW@garmY#U|E`K1qAce#t!WX4H5Le%s{XV=$3g1yc^jV8T2hJPf5F zDLLC)mHTk4k}1as2wfCN0#qPI;lT@7E|*8a1&E z$#l+QESPtjRX_TXsyyOJxGjAu!%gQOz5VuM=e_Qi>EY>wKQUUEI(W<)i!|a2zgV;Q zXXeHnIFN~^$jwB1p1({|GWN&|rDVZ@)znQ^UfK`K%c601WNB5(?Odt)0{F6l2)@ zV>>&{>5Z3S@p{Gb)z05c0V!xVS#-?nVye!MiGGR2KZ$D4kMEf{jl~H1b&HAM7;D+M z?qv&+K!;ruKPkr)&Jd5$XyP=1*fN4_i<7M43UIfn5u@R5>7`vy9+@8h)_G_!WV&!A z2C&`#Ihpc?qE1Unb?sO6ZnI%Wq|kZ;Cw_MLlbI8O_G*P=%O|fOiv%+7#?B>21$S;aGNeSHCmtM?H5W+;8P&T&(Y489 zL3{0m#{S4_Z2c0uJ+aEUf$`r#BR@`rM}@({pwd>nV zNy!rRhC}M}^V-5CmXz)PH9MxsG0AFliR2p!ZG(`56uR`*>tf4wsg0~BzzqAa< zi8wg)lINWwvSyYJ1)O@<4W=&6WiO4o@^qo5%8}AR<+-NC@5x&UJIs0QD zJCMU=+?UOFl#5)BjcJpE%JPi$n8$fLz9J|IN%#rkSn4Wt2nu&5OpEuE5Bs1uBk>|wfDaa7`n9MD8; zp^#+uJ3MB$h98`J+ofW*C3MYhBDX;f>>ITnT)9I(UlyCeSjyTw$ckFr3thyNlFb@btIT%CB9Mjmkq09xrK{&BELS*R>LeQ0|!j=cl7Sd*5PNRJzJK-4O20RT(OJv?# zl9n)J$7*qjF9dK;@KRhtS~}|VH?2pV0qfbWXj3{HrG3dXmkor{ozwrJT;cdiQ;VCa z9#^jT7`2Np7YpDObtK8PBs#WWS|yZiWA_^TA7Dwa$WU4U)s-1QpE zhhjE}p|~m-f*;csj^QFT(j2h0(%w2&dedQ-Z8+Fui3|5yrBEs2P^kAj3WZDem|mQ8 zR9uEiy5k;9*@;OgYf#{HZ1Ul8l_l&9JNu*&C^F~$+E}>g+myBxoNi4OH*NO85Mo4$8(IoP zt0fhW>W%a$#ho3XlsYllN0ici;Ye16%7DhS8M(H1=?uH4v+kXam?vwEn$^YR%o!tU zQzlg_mLkr{qnEIE>(v2IAm#m-m>9k;tI4ahdgE|a!|Vo&PSghj>3BNi)0!p3Dkc{H zApREduv*nN?)Qm8);rC9hS!(;t;Z+Yu2ktRvYD6E9tmyOkD{1}X*w ziQq}ufm7v$y2ErZicO-_f0uQ5gO2;JbU2R|rgiYkDZ)lbaS_RJ@*1mP1A#6~;>9Y{ zYHXP;*l4lU#3R*cM$3_nvK!e+!*UKum{JH zl*xS^d~Dza&4o8~R1|tl)>)OcGQr24#yY|N6SniG5d%i zFqqrc=sX_D4-H#P*5e`16{(Yc?78W8u{wXeBw;>>bL zE8bo{JX+MLOru+OknLGoOu}~mQ$$iHg~I~(wzMRgDiy}(2YwOF7{UURC*=^%c2$)a zGE@_a`M?#84Gfz{1BS@kVzO`p8^$KVAq5FeO)Q#=ws0@Oc`}%xp}~I-4o1$E?$A&n zh{ok84^3vCwCpS!^^VGsjm43{KWSb4aLMf}Tgt~hh8+jG4!ZD{XdG;6hTAah~tUoZ?nMdEYIoxR1Li8fh7knXCl3;^os{)p zLwaswB_K``QUvT~bkYPTgae%vy-FwfDctQNXFJPXJZFZyRes00fQ+*CTe6V^d(=Hr z;>-qO2D`d6V&*XpS`=sJHW1k*Sk}XidT#m zpu#0Br#eq`xyJbR9ZdaiwooKot)TKC(KE^QgO~u!M{?nlUV#3>sLw4fa88;*K_~C8 z(~tg=t;I~C6U8m_SGtG*G$|VXR$B`s2}{E26rL^Mq^qih+TQ zA!U9myJsZs3+Ce1JAXWP`HT_V?R|F}5($qZ6tWSbR|0fJCK34DAmZt-6DZICJyqCu zbBM}DHOFgm9dmEP+)t1MqsXRQYeAqt3MardBTGYY9(KJp6!rq=%qT|W1%sc&-yBJ8 z=^~fp;D>=^H)@B#N+aco5MDU1u%yY);I1tR=OI?@u|rrah|^O66bv4VoU~oCYvO_TP!no#_<2PX^^ zfCMv)q&2o|EU~5R^q=>Jt!J0C21g~F1dUYM9dEtqoHvZ8i*RX-%%t;q`-dOFvF~yO zLO1LgZ)^#RZ`T;xwPEbwRrk+qn4D5%n^&ql*q;@wqZS+tg?5ySX*^7) zS*W4XMcdjntMpgo0dB=0hn>+~QMM$_CGS7tuE~Hwf_;YKw25gzz@J*R;{W0cTiw~l zTK!qi7U%6YZ~4Q?@4n9Cl3d|nBHeesO;H=5fILHsx4wwZWbQ!*f(=~)qx6Mnk z4aqLps&q~o?75Y!#R7a9kDJUem1P}ec?j6E*GD6sPKL7LM9#OIxd1&|K}haOnp7_+YIbuny|p*JGLwnl|*0r!6Jt&Ei{e?2N&( z^6(Eb*@0keC~SE4KfC;Mc+1w$|3Rt`#RHj?AJP+K<)pX=d#ym{rkRd<6h}c|7r$<1 zpgV(66;3uI7#JP()mDKIj2tQp(*<}~cu16<%mK7>%ycBV`M`Px;t<2YR-6N?IV)$Z zPg>U&)BB{HC6vuXtO@l63U@VBVpT)G=}h)@YYy9E__sIv!}&-c71ZDLnXcS*<$Fz% z+w-c3^)lieTn1Bp4f|s~*^BxyM=du^)H;Akg0-$idN`FVkmC>pM!+~Wa6ur1Y9b-7 z0E7^;LUJXk`*oZfxjM~au7uXQ#2G9VGMNkLQi zaEH&H|LT!9J)%lzio<)>mizY|pSGuxg9$$ybXHv43U_mMY+ZWlfEPEv{5uckwj@X@HfXug z+H8a6sTbFs(GvR_1XUr_lN_lqY$)Fp>`FYDs40H=irt$xO1}HAyykE%q_IT2Bsfc(T3&`-50@3A zgV|2S6Rlh!(@Vq>93G2eG2*;=$gT7r%vt^2q+9anwjP*6kZM`$bNF^!qVBqdy~!z= zoMxT*QfH-Zw;J_fi|1mW$>lWLxy?ir-m>^NF@b$yfMj=`&~kv|wqn>B#CEaW+gj#` z!QqdvE-pDi(nI~gaFx!~mWspwt1yvV*i#`sYQgRb0G$t=*J8s{R2Q?!7D!QYi~^~B z7=*pY%Nq3n!-1n?e1?Wl6N;ZS5I8vq9g-a!j8~hC?Lto7m4-7&(wOl2!E>3}uM6B+j2C&YvV4`BcA~ zf_?D}f_C{-&7MmmjT7ToB*lvxs{l*@8bc za?6&?5$LV`LK1nf?}oIZL&QDLv=mRGzzf8*DrH(CK|v`GriWD#<|pZG50%OMq;9Ip zO;#p3MJzst5PVrEKDTtYsVg@%<)%)OwZ-Qw6uz!5J_nRXCaTmLt&ZEH@C(V>Wp0YX z;ztBCVwM{$@Z^(E{>!VTUiCbFK%3y=4)F}wcXGgtH;_OW30=sr%}7EH3KY&Y9Kke@Ki>b)QN@m?lA7WP*_?Q;X*nS* zh$^#%o6DB26l0kieg*DPM)7C3QuvleiXM4qD-1-|A(^RGjqs|B5HA6^OOl8db$eqj zro>ILZw<{wW8MLG&Ax7WU?5fsWs=2Ch+XR#)xP44WY8s=I&Wn9`uOHgdX2{N@EW_x z8upYW@lqyEU+`_|^c|J>$R>rKxfXY@4|3ZO{4EsM*bXXmi4a}E8NjMGmX-suIG zLJBHeL<=Up3iJU~ea|3<63HG(K)?d&zW^g?M-@`RElnJZL9?qp(?Q zRCLn{MZX#3mCyZDFf_o4u|x`Gw}TLlE*0SNB^`=|{JWzH4T3wo=|HjbohQy;=kV*; z<&V9xK0f=&GDcnsdCNX_XJ-Aa{?6r<_~<<4Er$^cd{R6qX&LY+@Y)UV<;~)KQbyGl zzlV%tt?DPd9VjoV!|YKhBNoMVy!}}ajpD=qpkB*)M+vy2JPMAVcl)QmcGulsf8Z_OPlwb#pBT<`f|($$G{H2m2S795;?v?2 zI5!PI9lHC4G~W==V|tgIEcs!3l;-gb=JC7?||`hG4+SAyRp; zC6|bVRR&d%6Uo!n0saRfJztI|_Q&IG!)p&5x&C!$9eAyNHjrZGbikkK{5kDspFR7g zOZFYQ{F<|$KK!aTA3yr$SDksI-zj=Lq9f3GC_qAAfX?x0DV793Po@LYo;_JtBFUckZuV_FC;N#Z6M4CKm}nSU1EU@ z)&}dDgpNq%0bnZCr;qV#T05y)=3-@`u;MMjU!*c2b?0*~V}JSIt)X=Bo5@&cyz_fy z4Y6-MeBRmYvEHhAob5jS^!}R9r&5hynAv1=I8;8LE<1PUL*3QX`ZH){!dil54kyh< zCJ3zo;#yUO7?o-(g_q4}jThFTYuRtaMx=$b9t&)g7TAdL=J9H4J$G!a$5GxcOs8m1 z77VA_vy5NPlC5=K@iRl#pTfRV{LDnNv1-rNJb+gtRq{4xu@T`vTd=9J$jIum38Oe* z`p8%%^dVV-)+-FO&DpB#g}%Lswk=`+TdDjS>`z%B-P^ey%+PC-qul7}heNs<<^mFw z@d5;Bl{W;u!4Y|67I%0qV}qM6s;VUyA~()(DQ}8-NVdq(uSR_+u{1*@U-xFU#@*RC zV#M0jK~MbRa5@}`U$E!UahFbQur|h0slF{c`lmccl_jk#?}gH9vPFOD+}ooE!YOu0 zQ?U7?iOBHW{8Z;}KDEI$5>3yIms64by*17zd+YwA?)1iT-nGIflO}9v*aKh9^upO_ z2d`lN%6=-PkpTv7EWG;KXTU=kY~z0MX`JChKzQak%{>zc%$Yp&gM5HghTO{Mw`C6? zC8`Q*Ihm1K^%TuRy@089Go6H~c2gVy5|WK4c^MxU5~Fyqh)6|N2>YMcOEXfvG;5Wh zs%U-(Y^PcSS$fn!88-$vtQ9%YzyNFr4T^JltT2oamI;JVaY71!iMK22eAG zoy9}O6lS|>I#x1cW#Wkc;K0M|k>JaoeJU~3`D8tosIndP^i%0N+g(dtd~E)ld@xiD z_?+=Dn|nMJ)MDpgvK~u?G(Mj?l>W|l_%2h2Q>W$Quh=jiDwM*Ggu!CZl{sx2>^Goo zMYtFB5@<)6lud%@0o28XRtplAcm!RE!U*YPYdaJ=`)G5C6jj+@Xd6ko3kfQD@3bR8|+{`IO+;M6?Zt|Co)sn$&K>l)_BmH@I?FB z?5>Kj^VgtH?e*$l)9gf?I&bHq^XYMnHRN{UyWZrj%sQ+zf z+g4Xl>fG=|=iRY2ox7%ESBh5EmIIGGa$t+Hc z{E2uK^2-o=!71YdWoU898Ym_{P9h&{<}Ej^AV%(?Dui=dHf~U^n>R0u%6hW!?P#%K zN0H51gwbC%@&nvQBaMxq&JCJ$eONJWn`~2T*fb<0Zg z1HQ;?wLV@SSYP&us-^L=4|IMI4%Cekwc!D_HjvxC<|EzFD(fK*zw#N71-b9tNBjr= zffN^^sp^qnI0XSurc4Zo_vDC&F`$P0v6|G(laz?aTS~@2a#<@+5hc@kvaQs3jaxG1T4joW{grw1i37bqxVNJS)g~atel)mOBI+E~Yw#neB-& zld7QxA!mS{z|M(Wb{FQKr(=LZE)JQ&&KXf)OMb6_o zUy;q=yyiU7$c*e8+$G@;89c&v(1@%gPS6PX19Bf_9iWglKxlb5J%x7J$O-2U;8f)s zB8`yVrU8qEOx?)SRDo8GDlHUH1*!*Uwl3vQkA#YqszLVu!JlXL_DOwiU-($MI8|9Y zI69o$?{+vY+?AM_NUyKNr;dmpa68|5#hU5)_1XEk^_%k%Yi5lzzqz{ofKIL6xpwP5 zT0f%TSbQhDTWrGr6-JE%o=Zj=798^}JAupzb`&^kdUym2Pl$q11wBSrtu##8X z%Cn$J7l1jA8&|B9?hnZUiO?!ay5PYreoBY-!uioN5_Prv-r0gM=EfijrrT8P?o|iM zZ}&X5{oXHJ`hsKQ#!KJ8a-D5JV|tp8#kE)izBuKb1%Mg4WW`3eTOu7H#1|#n#DYY% z3q9EM+^Yx9XW@y`Eej>t2o^dg09%RtdmIov= zYoLe&i~)$H_-o=7#>qRG;A@_~&yj?qKjl!qaqtzp_gpp

      rK{-AF2Aqw6I4&LXxv6m?P#iOrq9q{pr4^QBL?(S zF<|US+JQK7Y|vYGzR%zTaC`Z_az$SeN^ zI>-FKWc;tte~o?<)sq-H!k?kvMs*ikGq+LQ%hp(*d8KfoEVl6?ul!5&UDkFF{VVjZ z(Z50e7X2RjcdX>^(I22z*>0<{Swt(+GQ^f4whXalh%G~GSvBFidX25546$X1EkkS> zV#^R)zGB3dRVDsNYQ&aRB}|RjGQ^f4whXalh%G~GS-tqZD`nLaQzN#lUTkW_meq?* zjo328mJ>#7Ibp<>A+`*$Wr!_9Y#Cz95L<@WGQ^f4whXc5gb`a-U0Rk}FD^rD8Dh&2 zTTU3U<%AJihS)O1mLawbv1N!YLu?sh%c@%6zfy+SvZ|Jijo7lPmW~FoWr!`SYT1kt zTUIZYLTnjg%Me?J*fPYHRl9UXRJ%-#*fPYHA+`*$Wr!_9Y#Cz95L;F+w%;;h%Tq>d zdCG__tH0R15nG-zV#`xTYddCG__PZ_ag)lyR(s6XAO!Wy- z`gO*0jQ@nA{TcdgRM&a*n%ig@y@TR_{I{PjqJN3Li{3;33jJ&JZ_vL*{|^0o^as+q ze11=AyU;q7q0TP7F3)YocIkC_ek8TsS6!9CW^9*Ur!v%486InFd$2mY^tvj8{jTlO z>r{q1m7%V)U`McBdYxT*U1!0@wo9+8GU%A>((CNf>#7VkW4rV^yYxD{^tvj8%~)lq zQyJ=1hB}p@PGzW58R}GqI+dZ$F1@bGVDDwS^tvj8sa1wLm7%V)Z{u&Gwo9+8GMM6z zcu+)ChB}p@E;cm7F1^k!y{^ijV~Un{rM642ixyMcrPoy%bToG9b$01>RR)`}U3#5e zdYxT*U6nyI?9%I^%f_}#uZu2I9H27PsSI^h2Aj8CdR>*l)OP80cIkC?>2-GLbx~*Y zwo9+8GML&fy{^h&W80F_HiXy^Vnc`xAvT2A5Mo1! z4Iws!*brhvhz%h&gxC;bLx>F_HiXy^Vnc`xAvT2A5Mo1!4Iws!*brhvhz%h&gxC;b zLx>F_HiXy^Vnc`xAvT2A5Mo1!4Iws!*brhvhz%h&gxFBMOrAq*2(cl=h7cP< zCd4)&wh6IKh;2e_6JnbX+l1IA#5N(e39(IxZ9;4lVw(`#gxDs;HX*hNu}z3=LTnRa zn-JTC*e1j_A+`yzO^9tmY!hOe5Zi>5@uC{TtjjL^3ZR2ViSKG>8d!@PB#?>~iwsEzMt8H9u<7yjM+ql}s z)i$oSakY)BZCq{RY8zMExZ1|mHm~iwsEzMt8H9u<7x+2JGk1x)ef$9aJ7T09bE0;Y6n+4xZ1(h4z6}^wS%i2 zTgR31}?ciz$S39`c!PO3~c5tgR31}?ci$1Tz%=K z))!y;T(#p5m>ck#H3 z$6Y+`;&B&`yLjBi<1QX|@wkh}T|DmMaTkxfc-+O~E*^LBxQoYKJnrIg7mvGm+{NQA z9(VD$i^p9&?&5J5kGpu>#p5m>ck#H3$6Y+`;&B&`yLjBi<1QX|@wkh}UC8a>Y7bX? zxZ1pe;OYQZ2e>-G)d8*!aCLyI16&>8>Ht>^k zb%3h_Tpi%*09OaNI>6Ndt`2Z@fU5&s9pLH!R|mK{z|{e+4sdmVs{>pe;OYQZ2e>-G z)d8*!aCLyI16&>8>Ht>^kb%3h_Tpi%*09OaNI>gl>t`2c^h^s?f9pdT` zS9PsNJBT5!4smset3zBJ;_47rhqyY#)gi79adn8RLtGu=>JV3lxH`nuA+8Q_b%?7& zTpi--5Lbt|I>gl>t`2c^h^s?f9pdT`SBJPd#ML3L4smset3zBJ;_47rhqyY#)gi79 zadn8RLtGu=>JV3lxH`nuA+C<(>K|Ph$yHO^EsnU_J(9yVV^_OJ`n>g6YS-OIa`-)| z-Jcopd27Vg?h#kJNAlc$%dU2h;#EcC~w?vtw#kyGMN98u58+#OJLMpSMPQ-Wu_FYsBZR5udk4T@;PI+|VW9_cJAE}dmNzTKZ0=`5S#kIu3p;`7#s&s!s%am{eGd&Jf5 z5m&oMV&MClxBD|AF<@#}yGLR`M-v04c7J9h22Aa0_ecy##ek{ZpBd@%mewN@Ozr;6 zNFGPKTmR;>0akYEI)$WmKv3a}N zJ>qKjNT0WCY*)KSqDU(jMW%MOd!)}>I*ajNg4hURBZ!S4HiFm)Vk3x+AU1;72x23MjUYCH*a%`H zh>ajNg4hURBZ!S4HiFm)Vk3x+AU1;72x23MjUYCH*a%`Hh>ajNg4hURBZ!S4HiFm) zVk3x+AU1;72x23MjUYCH*a%`Hh>ajNg4hURBZ!S4HiFm)Vk3x+AU1;72x23MjUYCH z*a%`Hh>ajNg4hURBZ!S4HiFm)Vk3x+AU1;72x23MjUYCH*a%`Hh>ajNg4hURBZ!S4 zHiFm)Vk3x+AU1;72x23MjUYCH*a%`Hh>ajNg4hURBZ!S4HiFm~Vq=JnAvT8C7-D0H zjUhIM*cf7Ch>amOhS(TlV~C9*Hip<3Vq=JnAvT8C7-D0HjUhIM*cf7Ch>amOhS(Tl zV~C9*Hip<3Vq=JnAvT8C7-D0HjUhIM*cf7Ch>amOhS(TlV~C9*Hip<3Vq=JnAvT8C z7-D0HjUhIM*cf7Ch>amOhS(TlV~C9*Hip<3Vq=JnAvT8C7-D0HjUhIM*cf7Ch>amO zhS(TlV~C9*Hip<3Vq=JnAvT8C7-D0HjUhIM*cf7Ch>amOhS(TlV~C9*Hip<3Vq=Jn zAvT8C7-D0HjUhIM*cf7Ch>amOhS(TlV~C9*Hip<3Vq=JnA$AP0V~8C?>====A*H%EE7iSO=@hCvlN#&J zr1Z;nOe0pR=ZvI!f>NsIjHFpq&lzc)NA(1y#=18v)xBA%?#)WIkCkd4E7iSO={Hf` z>C#yDW~KNeVil1QE7g+%i7$&-&4^eXN5q=y-mFyjW~I6}E7iSOsqW26b#GRxCn%+Q zf>Nq`vr^rgmFfw~#Fs^^sqW26^#r9<_hzMdB4TZf14gXI+Q&+DZ&s>%vr^rgmFnKC zR8LS!^#rB#YpCwcYOH&+Qr(-C>fWqW_hzNKH!Ib>S*h;LN_B5ms(Z6i-J6x_-mFyj zW~I6}E7cQ}QaBN@HrBmasqW26Awv*Qr(-C zY9A|opBdeoO(Y>U39(6tO+suEVv`V?gxDm+CLuNnu}O$cLTnOZlMtJP*raOgdpf=m zn}paT#3ms&39(6tO+suEVv`V?gxDm+CLuNnu}Rg~AT|fFIf%_cYz|^`5SxS89K_}zHV3geh|NK44q|fAT|fFIf%_cYz|^`5SxS89K_}zHV3ge zh|NK44q|f zAT|fFIf%_cYz|^`5SxS89K_}zHV3geh|NK44q|fr@v3ZEiLu?*m^AMYd*gVAMAvO=Od5FzJY#w6s5SxeCJjCW9HV?6Rh|NQ6 z9%Azln}^su#O5J353zZO%|mP+V)GE2huA#C<{>r@v3ZEiLu?*m^AMYd*gVAMAvO=O zd5FzJY#w6s5SxeCJjCW9HV?6Rh|NQ69%Azln}^su#O5J353zZO%|mP+V)GE2huA#C z<{>r@v3ZEiLu?*m^AMYd*gVAMAvO=Od5FzJY#w6s5SxeCJjCW9HV?6Rh|NQ69%Azl zn}^su#O5J353zZO%|mP+V)GE2huA#C<{>r@v3ZEiLu?*m^AMYd*gVAMAvO=Od5FzJ zY#w6s5SxeCJjCW9wg9mOh%G>D0b&afTY%UC#1y#EkJAmVha#kfY<`W79h3& zu?2`NKx_eG3lLj?*aE~BAhrOp1&A#`Yyn~m5Ll;|wg9mOh%G>D0b&afTY%UC z#1y#EkJAmVha#kfY<`W79h3&u?2`NKx_eG3lLj?*aE~BAhrOp1&A#`Yyn~m z5Ll;|wg9mOh%G>D0b&afTY%UC#1y#EkJAmVha#kfY<`W79h3&u?2`N zKx_eG3lLj?*aE~BAhrOp1&A#`Yyn~m5Ll;|wg9mOh%G>D0b&afTY%UC#1y#EkJAmVha#kfY<`W79h3&u?2`NK}ukxBGy#jqLbRS@vn+fQ+RWV)uj<_C2s(GBdRknnrbMJFwzcTgOV|2D60(Mk0!I_bNpzD1|; zU!nRIoyPhWomAhVlj>V^Qhkd~s&COHz9FAY^?bTi&&x~oyu4J;%S-h=d#QQ*4S8#- z=jEkqsGjUjd_x&+YCe2J8EvZP<)wOFUOI)EC*M#;n|?*tUB4l>P4&FI^qb7e@=`r7Fa0{I=jAol^YT(XFE7>e^3w0|Q#~)Q zv7SLr%;D-BuFm1=9Inpc>Kv}l;p!Z&&f)4DuFi?rVPXzf=WulnSLbkb4p--Jbxw8C zUTLn*;p!Z&&f)4DuFk2x*-y>YIn_5)b9D|^=WulnSLbkb4p--Jbq-hOaCHt>=Wuln zSLbkb4p--Jbq-hOaCHt>=WulnSLbkb4p--Jbq-hO#J?QF)j3?9!__%lofEP4Q*-r( zT>T@dp8k?r6gSkxR;7A6PO7KlqsokTwK^MEBieX34Ghm4usu-qvI!>zZf=l&uoK#Q8N%eG`R8PlA^>mzc3f0qb z8tdse>6h)ubg>(Bu^V);8+5T7bg>(Bu^V);8|q?Op}Lr<{(6B_-vyW2UBw%8u^T$e zic4qNj<2WVqdVy3=$4T{coK#Q8N%eG` zR8PlA^>mz6Psd61bevRA$4PNU3}`F{O!ah}R8PlA^>mz6Psd61bez=gD&C-r-4F@( zdj0hRss4I_R8PlA^>mz6Psd61bevRA$4T{FaH+lvF4faymPEq4E+4}81coAZY5L<-UBE%LUwg|CBh%G{F5n_uF zTZGsm#1u|u|u|B+AhratC5SCSYzbmZ5L<%S62z7uwgj;yh%G^E31UkS zTY}gU#Fiko1hFNEEkSGvVoMNPg4hzomLRqSu_cHtL2LB+AhratC5SCS zYzbmZ5L<%S62z7uwgj;yh%G^E31UkSTY}gU#Fiko1hFNEEkSGvVoMNPg4hzomLRqS zu_cHtL2LB+AhratC5SCSYzbmZ5L<%S62z7uwgj;yh%G^E31UkSTY}gU z#Fiko1hFNE{lQDGy!3J62QST{Z==bVK1lqK`5!X>!b_6Cx1T?p|L9V`-w67DXPC@teG=jdCvHP zvHrtV;{B^%Lf^ERt21`YtFz3!t(j#aT_)0HB3&lZWg=ZB(q$rDPFSSNM7m6*%L$8g zIbo45CoIxsB3({cq{|75bU9&>E)(f;!XjNxSftAdi*z|*kuE1J(&dCjx}2~`mx**a zVUaEq>2ks%T~1h}%S5`Iut=8^7U^=rB3&lZ<*OFyGLbG5>GD;JbcIM)h;)TWSBP|l zNLPq-g-BP3bcIM)h;)TWSBP|lNLPq-g-BP3bcIM)h;)TWSBP|lNLPq-g-BP3bcIM) zh;)TWSBP|lNLPq-g-BP3bcIM)h;)TWSBP|lNLPq-g-Cxwq(33jpAhL!i1eq-|CITk zGXGQNKVbd?=09NmgI~?dnWMx9a^|sg8{N^_{6Nmw%r4`PdCeYU`=tDVoH0E>4^jQ? zUd?oPO&9Gk(?54S=01_$C(`>wdY?$|!@zw-dX%_Nr1!T-SeImUt2JEL6>3uO^^ZTg& ze!0enXbZJS?~4Ibqy0V%+=qetV!)0w67%;JscD49TK|19VEQR)wBHv4rbhdHF`(b& z?B7?6Hnte=bN25m#^uBVVthc14~X#rF+Na??gYHl=IuOw$a(xw5!w71^LCBmL(bZVibZ42 z+J}loYfvmU^R~tx5z9x!@)5CoL@XaEmiH1Lk%J!*%SVdEW-OME6pM|m4u7PxX5$Xp zMSEx;9iS(o|2UL!x*{6c35wAyGUeiibq;kSHD!#Y3Was0?~9@lY9LYEe8?2ANtE z4~gO-Q9P9Mk2PaaJQQ7~7R5uNct{iviQ*wqJS2*TMDdU)9umbvor~4PDp9Nw#VS#( z62&S}tP;g4QLGZhDp9Nw#VS#(62&S}tP;g4QLGZhDp9Nw#VS#(62&S}tP;g4QLGZh zDp9Nw#VS#(62&S}tP;g4QLGZhDp9Nv#Trqp5ycu&tP#Z;QLGWg8d0nf#Trqp5ycu& ztP#Z;QLGWg8d0nf#Trqp5ycu&tP#Z;QLGWg8d0nf#Trqp5ycu&tP#Z;QLGWg8d0nf z#UrA4L==yR;t^3iQWTF9j}*oCrM44$q$rl9wiA1#C~Rzb@kmkF*!Cxn=-Q9y+K=ek zkLcQu6r;Vy_9u_1*pH~#kEqy>6r;`C{^XHjd{=5au}4(1M^v*%RI^8l(caN^VviJ~ zjjftJqMAKYq?%Erno*=WrXsZ&t7hv&x=y6)M7mC->qNRvr0YbwPNeHZx=y6)M7mC- z>qNRvr0YbwPNeHZx=y6)M7mC->qNRvr0YbwPNeHZx=y6)M7mC->qNRvr0YbwPNeHZ zx=y6)M7mC->qNRvr0YbwL8Kc*xdxlNTeZ=hC~_?X-K3Yk%mMX5@|@JA(4he8WL$pq#==pL>dxl zNTeZ=hC~_?X-K3Yk%mMX5@|@JA(4he8WL$pq#==pL>dxlNTeZ=hC~_?X_H8sMA{_M zCXqIYw5dps5=}+=SZX_~rXsbm?ID|r)P8C^tEM8gdD~ev6{)H1teT3{)OJ=)MQUn0 zt0s{)iL|Lm?KrlxYARAw+gUXg=}>ArtEM6~wLEPqQd7&*rXsc9ea_gvSJF&enqIZ< zO*F4wL+w67^Xeq}8fqEclqdRKd7@R}NmHKavlE_d;>jkSY~sl#o@{dVH#z&8oc&GC z{w8OCle53c+27>sZ*ulGIs2QO{Y}pPCTD+>v%iTan|QK`C!3u8P0s!%XMdBkzscF( z@dH>{0{RwznaIf z9UR-iu^k-S!Lc12+rhCN9NWRM9UR-iu^k-S!Lc12+rhCN9NWRM9UR-iu^k-S!Lc12 z+rhCN9NWRM9UR-iu^k-S!Lc12+rhCN9NWRM9UR-iu^k-S!Lc12+rhCN9NWRM9UR-i zv7h10&v52vIP)`{*=2s0`CaCBe>IO|yEwLsW4k!Ei(|Vuwu@uCIJS#pyEwLsW4k!E zi(|Vuwu@uCIJS#pyEwLsW4k!Ei(|Vuwu@uCIJS#pyEwLsW4k!Ei(|Vuwu@uCIJS#p zyEwLsW4k!Ei(|Vuwu@uCIJS#pyEwLsV;|$p$2jvb&U}nBAM-9B^DZCrE+6wQAM-9B z^DZCrE+6wQdmLwvf-_HW=82qHO+1k^rrW6P=by+Ko3Z`; z6P$U1Gf(8qW6jt;;fb6vwSB@9Ib&-3`6oE@M9$a|`se_)s}oP;jJ@WmK2biAGp6?W z@rj%Jg z)b{^RmqlmmqlmM)nM0U4gqcH_IfR)*m^s9m zL!3FpnM0g8#F-)jIl`GEoH>#+tD3Pp zI7f2E)b48>$r)3tGe!~Bxg+RzQ&Q9F}3>|M{>q~ z%dQ(7$r&5lb%P@+@R6K3(%AOiM{-6gXH0GHeMAL5k~2289p;go(Glc~j({^qa>i!t zI>Rx}9OKL}&K%>+G0q(0%rVX!+G0q(0%rVX!+ zG0q(0%rVX!+G0q(0%rVX!+G0q(0%rVX!+G0q(0%rVYw8+X9S=k~hTR7YzD_c0+!r>MUx5&yCS=k~hTV!R6tZd|~Mva&^1w#dpBS=k~hTV!R6tZb2$EwZvjR<_8> z7FpRMD_dk`3x``|Ws9tA<4hZ8+Bnn3nKtaTVXqB)ZJcStUK?lHIMc?NHte-wuMK-` z*lWXH8)w=$(}uk^?6qO94SQ|aYr|d}_S&%5hP^iIwPCLfdu`Zj!(JQq+ECGkiZ)cV zp`r~HZK!BNMH?#Gu-AsYHqNwRuMK-0oax|92WL7s)4`bz&UA35gEJkR>EKKUXF533 z!I=)uba1AFGaa1i;7kW+Iylq8nGVi$aHfMZ9h~XlOb2H=IMczI4$gFNrh_vboax|9 z2WL7s)4`bz&UA35gEJkR>EKKUXF533!I=)uba1ANGhLkN;!GE3x;WFtnJ&(Bai)ti zU7YFSOc!UmIMcEcWmXSz7k#hEV7 zbaAGOGhLkN;!GE3x;WFtnJ&(Bai)tiU7YFSOc!UmIMcETQdXL>l(!ETQdXL>l(!YYt~}AI@T4zK^rQuz4De)tCj⪚K=}52GBBqmI1U3 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 array of values */ - private $headers = []; - /** @var array Map of lowercase header name => original name at registration */ - private $headerNames = []; - /** @var string */ - private $protocol; - /** @var StreamInterface */ - private $stream; - /** - * @param string $method HTTP method - * @param string|UriInterface $uri URI - * @param array $headers Request headers - * @param string|null|resource|StreamInterface $body Request body - * @param string $version Protocol version - */ - public function __construct($method, $uri, array $headers = [], $body = null, $version = '1.1') - { - if (!$uri instanceof UriInterface) { - $uri = new Uri($uri); - } - $this->method = $method; - $this->uri = $uri; - $this->setHeaders($headers); - $this->protocol = $version; - if (!$this->hasHeader('Host')) { - $this->updateHostFromUri(); - } - if ($body !== '' && $body !== null) { - $this->stream = Stream::create($body); - } - } - public function getRequestTarget() : string - { - if ($this->requestTarget !== null) { - return $this->requestTarget; - } - $target = $this->uri->getPath(); - if ($target == '') { - $target = '/'; - } - if ($this->uri->getQuery() != '') { - $target .= '?' . $this->uri->getQuery(); - } - return $target; - } - public function withRequestTarget(string $requestTarget) : RequestInterface - { - if (\preg_match('#\\s#', $requestTarget)) { - throw new \InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); - } - $new = clone $this; - $new->requestTarget = $requestTarget; - return $new; - } - public function getMethod() : string - { - return $this->method; - } - public function withMethod(string $method) : RequestInterface - { - $new = clone $this; - $new->method = $method; - return $new; - } - public function getUri() : UriInterface - { - return $this->uri; - } - public function withUri(UriInterface $uri, bool $preserveHost = \false) : RequestInterface - { - if ($uri === $this->uri) { - return $this; - } - $new = clone $this; - $new->uri = $uri; - if (!$preserveHost || !$this->hasHeader('Host')) { - $new->updateHostFromUri(); - } - return $new; - } - private function updateHostFromUri() - { - $host = $this->uri->getHost(); - if ($host == '') { - return; - } - if (($port = $this->uri->getPort()) !== null) { - $host .= ':' . $port; - } - if (isset($this->headerNames['host'])) { - $header = $this->headerNames['host']; - } else { - $header = 'Host'; - $this->headerNames['host'] = 'Host'; - } - // Ensure Host is the first header. - // See: http://tools.ietf.org/html/rfc7230#section-5.4 - $this->headers = [$header => [$host]] + $this->headers; - } - public function getProtocolVersion() : string - { - return $this->protocol; - } - public function withProtocolVersion(string $version) : MessageInterface - { - if ($this->protocol === $version) { - return $this; - } - $new = clone $this; - $new->protocol = $version; - return $new; - } - public function getHeaders() : array - { - return $this->headers; - } - public function hasHeader(string $header) : bool - { - return isset($this->headerNames[\strtolower($header)]); - } - public function getHeader(string $header) : array - { - $header = \strtolower($header); - if (!isset($this->headerNames[$header])) { - return []; - } - $header = $this->headerNames[$header]; - return $this->headers[$header]; - } - public function getHeaderLine(string $header) : string - { - return \implode(', ', $this->getHeader($header)); - } - public function withHeader(string $header, $value) : MessageInterface - { - if (!\is_array($value)) { - $value = [$value]; - } - $value = $this->trimHeaderValues($value); - $normalized = \strtolower($header); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - unset($new->headers[$new->headerNames[$normalized]]); - } - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - return $new; - } - public function withAddedHeader(string $header, $value) : MessageInterface - { - if (!\is_array($value)) { - $value = [$value]; - } - $value = $this->trimHeaderValues($value); - $normalized = \strtolower($header); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $new->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - } - return $new; - } - public function withoutHeader(string $header) : MessageInterface - { - $normalized = \strtolower($header); - if (!isset($this->headerNames[$normalized])) { - return $this; - } - $header = $this->headerNames[$normalized]; - $new = clone $this; - unset($new->headers[$header], $new->headerNames[$normalized]); - return $new; - } - public function getBody() : StreamInterface - { - if (!$this->stream) { - $this->stream = Stream::create(''); - $this->stream->rewind(); - } - return $this->stream; - } - public function withBody(StreamInterface $body) : MessageInterface - { - if ($body === $this->stream) { - return $this; - } - $new = clone $this; - $new->stream = $body; - return $new; - } - private function setHeaders(array $headers) - { - $this->headerNames = $this->headers = []; - foreach ($headers as $header => $value) { - if (!\is_array($value)) { - $value = [$value]; - } - $value = $this->trimHeaderValues($value); - $normalized = \strtolower($header); - if (isset($this->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $this->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $this->headerNames[$normalized] = $header; - $this->headers[$header] = $value; - } - } - } - /** - * Trims whitespace from the header values. - * - * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. - * - * header-field = field-name ":" OWS field-value OWS - * OWS = *( SP / HTAB ) - * - * @param string[] $values Header values - * - * @return string[] Trimmed header values - * - * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 - */ - private function trimHeaderValues(array $values) - { - return \array_map(function ($value) { - return \trim($value, " \t"); - }, $values); - } -} diff --git a/dependencies/mpdf/psr-http-message-shim/src/Response.php b/dependencies/mpdf/psr-http-message-shim/src/Response.php deleted file mode 100644 index 1d5dabb..0000000 --- a/dependencies/mpdf/psr-http-message-shim/src/Response.php +++ /dev/null @@ -1,207 +0,0 @@ - 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required']; - /** @var string */ - private $reasonPhrase; - /** @var int */ - private $statusCode; - /** @var array Map of all registered headers, as original name => array of values */ - private $headers = []; - /** @var array Map of lowercase header name => original name at registration */ - private $headerNames = []; - /** @var string */ - private $protocol; - /** @var \Psr\Http\Message\StreamInterface */ - private $stream; - /** - * @param int $status Status code - * @param array $headers Response headers - * @param string|resource|StreamInterface|null $body Response body - * @param string $version Protocol version - * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) - */ - public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) - { - // If we got no body, defer initialization of the stream until Response::getBody() - if ('' !== $body && null !== $body) { - $this->stream = Stream::create($body); - } - $this->statusCode = $status; - $this->setHeaders($headers); - if (null === $reason && isset(self::$phrases[$this->statusCode])) { - $this->reasonPhrase = self::$phrases[$status]; - } else { - $this->reasonPhrase = isset($reason) ? $reason : ''; - } - $this->protocol = $version; - } - public function getStatusCode() : int - { - return $this->statusCode; - } - public function getReasonPhrase() : string - { - return $this->reasonPhrase; - } - public function withStatus(int $code, string $reasonPhrase = '') : ResponseInterface - { - if (!\is_int($code) && !\is_string($code)) { - throw new \InvalidArgumentException('Status code has to be an integer'); - } - $code = (int) $code; - if ($code < 100 || $code > 599) { - throw new \InvalidArgumentException(\sprintf('Status code has to be an integer between 100 and 599. A status code of %d was given', $code)); - } - $new = clone $this; - $new->statusCode = $code; - if ((null === $reasonPhrase || '' === $reasonPhrase) && isset(self::$phrases[$new->statusCode])) { - $reasonPhrase = self::$phrases[$new->statusCode]; - } - $new->reasonPhrase = $reasonPhrase; - return $new; - } - public function getProtocolVersion() : string - { - return $this->protocol; - } - public function withProtocolVersion(string $version) : MessageInterface - { - if ($this->protocol === $version) { - return $this; - } - $new = clone $this; - $new->protocol = $version; - return $new; - } - public function getHeaders() : array - { - return $this->headers; - } - public function hasHeader(string $header) : bool - { - return isset($this->headerNames[\strtolower($header)]); - } - public function getHeader(string $header) : array - { - $header = \strtolower($header); - if (!isset($this->headerNames[$header])) { - return []; - } - $header = $this->headerNames[$header]; - return $this->headers[$header]; - } - public function getHeaderLine(string $header) : string - { - return \implode(', ', $this->getHeader($header)); - } - public function withHeader(string $header, $value) : MessageInterface - { - if (!\is_array($value)) { - $value = [$value]; - } - $value = $this->trimHeaderValues($value); - $normalized = \strtolower($header); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - unset($new->headers[$new->headerNames[$normalized]]); - } - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - return $new; - } - public function withAddedHeader(string $header, $value) : MessageInterface - { - if (!\is_array($value)) { - $value = [$value]; - } - $value = $this->trimHeaderValues($value); - $normalized = \strtolower($header); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $new->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - } - return $new; - } - public function withoutHeader(string $header) : MessageInterface - { - $normalized = \strtolower($header); - if (!isset($this->headerNames[$normalized])) { - return $this; - } - $header = $this->headerNames[$normalized]; - $new = clone $this; - unset($new->headers[$header], $new->headerNames[$normalized]); - return $new; - } - public function getBody() : StreamInterface - { - if (!$this->stream) { - $this->stream = Stream::create(''); - } - return $this->stream; - } - public function withBody(StreamInterface $body) : MessageInterface - { - if ($body === $this->stream) { - return $this; - } - $new = clone $this; - $new->stream = $body; - return $new; - } - private function setHeaders(array $headers) - { - $this->headerNames = $this->headers = []; - foreach ($headers as $header => $value) { - if (!\is_array($value)) { - $value = [$value]; - } - $value = $this->trimHeaderValues($value); - $normalized = \strtolower($header); - if (isset($this->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $this->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $this->headerNames[$normalized] = $header; - $this->headers[$header] = $value; - } - } - } - /** - * Trims whitespace from the header values. - * - * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. - * - * header-field = field-name ":" OWS field-value OWS - * OWS = *( SP / HTAB ) - * - * @param string[] $values Header values - * - * @return string[] Trimmed header values - * - * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 - */ - private function trimHeaderValues(array $values) - { - return \array_map(function ($value) { - return \trim($value, " \t"); - }, $values); - } -} diff --git a/dependencies/mpdf/psr-http-message-shim/src/Stream.php b/dependencies/mpdf/psr-http-message-shim/src/Stream.php deleted file mode 100644 index 69d6a47..0000000 --- a/dependencies/mpdf/psr-http-message-shim/src/Stream.php +++ /dev/null @@ -1,209 +0,0 @@ - ['r' => \true, 'w+' => \true, 'r+' => \true, 'x+' => \true, 'c+' => \true, 'rb' => \true, 'w+b' => \true, 'r+b' => \true, 'x+b' => \true, 'c+b' => \true, 'rt' => \true, 'w+t' => \true, 'r+t' => \true, 'x+t' => \true, 'c+t' => \true, 'a+' => \true], 'write' => ['w' => \true, 'w+' => \true, 'rw' => \true, 'r+' => \true, 'x+' => \true, 'c+' => \true, 'wb' => \true, 'w+b' => \true, 'r+b' => \true, 'x+b' => \true, 'c+b' => \true, 'w+t' => \true, 'r+t' => \true, 'x+t' => \true, 'c+t' => \true, 'a' => \true, 'a+' => \true]]; - private function __construct() - { - } - /** - * @param resource $resource - * - * @return Stream - */ - public static function createFromResource($resource) - { - if (!\is_resource($resource)) { - throw new \InvalidArgumentException('Stream must be a resource'); - } - $obj = new self(); - $obj->stream = $resource; - $meta = \stream_get_meta_data($obj->stream); - $obj->seekable = $meta['seekable']; - $obj->readable = isset(self::$readWriteHash['read'][$meta['mode']]); - $obj->writable = isset(self::$readWriteHash['write'][$meta['mode']]); - $obj->uri = $obj->getMetadata('uri'); - return $obj; - } - /** - * @param string $content - * - * @return Stream - */ - public static function create($content) - { - $resource = \fopen('php://temp', 'rwb+'); - $stream = self::createFromResource($resource); - $stream->write($content); - $stream->seek(0); - return $stream; - } - /** - * Closes the stream when the destructed. - */ - public function __destruct() - { - $this->close(); - } - public function __toString() : string - { - try { - if ($this->isSeekable()) { - $this->seek(0); - } - return $this->getContents(); - } catch (\Exception $e) { - return ''; - } - } - public function close() : void - { - if (isset($this->stream)) { - if (\is_resource($this->stream)) { - \fclose($this->stream); - } - $this->detach(); - } - } - public function detach() - { - if (!isset($this->stream)) { - return; - } - $result = $this->stream; - unset($this->stream); - $this->size = $this->uri = null; - $this->readable = $this->writable = $this->seekable = \false; - return $result; - } - public function getSize() : ?int - { - if ($this->size !== null) { - return $this->size; - } - if (!isset($this->stream)) { - return null; - } - // Clear the stat cache if the stream has a URI - if ($this->uri) { - \clearstatcache(\true, $this->uri); - } - $stats = \fstat($this->stream); - if (isset($stats['size'])) { - $this->size = $stats['size']; - return $this->size; - } - return null; - } - public function tell() : int - { - $result = \ftell($this->stream); - if ($result === \false) { - throw new \RuntimeException('Unable to determine stream position'); - } - return $result; - } - public function eof() : bool - { - return !$this->stream || \feof($this->stream); - } - public function isSeekable() : bool - { - return $this->seekable; - } - public function seek(int $offset, int $whence = \SEEK_SET) : void - { - if (!$this->seekable) { - throw new \RuntimeException('Stream is not seekable'); - } - if (\fseek($this->stream, $offset, $whence) === -1) { - throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); - } - } - public function rewind() : void - { - $this->seek(0); - } - public function isWritable() : bool - { - return $this->writable; - } - public function write(string $string) : int - { - if (!$this->writable) { - throw new \RuntimeException('Cannot write to a non-writable stream'); - } - // We can't know the size after writing anything - $this->size = null; - $result = \fwrite($this->stream, $string); - if ($result === \false) { - throw new \RuntimeException('Unable to write to stream'); - } - return $result; - } - public function isReadable() : bool - { - return $this->readable; - } - public function read(int $length) : string - { - if (!$this->readable) { - throw new \RuntimeException('Cannot read from non-readable stream'); - } - return \fread($this->stream, $length); - } - public function getContents() : string - { - if (!isset($this->stream)) { - throw new \RuntimeException('Unable to read stream contents'); - } - $contents = \stream_get_contents($this->stream); - if ($contents === \false) { - throw new \RuntimeException('Unable to read stream contents'); - } - return $contents; - } - public function getMetadata(?string $key = null) : bool - { - if (!isset($this->stream)) { - return $key ? null : []; - } - if ($key === null) { - return \stream_get_meta_data($this->stream); - } - $meta = \stream_get_meta_data($this->stream); - return isset($meta[$key]) ? $meta[$key] : null; - } -} diff --git a/dependencies/mpdf/psr-http-message-shim/src/Uri.php b/dependencies/mpdf/psr-http-message-shim/src/Uri.php deleted file mode 100644 index 3bfe6cd..0000000 --- a/dependencies/mpdf/psr-http-message-shim/src/Uri.php +++ /dev/null @@ -1,240 +0,0 @@ - 80, 'https' => 443]; - const CHAR_UNRESERVED = 'a-zA-Z0-9_\\-\\.~'; - const CHAR_SUB_DELIMS = '!\\$&\'\\(\\)\\*\\+,;='; - /** @var string Uri scheme. */ - private $scheme = ''; - /** @var string Uri user info. */ - private $userInfo = ''; - /** @var string Uri host. */ - private $host = ''; - /** @var int|null Uri port. */ - private $port; - /** @var string Uri path. */ - private $path = ''; - /** @var string Uri query string. */ - private $query = ''; - /** @var string Uri fragment. */ - private $fragment = ''; - public function __construct($uri = '') - { - if ('' !== $uri) { - if (\false === ($parts = \parse_url($uri))) { - throw new \InvalidArgumentException(\sprintf('Unable to parse URI: "%s"', $uri)); - } - // Apply parse_url parts to a URI. - $this->scheme = isset($parts['scheme']) ? \strtr($parts['scheme'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; - $this->userInfo = isset($parts['user']) ? $parts['user'] : ''; - $this->host = isset($parts['host']) ? \strtr($parts['host'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; - $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; - $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; - $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; - $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; - if (isset($parts['pass'])) { - $this->userInfo .= ':' . $parts['pass']; - } - } - } - public function __toString() : string - { - return self::createUriString($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); - } - public function getScheme() : string - { - return $this->scheme; - } - public function getAuthority() : string - { - if ('' === $this->host) { - return ''; - } - $authority = $this->host; - if ('' !== $this->userInfo) { - $authority = $this->userInfo . '@' . $authority; - } - if (null !== $this->port) { - $authority .= ':' . $this->port; - } - return $authority; - } - public function getUserInfo() : string - { - return $this->userInfo; - } - public function getHost() : string - { - return $this->host; - } - public function getPort() : ?int - { - return $this->port; - } - public function getPath() : string - { - return $this->path; - } - public function getQuery() : string - { - return $this->query; - } - public function getFragment() : string - { - return $this->fragment; - } - public function withScheme(string $scheme) : UriInterface - { - if (!\is_string($scheme)) { - throw new \InvalidArgumentException('Scheme must be a string'); - } - if ($this->scheme === ($scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))) { - return $this; - } - $new = clone $this; - $new->scheme = $scheme; - $new->port = $new->filterPort($new->port); - return $new; - } - public function withUserInfo(string $user, ?string $password = null) : UriInterface - { - $info = $user; - if (null !== $password && '' !== $password) { - $info .= ':' . $password; - } - if ($this->userInfo === $info) { - return $this; - } - $new = clone $this; - $new->userInfo = $info; - return $new; - } - public function withHost(string $host) : UriInterface - { - if (!\is_string($host)) { - throw new \InvalidArgumentException('Host must be a string'); - } - if ($this->host === ($host = \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))) { - return $this; - } - $new = clone $this; - $new->host = $host; - return $new; - } - public function withPort(?int $port) : UriInterface - { - if ($this->port === ($port = $this->filterPort($port))) { - return $this; - } - $new = clone $this; - $new->port = $port; - return $new; - } - public function withPath(string $path) : UriInterface - { - if ($this->path === ($path = $this->filterPath($path))) { - return $this; - } - $new = clone $this; - $new->path = $path; - return $new; - } - public function withQuery(string $query) : UriInterface - { - if ($this->query === ($query = $this->filterQueryAndFragment($query))) { - return $this; - } - $new = clone $this; - $new->query = $query; - return $new; - } - public function withFragment(string $fragment) : UriInterface - { - if ($this->fragment === ($fragment = $this->filterQueryAndFragment($fragment))) { - return $this; - } - $new = clone $this; - $new->fragment = $fragment; - return $new; - } - /** - * Create a URI string from its various parts. - */ - private static function createUriString(string $scheme, string $authority, string $path, string $query, string $fragment) : string - { - $uri = ''; - if ('' !== $scheme) { - $uri .= $scheme . ':'; - } - if ('' !== $authority) { - $uri .= '//' . $authority; - } - if ('' !== $path) { - if ('/' !== $path[0]) { - if ('' !== $authority) { - // If the path is rootless and an authority is present, the path MUST be prefixed by "/" - $path = '/' . $path; - } - } elseif (isset($path[1]) && '/' === $path[1]) { - if ('' === $authority) { - // If the path is starting with more than one "/" and no authority is present, the - // starting slashes MUST be reduced to one. - $path = '/' . \ltrim($path, '/'); - } - } - $uri .= $path; - } - if ('' !== $query) { - $uri .= '?' . $query; - } - if ('' !== $fragment) { - $uri .= '#' . $fragment; - } - return $uri; - } - /** - * Is a given port non-standard for the current scheme? - */ - private static function isNonStandardPort(string $scheme, int $port) : bool - { - return !isset(self::$schemes[$scheme]) || $port !== self::$schemes[$scheme]; - } - private function filterPort(int $port) : ?int - { - if (null === $port) { - return null; - } - $port = (int) $port; - if (0 > $port || 0xffff < $port) { - throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); - } - return self::isNonStandardPort($this->scheme, $port) ? $port : null; - } - private function filterPath($path) - { - if (!\is_string($path)) { - throw new \InvalidArgumentException('Path must be a string'); - } - return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $path); - } - private function filterQueryAndFragment($str) - { - if (!\is_string($str)) { - throw new \InvalidArgumentException('Query and fragment must be a string'); - } - return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $str); - } - private static function rawurlencodeMatchZero(array $match) - { - return \rawurlencode($match[0]); - } -} diff --git a/dependencies/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php b/dependencies/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php deleted file mode 100644 index 0fbc2c5..0000000 --- a/dependencies/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php +++ /dev/null @@ -1,23 +0,0 @@ -logger = $logger; - if (\property_exists($this, 'services') && \is_array($this->services)) { - foreach ($this->services as $name) { - if ($this->{$name} && $this->{$name} instanceof \WP_Ultimo\Dependencies\Psr\Log\LoggerAwareInterface) { - $this->{$name}->setLogger($logger); - } - } - } - } -} diff --git a/dependencies/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php b/dependencies/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php deleted file mode 100644 index 10f83f1..0000000 --- a/dependencies/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php +++ /dev/null @@ -1,16 +0,0 @@ -logger = $logger; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/dependencies/myclabs/deep-copy/src/DeepCopy/DeepCopy.php deleted file mode 100644 index 4055c5e..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/DeepCopy.php +++ /dev/null @@ -1,240 +0,0 @@ - Filter, 'matcher' => Matcher] pairs. - */ - private $filters = []; - /** - * Type Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $typeFilters = []; - /** - * @var bool - */ - private $skipUncloneable = \false; - /** - * @var bool - */ - private $useCloneMethod; - /** - * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used - * instead of the regular deep cloning. - */ - public function __construct($useCloneMethod = \false) - { - $this->useCloneMethod = $useCloneMethod; - $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); - $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); - $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); - } - /** - * If enabled, will not throw an exception when coming across an uncloneable property. - * - * @param $skipUncloneable - * - * @return $this - */ - public function skipUncloneable($skipUncloneable = \true) - { - $this->skipUncloneable = $skipUncloneable; - return $this; - } - /** - * Deep copies the given object. - * - * @param mixed $object - * - * @return mixed - */ - public function copy($object) - { - $this->hashMap = []; - return $this->recursiveCopy($object); - } - public function addFilter(Filter $filter, Matcher $matcher) - { - $this->filters[] = ['matcher' => $matcher, 'filter' => $filter]; - } - public function prependFilter(Filter $filter, Matcher $matcher) - { - \array_unshift($this->filters, ['matcher' => $matcher, 'filter' => $filter]); - } - public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) - { - $this->typeFilters[] = ['matcher' => $matcher, 'filter' => $filter]; - } - private function recursiveCopy($var) - { - // Matches Type Filter - if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { - return $filter->apply($var); - } - // Resource - if (\is_resource($var)) { - return $var; - } - // Array - if (\is_array($var)) { - return $this->copyArray($var); - } - // Scalar - if (!\is_object($var)) { - return $var; - } - // Enum - if (\PHP_VERSION_ID >= 80100 && \enum_exists(\get_class($var))) { - return $var; - } - // Object - return $this->copyObject($var); - } - /** - * Copy an array - * @param array $array - * @return array - */ - private function copyArray(array $array) - { - foreach ($array as $key => $value) { - $array[$key] = $this->recursiveCopy($value); - } - return $array; - } - /** - * Copies an object. - * - * @param object $object - * - * @throws CloneException - * - * @return object - */ - private function copyObject($object) - { - $objectHash = \spl_object_hash($object); - if (isset($this->hashMap[$objectHash])) { - return $this->hashMap[$objectHash]; - } - $reflectedObject = new ReflectionObject($object); - $isCloneable = $reflectedObject->isCloneable(); - if (\false === $isCloneable) { - if ($this->skipUncloneable) { - $this->hashMap[$objectHash] = $object; - return $object; - } - throw new CloneException(\sprintf('The class "%s" is not cloneable.', $reflectedObject->getName())); - } - $newObject = clone $object; - $this->hashMap[$objectHash] = $newObject; - if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { - return $newObject; - } - if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { - return $newObject; - } - foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { - $this->copyObjectProperty($newObject, $property); - } - return $newObject; - } - private function copyObjectProperty($object, ReflectionProperty $property) - { - // Ignore static properties - if ($property->isStatic()) { - return; - } - // Apply the filters - foreach ($this->filters as $item) { - /** @var Matcher $matcher */ - $matcher = $item['matcher']; - /** @var Filter $filter */ - $filter = $item['filter']; - if ($matcher->matches($object, $property->getName())) { - $filter->apply($object, $property->getName(), function ($object) { - return $this->recursiveCopy($object); - }); - if ($filter instanceof ChainableFilter) { - continue; - } - // If a filter matches, we stop processing this property - return; - } - } - $property->setAccessible(\true); - // Ignore uninitialized properties (for PHP >7.4) - if (\method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { - return; - } - $propertyValue = $property->getValue($object); - // Copy the property - $property->setValue($object, $this->recursiveCopy($propertyValue)); - } - /** - * Returns first filter that matches variable, `null` if no such filter found. - * - * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and - * 'matcher' with value of type {@see TypeMatcher} - * @param mixed $var - * - * @return TypeFilter|null - */ - private function getFirstMatchedTypeFilter(array $filterRecords, $var) - { - $matched = $this->first($filterRecords, function (array $record) use($var) { - /* @var TypeMatcher $matcher */ - $matcher = $record['matcher']; - return $matcher->matches($var); - }); - return isset($matched) ? $matched['filter'] : null; - } - /** - * Returns first element that matches predicate, `null` if no such element found. - * - * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - * @param callable $predicate Predicate arguments are: element. - * - * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' - * with value of type {@see TypeMatcher} or `null`. - */ - private function first(array $elements, callable $predicate) - { - foreach ($elements as $element) { - if (\call_user_func($predicate, $element)) { - return $element; - } - } - return null; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php deleted file mode 100644 index 9c01dd3..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php +++ /dev/null @@ -1,8 +0,0 @@ -filter = $filter; - } - public function apply($object, $property, $objectCopier) - { - $this->filter->apply($object, $property, $objectCopier); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php deleted file mode 100644 index 696e0ad..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php +++ /dev/null @@ -1,27 +0,0 @@ -setAccessible(\true); - $oldCollection = $reflectionProperty->getValue($object); - $newCollection = $oldCollection->map(function ($item) use($objectCopier) { - return $objectCopier($item); - }); - $reflectionProperty->setValue($object, $newCollection); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php deleted file mode 100644 index 9365287..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php +++ /dev/null @@ -1,26 +0,0 @@ -setAccessible(\true); - $reflectionProperty->setValue($object, new ArrayCollection()); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php deleted file mode 100644 index 467715f..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php +++ /dev/null @@ -1,21 +0,0 @@ -__load(); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php deleted file mode 100644 index e6455d2..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php +++ /dev/null @@ -1,18 +0,0 @@ -callback = $callable; - } - /** - * Replaces the object property by the result of the callback called with the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - $reflectionProperty->setAccessible(\true); - $value = \call_user_func($this->callback, $reflectionProperty->getValue($object)); - $reflectionProperty->setValue($object, $value); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php deleted file mode 100644 index 4c17bb8..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php +++ /dev/null @@ -1,22 +0,0 @@ -setAccessible(\true); - $reflectionProperty->setValue($object, null); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php deleted file mode 100644 index bfc1a02..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php +++ /dev/null @@ -1,21 +0,0 @@ -class = $class; - $this->property = $property; - } - /** - * Matches a specific property of a specific class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $object instanceof $this->class && $property == $this->property; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php deleted file mode 100644 index 028fb07..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php +++ /dev/null @@ -1,30 +0,0 @@ -property = $property; - } - /** - * Matches a property by its name. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $property == $this->property; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php deleted file mode 100644 index b193e42..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php +++ /dev/null @@ -1,46 +0,0 @@ -propertyType = $propertyType; - } - /** - * {@inheritdoc} - */ - public function matches($object, $property) - { - try { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - } catch (ReflectionException $exception) { - return \false; - } - $reflectionProperty->setAccessible(\true); - // Uninitialized properties (for PHP >7.4) - if (\method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { - // null instanceof $this->propertyType - return \false; - } - return $reflectionProperty->getValue($object) instanceof $this->propertyType; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/dependencies/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php deleted file mode 100644 index 1b1f454..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php +++ /dev/null @@ -1,63 +0,0 @@ -getProperties() does not return private properties from ancestor classes. - * - * @author muratyaman@gmail.com - * @see http://php.net/manual/en/reflectionclass.getproperties.php - * - * @param ReflectionClass $ref - * - * @return ReflectionProperty[] - */ - public static function getProperties(ReflectionClass $ref) - { - $props = $ref->getProperties(); - $propsArr = array(); - foreach ($props as $prop) { - $propertyName = $prop->getName(); - $propsArr[$propertyName] = $prop; - } - if ($parentClass = $ref->getParentClass()) { - $parentPropsArr = self::getProperties($parentClass); - foreach ($propsArr as $key => $property) { - $parentPropsArr[$key] = $property; - } - return $parentPropsArr; - } - return $propsArr; - } - /** - * Retrieves property by name from object and all its ancestors. - * - * @param object|string $object - * @param string $name - * - * @throws PropertyException - * @throws ReflectionException - * - * @return ReflectionProperty - */ - public static function getProperty($object, $name) - { - $reflection = \is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); - if ($reflection->hasProperty($name)) { - return $reflection->getProperty($name); - } - if ($parentClass = $reflection->getParentClass()) { - return self::getProperty($parentClass->getName(), $name); - } - throw new PropertyException(\sprintf('The class "%s" doesn\'t have a property with the given name: "%s".', \is_object($object) ? \get_class($object) : $object, $name)); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php deleted file mode 100644 index 5b57d85..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php +++ /dev/null @@ -1,29 +0,0 @@ - $propertyValue) { - $copy->{$propertyName} = $propertyValue; - } - return $copy; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php deleted file mode 100644 index 83a1186..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php +++ /dev/null @@ -1,28 +0,0 @@ -callback = $callable; - } - /** - * {@inheritdoc} - */ - public function apply($element) - { - return \call_user_func($this->callback, $element); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php deleted file mode 100644 index 68e575b..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php +++ /dev/null @@ -1,17 +0,0 @@ -copier = $copier; - } - /** - * {@inheritdoc} - */ - public function apply($arrayObject) - { - $clone = clone $arrayObject; - foreach ($arrayObject->getArrayCopy() as $k => $v) { - $clone->offsetSet($k, $this->copier->copy($v)); - } - return $clone; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php deleted file mode 100644 index 2d772d5..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php +++ /dev/null @@ -1,10 +0,0 @@ -copier = $copier; - } - /** - * {@inheritdoc} - */ - public function apply($element) - { - $newElement = clone $element; - $copy = $this->createCopyClosure(); - return $copy($newElement); - } - private function createCopyClosure() - { - $copier = $this->copier; - $copy = function (SplDoublyLinkedList $list) use($copier) { - // Replace each element in the list with a deep copy of itself - for ($i = 1; $i <= $list->count(); $i++) { - $copy = $copier->recursiveCopy($list->shift()); - $list->push($copy); - } - return $list; - }; - return Closure::bind($copy, null, DeepCopy::class); - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php deleted file mode 100644 index 698c822..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php +++ /dev/null @@ -1,13 +0,0 @@ -type = $type; - } - /** - * @param mixed $element - * - * @return boolean - */ - public function matches($element) - { - return \is_object($element) ? \is_a($element, $this->type) : \gettype($element) === $this->type; - } -} diff --git a/dependencies/myclabs/deep-copy/src/DeepCopy/deep_copy.php b/dependencies/myclabs/deep-copy/src/DeepCopy/deep_copy.php deleted file mode 100644 index bc15d31..0000000 --- a/dependencies/myclabs/deep-copy/src/DeepCopy/deep_copy.php +++ /dev/null @@ -1,19 +0,0 @@ -copy($value); - } -} diff --git a/dependencies/nesbot/carbon/extension.neon b/dependencies/nesbot/carbon/extension.neon deleted file mode 100644 index 33bf794..0000000 --- a/dependencies/nesbot/carbon/extension.neon +++ /dev/null @@ -1,5 +0,0 @@ -services: - - - class: Carbon\PHPStan\MacroExtension - tags: - - phpstan.broker.methodsClassReflectionExtension diff --git a/dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php b/dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php deleted file mode 100644 index 244cc83..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\MessageFormatter; - -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -if (!\class_exists(LazyMessageFormatter::class, \false)) { - abstract class LazyMessageFormatter implements MessageFormatterInterface - { - public function format(string $message, string $locale, array $parameters = []) : string - { - return $this->formatter->format($message, $this->transformLocale($locale), $parameters); - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php b/dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php deleted file mode 100644 index 5e5bdc5..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\MessageFormatter; - -use Symfony\Component\Translation\Formatter\ChoiceMessageFormatterInterface; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -if (!\class_exists(LazyMessageFormatter::class, \false)) { - abstract class LazyMessageFormatter implements MessageFormatterInterface, ChoiceMessageFormatterInterface - { - protected abstract function transformLocale(?string $locale) : ?string; - public function format($message, $locale, array $parameters = []) - { - return $this->formatter->format($message, $this->transformLocale($locale), $parameters); - } - public function choiceFormat($message, $number, $locale, array $parameters = []) - { - return $this->formatter->choiceFormat($message, $number, $locale, $parameters); - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php b/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php deleted file mode 100644 index fd44fd3..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection; -use ReflectionMethod; -if (!\class_exists(AbstractReflectionMacro::class, \false)) { - abstract class AbstractReflectionMacro extends AbstractMacro - { - /** - * {@inheritdoc} - */ - public function getReflection() : ?ReflectionMethod - { - if ($this->reflectionFunction instanceof Reflection\ReflectionMethod) { - return new Reflection\Adapter\ReflectionMethod($this->reflectionFunction); - } - return $this->reflectionFunction instanceof ReflectionMethod ? $this->reflectionFunction : null; - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php b/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php deleted file mode 100644 index 5cec4e6..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection; -use ReflectionMethod; -if (!\class_exists(AbstractReflectionMacro::class, \false)) { - abstract class AbstractReflectionMacro extends AbstractMacro - { - /** - * {@inheritdoc} - */ - public function getReflection() : ?Reflection\Adapter\ReflectionMethod - { - if ($this->reflectionFunction instanceof Reflection\Adapter\ReflectionMethod) { - return $this->reflectionFunction; - } - if ($this->reflectionFunction instanceof Reflection\ReflectionMethod) { - return new Reflection\Adapter\ReflectionMethod($this->reflectionFunction); - } - return $this->reflectionFunction instanceof ReflectionMethod ? new Reflection\Adapter\ReflectionMethod(Reflection\ReflectionMethod::createFromName($this->reflectionFunction->getDeclaringClass()->getName(), $this->reflectionFunction->getName())) : null; - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php b/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php deleted file mode 100644 index a547c4c..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -if (!\class_exists(LazyMacro::class, \false)) { - abstract class LazyMacro extends AbstractReflectionMacro - { - /** - * {@inheritdoc} - */ - public function getFileName() : ?string - { - $file = $this->reflectionFunction->getFileName(); - return (($file ? \realpath($file) : null) ?: $file) ?: null; - } - /** - * {@inheritdoc} - */ - public function getStartLine() : ?int - { - return $this->reflectionFunction->getStartLine(); - } - /** - * {@inheritdoc} - */ - public function getEndLine() : ?int - { - return $this->reflectionFunction->getEndLine(); - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php b/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php deleted file mode 100644 index c6d7b39..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -if (!\class_exists(LazyMacro::class, \false)) { - abstract class LazyMacro extends AbstractReflectionMacro - { - /** - * {@inheritdoc} - * - * @return string|false - */ - public function getFileName() - { - $file = $this->reflectionFunction->getFileName(); - return (($file ? \realpath($file) : null) ?: $file) ?: null; - } - /** - * {@inheritdoc} - * - * @return int|false - */ - public function getStartLine() - { - return $this->reflectionFunction->getStartLine(); - } - /** - * {@inheritdoc} - * - * @return int|false - */ - public function getEndLine() - { - return $this->reflectionFunction->getEndLine(); - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php b/dependencies/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php deleted file mode 100644 index 568e8c1..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use Symfony\Component\Translation\MessageCatalogueInterface; -if (!\class_exists(LazyTranslator::class, \false)) { - class LazyTranslator extends AbstractTranslator implements TranslatorStrongTypeInterface - { - public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null) : string - { - return $this->translate($id, $parameters, $domain, $locale); - } - public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages') - { - $messages = $this->getPrivateProperty($catalogue, 'messages'); - if (isset($messages[$domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id])) { - return $messages[$domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id]; - } - if (isset($messages[$domain][$id])) { - return $messages[$domain][$id]; - } - $fallbackCatalogue = $this->getPrivateProperty($catalogue, 'fallbackCatalogue'); - if ($fallbackCatalogue !== null) { - return $this->getFromCatalogue($fallbackCatalogue, $id, $domain); - } - return $id; - } - private function getPrivateProperty($instance, string $field) - { - return (function (string $field) { - return $this->{$field}; - })->call($instance, $field); - } - } -} diff --git a/dependencies/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php b/dependencies/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php deleted file mode 100644 index 076155c..0000000 --- a/dependencies/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -if (!\class_exists(LazyTranslator::class, \false)) { - class LazyTranslator extends AbstractTranslator - { - /** - * Returns the translation. - * - * @param string|null $id - * @param array $parameters - * @param string|null $domain - * @param string|null $locale - * - * @return string - */ - public function trans($id, array $parameters = [], $domain = null, $locale = null) - { - return $this->translate($id, $parameters, $domain, $locale); - } - } -} diff --git a/dependencies/nesbot/carbon/sponsors.php b/dependencies/nesbot/carbon/sponsors.php deleted file mode 100644 index 3e6fae7..0000000 --- a/dependencies/nesbot/carbon/sponsors.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -require_once __DIR__ . '/vendor/autoload.php'; -function getOpenCollectiveSponsors() : string -{ - $members = \json_decode(\file_get_contents('https://opencollective.com/carbon/members/all.json'), \true); - $sixMonthsAgo = CarbonImmutable::parse('now - 6 months')->format('Y-m-d h:i'); - $list = \array_filter($members, static function ($member) use($sixMonthsAgo) { - return ($member['lastTransactionAmount'] > 3 || $member['isActive']) && $member['role'] === 'BACKER' && $member['type'] !== 'USER' && ($member['totalAmountDonated'] > 100 || $member['lastTransactionAt'] > $sixMonthsAgo || $member['isActive'] && $member['lastTransactionAmount'] >= 30); - }); - $list = \array_map(static function (array $member) { - $createdAt = CarbonImmutable::parse($member['createdAt']); - $lastTransactionAt = CarbonImmutable::parse($member['lastTransactionAt']); - if ($createdAt->format('d H:i:s.u') > $lastTransactionAt->format('d H:i:s.u')) { - $createdAt = $createdAt->setDay($lastTransactionAt->day)->modify($lastTransactionAt->format('H:i:s.u')); - } - $monthlyContribution = (float) ($member['totalAmountDonated'] / \ceil($createdAt->floatDiffInMonths())); - if ($lastTransactionAt->isAfter('last month') && $member['lastTransactionAmount'] > $monthlyContribution) { - $monthlyContribution = (float) $member['lastTransactionAmount']; - } - $yearlyContribution = (float) ($member['totalAmountDonated'] / \max(1, $createdAt->floatDiffInYears())); - $status = null; - if ($monthlyContribution > 29) { - $status = 'sponsor'; - } elseif ($monthlyContribution > 3 || $yearlyContribution > 20) { - $status = 'backer'; - } elseif ($member['totalAmountDonated'] > 0) { - $status = 'helper'; - } - return \array_merge($member, ['star' => $monthlyContribution > 98 || $yearlyContribution > 500, 'status' => $status, 'monthlyContribution' => $monthlyContribution, 'yearlyContribution' => $yearlyContribution]); - }, $list); - \usort($list, static function (array $a, array $b) { - return $b['monthlyContribution'] <=> $a['monthlyContribution'] ?: $b['totalAmountDonated'] <=> $a['totalAmountDonated']; - }); - return \implode('', \array_map(static function (array $member) { - $href = \htmlspecialchars($member['website'] ?? $member['profile']); - $src = $member['image'] ?? \strtr($member['profile'], ['https://opencollective.com/' => 'https://images.opencollective.com/']) . '/avatar/256.png'; - [$x, $y] = @\getimagesize($src) ?: [0, 0]; - $validImage = $x && $y; - $src = $validImage ? \htmlspecialchars($src) : 'https://opencollective.com/static/images/default-guest-logo.svg'; - $height = 64; - $width = $validImage ? \round($x * $height / $y) : $height; - $href .= (\strpos($href, '?') === \false ? '?' : '&') . 'utm_source=opencollective&utm_medium=github&utm_campaign=Carbon'; - $title = \htmlspecialchars($member['description'] ?? null ?: $member['name']); - $alt = \htmlspecialchars($member['name']); - return "\n" . '' . '' . $alt . '' . ''; - }, $list)) . "\n"; -} -\file_put_contents('readme.md', \preg_replace_callback('/()[\\s\\S]+()/', static function (array $match) { - return $match[1] . getOpenCollectiveSponsors() . $match[2]; -}, \file_get_contents('readme.md'))); diff --git a/dependencies/nesbot/carbon/src/Carbon/AbstractTranslator.php b/dependencies/nesbot/carbon/src/Carbon/AbstractTranslator.php deleted file mode 100644 index 4e24847..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/AbstractTranslator.php +++ /dev/null @@ -1,323 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\MessageFormatter\MessageFormatterMapper; -use Closure; -use ReflectionException; -use ReflectionFunction; -use WP_Ultimo\Dependencies\Symfony\Component\Translation; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -use Symfony\Component\Translation\Loader\ArrayLoader; -abstract class AbstractTranslator extends Translation\Translator -{ - /** - * Translator singletons for each language. - * - * @var array - */ - protected static $singletons = []; - /** - * List of custom localized messages. - * - * @var array - */ - protected $messages = []; - /** - * List of custom directories that contain translation files. - * - * @var string[] - */ - protected $directories = []; - /** - * Set to true while constructing. - * - * @var bool - */ - protected $initializing = \false; - /** - * List of locales aliases. - * - * @var array - */ - protected $aliases = ['me' => 'sr_Latn_ME', 'scr' => 'sh']; - /** - * Return a singleton instance of Translator. - * - * @param string|null $locale optional initial locale ("en" - english by default) - * - * @return static - */ - public static function get($locale = null) - { - $locale = $locale ?: 'en'; - $key = static::class === Translator::class ? $locale : static::class . '|' . $locale; - if (!isset(static::$singletons[$key])) { - static::$singletons[$key] = new static($locale); - } - return static::$singletons[$key]; - } - public function __construct($locale, MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = \false) - { - parent::setLocale($locale); - $this->initializing = \true; - $this->directories = [__DIR__ . '/Lang']; - $this->addLoader('array', new ArrayLoader()); - parent::__construct($locale, new MessageFormatterMapper($formatter), $cacheDir, $debug); - $this->initializing = \false; - } - /** - * Returns the list of directories translation files are searched in. - * - * @return array - */ - public function getDirectories() : array - { - return $this->directories; - } - /** - * Set list of directories translation files are searched in. - * - * @param array $directories new directories list - * - * @return $this - */ - public function setDirectories(array $directories) - { - $this->directories = $directories; - return $this; - } - /** - * Add a directory to the list translation files are searched in. - * - * @param string $directory new directory - * - * @return $this - */ - public function addDirectory(string $directory) - { - $this->directories[] = $directory; - return $this; - } - /** - * Remove a directory from the list translation files are searched in. - * - * @param string $directory directory path - * - * @return $this - */ - public function removeDirectory(string $directory) - { - $search = \rtrim(\strtr($directory, '\\', '/'), '/'); - return $this->setDirectories(\array_filter($this->getDirectories(), function ($item) use($search) { - return \rtrim(\strtr($item, '\\', '/'), '/') !== $search; - })); - } - /** - * Reset messages of a locale (all locale if no locale passed). - * Remove custom messages and reload initial messages from matching - * file in Lang directory. - * - * @param string|null $locale - * - * @return bool - */ - public function resetMessages($locale = null) - { - if ($locale === null) { - $this->messages = []; - return \true; - } - foreach ($this->getDirectories() as $directory) { - $data = @(include \sprintf('%s/%s.php', \rtrim($directory, '\\/'), $locale)); - if ($data !== \false) { - $this->messages[$locale] = $data; - $this->addResource('array', $this->messages[$locale], $locale); - return \true; - } - } - return \false; - } - /** - * Returns the list of files matching a given locale prefix (or all if empty). - * - * @param string $prefix prefix required to filter result - * - * @return array - */ - public function getLocalesFiles($prefix = '') - { - $files = []; - foreach ($this->getDirectories() as $directory) { - $directory = \rtrim($directory, '\\/'); - foreach (\glob("{$directory}/{$prefix}*.php") as $file) { - $files[] = $file; - } - } - return \array_unique($files); - } - /** - * Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * - * @param string $prefix prefix required to filter result - * - * @return array - */ - public function getAvailableLocales($prefix = '') - { - $locales = []; - foreach ($this->getLocalesFiles($prefix) as $file) { - $locales[] = \substr($file, \strrpos($file, '/') + 1, -4); - } - return \array_unique(\array_merge($locales, \array_keys($this->messages))); - } - protected function translate(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null) : string - { - if ($domain === null) { - $domain = 'messages'; - } - $catalogue = $this->getCatalogue($locale); - $format = $this instanceof TranslatorStrongTypeInterface ? $this->getFromCatalogue($catalogue, (string) $id, $domain) : $this->getCatalogue($locale)->get((string) $id, $domain); - // @codeCoverageIgnore - if ($format instanceof Closure) { - // @codeCoverageIgnoreStart - try { - $count = (new ReflectionFunction($format))->getNumberOfRequiredParameters(); - } catch (ReflectionException $exception) { - $count = 0; - } - // @codeCoverageIgnoreEnd - return $format(...\array_values($parameters), ...\array_fill(0, \max(0, $count - \count($parameters)), null)); - } - return parent::trans($id, $parameters, $domain, $locale); - } - /** - * Init messages language from matching file in Lang directory. - * - * @param string $locale - * - * @return bool - */ - protected function loadMessagesFromFile($locale) - { - return isset($this->messages[$locale]) || $this->resetMessages($locale); - } - /** - * Set messages of a locale and take file first if present. - * - * @param string $locale - * @param array $messages - * - * @return $this - */ - public function setMessages($locale, $messages) - { - $this->loadMessagesFromFile($locale); - $this->addResource('array', $messages, $locale); - $this->messages[$locale] = \array_merge($this->messages[$locale] ?? [], $messages); - return $this; - } - /** - * Set messages of the current locale and take file first if present. - * - * @param array $messages - * - * @return $this - */ - public function setTranslations($messages) - { - return $this->setMessages($this->getLocale(), $messages); - } - /** - * Get messages of a locale, if none given, return all the - * languages. - * - * @param string|null $locale - * - * @return array - */ - public function getMessages($locale = null) - { - return $locale === null ? $this->messages : $this->messages[$locale]; - } - /** - * Set the current translator locale and indicate if the source locale file exists - * - * @param string $locale locale ex. en - * - * @return bool - */ - public function setLocale($locale) - { - $locale = \preg_replace_callback('/[-_]([a-z]{2,}|\\d{2,})/', function ($matches) { - // _2-letters or YUE is a region, _3+-letters is a variant - $upper = \strtoupper($matches[1]); - if ($upper === 'YUE' || $upper === 'ISO' || \strlen($upper) < 3) { - return "_{$upper}"; - } - return '_' . \ucfirst($matches[1]); - }, \strtolower($locale)); - $previousLocale = $this->getLocale(); - if ($previousLocale === $locale && isset($this->messages[$locale])) { - return \true; - } - unset(static::$singletons[$previousLocale]); - if ($locale === 'auto') { - $completeLocale = \setlocale(\LC_TIME, '0'); - $locale = \preg_replace('/^([^_.-]+).*$/', '$1', $completeLocale); - $locales = $this->getAvailableLocales($locale); - $completeLocaleChunks = \preg_split('/[_.-]+/', $completeLocale); - $getScore = function ($language) use($completeLocaleChunks) { - return self::compareChunkLists($completeLocaleChunks, \preg_split('/[_.-]+/', $language)); - }; - \usort($locales, function ($first, $second) use($getScore) { - return $getScore($second) <=> $getScore($first); - }); - $locale = $locales[0]; - } - if (isset($this->aliases[$locale])) { - $locale = $this->aliases[$locale]; - } - // If subtag (ex: en_CA) first load the macro (ex: en) to have a fallback - if (\str_contains($locale, '_') && $this->loadMessagesFromFile($macroLocale = \preg_replace('/^([^_]+).*$/', '$1', $locale))) { - parent::setLocale($macroLocale); - } - if (!$this->loadMessagesFromFile($locale) && !$this->initializing) { - return \false; - } - parent::setLocale($locale); - return \true; - } - /** - * Show locale on var_dump(). - * - * @return array - */ - public function __debugInfo() - { - return ['locale' => $this->getLocale()]; - } - private static function compareChunkLists($referenceChunks, $chunks) - { - $score = 0; - foreach ($referenceChunks as $index => $chunk) { - if (!isset($chunks[$index])) { - $score++; - continue; - } - if (\strtolower($chunks[$index]) === \strtolower($chunk)) { - $score += 10; - } - } - return $score; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Carbon.php b/dependencies/nesbot/carbon/src/Carbon/Carbon.php deleted file mode 100644 index a4051f4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Carbon.php +++ /dev/null @@ -1,520 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\Traits\Date; -use WP_Ultimo\Dependencies\Carbon\Traits\DeprecatedProperties; -use DateTime; -use DateTimeInterface; -use DateTimeZone; -/** - * A simple API extension for DateTime. - * - * @mixin DeprecatedProperties - * - * - * - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $dayOfYear 1 through 366 - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property-read int $daysInMonth number of days in the given month - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $weeksInYear 51 through 53 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekOfMonth 1 through 5 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $daysInYear 365 or 366 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method $this years(int $value) Set current instance year to the given value. - * @method $this year(int $value) Set current instance year to the given value. - * @method $this setYears(int $value) Set current instance year to the given value. - * @method $this setYear(int $value) Set current instance year to the given value. - * @method $this months(int $value) Set current instance month to the given value. - * @method $this month(int $value) Set current instance month to the given value. - * @method $this setMonths(int $value) Set current instance month to the given value. - * @method $this setMonth(int $value) Set current instance month to the given value. - * @method $this days(int $value) Set current instance day to the given value. - * @method $this day(int $value) Set current instance day to the given value. - * @method $this setDays(int $value) Set current instance day to the given value. - * @method $this setDay(int $value) Set current instance day to the given value. - * @method $this hours(int $value) Set current instance hour to the given value. - * @method $this hour(int $value) Set current instance hour to the given value. - * @method $this setHours(int $value) Set current instance hour to the given value. - * @method $this setHour(int $value) Set current instance hour to the given value. - * @method $this minutes(int $value) Set current instance minute to the given value. - * @method $this minute(int $value) Set current instance minute to the given value. - * @method $this setMinutes(int $value) Set current instance minute to the given value. - * @method $this setMinute(int $value) Set current instance minute to the given value. - * @method $this seconds(int $value) Set current instance second to the given value. - * @method $this second(int $value) Set current instance second to the given value. - * @method $this setSeconds(int $value) Set current instance second to the given value. - * @method $this setSecond(int $value) Set current instance second to the given value. - * @method $this millis(int $value) Set current instance millisecond to the given value. - * @method $this milli(int $value) Set current instance millisecond to the given value. - * @method $this setMillis(int $value) Set current instance millisecond to the given value. - * @method $this setMilli(int $value) Set current instance millisecond to the given value. - * @method $this milliseconds(int $value) Set current instance millisecond to the given value. - * @method $this millisecond(int $value) Set current instance millisecond to the given value. - * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. - * @method $this micros(int $value) Set current instance microsecond to the given value. - * @method $this micro(int $value) Set current instance microsecond to the given value. - * @method $this setMicros(int $value) Set current instance microsecond to the given value. - * @method $this setMicro(int $value) Set current instance microsecond to the given value. - * @method $this microseconds(int $value) Set current instance microsecond to the given value. - * @method $this microsecond(int $value) Set current instance microsecond to the given value. - * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method $this setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method $this addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method $this addYear() Add one year to the instance (using date interval). - * @method $this subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method $this subYear() Sub one year to the instance (using date interval). - * @method $this addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method $this addMonth() Add one month to the instance (using date interval). - * @method $this subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method $this subMonth() Sub one month to the instance (using date interval). - * @method $this addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method $this addDay() Add one day to the instance (using date interval). - * @method $this subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method $this subDay() Sub one day to the instance (using date interval). - * @method $this addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method $this addHour() Add one hour to the instance (using date interval). - * @method $this subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method $this subHour() Sub one hour to the instance (using date interval). - * @method $this addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method $this addMinute() Add one minute to the instance (using date interval). - * @method $this subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method $this subMinute() Sub one minute to the instance (using date interval). - * @method $this addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method $this addSecond() Add one second to the instance (using date interval). - * @method $this subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method $this subSecond() Sub one second to the instance (using date interval). - * @method $this addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMilli() Add one millisecond to the instance (using date interval). - * @method $this subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMilli() Sub one millisecond to the instance (using date interval). - * @method $this addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMillisecond() Add one millisecond to the instance (using date interval). - * @method $this subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). - * @method $this addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicro() Add one microsecond to the instance (using date interval). - * @method $this subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicro() Sub one microsecond to the instance (using date interval). - * @method $this addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). - * @method $this subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method $this addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method $this addMillennium() Add one millennium to the instance (using date interval). - * @method $this subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method $this subMillennium() Sub one millennium to the instance (using date interval). - * @method $this addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method $this addCentury() Add one century to the instance (using date interval). - * @method $this subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method $this subCentury() Sub one century to the instance (using date interval). - * @method $this addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method $this addDecade() Add one decade to the instance (using date interval). - * @method $this subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method $this subDecade() Sub one decade to the instance (using date interval). - * @method $this addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method $this addQuarter() Add one quarter to the instance (using date interval). - * @method $this subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method $this subQuarter() Sub one quarter to the instance (using date interval). - * @method $this addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method $this addWeek() Add one week to the instance (using date interval). - * @method $this subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method $this subWeek() Sub one week to the instance (using date interval). - * @method $this addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method $this addWeekday() Add one weekday to the instance (using date interval). - * @method $this subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method $this subWeekday() Sub one weekday to the instance (using date interval). - * @method $this addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMicro() Add one microsecond to the instance (using timestamp). - * @method $this subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method $this addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMicrosecond() Add one microsecond to the instance (using timestamp). - * @method $this subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method $this addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMilli() Add one millisecond to the instance (using timestamp). - * @method $this subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method $this addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMillisecond() Add one millisecond to the instance (using timestamp). - * @method $this subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method $this addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method $this addRealSecond() Add one second to the instance (using timestamp). - * @method $this subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method $this subRealSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method $this addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMinute() Add one minute to the instance (using timestamp). - * @method $this subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method $this addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method $this addRealHour() Add one hour to the instance (using timestamp). - * @method $this subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method $this subRealHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method $this addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method $this addRealDay() Add one day to the instance (using timestamp). - * @method $this subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method $this subRealDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method $this addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method $this addRealWeek() Add one week to the instance (using timestamp). - * @method $this subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method $this subRealWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method $this addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMonth() Add one month to the instance (using timestamp). - * @method $this subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method $this addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method $this addRealQuarter() Add one quarter to the instance (using timestamp). - * @method $this subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method $this subRealQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method $this addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method $this addRealYear() Add one year to the instance (using timestamp). - * @method $this subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method $this subRealYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method $this addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method $this addRealDecade() Add one decade to the instance (using timestamp). - * @method $this subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method $this subRealDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method $this addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method $this addRealCentury() Add one century to the instance (using timestamp). - * @method $this subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method $this subRealCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method $this addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method $this addRealMillennium() Add one millennium to the instance (using timestamp). - * @method $this subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method $this subRealMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method static static|false createFromFormat(string $format, string $time, DateTimeZone|string|false|null $timezone = null) Parse a string into a new Carbon object according to the specified format. - * @method static static __set_state(array $array) https://php.net/manual/en/datetime.set-state.php - * - * - */ -class Carbon extends DateTime implements CarbonInterface -{ - use Date; - /** - * Returns true if the current class/instance is mutable. - * - * @return bool - */ - public static function isMutable() - { - return \true; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonConverterInterface.php b/dependencies/nesbot/carbon/src/Carbon/CarbonConverterInterface.php deleted file mode 100644 index 7ce101e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonConverterInterface.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use DateTimeInterface; -interface CarbonConverterInterface -{ - public function convertDate(DateTimeInterface $dateTime, bool $negated = \false) : CarbonInterface; -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonImmutable.php b/dependencies/nesbot/carbon/src/Carbon/CarbonImmutable.php deleted file mode 100644 index 10e9c74..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonImmutable.php +++ /dev/null @@ -1,569 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\Traits\Date; -use WP_Ultimo\Dependencies\Carbon\Traits\DeprecatedProperties; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -/** - * A simple API extension for DateTimeImmutable. - * - * @mixin DeprecatedProperties - * - * - * - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $dayOfYear 1 through 366 - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property-read int $daysInMonth number of days in the given month - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $weeksInYear 51 through 53 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekOfMonth 1 through 5 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $daysInYear 365 or 366 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method CarbonImmutable years(int $value) Set current instance year to the given value. - * @method CarbonImmutable year(int $value) Set current instance year to the given value. - * @method CarbonImmutable setYears(int $value) Set current instance year to the given value. - * @method CarbonImmutable setYear(int $value) Set current instance year to the given value. - * @method CarbonImmutable months(int $value) Set current instance month to the given value. - * @method CarbonImmutable month(int $value) Set current instance month to the given value. - * @method CarbonImmutable setMonths(int $value) Set current instance month to the given value. - * @method CarbonImmutable setMonth(int $value) Set current instance month to the given value. - * @method CarbonImmutable days(int $value) Set current instance day to the given value. - * @method CarbonImmutable day(int $value) Set current instance day to the given value. - * @method CarbonImmutable setDays(int $value) Set current instance day to the given value. - * @method CarbonImmutable setDay(int $value) Set current instance day to the given value. - * @method CarbonImmutable hours(int $value) Set current instance hour to the given value. - * @method CarbonImmutable hour(int $value) Set current instance hour to the given value. - * @method CarbonImmutable setHours(int $value) Set current instance hour to the given value. - * @method CarbonImmutable setHour(int $value) Set current instance hour to the given value. - * @method CarbonImmutable minutes(int $value) Set current instance minute to the given value. - * @method CarbonImmutable minute(int $value) Set current instance minute to the given value. - * @method CarbonImmutable setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonImmutable setMinute(int $value) Set current instance minute to the given value. - * @method CarbonImmutable seconds(int $value) Set current instance second to the given value. - * @method CarbonImmutable second(int $value) Set current instance second to the given value. - * @method CarbonImmutable setSeconds(int $value) Set current instance second to the given value. - * @method CarbonImmutable setSecond(int $value) Set current instance second to the given value. - * @method CarbonImmutable millis(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable milli(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable micros(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable micro(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addYear() Add one year to the instance (using date interval). - * @method CarbonImmutable subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subYear() Sub one year to the instance (using date interval). - * @method CarbonImmutable addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMonth() Add one month to the instance (using date interval). - * @method CarbonImmutable subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMonth() Sub one month to the instance (using date interval). - * @method CarbonImmutable addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addDay() Add one day to the instance (using date interval). - * @method CarbonImmutable subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subDay() Sub one day to the instance (using date interval). - * @method CarbonImmutable addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addHour() Add one hour to the instance (using date interval). - * @method CarbonImmutable subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subHour() Sub one hour to the instance (using date interval). - * @method CarbonImmutable addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMinute() Add one minute to the instance (using date interval). - * @method CarbonImmutable subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMinute() Sub one minute to the instance (using date interval). - * @method CarbonImmutable addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addSecond() Add one second to the instance (using date interval). - * @method CarbonImmutable subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subSecond() Sub one second to the instance (using date interval). - * @method CarbonImmutable addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonImmutable subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonImmutable addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonImmutable subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonImmutable addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonImmutable subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonImmutable addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonImmutable subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonImmutable addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonImmutable subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonImmutable addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addCentury() Add one century to the instance (using date interval). - * @method CarbonImmutable subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subCentury() Sub one century to the instance (using date interval). - * @method CarbonImmutable addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addDecade() Add one decade to the instance (using date interval). - * @method CarbonImmutable subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subDecade() Sub one decade to the instance (using date interval). - * @method CarbonImmutable addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonImmutable subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonImmutable addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addWeek() Add one week to the instance (using date interval). - * @method CarbonImmutable subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subWeek() Sub one week to the instance (using date interval). - * @method CarbonImmutable addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonImmutable subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonImmutable addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonImmutable subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method CarbonImmutable addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonImmutable subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method CarbonImmutable addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonImmutable subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method CarbonImmutable addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonImmutable subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method CarbonImmutable addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealSecond() Add one second to the instance (using timestamp). - * @method CarbonImmutable subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method CarbonImmutable addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMinute() Add one minute to the instance (using timestamp). - * @method CarbonImmutable subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method CarbonImmutable addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealHour() Add one hour to the instance (using timestamp). - * @method CarbonImmutable subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method CarbonImmutable addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealDay() Add one day to the instance (using timestamp). - * @method CarbonImmutable subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method CarbonImmutable addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealWeek() Add one week to the instance (using timestamp). - * @method CarbonImmutable subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method CarbonImmutable addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMonth() Add one month to the instance (using timestamp). - * @method CarbonImmutable subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method CarbonImmutable addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonImmutable subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method CarbonImmutable addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealYear() Add one year to the instance (using timestamp). - * @method CarbonImmutable subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method CarbonImmutable addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealDecade() Add one decade to the instance (using timestamp). - * @method CarbonImmutable subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method CarbonImmutable addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealCentury() Add one century to the instance (using timestamp). - * @method CarbonImmutable subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method CarbonImmutable addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addRealMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonImmutable subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subRealMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method CarbonImmutable roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonImmutable roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonImmutable floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonImmutable floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonImmutable ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonImmutable ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonImmutable roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonImmutable roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonImmutable floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonImmutable floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonImmutable ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonImmutable ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonImmutable roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonImmutable roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonImmutable floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonImmutable floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonImmutable ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonImmutable ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonImmutable roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonImmutable roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonImmutable floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonImmutable floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonImmutable ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonImmutable ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonImmutable roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonImmutable roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonImmutable floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonImmutable floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonImmutable ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonImmutable ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonImmutable roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonImmutable roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonImmutable floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonImmutable floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonImmutable ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonImmutable ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonImmutable roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonImmutable roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonImmutable floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonImmutable floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonImmutable ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonImmutable ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonImmutable roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonImmutable roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonImmutable floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonImmutable floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonImmutable ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonImmutable ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonImmutable roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonImmutable roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonImmutable floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonImmutable floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonImmutable ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonImmutable ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonImmutable roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonImmutable roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonImmutable floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonImmutable floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonImmutable ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonImmutable ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonImmutable roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonImmutable roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonImmutable floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonImmutable floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonImmutable ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonImmutable ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonImmutable roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonImmutable roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonImmutable floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonImmutable floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonImmutable ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonImmutable ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method static static|false createFromFormat(string $format, string $time, DateTimeZone|string|false|null $timezone = null) Parse a string into a new CarbonImmutable object according to the specified format. - * @method static static __set_state(array $array) https://php.net/manual/en/datetime.set-state.php - * - * - */ -class CarbonImmutable extends DateTimeImmutable implements CarbonInterface -{ - use Date { - __clone as dateTraitClone; - } - public function __clone() - { - $this->dateTraitClone(); - $this->endOfTime = \false; - $this->startOfTime = \false; - } - /** - * Create a very old date representing start of time. - * - * @return static - */ - public static function startOfTime() : self - { - $date = static::parse('0001-01-01')->years(self::getStartOfTimeYear()); - $date->startOfTime = \true; - return $date; - } - /** - * Create a very far date representing end of time. - * - * @return static - */ - public static function endOfTime() : self - { - $date = static::parse('9999-12-31 23:59:59.999999')->years(self::getEndOfTimeYear()); - $date->endOfTime = \true; - return $date; - } - /** - * @codeCoverageIgnore - */ - private static function getEndOfTimeYear() : int - { - if (\version_compare(\PHP_VERSION, '7.3.0-dev', '<')) { - return 145261681241552; - } - // Remove if https://bugs.php.net/bug.php?id=81107 is fixed - if (\version_compare(\PHP_VERSION, '8.1.0-dev', '>=')) { - return 1118290769066902787; - } - return \PHP_INT_MAX; - } - /** - * @codeCoverageIgnore - */ - private static function getStartOfTimeYear() : int - { - if (\version_compare(\PHP_VERSION, '7.3.0-dev', '<')) { - return -135908816449551; - } - // Remove if https://bugs.php.net/bug.php?id=81107 is fixed - if (\version_compare(\PHP_VERSION, '8.1.0-dev', '>=')) { - return -1118290769066898816; - } - return \max(\PHP_INT_MIN, -9223372036854773760); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonInterface.php b/dependencies/nesbot/carbon/src/Carbon/CarbonInterface.php deleted file mode 100644 index b6e3c51..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonInterface.php +++ /dev/null @@ -1,4763 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use BadMethodCallException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\BadComparisonUnitException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\ImmutableException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidDateException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidFormatException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownGetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownMethodException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownSetterException; -use Closure; -use DateInterval; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use JsonSerializable; -use ReflectionException; -use ReturnTypeWillChange; -use Symfony\Component\Translation\TranslatorInterface; -use Throwable; -/** - * Common interface for Carbon and CarbonImmutable. - * - * - * - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $dayOfYear 1 through 366 - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property-read int $daysInMonth number of days in the given month - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $weeksInYear 51 through 53 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekOfMonth 1 through 5 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $daysInYear 365 or 366 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method CarbonInterface years(int $value) Set current instance year to the given value. - * @method CarbonInterface year(int $value) Set current instance year to the given value. - * @method CarbonInterface setYears(int $value) Set current instance year to the given value. - * @method CarbonInterface setYear(int $value) Set current instance year to the given value. - * @method CarbonInterface months(int $value) Set current instance month to the given value. - * @method CarbonInterface month(int $value) Set current instance month to the given value. - * @method CarbonInterface setMonths(int $value) Set current instance month to the given value. - * @method CarbonInterface setMonth(int $value) Set current instance month to the given value. - * @method CarbonInterface days(int $value) Set current instance day to the given value. - * @method CarbonInterface day(int $value) Set current instance day to the given value. - * @method CarbonInterface setDays(int $value) Set current instance day to the given value. - * @method CarbonInterface setDay(int $value) Set current instance day to the given value. - * @method CarbonInterface hours(int $value) Set current instance hour to the given value. - * @method CarbonInterface hour(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. - * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface minute(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. - * @method CarbonInterface seconds(int $value) Set current instance second to the given value. - * @method CarbonInterface second(int $value) Set current instance second to the given value. - * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. - * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. - * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addYear() Add one year to the instance (using date interval). - * @method CarbonInterface subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subYear() Sub one year to the instance (using date interval). - * @method CarbonInterface addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMonth() Add one month to the instance (using date interval). - * @method CarbonInterface subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). - * @method CarbonInterface addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDay() Add one day to the instance (using date interval). - * @method CarbonInterface subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDay() Sub one day to the instance (using date interval). - * @method CarbonInterface addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addHour() Add one hour to the instance (using date interval). - * @method CarbonInterface subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). - * @method CarbonInterface addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). - * @method CarbonInterface subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). - * @method CarbonInterface addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addSecond() Add one second to the instance (using date interval). - * @method CarbonInterface subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). - * @method CarbonInterface addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonInterface subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonInterface addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addCentury() Add one century to the instance (using date interval). - * @method CarbonInterface subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). - * @method CarbonInterface addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). - * @method CarbonInterface subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). - * @method CarbonInterface addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonInterface subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonInterface addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeek() Add one week to the instance (using date interval). - * @method CarbonInterface subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). - * @method CarbonInterface addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonInterface subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonInterface addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method CarbonInterface addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method CarbonInterface addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method CarbonInterface addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method CarbonInterface addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealSecond() Add one second to the instance (using timestamp). - * @method CarbonInterface subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method CarbonInterface addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMinute() Add one minute to the instance (using timestamp). - * @method CarbonInterface subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method CarbonInterface addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealHour() Add one hour to the instance (using timestamp). - * @method CarbonInterface subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method CarbonInterface addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealDay() Add one day to the instance (using timestamp). - * @method CarbonInterface subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method CarbonInterface addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealWeek() Add one week to the instance (using timestamp). - * @method CarbonInterface subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method CarbonInterface addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMonth() Add one month to the instance (using timestamp). - * @method CarbonInterface subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method CarbonInterface addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonInterface subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method CarbonInterface addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealYear() Add one year to the instance (using timestamp). - * @method CarbonInterface subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method CarbonInterface addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealDecade() Add one decade to the instance (using timestamp). - * @method CarbonInterface subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method CarbonInterface addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealCentury() Add one century to the instance (using timestamp). - * @method CarbonInterface subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method CarbonInterface addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonInterface subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * - * - */ -interface CarbonInterface extends DateTimeInterface, JsonSerializable -{ - /** - * Diff wording options(expressed in octal). - */ - public const NO_ZERO_DIFF = 01; - public const JUST_NOW = 02; - public const ONE_DAY_WORDS = 04; - public const TWO_DAY_WORDS = 010; - public const SEQUENTIAL_PARTS_ONLY = 020; - public const ROUND = 040; - public const FLOOR = 0100; - public const CEIL = 0200; - /** - * Diff syntax options. - */ - public const DIFF_ABSOLUTE = 1; - // backward compatibility with true - public const DIFF_RELATIVE_AUTO = 0; - // backward compatibility with false - public const DIFF_RELATIVE_TO_NOW = 2; - public const DIFF_RELATIVE_TO_OTHER = 3; - /** - * Translate string options. - */ - public const TRANSLATE_MONTHS = 1; - public const TRANSLATE_DAYS = 2; - public const TRANSLATE_UNITS = 4; - public const TRANSLATE_MERIDIEM = 8; - public const TRANSLATE_DIFF = 0x10; - public const TRANSLATE_ALL = self::TRANSLATE_MONTHS | self::TRANSLATE_DAYS | self::TRANSLATE_UNITS | self::TRANSLATE_MERIDIEM | self::TRANSLATE_DIFF; - /** - * The day constants. - */ - public const SUNDAY = 0; - public const MONDAY = 1; - public const TUESDAY = 2; - public const WEDNESDAY = 3; - public const THURSDAY = 4; - public const FRIDAY = 5; - public const SATURDAY = 6; - /** - * The month constants. - * These aren't used by Carbon itself but exist for - * convenience sake alone. - */ - public const JANUARY = 1; - public const FEBRUARY = 2; - public const MARCH = 3; - public const APRIL = 4; - public const MAY = 5; - public const JUNE = 6; - public const JULY = 7; - public const AUGUST = 8; - public const SEPTEMBER = 9; - public const OCTOBER = 10; - public const NOVEMBER = 11; - public const DECEMBER = 12; - /** - * Number of X in Y. - */ - public const YEARS_PER_MILLENNIUM = 1000; - public const YEARS_PER_CENTURY = 100; - public const YEARS_PER_DECADE = 10; - public const MONTHS_PER_YEAR = 12; - public const MONTHS_PER_QUARTER = 3; - public const QUARTERS_PER_YEAR = 4; - public const WEEKS_PER_YEAR = 52; - public const WEEKS_PER_MONTH = 4; - public const DAYS_PER_YEAR = 365; - public const DAYS_PER_WEEK = 7; - public const HOURS_PER_DAY = 24; - public const MINUTES_PER_HOUR = 60; - public const SECONDS_PER_MINUTE = 60; - public const MILLISECONDS_PER_SECOND = 1000; - public const MICROSECONDS_PER_MILLISECOND = 1000; - public const MICROSECONDS_PER_SECOND = 1000000; - /** - * Special settings to get the start of week from current locale culture. - */ - public const WEEK_DAY_AUTO = 'auto'; - /** - * RFC7231 DateTime format. - * - * @var string - */ - public const RFC7231_FORMAT = 'D, d M Y H:i:s \\G\\M\\T'; - /** - * Default format to use for __toString method when type juggling occurs. - * - * @var string - */ - public const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s'; - /** - * Format for converting mocked time, includes microseconds. - * - * @var string - */ - public const MOCK_DATETIME_FORMAT = 'Y-m-d H:i:s.u'; - /** - * Pattern detection for ->isoFormat and ::createFromIsoFormat. - * - * @var string - */ - public const ISO_FORMAT_REGEXP = '(O[YMDHhms]|[Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY?|g{1,5}|G{1,5}|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?)'; - // - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws UnknownMethodException|BadMethodCallException|ReflectionException|Throwable - * - * @return mixed - */ - public function __call($method, $parameters); - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws BadMethodCallException - * - * @return mixed - */ - public static function __callStatic($method, $parameters); - /** - * Update constructedObjectId on cloned. - */ - public function __clone(); - /** - * Create a new Carbon instance. - * - * Please see the testing aids section (specifically static::setTestNow()) - * for more on the possibility of this constructor returning a test instance. - * - * @param DateTimeInterface|string|null $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - */ - public function __construct($time = null, $tz = null); - /** - * Show truthy properties on var_dump(). - * - * @return array - */ - public function __debugInfo(); - /** - * Get a part of the Carbon object - * - * @param string $name - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone|null - */ - public function __get($name); - /** - * Check if an attribute exists on the object - * - * @param string $name - * - * @return bool - */ - public function __isset($name); - /** - * Set a part of the Carbon object - * - * @param string $name - * @param string|int|DateTimeZone $value - * - * @throws UnknownSetterException|ReflectionException - * - * @return void - */ - public function __set($name, $value); - /** - * The __set_state handler. - * - * @param string|array $dump - * - * @return static - */ - #[ReturnTypeWillChange] - public static function __set_state($dump); - /** - * Returns the list of properties to dump on serialize() called on. - * - * Only used by PHP < 7.4. - * - * @return array - */ - public function __sleep(); - /** - * Format the instance as a string using the set format - * - * @example - * ``` - * echo Carbon::now(); // Carbon instances can be cast to string - * ``` - * - * @return string - */ - public function __toString(); - /** - * Add given units or interval to the current instance. - * - * @example $date->add('hour', 3) - * @example $date->add(15, 'days') - * @example $date->add(CarbonInterval::days(4)) - * - * @param string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function add($unit, $value = 1, $overflow = null); - /** - * Add seconds to the instance using timestamp. Positive $value travels - * forward while negative $value travels into the past. - * - * @param string $unit - * @param int $value - * - * @return static - */ - public function addRealUnit($unit, $value = 1); - /** - * Add given units to the current instance. - * - * @param string $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - public function addUnit($unit, $value = 1, $overflow = null); - /** - * Add any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to add to the input unit - * @param string $overflowUnit unit name to not overflow - * - * @return static - */ - public function addUnitNoOverflow($valueUnit, $value, $overflowUnit); - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function ago($syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Modify the current instance to the average of a given instance (default now) and the current instance - * (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date - * - * @return static - */ - public function average($date = null); - /** - * Clone the current instance if it's mutable. - * - * This method is convenient to ensure you don't mutate the initial object - * but avoid to make a useless copy of it if it's already immutable. - * - * @return static - */ - public function avoidMutation(); - /** - * Determines if the instance is between two others. - * - * The third argument allow you to specify if bounds are included or not (true by default) - * but for when you including/excluding bounds may produce different results in your application, - * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->between('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function between($date1, $date2, $equal = \true) : bool; - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenExcluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-25', '2018-08-01'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return bool - */ - public function betweenExcluded($date1, $date2) : bool; - /** - * Determines if the instance is between two others, bounds included. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenIncluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-25', '2018-08-01'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return bool - */ - public function betweenIncluded($date1, $date2) : bool; - /** - * Returns either day of week + time (e.g. "Last Friday at 3:30 PM") if reference time is within 7 days, - * or a calendar date (e.g. "10/29/2017") otherwise. - * - * Language, date and time formats will change according to the current locale. - * - * @param Carbon|\DateTimeInterface|string|null $referenceTime - * @param array $formats - * - * @return string - */ - public function calendar($referenceTime = null, array $formats = []); - /** - * Checks if the (date)time string is in a given format and valid to create a - * new instance. - * - * @example - * ``` - * Carbon::canBeCreatedFromFormat('11:12:45', 'h:i:s'); // true - * Carbon::canBeCreatedFromFormat('13:12:45', 'h:i:s'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function canBeCreatedFromFormat($date, $format); - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|DateTimeInterface|string|null $date - * - * @return static - */ - public function carbonize($date = null); - /** - * Cast the current instance into the given class. - * - * @param string $className The $className::instance() method will be called to cast the current object. - * - * @return DateTimeInterface - */ - public function cast(string $className); - /** - * Ceil the current instance second with given precision if specified. - * - * @param float|int|string|\DateInterval|null $precision - * - * @return CarbonInterface - */ - public function ceil($precision = 1); - /** - * Ceil the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int $precision - * - * @return CarbonInterface - */ - public function ceilUnit($unit, $precision = 1); - /** - * Ceil the current instance week. - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return CarbonInterface - */ - public function ceilWeek($weekStartsAt = null); - /** - * Similar to native modify() method of DateTime but can handle more grammars. - * - * @example - * ``` - * echo Carbon::now()->change('next 2pm'); - * ``` - * - * @link https://php.net/manual/en/datetime.modify.php - * - * @param string $modifier - * - * @return static|false - */ - public function change($modifier); - /** - * Cleanup properties attached to the public scope of DateTime when a dump of the date is requested. - * foreach ($date as $_) {} - * serializer($date) - * var_export($date) - * get_object_vars($date) - */ - public function cleanupDumpProperties(); - /** - * @alias copy - * - * Get a copy of the instance. - * - * @return static - */ - public function clone(); - /** - * Get the closest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function closest($date1, $date2); - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy(); - /** - * Create a new Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * @param DateTimeInterface|int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null); - /** - * Create a Carbon instance from just a date. The time portion is set to now. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromDate($year = null, $month = null, $day = null, $tz = null); - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - #[ReturnTypeWillChange] - public static function createFromFormat($format, $time, $tz = null); - /** - * Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $tz optional timezone - * @param string|null $locale locale to be used for LTS, LT, LL, LLL, etc. macro-formats (en by fault, unneeded if no such macro-format in use) - * @param \Symfony\Component\Translation\TranslatorInterface $translator optional custom translator to use for macro-formats - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null); - /** - * Create a Carbon instance from a specific format and a string in a given language. - * - * @param string $format Datetime format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function createFromLocaleFormat($format, $locale, $time, $tz = null); - /** - * Create a Carbon instance from a specific ISO format and a string in a given language. - * - * @param string $format Datetime ISO format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function createFromLocaleIsoFormat($format, $locale, $time, $tz = null); - /** - * Create a Carbon instance from just a time. The date portion is set to today. - * - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null); - /** - * Create a Carbon instance from a time string. The date portion is set to today. - * - * @param string $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromTimeString($time, $tz = null); - /** - * Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * @param \DateTimeZone|string|null $tz - * - * @return static - */ - public static function createFromTimestamp($timestamp, $tz = null); - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * @param \DateTimeZone|string|null $tz - * - * @return static - */ - public static function createFromTimestampMs($timestamp, $tz = null); - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * - * @return static - */ - public static function createFromTimestampMsUTC($timestamp); - /** - * Create a Carbon instance from an timestamp keeping the timezone to UTC. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * - * @return static - */ - public static function createFromTimestampUTC($timestamp); - /** - * Create a Carbon instance from just a date. The time portion is set to midnight. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createMidnightDate($year = null, $month = null, $day = null, $tz = null); - /** - * Create a new safe Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidDateException - * - * @return static|false - */ - public static function createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null); - /** - * Create a new Carbon instance from a specific date and time using strict validation. - * - * @see create() - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null); - /** - * Get/set the day of year. - * - * @param int|null $value new value for day of year if using as setter. - * - * @return static|int - */ - public function dayOfYear($value = null); - /** - * Get the difference as a CarbonInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return CarbonInterval - */ - public function diffAsCarbonInterval($date = null, $absolute = \true, array $skip = []); - /** - * Get the difference by the given interval using a filter closure. - * - * @param CarbonInterval $ci An interval to traverse by - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, $absolute = \true); - /** - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @example - * ``` - * echo Carbon::tomorrow()->diffForHumans() . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 2]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 3, 'join' => true]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday()) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday(), ['short' => true]) . "\n"; - * ``` - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'skip' entry, list of units to skip (array of strings or a single string, - * ` it can be the unit name (singular or plural) or its shortcut - * ` (y, m, w, d, h, min, s, ms, µs). - * - 'aUnit' entry, prefer "an hour" over "1 hour" if true - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * - 'minimumUnit' entry determines the smallest unit of time to display can be long or - * ` short form of the units, e.g. 'hour' or 'h' (default value: s) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function diffForHumans($other = null, $syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Get the difference in days rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInDays($date = null, $absolute = \true); - /** - * Get the difference in days using a filter closure rounded down. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInDaysFiltered(Closure $callback, $date = null, $absolute = \true); - /** - * Get the difference in hours rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInHours($date = null, $absolute = \true); - /** - * Get the difference in hours using a filter closure rounded down. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInHoursFiltered(Closure $callback, $date = null, $absolute = \true); - /** - * Get the difference in microseconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMicroseconds($date = null, $absolute = \true); - /** - * Get the difference in milliseconds rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMilliseconds($date = null, $absolute = \true); - /** - * Get the difference in minutes rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMinutes($date = null, $absolute = \true); - /** - * Get the difference in months rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMonths($date = null, $absolute = \true); - /** - * Get the difference in quarters rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInQuarters($date = null, $absolute = \true); - /** - * Get the difference in hours rounded down using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealHours($date = null, $absolute = \true); - /** - * Get the difference in microseconds using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealMicroseconds($date = null, $absolute = \true); - /** - * Get the difference in milliseconds rounded down using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealMilliseconds($date = null, $absolute = \true); - /** - * Get the difference in minutes rounded down using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealMinutes($date = null, $absolute = \true); - /** - * Get the difference in seconds using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealSeconds($date = null, $absolute = \true); - /** - * Get the difference in seconds rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInSeconds($date = null, $absolute = \true); - /** - * Get the difference in weekdays rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekdays($date = null, $absolute = \true); - /** - * Get the difference in weekend days using a filter rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekendDays($date = null, $absolute = \true); - /** - * Get the difference in weeks rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeeks($date = null, $absolute = \true); - /** - * Get the difference in years - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInYears($date = null, $absolute = \true); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * @param int $humanDiffOption - */ - public static function disableHumanDiffOption($humanDiffOption); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * @param int $humanDiffOption - */ - public static function enableHumanDiffOption($humanDiffOption); - /** - * Modify to end of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf('month') - * ->endOf('week', Carbon::FRIDAY); - * ``` - * - * @param string $unit - * @param array $params - * - * @return static - */ - public function endOf($unit, ...$params); - /** - * Resets the date to end of the century and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfCentury(); - * ``` - * - * @return static - */ - public function endOfCentury(); - /** - * Resets the time to 23:59:59.999999 end of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDay(); - * ``` - * - * @return static - */ - public function endOfDay(); - /** - * Resets the date to end of the decade and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDecade(); - * ``` - * - * @return static - */ - public function endOfDecade(); - /** - * Modify to end of current hour, minutes and seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfHour(); - * ``` - * - * @return static - */ - public function endOfHour(); - /** - * Resets the date to end of the millennium and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMillennium(); - * ``` - * - * @return static - */ - public function endOfMillennium(); - /** - * Modify to end of current minute, seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMinute(); - * ``` - * - * @return static - */ - public function endOfMinute(); - /** - * Resets the date to end of the month and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMonth(); - * ``` - * - * @return static - */ - public function endOfMonth(); - /** - * Resets the date to end of the quarter and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfQuarter(); - * ``` - * - * @return static - */ - public function endOfQuarter(); - /** - * Modify to end of current second, microseconds become 999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->endOfSecond() - * ->format('H:i:s.u'); - * ``` - * - * @return static - */ - public function endOfSecond(); - /** - * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek(Carbon::SATURDAY) . "\n"; - * ``` - * - * @param int $weekEndsAt optional start allow you to specify the day of week to use to end the week - * - * @return static - */ - public function endOfWeek($weekEndsAt = null); - /** - * Resets the date to end of the year and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfYear(); - * ``` - * - * @return static - */ - public function endOfYear(); - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->eq(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see equalTo() - * - * @return bool - */ - public function eq($date) : bool; - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function equalTo($date) : bool; - /** - * Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * - * @param string $locale locale ex. en - * @param callable $func - * - * @return mixed - */ - public static function executeWithLocale($locale, $func); - /** - * Get the farthest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function farthest($date1, $date2); - /** - * Modify to the first occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * first day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function firstOfMonth($dayOfWeek = null); - /** - * Modify to the first occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * first day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfQuarter($dayOfWeek = null); - /** - * Modify to the first occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * first day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfYear($dayOfWeek = null); - /** - * Get the difference in days as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInDays($date = null, $absolute = \true); - /** - * Get the difference in hours as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInHours($date = null, $absolute = \true); - /** - * Get the difference in minutes as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInMinutes($date = null, $absolute = \true); - /** - * Get the difference in months as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInMonths($date = null, $absolute = \true); - /** - * Get the difference in days as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealDays($date = null, $absolute = \true); - /** - * Get the difference in hours as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealHours($date = null, $absolute = \true); - /** - * Get the difference in minutes as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealMinutes($date = null, $absolute = \true); - /** - * Get the difference in months as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealMonths($date = null, $absolute = \true); - /** - * Get the difference in seconds as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealSeconds($date = null, $absolute = \true); - /** - * Get the difference in weeks as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealWeeks($date = null, $absolute = \true); - /** - * Get the difference in year as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealYears($date = null, $absolute = \true); - /** - * Get the difference in seconds as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInSeconds($date = null, $absolute = \true); - /** - * Get the difference in weeks as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInWeeks($date = null, $absolute = \true); - /** - * Get the difference in year as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInYears($date = null, $absolute = \true); - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|\DateInterval|null $precision - * - * @return CarbonInterface - */ - public function floor($precision = 1); - /** - * Truncate the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int $precision - * - * @return CarbonInterface - */ - public function floorUnit($unit, $precision = 1); - /** - * Truncate the current instance week. - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return CarbonInterface - */ - public function floorWeek($weekStartsAt = null); - /** - * Format the instance with the current locale. You can set the current - * locale using setlocale() https://php.net/setlocale. - * - * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. - * Use ->isoFormat() instead. - * Deprecated since 2.55.0 - * - * @param string $format - * - * @return string - */ - public function formatLocalized($format); - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function from($other = null, $syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Get the difference in a human readable format in the current locale from current - * instance to now. - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function fromNow($syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Create an instance from a serialized string. - * - * @param string $value - * - * @throws InvalidFormatException - * - * @return static - */ - public static function fromSerialized($value); - /** - * Register a custom macro. - * - * @param object|callable $macro - * @param int $priority marco with higher priority is tried first - * - * @return void - */ - public static function genericMacro($macro, $priority = 0); - /** - * Get a part of the Carbon object - * - * @param string $name - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone|null - */ - public function get($name); - /** - * Returns the alternative number for a given date property if available in the current locale. - * - * @param string $key date property - * - * @return string - */ - public function getAltNumber(string $key) : string; - /** - * Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * - * @return array - */ - public static function getAvailableLocales(); - /** - * Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * - * @return Language[] - */ - public static function getAvailableLocalesInfo(); - /** - * Returns list of calendar formats for ISO formatting. - * - * @param string|null $locale current locale used if null - * - * @return array - */ - public function getCalendarFormats($locale = null); - /** - * Get the days of the week - * - * @return array - */ - public static function getDays(); - /** - * Return the number of days since the start of the week (using the current locale or the first parameter - * if explicitly given). - * - * @param int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - * - * @return int - */ - public function getDaysFromStartOfWeek(?int $weekStartsAt = null) : int; - /** - * Get the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - * - * @return string|null - */ - public static function getFallbackLocale(); - /** - * List of replacements from date() format to isoFormat(). - * - * @return array - */ - public static function getFormatsToIsoReplacements(); - /** - * Return default humanDiff() options (merged flags as integer). - * - * @return int - */ - public static function getHumanDiffOptions(); - /** - * Returns list of locale formats for ISO formatting. - * - * @param string|null $locale current locale used if null - * - * @return array - */ - public function getIsoFormats($locale = null); - /** - * Returns list of locale units for ISO formatting. - * - * @return array - */ - public static function getIsoUnits(); - /** - * {@inheritdoc} - * - * @return array - */ - #[ReturnTypeWillChange] - public static function getLastErrors(); - /** - * Get the raw callable macro registered globally or locally for a given name. - * - * @param string $name - * - * @return callable|null - */ - public function getLocalMacro($name); - /** - * Get the translator of the current instance or the default if none set. - * - * @return \Symfony\Component\Translation\TranslatorInterface - */ - public function getLocalTranslator(); - /** - * Get the current translator locale. - * - * @return string - */ - public static function getLocale(); - /** - * Get the raw callable macro registered globally for a given name. - * - * @param string $name - * - * @return callable|null - */ - public static function getMacro($name); - /** - * get midday/noon hour - * - * @return int - */ - public static function getMidDayAt(); - /** - * Returns the offset hour and minute formatted with +/- and a given separator (":" by default). - * For example, if the time zone is 9 hours 30 minutes, you'll get "+09:30", with "@@" as first - * argument, "+09@@30", with "" as first argument, "+0930". Negative offset will return something - * like "-12:00". - * - * @param string $separator string to place between hours and minutes (":" by default) - * - * @return string - */ - public function getOffsetString($separator = ':'); - /** - * Returns a unit of the instance padded with 0 by default or any other string if specified. - * - * @param string $unit Carbon unit name - * @param int $length Length of the output (2 by default) - * @param string $padString String to use for padding ("0" by default) - * @param int $padType Side(s) to pad (STR_PAD_LEFT by default) - * - * @return string - */ - public function getPaddedUnit($unit, $length = 2, $padString = '0', $padType = 0); - /** - * Returns a timestamp rounded with the given precision (6 by default). - * - * @example getPreciseTimestamp() 1532087464437474 (microsecond maximum precision) - * @example getPreciseTimestamp(6) 1532087464437474 - * @example getPreciseTimestamp(5) 153208746443747 (1/100000 second precision) - * @example getPreciseTimestamp(4) 15320874644375 (1/10000 second precision) - * @example getPreciseTimestamp(3) 1532087464437 (millisecond precision) - * @example getPreciseTimestamp(2) 153208746444 (1/100 second precision) - * @example getPreciseTimestamp(1) 15320874644 (1/10 second precision) - * @example getPreciseTimestamp(0) 1532087464 (second precision) - * @example getPreciseTimestamp(-1) 153208746 (10 second precision) - * @example getPreciseTimestamp(-2) 15320875 (100 second precision) - * - * @param int $precision - * - * @return float - */ - public function getPreciseTimestamp($precision = 6); - /** - * Returns current local settings. - * - * @return array - */ - public function getSettings(); - /** - * Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * - * @return Closure|static the current instance used for testing - */ - public static function getTestNow(); - /** - * Return a format from H:i to H:i:s.u according to given unit precision. - * - * @param string $unitPrecision "minute", "second", "millisecond" or "microsecond" - * - * @return string - */ - public static function getTimeFormatByPrecision($unitPrecision); - /** - * Returns the timestamp with millisecond precision. - * - * @return int - */ - public function getTimestampMs(); - /** - * Get the translation of the current week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "", "_short" or "_min" - * @param string|null $defaultValue default value if translation missing - * - * @return string - */ - public function getTranslatedDayName($context = null, $keySuffix = '', $defaultValue = null); - /** - * Get the translation of the current abbreviated week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * - * @return string - */ - public function getTranslatedMinDayName($context = null); - /** - * Get the translation of the current month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "" or "_short" - * @param string|null $defaultValue default value if translation missing - * - * @return string - */ - public function getTranslatedMonthName($context = null, $keySuffix = '', $defaultValue = null); - /** - * Get the translation of the current short week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * - * @return string - */ - public function getTranslatedShortDayName($context = null); - /** - * Get the translation of the current short month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * - * @return string - */ - public function getTranslatedShortMonthName($context = null); - /** - * Returns raw translation message for a given key. - * - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * @param \Symfony\Component\Translation\TranslatorInterface $translator an optional translator to use - * - * @return string - */ - public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null); - /** - * Returns raw translation message for a given key. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator the translator to use - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * - * @return string - */ - public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null); - /** - * Get the default translator instance in use. - * - * @return \Symfony\Component\Translation\TranslatorInterface - */ - public static function getTranslator(); - /** - * Get the last day of week - * - * @return int - */ - public static function getWeekEndsAt(); - /** - * Get the first day of week - * - * @return int - */ - public static function getWeekStartsAt(); - /** - * Get weekend days - * - * @return array - */ - public static function getWeekendDays(); - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function greaterThan($date) : bool; - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function greaterThanOrEqualTo($date) : bool; - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see greaterThan() - * - * @return bool - */ - public function gt($date) : bool; - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see greaterThanOrEqualTo() - * - * @return bool - */ - public function gte($date) : bool; - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function hasFormat($date, $format); - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true - * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function hasFormatWithModifiers($date, $format) : bool; - /** - * Checks if macro is registered globally or locally. - * - * @param string $name - * - * @return bool - */ - public function hasLocalMacro($name); - /** - * Return true if the current instance has its own translator. - * - * @return bool - */ - public function hasLocalTranslator(); - /** - * Checks if macro is registered globally. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro($name); - /** - * Determine if a time string will produce a relative date. - * - * @param string $time - * - * @return bool true if time match a relative date, false if absolute or invalid time string - */ - public static function hasRelativeKeywords($time); - /** - * Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * - * @return bool true if there is a test instance, otherwise false - */ - public static function hasTestNow(); - /** - * Create a Carbon instance from a DateTime one. - * - * @param DateTimeInterface $date - * - * @return static - */ - public static function instance($date); - /** - * Returns true if the current date matches the given string. - * - * @example - * ``` - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2018')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('Sunday')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('June')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:45')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:00')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12h')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3pm')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3am')); // false - * ``` - * - * @param string $tester day name, month name, hour, date, etc. as string - * - * @return bool - */ - public function is(string $tester); - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see greaterThan() - * - * @return bool - */ - public function isAfter($date) : bool; - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see lessThan() - * - * @return bool - */ - public function isBefore($date) : bool; - /** - * Determines if the instance is between two others - * - * @example - * ``` - * Carbon::parse('2018-07-25')->isBetween('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function isBetween($date1, $date2, $equal = \true) : bool; - /** - * Check if its the birthday. Compares the date/month values of the two dates. - * - * @example - * ``` - * Carbon::now()->subYears(5)->isBirthday(); // true - * Carbon::now()->subYears(5)->subDay()->isBirthday(); // false - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-05')); // true - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-06')); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day. - * - * @return bool - */ - public function isBirthday($date = null); - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::now()->isCurrentUnit('hour'); // true - * Carbon::now()->subHours(2)->isCurrentUnit('hour'); // false - * ``` - * - * @param string $unit The unit to test. - * - * @throws BadMethodCallException - * - * @return bool - */ - public function isCurrentUnit($unit); - /** - * Checks if this day is a specific day of the week. - * - * @example - * ``` - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::WEDNESDAY); // true - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::FRIDAY); // false - * Carbon::parse('2019-07-17')->isDayOfWeek('Wednesday'); // true - * Carbon::parse('2019-07-17')->isDayOfWeek('Friday'); // false - * ``` - * - * @param int $dayOfWeek - * - * @return bool - */ - public function isDayOfWeek($dayOfWeek); - /** - * Check if the instance is end of day. - * - * @example - * ``` - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:58.999999')->isEndOfDay(); // false - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(true); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(true); // false - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * - * @return bool - */ - public function isEndOfDay($checkMicroseconds = \false); - /** - * Returns true if the date was created using CarbonImmutable::endOfTime() - * - * @return bool - */ - public function isEndOfTime() : bool; - /** - * Determines if the instance is in the future, ie. greater (after) than now. - * - * @example - * ``` - * Carbon::now()->addHours(5)->isFuture(); // true - * Carbon::now()->subHours(5)->isFuture(); // false - * ``` - * - * @return bool - */ - public function isFuture(); - /** - * Returns true if the current class/instance is immutable. - * - * @return bool - */ - public static function isImmutable(); - /** - * Check if today is the last day of the Month - * - * @example - * ``` - * Carbon::parse('2019-02-28')->isLastOfMonth(); // true - * Carbon::parse('2019-03-28')->isLastOfMonth(); // false - * Carbon::parse('2019-03-30')->isLastOfMonth(); // false - * Carbon::parse('2019-03-31')->isLastOfMonth(); // true - * Carbon::parse('2019-04-30')->isLastOfMonth(); // true - * ``` - * - * @return bool - */ - public function isLastOfMonth(); - /** - * Determines if the instance is a leap year. - * - * @example - * ``` - * Carbon::parse('2020-01-01')->isLeapYear(); // true - * Carbon::parse('2019-01-01')->isLeapYear(); // false - * ``` - * - * @return bool - */ - public function isLeapYear(); - /** - * Determines if the instance is a long year (using ISO 8601 year). - * - * @example - * ``` - * Carbon::parse('2015-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-03')->isLongIsoYear(); // false - * Carbon::parse('2019-12-29')->isLongIsoYear(); // false - * Carbon::parse('2019-12-30')->isLongIsoYear(); // true - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - * - * @return bool - */ - public function isLongIsoYear(); - /** - * Determines if the instance is a long year (using calendar year). - * - * ⚠️ This method completely ignores month and day to use the numeric year number, - * it's not correct if the exact date matters. For instance as `2019-12-30` is already - * in the first week of the 2020 year, if you want to know from this date if ISO week - * year 2020 is a long year, use `isLongIsoYear` instead. - * - * @example - * ``` - * Carbon::create(2015)->isLongYear(); // true - * Carbon::create(2016)->isLongYear(); // false - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - * - * @return bool - */ - public function isLongYear(); - /** - * Check if the instance is midday. - * - * @example - * ``` - * Carbon::parse('2019-02-28 11:59:59.999999')->isMidday(); // false - * Carbon::parse('2019-02-28 12:00:00')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:00.999999')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:01')->isMidday(); // false - * ``` - * - * @return bool - */ - public function isMidday(); - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:01')->isMidnight(); // false - * ``` - * - * @return bool - */ - public function isMidnight(); - /** - * Returns true if a property can be changed via setter. - * - * @param string $unit - * - * @return bool - */ - public static function isModifiableUnit($unit); - /** - * Returns true if the current class/instance is mutable. - * - * @return bool - */ - public static function isMutable(); - /** - * Determines if the instance is in the past, ie. less (before) than now. - * - * @example - * ``` - * Carbon::now()->subHours(5)->isPast(); // true - * Carbon::now()->addHours(5)->isPast(); // false - * ``` - * - * @return bool - */ - public function isPast(); - /** - * Compares the formatted values of the two dates. - * - * @example - * ``` - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-12-13')); // true - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-06-14')); // false - * ``` - * - * @param string $format date formats to compare. - * @param \Carbon\Carbon|\DateTimeInterface|string|null $date instance to compare with or null to use current day. - * - * @return bool - */ - public function isSameAs($format, $date = null); - /** - * Checks if the passed in date is in the same month as the instance´s month. - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-01-01')); // true - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-02-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01'), false); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use the current date. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameMonth($date = null, $ofSameYear = \true); - /** - * Checks if the passed in date is in the same quarter as the instance quarter (and year if needed). - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-03-01')); // true - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-04-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01'), false); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|string|null $date The instance to compare with or null to use current day. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameQuarter($date = null, $ofSameYear = \true); - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::parse('2019-01-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // true - * Carbon::parse('2018-12-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // false - * ``` - * - * @param string $unit singular unit string - * @param \Carbon\Carbon|\DateTimeInterface|null $date instance to compare with or null to use current day. - * - * @throws BadComparisonUnitException - * - * @return bool - */ - public function isSameUnit($unit, $date = null); - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:01')->isStartOfDay(); // false - * Carbon::parse('2019-02-28 00:00:00.000000')->isStartOfDay(true); // true - * Carbon::parse('2019-02-28 00:00:00.000012')->isStartOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * - * @return bool - */ - public function isStartOfDay($checkMicroseconds = \false); - /** - * Returns true if the date was created using CarbonImmutable::startOfTime() - * - * @return bool - */ - public function isStartOfTime() : bool; - /** - * Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - * - * @return bool - */ - public static function isStrictModeEnabled(); - /** - * Determines if the instance is today. - * - * @example - * ``` - * Carbon::today()->isToday(); // true - * Carbon::tomorrow()->isToday(); // false - * ``` - * - * @return bool - */ - public function isToday(); - /** - * Determines if the instance is tomorrow. - * - * @example - * ``` - * Carbon::tomorrow()->isTomorrow(); // true - * Carbon::yesterday()->isTomorrow(); // false - * ``` - * - * @return bool - */ - public function isTomorrow(); - /** - * Determines if the instance is a weekday. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekday(); // false - * Carbon::parse('2019-07-15')->isWeekday(); // true - * ``` - * - * @return bool - */ - public function isWeekday(); - /** - * Determines if the instance is a weekend day. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekend(); // true - * Carbon::parse('2019-07-15')->isWeekend(); // false - * ``` - * - * @return bool - */ - public function isWeekend(); - /** - * Determines if the instance is yesterday. - * - * @example - * ``` - * Carbon::yesterday()->isYesterday(); // true - * Carbon::tomorrow()->isYesterday(); // false - * ``` - * - * @return bool - */ - public function isYesterday(); - /** - * Format in the current language using ISO replacement patterns. - * - * @param string $format - * @param string|null $originalFormat provide context if a chunk has been passed alone - * - * @return string - */ - public function isoFormat(string $format, ?string $originalFormat = null) : string; - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function isoWeek($week = null, $dayOfWeek = null, $dayOfYear = null); - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function isoWeekYear($year = null, $dayOfWeek = null, $dayOfYear = null); - /** - * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). - * - * @param int|null $value new value for weekday if using as setter. - * - * @return static|int - */ - public function isoWeekday($value = null); - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function isoWeeksInYear($dayOfWeek = null, $dayOfYear = null); - /** - * Prepare the object for JSON serialization. - * - * @return array|string - */ - #[ReturnTypeWillChange] - public function jsonSerialize(); - /** - * Modify to the last occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * last day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function lastOfMonth($dayOfWeek = null); - /** - * Modify to the last occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * last day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfQuarter($dayOfWeek = null); - /** - * Modify to the last occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * last day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfYear($dayOfWeek = null); - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function lessThan($date) : bool; - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function lessThanOrEqualTo($date) : bool; - /** - * Get/set the locale for the current instance. - * - * @param string|null $locale - * @param string ...$fallbackLocales - * - * @return $this|string - */ - public function locale(?string $locale = null, ...$fallbackLocales); - /** - * Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffOneDayWords($locale); - /** - * Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffSyntax($locale); - /** - * Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffTwoDayWords($locale); - /** - * Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasPeriodSyntax($locale); - /** - * Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasShortUnits($locale); - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see lessThan() - * - * @return bool - */ - public function lt($date) : bool; - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see lessThanOrEqualTo() - * - * @return bool - */ - public function lte($date) : bool; - /** - * Register a custom macro. - * - * @example - * ``` - * $userSettings = [ - * 'locale' => 'pt', - * 'timezone' => 'America/Sao_Paulo', - * ]; - * Carbon::macro('userFormat', function () use ($userSettings) { - * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); - * }); - * echo Carbon::yesterday()->hours(11)->userFormat(); - * ``` - * - * @param string $name - * @param object|callable $macro - * - * @return void - */ - public static function macro($name, $macro); - /** - * Make a Carbon instance from given variable if possible. - * - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * - * @param mixed $var - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function make($var); - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function max($date = null); - /** - * Create a Carbon instance for the greatest supported date. - * - * @return static - */ - public static function maxValue(); - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see max() - * - * @return static - */ - public function maximum($date = null); - /** - * Return the meridiem of the current time in the current locale. - * - * @param bool $isLower if true, returns lowercase variant if available in the current locale. - * - * @return string - */ - public function meridiem(bool $isLower = \false) : string; - /** - * Modify to midday, default to self::$midDayAt - * - * @return static - */ - public function midDay(); - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function min($date = null); - /** - * Create a Carbon instance for the lowest supported date. - * - * @return static - */ - public static function minValue(); - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see min() - * - * @return static - */ - public function minimum($date = null); - /** - * Mix another object into the class. - * - * @example - * ``` - * Carbon::mixin(new class { - * public function addMoon() { - * return function () { - * return $this->addDays(30); - * }; - * } - * public function subMoon() { - * return function () { - * return $this->subDays(30); - * }; - * } - * }); - * $fullMoon = Carbon::create('2018-12-22'); - * $nextFullMoon = $fullMoon->addMoon(); - * $blackMoon = Carbon::create('2019-01-06'); - * $previousBlackMoon = $blackMoon->subMoon(); - * echo "$nextFullMoon\n"; - * echo "$previousBlackMoon\n"; - * ``` - * - * @param object|string $mixin - * - * @throws ReflectionException - * - * @return void - */ - public static function mixin($mixin); - /** - * Calls \DateTime::modify if mutable or \DateTimeImmutable::modify else. - * - * @see https://php.net/manual/en/datetime.modify.php - * - * @return static|false - */ - #[ReturnTypeWillChange] - public function modify($modify); - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->ne(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see notEqualTo() - * - * @return bool - */ - public function ne($date) : bool; - /** - * Modify to the next occurrence of a given modifier such as a day of - * the week. If no modifier is provided, modify to the next occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static|false - */ - public function next($modifier = null); - /** - * Go forward to the next weekday. - * - * @return static - */ - public function nextWeekday(); - /** - * Go forward to the next weekend day. - * - * @return static - */ - public function nextWeekendDay(); - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function notEqualTo($date) : bool; - /** - * Get a Carbon instance for the current date and time. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function now($tz = null); - /** - * Returns a present instance in the same timezone. - * - * @return static - */ - public function nowWithSameTz(); - /** - * Modify to the given occurrence of a given day of the week - * in the current month. If the calculated occurrence is outside the scope - * of the current month, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfMonth($nth, $dayOfWeek); - /** - * Modify to the given occurrence of a given day of the week - * in the current quarter. If the calculated occurrence is outside the scope - * of the current quarter, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfQuarter($nth, $dayOfWeek); - /** - * Modify to the given occurrence of a given day of the week - * in the current year. If the calculated occurrence is outside the scope - * of the current year, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfYear($nth, $dayOfWeek); - /** - * Return a property with its ordinal. - * - * @param string $key - * @param string|null $period - * - * @return string - */ - public function ordinal(string $key, ?string $period = null) : string; - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @param string|DateTimeInterface|null $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function parse($time = null, $tz = null); - /** - * Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * - * @param string $time date/time string in the given language (may also contain English). - * @param string|null $locale if locale is null or not specified, current global locale will be - * used instead. - * @param DateTimeZone|string|null $tz optional timezone for the new instance. - * - * @throws InvalidFormatException - * - * @return static - */ - public static function parseFromLocale($time, $locale = null, $tz = null); - /** - * Returns standardized plural of a given singular/plural unit name (in English). - * - * @param string $unit - * - * @return string - */ - public static function pluralUnit(string $unit) : string; - /** - * Modify to the previous occurrence of a given modifier such as a day of - * the week. If no dayOfWeek is provided, modify to the previous occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static|false - */ - public function previous($modifier = null); - /** - * Go backward to the previous weekday. - * - * @return static - */ - public function previousWeekday(); - /** - * Go backward to the previous weekend day. - * - * @return static - */ - public function previousWeekendDay(); - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|null $end period end date - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - * - * @return CarbonPeriod - */ - public function range($end = null, $interval = null, $unit = null); - /** - * Call native PHP DateTime/DateTimeImmutable add() method. - * - * @param DateInterval $interval - * - * @return static - */ - public function rawAdd(DateInterval $interval); - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function rawCreateFromFormat($format, $time, $tz = null); - /** - * @see https://php.net/manual/en/datetime.format.php - * - * @param string $format - * - * @return string - */ - public function rawFormat($format); - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @param string|DateTimeInterface|null $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function rawParse($time = null, $tz = null); - /** - * Call native PHP DateTime/DateTimeImmutable sub() method. - * - * @param DateInterval $interval - * - * @return static - */ - public function rawSub(DateInterval $interval); - /** - * Remove all macros and generic macros. - */ - public static function resetMacros(); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetMonthsOverflow(); - /** - * Reset the format used to the default when type juggling a Carbon instance to a string - * - * @return void - */ - public static function resetToStringFormat(); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetYearsOverflow(); - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|\DateInterval|null $precision - * @param string $function - * - * @return CarbonInterface - */ - public function round($precision = 1, $function = 'round'); - /** - * Round the current instance at the given unit with given precision if specified and the given function. - * - * @param string $unit - * @param float|int $precision - * @param string $function - * - * @return CarbonInterface - */ - public function roundUnit($unit, $precision = 1, $function = 'round'); - /** - * Round the current instance week. - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return CarbonInterface - */ - public function roundWeek($weekStartsAt = null); - /** - * The number of seconds since midnight. - * - * @return int - */ - public function secondsSinceMidnight(); - /** - * The number of seconds until 23:59:59. - * - * @return int - */ - public function secondsUntilEndOfDay(); - /** - * Return a serialized string of the instance. - * - * @return string - */ - public function serialize(); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather transform Carbon object before the serialization. - * - * JSON serialize all Carbon instances using the given callback. - * - * @param callable $callback - * - * @return void - */ - public static function serializeUsing($callback); - /** - * Set a part of the Carbon object - * - * @param string|array $name - * @param string|int|DateTimeZone $value - * - * @throws ImmutableException|UnknownSetterException - * - * @return $this - */ - public function set($name, $value = null); - /** - * Set the date with gregorian year, month and day numbers. - * - * @see https://php.net/manual/en/datetime.setdate.php - * - * @param int $year - * @param int $month - * @param int $day - * - * @return static - */ - #[ReturnTypeWillChange] - public function setDate($year, $month, $day); - /** - * Set the year, month, and date for this instance to that of the passed instance. - * - * @param Carbon|DateTimeInterface $date now if null - * - * @return static - */ - public function setDateFrom($date = null); - /** - * Set the date and time all together. - * - * @param int $year - * @param int $month - * @param int $day - * @param int $hour - * @param int $minute - * @param int $second - * @param int $microseconds - * - * @return static - */ - public function setDateTime($year, $month, $day, $hour, $minute, $second = 0, $microseconds = 0); - /** - * Set the date and time for this instance to that of the passed instance. - * - * @param Carbon|DateTimeInterface $date - * - * @return static - */ - public function setDateTimeFrom($date = null); - /** - * Set the day (keeping the current time) to the start of the week + the number of days passed as the first - * parameter. First day of week is driven by the locale unless explicitly set with the second parameter. - * - * @param int $numberOfDays number of days to add after the start of the current week - * @param int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - * - * @return static - */ - public function setDaysFromStartOfWeek(int $numberOfDays, ?int $weekStartsAt = null); - /** - * Set the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - * - * @param string $locale - */ - public static function setFallbackLocale($locale); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * @param int $humanDiffOptions - */ - public static function setHumanDiffOptions($humanDiffOptions); - /** - * Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates. - * - * @see https://php.net/manual/en/datetime.setisodate.php - * - * @param int $year - * @param int $week - * @param int $day - * - * @return static - */ - #[ReturnTypeWillChange] - public function setISODate($year, $week, $day = 1); - /** - * Set the translator for the current instance. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator - * - * @return $this - */ - public function setLocalTranslator(TranslatorInterface $translator); - /** - * Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use closest language from the current LC_TIME locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function setLocale($locale); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * - * Set midday/noon hour - * - * @param int $hour midday hour - * - * @return void - */ - public static function setMidDayAt($hour); - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNow($testNow = null); - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNowAndTimezone($testNow = null, $tz = null); - /** - * Resets the current time of the DateTime object to a different time. - * - * @see https://php.net/manual/en/datetime.settime.php - * - * @param int $hour - * @param int $minute - * @param int $second - * @param int $microseconds - * - * @return static - */ - #[ReturnTypeWillChange] - public function setTime($hour, $minute, $second = 0, $microseconds = 0); - /** - * Set the hour, minute, second and microseconds for this instance to that of the passed instance. - * - * @param Carbon|DateTimeInterface $date now if null - * - * @return static - */ - public function setTimeFrom($date = null); - /** - * Set the time by time string. - * - * @param string $time - * - * @return static - */ - public function setTimeFromTimeString($time); - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $unixTimestamp - * - * @return static - */ - #[ReturnTypeWillChange] - public function setTimestamp($unixTimestamp); - /** - * Set the instance's timezone from a string or object. - * - * @param DateTimeZone|string $value - * - * @return static - */ - #[ReturnTypeWillChange] - public function setTimezone($value); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and - * use other method or custom format passed to format() method if you need to dump another string - * format. - * - * Set the default format used when type juggling a Carbon instance to a string. - * - * @param string|Closure|null $format - * - * @return void - */ - public static function setToStringFormat($format); - /** - * Set the default translator instance to use. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator - * - * @return void - */ - public static function setTranslator(TranslatorInterface $translator); - /** - * Set specified unit to new given value. - * - * @param string $unit year, month, day, hour, minute, second or microsecond - * @param int $value new value for given unit - * - * @return static - */ - public function setUnit($unit, $value = null); - /** - * Set any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value new value for the input unit - * @param string $overflowUnit unit name to not overflow - * - * @return static - */ - public function setUnitNoOverflow($valueUnit, $value, $overflowUnit); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use UTF-8 language packages on every machine. - * - * Set if UTF8 will be used for localized date/time. - * - * @param bool $utf8 - */ - public static function setUtf8($utf8); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek - * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the - * start of week according to current locale selected and implicitly the end of week. - * - * Set the last day of week - * - * @param int|string $day week end day (or 'auto' to get the day before the first day of week - * from Carbon::getLocale() culture). - * - * @return void - */ - public static function setWeekEndsAt($day); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the - * 'first_day_of_week' locale setting to change the start of week according to current locale - * selected and implicitly the end of week. - * - * Set the first day of week - * - * @param int|string $day week start day (or 'auto' to get the first day of week from Carbon::getLocale() culture). - * - * @return void - */ - public static function setWeekStartsAt($day); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider week-end is always saturday and sunday, and if you have some custom - * week-end days to handle, give to those days an other name and create a macro for them: - * - * ``` - * Carbon::macro('isDayOff', function ($date) { - * return $date->isSunday() || $date->isMonday(); - * }); - * Carbon::macro('isNotDayOff', function ($date) { - * return !$date->isDayOff(); - * }); - * if ($someDate->isDayOff()) ... - * if ($someDate->isNotDayOff()) ... - * // Add 5 not-off days - * $count = 5; - * while ($someDate->isDayOff() || ($count-- > 0)) { - * $someDate->addDay(); - * } - * ``` - * - * Set weekend days - * - * @param array $days - * - * @return void - */ - public static function setWeekendDays($days); - /** - * Set specific options. - * - strictMode: true|false|null - * - monthOverflow: true|false|null - * - yearOverflow: true|false|null - * - humanDiffOptions: int|null - * - toStringFormat: string|Closure|null - * - toJsonFormat: string|Closure|null - * - locale: string|null - * - timezone: \DateTimeZone|string|int|null - * - macros: array|null - * - genericMacros: array|null - * - * @param array $settings - * - * @return $this|static - */ - public function settings(array $settings); - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference. - * - * @param DateTimeZone|string $value - * - * @return static - */ - public function shiftTimezone($value); - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowMonths(); - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowYears(); - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - */ - public function since($other = null, $syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Returns standardized singular of a given singular/plural unit name (in English). - * - * @param string $unit - * - * @return string - */ - public static function singularUnit(string $unit) : string; - /** - * Modify to start of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf('month') - * ->endOf('week', Carbon::FRIDAY); - * ``` - * - * @param string $unit - * @param array $params - * - * @return static - */ - public function startOf($unit, ...$params); - /** - * Resets the date to the first day of the century and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfCentury(); - * ``` - * - * @return static - */ - public function startOfCentury(); - /** - * Resets the time to 00:00:00 start of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDay(); - * ``` - * - * @return static - */ - public function startOfDay(); - /** - * Resets the date to the first day of the decade and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDecade(); - * ``` - * - * @return static - */ - public function startOfDecade(); - /** - * Modify to start of current hour, minutes and seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfHour(); - * ``` - * - * @return static - */ - public function startOfHour(); - /** - * Resets the date to the first day of the millennium and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMillennium(); - * ``` - * - * @return static - */ - public function startOfMillennium(); - /** - * Modify to start of current minute, seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMinute(); - * ``` - * - * @return static - */ - public function startOfMinute(); - /** - * Resets the date to the first day of the month and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMonth(); - * ``` - * - * @return static - */ - public function startOfMonth(); - /** - * Resets the date to the first day of the quarter and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfQuarter(); - * ``` - * - * @return static - */ - public function startOfQuarter(); - /** - * Modify to start of current second, microseconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOfSecond() - * ->format('H:i:s.u'); - * ``` - * - * @return static - */ - public function startOfSecond(); - /** - * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek(Carbon::SUNDAY) . "\n"; - * ``` - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return static - */ - public function startOfWeek($weekStartsAt = null); - /** - * Resets the date to the first day of the year and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfYear(); - * ``` - * - * @return static - */ - public function startOfYear(); - /** - * Subtract given units or interval to the current instance. - * - * @example $date->sub('hour', 3) - * @example $date->sub(15, 'days') - * @example $date->sub(CarbonInterval::days(4)) - * - * @param string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function sub($unit, $value = 1, $overflow = null); - public function subRealUnit($unit, $value = 1); - /** - * Subtract given units to the current instance. - * - * @param string $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - public function subUnit($unit, $value = 1, $overflow = null); - /** - * Subtract any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to subtract to the input unit - * @param string $overflowUnit unit name to not overflow - * - * @return static - */ - public function subUnitNoOverflow($valueUnit, $value, $overflowUnit); - /** - * Subtract given units or interval to the current instance. - * - * @see sub() - * - * @param string|DateInterval $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - public function subtract($unit, $value = 1, $overflow = null); - /** - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @return string - */ - public function timespan($other = null, $timezone = null); - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $unixTimestamp - * - * @return static - */ - public function timestamp($unixTimestamp); - /** - * @alias setTimezone - * - * @param DateTimeZone|string $value - * - * @return static - */ - public function timezone($value); - /** - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * When comparing a value in the past to default now: - * 1 hour from now - * 5 months from now - * - * When comparing a value in the future to default now: - * 1 hour ago - * 5 months ago - * - * When comparing a value in the past to another value: - * 1 hour after - * 5 months after - * - * When comparing a value in the future to another value: - * 1 hour before - * 5 months before - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function to($other = null, $syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Get default array representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toArray()); - * ``` - * - * @return array - */ - public function toArray(); - /** - * Format the instance as ATOM - * - * @example - * ``` - * echo Carbon::now()->toAtomString(); - * ``` - * - * @return string - */ - public function toAtomString(); - /** - * Format the instance as COOKIE - * - * @example - * ``` - * echo Carbon::now()->toCookieString(); - * ``` - * - * @return string - */ - public function toCookieString(); - /** - * @alias toDateTime - * - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDate()); - * ``` - * - * @return DateTime - */ - public function toDate(); - /** - * Format the instance as date - * - * @example - * ``` - * echo Carbon::now()->toDateString(); - * ``` - * - * @return string - */ - public function toDateString(); - /** - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTime()); - * ``` - * - * @return DateTime - */ - public function toDateTime(); - /** - * Return native toDateTimeImmutable PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTimeImmutable()); - * ``` - * - * @return DateTimeImmutable - */ - public function toDateTimeImmutable(); - /** - * Format the instance as date and time T-separated with no timezone - * - * @example - * ``` - * echo Carbon::now()->toDateTimeLocalString(); - * echo "\n"; - * echo Carbon::now()->toDateTimeLocalString('minute'); // You can specify precision among: minute, second, millisecond and microsecond - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toDateTimeLocalString($unitPrecision = 'second'); - /** - * Format the instance as date and time - * - * @example - * ``` - * echo Carbon::now()->toDateTimeString(); - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toDateTimeString($unitPrecision = 'second'); - /** - * Format the instance with day, date and time - * - * @example - * ``` - * echo Carbon::now()->toDayDateTimeString(); - * ``` - * - * @return string - */ - public function toDayDateTimeString(); - /** - * Format the instance as a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDateString(); - * ``` - * - * @return string - */ - public function toFormattedDateString(); - /** - * Format the instance with the day, and a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDayDateString(); - * ``` - * - * @return string - */ - public function toFormattedDayDateString() : string; - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z, if $keepOffset truthy, offset will be kept: - * 1977-04-22T01:00:00-05:00). - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toISOString() . "\n"; - * echo Carbon::now('America/Toronto')->toISOString(true) . "\n"; - * ``` - * - * @param bool $keepOffset Pass true to keep the date offset. Else forced to UTC. - * - * @return null|string - */ - public function toISOString($keepOffset = \false); - /** - * Return a immutable copy of the instance. - * - * @return CarbonImmutable - */ - public function toImmutable(); - /** - * Format the instance as ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601String(); - * ``` - * - * @return string - */ - public function toIso8601String(); - /** - * Convert the instance to UTC and return as Zulu ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601ZuluString(); - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toIso8601ZuluString($unitPrecision = 'second'); - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone. - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toJSON(); - * ``` - * - * @return null|string - */ - public function toJSON(); - /** - * Return a mutable copy of the instance. - * - * @return Carbon - */ - public function toMutable(); - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function toNow($syntax = null, $short = \false, $parts = 1, $options = null); - /** - * Get default object representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toObject()); - * ``` - * - * @return object - */ - public function toObject(); - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|int|null $end period end date or recurrences count if int - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - * - * @return CarbonPeriod - */ - public function toPeriod($end = null, $interval = null, $unit = null); - /** - * Format the instance as RFC1036 - * - * @example - * ``` - * echo Carbon::now()->toRfc1036String(); - * ``` - * - * @return string - */ - public function toRfc1036String(); - /** - * Format the instance as RFC1123 - * - * @example - * ``` - * echo Carbon::now()->toRfc1123String(); - * ``` - * - * @return string - */ - public function toRfc1123String(); - /** - * Format the instance as RFC2822 - * - * @example - * ``` - * echo Carbon::now()->toRfc2822String(); - * ``` - * - * @return string - */ - public function toRfc2822String(); - /** - * Format the instance as RFC3339 - * - * @param bool $extended - * - * @example - * ``` - * echo Carbon::now()->toRfc3339String() . "\n"; - * echo Carbon::now()->toRfc3339String(true) . "\n"; - * ``` - * - * @return string - */ - public function toRfc3339String($extended = \false); - /** - * Format the instance as RFC7231 - * - * @example - * ``` - * echo Carbon::now()->toRfc7231String(); - * ``` - * - * @return string - */ - public function toRfc7231String(); - /** - * Format the instance as RFC822 - * - * @example - * ``` - * echo Carbon::now()->toRfc822String(); - * ``` - * - * @return string - */ - public function toRfc822String(); - /** - * Format the instance as RFC850 - * - * @example - * ``` - * echo Carbon::now()->toRfc850String(); - * ``` - * - * @return string - */ - public function toRfc850String(); - /** - * Format the instance as RSS - * - * @example - * ``` - * echo Carbon::now()->toRssString(); - * ``` - * - * @return string - */ - public function toRssString(); - /** - * Returns english human readable complete date string. - * - * @example - * ``` - * echo Carbon::now()->toString(); - * ``` - * - * @return string - */ - public function toString(); - /** - * Format the instance as time - * - * @example - * ``` - * echo Carbon::now()->toTimeString(); - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toTimeString($unitPrecision = 'second'); - /** - * Format the instance as W3C - * - * @example - * ``` - * echo Carbon::now()->toW3cString(); - * ``` - * - * @return string - */ - public function toW3cString(); - /** - * Create a Carbon instance for today. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function today($tz = null); - /** - * Create a Carbon instance for tomorrow. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function tomorrow($tz = null); - /** - * Translate using translation string or callback available. - * - * @param string $key - * @param array $parameters - * @param string|int|float|null $number - * @param \Symfony\Component\Translation\TranslatorInterface|null $translator - * @param bool $altNumbers - * - * @return string - */ - public function translate(string $key, array $parameters = [], $number = null, ?TranslatorInterface $translator = null, bool $altNumbers = \false) : string; - /** - * Returns the alternative number for a given integer if available in the current locale. - * - * @param int $number - * - * @return string - */ - public function translateNumber(int $number) : string; - /** - * Translate a time string from a locale to an other. - * - * @param string $timeString date/time/duration string to translate (may also contain English) - * @param string|null $from input locale of the $timeString parameter (`Carbon::getLocale()` by default) - * @param string|null $to output locale of the result returned (`"en"` by default) - * @param int $mode specify what to translate with options: - * - self::TRANSLATE_ALL (default) - * - CarbonInterface::TRANSLATE_MONTHS - * - CarbonInterface::TRANSLATE_DAYS - * - CarbonInterface::TRANSLATE_UNITS - * - CarbonInterface::TRANSLATE_MERIDIEM - * You can use pipe to group: CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS - * - * @return string - */ - public static function translateTimeString($timeString, $from = null, $to = null, $mode = self::TRANSLATE_ALL); - /** - * Translate a time string from the current locale (`$date->locale()`) to an other. - * - * @param string $timeString time string to translate - * @param string|null $to output locale of the result returned ("en" by default) - * - * @return string - */ - public function translateTimeStringTo($timeString, $to = null); - /** - * Translate using translation string or callback available. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator - * @param string $key - * @param array $parameters - * @param null $number - * - * @return string - */ - public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) : string; - /** - * Format as ->format() do (using date replacements patterns from https://php.net/manual/en/function.date.php) - * but translate words whenever possible (months, day names, etc.) using the current locale. - * - * @param string $format - * - * @return string - */ - public function translatedFormat(string $format) : string; - /** - * Set the timezone or returns the timezone name if no arguments passed. - * - * @param DateTimeZone|string $value - * - * @return static|string - */ - public function tz($value = null); - /** - * @alias getTimestamp - * - * Returns the UNIX timestamp for the current date. - * - * @return int - */ - public function unix(); - /** - * @alias to - * - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function until($other = null, $syntax = null, $short = \false, $parts = 1, $options = null); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if months should be calculated with overflow. - * - * @param bool $monthsOverflow - * - * @return void - */ - public static function useMonthsOverflow($monthsOverflow = \true); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * Enable the strict mode (or disable with passing false). - * - * @param bool $strictModeEnabled - */ - public static function useStrictMode($strictModeEnabled = \true); - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if years should be calculated with overflow. - * - * @param bool $yearsOverflow - * - * @return void - */ - public static function useYearsOverflow($yearsOverflow = \true); - /** - * Set the instance's timezone to UTC. - * - * @return static - */ - public function utc(); - /** - * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. - * - * @param int|null $minuteOffset - * - * @return int|static - */ - public function utcOffset(?int $minuteOffset = null); - /** - * Returns the milliseconds timestamps used amongst other by Date javascript objects. - * - * @return float - */ - public function valueOf(); - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function week($week = null, $dayOfWeek = null, $dayOfYear = null); - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function weekYear($year = null, $dayOfWeek = null, $dayOfYear = null); - /** - * Get/set the weekday from 0 (Sunday) to 6 (Saturday). - * - * @param int|null $value new value for weekday if using as setter. - * - * @return static|int - */ - public function weekday($value = null); - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function weeksInYear($dayOfWeek = null, $dayOfYear = null); - /** - * Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * - * /!\ Use this method for unit tests only. - * - * @template T - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - * @param Closure(): T $callback - * - * @return mixed - * @phpstan-return T - */ - public static function withTestNow($testNow, $callback); - /** - * Create a Carbon instance for yesterday. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function yesterday($tz = null); - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonInterval.php b/dependencies/nesbot/carbon/src/Carbon/CarbonInterval.php deleted file mode 100644 index 33f511d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonInterval.php +++ /dev/null @@ -1,2443 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\BadFluentConstructorException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\BadFluentSetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidCastException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidIntervalException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\OutOfRangeException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\ParseErrorException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnitNotConfiguredException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownGetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownSetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownUnitException; -use WP_Ultimo\Dependencies\Carbon\Traits\IntervalRounding; -use WP_Ultimo\Dependencies\Carbon\Traits\IntervalStep; -use WP_Ultimo\Dependencies\Carbon\Traits\MagicParameter; -use WP_Ultimo\Dependencies\Carbon\Traits\Mixin; -use WP_Ultimo\Dependencies\Carbon\Traits\Options; -use WP_Ultimo\Dependencies\Carbon\Traits\ToStringFormat; -use Closure; -use DateInterval; -use WP_Ultimo\Dependencies\DateMalformedIntervalStringException; -use DateTimeInterface; -use DateTimeZone; -use Exception; -use InvalidArgumentException; -use ReflectionException; -use ReturnTypeWillChange; -use RuntimeException; -use Throwable; -/** - * A simple API extension for DateInterval. - * The implementation provides helpers to handle weeks but only days are saved. - * Weeks are calculated based on the total days of the current instance. - * - * @property int $years Total years of the current interval. - * @property int $months Total months of the current interval. - * @property int $weeks Total weeks of the current interval calculated from the days. - * @property int $dayz Total days of the current interval (weeks * 7 + days). - * @property int $hours Total hours of the current interval. - * @property int $minutes Total minutes of the current interval. - * @property int $seconds Total seconds of the current interval. - * @property int $microseconds Total microseconds of the current interval. - * @property int $milliseconds Total milliseconds of the current interval. - * @property int $microExcludeMilli Remaining microseconds without the milliseconds. - * @property int $dayzExcludeWeeks Total days remaining in the final week of the current instance (days % 7). - * @property int $daysExcludeWeeks alias of dayzExcludeWeeks - * @property-read float $totalYears Number of years equivalent to the interval. - * @property-read float $totalMonths Number of months equivalent to the interval. - * @property-read float $totalWeeks Number of weeks equivalent to the interval. - * @property-read float $totalDays Number of days equivalent to the interval. - * @property-read float $totalDayz Alias for totalDays. - * @property-read float $totalHours Number of hours equivalent to the interval. - * @property-read float $totalMinutes Number of minutes equivalent to the interval. - * @property-read float $totalSeconds Number of seconds equivalent to the interval. - * @property-read float $totalMilliseconds Number of milliseconds equivalent to the interval. - * @property-read float $totalMicroseconds Number of microseconds equivalent to the interval. - * @property-read string $locale locale of the current instance - * - * @method static CarbonInterval years($years = 1) Create instance specifying a number of years or modify the number of years if called on an instance. - * @method static CarbonInterval year($years = 1) Alias for years() - * @method static CarbonInterval months($months = 1) Create instance specifying a number of months or modify the number of months if called on an instance. - * @method static CarbonInterval month($months = 1) Alias for months() - * @method static CarbonInterval weeks($weeks = 1) Create instance specifying a number of weeks or modify the number of weeks if called on an instance. - * @method static CarbonInterval week($weeks = 1) Alias for weeks() - * @method static CarbonInterval days($days = 1) Create instance specifying a number of days or modify the number of days if called on an instance. - * @method static CarbonInterval dayz($days = 1) Alias for days() - * @method static CarbonInterval daysExcludeWeeks($days = 1) Create instance specifying a number of days or modify the number of days (keeping the current number of weeks) if called on an instance. - * @method static CarbonInterval dayzExcludeWeeks($days = 1) Alias for daysExcludeWeeks() - * @method static CarbonInterval day($days = 1) Alias for days() - * @method static CarbonInterval hours($hours = 1) Create instance specifying a number of hours or modify the number of hours if called on an instance. - * @method static CarbonInterval hour($hours = 1) Alias for hours() - * @method static CarbonInterval minutes($minutes = 1) Create instance specifying a number of minutes or modify the number of minutes if called on an instance. - * @method static CarbonInterval minute($minutes = 1) Alias for minutes() - * @method static CarbonInterval seconds($seconds = 1) Create instance specifying a number of seconds or modify the number of seconds if called on an instance. - * @method static CarbonInterval second($seconds = 1) Alias for seconds() - * @method static CarbonInterval milliseconds($milliseconds = 1) Create instance specifying a number of milliseconds or modify the number of milliseconds if called on an instance. - * @method static CarbonInterval millisecond($milliseconds = 1) Alias for milliseconds() - * @method static CarbonInterval microseconds($microseconds = 1) Create instance specifying a number of microseconds or modify the number of microseconds if called on an instance. - * @method static CarbonInterval microsecond($microseconds = 1) Alias for microseconds() - * @method $this addYears(int $years) Add given number of years to the current interval - * @method $this subYears(int $years) Subtract given number of years to the current interval - * @method $this addMonths(int $months) Add given number of months to the current interval - * @method $this subMonths(int $months) Subtract given number of months to the current interval - * @method $this addWeeks(int|float $weeks) Add given number of weeks to the current interval - * @method $this subWeeks(int|float $weeks) Subtract given number of weeks to the current interval - * @method $this addDays(int|float $days) Add given number of days to the current interval - * @method $this subDays(int|float $days) Subtract given number of days to the current interval - * @method $this addHours(int|float $hours) Add given number of hours to the current interval - * @method $this subHours(int|float $hours) Subtract given number of hours to the current interval - * @method $this addMinutes(int|float $minutes) Add given number of minutes to the current interval - * @method $this subMinutes(int|float $minutes) Subtract given number of minutes to the current interval - * @method $this addSeconds(int|float $seconds) Add given number of seconds to the current interval - * @method $this subSeconds(int|float $seconds) Subtract given number of seconds to the current interval - * @method $this addMilliseconds(int|float $milliseconds) Add given number of milliseconds to the current interval - * @method $this subMilliseconds(int|float $milliseconds) Subtract given number of milliseconds to the current interval - * @method $this addMicroseconds(int|float $microseconds) Add given number of microseconds to the current interval - * @method $this subMicroseconds(int|float $microseconds) Subtract given number of microseconds to the current interval - * @method $this roundYear(int|float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(int|float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(int|float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(int|float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(int|float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(int|float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(int|float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(int|float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(int|float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(int|float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(int|float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(int|float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundWeek(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundWeeks(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorWeek(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorWeeks(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilWeek(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilWeeks(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundDay(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(int|float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(int|float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(int|float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(int|float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(int|float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(int|float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(int|float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(int|float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(int|float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(int|float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(int|float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(int|float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(int|float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(int|float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(int|float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(int|float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(int|float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(int|float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(int|float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(int|float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(int|float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(int|float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(int|float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(int|float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(int|float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(int|float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(int|float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(int|float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(int|float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(int|float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(int|float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(int|float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(int|float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(int|float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(int|float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(int|float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(int|float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(int|float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(int|float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(int|float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(int|float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(int|float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(int|float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(int|float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(int|float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(int|float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(int|float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(int|float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(int|float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(int|float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(int|float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(int|float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(int|float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(int|float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(int|float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(int|float $precision = 1) Ceil the current instance microsecond with given precision. - */ -class CarbonInterval extends DateInterval implements CarbonConverterInterface -{ - use IntervalRounding; - use IntervalStep; - use MagicParameter; - use Mixin { - Mixin::mixin as baseMixin; - } - use Options; - use ToStringFormat; - /** - * Interval spec period designators - */ - public const PERIOD_PREFIX = 'P'; - public const PERIOD_YEARS = 'Y'; - public const PERIOD_MONTHS = 'M'; - public const PERIOD_DAYS = 'D'; - public const PERIOD_TIME_PREFIX = 'T'; - public const PERIOD_HOURS = 'H'; - public const PERIOD_MINUTES = 'M'; - public const PERIOD_SECONDS = 'S'; - /** - * A translator to ... er ... translate stuff - * - * @var \Symfony\Component\Translation\TranslatorInterface - */ - protected static $translator; - /** - * @var array|null - */ - protected static $cascadeFactors; - /** - * @var array - */ - protected static $formats = ['y' => 'y', 'Y' => 'y', 'o' => 'y', 'm' => 'm', 'n' => 'm', 'W' => 'weeks', 'd' => 'd', 'j' => 'd', 'z' => 'd', 'h' => 'h', 'g' => 'h', 'H' => 'h', 'G' => 'h', 'i' => 'i', 's' => 's', 'u' => 'micro', 'v' => 'milli']; - /** - * @var array|null - */ - private static $flipCascadeFactors; - /** - * @var bool - */ - private static $floatSettersEnabled = \false; - /** - * The registered macros. - * - * @var array - */ - protected static $macros = []; - /** - * Timezone handler for settings() method. - * - * @var mixed - */ - protected $tzName; - /** - * Set the instance's timezone from a string or object. - * - * @param \DateTimeZone|string $tzName - * - * @return static - */ - public function setTimezone($tzName) - { - $this->tzName = $tzName; - return $this; - } - /** - * @internal - * - * Set the instance's timezone from a string or object and add/subtract the offset difference. - * - * @param \DateTimeZone|string $tzName - * - * @return static - */ - public function shiftTimezone($tzName) - { - $this->tzName = $tzName; - return $this; - } - /** - * Mapping of units and factors for cascading. - * - * Should only be modified by changing the factors or referenced constants. - * - * @return array - */ - public static function getCascadeFactors() - { - return static::$cascadeFactors ?: static::getDefaultCascadeFactors(); - } - protected static function getDefaultCascadeFactors() : array - { - return ['milliseconds' => [Carbon::MICROSECONDS_PER_MILLISECOND, 'microseconds'], 'seconds' => [Carbon::MILLISECONDS_PER_SECOND, 'milliseconds'], 'minutes' => [Carbon::SECONDS_PER_MINUTE, 'seconds'], 'hours' => [Carbon::MINUTES_PER_HOUR, 'minutes'], 'dayz' => [Carbon::HOURS_PER_DAY, 'hours'], 'weeks' => [Carbon::DAYS_PER_WEEK, 'dayz'], 'months' => [Carbon::WEEKS_PER_MONTH, 'weeks'], 'years' => [Carbon::MONTHS_PER_YEAR, 'months']]; - } - private static function standardizeUnit($unit) - { - $unit = \rtrim($unit, 'sz') . 's'; - return $unit === 'days' ? 'dayz' : $unit; - } - private static function getFlipCascadeFactors() - { - if (!self::$flipCascadeFactors) { - self::$flipCascadeFactors = []; - foreach (static::getCascadeFactors() as $to => [$factor, $from]) { - self::$flipCascadeFactors[self::standardizeUnit($from)] = [self::standardizeUnit($to), $factor]; - } - } - return self::$flipCascadeFactors; - } - /** - * Set default cascading factors for ->cascade() method. - * - * @param array $cascadeFactors - */ - public static function setCascadeFactors(array $cascadeFactors) - { - self::$flipCascadeFactors = null; - static::$cascadeFactors = $cascadeFactors; - } - /** - * This option allow you to opt-in for the Carbon 3 behavior where float - * values will no longer be cast to integer (so truncated). - * - * ⚠️ This settings will be applied globally, which mean your whole application - * code including the third-party dependencies that also may use Carbon will - * adopt the new behavior. - */ - public static function enableFloatSetters(bool $floatSettersEnabled = \true) : void - { - self::$floatSettersEnabled = $floatSettersEnabled; - } - /////////////////////////////////////////////////////////////////// - //////////////////////////// CONSTRUCTORS ///////////////////////// - /////////////////////////////////////////////////////////////////// - /** - * Create a new CarbonInterval instance. - * - * @param Closure|DateInterval|string|int|null $years - * @param int|float|null $months - * @param int|float|null $weeks - * @param int|float|null $days - * @param int|float|null $hours - * @param int|float|null $minutes - * @param int|float|null $seconds - * @param int|float|null $microseconds - * - * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. - */ - public function __construct($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null, $microseconds = null) - { - if ($years instanceof Closure) { - $this->step = $years; - $years = null; - } - if ($years instanceof DateInterval) { - parent::__construct(static::getDateIntervalSpec($years)); - $this->f = $years->f; - self::copyNegativeUnits($years, $this); - return; - } - $spec = $years; - $isStringSpec = \is_string($spec) && !\preg_match('/^[\\d.]/', $spec); - if (!$isStringSpec || (float) $years) { - $spec = static::PERIOD_PREFIX; - $spec .= $years > 0 ? $years . static::PERIOD_YEARS : ''; - $spec .= $months > 0 ? $months . static::PERIOD_MONTHS : ''; - $specDays = 0; - $specDays += $weeks > 0 ? $weeks * static::getDaysPerWeek() : 0; - $specDays += $days > 0 ? $days : 0; - $spec .= $specDays > 0 ? $specDays . static::PERIOD_DAYS : ''; - if ($hours > 0 || $minutes > 0 || $seconds > 0) { - $spec .= static::PERIOD_TIME_PREFIX; - $spec .= $hours > 0 ? $hours . static::PERIOD_HOURS : ''; - $spec .= $minutes > 0 ? $minutes . static::PERIOD_MINUTES : ''; - $spec .= $seconds > 0 ? $seconds . static::PERIOD_SECONDS : ''; - } - if ($spec === static::PERIOD_PREFIX) { - // Allow the zero interval. - $spec .= '0' . static::PERIOD_YEARS; - } - } - try { - parent::__construct($spec); - } catch (Throwable $exception) { - try { - parent::__construct('PT0S'); - if ($isStringSpec) { - if (!\preg_match('/^P - (?:(?[+-]?\\d*(?:\\.\\d+)?)Y)? - (?:(?[+-]?\\d*(?:\\.\\d+)?)M)? - (?:(?[+-]?\\d*(?:\\.\\d+)?)W)? - (?:(?[+-]?\\d*(?:\\.\\d+)?)D)? - (?:T - (?:(?[+-]?\\d*(?:\\.\\d+)?)H)? - (?:(?[+-]?\\d*(?:\\.\\d+)?)M)? - (?:(?[+-]?\\d*(?:\\.\\d+)?)S)? - )? - $/x', $spec, $match)) { - throw new InvalidArgumentException("Invalid duration: {$spec}"); - } - $years = (float) ($match['year'] ?? 0); - $this->assertSafeForInteger('year', $years); - $months = (float) ($match['month'] ?? 0); - $this->assertSafeForInteger('month', $months); - $weeks = (float) ($match['week'] ?? 0); - $this->assertSafeForInteger('week', $weeks); - $days = (float) ($match['day'] ?? 0); - $this->assertSafeForInteger('day', $days); - $hours = (float) ($match['hour'] ?? 0); - $this->assertSafeForInteger('hour', $hours); - $minutes = (float) ($match['minute'] ?? 0); - $this->assertSafeForInteger('minute', $minutes); - $seconds = (float) ($match['second'] ?? 0); - $this->assertSafeForInteger('second', $seconds); - } - $totalDays = $weeks * static::getDaysPerWeek() + $days; - $this->assertSafeForInteger('days total (including weeks)', $totalDays); - $this->y = (int) $years; - $this->m = (int) $months; - $this->d = (int) $totalDays; - $this->h = (int) $hours; - $this->i = (int) $minutes; - $this->s = (int) $seconds; - if ((float) $this->y !== $years || (float) $this->m !== $months || (float) $this->d !== $totalDays || (float) $this->h !== $hours || (float) $this->i !== $minutes || (float) $this->s !== $seconds) { - $this->add(static::fromString($years - $this->y . ' years ' . ($months - $this->m) . ' months ' . ($totalDays - $this->d) . ' days ' . ($hours - $this->h) . ' hours ' . ($minutes - $this->i) . ' minutes ' . ($seconds - $this->s) . ' seconds ')); - } - } catch (Throwable $secondException) { - throw $secondException instanceof OutOfRangeException ? $secondException : $exception; - } - } - if ($microseconds !== null) { - $this->f = $microseconds / Carbon::MICROSECONDS_PER_SECOND; - } - } - /** - * Returns the factor for a given source-to-target couple. - * - * @param string $source - * @param string $target - * - * @return int|float|null - */ - public static function getFactor($source, $target) - { - $source = self::standardizeUnit($source); - $target = self::standardizeUnit($target); - $factors = self::getFlipCascadeFactors(); - if (isset($factors[$source])) { - [$to, $factor] = $factors[$source]; - if ($to === $target) { - return $factor; - } - return $factor * static::getFactor($to, $target); - } - return null; - } - /** - * Returns the factor for a given source-to-target couple if set, - * else try to find the appropriate constant as the factor, such as Carbon::DAYS_PER_WEEK. - * - * @param string $source - * @param string $target - * - * @return int|float|null - */ - public static function getFactorWithDefault($source, $target) - { - $factor = self::getFactor($source, $target); - if ($factor) { - return $factor; - } - static $defaults = ['month' => ['year' => Carbon::MONTHS_PER_YEAR], 'week' => ['month' => Carbon::WEEKS_PER_MONTH], 'day' => ['week' => Carbon::DAYS_PER_WEEK], 'hour' => ['day' => Carbon::HOURS_PER_DAY], 'minute' => ['hour' => Carbon::MINUTES_PER_HOUR], 'second' => ['minute' => Carbon::SECONDS_PER_MINUTE], 'millisecond' => ['second' => Carbon::MILLISECONDS_PER_SECOND], 'microsecond' => ['millisecond' => Carbon::MICROSECONDS_PER_MILLISECOND]]; - return $defaults[$source][$target] ?? null; - } - /** - * Returns current config for days per week. - * - * @return int|float - */ - public static function getDaysPerWeek() - { - return static::getFactor('dayz', 'weeks') ?: Carbon::DAYS_PER_WEEK; - } - /** - * Returns current config for hours per day. - * - * @return int|float - */ - public static function getHoursPerDay() - { - return static::getFactor('hours', 'dayz') ?: Carbon::HOURS_PER_DAY; - } - /** - * Returns current config for minutes per hour. - * - * @return int|float - */ - public static function getMinutesPerHour() - { - return static::getFactor('minutes', 'hours') ?: Carbon::MINUTES_PER_HOUR; - } - /** - * Returns current config for seconds per minute. - * - * @return int|float - */ - public static function getSecondsPerMinute() - { - return static::getFactor('seconds', 'minutes') ?: Carbon::SECONDS_PER_MINUTE; - } - /** - * Returns current config for microseconds per second. - * - * @return int|float - */ - public static function getMillisecondsPerSecond() - { - return static::getFactor('milliseconds', 'seconds') ?: Carbon::MILLISECONDS_PER_SECOND; - } - /** - * Returns current config for microseconds per second. - * - * @return int|float - */ - public static function getMicrosecondsPerMillisecond() - { - return static::getFactor('microseconds', 'milliseconds') ?: Carbon::MICROSECONDS_PER_MILLISECOND; - } - /** - * Create a new CarbonInterval instance from specific values. - * This is an alias for the constructor that allows better fluent - * syntax as it allows you to do CarbonInterval::create(1)->fn() rather than - * (new CarbonInterval(1))->fn(). - * - * @param int $years - * @param int $months - * @param int $weeks - * @param int $days - * @param int $hours - * @param int $minutes - * @param int $seconds - * @param int $microseconds - * - * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. - * - * @return static - */ - public static function create($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null, $microseconds = null) - { - return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds, $microseconds); - } - /** - * Parse a string into a new CarbonInterval object according to the specified format. - * - * @example - * ``` - * echo Carboninterval::createFromFormat('H:i', '1:30'); - * ``` - * - * @param string $format Format of the $interval input string - * @param string|null $interval Input string to convert into an interval - * - * @throws \Carbon\Exceptions\ParseErrorException when the $interval cannot be parsed as an interval. - * - * @return static - */ - public static function createFromFormat(string $format, ?string $interval) - { - $instance = new static(0); - $length = \mb_strlen($format); - if (\preg_match('/s([,.])([uv])$/', $format, $match)) { - $interval = \explode($match[1], $interval); - $index = \count($interval) - 1; - $interval[$index] = \str_pad($interval[$index], $match[2] === 'v' ? 3 : 6, '0'); - $interval = \implode($match[1], $interval); - } - $interval = $interval ?? ''; - for ($index = 0; $index < $length; $index++) { - $expected = \mb_substr($format, $index, 1); - $nextCharacter = \mb_substr($interval, 0, 1); - $unit = static::$formats[$expected] ?? null; - if ($unit) { - if (!\preg_match('/^-?\\d+/', $interval, $match)) { - throw new ParseErrorException('number', $nextCharacter); - } - $interval = \mb_substr($interval, \mb_strlen($match[0])); - $instance->{$unit} += (int) $match[0]; - continue; - } - if ($nextCharacter !== $expected) { - throw new ParseErrorException("'{$expected}'", $nextCharacter, 'Allowed substitutes for interval formats are ' . \implode(', ', \array_keys(static::$formats)) . "\n" . 'See https://php.net/manual/en/function.date.php for their meaning'); - } - $interval = \mb_substr($interval, 1); - } - if ($interval !== '') { - throw new ParseErrorException('end of string', $interval); - } - return $instance; - } - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy() - { - $date = new static(0); - $date->copyProperties($this); - $date->step = $this->step; - return $date; - } - /** - * Get a copy of the instance. - * - * @return static - */ - public function clone() - { - return $this->copy(); - } - /** - * Provide static helpers to create instances. Allows CarbonInterval::years(3). - * - * Note: This is done using the magic method to allow static and instance methods to - * have the same names. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @return static|null - */ - public static function __callStatic($method, $parameters) - { - try { - $interval = new static(0); - $localStrictModeEnabled = $interval->localStrictModeEnabled; - $interval->localStrictModeEnabled = \true; - $result = static::hasMacro($method) ? static::bindMacroContext(null, function () use(&$method, &$parameters, &$interval) { - return $interval->callMacro($method, $parameters); - }) : $interval->{$method}(...$parameters); - $interval->localStrictModeEnabled = $localStrictModeEnabled; - return $result; - } catch (BadFluentSetterException $exception) { - if (Carbon::isStrictModeEnabled()) { - throw new BadFluentConstructorException($method, 0, $exception); - } - return null; - } - } - /** - * Evaluate the PHP generated by var_export() and recreate the exported CarbonInterval instance. - * - * @param array $dump data as exported by var_export() - * - * @return static - */ - #[ReturnTypeWillChange] - public static function __set_state($dump) - { - /** @noinspection PhpVoidFunctionResultUsedInspection */ - /** @var DateInterval $dateInterval */ - $dateInterval = parent::__set_state($dump); - return static::instance($dateInterval); - } - /** - * Return the current context from inside a macro callee or a new one if static. - * - * @return static - */ - protected static function this() - { - return \end(static::$macroContextStack) ?: new static(0); - } - /** - * Creates a CarbonInterval from string. - * - * Format: - * - * Suffix | Unit | Example | DateInterval expression - * -------|---------|---------|------------------------ - * y | years | 1y | P1Y - * mo | months | 3mo | P3M - * w | weeks | 2w | P2W - * d | days | 28d | P28D - * h | hours | 4h | PT4H - * m | minutes | 12m | PT12M - * s | seconds | 59s | PT59S - * - * e. g. `1w 3d 4h 32m 23s` is converted to 10 days 4 hours 32 minutes and 23 seconds. - * - * Special cases: - * - An empty string will return a zero interval - * - Fractions are allowed for weeks, days, hours and minutes and will be converted - * and rounded to the next smaller value (caution: 0.5w = 4d) - * - * @param string $intervalDefinition - * - * @return static - */ - public static function fromString($intervalDefinition) - { - if (empty($intervalDefinition)) { - return new static(0); - } - $years = 0; - $months = 0; - $weeks = 0; - $days = 0; - $hours = 0; - $minutes = 0; - $seconds = 0; - $milliseconds = 0; - $microseconds = 0; - $pattern = '/(\\d+(?:\\.\\d+)?)\\h*([^\\d\\h]*)/i'; - \preg_match_all($pattern, $intervalDefinition, $parts, \PREG_SET_ORDER); - while ([$part, $value, $unit] = \array_shift($parts)) { - $intValue = (int) $value; - $fraction = (float) $value - $intValue; - // Fix calculation precision - switch (\round($fraction, 6)) { - case 1: - $fraction = 0; - $intValue++; - break; - case 0: - $fraction = 0; - break; - } - switch ($unit === 'µs' ? 'µs' : \strtolower($unit)) { - case 'millennia': - case 'millennium': - $years += $intValue * CarbonInterface::YEARS_PER_MILLENNIUM; - break; - case 'century': - case 'centuries': - $years += $intValue * CarbonInterface::YEARS_PER_CENTURY; - break; - case 'decade': - case 'decades': - $years += $intValue * CarbonInterface::YEARS_PER_DECADE; - break; - case 'year': - case 'years': - case 'y': - case 'yr': - case 'yrs': - $years += $intValue; - break; - case 'quarter': - case 'quarters': - $months += $intValue * CarbonInterface::MONTHS_PER_QUARTER; - break; - case 'month': - case 'months': - case 'mo': - case 'mos': - $months += $intValue; - break; - case 'week': - case 'weeks': - case 'w': - $weeks += $intValue; - if ($fraction) { - $parts[] = [null, $fraction * static::getDaysPerWeek(), 'd']; - } - break; - case 'day': - case 'days': - case 'd': - $days += $intValue; - if ($fraction) { - $parts[] = [null, $fraction * static::getHoursPerDay(), 'h']; - } - break; - case 'hour': - case 'hours': - case 'h': - $hours += $intValue; - if ($fraction) { - $parts[] = [null, $fraction * static::getMinutesPerHour(), 'm']; - } - break; - case 'minute': - case 'minutes': - case 'm': - $minutes += $intValue; - if ($fraction) { - $parts[] = [null, $fraction * static::getSecondsPerMinute(), 's']; - } - break; - case 'second': - case 'seconds': - case 's': - $seconds += $intValue; - if ($fraction) { - $parts[] = [null, $fraction * static::getMillisecondsPerSecond(), 'ms']; - } - break; - case 'millisecond': - case 'milliseconds': - case 'milli': - case 'ms': - $milliseconds += $intValue; - if ($fraction) { - $microseconds += \round($fraction * static::getMicrosecondsPerMillisecond()); - } - break; - case 'microsecond': - case 'microseconds': - case 'micro': - case 'µs': - $microseconds += $intValue; - break; - default: - throw new InvalidIntervalException(\sprintf('Invalid part %s in definition %s', $part, $intervalDefinition)); - } - } - return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds, $milliseconds * Carbon::MICROSECONDS_PER_MILLISECOND + $microseconds); - } - /** - * Creates a CarbonInterval from string using a different locale. - * - * @param string $interval interval string in the given language (may also contain English). - * @param string|null $locale if locale is null or not specified, current global locale will be used instead. - * - * @return static - */ - public static function parseFromLocale($interval, $locale = null) - { - return static::fromString(Carbon::translateTimeString($interval, $locale ?: static::getLocale(), 'en')); - } - private static function castIntervalToClass(DateInterval $interval, string $className, array $skip = []) - { - $mainClass = DateInterval::class; - if (!\is_a($className, $mainClass, \true)) { - throw new InvalidCastException("{$className} is not a sub-class of {$mainClass}."); - } - $microseconds = $interval->f; - $instance = new $className(static::getDateIntervalSpec($interval, \false, $skip)); - if ($microseconds) { - $instance->f = $microseconds; - } - if ($interval instanceof self && \is_a($className, self::class, \true)) { - self::copyStep($interval, $instance); - } - self::copyNegativeUnits($interval, $instance); - return $instance; - } - private static function copyNegativeUnits(DateInterval $from, DateInterval $to) : void - { - $to->invert = $from->invert; - foreach (['y', 'm', 'd', 'h', 'i', 's'] as $unit) { - if ($from->{$unit} < 0) { - $to->{$unit} *= -1; - } - } - } - private static function copyStep(self $from, self $to) : void - { - $to->setStep($from->getStep()); - } - /** - * Cast the current instance into the given class. - * - * @param string $className The $className::instance() method will be called to cast the current object. - * - * @return DateInterval - */ - public function cast(string $className) - { - return self::castIntervalToClass($this, $className); - } - /** - * Create a CarbonInterval instance from a DateInterval one. Can not instance - * DateInterval objects created from DateTime::diff() as you can't externally - * set the $days field. - * - * @param DateInterval $interval - * @param bool $skipCopy set to true to return the passed object - * (without copying it) if it's already of the - * current class - * - * @return static - */ - public static function instance(DateInterval $interval, array $skip = [], bool $skipCopy = \false) - { - if ($skipCopy && $interval instanceof static) { - return $interval; - } - return self::castIntervalToClass($interval, static::class, $skip); - } - /** - * Make a CarbonInterval instance from given variable if possible. - * - * Always return a new instance. Parse only strings and only these likely to be intervals (skip dates - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * - * @param mixed|int|DateInterval|string|Closure|null $interval interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - * @param bool $skipCopy set to true to return the passed object - * (without copying it) if it's already of the - * current class - * - * @return static|null - */ - public static function make($interval, $unit = null, bool $skipCopy = \false) - { - if ($unit) { - $interval = "{$interval} " . Carbon::pluralUnit($unit); - } - if ($interval instanceof DateInterval) { - return static::instance($interval, [], $skipCopy); - } - if ($interval instanceof Closure) { - return new static($interval); - } - if (!\is_string($interval)) { - return null; - } - return static::makeFromString($interval); - } - protected static function makeFromString(string $interval) - { - $interval = \preg_replace('/\\s+/', ' ', \trim($interval)); - if (\preg_match('/^P[T\\d]/', $interval)) { - return new static($interval); - } - if (\preg_match('/^(?:\\h*\\d+(?:\\.\\d+)?\\h*[a-z]+)+$/i', $interval)) { - return static::fromString($interval); - } - // @codeCoverageIgnoreStart - try { - /** @var static $interval */ - $interval = static::createFromDateString($interval); - } catch (DateMalformedIntervalStringException $e) { - return null; - } - // @codeCoverageIgnoreEnd - return !$interval || $interval->isEmpty() ? null : $interval; - } - protected function resolveInterval($interval) - { - if (!$interval instanceof self) { - return self::make($interval); - } - return $interval; - } - /** - * Sets up a DateInterval from the relative parts of the string. - * - * @param string $time - * - * @return static - * - * @link https://php.net/manual/en/dateinterval.createfromdatestring.php - */ - #[ReturnTypeWillChange] - public static function createFromDateString($time) - { - $interval = @parent::createFromDateString(\strtr($time, [',' => ' ', ' and ' => ' '])); - if ($interval instanceof DateInterval) { - $interval = static::instance($interval); - } - return $interval; - } - /////////////////////////////////////////////////////////////////// - ///////////////////////// GETTERS AND SETTERS ///////////////////// - /////////////////////////////////////////////////////////////////// - /** - * Get a part of the CarbonInterval object. - * - * @param string $name - * - * @throws UnknownGetterException - * - * @return int|float|string - */ - public function get($name) - { - if (\str_starts_with($name, 'total')) { - return $this->total(\substr($name, 5)); - } - switch ($name) { - case 'years': - return $this->y; - case 'months': - return $this->m; - case 'dayz': - return $this->d; - case 'hours': - return $this->h; - case 'minutes': - return $this->i; - case 'seconds': - return $this->s; - case 'milli': - case 'milliseconds': - return (int) (\round($this->f * Carbon::MICROSECONDS_PER_SECOND) / Carbon::MICROSECONDS_PER_MILLISECOND); - case 'micro': - case 'microseconds': - return (int) \round($this->f * Carbon::MICROSECONDS_PER_SECOND); - case 'microExcludeMilli': - return (int) \round($this->f * Carbon::MICROSECONDS_PER_SECOND) % Carbon::MICROSECONDS_PER_MILLISECOND; - case 'weeks': - return (int) ($this->d / (int) static::getDaysPerWeek()); - case 'daysExcludeWeeks': - case 'dayzExcludeWeeks': - return $this->d % (int) static::getDaysPerWeek(); - case 'locale': - return $this->getTranslatorLocale(); - default: - throw new UnknownGetterException($name); - } - } - /** - * Get a part of the CarbonInterval object. - * - * @param string $name - * - * @throws UnknownGetterException - * - * @return int|float|string - */ - public function __get($name) - { - return $this->get($name); - } - /** - * Set a part of the CarbonInterval object. - * - * @param string|array $name - * @param int $value - * - * @throws UnknownSetterException - * - * @return $this - */ - public function set($name, $value = null) - { - $properties = \is_array($name) ? $name : [$name => $value]; - foreach ($properties as $key => $value) { - switch (Carbon::singularUnit(\rtrim($key, 'z'))) { - case 'year': - $this->checkIntegerValue($key, $value); - $this->y = $value; - $this->handleDecimalPart('year', $value, $this->y); - break; - case 'month': - $this->checkIntegerValue($key, $value); - $this->m = $value; - $this->handleDecimalPart('month', $value, $this->m); - break; - case 'week': - $this->checkIntegerValue($key, $value); - $days = $value * (int) static::getDaysPerWeek(); - $this->assertSafeForInteger('days total (including weeks)', $days); - $this->d = $days; - $this->handleDecimalPart('day', $days, $this->d); - break; - case 'day': - $this->checkIntegerValue($key, $value); - $this->d = $value; - $this->handleDecimalPart('day', $value, $this->d); - break; - case 'daysexcludeweek': - case 'dayzexcludeweek': - $this->checkIntegerValue($key, $value); - $days = $this->weeks * (int) static::getDaysPerWeek() + $value; - $this->assertSafeForInteger('days total (including weeks)', $days); - $this->d = $days; - $this->handleDecimalPart('day', $days, $this->d); - break; - case 'hour': - $this->checkIntegerValue($key, $value); - $this->h = $value; - $this->handleDecimalPart('hour', $value, $this->h); - break; - case 'minute': - $this->checkIntegerValue($key, $value); - $this->i = $value; - $this->handleDecimalPart('minute', $value, $this->i); - break; - case 'second': - $this->checkIntegerValue($key, $value); - $this->s = $value; - $this->handleDecimalPart('second', $value, $this->s); - break; - case 'milli': - case 'millisecond': - $this->microseconds = $value * Carbon::MICROSECONDS_PER_MILLISECOND + $this->microseconds % Carbon::MICROSECONDS_PER_MILLISECOND; - break; - case 'micro': - case 'microsecond': - $this->f = $value / Carbon::MICROSECONDS_PER_SECOND; - break; - default: - if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { - throw new UnknownSetterException($key); - } - $this->{$key} = $value; - } - } - return $this; - } - /** - * Set a part of the CarbonInterval object. - * - * @param string $name - * @param int $value - * - * @throws UnknownSetterException - */ - public function __set($name, $value) - { - $this->set($name, $value); - } - /** - * Allow setting of weeks and days to be cumulative. - * - * @param int $weeks Number of weeks to set - * @param int $days Number of days to set - * - * @return static - */ - public function weeksAndDays($weeks, $days) - { - $this->dayz = $weeks * static::getDaysPerWeek() + $days; - return $this; - } - /** - * Returns true if the interval is empty for each unit. - * - * @return bool - */ - public function isEmpty() - { - return $this->years === 0 && $this->months === 0 && $this->dayz === 0 && !$this->days && $this->hours === 0 && $this->minutes === 0 && $this->seconds === 0 && $this->microseconds === 0; - } - /** - * Register a custom macro. - * - * @example - * ``` - * CarbonInterval::macro('twice', function () { - * return $this->times(2); - * }); - * echo CarbonInterval::hours(2)->twice(); - * ``` - * - * @param string $name - * @param object|callable $macro - * - * @return void - */ - public static function macro($name, $macro) - { - static::$macros[$name] = $macro; - } - /** - * Register macros from a mixin object. - * - * @example - * ``` - * CarbonInterval::mixin(new class { - * public function daysToHours() { - * return function () { - * $this->hours += $this->days; - * $this->days = 0; - * - * return $this; - * }; - * } - * public function hoursToDays() { - * return function () { - * $this->days += $this->hours; - * $this->hours = 0; - * - * return $this; - * }; - * } - * }); - * echo CarbonInterval::hours(5)->hoursToDays() . "\n"; - * echo CarbonInterval::days(5)->daysToHours() . "\n"; - * ``` - * - * @param object|string $mixin - * - * @throws ReflectionException - * - * @return void - */ - public static function mixin($mixin) - { - static::baseMixin($mixin); - } - /** - * Check if macro is registered. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro($name) - { - return isset(static::$macros[$name]); - } - /** - * Call given macro. - * - * @param string $name - * @param array $parameters - * - * @return mixed - */ - protected function callMacro($name, $parameters) - { - $macro = static::$macros[$name]; - if ($macro instanceof Closure) { - $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); - return ($boundMacro ?: $macro)(...$parameters); - } - return $macro(...$parameters); - } - /** - * Allow fluent calls on the setters... CarbonInterval::years(3)->months(5)->day(). - * - * Note: This is done using the magic method to allow static and instance methods to - * have the same names. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws BadFluentSetterException|Throwable - * - * @return static - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return static::bindMacroContext($this, function () use(&$method, &$parameters) { - return $this->callMacro($method, $parameters); - }); - } - $roundedValue = $this->callRoundMethod($method, $parameters); - if ($roundedValue !== null) { - return $roundedValue; - } - if (\preg_match('/^(?add|sub)(?[A-Z].*)$/', $method, $match)) { - $value = $this->getMagicParameter($parameters, 0, Carbon::pluralUnit($match['unit']), 0); - return $this->{$match['method']}($value, $match['unit']); - } - $value = $this->getMagicParameter($parameters, 0, Carbon::pluralUnit($method), 1); - try { - $this->set($method, $value); - } catch (UnknownSetterException $exception) { - if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { - throw new BadFluentSetterException($method, 0, $exception); - } - } - return $this; - } - protected function getForHumansInitialVariables($syntax, $short) - { - if (\is_array($syntax)) { - return $syntax; - } - if (\is_int($short)) { - return ['parts' => $short, 'short' => \false]; - } - if (\is_bool($syntax)) { - return ['short' => $syntax, 'syntax' => CarbonInterface::DIFF_ABSOLUTE]; - } - return []; - } - /** - * @param mixed $syntax - * @param mixed $short - * @param mixed $parts - * @param mixed $options - * - * @return array - */ - protected function getForHumansParameters($syntax = null, $short = \false, $parts = -1, $options = null) - { - $optionalSpace = ' '; - $default = $this->getTranslationMessage('list.0') ?? $this->getTranslationMessage('list') ?? ' '; - $join = $default === '' ? '' : ' '; - $altNumbers = \false; - $aUnit = \false; - $minimumUnit = 's'; - $skip = []; - \extract($this->getForHumansInitialVariables($syntax, $short)); - $skip = \array_map('strtolower', \array_filter((array) $skip, static function ($value) { - return \is_string($value) && $value !== ''; - })); - if ($syntax === null) { - $syntax = CarbonInterface::DIFF_ABSOLUTE; - } - if ($parts === -1) { - $parts = \INF; - } - if ($options === null) { - $options = static::getHumanDiffOptions(); - } - if ($join === \false) { - $join = ' '; - } elseif ($join === \true) { - $join = [$default, $this->getTranslationMessage('list.1') ?? $default]; - } - if ($altNumbers && $altNumbers !== \true) { - $language = new Language($this->locale); - $altNumbers = \in_array($language->getCode(), (array) $altNumbers, \true); - } - if (\is_array($join)) { - [$default, $last] = $join; - if ($default !== ' ') { - $optionalSpace = ''; - } - $join = function ($list) use($default, $last) { - if (\count($list) < 2) { - return \implode('', $list); - } - $end = \array_pop($list); - return \implode($default, $list) . $last . $end; - }; - } - if (\is_string($join)) { - if ($join !== ' ') { - $optionalSpace = ''; - } - $glue = $join; - $join = function ($list) use($glue) { - return \implode($glue, $list); - }; - } - $interpolations = [':optional-space' => $optionalSpace]; - return [$syntax, $short, $parts, $options, $join, $aUnit, $altNumbers, $interpolations, $minimumUnit, $skip]; - } - protected static function getRoundingMethodFromOptions(int $options) : ?string - { - if ($options & CarbonInterface::ROUND) { - return 'round'; - } - if ($options & CarbonInterface::CEIL) { - return 'ceil'; - } - if ($options & CarbonInterface::FLOOR) { - return 'floor'; - } - return null; - } - /** - * Returns interval values as an array where key are the unit names and values the counts. - * - * @return int[] - */ - public function toArray() - { - return ['years' => $this->years, 'months' => $this->months, 'weeks' => $this->weeks, 'days' => $this->daysExcludeWeeks, 'hours' => $this->hours, 'minutes' => $this->minutes, 'seconds' => $this->seconds, 'microseconds' => $this->microseconds]; - } - /** - * Returns interval non-zero values as an array where key are the unit names and values the counts. - * - * @return int[] - */ - public function getNonZeroValues() - { - return \array_filter($this->toArray(), 'intval'); - } - /** - * Returns interval values as an array where key are the unit names and values the counts - * from the biggest non-zero one the the smallest non-zero one. - * - * @return int[] - */ - public function getValuesSequence() - { - $nonZeroValues = $this->getNonZeroValues(); - if ($nonZeroValues === []) { - return []; - } - $keys = \array_keys($nonZeroValues); - $firstKey = $keys[0]; - $lastKey = $keys[\count($keys) - 1]; - $values = []; - $record = \false; - foreach ($this->toArray() as $unit => $count) { - if ($unit === $firstKey) { - $record = \true; - } - if ($record) { - $values[$unit] = $count; - } - if ($unit === $lastKey) { - $record = \false; - } - } - return $values; - } - /** - * Get the current interval in a human readable format in the current locale. - * - * @example - * ``` - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans() . "\n"; - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['parts' => 2]) . "\n"; - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['parts' => 3, 'join' => true]) . "\n"; - * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['short' => true]) . "\n"; - * echo CarbonInterval::fromString('1d 24h')->forHumans(['join' => ' or ']) . "\n"; - * echo CarbonInterval::fromString('1d 24h')->forHumans(['minimumUnit' => 'hour']) . "\n"; - * ``` - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'skip' entry, list of units to skip (array of strings or a single string, - * ` it can be the unit name (singular or plural) or its shortcut - * ` (y, m, w, d, h, min, s, ms, µs). - * - 'aUnit' entry, prefer "an hour" over "1 hour" if true - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'minimumUnit' entry determines the smallest unit of time to display can be long or - * ` short form of the units, e.g. 'hour' or 'h' (default value: s) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: -1: no limits) - * @param int $options human diff options - * - * @throws Exception - * - * @return string - */ - public function forHumans($syntax = null, $short = \false, $parts = -1, $options = null) - { - [$syntax, $short, $parts, $options, $join, $aUnit, $altNumbers, $interpolations, $minimumUnit, $skip] = $this->getForHumansParameters($syntax, $short, $parts, $options); - $interval = []; - $syntax = (int) ($syntax ?? CarbonInterface::DIFF_ABSOLUTE); - $absolute = $syntax === CarbonInterface::DIFF_ABSOLUTE; - $relativeToNow = $syntax === CarbonInterface::DIFF_RELATIVE_TO_NOW; - $count = 1; - $unit = $short ? 's' : 'second'; - $isFuture = $this->invert === 1; - $transId = $relativeToNow ? $isFuture ? 'from_now' : 'ago' : ($isFuture ? 'after' : 'before'); - $declensionMode = null; - /** @var \Symfony\Component\Translation\Translator $translator */ - $translator = $this->getLocalTranslator(); - $handleDeclensions = function ($unit, $count, $index = 0, $parts = 1) use($interpolations, $transId, $translator, $altNumbers, $absolute, &$declensionMode) { - if (!$absolute) { - $declensionMode = $declensionMode ?? $this->translate($transId . '_mode'); - if ($this->needsDeclension($declensionMode, $index, $parts)) { - // Some languages have special pluralization for past and future tense. - $key = $unit . '_' . $transId; - $result = $this->translate($key, $interpolations, $count, $translator, $altNumbers); - if ($result !== $key) { - return $result; - } - } - } - $result = $this->translate($unit, $interpolations, $count, $translator, $altNumbers); - if ($result !== $unit) { - return $result; - } - return null; - }; - $intervalValues = $this; - $method = static::getRoundingMethodFromOptions($options); - if ($method) { - $previousCount = \INF; - while (\count($intervalValues->getNonZeroValues()) > $parts && ($count = \count($keys = \array_keys($intervalValues->getValuesSequence()))) > 1) { - $index = \min($count, $previousCount - 1) - 2; - if ($index < 0) { - break; - } - $intervalValues = $this->copy()->roundUnit($keys[$index], 1, $method); - $previousCount = $count; - } - } - $diffIntervalArray = [['value' => $intervalValues->years, 'unit' => 'year', 'unitShort' => 'y'], ['value' => $intervalValues->months, 'unit' => 'month', 'unitShort' => 'm'], ['value' => $intervalValues->weeks, 'unit' => 'week', 'unitShort' => 'w'], ['value' => $intervalValues->daysExcludeWeeks, 'unit' => 'day', 'unitShort' => 'd'], ['value' => $intervalValues->hours, 'unit' => 'hour', 'unitShort' => 'h'], ['value' => $intervalValues->minutes, 'unit' => 'minute', 'unitShort' => 'min'], ['value' => $intervalValues->seconds, 'unit' => 'second', 'unitShort' => 's'], ['value' => $intervalValues->milliseconds, 'unit' => 'millisecond', 'unitShort' => 'ms'], ['value' => $intervalValues->microExcludeMilli, 'unit' => 'microsecond', 'unitShort' => 'µs']]; - if (!empty($skip)) { - foreach ($diffIntervalArray as $index => &$unitData) { - $nextIndex = $index + 1; - if ($unitData['value'] && isset($diffIntervalArray[$nextIndex]) && \count(\array_intersect([$unitData['unit'], $unitData['unit'] . 's', $unitData['unitShort']], $skip))) { - $diffIntervalArray[$nextIndex]['value'] += $unitData['value'] * self::getFactorWithDefault($diffIntervalArray[$nextIndex]['unit'], $unitData['unit']); - $unitData['value'] = 0; - } - } - } - $transChoice = function ($short, $unitData, $index, $parts) use($absolute, $handleDeclensions, $translator, $aUnit, $altNumbers, $interpolations) { - $count = $unitData['value']; - if ($short) { - $result = $handleDeclensions($unitData['unitShort'], $count, $index, $parts); - if ($result !== null) { - return $result; - } - } elseif ($aUnit) { - $result = $handleDeclensions('a_' . $unitData['unit'], $count, $index, $parts); - if ($result !== null) { - return $result; - } - } - if (!$absolute) { - return $handleDeclensions($unitData['unit'], $count, $index, $parts); - } - return $this->translate($unitData['unit'], $interpolations, $count, $translator, $altNumbers); - }; - $fallbackUnit = ['second', 's']; - foreach ($diffIntervalArray as $diffIntervalData) { - if ($diffIntervalData['value'] > 0) { - $unit = $short ? $diffIntervalData['unitShort'] : $diffIntervalData['unit']; - $count = $diffIntervalData['value']; - $interval[] = [$short, $diffIntervalData]; - } elseif ($options & CarbonInterface::SEQUENTIAL_PARTS_ONLY && \count($interval) > 0) { - break; - } - // break the loop after we get the required number of parts in array - if (\count($interval) >= $parts) { - break; - } - // break the loop after we have reached the minimum unit - if (\in_array($minimumUnit, [$diffIntervalData['unit'], $diffIntervalData['unitShort']], \true)) { - $fallbackUnit = [$diffIntervalData['unit'], $diffIntervalData['unitShort']]; - break; - } - } - $actualParts = \count($interval); - foreach ($interval as $index => &$item) { - $item = $transChoice($item[0], $item[1], $index, $actualParts); - } - if (\count($interval) === 0) { - if ($relativeToNow && $options & CarbonInterface::JUST_NOW) { - $key = 'diff_now'; - $translation = $this->translate($key, $interpolations, null, $translator); - if ($translation !== $key) { - return $translation; - } - } - $count = $options & CarbonInterface::NO_ZERO_DIFF ? 1 : 0; - $unit = $fallbackUnit[$short ? 1 : 0]; - $interval[] = $this->translate($unit, $interpolations, $count, $translator, $altNumbers); - } - // join the interval parts by a space - $time = $join($interval); - unset($diffIntervalArray, $interval); - if ($absolute) { - return $time; - } - $isFuture = $this->invert === 1; - $transId = $relativeToNow ? $isFuture ? 'from_now' : 'ago' : ($isFuture ? 'after' : 'before'); - if ($parts === 1) { - if ($relativeToNow && $unit === 'day') { - if ($count === 1 && $options & CarbonInterface::ONE_DAY_WORDS) { - $key = $isFuture ? 'diff_tomorrow' : 'diff_yesterday'; - $translation = $this->translate($key, $interpolations, null, $translator); - if ($translation !== $key) { - return $translation; - } - } - if ($count === 2 && $options & CarbonInterface::TWO_DAY_WORDS) { - $key = $isFuture ? 'diff_after_tomorrow' : 'diff_before_yesterday'; - $translation = $this->translate($key, $interpolations, null, $translator); - if ($translation !== $key) { - return $translation; - } - } - } - $aTime = $aUnit ? $handleDeclensions('a_' . $unit, $count) : null; - $time = ($aTime ?: $handleDeclensions($unit, $count)) ?: $time; - } - $time = [':time' => $time]; - return $this->translate($transId, \array_merge($time, $interpolations, $time), null, $translator); - } - /** - * Format the instance as a string using the forHumans() function. - * - * @throws Exception - * - * @return string - */ - public function __toString() - { - $format = $this->localToStringFormat ?? static::$toStringFormat; - if (!$format) { - return $this->forHumans(); - } - if ($format instanceof Closure) { - return $format($this); - } - return $this->format($format); - } - /** - * Return native DateInterval PHP object matching the current instance. - * - * @example - * ``` - * var_dump(CarbonInterval::hours(2)->toDateInterval()); - * ``` - * - * @return DateInterval - */ - public function toDateInterval() - { - return self::castIntervalToClass($this, DateInterval::class); - } - /** - * Convert the interval to a CarbonPeriod. - * - * @param DateTimeInterface|string|int ...$params Start date, [end date or recurrences] and optional settings. - * - * @return CarbonPeriod - */ - public function toPeriod(...$params) - { - if ($this->tzName) { - $tz = \is_string($this->tzName) ? new DateTimeZone($this->tzName) : $this->tzName; - if ($tz instanceof DateTimeZone) { - \array_unshift($params, $tz); - } - } - return CarbonPeriod::create($this, ...$params); - } - /** - * Invert the interval. - * - * @param bool|int $inverted if a parameter is passed, the passed value cast as 1 or 0 is used - * as the new value of the ->invert property. - * - * @return $this - */ - public function invert($inverted = null) - { - $this->invert = (\func_num_args() === 0 ? !$this->invert : $inverted) ? 1 : 0; - return $this; - } - protected function solveNegativeInterval() - { - if (!$this->isEmpty() && $this->years <= 0 && $this->months <= 0 && $this->dayz <= 0 && $this->hours <= 0 && $this->minutes <= 0 && $this->seconds <= 0 && $this->microseconds <= 0) { - $this->years *= -1; - $this->months *= -1; - $this->dayz *= -1; - $this->hours *= -1; - $this->minutes *= -1; - $this->seconds *= -1; - $this->microseconds *= -1; - $this->invert(); - } - return $this; - } - /** - * Add the passed interval to the current instance. - * - * @param string|DateInterval $unit - * @param int|float $value - * - * @return $this - */ - public function add($unit, $value = 1) - { - if (\is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - if (\is_string($unit) && !\preg_match('/^\\s*\\d/', $unit)) { - $unit = "{$value} {$unit}"; - $value = 1; - } - $interval = static::make($unit); - if (!$interval) { - throw new InvalidIntervalException('This type of data cannot be added/subtracted.'); - } - if ($value !== 1) { - $interval->times($value); - } - $sign = ($this->invert === 1) !== ($interval->invert === 1) ? -1 : 1; - $this->years += $interval->y * $sign; - $this->months += $interval->m * $sign; - $this->dayz += ($interval->days === \false ? $interval->d : $interval->days) * $sign; - $this->hours += $interval->h * $sign; - $this->minutes += $interval->i * $sign; - $this->seconds += $interval->s * $sign; - $this->microseconds += $interval->microseconds * $sign; - $this->solveNegativeInterval(); - return $this; - } - /** - * Subtract the passed interval to the current instance. - * - * @param string|DateInterval $unit - * @param int|float $value - * - * @return $this - */ - public function sub($unit, $value = 1) - { - if (\is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - return $this->add($unit, -(float) $value); - } - /** - * Subtract the passed interval to the current instance. - * - * @param string|DateInterval $unit - * @param int|float $value - * - * @return $this - */ - public function subtract($unit, $value = 1) - { - return $this->sub($unit, $value); - } - /** - * Add given parameters to the current interval. - * - * @param int $years - * @param int $months - * @param int|float $weeks - * @param int|float $days - * @param int|float $hours - * @param int|float $minutes - * @param int|float $seconds - * @param int|float $microseconds - * - * @return $this - */ - public function plus($years = 0, $months = 0, $weeks = 0, $days = 0, $hours = 0, $minutes = 0, $seconds = 0, $microseconds = 0) : self - { - return $this->add("\n {$years} years {$months} months {$weeks} weeks {$days} days\n {$hours} hours {$minutes} minutes {$seconds} seconds {$microseconds} microseconds\n "); - } - /** - * Add given parameters to the current interval. - * - * @param int $years - * @param int $months - * @param int|float $weeks - * @param int|float $days - * @param int|float $hours - * @param int|float $minutes - * @param int|float $seconds - * @param int|float $microseconds - * - * @return $this - */ - public function minus($years = 0, $months = 0, $weeks = 0, $days = 0, $hours = 0, $minutes = 0, $seconds = 0, $microseconds = 0) : self - { - return $this->sub("\n {$years} years {$months} months {$weeks} weeks {$days} days\n {$hours} hours {$minutes} minutes {$seconds} seconds {$microseconds} microseconds\n "); - } - /** - * Multiply current instance given number of times. times() is naive, it multiplies each unit - * (so day can be greater than 31, hour can be greater than 23, etc.) and the result is rounded - * separately for each unit. - * - * Use times() when you want a fast and approximated calculation that does not cascade units. - * - * For a precise and cascaded calculation, - * - * @see multiply() - * - * @param float|int $factor - * - * @return $this - */ - public function times($factor) - { - if ($factor < 0) { - $this->invert = $this->invert ? 0 : 1; - $factor = -$factor; - } - $this->years = (int) \round($this->years * $factor); - $this->months = (int) \round($this->months * $factor); - $this->dayz = (int) \round($this->dayz * $factor); - $this->hours = (int) \round($this->hours * $factor); - $this->minutes = (int) \round($this->minutes * $factor); - $this->seconds = (int) \round($this->seconds * $factor); - $this->microseconds = (int) \round($this->microseconds * $factor); - return $this; - } - /** - * Divide current instance by a given divider. shares() is naive, it divides each unit separately - * and the result is rounded for each unit. So 5 hours and 20 minutes shared by 3 becomes 2 hours - * and 7 minutes. - * - * Use shares() when you want a fast and approximated calculation that does not cascade units. - * - * For a precise and cascaded calculation, - * - * @see divide() - * - * @param float|int $divider - * - * @return $this - */ - public function shares($divider) - { - return $this->times(1 / $divider); - } - protected function copyProperties(self $interval, $ignoreSign = \false) - { - $this->years = $interval->years; - $this->months = $interval->months; - $this->dayz = $interval->dayz; - $this->hours = $interval->hours; - $this->minutes = $interval->minutes; - $this->seconds = $interval->seconds; - $this->microseconds = $interval->microseconds; - if (!$ignoreSign) { - $this->invert = $interval->invert; - } - return $this; - } - /** - * Multiply and cascade current instance by a given factor. - * - * @param float|int $factor - * - * @return $this - */ - public function multiply($factor) - { - if ($factor < 0) { - $this->invert = $this->invert ? 0 : 1; - $factor = -$factor; - } - $yearPart = (int) \floor($this->years * $factor); - // Split calculation to prevent imprecision - if ($yearPart) { - $this->years -= $yearPart / $factor; - } - return $this->copyProperties(static::create($yearPart)->microseconds(\abs($this->totalMicroseconds) * $factor)->cascade(), \true); - } - /** - * Divide and cascade current instance by a given divider. - * - * @param float|int $divider - * - * @return $this - */ - public function divide($divider) - { - return $this->multiply(1 / $divider); - } - /** - * Get the interval_spec string of a date interval. - * - * @param DateInterval $interval - * - * @return string - */ - public static function getDateIntervalSpec(DateInterval $interval, bool $microseconds = \false, array $skip = []) - { - $date = \array_filter([static::PERIOD_YEARS => \abs($interval->y), static::PERIOD_MONTHS => \abs($interval->m), static::PERIOD_DAYS => \abs($interval->d)]); - if ($interval->days >= CarbonInterface::DAYS_PER_WEEK * CarbonInterface::WEEKS_PER_MONTH && (!isset($date[static::PERIOD_YEARS]) || \count(\array_intersect(['y', 'year', 'years'], $skip))) && (!isset($date[static::PERIOD_MONTHS]) || \count(\array_intersect(['m', 'month', 'months'], $skip)))) { - $date = [static::PERIOD_DAYS => \abs($interval->days)]; - } - $seconds = \abs($interval->s); - if ($microseconds && $interval->f > 0) { - $seconds = \sprintf('%d.%06d', $seconds, \abs($interval->f) * 1000000); - } - $time = \array_filter([static::PERIOD_HOURS => \abs($interval->h), static::PERIOD_MINUTES => \abs($interval->i), static::PERIOD_SECONDS => $seconds]); - $specString = static::PERIOD_PREFIX; - foreach ($date as $key => $value) { - $specString .= $value . $key; - } - if (\count($time) > 0) { - $specString .= static::PERIOD_TIME_PREFIX; - foreach ($time as $key => $value) { - $specString .= $value . $key; - } - } - return $specString === static::PERIOD_PREFIX ? 'PT0S' : $specString; - } - /** - * Get the interval_spec string. - * - * @return string - */ - public function spec(bool $microseconds = \false) - { - return static::getDateIntervalSpec($this, $microseconds); - } - /** - * Comparing 2 date intervals. - * - * @param DateInterval $first - * @param DateInterval $second - * - * @return int - */ - public static function compareDateIntervals(DateInterval $first, DateInterval $second) - { - $current = Carbon::now(); - $passed = $current->avoidMutation()->add($second); - $current->add($first); - if ($current < $passed) { - return -1; - } - if ($current > $passed) { - return 1; - } - return 0; - } - /** - * Comparing with passed interval. - * - * @param DateInterval $interval - * - * @return int - */ - public function compare(DateInterval $interval) - { - return static::compareDateIntervals($this, $interval); - } - private function invertCascade(array $values) - { - return $this->set(\array_map(function ($value) { - return -$value; - }, $values))->doCascade(\true)->invert(); - } - private function doCascade(bool $deep) - { - $originalData = $this->toArray(); - $originalData['milliseconds'] = (int) ($originalData['microseconds'] / static::getMicrosecondsPerMillisecond()); - $originalData['microseconds'] = $originalData['microseconds'] % static::getMicrosecondsPerMillisecond(); - $originalData['weeks'] = (int) ($this->d / static::getDaysPerWeek()); - $originalData['daysExcludeWeeks'] = \fmod($this->d, static::getDaysPerWeek()); - unset($originalData['days']); - $newData = $originalData; - $previous = []; - foreach (self::getFlipCascadeFactors() as $source => [$target, $factor]) { - foreach (['source', 'target'] as $key) { - if (${$key} === 'dayz') { - ${$key} = 'daysExcludeWeeks'; - } - } - $value = $newData[$source]; - $modulo = \fmod($factor + \fmod($value, $factor), $factor); - $newData[$source] = $modulo; - $newData[$target] += ($value - $modulo) / $factor; - $decimalPart = \fmod($newData[$source], 1); - if ($decimalPart !== 0.0) { - $unit = $source; - foreach ($previous as [$subUnit, $subFactor]) { - $newData[$unit] -= $decimalPart; - $newData[$subUnit] += $decimalPart * $subFactor; - $decimalPart = \fmod($newData[$subUnit], 1); - if ($decimalPart === 0.0) { - break; - } - $unit = $subUnit; - } - } - \array_unshift($previous, [$source, $factor]); - } - $positive = null; - if (!$deep) { - foreach ($newData as $value) { - if ($value) { - if ($positive === null) { - $positive = $value > 0; - continue; - } - if ($value > 0 !== $positive) { - return $this->invertCascade($originalData)->solveNegativeInterval(); - } - } - } - } - return $this->set($newData)->solveNegativeInterval(); - } - /** - * Convert overflowed values into bigger units. - * - * @return $this - */ - public function cascade() - { - return $this->doCascade(\false); - } - public function hasNegativeValues() : bool - { - foreach ($this->toArray() as $value) { - if ($value < 0) { - return \true; - } - } - return \false; - } - public function hasPositiveValues() : bool - { - foreach ($this->toArray() as $value) { - if ($value > 0) { - return \true; - } - } - return \false; - } - /** - * Get amount of given unit equivalent to the interval. - * - * @param string $unit - * - * @throws UnknownUnitException|UnitNotConfiguredException - * - * @return float - */ - public function total($unit) - { - $realUnit = $unit = \strtolower($unit); - if (\in_array($unit, ['days', 'weeks'])) { - $realUnit = 'dayz'; - } elseif (!\in_array($unit, ['microseconds', 'milliseconds', 'seconds', 'minutes', 'hours', 'dayz', 'months', 'years'])) { - throw new UnknownUnitException($unit); - } - $result = 0; - $cumulativeFactor = 0; - $unitFound = \false; - $factors = self::getFlipCascadeFactors(); - $daysPerWeek = (int) static::getDaysPerWeek(); - $values = ['years' => $this->years, 'months' => $this->months, 'weeks' => (int) ($this->d / $daysPerWeek), 'dayz' => \fmod($this->d, $daysPerWeek), 'hours' => $this->hours, 'minutes' => $this->minutes, 'seconds' => $this->seconds, 'milliseconds' => (int) ($this->microseconds / Carbon::MICROSECONDS_PER_MILLISECOND), 'microseconds' => $this->microseconds % Carbon::MICROSECONDS_PER_MILLISECOND]; - if (isset($factors['dayz']) && $factors['dayz'][0] !== 'weeks') { - $values['dayz'] += $values['weeks'] * $daysPerWeek; - $values['weeks'] = 0; - } - foreach ($factors as $source => [$target, $factor]) { - if ($source === $realUnit) { - $unitFound = \true; - $value = $values[$source]; - $result += $value; - $cumulativeFactor = 1; - } - if ($factor === \false) { - if ($unitFound) { - break; - } - $result = 0; - $cumulativeFactor = 0; - continue; - } - if ($target === $realUnit) { - $unitFound = \true; - } - if ($cumulativeFactor) { - $cumulativeFactor *= $factor; - $result += $values[$target] * $cumulativeFactor; - continue; - } - $value = $values[$source]; - $result = ($result + $value) / $factor; - } - if (isset($target) && !$cumulativeFactor) { - $result += $values[$target]; - } - if (!$unitFound) { - throw new UnitNotConfiguredException($unit); - } - if ($this->invert) { - $result *= -1; - } - if ($unit === 'weeks') { - $result /= $daysPerWeek; - } - // Cast as int numbers with no decimal part - return \fmod($result, 1) === 0.0 ? (int) $result : $result; - } - /** - * Determines if the instance is equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see equalTo() - * - * @return bool - */ - public function eq($interval) : bool - { - return $this->equalTo($interval); - } - /** - * Determines if the instance is equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function equalTo($interval) : bool - { - $interval = $this->resolveInterval($interval); - return $interval !== null && $this->totalMicroseconds === $interval->totalMicroseconds; - } - /** - * Determines if the instance is not equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see notEqualTo() - * - * @return bool - */ - public function ne($interval) : bool - { - return $this->notEqualTo($interval); - } - /** - * Determines if the instance is not equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function notEqualTo($interval) : bool - { - return !$this->eq($interval); - } - /** - * Determines if the instance is greater (longer) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see greaterThan() - * - * @return bool - */ - public function gt($interval) : bool - { - return $this->greaterThan($interval); - } - /** - * Determines if the instance is greater (longer) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function greaterThan($interval) : bool - { - $interval = $this->resolveInterval($interval); - return $interval === null || $this->totalMicroseconds > $interval->totalMicroseconds; - } - /** - * Determines if the instance is greater (longer) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see greaterThanOrEqualTo() - * - * @return bool - */ - public function gte($interval) : bool - { - return $this->greaterThanOrEqualTo($interval); - } - /** - * Determines if the instance is greater (longer) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function greaterThanOrEqualTo($interval) : bool - { - return $this->greaterThan($interval) || $this->equalTo($interval); - } - /** - * Determines if the instance is less (shorter) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see lessThan() - * - * @return bool - */ - public function lt($interval) : bool - { - return $this->lessThan($interval); - } - /** - * Determines if the instance is less (shorter) than another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function lessThan($interval) : bool - { - $interval = $this->resolveInterval($interval); - return $interval !== null && $this->totalMicroseconds < $interval->totalMicroseconds; - } - /** - * Determines if the instance is less (shorter) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @see lessThanOrEqualTo() - * - * @return bool - */ - public function lte($interval) : bool - { - return $this->lessThanOrEqualTo($interval); - } - /** - * Determines if the instance is less (shorter) than or equal to another - * - * @param CarbonInterval|DateInterval|mixed $interval - * - * @return bool - */ - public function lessThanOrEqualTo($interval) : bool - { - return $this->lessThan($interval) || $this->equalTo($interval); - } - /** - * Determines if the instance is between two others. - * - * The third argument allow you to specify if bounds are included or not (true by default) - * but for when you including/excluding bounds may produce different results in your application, - * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. - * - * @example - * ``` - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(2)); // true - * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(2), false); // false - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function between($interval1, $interval2, $equal = \true) : bool - { - return $equal ? $this->greaterThanOrEqualTo($interval1) && $this->lessThanOrEqualTo($interval2) : $this->greaterThan($interval1) && $this->lessThan($interval2); - } - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(2)); // true - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * - * @return bool - */ - public function betweenIncluded($interval1, $interval2) : bool - { - return $this->between($interval1, $interval2, \true); - } - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(2)); // false - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * - * @return bool - */ - public function betweenExcluded($interval1, $interval2) : bool - { - return $this->between($interval1, $interval2, \false); - } - /** - * Determines if the instance is between two others - * - * @example - * ``` - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(3)); // true - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::hours(36)); // false - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(2)); // true - * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(2), false); // false - * ``` - * - * @param CarbonInterval|DateInterval|mixed $interval1 - * @param CarbonInterval|DateInterval|mixed $interval2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function isBetween($interval1, $interval2, $equal = \true) : bool - { - return $this->between($interval1, $interval2, $equal); - } - /** - * Round the current instance at the given unit with given precision if specified and the given function. - * - * @param string $unit - * @param float|int|string|DateInterval|null $precision - * @param string $function - * - * @throws Exception - * - * @return $this - */ - public function roundUnit($unit, $precision = 1, $function = 'round') - { - if (static::getCascadeFactors() !== static::getDefaultCascadeFactors()) { - $value = $function($this->total($unit) / $precision) * $precision; - $inverted = $value < 0; - return $this->copyProperties(self::fromString(\number_format(\abs($value), 12, '.', '') . ' ' . $unit)->invert($inverted)->cascade()); - } - $base = CarbonImmutable::parse('2000-01-01 00:00:00', 'UTC')->roundUnit($unit, $precision, $function); - $next = $base->add($this); - $inverted = $next < $base; - if ($inverted) { - $next = $base->sub($this); - } - $this->copyProperties($next->roundUnit($unit, $precision, $function)->diffAsCarbonInterval($base)); - return $this->invert($inverted); - } - /** - * Truncate the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int|string|DateInterval|null $precision - * - * @throws Exception - * - * @return $this - */ - public function floorUnit($unit, $precision = 1) - { - return $this->roundUnit($unit, $precision, 'floor'); - } - /** - * Ceil the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int|string|DateInterval|null $precision - * - * @throws Exception - * - * @return $this - */ - public function ceilUnit($unit, $precision = 1) - { - return $this->roundUnit($unit, $precision, 'ceil'); - } - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|DateInterval|null $precision - * @param string $function - * - * @throws Exception - * - * @return $this - */ - public function round($precision = 1, $function = 'round') - { - return $this->roundWith($precision, $function); - } - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|DateInterval|null $precision - * - * @throws Exception - * - * @return $this - */ - public function floor($precision = 1) - { - return $this->round($precision, 'floor'); - } - /** - * Ceil the current instance second with given precision if specified. - * - * @param float|int|string|DateInterval|null $precision - * - * @throws Exception - * - * @return $this - */ - public function ceil($precision = 1) - { - return $this->round($precision, 'ceil'); - } - private function needsDeclension(string $mode, int $index, int $parts) : bool - { - switch ($mode) { - case 'last': - return $index === $parts - 1; - default: - return \true; - } - } - private function checkIntegerValue(string $name, $value) - { - if (\is_int($value)) { - return; - } - $this->assertSafeForInteger($name, $value); - if (\is_float($value) && (float) (int) $value === $value) { - return; - } - if (!self::$floatSettersEnabled) { - $type = \gettype($value); - @\trigger_error("Since 2.70.0, it's deprecated to pass {$type} value for {$name}.\n" . "It's truncated when stored as an integer interval unit.\n" . "From 3.0.0, decimal part will no longer be truncated and will be cascaded to smaller units.\n" . "- To maintain the current behavior, use explicit cast: {$name}((int) \$value)\n" . "- To adopt the new behavior globally, call CarbonInterval::enableFloatSetters()\n", \E_USER_DEPRECATED); - } - } - /** - * Throw an exception if precision loss when storing the given value as an integer would be >= 1.0. - */ - private function assertSafeForInteger(string $name, $value) - { - if ($value && !\is_int($value) && ($value >= 0x7fffffffffffffff || $value <= -0x7fffffffffffffff)) { - throw new OutOfRangeException($name, -0x7fffffffffffffff, 0x7fffffffffffffff, $value); - } - } - private function handleDecimalPart(string $unit, $value, $integerValue) - { - if (self::$floatSettersEnabled) { - $floatValue = (float) $value; - $base = (float) $integerValue; - if ($floatValue === $base) { - return; - } - $units = ['y' => 'year', 'm' => 'month', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second']; - $upper = \true; - foreach ($units as $property => $name) { - if ($name === $unit) { - $upper = \false; - continue; - } - if (!$upper && $this->{$property} !== 0) { - throw new RuntimeException("You cannot set {$unit} to a float value as {$name} would be overridden, " . 'set it first to 0 explicitly if you really want to erase its value'); - } - } - $this->add($unit, $floatValue - $base); - } - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonPeriod.php b/dependencies/nesbot/carbon/src/Carbon/CarbonPeriod.php deleted file mode 100644 index 01d4999..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonPeriod.php +++ /dev/null @@ -1,2269 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\EndLessPeriodException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidCastException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidIntervalException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidPeriodDateException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidPeriodParameterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\NotACarbonClassException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\NotAPeriodException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownGetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownMethodException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnreachableException; -use WP_Ultimo\Dependencies\Carbon\Traits\IntervalRounding; -use WP_Ultimo\Dependencies\Carbon\Traits\Mixin; -use WP_Ultimo\Dependencies\Carbon\Traits\Options; -use WP_Ultimo\Dependencies\Carbon\Traits\ToStringFormat; -use Closure; -use Countable; -use DateInterval; -use DatePeriod; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use InvalidArgumentException; -use Iterator; -use JsonSerializable; -use ReflectionException; -use ReturnTypeWillChange; -use RuntimeException; -/** - * Substitution of DatePeriod with some modifications and many more features. - * - * @property-read int|float $recurrences number of recurrences (if end not set). - * @property-read bool $include_start_date rather the start date is included in the iteration. - * @property-read bool $include_end_date rather the end date is included in the iteration (if recurrences not set). - * @property-read CarbonInterface $start Period start date. - * @property-read CarbonInterface $current Current date from the iteration. - * @property-read CarbonInterface $end Period end date. - * @property-read CarbonInterval $interval Underlying date interval instance. Always present, one day by default. - * - * @method static static start($date, $inclusive = null) Create instance specifying start date or modify the start date if called on an instance. - * @method static static since($date, $inclusive = null) Alias for start(). - * @method static static sinceNow($inclusive = null) Create instance with start date set to now or set the start date to now if called on an instance. - * @method static static end($date = null, $inclusive = null) Create instance specifying end date or modify the end date if called on an instance. - * @method static static until($date = null, $inclusive = null) Alias for end(). - * @method static static untilNow($inclusive = null) Create instance with end date set to now or set the end date to now if called on an instance. - * @method static static dates($start, $end = null) Create instance with start and end dates or modify the start and end dates if called on an instance. - * @method static static between($start, $end = null) Create instance with start and end dates or modify the start and end dates if called on an instance. - * @method static static recurrences($recurrences = null) Create instance with maximum number of recurrences or modify the number of recurrences if called on an instance. - * @method static static times($recurrences = null) Alias for recurrences(). - * @method static static options($options = null) Create instance with options or modify the options if called on an instance. - * @method static static toggle($options, $state = null) Create instance with options toggled on or off, or toggle options if called on an instance. - * @method static static filter($callback, $name = null) Create instance with filter added to the stack or append a filter if called on an instance. - * @method static static push($callback, $name = null) Alias for filter(). - * @method static static prepend($callback, $name = null) Create instance with filter prepended to the stack or prepend a filter if called on an instance. - * @method static static filters(array $filters = []) Create instance with filters stack or replace the whole filters stack if called on an instance. - * @method static static interval($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static each($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static every($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static step($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static stepBy($interval) Create instance with given date interval or modify the interval if called on an instance. - * @method static static invert() Create instance with inverted date interval or invert the interval if called on an instance. - * @method static static years($years = 1) Create instance specifying a number of years for date interval or replace the interval by the given a number of years if called on an instance. - * @method static static year($years = 1) Alias for years(). - * @method static static months($months = 1) Create instance specifying a number of months for date interval or replace the interval by the given a number of months if called on an instance. - * @method static static month($months = 1) Alias for months(). - * @method static static weeks($weeks = 1) Create instance specifying a number of weeks for date interval or replace the interval by the given a number of weeks if called on an instance. - * @method static static week($weeks = 1) Alias for weeks(). - * @method static static days($days = 1) Create instance specifying a number of days for date interval or replace the interval by the given a number of days if called on an instance. - * @method static static dayz($days = 1) Alias for days(). - * @method static static day($days = 1) Alias for days(). - * @method static static hours($hours = 1) Create instance specifying a number of hours for date interval or replace the interval by the given a number of hours if called on an instance. - * @method static static hour($hours = 1) Alias for hours(). - * @method static static minutes($minutes = 1) Create instance specifying a number of minutes for date interval or replace the interval by the given a number of minutes if called on an instance. - * @method static static minute($minutes = 1) Alias for minutes(). - * @method static static seconds($seconds = 1) Create instance specifying a number of seconds for date interval or replace the interval by the given a number of seconds if called on an instance. - * @method static static second($seconds = 1) Alias for seconds(). - * @method static static milliseconds($milliseconds = 1) Create instance specifying a number of milliseconds for date interval or replace the interval by the given a number of milliseconds if called on an instance. - * @method static static millisecond($milliseconds = 1) Alias for milliseconds(). - * @method static static microseconds($microseconds = 1) Create instance specifying a number of microseconds for date interval or replace the interval by the given a number of microseconds if called on an instance. - * @method static static microsecond($microseconds = 1) Alias for microseconds(). - * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundWeek(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundWeeks(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorWeek(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorWeeks(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilWeek(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilWeeks(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ -class CarbonPeriod implements Iterator, Countable, JsonSerializable -{ - use IntervalRounding; - use Mixin { - Mixin::mixin as baseMixin; - } - use Options; - use ToStringFormat; - /** - * Built-in filter for limit by recurrences. - * - * @var callable - */ - public const RECURRENCES_FILTER = [self::class, 'filterRecurrences']; - /** - * Built-in filter for limit to an end. - * - * @var callable - */ - public const END_DATE_FILTER = [self::class, 'filterEndDate']; - /** - * Special value which can be returned by filters to end iteration. Also a filter. - * - * @var callable - */ - public const END_ITERATION = [self::class, 'endIteration']; - /** - * Exclude start date from iteration. - * - * @var int - */ - public const EXCLUDE_START_DATE = 1; - /** - * Exclude end date from iteration. - * - * @var int - */ - public const EXCLUDE_END_DATE = 2; - /** - * Yield CarbonImmutable instances. - * - * @var int - */ - public const IMMUTABLE = 4; - /** - * Number of maximum attempts before giving up on finding next valid date. - * - * @var int - */ - public const NEXT_MAX_ATTEMPTS = 1000; - /** - * Number of maximum attempts before giving up on finding end date. - * - * @var int - */ - public const END_MAX_ATTEMPTS = 10000; - /** - * The registered macros. - * - * @var array - */ - protected static $macros = []; - /** - * Date class of iteration items. - * - * @var string - */ - protected $dateClass = Carbon::class; - /** - * Underlying date interval instance. Always present, one day by default. - * - * @var CarbonInterval - */ - protected $dateInterval; - /** - * True once __construct is finished. - * - * @var bool - */ - protected $constructed = \false; - /** - * Whether current date interval was set by default. - * - * @var bool - */ - protected $isDefaultInterval; - /** - * The filters stack. - * - * @var array - */ - protected $filters = []; - /** - * Period start date. Applied on rewind. Always present, now by default. - * - * @var CarbonInterface - */ - protected $startDate; - /** - * Period end date. For inverted interval should be before the start date. Applied via a filter. - * - * @var CarbonInterface|null - */ - protected $endDate; - /** - * Limit for number of recurrences. Applied via a filter. - * - * @var int|null - */ - protected $recurrences; - /** - * Iteration options. - * - * @var int - */ - protected $options; - /** - * Index of current date. Always sequential, even if some dates are skipped by filters. - * Equal to null only before the first iteration. - * - * @var int - */ - protected $key; - /** - * Current date. May temporarily hold unaccepted value when looking for a next valid date. - * Equal to null only before the first iteration. - * - * @var CarbonInterface - */ - protected $current; - /** - * Timezone of current date. Taken from the start date. - * - * @var \DateTimeZone|null - */ - protected $timezone; - /** - * The cached validation result for current date. - * - * @var bool|string|null - */ - protected $validationResult; - /** - * Timezone handler for settings() method. - * - * @var mixed - */ - protected $tzName; - /** - * Make a CarbonPeriod instance from given variable if possible. - * - * @param mixed $var - * - * @return static|null - */ - public static function make($var) - { - try { - return static::instance($var); - } catch (NotAPeriodException $e) { - return static::create($var); - } - } - /** - * Create a new instance from a DatePeriod or CarbonPeriod object. - * - * @param CarbonPeriod|DatePeriod $period - * - * @return static - */ - public static function instance($period) - { - if ($period instanceof static) { - return $period->copy(); - } - if ($period instanceof self) { - return new static($period->getStartDate(), $period->getEndDate() ?: $period->getRecurrences(), $period->getDateInterval(), $period->getOptions()); - } - if ($period instanceof DatePeriod) { - return new static($period->start, $period->end ?: $period->recurrences - 1, $period->interval, $period->include_start_date ? 0 : static::EXCLUDE_START_DATE); - } - $class = static::class; - $type = \gettype($period); - throw new NotAPeriodException('Argument 1 passed to ' . $class . '::' . __METHOD__ . '() ' . 'must be an instance of DatePeriod or ' . $class . ', ' . ($type === 'object' ? 'instance of ' . \get_class($period) : $type) . ' given.'); - } - /** - * Create a new instance. - * - * @return static - */ - public static function create(...$params) - { - return static::createFromArray($params); - } - /** - * Create a new instance from an array of parameters. - * - * @param array $params - * - * @return static - */ - public static function createFromArray(array $params) - { - return new static(...$params); - } - /** - * Create CarbonPeriod from ISO 8601 string. - * - * @param string $iso - * @param int|null $options - * - * @return static - */ - public static function createFromIso($iso, $options = null) - { - $params = static::parseIso8601($iso); - $instance = static::createFromArray($params); - if ($options !== null) { - $instance->setOptions($options); - } - return $instance; - } - /** - * Return whether given interval contains non zero value of any time unit. - * - * @param \DateInterval $interval - * - * @return bool - */ - protected static function intervalHasTime(DateInterval $interval) - { - return $interval->h || $interval->i || $interval->s || $interval->f; - } - /** - * Return whether given variable is an ISO 8601 specification. - * - * Note: Check is very basic, as actual validation will be done later when parsing. - * We just want to ensure that variable is not any other type of a valid parameter. - * - * @param mixed $var - * - * @return bool - */ - protected static function isIso8601($var) - { - if (!\is_string($var)) { - return \false; - } - // Match slash but not within a timezone name. - $part = '[a-z]+(?:[_-][a-z]+)*'; - \preg_match("#\\b{$part}/{$part}\\b|(/)#i", $var, $match); - return isset($match[1]); - } - /** - * Parse given ISO 8601 string into an array of arguments. - * - * @SuppressWarnings(PHPMD.ElseExpression) - * - * @param string $iso - * - * @return array - */ - protected static function parseIso8601($iso) - { - $result = []; - $interval = null; - $start = null; - $end = null; - foreach (\explode('/', $iso) as $key => $part) { - if ($key === 0 && \preg_match('/^R(\\d*|INF)$/', $part, $match)) { - $parsed = \strlen($match[1]) ? $match[1] !== 'INF' ? (int) $match[1] : \INF : null; - } elseif ($interval === null && ($parsed = CarbonInterval::make($part))) { - $interval = $part; - } elseif ($start === null && ($parsed = Carbon::make($part))) { - $start = $part; - } elseif ($end === null && ($parsed = Carbon::make(static::addMissingParts($start ?? '', $part)))) { - $end = $part; - } else { - throw new InvalidPeriodParameterException("Invalid ISO 8601 specification: {$iso}."); - } - $result[] = $parsed; - } - return $result; - } - /** - * Add missing parts of the target date from the soure date. - * - * @param string $source - * @param string $target - * - * @return string - */ - protected static function addMissingParts($source, $target) - { - $pattern = '/' . \preg_replace('/\\d+/', '[0-9]+', \preg_quote($target, '/')) . '$/'; - $result = \preg_replace($pattern, $target, $source, 1, $count); - return $count ? $result : $target; - } - /** - * Register a custom macro. - * - * @example - * ``` - * CarbonPeriod::macro('middle', function () { - * return $this->getStartDate()->average($this->getEndDate()); - * }); - * echo CarbonPeriod::since('2011-05-12')->until('2011-06-03')->middle(); - * ``` - * - * @param string $name - * @param object|callable $macro - * - * @return void - */ - public static function macro($name, $macro) - { - static::$macros[$name] = $macro; - } - /** - * Register macros from a mixin object. - * - * @example - * ``` - * CarbonPeriod::mixin(new class { - * public function addDays() { - * return function ($count = 1) { - * return $this->setStartDate( - * $this->getStartDate()->addDays($count) - * )->setEndDate( - * $this->getEndDate()->addDays($count) - * ); - * }; - * } - * public function subDays() { - * return function ($count = 1) { - * return $this->setStartDate( - * $this->getStartDate()->subDays($count) - * )->setEndDate( - * $this->getEndDate()->subDays($count) - * ); - * }; - * } - * }); - * echo CarbonPeriod::create('2000-01-01', '2000-02-01')->addDays(5)->subDays(3); - * ``` - * - * @param object|string $mixin - * - * @throws ReflectionException - * - * @return void - */ - public static function mixin($mixin) - { - static::baseMixin($mixin); - } - /** - * Check if macro is registered. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro($name) - { - return isset(static::$macros[$name]); - } - /** - * Provide static proxy for instance aliases. - * - * @param string $method - * @param array $parameters - * - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - $date = new static(); - if (static::hasMacro($method)) { - return static::bindMacroContext(null, function () use(&$method, &$parameters, &$date) { - return $date->callMacro($method, $parameters); - }); - } - return $date->{$method}(...$parameters); - } - /** - * CarbonPeriod constructor. - * - * @SuppressWarnings(PHPMD.ElseExpression) - * - * @throws InvalidArgumentException - */ - public function __construct(...$arguments) - { - if (\is_a($this->dateClass, DateTimeImmutable::class, \true)) { - $this->options = static::IMMUTABLE; - } - // Parse and assign arguments one by one. First argument may be an ISO 8601 spec, - // which will be first parsed into parts and then processed the same way. - $argumentsCount = \count($arguments); - if ($argumentsCount && static::isIso8601($iso = $arguments[0])) { - \array_splice($arguments, 0, 1, static::parseIso8601($iso)); - } - if ($argumentsCount === 1) { - if ($arguments[0] instanceof DatePeriod) { - $arguments = [$arguments[0]->start, $arguments[0]->end ?: $arguments[0]->recurrences - 1, $arguments[0]->interval, $arguments[0]->include_start_date ? 0 : static::EXCLUDE_START_DATE]; - } elseif ($arguments[0] instanceof self) { - $arguments = [$arguments[0]->getStartDate(), $arguments[0]->getEndDate() ?: $arguments[0]->getRecurrences(), $arguments[0]->getDateInterval(), $arguments[0]->getOptions()]; - } - } - $optionsSet = \false; - foreach ($arguments as $argument) { - $parsedDate = null; - if ($argument instanceof DateTimeZone) { - $this->setTimezone($argument); - } elseif ($this->dateInterval === null && (\is_string($argument) && \preg_match('/^(-?\\d(\\d(?![\\/-])|[^\\d\\/-]([\\/-])?)*|P[T\\d].*|(?:\\h*\\d+(?:\\.\\d+)?\\h*[a-z]+)+)$/i', $argument) || $argument instanceof DateInterval || $argument instanceof Closure) && ($parsedInterval = @CarbonInterval::make($argument))) { - $this->setDateInterval($parsedInterval); - } elseif ($this->startDate === null && ($parsedDate = $this->makeDateTime($argument))) { - $this->setStartDate($parsedDate); - } elseif ($this->endDate === null && ($parsedDate = $parsedDate ?? $this->makeDateTime($argument))) { - $this->setEndDate($parsedDate); - } elseif ($this->recurrences === null && $this->endDate === null && \is_numeric($argument)) { - $this->setRecurrences($argument); - } elseif (!$optionsSet && (\is_int($argument) || $argument === null)) { - $optionsSet = \true; - $this->setOptions((int) $this->options | (int) $argument); - } else { - throw new InvalidPeriodParameterException('Invalid constructor parameters.'); - } - } - if ($this->startDate === null) { - $this->setStartDate(Carbon::now()); - } - if ($this->dateInterval === null) { - $this->setDateInterval(CarbonInterval::day()); - $this->isDefaultInterval = \true; - } - if ($this->options === null) { - $this->setOptions(0); - } - $this->constructed = \true; - } - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy() - { - return clone $this; - } - /** - * Prepare the instance to be set (self if mutable to be mutated, - * copy if immutable to generate a new instance). - * - * @return static - */ - protected function copyIfImmutable() - { - return $this; - } - /** - * Get the getter for a property allowing both `DatePeriod` snakeCase and camelCase names. - * - * @param string $name - * - * @return callable|null - */ - protected function getGetter(string $name) - { - switch (\strtolower(\preg_replace('/[A-Z]/', '_$0', $name))) { - case 'start': - case 'start_date': - return [$this, 'getStartDate']; - case 'end': - case 'end_date': - return [$this, 'getEndDate']; - case 'interval': - case 'date_interval': - return [$this, 'getDateInterval']; - case 'recurrences': - return [$this, 'getRecurrences']; - case 'include_start_date': - return [$this, 'isStartIncluded']; - case 'include_end_date': - return [$this, 'isEndIncluded']; - case 'current': - return [$this, 'current']; - default: - return null; - } - } - /** - * Get a property allowing both `DatePeriod` snakeCase and camelCase names. - * - * @param string $name - * - * @return bool|CarbonInterface|CarbonInterval|int|null - */ - public function get(string $name) - { - $getter = $this->getGetter($name); - if ($getter) { - return $getter(); - } - throw new UnknownGetterException($name); - } - /** - * Get a property allowing both `DatePeriod` snakeCase and camelCase names. - * - * @param string $name - * - * @return bool|CarbonInterface|CarbonInterval|int|null - */ - public function __get(string $name) - { - return $this->get($name); - } - /** - * Check if an attribute exists on the object - * - * @param string $name - * - * @return bool - */ - public function __isset(string $name) : bool - { - return $this->getGetter($name) !== null; - } - /** - * @alias copy - * - * Get a copy of the instance. - * - * @return static - */ - public function clone() - { - return clone $this; - } - /** - * Set the iteration item class. - * - * @param string $dateClass - * - * @return static - */ - public function setDateClass(string $dateClass) - { - if (!\is_a($dateClass, CarbonInterface::class, \true)) { - throw new NotACarbonClassException($dateClass); - } - $self = $this->copyIfImmutable(); - $self->dateClass = $dateClass; - if (\is_a($dateClass, Carbon::class, \true)) { - $self->options = $self->options & ~static::IMMUTABLE; - } elseif (\is_a($dateClass, CarbonImmutable::class, \true)) { - $self->options = $self->options | static::IMMUTABLE; - } - return $self; - } - /** - * Returns iteration item date class. - * - * @return string - */ - public function getDateClass() : string - { - return $this->dateClass; - } - /** - * Change the period date interval. - * - * @param DateInterval|string $interval - * - * @throws InvalidIntervalException - * - * @return static - */ - public function setDateInterval($interval) - { - if (!($interval = CarbonInterval::make($interval))) { - throw new InvalidIntervalException('Invalid interval.'); - } - if ($interval->spec() === 'PT0S' && !$interval->f && !$interval->getStep()) { - throw new InvalidIntervalException('Empty interval is not accepted.'); - } - $self = $this->copyIfImmutable(); - $self->dateInterval = $interval; - $self->isDefaultInterval = \false; - $self->handleChangedParameters(); - return $self; - } - /** - * Invert the period date interval. - * - * @return static - */ - public function invertDateInterval() - { - return $this->setDateInterval($this->dateInterval->invert()); - } - /** - * Set start and end date. - * - * @param DateTime|DateTimeInterface|string $start - * @param DateTime|DateTimeInterface|string|null $end - * - * @return static - */ - public function setDates($start, $end) - { - return $this->setStartDate($start)->setEndDate($end); - } - /** - * Change the period options. - * - * @param int|null $options - * - * @throws InvalidArgumentException - * - * @return static - */ - public function setOptions($options) - { - if (!\is_int($options) && $options !== null) { - throw new InvalidPeriodParameterException('Invalid options.'); - } - $self = $this->copyIfImmutable(); - $self->options = $options ?: 0; - $self->handleChangedParameters(); - return $self; - } - /** - * Get the period options. - * - * @return int - */ - public function getOptions() - { - return $this->options; - } - /** - * Toggle given options on or off. - * - * @param int $options - * @param bool|null $state - * - * @throws \InvalidArgumentException - * - * @return static - */ - public function toggleOptions($options, $state = null) - { - if ($state === null) { - $state = ($this->options & $options) !== $options; - } - return $this->setOptions($state ? $this->options | $options : $this->options & ~$options); - } - /** - * Toggle EXCLUDE_START_DATE option. - * - * @param bool $state - * - * @return static - */ - public function excludeStartDate($state = \true) - { - return $this->toggleOptions(static::EXCLUDE_START_DATE, $state); - } - /** - * Toggle EXCLUDE_END_DATE option. - * - * @param bool $state - * - * @return static - */ - public function excludeEndDate($state = \true) - { - return $this->toggleOptions(static::EXCLUDE_END_DATE, $state); - } - /** - * Get the underlying date interval. - * - * @return CarbonInterval - */ - public function getDateInterval() - { - return $this->dateInterval->copy(); - } - /** - * Get start date of the period. - * - * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. - * - * @return CarbonInterface - */ - public function getStartDate(string $rounding = null) - { - $date = $this->startDate->avoidMutation(); - return $rounding ? $date->round($this->getDateInterval(), $rounding) : $date; - } - /** - * Get end date of the period. - * - * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. - * - * @return CarbonInterface|null - */ - public function getEndDate(string $rounding = null) - { - if (!$this->endDate) { - return null; - } - $date = $this->endDate->avoidMutation(); - return $rounding ? $date->round($this->getDateInterval(), $rounding) : $date; - } - /** - * Get number of recurrences. - * - * @return int|float|null - */ - public function getRecurrences() - { - return $this->recurrences; - } - /** - * Returns true if the start date should be excluded. - * - * @return bool - */ - public function isStartExcluded() - { - return ($this->options & static::EXCLUDE_START_DATE) !== 0; - } - /** - * Returns true if the end date should be excluded. - * - * @return bool - */ - public function isEndExcluded() - { - return ($this->options & static::EXCLUDE_END_DATE) !== 0; - } - /** - * Returns true if the start date should be included. - * - * @return bool - */ - public function isStartIncluded() - { - return !$this->isStartExcluded(); - } - /** - * Returns true if the end date should be included. - * - * @return bool - */ - public function isEndIncluded() - { - return !$this->isEndExcluded(); - } - /** - * Return the start if it's included by option, else return the start + 1 period interval. - * - * @return CarbonInterface - */ - public function getIncludedStartDate() - { - $start = $this->getStartDate(); - if ($this->isStartExcluded()) { - return $start->add($this->getDateInterval()); - } - return $start; - } - /** - * Return the end if it's included by option, else return the end - 1 period interval. - * Warning: if the period has no fixed end, this method will iterate the period to calculate it. - * - * @return CarbonInterface - */ - public function getIncludedEndDate() - { - $end = $this->getEndDate(); - if (!$end) { - return $this->calculateEnd(); - } - if ($this->isEndExcluded()) { - return $end->sub($this->getDateInterval()); - } - return $end; - } - /** - * Add a filter to the stack. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param callable $callback - * @param string $name - * - * @return static - */ - public function addFilter($callback, $name = null) - { - $self = $this->copyIfImmutable(); - $tuple = $self->createFilterTuple(\func_get_args()); - $self->filters[] = $tuple; - $self->handleChangedParameters(); - return $self; - } - /** - * Prepend a filter to the stack. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param callable $callback - * @param string $name - * - * @return static - */ - public function prependFilter($callback, $name = null) - { - $self = $this->copyIfImmutable(); - $tuple = $self->createFilterTuple(\func_get_args()); - \array_unshift($self->filters, $tuple); - $self->handleChangedParameters(); - return $self; - } - /** - * Remove a filter by instance or name. - * - * @param callable|string $filter - * - * @return static - */ - public function removeFilter($filter) - { - $self = $this->copyIfImmutable(); - $key = \is_callable($filter) ? 0 : 1; - $self->filters = \array_values(\array_filter($this->filters, function ($tuple) use($key, $filter) { - return $tuple[$key] !== $filter; - })); - $self->updateInternalState(); - $self->handleChangedParameters(); - return $self; - } - /** - * Return whether given instance or name is in the filter stack. - * - * @param callable|string $filter - * - * @return bool - */ - public function hasFilter($filter) - { - $key = \is_callable($filter) ? 0 : 1; - foreach ($this->filters as $tuple) { - if ($tuple[$key] === $filter) { - return \true; - } - } - return \false; - } - /** - * Get filters stack. - * - * @return array - */ - public function getFilters() - { - return $this->filters; - } - /** - * Set filters stack. - * - * @param array $filters - * - * @return static - */ - public function setFilters(array $filters) - { - $self = $this->copyIfImmutable(); - $self->filters = $filters; - $self->updateInternalState(); - $self->handleChangedParameters(); - return $self; - } - /** - * Reset filters stack. - * - * @return static - */ - public function resetFilters() - { - $self = $this->copyIfImmutable(); - $self->filters = []; - if ($self->endDate !== null) { - $self->filters[] = [static::END_DATE_FILTER, null]; - } - if ($self->recurrences !== null) { - $self->filters[] = [static::RECURRENCES_FILTER, null]; - } - $self->handleChangedParameters(); - return $self; - } - /** - * Add a recurrences filter (set maximum number of recurrences). - * - * @param int|float|null $recurrences - * - * @throws InvalidArgumentException - * - * @return static - */ - public function setRecurrences($recurrences) - { - if (!\is_numeric($recurrences) && $recurrences !== null || $recurrences < 0) { - throw new InvalidPeriodParameterException('Invalid number of recurrences.'); - } - if ($recurrences === null) { - return $this->removeFilter(static::RECURRENCES_FILTER); - } - /** @var self $self */ - $self = $this->copyIfImmutable(); - $self->recurrences = $recurrences === \INF ? \INF : (int) $recurrences; - if (!$self->hasFilter(static::RECURRENCES_FILTER)) { - return $self->addFilter(static::RECURRENCES_FILTER); - } - $self->handleChangedParameters(); - return $self; - } - /** - * Change the period start date. - * - * @param DateTime|DateTimeInterface|string $date - * @param bool|null $inclusive - * - * @throws InvalidPeriodDateException - * - * @return static - */ - public function setStartDate($date, $inclusive = null) - { - if (!$this->isInfiniteDate($date) && !($date = [$this->dateClass, 'make']($date))) { - throw new InvalidPeriodDateException('Invalid start date.'); - } - $self = $this->copyIfImmutable(); - $self->startDate = $date; - if ($inclusive !== null) { - $self = $self->toggleOptions(static::EXCLUDE_START_DATE, !$inclusive); - } - return $self; - } - /** - * Change the period end date. - * - * @param DateTime|DateTimeInterface|string|null $date - * @param bool|null $inclusive - * - * @throws \InvalidArgumentException - * - * @return static - */ - public function setEndDate($date, $inclusive = null) - { - if ($date !== null && !$this->isInfiniteDate($date) && !($date = [$this->dateClass, 'make']($date))) { - throw new InvalidPeriodDateException('Invalid end date.'); - } - if (!$date) { - return $this->removeFilter(static::END_DATE_FILTER); - } - $self = $this->copyIfImmutable(); - $self->endDate = $date; - if ($inclusive !== null) { - $self = $self->toggleOptions(static::EXCLUDE_END_DATE, !$inclusive); - } - if (!$self->hasFilter(static::END_DATE_FILTER)) { - return $self->addFilter(static::END_DATE_FILTER); - } - $self->handleChangedParameters(); - return $self; - } - /** - * Check if the current position is valid. - * - * @return bool - */ - #[ReturnTypeWillChange] - public function valid() - { - return $this->validateCurrentDate() === \true; - } - /** - * Return the current key. - * - * @return int|null - */ - #[ReturnTypeWillChange] - public function key() - { - return $this->valid() ? $this->key : null; - } - /** - * Return the current date. - * - * @return CarbonInterface|null - */ - #[ReturnTypeWillChange] - public function current() - { - return $this->valid() ? $this->prepareForReturn($this->current) : null; - } - /** - * Move forward to the next date. - * - * @throws RuntimeException - * - * @return void - */ - #[ReturnTypeWillChange] - public function next() - { - if ($this->current === null) { - $this->rewind(); - } - if ($this->validationResult !== static::END_ITERATION) { - $this->key++; - $this->incrementCurrentDateUntilValid(); - } - } - /** - * Rewind to the start date. - * - * Iterating over a date in the UTC timezone avoids bug during backward DST change. - * - * @see https://bugs.php.net/bug.php?id=72255 - * @see https://bugs.php.net/bug.php?id=74274 - * @see https://wiki.php.net/rfc/datetime_and_daylight_saving_time - * - * @throws RuntimeException - * - * @return void - */ - #[ReturnTypeWillChange] - public function rewind() - { - $this->key = 0; - $this->current = [$this->dateClass, 'make']($this->startDate); - $settings = $this->getSettings(); - if ($this->hasLocalTranslator()) { - $settings['locale'] = $this->getTranslatorLocale(); - } - $this->current->settings($settings); - $this->timezone = static::intervalHasTime($this->dateInterval) ? $this->current->getTimezone() : null; - if ($this->timezone) { - $this->current = $this->current->utc(); - } - $this->validationResult = null; - if ($this->isStartExcluded() || $this->validateCurrentDate() === \false) { - $this->incrementCurrentDateUntilValid(); - } - } - /** - * Skip iterations and returns iteration state (false if ended, true if still valid). - * - * @param int $count steps number to skip (1 by default) - * - * @return bool - */ - public function skip($count = 1) - { - for ($i = $count; $this->valid() && $i > 0; $i--) { - $this->next(); - } - return $this->valid(); - } - /** - * Format the date period as ISO 8601. - * - * @return string - */ - public function toIso8601String() - { - $parts = []; - if ($this->recurrences !== null) { - $parts[] = 'R' . $this->recurrences; - } - $parts[] = $this->startDate->toIso8601String(); - $parts[] = $this->dateInterval->spec(); - if ($this->endDate !== null) { - $parts[] = $this->endDate->toIso8601String(); - } - return \implode('/', $parts); - } - /** - * Convert the date period into a string. - * - * @return string - */ - public function toString() - { - $format = $this->localToStringFormat ?? static::$toStringFormat; - if ($format instanceof Closure) { - return $format($this); - } - $translator = [$this->dateClass, 'getTranslator'](); - $parts = []; - $format = $format ?? (!$this->startDate->isStartOfDay() || $this->endDate && !$this->endDate->isStartOfDay() ? 'Y-m-d H:i:s' : 'Y-m-d'); - if ($this->recurrences !== null) { - $parts[] = $this->translate('period_recurrences', [], $this->recurrences, $translator); - } - $parts[] = $this->translate('period_interval', [':interval' => $this->dateInterval->forHumans(['join' => \true])], null, $translator); - $parts[] = $this->translate('period_start_date', [':date' => $this->startDate->rawFormat($format)], null, $translator); - if ($this->endDate !== null) { - $parts[] = $this->translate('period_end_date', [':date' => $this->endDate->rawFormat($format)], null, $translator); - } - $result = \implode(' ', $parts); - return \mb_strtoupper(\mb_substr($result, 0, 1)) . \mb_substr($result, 1); - } - /** - * Format the date period as ISO 8601. - * - * @return string - */ - public function spec() - { - return $this->toIso8601String(); - } - /** - * Cast the current instance into the given class. - * - * @param string $className The $className::instance() method will be called to cast the current object. - * - * @return DatePeriod - */ - public function cast(string $className) - { - if (!\method_exists($className, 'instance')) { - if (\is_a($className, DatePeriod::class, \true)) { - return new $className($this->rawDate($this->getStartDate()), $this->getDateInterval(), $this->getEndDate() ? $this->rawDate($this->getIncludedEndDate()) : $this->getRecurrences(), $this->isStartExcluded() ? DatePeriod::EXCLUDE_START_DATE : 0); - } - throw new InvalidCastException("{$className} has not the instance() method needed to cast the date."); - } - return $className::instance($this); - } - /** - * Return native DatePeriod PHP object matching the current instance. - * - * @example - * ``` - * var_dump(CarbonPeriod::create('2021-01-05', '2021-02-15')->toDatePeriod()); - * ``` - * - * @return DatePeriod - */ - public function toDatePeriod() - { - return $this->cast(DatePeriod::class); - } - /** - * Return `true` if the period has no custom filter and is guaranteed to be endless. - * - * Note that we can't check if a period is endless as soon as it has custom filters - * because filters can emit `CarbonPeriod::END_ITERATION` to stop the iteration in - * a way we can't predict without actually iterating the period. - */ - public function isUnfilteredAndEndLess() : bool - { - foreach ($this->filters as $filter) { - switch ($filter) { - case [static::RECURRENCES_FILTER, null]: - if ($this->recurrences !== null && \is_finite($this->recurrences)) { - return \false; - } - break; - case [static::END_DATE_FILTER, null]: - if ($this->endDate !== null && !$this->endDate->isEndOfTime()) { - return \false; - } - break; - default: - return \false; - } - } - return \true; - } - /** - * Convert the date period into an array without changing current iteration state. - * - * @return CarbonInterface[] - */ - public function toArray() - { - if ($this->isUnfilteredAndEndLess()) { - throw new EndLessPeriodException("Endless period can't be converted to array nor counted."); - } - $state = [$this->key, $this->current ? $this->current->avoidMutation() : null, $this->validationResult]; - $result = \iterator_to_array($this); - [$this->key, $this->current, $this->validationResult] = $state; - return $result; - } - /** - * Count dates in the date period. - * - * @return int - */ - #[ReturnTypeWillChange] - public function count() - { - return \count($this->toArray()); - } - /** - * Return the first date in the date period. - * - * @return CarbonInterface|null - */ - public function first() - { - if ($this->isUnfilteredAndEndLess()) { - foreach ($this as $date) { - $this->rewind(); - return $date; - } - return null; - } - return ($this->toArray() ?: [])[0] ?? null; - } - /** - * Return the last date in the date period. - * - * @return CarbonInterface|null - */ - public function last() - { - $array = $this->toArray(); - return $array ? $array[\count($array) - 1] : null; - } - /** - * Convert the date period into a string. - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } - /** - * Add aliases for setters. - * - * CarbonPeriod::days(3)->hours(5)->invert() - * ->sinceNow()->until('2010-01-10') - * ->filter(...) - * ->count() - * - * Note: We use magic method to let static and instance aliases with the same names. - * - * @param string $method - * @param array $parameters - * - * @return mixed - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return static::bindMacroContext($this, function () use(&$method, &$parameters) { - return $this->callMacro($method, $parameters); - }); - } - $roundedValue = $this->callRoundMethod($method, $parameters); - if ($roundedValue !== null) { - return $roundedValue; - } - switch ($method) { - case 'start': - case 'since': - self::setDefaultParameters($parameters, [[0, 'date', null]]); - return $this->setStartDate(...$parameters); - case 'sinceNow': - return $this->setStartDate(new Carbon(), ...$parameters); - case 'end': - case 'until': - self::setDefaultParameters($parameters, [[0, 'date', null]]); - return $this->setEndDate(...$parameters); - case 'untilNow': - return $this->setEndDate(new Carbon(), ...$parameters); - case 'dates': - case 'between': - self::setDefaultParameters($parameters, [[0, 'start', null], [1, 'end', null]]); - return $this->setDates(...$parameters); - case 'recurrences': - case 'times': - self::setDefaultParameters($parameters, [[0, 'recurrences', null]]); - return $this->setRecurrences(...$parameters); - case 'options': - self::setDefaultParameters($parameters, [[0, 'options', null]]); - return $this->setOptions(...$parameters); - case 'toggle': - self::setDefaultParameters($parameters, [[0, 'options', null]]); - return $this->toggleOptions(...$parameters); - case 'filter': - case 'push': - return $this->addFilter(...$parameters); - case 'prepend': - return $this->prependFilter(...$parameters); - case 'filters': - self::setDefaultParameters($parameters, [[0, 'filters', []]]); - return $this->setFilters(...$parameters); - case 'interval': - case 'each': - case 'every': - case 'step': - case 'stepBy': - return $this->setDateInterval(...$parameters); - case 'invert': - return $this->invertDateInterval(); - case 'years': - case 'year': - case 'months': - case 'month': - case 'weeks': - case 'week': - case 'days': - case 'dayz': - case 'day': - case 'hours': - case 'hour': - case 'minutes': - case 'minute': - case 'seconds': - case 'second': - case 'milliseconds': - case 'millisecond': - case 'microseconds': - case 'microsecond': - return $this->setDateInterval([$this->isDefaultInterval ? new CarbonInterval('PT0S') : $this->dateInterval, $method](...$parameters)); - } - if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { - throw new UnknownMethodException($method); - } - return $this; - } - /** - * Set the instance's timezone from a string or object and apply it to start/end. - * - * @param \DateTimeZone|string $timezone - * - * @return static - */ - public function setTimezone($timezone) - { - $self = $this->copyIfImmutable(); - $self->tzName = $timezone; - $self->timezone = $timezone; - if ($self->startDate) { - $self = $self->setStartDate($self->startDate->setTimezone($timezone)); - } - if ($self->endDate) { - $self = $self->setEndDate($self->endDate->setTimezone($timezone)); - } - return $self; - } - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference to start/end. - * - * @param \DateTimeZone|string $timezone - * - * @return static - */ - public function shiftTimezone($timezone) - { - $self = $this->copyIfImmutable(); - $self->tzName = $timezone; - $self->timezone = $timezone; - if ($self->startDate) { - $self = $self->setStartDate($self->startDate->shiftTimezone($timezone)); - } - if ($self->endDate) { - $self = $self->setEndDate($self->endDate->shiftTimezone($timezone)); - } - return $self; - } - /** - * Returns the end is set, else calculated from start an recurrences. - * - * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. - * - * @return CarbonInterface - */ - public function calculateEnd(string $rounding = null) - { - if ($end = $this->getEndDate($rounding)) { - return $end; - } - if ($this->dateInterval->isEmpty()) { - return $this->getStartDate($rounding); - } - $date = $this->getEndFromRecurrences() ?? $this->iterateUntilEnd(); - if ($date && $rounding) { - $date = $date->avoidMutation()->round($this->getDateInterval(), $rounding); - } - return $date; - } - /** - * @return CarbonInterface|null - */ - private function getEndFromRecurrences() - { - if ($this->recurrences === null) { - throw new UnreachableException("Could not calculate period end without either explicit end or recurrences.\n" . "If you're looking for a forever-period, use ->setRecurrences(INF)."); - } - if ($this->recurrences === \INF) { - $start = $this->getStartDate(); - return $start < $start->avoidMutation()->add($this->getDateInterval()) ? CarbonImmutable::endOfTime() : CarbonImmutable::startOfTime(); - } - if ($this->filters === [[static::RECURRENCES_FILTER, null]]) { - return $this->getStartDate()->avoidMutation()->add($this->getDateInterval()->times($this->recurrences - ($this->isStartExcluded() ? 0 : 1))); - } - return null; - } - /** - * @return CarbonInterface|null - */ - private function iterateUntilEnd() - { - $attempts = 0; - $date = null; - foreach ($this as $date) { - if (++$attempts > static::END_MAX_ATTEMPTS) { - throw new UnreachableException('Could not calculate period end after iterating ' . static::END_MAX_ATTEMPTS . ' times.'); - } - } - return $date; - } - /** - * Returns true if the current period overlaps the given one (if 1 parameter passed) - * or the period between 2 dates (if 2 parameters passed). - * - * @param CarbonPeriod|\DateTimeInterface|Carbon|CarbonImmutable|string $rangeOrRangeStart - * @param \DateTimeInterface|Carbon|CarbonImmutable|string|null $rangeEnd - * - * @return bool - */ - public function overlaps($rangeOrRangeStart, $rangeEnd = null) - { - $range = $rangeEnd ? static::create($rangeOrRangeStart, $rangeEnd) : $rangeOrRangeStart; - if (!$range instanceof self) { - $range = static::create($range); - } - [$start, $end] = $this->orderCouple($this->getStartDate(), $this->calculateEnd()); - [$rangeStart, $rangeEnd] = $this->orderCouple($range->getStartDate(), $range->calculateEnd()); - return $end > $rangeStart && $rangeEnd > $start; - } - /** - * Execute a given function on each date of the period. - * - * @example - * ``` - * Carbon::create('2020-11-29')->daysUntil('2020-12-24')->forEach(function (Carbon $date) { - * echo $date->diffInDays('2020-12-25')." days before Christmas!\n"; - * }); - * ``` - * - * @param callable $callback - */ - public function forEach(callable $callback) - { - foreach ($this as $date) { - $callback($date); - } - } - /** - * Execute a given function on each date of the period and yield the result of this function. - * - * @example - * ``` - * $period = Carbon::create('2020-11-29')->daysUntil('2020-12-24'); - * echo implode("\n", iterator_to_array($period->map(function (Carbon $date) { - * return $date->diffInDays('2020-12-25').' days before Christmas!'; - * }))); - * ``` - * - * @param callable $callback - * - * @return \Generator - */ - public function map(callable $callback) - { - foreach ($this as $date) { - (yield $callback($date)); - } - } - /** - * Determines if the instance is equal to another. - * Warning: if options differ, instances wil never be equal. - * - * @param mixed $period - * - * @see equalTo() - * - * @return bool - */ - public function eq($period) : bool - { - return $this->equalTo($period); - } - /** - * Determines if the instance is equal to another. - * Warning: if options differ, instances wil never be equal. - * - * @param mixed $period - * - * @return bool - */ - public function equalTo($period) : bool - { - if (!$period instanceof self) { - $period = self::make($period); - } - $end = $this->getEndDate(); - return $period !== null && $this->getDateInterval()->eq($period->getDateInterval()) && $this->getStartDate()->eq($period->getStartDate()) && ($end ? $end->eq($period->getEndDate()) : $this->getRecurrences() === $period->getRecurrences()) && ($this->getOptions() & ~static::IMMUTABLE) === ($period->getOptions() & ~static::IMMUTABLE); - } - /** - * Determines if the instance is not equal to another. - * Warning: if options differ, instances wil never be equal. - * - * @param mixed $period - * - * @see notEqualTo() - * - * @return bool - */ - public function ne($period) : bool - { - return $this->notEqualTo($period); - } - /** - * Determines if the instance is not equal to another. - * Warning: if options differ, instances wil never be equal. - * - * @param mixed $period - * - * @return bool - */ - public function notEqualTo($period) : bool - { - return !$this->eq($period); - } - /** - * Determines if the start date is before an other given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function startsBefore($date = null) : bool - { - return $this->getStartDate()->lessThan($this->resolveCarbon($date)); - } - /** - * Determines if the start date is before or the same as a given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function startsBeforeOrAt($date = null) : bool - { - return $this->getStartDate()->lessThanOrEqualTo($this->resolveCarbon($date)); - } - /** - * Determines if the start date is after an other given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function startsAfter($date = null) : bool - { - return $this->getStartDate()->greaterThan($this->resolveCarbon($date)); - } - /** - * Determines if the start date is after or the same as a given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function startsAfterOrAt($date = null) : bool - { - return $this->getStartDate()->greaterThanOrEqualTo($this->resolveCarbon($date)); - } - /** - * Determines if the start date is the same as a given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function startsAt($date = null) : bool - { - return $this->getStartDate()->equalTo($this->resolveCarbon($date)); - } - /** - * Determines if the end date is before an other given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function endsBefore($date = null) : bool - { - return $this->calculateEnd()->lessThan($this->resolveCarbon($date)); - } - /** - * Determines if the end date is before or the same as a given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function endsBeforeOrAt($date = null) : bool - { - return $this->calculateEnd()->lessThanOrEqualTo($this->resolveCarbon($date)); - } - /** - * Determines if the end date is after an other given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function endsAfter($date = null) : bool - { - return $this->calculateEnd()->greaterThan($this->resolveCarbon($date)); - } - /** - * Determines if the end date is after or the same as a given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function endsAfterOrAt($date = null) : bool - { - return $this->calculateEnd()->greaterThanOrEqualTo($this->resolveCarbon($date)); - } - /** - * Determines if the end date is the same as a given date. - * (Rather start/end are included by options is ignored.) - * - * @param mixed $date - * - * @return bool - */ - public function endsAt($date = null) : bool - { - return $this->calculateEnd()->equalTo($this->resolveCarbon($date)); - } - /** - * Return true if start date is now or later. - * (Rather start/end are included by options is ignored.) - * - * @return bool - */ - public function isStarted() : bool - { - return $this->startsBeforeOrAt(); - } - /** - * Return true if end date is now or later. - * (Rather start/end are included by options is ignored.) - * - * @return bool - */ - public function isEnded() : bool - { - return $this->endsBeforeOrAt(); - } - /** - * Return true if now is between start date (included) and end date (excluded). - * (Rather start/end are included by options is ignored.) - * - * @return bool - */ - public function isInProgress() : bool - { - return $this->isStarted() && !$this->isEnded(); - } - /** - * Round the current instance at the given unit with given precision if specified and the given function. - * - * @param string $unit - * @param float|int|string|\DateInterval|null $precision - * @param string $function - * - * @return static - */ - public function roundUnit($unit, $precision = 1, $function = 'round') - { - $self = $this->copyIfImmutable(); - $self = $self->setStartDate($self->getStartDate()->roundUnit($unit, $precision, $function)); - if ($self->endDate) { - $self = $self->setEndDate($self->getEndDate()->roundUnit($unit, $precision, $function)); - } - return $self->setDateInterval($self->getDateInterval()->roundUnit($unit, $precision, $function)); - } - /** - * Truncate the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int|string|\DateInterval|null $precision - * - * @return static - */ - public function floorUnit($unit, $precision = 1) - { - return $this->roundUnit($unit, $precision, 'floor'); - } - /** - * Ceil the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int|string|\DateInterval|null $precision - * - * @return static - */ - public function ceilUnit($unit, $precision = 1) - { - return $this->roundUnit($unit, $precision, 'ceil'); - } - /** - * Round the current instance second with given precision if specified (else period interval is used). - * - * @param float|int|string|\DateInterval|null $precision - * @param string $function - * - * @return static - */ - public function round($precision = null, $function = 'round') - { - return $this->roundWith($precision ?? $this->getDateInterval()->setLocalTranslator(TranslatorImmutable::get('en'))->forHumans(), $function); - } - /** - * Round the current instance second with given precision if specified (else period interval is used). - * - * @param float|int|string|\DateInterval|null $precision - * - * @return static - */ - public function floor($precision = null) - { - return $this->round($precision, 'floor'); - } - /** - * Ceil the current instance second with given precision if specified (else period interval is used). - * - * @param float|int|string|\DateInterval|null $precision - * - * @return static - */ - public function ceil($precision = null) - { - return $this->round($precision, 'ceil'); - } - /** - * Specify data which should be serialized to JSON. - * - * @link https://php.net/manual/en/jsonserializable.jsonserialize.php - * - * @return CarbonInterface[] - */ - #[ReturnTypeWillChange] - public function jsonSerialize() - { - return $this->toArray(); - } - /** - * Return true if the given date is between start and end. - * - * @param \Carbon\Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|\DateTimeInterface|string|null $date - * - * @return bool - */ - public function contains($date = null) : bool - { - $startMethod = 'startsBefore' . ($this->isStartIncluded() ? 'OrAt' : ''); - $endMethod = 'endsAfter' . ($this->isEndIncluded() ? 'OrAt' : ''); - return $this->{$startMethod}($date) && $this->{$endMethod}($date); - } - /** - * Return true if the current period follows a given other period (with no overlap). - * For instance, [2019-08-01 -> 2019-08-12] follows [2019-07-29 -> 2019-07-31] - * Note than in this example, follows() would be false if 2019-08-01 or 2019-07-31 was excluded by options. - * - * @param \Carbon\CarbonPeriod|\DatePeriod|string $period - * - * @return bool - */ - public function follows($period, ...$arguments) : bool - { - $period = $this->resolveCarbonPeriod($period, ...$arguments); - return $this->getIncludedStartDate()->equalTo($period->getIncludedEndDate()->add($period->getDateInterval())); - } - /** - * Return true if the given other period follows the current one (with no overlap). - * For instance, [2019-07-29 -> 2019-07-31] is followed by [2019-08-01 -> 2019-08-12] - * Note than in this example, isFollowedBy() would be false if 2019-08-01 or 2019-07-31 was excluded by options. - * - * @param \Carbon\CarbonPeriod|\DatePeriod|string $period - * - * @return bool - */ - public function isFollowedBy($period, ...$arguments) : bool - { - $period = $this->resolveCarbonPeriod($period, ...$arguments); - return $period->follows($this); - } - /** - * Return true if the given period either follows or is followed by the current one. - * - * @see follows() - * @see isFollowedBy() - * - * @param \Carbon\CarbonPeriod|\DatePeriod|string $period - * - * @return bool - */ - public function isConsecutiveWith($period, ...$arguments) : bool - { - return $this->follows($period, ...$arguments) || $this->isFollowedBy($period, ...$arguments); - } - /** - * Update properties after removing built-in filters. - * - * @return void - */ - protected function updateInternalState() - { - if (!$this->hasFilter(static::END_DATE_FILTER)) { - $this->endDate = null; - } - if (!$this->hasFilter(static::RECURRENCES_FILTER)) { - $this->recurrences = null; - } - } - /** - * Create a filter tuple from raw parameters. - * - * Will create an automatic filter callback for one of Carbon's is* methods. - * - * @param array $parameters - * - * @return array - */ - protected function createFilterTuple(array $parameters) - { - $method = \array_shift($parameters); - if (!$this->isCarbonPredicateMethod($method)) { - return [$method, \array_shift($parameters)]; - } - return [function ($date) use($method, $parameters) { - return [$date, $method](...$parameters); - }, $method]; - } - /** - * Return whether given callable is a string pointing to one of Carbon's is* methods - * and should be automatically converted to a filter callback. - * - * @param callable $callable - * - * @return bool - */ - protected function isCarbonPredicateMethod($callable) - { - return \is_string($callable) && \str_starts_with($callable, 'is') && (\method_exists($this->dateClass, $callable) || [$this->dateClass, 'hasMacro']($callable)); - } - /** - * Recurrences filter callback (limits number of recurrences). - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \Carbon\Carbon $current - * @param int $key - * - * @return bool|string - */ - protected function filterRecurrences($current, $key) - { - if ($key < $this->recurrences) { - return \true; - } - return static::END_ITERATION; - } - /** - * End date filter callback. - * - * @param \Carbon\Carbon $current - * - * @return bool|string - */ - protected function filterEndDate($current) - { - if (!$this->isEndExcluded() && $current == $this->endDate) { - return \true; - } - if ($this->dateInterval->invert ? $current > $this->endDate : $current < $this->endDate) { - return \true; - } - return static::END_ITERATION; - } - /** - * End iteration filter callback. - * - * @return string - */ - protected function endIteration() - { - return static::END_ITERATION; - } - /** - * Handle change of the parameters. - */ - protected function handleChangedParameters() - { - if ($this->getOptions() & static::IMMUTABLE && $this->dateClass === Carbon::class) { - $this->dateClass = CarbonImmutable::class; - } elseif (!($this->getOptions() & static::IMMUTABLE) && $this->dateClass === CarbonImmutable::class) { - $this->dateClass = Carbon::class; - } - $this->validationResult = null; - } - /** - * Validate current date and stop iteration when necessary. - * - * Returns true when current date is valid, false if it is not, or static::END_ITERATION - * when iteration should be stopped. - * - * @return bool|string - */ - protected function validateCurrentDate() - { - if ($this->current === null) { - $this->rewind(); - } - // Check after the first rewind to avoid repeating the initial validation. - return $this->validationResult ?? ($this->validationResult = $this->checkFilters()); - } - /** - * Check whether current value and key pass all the filters. - * - * @return bool|string - */ - protected function checkFilters() - { - $current = $this->prepareForReturn($this->current); - foreach ($this->filters as $tuple) { - $result = \call_user_func($tuple[0], $current->avoidMutation(), $this->key, $this); - if ($result === static::END_ITERATION) { - return static::END_ITERATION; - } - if (!$result) { - return \false; - } - } - return \true; - } - /** - * Prepare given date to be returned to the external logic. - * - * @param CarbonInterface $date - * - * @return CarbonInterface - */ - protected function prepareForReturn(CarbonInterface $date) - { - $date = [$this->dateClass, 'make']($date); - if ($this->timezone) { - $date = $date->setTimezone($this->timezone); - } - return $date; - } - /** - * Keep incrementing the current date until a valid date is found or the iteration is ended. - * - * @throws RuntimeException - * - * @return void - */ - protected function incrementCurrentDateUntilValid() - { - $attempts = 0; - do { - $this->current = $this->current->add($this->dateInterval); - $this->validationResult = null; - if (++$attempts > static::NEXT_MAX_ATTEMPTS) { - throw new UnreachableException('Could not find next valid date.'); - } - } while ($this->validateCurrentDate() === \false); - } - /** - * Call given macro. - * - * @param string $name - * @param array $parameters - * - * @return mixed - */ - protected function callMacro($name, $parameters) - { - $macro = static::$macros[$name]; - if ($macro instanceof Closure) { - $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); - return ($boundMacro ?: $macro)(...$parameters); - } - return $macro(...$parameters); - } - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param \Carbon\Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|\DateTimeInterface|string|null $date - * - * @return \Carbon\CarbonInterface - */ - protected function resolveCarbon($date = null) - { - return $this->getStartDate()->nowWithSameTz()->carbonize($date); - } - /** - * Resolve passed arguments or DatePeriod to a CarbonPeriod object. - * - * @param mixed $period - * @param mixed ...$arguments - * - * @return static - */ - protected function resolveCarbonPeriod($period, ...$arguments) - { - if ($period instanceof self) { - return $period; - } - return $period instanceof DatePeriod ? static::instance($period) : static::create($period, ...$arguments); - } - private function orderCouple($first, $second) : array - { - return $first > $second ? [$second, $first] : [$first, $second]; - } - private function makeDateTime($value) : ?DateTimeInterface - { - if ($value instanceof DateTimeInterface) { - return $value; - } - if (\is_string($value)) { - $value = \trim($value); - if (!\preg_match('/^P[\\dT]/', $value) && !\preg_match('/^R\\d/', $value) && \preg_match('/[a-z\\d]/i', $value)) { - return Carbon::parse($value, $this->tzName); - } - } - return null; - } - private function isInfiniteDate($date) : bool - { - return $date instanceof CarbonInterface && ($date->isEndOfTime() || $date->isStartOfTime()); - } - private function rawDate($date) : ?DateTimeInterface - { - if ($date === \false || $date === null) { - return null; - } - if ($date instanceof CarbonInterface) { - return $date->isMutable() ? $date->toDateTime() : $date->toDateTimeImmutable(); - } - if (\in_array(\get_class($date), [DateTime::class, DateTimeImmutable::class], \true)) { - return $date; - } - $class = $date instanceof DateTime ? DateTime::class : DateTimeImmutable::class; - return new $class($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); - } - private static function setDefaultParameters(array &$parameters, array $defaults) : void - { - foreach ($defaults as [$index, $name, $value]) { - if (!\array_key_exists($index, $parameters) && !\array_key_exists($name, $parameters)) { - $parameters[$index] = $value; - } - } - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php b/dependencies/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php deleted file mode 100644 index 71e151d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -class CarbonPeriodImmutable extends CarbonPeriod -{ - /** - * Date class of iteration items. - * - * @var string - */ - protected $dateClass = CarbonImmutable::class; - /** - * Prepare the instance to be set (self if mutable to be mutated, - * copy if immutable to generate a new instance). - * - * @return static - */ - protected function copyIfImmutable() - { - return $this->constructed ? clone $this : $this; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/CarbonTimeZone.php b/dependencies/nesbot/carbon/src/Carbon/CarbonTimeZone.php deleted file mode 100644 index 911c52c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/CarbonTimeZone.php +++ /dev/null @@ -1,271 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidCastException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidTimeZoneException; -use DateTimeInterface; -use DateTimeZone; -use Throwable; -class CarbonTimeZone extends DateTimeZone -{ - public function __construct($timezone = null) - { - parent::__construct(static::getDateTimeZoneNameFromMixed($timezone)); - } - protected static function parseNumericTimezone($timezone) - { - if ($timezone <= -100 || $timezone >= 100) { - throw new InvalidTimeZoneException('Absolute timezone offset cannot be greater than 100.'); - } - return ($timezone >= 0 ? '+' : '') . \ltrim($timezone, '+') . ':00'; - } - protected static function getDateTimeZoneNameFromMixed($timezone) - { - if ($timezone === null) { - return \date_default_timezone_get(); - } - if (\is_string($timezone)) { - $timezone = \preg_replace('/^\\s*([+-]\\d+)(\\d{2})\\s*$/', '$1:$2', $timezone); - } - if (\is_numeric($timezone)) { - return static::parseNumericTimezone($timezone); - } - return $timezone; - } - protected static function getDateTimeZoneFromName(&$name) - { - return @\timezone_open($name = (string) static::getDateTimeZoneNameFromMixed($name)); - } - /** - * Cast the current instance into the given class. - * - * @param string $className The $className::instance() method will be called to cast the current object. - * - * @return DateTimeZone - */ - public function cast(string $className) - { - if (!\method_exists($className, 'instance')) { - if (\is_a($className, DateTimeZone::class, \true)) { - return new $className($this->getName()); - } - throw new InvalidCastException("{$className} has not the instance() method needed to cast the date."); - } - return $className::instance($this); - } - /** - * Create a CarbonTimeZone from mixed input. - * - * @param DateTimeZone|string|int|null $object original value to get CarbonTimeZone from it. - * @param DateTimeZone|string|int|null $objectDump dump of the object for error messages. - * - * @throws InvalidTimeZoneException - * - * @return false|static - */ - public static function instance($object = null, $objectDump = null) - { - $tz = $object; - if ($tz instanceof static) { - return $tz; - } - if ($tz === null) { - return new static(); - } - if (!$tz instanceof DateTimeZone) { - $tz = static::getDateTimeZoneFromName($object); - } - if ($tz !== \false) { - return new static($tz->getName()); - } - if (Carbon::isStrictModeEnabled()) { - throw new InvalidTimeZoneException('Unknown or bad timezone (' . ($objectDump ?: $object) . ')'); - } - return \false; - } - /** - * Returns abbreviated name of the current timezone according to DST setting. - * - * @param bool $dst - * - * @return string - */ - public function getAbbreviatedName($dst = \false) - { - $name = $this->getName(); - foreach ($this->listAbbreviations() as $abbreviation => $zones) { - foreach ($zones as $zone) { - if ($zone['timezone_id'] === $name && $zone['dst'] == $dst) { - return $abbreviation; - } - } - } - return 'unknown'; - } - /** - * @alias getAbbreviatedName - * - * Returns abbreviated name of the current timezone according to DST setting. - * - * @param bool $dst - * - * @return string - */ - public function getAbbr($dst = \false) - { - return $this->getAbbreviatedName($dst); - } - /** - * Get the offset as string "sHH:MM" (such as "+00:00" or "-12:30"). - * - * @param DateTimeInterface|null $date - * - * @return string - */ - public function toOffsetName(DateTimeInterface $date = null) - { - return static::getOffsetNameFromMinuteOffset($this->getOffset($date ?: Carbon::now($this)) / 60); - } - /** - * Returns a new CarbonTimeZone object using the offset string instead of region string. - * - * @param DateTimeInterface|null $date - * - * @return CarbonTimeZone - */ - public function toOffsetTimeZone(DateTimeInterface $date = null) - { - return new static($this->toOffsetName($date)); - } - /** - * Returns the first region string (such as "America/Toronto") that matches the current timezone or - * false if no match is found. - * - * @see timezone_name_from_abbr native PHP function. - * - * @param DateTimeInterface|null $date - * @param int $isDst - * - * @return string|false - */ - public function toRegionName(DateTimeInterface $date = null, $isDst = 1) - { - $name = $this->getName(); - $firstChar = \substr($name, 0, 1); - if ($firstChar !== '+' && $firstChar !== '-') { - return $name; - } - $date = $date ?: Carbon::now($this); - // Integer construction no longer supported since PHP 8 - // @codeCoverageIgnoreStart - try { - $offset = @$this->getOffset($date) ?: 0; - } catch (Throwable $e) { - $offset = 0; - } - // @codeCoverageIgnoreEnd - $name = @\timezone_name_from_abbr('', $offset, $isDst); - if ($name) { - return $name; - } - foreach (\timezone_identifiers_list() as $timezone) { - if (Carbon::instance($date)->tz($timezone)->getOffset() === $offset) { - return $timezone; - } - } - return \false; - } - /** - * Returns a new CarbonTimeZone object using the region string instead of offset string. - * - * @param DateTimeInterface|null $date - * - * @return CarbonTimeZone|false - */ - public function toRegionTimeZone(DateTimeInterface $date = null) - { - $tz = $this->toRegionName($date); - if ($tz !== \false) { - return new static($tz); - } - if (Carbon::isStrictModeEnabled()) { - throw new InvalidTimeZoneException('Unknown timezone for offset ' . $this->getOffset($date ?: Carbon::now($this)) . ' seconds.'); - } - return \false; - } - /** - * Cast to string (get timezone name). - * - * @return string - */ - public function __toString() - { - return $this->getName(); - } - /** - * Return the type number: - * - * Type 1; A UTC offset, such as -0300 - * Type 2; A timezone abbreviation, such as GMT - * Type 3: A timezone identifier, such as Europe/London - */ - public function getType() : int - { - return \preg_match('/"timezone_type";i:(\\d)/', \serialize($this), $match) ? (int) $match[1] : 3; - } - /** - * Create a CarbonTimeZone from mixed input. - * - * @param DateTimeZone|string|int|null $object - * - * @return false|static - */ - public static function create($object = null) - { - return static::instance($object); - } - /** - * Create a CarbonTimeZone from int/float hour offset. - * - * @param float $hourOffset number of hour of the timezone shift (can be decimal). - * - * @return false|static - */ - public static function createFromHourOffset(float $hourOffset) - { - return static::createFromMinuteOffset($hourOffset * Carbon::MINUTES_PER_HOUR); - } - /** - * Create a CarbonTimeZone from int/float minute offset. - * - * @param float $minuteOffset number of total minutes of the timezone shift. - * - * @return false|static - */ - public static function createFromMinuteOffset(float $minuteOffset) - { - return static::instance(static::getOffsetNameFromMinuteOffset($minuteOffset)); - } - /** - * Convert a total minutes offset into a standardized timezone offset string. - * - * @param float $minutes number of total minutes of the timezone shift. - * - * @return string - */ - public static function getOffsetNameFromMinuteOffset(float $minutes) : string - { - $minutes = \round($minutes); - $unsignedMinutes = \abs($minutes); - return ($minutes < 0 ? '-' : '+') . \str_pad((string) \floor($unsignedMinutes / 60), 2, '0', \STR_PAD_LEFT) . ':' . \str_pad((string) ($unsignedMinutes % 60), 2, '0', \STR_PAD_LEFT); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Cli/Invoker.php b/dependencies/nesbot/carbon/src/Carbon/Cli/Invoker.php deleted file mode 100644 index fb64c59..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Cli/Invoker.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Cli; - -class Invoker -{ - public const CLI_CLASS_NAME = 'WP_Ultimo\\Dependencies\\Carbon\\Cli'; - protected function runWithCli(string $className, array $parameters) : bool - { - $cli = new $className(); - return $cli(...$parameters); - } - public function __invoke(...$parameters) : bool - { - if (\class_exists(self::CLI_CLASS_NAME)) { - return $this->runWithCli(self::CLI_CLASS_NAME, $parameters); - } - $function = (($parameters[1] ?? '') === 'install' ? $parameters[2] ?? null : null) ?: 'shell_exec'; - $function('composer require carbon-cli/carbon-cli --no-interaction'); - echo 'Installation succeeded.'; - return \true; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php deleted file mode 100644 index 7fa826a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Doctrine; - -use WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\AbstractPlatform; -interface CarbonDoctrineType -{ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform); - public function convertToPHPValue($value, AbstractPlatform $platform); - public function convertToDatabaseValue($value, AbstractPlatform $platform); -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php deleted file mode 100644 index 48ccce8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Doctrine; - -use WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\AbstractPlatform; -class CarbonImmutableType extends DateTimeImmutableType implements CarbonDoctrineType -{ - /** - * {@inheritdoc} - * - * @return string - */ - public function getName() - { - return 'carbon_immutable'; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return \true; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php deleted file mode 100644 index d72a124..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Doctrine; - -use WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\AbstractPlatform; -class CarbonType extends DateTimeType implements CarbonDoctrineType -{ - /** - * {@inheritdoc} - * - * @return string - */ - public function getName() - { - return 'carbon'; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function requiresSQLCommentHint(AbstractPlatform $platform) - { - return \true; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php deleted file mode 100644 index fb561a3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Doctrine; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use DateTimeInterface; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\AbstractPlatform; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Types\ConversionException; -use Exception; -/** - * @template T of CarbonInterface - */ -trait CarbonTypeConverter -{ - /** - * @return class-string - */ - protected function getCarbonClassName() : string - { - return Carbon::class; - } - /** - * @return string - */ - public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) - { - $precision = $fieldDeclaration['precision'] ?: 10; - if ($fieldDeclaration['secondPrecision'] ?? \false) { - $precision = 0; - } - if ($precision === 10) { - $precision = DateTimeDefaultPrecision::get(); - } - $type = parent::getSQLDeclaration($fieldDeclaration, $platform); - if (!$precision) { - return $type; - } - if (\str_contains($type, '(')) { - return \preg_replace('/\\(\\d+\\)/', "({$precision})", $type); - } - [$before, $after] = \explode(' ', "{$type} "); - return \trim("{$before}({$precision}) {$after}"); - } - /** - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @return T|null - */ - public function convertToPHPValue($value, AbstractPlatform $platform) - { - $class = $this->getCarbonClassName(); - if ($value === null || \is_a($value, $class)) { - return $value; - } - if ($value instanceof DateTimeInterface) { - return $class::instance($value); - } - $date = null; - $error = null; - try { - $date = $class::parse($value); - } catch (Exception $exception) { - $error = $exception; - } - if (!$date) { - throw ConversionException::conversionFailedFormat($value, $this->getName(), 'Y-m-d H:i:s.u or any format supported by ' . $class . '::parse()', $error); - } - return $date; - } - /** - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @return string|null - */ - public function convertToDatabaseValue($value, AbstractPlatform $platform) - { - if ($value === null) { - return $value; - } - if ($value instanceof DateTimeInterface) { - return $value->format('Y-m-d H:i:s.u'); - } - throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', 'DateTime', 'Carbon']); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php deleted file mode 100644 index 42370b5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Doctrine; - -class DateTimeDefaultPrecision -{ - private static $precision = 6; - /** - * Change the default Doctrine datetime and datetime_immutable precision. - * - * @param int $precision - */ - public static function set(int $precision) : void - { - self::$precision = $precision; - } - /** - * Get the default Doctrine datetime and datetime_immutable precision. - * - * @return int - */ - public static function get() : int - { - return self::$precision; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php deleted file mode 100644 index 627665f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php +++ /dev/null @@ -1,22 +0,0 @@ - */ - use CarbonTypeConverter; - /** - * @return class-string - */ - protected function getCarbonClassName() : string - { - return CarbonImmutable::class; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php b/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php deleted file mode 100644 index 02296d6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php +++ /dev/null @@ -1,15 +0,0 @@ - */ - use CarbonTypeConverter; -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php deleted file mode 100644 index ed916c0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use Throwable; -class BadComparisonUnitException extends UnitException -{ - /** - * The unit. - * - * @var string - */ - protected $unit; - /** - * Constructor. - * - * @param string $unit - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $code = 0, Throwable $previous = null) - { - $this->unit = $unit; - parent::__construct("Bad comparison unit: '{$unit}'", $code, $previous); - } - /** - * Get the unit. - * - * @return string - */ - public function getUnit() : string - { - return $this->unit; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php deleted file mode 100644 index fdb7bc1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use BadMethodCallException as BaseBadMethodCallException; -use Throwable; -class BadFluentConstructorException extends BaseBadMethodCallException implements BadMethodCallException -{ - /** - * The method. - * - * @var string - */ - protected $method; - /** - * Constructor. - * - * @param string $method - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($method, $code = 0, Throwable $previous = null) - { - $this->method = $method; - parent::__construct(\sprintf("Unknown fluent constructor '%s'.", $method), $code, $previous); - } - /** - * Get the method. - * - * @return string - */ - public function getMethod() : string - { - return $this->method; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php deleted file mode 100644 index c4d63fc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use BadMethodCallException as BaseBadMethodCallException; -use Throwable; -class BadFluentSetterException extends BaseBadMethodCallException implements BadMethodCallException -{ - /** - * The setter. - * - * @var string - */ - protected $setter; - /** - * Constructor. - * - * @param string $setter - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($setter, $code = 0, Throwable $previous = null) - { - $this->setter = $setter; - parent::__construct(\sprintf("Unknown fluent setter '%s'", $setter), $code, $previous); - } - /** - * Get the setter. - * - * @return string - */ - public function getSetter() : string - { - return $this->setter; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php deleted file mode 100644 index b493059..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -interface BadMethodCallException extends Exception -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php deleted file mode 100644 index cda86a8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use RuntimeException as BaseRuntimeException; -final class EndLessPeriodException extends BaseRuntimeException implements RuntimeException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/Exception.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/Exception.php deleted file mode 100644 index 14be21c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/Exception.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -interface Exception -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php deleted file mode 100644 index 1d08f4d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use RuntimeException as BaseRuntimeException; -use Throwable; -class ImmutableException extends BaseRuntimeException implements RuntimeException -{ - /** - * The value. - * - * @var string - */ - protected $value; - /** - * Constructor. - * - * @param string $value the immutable type/value - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($value, $code = 0, Throwable $previous = null) - { - $this->value = $value; - parent::__construct("{$value} is immutable.", $code, $previous); - } - /** - * Get the value. - * - * @return string - */ - public function getValue() : string - { - return $this->value; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php deleted file mode 100644 index 2202f52..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -interface InvalidArgumentException extends Exception -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php deleted file mode 100644 index 6b365e4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidCastException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php deleted file mode 100644 index b789893..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -class InvalidDateException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The invalid field. - * - * @var string - */ - private $field; - /** - * The invalid value. - * - * @var mixed - */ - private $value; - /** - * Constructor. - * - * @param string $field - * @param mixed $value - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($field, $value, $code = 0, Throwable $previous = null) - { - $this->field = $field; - $this->value = $value; - parent::__construct($field . ' : ' . $value . ' is not a valid value.', $code, $previous); - } - /** - * Get the invalid field. - * - * @return string - */ - public function getField() - { - return $this->field; - } - /** - * Get the invalid value. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php deleted file mode 100644 index 6acc17e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidFormatException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php deleted file mode 100644 index 353477b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidIntervalException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php deleted file mode 100644 index f9263ad..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidPeriodDateException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php deleted file mode 100644 index cb7fcd9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidPeriodParameterException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php deleted file mode 100644 index 1a8758f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidTimeZoneException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php deleted file mode 100644 index 88fb08b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class InvalidTypeException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php deleted file mode 100644 index 287d106..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -class NotACarbonClassException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The className. - * - * @var string - */ - protected $className; - /** - * Constructor. - * - * @param string $className - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($className, $code = 0, Throwable $previous = null) - { - $this->className = $className; - parent::__construct(\sprintf('Given class does not implement %s: %s', CarbonInterface::class, $className), $code, $previous); - } - /** - * Get the className. - * - * @return string - */ - public function getClassName() : string - { - return $this->className; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php deleted file mode 100644 index b96ee37..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class NotAPeriodException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php deleted file mode 100644 index e02fe10..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -class NotLocaleAwareException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * Constructor. - * - * @param mixed $object - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($object, $code = 0, Throwable $previous = null) - { - $dump = \is_object($object) ? \get_class($object) : \gettype($object); - parent::__construct("{$dump} does neither implements Symfony\\Contracts\\Translation\\LocaleAwareInterface nor getLocale() method.", $code, $previous); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php deleted file mode 100644 index 58f7c14..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -// This will extends OutOfRangeException instead of InvalidArgumentException since 3.0.0 -// use OutOfRangeException as BaseOutOfRangeException; -class OutOfRangeException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The unit or name of the value. - * - * @var string - */ - private $unit; - /** - * The range minimum. - * - * @var mixed - */ - private $min; - /** - * The range maximum. - * - * @var mixed - */ - private $max; - /** - * The invalid value. - * - * @var mixed - */ - private $value; - /** - * Constructor. - * - * @param string $unit - * @param mixed $min - * @param mixed $max - * @param mixed $value - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $min, $max, $value, $code = 0, Throwable $previous = null) - { - $this->unit = $unit; - $this->min = $min; - $this->max = $max; - $this->value = $value; - parent::__construct("{$unit} must be between {$min} and {$max}, {$value} given", $code, $previous); - } - /** - * @return mixed - */ - public function getMax() - { - return $this->max; - } - /** - * @return mixed - */ - public function getMin() - { - return $this->min; - } - /** - * @return mixed - */ - public function getUnit() - { - return $this->unit; - } - /** - * @return mixed - */ - public function getValue() - { - return $this->value; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php deleted file mode 100644 index f08e6ea..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -class ParseErrorException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The expected. - * - * @var string - */ - protected $expected; - /** - * The actual. - * - * @var string - */ - protected $actual; - /** - * The help message. - * - * @var string - */ - protected $help; - /** - * Constructor. - * - * @param string $expected - * @param string $actual - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($expected, $actual, $help = '', $code = 0, Throwable $previous = null) - { - $this->expected = $expected; - $this->actual = $actual; - $this->help = $help; - $actual = $actual === '' ? 'data is missing' : "get '{$actual}'"; - parent::__construct(\trim("Format expected {$expected} but {$actual}\n{$help}"), $code, $previous); - } - /** - * Get the expected. - * - * @return string - */ - public function getExpected() : string - { - return $this->expected; - } - /** - * Get the actual. - * - * @return string - */ - public function getActual() : string - { - return $this->actual; - } - /** - * Get the help message. - * - * @return string - */ - public function getHelp() : string - { - return $this->help; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php deleted file mode 100644 index e09fa98..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -interface RuntimeException extends Exception -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitException.php deleted file mode 100644 index 5ece997..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -class UnitException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php deleted file mode 100644 index a204b43..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use Throwable; -class UnitNotConfiguredException extends UnitException -{ - /** - * The unit. - * - * @var string - */ - protected $unit; - /** - * Constructor. - * - * @param string $unit - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $code = 0, Throwable $previous = null) - { - $this->unit = $unit; - parent::__construct("Unit {$unit} have no configuration to get total from other units.", $code, $previous); - } - /** - * Get the unit. - * - * @return string - */ - public function getUnit() : string - { - return $this->unit; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php deleted file mode 100644 index ec323e7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -class UnknownGetterException extends BaseInvalidArgumentException implements InvalidArgumentException -{ - /** - * The getter. - * - * @var string - */ - protected $getter; - /** - * Constructor. - * - * @param string $getter getter name - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($getter, $code = 0, Throwable $previous = null) - { - $this->getter = $getter; - parent::__construct("Unknown getter '{$getter}'", $code, $previous); - } - /** - * Get the getter. - * - * @return string - */ - public function getGetter() : string - { - return $this->getter; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php deleted file mode 100644 index 8baa7ce..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use BadMethodCallException as BaseBadMethodCallException; -use Throwable; -class UnknownMethodException extends BaseBadMethodCallException implements BadMethodCallException -{ - /** - * The method. - * - * @var string - */ - protected $method; - /** - * Constructor. - * - * @param string $method - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($method, $code = 0, Throwable $previous = null) - { - $this->method = $method; - parent::__construct("Method {$method} does not exist.", $code, $previous); - } - /** - * Get the method. - * - * @return string - */ - public function getMethod() : string - { - return $this->method; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php deleted file mode 100644 index c2b8a9d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use InvalidArgumentException as BaseInvalidArgumentException; -use Throwable; -class UnknownSetterException extends BaseInvalidArgumentException implements BadMethodCallException -{ - /** - * The setter. - * - * @var string - */ - protected $setter; - /** - * Constructor. - * - * @param string $setter setter name - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($setter, $code = 0, Throwable $previous = null) - { - $this->setter = $setter; - parent::__construct("Unknown setter '{$setter}'", $code, $previous); - } - /** - * Get the setter. - * - * @return string - */ - public function getSetter() : string - { - return $this->setter; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php deleted file mode 100644 index eeedb21..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use Throwable; -class UnknownUnitException extends UnitException -{ - /** - * The unit. - * - * @var string - */ - protected $unit; - /** - * Constructor. - * - * @param string $unit - * @param int $code - * @param Throwable|null $previous - */ - public function __construct($unit, $code = 0, Throwable $previous = null) - { - $this->unit = $unit; - parent::__construct("Unknown unit '{$unit}'.", $code, $previous); - } - /** - * Get the unit. - * - * @return string - */ - public function getUnit() : string - { - return $this->unit; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php b/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php deleted file mode 100644 index 1868b2c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Exceptions; - -use RuntimeException as BaseRuntimeException; -class UnreachableException extends BaseRuntimeException implements RuntimeException -{ - // -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Factory.php b/dependencies/nesbot/carbon/src/Carbon/Factory.php deleted file mode 100644 index a90ed8b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Factory.php +++ /dev/null @@ -1,304 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use Closure; -use DateTimeInterface; -use ReflectionMethod; -/** - * A factory to generate Carbon instances with common settings. - * - * - * - * @method bool canBeCreatedFromFormat($date, $format) Checks if the (date)time string is in a given format and valid to create a - * new instance. - * @method Carbon|false create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) Create a new Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * @method Carbon createFromDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to now. - * @method Carbon|false createFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. - * @method Carbon|false createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null) Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * @method Carbon|false createFromLocaleFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific format and a string in a given language. - * @method Carbon|false createFromLocaleIsoFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific ISO format and a string in a given language. - * @method Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) Create a Carbon instance from just a time. The date portion is set to today. - * @method Carbon createFromTimeString($time, $tz = null) Create a Carbon instance from a time string. The date portion is set to today. - * @method Carbon createFromTimestamp($timestamp, $tz = null) Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createFromTimestampMs($timestamp, $tz = null) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createFromTimestampMsUTC($timestamp) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createFromTimestampUTC($timestamp) Create a Carbon instance from an timestamp keeping the timezone to UTC. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method Carbon createMidnightDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to midnight. - * @method Carbon|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) Create a new safe Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * @method CarbonInterface createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null) Create a new Carbon instance from a specific date and time using strict validation. - * @method Carbon disableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method Carbon enableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method mixed executeWithLocale($locale, $func) Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * @method Carbon fromSerialized($value) Create an instance from a serialized string. - * @method void genericMacro($macro, $priority = 0) Register a custom macro. - * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * @method array getDays() Get the days of the week - * @method string|null getFallbackLocale() Get the fallback locale. - * @method array getFormatsToIsoReplacements() List of replacements from date() format to isoFormat(). - * @method int getHumanDiffOptions() Return default humanDiff() options (merged flags as integer). - * @method array getIsoUnits() Returns list of locale units for ISO formatting. - * @method array getLastErrors() {@inheritdoc} - * @method string getLocale() Get the current translator locale. - * @method callable|null getMacro($name) Get the raw callable macro registered globally for a given name. - * @method int getMidDayAt() get midday/noon hour - * @method Closure|Carbon getTestNow() Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * @method string getTimeFormatByPrecision($unitPrecision) Return a format from H:i to H:i:s.u according to given unit precision. - * @method string getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) Returns raw translation message for a given key. - * @method \Symfony\Component\Translation\TranslatorInterface getTranslator() Get the default translator instance in use. - * @method int getWeekEndsAt() Get the last day of week - * @method int getWeekStartsAt() Get the first day of week - * @method array getWeekendDays() Get weekend days - * @method bool hasFormat($date, $format) Checks if the (date)time string is in a given format. - * @method bool hasFormatWithModifiers($date, $format) Checks if the (date)time string is in a given format. - * @method bool hasMacro($name) Checks if macro is registered globally. - * @method bool hasRelativeKeywords($time) Determine if a time string will produce a relative date. - * @method bool hasTestNow() Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * @method Carbon instance($date) Create a Carbon instance from a DateTime one. - * @method bool isImmutable() Returns true if the current class/instance is immutable. - * @method bool isModifiableUnit($unit) Returns true if a property can be changed via setter. - * @method bool isMutable() Returns true if the current class/instance is mutable. - * @method bool isStrictModeEnabled() Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - * @method bool localeHasDiffOneDayWords($locale) Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * @method bool localeHasDiffSyntax($locale) Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasDiffTwoDayWords($locale) Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * @method bool localeHasPeriodSyntax($locale) Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasShortUnits($locale) Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * @method void macro($name, $macro) Register a custom macro. - * @method Carbon|null make($var) Make a Carbon instance from given variable if possible. - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * @method Carbon maxValue() Create a Carbon instance for the greatest supported date. - * @method Carbon minValue() Create a Carbon instance for the lowest supported date. - * @method void mixin($mixin) Mix another object into the class. - * @method Carbon now($tz = null) Get a Carbon instance for the current date and time. - * @method Carbon parse($time = null, $tz = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method Carbon parseFromLocale($time, $locale = null, $tz = null) Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * @method string pluralUnit(string $unit) Returns standardized plural of a given singular/plural unit name (in English). - * @method Carbon|false rawCreateFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. - * @method Carbon rawParse($time = null, $tz = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method Carbon resetMacros() Remove all macros and generic macros. - * @method void resetMonthsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method void resetToStringFormat() Reset the format used to the default when type juggling a Carbon instance to a string - * @method void resetYearsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method void serializeUsing($callback) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather transform Carbon object before the serialization. - * JSON serialize all Carbon instances using the given callback. - * @method Carbon setFallbackLocale($locale) Set the fallback locale. - * @method Carbon setHumanDiffOptions($humanDiffOptions) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method bool setLocale($locale) Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use closest language from the current LC_TIME locale. - * @method void setMidDayAt($hour) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * Set midday/noon hour - * @method Carbon setTestNow($testNow = null) Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * To clear the test instance call this method using the default - * parameter of null. - * /!\ Use this method for unit tests only. - * @method Carbon setTestNowAndTimezone($testNow = null, $tz = null) Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * To clear the test instance call this method using the default - * parameter of null. - * /!\ Use this method for unit tests only. - * @method void setToStringFormat($format) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and - * use other method or custom format passed to format() method if you need to dump another string - * format. - * Set the default format used when type juggling a Carbon instance to a string. - * @method void setTranslator(TranslatorInterface $translator) Set the default translator instance to use. - * @method Carbon setUtf8($utf8) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use UTF-8 language packages on every machine. - * Set if UTF8 will be used for localized date/time. - * @method void setWeekEndsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek - * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the - * start of week according to current locale selected and implicitly the end of week. - * Set the last day of week - * @method void setWeekStartsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the - * 'first_day_of_week' locale setting to change the start of week according to current locale - * selected and implicitly the end of week. - * Set the first day of week - * @method void setWeekendDays($days) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider week-end is always saturday and sunday, and if you have some custom - * week-end days to handle, give to those days an other name and create a macro for them: - * ``` - * Carbon::macro('isDayOff', function ($date) { - * return $date->isSunday() || $date->isMonday(); - * }); - * Carbon::macro('isNotDayOff', function ($date) { - * return !$date->isDayOff(); - * }); - * if ($someDate->isDayOff()) ... - * if ($someDate->isNotDayOff()) ... - * // Add 5 not-off days - * $count = 5; - * while ($someDate->isDayOff() || ($count-- > 0)) { - * $someDate->addDay(); - * } - * ``` - * Set weekend days - * @method bool shouldOverflowMonths() Get the month overflow global behavior (can be overridden in specific instances). - * @method bool shouldOverflowYears() Get the month overflow global behavior (can be overridden in specific instances). - * @method string singularUnit(string $unit) Returns standardized singular of a given singular/plural unit name (in English). - * @method Carbon today($tz = null) Create a Carbon instance for today. - * @method Carbon tomorrow($tz = null) Create a Carbon instance for tomorrow. - * @method string translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL) Translate a time string from a locale to an other. - * @method string translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) Translate using translation string or callback available. - * @method void useMonthsOverflow($monthsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method Carbon useStrictMode($strictModeEnabled = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method void useYearsOverflow($yearsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method mixed withTestNow($testNow, $callback) Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * /!\ Use this method for unit tests only. - * @method Carbon yesterday($tz = null) Create a Carbon instance for yesterday. - * - * - */ -class Factory -{ - protected $className = Carbon::class; - protected $settings = []; - public function __construct(array $settings = [], ?string $className = null) - { - if ($className) { - $this->className = $className; - } - $this->settings = $settings; - } - public function getClassName() - { - return $this->className; - } - public function setClassName(string $className) - { - $this->className = $className; - return $this; - } - public function className(string $className = null) - { - return $className === null ? $this->getClassName() : $this->setClassName($className); - } - public function getSettings() - { - return $this->settings; - } - public function setSettings(array $settings) - { - $this->settings = $settings; - return $this; - } - public function settings(array $settings = null) - { - return $settings === null ? $this->getSettings() : $this->setSettings($settings); - } - public function mergeSettings(array $settings) - { - $this->settings = \array_merge($this->settings, $settings); - return $this; - } - public function __call($name, $arguments) - { - $method = new ReflectionMethod($this->className, $name); - $settings = $this->settings; - if ($settings && isset($settings['timezone'])) { - $tzParameters = \array_filter($method->getParameters(), function ($parameter) { - return \in_array($parameter->getName(), ['tz', 'timezone'], \true); - }); - if (isset($arguments[0]) && \in_array($name, ['instance', 'make', 'create', 'parse'], \true)) { - if ($arguments[0] instanceof DateTimeInterface) { - $settings['innerTimezone'] = $settings['timezone']; - } elseif (\is_string($arguments[0]) && \date_parse($arguments[0])['is_localtime']) { - unset($settings['timezone'], $settings['innerTimezone']); - } - } elseif (\count($tzParameters)) { - \array_splice($arguments, \key($tzParameters), 0, [$settings['timezone']]); - unset($settings['timezone']); - } - } - $result = $this->className::$name(...$arguments); - return $result instanceof CarbonInterface && !empty($settings) ? $result->settings($settings) : $result; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/FactoryImmutable.php b/dependencies/nesbot/carbon/src/Carbon/FactoryImmutable.php deleted file mode 100644 index f2278a0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/FactoryImmutable.php +++ /dev/null @@ -1,255 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use Closure; -use DateTimeImmutable; -use DateTimeZone; -use WP_Ultimo\Dependencies\Psr\Clock\ClockInterface; -/** - * A factory to generate CarbonImmutable instances with common settings. - * - * - * - * @method bool canBeCreatedFromFormat($date, $format) Checks if the (date)time string is in a given format and valid to create a - * new instance. - * @method CarbonImmutable|false create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) Create a new Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * @method CarbonImmutable createFromDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to now. - * @method CarbonImmutable|false createFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. - * @method CarbonImmutable|false createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null) Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * @method CarbonImmutable|false createFromLocaleFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific format and a string in a given language. - * @method CarbonImmutable|false createFromLocaleIsoFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific ISO format and a string in a given language. - * @method CarbonImmutable createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) Create a Carbon instance from just a time. The date portion is set to today. - * @method CarbonImmutable createFromTimeString($time, $tz = null) Create a Carbon instance from a time string. The date portion is set to today. - * @method CarbonImmutable createFromTimestamp($timestamp, $tz = null) Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createFromTimestampMs($timestamp, $tz = null) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createFromTimestampMsUTC($timestamp) Create a Carbon instance from a timestamp in milliseconds. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createFromTimestampUTC($timestamp) Create a Carbon instance from an timestamp keeping the timezone to UTC. - * Timestamp input can be given as int, float or a string containing one or more numbers. - * @method CarbonImmutable createMidnightDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to midnight. - * @method CarbonImmutable|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) Create a new safe Carbon instance from a specific date and time. - * If any of $year, $month or $day are set to null their now() values will - * be used. - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * If $hour is not null then the default values for $minute and $second - * will be 0. - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * @method CarbonInterface createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null) Create a new Carbon instance from a specific date and time using strict validation. - * @method CarbonImmutable disableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method CarbonImmutable enableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method mixed executeWithLocale($locale, $func) Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * @method CarbonImmutable fromSerialized($value) Create an instance from a serialized string. - * @method void genericMacro($macro, $priority = 0) Register a custom macro. - * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * @method array getDays() Get the days of the week - * @method string|null getFallbackLocale() Get the fallback locale. - * @method array getFormatsToIsoReplacements() List of replacements from date() format to isoFormat(). - * @method int getHumanDiffOptions() Return default humanDiff() options (merged flags as integer). - * @method array getIsoUnits() Returns list of locale units for ISO formatting. - * @method array getLastErrors() {@inheritdoc} - * @method string getLocale() Get the current translator locale. - * @method callable|null getMacro($name) Get the raw callable macro registered globally for a given name. - * @method int getMidDayAt() get midday/noon hour - * @method Closure|CarbonImmutable getTestNow() Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * @method string getTimeFormatByPrecision($unitPrecision) Return a format from H:i to H:i:s.u according to given unit precision. - * @method string getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) Returns raw translation message for a given key. - * @method \Symfony\Component\Translation\TranslatorInterface getTranslator() Get the default translator instance in use. - * @method int getWeekEndsAt() Get the last day of week - * @method int getWeekStartsAt() Get the first day of week - * @method array getWeekendDays() Get weekend days - * @method bool hasFormat($date, $format) Checks if the (date)time string is in a given format. - * @method bool hasFormatWithModifiers($date, $format) Checks if the (date)time string is in a given format. - * @method bool hasMacro($name) Checks if macro is registered globally. - * @method bool hasRelativeKeywords($time) Determine if a time string will produce a relative date. - * @method bool hasTestNow() Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * @method CarbonImmutable instance($date) Create a Carbon instance from a DateTime one. - * @method bool isImmutable() Returns true if the current class/instance is immutable. - * @method bool isModifiableUnit($unit) Returns true if a property can be changed via setter. - * @method bool isMutable() Returns true if the current class/instance is mutable. - * @method bool isStrictModeEnabled() Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - * @method bool localeHasDiffOneDayWords($locale) Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * @method bool localeHasDiffSyntax($locale) Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasDiffTwoDayWords($locale) Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * @method bool localeHasPeriodSyntax($locale) Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * @method bool localeHasShortUnits($locale) Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * @method void macro($name, $macro) Register a custom macro. - * @method CarbonImmutable|null make($var) Make a Carbon instance from given variable if possible. - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * @method CarbonImmutable maxValue() Create a Carbon instance for the greatest supported date. - * @method CarbonImmutable minValue() Create a Carbon instance for the lowest supported date. - * @method void mixin($mixin) Mix another object into the class. - * @method CarbonImmutable parse($time = null, $tz = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method CarbonImmutable parseFromLocale($time, $locale = null, $tz = null) Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * @method string pluralUnit(string $unit) Returns standardized plural of a given singular/plural unit name (in English). - * @method CarbonImmutable|false rawCreateFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. - * @method CarbonImmutable rawParse($time = null, $tz = null) Create a carbon instance from a string. - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * @method CarbonImmutable resetMacros() Remove all macros and generic macros. - * @method void resetMonthsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method void resetToStringFormat() Reset the format used to the default when type juggling a Carbon instance to a string - * @method void resetYearsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method void serializeUsing($callback) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather transform Carbon object before the serialization. - * JSON serialize all Carbon instances using the given callback. - * @method CarbonImmutable setFallbackLocale($locale) Set the fallback locale. - * @method CarbonImmutable setHumanDiffOptions($humanDiffOptions) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method bool setLocale($locale) Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use closest language from the current LC_TIME locale. - * @method void setMidDayAt($hour) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * Set midday/noon hour - * @method CarbonImmutable setTestNow($testNow = null) Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * To clear the test instance call this method using the default - * parameter of null. - * /!\ Use this method for unit tests only. - * @method CarbonImmutable setTestNowAndTimezone($testNow = null, $tz = null) Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * To clear the test instance call this method using the default - * parameter of null. - * /!\ Use this method for unit tests only. - * @method void setToStringFormat($format) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and - * use other method or custom format passed to format() method if you need to dump another string - * format. - * Set the default format used when type juggling a Carbon instance to a string. - * @method void setTranslator(TranslatorInterface $translator) Set the default translator instance to use. - * @method CarbonImmutable setUtf8($utf8) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use UTF-8 language packages on every machine. - * Set if UTF8 will be used for localized date/time. - * @method void setWeekEndsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek - * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the - * start of week according to current locale selected and implicitly the end of week. - * Set the last day of week - * @method void setWeekStartsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the - * 'first_day_of_week' locale setting to change the start of week according to current locale - * selected and implicitly the end of week. - * Set the first day of week - * @method void setWeekendDays($days) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider week-end is always saturday and sunday, and if you have some custom - * week-end days to handle, give to those days an other name and create a macro for them: - * ``` - * Carbon::macro('isDayOff', function ($date) { - * return $date->isSunday() || $date->isMonday(); - * }); - * Carbon::macro('isNotDayOff', function ($date) { - * return !$date->isDayOff(); - * }); - * if ($someDate->isDayOff()) ... - * if ($someDate->isNotDayOff()) ... - * // Add 5 not-off days - * $count = 5; - * while ($someDate->isDayOff() || ($count-- > 0)) { - * $someDate->addDay(); - * } - * ``` - * Set weekend days - * @method bool shouldOverflowMonths() Get the month overflow global behavior (can be overridden in specific instances). - * @method bool shouldOverflowYears() Get the month overflow global behavior (can be overridden in specific instances). - * @method string singularUnit(string $unit) Returns standardized singular of a given singular/plural unit name (in English). - * @method CarbonImmutable today($tz = null) Create a Carbon instance for today. - * @method CarbonImmutable tomorrow($tz = null) Create a Carbon instance for tomorrow. - * @method string translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL) Translate a time string from a locale to an other. - * @method string translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) Translate using translation string or callback available. - * @method void useMonthsOverflow($monthsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method CarbonImmutable useStrictMode($strictModeEnabled = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @method void useYearsOverflow($yearsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @method mixed withTestNow($testNow, $callback) Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * /!\ Use this method for unit tests only. - * @method CarbonImmutable yesterday($tz = null) Create a Carbon instance for yesterday. - * - * - */ -class FactoryImmutable extends Factory implements ClockInterface -{ - protected $className = CarbonImmutable::class; - /** - * Get a Carbon instance for the current date and time. - * - * @param DateTimeZone|string|int|null $tz - * - * @return CarbonImmutable - */ - public function now($tz = null) : DateTimeImmutable - { - $className = $this->className; - return new $className(null, $tz); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/aa.php b/dependencies/nesbot/carbon/src/Carbon/Lang/aa.php deleted file mode 100644 index f3431e4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/aa.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/aa_DJ.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_DJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/aa_DJ.php deleted file mode 100644 index c6e23c0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_DJ.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Qunxa Garablu', 'Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Liiqen', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['qun', 'nah', 'cig', 'agd', 'cax', 'qas', 'qad', 'leq', 'way', 'dit', 'xim', 'kax'], - 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], - 'weekdays_short' => ['aca', 'etl', 'tal', 'arb', 'kam', 'gum', 'sab'], - 'weekdays_min' => ['aca', 'etl', 'tal', 'arb', 'kam', 'gum', 'sab'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], - - 'year' => ':count gaqambo', // less reliable - 'y' => ':count gaqambo', // less reliable - 'a_year' => ':count gaqambo', // less reliable - - 'month' => ':count àlsa', - 'm' => ':count àlsa', - 'a_month' => ':count àlsa', - - 'day' => ':count saaku', // less reliable - 'd' => ':count saaku', // less reliable - 'a_day' => ':count saaku', // less reliable - - 'hour' => ':count ayti', // less reliable - 'h' => ':count ayti', // less reliable - 'a_hour' => ':count ayti', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER.php deleted file mode 100644 index f8f395b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Qunxa Garablu', 'Naharsi Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Leqeeni', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['Qun', 'Nah', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], - 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], - 'weekdays_short' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'weekdays_min' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php b/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php deleted file mode 100644 index 6461225..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Qunxa Garablu', 'Naharsi Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Leqeeni', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['Qun', 'Nah', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], - 'weekdays' => ['Naba Sambat', 'Sani', 'Salus', 'Rabuq', 'Camus', 'Jumqata', 'Qunxa Sambat'], - 'weekdays_short' => ['Nab', 'San', 'Sal', 'Rab', 'Cam', 'Jum', 'Qun'], - 'weekdays_min' => ['Nab', 'San', 'Sal', 'Rab', 'Cam', 'Jum', 'Qun'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ET.php deleted file mode 100644 index e55e591..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/aa_ET.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Qunxa Garablu', 'Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Liiqen', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], - 'months_short' => ['Qun', 'Kud', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], - 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], - 'weekdays_short' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'weekdays_min' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['saaku', 'carra'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/af.php b/dependencies/nesbot/carbon/src/Carbon/Lang/af.php deleted file mode 100644 index 27771d7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/af.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - JD Isaacks - * - Pierre du Plessis - */ -return [ - 'year' => ':count jaar', - 'a_year' => '\'n jaar|:count jaar', - 'y' => ':count j.', - 'month' => ':count maand|:count maande', - 'a_month' => '\'n maand|:count maande', - 'm' => ':count maa.', - 'week' => ':count week|:count weke', - 'a_week' => '\'n week|:count weke', - 'w' => ':count w.', - 'day' => ':count dag|:count dae', - 'a_day' => '\'n dag|:count dae', - 'd' => ':count d.', - 'hour' => ':count uur', - 'a_hour' => '\'n uur|:count uur', - 'h' => ':count u.', - 'minute' => ':count minuut|:count minute', - 'a_minute' => '\'n minuut|:count minute', - 'min' => ':count min.', - 'second' => ':count sekond|:count sekondes', - 'a_second' => '\'n paar sekondes|:count sekondes', - 's' => ':count s.', - 'ago' => ':time gelede', - 'from_now' => 'oor :time', - 'after' => ':time na', - 'before' => ':time voor', - 'diff_now' => 'Nou', - 'diff_today' => 'Vandag', - 'diff_today_regexp' => 'Vandag(?:\\s+om)?', - 'diff_yesterday' => 'Gister', - 'diff_yesterday_regexp' => 'Gister(?:\\s+om)?', - 'diff_tomorrow' => 'Môre', - 'diff_tomorrow_regexp' => 'Môre(?:\\s+om)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Vandag om] LT', - 'nextDay' => '[Môre om] LT', - 'nextWeek' => 'dddd [om] LT', - 'lastDay' => '[Gister om] LT', - 'lastWeek' => '[Laas] dddd [om] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); - }, - 'meridiem' => ['VM', 'NM'], - 'months' => ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'], - 'months_short' => ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], - 'weekdays_short' => ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], - 'weekdays_min' => ['So', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' en '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/af_NA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/af_NA.php deleted file mode 100644 index f2fcf05..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/af_NA.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/af.php', [ - 'meridiem' => ['v', 'n'], - 'weekdays' => ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], - 'weekdays_short' => ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'], - 'weekdays_min' => ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'], - 'months' => ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'], - 'months_short' => ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'DD MMM YYYY', - 'LLL' => 'DD MMMM YYYY HH:mm', - 'LLLL' => 'dddd, DD MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/af_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/af_ZA.php deleted file mode 100644 index 27896bd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/af_ZA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/af.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/agq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/agq.php deleted file mode 100644 index 7011464..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/agq.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['a.g', 'a.k'], - 'weekdays' => ['tsuʔntsɨ', 'tsuʔukpà', 'tsuʔughɔe', 'tsuʔutɔ̀mlò', 'tsuʔumè', 'tsuʔughɨ̂m', 'tsuʔndzɨkɔʔɔ'], - 'weekdays_short' => ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'], - 'weekdays_min' => ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'], - 'months' => ['ndzɔ̀ŋɔ̀nùm', 'ndzɔ̀ŋɔ̀kƗ̀zùʔ', 'ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà', 'ndzɔ̀ŋɔ̀tǎafʉ̄ghā', 'ndzɔ̀ŋèsèe', 'ndzɔ̀ŋɔ̀nzùghò', 'ndzɔ̀ŋɔ̀dùmlo', 'ndzɔ̀ŋɔ̀kwîfɔ̀e', 'ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù', 'ndzɔ̀ŋɔ̀ghǔuwelɔ̀m', 'ndzɔ̀ŋɔ̀chwaʔàkaa wo', 'ndzɔ̀ŋèfwòo'], - 'months_short' => ['nùm', 'kɨz', 'tɨd', 'taa', 'see', 'nzu', 'dum', 'fɔe', 'dzu', 'lɔm', 'kaa', 'fwo'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/agr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/agr.php deleted file mode 100644 index 8f036ae..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/agr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/agr_PE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/agr_PE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/agr_PE.php deleted file mode 100644 index 54a326a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/agr_PE.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - somosazucar.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Petsatin', 'Kupitin', 'Uyaitin', 'Tayutin', 'Kegketin', 'Tegmatin', 'Kuntutin', 'Yagkujutin', 'Daiktatin', 'Ipamtatin', 'Shinutin', 'Sakamtin'], - 'months_short' => ['Pet', 'Kup', 'Uya', 'Tay', 'Keg', 'Teg', 'Kun', 'Yag', 'Dait', 'Ipam', 'Shin', 'Sak'], - 'weekdays' => ['Tuntuamtin', 'Achutin', 'Kugkuktin', 'Saketin', 'Shimpitin', 'Imaptin', 'Bataetin'], - 'weekdays_short' => ['Tun', 'Ach', 'Kug', 'Sak', 'Shim', 'Im', 'Bat'], - 'weekdays_min' => ['Tun', 'Ach', 'Kug', 'Sak', 'Shim', 'Im', 'Bat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 7, - 'meridiem' => ['VM', 'NM'], - - 'year' => ':count yaya', // less reliable - 'y' => ':count yaya', // less reliable - 'a_year' => ':count yaya', // less reliable - - 'month' => ':count nantu', // less reliable - 'm' => ':count nantu', // less reliable - 'a_month' => ':count nantu', // less reliable - - 'day' => ':count nayaim', // less reliable - 'd' => ':count nayaim', // less reliable - 'a_day' => ':count nayaim', // less reliable - - 'hour' => ':count kuwiš', // less reliable - 'h' => ':count kuwiš', // less reliable - 'a_hour' => ':count kuwiš', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ak.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ak.php deleted file mode 100644 index 5a64be3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ak.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ak_GH.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ak_GH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ak_GH.php deleted file mode 100644 index 1381946..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ak_GH.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY/MM/DD', - ], - 'months' => ['Sanda-Ɔpɛpɔn', 'Kwakwar-Ɔgyefuo', 'Ebɔw-Ɔbenem', 'Ebɔbira-Oforisuo', 'Esusow Aketseaba-Kɔtɔnimba', 'Obirade-Ayɛwohomumu', 'Ayɛwoho-Kitawonsa', 'Difuu-Ɔsandaa', 'Fankwa-Ɛbɔ', 'Ɔbɛsɛ-Ahinime', 'Ɔberɛfɛw-Obubuo', 'Mumu-Ɔpɛnimba'], - 'months_short' => ['S-Ɔ', 'K-Ɔ', 'E-Ɔ', 'E-O', 'E-K', 'O-A', 'A-K', 'D-Ɔ', 'F-Ɛ', 'Ɔ-A', 'Ɔ-O', 'M-Ɔ'], - 'weekdays' => ['Kwesida', 'Dwowda', 'Benada', 'Wukuda', 'Yawda', 'Fida', 'Memeneda'], - 'weekdays_short' => ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'], - 'weekdays_min' => ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['AN', 'EW'], - - 'year' => ':count afe', - 'y' => ':count afe', - 'a_year' => ':count afe', - - 'month' => ':count bosume', - 'm' => ':count bosume', - 'a_month' => ':count bosume', - - 'day' => ':count ɛda', - 'd' => ':count ɛda', - 'a_day' => ':count ɛda', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/am.php b/dependencies/nesbot/carbon/src/Carbon/Lang/am.php deleted file mode 100644 index 63bf72d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/am.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/am_ET.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/am_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/am_ET.php deleted file mode 100644 index ece8062..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/am_ET.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕሪል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክቶበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], - 'weekdays_short' => ['እሑድ', 'ሰኞ ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], - 'weekdays_min' => ['እሑድ', 'ሰኞ ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ጡዋት', 'ከሰዓት'], - - 'year' => ':count አመት', - 'y' => ':count አመት', - 'a_year' => ':count አመት', - - 'month' => ':count ወር', - 'm' => ':count ወር', - 'a_month' => ':count ወር', - - 'week' => ':count ሳምንት', - 'w' => ':count ሳምንት', - 'a_week' => ':count ሳምንት', - - 'day' => ':count ቀን', - 'd' => ':count ቀን', - 'a_day' => ':count ቀን', - - 'hour' => ':count ሰዓት', - 'h' => ':count ሰዓት', - 'a_hour' => ':count ሰዓት', - - 'minute' => ':count ደቂቃ', - 'min' => ':count ደቂቃ', - 'a_minute' => ':count ደቂቃ', - - 'second' => ':count ሴኮንድ', - 's' => ':count ሴኮንድ', - 'a_second' => ':count ሴኮንድ', - - 'ago' => 'ከ:time በፊት', - 'from_now' => 'በ:time ውስጥ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/an.php b/dependencies/nesbot/carbon/src/Carbon/Lang/an.php deleted file mode 100644 index 565abf2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/an.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/an_ES.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/an_ES.php b/dependencies/nesbot/carbon/src/Carbon/Lang/an_ES.php deleted file mode 100644 index faf8ae0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/an_ES.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Softaragones Jordi Mallach Pérez, Juan Pablo Martínez bug-glibc-locales@gnu.org, softaragones@softaragones.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['chinero', 'febrero', 'marzo', 'abril', 'mayo', 'chunyo', 'chuliol', 'agosto', 'setiembre', 'octubre', 'noviembre', 'aviento'], - 'months_short' => ['chi', 'feb', 'mar', 'abr', 'may', 'chn', 'chl', 'ago', 'set', 'oct', 'nov', 'avi'], - 'weekdays' => ['domingo', 'luns', 'martes', 'mierques', 'chueves', 'viernes', 'sabado'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mie', 'chu', 'vie', 'sab'], - 'weekdays_min' => ['dom', 'lun', 'mar', 'mie', 'chu', 'vie', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count año', - 'y' => ':count año', - 'a_year' => ':count año', - - 'month' => ':count mes', - 'm' => ':count mes', - 'a_month' => ':count mes', - - 'week' => ':count semana', - 'w' => ':count semana', - 'a_week' => ':count semana', - - 'day' => ':count día', - 'd' => ':count día', - 'a_day' => ':count día', - - 'hour' => ':count reloch', // less reliable - 'h' => ':count reloch', // less reliable - 'a_hour' => ':count reloch', // less reliable - - 'minute' => ':count minuto', - 'min' => ':count minuto', - 'a_minute' => ':count minuto', - - 'second' => ':count segundo', - 's' => ':count segundo', - 'a_second' => ':count segundo', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/anp.php b/dependencies/nesbot/carbon/src/Carbon/Lang/anp.php deleted file mode 100644 index b56c67b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/anp.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/anp_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/anp_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/anp_IN.php deleted file mode 100644 index 11069be..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/anp_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bhashaghar@googlegroups.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर"'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'बृहस्पतिवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar.php deleted file mode 100644 index 5f73f63..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Atef Ben Ali (atefBB) - * - Ibrahim AshShohail - * - MLTDev - * - Mohamed Sabil (mohamedsabil83) - * - Yazan Alnugnugh (yazan-alnugnugh) - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => ':time من الآن', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم عند الساعة] LT', - 'nextDay' => '[غدًا عند الساعة] LT', - 'nextWeek' => 'dddd [عند الساعة] LT', - 'lastDay' => '[أمس عند الساعة] LT', - 'lastWeek' => 'dddd [عند الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_AE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_AE.php deleted file mode 100644 index 35a22b1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_AE.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت '], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_BH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_BH.php deleted file mode 100644 index 3518096..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_BH.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_DJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_DJ.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_DJ.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_DZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_DZ.php deleted file mode 100644 index aea4eee..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_DZ.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - Noureddine LOUAHEDJ - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -$months = [ - 'جانفي', - 'فيفري', - 'مارس', - 'أفريل', - 'ماي', - 'جوان', - 'جويلية', - 'أوت', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['أح', 'إث', 'ثلا', 'أر', 'خم', 'جم', 'سب'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 4, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_EG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_EG.php deleted file mode 100644 index 3518096..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_EG.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_EH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_EH.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_EH.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_ER.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_ER.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IL.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IL.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IN.php deleted file mode 100644 index 5fecf70..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IQ.php deleted file mode 100644 index 2d42008..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_IQ.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_JO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_JO.php deleted file mode 100644 index 2d42008..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_JO.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_KM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_KM.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_KM.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_KW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_KW.php deleted file mode 100644 index b3fb1cf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_KW.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - Nusret Parlak - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - * - Abdullah-Alhariri - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'ماي', - 'يونيو', - 'يوليوز', - 'غشت', - 'شتنبر', - 'أكتوبر', - 'نونبر', - 'دجنبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_LB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_LB.php deleted file mode 100644 index 2792745..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_LB.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_LY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_LY.php deleted file mode 100644 index 1f0af49..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_LY.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Atef Ben Ali (atefBB) - * - Ibrahim AshShohail - * - MLTDev - */ - -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', [':count سنة', 'سنة', 'سنتين', ':count سنوات', ':count سنة']), - 'a_year' => implode('|', [':count سنة', 'سنة', 'سنتين', ':count سنوات', ':count سنة']), - 'month' => implode('|', [':count شهر', 'شهر', 'شهرين', ':count أشهر', ':count شهر']), - 'a_month' => implode('|', [':count شهر', 'شهر', 'شهرين', ':count أشهر', ':count شهر']), - 'week' => implode('|', [':count أسبوع', 'أسبوع', 'أسبوعين', ':count أسابيع', ':count أسبوع']), - 'a_week' => implode('|', [':count أسبوع', 'أسبوع', 'أسبوعين', ':count أسابيع', ':count أسبوع']), - 'day' => implode('|', [':count يوم', 'يوم', 'يومين', ':count أيام', ':count يوم']), - 'a_day' => implode('|', [':count يوم', 'يوم', 'يومين', ':count أيام', ':count يوم']), - 'hour' => implode('|', [':count ساعة', 'ساعة', 'ساعتين', ':count ساعات', ':count ساعة']), - 'a_hour' => implode('|', [':count ساعة', 'ساعة', 'ساعتين', ':count ساعات', ':count ساعة']), - 'minute' => implode('|', [':count دقيقة', 'دقيقة', 'دقيقتين', ':count دقائق', ':count دقيقة']), - 'a_minute' => implode('|', [':count دقيقة', 'دقيقة', 'دقيقتين', ':count دقائق', ':count دقيقة']), - 'second' => implode('|', [':count ثانية', 'ثانية', 'ثانيتين', ':count ثواني', ':count ثانية']), - 'a_second' => implode('|', [':count ثانية', 'ثانية', 'ثانيتين', ':count ثواني', ':count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => ':time من الآن', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['مرة', 'مرة', ':count مرتين', ':count مرات', ':count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم عند الساعة] LT', - 'nextDay' => '[غدًا عند الساعة] LT', - 'nextWeek' => 'dddd [عند الساعة] LT', - 'lastDay' => '[أمس عند الساعة] LT', - 'lastWeek' => 'dddd [عند الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_MA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_MA.php deleted file mode 100644 index 047ae05..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_MA.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'ماي', - 'يونيو', - 'يوليوز', - 'غشت', - 'شتنبر', - 'أكتوبر', - 'نونبر', - 'دجنبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_MR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_MR.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_MR.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_OM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_OM.php deleted file mode 100644 index 3518096..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_OM.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_PS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_PS.php deleted file mode 100644 index 503c60d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_PS.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_QA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_QA.php deleted file mode 100644 index 3518096..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_QA.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SA.php deleted file mode 100644 index 550b0c7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SA.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Josh Soref - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - * - Abdullah-Alhariri - */ -$months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SD.php deleted file mode 100644 index 3518096..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SD.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SO.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SO.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SS.php deleted file mode 100644 index 32f3282..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SS.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SY.php deleted file mode 100644 index 2d42008..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_SY.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php deleted file mode 100644 index c2d4b43..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Abdellah Chadidi - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -// Same for long and short -$months = [ - // @TODO add shakl to months - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سَنَة', '{1}سَنَة', '{2}سَنَتَيْن', ']2,11[:count سَنَوَات', ']10,Inf[:count سَنَة']), - 'a_year' => implode('|', ['{0}:count سَنَة', '{1}سَنَة', '{2}سَنَتَيْن', ']2,11[:count سَنَوَات', ']10,Inf[:count سَنَة']), - 'month' => implode('|', ['{0}:count شَهْرَ', '{1}شَهْرَ', '{2}شَهْرَيْن', ']2,11[:count أَشْهُر', ']10,Inf[:count شَهْرَ']), - 'a_month' => implode('|', ['{0}:count شَهْرَ', '{1}شَهْرَ', '{2}شَهْرَيْن', ']2,11[:count أَشْهُر', ']10,Inf[:count شَهْرَ']), - 'week' => implode('|', ['{0}:count أُسْبُوع', '{1}أُسْبُوع', '{2}أُسْبُوعَيْن', ']2,11[:count أَسَابِيع', ']10,Inf[:count أُسْبُوع']), - 'a_week' => implode('|', ['{0}:count أُسْبُوع', '{1}أُسْبُوع', '{2}أُسْبُوعَيْن', ']2,11[:count أَسَابِيع', ']10,Inf[:count أُسْبُوع']), - 'day' => implode('|', ['{0}:count يَوْم', '{1}يَوْم', '{2}يَوْمَيْن', ']2,11[:count أَيَّام', ']10,Inf[:count يَوْم']), - 'a_day' => implode('|', ['{0}:count يَوْم', '{1}يَوْم', '{2}يَوْمَيْن', ']2,11[:count أَيَّام', ']10,Inf[:count يَوْم']), - 'hour' => implode('|', ['{0}:count سَاعَة', '{1}سَاعَة', '{2}سَاعَتَيْن', ']2,11[:count سَاعَات', ']10,Inf[:count سَاعَة']), - 'a_hour' => implode('|', ['{0}:count سَاعَة', '{1}سَاعَة', '{2}سَاعَتَيْن', ']2,11[:count سَاعَات', ']10,Inf[:count سَاعَة']), - 'minute' => implode('|', ['{0}:count دَقِيقَة', '{1}دَقِيقَة', '{2}دَقِيقَتَيْن', ']2,11[:count دَقَائِق', ']10,Inf[:count دَقِيقَة']), - 'a_minute' => implode('|', ['{0}:count دَقِيقَة', '{1}دَقِيقَة', '{2}دَقِيقَتَيْن', ']2,11[:count دَقَائِق', ']10,Inf[:count دَقِيقَة']), - 'second' => implode('|', ['{0}:count ثَانِيَة', '{1}ثَانِيَة', '{2}ثَانِيَتَيْن', ']2,11[:count ثَوَان', ']10,Inf[:count ثَانِيَة']), - 'a_second' => implode('|', ['{0}:count ثَانِيَة', '{1}ثَانِيَة', '{2}ثَانِيَتَيْن', ']2,11[:count ثَوَان', ']10,Inf[:count ثَانِيَة']), - 'ago' => 'مُنْذُ :time', - 'from_now' => 'مِنَ الْآن :time', - 'after' => 'بَعْدَ :time', - 'before' => 'قَبْلَ :time', - - // @TODO add shakl to translations below - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم عند الساعة] LT', - 'nextDay' => '[غدًا عند الساعة] LT', - 'nextWeek' => 'dddd [عند الساعة] LT', - 'lastDay' => '[أمس عند الساعة] LT', - 'lastWeek' => 'dddd [عند الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_TD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_TD.php deleted file mode 100644 index e790b99..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_TD.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ar.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_TN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_TN.php deleted file mode 100644 index f096678..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_TN.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - JD Isaacks - * - Atef Ben Ali (atefBB) - * - Mohamed Sabil (mohamedsabil83) - */ -$months = [ - 'جانفي', - 'فيفري', - 'مارس', - 'أفريل', - 'ماي', - 'جوان', - 'جويلية', - 'أوت', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر', -]; - -return [ - 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), - 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), - 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), - 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), - 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), - 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), - 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), - 'ago' => 'منذ :time', - 'from_now' => 'في :time', - 'after' => 'بعد :time', - 'before' => 'قبل :time', - 'diff_now' => 'الآن', - 'diff_today' => 'اليوم', - 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_yesterday' => 'أمس', - 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_tomorrow' => 'غداً', - 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', - 'diff_before_yesterday' => 'قبل الأمس', - 'diff_after_tomorrow' => 'بعد غد', - 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), - 'period_interval' => 'كل :interval', - 'period_start_date' => 'من :date', - 'period_end_date' => 'إلى :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اليوم على الساعة] LT', - 'nextDay' => '[غدا على الساعة] LT', - 'nextWeek' => 'dddd [على الساعة] LT', - 'lastDay' => '[أمس على الساعة] LT', - 'lastWeek' => 'dddd [على الساعة] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ص', 'م'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_YE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ar_YE.php deleted file mode 100644 index 169fe88..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ar_YE.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - * - Abdullah-Alhariri - */ -return array_replace_recursive(require __DIR__.'/ar.php', [ - 'formats' => [ - 'L' => 'DD MMM, YYYY', - ], - 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], - 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], - 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], - 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰٤', '۰٥', '۰٦', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱٤', '۱٥', '۱٦', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲٤', '۲٥', '۲٦', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳٤', '۳٥', '۳٦', '۳۷', '۳۸', '۳۹', '٤۰', '٤۱', '٤۲', '٤۳', '٤٤', '٤٥', '٤٦', '٤۷', '٤۸', '٤۹', '٥۰', '٥۱', '٥۲', '٥۳', '٥٤', '٥٥', '٥٦', '٥۷', '٥۸', '٥۹', '٦۰', '٦۱', '٦۲', '٦۳', '٦٤', '٦٥', '٦٦', '٦۷', '٦۸', '٦۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷٤', '۷٥', '۷٦', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸٤', '۸٥', '۸٦', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹٤', '۹٥', '۹٦', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/as.php b/dependencies/nesbot/carbon/src/Carbon/Lang/as.php deleted file mode 100644 index 04bc3df..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/as.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/as_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/as_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/as_IN.php deleted file mode 100644 index 5fbc3db..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/as_IN.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Amitakhya Phukan, Red Hat bug-glibc@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D-MM-YYYY', - ], - 'months' => ['জানুৱাৰী', 'ফেব্ৰুৱাৰী', 'মাৰ্চ', 'এপ্ৰিল', 'মে', 'জুন', 'জুলাই', 'আগষ্ট', 'ছেপ্তেম্বৰ', 'অক্টোবৰ', 'নৱেম্বৰ', 'ডিচেম্বৰ'], - 'months_short' => ['জানু', 'ফেব্ৰু', 'মাৰ্চ', 'এপ্ৰিল', 'মে', 'জুন', 'জুলাই', 'আগ', 'সেপ্ট', 'অক্টো', 'নভে', 'ডিসে'], - 'weekdays' => ['দেওবাৰ', 'সোমবাৰ', 'মঙ্গলবাৰ', 'বুধবাৰ', 'বৃহষ্পতিবাৰ', 'শুক্ৰবাৰ', 'শনিবাৰ'], - 'weekdays_short' => ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহষ্পতি', 'শুক্ৰ', 'শনি'], - 'weekdays_min' => ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহষ্পতি', 'শুক্ৰ', 'শনি'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['পূৰ্ব্বাহ্ন', 'অপৰাহ্ন'], - - 'year' => ':count বছৰ', - 'y' => ':count বছৰ', - 'a_year' => ':count বছৰ', - - 'month' => ':count মাহ', - 'm' => ':count মাহ', - 'a_month' => ':count মাহ', - - 'week' => ':count সপ্তাহ', - 'w' => ':count সপ্তাহ', - 'a_week' => ':count সপ্তাহ', - - 'day' => ':count বাৰ', - 'd' => ':count বাৰ', - 'a_day' => ':count বাৰ', - - 'hour' => ':count ঘণ্টা', - 'h' => ':count ঘণ্টা', - 'a_hour' => ':count ঘণ্টা', - - 'minute' => ':count মিনিট', - 'min' => ':count মিনিট', - 'a_minute' => ':count মিনিট', - - 'second' => ':count দ্বিতীয়', - 's' => ':count দ্বিতীয়', - 'a_second' => ':count দ্বিতীয়', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/asa.php b/dependencies/nesbot/carbon/src/Carbon/Lang/asa.php deleted file mode 100644 index 03bb483..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/asa.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['icheheavo', 'ichamthi'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Dec'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ast.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ast.php deleted file mode 100644 index d9bdebe..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ast.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Jordi Mallach jordi@gnu.org - * - Adolfo Jayme-Barrientos (fitojb) - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['de xineru', 'de febreru', 'de marzu', 'd’abril', 'de mayu', 'de xunu', 'de xunetu', 'd’agostu', 'de setiembre', 'd’ochobre', 'de payares', 'd’avientu'], - 'months_short' => ['xin', 'feb', 'mar', 'abr', 'may', 'xun', 'xnt', 'ago', 'set', 'och', 'pay', 'avi'], - 'weekdays' => ['domingu', 'llunes', 'martes', 'miércoles', 'xueves', 'vienres', 'sábadu'], - 'weekdays_short' => ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'], - 'weekdays_min' => ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'], - - 'year' => ':count añu|:count años', - 'y' => ':count añu|:count años', - 'a_year' => 'un añu|:count años', - - 'month' => ':count mes', - 'm' => ':count mes', - 'a_month' => 'un mes|:count mes', - - 'week' => ':count selmana|:count selmanes', - 'w' => ':count selmana|:count selmanes', - 'a_week' => 'una selmana|:count selmanes', - - 'day' => ':count día|:count díes', - 'd' => ':count día|:count díes', - 'a_day' => 'un día|:count díes', - - 'hour' => ':count hora|:count hores', - 'h' => ':count hora|:count hores', - 'a_hour' => 'una hora|:count hores', - - 'minute' => ':count minutu|:count minutos', - 'min' => ':count minutu|:count minutos', - 'a_minute' => 'un minutu|:count minutos', - - 'second' => ':count segundu|:count segundos', - 's' => ':count segundu|:count segundos', - 'a_second' => 'un segundu|:count segundos', - - 'ago' => 'hai :time', - 'from_now' => 'en :time', - 'after' => ':time dempués', - 'before' => ':time enantes', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ast_ES.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ast_ES.php deleted file mode 100644 index 04d7562..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ast_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ast.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ayc.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ayc.php deleted file mode 100644 index d6a6f63..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ayc.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ayc_PE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ayc_PE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ayc_PE.php deleted file mode 100644 index ff18504..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ayc_PE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - runasimipi.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['inïru', 'phiwriru', 'marsu', 'awrila', 'mayu', 'junyu', 'julyu', 'awustu', 'sitimri', 'uktuwri', 'nuwimri', 'risimri'], - 'months_short' => ['ini', 'phi', 'mar', 'awr', 'may', 'jun', 'jul', 'awu', 'sit', 'ukt', 'nuw', 'ris'], - 'weekdays' => ['tuminku', 'lunisa', 'martisa', 'mirkulisa', 'juywisa', 'wirnisa', 'sawäru'], - 'weekdays_short' => ['tum', 'lun', 'mar', 'mir', 'juy', 'wir', 'saw'], - 'weekdays_min' => ['tum', 'lun', 'mar', 'mir', 'juy', 'wir', 'saw'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['VM', 'NM'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/az.php b/dependencies/nesbot/carbon/src/Carbon/Lang/az.php deleted file mode 100644 index 1e92106..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/az.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Kunal Marwaha - * - François B - * - JD Isaacks - * - Orxan - * - Şəhriyar İmanov - * - Baran Şengül - */ -return [ - 'year' => ':count il', - 'a_year' => '{1}bir il|]1,Inf[:count il', - 'y' => ':count il', - 'month' => ':count ay', - 'a_month' => '{1}bir ay|]1,Inf[:count ay', - 'm' => ':count ay', - 'week' => ':count həftə', - 'a_week' => '{1}bir həftə|]1,Inf[:count həftə', - 'w' => ':count h.', - 'day' => ':count gün', - 'a_day' => '{1}bir gün|]1,Inf[:count gün', - 'd' => ':count g.', - 'hour' => ':count saat', - 'a_hour' => '{1}bir saat|]1,Inf[:count saat', - 'h' => ':count saat', - 'minute' => ':count d.', - 'a_minute' => '{1}bir dəqiqə|]1,Inf[:count dəqiqə', - 'min' => ':count dəqiqə', - 'second' => ':count san.', - 'a_second' => '{1}birneçə saniyə|]1,Inf[:count saniyə', - 's' => ':count saniyə', - 'ago' => ':time əvvəl', - 'from_now' => ':time sonra', - 'after' => ':time sonra', - 'before' => ':time əvvəl', - 'diff_now' => 'indi', - 'diff_today' => 'bugün', - 'diff_today_regexp' => 'bugün(?:\\s+saat)?', - 'diff_yesterday' => 'dünən', - 'diff_tomorrow' => 'sabah', - 'diff_tomorrow_regexp' => 'sabah(?:\\s+saat)?', - 'diff_before_yesterday' => 'srağagün', - 'diff_after_tomorrow' => 'birisi gün', - 'period_recurrences' => ':count dəfədən bir', - 'period_interval' => 'hər :interval', - 'period_start_date' => ':date tarixindən başlayaraq', - 'period_end_date' => ':date tarixinədək', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[bugün saat] LT', - 'nextDay' => '[sabah saat] LT', - 'nextWeek' => '[gələn həftə] dddd [saat] LT', - 'lastDay' => '[dünən] LT', - 'lastWeek' => '[keçən həftə] dddd [saat] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - if ($number === 0) { // special case for zero - return "$number-ıncı"; - } - - static $suffixes = [ - 1 => '-inci', - 5 => '-inci', - 8 => '-inci', - 70 => '-inci', - 80 => '-inci', - 2 => '-nci', - 7 => '-nci', - 20 => '-nci', - 50 => '-nci', - 3 => '-üncü', - 4 => '-üncü', - 100 => '-üncü', - 6 => '-ncı', - 9 => '-uncu', - 10 => '-uncu', - 30 => '-uncu', - 60 => '-ıncı', - 90 => '-ıncı', - ]; - - $lastDigit = $number % 10; - - return $number.($suffixes[$lastDigit] ?? $suffixes[$number % 100 - $lastDigit] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'gecə'; - } - if ($hour < 12) { - return 'səhər'; - } - if ($hour < 17) { - return 'gündüz'; - } - - return 'axşam'; - }, - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'], - 'months_standalone' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], - 'weekdays' => ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], - 'weekdays_short' => ['baz', 'bze', 'çax', 'çər', 'cax', 'cüm', 'şən'], - 'weekdays_min' => ['bz', 'be', 'ça', 'çə', 'ca', 'cü', 'şə'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' və '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/az_AZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/az_AZ.php deleted file mode 100644 index 2acf881..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/az_AZ.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/az.php', [ - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['bazar günü', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], - 'weekdays_short' => ['baz', 'ber', 'çax', 'çər', 'cax', 'cüm', 'şnb'], - 'weekdays_min' => ['baz', 'ber', 'çax', 'çər', 'cax', 'cüm', 'şnb'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php deleted file mode 100644 index 28fc62f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/az.php', [ - 'weekdays' => ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'], - 'weekdays_short' => ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'], - 'weekdays_min' => ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'], - 'months' => ['јанвар', 'феврал', 'март', 'апрел', 'май', 'ијун', 'ијул', 'август', 'сентјабр', 'октјабр', 'нојабр', 'декабр'], - 'months_short' => ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'], - 'months_standalone' => ['Јанвар', 'Феврал', 'Март', 'Апрел', 'Май', 'Ијун', 'Ијул', 'Август', 'Сентјабр', 'Октјабр', 'Нојабр', 'Декабр'], - 'meridiem' => ['а', 'п'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/az_IR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/az_IR.php deleted file mode 100644 index 991a0ef..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/az_IR.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Mousa Moradi mousamk@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'OY/OM/OD', - ], - 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مئی', 'ژوئن', 'جولای', 'آقۇست', 'سپتامبر', 'اوْکتوْبر', 'نوْوامبر', 'دسامبر'], - 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مئی', 'ژوئن', 'جولای', 'آقۇست', 'سپتامبر', 'اوْکتوْبر', 'نوْوامبر', 'دسامبر'], - 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], - 'weekdays_short' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], - 'weekdays_min' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], - 'first_day_of_week' => 6, - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰۴', '۰۵', '۰۶', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱۴', '۱۵', '۱۶', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲۴', '۲۵', '۲۶', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳۴', '۳۵', '۳۶', '۳۷', '۳۸', '۳۹', '۴۰', '۴۱', '۴۲', '۴۳', '۴۴', '۴۵', '۴۶', '۴۷', '۴۸', '۴۹', '۵۰', '۵۱', '۵۲', '۵۳', '۵۴', '۵۵', '۵۶', '۵۷', '۵۸', '۵۹', '۶۰', '۶۱', '۶۲', '۶۳', '۶۴', '۶۵', '۶۶', '۶۷', '۶۸', '۶۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷۴', '۷۵', '۷۶', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸۴', '۸۵', '۸۶', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹۴', '۹۵', '۹۶', '۹۷', '۹۸', '۹۹'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/az_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/az_Latn.php deleted file mode 100644 index 0be3391..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/az_Latn.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/az.php', [ - 'meridiem' => ['a', 'p'], - 'weekdays' => ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], - 'weekdays_short' => ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'], - 'weekdays_min' => ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'], - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'], - 'months_standalone' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'D MMMM YYYY, dddd HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bas.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bas.php deleted file mode 100644 index 41bfa1d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bas.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['I bikɛ̂glà', 'I ɓugajɔp'], - 'weekdays' => ['ŋgwà nɔ̂y', 'ŋgwà njaŋgumba', 'ŋgwà ûm', 'ŋgwà ŋgê', 'ŋgwà mbɔk', 'ŋgwà kɔɔ', 'ŋgwà jôn'], - 'weekdays_short' => ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'], - 'weekdays_min' => ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'], - 'months' => ['Kɔndɔŋ', 'Màcɛ̂l', 'Màtùmb', 'Màtop', 'M̀puyɛ', 'Hìlòndɛ̀', 'Njèbà', 'Hìkaŋ', 'Dìpɔ̀s', 'Bìòôm', 'Màyɛsèp', 'Lìbuy li ńyèe'], - 'months_short' => ['kɔn', 'mac', 'mat', 'mto', 'mpu', 'hil', 'nje', 'hik', 'dip', 'bio', 'may', 'liɓ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'second' => ':count móndî', // less reliable - 's' => ':count móndî', // less reliable - 'a_second' => ':count móndî', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/be.php b/dependencies/nesbot/carbon/src/Carbon/Lang/be.php deleted file mode 100644 index ee73636..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/be.php +++ /dev/null @@ -1,172 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonInterface; -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); - }, 'be'); -} -// @codeCoverageIgnoreEnd - -/* - * Authors: - * - Josh Soref - * - SobakaSlava - * - François B - * - Serhan Apaydın - * - JD Isaacks - * - AbadonnaAbbys - * - Siomkin Alexander - */ -return [ - 'year' => ':count год|:count гады|:count гадоў', - 'a_year' => '{1}год|:count год|:count гады|:count гадоў', - 'y' => ':count год|:count гады|:count гадоў', - 'month' => ':count месяц|:count месяцы|:count месяцаў', - 'a_month' => '{1}месяц|:count месяц|:count месяцы|:count месяцаў', - 'm' => ':count месяц|:count месяцы|:count месяцаў', - 'week' => ':count тыдзень|:count тыдні|:count тыдняў', - 'a_week' => '{1}тыдзень|:count тыдзень|:count тыдні|:count тыдняў', - 'w' => ':count тыдзень|:count тыдні|:count тыдняў', - 'day' => ':count дзень|:count дні|:count дзён', - 'a_day' => '{1}дзень|:count дзень|:count дні|:count дзён', - 'd' => ':count дн', - 'hour' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour' => '{1}гадзіна|:count гадзіна|:count гадзіны|:count гадзін', - 'h' => ':count гадзіна|:count гадзіны|:count гадзін', - 'minute' => ':count хвіліна|:count хвіліны|:count хвілін', - 'a_minute' => '{1}хвіліна|:count хвіліна|:count хвіліны|:count хвілін', - 'min' => ':count хв', - 'second' => ':count секунда|:count секунды|:count секунд', - 'a_second' => '{1}некалькі секунд|:count секунда|:count секунды|:count секунд', - 's' => ':count сек', - - 'hour_ago' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_ago' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_ago' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_ago' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_ago' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_ago' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_ago' => ':count секунду|:count секунды|:count секунд', - 'a_second_ago' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_ago' => ':count секунду|:count секунды|:count секунд', - - 'hour_from_now' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_from_now' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_from_now' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_from_now' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_from_now' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_from_now' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_from_now' => ':count секунду|:count секунды|:count секунд', - 'a_second_from_now' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_from_now' => ':count секунду|:count секунды|:count секунд', - - 'hour_after' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_after' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_after' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_after' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_after' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_after' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_after' => ':count секунду|:count секунды|:count секунд', - 'a_second_after' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_after' => ':count секунду|:count секунды|:count секунд', - - 'hour_before' => ':count гадзіну|:count гадзіны|:count гадзін', - 'a_hour_before' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', - 'h_before' => ':count гадзіну|:count гадзіны|:count гадзін', - 'minute_before' => ':count хвіліну|:count хвіліны|:count хвілін', - 'a_minute_before' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', - 'min_before' => ':count хвіліну|:count хвіліны|:count хвілін', - 'second_before' => ':count секунду|:count секунды|:count секунд', - 'a_second_before' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', - 's_before' => ':count секунду|:count секунды|:count секунд', - - 'ago' => ':time таму', - 'from_now' => 'праз :time', - 'after' => ':time пасля', - 'before' => ':time да', - 'diff_now' => 'цяпер', - 'diff_today' => 'Сёння', - 'diff_today_regexp' => 'Сёння(?:\\s+ў)?', - 'diff_yesterday' => 'учора', - 'diff_yesterday_regexp' => 'Учора(?:\\s+ў)?', - 'diff_tomorrow' => 'заўтра', - 'diff_tomorrow_regexp' => 'Заўтра(?:\\s+ў)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY г.', - 'LLL' => 'D MMMM YYYY г., HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY г., HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Сёння ў] LT', - 'nextDay' => '[Заўтра ў] LT', - 'nextWeek' => '[У] dddd [ў] LT', - 'lastDay' => '[Учора ў] LT', - 'lastWeek' => function (CarbonInterface $current) { - switch ($current->dayOfWeek) { - case 1: - case 2: - case 4: - return '[У мінулы] dddd [ў] LT'; - default: - return '[У мінулую] dddd [ў] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return ($number % 10 === 2 || $number % 10 === 3) && ($number % 100 !== 12 && $number % 100 !== 13) ? $number.'-і' : $number.'-ы'; - case 'D': - return $number.'-га'; - default: - return $number; - } - }, - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'ночы'; - } - if ($hour < 12) { - return 'раніцы'; - } - if ($hour < 17) { - return 'дня'; - } - - return 'вечара'; - }, - 'months' => ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'траўня', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'], - 'months_standalone' => ['студзень', 'люты', 'сакавік', 'красавік', 'травень', 'чэрвень', 'ліпень', 'жнівень', 'верасень', 'кастрычнік', 'лістапад', 'снежань'], - 'months_short' => ['студ', 'лют', 'сак', 'крас', 'трав', 'чэрв', 'ліп', 'жнів', 'вер', 'каст', 'ліст', 'снеж'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['нядзелю', 'панядзелак', 'аўторак', 'сераду', 'чацвер', 'пятніцу', 'суботу'], - 'weekdays_standalone' => ['нядзеля', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота'], - 'weekdays_short' => ['нд', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб'], - 'weekdays_min' => ['нд', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб'], - 'weekdays_regexp' => '/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' і '], - 'months_short_standalone' => ['сту', 'лют', 'сак', 'кра', 'май', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/be_BY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/be_BY.php deleted file mode 100644 index 26684b4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/be_BY.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/be.php', [ - 'months' => ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'мая', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'], - 'months_short' => ['сту', 'лют', 'сак', 'кра', 'мая', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'], - 'weekdays' => ['Нядзеля', 'Панядзелак', 'Аўторак', 'Серада', 'Чацвер', 'Пятніца', 'Субота'], - 'weekdays_short' => ['Няд', 'Пан', 'Аўт', 'Срд', 'Чцв', 'Пят', 'Суб'], - 'weekdays_min' => ['Няд', 'Пан', 'Аўт', 'Срд', 'Чцв', 'Пят', 'Суб'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php b/dependencies/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php deleted file mode 100644 index 517ce83..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['studzienia', 'lutaha', 'sakavika', 'krasavika', 'maja', 'červienia', 'lipienia', 'žniŭnia', 'vieraśnia', 'kastryčnika', 'listapada', 'śniežnia'], - 'months_short' => ['Stu', 'Lut', 'Sak', 'Kra', 'Maj', 'Čer', 'Lip', 'Žni', 'Vie', 'Kas', 'Lis', 'Śni'], - 'weekdays' => ['Niadziela', 'Paniadziełak', 'Aŭtorak', 'Sierada', 'Čaćvier', 'Piatnica', 'Subota'], - 'weekdays_short' => ['Nia', 'Pan', 'Aŭt', 'Sie', 'Čać', 'Pia', 'Sub'], - 'weekdays_min' => ['Nia', 'Pan', 'Aŭt', 'Sie', 'Čać', 'Pia', 'Sub'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bem.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bem.php deleted file mode 100644 index 1c3ef03..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bem.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bem_ZM.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bem_ZM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bem_ZM.php deleted file mode 100644 index 620b579..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bem_ZM.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ANLoc Martin Benjamin locales@africanlocalization.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YYYY', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Epreo', 'Mei', 'Juni', 'Julai', 'Ogasti', 'Septemba', 'Oktoba', 'Novemba', 'Disemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Epr', 'Mei', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Dis'], - 'weekdays' => ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'], - 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'weekdays_min' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['uluchelo', 'akasuba'], - - 'year' => 'myaka :count', - 'y' => 'myaka :count', - 'a_year' => 'myaka :count', - - 'month' => 'myeshi :count', - 'm' => 'myeshi :count', - 'a_month' => 'myeshi :count', - - 'week' => 'umulungu :count', - 'w' => 'umulungu :count', - 'a_week' => 'umulungu :count', - - 'day' => 'inshiku :count', - 'd' => 'inshiku :count', - 'a_day' => 'inshiku :count', - - 'hour' => 'awala :count', - 'h' => 'awala :count', - 'a_hour' => 'awala :count', - - 'minute' => 'miniti :count', - 'min' => 'miniti :count', - 'a_minute' => 'miniti :count', - - 'second' => 'sekondi :count', - 's' => 'sekondi :count', - 'a_second' => 'sekondi :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ber.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ber.php deleted file mode 100644 index 685603c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ber.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ber_DZ.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ber_DZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ber_DZ.php deleted file mode 100644 index 38de10a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ber_DZ.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['bazar günü', 'birinci gün', 'ikinci gün', 'üçüncü gün', 'dördüncü gün', 'beşinci gün', 'altıncı gün'], - 'weekdays_short' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'weekdays_min' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ber_MA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ber_MA.php deleted file mode 100644 index 38de10a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ber_MA.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['bazar günü', 'birinci gün', 'ikinci gün', 'üçüncü gün', 'dördüncü gün', 'beşinci gün', 'altıncı gün'], - 'weekdays_short' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'weekdays_min' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bez.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bez.php deleted file mode 100644 index d59c5ef..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bez.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['pamilau', 'pamunyi'], - 'weekdays' => ['pa mulungu', 'pa shahuviluha', 'pa hivili', 'pa hidatu', 'pa hitayi', 'pa hihanu', 'pa shahulembela'], - 'weekdays_short' => ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'], - 'weekdays_min' => ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'], - 'months' => ['pa mwedzi gwa hutala', 'pa mwedzi gwa wuvili', 'pa mwedzi gwa wudatu', 'pa mwedzi gwa wutai', 'pa mwedzi gwa wuhanu', 'pa mwedzi gwa sita', 'pa mwedzi gwa saba', 'pa mwedzi gwa nane', 'pa mwedzi gwa tisa', 'pa mwedzi gwa kumi', 'pa mwedzi gwa kumi na moja', 'pa mwedzi gwa kumi na mbili'], - 'months_short' => ['Hut', 'Vil', 'Dat', 'Tai', 'Han', 'Sit', 'Sab', 'Nan', 'Tis', 'Kum', 'Kmj', 'Kmb'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bg.php deleted file mode 100644 index f768074..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bg.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Serhan Apaydın - * - JD Isaacks - * - Glavić - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count година|:count години', - 'a_year' => 'година|:count години', - 'y' => ':count година|:count години', - 'month' => ':count месец|:count месеца', - 'a_month' => 'месец|:count месеца', - 'm' => ':count месец|:count месеца', - 'week' => ':count седмица|:count седмици', - 'a_week' => 'седмица|:count седмици', - 'w' => ':count седмица|:count седмици', - 'day' => ':count ден|:count дни', - 'a_day' => 'ден|:count дни', - 'd' => ':count ден|:count дни', - 'hour' => ':count час|:count часа', - 'a_hour' => 'час|:count часа', - 'h' => ':count час|:count часа', - 'minute' => ':count минута|:count минути', - 'a_minute' => 'минута|:count минути', - 'min' => ':count минута|:count минути', - 'second' => ':count секунда|:count секунди', - 'a_second' => 'няколко секунди|:count секунди', - 's' => ':count секунда|:count секунди', - 'ago' => 'преди :time', - 'from_now' => 'след :time', - 'after' => 'след :time', - 'before' => 'преди :time', - 'diff_now' => 'сега', - 'diff_today' => 'Днес', - 'diff_today_regexp' => 'Днес(?:\\s+в)?', - 'diff_yesterday' => 'вчера', - 'diff_yesterday_regexp' => 'Вчера(?:\\s+в)?', - 'diff_tomorrow' => 'утре', - 'diff_tomorrow_regexp' => 'Утре(?:\\s+в)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY H:mm', - 'LLLL' => 'dddd, D MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Днес в] LT', - 'nextDay' => '[Утре в] LT', - 'nextWeek' => 'dddd [в] LT', - 'lastDay' => '[Вчера в] LT', - 'lastWeek' => function (CarbonInterface $current) { - switch ($current->dayOfWeek) { - case 0: - case 3: - case 6: - return '[В изминалата] dddd [в] LT'; - default: - return '[В изминалия] dddd [в] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - $lastDigit = $number % 10; - $last2Digits = $number % 100; - if ($number === 0) { - return "$number-ев"; - } - if ($last2Digits === 0) { - return "$number-ен"; - } - if ($last2Digits > 10 && $last2Digits < 20) { - return "$number-ти"; - } - if ($lastDigit === 1) { - return "$number-ви"; - } - if ($lastDigit === 2) { - return "$number-ри"; - } - if ($lastDigit === 7 || $lastDigit === 8) { - return "$number-ми"; - } - - return "$number-ти"; - }, - 'months' => ['януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври', 'ноември', 'декември'], - 'months_short' => ['яну', 'фев', 'мар', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек'], - 'weekdays' => ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'], - 'weekdays_short' => ['нед', 'пон', 'вто', 'сря', 'чет', 'пет', 'съб'], - 'weekdays_min' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['преди обяд', 'следобед'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bg_BG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bg_BG.php deleted file mode 100644 index b53874d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bg_BG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/bg.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bhb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bhb.php deleted file mode 100644 index 49f0803..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bhb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bhb_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bhb_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bhb_IN.php deleted file mode 100644 index ab557cb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bhb_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. alexey.merzlyakov@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'weekdays_min' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bho.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bho.php deleted file mode 100644 index e9ed0b6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bho.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bho_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bho_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bho_IN.php deleted file mode 100644 index bc54f36..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bho_IN.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bhashaghar@googlegroups.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर"'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर"'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'hour' => ':count मौसम', - 'h' => ':count मौसम', - 'a_hour' => ':count मौसम', - - 'minute' => ':count कला', - 'min' => ':count कला', - 'a_minute' => ':count कला', - - 'second' => ':count सोमार', - 's' => ':count सोमार', - 'a_second' => ':count सोमार', - - 'year' => ':count साल', - 'y' => ':count साल', - 'a_year' => ':count साल', - - 'month' => ':count महिना', - 'm' => ':count महिना', - 'a_month' => ':count महिना', - - 'week' => ':count सप्ताह', - 'w' => ':count सप्ताह', - 'a_week' => ':count सप्ताह', - - 'day' => ':count दिन', - 'd' => ':count दिन', - 'a_day' => ':count दिन', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bi.php deleted file mode 100644 index dd08128..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/bi_VU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bi_VU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bi_VU.php deleted file mode 100644 index 1fe7770..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bi_VU.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com & maninder1.s@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['jenuware', 'febwari', 'maj', 'epril', 'mei', 'jun', 'julae', 'ogis', 'septemba', 'oktoba', 'novemba', 'disemba'], - 'months_short' => ['jen', 'feb', 'maj', 'epr', 'mei', 'jun', 'jul', 'ogi', 'sep', 'okt', 'nov', 'dis'], - 'weekdays' => ['sande', 'mande', 'maj', 'wota', 'fraede', 'sarede'], - 'weekdays_short' => ['san', 'man', 'maj', 'wot', 'fra', 'sar'], - 'weekdays_min' => ['san', 'man', 'maj', 'wot', 'fra', 'sar'], - - 'year' => ':count seven', // less reliable - 'y' => ':count seven', // less reliable - 'a_year' => ':count seven', // less reliable - - 'month' => ':count mi', // less reliable - 'm' => ':count mi', // less reliable - 'a_month' => ':count mi', // less reliable - - 'week' => ':count sarede', // less reliable - 'w' => ':count sarede', // less reliable - 'a_week' => ':count sarede', // less reliable - - 'day' => ':count betde', // less reliable - 'd' => ':count betde', // less reliable - 'a_day' => ':count betde', // less reliable - - 'hour' => ':count klok', // less reliable - 'h' => ':count klok', // less reliable - 'a_hour' => ':count klok', // less reliable - - 'minute' => ':count smol', // less reliable - 'min' => ':count smol', // less reliable - 'a_minute' => ':count smol', // less reliable - - 'second' => ':count tu', // less reliable - 's' => ':count tu', // less reliable - 'a_second' => ':count tu', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bm.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bm.php deleted file mode 100644 index 92822d2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bm.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Estelle Comment - */ -return [ - 'year' => 'san :count', - 'a_year' => '{1}san kelen|san :count', - 'y' => 'san :count', - 'month' => 'kalo :count', - 'a_month' => '{1}kalo kelen|kalo :count', - 'm' => 'k. :count', - 'week' => 'dɔgɔkun :count', - 'a_week' => 'dɔgɔkun kelen', - 'w' => 'd. :count', - 'day' => 'tile :count', - 'd' => 't. :count', - 'a_day' => '{1}tile kelen|tile :count', - 'hour' => 'lɛrɛ :count', - 'a_hour' => '{1}lɛrɛ kelen|lɛrɛ :count', - 'h' => 'l. :count', - 'minute' => 'miniti :count', - 'a_minute' => '{1}miniti kelen|miniti :count', - 'min' => 'm. :count', - 'second' => 'sekondi :count', - 'a_second' => '{1}sanga dama dama|sekondi :count', - 's' => 'sek. :count', - 'ago' => 'a bɛ :time bɔ', - 'from_now' => ':time kɔnɔ', - 'diff_today' => 'Bi', - 'diff_yesterday' => 'Kunu', - 'diff_yesterday_regexp' => 'Kunu(?:\\s+lɛrɛ)?', - 'diff_tomorrow' => 'Sini', - 'diff_tomorrow_regexp' => 'Sini(?:\\s+lɛrɛ)?', - 'diff_today_regexp' => 'Bi(?:\\s+lɛrɛ)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'MMMM [tile] D [san] YYYY', - 'LLL' => 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - 'LLLL' => 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Bi lɛrɛ] LT', - 'nextDay' => '[Sini lɛrɛ] LT', - 'nextWeek' => 'dddd [don lɛrɛ] LT', - 'lastDay' => '[Kunu lɛrɛ] LT', - 'lastWeek' => 'dddd [tɛmɛnen lɛrɛ] LT', - 'sameElse' => 'L', - ], - 'months' => ['Zanwuyekalo', 'Fewuruyekalo', 'Marisikalo', 'Awirilikalo', 'Mɛkalo', 'Zuwɛnkalo', 'Zuluyekalo', 'Utikalo', 'Sɛtanburukalo', 'ɔkutɔburukalo', 'Nowanburukalo', 'Desanburukalo'], - 'months_short' => ['Zan', 'Few', 'Mar', 'Awi', 'Mɛ', 'Zuw', 'Zul', 'Uti', 'Sɛt', 'ɔku', 'Now', 'Des'], - 'weekdays' => ['Kari', 'Ntɛnɛn', 'Tarata', 'Araba', 'Alamisa', 'Juma', 'Sibiri'], - 'weekdays_short' => ['Kar', 'Ntɛ', 'Tar', 'Ara', 'Ala', 'Jum', 'Sib'], - 'weekdays_min' => ['Ka', 'Nt', 'Ta', 'Ar', 'Al', 'Ju', 'Si'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ni '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bn.php deleted file mode 100644 index 8e14789..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bn.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Shakib Hossain - * - Raju - * - Aniruddha Adhikary - * - JD Isaacks - * - Saiful Islam - * - Faisal Islam - */ -return [ - 'year' => ':count বছর', - 'a_year' => 'এক বছর|:count বছর', - 'y' => '১ বছর|:count বছর', - 'month' => ':count মাস', - 'a_month' => 'এক মাস|:count মাস', - 'm' => '১ মাস|:count মাস', - 'week' => ':count সপ্তাহ', - 'a_week' => '১ সপ্তাহ|:count সপ্তাহ', - 'w' => '১ সপ্তাহ|:count সপ্তাহ', - 'day' => ':count দিন', - 'a_day' => 'এক দিন|:count দিন', - 'd' => '১ দিন|:count দিন', - 'hour' => ':count ঘন্টা', - 'a_hour' => 'এক ঘন্টা|:count ঘন্টা', - 'h' => '১ ঘন্টা|:count ঘন্টা', - 'minute' => ':count মিনিট', - 'a_minute' => 'এক মিনিট|:count মিনিট', - 'min' => '১ মিনিট|:count মিনিট', - 'second' => ':count সেকেন্ড', - 'a_second' => 'কয়েক সেকেন্ড|:count সেকেন্ড', - 's' => '১ সেকেন্ড|:count সেকেন্ড', - 'ago' => ':time আগে', - 'from_now' => ':time পরে', - 'after' => ':time পরে', - 'before' => ':time আগে', - 'diff_now' => 'এখন', - 'diff_today' => 'আজ', - 'diff_yesterday' => 'গতকাল', - 'diff_tomorrow' => 'আগামীকাল', - 'period_recurrences' => ':count বার|:count বার', - 'period_interval' => 'প্রতি :interval', - 'period_start_date' => ':date থেকে', - 'period_end_date' => ':date পর্যন্ত', - 'formats' => [ - 'LT' => 'A Oh:Om সময়', - 'LTS' => 'A Oh:Om:Os সময়', - 'L' => 'OD/OM/OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY, A Oh:Om সময়', - 'LLLL' => 'dddd, OD MMMM OY, A Oh:Om সময়', - ], - 'calendar' => [ - 'sameDay' => '[আজ] LT', - 'nextDay' => '[আগামীকাল] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[গতকাল] LT', - 'lastWeek' => '[গত] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'রাত'; - } - if ($hour < 10) { - return 'সকাল'; - } - if ($hour < 17) { - return 'দুপুর'; - } - if ($hour < 20) { - return 'বিকাল'; - } - - return 'রাত'; - }, - 'months' => ['জানুয়ারী', 'ফেব্রুয়ারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্র', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ্ট', 'অক্টো', 'নভে', 'ডিসে'], - 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], - 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গ', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], - 'list' => [', ', ' এবং '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekdays_standalone' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহষ্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_min_standalone' => ['রঃ', 'সোঃ', 'মঃ', 'বুঃ', 'বৃঃ', 'শুঃ', 'শনি'], - 'months_short_standalone' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'alt_numbers' => ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bn_BD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bn_BD.php deleted file mode 100644 index b5b28dd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bn_BD.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ankur Group, Taneem Ahmed, Jamil Ahmed - */ -return array_replace_recursive(require __DIR__.'/bn.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], - 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], - 'first_day_of_week' => 5, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bn_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bn_IN.php deleted file mode 100644 index 8b3a50e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bn_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/bn.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], - 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], - 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], - 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bo.php deleted file mode 100644 index 99e1bf4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bo.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => '{1}ལོ་གཅིག|]1,Inf[:count ལོ', - 'month' => '{1}ཟླ་བ་གཅིག|]1,Inf[:count ཟླ་བ', - 'week' => ':count བདུན་ཕྲག', - 'day' => '{1}ཉིན་གཅིག|]1,Inf[:count ཉིན་', - 'hour' => '{1}ཆུ་ཚོད་གཅིག|]1,Inf[:count ཆུ་ཚོད', - 'minute' => '{1}སྐར་མ་གཅིག|]1,Inf[:count སྐར་མ', - 'second' => '{1}ལམ་སང|]1,Inf[:count སྐར་ཆ།', - 'ago' => ':time སྔན་ལ', - 'from_now' => ':time ལ་', - 'diff_yesterday' => 'ཁ་སང', - 'diff_today' => 'དི་རིང', - 'diff_tomorrow' => 'སང་ཉིན', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', - ], - 'calendar' => [ - 'sameDay' => '[དི་རིང] LT', - 'nextDay' => '[སང་ཉིན] LT', - 'nextWeek' => '[བདུན་ཕྲག་རྗེས་མ], LT', - 'lastDay' => '[ཁ་སང] LT', - 'lastWeek' => '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'མཚན་མོ'; - } - if ($hour < 10) { - return 'ཞོགས་ཀས'; - } - if ($hour < 17) { - return 'ཉིན་གུང'; - } - if ($hour < 20) { - return 'དགོང་དག'; - } - - return 'མཚན་མོ'; - }, - 'months' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], - 'months_short' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], - 'weekdays' => ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'], - 'weekdays_short' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ', 'པ་སངས་', 'སྤེན་པ་'], - 'weekdays_min' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ', 'པ་སངས་', 'སྤེན་པ་'], - 'list' => [', ', ' ཨནད་ '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'months_standalone' => ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bo_CN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bo_CN.php deleted file mode 100644 index 380abb1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bo_CN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/bo.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bo_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bo_IN.php deleted file mode 100644 index ca50d04..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bo_IN.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/bo.php', [ - 'meridiem' => ['སྔ་དྲོ་', 'ཕྱི་དྲོ་'], - 'weekdays' => ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'], - 'weekdays_short' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'], - 'weekdays_min' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'], - 'months' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], - 'months_short' => ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'], - 'months_standalone' => ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], - 'weekend' => [0, 0], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY ལོའི་MMMཚེས་D', - 'LLL' => 'སྤྱི་ལོ་YYYY MMMMའི་ཚེས་D h:mm a', - 'LLLL' => 'YYYY MMMMའི་ཚེས་D, dddd h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/br.php b/dependencies/nesbot/carbon/src/Carbon/Lang/br.php deleted file mode 100644 index 583472f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/br.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Serhan Apaydın - * - JD Isaacks - */ -return [ - 'year' => '{1}:count bloaz|{3,4,5,9}:count bloaz|[0,Inf[:count vloaz', - 'a_year' => '{1}ur bloaz|{3,4,5,9}:count bloaz|[0,Inf[:count vloaz', - 'month' => '{1}:count miz|{2}:count viz|[0,Inf[:count miz', - 'a_month' => '{1}ur miz|{2}:count viz|[0,Inf[:count miz', - 'week' => ':count sizhun', - 'a_week' => '{1}ur sizhun|:count sizhun', - 'day' => '{1}:count devezh|{2}:count zevezh|[0,Inf[:count devezh', - 'a_day' => '{1}un devezh|{2}:count zevezh|[0,Inf[:count devezh', - 'hour' => ':count eur', - 'a_hour' => '{1}un eur|:count eur', - 'minute' => '{1}:count vunutenn|{2}:count vunutenn|[0,Inf[:count munutenn', - 'a_minute' => '{1}ur vunutenn|{2}:count vunutenn|[0,Inf[:count munutenn', - 'second' => ':count eilenn', - 'a_second' => '{1}un nebeud segondennoù|[0,Inf[:count eilenn', - 'ago' => ':time \'zo', - 'from_now' => 'a-benn :time', - 'diff_now' => 'bremañ', - 'diff_today' => 'Hiziv', - 'diff_today_regexp' => 'Hiziv(?:\\s+da)?', - 'diff_yesterday' => 'decʼh', - 'diff_yesterday_regexp' => 'Dec\'h(?:\\s+da)?', - 'diff_tomorrow' => 'warcʼhoazh', - 'diff_tomorrow_regexp' => 'Warc\'hoazh(?:\\s+da)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [a viz] MMMM YYYY', - 'LLL' => 'D [a viz] MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D [a viz] MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hiziv da] LT', - 'nextDay' => '[Warc\'hoazh da] LT', - 'nextWeek' => 'dddd [da] LT', - 'lastDay' => '[Dec\'h da] LT', - 'lastWeek' => 'dddd [paset da] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - return $number.($number === 1 ? 'añ' : 'vet'); - }, - 'months' => ['Genver', 'C\'hwevrer', 'Meurzh', 'Ebrel', 'Mae', 'Mezheven', 'Gouere', 'Eost', 'Gwengolo', 'Here', 'Du', 'Kerzu'], - 'months_short' => ['Gen', 'C\'hwe', 'Meu', 'Ebr', 'Mae', 'Eve', 'Gou', 'Eos', 'Gwe', 'Her', 'Du', 'Ker'], - 'weekdays' => ['Sul', 'Lun', 'Meurzh', 'Merc\'her', 'Yaou', 'Gwener', 'Sadorn'], - 'weekdays_short' => ['Sul', 'Lun', 'Meu', 'Mer', 'Yao', 'Gwe', 'Sad'], - 'weekdays_min' => ['Su', 'Lu', 'Me', 'Mer', 'Ya', 'Gw', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' hag '], - 'meridiem' => ['A.M.', 'G.M.'], - - 'y' => ':count bl.', - 'd' => ':count d', - 'h' => ':count e', - 'min' => ':count min', - 's' => ':count s', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/br_FR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/br_FR.php deleted file mode 100644 index 7f54185..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/br_FR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/br.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/brx.php b/dependencies/nesbot/carbon/src/Carbon/Lang/brx.php deleted file mode 100644 index a0a7bf9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/brx.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/brx_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/brx_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/brx_IN.php deleted file mode 100644 index 2d80ced..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/brx_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'M/D/YY', - ], - 'months' => ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'], - 'months_short' => ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एप्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'], - 'weekdays' => ['रबिबार', 'सोबार', 'मंगलबार', 'बुदबार', 'बिसथिबार', 'सुखुरबार', 'सुनिबार'], - 'weekdays_short' => ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'], - 'weekdays_min' => ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['फुं.', 'बेलासे.'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bs.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bs.php deleted file mode 100644 index e5d6808..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bs.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bokideckonja - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count godina|:count godine|:count godina', - 'y' => ':count godina|:count godine|:count godina', - 'month' => ':count mjesec|:count mjeseca|:count mjeseci', - 'm' => ':count mjesec|:count mjeseca|:count mjeseci', - 'week' => ':count sedmice|:count sedmicu|:count sedmica', - 'w' => ':count sedmice|:count sedmicu|:count sedmica', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count dan|:count dana|:count dana', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count sat|:count sata|:count sati', - 'minute' => ':count minut|:count minuta|:count minuta', - 'min' => ':count minut|:count minuta|:count minuta', - 'second' => ':count sekund|:count sekunda|:count sekundi', - 's' => ':count sekund|:count sekunda|:count sekundi', - 'ago' => 'prije :time', - 'from_now' => 'za :time', - 'after' => 'nakon :time', - 'before' => ':time ranije', - 'diff_now' => 'sada', - 'diff_today' => 'danas', - 'diff_today_regexp' => 'danas(?:\\s+u)?', - 'diff_yesterday' => 'jučer', - 'diff_yesterday_regexp' => 'jučer(?:\\s+u)?', - 'diff_tomorrow' => 'sutra', - 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danas u] LT', - 'nextDay' => '[sutra u] LT', - 'nextWeek' => function (CarbonInterface $current) { - switch ($current->dayOfWeek) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - default: - return '[u] dddd [u] LT'; - } - }, - 'lastDay' => '[jučer u] LT', - 'lastWeek' => function (CarbonInterface $current) { - switch ($current->dayOfWeek) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - default: - return '[prošli] dddd [u] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mart', 'april', 'maj', 'juni', 'juli', 'august', 'septembar', 'oktobar', 'novembar', 'decembar'], - 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], - 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], - 'meridiem' => ['prijepodne', 'popodne'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bs_BA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bs_BA.php deleted file mode 100644 index 0a59117..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bs_BA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/bs.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php deleted file mode 100644 index e1a1744..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/bs.php', [ - 'meridiem' => ['пре подне', 'поподне'], - 'weekdays' => ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'], - 'weekdays_min' => ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'], - 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'], - 'months_short' => ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D.M.YYYY.', - 'LL' => 'DD.MM.YYYY.', - 'LLL' => 'DD. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/bs_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/bs_Latn.php deleted file mode 100644 index b4e363e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/bs_Latn.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/bs.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/byn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/byn.php deleted file mode 100644 index 7125f3d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/byn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/byn_ER.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/byn_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/byn_ER.php deleted file mode 100644 index ad67533..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/byn_ER.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ልደትሪ', 'ካብኽብቲ', 'ክብላ', 'ፋጅኺሪ', 'ክቢቅሪ', 'ምኪኤል ትጓ̅ኒሪ', 'ኰርኩ', 'ማርያም ትሪ', 'ያኸኒ መሳቅለሪ', 'መተሉ', 'ምኪኤል መሽወሪ', 'ተሕሳስሪ'], - 'months_short' => ['ልደት', 'ካብኽ', 'ክብላ', 'ፋጅኺ', 'ክቢቅ', 'ም/ት', 'ኰር', 'ማርያ', 'ያኸኒ', 'መተሉ', 'ም/ም', 'ተሕሳ'], - 'weekdays' => ['ሰንበር ቅዳዅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ ወሪ ለብዋ', 'ኣምድ', 'ኣርብ', 'ሰንበር ሽጓዅ'], - 'weekdays_short' => ['ሰ/ቅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ', 'ኣምድ', 'ኣርብ', 'ሰ/ሽ'], - 'weekdays_min' => ['ሰ/ቅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ', 'ኣምድ', 'ኣርብ', 'ሰ/ሽ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ፋዱስ ጃብ', 'ፋዱስ ደምቢ'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ca.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ca.php deleted file mode 100644 index b8b1994..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ca.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - mestremuten - * - François B - * - Marc Ordinas i Llopis - * - Pere Orga - * - JD Isaacks - * - Quentí - * - Víctor Díaz - * - Xavi - * - qcardona - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count any|:count anys', - 'a_year' => 'un any|:count anys', - 'y' => ':count any|:count anys', - 'month' => ':count mes|:count mesos', - 'a_month' => 'un mes|:count mesos', - 'm' => ':count mes|:count mesos', - 'week' => ':count setmana|:count setmanes', - 'a_week' => 'una setmana|:count setmanes', - 'w' => ':count setmana|:count setmanes', - 'day' => ':count dia|:count dies', - 'a_day' => 'un dia|:count dies', - 'd' => ':count d', - 'hour' => ':count hora|:count hores', - 'a_hour' => 'una hora|:count hores', - 'h' => ':count h', - 'minute' => ':count minut|:count minuts', - 'a_minute' => 'un minut|:count minuts', - 'min' => ':count min', - 'second' => ':count segon|:count segons', - 'a_second' => 'uns segons|:count segons', - 's' => ':count s', - 'ago' => 'fa :time', - 'from_now' => 'd\'aquí a :time', - 'after' => ':time després', - 'before' => ':time abans', - 'diff_now' => 'ara mateix', - 'diff_today' => 'avui', - 'diff_today_regexp' => 'avui(?:\\s+a)?(?:\\s+les)?', - 'diff_yesterday' => 'ahir', - 'diff_yesterday_regexp' => 'ahir(?:\\s+a)?(?:\\s+les)?', - 'diff_tomorrow' => 'demà', - 'diff_tomorrow_regexp' => 'demà(?:\\s+a)?(?:\\s+les)?', - 'diff_before_yesterday' => 'abans d\'ahir', - 'diff_after_tomorrow' => 'demà passat', - 'period_recurrences' => ':count cop|:count cops', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'fins a :date', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM [de] YYYY', - 'LLL' => 'D MMMM [de] YYYY [a les] H:mm', - 'LLLL' => 'dddd D MMMM [de] YYYY [a les] H:mm', - ], - 'calendar' => [ - 'sameDay' => function (CarbonInterface $current) { - return '[avui a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'nextDay' => function (CarbonInterface $current) { - return '[demà a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'nextWeek' => function (CarbonInterface $current) { - return 'dddd [a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'lastDay' => function (CarbonInterface $current) { - return '[ahir a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'lastWeek' => function (CarbonInterface $current) { - return '[el] dddd [passat a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - return $number.( - ($period === 'w' || $period === 'W') ? 'a' : ( - ($number === 1) ? 'r' : ( - ($number === 2) ? 'n' : ( - ($number === 3) ? 'r' : ( - ($number === 4) ? 't' : 'è' - ) - ) - ) - ) - ); - }, - 'months' => ['de gener', 'de febrer', 'de març', 'd\'abril', 'de maig', 'de juny', 'de juliol', 'd\'agost', 'de setembre', 'd\'octubre', 'de novembre', 'de desembre'], - 'months_standalone' => ['gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre'], - 'months_short' => ['de gen.', 'de febr.', 'de març', 'd\'abr.', 'de maig', 'de juny', 'de jul.', 'd\'ag.', 'de set.', 'd\'oct.', 'de nov.', 'de des.'], - 'months_short_standalone' => ['gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'], - 'months_regexp' => '/(D[oD]?[\s,]+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'], - 'weekdays_short' => ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'], - 'weekdays_min' => ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' i '], - 'meridiem' => ['a. m.', 'p. m.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_AD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ca_AD.php deleted file mode 100644 index 861acd2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_AD.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES.php deleted file mode 100644 index 5004978..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ca.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php deleted file mode 100644 index 1c16421..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'ca'); - }, 'ca_ES_Valencia'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_FR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ca_FR.php deleted file mode 100644 index 861acd2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_FR.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_IT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ca_IT.php deleted file mode 100644 index 861acd2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ca_IT.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ca.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ccp.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ccp.php deleted file mode 100644 index 99c1dca..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ccp.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['𑄢𑄧𑄝𑄨𑄝𑄢𑄴', '𑄥𑄧𑄟𑄴𑄝𑄢𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴', '𑄝𑄪𑄖𑄴𑄝𑄢𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴', '𑄥𑄧𑄚𑄨𑄝𑄢𑄴'], - 'weekdays_short' => ['𑄢𑄧𑄝𑄨', '𑄥𑄧𑄟𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴', '𑄝𑄪𑄖𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴', '𑄥𑄧𑄚𑄨'], - 'weekdays_min' => ['𑄢𑄧𑄝𑄨', '𑄥𑄧𑄟𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴', '𑄝𑄪𑄖𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴', '𑄥𑄧𑄚𑄨'], - 'months' => ['𑄎𑄚𑄪𑄠𑄢𑄨', '𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴'], - 'months_short' => ['𑄎𑄚𑄪', '𑄜𑄬𑄛𑄴', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴'], - 'months_short_standalone' => ['𑄎𑄚𑄪𑄠𑄢𑄨', '𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM, YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ccp_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ccp_IN.php deleted file mode 100644 index c1fa8af..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ccp_IN.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ccp.php', [ - 'weekend' => [0, 0], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ce.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ce.php deleted file mode 100644 index f99f6ff..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ce.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ce_RU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ce_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ce_RU.php deleted file mode 100644 index f769856..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ce_RU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ANCHR - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY.DD.MM', - ], - 'months' => ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['КӀиранан де', 'Оршотан де', 'Шинарин де', 'Кхаарин де', 'Еарин де', 'ПӀераскан де', 'Шот де'], - 'weekdays_short' => ['КӀ', 'Ор', 'Ши', 'Кх', 'Еа', 'ПӀ', 'Шо'], - 'weekdays_min' => ['КӀ', 'Ор', 'Ши', 'Кх', 'Еа', 'ПӀ', 'Шо'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count шо', - 'y' => ':count шо', - 'a_year' => ':count шо', - - 'month' => ':count бутт', - 'm' => ':count бутт', - 'a_month' => ':count бутт', - - 'week' => ':count кӏира', - 'w' => ':count кӏира', - 'a_week' => ':count кӏира', - - 'day' => ':count де', - 'd' => ':count де', - 'a_day' => ':count де', - - 'hour' => ':count сахьт', - 'h' => ':count сахьт', - 'a_hour' => ':count сахьт', - - 'minute' => ':count минот', - 'min' => ':count минот', - 'a_minute' => ':count минот', - - 'second' => ':count секунд', - 's' => ':count секунд', - 'a_second' => ':count секунд', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cgg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cgg.php deleted file mode 100644 index 09bcc1c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cgg.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'], - 'weekdays_short' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'weekdays_min' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'months' => ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'], - 'months_short' => ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'day' => ':count ruhanga', // less reliable - 'd' => ':count ruhanga', // less reliable - 'a_day' => ':count ruhanga', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/chr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/chr.php deleted file mode 100644 index e26190f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/chr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/chr_US.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/chr_US.php b/dependencies/nesbot/carbon/src/Carbon/Lang/chr_US.php deleted file mode 100644 index 371353e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/chr_US.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Cherokee Nation Joseph Erb josepherb7@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YYYY', - ], - 'months' => ['ᎤᏃᎸᏔᏅ', 'ᎧᎦᎵ', 'ᎠᏅᏱ', 'ᎧᏬᏂ', 'ᎠᏂᏍᎬᏘ', 'ᏕᎭᎷᏱ', 'ᎫᏰᏉᏂ', 'ᎦᎶᏂ', 'ᏚᎵᏍᏗ', 'ᏚᏂᏅᏗ', 'ᏅᏓᏕᏆ', 'ᎥᏍᎩᏱ'], - 'months_short' => ['ᎤᏃ', 'ᎧᎦ', 'ᎠᏅ', 'ᎧᏬ', 'ᎠᏂ', 'ᏕᎭ', 'ᎫᏰ', 'ᎦᎶ', 'ᏚᎵ', 'ᏚᏂ', 'ᏅᏓ', 'ᎥᏍ'], - 'weekdays' => ['ᎤᎾᏙᏓᏆᏍᎬ', 'ᎤᎾᏙᏓᏉᏅᎯ', 'ᏔᎵᏁᎢᎦ', 'ᏦᎢᏁᎢᎦ', 'ᏅᎩᏁᎢᎦ', 'ᏧᎾᎩᎶᏍᏗ', 'ᎤᎾᏙᏓᏈᏕᎾ'], - 'weekdays_short' => ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'], - 'weekdays_min' => ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ᏌᎾᎴ', 'ᏒᎯᏱᎢᏗᏢ', 'ꮜꮎꮄ', 'ꮢꭿᏹꭲꮧꮲ'], - - 'second' => ':count ᏐᎢ', // less reliable - 's' => ':count ᏐᎢ', // less reliable - 'a_second' => ':count ᏐᎢ', // less reliable - - 'year' => ':count ᏑᏕᏘᏴᏓ', - 'y' => ':count ᏑᏕᏘᏴᏓ', - 'a_year' => ':count ᏑᏕᏘᏴᏓ', - - 'month' => ':count ᏏᏅᏙ', - 'm' => ':count ᏏᏅᏙ', - 'a_month' => ':count ᏏᏅᏙ', - - 'week' => ':count ᏑᎾᏙᏓᏆᏍᏗ', - 'w' => ':count ᏑᎾᏙᏓᏆᏍᏗ', - 'a_week' => ':count ᏑᎾᏙᏓᏆᏍᏗ', - - 'day' => ':count ᎢᎦ', - 'd' => ':count ᎢᎦ', - 'a_day' => ':count ᎢᎦ', - - 'hour' => ':count ᏑᏟᎶᏛ', - 'h' => ':count ᏑᏟᎶᏛ', - 'a_hour' => ':count ᏑᏟᎶᏛ', - - 'minute' => ':count ᎢᏯᏔᏬᏍᏔᏅ', - 'min' => ':count ᎢᏯᏔᏬᏍᏔᏅ', - 'a_minute' => ':count ᎢᏯᏔᏬᏍᏔᏅ', - - 'ago' => ':time ᏥᎨᏒ', - 'from_now' => 'ᎾᎿ :time', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ckb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ckb.php deleted file mode 100644 index acf4dc2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ckb.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Swara Mohammed - */ -$months = [ - 'ڕێبەندان', - 'ڕەشەمە', - 'نەورۆز', - 'گوڵان', - 'جۆزەردان', - 'پوشپەڕ', - 'گەلاوێژ', - 'خەرمانان', - 'ڕەزبەر', - 'گەڵاڕێزان', - 'سەرماوەرز', - 'بەفرانبار', -]; - -return [ - 'year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵێک', '{2}دوو ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), - 'a_year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵێک', '{2}دوو ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), - 'month' => implode('|', ['{0}:count مانگێک', '{1}مانگێک', '{2}دوو مانگ', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), - 'a_month' => implode('|', ['{0}:count مانگێک', '{1}مانگێک', '{2}دوو مانگ', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), - 'week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتەیەک', '{2}دوو هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), - 'a_week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتەیەک', '{2}دوو هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), - 'day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژێک', '{2}دوو ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), - 'a_day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژێک', '{2}دوو ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), - 'hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێرێک', '{2}دوو کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), - 'a_hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێرێک', '{2}دوو کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), - 'minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەکێک', '{2}دوو خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), - 'a_minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەکێک', '{2}دوو خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), - 'second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکەیەک', '{2}دوو چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), - 'a_second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکەیەک', '{2}دوو چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), - 'ago' => 'پێش :time', - 'from_now' => ':time لە ئێستاوە', - 'after' => 'دوای :time', - 'before' => 'پێش :time', - 'diff_now' => 'ئێستا', - 'diff_today' => 'ئەمڕۆ', - 'diff_today_regexp' => 'ڕۆژ(?:\\s+لە)?(?:\\s+کاتژمێر)?', - 'diff_yesterday' => 'دوێنێ', - 'diff_yesterday_regexp' => 'دوێنێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', - 'diff_tomorrow' => 'سبەینێ', - 'diff_tomorrow_regexp' => 'سبەینێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', - 'diff_before_yesterday' => 'پێش دوێنێ', - 'diff_after_tomorrow' => 'دوای سبەینێ', - 'period_recurrences' => implode('|', ['{0}جار', '{1}جار', '{2}:count دووجار', ']2,11[:count جار', ']10,Inf[:count جار']), - 'period_interval' => 'هەموو :interval', - 'period_start_date' => 'لە :date', - 'period_end_date' => 'بۆ :date', - 'months' => $months, - 'months_short' => $months, - 'weekdays' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], - 'weekdays_short' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], - 'weekdays_min' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], - 'list' => ['، ', ' و '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ئەمڕۆ لە کاتژمێر] LT', - 'nextDay' => '[سبەینێ لە کاتژمێر] LT', - 'nextWeek' => 'dddd [لە کاتژمێر] LT', - 'lastDay' => '[دوێنێ لە کاتژمێر] LT', - 'lastWeek' => 'dddd [لە کاتژمێر] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['پ.ن', 'د.ن'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cmn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cmn.php deleted file mode 100644 index 80b1d69..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cmn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/cmn_TW.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cmn_TW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cmn_TW.php deleted file mode 100644 index 7e43f9d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cmn_TW.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD號', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'meridiem' => ['上午', '下午'], - - 'year' => ':count 年', - 'y' => ':count 年', - 'a_year' => ':count 年', - - 'month' => ':count 月', - 'm' => ':count 月', - 'a_month' => ':count 月', - - 'week' => ':count 周', - 'w' => ':count 周', - 'a_week' => ':count 周', - - 'day' => ':count 白天', - 'd' => ':count 白天', - 'a_day' => ':count 白天', - - 'hour' => ':count 小时', - 'h' => ':count 小时', - 'a_hour' => ':count 小时', - - 'minute' => ':count 分钟', - 'min' => ':count 分钟', - 'a_minute' => ':count 分钟', - - 'second' => ':count 秒', - 's' => ':count 秒', - 'a_second' => ':count 秒', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/crh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/crh.php deleted file mode 100644 index a1d7ce6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/crh.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/crh_UA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/crh_UA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/crh_UA.php deleted file mode 100644 index 0513933..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/crh_UA.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Reşat SABIQ tilde.birlik@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'Mayıs', 'İyun', 'İyul', 'Avgust', 'Sentâbr', 'Oktâbr', 'Noyabr', 'Dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['Bazar', 'Bazarertesi', 'Salı', 'Çarşembe', 'Cumaaqşamı', 'Cuma', 'Cumaertesi'], - 'weekdays_short' => ['Baz', 'Ber', 'Sal', 'Çar', 'Caq', 'Cum', 'Cer'], - 'weekdays_min' => ['Baz', 'Ber', 'Sal', 'Çar', 'Caq', 'Cum', 'Cer'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ÜE', 'ÜS'], - - 'year' => ':count yıl', - 'y' => ':count yıl', - 'a_year' => ':count yıl', - - 'month' => ':count ay', - 'm' => ':count ay', - 'a_month' => ':count ay', - - 'week' => ':count afta', - 'w' => ':count afta', - 'a_week' => ':count afta', - - 'day' => ':count kün', - 'd' => ':count kün', - 'a_day' => ':count kün', - - 'hour' => ':count saat', - 'h' => ':count saat', - 'a_hour' => ':count saat', - - 'minute' => ':count daqqa', - 'min' => ':count daqqa', - 'a_minute' => ':count daqqa', - - 'second' => ':count ekinci', - 's' => ':count ekinci', - 'a_second' => ':count ekinci', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cs.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cs.php deleted file mode 100644 index c01e3cc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cs.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Jakub Tesinsky - * - Martin Suja - * - Nikos Timiopulos - * - Bohuslav Blín - * - Tsutomu Kuroda - * - tjku - * - Lukas Svoboda - * - Max Melentiev - * - Juanito Fatas - * - Akira Matsuda - * - Christopher Dell - * - Václav Pávek - * - CodeSkills - * - Tlapi - * - newman101 - * - Petr Kadlec - * - tommaskraus - * - Karel Sommer (calvera) - */ -$za = function ($time) { - return 'za '.strtr($time, [ - 'hodina' => 'hodinu', - 'minuta' => 'minutu', - 'sekunda' => 'sekundu', - ]); -}; - -$pred = function ($time) { - $time = strtr($time, [ - 'hodina' => 'hodinou', - 'minuta' => 'minutou', - 'sekunda' => 'sekundou', - ]); - $time = preg_replace('/hodiny?(?!\w)/', 'hodinami', $time); - $time = preg_replace('/minuty?(?!\w)/', 'minutami', $time); - $time = preg_replace('/sekundy?(?!\w)/', 'sekundami', $time); - - return "před $time"; -}; - -return [ - 'year' => ':count rok|:count roky|:count let', - 'y' => ':count rok|:count roky|:count let', - 'a_year' => 'rok|:count roky|:count let', - 'month' => ':count měsíc|:count měsíce|:count měsíců', - 'm' => ':count měs.', - 'a_month' => 'měsíc|:count měsíce|:count měsíců', - 'week' => ':count týden|:count týdny|:count týdnů', - 'w' => ':count týd.', - 'a_week' => 'týden|:count týdny|:count týdnů', - 'day' => ':count den|:count dny|:count dní', - 'd' => ':count den|:count dny|:count dní', - 'a_day' => 'den|:count dny|:count dní', - 'hour' => ':count hodina|:count hodiny|:count hodin', - 'h' => ':count hod.', - 'a_hour' => 'hodina|:count hodiny|:count hodin', - 'minute' => ':count minuta|:count minuty|:count minut', - 'min' => ':count min.', - 'a_minute' => 'minuta|:count minuty|:count minut', - 'second' => ':count sekunda|:count sekundy|:count sekund', - 's' => ':count sek.', - 'a_second' => 'pár sekund|:count sekundy|:count sekund', - - 'month_ago' => ':count měsícem|:count měsíci|:count měsíci', - 'a_month_ago' => 'měsícem|:count měsíci|:count měsíci', - 'day_ago' => ':count dnem|:count dny|:count dny', - 'a_day_ago' => 'dnem|:count dny|:count dny', - 'week_ago' => ':count týdnem|:count týdny|:count týdny', - 'a_week_ago' => 'týdnem|:count týdny|:count týdny', - 'year_ago' => ':count rokem|:count roky|:count lety', - 'y_ago' => ':count rok.|:count rok.|:count let.', - 'a_year_ago' => 'rokem|:count roky|:count lety', - - 'month_before' => ':count měsícem|:count měsíci|:count měsíci', - 'a_month_before' => 'měsícem|:count měsíci|:count měsíci', - 'day_before' => ':count dnem|:count dny|:count dny', - 'a_day_before' => 'dnem|:count dny|:count dny', - 'week_before' => ':count týdnem|:count týdny|:count týdny', - 'a_week_before' => 'týdnem|:count týdny|:count týdny', - 'year_before' => ':count rokem|:count roky|:count lety', - 'y_before' => ':count rok.|:count rok.|:count let.', - 'a_year_before' => 'rokem|:count roky|:count lety', - - 'ago' => $pred, - 'from_now' => $za, - 'before' => $pred, - 'after' => $za, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'months' => ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'], - 'months_standalone' => ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'], - 'months_short' => ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'], - 'weekdays' => ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], - 'weekdays_short' => ['ned', 'pon', 'úte', 'stř', 'čtv', 'pát', 'sob'], - 'weekdays_min' => ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], - 'list' => [', ', ' a '], - 'diff_now' => 'nyní', - 'diff_yesterday' => 'včera', - 'diff_tomorrow' => 'zítra', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD. MM. YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY HH:mm', - ], - 'meridiem' => ['dopoledne', 'odpoledne'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cs_CZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cs_CZ.php deleted file mode 100644 index ea2517e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cs_CZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/cs.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/csb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/csb.php deleted file mode 100644 index a35d281..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/csb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/csb_PL.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/csb_PL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/csb_PL.php deleted file mode 100644 index 25e0ca8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/csb_PL.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - csb_PL locale Michal Ostrowski bug-glibc-locales@gnu.org - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'months' => ['stëcznika', 'gromicznika', 'strëmiannika', 'łżëkwiata', 'maja', 'czerwińca', 'lëpińca', 'zélnika', 'séwnika', 'rujana', 'lëstopadnika', 'gòdnika'], - 'months_short' => ['stë', 'gro', 'str', 'łżë', 'maj', 'cze', 'lëp', 'zél', 'séw', 'ruj', 'lës', 'gòd'], - 'weekdays' => ['niedzela', 'pòniedzôłk', 'wtórk', 'strzoda', 'czwiôrtk', 'piątk', 'sobòta'], - 'weekdays_short' => ['nie', 'pòn', 'wtó', 'str', 'czw', 'pią', 'sob'], - 'weekdays_min' => ['nie', 'pòn', 'wtó', 'str', 'czw', 'pią', 'sob'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' a téż '], - 'two_words_connector' => ' a téż ', - 'year' => ':count rok', - 'month' => ':count miesiąc', - 'week' => ':count tidzéń', - 'day' => ':count dzéń', - 'hour' => ':count gòdzëna', - 'minute' => ':count minuta', - 'second' => ':count sekunda', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cu.php deleted file mode 100644 index d6d1312..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cu.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => ':count лѣто', - 'y' => ':count лѣто', - 'a_year' => ':count лѣто', - - 'month' => ':count мѣсѧць', - 'm' => ':count мѣсѧць', - 'a_month' => ':count мѣсѧць', - - 'week' => ':count сєдмица', - 'w' => ':count сєдмица', - 'a_week' => ':count сєдмица', - - 'day' => ':count дьнь', - 'd' => ':count дьнь', - 'a_day' => ':count дьнь', - - 'hour' => ':count година', - 'h' => ':count година', - 'a_hour' => ':count година', - - 'minute' => ':count малъ', // less reliable - 'min' => ':count малъ', // less reliable - 'a_minute' => ':count малъ', // less reliable - - 'second' => ':count въторъ', - 's' => ':count въторъ', - 'a_second' => ':count въторъ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cv.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cv.php deleted file mode 100644 index 8aeb73a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cv.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - JD Isaacks - */ -return [ - 'year' => ':count ҫул', - 'a_year' => '{1}пӗр ҫул|:count ҫул', - 'month' => ':count уйӑх', - 'a_month' => '{1}пӗр уйӑх|:count уйӑх', - 'week' => ':count эрне', - 'a_week' => '{1}пӗр эрне|:count эрне', - 'day' => ':count кун', - 'a_day' => '{1}пӗр кун|:count кун', - 'hour' => ':count сехет', - 'a_hour' => '{1}пӗр сехет|:count сехет', - 'minute' => ':count минут', - 'a_minute' => '{1}пӗр минут|:count минут', - 'second' => ':count ҫеккунт', - 'a_second' => '{1}пӗр-ик ҫеккунт|:count ҫеккунт', - 'ago' => ':time каялла', - 'from_now' => function ($time) { - return $time.(preg_match('/сехет$/u', $time) ? 'рен' : (preg_match('/ҫул/u', $time) ? 'тан' : 'ран')); - }, - 'diff_yesterday' => 'Ӗнер', - 'diff_today' => 'Паян', - 'diff_tomorrow' => 'Ыран', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', - 'LLL' => 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - 'LLLL' => 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Паян] LT [сехетре]', - 'nextDay' => '[Ыран] LT [сехетре]', - 'nextWeek' => '[Ҫитес] dddd LT [сехетре]', - 'lastDay' => '[Ӗнер] LT [сехетре]', - 'lastWeek' => '[Иртнӗ] dddd LT [сехетре]', - 'sameElse' => 'L', - ], - 'ordinal' => ':number-мӗш', - 'months' => ['кӑрлач', 'нарӑс', 'пуш', 'ака', 'май', 'ҫӗртме', 'утӑ', 'ҫурла', 'авӑн', 'юпа', 'чӳк', 'раштав'], - 'months_short' => ['кӑр', 'нар', 'пуш', 'ака', 'май', 'ҫӗр', 'утӑ', 'ҫур', 'авн', 'юпа', 'чӳк', 'раш'], - 'weekdays' => ['вырсарникун', 'тунтикун', 'ытларикун', 'юнкун', 'кӗҫнерникун', 'эрнекун', 'шӑматкун'], - 'weekdays_short' => ['выр', 'тун', 'ытл', 'юн', 'кӗҫ', 'эрн', 'шӑм'], - 'weekdays_min' => ['вр', 'тн', 'ыт', 'юн', 'кҫ', 'эр', 'шм'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' тата '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cv_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cv_RU.php deleted file mode 100644 index 197bd8d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cv_RU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/cv.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cy.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cy.php deleted file mode 100644 index 119274f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cy.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - JD Isaacks - * - Daniel Monaghan - */ -return [ - 'year' => '{1}blwyddyn|]1,Inf[:count flynedd', - 'y' => ':countbl', - 'month' => '{1}mis|]1,Inf[:count mis', - 'm' => ':countmi', - 'week' => ':count wythnos', - 'w' => ':countw', - 'day' => '{1}diwrnod|]1,Inf[:count diwrnod', - 'd' => ':countd', - 'hour' => '{1}awr|]1,Inf[:count awr', - 'h' => ':counth', - 'minute' => '{1}munud|]1,Inf[:count munud', - 'min' => ':countm', - 'second' => '{1}ychydig eiliadau|]1,Inf[:count eiliad', - 's' => ':counts', - 'ago' => ':time yn ôl', - 'from_now' => 'mewn :time', - 'after' => ':time ar ôl', - 'before' => ':time o\'r blaen', - 'diff_now' => 'nawr', - 'diff_today' => 'Heddiw', - 'diff_today_regexp' => 'Heddiw(?:\\s+am)?', - 'diff_yesterday' => 'ddoe', - 'diff_yesterday_regexp' => 'Ddoe(?:\\s+am)?', - 'diff_tomorrow' => 'yfory', - 'diff_tomorrow_regexp' => 'Yfory(?:\\s+am)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Heddiw am] LT', - 'nextDay' => '[Yfory am] LT', - 'nextWeek' => 'dddd [am] LT', - 'lastDay' => '[Ddoe am] LT', - 'lastWeek' => 'dddd [diwethaf am] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - return $number.( - $number > 20 - ? (\in_array((int) $number, [40, 50, 60, 80, 100], true) ? 'fed' : 'ain') - : ([ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed', // 11eg to 20fed - ])[$number] ?? '' - ); - }, - 'months' => ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'], - 'months_short' => ['Ion', 'Chwe', 'Maw', 'Ebr', 'Mai', 'Meh', 'Gor', 'Aws', 'Med', 'Hyd', 'Tach', 'Rhag'], - 'weekdays' => ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'], - 'weekdays_short' => ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'], - 'weekdays_min' => ['Su', 'Ll', 'Ma', 'Me', 'Ia', 'Gw', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' a '], - 'meridiem' => ['yb', 'yh'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/cy_GB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/cy_GB.php deleted file mode 100644 index 2c8148d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/cy_GB.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/cy.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/da.php b/dependencies/nesbot/carbon/src/Carbon/Lang/da.php deleted file mode 100644 index 322f91d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/da.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rune Mønnike - * - François B - * - codenhagen - * - JD Isaacks - * - Jens Herlevsen - * - Ulrik McArdle (mcardle) - * - Frederik Sauer (FrittenKeeZ) - * - Janus Bahs Jacquet (kokoshneta) - */ -return [ - 'year' => ':count år|:count år', - 'a_year' => 'et år|:count år', - 'y' => ':count år|:count år', - 'month' => ':count måned|:count måneder', - 'a_month' => 'en måned|:count måneder', - 'm' => ':count mdr.', - 'week' => ':count uge|:count uger', - 'a_week' => 'en uge|:count uger', - 'w' => ':count u.', - 'day' => ':count dag|:count dage', - 'a_day' => ':count dag|:count dage', - 'd' => ':count d.', - 'hour' => ':count time|:count timer', - 'a_hour' => 'en time|:count timer', - 'h' => ':count t.', - 'minute' => ':count minut|:count minutter', - 'a_minute' => 'et minut|:count minutter', - 'min' => ':count min.', - 'second' => ':count sekund|:count sekunder', - 'a_second' => 'få sekunder|:count sekunder', - 's' => ':count s.', - 'ago' => 'for :time siden', - 'from_now' => 'om :time', - 'after' => ':time efter', - 'before' => ':time før', - 'diff_now' => 'nu', - 'diff_today' => 'i dag', - 'diff_today_regexp' => 'i dag(?:\\s+kl.)?', - 'diff_yesterday' => 'i går', - 'diff_yesterday_regexp' => 'i går(?:\\s+kl.)?', - 'diff_tomorrow' => 'i morgen', - 'diff_tomorrow_regexp' => 'i morgen(?:\\s+kl.)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd [d.] D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[i dag kl.] LT', - 'nextDay' => '[i morgen kl.] LT', - 'nextWeek' => 'på dddd [kl.] LT', - 'lastDay' => '[i går kl.] LT', - 'lastWeek' => '[i] dddd[s kl.] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], - 'weekdays_short' => ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'], - 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/da_DK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/da_DK.php deleted file mode 100644 index 392c484..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/da_DK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/da.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/da_GL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/da_GL.php deleted file mode 100644 index ea5698b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/da_GL.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/da.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - 'LL' => 'D. MMM YYYY', - 'LLL' => 'D. MMMM YYYY HH.mm', - 'LLLL' => 'dddd [den] D. MMMM YYYY HH.mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dav.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dav.php deleted file mode 100644 index e95ec4b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dav.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Luma lwa K', 'luma lwa p'], - 'weekdays' => ['Ituku ja jumwa', 'Kuramuka jimweri', 'Kuramuka kawi', 'Kuramuka kadadu', 'Kuramuka kana', 'Kuramuka kasanu', 'Kifula nguwo'], - 'weekdays_short' => ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'], - 'weekdays_min' => ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'], - 'months' => ['Mori ghwa imbiri', 'Mori ghwa kawi', 'Mori ghwa kadadu', 'Mori ghwa kana', 'Mori ghwa kasanu', 'Mori ghwa karandadu', 'Mori ghwa mfungade', 'Mori ghwa wunyanya', 'Mori ghwa ikenda', 'Mori ghwa ikumi', 'Mori ghwa ikumi na imweri', 'Mori ghwa ikumi na iwi'], - 'months_short' => ['Imb', 'Kaw', 'Kad', 'Kan', 'Kas', 'Kar', 'Mfu', 'Wun', 'Ike', 'Iku', 'Imw', 'Iwi'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de.php deleted file mode 100644 index 3b70750..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Michael Hohl - * - sheriffmarley - * - dennisoderwald - * - Timo - * - Karag2006 - * - Pete Scopes (pdscopes) - */ -return [ - 'year' => ':count Jahr|:count Jahre', - 'a_year' => 'ein Jahr|:count Jahre', - 'y' => ':count J.', - 'month' => ':count Monat|:count Monate', - 'a_month' => 'ein Monat|:count Monate', - 'm' => ':count Mon.', - 'week' => ':count Woche|:count Wochen', - 'a_week' => 'eine Woche|:count Wochen', - 'w' => ':count Wo.', - 'day' => ':count Tag|:count Tage', - 'a_day' => 'ein Tag|:count Tage', - 'd' => ':count Tg.', - 'hour' => ':count Stunde|:count Stunden', - 'a_hour' => 'eine Stunde|:count Stunden', - 'h' => ':count Std.', - 'minute' => ':count Minute|:count Minuten', - 'a_minute' => 'eine Minute|:count Minuten', - 'min' => ':count Min.', - 'second' => ':count Sekunde|:count Sekunden', - 'a_second' => 'ein paar Sekunden|:count Sekunden', - 's' => ':count Sek.', - 'millisecond' => ':count Millisekunde|:count Millisekunden', - 'a_millisecond' => 'eine Millisekunde|:count Millisekunden', - 'ms' => ':countms', - 'microsecond' => ':count Mikrosekunde|:count Mikrosekunden', - 'a_microsecond' => 'eine Mikrosekunde|:count Mikrosekunden', - 'µs' => ':countµs', - 'ago' => 'vor :time', - 'from_now' => 'in :time', - 'after' => ':time später', - 'before' => ':time zuvor', - - 'year_from_now' => ':count Jahr|:count Jahren', - 'month_from_now' => ':count Monat|:count Monaten', - 'week_from_now' => ':count Woche|:count Wochen', - 'day_from_now' => ':count Tag|:count Tagen', - 'year_ago' => ':count Jahr|:count Jahren', - 'month_ago' => ':count Monat|:count Monaten', - 'week_ago' => ':count Woche|:count Wochen', - 'day_ago' => ':count Tag|:count Tagen', - 'a_year_from_now' => 'ein Jahr|:count Jahren', - 'a_month_from_now' => 'ein Monat|:count Monaten', - 'a_week_from_now' => 'eine Woche|:count Wochen', - 'a_day_from_now' => 'ein Tag|:count Tagen', - 'a_year_ago' => 'ein Jahr|:count Jahren', - 'a_month_ago' => 'ein Monat|:count Monaten', - 'a_week_ago' => 'eine Woche|:count Wochen', - 'a_day_ago' => 'ein Tag|:count Tagen', - - 'diff_now' => 'Gerade eben', - 'diff_today' => 'heute', - 'diff_today_regexp' => 'heute(?:\\s+um)?', - 'diff_yesterday' => 'Gestern', - 'diff_yesterday_regexp' => 'gestern(?:\\s+um)?', - 'diff_tomorrow' => 'Morgen', - 'diff_tomorrow_regexp' => 'morgen(?:\\s+um)?', - 'diff_before_yesterday' => 'Vorgestern', - 'diff_after_tomorrow' => 'Übermorgen', - - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY HH:mm', - ], - - 'calendar' => [ - 'sameDay' => '[heute um] LT [Uhr]', - 'nextDay' => '[morgen um] LT [Uhr]', - 'nextWeek' => 'dddd [um] LT [Uhr]', - 'lastDay' => '[gestern um] LT [Uhr]', - 'lastWeek' => '[letzten] dddd [um] LT [Uhr]', - 'sameElse' => 'L', - ], - - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], - 'weekdays' => ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], - 'weekdays_short' => ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'], - 'weekdays_min' => ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' und '], - 'ordinal_words' => [ - 'of' => 'im', - 'first' => 'erster', - 'second' => 'zweiter', - 'third' => 'dritter', - 'fourth' => 'vierten', - 'fifth' => 'fünfter', - 'last' => 'letzten', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_AT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_AT.php deleted file mode 100644 index a2ea4c0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_AT.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - sheriffmarley - * - Timo - * - Michael Hohl - * - Namoshek - * - Bernhard Baumrock (BernhardBaumrock) - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'months' => [ - 0 => 'Jänner', - ], - 'months_short' => [ - 0 => 'Jän', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_BE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_BE.php deleted file mode 100644 index 8ed8dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_BE.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_CH.php deleted file mode 100644 index a869ab4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_CH.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - sheriffmarley - * - Timo - * - Michael Hohl - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'weekdays_short' => ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_DE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_DE.php deleted file mode 100644 index fb1209d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_DE.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return require __DIR__.'/de.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_IT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_IT.php deleted file mode 100644 index 604a856..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_IT.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Matthias Dieter Wallno:fer libc-locales@sourceware.org - */ -return require __DIR__.'/de.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_LI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_LI.php deleted file mode 100644 index 03e606a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_LI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/de.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/de_LU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/de_LU.php deleted file mode 100644 index 8ed8dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/de_LU.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/de.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dje.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dje.php deleted file mode 100644 index 74b7ac1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dje.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Subbaahi', 'Zaarikay b'], - 'weekdays' => ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamisi', 'Alzuma', 'Asibti'], - 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], - 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count hari', // less reliable - 'y' => ':count hari', // less reliable - 'a_year' => ':count hari', // less reliable - - 'week' => ':count alzuma', // less reliable - 'w' => ':count alzuma', // less reliable - 'a_week' => ':count alzuma', // less reliable - - 'second' => ':count atinni', // less reliable - 's' => ':count atinni', // less reliable - 'a_second' => ':count atinni', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/doi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/doi.php deleted file mode 100644 index cb679c5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/doi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/doi_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/doi_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/doi_IN.php deleted file mode 100644 index d359721..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/doi_IN.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'एप्रैल', 'मेई', 'जून', 'जूलै', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'एप्रैल', 'मेई', 'जून', 'जूलै', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'], - 'weekdays' => ['ऐतबार', 'सोमबार', 'मंगलबर', 'बुधबार', 'बीरबार', 'शुक्करबार', 'श्नीचरबार'], - 'weekdays_short' => ['ऐत', 'सोम', 'मंगल', 'बुध', 'बीर', 'शुक्कर', 'श्नीचर'], - 'weekdays_min' => ['ऐत', 'सोम', 'मंगल', 'बुध', 'बीर', 'शुक्कर', 'श्नीचर'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['सञं', 'सबेर'], - - 'second' => ':count सङार', // less reliable - 's' => ':count सङार', // less reliable - 'a_second' => ':count सङार', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dsb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dsb.php deleted file mode 100644 index 1d214d5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dsb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/dsb_DE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dsb_DE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dsb_DE.php deleted file mode 100644 index 1b94187..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dsb_DE.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Information from Michael Wolf bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'DD. MMMM YYYY', - 'LLL' => 'DD. MMMM, HH:mm [góź.]', - 'LLLL' => 'dddd, DD. MMMM YYYY, HH:mm [góź.]', - ], - 'months' => ['januara', 'februara', 'měrca', 'apryla', 'maja', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'], - 'months_short' => ['Jan', 'Feb', 'Měr', 'Apr', 'Maj', 'Jun', 'Jul', 'Awg', 'Sep', 'Okt', 'Now', 'Dec'], - 'weekdays' => ['Njeźela', 'Pónjeźele', 'Wałtora', 'Srjoda', 'Stwórtk', 'Pětk', 'Sobota'], - 'weekdays_short' => ['Nj', 'Pó', 'Wa', 'Sr', 'St', 'Pě', 'So'], - 'weekdays_min' => ['Nj', 'Pó', 'Wa', 'Sr', 'St', 'Pě', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count lěto', - 'y' => ':count lěto', - 'a_year' => ':count lěto', - - 'month' => ':count mjasec', - 'm' => ':count mjasec', - 'a_month' => ':count mjasec', - - 'week' => ':count tyźeń', - 'w' => ':count tyźeń', - 'a_week' => ':count tyźeń', - - 'day' => ':count źeń', - 'd' => ':count źeń', - 'a_day' => ':count źeń', - - 'hour' => ':count góźina', - 'h' => ':count góźina', - 'a_hour' => ':count góźina', - - 'minute' => ':count minuta', - 'min' => ':count minuta', - 'a_minute' => ':count minuta', - - 'second' => ':count drugi', - 's' => ':count drugi', - 'a_second' => ':count drugi', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dua.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dua.php deleted file mode 100644 index 55e5c7c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dua.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['idiɓa', 'ebyámu'], - 'weekdays' => ['éti', 'mɔ́sú', 'kwasú', 'mukɔ́sú', 'ŋgisú', 'ɗónɛsú', 'esaɓasú'], - 'weekdays_short' => ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'], - 'weekdays_min' => ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'], - 'months' => ['dimɔ́di', 'ŋgɔndɛ', 'sɔŋɛ', 'diɓáɓá', 'emiasele', 'esɔpɛsɔpɛ', 'madiɓɛ́díɓɛ́', 'diŋgindi', 'nyɛtɛki', 'mayésɛ́', 'tiníní', 'eláŋgɛ́'], - 'months_short' => ['di', 'ŋgɔn', 'sɔŋ', 'diɓ', 'emi', 'esɔ', 'mad', 'diŋ', 'nyɛt', 'may', 'tin', 'elá'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count ma mbu', // less reliable - 'y' => ':count ma mbu', // less reliable - 'a_year' => ':count ma mbu', // less reliable - - 'month' => ':count myo̱di', // less reliable - 'm' => ':count myo̱di', // less reliable - 'a_month' => ':count myo̱di', // less reliable - - 'week' => ':count woki', // less reliable - 'w' => ':count woki', // less reliable - 'a_week' => ':count woki', // less reliable - - 'day' => ':count buńa', // less reliable - 'd' => ':count buńa', // less reliable - 'a_day' => ':count buńa', // less reliable - - 'hour' => ':count ma awa', // less reliable - 'h' => ':count ma awa', // less reliable - 'a_hour' => ':count ma awa', // less reliable - - 'minute' => ':count minuti', // less reliable - 'min' => ':count minuti', // less reliable - 'a_minute' => ':count minuti', // less reliable - - 'second' => ':count maba', // less reliable - 's' => ':count maba', // less reliable - 'a_second' => ':count maba', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dv.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dv.php deleted file mode 100644 index 4b8d7e1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dv.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު', -]; - -$weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު', -]; - -/* - * Authors: - * - Josh Soref - * - Jawish Hameed - */ -return [ - 'year' => ':count '.'އަހަރު', - 'a_year' => '{1}'.'އަހަރެއް'.'|:count '.'އަހަރު', - 'month' => ':count '.'މަސް', - 'a_month' => '{1}'.'މަހެއް'.'|:count '.'މަސް', - 'week' => ':count '.'ހަފްތާ', - 'a_week' => '{1}'.'ސިކުންތުކޮޅެއް'.'|:count '.'ހަފްތާ', - 'day' => ':count '.'ދުވަސް', - 'a_day' => '{1}'.'ދުވަހެއް'.'|:count '.'ދުވަސް', - 'hour' => ':count '.'ގަޑިއިރު', - 'a_hour' => '{1}'.'ގަޑިއިރެއް'.'|:count '.'ގަޑިއިރު', - 'minute' => ':count '.'މިނިޓު', - 'a_minute' => '{1}'.'މިނިޓެއް'.'|:count '.'މިނިޓު', - 'second' => ':count '.'ސިކުންތު', - 'a_second' => '{1}'.'ސިކުންތުކޮޅެއް'.'|:count '.'ސިކުންތު', - 'ago' => 'ކުރިން :time', - 'from_now' => 'ތެރޭގައި :time', - 'after' => ':time ފަހުން', - 'before' => ':time ކުރި', - 'diff_yesterday' => 'އިއްޔެ', - 'diff_today' => 'މިއަދު', - 'diff_tomorrow' => 'މާދަމާ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[މިއަދު] LT', - 'nextDay' => '[މާދަމާ] LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '[އިއްޔެ] LT', - 'lastWeek' => '[ފާއިތުވި] dddd LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['މކ', 'މފ'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => ['އާދި', 'ހޯމަ', 'އަން', 'ބުދަ', 'ބުރާ', 'ހުކު', 'ހޮނި'], - 'list' => [', ', ' އަދި '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dv_MV.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dv_MV.php deleted file mode 100644 index 2668d5b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dv_MV.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ahmed Ali - */ - -$months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު', -]; - -$weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު', -]; - -return [ - 'year' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', - 'y' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', - 'month' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', - 'm' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', - 'week' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', - 'w' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', - 'day' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', - 'd' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', - 'hour' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', - 'h' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', - 'minute' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', - 'min' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', - 'second' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', - 's' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', - 'ago' => ':time ކުރިން', - 'from_now' => ':time ފަހުން', - 'after' => ':time ފަހުން', - 'before' => ':time ކުރި', - 'diff_yesterday' => 'އިއްޔެ', - 'diff_today' => 'މިއަދު', - 'diff_tomorrow' => 'މާދަމާ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[މިއަދު] LT', - 'nextDay' => '[މާދަމާ] LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '[އިއްޔެ] LT', - 'lastWeek' => '[ފާއިތުވި] dddd LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['މކ', 'މފ'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => ['އާދި', 'ހޯމަ', 'އަން', 'ބުދަ', 'ބުރާ', 'ހުކު', 'ހޮނި'], - 'list' => [', ', ' އަދި '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dyo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dyo.php deleted file mode 100644 index 33082e6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dyo.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Dimas', 'Teneŋ', 'Talata', 'Alarbay', 'Aramisay', 'Arjuma', 'Sibiti'], - 'weekdays_short' => ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'], - 'weekdays_min' => ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'], - 'months' => ['Sanvie', 'Fébirie', 'Mars', 'Aburil', 'Mee', 'Sueŋ', 'Súuyee', 'Ut', 'Settembar', 'Oktobar', 'Novembar', 'Disambar'], - 'months_short' => ['Sa', 'Fe', 'Ma', 'Ab', 'Me', 'Su', 'Sú', 'Ut', 'Se', 'Ok', 'No', 'De'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dz.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dz.php deleted file mode 100644 index cc17e69..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dz.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/dz_BT.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/dz_BT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/dz_BT.php deleted file mode 100644 index bfbcaf4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/dz_BT.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sherubtse College bug-glibc@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'པསྱི་ལོYYཟལMMཚེསDD', - ], - 'months' => ['ཟླ་བ་དང་པ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་ཕ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུནཔ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], - 'months_short' => ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'], - 'weekdays' => ['གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་ཕ་', 'གཟའ་པུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་ཕ་', 'གཟའ་ཉི་མ་'], - 'weekdays_short' => ['ཟླ་', 'མིར་', 'ལྷག་', 'པུར་', 'སངས་', 'སྤེན་', 'ཉི་'], - 'weekdays_min' => ['ཟླ་', 'མིར་', 'ལྷག་', 'པུར་', 'སངས་', 'སྤེན་', 'ཉི་'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ངས་ཆ', 'ཕྱི་ཆ'], - - 'year' => ':count ཆརཔ', // less reliable - 'y' => ':count ཆརཔ', // less reliable - 'a_year' => ':count ཆརཔ', // less reliable - - 'month' => ':count ཟླ་བ', // less reliable - 'm' => ':count ཟླ་བ', // less reliable - 'a_month' => ':count ཟླ་བ', // less reliable - - 'day' => ':count ཉི', // less reliable - 'd' => ':count ཉི', // less reliable - 'a_day' => ':count ཉི', // less reliable - - 'second' => ':count ཆ', // less reliable - 's' => ':count ཆ', // less reliable - 'a_second' => ':count ཆ', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ebu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ebu.php deleted file mode 100644 index f60bc6f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ebu.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['KI', 'UT'], - 'weekdays' => ['Kiumia', 'Njumatatu', 'Njumaine', 'Njumatano', 'Aramithi', 'Njumaa', 'NJumamothii'], - 'weekdays_short' => ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'], - 'weekdays_min' => ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'], - 'months' => ['Mweri wa mbere', 'Mweri wa kaĩri', 'Mweri wa kathatũ', 'Mweri wa kana', 'Mweri wa gatano', 'Mweri wa gatantatũ', 'Mweri wa mũgwanja', 'Mweri wa kanana', 'Mweri wa kenda', 'Mweri wa ikũmi', 'Mweri wa ikũmi na ũmwe', 'Mweri wa ikũmi na Kaĩrĩ'], - 'months_short' => ['Mbe', 'Kai', 'Kat', 'Kan', 'Gat', 'Gan', 'Mug', 'Knn', 'Ken', 'Iku', 'Imw', 'Igi'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ee.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ee.php deleted file mode 100644 index f96c5c9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ee.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ŋ', 'ɣ'], - 'weekdays' => ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'], - 'weekdays_short' => ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'], - 'weekdays_min' => ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'], - 'months' => ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'], - 'months_short' => ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'a [ga] h:mm', - 'LTS' => 'a [ga] h:mm:ss', - 'L' => 'M/D/YYYY', - 'LL' => 'MMM D [lia], YYYY', - 'LLL' => 'a [ga] h:mm MMMM D [lia] YYYY', - 'LLLL' => 'a [ga] h:mm dddd, MMMM D [lia] YYYY', - ], - - 'year' => 'ƒe :count', - 'y' => 'ƒe :count', - 'a_year' => 'ƒe :count', - - 'month' => 'ɣleti :count', - 'm' => 'ɣleti :count', - 'a_month' => 'ɣleti :count', - - 'week' => 'kwasiɖa :count', - 'w' => 'kwasiɖa :count', - 'a_week' => 'kwasiɖa :count', - - 'day' => 'ŋkeke :count', - 'd' => 'ŋkeke :count', - 'a_day' => 'ŋkeke :count', - - 'hour' => 'gaƒoƒo :count', - 'h' => 'gaƒoƒo :count', - 'a_hour' => 'gaƒoƒo :count', - - 'minute' => 'miniti :count', // less reliable - 'min' => 'miniti :count', // less reliable - 'a_minute' => 'miniti :count', // less reliable - - 'second' => 'sɛkɛnd :count', // less reliable - 's' => 'sɛkɛnd :count', // less reliable - 'a_second' => 'sɛkɛnd :count', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ee_TG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ee_TG.php deleted file mode 100644 index 7a8b36c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ee_TG.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ee.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'LLL' => 'HH:mm MMMM D [lia] YYYY', - 'LLLL' => 'HH:mm dddd, MMMM D [lia] YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/el.php b/dependencies/nesbot/carbon/src/Carbon/Lang/el.php deleted file mode 100644 index 7c40f9c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/el.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alessandro Di Felice - * - François B - * - Tim Fish - * - Gabriel Monteagudo - * - JD Isaacks - * - yiannisdesp - * - Ilias Kasmeridis (iliaskasm) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count χρόνος|:count χρόνια', - 'a_year' => 'ένας χρόνος|:count χρόνια', - 'y' => ':count χρ.', - 'month' => ':count μήνας|:count μήνες', - 'a_month' => 'ένας μήνας|:count μήνες', - 'm' => ':count μήν.', - 'week' => ':count εβδομάδα|:count εβδομάδες', - 'a_week' => 'μια εβδομάδα|:count εβδομάδες', - 'w' => ':count εβδ.', - 'day' => ':count μέρα|:count μέρες', - 'a_day' => 'μία μέρα|:count μέρες', - 'd' => ':count μέρ.', - 'hour' => ':count ώρα|:count ώρες', - 'a_hour' => 'μία ώρα|:count ώρες', - 'h' => ':count ώρα|:count ώρες', - 'minute' => ':count λεπτό|:count λεπτά', - 'a_minute' => 'ένα λεπτό|:count λεπτά', - 'min' => ':count λεπ.', - 'second' => ':count δευτερόλεπτο|:count δευτερόλεπτα', - 'a_second' => 'λίγα δευτερόλεπτα|:count δευτερόλεπτα', - 's' => ':count δευ.', - 'ago' => 'πριν :time', - 'from_now' => 'σε :time', - 'after' => ':time μετά', - 'before' => ':time πριν', - 'diff_now' => 'τώρα', - 'diff_today' => 'Σήμερα', - 'diff_today_regexp' => 'Σήμερα(?:\\s+{})?', - 'diff_yesterday' => 'χθες', - 'diff_yesterday_regexp' => 'Χθες(?:\\s+{})?', - 'diff_tomorrow' => 'αύριο', - 'diff_tomorrow_regexp' => 'Αύριο(?:\\s+{})?', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'calendar' => [ - 'sameDay' => '[Σήμερα {}] LT', - 'nextDay' => '[Αύριο {}] LT', - 'nextWeek' => 'dddd [{}] LT', - 'lastDay' => '[Χθες {}] LT', - 'lastWeek' => function (CarbonInterface $current) { - switch ($current->dayOfWeek) { - case 6: - return '[το προηγούμενο] dddd [{}] LT'; - default: - return '[την προηγούμενη] dddd [{}] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberη', - 'meridiem' => ['ΠΜ', 'ΜΜ', 'πμ', 'μμ'], - 'months' => ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου'], - 'months_standalone' => ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'], - 'months_regexp' => '/(D[oD]?[\s,]+MMMM|L{2,4}|l{2,4})/', - 'months_short' => ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαϊ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'], - 'weekdays' => ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'], - 'weekdays_short' => ['Κυρ', 'Δευ', 'Τρι', 'Τετ', 'Πεμ', 'Παρ', 'Σαβ'], - 'weekdays_min' => ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πε', 'Πα', 'Σα'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' και '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/el_CY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/el_CY.php deleted file mode 100644 index 8a693c1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/el_CY.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Greek Debian Translation Team bug-glibc@gnu.org - */ -return array_replace_recursive(require __DIR__.'/el.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/el_GR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/el_GR.php deleted file mode 100644 index df196af..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/el_GR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/el.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en.php deleted file mode 100644 index f81f617..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Milos Sakovic - * - Paul - * - Pete Scopes (pdscopes) - */ -return [ - /* - * {1}, {0} and ]1,Inf[ are not needed as it's the default for English pluralization. - * But as some languages are using en.php as a fallback, it's better to specify it - * explicitly so those languages also fallback to English pluralization when a unit - * is missing. - */ - 'year' => '{1}:count year|{0}:count years|]1,Inf[:count years', - 'a_year' => '{1}a year|{0}:count years|]1,Inf[:count years', - 'y' => '{1}:countyr|{0}:countyrs|]1,Inf[:countyrs', - 'month' => '{1}:count month|{0}:count months|]1,Inf[:count months', - 'a_month' => '{1}a month|{0}:count months|]1,Inf[:count months', - 'm' => '{1}:countmo|{0}:countmos|]1,Inf[:countmos', - 'week' => '{1}:count week|{0}:count weeks|]1,Inf[:count weeks', - 'a_week' => '{1}a week|{0}:count weeks|]1,Inf[:count weeks', - 'w' => ':countw', - 'day' => '{1}:count day|{0}:count days|]1,Inf[:count days', - 'a_day' => '{1}a day|{0}:count days|]1,Inf[:count days', - 'd' => ':countd', - 'hour' => '{1}:count hour|{0}:count hours|]1,Inf[:count hours', - 'a_hour' => '{1}an hour|{0}:count hours|]1,Inf[:count hours', - 'h' => ':counth', - 'minute' => '{1}:count minute|{0}:count minutes|]1,Inf[:count minutes', - 'a_minute' => '{1}a minute|{0}:count minutes|]1,Inf[:count minutes', - 'min' => ':countm', - 'second' => '{1}:count second|{0}:count seconds|]1,Inf[:count seconds', - 'a_second' => '{1}a few seconds|{0}:count seconds|]1,Inf[:count seconds', - 's' => ':counts', - 'millisecond' => '{1}:count millisecond|{0}:count milliseconds|]1,Inf[:count milliseconds', - 'a_millisecond' => '{1}a millisecond|{0}:count milliseconds|]1,Inf[:count milliseconds', - 'ms' => ':countms', - 'microsecond' => '{1}:count microsecond|{0}:count microseconds|]1,Inf[:count microseconds', - 'a_microsecond' => '{1}a microsecond|{0}:count microseconds|]1,Inf[:count microseconds', - 'µs' => ':countµs', - 'ago' => ':time ago', - 'from_now' => ':time from now', - 'after' => ':time after', - 'before' => ':time before', - 'diff_now' => 'just now', - 'diff_today' => 'today', - 'diff_yesterday' => 'yesterday', - 'diff_tomorrow' => 'tomorrow', - 'diff_before_yesterday' => 'before yesterday', - 'diff_after_tomorrow' => 'after tomorrow', - 'period_recurrences' => '{1}once|{0}:count times|]1,Inf[:count times', - 'period_interval' => 'every :interval', - 'period_start_date' => 'from :date', - 'period_end_date' => 'to :date', - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - 'weekdays_min' => ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], - 'ordinal' => function ($number) { - $lastDigit = $number % 10; - - return $number.( - ((int) ($number % 100 / 10) === 1) ? 'th' : ( - ($lastDigit === 1) ? 'st' : ( - ($lastDigit === 2) ? 'nd' : ( - ($lastDigit === 3) ? 'rd' : 'th' - ) - ) - ) - ); - }, - 'list' => [', ', ' and '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_001.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_001.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_001.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_150.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_150.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_150.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_AG.php deleted file mode 100644 index 2c1c64f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AG.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_AI.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_AS.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_AT.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AT.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_AU.php deleted file mode 100644 index f16bd4f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_AU.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - François B - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BB.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BB.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BE.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BI.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BM.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BS.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BW.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_BZ.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_BZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CA.php deleted file mode 100644 index e656086..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CA.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Zhan Tong Zhang - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'YYYY-MM-DD', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'MMMM D, YYYY h:mm A', - 'LLLL' => 'dddd, MMMM D, YYYY h:mm A', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CC.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CH.php deleted file mode 100644 index 10d9cd8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CH.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CK.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CK.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CM.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CX.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CX.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CX.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_CY.php deleted file mode 100644 index a44c350..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_CY.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - NehaGautam - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_DE.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_DG.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DG.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_DK.php deleted file mode 100644 index 9e8a8c6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DK.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Danish Standards Association bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_DM.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_DM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_ER.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ER.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_FI.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_FJ.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FJ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_FK.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FK.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_FM.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_FM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GB.php deleted file mode 100644 index 67d9fd6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GB.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GD.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GD.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GG.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GG.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GH.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GH.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GI.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GM.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GU.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_GY.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_GY.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_HK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_HK.php deleted file mode 100644 index 34aae98..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_HK.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_IE.php deleted file mode 100644 index c8d3c2f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IE.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Martin McWhorter - * - François B - * - Chris Cartlidge - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_IL.php deleted file mode 100644 index e607924..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IL.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Yoav Amit - * - François B - * - Mayank Badola - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_IM.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_IN.php deleted file mode 100644 index 00414e9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YY', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_IO.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_IO.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ISO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_ISO.php deleted file mode 100644 index 11457b0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ISO.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'dddd, YYYY MMMM DD HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_JE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_JE.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_JE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_JM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_JM.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_JM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_KE.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_KI.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_KN.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KN.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_KY.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_KY.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_LC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_LC.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_LC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_LR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_LR.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_LR.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_LS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_LS.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_LS.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MG.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MG.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MH.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MO.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MP.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MP.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MP.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MS.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MS.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MT.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MU.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MU.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MW.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MW.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_MY.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_MY.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NA.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NA.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NF.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NF.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NG.php deleted file mode 100644 index 67bceaa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NG.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NL.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NL.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NR.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NR.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NU.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NU.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_NZ.php deleted file mode 100644 index 6a206a0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_NZ.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Mayank Badola - * - Luke McGregor - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_PG.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PG.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_PH.php deleted file mode 100644 index 34aae98..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PH.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_PK.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_PN.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PN.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_PR.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_PW.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_PW.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_RW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_RW.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_RW.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SB.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SB.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SC.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SD.php deleted file mode 100644 index c4e2557..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SD.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SE.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SG.php deleted file mode 100644 index 5ee9524..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SG.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'from_now' => 'in :time', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SH.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SH.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SI.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SI.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SL.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SL.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SS.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SS.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SX.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SX.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SX.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_SZ.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_SZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_TC.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_TK.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TK.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_TO.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TO.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_TT.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TV.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_TV.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TV.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_TZ.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_TZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_UG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_UG.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_UG.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_UM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_UM.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_UM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_US.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_US.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_US.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_VC.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_VG.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VG.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_VI.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_VU.php deleted file mode 100644 index e2dd81d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_VU.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_WS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_WS.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_WS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZA.php deleted file mode 100644 index 48ea947..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZA.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YY', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZM.php deleted file mode 100644 index d8a8cb5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZM.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ANLoc Martin Benjamin locales@africanlocalization.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZW.php deleted file mode 100644 index f086dc6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/en_ZW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/en.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/eo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/eo.php deleted file mode 100644 index 7c2efba..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/eo.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Mia Nordentoft - * - JD Isaacks - */ -return [ - 'year' => ':count jaro|:count jaroj', - 'a_year' => 'jaro|:count jaroj', - 'y' => ':count j.', - 'month' => ':count monato|:count monatoj', - 'a_month' => 'monato|:count monatoj', - 'm' => ':count mo.', - 'week' => ':count semajno|:count semajnoj', - 'a_week' => 'semajno|:count semajnoj', - 'w' => ':count sem.', - 'day' => ':count tago|:count tagoj', - 'a_day' => 'tago|:count tagoj', - 'd' => ':count t.', - 'hour' => ':count horo|:count horoj', - 'a_hour' => 'horo|:count horoj', - 'h' => ':count h.', - 'minute' => ':count minuto|:count minutoj', - 'a_minute' => 'minuto|:count minutoj', - 'min' => ':count min.', - 'second' => ':count sekundo|:count sekundoj', - 'a_second' => 'sekundoj|:count sekundoj', - 's' => ':count sek.', - 'ago' => 'antaŭ :time', - 'from_now' => 'post :time', - 'after' => ':time poste', - 'before' => ':time antaŭe', - 'diff_yesterday' => 'Hieraŭ', - 'diff_yesterday_regexp' => 'Hieraŭ(?:\\s+je)?', - 'diff_today' => 'Hodiaŭ', - 'diff_today_regexp' => 'Hodiaŭ(?:\\s+je)?', - 'diff_tomorrow' => 'Morgaŭ', - 'diff_tomorrow_regexp' => 'Morgaŭ(?:\\s+je)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'D[-a de] MMMM, YYYY', - 'LLL' => 'D[-a de] MMMM, YYYY HH:mm', - 'LLLL' => 'dddd, [la] D[-a de] MMMM, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hodiaŭ je] LT', - 'nextDay' => '[Morgaŭ je] LT', - 'nextWeek' => 'dddd [je] LT', - 'lastDay' => '[Hieraŭ je] LT', - 'lastWeek' => '[pasinta] dddd [je] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numbera', - 'meridiem' => ['a.t.m.', 'p.t.m.'], - 'months' => ['januaro', 'februaro', 'marto', 'aprilo', 'majo', 'junio', 'julio', 'aŭgusto', 'septembro', 'oktobro', 'novembro', 'decembro'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aŭg', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['dimanĉo', 'lundo', 'mardo', 'merkredo', 'ĵaŭdo', 'vendredo', 'sabato'], - 'weekdays_short' => ['dim', 'lun', 'mard', 'merk', 'ĵaŭ', 'ven', 'sab'], - 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'ĵa', 've', 'sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' kaj '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es.php deleted file mode 100644 index 1c4fcfd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - kostas - * - François B - * - Tim Fish - * - Claire Coloma - * - Steven Heinrich - * - JD Isaacks - * - Raphael Amorim - * - Jorge Y. Castillo - * - Víctor Díaz - * - Diego - * - Sebastian Thierer - * - quinterocesar - * - Daniel Commesse Liévanos (danielcommesse) - * - Pete Scopes (pdscopes) - * - gam04 - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count año|:count años', - 'a_year' => 'un año|:count años', - 'y' => ':count año|:count años', - 'month' => ':count mes|:count meses', - 'a_month' => 'un mes|:count meses', - 'm' => ':count mes|:count meses', - 'week' => ':count semana|:count semanas', - 'a_week' => 'una semana|:count semanas', - 'w' => ':countsem', - 'day' => ':count día|:count días', - 'a_day' => 'un día|:count días', - 'd' => ':countd', - 'hour' => ':count hora|:count horas', - 'a_hour' => 'una hora|:count horas', - 'h' => ':counth', - 'minute' => ':count minuto|:count minutos', - 'a_minute' => 'un minuto|:count minutos', - 'min' => ':countm', - 'second' => ':count segundo|:count segundos', - 'a_second' => 'unos segundos|:count segundos', - 's' => ':counts', - 'millisecond' => ':count milisegundo|:count milisegundos', - 'a_millisecond' => 'un milisegundo|:count milisegundos', - 'ms' => ':countms', - 'microsecond' => ':count microsegundo|:count microsegundos', - 'a_microsecond' => 'un microsegundo|:count microsegundos', - 'µs' => ':countµs', - 'ago' => 'hace :time', - 'from_now' => 'en :time', - 'after' => ':time después', - 'before' => ':time antes', - 'diff_now' => 'ahora mismo', - 'diff_today' => 'hoy', - 'diff_today_regexp' => 'hoy(?:\\s+a)?(?:\\s+las)?', - 'diff_yesterday' => 'ayer', - 'diff_yesterday_regexp' => 'ayer(?:\\s+a)?(?:\\s+las)?', - 'diff_tomorrow' => 'mañana', - 'diff_tomorrow_regexp' => 'mañana(?:\\s+a)?(?:\\s+las)?', - 'diff_before_yesterday' => 'anteayer', - 'diff_after_tomorrow' => 'pasado mañana', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [de] MMMM [de] YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY H:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => function (CarbonInterface $current) { - return '[hoy a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'nextDay' => function (CarbonInterface $current) { - return '[mañana a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'nextWeek' => function (CarbonInterface $current) { - return 'dddd [a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'lastDay' => function (CarbonInterface $current) { - return '[ayer a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'lastWeek' => function (CarbonInterface $current) { - return '[el] dddd [pasado a la'.($current->hour !== 1 ? 's' : '').'] LT'; - }, - 'sameElse' => 'L', - ], - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], - 'mmm_suffix' => '.', - 'ordinal' => ':numberº', - 'weekdays' => ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'], - 'weekdays_short' => ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'], - 'weekdays_min' => ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' y '], - 'meridiem' => ['a. m.', 'p. m.'], - 'ordinal_words' => [ - 'of' => 'de', - 'first' => 'primer', - 'second' => 'segundo', - 'third' => 'tercer', - 'fourth' => 'cuarto', - 'fifth' => 'quinto', - 'last' => 'último', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_419.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_419.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_419.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_AR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_AR.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_AR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_BO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_BO.php deleted file mode 100644 index c9b8432..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_BO.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_BR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_BR.php deleted file mode 100644 index 378d054..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_BR.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_BZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_BZ.php deleted file mode 100644 index 378d054..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_BZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_CL.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CL.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_CO.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CO.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_CR.php deleted file mode 100644 index 553fc09..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_CU.php deleted file mode 100644 index f02e1a6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_CU.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_DO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_DO.php deleted file mode 100644 index 0f855ba..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_DO.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - kostas - * - François B - * - Tim Fish - * - Chiel Robben - * - Claire Coloma - * - Steven Heinrich - * - JD Isaacks - * - Raphael Amorim - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'diff_before_yesterday' => 'anteayer', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'LLL' => 'D [de] MMMM [de] YYYY h:mm A', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY h:mm A', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_EA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_EA.php deleted file mode 100644 index f02e1a6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_EA.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_EC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_EC.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_EC.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_ES.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_ES.php deleted file mode 100644 index 19217c2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_ES.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return require __DIR__.'/es.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_GQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_GQ.php deleted file mode 100644 index f02e1a6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_GQ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_GT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_GT.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_GT.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_HN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_HN.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_HN.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_IC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_IC.php deleted file mode 100644 index f02e1a6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_IC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_MX.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_MX.php deleted file mode 100644 index 61e14cf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_MX.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'diff_before_yesterday' => 'antier', - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_NI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_NI.php deleted file mode 100644 index 6b964c1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_NI.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_PA.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PA.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_PE.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PE.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_PH.php deleted file mode 100644 index deae06a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PH.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY h:mm a', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_PR.php deleted file mode 100644 index 6b964c1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PR.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_PY.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_PY.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_SV.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_SV.php deleted file mode 100644 index 00db08e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_SV.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_US.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_US.php deleted file mode 100644 index f333136..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_US.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - Josh Soref - * - Jørn Ølmheim - * - Craig Patik - * - bustta - * - François B - * - Tim Fish - * - Claire Coloma - * - Steven Heinrich - * - JD Isaacks - * - Raphael Amorim - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'diff_before_yesterday' => 'anteayer', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'MM/DD/YYYY', - 'LL' => 'MMMM [de] D [de] YYYY', - 'LLL' => 'MMMM [de] D [de] YYYY h:mm A', - 'LLLL' => 'dddd, MMMM [de] D [de] YYYY h:mm A', - ], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_UY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_UY.php deleted file mode 100644 index 39baff8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_UY.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'setiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'set', 'oct', 'nov', 'dic'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/es_VE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/es_VE.php deleted file mode 100644 index a74806e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/es_VE.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/es.php', [ - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/et.php b/dependencies/nesbot/carbon/src/Carbon/Lang/et.php deleted file mode 100644 index f49c880..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/et.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Andres Ivanov - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - RM87 - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Esko Lehtme - * - Mart Karu - * - Nicolás Hock Isaza - * - Kevin Valdek - * - Zahhar Kirillov - * - João Magalhães - * - Ingmar - * - Illimar Tambek - * - Mihkel - */ -return [ - 'year' => ':count aasta|:count aastat', - 'y' => ':count a', - 'month' => ':count kuu|:count kuud', - 'm' => ':count k', - 'week' => ':count nädal|:count nädalat', - 'w' => ':count näd', - 'day' => ':count päev|:count päeva', - 'd' => ':count p', - 'hour' => ':count tund|:count tundi', - 'h' => ':count t', - 'minute' => ':count minut|:count minutit', - 'min' => ':count min', - 'second' => ':count sekund|:count sekundit', - 's' => ':count s', - 'ago' => ':time tagasi', - 'from_now' => ':time pärast', - 'after' => ':time pärast', - 'before' => ':time enne', - 'year_from_now' => ':count aasta', - 'month_from_now' => ':count kuu', - 'week_from_now' => ':count nädala', - 'day_from_now' => ':count päeva', - 'hour_from_now' => ':count tunni', - 'minute_from_now' => ':count minuti', - 'second_from_now' => ':count sekundi', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'diff_now' => 'nüüd', - 'diff_today' => 'täna', - 'diff_yesterday' => 'eile', - 'diff_tomorrow' => 'homme', - 'diff_before_yesterday' => 'üleeile', - 'diff_after_tomorrow' => 'ülehomme', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[täna] LT', - 'nextDay' => '[homme] LT', - 'lastDay' => '[eile] LT', - 'nextWeek' => 'dddd LT', - 'lastWeek' => '[eelmine] dddd LT', - 'sameElse' => 'L', - ], - 'months' => ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'], - 'months_short' => ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'], - 'weekdays' => ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'], - 'weekdays_short' => ['P', 'E', 'T', 'K', 'N', 'R', 'L'], - 'weekdays_min' => ['P', 'E', 'T', 'K', 'N', 'R', 'L'], - 'list' => [', ', ' ja '], - 'meridiem' => ['enne lõunat', 'pärast lõunat'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/et_EE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/et_EE.php deleted file mode 100644 index 0f112b3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/et_EE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/et.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/eu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/eu.php deleted file mode 100644 index a543f1a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/eu.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - JD Isaacks - */ -return [ - 'year' => 'urte bat|:count urte', - 'y' => 'Urte 1|:count urte', - 'month' => 'hilabete bat|:count hilabete', - 'm' => 'Hile 1|:count hile', - 'week' => 'Aste 1|:count aste', - 'w' => 'Aste 1|:count aste', - 'day' => 'egun bat|:count egun', - 'd' => 'Egun 1|:count egun', - 'hour' => 'ordu bat|:count ordu', - 'h' => 'Ordu 1|:count ordu', - 'minute' => 'minutu bat|:count minutu', - 'min' => 'Minutu 1|:count minutu', - 'second' => 'segundo batzuk|:count segundo', - 's' => 'Segundu 1|:count segundu', - 'ago' => 'duela :time', - 'from_now' => ':time barru', - 'after' => ':time geroago', - 'before' => ':time lehenago', - 'diff_now' => 'orain', - 'diff_today' => 'gaur', - 'diff_yesterday' => 'atzo', - 'diff_tomorrow' => 'bihar', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY[ko] MMMM[ren] D[a]', - 'LLL' => 'YYYY[ko] MMMM[ren] D[a] HH:mm', - 'LLLL' => 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[gaur] LT[etan]', - 'nextDay' => '[bihar] LT[etan]', - 'nextWeek' => 'dddd LT[etan]', - 'lastDay' => '[atzo] LT[etan]', - 'lastWeek' => '[aurreko] dddd LT[etan]', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['urtarrila', 'otsaila', 'martxoa', 'apirila', 'maiatza', 'ekaina', 'uztaila', 'abuztua', 'iraila', 'urria', 'azaroa', 'abendua'], - 'months_short' => ['urt.', 'ots.', 'mar.', 'api.', 'mai.', 'eka.', 'uzt.', 'abu.', 'ira.', 'urr.', 'aza.', 'abe.'], - 'weekdays' => ['igandea', 'astelehena', 'asteartea', 'asteazkena', 'osteguna', 'ostirala', 'larunbata'], - 'weekdays_short' => ['ig.', 'al.', 'ar.', 'az.', 'og.', 'ol.', 'lr.'], - 'weekdays_min' => ['ig', 'al', 'ar', 'az', 'og', 'ol', 'lr'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' eta '], - 'meridiem' => ['g', 'a'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/eu_ES.php b/dependencies/nesbot/carbon/src/Carbon/Lang/eu_ES.php deleted file mode 100644 index 0d1e82a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/eu_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/eu.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ewo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ewo.php deleted file mode 100644 index 7808ab5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ewo.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['kíkíríg', 'ngəgógəle'], - 'weekdays' => ['sɔ́ndɔ', 'mɔ́ndi', 'sɔ́ndɔ məlú mə́bɛ̌', 'sɔ́ndɔ məlú mə́lɛ́', 'sɔ́ndɔ məlú mə́nyi', 'fúladé', 'séradé'], - 'weekdays_short' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'], - 'weekdays_min' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'], - 'months' => ['ngɔn osú', 'ngɔn bɛ̌', 'ngɔn lála', 'ngɔn nyina', 'ngɔn tána', 'ngɔn saməna', 'ngɔn zamgbála', 'ngɔn mwom', 'ngɔn ebulú', 'ngɔn awóm', 'ngɔn awóm ai dziá', 'ngɔn awóm ai bɛ̌'], - 'months_short' => ['ngo', 'ngb', 'ngl', 'ngn', 'ngt', 'ngs', 'ngz', 'ngm', 'nge', 'nga', 'ngad', 'ngab'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - // Too unreliable - /* - 'year' => ':count mbu', // less reliable - 'y' => ':count mbu', // less reliable - 'a_year' => ':count mbu', // less reliable - - 'month' => ':count ngòn', // less reliable - 'm' => ':count ngòn', // less reliable - 'a_month' => ':count ngòn', // less reliable - - 'week' => ':count mësë', // less reliable - 'w' => ':count mësë', // less reliable - 'a_week' => ':count mësë', // less reliable - - 'day' => ':count mësë', // less reliable - 'd' => ':count mësë', // less reliable - 'a_day' => ':count mësë', // less reliable - - 'hour' => ':count awola', // less reliable - 'h' => ':count awola', // less reliable - 'a_hour' => ':count awola', // less reliable - - 'minute' => ':count awola', // less reliable - 'min' => ':count awola', // less reliable - 'a_minute' => ':count awola', // less reliable - */ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fa.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fa.php deleted file mode 100644 index 72e0308..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fa.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Nasser Ghiasi - * - JD Isaacks - * - Hossein Jabbari - * - nimamo - * - hafezdivandari - * - Hassan Pezeshk (hpez) - */ -return [ - 'year' => ':count سال', - 'a_year' => 'یک سال'.'|:count '.'سال', - 'y' => ':count سال', - 'month' => ':count ماه', - 'a_month' => 'یک ماه'.'|:count '.'ماه', - 'm' => ':count ماه', - 'week' => ':count هفته', - 'a_week' => 'یک هفته'.'|:count '.'هفته', - 'w' => ':count هفته', - 'day' => ':count روز', - 'a_day' => 'یک روز'.'|:count '.'روز', - 'd' => ':count روز', - 'hour' => ':count ساعت', - 'a_hour' => 'یک ساعت'.'|:count '.'ساعت', - 'h' => ':count ساعت', - 'minute' => ':count دقیقه', - 'a_minute' => 'یک دقیقه'.'|:count '.'دقیقه', - 'min' => ':count دقیقه', - 'second' => ':count ثانیه', - 's' => ':count ثانیه', - 'ago' => ':time پیش', - 'from_now' => ':time دیگر', - 'after' => ':time پس از', - 'before' => ':time پیش از', - 'diff_now' => 'اکنون', - 'diff_today' => 'امروز', - 'diff_today_regexp' => 'امروز(?:\\s+ساعت)?', - 'diff_yesterday' => 'دیروز', - 'diff_yesterday_regexp' => 'دیروز(?:\\s+ساعت)?', - 'diff_tomorrow' => 'فردا', - 'diff_tomorrow_regexp' => 'فردا(?:\\s+ساعت)?', - 'formats' => [ - 'LT' => 'OH:Om', - 'LTS' => 'OH:Om:Os', - 'L' => 'OD/OM/OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY OH:Om', - 'LLLL' => 'dddd, OD MMMM OY OH:Om', - ], - 'calendar' => [ - 'sameDay' => '[امروز ساعت] LT', - 'nextDay' => '[فردا ساعت] LT', - 'nextWeek' => 'dddd [ساعت] LT', - 'lastDay' => '[دیروز ساعت] LT', - 'lastWeek' => 'dddd [پیش] [ساعت] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':timeم', - 'meridiem' => ['قبل از ظهر', 'بعد از ظهر'], - 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], - 'weekdays_short' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], - 'weekdays_min' => ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'list' => ['، ', ' و '], - 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰۴', '۰۵', '۰۶', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱۴', '۱۵', '۱۶', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲۴', '۲۵', '۲۶', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳۴', '۳۵', '۳۶', '۳۷', '۳۸', '۳۹', '۴۰', '۴۱', '۴۲', '۴۳', '۴۴', '۴۵', '۴۶', '۴۷', '۴۸', '۴۹', '۵۰', '۵۱', '۵۲', '۵۳', '۵۴', '۵۵', '۵۶', '۵۷', '۵۸', '۵۹', '۶۰', '۶۱', '۶۲', '۶۳', '۶۴', '۶۵', '۶۶', '۶۷', '۶۸', '۶۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷۴', '۷۵', '۷۶', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸۴', '۸۵', '۸۶', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹۴', '۹۵', '۹۶', '۹۷', '۹۸', '۹۹'], - 'months_short_standalone' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'weekend' => [5, 5], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fa_AF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fa_AF.php deleted file mode 100644 index 6947100..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fa_AF.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fa.php', [ - 'meridiem' => ['ق', 'ب'], - 'weekend' => [4, 5], - 'formats' => [ - 'L' => 'OY/OM/OD', - 'LL' => 'OD MMM OY', - 'LLL' => 'OD MMMM OY،‏ H:mm', - 'LLLL' => 'dddd OD MMMM OY،‏ H:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fa_IR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fa_IR.php deleted file mode 100644 index 08d0182..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fa_IR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fa.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ff.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ff.php deleted file mode 100644 index 9525c95..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ff.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'months' => ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'], - 'months_short' => ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'], - 'weekdays' => ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'], - 'weekdays_short' => ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'], - 'weekdays_min' => ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['subaka', 'kikiiɗe'], - - 'year' => ':count baret', // less reliable - 'y' => ':count baret', // less reliable - 'a_year' => ':count baret', // less reliable - - 'month' => ':count lewru', // less reliable - 'm' => ':count lewru', // less reliable - 'a_month' => ':count lewru', // less reliable - - 'week' => ':count naange', // less reliable - 'w' => ':count naange', // less reliable - 'a_week' => ':count naange', // less reliable - - 'day' => ':count dian', // less reliable - 'd' => ':count dian', // less reliable - 'a_day' => ':count dian', // less reliable - - 'hour' => ':count montor', // less reliable - 'h' => ':count montor', // less reliable - 'a_hour' => ':count montor', // less reliable - - 'minute' => ':count tokossuoum', // less reliable - 'min' => ':count tokossuoum', // less reliable - 'a_minute' => ':count tokossuoum', // less reliable - - 'second' => ':count tenen', // less reliable - 's' => ':count tenen', // less reliable - 'a_second' => ':count tenen', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_CM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ff_CM.php deleted file mode 100644 index b797ac0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_CM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ff.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_GN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ff_GN.php deleted file mode 100644 index b797ac0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_GN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ff.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_MR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ff_MR.php deleted file mode 100644 index 2f4c29f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_MR.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ff.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_SN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ff_SN.php deleted file mode 100644 index 1e4c8b6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ff_SN.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pular-Fulfulde.org Ibrahima Sarr admin@pulaar-fulfulde.org - */ -return require __DIR__.'/ff.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fi.php deleted file mode 100644 index edf2d6d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fi.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Janne Warén - * - digitalfrost - * - Tsutomu Kuroda - * - Roope Salmi - * - tjku - * - Max Melentiev - * - Sami Haahtinen - * - Teemu Leisti - * - Artem Ignatyev - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Robert Bjarnason - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Tom Hughes - * - Sven Fuchs - * - Petri Kivikangas - * - Nizar Jouini - * - Marko Seppae - * - Tomi Mynttinen (Pikseli) - * - Petteri (powergrip) - */ -return [ - 'year' => ':count vuosi|:count vuotta', - 'y' => ':count v', - 'month' => ':count kuukausi|:count kuukautta', - 'm' => ':count kk', - 'week' => ':count viikko|:count viikkoa', - 'w' => ':count vk', - 'day' => ':count päivä|:count päivää', - 'd' => ':count pv', - 'hour' => ':count tunti|:count tuntia', - 'h' => ':count t', - 'minute' => ':count minuutti|:count minuuttia', - 'min' => ':count min', - 'second' => ':count sekunti|:count sekuntia', - 'a_second' => 'muutama sekunti|:count sekuntia', - 's' => ':count s', - 'ago' => ':time sitten', - 'from_now' => ':time päästä', - 'year_from_now' => ':count vuoden', - 'month_from_now' => ':count kuukauden', - 'week_from_now' => ':count viikon', - 'day_from_now' => ':count päivän', - 'hour_from_now' => ':count tunnin', - 'minute_from_now' => ':count minuutin', - 'second_from_now' => ':count sekunnin', - 'after' => ':time sen jälkeen', - 'before' => ':time ennen', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ja '], - 'diff_now' => 'nyt', - 'diff_yesterday' => 'eilen', - 'diff_tomorrow' => 'huomenna', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm:ss', - 'L' => 'D.M.YYYY', - 'LL' => 'dddd D. MMMM[ta] YYYY', - 'll' => 'ddd D. MMM YYYY', - 'LLL' => 'D.MM. HH.mm', - 'LLLL' => 'D. MMMM[ta] YYYY HH.mm', - 'llll' => 'D. MMM YY HH.mm', - ], - 'weekdays' => ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'], - 'weekdays_short' => ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], - 'weekdays_min' => ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], - 'months' => ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'], - 'months_short' => ['tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'], - 'meridiem' => ['aamupäivä', 'iltapäivä'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fi_FI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fi_FI.php deleted file mode 100644 index 920f1ca..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fi_FI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fi.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fil.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fil.php deleted file mode 100644 index 61114e3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fil.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/fil_PH.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fil_PH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fil_PH.php deleted file mode 100644 index bcf1580..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fil_PH.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rene Torres Rene Torres, Pablo Saratxaga rgtorre@rocketmail.com, pablo@mandrakesoft.com - * - Jaycee Mariano (alohajaycee) - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YY', - ], - 'months' => ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'], - 'months_short' => ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'], - 'weekdays' => ['Linggo', 'Lunes', 'Martes', 'Miyerkoles', 'Huwebes', 'Biyernes', 'Sabado'], - 'weekdays_short' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], - 'weekdays_min' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['N.U.', 'N.H.'], - - 'before' => ':time bago', - 'after' => ':time pagkatapos', - - 'year' => ':count taon', - 'y' => ':count taon', - 'a_year' => ':count taon', - - 'month' => ':count buwan', - 'm' => ':count buwan', - 'a_month' => ':count buwan', - - 'week' => ':count linggo', - 'w' => ':count linggo', - 'a_week' => ':count linggo', - - 'day' => ':count araw', - 'd' => ':count araw', - 'a_day' => ':count araw', - - 'hour' => ':count oras', - 'h' => ':count oras', - 'a_hour' => ':count oras', - - 'minute' => ':count minuto', - 'min' => ':count minuto', - 'a_minute' => ':count minuto', - - 'second' => ':count segundo', - 's' => ':count segundo', - 'a_second' => ':count segundo', - - 'ago' => ':time ang nakalipas', - 'from_now' => 'sa :time', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fo.php deleted file mode 100644 index 6a14a6f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fo.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kristian Sakarisson - * - François B - * - JD Isaacks - * - Sverri Mohr Olsen - */ -return [ - 'year' => 'eitt ár|:count ár', - 'y' => ':count ár|:count ár', - 'month' => 'ein mánaði|:count mánaðir', - 'm' => ':count mánaður|:count mánaðir', - 'week' => ':count vika|:count vikur', - 'w' => ':count vika|:count vikur', - 'day' => 'ein dagur|:count dagar', - 'd' => ':count dag|:count dagar', - 'hour' => 'ein tími|:count tímar', - 'h' => ':count tími|:count tímar', - 'minute' => 'ein minutt|:count minuttir', - 'min' => ':count minutt|:count minuttir', - 'second' => 'fá sekund|:count sekundir', - 's' => ':count sekund|:count sekundir', - 'ago' => ':time síðani', - 'from_now' => 'um :time', - 'after' => ':time aftaná', - 'before' => ':time áðrenn', - 'diff_today' => 'Í', - 'diff_yesterday' => 'Í', - 'diff_yesterday_regexp' => 'Í(?:\\s+gjár)?(?:\\s+kl.)?', - 'diff_tomorrow' => 'Í', - 'diff_tomorrow_regexp' => 'Í(?:\\s+morgin)?(?:\\s+kl.)?', - 'diff_today_regexp' => 'Í(?:\\s+dag)?(?:\\s+kl.)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D. MMMM, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Í dag kl.] LT', - 'nextDay' => '[Í morgin kl.] LT', - 'nextWeek' => 'dddd [kl.] LT', - 'lastDay' => '[Í gjár kl.] LT', - 'lastWeek' => '[síðstu] dddd [kl] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mars', 'apríl', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['sunnudagur', 'mánadagur', 'týsdagur', 'mikudagur', 'hósdagur', 'fríggjadagur', 'leygardagur'], - 'weekdays_short' => ['sun', 'mán', 'týs', 'mik', 'hós', 'frí', 'ley'], - 'weekdays_min' => ['su', 'má', 'tý', 'mi', 'hó', 'fr', 'le'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fo_DK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fo_DK.php deleted file mode 100644 index 657f2c5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fo_DK.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fo.php', [ - 'formats' => [ - 'L' => 'DD.MM.yy', - 'LL' => 'DD.MM.YYYY', - 'LLL' => 'D. MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY, HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fo_FO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fo_FO.php deleted file mode 100644 index 6d73616..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fo_FO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fo.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr.php deleted file mode 100644 index f4c7247..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dieter Sting - * - François B - * - Maxime VALY - * - JD Isaacks - * - Dieter Sting - * - François B - * - JD Isaacks - * - Sebastian Thierer - * - Fastfuel - * - Pete Scopes (pdscopes) - */ -return [ - 'year' => ':count an|:count ans', - 'a_year' => 'un an|:count ans', - 'y' => ':count an|:count ans', - 'month' => ':count mois|:count mois', - 'a_month' => 'un mois|:count mois', - 'm' => ':count mois', - 'week' => ':count semaine|:count semaines', - 'a_week' => 'une semaine|:count semaines', - 'w' => ':count sem.', - 'day' => ':count jour|:count jours', - 'a_day' => 'un jour|:count jours', - 'd' => ':count j', - 'hour' => ':count heure|:count heures', - 'a_hour' => 'une heure|:count heures', - 'h' => ':count h', - 'minute' => ':count minute|:count minutes', - 'a_minute' => 'une minute|:count minutes', - 'min' => ':count min', - 'second' => ':count seconde|:count secondes', - 'a_second' => 'quelques secondes|:count secondes', - 's' => ':count s', - 'millisecond' => ':count milliseconde|:count millisecondes', - 'a_millisecond' => 'une milliseconde|:count millisecondes', - 'ms' => ':countms', - 'microsecond' => ':count microseconde|:count microsecondes', - 'a_microsecond' => 'une microseconde|:count microsecondes', - 'µs' => ':countµs', - 'ago' => 'il y a :time', - 'from_now' => 'dans :time', - 'after' => ':time après', - 'before' => ':time avant', - 'diff_now' => "à l'instant", - 'diff_today' => "aujourd'hui", - 'diff_today_regexp' => "aujourd'hui(?:\s+à)?", - 'diff_yesterday' => 'hier', - 'diff_yesterday_regexp' => 'hier(?:\s+à)?', - 'diff_tomorrow' => 'demain', - 'diff_tomorrow_regexp' => 'demain(?:\s+à)?', - 'diff_before_yesterday' => 'avant-hier', - 'diff_after_tomorrow' => 'après-demain', - 'period_recurrences' => ':count fois', - 'period_interval' => 'tous les :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'à :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Aujourd’hui à] LT', - 'nextDay' => '[Demain à] LT', - 'nextWeek' => 'dddd [à] LT', - 'lastDay' => '[Hier à] LT', - 'lastWeek' => 'dddd [dernier à] LT', - 'sameElse' => 'L', - ], - 'months' => ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], - 'months_short' => ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'], - 'weekdays' => ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], - 'weekdays_short' => ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'], - 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'], - 'ordinal' => function ($number, $period) { - switch ($period) { - // In French, only the first has to be ordinal, other number remains cardinal - // @link https://fr.wikihow.com/%C3%A9crire-la-date-en-fran%C3%A7ais - case 'D': - return $number.($number === 1 ? 'er' : ''); - - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - return $number.($number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return $number.($number === 1 ? 're' : 'e'); - } - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' et '], - 'ordinal_words' => [ - 'of' => 'de', - 'first' => 'premier', - 'second' => 'deuxième', - 'third' => 'troisième', - 'fourth' => 'quatrième', - 'fifth' => 'cinquième', - 'last' => 'dernier', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BE.php deleted file mode 100644 index f6cafe8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BE.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'months_short' => ['jan', 'fév', 'mar', 'avr', 'mai', 'jun', 'jui', 'aoû', 'sep', 'oct', 'nov', 'déc'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BF.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BI.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BJ.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BJ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BL.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_BL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CA.php deleted file mode 100644 index c9f6346..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CA.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dieter Sting - * - François B - * - Maxime VALY - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CD.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CD.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CF.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CG.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CH.php deleted file mode 100644 index 8674c27..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CH.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dieter Sting - * - François B - * - Gaspard Bucher - * - Maxime VALY - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CI.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CM.php deleted file mode 100644 index 67d3787..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_CM.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'meridiem' => ['mat.', 'soir'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_DJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_DJ.php deleted file mode 100644 index 2f06086..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_DJ.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_DZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_DZ.php deleted file mode 100644 index ae8db5f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_DZ.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_FR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_FR.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_FR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GA.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GF.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GN.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GP.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GP.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GQ.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_GQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_HT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_HT.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_HT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_KM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_KM.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_KM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_LU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_LU.php deleted file mode 100644 index 8e37d85..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_LU.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months_short' => ['jan', 'fév', 'mar', 'avr', 'mai', 'jun', 'jui', 'aoû', 'sep', 'oct', 'nov', 'déc'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MA.php deleted file mode 100644 index 1bf034d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MA.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MC.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MF.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MG.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_ML.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_ML.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_ML.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MQ.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MR.php deleted file mode 100644 index 37cf83f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MR.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MU.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_MU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_NC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_NC.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_NC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_NE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_NE.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_NE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_PF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_PF.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_PF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_PM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_PM.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_PM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_RE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_RE.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_RE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_RW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_RW.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_RW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SC.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SC.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SN.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SY.php deleted file mode 100644 index ae8db5f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_SY.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TD.php deleted file mode 100644 index 37cf83f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TD.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TG.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TN.php deleted file mode 100644 index 6905e7a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_TN.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_VU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_VU.php deleted file mode 100644 index 37cf83f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_VU.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fr.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_WF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_WF.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_WF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_YT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fr_YT.php deleted file mode 100644 index ec3ee35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fr_YT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/fr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fur.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fur.php deleted file mode 100644 index 36c2564..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fur.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/fur_IT.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fur_IT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fur_IT.php deleted file mode 100644 index 0147a59..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fur_IT.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandrakesoft.com - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD. MM. YY', - 'LL' => 'DD di MMMM dal YYYY', - 'LLL' => 'DD di MMM HH:mm', - 'LLLL' => 'DD di MMMM dal YYYY HH:mm', - ], - 'months' => ['zenâr', 'fevrâr', 'març', 'avrîl', 'mai', 'jugn', 'lui', 'avost', 'setembar', 'otubar', 'novembar', 'dicembar'], - 'months_short' => ['zen', 'fev', 'mar', 'avr', 'mai', 'jug', 'lui', 'avo', 'set', 'otu', 'nov', 'dic'], - 'weekdays' => ['domenie', 'lunis', 'martars', 'miercus', 'joibe', 'vinars', 'sabide'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'], - 'weekdays_min' => ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'year' => ':count an', - 'month' => ':count mês', - 'week' => ':count setemane', - 'day' => ':count zornade', - 'hour' => ':count ore', - 'minute' => ':count minût', - 'second' => ':count secont', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fy.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fy.php deleted file mode 100644 index c1b5439..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fy.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Tim Fish - * - JD Isaacks - */ -return [ - 'year' => ':count jier|:count jierren', - 'a_year' => 'ien jier|:count jierren', - 'y' => ':count j', - 'month' => ':count moanne|:count moannen', - 'a_month' => 'ien moanne|:count moannen', - 'm' => ':count moa.', - 'week' => ':count wike|:count wiken', - 'a_week' => 'in wike|:count wiken', - 'a' => ':count w.', - 'day' => ':count dei|:count dagen', - 'a_day' => 'ien dei|:count dagen', - 'd' => ':count d.', - 'hour' => ':count oere|:count oeren', - 'a_hour' => 'ien oere|:count oeren', - 'h' => ':count o.', - 'minute' => ':count minút|:count minuten', - 'a_minute' => 'ien minút|:count minuten', - 'min' => ':count min.', - 'second' => ':count sekonde|:count sekonden', - 'a_second' => 'in pear sekonden|:count sekonden', - 's' => ':count s.', - 'ago' => ':time lyn', - 'from_now' => 'oer :time', - 'diff_yesterday' => 'juster', - 'diff_yesterday_regexp' => 'juster(?:\\s+om)?', - 'diff_today' => 'hjoed', - 'diff_today_regexp' => 'hjoed(?:\\s+om)?', - 'diff_tomorrow' => 'moarn', - 'diff_tomorrow_regexp' => 'moarn(?:\\s+om)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[hjoed om] LT', - 'nextDay' => '[moarn om] LT', - 'nextWeek' => 'dddd [om] LT', - 'lastDay' => '[juster om] LT', - 'lastWeek' => '[ôfrûne] dddd [om] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); - }, - 'months' => ['jannewaris', 'febrewaris', 'maart', 'april', 'maaie', 'juny', 'july', 'augustus', 'septimber', 'oktober', 'novimber', 'desimber'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'mmm_suffix' => '.', - 'weekdays' => ['snein', 'moandei', 'tiisdei', 'woansdei', 'tongersdei', 'freed', 'sneon'], - 'weekdays_short' => ['si.', 'mo.', 'ti.', 'wo.', 'to.', 'fr.', 'so.'], - 'weekdays_min' => ['Si', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' en '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fy_DE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fy_DE.php deleted file mode 100644 index 8559d5c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fy_DE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Jaunuwoa', 'Februwoa', 'Moaz', 'Aprell', 'Mai', 'Juni', 'Juli', 'August', 'Septamba', 'Oktoba', 'Nowamba', 'Dezamba'], - 'months_short' => ['Jan', 'Feb', 'Moz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Now', 'Dez'], - 'weekdays' => ['Sinndag', 'Mondag', 'Dingsdag', 'Meddwäakj', 'Donnadag', 'Friedag', 'Sinnowend'], - 'weekdays_short' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'weekdays_min' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/fy_NL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/fy_NL.php deleted file mode 100644 index 01cc96c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/fy_NL.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/fy.php', [ - 'formats' => [ - 'L' => 'DD-MM-YY', - ], - 'months' => ['Jannewaris', 'Febrewaris', 'Maart', 'April', 'Maaie', 'Juny', 'July', 'Augustus', 'Septimber', 'Oktober', 'Novimber', 'Desimber'], - 'months_short' => ['Jan', 'Feb', 'Mrt', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Snein', 'Moandei', 'Tiisdei', 'Woansdei', 'Tongersdei', 'Freed', 'Sneon'], - 'weekdays_short' => ['Sn', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'Sn'], - 'weekdays_min' => ['Sn', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'Sn'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ga.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ga.php deleted file mode 100644 index 9f07a26..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ga.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Thanks to André Silva : https://github.com/askpt - */ - -return [ - 'year' => ':count bliain', - 'a_year' => '{1}bliain|:count bliain', - 'y' => ':countb', - 'month' => ':count mí', - 'a_month' => '{1}mí|:count mí', - 'm' => ':countm', - 'week' => ':count sheachtain', - 'a_week' => '{1}sheachtain|:count sheachtain', - 'w' => ':countsh', - 'day' => ':count lá', - 'a_day' => '{1}lá|:count lá', - 'd' => ':countl', - 'hour' => ':count uair an chloig', - 'a_hour' => '{1}uair an chloig|:count uair an chloig', - 'h' => ':countu', - 'minute' => ':count nóiméad', - 'a_minute' => '{1}nóiméad|:count nóiméad', - 'min' => ':countn', - 'second' => ':count soicind', - 'a_second' => '{1}cúpla soicind|:count soicind', - 's' => ':countso', - 'ago' => ':time ó shin', - 'from_now' => 'i :time', - 'after' => ':time tar éis', - 'before' => ':time roimh', - 'diff_now' => 'anois', - 'diff_today' => 'Inniu', - 'diff_today_regexp' => 'Inniu(?:\\s+ag)?', - 'diff_yesterday' => 'inné', - 'diff_yesterday_regexp' => 'Inné(?:\\s+aig)?', - 'diff_tomorrow' => 'amárach', - 'diff_tomorrow_regexp' => 'Amárach(?:\\s+ag)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Inniu ag] LT', - 'nextDay' => '[Amárach ag] LT', - 'nextWeek' => 'dddd [ag] LT', - 'lastDay' => '[Inné aig] LT', - 'lastWeek' => 'dddd [seo caite] [ag] LT', - 'sameElse' => 'L', - ], - 'months' => ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig'], - 'months_short' => ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll'], - 'weekdays' => ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn'], - 'weekdays_short' => ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat'], - 'weekdays_min' => ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa'], - 'ordinal' => function ($number) { - return $number.($number === 1 ? 'd' : ($number % 10 === 2 ? 'na' : 'mh')); - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' agus '], - 'meridiem' => ['r.n.', 'i.n.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ga_IE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ga_IE.php deleted file mode 100644 index 57b0c4f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ga_IE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ga.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gd.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gd.php deleted file mode 100644 index 63d064d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gd.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Jon Ashdown - */ -return [ - 'year' => ':count bliadhna', - 'a_year' => '{1}bliadhna|:count bliadhna', - 'y' => ':count b.', - 'month' => ':count mìosan', - 'a_month' => '{1}mìos|:count mìosan', - 'm' => ':count ms.', - 'week' => ':count seachdainean', - 'a_week' => '{1}seachdain|:count seachdainean', - 'w' => ':count s.', - 'day' => ':count latha', - 'a_day' => '{1}latha|:count latha', - 'd' => ':count l.', - 'hour' => ':count uairean', - 'a_hour' => '{1}uair|:count uairean', - 'h' => ':count u.', - 'minute' => ':count mionaidean', - 'a_minute' => '{1}mionaid|:count mionaidean', - 'min' => ':count md.', - 'second' => ':count diogan', - 'a_second' => '{1}beagan diogan|:count diogan', - 's' => ':count d.', - 'ago' => 'bho chionn :time', - 'from_now' => 'ann an :time', - 'diff_yesterday' => 'An-dè', - 'diff_yesterday_regexp' => 'An-dè(?:\\s+aig)?', - 'diff_today' => 'An-diugh', - 'diff_today_regexp' => 'An-diugh(?:\\s+aig)?', - 'diff_tomorrow' => 'A-màireach', - 'diff_tomorrow_regexp' => 'A-màireach(?:\\s+aig)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[An-diugh aig] LT', - 'nextDay' => '[A-màireach aig] LT', - 'nextWeek' => 'dddd [aig] LT', - 'lastDay' => '[An-dè aig] LT', - 'lastWeek' => 'dddd [seo chaidh] [aig] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - return $number.($number === 1 ? 'd' : ($number % 10 === 2 ? 'na' : 'mh')); - }, - 'months' => ['Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'], - 'months_short' => ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'], - 'weekdays' => ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'], - 'weekdays_short' => ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'], - 'weekdays_min' => ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' agus '], - 'meridiem' => ['m', 'f'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gd_GB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gd_GB.php deleted file mode 100644 index 4fc26b3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gd_GB.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gd.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gez.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gez.php deleted file mode 100644 index b8a2f0e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gez.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/gez_ER.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gez_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gez_ER.php deleted file mode 100644 index f19d1df..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gez_ER.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጠሐረ', 'ከተተ', 'መገበ', 'አኀዘ', 'ግንባት', 'ሠንየ', 'ሐመለ', 'ነሐሰ', 'ከረመ', 'ጠቀመ', 'ኀደረ', 'ኀሠሠ'], - 'months_short' => ['ጠሐረ', 'ከተተ', 'መገበ', 'አኀዘ', 'ግንባ', 'ሠንየ', 'ሐመለ', 'ነሐሰ', 'ከረመ', 'ጠቀመ', 'ኀደረ', 'ኀሠሠ'], - 'weekdays' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚት'], - 'weekdays_short' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'weekdays_min' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ጽባሕ', 'ምሴት'], - - 'month' => ':count ወርሕ', // less reliable - 'm' => ':count ወርሕ', // less reliable - 'a_month' => ':count ወርሕ', // less reliable - - 'week' => ':count ሰብዑ', // less reliable - 'w' => ':count ሰብዑ', // less reliable - 'a_week' => ':count ሰብዑ', // less reliable - - 'hour' => ':count አንትሙ', // less reliable - 'h' => ':count አንትሙ', // less reliable - 'a_hour' => ':count አንትሙ', // less reliable - - 'minute' => ':count ንኡስ', // less reliable - 'min' => ':count ንኡስ', // less reliable - 'a_minute' => ':count ንኡስ', // less reliable - - 'year' => ':count ዓመት', - 'y' => ':count ዓመት', - 'a_year' => ':count ዓመት', - - 'day' => ':count ዕለት', - 'd' => ':count ዕለት', - 'a_day' => ':count ዕለት', - - 'second' => ':count ካልእ', - 's' => ':count ካልእ', - 'a_second' => ':count ካልእ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gez_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gez_ET.php deleted file mode 100644 index 3933009..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gez_ET.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚት'], - 'weekdays_short' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'weekdays_min' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ጽባሕ', 'ምሴት'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gl.php deleted file mode 100644 index 088b0f2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gl.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Fidel Pita - * - JD Isaacks - * - Diego Vilariño - * - Sebastian Thierer - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count ano|:count anos', - 'a_year' => 'un ano|:count anos', - 'y' => ':count a.', - 'month' => ':count mes|:count meses', - 'a_month' => 'un mes|:count meses', - 'm' => ':count mes.', - 'week' => ':count semana|:count semanas', - 'a_week' => 'unha semana|:count semanas', - 'w' => ':count sem.', - 'day' => ':count día|:count días', - 'a_day' => 'un día|:count días', - 'd' => ':count d.', - 'hour' => ':count hora|:count horas', - 'a_hour' => 'unha hora|:count horas', - 'h' => ':count h.', - 'minute' => ':count minuto|:count minutos', - 'a_minute' => 'un minuto|:count minutos', - 'min' => ':count min.', - 'second' => ':count segundo|:count segundos', - 'a_second' => 'uns segundos|:count segundos', - 's' => ':count seg.', - 'ago' => 'hai :time', - 'from_now' => function ($time) { - if (str_starts_with($time, 'un')) { - return "n$time"; - } - - return "en $time"; - }, - 'diff_now' => 'agora', - 'diff_today' => 'hoxe', - 'diff_today_regexp' => 'hoxe(?:\\s+ás)?', - 'diff_yesterday' => 'onte', - 'diff_yesterday_regexp' => 'onte(?:\\s+á)?', - 'diff_tomorrow' => 'mañá', - 'diff_tomorrow_regexp' => 'mañá(?:\\s+ás)?', - 'after' => ':time despois', - 'before' => ':time antes', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [de] MMMM [de] YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY H:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => function (CarbonInterface $current) { - return '[hoxe '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'nextDay' => function (CarbonInterface $current) { - return '[mañá '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'nextWeek' => function (CarbonInterface $current) { - return 'dddd ['.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'lastDay' => function (CarbonInterface $current) { - return '[onte '.($current->hour !== 1 ? 'á' : 'a').'] LT'; - }, - 'lastWeek' => function (CarbonInterface $current) { - return '[o] dddd [pasado '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['xaneiro', 'febreiro', 'marzo', 'abril', 'maio', 'xuño', 'xullo', 'agosto', 'setembro', 'outubro', 'novembro', 'decembro'], - 'months_short' => ['xan.', 'feb.', 'mar.', 'abr.', 'mai.', 'xuñ.', 'xul.', 'ago.', 'set.', 'out.', 'nov.', 'dec.'], - 'weekdays' => ['domingo', 'luns', 'martes', 'mércores', 'xoves', 'venres', 'sábado'], - 'weekdays_short' => ['dom.', 'lun.', 'mar.', 'mér.', 'xov.', 'ven.', 'sáb.'], - 'weekdays_min' => ['do', 'lu', 'ma', 'mé', 'xo', 've', 'sá'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], - 'meridiem' => ['a.m.', 'p.m.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gl_ES.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gl_ES.php deleted file mode 100644 index 9d6c1d9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gl_ES.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gom.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gom.php deleted file mode 100644 index 2a0584f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gom.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/gom_Latn.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gom_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gom_Latn.php deleted file mode 100644 index 612bb88..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gom_Latn.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'year' => ':count voros|:count vorsam', - 'y' => ':countv', - 'month' => ':count mhoino|:count mhoine', - 'm' => ':countmh', - 'week' => ':count satolleacho|:count satolleache', - 'w' => ':countsa|:countsa', - 'day' => ':count dis', - 'd' => ':countd', - 'hour' => ':count hor|:count horam', - 'h' => ':counth', - 'minute' => ':count minute|:count mintam', - 'min' => ':countm', - 'second' => ':count second', - 's' => ':counts', - - 'diff_today' => 'Aiz', - 'diff_yesterday' => 'Kal', - 'diff_tomorrow' => 'Faleam', - 'formats' => [ - 'LT' => 'A h:mm [vazta]', - 'LTS' => 'A h:mm:ss [vazta]', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY A h:mm [vazta]', - 'LLLL' => 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', - 'llll' => 'ddd, D MMM YYYY, A h:mm [vazta]', - ], - - 'calendar' => [ - 'sameDay' => '[Aiz] LT', - 'nextDay' => '[Faleam] LT', - 'nextWeek' => '[Ieta to] dddd[,] LT', - 'lastDay' => '[Kal] LT', - 'lastWeek' => '[Fatlo] dddd[,] LT', - 'sameElse' => 'L', - ], - - 'months' => ['Janer', 'Febrer', 'Mars', 'Abril', 'Mai', 'Jun', 'Julai', 'Agost', 'Setembr', 'Otubr', 'Novembr', 'Dezembr'], - 'months_short' => ['Jan.', 'Feb.', 'Mars', 'Abr.', 'Mai', 'Jun', 'Jul.', 'Ago.', 'Set.', 'Otu.', 'Nov.', 'Dez.'], - 'weekdays' => ['Aitar', 'Somar', 'Mongllar', 'Budvar', 'Brestar', 'Sukrar', 'Son\'var'], - 'weekdays_short' => ['Ait.', 'Som.', 'Mon.', 'Bud.', 'Bre.', 'Suk.', 'Son.'], - 'weekdays_min' => ['Ai', 'Sm', 'Mo', 'Bu', 'Br', 'Su', 'Sn'], - - 'ordinal' => function ($number, $period) { - return $number.($period === 'D' ? 'er' : ''); - }, - - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'rati'; - } - if ($hour < 12) { - return 'sokalli'; - } - if ($hour < 16) { - return 'donparam'; - } - if ($hour < 20) { - return 'sanje'; - } - - return 'rati'; - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ani '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gsw.php deleted file mode 100644 index c5c850e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Christopher Dell - * - Akira Matsuda - * - Enrique Vidal - * - Simone Carletti - * - Henning Kiel - * - Aaron Patterson - * - Florian Hanke - */ -return [ - 'year' => ':count Johr', - 'month' => ':count Monet', - 'week' => ':count Woche', - 'day' => ':count Tag', - 'hour' => ':count Schtund', - 'minute' => ':count Minute', - 'second' => ':count Sekunde', - 'weekdays' => ['Sunntig', 'Mäntig', 'Ziischtig', 'Mittwuch', 'Dunschtig', 'Friitig', 'Samschtig'], - 'weekdays_short' => ['Su', 'Mä', 'Zi', 'Mi', 'Du', 'Fr', 'Sa'], - 'weekdays_min' => ['Su', 'Mä', 'Zi', 'Mi', 'Du', 'Fr', 'Sa'], - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], - 'meridiem' => ['am Vormittag', 'am Namittag'], - 'ordinal' => ':number.', - 'list' => [', ', ' und '], - 'diff_now' => 'now', - 'diff_yesterday' => 'geschter', - 'diff_tomorrow' => 'moorn', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'Do MMMM YYYY', - 'LLL' => 'Do MMMM, HH:mm [Uhr]', - 'LLLL' => 'dddd, Do MMMM YYYY, HH:mm [Uhr]', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_CH.php deleted file mode 100644 index 594eb25..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_CH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gsw.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_FR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_FR.php deleted file mode 100644 index 3581dcf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_FR.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/gsw.php', [ - 'meridiem' => ['vorm.', 'nam.'], - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LLL' => 'Do MMMM YYYY HH:mm', - 'LLLL' => 'dddd, Do MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_LI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_LI.php deleted file mode 100644 index 3581dcf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gsw_LI.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/gsw.php', [ - 'meridiem' => ['vorm.', 'nam.'], - 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LLL' => 'Do MMMM YYYY HH:mm', - 'LLLL' => 'dddd, Do MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gu.php deleted file mode 100644 index 8bc4311..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gu.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Kaushik Thanki - * - Josh Soref - */ -return [ - 'year' => 'એક વર્ષ|:count વર્ષ', - 'y' => ':countવર્ષ|:countવર્ષો', - 'month' => 'એક મહિનો|:count મહિના', - 'm' => ':countમહિનો|:countમહિના', - 'week' => ':count અઠવાડિયું|:count અઠવાડિયા', - 'w' => ':countઅઠ.|:countઅઠ.', - 'day' => 'એક દિવસ|:count દિવસ', - 'd' => ':countદિ.|:countદિ.', - 'hour' => 'એક કલાક|:count કલાક', - 'h' => ':countક.|:countક.', - 'minute' => 'એક મિનિટ|:count મિનિટ', - 'min' => ':countમિ.|:countમિ.', - 'second' => 'અમુક પળો|:count સેકંડ', - 's' => ':countસે.|:countસે.', - 'ago' => ':time પેહલા', - 'from_now' => ':time મા', - 'after' => ':time પછી', - 'before' => ':time પહેલા', - 'diff_now' => 'હમણાં', - 'diff_today' => 'આજ', - 'diff_yesterday' => 'ગઇકાલે', - 'diff_tomorrow' => 'કાલે', - 'formats' => [ - 'LT' => 'A h:mm વાગ્યે', - 'LTS' => 'A h:mm:ss વાગ્યે', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm વાગ્યે', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm વાગ્યે', - ], - 'calendar' => [ - 'sameDay' => '[આજ] LT', - 'nextDay' => '[કાલે] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[ગઇકાલે] LT', - 'lastWeek' => '[પાછલા] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'રાત'; - } - if ($hour < 10) { - return 'સવાર'; - } - if ($hour < 17) { - return 'બપોર'; - } - if ($hour < 20) { - return 'સાંજ'; - } - - return 'રાત'; - }, - 'months' => ['જાન્યુઆરી', 'ફેબ્રુઆરી', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટેમ્બર', 'ઑક્ટ્બર', 'નવેમ્બર', 'ડિસેમ્બર'], - 'months_short' => ['જાન્યુ.', 'ફેબ્રુ.', 'માર્ચ', 'એપ્રિ.', 'મે', 'જૂન', 'જુલા.', 'ઑગ.', 'સપ્ટે.', 'ઑક્ટ્.', 'નવે.', 'ડિસે.'], - 'weekdays' => ['રવિવાર', 'સોમવાર', 'મંગળવાર', 'બુધ્વાર', 'ગુરુવાર', 'શુક્રવાર', 'શનિવાર'], - 'weekdays_short' => ['રવિ', 'સોમ', 'મંગળ', 'બુધ્', 'ગુરુ', 'શુક્ર', 'શનિ'], - 'weekdays_min' => ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'], - 'list' => [', ', ' અને '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gu_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gu_IN.php deleted file mode 100644 index 02654b1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gu_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/gu.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/guz.php b/dependencies/nesbot/carbon/src/Carbon/Lang/guz.php deleted file mode 100644 index 6230165..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/guz.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Ma', 'Mo'], - 'weekdays' => ['Chumapiri', 'Chumatato', 'Chumaine', 'Chumatano', 'Aramisi', 'Ichuma', 'Esabato'], - 'weekdays_short' => ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'], - 'weekdays_min' => ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'], - 'months' => ['Chanuari', 'Feburari', 'Machi', 'Apiriri', 'Mei', 'Juni', 'Chulai', 'Agosti', 'Septemba', 'Okitoba', 'Nobemba', 'Disemba'], - 'months_short' => ['Can', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Cul', 'Agt', 'Sep', 'Okt', 'Nob', 'Dis'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'month' => ':count omotunyi', // less reliable - 'm' => ':count omotunyi', // less reliable - 'a_month' => ':count omotunyi', // less reliable - - 'week' => ':count isano naibere', // less reliable - 'w' => ':count isano naibere', // less reliable - 'a_week' => ':count isano naibere', // less reliable - - 'second' => ':count ibere', // less reliable - 's' => ':count ibere', // less reliable - 'a_second' => ':count ibere', // less reliable - - 'year' => ':count omwaka', - 'y' => ':count omwaka', - 'a_year' => ':count omwaka', - - 'day' => ':count rituko', - 'd' => ':count rituko', - 'a_day' => ':count rituko', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gv.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gv.php deleted file mode 100644 index 7c52b94..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gv.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/gv_GB.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/gv_GB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/gv_GB.php deleted file mode 100644 index 6b1168f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/gv_GB.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alastair McKinstry bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Jerrey-geuree', 'Toshiaght-arree', 'Mayrnt', 'Averil', 'Boaldyn', 'Mean-souree', 'Jerrey-souree', 'Luanistyn', 'Mean-fouyir', 'Jerrey-fouyir', 'Mee Houney', 'Mee ny Nollick'], - 'months_short' => ['J-guer', 'T-arree', 'Mayrnt', 'Avrril', 'Boaldyn', 'M-souree', 'J-souree', 'Luanistyn', 'M-fouyir', 'J-fouyir', 'M.Houney', 'M.Nollick'], - 'weekdays' => ['Jedoonee', 'Jelhein', 'Jemayrt', 'Jercean', 'Jerdein', 'Jeheiney', 'Jesarn'], - 'weekdays_short' => ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'], - 'weekdays_min' => ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count blein', - 'y' => ':count blein', - 'a_year' => ':count blein', - - 'month' => ':count mee', - 'm' => ':count mee', - 'a_month' => ':count mee', - - 'week' => ':count shiaghtin', - 'w' => ':count shiaghtin', - 'a_week' => ':count shiaghtin', - - 'day' => ':count laa', - 'd' => ':count laa', - 'a_day' => ':count laa', - - 'hour' => ':count oor', - 'h' => ':count oor', - 'a_hour' => ':count oor', - - 'minute' => ':count feer veg', - 'min' => ':count feer veg', - 'a_minute' => ':count feer veg', - - 'second' => ':count derrey', - 's' => ':count derrey', - 'a_second' => ':count derrey', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ha.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ha.php deleted file mode 100644 index cd8e34d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ha.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM, YYYY HH:mm', - ], - 'months' => ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'], - 'months_short' => ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'], - 'weekdays' => ['Lahadi', 'Litini', 'Talata', 'Laraba', 'Alhamis', 'Jumaʼa', 'Asabar'], - 'weekdays_short' => ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'], - 'weekdays_min' => ['Lh', 'Li', 'Ta', 'Lr', 'Al', 'Ju', 'As'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => 'shekara :count', - 'y' => 'shekara :count', - 'a_year' => 'shekara :count', - - 'month' => ':count wátàa', - 'm' => ':count wátàa', - 'a_month' => ':count wátàa', - - 'week' => ':count mako', - 'w' => ':count mako', - 'a_week' => ':count mako', - - 'day' => ':count rana', - 'd' => ':count rana', - 'a_day' => ':count rana', - - 'hour' => ':count áwàa', - 'h' => ':count áwàa', - 'a_hour' => ':count áwàa', - - 'minute' => 'minti :count', - 'min' => 'minti :count', - 'a_minute' => 'minti :count', - - 'second' => ':count ná bíyú', - 's' => ':count ná bíyú', - 'a_second' => ':count ná bíyú', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ha_GH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ha_GH.php deleted file mode 100644 index f9f99a7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ha_GH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ha.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ha_NE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ha_NE.php deleted file mode 100644 index f9f99a7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ha_NE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ha.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ha_NG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ha_NG.php deleted file mode 100644 index f9f99a7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ha_NG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ha.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hak.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hak.php deleted file mode 100644 index 6c3260e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hak.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hak_TW.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hak_TW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hak_TW.php deleted file mode 100644 index fe23986..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hak_TW.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], - 'weekdays' => ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['上晝', '下晝'], - - 'year' => ':count ngien11', - 'y' => ':count ngien11', - 'a_year' => ':count ngien11', - - 'month' => ':count ngie̍t', - 'm' => ':count ngie̍t', - 'a_month' => ':count ngie̍t', - - 'week' => ':count lî-pai', - 'w' => ':count lî-pai', - 'a_week' => ':count lî-pai', - - 'day' => ':count ngit', - 'd' => ':count ngit', - 'a_day' => ':count ngit', - - 'hour' => ':count sṳ̀', - 'h' => ':count sṳ̀', - 'a_hour' => ':count sṳ̀', - - 'minute' => ':count fûn', - 'min' => ':count fûn', - 'a_minute' => ':count fûn', - - 'second' => ':count miéu', - 's' => ':count miéu', - 'a_second' => ':count miéu', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/haw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/haw.php deleted file mode 100644 index cdd3686..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/haw.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['Ianuali', 'Pepeluali', 'Malaki', 'ʻApelila', 'Mei', 'Iune', 'Iulai', 'ʻAukake', 'Kepakemapa', 'ʻOkakopa', 'Nowemapa', 'Kekemapa'], - 'months_short' => ['Ian.', 'Pep.', 'Mal.', 'ʻAp.', 'Mei', 'Iun.', 'Iul.', 'ʻAu.', 'Kep.', 'ʻOk.', 'Now.', 'Kek.'], - 'weekdays' => ['Lāpule', 'Poʻakahi', 'Poʻalua', 'Poʻakolu', 'Poʻahā', 'Poʻalima', 'Poʻaono'], - 'weekdays_short' => ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'], - 'weekdays_min' => ['S', 'M', 'T', 'W', 'T', 'F', 'S'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], - - 'year' => ':count makahiki', - 'y' => ':count makahiki', - 'a_year' => ':count makahiki', - - 'month' => ':count mahina', - 'm' => ':count mahina', - 'a_month' => ':count mahina', - - 'week' => ':count pule', - 'w' => ':count pule', - 'a_week' => ':count pule', - - 'day' => ':count lā', - 'd' => ':count lā', - 'a_day' => ':count lā', - - 'hour' => ':count hola', - 'h' => ':count hola', - 'a_hour' => ':count hola', - - 'minute' => ':count minuke', - 'min' => ':count minuke', - 'a_minute' => ':count minuke', - - 'second' => ':count lua', - 's' => ':count lua', - 'a_second' => ':count lua', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/he.php b/dependencies/nesbot/carbon/src/Carbon/Lang/he.php deleted file mode 100644 index c3fb3e9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/he.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Daniel Cohen Gindi - * - JD Isaacks - * - Itai Nathaniel - * - GabMic - * - Yaakov Dahan (yakidahan) - */ -return [ - 'year' => 'שנה|{2}שנתיים|:count שנים', - 'y' => 'שנה|:count שנ׳', - 'month' => 'חודש|{2}חודשיים|:count חודשים', - 'm' => 'חודש|:count חו׳', - 'week' => 'שבוע|{2}שבועיים|:count שבועות', - 'w' => 'שבוע|:count שב׳', - 'day' => 'יום|{2}יומיים|:count ימים', - 'd' => 'יום|:count ימ׳', - 'hour' => 'שעה|{2}שעתיים|:count שעות', - 'h' => 'שעה|:count שע׳', - 'minute' => 'דקה|{2}שתי דקות|:count דקות', - 'min' => 'דקה|:count דק׳', - 'second' => 'שנייה|:count שניות', - 'a_second' => 'כמה שניות|:count שניות', - 's' => 'שניה|:count שנ׳', - 'ago' => 'לפני :time', - 'from_now' => 'בעוד :time מעכשיו', - 'after' => 'אחרי :time', - 'before' => 'לפני :time', - 'diff_now' => 'עכשיו', - 'diff_today' => 'היום', - 'diff_today_regexp' => 'היום(?:\\s+ב־)?', - 'diff_yesterday' => 'אתמול', - 'diff_yesterday_regexp' => 'אתמול(?:\\s+ב־)?', - 'diff_tomorrow' => 'מחר', - 'diff_tomorrow_regexp' => 'מחר(?:\\s+ב־)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [ב]MMMM YYYY', - 'LLL' => 'D [ב]MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D [ב]MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[היום ב־]LT', - 'nextDay' => '[מחר ב־]LT', - 'nextWeek' => 'dddd [בשעה] LT', - 'lastDay' => '[אתמול ב־]LT', - 'lastWeek' => '[ביום] dddd [האחרון בשעה] LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour, $minute, $isLower) { - if ($hour < 5) { - return 'לפנות בוקר'; - } - if ($hour < 10) { - return 'בבוקר'; - } - if ($hour < 12) { - return $isLower ? 'לפנה"צ' : 'לפני הצהריים'; - } - if ($hour < 18) { - return $isLower ? 'אחה"צ' : 'אחרי הצהריים'; - } - - return 'בערב'; - }, - 'months' => ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'], - 'months_short' => ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'], - 'weekdays' => ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'], - 'weekdays_short' => ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'], - 'weekdays_min' => ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ש'], - 'list' => [', ', ' ו -'], - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/he_IL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/he_IL.php deleted file mode 100644 index 14fab3e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/he_IL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/he.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hi.php deleted file mode 100644 index 70c57a2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hi.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - abhimanyu003 - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => 'एक वर्ष|:count वर्ष', - 'y' => '1 वर्ष|:count वर्षों', - 'month' => 'एक महीने|:count महीने', - 'm' => '1 माह|:count महीने', - 'week' => '1 सप्ताह|:count सप्ताह', - 'w' => '1 सप्ताह|:count सप्ताह', - 'day' => 'एक दिन|:count दिन', - 'd' => '1 दिन|:count दिनों', - 'hour' => 'एक घंटा|:count घंटे', - 'h' => '1 घंटा|:count घंटे', - 'minute' => 'एक मिनट|:count मिनट', - 'min' => '1 मिनट|:count मिनटों', - 'second' => 'कुछ ही क्षण|:count सेकंड', - 's' => '1 सेकंड|:count सेकंड', - 'ago' => ':time पहले', - 'from_now' => ':time में', - 'after' => ':time के बाद', - 'before' => ':time के पहले', - 'diff_now' => 'अब', - 'diff_today' => 'आज', - 'diff_yesterday' => 'कल', - 'diff_tomorrow' => 'कल', - 'formats' => [ - 'LT' => 'A h:mm बजे', - 'LTS' => 'A h:mm:ss बजे', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm बजे', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm बजे', - ], - 'calendar' => [ - 'sameDay' => '[आज] LT', - 'nextDay' => '[कल] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[कल] LT', - 'lastWeek' => '[पिछले] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'रात'; - } - if ($hour < 10) { - return 'सुबह'; - } - if ($hour < 17) { - return 'दोपहर'; - } - if ($hour < 20) { - return 'शाम'; - } - - return 'रात'; - }, - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जन.', 'फ़र.', 'मार्च', 'अप्रै.', 'मई', 'जून', 'जुल.', 'अग.', 'सित.', 'अक्टू.', 'नव.', 'दिस.'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरू', 'शुक्र', 'शनि'], - 'weekdays_min' => ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'], - 'list' => [', ', ' और '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hi_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hi_IN.php deleted file mode 100644 index 749dd97..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hi_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/hi.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hif.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hif.php deleted file mode 100644 index 65791dd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hif.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hif_FJ.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hif_FJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hif_FJ.php deleted file mode 100644 index 30ad5e7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hif_FJ.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Ravivar', 'Somvar', 'Mangalvar', 'Budhvar', 'Guruvar', 'Shukravar', 'Shanivar'], - 'weekdays_short' => ['Ravi', 'Som', 'Mangal', 'Budh', 'Guru', 'Shukra', 'Shani'], - 'weekdays_min' => ['Ravi', 'Som', 'Mangal', 'Budh', 'Guru', 'Shukra', 'Shani'], - 'meridiem' => ['Purvahan', 'Aparaahna'], - - 'hour' => ':count minit', // less reliable - 'h' => ':count minit', // less reliable - 'a_hour' => ':count minit', // less reliable - - 'year' => ':count saal', - 'y' => ':count saal', - 'a_year' => ':count saal', - - 'month' => ':count Mahina', - 'm' => ':count Mahina', - 'a_month' => ':count Mahina', - - 'week' => ':count Hafta', - 'w' => ':count Hafta', - 'a_week' => ':count Hafta', - - 'day' => ':count Din', - 'd' => ':count Din', - 'a_day' => ':count Din', - - 'minute' => ':count Minit', - 'min' => ':count Minit', - 'a_minute' => ':count Minit', - - 'second' => ':count Second', - 's' => ':count Second', - 'a_second' => ':count Second', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hne.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hne.php deleted file mode 100644 index 4bcb05c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hne.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hne_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hne_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hne_IN.php deleted file mode 100644 index a5ca758..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hne_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अपरेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितमबर', 'अकटूबर', 'नवमबर', 'दिसमबर'], - 'months_short' => ['जन', 'फर', 'मार्च', 'अप', 'मई', 'जून', 'जुला', 'अग', 'सित', 'अकटू', 'नव', 'दिस'], - 'weekdays' => ['इतवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'बिरसपत', 'सुकरवार', 'सनिवार'], - 'weekdays_short' => ['इत', 'सोम', 'मंग', 'बुध', 'बिर', 'सुक', 'सनि'], - 'weekdays_min' => ['इत', 'सोम', 'मंग', 'बुध', 'बिर', 'सुक', 'सनि'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['बिहिनियाँ', 'मंझनियाँ'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hr.php deleted file mode 100644 index cfd85fd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hr.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Tim Fish - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - tomhorvat - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - tomhorvat - * - Stjepan Majdak - * - Vanja Retkovac (vr00) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count godinu|:count godine|:count godina', - 'y' => ':count god.|:count god.|:count god.', - 'month' => ':count mjesec|:count mjeseca|:count mjeseci', - 'm' => ':count mj.|:count mj.|:count mj.', - 'week' => ':count tjedan|:count tjedna|:count tjedana', - 'w' => ':count tj.|:count tj.|:count tj.', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count d.|:count d.|:count d.', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count sat|:count sata|:count sati', - 'minute' => ':count minutu|:count minute|:count minuta', - 'min' => ':count min.|:count min.|:count min.', - 'second' => ':count sekundu|:count sekunde|:count sekundi', - 'a_second' => 'nekoliko sekundi|:count sekunde|:count sekundi', - 's' => ':count sek.|:count sek.|:count sek.', - 'ago' => 'prije :time', - 'from_now' => 'za :time', - 'after' => ':time poslije', - 'before' => ':time prije', - 'diff_now' => 'sad', - 'diff_today' => 'danas', - 'diff_today_regexp' => 'danas(?:\\s+u)?', - 'diff_yesterday' => 'jučer', - 'diff_yesterday_regexp' => 'jučer(?:\\s+u)?', - 'diff_tomorrow' => 'sutra', - 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', - 'diff_before_yesterday' => 'prekjučer', - 'diff_after_tomorrow' => 'prekosutra', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D. M. YYYY.', - 'LL' => 'D. MMMM YYYY.', - 'LLL' => 'D. MMMM YYYY. H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY. H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danas u] LT', - 'nextDay' => '[sutra u] LT', - 'nextWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - default: - return '[u] dddd [u] LT'; - } - }, - 'lastDay' => '[jučer u] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - default: - return '[prošli] dddd [u] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'], - 'months_standalone' => ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'], - 'months_short' => ['sij.', 'velj.', 'ožu.', 'tra.', 'svi.', 'lip.', 'srp.', 'kol.', 'ruj.', 'lis.', 'stu.', 'pro.'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['nedjelju', 'ponedjeljak', 'utorak', 'srijedu', 'četvrtak', 'petak', 'subotu'], - 'weekdays_standalone' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], - 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hr_BA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hr_BA.php deleted file mode 100644 index 7763a45..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hr_BA.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - DarkoDevelop - */ -return array_replace_recursive(require __DIR__.'/hr.php', [ - 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'], - 'weekdays_min' => ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'], - 'months' => ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'], - 'months_short' => ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'], - 'months_standalone' => ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D. M. yy.', - 'LL' => 'D. MMM YYYY.', - 'LLL' => 'D. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY. HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hr_HR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hr_HR.php deleted file mode 100644 index db74d8c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hr_HR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/hr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hsb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hsb.php deleted file mode 100644 index 3537b8b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hsb.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/hsb_DE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hsb_DE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hsb_DE.php deleted file mode 100644 index 6ba2271..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hsb_DE.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Information from Michael Wolf Andrzej Krzysztofowicz ankry@mif.pg.gda.pl - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'DD. MMMM YYYY', - 'LLL' => 'DD. MMMM, HH:mm [hodź.]', - 'LLLL' => 'dddd, DD. MMMM YYYY, HH:mm [hodź.]', - ], - 'months' => ['januara', 'februara', 'měrca', 'apryla', 'meje', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'], - 'months_short' => ['Jan', 'Feb', 'Měr', 'Apr', 'Mej', 'Jun', 'Jul', 'Awg', 'Sep', 'Okt', 'Now', 'Dec'], - 'weekdays' => ['Njedźela', 'Póndźela', 'Wutora', 'Srjeda', 'Štvórtk', 'Pjatk', 'Sobota'], - 'weekdays_short' => ['Nj', 'Pó', 'Wu', 'Sr', 'Št', 'Pj', 'So'], - 'weekdays_min' => ['Nj', 'Pó', 'Wu', 'Sr', 'Št', 'Pj', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count lěto', - 'y' => ':count lěto', - 'a_year' => ':count lěto', - - 'month' => ':count měsac', - 'm' => ':count měsac', - 'a_month' => ':count měsac', - - 'week' => ':count tydźeń', - 'w' => ':count tydźeń', - 'a_week' => ':count tydźeń', - - 'day' => ':count dźeń', - 'd' => ':count dźeń', - 'a_day' => ':count dźeń', - - 'hour' => ':count hodźina', - 'h' => ':count hodźina', - 'a_hour' => ':count hodźina', - - 'minute' => ':count chwila', - 'min' => ':count chwila', - 'a_minute' => ':count chwila', - - 'second' => ':count druhi', - 's' => ':count druhi', - 'a_second' => ':count druhi', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ht.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ht.php deleted file mode 100644 index ebd12ad..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ht.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ht_HT.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ht_HT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ht_HT.php deleted file mode 100644 index 139b813..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ht_HT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['janvye', 'fevriye', 'mas', 'avril', 'me', 'jen', 'jiyè', 'out', 'septanm', 'oktòb', 'novanm', 'desanm'], - 'months_short' => ['jan', 'fev', 'mas', 'avr', 'me', 'jen', 'jiy', 'out', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['dimanch', 'lendi', 'madi', 'mèkredi', 'jedi', 'vandredi', 'samdi'], - 'weekdays_short' => ['dim', 'len', 'mad', 'mèk', 'jed', 'van', 'sam'], - 'weekdays_min' => ['dim', 'len', 'mad', 'mèk', 'jed', 'van', 'sam'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count lane', - 'y' => ':count lane', - 'a_year' => ':count lane', - - 'month' => 'mwa :count', - 'm' => 'mwa :count', - 'a_month' => 'mwa :count', - - 'week' => 'semèn :count', - 'w' => 'semèn :count', - 'a_week' => 'semèn :count', - - 'day' => ':count jou', - 'd' => ':count jou', - 'a_day' => ':count jou', - - 'hour' => ':count lè', - 'h' => ':count lè', - 'a_hour' => ':count lè', - - 'minute' => ':count minit', - 'min' => ':count minit', - 'a_minute' => ':count minit', - - 'second' => ':count segonn', - 's' => ':count segonn', - 'a_second' => ':count segonn', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hu.php deleted file mode 100644 index b2d2ac1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hu.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Adam Brunner - * - Brett Johnson - * - balping - */ - -use Carbon\CarbonInterface; - -$huWeekEndings = ['vasárnap', 'hétfőn', 'kedden', 'szerdán', 'csütörtökön', 'pénteken', 'szombaton']; - -return [ - 'year' => ':count év', - 'y' => ':count év', - 'month' => ':count hónap', - 'm' => ':count hónap', - 'week' => ':count hét', - 'w' => ':count hét', - 'day' => ':count nap', - 'd' => ':count nap', - 'hour' => ':count óra', - 'h' => ':count óra', - 'minute' => ':count perc', - 'min' => ':count perc', - 'second' => ':count másodperc', - 's' => ':count másodperc', - 'ago' => ':time', - 'from_now' => ':time múlva', - 'after' => ':time később', - 'before' => ':time korábban', - 'year_ago' => ':count éve', - 'y_ago' => ':count éve', - 'month_ago' => ':count hónapja', - 'm_ago' => ':count hónapja', - 'week_ago' => ':count hete', - 'w_ago' => ':count hete', - 'day_ago' => ':count napja', - 'd_ago' => ':count napja', - 'hour_ago' => ':count órája', - 'h_ago' => ':count órája', - 'minute_ago' => ':count perce', - 'min_ago' => ':count perce', - 'second_ago' => ':count másodperce', - 's_ago' => ':count másodperce', - 'year_after' => ':count évvel', - 'y_after' => ':count évvel', - 'month_after' => ':count hónappal', - 'm_after' => ':count hónappal', - 'week_after' => ':count héttel', - 'w_after' => ':count héttel', - 'day_after' => ':count nappal', - 'd_after' => ':count nappal', - 'hour_after' => ':count órával', - 'h_after' => ':count órával', - 'minute_after' => ':count perccel', - 'min_after' => ':count perccel', - 'second_after' => ':count másodperccel', - 's_after' => ':count másodperccel', - 'year_before' => ':count évvel', - 'y_before' => ':count évvel', - 'month_before' => ':count hónappal', - 'm_before' => ':count hónappal', - 'week_before' => ':count héttel', - 'w_before' => ':count héttel', - 'day_before' => ':count nappal', - 'd_before' => ':count nappal', - 'hour_before' => ':count órával', - 'h_before' => ':count órával', - 'minute_before' => ':count perccel', - 'min_before' => ':count perccel', - 'second_before' => ':count másodperccel', - 's_before' => ':count másodperccel', - 'months' => ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'], - 'months_short' => ['jan.', 'feb.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'], - 'weekdays_short' => ['vas', 'hét', 'kedd', 'sze', 'csüt', 'pén', 'szo'], - 'weekdays_min' => ['v', 'h', 'k', 'sze', 'cs', 'p', 'sz'], - 'ordinal' => ':number.', - 'diff_now' => 'most', - 'diff_today' => 'ma', - 'diff_yesterday' => 'tegnap', - 'diff_tomorrow' => 'holnap', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'YYYY.MM.DD.', - 'LL' => 'YYYY. MMMM D.', - 'LLL' => 'YYYY. MMMM D. H:mm', - 'LLLL' => 'YYYY. MMMM D., dddd H:mm', - ], - 'calendar' => [ - 'sameDay' => '[ma] LT[-kor]', - 'nextDay' => '[holnap] LT[-kor]', - 'nextWeek' => function (CarbonInterface $date) use ($huWeekEndings) { - return '['.$huWeekEndings[$date->dayOfWeek].'] LT[-kor]'; - }, - 'lastDay' => '[tegnap] LT[-kor]', - 'lastWeek' => function (CarbonInterface $date) use ($huWeekEndings) { - return '[múlt '.$huWeekEndings[$date->dayOfWeek].'] LT[-kor]'; - }, - 'sameElse' => 'L', - ], - 'meridiem' => ['DE', 'DU'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' és '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hu_HU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hu_HU.php deleted file mode 100644 index b1c4854..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hu_HU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/hu.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hy.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hy.php deleted file mode 100644 index 8b12994..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hy.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - mhamlet - */ -return [ - 'year' => ':count տարի', - 'a_year' => 'տարի|:count տարի', - 'y' => ':countտ', - 'month' => ':count ամիս', - 'a_month' => 'ամիս|:count ամիս', - 'm' => ':countամ', - 'week' => ':count շաբաթ', - 'a_week' => 'շաբաթ|:count շաբաթ', - 'w' => ':countշ', - 'day' => ':count օր', - 'a_day' => 'օր|:count օր', - 'd' => ':countօր', - 'hour' => ':count ժամ', - 'a_hour' => 'ժամ|:count ժամ', - 'h' => ':countժ', - 'minute' => ':count րոպե', - 'a_minute' => 'րոպե|:count րոպե', - 'min' => ':countր', - 'second' => ':count վայրկյան', - 'a_second' => 'մի քանի վայրկյան|:count վայրկյան', - 's' => ':countվրկ', - 'ago' => ':time առաջ', - 'from_now' => ':timeից', - 'after' => ':time հետո', - 'before' => ':time առաջ', - 'diff_now' => 'հիմա', - 'diff_today' => 'այսօր', - 'diff_yesterday' => 'երեկ', - 'diff_tomorrow' => 'վաղը', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY թ.', - 'LLL' => 'D MMMM YYYY թ., HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY թ., HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[այսօր] LT', - 'nextDay' => '[վաղը] LT', - 'nextWeek' => 'dddd [օրը ժամը] LT', - 'lastDay' => '[երեկ] LT', - 'lastWeek' => '[անցած] dddd [օրը ժամը] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - return $number.($number === 1 ? '-ին' : '-րդ'); - default: - return $number; - } - }, - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'գիշերվա'; - } - if ($hour < 12) { - return 'առավոտվա'; - } - if ($hour < 17) { - return 'ցերեկվա'; - } - - return 'երեկոյան'; - }, - 'months' => ['հունվարի', 'փետրվարի', 'մարտի', 'ապրիլի', 'մայիսի', 'հունիսի', 'հուլիսի', 'օգոստոսի', 'սեպտեմբերի', 'հոկտեմբերի', 'նոյեմբերի', 'դեկտեմբերի'], - 'months_standalone' => ['հունվար', 'փետրվար', 'մարտ', 'ապրիլ', 'մայիս', 'հունիս', 'հուլիս', 'օգոստոս', 'սեպտեմբեր', 'հոկտեմբեր', 'նոյեմբեր', 'դեկտեմբեր'], - 'months_short' => ['հնվ', 'փտր', 'մրտ', 'ապր', 'մյս', 'հնս', 'հլս', 'օգս', 'սպտ', 'հկտ', 'նմբ', 'դկտ'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['կիրակի', 'երկուշաբթի', 'երեքշաբթի', 'չորեքշաբթի', 'հինգշաբթի', 'ուրբաթ', 'շաբաթ'], - 'weekdays_short' => ['կրկ', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'], - 'weekdays_min' => ['կրկ', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'], - 'list' => [', ', ' եւ '], - 'first_day_of_week' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/hy_AM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/hy_AM.php deleted file mode 100644 index 4587df5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/hy_AM.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Tim Fish - * - Serhan Apaydın - * - JD Isaacks - */ -return array_replace_recursive(require __DIR__.'/hy.php', [ - 'from_now' => ':time հետո', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/i18n.php b/dependencies/nesbot/carbon/src/Carbon/Lang/i18n.php deleted file mode 100644 index e65449b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/i18n.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'months' => ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], - 'months_short' => ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], - 'weekdays' => ['1', '2', '3', '4', '5', '6', '7'], - 'weekdays_short' => ['1', '2', '3', '4', '5', '6', '7'], - 'weekdays_min' => ['1', '2', '3', '4', '5', '6', '7'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ia.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ia.php deleted file mode 100644 index 0a0d5e6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ia.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ia_FR.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ia_FR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ia_FR.php deleted file mode 100644 index de4b2fa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ia_FR.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Fedora Project Nik Kalach nikka@fedoraproject.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['januario', 'februario', 'martio', 'april', 'maio', 'junio', 'julio', 'augusto', 'septembre', 'octobre', 'novembre', 'decembre'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'], - 'weekdays' => ['dominica', 'lunedi', 'martedi', 'mercuridi', 'jovedi', 'venerdi', 'sabbato'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'], - 'weekdays_min' => ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => 'anno :count', - 'y' => 'anno :count', - 'a_year' => 'anno :count', - - 'month' => ':count mense', - 'm' => ':count mense', - 'a_month' => ':count mense', - - 'week' => ':count septimana', - 'w' => ':count septimana', - 'a_week' => ':count septimana', - - 'day' => ':count die', - 'd' => ':count die', - 'a_day' => ':count die', - - 'hour' => ':count hora', - 'h' => ':count hora', - 'a_hour' => ':count hora', - - 'minute' => ':count minuscule', - 'min' => ':count minuscule', - 'a_minute' => ':count minuscule', - - 'second' => ':count secunda', - 's' => ':count secunda', - 'a_second' => ':count secunda', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/id.php b/dependencies/nesbot/carbon/src/Carbon/Lang/id.php deleted file mode 100644 index afaf78f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/id.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - du - * - JD Isaacks - * - Nafies Luthfi - * - Raymundus Jati Primanda (mundusjp) - * - diankur313 - * - a-wip0 - */ -return [ - 'year' => ':count tahun', - 'a_year' => '{1}setahun|]1,Inf[:count tahun', - 'y' => ':countthn', - 'month' => ':count bulan', - 'a_month' => '{1}sebulan|]1,Inf[:count bulan', - 'm' => ':countbln', - 'week' => ':count minggu', - 'a_week' => '{1}seminggu|]1,Inf[:count minggu', - 'w' => ':countmgg', - 'day' => ':count hari', - 'a_day' => '{1}sehari|]1,Inf[:count hari', - 'd' => ':counthr', - 'hour' => ':count jam', - 'a_hour' => '{1}sejam|]1,Inf[:count jam', - 'h' => ':countj', - 'minute' => ':count menit', - 'a_minute' => '{1}semenit|]1,Inf[:count menit', - 'min' => ':countmnt', - 'second' => ':count detik', - 'a_second' => '{1}beberapa detik|]1,Inf[:count detik', - 's' => ':countdt', - 'ago' => ':time yang lalu', - 'from_now' => ':time dari sekarang', - 'after' => ':time setelahnya', - 'before' => ':time sebelumnya', - 'diff_now' => 'sekarang', - 'diff_today' => 'Hari', - 'diff_today_regexp' => 'Hari(?:\\s+ini)?(?:\\s+pukul)?', - 'diff_yesterday' => 'kemarin', - 'diff_yesterday_regexp' => 'Kemarin(?:\\s+pukul)?', - 'diff_tomorrow' => 'besok', - 'diff_tomorrow_regexp' => 'Besok(?:\\s+pukul)?', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [pukul] HH.mm', - 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', - ], - 'calendar' => [ - 'sameDay' => '[Hari ini pukul] LT', - 'nextDay' => '[Besok pukul] LT', - 'nextWeek' => 'dddd [pukul] LT', - 'lastDay' => '[Kemarin pukul] LT', - 'lastWeek' => 'dddd [lalu pukul] LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 11) { - return 'pagi'; - } - if ($hour < 15) { - return 'siang'; - } - if ($hour < 19) { - return 'sore'; - } - - return 'malam'; - }, - 'months' => ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'], - 'weekdays_short' => ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'], - 'weekdays_min' => ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' dan '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/id_ID.php b/dependencies/nesbot/carbon/src/Carbon/Lang/id_ID.php deleted file mode 100644 index d5953a1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/id_ID.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/id.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ig.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ig.php deleted file mode 100644 index de51e9c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ig.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ig_NG.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ig_NG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ig_NG.php deleted file mode 100644 index 0034e35..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ig_NG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Jenụwarị', 'Febrụwarị', 'Maachị', 'Eprel', 'Mee', 'Juun', 'Julaị', 'Ọgọọst', 'Septemba', 'Ọktoba', 'Novemba', 'Disemba'], - 'months_short' => ['Jen', 'Feb', 'Maa', 'Epr', 'Mee', 'Juu', 'Jul', 'Ọgọ', 'Sep', 'Ọkt', 'Nov', 'Dis'], - 'weekdays' => ['sọnde', 'mọnde', 'tuzde', 'wenzde', 'tọsde', 'fraịde', 'satọde'], - 'weekdays_short' => ['sọn', 'mọn', 'tuz', 'wen', 'tọs', 'fra', 'sat'], - 'weekdays_min' => ['sọn', 'mọn', 'tuz', 'wen', 'tọs', 'fra', 'sat'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => 'afo :count', - 'y' => 'afo :count', - 'a_year' => 'afo :count', - - 'month' => 'önwa :count', - 'm' => 'önwa :count', - 'a_month' => 'önwa :count', - - 'week' => 'izu :count', - 'w' => 'izu :count', - 'a_week' => 'izu :count', - - 'day' => 'ụbọchị :count', - 'd' => 'ụbọchị :count', - 'a_day' => 'ụbọchị :count', - - 'hour' => 'awa :count', - 'h' => 'awa :count', - 'a_hour' => 'awa :count', - - 'minute' => 'minit :count', - 'min' => 'minit :count', - 'a_minute' => 'minit :count', - - 'second' => 'sekọnd :count', - 's' => 'sekọnd :count', - 'a_second' => 'sekọnd :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ii.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ii.php deleted file mode 100644 index a4246c2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ii.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ꎸꄑ', 'ꁯꋒ'], - 'weekdays' => ['ꑭꆏꑍ', 'ꆏꊂꋍ', 'ꆏꊂꑍ', 'ꆏꊂꌕ', 'ꆏꊂꇖ', 'ꆏꊂꉬ', 'ꆏꊂꃘ'], - 'weekdays_short' => ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'], - 'weekdays_min' => ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'], - 'months' => null, - 'months_short' => ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D h:mm a', - 'LLLL' => 'YYYY MMMM D, dddd h:mm a', - ], - - 'year' => ':count ꒉ', // less reliable - 'y' => ':count ꒉ', // less reliable - 'a_year' => ':count ꒉ', // less reliable - - 'month' => ':count ꆪ', - 'm' => ':count ꆪ', - 'a_month' => ':count ꆪ', - - 'week' => ':count ꏃ', // less reliable - 'w' => ':count ꏃ', // less reliable - 'a_week' => ':count ꏃ', // less reliable - - 'day' => ':count ꏜ', // less reliable - 'd' => ':count ꏜ', // less reliable - 'a_day' => ':count ꏜ', // less reliable - - 'hour' => ':count ꄮꈉ', - 'h' => ':count ꄮꈉ', - 'a_hour' => ':count ꄮꈉ', - - 'minute' => ':count ꀄꊭ', // less reliable - 'min' => ':count ꀄꊭ', // less reliable - 'a_minute' => ':count ꀄꊭ', // less reliable - - 'second' => ':count ꇅ', // less reliable - 's' => ':count ꇅ', // less reliable - 'a_second' => ':count ꇅ', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ik.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ik.php deleted file mode 100644 index 7a13aa2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ik.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ik_CA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ik_CA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ik_CA.php deleted file mode 100644 index bb2a109..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ik_CA.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Siqiññaatchiaq', 'Siqiññaasrugruk', 'Paniqsiqsiivik', 'Qilġich Tatqiat', 'Suppivik', 'Iġñivik', 'Itchavik', 'Tiññivik', 'Amiġaiqsivik', 'Sikkuvik', 'Nippivik', 'Siqiñġiḷaq'], - 'months_short' => ['Sñt', 'Sñs', 'Pan', 'Qil', 'Sup', 'Iġñ', 'Itc', 'Tiñ', 'Ami', 'Sik', 'Nip', 'Siq'], - 'weekdays' => ['Minġuiqsioiq', 'Savałłiq', 'Ilaqtchiioiq', 'Qitchiioiq', 'Sisamiioiq', 'Tallimmiioiq', 'Maqinġuoiq'], - 'weekdays_short' => ['Min', 'Sav', 'Ila', 'Qit', 'Sis', 'Tal', 'Maq'], - 'weekdays_min' => ['Min', 'Sav', 'Ila', 'Qit', 'Sis', 'Tal', 'Maq'], - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ukiuq', - 'y' => ':count ukiuq', - 'a_year' => ':count ukiuq', - - 'month' => ':count Tatqiat', - 'm' => ':count Tatqiat', - 'a_month' => ':count Tatqiat', - - 'week' => ':count tatqiat', // less reliable - 'w' => ':count tatqiat', // less reliable - 'a_week' => ':count tatqiat', // less reliable - - 'day' => ':count siqiñiq', // less reliable - 'd' => ':count siqiñiq', // less reliable - 'a_day' => ':count siqiñiq', // less reliable - - 'hour' => ':count Siḷa', // less reliable - 'h' => ':count Siḷa', // less reliable - 'a_hour' => ':count Siḷa', // less reliable - - 'second' => ':count iġñiq', // less reliable - 's' => ':count iġñiq', // less reliable - 'a_second' => ':count iġñiq', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/in.php b/dependencies/nesbot/carbon/src/Carbon/Lang/in.php deleted file mode 100644 index d5953a1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/in.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/id.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/is.php b/dependencies/nesbot/carbon/src/Carbon/Lang/is.php deleted file mode 100644 index 9990168..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/is.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kristján Ingi Geirsson - */ -return [ - 'year' => '1 ár|:count ár', - 'y' => '1 ár|:count ár', - 'month' => '1 mánuður|:count mánuðir', - 'm' => '1 mánuður|:count mánuðir', - 'week' => '1 vika|:count vikur', - 'w' => '1 vika|:count vikur', - 'day' => '1 dagur|:count dagar', - 'd' => '1 dagur|:count dagar', - 'hour' => '1 klukkutími|:count klukkutímar', - 'h' => '1 klukkutími|:count klukkutímar', - 'minute' => '1 mínúta|:count mínútur', - 'min' => '1 mínúta|:count mínútur', - 'second' => '1 sekúnda|:count sekúndur', - 's' => '1 sekúnda|:count sekúndur', - 'ago' => ':time síðan', - 'from_now' => ':time síðan', - 'after' => ':time eftir', - 'before' => ':time fyrir', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], - 'meridiem' => ['fh', 'eh'], - 'diff_now' => 'núna', - 'diff_yesterday' => 'í gær', - 'diff_tomorrow' => 'á morgun', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM [kl.] HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', - ], - 'weekdays' => ['sunnudaginn', 'mánudaginn', 'þriðjudaginn', 'miðvikudaginn', 'fimmtudaginn', 'föstudaginn', 'laugardaginn'], - 'weekdays_short' => ['sun', 'mán', 'þri', 'mið', 'fim', 'fös', 'lau'], - 'weekdays_min' => ['sun', 'mán', 'þri', 'mið', 'fim', 'fös', 'lau'], - 'months' => ['janúar', 'febrúar', 'mars', 'apríl', 'maí', 'júní', 'júlí', 'ágúst', 'september', 'október', 'nóvember', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maí', 'jún', 'júl', 'ágú', 'sep', 'okt', 'nóv', 'des'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/is_IS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/is_IS.php deleted file mode 100644 index 4d35c44..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/is_IS.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/is.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/it.php b/dependencies/nesbot/carbon/src/Carbon/Lang/it.php deleted file mode 100644 index 49875d7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/it.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ash - * - François B - * - Marco Perrando - * - Massimiliano Caniparoli - * - JD Isaacks - * - Andrea Martini - * - Francesco Marasco - * - Tizianoz93 - * - Davide Casiraghi (davide-casiraghi) - * - Pete Scopes (pdscopes) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count anno|:count anni', - 'a_year' => 'un anno|:count anni', - 'y' => ':count anno|:count anni', - 'month' => ':count mese|:count mesi', - 'a_month' => 'un mese|:count mesi', - 'm' => ':count mese|:count mesi', - 'week' => ':count settimana|:count settimane', - 'a_week' => 'una settimana|:count settimane', - 'w' => ':count set.', - 'day' => ':count giorno|:count giorni', - 'a_day' => 'un giorno|:count giorni', - 'd' => ':count g|:count gg', - 'hour' => ':count ora|:count ore', - 'a_hour' => 'un\'ora|:count ore', - 'h' => ':count h', - 'minute' => ':count minuto|:count minuti', - 'a_minute' => 'un minuto|:count minuti', - 'min' => ':count min.', - 'second' => ':count secondo|:count secondi', - 'a_second' => 'alcuni secondi|:count secondi', - 's' => ':count sec.', - 'millisecond' => ':count millisecondo|:count millisecondi', - 'a_millisecond' => 'un millisecondo|:count millisecondi', - 'ms' => ':countms', - 'microsecond' => ':count microsecondo|:count microsecondi', - 'a_microsecond' => 'un microsecondo|:count microsecondi', - 'µs' => ':countµs', - 'ago' => ':time fa', - 'from_now' => function ($time) { - return (preg_match('/^\d.+$/', $time) ? 'tra' : 'in')." $time"; - }, - 'after' => ':time dopo', - 'before' => ':time prima', - 'diff_now' => 'proprio ora', - 'diff_today' => 'Oggi', - 'diff_today_regexp' => 'Oggi(?:\\s+alle)?', - 'diff_yesterday' => 'ieri', - 'diff_yesterday_regexp' => 'Ieri(?:\\s+alle)?', - 'diff_tomorrow' => 'domani', - 'diff_tomorrow_regexp' => 'Domani(?:\\s+alle)?', - 'diff_before_yesterday' => 'l\'altro ieri', - 'diff_after_tomorrow' => 'dopodomani', - 'period_interval' => 'ogni :interval', - 'period_start_date' => 'dal :date', - 'period_end_date' => 'al :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Oggi alle] LT', - 'nextDay' => '[Domani alle] LT', - 'nextWeek' => 'dddd [alle] LT', - 'lastDay' => '[Ieri alle] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'], - 'months_short' => ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'], - 'weekdays' => ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'], - 'weekdays_short' => ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'], - 'weekdays_min' => ['do', 'lu', 'ma', 'me', 'gi', 've', 'sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], - 'ordinal_words' => [ - 'of' => 'di', - 'first' => 'primo', - 'second' => 'secondo', - 'third' => 'terzo', - 'fourth' => 'quarto', - 'fifth' => 'quinto', - 'last' => 'ultimo', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/it_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/it_CH.php deleted file mode 100644 index c23cc50..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/it_CH.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Propaganistas - */ -return array_replace_recursive(require __DIR__.'/it.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/it_IT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/it_IT.php deleted file mode 100644 index a5d1981..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/it_IT.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return require __DIR__.'/it.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/it_SM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/it_SM.php deleted file mode 100644 index 5e8fc92..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/it_SM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/it.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/it_VA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/it_VA.php deleted file mode 100644 index 5e8fc92..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/it_VA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/it.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/iu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/iu.php deleted file mode 100644 index 4fa9742..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/iu.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/iu_CA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/iu_CA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/iu_CA.php deleted file mode 100644 index 6ab7e14..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/iu_CA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Pablo Saratxaga pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'MM/DD/YY', - ], - 'months' => ['ᔮᓄᐊᓕ', 'ᕕᕗᐊᓕ', 'ᒪᔅᓯ', 'ᐃᐳᓗ', 'ᒪᐃ', 'ᔪᓂ', 'ᔪᓚᐃ', 'ᐊᒋᓯ', 'ᓯᑎᕙ', 'ᐊᑦᑐᕙ', 'ᓄᕕᕙ', 'ᑎᓯᕝᕙ'], - 'months_short' => ['ᔮᓄ', 'ᕕᕗ', 'ᒪᔅ', 'ᐃᐳ', 'ᒪᐃ', 'ᔪᓂ', 'ᔪᓚ', 'ᐊᒋ', 'ᓯᑎ', 'ᐊᑦ', 'ᓄᕕ', 'ᑎᓯ'], - 'weekdays' => ['ᓈᑦᑎᖑᔭᕐᕕᒃ', 'ᓇᒡᒐᔾᔭᐅ', 'ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ', 'ᐱᖓᓲᓕᖅᓯᐅᑦ', 'ᕿᑎᖅᑰᑦ', 'ᐅᓪᓗᕈᓘᑐᐃᓇᖅ', 'ᓯᕙᑖᕕᒃ'], - 'weekdays_short' => ['ᓈ', 'ᓇ', 'ᓕ', 'ᐱ', 'ᕿ', 'ᐅ', 'ᓯ'], - 'weekdays_min' => ['ᓈ', 'ᓇ', 'ᓕ', 'ᐱ', 'ᕿ', 'ᐅ', 'ᓯ'], - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ᐅᑭᐅᖅ', - 'y' => ':count ᐅᑭᐅᖅ', - 'a_year' => ':count ᐅᑭᐅᖅ', - - 'month' => ':count qaammat', - 'm' => ':count qaammat', - 'a_month' => ':count qaammat', - - 'week' => ':count sapaatip akunnera', - 'w' => ':count sapaatip akunnera', - 'a_week' => ':count sapaatip akunnera', - - 'day' => ':count ulloq', - 'd' => ':count ulloq', - 'a_day' => ':count ulloq', - - 'hour' => ':count ikarraq', - 'h' => ':count ikarraq', - 'a_hour' => ':count ikarraq', - - 'minute' => ':count titiqqaralaaq', // less reliable - 'min' => ':count titiqqaralaaq', // less reliable - 'a_minute' => ':count titiqqaralaaq', // less reliable - - 'second' => ':count marluk', // less reliable - 's' => ':count marluk', // less reliable - 'a_second' => ':count marluk', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/iw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/iw.php deleted file mode 100644 index a26e350..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/iw.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'], - 'months_short' => ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'], - 'weekdays' => ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'], - 'weekdays_short' => ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'], - 'weekdays_min' => ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'], - 'meridiem' => ['לפנה״צ', 'אחה״צ'], - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D.M.YYYY', - 'LL' => 'D בMMM YYYY', - 'LLL' => 'D בMMMM YYYY H:mm', - 'LLLL' => 'dddd, D בMMMM YYYY H:mm', - ], - - 'year' => ':count שנה', - 'y' => ':count שנה', - 'a_year' => ':count שנה', - - 'month' => ':count חודש', - 'm' => ':count חודש', - 'a_month' => ':count חודש', - - 'week' => ':count שבוע', - 'w' => ':count שבוע', - 'a_week' => ':count שבוע', - - 'day' => ':count יום', - 'd' => ':count יום', - 'a_day' => ':count יום', - - 'hour' => ':count שעה', - 'h' => ':count שעה', - 'a_hour' => ':count שעה', - - 'minute' => ':count דקה', - 'min' => ':count דקה', - 'a_minute' => ':count דקה', - - 'second' => ':count שניה', - 's' => ':count שניה', - 'a_second' => ':count שניה', - - 'ago' => 'לפני :time', - 'from_now' => 'בעוד :time', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ja.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ja.php deleted file mode 100644 index 1ca6751..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ja.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Takuya Sawada - * - Atsushi Tanaka - * - François B - * - Jason Katz-Brown - * - Serhan Apaydın - * - XueWei - * - JD Isaacks - * - toyama satoshi - * - atakigawa - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count年', - 'y' => ':count年', - 'month' => ':countヶ月', - 'm' => ':countヶ月', - 'week' => ':count週間', - 'w' => ':count週間', - 'day' => ':count日', - 'd' => ':count日', - 'hour' => ':count時間', - 'h' => ':count時間', - 'minute' => ':count分', - 'min' => ':count分', - 'second' => ':count秒', - 'a_second' => '{1}数秒|]1,Inf[:count秒', - 's' => ':count秒', - 'ago' => ':time前', - 'from_now' => ':time後', - 'after' => ':time後', - 'before' => ':time前', - 'diff_now' => '今', - 'diff_today' => '今日', - 'diff_yesterday' => '昨日', - 'diff_tomorrow' => '明日', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 HH:mm', - 'LLLL' => 'YYYY年M月D日 dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[今日] LT', - 'nextDay' => '[明日] LT', - 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) { - if ($other->week !== $current->week) { - return '[来週]dddd LT'; - } - - return 'dddd LT'; - }, - 'lastDay' => '[昨日] LT', - 'lastWeek' => function (CarbonInterface $current, CarbonInterface $other) { - if ($other->week !== $current->week) { - return '[先週]dddd LT'; - } - - return 'dddd LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'DDD': - return $number.'日'; - default: - return $number; - } - }, - 'meridiem' => ['午前', '午後'], - 'months' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'], - 'weekdays_short' => ['日', '月', '火', '水', '木', '金', '土'], - 'weekdays_min' => ['日', '月', '火', '水', '木', '金', '土'], - 'list' => '、', - 'alt_numbers' => ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十', '三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十', '四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十', '五十一', '五十二', '五十三', '五十四', '五十五', '五十六', '五十七', '五十八', '五十九', '六十', '六十一', '六十二', '六十三', '六十四', '六十五', '六十六', '六十七', '六十八', '六十九', '七十', '七十一', '七十二', '七十三', '七十四', '七十五', '七十六', '七十七', '七十八', '七十九', '八十', '八十一', '八十二', '八十三', '八十四', '八十五', '八十六', '八十七', '八十八', '八十九', '九十', '九十一', '九十二', '九十三', '九十四', '九十五', '九十六', '九十七', '九十八', '九十九'], - 'alt_numbers_pow' => [ - 10000 => '万', - 1000 => '千', - 100 => '百', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ja_JP.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ja_JP.php deleted file mode 100644 index c283625..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ja_JP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ja.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/jgo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/jgo.php deleted file mode 100644 index 6a1e77a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/jgo.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/jmc.php b/dependencies/nesbot/carbon/src/Carbon/Lang/jmc.php deleted file mode 100644 index ed92e8e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/jmc.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['utuko', 'kyiukonyi'], - 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/jv.php b/dependencies/nesbot/carbon/src/Carbon/Lang/jv.php deleted file mode 100644 index bcbe044..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/jv.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - tgfjt - * - JD Isaacks - */ -return [ - 'year' => '{1}setaun|]1,Inf[:count taun', - 'month' => '{1}sewulan|]1,Inf[:count wulan', - 'week' => '{1}sakminggu|]1,Inf[:count minggu', - 'day' => '{1}sedinten|]1,Inf[:count dinten', - 'hour' => '{1}setunggal jam|]1,Inf[:count jam', - 'minute' => '{1}setunggal menit|]1,Inf[:count menit', - 'second' => '{1}sawetawis detik|]1,Inf[:count detik', - 'ago' => ':time ingkang kepengker', - 'from_now' => 'wonten ing :time', - 'diff_today' => 'Dinten', - 'diff_yesterday' => 'Kala', - 'diff_yesterday_regexp' => 'Kala(?:\\s+wingi)?(?:\\s+pukul)?', - 'diff_tomorrow' => 'Mbenjang', - 'diff_tomorrow_regexp' => 'Mbenjang(?:\\s+pukul)?', - 'diff_today_regexp' => 'Dinten(?:\\s+puniko)?(?:\\s+pukul)?', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [pukul] HH.mm', - 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', - ], - 'calendar' => [ - 'sameDay' => '[Dinten puniko pukul] LT', - 'nextDay' => '[Mbenjang pukul] LT', - 'nextWeek' => 'dddd [pukul] LT', - 'lastDay' => '[Kala wingi pukul] LT', - 'lastWeek' => 'dddd [kepengker pukul] LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 11) { - return 'enjing'; - } - if ($hour < 15) { - return 'siyang'; - } - if ($hour < 19) { - return 'sonten'; - } - - return 'ndalu'; - }, - 'months' => ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'Nopember', 'Desember'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nop', 'Des'], - 'weekdays' => ['Minggu', 'Senen', 'Seloso', 'Rebu', 'Kemis', 'Jemuwah', 'Septu'], - 'weekdays_short' => ['Min', 'Sen', 'Sel', 'Reb', 'Kem', 'Jem', 'Sep'], - 'weekdays_min' => ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sp'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' lan '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ka.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ka.php deleted file mode 100644 index a5d563d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ka.php +++ /dev/null @@ -1,204 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Tornike Razmadze - * - François B - * - Lasha Dolidze - * - Tim Fish - * - JD Isaacks - * - Tornike Razmadze - * - François B - * - Lasha Dolidze - * - JD Isaacks - * - LONGMAN - * - Avtandil Kikabidze (akalongman) - * - Levan Velijanashvili (Stichoza) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count წელი', - 'y' => ':count წელი', - 'a_year' => '{1}წელი|]1,Inf[:count წელი', - 'month' => ':count თვე', - 'm' => ':count თვე', - 'a_month' => '{1}თვე|]1,Inf[:count თვე', - 'week' => ':count კვირა', - 'w' => ':count კვირა', - 'a_week' => '{1}კვირა|]1,Inf[:count კვირა', - 'day' => ':count დღე', - 'd' => ':count დღე', - 'a_day' => '{1}დღე|]1,Inf[:count დღე', - 'hour' => ':count საათი', - 'h' => ':count საათი', - 'a_hour' => '{1}საათი|]1,Inf[:count საათი', - 'minute' => ':count წუთი', - 'min' => ':count წუთი', - 'a_minute' => '{1}წუთი|]1,Inf[:count წუთი', - 'second' => ':count წამი', - 's' => ':count წამი', - 'a_second' => '{1}რამდენიმე წამი|]1,Inf[:count წამი', - 'ago' => function ($time) { - $replacements = [ - // year - 'წელი' => 'წლის', - // month - 'თვე' => 'თვის', - // week - 'კვირა' => 'კვირის', - // day - 'დღე' => 'დღის', - // hour - 'საათი' => 'საათის', - // minute - 'წუთი' => 'წუთის', - // second - 'წამი' => 'წამის', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return "$time წინ"; - }, - 'from_now' => function ($time) { - $replacements = [ - // year - 'წელი' => 'წელიწადში', - // week - 'კვირა' => 'კვირაში', - // day - 'დღე' => 'დღეში', - // month - 'თვე' => 'თვეში', - // hour - 'საათი' => 'საათში', - // minute - 'წუთი' => 'წუთში', - // second - 'წამი' => 'წამში', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return $time; - }, - 'after' => function ($time) { - $replacements = [ - // year - 'წელი' => 'წლის', - // month - 'თვე' => 'თვის', - // week - 'კვირა' => 'კვირის', - // day - 'დღე' => 'დღის', - // hour - 'საათი' => 'საათის', - // minute - 'წუთი' => 'წუთის', - // second - 'წამი' => 'წამის', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return "$time შემდეგ"; - }, - 'before' => function ($time) { - $replacements = [ - // year - 'წელი' => 'წლით', - // month - 'თვე' => 'თვით', - // week - 'კვირა' => 'კვირით', - // day - 'დღე' => 'დღით', - // hour - 'საათი' => 'საათით', - // minute - 'წუთი' => 'წუთით', - // second - 'წამი' => 'წამით', - ]; - $time = strtr($time, array_flip($replacements)); - $time = strtr($time, $replacements); - - return "$time ადრე"; - }, - 'diff_now' => 'ახლა', - 'diff_today' => 'დღეს', - 'diff_yesterday' => 'გუშინ', - 'diff_tomorrow' => 'ხვალ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[დღეს], LT[-ზე]', - 'nextDay' => '[ხვალ], LT[-ზე]', - 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) { - return ($current->isSameWeek($other) ? '' : '[შემდეგ] ').'dddd, LT[-ზე]'; - }, - 'lastDay' => '[გუშინ], LT[-ზე]', - 'lastWeek' => '[წინა] dddd, LT-ზე', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - if ($number === 0) { - return $number; - } - if ($number === 1) { - return $number.'-ლი'; - } - if (($number < 20) || ($number <= 100 && ($number % 20 === 0)) || ($number % 100 === 0)) { - return 'მე-'.$number; - } - - return $number.'-ე'; - }, - 'months' => ['იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'], - 'months_standalone' => ['იანვარს', 'თებერვალს', 'მარტს', 'აპრილს', 'მაისს', 'ივნისს', 'ივლისს', 'აგვისტოს', 'სექტემბერს', 'ოქტომბერს', 'ნოემბერს', 'დეკემბერს'], - 'months_short' => ['იან', 'თებ', 'მარ', 'აპრ', 'მაი', 'ივნ', 'ივლ', 'აგვ', 'სექ', 'ოქტ', 'ნოე', 'დეკ'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['კვირას', 'ორშაბათს', 'სამშაბათს', 'ოთხშაბათს', 'ხუთშაბათს', 'პარასკევს', 'შაბათს'], - 'weekdays_standalone' => ['კვირა', 'ორშაბათი', 'სამშაბათი', 'ოთხშაბათი', 'ხუთშაბათი', 'პარასკევი', 'შაბათი'], - 'weekdays_short' => ['კვი', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'], - 'weekdays_min' => ['კვ', 'ორ', 'სა', 'ოთ', 'ხუ', 'პა', 'შა'], - 'weekdays_regexp' => '/^([^d].*|.*[^d])$/', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' და '], - 'meridiem' => function ($hour) { - if ($hour >= 4) { - if ($hour < 11) { - return 'დილის'; - } - - if ($hour < 16) { - return 'შუადღის'; - } - - if ($hour < 22) { - return 'საღამოს'; - } - } - - return 'ღამის'; - }, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ka_GE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ka_GE.php deleted file mode 100644 index a26d930..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ka_GE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ka.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kab.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kab.php deleted file mode 100644 index 94d6473..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kab.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kab_DZ.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kab_DZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kab_DZ.php deleted file mode 100644 index 796660b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kab_DZ.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - belkacem77@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Yennayer', 'Fuṛar', 'Meɣres', 'Yebrir', 'Mayyu', 'Yunyu', 'Yulyu', 'ɣuct', 'Ctembeṛ', 'Tubeṛ', 'Wambeṛ', 'Dujembeṛ'], - 'months_short' => ['Yen', 'Fur', 'Meɣ', 'Yeb', 'May', 'Yun', 'Yul', 'ɣuc', 'Cte', 'Tub', 'Wam', 'Duj'], - 'weekdays' => ['Acer', 'Arim', 'Aram', 'Ahad', 'Amhad', 'Sem', 'Sed'], - 'weekdays_short' => ['Ace', 'Ari', 'Ara', 'Aha', 'Amh', 'Sem', 'Sed'], - 'weekdays_min' => ['Ace', 'Ari', 'Ara', 'Aha', 'Amh', 'Sem', 'Sed'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['FT', 'MD'], - - 'year' => ':count n yiseggasen', - 'y' => ':count n yiseggasen', - 'a_year' => ':count n yiseggasen', - - 'month' => ':count n wayyuren', - 'm' => ':count n wayyuren', - 'a_month' => ':count n wayyuren', - - 'week' => ':count n ledwaṛ', // less reliable - 'w' => ':count n ledwaṛ', // less reliable - 'a_week' => ':count n ledwaṛ', // less reliable - - 'day' => ':count n wussan', - 'd' => ':count n wussan', - 'a_day' => ':count n wussan', - - 'hour' => ':count n tsaɛtin', - 'h' => ':count n tsaɛtin', - 'a_hour' => ':count n tsaɛtin', - - 'minute' => ':count n tedqiqin', - 'min' => ':count n tedqiqin', - 'a_minute' => ':count n tedqiqin', - - 'second' => ':count tasdidt', // less reliable - 's' => ':count tasdidt', // less reliable - 'a_second' => ':count tasdidt', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kam.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kam.php deleted file mode 100644 index 0fc70d7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kam.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Ĩyakwakya', 'Ĩyawĩoo'], - 'weekdays' => ['Wa kyumwa', 'Wa kwambĩlĩlya', 'Wa kelĩ', 'Wa katatũ', 'Wa kana', 'Wa katano', 'Wa thanthatũ'], - 'weekdays_short' => ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'], - 'weekdays_min' => ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'], - 'months' => ['Mwai wa mbee', 'Mwai wa kelĩ', 'Mwai wa katatũ', 'Mwai wa kana', 'Mwai wa katano', 'Mwai wa thanthatũ', 'Mwai wa muonza', 'Mwai wa nyaanya', 'Mwai wa kenda', 'Mwai wa ĩkumi', 'Mwai wa ĩkumi na ĩmwe', 'Mwai wa ĩkumi na ilĩ'], - 'months_short' => ['Mbe', 'Kel', 'Ktũ', 'Kan', 'Ktn', 'Tha', 'Moo', 'Nya', 'Knd', 'Ĩku', 'Ĩkm', 'Ĩkl'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - // Too unreliable - /* - 'year' => ':count mbua', // less reliable - 'y' => ':count mbua', // less reliable - 'a_year' => ':count mbua', // less reliable - - 'month' => ':count ndakitali', // less reliable - 'm' => ':count ndakitali', // less reliable - 'a_month' => ':count ndakitali', // less reliable - - 'day' => ':count wia', // less reliable - 'd' => ':count wia', // less reliable - 'a_day' => ':count wia', // less reliable - - 'hour' => ':count orasan', // less reliable - 'h' => ':count orasan', // less reliable - 'a_hour' => ':count orasan', // less reliable - - 'minute' => ':count orasan', // less reliable - 'min' => ':count orasan', // less reliable - 'a_minute' => ':count orasan', // less reliable - */ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kde.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kde.php deleted file mode 100644 index fbcc9f3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kde.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Muhi', 'Chilo'], - 'weekdays' => ['Liduva lyapili', 'Liduva lyatatu', 'Liduva lyanchechi', 'Liduva lyannyano', 'Liduva lyannyano na linji', 'Liduva lyannyano na mavili', 'Liduva litandi'], - 'weekdays_short' => ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'], - 'weekdays_min' => ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'], - 'months' => ['Mwedi Ntandi', 'Mwedi wa Pili', 'Mwedi wa Tatu', 'Mwedi wa Nchechi', 'Mwedi wa Nnyano', 'Mwedi wa Nnyano na Umo', 'Mwedi wa Nnyano na Mivili', 'Mwedi wa Nnyano na Mitatu', 'Mwedi wa Nnyano na Nchechi', 'Mwedi wa Nnyano na Nnyano', 'Mwedi wa Nnyano na Nnyano na U', 'Mwedi wa Nnyano na Nnyano na M'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kea.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kea.php deleted file mode 100644 index 8b6c21b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kea.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['a', 'p'], - 'weekdays' => ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sabadu'], - 'weekdays_short' => ['dum', 'sig', 'ter', 'kua', 'kin', 'ses', 'sab'], - 'weekdays_min' => ['du', 'si', 'te', 'ku', 'ki', 'se', 'sa'], - 'weekdays_standalone' => ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sábadu'], - 'months' => ['Janeru', 'Febreru', 'Marsu', 'Abril', 'Maiu', 'Junhu', 'Julhu', 'Agostu', 'Setenbru', 'Otubru', 'Nuvenbru', 'Dizenbru'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Otu', 'Nuv', 'Diz'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D [di] MMMM [di] YYYY HH:mm', - 'LLLL' => 'dddd, D [di] MMMM [di] YYYY HH:mm', - ], - - 'year' => ':count otunu', // less reliable - 'y' => ':count otunu', // less reliable - 'a_year' => ':count otunu', // less reliable - - 'week' => ':count día dumingu', // less reliable - 'w' => ':count día dumingu', // less reliable - 'a_week' => ':count día dumingu', // less reliable - - 'day' => ':count diâ', // less reliable - 'd' => ':count diâ', // less reliable - 'a_day' => ':count diâ', // less reliable - - 'minute' => ':count sugundu', // less reliable - 'min' => ':count sugundu', // less reliable - 'a_minute' => ':count sugundu', // less reliable - - 'second' => ':count dós', // less reliable - 's' => ':count dós', // less reliable - 'a_second' => ':count dós', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/khq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/khq.php deleted file mode 100644 index 7a834cf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/khq.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Adduha', 'Aluula'], - 'weekdays' => ['Alhadi', 'Atini', 'Atalata', 'Alarba', 'Alhamiisa', 'Aljuma', 'Assabdu'], - 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'], - 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'], - 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], - 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ki.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ki.php deleted file mode 100644 index d86afc5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ki.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Kiroko', 'Hwaĩ-inĩ'], - 'weekdays' => ['Kiumia', 'Njumatatũ', 'Njumaine', 'Njumatana', 'Aramithi', 'Njumaa', 'Njumamothi'], - 'weekdays_short' => ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'], - 'weekdays_min' => ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'], - 'months' => ['Njenuarĩ', 'Mwere wa kerĩ', 'Mwere wa gatatũ', 'Mwere wa kana', 'Mwere wa gatano', 'Mwere wa gatandatũ', 'Mwere wa mũgwanja', 'Mwere wa kanana', 'Mwere wa kenda', 'Mwere wa ikũmi', 'Mwere wa ikũmi na ũmwe', 'Ndithemba'], - 'months_short' => ['JEN', 'WKR', 'WGT', 'WKN', 'WTN', 'WTD', 'WMJ', 'WNN', 'WKD', 'WIK', 'WMW', 'DIT'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count mĩaka', // less reliable - 'y' => ':count mĩaka', // less reliable - 'a_year' => ':count mĩaka', // less reliable - - 'month' => ':count mweri', // less reliable - 'm' => ':count mweri', // less reliable - 'a_month' => ':count mweri', // less reliable - - 'week' => ':count kiumia', // less reliable - 'w' => ':count kiumia', // less reliable - 'a_week' => ':count kiumia', // less reliable - - 'day' => ':count mũthenya', // less reliable - 'd' => ':count mũthenya', // less reliable - 'a_day' => ':count mũthenya', // less reliable - - 'hour' => ':count thaa', // less reliable - 'h' => ':count thaa', // less reliable - 'a_hour' => ':count thaa', // less reliable - - 'minute' => ':count mundu', // less reliable - 'min' => ':count mundu', // less reliable - 'a_minute' => ':count mundu', // less reliable - - 'second' => ':count igego', // less reliable - 's' => ':count igego', // less reliable - 'a_second' => ':count igego', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kk.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kk.php deleted file mode 100644 index 59fa9af..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kk.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - Talat Uspanov - * - Нурлан Рахимжанов - * - Toleugazy Kali - */ -return [ - 'year' => ':count жыл', - 'a_year' => '{1}бір жыл|:count жыл', - 'y' => ':count ж.', - 'month' => ':count ай', - 'a_month' => '{1}бір ай|:count ай', - 'm' => ':count ай', - 'week' => ':count апта', - 'a_week' => '{1}бір апта', - 'w' => ':count ап.', - 'day' => ':count күн', - 'a_day' => '{1}бір күн|:count күн', - 'd' => ':count к.', - 'hour' => ':count сағат', - 'a_hour' => '{1}бір сағат|:count сағат', - 'h' => ':count са.', - 'minute' => ':count минут', - 'a_minute' => '{1}бір минут|:count минут', - 'min' => ':count м.', - 'second' => ':count секунд', - 'a_second' => '{1}бірнеше секунд|:count секунд', - 's' => ':count се.', - 'ago' => ':time бұрын', - 'from_now' => ':time ішінде', - 'after' => ':time кейін', - 'before' => ':time бұрын', - 'diff_now' => 'қазір', - 'diff_today' => 'Бүгін', - 'diff_today_regexp' => 'Бүгін(?:\\s+сағат)?', - 'diff_yesterday' => 'кеше', - 'diff_yesterday_regexp' => 'Кеше(?:\\s+сағат)?', - 'diff_tomorrow' => 'ертең', - 'diff_tomorrow_regexp' => 'Ертең(?:\\s+сағат)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Бүгін сағат] LT', - 'nextDay' => '[Ертең сағат] LT', - 'nextWeek' => 'dddd [сағат] LT', - 'lastDay' => '[Кеше сағат] LT', - 'lastWeek' => '[Өткен аптаның] dddd [сағат] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - static $suffixes = [ - 0 => '-ші', - 1 => '-ші', - 2 => '-ші', - 3 => '-ші', - 4 => '-ші', - 5 => '-ші', - 6 => '-шы', - 7 => '-ші', - 8 => '-ші', - 9 => '-шы', - 10 => '-шы', - 20 => '-шы', - 30 => '-шы', - 40 => '-шы', - 50 => '-ші', - 60 => '-шы', - 70 => '-ші', - 80 => '-ші', - 90 => '-шы', - 100 => '-ші', - ]; - - return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'months' => ['қаңтар', 'ақпан', 'наурыз', 'сәуір', 'мамыр', 'маусым', 'шілде', 'тамыз', 'қыркүйек', 'қазан', 'қараша', 'желтоқсан'], - 'months_short' => ['қаң', 'ақп', 'нау', 'сәу', 'мам', 'мау', 'шіл', 'там', 'қыр', 'қаз', 'қар', 'жел'], - 'weekdays' => ['жексенбі', 'дүйсенбі', 'сейсенбі', 'сәрсенбі', 'бейсенбі', 'жұма', 'сенбі'], - 'weekdays_short' => ['жек', 'дүй', 'сей', 'сәр', 'бей', 'жұм', 'сен'], - 'weekdays_min' => ['жк', 'дй', 'сй', 'ср', 'бй', 'жм', 'сн'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' және '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kk_KZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kk_KZ.php deleted file mode 100644 index 7dc5ebc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kk_KZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/kk.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kkj.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kkj.php deleted file mode 100644 index 6a1e77a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kkj.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kl.php deleted file mode 100644 index 7329a07..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kl.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kl_GL.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kl_GL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kl_GL.php deleted file mode 100644 index 4fed720..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kl_GL.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Danish Standards Association bug-glibc-locales@gnu.org - * - John Eyðstein Johannesen (mashema) - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd [d.] D. MMMM YYYY [kl.] HH:mm', - ], - 'months' => ['januaarip', 'februaarip', 'marsip', 'apriilip', 'maajip', 'juunip', 'juulip', 'aggustip', 'septembarip', 'oktobarip', 'novembarip', 'decembarip'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['sapaat', 'ataasinngorneq', 'marlunngorneq', 'pingasunngorneq', 'sisamanngorneq', 'tallimanngorneq', 'arfininngorneq'], - 'weekdays_short' => ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'], - 'weekdays_min' => ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => '{1}ukioq :count|{0}:count ukiut|]1,Inf[ukiut :count', - 'a_year' => '{1}ukioq|{0}:count ukiut|]1,Inf[ukiut :count', - 'y' => '{1}:countyr|{0}:countyrs|]1,Inf[:countyrs', - - 'month' => '{1}qaammat :count|{0}:count qaammatit|]1,Inf[qaammatit :count', - 'a_month' => '{1}qaammat|{0}:count qaammatit|]1,Inf[qaammatit :count', - 'm' => '{1}:countmo|{0}:countmos|]1,Inf[:countmos', - - 'week' => '{1}:count sap. ak.|{0}:count sap. ak.|]1,Inf[:count sap. ak.', - 'a_week' => '{1}a sap. ak.|{0}:count sap. ak.|]1,Inf[:count sap. ak.', - 'w' => ':countw', - - 'day' => '{1}:count ulloq|{0}:count ullut|]1,Inf[:count ullut', - 'a_day' => '{1}a ulloq|{0}:count ullut|]1,Inf[:count ullut', - 'd' => ':countd', - - 'hour' => '{1}:count tiimi|{0}:count tiimit|]1,Inf[:count tiimit', - 'a_hour' => '{1}tiimi|{0}:count tiimit|]1,Inf[:count tiimit', - 'h' => ':counth', - - 'minute' => '{1}:count minutsi|{0}:count minutsit|]1,Inf[:count minutsit', - 'a_minute' => '{1}a minutsi|{0}:count minutsit|]1,Inf[:count minutsit', - 'min' => ':countm', - - 'second' => '{1}:count sikunti|{0}:count sikuntit|]1,Inf[:count sikuntit', - 'a_second' => '{1}sikunti|{0}:count sikuntit|]1,Inf[:count sikuntit', - 's' => ':counts', - - 'ago' => ':time matuma siorna', - -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kln.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kln.php deleted file mode 100644 index b9c3996..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kln.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['krn', 'koosk'], - 'weekdays' => ['Kotisap', 'Kotaai', 'Koaeng’', 'Kosomok', 'Koang’wan', 'Komuut', 'Kolo'], - 'weekdays_short' => ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'], - 'weekdays_min' => ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'], - 'months' => ['Mulgul', 'Ng’atyaato', 'Kiptaamo', 'Iwootkuut', 'Mamuut', 'Paagi', 'Ng’eiyeet', 'Rooptui', 'Bureet', 'Epeeso', 'Kipsuunde ne taai', 'Kipsuunde nebo aeng’'], - 'months_short' => ['Mul', 'Ngat', 'Taa', 'Iwo', 'Mam', 'Paa', 'Nge', 'Roo', 'Bur', 'Epe', 'Kpt', 'Kpa'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count maghatiat', // less reliable - 'y' => ':count maghatiat', // less reliable - 'a_year' => ':count maghatiat', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/km.php b/dependencies/nesbot/carbon/src/Carbon/Lang/km.php deleted file mode 100644 index da790ac..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/km.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kruy Vanna - * - Sereysethy Touch - * - JD Isaacks - * - Sovichet Tep - */ -return [ - 'year' => '{1}មួយឆ្នាំ|]1,Inf[:count ឆ្នាំ', - 'y' => ':count ឆ្នាំ', - 'month' => '{1}មួយខែ|]1,Inf[:count ខែ', - 'm' => ':count ខែ', - 'week' => ':count សប្ដាហ៍', - 'w' => ':count សប្ដាហ៍', - 'day' => '{1}មួយថ្ងៃ|]1,Inf[:count ថ្ងៃ', - 'd' => ':count ថ្ងៃ', - 'hour' => '{1}មួយម៉ោង|]1,Inf[:count ម៉ោង', - 'h' => ':count ម៉ោង', - 'minute' => '{1}មួយនាទី|]1,Inf[:count នាទី', - 'min' => ':count នាទី', - 'second' => '{1}ប៉ុន្មានវិនាទី|]1,Inf[:count វិនាទី', - 's' => ':count វិនាទី', - 'ago' => ':timeមុន', - 'from_now' => ':timeទៀត', - 'after' => 'នៅ​ក្រោយ :time', - 'before' => 'នៅ​មុន :time', - 'diff_now' => 'ឥឡូវ', - 'diff_today' => 'ថ្ងៃនេះ', - 'diff_today_regexp' => 'ថ្ងៃនេះ(?:\\s+ម៉ោង)?', - 'diff_yesterday' => 'ម្សិលមិញ', - 'diff_yesterday_regexp' => 'ម្សិលមិញ(?:\\s+ម៉ោង)?', - 'diff_tomorrow' => 'ថ្ងៃ​ស្អែក', - 'diff_tomorrow_regexp' => 'ស្អែក(?:\\s+ម៉ោង)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ថ្ងៃនេះ ម៉ោង] LT', - 'nextDay' => '[ស្អែក ម៉ោង] LT', - 'nextWeek' => 'dddd [ម៉ោង] LT', - 'lastDay' => '[ម្សិលមិញ ម៉ោង] LT', - 'lastWeek' => 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', - 'sameElse' => 'L', - ], - 'ordinal' => 'ទី:number', - 'meridiem' => ['ព្រឹក', 'ល្ងាច'], - 'months' => ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'], - 'months_short' => ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'], - 'weekdays' => ['អាទិត្យ', 'ច័ន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'], - 'weekdays_short' => ['អា', 'ច', 'អ', 'ព', 'ព្រ', 'សុ', 'ស'], - 'weekdays_min' => ['អា', 'ច', 'អ', 'ព', 'ព្រ', 'សុ', 'ស'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', 'និង '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/km_KH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/km_KH.php deleted file mode 100644 index 92e5fdb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/km_KH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/km.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kn.php deleted file mode 100644 index 0d2ad08..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kn.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - MOHAN M U - * - François B - * - rajeevnaikte - */ -return [ - 'year' => '{1}ಒಂದು ವರ್ಷ|]1,Inf[:count ವರ್ಷ', - 'month' => '{1}ಒಂದು ತಿಂಗಳು|]1,Inf[:count ತಿಂಗಳು', - 'week' => '{1}ಒಂದು ವಾರ|]1,Inf[:count ವಾರಗಳು', - 'day' => '{1}ಒಂದು ದಿನ|]1,Inf[:count ದಿನ', - 'hour' => '{1}ಒಂದು ಗಂಟೆ|]1,Inf[:count ಗಂಟೆ', - 'minute' => '{1}ಒಂದು ನಿಮಿಷ|]1,Inf[:count ನಿಮಿಷ', - 'second' => '{1}ಕೆಲವು ಕ್ಷಣಗಳು|]1,Inf[:count ಸೆಕೆಂಡುಗಳು', - 'ago' => ':time ಹಿಂದೆ', - 'from_now' => ':time ನಂತರ', - 'diff_now' => 'ಈಗ', - 'diff_today' => 'ಇಂದು', - 'diff_yesterday' => 'ನಿನ್ನೆ', - 'diff_tomorrow' => 'ನಾಳೆ', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', - ], - 'calendar' => [ - 'sameDay' => '[ಇಂದು] LT', - 'nextDay' => '[ನಾಳೆ] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[ನಿನ್ನೆ] LT', - 'lastWeek' => '[ಕೊನೆಯ] dddd, LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberನೇ', - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'ರಾತ್ರಿ'; - } - if ($hour < 10) { - return 'ಬೆಳಿಗ್ಗೆ'; - } - if ($hour < 17) { - return 'ಮಧ್ಯಾಹ್ನ'; - } - if ($hour < 20) { - return 'ಸಂಜೆ'; - } - - return 'ರಾತ್ರಿ'; - }, - 'months' => ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'], - 'months_short' => ['ಜನ', 'ಫೆಬ್ರ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'], - 'weekdays' => ['ಭಾನುವಾರ', 'ಸೋಮವಾರ', 'ಮಂಗಳವಾರ', 'ಬುಧವಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರವಾರ', 'ಶನಿವಾರ'], - 'weekdays_short' => ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ'], - 'weekdays_min' => ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], - 'list' => ', ', - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kn_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kn_IN.php deleted file mode 100644 index 30e3d88..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kn_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/kn.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ko.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ko.php deleted file mode 100644 index 4fa6237..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ko.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - FourwingsY - * - François B - * - Jason Katz-Brown - * - Seokjun Kim - * - Junho Kim - * - JD Isaacks - * - Juwon Kim - */ -return [ - 'year' => ':count년', - 'a_year' => '{1}일년|]1,Inf[:count년', - 'y' => ':count년', - 'month' => ':count개월', - 'a_month' => '{1}한달|]1,Inf[:count개월', - 'm' => ':count개월', - 'week' => ':count주', - 'a_week' => '{1}일주일|]1,Inf[:count 주', - 'w' => ':count주일', - 'day' => ':count일', - 'a_day' => '{1}하루|]1,Inf[:count일', - 'd' => ':count일', - 'hour' => ':count시간', - 'a_hour' => '{1}한시간|]1,Inf[:count시간', - 'h' => ':count시간', - 'minute' => ':count분', - 'a_minute' => '{1}일분|]1,Inf[:count분', - 'min' => ':count분', - 'second' => ':count초', - 'a_second' => '{1}몇초|]1,Inf[:count초', - 's' => ':count초', - 'ago' => ':time 전', - 'from_now' => ':time 후', - 'after' => ':time 후', - 'before' => ':time 전', - 'diff_now' => '지금', - 'diff_today' => '오늘', - 'diff_yesterday' => '어제', - 'diff_tomorrow' => '내일', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'YYYY.MM.DD.', - 'LL' => 'YYYY년 MMMM D일', - 'LLL' => 'YYYY년 MMMM D일 A h:mm', - 'LLLL' => 'YYYY년 MMMM D일 dddd A h:mm', - ], - 'calendar' => [ - 'sameDay' => '오늘 LT', - 'nextDay' => '내일 LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '어제 LT', - 'lastWeek' => '지난주 dddd LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'DDD': - return $number.'일'; - case 'M': - return $number.'월'; - case 'w': - case 'W': - return $number.'주'; - default: - return $number; - } - }, - 'meridiem' => ['오전', '오후'], - 'months' => ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], - 'months_short' => ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], - 'weekdays' => ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'], - 'weekdays_short' => ['일', '월', '화', '수', '목', '금', '토'], - 'weekdays_min' => ['일', '월', '화', '수', '목', '금', '토'], - 'list' => ' ', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ko_KP.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ko_KP.php deleted file mode 100644 index 4ba802b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ko_KP.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ko.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ko_KR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ko_KR.php deleted file mode 100644 index 9d873a2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ko_KR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ko.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kok.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kok.php deleted file mode 100644 index 4adcddc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kok.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kok_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kok_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kok_IN.php deleted file mode 100644 index 92ba844..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kok_IN.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D-M-YY', - ], - 'months' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ओगस्ट', 'सेप्टेंबर', 'ओक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], - 'months_short' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ओगस्ट', 'सेप्टेंबर', 'ओक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], - 'weekdays' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], - 'weekdays_short' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], - 'weekdays_min' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['म.पू.', 'म.नं.'], - - 'year' => ':count वैशाकु', // less reliable - 'y' => ':count वैशाकु', // less reliable - 'a_year' => ':count वैशाकु', // less reliable - - 'week' => ':count आदित्यवार', // less reliable - 'w' => ':count आदित्यवार', // less reliable - 'a_week' => ':count आदित्यवार', // less reliable - - 'minute' => ':count नोंद', // less reliable - 'min' => ':count नोंद', // less reliable - 'a_minute' => ':count नोंद', // less reliable - - 'second' => ':count तेंको', // less reliable - 's' => ':count तेंको', // less reliable - 'a_second' => ':count तेंको', // less reliable - - 'month' => ':count मैनो', - 'm' => ':count मैनो', - 'a_month' => ':count मैनो', - - 'day' => ':count दिवसु', - 'd' => ':count दिवसु', - 'a_day' => ':count दिवसु', - - 'hour' => ':count घंते', - 'h' => ':count घंते', - 'a_hour' => ':count घंते', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ks.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ks.php deleted file mode 100644 index 9876079..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ks.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ks_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN.php deleted file mode 100644 index ce9d5d4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'M/D/YY', - ], - 'months' => ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['آتهوار', 'ژءندروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], - 'weekdays_short' => ['آتهوار', 'ژءنتروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], - 'weekdays_min' => ['آتهوار', 'ژءنتروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['دوپھربرونھ', 'دوپھرپتھ'], - - 'year' => ':count آب', // less reliable - 'y' => ':count آب', // less reliable - 'a_year' => ':count آب', // less reliable - - 'month' => ':count रान्', // less reliable - 'm' => ':count रान्', // less reliable - 'a_month' => ':count रान्', // less reliable - - 'week' => ':count آتھٕوار', // less reliable - 'w' => ':count آتھٕوار', // less reliable - 'a_week' => ':count آتھٕوار', // less reliable - - 'hour' => ':count سۄن', // less reliable - 'h' => ':count سۄن', // less reliable - 'a_hour' => ':count سۄن', // less reliable - - 'minute' => ':count فَن', // less reliable - 'min' => ':count فَن', // less reliable - 'a_minute' => ':count فَن', // less reliable - - 'second' => ':count दोʼयुम', // less reliable - 's' => ':count दोʼयुम', // less reliable - 'a_second' => ':count दोʼयुम', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php deleted file mode 100644 index a2ae8b6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ks-gnome-trans-commits@lists.code.indlinux.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'M/D/YY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['आथवार', 'चॅ़दुरवार', 'बोमवार', 'ब्वदवार', 'ब्रसवार', 'शोकुरवार', 'बटुवार'], - 'weekdays_short' => ['आथ ', 'चॅ़दुर', 'बोम', 'ब्वद', 'ब्रस', 'शोकुर', 'बटु'], - 'weekdays_min' => ['आथ ', 'चॅ़दुर', 'बोम', 'ब्वद', 'ब्रस', 'शोकुर', 'बटु'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ksb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ksb.php deleted file mode 100644 index aaa0061..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ksb.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['makeo', 'nyiaghuo'], - 'weekdays' => ['Jumaapii', 'Jumaatatu', 'Jumaane', 'Jumaatano', 'Alhamisi', 'Ijumaa', 'Jumaamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januali', 'Febluali', 'Machi', 'Aplili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ksf.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ksf.php deleted file mode 100644 index 84a5967..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ksf.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['sárúwá', 'cɛɛ́nko'], - 'weekdays' => ['sɔ́ndǝ', 'lǝndí', 'maadí', 'mɛkrɛdí', 'jǝǝdí', 'júmbá', 'samdí'], - 'weekdays_short' => ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'], - 'weekdays_min' => ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'], - 'months' => ['ŋwíí a ntɔ́ntɔ', 'ŋwíí akǝ bɛ́ɛ', 'ŋwíí akǝ ráá', 'ŋwíí akǝ nin', 'ŋwíí akǝ táan', 'ŋwíí akǝ táafɔk', 'ŋwíí akǝ táabɛɛ', 'ŋwíí akǝ táaraa', 'ŋwíí akǝ táanin', 'ŋwíí akǝ ntɛk', 'ŋwíí akǝ ntɛk di bɔ́k', 'ŋwíí akǝ ntɛk di bɛ́ɛ'], - 'months_short' => ['ŋ1', 'ŋ2', 'ŋ3', 'ŋ4', 'ŋ5', 'ŋ6', 'ŋ7', 'ŋ8', 'ŋ9', 'ŋ10', 'ŋ11', 'ŋ12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ksh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ksh.php deleted file mode 100644 index 95457e2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ksh.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['v.M.', 'n.M.'], - 'weekdays' => ['Sunndaach', 'Mohndaach', 'Dinnsdaach', 'Metwoch', 'Dunnersdaach', 'Friidaach', 'Samsdaach'], - 'weekdays_short' => ['Su.', 'Mo.', 'Di.', 'Me.', 'Du.', 'Fr.', 'Sa.'], - 'weekdays_min' => ['Su', 'Mo', 'Di', 'Me', 'Du', 'Fr', 'Sa'], - 'months' => ['Jannewa', 'Fäbrowa', 'Määz', 'Aprell', 'Mai', 'Juuni', 'Juuli', 'Oujoß', 'Septämber', 'Oktohber', 'Novämber', 'Dezämber'], - 'months_short' => ['Jan', 'Fäb', 'Mäz', 'Apr', 'Mai', 'Jun', 'Jul', 'Ouj', 'Säp', 'Okt', 'Nov', 'Dez'], - 'months_short_standalone' => ['Jan.', 'Fäb.', 'Mäz.', 'Apr.', 'Mai', 'Jun.', 'Jul.', 'Ouj.', 'Säp.', 'Okt.', 'Nov.', 'Dez.'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D. M. YYYY', - 'LL' => 'D. MMM. YYYY', - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, [dä] D. MMMM YYYY HH:mm', - ], - - 'year' => ':count Johr', - 'y' => ':count Johr', - 'a_year' => ':count Johr', - - 'month' => ':count Moohnd', - 'm' => ':count Moohnd', - 'a_month' => ':count Moohnd', - - 'week' => ':count woch', - 'w' => ':count woch', - 'a_week' => ':count woch', - - 'day' => ':count Daach', - 'd' => ':count Daach', - 'a_day' => ':count Daach', - - 'hour' => ':count Uhr', - 'h' => ':count Uhr', - 'a_hour' => ':count Uhr', - - 'minute' => ':count Menutt', - 'min' => ':count Menutt', - 'a_minute' => ':count Menutt', - - 'second' => ':count Sekůndt', - 's' => ':count Sekůndt', - 'a_second' => ':count Sekůndt', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ku.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ku.php deleted file mode 100644 index 189960c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ku.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Unicode, Inc. - */ - -return [ - 'ago' => 'berî :time', - 'from_now' => 'di :time de', - 'after' => ':time piştî', - 'before' => ':time berê', - 'year' => ':count sal', - 'year_ago' => ':count salê|:count salan', - 'year_from_now' => 'salekê|:count salan', - 'month' => ':count meh', - 'week' => ':count hefte', - 'day' => ':count roj', - 'hour' => ':count saet', - 'minute' => ':count deqîqe', - 'second' => ':count saniye', - 'months' => ['rêbendanê', 'reşemiyê', 'adarê', 'avrêlê', 'gulanê', 'pûşperê', 'tîrmehê', 'gelawêjê', 'rezberê', 'kewçêrê', 'sermawezê', 'berfanbarê'], - 'months_standalone' => ['rêbendan', 'reşemî', 'adar', 'avrêl', 'gulan', 'pûşper', 'tîrmeh', 'gelawêj', 'rezber', 'kewçêr', 'sermawez', 'berfanbar'], - 'months_short' => ['rêb', 'reş', 'ada', 'avr', 'gul', 'pûş', 'tîr', 'gel', 'rez', 'kew', 'ser', 'ber'], - 'weekdays' => ['yekşem', 'duşem', 'sêşem', 'çarşem', 'pêncşem', 'în', 'şemî'], - 'weekdays_short' => ['yş', 'dş', 'sş', 'çş', 'pş', 'în', 'ş'], - 'weekdays_min' => ['Y', 'D', 'S', 'Ç', 'P', 'Î', 'Ş'], - 'list' => [', ', ' û '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ku_TR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ku_TR.php deleted file mode 100644 index 4243a82..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ku_TR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ku.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kw.php deleted file mode 100644 index 26e242e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/kw_GB.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/kw_GB.php b/dependencies/nesbot/carbon/src/Carbon/Lang/kw_GB.php deleted file mode 100644 index 00bf52b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/kw_GB.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alastair McKinstry bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['mis Genver', 'mis Hwevrer', 'mis Meurth', 'mis Ebrel', 'mis Me', 'mis Metheven', 'mis Gortheren', 'mis Est', 'mis Gwynngala', 'mis Hedra', 'mis Du', 'mis Kevardhu'], - 'months_short' => ['Gen', 'Hwe', 'Meu', 'Ebr', 'Me', 'Met', 'Gor', 'Est', 'Gwn', 'Hed', 'Du', 'Kev'], - 'weekdays' => ['De Sul', 'De Lun', 'De Merth', 'De Merher', 'De Yow', 'De Gwener', 'De Sadorn'], - 'weekdays_short' => ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'], - 'weekdays_min' => ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count bledhen', - 'y' => ':count bledhen', - 'a_year' => ':count bledhen', - - 'month' => ':count mis', - 'm' => ':count mis', - 'a_month' => ':count mis', - - 'week' => ':count seythen', - 'w' => ':count seythen', - 'a_week' => ':count seythen', - - 'day' => ':count dydh', - 'd' => ':count dydh', - 'a_day' => ':count dydh', - - 'hour' => ':count eur', - 'h' => ':count eur', - 'a_hour' => ':count eur', - - 'minute' => ':count mynysen', - 'min' => ':count mynysen', - 'a_minute' => ':count mynysen', - - 'second' => ':count pryjwyth', - 's' => ':count pryjwyth', - 'a_second' => ':count pryjwyth', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ky.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ky.php deleted file mode 100644 index e0d1af1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ky.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - acutexyz - * - Josh Soref - * - François B - * - Chyngyz Arystan uulu - * - Chyngyz - * - acutexyz - * - Josh Soref - * - François B - * - Chyngyz Arystan uulu - */ -return [ - 'year' => ':count жыл', - 'a_year' => '{1}бир жыл|:count жыл', - 'y' => ':count жыл', - 'month' => ':count ай', - 'a_month' => '{1}бир ай|:count ай', - 'm' => ':count ай', - 'week' => ':count апта', - 'a_week' => '{1}бир апта|:count апта', - 'w' => ':count апт.', - 'day' => ':count күн', - 'a_day' => '{1}бир күн|:count күн', - 'd' => ':count күн', - 'hour' => ':count саат', - 'a_hour' => '{1}бир саат|:count саат', - 'h' => ':count саат.', - 'minute' => ':count мүнөт', - 'a_minute' => '{1}бир мүнөт|:count мүнөт', - 'min' => ':count мүн.', - 'second' => ':count секунд', - 'a_second' => '{1}бирнече секунд|:count секунд', - 's' => ':count сек.', - 'ago' => ':time мурун', - 'from_now' => ':time ичинде', - 'diff_now' => 'азыр', - 'diff_today' => 'Бүгүн', - 'diff_today_regexp' => 'Бүгүн(?:\\s+саат)?', - 'diff_yesterday' => 'кечээ', - 'diff_yesterday_regexp' => 'Кече(?:\\s+саат)?', - 'diff_tomorrow' => 'эртең', - 'diff_tomorrow_regexp' => 'Эртең(?:\\s+саат)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Бүгүн саат] LT', - 'nextDay' => '[Эртең саат] LT', - 'nextWeek' => 'dddd [саат] LT', - 'lastDay' => '[Кече саат] LT', - 'lastWeek' => '[Өткен аптанын] dddd [күнү] [саат] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - static $suffixes = [ - 0 => '-чү', - 1 => '-чи', - 2 => '-чи', - 3 => '-чү', - 4 => '-чү', - 5 => '-чи', - 6 => '-чы', - 7 => '-чи', - 8 => '-чи', - 9 => '-чу', - 10 => '-чу', - 20 => '-чы', - 30 => '-чу', - 40 => '-чы', - 50 => '-чү', - 60 => '-чы', - 70 => '-чи', - 80 => '-чи', - 90 => '-чу', - 100 => '-чү', - ]; - - return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'months' => ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'], - 'months_short' => ['янв', 'фев', 'март', 'апр', 'май', 'июнь', 'июль', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['Жекшемби', 'Дүйшөмбү', 'Шейшемби', 'Шаршемби', 'Бейшемби', 'Жума', 'Ишемби'], - 'weekdays_short' => ['Жек', 'Дүй', 'Шей', 'Шар', 'Бей', 'Жум', 'Ише'], - 'weekdays_min' => ['Жк', 'Дй', 'Шй', 'Шр', 'Бй', 'Жм', 'Иш'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => ' ', - 'meridiem' => ['таңкы', 'түштөн кийинки'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ky_KG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ky_KG.php deleted file mode 100644 index 9923a31..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ky_KG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ky.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lag.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lag.php deleted file mode 100644 index f3f57f6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lag.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['TOO', 'MUU'], - 'weekdays' => ['Jumapíiri', 'Jumatátu', 'Jumaíne', 'Jumatáano', 'Alamíisi', 'Ijumáa', 'Jumamóosi'], - 'weekdays_short' => ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'], - 'weekdays_min' => ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'], - 'months' => ['Kʉfúngatɨ', 'Kʉnaanɨ', 'Kʉkeenda', 'Kwiikumi', 'Kwiinyambála', 'Kwiidwaata', 'Kʉmʉʉnchɨ', 'Kʉvɨɨrɨ', 'Kʉsaatʉ', 'Kwiinyi', 'Kʉsaano', 'Kʉsasatʉ'], - 'months_short' => ['Fúngatɨ', 'Naanɨ', 'Keenda', 'Ikúmi', 'Inyambala', 'Idwaata', 'Mʉʉnchɨ', 'Vɨɨrɨ', 'Saatʉ', 'Inyi', 'Saano', 'Sasatʉ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lb.php deleted file mode 100644 index 7636655..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lb.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - dan-nl - * - Simon Lelorrain (slelorrain) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count Joer', - 'y' => ':countJ', - 'month' => ':count Mount|:count Méint', - 'm' => ':countMo', - 'week' => ':count Woch|:count Wochen', - 'w' => ':countWo|:countWo', - 'day' => ':count Dag|:count Deeg', - 'd' => ':countD', - 'hour' => ':count Stonn|:count Stonnen', - 'h' => ':countSto', - 'minute' => ':count Minutt|:count Minutten', - 'min' => ':countM', - 'second' => ':count Sekonn|:count Sekonnen', - 's' => ':countSek', - - 'ago' => 'virun :time', - 'from_now' => 'an :time', - 'before' => ':time virdrun', - 'after' => ':time duerno', - - 'diff_today' => 'Haut', - 'diff_yesterday' => 'Gëschter', - 'diff_yesterday_regexp' => 'Gëschter(?:\\s+um)?', - 'diff_tomorrow' => 'Muer', - 'diff_tomorrow_regexp' => 'Muer(?:\\s+um)?', - 'diff_today_regexp' => 'Haut(?:\\s+um)?', - 'formats' => [ - 'LT' => 'H:mm [Auer]', - 'LTS' => 'H:mm:ss [Auer]', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm [Auer]', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm [Auer]', - ], - - 'calendar' => [ - 'sameDay' => '[Haut um] LT', - 'nextDay' => '[Muer um] LT', - 'nextWeek' => 'dddd [um] LT', - 'lastDay' => '[Gëschter um] LT', - 'lastWeek' => function (CarbonInterface $date) { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch ($date->dayOfWeek) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } - }, - 'sameElse' => 'L', - ], - - 'months' => ['Januar', 'Februar', 'Mäerz', 'Abrëll', 'Mee', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan.', 'Febr.', 'Mrz.', 'Abr.', 'Mee', 'Jun.', 'Jul.', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'], - 'weekdays' => ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'], - 'weekdays_short' => ['So.', 'Mé.', 'Dë.', 'Më.', 'Do.', 'Fr.', 'Sa.'], - 'weekdays_min' => ['So', 'Mé', 'Dë', 'Më', 'Do', 'Fr', 'Sa'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' an '], - 'meridiem' => ['moies', 'mëttes'], - 'weekdays_short_standalone' => ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'], - 'months_short_standalone' => ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lb_LU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lb_LU.php deleted file mode 100644 index 414bd4d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lb_LU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lb.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lg.php deleted file mode 100644 index 48bc68b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lg.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/lg_UG.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lg_UG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lg_UG.php deleted file mode 100644 index aa02214..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lg_UG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Akademe ya Luganda Kizito Birabwa kompyuta@kizito.uklinux.net - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'], - 'weekdays' => ['Sabiiti', 'Balaza', 'Lwakubiri', 'Lwakusatu', 'Lwakuna', 'Lwakutaano', 'Lwamukaaga'], - 'weekdays_short' => ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'], - 'weekdays_min' => ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'month' => ':count njuba', // less reliable - 'm' => ':count njuba', // less reliable - 'a_month' => ':count njuba', // less reliable - - 'year' => ':count mwaaka', - 'y' => ':count mwaaka', - 'a_year' => ':count mwaaka', - - 'week' => ':count sabbiiti', - 'w' => ':count sabbiiti', - 'a_week' => ':count sabbiiti', - - 'day' => ':count lunaku', - 'd' => ':count lunaku', - 'a_day' => ':count lunaku', - - 'hour' => 'saawa :count', - 'h' => 'saawa :count', - 'a_hour' => 'saawa :count', - - 'minute' => 'ddakiika :count', - 'min' => 'ddakiika :count', - 'a_minute' => 'ddakiika :count', - - 'second' => ':count kyʼokubiri', - 's' => ':count kyʼokubiri', - 'a_second' => ':count kyʼokubiri', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/li.php b/dependencies/nesbot/carbon/src/Carbon/Lang/li.php deleted file mode 100644 index 86c3009..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/li.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/li_NL.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/li_NL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/li_NL.php deleted file mode 100644 index 6c5feb7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/li_NL.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandriva.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['jannewarie', 'fibberwarie', 'miert', 'eprèl', 'meij', 'junie', 'julie', 'augustus', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'fib', 'mie', 'epr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['zóndig', 'maondig', 'daensdig', 'goonsdig', 'dónderdig', 'vriedig', 'zaoterdig'], - 'weekdays_short' => ['zón', 'mao', 'dae', 'goo', 'dón', 'vri', 'zao'], - 'weekdays_min' => ['zón', 'mao', 'dae', 'goo', 'dón', 'vri', 'zao'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'minute' => ':count momênt', // less reliable - 'min' => ':count momênt', // less reliable - 'a_minute' => ':count momênt', // less reliable - - 'year' => ':count jaor', - 'y' => ':count jaor', - 'a_year' => ':count jaor', - - 'month' => ':count maond', - 'm' => ':count maond', - 'a_month' => ':count maond', - - 'week' => ':count waek', - 'w' => ':count waek', - 'a_week' => ':count waek', - - 'day' => ':count daag', - 'd' => ':count daag', - 'a_day' => ':count daag', - - 'hour' => ':count oer', - 'h' => ':count oer', - 'a_hour' => ':count oer', - - 'second' => ':count Secónd', - 's' => ':count Secónd', - 'a_second' => ':count Secónd', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lij.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lij.php deleted file mode 100644 index 45732b5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lij.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/lij_IT.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lij_IT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lij_IT.php deleted file mode 100644 index f8726fd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lij_IT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Gastaldi alessio.gastaldi@libero.it - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['zenâ', 'fevrâ', 'marzo', 'avrî', 'mazzo', 'zûgno', 'lûggio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dixembre'], - 'months_short' => ['zen', 'fev', 'mar', 'arv', 'maz', 'zûg', 'lûg', 'ago', 'set', 'ött', 'nov', 'dix'], - 'weekdays' => ['domenega', 'lûnedì', 'martedì', 'mercUrdì', 'zêggia', 'venardì', 'sabbo'], - 'weekdays_short' => ['dom', 'lûn', 'mar', 'mer', 'zêu', 'ven', 'sab'], - 'weekdays_min' => ['dom', 'lûn', 'mar', 'mer', 'zêu', 'ven', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count etæ', // less reliable - 'y' => ':count etæ', // less reliable - 'a_year' => ':count etæ', // less reliable - - 'month' => ':count meize', - 'm' => ':count meize', - 'a_month' => ':count meize', - - 'week' => ':count settemannha', - 'w' => ':count settemannha', - 'a_week' => ':count settemannha', - - 'day' => ':count giorno', - 'd' => ':count giorno', - 'a_day' => ':count giorno', - - 'hour' => ':count reléuio', // less reliable - 'h' => ':count reléuio', // less reliable - 'a_hour' => ':count reléuio', // less reliable - - 'minute' => ':count menûo', - 'min' => ':count menûo', - 'a_minute' => ':count menûo', - - 'second' => ':count segondo', - 's' => ':count segondo', - 'a_second' => ':count segondo', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lkt.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lkt.php deleted file mode 100644 index ae73a97..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lkt.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - - 'month' => ':count haŋwí', // less reliable - 'm' => ':count haŋwí', // less reliable - 'a_month' => ':count haŋwí', // less reliable - - 'week' => ':count šakówiŋ', // less reliable - 'w' => ':count šakówiŋ', // less reliable - 'a_week' => ':count šakówiŋ', // less reliable - - 'hour' => ':count maza škaŋškaŋ', // less reliable - 'h' => ':count maza škaŋškaŋ', // less reliable - 'a_hour' => ':count maza škaŋškaŋ', // less reliable - - 'minute' => ':count číkʼala', // less reliable - 'min' => ':count číkʼala', // less reliable - 'a_minute' => ':count číkʼala', // less reliable - - 'year' => ':count waníyetu', - 'y' => ':count waníyetu', - 'a_year' => ':count waníyetu', - - 'day' => ':count aŋpétu', - 'd' => ':count aŋpétu', - 'a_day' => ':count aŋpétu', - - 'second' => ':count icinuŋpa', - 's' => ':count icinuŋpa', - 'a_second' => ':count icinuŋpa', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ln.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ln.php deleted file mode 100644 index 9d5c35d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ln.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ubuntu René Manassé GALEKWA renemanasse@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'months' => ['sánzá ya yambo', 'sánzá ya míbalé', 'sánzá ya mísáto', 'sánzá ya mínei', 'sánzá ya mítáno', 'sánzá ya motóbá', 'sánzá ya nsambo', 'sánzá ya mwambe', 'sánzá ya libwa', 'sánzá ya zómi', 'sánzá ya zómi na mɔ̌kɔ́', 'sánzá ya zómi na míbalé'], - 'months_short' => ['yan', 'fbl', 'msi', 'apl', 'mai', 'yun', 'yul', 'agt', 'stb', 'ɔtb', 'nvb', 'dsb'], - 'weekdays' => ['Lomíngo', 'Mosálá mɔ̌kɔ́', 'Misálá míbalé', 'Misálá mísáto', 'Misálá mínei', 'Misálá mítáno', 'Mpɔ́sɔ'], - 'weekdays_short' => ['m1.', 'm2.', 'm3.', 'm4.', 'm5.', 'm6.', 'm7.'], - 'weekdays_min' => ['m1.', 'm2.', 'm3.', 'm4.', 'm5.', 'm6.', 'm7.'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => 'mbula :count', - 'y' => 'mbula :count', - 'a_year' => 'mbula :count', - - 'month' => 'sánzá :count', - 'm' => 'sánzá :count', - 'a_month' => 'sánzá :count', - - 'week' => 'mpɔ́sɔ :count', - 'w' => 'mpɔ́sɔ :count', - 'a_week' => 'mpɔ́sɔ :count', - - 'day' => 'mokɔlɔ :count', - 'd' => 'mokɔlɔ :count', - 'a_day' => 'mokɔlɔ :count', - - 'hour' => 'ngonga :count', - 'h' => 'ngonga :count', - 'a_hour' => 'ngonga :count', - - 'minute' => 'miniti :count', - 'min' => 'miniti :count', - 'a_minute' => 'miniti :count', - - 'second' => 'segɔnde :count', - 's' => 'segɔnde :count', - 'a_second' => 'segɔnde :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_AO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ln_AO.php deleted file mode 100644 index 7fdb7f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_AO.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ln.php', [ - 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], - 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CD.php deleted file mode 100644 index 13635fc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CD.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ubuntu René Manassé GALEKWA renemanasse@gmail.com - */ -return require __DIR__.'/ln.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CF.php deleted file mode 100644 index 7fdb7f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CF.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ln.php', [ - 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], - 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CG.php deleted file mode 100644 index 7fdb7f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ln_CG.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ln.php', [ - 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], - 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], - 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lo.php deleted file mode 100644 index 48715f5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lo.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - ryanhart2 - */ -return [ - 'year' => ':count ປີ', - 'y' => ':count ປີ', - 'month' => ':count ເດືອນ', - 'm' => ':count ດ. ', - 'week' => ':count ອາທິດ', - 'w' => ':count ອທ. ', - 'day' => ':count ມື້', - 'd' => ':count ມື້', - 'hour' => ':count ຊົ່ວໂມງ', - 'h' => ':count ຊມ. ', - 'minute' => ':count ນາທີ', - 'min' => ':count ນທ. ', - 'second' => '{1}ບໍ່ເທົ່າໃດວິນາທີ|]1,Inf[:count ວິນາທີ', - 's' => ':count ວິ. ', - 'ago' => ':timeຜ່ານມາ', - 'from_now' => 'ອີກ :time', - 'diff_now' => 'ຕອນນີ້', - 'diff_today' => 'ມື້ນີ້ເວລາ', - 'diff_yesterday' => 'ມື້ວານນີ້ເວລາ', - 'diff_tomorrow' => 'ມື້ອື່ນເວລາ', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'ວັນdddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ມື້ນີ້ເວລາ] LT', - 'nextDay' => '[ມື້ອື່ນເວລາ] LT', - 'nextWeek' => '[ວັນ]dddd[ໜ້າເວລາ] LT', - 'lastDay' => '[ມື້ວານນີ້ເວລາ] LT', - 'lastWeek' => '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', - 'sameElse' => 'L', - ], - 'ordinal' => 'ທີ່:number', - 'meridiem' => ['ຕອນເຊົ້າ', 'ຕອນແລງ'], - 'months' => ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'], - 'months_short' => ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'], - 'weekdays' => ['ອາທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'], - 'weekdays_short' => ['ທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'], - 'weekdays_min' => ['ທ', 'ຈ', 'ອຄ', 'ພ', 'ພຫ', 'ສກ', 'ສ'], - 'list' => [', ', 'ແລະ '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lo_LA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lo_LA.php deleted file mode 100644 index 9b7fd9b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lo_LA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lo.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lrc.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lrc.php deleted file mode 100644 index 546e679..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lrc.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - - 'minute' => ':count هنر', // less reliable - 'min' => ':count هنر', // less reliable - 'a_minute' => ':count هنر', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php deleted file mode 100644 index d42f5e9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/lrc.php', [ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lt.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lt.php deleted file mode 100644 index 7d1b6f7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lt.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - valdas406 - * - Justas Palumickas - * - Max Melentiev - * - Andrius Janauskas - * - Juanito Fatas - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Laurynas Butkus - * - Sven Fuchs - * - Dominykas Tijūnaitis - * - Justinas Bolys - * - Ričardas - * - Kirill Chalkin - * - Rolandas - * - Justinas (Gamesh) - */ -return [ - 'year' => ':count metai|:count metai|:count metų', - 'y' => ':count m.', - 'month' => ':count mėnuo|:count mėnesiai|:count mėnesį', - 'm' => ':count mėn.', - 'week' => ':count savaitė|:count savaitės|:count savaitę', - 'w' => ':count sav.', - 'day' => ':count diena|:count dienos|:count dienų', - 'd' => ':count d.', - 'hour' => ':count valanda|:count valandos|:count valandų', - 'h' => ':count val.', - 'minute' => ':count minutė|:count minutės|:count minutę', - 'min' => ':count min.', - 'second' => ':count sekundė|:count sekundės|:count sekundžių', - 's' => ':count sek.', - - 'year_ago' => ':count metus|:count metus|:count metų', - 'month_ago' => ':count mėnesį|:count mėnesius|:count mėnesių', - 'week_ago' => ':count savaitę|:count savaites|:count savaičių', - 'day_ago' => ':count dieną|:count dienas|:count dienų', - 'hour_ago' => ':count valandą|:count valandas|:count valandų', - 'minute_ago' => ':count minutę|:count minutes|:count minučių', - 'second_ago' => ':count sekundę|:count sekundes|:count sekundžių', - - 'year_from_now' => ':count metų', - 'month_from_now' => ':count mėnesio|:count mėnesių|:count mėnesių', - 'week_from_now' => ':count savaitės|:count savaičių|:count savaičių', - 'day_from_now' => ':count dienos|:count dienų|:count dienų', - 'hour_from_now' => ':count valandos|:count valandų|:count valandų', - 'minute_from_now' => ':count minutės|:count minučių|:count minučių', - 'second_from_now' => ':count sekundės|:count sekundžių|:count sekundžių', - - 'year_after' => ':count metų', - 'month_after' => ':count mėnesio|:count mėnesių|:count mėnesių', - 'week_after' => ':count savaitės|:count savaičių|:count savaičių', - 'day_after' => ':count dienos|:count dienų|:count dienų', - 'hour_after' => ':count valandos|:count valandų|:count valandų', - 'minute_after' => ':count minutės|:count minučių|:count minučių', - 'second_after' => ':count sekundės|:count sekundžių|:count sekundžių', - - 'ago' => 'prieš :time', - 'from_now' => ':time nuo dabar', - 'after' => 'po :time', - 'before' => 'už :time', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'diff_now' => 'ką tik', - 'diff_today' => 'Šiandien', - 'diff_yesterday' => 'vakar', - 'diff_yesterday_regexp' => 'Vakar', - 'diff_tomorrow' => 'rytoj', - 'diff_tomorrow_regexp' => 'Rytoj', - 'diff_before_yesterday' => 'užvakar', - 'diff_after_tomorrow' => 'poryt', - - 'period_recurrences' => 'kartą|:count kartų', - 'period_interval' => 'kiekvieną :interval', - 'period_start_date' => 'nuo :date', - 'period_end_date' => 'iki :date', - - 'months' => ['sausio', 'vasario', 'kovo', 'balandžio', 'gegužės', 'birželio', 'liepos', 'rugpjūčio', 'rugsėjo', 'spalio', 'lapkričio', 'gruodžio'], - 'months_standalone' => ['sausis', 'vasaris', 'kovas', 'balandis', 'gegužė', 'birželis', 'liepa', 'rugpjūtis', 'rugsėjis', 'spalis', 'lapkritis', 'gruodis'], - 'months_regexp' => '/(L{2,4}|D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?)/', - 'months_short' => ['sau', 'vas', 'kov', 'bal', 'geg', 'bir', 'lie', 'rgp', 'rgs', 'spa', 'lap', 'gru'], - 'weekdays' => ['sekmadienį', 'pirmadienį', 'antradienį', 'trečiadienį', 'ketvirtadienį', 'penktadienį', 'šeštadienį'], - 'weekdays_standalone' => ['sekmadienis', 'pirmadienis', 'antradienis', 'trečiadienis', 'ketvirtadienis', 'penktadienis', 'šeštadienis'], - 'weekdays_short' => ['sek', 'pir', 'ant', 'tre', 'ket', 'pen', 'šeš'], - 'weekdays_min' => ['se', 'pi', 'an', 'tr', 'ke', 'pe', 'še'], - 'list' => [', ', ' ir '], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Šiandien] LT', - 'nextDay' => '[Rytoj] LT', - 'nextWeek' => 'dddd LT', - 'lastDay' => '[Vakar] LT', - 'lastWeek' => '[Paskutinį] dddd LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - switch ($number) { - case 0: - return '0-is'; - case 3: - return '3-ias'; - default: - return "$number-as"; - } - }, - 'meridiem' => ['priešpiet', 'popiet'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lt_LT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lt_LT.php deleted file mode 100644 index f772d38..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lt_LT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lu.php deleted file mode 100644 index c8cd83a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lu.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Dinda', 'Dilolo'], - 'weekdays' => ['Lumingu', 'Nkodya', 'Ndàayà', 'Ndangù', 'Njòwa', 'Ngòvya', 'Lubingu'], - 'weekdays_short' => ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'], - 'weekdays_min' => ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'], - 'months' => ['Ciongo', 'Lùishi', 'Lusòlo', 'Mùuyà', 'Lumùngùlù', 'Lufuimi', 'Kabàlàshìpù', 'Lùshìkà', 'Lutongolo', 'Lungùdi', 'Kaswèkèsè', 'Ciswà'], - 'months_short' => ['Cio', 'Lui', 'Lus', 'Muu', 'Lum', 'Luf', 'Kab', 'Lush', 'Lut', 'Lun', 'Kas', 'Cis'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/luo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/luo.php deleted file mode 100644 index b55af73..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/luo.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['OD', 'OT'], - 'weekdays' => ['Jumapil', 'Wuok Tich', 'Tich Ariyo', 'Tich Adek', 'Tich Ang’wen', 'Tich Abich', 'Ngeso'], - 'weekdays_short' => ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'], - 'weekdays_min' => ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'], - 'months' => ['Dwe mar Achiel', 'Dwe mar Ariyo', 'Dwe mar Adek', 'Dwe mar Ang’wen', 'Dwe mar Abich', 'Dwe mar Auchiel', 'Dwe mar Abiriyo', 'Dwe mar Aboro', 'Dwe mar Ochiko', 'Dwe mar Apar', 'Dwe mar gi achiel', 'Dwe mar Apar gi ariyo'], - 'months_short' => ['DAC', 'DAR', 'DAD', 'DAN', 'DAH', 'DAU', 'DAO', 'DAB', 'DOC', 'DAP', 'DGI', 'DAG'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => 'higni :count', - 'y' => 'higni :count', - 'a_year' => ':higni :count', - - 'month' => 'dweche :count', - 'm' => 'dweche :count', - 'a_month' => 'dweche :count', - - 'week' => 'jumbe :count', - 'w' => 'jumbe :count', - 'a_week' => 'jumbe :count', - - 'day' => 'ndalo :count', - 'd' => 'ndalo :count', - 'a_day' => 'ndalo :count', - - 'hour' => 'seche :count', - 'h' => 'seche :count', - 'a_hour' => 'seche :count', - - 'minute' => 'dakika :count', - 'min' => 'dakika :count', - 'a_minute' => 'dakika :count', - - 'second' => 'nus dakika :count', - 's' => 'nus dakika :count', - 'a_second' => 'nus dakika :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/luy.php b/dependencies/nesbot/carbon/src/Carbon/Lang/luy.php deleted file mode 100644 index 2b37e3e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/luy.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Jumapiri', 'Jumatatu', 'Jumanne', 'Jumatano', 'Murwa wa Kanne', 'Murwa wa Katano', 'Jumamosi'], - 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - // Too unreliable - /* - 'year' => ':count liliino', // less reliable - 'y' => ':count liliino', // less reliable - 'a_year' => ':count liliino', // less reliable - - 'month' => ':count kumwesi', // less reliable - 'm' => ':count kumwesi', // less reliable - 'a_month' => ':count kumwesi', // less reliable - - 'week' => ':count olutambi', // less reliable - 'w' => ':count olutambi', // less reliable - 'a_week' => ':count olutambi', // less reliable - - 'day' => ':count luno', // less reliable - 'd' => ':count luno', // less reliable - 'a_day' => ':count luno', // less reliable - - 'hour' => ':count ekengele', // less reliable - 'h' => ':count ekengele', // less reliable - 'a_hour' => ':count ekengele', // less reliable - - 'minute' => ':count omundu', // less reliable - 'min' => ':count omundu', // less reliable - 'a_minute' => ':count omundu', // less reliable - - 'second' => ':count liliino', // less reliable - 's' => ':count liliino', // less reliable - 'a_second' => ':count liliino', // less reliable - */ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lv.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lv.php deleted file mode 100644 index d5cba7c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lv.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonInterface; - -/** - * This file is part of the Carbon package. - * - * (c) Brian Nesbitt - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - pirminis - * - Tsutomu Kuroda - * - tjku - * - Andris Zāģeris - * - Max Melentiev - * - Edgars Beigarts - * - Juanito Fatas - * - Vitauts Stočka - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Kaspars Bankovskis - * - Nicolás Hock Isaza - * - Viesturs Kavacs (Kavacky) - * - zakse - * - Janis Eglitis (janiseglitis) - * - Guntars - * - Juris Sudmalis - */ -$daysOfWeek = ['svētdiena', 'pirmdiena', 'otrdiena', 'trešdiena', 'ceturtdiena', 'piektdiena', 'sestdiena']; -$daysOfWeekLocativum = ['svētdien', 'pirmdien', 'otrdien', 'trešdien', 'ceturtdien', 'piektdien', 'sestdien']; - -$transformDiff = function ($input) { - return strtr($input, [ - // Nominative => "pirms/pēc" Dative - 'gads' => 'gada', - 'gadi' => 'gadiem', - 'gadu' => 'gadiem', - 'mēnesis' => 'mēneša', - 'mēneši' => 'mēnešiem', - 'mēnešu' => 'mēnešiem', - 'nedēļa' => 'nedēļas', - 'nedēļas' => 'nedēļām', - 'nedēļu' => 'nedēļām', - 'diena' => 'dienas', - 'dienas' => 'dienām', - 'dienu' => 'dienām', - 'stunda' => 'stundas', - 'stundas' => 'stundām', - 'stundu' => 'stundām', - 'minūte' => 'minūtes', - 'minūtes' => 'minūtēm', - 'minūšu' => 'minūtēm', - 'sekunde' => 'sekundes', - 'sekundes' => 'sekundēm', - 'sekunžu' => 'sekundēm', - ]); -}; - -return [ - 'ago' => function ($time) use ($transformDiff) { - return 'pirms '.$transformDiff($time); - }, - 'from_now' => function ($time) use ($transformDiff) { - return 'pēc '.$transformDiff($time); - }, - - 'year' => '0 gadu|:count gads|:count gadi', - 'y' => ':count g.', - 'a_year' => '{1}gads|0 gadu|:count gads|:count gadi', - 'month' => '0 mēnešu|:count mēnesis|:count mēneši', - 'm' => ':count mēn.', - 'a_month' => '{1}mēnesis|0 mēnešu|:count mēnesis|:count mēneši', - 'week' => '0 nedēļu|:count nedēļa|:count nedēļas', - 'w' => ':count ned.', - 'a_week' => '{1}nedēļa|0 nedēļu|:count nedēļa|:count nedēļas', - 'day' => '0 dienu|:count diena|:count dienas', - 'd' => ':count d.', - 'a_day' => '{1}diena|0 dienu|:count diena|:count dienas', - 'hour' => '0 stundu|:count stunda|:count stundas', - 'h' => ':count st.', - 'a_hour' => '{1}stunda|0 stundu|:count stunda|:count stundas', - 'minute' => '0 minūšu|:count minūte|:count minūtes', - 'min' => ':count min.', - 'a_minute' => '{1}minūte|0 minūšu|:count minūte|:count minūtes', - 'second' => '0 sekunžu|:count sekunde|:count sekundes', - 's' => ':count sek.', - 'a_second' => '{1}sekunde|0 sekunžu|:count sekunde|:count sekundes', - - 'after' => ':time vēlāk', - 'year_after' => '0 gadus|:count gadu|:count gadus', - 'a_year_after' => '{1}gadu|0 gadus|:count gadu|:count gadus', - 'month_after' => '0 mēnešus|:count mēnesi|:count mēnešus', - 'a_month_after' => '{1}mēnesi|0 mēnešus|:count mēnesi|:count mēnešus', - 'week_after' => '0 nedēļas|:count nedēļu|:count nedēļas', - 'a_week_after' => '{1}nedēļu|0 nedēļas|:count nedēļu|:count nedēļas', - 'day_after' => '0 dienas|:count dienu|:count dienas', - 'a_day_after' => '{1}dienu|0 dienas|:count dienu|:count dienas', - 'hour_after' => '0 stundas|:count stundu|:count stundas', - 'a_hour_after' => '{1}stundu|0 stundas|:count stundu|:count stundas', - 'minute_after' => '0 minūtes|:count minūti|:count minūtes', - 'a_minute_after' => '{1}minūti|0 minūtes|:count minūti|:count minūtes', - 'second_after' => '0 sekundes|:count sekundi|:count sekundes', - 'a_second_after' => '{1}sekundi|0 sekundes|:count sekundi|:count sekundes', - - 'before' => ':time agrāk', - 'year_before' => '0 gadus|:count gadu|:count gadus', - 'a_year_before' => '{1}gadu|0 gadus|:count gadu|:count gadus', - 'month_before' => '0 mēnešus|:count mēnesi|:count mēnešus', - 'a_month_before' => '{1}mēnesi|0 mēnešus|:count mēnesi|:count mēnešus', - 'week_before' => '0 nedēļas|:count nedēļu|:count nedēļas', - 'a_week_before' => '{1}nedēļu|0 nedēļas|:count nedēļu|:count nedēļas', - 'day_before' => '0 dienas|:count dienu|:count dienas', - 'a_day_before' => '{1}dienu|0 dienas|:count dienu|:count dienas', - 'hour_before' => '0 stundas|:count stundu|:count stundas', - 'a_hour_before' => '{1}stundu|0 stundas|:count stundu|:count stundas', - 'minute_before' => '0 minūtes|:count minūti|:count minūtes', - 'a_minute_before' => '{1}minūti|0 minūtes|:count minūti|:count minūtes', - 'second_before' => '0 sekundes|:count sekundi|:count sekundes', - 'a_second_before' => '{1}sekundi|0 sekundes|:count sekundi|:count sekundes', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' un '], - - 'diff_now' => 'tagad', - 'diff_today' => 'šodien', - 'diff_yesterday' => 'vakar', - 'diff_before_yesterday' => 'aizvakar', - 'diff_tomorrow' => 'rīt', - 'diff_after_tomorrow' => 'parīt', - - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY.', - 'LL' => 'YYYY. [gada] D. MMMM', - 'LLL' => 'DD.MM.YYYY., HH:mm', - 'LLLL' => 'YYYY. [gada] D. MMMM, HH:mm', - ], - - 'calendar' => [ - 'sameDay' => '[šodien] [plkst.] LT', - 'nextDay' => '[rīt] [plkst.] LT', - 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) use ($daysOfWeekLocativum) { - if ($current->week !== $other->week) { - return '[nākošo] ['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; - } - - return '['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; - }, - 'lastDay' => '[vakar] [plkst.] LT', - 'lastWeek' => function (CarbonInterface $current) use ($daysOfWeekLocativum) { - return '[pagājušo] ['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; - }, - 'sameElse' => 'L', - ], - - 'weekdays' => $daysOfWeek, - 'weekdays_short' => ['Sv.', 'P.', 'O.', 'T.', 'C.', 'Pk.', 'S.'], - 'weekdays_min' => ['Sv.', 'P.', 'O.', 'T.', 'C.', 'Pk.', 'S.'], - 'months' => ['janvāris', 'februāris', 'marts', 'aprīlis', 'maijs', 'jūnijs', 'jūlijs', 'augusts', 'septembris', 'oktobris', 'novembris', 'decembris'], - 'months_standalone' => ['janvārī', 'februārī', 'martā', 'aprīlī', 'maijā', 'jūnijā', 'jūlijā', 'augustā', 'septembrī', 'oktobrī', 'novembrī', 'decembrī'], - 'months_short' => ['janv.', 'febr.', 'martā', 'apr.', 'maijā', 'jūn.', 'jūl.', 'aug.', 'sept.', 'okt.', 'nov.', 'dec.'], - 'meridiem' => ['priekšpusdiena', 'pēcpusdiena'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lv_LV.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lv_LV.php deleted file mode 100644 index ee91c36..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lv_LV.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/lv.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lzh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lzh.php deleted file mode 100644 index 1180c6b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lzh.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/lzh_TW.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/lzh_TW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/lzh_TW.php deleted file mode 100644 index 3b1493e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/lzh_TW.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'OY[年]MMMMOD[日]', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 一 ', ' 二 ', ' 三 ', ' 四 ', ' 五 ', ' 六 ', ' 七 ', ' 八 ', ' 九 ', ' 十 ', '十一', '十二'], - 'weekdays' => ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '廿', '廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '卅', '卅一'], - 'meridiem' => ['朝', '暮'], - - 'year' => ':count 夏', // less reliable - 'y' => ':count 夏', // less reliable - 'a_year' => ':count 夏', // less reliable - - 'month' => ':count 月', // less reliable - 'm' => ':count 月', // less reliable - 'a_month' => ':count 月', // less reliable - - 'hour' => ':count 氧', // less reliable - 'h' => ':count 氧', // less reliable - 'a_hour' => ':count 氧', // less reliable - - 'minute' => ':count 點', // less reliable - 'min' => ':count 點', // less reliable - 'a_minute' => ':count 點', // less reliable - - 'second' => ':count 楚', // less reliable - 's' => ':count 楚', // less reliable - 'a_second' => ':count 楚', // less reliable - - 'week' => ':count 星期', - 'w' => ':count 星期', - 'a_week' => ':count 星期', - - 'day' => ':count 日(曆法)', - 'd' => ':count 日(曆法)', - 'a_day' => ':count 日(曆法)', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mag.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mag.php deleted file mode 100644 index 7532436..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mag.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mag_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mag_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mag_IN.php deleted file mode 100644 index 193f67a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mag_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bhashaghar@googlegroups.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], - 'weekdays_short' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], - 'weekdays_min' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mai.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mai.php deleted file mode 100644 index 792b973..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mai.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mai_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mai_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mai_IN.php deleted file mode 100644 index 03049d4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mai_IN.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Maithili Computing Research Center, Pune, India rajeshkajha@yahoo.com,akhilesh.k@samusng.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['बैसाख', 'जेठ', 'अषाढ़', 'सावोन', 'भादो', 'आसिन', 'कातिक', 'अगहन', 'पूस', 'माघ', 'फागुन', 'चैति'], - 'months_short' => ['बैसाख', 'जेठ', 'अषाढ़', 'सावोन', 'भादो', 'आसिन', 'कातिक', 'अगहन', 'पूस', 'माघ', 'फागुन', 'चैति'], - 'weekdays' => ['रविदिन', 'सोमदिन', 'मंगलदिन', 'बुधदिन', 'बृहस्पतीदिन', 'शुक्रदिन', 'शनीदिन'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पती', 'शुक्र', 'शनी'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पती', 'शुक्र', 'शनी'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'year' => ':count ऋतु', // less reliable - 'y' => ':count ऋतु', // less reliable - 'a_year' => ':count ऋतु', // less reliable - - 'month' => ':count महिना', - 'm' => ':count महिना', - 'a_month' => ':count महिना', - - 'week' => ':count श्रेणी:क्यालेन्डर', // less reliable - 'w' => ':count श्रेणी:क्यालेन्डर', // less reliable - 'a_week' => ':count श्रेणी:क्यालेन्डर', // less reliable - - 'day' => ':count दिन', - 'd' => ':count दिन', - 'a_day' => ':count दिन', - - 'hour' => ':count घण्टा', - 'h' => ':count घण्टा', - 'a_hour' => ':count घण्टा', - - 'minute' => ':count समय', // less reliable - 'min' => ':count समय', // less reliable - 'a_minute' => ':count समय', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mas.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mas.php deleted file mode 100644 index cbd610c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mas.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Ɛnkakɛnyá', 'Ɛndámâ'], - 'weekdays' => ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'], - 'months_short' => ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count olameyu', // less reliable - 'y' => ':count olameyu', // less reliable - 'a_year' => ':count olameyu', // less reliable - - 'week' => ':count engolongeare orwiki', // less reliable - 'w' => ':count engolongeare orwiki', // less reliable - 'a_week' => ':count engolongeare orwiki', // less reliable - - 'hour' => ':count esahabu', // less reliable - 'h' => ':count esahabu', // less reliable - 'a_hour' => ':count esahabu', // less reliable - - 'second' => ':count are', // less reliable - 's' => ':count are', // less reliable - 'a_second' => ':count are', // less reliable - - 'month' => ':count olapa', - 'm' => ':count olapa', - 'a_month' => ':count olapa', - - 'day' => ':count enkolongʼ', - 'd' => ':count enkolongʼ', - 'a_day' => ':count enkolongʼ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mas_TZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mas_TZ.php deleted file mode 100644 index 56e2905..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mas_TZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/mas.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mer.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mer.php deleted file mode 100644 index 2e14597..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mer.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['RŨ', 'ŨG'], - 'weekdays' => ['Kiumia', 'Muramuko', 'Wairi', 'Wethatu', 'Wena', 'Wetano', 'Jumamosi'], - 'weekdays_short' => ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'], - 'weekdays_min' => ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'], - 'months' => ['Januarĩ', 'Feburuarĩ', 'Machi', 'Ĩpurũ', 'Mĩĩ', 'Njuni', 'Njuraĩ', 'Agasti', 'Septemba', 'Oktũba', 'Novemba', 'Dicemba'], - 'months_short' => ['JAN', 'FEB', 'MAC', 'ĨPU', 'MĨĨ', 'NJU', 'NJR', 'AGA', 'SPT', 'OKT', 'NOV', 'DEC'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => ':count murume', // less reliable - 'y' => ':count murume', // less reliable - 'a_year' => ':count murume', // less reliable - - 'month' => ':count muchaara', // less reliable - 'm' => ':count muchaara', // less reliable - 'a_month' => ':count muchaara', // less reliable - - 'minute' => ':count monto', // less reliable - 'min' => ':count monto', // less reliable - 'a_minute' => ':count monto', // less reliable - - 'second' => ':count gikeno', // less reliable - 's' => ':count gikeno', // less reliable - 'a_second' => ':count gikeno', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mfe.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mfe.php deleted file mode 100644 index 4d6e6b6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mfe.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mfe_MU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mfe_MU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mfe_MU.php deleted file mode 100644 index 2d27b45..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mfe_MU.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['zanvie', 'fevriye', 'mars', 'avril', 'me', 'zin', 'zilye', 'out', 'septam', 'oktob', 'novam', 'desam'], - 'months_short' => ['zan', 'fev', 'mar', 'avr', 'me', 'zin', 'zil', 'out', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['dimans', 'lindi', 'mardi', 'merkredi', 'zedi', 'vandredi', 'samdi'], - 'weekdays_short' => ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'], - 'weekdays_min' => ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'], - - 'year' => ':count banané', - 'y' => ':count banané', - 'a_year' => ':count banané', - - 'month' => ':count mwa', - 'm' => ':count mwa', - 'a_month' => ':count mwa', - - 'week' => ':count sémenn', - 'w' => ':count sémenn', - 'a_week' => ':count sémenn', - - 'day' => ':count zour', - 'd' => ':count zour', - 'a_day' => ':count zour', - - 'hour' => ':count -er-tan', - 'h' => ':count -er-tan', - 'a_hour' => ':count -er-tan', - - 'minute' => ':count minitt', - 'min' => ':count minitt', - 'a_minute' => ':count minitt', - - 'second' => ':count déziém', - 's' => ':count déziém', - 'a_second' => ':count déziém', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mg.php deleted file mode 100644 index 40bc2a8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mg.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mg_MG.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mg_MG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mg_MG.php deleted file mode 100644 index 6a14535..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mg_MG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - The Debian Project modified by GNU//Linux Malagasy Rado Ramarotafika,Do-Risika RAFIEFERANTSIARONJY rado@linuxmg.org,dourix@free.fr - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Janoary', 'Febroary', 'Martsa', 'Aprily', 'Mey', 'Jona', 'Jolay', 'Aogositra', 'Septambra', 'Oktobra', 'Novambra', 'Desambra'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mey', 'Jon', 'Jol', 'Aog', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['alahady', 'alatsinainy', 'talata', 'alarobia', 'alakamisy', 'zoma', 'sabotsy'], - 'weekdays_short' => ['lhd', 'lts', 'tlt', 'lrb', 'lkm', 'zom', 'sab'], - 'weekdays_min' => ['lhd', 'lts', 'tlt', 'lrb', 'lkm', 'zom', 'sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'minute' => ':count minitra', // less reliable - 'min' => ':count minitra', // less reliable - 'a_minute' => ':count minitra', // less reliable - - 'year' => ':count taona', - 'y' => ':count taona', - 'a_year' => ':count taona', - - 'month' => ':count volana', - 'm' => ':count volana', - 'a_month' => ':count volana', - - 'week' => ':count herinandro', - 'w' => ':count herinandro', - 'a_week' => ':count herinandro', - - 'day' => ':count andro', - 'd' => ':count andro', - 'a_day' => ':count andro', - - 'hour' => ':count ora', - 'h' => ':count ora', - 'a_hour' => ':count ora', - - 'second' => ':count segondra', - 's' => ':count segondra', - 'a_second' => ':count segondra', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mgh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mgh.php deleted file mode 100644 index 2a80960..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mgh.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['wichishu', 'mchochil’l'], - 'weekdays' => ['Sabato', 'Jumatatu', 'Jumanne', 'Jumatano', 'Arahamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'], - 'weekdays_min' => ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'], - 'months' => ['Mweri wo kwanza', 'Mweri wo unayeli', 'Mweri wo uneraru', 'Mweri wo unecheshe', 'Mweri wo unethanu', 'Mweri wo thanu na mocha', 'Mweri wo saba', 'Mweri wo nane', 'Mweri wo tisa', 'Mweri wo kumi', 'Mweri wo kumi na moja', 'Mweri wo kumi na yel’li'], - 'months_short' => ['Kwa', 'Una', 'Rar', 'Che', 'Tha', 'Moc', 'Sab', 'Nan', 'Tis', 'Kum', 'Moj', 'Yel'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mgo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mgo.php deleted file mode 100644 index a126c9f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mgo.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'], - 'weekdays_short' => ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'], - 'weekdays_min' => ['1', '2', '3', '4', '5', '6', '7'], - 'months' => ['iməg mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'], - 'months_short' => ['mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'dddd, YYYY MMMM DD HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mhr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mhr.php deleted file mode 100644 index 6bbc9f6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mhr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mhr_RU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mhr_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mhr_RU.php deleted file mode 100644 index 309ead9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mhr_RU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - PeshSajSoft Ltd. Vyacheslav Kileev slavakileev@yandex.ru - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY.MM.DD', - ], - 'months' => ['Шорыкйол', 'Пургыж', 'Ӱярня', 'Вӱдшор', 'Ага', 'Пеледыш', 'Сӱрем', 'Сорла', 'Идым', 'Шыжа', 'Кылме', 'Теле'], - 'months_short' => ['Шрк', 'Пгж', 'Ӱрн', 'Вшр', 'Ага', 'Пдш', 'Срм', 'Срл', 'Идм', 'Шыж', 'Клм', 'Тел'], - 'weekdays' => ['Рушарня', 'Шочмо', 'Кушкыжмо', 'Вӱргече', 'Изарня', 'Кугарня', 'Шуматкече'], - 'weekdays_short' => ['Ршр', 'Шчм', 'Кжм', 'Вгч', 'Изр', 'Кгр', 'Шмт'], - 'weekdays_min' => ['Ршр', 'Шчм', 'Кжм', 'Вгч', 'Изр', 'Кгр', 'Шмт'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count идалык', - 'y' => ':count идалык', - 'a_year' => ':count идалык', - - 'month' => ':count Тылзе', - 'm' => ':count Тылзе', - 'a_month' => ':count Тылзе', - - 'week' => ':count арня', - 'w' => ':count арня', - 'a_week' => ':count арня', - - 'day' => ':count кече', - 'd' => ':count кече', - 'a_day' => ':count кече', - - 'hour' => ':count час', - 'h' => ':count час', - 'a_hour' => ':count час', - - 'minute' => ':count минут', - 'min' => ':count минут', - 'a_minute' => ':count минут', - - 'second' => ':count кокымшан', - 's' => ':count кокымшан', - 'a_second' => ':count кокымшан', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mi.php deleted file mode 100644 index b7f51ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mi.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - John Corrigan - * - François B - */ -return [ - 'year' => ':count tau', - 'a_year' => '{1}he tau|:count tau', - 'month' => ':count marama', - 'a_month' => '{1}he marama|:count marama', - 'week' => ':count wiki', - 'a_week' => '{1}he wiki|:count wiki', - 'day' => ':count ra', - 'a_day' => '{1}he ra|:count ra', - 'hour' => ':count haora', - 'a_hour' => '{1}te haora|:count haora', - 'minute' => ':count meneti', - 'a_minute' => '{1}he meneti|:count meneti', - 'second' => ':count hēkona', - 'a_second' => '{1}te hēkona ruarua|:count hēkona', - 'ago' => ':time i mua', - 'from_now' => 'i roto i :time', - 'diff_yesterday' => 'inanahi', - 'diff_yesterday_regexp' => 'inanahi(?:\\s+i)?', - 'diff_today' => 'i teie', - 'diff_today_regexp' => 'i teie(?:\\s+mahana,)?(?:\\s+i)?', - 'diff_tomorrow' => 'apopo', - 'diff_tomorrow_regexp' => 'apopo(?:\\s+i)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [i] HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY [i] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[i teie mahana, i] LT', - 'nextDay' => '[apopo i] LT', - 'nextWeek' => 'dddd [i] LT', - 'lastDay' => '[inanahi i] LT', - 'lastWeek' => 'dddd [whakamutunga i] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['Kohi-tāte', 'Hui-tanguru', 'Poutū-te-rangi', 'Paenga-whāwhā', 'Haratua', 'Pipiri', 'Hōngoingoi', 'Here-turi-kōkā', 'Mahuru', 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', 'Hakihea'], - 'months_short' => ['Kohi', 'Hui', 'Pou', 'Pae', 'Hara', 'Pipi', 'Hōngoi', 'Here', 'Mahu', 'Whi-nu', 'Whi-ra', 'Haki'], - 'weekdays' => ['Rātapu', 'Mane', 'Tūrei', 'Wenerei', 'Tāite', 'Paraire', 'Hātarei'], - 'weekdays_short' => ['Ta', 'Ma', 'Tū', 'We', 'Tāi', 'Pa', 'Hā'], - 'weekdays_min' => ['Ta', 'Ma', 'Tū', 'We', 'Tāi', 'Pa', 'Hā'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' me te '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mi_NZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mi_NZ.php deleted file mode 100644 index 6b964e3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mi_NZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mi.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/miq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/miq.php deleted file mode 100644 index 51e5a98..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/miq.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/miq_NI.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/miq_NI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/miq_NI.php deleted file mode 100644 index 57faa31..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/miq_NI.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['siakwa kati', 'kuswa kati', 'kakamuk kati', 'lî wainhka kati', 'lih mairin kati', 'lî kati', 'pastara kati', 'sikla kati', 'wîs kati', 'waupasa kati', 'yahbra kati', 'trisu kati'], - 'months_short' => ['siakwa kati', 'kuswa kati', 'kakamuk kati', 'lî wainhka kati', 'lih mairin kati', 'lî kati', 'pastara kati', 'sikla kati', 'wîs kati', 'waupasa kati', 'yahbra kati', 'trisu kati'], - 'weekdays' => ['sandi', 'mundi', 'tiusdi', 'wensde', 'tausde', 'praidi', 'satadi'], - 'weekdays_short' => ['san', 'mun', 'tius', 'wens', 'taus', 'prai', 'sat'], - 'weekdays_min' => ['san', 'mun', 'tius', 'wens', 'taus', 'prai', 'sat'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 7, - 'meridiem' => ['VM', 'NM'], - - 'month' => ':count kati', // less reliable - 'm' => ':count kati', // less reliable - 'a_month' => ':count kati', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mjw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mjw.php deleted file mode 100644 index 617154c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mjw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mjw_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mjw_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mjw_IN.php deleted file mode 100644 index 58ed0d1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mjw_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Jor Teron bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['Arkoi', 'Thangthang', 'There', 'Jangmi', 'Aru', 'Vosik', 'Jakhong', 'Paipai', 'Chiti', 'Phere', 'Phaikuni', 'Matijong'], - 'months_short' => ['Ark', 'Thang', 'The', 'Jang', 'Aru', 'Vos', 'Jak', 'Pai', 'Chi', 'Phe', 'Phai', 'Mati'], - 'weekdays' => ['Bhomkuru', 'Urmi', 'Durmi', 'Thelang', 'Theman', 'Bhomta', 'Bhomti'], - 'weekdays_short' => ['Bhom', 'Ur', 'Dur', 'Tkel', 'Tkem', 'Bhta', 'Bhti'], - 'weekdays_min' => ['Bhom', 'Ur', 'Dur', 'Tkel', 'Tkem', 'Bhta', 'Bhti'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mk.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mk.php deleted file mode 100644 index d822de0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mk.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sashko Todorov - * - Josh Soref - * - François B - * - Serhan Apaydın - * - Borislav Mickov - * - JD Isaacks - * - Tomi Atanasoski - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count година|:count години', - 'a_year' => 'година|:count години', - 'y' => ':count год.', - 'month' => ':count месец|:count месеци', - 'a_month' => 'месец|:count месеци', - 'm' => ':count месец|:count месеци', - 'week' => ':count седмица|:count седмици', - 'a_week' => 'седмица|:count седмици', - 'w' => ':count седмица|:count седмици', - 'day' => ':count ден|:count дена', - 'a_day' => 'ден|:count дена', - 'd' => ':count ден|:count дена', - 'hour' => ':count час|:count часа', - 'a_hour' => 'час|:count часа', - 'h' => ':count час|:count часа', - 'minute' => ':count минута|:count минути', - 'a_minute' => 'минута|:count минути', - 'min' => ':count мин.', - 'second' => ':count секунда|:count секунди', - 'a_second' => 'неколку секунди|:count секунди', - 's' => ':count сек.', - 'ago' => 'пред :time', - 'from_now' => 'после :time', - 'after' => 'по :time', - 'before' => 'пред :time', - 'diff_now' => 'сега', - 'diff_today' => 'Денес', - 'diff_today_regexp' => 'Денес(?:\\s+во)?', - 'diff_yesterday' => 'вчера', - 'diff_yesterday_regexp' => 'Вчера(?:\\s+во)?', - 'diff_tomorrow' => 'утре', - 'diff_tomorrow_regexp' => 'Утре(?:\\s+во)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'D.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY H:mm', - 'LLLL' => 'dddd, D MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Денес во] LT', - 'nextDay' => '[Утре во] LT', - 'nextWeek' => '[Во] dddd [во] LT', - 'lastDay' => '[Вчера во] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - case 3: - case 6: - return '[Изминатата] dddd [во] LT'; - default: - return '[Изминатиот] dddd [во] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - $lastDigit = $number % 10; - $last2Digits = $number % 100; - if ($number === 0) { - return $number.'-ев'; - } - if ($last2Digits === 0) { - return $number.'-ен'; - } - if ($last2Digits > 10 && $last2Digits < 20) { - return $number.'-ти'; - } - if ($lastDigit === 1) { - return $number.'-ви'; - } - if ($lastDigit === 2) { - return $number.'-ри'; - } - if ($lastDigit === 7 || $lastDigit === 8) { - return $number.'-ми'; - } - - return $number.'-ти'; - }, - 'months' => ['јануари', 'февруари', 'март', 'април', 'мај', 'јуни', 'јули', 'август', 'септември', 'октомври', 'ноември', 'декември'], - 'months_short' => ['јан', 'фев', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'ное', 'дек'], - 'weekdays' => ['недела', 'понеделник', 'вторник', 'среда', 'четврток', 'петок', 'сабота'], - 'weekdays_short' => ['нед', 'пон', 'вто', 'сре', 'чет', 'пет', 'саб'], - 'weekdays_min' => ['нe', 'пo', 'вт', 'ср', 'че', 'пе', 'сa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['АМ', 'ПМ'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mk_MK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mk_MK.php deleted file mode 100644 index 95e2ff9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mk_MK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mk.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ml.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ml.php deleted file mode 100644 index 1abd6c4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ml.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - JD Isaacks - */ -return [ - 'year' => ':count വർഷം', - 'a_year' => 'ഒരു വർഷം|:count വർഷം', - 'month' => ':count മാസം', - 'a_month' => 'ഒരു മാസം|:count മാസം', - 'week' => ':count ആഴ്ച', - 'a_week' => 'ഒരാഴ്ച|:count ആഴ്ച', - 'day' => ':count ദിവസം', - 'a_day' => 'ഒരു ദിവസം|:count ദിവസം', - 'hour' => ':count മണിക്കൂർ', - 'a_hour' => 'ഒരു മണിക്കൂർ|:count മണിക്കൂർ', - 'minute' => ':count മിനിറ്റ്', - 'a_minute' => 'ഒരു മിനിറ്റ്|:count മിനിറ്റ്', - 'second' => ':count സെക്കൻഡ്', - 'a_second' => 'അൽപ നിമിഷങ്ങൾ|:count സെക്കൻഡ്', - 'ago' => ':time മുൻപ്', - 'from_now' => ':time കഴിഞ്ഞ്', - 'diff_now' => 'ഇപ്പോൾ', - 'diff_today' => 'ഇന്ന്', - 'diff_yesterday' => 'ഇന്നലെ', - 'diff_tomorrow' => 'നാളെ', - 'formats' => [ - 'LT' => 'A h:mm -നു', - 'LTS' => 'A h:mm:ss -നു', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm -നു', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm -നു', - ], - 'calendar' => [ - 'sameDay' => '[ഇന്ന്] LT', - 'nextDay' => '[നാളെ] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[ഇന്നലെ] LT', - 'lastWeek' => '[കഴിഞ്ഞ] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'രാത്രി'; - } - if ($hour < 12) { - return 'രാവിലെ'; - } - if ($hour < 17) { - return 'ഉച്ച കഴിഞ്ഞ്'; - } - if ($hour < 20) { - return 'വൈകുന്നേരം'; - } - - return 'രാത്രി'; - }, - 'months' => ['ജനുവരി', 'ഫെബ്രുവരി', 'മാർച്ച്', 'ഏപ്രിൽ', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗസ്റ്റ്', 'സെപ്റ്റംബർ', 'ഒക്ടോബർ', 'നവംബർ', 'ഡിസംബർ'], - 'months_short' => ['ജനു.', 'ഫെബ്രു.', 'മാർ.', 'ഏപ്രി.', 'മേയ്', 'ജൂൺ', 'ജൂലൈ.', 'ഓഗ.', 'സെപ്റ്റ.', 'ഒക്ടോ.', 'നവം.', 'ഡിസം.'], - 'weekdays' => ['ഞായറാഴ്ച', 'തിങ്കളാഴ്ച', 'ചൊവ്വാഴ്ച', 'ബുധനാഴ്ച', 'വ്യാഴാഴ്ച', 'വെള്ളിയാഴ്ച', 'ശനിയാഴ്ച'], - 'weekdays_short' => ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], - 'weekdays_min' => ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'], - 'list' => ', ', - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ml_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ml_IN.php deleted file mode 100644 index 000e795..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ml_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ml.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mn.php deleted file mode 100644 index 38c6434..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mn.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Zolzaya Erdenebaatar - * - Tom Hughes - * - Akira Matsuda - * - Christopher Dell - * - Michael Kessler - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Ochirkhuyag - * - Batmandakh - * - lucifer-crybaby - */ -return [ - 'year' => ':count жил', - 'y' => ':count жил', - 'month' => ':count сар', - 'm' => ':count сар', - 'week' => ':count долоо хоног', - 'w' => ':count долоо хоног', - 'day' => ':count өдөр', - 'd' => ':count өдөр', - 'hour' => ':count цаг', - 'h' => ':countц', - 'minute' => ':count минут', - 'min' => ':countм', - 'second' => ':count секунд', - 's' => ':countс', - - 'ago_mode' => 'last', - 'ago' => ':time өмнө', - 'year_ago' => ':count жилийн', - 'y_ago' => ':count жилийн', - 'month_ago' => ':count сарын', - 'm_ago' => ':count сарын', - 'day_ago' => ':count хоногийн', - 'd_ago' => ':count хоногийн', - 'week_ago' => ':count долоо хоногийн', - 'w_ago' => ':count долоо хоногийн', - 'hour_ago' => ':count цагийн', - 'minute_ago' => ':count минутын', - 'second_ago' => ':count секундын', - - 'from_now_mode' => 'last', - 'from_now' => 'одоогоос :time', - 'year_from_now' => ':count жилийн дараа', - 'y_from_now' => ':count жилийн дараа', - 'month_from_now' => ':count сарын дараа', - 'm_from_now' => ':count сарын дараа', - 'day_from_now' => ':count хоногийн дараа', - 'd_from_now' => ':count хоногийн дараа', - 'hour_from_now' => ':count цагийн дараа', - 'minute_from_now' => ':count минутын дараа', - 'second_from_now' => ':count секундын дараа', - - 'after_mode' => 'last', - 'after' => ':time дараа', - 'year_after' => ':count жилийн', - 'y_after' => ':count жилийн', - 'month_after' => ':count сарын', - 'm_after' => ':count сарын', - 'day_after' => ':count хоногийн', - 'd_after' => ':count хоногийн', - 'hour_after' => ':count цагийн', - 'minute_after' => ':count минутын', - 'second_after' => ':count секундын', - - 'before_mode' => 'last', - 'before' => ':time өмнө', - 'year_before' => ':count жилийн', - 'y_before' => ':count жилийн', - 'month_before' => ':count сарын', - 'm_before' => ':count сарын', - 'day_before' => ':count хоногийн', - 'd_before' => ':count хоногийн', - 'hour_before' => ':count цагийн', - 'minute_before' => ':count минутын', - 'second_before' => ':count секундын', - - 'list' => ', ', - 'diff_now' => 'одоо', - 'diff_yesterday' => 'өчигдөр', - 'diff_tomorrow' => 'маргааш', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY MMMM DD', - 'LLL' => 'YY-MM-DD, HH:mm', - 'LLLL' => 'YYYY MMMM DD, HH:mm', - ], - 'weekdays' => ['Ням', 'Даваа', 'Мягмар', 'Лхагва', 'Пүрэв', 'Баасан', 'Бямба'], - 'weekdays_short' => ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'], - 'weekdays_min' => ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'], - 'months' => ['1 сар', '2 сар', '3 сар', '4 сар', '5 сар', '6 сар', '7 сар', '8 сар', '9 сар', '10 сар', '11 сар', '12 сар'], - 'months_short' => ['1 сар', '2 сар', '3 сар', '4 сар', '5 сар', '6 сар', '7 сар', '8 сар', '9 сар', '10 сар', '11 сар', '12 сар'], - 'meridiem' => ['өглөө', 'орой'], - 'first_day_of_week' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mn_MN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mn_MN.php deleted file mode 100644 index e5ce426..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mn_MN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mn.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mni.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mni.php deleted file mode 100644 index cafa2f8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mni.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/mni_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mni_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mni_IN.php deleted file mode 100644 index 45d430e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mni_IN.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['জানুৱারি', 'ফেব্রুৱারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগষ্ট', 'সেপ্তেম্বর', 'ওক্তোবর', 'নবেম্বর', 'ডিসেম্বর'], - 'months_short' => ['জান', 'ফেব', 'মার', 'এপ্রি', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ', 'ওক্ত', 'নবে', 'ডিস'], - 'weekdays' => ['নোংমাইজিং', 'নিংথৌকাবা', 'লৈবাকপোকপা', 'য়ুমশকৈশা', 'শগোলশেন', 'ইরাই', 'থাংজ'], - 'weekdays_short' => ['নোং', 'নিং', 'লৈবাক', 'য়ুম', 'শগোল', 'ইরা', 'থাং'], - 'weekdays_min' => ['নোং', 'নিং', 'লৈবাক', 'য়ুম', 'শগোল', 'ইরা', 'থাং'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['এ.ম.', 'প.ম.'], - - 'year' => ':count ইসিং', // less reliable - 'y' => ':count ইসিং', // less reliable - 'a_year' => ':count ইসিং', // less reliable - - 'second' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable - 's' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable - 'a_second' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mo.php deleted file mode 100644 index 102afcd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mo.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ro.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mr.php deleted file mode 100644 index 4aaeafd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mr.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Vikram-enyota - */ -return [ - 'year' => ':count वर्ष', - 'y' => ':count वर्ष', - 'month' => ':count महिना|:count महिने', - 'm' => ':count महिना|:count महिने', - 'week' => ':count आठवडा|:count आठवडे', - 'w' => ':count आठवडा|:count आठवडे', - 'day' => ':count दिवस', - 'd' => ':count दिवस', - 'hour' => ':count तास', - 'h' => ':count तास', - 'minute' => ':count मिनिटे', - 'min' => ':count मिनिटे', - 'second' => ':count सेकंद', - 's' => ':count सेकंद', - - 'ago' => ':timeपूर्वी', - 'from_now' => ':timeमध्ये', - 'before' => ':timeपूर्वी', - 'after' => ':timeनंतर', - - 'diff_now' => 'आत्ता', - 'diff_today' => 'आज', - 'diff_yesterday' => 'काल', - 'diff_tomorrow' => 'उद्या', - - 'formats' => [ - 'LT' => 'A h:mm वाजता', - 'LTS' => 'A h:mm:ss वाजता', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm वाजता', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm वाजता', - ], - - 'calendar' => [ - 'sameDay' => '[आज] LT', - 'nextDay' => '[उद्या] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[काल] LT', - 'lastWeek' => '[मागील] dddd, LT', - 'sameElse' => 'L', - ], - - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'रात्री'; - } - if ($hour < 10) { - return 'सकाळी'; - } - if ($hour < 17) { - return 'दुपारी'; - } - if ($hour < 20) { - return 'सायंकाळी'; - } - - return 'रात्री'; - }, - - 'months' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], - 'months_short' => ['जाने.', 'फेब्रु.', 'मार्च.', 'एप्रि.', 'मे.', 'जून.', 'जुलै.', 'ऑग.', 'सप्टें.', 'ऑक्टो.', 'नोव्हें.', 'डिसें.'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगळवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगळ', 'बुध', 'गुरू', 'शुक्र', 'शनि'], - 'weekdays_min' => ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'], - 'list' => [', ', ' आणि '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mr_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mr_IN.php deleted file mode 100644 index 7bca919..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mr_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ms.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ms.php deleted file mode 100644 index c9e8085..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ms.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Azri Jamil - * - JD Isaacks - * - Josh Soref - * - Azri Jamil - * - Hariadi Hinta - * - Ashraf Kamarudin - */ -return [ - 'year' => ':count tahun', - 'a_year' => '{1}setahun|]1,Inf[:count tahun', - 'y' => ':count tahun', - 'month' => ':count bulan', - 'a_month' => '{1}sebulan|]1,Inf[:count bulan', - 'm' => ':count bulan', - 'week' => ':count minggu', - 'a_week' => '{1}seminggu|]1,Inf[:count minggu', - 'w' => ':count minggu', - 'day' => ':count hari', - 'a_day' => '{1}sehari|]1,Inf[:count hari', - 'd' => ':count hari', - 'hour' => ':count jam', - 'a_hour' => '{1}sejam|]1,Inf[:count jam', - 'h' => ':count jam', - 'minute' => ':count minit', - 'a_minute' => '{1}seminit|]1,Inf[:count minit', - 'min' => ':count minit', - 'second' => ':count saat', - 'a_second' => '{1}beberapa saat|]1,Inf[:count saat', - 'millisecond' => ':count milisaat', - 'a_millisecond' => '{1}semilisaat|]1,Inf[:count milliseconds', - 'microsecond' => ':count mikrodetik', - 'a_microsecond' => '{1}semikrodetik|]1,Inf[:count mikrodetik', - 's' => ':count saat', - 'ago' => ':time yang lepas', - 'from_now' => ':time dari sekarang', - 'after' => ':time kemudian', - 'before' => ':time sebelum', - 'diff_now' => 'sekarang', - 'diff_today' => 'Hari', - 'diff_today_regexp' => 'Hari(?:\\s+ini)?(?:\\s+pukul)?', - 'diff_yesterday' => 'semalam', - 'diff_yesterday_regexp' => 'Semalam(?:\\s+pukul)?', - 'diff_tomorrow' => 'esok', - 'diff_tomorrow_regexp' => 'Esok(?:\\s+pukul)?', - 'diff_before_yesterday' => 'kelmarin', - 'diff_after_tomorrow' => 'lusa', - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [pukul] HH.mm', - 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', - ], - 'calendar' => [ - 'sameDay' => '[Hari ini pukul] LT', - 'nextDay' => '[Esok pukul] LT', - 'nextWeek' => 'dddd [pukul] LT', - 'lastDay' => '[Kelmarin pukul] LT', - 'lastWeek' => 'dddd [lepas pukul] LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 1) { - return 'tengah malam'; - } - - if ($hour < 12) { - return 'pagi'; - } - - if ($hour < 13) { - return 'tengah hari'; - } - - if ($hour < 19) { - return 'petang'; - } - - return 'malam'; - }, - 'months' => ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogs', 'Sep', 'Okt', 'Nov', 'Dis'], - 'weekdays' => ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'], - 'weekdays_short' => ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'], - 'weekdays_min' => ['Ah', 'Is', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' dan '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ms_BN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ms_BN.php deleted file mode 100644 index ef837a2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ms_BN.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ms.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/MM/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, h:mm a', - 'LLLL' => 'dd MMMM YYYY, h:mm a', - ], - 'meridiem' => ['a', 'p'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ms_MY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ms_MY.php deleted file mode 100644 index 970d604..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ms_MY.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Azri Jamil - * - JD Isaacks - */ -return require __DIR__.'/ms.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ms_SG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ms_SG.php deleted file mode 100644 index 77cb83d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ms_SG.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ms.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/MM/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY, h:mm a', - ], - 'meridiem' => ['a', 'p'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mt.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mt.php deleted file mode 100644 index e8aadcc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mt.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Alessandro Maruccia - */ -return [ - 'year' => 'sena|:count sni|:count sni|:count sni', - 'y' => 'sa sena|:count snin|:count snin|:count snin', - 'month' => 'xahar|:count xhur|:count xhur|:count xhur', - 'm' => ':count xahar|:count xhur|:count xhur|:count xhur', - 'week' => 'gimgħa|:count ġimgħat|:count ġimgħat|:count ġimgħat', - 'w' => 'ġimgħa|:count ġimgħat|:count ġimgħat|:count ġimgħat', - 'day' => 'ġurnata|:count ġranet|:count ġranet|:count ġranet', - 'd' => 'ġurnata|:count ġranet|:count ġranet|:count ġranet', - 'hour' => 'siegħa|:count siegħat|:count siegħat|:count siegħat', - 'h' => 'siegħa|:count sigħat|:count sigħat|:count sigħat', - 'minute' => 'minuta|:count minuti|:count minuti|:count minuti', - 'min' => 'min.|:count min.|:count min.|:count min.', - 'second' => 'ftit sekondi|:count sekondi|:count sekondi|:count sekondi', - 's' => 'sek.|:count sek.|:count sek.|:count sek.', - 'ago' => ':time ilu', - 'from_now' => 'f’ :time', - 'diff_now' => 'issa', - 'diff_today' => 'Illum', - 'diff_today_regexp' => 'Illum(?:\\s+fil-)?', - 'diff_yesterday' => 'lbieraħ', - 'diff_yesterday_regexp' => 'Il-bieraħ(?:\\s+fil-)?', - 'diff_tomorrow' => 'għada', - 'diff_tomorrow_regexp' => 'Għada(?:\\s+fil-)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Illum fil-]LT', - 'nextDay' => '[Għada fil-]LT', - 'nextWeek' => 'dddd [fil-]LT', - 'lastDay' => '[Il-bieraħ fil-]LT', - 'lastWeek' => 'dddd [li għadda] [fil-]LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['Jannar', 'Frar', 'Marzu', 'April', 'Mejju', 'Ġunju', 'Lulju', 'Awwissu', 'Settembru', 'Ottubru', 'Novembru', 'Diċembru'], - 'months_short' => ['Jan', 'Fra', 'Mar', 'Apr', 'Mej', 'Ġun', 'Lul', 'Aww', 'Set', 'Ott', 'Nov', 'Diċ'], - 'weekdays' => ['Il-Ħadd', 'It-Tnejn', 'It-Tlieta', 'L-Erbgħa', 'Il-Ħamis', 'Il-Ġimgħa', 'Is-Sibt'], - 'weekdays_short' => ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'], - 'weekdays_min' => ['Ħa', 'Tn', 'Tl', 'Er', 'Ħa', 'Ġi', 'Si'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' u '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mt_MT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mt_MT.php deleted file mode 100644 index 9534f68..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mt_MT.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/mt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mua.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mua.php deleted file mode 100644 index a3a3c6f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mua.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['comme', 'lilli'], - 'weekdays' => ['Com’yakke', 'Comlaaɗii', 'Comzyiiɗii', 'Comkolle', 'Comkaldǝɓlii', 'Comgaisuu', 'Comzyeɓsuu'], - 'weekdays_short' => ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'], - 'weekdays_min' => ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'], - 'months' => ['Fĩi Loo', 'Cokcwaklaŋne', 'Cokcwaklii', 'Fĩi Marfoo', 'Madǝǝuutǝbijaŋ', 'Mamǝŋgwãafahbii', 'Mamǝŋgwãalii', 'Madǝmbii', 'Fĩi Dǝɓlii', 'Fĩi Mundaŋ', 'Fĩi Gwahlle', 'Fĩi Yuru'], - 'months_short' => ['FLO', 'CLA', 'CKI', 'FMF', 'MAD', 'MBI', 'MLI', 'MAM', 'FDE', 'FMU', 'FGW', 'FYU'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/my.php b/dependencies/nesbot/carbon/src/Carbon/Lang/my.php deleted file mode 100644 index bbdfba4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/my.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - * - Nay Lin Aung - */ -return [ - 'year' => '{1}တစ်နှစ်|]1,Inf[:count နှစ်', - 'y' => ':count နှစ်', - 'month' => '{1}တစ်လ|]1,Inf[:count လ', - 'm' => ':count လ', - 'week' => ':count ပတ်', - 'w' => ':count ပတ်', - 'day' => '{1}တစ်ရက်|]1,Inf[:count ရက်', - 'd' => ':count ရက်', - 'hour' => '{1}တစ်နာရီ|]1,Inf[:count နာရီ', - 'h' => ':count နာရီ', - 'minute' => '{1}တစ်မိနစ်|]1,Inf[:count မိနစ်', - 'min' => ':count မိနစ်', - 'second' => '{1}စက္ကန်.အနည်းငယ်|]1,Inf[:count စက္ကန့်', - 's' => ':count စက္ကန့်', - 'ago' => 'လွန်ခဲ့သော :time က', - 'from_now' => 'လာမည့် :time မှာ', - 'after' => ':time ကြာပြီးနောက်', - 'before' => ':time မတိုင်ခင်', - 'diff_now' => 'အခုလေးတင်', - 'diff_today' => 'ယနေ.', - 'diff_yesterday' => 'မနေ့က', - 'diff_yesterday_regexp' => 'မနေ.က', - 'diff_tomorrow' => 'မနက်ဖြန်', - 'diff_before_yesterday' => 'တမြန်နေ့က', - 'diff_after_tomorrow' => 'တဘက်ခါ', - 'period_recurrences' => ':count ကြိမ်', - 'formats' => [ - 'LT' => 'Oh:Om A', - 'LTS' => 'Oh:Om:Os A', - 'L' => 'OD/OM/OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY Oh:Om A', - 'LLLL' => 'dddd OD MMMM OY Oh:Om A', - ], - 'calendar' => [ - 'sameDay' => '[ယနေ.] LT [မှာ]', - 'nextDay' => '[မနက်ဖြန်] LT [မှာ]', - 'nextWeek' => 'dddd LT [မှာ]', - 'lastDay' => '[မနေ.က] LT [မှာ]', - 'lastWeek' => '[ပြီးခဲ့သော] dddd LT [မှာ]', - 'sameElse' => 'L', - ], - 'months' => ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'သြဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'], - 'months_short' => ['ဇန်', 'ဖေ', 'မတ်', 'ပြီ', 'မေ', 'ဇွန်', 'လိုင်', 'သြ', 'စက်', 'အောက်', 'နို', 'ဒီ'], - 'weekdays' => ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'], - 'weekdays_short' => ['နွေ', 'လာ', 'ဂါ', 'ဟူး', 'ကြာ', 'သော', 'နေ'], - 'weekdays_min' => ['နွေ', 'လာ', 'ဂါ', 'ဟူး', 'ကြာ', 'သော', 'နေ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'alt_numbers' => ['၀၀', '၀၁', '၀၂', '၀၃', '၀၄', '၀၅', '၀၆', '၀၇', '၀၈', '၀၉', '၁၀', '၁၁', '၁၂', '၁၃', '၁၄', '၁၅', '၁၆', '၁၇', '၁၈', '၁၉', '၂၀', '၂၁', '၂၂', '၂၃', '၂၄', '၂၅', '၂၆', '၂၇', '၂၈', '၂၉', '၃၀', '၃၁', '၃၂', '၃၃', '၃၄', '၃၅', '၃၆', '၃၇', '၃၈', '၃၉', '၄၀', '၄၁', '၄၂', '၄၃', '၄၄', '၄၅', '၄၆', '၄၇', '၄၈', '၄၉', '၅၀', '၅၁', '၅၂', '၅၃', '၅၄', '၅၅', '၅၆', '၅၇', '၅၈', '၅၉', '၆၀', '၆၁', '၆၂', '၆၃', '၆၄', '၆၅', '၆၆', '၆၇', '၆၈', '၆၉', '၇၀', '၇၁', '၇၂', '၇၃', '၇၄', '၇၅', '၇၆', '၇၇', '၇၈', '၇၉', '၈၀', '၈၁', '၈၂', '၈၃', '၈၄', '၈၅', '၈၆', '၈၇', '၈၈', '၈၉', '၉၀', '၉၁', '၉၂', '၉၃', '၉၄', '၉၅', '၉၆', '၉၇', '၉၈', '၉၉'], - 'meridiem' => ['နံနက်', 'ညနေ'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/my_MM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/my_MM.php deleted file mode 100644 index a0108dd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/my_MM.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/my.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/mzn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/mzn.php deleted file mode 100644 index 70f5f23..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/mzn.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fa.php', [ - 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], - 'first_day_of_week' => 6, - 'weekend' => [5, 5], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nan.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nan.php deleted file mode 100644 index 0affece..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nan.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nan_TW.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW.php deleted file mode 100644 index 5c50aa4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], - 'weekdays' => ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['頂晡', '下晡'], - - 'year' => ':count 年', - 'y' => ':count 年', - 'a_year' => ':count 年', - - 'month' => ':count goe̍h', - 'm' => ':count goe̍h', - 'a_month' => ':count goe̍h', - - 'week' => ':count lé-pài', - 'w' => ':count lé-pài', - 'a_week' => ':count lé-pài', - - 'day' => ':count 日', - 'd' => ':count 日', - 'a_day' => ':count 日', - - 'hour' => ':count tiám-cheng', - 'h' => ':count tiám-cheng', - 'a_hour' => ':count tiám-cheng', - - 'minute' => ':count Hun-cheng', - 'min' => ':count Hun-cheng', - 'a_minute' => ':count Hun-cheng', - - 'second' => ':count Bió', - 's' => ':count Bió', - 'a_second' => ':count Bió', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php deleted file mode 100644 index 99ca2a4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Arne Goetje arne@canonical.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'months' => ['1goe̍h', '2goe̍h', '3goe̍h', '4goe̍h', '5goe̍h', '6goe̍h', '7goe̍h', '8goe̍h', '9goe̍h', '10goe̍h', '11goe̍h', '12goe̍h'], - 'months_short' => ['1g', '2g', '3g', '4g', '5g', '6g', '7g', '8g', '9g', '10g', '11g', '12g'], - 'weekdays' => ['lé-pài-ji̍t', 'pài-it', 'pài-jī', 'pài-saⁿ', 'pài-sì', 'pài-gō͘', 'pài-la̍k'], - 'weekdays_short' => ['lp', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6'], - 'weekdays_min' => ['lp', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['téng-po͘', 'ē-po͘'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/naq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/naq.php deleted file mode 100644 index fbd9be9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/naq.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ǁgoagas', 'ǃuias'], - 'weekdays' => ['Sontaxtsees', 'Mantaxtsees', 'Denstaxtsees', 'Wunstaxtsees', 'Dondertaxtsees', 'Fraitaxtsees', 'Satertaxtsees'], - 'weekdays_short' => ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'], - 'weekdays_min' => ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'], - 'months' => ['ǃKhanni', 'ǃKhanǀgôab', 'ǀKhuuǁkhâb', 'ǃHôaǂkhaib', 'ǃKhaitsâb', 'Gamaǀaeb', 'ǂKhoesaob', 'Aoǁkhuumûǁkhâb', 'Taraǀkhuumûǁkhâb', 'ǂNûǁnâiseb', 'ǀHooǂgaeb', 'Hôasoreǁkhâb'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], - - 'year' => ':count kurigu', - 'y' => ':count kurigu', - 'a_year' => ':count kurigu', - - 'month' => ':count ǁaub', // less reliable - 'm' => ':count ǁaub', // less reliable - 'a_month' => ':count ǁaub', // less reliable - - 'week' => ':count hû', // less reliable - 'w' => ':count hû', // less reliable - 'a_week' => ':count hû', // less reliable - - 'day' => ':count ǀhobas', // less reliable - 'd' => ':count ǀhobas', // less reliable - 'a_day' => ':count ǀhobas', // less reliable - - 'hour' => ':count ǂgaes', // less reliable - 'h' => ':count ǂgaes', // less reliable - 'a_hour' => ':count ǂgaes', // less reliable - - 'minute' => ':count minutga', // less reliable - 'min' => ':count minutga', // less reliable - 'a_minute' => ':count minutga', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nb.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nb.php deleted file mode 100644 index 371ee84..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nb.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Alexander Tømmerås - * - Sigurd Gartmann - * - JD Isaacks - */ -return [ - 'year' => ':count år|:count år', - 'a_year' => 'ett år|:count år', - 'y' => ':count år|:count år', - 'month' => ':count måned|:count måneder', - 'a_month' => 'en måned|:count måneder', - 'm' => ':count md.', - 'week' => ':count uke|:count uker', - 'a_week' => 'en uke|:count uker', - 'w' => ':count u.', - 'day' => ':count dag|:count dager', - 'a_day' => 'en dag|:count dager', - 'd' => ':count d.', - 'hour' => ':count time|:count timer', - 'a_hour' => 'en time|:count timer', - 'h' => ':count t', - 'minute' => ':count minutt|:count minutter', - 'a_minute' => 'ett minutt|:count minutter', - 'min' => ':count min', - 'second' => ':count sekund|:count sekunder', - 'a_second' => 'noen sekunder|:count sekunder', - 's' => ':count sek', - 'ago' => ':time siden', - 'from_now' => 'om :time', - 'after' => ':time etter', - 'before' => ':time før', - 'diff_now' => 'akkurat nå', - 'diff_today' => 'i dag', - 'diff_today_regexp' => 'i dag(?:\\s+kl.)?', - 'diff_yesterday' => 'i går', - 'diff_yesterday_regexp' => 'i går(?:\\s+kl.)?', - 'diff_tomorrow' => 'i morgen', - 'diff_tomorrow_regexp' => 'i morgen(?:\\s+kl.)?', - 'diff_before_yesterday' => 'i forgårs', - 'diff_after_tomorrow' => 'i overmorgen', - 'period_recurrences' => 'en gang|:count ganger', - 'period_interval' => 'hver :interval', - 'period_start_date' => 'fra :date', - 'period_end_date' => 'til :date', - 'months' => ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], - 'weekdays_short' => ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'], - 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY [kl.] HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[i dag kl.] LT', - 'nextDay' => '[i morgen kl.] LT', - 'nextWeek' => 'dddd [kl.] LT', - 'lastDay' => '[i går kl.] LT', - 'lastWeek' => '[forrige] dddd [kl.] LT', - 'sameElse' => 'L', - ], - 'list' => [', ', ' og '], - 'meridiem' => ['a.m.', 'p.m.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nb_NO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nb_NO.php deleted file mode 100644 index 31678c5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nb_NO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nb.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nb_SJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nb_SJ.php deleted file mode 100644 index ce0210b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nb_SJ.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/nb.php', [ - 'formats' => [ - 'LL' => 'D. MMM YYYY', - 'LLL' => 'D. MMMM YYYY, HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY, HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nd.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nd.php deleted file mode 100644 index f75d9a7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nd.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Sonto', 'Mvulo', 'Sibili', 'Sithathu', 'Sine', 'Sihlanu', 'Mgqibelo'], - 'weekdays_short' => ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'], - 'weekdays_min' => ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'], - 'months' => ['Zibandlela', 'Nhlolanja', 'Mbimbitho', 'Mabasa', 'Nkwenkwezi', 'Nhlangula', 'Ntulikazi', 'Ncwabakazi', 'Mpandula', 'Mfumfu', 'Lwezi', 'Mpalakazi'], - 'months_short' => ['Zib', 'Nhlo', 'Mbi', 'Mab', 'Nkw', 'Nhla', 'Ntu', 'Ncw', 'Mpan', 'Mfu', 'Lwe', 'Mpal'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - - 'year' => 'okweminyaka engu-:count', // less reliable - 'y' => 'okweminyaka engu-:count', // less reliable - 'a_year' => 'okweminyaka engu-:count', // less reliable - - 'month' => 'inyanga ezingu-:count', - 'm' => 'inyanga ezingu-:count', - 'a_month' => 'inyanga ezingu-:count', - - 'week' => 'amaviki angu-:count', - 'w' => 'amaviki angu-:count', - 'a_week' => 'amaviki angu-:count', - - 'day' => 'kwamalanga angu-:count', - 'd' => 'kwamalanga angu-:count', - 'a_day' => 'kwamalanga angu-:count', - - 'hour' => 'amahola angu-:count', - 'h' => 'amahola angu-:count', - 'a_hour' => 'amahola angu-:count', - - 'minute' => 'imizuzu engu-:count', - 'min' => 'imizuzu engu-:count', - 'a_minute' => 'imizuzu engu-:count', - - 'second' => 'imizuzwana engu-:count', - 's' => 'imizuzwana engu-:count', - 'a_second' => 'imizuzwana engu-:count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nds.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nds.php deleted file mode 100644 index c0b3775..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nds.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nds_DE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nds_DE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nds_DE.php deleted file mode 100644 index a6c57a9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nds_DE.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Jannuaar', 'Feberwaar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], - 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], - 'weekdays' => ['Sünndag', 'Maandag', 'Dingsdag', 'Middeweek', 'Dunnersdag', 'Freedag', 'Sünnavend'], - 'weekdays_short' => ['Sdag', 'Maan', 'Ding', 'Midd', 'Dunn', 'Free', 'Svd.'], - 'weekdays_min' => ['Sd', 'Ma', 'Di', 'Mi', 'Du', 'Fr', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count Johr', - 'y' => ':countJ', - 'a_year' => '{1}een Johr|:count Johr', - - 'month' => ':count Maand', - 'm' => ':countM', - 'a_month' => '{1}een Maand|:count Maand', - - 'week' => ':count Week|:count Weken', - 'w' => ':countW', - 'a_week' => '{1}een Week|:count Week|:count Weken', - - 'day' => ':count Dag|:count Daag', - 'd' => ':countD', - 'a_day' => '{1}een Dag|:count Dag|:count Daag', - - 'hour' => ':count Stünn|:count Stünnen', - 'h' => ':countSt', - 'a_hour' => '{1}een Stünn|:count Stünn|:count Stünnen', - - 'minute' => ':count Minuut|:count Minuten', - 'min' => ':countm', - 'a_minute' => '{1}een Minuut|:count Minuut|:count Minuten', - - 'second' => ':count Sekunn|:count Sekunnen', - 's' => ':counts', - 'a_second' => 'en poor Sekunnen|:count Sekunn|:count Sekunnen', - - 'ago' => 'vör :time', - 'from_now' => 'in :time', - 'before' => ':time vörher', - 'after' => ':time later', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nds_NL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nds_NL.php deleted file mode 100644 index de2c57b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nds_NL.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Jaunuwoa', 'Februwoa', 'Moaz', 'Aprell', 'Mai', 'Juni', 'Juli', 'August', 'Septamba', 'Oktoba', 'Nowamba', 'Dezamba'], - 'months_short' => ['Jan', 'Feb', 'Moz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Now', 'Dez'], - 'weekdays' => ['Sinndag', 'Mondag', 'Dingsdag', 'Meddwäakj', 'Donnadag', 'Friedag', 'Sinnowend'], - 'weekdays_short' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'weekdays_min' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ne.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ne.php deleted file mode 100644 index d4caf0e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ne.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - nootanghimire - * - Josh Soref - * - Nj Subedi - * - JD Isaacks - */ -return [ - 'year' => 'एक बर्ष|:count बर्ष', - 'y' => ':count वर्ष', - 'month' => 'एक महिना|:count महिना', - 'm' => ':count महिना', - 'week' => ':count हप्ता', - 'w' => ':count हप्ता', - 'day' => 'एक दिन|:count दिन', - 'd' => ':count दिन', - 'hour' => 'एक घण्टा|:count घण्टा', - 'h' => ':count घण्टा', - 'minute' => 'एक मिनेट|:count मिनेट', - 'min' => ':count मिनेट', - 'second' => 'केही क्षण|:count सेकेण्ड', - 's' => ':count सेकेण्ड', - 'ago' => ':time अगाडि', - 'from_now' => ':timeमा', - 'after' => ':time पछि', - 'before' => ':time अघि', - 'diff_now' => 'अहिले', - 'diff_today' => 'आज', - 'diff_yesterday' => 'हिजो', - 'diff_tomorrow' => 'भोलि', - 'formats' => [ - 'LT' => 'Aको h:mm बजे', - 'LTS' => 'Aको h:mm:ss बजे', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, Aको h:mm बजे', - 'LLLL' => 'dddd, D MMMM YYYY, Aको h:mm बजे', - ], - 'calendar' => [ - 'sameDay' => '[आज] LT', - 'nextDay' => '[भोलि] LT', - 'nextWeek' => '[आउँदो] dddd[,] LT', - 'lastDay' => '[हिजो] LT', - 'lastWeek' => '[गएको] dddd[,] LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 3) { - return 'राति'; - } - if ($hour < 12) { - return 'बिहान'; - } - if ($hour < 16) { - return 'दिउँसो'; - } - if ($hour < 20) { - return 'साँझ'; - } - - return 'राति'; - }, - 'months' => ['जनवरी', 'फेब्रुवरी', 'मार्च', 'अप्रिल', 'मई', 'जुन', 'जुलाई', 'अगष्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], - 'months_short' => ['जन.', 'फेब्रु.', 'मार्च', 'अप्रि.', 'मई', 'जुन', 'जुलाई.', 'अग.', 'सेप्ट.', 'अक्टो.', 'नोभे.', 'डिसे.'], - 'weekdays' => ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'], - 'weekdays_short' => ['आइत.', 'सोम.', 'मङ्गल.', 'बुध.', 'बिहि.', 'शुक्र.', 'शनि.'], - 'weekdays_min' => ['आ.', 'सो.', 'मं.', 'बु.', 'बि.', 'शु.', 'श.'], - 'list' => [', ', ' र '], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ne_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ne_IN.php deleted file mode 100644 index f68d00e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ne_IN.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ne.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'yy/M/d', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D, h:mm a', - 'LLLL' => 'YYYY MMMM D, dddd, h:mm a', - ], - 'months' => ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], - 'months_short' => ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], - 'weekend' => [0, 0], - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ne_NP.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ne_NP.php deleted file mode 100644 index 27840c0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ne_NP.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ne.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nhn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nhn.php deleted file mode 100644 index 5a85831..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nhn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nhn_MX.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nhn_MX.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nhn_MX.php deleted file mode 100644 index 9db88a1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nhn_MX.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], - 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], - 'weekdays' => ['teoilhuitl', 'ceilhuitl', 'omeilhuitl', 'yeilhuitl', 'nahuilhuitl', 'macuililhuitl', 'chicuaceilhuitl'], - 'weekdays_short' => ['teo', 'cei', 'ome', 'yei', 'nau', 'mac', 'chi'], - 'weekdays_min' => ['teo', 'cei', 'ome', 'yei', 'nau', 'mac', 'chi'], - 'day_of_first_week_of_year' => 1, - - 'month' => ':count metztli', // less reliable - 'm' => ':count metztli', // less reliable - 'a_month' => ':count metztli', // less reliable - - 'week' => ':count tonalli', // less reliable - 'w' => ':count tonalli', // less reliable - 'a_week' => ':count tonalli', // less reliable - - 'day' => ':count tonatih', // less reliable - 'd' => ':count tonatih', // less reliable - 'a_day' => ':count tonatih', // less reliable - - 'minute' => ':count toltecayotl', // less reliable - 'min' => ':count toltecayotl', // less reliable - 'a_minute' => ':count toltecayotl', // less reliable - - 'second' => ':count ome', // less reliable - 's' => ':count ome', // less reliable - 'a_second' => ':count ome', // less reliable - - 'year' => ':count xihuitl', - 'y' => ':count xihuitl', - 'a_year' => ':count xihuitl', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/niu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/niu.php deleted file mode 100644 index bd9be8a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/niu.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/niu_NU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/niu_NU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/niu_NU.php deleted file mode 100644 index 6e7a697..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/niu_NU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RockET Systems Emani Fakaotimanava-Lui emani@niue.nu - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Ianuali', 'Fepuali', 'Masi', 'Apelila', 'Me', 'Iuni', 'Iulai', 'Aokuso', 'Sepetema', 'Oketopa', 'Novema', 'Tesemo'], - 'months_short' => ['Ian', 'Fep', 'Mas', 'Ape', 'Me', 'Iun', 'Iul', 'Aok', 'Sep', 'Oke', 'Nov', 'Tes'], - 'weekdays' => ['Aho Tapu', 'Aho Gofua', 'Aho Ua', 'Aho Lotu', 'Aho Tuloto', 'Aho Falaile', 'Aho Faiumu'], - 'weekdays_short' => ['Tapu', 'Gofua', 'Ua', 'Lotu', 'Tuloto', 'Falaile', 'Faiumu'], - 'weekdays_min' => ['Tapu', 'Gofua', 'Ua', 'Lotu', 'Tuloto', 'Falaile', 'Faiumu'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count tau', - 'y' => ':count tau', - 'a_year' => ':count tau', - - 'month' => ':count mahina', - 'm' => ':count mahina', - 'a_month' => ':count mahina', - - 'week' => ':count faahi tapu', - 'w' => ':count faahi tapu', - 'a_week' => ':count faahi tapu', - - 'day' => ':count aho', - 'd' => ':count aho', - 'a_day' => ':count aho', - - 'hour' => ':count e tulā', - 'h' => ':count e tulā', - 'a_hour' => ':count e tulā', - - 'minute' => ':count minuti', - 'min' => ':count minuti', - 'a_minute' => ':count minuti', - - 'second' => ':count sekone', - 's' => ':count sekone', - 'a_second' => ':count sekone', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl.php deleted file mode 100644 index 2d73770..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Roy - * - Stephan - * - François B - * - Tim Fish - * - Kevin Huang - * - Jacob Middag - * - JD Isaacks - * - Roy - * - Stephan - * - François B - * - Tim Fish - * - Jacob Middag - * - JD Isaacks - * - Propaganistas - * - MegaXLR - * - adriaanzon - * - MonkeyPhysics - * - JeroenG - * - RikSomers - * - proclame - * - Rik de Groot (hwdegroot) - */ -return [ - 'year' => ':count jaar|:count jaar', - 'a_year' => 'een jaar|:count jaar', - 'y' => ':countj', - 'month' => ':count maand|:count maanden', - 'a_month' => 'een maand|:count maanden', - 'm' => ':countmnd', - 'week' => ':count week|:count weken', - 'a_week' => 'een week|:count weken', - 'w' => ':countw', - 'day' => ':count dag|:count dagen', - 'a_day' => 'een dag|:count dagen', - 'd' => ':countd', - 'hour' => ':count uur|:count uur', - 'a_hour' => 'een uur|:count uur', - 'h' => ':countu', - 'minute' => ':count minuut|:count minuten', - 'a_minute' => 'een minuut|:count minuten', - 'min' => ':countmin', - 'second' => ':count seconde|:count seconden', - 'a_second' => 'een paar seconden|:count seconden', - 's' => ':counts', - 'ago' => ':time geleden', - 'from_now' => 'over :time', - 'after' => ':time later', - 'before' => ':time eerder', - 'diff_now' => 'nu', - 'diff_today' => 'vandaag', - 'diff_today_regexp' => 'vandaag(?:\\s+om)?', - 'diff_yesterday' => 'gisteren', - 'diff_yesterday_regexp' => 'gisteren(?:\\s+om)?', - 'diff_tomorrow' => 'morgen', - 'diff_tomorrow_regexp' => 'morgen(?:\\s+om)?', - 'diff_after_tomorrow' => 'overmorgen', - 'diff_before_yesterday' => 'eergisteren', - 'period_recurrences' => ':count keer', - 'period_interval' => function (string $interval = '') { - /** @var string $output */ - $output = preg_replace('/^(een|één|1)\s+/u', '', $interval); - - if (preg_match('/^(een|één|1)( jaar|j| uur|u)/u', $interval)) { - return "elk $output"; - } - - return "elke $output"; - }, - 'period_start_date' => 'van :date', - 'period_end_date' => 'tot :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD-MM-YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[vandaag om] LT', - 'nextDay' => '[morgen om] LT', - 'nextWeek' => 'dddd [om] LT', - 'lastDay' => '[gisteren om] LT', - 'lastWeek' => '[afgelopen] dddd [om] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); - }, - 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'mmm_suffix' => '.', - 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], - 'weekdays_short' => ['zo.', 'ma.', 'di.', 'wo.', 'do.', 'vr.', 'za.'], - 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' en '], - 'meridiem' => ['\'s ochtends', '\'s middags'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_AW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_AW.php deleted file mode 100644 index 5ec136d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_AW.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/nl.php', [ - 'formats' => [ - 'L' => 'DD-MM-YY', - ], - 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], - 'weekdays_short' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_BE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_BE.php deleted file mode 100644 index 037f5b4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_BE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Roy - * - Stephan - * - François B - * - Tim Fish - * - Kevin Huang - * - Jacob Middag - * - JD Isaacks - * - Propaganistas - */ -return array_replace_recursive(require __DIR__.'/nl.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_BQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_BQ.php deleted file mode 100644 index c269197..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_BQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_CW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_CW.php deleted file mode 100644 index c269197..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_CW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_NL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_NL.php deleted file mode 100644 index 14e4853..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_NL.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/nl.php', [ - 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], - 'weekdays_short' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_SR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_SR.php deleted file mode 100644 index c269197..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_SR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_SX.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nl_SX.php deleted file mode 100644 index c269197..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nl_SX.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nmg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nmg.php deleted file mode 100644 index 4d1df6e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nmg.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['maná', 'kugú'], - 'weekdays' => ['sɔ́ndɔ', 'mɔ́ndɔ', 'sɔ́ndɔ mafú mába', 'sɔ́ndɔ mafú málal', 'sɔ́ndɔ mafú mána', 'mabágá má sukul', 'sásadi'], - 'weekdays_short' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'], - 'weekdays_min' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'], - 'months' => ['ngwɛn matáhra', 'ngwɛn ńmba', 'ngwɛn ńlal', 'ngwɛn ńna', 'ngwɛn ńtan', 'ngwɛn ńtuó', 'ngwɛn hɛmbuɛrí', 'ngwɛn lɔmbi', 'ngwɛn rɛbvuâ', 'ngwɛn wum', 'ngwɛn wum navǔr', 'krísimin'], - 'months_short' => ['ng1', 'ng2', 'ng3', 'ng4', 'ng5', 'ng6', 'ng7', 'ng8', 'ng9', 'ng10', 'ng11', 'kris'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nn.php deleted file mode 100644 index 041f7b2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nn.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Alexander Tømmerås - * - Øystein - * - JD Isaacks - * - Gaute Hvoslef Kvalnes (gaute) - */ -return [ - 'year' => ':count år', - 'a_year' => 'eit år|:count år', - 'y' => ':count år', - 'month' => ':count månad|:count månader', - 'a_month' => 'ein månad|:count månader', - 'm' => ':count md', - 'week' => ':count veke|:count veker', - 'a_week' => 'ei veke|:count veker', - 'w' => ':countv', - 'day' => ':count dag|:count dagar', - 'a_day' => 'ein dag|:count dagar', - 'd' => ':countd', - 'hour' => ':count time|:count timar', - 'a_hour' => 'ein time|:count timar', - 'h' => ':countt', - 'minute' => ':count minutt', - 'a_minute' => 'eit minutt|:count minutt', - 'min' => ':countm', - 'second' => ':count sekund', - 'a_second' => 'nokre sekund|:count sekund', - 's' => ':counts', - 'ago' => ':time sidan', - 'from_now' => 'om :time', - 'after' => ':time etter', - 'before' => ':time før', - 'diff_today' => 'I dag', - 'diff_yesterday' => 'I går', - 'diff_yesterday_regexp' => 'I går(?:\\s+klokka)?', - 'diff_tomorrow' => 'I morgon', - 'diff_tomorrow_regexp' => 'I morgon(?:\\s+klokka)?', - 'diff_today_regexp' => 'I dag(?:\\s+klokka)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY [kl.] H:mm', - 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[I dag klokka] LT', - 'nextDay' => '[I morgon klokka] LT', - 'nextWeek' => 'dddd [klokka] LT', - 'lastDay' => '[I går klokka] LT', - 'lastWeek' => '[Føregåande] dddd [klokka] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], - 'weekdays' => ['sundag', 'måndag', 'tysdag', 'onsdag', 'torsdag', 'fredag', 'laurdag'], - 'weekdays_short' => ['sun', 'mån', 'tys', 'ons', 'tor', 'fre', 'lau'], - 'weekdays_min' => ['su', 'må', 'ty', 'on', 'to', 'fr', 'la'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' og '], - 'meridiem' => ['f.m.', 'e.m.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nn_NO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nn_NO.php deleted file mode 100644 index 8e16871..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nn_NO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/nn.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nnh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nnh.php deleted file mode 100644 index 007d239..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nnh.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['mbaʼámbaʼ', 'ncwònzém'], - 'weekdays' => null, - 'weekdays_short' => ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'], - 'weekdays_min' => null, - 'months' => null, - 'months_short' => ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => '[lyɛ]̌ʼ d [na] MMMM, YYYY HH:mm', - 'LLLL' => 'dddd , [lyɛ]̌ʼ d [na] MMMM, YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/no.php b/dependencies/nesbot/carbon/src/Carbon/Lang/no.php deleted file mode 100644 index f4497c7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/no.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Daniel S. Billing - * - Paul - * - Jimmie Johansson - * - Jens Herlevsen - */ -return array_replace_recursive(require __DIR__.'/nb.php', [ - 'formats' => [ - 'LLL' => 'D. MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D. MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'nextWeek' => 'på dddd [kl.] LT', - 'lastWeek' => '[i] dddd[s kl.] LT', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nr.php deleted file mode 100644 index 1bc999f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nr.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nr_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nr_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nr_ZA.php deleted file mode 100644 index f9a7be8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nr_ZA.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Janabari', 'uFeberbari', 'uMatjhi', 'u-Apreli', 'Meyi', 'Juni', 'Julayi', 'Arhostosi', 'Septemba', 'Oktoba', 'Usinyikhaba', 'Disemba'], - 'months_short' => ['Jan', 'Feb', 'Mat', 'Apr', 'Mey', 'Jun', 'Jul', 'Arh', 'Sep', 'Okt', 'Usi', 'Dis'], - 'weekdays' => ['uSonto', 'uMvulo', 'uLesibili', 'lesithathu', 'uLesine', 'ngoLesihlanu', 'umGqibelo'], - 'weekdays_short' => ['Son', 'Mvu', 'Bil', 'Tha', 'Ne', 'Hla', 'Gqi'], - 'weekdays_min' => ['Son', 'Mvu', 'Bil', 'Tha', 'Ne', 'Hla', 'Gqi'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nso.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nso.php deleted file mode 100644 index 2a6cabb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nso.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/nso_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nso_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nso_ZA.php deleted file mode 100644 index b08fe6d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nso_ZA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Janaware', 'Febereware', 'Matšhe', 'Aprele', 'Mei', 'June', 'Julae', 'Agostose', 'Setemere', 'Oktobere', 'Nofemere', 'Disemere'], - 'months_short' => ['Jan', 'Feb', 'Mat', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Set', 'Okt', 'Nof', 'Dis'], - 'weekdays' => ['LaMorena', 'Mošupologo', 'Labobedi', 'Laboraro', 'Labone', 'Labohlano', 'Mokibelo'], - 'weekdays_short' => ['Son', 'Moš', 'Bed', 'Rar', 'Ne', 'Hla', 'Mok'], - 'weekdays_min' => ['Son', 'Moš', 'Bed', 'Rar', 'Ne', 'Hla', 'Mok'], - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ngwaga', - 'y' => ':count ngwaga', - 'a_year' => ':count ngwaga', - - 'month' => ':count Kgwedi', - 'm' => ':count Kgwedi', - 'a_month' => ':count Kgwedi', - - 'week' => ':count Beke', - 'w' => ':count Beke', - 'a_week' => ':count Beke', - - 'day' => ':count Letšatši', - 'd' => ':count Letšatši', - 'a_day' => ':count Letšatši', - - 'hour' => ':count Iri', - 'h' => ':count Iri', - 'a_hour' => ':count Iri', - - 'minute' => ':count Motsotso', - 'min' => ':count Motsotso', - 'a_minute' => ':count Motsotso', - - 'second' => ':count motsotswana', - 's' => ':count motsotswana', - 'a_second' => ':count motsotswana', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nus.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nus.php deleted file mode 100644 index 789bc39..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nus.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['RW', 'TŊ'], - 'weekdays' => ['Cäŋ kuɔth', 'Jiec la̱t', 'Rɛw lätni', 'Diɔ̱k lätni', 'Ŋuaan lätni', 'Dhieec lätni', 'Bäkɛl lätni'], - 'weekdays_short' => ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'], - 'weekdays_min' => ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'], - 'months' => ['Tiop thar pɛt', 'Pɛt', 'Duɔ̱ɔ̱ŋ', 'Guak', 'Duät', 'Kornyoot', 'Pay yie̱tni', 'Tho̱o̱r', 'Tɛɛr', 'Laath', 'Kur', 'Tio̱p in di̱i̱t'], - 'months_short' => ['Tiop', 'Pɛt', 'Duɔ̱ɔ̱', 'Guak', 'Duä', 'Kor', 'Pay', 'Thoo', 'Tɛɛ', 'Laa', 'Kur', 'Tid'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd D MMMM YYYY h:mm a', - ], - - 'year' => ':count jiök', // less reliable - 'y' => ':count jiök', // less reliable - 'a_year' => ':count jiök', // less reliable - - 'month' => ':count pay', // less reliable - 'm' => ':count pay', // less reliable - 'a_month' => ':count pay', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/nyn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/nyn.php deleted file mode 100644 index 8660ea4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/nyn.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'], - 'weekdays_short' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'weekdays_min' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], - 'months' => ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'], - 'months_short' => ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/oc.php b/dependencies/nesbot/carbon/src/Carbon/Lang/oc.php deleted file mode 100644 index c9411d6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/oc.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Quentí - */ -// @codeCoverageIgnoreStart -use Symfony\Component\Translation\PluralizationRules; - -if (class_exists('Symfony\\Component\\Translation\\PluralizationRules')) { - PluralizationRules::set(static function ($number) { - return $number == 1 ? 0 : 1; - }, 'oc'); -} -// @codeCoverageIgnoreEnd - -return [ - 'year' => ':count an|:count ans', - 'a_year' => 'un an|:count ans', - 'y' => ':count an|:count ans', - 'month' => ':count mes|:count meses', - 'a_month' => 'un mes|:count meses', - 'm' => ':count mes|:count meses', - 'week' => ':count setmana|:count setmanas', - 'a_week' => 'una setmana|:count setmanas', - 'w' => ':count setmana|:count setmanas', - 'day' => ':count jorn|:count jorns', - 'a_day' => 'un jorn|:count jorns', - 'd' => ':count jorn|:count jorns', - 'hour' => ':count ora|:count oras', - 'a_hour' => 'una ora|:count oras', - 'h' => ':count ora|:count oras', - 'minute' => ':count minuta|:count minutas', - 'a_minute' => 'una minuta|:count minutas', - 'min' => ':count minuta|:count minutas', - 'second' => ':count segonda|:count segondas', - 'a_second' => 'una segonda|:count segondas', - 's' => ':count segonda|:count segondas', - 'ago' => 'fa :time', - 'from_now' => 'd\'aquí :time', - 'after' => ':time aprèp', - 'before' => ':time abans', - 'diff_now' => 'ara meteis', - 'diff_today' => 'Uèi', - 'diff_today_regexp' => 'Uèi(?:\\s+a)?', - 'diff_yesterday' => 'ièr', - 'diff_yesterday_regexp' => 'Ièr(?:\\s+a)?', - 'diff_tomorrow' => 'deman', - 'diff_tomorrow_regexp' => 'Deman(?:\\s+a)?', - 'diff_before_yesterday' => 'ièr delà', - 'diff_after_tomorrow' => 'deman passat', - 'period_recurrences' => ':count còp|:count còps', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'fins a :date', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM [de] YYYY', - 'LLL' => 'D MMMM [de] YYYY [a] H:mm', - 'LLLL' => 'dddd D MMMM [de] YYYY [a] H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Uèi a] LT', - 'nextDay' => '[Deman a] LT', - 'nextWeek' => 'dddd [a] LT', - 'lastDay' => '[Ièr a] LT', - 'lastWeek' => 'dddd [passat a] LT', - 'sameElse' => 'L', - ], - 'months' => ['de genièr', 'de febrièr', 'de març', 'd\'abrial', 'de mai', 'de junh', 'de julhet', 'd\'agost', 'de setembre', 'd’octòbre', 'de novembre', 'de decembre'], - 'months_standalone' => ['genièr', 'febrièr', 'març', 'abrial', 'mai', 'junh', 'julh', 'agost', 'setembre', 'octòbre', 'novembre', 'decembre'], - 'months_short' => ['gen.', 'feb.', 'març', 'abr.', 'mai', 'junh', 'julh', 'ago.', 'sep.', 'oct.', 'nov.', 'dec.'], - 'weekdays' => ['dimenge', 'diluns', 'dimars', 'dimècres', 'dijòus', 'divendres', 'dissabte'], - 'weekdays_short' => ['dg', 'dl', 'dm', 'dc', 'dj', 'dv', 'ds'], - 'weekdays_min' => ['dg', 'dl', 'dm', 'dc', 'dj', 'dv', 'ds'], - 'ordinal' => function ($number, string $period = '') { - $ordinal = [1 => 'èr', 2 => 'nd'][(int) $number] ?? 'en'; - - // feminine for year, week, hour, minute, second - if (preg_match('/^[yYwWhHgGis]$/', $period)) { - $ordinal .= 'a'; - } - - return $number.$ordinal; - }, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/oc_FR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/oc_FR.php deleted file mode 100644 index 01eb5c1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/oc_FR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/oc.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/om.php b/dependencies/nesbot/carbon/src/Carbon/Lang/om.php deleted file mode 100644 index b8d5a0b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/om.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation & Sagalee Oromoo Publishing Co. Inc. locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'dd-MMM-YYYY', - 'LLL' => 'dd MMMM YYYY HH:mm', - 'LLLL' => 'dddd, MMMM D, YYYY HH:mm', - ], - 'months' => ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'], - 'months_short' => ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'], - 'weekdays' => ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'], - 'weekdays_short' => ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'], - 'weekdays_min' => ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['WD', 'WB'], - - 'year' => 'wggoota :count', - 'y' => 'wggoota :count', - 'a_year' => 'wggoota :count', - - 'month' => 'ji’a :count', - 'm' => 'ji’a :count', - 'a_month' => 'ji’a :count', - - 'week' => 'torban :count', - 'w' => 'torban :count', - 'a_week' => 'torban :count', - - 'day' => 'guyyaa :count', - 'd' => 'guyyaa :count', - 'a_day' => 'guyyaa :count', - - 'hour' => 'saʼaatii :count', - 'h' => 'saʼaatii :count', - 'a_hour' => 'saʼaatii :count', - - 'minute' => 'daqiiqaa :count', - 'min' => 'daqiiqaa :count', - 'a_minute' => 'daqiiqaa :count', - - 'second' => 'sekoondii :count', - 's' => 'sekoondii :count', - 'a_second' => 'sekoondii :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/om_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/om_ET.php deleted file mode 100644 index 044760e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/om_ET.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/om.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/om_KE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/om_KE.php deleted file mode 100644 index f5a4d1c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/om_KE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/om.php', [ - 'day_of_first_week_of_year' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/or.php b/dependencies/nesbot/carbon/src/Carbon/Lang/or.php deleted file mode 100644 index 3aa7173..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/or.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/or_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/or_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/or_IN.php deleted file mode 100644 index 57a89f5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/or_IN.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM AP Linux Technology Center, Yamato Software Laboratory bug-glibc@gnu.org - */ -return [ - 'diff_now' => 'ବର୍ତ୍ତମାନ', - 'diff_yesterday' => 'ଗତକାଲି', - 'diff_tomorrow' => 'ଆସନ୍ତାକାଲି', - 'formats' => [ - 'LT' => 'Oh:Om A', - 'LTS' => 'Oh:Om:Os A', - 'L' => 'OD-OM-OY', - 'LL' => 'OD MMMM OY', - 'LLL' => 'OD MMMM OY Oh:Om A', - 'LLLL' => 'dddd OD MMMM OY Oh:Om A', - ], - 'months' => ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'], - 'months_short' => ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'], - 'weekdays' => ['ରବିବାର', 'ସୋମବାର', 'ମଙ୍ଗଳବାର', 'ବୁଧବାର', 'ଗୁରୁବାର', 'ଶୁକ୍ରବାର', 'ଶନିବାର'], - 'weekdays_short' => ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'], - 'weekdays_min' => ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'], - 'day_of_first_week_of_year' => 1, - 'alt_numbers' => ['୦', '୧', '୨', '୩', '୪', '୫', '୬', '୭', '୮', '୯', '୧୦', '୧୧', '୧୨', '୧୩', '୧୪', '୧୫', '୧୬', '୧୭', '୧୮', '୧୯', '୨୦', '୨୧', '୨୨', '୨୩', '୨୪', '୨୫', '୨୬', '୨୭', '୨୮', '୨୯', '୩୦', '୩୧', '୩୨', '୩୩', '୩୪', '୩୫', '୩୬', '୩୭', '୩୮', '୩୯', '୪୦', '୪୧', '୪୨', '୪୩', '୪୪', '୪୫', '୪୬', '୪୭', '୪୮', '୪୯', '୫୦', '୫୧', '୫୨', '୫୩', '୫୪', '୫୫', '୫୬', '୫୭', '୫୮', '୫୯', '୬୦', '୬୧', '୬୨', '୬୩', '୬୪', '୬୫', '୬୬', '୬୭', '୬୮', '୬୯', '୭୦', '୭୧', '୭୨', '୭୩', '୭୪', '୭୫', '୭୬', '୭୭', '୭୮', '୭୯', '୮୦', '୮୧', '୮୨', '୮୩', '୮୪', '୮୫', '୮୬', '୮୭', '୮୮', '୮୯', '୯୦', '୯୧', '୯୨', '୯୩', '୯୪', '୯୫', '୯୬', '୯୭', '୯୮', '୯୯'], - 'year' => ':count ବର୍ଷ', - 'y' => ':count ବ.', - 'month' => ':count ମାସ', - 'm' => ':count ମା.', - 'week' => ':count ସପ୍ତାହ', - 'w' => ':count ସପ୍ତା.', - 'day' => ':count ଦିନ', - 'd' => ':count ଦିନ', - 'hour' => ':count ଘଣ୍ତ', - 'h' => ':count ଘ.', - 'minute' => ':count ମିନଟ', - 'min' => ':count ମି.', - 'second' => ':count ସେକଣ୍ଢ', - 's' => ':count ସେ.', - 'ago' => ':time ପୂର୍ବେ', - 'from_now' => ':timeରେ', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/os.php b/dependencies/nesbot/carbon/src/Carbon/Lang/os.php deleted file mode 100644 index 5f55e8a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/os.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/os_RU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/os_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/os_RU.php deleted file mode 100644 index 9592d15..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/os_RU.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['январы', 'февралы', 'мартъийы', 'апрелы', 'майы', 'июны', 'июлы', 'августы', 'сентябры', 'октябры', 'ноябры', 'декабры'], - 'months_short' => ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], - 'weekdays' => ['Хуыцаубон', 'Къуырисæр', 'Дыццæг', 'Æртыццæг', 'Цыппæрæм', 'Майрæмбон', 'Сабат'], - 'weekdays_short' => ['Хцб', 'Крс', 'Дцг', 'Æрт', 'Цпр', 'Мрб', 'Сбт'], - 'weekdays_min' => ['Хцб', 'Крс', 'Дцг', 'Æрт', 'Цпр', 'Мрб', 'Сбт'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'minute' => ':count гыццыл', // less reliable - 'min' => ':count гыццыл', // less reliable - 'a_minute' => ':count гыццыл', // less reliable - - 'second' => ':count æндæр', // less reliable - 's' => ':count æндæр', // less reliable - 'a_second' => ':count æндæр', // less reliable - - 'year' => ':count аз', - 'y' => ':count аз', - 'a_year' => ':count аз', - - 'month' => ':count мӕй', - 'm' => ':count мӕй', - 'a_month' => ':count мӕй', - - 'week' => ':count къуыри', - 'w' => ':count къуыри', - 'a_week' => ':count къуыри', - - 'day' => ':count бон', - 'd' => ':count бон', - 'a_day' => ':count бон', - - 'hour' => ':count сахат', - 'h' => ':count сахат', - 'a_hour' => ':count сахат', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pa.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pa.php deleted file mode 100644 index 48b2033..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pa.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - Punjab - */ -return [ - 'year' => 'ਇੱਕ ਸਾਲ|:count ਸਾਲ', - 'month' => 'ਇੱਕ ਮਹੀਨਾ|:count ਮਹੀਨੇ', - 'week' => 'ਹਫਤਾ|:count ਹਫ਼ਤੇ', - 'day' => 'ਇੱਕ ਦਿਨ|:count ਦਿਨ', - 'hour' => 'ਇੱਕ ਘੰਟਾ|:count ਘੰਟੇ', - 'minute' => 'ਇਕ ਮਿੰਟ|:count ਮਿੰਟ', - 'second' => 'ਕੁਝ ਸਕਿੰਟ|:count ਸਕਿੰਟ', - 'ago' => ':time ਪਹਿਲਾਂ', - 'from_now' => ':time ਵਿੱਚ', - 'before' => ':time ਤੋਂ ਪਹਿਲਾਂ', - 'after' => ':time ਤੋਂ ਬਾਅਦ', - 'diff_now' => 'ਹੁਣ', - 'diff_today' => 'ਅਜ', - 'diff_yesterday' => 'ਕਲ', - 'diff_tomorrow' => 'ਕਲ', - 'formats' => [ - 'LT' => 'A h:mm ਵਜੇ', - 'LTS' => 'A h:mm:ss ਵਜੇ', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm ਵਜੇ', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm ਵਜੇ', - ], - 'calendar' => [ - 'sameDay' => '[ਅਜ] LT', - 'nextDay' => '[ਕਲ] LT', - 'nextWeek' => '[ਅਗਲਾ] dddd, LT', - 'lastDay' => '[ਕਲ] LT', - 'lastWeek' => '[ਪਿਛਲੇ] dddd, LT', - 'sameElse' => 'L', - ], - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'ਰਾਤ'; - } - if ($hour < 10) { - return 'ਸਵੇਰ'; - } - if ($hour < 17) { - return 'ਦੁਪਹਿਰ'; - } - if ($hour < 20) { - return 'ਸ਼ਾਮ'; - } - - return 'ਰਾਤ'; - }, - 'months' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], - 'months_short' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], - 'weekdays' => ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨੀਚਰਵਾਰ'], - 'weekdays_short' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁਧ', 'ਵੀਰ', 'ਸ਼ੁਕਰ', 'ਸ਼ਨੀ'], - 'weekdays_min' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁਧ', 'ਵੀਰ', 'ਸ਼ੁਕਰ', 'ਸ਼ਨੀ'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ਅਤੇ '], - 'weekend' => [0, 0], - 'alt_numbers' => ['੦', '੧', '੨', '੩', '੪', '੫', '੬', '੭', '੮', '੯'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_Arab.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pa_Arab.php deleted file mode 100644 index 39b0653..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_Arab.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ur.php', [ - 'weekdays' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], - 'weekdays_short' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], - 'weekdays_min' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], - 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, DD MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_Guru.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pa_Guru.php deleted file mode 100644 index 7adff5c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_Guru.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/pa.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D/M/yy', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY, h:mm a', - ], - 'months' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], - 'months_short' => ['ਜਨ', 'ਫ਼ਰ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾ', 'ਅਗ', 'ਸਤੰ', 'ਅਕਤੂ', 'ਨਵੰ', 'ਦਸੰ'], - 'weekdays' => ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁੱਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨਿੱਚਰਵਾਰ'], - 'weekdays_short' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕਰ', 'ਸ਼ਨਿੱਚਰ'], - 'weekdays_min' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕ', 'ਸ਼ਨਿੱ'], - 'weekend' => [0, 0], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pa_IN.php deleted file mode 100644 index ca67642..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_IN.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Guo Xiang Tan - * - Josh Soref - * - Ash - * - harpreetkhalsagtbit - */ -return require __DIR__.'/pa.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_PK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pa_PK.php deleted file mode 100644 index f9af11c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pa_PK.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['جنوري', 'فروري', 'مارچ', 'اپريل', 'مٓی', 'جون', 'جولاي', 'اگست', 'ستمبر', 'اكتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوري', 'فروري', 'مارچ', 'اپريل', 'مٓی', 'جون', 'جولاي', 'اگست', 'ستمبر', 'اكتوبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_short' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_min' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ص', 'ش'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pap.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pap.php deleted file mode 100644 index b4c1706..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pap.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return [ - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm:ss', - 'L' => 'DD-MM-YY', - 'LL' => 'MMMM [di] DD, YYYY', - 'LLL' => 'DD MMM HH.mm', - 'LLLL' => 'MMMM DD, YYYY HH.mm', - ], - 'months' => ['yanüari', 'febrüari', 'mart', 'aprel', 'mei', 'yüni', 'yüli', 'ougùstùs', 'sèptèmber', 'oktober', 'novèmber', 'desèmber'], - 'months_short' => ['yan', 'feb', 'mar', 'apr', 'mei', 'yün', 'yül', 'oug', 'sèp', 'okt', 'nov', 'des'], - 'weekdays' => ['djadomingo', 'djaluna', 'djamars', 'djawebs', 'djarason', 'djabierne', 'djasabra'], - 'weekdays_short' => ['do', 'lu', 'ma', 'we', 'ra', 'bi', 'sa'], - 'weekdays_min' => ['do', 'lu', 'ma', 'we', 'ra', 'bi', 'sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'year' => ':count aña', - 'month' => ':count luna', - 'week' => ':count siman', - 'day' => ':count dia', - 'hour' => ':count ora', - 'minute' => ':count minüt', - 'second' => ':count sekònde', - 'list' => [', ', ' i '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pap_AW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pap_AW.php deleted file mode 100644 index e9a48ff..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pap_AW.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from native speaker Pablo Saratxaga pablo@mandrakesoft.com - */ -return require __DIR__.'/pap.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pap_CW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pap_CW.php deleted file mode 100644 index e9a48ff..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pap_CW.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - information from native speaker Pablo Saratxaga pablo@mandrakesoft.com - */ -return require __DIR__.'/pap.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pl.php deleted file mode 100644 index b720535..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pl.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Wacław Jacek - * - François B - * - Tim Fish - * - Serhan Apaydın - * - Massimiliano Caniparoli - * - JD Isaacks - * - Jakub Szwacz - * - Jan - * - Paul - * - damlys - * - Marek (marast78) - * - Peter (UnrulyNatives) - * - Qrzysio - * - Jan (aso824) - * - diverpl - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count rok|:count lata|:count lat', - 'a_year' => 'rok|:count lata|:count lat', - 'y' => ':count r|:count l|:count l', - 'month' => ':count miesiąc|:count miesiące|:count miesięcy', - 'a_month' => 'miesiąc|:count miesiące|:count miesięcy', - 'm' => ':count mies.', - 'week' => ':count tydzień|:count tygodnie|:count tygodni', - 'a_week' => 'tydzień|:count tygodnie|:count tygodni', - 'w' => ':count tyg.', - 'day' => ':count dzień|:count dni|:count dni', - 'a_day' => 'dzień|:count dni|:count dni', - 'd' => ':count d', - 'hour' => ':count godzina|:count godziny|:count godzin', - 'a_hour' => 'godzina|:count godziny|:count godzin', - 'h' => ':count godz.', - 'minute' => ':count minuta|:count minuty|:count minut', - 'a_minute' => 'minuta|:count minuty|:count minut', - 'min' => ':count min', - 'second' => ':count sekunda|:count sekundy|:count sekund', - 'a_second' => '{1}kilka sekund|:count sekunda|:count sekundy|:count sekund', - 's' => ':count sek.', - 'ago' => ':time temu', - 'from_now' => static function ($time) { - return 'za '.strtr($time, [ - 'godzina' => 'godzinę', - 'minuta' => 'minutę', - 'sekunda' => 'sekundę', - ]); - }, - 'after' => ':time po', - 'before' => ':time przed', - 'diff_now' => 'teraz', - 'diff_today' => 'Dziś', - 'diff_today_regexp' => 'Dziś(?:\\s+o)?', - 'diff_yesterday' => 'wczoraj', - 'diff_yesterday_regexp' => 'Wczoraj(?:\\s+o)?', - 'diff_tomorrow' => 'jutro', - 'diff_tomorrow_regexp' => 'Jutro(?:\\s+o)?', - 'diff_before_yesterday' => 'przedwczoraj', - 'diff_after_tomorrow' => 'pojutrze', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Dziś o] LT', - 'nextDay' => '[Jutro o] LT', - 'nextWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[W niedzielę o] LT'; - case 2: - return '[We wtorek o] LT'; - case 3: - return '[W środę o] LT'; - case 6: - return '[W sobotę o] LT'; - default: - return '[W] dddd [o] LT'; - } - }, - 'lastDay' => '[Wczoraj o] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[W zeszłą niedzielę o] LT'; - case 3: - return '[W zeszłą środę o] LT'; - case 6: - return '[W zeszłą sobotę o] LT'; - default: - return '[W zeszły] dddd [o] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia'], - 'months_standalone' => ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'], - 'months_short' => ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'], - 'weekdays_short' => ['ndz', 'pon', 'wt', 'śr', 'czw', 'pt', 'sob'], - 'weekdays_min' => ['Nd', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' i '], - 'meridiem' => ['przed południem', 'po południu'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pl_PL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pl_PL.php deleted file mode 100644 index 222bcdb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pl_PL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/prg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/prg.php deleted file mode 100644 index 6e63f4a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/prg.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => ':count meta', - 'y' => ':count meta', - 'a_year' => ':count meta', - - 'month' => ':count mēniks', // less reliable - 'm' => ':count mēniks', // less reliable - 'a_month' => ':count mēniks', // less reliable - - 'week' => ':count sawaītin', // less reliable - 'w' => ':count sawaītin', // less reliable - 'a_week' => ':count sawaītin', // less reliable - - 'day' => ':count di', - 'd' => ':count di', - 'a_day' => ':count di', - - 'hour' => ':count bruktēt', // less reliable - 'h' => ':count bruktēt', // less reliable - 'a_hour' => ':count bruktēt', // less reliable - - 'minute' => ':count līkuts', // less reliable - 'min' => ':count līkuts', // less reliable - 'a_minute' => ':count līkuts', // less reliable - - 'second' => ':count kitan', // less reliable - 's' => ':count kitan', // less reliable - 'a_second' => ':count kitan', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ps.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ps.php deleted file mode 100644 index a928b28..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ps.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Muhammad Nasir Rahimi - * - Nassim Nasibullah (spinzar) - */ -return [ - 'year' => ':count کال|:count کاله', - 'y' => ':countکال|:countکاله', - 'month' => ':count مياشت|:count مياشتي', - 'm' => ':countمياشت|:countمياشتي', - 'week' => ':count اونۍ|:count اونۍ', - 'w' => ':countاونۍ|:countاونۍ', - 'day' => ':count ورځ|:count ورځي', - 'd' => ':countورځ|:countورځي', - 'hour' => ':count ساعت|:count ساعته', - 'h' => ':countساعت|:countساعته', - 'minute' => ':count دقيقه|:count دقيقې', - 'min' => ':countدقيقه|:countدقيقې', - 'second' => ':count ثانيه|:count ثانيې', - 's' => ':countثانيه|:countثانيې', - 'ago' => ':time دمخه', - 'from_now' => ':time له اوس څخه', - 'after' => ':time وروسته', - 'before' => ':time دمخه', - 'list' => ['، ', ' او '], - 'meridiem' => ['غ.م.', 'غ.و.'], - 'weekdays' => ['اتوار', 'ګل', 'نهه', 'شورو', 'زيارت', 'جمعه', 'خالي'], - 'weekdays_short' => ['ا', 'ګ', 'ن', 'ش', 'ز', 'ج', 'خ'], - 'weekdays_min' => ['ا', 'ګ', 'ن', 'ش', 'ز', 'ج', 'خ'], - 'months' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_standalone' => ['جنوري', 'فېبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short_standalone' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'first_day_of_week' => 6, - 'weekend' => [4, 5], - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'YYYY/M/d', - 'LL' => 'YYYY MMM D', - 'LLL' => 'د YYYY د MMMM D H:mm', - 'LLLL' => 'dddd د YYYY د MMMM D H:mm', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ps_AF.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ps_AF.php deleted file mode 100644 index 6ec5180..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ps_AF.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ps.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt.php deleted file mode 100644 index bb6359b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Cassiano Montanari - * - Matt Pope - * - François B - * - Prodis - * - JD Isaacks - * - Raphael Amorim - * - João Magalhães - * - victortobias - * - Paulo Freitas - * - Sebastian Thierer - * - Claudson Martins (claudsonm) - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count ano|:count anos', - 'a_year' => 'um ano|:count anos', - 'y' => ':counta', - 'month' => ':count mês|:count meses', - 'a_month' => 'um mês|:count meses', - 'm' => ':countm', - 'week' => ':count semana|:count semanas', - 'a_week' => 'uma semana|:count semanas', - 'w' => ':countsem', - 'day' => ':count dia|:count dias', - 'a_day' => 'um dia|:count dias', - 'd' => ':countd', - 'hour' => ':count hora|:count horas', - 'a_hour' => 'uma hora|:count horas', - 'h' => ':counth', - 'minute' => ':count minuto|:count minutos', - 'a_minute' => 'um minuto|:count minutos', - 'min' => ':countmin', - 'second' => ':count segundo|:count segundos', - 'a_second' => 'alguns segundos|:count segundos', - 's' => ':counts', - 'millisecond' => ':count milissegundo|:count milissegundos', - 'a_millisecond' => 'um milissegundo|:count milissegundos', - 'ms' => ':countms', - 'microsecond' => ':count microssegundo|:count microssegundos', - 'a_microsecond' => 'um microssegundo|:count microssegundos', - 'µs' => ':countµs', - 'ago' => 'há :time', - 'from_now' => 'em :time', - 'after' => ':time depois', - 'before' => ':time antes', - 'diff_now' => 'agora', - 'diff_today' => 'Hoje', - 'diff_today_regexp' => 'Hoje(?:\\s+às)?', - 'diff_yesterday' => 'ontem', - 'diff_yesterday_regexp' => 'Ontem(?:\\s+às)?', - 'diff_tomorrow' => 'amanhã', - 'diff_tomorrow_regexp' => 'Amanhã(?:\\s+às)?', - 'diff_before_yesterday' => 'anteontem', - 'diff_after_tomorrow' => 'depois de amanhã', - 'period_recurrences' => 'uma vez|:count vezes', - 'period_interval' => 'cada :interval', - 'period_start_date' => 'de :date', - 'period_end_date' => 'até :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D [de] MMMM [de] YYYY', - 'LLL' => 'D [de] MMMM [de] YYYY HH:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hoje às] LT', - 'nextDay' => '[Amanhã às] LT', - 'nextWeek' => 'dddd [às] LT', - 'lastDay' => '[Ontem às] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - case 6: - return '[Último] dddd [às] LT'; - default: - return '[Última] dddd [às] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], - 'months_short' => ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'], - 'weekdays' => ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'], - 'weekdays_short' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], - 'weekdays_min' => ['Do', '2ª', '3ª', '4ª', '5ª', '6ª', 'Sá'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' e '], - 'ordinal_words' => [ - 'of' => 'de', - 'first' => 'primeira', - 'second' => 'segunda', - 'third' => 'terceira', - 'fourth' => 'quarta', - 'fifth' => 'quinta', - 'last' => 'última', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_AO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_AO.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_AO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_BR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_BR.php deleted file mode 100644 index e917c5c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_BR.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Cassiano Montanari - * - Eduardo Dalla Vecchia - * - David Rodrigues - * - Matt Pope - * - François B - * - Prodis - * - Marlon Maxwel - * - JD Isaacks - * - Raphael Amorim - * - Rafael Raupp - * - felipeleite1 - * - swalker - * - Lucas Macedo - * - Paulo Freitas - * - Sebastian Thierer - */ -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'period_recurrences' => 'uma|:count vez', - 'period_interval' => 'toda :interval', - 'formats' => [ - 'LLL' => 'D [de] MMMM [de] YYYY [às] HH:mm', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY [às] HH:mm', - ], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_CH.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_CH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_CV.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_CV.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_CV.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_GQ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_GQ.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_GQ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_GW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_GW.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_GW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_LU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_LU.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_LU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_MO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_MO.php deleted file mode 100644 index f2b5eab..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_MO.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'LLL' => 'D [de] MMMM [de] YYYY, h:mm a', - 'LLLL' => 'dddd, D [de] MMMM [de] YYYY, h:mm a', - ], - 'first_day_of_week' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_MZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_MZ.php deleted file mode 100644 index fbc0c97..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_MZ.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'first_day_of_week' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_PT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_PT.php deleted file mode 100644 index 2a76fc1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_PT.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RAP bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/pt.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], - 'months_short' => ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'], - 'weekdays' => ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'], - 'weekdays_short' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], - 'weekdays_min' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_ST.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_ST.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_ST.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_TL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/pt_TL.php deleted file mode 100644 index 22c01ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/pt_TL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/pt.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/qu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/qu.php deleted file mode 100644 index 65278cd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/qu.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/es_UY.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM, YYYY HH:mm', - ], - 'first_day_of_week' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/qu_BO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/qu_BO.php deleted file mode 100644 index d5db6bf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/qu_BO.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/qu.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/qu_EC.php b/dependencies/nesbot/carbon/src/Carbon/Lang/qu_EC.php deleted file mode 100644 index d5db6bf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/qu_EC.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/qu.php', [ - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/quz.php b/dependencies/nesbot/carbon/src/Carbon/Lang/quz.php deleted file mode 100644 index 1640c02..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/quz.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/quz_PE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/quz_PE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/quz_PE.php deleted file mode 100644 index d322918..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/quz_PE.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['iniru', 'phiwriru', 'marsu', 'awril', 'mayu', 'huniyu', 'huliyu', 'agustu', 'siptiyimri', 'uktuwri', 'nuwiyimri', 'tisiyimri'], - 'months_short' => ['ini', 'phi', 'mar', 'awr', 'may', 'hun', 'hul', 'agu', 'sip', 'ukt', 'nuw', 'tis'], - 'weekdays' => ['tuminku', 'lunis', 'martis', 'miyirkulis', 'juywis', 'wiyirnis', 'sawatu'], - 'weekdays_short' => ['tum', 'lun', 'mar', 'miy', 'juy', 'wiy', 'saw'], - 'weekdays_min' => ['tum', 'lun', 'mar', 'miy', 'juy', 'wiy', 'saw'], - 'day_of_first_week_of_year' => 1, - - 'minute' => ':count uchuy', // less reliable - 'min' => ':count uchuy', // less reliable - 'a_minute' => ':count uchuy', // less reliable - - 'year' => ':count wata', - 'y' => ':count wata', - 'a_year' => ':count wata', - - 'month' => ':count killa', - 'm' => ':count killa', - 'a_month' => ':count killa', - - 'week' => ':count simana', - 'w' => ':count simana', - 'a_week' => ':count simana', - - 'day' => ':count pʼunchaw', - 'd' => ':count pʼunchaw', - 'a_day' => ':count pʼunchaw', - - 'hour' => ':count ura', - 'h' => ':count ura', - 'a_hour' => ':count ura', - - 'second' => ':count iskay ñiqin', - 's' => ':count iskay ñiqin', - 'a_second' => ':count iskay ñiqin', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/raj.php b/dependencies/nesbot/carbon/src/Carbon/Lang/raj.php deleted file mode 100644 index 26138c9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/raj.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/raj_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/raj_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/raj_IN.php deleted file mode 100644 index 7b4589c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/raj_IN.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - meghrajsuthar03@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], - 'months_short' => ['जन', 'फर', 'मार्च', 'अप्रै', 'मई', 'जून', 'जुल', 'अग', 'सित', 'अक्टू', 'नव', 'दिस'], - 'weekdays' => ['रविवार', 'सोमवार', 'मंगल्लवार', 'बुधवार', 'बृहस्पतिवार', 'शुक्रवार', 'शनिवार'], - 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'year' => ':count आंहू', // less reliable - 'y' => ':count आंहू', // less reliable - 'a_year' => ':count आंहू', // less reliable - - 'month' => ':count सूरज', // less reliable - 'm' => ':count सूरज', // less reliable - 'a_month' => ':count सूरज', // less reliable - - 'week' => ':count निवाज', // less reliable - 'w' => ':count निवाज', // less reliable - 'a_week' => ':count निवाज', // less reliable - - 'day' => ':count अेक', // less reliable - 'd' => ':count अेक', // less reliable - 'a_day' => ':count अेक', // less reliable - - 'hour' => ':count दुनियांण', // less reliable - 'h' => ':count दुनियांण', // less reliable - 'a_hour' => ':count दुनियांण', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/rm.php b/dependencies/nesbot/carbon/src/Carbon/Lang/rm.php deleted file mode 100644 index 1843f45..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/rm.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Tsutomu Kuroda - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - sebastian de castelberg - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'Do MMMM YYYY', - 'LLL' => 'Do MMMM, HH:mm [Uhr]', - 'LLLL' => 'dddd, Do MMMM YYYY, HH:mm [Uhr]', - ], - 'year' => ':count onn|:count onns', - 'month' => ':count mais', - 'week' => ':count emna|:count emnas', - 'day' => ':count di|:count dis', - 'hour' => ':count oura|:count ouras', - 'minute' => ':count minuta|:count minutas', - 'second' => ':count secunda|:count secundas', - 'weekdays' => ['dumengia', 'glindesdi', 'mardi', 'mesemna', 'gievgia', 'venderdi', 'sonda'], - 'weekdays_short' => ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'], - 'weekdays_min' => ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'], - 'months' => ['schaner', 'favrer', 'mars', 'avrigl', 'matg', 'zercladur', 'fanadur', 'avust', 'settember', 'october', 'november', 'december'], - 'months_short' => ['schan', 'favr', 'mars', 'avr', 'matg', 'zercl', 'fan', 'avust', 'sett', 'oct', 'nov', 'dec'], - 'meridiem' => ['avantmezdi', 'suentermezdi'], - 'list' => [', ', ' e '], - 'first_day_of_week' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/rn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/rn.php deleted file mode 100644 index 8ab958e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/rn.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Z.MU.', 'Z.MW.'], - 'weekdays' => ['Ku w’indwi', 'Ku wa mbere', 'Ku wa kabiri', 'Ku wa gatatu', 'Ku wa kane', 'Ku wa gatanu', 'Ku wa gatandatu'], - 'weekdays_short' => ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'], - 'weekdays_min' => ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'], - 'months' => ['Nzero', 'Ruhuhuma', 'Ntwarante', 'Ndamukiza', 'Rusama', 'Ruheshi', 'Mukakaro', 'Nyandagaro', 'Nyakanga', 'Gitugutu', 'Munyonyo', 'Kigarama'], - 'months_short' => ['Mut.', 'Gas.', 'Wer.', 'Mat.', 'Gic.', 'Kam.', 'Nya.', 'Kan.', 'Nze.', 'Ukw.', 'Ugu.', 'Uku.'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => 'imyaka :count', - 'y' => 'imyaka :count', - 'a_year' => 'imyaka :count', - - 'month' => 'amezi :count', - 'm' => 'amezi :count', - 'a_month' => 'amezi :count', - - 'week' => 'indwi :count', - 'w' => 'indwi :count', - 'a_week' => 'indwi :count', - - 'day' => 'imisi :count', - 'd' => 'imisi :count', - 'a_day' => 'imisi :count', - - 'hour' => 'amasaha :count', - 'h' => 'amasaha :count', - 'a_hour' => 'amasaha :count', - - 'minute' => 'iminuta :count', - 'min' => 'iminuta :count', - 'a_minute' => 'iminuta :count', - - 'second' => 'inguvu :count', // less reliable - 's' => 'inguvu :count', // less reliable - 'a_second' => 'inguvu :count', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ro.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ro.php deleted file mode 100644 index 868a327..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ro.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - * - Cătălin Georgescu - * - Valentin Ivaşcu (oriceon) - */ -return [ - 'year' => ':count an|:count ani|:count ani', - 'a_year' => 'un an|:count ani|:count ani', - 'y' => ':count a.', - 'month' => ':count lună|:count luni|:count luni', - 'a_month' => 'o lună|:count luni|:count luni', - 'm' => ':count l.', - 'week' => ':count săptămână|:count săptămâni|:count săptămâni', - 'a_week' => 'o săptămână|:count săptămâni|:count săptămâni', - 'w' => ':count săp.', - 'day' => ':count zi|:count zile|:count zile', - 'a_day' => 'o zi|:count zile|:count zile', - 'd' => ':count z.', - 'hour' => ':count oră|:count ore|:count ore', - 'a_hour' => 'o oră|:count ore|:count ore', - 'h' => ':count o.', - 'minute' => ':count minut|:count minute|:count minute', - 'a_minute' => 'un minut|:count minute|:count minute', - 'min' => ':count m.', - 'second' => ':count secundă|:count secunde|:count secunde', - 'a_second' => 'câteva secunde|:count secunde|:count secunde', - 's' => ':count sec.', - 'ago' => ':time în urmă', - 'from_now' => 'peste :time', - 'after' => 'peste :time', - 'before' => 'acum :time', - 'diff_now' => 'acum', - 'diff_today' => 'azi', - 'diff_today_regexp' => 'azi(?:\\s+la)?', - 'diff_yesterday' => 'ieri', - 'diff_yesterday_regexp' => 'ieri(?:\\s+la)?', - 'diff_tomorrow' => 'mâine', - 'diff_tomorrow_regexp' => 'mâine(?:\\s+la)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY H:mm', - 'LLLL' => 'dddd, D MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[azi la] LT', - 'nextDay' => '[mâine la] LT', - 'nextWeek' => 'dddd [la] LT', - 'lastDay' => '[ieri la] LT', - 'lastWeek' => '[fosta] dddd [la] LT', - 'sameElse' => 'L', - ], - 'months' => ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'], - 'months_short' => ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'], - 'weekdays' => ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'], - 'weekdays_short' => ['dum', 'lun', 'mar', 'mie', 'joi', 'vin', 'sâm'], - 'weekdays_min' => ['du', 'lu', 'ma', 'mi', 'jo', 'vi', 'sâ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' și '], - 'meridiem' => ['a.m.', 'p.m.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ro_MD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ro_MD.php deleted file mode 100644 index ad1d2fa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ro_MD.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ro.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ro_RO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ro_RO.php deleted file mode 100644 index 102afcd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ro_RO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ro.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/rof.php b/dependencies/nesbot/carbon/src/Carbon/Lang/rof.php deleted file mode 100644 index 205fc26..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/rof.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['kang’ama', 'kingoto'], - 'weekdays' => ['Ijumapili', 'Ijumatatu', 'Ijumanne', 'Ijumatano', 'Alhamisi', 'Ijumaa', 'Ijumamosi'], - 'weekdays_short' => ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'], - 'weekdays_min' => ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'], - 'months' => ['Mweri wa kwanza', 'Mweri wa kaili', 'Mweri wa katatu', 'Mweri wa kaana', 'Mweri wa tanu', 'Mweri wa sita', 'Mweri wa saba', 'Mweri wa nane', 'Mweri wa tisa', 'Mweri wa ikumi', 'Mweri wa ikumi na moja', 'Mweri wa ikumi na mbili'], - 'months_short' => ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru.php deleted file mode 100644 index 673b043..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru.php +++ /dev/null @@ -1,191 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Bari Badamshin - * - Jørn Ølmheim - * - François B - * - Tim Fish - * - Коренберг Марк (imac) - * - Serhan Apaydın - * - RomeroMsk - * - vsn4ik - * - JD Isaacks - * - Bari Badamshin - * - Jørn Ølmheim - * - François B - * - Коренберг Марк (imac) - * - Serhan Apaydın - * - RomeroMsk - * - vsn4ik - * - JD Isaacks - * - Fellzo - * - andrey-helldar - * - Pavel Skripkin (psxx) - * - AlexWalkerson - * - Vladislav UnsealedOne - * - dima-bzz - */ - -use Carbon\CarbonInterface; - -$transformDiff = function ($input) { - return strtr($input, [ - 'неделя' => 'неделю', - 'секунда' => 'секунду', - 'минута' => 'минуту', - ]); -}; - -return [ - 'year' => ':count год|:count года|:count лет', - 'y' => ':count г.|:count г.|:count л.', - 'a_year' => '{1}год|:count год|:count года|:count лет', - 'month' => ':count месяц|:count месяца|:count месяцев', - 'm' => ':count мес.', - 'a_month' => '{1}месяц|:count месяц|:count месяца|:count месяцев', - 'week' => ':count неделя|:count недели|:count недель', - 'w' => ':count нед.', - 'a_week' => '{1}неделя|:count неделю|:count недели|:count недель', - 'day' => ':count день|:count дня|:count дней', - 'd' => ':count д.', - 'a_day' => '{1}день|:count день|:count дня|:count дней', - 'hour' => ':count час|:count часа|:count часов', - 'h' => ':count ч.', - 'a_hour' => '{1}час|:count час|:count часа|:count часов', - 'minute' => ':count минута|:count минуты|:count минут', - 'min' => ':count мин.', - 'a_minute' => '{1}минута|:count минута|:count минуты|:count минут', - 'second' => ':count секунда|:count секунды|:count секунд', - 's' => ':count сек.', - 'a_second' => '{1}несколько секунд|:count секунду|:count секунды|:count секунд', - 'ago' => function ($time) use ($transformDiff) { - return $transformDiff($time).' назад'; - }, - 'from_now' => function ($time) use ($transformDiff) { - return 'через '.$transformDiff($time); - }, - 'after' => function ($time) use ($transformDiff) { - return $transformDiff($time).' после'; - }, - 'before' => function ($time) use ($transformDiff) { - return $transformDiff($time).' до'; - }, - 'diff_now' => 'только что', - 'diff_today' => 'Сегодня,', - 'diff_today_regexp' => 'Сегодня,?(?:\\s+в)?', - 'diff_yesterday' => 'вчера', - 'diff_yesterday_regexp' => 'Вчера,?(?:\\s+в)?', - 'diff_tomorrow' => 'завтра', - 'diff_tomorrow_regexp' => 'Завтра,?(?:\\s+в)?', - 'diff_before_yesterday' => 'позавчера', - 'diff_after_tomorrow' => 'послезавтра', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY г.', - 'LLL' => 'D MMMM YYYY г., H:mm', - 'LLLL' => 'dddd, D MMMM YYYY г., H:mm', - ], - 'calendar' => [ - 'sameDay' => '[Сегодня, в] LT', - 'nextDay' => '[Завтра, в] LT', - 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) { - if ($current->week !== $other->week) { - switch ($current->dayOfWeek) { - case 0: - return '[В следующее] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В следующий] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В следующую] dddd, [в] LT'; - } - } - - if ($current->dayOfWeek === 2) { - return '[Во] dddd, [в] LT'; - } - - return '[В] dddd, [в] LT'; - }, - 'lastDay' => '[Вчера, в] LT', - 'lastWeek' => function (CarbonInterface $current, CarbonInterface $other) { - if ($current->week !== $other->week) { - switch ($current->dayOfWeek) { - case 0: - return '[В прошлое] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В прошлый] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В прошлую] dddd, [в] LT'; - } - } - - if ($current->dayOfWeek === 2) { - return '[Во] dddd, [в] LT'; - } - - return '[В] dddd, [в] LT'; - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'M': - case 'd': - case 'DDD': - return $number.'-й'; - case 'D': - return $number.'-го'; - case 'w': - case 'W': - return $number.'-я'; - default: - return $number; - } - }, - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'ночи'; - } - if ($hour < 12) { - return 'утра'; - } - if ($hour < 17) { - return 'дня'; - } - - return 'вечера'; - }, - 'months' => ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'], - 'months_standalone' => ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'мая', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'months_short_standalone' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => ['воскресенье', 'понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу'], - 'weekdays_standalone' => ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], - 'weekdays_short' => ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'], - 'weekdays_min' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'weekdays_regexp' => '/\[\s*(В|в)\s*((?:прошлую|следующую|эту)\s*)?\]\s*dddd/', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_BY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru_BY.php deleted file mode 100644 index 8ca7df3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_BY.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_KG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru_KG.php deleted file mode 100644 index 8ca7df3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_KG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_KZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru_KZ.php deleted file mode 100644 index 8ca7df3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_KZ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_MD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru_MD.php deleted file mode 100644 index 8ca7df3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_MD.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru_RU.php deleted file mode 100644 index 8ca7df3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_RU.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ru.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_UA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ru_UA.php deleted file mode 100644 index db958d6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ru_UA.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - RFC 2319 bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ru.php', [ - 'weekdays' => ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], - 'weekdays_short' => ['вск', 'пнд', 'вто', 'срд', 'чтв', 'птн', 'суб'], - 'weekdays_min' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'су'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/rw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/rw.php deleted file mode 100644 index bc4a347..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/rw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/rw_RW.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/rw_RW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/rw_RW.php deleted file mode 100644 index 9b3e068..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/rw_RW.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rwanda Steve Murphy murf@e-tools.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicuransi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeli', 'Ukwakira', 'Ugushyingo', 'Ukuboza'], - 'months_short' => ['Mut', 'Gas', 'Wer', 'Mat', 'Gic', 'Kam', 'Nya', 'Kan', 'Nze', 'Ukw', 'Ugu', 'Uku'], - 'weekdays' => ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'], - 'weekdays_short' => ['Mwe', 'Mbe', 'Kab', 'Gtu', 'Kan', 'Gnu', 'Gnd'], - 'weekdays_min' => ['Mwe', 'Mbe', 'Kab', 'Gtu', 'Kan', 'Gnu', 'Gnd'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'second' => ':count vuna', // less reliable - 's' => ':count vuna', // less reliable - 'a_second' => ':count vuna', // less reliable - - 'year' => 'aka :count', - 'y' => 'aka :count', - 'a_year' => 'aka :count', - - 'month' => 'ezi :count', - 'm' => 'ezi :count', - 'a_month' => 'ezi :count', - - 'week' => ':count icyumweru', - 'w' => ':count icyumweru', - 'a_week' => ':count icyumweru', - - 'day' => ':count nsi', - 'd' => ':count nsi', - 'a_day' => ':count nsi', - - 'hour' => 'saha :count', - 'h' => 'saha :count', - 'a_hour' => 'saha :count', - - 'minute' => ':count -nzinya', - 'min' => ':count -nzinya', - 'a_minute' => ':count -nzinya', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/rwk.php b/dependencies/nesbot/carbon/src/Carbon/Lang/rwk.php deleted file mode 100644 index ed92e8e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/rwk.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['utuko', 'kyiukonyi'], - 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sa.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sa.php deleted file mode 100644 index 1357c03..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sa.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sa_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sa_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sa_IN.php deleted file mode 100644 index cfda9a6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sa_IN.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - The Debian project Christian Perrier bubulle@debian.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D-MM-YY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['रविवासर:', 'सोमवासर:', 'मंगलवासर:', 'बुधवासर:', 'बृहस्पतिवासरः', 'शुक्रवासर', 'शनिवासर:'], - 'weekdays_short' => ['रविः', 'सोम:', 'मंगल:', 'बुध:', 'बृहस्पतिः', 'शुक्र', 'शनि:'], - 'weekdays_min' => ['रविः', 'सोम:', 'मंगल:', 'बुध:', 'बृहस्पतिः', 'शुक्र', 'शनि:'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], - - 'minute' => ':count होरा', // less reliable - 'min' => ':count होरा', // less reliable - 'a_minute' => ':count होरा', // less reliable - - 'year' => ':count वर्ष', - 'y' => ':count वर्ष', - 'a_year' => ':count वर्ष', - - 'month' => ':count मास', - 'm' => ':count मास', - 'a_month' => ':count मास', - - 'week' => ':count सप्ताहः saptahaĥ', - 'w' => ':count सप्ताहः saptahaĥ', - 'a_week' => ':count सप्ताहः saptahaĥ', - - 'day' => ':count दिन', - 'd' => ':count दिन', - 'a_day' => ':count दिन', - - 'hour' => ':count घण्टा', - 'h' => ':count घण्टा', - 'a_hour' => ':count घण्टा', - - 'second' => ':count द्वितीयः', - 's' => ':count द्वितीयः', - 'a_second' => ':count द्वितीयः', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sah.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sah.php deleted file mode 100644 index b828824..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sah.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sah_RU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sah_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sah_RU.php deleted file mode 100644 index 94cc0cb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sah_RU.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Valery Timiriliyev Valery Timiriliyev timiriliyev@gmail.com - */ -return array_replace_recursive(require __DIR__.'/ru.php', [ - 'formats' => [ - 'L' => 'YYYY.MM.DD', - ], - 'months' => ['тохсунньу', 'олунньу', 'кулун тутар', 'муус устар', 'ыам ыйын', 'бэс ыйын', 'от ыйын', 'атырдьах ыйын', 'балаҕан ыйын', 'алтынньы', 'сэтинньи', 'ахсынньы'], - 'months_short' => ['тохс', 'олун', 'кул', 'муус', 'ыам', 'бэс', 'от', 'атыр', 'бал', 'алт', 'сэт', 'ахс'], - 'weekdays' => ['баскыһыанньа', 'бэнидиэнньик', 'оптуорунньук', 'сэрэдэ', 'чэппиэр', 'бээтинсэ', 'субуота'], - 'weekdays_short' => ['бс', 'бн', 'оп', 'ср', 'чп', 'бт', 'сб'], - 'weekdays_min' => ['бс', 'бн', 'оп', 'ср', 'чп', 'бт', 'сб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/saq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/saq.php deleted file mode 100644 index ff8bf60..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/saq.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Tesiran', 'Teipa'], - 'weekdays' => ['Mderot ee are', 'Mderot ee kuni', 'Mderot ee ong’wan', 'Mderot ee inet', 'Mderot ee ile', 'Mderot ee sapa', 'Mderot ee kwe'], - 'weekdays_short' => ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'], - 'weekdays_min' => ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'], - 'months' => ['Lapa le obo', 'Lapa le waare', 'Lapa le okuni', 'Lapa le ong’wan', 'Lapa le imet', 'Lapa le ile', 'Lapa le sapa', 'Lapa le isiet', 'Lapa le saal', 'Lapa le tomon', 'Lapa le tomon obo', 'Lapa le tomon waare'], - 'months_short' => ['Obo', 'Waa', 'Oku', 'Ong', 'Ime', 'Ile', 'Sap', 'Isi', 'Saa', 'Tom', 'Tob', 'Tow'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sat.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sat.php deleted file mode 100644 index c9914c6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sat.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sat_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sat_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sat_IN.php deleted file mode 100644 index 632b1af..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sat_IN.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat Pune libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रेल', 'मई', 'जुन', 'जुलाई', 'अगस्त', 'सितम्बर', 'अखथबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रेल', 'मई', 'जुन', 'जुलाई', 'अगस्त', 'सितम्बर', 'अखथबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['सिंगेमाँहाँ', 'ओतेमाँहाँ', 'बालेमाँहाँ', 'सागुनमाँहाँ', 'सारदीमाँहाँ', 'जारुममाँहाँ', 'ञुहुममाँहाँ'], - 'weekdays_short' => ['सिंगे', 'ओते', 'बाले', 'सागुन', 'सारदी', 'जारुम', 'ञुहुम'], - 'weekdays_min' => ['सिंगे', 'ओते', 'बाले', 'सागुन', 'सारदी', 'जारुम', 'ञुहुम'], - 'day_of_first_week_of_year' => 1, - - 'month' => ':count ńindạ cando', // less reliable - 'm' => ':count ńindạ cando', // less reliable - 'a_month' => ':count ńindạ cando', // less reliable - - 'week' => ':count mãhã', // less reliable - 'w' => ':count mãhã', // less reliable - 'a_week' => ':count mãhã', // less reliable - - 'hour' => ':count ᱥᱳᱱᱚ', // less reliable - 'h' => ':count ᱥᱳᱱᱚ', // less reliable - 'a_hour' => ':count ᱥᱳᱱᱚ', // less reliable - - 'minute' => ':count ᱯᱤᱞᱪᱩ', // less reliable - 'min' => ':count ᱯᱤᱞᱪᱩ', // less reliable - 'a_minute' => ':count ᱯᱤᱞᱪᱩ', // less reliable - - 'second' => ':count ar', // less reliable - 's' => ':count ar', // less reliable - 'a_second' => ':count ar', // less reliable - - 'year' => ':count ne̲s', - 'y' => ':count ne̲s', - 'a_year' => ':count ne̲s', - - 'day' => ':count ᱫᱤᱱ', - 'd' => ':count ᱫᱤᱱ', - 'a_day' => ':count ᱫᱤᱱ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sbp.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sbp.php deleted file mode 100644 index e29ca37..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sbp.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Lwamilawu', 'Pashamihe'], - 'weekdays' => ['Mulungu', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alahamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Mupalangulwa', 'Mwitope', 'Mushende', 'Munyi', 'Mushende Magali', 'Mujimbi', 'Mushipepo', 'Mupuguto', 'Munyense', 'Mokhu', 'Musongandembwe', 'Muhaano'], - 'months_short' => ['Mup', 'Mwi', 'Msh', 'Mun', 'Mag', 'Muj', 'Msp', 'Mpg', 'Mye', 'Mok', 'Mus', 'Muh'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sc.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sc.php deleted file mode 100644 index 7178cf4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sc.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sc_IT.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sc_IT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sc_IT.php deleted file mode 100644 index 5d1e4ce..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sc_IT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Sardinian Translators Team Massimeddu Cireddu massimeddu@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD. MM. YY', - ], - 'months' => ['Ghennàrgiu', 'Freàrgiu', 'Martzu', 'Abrile', 'Maju', 'Làmpadas', 'Argiolas//Trìulas', 'Austu', 'Cabudanni', 'Santugaine//Ladàmine', 'Onniasantu//Santandria', 'Nadale//Idas'], - 'months_short' => ['Ghe', 'Fre', 'Mar', 'Abr', 'Maj', 'Làm', 'Arg', 'Aus', 'Cab', 'Lad', 'Onn', 'Nad'], - 'weekdays' => ['Domìnigu', 'Lunis', 'Martis', 'Mèrcuris', 'Giòbia', 'Chenàbura', 'Sàbadu'], - 'weekdays_short' => ['Dom', 'Lun', 'Mar', 'Mèr', 'Giò', 'Che', 'Sàb'], - 'weekdays_min' => ['Dom', 'Lun', 'Mar', 'Mèr', 'Giò', 'Che', 'Sàb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'minute' => ':count mementu', // less reliable - 'min' => ':count mementu', // less reliable - 'a_minute' => ':count mementu', // less reliable - - 'year' => ':count annu', - 'y' => ':count annu', - 'a_year' => ':count annu', - - 'month' => ':count mese', - 'm' => ':count mese', - 'a_month' => ':count mese', - - 'week' => ':count chida', - 'w' => ':count chida', - 'a_week' => ':count chida', - - 'day' => ':count dí', - 'd' => ':count dí', - 'a_day' => ':count dí', - - 'hour' => ':count ora', - 'h' => ':count ora', - 'a_hour' => ':count ora', - - 'second' => ':count secundu', - 's' => ':count secundu', - 'a_second' => ':count secundu', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sd.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sd.php deleted file mode 100644 index 0022c5a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sd.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$months = [ - 'جنوري', - 'فيبروري', - 'مارچ', - 'اپريل', - 'مئي', - 'جون', - 'جولاءِ', - 'آگسٽ', - 'سيپٽمبر', - 'آڪٽوبر', - 'نومبر', - 'ڊسمبر', -]; - -$weekdays = [ - 'آچر', - 'سومر', - 'اڱارو', - 'اربع', - 'خميس', - 'جمع', - 'ڇنڇر', -]; - -/* - * Authors: - * - Narain Sagar - * - Sawood Alam - * - Narain Sagar - */ -return [ - 'year' => '{1}'.'هڪ سال'.'|:count '.'سال', - 'month' => '{1}'.'هڪ مهينو'.'|:count '.'مهينا', - 'week' => '{1}'.'ھڪ ھفتو'.'|:count '.'هفتا', - 'day' => '{1}'.'هڪ ڏينهن'.'|:count '.'ڏينهن', - 'hour' => '{1}'.'هڪ ڪلاڪ'.'|:count '.'ڪلاڪ', - 'minute' => '{1}'.'هڪ منٽ'.'|:count '.'منٽ', - 'second' => '{1}'.'چند سيڪنڊ'.'|:count '.'سيڪنڊ', - 'ago' => ':time اڳ', - 'from_now' => ':time پوء', - 'diff_yesterday' => 'ڪالهه', - 'diff_today' => 'اڄ', - 'diff_tomorrow' => 'سڀاڻي', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd، D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[اڄ] LT', - 'nextDay' => '[سڀاڻي] LT', - 'nextWeek' => 'dddd [اڳين هفتي تي] LT', - 'lastDay' => '[ڪالهه] LT', - 'lastWeek' => '[گزريل هفتي] dddd [تي] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['صبح', 'شام'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => $weekdays, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => ['، ', ' ۽ '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN.php deleted file mode 100644 index de1dad0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/sd.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['جنوري', 'فبروري', 'مارچ', 'اپريل', 'مي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽيمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'], - 'months_short' => ['جنوري', 'فبروري', 'مارچ', 'اپريل', 'مي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽيمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'], - 'weekdays' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], - 'weekdays_short' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], - 'weekdays_min' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php deleted file mode 100644 index 061fcc1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/sd.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['जनवरी', 'फबरवरी', 'मार्चि', 'अप्रेल', 'मे', 'जूनि', 'जूलाइ', 'आगस्टु', 'सेप्टेंबरू', 'आक्टूबरू', 'नवंबरू', 'ॾिसंबरू'], - 'months_short' => ['जनवरी', 'फबरवरी', 'मार्चि', 'अप्रेल', 'मे', 'जूनि', 'जूलाइ', 'आगस्टु', 'सेप्टेंबरू', 'आक्टूबरू', 'नवंबरू', 'ॾिसंबरू'], - 'weekdays' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], - 'weekdays_short' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], - 'weekdays_min' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['म.पू.', 'म.नं.'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/se.php b/dependencies/nesbot/carbon/src/Carbon/Lang/se.php deleted file mode 100644 index 7c4b92a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/se.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Karamell - */ -return [ - 'year' => '{1}:count jahki|:count jagit', - 'a_year' => '{1}okta jahki|:count jagit', - 'y' => ':count j.', - 'month' => '{1}:count mánnu|:count mánut', - 'a_month' => '{1}okta mánnu|:count mánut', - 'm' => ':count mán.', - 'week' => '{1}:count vahkku|:count vahkku', - 'a_week' => '{1}okta vahkku|:count vahkku', - 'w' => ':count v.', - 'day' => '{1}:count beaivi|:count beaivvit', - 'a_day' => '{1}okta beaivi|:count beaivvit', - 'd' => ':count b.', - 'hour' => '{1}:count diimmu|:count diimmut', - 'a_hour' => '{1}okta diimmu|:count diimmut', - 'h' => ':count d.', - 'minute' => '{1}:count minuhta|:count minuhtat', - 'a_minute' => '{1}okta minuhta|:count minuhtat', - 'min' => ':count min.', - 'second' => '{1}:count sekunddat|:count sekunddat', - 'a_second' => '{1}moadde sekunddat|:count sekunddat', - 's' => ':count s.', - 'ago' => 'maŋit :time', - 'from_now' => ':time geažes', - 'diff_yesterday' => 'ikte', - 'diff_yesterday_regexp' => 'ikte(?:\\s+ti)?', - 'diff_today' => 'otne', - 'diff_today_regexp' => 'otne(?:\\s+ti)?', - 'diff_tomorrow' => 'ihttin', - 'diff_tomorrow_regexp' => 'ihttin(?:\\s+ti)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'MMMM D. [b.] YYYY', - 'LLL' => 'MMMM D. [b.] YYYY [ti.] HH:mm', - 'LLLL' => 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[otne ti] LT', - 'nextDay' => '[ihttin ti] LT', - 'nextWeek' => 'dddd [ti] LT', - 'lastDay' => '[ikte ti] LT', - 'lastWeek' => '[ovddit] dddd [ti] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'], - 'months_short' => ['ođđj', 'guov', 'njuk', 'cuo', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'], - 'weekdays' => ['sotnabeaivi', 'vuossárga', 'maŋŋebárga', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvardat'], - 'weekdays_short' => ['sotn', 'vuos', 'maŋ', 'gask', 'duor', 'bear', 'láv'], - 'weekdays_min' => ['s', 'v', 'm', 'g', 'd', 'b', 'L'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ja '], - 'meridiem' => ['i.b.', 'e.b.'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/se_FI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/se_FI.php deleted file mode 100644 index cf01805..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/se_FI.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/se.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'months' => ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'], - 'months_short' => ['ođđj', 'guov', 'njuk', 'cuoŋ', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'], - 'weekdays' => ['sotnabeaivi', 'mánnodat', 'disdat', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvordat'], - 'weekdays_short' => ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'], - 'weekdays_min' => ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'], - 'meridiem' => ['i', 'e'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/se_NO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/se_NO.php deleted file mode 100644 index 177c7e9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/se_NO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/se.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/se_SE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/se_SE.php deleted file mode 100644 index 177c7e9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/se_SE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/se.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/seh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/seh.php deleted file mode 100644 index babf9af..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/seh.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['Dimingu', 'Chiposi', 'Chipiri', 'Chitatu', 'Chinai', 'Chishanu', 'Sabudu'], - 'weekdays_short' => ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'], - 'weekdays_min' => ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'], - 'months' => ['Janeiro', 'Fevreiro', 'Marco', 'Abril', 'Maio', 'Junho', 'Julho', 'Augusto', 'Setembro', 'Otubro', 'Novembro', 'Decembro'], - 'months_short' => ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Aug', 'Set', 'Otu', 'Nov', 'Dec'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'd [de] MMM [de] YYYY', - 'LLL' => 'd [de] MMMM [de] YYYY HH:mm', - 'LLLL' => 'dddd, d [de] MMMM [de] YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ses.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ses.php deleted file mode 100644 index e1099e6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ses.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Adduha', 'Aluula'], - 'weekdays' => ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'], - 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], - 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], - 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'month' => ':count alaada', // less reliable - 'm' => ':count alaada', // less reliable - 'a_month' => ':count alaada', // less reliable - - 'hour' => ':count ɲaajin', // less reliable - 'h' => ':count ɲaajin', // less reliable - 'a_hour' => ':count ɲaajin', // less reliable - - 'minute' => ':count zarbu', // less reliable - 'min' => ':count zarbu', // less reliable - 'a_minute' => ':count zarbu', // less reliable - - 'year' => ':count jiiri', - 'y' => ':count jiiri', - 'a_year' => ':count jiiri', - - 'week' => ':count jirbiiyye', - 'w' => ':count jirbiiyye', - 'a_week' => ':count jirbiiyye', - - 'day' => ':count zaari', - 'd' => ':count zaari', - 'a_day' => ':count zaari', - - 'second' => ':count ihinkante', - 's' => ':count ihinkante', - 'a_second' => ':count ihinkante', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sg.php deleted file mode 100644 index 9264e89..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sg.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ND', 'LK'], - 'weekdays' => ['Bikua-ôko', 'Bïkua-ûse', 'Bïkua-ptâ', 'Bïkua-usïö', 'Bïkua-okü', 'Lâpôsö', 'Lâyenga'], - 'weekdays_short' => ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'], - 'weekdays_min' => ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'], - 'months' => ['Nyenye', 'Fulundïgi', 'Mbängü', 'Ngubùe', 'Bêläwü', 'Föndo', 'Lengua', 'Kükürü', 'Mvuka', 'Ngberere', 'Nabändüru', 'Kakauka'], - 'months_short' => ['Nye', 'Ful', 'Mbä', 'Ngu', 'Bêl', 'Fön', 'Len', 'Kük', 'Mvu', 'Ngb', 'Nab', 'Kak'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count dā', // less reliable - 'y' => ':count dā', // less reliable - 'a_year' => ':count dā', // less reliable - - 'week' => ':count bïkua-okü', // less reliable - 'w' => ':count bïkua-okü', // less reliable - 'a_week' => ':count bïkua-okü', // less reliable - - 'day' => ':count ziggawâ', // less reliable - 'd' => ':count ziggawâ', // less reliable - 'a_day' => ':count ziggawâ', // less reliable - - 'hour' => ':count yângâködörö', // less reliable - 'h' => ':count yângâködörö', // less reliable - 'a_hour' => ':count yângâködörö', // less reliable - - 'second' => ':count bïkua-ôko', // less reliable - 's' => ':count bïkua-ôko', // less reliable - 'a_second' => ':count bïkua-ôko', // less reliable - - 'month' => ':count Nze tî ngu', - 'm' => ':count Nze tî ngu', - 'a_month' => ':count Nze tî ngu', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sgs.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sgs.php deleted file mode 100644 index 864b989..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sgs.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sgs_LT.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sgs_LT.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sgs_LT.php deleted file mode 100644 index aa9e942..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sgs_LT.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Arnas Udovičius bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY.MM.DD', - ], - 'months' => ['sausė', 'vasarė', 'kuova', 'balondė', 'gegožės', 'bėrželė', 'lëpas', 'rogpjūtė', 'siejės', 'spalė', 'lapkrėstė', 'grůdė'], - 'months_short' => ['Sau', 'Vas', 'Kuo', 'Bal', 'Geg', 'Bėr', 'Lëp', 'Rgp', 'Sie', 'Spa', 'Lap', 'Grd'], - 'weekdays' => ['nedielės dëna', 'panedielis', 'oterninks', 'sereda', 'četvergs', 'petnīčė', 'sobata'], - 'weekdays_short' => ['Nd', 'Pn', 'Ot', 'Sr', 'Čt', 'Pt', 'Sb'], - 'weekdays_min' => ['Nd', 'Pn', 'Ot', 'Sr', 'Čt', 'Pt', 'Sb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'minute' => ':count mažos', // less reliable - 'min' => ':count mažos', // less reliable - 'a_minute' => ':count mažos', // less reliable - - 'year' => ':count metā', - 'y' => ':count metā', - 'a_year' => ':count metā', - - 'month' => ':count mienou', - 'm' => ':count mienou', - 'a_month' => ':count mienou', - - 'week' => ':count nedielė', - 'w' => ':count nedielė', - 'a_week' => ':count nedielė', - - 'day' => ':count dīna', - 'd' => ':count dīna', - 'a_day' => ':count dīna', - - 'hour' => ':count adīna', - 'h' => ':count adīna', - 'a_hour' => ':count adīna', - - 'second' => ':count Sekondė', - 's' => ':count Sekondė', - 'a_second' => ':count Sekondė', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sh.php deleted file mode 100644 index e03b506..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sh.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -// @codeCoverageIgnoreStart -use Symfony\Component\Translation\PluralizationRules; - -if (class_exists('Symfony\\Component\\Translation\\PluralizationRules')) { - PluralizationRules::set(static function ($number) { - return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); - }, 'sh'); -} -// @codeCoverageIgnoreEnd - -/* - * Authors: - * - Томица Кораћ - * - Enrique Vidal - * - Christopher Dell - * - dmilisic - * - danijel - * - Miroslav Matkovic (mikki021) - */ -return [ - 'diff_now' => 'sada', - 'diff_yesterday' => 'juče', - 'diff_tomorrow' => 'sutra', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'year' => ':count godina|:count godine|:count godina', - 'y' => ':count g.', - 'month' => ':count mesec|:count meseca|:count meseci', - 'm' => ':count m.', - 'week' => ':count nedelja|:count nedelje|:count nedelja', - 'w' => ':count n.', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count d.', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count č.', - 'minute' => ':count minut|:count minuta|:count minuta', - 'min' => ':count min.', - 'second' => ':count sekund|:count sekunde|:count sekundi', - 's' => ':count s.', - 'ago' => 'pre :time', - 'from_now' => 'za :time', - 'after' => 'nakon :time', - 'before' => ':time raniјe', - 'weekdays' => ['Nedelja', 'Ponedeljak', 'Utorak', 'Sreda', 'Četvrtak', 'Petak', 'Subota'], - 'weekdays_short' => ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'], - 'weekdays_min' => ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'], - 'months' => ['Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun', 'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'], - 'list' => [', ', ' i '], - 'meridiem' => ['pre podne', 'po podne'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shi.php deleted file mode 100644 index 7815186..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shi.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'], - 'weekdays' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'weekdays_short' => ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'], - 'weekdays_min' => ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'], - 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'], - 'months_short' => ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'], - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'year' => ':count aseggwas', - 'y' => ':count aseggwas', - 'a_year' => ':count aseggwas', - - 'month' => ':count ayyur', - 'm' => ':count ayyur', - 'a_month' => ':count ayyur', - - 'week' => ':count imalass', - 'w' => ':count imalass', - 'a_week' => ':count imalass', - - 'day' => ':count ass', - 'd' => ':count ass', - 'a_day' => ':count ass', - - 'hour' => ':count urɣ', // less reliable - 'h' => ':count urɣ', // less reliable - 'a_hour' => ':count urɣ', // less reliable - - 'minute' => ':count ⴰⵎⵥⵉ', // less reliable - 'min' => ':count ⴰⵎⵥⵉ', // less reliable - 'a_minute' => ':count ⴰⵎⵥⵉ', // less reliable - - 'second' => ':count sin', // less reliable - 's' => ':count sin', // less reliable - 'a_second' => ':count sin', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shi_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shi_Latn.php deleted file mode 100644 index cddfb24..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shi_Latn.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/shi.php', [ - 'meridiem' => ['tifawt', 'tadggʷat'], - 'weekdays' => ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'], - 'weekdays_short' => ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'], - 'weekdays_min' => ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'], - 'months' => ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'], - 'months_short' => ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'], - 'first_day_of_week' => 6, - 'weekend' => [5, 6], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - - 'minute' => ':count agur', // less reliable - 'min' => ':count agur', // less reliable - 'a_minute' => ':count agur', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php deleted file mode 100644 index f3df1f2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/shi.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shn.php deleted file mode 100644 index fe7b1ea..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/shn_MM.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shn_MM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shn_MM.php deleted file mode 100644 index f399acf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shn_MM.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - ubuntu Myanmar LoCo Team https://ubuntu-mm.net Bone Pyae Sone bone.burma@mail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'OY MMM OD dddd', - ], - 'months' => ['လိူၼ်ၵမ်', 'လိူၼ်သၢမ်', 'လိူၼ်သီ', 'လိူၼ်ႁႃႈ', 'လိူၼ်ႁူၵ်း', 'လိူၼ်ၸဵတ်း', 'လိူၼ်ပႅတ်ႇ', 'လိူၼ်ၵဝ်ႈ', 'လိူၼ်သိပ်း', 'လိူၼ်သိပ်းဢိတ်း', 'လိူၼ်သိပ်းဢိတ်းသွင်', 'လိူၼ်ၸဵင်'], - 'months_short' => ['လိူၼ်ၵမ်', 'လိူၼ်သၢမ်', 'လိူၼ်သီ', 'လိူၼ်ႁႃႈ', 'လိူၼ်ႁူၵ်း', 'လိူၼ်ၸဵတ်း', 'လိူၼ်ပႅတ်ႇ', 'လိူၼ်ၵဝ်ႈ', 'လိူၼ်သိပ်း', 'လိူၼ်သိပ်းဢိတ်း', 'လိူၼ်သိပ်းဢိတ်းသွင်', 'လိူၼ်ၸဵင်'], - 'weekdays' => ['ဝၼ်းဢႃးတိတ်ႉ', 'ဝၼ်းၸၼ်', 'ဝၼ်း​ဢၢင်း​ၵၢၼ်း', 'ဝၼ်းပူတ်ႉ', 'ဝၼ်းၽတ်း', 'ဝၼ်းသုၵ်း', 'ဝၼ်းသဝ်'], - 'weekdays_short' => ['တိတ့်', 'ၸၼ်', 'ၵၢၼ်း', 'ပုတ့်', 'ၽတ်း', 'သုၵ်း', 'သဝ်'], - 'weekdays_min' => ['တိတ့်', 'ၸၼ်', 'ၵၢၼ်း', 'ပုတ့်', 'ၽတ်း', 'သုၵ်း', 'သဝ်'], - 'alt_numbers' => ['႐႐', '႐႑', '႐႒', '႐႓', '႐႔', '႐႕', '႐႖', '႐႗', '႐႘', '႐႙', '႑႐', '႑႑', '႑႒', '႑႓', '႑႔', '႑႕', '႑႖', '႑႗', '႑႘', '႑႙', '႒႐', '႒႑', '႒႒', '႒႓', '႒႔', '႒႕', '႒႖', '႒႗', '႒႘', '႒႙', '႓႐', '႓႑', '႓႒', '႓႓', '႓႔', '႓႕', '႓႖', '႓႗', '႓႘', '႓႙', '႔႐', '႔႑', '႔႒', '႔႓', '႔႔', '႔႕', '႔႖', '႔႗', '႔႘', '႔႙', '႕႐', '႕႑', '႕႒', '႕႓', '႕႔', '႕႕', '႕႖', '႕႗', '႕႘', '႕႙', '႖႐', '႖႑', '႖႒', '႖႓', '႖႔', '႖႕', '႖႖', '႖႗', '႖႘', '႖႙', '႗႐', '႗႑', '႗႒', '႗႓', '႗႔', '႗႕', '႗႖', '႗႗', '႗႘', '႗႙', '႘႐', '႘႑', '႘႒', '႘႓', '႘႔', '႘႕', '႘႖', '႘႗', '႘႘', '႘႙', '႙႐', '႙႑', '႙႒', '႙႓', '႙႔', '႙႕', '႙႖', '႙႗', '႙႘', '႙႙'], - 'meridiem' => ['ၵၢင်ၼႂ်', 'တၢမ်းၶမ်ႈ'], - - 'month' => ':count လိူၼ်', // less reliable - 'm' => ':count လိူၼ်', // less reliable - 'a_month' => ':count လိူၼ်', // less reliable - - 'week' => ':count ဝၼ်း', // less reliable - 'w' => ':count ဝၼ်း', // less reliable - 'a_week' => ':count ဝၼ်း', // less reliable - - 'hour' => ':count ຕີ', // less reliable - 'h' => ':count ຕີ', // less reliable - 'a_hour' => ':count ຕີ', // less reliable - - 'minute' => ':count ເດັກ', // less reliable - 'min' => ':count ເດັກ', // less reliable - 'a_minute' => ':count ເດັກ', // less reliable - - 'second' => ':count ဢိုၼ်ႇ', // less reliable - 's' => ':count ဢိုၼ်ႇ', // less reliable - 'a_second' => ':count ဢိုၼ်ႇ', // less reliable - - 'year' => ':count ပီ', - 'y' => ':count ပီ', - 'a_year' => ':count ပီ', - - 'day' => ':count ກາງວັນ', - 'd' => ':count ກາງວັນ', - 'a_day' => ':count ກາງວັນ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shs.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shs.php deleted file mode 100644 index 8d2e1d7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shs.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/shs_CA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/shs_CA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/shs_CA.php deleted file mode 100644 index 08d385e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/shs_CA.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Neskie Manuel bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Pellkwet̓min', 'Pelctsipwen̓ten', 'Pellsqépts', 'Peslléwten', 'Pell7ell7é7llqten', 'Pelltspéntsk', 'Pelltqwelq̓wél̓t', 'Pellct̓éxel̓cten', 'Pesqelqlélten', 'Pesllwélsten', 'Pellc7ell7é7llcwten̓', 'Pelltetétq̓em'], - 'months_short' => ['Kwe', 'Tsi', 'Sqe', 'Éwt', 'Ell', 'Tsp', 'Tqw', 'Ct̓é', 'Qel', 'Wél', 'U7l', 'Tet'], - 'weekdays' => ['Sxetspesq̓t', 'Spetkesq̓t', 'Selesq̓t', 'Skellesq̓t', 'Smesesq̓t', 'Stselkstesq̓t', 'Stqmekstesq̓t'], - 'weekdays_short' => ['Sxe', 'Spe', 'Sel', 'Ske', 'Sme', 'Sts', 'Stq'], - 'weekdays_min' => ['Sxe', 'Spe', 'Sel', 'Ske', 'Sme', 'Sts', 'Stq'], - 'day_of_first_week_of_year' => 1, - - 'year' => ':count sqlélten', // less reliable - 'y' => ':count sqlélten', // less reliable - 'a_year' => ':count sqlélten', // less reliable - - 'month' => ':count swewll', // less reliable - 'm' => ':count swewll', // less reliable - 'a_month' => ':count swewll', // less reliable - - 'hour' => ':count seqwlút', // less reliable - 'h' => ':count seqwlút', // less reliable - 'a_hour' => ':count seqwlút', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/si.php b/dependencies/nesbot/carbon/src/Carbon/Lang/si.php deleted file mode 100644 index 636bf69..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/si.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Serhan Apaydın - * - JD Isaacks - * - Malinda Weerasinghe (MalindaWMD) - */ -return [ - 'year' => '{1}වසර 1|වසර :count', - 'a_year' => '{1}වසරක්|වසර :count', - 'month' => '{1}මාස 1|මාස :count', - 'a_month' => '{1}මාසය|මාස :count', - 'week' => '{1}සති 1|සති :count', - 'a_week' => '{1}සතියක්|සති :count', - 'day' => '{1}දින 1|දින :count', - 'a_day' => '{1}දිනක්|දින :count', - 'hour' => '{1}පැය 1|පැය :count', - 'a_hour' => '{1}පැයක්|පැය :count', - 'minute' => '{1}මිනිත්තු 1|මිනිත්තු :count', - 'a_minute' => '{1}මිනිත්තුවක්|මිනිත්තු :count', - 'second' => '{1}තත්පර 1|තත්පර :count', - 'a_second' => '{1}තත්පර කිහිපයකට|තත්පර :count', - 'ago' => ':time කට පෙර', - 'from_now' => function ($time) { - if (preg_match('/දින \d/u', $time)) { - return $time.' න්'; - } - - return $time.' කින්'; - }, - 'before' => ':time කට පෙර', - 'after' => function ($time) { - if (preg_match('/දින \d/u', $time)) { - return $time.' න්'; - } - - return $time.' කින්'; - }, - 'diff_now' => 'දැන්', - 'diff_today' => 'අද', - 'diff_yesterday' => 'ඊයේ', - 'diff_tomorrow' => 'හෙට', - 'formats' => [ - 'LT' => 'a h:mm', - 'LTS' => 'a h:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY MMMM D', - 'LLL' => 'YYYY MMMM D, a h:mm', - 'LLLL' => 'YYYY MMMM D [වැනි] dddd, a h:mm:ss', - ], - 'calendar' => [ - 'sameDay' => '[අද] LT[ට]', - 'nextDay' => '[හෙට] LT[ට]', - 'nextWeek' => 'dddd LT[ට]', - 'lastDay' => '[ඊයේ] LT[ට]', - 'lastWeek' => '[පසුගිය] dddd LT[ට]', - 'sameElse' => 'L', - ], - 'ordinal' => ':number වැනි', - 'meridiem' => ['පෙර වරු', 'පස් වරු', 'පෙ.ව.', 'ප.ව.'], - 'months' => ['ජනවාරි', 'පෙබරවාරි', 'මාර්තු', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝස්තු', 'සැප්තැම්බර්', 'ඔක්තෝබර්', 'නොවැම්බර්', 'දෙසැම්බර්'], - 'months_short' => ['ජන', 'පෙබ', 'මාර්', 'අප්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝ', 'සැප්', 'ඔක්', 'නොවැ', 'දෙසැ'], - 'weekdays' => ['ඉරිදා', 'සඳුදා', 'අඟහරුවාදා', 'බදාදා', 'බ්‍රහස්පතින්දා', 'සිකුරාදා', 'සෙනසුරාදා'], - 'weekdays_short' => ['ඉරි', 'සඳු', 'අඟ', 'බදා', 'බ්‍රහ', 'සිකු', 'සෙන'], - 'weekdays_min' => ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'], - 'first_day_of_week' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/si_LK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/si_LK.php deleted file mode 100644 index 81c44e0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/si_LK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/si.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sid.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sid.php deleted file mode 100644 index b1c6521..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sid.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sid_ET.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sid_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sid_ET.php deleted file mode 100644 index 1296f9b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sid_ET.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - 'weekdays' => ['Sambata', 'Sanyo', 'Maakisanyo', 'Roowe', 'Hamuse', 'Arbe', 'Qidaame'], - 'weekdays_short' => ['Sam', 'San', 'Mak', 'Row', 'Ham', 'Arb', 'Qid'], - 'weekdays_min' => ['Sam', 'San', 'Mak', 'Row', 'Ham', 'Arb', 'Qid'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['soodo', 'hawwaro'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sk.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sk.php deleted file mode 100644 index 08af197..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sk.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Martin Suja - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Ivan Stana - * - Akira Matsuda - * - Christopher Dell - * - James McKinney - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Jozef Fulop - * - Nicolás Hock Isaza - * - Tom Hughes - * - Simon Hürlimann (CyT) - * - jofi - * - Jakub ADAMEC - * - Marek Adamický - * - AlterwebStudio - */ -return [ - 'year' => 'rok|:count roky|:count rokov', - 'y' => ':count r', - 'month' => 'mesiac|:count mesiace|:count mesiacov', - 'm' => ':count m', - 'week' => 'týždeň|:count týždne|:count týždňov', - 'w' => ':count t', - 'day' => 'deň|:count dni|:count dní', - 'd' => ':count d', - 'hour' => 'hodinu|:count hodiny|:count hodín', - 'h' => ':count h', - 'minute' => 'minútu|:count minúty|:count minút', - 'min' => ':count min', - 'second' => 'sekundu|:count sekundy|:count sekúnd', - 'a_second' => 'pár sekúnd|:count sekundy|:count sekúnd', - 's' => ':count s', - 'ago' => 'pred :time', - 'from_now' => 'o :time', - 'after' => ':time po', - 'before' => ':time pred', - 'year_ago' => 'rokom|:count rokmi|:count rokmi', - 'month_ago' => 'mesiacom|:count mesiacmi|:count mesiacmi', - 'week_ago' => 'týždňom|:count týždňami|:count týždňami', - 'day_ago' => 'dňom|:count dňami|:count dňami', - 'hour_ago' => 'hodinou|:count hodinami|:count hodinami', - 'minute_ago' => 'minútou|:count minútami|:count minútami', - 'second_ago' => 'sekundou|:count sekundami|:count sekundami', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' a '], - 'diff_now' => 'teraz', - 'diff_yesterday' => 'včera', - 'diff_tomorrow' => 'zajtra', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'DD. MMMM YYYY', - 'LLL' => 'D. M. HH:mm', - 'LLLL' => 'dddd D. MMMM YYYY HH:mm', - ], - 'weekdays' => ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'], - 'weekdays_short' => ['ned', 'pod', 'uto', 'str', 'štv', 'pia', 'sob'], - 'weekdays_min' => ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'], - 'months' => ['január', 'február', 'marec', 'apríl', 'máj', 'jún', 'júl', 'august', 'september', 'október', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'meridiem' => ['dopoludnia', 'popoludní'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sk_SK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sk_SK.php deleted file mode 100644 index 0515601..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sk_SK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sk.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sl.php deleted file mode 100644 index 1f1d1b3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sl.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Nicolás Hock Isaza - * - Miha Rebernik - * - Gal Jakič (morpheus7CS) - * - Glavić - * - Anže Časar - * - Lovro Tramšek (Lovro1107) - * - burut13 - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count leto|:count leti|:count leta|:count let', - 'y' => ':count leto|:count leti|:count leta|:count let', - 'month' => ':count mesec|:count meseca|:count mesece|:count mesecev', - 'm' => ':count mes.', - 'week' => ':count teden|:count tedna|:count tedne|:count tednov', - 'w' => ':count ted.', - 'day' => ':count dan|:count dni|:count dni|:count dni', - 'd' => ':count dan|:count dni|:count dni|:count dni', - 'hour' => ':count ura|:count uri|:count ure|:count ur', - 'h' => ':count h', - 'minute' => ':count minuta|:count minuti|:count minute|:count minut', - 'min' => ':count min.', - 'second' => ':count sekunda|:count sekundi|:count sekunde|:count sekund', - 'a_second' => '{1}nekaj sekund|:count sekunda|:count sekundi|:count sekunde|:count sekund', - 's' => ':count s', - - 'year_ago' => ':count letom|:count letoma|:count leti|:count leti', - 'y_ago' => ':count letom|:count letoma|:count leti|:count leti', - 'month_ago' => ':count mesecem|:count mesecema|:count meseci|:count meseci', - 'week_ago' => ':count tednom|:count tednoma|:count tedni|:count tedni', - 'day_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', - 'd_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', - 'hour_ago' => ':count uro|:count urama|:count urami|:count urami', - 'minute_ago' => ':count minuto|:count minutama|:count minutami|:count minutami', - 'second_ago' => ':count sekundo|:count sekundama|:count sekundami|:count sekundami', - - 'day_from_now' => ':count dan|:count dneva|:count dni|:count dni', - 'd_from_now' => ':count dan|:count dneva|:count dni|:count dni', - 'hour_from_now' => ':count uro|:count uri|:count ure|:count ur', - 'minute_from_now' => ':count minuto|:count minuti|:count minute|:count minut', - 'second_from_now' => ':count sekundo|:count sekundi|:count sekunde|:count sekund', - - 'ago' => 'pred :time', - 'from_now' => 'čez :time', - 'after' => ':time kasneje', - 'before' => ':time prej', - - 'diff_now' => 'ravnokar', - 'diff_today' => 'danes', - 'diff_today_regexp' => 'danes(?:\\s+ob)?', - 'diff_yesterday' => 'včeraj', - 'diff_yesterday_regexp' => 'včeraj(?:\\s+ob)?', - 'diff_tomorrow' => 'jutri', - 'diff_tomorrow_regexp' => 'jutri(?:\\s+ob)?', - 'diff_before_yesterday' => 'predvčerajšnjim', - 'diff_after_tomorrow' => 'pojutrišnjem', - - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'period_start_date' => 'od :date', - 'period_end_date' => 'do :date', - - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danes ob] LT', - 'nextDay' => '[jutri ob] LT', - 'nextWeek' => 'dddd [ob] LT', - 'lastDay' => '[včeraj ob] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[preteklo] [nedeljo] [ob] LT'; - case 1: - return '[pretekli] [ponedeljek] [ob] LT'; - case 2: - return '[pretekli] [torek] [ob] LT'; - case 3: - return '[preteklo] [sredo] [ob] LT'; - case 4: - return '[pretekli] [četrtek] [ob] LT'; - case 5: - return '[pretekli] [petek] [ob] LT'; - case 6: - return '[preteklo] [soboto] [ob] LT'; - } - }, - 'sameElse' => 'L', - ], - 'months' => ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'], - 'weekdays_short' => ['ned', 'pon', 'tor', 'sre', 'čet', 'pet', 'sob'], - 'weekdays_min' => ['ne', 'po', 'to', 'sr', 'če', 'pe', 'so'], - 'list' => [', ', ' in '], - 'meridiem' => ['dopoldan', 'popoldan'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sl_SI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sl_SI.php deleted file mode 100644 index 5dad8c8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sl_SI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sm.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sm.php deleted file mode 100644 index e8c118a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sm.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/sm_WS.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sm_WS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sm_WS.php deleted file mode 100644 index f066068..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sm_WS.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Ianuari', 'Fepuari', 'Mati', 'Aperila', 'Me', 'Iuni', 'Iulai', 'Auguso', 'Setema', 'Oketopa', 'Novema', 'Tesema'], - 'months_short' => ['Ian', 'Fep', 'Mat', 'Ape', 'Me', 'Iun', 'Iul', 'Aug', 'Set', 'Oke', 'Nov', 'Tes'], - 'weekdays' => ['Aso Sa', 'Aso Gafua', 'Aso Lua', 'Aso Lulu', 'Aso Tofi', 'Aso Farail', 'Aso To\'ana\'i'], - 'weekdays_short' => ['Aso Sa', 'Aso Gaf', 'Aso Lua', 'Aso Lul', 'Aso Tof', 'Aso Far', 'Aso To\''], - 'weekdays_min' => ['Aso Sa', 'Aso Gaf', 'Aso Lua', 'Aso Lul', 'Aso Tof', 'Aso Far', 'Aso To\''], - - 'hour' => ':count uati', // less reliable - 'h' => ':count uati', // less reliable - 'a_hour' => ':count uati', // less reliable - - 'minute' => ':count itiiti', // less reliable - 'min' => ':count itiiti', // less reliable - 'a_minute' => ':count itiiti', // less reliable - - 'second' => ':count lua', // less reliable - 's' => ':count lua', // less reliable - 'a_second' => ':count lua', // less reliable - - 'year' => ':count tausaga', - 'y' => ':count tausaga', - 'a_year' => ':count tausaga', - - 'month' => ':count māsina', - 'm' => ':count māsina', - 'a_month' => ':count māsina', - - 'week' => ':count vaiaso', - 'w' => ':count vaiaso', - 'a_week' => ':count vaiaso', - - 'day' => ':count aso', - 'd' => ':count aso', - 'a_day' => ':count aso', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/smn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/smn.php deleted file mode 100644 index 20add02..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/smn.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['ip.', 'ep.'], - 'weekdays' => ['pasepeeivi', 'vuossaargâ', 'majebaargâ', 'koskoho', 'tuorâstuv', 'vástuppeeivi', 'lávurduv'], - 'weekdays_short' => ['pas', 'vuo', 'maj', 'kos', 'tuo', 'vás', 'láv'], - 'weekdays_min' => ['pa', 'vu', 'ma', 'ko', 'tu', 'vá', 'lá'], - 'weekdays_standalone' => ['pasepeivi', 'vuossargâ', 'majebargâ', 'koskokko', 'tuorâstâh', 'vástuppeivi', 'lávurdâh'], - 'months' => ['uđđâivemáánu', 'kuovâmáánu', 'njuhčâmáánu', 'cuáŋuimáánu', 'vyesimáánu', 'kesimáánu', 'syeinimáánu', 'porgemáánu', 'čohčâmáánu', 'roovvâdmáánu', 'skammâmáánu', 'juovlâmáánu'], - 'months_short' => ['uđiv', 'kuovâ', 'njuhčâ', 'cuáŋui', 'vyesi', 'kesi', 'syeini', 'porge', 'čohčâ', 'roovvâd', 'skammâ', 'juovlâ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'H.mm', - 'LTS' => 'H.mm.ss', - 'L' => 'D.M.YYYY', - 'LL' => 'MMM D. YYYY', - 'LLL' => 'MMMM D. YYYY H.mm', - 'LLLL' => 'dddd, MMMM D. YYYY H.mm', - ], - - 'hour' => ':count äigi', // less reliable - 'h' => ':count äigi', // less reliable - 'a_hour' => ':count äigi', // less reliable - - 'year' => ':count ihe', - 'y' => ':count ihe', - 'a_year' => ':count ihe', - - 'month' => ':count mánuppaje', - 'm' => ':count mánuppaje', - 'a_month' => ':count mánuppaje', - - 'week' => ':count okko', - 'w' => ':count okko', - 'a_week' => ':count okko', - - 'day' => ':count peivi', - 'd' => ':count peivi', - 'a_day' => ':count peivi', - - 'minute' => ':count miinut', - 'min' => ':count miinut', - 'a_minute' => ':count miinut', - - 'second' => ':count nubbe', - 's' => ':count nubbe', - 'a_second' => ':count nubbe', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sn.php deleted file mode 100644 index 4f25028..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sn.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['a', 'p'], - 'weekdays' => ['Svondo', 'Muvhuro', 'Chipiri', 'Chitatu', 'China', 'Chishanu', 'Mugovera'], - 'weekdays_short' => ['Svo', 'Muv', 'Chp', 'Cht', 'Chn', 'Chs', 'Mug'], - 'weekdays_min' => ['Sv', 'Mu', 'Cp', 'Ct', 'Cn', 'Cs', 'Mg'], - 'months' => ['Ndira', 'Kukadzi', 'Kurume', 'Kubvumbi', 'Chivabvu', 'Chikumi', 'Chikunguru', 'Nyamavhuvhu', 'Gunyana', 'Gumiguru', 'Mbudzi', 'Zvita'], - 'months_short' => ['Ndi', 'Kuk', 'Kur', 'Kub', 'Chv', 'Chk', 'Chg', 'Nya', 'Gun', 'Gum', 'Mbu', 'Zvi'], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => 'makore :count', - 'y' => 'makore :count', - 'a_year' => 'makore :count', - - 'month' => 'mwedzi :count', - 'm' => 'mwedzi :count', - 'a_month' => 'mwedzi :count', - - 'week' => 'vhiki :count', - 'w' => 'vhiki :count', - 'a_week' => 'vhiki :count', - - 'day' => 'mazuva :count', - 'd' => 'mazuva :count', - 'a_day' => 'mazuva :count', - - 'hour' => 'maawa :count', - 'h' => 'maawa :count', - 'a_hour' => 'maawa :count', - - 'minute' => 'minitsi :count', - 'min' => 'minitsi :count', - 'a_minute' => 'minitsi :count', - - 'second' => 'sekonzi :count', - 's' => 'sekonzi :count', - 'a_second' => 'sekonzi :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/so.php b/dependencies/nesbot/carbon/src/Carbon/Lang/so.php deleted file mode 100644 index 5785271..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/so.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Author: - * - Abdifatah Abdilahi(@abdifatahz) - */ -return [ - 'year' => ':count sanad|:count sanadood', - 'a_year' => 'sanad|:count sanadood', - 'y' => '{1}:countsn|{0}:countsns|]1,Inf[:countsn', - 'month' => ':count bil|:count bilood', - 'a_month' => 'bil|:count bilood', - 'm' => ':countbil', - 'week' => ':count isbuuc', - 'a_week' => 'isbuuc|:count isbuuc', - 'w' => ':countis', - 'day' => ':count maalin|:count maalmood', - 'a_day' => 'maalin|:count maalmood', - 'd' => ':countml', - 'hour' => ':count saac', - 'a_hour' => 'saacad|:count saac', - 'h' => ':countsc', - 'minute' => ':count daqiiqo', - 'a_minute' => 'daqiiqo|:count daqiiqo', - 'min' => ':countdq', - 'second' => ':count ilbidhiqsi', - 'a_second' => 'xooga ilbidhiqsiyo|:count ilbidhiqsi', - 's' => ':countil', - 'ago' => ':time kahor', - 'from_now' => ':time gudahood', - 'after' => ':time kedib', - 'before' => ':time kahor', - 'diff_now' => 'hada', - 'diff_today' => 'maanta', - 'diff_today_regexp' => 'maanta(?:\s+markay\s+(?:tahay|ahayd))?', - 'diff_yesterday' => 'shalayto', - 'diff_yesterday_regexp' => 'shalayto(?:\s+markay\s+ahayd)?', - 'diff_tomorrow' => 'beri', - 'diff_tomorrow_regexp' => 'beri(?:\s+markay\s+tahay)?', - 'diff_before_yesterday' => 'doraato', - 'diff_after_tomorrow' => 'saadanbe', - 'period_recurrences' => 'mar|:count jeer', - 'period_interval' => ':interval kasta', - 'period_start_date' => 'laga bilaabo :date', - 'period_end_date' => 'ilaa :date', - 'months' => ['Janaayo', 'Febraayo', 'Abriil', 'Maajo', 'Juun', 'Luuliyo', 'Agoosto', 'Sebteembar', 'Oktoobar', 'Nofeembar', 'Diseembar'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Abr', 'Mjo', 'Jun', 'Lyo', 'Agt', 'Seb', 'Okt', 'Nof', 'Dis'], - 'weekdays' => ['Axad', 'Isniin', 'Talaada', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'], - 'weekdays_short' => ['Axd', 'Isn', 'Tal', 'Arb', 'Kha', 'Jim', 'Sbt'], - 'weekdays_min' => ['Ax', 'Is', 'Ta', 'Ar', 'Kh', 'Ji', 'Sa'], - 'list' => [', ', ' and '], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'calendar' => [ - 'sameDay' => '[Maanta markay tahay] LT', - 'nextDay' => '[Beri markay tahay] LT', - 'nextWeek' => 'dddd [markay tahay] LT', - 'lastDay' => '[Shalay markay ahayd] LT', - 'lastWeek' => '[Hore] dddd [Markay ahayd] LT', - 'sameElse' => 'L', - ], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/so_DJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/so_DJ.php deleted file mode 100644 index 273dda8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/so_DJ.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/so.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/so_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/so_ET.php deleted file mode 100644 index 7b69971..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/so_ET.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return require __DIR__.'/so.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/so_KE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/so_KE.php deleted file mode 100644 index 7b69971..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/so_KE.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return require __DIR__.'/so.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/so_SO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/so_SO.php deleted file mode 100644 index 7b69971..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/so_SO.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return require __DIR__.'/so.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sq.php deleted file mode 100644 index ffa592e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sq.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - JD Isaacks - * - Fadion Dashi - */ -return [ - 'year' => ':count vit|:count vjet', - 'a_year' => 'një vit|:count vite', - 'y' => ':count v.', - 'month' => ':count muaj', - 'a_month' => 'një muaj|:count muaj', - 'm' => ':count muaj', - 'week' => ':count javë', - 'a_week' => ':count javë|:count javë', - 'w' => ':count j.', - 'day' => ':count ditë', - 'a_day' => 'një ditë|:count ditë', - 'd' => ':count d.', - 'hour' => ':count orë', - 'a_hour' => 'një orë|:count orë', - 'h' => ':count o.', - 'minute' => ':count minutë|:count minuta', - 'a_minute' => 'një minutë|:count minuta', - 'min' => ':count min.', - 'second' => ':count sekondë|:count sekonda', - 'a_second' => 'disa sekonda|:count sekonda', - 's' => ':count s.', - 'ago' => ':time më parë', - 'from_now' => 'në :time', - 'after' => ':time pas', - 'before' => ':time para', - 'diff_now' => 'tani', - 'diff_today' => 'Sot', - 'diff_today_regexp' => 'Sot(?:\\s+në)?', - 'diff_yesterday' => 'dje', - 'diff_yesterday_regexp' => 'Dje(?:\\s+në)?', - 'diff_tomorrow' => 'nesër', - 'diff_tomorrow_regexp' => 'Nesër(?:\\s+në)?', - 'diff_before_yesterday' => 'pardje', - 'diff_after_tomorrow' => 'pasnesër', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Sot në] LT', - 'nextDay' => '[Nesër në] LT', - 'nextWeek' => 'dddd [në] LT', - 'lastDay' => '[Dje në] LT', - 'lastWeek' => 'dddd [e kaluar në] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'meridiem' => ['PD', 'MD'], - 'months' => ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'], - 'months_short' => ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'kor', 'gus', 'sht', 'tet', 'nën', 'dhj'], - 'weekdays' => ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'], - 'weekdays_short' => ['die', 'hën', 'mar', 'mër', 'enj', 'pre', 'sht'], - 'weekdays_min' => ['d', 'h', 'ma', 'më', 'e', 'p', 'sh'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' dhe '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sq_AL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sq_AL.php deleted file mode 100644 index ea5df3f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sq_AL.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sq.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sq_MK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sq_MK.php deleted file mode 100644 index 62f752c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sq_MK.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sq.php', [ - 'formats' => [ - 'L' => 'D.M.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sq_XK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sq_XK.php deleted file mode 100644 index 62f752c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sq_XK.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sq.php', [ - 'formats' => [ - 'L' => 'D.M.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr.php deleted file mode 100644 index 68ba663..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - Glavić - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count godina|:count godine|:count godina', - 'y' => ':count g.', - 'month' => ':count mesec|:count meseca|:count meseci', - 'm' => ':count mj.', - 'week' => ':count nedelja|:count nedelje|:count nedelja', - 'w' => ':count ned.', - 'day' => ':count dan|:count dana|:count dana', - 'd' => ':count d.', - 'hour' => ':count sat|:count sata|:count sati', - 'h' => ':count č.', - 'minute' => ':count minut|:count minuta|:count minuta', - 'min' => ':count min.', - 'second' => ':count sekundu|:count sekunde|:count sekundi', - 's' => ':count sek.', - 'ago' => 'pre :time', - 'from_now' => 'za :time', - 'after' => 'nakon :time', - 'before' => 'pre :time', - - 'year_from_now' => ':count godinu|:count godine|:count godina', - 'year_ago' => ':count godinu|:count godine|:count godina', - 'week_from_now' => ':count nedelju|:count nedelje|:count nedelja', - 'week_ago' => ':count nedelju|:count nedelje|:count nedelja', - - 'diff_now' => 'upravo sada', - 'diff_today' => 'danas', - 'diff_today_regexp' => 'danas(?:\\s+u)?', - 'diff_yesterday' => 'juče', - 'diff_yesterday_regexp' => 'juče(?:\\s+u)?', - 'diff_tomorrow' => 'sutra', - 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', - 'diff_before_yesterday' => 'prekjuče', - 'diff_after_tomorrow' => 'preksutra', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[danas u] LT', - 'nextDay' => '[sutra u] LT', - 'nextWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[u nedelju u] LT'; - case 3: - return '[u sredu u] LT'; - case 6: - return '[u subotu u] LT'; - default: - return '[u] dddd [u] LT'; - } - }, - 'lastDay' => '[juče u] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[prošle nedelje u] LT'; - case 1: - return '[prošlog ponedeljka u] LT'; - case 2: - return '[prošlog utorka u] LT'; - case 3: - return '[prošle srede u] LT'; - case 4: - return '[prošlog četvrtka u] LT'; - case 5: - return '[prošlog petka u] LT'; - default: - return '[prošle subote u] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], - 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], - 'weekdays' => ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'], - 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php deleted file mode 100644 index 8becbc5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - shaishavgandhi05 - * - Serhan Apaydın - * - JD Isaacks - * - Glavić - * - Nikola Zeravcic - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; - -return [ - 'year' => ':count година|:count године|:count година', - 'y' => ':count г.', - 'month' => ':count месец|:count месеца|:count месеци', - 'm' => ':count м.', - 'week' => ':count недеља|:count недеље|:count недеља', - 'w' => ':count нед.', - 'day' => ':count дан|:count дана|:count дана', - 'd' => ':count д.', - 'hour' => ':count сат|:count сата|:count сати', - 'h' => ':count ч.', - 'minute' => ':count минут|:count минута|:count минута', - 'min' => ':count мин.', - 'second' => ':count секунд|:count секунде|:count секунди', - 's' => ':count сек.', - 'ago' => 'пре :time', - 'from_now' => 'за :time', - 'after' => ':time након', - 'before' => ':time пре', - 'year_from_now' => ':count годину|:count године|:count година', - 'year_ago' => ':count годину|:count године|:count година', - 'week_from_now' => ':count недељу|:count недеље|:count недеља', - 'week_ago' => ':count недељу|:count недеље|:count недеља', - 'diff_now' => 'управо сада', - 'diff_today' => 'данас', - 'diff_today_regexp' => 'данас(?:\\s+у)?', - 'diff_yesterday' => 'јуче', - 'diff_yesterday_regexp' => 'јуче(?:\\s+у)?', - 'diff_tomorrow' => 'сутра', - 'diff_tomorrow_regexp' => 'сутра(?:\\s+у)?', - 'diff_before_yesterday' => 'прекјуче', - 'diff_after_tomorrow' => 'прекосутра', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[данас у] LT', - 'nextDay' => '[сутра у] LT', - 'nextWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[у недељу у] LT'; - case 3: - return '[у среду у] LT'; - case 6: - return '[у суботу у] LT'; - default: - return '[у] dddd [у] LT'; - } - }, - 'lastDay' => '[јуче у] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[прошле недеље у] LT'; - case 1: - return '[прошлог понедељка у] LT'; - case 2: - return '[прошлог уторка у] LT'; - case 3: - return '[прошле среде у] LT'; - case 4: - return '[прошлог четвртка у] LT'; - case 5: - return '[прошлог петка у] LT'; - default: - return '[прошле суботе у] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], - 'months_short' => ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], - 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], - 'weekdays_min' => ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['АМ', 'ПМ'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php deleted file mode 100644 index 4b29a45..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Cyrl_BA'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Cyrl.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D.M.yy.', - 'LL' => 'DD.MM.YYYY.', - 'LLL' => 'DD. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', - ], - 'weekdays' => ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед.', 'пон.', 'ут.', 'ср.', 'чет.', 'пет.', 'суб.'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php deleted file mode 100644 index 28d22fd..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Glavić - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Cyrl_ME'); -} -// @codeCoverageIgnoreEnd - -return [ - 'year' => ':count година|:count године|:count година', - 'y' => ':count г.', - 'month' => ':count мјесец|:count мјесеца|:count мјесеци', - 'm' => ':count мј.', - 'week' => ':count недјеља|:count недјеље|:count недјеља', - 'w' => ':count нед.', - 'day' => ':count дан|:count дана|:count дана', - 'd' => ':count д.', - 'hour' => ':count сат|:count сата|:count сати', - 'h' => ':count ч.', - 'minute' => ':count минут|:count минута|:count минута', - 'min' => ':count мин.', - 'second' => ':count секунд|:count секунде|:count секунди', - 's' => ':count сек.', - 'ago' => 'прије :time', - 'from_now' => 'за :time', - 'after' => ':time након', - 'before' => ':time прије', - - 'year_from_now' => ':count годину|:count године|:count година', - 'year_ago' => ':count годину|:count године|:count година', - - 'week_from_now' => ':count недјељу|:count недјеље|:count недјеља', - 'week_ago' => ':count недјељу|:count недјеље|:count недјеља', - - 'diff_now' => 'управо сада', - 'diff_today' => 'данас', - 'diff_today_regexp' => 'данас(?:\\s+у)?', - 'diff_yesterday' => 'јуче', - 'diff_yesterday_regexp' => 'јуче(?:\\s+у)?', - 'diff_tomorrow' => 'сутра', - 'diff_tomorrow_regexp' => 'сутра(?:\\s+у)?', - 'diff_before_yesterday' => 'прекјуче', - 'diff_after_tomorrow' => 'прекосјутра', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM YYYY', - 'LLL' => 'D. MMMM YYYY H:mm', - 'LLLL' => 'dddd, D. MMMM YYYY H:mm', - ], - 'calendar' => [ - 'sameDay' => '[данас у] LT', - 'nextDay' => '[сутра у] LT', - 'nextWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[у недељу у] LT'; - case 3: - return '[у среду у] LT'; - case 6: - return '[у суботу у] LT'; - default: - return '[у] dddd [у] LT'; - } - }, - 'lastDay' => '[јуче у] LT', - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[прошле недеље у] LT'; - case 1: - return '[прошлог понедељка у] LT'; - case 2: - return '[прошлог уторка у] LT'; - case 3: - return '[прошле среде у] LT'; - case 4: - return '[прошлог четвртка у] LT'; - case 5: - return '[прошлог петка у] LT'; - default: - return '[прошле суботе у] LT'; - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], - 'months_short' => ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], - 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], - 'weekdays_short' => ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], - 'weekdays_min' => ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' и '], - 'meridiem' => ['АМ', 'ПМ'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php deleted file mode 100644 index d6e29b8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Cyrl_XK'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Cyrl_BA.php', [ - 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn.php deleted file mode 100644 index 9971674..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php deleted file mode 100644 index 95b2770..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Latn_BA'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Latn.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D.M.yy.', - 'LL' => 'DD.MM.YYYY.', - 'LLL' => 'DD. MMMM YYYY. HH:mm', - 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', - ], - 'weekdays' => ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php deleted file mode 100644 index 5b8f2d0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Glavić - * - Milos Sakovic - */ - -use Carbon\CarbonInterface; -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Latn_ME'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr.php', [ - 'month' => ':count mjesec|:count mjeseca|:count mjeseci', - 'week' => ':count nedjelja|:count nedjelje|:count nedjelja', - 'second' => ':count sekund|:count sekunde|:count sekundi', - 'ago' => 'prije :time', - 'from_now' => 'za :time', - 'after' => ':time nakon', - 'before' => ':time prije', - 'week_from_now' => ':count nedjelju|:count nedjelje|:count nedjelja', - 'week_ago' => ':count nedjelju|:count nedjelje|:count nedjelja', - 'second_ago' => ':count sekund|:count sekunde|:count sekundi', - 'diff_tomorrow' => 'sjutra', - 'calendar' => [ - 'nextDay' => '[sjutra u] LT', - 'nextWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[u nedjelju u] LT'; - case 3: - return '[u srijedu u] LT'; - case 6: - return '[u subotu u] LT'; - default: - return '[u] dddd [u] LT'; - } - }, - 'lastWeek' => function (CarbonInterface $date) { - switch ($date->dayOfWeek) { - case 0: - return '[prošle nedjelje u] LT'; - case 1: - return '[prošle nedjelje u] LT'; - case 2: - return '[prošlog utorka u] LT'; - case 3: - return '[prošle srijede u] LT'; - case 4: - return '[prošlog četvrtka u] LT'; - case 5: - return '[prošlog petka u] LT'; - default: - return '[prošle subote u] LT'; - } - }, - ], - 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], - 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php deleted file mode 100644 index 5278e2e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Component\Translation\PluralizationRules; - -// @codeCoverageIgnoreStart -if (class_exists(PluralizationRules::class)) { - PluralizationRules::set(static function ($number) { - return PluralizationRules::get($number, 'sr'); - }, 'sr_Latn_XK'); -} -// @codeCoverageIgnoreEnd - -return array_replace_recursive(require __DIR__.'/sr_Latn_BA.php', [ - 'weekdays' => ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_ME.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_ME.php deleted file mode 100644 index d7c65b9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_ME.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sr_Latn_ME.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS.php deleted file mode 100644 index bc5e04b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - sr_YU, sr_CS locale Danilo Segan bug-glibc-locales@gnu.org - */ -return require __DIR__.'/sr_Cyrl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php deleted file mode 100644 index 9971674..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ss.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ss.php deleted file mode 100644 index 1c52c9b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ss.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Nicolai Davies - */ -return [ - 'year' => '{1}umnyaka|:count iminyaka', - 'month' => '{1}inyanga|:count tinyanga', - 'week' => '{1}:count liviki|:count emaviki', - 'day' => '{1}lilanga|:count emalanga', - 'hour' => '{1}lihora|:count emahora', - 'minute' => '{1}umzuzu|:count emizuzu', - 'second' => '{1}emizuzwana lomcane|:count mzuzwana', - 'ago' => 'wenteka nga :time', - 'from_now' => 'nga :time', - 'diff_yesterday' => 'Itolo', - 'diff_yesterday_regexp' => 'Itolo(?:\\s+nga)?', - 'diff_today' => 'Namuhla', - 'diff_today_regexp' => 'Namuhla(?:\\s+nga)?', - 'diff_tomorrow' => 'Kusasa', - 'diff_tomorrow_regexp' => 'Kusasa(?:\\s+nga)?', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'calendar' => [ - 'sameDay' => '[Namuhla nga] LT', - 'nextDay' => '[Kusasa nga] LT', - 'nextWeek' => 'dddd [nga] LT', - 'lastDay' => '[Itolo nga] LT', - 'lastWeek' => 'dddd [leliphelile] [nga] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - $lastDigit = $number % 10; - - return $number.( - ((int) ($number % 100 / 10) === 1) ? 'e' : ( - ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' - ) - ); - }, - 'meridiem' => function ($hour) { - if ($hour < 11) { - return 'ekuseni'; - } - if ($hour < 15) { - return 'emini'; - } - if ($hour < 19) { - return 'entsambama'; - } - - return 'ebusuku'; - }, - 'months' => ['Bhimbidvwane', 'Indlovana', 'Indlov\'lenkhulu', 'Mabasa', 'Inkhwekhweti', 'Inhlaba', 'Kholwane', 'Ingci', 'Inyoni', 'Imphala', 'Lweti', 'Ingongoni'], - 'months_short' => ['Bhi', 'Ina', 'Inu', 'Mab', 'Ink', 'Inh', 'Kho', 'Igc', 'Iny', 'Imp', 'Lwe', 'Igo'], - 'weekdays' => ['Lisontfo', 'Umsombuluko', 'Lesibili', 'Lesitsatfu', 'Lesine', 'Lesihlanu', 'Umgcibelo'], - 'weekdays_short' => ['Lis', 'Umb', 'Lsb', 'Les', 'Lsi', 'Lsh', 'Umg'], - 'weekdays_min' => ['Li', 'Us', 'Lb', 'Lt', 'Ls', 'Lh', 'Ug'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ss_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ss_ZA.php deleted file mode 100644 index ba89527..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ss_ZA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/ss.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/st.php b/dependencies/nesbot/carbon/src/Carbon/Lang/st.php deleted file mode 100644 index b065445..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/st.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/st_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/st_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/st_ZA.php deleted file mode 100644 index 5bce7f2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/st_ZA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Pherekgong', 'Hlakola', 'Tlhakubele', 'Mmese', 'Motsheanong', 'Phupjane', 'Phupu', 'Phato', 'Leotse', 'Mphalane', 'Pudungwana', 'Tshitwe'], - 'months_short' => ['Phe', 'Hla', 'TlH', 'Mme', 'Mot', 'Jan', 'Upu', 'Pha', 'Leo', 'Mph', 'Pud', 'Tsh'], - 'weekdays' => ['Sontaha', 'Mantaha', 'Labobedi', 'Laboraro', 'Labone', 'Labohlano', 'Moqebelo'], - 'weekdays_short' => ['Son', 'Mma', 'Bed', 'Rar', 'Ne', 'Hla', 'Moq'], - 'weekdays_min' => ['Son', 'Mma', 'Bed', 'Rar', 'Ne', 'Hla', 'Moq'], - 'day_of_first_week_of_year' => 1, - - 'week' => ':count Sontaha', // less reliable - 'w' => ':count Sontaha', // less reliable - 'a_week' => ':count Sontaha', // less reliable - - 'day' => ':count letsatsi', // less reliable - 'd' => ':count letsatsi', // less reliable - 'a_day' => ':count letsatsi', // less reliable - - 'hour' => ':count sešupanako', // less reliable - 'h' => ':count sešupanako', // less reliable - 'a_hour' => ':count sešupanako', // less reliable - - 'minute' => ':count menyane', // less reliable - 'min' => ':count menyane', // less reliable - 'a_minute' => ':count menyane', // less reliable - - 'second' => ':count thusa', // less reliable - 's' => ':count thusa', // less reliable - 'a_second' => ':count thusa', // less reliable - - 'year' => ':count selemo', - 'y' => ':count selemo', - 'a_year' => ':count selemo', - - 'month' => ':count kgwedi', - 'm' => ':count kgwedi', - 'a_month' => ':count kgwedi', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sv.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sv.php deleted file mode 100644 index 1706c71..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sv.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Kristoffer Snabb - * - JD Isaacks - * - Jens Herlevsen - * - Nightpine - * - Anders Nygren (litemerafrukt) - */ -return [ - 'year' => ':count år', - 'a_year' => 'ett år|:count år', - 'y' => ':count år', - 'month' => ':count månad|:count månader', - 'a_month' => 'en månad|:count månader', - 'm' => ':count mån', - 'week' => ':count vecka|:count veckor', - 'a_week' => 'en vecka|:count veckor', - 'w' => ':count v', - 'day' => ':count dag|:count dagar', - 'a_day' => 'en dag|:count dagar', - 'd' => ':count dgr', - 'hour' => ':count timme|:count timmar', - 'a_hour' => 'en timme|:count timmar', - 'h' => ':count tim', - 'minute' => ':count minut|:count minuter', - 'a_minute' => 'en minut|:count minuter', - 'min' => ':count min', - 'second' => ':count sekund|:count sekunder', - 'a_second' => 'några sekunder|:count sekunder', - 's' => ':count s', - 'ago' => 'för :time sedan', - 'from_now' => 'om :time', - 'after' => ':time efter', - 'before' => ':time före', - 'diff_now' => 'nu', - 'diff_today' => 'I dag', - 'diff_yesterday' => 'i går', - 'diff_yesterday_regexp' => 'I går', - 'diff_tomorrow' => 'i morgon', - 'diff_tomorrow_regexp' => 'I morgon', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY [kl.] HH:mm', - 'LLLL' => 'dddd D MMMM YYYY [kl.] HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[I dag] LT', - 'nextDay' => '[I morgon] LT', - 'nextWeek' => '[På] dddd LT', - 'lastDay' => '[I går] LT', - 'lastWeek' => '[I] dddd[s] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - $lastDigit = $number % 10; - - return $number.( - ((int) ($number % 100 / 10) === 1) ? 'e' : ( - ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' - ) - ); - }, - 'months' => ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], - 'weekdays' => ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'], - 'weekdays_short' => ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'], - 'weekdays_min' => ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' och '], - 'meridiem' => ['fm', 'em'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sv_AX.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sv_AX.php deleted file mode 100644 index 70cc558..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sv_AX.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sv.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-dd', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sv_FI.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sv_FI.php deleted file mode 100644 index d7182c8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sv_FI.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sv.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sv_SE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sv_SE.php deleted file mode 100644 index d7182c8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sv_SE.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/sv.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sw.php deleted file mode 100644 index f8630d5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sw.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - leyluj - * - Josh Soref - * - ryanhart2 - */ -return [ - 'year' => 'mwaka :count|miaka :count', - 'a_year' => 'mwaka mmoja|miaka :count', - 'y' => 'mwaka :count|miaka :count', - 'month' => 'mwezi :count|miezi :count', - 'a_month' => 'mwezi mmoja|miezi :count', - 'm' => 'mwezi :count|miezi :count', - 'week' => 'wiki :count', - 'a_week' => 'wiki mmoja|wiki :count', - 'w' => 'w. :count', - 'day' => 'siku :count', - 'a_day' => 'siku moja|masiku :count', - 'd' => 'si. :count', - 'hour' => 'saa :count|masaa :count', - 'a_hour' => 'saa limoja|masaa :count', - 'h' => 'saa :count|masaa :count', - 'minute' => 'dakika :count', - 'a_minute' => 'dakika moja|dakika :count', - 'min' => 'd. :count', - 'second' => 'sekunde :count', - 'a_second' => 'hivi punde|sekunde :count', - 's' => 'se. :count', - 'ago' => 'tokea :time', - 'from_now' => ':time baadaye', - 'after' => ':time baada', - 'before' => ':time kabla', - 'diff_now' => 'sasa hivi', - 'diff_today' => 'leo', - 'diff_today_regexp' => 'leo(?:\\s+saa)?', - 'diff_yesterday' => 'jana', - 'diff_tomorrow' => 'kesho', - 'diff_tomorrow_regexp' => 'kesho(?:\\s+saa)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[leo saa] LT', - 'nextDay' => '[kesho saa] LT', - 'nextWeek' => '[wiki ijayo] dddd [saat] LT', - 'lastDay' => '[jana] LT', - 'lastWeek' => '[wiki iliyopita] dddd [saat] LT', - 'sameElse' => 'L', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpl', 'Jtat', 'Jnne', 'Jtan', 'Alh', 'Ijm', 'Jmos'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' na '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_CD.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sw_CD.php deleted file mode 100644 index ec9117b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_CD.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_KE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sw_KE.php deleted file mode 100644 index 2ace0db..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_KE.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kamusi Project Martin Benjamin locales@kamusi.org - */ -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['asubuhi', 'alasiri'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_TZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sw_TZ.php deleted file mode 100644 index fab3cd6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_TZ.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kamusi Project Martin Benjamin locales@kamusi.org - */ -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['asubuhi', 'alasiri'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_UG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/sw_UG.php deleted file mode 100644 index ec9117b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/sw_UG.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/sw.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/szl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/szl.php deleted file mode 100644 index 4429c4f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/szl.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/szl_PL.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/szl_PL.php b/dependencies/nesbot/carbon/src/Carbon/Lang/szl_PL.php deleted file mode 100644 index 9adddcf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/szl_PL.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - szl_PL locale Przemyslaw Buczkowski libc-alpha@sourceware.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['styczyń', 'luty', 'merc', 'kwjeciyń', 'moj', 'czyrwjyń', 'lipjyń', 'siyrpjyń', 'wrzesiyń', 'październik', 'listopad', 'grudziyń'], - 'months_short' => ['sty', 'lut', 'mer', 'kwj', 'moj', 'czy', 'lip', 'siy', 'wrz', 'paź', 'lis', 'gru'], - 'weekdays' => ['niydziela', 'pyńdziŏek', 'wtŏrek', 'strzŏda', 'sztwortek', 'pjōntek', 'sobŏta'], - 'weekdays_short' => ['niy', 'pyń', 'wtŏ', 'str', 'szt', 'pjō', 'sob'], - 'weekdays_min' => ['niy', 'pyń', 'wtŏ', 'str', 'szt', 'pjō', 'sob'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count rok', - 'y' => ':count rok', - 'a_year' => ':count rok', - - 'month' => ':count mjeśůnc', - 'm' => ':count mjeśůnc', - 'a_month' => ':count mjeśůnc', - - 'week' => ':count tydźyń', - 'w' => ':count tydźyń', - 'a_week' => ':count tydźyń', - - 'day' => ':count dźyń', - 'd' => ':count dźyń', - 'a_day' => ':count dźyń', - - 'hour' => ':count godzina', - 'h' => ':count godzina', - 'a_hour' => ':count godzina', - - 'minute' => ':count minuta', - 'min' => ':count minuta', - 'a_minute' => ':count minuta', - - 'second' => ':count sekůnda', - 's' => ':count sekůnda', - 'a_second' => ':count sekůnda', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ta.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ta.php deleted file mode 100644 index c1d89cb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ta.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - François B - * - JD Isaacks - * - Satheez - */ -return [ - 'year' => ':count வருடம்|:count ஆண்டுகள்', - 'a_year' => 'ஒரு வருடம்|:count ஆண்டுகள்', - 'y' => ':count வருட.|:count ஆண்.', - 'month' => ':count மாதம்|:count மாதங்கள்', - 'a_month' => 'ஒரு மாதம்|:count மாதங்கள்', - 'm' => ':count மாத.', - 'week' => ':count வாரம்|:count வாரங்கள்', - 'a_week' => 'ஒரு வாரம்|:count வாரங்கள்', - 'w' => ':count வார.', - 'day' => ':count நாள்|:count நாட்கள்', - 'a_day' => 'ஒரு நாள்|:count நாட்கள்', - 'd' => ':count நாள்|:count நாட்.', - 'hour' => ':count மணி நேரம்|:count மணி நேரம்', - 'a_hour' => 'ஒரு மணி நேரம்|:count மணி நேரம்', - 'h' => ':count மணி.', - 'minute' => ':count நிமிடம்|:count நிமிடங்கள்', - 'a_minute' => 'ஒரு நிமிடம்|:count நிமிடங்கள்', - 'min' => ':count நிமி.', - 'second' => ':count சில விநாடிகள்|:count விநாடிகள்', - 'a_second' => 'ஒரு சில விநாடிகள்|:count விநாடிகள்', - 's' => ':count விநா.', - 'ago' => ':time முன்', - 'from_now' => ':time இல்', - 'before' => ':time முன்', - 'after' => ':time பின்', - 'diff_now' => 'இப்போது', - 'diff_today' => 'இன்று', - 'diff_yesterday' => 'நேற்று', - 'diff_tomorrow' => 'நாளை', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[இன்று] LT', - 'nextDay' => '[நாளை] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[நேற்று] LT', - 'lastWeek' => '[கடந்த வாரம்] dddd, LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberவது', - 'meridiem' => function ($hour) { - if ($hour < 2) { - return ' யாமம்'; - } - if ($hour < 6) { - return ' வைகறை'; - } - if ($hour < 10) { - return ' காலை'; - } - if ($hour < 14) { - return ' நண்பகல்'; - } - if ($hour < 18) { - return ' எற்பாடு'; - } - if ($hour < 22) { - return ' மாலை'; - } - - return ' யாமம்'; - }, - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டெம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டெம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'weekdays' => ['ஞாயிற்றுக்கிழமை', 'திங்கட்கிழமை', 'செவ்வாய்கிழமை', 'புதன்கிழமை', 'வியாழக்கிழமை', 'வெள்ளிக்கிழமை', 'சனிக்கிழமை'], - 'weekdays_short' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' மற்றும் '], - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ta_IN.php deleted file mode 100644 index 492d4c5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_IN.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['காலை', 'மாலை'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_LK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ta_LK.php deleted file mode 100644 index 8e2afbf..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_LK.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - J.Yogaraj 94-777-315206 yogaraj.ubuntu@gmail.com - */ -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன', 'பிப்', 'மார்', 'ஏப்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக', 'செப்', 'அக்', 'நவ', 'டிச'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['காலை', 'மாலை'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_MY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ta_MY.php deleted file mode 100644 index a6cd8b5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_MY.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'LT' => 'a h:mm', - 'LTS' => 'a h:mm:ss', - 'L' => 'D/M/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY, a h:mm', - 'LLLL' => 'dddd, D MMMM, YYYY, a h:mm', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'first_day_of_week' => 1, - 'meridiem' => ['மு.ப', 'பி.ப'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_SG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ta_SG.php deleted file mode 100644 index 7dbedee..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ta_SG.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'formats' => [ - 'LT' => 'a h:mm', - 'LTS' => 'a h:mm:ss', - 'L' => 'D/M/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY, a h:mm', - 'LLLL' => 'dddd, D MMMM, YYYY, a h:mm', - ], - 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], - 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], - 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], - 'weekdays_short' => ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'], - 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], - 'meridiem' => ['மு.ப', 'பி.ப'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tcy.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tcy.php deleted file mode 100644 index 2eb9905..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tcy.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tcy_IN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tcy_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tcy_IN.php deleted file mode 100644 index 2ff20e0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tcy_IN.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IndLinux.org, Samsung Electronics Co., Ltd. alexey.merzlyakov@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['ಜನವರಿ', 'ಫೆಬ್ರುವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್‌‌', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್‌', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'], - 'months_short' => ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'], - 'weekdays' => ['ಐಥಾರ', 'ಸೋಮಾರ', 'ಅಂಗರೆ', 'ಬುಧಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರರ', 'ಶನಿವಾರ'], - 'weekdays_short' => ['ಐ', 'ಸೋ', 'ಅಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], - 'weekdays_min' => ['ಐ', 'ಸೋ', 'ಅಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ಕಾಂಡೆ', 'ಬಯ್ಯ'], - - 'year' => ':count ನೀರ್', // less reliable - 'y' => ':count ನೀರ್', // less reliable - 'a_year' => ':count ನೀರ್', // less reliable - - 'month' => ':count ಮೀನ್', // less reliable - 'm' => ':count ಮೀನ್', // less reliable - 'a_month' => ':count ಮೀನ್', // less reliable - - 'day' => ':count ಸುಗ್ಗಿ', // less reliable - 'd' => ':count ಸುಗ್ಗಿ', // less reliable - 'a_day' => ':count ಸುಗ್ಗಿ', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/te.php b/dependencies/nesbot/carbon/src/Carbon/Lang/te.php deleted file mode 100644 index ac38218..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/te.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - Josh Soref - * - François B - * - kc - */ -return [ - 'year' => ':count సంవత్సరం|:count సంవత్సరాలు', - 'a_year' => 'ఒక సంవత్సరం|:count సంవత్సరాలు', - 'y' => ':count సం.', - 'month' => ':count నెల|:count నెలలు', - 'a_month' => 'ఒక నెల|:count నెలలు', - 'm' => ':count నెల|:count నెల.', - 'week' => ':count వారం|:count వారాలు', - 'a_week' => 'ఒక వారం|:count వారాలు', - 'w' => ':count వార.|:count వారా.', - 'day' => ':count రోజు|:count రోజులు', - 'a_day' => 'ఒక రోజు|:count రోజులు', - 'd' => ':count రోజు|:count రోజు.', - 'hour' => ':count గంట|:count గంటలు', - 'a_hour' => 'ఒక గంట|:count గంటలు', - 'h' => ':count గం.', - 'minute' => ':count నిమిషం|:count నిమిషాలు', - 'a_minute' => 'ఒక నిమిషం|:count నిమిషాలు', - 'min' => ':count నిమి.', - 'second' => ':count సెకను|:count సెకన్లు', - 'a_second' => 'కొన్ని క్షణాలు|:count సెకన్లు', - 's' => ':count సెక.', - 'ago' => ':time క్రితం', - 'from_now' => ':time లో', - 'diff_now' => 'ప్రస్తుతం', - 'diff_today' => 'నేడు', - 'diff_yesterday' => 'నిన్న', - 'diff_tomorrow' => 'రేపు', - 'formats' => [ - 'LT' => 'A h:mm', - 'LTS' => 'A h:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, A h:mm', - 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', - ], - 'calendar' => [ - 'sameDay' => '[నేడు] LT', - 'nextDay' => '[రేపు] LT', - 'nextWeek' => 'dddd, LT', - 'lastDay' => '[నిన్న] LT', - 'lastWeek' => '[గత] dddd, LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberవ', - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'రాత్రి'; - } - if ($hour < 10) { - return 'ఉదయం'; - } - if ($hour < 17) { - return 'మధ్యాహ్నం'; - } - if ($hour < 20) { - return 'సాయంత్రం'; - } - - return ' రాత్రి'; - }, - 'months' => ['జనవరి', 'ఫిబ్రవరి', 'మార్చి', 'ఏప్రిల్', 'మే', 'జూన్', 'జూలై', 'ఆగస్టు', 'సెప్టెంబర్', 'అక్టోబర్', 'నవంబర్', 'డిసెంబర్'], - 'months_short' => ['జన.', 'ఫిబ్ర.', 'మార్చి', 'ఏప్రి.', 'మే', 'జూన్', 'జూలై', 'ఆగ.', 'సెప్.', 'అక్టో.', 'నవ.', 'డిసె.'], - 'weekdays' => ['ఆదివారం', 'సోమవారం', 'మంగళవారం', 'బుధవారం', 'గురువారం', 'శుక్రవారం', 'శనివారం'], - 'weekdays_short' => ['ఆది', 'సోమ', 'మంగళ', 'బుధ', 'గురు', 'శుక్ర', 'శని'], - 'weekdays_min' => ['ఆ', 'సో', 'మం', 'బు', 'గు', 'శు', 'శ'], - 'list' => ', ', - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'weekend' => [0, 0], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/te_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/te_IN.php deleted file mode 100644 index 3963f8d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/te_IN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/te.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/teo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/teo.php deleted file mode 100644 index ca30c37..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/teo.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ta.php', [ - 'meridiem' => ['Taparachu', 'Ebongi'], - 'weekdays' => ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'], - 'weekdays_short' => ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'], - 'weekdays_min' => ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'], - 'months' => ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'], - 'months_short' => ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/teo_KE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/teo_KE.php deleted file mode 100644 index 010a04f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/teo_KE.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/teo.php', [ - 'first_day_of_week' => 0, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tet.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tet.php deleted file mode 100644 index d0544d4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tet.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Joshua Brooks - * - François B - */ -return [ - 'year' => 'tinan :count', - 'a_year' => '{1}tinan ida|tinan :count', - 'month' => 'fulan :count', - 'a_month' => '{1}fulan ida|fulan :count', - 'week' => 'semana :count', - 'a_week' => '{1}semana ida|semana :count', - 'day' => 'loron :count', - 'a_day' => '{1}loron ida|loron :count', - 'hour' => 'oras :count', - 'a_hour' => '{1}oras ida|oras :count', - 'minute' => 'minutu :count', - 'a_minute' => '{1}minutu ida|minutu :count', - 'second' => 'segundu :count', - 'a_second' => '{1}segundu balun|segundu :count', - 'ago' => ':time liuba', - 'from_now' => 'iha :time', - 'diff_yesterday' => 'Horiseik', - 'diff_yesterday_regexp' => 'Horiseik(?:\\s+iha)?', - 'diff_today' => 'Ohin', - 'diff_today_regexp' => 'Ohin(?:\\s+iha)?', - 'diff_tomorrow' => 'Aban', - 'diff_tomorrow_regexp' => 'Aban(?:\\s+iha)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Ohin iha] LT', - 'nextDay' => '[Aban iha] LT', - 'nextWeek' => 'dddd [iha] LT', - 'lastDay' => '[Horiseik iha] LT', - 'lastWeek' => 'dddd [semana kotuk] [iha] LT', - 'sameElse' => 'L', - ], - 'ordinal' => ':numberº', - 'months' => ['Janeiru', 'Fevereiru', 'Marsu', 'Abril', 'Maiu', 'Juñu', 'Jullu', 'Agustu', 'Setembru', 'Outubru', 'Novembru', 'Dezembru'], - 'months_short' => ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], - 'weekdays' => ['Domingu', 'Segunda', 'Tersa', 'Kuarta', 'Kinta', 'Sesta', 'Sabadu'], - 'weekdays_short' => ['Dom', 'Seg', 'Ters', 'Kua', 'Kint', 'Sest', 'Sab'], - 'weekdays_min' => ['Do', 'Seg', 'Te', 'Ku', 'Ki', 'Ses', 'Sa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tg.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tg.php deleted file mode 100644 index b7df893..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tg.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Orif N. Jr - */ -return [ - 'year' => '{1}як сол|:count сол', - 'month' => '{1}як моҳ|:count моҳ', - 'week' => '{1}як ҳафта|:count ҳафта', - 'day' => '{1}як рӯз|:count рӯз', - 'hour' => '{1}як соат|:count соат', - 'minute' => '{1}як дақиқа|:count дақиқа', - 'second' => '{1}якчанд сония|:count сония', - 'ago' => ':time пеш', - 'from_now' => 'баъди :time', - 'diff_today' => 'Имрӯз', - 'diff_yesterday' => 'Дирӯз', - 'diff_yesterday_regexp' => 'Дирӯз(?:\\s+соати)?', - 'diff_tomorrow' => 'Пагоҳ', - 'diff_tomorrow_regexp' => 'Пагоҳ(?:\\s+соати)?', - 'diff_today_regexp' => 'Имрӯз(?:\\s+соати)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Имрӯз соати] LT', - 'nextDay' => '[Пагоҳ соати] LT', - 'nextWeek' => 'dddd[и] [ҳафтаи оянда соати] LT', - 'lastDay' => '[Дирӯз соати] LT', - 'lastWeek' => 'dddd[и] [ҳафтаи гузашта соати] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number) { - if ($number === 0) { // special case for zero - return "$number-ıncı"; - } - - static $suffixes = [ - 0 => '-ум', - 1 => '-ум', - 2 => '-юм', - 3 => '-юм', - 4 => '-ум', - 5 => '-ум', - 6 => '-ум', - 7 => '-ум', - 8 => '-ум', - 9 => '-ум', - 10 => '-ум', - 12 => '-ум', - 13 => '-ум', - 20 => '-ум', - 30 => '-юм', - 40 => '-ум', - 50 => '-ум', - 60 => '-ум', - 70 => '-ум', - 80 => '-ум', - 90 => '-ум', - 100 => '-ум', - ]; - - return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - }, - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'шаб'; - } - if ($hour < 11) { - return 'субҳ'; - } - if ($hour < 16) { - return 'рӯз'; - } - if ($hour < 19) { - return 'бегоҳ'; - } - - return 'шаб'; - }, - 'months' => ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['якшанбе', 'душанбе', 'сешанбе', 'чоршанбе', 'панҷшанбе', 'ҷумъа', 'шанбе'], - 'weekdays_short' => ['яшб', 'дшб', 'сшб', 'чшб', 'пшб', 'ҷум', 'шнб'], - 'weekdays_min' => ['яш', 'дш', 'сш', 'чш', 'пш', 'ҷм', 'шб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ва '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tg_TJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tg_TJ.php deleted file mode 100644 index badc7d1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tg_TJ.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/tg.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/th.php b/dependencies/nesbot/carbon/src/Carbon/Lang/th.php deleted file mode 100644 index 6397f6e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/th.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Nate Whittaker - * - John MacAslan - * - Chanintorn Asavavichairoj - * - JD Isaacks - * - ROKAISAKKON - * - RO'KAISAKKON - * - Andreas Möller - * - nithisa - */ -return [ - 'year' => ':count ปี', - 'y' => ':count ปี', - 'month' => ':count เดือน', - 'm' => ':count เดือน', - 'week' => ':count สัปดาห์', - 'w' => ':count สัปดาห์', - 'day' => ':count วัน', - 'd' => ':count วัน', - 'hour' => ':count ชั่วโมง', - 'h' => ':count ชั่วโมง', - 'minute' => ':count นาที', - 'min' => ':count นาที', - 'second' => ':count วินาที', - 'a_second' => '{1}ไม่กี่วินาที|]1,Inf[:count วินาที', - 's' => ':count วินาที', - 'ago' => ':timeที่แล้ว', - 'from_now' => 'อีก :time', - 'after' => ':timeหลังจากนี้', - 'before' => ':timeก่อน', - 'diff_now' => 'ขณะนี้', - 'diff_today' => 'วันนี้', - 'diff_today_regexp' => 'วันนี้(?:\\s+เวลา)?', - 'diff_yesterday' => 'เมื่อวาน', - 'diff_yesterday_regexp' => 'เมื่อวานนี้(?:\\s+เวลา)?', - 'diff_tomorrow' => 'พรุ่งนี้', - 'diff_tomorrow_regexp' => 'พรุ่งนี้(?:\\s+เวลา)?', - 'formats' => [ - 'LT' => 'H:mm', - 'LTS' => 'H:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY เวลา H:mm', - 'LLLL' => 'วันddddที่ D MMMM YYYY เวลา H:mm', - ], - 'calendar' => [ - 'sameDay' => '[วันนี้ เวลา] LT', - 'nextDay' => '[พรุ่งนี้ เวลา] LT', - 'nextWeek' => 'dddd[หน้า เวลา] LT', - 'lastDay' => '[เมื่อวานนี้ เวลา] LT', - 'lastWeek' => '[วัน]dddd[ที่แล้ว เวลา] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ก่อนเที่ยง', 'หลังเที่ยง'], - 'months' => ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'], - 'months_short' => ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'], - 'weekdays' => ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์'], - 'weekdays_short' => ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัส', 'ศุกร์', 'เสาร์'], - 'weekdays_min' => ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'], - 'list' => [', ', ' และ '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/th_TH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/th_TH.php deleted file mode 100644 index b9f94b2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/th_TH.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/th.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/the.php b/dependencies/nesbot/carbon/src/Carbon/Lang/the.php deleted file mode 100644 index 85f8333..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/the.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/the_NP.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/the_NP.php b/dependencies/nesbot/carbon/src/Carbon/Lang/the_NP.php deleted file mode 100644 index 34da162..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/the_NP.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Chitwanix OS Development info@chitwanix.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], - 'weekdays' => ['आइतबार', 'सोमबार', 'मंगलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'], - 'weekdays_short' => ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'], - 'weekdays_min' => ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ti.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ti.php deleted file mode 100644 index ffd3236..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ti.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ti_ER.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ti_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ti_ER.php deleted file mode 100644 index 310c51c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ti_ER.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'], - 'months_short' => ['ጥሪ ', 'ለካቲ', 'መጋቢ', 'ሚያዝ', 'ግንቦ', 'ሰነ ', 'ሓምለ', 'ነሓሰ', 'መስከ', 'ጥቅም', 'ሕዳር', 'ታሕሳ'], - 'weekdays' => ['ሰንበት', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_short' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_min' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'], - - 'year' => ':count ዓመት', - 'y' => ':count ዓመት', - 'a_year' => ':count ዓመት', - - 'month' => 'ወርሒ :count', - 'm' => 'ወርሒ :count', - 'a_month' => 'ወርሒ :count', - - 'week' => ':count ሰሙን', - 'w' => ':count ሰሙን', - 'a_week' => ':count ሰሙን', - - 'day' => ':count መዓልቲ', - 'd' => ':count መዓልቲ', - 'a_day' => ':count መዓልቲ', - - 'hour' => ':count ሰዓት', - 'h' => ':count ሰዓት', - 'a_hour' => ':count ሰዓት', - - 'minute' => ':count ደቒቕ', - 'min' => ':count ደቒቕ', - 'a_minute' => ':count ደቒቕ', - - 'second' => ':count ሰከንድ', - 's' => ':count ሰከንድ', - 'a_second' => ':count ሰከንድ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ti_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ti_ET.php deleted file mode 100644 index 024217f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ti_ET.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['ሰንበት', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_short' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'weekdays_min' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tig.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tig.php deleted file mode 100644 index 186fe71..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tig.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tig_ER.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tig_ER.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tig_ER.php deleted file mode 100644 index 46887b0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tig_ER.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'], - 'months_short' => ['ጥሪ ', 'ለካቲ', 'መጋቢ', 'ሚያዝ', 'ግንቦ', 'ሰነ ', 'ሓምለ', 'ነሓሰ', 'መስከ', 'ጥቅም', 'ሕዳር', 'ታሕሳ'], - 'weekdays' => ['ሰንበት ዓባይ', 'ሰኖ', 'ታላሸኖ', 'ኣረርባዓ', 'ከሚሽ', 'ጅምዓት', 'ሰንበት ንኢሽ'], - 'weekdays_short' => ['ሰ//ዓ', 'ሰኖ ', 'ታላሸ', 'ኣረር', 'ከሚሽ', 'ጅምዓ', 'ሰ//ን'], - 'weekdays_min' => ['ሰ//ዓ', 'ሰኖ ', 'ታላሸ', 'ኣረር', 'ከሚሽ', 'ጅምዓ', 'ሰ//ን'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ቀደም ሰር ምዕል', 'ሓቆ ሰር ምዕል'], - - 'year' => ':count ማይ', // less reliable - 'y' => ':count ማይ', // less reliable - 'a_year' => ':count ማይ', // less reliable - - 'month' => ':count ሸምሽ', // less reliable - 'm' => ':count ሸምሽ', // less reliable - 'a_month' => ':count ሸምሽ', // less reliable - - 'week' => ':count ሰቡዕ', // less reliable - 'w' => ':count ሰቡዕ', // less reliable - 'a_week' => ':count ሰቡዕ', // less reliable - - 'day' => ':count ዎሮ', // less reliable - 'd' => ':count ዎሮ', // less reliable - 'a_day' => ':count ዎሮ', // less reliable - - 'hour' => ':count ሰዓት', // less reliable - 'h' => ':count ሰዓት', // less reliable - 'a_hour' => ':count ሰዓት', // less reliable - - 'minute' => ':count ካልኣይት', // less reliable - 'min' => ':count ካልኣይት', // less reliable - 'a_minute' => ':count ካልኣይት', // less reliable - - 'second' => ':count ካልኣይ', - 's' => ':count ካልኣይ', - 'a_second' => ':count ካልኣይ', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tk.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tk.php deleted file mode 100644 index d8f7d19..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tk.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tk_TM.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tk_TM.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tk_TM.php deleted file mode 100644 index f949a43..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tk_TM.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Authors: - * - Ghorban M. Tavakoly Pablo Saratxaga & Ghorban M. Tavakoly pablo@walon.org & gmt314@yahoo.com - * - SuperManPHP - * - Maksat Meredow (isadma) - */ -$transformDiff = function ($input) { - return strtr($input, [ - 'sekunt' => 'sekunt', - 'hepde' => 'hepde', - ]); -}; - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Ýanwar', 'Fewral', 'Mart', 'Aprel', 'Maý', 'Iýun', 'Iýul', 'Awgust', 'Sentýabr', 'Oktýabr', 'Noýabr', 'Dekabr'], - 'months_short' => ['Ýan', 'Few', 'Mar', 'Apr', 'Maý', 'Iýn', 'Iýl', 'Awg', 'Sen', 'Okt', 'Noý', 'Dek'], - 'weekdays' => ['Duşenbe', 'Sişenbe', 'Çarşenbe', 'Penşenbe', 'Anna', 'Şenbe', 'Ýekşenbe'], - 'weekdays_short' => ['Duş', 'Siş', 'Çar', 'Pen', 'Ann', 'Şen', 'Ýek'], - 'weekdays_min' => ['Du', 'Si', 'Ça', 'Pe', 'An', 'Şe', 'Ýe'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ýyl', - 'y' => ':count ýyl', - 'a_year' => ':count ýyl', - - 'month' => ':count aý', - 'm' => ':count aý', - 'a_month' => ':count aý', - - 'week' => ':count hepde', - 'w' => ':count hepde', - 'a_week' => ':count hepde', - - 'day' => ':count gün', - 'd' => ':count gün', - 'a_day' => ':count gün', - - 'hour' => ':count sagat', - 'h' => ':count sagat', - 'a_hour' => ':count sagat', - - 'minute' => ':count minut', - 'min' => ':count minut', - 'a_minute' => ':count minut', - - 'second' => ':count sekunt', - 's' => ':count sekunt', - 'a_second' => ':count sekunt', - - 'ago' => function ($time) use ($transformDiff) { - return $transformDiff($time).' ozal'; - }, - 'from_now' => function ($time) use ($transformDiff) { - return $transformDiff($time).' soňra'; - }, - 'after' => function ($time) use ($transformDiff) { - return $transformDiff($time).' soň'; - }, - 'before' => function ($time) use ($transformDiff) { - return $transformDiff($time).' öň'; - }, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tl.php deleted file mode 100644 index 410a266..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tl.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'year' => ':count taon', - 'a_year' => '{1}isang taon|:count taon', - 'month' => ':count buwan', - 'a_month' => '{1}isang buwan|:count buwan', - 'week' => ':count linggo', - 'a_week' => '{1}isang linggo|:count linggo', - 'day' => ':count araw', - 'a_day' => '{1}isang araw|:count araw', - 'hour' => ':count oras', - 'a_hour' => '{1}isang oras|:count oras', - 'minute' => ':count minuto', - 'a_minute' => '{1}isang minuto|:count minuto', - 'min' => ':count min.', - 'second' => ':count segundo', - 'a_second' => '{1}ilang segundo|:count segundo', - 's' => ':count seg.', - 'ago' => ':time ang nakalipas', - 'from_now' => 'sa loob ng :time', - 'diff_now' => 'ngayon', - 'diff_today' => 'ngayong', - 'diff_today_regexp' => 'ngayong(?:\\s+araw)?', - 'diff_yesterday' => 'kahapon', - 'diff_tomorrow' => 'bukas', - 'diff_tomorrow_regexp' => 'Bukas(?:\\s+ng)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'MM/D/YYYY', - 'LL' => 'MMMM D, YYYY', - 'LLL' => 'MMMM D, YYYY HH:mm', - 'LLLL' => 'dddd, MMMM DD, YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => 'LT [ngayong araw]', - 'nextDay' => '[Bukas ng] LT', - 'nextWeek' => 'LT [sa susunod na] dddd', - 'lastDay' => 'LT [kahapon]', - 'lastWeek' => 'LT [noong nakaraang] dddd', - 'sameElse' => 'L', - ], - 'months' => ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'], - 'months_short' => ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'], - 'weekdays' => ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'], - 'weekdays_short' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], - 'weekdays_min' => ['Li', 'Lu', 'Ma', 'Mi', 'Hu', 'Bi', 'Sab'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' at '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tl_PH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tl_PH.php deleted file mode 100644 index 95f508c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tl_PH.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Ian De La Cruz - * - JD Isaacks - */ -return require __DIR__.'/tl.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tlh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tlh.php deleted file mode 100644 index fbf9e6f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tlh.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Serhan Apaydın - * - Dominika - */ -return [ - 'year' => '{1}wa’ DIS|:count DIS', - 'month' => '{1}wa’ jar|:count jar', - 'week' => '{1}wa’ hogh|:count hogh', - 'day' => '{1}wa’ jaj|:count jaj', - 'hour' => '{1}wa’ rep|:count rep', - 'minute' => '{1}wa’ tup|:count tup', - 'second' => '{1}puS lup|:count lup', - 'ago' => function ($time) { - $output = strtr($time, [ - 'jaj' => 'Hu’', - 'jar' => 'wen', - 'DIS' => 'ben', - ]); - - return $output === $time ? "$time ret" : $output; - }, - 'from_now' => function ($time) { - $output = strtr($time, [ - 'jaj' => 'leS', - 'jar' => 'waQ', - 'DIS' => 'nem', - ]); - - return $output === $time ? "$time pIq" : $output; - }, - 'diff_yesterday' => 'wa’Hu’', - 'diff_today' => 'DaHjaj', - 'diff_tomorrow' => 'wa’leS', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[DaHjaj] LT', - 'nextDay' => '[wa’leS] LT', - 'nextWeek' => 'LLL', - 'lastDay' => '[wa’Hu’] LT', - 'lastWeek' => 'LLL', - 'sameElse' => 'L', - ], - 'ordinal' => ':number.', - 'months' => ['tera’ jar wa’', 'tera’ jar cha’', 'tera’ jar wej', 'tera’ jar loS', 'tera’ jar vagh', 'tera’ jar jav', 'tera’ jar Soch', 'tera’ jar chorgh', 'tera’ jar Hut', 'tera’ jar wa’maH', 'tera’ jar wa’maH wa’', 'tera’ jar wa’maH cha’'], - 'months_short' => ['jar wa’', 'jar cha’', 'jar wej', 'jar loS', 'jar vagh', 'jar jav', 'jar Soch', 'jar chorgh', 'jar Hut', 'jar wa’maH', 'jar wa’maH wa’', 'jar wa’maH cha’'], - 'weekdays' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], - 'weekdays_short' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], - 'weekdays_min' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' ’ej '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tn.php deleted file mode 100644 index f29bdf6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tn.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tn_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tn_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tn_ZA.php deleted file mode 100644 index aada7db..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tn_ZA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Ferikgong', 'Tlhakole', 'Mopitlwe', 'Moranang', 'Motsheganong', 'Seetebosigo', 'Phukwi', 'Phatwe', 'Lwetse', 'Diphalane', 'Ngwanatsele', 'Sedimonthole'], - 'months_short' => ['Fer', 'Tlh', 'Mop', 'Mor', 'Mot', 'See', 'Phu', 'Pha', 'Lwe', 'Dip', 'Ngw', 'Sed'], - 'weekdays' => ['laTshipi', 'Mosupologo', 'Labobedi', 'Laboraro', 'Labone', 'Labotlhano', 'Lamatlhatso'], - 'weekdays_short' => ['Tsh', 'Mos', 'Bed', 'Rar', 'Ne', 'Tlh', 'Mat'], - 'weekdays_min' => ['Tsh', 'Mos', 'Bed', 'Rar', 'Ne', 'Tlh', 'Mat'], - 'day_of_first_week_of_year' => 1, - - 'year' => 'dingwaga di le :count', - 'y' => 'dingwaga di le :count', - 'a_year' => 'dingwaga di le :count', - - 'month' => 'dikgwedi di le :count', - 'm' => 'dikgwedi di le :count', - 'a_month' => 'dikgwedi di le :count', - - 'week' => 'dibeke di le :count', - 'w' => 'dibeke di le :count', - 'a_week' => 'dibeke di le :count', - - 'day' => 'malatsi :count', - 'd' => 'malatsi :count', - 'a_day' => 'malatsi :count', - - 'hour' => 'diura di le :count', - 'h' => 'diura di le :count', - 'a_hour' => 'diura di le :count', - - 'minute' => 'metsotso e le :count', - 'min' => 'metsotso e le :count', - 'a_minute' => 'metsotso e le :count', - - 'second' => 'metsotswana e le :count', - 's' => 'metsotswana e le :count', - 'a_second' => 'metsotswana e le :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/to.php b/dependencies/nesbot/carbon/src/Carbon/Lang/to.php deleted file mode 100644 index 20581bb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/to.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/to_TO.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/to_TO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/to_TO.php deleted file mode 100644 index 335c69a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/to_TO.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - International Components for Unicode akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'dddd DD MMM YYYY', - ], - 'months' => ['Sānuali', 'Fēpueli', 'Maʻasi', 'ʻEpeleli', 'Mē', 'Sune', 'Siulai', 'ʻAokosi', 'Sepitema', 'ʻOkatopa', 'Nōvema', 'Tīsema'], - 'months_short' => ['Sān', 'Fēp', 'Maʻa', 'ʻEpe', 'Mē', 'Sun', 'Siu', 'ʻAok', 'Sep', 'ʻOka', 'Nōv', 'Tīs'], - 'weekdays' => ['Sāpate', 'Mōnite', 'Tūsite', 'Pulelulu', 'Tuʻapulelulu', 'Falaite', 'Tokonaki'], - 'weekdays_short' => ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'], - 'weekdays_min' => ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'], - 'meridiem' => ['hengihengi', 'efiafi'], - - 'year' => ':count fitu', // less reliable - 'y' => ':count fitu', // less reliable - 'a_year' => ':count fitu', // less reliable - - 'month' => ':count mahina', // less reliable - 'm' => ':count mahina', // less reliable - 'a_month' => ':count mahina', // less reliable - - 'week' => ':count Sapate', // less reliable - 'w' => ':count Sapate', // less reliable - 'a_week' => ':count Sapate', // less reliable - - 'day' => ':count ʻaho', // less reliable - 'd' => ':count ʻaho', // less reliable - 'a_day' => ':count ʻaho', // less reliable - - 'hour' => ':count houa', - 'h' => ':count houa', - 'a_hour' => ':count houa', - - 'minute' => ':count miniti', - 'min' => ':count miniti', - 'a_minute' => ':count miniti', - - 'second' => ':count sekoni', - 's' => ':count sekoni', - 'a_second' => ':count sekoni', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tpi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tpi.php deleted file mode 100644 index 7d38dae..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tpi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tpi_PG.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tpi_PG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tpi_PG.php deleted file mode 100644 index 5f58c44..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tpi_PG.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Janueri', 'Februeri', 'Mas', 'Epril', 'Me', 'Jun', 'Julai', 'Ogas', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mas', 'Epr', 'Me', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Des'], - 'weekdays' => ['Sande', 'Mande', 'Tunde', 'Trinde', 'Fonde', 'Fraide', 'Sarere'], - 'weekdays_short' => ['San', 'Man', 'Tun', 'Tri', 'Fon', 'Fra', 'Sar'], - 'weekdays_min' => ['San', 'Man', 'Tun', 'Tri', 'Fon', 'Fra', 'Sar'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['biknait', 'apinun'], - - 'year' => 'yia :count', - 'y' => 'yia :count', - 'a_year' => 'yia :count', - - 'month' => ':count mun', - 'm' => ':count mun', - 'a_month' => ':count mun', - - 'week' => ':count wik', - 'w' => ':count wik', - 'a_week' => ':count wik', - - 'day' => ':count de', - 'd' => ':count de', - 'a_day' => ':count de', - - 'hour' => ':count aua', - 'h' => ':count aua', - 'a_hour' => ':count aua', - - 'minute' => ':count minit', - 'min' => ':count minit', - 'a_minute' => ':count minit', - - 'second' => ':count namba tu', - 's' => ':count namba tu', - 'a_second' => ':count namba tu', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tr.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tr.php deleted file mode 100644 index f5d9f4c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tr.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Alan Agius - * - Erhan Gundogan - * - François B - * - JD Isaacks - * - Murat Yüksel - * - Baran Şengül - * - Selami (selamialtin) - * - TeomanBey - */ -return [ - 'year' => ':count yıl', - 'a_year' => '{1}bir yıl|]1,Inf[:count yıl', - 'y' => ':county', - 'month' => ':count ay', - 'a_month' => '{1}bir ay|]1,Inf[:count ay', - 'm' => ':countay', - 'week' => ':count hafta', - 'a_week' => '{1}bir hafta|]1,Inf[:count hafta', - 'w' => ':counth', - 'day' => ':count gün', - 'a_day' => '{1}bir gün|]1,Inf[:count gün', - 'd' => ':countg', - 'hour' => ':count saat', - 'a_hour' => '{1}bir saat|]1,Inf[:count saat', - 'h' => ':countsa', - 'minute' => ':count dakika', - 'a_minute' => '{1}bir dakika|]1,Inf[:count dakika', - 'min' => ':countdk', - 'second' => ':count saniye', - 'a_second' => '{1}birkaç saniye|]1,Inf[:count saniye', - 's' => ':countsn', - 'ago' => ':time önce', - 'from_now' => ':time sonra', - 'after' => ':time sonra', - 'before' => ':time önce', - 'diff_now' => 'şimdi', - 'diff_today' => 'bugün', - 'diff_today_regexp' => 'bugün(?:\\s+saat)?', - 'diff_yesterday' => 'dün', - 'diff_tomorrow' => 'yarın', - 'diff_tomorrow_regexp' => 'yarın(?:\\s+saat)?', - 'diff_before_yesterday' => 'evvelsi gün', - 'diff_after_tomorrow' => 'öbür gün', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[bugün saat] LT', - 'nextDay' => '[yarın saat] LT', - 'nextWeek' => '[gelecek] dddd [saat] LT', - 'lastDay' => '[dün] LT', - 'lastWeek' => '[geçen] dddd [saat] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'Do': - case 'DD': - return $number; - default: - if ($number === 0) { // special case for zero - return "$number'ıncı"; - } - - static $suffixes = [ - 1 => '\'inci', - 5 => '\'inci', - 8 => '\'inci', - 70 => '\'inci', - 80 => '\'inci', - 2 => '\'nci', - 7 => '\'nci', - 20 => '\'nci', - 50 => '\'nci', - 3 => '\'üncü', - 4 => '\'üncü', - 100 => '\'üncü', - 6 => '\'ncı', - 9 => '\'uncu', - 10 => '\'uncu', - 30 => '\'uncu', - 60 => '\'ıncı', - 90 => '\'ıncı', - ]; - - $lastDigit = $number % 10; - - return $number.($suffixes[$lastDigit] ?? $suffixes[$number % 100 - $lastDigit] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); - } - }, - 'meridiem' => ['ÖÖ', 'ÖS', 'öö', 'ös'], - 'months' => ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'], - 'months_short' => ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'], - 'weekdays' => ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'], - 'weekdays_short' => ['Paz', 'Pts', 'Sal', 'Çar', 'Per', 'Cum', 'Cts'], - 'weekdays_min' => ['Pz', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ve '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tr_CY.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tr_CY.php deleted file mode 100644 index 23f1144..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tr_CY.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/tr.php', [ - 'weekdays_short' => ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'], - 'weekdays_min' => ['Pa', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'], - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'D.MM.YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'D MMMM YYYY dddd h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tr_TR.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tr_TR.php deleted file mode 100644 index 9e99482..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tr_TR.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/tr.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ts.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ts.php deleted file mode 100644 index 525736b..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ts.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ts_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ts_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ts_ZA.php deleted file mode 100644 index 37a24ec..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ts_ZA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Sunguti', 'Nyenyenyani', 'Nyenyankulu', 'Dzivamisoko', 'Mudyaxihi', 'Khotavuxika', 'Mawuwani', 'Mhawuri', 'Ndzhati', 'Nhlangula', 'Hukuri', 'N\'wendzamhala'], - 'months_short' => ['Sun', 'Yan', 'Kul', 'Dzi', 'Mud', 'Kho', 'Maw', 'Mha', 'Ndz', 'Nhl', 'Huk', 'N\'w'], - 'weekdays' => ['Sonto', 'Musumbhunuku', 'Ravumbirhi', 'Ravunharhu', 'Ravumune', 'Ravuntlhanu', 'Mugqivela'], - 'weekdays_short' => ['Son', 'Mus', 'Bir', 'Har', 'Ne', 'Tlh', 'Mug'], - 'weekdays_min' => ['Son', 'Mus', 'Bir', 'Har', 'Ne', 'Tlh', 'Mug'], - 'day_of_first_week_of_year' => 1, - - 'year' => 'malembe ya :count', - 'y' => 'malembe ya :count', - 'a_year' => 'malembe ya :count', - - 'month' => 'tin’hweti ta :count', - 'm' => 'tin’hweti ta :count', - 'a_month' => 'tin’hweti ta :count', - - 'week' => 'mavhiki ya :count', - 'w' => 'mavhiki ya :count', - 'a_week' => 'mavhiki ya :count', - - 'day' => 'masiku :count', - 'd' => 'masiku :count', - 'a_day' => 'masiku :count', - - 'hour' => 'tiawara ta :count', - 'h' => 'tiawara ta :count', - 'a_hour' => 'tiawara ta :count', - - 'minute' => 'timinete ta :count', - 'min' => 'timinete ta :count', - 'a_minute' => 'timinete ta :count', - - 'second' => 'tisekoni ta :count', - 's' => 'tisekoni ta :count', - 'a_second' => 'tisekoni ta :count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tt.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tt.php deleted file mode 100644 index d67d896..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tt.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/tt_RU.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU.php deleted file mode 100644 index 38e42d0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Rinat Norkin Pablo Saratxaga, Rinat Norkin pablo@mandrakesoft.com, rinat@taif.ru - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'DD MMM, HH:mm', - 'LLLL' => 'DD MMMM YYYY, HH:mm', - ], - 'months' => ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['якшәмбе', 'дышәмбе', 'сишәмбе', 'чәршәәмбе', 'пәнҗешмбе', 'җомга', 'шимбә'], - 'weekdays_short' => ['якш', 'дыш', 'сиш', 'чәрш', 'пәнҗ', 'җом', 'шим'], - 'weekdays_min' => ['якш', 'дыш', 'сиш', 'чәрш', 'пәнҗ', 'җом', 'шим'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'year' => ':count ел', - 'month' => ':count ай', - 'week' => ':count атна', - 'day' => ':count көн', - 'hour' => ':count сәгать', - 'minute' => ':count минут', - 'second' => ':count секунд', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php deleted file mode 100644 index 16b8efb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Reshat Sabiq tatar.iqtelif.i18n@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD.MM.YYYY', - ], - 'months' => ['Ğınwar', 'Fiwral\'', 'Mart', 'April', 'May', 'Yün', 'Yül', 'Awgust', 'Sintebír', 'Üktebír', 'Noyebír', 'Dikebír'], - 'months_short' => ['Ğın', 'Fiw', 'Mar', 'Apr', 'May', 'Yün', 'Yül', 'Awg', 'Sin', 'Ükt', 'Noy', 'Dik'], - 'weekdays' => ['Yekşembí', 'Düşembí', 'Sişembí', 'Çerşembí', 'Pencíşembí', 'Comğa', 'Şimbe'], - 'weekdays_short' => ['Yek', 'Düş', 'Siş', 'Çer', 'Pen', 'Com', 'Şim'], - 'weekdays_min' => ['Yek', 'Düş', 'Siş', 'Çer', 'Pen', 'Com', 'Şim'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ÖA', 'ÖS'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/twq.php b/dependencies/nesbot/carbon/src/Carbon/Lang/twq.php deleted file mode 100644 index 5cbb46e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/twq.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/ses.php', [ - 'meridiem' => ['Subbaahi', 'Zaarikay b'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tzl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tzl.php deleted file mode 100644 index 50bf26d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tzl.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'year' => '[0,1]:count ar|:count ars', - 'y' => '[0,1]:count ar|:count ars', - 'month' => '[0,1]:count mes|:count mesen', - 'm' => '[0,1]:count mes|:count mesen', - 'week' => '[0,1]:count seifetziua|:count seifetziuas', - 'w' => '[0,1]:count seifetziua|:count seifetziuas', - 'day' => '[0,1]:count ziua|:count ziuas', - 'd' => '[0,1]:count ziua|:count ziuas', - 'hour' => '[0,1]:count þora|:count þoras', - 'h' => '[0,1]:count þora|:count þoras', - 'minute' => '[0,1]:count míut|:count míuts', - 'min' => '[0,1]:count míut|:count míuts', - 'second' => ':count secunds', - 's' => ':count secunds', - - 'ago' => 'ja :time', - 'from_now' => 'osprei :time', - - 'diff_yesterday' => 'ieiri', - 'diff_yesterday_regexp' => 'ieiri(?:\\s+à)?', - 'diff_today' => 'oxhi', - 'diff_today_regexp' => 'oxhi(?:\\s+à)?', - 'diff_tomorrow' => 'demà', - 'diff_tomorrow_regexp' => 'demà(?:\\s+à)?', - - 'formats' => [ - 'LT' => 'HH.mm', - 'LTS' => 'HH.mm.ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D. MMMM [dallas] YYYY', - 'LLL' => 'D. MMMM [dallas] YYYY HH.mm', - 'LLLL' => 'dddd, [li] D. MMMM [dallas] YYYY HH.mm', - ], - - 'calendar' => [ - 'sameDay' => '[oxhi à] LT', - 'nextDay' => '[demà à] LT', - 'nextWeek' => 'dddd [à] LT', - 'lastDay' => '[ieiri à] LT', - 'lastWeek' => '[sür el] dddd [lasteu à] LT', - 'sameElse' => 'L', - ], - - 'meridiem' => ["D'A", "D'O"], - 'months' => ['Januar', 'Fevraglh', 'Març', 'Avrïu', 'Mai', 'Gün', 'Julia', 'Guscht', 'Setemvar', 'Listopäts', 'Noemvar', 'Zecemvar'], - 'months_short' => ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Gün', 'Jul', 'Gus', 'Set', 'Lis', 'Noe', 'Zec'], - 'weekdays' => ['Súladi', 'Lúneçi', 'Maitzi', 'Márcuri', 'Xhúadi', 'Viénerçi', 'Sáturi'], - 'weekdays_short' => ['Súl', 'Lún', 'Mai', 'Már', 'Xhú', 'Vié', 'Sát'], - 'weekdays_min' => ['Sú', 'Lú', 'Ma', 'Má', 'Xh', 'Vi', 'Sá'], - 'ordinal' => ':number.', - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tzm.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tzm.php deleted file mode 100644 index 2a1a0f2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tzm.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => '{1}ⴰⵙⴳⴰⵙ|:count ⵉⵙⴳⴰⵙⵏ', - 'month' => '{1}ⴰⵢoⵓⵔ|:count ⵉⵢⵢⵉⵔⵏ', - 'week' => ':count ⵉⵎⴰⵍⴰⵙⵙ', - 'day' => '{1}ⴰⵙⵙ|:count oⵙⵙⴰⵏ', - 'hour' => '{1}ⵙⴰⵄⴰ|:count ⵜⴰⵙⵙⴰⵄⵉⵏ', - 'minute' => '{1}ⵎⵉⵏⵓⴺ|:count ⵎⵉⵏⵓⴺ', - 'second' => '{1}ⵉⵎⵉⴽ|:count ⵉⵎⵉⴽ', - 'ago' => 'ⵢⴰⵏ :time', - 'from_now' => 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ :time', - 'diff_today' => 'ⴰⵙⴷⵅ', - 'diff_yesterday' => 'ⴰⵚⴰⵏⵜ', - 'diff_yesterday_regexp' => 'ⴰⵚⴰⵏⵜ(?:\\s+ⴴ)?', - 'diff_tomorrow' => 'ⴰⵙⴽⴰ', - 'diff_tomorrow_regexp' => 'ⴰⵙⴽⴰ(?:\\s+ⴴ)?', - 'diff_today_regexp' => 'ⴰⵙⴷⵅ(?:\\s+ⴴ)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ⴰⵙⴷⵅ ⴴ] LT', - 'nextDay' => '[ⴰⵙⴽⴰ ⴴ] LT', - 'nextWeek' => 'dddd [ⴴ] LT', - 'lastDay' => '[ⴰⵚⴰⵏⵜ ⴴ] LT', - 'lastWeek' => 'dddd [ⴴ] LT', - 'sameElse' => 'L', - ], - 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⵏⴱⵉⵔ'], - 'months_short' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⵏⴱⵉⵔ'], - 'weekdays' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'weekdays_short' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'weekdays_min' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, - 'weekend' => [5, 6], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php deleted file mode 100644 index 5840d20..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - JD Isaacks - */ -return [ - 'year' => '{1}:count asgas|:count isgasn', - 'a_year' => 'asgas|:count isgasn', - 'month' => '{1}:count ayowr|:count iyyirn', - 'a_month' => 'ayowr|:count iyyirn', - 'week' => ':count imalass', - 'a_week' => ':imalass', - 'day' => '{1}:count ass|:count ossan', - 'a_day' => 'ass|:count ossan', - 'hour' => '{1}:count saɛa|:count tassaɛin', - 'a_hour' => '{1}saɛa|:count tassaɛin', - 'minute' => ':count minuḍ', - 'a_minute' => '{1}minuḍ|:count minuḍ', - 'second' => ':count imik', - 'a_second' => '{1}imik|:count imik', - 'ago' => 'yan :time', - 'from_now' => 'dadkh s yan :time', - 'diff_yesterday' => 'assant', - 'diff_yesterday_regexp' => 'assant(?:\\s+g)?', - 'diff_today' => 'asdkh', - 'diff_today_regexp' => 'asdkh(?:\\s+g)?', - 'diff_tomorrow' => 'aska', - 'diff_tomorrow_regexp' => 'aska(?:\\s+g)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[asdkh g] LT', - 'nextDay' => '[aska g] LT', - 'nextWeek' => 'dddd [g] LT', - 'lastDay' => '[assant g] LT', - 'lastWeek' => 'dddd [g] LT', - 'sameElse' => 'L', - ], - 'months' => ['innayr', 'brˤayrˤ', 'marˤsˤ', 'ibrir', 'mayyw', 'ywnyw', 'ywlywz', 'ɣwšt', 'šwtanbir', 'ktˤwbrˤ', 'nwwanbir', 'dwjnbir'], - 'months_short' => ['innayr', 'brˤayrˤ', 'marˤsˤ', 'ibrir', 'mayyw', 'ywnyw', 'ywlywz', 'ɣwšt', 'šwtanbir', 'ktˤwbrˤ', 'nwwanbir', 'dwjnbir'], - 'weekdays' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], - 'weekdays_short' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], - 'weekdays_min' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], - 'meridiem' => ['Zdat azal', 'Ḍeffir aza'], - 'first_day_of_week' => 6, - 'day_of_first_week_of_year' => 1, -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ug.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ug.php deleted file mode 100644 index 259b99a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ug.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Philippe Vaucher - * - Tsutomu Kuroda - * - yasinn - */ -return [ - 'year' => '{1}'.'بىر يىل'.'|:count '.'يىل', - 'month' => '{1}'.'بىر ئاي'.'|:count '.'ئاي', - 'week' => '{1}'.'بىر ھەپتە'.'|:count '.'ھەپتە', - 'day' => '{1}'.'بىر كۈن'.'|:count '.'كۈن', - 'hour' => '{1}'.'بىر سائەت'.'|:count '.'سائەت', - 'minute' => '{1}'.'بىر مىنۇت'.'|:count '.'مىنۇت', - 'second' => '{1}'.'نەچچە سېكونت'.'|:count '.'سېكونت', - 'ago' => ':time بۇرۇن', - 'from_now' => ':time كېيىن', - 'diff_today' => 'بۈگۈن', - 'diff_yesterday' => 'تۆنۈگۈن', - 'diff_tomorrow' => 'ئەتە', - 'diff_tomorrow_regexp' => 'ئەتە(?:\\s+سائەت)?', - 'diff_today_regexp' => 'بۈگۈن(?:\\s+سائەت)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-DD', - 'LL' => 'YYYY-يىلىM-ئاينىڭD-كۈنى', - 'LLL' => 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - 'LLLL' => 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[بۈگۈن سائەت] LT', - 'nextDay' => '[ئەتە سائەت] LT', - 'nextWeek' => '[كېلەركى] dddd [سائەت] LT', - 'lastDay' => '[تۆنۈگۈن] LT', - 'lastWeek' => '[ئالدىنقى] dddd [سائەت] LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'DDD': - return $number.'-كۈنى'; - case 'w': - case 'W': - return $number.'-ھەپتە'; - default: - return $number; - } - }, - 'meridiem' => function ($hour, $minute) { - $time = $hour * 100 + $minute; - if ($time < 600) { - return 'يېرىم كېچە'; - } - if ($time < 900) { - return 'سەھەر'; - } - if ($time < 1130) { - return 'چۈشتىن بۇرۇن'; - } - if ($time < 1230) { - return 'چۈش'; - } - if ($time < 1800) { - return 'چۈشتىن كېيىن'; - } - - return 'كەچ'; - }, - 'months' => ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'], - 'months_short' => ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'], - 'weekdays' => ['يەكشەنبە', 'دۈشەنبە', 'سەيشەنبە', 'چارشەنبە', 'پەيشەنبە', 'جۈمە', 'شەنبە'], - 'weekdays_short' => ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'], - 'weekdays_min' => ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ۋە '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ug_CN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ug_CN.php deleted file mode 100644 index deb828c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ug_CN.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Kunal Marwaha - * - Alim Boyaq - */ -return require __DIR__.'/ug.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uk.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uk.php deleted file mode 100644 index 1d5ba70..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uk.php +++ /dev/null @@ -1,212 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Carbon\CarbonInterface; - -$processHoursFunction = function (CarbonInterface $date, string $format) { - return $format.'о'.($date->hour === 11 ? 'б' : '').'] LT'; -}; - -/* - * Authors: - * - Kunal Marwaha - * - Josh Soref - * - François B - * - Tim Fish - * - Serhan Apaydın - * - Max Mykhailenko - * - JD Isaacks - * - Max Kovpak - * - AucT - * - Philippe Vaucher - * - Ilya Shaplyko - * - Vadym Ievsieiev - * - Denys Kurets - * - Igor Kasyanchuk - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Oleh - * - epaminond - * - Juanito Fatas - * - Vitalii Khustochka - * - Akira Matsuda - * - Christopher Dell - * - Enrique Vidal - * - Simone Carletti - * - Aaron Patterson - * - Andriy Tyurnikov - * - Nicolás Hock Isaza - * - Iwakura Taro - * - Andrii Ponomarov - * - alecrabbit - * - vystepanenko - * - AlexWalkerson - * - Andre Havryliuk (Andrend) - * - Max Datsenko (datsenko-md) - */ -return [ - 'year' => ':count рік|:count роки|:count років', - 'y' => ':countр', - 'a_year' => '{1}рік|:count рік|:count роки|:count років', - 'month' => ':count місяць|:count місяці|:count місяців', - 'm' => ':countм', - 'a_month' => '{1}місяць|:count місяць|:count місяці|:count місяців', - 'week' => ':count тиждень|:count тижні|:count тижнів', - 'w' => ':countт', - 'a_week' => '{1}тиждень|:count тиждень|:count тижні|:count тижнів', - 'day' => ':count день|:count дні|:count днів', - 'd' => ':countд', - 'a_day' => '{1}день|:count день|:count дні|:count днів', - 'hour' => ':count година|:count години|:count годин', - 'h' => ':countг', - 'a_hour' => '{1}година|:count година|:count години|:count годин', - 'minute' => ':count хвилина|:count хвилини|:count хвилин', - 'min' => ':countхв', - 'a_minute' => '{1}хвилина|:count хвилина|:count хвилини|:count хвилин', - 'second' => ':count секунда|:count секунди|:count секунд', - 's' => ':countсек', - 'a_second' => '{1}декілька секунд|:count секунда|:count секунди|:count секунд', - - 'hour_ago' => ':count годину|:count години|:count годин', - 'a_hour_ago' => '{1}годину|:count годину|:count години|:count годин', - 'minute_ago' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_ago' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_ago' => ':count секунду|:count секунди|:count секунд', - 'a_second_ago' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'hour_from_now' => ':count годину|:count години|:count годин', - 'a_hour_from_now' => '{1}годину|:count годину|:count години|:count годин', - 'minute_from_now' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_from_now' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_from_now' => ':count секунду|:count секунди|:count секунд', - 'a_second_from_now' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'hour_after' => ':count годину|:count години|:count годин', - 'a_hour_after' => '{1}годину|:count годину|:count години|:count годин', - 'minute_after' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_after' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_after' => ':count секунду|:count секунди|:count секунд', - 'a_second_after' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'hour_before' => ':count годину|:count години|:count годин', - 'a_hour_before' => '{1}годину|:count годину|:count години|:count годин', - 'minute_before' => ':count хвилину|:count хвилини|:count хвилин', - 'a_minute_before' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', - 'second_before' => ':count секунду|:count секунди|:count секунд', - 'a_second_before' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', - - 'ago' => ':time тому', - 'from_now' => 'за :time', - 'after' => ':time після', - 'before' => ':time до', - 'diff_now' => 'щойно', - 'diff_today' => 'Сьогодні', - 'diff_today_regexp' => 'Сьогодні(?:\\s+о)?', - 'diff_yesterday' => 'вчора', - 'diff_yesterday_regexp' => 'Вчора(?:\\s+о)?', - 'diff_tomorrow' => 'завтра', - 'diff_tomorrow_regexp' => 'Завтра(?:\\s+о)?', - 'diff_before_yesterday' => 'позавчора', - 'diff_after_tomorrow' => 'післязавтра', - 'period_recurrences' => 'один раз|:count рази|:count разів', - 'period_interval' => 'кожні :interval', - 'period_start_date' => 'з :date', - 'period_end_date' => 'до :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY, HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', - ], - 'calendar' => [ - 'sameDay' => function (CarbonInterface $date) use ($processHoursFunction) { - return $processHoursFunction($date, '[Сьогодні '); - }, - 'nextDay' => function (CarbonInterface $date) use ($processHoursFunction) { - return $processHoursFunction($date, '[Завтра '); - }, - 'nextWeek' => function (CarbonInterface $date) use ($processHoursFunction) { - return $processHoursFunction($date, '[У] dddd ['); - }, - 'lastDay' => function (CarbonInterface $date) use ($processHoursFunction) { - return $processHoursFunction($date, '[Вчора '); - }, - 'lastWeek' => function (CarbonInterface $date) use ($processHoursFunction) { - switch ($date->dayOfWeek) { - case 0: - case 3: - case 5: - case 6: - return $processHoursFunction($date, '[Минулої] dddd ['); - default: - return $processHoursFunction($date, '[Минулого] dddd ['); - } - }, - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return $number.'-й'; - case 'D': - return $number.'-го'; - default: - return $number; - } - }, - 'meridiem' => function ($hour) { - if ($hour < 4) { - return 'ночі'; - } - if ($hour < 12) { - return 'ранку'; - } - if ($hour < 17) { - return 'дня'; - } - - return 'вечора'; - }, - 'months' => ['січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'], - 'months_standalone' => ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'], - 'months_short' => ['січ', 'лют', 'бер', 'кві', 'тра', 'чер', 'лип', 'сер', 'вер', 'жов', 'лис', 'гру'], - 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', - 'weekdays' => function (CarbonInterface $date, $format, $index) { - static $words = [ - 'nominative' => ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'п’ятниця', 'субота'], - 'accusative' => ['неділю', 'понеділок', 'вівторок', 'середу', 'четвер', 'п’ятницю', 'суботу'], - 'genitive' => ['неділі', 'понеділка', 'вівторка', 'середи', 'четверга', 'п’ятниці', 'суботи'], - ]; - - $format = $format ?? ''; - $nounCase = preg_match('/(\[(В|в|У|у)\])\s+dddd/u', $format) - ? 'accusative' - : ( - preg_match('/\[?(?:минулої|наступної)?\s*\]\s+dddd/u', $format) - ? 'genitive' - : 'nominative' - ); - - return $words[$nounCase][$index] ?? null; - }, - 'weekdays_short' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'weekdays_min' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' i '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uk_UA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uk_UA.php deleted file mode 100644 index bd11d86..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uk_UA.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/uk.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/unm.php b/dependencies/nesbot/carbon/src/Carbon/Lang/unm.php deleted file mode 100644 index d3f19f0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/unm.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/unm_US.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/unm_US.php b/dependencies/nesbot/carbon/src/Carbon/Lang/unm_US.php deleted file mode 100644 index fa5c374..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/unm_US.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['enikwsi', 'chkwali', 'xamokhwite', 'kwetayoxe', 'tainipen', 'kichinipen', 'lainipen', 'winaminke', 'kichitahkok', 'puksit', 'wini', 'muxkotae'], - 'months_short' => ['eni', 'chk', 'xam', 'kwe', 'tai', 'nip', 'lai', 'win', 'tah', 'puk', 'kun', 'mux'], - 'weekdays' => ['kentuwei', 'manteke', 'tusteke', 'lelai', 'tasteke', 'pelaiteke', 'sateteke'], - 'weekdays_short' => ['ken', 'man', 'tus', 'lel', 'tas', 'pel', 'sat'], - 'weekdays_min' => ['ken', 'man', 'tus', 'lel', 'tas', 'pel', 'sat'], - 'day_of_first_week_of_year' => 1, - - // Too unreliable - /* - 'year' => ':count kaxtëne', - 'y' => ':count kaxtëne', - 'a_year' => ':count kaxtëne', - - 'month' => ':count piskewëni kishux', // less reliable - 'm' => ':count piskewëni kishux', // less reliable - 'a_month' => ':count piskewëni kishux', // less reliable - - 'week' => ':count kishku', // less reliable - 'w' => ':count kishku', // less reliable - 'a_week' => ':count kishku', // less reliable - - 'day' => ':count kishku', - 'd' => ':count kishku', - 'a_day' => ':count kishku', - - 'hour' => ':count xkuk', // less reliable - 'h' => ':count xkuk', // less reliable - 'a_hour' => ':count xkuk', // less reliable - - 'minute' => ':count txituwàk', // less reliable - 'min' => ':count txituwàk', // less reliable - 'a_minute' => ':count txituwàk', // less reliable - - 'second' => ':count nisha', // less reliable - 's' => ':count nisha', // less reliable - 'a_second' => ':count nisha', // less reliable - */ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ur.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ur.php deleted file mode 100644 index dc16c2c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ur.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$months = [ - 'جنوری', - 'فروری', - 'مارچ', - 'اپریل', - 'مئی', - 'جون', - 'جولائی', - 'اگست', - 'ستمبر', - 'اکتوبر', - 'نومبر', - 'دسمبر', -]; - -$weekdays = [ - 'اتوار', - 'پیر', - 'منگل', - 'بدھ', - 'جمعرات', - 'جمعہ', - 'ہفتہ', -]; - -/* - * Authors: - * - Sawood Alam - * - Mehshan - * - Philippe Vaucher - * - Tsutomu Kuroda - * - tjku - * - Zaid Akram - * - Max Melentiev - * - hafezdivandari - * - Hossein Jabbari - * - nimamo - */ -return [ - 'year' => 'ایک سال|:count سال', - 'month' => 'ایک ماہ|:count ماہ', - 'week' => ':count ہفتے', - 'day' => 'ایک دن|:count دن', - 'hour' => 'ایک گھنٹہ|:count گھنٹے', - 'minute' => 'ایک منٹ|:count منٹ', - 'second' => 'چند سیکنڈ|:count سیکنڈ', - 'ago' => ':time قبل', - 'from_now' => ':time بعد', - 'after' => ':time بعد', - 'before' => ':time پہلے', - 'diff_now' => 'اب', - 'diff_today' => 'آج', - 'diff_today_regexp' => 'آج(?:\\s+بوقت)?', - 'diff_yesterday' => 'گزشتہ کل', - 'diff_yesterday_regexp' => 'گذشتہ(?:\\s+روز)?(?:\\s+بوقت)?', - 'diff_tomorrow' => 'آئندہ کل', - 'diff_tomorrow_regexp' => 'کل(?:\\s+بوقت)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd، D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[آج بوقت] LT', - 'nextDay' => '[کل بوقت] LT', - 'nextWeek' => 'dddd [بوقت] LT', - 'lastDay' => '[گذشتہ روز بوقت] LT', - 'lastWeek' => '[گذشتہ] dddd [بوقت] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['صبح', 'شام'], - 'months' => $months, - 'months_short' => $months, - 'weekdays' => $weekdays, - 'weekdays_short' => $weekdays, - 'weekdays_min' => $weekdays, - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => ['، ', ' اور '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ur_IN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ur_IN.php deleted file mode 100644 index f81c84d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ur_IN.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Red Hat, Pune bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ur.php', [ - 'formats' => [ - 'L' => 'D/M/YY', - ], - 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], - 'weekdays_short' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], - 'weekdays_min' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ur_PK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ur_PK.php deleted file mode 100644 index 8cd593d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ur_PK.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/ur.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'weekdays' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_short' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'weekdays_min' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ص', 'ش'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uz.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uz.php deleted file mode 100644 index 61f3b64..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uz.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Dmitriy Shabanov - * - JD Isaacks - * - Inoyatulloh - * - Jamshid - * - aarkhipov - * - Philippe Vaucher - * - felixthemagnificent - * - Tsutomu Kuroda - * - tjku - * - Max Melentiev - * - Juanito Fatas - * - Alisher Ulugbekov - * - Ergashev Adizbek - */ -return [ - 'year' => ':count йил', - 'a_year' => '{1}бир йил|:count йил', - 'y' => ':count й', - 'month' => ':count ой', - 'a_month' => '{1}бир ой|:count ой', - 'm' => ':count о', - 'week' => ':count ҳафта', - 'a_week' => '{1}бир ҳафта|:count ҳафта', - 'w' => ':count ҳ', - 'day' => ':count кун', - 'a_day' => '{1}бир кун|:count кун', - 'd' => ':count к', - 'hour' => ':count соат', - 'a_hour' => '{1}бир соат|:count соат', - 'h' => ':count с', - 'minute' => ':count дақиқа', - 'a_minute' => '{1}бир дақиқа|:count дақиқа', - 'min' => ':count д', - 'second' => ':count сония', - 'a_second' => '{1}сония|:count сония', - 's' => ':count с', - 'ago' => ':time аввал', - 'from_now' => 'Якин :time ичида', - 'after' => ':timeдан кейин', - 'before' => ':time олдин', - 'diff_now' => 'ҳозир', - 'diff_today' => 'Бугун', - 'diff_today_regexp' => 'Бугун(?:\\s+соат)?', - 'diff_yesterday' => 'Кеча', - 'diff_yesterday_regexp' => 'Кеча(?:\\s+соат)?', - 'diff_tomorrow' => 'Эртага', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'D MMMM YYYY, dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Бугун соат] LT [да]', - 'nextDay' => '[Эртага] LT [да]', - 'nextWeek' => 'dddd [куни соат] LT [да]', - 'lastDay' => '[Кеча соат] LT [да]', - 'lastWeek' => '[Утган] dddd [куни соат] LT [да]', - 'sameElse' => 'L', - ], - 'months' => ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'], - 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], - 'weekdays' => ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'], - 'weekdays_short' => ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'], - 'weekdays_min' => ['як', 'ду', 'се', 'чо', 'па', 'жу', 'ша'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['эрталаб', 'кечаси'], - 'list' => [', ', ' ва '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Arab.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Arab.php deleted file mode 100644 index ffb5131..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Arab.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/fa.php', [ - 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], - 'weekdays_short' => ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'], - 'weekdays_min' => ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'], - 'months' => ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], - 'months_short' => ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'], - 'first_day_of_week' => 6, - 'weekend' => [4, 5], - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php deleted file mode 100644 index 89e9971..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/uz.php', [ - 'formats' => [ - 'L' => 'DD/MM/yy', - 'LL' => 'D MMM, YYYY', - 'LLL' => 'D MMMM, YYYY HH:mm', - 'LLLL' => 'dddd, DD MMMM, YYYY HH:mm', - ], - 'meridiem' => ['ТО', 'ТК'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Latn.php deleted file mode 100644 index ecceeaa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_Latn.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Josh Soref - * - Rasulbek - * - Ilyosjon Kamoldinov (ilyosjon09) - */ -return [ - 'year' => ':count yil', - 'a_year' => '{1}bir yil|:count yil', - 'y' => ':count y', - 'month' => ':count oy', - 'a_month' => '{1}bir oy|:count oy', - 'm' => ':count o', - 'week' => ':count hafta', - 'a_week' => '{1}bir hafta|:count hafta', - 'w' => ':count h', - 'day' => ':count kun', - 'a_day' => '{1}bir kun|:count kun', - 'd' => ':count k', - 'hour' => ':count soat', - 'a_hour' => '{1}bir soat|:count soat', - 'h' => ':count soat', - 'minute' => ':count daqiqa', - 'a_minute' => '{1}bir daqiqa|:count daqiqa', - 'min' => ':count d', - 'second' => ':count soniya', - 'a_second' => '{1}soniya|:count soniya', - 's' => ':count son.', - 'ago' => ':time avval', - 'from_now' => 'Yaqin :time ichida', - 'after' => ':timedan keyin', - 'before' => ':time oldin', - 'diff_yesterday' => 'Kecha', - 'diff_yesterday_regexp' => 'Kecha(?:\\s+soat)?', - 'diff_today' => 'Bugun', - 'diff_today_regexp' => 'Bugun(?:\\s+soat)?', - 'diff_tomorrow' => 'Ertaga', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'D MMMM YYYY, dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Bugun soat] LT [da]', - 'nextDay' => '[Ertaga] LT [da]', - 'nextWeek' => 'dddd [kuni soat] LT [da]', - 'lastDay' => '[Kecha soat] LT [da]', - 'lastWeek' => '[O\'tgan] dddd [kuni soat] LT [da]', - 'sameElse' => 'L', - ], - 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyun', 'Iyul', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['Yakshanba', 'Dushanba', 'Seshanba', 'Chorshanba', 'Payshanba', 'Juma', 'Shanba'], - 'weekdays_short' => ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'], - 'weekdays_min' => ['Ya', 'Du', 'Se', 'Cho', 'Pa', 'Ju', 'Sha'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' va '], - 'meridiem' => ['TO', 'TK'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ.php deleted file mode 100644 index d41bfee..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Bobir Ismailov Bobir Ismailov, Pablo Saratxaga, Mashrab Kuvatov bobir_is@yahoo.com, pablo@mandrakesoft.com, kmashrab@uni-bremen.de - */ -return array_replace_recursive(require __DIR__.'/uz_Latn.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'], - 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyn', 'Iyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], - 'weekdays' => ['Yakshanba', 'Dushanba', 'Seshanba', 'Chorshanba', 'Payshanba', 'Juma', 'Shanba'], - 'weekdays_short' => ['Yak', 'Du', 'Se', 'Cho', 'Pay', 'Ju', 'Sha'], - 'weekdays_min' => ['Yak', 'Du', 'Se', 'Cho', 'Pay', 'Ju', 'Sha'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php b/dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php deleted file mode 100644 index 2fa967c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Mashrab Kuvatov Mashrab Kuvatov, Pablo Saratxaga kmashrab@uni-bremen.de, pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/uz.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['Январ', 'Феврал', 'Март', 'Апрел', 'Май', 'Июн', 'Июл', 'Август', 'Сентябр', 'Октябр', 'Ноябр', 'Декабр'], - 'months_short' => ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], - 'weekdays' => ['Якшанба', 'Душанба', 'Сешанба', 'Чоршанба', 'Пайшанба', 'Жума', 'Шанба'], - 'weekdays_short' => ['Якш', 'Душ', 'Сеш', 'Чор', 'Пай', 'Жум', 'Шан'], - 'weekdays_min' => ['Якш', 'Душ', 'Сеш', 'Чор', 'Пай', 'Жум', 'Шан'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vai.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vai.php deleted file mode 100644 index 3c378df..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vai.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], - 'weekdays_short' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], - 'weekdays_min' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], - 'months' => ['ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ', 'ꕒꕡꖝꖕ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞꔤ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋꕔꕿ ꕸꖃꗏ', 'ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ'], - 'months_short' => ['ꖨꖕꔞ', 'ꕒꕡ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋ', 'ꖨꖕꗏ'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], - - 'year' => ':count ꕀ', // less reliable - 'y' => ':count ꕀ', // less reliable - 'a_year' => ':count ꕀ', // less reliable - - 'second' => ':count ꗱꕞꕯꕊ', // less reliable - 's' => ':count ꗱꕞꕯꕊ', // less reliable - 'a_second' => ':count ꗱꕞꕯꕊ', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vai_Latn.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vai_Latn.php deleted file mode 100644 index 51e83cc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vai_Latn.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'weekdays' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], - 'weekdays_short' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], - 'weekdays_min' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], - 'months' => ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'], - 'months_short' => ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'h:mm a', - 'LTS' => 'h:mm:ss a', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm a', - 'LLLL' => 'dddd, D MMMM YYYY h:mm a', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php deleted file mode 100644 index b4bb533..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/vai.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ve.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ve.php deleted file mode 100644 index 7f10aeb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ve.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/ve_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/ve_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/ve_ZA.php deleted file mode 100644 index 5eb2b91..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/ve_ZA.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Phando', 'Luhuhi', 'Ṱhafamuhwe', 'Lambamai', 'Shundunthule', 'Fulwi', 'Fulwana', 'Ṱhangule', 'Khubvumedzi', 'Tshimedzi', 'Ḽara', 'Nyendavhusiku'], - 'months_short' => ['Pha', 'Luh', 'Fam', 'Lam', 'Shu', 'Lwi', 'Lwa', 'Ngu', 'Khu', 'Tsh', 'Ḽar', 'Nye'], - 'weekdays' => ['Swondaha', 'Musumbuluwo', 'Ḽavhuvhili', 'Ḽavhuraru', 'Ḽavhuṋa', 'Ḽavhuṱanu', 'Mugivhela'], - 'weekdays_short' => ['Swo', 'Mus', 'Vhi', 'Rar', 'ṋa', 'Ṱan', 'Mug'], - 'weekdays_min' => ['Swo', 'Mus', 'Vhi', 'Rar', 'ṋa', 'Ṱan', 'Mug'], - 'day_of_first_week_of_year' => 1, - - // Too unreliable - /* - 'day' => ':count vhege', // less reliable - 'd' => ':count vhege', // less reliable - 'a_day' => ':count vhege', // less reliable - - 'hour' => ':count watshi', // less reliable - 'h' => ':count watshi', // less reliable - 'a_hour' => ':count watshi', // less reliable - - 'minute' => ':count watshi', // less reliable - 'min' => ':count watshi', // less reliable - 'a_minute' => ':count watshi', // less reliable - - 'second' => ':count Mu', // less reliable - 's' => ':count Mu', // less reliable - 'a_second' => ':count Mu', // less reliable - - 'week' => ':count vhege', - 'w' => ':count vhege', - 'a_week' => ':count vhege', - */ -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vi.php deleted file mode 100644 index 73e2852..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vi.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Andre Polykanine A.K.A. Menelion Elensúlë - * - JD Isaacks - */ -return [ - 'year' => ':count năm', - 'a_year' => '{1}một năm|]1, Inf[:count năm', - 'y' => ':count năm', - 'month' => ':count tháng', - 'a_month' => '{1}một tháng|]1, Inf[:count tháng', - 'm' => ':count tháng', - 'week' => ':count tuần', - 'a_week' => '{1}một tuần|]1, Inf[:count tuần', - 'w' => ':count tuần', - 'day' => ':count ngày', - 'a_day' => '{1}một ngày|]1, Inf[:count ngày', - 'd' => ':count ngày', - 'hour' => ':count giờ', - 'a_hour' => '{1}một giờ|]1, Inf[:count giờ', - 'h' => ':count giờ', - 'minute' => ':count phút', - 'a_minute' => '{1}một phút|]1, Inf[:count phút', - 'min' => ':count phút', - 'second' => ':count giây', - 'a_second' => '{1}vài giây|]1, Inf[:count giây', - 's' => ':count giây', - 'ago' => ':time trước', - 'from_now' => ':time tới', - 'after' => ':time sau', - 'before' => ':time trước', - 'diff_now' => 'bây giờ', - 'diff_today' => 'Hôm', - 'diff_today_regexp' => 'Hôm(?:\\s+nay)?(?:\\s+lúc)?', - 'diff_yesterday' => 'Hôm qua', - 'diff_yesterday_regexp' => 'Hôm(?:\\s+qua)?(?:\\s+lúc)?', - 'diff_tomorrow' => 'Ngày mai', - 'diff_tomorrow_regexp' => 'Ngày(?:\\s+mai)?(?:\\s+lúc)?', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM [năm] YYYY', - 'LLL' => 'D MMMM [năm] YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM [năm] YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[Hôm nay lúc] LT', - 'nextDay' => '[Ngày mai lúc] LT', - 'nextWeek' => 'dddd [tuần tới lúc] LT', - 'lastDay' => '[Hôm qua lúc] LT', - 'lastWeek' => 'dddd [tuần trước lúc] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['SA', 'CH'], - 'months' => ['tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8', 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'], - 'months_short' => ['Th01', 'Th02', 'Th03', 'Th04', 'Th05', 'Th06', 'Th07', 'Th08', 'Th09', 'Th10', 'Th11', 'Th12'], - 'weekdays' => ['chủ nhật', 'thứ hai', 'thứ ba', 'thứ tư', 'thứ năm', 'thứ sáu', 'thứ bảy'], - 'weekdays_short' => ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], - 'weekdays_min' => ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => [', ', ' và '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vi_VN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vi_VN.php deleted file mode 100644 index 18d8987..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vi_VN.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/vi.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vo.php deleted file mode 100644 index e273033..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vo.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY-MM-dd', - 'LL' => 'YYYY MMM D', - 'LLL' => 'YYYY MMMM D HH:mm', - 'LLLL' => 'YYYY MMMM D, dddd HH:mm', - ], - - 'year' => ':count yel', - 'y' => ':count yel', - 'a_year' => ':count yel', - - 'month' => ':count mul', - 'm' => ':count mul', - 'a_month' => ':count mul', - - 'week' => ':count vig', - 'w' => ':count vig', - 'a_week' => ':count vig', - - 'day' => ':count del', - 'd' => ':count del', - 'a_day' => ':count del', - - 'hour' => ':count düp', - 'h' => ':count düp', - 'a_hour' => ':count düp', - - 'minute' => ':count minut', - 'min' => ':count minut', - 'a_minute' => ':count minut', - - 'second' => ':count sekun', - 's' => ':count sekun', - 'a_second' => ':count sekun', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/vun.php b/dependencies/nesbot/carbon/src/Carbon/Lang/vun.php deleted file mode 100644 index ed92e8e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/vun.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['utuko', 'kyiukonyi'], - 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], - 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], - 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wa.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wa.php deleted file mode 100644 index f6dc4cc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wa.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wa_BE.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wa_BE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wa_BE.php deleted file mode 100644 index a76d80d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wa_BE.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Djan SACRE Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['di djanvî', 'di fevrî', 'di måss', 'd’ avri', 'di may', 'di djun', 'di djulete', 'd’ awousse', 'di setimbe', 'd’ octôbe', 'di nôvimbe', 'di decimbe'], - 'months_short' => ['dja', 'fev', 'mås', 'avr', 'may', 'djn', 'djl', 'awo', 'set', 'oct', 'nôv', 'dec'], - 'weekdays' => ['dimegne', 'londi', 'mårdi', 'mierkidi', 'djudi', 'vénrdi', 'semdi'], - 'weekdays_short' => ['dim', 'lon', 'mår', 'mie', 'dju', 'vén', 'sem'], - 'weekdays_min' => ['dim', 'lon', 'mår', 'mie', 'dju', 'vén', 'sem'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'year' => ':count anêye', - 'y' => ':count anêye', - 'a_year' => ':count anêye', - - 'month' => ':count meûs', - 'm' => ':count meûs', - 'a_month' => ':count meûs', - - 'week' => ':count samwinne', - 'w' => ':count samwinne', - 'a_week' => ':count samwinne', - - 'day' => ':count djoû', - 'd' => ':count djoû', - 'a_day' => ':count djoû', - - 'hour' => ':count eure', - 'h' => ':count eure', - 'a_hour' => ':count eure', - - 'minute' => ':count munute', - 'min' => ':count munute', - 'a_minute' => ':count munute', - - 'second' => ':count Sigonde', - 's' => ':count Sigonde', - 'a_second' => ':count Sigonde', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wae.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wae.php deleted file mode 100644 index bf57f23..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wae.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wae_CH.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wae_CH.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wae_CH.php deleted file mode 100644 index 2af50b4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wae_CH.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Walser Translation Team ml@translate-wae.ch - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], - 'months' => ['Jenner', 'Hornig', 'Märze', 'Abrille', 'Meije', 'Bráčet', 'Heiwet', 'Öigšte', 'Herbštmánet', 'Wímánet', 'Wintermánet', 'Chrištmánet'], - 'months_short' => ['Jen', 'Hor', 'Mär', 'Abr', 'Mei', 'Brá', 'Hei', 'Öig', 'Her', 'Wím', 'Win', 'Chr'], - 'weekdays' => ['Suntag', 'Mäntag', 'Zischtag', 'Mittwuch', 'Frontag', 'Fritag', 'Samschtag'], - 'weekdays_short' => ['Sun', 'Män', 'Zis', 'Mit', 'Fro', 'Fri', 'Sam'], - 'weekdays_min' => ['Sun', 'Män', 'Zis', 'Mit', 'Fro', 'Fri', 'Sam'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - - 'month' => ':count Maano', // less reliable - 'm' => ':count Maano', // less reliable - 'a_month' => ':count Maano', // less reliable -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wal.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wal.php deleted file mode 100644 index e8ec40f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wal.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wal_ET.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wal_ET.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wal_ET.php deleted file mode 100644 index a4e619a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wal_ET.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Ge'ez Frontier Foundation locales@geez.org - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], - 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], - 'weekdays' => ['ወጋ', 'ሳይኖ', 'ማቆሳኛ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ'], - 'weekdays_short' => ['ወጋ ', 'ሳይኖ', 'ማቆሳ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ '], - 'weekdays_min' => ['ወጋ ', 'ሳይኖ', 'ማቆሳ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ '], - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['ማለዶ', 'ቃማ'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wo.php deleted file mode 100644 index 74b95df..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wo.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/wo_SN.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/wo_SN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/wo_SN.php deleted file mode 100644 index f8a85b3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/wo_SN.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - The Debian Project Christian Perrier bubulle@debian.org - */ -return [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD.MM.YYYY', - 'LL' => 'MMMM DD, YYYY', - 'LLL' => 'DD MMM HH:mm', - 'LLLL' => 'MMMM DD, YYYY HH:mm', - ], - 'months' => ['sanwiy\'e', 'feebriy\'e', 'mars', 'awril', 'me', 'suwen', 'sulet', 'uut', 'septaambar', 'oktoobar', 'nowaambar', 'desaambar'], - 'months_short' => ['san', 'fee', 'mar', 'awr', 'me ', 'suw', 'sul', 'uut', 'sep', 'okt', 'now', 'des'], - 'weekdays' => ['dib\'eer', 'altine', 'talaata', 'allarba', 'alxames', 'ajjuma', 'gaawu'], - 'weekdays_short' => ['dib', 'alt', 'tal', 'all', 'alx', 'ajj', 'gaa'], - 'weekdays_min' => ['dib', 'alt', 'tal', 'all', 'alx', 'ajj', 'gaa'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'year' => ':count at', - 'month' => ':count wèr', - 'week' => ':count ayubés', - 'day' => ':count bés', - 'hour' => ':count waxtu', - 'minute' => ':count simili', - 'second' => ':count saa', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/xh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/xh.php deleted file mode 100644 index e88c78d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/xh.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/xh_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/xh_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/xh_ZA.php deleted file mode 100644 index 910f831..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/xh_ZA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['eyoMqungu', 'eyoMdumba', 'eyoKwindla', 'uTshazimpuzi', 'uCanzibe', 'eyeSilimela', 'eyeKhala', 'eyeThupa', 'eyoMsintsi', 'eyeDwarha', 'eyeNkanga', 'eyoMnga'], - 'months_short' => ['Mqu', 'Mdu', 'Kwi', 'Tsh', 'Can', 'Sil', 'Kha', 'Thu', 'Msi', 'Dwa', 'Nka', 'Mng'], - 'weekdays' => ['iCawa', 'uMvulo', 'lwesiBini', 'lwesiThathu', 'ulweSine', 'lwesiHlanu', 'uMgqibelo'], - 'weekdays_short' => ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'weekdays_min' => ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'day_of_first_week_of_year' => 1, - - 'year' => ':count ihlobo', // less reliable - 'y' => ':count ihlobo', // less reliable - 'a_year' => ':count ihlobo', // less reliable - - 'hour' => ':count iwotshi', // less reliable - 'h' => ':count iwotshi', // less reliable - 'a_hour' => ':count iwotshi', // less reliable - - 'minute' => ':count ingqalelo', // less reliable - 'min' => ':count ingqalelo', // less reliable - 'a_minute' => ':count ingqalelo', // less reliable - - 'second' => ':count nceda', // less reliable - 's' => ':count nceda', // less reliable - 'a_second' => ':count nceda', // less reliable - - 'month' => ':count inyanga', - 'm' => ':count inyanga', - 'a_month' => ':count inyanga', - - 'week' => ':count veki', - 'w' => ':count veki', - 'a_week' => ':count veki', - - 'day' => ':count imini', - 'd' => ':count imini', - 'a_day' => ':count imini', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/xog.php b/dependencies/nesbot/carbon/src/Carbon/Lang/xog.php deleted file mode 100644 index eb55b4a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/xog.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['Munkyo', 'Eigulo'], - 'weekdays' => ['Sabiiti', 'Balaza', 'Owokubili', 'Owokusatu', 'Olokuna', 'Olokutaanu', 'Olomukaaga'], - 'weekdays_short' => ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'], - 'weekdays_min' => ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'], - 'months' => ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'], - 'months_short' => ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yav.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yav.php deleted file mode 100644 index 225a20d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yav.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/en.php', [ - 'meridiem' => ['kiɛmɛ́ɛm', 'kisɛ́ndɛ'], - 'weekdays' => ['sɔ́ndiɛ', 'móndie', 'muányáŋmóndie', 'metúkpíápɛ', 'kúpélimetúkpiapɛ', 'feléte', 'séselé'], - 'weekdays_short' => ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'], - 'weekdays_min' => ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'], - 'months' => ['pikítíkítie, oólí ú kutúan', 'siɛyɛ́, oóli ú kándíɛ', 'ɔnsúmbɔl, oóli ú kátátúɛ', 'mesiŋ, oóli ú kénie', 'ensil, oóli ú kátánuɛ', 'ɔsɔn', 'efute', 'pisuyú', 'imɛŋ i puɔs', 'imɛŋ i putúk,oóli ú kátíɛ', 'makandikɛ', 'pilɔndɔ́'], - 'months_short' => ['o.1', 'o.2', 'o.3', 'o.4', 'o.5', 'o.6', 'o.7', 'o.8', 'o.9', 'o.10', 'o.11', 'o.12'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'D/M/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yi.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yi.php deleted file mode 100644 index 8f32022..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yi.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/yi_US.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yi_US.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yi_US.php deleted file mode 100644 index f764d36..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yi_US.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - http://www.uyip.org/ Pablo Saratxaga pablo@mandrakesoft.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['יאַנואַר', 'פֿעברואַר', 'מערץ', 'אַפּריל', 'מיי', 'יוני', 'יולי', 'אויגוסט', 'סעפּטעמבער', 'אקטאבער', 'נאוועמבער', 'דעצעמבער'], - 'months_short' => ['יאַנ', 'פֿעב', 'מאַר', 'אַפּר', 'מײַ ', 'יונ', 'יול', 'אױג', 'סעפּ', 'אָקט', 'נאָװ', 'דעצ'], - 'weekdays' => ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטװאָך', 'דאָנערשטיק', 'פֿרײַטיק', 'שבת'], - 'weekdays_short' => ['זונ\'', 'מאָנ\'', 'דינ\'', 'מיט\'', 'דאָנ\'', 'פֿרײַ\'', 'שבת'], - 'weekdays_min' => ['זונ\'', 'מאָנ\'', 'דינ\'', 'מיט\'', 'דאָנ\'', 'פֿרײַ\'', 'שבת'], - 'day_of_first_week_of_year' => 1, - - 'year' => ':count יאר', - 'y' => ':count יאר', - 'a_year' => ':count יאר', - - 'month' => ':count חודש', - 'm' => ':count חודש', - 'a_month' => ':count חודש', - - 'week' => ':count וואָך', - 'w' => ':count וואָך', - 'a_week' => ':count וואָך', - - 'day' => ':count טאָג', - 'd' => ':count טאָג', - 'a_day' => ':count טאָג', - - 'hour' => ':count שעה', - 'h' => ':count שעה', - 'a_hour' => ':count שעה', - - 'minute' => ':count מינוט', - 'min' => ':count מינוט', - 'a_minute' => ':count מינוט', - - 'second' => ':count סעקונדע', - 's' => ':count סעקונדע', - 'a_second' => ':count סעקונדע', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yo.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yo.php deleted file mode 100644 index 0a82981..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yo.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - François B - * - Atolagbe Abisoye - */ -return [ - 'year' => 'ọdún :count', - 'a_year' => '{1}ọdún kan|ọdún :count', - 'month' => 'osù :count', - 'a_month' => '{1}osù kan|osù :count', - 'week' => 'ọsẹ :count', - 'a_week' => '{1}ọsẹ kan|ọsẹ :count', - 'day' => 'ọjọ́ :count', - 'a_day' => '{1}ọjọ́ kan|ọjọ́ :count', - 'hour' => 'wákati :count', - 'a_hour' => '{1}wákati kan|wákati :count', - 'minute' => 'ìsẹjú :count', - 'a_minute' => '{1}ìsẹjú kan|ìsẹjú :count', - 'second' => 'iaayá :count', - 'a_second' => '{1}ìsẹjú aayá die|aayá :count', - 'ago' => ':time kọjá', - 'from_now' => 'ní :time', - 'diff_yesterday' => 'Àna', - 'diff_yesterday_regexp' => 'Àna(?:\\s+ni)?', - 'diff_today' => 'Ònì', - 'diff_today_regexp' => 'Ònì(?:\\s+ni)?', - 'diff_tomorrow' => 'Ọ̀la', - 'diff_tomorrow_regexp' => 'Ọ̀la(?:\\s+ni)?', - 'formats' => [ - 'LT' => 'h:mm A', - 'LTS' => 'h:mm:ss A', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY h:mm A', - 'LLLL' => 'dddd, D MMMM YYYY h:mm A', - ], - 'calendar' => [ - 'sameDay' => '[Ònì ni] LT', - 'nextDay' => '[Ọ̀la ni] LT', - 'nextWeek' => 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', - 'lastDay' => '[Àna ni] LT', - 'lastWeek' => 'dddd [Ọsẹ̀ tólọ́] [ni] LT', - 'sameElse' => 'L', - ], - 'ordinal' => 'ọjọ́ :number', - 'months' => ['Sẹ́rẹ́', 'Èrèlè', 'Ẹrẹ̀nà', 'Ìgbé', 'Èbibi', 'Òkùdu', 'Agẹmo', 'Ògún', 'Owewe', 'Ọ̀wàrà', 'Bélú', 'Ọ̀pẹ̀̀'], - 'months_short' => ['Sẹ́r', 'Èrl', 'Ẹrn', 'Ìgb', 'Èbi', 'Òkù', 'Agẹ', 'Ògú', 'Owe', 'Ọ̀wà', 'Bél', 'Ọ̀pẹ̀̀'], - 'weekdays' => ['Àìkú', 'Ajé', 'Ìsẹ́gun', 'Ọjọ́rú', 'Ọjọ́bọ', 'Ẹtì', 'Àbámẹ́ta'], - 'weekdays_short' => ['Àìk', 'Ajé', 'Ìsẹ́', 'Ọjr', 'Ọjb', 'Ẹtì', 'Àbá'], - 'weekdays_min' => ['Àì', 'Aj', 'Ìs', 'Ọr', 'Ọb', 'Ẹt', 'Àb'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'meridiem' => ['Àárọ̀', 'Ọ̀sán'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yo_BJ.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yo_BJ.php deleted file mode 100644 index 12b9e81..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yo_BJ.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return array_replace_recursive(require __DIR__.'/yo.php', [ - 'meridiem' => ['Àárɔ̀', 'Ɔ̀sán'], - 'weekdays' => ['Ɔjɔ́ Àìkú', 'Ɔjɔ́ Ajé', 'Ɔjɔ́ Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɔjɔ́ Ɛtì', 'Ɔjɔ́ Àbámɛ́ta'], - 'weekdays_short' => ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'], - 'weekdays_min' => ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'], - 'months' => ['Oshù Shɛ́rɛ́', 'Oshù Èrèlè', 'Oshù Ɛrɛ̀nà', 'Oshù Ìgbé', 'Oshù Ɛ̀bibi', 'Oshù Òkúdu', 'Oshù Agɛmɔ', 'Oshù Ògún', 'Oshù Owewe', 'Oshù Ɔ̀wàrà', 'Oshù Bélú', 'Oshù Ɔ̀pɛ̀'], - 'months_short' => ['Shɛ́rɛ́', 'Èrèlè', 'Ɛrɛ̀nà', 'Ìgbé', 'Ɛ̀bibi', 'Òkúdu', 'Agɛmɔ', 'Ògún', 'Owewe', 'Ɔ̀wàrà', 'Bélú', 'Ɔ̀pɛ̀'], - 'first_day_of_week' => 1, - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd, D MMMM YYYY HH:mm', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yo_NG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yo_NG.php deleted file mode 100644 index 6860bc1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yo_NG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/yo.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yue.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yue.php deleted file mode 100644 index ce233a4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yue.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/yue_HK.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yue_HK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yue_HK.php deleted file mode 100644 index 4e7d5c3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yue_HK.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/zh_HK.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日 dddd', - ], - 'months' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 0, - 'day_of_first_week_of_year' => 1, - 'meridiem' => ['上午', '下午'], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hans.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hans.php deleted file mode 100644 index db913ca..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hans.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hant.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hant.php deleted file mode 100644 index e2526f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yue_Hant.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yuw.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yuw.php deleted file mode 100644 index 8efdc93..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yuw.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/yuw_PG.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/yuw_PG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/yuw_PG.php deleted file mode 100644 index b99ad2e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/yuw_PG.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Information from native speakers Hannah Sarvasy nungon.localization@gmail.com - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YY', - ], - 'months' => ['jenuari', 'febuari', 'mas', 'epril', 'mei', 'jun', 'julai', 'ögus', 'septemba', 'öktoba', 'nöwemba', 'diksemba'], - 'months_short' => ['jen', 'feb', 'mas', 'epr', 'mei', 'jun', 'jul', 'ögu', 'sep', 'ökt', 'nöw', 'dis'], - 'weekdays' => ['sönda', 'mönda', 'sinda', 'mitiwö', 'sogipbono', 'nenggo', 'söndanggie'], - 'weekdays_short' => ['sön', 'mön', 'sin', 'mit', 'soi', 'nen', 'sab'], - 'weekdays_min' => ['sön', 'mön', 'sin', 'mit', 'soi', 'nen', 'sab'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zgh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zgh.php deleted file mode 100644 index 4d2c3b3..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zgh.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - BAKTETE Miloud - */ -return [ - 'year' => ':count ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', - 'a_year' => 'ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', - 'y' => ':count ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', - 'month' => ':count ⵡⴰⵢⵢⵓⵔ|:count ⴰⵢⵢⵓⵔⵏ', - 'a_month' => 'ⵉⴷⵊ ⵡⴰⵢⵢⵓⵔ|:count ⴰⵢⵢⵓⵔⵏ', - 'm' => ':count ⴰⵢⵢⵓⵔⵏ', - 'week' => ':count ⵉⵎⴰⵍⴰⵙⵙ|:count ⵉⵎⴰⵍⴰⵙⵙⵏ', - 'a_week' => 'ⵉⵛⵜ ⵉⵎⴰⵍⴰⵙⵙ|:count ⵉⵎⴰⵍⴰⵙⵙⵏ', - 'w' => ':count ⵉⵎⴰⵍⴰⵙⵙ.', - 'day' => ':count ⵡⴰⵙⵙ|:count ⵓⵙⵙⴰⵏ', - 'a_day' => 'ⵉⴷⵊ ⵡⴰⵙⵙ|:count ⵓⵙⵙⴰⵏ', - 'd' => ':count ⵓ', - 'hour' => ':count ⵜⵙⵔⴰⴳⵜ|:count ⵜⵉⵙⵔⴰⴳⵉⵏ', - 'a_hour' => 'ⵉⵛⵜ ⵜⵙⵔⴰⴳⵜ|:count ⵜⵉⵙⵔⴰⴳⵉⵏ', - 'h' => ':count ⵜ', - 'minute' => ':count ⵜⵓⵙⴷⵉⴷⵜ|:count ⵜⵓⵙⴷⵉⴷⵉⵏ', - 'a_minute' => 'ⵉⵛⵜ ⵜⵓⵙⴷⵉⴷⵜ|:count ⵜⵓⵙⴷⵉⴷⵉⵏ', - 'min' => ':count ⵜⵓⵙ', - 'second' => ':count ⵜⵙⵉⵏⵜ|:count ⵜⵉⵙⵉⵏⴰ', - 'a_second' => 'ⴽⵔⴰ ⵜⵉⵙⵉⵏⴰ|:count ⵜⵉⵙⵉⵏⴰ', - 's' => ':count ⵜ', - 'ago' => 'ⵣⴳ :time', - 'from_now' => 'ⴷⴳ :time', - 'after' => ':time ⴰⵡⴰⵔ', - 'before' => ':time ⴷⴰⵜ', - 'diff_now' => 'ⴰⴷⵡⴰⵍⵉ', - 'diff_today' => 'ⴰⵙⵙ', - 'diff_today_regexp' => 'ⴰⵙⵙ(?:\\s+ⴰ/ⴰⴷ)?(?:\\s+ⴳ)?', - 'diff_yesterday' => 'ⴰⵙⵙⵏⵏⴰⵟ', - 'diff_yesterday_regexp' => 'ⴰⵙⵙⵏⵏⴰⵟ(?:\\s+ⴳ)?', - 'diff_tomorrow' => 'ⴰⵙⴽⴽⴰ', - 'diff_tomorrow_regexp' => 'ⴰⵙⴽⴽⴰ(?:\\s+ⴳ)?', - 'diff_before_yesterday' => 'ⴼⵔ ⵉⴹⵏⵏⴰⵟ', - 'diff_after_tomorrow' => 'ⵏⴰⴼ ⵓⵙⴽⴽⴰ', - 'period_recurrences' => ':count ⵜⵉⴽⴽⴰⵍ', - 'period_interval' => 'ⴽⵓ :interval', - 'period_start_date' => 'ⴳ :date', - 'period_end_date' => 'ⵉ :date', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'DD/MM/YYYY', - 'LL' => 'D MMMM YYYY', - 'LLL' => 'D MMMM YYYY HH:mm', - 'LLLL' => 'dddd D MMMM YYYY HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[ⴰⵙⵙ ⴰ/ⴰⴷ ⴳ] LT', - 'nextDay' => '[ⴰⵙⴽⴽⴰ ⴳ] LT', - 'nextWeek' => 'dddd [ⴳ] LT', - 'lastDay' => '[ⴰⵙⵙⵏⵏⴰⵟ ⴳ] LT', - 'lastWeek' => 'dddd [ⴰⵎⴳⴳⴰⵔⵓ ⴳ] LT', - 'sameElse' => 'L', - ], - 'meridiem' => ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'], - 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'], - 'months_short' => ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵟⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'], - 'weekdays' => ['ⵓⵙⴰⵎⴰⵙ', 'ⵡⴰⵢⵏⴰⵙ', 'ⵓⵙⵉⵏⴰⵙ', 'ⵡⴰⴽⵕⴰⵙ', 'ⵓⴽⵡⴰⵙ', 'ⵓⵙⵉⵎⵡⴰⵙ', 'ⵓⵙⵉⴹⵢⴰⵙ'], - 'weekdays_short' => ['ⵓⵙⴰ', 'ⵡⴰⵢ', 'ⵓⵙⵉ', 'ⵡⴰⴽ', 'ⵓⴽⵡ', 'ⵓⵙⵉⵎ', 'ⵓⵙⵉⴹ'], - 'weekdays_min' => ['ⵓⵙⴰ', 'ⵡⴰⵢ', 'ⵓⵙⵉ', 'ⵡⴰⴽ', 'ⵓⴽⵡ', 'ⵓⵙⵉⵎ', 'ⵓⵙⵉⴹ'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 1, - 'list' => [', ', ' ⴷ '], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh.php deleted file mode 100644 index 1187c3d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - xuri - * - sycuato - * - bokideckonja - * - Luo Ning - * - William Yang (williamyang233) - */ -return array_merge(require __DIR__.'/zh_Hans.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 A h点mm分', - 'LLLL' => 'YYYY年M月D日dddd A h点mm分', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_CN.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_CN.php deleted file mode 100644 index 9c05d5a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_CN.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - monkeycon - * - François B - * - Jason Katz-Brown - * - Serhan Apaydın - * - Matt Johnson - * - JD Isaacks - * - Zeno Zeng - * - Chris Hemp - * - shankesgk2 - */ -return array_merge(require __DIR__.'/zh.php', [ - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日Ah点mm分', - 'LLLL' => 'YYYY年M月D日ddddAh点mm分', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_HK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_HK.php deleted file mode 100644 index c3ee9fc..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_HK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant_HK.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans.php deleted file mode 100644 index 9b91785..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans.php +++ /dev/null @@ -1,109 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - monkeycon - * - François B - * - Jason Katz-Brown - * - Konstantin Konev - * - Chris Lam - * - Serhan Apaydın - * - Gary Lo - * - JD Isaacks - * - Chris Hemp - * - shankesgk2 - * - Daniel Cheung (danvim) - */ -return [ - 'year' => ':count:optional-space年', - 'y' => ':count:optional-space年', - 'month' => ':count:optional-space个月', - 'm' => ':count:optional-space个月', - 'week' => ':count:optional-space周', - 'w' => ':count:optional-space周', - 'day' => ':count:optional-space天', - 'd' => ':count:optional-space天', - 'hour' => ':count:optional-space小时', - 'h' => ':count:optional-space小时', - 'minute' => ':count:optional-space分钟', - 'min' => ':count:optional-space分钟', - 'second' => ':count:optional-space秒', - 'a_second' => '{1}几秒|]1,Inf[:count:optional-space秒', - 's' => ':count:optional-space秒', - 'ago' => ':time前', - 'from_now' => ':time后', - 'after' => ':time后', - 'before' => ':time前', - 'diff_now' => '现在', - 'diff_today' => '今天', - 'diff_yesterday' => '昨天', - 'diff_tomorrow' => '明天', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 HH:mm', - 'LLLL' => 'YYYY年M月D日dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[今天]LT', - 'nextDay' => '[明天]LT', - 'nextWeek' => '[下]ddddLT', - 'lastDay' => '[昨天]LT', - 'lastWeek' => '[上]ddddLT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'DDD': - return $number.'日'; - case 'M': - return $number.'月'; - case 'w': - case 'W': - return $number.'周'; - default: - return $number; - } - }, - 'meridiem' => function ($hour, $minute) { - $time = $hour * 100 + $minute; - if ($time < 600) { - return '凌晨'; - } - if ($time < 900) { - return '早上'; - } - if ($time < 1130) { - return '上午'; - } - if ($time < 1230) { - return '中午'; - } - if ($time < 1800) { - return '下午'; - } - - return '晚上'; - }, - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => '', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php deleted file mode 100644 index db913ca..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php deleted file mode 100644 index db913ca..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php deleted file mode 100644 index db913ca..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hans.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant.php deleted file mode 100644 index a27b610..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Adam - * - monkeycon - * - François B - * - Jason Katz-Brown - * - Chris Lam - * - Serhan Apaydın - * - Gary Lo - * - JD Isaacks - * - Chris Hemp - * - Eddie - * - KID - * - shankesgk2 - * - Daniel Cheung (danvim) - */ -return [ - 'year' => ':count:optional-space年', - 'y' => ':count:optional-space年', - 'month' => ':count:optional-space個月', - 'm' => ':count:optional-space月', - 'week' => ':count:optional-space週', - 'w' => ':count:optional-space週', - 'day' => ':count:optional-space天', - 'd' => ':count:optional-space天', - 'hour' => ':count:optional-space小時', - 'h' => ':count:optional-space小時', - 'minute' => ':count:optional-space分鐘', - 'min' => ':count:optional-space分鐘', - 'second' => ':count:optional-space秒', - 'a_second' => '{1}幾秒|]1,Inf[:count:optional-space秒', - 's' => ':count:optional-space秒', - 'ago' => ':time前', - 'from_now' => ':time後', - 'after' => ':time後', - 'before' => ':time前', - 'diff_now' => '現在', - 'diff_today' => '今天', - 'diff_yesterday' => '昨天', - 'diff_tomorrow' => '明天', - 'formats' => [ - 'LT' => 'HH:mm', - 'LTS' => 'HH:mm:ss', - 'L' => 'YYYY/MM/DD', - 'LL' => 'YYYY年M月D日', - 'LLL' => 'YYYY年M月D日 HH:mm', - 'LLLL' => 'YYYY年M月D日dddd HH:mm', - ], - 'calendar' => [ - 'sameDay' => '[今天] LT', - 'nextDay' => '[明天] LT', - 'nextWeek' => '[下]dddd LT', - 'lastDay' => '[昨天] LT', - 'lastWeek' => '[上]dddd LT', - 'sameElse' => 'L', - ], - 'ordinal' => function ($number, $period) { - switch ($period) { - case 'd': - case 'D': - case 'DDD': - return $number.'日'; - case 'M': - return $number.'月'; - case 'w': - case 'W': - return $number.'周'; - default: - return $number; - } - }, - 'meridiem' => function ($hour, $minute) { - $time = $hour * 100 + $minute; - if ($time < 600) { - return '凌晨'; - } - if ($time < 900) { - return '早上'; - } - if ($time < 1130) { - return '上午'; - } - if ($time < 1230) { - return '中午'; - } - if ($time < 1800) { - return '下午'; - } - - return '晚上'; - }, - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'first_day_of_week' => 1, - 'day_of_first_week_of_year' => 4, - 'list' => '', -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php deleted file mode 100644 index e2526f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php deleted file mode 100644 index e2526f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php deleted file mode 100644 index e2526f1..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_MO.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_MO.php deleted file mode 100644 index 1c86d47..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_MO.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - tarunvelli - * - Eddie - * - KID - * - shankesgk2 - */ -return array_replace_recursive(require __DIR__.'/zh_Hant.php', [ - 'after' => ':time后', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_SG.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_SG.php deleted file mode 100644 index c451a56..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_SG.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/zh.php', [ - 'formats' => [ - 'L' => 'YYYY年MM月DD日', - ], - 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'months_short' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], - 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], - 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], - 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], - 'day_of_first_week_of_year' => 1, -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_TW.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_TW.php deleted file mode 100644 index c6789ed..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_TW.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return require __DIR__.'/zh_Hant_TW.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_YUE.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zh_YUE.php deleted file mode 100644 index b0d9ba8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zh_YUE.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org - */ -return array_replace_recursive(require __DIR__.'/zh.php', [ - 'formats' => [ - 'L' => 'YYYY-MM-DD', - ], -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zu.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zu.php deleted file mode 100644 index 9a6cce0..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zu.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Unknown default region, use the first alphabetically. - */ -return require __DIR__.'/zu_ZA.php'; diff --git a/dependencies/nesbot/carbon/src/Carbon/Lang/zu_ZA.php b/dependencies/nesbot/carbon/src/Carbon/Lang/zu_ZA.php deleted file mode 100644 index 6bfb72f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Lang/zu_ZA.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * Authors: - * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za - */ -return array_replace_recursive(require __DIR__.'/en.php', [ - 'formats' => [ - 'L' => 'DD/MM/YYYY', - ], - 'months' => ['Januwari', 'Februwari', 'Mashi', 'Ephreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septhemba', 'Okthoba', 'Novemba', 'Disemba'], - 'months_short' => ['Jan', 'Feb', 'Mas', 'Eph', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'], - 'weekdays' => ['iSonto', 'uMsombuluko', 'uLwesibili', 'uLwesithathu', 'uLwesine', 'uLwesihlanu', 'uMgqibelo'], - 'weekdays_short' => ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'weekdays_min' => ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'], - 'day_of_first_week_of_year' => 1, - - 'year' => 'kweminyaka engu-:count', - 'y' => 'kweminyaka engu-:count', - 'a_year' => 'kweminyaka engu-:count', - - 'month' => 'izinyanga ezingu-:count', - 'm' => 'izinyanga ezingu-:count', - 'a_month' => 'izinyanga ezingu-:count', - - 'week' => 'lwamasonto angu-:count', - 'w' => 'lwamasonto angu-:count', - 'a_week' => 'lwamasonto angu-:count', - - 'day' => 'ezingaba ngu-:count', - 'd' => 'ezingaba ngu-:count', - 'a_day' => 'ezingaba ngu-:count', - - 'hour' => 'amahora angu-:count', - 'h' => 'amahora angu-:count', - 'a_hour' => 'amahora angu-:count', - - 'minute' => 'ngemizuzu engu-:count', - 'min' => 'ngemizuzu engu-:count', - 'a_minute' => 'ngemizuzu engu-:count', - - 'second' => 'imizuzwana engu-:count', - 's' => 'imizuzwana engu-:count', - 'a_second' => 'imizuzwana engu-:count', -]); diff --git a/dependencies/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php b/dependencies/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php deleted file mode 100644 index 00e1bfa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Laravel; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -use WP_Ultimo\Dependencies\Carbon\CarbonInterval; -use WP_Ultimo\Dependencies\Carbon\CarbonPeriod; -use WP_Ultimo\Dependencies\Illuminate\Contracts\Events\Dispatcher as DispatcherContract; -use WP_Ultimo\Dependencies\Illuminate\Events\Dispatcher; -use WP_Ultimo\Dependencies\Illuminate\Events\EventDispatcher; -use WP_Ultimo\Dependencies\Illuminate\Support\Carbon as IlluminateCarbon; -use WP_Ultimo\Dependencies\Illuminate\Support\Facades\Date; -use Throwable; -class ServiceProvider extends \WP_Ultimo\Dependencies\Illuminate\Support\ServiceProvider -{ - /** @var callable|null */ - protected $appGetter = null; - /** @var callable|null */ - protected $localeGetter = null; - public function setAppGetter(?callable $appGetter) : void - { - $this->appGetter = $appGetter; - } - public function setLocaleGetter(?callable $localeGetter) : void - { - $this->localeGetter = $localeGetter; - } - public function boot() - { - $this->updateLocale(); - if (!$this->app->bound('events')) { - return; - } - $service = $this; - $events = $this->app['events']; - if ($this->isEventDispatcher($events)) { - $events->listen(\class_exists('WP_Ultimo\\Dependencies\\Illuminate\\Foundation\\Events\\LocaleUpdated') ? 'Illuminate\\Foundation\\Events\\LocaleUpdated' : 'locale.changed', function () use($service) { - $service->updateLocale(); - }); - } - } - public function updateLocale() - { - $locale = $this->getLocale(); - if ($locale === null) { - return; - } - Carbon::setLocale($locale); - CarbonImmutable::setLocale($locale); - CarbonPeriod::setLocale($locale); - CarbonInterval::setLocale($locale); - if (\class_exists(IlluminateCarbon::class)) { - IlluminateCarbon::setLocale($locale); - } - if (\class_exists(Date::class)) { - try { - $root = Date::getFacadeRoot(); - $root->setLocale($locale); - } catch (Throwable $e) { - // Non Carbon class in use in Date facade - } - } - } - public function register() - { - // Needed for Laravel < 5.3 compatibility - } - protected function getLocale() - { - if ($this->localeGetter) { - return ($this->localeGetter)(); - } - $app = $this->getApp(); - $app = $app && \method_exists($app, 'getLocale') ? $app : $this->getGlobalApp('translator'); - return $app ? $app->getLocale() : null; - } - protected function getApp() - { - if ($this->appGetter) { - return ($this->appGetter)(); - } - return $this->app ?? $this->getGlobalApp(); - } - protected function getGlobalApp(...$args) - { - return \function_exists('WP_Ultimo\\Dependencies\\app') ? \WP_Ultimo\Dependencies\app(...$args) : null; - } - protected function isEventDispatcher($instance) - { - return $instance instanceof EventDispatcher || $instance instanceof Dispatcher || $instance instanceof DispatcherContract; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/List/languages.php b/dependencies/nesbot/carbon/src/Carbon/List/languages.php deleted file mode 100644 index 1edf3a5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/List/languages.php +++ /dev/null @@ -1,325 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -return [ - /* - * ISO 639-2 - */ - 'ab' => ['isoName' => 'Abkhazian', 'nativeName' => 'аҧсуа бызшәа, аҧсшәа'], - 'aa' => ['isoName' => 'Afar', 'nativeName' => 'Afaraf'], - 'af' => ['isoName' => 'Afrikaans', 'nativeName' => 'Afrikaans'], - 'ak' => ['isoName' => 'Akan', 'nativeName' => 'Akan'], - 'sq' => ['isoName' => 'Albanian', 'nativeName' => 'Shqip'], - 'am' => ['isoName' => 'Amharic', 'nativeName' => 'አማርኛ'], - 'ar' => ['isoName' => 'Arabic', 'nativeName' => 'العربية'], - 'an' => ['isoName' => 'Aragonese', 'nativeName' => 'aragonés'], - 'hy' => ['isoName' => 'Armenian', 'nativeName' => 'Հայերեն'], - 'as' => ['isoName' => 'Assamese', 'nativeName' => 'অসমীয়া'], - 'av' => ['isoName' => 'Avaric', 'nativeName' => 'авар мацӀ, магӀарул мацӀ'], - 'ae' => ['isoName' => 'Avestan', 'nativeName' => 'avesta'], - 'ay' => ['isoName' => 'Aymara', 'nativeName' => 'aymar aru'], - 'az' => ['isoName' => 'Azerbaijani', 'nativeName' => 'azərbaycan dili'], - 'bm' => ['isoName' => 'Bambara', 'nativeName' => 'bamanankan'], - 'ba' => ['isoName' => 'Bashkir', 'nativeName' => 'башҡорт теле'], - 'eu' => ['isoName' => 'Basque', 'nativeName' => 'euskara, euskera'], - 'be' => ['isoName' => 'Belarusian', 'nativeName' => 'беларуская мова'], - 'bn' => ['isoName' => 'Bengali', 'nativeName' => 'বাংলা'], - 'bh' => ['isoName' => 'Bihari languages', 'nativeName' => 'भोजपुरी'], - 'bi' => ['isoName' => 'Bislama', 'nativeName' => 'Bislama'], - 'bs' => ['isoName' => 'Bosnian', 'nativeName' => 'bosanski jezik'], - 'br' => ['isoName' => 'Breton', 'nativeName' => 'brezhoneg'], - 'bg' => ['isoName' => 'Bulgarian', 'nativeName' => 'български език'], - 'my' => ['isoName' => 'Burmese', 'nativeName' => 'ဗမာစာ'], - 'ca' => ['isoName' => 'Catalan, Valencian', 'nativeName' => 'català, valencià'], - 'ch' => ['isoName' => 'Chamorro', 'nativeName' => 'Chamoru'], - 'ce' => ['isoName' => 'Chechen', 'nativeName' => 'нохчийн мотт'], - 'ny' => ['isoName' => 'Chichewa, Chewa, Nyanja', 'nativeName' => 'chiCheŵa, chinyanja'], - 'zh' => ['isoName' => 'Chinese', 'nativeName' => '中文 (Zhōngwén), 汉语, 漢語'], - 'cv' => ['isoName' => 'Chuvash', 'nativeName' => 'чӑваш чӗлхи'], - 'kw' => ['isoName' => 'Cornish', 'nativeName' => 'Kernewek'], - 'co' => ['isoName' => 'Corsican', 'nativeName' => 'corsu, lingua corsa'], - 'cr' => ['isoName' => 'Cree', 'nativeName' => 'ᓀᐦᐃᔭᐍᐏᐣ'], - 'hr' => ['isoName' => 'Croatian', 'nativeName' => 'hrvatski jezik'], - 'cs' => ['isoName' => 'Czech', 'nativeName' => 'čeština, český jazyk'], - 'da' => ['isoName' => 'Danish', 'nativeName' => 'dansk'], - 'dv' => ['isoName' => 'Divehi, Dhivehi, Maldivian', 'nativeName' => 'ދިވެހި'], - 'nl' => ['isoName' => 'Dutch, Flemish', 'nativeName' => 'Nederlands, Vlaams'], - 'dz' => ['isoName' => 'Dzongkha', 'nativeName' => 'རྫོང་ཁ'], - 'en' => ['isoName' => 'English', 'nativeName' => 'English'], - 'eo' => ['isoName' => 'Esperanto', 'nativeName' => 'Esperanto'], - 'et' => ['isoName' => 'Estonian', 'nativeName' => 'eesti, eesti keel'], - 'ee' => ['isoName' => 'Ewe', 'nativeName' => 'Eʋegbe'], - 'fo' => ['isoName' => 'Faroese', 'nativeName' => 'føroyskt'], - 'fj' => ['isoName' => 'Fijian', 'nativeName' => 'vosa Vakaviti'], - 'fi' => ['isoName' => 'Finnish', 'nativeName' => 'suomi, suomen kieli'], - 'fr' => ['isoName' => 'French', 'nativeName' => 'français'], - 'ff' => ['isoName' => 'Fulah', 'nativeName' => 'Fulfulde, Pulaar, Pular'], - 'gl' => ['isoName' => 'Galician', 'nativeName' => 'Galego'], - 'ka' => ['isoName' => 'Georgian', 'nativeName' => 'ქართული'], - 'de' => ['isoName' => 'German', 'nativeName' => 'Deutsch'], - 'el' => ['isoName' => 'Greek (modern)', 'nativeName' => 'ελληνικά'], - 'gn' => ['isoName' => 'Guaraní', 'nativeName' => 'Avañe\'ẽ'], - 'gu' => ['isoName' => 'Gujarati', 'nativeName' => 'ગુજરાતી'], - 'ht' => ['isoName' => 'Haitian, Haitian Creole', 'nativeName' => 'Kreyòl ayisyen'], - 'ha' => ['isoName' => 'Hausa', 'nativeName' => '(Hausa) هَوُسَ'], - 'he' => ['isoName' => 'Hebrew (modern)', 'nativeName' => 'עברית'], - 'hz' => ['isoName' => 'Herero', 'nativeName' => 'Otjiherero'], - 'hi' => ['isoName' => 'Hindi', 'nativeName' => 'हिन्दी, हिंदी'], - 'ho' => ['isoName' => 'Hiri Motu', 'nativeName' => 'Hiri Motu'], - 'hu' => ['isoName' => 'Hungarian', 'nativeName' => 'magyar'], - 'ia' => ['isoName' => 'Interlingua', 'nativeName' => 'Interlingua'], - 'id' => ['isoName' => 'Indonesian', 'nativeName' => 'Bahasa Indonesia'], - 'ie' => ['isoName' => 'Interlingue', 'nativeName' => 'Originally called Occidental; then Interlingue after WWII'], - 'ga' => ['isoName' => 'Irish', 'nativeName' => 'Gaeilge'], - 'ig' => ['isoName' => 'Igbo', 'nativeName' => 'Asụsụ Igbo'], - 'ik' => ['isoName' => 'Inupiaq', 'nativeName' => 'Iñupiaq, Iñupiatun'], - 'io' => ['isoName' => 'Ido', 'nativeName' => 'Ido'], - 'is' => ['isoName' => 'Icelandic', 'nativeName' => 'Íslenska'], - 'it' => ['isoName' => 'Italian', 'nativeName' => 'Italiano'], - 'iu' => ['isoName' => 'Inuktitut', 'nativeName' => 'ᐃᓄᒃᑎᑐᑦ'], - 'ja' => ['isoName' => 'Japanese', 'nativeName' => '日本語 (にほんご)'], - 'jv' => ['isoName' => 'Javanese', 'nativeName' => 'ꦧꦱꦗꦮ, Basa Jawa'], - 'kl' => ['isoName' => 'Kalaallisut, Greenlandic', 'nativeName' => 'kalaallisut, kalaallit oqaasii'], - 'kn' => ['isoName' => 'Kannada', 'nativeName' => 'ಕನ್ನಡ'], - 'kr' => ['isoName' => 'Kanuri', 'nativeName' => 'Kanuri'], - 'ks' => ['isoName' => 'Kashmiri', 'nativeName' => 'कश्मीरी, كشميري‎'], - 'kk' => ['isoName' => 'Kazakh', 'nativeName' => 'қазақ тілі'], - 'km' => ['isoName' => 'Central Khmer', 'nativeName' => 'ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ'], - 'ki' => ['isoName' => 'Kikuyu, Gikuyu', 'nativeName' => 'Gĩkũyũ'], - 'rw' => ['isoName' => 'Kinyarwanda', 'nativeName' => 'Ikinyarwanda'], - 'ky' => ['isoName' => 'Kirghiz, Kyrgyz', 'nativeName' => 'Кыргызча, Кыргыз тили'], - 'kv' => ['isoName' => 'Komi', 'nativeName' => 'коми кыв'], - 'kg' => ['isoName' => 'Kongo', 'nativeName' => 'Kikongo'], - 'ko' => ['isoName' => 'Korean', 'nativeName' => '한국어'], - 'ku' => ['isoName' => 'Kurdish', 'nativeName' => 'Kurdî, کوردی‎'], - 'kj' => ['isoName' => 'Kuanyama, Kwanyama', 'nativeName' => 'Kuanyama'], - 'la' => ['isoName' => 'Latin', 'nativeName' => 'latine, lingua latina'], - 'lb' => ['isoName' => 'Luxembourgish, Letzeburgesch', 'nativeName' => 'Lëtzebuergesch'], - 'lg' => ['isoName' => 'Ganda', 'nativeName' => 'Luganda'], - 'li' => ['isoName' => 'Limburgan, Limburger, Limburgish', 'nativeName' => 'Limburgs'], - 'ln' => ['isoName' => 'Lingala', 'nativeName' => 'Lingála'], - 'lo' => ['isoName' => 'Lao', 'nativeName' => 'ພາສາລາວ'], - 'lt' => ['isoName' => 'Lithuanian', 'nativeName' => 'lietuvių kalba'], - 'lu' => ['isoName' => 'Luba-Katanga', 'nativeName' => 'Kiluba'], - 'lv' => ['isoName' => 'Latvian', 'nativeName' => 'latviešu valoda'], - 'gv' => ['isoName' => 'Manx', 'nativeName' => 'Gaelg, Gailck'], - 'mk' => ['isoName' => 'Macedonian', 'nativeName' => 'македонски јазик'], - 'mg' => ['isoName' => 'Malagasy', 'nativeName' => 'fiteny malagasy'], - 'ms' => ['isoName' => 'Malay', 'nativeName' => 'Bahasa Melayu, بهاس ملايو‎'], - 'ml' => ['isoName' => 'Malayalam', 'nativeName' => 'മലയാളം'], - 'mt' => ['isoName' => 'Maltese', 'nativeName' => 'Malti'], - 'mi' => ['isoName' => 'Maori', 'nativeName' => 'te reo Māori'], - 'mr' => ['isoName' => 'Marathi', 'nativeName' => 'मराठी'], - 'mh' => ['isoName' => 'Marshallese', 'nativeName' => 'Kajin M̧ajeļ'], - 'mn' => ['isoName' => 'Mongolian', 'nativeName' => 'Монгол хэл'], - 'na' => ['isoName' => 'Nauru', 'nativeName' => 'Dorerin Naoero'], - 'nv' => ['isoName' => 'Navajo, Navaho', 'nativeName' => 'Diné bizaad'], - 'nd' => ['isoName' => 'North Ndebele', 'nativeName' => 'isiNdebele'], - 'ne' => ['isoName' => 'Nepali', 'nativeName' => 'नेपाली'], - 'ng' => ['isoName' => 'Ndonga', 'nativeName' => 'Owambo'], - 'nb' => ['isoName' => 'Norwegian Bokmål', 'nativeName' => 'Norsk Bokmål'], - 'nn' => ['isoName' => 'Norwegian Nynorsk', 'nativeName' => 'Norsk Nynorsk'], - 'no' => ['isoName' => 'Norwegian', 'nativeName' => 'Norsk'], - 'ii' => ['isoName' => 'Sichuan Yi, Nuosu', 'nativeName' => 'ꆈꌠ꒿ Nuosuhxop'], - 'nr' => ['isoName' => 'South Ndebele', 'nativeName' => 'isiNdebele'], - 'oc' => ['isoName' => 'Occitan', 'nativeName' => 'occitan, lenga d\'òc'], - 'oj' => ['isoName' => 'Ojibwa', 'nativeName' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ'], - 'cu' => ['isoName' => 'Church Slavic, Church Slavonic, Old Church Slavonic, Old Slavonic, Old Bulgarian', 'nativeName' => 'ѩзыкъ словѣньскъ'], - 'om' => ['isoName' => 'Oromo', 'nativeName' => 'Afaan Oromoo'], - 'or' => ['isoName' => 'Oriya', 'nativeName' => 'ଓଡ଼ିଆ'], - 'os' => ['isoName' => 'Ossetian, Ossetic', 'nativeName' => 'ирон æвзаг'], - 'pa' => ['isoName' => 'Panjabi, Punjabi', 'nativeName' => 'ਪੰਜਾਬੀ'], - 'pi' => ['isoName' => 'Pali', 'nativeName' => 'पाऴि'], - 'fa' => ['isoName' => 'Persian', 'nativeName' => 'فارسی'], - 'pl' => ['isoName' => 'Polish', 'nativeName' => 'język polski, polszczyzna'], - 'ps' => ['isoName' => 'Pashto, Pushto', 'nativeName' => 'پښتو'], - 'pt' => ['isoName' => 'Portuguese', 'nativeName' => 'Português'], - 'qu' => ['isoName' => 'Quechua', 'nativeName' => 'Runa Simi, Kichwa'], - 'rm' => ['isoName' => 'Romansh', 'nativeName' => 'Rumantsch Grischun'], - 'rn' => ['isoName' => 'Rundi', 'nativeName' => 'Ikirundi'], - 'ro' => ['isoName' => 'Romanian, Moldavian, Moldovan', 'nativeName' => 'Română'], - 'ru' => ['isoName' => 'Russian', 'nativeName' => 'русский'], - 'sa' => ['isoName' => 'Sanskrit', 'nativeName' => 'संस्कृतम्'], - 'sc' => ['isoName' => 'Sardinian', 'nativeName' => 'sardu'], - 'sd' => ['isoName' => 'Sindhi', 'nativeName' => 'सिन्धी, سنڌي، سندھی‎'], - 'se' => ['isoName' => 'Northern Sami', 'nativeName' => 'Davvisámegiella'], - 'sm' => ['isoName' => 'Samoan', 'nativeName' => 'gagana fa\'a Samoa'], - 'sg' => ['isoName' => 'Sango', 'nativeName' => 'yângâ tî sängö'], - 'sr' => ['isoName' => 'Serbian', 'nativeName' => 'српски језик'], - 'gd' => ['isoName' => 'Gaelic, Scottish Gaelic', 'nativeName' => 'Gàidhlig'], - 'sn' => ['isoName' => 'Shona', 'nativeName' => 'chiShona'], - 'si' => ['isoName' => 'Sinhala, Sinhalese', 'nativeName' => 'සිංහල'], - 'sk' => ['isoName' => 'Slovak', 'nativeName' => 'Slovenčina, Slovenský Jazyk'], - 'sl' => ['isoName' => 'Slovene', 'nativeName' => 'Slovenski Jezik, Slovenščina'], - 'so' => ['isoName' => 'Somali', 'nativeName' => 'Soomaaliga, af Soomaali'], - 'st' => ['isoName' => 'Southern Sotho', 'nativeName' => 'Sesotho'], - 'es' => ['isoName' => 'Spanish, Castilian', 'nativeName' => 'Español'], - 'su' => ['isoName' => 'Sundanese', 'nativeName' => 'Basa Sunda'], - 'sw' => ['isoName' => 'Swahili', 'nativeName' => 'Kiswahili'], - 'ss' => ['isoName' => 'Swati', 'nativeName' => 'SiSwati'], - 'sv' => ['isoName' => 'Swedish', 'nativeName' => 'Svenska'], - 'ta' => ['isoName' => 'Tamil', 'nativeName' => 'தமிழ்'], - 'te' => ['isoName' => 'Telugu', 'nativeName' => 'తెలుగు'], - 'tg' => ['isoName' => 'Tajik', 'nativeName' => 'тоҷикӣ, toçikī, تاجیکی‎'], - 'th' => ['isoName' => 'Thai', 'nativeName' => 'ไทย'], - 'ti' => ['isoName' => 'Tigrinya', 'nativeName' => 'ትግርኛ'], - 'bo' => ['isoName' => 'Tibetan', 'nativeName' => 'བོད་ཡིག'], - 'tk' => ['isoName' => 'Turkmen', 'nativeName' => 'Türkmen, Түркмен'], - 'tl' => ['isoName' => 'Tagalog', 'nativeName' => 'Wikang Tagalog'], - 'tn' => ['isoName' => 'Tswana', 'nativeName' => 'Setswana'], - 'to' => ['isoName' => 'Tongan (Tonga Islands)', 'nativeName' => 'Faka Tonga'], - 'tr' => ['isoName' => 'Turkish', 'nativeName' => 'Türkçe'], - 'ts' => ['isoName' => 'Tsonga', 'nativeName' => 'Xitsonga'], - 'tt' => ['isoName' => 'Tatar', 'nativeName' => 'татар теле, tatar tele'], - 'tw' => ['isoName' => 'Twi', 'nativeName' => 'Twi'], - 'ty' => ['isoName' => 'Tahitian', 'nativeName' => 'Reo Tahiti'], - 'ug' => ['isoName' => 'Uighur, Uyghur', 'nativeName' => 'Uyƣurqə, ‫ئۇيغۇرچ'], - 'uk' => ['isoName' => 'Ukrainian', 'nativeName' => 'Українська'], - 'ur' => ['isoName' => 'Urdu', 'nativeName' => 'اردو'], - 'uz' => ['isoName' => 'Uzbek', 'nativeName' => 'Oʻzbek, Ўзбек, أۇزبېك‎'], - 've' => ['isoName' => 'Venda', 'nativeName' => 'Tshivenḓa'], - 'vi' => ['isoName' => 'Vietnamese', 'nativeName' => 'Tiếng Việt'], - 'vo' => ['isoName' => 'Volapük', 'nativeName' => 'Volapük'], - 'wa' => ['isoName' => 'Walloon', 'nativeName' => 'Walon'], - 'cy' => ['isoName' => 'Welsh', 'nativeName' => 'Cymraeg'], - 'wo' => ['isoName' => 'Wolof', 'nativeName' => 'Wollof'], - 'fy' => ['isoName' => 'Western Frisian', 'nativeName' => 'Frysk'], - 'xh' => ['isoName' => 'Xhosa', 'nativeName' => 'isiXhosa'], - 'yi' => ['isoName' => 'Yiddish', 'nativeName' => 'ייִדיש'], - 'yo' => ['isoName' => 'Yoruba', 'nativeName' => 'Yorùbá'], - 'za' => ['isoName' => 'Zhuang, Chuang', 'nativeName' => 'Saɯ cueŋƅ, Saw cuengh'], - 'zu' => ['isoName' => 'Zulu', 'nativeName' => 'isiZulu'], - /* - * Add ISO 639-3 languages available in Carbon - */ - 'agq' => ['isoName' => 'Aghem', 'nativeName' => 'Aghem'], - 'agr' => ['isoName' => 'Aguaruna', 'nativeName' => 'Aguaruna'], - 'anp' => ['isoName' => 'Angika', 'nativeName' => 'Angika'], - 'asa' => ['isoName' => 'Asu', 'nativeName' => 'Asu'], - 'ast' => ['isoName' => 'Asturian', 'nativeName' => 'Asturian'], - 'ayc' => ['isoName' => 'Southern Aymara', 'nativeName' => 'Southern Aymara'], - 'bas' => ['isoName' => 'Basaa', 'nativeName' => 'Basaa'], - 'bem' => ['isoName' => 'Bemba', 'nativeName' => 'Bemba'], - 'bez' => ['isoName' => 'Bena', 'nativeName' => 'Bena'], - 'bhb' => ['isoName' => 'Bhili', 'nativeName' => 'Bhili'], - 'bho' => ['isoName' => 'Bhojpuri', 'nativeName' => 'Bhojpuri'], - 'brx' => ['isoName' => 'Bodo', 'nativeName' => 'Bodo'], - 'byn' => ['isoName' => 'Bilin', 'nativeName' => 'Bilin'], - 'ccp' => ['isoName' => 'Chakma', 'nativeName' => 'Chakma'], - 'cgg' => ['isoName' => 'Chiga', 'nativeName' => 'Chiga'], - 'chr' => ['isoName' => 'Cherokee', 'nativeName' => 'Cherokee'], - 'cmn' => ['isoName' => 'Chinese', 'nativeName' => 'Chinese'], - 'crh' => ['isoName' => 'Crimean Turkish', 'nativeName' => 'Crimean Turkish'], - 'csb' => ['isoName' => 'Kashubian', 'nativeName' => 'Kashubian'], - 'dav' => ['isoName' => 'Taita', 'nativeName' => 'Taita'], - 'dje' => ['isoName' => 'Zarma', 'nativeName' => 'Zarma'], - 'doi' => ['isoName' => 'Dogri (macrolanguage)', 'nativeName' => 'Dogri (macrolanguage)'], - 'dsb' => ['isoName' => 'Lower Sorbian', 'nativeName' => 'Lower Sorbian'], - 'dua' => ['isoName' => 'Duala', 'nativeName' => 'Duala'], - 'dyo' => ['isoName' => 'Jola-Fonyi', 'nativeName' => 'Jola-Fonyi'], - 'ebu' => ['isoName' => 'Embu', 'nativeName' => 'Embu'], - 'ewo' => ['isoName' => 'Ewondo', 'nativeName' => 'Ewondo'], - 'fil' => ['isoName' => 'Filipino', 'nativeName' => 'Filipino'], - 'fur' => ['isoName' => 'Friulian', 'nativeName' => 'Friulian'], - 'gez' => ['isoName' => 'Geez', 'nativeName' => 'Geez'], - 'gom' => ['isoName' => 'Konkani, Goan', 'nativeName' => 'ಕೊಂಕಣಿ'], - 'gsw' => ['isoName' => 'Swiss German', 'nativeName' => 'Swiss German'], - 'guz' => ['isoName' => 'Gusii', 'nativeName' => 'Gusii'], - 'hak' => ['isoName' => 'Hakka Chinese', 'nativeName' => 'Hakka Chinese'], - 'haw' => ['isoName' => 'Hawaiian', 'nativeName' => 'Hawaiian'], - 'hif' => ['isoName' => 'Fiji Hindi', 'nativeName' => 'Fiji Hindi'], - 'hne' => ['isoName' => 'Chhattisgarhi', 'nativeName' => 'Chhattisgarhi'], - 'hsb' => ['isoName' => 'Upper Sorbian', 'nativeName' => 'Upper Sorbian'], - 'jgo' => ['isoName' => 'Ngomba', 'nativeName' => 'Ngomba'], - 'jmc' => ['isoName' => 'Machame', 'nativeName' => 'Machame'], - 'kab' => ['isoName' => 'Kabyle', 'nativeName' => 'Kabyle'], - 'kam' => ['isoName' => 'Kamba', 'nativeName' => 'Kamba'], - 'kde' => ['isoName' => 'Makonde', 'nativeName' => 'Makonde'], - 'kea' => ['isoName' => 'Kabuverdianu', 'nativeName' => 'Kabuverdianu'], - 'khq' => ['isoName' => 'Koyra Chiini', 'nativeName' => 'Koyra Chiini'], - 'kkj' => ['isoName' => 'Kako', 'nativeName' => 'Kako'], - 'kln' => ['isoName' => 'Kalenjin', 'nativeName' => 'Kalenjin'], - 'kok' => ['isoName' => 'Konkani', 'nativeName' => 'Konkani'], - 'ksb' => ['isoName' => 'Shambala', 'nativeName' => 'Shambala'], - 'ksf' => ['isoName' => 'Bafia', 'nativeName' => 'Bafia'], - 'ksh' => ['isoName' => 'Colognian', 'nativeName' => 'Colognian'], - 'lag' => ['isoName' => 'Langi', 'nativeName' => 'Langi'], - 'lij' => ['isoName' => 'Ligurian', 'nativeName' => 'Ligurian'], - 'lkt' => ['isoName' => 'Lakota', 'nativeName' => 'Lakota'], - 'lrc' => ['isoName' => 'Northern Luri', 'nativeName' => 'Northern Luri'], - 'luo' => ['isoName' => 'Luo', 'nativeName' => 'Luo'], - 'luy' => ['isoName' => 'Luyia', 'nativeName' => 'Luyia'], - 'lzh' => ['isoName' => 'Literary Chinese', 'nativeName' => 'Literary Chinese'], - 'mag' => ['isoName' => 'Magahi', 'nativeName' => 'Magahi'], - 'mai' => ['isoName' => 'Maithili', 'nativeName' => 'Maithili'], - 'mas' => ['isoName' => 'Masai', 'nativeName' => 'Masai'], - 'mer' => ['isoName' => 'Meru', 'nativeName' => 'Meru'], - 'mfe' => ['isoName' => 'Morisyen', 'nativeName' => 'Morisyen'], - 'mgh' => ['isoName' => 'Makhuwa-Meetto', 'nativeName' => 'Makhuwa-Meetto'], - 'mgo' => ['isoName' => 'Metaʼ', 'nativeName' => 'Metaʼ'], - 'mhr' => ['isoName' => 'Eastern Mari', 'nativeName' => 'Eastern Mari'], - 'miq' => ['isoName' => 'Mískito', 'nativeName' => 'Mískito'], - 'mjw' => ['isoName' => 'Karbi', 'nativeName' => 'Karbi'], - 'mni' => ['isoName' => 'Manipuri', 'nativeName' => 'Manipuri'], - 'mua' => ['isoName' => 'Mundang', 'nativeName' => 'Mundang'], - 'mzn' => ['isoName' => 'Mazanderani', 'nativeName' => 'Mazanderani'], - 'nan' => ['isoName' => 'Min Nan Chinese', 'nativeName' => 'Min Nan Chinese'], - 'naq' => ['isoName' => 'Nama', 'nativeName' => 'Nama'], - 'nds' => ['isoName' => 'Low German', 'nativeName' => 'Low German'], - 'nhn' => ['isoName' => 'Central Nahuatl', 'nativeName' => 'Central Nahuatl'], - 'niu' => ['isoName' => 'Niuean', 'nativeName' => 'Niuean'], - 'nmg' => ['isoName' => 'Kwasio', 'nativeName' => 'Kwasio'], - 'nnh' => ['isoName' => 'Ngiemboon', 'nativeName' => 'Ngiemboon'], - 'nso' => ['isoName' => 'Northern Sotho', 'nativeName' => 'Northern Sotho'], - 'nus' => ['isoName' => 'Nuer', 'nativeName' => 'Nuer'], - 'nyn' => ['isoName' => 'Nyankole', 'nativeName' => 'Nyankole'], - 'pap' => ['isoName' => 'Papiamento', 'nativeName' => 'Papiamento'], - 'prg' => ['isoName' => 'Prussian', 'nativeName' => 'Prussian'], - 'quz' => ['isoName' => 'Cusco Quechua', 'nativeName' => 'Cusco Quechua'], - 'raj' => ['isoName' => 'Rajasthani', 'nativeName' => 'Rajasthani'], - 'rof' => ['isoName' => 'Rombo', 'nativeName' => 'Rombo'], - 'rwk' => ['isoName' => 'Rwa', 'nativeName' => 'Rwa'], - 'sah' => ['isoName' => 'Sakha', 'nativeName' => 'Sakha'], - 'saq' => ['isoName' => 'Samburu', 'nativeName' => 'Samburu'], - 'sat' => ['isoName' => 'Santali', 'nativeName' => 'Santali'], - 'sbp' => ['isoName' => 'Sangu', 'nativeName' => 'Sangu'], - 'scr' => ['isoName' => 'Serbo Croatian', 'nativeName' => 'Serbo Croatian'], - 'seh' => ['isoName' => 'Sena', 'nativeName' => 'Sena'], - 'ses' => ['isoName' => 'Koyraboro Senni', 'nativeName' => 'Koyraboro Senni'], - 'sgs' => ['isoName' => 'Samogitian', 'nativeName' => 'Samogitian'], - 'shi' => ['isoName' => 'Tachelhit', 'nativeName' => 'Tachelhit'], - 'shn' => ['isoName' => 'Shan', 'nativeName' => 'Shan'], - 'shs' => ['isoName' => 'Shuswap', 'nativeName' => 'Shuswap'], - 'sid' => ['isoName' => 'Sidamo', 'nativeName' => 'Sidamo'], - 'smn' => ['isoName' => 'Inari Sami', 'nativeName' => 'Inari Sami'], - 'szl' => ['isoName' => 'Silesian', 'nativeName' => 'Silesian'], - 'tcy' => ['isoName' => 'Tulu', 'nativeName' => 'Tulu'], - 'teo' => ['isoName' => 'Teso', 'nativeName' => 'Teso'], - 'tet' => ['isoName' => 'Tetum', 'nativeName' => 'Tetum'], - 'the' => ['isoName' => 'Chitwania Tharu', 'nativeName' => 'Chitwania Tharu'], - 'tig' => ['isoName' => 'Tigre', 'nativeName' => 'Tigre'], - 'tlh' => ['isoName' => 'Klingon', 'nativeName' => 'tlhIngan Hol'], - 'tpi' => ['isoName' => 'Tok Pisin', 'nativeName' => 'Tok Pisin'], - 'twq' => ['isoName' => 'Tasawaq', 'nativeName' => 'Tasawaq'], - 'tzl' => ['isoName' => 'Talossan', 'nativeName' => 'Talossan'], - 'tzm' => ['isoName' => 'Tamazight, Central Atlas', 'nativeName' => 'ⵜⵎⴰⵣⵉⵖⵜ'], - 'unm' => ['isoName' => 'Unami', 'nativeName' => 'Unami'], - 'vai' => ['isoName' => 'Vai', 'nativeName' => 'Vai'], - 'vun' => ['isoName' => 'Vunjo', 'nativeName' => 'Vunjo'], - 'wae' => ['isoName' => 'Walser', 'nativeName' => 'Walser'], - 'wal' => ['isoName' => 'Wolaytta', 'nativeName' => 'Wolaytta'], - 'xog' => ['isoName' => 'Soga', 'nativeName' => 'Soga'], - 'yav' => ['isoName' => 'Yangben', 'nativeName' => 'Yangben'], - 'yue' => ['isoName' => 'Cantonese', 'nativeName' => 'Cantonese'], - 'yuw' => ['isoName' => 'Yau (Morobe Province)', 'nativeName' => 'Yau (Morobe Province)'], - 'zgh' => ['isoName' => 'Standard Moroccan Tamazight', 'nativeName' => 'Standard Moroccan Tamazight'], -]; diff --git a/dependencies/nesbot/carbon/src/Carbon/List/regions.php b/dependencies/nesbot/carbon/src/Carbon/List/regions.php deleted file mode 100644 index 03c68b7..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/List/regions.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -/* - * ISO 3166-2 - */ -return ['AD' => 'Andorra', 'AE' => 'United Arab Emirates', 'AF' => 'Afghanistan', 'AG' => 'Antigua and Barbuda', 'AI' => 'Anguilla', 'AL' => 'Albania', 'AM' => 'Armenia', 'AO' => 'Angola', 'AQ' => 'Antarctica', 'AR' => 'Argentina', 'AS' => 'American Samoa', 'AT' => 'Austria', 'AU' => 'Australia', 'AW' => 'Aruba', 'AX' => 'Åland Islands', 'AZ' => 'Azerbaijan', 'BA' => 'Bosnia and Herzegovina', 'BB' => 'Barbados', 'BD' => 'Bangladesh', 'BE' => 'Belgium', 'BF' => 'Burkina Faso', 'BG' => 'Bulgaria', 'BH' => 'Bahrain', 'BI' => 'Burundi', 'BJ' => 'Benin', 'BL' => 'Saint Barthélemy', 'BM' => 'Bermuda', 'BN' => 'Brunei Darussalam', 'BO' => 'Bolivia (Plurinational State of)', 'BQ' => 'Bonaire, Sint Eustatius and Saba', 'BR' => 'Brazil', 'BS' => 'Bahamas', 'BT' => 'Bhutan', 'BV' => 'Bouvet Island', 'BW' => 'Botswana', 'BY' => 'Belarus', 'BZ' => 'Belize', 'CA' => 'Canada', 'CC' => 'Cocos (Keeling) Islands', 'CD' => 'Congo, Democratic Republic of the', 'CF' => 'Central African Republic', 'CG' => 'Congo', 'CH' => 'Switzerland', 'CI' => 'Côte d\'Ivoire', 'CK' => 'Cook Islands', 'CL' => 'Chile', 'CM' => 'Cameroon', 'CN' => 'China', 'CO' => 'Colombia', 'CR' => 'Costa Rica', 'CU' => 'Cuba', 'CV' => 'Cabo Verde', 'CW' => 'Curaçao', 'CX' => 'Christmas Island', 'CY' => 'Cyprus', 'CZ' => 'Czechia', 'DE' => 'Germany', 'DJ' => 'Djibouti', 'DK' => 'Denmark', 'DM' => 'Dominica', 'DO' => 'Dominican Republic', 'DZ' => 'Algeria', 'EC' => 'Ecuador', 'EE' => 'Estonia', 'EG' => 'Egypt', 'EH' => 'Western Sahara', 'ER' => 'Eritrea', 'ES' => 'Spain', 'ET' => 'Ethiopia', 'FI' => 'Finland', 'FJ' => 'Fiji', 'FK' => 'Falkland Islands (Malvinas)', 'FM' => 'Micronesia (Federated States of)', 'FO' => 'Faroe Islands', 'FR' => 'France', 'GA' => 'Gabon', 'GB' => 'United Kingdom of Great Britain and Northern Ireland', 'GD' => 'Grenada', 'GE' => 'Georgia', 'GF' => 'French Guiana', 'GG' => 'Guernsey', 'GH' => 'Ghana', 'GI' => 'Gibraltar', 'GL' => 'Greenland', 'GM' => 'Gambia', 'GN' => 'Guinea', 'GP' => 'Guadeloupe', 'GQ' => 'Equatorial Guinea', 'GR' => 'Greece', 'GS' => 'South Georgia and the South Sandwich Islands', 'GT' => 'Guatemala', 'GU' => 'Guam', 'GW' => 'Guinea-Bissau', 'GY' => 'Guyana', 'HK' => 'Hong Kong', 'HM' => 'Heard Island and McDonald Islands', 'HN' => 'Honduras', 'HR' => 'Croatia', 'HT' => 'Haiti', 'HU' => 'Hungary', 'ID' => 'Indonesia', 'IE' => 'Ireland', 'IL' => 'Israel', 'IM' => 'Isle of Man', 'IN' => 'India', 'IO' => 'British Indian Ocean Territory', 'IQ' => 'Iraq', 'IR' => 'Iran (Islamic Republic of)', 'IS' => 'Iceland', 'IT' => 'Italy', 'JE' => 'Jersey', 'JM' => 'Jamaica', 'JO' => 'Jordan', 'JP' => 'Japan', 'KE' => 'Kenya', 'KG' => 'Kyrgyzstan', 'KH' => 'Cambodia', 'KI' => 'Kiribati', 'KM' => 'Comoros', 'KN' => 'Saint Kitts and Nevis', 'KP' => 'Korea (Democratic People\'s Republic of)', 'KR' => 'Korea, Republic of', 'KW' => 'Kuwait', 'KY' => 'Cayman Islands', 'KZ' => 'Kazakhstan', 'LA' => 'Lao People\'s Democratic Republic', 'LB' => 'Lebanon', 'LC' => 'Saint Lucia', 'LI' => 'Liechtenstein', 'LK' => 'Sri Lanka', 'LR' => 'Liberia', 'LS' => 'Lesotho', 'LT' => 'Lithuania', 'LU' => 'Luxembourg', 'LV' => 'Latvia', 'LY' => 'Libya', 'MA' => 'Morocco', 'MC' => 'Monaco', 'MD' => 'Moldova, Republic of', 'ME' => 'Montenegro', 'MF' => 'Saint Martin (French part)', 'MG' => 'Madagascar', 'MH' => 'Marshall Islands', 'MK' => 'Macedonia, the former Yugoslav Republic of', 'ML' => 'Mali', 'MM' => 'Myanmar', 'MN' => 'Mongolia', 'MO' => 'Macao', 'MP' => 'Northern Mariana Islands', 'MQ' => 'Martinique', 'MR' => 'Mauritania', 'MS' => 'Montserrat', 'MT' => 'Malta', 'MU' => 'Mauritius', 'MV' => 'Maldives', 'MW' => 'Malawi', 'MX' => 'Mexico', 'MY' => 'Malaysia', 'MZ' => 'Mozambique', 'NA' => 'Namibia', 'NC' => 'New Caledonia', 'NE' => 'Niger', 'NF' => 'Norfolk Island', 'NG' => 'Nigeria', 'NI' => 'Nicaragua', 'NL' => 'Netherlands', 'NO' => 'Norway', 'NP' => 'Nepal', 'NR' => 'Nauru', 'NU' => 'Niue', 'NZ' => 'New Zealand', 'OM' => 'Oman', 'PA' => 'Panama', 'PE' => 'Peru', 'PF' => 'French Polynesia', 'PG' => 'Papua New Guinea', 'PH' => 'Philippines', 'PK' => 'Pakistan', 'PL' => 'Poland', 'PM' => 'Saint Pierre and Miquelon', 'PN' => 'Pitcairn', 'PR' => 'Puerto Rico', 'PS' => 'Palestine, State of', 'PT' => 'Portugal', 'PW' => 'Palau', 'PY' => 'Paraguay', 'QA' => 'Qatar', 'RE' => 'Réunion', 'RO' => 'Romania', 'RS' => 'Serbia', 'RU' => 'Russian Federation', 'RW' => 'Rwanda', 'SA' => 'Saudi Arabia', 'SB' => 'Solomon Islands', 'SC' => 'Seychelles', 'SD' => 'Sudan', 'SE' => 'Sweden', 'SG' => 'Singapore', 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', 'SI' => 'Slovenia', 'SJ' => 'Svalbard and Jan Mayen', 'SK' => 'Slovakia', 'SL' => 'Sierra Leone', 'SM' => 'San Marino', 'SN' => 'Senegal', 'SO' => 'Somalia', 'SR' => 'Suriname', 'SS' => 'South Sudan', 'ST' => 'Sao Tome and Principe', 'SV' => 'El Salvador', 'SX' => 'Sint Maarten (Dutch part)', 'SY' => 'Syrian Arab Republic', 'SZ' => 'Eswatini', 'TC' => 'Turks and Caicos Islands', 'TD' => 'Chad', 'TF' => 'French Southern Territories', 'TG' => 'Togo', 'TH' => 'Thailand', 'TJ' => 'Tajikistan', 'TK' => 'Tokelau', 'TL' => 'Timor-Leste', 'TM' => 'Turkmenistan', 'TN' => 'Tunisia', 'TO' => 'Tonga', 'TR' => 'Turkey', 'TT' => 'Trinidad and Tobago', 'TV' => 'Tuvalu', 'TW' => 'Taiwan, Province of China', 'TZ' => 'Tanzania, United Republic of', 'UA' => 'Ukraine', 'UG' => 'Uganda', 'UM' => 'United States Minor Outlying Islands', 'US' => 'United States of America', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', 'VA' => 'Holy See', 'VC' => 'Saint Vincent and the Grenadines', 'VE' => 'Venezuela (Bolivarian Republic of)', 'VG' => 'Virgin Islands (British)', 'VI' => 'Virgin Islands (U.S.)', 'VN' => 'Viet Nam', 'VU' => 'Vanuatu', 'WF' => 'Wallis and Futuna', 'WS' => 'Samoa', 'YE' => 'Yemen', 'YT' => 'Mayotte', 'ZA' => 'South Africa', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe']; diff --git a/dependencies/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php b/dependencies/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php deleted file mode 100644 index 412810e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\MessageFormatter; - -use ReflectionMethod; -use Symfony\Component\Translation\Formatter\MessageFormatter; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -// @codeCoverageIgnoreStart -$transMethod = new ReflectionMethod(MessageFormatterInterface::class, 'format'); -require $transMethod->getParameters()[0]->hasType() ? __DIR__ . '/../../../lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php' : __DIR__ . '/../../../lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php'; -// @codeCoverageIgnoreEnd -final class MessageFormatterMapper extends LazyMessageFormatter -{ - /** - * Wrapped formatter. - * - * @var MessageFormatterInterface - */ - protected $formatter; - public function __construct(?MessageFormatterInterface $formatter = null) - { - $this->formatter = $formatter ?? new MessageFormatter(); - } - protected function transformLocale(?string $locale) : ?string - { - return $locale ? \preg_replace('/[_@][A-Za-z][a-z]{2,}/', '', $locale) : $locale; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php b/dependencies/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php deleted file mode 100644 index 680d0fb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php +++ /dev/null @@ -1,239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -use Closure; -use InvalidArgumentException; -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection\Adapter\ReflectionParameter as AdapterReflectionParameter; -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection\Adapter\ReflectionType as AdapterReflectionType; -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection\ReflectionClass as BetterReflectionClass; -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection\ReflectionFunction as BetterReflectionFunction; -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection\ReflectionParameter as BetterReflectionParameter; -use WP_Ultimo\Dependencies\PHPStan\Reflection\Php\BuiltinMethodReflection; -use WP_Ultimo\Dependencies\PHPStan\TrinaryLogic; -use ReflectionClass; -use ReflectionFunction; -use ReflectionMethod; -use ReflectionParameter; -use ReflectionType; -use stdClass; -use Throwable; -abstract class AbstractMacro implements BuiltinMethodReflection -{ - /** - * The reflection function/method. - * - * @var ReflectionFunction|ReflectionMethod - */ - protected $reflectionFunction; - /** - * The class name. - * - * @var class-string - */ - private $className; - /** - * The method name. - * - * @var string - */ - private $methodName; - /** - * The parameters. - * - * @var ReflectionParameter[] - */ - private $parameters; - /** - * The is static. - * - * @var bool - */ - private $static = \false; - /** - * Macro constructor. - * - * @param string $className - * @phpstan-param class-string $className - * - * @param string $methodName - * @param callable $macro - */ - public function __construct(string $className, string $methodName, $macro) - { - $this->className = $className; - $this->methodName = $methodName; - $rawReflectionFunction = \is_array($macro) ? new ReflectionMethod($macro[0], $macro[1]) : new ReflectionFunction($macro); - $this->reflectionFunction = self::hasModernParser() ? $this->getReflectionFunction($macro) : $rawReflectionFunction; - // @codeCoverageIgnore - $this->parameters = \array_map(function ($parameter) { - if ($parameter instanceof BetterReflectionParameter) { - return new AdapterReflectionParameter($parameter); - } - return $parameter; - // @codeCoverageIgnore - }, $this->reflectionFunction->getParameters()); - if ($rawReflectionFunction->isClosure()) { - try { - $closure = $rawReflectionFunction->getClosure(); - $boundClosure = Closure::bind($closure, new stdClass()); - $this->static = !$boundClosure || (new ReflectionFunction($boundClosure))->getClosureThis() === null; - } catch (Throwable $e) { - $this->static = \true; - } - } - } - private function getReflectionFunction($spec) - { - if (\is_array($spec) && \count($spec) === 2 && \is_string($spec[1])) { - \assert($spec[1] !== ''); - if (\is_object($spec[0])) { - return BetterReflectionClass::createFromInstance($spec[0])->getMethod($spec[1]); - } - return BetterReflectionClass::createFromName($spec[0])->getMethod($spec[1]); - } - if (\is_string($spec)) { - return BetterReflectionFunction::createFromName($spec); - } - if ($spec instanceof Closure) { - return BetterReflectionFunction::createFromClosure($spec); - } - throw new InvalidArgumentException('Could not create reflection from the spec given'); - // @codeCoverageIgnore - } - /** - * {@inheritdoc} - */ - public function getDeclaringClass() : ReflectionClass - { - return new ReflectionClass($this->className); - } - /** - * {@inheritdoc} - */ - public function isPrivate() : bool - { - return \false; - } - /** - * {@inheritdoc} - */ - public function isPublic() : bool - { - return \true; - } - /** - * {@inheritdoc} - */ - public function isFinal() : bool - { - return \false; - } - /** - * {@inheritdoc} - */ - public function isInternal() : bool - { - return \false; - } - /** - * {@inheritdoc} - */ - public function isAbstract() : bool - { - return \false; - } - /** - * {@inheritdoc} - */ - public function isStatic() : bool - { - return $this->static; - } - /** - * {@inheritdoc} - */ - public function getDocComment() : ?string - { - return $this->reflectionFunction->getDocComment() ?: null; - } - /** - * {@inheritdoc} - */ - public function getName() : string - { - return $this->methodName; - } - /** - * {@inheritdoc} - */ - public function getParameters() : array - { - return $this->parameters; - } - /** - * {@inheritdoc} - */ - public function getReturnType() : ?ReflectionType - { - $type = $this->reflectionFunction->getReturnType(); - if ($type instanceof ReflectionType) { - return $type; - // @codeCoverageIgnore - } - return self::adaptType($type); - } - /** - * {@inheritdoc} - */ - public function isDeprecated() : TrinaryLogic - { - return TrinaryLogic::createFromBoolean($this->reflectionFunction->isDeprecated() || \preg_match('/@deprecated/i', $this->getDocComment() ?: '')); - } - /** - * {@inheritdoc} - */ - public function isVariadic() : bool - { - return $this->reflectionFunction->isVariadic(); - } - /** - * {@inheritdoc} - */ - public function getPrototype() : BuiltinMethodReflection - { - return $this; - } - public function getTentativeReturnType() : ?ReflectionType - { - return null; - } - public function returnsByReference() : TrinaryLogic - { - return TrinaryLogic::createNo(); - } - private static function adaptType($type) - { - $method = \method_exists(AdapterReflectionType::class, 'fromTypeOrNull') ? 'fromTypeOrNull' : 'fromReturnTypeOrNull'; - // @codeCoverageIgnore - return AdapterReflectionType::$method($type); - } - private static function hasModernParser() : bool - { - static $modernParser = null; - if ($modernParser !== null) { - return $modernParser; - } - $modernParser = \method_exists(AdapterReflectionType::class, 'fromTypeOrNull'); - return $modernParser; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/PHPStan/Macro.php b/dependencies/nesbot/carbon/src/Carbon/PHPStan/Macro.php deleted file mode 100644 index ce7f41d..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/PHPStan/Macro.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -use WP_Ultimo\Dependencies\PHPStan\BetterReflection\Reflection\Adapter; -use WP_Ultimo\Dependencies\PHPStan\Reflection\Php\BuiltinMethodReflection; -use ReflectionMethod; -$method = new ReflectionMethod(BuiltinMethodReflection::class, 'getReflection'); -require $method->hasReturnType() && $method->getReturnType()->getName() === Adapter\ReflectionMethod::class ? __DIR__ . '/../../../lazy/Carbon/PHPStan/AbstractMacroStatic.php' : __DIR__ . '/../../../lazy/Carbon/PHPStan/AbstractMacroBuiltin.php'; -$method = new ReflectionMethod(BuiltinMethodReflection::class, 'getFileName'); -require $method->hasReturnType() ? __DIR__ . '/../../../lazy/Carbon/PHPStan/MacroStrongType.php' : __DIR__ . '/../../../lazy/Carbon/PHPStan/MacroWeakType.php'; -final class Macro extends LazyMacro -{ -} diff --git a/dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php b/dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php deleted file mode 100644 index 90a3009..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -use WP_Ultimo\Dependencies\PHPStan\Reflection\Assertions; -use WP_Ultimo\Dependencies\PHPStan\Reflection\ClassReflection; -use WP_Ultimo\Dependencies\PHPStan\Reflection\MethodReflection; -use WP_Ultimo\Dependencies\PHPStan\Reflection\MethodsClassReflectionExtension; -use WP_Ultimo\Dependencies\PHPStan\Reflection\Php\PhpMethodReflectionFactory; -use WP_Ultimo\Dependencies\PHPStan\Reflection\ReflectionProvider; -use WP_Ultimo\Dependencies\PHPStan\Type\TypehintHelper; -/** - * Class MacroExtension. - * - * @codeCoverageIgnore Pure PHPStan wrapper. - */ -final class MacroExtension implements MethodsClassReflectionExtension -{ - /** - * @var PhpMethodReflectionFactory - */ - protected $methodReflectionFactory; - /** - * @var MacroScanner - */ - protected $scanner; - /** - * Extension constructor. - * - * @param PhpMethodReflectionFactory $methodReflectionFactory - * @param ReflectionProvider $reflectionProvider - */ - public function __construct(PhpMethodReflectionFactory $methodReflectionFactory, ReflectionProvider $reflectionProvider) - { - $this->scanner = new MacroScanner($reflectionProvider); - $this->methodReflectionFactory = $methodReflectionFactory; - } - /** - * {@inheritdoc} - */ - public function hasMethod(ClassReflection $classReflection, string $methodName) : bool - { - return $this->scanner->hasMethod($classReflection->getName(), $methodName); - } - /** - * {@inheritdoc} - */ - public function getMethod(ClassReflection $classReflection, string $methodName) : MethodReflection - { - $builtinMacro = $this->scanner->getMethod($classReflection->getName(), $methodName); - $supportAssertions = \class_exists(Assertions::class); - return $this->methodReflectionFactory->create($classReflection, null, $builtinMacro, $classReflection->getActiveTemplateTypeMap(), [], TypehintHelper::decideTypeFromReflection($builtinMacro->getReturnType()), null, null, $builtinMacro->isDeprecated()->yes(), $builtinMacro->isInternal(), $builtinMacro->isFinal(), $supportAssertions ? null : $builtinMacro->getDocComment(), $supportAssertions ? Assertions::createEmpty() : null, null, $builtinMacro->getDocComment(), []); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php b/dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php deleted file mode 100644 index 6c3947f..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\PHPStan; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\PHPStan\Reflection\ReflectionProvider; -use ReflectionClass; -use ReflectionException; -final class MacroScanner -{ - /** - * @var \PHPStan\Reflection\ReflectionProvider - */ - private $reflectionProvider; - /** - * MacroScanner constructor. - * - * @param \PHPStan\Reflection\ReflectionProvider $reflectionProvider - */ - public function __construct(ReflectionProvider $reflectionProvider) - { - $this->reflectionProvider = $reflectionProvider; - } - /** - * Return true if the given pair class-method is a Carbon macro. - * - * @param string $className - * @phpstan-param class-string $className - * - * @param string $methodName - * - * @return bool - */ - public function hasMethod(string $className, string $methodName) : bool - { - $classReflection = $this->reflectionProvider->getClass($className); - if ($classReflection->getName() !== CarbonInterface::class && !$classReflection->isSubclassOf(CarbonInterface::class)) { - return \false; - } - return \is_callable([$className, 'hasMacro']) && $className::hasMacro($methodName); - } - /** - * Return the Macro for a given pair class-method. - * - * @param string $className - * @phpstan-param class-string $className - * - * @param string $methodName - * - * @throws ReflectionException - * - * @return Macro - */ - public function getMethod(string $className, string $methodName) : Macro - { - $reflectionClass = new ReflectionClass($className); - $property = $reflectionClass->getProperty('globalMacros'); - $property->setAccessible(\true); - $macro = $property->getValue()[$methodName]; - return new Macro($className, $methodName, $macro); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Boundaries.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Boundaries.php deleted file mode 100644 index 21f9615..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Boundaries.php +++ /dev/null @@ -1,409 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownUnitException; -/** - * Trait Boundaries. - * - * startOf, endOf and derived method for each unit. - * - * Depends on the following properties: - * - * @property int $year - * @property int $month - * @property int $daysInMonth - * @property int $quarter - * - * Depends on the following methods: - * - * @method $this setTime(int $hour, int $minute, int $second = 0, int $microseconds = 0) - * @method $this setDate(int $year, int $month, int $day) - * @method $this addMonths(int $value = 1) - */ -trait Boundaries -{ - /** - * Resets the time to 00:00:00 start of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDay(); - * ``` - * - * @return static - */ - public function startOfDay() - { - return $this->setTime(0, 0, 0, 0); - } - /** - * Resets the time to 23:59:59.999999 end of day - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDay(); - * ``` - * - * @return static - */ - public function endOfDay() - { - return $this->setTime(static::HOURS_PER_DAY - 1, static::MINUTES_PER_HOUR - 1, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); - } - /** - * Resets the date to the first day of the month and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMonth(); - * ``` - * - * @return static - */ - public function startOfMonth() - { - return $this->setDate($this->year, $this->month, 1)->startOfDay(); - } - /** - * Resets the date to end of the month and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMonth(); - * ``` - * - * @return static - */ - public function endOfMonth() - { - return $this->setDate($this->year, $this->month, $this->daysInMonth)->endOfDay(); - } - /** - * Resets the date to the first day of the quarter and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfQuarter(); - * ``` - * - * @return static - */ - public function startOfQuarter() - { - $month = ($this->quarter - 1) * static::MONTHS_PER_QUARTER + 1; - return $this->setDate($this->year, $month, 1)->startOfDay(); - } - /** - * Resets the date to end of the quarter and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfQuarter(); - * ``` - * - * @return static - */ - public function endOfQuarter() - { - return $this->startOfQuarter()->addMonths(static::MONTHS_PER_QUARTER - 1)->endOfMonth(); - } - /** - * Resets the date to the first day of the year and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfYear(); - * ``` - * - * @return static - */ - public function startOfYear() - { - return $this->setDate($this->year, 1, 1)->startOfDay(); - } - /** - * Resets the date to end of the year and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfYear(); - * ``` - * - * @return static - */ - public function endOfYear() - { - return $this->setDate($this->year, 12, 31)->endOfDay(); - } - /** - * Resets the date to the first day of the decade and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfDecade(); - * ``` - * - * @return static - */ - public function startOfDecade() - { - $year = $this->year - $this->year % static::YEARS_PER_DECADE; - return $this->setDate($year, 1, 1)->startOfDay(); - } - /** - * Resets the date to end of the decade and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfDecade(); - * ``` - * - * @return static - */ - public function endOfDecade() - { - $year = $this->year - $this->year % static::YEARS_PER_DECADE + static::YEARS_PER_DECADE - 1; - return $this->setDate($year, 12, 31)->endOfDay(); - } - /** - * Resets the date to the first day of the century and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfCentury(); - * ``` - * - * @return static - */ - public function startOfCentury() - { - $year = $this->year - ($this->year - 1) % static::YEARS_PER_CENTURY; - return $this->setDate($year, 1, 1)->startOfDay(); - } - /** - * Resets the date to end of the century and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfCentury(); - * ``` - * - * @return static - */ - public function endOfCentury() - { - $year = $this->year - 1 - ($this->year - 1) % static::YEARS_PER_CENTURY + static::YEARS_PER_CENTURY; - return $this->setDate($year, 12, 31)->endOfDay(); - } - /** - * Resets the date to the first day of the millennium and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMillennium(); - * ``` - * - * @return static - */ - public function startOfMillennium() - { - $year = $this->year - ($this->year - 1) % static::YEARS_PER_MILLENNIUM; - return $this->setDate($year, 1, 1)->startOfDay(); - } - /** - * Resets the date to end of the millennium and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMillennium(); - * ``` - * - * @return static - */ - public function endOfMillennium() - { - $year = $this->year - 1 - ($this->year - 1) % static::YEARS_PER_MILLENNIUM + static::YEARS_PER_MILLENNIUM; - return $this->setDate($year, 12, 31)->endOfDay(); - } - /** - * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->startOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek(Carbon::SUNDAY) . "\n"; - * ``` - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return static - */ - public function startOfWeek($weekStartsAt = null) - { - return $this->subDays((7 + $this->dayOfWeek - ($weekStartsAt ?? $this->firstWeekDay)) % 7)->startOfDay(); - } - /** - * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59.999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->endOfWeek() . "\n"; - * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek(Carbon::SATURDAY) . "\n"; - * ``` - * - * @param int $weekEndsAt optional start allow you to specify the day of week to use to end the week - * - * @return static - */ - public function endOfWeek($weekEndsAt = null) - { - return $this->addDays((7 - $this->dayOfWeek + ($weekEndsAt ?? $this->lastWeekDay)) % 7)->endOfDay(); - } - /** - * Modify to start of current hour, minutes and seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfHour(); - * ``` - * - * @return static - */ - public function startOfHour() - { - return $this->setTime($this->hour, 0, 0, 0); - } - /** - * Modify to end of current hour, minutes and seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfHour(); - * ``` - * - * @return static - */ - public function endOfHour() - { - return $this->setTime($this->hour, static::MINUTES_PER_HOUR - 1, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); - } - /** - * Modify to start of current minute, seconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->startOfMinute(); - * ``` - * - * @return static - */ - public function startOfMinute() - { - return $this->setTime($this->hour, $this->minute, 0, 0); - } - /** - * Modify to end of current minute, seconds become 59 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16')->endOfMinute(); - * ``` - * - * @return static - */ - public function endOfMinute() - { - return $this->setTime($this->hour, $this->minute, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); - } - /** - * Modify to start of current second, microseconds become 0 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOfSecond() - * ->format('H:i:s.u'); - * ``` - * - * @return static - */ - public function startOfSecond() - { - return $this->setTime($this->hour, $this->minute, $this->second, 0); - } - /** - * Modify to end of current second, microseconds become 999999 - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->endOfSecond() - * ->format('H:i:s.u'); - * ``` - * - * @return static - */ - public function endOfSecond() - { - return $this->setTime($this->hour, $this->minute, $this->second, static::MICROSECONDS_PER_SECOND - 1); - } - /** - * Modify to start of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf('month') - * ->endOf('week', Carbon::FRIDAY); - * ``` - * - * @param string $unit - * @param array $params - * - * @return static - */ - public function startOf($unit, ...$params) - { - $ucfUnit = \ucfirst(static::singularUnit($unit)); - $method = "startOf{$ucfUnit}"; - if (!\method_exists($this, $method)) { - throw new UnknownUnitException($unit); - } - return $this->{$method}(...$params); - } - /** - * Modify to end of current given unit. - * - * @example - * ``` - * echo Carbon::parse('2018-07-25 12:45:16.334455') - * ->startOf('month') - * ->endOf('week', Carbon::FRIDAY); - * ``` - * - * @param string $unit - * @param array $params - * - * @return static - */ - public function endOf($unit, ...$params) - { - $ucfUnit = \ucfirst(static::singularUnit($unit)); - $method = "endOf{$ucfUnit}"; - if (!\method_exists($this, $method)) { - throw new UnknownUnitException($unit); - } - return $this->{$method}(...$params); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Cast.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Cast.php deleted file mode 100644 index fa643f8..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Cast.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidCastException; -use DateTimeInterface; -/** - * Trait Cast. - * - * Utils to cast into an other class. - */ -trait Cast -{ - /** - * Cast the current instance into the given class. - * - * @param string $className The $className::instance() method will be called to cast the current object. - * - * @return DateTimeInterface - */ - public function cast(string $className) - { - if (!\method_exists($className, 'instance')) { - if (\is_a($className, DateTimeInterface::class, \true)) { - return new $className($this->rawFormat('Y-m-d H:i:s.u'), $this->getTimezone()); - } - throw new InvalidCastException("{$className} has not the instance() method needed to cast the date."); - } - return $className::instance($this); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Comparison.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Comparison.php deleted file mode 100644 index 5acdfb4..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Comparison.php +++ /dev/null @@ -1,1024 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use BadMethodCallException; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\Exceptions\BadComparisonUnitException; -use InvalidArgumentException; -/** - * Trait Comparison. - * - * Comparison utils and testers. All the following methods return booleans. - * nowWithSameTz - * - * Depends on the following methods: - * - * @method static resolveCarbon($date) - * @method static copy() - * @method static nowWithSameTz() - * @method static static yesterday($timezone = null) - * @method static static tomorrow($timezone = null) - */ -trait Comparison -{ - /** @var bool */ - protected $endOfTime = \false; - /** @var bool */ - protected $startOfTime = \false; - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->eq(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see equalTo() - * - * @return bool - */ - public function eq($date) : bool - { - return $this->equalTo($date); - } - /** - * Determines if the instance is equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo(Carbon::parse('2018-07-25 12:45:16')); // true - * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function equalTo($date) : bool - { - $this->discourageNull($date); - $this->discourageBoolean($date); - return $this == $this->resolveCarbon($date); - } - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->ne(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see notEqualTo() - * - * @return bool - */ - public function ne($date) : bool - { - return $this->notEqualTo($date); - } - /** - * Determines if the instance is not equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo(Carbon::parse('2018-07-25 12:45:16')); // false - * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function notEqualTo($date) : bool - { - return !$this->equalTo($date); - } - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see greaterThan() - * - * @return bool - */ - public function gt($date) : bool - { - return $this->greaterThan($date); - } - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function greaterThan($date) : bool - { - $this->discourageNull($date); - $this->discourageBoolean($date); - return $this > $this->resolveCarbon($date); - } - /** - * Determines if the instance is greater (after) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see greaterThan() - * - * @return bool - */ - public function isAfter($date) : bool - { - return $this->greaterThan($date); - } - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see greaterThanOrEqualTo() - * - * @return bool - */ - public function gte($date) : bool - { - return $this->greaterThanOrEqualTo($date); - } - /** - * Determines if the instance is greater (after) than or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:15'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:17'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function greaterThanOrEqualTo($date) : bool - { - $this->discourageNull($date); - $this->discourageBoolean($date); - return $this >= $this->resolveCarbon($date); - } - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see lessThan() - * - * @return bool - */ - public function lt($date) : bool - { - return $this->lessThan($date); - } - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function lessThan($date) : bool - { - $this->discourageNull($date); - $this->discourageBoolean($date); - return $this < $this->resolveCarbon($date); - } - /** - * Determines if the instance is less (before) than another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:16'); // false - * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see lessThan() - * - * @return bool - */ - public function isBefore($date) : bool - { - return $this->lessThan($date); - } - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see lessThanOrEqualTo() - * - * @return bool - */ - public function lte($date) : bool - { - return $this->lessThanOrEqualTo($date); - } - /** - * Determines if the instance is less (before) or equal to another - * - * @example - * ``` - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:15'); // false - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:16'); // true - * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:17'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return bool - */ - public function lessThanOrEqualTo($date) : bool - { - $this->discourageNull($date); - $this->discourageBoolean($date); - return $this <= $this->resolveCarbon($date); - } - /** - * Determines if the instance is between two others. - * - * The third argument allow you to specify if bounds are included or not (true by default) - * but for when you including/excluding bounds may produce different results in your application, - * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->between('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function between($date1, $date2, $equal = \true) : bool - { - $date1 = $this->resolveCarbon($date1); - $date2 = $this->resolveCarbon($date2); - if ($date1->greaterThan($date2)) { - [$date1, $date2] = [$date2, $date1]; - } - if ($equal) { - return $this >= $date1 && $this <= $date2; - } - return $this > $date1 && $this < $date2; - } - /** - * Determines if the instance is between two others, bounds included. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenIncluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-25', '2018-08-01'); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return bool - */ - public function betweenIncluded($date1, $date2) : bool - { - return $this->between($date1, $date2, \true); - } - /** - * Determines if the instance is between two others, bounds excluded. - * - * @example - * ``` - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->betweenExcluded('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-25', '2018-08-01'); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return bool - */ - public function betweenExcluded($date1, $date2) : bool - { - return $this->between($date1, $date2, \false); - } - /** - * Determines if the instance is between two others - * - * @example - * ``` - * Carbon::parse('2018-07-25')->isBetween('2018-07-14', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-08-01', '2018-08-20'); // false - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01'); // true - * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01', false); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * @param bool $equal Indicates if an equal to comparison should be done - * - * @return bool - */ - public function isBetween($date1, $date2, $equal = \true) : bool - { - return $this->between($date1, $date2, $equal); - } - /** - * Determines if the instance is a weekday. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekday(); // false - * Carbon::parse('2019-07-15')->isWeekday(); // true - * ``` - * - * @return bool - */ - public function isWeekday() - { - return !$this->isWeekend(); - } - /** - * Determines if the instance is a weekend day. - * - * @example - * ``` - * Carbon::parse('2019-07-14')->isWeekend(); // true - * Carbon::parse('2019-07-15')->isWeekend(); // false - * ``` - * - * @return bool - */ - public function isWeekend() - { - return \in_array($this->dayOfWeek, static::$weekendDays, \true); - } - /** - * Determines if the instance is yesterday. - * - * @example - * ``` - * Carbon::yesterday()->isYesterday(); // true - * Carbon::tomorrow()->isYesterday(); // false - * ``` - * - * @return bool - */ - public function isYesterday() - { - return $this->toDateString() === static::yesterday($this->getTimezone())->toDateString(); - } - /** - * Determines if the instance is today. - * - * @example - * ``` - * Carbon::today()->isToday(); // true - * Carbon::tomorrow()->isToday(); // false - * ``` - * - * @return bool - */ - public function isToday() - { - return $this->toDateString() === $this->nowWithSameTz()->toDateString(); - } - /** - * Determines if the instance is tomorrow. - * - * @example - * ``` - * Carbon::tomorrow()->isTomorrow(); // true - * Carbon::yesterday()->isTomorrow(); // false - * ``` - * - * @return bool - */ - public function isTomorrow() - { - return $this->toDateString() === static::tomorrow($this->getTimezone())->toDateString(); - } - /** - * Determines if the instance is in the future, ie. greater (after) than now. - * - * @example - * ``` - * Carbon::now()->addHours(5)->isFuture(); // true - * Carbon::now()->subHours(5)->isFuture(); // false - * ``` - * - * @return bool - */ - public function isFuture() - { - return $this->greaterThan($this->nowWithSameTz()); - } - /** - * Determines if the instance is in the past, ie. less (before) than now. - * - * @example - * ``` - * Carbon::now()->subHours(5)->isPast(); // true - * Carbon::now()->addHours(5)->isPast(); // false - * ``` - * - * @return bool - */ - public function isPast() - { - return $this->lessThan($this->nowWithSameTz()); - } - /** - * Determines if the instance is a leap year. - * - * @example - * ``` - * Carbon::parse('2020-01-01')->isLeapYear(); // true - * Carbon::parse('2019-01-01')->isLeapYear(); // false - * ``` - * - * @return bool - */ - public function isLeapYear() - { - return $this->rawFormat('L') === '1'; - } - /** - * Determines if the instance is a long year (using calendar year). - * - * ⚠️ This method completely ignores month and day to use the numeric year number, - * it's not correct if the exact date matters. For instance as `2019-12-30` is already - * in the first week of the 2020 year, if you want to know from this date if ISO week - * year 2020 is a long year, use `isLongIsoYear` instead. - * - * @example - * ``` - * Carbon::create(2015)->isLongYear(); // true - * Carbon::create(2016)->isLongYear(); // false - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - * - * @return bool - */ - public function isLongYear() - { - return static::create($this->year, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === 53; - } - /** - * Determines if the instance is a long year (using ISO 8601 year). - * - * @example - * ``` - * Carbon::parse('2015-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-01')->isLongIsoYear(); // true - * Carbon::parse('2016-01-03')->isLongIsoYear(); // false - * Carbon::parse('2019-12-29')->isLongIsoYear(); // false - * Carbon::parse('2019-12-30')->isLongIsoYear(); // true - * ``` - * - * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates - * - * @return bool - */ - public function isLongIsoYear() - { - return static::create($this->isoWeekYear, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === 53; - } - /** - * Compares the formatted values of the two dates. - * - * @example - * ``` - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-12-13')); // true - * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-06-14')); // false - * ``` - * - * @param string $format date formats to compare. - * @param \Carbon\Carbon|\DateTimeInterface|string|null $date instance to compare with or null to use current day. - * - * @return bool - */ - public function isSameAs($format, $date = null) - { - return $this->rawFormat($format) === $this->resolveCarbon($date)->rawFormat($format); - } - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::parse('2019-01-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // true - * Carbon::parse('2018-12-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // false - * ``` - * - * @param string $unit singular unit string - * @param \Carbon\Carbon|\DateTimeInterface|null $date instance to compare with or null to use current day. - * - * @throws BadComparisonUnitException - * - * @return bool - */ - public function isSameUnit($unit, $date = null) - { - $units = [ - // @call isSameUnit - 'year' => 'Y', - // @call isSameUnit - 'week' => 'o-W', - // @call isSameUnit - 'day' => 'Y-m-d', - // @call isSameUnit - 'hour' => 'Y-m-d H', - // @call isSameUnit - 'minute' => 'Y-m-d H:i', - // @call isSameUnit - 'second' => 'Y-m-d H:i:s', - // @call isSameUnit - 'micro' => 'Y-m-d H:i:s.u', - // @call isSameUnit - 'microsecond' => 'Y-m-d H:i:s.u', - ]; - if (isset($units[$unit])) { - return $this->isSameAs($units[$unit], $date); - } - if (isset($this->{$unit})) { - return $this->resolveCarbon($date)->{$unit} === $this->{$unit}; - } - if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { - throw new BadComparisonUnitException($unit); - } - return \false; - } - /** - * Determines if the instance is in the current unit given. - * - * @example - * ``` - * Carbon::now()->isCurrentUnit('hour'); // true - * Carbon::now()->subHours(2)->isCurrentUnit('hour'); // false - * ``` - * - * @param string $unit The unit to test. - * - * @throws BadMethodCallException - * - * @return bool - */ - public function isCurrentUnit($unit) - { - return $this->{'isSame' . \ucfirst($unit)}(); - } - /** - * Checks if the passed in date is in the same quarter as the instance quarter (and year if needed). - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-03-01')); // true - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-04-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01')); // false - * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01'), false); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|string|null $date The instance to compare with or null to use current day. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameQuarter($date = null, $ofSameYear = \true) - { - $date = $this->resolveCarbon($date); - return $this->quarter === $date->quarter && (!$ofSameYear || $this->isSameYear($date)); - } - /** - * Checks if the passed in date is in the same month as the instance´s month. - * - * @example - * ``` - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-01-01')); // true - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-02-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01')); // false - * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01'), false); // true - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use the current date. - * @param bool $ofSameYear Check if it is the same month in the same year. - * - * @return bool - */ - public function isSameMonth($date = null, $ofSameYear = \true) - { - return $this->isSameAs($ofSameYear ? 'Y-m' : 'm', $date); - } - /** - * Checks if this day is a specific day of the week. - * - * @example - * ``` - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::WEDNESDAY); // true - * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::FRIDAY); // false - * Carbon::parse('2019-07-17')->isDayOfWeek('Wednesday'); // true - * Carbon::parse('2019-07-17')->isDayOfWeek('Friday'); // false - * ``` - * - * @param int $dayOfWeek - * - * @return bool - */ - public function isDayOfWeek($dayOfWeek) - { - if (\is_string($dayOfWeek) && \defined($constant = static::class . '::' . \strtoupper($dayOfWeek))) { - $dayOfWeek = \constant($constant); - } - return $this->dayOfWeek === $dayOfWeek; - } - /** - * Check if its the birthday. Compares the date/month values of the two dates. - * - * @example - * ``` - * Carbon::now()->subYears(5)->isBirthday(); // true - * Carbon::now()->subYears(5)->subDay()->isBirthday(); // false - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-05')); // true - * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-06')); // false - * ``` - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day. - * - * @return bool - */ - public function isBirthday($date = null) - { - return $this->isSameAs('md', $date); - } - /** - * Check if today is the last day of the Month - * - * @example - * ``` - * Carbon::parse('2019-02-28')->isLastOfMonth(); // true - * Carbon::parse('2019-03-28')->isLastOfMonth(); // false - * Carbon::parse('2019-03-30')->isLastOfMonth(); // false - * Carbon::parse('2019-03-31')->isLastOfMonth(); // true - * Carbon::parse('2019-04-30')->isLastOfMonth(); // true - * ``` - * - * @return bool - */ - public function isLastOfMonth() - { - return $this->day === $this->daysInMonth; - } - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isStartOfDay(); // true - * Carbon::parse('2019-02-28 00:00:01')->isStartOfDay(); // false - * Carbon::parse('2019-02-28 00:00:00.000000')->isStartOfDay(true); // true - * Carbon::parse('2019-02-28 00:00:00.000012')->isStartOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * - * @return bool - */ - public function isStartOfDay($checkMicroseconds = \false) - { - /* @var CarbonInterface $this */ - return $checkMicroseconds ? $this->rawFormat('H:i:s.u') === '00:00:00.000000' : $this->rawFormat('H:i:s') === '00:00:00'; - } - /** - * Check if the instance is end of day. - * - * @example - * ``` - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(); // true - * Carbon::parse('2019-02-28 23:59:58.999999')->isEndOfDay(); // false - * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(true); // true - * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(true); // false - * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(true); // false - * ``` - * - * @param bool $checkMicroseconds check time at microseconds precision - * - * @return bool - */ - public function isEndOfDay($checkMicroseconds = \false) - { - /* @var CarbonInterface $this */ - return $checkMicroseconds ? $this->rawFormat('H:i:s.u') === '23:59:59.999999' : $this->rawFormat('H:i:s') === '23:59:59'; - } - /** - * Check if the instance is start of day / midnight. - * - * @example - * ``` - * Carbon::parse('2019-02-28 00:00:00')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:00.999999')->isMidnight(); // true - * Carbon::parse('2019-02-28 00:00:01')->isMidnight(); // false - * ``` - * - * @return bool - */ - public function isMidnight() - { - return $this->isStartOfDay(); - } - /** - * Check if the instance is midday. - * - * @example - * ``` - * Carbon::parse('2019-02-28 11:59:59.999999')->isMidday(); // false - * Carbon::parse('2019-02-28 12:00:00')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:00.999999')->isMidday(); // true - * Carbon::parse('2019-02-28 12:00:01')->isMidday(); // false - * ``` - * - * @return bool - */ - public function isMidday() - { - /* @var CarbonInterface $this */ - return $this->rawFormat('G:i:s') === static::$midDayAt . ':00:00'; - } - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function hasFormat($date, $format) - { - // createFromFormat() is known to handle edge cases silently. - // E.g. "1975-5-1" (Y-n-j) will still be parsed correctly when "Y-m-d" is supplied as the format. - // To ensure we're really testing against our desired format, perform an additional regex validation. - return self::matchFormatPattern((string) $date, \preg_quote((string) $format, '/'), static::$regexFormats); - } - /** - * Checks if the (date)time string is in a given format. - * - * @example - * ``` - * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true - * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function hasFormatWithModifiers($date, $format) : bool - { - return self::matchFormatPattern((string) $date, (string) $format, \array_merge(static::$regexFormats, static::$regexFormatModifiers)); - } - /** - * Checks if the (date)time string is in a given format and valid to create a - * new instance. - * - * @example - * ``` - * Carbon::canBeCreatedFromFormat('11:12:45', 'h:i:s'); // true - * Carbon::canBeCreatedFromFormat('13:12:45', 'h:i:s'); // false - * ``` - * - * @param string $date - * @param string $format - * - * @return bool - */ - public static function canBeCreatedFromFormat($date, $format) - { - try { - // Try to create a DateTime object. Throws an InvalidArgumentException if the provided time string - // doesn't match the format in any way. - if (!static::rawCreateFromFormat($format, $date)) { - return \false; - } - } catch (InvalidArgumentException $e) { - return \false; - } - return static::hasFormatWithModifiers($date, $format); - } - /** - * Returns true if the current date matches the given string. - * - * @example - * ``` - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2018')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06-02')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('Sunday')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('June')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:45')); // true - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:00')); // false - * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12h')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3pm')); // true - * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3am')); // false - * ``` - * - * @param string $tester day name, month name, hour, date, etc. as string - * - * @return bool - */ - public function is(string $tester) - { - $tester = \trim($tester); - if (\preg_match('/^\\d+$/', $tester)) { - return $this->year === (int) $tester; - } - if (\preg_match('/^\\d{3,}-\\d{1,2}$/', $tester)) { - return $this->isSameMonth(static::parse($tester)); - } - if (\preg_match('/^\\d{1,2}-\\d{1,2}$/', $tester)) { - return $this->isSameDay(static::parse($this->year . '-' . $tester)); - } - $modifier = \preg_replace('/(\\d)h$/i', '$1:00', $tester); - /* @var CarbonInterface $max */ - $median = static::parse('5555-06-15 12:30:30.555555')->modify($modifier); - $current = $this->avoidMutation(); - /* @var CarbonInterface $other */ - $other = $this->avoidMutation()->modify($modifier); - if ($current->eq($other)) { - return \true; - } - if (\preg_match('/\\d:\\d{1,2}:\\d{1,2}$/', $tester)) { - return $current->startOfSecond()->eq($other); - } - if (\preg_match('/\\d:\\d{1,2}$/', $tester)) { - return $current->startOfMinute()->eq($other); - } - if (\preg_match('/\\d(?:h|am|pm)$/', $tester)) { - return $current->startOfHour()->eq($other); - } - if (\preg_match('/^(?:january|february|march|april|may|june|july|august|september|october|november|december)(?:\\s+\\d+)?$/i', $tester)) { - return $current->startOfMonth()->eq($other->startOfMonth()); - } - $units = ['month' => [1, 'year'], 'day' => [1, 'month'], 'hour' => [0, 'day'], 'minute' => [0, 'hour'], 'second' => [0, 'minute'], 'microsecond' => [0, 'second']]; - foreach ($units as $unit => [$minimum, $startUnit]) { - if ($minimum === $median->{$unit}) { - $current = $current->startOf($startUnit); - break; - } - } - return $current->eq($other); - } - /** - * Checks if the (date)time string is in a given format with - * given list of pattern replacements. - * - * @example - * ``` - * Carbon::hasFormat('11:12:45', 'h:i:s'); // true - * Carbon::hasFormat('13:12:45', 'h:i:s'); // false - * ``` - * - * @param string $date - * @param string $format - * @param array $replacements - * - * @return bool - */ - private static function matchFormatPattern(string $date, string $format, array $replacements) : bool - { - // Preg quote, but remove escaped backslashes since we'll deal with escaped characters in the format string. - $regex = \str_replace('\\\\', '\\', $format); - // Replace not-escaped letters - $regex = \preg_replace_callback('/(?startOfTime ?? \false; - } - /** - * Returns true if the date was created using CarbonImmutable::endOfTime() - * - * @return bool - */ - public function isEndOfTime() : bool - { - return $this->endOfTime ?? \false; - } - private function discourageNull($value) : void - { - if ($value === null) { - @\trigger_error("Since 2.61.0, it's deprecated to compare a date to null, meaning of such comparison is ambiguous and will no longer be possible in 3.0.0, you should explicitly pass 'now' or make an other check to eliminate null values.", \E_USER_DEPRECATED); - } - } - private function discourageBoolean($value) : void - { - if (\is_bool($value)) { - @\trigger_error("Since 2.61.0, it's deprecated to compare a date to true or false, meaning of such comparison is ambiguous and will no longer be possible in 3.0.0, you should explicitly pass 'now' or make an other check to eliminate boolean values.", \E_USER_DEPRECATED); - } - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Converter.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Converter.php deleted file mode 100644 index e4d58fa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Converter.php +++ /dev/null @@ -1,566 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonInterval; -use WP_Ultimo\Dependencies\Carbon\CarbonPeriod; -use WP_Ultimo\Dependencies\Carbon\CarbonPeriodImmutable; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnitException; -use Closure; -use DateTime; -use DateTimeImmutable; -use ReturnTypeWillChange; -/** - * Trait Converter. - * - * Change date into different string formats and types and - * handle the string cast. - * - * Depends on the following methods: - * - * @method static copy() - */ -trait Converter -{ - use ToStringFormat; - /** - * Returns the formatted date string on success or FALSE on failure. - * - * @see https://php.net/manual/en/datetime.format.php - * - * @param string $format - * - * @return string - */ - #[ReturnTypeWillChange] - public function format($format) - { - $function = $this->localFormatFunction ?: static::$formatFunction; - if (!$function) { - return $this->rawFormat($format); - } - if (\is_string($function) && \method_exists($this, $function)) { - $function = [$this, $function]; - } - return $function(...\func_get_args()); - } - /** - * @see https://php.net/manual/en/datetime.format.php - * - * @param string $format - * - * @return string - */ - public function rawFormat($format) - { - return parent::format($format); - } - /** - * Format the instance as a string using the set format - * - * @example - * ``` - * echo Carbon::now(); // Carbon instances can be cast to string - * ``` - * - * @return string - */ - public function __toString() - { - $format = $this->localToStringFormat ?? static::$toStringFormat; - return $format instanceof Closure ? $format($this) : $this->rawFormat($format ?: (\defined('static::DEFAULT_TO_STRING_FORMAT') ? static::DEFAULT_TO_STRING_FORMAT : CarbonInterface::DEFAULT_TO_STRING_FORMAT)); - } - /** - * Format the instance as date - * - * @example - * ``` - * echo Carbon::now()->toDateString(); - * ``` - * - * @return string - */ - public function toDateString() - { - return $this->rawFormat('Y-m-d'); - } - /** - * Format the instance as a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDateString(); - * ``` - * - * @return string - */ - public function toFormattedDateString() - { - return $this->rawFormat('M j, Y'); - } - /** - * Format the instance with the day, and a readable date - * - * @example - * ``` - * echo Carbon::now()->toFormattedDayDateString(); - * ``` - * - * @return string - */ - public function toFormattedDayDateString() : string - { - return $this->rawFormat('D, M j, Y'); - } - /** - * Format the instance as time - * - * @example - * ``` - * echo Carbon::now()->toTimeString(); - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toTimeString($unitPrecision = 'second') - { - return $this->rawFormat(static::getTimeFormatByPrecision($unitPrecision)); - } - /** - * Format the instance as date and time - * - * @example - * ``` - * echo Carbon::now()->toDateTimeString(); - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toDateTimeString($unitPrecision = 'second') - { - return $this->rawFormat('Y-m-d ' . static::getTimeFormatByPrecision($unitPrecision)); - } - /** - * Return a format from H:i to H:i:s.u according to given unit precision. - * - * @param string $unitPrecision "minute", "second", "millisecond" or "microsecond" - * - * @return string - */ - public static function getTimeFormatByPrecision($unitPrecision) - { - switch (static::singularUnit($unitPrecision)) { - case 'minute': - return 'H:i'; - case 'second': - return 'H:i:s'; - case 'm': - case 'millisecond': - return 'H:i:s.v'; - case 'µ': - case 'microsecond': - return 'H:i:s.u'; - } - throw new UnitException('Precision unit expected among: minute, second, millisecond and microsecond.'); - } - /** - * Format the instance as date and time T-separated with no timezone - * - * @example - * ``` - * echo Carbon::now()->toDateTimeLocalString(); - * echo "\n"; - * echo Carbon::now()->toDateTimeLocalString('minute'); // You can specify precision among: minute, second, millisecond and microsecond - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toDateTimeLocalString($unitPrecision = 'second') - { - return $this->rawFormat('Y-m-d\\T' . static::getTimeFormatByPrecision($unitPrecision)); - } - /** - * Format the instance with day, date and time - * - * @example - * ``` - * echo Carbon::now()->toDayDateTimeString(); - * ``` - * - * @return string - */ - public function toDayDateTimeString() - { - return $this->rawFormat('D, M j, Y g:i A'); - } - /** - * Format the instance as ATOM - * - * @example - * ``` - * echo Carbon::now()->toAtomString(); - * ``` - * - * @return string - */ - public function toAtomString() - { - return $this->rawFormat(DateTime::ATOM); - } - /** - * Format the instance as COOKIE - * - * @example - * ``` - * echo Carbon::now()->toCookieString(); - * ``` - * - * @return string - */ - public function toCookieString() - { - return $this->rawFormat(DateTime::COOKIE); - } - /** - * Format the instance as ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601String(); - * ``` - * - * @return string - */ - public function toIso8601String() - { - return $this->toAtomString(); - } - /** - * Format the instance as RFC822 - * - * @example - * ``` - * echo Carbon::now()->toRfc822String(); - * ``` - * - * @return string - */ - public function toRfc822String() - { - return $this->rawFormat(DateTime::RFC822); - } - /** - * Convert the instance to UTC and return as Zulu ISO8601 - * - * @example - * ``` - * echo Carbon::now()->toIso8601ZuluString(); - * ``` - * - * @param string $unitPrecision - * - * @return string - */ - public function toIso8601ZuluString($unitPrecision = 'second') - { - return $this->avoidMutation()->utc()->rawFormat('Y-m-d\\T' . static::getTimeFormatByPrecision($unitPrecision) . '\\Z'); - } - /** - * Format the instance as RFC850 - * - * @example - * ``` - * echo Carbon::now()->toRfc850String(); - * ``` - * - * @return string - */ - public function toRfc850String() - { - return $this->rawFormat(DateTime::RFC850); - } - /** - * Format the instance as RFC1036 - * - * @example - * ``` - * echo Carbon::now()->toRfc1036String(); - * ``` - * - * @return string - */ - public function toRfc1036String() - { - return $this->rawFormat(DateTime::RFC1036); - } - /** - * Format the instance as RFC1123 - * - * @example - * ``` - * echo Carbon::now()->toRfc1123String(); - * ``` - * - * @return string - */ - public function toRfc1123String() - { - return $this->rawFormat(DateTime::RFC1123); - } - /** - * Format the instance as RFC2822 - * - * @example - * ``` - * echo Carbon::now()->toRfc2822String(); - * ``` - * - * @return string - */ - public function toRfc2822String() - { - return $this->rawFormat(DateTime::RFC2822); - } - /** - * Format the instance as RFC3339 - * - * @param bool $extended - * - * @example - * ``` - * echo Carbon::now()->toRfc3339String() . "\n"; - * echo Carbon::now()->toRfc3339String(true) . "\n"; - * ``` - * - * @return string - */ - public function toRfc3339String($extended = \false) - { - $format = DateTime::RFC3339; - if ($extended) { - $format = DateTime::RFC3339_EXTENDED; - } - return $this->rawFormat($format); - } - /** - * Format the instance as RSS - * - * @example - * ``` - * echo Carbon::now()->toRssString(); - * ``` - * - * @return string - */ - public function toRssString() - { - return $this->rawFormat(DateTime::RSS); - } - /** - * Format the instance as W3C - * - * @example - * ``` - * echo Carbon::now()->toW3cString(); - * ``` - * - * @return string - */ - public function toW3cString() - { - return $this->rawFormat(DateTime::W3C); - } - /** - * Format the instance as RFC7231 - * - * @example - * ``` - * echo Carbon::now()->toRfc7231String(); - * ``` - * - * @return string - */ - public function toRfc7231String() - { - return $this->avoidMutation()->setTimezone('GMT')->rawFormat(\defined('static::RFC7231_FORMAT') ? static::RFC7231_FORMAT : CarbonInterface::RFC7231_FORMAT); - } - /** - * Get default array representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toArray()); - * ``` - * - * @return array - */ - public function toArray() - { - return ['year' => $this->year, 'month' => $this->month, 'day' => $this->day, 'dayOfWeek' => $this->dayOfWeek, 'dayOfYear' => $this->dayOfYear, 'hour' => $this->hour, 'minute' => $this->minute, 'second' => $this->second, 'micro' => $this->micro, 'timestamp' => $this->timestamp, 'formatted' => $this->rawFormat(\defined('static::DEFAULT_TO_STRING_FORMAT') ? static::DEFAULT_TO_STRING_FORMAT : CarbonInterface::DEFAULT_TO_STRING_FORMAT), 'timezone' => $this->timezone]; - } - /** - * Get default object representation. - * - * @example - * ``` - * var_dump(Carbon::now()->toObject()); - * ``` - * - * @return object - */ - public function toObject() - { - return (object) $this->toArray(); - } - /** - * Returns english human readable complete date string. - * - * @example - * ``` - * echo Carbon::now()->toString(); - * ``` - * - * @return string - */ - public function toString() - { - return $this->avoidMutation()->locale('en')->isoFormat('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z, if $keepOffset truthy, offset will be kept: - * 1977-04-22T01:00:00-05:00). - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toISOString() . "\n"; - * echo Carbon::now('America/Toronto')->toISOString(true) . "\n"; - * ``` - * - * @param bool $keepOffset Pass true to keep the date offset. Else forced to UTC. - * - * @return null|string - */ - public function toISOString($keepOffset = \false) - { - if (!$this->isValid()) { - return null; - } - $yearFormat = $this->year < 0 || $this->year > 9999 ? 'YYYYYY' : 'YYYY'; - $tzFormat = $keepOffset ? 'Z' : '[Z]'; - $date = $keepOffset ? $this : $this->avoidMutation()->utc(); - return $date->isoFormat("{$yearFormat}-MM-DD[T]HH:mm:ss.SSSSSS{$tzFormat}"); - } - /** - * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone. - * - * @example - * ``` - * echo Carbon::now('America/Toronto')->toJSON(); - * ``` - * - * @return null|string - */ - public function toJSON() - { - return $this->toISOString(); - } - /** - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTime()); - * ``` - * - * @return DateTime - */ - public function toDateTime() - { - return new DateTime($this->rawFormat('Y-m-d H:i:s.u'), $this->getTimezone()); - } - /** - * Return native toDateTimeImmutable PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDateTimeImmutable()); - * ``` - * - * @return DateTimeImmutable - */ - public function toDateTimeImmutable() - { - return new DateTimeImmutable($this->rawFormat('Y-m-d H:i:s.u'), $this->getTimezone()); - } - /** - * @alias toDateTime - * - * Return native DateTime PHP object matching the current instance. - * - * @example - * ``` - * var_dump(Carbon::now()->toDate()); - * ``` - * - * @return DateTime - */ - public function toDate() - { - return $this->toDateTime(); - } - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|int|null $end period end date or recurrences count if int - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - * - * @return CarbonPeriod - */ - public function toPeriod($end = null, $interval = null, $unit = null) - { - if ($unit) { - $interval = CarbonInterval::make("{$interval} " . static::pluralUnit($unit)); - } - $period = ($this->isMutable() ? new CarbonPeriod() : new CarbonPeriodImmutable())->setDateClass(static::class)->setStartDate($this); - if ($interval) { - $period = $period->setDateInterval($interval); - } - if (\is_int($end) || \is_string($end) && \ctype_digit($end)) { - $period = $period->setRecurrences($end); - } elseif ($end) { - $period = $period->setEndDate($end); - } - return $period; - } - /** - * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). - * - * @param \DateTimeInterface|Carbon|CarbonImmutable|null $end period end date - * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit - * @param string|null $unit if specified, $interval must be an integer - * - * @return CarbonPeriod - */ - public function range($end = null, $interval = null, $unit = null) - { - return $this->toPeriod($end, $interval, $unit); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Creator.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Creator.php deleted file mode 100644 index c1df104..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Creator.php +++ /dev/null @@ -1,740 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidDateException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidFormatException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\OutOfRangeException; -use WP_Ultimo\Dependencies\Carbon\Translator; -use Closure; -use WP_Ultimo\Dependencies\DateMalformedStringException; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use Exception; -use ReturnTypeWillChange; -/** - * Trait Creator. - * - * Static creators. - * - * Depends on the following methods: - * - * @method static Carbon|CarbonImmutable getTestNow() - */ -trait Creator -{ - use ObjectInitialisation; - /** - * The errors that can occur. - * - * @var array - */ - protected static $lastErrors; - /** - * Create a new Carbon instance. - * - * Please see the testing aids section (specifically static::setTestNow()) - * for more on the possibility of this constructor returning a test instance. - * - * @param DateTimeInterface|string|null $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - */ - public function __construct($time = null, $tz = null) - { - if ($time instanceof DateTimeInterface) { - $time = $this->constructTimezoneFromDateTime($time, $tz)->format('Y-m-d H:i:s.u'); - } - if (\is_numeric($time) && (!\is_string($time) || !\preg_match('/^\\d{1,14}$/', $time))) { - $time = static::createFromTimestampUTC($time)->format('Y-m-d\\TH:i:s.uP'); - } - // If the class has a test now set and we are trying to create a now() - // instance then override as required - $isNow = empty($time) || $time === 'now'; - if (\method_exists(static::class, 'hasTestNow') && \method_exists(static::class, 'getTestNow') && static::hasTestNow() && ($isNow || static::hasRelativeKeywords($time))) { - static::mockConstructorParameters($time, $tz); - } - // Work-around for PHP bug https://bugs.php.net/bug.php?id=67127 - if (!\str_contains((string) 0.1, '.')) { - $locale = \setlocale(\LC_NUMERIC, '0'); - // @codeCoverageIgnore - \setlocale(\LC_NUMERIC, 'C'); - // @codeCoverageIgnore - } - try { - parent::__construct($time ?: 'now', static::safeCreateDateTimeZone($tz) ?: null); - } catch (Exception $exception) { - throw new InvalidFormatException($exception->getMessage(), 0, $exception); - } - $this->constructedObjectId = \spl_object_hash($this); - if (isset($locale)) { - \setlocale(\LC_NUMERIC, $locale); - // @codeCoverageIgnore - } - self::setLastErrors(parent::getLastErrors()); - } - /** - * Get timezone from a datetime instance. - * - * @param DateTimeInterface $date - * @param DateTimeZone|string|null $tz - * - * @return DateTimeInterface - */ - private function constructTimezoneFromDateTime(DateTimeInterface $date, &$tz) - { - if ($tz !== null) { - $safeTz = static::safeCreateDateTimeZone($tz); - if ($safeTz) { - return ($date instanceof DateTimeImmutable ? $date : clone $date)->setTimezone($safeTz); - } - return $date; - } - $tz = $date->getTimezone(); - return $date; - } - /** - * Update constructedObjectId on cloned. - */ - public function __clone() - { - $this->constructedObjectId = \spl_object_hash($this); - } - /** - * Create a Carbon instance from a DateTime one. - * - * @param DateTimeInterface $date - * - * @return static - */ - public static function instance($date) - { - if ($date instanceof static) { - return clone $date; - } - static::expectDateTime($date); - $instance = new static($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); - if ($date instanceof CarbonInterface) { - $settings = $date->getSettings(); - if (!$date->hasLocalTranslator()) { - unset($settings['locale']); - } - $instance->settings($settings); - } - return $instance; - } - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @param string|DateTimeInterface|null $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function rawParse($time = null, $tz = null) - { - if ($time instanceof DateTimeInterface) { - return static::instance($time); - } - try { - return new static($time, $tz); - } catch (Exception $exception) { - // @codeCoverageIgnoreStart - try { - $date = @static::now($tz)->change($time); - } catch (DateMalformedStringException $ignoredException) { - $date = null; - } - // @codeCoverageIgnoreEnd - if (!$date) { - throw new InvalidFormatException("Could not parse '{$time}': " . $exception->getMessage(), 0, $exception); - } - return $date; - } - } - /** - * Create a carbon instance from a string. - * - * This is an alias for the constructor that allows better fluent syntax - * as it allows you to do Carbon::parse('Monday next week')->fn() rather - * than (new Carbon('Monday next week'))->fn(). - * - * @param string|DateTimeInterface|null $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function parse($time = null, $tz = null) - { - $function = static::$parseFunction; - if (!$function) { - return static::rawParse($time, $tz); - } - if (\is_string($function) && \method_exists(static::class, $function)) { - $function = [static::class, $function]; - } - return $function(...\func_get_args()); - } - /** - * Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). - * - * @param string $time date/time string in the given language (may also contain English). - * @param string|null $locale if locale is null or not specified, current global locale will be - * used instead. - * @param DateTimeZone|string|null $tz optional timezone for the new instance. - * - * @throws InvalidFormatException - * - * @return static - */ - public static function parseFromLocale($time, $locale = null, $tz = null) - { - return static::rawParse(static::translateTimeString($time, $locale, 'en'), $tz); - } - /** - * Get a Carbon instance for the current date and time. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function now($tz = null) - { - return new static(null, $tz); - } - /** - * Create a Carbon instance for today. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function today($tz = null) - { - return static::rawParse('today', $tz); - } - /** - * Create a Carbon instance for tomorrow. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function tomorrow($tz = null) - { - return static::rawParse('tomorrow', $tz); - } - /** - * Create a Carbon instance for yesterday. - * - * @param DateTimeZone|string|null $tz - * - * @return static - */ - public static function yesterday($tz = null) - { - return static::rawParse('yesterday', $tz); - } - /** - * Create a Carbon instance for the greatest supported date. - * - * @return static - */ - public static function maxValue() - { - if (self::$PHPIntSize === 4) { - // 32 bit - return static::createFromTimestamp(\PHP_INT_MAX); - // @codeCoverageIgnore - } - // 64 bit - return static::create(9999, 12, 31, 23, 59, 59); - } - /** - * Create a Carbon instance for the lowest supported date. - * - * @return static - */ - public static function minValue() - { - if (self::$PHPIntSize === 4) { - // 32 bit - return static::createFromTimestamp(~\PHP_INT_MAX); - // @codeCoverageIgnore - } - // 64 bit - return static::create(1, 1, 1, 0, 0, 0); - } - private static function assertBetween($unit, $value, $min, $max) - { - if (static::isStrictModeEnabled() && ($value < $min || $value > $max)) { - throw new OutOfRangeException($unit, $min, $max, $value); - } - } - private static function createNowInstance($tz) - { - if (!static::hasTestNow()) { - return static::now($tz); - } - $now = static::getTestNow(); - if ($now instanceof Closure) { - return $now(static::now($tz)); - } - return $now->avoidMutation()->tz($tz); - } - /** - * Create a new Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * @param DateTimeInterface|int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) - { - if (\is_string($year) && !\is_numeric($year) || $year instanceof DateTimeInterface) { - return static::parse($year, $tz ?: (\is_string($month) || $month instanceof DateTimeZone ? $month : null)); - } - $defaults = null; - $getDefault = function ($unit) use($tz, &$defaults) { - if ($defaults === null) { - $now = self::createNowInstance($tz); - $defaults = \array_combine(['year', 'month', 'day', 'hour', 'minute', 'second'], \explode('-', $now->rawFormat('Y-n-j-G-i-s.u'))); - } - return $defaults[$unit]; - }; - $year = $year ?? $getDefault('year'); - $month = $month ?? $getDefault('month'); - $day = $day ?? $getDefault('day'); - $hour = $hour ?? $getDefault('hour'); - $minute = $minute ?? $getDefault('minute'); - $second = (float) ($second ?? $getDefault('second')); - self::assertBetween('month', $month, 0, 99); - self::assertBetween('day', $day, 0, 99); - self::assertBetween('hour', $hour, 0, 99); - self::assertBetween('minute', $minute, 0, 99); - self::assertBetween('second', $second, 0, 99); - $fixYear = null; - if ($year < 0) { - $fixYear = $year; - $year = 0; - } elseif ($year > 9999) { - $fixYear = $year - 9999; - $year = 9999; - } - $second = ($second < 10 ? '0' : '') . \number_format($second, 6); - $instance = static::rawCreateFromFormat('!Y-n-j G:i:s.u', \sprintf('%s-%s-%s %s:%02s:%02s', $year, $month, $day, $hour, $minute, $second), $tz); - if ($fixYear !== null) { - $instance = $instance->addYears($fixYear); - } - return $instance; - } - /** - * Create a new safe Carbon instance from a specific date and time. - * - * If any of $year, $month or $day are set to null their now() values will - * be used. - * - * If $hour is null it will be set to its now() value and the default - * values for $minute and $second will be their now() values. - * - * If $hour is not null then the default values for $minute and $second - * will be 0. - * - * If one of the set values is not valid, an InvalidDateException - * will be thrown. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidDateException - * - * @return static|false - */ - public static function createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) - { - $fields = static::getRangesByUnit(); - foreach ($fields as $field => $range) { - if (${$field} !== null && (!\is_int(${$field}) || ${$field} < $range[0] || ${$field} > $range[1])) { - if (static::isStrictModeEnabled()) { - throw new InvalidDateException($field, ${$field}); - } - return \false; - } - } - $instance = static::create($year, $month, $day, $hour, $minute, $second, $tz); - foreach (\array_reverse($fields) as $field => $range) { - if (${$field} !== null && (!\is_int(${$field}) || ${$field} !== $instance->{$field})) { - if (static::isStrictModeEnabled()) { - throw new InvalidDateException($field, ${$field}); - } - return \false; - } - } - return $instance; - } - /** - * Create a new Carbon instance from a specific date and time using strict validation. - * - * @see create() - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null) : self - { - $initialStrictMode = static::isStrictModeEnabled(); - static::useStrictMode(\true); - try { - $date = static::create($year, $month, $day, $hour, $minute, $second, $tz); - } finally { - static::useStrictMode($initialStrictMode); - } - return $date; - } - /** - * Create a Carbon instance from just a date. The time portion is set to now. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromDate($year = null, $month = null, $day = null, $tz = null) - { - return static::create($year, $month, $day, null, null, null, $tz); - } - /** - * Create a Carbon instance from just a date. The time portion is set to midnight. - * - * @param int|null $year - * @param int|null $month - * @param int|null $day - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createMidnightDate($year = null, $month = null, $day = null, $tz = null) - { - return static::create($year, $month, $day, 0, 0, 0, $tz); - } - /** - * Create a Carbon instance from just a time. The date portion is set to today. - * - * @param int|null $hour - * @param int|null $minute - * @param int|null $second - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) - { - return static::create(null, null, null, $hour, $minute, $second, $tz); - } - /** - * Create a Carbon instance from a time string. The date portion is set to today. - * - * @param string $time - * @param DateTimeZone|string|null $tz - * - * @throws InvalidFormatException - * - * @return static - */ - public static function createFromTimeString($time, $tz = null) - { - return static::today($tz)->setTimeFromTimeString($time); - } - /** - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $originalTz - * - * @return DateTimeInterface|false - */ - private static function createFromFormatAndTimezone($format, $time, $originalTz) - { - // Work-around for https://bugs.php.net/bug.php?id=75577 - // @codeCoverageIgnoreStart - if (\version_compare(\PHP_VERSION, '7.3.0-dev', '<')) { - $format = \str_replace('.v', '.u', $format); - } - // @codeCoverageIgnoreEnd - if ($originalTz === null) { - return parent::createFromFormat($format, (string) $time); - } - $tz = \is_int($originalTz) ? @\timezone_name_from_abbr('', (int) ($originalTz * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE), 1) : $originalTz; - $tz = static::safeCreateDateTimeZone($tz, $originalTz); - if ($tz === \false) { - return \false; - } - return parent::createFromFormat($format, (string) $time, $tz); - } - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function rawCreateFromFormat($format, $time, $tz = null) - { - // Work-around for https://bugs.php.net/bug.php?id=80141 - $format = \preg_replace('/(?getTimezone(); - } - $mock = $mock->copy(); - // Prepend mock datetime only if the format does not contain non escaped unix epoch reset flag. - if (!\preg_match("/{$nonEscaped}[!|]/", $format)) { - if (\preg_match('/[HhGgisvuB]/', $format)) { - $mock = $mock->setTime(0, 0); - } - $format = static::MOCK_DATETIME_FORMAT . ' ' . $format; - $time = ($mock instanceof self ? $mock->rawFormat(static::MOCK_DATETIME_FORMAT) : $mock->format(static::MOCK_DATETIME_FORMAT)) . ' ' . $time; - } - // Regenerate date from the modified format to base result on the mocked instance instead of now. - $date = self::createFromFormatAndTimezone($format, $time, $tz); - } - if ($date instanceof DateTimeInterface) { - $instance = static::instance($date); - $instance::setLastErrors($lastErrors); - return $instance; - } - if (static::isStrictModeEnabled()) { - throw new InvalidFormatException(\implode(\PHP_EOL, $lastErrors['errors'])); - } - return \false; - } - /** - * Create a Carbon instance from a specific format. - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - #[ReturnTypeWillChange] - public static function createFromFormat($format, $time, $tz = null) - { - $function = static::$createFromFormatFunction; - if (!$function) { - return static::rawCreateFromFormat($format, $time, $tz); - } - if (\is_string($function) && \method_exists(static::class, $function)) { - $function = [static::class, $function]; - } - return $function(...\func_get_args()); - } - /** - * Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). - * - * @param string $format Datetime format - * @param string $time - * @param DateTimeZone|string|false|null $tz optional timezone - * @param string|null $locale locale to be used for LTS, LT, LL, LLL, etc. macro-formats (en by fault, unneeded if no such macro-format in use) - * @param \Symfony\Component\Translation\TranslatorInterface $translator optional custom translator to use for macro-formats - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null) - { - $format = \preg_replace_callback('/(? static::getTranslationMessageWith($translator, 'formats.LT', $locale, 'h:mm A'), 'LTS' => static::getTranslationMessageWith($translator, 'formats.LTS', $locale, 'h:mm:ss A'), 'L' => static::getTranslationMessageWith($translator, 'formats.L', $locale, 'MM/DD/YYYY'), 'LL' => static::getTranslationMessageWith($translator, 'formats.LL', $locale, 'MMMM D, YYYY'), 'LLL' => static::getTranslationMessageWith($translator, 'formats.LLL', $locale, 'MMMM D, YYYY h:mm A'), 'LLLL' => static::getTranslationMessageWith($translator, 'formats.LLLL', $locale, 'dddd, MMMM D, YYYY h:mm A')]; - } - return $formats[$code] ?? \preg_replace_callback('/MMMM|MM|DD|dddd/', function ($code) { - return \mb_substr($code[0], 1); - }, $formats[\strtoupper($code)] ?? ''); - }, $format); - $format = \preg_replace_callback('/(? 'd', 'OM' => 'M', 'OY' => 'Y', 'OH' => 'G', 'Oh' => 'g', 'Om' => 'i', 'Os' => 's', 'D' => 'd', 'DD' => 'd', 'Do' => 'd', 'd' => '!', 'dd' => '!', 'ddd' => 'D', 'dddd' => 'D', 'DDD' => 'z', 'DDDD' => 'z', 'DDDo' => 'z', 'e' => '!', 'E' => '!', 'H' => 'G', 'HH' => 'H', 'h' => 'g', 'hh' => 'h', 'k' => 'G', 'kk' => 'G', 'hmm' => 'gi', 'hmmss' => 'gis', 'Hmm' => 'Gi', 'Hmmss' => 'Gis', 'm' => 'i', 'mm' => 'i', 'a' => 'a', 'A' => 'a', 's' => 's', 'ss' => 's', 'S' => '*', 'SS' => '*', 'SSS' => '*', 'SSSS' => '*', 'SSSSS' => '*', 'SSSSSS' => 'u', 'SSSSSSS' => 'u*', 'SSSSSSSS' => 'u*', 'SSSSSSSSS' => 'u*', 'M' => 'm', 'MM' => 'm', 'MMM' => 'M', 'MMMM' => 'M', 'Mo' => 'm', 'Q' => '!', 'Qo' => '!', 'G' => '!', 'GG' => '!', 'GGG' => '!', 'GGGG' => '!', 'GGGGG' => '!', 'g' => '!', 'gg' => '!', 'ggg' => '!', 'gggg' => '!', 'ggggg' => '!', 'W' => '!', 'WW' => '!', 'Wo' => '!', 'w' => '!', 'ww' => '!', 'wo' => '!', 'x' => 'U???', 'X' => 'U', 'Y' => 'Y', 'YY' => 'y', 'YYYY' => 'Y', 'YYYYY' => 'Y', 'YYYYYY' => 'Y', 'z' => 'e', 'zz' => 'e', 'Z' => 'e', 'ZZ' => 'e']; - } - $format = $replacements[$code] ?? '?'; - if ($format === '!') { - throw new InvalidFormatException("Format {$code} not supported for creation."); - } - return $format; - }, $format); - return static::rawCreateFromFormat($format, $time, $tz); - } - /** - * Create a Carbon instance from a specific format and a string in a given language. - * - * @param string $format Datetime format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function createFromLocaleFormat($format, $locale, $time, $tz = null) - { - $format = \preg_replace_callback('/(?:\\\\[a-zA-Z]|[bfkqCEJKQRV]){2,}/', static function (array $match) use($locale) : string { - $word = \str_replace('\\', '', $match[0]); - $translatedWord = static::translateTimeString($word, $locale, 'en'); - return $word === $translatedWord ? $match[0] : \preg_replace('/[a-zA-Z]/', '\\\\$0', $translatedWord); - }, $format); - return static::rawCreateFromFormat($format, static::translateTimeString($time, $locale, 'en'), $tz); - } - /** - * Create a Carbon instance from a specific ISO format and a string in a given language. - * - * @param string $format Datetime ISO format - * @param string $locale - * @param string $time - * @param DateTimeZone|string|false|null $tz - * - * @throws InvalidFormatException - * - * @return static|false - */ - public static function createFromLocaleIsoFormat($format, $locale, $time, $tz = null) - { - $time = static::translateTimeString($time, $locale, 'en', CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS | CarbonInterface::TRANSLATE_MERIDIEM); - return static::createFromIsoFormat($format, $time, $tz, $locale); - } - /** - * Make a Carbon instance from given variable if possible. - * - * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals - * and recurrences). Throw an exception for invalid format, but otherwise return null. - * - * @param mixed $var - * - * @throws InvalidFormatException - * - * @return static|null - */ - public static function make($var) - { - if ($var instanceof DateTimeInterface) { - return static::instance($var); - } - $date = null; - if (\is_string($var)) { - $var = \trim($var); - if (!\preg_match('/^P[\\dT]/', $var) && !\preg_match('/^R\\d/', $var) && \preg_match('/[a-z\\d]/i', $var)) { - $date = static::parse($var); - } - } - return $date; - } - /** - * Set last errors. - * - * @param array|bool $lastErrors - * - * @return void - */ - private static function setLastErrors($lastErrors) - { - if (\is_array($lastErrors) || $lastErrors === \false) { - static::$lastErrors = \is_array($lastErrors) ? $lastErrors : ['warning_count' => 0, 'warnings' => [], 'error_count' => 0, 'errors' => []]; - } - } - /** - * {@inheritdoc} - * - * @return array - */ - #[ReturnTypeWillChange] - public static function getLastErrors() - { - return static::$lastErrors; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Date.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Date.php deleted file mode 100644 index 8a4b362..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Date.php +++ /dev/null @@ -1,2279 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use BadMethodCallException; -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonPeriod; -use WP_Ultimo\Dependencies\Carbon\CarbonTimeZone; -use WP_Ultimo\Dependencies\Carbon\Exceptions\BadComparisonUnitException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\ImmutableException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidTimeZoneException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidTypeException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownGetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownMethodException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownSetterException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownUnitException; -use Closure; -use DateInterval; -use DatePeriod; -use DateTime; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use InvalidArgumentException; -use ReflectionException; -use ReturnTypeWillChange; -use Throwable; -/** - * A simple API extension for DateTime. - * - * @mixin DeprecatedProperties - * - * - * - * @property int $year - * @property int $yearIso - * @property int $month - * @property int $day - * @property int $hour - * @property int $minute - * @property int $second - * @property int $micro - * @property int $microsecond - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English - * @property int $milliseconds - * @property int $millisecond - * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $dayOfYear 1 through 366 - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property-read int $daysInMonth number of days in the given month - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $weeksInYear 51 through 53 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekOfMonth 1 through 5 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $daysInYear 365 or 366 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method CarbonInterface years(int $value) Set current instance year to the given value. - * @method CarbonInterface year(int $value) Set current instance year to the given value. - * @method CarbonInterface setYears(int $value) Set current instance year to the given value. - * @method CarbonInterface setYear(int $value) Set current instance year to the given value. - * @method CarbonInterface months(int $value) Set current instance month to the given value. - * @method CarbonInterface month(int $value) Set current instance month to the given value. - * @method CarbonInterface setMonths(int $value) Set current instance month to the given value. - * @method CarbonInterface setMonth(int $value) Set current instance month to the given value. - * @method CarbonInterface days(int $value) Set current instance day to the given value. - * @method CarbonInterface day(int $value) Set current instance day to the given value. - * @method CarbonInterface setDays(int $value) Set current instance day to the given value. - * @method CarbonInterface setDay(int $value) Set current instance day to the given value. - * @method CarbonInterface hours(int $value) Set current instance hour to the given value. - * @method CarbonInterface hour(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. - * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface minute(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. - * @method CarbonInterface seconds(int $value) Set current instance second to the given value. - * @method CarbonInterface second(int $value) Set current instance second to the given value. - * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. - * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. - * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addYear() Add one year to the instance (using date interval). - * @method CarbonInterface subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subYear() Sub one year to the instance (using date interval). - * @method CarbonInterface addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMonth() Add one month to the instance (using date interval). - * @method CarbonInterface subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). - * @method CarbonInterface addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDay() Add one day to the instance (using date interval). - * @method CarbonInterface subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDay() Sub one day to the instance (using date interval). - * @method CarbonInterface addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addHour() Add one hour to the instance (using date interval). - * @method CarbonInterface subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). - * @method CarbonInterface addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). - * @method CarbonInterface subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). - * @method CarbonInterface addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addSecond() Add one second to the instance (using date interval). - * @method CarbonInterface subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). - * @method CarbonInterface addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonInterface subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonInterface addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addCentury() Add one century to the instance (using date interval). - * @method CarbonInterface subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). - * @method CarbonInterface addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). - * @method CarbonInterface subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). - * @method CarbonInterface addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonInterface subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonInterface addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeek() Add one week to the instance (using date interval). - * @method CarbonInterface subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). - * @method CarbonInterface addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonInterface subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonInterface addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method CarbonInterface addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method CarbonInterface addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method CarbonInterface addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method CarbonInterface addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealSecond() Add one second to the instance (using timestamp). - * @method CarbonInterface subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method CarbonInterface addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMinute() Add one minute to the instance (using timestamp). - * @method CarbonInterface subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method CarbonInterface addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealHour() Add one hour to the instance (using timestamp). - * @method CarbonInterface subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method CarbonInterface addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealDay() Add one day to the instance (using timestamp). - * @method CarbonInterface subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method CarbonInterface addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealWeek() Add one week to the instance (using timestamp). - * @method CarbonInterface subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method CarbonInterface addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMonth() Add one month to the instance (using timestamp). - * @method CarbonInterface subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method CarbonInterface addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonInterface subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method CarbonInterface addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealYear() Add one year to the instance (using timestamp). - * @method CarbonInterface subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method CarbonInterface addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealDecade() Add one decade to the instance (using timestamp). - * @method CarbonInterface subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method CarbonInterface addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealCentury() Add one century to the instance (using timestamp). - * @method CarbonInterface subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method CarbonInterface addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addRealMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonInterface subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subRealMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * - * - */ -trait Date -{ - use Boundaries; - use Comparison; - use Converter; - use Creator; - use Difference; - use Macro; - use MagicParameter; - use Modifiers; - use Mutability; - use ObjectInitialisation; - use Options; - use Rounding; - use Serialization; - use Test; - use Timestamp; - use Units; - use Week; - /** - * Names of days of the week. - * - * @var array - */ - protected static $days = [ - // @call isDayOfWeek - CarbonInterface::SUNDAY => 'Sunday', - // @call isDayOfWeek - CarbonInterface::MONDAY => 'Monday', - // @call isDayOfWeek - CarbonInterface::TUESDAY => 'Tuesday', - // @call isDayOfWeek - CarbonInterface::WEDNESDAY => 'Wednesday', - // @call isDayOfWeek - CarbonInterface::THURSDAY => 'Thursday', - // @call isDayOfWeek - CarbonInterface::FRIDAY => 'Friday', - // @call isDayOfWeek - CarbonInterface::SATURDAY => 'Saturday', - ]; - /** - * Will UTF8 encoding be used to print localized date/time ? - * - * @var bool - */ - protected static $utf8 = \false; - /** - * List of unit and magic methods associated as doc-comments. - * - * @var array - */ - protected static $units = [ - // @call setUnit - // @call addUnit - 'year', - // @call setUnit - // @call addUnit - 'month', - // @call setUnit - // @call addUnit - 'day', - // @call setUnit - // @call addUnit - 'hour', - // @call setUnit - // @call addUnit - 'minute', - // @call setUnit - // @call addUnit - 'second', - // @call setUnit - // @call addUnit - 'milli', - // @call setUnit - // @call addUnit - 'millisecond', - // @call setUnit - // @call addUnit - 'micro', - // @call setUnit - // @call addUnit - 'microsecond', - ]; - /** - * Creates a DateTimeZone from a string, DateTimeZone or integer offset. - * - * @param DateTimeZone|string|int|null $object original value to get CarbonTimeZone from it. - * @param DateTimeZone|string|int|null $objectDump dump of the object for error messages. - * - * @throws InvalidTimeZoneException - * - * @return CarbonTimeZone|false - */ - protected static function safeCreateDateTimeZone($object, $objectDump = null) - { - return CarbonTimeZone::instance($object, $objectDump); - } - /** - * Get the TimeZone associated with the Carbon instance (as CarbonTimeZone). - * - * @return CarbonTimeZone - * - * @link https://php.net/manual/en/datetime.gettimezone.php - */ - #[ReturnTypeWillChange] - public function getTimezone() - { - return CarbonTimeZone::instance(parent::getTimezone()); - } - /** - * List of minimum and maximums for each unit. - * - * @param int $daysInMonth - * - * @return array - */ - protected static function getRangesByUnit(int $daysInMonth = 31) : array - { - return [ - // @call roundUnit - 'year' => [1, 9999], - // @call roundUnit - 'month' => [1, static::MONTHS_PER_YEAR], - // @call roundUnit - 'day' => [1, $daysInMonth], - // @call roundUnit - 'hour' => [0, static::HOURS_PER_DAY - 1], - // @call roundUnit - 'minute' => [0, static::MINUTES_PER_HOUR - 1], - // @call roundUnit - 'second' => [0, static::SECONDS_PER_MINUTE - 1], - ]; - } - /** - * Get a copy of the instance. - * - * @return static - */ - public function copy() - { - return clone $this; - } - /** - * @alias copy - * - * Get a copy of the instance. - * - * @return static - */ - public function clone() - { - return clone $this; - } - /** - * Clone the current instance if it's mutable. - * - * This method is convenient to ensure you don't mutate the initial object - * but avoid to make a useless copy of it if it's already immutable. - * - * @return static - */ - public function avoidMutation() : self - { - if ($this instanceof DateTimeImmutable) { - return $this; - } - return clone $this; - } - /** - * Returns a present instance in the same timezone. - * - * @return static - */ - public function nowWithSameTz() - { - return static::now($this->getTimezone()); - } - /** - * Throws an exception if the given object is not a DateTime and does not implement DateTimeInterface. - * - * @param mixed $date - * @param string|array $other - * - * @throws InvalidTypeException - */ - protected static function expectDateTime($date, $other = []) - { - $message = 'Expected '; - foreach ((array) $other as $expect) { - $message .= "{$expect}, "; - } - if (!$date instanceof DateTime && !$date instanceof DateTimeInterface) { - throw new InvalidTypeException($message . 'DateTime or DateTimeInterface, ' . (\is_object($date) ? \get_class($date) : \gettype($date)) . ' given'); - } - } - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param Carbon|DateTimeInterface|string|null $date - * - * @return static - */ - protected function resolveCarbon($date = null) - { - if (!$date) { - return $this->nowWithSameTz(); - } - if (\is_string($date)) { - return static::parse($date, $this->getTimezone()); - } - static::expectDateTime($date, ['null', 'string']); - return $date instanceof self ? $date : static::instance($date); - } - /** - * Return the Carbon instance passed through, a now instance in UTC - * if null given or parse the input if string given (using current timezone - * then switching to UTC). - * - * @param Carbon|DateTimeInterface|string|null $date - * - * @return static - */ - protected function resolveUTC($date = null) : self - { - if (!$date) { - return static::now('UTC'); - } - if (\is_string($date)) { - return static::parse($date, $this->getTimezone())->utc(); - } - static::expectDateTime($date, ['null', 'string']); - return $date instanceof self ? $date : static::instance($date)->utc(); - } - /** - * Return the Carbon instance passed through, a now instance in the same timezone - * if null given or parse the input if string given. - * - * @param Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|DateTimeInterface|string|null $date - * - * @return static - */ - public function carbonize($date = null) - { - if ($date instanceof DateInterval) { - return $this->avoidMutation()->add($date); - } - if ($date instanceof DatePeriod || $date instanceof CarbonPeriod) { - $date = $date->getStartDate(); - } - return $this->resolveCarbon($date); - } - /////////////////////////////////////////////////////////////////// - ///////////////////////// GETTERS AND SETTERS ///////////////////// - /////////////////////////////////////////////////////////////////// - /** - * Get a part of the Carbon object - * - * @param string $name - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone|null - */ - public function __get($name) - { - return $this->get($name); - } - /** - * Get a part of the Carbon object - * - * @param string $name - * - * @throws UnknownGetterException - * - * @return string|int|bool|DateTimeZone|null - */ - public function get($name) - { - static $formats = [ - // @property int - 'year' => 'Y', - // @property int - 'yearIso' => 'o', - // @property int - // @call isSameUnit - 'month' => 'n', - // @property int - 'day' => 'j', - // @property int - 'hour' => 'G', - // @property int - 'minute' => 'i', - // @property int - 'second' => 's', - // @property int - 'micro' => 'u', - // @property int - 'microsecond' => 'u', - // @property-read int 0 (for Sunday) through 6 (for Saturday) - 'dayOfWeek' => 'w', - // @property-read int 1 (for Monday) through 7 (for Sunday) - 'dayOfWeekIso' => 'N', - // @property-read int ISO-8601 week number of year, weeks starting on Monday - 'weekOfYear' => 'W', - // @property-read int number of days in the given month - 'daysInMonth' => 't', - // @property int|float|string seconds since the Unix Epoch - 'timestamp' => 'U', - // @property-read string "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - 'latinMeridiem' => 'a', - // @property-read string "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - 'latinUpperMeridiem' => 'A', - // @property string the day of week in English - 'englishDayOfWeek' => 'l', - // @property string the abbreviated day of week in English - 'shortEnglishDayOfWeek' => 'D', - // @property string the month in English - 'englishMonth' => 'F', - // @property string the abbreviated month in English - 'shortEnglishMonth' => 'M', - // @property string the day of week in current locale LC_TIME - // @deprecated - // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. - // replacement: Use ->isoFormat('MMM') instead. - // since: 2.55.0 - 'localeDayOfWeek' => '%A', - // @property string the abbreviated day of week in current locale LC_TIME - // @deprecated - // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. - // replacement: Use ->isoFormat('dddd') instead. - // since: 2.55.0 - 'shortLocaleDayOfWeek' => '%a', - // @property string the month in current locale LC_TIME - // @deprecated - // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. - // replacement: Use ->isoFormat('ddd') instead. - // since: 2.55.0 - 'localeMonth' => '%B', - // @property string the abbreviated month in current locale LC_TIME - // @deprecated - // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. - // replacement: Use ->isoFormat('MMMM') instead. - // since: 2.55.0 - 'shortLocaleMonth' => '%b', - // @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - 'timezoneAbbreviatedName' => 'T', - // @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - 'tzAbbrName' => 'T', - ]; - switch (\true) { - case isset($formats[$name]): - $format = $formats[$name]; - $method = \str_starts_with($format, '%') ? 'formatLocalized' : 'rawFormat'; - $value = $this->{$method}($format); - return \is_numeric($value) ? (int) $value : $value; - // @property-read string long name of weekday translated according to Carbon locale, in english if no translation available for current language - case $name === 'dayName': - return $this->getTranslatedDayName(); - // @property-read string short name of weekday translated according to Carbon locale, in english if no translation available for current language - case $name === 'shortDayName': - return $this->getTranslatedShortDayName(); - // @property-read string very short name of weekday translated according to Carbon locale, in english if no translation available for current language - case $name === 'minDayName': - return $this->getTranslatedMinDayName(); - // @property-read string long name of month translated according to Carbon locale, in english if no translation available for current language - case $name === 'monthName': - return $this->getTranslatedMonthName(); - // @property-read string short name of month translated according to Carbon locale, in english if no translation available for current language - case $name === 'shortMonthName': - return $this->getTranslatedShortMonthName(); - // @property-read string lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - case $name === 'meridiem': - return $this->meridiem(\true); - // @property-read string uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - case $name === 'upperMeridiem': - return $this->meridiem(); - // @property-read int current hour from 1 to 24 - case $name === 'noZeroHour': - return $this->hour ?: 24; - // @property int - case $name === 'milliseconds': - // @property int - case $name === 'millisecond': - // @property int - case $name === 'milli': - return (int) \floor((int) $this->rawFormat('u') / 1000); - // @property int 1 through 53 - case $name === 'week': - return (int) $this->week(); - // @property int 1 through 53 - case $name === 'isoWeek': - return (int) $this->isoWeek(); - // @property int year according to week format - case $name === 'weekYear': - return (int) $this->weekYear(); - // @property int year according to ISO week format - case $name === 'isoWeekYear': - return (int) $this->isoWeekYear(); - // @property-read int 51 through 53 - case $name === 'weeksInYear': - return $this->weeksInYear(); - // @property-read int 51 through 53 - case $name === 'isoWeeksInYear': - return $this->isoWeeksInYear(); - // @property-read int 1 through 5 - case $name === 'weekOfMonth': - return (int) \ceil($this->day / static::DAYS_PER_WEEK); - // @property-read int 1 through 5 - case $name === 'weekNumberInMonth': - return (int) \ceil(($this->day + $this->avoidMutation()->startOfMonth()->dayOfWeekIso - 1) / static::DAYS_PER_WEEK); - // @property-read int 0 through 6 - case $name === 'firstWeekDay': - return $this->localTranslator ? $this->getTranslationMessage('first_day_of_week') ?? 0 : static::getWeekStartsAt(); - // @property-read int 0 through 6 - case $name === 'lastWeekDay': - return $this->localTranslator ? (($this->getTranslationMessage('first_day_of_week') ?? 0) + static::DAYS_PER_WEEK - 1) % static::DAYS_PER_WEEK : static::getWeekEndsAt(); - // @property int 1 through 366 - case $name === 'dayOfYear': - return 1 + (int) $this->rawFormat('z'); - // @property-read int 365 or 366 - case $name === 'daysInYear': - return $this->isLeapYear() ? 366 : 365; - // @property int does a diffInYears() with default parameters - case $name === 'age': - return $this->diffInYears(); - // @property-read int the quarter of this instance, 1 - 4 - // @call isSameUnit - case $name === 'quarter': - return (int) \ceil($this->month / static::MONTHS_PER_QUARTER); - // @property-read int the decade of this instance - // @call isSameUnit - case $name === 'decade': - return (int) \ceil($this->year / static::YEARS_PER_DECADE); - // @property-read int the century of this instance - // @call isSameUnit - case $name === 'century': - $factor = 1; - $year = $this->year; - if ($year < 0) { - $year = -$year; - $factor = -1; - } - return (int) ($factor * \ceil($year / static::YEARS_PER_CENTURY)); - // @property-read int the millennium of this instance - // @call isSameUnit - case $name === 'millennium': - $factor = 1; - $year = $this->year; - if ($year < 0) { - $year = -$year; - $factor = -1; - } - return (int) ($factor * \ceil($year / static::YEARS_PER_MILLENNIUM)); - // @property int the timezone offset in seconds from UTC - case $name === 'offset': - return $this->getOffset(); - // @property int the timezone offset in minutes from UTC - case $name === 'offsetMinutes': - return $this->getOffset() / static::SECONDS_PER_MINUTE; - // @property int the timezone offset in hours from UTC - case $name === 'offsetHours': - return $this->getOffset() / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR; - // @property-read bool daylight savings time indicator, true if DST, false otherwise - case $name === 'dst': - return $this->rawFormat('I') === '1'; - // @property-read bool checks if the timezone is local, true if local, false otherwise - case $name === 'local': - return $this->getOffset() === $this->avoidMutation()->setTimezone(\date_default_timezone_get())->getOffset(); - // @property-read bool checks if the timezone is UTC, true if UTC, false otherwise - case $name === 'utc': - return $this->getOffset() === 0; - // @property CarbonTimeZone $timezone the current timezone - // @property CarbonTimeZone $tz alias of $timezone - case $name === 'timezone' || $name === 'tz': - return CarbonTimeZone::instance($this->getTimezone()); - // @property-read string $timezoneName the current timezone name - // @property-read string $tzName alias of $timezoneName - case $name === 'timezoneName' || $name === 'tzName': - return $this->getTimezone()->getName(); - // @property-read string locale of the current instance - case $name === 'locale': - return $this->getTranslatorLocale(); - default: - $macro = $this->getLocalMacro('get' . \ucfirst($name)); - if ($macro) { - return $this->executeCallableWithContext($macro); - } - throw new UnknownGetterException($name); - } - } - /** - * Check if an attribute exists on the object - * - * @param string $name - * - * @return bool - */ - public function __isset($name) - { - try { - $this->__get($name); - } catch (UnknownGetterException|ReflectionException $e) { - return \false; - } - return \true; - } - /** - * Set a part of the Carbon object - * - * @param string $name - * @param string|int|DateTimeZone $value - * - * @throws UnknownSetterException|ReflectionException - * - * @return void - */ - public function __set($name, $value) - { - if ($this->constructedObjectId === \spl_object_hash($this)) { - $this->set($name, $value); - return; - } - $this->{$name} = $value; - } - /** - * Set a part of the Carbon object - * - * @param string|array $name - * @param string|int|DateTimeZone $value - * - * @throws ImmutableException|UnknownSetterException - * - * @return $this - */ - public function set($name, $value = null) - { - if ($this->isImmutable()) { - throw new ImmutableException(\sprintf('%s class', static::class)); - } - if (\is_array($name)) { - foreach ($name as $key => $value) { - $this->set($key, $value); - } - return $this; - } - switch ($name) { - case 'milliseconds': - case 'millisecond': - case 'milli': - case 'microseconds': - case 'microsecond': - case 'micro': - if (\str_starts_with($name, 'milli')) { - $value *= 1000; - } - while ($value < 0) { - $this->subSecond(); - $value += static::MICROSECONDS_PER_SECOND; - } - while ($value >= static::MICROSECONDS_PER_SECOND) { - $this->addSecond(); - $value -= static::MICROSECONDS_PER_SECOND; - } - $this->modify($this->rawFormat('H:i:s.') . \str_pad((string) \round($value), 6, '0', \STR_PAD_LEFT)); - break; - case 'year': - case 'month': - case 'day': - case 'hour': - case 'minute': - case 'second': - [$year, $month, $day, $hour, $minute, $second] = \array_map('intval', \explode('-', $this->rawFormat('Y-n-j-G-i-s'))); - ${$name} = $value; - $this->setDateTime($year, $month, $day, $hour, $minute, $second); - break; - case 'week': - $this->week($value); - break; - case 'isoWeek': - $this->isoWeek($value); - break; - case 'weekYear': - $this->weekYear($value); - break; - case 'isoWeekYear': - $this->isoWeekYear($value); - break; - case 'dayOfYear': - $this->addDays($value - $this->dayOfYear); - break; - case 'timestamp': - $this->setTimestamp($value); - break; - case 'offset': - $this->setTimezone(static::safeCreateDateTimeZone($value / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR)); - break; - case 'offsetMinutes': - $this->setTimezone(static::safeCreateDateTimeZone($value / static::MINUTES_PER_HOUR)); - break; - case 'offsetHours': - $this->setTimezone(static::safeCreateDateTimeZone($value)); - break; - case 'timezone': - case 'tz': - $this->setTimezone($value); - break; - default: - $macro = $this->getLocalMacro('set' . \ucfirst($name)); - if ($macro) { - $this->executeCallableWithContext($macro, $value); - break; - } - if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { - throw new UnknownSetterException($name); - } - $this->{$name} = $value; - } - return $this; - } - protected function getTranslatedFormByRegExp($baseKey, $keySuffix, $context, $subKey, $defaultValue) - { - $key = $baseKey . $keySuffix; - $standaloneKey = "{$key}_standalone"; - $baseTranslation = $this->getTranslationMessage($key); - if ($baseTranslation instanceof Closure) { - return $baseTranslation($this, $context, $subKey) ?: $defaultValue; - } - if ($this->getTranslationMessage("{$standaloneKey}.{$subKey}") && (!$context || ($regExp = $this->getTranslationMessage("{$baseKey}_regexp")) && !\preg_match($regExp, $context))) { - $key = $standaloneKey; - } - return $this->getTranslationMessage("{$key}.{$subKey}", null, $defaultValue); - } - /** - * Get the translation of the current week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "", "_short" or "_min" - * @param string|null $defaultValue default value if translation missing - * - * @return string - */ - public function getTranslatedDayName($context = null, $keySuffix = '', $defaultValue = null) - { - return $this->getTranslatedFormByRegExp('weekdays', $keySuffix, $context, $this->dayOfWeek, $defaultValue ?: $this->englishDayOfWeek); - } - /** - * Get the translation of the current short week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * - * @return string - */ - public function getTranslatedShortDayName($context = null) - { - return $this->getTranslatedDayName($context, '_short', $this->shortEnglishDayOfWeek); - } - /** - * Get the translation of the current abbreviated week day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * - * @return string - */ - public function getTranslatedMinDayName($context = null) - { - return $this->getTranslatedDayName($context, '_min', $this->shortEnglishDayOfWeek); - } - /** - * Get the translation of the current month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * @param string $keySuffix "" or "_short" - * @param string|null $defaultValue default value if translation missing - * - * @return string - */ - public function getTranslatedMonthName($context = null, $keySuffix = '', $defaultValue = null) - { - return $this->getTranslatedFormByRegExp('months', $keySuffix, $context, $this->month - 1, $defaultValue ?: $this->englishMonth); - } - /** - * Get the translation of the current short month day name (with context for languages with multiple forms). - * - * @param string|null $context whole format string - * - * @return string - */ - public function getTranslatedShortMonthName($context = null) - { - return $this->getTranslatedMonthName($context, '_short', $this->shortEnglishMonth); - } - /** - * Get/set the day of year. - * - * @param int|null $value new value for day of year if using as setter. - * - * @return static|int - */ - public function dayOfYear($value = null) - { - $dayOfYear = $this->dayOfYear; - return $value === null ? $dayOfYear : $this->addDays($value - $dayOfYear); - } - /** - * Get/set the weekday from 0 (Sunday) to 6 (Saturday). - * - * @param int|null $value new value for weekday if using as setter. - * - * @return static|int - */ - public function weekday($value = null) - { - if ($value === null) { - return $this->dayOfWeek; - } - $firstDay = (int) ($this->getTranslationMessage('first_day_of_week') ?? 0); - $dayOfWeek = ($this->dayOfWeek + 7 - $firstDay) % 7; - return $this->addDays(($value + 7 - $firstDay) % 7 - $dayOfWeek); - } - /** - * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). - * - * @param int|null $value new value for weekday if using as setter. - * - * @return static|int - */ - public function isoWeekday($value = null) - { - $dayOfWeekIso = $this->dayOfWeekIso; - return $value === null ? $dayOfWeekIso : $this->addDays($value - $dayOfWeekIso); - } - /** - * Return the number of days since the start of the week (using the current locale or the first parameter - * if explicitly given). - * - * @param int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - * - * @return int - */ - public function getDaysFromStartOfWeek(int $weekStartsAt = null) : int - { - $firstDay = (int) ($weekStartsAt ?? $this->getTranslationMessage('first_day_of_week') ?? 0); - return ($this->dayOfWeek + 7 - $firstDay) % 7; - } - /** - * Set the day (keeping the current time) to the start of the week + the number of days passed as the first - * parameter. First day of week is driven by the locale unless explicitly set with the second parameter. - * - * @param int $numberOfDays number of days to add after the start of the current week - * @param int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, - * if not provided, start of week is inferred from the locale - * (Sunday for en_US, Monday for de_DE, etc.) - * - * @return static - */ - public function setDaysFromStartOfWeek(int $numberOfDays, int $weekStartsAt = null) - { - return $this->addDays($numberOfDays - $this->getDaysFromStartOfWeek($weekStartsAt)); - } - /** - * Set any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value new value for the input unit - * @param string $overflowUnit unit name to not overflow - * - * @return static - */ - public function setUnitNoOverflow($valueUnit, $value, $overflowUnit) - { - try { - $original = $this->avoidMutation(); - /** @var static $date */ - $date = $this->{$valueUnit}($value); - $end = $original->avoidMutation()->endOf($overflowUnit); - $start = $original->avoidMutation()->startOf($overflowUnit); - if ($date < $start) { - $date = $date->setDateTimeFrom($start); - } elseif ($date > $end) { - $date = $date->setDateTimeFrom($end); - } - return $date; - } catch (BadMethodCallException|ReflectionException $exception) { - throw new UnknownUnitException($valueUnit, 0, $exception); - } - } - /** - * Add any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to add to the input unit - * @param string $overflowUnit unit name to not overflow - * - * @return static - */ - public function addUnitNoOverflow($valueUnit, $value, $overflowUnit) - { - return $this->setUnitNoOverflow($valueUnit, $this->{$valueUnit} + $value, $overflowUnit); - } - /** - * Subtract any unit to a new value without overflowing current other unit given. - * - * @param string $valueUnit unit name to modify - * @param int $value amount to subtract to the input unit - * @param string $overflowUnit unit name to not overflow - * - * @return static - */ - public function subUnitNoOverflow($valueUnit, $value, $overflowUnit) - { - return $this->setUnitNoOverflow($valueUnit, $this->{$valueUnit} - $value, $overflowUnit); - } - /** - * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. - * - * @param int|null $minuteOffset - * - * @return int|static - */ - public function utcOffset(int $minuteOffset = null) - { - if (\func_num_args() < 1) { - return $this->offsetMinutes; - } - return $this->setTimezone(CarbonTimeZone::createFromMinuteOffset($minuteOffset)); - } - /** - * Set the date with gregorian year, month and day numbers. - * - * @see https://php.net/manual/en/datetime.setdate.php - * - * @param int $year - * @param int $month - * @param int $day - * - * @return static - */ - #[ReturnTypeWillChange] - public function setDate($year, $month, $day) - { - return parent::setDate((int) $year, (int) $month, (int) $day); - } - /** - * Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates. - * - * @see https://php.net/manual/en/datetime.setisodate.php - * - * @param int $year - * @param int $week - * @param int $day - * - * @return static - */ - #[ReturnTypeWillChange] - public function setISODate($year, $week, $day = 1) - { - return parent::setISODate((int) $year, (int) $week, (int) $day); - } - /** - * Set the date and time all together. - * - * @param int $year - * @param int $month - * @param int $day - * @param int $hour - * @param int $minute - * @param int $second - * @param int $microseconds - * - * @return static - */ - public function setDateTime($year, $month, $day, $hour, $minute, $second = 0, $microseconds = 0) - { - return $this->setDate($year, $month, $day)->setTime((int) $hour, (int) $minute, (int) $second, (int) $microseconds); - } - /** - * Resets the current time of the DateTime object to a different time. - * - * @see https://php.net/manual/en/datetime.settime.php - * - * @param int $hour - * @param int $minute - * @param int $second - * @param int $microseconds - * - * @return static - */ - #[ReturnTypeWillChange] - public function setTime($hour, $minute, $second = 0, $microseconds = 0) - { - return parent::setTime((int) $hour, (int) $minute, (int) $second, (int) $microseconds); - } - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $unixTimestamp - * - * @return static - */ - #[ReturnTypeWillChange] - public function setTimestamp($unixTimestamp) - { - [$timestamp, $microseconds] = self::getIntegerAndDecimalParts($unixTimestamp); - return parent::setTimestamp((int) $timestamp)->setMicroseconds((int) $microseconds); - } - /** - * Set the time by time string. - * - * @param string $time - * - * @return static - */ - public function setTimeFromTimeString($time) - { - if (!\str_contains($time, ':')) { - $time .= ':0'; - } - return $this->modify($time); - } - /** - * @alias setTimezone - * - * @param DateTimeZone|string $value - * - * @return static - */ - public function timezone($value) - { - return $this->setTimezone($value); - } - /** - * Set the timezone or returns the timezone name if no arguments passed. - * - * @param DateTimeZone|string $value - * - * @return static|string - */ - public function tz($value = null) - { - if (\func_num_args() < 1) { - return $this->tzName; - } - return $this->setTimezone($value); - } - /** - * Set the instance's timezone from a string or object. - * - * @param DateTimeZone|string $value - * - * @return static - */ - #[ReturnTypeWillChange] - public function setTimezone($value) - { - $tz = static::safeCreateDateTimeZone($value); - if ($tz === \false && !self::isStrictModeEnabled()) { - $tz = new CarbonTimeZone(); - } - return parent::setTimezone($tz); - } - /** - * Set the instance's timezone from a string or object and add/subtract the offset difference. - * - * @param DateTimeZone|string $value - * - * @return static - */ - public function shiftTimezone($value) - { - $dateTimeString = $this->format('Y-m-d H:i:s.u'); - return $this->setTimezone($value)->modify($dateTimeString); - } - /** - * Set the instance's timezone to UTC. - * - * @return static - */ - public function utc() - { - return $this->setTimezone('UTC'); - } - /** - * Set the year, month, and date for this instance to that of the passed instance. - * - * @param Carbon|DateTimeInterface $date now if null - * - * @return static - */ - public function setDateFrom($date = null) - { - $date = $this->resolveCarbon($date); - return $this->setDate($date->year, $date->month, $date->day); - } - /** - * Set the hour, minute, second and microseconds for this instance to that of the passed instance. - * - * @param Carbon|DateTimeInterface $date now if null - * - * @return static - */ - public function setTimeFrom($date = null) - { - $date = $this->resolveCarbon($date); - return $this->setTime($date->hour, $date->minute, $date->second, $date->microsecond); - } - /** - * Set the date and time for this instance to that of the passed instance. - * - * @param Carbon|DateTimeInterface $date - * - * @return static - */ - public function setDateTimeFrom($date = null) - { - $date = $this->resolveCarbon($date); - return $this->modify($date->rawFormat('Y-m-d H:i:s.u')); - } - /** - * Get the days of the week - * - * @return array - */ - public static function getDays() - { - return static::$days; - } - /////////////////////////////////////////////////////////////////// - /////////////////////// WEEK SPECIAL DAYS ///////////////////////// - /////////////////////////////////////////////////////////////////// - private static function getFirstDayOfWeek() : int - { - return (int) static::getTranslationMessageWith(static::getTranslator(), 'first_day_of_week'); - } - /** - * Get the first day of week - * - * @return int - */ - public static function getWeekStartsAt() - { - if (static::$weekStartsAt === static::WEEK_DAY_AUTO) { - return self::getFirstDayOfWeek(); - } - return static::$weekStartsAt; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the - * 'first_day_of_week' locale setting to change the start of week according to current locale - * selected and implicitly the end of week. - * - * Set the first day of week - * - * @param int|string $day week start day (or 'auto' to get the first day of week from Carbon::getLocale() culture). - * - * @return void - */ - public static function setWeekStartsAt($day) - { - static::$weekStartsAt = $day === static::WEEK_DAY_AUTO ? $day : \max(0, (7 + $day) % 7); - } - /** - * Get the last day of week - * - * @return int - */ - public static function getWeekEndsAt() - { - if (static::$weekStartsAt === static::WEEK_DAY_AUTO) { - return (int) (static::DAYS_PER_WEEK - 1 + self::getFirstDayOfWeek()) % static::DAYS_PER_WEEK; - } - return static::$weekEndsAt; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek - * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the - * start of week according to current locale selected and implicitly the end of week. - * - * Set the last day of week - * - * @param int|string $day week end day (or 'auto' to get the day before the first day of week - * from Carbon::getLocale() culture). - * - * @return void - */ - public static function setWeekEndsAt($day) - { - static::$weekEndsAt = $day === static::WEEK_DAY_AUTO ? $day : \max(0, (7 + $day) % 7); - } - /** - * Get weekend days - * - * @return array - */ - public static function getWeekendDays() - { - return static::$weekendDays; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider week-end is always saturday and sunday, and if you have some custom - * week-end days to handle, give to those days an other name and create a macro for them: - * - * ``` - * Carbon::macro('isDayOff', function ($date) { - * return $date->isSunday() || $date->isMonday(); - * }); - * Carbon::macro('isNotDayOff', function ($date) { - * return !$date->isDayOff(); - * }); - * if ($someDate->isDayOff()) ... - * if ($someDate->isNotDayOff()) ... - * // Add 5 not-off days - * $count = 5; - * while ($someDate->isDayOff() || ($count-- > 0)) { - * $someDate->addDay(); - * } - * ``` - * - * Set weekend days - * - * @param array $days - * - * @return void - */ - public static function setWeekendDays($days) - { - static::$weekendDays = $days; - } - /** - * Determine if a time string will produce a relative date. - * - * @param string $time - * - * @return bool true if time match a relative date, false if absolute or invalid time string - */ - public static function hasRelativeKeywords($time) - { - if (!$time || \strtotime($time) === \false) { - return \false; - } - $date1 = new DateTime('2000-01-01T00:00:00Z'); - $date1->modify($time); - $date2 = new DateTime('2001-12-25T00:00:00Z'); - $date2->modify($time); - return $date1 != $date2; - } - /////////////////////////////////////////////////////////////////// - /////////////////////// STRING FORMATTING ///////////////////////// - /////////////////////////////////////////////////////////////////// - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use UTF-8 language packages on every machine. - * - * Set if UTF8 will be used for localized date/time. - * - * @param bool $utf8 - */ - public static function setUtf8($utf8) - { - static::$utf8 = $utf8; - } - /** - * Format the instance with the current locale. You can set the current - * locale using setlocale() https://php.net/setlocale. - * - * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. - * Use ->isoFormat() instead. - * Deprecated since 2.55.0 - * - * @param string $format - * - * @return string - */ - public function formatLocalized($format) - { - // Check for Windows to find and replace the %e modifier correctly. - if (\strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN') { - $format = \preg_replace('#(?toDateTimeString()); - $formatted = $this->localStrictModeEnabled ?? static::isStrictModeEnabled() ? \strftime($format, $time) : @\strftime($format, $time); - return static::$utf8 ? \function_exists('mb_convert_encoding') ? \mb_convert_encoding($formatted, 'UTF-8', \mb_list_encodings()) : \utf8_encode($formatted) : $formatted; - } - /** - * Returns list of locale formats for ISO formatting. - * - * @param string|null $locale current locale used if null - * - * @return array - */ - public function getIsoFormats($locale = null) - { - return ['LT' => $this->getTranslationMessage('formats.LT', $locale, 'h:mm A'), 'LTS' => $this->getTranslationMessage('formats.LTS', $locale, 'h:mm:ss A'), 'L' => $this->getTranslationMessage('formats.L', $locale, 'MM/DD/YYYY'), 'LL' => $this->getTranslationMessage('formats.LL', $locale, 'MMMM D, YYYY'), 'LLL' => $this->getTranslationMessage('formats.LLL', $locale, 'MMMM D, YYYY h:mm A'), 'LLLL' => $this->getTranslationMessage('formats.LLLL', $locale, 'dddd, MMMM D, YYYY h:mm A'), 'l' => $this->getTranslationMessage('formats.l', $locale), 'll' => $this->getTranslationMessage('formats.ll', $locale), 'lll' => $this->getTranslationMessage('formats.lll', $locale), 'llll' => $this->getTranslationMessage('formats.llll', $locale)]; - } - /** - * Returns list of calendar formats for ISO formatting. - * - * @param string|null $locale current locale used if null - * - * @return array - */ - public function getCalendarFormats($locale = null) - { - return ['sameDay' => $this->getTranslationMessage('calendar.sameDay', $locale, '[Today at] LT'), 'nextDay' => $this->getTranslationMessage('calendar.nextDay', $locale, '[Tomorrow at] LT'), 'nextWeek' => $this->getTranslationMessage('calendar.nextWeek', $locale, 'dddd [at] LT'), 'lastDay' => $this->getTranslationMessage('calendar.lastDay', $locale, '[Yesterday at] LT'), 'lastWeek' => $this->getTranslationMessage('calendar.lastWeek', $locale, '[Last] dddd [at] LT'), 'sameElse' => $this->getTranslationMessage('calendar.sameElse', $locale, 'L')]; - } - /** - * Returns list of locale units for ISO formatting. - * - * @return array - */ - public static function getIsoUnits() - { - static $units = null; - if ($units === null) { - $units = ['OD' => ['getAltNumber', ['day']], 'OM' => ['getAltNumber', ['month']], 'OY' => ['getAltNumber', ['year']], 'OH' => ['getAltNumber', ['hour']], 'Oh' => ['getAltNumber', ['h']], 'Om' => ['getAltNumber', ['minute']], 'Os' => ['getAltNumber', ['second']], 'D' => 'day', 'DD' => ['rawFormat', ['d']], 'Do' => ['ordinal', ['day', 'D']], 'd' => 'dayOfWeek', 'dd' => function (CarbonInterface $date, $originalFormat = null) { - return $date->getTranslatedMinDayName($originalFormat); - }, 'ddd' => function (CarbonInterface $date, $originalFormat = null) { - return $date->getTranslatedShortDayName($originalFormat); - }, 'dddd' => function (CarbonInterface $date, $originalFormat = null) { - return $date->getTranslatedDayName($originalFormat); - }, 'DDD' => 'dayOfYear', 'DDDD' => ['getPaddedUnit', ['dayOfYear', 3]], 'DDDo' => ['ordinal', ['dayOfYear', 'DDD']], 'e' => ['weekday', []], 'E' => 'dayOfWeekIso', 'H' => ['rawFormat', ['G']], 'HH' => ['rawFormat', ['H']], 'h' => ['rawFormat', ['g']], 'hh' => ['rawFormat', ['h']], 'k' => 'noZeroHour', 'kk' => ['getPaddedUnit', ['noZeroHour']], 'hmm' => ['rawFormat', ['gi']], 'hmmss' => ['rawFormat', ['gis']], 'Hmm' => ['rawFormat', ['Gi']], 'Hmmss' => ['rawFormat', ['Gis']], 'm' => 'minute', 'mm' => ['rawFormat', ['i']], 'a' => 'meridiem', 'A' => 'upperMeridiem', 's' => 'second', 'ss' => ['getPaddedUnit', ['second']], 'S' => function (CarbonInterface $date) { - return (string) \floor($date->micro / 100000); - }, 'SS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro / 10000), 2, '0', \STR_PAD_LEFT); - }, 'SSS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro / 1000), 3, '0', \STR_PAD_LEFT); - }, 'SSSS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro / 100), 4, '0', \STR_PAD_LEFT); - }, 'SSSSS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro / 10), 5, '0', \STR_PAD_LEFT); - }, 'SSSSSS' => ['getPaddedUnit', ['micro', 6]], 'SSSSSSS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro * 10), 7, '0', \STR_PAD_LEFT); - }, 'SSSSSSSS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro * 100), 8, '0', \STR_PAD_LEFT); - }, 'SSSSSSSSS' => function (CarbonInterface $date) { - return \str_pad((string) \floor($date->micro * 1000), 9, '0', \STR_PAD_LEFT); - }, 'M' => 'month', 'MM' => ['rawFormat', ['m']], 'MMM' => function (CarbonInterface $date, $originalFormat = null) { - $month = $date->getTranslatedShortMonthName($originalFormat); - $suffix = $date->getTranslationMessage('mmm_suffix'); - if ($suffix && $month !== $date->monthName) { - $month .= $suffix; - } - return $month; - }, 'MMMM' => function (CarbonInterface $date, $originalFormat = null) { - return $date->getTranslatedMonthName($originalFormat); - }, 'Mo' => ['ordinal', ['month', 'M']], 'Q' => 'quarter', 'Qo' => ['ordinal', ['quarter', 'M']], 'G' => 'isoWeekYear', 'GG' => ['getPaddedUnit', ['isoWeekYear']], 'GGG' => ['getPaddedUnit', ['isoWeekYear', 3]], 'GGGG' => ['getPaddedUnit', ['isoWeekYear', 4]], 'GGGGG' => ['getPaddedUnit', ['isoWeekYear', 5]], 'g' => 'weekYear', 'gg' => ['getPaddedUnit', ['weekYear']], 'ggg' => ['getPaddedUnit', ['weekYear', 3]], 'gggg' => ['getPaddedUnit', ['weekYear', 4]], 'ggggg' => ['getPaddedUnit', ['weekYear', 5]], 'W' => 'isoWeek', 'WW' => ['getPaddedUnit', ['isoWeek']], 'Wo' => ['ordinal', ['isoWeek', 'W']], 'w' => 'week', 'ww' => ['getPaddedUnit', ['week']], 'wo' => ['ordinal', ['week', 'w']], 'x' => ['valueOf', []], 'X' => 'timestamp', 'Y' => 'year', 'YY' => ['rawFormat', ['y']], 'YYYY' => ['getPaddedUnit', ['year', 4]], 'YYYYY' => ['getPaddedUnit', ['year', 5]], 'YYYYYY' => function (CarbonInterface $date) { - return ($date->year < 0 ? '' : '+') . $date->getPaddedUnit('year', 6); - }, 'z' => ['rawFormat', ['T']], 'zz' => 'tzName', 'Z' => ['getOffsetString', []], 'ZZ' => ['getOffsetString', ['']]]; - } - return $units; - } - /** - * Returns a unit of the instance padded with 0 by default or any other string if specified. - * - * @param string $unit Carbon unit name - * @param int $length Length of the output (2 by default) - * @param string $padString String to use for padding ("0" by default) - * @param int $padType Side(s) to pad (STR_PAD_LEFT by default) - * - * @return string - */ - public function getPaddedUnit($unit, $length = 2, $padString = '0', $padType = \STR_PAD_LEFT) - { - return ($this->{$unit} < 0 ? '-' : '') . \str_pad((string) \abs($this->{$unit}), $length, $padString, $padType); - } - /** - * Return a property with its ordinal. - * - * @param string $key - * @param string|null $period - * - * @return string - */ - public function ordinal(string $key, ?string $period = null) : string - { - $number = $this->{$key}; - $result = $this->translate('ordinal', [':number' => $number, ':period' => (string) $period]); - return (string) ($result === 'ordinal' ? $number : $result); - } - /** - * Return the meridiem of the current time in the current locale. - * - * @param bool $isLower if true, returns lowercase variant if available in the current locale. - * - * @return string - */ - public function meridiem(bool $isLower = \false) : string - { - $hour = $this->hour; - $index = $hour < 12 ? 0 : 1; - if ($isLower) { - $key = 'meridiem.' . ($index + 2); - $result = $this->translate($key); - if ($result !== $key) { - return $result; - } - } - $key = "meridiem.{$index}"; - $result = $this->translate($key); - if ($result === $key) { - $result = $this->translate('meridiem', [':hour' => $this->hour, ':minute' => $this->minute, ':isLower' => $isLower]); - if ($result === 'meridiem') { - return $isLower ? $this->latinMeridiem : $this->latinUpperMeridiem; - } - } elseif ($isLower) { - $result = \mb_strtolower($result); - } - return $result; - } - /** - * Returns the alternative number for a given date property if available in the current locale. - * - * @param string $key date property - * - * @return string - */ - public function getAltNumber(string $key) : string - { - return $this->translateNumber(\strlen($key) > 1 ? $this->{$key} : $this->rawFormat('h')); - } - /** - * Format in the current language using ISO replacement patterns. - * - * @param string $format - * @param string|null $originalFormat provide context if a chunk has been passed alone - * - * @return string - */ - public function isoFormat(string $format, ?string $originalFormat = null) : string - { - $result = ''; - $length = \mb_strlen($format); - $originalFormat = $originalFormat ?: $format; - $inEscaped = \false; - $formats = null; - $units = null; - for ($i = 0; $i < $length; $i++) { - $char = \mb_substr($format, $i, 1); - if ($char === '\\') { - $result .= \mb_substr($format, ++$i, 1); - continue; - } - if ($char === '[' && !$inEscaped) { - $inEscaped = \true; - continue; - } - if ($char === ']' && $inEscaped) { - $inEscaped = \false; - continue; - } - if ($inEscaped) { - $result .= $char; - continue; - } - $input = \mb_substr($format, $i); - if (\preg_match('/^(LTS|LT|l{1,4}|L{1,4})/', $input, $match)) { - if ($formats === null) { - $formats = $this->getIsoFormats(); - } - $code = $match[0]; - $sequence = $formats[$code] ?? \preg_replace_callback('/MMMM|MM|DD|dddd/', function ($code) { - return \mb_substr($code[0], 1); - }, $formats[\strtoupper($code)] ?? ''); - $rest = \mb_substr($format, $i + \mb_strlen($code)); - $format = \mb_substr($format, 0, $i) . $sequence . $rest; - $length = \mb_strlen($format); - $input = $sequence . $rest; - } - if (\preg_match('/^' . CarbonInterface::ISO_FORMAT_REGEXP . '/', $input, $match)) { - $code = $match[0]; - if ($units === null) { - $units = static::getIsoUnits(); - } - $sequence = $units[$code] ?? ''; - if ($sequence instanceof Closure) { - $sequence = $sequence($this, $originalFormat); - } elseif (\is_array($sequence)) { - try { - $sequence = $this->{$sequence[0]}(...$sequence[1]); - } catch (ReflectionException|InvalidArgumentException|BadMethodCallException $e) { - $sequence = ''; - } - } elseif (\is_string($sequence)) { - $sequence = $this->{$sequence} ?? $code; - } - $format = \mb_substr($format, 0, $i) . $sequence . \mb_substr($format, $i + \mb_strlen($code)); - $i += \mb_strlen((string) $sequence) - 1; - $length = \mb_strlen($format); - $char = $sequence; - } - $result .= $char; - } - return $result; - } - /** - * List of replacements from date() format to isoFormat(). - * - * @return array - */ - public static function getFormatsToIsoReplacements() - { - static $replacements = null; - if ($replacements === null) { - $replacements = ['d' => \true, 'D' => 'ddd', 'j' => \true, 'l' => 'dddd', 'N' => \true, 'S' => function ($date) { - $day = $date->rawFormat('j'); - return \str_replace((string) $day, '', $date->isoFormat('Do')); - }, 'w' => \true, 'z' => \true, 'W' => \true, 'F' => 'MMMM', 'm' => \true, 'M' => 'MMM', 'n' => \true, 't' => \true, 'L' => \true, 'o' => \true, 'Y' => \true, 'y' => \true, 'a' => 'a', 'A' => 'A', 'B' => \true, 'g' => \true, 'G' => \true, 'h' => \true, 'H' => \true, 'i' => \true, 's' => \true, 'u' => \true, 'v' => \true, 'E' => \true, 'I' => \true, 'O' => \true, 'P' => \true, 'Z' => \true, 'c' => \true, 'r' => \true, 'U' => \true, 'T' => \true]; - } - return $replacements; - } - /** - * Format as ->format() do (using date replacements patterns from https://php.net/manual/en/function.date.php) - * but translate words whenever possible (months, day names, etc.) using the current locale. - * - * @param string $format - * - * @return string - */ - public function translatedFormat(string $format) : string - { - $replacements = static::getFormatsToIsoReplacements(); - $context = ''; - $isoFormat = ''; - $length = \mb_strlen($format); - for ($i = 0; $i < $length; $i++) { - $char = \mb_substr($format, $i, 1); - if ($char === '\\') { - $replacement = \mb_substr($format, $i, 2); - $isoFormat .= $replacement; - $i++; - continue; - } - if (!isset($replacements[$char])) { - $replacement = \preg_match('/^[A-Za-z]$/', $char) ? "\\{$char}" : $char; - $isoFormat .= $replacement; - $context .= $replacement; - continue; - } - $replacement = $replacements[$char]; - if ($replacement === \true) { - static $contextReplacements = null; - if ($contextReplacements === null) { - $contextReplacements = ['m' => 'MM', 'd' => 'DD', 't' => 'D', 'j' => 'D', 'N' => 'e', 'w' => 'e', 'n' => 'M', 'o' => 'YYYY', 'Y' => 'YYYY', 'y' => 'YY', 'g' => 'h', 'G' => 'H', 'h' => 'hh', 'H' => 'HH', 'i' => 'mm', 's' => 'ss']; - } - $isoFormat .= '[' . $this->rawFormat($char) . ']'; - $context .= $contextReplacements[$char] ?? ' '; - continue; - } - if ($replacement instanceof Closure) { - $replacement = '[' . $replacement($this) . ']'; - $isoFormat .= $replacement; - $context .= $replacement; - continue; - } - $isoFormat .= $replacement; - $context .= $replacement; - } - return $this->isoFormat($isoFormat, $context); - } - /** - * Returns the offset hour and minute formatted with +/- and a given separator (":" by default). - * For example, if the time zone is 9 hours 30 minutes, you'll get "+09:30", with "@@" as first - * argument, "+09@@30", with "" as first argument, "+0930". Negative offset will return something - * like "-12:00". - * - * @param string $separator string to place between hours and minutes (":" by default) - * - * @return string - */ - public function getOffsetString($separator = ':') - { - $second = $this->getOffset(); - $symbol = $second < 0 ? '-' : '+'; - $minute = \abs($second) / static::SECONDS_PER_MINUTE; - $hour = \str_pad((string) \floor($minute / static::MINUTES_PER_HOUR), 2, '0', \STR_PAD_LEFT); - $minute = \str_pad((string) ((int) $minute % static::MINUTES_PER_HOUR), 2, '0', \STR_PAD_LEFT); - return "{$symbol}{$hour}{$separator}{$minute}"; - } - protected static function executeStaticCallable($macro, ...$parameters) - { - return static::bindMacroContext(null, function () use(&$macro, &$parameters) { - if ($macro instanceof Closure) { - $boundMacro = @Closure::bind($macro, null, static::class); - return ($boundMacro ?: $macro)(...$parameters); - } - return $macro(...$parameters); - }); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws BadMethodCallException - * - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - if (!static::hasMacro($method)) { - foreach (static::getGenericMacros() as $callback) { - try { - return static::executeStaticCallable($callback, $method, ...$parameters); - } catch (BadMethodCallException $exception) { - continue; - } - } - if (static::isStrictModeEnabled()) { - throw new UnknownMethodException(\sprintf('%s::%s', static::class, $method)); - } - return null; - } - return static::executeStaticCallable(static::$globalMacros[$method], ...$parameters); - } - /** - * Set specified unit to new given value. - * - * @param string $unit year, month, day, hour, minute, second or microsecond - * @param int $value new value for given unit - * - * @return static - */ - public function setUnit($unit, $value = null) - { - $unit = static::singularUnit($unit); - $dateUnits = ['year', 'month', 'day']; - if (\in_array($unit, $dateUnits)) { - return $this->setDate(...\array_map(function ($name) use($unit, $value) { - return (int) ($name === $unit ? $value : $this->{$name}); - }, $dateUnits)); - } - $units = ['hour', 'minute', 'second', 'micro']; - if ($unit === 'millisecond' || $unit === 'milli') { - $value *= 1000; - $unit = 'micro'; - } elseif ($unit === 'microsecond') { - $unit = 'micro'; - } - return $this->setTime(...\array_map(function ($name) use($unit, $value) { - return (int) ($name === $unit ? $value : $this->{$name}); - }, $units)); - } - /** - * Returns standardized singular of a given singular/plural unit name (in English). - * - * @param string $unit - * - * @return string - */ - public static function singularUnit(string $unit) : string - { - $unit = \rtrim(\mb_strtolower($unit), 's'); - if ($unit === 'centurie') { - return 'century'; - } - if ($unit === 'millennia') { - return 'millennium'; - } - return $unit; - } - /** - * Returns standardized plural of a given singular/plural unit name (in English). - * - * @param string $unit - * - * @return string - */ - public static function pluralUnit(string $unit) : string - { - $unit = \rtrim(\strtolower($unit), 's'); - if ($unit === 'century') { - return 'centuries'; - } - if ($unit === 'millennium' || $unit === 'millennia') { - return 'millennia'; - } - return "{$unit}s"; - } - protected function executeCallable($macro, ...$parameters) - { - if ($macro instanceof Closure) { - $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); - return ($boundMacro ?: $macro)(...$parameters); - } - return $macro(...$parameters); - } - protected function executeCallableWithContext($macro, ...$parameters) - { - return static::bindMacroContext($this, function () use(&$macro, &$parameters) { - return $this->executeCallable($macro, ...$parameters); - }); - } - protected static function getGenericMacros() - { - foreach (static::$globalGenericMacros as $list) { - foreach ($list as $macro) { - (yield $macro); - } - } - } - /** - * Dynamically handle calls to the class. - * - * @param string $method magic method name called - * @param array $parameters parameters list - * - * @throws UnknownMethodException|BadMethodCallException|ReflectionException|Throwable - * - * @return mixed - */ - public function __call($method, $parameters) - { - $diffSizes = [ - // @mode diffForHumans - 'short' => \true, - // @mode diffForHumans - 'long' => \false, - ]; - $diffSyntaxModes = [ - // @call diffForHumans - 'Absolute' => CarbonInterface::DIFF_ABSOLUTE, - // @call diffForHumans - 'Relative' => CarbonInterface::DIFF_RELATIVE_AUTO, - // @call diffForHumans - 'RelativeToNow' => CarbonInterface::DIFF_RELATIVE_TO_NOW, - // @call diffForHumans - 'RelativeToOther' => CarbonInterface::DIFF_RELATIVE_TO_OTHER, - ]; - $sizePattern = \implode('|', \array_keys($diffSizes)); - $syntaxPattern = \implode('|', \array_keys($diffSyntaxModes)); - if (\preg_match("/^(?{$sizePattern})(?{$syntaxPattern})DiffForHumans\$/", $method, $match)) { - $dates = \array_filter($parameters, function ($parameter) { - return $parameter instanceof DateTimeInterface; - }); - $other = null; - if (\count($dates)) { - $key = \key($dates); - $other = \current($dates); - \array_splice($parameters, $key, 1); - } - return $this->diffForHumans($other, $diffSyntaxModes[$match['syntax']], $diffSizes[$match['size']], ...$parameters); - } - $roundedValue = $this->callRoundMethod($method, $parameters); - if ($roundedValue !== null) { - return $roundedValue; - } - $unit = \rtrim($method, 's'); - if (\str_starts_with($unit, 'is')) { - $word = \substr($unit, 2); - if (\in_array($word, static::$days, \true)) { - return $this->isDayOfWeek($word); - } - switch ($word) { - // @call is Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - case 'Utc': - case 'UTC': - return $this->utc; - // @call is Check if the current instance has non-UTC timezone. - case 'Local': - return $this->local; - // @call is Check if the current instance is a valid date. - case 'Valid': - return $this->year !== 0; - // @call is Check if the current instance is in a daylight saving time. - case 'DST': - return $this->dst; - } - } - $action = \substr($unit, 0, 3); - $overflow = null; - if ($action === 'set') { - $unit = \strtolower(\substr($unit, 3)); - } - if (\in_array($unit, static::$units, \true)) { - return $this->setUnit($unit, ...$parameters); - } - if ($action === 'add' || $action === 'sub') { - $unit = \substr($unit, 3); - if (\str_starts_with($unit, 'Real')) { - $unit = static::singularUnit(\substr($unit, 4)); - return $this->{"{$action}RealUnit"}($unit, ...$parameters); - } - if (\preg_match('/^(Month|Quarter|Year|Decade|Century|Centurie|Millennium|Millennia)s?(No|With|Without|WithNo)Overflow$/', $unit, $match)) { - $unit = $match[1]; - $overflow = $match[2] === 'With'; - } - $unit = static::singularUnit($unit); - } - if (static::isModifiableUnit($unit)) { - return $this->{"{$action}Unit"}($unit, $this->getMagicParameter($parameters, 0, 'value', 1), $overflow); - } - $sixFirstLetters = \substr($unit, 0, 6); - $factor = -1; - if ($sixFirstLetters === 'isLast') { - $sixFirstLetters = 'isNext'; - $factor = 1; - } - if ($sixFirstLetters === 'isNext') { - $lowerUnit = \strtolower(\substr($unit, 6)); - if (static::isModifiableUnit($lowerUnit)) { - return $this->copy()->addUnit($lowerUnit, $factor, \false)->isSameUnit($lowerUnit, ...$parameters); - } - } - if ($sixFirstLetters === 'isSame') { - try { - return $this->isSameUnit(\strtolower(\substr($unit, 6)), ...$parameters); - } catch (BadComparisonUnitException $exception) { - // Try next - } - } - if (\str_starts_with($unit, 'isCurrent')) { - try { - return $this->isCurrentUnit(\strtolower(\substr($unit, 9))); - } catch (BadComparisonUnitException|BadMethodCallException $exception) { - // Try next - } - } - if (\str_ends_with($method, 'Until')) { - try { - $unit = static::singularUnit(\substr($method, 0, -5)); - return $this->range($this->getMagicParameter($parameters, 0, 'endDate', $this), $this->getMagicParameter($parameters, 1, 'factor', 1), $unit); - } catch (InvalidArgumentException $exception) { - // Try macros - } - } - return static::bindMacroContext($this, function () use(&$method, &$parameters) { - $macro = $this->getLocalMacro($method); - if (!$macro) { - foreach ([$this->localGenericMacros ?: [], static::getGenericMacros()] as $list) { - foreach ($list as $callback) { - try { - return $this->executeCallable($callback, $method, ...$parameters); - } catch (BadMethodCallException $exception) { - continue; - } - } - } - if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { - throw new UnknownMethodException($method); - } - return null; - } - return $this->executeCallable($macro, ...$parameters); - }); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php b/dependencies/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php deleted file mode 100644 index c9ce3c6..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -trait DeprecatedProperties -{ - /** - * the day of week in current locale LC_TIME - * - * @var string - * - * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. - * Use ->isoFormat('MMM') instead. - * Deprecated since 2.55.0 - */ - public $localeDayOfWeek; - /** - * the abbreviated day of week in current locale LC_TIME - * - * @var string - * - * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. - * Use ->isoFormat('dddd') instead. - * Deprecated since 2.55.0 - */ - public $shortLocaleDayOfWeek; - /** - * the month in current locale LC_TIME - * - * @var string - * - * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. - * Use ->isoFormat('ddd') instead. - * Deprecated since 2.55.0 - */ - public $localeMonth; - /** - * the abbreviated month in current locale LC_TIME - * - * @var string - * - * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. - * Use ->isoFormat('MMMM') instead. - * Deprecated since 2.55.0 - */ - public $shortLocaleMonth; -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Difference.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Difference.php deleted file mode 100644 index 40f0ffe..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Difference.php +++ /dev/null @@ -1,1044 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonInterval; -use WP_Ultimo\Dependencies\Carbon\CarbonPeriod; -use WP_Ultimo\Dependencies\Carbon\Translator; -use Closure; -use DateInterval; -use DateTimeInterface; -use ReturnTypeWillChange; -/** - * Trait Difference. - * - * Depends on the following methods: - * - * @method bool lessThan($date) - * @method static copy() - * @method static resolveCarbon($date = null) - * @method static Translator translator() - */ -trait Difference -{ - /** - * @codeCoverageIgnore - * - * @param CarbonInterval $diff - */ - protected static function fixNegativeMicroseconds(CarbonInterval $diff) - { - if ($diff->s !== 0 || $diff->i !== 0 || $diff->h !== 0 || $diff->d !== 0 || $diff->m !== 0 || $diff->y !== 0) { - $diff->f = (\round($diff->f * 1000000) + 1000000) / 1000000; - $diff->s--; - if ($diff->s < 0) { - $diff->s += 60; - $diff->i--; - if ($diff->i < 0) { - $diff->i += 60; - $diff->h--; - if ($diff->h < 0) { - $diff->h += 24; - $diff->d--; - if ($diff->d < 0) { - $diff->d += 30; - $diff->m--; - if ($diff->m < 0) { - $diff->m += 12; - $diff->y--; - } - } - } - } - } - return; - } - $diff->f *= -1; - $diff->invert(); - } - /** - * @param DateInterval $diff - * @param bool $absolute - * - * @return CarbonInterval - */ - protected static function fixDiffInterval(DateInterval $diff, $absolute, array $skip = []) - { - $diff = CarbonInterval::instance($diff, $skip); - // Work-around for https://bugs.php.net/bug.php?id=77145 - // @codeCoverageIgnoreStart - if ($diff->f > 0 && $diff->y === -1 && $diff->m === 11 && $diff->d >= 27 && $diff->h === 23 && $diff->i === 59 && $diff->s === 59) { - $diff->y = 0; - $diff->m = 0; - $diff->d = 0; - $diff->h = 0; - $diff->i = 0; - $diff->s = 0; - $diff->f = (1000000 - \round($diff->f * 1000000)) / 1000000; - $diff->invert(); - } elseif ($diff->f < 0) { - static::fixNegativeMicroseconds($diff); - } - // @codeCoverageIgnoreEnd - if ($absolute && $diff->invert) { - $diff->invert(); - } - return $diff; - } - /** - * Get the difference as a DateInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return DateInterval - */ - #[ReturnTypeWillChange] - public function diff($date = null, $absolute = \false) - { - $other = $this->resolveCarbon($date); - // Work-around for https://bugs.php.net/bug.php?id=81458 - // It was initially introduced for https://bugs.php.net/bug.php?id=80998 - // The very specific case of 80998 was fixed in PHP 8.1beta3, but it introduced 81458 - // So we still need to keep this for now - // @codeCoverageIgnoreStart - if (\version_compare(\PHP_VERSION, '8.1.0-dev', '>=') && $other->tz !== $this->tz) { - $other = $other->avoidMutation()->tz($this->tz); - } - // @codeCoverageIgnoreEnd - return parent::diff($other, (bool) $absolute); - } - /** - * Get the difference as a CarbonInterval instance. - * Return relative interval (negative if $absolute flag is not set to true and the given date is before - * current one). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return CarbonInterval - */ - public function diffAsCarbonInterval($date = null, $absolute = \true, array $skip = []) - { - return static::fixDiffInterval($this->diff($this->resolveCarbon($date), $absolute), $absolute, $skip); - } - /** - * Get the difference in years - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInYears($date = null, $absolute = \true) - { - return (int) $this->diff($this->resolveCarbon($date), $absolute)->format('%r%y'); - } - /** - * Get the difference in quarters rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInQuarters($date = null, $absolute = \true) - { - return (int) ($this->diffInMonths($date, $absolute) / static::MONTHS_PER_QUARTER); - } - /** - * Get the difference in months rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMonths($date = null, $absolute = \true) - { - $date = $this->resolveCarbon($date)->avoidMutation()->tz($this->tz); - [$yearStart, $monthStart, $dayStart] = \explode('-', $this->format('Y-m-dHisu')); - [$yearEnd, $monthEnd, $dayEnd] = \explode('-', $date->format('Y-m-dHisu')); - $diff = ((int) $yearEnd - (int) $yearStart) * static::MONTHS_PER_YEAR + (int) $monthEnd - (int) $monthStart; - if ($diff > 0) { - $diff -= $dayStart > $dayEnd ? 1 : 0; - } elseif ($diff < 0) { - $diff += $dayStart < $dayEnd ? 1 : 0; - } - return $absolute ? \abs($diff) : $diff; - } - /** - * Get the difference in weeks rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeeks($date = null, $absolute = \true) - { - return (int) ($this->diffInDays($date, $absolute) / static::DAYS_PER_WEEK); - } - /** - * Get the difference in days rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInDays($date = null, $absolute = \true) - { - return $this->getIntervalDayDiff($this->diff($this->resolveCarbon($date), $absolute)); - } - /** - * Get the difference in days using a filter closure rounded down. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInDaysFiltered(Closure $callback, $date = null, $absolute = \true) - { - return $this->diffFiltered(CarbonInterval::day(), $callback, $date, $absolute); - } - /** - * Get the difference in hours using a filter closure rounded down. - * - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInHoursFiltered(Closure $callback, $date = null, $absolute = \true) - { - return $this->diffFiltered(CarbonInterval::hour(), $callback, $date, $absolute); - } - /** - * Get the difference by the given interval using a filter closure. - * - * @param CarbonInterval $ci An interval to traverse by - * @param Closure $callback - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, $absolute = \true) - { - $start = $this; - $end = $this->resolveCarbon($date); - $inverse = \false; - if ($end < $start) { - $start = $end; - $end = $this; - $inverse = \true; - } - $options = CarbonPeriod::EXCLUDE_END_DATE | ($this->isMutable() ? 0 : CarbonPeriod::IMMUTABLE); - $diff = $ci->toPeriod($start, $end, $options)->filter($callback)->count(); - return $inverse && !$absolute ? -$diff : $diff; - } - /** - * Get the difference in weekdays rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekdays($date = null, $absolute = \true) - { - return $this->diffInDaysFiltered(static function (CarbonInterface $date) { - return $date->isWeekday(); - }, $this->resolveCarbon($date)->avoidMutation()->modify($this->format('H:i:s.u')), $absolute); - } - /** - * Get the difference in weekend days using a filter rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInWeekendDays($date = null, $absolute = \true) - { - return $this->diffInDaysFiltered(static function (CarbonInterface $date) { - return $date->isWeekend(); - }, $this->resolveCarbon($date)->avoidMutation()->modify($this->format('H:i:s.u')), $absolute); - } - /** - * Get the difference in hours rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInHours($date = null, $absolute = \true) - { - return (int) ($this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR); - } - /** - * Get the difference in hours rounded down using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealHours($date = null, $absolute = \true) - { - return (int) ($this->diffInRealSeconds($date, $absolute) / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR); - } - /** - * Get the difference in minutes rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMinutes($date = null, $absolute = \true) - { - return (int) ($this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE); - } - /** - * Get the difference in minutes rounded down using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealMinutes($date = null, $absolute = \true) - { - return (int) ($this->diffInRealSeconds($date, $absolute) / static::SECONDS_PER_MINUTE); - } - /** - * Get the difference in seconds rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInSeconds($date = null, $absolute = \true) - { - $diff = $this->diff($date); - if ($diff->days === 0) { - $diff = static::fixDiffInterval($diff, $absolute); - } - $value = ((($diff->m || $diff->y ? $diff->days : $diff->d) * static::HOURS_PER_DAY + $diff->h) * static::MINUTES_PER_HOUR + $diff->i) * static::SECONDS_PER_MINUTE + $diff->s; - return $absolute || !$diff->invert ? $value : -$value; - } - /** - * Get the difference in microseconds. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMicroseconds($date = null, $absolute = \true) - { - $diff = $this->diff($date); - $value = (int) \round((((($diff->m || $diff->y ? $diff->days : $diff->d) * static::HOURS_PER_DAY + $diff->h) * static::MINUTES_PER_HOUR + $diff->i) * static::SECONDS_PER_MINUTE + ($diff->f + $diff->s)) * static::MICROSECONDS_PER_SECOND); - return $absolute || !$diff->invert ? $value : -$value; - } - /** - * Get the difference in milliseconds rounded down. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInMilliseconds($date = null, $absolute = \true) - { - return (int) ($this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_MILLISECOND); - } - /** - * Get the difference in seconds using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealSeconds($date = null, $absolute = \true) - { - /** @var CarbonInterface $date */ - $date = $this->resolveCarbon($date); - $value = $date->getTimestamp() - $this->getTimestamp(); - return $absolute ? \abs($value) : $value; - } - /** - * Get the difference in microseconds using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealMicroseconds($date = null, $absolute = \true) - { - /** @var CarbonInterface $date */ - $date = $this->resolveCarbon($date); - $value = ($date->timestamp - $this->timestamp) * static::MICROSECONDS_PER_SECOND + $date->micro - $this->micro; - return $absolute ? \abs($value) : $value; - } - /** - * Get the difference in milliseconds rounded down using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return int - */ - public function diffInRealMilliseconds($date = null, $absolute = \true) - { - return (int) ($this->diffInRealMicroseconds($date, $absolute) / static::MICROSECONDS_PER_MILLISECOND); - } - /** - * Get the difference in seconds as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInSeconds($date = null, $absolute = \true) - { - return (float) ($this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_SECOND); - } - /** - * Get the difference in minutes as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInMinutes($date = null, $absolute = \true) - { - return $this->floatDiffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE; - } - /** - * Get the difference in hours as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInHours($date = null, $absolute = \true) - { - return $this->floatDiffInMinutes($date, $absolute) / static::MINUTES_PER_HOUR; - } - /** - * Get the difference in days as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInDays($date = null, $absolute = \true) - { - $hoursDiff = $this->floatDiffInHours($date, $absolute); - $interval = $this->diff($date, $absolute); - if ($interval->y === 0 && $interval->m === 0 && $interval->d === 0) { - return $hoursDiff / static::HOURS_PER_DAY; - } - $daysDiff = $this->getIntervalDayDiff($interval); - return $daysDiff + \fmod($hoursDiff, static::HOURS_PER_DAY) / static::HOURS_PER_DAY; - } - /** - * Get the difference in weeks as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInWeeks($date = null, $absolute = \true) - { - return $this->floatDiffInDays($date, $absolute) / static::DAYS_PER_WEEK; - } - /** - * Get the difference in months as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInMonths($date = null, $absolute = \true) - { - $start = $this; - $end = $this->resolveCarbon($date); - $ascending = $start <= $end; - $sign = $absolute || $ascending ? 1 : -1; - if (!$ascending) { - [$start, $end] = [$end, $start]; - } - $monthsDiff = $start->diffInMonths($end); - /** @var Carbon|CarbonImmutable $floorEnd */ - $floorEnd = $start->avoidMutation()->addMonths($monthsDiff); - if ($floorEnd >= $end) { - return $sign * $monthsDiff; - } - /** @var Carbon|CarbonImmutable $startOfMonthAfterFloorEnd */ - $startOfMonthAfterFloorEnd = $floorEnd->avoidMutation()->addMonth()->startOfMonth(); - if ($startOfMonthAfterFloorEnd > $end) { - return $sign * ($monthsDiff + $floorEnd->floatDiffInDays($end) / $floorEnd->daysInMonth); - } - return $sign * ($monthsDiff + $floorEnd->floatDiffInDays($startOfMonthAfterFloorEnd) / $floorEnd->daysInMonth + $startOfMonthAfterFloorEnd->floatDiffInDays($end) / $end->daysInMonth); - } - /** - * Get the difference in year as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInYears($date = null, $absolute = \true) - { - $start = $this; - $end = $this->resolveCarbon($date); - $ascending = $start <= $end; - $sign = $absolute || $ascending ? 1 : -1; - if (!$ascending) { - [$start, $end] = [$end, $start]; - } - $yearsDiff = $start->diffInYears($end); - /** @var Carbon|CarbonImmutable $floorEnd */ - $floorEnd = $start->avoidMutation()->addYears($yearsDiff); - if ($floorEnd >= $end) { - return $sign * $yearsDiff; - } - /** @var Carbon|CarbonImmutable $startOfYearAfterFloorEnd */ - $startOfYearAfterFloorEnd = $floorEnd->avoidMutation()->addYear()->startOfYear(); - if ($startOfYearAfterFloorEnd > $end) { - return $sign * ($yearsDiff + $floorEnd->floatDiffInDays($end) / $floorEnd->daysInYear); - } - return $sign * ($yearsDiff + $floorEnd->floatDiffInDays($startOfYearAfterFloorEnd) / $floorEnd->daysInYear + $startOfYearAfterFloorEnd->floatDiffInDays($end) / $end->daysInYear); - } - /** - * Get the difference in seconds as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealSeconds($date = null, $absolute = \true) - { - return $this->diffInRealMicroseconds($date, $absolute) / static::MICROSECONDS_PER_SECOND; - } - /** - * Get the difference in minutes as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealMinutes($date = null, $absolute = \true) - { - return $this->floatDiffInRealSeconds($date, $absolute) / static::SECONDS_PER_MINUTE; - } - /** - * Get the difference in hours as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealHours($date = null, $absolute = \true) - { - return $this->floatDiffInRealMinutes($date, $absolute) / static::MINUTES_PER_HOUR; - } - /** - * Get the difference in days as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealDays($date = null, $absolute = \true) - { - $date = $this->resolveUTC($date); - $utc = $this->avoidMutation()->utc(); - $hoursDiff = $utc->floatDiffInRealHours($date, $absolute); - return ($hoursDiff < 0 ? -1 : 1) * $utc->diffInDays($date) + \fmod($hoursDiff, static::HOURS_PER_DAY) / static::HOURS_PER_DAY; - } - /** - * Get the difference in weeks as float (microsecond-precision). - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealWeeks($date = null, $absolute = \true) - { - return $this->floatDiffInRealDays($date, $absolute) / static::DAYS_PER_WEEK; - } - /** - * Get the difference in months as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealMonths($date = null, $absolute = \true) - { - $start = $this; - $end = $this->resolveCarbon($date); - $ascending = $start <= $end; - $sign = $absolute || $ascending ? 1 : -1; - if (!$ascending) { - [$start, $end] = [$end, $start]; - } - $monthsDiff = $start->diffInMonths($end); - /** @var Carbon|CarbonImmutable $floorEnd */ - $floorEnd = $start->avoidMutation()->addMonths($monthsDiff); - if ($floorEnd >= $end) { - return $sign * $monthsDiff; - } - /** @var Carbon|CarbonImmutable $startOfMonthAfterFloorEnd */ - $startOfMonthAfterFloorEnd = $floorEnd->avoidMutation()->addMonth()->startOfMonth(); - if ($startOfMonthAfterFloorEnd > $end) { - return $sign * ($monthsDiff + $floorEnd->floatDiffInRealDays($end) / $floorEnd->daysInMonth); - } - return $sign * ($monthsDiff + $floorEnd->floatDiffInRealDays($startOfMonthAfterFloorEnd) / $floorEnd->daysInMonth + $startOfMonthAfterFloorEnd->floatDiffInRealDays($end) / $end->daysInMonth); - } - /** - * Get the difference in year as float (microsecond-precision) using timestamps. - * - * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date - * @param bool $absolute Get the absolute of the difference - * - * @return float - */ - public function floatDiffInRealYears($date = null, $absolute = \true) - { - $start = $this; - $end = $this->resolveCarbon($date); - $ascending = $start <= $end; - $sign = $absolute || $ascending ? 1 : -1; - if (!$ascending) { - [$start, $end] = [$end, $start]; - } - $yearsDiff = $start->diffInYears($end); - /** @var Carbon|CarbonImmutable $floorEnd */ - $floorEnd = $start->avoidMutation()->addYears($yearsDiff); - if ($floorEnd >= $end) { - return $sign * $yearsDiff; - } - /** @var Carbon|CarbonImmutable $startOfYearAfterFloorEnd */ - $startOfYearAfterFloorEnd = $floorEnd->avoidMutation()->addYear()->startOfYear(); - if ($startOfYearAfterFloorEnd > $end) { - return $sign * ($yearsDiff + $floorEnd->floatDiffInRealDays($end) / $floorEnd->daysInYear); - } - return $sign * ($yearsDiff + $floorEnd->floatDiffInRealDays($startOfYearAfterFloorEnd) / $floorEnd->daysInYear + $startOfYearAfterFloorEnd->floatDiffInRealDays($end) / $end->daysInYear); - } - /** - * The number of seconds since midnight. - * - * @return int - */ - public function secondsSinceMidnight() - { - return $this->diffInSeconds($this->avoidMutation()->startOfDay()); - } - /** - * The number of seconds until 23:59:59. - * - * @return int - */ - public function secondsUntilEndOfDay() - { - return $this->diffInSeconds($this->avoidMutation()->endOfDay()); - } - /** - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @example - * ``` - * echo Carbon::tomorrow()->diffForHumans() . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 2]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(['parts' => 3, 'join' => true]) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday()) . "\n"; - * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday(), ['short' => true]) . "\n"; - * ``` - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'skip' entry, list of units to skip (array of strings or a single string, - * ` it can be the unit name (singular or plural) or its shortcut - * ` (y, m, w, d, h, min, s, ms, µs). - * - 'aUnit' entry, prefer "an hour" over "1 hour" if true - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * - 'minimumUnit' entry determines the smallest unit of time to display can be long or - * ` short form of the units, e.g. 'hour' or 'h' (default value: s) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function diffForHumans($other = null, $syntax = null, $short = \false, $parts = 1, $options = null) - { - /* @var CarbonInterface $this */ - if (\is_array($other)) { - $other['syntax'] = \array_key_exists('syntax', $other) ? $other['syntax'] : $syntax; - $syntax = $other; - $other = $syntax['other'] ?? null; - } - $intSyntax =& $syntax; - if (\is_array($syntax)) { - $syntax['syntax'] = $syntax['syntax'] ?? null; - $intSyntax =& $syntax['syntax']; - } - $intSyntax = (int) ($intSyntax ?? static::DIFF_RELATIVE_AUTO); - $intSyntax = $intSyntax === static::DIFF_RELATIVE_AUTO && $other === null ? static::DIFF_RELATIVE_TO_NOW : $intSyntax; - $parts = \min(7, \max(1, (int) $parts)); - $skip = \is_array($syntax) ? $syntax['skip'] ?? [] : []; - return $this->diffAsCarbonInterval($other, \false, (array) $skip)->setLocalTranslator($this->getLocalTranslator())->forHumans($syntax, (bool) $short, $parts, $options ?? $this->localHumanDiffOptions ?? static::getHumanDiffOptions()); - } - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function from($other = null, $syntax = null, $short = \false, $parts = 1, $options = null) - { - return $this->diffForHumans($other, $syntax, $short, $parts, $options); - } - /** - * @alias diffForHumans - * - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - */ - public function since($other = null, $syntax = null, $short = \false, $parts = 1, $options = null) - { - return $this->diffForHumans($other, $syntax, $short, $parts, $options); - } - /** - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * When comparing a value in the past to default now: - * 1 hour from now - * 5 months from now - * - * When comparing a value in the future to default now: - * 1 hour ago - * 5 months ago - * - * When comparing a value in the past to another value: - * 1 hour after - * 5 months after - * - * When comparing a value in the future to another value: - * 1 hour before - * 5 months before - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function to($other = null, $syntax = null, $short = \false, $parts = 1, $options = null) - { - if (!$syntax && !$other) { - $syntax = CarbonInterface::DIFF_RELATIVE_TO_NOW; - } - return $this->resolveCarbon($other)->diffForHumans($this, $syntax, $short, $parts, $options); - } - /** - * @alias to - * - * Get the difference in a human readable format in the current locale from an other - * instance given (or now if null given) to current instance. - * - * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; - * if null passed, now will be used as comparison reference; - * if any other type, it will be converted to date and used as reference. - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * - 'other' entry (see above) - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function until($other = null, $syntax = null, $short = \false, $parts = 1, $options = null) - { - return $this->to($other, $syntax, $short, $parts, $options); - } - /** - * Get the difference in a human readable format in the current locale from current - * instance to now. - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single unit) - * @param int $options human diff options - * - * @return string - */ - public function fromNow($syntax = null, $short = \false, $parts = 1, $options = null) - { - $other = null; - if ($syntax instanceof DateTimeInterface) { - [$other, $syntax, $short, $parts, $options] = \array_pad(\func_get_args(), 5, null); - } - return $this->from($other, $syntax, $short, $parts, $options); - } - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function toNow($syntax = null, $short = \false, $parts = 1, $options = null) - { - return $this->to(null, $syntax, $short, $parts, $options); - } - /** - * Get the difference in a human readable format in the current locale from an other - * instance given to now - * - * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: - * - 'syntax' entry (see below) - * - 'short' entry (see below) - * - 'parts' entry (see below) - * - 'options' entry (see below) - * - 'join' entry determines how to join multiple parts of the string - * ` - if $join is a string, it's used as a joiner glue - * ` - if $join is a callable/closure, it get the list of string and should return a string - * ` - if $join is an array, the first item will be the default glue, and the second item - * ` will be used instead of the glue for the last item - * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) - * ` - if $join is missing, a space will be used as glue - * if int passed, it add modifiers: - * Possible values: - * - CarbonInterface::DIFF_ABSOLUTE no modifiers - * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier - * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier - * Default value: CarbonInterface::DIFF_ABSOLUTE - * @param bool $short displays short format of time units - * @param int $parts maximum number of parts to display (default value: 1: single part) - * @param int $options human diff options - * - * @return string - */ - public function ago($syntax = null, $short = \false, $parts = 1, $options = null) - { - $other = null; - if ($syntax instanceof DateTimeInterface) { - [$other, $syntax, $short, $parts, $options] = \array_pad(\func_get_args(), 5, null); - } - return $this->from($other, $syntax, $short, $parts, $options); - } - /** - * Get the difference in a human readable format in the current locale from current instance to an other - * instance given (or now if null given). - * - * @return string - */ - public function timespan($other = null, $timezone = null) - { - if (!$other instanceof DateTimeInterface) { - $other = static::parse($other, $timezone); - } - return $this->diffForHumans($other, ['join' => ', ', 'syntax' => CarbonInterface::DIFF_ABSOLUTE, 'options' => CarbonInterface::NO_ZERO_DIFF, 'parts' => -1]); - } - /** - * Returns either day of week + time (e.g. "Last Friday at 3:30 PM") if reference time is within 7 days, - * or a calendar date (e.g. "10/29/2017") otherwise. - * - * Language, date and time formats will change according to the current locale. - * - * @param Carbon|\DateTimeInterface|string|null $referenceTime - * @param array $formats - * - * @return string - */ - public function calendar($referenceTime = null, array $formats = []) - { - /** @var CarbonInterface $current */ - $current = $this->avoidMutation()->startOfDay(); - /** @var CarbonInterface $other */ - $other = $this->resolveCarbon($referenceTime)->avoidMutation()->setTimezone($this->getTimezone())->startOfDay(); - $diff = $other->diffInDays($current, \false); - $format = $diff < -6 ? 'sameElse' : ($diff < -1 ? 'lastWeek' : ($diff < 0 ? 'lastDay' : ($diff < 1 ? 'sameDay' : ($diff < 2 ? 'nextDay' : ($diff < 7 ? 'nextWeek' : 'sameElse'))))); - $format = \array_merge($this->getCalendarFormats(), $formats)[$format]; - if ($format instanceof Closure) { - $format = $format($current, $other) ?? ''; - } - return $this->isoFormat((string) $format); - } - private function getIntervalDayDiff(DateInterval $interval) : int - { - $daysDiff = (int) $interval->format('%a'); - $sign = $interval->format('%r') === '-' ? -1 : 1; - if (\is_int($interval->days) && $interval->y === 0 && $interval->m === 0 && \version_compare(\PHP_VERSION, '8.1.0-dev', '<') && \abs($interval->d - $daysDiff) === 1) { - $daysDiff = \abs($interval->d); - // @codeCoverageIgnore - } - return $daysDiff * $sign; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php b/dependencies/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php deleted file mode 100644 index 1748b41..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterval; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidIntervalException; -use DateInterval; -/** - * Trait to call rounding methods to interval or the interval of a period. - */ -trait IntervalRounding -{ - protected function callRoundMethod(string $method, array $parameters) - { - $action = \substr($method, 0, 4); - if ($action !== 'ceil') { - $action = \substr($method, 0, 5); - } - if (\in_array($action, ['round', 'floor', 'ceil'])) { - return $this->{$action . 'Unit'}(\substr($method, \strlen($action)), ...$parameters); - } - return null; - } - protected function roundWith($precision, $function) - { - $unit = 'second'; - if ($precision instanceof DateInterval) { - $precision = (string) CarbonInterval::instance($precision, [], \true); - } - if (\is_string($precision) && \preg_match('/^\\s*(?\\d+)?\\s*(?\\w+)(?\\W.*)?$/', $precision, $match)) { - if (\trim($match['other'] ?? '') !== '') { - throw new InvalidIntervalException('Rounding is only possible with single unit intervals.'); - } - $precision = (int) ($match['precision'] ?: 1); - $unit = $match['unit']; - } - return $this->roundUnit($unit, $precision, $function); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/IntervalStep.php b/dependencies/nesbot/carbon/src/Carbon/Traits/IntervalStep.php deleted file mode 100644 index 696b442..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/IntervalStep.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use Closure; -use DateTimeImmutable; -use DateTimeInterface; -trait IntervalStep -{ - /** - * Step to apply instead of a fixed interval to get the new date. - * - * @var Closure|null - */ - protected $step; - /** - * Get the dynamic step in use. - * - * @return Closure - */ - public function getStep() : ?Closure - { - return $this->step; - } - /** - * Set a step to apply instead of a fixed interval to get the new date. - * - * Or pass null to switch to fixed interval. - * - * @param Closure|null $step - */ - public function setStep(?Closure $step) : void - { - $this->step = $step; - } - /** - * Take a date and apply either the step if set, or the current interval else. - * - * The interval/step is applied negatively (typically subtraction instead of addition) if $negated is true. - * - * @param DateTimeInterface $dateTime - * @param bool $negated - * - * @return CarbonInterface - */ - public function convertDate(DateTimeInterface $dateTime, bool $negated = \false) : CarbonInterface - { - /** @var CarbonInterface $carbonDate */ - $carbonDate = $dateTime instanceof CarbonInterface ? $dateTime : $this->resolveCarbon($dateTime); - if ($this->step) { - return $carbonDate->setDateTimeFrom(($this->step)($carbonDate->avoidMutation(), $negated)); - } - if ($negated) { - return $carbonDate->rawSub($this); - } - return $carbonDate->rawAdd($this); - } - /** - * Convert DateTimeImmutable instance to CarbonImmutable instance and DateTime instance to Carbon instance. - * - * @param DateTimeInterface $dateTime - * - * @return Carbon|CarbonImmutable - */ - private function resolveCarbon(DateTimeInterface $dateTime) - { - if ($dateTime instanceof DateTimeImmutable) { - return CarbonImmutable::instance($dateTime); - } - return Carbon::instance($dateTime); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Localization.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Localization.php deleted file mode 100644 index e26469a..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Localization.php +++ /dev/null @@ -1,677 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidTypeException; -use WP_Ultimo\Dependencies\Carbon\Exceptions\NotLocaleAwareException; -use WP_Ultimo\Dependencies\Carbon\Language; -use WP_Ultimo\Dependencies\Carbon\Translator; -use WP_Ultimo\Dependencies\Carbon\TranslatorStrongTypeInterface; -use Closure; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Component\Translation\TranslatorInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\LocaleAwareInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface as ContractsTranslatorInterface; -// @codeCoverageIgnoreStart -if (\interface_exists('WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatorInterface') && !\interface_exists('Symfony\\Component\\Translation\\TranslatorInterface')) { - \class_alias('WP_Ultimo\\Dependencies\\Symfony\\Contracts\\Translation\\TranslatorInterface', 'Symfony\\Component\\Translation\\TranslatorInterface'); -} -// @codeCoverageIgnoreEnd -/** - * Trait Localization. - * - * Embed default and locale translators and translation base methods. - */ -trait Localization -{ - /** - * Default translator. - * - * @var \Symfony\Component\Translation\TranslatorInterface - */ - protected static $translator; - /** - * Specific translator of the current instance. - * - * @var \Symfony\Component\Translation\TranslatorInterface - */ - protected $localTranslator; - /** - * Options for diffForHumans(). - * - * @var int - */ - protected static $humanDiffOptions = CarbonInterface::NO_ZERO_DIFF; - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * @param int $humanDiffOptions - */ - public static function setHumanDiffOptions($humanDiffOptions) - { - static::$humanDiffOptions = $humanDiffOptions; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * @param int $humanDiffOption - */ - public static function enableHumanDiffOption($humanDiffOption) - { - static::$humanDiffOptions = static::getHumanDiffOptions() | $humanDiffOption; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * @param int $humanDiffOption - */ - public static function disableHumanDiffOption($humanDiffOption) - { - static::$humanDiffOptions = static::getHumanDiffOptions() & ~$humanDiffOption; - } - /** - * Return default humanDiff() options (merged flags as integer). - * - * @return int - */ - public static function getHumanDiffOptions() - { - return static::$humanDiffOptions; - } - /** - * Get the default translator instance in use. - * - * @return \Symfony\Component\Translation\TranslatorInterface - */ - public static function getTranslator() - { - return static::translator(); - } - /** - * Set the default translator instance to use. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator - * - * @return void - */ - public static function setTranslator(TranslatorInterface $translator) - { - static::$translator = $translator; - } - /** - * Return true if the current instance has its own translator. - * - * @return bool - */ - public function hasLocalTranslator() - { - return isset($this->localTranslator); - } - /** - * Get the translator of the current instance or the default if none set. - * - * @return \Symfony\Component\Translation\TranslatorInterface - */ - public function getLocalTranslator() - { - return $this->localTranslator ?: static::translator(); - } - /** - * Set the translator for the current instance. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator - * - * @return $this - */ - public function setLocalTranslator(TranslatorInterface $translator) - { - $this->localTranslator = $translator; - return $this; - } - /** - * Returns raw translation message for a given key. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator the translator to use - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * - * @return string - */ - public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) - { - if (!($translator instanceof TranslatorBagInterface && $translator instanceof TranslatorInterface)) { - throw new InvalidTypeException('Translator does not implement ' . TranslatorInterface::class . ' and ' . TranslatorBagInterface::class . '. ' . (\is_object($translator) ? \get_class($translator) : \gettype($translator)) . ' has been given.'); - } - if (!$locale && $translator instanceof LocaleAwareInterface) { - $locale = $translator->getLocale(); - } - $result = self::getFromCatalogue($translator, $translator->getCatalogue($locale), $key); - return $result === $key ? $default : $result; - } - /** - * Returns raw translation message for a given key. - * - * @param string $key key to find - * @param string|null $locale current locale used if null - * @param string|null $default default value if translation returns the key - * @param \Symfony\Component\Translation\TranslatorInterface $translator an optional translator to use - * - * @return string - */ - public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null) - { - return static::getTranslationMessageWith($translator ?: $this->getLocalTranslator(), $key, $locale, $default); - } - /** - * Translate using translation string or callback available. - * - * @param \Symfony\Component\Translation\TranslatorInterface $translator - * @param string $key - * @param array $parameters - * @param null $number - * - * @return string - */ - public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) : string - { - $message = static::getTranslationMessageWith($translator, $key, null, $key); - if ($message instanceof Closure) { - return (string) $message(...\array_values($parameters)); - } - if ($number !== null) { - $parameters['%count%'] = $number; - } - if (isset($parameters['%count%'])) { - $parameters[':count'] = $parameters['%count%']; - } - // @codeCoverageIgnoreStart - $choice = $translator instanceof ContractsTranslatorInterface ? $translator->trans($key, $parameters) : $translator->transChoice($key, $number, $parameters); - // @codeCoverageIgnoreEnd - return (string) $choice; - } - /** - * Translate using translation string or callback available. - * - * @param string $key - * @param array $parameters - * @param string|int|float|null $number - * @param \Symfony\Component\Translation\TranslatorInterface|null $translator - * @param bool $altNumbers - * - * @return string - */ - public function translate(string $key, array $parameters = [], $number = null, ?TranslatorInterface $translator = null, bool $altNumbers = \false) : string - { - $translation = static::translateWith($translator ?: $this->getLocalTranslator(), $key, $parameters, $number); - if ($number !== null && $altNumbers) { - return \str_replace($number, $this->translateNumber($number), $translation); - } - return $translation; - } - /** - * Returns the alternative number for a given integer if available in the current locale. - * - * @param int $number - * - * @return string - */ - public function translateNumber(int $number) : string - { - $translateKey = "alt_numbers.{$number}"; - $symbol = $this->translate($translateKey); - if ($symbol !== $translateKey) { - return $symbol; - } - if ($number > 99 && $this->translate('alt_numbers.99') !== 'alt_numbers.99') { - $start = ''; - foreach ([10000, 1000, 100] as $exp) { - $key = "alt_numbers_pow.{$exp}"; - if ($number >= $exp && $number < $exp * 10 && ($pow = $this->translate($key)) !== $key) { - $unit = \floor($number / $exp); - $number -= $unit * $exp; - $start .= ($unit > 1 ? $this->translate("alt_numbers.{$unit}") : '') . $pow; - } - } - $result = ''; - while ($number) { - $chunk = $number % 100; - $result = $this->translate("alt_numbers.{$chunk}") . $result; - $number = \floor($number / 100); - } - return "{$start}{$result}"; - } - if ($number > 9 && $this->translate('alt_numbers.9') !== 'alt_numbers.9') { - $result = ''; - while ($number) { - $chunk = $number % 10; - $result = $this->translate("alt_numbers.{$chunk}") . $result; - $number = \floor($number / 10); - } - return $result; - } - return (string) $number; - } - /** - * Translate a time string from a locale to an other. - * - * @param string $timeString date/time/duration string to translate (may also contain English) - * @param string|null $from input locale of the $timeString parameter (`Carbon::getLocale()` by default) - * @param string|null $to output locale of the result returned (`"en"` by default) - * @param int $mode specify what to translate with options: - * - CarbonInterface::TRANSLATE_ALL (default) - * - CarbonInterface::TRANSLATE_MONTHS - * - CarbonInterface::TRANSLATE_DAYS - * - CarbonInterface::TRANSLATE_UNITS - * - CarbonInterface::TRANSLATE_MERIDIEM - * You can use pipe to group: CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS - * - * @return string - */ - public static function translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL) - { - // Fallback source and destination locales - $from = $from ?: static::getLocale(); - $to = $to ?: 'en'; - if ($from === $to) { - return $timeString; - } - // Standardize apostrophe - $timeString = \strtr($timeString, ['’' => "'"]); - $fromTranslations = []; - $toTranslations = []; - foreach (['from', 'to'] as $key) { - $language = ${$key}; - $translator = Translator::get($language); - $translations = $translator->getMessages(); - if (!isset($translations[$language])) { - return $timeString; - } - $translationKey = $key . 'Translations'; - $messages = $translations[$language]; - $months = $messages['months'] ?? []; - $weekdays = $messages['weekdays'] ?? []; - $meridiem = $messages['meridiem'] ?? ['AM', 'PM']; - if (isset($messages['ordinal_words'])) { - $timeString = self::replaceOrdinalWords($timeString, $key === 'from' ? \array_flip($messages['ordinal_words']) : $messages['ordinal_words']); - } - if ($key === 'from') { - foreach (['months', 'weekdays'] as $variable) { - $list = $messages[$variable . '_standalone'] ?? null; - if ($list) { - foreach (${$variable} as $index => &$name) { - $name .= '|' . $messages[$variable . '_standalone'][$index]; - } - } - } - } - ${$translationKey} = \array_merge($mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($months, 12, $timeString) : [], $mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($messages['months_short'] ?? [], 12, $timeString) : [], $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($weekdays, 7, $timeString) : [], $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($messages['weekdays_short'] ?? [], 7, $timeString) : [], $mode & CarbonInterface::TRANSLATE_DIFF ? static::translateWordsByKeys(['diff_now', 'diff_today', 'diff_yesterday', 'diff_tomorrow', 'diff_before_yesterday', 'diff_after_tomorrow'], $messages, $key) : [], $mode & CarbonInterface::TRANSLATE_UNITS ? static::translateWordsByKeys(['year', 'month', 'week', 'day', 'hour', 'minute', 'second'], $messages, $key) : [], $mode & CarbonInterface::TRANSLATE_MERIDIEM ? \array_map(function ($hour) use($meridiem) { - if (\is_array($meridiem)) { - return $meridiem[$hour < 12 ? 0 : 1]; - } - return $meridiem($hour, 0, \false); - }, \range(0, 23)) : []); - } - return \substr(\preg_replace_callback('/(?<=[\\d\\s+.\\/,_-])(' . \implode('|', $fromTranslations) . ')(?=[\\d\\s+.\\/,_-])/iu', function ($match) use($fromTranslations, $toTranslations) { - [$chunk] = $match; - foreach ($fromTranslations as $index => $word) { - if (\preg_match("/^{$word}\$/iu", $chunk)) { - return $toTranslations[$index] ?? ''; - } - } - return $chunk; - // @codeCoverageIgnore - }, " {$timeString} "), 1, -1); - } - /** - * Translate a time string from the current locale (`$date->locale()`) to an other. - * - * @param string $timeString time string to translate - * @param string|null $to output locale of the result returned ("en" by default) - * - * @return string - */ - public function translateTimeStringTo($timeString, $to = null) - { - return static::translateTimeString($timeString, $this->getTranslatorLocale(), $to); - } - /** - * Get/set the locale for the current instance. - * - * @param string|null $locale - * @param string ...$fallbackLocales - * - * @return $this|string - */ - public function locale(string $locale = null, ...$fallbackLocales) - { - if ($locale === null) { - return $this->getTranslatorLocale(); - } - if (!$this->localTranslator || $this->getTranslatorLocale($this->localTranslator) !== $locale) { - $translator = Translator::get($locale); - if (!empty($fallbackLocales)) { - $translator->setFallbackLocales($fallbackLocales); - foreach ($fallbackLocales as $fallbackLocale) { - $messages = Translator::get($fallbackLocale)->getMessages(); - if (isset($messages[$fallbackLocale])) { - $translator->setMessages($fallbackLocale, $messages[$fallbackLocale]); - } - } - } - $this->localTranslator = $translator; - } - return $this; - } - /** - * Get the current translator locale. - * - * @return string - */ - public static function getLocale() - { - return static::getLocaleAwareTranslator()->getLocale(); - } - /** - * Set the current translator locale and indicate if the source locale file exists. - * Pass 'auto' as locale to use closest language from the current LC_TIME locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function setLocale($locale) - { - return static::getLocaleAwareTranslator()->setLocale($locale) !== \false; - } - /** - * Set the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - * - * @param string $locale - */ - public static function setFallbackLocale($locale) - { - $translator = static::getTranslator(); - if (\method_exists($translator, 'setFallbackLocales')) { - $translator->setFallbackLocales([$locale]); - if ($translator instanceof Translator) { - $preferredLocale = $translator->getLocale(); - $translator->setMessages($preferredLocale, \array_replace_recursive($translator->getMessages()[$locale] ?? [], Translator::get($locale)->getMessages()[$locale] ?? [], $translator->getMessages($preferredLocale))); - } - } - } - /** - * Get the fallback locale. - * - * @see https://symfony.com/doc/current/components/translation.html#fallback-locales - * - * @return string|null - */ - public static function getFallbackLocale() - { - $translator = static::getTranslator(); - if (\method_exists($translator, 'getFallbackLocales')) { - return $translator->getFallbackLocales()[0] ?? null; - } - return null; - } - /** - * Set the current locale to the given, execute the passed function, reset the locale to previous one, - * then return the result of the closure (or null if the closure was void). - * - * @param string $locale locale ex. en - * @param callable $func - * - * @return mixed - */ - public static function executeWithLocale($locale, $func) - { - $currentLocale = static::getLocale(); - $result = $func(static::setLocale($locale) ? static::getLocale() : \false, static::translator()); - static::setLocale($currentLocale); - return $result; - } - /** - * Returns true if the given locale is internally supported and has short-units support. - * Support is considered enabled if either year, day or hour has a short variant translated. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasShortUnits($locale) - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && (($y = static::translateWith($translator, 'y')) !== 'y' && $y !== static::translateWith($translator, 'year')) || ($y = static::translateWith($translator, 'd')) !== 'd' && $y !== static::translateWith($translator, 'day') || ($y = static::translateWith($translator, 'h')) !== 'h' && $y !== static::translateWith($translator, 'hour'); - }); - } - /** - * Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffSyntax($locale) - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - if (!$newLocale) { - return \false; - } - foreach (['ago', 'from_now', 'before', 'after'] as $key) { - if ($translator instanceof TranslatorBagInterface && self::getFromCatalogue($translator, $translator->getCatalogue($newLocale), $key) instanceof Closure) { - continue; - } - if ($translator->trans($key) === $key) { - return \false; - } - } - return \true; - }); - } - /** - * Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). - * Support is considered enabled if the 3 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffOneDayWords($locale) - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && $translator->trans('diff_now') !== 'diff_now' && $translator->trans('diff_yesterday') !== 'diff_yesterday' && $translator->trans('diff_tomorrow') !== 'diff_tomorrow'; - }); - } - /** - * Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). - * Support is considered enabled if the 2 words are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasDiffTwoDayWords($locale) - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && $translator->trans('diff_before_yesterday') !== 'diff_before_yesterday' && $translator->trans('diff_after_tomorrow') !== 'diff_after_tomorrow'; - }); - } - /** - * Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). - * Support is considered enabled if the 4 sentences are translated in the given locale. - * - * @param string $locale locale ex. en - * - * @return bool - */ - public static function localeHasPeriodSyntax($locale) - { - return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && $translator->trans('period_recurrences') !== 'period_recurrences' && $translator->trans('period_interval') !== 'period_interval' && $translator->trans('period_start_date') !== 'period_start_date' && $translator->trans('period_end_date') !== 'period_end_date'; - }); - } - /** - * Returns the list of internally available locales and already loaded custom locales. - * (It will ignore custom translator dynamic loading.) - * - * @return array - */ - public static function getAvailableLocales() - { - $translator = static::getLocaleAwareTranslator(); - return $translator instanceof Translator ? $translator->getAvailableLocales() : [$translator->getLocale()]; - } - /** - * Returns list of Language object for each available locale. This object allow you to get the ISO name, native - * name, region and variant of the locale. - * - * @return Language[] - */ - public static function getAvailableLocalesInfo() - { - $languages = []; - foreach (static::getAvailableLocales() as $id) { - $languages[$id] = new Language($id); - } - return $languages; - } - /** - * Initialize the default translator instance if necessary. - * - * @return \Symfony\Component\Translation\TranslatorInterface - */ - protected static function translator() - { - if (static::$translator === null) { - static::$translator = Translator::get(); - } - return static::$translator; - } - /** - * Get the locale of a given translator. - * - * If null or omitted, current local translator is used. - * If no local translator is in use, current global translator is used. - * - * @param null $translator - * - * @return string|null - */ - protected function getTranslatorLocale($translator = null) : ?string - { - if (\func_num_args() === 0) { - $translator = $this->getLocalTranslator(); - } - $translator = static::getLocaleAwareTranslator($translator); - return $translator ? $translator->getLocale() : null; - } - /** - * Throw an error if passed object is not LocaleAwareInterface. - * - * @param LocaleAwareInterface|null $translator - * - * @return LocaleAwareInterface|null - */ - protected static function getLocaleAwareTranslator($translator = null) - { - if (\func_num_args() === 0) { - $translator = static::translator(); - } - if ($translator && !($translator instanceof LocaleAwareInterface || \method_exists($translator, 'getLocale'))) { - throw new NotLocaleAwareException($translator); - // @codeCoverageIgnore - } - return $translator; - } - /** - * @param mixed $translator - * @param \Symfony\Component\Translation\MessageCatalogueInterface $catalogue - * - * @return mixed - */ - private static function getFromCatalogue($translator, $catalogue, string $id, string $domain = 'messages') - { - return $translator instanceof TranslatorStrongTypeInterface ? $translator->getFromCatalogue($catalogue, $id, $domain) : $catalogue->get($id, $domain); - } - /** - * Return the word cleaned from its translation codes. - * - * @param string $word - * - * @return string - */ - private static function cleanWordFromTranslationString($word) - { - $word = \str_replace([':count', '%count', ':time'], '', $word); - $word = \strtr($word, ['’' => "'"]); - $word = \preg_replace('/({\\d+(,(\\d+|Inf))?}|[\\[\\]]\\d+(,(\\d+|Inf))?[\\[\\]])/', '', $word); - return \trim($word); - } - /** - * Translate a list of words. - * - * @param string[] $keys keys to translate. - * @param string[] $messages messages bag handling translations. - * @param string $key 'to' (to get the translation) or 'from' (to get the detection RegExp pattern). - * - * @return string[] - */ - private static function translateWordsByKeys($keys, $messages, $key) : array - { - return \array_map(function ($wordKey) use($messages, $key) { - $message = $key === 'from' && isset($messages[$wordKey . '_regexp']) ? $messages[$wordKey . '_regexp'] : $messages[$wordKey] ?? null; - if (!$message) { - return '>>DO NOT REPLACE<<'; - } - $parts = \explode('|', $message); - return $key === 'to' ? self::cleanWordFromTranslationString(\end($parts)) : '(?:' . \implode('|', \array_map([static::class, 'cleanWordFromTranslationString'], $parts)) . ')'; - }, $keys); - } - /** - * Get an array of translations based on the current date. - * - * @param callable $translation - * @param int $length - * @param string $timeString - * - * @return string[] - */ - private static function getTranslationArray($translation, $length, $timeString) : array - { - $filler = '>>DO NOT REPLACE<<'; - if (\is_array($translation)) { - return \array_pad($translation, $length, $filler); - } - $list = []; - $date = static::now(); - for ($i = 0; $i < $length; $i++) { - $list[] = $translation($date, $timeString, $i) ?? $filler; - } - return $list; - } - private static function replaceOrdinalWords(string $timeString, array $ordinalWords) : string - { - return \preg_replace_callback('/(? - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -/** - * Trait Macros. - * - * Allows users to register macros within the Carbon class. - */ -trait Macro -{ - use Mixin; - /** - * The registered macros. - * - * @var array - */ - protected static $globalMacros = []; - /** - * The registered generic macros. - * - * @var array - */ - protected static $globalGenericMacros = []; - /** - * Register a custom macro. - * - * @example - * ``` - * $userSettings = [ - * 'locale' => 'pt', - * 'timezone' => 'America/Sao_Paulo', - * ]; - * Carbon::macro('userFormat', function () use ($userSettings) { - * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); - * }); - * echo Carbon::yesterday()->hours(11)->userFormat(); - * ``` - * - * @param string $name - * @param object|callable $macro - * - * @return void - */ - public static function macro($name, $macro) - { - static::$globalMacros[$name] = $macro; - } - /** - * Remove all macros and generic macros. - */ - public static function resetMacros() - { - static::$globalMacros = []; - static::$globalGenericMacros = []; - } - /** - * Register a custom macro. - * - * @param object|callable $macro - * @param int $priority marco with higher priority is tried first - * - * @return void - */ - public static function genericMacro($macro, $priority = 0) - { - if (!isset(static::$globalGenericMacros[$priority])) { - static::$globalGenericMacros[$priority] = []; - \krsort(static::$globalGenericMacros, \SORT_NUMERIC); - } - static::$globalGenericMacros[$priority][] = $macro; - } - /** - * Checks if macro is registered globally. - * - * @param string $name - * - * @return bool - */ - public static function hasMacro($name) - { - return isset(static::$globalMacros[$name]); - } - /** - * Get the raw callable macro registered globally for a given name. - * - * @param string $name - * - * @return callable|null - */ - public static function getMacro($name) - { - return static::$globalMacros[$name] ?? null; - } - /** - * Checks if macro is registered globally or locally. - * - * @param string $name - * - * @return bool - */ - public function hasLocalMacro($name) - { - return $this->localMacros && isset($this->localMacros[$name]) || static::hasMacro($name); - } - /** - * Get the raw callable macro registered globally or locally for a given name. - * - * @param string $name - * - * @return callable|null - */ - public function getLocalMacro($name) - { - return ($this->localMacros ?? [])[$name] ?? static::getMacro($name); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/MagicParameter.php b/dependencies/nesbot/carbon/src/Carbon/Traits/MagicParameter.php deleted file mode 100644 index 18dfdc5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/MagicParameter.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -/** - * Trait MagicParameter. - * - * Allows to retrieve parameter in magic calls by index or name. - */ -trait MagicParameter -{ - private function getMagicParameter(array $parameters, int $index, string $key, $default) - { - if (\array_key_exists($index, $parameters)) { - return $parameters[$index]; - } - if (\array_key_exists($key, $parameters)) { - return $parameters[$key]; - } - return $default; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Mixin.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Mixin.php deleted file mode 100644 index b63f256..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Mixin.php +++ /dev/null @@ -1,188 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonInterval; -use WP_Ultimo\Dependencies\Carbon\CarbonPeriod; -use Closure; -use Generator; -use ReflectionClass; -use ReflectionException; -use ReflectionMethod; -use Throwable; -/** - * Trait Mixin. - * - * Allows mixing in entire classes with multiple macros. - */ -trait Mixin -{ - /** - * Stack of macro instance contexts. - * - * @var array - */ - protected static $macroContextStack = []; - /** - * Mix another object into the class. - * - * @example - * ``` - * Carbon::mixin(new class { - * public function addMoon() { - * return function () { - * return $this->addDays(30); - * }; - * } - * public function subMoon() { - * return function () { - * return $this->subDays(30); - * }; - * } - * }); - * $fullMoon = Carbon::create('2018-12-22'); - * $nextFullMoon = $fullMoon->addMoon(); - * $blackMoon = Carbon::create('2019-01-06'); - * $previousBlackMoon = $blackMoon->subMoon(); - * echo "$nextFullMoon\n"; - * echo "$previousBlackMoon\n"; - * ``` - * - * @param object|string $mixin - * - * @throws ReflectionException - * - * @return void - */ - public static function mixin($mixin) - { - \is_string($mixin) && \trait_exists($mixin) ? self::loadMixinTrait($mixin) : self::loadMixinClass($mixin); - } - /** - * @param object|string $mixin - * - * @throws ReflectionException - */ - private static function loadMixinClass($mixin) - { - $methods = (new ReflectionClass($mixin))->getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED); - foreach ($methods as $method) { - if ($method->isConstructor() || $method->isDestructor()) { - continue; - } - $method->setAccessible(\true); - static::macro($method->name, $method->invoke($mixin)); - } - } - /** - * @param string $trait - */ - private static function loadMixinTrait($trait) - { - $context = eval(self::getAnonymousClassCodeForTrait($trait)); - $className = \get_class($context); - $baseClass = static::class; - foreach (self::getMixableMethods($context) as $name) { - $closureBase = Closure::fromCallable([$context, $name]); - static::macro($name, function (...$parameters) use($closureBase, $className, $baseClass) { - $downContext = isset($this) ? $this : new $baseClass(); - $context = isset($this) ? $this->cast($className) : new $className(); - try { - // @ is required to handle error if not converted into exceptions - $closure = @$closureBase->bindTo($context); - } catch (Throwable $throwable) { - // @codeCoverageIgnore - $closure = $closureBase; - // @codeCoverageIgnore - } - // in case of errors not converted into exceptions - $closure = $closure ?: $closureBase; - $result = $closure(...$parameters); - if (!$result instanceof $className) { - return $result; - } - if ($downContext instanceof CarbonInterface && $result instanceof CarbonInterface) { - if ($context !== $result) { - $downContext = $downContext->copy(); - } - return $downContext->setTimezone($result->getTimezone())->modify($result->format('Y-m-d H:i:s.u'))->settings($result->getSettings()); - } - if ($downContext instanceof CarbonInterval && $result instanceof CarbonInterval) { - if ($context !== $result) { - $downContext = $downContext->copy(); - } - $downContext->copyProperties($result); - self::copyStep($downContext, $result); - self::copyNegativeUnits($downContext, $result); - return $downContext->settings($result->getSettings()); - } - if ($downContext instanceof CarbonPeriod && $result instanceof CarbonPeriod) { - if ($context !== $result) { - $downContext = $downContext->copy(); - } - return $downContext->setDates($result->getStartDate(), $result->getEndDate())->setRecurrences($result->getRecurrences())->setOptions($result->getOptions())->settings($result->getSettings()); - } - return $result; - }); - } - } - private static function getAnonymousClassCodeForTrait(string $trait) - { - return 'return new class() extends ' . static::class . ' {use ' . $trait . ';};'; - } - private static function getMixableMethods(self $context) : Generator - { - foreach (\get_class_methods($context) as $name) { - if (\method_exists(static::class, $name)) { - continue; - } - (yield $name); - } - } - /** - * Stack a Carbon context from inside calls of self::this() and execute a given action. - * - * @param static|null $context - * @param callable $callable - * - * @throws Throwable - * - * @return mixed - */ - protected static function bindMacroContext($context, callable $callable) - { - static::$macroContextStack[] = $context; - try { - return $callable(); - } finally { - \array_pop(static::$macroContextStack); - } - } - /** - * Return the current context from inside a macro callee or a null if static. - * - * @return static|null - */ - protected static function context() - { - return \end(static::$macroContextStack) ?: null; - } - /** - * Return the current context from inside a macro callee or a new one if static. - * - * @return static - */ - protected static function this() - { - return \end(static::$macroContextStack) ?: new static(); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Modifiers.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Modifiers.php deleted file mode 100644 index 4bcd799..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Modifiers.php +++ /dev/null @@ -1,419 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use ReturnTypeWillChange; -/** - * Trait Modifiers. - * - * Returns dates relative to current date using modifier short-hand. - */ -trait Modifiers -{ - /** - * Midday/noon hour. - * - * @var int - */ - protected static $midDayAt = 12; - /** - * get midday/noon hour - * - * @return int - */ - public static function getMidDayAt() - { - return static::$midDayAt; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather consider mid-day is always 12pm, then if you need to test if it's an other - * hour, test it explicitly: - * $date->format('G') == 13 - * or to set explicitly to a given hour: - * $date->setTime(13, 0, 0, 0) - * - * Set midday/noon hour - * - * @param int $hour midday hour - * - * @return void - */ - public static function setMidDayAt($hour) - { - static::$midDayAt = $hour; - } - /** - * Modify to midday, default to self::$midDayAt - * - * @return static - */ - public function midDay() - { - return $this->setTime(static::$midDayAt, 0, 0, 0); - } - /** - * Modify to the next occurrence of a given modifier such as a day of - * the week. If no modifier is provided, modify to the next occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static|false - */ - public function next($modifier = null) - { - if ($modifier === null) { - $modifier = $this->dayOfWeek; - } - return $this->change('next ' . (\is_string($modifier) ? $modifier : static::$days[$modifier])); - } - /** - * Go forward or backward to the next week- or weekend-day. - * - * @param bool $weekday - * @param bool $forward - * - * @return static - */ - private function nextOrPreviousDay($weekday = \true, $forward = \true) - { - /** @var CarbonInterface $date */ - $date = $this; - $step = $forward ? 1 : -1; - do { - $date = $date->addDays($step); - } while ($weekday ? $date->isWeekend() : $date->isWeekday()); - return $date; - } - /** - * Go forward to the next weekday. - * - * @return static - */ - public function nextWeekday() - { - return $this->nextOrPreviousDay(); - } - /** - * Go backward to the previous weekday. - * - * @return static - */ - public function previousWeekday() - { - return $this->nextOrPreviousDay(\true, \false); - } - /** - * Go forward to the next weekend day. - * - * @return static - */ - public function nextWeekendDay() - { - return $this->nextOrPreviousDay(\false); - } - /** - * Go backward to the previous weekend day. - * - * @return static - */ - public function previousWeekendDay() - { - return $this->nextOrPreviousDay(\false, \false); - } - /** - * Modify to the previous occurrence of a given modifier such as a day of - * the week. If no dayOfWeek is provided, modify to the previous occurrence - * of the current day of the week. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param string|int|null $modifier - * - * @return static|false - */ - public function previous($modifier = null) - { - if ($modifier === null) { - $modifier = $this->dayOfWeek; - } - return $this->change('last ' . (\is_string($modifier) ? $modifier : static::$days[$modifier])); - } - /** - * Modify to the first occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * first day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function firstOfMonth($dayOfWeek = null) - { - $date = $this->startOfDay(); - if ($dayOfWeek === null) { - return $date->day(1); - } - return $date->modify('first ' . static::$days[$dayOfWeek] . ' of ' . $date->rawFormat('F') . ' ' . $date->year); - } - /** - * Modify to the last occurrence of a given day of the week - * in the current month. If no dayOfWeek is provided, modify to the - * last day of the current month. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek - * - * @return static - */ - public function lastOfMonth($dayOfWeek = null) - { - $date = $this->startOfDay(); - if ($dayOfWeek === null) { - return $date->day($date->daysInMonth); - } - return $date->modify('last ' . static::$days[$dayOfWeek] . ' of ' . $date->rawFormat('F') . ' ' . $date->year); - } - /** - * Modify to the given occurrence of a given day of the week - * in the current month. If the calculated occurrence is outside the scope - * of the current month, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfMonth($nth, $dayOfWeek) - { - $date = $this->avoidMutation()->firstOfMonth(); - $check = $date->rawFormat('Y-m'); - $date = $date->modify('+' . $nth . ' ' . static::$days[$dayOfWeek]); - return $date->rawFormat('Y-m') === $check ? $this->modify((string) $date) : \false; - } - /** - * Modify to the first occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * first day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfQuarter($dayOfWeek = null) - { - return $this->setDate($this->year, $this->quarter * static::MONTHS_PER_QUARTER - 2, 1)->firstOfMonth($dayOfWeek); - } - /** - * Modify to the last occurrence of a given day of the week - * in the current quarter. If no dayOfWeek is provided, modify to the - * last day of the current quarter. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfQuarter($dayOfWeek = null) - { - return $this->setDate($this->year, $this->quarter * static::MONTHS_PER_QUARTER, 1)->lastOfMonth($dayOfWeek); - } - /** - * Modify to the given occurrence of a given day of the week - * in the current quarter. If the calculated occurrence is outside the scope - * of the current quarter, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfQuarter($nth, $dayOfWeek) - { - $date = $this->avoidMutation()->day(1)->month($this->quarter * static::MONTHS_PER_QUARTER); - $lastMonth = $date->month; - $year = $date->year; - $date = $date->firstOfQuarter()->modify('+' . $nth . ' ' . static::$days[$dayOfWeek]); - return $lastMonth < $date->month || $year !== $date->year ? \false : $this->modify((string) $date); - } - /** - * Modify to the first occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * first day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function firstOfYear($dayOfWeek = null) - { - return $this->month(1)->firstOfMonth($dayOfWeek); - } - /** - * Modify to the last occurrence of a given day of the week - * in the current year. If no dayOfWeek is provided, modify to the - * last day of the current year. Use the supplied constants - * to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int|null $dayOfWeek day of the week default null - * - * @return static - */ - public function lastOfYear($dayOfWeek = null) - { - return $this->month(static::MONTHS_PER_YEAR)->lastOfMonth($dayOfWeek); - } - /** - * Modify to the given occurrence of a given day of the week - * in the current year. If the calculated occurrence is outside the scope - * of the current year, then return false and no modifications are made. - * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. - * - * @param int $nth - * @param int $dayOfWeek - * - * @return mixed - */ - public function nthOfYear($nth, $dayOfWeek) - { - $date = $this->avoidMutation()->firstOfYear()->modify('+' . $nth . ' ' . static::$days[$dayOfWeek]); - return $this->year === $date->year ? $this->modify((string) $date) : \false; - } - /** - * Modify the current instance to the average of a given instance (default now) and the current instance - * (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|null $date - * - * @return static - */ - public function average($date = null) - { - return $this->addRealMicroseconds((int) ($this->diffInRealMicroseconds($this->resolveCarbon($date), \false) / 2)); - } - /** - * Get the closest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function closest($date1, $date2) - { - return $this->diffInRealMicroseconds($date1) < $this->diffInRealMicroseconds($date2) ? $date1 : $date2; - } - /** - * Get the farthest date from the instance (second-precision). - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 - * - * @return static - */ - public function farthest($date1, $date2) - { - return $this->diffInRealMicroseconds($date1) > $this->diffInRealMicroseconds($date2) ? $date1 : $date2; - } - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function min($date = null) - { - $date = $this->resolveCarbon($date); - return $this->lt($date) ? $this : $date; - } - /** - * Get the minimum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see min() - * - * @return static - */ - public function minimum($date = null) - { - return $this->min($date); - } - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @return static - */ - public function max($date = null) - { - $date = $this->resolveCarbon($date); - return $this->gt($date) ? $this : $date; - } - /** - * Get the maximum instance between a given instance (default now) and the current instance. - * - * @param \Carbon\Carbon|\DateTimeInterface|mixed $date - * - * @see max() - * - * @return static - */ - public function maximum($date = null) - { - return $this->max($date); - } - /** - * Calls \DateTime::modify if mutable or \DateTimeImmutable::modify else. - * - * @see https://php.net/manual/en/datetime.modify.php - * - * @return static|false - */ - #[ReturnTypeWillChange] - public function modify($modify) - { - return parent::modify((string) $modify); - } - /** - * Similar to native modify() method of DateTime but can handle more grammars. - * - * @example - * ``` - * echo Carbon::now()->change('next 2pm'); - * ``` - * - * @link https://php.net/manual/en/datetime.modify.php - * - * @param string $modifier - * - * @return static|false - */ - public function change($modifier) - { - return $this->modify(\preg_replace_callback('/^(next|previous|last)\\s+(\\d{1,2}(h|am|pm|:\\d{1,2}(:\\d{1,2})?))$/i', function ($match) { - $match[2] = \str_replace('h', ':00', $match[2]); - $test = $this->avoidMutation()->modify($match[2]); - $method = $match[1] === 'next' ? 'lt' : 'gt'; - $match[1] = $test->{$method}($this) ? $match[1] . ' day' : 'today'; - return $match[1] . ' ' . $match[2]; - }, \strtr(\trim($modifier), [' at ' => ' ', 'just now' => 'now', 'after tomorrow' => 'tomorrow +1 day', 'before yesterday' => 'yesterday -1 day']))); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Mutability.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Mutability.php deleted file mode 100644 index 4116990..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Mutability.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Carbon; -use WP_Ultimo\Dependencies\Carbon\CarbonImmutable; -/** - * Trait Mutability. - * - * Utils to know if the current object is mutable or immutable and convert it. - */ -trait Mutability -{ - use Cast; - /** - * Returns true if the current class/instance is mutable. - * - * @return bool - */ - public static function isMutable() - { - return \false; - } - /** - * Returns true if the current class/instance is immutable. - * - * @return bool - */ - public static function isImmutable() - { - return !static::isMutable(); - } - /** - * Return a mutable copy of the instance. - * - * @return Carbon - */ - public function toMutable() - { - /** @var Carbon $date */ - $date = $this->cast(Carbon::class); - return $date; - } - /** - * Return a immutable copy of the instance. - * - * @return CarbonImmutable - */ - public function toImmutable() - { - /** @var CarbonImmutable $date */ - $date = $this->cast(CarbonImmutable::class); - return $date; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php b/dependencies/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php deleted file mode 100644 index 3758c5e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -trait ObjectInitialisation -{ - /** - * True when parent::__construct has been called. - * - * @var string - */ - protected $constructedObjectId; -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Options.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Options.php deleted file mode 100644 index 3c6f91c..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Options.php +++ /dev/null @@ -1,400 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use DateTimeInterface; -use Throwable; -/** - * Trait Options. - * - * Embed base methods to change settings of Carbon classes. - * - * Depends on the following methods: - * - * @method static shiftTimezone($timezone) Set the timezone - */ -trait Options -{ - use Localization; - /** - * Customizable PHP_INT_SIZE override. - * - * @var int - */ - public static $PHPIntSize = \PHP_INT_SIZE; - /** - * First day of week. - * - * @var int|string - */ - protected static $weekStartsAt = CarbonInterface::MONDAY; - /** - * Last day of week. - * - * @var int|string - */ - protected static $weekEndsAt = CarbonInterface::SUNDAY; - /** - * Days of weekend. - * - * @var array - */ - protected static $weekendDays = [CarbonInterface::SATURDAY, CarbonInterface::SUNDAY]; - /** - * Format regex patterns. - * - * @var array - */ - protected static $regexFormats = [ - 'd' => '(3[01]|[12][0-9]|0[1-9])', - 'D' => '(Sun|Mon|Tue|Wed|Thu|Fri|Sat)', - 'j' => '([123][0-9]|[1-9])', - 'l' => '([a-zA-Z]{2,})', - 'N' => '([1-7])', - 'S' => '(st|nd|rd|th)', - 'w' => '([0-6])', - 'z' => '(36[0-5]|3[0-5][0-9]|[12][0-9]{2}|[1-9]?[0-9])', - 'W' => '(5[012]|[1-4][0-9]|0?[1-9])', - 'F' => '([a-zA-Z]{2,})', - 'm' => '(1[012]|0[1-9])', - 'M' => '([a-zA-Z]{3})', - 'n' => '(1[012]|[1-9])', - 't' => '(2[89]|3[01])', - 'L' => '(0|1)', - 'o' => '([1-9][0-9]{0,4})', - 'Y' => '([1-9]?[0-9]{4})', - 'y' => '([0-9]{2})', - 'a' => '(am|pm)', - 'A' => '(AM|PM)', - 'B' => '([0-9]{3})', - 'g' => '(1[012]|[1-9])', - 'G' => '(2[0-3]|1?[0-9])', - 'h' => '(1[012]|0[1-9])', - 'H' => '(2[0-3]|[01][0-9])', - 'i' => '([0-5][0-9])', - 's' => '([0-5][0-9])', - 'u' => '([0-9]{1,6})', - 'v' => '([0-9]{1,3})', - 'e' => '([a-zA-Z]{1,5})|([a-zA-Z]*\\/[a-zA-Z]*)', - 'I' => '(0|1)', - 'O' => '([+-](1[012]|0[0-9])[0134][05])', - 'P' => '([+-](1[012]|0[0-9]):[0134][05])', - 'p' => '(Z|[+-](1[012]|0[0-9]):[0134][05])', - 'T' => '([a-zA-Z]{1,5})', - 'Z' => '(-?[1-5]?[0-9]{1,4})', - 'U' => '([0-9]*)', - // The formats below are combinations of the above formats. - 'c' => '(([1-9]?[0-9]{4})-(1[012]|0[1-9])-(3[01]|[12][0-9]|0[1-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])[+-](1[012]|0[0-9]):([0134][05]))', - // Y-m-dTH:i:sP - 'r' => '(([a-zA-Z]{3}), ([123][0-9]|0[1-9]) ([a-zA-Z]{3}) ([1-9]?[0-9]{4}) (2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9]) [+-](1[012]|0[0-9])([0134][05]))', - ]; - /** - * Format modifiers (such as available in createFromFormat) regex patterns. - * - * @var array - */ - protected static $regexFormatModifiers = ['*' => '.+', ' ' => '[ ]', '#' => '[;:\\/.,()-]', '?' => '([^a]|[a])', '!' => '', '|' => '', '+' => '']; - /** - * Indicates if months should be calculated with overflow. - * Global setting. - * - * @var bool - */ - protected static $monthsOverflow = \true; - /** - * Indicates if years should be calculated with overflow. - * Global setting. - * - * @var bool - */ - protected static $yearsOverflow = \true; - /** - * Indicates if the strict mode is in use. - * Global setting. - * - * @var bool - */ - protected static $strictModeEnabled = \true; - /** - * Function to call instead of format. - * - * @var string|callable|null - */ - protected static $formatFunction; - /** - * Function to call instead of createFromFormat. - * - * @var string|callable|null - */ - protected static $createFromFormatFunction; - /** - * Function to call instead of parse. - * - * @var string|callable|null - */ - protected static $parseFunction; - /** - * Indicates if months should be calculated with overflow. - * Specific setting. - * - * @var bool|null - */ - protected $localMonthsOverflow; - /** - * Indicates if years should be calculated with overflow. - * Specific setting. - * - * @var bool|null - */ - protected $localYearsOverflow; - /** - * Indicates if the strict mode is in use. - * Specific setting. - * - * @var bool|null - */ - protected $localStrictModeEnabled; - /** - * Options for diffForHumans and forHumans methods. - * - * @var bool|null - */ - protected $localHumanDiffOptions; - /** - * Format to use on string cast. - * - * @var string|null - */ - protected $localToStringFormat; - /** - * Format to use on JSON serialization. - * - * @var string|null - */ - protected $localSerializer; - /** - * Instance-specific macros. - * - * @var array|null - */ - protected $localMacros; - /** - * Instance-specific generic macros. - * - * @var array|null - */ - protected $localGenericMacros; - /** - * Function to call instead of format. - * - * @var string|callable|null - */ - protected $localFormatFunction; - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * @see settings - * - * Enable the strict mode (or disable with passing false). - * - * @param bool $strictModeEnabled - */ - public static function useStrictMode($strictModeEnabled = \true) - { - static::$strictModeEnabled = $strictModeEnabled; - } - /** - * Returns true if the strict mode is globally in use, false else. - * (It can be overridden in specific instances.) - * - * @return bool - */ - public static function isStrictModeEnabled() - { - return static::$strictModeEnabled; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if months should be calculated with overflow. - * - * @param bool $monthsOverflow - * - * @return void - */ - public static function useMonthsOverflow($monthsOverflow = \true) - { - static::$monthsOverflow = $monthsOverflow; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetMonthsOverflow() - { - static::$monthsOverflow = \true; - } - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowMonths() - { - return static::$monthsOverflow; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Indicates if years should be calculated with overflow. - * - * @param bool $yearsOverflow - * - * @return void - */ - public static function useYearsOverflow($yearsOverflow = \true) - { - static::$yearsOverflow = $yearsOverflow; - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather use the ->settings() method. - * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants - * are available for quarters, years, decade, centuries, millennia (singular and plural forms). - * @see settings - * - * Reset the month overflow behavior. - * - * @return void - */ - public static function resetYearsOverflow() - { - static::$yearsOverflow = \true; - } - /** - * Get the month overflow global behavior (can be overridden in specific instances). - * - * @return bool - */ - public static function shouldOverflowYears() - { - return static::$yearsOverflow; - } - /** - * Set specific options. - * - strictMode: true|false|null - * - monthOverflow: true|false|null - * - yearOverflow: true|false|null - * - humanDiffOptions: int|null - * - toStringFormat: string|Closure|null - * - toJsonFormat: string|Closure|null - * - locale: string|null - * - timezone: \DateTimeZone|string|int|null - * - macros: array|null - * - genericMacros: array|null - * - * @param array $settings - * - * @return $this|static - */ - public function settings(array $settings) - { - $this->localStrictModeEnabled = $settings['strictMode'] ?? null; - $this->localMonthsOverflow = $settings['monthOverflow'] ?? null; - $this->localYearsOverflow = $settings['yearOverflow'] ?? null; - $this->localHumanDiffOptions = $settings['humanDiffOptions'] ?? null; - $this->localToStringFormat = $settings['toStringFormat'] ?? null; - $this->localSerializer = $settings['toJsonFormat'] ?? null; - $this->localMacros = $settings['macros'] ?? null; - $this->localGenericMacros = $settings['genericMacros'] ?? null; - $this->localFormatFunction = $settings['formatFunction'] ?? null; - if (isset($settings['locale'])) { - $locales = $settings['locale']; - if (!\is_array($locales)) { - $locales = [$locales]; - } - $this->locale(...$locales); - } - if (isset($settings['innerTimezone'])) { - return $this->setTimezone($settings['innerTimezone']); - } - if (isset($settings['timezone'])) { - return $this->shiftTimezone($settings['timezone']); - } - return $this; - } - /** - * Returns current local settings. - * - * @return array - */ - public function getSettings() - { - $settings = []; - $map = ['localStrictModeEnabled' => 'strictMode', 'localMonthsOverflow' => 'monthOverflow', 'localYearsOverflow' => 'yearOverflow', 'localHumanDiffOptions' => 'humanDiffOptions', 'localToStringFormat' => 'toStringFormat', 'localSerializer' => 'toJsonFormat', 'localMacros' => 'macros', 'localGenericMacros' => 'genericMacros', 'locale' => 'locale', 'tzName' => 'timezone', 'localFormatFunction' => 'formatFunction']; - foreach ($map as $property => $key) { - $value = $this->{$property} ?? null; - if ($value !== null && ($key !== 'locale' || $value !== 'en' || $this->localTranslator)) { - $settings[$key] = $value; - } - } - return $settings; - } - /** - * Show truthy properties on var_dump(). - * - * @return array - */ - public function __debugInfo() - { - $infos = \array_filter(\get_object_vars($this), static function ($var) { - return $var; - }); - foreach (['dumpProperties', 'constructedObjectId', 'constructed'] as $property) { - if (isset($infos[$property])) { - unset($infos[$property]); - } - } - $this->addExtraDebugInfos($infos); - return $infos; - } - protected function addExtraDebugInfos(&$infos) : void - { - if ($this instanceof DateTimeInterface) { - try { - if (!isset($infos['date'])) { - $infos['date'] = $this->format(CarbonInterface::MOCK_DATETIME_FORMAT); - } - if (!isset($infos['timezone'])) { - $infos['timezone'] = $this->tzName; - } - } catch (Throwable $exception) { - // noop - } - } - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Rounding.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Rounding.php deleted file mode 100644 index 8e763df..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Rounding.php +++ /dev/null @@ -1,214 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnknownUnitException; -/** - * Trait Rounding. - * - * Round, ceil, floor units. - * - * Depends on the following methods: - * - * @method static copy() - * @method static startOfWeek(int $weekStartsAt = null) - */ -trait Rounding -{ - use IntervalRounding; - /** - * Round the current instance at the given unit with given precision if specified and the given function. - * - * @param string $unit - * @param float|int $precision - * @param string $function - * - * @return CarbonInterface - */ - public function roundUnit($unit, $precision = 1, $function = 'round') - { - $metaUnits = [ - // @call roundUnit - 'millennium' => [static::YEARS_PER_MILLENNIUM, 'year'], - // @call roundUnit - 'century' => [static::YEARS_PER_CENTURY, 'year'], - // @call roundUnit - 'decade' => [static::YEARS_PER_DECADE, 'year'], - // @call roundUnit - 'quarter' => [static::MONTHS_PER_QUARTER, 'month'], - // @call roundUnit - 'millisecond' => [1000, 'microsecond'], - ]; - $normalizedUnit = static::singularUnit($unit); - $ranges = \array_merge(static::getRangesByUnit($this->daysInMonth), [ - // @call roundUnit - 'microsecond' => [0, 999999], - ]); - $factor = 1; - $initialMonth = $this->month; - if ($normalizedUnit === 'week') { - $normalizedUnit = 'day'; - $precision *= static::DAYS_PER_WEEK; - } - if (isset($metaUnits[$normalizedUnit])) { - [$factor, $normalizedUnit] = $metaUnits[$normalizedUnit]; - } - $precision *= $factor; - if (!isset($ranges[$normalizedUnit])) { - throw new UnknownUnitException($unit); - } - $found = \false; - $fraction = 0; - $arguments = null; - $initialValue = null; - $factor = $this->year < 0 ? -1 : 1; - $changes = []; - $minimumInc = null; - foreach ($ranges as $unit => [$minimum, $maximum]) { - if ($normalizedUnit === $unit) { - $arguments = [$this->{$unit}, $minimum]; - $initialValue = $this->{$unit}; - $fraction = $precision - \floor($precision); - $found = \true; - continue; - } - if ($found) { - $delta = $maximum + 1 - $minimum; - $factor /= $delta; - $fraction *= $delta; - $inc = ($this->{$unit} - $minimum) * $factor; - if ($inc !== 0.0) { - $minimumInc = $minimumInc ?? $arguments[0] / \pow(2, 52); - // If value is still the same when adding a non-zero increment/decrement, - // it means precision got lost in the addition - if (\abs($inc) < $minimumInc) { - $inc = $minimumInc * ($inc < 0 ? -1 : 1); - } - // If greater than $precision, assume precision loss caused an overflow - if ($function !== 'floor' || \abs($arguments[0] + $inc - $initialValue) >= $precision) { - $arguments[0] += $inc; - } - } - $changes[$unit] = \round($minimum + ($fraction ? $fraction * $function(($this->{$unit} - $minimum) / $fraction) : 0)); - // Cannot use modulo as it lose double precision - while ($changes[$unit] >= $delta) { - $changes[$unit] -= $delta; - } - $fraction -= \floor($fraction); - } - } - [$value, $minimum] = $arguments; - $normalizedValue = \floor($function(($value - $minimum) / $precision) * $precision + $minimum); - /** @var CarbonInterface $result */ - $result = $this->{$normalizedUnit}($normalizedValue); - foreach ($changes as $unit => $value) { - $result = $result->{$unit}($value); - } - return $normalizedUnit === 'month' && $precision <= 1 && \abs($result->month - $initialMonth) === 2 ? $result->{$normalizedUnit}($normalizedValue) : $result; - } - /** - * Truncate the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int $precision - * - * @return CarbonInterface - */ - public function floorUnit($unit, $precision = 1) - { - return $this->roundUnit($unit, $precision, 'floor'); - } - /** - * Ceil the current instance at the given unit with given precision if specified. - * - * @param string $unit - * @param float|int $precision - * - * @return CarbonInterface - */ - public function ceilUnit($unit, $precision = 1) - { - return $this->roundUnit($unit, $precision, 'ceil'); - } - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|\DateInterval|null $precision - * @param string $function - * - * @return CarbonInterface - */ - public function round($precision = 1, $function = 'round') - { - return $this->roundWith($precision, $function); - } - /** - * Round the current instance second with given precision if specified. - * - * @param float|int|string|\DateInterval|null $precision - * - * @return CarbonInterface - */ - public function floor($precision = 1) - { - return $this->round($precision, 'floor'); - } - /** - * Ceil the current instance second with given precision if specified. - * - * @param float|int|string|\DateInterval|null $precision - * - * @return CarbonInterface - */ - public function ceil($precision = 1) - { - return $this->round($precision, 'ceil'); - } - /** - * Round the current instance week. - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return CarbonInterface - */ - public function roundWeek($weekStartsAt = null) - { - return $this->closest($this->avoidMutation()->floorWeek($weekStartsAt), $this->avoidMutation()->ceilWeek($weekStartsAt)); - } - /** - * Truncate the current instance week. - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return CarbonInterface - */ - public function floorWeek($weekStartsAt = null) - { - return $this->startOfWeek($weekStartsAt); - } - /** - * Ceil the current instance week. - * - * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week - * - * @return CarbonInterface - */ - public function ceilWeek($weekStartsAt = null) - { - if ($this->isMutable()) { - $startOfWeek = $this->avoidMutation()->startOfWeek($weekStartsAt); - return $startOfWeek != $this ? $this->startOfWeek($weekStartsAt)->addWeek() : $this; - } - $startOfWeek = $this->startOfWeek($weekStartsAt); - return $startOfWeek != $this ? $startOfWeek->addWeek() : $this->avoidMutation(); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Serialization.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Serialization.php deleted file mode 100644 index eef33aa..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Serialization.php +++ /dev/null @@ -1,269 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\InvalidFormatException; -use ReturnTypeWillChange; -use Throwable; -/** - * Trait Serialization. - * - * Serialization and JSON stuff. - * - * Depends on the following properties: - * - * @property int $year - * @property int $month - * @property int $daysInMonth - * @property int $quarter - * - * Depends on the following methods: - * - * @method string|static locale(string $locale = null, string ...$fallbackLocales) - * @method string toJSON() - */ -trait Serialization -{ - use ObjectInitialisation; - /** - * The custom Carbon JSON serializer. - * - * @var callable|null - */ - protected static $serializer; - /** - * List of key to use for dump/serialization. - * - * @var string[] - */ - protected $dumpProperties = ['date', 'timezone_type', 'timezone']; - /** - * Locale to dump comes here before serialization. - * - * @var string|null - */ - protected $dumpLocale; - /** - * Embed date properties to dump in a dedicated variables so it won't overlap native - * DateTime ones. - * - * @var array|null - */ - protected $dumpDateProperties; - /** - * Return a serialized string of the instance. - * - * @return string - */ - public function serialize() - { - return \serialize($this); - } - /** - * Create an instance from a serialized string. - * - * @param string $value - * - * @throws InvalidFormatException - * - * @return static - */ - public static function fromSerialized($value) - { - $instance = @\unserialize((string) $value); - if (!$instance instanceof static) { - throw new InvalidFormatException("Invalid serialized value: {$value}"); - } - return $instance; - } - /** - * The __set_state handler. - * - * @param string|array $dump - * - * @return static - */ - #[ReturnTypeWillChange] - public static function __set_state($dump) - { - if (\is_string($dump)) { - return static::parse($dump); - } - /** @var \DateTimeInterface $date */ - $date = \get_parent_class(static::class) && \method_exists(parent::class, '__set_state') ? parent::__set_state((array) $dump) : (object) $dump; - return static::instance($date); - } - /** - * Returns the list of properties to dump on serialize() called on. - * - * Only used by PHP < 7.4. - * - * @return array - */ - public function __sleep() - { - $properties = $this->getSleepProperties(); - if ($this->localTranslator ?? null) { - $properties[] = 'dumpLocale'; - $this->dumpLocale = $this->locale ?? null; - } - return $properties; - } - /** - * Returns the values to dump on serialize() called on. - * - * Only used by PHP >= 7.4. - * - * @return array - */ - public function __serialize() : array - { - // @codeCoverageIgnoreStart - if (isset($this->timezone_type, $this->timezone, $this->date)) { - return ['date' => $this->date ?? null, 'timezone_type' => $this->timezone_type, 'timezone' => $this->timezone ?? null]; - } - // @codeCoverageIgnoreEnd - $timezone = $this->getTimezone(); - $export = ['date' => $this->format('Y-m-d H:i:s.u'), 'timezone_type' => $timezone->getType(), 'timezone' => $timezone->getName()]; - // @codeCoverageIgnoreStart - if (\extension_loaded('msgpack') && isset($this->constructedObjectId)) { - $export['dumpDateProperties'] = ['date' => $this->format('Y-m-d H:i:s.u'), 'timezone' => \serialize($this->timezone ?? null)]; - } - // @codeCoverageIgnoreEnd - if ($this->localTranslator ?? null) { - $export['dumpLocale'] = $this->locale ?? null; - } - return $export; - } - /** - * Set locale if specified on unserialize() called. - * - * Only used by PHP < 7.4. - * - * @return void - */ - #[ReturnTypeWillChange] - public function __wakeup() - { - if (parent::class && \method_exists(parent::class, '__wakeup')) { - // @codeCoverageIgnoreStart - try { - parent::__wakeup(); - } catch (Throwable $exception) { - try { - // FatalError occurs when calling msgpack_unpack() in PHP 7.4 or later. - ['date' => $date, 'timezone' => $timezone] = $this->dumpDateProperties; - parent::__construct($date, \unserialize($timezone)); - } catch (Throwable $ignoredException) { - throw $exception; - } - } - // @codeCoverageIgnoreEnd - } - $this->constructedObjectId = \spl_object_hash($this); - if (isset($this->dumpLocale)) { - $this->locale($this->dumpLocale); - $this->dumpLocale = null; - } - $this->cleanupDumpProperties(); - } - /** - * Set locale if specified on unserialize() called. - * - * Only used by PHP >= 7.4. - * - * @return void - */ - public function __unserialize(array $data) : void - { - // @codeCoverageIgnoreStart - try { - $this->__construct($data['date'] ?? null, $data['timezone'] ?? null); - } catch (Throwable $exception) { - if (!isset($data['dumpDateProperties']['date'], $data['dumpDateProperties']['timezone'])) { - throw $exception; - } - try { - // FatalError occurs when calling msgpack_unpack() in PHP 7.4 or later. - ['date' => $date, 'timezone' => $timezone] = $data['dumpDateProperties']; - $this->__construct($date, \unserialize($timezone)); - } catch (Throwable $ignoredException) { - throw $exception; - } - } - // @codeCoverageIgnoreEnd - if (isset($data['dumpLocale'])) { - $this->locale($data['dumpLocale']); - } - } - /** - * Prepare the object for JSON serialization. - * - * @return array|string - */ - #[ReturnTypeWillChange] - public function jsonSerialize() - { - $serializer = $this->localSerializer ?? static::$serializer; - if ($serializer) { - return \is_string($serializer) ? $this->rawFormat($serializer) : $serializer($this); - } - return $this->toJSON(); - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather transform Carbon object before the serialization. - * - * JSON serialize all Carbon instances using the given callback. - * - * @param callable $callback - * - * @return void - */ - public static function serializeUsing($callback) - { - static::$serializer = $callback; - } - /** - * Cleanup properties attached to the public scope of DateTime when a dump of the date is requested. - * foreach ($date as $_) {} - * serializer($date) - * var_export($date) - * get_object_vars($date) - */ - public function cleanupDumpProperties() - { - // @codeCoverageIgnoreStart - if (\PHP_VERSION < 8.199999999999999) { - foreach ($this->dumpProperties as $property) { - if (isset($this->{$property})) { - unset($this->{$property}); - } - } - } - // @codeCoverageIgnoreEnd - return $this; - } - private function getSleepProperties() : array - { - $properties = $this->dumpProperties; - // @codeCoverageIgnoreStart - if (!\extension_loaded('msgpack')) { - return $properties; - } - if (isset($this->constructedObjectId)) { - $this->dumpDateProperties = ['date' => $this->format('Y-m-d H:i:s.u'), 'timezone' => \serialize($this->timezone ?? null)]; - $properties[] = 'dumpDateProperties'; - } - return $properties; - // @codeCoverageIgnoreEnd - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Test.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Test.php deleted file mode 100644 index f484a54..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Test.php +++ /dev/null @@ -1,186 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonTimeZone; -use Closure; -use DateTimeImmutable; -use DateTimeInterface; -use InvalidArgumentException; -use Throwable; -trait Test -{ - /////////////////////////////////////////////////////////////////// - ///////////////////////// TESTING AIDS //////////////////////////// - /////////////////////////////////////////////////////////////////// - /** - * A test Carbon instance to be returned when now instances are created. - * - * @var Closure|static|null - */ - protected static $testNow; - /** - * The timezone to resto to when clearing the time mock. - * - * @var string|null - */ - protected static $testDefaultTimezone; - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * - * Only the moment is mocked with setTestNow(), the timezone will still be the one passed - * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNow($testNow = null) - { - static::$testNow = $testNow instanceof self || $testNow instanceof Closure ? $testNow : static::make($testNow); - } - /** - * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned - * specifically under the following conditions: - * - A call to the static now() method, ex. Carbon::now() - * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) - * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') - * - When a string containing the desired time is passed to Carbon::parse(). - * - * It will also align default timezone (e.g. call date_default_timezone_set()) with - * the second argument or if null, with the timezone of the given date object. - * - * To clear the test instance call this method using the default - * parameter of null. - * - * /!\ Use this method for unit tests only. - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - */ - public static function setTestNowAndTimezone($testNow = null, $tz = null) - { - if ($testNow) { - self::$testDefaultTimezone = self::$testDefaultTimezone ?? \date_default_timezone_get(); - } - $useDateInstanceTimezone = $testNow instanceof DateTimeInterface; - if ($useDateInstanceTimezone) { - self::setDefaultTimezone($testNow->getTimezone()->getName(), $testNow); - } - static::setTestNow($testNow); - if (!$useDateInstanceTimezone) { - $now = static::getMockedTestNow(\func_num_args() === 1 ? null : $tz); - $tzName = $now ? $now->tzName : null; - self::setDefaultTimezone($tzName ?? self::$testDefaultTimezone ?? 'UTC', $now); - } - if (!$testNow) { - self::$testDefaultTimezone = null; - } - } - /** - * Temporarily sets a static date to be used within the callback. - * Using setTestNow to set the date, executing the callback, then - * clearing the test instance. - * - * /!\ Use this method for unit tests only. - * - * @template T - * - * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance - * @param Closure(): T $callback - * - * @return mixed - * @phpstan-return T - */ - public static function withTestNow($testNow, $callback) - { - static::setTestNow($testNow); - try { - $result = $callback(); - } finally { - static::setTestNow(); - } - return $result; - } - /** - * Get the Carbon instance (real or mock) to be returned when a "now" - * instance is created. - * - * @return Closure|static the current instance used for testing - */ - public static function getTestNow() - { - return static::$testNow; - } - /** - * Determine if there is a valid test instance set. A valid test instance - * is anything that is not null. - * - * @return bool true if there is a test instance, otherwise false - */ - public static function hasTestNow() - { - return static::getTestNow() !== null; - } - /** - * Get the mocked date passed in setTestNow() and if it's a Closure, execute it. - * - * @param string|\DateTimeZone $tz - * - * @return \Carbon\CarbonImmutable|\Carbon\Carbon|null - */ - protected static function getMockedTestNow($tz) - { - $testNow = static::getTestNow(); - if ($testNow instanceof Closure) { - $realNow = new DateTimeImmutable('now'); - $testNow = $testNow(static::parse($realNow->format('Y-m-d H:i:s.u'), $tz ?: $realNow->getTimezone())); - } - /* @var \Carbon\CarbonImmutable|\Carbon\Carbon|null $testNow */ - return $testNow instanceof CarbonInterface ? $testNow->avoidMutation()->tz($tz) : $testNow; - } - protected static function mockConstructorParameters(&$time, $tz) - { - /** @var \Carbon\CarbonImmutable|\Carbon\Carbon $testInstance */ - $testInstance = clone static::getMockedTestNow($tz); - if (static::hasRelativeKeywords($time)) { - $testInstance = $testInstance->modify($time); - } - $time = $testInstance instanceof self ? $testInstance->rawFormat(static::MOCK_DATETIME_FORMAT) : $testInstance->format(static::MOCK_DATETIME_FORMAT); - } - private static function setDefaultTimezone($timezone, DateTimeInterface $date = null) - { - $previous = null; - $success = \false; - try { - $success = \date_default_timezone_set($timezone); - } catch (Throwable $exception) { - $previous = $exception; - } - if (!$success) { - $suggestion = @CarbonTimeZone::create($timezone)->toRegionName($date); - throw new InvalidArgumentException("Timezone ID '{$timezone}' is invalid" . ($suggestion && $suggestion !== $timezone ? ", did you mean '{$suggestion}'?" : '.') . "\n" . "It must be one of the IDs from DateTimeZone::listIdentifiers(),\n" . 'For the record, hours/minutes offset are relevant only for a particular moment, ' . 'but not as a default timezone.', 0, $previous); - } - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Timestamp.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Timestamp.php deleted file mode 100644 index beaedde..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Timestamp.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -/** - * Trait Timestamp. - */ -trait Timestamp -{ - /** - * Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * @param \DateTimeZone|string|null $tz - * - * @return static - */ - public static function createFromTimestamp($timestamp, $tz = null) - { - return static::createFromTimestampUTC($timestamp)->setTimezone($tz); - } - /** - * Create a Carbon instance from an timestamp keeping the timezone to UTC. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * - * @return static - */ - public static function createFromTimestampUTC($timestamp) - { - [$integer, $decimal] = self::getIntegerAndDecimalParts($timestamp); - $delta = \floor($decimal / static::MICROSECONDS_PER_SECOND); - $integer += $delta; - $decimal -= $delta * static::MICROSECONDS_PER_SECOND; - $decimal = \str_pad((string) $decimal, 6, '0', \STR_PAD_LEFT); - return static::rawCreateFromFormat('U u', "{$integer} {$decimal}"); - } - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * - * @return static - */ - public static function createFromTimestampMsUTC($timestamp) - { - [$milliseconds, $microseconds] = self::getIntegerAndDecimalParts($timestamp, 3); - $sign = $milliseconds < 0 || $milliseconds === 0.0 && $microseconds < 0 ? -1 : 1; - $milliseconds = \abs($milliseconds); - $microseconds = $sign * \abs($microseconds) + static::MICROSECONDS_PER_MILLISECOND * ($milliseconds % static::MILLISECONDS_PER_SECOND); - $seconds = $sign * \floor($milliseconds / static::MILLISECONDS_PER_SECOND); - $delta = \floor($microseconds / static::MICROSECONDS_PER_SECOND); - $seconds += $delta; - $microseconds -= $delta * static::MICROSECONDS_PER_SECOND; - $microseconds = \str_pad($microseconds, 6, '0', \STR_PAD_LEFT); - return static::rawCreateFromFormat('U u', "{$seconds} {$microseconds}"); - } - /** - * Create a Carbon instance from a timestamp in milliseconds. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $timestamp - * @param \DateTimeZone|string|null $tz - * - * @return static - */ - public static function createFromTimestampMs($timestamp, $tz = null) - { - return static::createFromTimestampMsUTC($timestamp)->setTimezone($tz); - } - /** - * Set the instance's timestamp. - * - * Timestamp input can be given as int, float or a string containing one or more numbers. - * - * @param float|int|string $unixTimestamp - * - * @return static - */ - public function timestamp($unixTimestamp) - { - return $this->setTimestamp($unixTimestamp); - } - /** - * Returns a timestamp rounded with the given precision (6 by default). - * - * @example getPreciseTimestamp() 1532087464437474 (microsecond maximum precision) - * @example getPreciseTimestamp(6) 1532087464437474 - * @example getPreciseTimestamp(5) 153208746443747 (1/100000 second precision) - * @example getPreciseTimestamp(4) 15320874644375 (1/10000 second precision) - * @example getPreciseTimestamp(3) 1532087464437 (millisecond precision) - * @example getPreciseTimestamp(2) 153208746444 (1/100 second precision) - * @example getPreciseTimestamp(1) 15320874644 (1/10 second precision) - * @example getPreciseTimestamp(0) 1532087464 (second precision) - * @example getPreciseTimestamp(-1) 153208746 (10 second precision) - * @example getPreciseTimestamp(-2) 15320875 (100 second precision) - * - * @param int $precision - * - * @return float - */ - public function getPreciseTimestamp($precision = 6) - { - return \round((float) $this->rawFormat('Uu') / \pow(10, 6 - $precision)); - } - /** - * Returns the milliseconds timestamps used amongst other by Date javascript objects. - * - * @return float - */ - public function valueOf() - { - return $this->getPreciseTimestamp(3); - } - /** - * Returns the timestamp with millisecond precision. - * - * @return int - */ - public function getTimestampMs() - { - return (int) $this->getPreciseTimestamp(3); - } - /** - * @alias getTimestamp - * - * Returns the UNIX timestamp for the current date. - * - * @return int - */ - public function unix() - { - return $this->getTimestamp(); - } - /** - * Return an array with integer part digits and decimals digits split from one or more positive numbers - * (such as timestamps) as string with the given number of decimals (6 by default). - * - * By splitting integer and decimal, this method obtain a better precision than - * number_format when the input is a string. - * - * @param float|int|string $numbers one or more numbers - * @param int $decimals number of decimals precision (6 by default) - * - * @return array 0-index is integer part, 1-index is decimal part digits - */ - private static function getIntegerAndDecimalParts($numbers, $decimals = 6) - { - if (\is_int($numbers) || \is_float($numbers)) { - $numbers = \number_format($numbers, $decimals, '.', ''); - } - $sign = \str_starts_with($numbers, '-') ? -1 : 1; - $integer = 0; - $decimal = 0; - foreach (\preg_split('`[^\\d.]+`', $numbers) as $chunk) { - [$integerPart, $decimalPart] = \explode('.', "{$chunk}."); - $integer += (int) $integerPart; - $decimal += (float) "0.{$decimalPart}"; - } - $overflow = \floor($decimal); - $integer += $overflow; - $decimal -= $overflow; - return [$sign * $integer, $decimal === 0.0 ? 0.0 : $sign * \round($decimal * \pow(10, $decimals))]; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php b/dependencies/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php deleted file mode 100644 index 5de708e..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use Closure; -/** - * Trait ToStringFormat. - * - * Handle global format customization for string cast of the object. - */ -trait ToStringFormat -{ - /** - * Format to use for __toString method when type juggling occurs. - * - * @var string|Closure|null - */ - protected static $toStringFormat; - /** - * Reset the format used to the default when type juggling a Carbon instance to a string - * - * @return void - */ - public static function resetToStringFormat() - { - static::setToStringFormat(null); - } - /** - * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. - * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and - * use other method or custom format passed to format() method if you need to dump another string - * format. - * - * Set the default format used when type juggling a Carbon instance to a string. - * - * @param string|Closure|null $format - * - * @return void - */ - public static function setToStringFormat($format) - { - static::$toStringFormat = $format; - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Units.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Units.php deleted file mode 100644 index fef1bcb..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Units.php +++ /dev/null @@ -1,335 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -use WP_Ultimo\Dependencies\Carbon\CarbonConverterInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonInterface; -use WP_Ultimo\Dependencies\Carbon\CarbonInterval; -use WP_Ultimo\Dependencies\Carbon\Exceptions\UnitException; -use Closure; -use DateInterval; -use WP_Ultimo\Dependencies\DateMalformedStringException; -use ReturnTypeWillChange; -/** - * Trait Units. - * - * Add, subtract and set units. - */ -trait Units -{ - /** - * Add seconds to the instance using timestamp. Positive $value travels - * forward while negative $value travels into the past. - * - * @param string $unit - * @param int $value - * - * @return static - */ - public function addRealUnit($unit, $value = 1) - { - switch ($unit) { - // @call addRealUnit - case 'micro': - // @call addRealUnit - case 'microsecond': - /* @var CarbonInterface $this */ - $diff = $this->microsecond + $value; - $time = $this->getTimestamp(); - $seconds = (int) \floor($diff / static::MICROSECONDS_PER_SECOND); - $time += $seconds; - $diff -= $seconds * static::MICROSECONDS_PER_SECOND; - $microtime = \str_pad((string) $diff, 6, '0', \STR_PAD_LEFT); - $tz = $this->tz; - return $this->tz('UTC')->modify("@{$time}.{$microtime}")->tz($tz); - // @call addRealUnit - case 'milli': - // @call addRealUnit - case 'millisecond': - return $this->addRealUnit('microsecond', $value * static::MICROSECONDS_PER_MILLISECOND); - // @call addRealUnit - case 'second': - break; - // @call addRealUnit - case 'minute': - $value *= static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'hour': - $value *= static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'day': - $value *= static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'week': - $value *= static::DAYS_PER_WEEK * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'month': - $value *= 30 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'quarter': - $value *= static::MONTHS_PER_QUARTER * 30 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'year': - $value *= 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'decade': - $value *= static::YEARS_PER_DECADE * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'century': - $value *= static::YEARS_PER_CENTURY * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - // @call addRealUnit - case 'millennium': - $value *= static::YEARS_PER_MILLENNIUM * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; - break; - default: - if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { - throw new UnitException("Invalid unit for real timestamp add/sub: '{$unit}'"); - } - return $this; - } - /* @var CarbonInterface $this */ - return $this->setTimestamp((int) ($this->getTimestamp() + $value)); - } - public function subRealUnit($unit, $value = 1) - { - return $this->addRealUnit($unit, -$value); - } - /** - * Returns true if a property can be changed via setter. - * - * @param string $unit - * - * @return bool - */ - public static function isModifiableUnit($unit) - { - static $modifiableUnits = [ - // @call addUnit - 'millennium', - // @call addUnit - 'century', - // @call addUnit - 'decade', - // @call addUnit - 'quarter', - // @call addUnit - 'week', - // @call addUnit - 'weekday', - ]; - return \in_array($unit, $modifiableUnits, \true) || \in_array($unit, static::$units, \true); - } - /** - * Call native PHP DateTime/DateTimeImmutable add() method. - * - * @param DateInterval $interval - * - * @return static - */ - public function rawAdd(DateInterval $interval) - { - return parent::add($interval); - } - /** - * Add given units or interval to the current instance. - * - * @example $date->add('hour', 3) - * @example $date->add(15, 'days') - * @example $date->add(CarbonInterval::days(4)) - * - * @param string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function add($unit, $value = 1, $overflow = null) - { - if (\is_string($unit) && \func_num_args() === 1) { - $unit = CarbonInterval::make($unit, [], \true); - } - if ($unit instanceof CarbonConverterInterface) { - return $this->resolveCarbon($unit->convertDate($this, \false)); - } - if ($unit instanceof Closure) { - return $this->resolveCarbon($unit($this, \false)); - } - if ($unit instanceof DateInterval) { - return parent::add($unit); - } - if (\is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - return $this->addUnit($unit, $value, $overflow); - } - /** - * Add given units to the current instance. - * - * @param string $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - public function addUnit($unit, $value = 1, $overflow = null) - { - $originalArgs = \func_get_args(); - $date = $this; - if (!\is_numeric($value) || !(float) $value) { - return $date->isMutable() ? $date : $date->avoidMutation(); - } - $unit = self::singularUnit($unit); - $metaUnits = ['millennium' => [static::YEARS_PER_MILLENNIUM, 'year'], 'century' => [static::YEARS_PER_CENTURY, 'year'], 'decade' => [static::YEARS_PER_DECADE, 'year'], 'quarter' => [static::MONTHS_PER_QUARTER, 'month']]; - if (isset($metaUnits[$unit])) { - [$factor, $unit] = $metaUnits[$unit]; - $value *= $factor; - } - if ($unit === 'weekday') { - $weekendDays = static::getWeekendDays(); - if ($weekendDays !== [static::SATURDAY, static::SUNDAY]) { - $absoluteValue = \abs($value); - $sign = $value / \max(1, $absoluteValue); - $weekDaysCount = 7 - \min(6, \count(\array_unique($weekendDays))); - $weeks = \floor($absoluteValue / $weekDaysCount); - for ($diff = $absoluteValue % $weekDaysCount; $diff; $diff--) { - /** @var static $date */ - $date = $date->addDays($sign); - while (\in_array($date->dayOfWeek, $weekendDays, \true)) { - $date = $date->addDays($sign); - } - } - $value = $weeks * $sign; - $unit = 'week'; - } - $timeString = $date->toTimeString(); - } elseif ($canOverflow = \in_array($unit, ['month', 'year']) && ($overflow === \false || $overflow === null && ($ucUnit = \ucfirst($unit) . 's') && !($this->{'local' . $ucUnit . 'Overflow'} ?? static::{'shouldOverflow' . $ucUnit}()))) { - $day = $date->day; - } - $value = (int) $value; - if ($unit === 'milli' || $unit === 'millisecond') { - $unit = 'microsecond'; - $value *= static::MICROSECONDS_PER_MILLISECOND; - } - // Work-around for bug https://bugs.php.net/bug.php?id=75642 - if ($unit === 'micro' || $unit === 'microsecond') { - $microseconds = $this->micro + $value; - $second = (int) \floor($microseconds / static::MICROSECONDS_PER_SECOND); - $microseconds %= static::MICROSECONDS_PER_SECOND; - if ($microseconds < 0) { - $microseconds += static::MICROSECONDS_PER_SECOND; - } - $date = $date->microseconds($microseconds); - $unit = 'second'; - $value = $second; - } - try { - $date = $date->modify("{$value} {$unit}"); - if (isset($timeString)) { - $date = $date->setTimeFromTimeString($timeString); - } elseif (isset($canOverflow, $day) && $canOverflow && $day !== $date->day) { - $date = $date->modify('last day of previous month'); - } - } catch (DateMalformedStringException $ignoredException) { - // @codeCoverageIgnore - $date = null; - // @codeCoverageIgnore - } - if (!$date) { - throw new UnitException('Unable to add unit ' . \var_export($originalArgs, \true)); - } - return $date; - } - /** - * Subtract given units to the current instance. - * - * @param string $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - public function subUnit($unit, $value = 1, $overflow = null) - { - return $this->addUnit($unit, -$value, $overflow); - } - /** - * Call native PHP DateTime/DateTimeImmutable sub() method. - * - * @param DateInterval $interval - * - * @return static - */ - public function rawSub(DateInterval $interval) - { - return parent::sub($interval); - } - /** - * Subtract given units or interval to the current instance. - * - * @example $date->sub('hour', 3) - * @example $date->sub(15, 'days') - * @example $date->sub(CarbonInterval::days(4)) - * - * @param string|DateInterval|Closure|CarbonConverterInterface $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - #[ReturnTypeWillChange] - public function sub($unit, $value = 1, $overflow = null) - { - if (\is_string($unit) && \func_num_args() === 1) { - $unit = CarbonInterval::make($unit, [], \true); - } - if ($unit instanceof CarbonConverterInterface) { - return $this->resolveCarbon($unit->convertDate($this, \true)); - } - if ($unit instanceof Closure) { - return $this->resolveCarbon($unit($this, \true)); - } - if ($unit instanceof DateInterval) { - return parent::sub($unit); - } - if (\is_numeric($unit)) { - [$value, $unit] = [$unit, $value]; - } - return $this->addUnit($unit, -(float) $value, $overflow); - } - /** - * Subtract given units or interval to the current instance. - * - * @see sub() - * - * @param string|DateInterval $unit - * @param int $value - * @param bool|null $overflow - * - * @return static - */ - public function subtract($unit, $value = 1, $overflow = null) - { - if (\is_string($unit) && \func_num_args() === 1) { - $unit = CarbonInterval::make($unit, [], \true); - } - return $this->sub($unit, $value, $overflow); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Traits/Week.php b/dependencies/nesbot/carbon/src/Carbon/Traits/Week.php deleted file mode 100644 index 62723d5..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Traits/Week.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon\Traits; - -/** - * Trait Week. - * - * week and ISO week number, year and count in year. - * - * Depends on the following properties: - * - * @property int $daysInYear - * @property int $dayOfWeek - * @property int $dayOfYear - * @property int $year - * - * Depends on the following methods: - * - * @method static addWeeks(int $weeks = 1) - * @method static copy() - * @method static dayOfYear(int $dayOfYear) - * @method string getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null) - * @method static next(int|string $day = null) - * @method static startOfWeek(int $day = 1) - * @method static subWeeks(int $weeks = 1) - * @method static year(int $year = null) - */ -trait Week -{ - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function isoWeekYear($year = null, $dayOfWeek = null, $dayOfYear = null) - { - return $this->weekYear($year, $dayOfWeek ?? 1, $dayOfYear ?? 4); - } - /** - * Set/get the week number of year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int|static - */ - public function weekYear($year = null, $dayOfWeek = null, $dayOfYear = null) - { - $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; - $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; - if ($year !== null) { - $year = (int) \round($year); - if ($this->weekYear(null, $dayOfWeek, $dayOfYear) === $year) { - return $this->avoidMutation(); - } - $week = $this->week(null, $dayOfWeek, $dayOfYear); - $day = $this->dayOfWeek; - $date = $this->year($year); - switch ($date->weekYear(null, $dayOfWeek, $dayOfYear) - $year) { - case 1: - $date = $date->subWeeks(26); - break; - case -1: - $date = $date->addWeeks(26); - break; - } - $date = $date->addWeeks($week - $date->week(null, $dayOfWeek, $dayOfYear))->startOfWeek($dayOfWeek); - if ($date->dayOfWeek === $day) { - return $date; - } - return $date->next($day); - } - $year = $this->year; - $day = $this->dayOfYear; - $date = $this->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - if ($date->year === $year && $day < $date->dayOfYear) { - return $year - 1; - } - $date = $this->avoidMutation()->addYear()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - if ($date->year === $year && $day >= $date->dayOfYear) { - return $year + 1; - } - return $year; - } - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function isoWeeksInYear($dayOfWeek = null, $dayOfYear = null) - { - return $this->weeksInYear($dayOfWeek ?? 1, $dayOfYear ?? 4); - } - /** - * Get the number of weeks of the current week-year using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) - * @param int|null $dayOfYear first day of year included in the week #1 - * - * @return int - */ - public function weeksInYear($dayOfWeek = null, $dayOfYear = null) - { - $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; - $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; - $year = $this->year; - $start = $this->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - $startDay = $start->dayOfYear; - if ($start->year !== $year) { - $startDay -= $start->daysInYear; - } - $end = $this->avoidMutation()->addYear()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - $endDay = $end->dayOfYear; - if ($end->year !== $year) { - $endDay += $this->daysInYear; - } - return (int) \round(($endDay - $startDay) / 7); - } - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use US format if no settings - * given (Sunday / Jan 6). - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function week($week = null, $dayOfWeek = null, $dayOfYear = null) - { - $date = $this; - $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; - $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; - if ($week !== null) { - return $date->addWeeks(\round($week) - $this->week(null, $dayOfWeek, $dayOfYear)); - } - $start = $date->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - $end = $date->avoidMutation()->startOfWeek($dayOfWeek); - if ($start > $end) { - $start = $start->subWeeks(26)->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); - } - $week = (int) ($start->diffInDays($end) / 7 + 1); - return $week > $end->weeksInYear($dayOfWeek, $dayOfYear) ? 1 : $week; - } - /** - * Get/set the week number using given first day of week and first - * day of year included in the first week. Or use ISO format if no settings - * given. - * - * @param int|null $week - * @param int|null $dayOfWeek - * @param int|null $dayOfYear - * - * @return int|static - */ - public function isoWeek($week = null, $dayOfWeek = null, $dayOfYear = null) - { - return $this->week($week, $dayOfWeek ?? 1, $dayOfYear ?? 4); - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/Translator.php b/dependencies/nesbot/carbon/src/Carbon/Translator.php deleted file mode 100644 index 4e2d5d9..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/Translator.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use ReflectionMethod; -use WP_Ultimo\Dependencies\Symfony\Component\Translation; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -$transMethod = new ReflectionMethod(\class_exists(TranslatorInterface::class) ? TranslatorInterface::class : Translation\Translator::class, 'trans'); -require $transMethod->hasReturnType() ? __DIR__ . '/../../lazy/Carbon/TranslatorStrongType.php' : __DIR__ . '/../../lazy/Carbon/TranslatorWeakType.php'; -class Translator extends LazyTranslator -{ - // Proxy dynamically loaded LazyTranslator in a static way -} diff --git a/dependencies/nesbot/carbon/src/Carbon/TranslatorImmutable.php b/dependencies/nesbot/carbon/src/Carbon/TranslatorImmutable.php deleted file mode 100644 index 13398f2..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/TranslatorImmutable.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use WP_Ultimo\Dependencies\Carbon\Exceptions\ImmutableException; -use WP_Ultimo\Dependencies\Symfony\Component\Config\ConfigCacheFactoryInterface; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -class TranslatorImmutable extends Translator -{ - /** @var bool */ - private $constructed = \false; - public function __construct($locale, MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = \false) - { - parent::__construct($locale, $formatter, $cacheDir, $debug); - $this->constructed = \true; - } - /** - * @codeCoverageIgnore - */ - public function setDirectories(array $directories) - { - $this->disallowMutation(__METHOD__); - return parent::setDirectories($directories); - } - public function setLocale($locale) - { - $this->disallowMutation(__METHOD__); - return parent::setLocale($locale); - } - /** - * @codeCoverageIgnore - */ - public function setMessages($locale, $messages) - { - $this->disallowMutation(__METHOD__); - return parent::setMessages($locale, $messages); - } - /** - * @codeCoverageIgnore - */ - public function setTranslations($messages) - { - $this->disallowMutation(__METHOD__); - return parent::setTranslations($messages); - } - /** - * @codeCoverageIgnore - */ - public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) - { - $this->disallowMutation(__METHOD__); - parent::setConfigCacheFactory($configCacheFactory); - } - public function resetMessages($locale = null) - { - $this->disallowMutation(__METHOD__); - return parent::resetMessages($locale); - } - /** - * @codeCoverageIgnore - */ - public function setFallbackLocales(array $locales) - { - $this->disallowMutation(__METHOD__); - parent::setFallbackLocales($locales); - } - private function disallowMutation($method) - { - if ($this->constructed) { - throw new ImmutableException($method . ' not allowed on ' . static::class); - } - } -} diff --git a/dependencies/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php b/dependencies/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php deleted file mode 100644 index 2a0c668..0000000 --- a/dependencies/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Carbon; - -use Symfony\Component\Translation\MessageCatalogueInterface; -/** - * Mark translator using strong type from symfony/translation >= 6. - */ -interface TranslatorStrongTypeInterface -{ - public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages'); -} diff --git a/dependencies/nyholm/psr7/phpstan-baseline.neon b/dependencies/nyholm/psr7/phpstan-baseline.neon deleted file mode 100644 index 9a0cf11..0000000 --- a/dependencies/nyholm/psr7/phpstan-baseline.neon +++ /dev/null @@ -1,36 +0,0 @@ -parameters: - ignoreErrors: - - - message: "#^Result of && is always false\\.$#" - count: 1 - path: src/Response.php - - - - message: "#^Strict comparison using \\=\\=\\= between null and string will always evaluate to false\\.$#" - count: 1 - path: src/Response.php - - - - message: "#^Result of && is always false\\.$#" - count: 1 - path: src/ServerRequest.php - - - - message: "#^Strict comparison using \\!\\=\\= between null and null will always evaluate to false\\.$#" - count: 1 - path: src/ServerRequest.php - - - - message: "#^Result of && is always false\\.$#" - count: 1 - path: src/Stream.php - - - - message: "#^Result of && is always false\\.$#" - count: 2 - path: src/UploadedFile.php - - - - message: "#^Strict comparison using \\=\\=\\= between false and true will always evaluate to false\\.$#" - count: 2 - path: src/UploadedFile.php diff --git a/dependencies/nyholm/psr7/psalm.baseline.xml b/dependencies/nyholm/psr7/psalm.baseline.xml deleted file mode 100644 index fe5b92e..0000000 --- a/dependencies/nyholm/psr7/psalm.baseline.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - return \trigger_error((string) $e, \E_USER_ERROR); - - - diff --git a/dependencies/nyholm/psr7/src/Factory/HttplugFactory.php b/dependencies/nyholm/psr7/src/Factory/HttplugFactory.php deleted file mode 100644 index 3c2b4d7..0000000 --- a/dependencies/nyholm/psr7/src/Factory/HttplugFactory.php +++ /dev/null @@ -1,50 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - * - * @deprecated since version 1.8, use Psr17Factory instead - */ -class HttplugFactory implements MessageFactory, StreamFactory, UriFactory -{ - public function createRequest($method, $uri, array $headers = [], $body = null, $protocolVersion = '1.1') : RequestInterface - { - return new Request($method, $uri, $headers, $body, $protocolVersion); - } - public function createResponse($statusCode = 200, $reasonPhrase = null, array $headers = [], $body = null, $version = '1.1') : ResponseInterface - { - return new Response((int) $statusCode, $headers, $body, $version, $reasonPhrase); - } - public function createStream($body = null) : StreamInterface - { - return Stream::create($body ?? ''); - } - public function createUri($uri = '') : UriInterface - { - if ($uri instanceof UriInterface) { - return $uri; - } - return new Uri($uri); - } -} diff --git a/dependencies/nyholm/psr7/src/Factory/Psr17Factory.php b/dependencies/nyholm/psr7/src/Factory/Psr17Factory.php deleted file mode 100644 index b818a89..0000000 --- a/dependencies/nyholm/psr7/src/Factory/Psr17Factory.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class Psr17Factory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface -{ - public function createRequest(string $method, $uri) : RequestInterface - { - return new Request($method, $uri); - } - public function createResponse(int $code = 200, string $reasonPhrase = '') : ResponseInterface - { - if (2 > \func_num_args()) { - // This will make the Response class to use a custom reasonPhrase - $reasonPhrase = null; - } - return new Response($code, [], null, '1.1', $reasonPhrase); - } - public function createStream(string $content = '') : StreamInterface - { - return Stream::create($content); - } - public function createStreamFromFile(string $filename, string $mode = 'r') : StreamInterface - { - if ('' === $filename) { - throw new \RuntimeException('Path cannot be empty'); - } - if (\false === ($resource = @\fopen($filename, $mode))) { - if ('' === $mode || \false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], \true)) { - throw new \InvalidArgumentException(\sprintf('The mode "%s" is invalid.', $mode)); - } - throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $filename, \error_get_last()['message'] ?? '')); - } - return Stream::create($resource); - } - public function createStreamFromResource($resource) : StreamInterface - { - return Stream::create($resource); - } - public function createUploadedFile(StreamInterface $stream, int $size = null, int $error = \UPLOAD_ERR_OK, string $clientFilename = null, string $clientMediaType = null) : UploadedFileInterface - { - if (null === $size) { - $size = $stream->getSize(); - } - return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); - } - public function createUri(string $uri = '') : UriInterface - { - return new Uri($uri); - } - public function createServerRequest(string $method, $uri, array $serverParams = []) : ServerRequestInterface - { - return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); - } -} diff --git a/dependencies/nyholm/psr7/src/MessageTrait.php b/dependencies/nyholm/psr7/src/MessageTrait.php deleted file mode 100644 index 6226d64..0000000 --- a/dependencies/nyholm/psr7/src/MessageTrait.php +++ /dev/null @@ -1,195 +0,0 @@ - - * @author Martijn van der Ven - * - * @internal should not be used outside of Nyholm/Psr7 as it does not fall under our BC promise - */ -trait MessageTrait -{ - /** @var array Map of all registered headers, as original name => array of values */ - private $headers = []; - /** @var array Map of lowercase header name => original name at registration */ - private $headerNames = []; - /** @var string */ - private $protocol = '1.1'; - /** @var StreamInterface|null */ - private $stream; - public function getProtocolVersion() : string - { - return $this->protocol; - } - /** - * @return static - */ - public function withProtocolVersion($version) : MessageInterface - { - if (!\is_scalar($version)) { - throw new \InvalidArgumentException('Protocol version must be a string'); - } - if ($this->protocol === $version) { - return $this; - } - $new = clone $this; - $new->protocol = (string) $version; - return $new; - } - public function getHeaders() : array - { - return $this->headers; - } - public function hasHeader($header) : bool - { - return isset($this->headerNames[\strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]); - } - public function getHeader($header) : array - { - if (!\is_string($header)) { - throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); - } - $header = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); - if (!isset($this->headerNames[$header])) { - return []; - } - $header = $this->headerNames[$header]; - return $this->headers[$header]; - } - public function getHeaderLine($header) : string - { - return \implode(', ', $this->getHeader($header)); - } - /** - * @return static - */ - public function withHeader($header, $value) : MessageInterface - { - $value = $this->validateAndTrimHeader($header, $value); - $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); - $new = clone $this; - if (isset($new->headerNames[$normalized])) { - unset($new->headers[$new->headerNames[$normalized]]); - } - $new->headerNames[$normalized] = $header; - $new->headers[$header] = $value; - return $new; - } - /** - * @return static - */ - public function withAddedHeader($header, $value) : MessageInterface - { - if (!\is_string($header) || '' === $header) { - throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); - } - $new = clone $this; - $new->setHeaders([$header => $value]); - return $new; - } - /** - * @return static - */ - public function withoutHeader($header) : MessageInterface - { - if (!\is_string($header)) { - throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); - } - $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); - if (!isset($this->headerNames[$normalized])) { - return $this; - } - $header = $this->headerNames[$normalized]; - $new = clone $this; - unset($new->headers[$header], $new->headerNames[$normalized]); - return $new; - } - public function getBody() : StreamInterface - { - if (null === $this->stream) { - $this->stream = Stream::create(''); - } - return $this->stream; - } - /** - * @return static - */ - public function withBody(StreamInterface $body) : MessageInterface - { - if ($body === $this->stream) { - return $this; - } - $new = clone $this; - $new->stream = $body; - return $new; - } - private function setHeaders(array $headers) : void - { - foreach ($headers as $header => $value) { - if (\is_int($header)) { - // If a header name was set to a numeric string, PHP will cast the key to an int. - // We must cast it back to a string in order to comply with validation. - $header = (string) $header; - } - $value = $this->validateAndTrimHeader($header, $value); - $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); - if (isset($this->headerNames[$normalized])) { - $header = $this->headerNames[$normalized]; - $this->headers[$header] = \array_merge($this->headers[$header], $value); - } else { - $this->headerNames[$normalized] = $header; - $this->headers[$header] = $value; - } - } - } - /** - * Make sure the header complies with RFC 7230. - * - * Header names must be a non-empty string consisting of token characters. - * - * Header values must be strings consisting of visible characters with all optional - * leading and trailing whitespace stripped. This method will always strip such - * optional whitespace. Note that the method does not allow folding whitespace within - * the values as this was deprecated for almost all instances by the RFC. - * - * header-field = field-name ":" OWS field-value OWS - * field-name = 1*( "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" - * / "_" / "`" / "|" / "~" / %x30-39 / ( %x41-5A / %x61-7A ) ) - * OWS = *( SP / HTAB ) - * field-value = *( ( %x21-7E / %x80-FF ) [ 1*( SP / HTAB ) ( %x21-7E / %x80-FF ) ] ) - * - * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 - */ - private function validateAndTrimHeader($header, $values) : array - { - if (!\is_string($header) || 1 !== \preg_match("@^[!#\$%&'*+.^_`|~0-9A-Za-z-]+\$@D", $header)) { - throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); - } - if (!\is_array($values)) { - // This is simple, just one value. - if (!\is_numeric($values) && !\is_string($values) || 1 !== \preg_match("@^[ \t!-~\x80-\xff]*\$@", (string) $values)) { - throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings'); - } - return [\trim((string) $values, " \t")]; - } - if (empty($values)) { - throw new \InvalidArgumentException('Header values must be a string or an array of strings, empty array given'); - } - // Assert Non empty array - $returnValues = []; - foreach ($values as $v) { - if (!\is_numeric($v) && !\is_string($v) || 1 !== \preg_match("@^[ \t!-~\x80-\xff]*\$@D", (string) $v)) { - throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings'); - } - $returnValues[] = \trim((string) $v, " \t"); - } - return $returnValues; - } -} diff --git a/dependencies/nyholm/psr7/src/Request.php b/dependencies/nyholm/psr7/src/Request.php deleted file mode 100644 index ef5b145..0000000 --- a/dependencies/nyholm/psr7/src/Request.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class Request implements RequestInterface -{ - use MessageTrait; - use RequestTrait; - /** - * @param string $method HTTP method - * @param string|UriInterface $uri URI - * @param array $headers Request headers - * @param string|resource|StreamInterface|null $body Request body - * @param string $version Protocol version - */ - public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1') - { - if (!$uri instanceof UriInterface) { - $uri = new Uri($uri); - } - $this->method = $method; - $this->uri = $uri; - $this->setHeaders($headers); - $this->protocol = $version; - if (!$this->hasHeader('Host')) { - $this->updateHostFromUri(); - } - // If we got no body, defer initialization of the stream until Request::getBody() - if ('' !== $body && null !== $body) { - $this->stream = Stream::create($body); - } - } -} diff --git a/dependencies/nyholm/psr7/src/RequestTrait.php b/dependencies/nyholm/psr7/src/RequestTrait.php deleted file mode 100644 index 94e765e..0000000 --- a/dependencies/nyholm/psr7/src/RequestTrait.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @author Martijn van der Ven - * - * @internal should not be used outside of Nyholm/Psr7 as it does not fall under our BC promise - */ -trait RequestTrait -{ - /** @var string */ - private $method; - /** @var string|null */ - private $requestTarget; - /** @var UriInterface|null */ - private $uri; - public function getRequestTarget() : string - { - if (null !== $this->requestTarget) { - return $this->requestTarget; - } - if ('' === ($target = $this->uri->getPath())) { - $target = '/'; - } - if ('' !== $this->uri->getQuery()) { - $target .= '?' . $this->uri->getQuery(); - } - return $target; - } - /** - * @return static - */ - public function withRequestTarget($requestTarget) : RequestInterface - { - if (!\is_string($requestTarget)) { - throw new \InvalidArgumentException('Request target must be a string'); - } - if (\preg_match('#\\s#', $requestTarget)) { - throw new \InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); - } - $new = clone $this; - $new->requestTarget = $requestTarget; - return $new; - } - public function getMethod() : string - { - return $this->method; - } - /** - * @return static - */ - public function withMethod($method) : RequestInterface - { - if (!\is_string($method)) { - throw new \InvalidArgumentException('Method must be a string'); - } - $new = clone $this; - $new->method = $method; - return $new; - } - public function getUri() : UriInterface - { - return $this->uri; - } - /** - * @return static - */ - public function withUri(UriInterface $uri, $preserveHost = \false) : RequestInterface - { - if ($uri === $this->uri) { - return $this; - } - $new = clone $this; - $new->uri = $uri; - if (!$preserveHost || !$this->hasHeader('Host')) { - $new->updateHostFromUri(); - } - return $new; - } - private function updateHostFromUri() : void - { - if ('' === ($host = $this->uri->getHost())) { - return; - } - if (null !== ($port = $this->uri->getPort())) { - $host .= ':' . $port; - } - if (isset($this->headerNames['host'])) { - $header = $this->headerNames['host']; - } else { - $this->headerNames['host'] = $header = 'Host'; - } - // Ensure Host is the first header. - // See: http://tools.ietf.org/html/rfc7230#section-5.4 - $this->headers = [$header => [$host]] + $this->headers; - } -} diff --git a/dependencies/nyholm/psr7/src/Response.php b/dependencies/nyholm/psr7/src/Response.php deleted file mode 100644 index c002506..0000000 --- a/dependencies/nyholm/psr7/src/Response.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class Response implements ResponseInterface -{ - use MessageTrait; - /** @var array Map of standard HTTP status code/reason phrases */ - private const PHRASES = [100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required']; - /** @var string */ - private $reasonPhrase = ''; - /** @var int */ - private $statusCode; - /** - * @param int $status Status code - * @param array $headers Response headers - * @param string|resource|StreamInterface|null $body Response body - * @param string $version Protocol version - * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) - */ - public function __construct(int $status = 200, array $headers = [], $body = null, string $version = '1.1', string $reason = null) - { - // If we got no body, defer initialization of the stream until Response::getBody() - if ('' !== $body && null !== $body) { - $this->stream = Stream::create($body); - } - $this->statusCode = $status; - $this->setHeaders($headers); - if (null === $reason && isset(self::PHRASES[$this->statusCode])) { - $this->reasonPhrase = self::PHRASES[$status]; - } else { - $this->reasonPhrase = $reason ?? ''; - } - $this->protocol = $version; - } - public function getStatusCode() : int - { - return $this->statusCode; - } - public function getReasonPhrase() : string - { - return $this->reasonPhrase; - } - /** - * @return static - */ - public function withStatus($code, $reasonPhrase = '') : ResponseInterface - { - if (!\is_int($code) && !\is_string($code)) { - throw new \InvalidArgumentException('Status code has to be an integer'); - } - $code = (int) $code; - if ($code < 100 || $code > 599) { - throw new \InvalidArgumentException(\sprintf('Status code has to be an integer between 100 and 599. A status code of %d was given', $code)); - } - $new = clone $this; - $new->statusCode = $code; - if ((null === $reasonPhrase || '' === $reasonPhrase) && isset(self::PHRASES[$new->statusCode])) { - $reasonPhrase = self::PHRASES[$new->statusCode]; - } - $new->reasonPhrase = $reasonPhrase; - return $new; - } -} diff --git a/dependencies/nyholm/psr7/src/ServerRequest.php b/dependencies/nyholm/psr7/src/ServerRequest.php deleted file mode 100644 index ce4757a..0000000 --- a/dependencies/nyholm/psr7/src/ServerRequest.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class ServerRequest implements ServerRequestInterface -{ - use MessageTrait; - use RequestTrait; - /** @var array */ - private $attributes = []; - /** @var array */ - private $cookieParams = []; - /** @var array|object|null */ - private $parsedBody; - /** @var array */ - private $queryParams = []; - /** @var array */ - private $serverParams; - /** @var UploadedFileInterface[] */ - private $uploadedFiles = []; - /** - * @param string $method HTTP method - * @param string|UriInterface $uri URI - * @param array $headers Request headers - * @param string|resource|StreamInterface|null $body Request body - * @param string $version Protocol version - * @param array $serverParams Typically the $_SERVER superglobal - */ - public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = []) - { - $this->serverParams = $serverParams; - if (!$uri instanceof UriInterface) { - $uri = new Uri($uri); - } - $this->method = $method; - $this->uri = $uri; - $this->setHeaders($headers); - $this->protocol = $version; - \parse_str($uri->getQuery(), $this->queryParams); - if (!$this->hasHeader('Host')) { - $this->updateHostFromUri(); - } - // If we got no body, defer initialization of the stream until ServerRequest::getBody() - if ('' !== $body && null !== $body) { - $this->stream = Stream::create($body); - } - } - public function getServerParams() : array - { - return $this->serverParams; - } - public function getUploadedFiles() : array - { - return $this->uploadedFiles; - } - /** - * @return static - */ - public function withUploadedFiles(array $uploadedFiles) : ServerRequestInterface - { - $new = clone $this; - $new->uploadedFiles = $uploadedFiles; - return $new; - } - public function getCookieParams() : array - { - return $this->cookieParams; - } - /** - * @return static - */ - public function withCookieParams(array $cookies) : ServerRequestInterface - { - $new = clone $this; - $new->cookieParams = $cookies; - return $new; - } - public function getQueryParams() : array - { - return $this->queryParams; - } - /** - * @return static - */ - public function withQueryParams(array $query) : ServerRequestInterface - { - $new = clone $this; - $new->queryParams = $query; - return $new; - } - /** - * @return array|object|null - */ - public function getParsedBody() - { - return $this->parsedBody; - } - /** - * @return static - */ - public function withParsedBody($data) : ServerRequestInterface - { - if (!\is_array($data) && !\is_object($data) && null !== $data) { - throw new \InvalidArgumentException('First parameter to withParsedBody MUST be object, array or null'); - } - $new = clone $this; - $new->parsedBody = $data; - return $new; - } - public function getAttributes() : array - { - return $this->attributes; - } - /** - * @return mixed - */ - public function getAttribute($attribute, $default = null) - { - if (!\is_string($attribute)) { - throw new \InvalidArgumentException('Attribute name must be a string'); - } - if (\false === \array_key_exists($attribute, $this->attributes)) { - return $default; - } - return $this->attributes[$attribute]; - } - /** - * @return static - */ - public function withAttribute($attribute, $value) : ServerRequestInterface - { - if (!\is_string($attribute)) { - throw new \InvalidArgumentException('Attribute name must be a string'); - } - $new = clone $this; - $new->attributes[$attribute] = $value; - return $new; - } - /** - * @return static - */ - public function withoutAttribute($attribute) : ServerRequestInterface - { - if (!\is_string($attribute)) { - throw new \InvalidArgumentException('Attribute name must be a string'); - } - if (\false === \array_key_exists($attribute, $this->attributes)) { - return $this; - } - $new = clone $this; - unset($new->attributes[$attribute]); - return $new; - } -} diff --git a/dependencies/nyholm/psr7/src/Stream.php b/dependencies/nyholm/psr7/src/Stream.php deleted file mode 100644 index 8dcf166..0000000 --- a/dependencies/nyholm/psr7/src/Stream.php +++ /dev/null @@ -1,304 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class Stream implements StreamInterface -{ - use StreamTrait; - /** @var resource|null A resource reference */ - private $stream; - /** @var bool */ - private $seekable; - /** @var bool */ - private $readable; - /** @var bool */ - private $writable; - /** @var array|mixed|void|bool|null */ - private $uri; - /** @var int|null */ - private $size; - /** @var array Hash of readable and writable stream types */ - private const READ_WRITE_HASH = ['read' => ['r' => \true, 'w+' => \true, 'r+' => \true, 'x+' => \true, 'c+' => \true, 'rb' => \true, 'w+b' => \true, 'r+b' => \true, 'x+b' => \true, 'c+b' => \true, 'rt' => \true, 'w+t' => \true, 'r+t' => \true, 'x+t' => \true, 'c+t' => \true, 'a+' => \true], 'write' => ['w' => \true, 'w+' => \true, 'rw' => \true, 'r+' => \true, 'x+' => \true, 'c+' => \true, 'wb' => \true, 'w+b' => \true, 'r+b' => \true, 'x+b' => \true, 'c+b' => \true, 'w+t' => \true, 'r+t' => \true, 'x+t' => \true, 'c+t' => \true, 'a' => \true, 'a+' => \true]]; - /** - * @param resource $body - */ - public function __construct($body) - { - if (!\is_resource($body)) { - throw new \InvalidArgumentException('First argument to Stream::__construct() must be resource'); - } - $this->stream = $body; - $meta = \stream_get_meta_data($this->stream); - $this->seekable = $meta['seekable'] && 0 === \fseek($this->stream, 0, \SEEK_CUR); - $this->readable = isset(self::READ_WRITE_HASH['read'][$meta['mode']]); - $this->writable = isset(self::READ_WRITE_HASH['write'][$meta['mode']]); - } - /** - * Creates a new PSR-7 stream. - * - * @param string|resource|StreamInterface $body - * - * @throws \InvalidArgumentException - */ - public static function create($body = '') : StreamInterface - { - if ($body instanceof StreamInterface) { - return $body; - } - if (\is_string($body)) { - if (200000 <= \strlen($body)) { - $body = self::openZvalStream($body); - } else { - $resource = \fopen('php://memory', 'r+'); - \fwrite($resource, $body); - \fseek($resource, 0); - $body = $resource; - } - } - if (!\is_resource($body)) { - throw new \InvalidArgumentException('First argument to Stream::create() must be a string, resource or StreamInterface'); - } - return new self($body); - } - /** - * Closes the stream when the destructed. - */ - public function __destruct() - { - $this->close(); - } - public function close() : void - { - if (isset($this->stream)) { - if (\is_resource($this->stream)) { - \fclose($this->stream); - } - $this->detach(); - } - } - public function detach() - { - if (!isset($this->stream)) { - return null; - } - $result = $this->stream; - unset($this->stream); - $this->size = $this->uri = null; - $this->readable = $this->writable = $this->seekable = \false; - return $result; - } - private function getUri() - { - if (\false !== $this->uri) { - $this->uri = $this->getMetadata('uri') ?? \false; - } - return $this->uri; - } - public function getSize() : ?int - { - if (null !== $this->size) { - return $this->size; - } - if (!isset($this->stream)) { - return null; - } - // Clear the stat cache if the stream has a URI - if ($uri = $this->getUri()) { - \clearstatcache(\true, $uri); - } - $stats = \fstat($this->stream); - if (isset($stats['size'])) { - $this->size = $stats['size']; - return $this->size; - } - return null; - } - public function tell() : int - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (\false === ($result = @\ftell($this->stream))) { - throw new \RuntimeException('Unable to determine stream position: ' . (\error_get_last()['message'] ?? '')); - } - return $result; - } - public function eof() : bool - { - return !isset($this->stream) || \feof($this->stream); - } - public function isSeekable() : bool - { - return $this->seekable; - } - public function seek($offset, $whence = \SEEK_SET) : void - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->seekable) { - throw new \RuntimeException('Stream is not seekable'); - } - if (-1 === \fseek($this->stream, $offset, $whence)) { - throw new \RuntimeException('Unable to seek to stream position "' . $offset . '" with whence ' . \var_export($whence, \true)); - } - } - public function rewind() : void - { - $this->seek(0); - } - public function isWritable() : bool - { - return $this->writable; - } - public function write($string) : int - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->writable) { - throw new \RuntimeException('Cannot write to a non-writable stream'); - } - // We can't know the size after writing anything - $this->size = null; - if (\false === ($result = @\fwrite($this->stream, $string))) { - throw new \RuntimeException('Unable to write to stream: ' . (\error_get_last()['message'] ?? '')); - } - return $result; - } - public function isReadable() : bool - { - return $this->readable; - } - public function read($length) : string - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (!$this->readable) { - throw new \RuntimeException('Cannot read from non-readable stream'); - } - if (\false === ($result = @\fread($this->stream, $length))) { - throw new \RuntimeException('Unable to read from stream: ' . (\error_get_last()['message'] ?? '')); - } - return $result; - } - public function getContents() : string - { - if (!isset($this->stream)) { - throw new \RuntimeException('Stream is detached'); - } - if (\false === ($contents = @\stream_get_contents($this->stream))) { - throw new \RuntimeException('Unable to read stream contents: ' . (\error_get_last()['message'] ?? '')); - } - return $contents; - } - /** - * @return mixed - */ - public function getMetadata($key = null) - { - if (null !== $key && !\is_string($key)) { - throw new \InvalidArgumentException('Metadata key must be a string'); - } - if (!isset($this->stream)) { - return $key ? null : []; - } - $meta = \stream_get_meta_data($this->stream); - if (null === $key) { - return $meta; - } - return $meta[$key] ?? null; - } - private static function openZvalStream(string $body) - { - static $wrapper; - $wrapper ?? \stream_wrapper_register('Nyholm-Psr7-Zval', $wrapper = \get_class(new class - { - public $context; - private $data; - private $position = 0; - public function stream_open() : bool - { - $this->data = \stream_context_get_options($this->context)['Nyholm-Psr7-Zval']['data']; - \stream_context_set_option($this->context, 'Nyholm-Psr7-Zval', 'data', null); - return \true; - } - public function stream_read(int $count) : string - { - $result = \substr($this->data, $this->position, $count); - $this->position += \strlen($result); - return $result; - } - public function stream_write(string $data) : int - { - $this->data = \substr_replace($this->data, $data, $this->position, \strlen($data)); - $this->position += \strlen($data); - return \strlen($data); - } - public function stream_tell() : int - { - return $this->position; - } - public function stream_eof() : bool - { - return \strlen($this->data) <= $this->position; - } - public function stream_stat() : array - { - return [ - 'mode' => 33206, - // POSIX_S_IFREG | 0666 - 'nlink' => 1, - 'rdev' => -1, - 'size' => \strlen($this->data), - 'blksize' => -1, - 'blocks' => -1, - ]; - } - public function stream_seek(int $offset, int $whence) : bool - { - if (\SEEK_SET === $whence && (0 <= $offset && \strlen($this->data) >= $offset)) { - $this->position = $offset; - } elseif (\SEEK_CUR === $whence && 0 <= $offset) { - $this->position += $offset; - } elseif (\SEEK_END === $whence && (0 > $offset && 0 <= ($offset = \strlen($this->data) + $offset))) { - $this->position = $offset; - } else { - return \false; - } - return \true; - } - public function stream_set_option() : bool - { - return \true; - } - public function stream_truncate(int $new_size) : bool - { - if ($new_size) { - $this->data = \substr($this->data, 0, $new_size); - $this->position = \min($this->position, $new_size); - } else { - $this->data = ''; - $this->position = 0; - } - return \true; - } - })); - $context = \stream_context_create(['Nyholm-Psr7-Zval' => ['data' => $body]]); - if (!($stream = @\fopen('Nyholm-Psr7-Zval://', 'r+', \false, $context))) { - \stream_wrapper_register('Nyholm-Psr7-Zval', $wrapper); - $stream = \fopen('Nyholm-Psr7-Zval://', 'r+', \false, $context); - } - return $stream; - } -} diff --git a/dependencies/nyholm/psr7/src/StreamTrait.php b/dependencies/nyholm/psr7/src/StreamTrait.php deleted file mode 100644 index 8b56541..0000000 --- a/dependencies/nyholm/psr7/src/StreamTrait.php +++ /dev/null @@ -1,51 +0,0 @@ -= 70400 || (new \ReflectionMethod(StreamInterface::class, '__toString'))->hasReturnType()) { - /** - * @internal - */ - trait StreamTrait - { - public function __toString() : string - { - if ($this->isSeekable()) { - $this->seek(0); - } - return $this->getContents(); - } - } -} else { - /** - * @internal - */ - trait StreamTrait - { - /** - * @return string - */ - public function __toString() - { - try { - if ($this->isSeekable()) { - $this->seek(0); - } - return $this->getContents(); - } catch (\Throwable $e) { - if (\is_array($errorHandler = \set_error_handler('var_dump'))) { - $errorHandler = $errorHandler[0] ?? null; - } - \restore_error_handler(); - if ($e instanceof \Error || $errorHandler instanceof SymfonyErrorHandler || $errorHandler instanceof SymfonyLegacyErrorHandler) { - return \trigger_error((string) $e, \E_USER_ERROR); - } - return ''; - } - } - } -} diff --git a/dependencies/nyholm/psr7/src/UploadedFile.php b/dependencies/nyholm/psr7/src/UploadedFile.php deleted file mode 100644 index eb5924f..0000000 --- a/dependencies/nyholm/psr7/src/UploadedFile.php +++ /dev/null @@ -1,138 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class UploadedFile implements UploadedFileInterface -{ - /** @var array */ - private const ERRORS = [\UPLOAD_ERR_OK => 1, \UPLOAD_ERR_INI_SIZE => 1, \UPLOAD_ERR_FORM_SIZE => 1, \UPLOAD_ERR_PARTIAL => 1, \UPLOAD_ERR_NO_FILE => 1, \UPLOAD_ERR_NO_TMP_DIR => 1, \UPLOAD_ERR_CANT_WRITE => 1, \UPLOAD_ERR_EXTENSION => 1]; - /** @var string */ - private $clientFilename; - /** @var string */ - private $clientMediaType; - /** @var int */ - private $error; - /** @var string|null */ - private $file; - /** @var bool */ - private $moved = \false; - /** @var int */ - private $size; - /** @var StreamInterface|null */ - private $stream; - /** - * @param StreamInterface|string|resource $streamOrFile - * @param int $size - * @param int $errorStatus - * @param string|null $clientFilename - * @param string|null $clientMediaType - */ - public function __construct($streamOrFile, $size, $errorStatus, $clientFilename = null, $clientMediaType = null) - { - if (\false === \is_int($errorStatus) || !isset(self::ERRORS[$errorStatus])) { - throw new \InvalidArgumentException('Upload file error status must be an integer value and one of the "UPLOAD_ERR_*" constants'); - } - if (\false === \is_int($size)) { - throw new \InvalidArgumentException('Upload file size must be an integer'); - } - if (null !== $clientFilename && !\is_string($clientFilename)) { - throw new \InvalidArgumentException('Upload file client filename must be a string or null'); - } - if (null !== $clientMediaType && !\is_string($clientMediaType)) { - throw new \InvalidArgumentException('Upload file client media type must be a string or null'); - } - $this->error = $errorStatus; - $this->size = $size; - $this->clientFilename = $clientFilename; - $this->clientMediaType = $clientMediaType; - if (\UPLOAD_ERR_OK === $this->error) { - // Depending on the value set file or stream variable. - if (\is_string($streamOrFile) && '' !== $streamOrFile) { - $this->file = $streamOrFile; - } elseif (\is_resource($streamOrFile)) { - $this->stream = Stream::create($streamOrFile); - } elseif ($streamOrFile instanceof StreamInterface) { - $this->stream = $streamOrFile; - } else { - throw new \InvalidArgumentException('Invalid stream or file provided for UploadedFile'); - } - } - } - /** - * @throws \RuntimeException if is moved or not ok - */ - private function validateActive() : void - { - if (\UPLOAD_ERR_OK !== $this->error) { - throw new \RuntimeException('Cannot retrieve stream due to upload error'); - } - if ($this->moved) { - throw new \RuntimeException('Cannot retrieve stream after it has already been moved'); - } - } - public function getStream() : StreamInterface - { - $this->validateActive(); - if ($this->stream instanceof StreamInterface) { - return $this->stream; - } - if (\false === ($resource = @\fopen($this->file, 'r'))) { - throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $this->file, \error_get_last()['message'] ?? '')); - } - return Stream::create($resource); - } - public function moveTo($targetPath) : void - { - $this->validateActive(); - if (!\is_string($targetPath) || '' === $targetPath) { - throw new \InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string'); - } - if (null !== $this->file) { - $this->moved = 'cli' === \PHP_SAPI ? @\rename($this->file, $targetPath) : @\move_uploaded_file($this->file, $targetPath); - if (\false === $this->moved) { - throw new \RuntimeException(\sprintf('Uploaded file could not be moved to "%s": %s', $targetPath, \error_get_last()['message'] ?? '')); - } - } else { - $stream = $this->getStream(); - if ($stream->isSeekable()) { - $stream->rewind(); - } - if (\false === ($resource = @\fopen($targetPath, 'w'))) { - throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $targetPath, \error_get_last()['message'] ?? '')); - } - $dest = Stream::create($resource); - while (!$stream->eof()) { - if (!$dest->write($stream->read(1048576))) { - break; - } - } - $this->moved = \true; - } - } - public function getSize() : int - { - return $this->size; - } - public function getError() : int - { - return $this->error; - } - public function getClientFilename() : ?string - { - return $this->clientFilename; - } - public function getClientMediaType() : ?string - { - return $this->clientMediaType; - } -} diff --git a/dependencies/nyholm/psr7/src/Uri.php b/dependencies/nyholm/psr7/src/Uri.php deleted file mode 100644 index 85b723f..0000000 --- a/dependencies/nyholm/psr7/src/Uri.php +++ /dev/null @@ -1,286 +0,0 @@ - - * @author Martijn van der Ven - * - * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md - */ -class Uri implements UriInterface -{ - private const SCHEMES = ['http' => 80, 'https' => 443]; - private const CHAR_UNRESERVED = 'a-zA-Z0-9_\\-\\.~'; - private const CHAR_SUB_DELIMS = '!\\$&\'\\(\\)\\*\\+,;='; - private const CHAR_GEN_DELIMS = ':\\/\\?#\\[\\]@'; - /** @var string Uri scheme. */ - private $scheme = ''; - /** @var string Uri user info. */ - private $userInfo = ''; - /** @var string Uri host. */ - private $host = ''; - /** @var int|null Uri port. */ - private $port; - /** @var string Uri path. */ - private $path = ''; - /** @var string Uri query string. */ - private $query = ''; - /** @var string Uri fragment. */ - private $fragment = ''; - public function __construct(string $uri = '') - { - if ('' !== $uri) { - if (\false === ($parts = \parse_url($uri))) { - throw new \InvalidArgumentException(\sprintf('Unable to parse URI: "%s"', $uri)); - } - // Apply parse_url parts to a URI. - $this->scheme = isset($parts['scheme']) ? \strtr($parts['scheme'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; - $this->userInfo = $parts['user'] ?? ''; - $this->host = isset($parts['host']) ? \strtr($parts['host'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; - $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; - $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; - $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; - $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; - if (isset($parts['pass'])) { - $this->userInfo .= ':' . $parts['pass']; - } - } - } - public function __toString() : string - { - return self::createUriString($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); - } - public function getScheme() : string - { - return $this->scheme; - } - public function getAuthority() : string - { - if ('' === $this->host) { - return ''; - } - $authority = $this->host; - if ('' !== $this->userInfo) { - $authority = $this->userInfo . '@' . $authority; - } - if (null !== $this->port) { - $authority .= ':' . $this->port; - } - return $authority; - } - public function getUserInfo() : string - { - return $this->userInfo; - } - public function getHost() : string - { - return $this->host; - } - public function getPort() : ?int - { - return $this->port; - } - public function getPath() : string - { - $path = $this->path; - if ('' !== $path && '/' !== $path[0]) { - if ('' !== $this->host) { - // If the path is rootless and an authority is present, the path MUST be prefixed by "/" - $path = '/' . $path; - } - } elseif (isset($path[1]) && '/' === $path[1]) { - // If the path is starting with more than one "/", the - // starting slashes MUST be reduced to one. - $path = '/' . \ltrim($path, '/'); - } - return $path; - } - public function getQuery() : string - { - return $this->query; - } - public function getFragment() : string - { - return $this->fragment; - } - /** - * @return static - */ - public function withScheme($scheme) : UriInterface - { - if (!\is_string($scheme)) { - throw new \InvalidArgumentException('Scheme must be a string'); - } - if ($this->scheme === ($scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))) { - return $this; - } - $new = clone $this; - $new->scheme = $scheme; - $new->port = $new->filterPort($new->port); - return $new; - } - /** - * @return static - */ - public function withUserInfo($user, $password = null) : UriInterface - { - if (!\is_string($user)) { - throw new \InvalidArgumentException('User must be a string'); - } - $info = \preg_replace_callback('/[' . self::CHAR_GEN_DELIMS . self::CHAR_SUB_DELIMS . ']++/', [__CLASS__, 'rawurlencodeMatchZero'], $user); - if (null !== $password && '' !== $password) { - if (!\is_string($password)) { - throw new \InvalidArgumentException('Password must be a string'); - } - $info .= ':' . \preg_replace_callback('/[' . self::CHAR_GEN_DELIMS . self::CHAR_SUB_DELIMS . ']++/', [__CLASS__, 'rawurlencodeMatchZero'], $password); - } - if ($this->userInfo === $info) { - return $this; - } - $new = clone $this; - $new->userInfo = $info; - return $new; - } - /** - * @return static - */ - public function withHost($host) : UriInterface - { - if (!\is_string($host)) { - throw new \InvalidArgumentException('Host must be a string'); - } - if ($this->host === ($host = \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))) { - return $this; - } - $new = clone $this; - $new->host = $host; - return $new; - } - /** - * @return static - */ - public function withPort($port) : UriInterface - { - if ($this->port === ($port = $this->filterPort($port))) { - return $this; - } - $new = clone $this; - $new->port = $port; - return $new; - } - /** - * @return static - */ - public function withPath($path) : UriInterface - { - if ($this->path === ($path = $this->filterPath($path))) { - return $this; - } - $new = clone $this; - $new->path = $path; - return $new; - } - /** - * @return static - */ - public function withQuery($query) : UriInterface - { - if ($this->query === ($query = $this->filterQueryAndFragment($query))) { - return $this; - } - $new = clone $this; - $new->query = $query; - return $new; - } - /** - * @return static - */ - public function withFragment($fragment) : UriInterface - { - if ($this->fragment === ($fragment = $this->filterQueryAndFragment($fragment))) { - return $this; - } - $new = clone $this; - $new->fragment = $fragment; - return $new; - } - /** - * Create a URI string from its various parts. - */ - private static function createUriString(string $scheme, string $authority, string $path, string $query, string $fragment) : string - { - $uri = ''; - if ('' !== $scheme) { - $uri .= $scheme . ':'; - } - if ('' !== $authority) { - $uri .= '//' . $authority; - } - if ('' !== $path) { - if ('/' !== $path[0]) { - if ('' !== $authority) { - // If the path is rootless and an authority is present, the path MUST be prefixed by "/" - $path = '/' . $path; - } - } elseif (isset($path[1]) && '/' === $path[1]) { - if ('' === $authority) { - // If the path is starting with more than one "/" and no authority is present, the - // starting slashes MUST be reduced to one. - $path = '/' . \ltrim($path, '/'); - } - } - $uri .= $path; - } - if ('' !== $query) { - $uri .= '?' . $query; - } - if ('' !== $fragment) { - $uri .= '#' . $fragment; - } - return $uri; - } - /** - * Is a given port non-standard for the current scheme? - */ - private static function isNonStandardPort(string $scheme, int $port) : bool - { - return !isset(self::SCHEMES[$scheme]) || $port !== self::SCHEMES[$scheme]; - } - private function filterPort($port) : ?int - { - if (null === $port) { - return null; - } - $port = (int) $port; - if (0 > $port || 0xffff < $port) { - throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); - } - return self::isNonStandardPort($this->scheme, $port) ? $port : null; - } - private function filterPath($path) : string - { - if (!\is_string($path)) { - throw new \InvalidArgumentException('Path must be a string'); - } - return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $path); - } - private function filterQueryAndFragment($str) : string - { - if (!\is_string($str)) { - throw new \InvalidArgumentException('Query and fragment must be a string'); - } - return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $str); - } - private static function rawurlencodeMatchZero(array $match) : string - { - return \rawurlencode($match[0]); - } -} diff --git a/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpcs.xml b/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpcs.xml deleted file mode 100644 index 2ce6c84..0000000 --- a/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpcs.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - Generally-applicable sniffs for WordPress plugins - - - - - - - - - - - . - - - - - ./vendor/* - - - - - diff --git a/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpunit.xml b/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpunit.xml deleted file mode 100644 index c611edc..0000000 --- a/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/phpunit.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - ./tests/ - - - - diff --git a/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/src/WP_Namespace_Autoloader.php b/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/src/WP_Namespace_Autoloader.php deleted file mode 100644 index f44360a..0000000 --- a/dependencies/pablo-sg-pacheco/wp-namespace-autoloader/src/WP_Namespace_Autoloader.php +++ /dev/null @@ -1,334 +0,0 @@ - $this->get_calling_directory(), - 'namespace_prefix' => $this->get_calling_file_namespace(), - 'lowercase' => array('file'), - // 'file' | folders - 'underscore_to_hyphen' => array('file'), - // 'file' | folders - 'prepend_class' => \true, - 'prepend_interface' => \true, - 'prepend_trait' => \true, - 'classes_dir' => array('.', 'vendor'), - 'debug' => \false, - ); - $parsed_args = \array_merge($defaults, $args); - $this->set_args($parsed_args); - } - /** - * Register autoloader - */ - public function init() - { - \spl_autoload_register(array($this, 'autoload')); - } - /** - * Determine if the class has already been loaded. - * - * @param string $class classFQN. - * - * @return bool - */ - public function need_to_autoload($class) - { - $args = $this->get_args(); - $namespace = $args['namespace_prefix']; - if (!\class_exists($class) && !\interface_exists($class) && !\trait_exists($class)) { - if (\false !== \strpos($class, $namespace)) { - if (!\class_exists($class)) { - return \true; - } - } - } - return \false; - } - /** - * Autoloads classes - * - * @param string $class classFQN. - */ - public function autoload($class) - { - if ($this->need_to_autoload($class)) { - $file_paths = $this->convert_class_to_file($class); - foreach ($file_paths as $file) { - if (\file_exists($file)) { - require_once $file; - return; - } - } - $args = $this->get_args(); - if ($args['debug']) { - \error_log('WP Namespace Autoloader could not load file: ' . \print_r($file_paths, \true)); - } - } - } - /** - * Gets full path of directories containing classes, using the $args['classes_dir'] input argument. - * - * @return string|array - */ - private function get_dir() - { - $args = $this->get_args(); - if (\is_array($args['classes_dir'])) { - $dirs = array(); - foreach ($args['classes_dir'] as $classes_dir) { - $dir = $this->sanitize_file_path($classes_dir); - $classes_dir = empty($dir) ? '' : \rtrim($dir, \DIRECTORY_SEPARATOR) . \DIRECTORY_SEPARATOR; - $dirs[] = \rtrim($args['directory'], '/\\') . \DIRECTORY_SEPARATOR . $classes_dir; - } - return $dirs; - } else { - $dir = $this->sanitize_file_path($args['classes_dir']); - // Directory containing all classes. - $classes_dir = empty($dir) ? '' : \rtrim($dir, \DIRECTORY_SEPARATOR) . \DIRECTORY_SEPARATOR; - return \rtrim($args['directory'], '/\\') . \DIRECTORY_SEPARATOR . $classes_dir; - } - } - /** - * Gets only the path leading to final file based on namespace - * - * @param string $class classFQN. - * - * @return string - */ - private function get_namespace_file_path($class) - { - $args = $this->get_args(); - $namespace_prefix = $args['namespace_prefix']; - // Sanitized class and namespace prefix. - $sanitized_class = $this->sanitize_namespace($class, \false); - $sanitized_namespace_prefix = $this->sanitize_namespace($namespace_prefix, \true); - // Removes prefix from class namespace. - $namespace_without_prefix = \preg_replace('/' . $sanitized_namespace_prefix . '\\/', '', $sanitized_class, 1); - // Gets namespace file path. - $namespaces_without_prefix_arr = \explode('\\', $namespace_without_prefix); - \array_pop($namespaces_without_prefix_arr); - $namespace_file_path = \implode(\DIRECTORY_SEPARATOR, $namespaces_without_prefix_arr) . \DIRECTORY_SEPARATOR; - if (\in_array('folders', $args['lowercase'], \true)) { - $namespace_file_path = \strtolower($namespace_file_path); - } - if (\in_array('folders', $args['underscore_to_hyphen'], \true)) { - $namespace_file_path = \str_replace(array('_', "\x00"), array('-', ''), $namespace_file_path); - } - if ('\\' === $namespace_file_path || '\\/' === $namespace_file_path) { - $namespace_file_path = ''; - } - return $namespace_file_path; - } - /** - * Gets filename to be loaded considering WordPress coding standards - * - * Takes className or end of classFQN and converts it to WPCS "class-" prefixed filename. - * - * @param string $class className or classFNQ. - * @param string $object_type the type of object interface, trait or class (default). - * - * @return string - */ - private function get_file_applying_wp_standards($class, $object_type = 'class') - { - $args = $this->get_args(); - $object_type = \in_array($object_type, array('class', 'interface', 'trait'), \true) ? $object_type : 'class'; - // Sanitized class and namespace prefix. - $sanitized_class = $this->sanitize_namespace($class, \false); - // Gets namespace file path. - $namespaces_arr = \explode('\\', $sanitized_class); - $final_file = \array_pop($namespaces_arr); - // Final file name. - if (\in_array('file', $args['lowercase'], \true)) { - $final_file = \strtolower($final_file); - } - // Final file with underscores replaced. - if (\in_array('file', $args['underscore_to_hyphen'], \true)) { - $final_file = \str_replace(array('_', "\x00"), array('-', ''), $final_file); - } - // Prepend class. - if ($args['prepend_class'] || $args['prepend_interface'] || $args['prepend_trait']) { - $prepended = \preg_replace('/(.*)-abstract$/', 'abstract-$1', $final_file); - // If no changes were made when looking for interfaces and abstract classes, prepend "class-". - if ($prepended === $final_file) { - $final_file = $object_type . '-' . $final_file; - } else { - $final_file = $prepended; - } - } - $final_file .= '.php'; - return $final_file; - } - /** - * Sanitizes file path. - * Removes leading and trailing / (DIRECTORY_SEPARATOR). - * - * @param string $file_path File path. - * - * @return string - */ - private function sanitize_file_path($file_path) - { - return \trim($file_path, \DIRECTORY_SEPARATOR); - } - /** - * Sanitizes namespace or classFQN - * - * @param string $namespace Namespace or classFQN to sanitize. - * @param bool $add_backslash Add a trailing backslash. - * - * @return string - */ - private function sanitize_namespace($namespace, $add_backslash = \false) - { - if ($add_backslash) { - return \trim($namespace, '\\') . '\\'; - } else { - return \trim($namespace, '\\'); - } - } - /** - * Converts a namespaced class in a file to be loaded - * - * @param string $class classFQN. - * @param bool $check_loading_need Should short circuit if already loaded. - * - * @return array(); - */ - public function convert_class_to_file($class, $check_loading_need = \false) - { - if ($check_loading_need) { - if (!$this->need_to_autoload($class)) { - return array(); - } - } - $args = $this->get_args(); - $namespace_file_path = $this->get_namespace_file_path($class); - $final_files = array($this->get_file_applying_wp_standards($class)); - if ($args['prepend_interface']) { - $final_files[] = $this->get_file_applying_wp_standards($class, 'interface'); - } - if ($args['prepend_trait']) { - $final_files[] = $this->get_file_applying_wp_standards($class, 'trait'); - } - $class_files = array(); - $dir = $this->get_dir(); - foreach ($final_files as $final_file) { - if (\is_array($dir)) { - foreach ($dir as $class_dir) { - $class_files[] = $class_dir . $namespace_file_path . $final_file; - } - } else { - $class_files[] = $dir . $namespace_file_path . $final_file; - } - } - return $class_files; - } - /** - * Get the directory of the file that instantiated this class. - * - * phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace - */ - public function get_calling_directory() - { - $debug_backtrace = \debug_backtrace(); - // [0] is the __construct function, [1] is who called it. - $calling_file = $debug_backtrace[1]['file']; - $calling_directory = \dirname($calling_file); - return $calling_directory; - } - /** - * Get the namespace of the file that instantiated this class, presumably the root namespace. - * - * phpcs:disable WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace - * phpcs:disable WordPress.WP.AlternativeFunctions.file_system_read_fopen - * phpcs:disable WordPress.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition - * phpcs:disable WordPress.WP.AlternativeFunctions.file_system_read_fclose - */ - protected function get_calling_file_namespace() - { - $debug_backtrace = \debug_backtrace(); - // [0] is the __construct function, [1] is who called it. - $calling_file = $debug_backtrace[1]['file']; - $calling_namespace = null; - $handle = \fopen($calling_file, 'r'); - if ($handle) { - while (\false !== ($line = \fgets($handle))) { - if (0 === \strpos($line, 'namespace')) { - $parts = \explode(' ', $line); - $calling_namespace = \rtrim(\trim($parts[1]), ';'); - break; - } - } - \fclose($handle); - } - return $calling_namespace; - } - /** - * Getter for autoloader settings. - * - * @return array Associative array of settings as detailed in the constructor PHPDoc. - */ - public function get_args() - { - return $this->args; - } - /** - * Setter for autoloader settings. - * - * @param array $args Associative array of settings as detailed in the constructor PHPDoc. - */ - public function set_args($args) - { - $this->args = $args; - } - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Base32.php b/dependencies/paragonie/constant_time_encoding/src/Base32.php deleted file mode 100644 index b83ac3f..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Base32.php +++ /dev/null @@ -1,404 +0,0 @@ - 96 && $src < 123) $ret += $src - 97 + 1; // -64 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 96; - // if ($src > 0x31 && $src < 0x38) $ret += $src - 24 + 1; // -23 - $ret += (0x31 - $src & $src - 0x38) >> 8 & $src - 23; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 5-bit integers - * into 8-bit integers. - * - * Uppercase variant. - * - * @param int $src - * @return int - */ - protected static function decode5BitsUpper(int $src) : int - { - $ret = -1; - // if ($src > 64 && $src < 91) $ret += $src - 65 + 1; // -64 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64; - // if ($src > 0x31 && $src < 0x38) $ret += $src - 24 + 1; // -23 - $ret += (0x31 - $src & $src - 0x38) >> 8 & $src - 23; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode5Bits(int $src) : string - { - $diff = 0x61; - // if ($src > 25) $ret -= 72; - $diff -= 25 - $src >> 8 & 73; - return \pack('C', $src + $diff); - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * Uppercase variant. - * - * @param int $src - * @return string - */ - protected static function encode5BitsUpper(int $src) : string - { - $diff = 0x41; - // if ($src > 25) $ret -= 40; - $diff -= 25 - $src >> 8 & 41; - return \pack('C', $src + $diff); - } - /** - * @param string $encodedString - * @param bool $upper - * @return string - */ - public static function decodeNoPadding(string $encodedString, bool $upper = \false) : string - { - $srcLen = Binary::safeStrlen($encodedString); - if ($srcLen === 0) { - return ''; - } - if (($srcLen & 7) === 0) { - for ($j = 0; $j < 7 && $j < $srcLen; ++$j) { - if ($encodedString[$srcLen - $j - 1] === '=') { - throw new InvalidArgumentException("decodeNoPadding() doesn't tolerate padding"); - } - } - } - return static::doDecode($encodedString, $upper, \true); - } - /** - * Base32 decoding - * - * @param string $src - * @param bool $upper - * @param bool $strictPadding - * @return string - * - * @throws TypeError - * @psalm-suppress RedundantCondition - */ - protected static function doDecode(string $src, bool $upper = \false, bool $strictPadding = \false) : string - { - // We do this to reduce code duplication: - $method = $upper ? 'decode5BitsUpper' : 'decode5Bits'; - // Remove padding - $srcLen = Binary::safeStrlen($src); - if ($srcLen === 0) { - return ''; - } - if ($strictPadding) { - if (($srcLen & 7) === 0) { - for ($j = 0; $j < 7; ++$j) { - if ($src[$srcLen - 1] === '=') { - $srcLen--; - } else { - break; - } - } - } - if (($srcLen & 7) === 1) { - throw new RangeException('Incorrect padding'); - } - } else { - $src = \rtrim($src, '='); - $srcLen = Binary::safeStrlen($src); - } - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 8 <= $srcLen; $i += 8) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($src, $i, 8)); - /** @var int $c0 */ - $c0 = static::$method($chunk[1]); - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - /** @var int $c5 */ - $c5 = static::$method($chunk[6]); - /** @var int $c6 */ - $c6 = static::$method($chunk[7]); - /** @var int $c7 */ - $c7 = static::$method($chunk[8]); - $dest .= \pack('CCCCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff, ($c4 << 7 | $c5 << 2 | $c6 >> 3) & 0xff, ($c6 << 5 | $c7) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6 | $c7) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i)); - /** @var int $c0 */ - $c0 = static::$method($chunk[1]); - if ($i + 6 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - /** @var int $c5 */ - $c5 = static::$method($chunk[6]); - /** @var int $c6 */ - $c6 = static::$method($chunk[7]); - $dest .= \pack('CCCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff, ($c4 << 7 | $c5 << 2 | $c6 >> 3) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6) >> 8; - if ($strictPadding) { - $err |= $c6 << 5 & 0xff; - } - } elseif ($i + 5 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - /** @var int $c5 */ - $c5 = static::$method($chunk[6]); - $dest .= \pack('CCCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff, ($c4 << 7 | $c5 << 2) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5) >> 8; - } elseif ($i + 4 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - $dest .= \pack('CCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4) >> 8; - if ($strictPadding) { - $err |= $c4 << 7 & 0xff; - } - } elseif ($i + 3 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - $dest .= \pack('CC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - if ($strictPadding) { - $err |= $c3 << 4 & 0xff; - } - } elseif ($i + 2 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - $dest .= \pack('CC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1) & 0xff); - $err |= ($c0 | $c1 | $c2) >> 8; - if ($strictPadding) { - $err |= $c2 << 6 & 0xff; - } - } elseif ($i + 1 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - $dest .= \pack('C', ($c0 << 3 | $c1 >> 2) & 0xff); - $err |= ($c0 | $c1) >> 8; - if ($strictPadding) { - $err |= $c1 << 6 & 0xff; - } - } else { - $dest .= \pack('C', $c0 << 3 & 0xff); - $err |= $c0 >> 8; - } - } - $check = $err === 0; - if (!$check) { - throw new RangeException('Base32::doDecode() only expects characters in the correct base32 alphabet'); - } - return $dest; - } - /** - * Base32 Encoding - * - * @param string $src - * @param bool $upper - * @param bool $pad - * @return string - * @throws TypeError - */ - protected static function doEncode(string $src, bool $upper = \false, $pad = \true) : string - { - // We do this to reduce code duplication: - $method = $upper ? 'encode5BitsUpper' : 'encode5Bits'; - $dest = ''; - $srcLen = Binary::safeStrlen($src); - // Main loop (no padding): - for ($i = 0; $i + 5 <= $srcLen; $i += 5) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($src, $i, 5)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $b3 = $chunk[4]; - $b4 = $chunk[5]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method(($b1 << 4 | $b2 >> 4) & 31) . static::$method(($b2 << 1 | $b3 >> 7) & 31) . static::$method($b3 >> 2 & 31) . static::$method(($b3 << 3 | $b4 >> 5) & 31) . static::$method($b4 & 31); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 3 < $srcLen) { - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $b3 = $chunk[4]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method(($b1 << 4 | $b2 >> 4) & 31) . static::$method(($b2 << 1 | $b3 >> 7) & 31) . static::$method($b3 >> 2 & 31) . static::$method($b3 << 3 & 31); - if ($pad) { - $dest .= '='; - } - } elseif ($i + 2 < $srcLen) { - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method(($b1 << 4 | $b2 >> 4) & 31) . static::$method($b2 << 1 & 31); - if ($pad) { - $dest .= '==='; - } - } elseif ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method($b1 << 4 & 31); - if ($pad) { - $dest .= '===='; - } - } else { - $dest .= static::$method($b0 >> 3 & 31) . static::$method($b0 << 2 & 31); - if ($pad) { - $dest .= '======'; - } - } - } - return $dest; - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Base32Hex.php b/dependencies/paragonie/constant_time_encoding/src/Base32Hex.php deleted file mode 100644 index b4f21fc..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Base32Hex.php +++ /dev/null @@ -1,98 +0,0 @@ - 0x30 && $src < 0x3a) ret += $src - 0x2e + 1; // -47 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src - 47; - // if ($src > 0x60 && $src < 0x77) ret += $src - 0x61 + 10 + 1; // -86 - $ret += (0x60 - $src & $src - 0x77) >> 8 & $src - 86; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 5-bit integers - * into 8-bit integers. - * - * @param int $src - * @return int - */ - protected static function decode5BitsUpper(int $src) : int - { - $ret = -1; - // if ($src > 0x30 && $src < 0x3a) ret += $src - 0x2e + 1; // -47 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src - 47; - // if ($src > 0x40 && $src < 0x57) ret += $src - 0x41 + 10 + 1; // -54 - $ret += (0x40 - $src & $src - 0x57) >> 8 & $src - 54; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode5Bits(int $src) : string - { - $src += 0x30; - // if ($src > 0x39) $src += 0x61 - 0x3a; // 39 - $src += 0x39 - $src >> 8 & 39; - return \pack('C', $src); - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * Uppercase variant. - * - * @param int $src - * @return string - */ - protected static function encode5BitsUpper(int $src) : string - { - $src += 0x30; - // if ($src > 0x39) $src += 0x41 - 0x3a; // 7 - $src += 0x39 - $src >> 8 & 7; - return \pack('C', $src); - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Base64.php b/dependencies/paragonie/constant_time_encoding/src/Base64.php deleted file mode 100644 index 25d4773..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Base64.php +++ /dev/null @@ -1,257 +0,0 @@ - $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($src, $i, 3)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . static::encode6Bits(($b1 << 2 | $b2 >> 6) & 63) . static::encode6Bits($b2 & 63); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . static::encode6Bits($b1 << 2 & 63); - if ($pad) { - $dest .= '='; - } - } else { - $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits($b0 << 4 & 63); - if ($pad) { - $dest .= '=='; - } - } - } - return $dest; - } - /** - * decode from base64 into binary - * - * Base64 character set "./[A-Z][a-z][0-9]" - * - * @param string $encodedString - * @param bool $strictPadding - * @return string - * - * @throws RangeException - * @throws TypeError - * @psalm-suppress RedundantCondition - */ - public static function decode(string $encodedString, bool $strictPadding = \false) : string - { - // Remove padding - $srcLen = Binary::safeStrlen($encodedString); - if ($srcLen === 0) { - return ''; - } - if ($strictPadding) { - if (($srcLen & 3) === 0) { - if ($encodedString[$srcLen - 1] === '=') { - $srcLen--; - if ($encodedString[$srcLen - 1] === '=') { - $srcLen--; - } - } - } - if (($srcLen & 3) === 1) { - throw new RangeException('Incorrect padding'); - } - if ($encodedString[$srcLen - 1] === '=') { - throw new RangeException('Incorrect padding'); - } - } else { - $encodedString = \rtrim($encodedString, '='); - $srcLen = Binary::safeStrlen($encodedString); - } - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 4 <= $srcLen; $i += 4) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($encodedString, $i, 4)); - $c0 = static::decode6Bits($chunk[1]); - $c1 = static::decode6Bits($chunk[2]); - $c2 = static::decode6Bits($chunk[3]); - $c3 = static::decode6Bits($chunk[4]); - $dest .= \pack('CCC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff, ($c2 << 6 | $c3) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = \unpack('C*', Binary::safeSubstr($encodedString, $i, $srcLen - $i)); - $c0 = static::decode6Bits($chunk[1]); - if ($i + 2 < $srcLen) { - $c1 = static::decode6Bits($chunk[2]); - $c2 = static::decode6Bits($chunk[3]); - $dest .= \pack('CC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff); - $err |= ($c0 | $c1 | $c2) >> 8; - if ($strictPadding) { - $err |= $c2 << 6 & 0xff; - } - } elseif ($i + 1 < $srcLen) { - $c1 = static::decode6Bits($chunk[2]); - $dest .= \pack('C', ($c0 << 2 | $c1 >> 4) & 0xff); - $err |= ($c0 | $c1) >> 8; - if ($strictPadding) { - $err |= $c1 << 4 & 0xff; - } - } elseif ($strictPadding) { - $err |= 1; - } - } - $check = $err === 0; - if (!$check) { - throw new RangeException('Base64::decode() only expects characters in the correct base64 alphabet'); - } - return $dest; - } - /** - * @param string $encodedString - * @return string - */ - public static function decodeNoPadding(string $encodedString) : string - { - $srcLen = Binary::safeStrlen($encodedString); - if ($srcLen === 0) { - return ''; - } - if (($srcLen & 3) === 0) { - if ($encodedString[$srcLen - 1] === '=') { - throw new InvalidArgumentException("decodeNoPadding() doesn't tolerate padding"); - } - if (($srcLen & 3) > 1) { - if ($encodedString[$srcLen - 2] === '=') { - throw new InvalidArgumentException("decodeNoPadding() doesn't tolerate padding"); - } - } - } - return static::decode($encodedString, \true); - } - /** - * Uses bitwise operators instead of table-lookups to turn 6-bit integers - * into 8-bit integers. - * - * Base64 character set: - * [A-Z] [a-z] [0-9] + / - * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f - * - * @param int $src - * @return int - */ - protected static function decode6Bits(int $src) : int - { - $ret = -1; - // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64; - // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 70; - // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 5; - // if ($src == 0x2b) $ret += 62 + 1; - $ret += (0x2a - $src & $src - 0x2c) >> 8 & 63; - // if ($src == 0x2f) ret += 63 + 1; - $ret += (0x2e - $src & $src - 0x30) >> 8 & 64; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits(int $src) : string - { - $diff = 0x41; - // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 - $diff += 25 - $src >> 8 & 6; - // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 - $diff -= 51 - $src >> 8 & 75; - // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 - $diff -= 61 - $src >> 8 & 15; - // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 - $diff += 62 - $src >> 8 & 3; - return \pack('C', $src + $diff); - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Base64DotSlash.php b/dependencies/paragonie/constant_time_encoding/src/Base64DotSlash.php deleted file mode 100644 index 6a3c872..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Base64DotSlash.php +++ /dev/null @@ -1,78 +0,0 @@ - 0x2d && $src < 0x30) ret += $src - 0x2e + 1; // -45 - $ret += (0x2d - $src & $src - 0x30) >> 8 & $src - 45; - // if ($src > 0x40 && $src < 0x5b) ret += $src - 0x41 + 2 + 1; // -62 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 62; - // if ($src > 0x60 && $src < 0x7b) ret += $src - 0x61 + 28 + 1; // -68 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 68; - // if ($src > 0x2f && $src < 0x3a) ret += $src - 0x30 + 54 + 1; // 7 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 7; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits(int $src) : string - { - $src += 0x2e; - // if ($src > 0x2f) $src += 0x41 - 0x30; // 17 - $src += 0x2f - $src >> 8 & 17; - // if ($src > 0x5a) $src += 0x61 - 0x5b; // 6 - $src += 0x5a - $src >> 8 & 6; - // if ($src > 0x7a) $src += 0x30 - 0x7b; // -75 - $src -= 0x7a - $src >> 8 & 75; - return \pack('C', $src); - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php b/dependencies/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php deleted file mode 100644 index fcb2fc4..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php +++ /dev/null @@ -1,74 +0,0 @@ - 0x2d && $src < 0x3a) ret += $src - 0x2e + 1; // -45 - $ret += (0x2d - $src & $src - 0x3a) >> 8 & $src - 45; - // if ($src > 0x40 && $src < 0x5b) ret += $src - 0x41 + 12 + 1; // -52 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 52; - // if ($src > 0x60 && $src < 0x7b) ret += $src - 0x61 + 38 + 1; // -58 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 58; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits(int $src) : string - { - $src += 0x2e; - // if ($src > 0x39) $src += 0x41 - 0x3a; // 7 - $src += 0x39 - $src >> 8 & 7; - // if ($src > 0x5a) $src += 0x61 - 0x5b; // 6 - $src += 0x5a - $src >> 8 & 6; - return \pack('C', $src); - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Base64UrlSafe.php b/dependencies/paragonie/constant_time_encoding/src/Base64UrlSafe.php deleted file mode 100644 index 56ad7b7..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Base64UrlSafe.php +++ /dev/null @@ -1,82 +0,0 @@ - 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64; - // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 70; - // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 5; - // if ($src == 0x2c) $ret += 62 + 1; - $ret += (0x2c - $src & $src - 0x2e) >> 8 & 63; - // if ($src == 0x5f) ret += 63 + 1; - $ret += (0x5e - $src & $src - 0x60) >> 8 & 64; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits(int $src) : string - { - $diff = 0x41; - // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 - $diff += 25 - $src >> 8 & 6; - // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 - $diff -= 51 - $src >> 8 & 75; - // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 - $diff -= 61 - $src >> 8 & 13; - // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 - $diff += 62 - $src >> 8 & 49; - return \pack('C', $src + $diff); - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/Binary.php b/dependencies/paragonie/constant_time_encoding/src/Binary.php deleted file mode 100644 index 2e2de00..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/Binary.php +++ /dev/null @@ -1,85 +0,0 @@ - $chunk */ - $chunk = \unpack('C', $binString[$i]); - $c = $chunk[1] & 0xf; - $b = $chunk[1] >> 4; - $hex .= \pack('CC', 87 + $b + ($b - 10 >> 8 & ~38), 87 + $c + ($c - 10 >> 8 & ~38)); - } - return $hex; - } - /** - * Convert a binary string into a hexadecimal string without cache-timing - * leaks, returning uppercase letters (as per RFC 4648) - * - * @param string $binString (raw binary) - * @return string - * @throws TypeError - */ - public static function encodeUpper(string $binString) : string - { - $hex = ''; - $len = Binary::safeStrlen($binString); - for ($i = 0; $i < $len; ++$i) { - /** @var array $chunk */ - $chunk = \unpack('C', $binString[$i]); - $c = $chunk[1] & 0xf; - $b = $chunk[1] >> 4; - $hex .= \pack('CC', 55 + $b + ($b - 10 >> 8 & ~6), 55 + $c + ($c - 10 >> 8 & ~6)); - } - return $hex; - } - /** - * Convert a hexadecimal string into a binary string without cache-timing - * leaks - * - * @param string $encodedString - * @param bool $strictPadding - * @return string (raw binary) - * @throws RangeException - */ - public static function decode(string $encodedString, bool $strictPadding = \false) : string - { - $hex_pos = 0; - $bin = ''; - $c_acc = 0; - $hex_len = Binary::safeStrlen($encodedString); - $state = 0; - if (($hex_len & 1) !== 0) { - if ($strictPadding) { - throw new RangeException('Expected an even number of hexadecimal characters'); - } else { - $encodedString = '0' . $encodedString; - ++$hex_len; - } - } - /** @var array $chunk */ - $chunk = \unpack('C*', $encodedString); - while ($hex_pos < $hex_len) { - ++$hex_pos; - $c = $chunk[$hex_pos]; - $c_num = $c ^ 48; - $c_num0 = $c_num - 10 >> 8; - $c_alpha = ($c & ~32) - 55; - $c_alpha0 = ($c_alpha - 10 ^ $c_alpha - 16) >> 8; - if (($c_num0 | $c_alpha0) === 0) { - throw new RangeException('Expected hexadecimal character'); - } - $c_val = $c_num0 & $c_num | $c_alpha & $c_alpha0; - if ($state === 0) { - $c_acc = $c_val * 16; - } else { - $bin .= \pack('C', $c_acc | $c_val); - } - $state ^= 1; - } - return $bin; - } -} diff --git a/dependencies/paragonie/constant_time_encoding/src/RFC4648.php b/dependencies/paragonie/constant_time_encoding/src/RFC4648.php deleted file mode 100644 index 62e4f72..0000000 --- a/dependencies/paragonie/constant_time_encoding/src/RFC4648.php +++ /dev/null @@ -1,176 +0,0 @@ - "Zm9v" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64Encode(string $str) : string - { - return Base64::encode($str); - } - /** - * RFC 4648 Base64 decoding - * - * "Zm9v" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64Decode(string $str) : string - { - return Base64::decode($str, \true); - } - /** - * RFC 4648 Base64 (URL Safe) encoding - * - * "foo" -> "Zm9v" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64UrlSafeEncode(string $str) : string - { - return Base64UrlSafe::encode($str); - } - /** - * RFC 4648 Base64 (URL Safe) decoding - * - * "Zm9v" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64UrlSafeDecode(string $str) : string - { - return Base64UrlSafe::decode($str, \true); - } - /** - * RFC 4648 Base32 encoding - * - * "foo" -> "MZXW6===" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32Encode(string $str) : string - { - return Base32::encodeUpper($str); - } - /** - * RFC 4648 Base32 encoding - * - * "MZXW6===" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32Decode(string $str) : string - { - return Base32::decodeUpper($str, \true); - } - /** - * RFC 4648 Base32-Hex encoding - * - * "foo" -> "CPNMU===" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32HexEncode(string $str) : string - { - return Base32::encodeUpper($str); - } - /** - * RFC 4648 Base32-Hex decoding - * - * "CPNMU===" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32HexDecode(string $str) : string - { - return Base32::decodeUpper($str, \true); - } - /** - * RFC 4648 Base16 decoding - * - * "foo" -> "666F6F" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base16Encode(string $str) : string - { - return Hex::encodeUpper($str); - } - /** - * RFC 4648 Base16 decoding - * - * "666F6F" -> "foo" - * - * @param string $str - * @return string - */ - public static function base16Decode(string $str) : string - { - return Hex::decode($str, \true); - } -} diff --git a/dependencies/paragonie/random_compat/build-phar.sh b/dependencies/paragonie/random_compat/build-phar.sh deleted file mode 100644 index b4a5ba3..0000000 --- a/dependencies/paragonie/random_compat/build-phar.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) ) - -php -dphar.readonly=0 "$basedir/other/build_phar.php" $* \ No newline at end of file diff --git a/dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey b/dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey deleted file mode 100644 index eb50ebf..0000000 --- a/dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm -pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p -+h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc ------END PUBLIC KEY----- diff --git a/dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey.asc b/dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey.asc deleted file mode 100644 index 6a1d7f3..0000000 --- a/dependencies/paragonie/random_compat/dist/random_compat.phar.pubkey.asc +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.22 (MingW32) - -iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip -QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg -1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW -NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA -NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV -JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74= -=B6+8 ------END PGP SIGNATURE----- diff --git a/dependencies/paragonie/random_compat/lib/random.php b/dependencies/paragonie/random_compat/lib/random.php deleted file mode 100644 index 39d1868..0000000 --- a/dependencies/paragonie/random_compat/lib/random.php +++ /dev/null @@ -1,34 +0,0 @@ -buildFromDirectory(\dirname(__DIR__) . '/lib'); -\rename(\dirname(__DIR__) . '/lib/index.php', \dirname(__DIR__) . '/lib/random.php'); -/** - * If we pass an (optional) path to a private key as a second argument, we will - * sign the Phar with OpenSSL. - * - * If you leave this out, it will produce an unsigned .phar! - */ -if ($argc > 1) { - if (!@\is_readable($argv[1])) { - echo 'Could not read the private key file:', $argv[1], "\n"; - exit(255); - } - $pkeyFile = \file_get_contents($argv[1]); - $private = \openssl_get_privatekey($pkeyFile); - if ($private !== \false) { - $pkey = ''; - \openssl_pkey_export($private, $pkey); - $phar->setSignatureAlgorithm(\Phar::OPENSSL, $pkey); - /** - * Save the corresponding public key to the file - */ - if (!@\is_readable($dist . '/random_compat.phar.pubkey')) { - $details = \openssl_pkey_get_details($private); - \file_put_contents($dist . '/random_compat.phar.pubkey', $details['key']); - } - } else { - echo 'An error occurred reading the private key from OpenSSL.', "\n"; - exit(255); - } -} diff --git a/dependencies/paragonie/random_compat/psalm-autoload.php b/dependencies/paragonie/random_compat/psalm-autoload.php deleted file mode 100644 index ae4cb3e..0000000 --- a/dependencies/paragonie/random_compat/psalm-autoload.php +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/dependencies/phpdocumentor/reflection-common/src/Element.php b/dependencies/phpdocumentor/reflection-common/src/Element.php deleted file mode 100644 index 989da2f..0000000 --- a/dependencies/phpdocumentor/reflection-common/src/Element.php +++ /dev/null @@ -1,27 +0,0 @@ -fqsen = $fqsen; - if (isset($matches[2])) { - $this->name = $matches[2]; - } else { - $matches = explode('\\', $fqsen); - $name = end($matches); - assert(is_string($name)); - $this->name = trim($name, '()'); - } - } - /** - * converts this class to string. - */ - public function __toString() : string - { - return $this->fqsen; - } - /** - * Returns the name of the element without path. - */ - public function getName() : string - { - return $this->name; - } -} diff --git a/dependencies/phpdocumentor/reflection-common/src/Location.php b/dependencies/phpdocumentor/reflection-common/src/Location.php deleted file mode 100644 index 2d1aef3..0000000 --- a/dependencies/phpdocumentor/reflection-common/src/Location.php +++ /dev/null @@ -1,47 +0,0 @@ -lineNumber = $lineNumber; - $this->columnNumber = $columnNumber; - } - /** - * Returns the line number that is covered by this location. - */ - public function getLineNumber() : int - { - return $this->lineNumber; - } - /** - * Returns the column number (character position on a line) for this location object. - */ - public function getColumnNumber() : int - { - return $this->columnNumber; - } -} diff --git a/dependencies/phpdocumentor/reflection-common/src/Project.php b/dependencies/phpdocumentor/reflection-common/src/Project.php deleted file mode 100644 index b891035..0000000 --- a/dependencies/phpdocumentor/reflection-common/src/Project.php +++ /dev/null @@ -1,23 +0,0 @@ -summary = $summary; - $this->description = $description ?: new DocBlock\Description(''); - foreach ($tags as $tag) { - $this->addTag($tag); - } - $this->context = $context; - $this->location = $location; - $this->isTemplateEnd = $isTemplateEnd; - $this->isTemplateStart = $isTemplateStart; - } - public function getSummary() : string - { - return $this->summary; - } - public function getDescription() : DocBlock\Description - { - return $this->description; - } - /** - * Returns the current context. - */ - public function getContext() : ?Types\Context - { - return $this->context; - } - /** - * Returns the current location. - */ - public function getLocation() : ?Location - { - return $this->location; - } - /** - * Returns whether this DocBlock is the start of a Template section. - * - * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker - * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. - * - * An example of such an opening is: - * - * ``` - * /**#@+ - * * My DocBlock - * * / - * ``` - * - * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all - * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). - * - * @see self::isTemplateEnd() for the check whether a closing marker was provided. - */ - public function isTemplateStart() : bool - { - return $this->isTemplateStart; - } - /** - * Returns whether this DocBlock is the end of a Template section. - * - * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - */ - public function isTemplateEnd() : bool - { - return $this->isTemplateEnd; - } - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - /** - * Returns an array of tags matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return Tag[] - */ - public function getTagsByName(string $name) : array - { - $result = []; - foreach ($this->getTags() as $tag) { - if ($tag->getName() !== $name) { - continue; - } - $result[] = $tag; - } - return $result; - } - /** - * Returns an array of tags with type matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return TagWithType[] - */ - public function getTagsWithTypeByName(string $name) : array - { - $result = []; - foreach ($this->getTagsByName($name) as $tag) { - if (!$tag instanceof TagWithType) { - continue; - } - $result[] = $tag; - } - return $result; - } - /** - * Checks if a tag of a certain type is present in this DocBlock. - * - * @param string $name Tag name to check for. - */ - public function hasTag(string $name) : bool - { - foreach ($this->getTags() as $tag) { - if ($tag->getName() === $name) { - return \true; - } - } - return \false; - } - /** - * Remove a tag from this DocBlock. - * - * @param Tag $tagToRemove The tag to remove. - */ - public function removeTag(Tag $tagToRemove) : void - { - foreach ($this->tags as $key => $tag) { - if ($tag === $tagToRemove) { - unset($this->tags[$key]); - break; - } - } - } - /** - * Adds a tag to this DocBlock. - * - * @param Tag $tag The tag to add. - */ - private function addTag(Tag $tag) : void - { - $this->tags[] = $tag; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Description.php deleted file mode 100644 index 1202632..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Description.php +++ /dev/null @@ -1,103 +0,0 @@ -create('This is a {@see Description}', $context); - * - * The description factory will interpret the given body and create a body template and list of tags from them, and pass - * that onto the constructor if this class. - * - * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace - * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial - * > type names and FQSENs. - * - * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: - * - * $description = new Description( - * 'This is a %1$s', - * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] - * ); - * - * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object - * is mainly responsible for rendering. - * - * @see DescriptionFactory to create a new Description. - * @see Description\Formatter for the formatting of the body and tags. - */ -class Description -{ - /** @var string */ - private $bodyTemplate; - /** @var Tag[] */ - private $tags; - /** - * Initializes a Description with its body (template) and a listing of the tags used in the body template. - * - * @param Tag[] $tags - */ - public function __construct(string $bodyTemplate, array $tags = []) - { - $this->bodyTemplate = $bodyTemplate; - $this->tags = $tags; - } - /** - * Returns the body template. - */ - public function getBodyTemplate() : string - { - return $this->bodyTemplate; - } - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - /** - * Renders this description as a string where the provided formatter will format the tags in the expected string - * format. - */ - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new PassthroughFormatter(); - } - $tags = []; - foreach ($this->tags as $tag) { - $tags[] = '{' . $formatter->format($tag) . '}'; - } - return vsprintf($this->bodyTemplate, $tags); - } - /** - * Returns a plain string representation of this description. - */ - public function __toString() : string - { - return $this->render(); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php deleted file mode 100644 index 3c1d523..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php +++ /dev/null @@ -1,154 +0,0 @@ -tagFactory = $tagFactory; - } - /** - * Returns the parsed text of this description. - */ - public function create(string $contents, ?TypeContext $context = null) : Description - { - $tokens = $this->lex($contents); - $count = count($tokens); - $tagCount = 0; - $tags = []; - for ($i = 1; $i < $count; $i += 2) { - $tags[] = $this->tagFactory->create($tokens[$i], $context); - $tokens[$i] = '%' . ++$tagCount . '$s'; - } - //In order to allow "literal" inline tags, the otherwise invalid - //sequence "{@}" is changed to "@", and "{}" is changed to "}". - //"%" is escaped to "%%" because of vsprintf. - //See unit tests for examples. - for ($i = 0; $i < $count; $i += 2) { - $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); - } - return new Description(implode('', $tokens), $tags); - } - /** - * Strips the contents from superfluous whitespace and splits the description into a series of tokens. - * - * @return string[] A series of tokens of which the description text is composed. - */ - private function lex(string $contents) : array - { - $contents = $this->removeSuperfluousStartingWhitespace($contents); - // performance optimalization; if there is no inline tag, don't bother splitting it up. - if (strpos($contents, '{@') === \false) { - return [$contents]; - } - return Utils::pregSplit('/\\{ - # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. - (?!@\\}) - # We want to capture the whole tag line, but without the inline tag delimiters. - (\\@ - # Match everything up to the next delimiter. - [^{}]* - # Nested inline tag content should not be captured, or it will appear in the result separately. - (?: - # Match nested inline tags. - (?: - # Because we did not catch the tag delimiters earlier, we must be explicit with them here. - # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. - \\{(?1)?\\} - | - # Make sure we match hanging "{". - \\{ - ) - # Match content after the nested inline tag. - [^{}]* - )* # If there are more inline tags, match them as well. We use "*" since there may not be any - # nested inline tags. - ) - \\}/Sux', $contents, 0, PREG_SPLIT_DELIM_CAPTURE); - } - /** - * Removes the superfluous from a multi-line description. - * - * When a description has more than one line then it can happen that the second and subsequent lines have an - * additional indentation. This is commonly in use with tags like this: - * - * {@}since 1.1.0 This is an example - * description where we have an - * indentation in the second and - * subsequent lines. - * - * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent - * lines and this may cause rendering issues when, for example, using a Markdown converter. - */ - private function removeSuperfluousStartingWhitespace(string $contents) : string - { - $lines = Utils::pregSplit("/\r\n?|\n/", $contents); - // if there is only one line then we don't have lines with superfluous whitespace and - // can use the contents as-is - if (count($lines) <= 1) { - return $contents; - } - // determine how many whitespace characters need to be stripped - $startingSpaceCount = 9999999; - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - // lines with a no length do not count as they are not indented at all - if (trim($lines[$i]) === '') { - continue; - } - // determine the number of prefixing spaces by checking the difference in line length before and after - // an ltrim - $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); - } - // strip the number of spaces from each line - if ($startingSpaceCount > 0) { - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - $lines[$i] = substr($lines[$i], $startingSpaceCount); - } - } - return implode("\n", $lines); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php deleted file mode 100644 index 29da14e..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php +++ /dev/null @@ -1,133 +0,0 @@ -getFilePath(); - $file = $this->getExampleFileContents($filename); - if (!$file) { - return sprintf('** File not found : %s **', $filename); - } - return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); - } - /** - * Registers the project's root directory where an 'examples' folder can be expected. - */ - public function setSourceDirectory(string $directory = '') : void - { - $this->sourceDirectory = $directory; - } - /** - * Returns the project's root directory where an 'examples' folder can be expected. - */ - public function getSourceDirectory() : string - { - return $this->sourceDirectory; - } - /** - * Registers a series of directories that may contain examples. - * - * @param string[] $directories - */ - public function setExampleDirectories(array $directories) : void - { - $this->exampleDirectories = $directories; - } - /** - * Returns a series of directories that may contain examples. - * - * @return string[] - */ - public function getExampleDirectories() : array - { - return $this->exampleDirectories; - } - /** - * Attempts to find the requested example file and returns its contents or null if no file was found. - * - * This method will try several methods in search of the given example file, the first one it encounters is - * returned: - * - * 1. Iterates through all examples folders for the given filename - * 2. Checks the source folder for the given filename - * 3. Checks the 'examples' folder in the current working directory for examples - * 4. Checks the path relative to the current working directory for the given filename - * - * @return string[] all lines of the example file - */ - private function getExampleFileContents(string $filename) : ?array - { - $normalizedPath = null; - foreach ($this->exampleDirectories as $directory) { - $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); - if (is_readable($exampleFileFromConfig)) { - $normalizedPath = $exampleFileFromConfig; - break; - } - } - if (!$normalizedPath) { - if (is_readable($this->getExamplePathFromSource($filename))) { - $normalizedPath = $this->getExamplePathFromSource($filename); - } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { - $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); - } elseif (is_readable($filename)) { - $normalizedPath = $filename; - } - } - $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : \false; - return $lines !== \false ? $lines : null; - } - /** - * Get example filepath based on the example directory inside your project. - */ - private function getExamplePathFromExampleDirectory(string $file) : string - { - return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; - } - /** - * Returns a path to the example file in the given directory.. - */ - private function constructExamplePath(string $directory, string $file) : string - { - return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; - } - /** - * Get example filepath based on sourcecode. - */ - private function getExamplePathFromSource(string $file) : string - { - return sprintf('%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"')); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php deleted file mode 100644 index a1b054b..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php +++ /dev/null @@ -1,109 +0,0 @@ -indent = $indent; - $this->indentString = $indentString; - $this->isFirstLineIndented = $indentFirstLine; - $this->lineLength = $lineLength; - $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); - $this->lineEnding = $lineEnding; - } - /** - * Generate a DocBlock comment. - * - * @param DocBlock $docblock The DocBlock to serialize. - * - * @return string The serialized doc block. - */ - public function getDocComment(DocBlock $docblock) : string - { - $indent = str_repeat($this->indentString, $this->indent); - $firstIndent = $this->isFirstLineIndented ? $indent : ''; - // 3 === strlen(' * ') - $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; - $text = $this->removeTrailingSpaces($indent, $this->addAsterisksForEachLine($indent, $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength))); - $comment = $firstIndent . "/**\n"; - if ($text) { - $comment .= $indent . ' * ' . $text . "\n"; - $comment .= $indent . " *\n"; - } - $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); - return str_replace("\n", $this->lineEnding, $comment . $indent . ' */'); - } - private function removeTrailingSpaces(string $indent, string $text) : string - { - return str_replace(sprintf("\n%s * \n", $indent), sprintf("\n%s *\n", $indent), $text); - } - private function addAsterisksForEachLine(string $indent, string $text) : string - { - return str_replace("\n", sprintf("\n%s * ", $indent), $text); - } - private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string - { - $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); - if ($wrapLength !== null) { - $text = wordwrap($text, $wrapLength); - return $text; - } - return $text; - } - private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string - { - foreach ($docblock->getTags() as $tag) { - $tagText = $this->tagFormatter->format($tag); - if ($wrapLength !== null) { - $tagText = wordwrap($tagText, $wrapLength); - } - $tagText = str_replace("\n", sprintf("\n%s * ", $indent), $tagText); - $comment .= sprintf("%s * %s\n", $indent, $tagText); - } - return $comment; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php deleted file mode 100644 index 30860e0..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php +++ /dev/null @@ -1,294 +0,0 @@ - Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise - * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to - * > verify that a dependency is actually passed. - * - * This Factory also features a Service Locator component that is used to pass the right dependencies to the - * `create` method of a tag; each dependency should be registered as a service or as a parameter. - * - * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass - * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. - */ -final class StandardTagFactory implements TagFactory -{ - /** PCRE regular expression matching a tag name. */ - public const REGEX_TAGNAME = '[\\w\\-\\_\\\\:]+'; - /** - * @var array> An array with a tag as a key, and an - * FQCN to a class that handles it as an array value. - */ - private $tagHandlerMappings = [ - 'author' => Author::class, - 'covers' => Covers::class, - 'deprecated' => Deprecated::class, - // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', - 'link' => LinkTag::class, - 'method' => Method::class, - 'param' => Param::class, - 'property-read' => PropertyRead::class, - 'property' => Property::class, - 'property-write' => PropertyWrite::class, - 'return' => Return_::class, - 'see' => SeeTag::class, - 'since' => Since::class, - 'source' => Source::class, - 'throw' => Throws::class, - 'throws' => Throws::class, - 'uses' => Uses::class, - 'var' => Var_::class, - 'version' => Version::class, - ]; - /** - * @var array> An array with a anotation s a key, and an - * FQCN to a class that handles it as an array value. - */ - private $annotationMappings = []; - /** - * @var ReflectionParameter[][] a lazy-loading cache containing parameters - * for each tagHandler that has been used. - */ - private $tagHandlerParameterCache = []; - /** @var FqsenResolver */ - private $fqsenResolver; - /** - * @var mixed[] an array representing a simple Service Locator where we can store parameters and - * services that can be inserted into the Factory Methods of Tag Handlers. - */ - private $serviceLocator = []; - /** - * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. - * - * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property - * is used. - * - * @see self::registerTagHandler() to add a new tag handler to the existing default list. - * - * @param array> $tagHandlers - */ - public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) - { - $this->fqsenResolver = $fqsenResolver; - if ($tagHandlers !== null) { - $this->tagHandlerMappings = $tagHandlers; - } - $this->addService($fqsenResolver, FqsenResolver::class); - } - public function create(string $tagLine, ?TypeContext $context = null) : Tag - { - if (!$context) { - $context = new TypeContext(''); - } - [$tagName, $tagBody] = $this->extractTagParts($tagLine); - return $this->createTag(trim($tagBody), $tagName, $context); - } - /** - * @param mixed $value - */ - public function addParameter(string $name, $value) : void - { - $this->serviceLocator[$name] = $value; - } - public function addService(object $service, ?string $alias = null) : void - { - $this->serviceLocator[$alias ?: get_class($service)] = $service; - } - public function registerTagHandler(string $tagName, string $handler) : void - { - Assert::stringNotEmpty($tagName); - Assert::classExists($handler); - Assert::implementsInterface($handler, Tag::class); - if (strpos($tagName, '\\') && $tagName[0] !== '\\') { - throw new InvalidArgumentException('A namespaced tag must have a leading backslash as it must be fully qualified'); - } - $this->tagHandlerMappings[$tagName] = $handler; - } - /** - * Extracts all components for a tag. - * - * @return string[] - */ - private function extractTagParts(string $tagLine) : array - { - $matches = []; - if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\\s\\(\\{])\\s*([^\\s].*)|$)/us', $tagLine, $matches)) { - throw new InvalidArgumentException('The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'); - } - if (count($matches) < 3) { - $matches[] = ''; - } - return array_slice($matches, 1); - } - /** - * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the - * body was invalid. - */ - private function createTag(string $body, string $name, TypeContext $context) : Tag - { - $handlerClassName = $this->findHandlerClassName($name, $context); - $arguments = $this->getArgumentsForParametersFromWiring($this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body)); - try { - $callable = [$handlerClassName, 'create']; - Assert::isCallable($callable); - /** @phpstan-var callable(string): ?Tag $callable */ - $tag = call_user_func_array($callable, $arguments); - return $tag ?? InvalidTag::create($body, $name); - } catch (InvalidArgumentException $e) { - return InvalidTag::create($body, $name)->withError($e); - } - } - /** - * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). - * - * @return class-string - */ - private function findHandlerClassName(string $tagName, TypeContext $context) : string - { - $handlerClassName = Generic::class; - if (isset($this->tagHandlerMappings[$tagName])) { - $handlerClassName = $this->tagHandlerMappings[$tagName]; - } elseif ($this->isAnnotation($tagName)) { - // TODO: Annotation support is planned for a later stage and as such is disabled for now - $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); - if (isset($this->annotationMappings[$tagName])) { - $handlerClassName = $this->annotationMappings[$tagName]; - } - } - return $handlerClassName; - } - /** - * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. - * - * @param ReflectionParameter[] $parameters - * @param mixed[] $locator - * - * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters - * is provided with this method. - */ - private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array - { - $arguments = []; - foreach ($parameters as $parameter) { - $type = $parameter->getType(); - $typeHint = null; - if ($type instanceof ReflectionNamedType) { - $typeHint = $type->getName(); - if ($typeHint === 'self') { - $declaringClass = $parameter->getDeclaringClass(); - if ($declaringClass !== null) { - $typeHint = $declaringClass->getName(); - } - } - } - if (isset($locator[$typeHint])) { - $arguments[] = $locator[$typeHint]; - continue; - } - $parameterName = $parameter->getName(); - if (isset($locator[$parameterName])) { - $arguments[] = $locator[$parameterName]; - continue; - } - $arguments[] = null; - } - return $arguments; - } - /** - * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given - * tag handler class name. - * - * @param class-string $handlerClassName - * - * @return ReflectionParameter[] - */ - private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array - { - if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { - $methodReflection = new ReflectionMethod($handlerClassName, 'create'); - $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); - } - return $this->tagHandlerParameterCache[$handlerClassName]; - } - /** - * Returns a copy of this class' Service Locator with added dynamic parameters, - * such as the tag's name, body and Context. - * - * @param TypeContext $context The Context (namespace and aliasses) that may be - * passed and is used to resolve FQSENs. - * @param string $tagName The name of the tag that may be - * passed onto the factory method of the Tag class. - * @param string $tagBody The body of the tag that may be - * passed onto the factory method of the Tag class. - * - * @return mixed[] - */ - private function getServiceLocatorWithDynamicParameters(TypeContext $context, string $tagName, string $tagBody) : array - { - return array_merge($this->serviceLocator, ['name' => $tagName, 'body' => $tagBody, TypeContext::class => $context]); - } - /** - * Returns whether the given tag belongs to an annotation. - * - * @todo this method should be populated once we implement Annotation notation support. - */ - private function isAnnotation(string $tagContent) : bool - { - // 1. Contains a namespace separator - // 2. Contains parenthesis - // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part - // of the annotation class name matches the found tag name - return \false; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php deleted file mode 100644 index b78aa8c..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php +++ /dev/null @@ -1,25 +0,0 @@ - $handler FQCN of handler. - * - * @throws InvalidArgumentException If the tag name is not a string. - * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but - * does not start with a backslash. - * @throws InvalidArgumentException If the handler is not a string. - * @throws InvalidArgumentException If the handler is not an existing class. - * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. - */ - public function registerTagHandler(string $tagName, string $handler) : void; -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php deleted file mode 100644 index 56cb1b8..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php +++ /dev/null @@ -1,85 +0,0 @@ -authorName = $authorName; - $this->authorEmail = $authorEmail; - } - /** - * Gets the author's name. - * - * @return string The author's name. - */ - public function getAuthorName() : string - { - return $this->authorName; - } - /** - * Returns the author's email. - * - * @return string The author's email. - */ - public function getEmail() : string - { - return $this->authorEmail; - } - /** - * Returns this tag in string form. - */ - public function __toString() : string - { - if ($this->authorEmail) { - $authorEmail = '<' . $this->authorEmail . '>'; - } else { - $authorEmail = ''; - } - $authorName = $this->authorName; - return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); - } - /** - * Attempts to create a new Author object based on the tag body. - */ - public static function create(string $body) : ?self - { - $splitTagContent = preg_match('/^([^\\<]*)(?:\\<([^\\>]*)\\>)?$/u', $body, $matches); - if (!$splitTagContent) { - return null; - } - $authorName = trim($matches[1]); - $email = isset($matches[2]) ? trim($matches[2]) : ''; - return new static($authorName, $email); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php deleted file mode 100644 index 248d98c..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php +++ /dev/null @@ -1,45 +0,0 @@ -name; - } - public function getDescription() : ?Description - { - return $this->description; - } - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - return $formatter->format($this); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php deleted file mode 100644 index d1bd8fa..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php +++ /dev/null @@ -1,78 +0,0 @@ -refers = $refers; - $this->description = $description; - } - public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?FqsenResolver $resolver = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - Assert::notNull($resolver); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); - } - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen - { - return $this->refers; - } - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $refers = (string) $this->refers; - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php deleted file mode 100644 index 54349b7..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php +++ /dev/null @@ -1,84 +0,0 @@ -version = $version; - $this->description = $description; - } - /** - * @return static - */ - public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - if (empty($body)) { - return new static(); - } - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { - return new static(null, $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null); - } - Assert::notNull($descriptionFactory); - return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); - } - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $version = (string) $this->version; - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php deleted file mode 100644 index 265dd16..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php +++ /dev/null @@ -1,147 +0,0 @@ -filePath = $filePath; - $this->startingLine = $startingLine; - $this->lineCount = $lineCount; - if ($content !== null) { - $this->content = trim($content); - } - $this->isURI = $isURI; - } - public function getContent() : string - { - if ($this->content === null || $this->content === '') { - $filePath = $this->filePath; - if ($this->isURI) { - $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) : $this->filePath; - } - return trim($filePath); - } - return $this->content; - } - public function getDescription() : ?string - { - return $this->content; - } - public static function create(string $body) : ?Tag - { - // File component: File path in quotes or File URI / Source information - if (!preg_match('/^\\s*(?:(\\"[^\\"]+\\")|(\\S+))(?:\\s+(.*))?$/sux', $body, $matches)) { - return null; - } - $filePath = null; - $fileUri = null; - if ($matches[1] !== '') { - $filePath = $matches[1]; - } else { - $fileUri = $matches[2]; - } - $startingLine = 1; - $lineCount = 0; - $description = null; - if (array_key_exists(3, $matches)) { - $description = $matches[3]; - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\\d*)(?:\\s+((?1))\\s*)?(.*)$/sux', $matches[3], $contentMatches)) { - $startingLine = (int) $contentMatches[1]; - if (isset($contentMatches[2])) { - $lineCount = (int) $contentMatches[2]; - } - if (array_key_exists(3, $contentMatches)) { - $description = $contentMatches[3]; - } - } - } - return new static($filePath ?? $fileUri ?? '', $fileUri !== null, $startingLine, $lineCount, $description); - } - /** - * Returns the file path. - * - * @return string Path to a file to use as an example. - * May also be an absolute URI. - */ - public function getFilePath() : string - { - return trim($this->filePath, '"'); - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - $filePath = $this->filePath; - $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; - $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; - $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; - $content = (string) $this->content; - return $filePath . ($startingLine !== '' ? ($filePath !== '' ? ' ' : '') . $startingLine : '') . ($lineCount !== '' ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount : '') . ($content !== '' ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content : ''); - } - /** - * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). - */ - private function isUriRelative(string $uri) : bool - { - return strpos($uri, ':') === \false; - } - public function getStartingLine() : int - { - return $this->startingLine; - } - public function getLineCount() : int - { - return $this->lineCount; - } - public function getName() : string - { - return 'example'; - } - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - return $formatter->format($this); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php deleted file mode 100644 index 75caa45..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php +++ /dev/null @@ -1,23 +0,0 @@ -maxLen = max($this->maxLen, strlen($tag->getName())); - } - } - /** - * Formats the given tag to return a simple plain text version. - */ - public function format(Tag $tag) : string - { - return '@' . $tag->getName() . str_repeat(' ', $this->maxLen - strlen($tag->getName()) + 1) . $tag; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php deleted file mode 100644 index bc8259e..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php +++ /dev/null @@ -1,26 +0,0 @@ -getName() . ' ' . $tag); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php deleted file mode 100644 index 8361ead..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php +++ /dev/null @@ -1,71 +0,0 @@ -validateTagName($name); - $this->name = $name; - $this->description = $description; - } - /** - * Creates a new tag that represents any unknown tag type. - * - * @return static - */ - public static function create(string $body, string $name = '', ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($name); - Assert::notNull($descriptionFactory); - $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; - return new static($name, $description); - } - /** - * Returns the tag as a serialized string - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - return $description; - } - /** - * Validates if the tag name matches the expected format, otherwise throws an exception. - */ - private function validateTagName(string $name) : void - { - if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { - throw new InvalidArgumentException('The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.'); - } - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php deleted file mode 100644 index e1572c3..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php +++ /dev/null @@ -1,117 +0,0 @@ -name = $name; - $this->body = $body; - } - public function getException() : ?Throwable - { - return $this->throwable; - } - public function getName() : string - { - return $this->name; - } - public static function create(string $body, string $name = '') : self - { - return new self($name, $body); - } - public function withError(Throwable $exception) : self - { - $this->flattenExceptionBacktrace($exception); - $tag = new self($this->name, $this->body); - $tag->throwable = $exception; - return $tag; - } - /** - * Removes all complex types from backtrace - * - * Not all objects are serializable. So we need to remove them from the - * stored exception to be sure that we do not break existing library usage. - */ - private function flattenExceptionBacktrace(Throwable $exception) : void - { - $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); - $traceProperty->setAccessible(\true); - do { - $trace = $exception->getTrace(); - if (isset($trace[0]['args'])) { - $trace = array_map(function (array $call) : array { - $call['args'] = array_map([$this, 'flattenArguments'], $call['args'] ?? []); - return $call; - }, $trace); - } - $traceProperty->setValue($exception, $trace); - $exception = $exception->getPrevious(); - } while ($exception !== null); - $traceProperty->setAccessible(\false); - } - /** - * @param mixed $value - * - * @return mixed - * - * @throws ReflectionException - */ - private function flattenArguments($value) - { - if ($value instanceof Closure) { - $closureReflection = new ReflectionFunction($value); - $value = sprintf('(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine()); - } elseif (is_object($value)) { - $value = sprintf('object(%s)', get_class($value)); - } elseif (is_resource($value)) { - $value = sprintf('resource(%s)', get_resource_type($value)); - } elseif (is_array($value)) { - $value = array_map([$this, 'flattenArguments'], $value); - } - return $value; - } - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - return $formatter->format($this); - } - public function __toString() : string - { - return $this->body; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php deleted file mode 100644 index 9f61f29..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php +++ /dev/null @@ -1,63 +0,0 @@ -link = $link; - $this->description = $description; - } - public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($descriptionFactory); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - return new static($parts[0], $description); - } - /** - * Gets the link - */ - public function getLink() : string - { - return $this->link; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $link = $this->link; - return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php deleted file mode 100644 index 12eeb0a..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php +++ /dev/null @@ -1,220 +0,0 @@ - - * @var array> - */ - private $arguments; - /** @var bool */ - private $isStatic; - /** @var Type */ - private $returnType; - /** - * @param array> $arguments - * @phpstan-param array $arguments - */ - public function __construct(string $methodName, array $arguments = [], ?Type $returnType = null, bool $static = \false, ?Description $description = null) - { - Assert::stringNotEmpty($methodName); - if ($returnType === null) { - $returnType = new Void_(); - } - $this->methodName = $methodName; - $this->arguments = $this->filterArguments($arguments); - $this->returnType = $returnType; - $this->isStatic = $static; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - // 1. none or more whitespace - // 2. optionally the keyword "static" followed by whitespace - // 3. optionally a word with underscores followed by whitespace : as - // type for the return value - // 4. then optionally a word with underscores followed by () and - // whitespace : as method name as used by phpDocumentor - // 5. then a word with underscores, followed by ( and any character - // until a ) and whitespace : as method name with signature - // 6. any remaining text : as description - if (!preg_match('/^ - # Static keyword - # Declares a static method ONLY if type is also present - (?: - (static) - \\s+ - )? - # Return type - (?: - ( - (?:[\\w\\|_\\\\]*\\$this[\\w\\|_\\\\]*) - | - (?: - (?:[\\w\\|_\\\\]+) - # array notation - (?:\\[\\])* - )*+ - ) - \\s+ - )? - # Method name - ([\\w_]+) - # Arguments - (?: - \\(([^\\)]*)\\) - )? - \\s* - # Description - (.*) - $/sux', $body, $matches)) { - return null; - } - [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; - $static = $static === 'static'; - if ($returnType === '') { - $returnType = 'void'; - } - $returnType = $typeResolver->resolve($returnType, $context); - $description = $descriptionFactory->create($description, $context); - /** @phpstan-var array $arguments */ - $arguments = []; - if ($argumentLines !== '') { - $argumentsExploded = explode(',', $argumentLines); - foreach ($argumentsExploded as $argument) { - $argument = explode(' ', self::stripRestArg(trim($argument)), 2); - if (strpos($argument[0], '$') === 0) { - $argumentName = substr($argument[0], 1); - $argumentType = new Mixed_(); - } else { - $argumentType = $typeResolver->resolve($argument[0], $context); - $argumentName = ''; - if (isset($argument[1])) { - $argument[1] = self::stripRestArg($argument[1]); - $argumentName = substr($argument[1], 1); - } - } - $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; - } - } - return new static($methodName, $arguments, $returnType, $static, $description); - } - /** - * Retrieves the method name. - */ - public function getMethodName() : string - { - return $this->methodName; - } - /** - * @return array> - * @phpstan-return array - */ - public function getArguments() : array - { - return $this->arguments; - } - /** - * Checks whether the method tag describes a static method or not. - * - * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. - */ - public function isStatic() : bool - { - return $this->isStatic; - } - public function getReturnType() : Type - { - return $this->returnType; - } - public function __toString() : string - { - $arguments = []; - foreach ($this->arguments as $argument) { - $arguments[] = $argument['type'] . ' $' . $argument['name']; - } - $argumentStr = '(' . implode(', ', $arguments) . ')'; - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $static = $this->isStatic ? 'static' : ''; - $returnType = (string) $this->returnType; - $methodName = $this->methodName; - return $static . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') . $argumentStr . ($description !== '' ? ' ' . $description : ''); - } - /** - * @param mixed[][]|string[] $arguments - * @phpstan-param array $arguments - * - * @return mixed[][] - * @phpstan-return array - */ - private function filterArguments(array $arguments = []) : array - { - $result = []; - foreach ($arguments as $argument) { - if (is_string($argument)) { - $argument = ['name' => $argument]; - } - if (!isset($argument['type'])) { - $argument['type'] = new Mixed_(); - } - $keys = array_keys($argument); - sort($keys); - if ($keys !== ['name', 'type']) { - throw new InvalidArgumentException('Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, \true)); - } - $result[] = $argument; - } - return $result; - } - private static function stripRestArg(string $argument) : string - { - if (strpos($argument, '...') === 0) { - $argument = trim(substr($argument, 3)); - } - return $argument; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php deleted file mode 100644 index 3c63034..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php +++ /dev/null @@ -1,132 +0,0 @@ -name = 'param'; - $this->variableName = $variableName; - $this->type = $type; - $this->isVariadic = $isVariadic; - $this->description = $description; - $this->isReference = $isReference; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - $isVariadic = \false; - $isReference = \false; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && !self::strStartsWithVariable($firstPart)) { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name - if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - if (strpos($variableName, '$') === 0) { - $variableName = substr($variableName, 1); - } elseif (strpos($variableName, '&$') === 0) { - $isReference = \true; - $variableName = substr($variableName, 2); - } elseif (strpos($variableName, '...$') === 0) { - $isVariadic = \true; - $variableName = substr($variableName, 4); - } elseif (strpos($variableName, '&...$') === 0) { - $isVariadic = \true; - $isReference = \true; - $variableName = substr($variableName, 5); - } - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $isVariadic, $description, $isReference); - } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - /** - * Returns whether this tag is variadic. - */ - public function isVariadic() : bool - { - return $this->isVariadic; - } - /** - * Returns whether this tag is passed by reference. - */ - public function isReference() : bool - { - return $this->isReference; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $variableName = ''; - if ($this->variableName) { - $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); - $variableName .= '$' . $this->variableName; - } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } - private static function strStartsWithVariable(string $str) : bool - { - return strpos($str, '$') === 0 || strpos($str, '...$') === 0 || strpos($str, '&$') === 0 || strpos($str, '&...$') === 0; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php deleted file mode 100644 index eab69f2..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php +++ /dev/null @@ -1,95 +0,0 @@ -name = 'property'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); - } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php deleted file mode 100644 index 8d6a426..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php +++ /dev/null @@ -1,95 +0,0 @@ -name = 'property-read'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); - } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php deleted file mode 100644 index 6aeaa74..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php +++ /dev/null @@ -1,95 +0,0 @@ -name = 'property-write'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); - } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php deleted file mode 100644 index c85f6fe..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php +++ /dev/null @@ -1,33 +0,0 @@ -fqsen = $fqsen; - } - /** - * @return string string representation of the referenced fqsen - */ - public function __toString() : string - { - return (string) $this->fqsen; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php deleted file mode 100644 index 03ff94b..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php +++ /dev/null @@ -1,20 +0,0 @@ -uri = $uri; - } - public function __toString() : string - { - return $this->uri; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php deleted file mode 100644 index ed66d04..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php +++ /dev/null @@ -1,50 +0,0 @@ -name = 'return'; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$type, $description] = self::extractTypeFromBody($body); - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - return new static($type, $description); - } - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $type = $this->type ? '' . $this->type : 'mixed'; - return $type . ($description !== '' ? ' ' . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php deleted file mode 100644 index a76ebec..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php +++ /dev/null @@ -1,85 +0,0 @@ -refers = $refers; - $this->description = $description; - } - public static function create(string $body, ?FqsenResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($descriptionFactory); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - // https://tools.ietf.org/html/rfc2396#section-3 - if (preg_match('#\\w://\\w#', $parts[0])) { - return new static(new Url($parts[0]), $description); - } - return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); - } - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - /** - * Returns the ref of this tag. - */ - public function getReference() : Reference - { - return $this->refers; - } - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $refers = (string) $this->refers; - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php deleted file mode 100644 index e1c3495..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php +++ /dev/null @@ -1,81 +0,0 @@ -version = $version; - $this->description = $description; - } - public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self - { - if (empty($body)) { - return new static(); - } - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { - return null; - } - Assert::notNull($descriptionFactory); - return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); - } - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $version = (string) $this->version; - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php deleted file mode 100644 index 2122a21..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php +++ /dev/null @@ -1,90 +0,0 @@ -startingLine = (int) $startingLine; - $this->lineCount = $lineCount !== null ? (int) $lineCount : null; - $this->description = $description; - } - public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - $startingLine = 1; - $lineCount = null; - $description = null; - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\\d*)\\s*(?:((?1))\\s+)?(.*)$/sux', $body, $matches)) { - $startingLine = (int) $matches[1]; - if (isset($matches[2]) && $matches[2] !== '') { - $lineCount = (int) $matches[2]; - } - $description = $matches[3]; - } - return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); - } - /** - * Gets the starting line. - * - * @return int The starting line, relative to the structural element's - * location. - */ - public function getStartingLine() : int - { - return $this->startingLine; - } - /** - * Returns the number of lines. - * - * @return int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - public function getLineCount() : ?int - { - return $this->lineCount; - } - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $startingLine = (string) $this->startingLine; - $lineCount = $this->lineCount !== null ? ' ' . $this->lineCount : ''; - return $startingLine . $lineCount . ($description !== '' ? ' ' . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php deleted file mode 100644 index b1cf290..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php +++ /dev/null @@ -1,55 +0,0 @@ -type; - } - /** - * @return string[] - */ - protected static function extractTypeFromBody(string $body) : array - { - $type = ''; - $nestingLevel = 0; - for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { - $character = $body[$i]; - if ($nestingLevel === 0 && trim($character) === '') { - break; - } - $type .= $character; - if (in_array($character, ['<', '(', '[', '{'])) { - $nestingLevel++; - continue; - } - if (in_array($character, ['>', ')', ']', '}'])) { - $nestingLevel--; - continue; - } - } - $description = trim(substr($body, strlen($type))); - return [$type, $description]; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php deleted file mode 100644 index 1c9dd8c..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php +++ /dev/null @@ -1,50 +0,0 @@ -name = 'throws'; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$type, $description] = self::extractTypeFromBody($body); - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - return new static($type, $description); - } - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $type = (string) $this->type; - return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php deleted file mode 100644 index a7aa718..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php +++ /dev/null @@ -1,77 +0,0 @@ -refers = $refers; - $this->description = $description; - } - public static function create(string $body, ?FqsenResolver $resolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($resolver); - Assert::notNull($descriptionFactory); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); - } - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen - { - return $this->refers; - } - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $refers = (string) $this->refers; - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php deleted file mode 100644 index d019476..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php +++ /dev/null @@ -1,95 +0,0 @@ -name = 'var'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $type = null; - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); - } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php deleted file mode 100644 index fc9441a..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php +++ /dev/null @@ -1,84 +0,0 @@ -version = $version; - $this->description = $description; - } - public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self - { - if (empty($body)) { - return new static(); - } - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { - return null; - } - $description = null; - if ($descriptionFactory !== null) { - $description = $descriptionFactory->create($matches[2] ?? '', $context); - } - return new static($matches[1], $description); - } - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $version = (string) $this->version; - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactory.php deleted file mode 100644 index 4915e98..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactory.php +++ /dev/null @@ -1,239 +0,0 @@ -descriptionFactory = $descriptionFactory; - $this->tagFactory = $tagFactory; - } - /** - * Factory method for easy instantiation. - * - * @param array> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : self - { - $fqsenResolver = new FqsenResolver(); - $tagFactory = new StandardTagFactory($fqsenResolver); - $descriptionFactory = new DescriptionFactory($tagFactory); - $tagFactory->addService($descriptionFactory); - $tagFactory->addService(new TypeResolver($fqsenResolver)); - $docBlockFactory = new self($descriptionFactory, $tagFactory); - foreach ($additionalTags as $tagName => $tagHandler) { - $docBlockFactory->registerTagHandler($tagName, $tagHandler); - } - return $docBlockFactory; - } - /** - * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the - * getDocComment method (such as a ReflectionClass object). - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock - { - if (is_object($docblock)) { - if (!method_exists($docblock, 'getDocComment')) { - $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; - throw new InvalidArgumentException($exceptionMessage); - } - $docblock = $docblock->getDocComment(); - Assert::string($docblock); - } - Assert::stringNotEmpty($docblock); - if ($context === null) { - $context = new Types\Context(''); - } - $parts = $this->splitDocBlock($this->stripDocComment($docblock)); - [$templateMarker, $summary, $description, $tags] = $parts; - return new DocBlock($summary, $description ? $this->descriptionFactory->create($description, $context) : null, $this->parseTagBlock($tags, $context), $context, $location, $templateMarker === '#@+', $templateMarker === '#@-'); - } - /** - * @param class-string $handler - */ - public function registerTagHandler(string $tagName, string $handler) : void - { - $this->tagFactory->registerTagHandler($tagName, $handler); - } - /** - * Strips the asterisks from the DocBlock comment. - * - * @param string $comment String containing the comment text. - */ - private function stripDocComment(string $comment) : string - { - $comment = preg_replace('#[ \\t]*(?:\\/\\*\\*|\\*\\/|\\*)?[ \\t]?(.*)?#u', '$1', $comment); - Assert::string($comment); - $comment = trim($comment); - // reg ex above is not able to remove */ from a single line docblock - if (substr($comment, -2) === '*/') { - $comment = trim(substr($comment, 0, -2)); - } - return str_replace(["\r\n", "\r"], "\n", $comment); - } - // phpcs:disable - /** - * Splits the DocBlock into a template marker, summary, description and block of tags. - * - * @param string $comment Comment to split into the sub-parts. - * - * @return string[] containing the template marker (if any), summary, description and a string containing the tags. - * - * @author Mike van Riel for extending the regex with template marker support. - * - * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. - */ - private function splitDocBlock(string $comment) : array - { - // phpcs:enable - // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This - // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the - // performance impact of running a regular expression - if (strpos($comment, '@') === 0) { - return ['', '', '', $comment]; - } - // clears all extra horizontal whitespace from the line endings to prevent parsing issues - $comment = preg_replace('/\\h*$/Sum', '', $comment); - Assert::string($comment); - /* - * Splits the docblock into a template marker, summary, description and tags section. - * - * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may - * occur after it and will be stripped). - * - The short description is started from the first character until a dot is encountered followed by a - * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing - * errors). This is optional. - * - The long description, any character until a new line is encountered followed by an @ and word - * characters (a tag). This is optional. - * - Tags; the remaining characters - * - * Big thanks to RichardJ for contributing this Regular Expression - */ - preg_match('/ - \\A - # 1. Extract the template marker - (?:(\\#\\@\\+|\\#\\@\\-)\\n?)? - - # 2. Extract the summary - (?: - (?! @\\pL ) # The summary may not start with an @ - ( - [^\\n.]+ - (?: - (?! \\. \\n | \\n{2} ) # End summary upon a dot followed by newline or two newlines - [\\n.]* (?! [ \\t]* @\\pL ) # End summary when an @ is found as first character on a new line - [^\\n.]+ # Include anything else - )* - \\.? - )? - ) - - # 3. Extract the description - (?: - \\s* # Some form of whitespace _must_ precede a description because a summary must be there - (?! @\\pL ) # The description may not start with an @ - ( - [^\\n]+ - (?: \\n+ - (?! [ \\t]* @\\pL ) # End description when an @ is found as first character on a new line - [^\\n]+ # Include anything else - )* - ) - )? - - # 4. Extract the tags (anything that follows) - (\\s+ [\\s\\S]*)? # everything that follows - /ux', $comment, $matches); - array_shift($matches); - while (count($matches) < 4) { - $matches[] = ''; - } - return $matches; - } - /** - * Creates the tag objects. - * - * @param string $tags Tag block to parse. - * @param Types\Context $context Context of the parsed Tag - * - * @return DocBlock\Tag[] - */ - private function parseTagBlock(string $tags, Types\Context $context) : array - { - $tags = $this->filterTagBlock($tags); - if ($tags === null) { - return []; - } - $result = []; - $lines = $this->splitTagBlockIntoTagLines($tags); - foreach ($lines as $key => $tagLine) { - $result[$key] = $this->tagFactory->create(trim($tagLine), $context); - } - return $result; - } - /** - * @return string[] - */ - private function splitTagBlockIntoTagLines(string $tags) : array - { - $result = []; - foreach (explode("\n", $tags) as $tagLine) { - if ($tagLine !== '' && strpos($tagLine, '@') === 0) { - $result[] = $tagLine; - } else { - $result[count($result) - 1] .= "\n" . $tagLine; - } - } - return $result; - } - private function filterTagBlock(string $tags) : ?string - { - $tags = trim($tags); - if (!$tags) { - return null; - } - if ($tags[0] !== '@') { - // @codeCoverageIgnoreStart - // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that - // we didn't foresee. - throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); - // @codeCoverageIgnoreEnd - } - return $tags; - } -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php deleted file mode 100644 index f6ce12a..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php +++ /dev/null @@ -1,20 +0,0 @@ -> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : DocBlockFactory; - /** - * @param string|object $docblock - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; -} diff --git a/dependencies/phpdocumentor/reflection-docblock/src/Exception/PcreException.php b/dependencies/phpdocumentor/reflection-docblock/src/Exception/PcreException.php deleted file mode 100644 index 42ed151..0000000 --- a/dependencies/phpdocumentor/reflection-docblock/src/Exception/PcreException.php +++ /dev/null @@ -1,35 +0,0 @@ -isFqsen($fqsen)) { - return new Fqsen($fqsen); - } - return $this->resolvePartialStructuralElementName($fqsen, $context); - } - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - */ - private function isFqsen(string $type) : bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - /** - * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation - * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. - * - * @throws InvalidArgumentException When type is not a valid FQSEN. - */ - private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen - { - $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); - $namespaceAliases = $context->getNamespaceAliases(); - // if the first segment is not an alias; prepend namespace name and return - if (!isset($namespaceAliases[$typeParts[0]])) { - $namespace = $context->getNamespace(); - if ($namespace !== '') { - $namespace .= self::OPERATOR_NAMESPACE; - } - return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); - } - $typeParts[0] = $namespaceAliases[$typeParts[0]]; - return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoType.php b/dependencies/phpdocumentor/type-resolver/src/PseudoType.php deleted file mode 100644 index 61e5063..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoType.php +++ /dev/null @@ -1,17 +0,0 @@ -items = $items; - } - public function underlyingType() : Type - { - return new Array_(new Mixed_(), new ArrayKey()); - } - public function __toString() : string - { - return 'array{' . implode(', ', $this->items) . '}'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php deleted file mode 100644 index 611e9a7..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php +++ /dev/null @@ -1,48 +0,0 @@ -key = $key; - $this->value = $value ?? new Mixed_(); - $this->optional = $optional; - } - public function getKey() : ?string - { - return $this->key; - } - public function getValue() : Type - { - return $this->value; - } - public function isOptional() : bool - { - return $this->optional; - } - public function __toString() : string - { - if ($this->key !== null) { - return sprintf('%s%s: %s', $this->key, $this->optional ? '?' : '', (string) $this->value); - } - return (string) $this->value; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php deleted file mode 100644 index aa1b0fa..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php +++ /dev/null @@ -1,35 +0,0 @@ -owner = $owner; - $this->expression = $expression; - } - public function getOwner() : Type - { - return $this->owner; - } - public function getExpression() : string - { - return $this->expression; - } - public function underlyingType() : Type - { - return new Mixed_(); - } - public function __toString() : string - { - return sprintf('%s::%s', (string) $this->owner, $this->expression); - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/False_.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/False_.php deleted file mode 100644 index c2e5eb4..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/False_.php +++ /dev/null @@ -1,34 +0,0 @@ -value = $value; - } - public function getValue() : float - { - return $this->value; - } - public function underlyingType() : Type - { - return new Float_(); - } - public function __toString() : string - { - return (string) $this->value; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php deleted file mode 100644 index d75547b..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php +++ /dev/null @@ -1,35 +0,0 @@ -minValue = $minValue; - $this->maxValue = $maxValue; - } - public function underlyingType() : Type - { - return new Integer(); - } - public function getMinValue() : string - { - return $this->minValue; - } - public function getMaxValue() : string - { - return $this->maxValue; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'int<' . $this->minValue . ', ' . $this->maxValue . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php deleted file mode 100644 index eb889f4..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php +++ /dev/null @@ -1,38 +0,0 @@ -value = $value; - } - public function getValue() : int - { - return $this->value; - } - public function underlyingType() : Type - { - return new Integer(); - } - public function __toString() : string - { - return (string) $this->value; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/List_.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/List_.php deleted file mode 100644 index 2b9cd4d..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/List_.php +++ /dev/null @@ -1,44 +0,0 @@ -valueType instanceof Mixed_) { - return 'list'; - } - return 'list<' . $this->valueType . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php deleted file mode 100644 index 3aefff3..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php +++ /dev/null @@ -1,35 +0,0 @@ -valueType instanceof Mixed_) { - return 'non-empty-list'; - } - return 'non-empty-list<' . $this->valueType . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php deleted file mode 100644 index cac5043..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php +++ /dev/null @@ -1,35 +0,0 @@ -value = $value; - } - public function getValue() : string - { - return $this->value; - } - public function underlyingType() : Type - { - return new String_(); - } - public function __toString() : string - { - return sprintf('"%s"', $this->value); - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php b/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php deleted file mode 100644 index 1ba67b9..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php +++ /dev/null @@ -1,35 +0,0 @@ - List of recognized keywords and unto which Value Object they map - * @psalm-var array> - */ - private array $keywords = ['string' => String_::class, 'class-string' => ClassString::class, 'interface-string' => InterfaceString::class, 'html-escaped-string' => HtmlEscapedString::class, 'lowercase-string' => LowercaseString::class, 'non-empty-lowercase-string' => NonEmptyLowercaseString::class, 'non-empty-string' => NonEmptyString::class, 'numeric-string' => NumericString::class, 'numeric' => Numeric_::class, 'trait-string' => TraitString::class, 'int' => Integer::class, 'integer' => Integer::class, 'positive-int' => PositiveInteger::class, 'negative-int' => NegativeInteger::class, 'bool' => Boolean::class, 'boolean' => Boolean::class, 'real' => Float_::class, 'float' => Float_::class, 'double' => Float_::class, 'object' => Object_::class, 'mixed' => Mixed_::class, 'array' => Array_::class, 'array-key' => ArrayKey::class, 'resource' => Resource_::class, 'void' => Void_::class, 'null' => Null_::class, 'scalar' => Scalar::class, 'callback' => Callable_::class, 'callable' => Callable_::class, 'callable-string' => CallableString::class, 'false' => False_::class, 'true' => True_::class, 'literal-string' => LiteralString::class, 'self' => Self_::class, '$this' => This::class, 'static' => Static_::class, 'parent' => Parent_::class, 'iterable' => Iterable_::class, 'never' => Never_::class, 'list' => List_::class, 'non-empty-list' => NonEmptyList::class]; - /** @psalm-readonly */ - private FqsenResolver $fqsenResolver; - /** @psalm-readonly */ - private TypeParser $typeParser; - /** @psalm-readonly */ - private Lexer $lexer; - /** - * Initializes this TypeResolver with the means to create and resolve Fqsen objects. - */ - public function __construct(?FqsenResolver $fqsenResolver = null) - { - $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); - $this->typeParser = new TypeParser(new ConstExprParser()); - $this->lexer = new Lexer(); - } - /** - * Analyzes the given type and returns the FQCN variant. - * - * When a type is provided this method checks whether it is not a keyword or - * Fully Qualified Class Name. If so it will use the given namespace and - * aliases to expand the type to a FQCN representation. - * - * This method only works as expected if the namespace and aliases are set; - * no dynamic reflection is being performed here. - * - * @uses Context::getNamespace() to determine with what to prefix the type name. - * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be - * replaced with another namespace. - * - * @param string $type The relative or absolute type. - */ - public function resolve(string $type, ?Context $context = null) : Type - { - $type = trim($type); - if (!$type) { - throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); - } - if ($context === null) { - $context = new Context(''); - } - $tokens = $this->lexer->tokenize($type); - $tokenIterator = new TokenIterator($tokens); - $ast = $this->parse($tokenIterator); - $type = $this->createType($ast, $context); - return $this->tryParseRemainingCompoundTypes($tokenIterator, $context, $type); - } - public function createType(?TypeNode $type, Context $context) : Type - { - if ($type === null) { - return new Mixed_(); - } - switch (get_class($type)) { - case ArrayTypeNode::class: - return new Array_($this->createType($type->type, $context)); - case ArrayShapeNode::class: - return new ArrayShape(...array_map(fn(ArrayShapeItemNode $item) => new ArrayShapeItem((string) $item->keyName, $this->createType($item->valueType, $context), $item->optional), $type->items)); - case CallableTypeNode::class: - return $this->createFromCallable($type, $context); - case ConstTypeNode::class: - return $this->createFromConst($type, $context); - case GenericTypeNode::class: - return $this->createFromGeneric($type, $context); - case IdentifierTypeNode::class: - return $this->resolveSingleType($type->name, $context); - case IntersectionTypeNode::class: - return new Intersection(array_filter(array_map(function (TypeNode $nestedType) use($context) { - $type = $this->createType($nestedType, $context); - if ($type instanceof AggregatedType) { - return new Expression($type); - } - return $type; - }, $type->types))); - case NullableTypeNode::class: - $nestedType = $this->createType($type->type, $context); - return new Nullable($nestedType); - case UnionTypeNode::class: - return new Compound(array_filter(array_map(function (TypeNode $nestedType) use($context) { - $type = $this->createType($nestedType, $context); - if ($type instanceof AggregatedType) { - return new Expression($type); - } - return $type; - }, $type->types))); - case ThisTypeNode::class: - return new This(); - case ConditionalTypeNode::class: - case ConditionalTypeForParameterNode::class: - case OffsetAccessTypeNode::class: - default: - return new Mixed_(); - } - } - private function createFromGeneric(GenericTypeNode $type, Context $context) : Type - { - switch (strtolower($type->type->name)) { - case 'array': - return $this->createArray($type->genericTypes, $context); - case 'class-string': - $subType = $this->createType($type->genericTypes[0], $context); - if (!$subType instanceof Object_ || $subType->getFqsen() === null) { - throw new RuntimeException($subType . ' is not a class string'); - } - return new ClassString($subType->getFqsen()); - case 'interface-string': - $subType = $this->createType($type->genericTypes[0], $context); - if (!$subType instanceof Object_ || $subType->getFqsen() === null) { - throw new RuntimeException($subType . ' is not a class string'); - } - return new InterfaceString($subType->getFqsen()); - case 'list': - return new List_($this->createType($type->genericTypes[0], $context)); - case 'non-empty-list': - return new NonEmptyList($this->createType($type->genericTypes[0], $context)); - case 'int': - if (isset($type->genericTypes[1]) === \false) { - throw new RuntimeException('int has not the correct format'); - } - return new IntegerRange((string) $type->genericTypes[0], (string) $type->genericTypes[1]); - case 'iterable': - return new Iterable_(...array_reverse(array_map(fn(TypeNode $genericType) => $this->createType($genericType, $context), $type->genericTypes))); - default: - $collectionType = $this->createType($type->type, $context); - if ($collectionType instanceof Object_ === \false) { - throw new RuntimeException(sprintf('%s is not a collection', (string) $collectionType)); - } - return new Collection($collectionType->getFqsen(), ...array_reverse(array_map(fn(TypeNode $genericType) => $this->createType($genericType, $context), $type->genericTypes))); - } - } - private function createFromCallable(CallableTypeNode $type, Context $context) : Callable_ - { - return new Callable_(array_map(function (CallableTypeParameterNode $param) use($context) { - return new CallableParameter($this->createType($param->type, $context), $param->parameterName !== '' ? trim($param->parameterName, '$') : null, $param->isReference, $param->isVariadic, $param->isOptional); - }, $type->parameters), $this->createType($type->returnType, $context)); - } - private function createFromConst(ConstTypeNode $type, Context $context) : Type - { - switch (\true) { - case $type->constExpr instanceof ConstExprIntegerNode: - return new IntegerValue((int) $type->constExpr->value); - case $type->constExpr instanceof ConstExprFloatNode: - return new FloatValue((float) $type->constExpr->value); - case $type->constExpr instanceof ConstExprStringNode: - return new StringValue($type->constExpr->value); - case $type->constExpr instanceof ConstFetchNode: - return new ConstExpression($this->resolve($type->constExpr->className, $context), $type->constExpr->name); - default: - throw new RuntimeException(sprintf('Unsupported constant type %s', get_class($type))); - } - } - /** - * resolve the given type into a type object - * - * @param string $type the type string, representing a single type - * - * @return Type|Array_|Object_ - * - * @psalm-mutation-free - */ - private function resolveSingleType(string $type, Context $context) : object - { - switch (\true) { - case $this->isKeyword($type): - return $this->resolveKeyword($type); - case $this->isFqsen($type): - return $this->resolveTypedObject($type); - case $this->isPartialStructuralElementName($type): - return $this->resolveTypedObject($type, $context); - // @codeCoverageIgnoreStart - default: - // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new RuntimeException('Unable to resolve type "' . $type . '", there is no known method to resolve it'); - } - // @codeCoverageIgnoreEnd - } - /** - * Adds a keyword to the list of Keywords and associates it with a specific Value Object. - * - * @psalm-param class-string $typeClassName - */ - public function addKeyword(string $keyword, string $typeClassName) : void - { - if (!class_exists($typeClassName)) { - throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); - } - $interfaces = class_implements($typeClassName); - if ($interfaces === \false) { - throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); - } - if (!in_array(Type::class, $interfaces, \true)) { - throw new InvalidArgumentException('The class "' . $typeClassName . '" must implement the interface "phpDocumentor\\Reflection\\Type"'); - } - $this->keywords[$keyword] = $typeClassName; - } - /** - * Detects whether the given type represents a PHPDoc keyword. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isKeyword(string $type) : bool - { - return array_key_exists(strtolower($type), $this->keywords); - } - /** - * Detects whether the given type represents a relative structural element name. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isPartialStructuralElementName(string $type) : bool - { - return isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE && !$this->isKeyword($type); - } - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @psalm-mutation-free - */ - private function isFqsen(string $type) : bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. - * - * @psalm-mutation-free - */ - private function resolveKeyword(string $type) : Type - { - $className = $this->keywords[strtolower($type)]; - return new $className(); - } - /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @psalm-mutation-free - */ - private function resolveTypedObject(string $type, ?Context $context = null) : Object_ - { - return new Object_($this->fqsenResolver->resolve($type, $context)); - } - /** @param TypeNode[] $typeNodes */ - private function createArray(array $typeNodes, Context $context) : Array_ - { - $types = array_reverse(array_map(fn(TypeNode $node) => $this->createType($node, $context), $typeNodes)); - if (isset($types[1]) === \false) { - return new Array_(...$types); - } - if ($this->validArrayKeyType($types[1]) || $types[1] instanceof ArrayKey) { - return new Array_(...$types); - } - if ($types[1] instanceof Compound && $types[1]->getIterator()->count() === 2) { - if ($this->validArrayKeyType($types[1]->get(0)) && $this->validArrayKeyType($types[1]->get(1))) { - return new Array_(...$types); - } - } - throw new RuntimeException('An array can have only integers or strings as keys'); - } - private function validArrayKeyType(?Type $type) : bool - { - return $type instanceof String_ || $type instanceof Integer; - } - private function parse(TokenIterator $tokenIterator) : TypeNode - { - try { - $ast = $this->typeParser->parse($tokenIterator); - } catch (ParserException $e) { - throw new RuntimeException($e->getMessage(), 0, $e); - } - return $ast; - } - /** - * Will try to parse unsupported type notations by phpstan - * - * The phpstan parser doesn't support the illegal nullable combinations like this library does. - * This method will warn the user about those notations but for bc purposes we will still have it here. - */ - private function tryParseRemainingCompoundTypes(TokenIterator $tokenIterator, Context $context, Type $type) : Type - { - if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_UNION) || $tokenIterator->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { - Deprecation::trigger('phpdocumentor/type-resolver', 'https://github.com/phpDocumentor/TypeResolver/issues/184', 'Legacy nullable type detected, please update your code as - you are using nullable types in a docblock. support will be removed in v2.0.0'); - } - $continue = \true; - while ($continue) { - $continue = \false; - while ($tokenIterator->tryConsumeTokenType(Lexer::TOKEN_UNION)) { - $ast = $this->parse($tokenIterator); - $type2 = $this->createType($ast, $context); - $type = new Compound([$type, $type2]); - $continue = \true; - } - while ($tokenIterator->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { - $ast = $this->typeParser->parse($tokenIterator); - $type2 = $this->createType($ast, $context); - $type = new Intersection([$type, $type2]); - $continue = \true; - } - } - return $type; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/AbstractList.php b/dependencies/phpdocumentor/type-resolver/src/Types/AbstractList.php deleted file mode 100644 index 78a417c..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/AbstractList.php +++ /dev/null @@ -1,70 +0,0 @@ -valueType = $valueType; - $this->defaultKeyType = new Compound([new String_(), new Integer()]); - $this->keyType = $keyType; - } - /** - * Returns the type for the keys of this array. - */ - public function getKeyType() : Type - { - return $this->keyType ?? $this->defaultKeyType; - } - /** - * Returns the type for the values of this array. - */ - public function getValueType() : Type - { - return $this->valueType; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->keyType) { - return 'array<' . $this->keyType . ',' . $this->valueType . '>'; - } - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - if ($this->valueType instanceof Compound) { - return '(' . $this->valueType . ')[]'; - } - return $this->valueType . '[]'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/dependencies/phpdocumentor/type-resolver/src/Types/AggregatedType.php deleted file mode 100644 index dbb2eee..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/AggregatedType.php +++ /dev/null @@ -1,107 +0,0 @@ - - */ -abstract class AggregatedType implements Type, IteratorAggregate -{ - /** - * @psalm-allow-private-mutation - * @var array - */ - private array $types = []; - private string $token; - /** - * @param array $types - */ - public function __construct(array $types, string $token) - { - foreach ($types as $type) { - $this->add($type); - } - $this->token = $token; - } - /** - * Returns the type at the given index. - */ - public function get(int $index) : ?Type - { - if (!$this->has($index)) { - return null; - } - return $this->types[$index]; - } - /** - * Tests if this compound type has a type with the given index. - */ - public function has(int $index) : bool - { - return array_key_exists($index, $this->types); - } - /** - * Tests if this compound type contains the given type. - */ - public function contains(Type $type) : bool - { - foreach ($this->types as $typePart) { - // if the type is duplicate; do not add it - if ((string) $typePart === (string) $type) { - return \true; - } - } - return \false; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return implode($this->token, $this->types); - } - /** - * @return ArrayIterator - */ - public function getIterator() : ArrayIterator - { - return new ArrayIterator($this->types); - } - /** - * @psalm-suppress ImpureMethodCall - */ - private function add(Type $type) : void - { - if ($type instanceof static) { - foreach ($type->getIterator() as $subType) { - $this->add($subType); - } - return; - } - // if the type is duplicate; do not add it - if ($this->contains($type)) { - return; - } - $this->types[] = $type; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/ArrayKey.php b/dependencies/phpdocumentor/type-resolver/src/Types/ArrayKey.php deleted file mode 100644 index b885c19..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/ArrayKey.php +++ /dev/null @@ -1,37 +0,0 @@ -type = $type; - $this->isReference = $isReference; - $this->isVariadic = $isVariadic; - $this->isOptional = $isOptional; - $this->name = $name; - } - public function getName() : ?string - { - return $this->name; - } - public function getType() : Type - { - return $this->type; - } - public function isReference() : bool - { - return $this->isReference; - } - public function isVariadic() : bool - { - return $this->isVariadic; - } - public function isOptional() : bool - { - return $this->isOptional; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Callable_.php b/dependencies/phpdocumentor/type-resolver/src/Types/Callable_.php deleted file mode 100644 index 3cf4273..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Callable_.php +++ /dev/null @@ -1,49 +0,0 @@ -parameters = $parameters; - $this->returnType = $returnType; - } - /** @return CallableParameter[] */ - public function getParameters() : array - { - return $this->parameters; - } - public function getReturnType() : ?Type - { - return $this->returnType; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'callable'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/ClassString.php b/dependencies/phpdocumentor/type-resolver/src/Types/ClassString.php deleted file mode 100644 index 4f3c045..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/ClassString.php +++ /dev/null @@ -1,53 +0,0 @@ -fqsen = $fqsen; - } - public function underlyingType() : Type - { - return new String_(); - } - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->fqsen === null) { - return 'class-string'; - } - return 'class-string<' . (string) $this->fqsen . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Collection.php b/dependencies/phpdocumentor/type-resolver/src/Types/Collection.php deleted file mode 100644 index 3e90537..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Collection.php +++ /dev/null @@ -1,58 +0,0 @@ -` - * 2. `ACollectionObject` - * - * - ACollectionObject can be 'array' or an object that can act as an array - * - aValueType and aKeyType can be any type expression - * - * @psalm-immutable - */ -final class Collection extends AbstractList -{ - private ?Fqsen $fqsen; - /** - * Initializes this representation of an array with the given Type or Fqsen. - */ - public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) - { - parent::__construct($valueType, $keyType); - $this->fqsen = $fqsen; - } - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - $objectType = (string) ($this->fqsen ?? 'object'); - if ($this->keyType === null) { - return $objectType . '<' . $this->valueType . '>'; - } - return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Compound.php b/dependencies/phpdocumentor/type-resolver/src/Types/Compound.php deleted file mode 100644 index 46eee43..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Compound.php +++ /dev/null @@ -1,35 +0,0 @@ - $types - */ - public function __construct(array $types) - { - parent::__construct($types, '|'); - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Context.php b/dependencies/phpdocumentor/type-resolver/src/Types/Context.php deleted file mode 100644 index f822254..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Context.php +++ /dev/null @@ -1,82 +0,0 @@ - Fully Qualified Namespace. - * @psalm-var array - */ - private array $namespaceAliases; - /** - * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) - * format (without a preceding `\`). - * - * @param string $namespace The namespace where this DocBlock resides in. - * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. - * @psalm-param array $namespaceAliases - */ - public function __construct(string $namespace, array $namespaceAliases = []) - { - $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; - foreach ($namespaceAliases as $alias => $fqnn) { - if ($fqnn[0] === '\\') { - $fqnn = substr($fqnn, 1); - } - if ($fqnn[strlen($fqnn) - 1] === '\\') { - $fqnn = substr($fqnn, 0, -1); - } - $namespaceAliases[$alias] = $fqnn; - } - $this->namespaceAliases = $namespaceAliases; - } - /** - * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - */ - public function getNamespace() : string - { - return $this->namespace; - } - /** - * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent - * the alias for the imported Namespace. - * - * @return string[] - * @psalm-return array - */ - public function getNamespaceAliases() : array - { - return $this->namespaceAliases; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/dependencies/phpdocumentor/type-resolver/src/Types/ContextFactory.php deleted file mode 100644 index ee81745..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/ContextFactory.php +++ /dev/null @@ -1,359 +0,0 @@ - $reflector */ - return $this->createFromReflectionClass($reflector); - } - if ($reflector instanceof ReflectionParameter) { - return $this->createFromReflectionParameter($reflector); - } - if ($reflector instanceof ReflectionMethod) { - return $this->createFromReflectionMethod($reflector); - } - if ($reflector instanceof ReflectionProperty) { - return $this->createFromReflectionProperty($reflector); - } - if ($reflector instanceof ReflectionClassConstant) { - return $this->createFromReflectionClassConstant($reflector); - } - throw new UnexpectedValueException('Unhandled \\Reflector instance given: ' . get_class($reflector)); - } - private function createFromReflectionParameter(ReflectionParameter $parameter) : Context - { - $class = $parameter->getDeclaringClass(); - if (!$class) { - throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); - } - return $this->createFromReflectionClass($class); - } - private function createFromReflectionMethod(ReflectionMethod $method) : Context - { - $class = $method->getDeclaringClass(); - return $this->createFromReflectionClass($class); - } - private function createFromReflectionProperty(ReflectionProperty $property) : Context - { - $class = $property->getDeclaringClass(); - return $this->createFromReflectionClass($class); - } - private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @phpstan-var ReflectionClass $class */ - $class = $constant->getDeclaringClass(); - return $this->createFromReflectionClass($class); - } - /** - * @phpstan-param ReflectionClass $class - */ - private function createFromReflectionClass(ReflectionClass $class) : Context - { - $fileName = $class->getFileName(); - $namespace = $class->getNamespaceName(); - if (is_string($fileName) && file_exists($fileName)) { - $contents = file_get_contents($fileName); - if ($contents === \false) { - throw new RuntimeException('Unable to read file "' . $fileName . '"'); - } - return $this->createForNamespace($namespace, $contents); - } - return new Context($namespace, []); - } - /** - * Build a Context for a namespace in the provided file contents. - * - * @see Context for more information on Contexts. - * - * @param string $namespace It does not matter if a `\` precedes the namespace name, - * this method first normalizes. - * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. - */ - public function createForNamespace(string $namespace, string $fileContents) : Context - { - $namespace = trim($namespace, '\\'); - $useStatements = []; - $currentNamespace = ''; - $tokens = new ArrayIterator(token_get_all($fileContents)); - while ($tokens->valid()) { - $currentToken = $tokens->current(); - switch ($currentToken[0]) { - case T_NAMESPACE: - $currentNamespace = $this->parseNamespace($tokens); - break; - case T_CLASS: - case \T_TRAIT: - // Fast-forward the iterator through the class so that any - // T_USE tokens found within are skipped - these are not - // valid namespace use statements so should be ignored. - $braceLevel = 0; - $firstBraceFound = \false; - while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - $currentToken = $tokens->current(); - if ($currentToken === '{' || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], \true)) { - if (!$firstBraceFound) { - $firstBraceFound = \true; - } - ++$braceLevel; - } - if ($currentToken === '}') { - --$braceLevel; - } - $tokens->next(); - } - break; - case T_USE: - if ($currentNamespace === $namespace) { - $useStatements += $this->parseUseStatement($tokens); - } - break; - } - $tokens->next(); - } - return new Context($namespace, $useStatements); - } - /** - * Deduce the name from tokens when we are at the T_NAMESPACE token. - * - * @param ArrayIterator $tokens - */ - private function parseNamespace(ArrayIterator $tokens) : string - { - // skip to the first string or namespace separator - $this->skipToNextStringOrNamespaceSeparator($tokens); - $name = ''; - $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; - while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, \true)) { - $name .= $tokens->current()[1]; - $tokens->next(); - } - return $name; - } - /** - * Deduce the names of all imports when we are at the T_USE token. - * - * @param ArrayIterator $tokens - * - * @return string[] - * @psalm-return array - */ - private function parseUseStatement(ArrayIterator $tokens) : array - { - $uses = []; - while ($tokens->valid()) { - $this->skipToNextStringOrNamespaceSeparator($tokens); - $uses += $this->extractUseStatements($tokens); - $currentToken = $tokens->current(); - if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { - return $uses; - } - } - return $uses; - } - /** - * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. - * - * @param ArrayIterator $tokens - */ - private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void - { - while ($tokens->valid()) { - $currentToken = $tokens->current(); - if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], \true)) { - break; - } - if ($currentToken[0] === T_NAME_QUALIFIED) { - break; - } - if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { - break; - } - $tokens->next(); - } - } - /** - * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. This will return a key/value array of the alias => namespace. - * - * @param ArrayIterator $tokens - * - * @return string[] - * @psalm-return array - * - * @psalm-suppress TypeDoesNotContainType - */ - private function extractUseStatements(ArrayIterator $tokens) : array - { - $extractedUseStatements = []; - $groupedNs = ''; - $currentNs = ''; - $currentAlias = ''; - $state = 'start'; - while ($tokens->valid()) { - $currentToken = $tokens->current(); - $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; - $tokenValue = is_string($currentToken) ? null : $currentToken[1]; - switch ($state) { - case 'start': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_NAME_QUALIFIED: - case T_NAME_FULLY_QUALIFIED: - $currentNs .= (string) $tokenValue; - $currentAlias = substr((string) $tokenValue, (int) strrpos((string) $tokenValue, '\\') + 1); - break; - case T_CURLY_OPEN: - case '{': - $state = 'grouped'; - $groupedNs = $currentNs; - break; - case T_AS: - $state = 'start-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - break; - case 'start-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - break; - case 'grouped': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_AS: - $state = 'grouped-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - break; - case 'grouped-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - } - if ($state === 'end') { - break; - } - $tokens->next(); - } - if ($groupedNs !== $currentNs) { - $extractedUseStatements[(string) $currentAlias] = $currentNs; - } - return $extractedUseStatements; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Expression.php b/dependencies/phpdocumentor/type-resolver/src/Types/Expression.php deleted file mode 100644 index 185009d..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Expression.php +++ /dev/null @@ -1,44 +0,0 @@ -valueType = $valueType; - } - /** - * Returns the value for the keys of this array. - */ - public function getValueType() : Type - { - return $this->valueType; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '(' . $this->valueType . ')'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Float_.php b/dependencies/phpdocumentor/type-resolver/src/Types/Float_.php deleted file mode 100644 index 487a512..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Float_.php +++ /dev/null @@ -1,29 +0,0 @@ -fqsen = $fqsen; - } - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->fqsen === null) { - return 'interface-string'; - } - return 'interface-string<' . (string) $this->fqsen . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Intersection.php b/dependencies/phpdocumentor/type-resolver/src/Types/Intersection.php deleted file mode 100644 index ff1bab0..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Intersection.php +++ /dev/null @@ -1,35 +0,0 @@ - $types - */ - public function __construct(array $types) - { - parent::__construct($types, '&'); - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Iterable_.php b/dependencies/phpdocumentor/type-resolver/src/Types/Iterable_.php deleted file mode 100644 index 89a0139..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Iterable_.php +++ /dev/null @@ -1,34 +0,0 @@ -keyType) { - return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; - } - if ($this->valueType instanceof Mixed_) { - return 'iterable'; - } - return 'iterable<' . $this->valueType . '>'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Mixed_.php b/dependencies/phpdocumentor/type-resolver/src/Types/Mixed_.php deleted file mode 100644 index 331f273..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Mixed_.php +++ /dev/null @@ -1,29 +0,0 @@ -realType = $realType; - } - /** - * Provide access to the actual type directly, if needed. - */ - public function getActualType() : Type - { - return $this->realType; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '?' . $this->realType->__toString(); - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Object_.php b/dependencies/phpdocumentor/type-resolver/src/Types/Object_.php deleted file mode 100644 index 89c6922..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Object_.php +++ /dev/null @@ -1,56 +0,0 @@ -fqsen = $fqsen; - } - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - public function __toString() : string - { - if ($this->fqsen) { - return (string) $this->fqsen; - } - return 'object'; - } -} diff --git a/dependencies/phpdocumentor/type-resolver/src/Types/Parent_.php b/dependencies/phpdocumentor/type-resolver/src/Types/Parent_.php deleted file mode 100644 index 2924964..0000000 --- a/dependencies/phpdocumentor/type-resolver/src/Types/Parent_.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -use bcmath_compat\BCMath; - -if (!function_exists('bcadd')) { - /** - * Add two arbitrary precision numbers - * - * @var string $left_operand - * @var string $right_operand - * @var int $scale optional - */ - function bcadd($left_operand, $right_operand, $scale = 0) - { - return BCMath::add($left_operand, $right_operand, $scale); - } - - /** - * Compare two arbitrary precision numbers - * - * @var string $left_operand - * @var string $right_operand - * @var int $scale optional - */ - function bccomp($left_operand, $right_operand, $scale = 0) - { - return BCMath::comp($left_operand, $right_operand, $scale); - } - - /** - * Divide two arbitrary precision numbers - * - * @var string $dividend - * @var string $divisor - * @var int $scale optional - */ - function bcdiv($dividend, $divisor, $scale = 0) - { - return BCMath::div($dividend, $divisor, $scale); - } - - /** - * Get modulus of an arbitrary precision number - * - * @var string $dividend - * @var string $divisor - * @var int $scale optional - */ - function bcmod($dividend, $divisor, $scale = 0) - { - return BCMath::mod($dividend, $divisor, $scale); - } - - /** - * Multiply two arbitrary precision numbers - * - * @var string $left_operand - * @var string $right_operand - * @var int $scale optional - */ - function bcmul($dividend, $divisor, $scale = 0) - { - return BCMath::mul($dividend, $divisor, $scale); - } - - /** - * Raise an arbitrary precision number to another - * - * @var string $base - * @var string $exponent - * @var int $scale optional - */ - function bcpow($base, $exponent, $scale = 0) - { - return BCMath::pow($base, $exponent, $scale); - } - - /** - * Raise an arbitrary precision number to another, reduced by a specified modulus - * - * @var string $base - * @var string $exponent - * @var string $modulus - * @var int $scale optional - */ - function bcpowmod($base, $exponent, $modulus, $scale = 0) - { - return BCMath::powmod($base, $exponent, $modulus, $scale); - } - - /** - * Set or get default scale parameter for all bc math functions - * - * @var int $scale - */ - function bcscale($scale = null) - { - return BCMath::scale($scale); - } - - /** - * Get the square root of an arbitrary precision number - * - * @var string $operand - * @var int $scale optional - */ - function bcsqrt($operand, $scale = 0) - { - return BCMath::sqrt($operand, $scale); - } - - /** - * Subtract one arbitrary precision number from another - * - * @var string $left_operand - * @var string $right_operand - * @var int $scale optional - */ - function bcsub($left_operand, $right_operand, $scale = 0) - { - return BCMath::sub($left_operand, $right_operand, $scale); - } -} - -// the following were introduced in PHP 7.0.0 -if (!class_exists('Error')) { - class Error extends Exception - { - } - - class ArithmeticError extends Error - { - } - - class DivisionByZeroError extends ArithmeticError - { - } - - class TypeError extends Error - { - } -} - -// the following was introduced in PHP 7.1.0 -if (!class_exists('ArgumentCountError')) { - class ArgumentCountError extends TypeError - { - } -} - -// the following was introduced in PHP 8.0.0 -if (!class_exists('ValueError')) { - class ValueError extends Error - { - } -} \ No newline at end of file diff --git a/dependencies/phpseclib/bcmath_compat/src/BCMath.php b/dependencies/phpseclib/bcmath_compat/src/BCMath.php deleted file mode 100644 index 64f66d9..0000000 --- a/dependencies/phpseclib/bcmath_compat/src/BCMath.php +++ /dev/null @@ -1,494 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace bcmath_compat; - -use phpseclib3\Math\BigInteger; - -/** - * BCMath Emulation Class - * - * @author Jim Wigginton - * @access public - */ -abstract class BCMath -{ - /** - * Default scale parameter for all bc math functions - */ - private static $scale; - - /** - * Set or get default scale parameter for all bc math functions - * - * Uses the PHP 7.3+ behavior - * - * @var int $scale optional - */ - private static function scale($scale = null) - { - if (isset($scale)) { - self::$scale = (int) $scale; - } - return self::$scale; - } - - /** - * Formats numbers - * - * Places the decimal place at the appropriate place, adds trailing 0's as appropriate, etc - * - * @var string $x - * @var int $scale - * @var int $pad - * @var boolean $trim - */ - private static function format($x, $scale, $pad) - { - $sign = self::isNegative($x) ? '-' : ''; - $x = str_replace('-', '', $x); - - if (strlen($x) != $pad) { - $x = str_pad($x, $pad, '0', STR_PAD_LEFT); - } - $temp = $pad ? substr_replace($x, '.', -$pad, 0) : $x; - $temp = explode('.', $temp); - if ($temp[0] == '') { - $temp[0] = '0'; - } - if (isset($temp[1])) { - $temp[1] = substr($temp[1], 0, $scale); - $temp[1] = str_pad($temp[1], $scale, '0'); - } elseif ($scale) { - $temp[1] = str_repeat('0', $scale); - } - $result = rtrim(implode('.', $temp), '.'); - if ($sign == '-' && preg_match('#^0\.?0*$#', $result)) { - $sign = ''; - } - return $sign . $result; - } - - /** - * Negativity Test - * - * @var BigInteger $x - */ - private static function isNegative($x) - { - return $x->compare(new BigInteger()) < 0; - } - - /** - * Add two arbitrary precision numbers - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function add($x, $y, $scale, $pad) - { - $z = $x->add($y); - - return self::format($z, $scale, $pad); - } - - /** - * Subtract one arbitrary precision number from another - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function sub($x, $y, $scale, $pad) - { - $z = $x->subtract($y); - - return self::format($z, $scale, $pad); - } - - /** - * Multiply two arbitrary precision numbers - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function mul($x, $y, $scale, $pad) - { - if ($x == '0' || $y == '0') { - $r = '0'; - if ($scale) { - $r.= '.' . str_repeat('0', $scale); - } - return $r; - } - - $z = $x->abs()->multiply($y->abs()); - $result = self::format($z, $scale, 2 * $pad); - - $sign = (self::isNegative($x) ^ self::isNegative($y)) && !preg_match('#^0\.?0*$#', $result) ? '-' : ''; - - return $sign . $result; - } - - /** - * Divide two arbitrary precision numbers - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function div($x, $y, $scale, $pad) - { - if ($y == '0') { - // < PHP 8.0 triggered a warning - // >= PHP 8.0 throws an exception - throw new \DivisionByZeroError('Division by zero'); - } - - $temp = '1' . str_repeat('0', $scale); - $temp = new BigInteger($temp); - list($q) = $x->multiply($temp)->divide($y); - - return self::format($q, $scale, $scale); - } - - /** - * Get modulus of an arbitrary precision number - * - * Uses the PHP 7.2+ behavior - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function mod($x, $y, $scale, $pad) - { - if ($y == '0') { - // < PHP 8.0 triggered a warning - // >= PHP 8.0 throws an exception - throw new \DivisionByZeroError('Division by zero'); - } - - list($q) = $x->divide($y); - $z = $y->multiply($q); - $z = $x->subtract($z); - - return self::format($z, $scale, $pad); - } - - /** - * Compare two arbitrary precision numbers - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function comp($x, $y, $scale, $pad) - { - $x = new BigInteger($x[0] . substr($x[1], 0, $scale)); - $y = new BigInteger($y[0] . substr($y[1], 0, $scale)); - - return $x->compare($y); - } - - /** - * Raise an arbitrary precision number to another - * - * Uses the PHP 7.2+ behavior - * - * @var string $x - * @var string $y - * @var int $scale - * @var int $pad - */ - private static function pow($x, $y, $scale, $pad) - { - if ($y == '0') { - $r = '1'; - if ($scale) { - $r.= '.' . str_repeat('0', $scale); - } - return $r; - } - - $min = defined('PHP_INT_MIN') ? PHP_INT_MIN : ~PHP_INT_MAX; - if (bccomp($y, PHP_INT_MAX) > 0 || bccomp($y, $min) <= 0) { - throw new \ValueError('bcpow(): Argument #2 ($exponent) is too large'); - } - - $sign = self::isNegative($x) ? '-' : ''; - $x = $x->abs(); - - $r = new BigInteger(1); - - for ($i = 0; $i < abs($y); $i++) { - $r = $r->multiply($x); - } - - if ($y < 0) { - $temp = '1' . str_repeat('0', $scale + $pad * abs($y)); - $temp = new BigInteger($temp); - list($r) = $temp->divide($r); - $pad = $scale; - } else { - $pad*= abs($y); - } - - return $sign . self::format($r, $scale, $pad); - } - - /** - * Raise an arbitrary precision number to another, reduced by a specified modulus - * - * @var string $x - * @var string $e - * @var string $n - * @var int $scale - * @var int $pad - */ - private static function powmod($x, $e, $n, $scale, $pad) - { - if ($e[0] == '-' || $n == '0') { - // < PHP 8.0 returned false - // >= PHP 8.0 throws an exception - throw new \ValueError('bcpowmod(): Argument #2 ($exponent) must be greater than or equal to 0'); - } - if ($n[0] == '-') { - $n = substr($n, 1); - } - if ($e == '0') { - return $scale ? - '1.' . str_repeat('0', $scale) : - '1'; - } - - $x = new BigInteger($x); - $e = new BigInteger($e); - $n = new BigInteger($n); - - $z = $x->powMod($e, $n); - - return $scale ? - "$z." . str_repeat('0', $scale) : - "$z"; - } - - /** - * Get the square root of an arbitrary precision number - * - * @var string $n - * @var int $scale - * @var int $pad - */ - private static function sqrt($n, $scale, $pad) - { - // the following is based off of the following URL: - // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Decimal_(base_10) - - if (!is_numeric($n)) { - return '0'; - } - $temp = explode('.', $n); - $decStart = ceil(strlen($temp[0]) / 2); - $n = implode('', $temp); - if (strlen($n) % 2) { - $n = "0$n"; - } - $parts = str_split($n, 2); - $parts = array_map('intval', $parts); - $i = 0; - $p = 0; // for the first step, p = 0 - $c = $parts[$i]; - $result = ''; - while (true) { - // determine the greatest digit x such that x(20p+x) <= c - for ($x = 1; $x <= 10; $x++) { - if ($x * (20 * $p + $x) > $c) { - $x--; - break; - } - } - $result.= $x; - $y = $x * (20 * $p + $x); - $p = 10 * $p + $x; - $c = 100 * ($c - $y); - if (isset($parts[++$i])) { - $c+= $parts[$i]; - } - if ((!$c && $i >= $decStart) || $i - $decStart == $scale) { - break; - } - if ($decStart == $i) { - $result.= '.'; - } - } - - $result = explode('.', $result); - if (isset($result[1])) { - $result[1] = str_pad($result[1], $scale, '0'); - } elseif ($scale) { - $result[1] = str_repeat('0', $scale); - } - return implode('.', $result); - } - - /** - * __callStatic Magic Method - * - * @var string $name - * @var array $arguments - */ - public static function __callStatic($name, $arguments) - { - static $params = [ - 'add' => 3, - 'comp' => 3, - 'div' => 3, - 'mod' => 3, - 'mul' => 3, - 'pow' => 3, - 'powmod' => 4, - 'scale' => 1, - 'sqrt' => 2, - 'sub' => 3 - ]; - if (count($arguments) < $params[$name] - 1) { - $min = $params[$name] - 1; - throw new \ArgumentCountError("bc$name() expects at least $min parameters, " . func_num_args() . " given"); - } - if (count($arguments) > $params[$name]) { - $str = "bc$name() expects at most {$params[$name]} parameters, " . func_num_args() . " given"; - throw new \ArgumentCountError($str); - } - $numbers = array_slice($arguments, 0, $params[$name] - 1); - - $ints = []; - switch ($name) { - case 'pow': - $ints = array_slice($numbers, count($numbers) - 1); - $numbers = array_slice($numbers, 0, count($numbers) - 1); - $names = ['exponent']; - break; - case 'powmod': - $ints = $numbers; - $numbers = []; - $names = ['base', 'exponent', 'modulus']; - break; - case 'sqrt': - $names = ['num']; - break; - default: - $names = ['num1', 'num2']; - } - foreach ($ints as $i => &$int) { - if (!is_numeric($int)) { - $int = '0'; - } - $pos = strpos($int, '.'); - if ($pos !== false) { - $int = substr($int, 0, $pos); - throw new \ValueError("bc$name(): Argument #2 (\$$names[$i]) cannot have a fractional part"); - } - } - foreach ($numbers as $i => $arg) { - $num = $i + 1; - switch (true) { - case is_bool($arg): - case is_numeric($arg): - case is_string($arg): - case is_object($arg) && method_exists($arg, '__toString'): - if (!is_bool($arg) && !is_numeric("$arg")) { - throw new \ValueError("bc$name: bcmath function argument is not well-formed"); - } - break; - // PHP >= 8.1 has deprecated the passing of nulls to string parameters - case is_null($arg): - $error = "bc$name(): Passing null to parameter #$num (\$$names[$i]) of type string is deprecated"; - trigger_error($error, E_USER_DEPRECATED); - break; - default: - $type = is_object($arg) ? get_class($arg) : gettype($arg); - $error = "bc$name(): Argument #$num (\$$names[$i]) must be of type string, $type given"; - throw new \TypeError($error); - } - } - if (!isset(self::$scale)) { - $scale = ini_get('bcmath.scale'); - self::$scale = $scale !== false ? max(intval($scale), 0) : 0; - } - $scale = isset($arguments[$params[$name] - 1]) ? $arguments[$params[$name] - 1] : self::$scale; - switch (true) { - case is_bool($scale): - case is_numeric($scale): - case is_string($scale) && preg_match('#0-9\.#', $scale[0]): - break; - default: - $type = is_object($arg) ? get_class($arg) : gettype($arg); - $str = "bc$name(): Argument #$params[$name] (\$scale) must be of type ?int, string given"; - throw new \TypeError($str); - } - $scale = (int) $scale; - if ($scale < 0) { - throw new \ValueError("bc$name(): Argument #$params[$name] (\$scale) must be between 0 and 2147483647"); - } - - $pad = 0; - foreach ($numbers as &$num) { - if (is_bool($num)) { - $num = $num ? '1' : '0'; - } elseif (!is_numeric($num)) { - $num = '0'; - } - $num = explode('.', $num); - if (isset($num[1])) { - $pad = max($pad, strlen($num[1])); - } - } - switch ($name) { - case 'add': - case 'sub': - case 'mul': - case 'div': - case 'mod': - case 'pow': - foreach ($numbers as &$num) { - if (!isset($num[1])) { - $num[1] = ''; - } - $num[1] = str_pad($num[1], $pad, '0'); - $num = new BigInteger($num[0] . $num[1]); - } - break; - case 'comp': - foreach ($numbers as &$num) { - if (!isset($num[1])) { - $num[1] = ''; - } - $num[1] = str_pad($num[1], $pad, '0'); - } - break; - case 'sqrt': - $numbers = [$arguments[0]]; - } - - $arguments = array_merge($numbers, $ints, [$scale, $pad]); - return call_user_func_array('self::' . $name, $arguments); - } -} diff --git a/dependencies/phpseclib/phpseclib/AUTHORS b/dependencies/phpseclib/phpseclib/AUTHORS deleted file mode 100644 index 9f10d26..0000000 --- a/dependencies/phpseclib/phpseclib/AUTHORS +++ /dev/null @@ -1,7 +0,0 @@ -phpseclib Lead Developer: TerraFrost (Jim Wigginton) - -phpseclib Developers: monnerat (Patrick Monnerat) - bantu (Andreas Fischer) - petrich (Hans-Jürgen Petrich) - GrahamCampbell (Graham Campbell) - hc-jworman \ No newline at end of file diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php b/dependencies/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php deleted file mode 100644 index 1fce169..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php +++ /dev/null @@ -1,454 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Common\Functions; - -use WP_Ultimo\Dependencies\ParagonIE\ConstantTime\Base64; -use WP_Ultimo\Dependencies\ParagonIE\ConstantTime\Base64UrlSafe; -use WP_Ultimo\Dependencies\ParagonIE\ConstantTime\Hex; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\Common\FiniteField; -/** - * Common String Functions - * - * @author Jim Wigginton - */ -abstract class Strings -{ - /** - * String Shift - * - * Inspired by array_shift - * - * @param string $string - * @param int $index - * @return string - */ - public static function shift(&$string, $index = 1) - { - $substr = \substr($string, 0, $index); - $string = \substr($string, $index); - return $substr; - } - /** - * String Pop - * - * Inspired by array_pop - * - * @param string $string - * @param int $index - * @return string - */ - public static function pop(&$string, $index = 1) - { - $substr = \substr($string, -$index); - $string = \substr($string, 0, -$index); - return $substr; - } - /** - * Parse SSH2-style string - * - * Returns either an array or a boolean if $data is malformed. - * - * Valid characters for $format are as follows: - * - * C = byte - * b = boolean (true/false) - * N = uint32 - * Q = uint64 - * s = string - * i = mpint - * L = name-list - * - * uint64 is not supported. - * - * @param string $format - * @param string $data - * @return mixed - */ - public static function unpackSSH2($format, &$data) - { - $format = self::formatPack($format); - $result = []; - for ($i = 0; $i < \strlen($format); $i++) { - switch ($format[$i]) { - case 'C': - case 'b': - if (!\strlen($data)) { - throw new \LengthException('At least one byte needs to be present for successful C / b decodes'); - } - break; - case 'N': - case 'i': - case 's': - case 'L': - if (\strlen($data) < 4) { - throw new \LengthException('At least four byte needs to be present for successful N / i / s / L decodes'); - } - break; - case 'Q': - if (\strlen($data) < 8) { - throw new \LengthException('At least eight byte needs to be present for successful N / i / s / L decodes'); - } - break; - default: - throw new \InvalidArgumentException('$format contains an invalid character'); - } - switch ($format[$i]) { - case 'C': - $result[] = \ord(self::shift($data)); - continue 2; - case 'b': - $result[] = \ord(self::shift($data)) != 0; - continue 2; - case 'N': - list(, $temp) = \unpack('N', self::shift($data, 4)); - $result[] = $temp; - continue 2; - case 'Q': - // pack() added support for Q in PHP 5.6.3 and PHP 5.6 is phpseclib 3's minimum version - // so in theory we could support this BUT, "64-bit format codes are not available for - // 32-bit versions" and phpseclib works on 32-bit installs. on 32-bit installs - // 64-bit floats can be used to get larger numbers then 32-bit signed ints would allow - // for. sure, you're not gonna get the full precision of 64-bit numbers but just because - // you need > 32-bit precision doesn't mean you need the full 64-bit precision - \extract(\unpack('Nupper/Nlower', self::shift($data, 8))); - $temp = $upper ? 4294967296 * $upper : 0; - $temp += $lower < 0 ? ($lower & 0x7ffffffff) + 0x80000000 : $lower; - // $temp = hexdec(bin2hex(self::shift($data, 8))); - $result[] = $temp; - continue 2; - } - list(, $length) = \unpack('N', self::shift($data, 4)); - if (\strlen($data) < $length) { - throw new \LengthException("{$length} bytes needed; " . \strlen($data) . ' bytes available'); - } - $temp = self::shift($data, $length); - switch ($format[$i]) { - case 'i': - $result[] = new BigInteger($temp, -256); - break; - case 's': - $result[] = $temp; - break; - case 'L': - $result[] = \explode(',', $temp); - } - } - return $result; - } - /** - * Create SSH2-style string - * - * @param string $format - * @param string|int|float|array|bool ...$elements - * @return string - */ - public static function packSSH2($format, ...$elements) - { - $format = self::formatPack($format); - if (\strlen($format) != \count($elements)) { - throw new \InvalidArgumentException('There must be as many arguments as there are characters in the $format string'); - } - $result = ''; - for ($i = 0; $i < \strlen($format); $i++) { - $element = $elements[$i]; - switch ($format[$i]) { - case 'C': - if (!\is_int($element)) { - throw new \InvalidArgumentException('Bytes must be represented as an integer between 0 and 255, inclusive.'); - } - $result .= \pack('C', $element); - break; - case 'b': - if (!\is_bool($element)) { - throw new \InvalidArgumentException('A boolean parameter was expected.'); - } - $result .= $element ? "\x01" : "\x00"; - break; - case 'Q': - if (!\is_int($element) && !\is_float($element)) { - throw new \InvalidArgumentException('An integer was expected.'); - } - // 4294967296 == 1 << 32 - $result .= \pack('NN', $element / 4294967296, $element); - break; - case 'N': - if (\is_float($element)) { - $element = (int) $element; - } - if (!\is_int($element)) { - throw new \InvalidArgumentException('An integer was expected.'); - } - $result .= \pack('N', $element); - break; - case 's': - if (!self::is_stringable($element)) { - throw new \InvalidArgumentException('A string was expected.'); - } - $result .= \pack('Na*', \strlen($element), $element); - break; - case 'i': - if (!$element instanceof BigInteger && !$element instanceof FiniteField\Integer) { - throw new \InvalidArgumentException('A phpseclib3\\Math\\BigInteger or phpseclib3\\Math\\Common\\FiniteField\\Integer object was expected.'); - } - $element = $element->toBytes(\true); - $result .= \pack('Na*', \strlen($element), $element); - break; - case 'L': - if (!\is_array($element)) { - throw new \InvalidArgumentException('An array was expected.'); - } - $element = \implode(',', $element); - $result .= \pack('Na*', \strlen($element), $element); - break; - default: - throw new \InvalidArgumentException('$format contains an invalid character'); - } - } - return $result; - } - /** - * Expand a pack string - * - * Converts C5 to CCCCC, for example. - * - * @param string $format - * @return string - */ - private static function formatPack($format) - { - $parts = \preg_split('#(\\d+)#', $format, -1, \PREG_SPLIT_DELIM_CAPTURE); - $format = ''; - for ($i = 1; $i < \count($parts); $i += 2) { - $format .= \substr($parts[$i - 1], 0, -1) . \str_repeat(\substr($parts[$i - 1], -1), $parts[$i]); - } - $format .= $parts[$i - 1]; - return $format; - } - /** - * Convert binary data into bits - * - * bin2hex / hex2bin refer to base-256 encoded data as binary, whilst - * decbin / bindec refer to base-2 encoded data as binary. For the purposes - * of this function, bin refers to base-256 encoded data whilst bits refers - * to base-2 encoded data - * - * @param string $x - * @return string - */ - public static function bits2bin($x) - { - /* - // the pure-PHP approach is faster than the GMP approach - if (function_exists('gmp_export')) { - return strlen($x) ? gmp_export(gmp_init($x, 2)) : gmp_init(0); - } - */ - if (\preg_match('#[^01]#', $x)) { - throw new \RuntimeException('The only valid characters are 0 and 1'); - } - if (!\defined('PHP_INT_MIN')) { - \define('PHP_INT_MIN', ~\PHP_INT_MAX); - } - $length = \strlen($x); - if (!$length) { - return ''; - } - $block_size = \PHP_INT_SIZE << 3; - $pad = $block_size - $length % $block_size; - if ($pad != $block_size) { - $x = \str_repeat('0', $pad) . $x; - } - $parts = \str_split($x, $block_size); - $str = ''; - foreach ($parts as $part) { - $xor = $part[0] == '1' ? \PHP_INT_MIN : 0; - $part[0] = '0'; - $str .= \pack(\PHP_INT_SIZE == 4 ? 'N' : 'J', $xor ^ eval('return 0b' . $part . ';')); - } - return \ltrim($str, "\x00"); - } - /** - * Convert bits to binary data - * - * @param string $x - * @return string - */ - public static function bin2bits($x, $trim = \true) - { - /* - // the pure-PHP approach is slower than the GMP approach BUT - // i want to the pure-PHP version to be easily unit tested as well - if (function_exists('gmp_import')) { - return gmp_strval(gmp_import($x), 2); - } - */ - $len = \strlen($x); - $mod = $len % \PHP_INT_SIZE; - if ($mod) { - $x = \str_pad($x, $len + \PHP_INT_SIZE - $mod, "\x00", \STR_PAD_LEFT); - } - $bits = ''; - if (\PHP_INT_SIZE == 4) { - $digits = \unpack('N*', $x); - foreach ($digits as $digit) { - $bits .= \sprintf('%032b', $digit); - } - } else { - $digits = \unpack('J*', $x); - foreach ($digits as $digit) { - $bits .= \sprintf('%064b', $digit); - } - } - return $trim ? \ltrim($bits, '0') : $bits; - } - /** - * Switch Endianness Bit Order - * - * @param string $x - * @return string - */ - public static function switchEndianness($x) - { - $r = ''; - for ($i = \strlen($x) - 1; $i >= 0; $i--) { - $b = \ord($x[$i]); - if (\PHP_INT_SIZE === 8) { - // 3 operations - // from http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv - $r .= \chr(($b * 0x202020202 & 0x10884422010) % 1023); - } else { - // 7 operations - // from http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits - $p1 = $b * 0x802 & 0x22110; - $p2 = $b * 0x8020 & 0x88440; - $r .= \chr(($p1 | $p2) * 0x10101 >> 16); - } - } - return $r; - } - /** - * Increment the current string - * - * @param string $var - * @return string - */ - public static function increment_str(&$var) - { - if (\function_exists('sodium_increment')) { - $var = \strrev($var); - \sodium_increment($var); - $var = \strrev($var); - return $var; - } - for ($i = 4; $i <= \strlen($var); $i += 4) { - $temp = \substr($var, -$i, 4); - switch ($temp) { - case "\xff\xff\xff\xff": - $var = \substr_replace($var, "\x00\x00\x00\x00", -$i, 4); - break; - case "\xff\xff\xff": - $var = \substr_replace($var, "\x80\x00\x00\x00", -$i, 4); - return $var; - default: - $temp = \unpack('Nnum', $temp); - $var = \substr_replace($var, \pack('N', $temp['num'] + 1), -$i, 4); - return $var; - } - } - $remainder = \strlen($var) % 4; - if ($remainder == 0) { - return $var; - } - $temp = \unpack('Nnum', \str_pad(\substr($var, 0, $remainder), 4, "\x00", \STR_PAD_LEFT)); - $temp = \substr(\pack('N', $temp['num'] + 1), -$remainder); - $var = \substr_replace($var, $temp, 0, $remainder); - return $var; - } - /** - * Find whether the type of a variable is string (or could be converted to one) - * - * @param mixed $var - * @return bool - * @psalm-assert-if-true string|\Stringable $var - */ - public static function is_stringable($var) - { - return \is_string($var) || \is_object($var) && \method_exists($var, '__toString'); - } - /** - * Constant Time Base64-decoding - * - * ParagoneIE\ConstantTime doesn't use libsodium if it's available so we'll do so - * ourselves. see https://github.com/paragonie/constant_time_encoding/issues/39 - * - * @param string $data - * @return string - */ - public static function base64_decode($data) - { - return \function_exists('sodium_base642bin') ? \sodium_base642bin($data, \SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING, '=') : Base64::decode($data); - } - /** - * Constant Time Base64-decoding (URL safe) - * - * @param string $data - * @return string - */ - public static function base64url_decode($data) - { - // return self::base64_decode(str_replace(['-', '_'], ['+', '/'], $data)); - return \function_exists('sodium_base642bin') ? \sodium_base642bin($data, \SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING, '=') : Base64UrlSafe::decode($data); - } - /** - * Constant Time Base64-encoding - * - * @param string $data - * @return string - */ - public static function base64_encode($data) - { - return \function_exists('sodium_bin2base64') ? \sodium_bin2base64($data, \SODIUM_BASE64_VARIANT_ORIGINAL) : Base64::encode($data); - } - /** - * Constant Time Base64-encoding (URL safe) - * - * @param string $data - * @return string - */ - public static function base64url_encode($data) - { - // return str_replace(['+', '/'], ['-', '_'], self::base64_encode($data)); - return \function_exists('sodium_bin2base64') ? \sodium_bin2base64($data, \SODIUM_BASE64_VARIANT_URLSAFE) : Base64UrlSafe::encode($data); - } - /** - * Constant Time Hex Decoder - * - * @param string $data - * @return string - */ - public static function hex2bin($data) - { - return \function_exists('sodium_hex2bin') ? \sodium_hex2bin($data) : Hex::decode($data); - } - /** - * Constant Time Hex Encoder - * - * @param string $data - * @return string - */ - public static function bin2hex($data) - { - return \function_exists('sodium_bin2hex') ? \sodium_bin2hex($data) : Hex::encode($data); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/AES.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/AES.php deleted file mode 100644 index 5c30550..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/AES.php +++ /dev/null @@ -1,112 +0,0 @@ - - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $aes->decrypt($aes->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -/** - * Pure-PHP implementation of AES. - * - * @author Jim Wigginton - */ -class AES extends \phpseclib3\Crypt\Rijndael -{ - /** - * Dummy function - * - * Since \phpseclib3\Crypt\AES extends \phpseclib3\Crypt\Rijndael, this function is, technically, available, but it doesn't do anything. - * - * @see \phpseclib3\Crypt\Rijndael::setBlockLength() - * @param int $length - * @throws \BadMethodCallException anytime it's called - */ - public function setBlockLength($length) - { - throw new \BadMethodCallException('The block length cannot be set for AES.'); - } - /** - * Sets the key length - * - * Valid key lengths are 128, 192, and 256. Set the link to bool(false) to disable a fixed key length - * - * @see \phpseclib3\Crypt\Rijndael:setKeyLength() - * @param int $length - * @throws \LengthException if the key length isn't supported - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 192: - case 256: - break; - default: - throw new \LengthException('Key of size ' . $length . ' not supported by this algorithm. Only keys of sizes 128, 192 or 256 supported'); - } - parent::setKeyLength($length); - } - /** - * Sets the key. - * - * Rijndael supports five different key lengths, AES only supports three. - * - * @see \phpseclib3\Crypt\Rijndael:setKey() - * @see setKeyLength() - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (\strlen($key)) { - case 16: - case 24: - case 32: - break; - default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); - } - parent::setKey($key); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php deleted file mode 100644 index 0a82710..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php +++ /dev/null @@ -1,660 +0,0 @@ - unpack('N*', $x), $blocks); it jumps up by an additional - * ~90MB, yielding a 106x increase in memory usage. Consequently, it bcrypt calls a different - * _encryptBlock() then the regular Blowfish does. That said, the Blowfish _encryptBlock() is - * basically just a thin wrapper around the bcrypt _encryptBlock(), so there's that. - * - * This explains 3 of the 4 _encryptBlock() implementations. the last _encryptBlock() - * implementation can best be understood by doing Ctrl + F and searching for where - * self::$use_reg_intval is defined. - * - * # phpseclib's three different _setupKey() implementations - * - * Every bcrypt round is the equivalent of encrypting 512KB of data. Since OpenSSH uses 16 - * rounds by default that's ~8MB of data that's essentially being encrypted whenever - * you use bcrypt. That's a lot of data, however, bcrypt operates within tighter constraints - * than regular Blowfish, so we can use that to our advantage. In particular, whereas Blowfish - * supports variable length keys, in bcrypt, the initial "key" is the sha512 hash of the - * password. sha512 hashes are 512 bits or 64 bytes long and thus the bcrypt keys are of a - * fixed length whereas Blowfish keys are not of a fixed length. - * - * bcrypt actually has two different key expansion steps. The first one (expandstate) is - * constantly XOR'ing every _encryptBlock() parameter against the salt prior _encryptBlock()'s - * being called. The second one (expand0state) is more similar to Blowfish's _setupKey() - * but it can still use the fixed length key optimization discussed above and can do away with - * the pack() / unpack() calls. - * - * I suppose _setupKey() could be made to be a thin wrapper around expandstate() but idk it's - * just a lot of work for very marginal benefits as _setupKey() is only called once for - * regular Blowfish vs the 128 times it's called --per round-- with bcrypt. - * - * # blowfish + bcrypt in the same class - * - * Altho there's a lot of Blowfish code that bcrypt doesn't re-use, bcrypt does re-use the - * initial S-boxes, the initial P-array and the int-only _encryptBlock() implementation. - * - * # Credit - * - * phpseclib's bcrypt implementation is based losely off of OpenSSH's implementation: - * - * https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/bcrypt_pbkdf.c - * - * Here's a short example of how to use this library: - * - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\BlockCipher; -/** - * Pure-PHP implementation of Blowfish. - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - */ -class Blowfish extends BlockCipher -{ - /** - * Block Length of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 8; - /** - * The mcrypt specific name of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'blowfish'; - /** - * Optimizing value while CFB-encrypting - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 500; - /** - * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each - * - * S-Box 0 - * - * @var array - */ - private static $sbox0 = [0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0xd95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0xf6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x75372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x4c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x2e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x8ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x8ba4799, 0x6e85076a]; - /** - * S-Box 1 - * - * @var array - */ - private static $sbox1 = [0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x21ecc5e, 0x9686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0xfd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x43556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x18cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0xe358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x95bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0xc55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0xe1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]; - /** - * S-Box 2 - * - * @var array - */ - private static $sbox2 = [0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x3bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0xa2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x4272f70, 0x80bb155c, 0x5282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x7f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0xe12b4c2, 0x2e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0xa476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x6a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0xa121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x9f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0xba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0xde6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x6058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x8fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]; - /** - * S-Box 3 - * - * @var array - */ - private static $sbox3 = [0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x22b8b51, 0x96d5ac3a, 0x17da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x3a16125, 0x564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x3563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x9072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x115af84, 0xe1b00428, 0x95983a1d, 0x6b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x11a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0xf91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0xfe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x2fb8a8c, 0x1c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]; - /** - * P-Array consists of 18 32-bit subkeys - * - * @var array - */ - private static $parray = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x3707344, 0xa4093822, 0x299f31d0, 0x82efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b]; - /** - * The BCTX-working Array - * - * Holds the expanded key [p] and the key-depended s-boxes [sb] - * - * @var array - */ - private $bctx; - /** - * Holds the last used key - * - * @var array - */ - private $kl; - /** - * The Key Length (in bytes) - * {@internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk - * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could - * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once.} - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setKeyLength() - * @var int - */ - protected $key_length = 16; - /** - * Default Constructor. - * - * @param string $mode - * @throws \InvalidArgumentException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - if ($this->mode == self::MODE_STREAM) { - throw new \InvalidArgumentException('Block ciphers cannot be ran in stream mode'); - } - } - /** - * Sets the key length. - * - * Key lengths can be between 32 and 448 bits. - * - * @param int $length - */ - public function setKeyLength($length) - { - if ($length < 32 || $length > 448) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes between 32 and 448 bits are supported'); - } - $this->key_length = $length >> 3; - parent::setKeyLength($length); - } - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($engine == self::ENGINE_OPENSSL) { - if ($this->key_length < 16) { - return \false; - } - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; - } - $this->cipher_name_openssl_ecb = 'bf-ecb'; - $this->cipher_name_openssl = 'bf-' . $this->openssl_translate_mode(); - } - return parent::isValidEngineHelper($engine); - } - /** - * Setup the key (expansion) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupKey() - */ - protected function setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key]; - /* key-expanding p[] and S-Box building sb[] */ - $this->bctx = ['p' => [], 'sb' => [self::$sbox0, self::$sbox1, self::$sbox2, self::$sbox3]]; - // unpack binary string in unsigned chars - $key = \array_values(\unpack('C*', $this->key)); - $keyl = \count($key); - // with bcrypt $keyl will always be 16 (because the key is the sha512 of the key you provide) - for ($j = 0, $i = 0; $i < 18; ++$i) { - // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... - for ($data = 0, $k = 0; $k < 4; ++$k) { - $data = $data << 8 | $key[$j]; - if (++$j >= $keyl) { - $j = 0; - } - } - $this->bctx['p'][] = self::$parray[$i] ^ \intval($data); - } - // encrypt the zero-string, replace P1 and P2 with the encrypted data, - // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys - $data = "\x00\x00\x00\x00\x00\x00\x00\x00"; - for ($i = 0; $i < 18; $i += 2) { - list($l, $r) = \array_values(\unpack('N*', $data = $this->encryptBlock($data))); - $this->bctx['p'][$i] = $l; - $this->bctx['p'][$i + 1] = $r; - } - for ($i = 0; $i < 4; ++$i) { - for ($j = 0; $j < 256; $j += 2) { - list($l, $r) = \array_values(\unpack('N*', $data = $this->encryptBlock($data))); - $this->bctx['sb'][$i][$j] = $l; - $this->bctx['sb'][$i][$j + 1] = $r; - } - } - } - /** - * Initialize Static Variables - */ - protected static function initialize_static_variables() - { - if (\is_float(self::$sbox2[0])) { - self::$sbox0 = \array_map('intval', self::$sbox0); - self::$sbox1 = \array_map('intval', self::$sbox1); - self::$sbox2 = \array_map('intval', self::$sbox2); - self::$sbox3 = \array_map('intval', self::$sbox3); - self::$parray = \array_map('intval', self::$parray); - } - parent::initialize_static_variables(); - } - /** - * bcrypt - * - * @param string $sha2pass - * @param string $sha2salt - * @access private - * @return string - */ - private static function bcrypt_hash($sha2pass, $sha2salt) - { - $p = self::$parray; - $sbox0 = self::$sbox0; - $sbox1 = self::$sbox1; - $sbox2 = self::$sbox2; - $sbox3 = self::$sbox3; - $cdata = \array_values(\unpack('N*', 'OxychromaticBlowfishSwatDynamite')); - $sha2pass = \array_values(\unpack('N*', $sha2pass)); - $sha2salt = \array_values(\unpack('N*', $sha2salt)); - self::expandstate($sha2salt, $sha2pass, $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 0; $i < 64; $i++) { - self::expand0state($sha2salt, $sbox0, $sbox1, $sbox2, $sbox3, $p); - self::expand0state($sha2pass, $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - for ($i = 0; $i < 64; $i++) { - for ($j = 0; $j < 8; $j += 2) { - // count($cdata) == 8 - list($cdata[$j], $cdata[$j + 1]) = self::encryptBlockHelperFast($cdata[$j], $cdata[$j + 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - } - return \pack('L*', ...$cdata); - } - /** - * Performs OpenSSH-style bcrypt - * - * @param string $pass - * @param string $salt - * @param int $keylen - * @param int $rounds - * @access public - * @return string - */ - public static function bcrypt_pbkdf($pass, $salt, $keylen, $rounds) - { - self::initialize_static_variables(); - if (\PHP_INT_SIZE == 4) { - throw new \RuntimeException('bcrypt is far too slow to be practical on 32-bit versions of PHP'); - } - $sha2pass = \hash('sha512', $pass, \true); - $results = []; - $count = 1; - while (32 * \count($results) < $keylen) { - $countsalt = $salt . \pack('N', $count++); - $sha2salt = \hash('sha512', $countsalt, \true); - $out = $tmpout = self::bcrypt_hash($sha2pass, $sha2salt); - for ($i = 1; $i < $rounds; $i++) { - $sha2salt = \hash('sha512', $tmpout, \true); - $tmpout = self::bcrypt_hash($sha2pass, $sha2salt); - $out ^= $tmpout; - } - $results[] = $out; - } - $output = ''; - for ($i = 0; $i < 32; $i++) { - foreach ($results as $result) { - $output .= $result[$i]; - } - } - return \substr($output, 0, $keylen); - } - /** - * Key expansion without salt - * - * @access private - * @param int[] $key - * @param int[] $sbox0 - * @param int[] $sbox1 - * @param int[] $sbox2 - * @param int[] $sbox3 - * @param int[] $p - * @see self::_bcrypt_hash() - */ - private static function expand0state(array $key, array &$sbox0, array &$sbox1, array &$sbox2, array &$sbox3, array &$p) - { - // expand0state is basically the same thing as this: - //return self::expandstate(array_fill(0, 16, 0), $key); - // but this separate function eliminates a bunch of XORs and array lookups - $p = [$p[0] ^ $key[0], $p[1] ^ $key[1], $p[2] ^ $key[2], $p[3] ^ $key[3], $p[4] ^ $key[4], $p[5] ^ $key[5], $p[6] ^ $key[6], $p[7] ^ $key[7], $p[8] ^ $key[8], $p[9] ^ $key[9], $p[10] ^ $key[10], $p[11] ^ $key[11], $p[12] ^ $key[12], $p[13] ^ $key[13], $p[14] ^ $key[14], $p[15] ^ $key[15], $p[16] ^ $key[0], $p[17] ^ $key[1]]; - // @codingStandardsIgnoreStart - list($p[0], $p[1]) = self::encryptBlockHelperFast(0, 0, $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[2], $p[3]) = self::encryptBlockHelperFast($p[0], $p[1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[4], $p[5]) = self::encryptBlockHelperFast($p[2], $p[3], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[6], $p[7]) = self::encryptBlockHelperFast($p[4], $p[5], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[8], $p[9]) = self::encryptBlockHelperFast($p[6], $p[7], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[10], $p[11]) = self::encryptBlockHelperFast($p[8], $p[9], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[12], $p[13]) = self::encryptBlockHelperFast($p[10], $p[11], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[14], $p[15]) = self::encryptBlockHelperFast($p[12], $p[13], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[16], $p[17]) = self::encryptBlockHelperFast($p[14], $p[15], $sbox0, $sbox1, $sbox2, $sbox3, $p); - // @codingStandardsIgnoreEnd - list($sbox0[0], $sbox0[1]) = self::encryptBlockHelperFast($p[16], $p[17], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2; $i < 256; $i += 2) { - list($sbox0[$i], $sbox0[$i + 1]) = self::encryptBlockHelperFast($sbox0[$i - 2], $sbox0[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - list($sbox1[0], $sbox1[1]) = self::encryptBlockHelperFast($sbox0[254], $sbox0[255], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2; $i < 256; $i += 2) { - list($sbox1[$i], $sbox1[$i + 1]) = self::encryptBlockHelperFast($sbox1[$i - 2], $sbox1[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - list($sbox2[0], $sbox2[1]) = self::encryptBlockHelperFast($sbox1[254], $sbox1[255], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2; $i < 256; $i += 2) { - list($sbox2[$i], $sbox2[$i + 1]) = self::encryptBlockHelperFast($sbox2[$i - 2], $sbox2[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - list($sbox3[0], $sbox3[1]) = self::encryptBlockHelperFast($sbox2[254], $sbox2[255], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2; $i < 256; $i += 2) { - list($sbox3[$i], $sbox3[$i + 1]) = self::encryptBlockHelperFast($sbox3[$i - 2], $sbox3[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - } - /** - * Key expansion with salt - * - * @access private - * @param int[] $data - * @param int[] $key - * @param int[] $sbox0 - * @param int[] $sbox1 - * @param int[] $sbox2 - * @param int[] $sbox3 - * @param int[] $p - * @see self::_bcrypt_hash() - */ - private static function expandstate(array $data, array $key, array &$sbox0, array &$sbox1, array &$sbox2, array &$sbox3, array &$p) - { - $p = [$p[0] ^ $key[0], $p[1] ^ $key[1], $p[2] ^ $key[2], $p[3] ^ $key[3], $p[4] ^ $key[4], $p[5] ^ $key[5], $p[6] ^ $key[6], $p[7] ^ $key[7], $p[8] ^ $key[8], $p[9] ^ $key[9], $p[10] ^ $key[10], $p[11] ^ $key[11], $p[12] ^ $key[12], $p[13] ^ $key[13], $p[14] ^ $key[14], $p[15] ^ $key[15], $p[16] ^ $key[0], $p[17] ^ $key[1]]; - // @codingStandardsIgnoreStart - list($p[0], $p[1]) = self::encryptBlockHelperFast($data[0], $data[1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[2], $p[3]) = self::encryptBlockHelperFast($data[2] ^ $p[0], $data[3] ^ $p[1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[4], $p[5]) = self::encryptBlockHelperFast($data[4] ^ $p[2], $data[5] ^ $p[3], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[6], $p[7]) = self::encryptBlockHelperFast($data[6] ^ $p[4], $data[7] ^ $p[5], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[8], $p[9]) = self::encryptBlockHelperFast($data[8] ^ $p[6], $data[9] ^ $p[7], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[10], $p[11]) = self::encryptBlockHelperFast($data[10] ^ $p[8], $data[11] ^ $p[9], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[12], $p[13]) = self::encryptBlockHelperFast($data[12] ^ $p[10], $data[13] ^ $p[11], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[14], $p[15]) = self::encryptBlockHelperFast($data[14] ^ $p[12], $data[15] ^ $p[13], $sbox0, $sbox1, $sbox2, $sbox3, $p); - list($p[16], $p[17]) = self::encryptBlockHelperFast($data[0] ^ $p[14], $data[1] ^ $p[15], $sbox0, $sbox1, $sbox2, $sbox3, $p); - // @codingStandardsIgnoreEnd - list($sbox0[0], $sbox0[1]) = self::encryptBlockHelperFast($data[2] ^ $p[16], $data[3] ^ $p[17], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2, $j = 4; $i < 256; $i += 2, $j = ($j + 2) % 16) { - // instead of 16 maybe count($data) would be better? - list($sbox0[$i], $sbox0[$i + 1]) = self::encryptBlockHelperFast($data[$j] ^ $sbox0[$i - 2], $data[$j + 1] ^ $sbox0[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - list($sbox1[0], $sbox1[1]) = self::encryptBlockHelperFast($data[2] ^ $sbox0[254], $data[3] ^ $sbox0[255], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2, $j = 4; $i < 256; $i += 2, $j = ($j + 2) % 16) { - list($sbox1[$i], $sbox1[$i + 1]) = self::encryptBlockHelperFast($data[$j] ^ $sbox1[$i - 2], $data[$j + 1] ^ $sbox1[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - list($sbox2[0], $sbox2[1]) = self::encryptBlockHelperFast($data[2] ^ $sbox1[254], $data[3] ^ $sbox1[255], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2, $j = 4; $i < 256; $i += 2, $j = ($j + 2) % 16) { - list($sbox2[$i], $sbox2[$i + 1]) = self::encryptBlockHelperFast($data[$j] ^ $sbox2[$i - 2], $data[$j + 1] ^ $sbox2[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - list($sbox3[0], $sbox3[1]) = self::encryptBlockHelperFast($data[2] ^ $sbox2[254], $data[3] ^ $sbox2[255], $sbox0, $sbox1, $sbox2, $sbox3, $p); - for ($i = 2, $j = 4; $i < 256; $i += 2, $j = ($j + 2) % 16) { - list($sbox3[$i], $sbox3[$i + 1]) = self::encryptBlockHelperFast($data[$j] ^ $sbox3[$i - 2], $data[$j + 1] ^ $sbox3[$i - 1], $sbox0, $sbox1, $sbox2, $sbox3, $p); - } - } - /** - * Encrypts a block - * - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - $p = $this->bctx['p']; - // extract($this->bctx['sb'], EXTR_PREFIX_ALL, 'sb'); // slower - $sb_0 = $this->bctx['sb'][0]; - $sb_1 = $this->bctx['sb'][1]; - $sb_2 = $this->bctx['sb'][2]; - $sb_3 = $this->bctx['sb'][3]; - $in = \unpack('N*', $in); - $l = $in[1]; - $r = $in[2]; - list($r, $l) = \PHP_INT_SIZE == 4 ? self::encryptBlockHelperSlow($l, $r, $sb_0, $sb_1, $sb_2, $sb_3, $p) : self::encryptBlockHelperFast($l, $r, $sb_0, $sb_1, $sb_2, $sb_3, $p); - return \pack("N*", $r, $l); - } - /** - * Fast helper function for block encryption - * - * @access private - * @param int $x0 - * @param int $x1 - * @param int[] $sbox0 - * @param int[] $sbox1 - * @param int[] $sbox2 - * @param int[] $sbox3 - * @param int[] $p - * @return int[] - */ - private static function encryptBlockHelperFast($x0, $x1, array $sbox0, array $sbox1, array $sbox2, array $sbox3, array $p) - { - $x0 ^= $p[0]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[1]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[2]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[3]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[4]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[5]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[6]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[7]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[8]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[9]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[10]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[11]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[12]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[13]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[14]; - $x1 ^= ($sbox0[($x0 & 0xff000000) >> 24] + $sbox1[($x0 & 0xff0000) >> 16] ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff] ^ $p[15]; - $x0 ^= ($sbox0[($x1 & 0xff000000) >> 24] + $sbox1[($x1 & 0xff0000) >> 16] ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff] ^ $p[16]; - return [$x1 & 0xffffffff ^ $p[17], $x0 & 0xffffffff]; - } - /** - * Slow helper function for block encryption - * - * @access private - * @param int $x0 - * @param int $x1 - * @param int[] $sbox0 - * @param int[] $sbox1 - * @param int[] $sbox2 - * @param int[] $sbox3 - * @param int[] $p - * @return int[] - */ - private static function encryptBlockHelperSlow($x0, $x1, array $sbox0, array $sbox1, array $sbox2, array $sbox3, array $p) - { - // -16777216 == intval(0xFF000000) on 32-bit PHP installs - $x0 ^= $p[0]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[1]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[2]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[3]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[4]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[5]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[6]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[7]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[8]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[9]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[10]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[11]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[12]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[13]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[14]; - $x1 ^= self::safe_intval((self::safe_intval($sbox0[($x0 & -16777216) >> 24 & 0xff] + $sbox1[($x0 & 0xff0000) >> 16]) ^ $sbox2[($x0 & 0xff00) >> 8]) + $sbox3[$x0 & 0xff]) ^ $p[15]; - $x0 ^= self::safe_intval((self::safe_intval($sbox0[($x1 & -16777216) >> 24 & 0xff] + $sbox1[($x1 & 0xff0000) >> 16]) ^ $sbox2[($x1 & 0xff00) >> 8]) + $sbox3[$x1 & 0xff]) ^ $p[16]; - return [$x1 ^ $p[17], $x0]; - } - /** - * Decrypts a block - * - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - $p = $this->bctx['p']; - $sb_0 = $this->bctx['sb'][0]; - $sb_1 = $this->bctx['sb'][1]; - $sb_2 = $this->bctx['sb'][2]; - $sb_3 = $this->bctx['sb'][3]; - $in = \unpack('N*', $in); - $l = $in[1]; - $r = $in[2]; - for ($i = 17; $i > 2; $i -= 2) { - $l ^= $p[$i]; - $r ^= self::safe_intval((self::safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^ $sb_2[$l >> 8 & 0xff]) + $sb_3[$l & 0xff]); - $r ^= $p[$i - 1]; - $l ^= self::safe_intval((self::safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^ $sb_2[$r >> 8 & 0xff]) + $sb_3[$r & 0xff]); - } - return \pack('N*', $r ^ $p[0], $l ^ $p[1]); - } - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - $p = $this->bctx['p']; - $init_crypt = ' - static $sb_0, $sb_1, $sb_2, $sb_3; - if (!$sb_0) { - $sb_0 = $this->bctx["sb"][0]; - $sb_1 = $this->bctx["sb"][1]; - $sb_2 = $this->bctx["sb"][2]; - $sb_3 = $this->bctx["sb"][3]; - } - '; - $safeint = self::safe_intval_inline(); - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - for ($i = 0; $i < 16; $i += 2) { - $encrypt_block .= ' - $l^= ' . $p[$i] . '; - $r^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]') . '; - - $r^= ' . $p[$i + 1] . '; - $l^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]') . '; - '; - } - $encrypt_block .= ' - $in = pack("N*", - $r ^ ' . $p[17] . ', - $l ^ ' . $p[16] . ' - ); - '; - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - for ($i = 17; $i > 2; $i -= 2) { - $decrypt_block .= ' - $l^= ' . $p[$i] . '; - $r^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]') . '; - - $r^= ' . $p[$i - 1] . '; - $l^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]') . '; - '; - } - $decrypt_block .= ' - $in = pack("N*", - $r ^ ' . $p[0] . ', - $l ^ ' . $p[1] . ' - ); - '; - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'init_encrypt' => '', 'init_decrypt' => '', 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php deleted file mode 100644 index ca36a1b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php +++ /dev/null @@ -1,999 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Exception\BadDecryptionException; -use phpseclib3\Exception\InsufficientSetupException; -/** - * Pure-PHP implementation of ChaCha20. - * - * @author Jim Wigginton - */ -class ChaCha20 extends \phpseclib3\Crypt\Salsa20 -{ - /** - * The OpenSSL specific name of the cipher - * - * @var string - */ - protected $cipher_name_openssl = 'chacha20'; - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_LIBSODIUM: - // PHP 7.2.0 (30 Nov 2017) added support for libsodium - // we could probably make it so that if $this->counter == 0 then the first block would be done with either OpenSSL - // or PHP and then subsequent blocks would then be done with libsodium but idk - it's not a high priority atm - // we could also make it so that if $this->counter == 0 and $this->continuousBuffer then do the first string - // with libsodium and subsequent strings with openssl or pure-PHP but again not a high priority - return \function_exists('sodium_crypto_aead_chacha20poly1305_ietf_encrypt') && $this->key_length == 32 && ($this->usePoly1305 && !isset($this->poly1305Key) && $this->counter == 0 || $this->counter == 1) && !$this->continuousBuffer; - case self::ENGINE_OPENSSL: - // OpenSSL 1.1.0 (released 25 Aug 2016) added support for chacha20. - // PHP didn't support OpenSSL 1.1.0 until 7.0.19 (11 May 2017) - // if you attempt to provide openssl with a 128 bit key (as opposed to a 256 bit key) openssl will null - // pad the key to 256 bits and still use the expansion constant for 256-bit keys. the fact that - // openssl treats the IV as both the counter and nonce, however, let's us use openssl in continuous mode - // whereas libsodium does not - if ($this->key_length != 32) { - return \false; - } - } - return parent::isValidEngineHelper($engine); - } - /** - * Encrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @see self::crypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - $this->setup(); - if ($this->engine == self::ENGINE_LIBSODIUM) { - return $this->encrypt_with_libsodium($plaintext); - } - return parent::encrypt($plaintext); - } - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see self::crypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - $this->setup(); - if ($this->engine == self::ENGINE_LIBSODIUM) { - return $this->decrypt_with_libsodium($ciphertext); - } - return parent::decrypt($ciphertext); - } - /** - * Encrypts a message with libsodium - * - * @see self::encrypt() - * @param string $plaintext - * @return string $text - */ - private function encrypt_with_libsodium($plaintext) - { - $params = [$plaintext, $this->aad, $this->nonce, $this->key]; - $ciphertext = \strlen($this->nonce) == 8 ? \sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : \sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); - if (!$this->usePoly1305) { - return \substr($ciphertext, 0, \strlen($plaintext)); - } - $newciphertext = \substr($ciphertext, 0, \strlen($plaintext)); - $this->newtag = $this->usingGeneratedPoly1305Key && \strlen($this->nonce) == 12 ? \substr($ciphertext, \strlen($plaintext)) : $this->poly1305($newciphertext); - return $newciphertext; - } - /** - * Decrypts a message with libsodium - * - * @see self::decrypt() - * @param string $ciphertext - * @return string $text - */ - private function decrypt_with_libsodium($ciphertext) - { - $params = [$ciphertext, $this->aad, $this->nonce, $this->key]; - if (isset($this->poly1305Key)) { - if ($this->oldtag === \false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - if ($this->usingGeneratedPoly1305Key && \strlen($this->nonce) == 12) { - $plaintext = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt(...$params); - $this->oldtag = \false; - if ($plaintext === \false) { - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - return $plaintext; - } - $newtag = $this->poly1305($ciphertext); - if ($this->oldtag != \substr($newtag, 0, \strlen($this->oldtag))) { - $this->oldtag = \false; - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - $this->oldtag = \false; - } - $plaintext = \strlen($this->nonce) == 8 ? \sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : \sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); - return \substr($plaintext, 0, \strlen($ciphertext)); - } - /** - * Sets the nonce. - * - * @param string $nonce - */ - public function setNonce($nonce) - { - if (!\is_string($nonce)) { - throw new \UnexpectedValueException('The nonce should be a string'); - } - /* - from https://tools.ietf.org/html/rfc7539#page-7 - - "Note also that the original ChaCha had a 64-bit nonce and 64-bit - block count. We have modified this here to be more consistent with - recommendations in Section 3.2 of [RFC5116]." - */ - switch (\strlen($nonce)) { - case 8: - // 64 bits - case 12: - // 96 bits - break; - default: - throw new \LengthException('Nonce of size ' . \strlen($nonce) . ' not supported by this algorithm. Only 64-bit nonces or 96-bit nonces are supported'); - } - $this->nonce = $nonce; - $this->changed = \true; - $this->setEngine(); - } - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setNonce() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * @see self::setKey() - * @see self::setNonce() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter]; - $this->changed = $this->nonIVChanged = \false; - if ($this->nonce === \false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - if ($this->key === \false) { - throw new InsufficientSetupException('No key has been defined'); - } - if ($this->usePoly1305 && !isset($this->poly1305Key)) { - $this->usingGeneratedPoly1305Key = \true; - if ($this->engine == self::ENGINE_LIBSODIUM) { - return; - } - $this->createPoly1305Key(); - } - $key = $this->key; - if (\strlen($key) == 16) { - $constant = 'expand 16-byte k'; - $key .= $key; - } else { - $constant = 'expand 32-byte k'; - } - $this->p1 = $constant . $key; - $this->p2 = $this->nonce; - if (\strlen($this->nonce) == 8) { - $this->p2 = "\x00\x00\x00\x00" . $this->p2; - } - } - /** - * The quarterround function - * - * @param int $a - * @param int $b - * @param int $c - * @param int $d - */ - protected static function quarterRound(&$a, &$b, &$c, &$d) - { - // in https://datatracker.ietf.org/doc/html/rfc7539#section-2.1 the addition, - // xor'ing and rotation are all on the same line so i'm keeping it on the same - // line here as well - // @codingStandardsIgnoreStart - $a += $b; - $d = self::leftRotate(\intval($d) ^ \intval($a), 16); - $c += $d; - $b = self::leftRotate(\intval($b) ^ \intval($c), 12); - $a += $b; - $d = self::leftRotate(\intval($d) ^ \intval($a), 8); - $c += $d; - $b = self::leftRotate(\intval($b) ^ \intval($c), 7); - // @codingStandardsIgnoreEnd - } - /** - * The doubleround function - * - * @param int $x0 (by reference) - * @param int $x1 (by reference) - * @param int $x2 (by reference) - * @param int $x3 (by reference) - * @param int $x4 (by reference) - * @param int $x5 (by reference) - * @param int $x6 (by reference) - * @param int $x7 (by reference) - * @param int $x8 (by reference) - * @param int $x9 (by reference) - * @param int $x10 (by reference) - * @param int $x11 (by reference) - * @param int $x12 (by reference) - * @param int $x13 (by reference) - * @param int $x14 (by reference) - * @param int $x15 (by reference) - */ - protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, &$x7, &$x8, &$x9, &$x10, &$x11, &$x12, &$x13, &$x14, &$x15) - { - // columnRound - static::quarterRound($x0, $x4, $x8, $x12); - static::quarterRound($x1, $x5, $x9, $x13); - static::quarterRound($x2, $x6, $x10, $x14); - static::quarterRound($x3, $x7, $x11, $x15); - // rowRound - static::quarterRound($x0, $x5, $x10, $x15); - static::quarterRound($x1, $x6, $x11, $x12); - static::quarterRound($x2, $x7, $x8, $x13); - static::quarterRound($x3, $x4, $x9, $x14); - } - /** - * The Salsa20 hash function function - * - * On my laptop this loop unrolled / function dereferenced version of parent::salsa20 encrypts 1mb of text in - * 0.65s vs the 0.85s that it takes with the parent method. - * - * If we were free to assume that the host OS would always be 64-bits then the if condition in leftRotate could - * be eliminated and we could knock this done to 0.60s. - * - * For comparison purposes, RC4 takes 0.16s and AES in CTR mode with the Eval engine takes 0.48s. - * AES in CTR mode with the PHP engine takes 1.19s. Salsa20 / ChaCha20 do not benefit as much from the Eval - * approach due to the fact that there are a lot less variables to de-reference, fewer loops to unroll, etc - * - * @param string $x - */ - protected static function salsa20($x) - { - list(, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15) = \unpack('V*', $x); - $z0 = $x0; - $z1 = $x1; - $z2 = $x2; - $z3 = $x3; - $z4 = $x4; - $z5 = $x5; - $z6 = $x6; - $z7 = $x7; - $z8 = $x8; - $z9 = $x9; - $z10 = $x10; - $z11 = $x11; - $z12 = $x12; - $z13 = $x13; - $z14 = $x14; - $z15 = $x15; - // @codingStandardsIgnoreStart - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); - // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); - // @codingStandardsIgnoreEnd - $x0 += $z0; - $x1 += $z1; - $x2 += $z2; - $x3 += $z3; - $x4 += $z4; - $x5 += $z5; - $x6 += $z6; - $x7 += $z7; - $x8 += $z8; - $x9 += $z9; - $x10 += $z10; - $x11 += $z11; - $x12 += $z12; - $x13 += $z13; - $x14 += $z14; - $x15 += $z15; - return \pack('V*', $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php deleted file mode 100644 index 35374f7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php +++ /dev/null @@ -1,511 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common; - -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\RSA; -use phpseclib3\Exception\NoKeyLoadedException; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\Math\BigInteger; -/** - * Base Class for all asymmetric cipher classes - * - * @author Jim Wigginton - */ -abstract class AsymmetricKey -{ - /** - * Precomputed Zero - * - * @var \phpseclib3\Math\BigInteger - */ - protected static $zero; - /** - * Precomputed One - * - * @var \phpseclib3\Math\BigInteger - */ - protected static $one; - /** - * Format of the loaded key - * - * @var string - */ - protected $format; - /** - * Hash function - * - * @var \phpseclib3\Crypt\Hash - */ - protected $hash; - /** - * HMAC function - * - * @var \phpseclib3\Crypt\Hash - */ - private $hmac; - /** - * Supported plugins (lower case) - * - * @see self::initialize_static_variables() - * @var array - */ - private static $plugins = []; - /** - * Invisible plugins - * - * @see self::initialize_static_variables() - * @var array - */ - private static $invisiblePlugins = []; - /** - * Available Engines - * - * @var boolean[] - */ - protected static $engines = []; - /** - * Key Comment - * - * @var null|string - */ - private $comment; - /** - * @param string $type - * @return string - */ - public abstract function toString($type, array $options = []); - /** - * The constructor - */ - protected function __construct() - { - self::initialize_static_variables(); - $this->hash = new Hash('sha256'); - $this->hmac = new Hash('sha256'); - } - /** - * Initialize static variables - */ - protected static function initialize_static_variables() - { - if (!isset(self::$zero)) { - self::$zero = new BigInteger(0); - self::$one = new BigInteger(1); - } - self::loadPlugins('Keys'); - if (static::ALGORITHM != 'RSA' && static::ALGORITHM != 'DH') { - self::loadPlugins('Signature'); - } - } - /** - * Load the key - * - * @param string $key - * @param string $password optional - * @return \phpseclib3\Crypt\Common\PublicKey|\phpseclib3\Crypt\Common\PrivateKey - */ - public static function load($key, $password = \false) - { - self::initialize_static_variables(); - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('load() should not be called from final classes (' . static::class . ')'); - } - $components = \false; - foreach (self::$plugins[static::ALGORITHM]['Keys'] as $format) { - if (isset(self::$invisiblePlugins[static::ALGORITHM]) && \in_array($format, self::$invisiblePlugins[static::ALGORITHM])) { - continue; - } - try { - $components = $format::load($key, $password); - } catch (\Exception $e) { - $components = \false; - } - if ($components !== \false) { - break; - } - } - if ($components === \false) { - throw new NoKeyLoadedException('Unable to read key'); - } - $components['format'] = $format; - $components['secret'] = isset($components['secret']) ? $components['secret'] : ''; - $comment = isset($components['comment']) ? $components['comment'] : null; - $new = static::onLoad($components); - $new->format = $format; - $new->comment = $comment; - return $new instanceof \phpseclib3\Crypt\Common\PrivateKey ? $new->withPassword($password) : $new; - } - /** - * Loads a private key - * - * @return PrivateKey - * @param string|array $key - * @param string $password optional - */ - public static function loadPrivateKey($key, $password = '') - { - $key = self::load($key, $password); - if (!$key instanceof \phpseclib3\Crypt\Common\PrivateKey) { - throw new NoKeyLoadedException('The key that was loaded was not a private key'); - } - return $key; - } - /** - * Loads a public key - * - * @return PublicKey - * @param string|array $key - */ - public static function loadPublicKey($key) - { - $key = self::load($key); - if (!$key instanceof \phpseclib3\Crypt\Common\PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a public key'); - } - return $key; - } - /** - * Loads parameters - * - * @return AsymmetricKey - * @param string|array $key - */ - public static function loadParameters($key) - { - $key = self::load($key); - if (!$key instanceof \phpseclib3\Crypt\Common\PrivateKey && !$key instanceof \phpseclib3\Crypt\Common\PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a parameter'); - } - return $key; - } - /** - * Load the key, assuming a specific format - * - * @param string $type - * @param string $key - * @param string $password optional - * @return static - */ - public static function loadFormat($type, $key, $password = \false) - { - self::initialize_static_variables(); - $components = \false; - $format = \strtolower($type); - if (isset(self::$plugins[static::ALGORITHM]['Keys'][$format])) { - $format = self::$plugins[static::ALGORITHM]['Keys'][$format]; - $components = $format::load($key, $password); - } - if ($components === \false) { - throw new NoKeyLoadedException('Unable to read key'); - } - $components['format'] = $format; - $components['secret'] = isset($components['secret']) ? $components['secret'] : ''; - $new = static::onLoad($components); - $new->format = $format; - return $new instanceof \phpseclib3\Crypt\Common\PrivateKey ? $new->withPassword($password) : $new; - } - /** - * Loads a private key - * - * @return PrivateKey - * @param string $type - * @param string $key - * @param string $password optional - */ - public static function loadPrivateKeyFormat($type, $key, $password = \false) - { - $key = self::loadFormat($type, $key, $password); - if (!$key instanceof \phpseclib3\Crypt\Common\PrivateKey) { - throw new NoKeyLoadedException('The key that was loaded was not a private key'); - } - return $key; - } - /** - * Loads a public key - * - * @return PublicKey - * @param string $type - * @param string $key - */ - public static function loadPublicKeyFormat($type, $key) - { - $key = self::loadFormat($type, $key); - if (!$key instanceof \phpseclib3\Crypt\Common\PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a public key'); - } - return $key; - } - /** - * Loads parameters - * - * @return AsymmetricKey - * @param string $type - * @param string|array $key - */ - public static function loadParametersFormat($type, $key) - { - $key = self::loadFormat($type, $key); - if (!$key instanceof \phpseclib3\Crypt\Common\PrivateKey && !$key instanceof \phpseclib3\Crypt\Common\PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a parameter'); - } - return $key; - } - /** - * Validate Plugin - * - * @param string $format - * @param string $type - * @param string $method optional - * @return mixed - */ - protected static function validatePlugin($format, $type, $method = null) - { - $type = \strtolower($type); - if (!isset(self::$plugins[static::ALGORITHM][$format][$type])) { - throw new UnsupportedFormatException("{$type} is not a supported format"); - } - $type = self::$plugins[static::ALGORITHM][$format][$type]; - if (isset($method) && !\method_exists($type, $method)) { - throw new UnsupportedFormatException("{$type} does not implement {$method}"); - } - return $type; - } - /** - * Load Plugins - * - * @param string $format - */ - private static function loadPlugins($format) - { - if (!isset(self::$plugins[static::ALGORITHM][$format])) { - self::$plugins[static::ALGORITHM][$format] = []; - foreach (new \DirectoryIterator(__DIR__ . '/../' . static::ALGORITHM . '/Formats/' . $format . '/') as $file) { - if ($file->getExtension() != 'php') { - continue; - } - $name = $file->getBasename('.php'); - if ($name[0] == '.') { - continue; - } - $type = 'phpseclib3\\Crypt\\' . static::ALGORITHM . '\\Formats\\' . $format . '\\' . $name; - $reflect = new \ReflectionClass($type); - if ($reflect->isTrait()) { - continue; - } - self::$plugins[static::ALGORITHM][$format][\strtolower($name)] = $type; - if ($reflect->hasConstant('IS_INVISIBLE')) { - self::$invisiblePlugins[static::ALGORITHM][] = $type; - } - } - } - } - /** - * Returns a list of supported formats. - * - * @return array - */ - public static function getSupportedKeyFormats() - { - self::initialize_static_variables(); - return self::$plugins[static::ALGORITHM]['Keys']; - } - /** - * Add a fileformat plugin - * - * The plugin needs to either already be loaded or be auto-loadable. - * Loading a plugin whose shortname overwrite an existing shortname will overwrite the old plugin. - * - * @see self::load() - * @param string $fullname - * @return bool - */ - public static function addFileFormat($fullname) - { - self::initialize_static_variables(); - if (\class_exists($fullname)) { - $meta = new \ReflectionClass($fullname); - $shortname = $meta->getShortName(); - self::$plugins[static::ALGORITHM]['Keys'][\strtolower($shortname)] = $fullname; - if ($meta->hasConstant('IS_INVISIBLE')) { - self::$invisiblePlugins[static::ALGORITHM] = \strtolower($name); - } - } - } - /** - * Returns the format of the loaded key. - * - * If the key that was loaded wasn't in a valid or if the key was auto-generated - * with RSA::createKey() then this will throw an exception. - * - * @see self::load() - * @return mixed - */ - public function getLoadedFormat() - { - if (empty($this->format)) { - throw new NoKeyLoadedException('This key was created with createKey - it was not loaded with load. Therefore there is no "loaded format"'); - } - $meta = new \ReflectionClass($this->format); - return $meta->getShortName(); - } - /** - * Returns the key's comment - * - * Not all key formats support comments. If you want to set a comment use toString() - * - * @return null|string - */ - public function getComment() - { - return $this->comment; - } - /** - * Tests engine validity - * - */ - public static function useBestEngine() - { - static::$engines = [ - 'PHP' => \true, - 'OpenSSL' => \extension_loaded('openssl'), - // this test can be satisfied by either of the following: - // http://php.net/manual/en/book.sodium.php - // https://github.com/paragonie/sodium_compat - 'libsodium' => \function_exists('sodium_crypto_sign_keypair'), - ]; - return static::$engines; - } - /** - * Flag to use internal engine only (useful for unit testing) - * - */ - public static function useInternalEngine() - { - static::$engines = ['PHP' => \true, 'OpenSSL' => \false, 'libsodium' => \false]; - } - /** - * __toString() magic method - * - * @return string - */ - public function __toString() - { - return $this->toString('PKCS8'); - } - /** - * Determines which hashing function should be used - * - * @param string $hash - */ - public function withHash($hash) - { - $new = clone $this; - $new->hash = new Hash($hash); - $new->hmac = new Hash($hash); - return $new; - } - /** - * Returns the hash algorithm currently being used - * - */ - public function getHash() - { - return clone $this->hash; - } - /** - * Compute the pseudorandom k for signature generation, - * using the process specified for deterministic DSA. - * - * @param string $h1 - * @return string - */ - protected function computek($h1) - { - $v = \str_repeat("\x01", \strlen($h1)); - $k = \str_repeat("\x00", \strlen($h1)); - $x = $this->int2octets($this->x); - $h1 = $this->bits2octets($h1); - $this->hmac->setKey($k); - $k = $this->hmac->hash($v . "\x00" . $x . $h1); - $this->hmac->setKey($k); - $v = $this->hmac->hash($v); - $k = $this->hmac->hash($v . "\x01" . $x . $h1); - $this->hmac->setKey($k); - $v = $this->hmac->hash($v); - $qlen = $this->q->getLengthInBytes(); - while (\true) { - $t = ''; - while (\strlen($t) < $qlen) { - $v = $this->hmac->hash($v); - $t = $t . $v; - } - $k = $this->bits2int($t); - if (!$k->equals(self::$zero) && $k->compare($this->q) < 0) { - break; - } - $k = $this->hmac->hash($v . "\x00"); - $this->hmac->setKey($k); - $v = $this->hmac->hash($v); - } - return $k; - } - /** - * Integer to Octet String - * - * @param \phpseclib3\Math\BigInteger $v - * @return string - */ - private function int2octets($v) - { - $out = $v->toBytes(); - $rolen = $this->q->getLengthInBytes(); - if (\strlen($out) < $rolen) { - return \str_pad($out, $rolen, "\x00", \STR_PAD_LEFT); - } elseif (\strlen($out) > $rolen) { - return \substr($out, -$rolen); - } else { - return $out; - } - } - /** - * Bit String to Integer - * - * @param string $in - * @return \phpseclib3\Math\BigInteger - */ - protected function bits2int($in) - { - $v = new BigInteger($in, 256); - $vlen = \strlen($in) << 3; - $qlen = $this->q->getLength(); - if ($vlen > $qlen) { - return $v->bitwise_rightShift($vlen - $qlen); - } - return $v; - } - /** - * Bit String to Octet String - * - * @param string $in - * @return string - */ - private function bits2octets($in) - { - $z1 = $this->bits2int($in); - $z2 = $z1->subtract($this->q); - return $z2->compare(self::$zero) < 0 ? $this->int2octets($z1) : $this->int2octets($z2); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php deleted file mode 100644 index 803e392..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common; - -/** - * Base Class for all block cipher classes - * - * @author Jim Wigginton - */ -abstract class BlockCipher extends \phpseclib3\Crypt\Common\SymmetricKey -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php deleted file mode 100644 index 6c8b209..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -/** - * JSON Web Key Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class JWK -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - $key = \preg_replace('#\\s#', '', $key); - // remove whitespace - if (\PHP_VERSION_ID >= 73000) { - $key = \json_decode($key, null, 512, \JSON_THROW_ON_ERROR); - } else { - $key = \json_decode($key); - if (!$key) { - throw new \RuntimeException('Unable to decode JSON'); - } - } - if (isset($key->kty)) { - return $key; - } - if (\count($key->keys) != 1) { - throw new \RuntimeException('Although the JWK key format supports multiple keys phpseclib does not'); - } - return $key->keys[0]; - } - /** - * Wrap a key appropriately - * - * @return string - */ - protected static function wrapKey(array $key, array $options) - { - return \json_encode(['keys' => [$key + $options]]); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php deleted file mode 100644 index 7cfb056..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,195 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\AES; -use phpseclib3\Crypt\Random; -/** - * OpenSSH Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH -{ - /** - * Default comment - * - * @var string - */ - protected static $comment = 'phpseclib-generated-key'; - /** - * Binary key flag - * - * @var bool - */ - protected static $binary = \false; - /** - * Sets the default comment - * - * @param string $comment - */ - public static function setComment($comment) - { - self::$comment = \str_replace(["\r", "\n"], '', $comment); - } - /** - * Break a public or private key down into its constituent components - * - * $type can be either ssh-dss or ssh-rsa - * - * @param string $key - * @param string $password - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - // key format is described here: - // https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.key?annotate=HEAD - if (\strpos($key, 'BEGIN OPENSSH PRIVATE KEY') !== \false) { - $key = \preg_replace('#(?:^-.*?-[\\r\\n]*$)|\\s#ms', '', $key); - $key = Strings::base64_decode($key); - $magic = Strings::shift($key, 15); - if ($magic != "openssh-key-v1\x00") { - throw new \RuntimeException('Expected openssh-key-v1'); - } - list($ciphername, $kdfname, $kdfoptions, $numKeys) = Strings::unpackSSH2('sssN', $key); - if ($numKeys != 1) { - // if we wanted to support multiple keys we could update PublicKeyLoader to preview what the # of keys - // would be; it'd then call Common\Keys\OpenSSH.php::load() and get the paddedKey. it'd then pass - // that to the appropriate key loading parser $numKey times or something - throw new \RuntimeException('Although the OpenSSH private key format supports multiple keys phpseclib does not'); - } - switch ($ciphername) { - case 'none': - break; - case 'aes256-ctr': - if ($kdfname != 'bcrypt') { - throw new \RuntimeException('Only the bcrypt kdf is supported (' . $kdfname . ' encountered)'); - } - list($salt, $rounds) = Strings::unpackSSH2('sN', $kdfoptions); - $crypto = new AES('ctr'); - //$crypto->setKeyLength(256); - //$crypto->disablePadding(); - $crypto->setPassword($password, 'bcrypt', $salt, $rounds, 32); - break; - default: - throw new \RuntimeException('The only supported cipherse are: none, aes256-ctr (' . $ciphername . ' is being used)'); - } - list($publicKey, $paddedKey) = Strings::unpackSSH2('ss', $key); - list($type) = Strings::unpackSSH2('s', $publicKey); - if (isset($crypto)) { - $paddedKey = $crypto->decrypt($paddedKey); - } - list($checkint1, $checkint2) = Strings::unpackSSH2('NN', $paddedKey); - // any leftover bytes in $paddedKey are for padding? but they should be sequential bytes. eg. 1, 2, 3, etc. - if ($checkint1 != $checkint2) { - throw new \RuntimeException('The two checkints do not match'); - } - self::checkType($type); - return \compact('type', 'publicKey', 'paddedKey'); - } - $parts = \explode(' ', $key, 3); - if (!isset($parts[1])) { - $key = \base64_decode($parts[0]); - $comment = \false; - } else { - $asciiType = $parts[0]; - self::checkType($parts[0]); - $key = \base64_decode($parts[1]); - $comment = isset($parts[2]) ? $parts[2] : \false; - } - if ($key === \false) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - list($type) = Strings::unpackSSH2('s', $key); - self::checkType($type); - if (isset($asciiType) && $asciiType != $type) { - throw new \RuntimeException('Two different types of keys are claimed: ' . $asciiType . ' and ' . $type); - } - if (\strlen($key) <= 4) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $publicKey = $key; - return \compact('type', 'publicKey', 'comment'); - } - /** - * Toggle between binary and printable keys - * - * Printable keys are what are generated by default. These are the ones that go in - * $HOME/.ssh/authorized_key. - * - * @param bool $enabled - */ - public static function setBinaryOutput($enabled) - { - self::$binary = $enabled; - } - /** - * Checks to see if the type is valid - * - * @param string $candidate - */ - private static function checkType($candidate) - { - if (!\in_array($candidate, static::$types)) { - throw new \RuntimeException("The key type ({$candidate}) is not equal to: " . \implode(',', static::$types)); - } - } - /** - * Wrap a private key appropriately - * - * @param string $publicKey - * @param string $privateKey - * @param string $password - * @param array $options - * @return string - */ - protected static function wrapPrivateKey($publicKey, $privateKey, $password, $options) - { - list(, $checkint) = \unpack('N', Random::string(4)); - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $paddedKey = Strings::packSSH2('NN', $checkint, $checkint) . $privateKey . Strings::packSSH2('s', $comment); - $usesEncryption = !empty($password) && \is_string($password); - /* - from http://tools.ietf.org/html/rfc4253#section-6 : - - Note that the length of the concatenation of 'packet_length', - 'padding_length', 'payload', and 'random padding' MUST be a multiple - of the cipher block size or 8, whichever is larger. - */ - $blockSize = $usesEncryption ? 16 : 8; - $paddingLength = ($blockSize - 1) * \strlen($paddedKey) % $blockSize; - for ($i = 1; $i <= $paddingLength; $i++) { - $paddedKey .= \chr($i); - } - if (!$usesEncryption) { - $key = Strings::packSSH2('sssNss', 'none', 'none', '', 1, $publicKey, $paddedKey); - } else { - $rounds = isset($options['rounds']) ? $options['rounds'] : 16; - $salt = Random::string(16); - $kdfoptions = Strings::packSSH2('sN', $salt, $rounds); - $crypto = new AES('ctr'); - $crypto->setPassword($password, 'bcrypt', $salt, $rounds, 32); - $paddedKey = $crypto->encrypt($paddedKey); - $key = Strings::packSSH2('sssNss', 'aes256-ctr', 'bcrypt', $kdfoptions, 1, $publicKey, $paddedKey); - } - $key = "openssh-key-v1\x00{$key}"; - return "-----BEGIN OPENSSH PRIVATE KEY-----\n" . \chunk_split(Strings::base64_encode($key), 70, "\n") . "-----END OPENSSH PRIVATE KEY-----\n"; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php deleted file mode 100644 index 4fd98d1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Keys; - -/** - * PKCS1 Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS -{ - /** - * Auto-detect the format - */ - const MODE_ANY = 0; - /** - * Require base64-encoded PEM's be supplied - */ - const MODE_PEM = 1; - /** - * Require raw DER's be supplied - */ - const MODE_DER = 2; - /**#@-*/ - /** - * Is the key a base-64 encoded PEM, DER or should it be auto-detected? - * - * @var int - */ - protected static $format = self::MODE_ANY; - /** - * Require base64-encoded PEM's be supplied - * - */ - public static function requirePEM() - { - self::$format = self::MODE_PEM; - } - /** - * Require raw DER's be supplied - * - */ - public static function requireDER() - { - self::$format = self::MODE_DER; - } - /** - * Accept any format and auto detect the format - * - * This is the default setting - * - */ - public static function requireAny() - { - self::$format = self::MODE_ANY; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php deleted file mode 100644 index 3f5e8be..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,187 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\AES; -use phpseclib3\Crypt\DES; -use phpseclib3\Crypt\Random; -use phpseclib3\Crypt\TripleDES; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\File\ASN1; -/** - * PKCS1 Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends \phpseclib3\Crypt\Common\Formats\Keys\PKCS -{ - /** - * Default encryption algorithm - * - * @var string - */ - private static $defaultEncryptionAlgorithm = 'AES-128-CBC'; - /** - * Sets the default encryption algorithm - * - * @param string $algo - */ - public static function setEncryptionAlgorithm($algo) - { - self::$defaultEncryptionAlgorithm = $algo; - } - /** - * Returns the mode constant corresponding to the mode string - * - * @param string $mode - * @return int - * @throws \UnexpectedValueException if the block cipher mode is unsupported - */ - private static function getEncryptionMode($mode) - { - switch ($mode) { - case 'CBC': - case 'ECB': - case 'CFB': - case 'OFB': - case 'CTR': - return $mode; - } - throw new \UnexpectedValueException('Unsupported block cipher mode of operation'); - } - /** - * Returns a cipher object corresponding to a string - * - * @param string $algo - * @return string - * @throws \UnexpectedValueException if the encryption algorithm is unsupported - */ - private static function getEncryptionObject($algo) - { - $modes = '(CBC|ECB|CFB|OFB|CTR)'; - switch (\true) { - case \preg_match("#^AES-(128|192|256)-{$modes}\$#", $algo, $matches): - $cipher = new AES(self::getEncryptionMode($matches[2])); - $cipher->setKeyLength($matches[1]); - return $cipher; - case \preg_match("#^DES-EDE3-{$modes}\$#", $algo, $matches): - return new TripleDES(self::getEncryptionMode($matches[1])); - case \preg_match("#^DES-{$modes}\$#", $algo, $matches): - return new DES(self::getEncryptionMode($matches[1])); - default: - throw new UnsupportedAlgorithmException($algo . ' is not a supported algorithm'); - } - } - /** - * Generate a symmetric key for PKCS#1 keys - * - * @param string $password - * @param string $iv - * @param int $length - * @return string - */ - private static function generateSymmetricKey($password, $iv, $length) - { - $symkey = ''; - $iv = \substr($iv, 0, 8); - while (\strlen($symkey) < $length) { - $symkey .= \md5($symkey . $password . $iv, \true); - } - return \substr($symkey, 0, $length); - } - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - protected static function load($key, $password) - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is - "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to - protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding - two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: - - http://tools.ietf.org/html/rfc1421#section-4.6.1.1 - http://tools.ietf.org/html/rfc1421#section-4.6.1.3 - - DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. - DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation - function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's - own implementation. ie. the implementation *is* the standard and any bugs that may exist in that - implementation are part of the standard, as well. - - * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ - if (\preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { - $iv = Strings::hex2bin(\trim($matches[2])); - // remove the Proc-Type / DEK-Info sections as they're no longer needed - $key = \preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); - $ciphertext = ASN1::extractBER($key); - if ($ciphertext === \false) { - $ciphertext = $key; - } - $crypto = self::getEncryptionObject($matches[1]); - $crypto->setKey(self::generateSymmetricKey($password, $iv, $crypto->getKeyLength() >> 3)); - $crypto->setIV($iv); - $key = $crypto->decrypt($ciphertext); - } else { - if (self::$format != self::MODE_DER) { - $decoded = ASN1::extractBER($key); - if ($decoded !== \false) { - $key = $decoded; - } elseif (self::$format == self::MODE_PEM) { - throw new \UnexpectedValueException('Expected base64-encoded PEM format but was unable to decode base64 text'); - } - } - } - return $key; - } - /** - * Wrap a private key appropriately - * - * @param string $key - * @param string $type - * @param string $password - * @param array $options optional - * @return string - */ - protected static function wrapPrivateKey($key, $type, $password, array $options = []) - { - if (empty($password) || !\is_string($password)) { - return "-----BEGIN {$type} PRIVATE KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END {$type} PRIVATE KEY-----"; - } - $encryptionAlgorithm = isset($options['encryptionAlgorithm']) ? $options['encryptionAlgorithm'] : self::$defaultEncryptionAlgorithm; - $cipher = self::getEncryptionObject($encryptionAlgorithm); - $iv = Random::string($cipher->getBlockLength() >> 3); - $cipher->setKey(self::generateSymmetricKey($password, $iv, $cipher->getKeyLength() >> 3)); - $cipher->setIV($iv); - $iv = \strtoupper(Strings::bin2hex($iv)); - return "-----BEGIN {$type} PRIVATE KEY-----\r\n" . "Proc-Type: 4,ENCRYPTED\r\n" . "DEK-Info: " . $encryptionAlgorithm . ",{$iv}\r\n" . "\r\n" . \chunk_split(Strings::base64_encode($cipher->encrypt($key)), 64) . "-----END {$type} PRIVATE KEY-----"; - } - /** - * Wrap a public key appropriately - * - * @param string $key - * @param string $type - * @return string - */ - protected static function wrapPublicKey($key, $type) - { - return "-----BEGIN {$type} PUBLIC KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END {$type} PUBLIC KEY-----"; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php deleted file mode 100644 index 66a70a2..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,598 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\AES; -use phpseclib3\Crypt\DES; -use phpseclib3\Crypt\Random; -use phpseclib3\Crypt\RC2; -use phpseclib3\Crypt\RC4; -use phpseclib3\Crypt\TripleDES; -use phpseclib3\Exception\InsufficientSetupException; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -/** - * PKCS#8 Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends \phpseclib3\Crypt\Common\Formats\Keys\PKCS -{ - /** - * Default encryption algorithm - * - * @var string - */ - private static $defaultEncryptionAlgorithm = 'id-PBES2'; - /** - * Default encryption scheme - * - * Only used when defaultEncryptionAlgorithm is id-PBES2 - * - * @var string - */ - private static $defaultEncryptionScheme = 'aes128-CBC-PAD'; - /** - * Default PRF - * - * Only used when defaultEncryptionAlgorithm is id-PBES2 - * - * @var string - */ - private static $defaultPRF = 'id-hmacWithSHA256'; - /** - * Default Iteration Count - * - * @var int - */ - private static $defaultIterationCount = 2048; - /** - * OIDs loaded - * - * @var bool - */ - private static $oidsLoaded = \false; - /** - * Sets the default encryption algorithm - * - * @param string $algo - */ - public static function setEncryptionAlgorithm($algo) - { - self::$defaultEncryptionAlgorithm = $algo; - } - /** - * Sets the default encryption algorithm for PBES2 - * - * @param string $algo - */ - public static function setEncryptionScheme($algo) - { - self::$defaultEncryptionScheme = $algo; - } - /** - * Sets the iteration count - * - * @param int $count - */ - public static function setIterationCount($count) - { - self::$defaultIterationCount = $count; - } - /** - * Sets the PRF for PBES2 - * - * @param string $algo - */ - public static function setPRF($algo) - { - self::$defaultPRF = $algo; - } - /** - * Returns a SymmetricKey object based on a PBES1 $algo - * - * @return \phpseclib3\Crypt\Common\SymmetricKey - * @param string $algo - */ - private static function getPBES1EncryptionObject($algo) - { - $algo = \preg_match('#^pbeWith(?:MD2|MD5|SHA1|SHA)And(.*?)-CBC$#', $algo, $matches) ? $matches[1] : \substr($algo, 13); - // strlen('pbeWithSHAAnd') == 13 - switch ($algo) { - case 'DES': - $cipher = new DES('cbc'); - break; - case 'RC2': - $cipher = new RC2('cbc'); - break; - case '3-KeyTripleDES': - $cipher = new TripleDES('cbc'); - break; - case '2-KeyTripleDES': - $cipher = new TripleDES('cbc'); - $cipher->setKeyLength(128); - break; - case '128BitRC2': - $cipher = new RC2('cbc'); - $cipher->setKeyLength(128); - break; - case '40BitRC2': - $cipher = new RC2('cbc'); - $cipher->setKeyLength(40); - break; - case '128BitRC4': - $cipher = new RC4(); - $cipher->setKeyLength(128); - break; - case '40BitRC4': - $cipher = new RC4(); - $cipher->setKeyLength(40); - break; - default: - throw new UnsupportedAlgorithmException("{$algo} is not a supported algorithm"); - } - return $cipher; - } - /** - * Returns a hash based on a PBES1 $algo - * - * @return string - * @param string $algo - */ - private static function getPBES1Hash($algo) - { - if (\preg_match('#^pbeWith(MD2|MD5|SHA1|SHA)And.*?-CBC$#', $algo, $matches)) { - return $matches[1] == 'SHA' ? 'sha1' : $matches[1]; - } - return 'sha1'; - } - /** - * Returns a KDF baesd on a PBES1 $algo - * - * @return string - * @param string $algo - */ - private static function getPBES1KDF($algo) - { - switch ($algo) { - case 'pbeWithMD2AndDES-CBC': - case 'pbeWithMD2AndRC2-CBC': - case 'pbeWithMD5AndDES-CBC': - case 'pbeWithMD5AndRC2-CBC': - case 'pbeWithSHA1AndDES-CBC': - case 'pbeWithSHA1AndRC2-CBC': - return 'pbkdf1'; - } - return 'pkcs12'; - } - /** - * Returns a SymmetricKey object baesd on a PBES2 $algo - * - * @return SymmetricKey - * @param string $algo - */ - private static function getPBES2EncryptionObject($algo) - { - switch ($algo) { - case 'desCBC': - $cipher = new TripleDES('cbc'); - break; - case 'des-EDE3-CBC': - $cipher = new TripleDES('cbc'); - break; - case 'rc2CBC': - $cipher = new RC2('cbc'); - // in theory this can be changed - $cipher->setKeyLength(128); - break; - case 'rc5-CBC-PAD': - throw new UnsupportedAlgorithmException('rc5-CBC-PAD is not supported for PBES2 PKCS#8 keys'); - case 'aes128-CBC-PAD': - case 'aes192-CBC-PAD': - case 'aes256-CBC-PAD': - $cipher = new AES('cbc'); - $cipher->setKeyLength(\substr($algo, 3, 3)); - break; - default: - throw new UnsupportedAlgorithmException("{$algo} is not supported"); - } - return $cipher; - } - /** - * Initialize static variables - * - */ - private static function initialize_static_variables() - { - if (!isset(static::$childOIDsLoaded)) { - throw new InsufficientSetupException('This class should not be called directly'); - } - if (!static::$childOIDsLoaded) { - ASN1::loadOIDs(\is_array(static::OID_NAME) ? \array_combine(static::OID_NAME, static::OID_VALUE) : [static::OID_NAME => static::OID_VALUE]); - static::$childOIDsLoaded = \true; - } - if (!self::$oidsLoaded) { - // from https://tools.ietf.org/html/rfc2898 - ASN1::loadOIDs([ - // PBES1 encryption schemes - 'pbeWithMD2AndDES-CBC' => '1.2.840.113549.1.5.1', - 'pbeWithMD2AndRC2-CBC' => '1.2.840.113549.1.5.4', - 'pbeWithMD5AndDES-CBC' => '1.2.840.113549.1.5.3', - 'pbeWithMD5AndRC2-CBC' => '1.2.840.113549.1.5.6', - 'pbeWithSHA1AndDES-CBC' => '1.2.840.113549.1.5.10', - 'pbeWithSHA1AndRC2-CBC' => '1.2.840.113549.1.5.11', - // from PKCS#12: - // https://tools.ietf.org/html/rfc7292 - 'pbeWithSHAAnd128BitRC4' => '1.2.840.113549.1.12.1.1', - 'pbeWithSHAAnd40BitRC4' => '1.2.840.113549.1.12.1.2', - 'pbeWithSHAAnd3-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.3', - 'pbeWithSHAAnd2-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.4', - 'pbeWithSHAAnd128BitRC2-CBC' => '1.2.840.113549.1.12.1.5', - 'pbeWithSHAAnd40BitRC2-CBC' => '1.2.840.113549.1.12.1.6', - 'id-PBKDF2' => '1.2.840.113549.1.5.12', - 'id-PBES2' => '1.2.840.113549.1.5.13', - 'id-PBMAC1' => '1.2.840.113549.1.5.14', - // from PKCS#5 v2.1: - // http://www.rsa.com/rsalabs/pkcs/files/h11302-wp-pkcs5v2-1-password-based-cryptography-standard.pdf - 'id-hmacWithSHA1' => '1.2.840.113549.2.7', - 'id-hmacWithSHA224' => '1.2.840.113549.2.8', - 'id-hmacWithSHA256' => '1.2.840.113549.2.9', - 'id-hmacWithSHA384' => '1.2.840.113549.2.10', - 'id-hmacWithSHA512' => '1.2.840.113549.2.11', - 'id-hmacWithSHA512-224' => '1.2.840.113549.2.12', - 'id-hmacWithSHA512-256' => '1.2.840.113549.2.13', - 'desCBC' => '1.3.14.3.2.7', - 'des-EDE3-CBC' => '1.2.840.113549.3.7', - 'rc2CBC' => '1.2.840.113549.3.2', - 'rc5-CBC-PAD' => '1.2.840.113549.3.9', - 'aes128-CBC-PAD' => '2.16.840.1.101.3.4.1.2', - 'aes192-CBC-PAD' => '2.16.840.1.101.3.4.1.22', - 'aes256-CBC-PAD' => '2.16.840.1.101.3.4.1.42', - ]); - self::$oidsLoaded = \true; - } - } - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - protected static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - $isPublic = \strpos($key, 'PUBLIC') !== \false; - $isPrivate = \strpos($key, 'PRIVATE') !== \false; - $decoded = self::preParse($key); - $meta = []; - $decrypted = ASN1::asn1map($decoded[0], Maps\EncryptedPrivateKeyInfo::MAP); - if (\strlen($password) && \is_array($decrypted)) { - $algorithm = $decrypted['encryptionAlgorithm']['algorithm']; - switch ($algorithm) { - // PBES1 - case 'pbeWithMD2AndDES-CBC': - case 'pbeWithMD2AndRC2-CBC': - case 'pbeWithMD5AndDES-CBC': - case 'pbeWithMD5AndRC2-CBC': - case 'pbeWithSHA1AndDES-CBC': - case 'pbeWithSHA1AndRC2-CBC': - case 'pbeWithSHAAnd3-KeyTripleDES-CBC': - case 'pbeWithSHAAnd2-KeyTripleDES-CBC': - case 'pbeWithSHAAnd128BitRC2-CBC': - case 'pbeWithSHAAnd40BitRC2-CBC': - case 'pbeWithSHAAnd128BitRC4': - case 'pbeWithSHAAnd40BitRC4': - $cipher = self::getPBES1EncryptionObject($algorithm); - $hash = self::getPBES1Hash($algorithm); - $kdf = self::getPBES1KDF($algorithm); - $meta['meta']['algorithm'] = $algorithm; - $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - \extract(ASN1::asn1map($temp[0], Maps\PBEParameter::MAP)); - $iterationCount = (int) $iterationCount->toString(); - $cipher->setPassword($password, $kdf, $hash, $salt, $iterationCount); - $key = $cipher->decrypt($decrypted['encryptedData']); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER 2'); - } - break; - case 'id-PBES2': - $meta['meta']['algorithm'] = $algorithm; - $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $temp = ASN1::asn1map($temp[0], Maps\PBES2params::MAP); - \extract($temp); - $cipher = self::getPBES2EncryptionObject($encryptionScheme['algorithm']); - $meta['meta']['cipher'] = $encryptionScheme['algorithm']; - $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $temp = ASN1::asn1map($temp[0], Maps\PBES2params::MAP); - \extract($temp); - if (!$cipher instanceof RC2) { - $cipher->setIV($encryptionScheme['parameters']['octetString']); - } else { - $temp = ASN1::decodeBER($encryptionScheme['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - \extract(ASN1::asn1map($temp[0], Maps\RC2CBCParameter::MAP)); - $effectiveKeyLength = (int) $rc2ParametersVersion->toString(); - switch ($effectiveKeyLength) { - case 160: - $effectiveKeyLength = 40; - break; - case 120: - $effectiveKeyLength = 64; - break; - case 58: - $effectiveKeyLength = 128; - break; - } - $cipher->setIV($iv); - $cipher->setKeyLength($effectiveKeyLength); - } - $meta['meta']['keyDerivationFunc'] = $keyDerivationFunc['algorithm']; - switch ($keyDerivationFunc['algorithm']) { - case 'id-PBKDF2': - $temp = ASN1::decodeBER($keyDerivationFunc['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $prf = ['algorithm' => 'id-hmacWithSHA1']; - $params = ASN1::asn1map($temp[0], Maps\PBKDF2params::MAP); - \extract($params); - $meta['meta']['prf'] = $prf['algorithm']; - $hash = \str_replace('-', '/', \substr($prf['algorithm'], 11)); - $params = [$password, 'pbkdf2', $hash, $salt, (int) $iterationCount->toString()]; - if (isset($keyLength)) { - $params[] = (int) $keyLength->toString(); - } - $cipher->setPassword(...$params); - $key = $cipher->decrypt($decrypted['encryptedData']); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER 3'); - } - break; - default: - throw new UnsupportedAlgorithmException('Only PBKDF2 is supported for PBES2 PKCS#8 keys'); - } - break; - case 'id-PBMAC1': - //$temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - //$value = ASN1::asn1map($temp[0], Maps\PBMAC1params::MAP); - // since i can't find any implementation that does PBMAC1 it is unsupported - throw new UnsupportedAlgorithmException('Only PBES1 and PBES2 PKCS#8 keys are supported.'); - } - } - $private = ASN1::asn1map($decoded[0], Maps\OneAsymmetricKey::MAP); - if (\is_array($private)) { - if ($isPublic) { - throw new \UnexpectedValueException('Human readable string claims public key but DER encoded string claims private key'); - } - if (isset($private['privateKeyAlgorithm']['parameters']) && !$private['privateKeyAlgorithm']['parameters'] instanceof ASN1\Element && isset($decoded[0]['content'][1]['content'][1])) { - $temp = $decoded[0]['content'][1]['content'][1]; - $private['privateKeyAlgorithm']['parameters'] = new ASN1\Element(\substr($key, $temp['start'], $temp['length'])); - } - if (\is_array(static::OID_NAME)) { - if (!\in_array($private['privateKeyAlgorithm']['algorithm'], static::OID_NAME)) { - throw new UnsupportedAlgorithmException($private['privateKeyAlgorithm']['algorithm'] . ' is not a supported key type'); - } - } else { - if ($private['privateKeyAlgorithm']['algorithm'] != static::OID_NAME) { - throw new UnsupportedAlgorithmException('Only ' . static::OID_NAME . ' keys are supported; this is a ' . $private['privateKeyAlgorithm']['algorithm'] . ' key'); - } - } - if (isset($private['publicKey'])) { - if ($private['publicKey'][0] != "\x00") { - throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . \bin2hex($private['publicKey'][0])); - } - $private['publicKey'] = \substr($private['publicKey'], 1); - } - return $private + $meta; - } - // EncryptedPrivateKeyInfo and PublicKeyInfo have largely identical "signatures". the only difference - // is that the former has an octet string and the later has a bit string. the first byte of a bit - // string represents the number of bits in the last byte that are to be ignored but, currently, - // bit strings wanting a non-zero amount of bits trimmed are not supported - $public = ASN1::asn1map($decoded[0], Maps\PublicKeyInfo::MAP); - if (\is_array($public)) { - if ($isPrivate) { - throw new \UnexpectedValueException('Human readable string claims private key but DER encoded string claims public key'); - } - if ($public['publicKey'][0] != "\x00") { - throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . \bin2hex($public['publicKey'][0])); - } - if (\is_array(static::OID_NAME)) { - if (!\in_array($public['publicKeyAlgorithm']['algorithm'], static::OID_NAME)) { - throw new UnsupportedAlgorithmException($public['publicKeyAlgorithm']['algorithm'] . ' is not a supported key type'); - } - } else { - if ($public['publicKeyAlgorithm']['algorithm'] != static::OID_NAME) { - throw new UnsupportedAlgorithmException('Only ' . static::OID_NAME . ' keys are supported; this is a ' . $public['publicKeyAlgorithm']['algorithm'] . ' key'); - } - } - if (isset($public['publicKeyAlgorithm']['parameters']) && !$public['publicKeyAlgorithm']['parameters'] instanceof ASN1\Element && isset($decoded[0]['content'][0]['content'][1])) { - $temp = $decoded[0]['content'][0]['content'][1]; - $public['publicKeyAlgorithm']['parameters'] = new ASN1\Element(\substr($key, $temp['start'], $temp['length'])); - } - $public['publicKey'] = \substr($public['publicKey'], 1); - return $public; - } - throw new \RuntimeException('Unable to parse using either OneAsymmetricKey or PublicKeyInfo ASN1 maps'); - } - /** - * Wrap a private key appropriately - * - * @param string $key - * @param string $attr - * @param mixed $params - * @param string $password - * @param string $oid optional - * @param string $publicKey optional - * @param array $options optional - * @return string - */ - protected static function wrapPrivateKey($key, $attr, $params, $password, $oid = null, $publicKey = '', array $options = []) - { - self::initialize_static_variables(); - $key = ['version' => 'v1', 'privateKeyAlgorithm' => ['algorithm' => \is_string(static::OID_NAME) ? static::OID_NAME : $oid], 'privateKey' => $key]; - if ($oid != 'id-Ed25519' && $oid != 'id-Ed448') { - $key['privateKeyAlgorithm']['parameters'] = $params; - } - if (!empty($attr)) { - $key['attributes'] = $attr; - } - if (!empty($publicKey)) { - $key['version'] = 'v2'; - $key['publicKey'] = $publicKey; - } - $key = ASN1::encodeDER($key, Maps\OneAsymmetricKey::MAP); - if (!empty($password) && \is_string($password)) { - $salt = Random::string(8); - $iterationCount = isset($options['iterationCount']) ? $options['iterationCount'] : self::$defaultIterationCount; - $encryptionAlgorithm = isset($options['encryptionAlgorithm']) ? $options['encryptionAlgorithm'] : self::$defaultEncryptionAlgorithm; - $encryptionScheme = isset($options['encryptionScheme']) ? $options['encryptionScheme'] : self::$defaultEncryptionScheme; - $prf = isset($options['PRF']) ? $options['PRF'] : self::$defaultPRF; - if ($encryptionAlgorithm == 'id-PBES2') { - $crypto = self::getPBES2EncryptionObject($encryptionScheme); - $hash = \str_replace('-', '/', \substr($prf, 11)); - $kdf = 'pbkdf2'; - $iv = Random::string($crypto->getBlockLength() >> 3); - $PBKDF2params = ['salt' => $salt, 'iterationCount' => $iterationCount, 'prf' => ['algorithm' => $prf, 'parameters' => null]]; - $PBKDF2params = ASN1::encodeDER($PBKDF2params, Maps\PBKDF2params::MAP); - if (!$crypto instanceof RC2) { - $params = ['octetString' => $iv]; - } else { - $params = ['rc2ParametersVersion' => 58, 'iv' => $iv]; - $params = ASN1::encodeDER($params, Maps\RC2CBCParameter::MAP); - $params = new ASN1\Element($params); - } - $params = ['keyDerivationFunc' => ['algorithm' => 'id-PBKDF2', 'parameters' => new ASN1\Element($PBKDF2params)], 'encryptionScheme' => ['algorithm' => $encryptionScheme, 'parameters' => $params]]; - $params = ASN1::encodeDER($params, Maps\PBES2params::MAP); - $crypto->setIV($iv); - } else { - $crypto = self::getPBES1EncryptionObject($encryptionAlgorithm); - $hash = self::getPBES1Hash($encryptionAlgorithm); - $kdf = self::getPBES1KDF($encryptionAlgorithm); - $params = ['salt' => $salt, 'iterationCount' => $iterationCount]; - $params = ASN1::encodeDER($params, Maps\PBEParameter::MAP); - } - $crypto->setPassword($password, $kdf, $hash, $salt, $iterationCount); - $key = $crypto->encrypt($key); - $key = ['encryptionAlgorithm' => ['algorithm' => $encryptionAlgorithm, 'parameters' => new ASN1\Element($params)], 'encryptedData' => $key]; - $key = ASN1::encodeDER($key, Maps\EncryptedPrivateKeyInfo::MAP); - return "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END ENCRYPTED PRIVATE KEY-----"; - } - return "-----BEGIN PRIVATE KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END PRIVATE KEY-----"; - } - /** - * Wrap a public key appropriately - * - * @param string $key - * @param mixed $params - * @param string $oid - * @return string - */ - protected static function wrapPublicKey($key, $params, $oid = null) - { - self::initialize_static_variables(); - $key = ['publicKeyAlgorithm' => ['algorithm' => \is_string(static::OID_NAME) ? static::OID_NAME : $oid], 'publicKey' => "\x00" . $key]; - if ($oid != 'id-Ed25519' && $oid != 'id-Ed448') { - $key['publicKeyAlgorithm']['parameters'] = $params; - } - $key = ASN1::encodeDER($key, Maps\PublicKeyInfo::MAP); - return "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END PUBLIC KEY-----"; - } - /** - * Perform some preliminary parsing of the key - * - * @param string $key - * @return array - */ - private static function preParse(&$key) - { - self::initialize_static_variables(); - if (self::$format != self::MODE_DER) { - $decoded = ASN1::extractBER($key); - if ($decoded !== \false) { - $key = $decoded; - } elseif (self::$format == self::MODE_PEM) { - throw new \UnexpectedValueException('Expected base64-encoded PEM format but was unable to decode base64 text'); - } - } - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - return $decoded; - } - /** - * Returns the encryption parameters used by the key - * - * @param string $key - * @return array - */ - public static function extractEncryptionAlgorithm($key) - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - $decoded = self::preParse($key); - $r = ASN1::asn1map($decoded[0], ASN1\Maps\EncryptedPrivateKeyInfo::MAP); - if (!\is_array($r)) { - throw new \RuntimeException('Unable to parse using EncryptedPrivateKeyInfo map'); - } - if ($r['encryptionAlgorithm']['algorithm'] == 'id-PBES2') { - $decoded = ASN1::decodeBER($r['encryptionAlgorithm']['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $r['encryptionAlgorithm']['parameters'] = ASN1::asn1map($decoded[0], ASN1\Maps\PBES2params::MAP); - $kdf =& $r['encryptionAlgorithm']['parameters']['keyDerivationFunc']; - switch ($kdf['algorithm']) { - case 'id-PBKDF2': - $decoded = ASN1::decodeBER($kdf['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $kdf['parameters'] = ASN1::asn1map($decoded[0], Maps\PBKDF2params::MAP); - } - } - return $r['encryptionAlgorithm']; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php deleted file mode 100644 index 2c3053b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,324 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\AES; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\Random; -use phpseclib3\Exception\UnsupportedAlgorithmException; -/** - * PuTTY Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY -{ - /** - * Default comment - * - * @var string - */ - private static $comment = 'phpseclib-generated-key'; - /** - * Default version - * - * @var int - */ - private static $version = 2; - /** - * Sets the default comment - * - * @param string $comment - */ - public static function setComment($comment) - { - self::$comment = \str_replace(["\r", "\n"], '', $comment); - } - /** - * Sets the default version - * - * @param int $version - */ - public static function setVersion($version) - { - if ($version != 2 && $version != 3) { - throw new \RuntimeException('Only supported versions are 2 and 3'); - } - self::$version = $version; - } - /** - * Generate a symmetric key for PuTTY v2 keys - * - * @param string $password - * @param int $length - * @return string - */ - private static function generateV2Key($password, $length) - { - $symkey = ''; - $sequence = 0; - while (\strlen($symkey) < $length) { - $temp = \pack('Na*', $sequence++, $password); - $symkey .= Strings::hex2bin(\sha1($temp)); - } - return \substr($symkey, 0, $length); - } - /** - * Generate a symmetric key for PuTTY v3 keys - * - * @param string $password - * @param string $flavour - * @param int $memory - * @param int $passes - * @param string $salt - * @return array - */ - private static function generateV3Key($password, $flavour, $memory, $passes, $salt) - { - if (!\function_exists('sodium_crypto_pwhash')) { - throw new \RuntimeException('sodium_crypto_pwhash needs to exist for Argon2 password hasing'); - } - switch ($flavour) { - case 'Argon2i': - $flavour = \SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13; - break; - case 'Argon2id': - $flavour = \SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13; - break; - default: - throw new UnsupportedAlgorithmException('Only Argon2i and Argon2id are supported'); - } - $length = 80; - // keylen + ivlen + mac_keylen - $temp = \sodium_crypto_pwhash($length, $password, $salt, $passes, $memory << 10, $flavour); - $symkey = \substr($temp, 0, 32); - $symiv = \substr($temp, 32, 16); - $hashkey = \substr($temp, -32); - return \compact('symkey', 'symiv', 'hashkey'); - } - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password - * @return array - */ - public static function load($key, $password) - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - if (\strpos($key, 'BEGIN SSH2 PUBLIC KEY') !== \false) { - $lines = \preg_split('#[\\r\\n]+#', $key); - switch (\true) { - case $lines[0] != '---- BEGIN SSH2 PUBLIC KEY ----': - throw new \UnexpectedValueException('Key doesn\'t start with ---- BEGIN SSH2 PUBLIC KEY ----'); - case $lines[\count($lines) - 1] != '---- END SSH2 PUBLIC KEY ----': - throw new \UnexpectedValueException('Key doesn\'t end with ---- END SSH2 PUBLIC KEY ----'); - } - $lines = \array_splice($lines, 1, -1); - $lines = \array_map(function ($line) { - return \rtrim($line, "\r\n"); - }, $lines); - $data = $current = ''; - $values = []; - $in_value = \false; - foreach ($lines as $line) { - switch (\true) { - case \preg_match('#^(.*?): (.*)#', $line, $match): - $in_value = $line[\strlen($line) - 1] == '\\'; - $current = \strtolower($match[1]); - $values[$current] = $in_value ? \substr($match[2], 0, -1) : $match[2]; - break; - case $in_value: - $in_value = $line[\strlen($line) - 1] == '\\'; - $values[$current] .= $in_value ? \substr($line, 0, -1) : $line; - break; - default: - $data .= $line; - } - } - $components = \call_user_func([static::PUBLIC_HANDLER, 'load'], $data); - if ($components === \false) { - throw new \UnexpectedValueException('Unable to decode public key'); - } - $components += $values; - $components['comment'] = \str_replace(['\\\\', '\\"'], ['\\', '"'], $values['comment']); - return $components; - } - $components = []; - $key = \preg_split('#\\r\\n|\\r|\\n#', \trim($key)); - if (Strings::shift($key[0], \strlen('PuTTY-User-Key-File-')) != 'PuTTY-User-Key-File-') { - return \false; - } - $version = (int) Strings::shift($key[0], 3); - // should be either "2: " or "3: 0" prior to int casting - if ($version != 2 && $version != 3) { - throw new \RuntimeException('Only v2 and v3 PuTTY private keys are supported'); - } - $components['type'] = $type = \rtrim($key[0]); - if (!\in_array($type, static::$types)) { - $error = \count(static::$types) == 1 ? 'Only ' . static::$types[0] . ' keys are supported. ' : ''; - throw new UnsupportedAlgorithmException($error . 'This is an unsupported ' . $type . ' key'); - } - $encryption = \trim(\preg_replace('#Encryption: (.+)#', '$1', $key[1])); - $components['comment'] = \trim(\preg_replace('#Comment: (.+)#', '$1', $key[2])); - $publicLength = \trim(\preg_replace('#Public-Lines: (\\d+)#', '$1', $key[3])); - $public = Strings::base64_decode(\implode('', \array_map('trim', \array_slice($key, 4, $publicLength)))); - $source = Strings::packSSH2('ssss', $type, $encryption, $components['comment'], $public); - \extract(\unpack('Nlength', Strings::shift($public, 4))); - $newtype = Strings::shift($public, $length); - if ($newtype != $type) { - throw new \RuntimeException('The binary type does not match the human readable type field'); - } - $components['public'] = $public; - switch ($version) { - case 3: - $hashkey = ''; - break; - case 2: - $hashkey = 'putty-private-key-file-mac-key'; - } - $offset = $publicLength + 4; - switch ($encryption) { - case 'aes256-cbc': - $crypto = new AES('cbc'); - switch ($version) { - case 3: - $flavour = \trim(\preg_replace('#Key-Derivation: (.*)#', '$1', $key[$offset++])); - $memory = \trim(\preg_replace('#Argon2-Memory: (\\d+)#', '$1', $key[$offset++])); - $passes = \trim(\preg_replace('#Argon2-Passes: (\\d+)#', '$1', $key[$offset++])); - $parallelism = \trim(\preg_replace('#Argon2-Parallelism: (\\d+)#', '$1', $key[$offset++])); - $salt = Strings::hex2bin(\trim(\preg_replace('#Argon2-Salt: ([0-9a-f]+)#', '$1', $key[$offset++]))); - \extract(self::generateV3Key($password, $flavour, $memory, $passes, $salt)); - break; - case 2: - $symkey = self::generateV2Key($password, 32); - $symiv = \str_repeat("\x00", $crypto->getBlockLength() >> 3); - $hashkey .= $password; - } - } - switch ($version) { - case 3: - $hash = new Hash('sha256'); - $hash->setKey($hashkey); - break; - case 2: - $hash = new Hash('sha1'); - $hash->setKey(\sha1($hashkey, \true)); - } - $privateLength = \trim(\preg_replace('#Private-Lines: (\\d+)#', '$1', $key[$offset++])); - $private = Strings::base64_decode(\implode('', \array_map('trim', \array_slice($key, $offset, $privateLength)))); - if ($encryption != 'none') { - $crypto->setKey($symkey); - $crypto->setIV($symiv); - $crypto->disablePadding(); - $private = $crypto->decrypt($private); - } - $source .= Strings::packSSH2('s', $private); - $hmac = \trim(\preg_replace('#Private-MAC: (.+)#', '$1', $key[$offset + $privateLength])); - $hmac = Strings::hex2bin($hmac); - if (!\hash_equals($hash->hash($source), $hmac)) { - throw new \UnexpectedValueException('MAC validation error'); - } - $components['private'] = $private; - return $components; - } - /** - * Wrap a private key appropriately - * - * @param string $public - * @param string $private - * @param string $type - * @param string $password - * @param array $options optional - * @return string - */ - protected static function wrapPrivateKey($public, $private, $type, $password, array $options = []) - { - $encryption = !empty($password) || \is_string($password) ? 'aes256-cbc' : 'none'; - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $version = isset($options['version']) ? $options['version'] : self::$version; - $key = "PuTTY-User-Key-File-{$version}: {$type}\r\n"; - $key .= "Encryption: {$encryption}\r\n"; - $key .= "Comment: {$comment}\r\n"; - $public = Strings::packSSH2('s', $type) . $public; - $source = Strings::packSSH2('ssss', $type, $encryption, $comment, $public); - $public = Strings::base64_encode($public); - $key .= "Public-Lines: " . (\strlen($public) + 63 >> 6) . "\r\n"; - $key .= \chunk_split($public, 64); - if (empty($password) && !\is_string($password)) { - $source .= Strings::packSSH2('s', $private); - switch ($version) { - case 3: - $hash = new Hash('sha256'); - $hash->setKey(''); - break; - case 2: - $hash = new Hash('sha1'); - $hash->setKey(\sha1('putty-private-key-file-mac-key', \true)); - } - } else { - $private .= Random::string(16 - (\strlen($private) & 15)); - $source .= Strings::packSSH2('s', $private); - $crypto = new AES('cbc'); - switch ($version) { - case 3: - $salt = Random::string(16); - $key .= "Key-Derivation: Argon2id\r\n"; - $key .= "Argon2-Memory: 8192\r\n"; - $key .= "Argon2-Passes: 13\r\n"; - $key .= "Argon2-Parallelism: 1\r\n"; - $key .= "Argon2-Salt: " . Strings::bin2hex($salt) . "\r\n"; - \extract(self::generateV3Key($password, 'Argon2id', 8192, 13, $salt)); - $hash = new Hash('sha256'); - $hash->setKey($hashkey); - break; - case 2: - $symkey = self::generateV2Key($password, 32); - $symiv = \str_repeat("\x00", $crypto->getBlockLength() >> 3); - $hashkey = 'putty-private-key-file-mac-key' . $password; - $hash = new Hash('sha1'); - $hash->setKey(\sha1($hashkey, \true)); - } - $crypto->setKey($symkey); - $crypto->setIV($symiv); - $crypto->disablePadding(); - $private = $crypto->encrypt($private); - $mac = $hash->hash($source); - } - $private = Strings::base64_encode($private); - $key .= 'Private-Lines: ' . (\strlen($private) + 63 >> 6) . "\r\n"; - $key .= \chunk_split($private, 64); - $key .= 'Private-MAC: ' . Strings::bin2hex($hash->hash($source)) . "\r\n"; - return $key; - } - /** - * Wrap a public key appropriately - * - * This is basically the format described in RFC 4716 (https://tools.ietf.org/html/rfc4716) - * - * @param string $key - * @param string $type - * @return string - */ - protected static function wrapPublicKey($key, $type) - { - $key = \pack('Na*a*', \strlen($type), $type, $key); - $key = "---- BEGIN SSH2 PUBLIC KEY ----\r\n" . 'Comment: "' . \str_replace(['\\', '"'], ['\\\\', '\\"'], self::$comment) . "\"\r\n" . \chunk_split(Strings::base64_encode($key), 64) . '---- END SSH2 PUBLIC KEY ----'; - return $key; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php deleted file mode 100644 index 2b60e48..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Formats\Signature; - -use phpseclib3\Math\BigInteger; -/** - * Raw Signature Handler - * - * @author Jim Wigginton - */ -abstract class Raw -{ - /** - * Loads a signature - * - * @param array $sig - * @return array|bool - */ - public static function load($sig) - { - switch (\true) { - case !\is_array($sig): - case !isset($sig['r']) || !isset($sig['s']): - case !$sig['r'] instanceof BigInteger: - case !$sig['s'] instanceof BigInteger: - return \false; - } - return ['r' => $sig['r'], 's' => $sig['s']]; - } - /** - * Returns a signature in the appropriate format - * - * @param \phpseclib3\Math\BigInteger $r - * @param \phpseclib3\Math\BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - return \compact('r', 's'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php deleted file mode 100644 index ed81688..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common; - -/** - * PrivateKey interface - * - * @author Jim Wigginton - */ -interface PrivateKey -{ - public function sign($message); - //public function decrypt($ciphertext); - public function getPublicKey(); - public function toString($type, array $options = []); - /** - * @param string|false $password - * @return mixed - */ - public function withPassword($password = \false); -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php deleted file mode 100644 index 10cc6a6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common; - -/** - * PublicKey interface - * - * @author Jim Wigginton - */ -interface PublicKey -{ - public function verify($message, $signature); - //public function encrypt($plaintext); - public function toString($type, array $options = []); - public function getFingerprint($algorithm); -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php deleted file mode 100644 index cef74ea..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common; - -/** - * Base Class for all stream cipher classes - * - * @author Jim Wigginton - */ -abstract class StreamCipher extends \phpseclib3\Crypt\Common\SymmetricKey -{ - /** - * Block Length of the cipher - * - * Stream ciphers do not have a block size - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 0; - /** - * Default Constructor. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @return \phpseclib3\Crypt\Common\StreamCipher - */ - public function __construct() - { - parent::__construct('stream'); - } - /** - * Stream ciphers not use an IV - * - * @return bool - */ - public function usesIV() - { - return \false; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php deleted file mode 100644 index 3ec8b85..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php +++ /dev/null @@ -1,3094 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Blowfish; -use phpseclib3\Crypt\Hash; -use phpseclib3\Exception\BadDecryptionException; -use phpseclib3\Exception\BadModeException; -use phpseclib3\Exception\InconsistentSetupException; -use phpseclib3\Exception\InsufficientSetupException; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\BinaryField; -use phpseclib3\Math\PrimeField; -/** - * Base Class for all \phpseclib3\Crypt\* cipher classes - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - */ -abstract class SymmetricKey -{ - /** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CTR = -1; - /** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_ECB = 1; - /** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CBC = 2; - /** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CFB = 3; - /** - * Encrypt / decrypt using the Cipher Feedback mode (8bit) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CFB8 = 7; - /** - * Encrypt / decrypt using the Output Feedback mode (8bit) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_OFB8 = 8; - /** - * Encrypt / decrypt using the Output Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_OFB = 4; - /** - * Encrypt / decrypt using Galois/Counter mode. - * - * @link https://en.wikipedia.org/wiki/Galois/Counter_Mode - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_GCM = 5; - /** - * Encrypt / decrypt using streaming mode. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_STREAM = 6; - /** - * Mode Map - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const MODE_MAP = ['ctr' => self::MODE_CTR, 'ecb' => self::MODE_ECB, 'cbc' => self::MODE_CBC, 'cfb' => self::MODE_CFB, 'cfb8' => self::MODE_CFB8, 'ofb' => self::MODE_OFB, 'ofb8' => self::MODE_OFB8, 'gcm' => self::MODE_GCM, 'stream' => self::MODE_STREAM]; - /** - * Base value for the internal implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_INTERNAL = 1; - /** - * Base value for the eval() implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_EVAL = 2; - /** - * Base value for the mcrypt implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_MCRYPT = 3; - /** - * Base value for the openssl implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_OPENSSL = 4; - /** - * Base value for the libsodium implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_LIBSODIUM = 5; - /** - * Base value for the openssl / gcm implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_OPENSSL_GCM = 6; - /** - * Engine Reverse Map - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::getEngine() - */ - const ENGINE_MAP = [self::ENGINE_INTERNAL => 'PHP', self::ENGINE_EVAL => 'Eval', self::ENGINE_MCRYPT => 'mcrypt', self::ENGINE_OPENSSL => 'OpenSSL', self::ENGINE_LIBSODIUM => 'libsodium', self::ENGINE_OPENSSL_GCM => 'OpenSSL (GCM)']; - /** - * The Encryption Mode - * - * @see self::__construct() - * @var int - */ - protected $mode; - /** - * The Block Length of the block cipher - * - * @var int - */ - protected $block_size = 16; - /** - * The Key - * - * @see self::setKey() - * @var string - */ - protected $key = \false; - /** - * HMAC Key - * - * @see self::setupGCM() - * @var ?string - */ - protected $hKey = \false; - /** - * The Initialization Vector - * - * @see self::setIV() - * @var string - */ - protected $iv = \false; - /** - * A "sliding" Initialization Vector - * - * @see self::enableContinuousBuffer() - * @see self::clearBuffers() - * @var string - */ - protected $encryptIV; - /** - * A "sliding" Initialization Vector - * - * @see self::enableContinuousBuffer() - * @see self::clearBuffers() - * @var string - */ - protected $decryptIV; - /** - * Continuous Buffer status - * - * @see self::enableContinuousBuffer() - * @var bool - */ - protected $continuousBuffer = \false; - /** - * Encryption buffer for CTR, OFB and CFB modes - * - * @see self::encrypt() - * @see self::clearBuffers() - * @var array - */ - protected $enbuffer; - /** - * Decryption buffer for CTR, OFB and CFB modes - * - * @see self::decrypt() - * @see self::clearBuffers() - * @var array - */ - protected $debuffer; - /** - * mcrypt resource for encryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see self::encrypt() - * @var resource - */ - private $enmcrypt; - /** - * mcrypt resource for decryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see self::decrypt() - * @var resource - */ - private $demcrypt; - /** - * Does the enmcrypt resource need to be (re)initialized? - * - * @see \phpseclib3\Crypt\Twofish::setKey() - * @see \phpseclib3\Crypt\Twofish::setIV() - * @var bool - */ - private $enchanged = \true; - /** - * Does the demcrypt resource need to be (re)initialized? - * - * @see \phpseclib3\Crypt\Twofish::setKey() - * @see \phpseclib3\Crypt\Twofish::setIV() - * @var bool - */ - private $dechanged = \true; - /** - * mcrypt resource for CFB mode - * - * mcrypt's CFB mode, in (and only in) buffered context, - * is broken, so phpseclib implements the CFB mode by it self, - * even when the mcrypt php extension is available. - * - * In order to do the CFB-mode work (fast) phpseclib - * use a separate ECB-mode mcrypt resource. - * - * @link http://phpseclib.sourceforge.net/cfb-demo.phps - * @see self::encrypt() - * @see self::decrypt() - * @see self::setupMcrypt() - * @var resource - */ - private $ecb; - /** - * Optimizing value while CFB-encrypting - * - * Only relevant if $continuousBuffer enabled - * and $engine == self::ENGINE_MCRYPT - * - * It's faster to re-init $enmcrypt if - * $buffer bytes > $cfb_init_len than - * using the $ecb resource furthermore. - * - * This value depends of the chosen cipher - * and the time it would be needed for it's - * initialization [by mcrypt_generic_init()] - * which, typically, depends on the complexity - * on its internaly Key-expanding algorithm. - * - * @see self::encrypt() - * @var int - */ - protected $cfb_init_len = 600; - /** - * Does internal cipher state need to be (re)initialized? - * - * @see self::setKey() - * @see self::setIV() - * @see self::disableContinuousBuffer() - * @var bool - */ - protected $changed = \true; - /** - * Does Eval engie need to be (re)initialized? - * - * @see self::setup() - * @var bool - */ - protected $nonIVChanged = \true; - /** - * Padding status - * - * @see self::enablePadding() - * @var bool - */ - private $padding = \true; - /** - * Is the mode one that is paddable? - * - * @see self::__construct() - * @var bool - */ - private $paddable = \false; - /** - * Holds which crypt engine internaly should be use, - * which will be determined automatically on __construct() - * - * Currently available $engines are: - * - self::ENGINE_LIBSODIUM (very fast, php-extension: libsodium, extension_loaded('libsodium') required) - * - self::ENGINE_OPENSSL_GCM (very fast, php-extension: openssl, extension_loaded('openssl') required) - * - self::ENGINE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) - * - self::ENGINE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) - * - self::ENGINE_EVAL (medium, pure php-engine, no php-extension required) - * - self::ENGINE_INTERNAL (slower, pure php-engine, no php-extension required) - * - * @see self::setEngine() - * @see self::encrypt() - * @see self::decrypt() - * @var int - */ - protected $engine; - /** - * Holds the preferred crypt engine - * - * @see self::setEngine() - * @see self::setPreferredEngine() - * @var int - */ - private $preferredEngine; - /** - * The mcrypt specific name of the cipher - * - * Only used if $engine == self::ENGINE_MCRYPT - * - * @link http://www.php.net/mcrypt_module_open - * @link http://www.php.net/mcrypt_list_algorithms - * @see self::setupMcrypt() - * @var string - */ - protected $cipher_name_mcrypt; - /** - * The openssl specific name of the cipher - * - * Only used if $engine == self::ENGINE_OPENSSL - * - * @link http://www.php.net/openssl-get-cipher-methods - * @var string - */ - protected $cipher_name_openssl; - /** - * The openssl specific name of the cipher in ECB mode - * - * If OpenSSL does not support the mode we're trying to use (CTR) - * it can still be emulated with ECB mode. - * - * @link http://www.php.net/openssl-get-cipher-methods - * @var string - */ - protected $cipher_name_openssl_ecb; - /** - * The default salt used by setPassword() - * - * @see self::setPassword() - * @var string - */ - private $password_default_salt = 'phpseclib/salt'; - /** - * The name of the performance-optimized callback function - * - * Used by encrypt() / decrypt() - * only if $engine == self::ENGINE_INTERNAL - * - * @see self::encrypt() - * @see self::decrypt() - * @see self::setupInlineCrypt() - * @var Callback - */ - protected $inline_crypt; - /** - * If OpenSSL can be used in ECB but not in CTR we can emulate CTR - * - * @see self::openssl_ctr_process() - * @var bool - */ - private $openssl_emulate_ctr = \false; - /** - * Don't truncate / null pad key - * - * @see self::clearBuffers() - * @var bool - */ - private $skip_key_adjustment = \false; - /** - * Has the key length explicitly been set or should it be derived from the key, itself? - * - * @see self::setKeyLength() - * @var bool - */ - protected $explicit_key_length = \false; - /** - * Hash subkey for GHASH - * - * @see self::setupGCM() - * @see self::ghash() - * @var BinaryField\Integer - */ - private $h; - /** - * Additional authenticated data - * - * @var string - */ - protected $aad = ''; - /** - * Authentication Tag produced after a round of encryption - * - * @var string - */ - protected $newtag = \false; - /** - * Authentication Tag to be verified during decryption - * - * @var string - */ - protected $oldtag = \false; - /** - * GCM Binary Field - * - * @see self::__construct() - * @see self::ghash() - * @var BinaryField - */ - private static $gcmField; - /** - * Poly1305 Prime Field - * - * @see self::enablePoly1305() - * @see self::poly1305() - * @var PrimeField - */ - private static $poly1305Field; - /** - * Flag for using regular vs "safe" intval - * - * @see self::initialize_static_variables() - * @var boolean - */ - protected static $use_reg_intval; - /** - * Poly1305 Key - * - * @see self::setPoly1305Key() - * @see self::poly1305() - * @var string - */ - protected $poly1305Key; - /** - * Poly1305 Flag - * - * @see self::setPoly1305Key() - * @see self::enablePoly1305() - * @var boolean - */ - protected $usePoly1305 = \false; - /** - * The Original Initialization Vector - * - * GCM uses the nonce to build the IV but we want to be able to distinguish between nonce-derived - * IV's and user-set IV's - * - * @see self::setIV() - * @var string - */ - private $origIV = \false; - /** - * Nonce - * - * Only used with GCM. We could re-use setIV() but nonce's can be of a different length and - * toggling between GCM and other modes could be more complicated if we re-used setIV() - * - * @see self::setNonce() - * @var string - */ - protected $nonce = \false; - /** - * Default Constructor. - * - * $mode could be: - * - * - ecb - * - * - cbc - * - * - ctr - * - * - cfb - * - * - cfb8 - * - * - ofb - * - * - ofb8 - * - * - gcm - * - * @param string $mode - * @throws BadModeException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - $mode = \strtolower($mode); - // necessary because of 5.6 compatibility; we can't do isset(self::MODE_MAP[$mode]) in 5.6 - $map = self::MODE_MAP; - if (!isset($map[$mode])) { - throw new BadModeException('No valid mode has been specified'); - } - $mode = self::MODE_MAP[$mode]; - // $mode dependent settings - switch ($mode) { - case self::MODE_ECB: - case self::MODE_CBC: - $this->paddable = \true; - break; - case self::MODE_CTR: - case self::MODE_CFB: - case self::MODE_CFB8: - case self::MODE_OFB: - case self::MODE_OFB8: - case self::MODE_STREAM: - $this->paddable = \false; - break; - case self::MODE_GCM: - if ($this->block_size != 16) { - throw new BadModeException('GCM is only valid for block ciphers with a block size of 128 bits'); - } - if (!isset(self::$gcmField)) { - self::$gcmField = new BinaryField(128, 7, 2, 1, 0); - } - $this->paddable = \false; - break; - default: - throw new BadModeException('No valid mode has been specified'); - } - $this->mode = $mode; - static::initialize_static_variables(); - } - /** - * Initialize static variables - */ - protected static function initialize_static_variables() - { - if (!isset(self::$use_reg_intval)) { - switch (\true) { - // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster - case (\PHP_OS & "\xdf\xdf\xdf") === 'WIN': - case (\php_uname('m') & "\xdf\xdf\xdf") != 'ARM': - case \defined('PHP_INT_SIZE') && \PHP_INT_SIZE == 8: - self::$use_reg_intval = \true; - break; - case (\php_uname('m') & "\xdf\xdf\xdf") == 'ARM': - switch (\true) { - /* PHP 7.0.0 introduced a bug that affected 32-bit ARM processors: - - https://github.com/php/php-src/commit/716da71446ebbd40fa6cf2cea8a4b70f504cc3cd - - altho the changelogs make no mention of it, this bug was fixed with this commit: - - https://github.com/php/php-src/commit/c1729272b17a1fe893d1a54e423d3b71470f3ee8 - - affected versions of PHP are: 7.0.x, 7.1.0 - 7.1.23 and 7.2.0 - 7.2.11 */ - case \PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID <= 70123: - case \PHP_VERSION_ID >= 70200 && \PHP_VERSION_ID <= 70211: - self::$use_reg_intval = \false; - break; - default: - self::$use_reg_intval = \true; - } - } - } - } - /** - * Sets the initialization vector. - * - * setIV() is not required when ecb or gcm modes are being used. - * - * {@internal Can be overwritten by a sub class, but does not have to be} - * - * @param string $iv - * @throws \LengthException if the IV length isn't equal to the block size - * @throws \BadMethodCallException if an IV is provided when one shouldn't be - */ - public function setIV($iv) - { - if ($this->mode == self::MODE_ECB) { - throw new \BadMethodCallException('This mode does not require an IV.'); - } - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('Use setNonce instead'); - } - if (!$this->usesIV()) { - throw new \BadMethodCallException('This algorithm does not use an IV.'); - } - if (\strlen($iv) != $this->block_size) { - throw new \LengthException('Received initialization vector of size ' . \strlen($iv) . ', but size ' . $this->block_size . ' is required'); - } - $this->iv = $this->origIV = $iv; - $this->changed = \true; - } - /** - * Enables Poly1305 mode. - * - * Once enabled Poly1305 cannot be disabled. - * - * @throws \BadMethodCallException if Poly1305 is enabled whilst in GCM mode - */ - public function enablePoly1305() - { - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('Poly1305 cannot be used in GCM mode'); - } - $this->usePoly1305 = \true; - } - /** - * Enables Poly1305 mode. - * - * Once enabled Poly1305 cannot be disabled. If $key is not passed then an attempt to call createPoly1305Key - * will be made. - * - * @param string $key optional - * @throws \LengthException if the key isn't long enough - * @throws \BadMethodCallException if Poly1305 is enabled whilst in GCM mode - */ - public function setPoly1305Key($key = null) - { - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('Poly1305 cannot be used in GCM mode'); - } - if (!\is_string($key) || \strlen($key) != 32) { - throw new \LengthException('The Poly1305 key must be 32 bytes long (256 bits)'); - } - if (!isset(self::$poly1305Field)) { - // 2^130-5 - self::$poly1305Field = new PrimeField(new BigInteger('3fffffffffffffffffffffffffffffffb', 16)); - } - $this->poly1305Key = $key; - $this->usePoly1305 = \true; - } - /** - * Sets the nonce. - * - * setNonce() is only required when gcm is used - * - * @param string $nonce - * @throws \BadMethodCallException if an nonce is provided when one shouldn't be - */ - public function setNonce($nonce) - { - if ($this->mode != self::MODE_GCM) { - throw new \BadMethodCallException('Nonces are only used in GCM mode.'); - } - $this->nonce = $nonce; - $this->setEngine(); - } - /** - * Sets additional authenticated data - * - * setAAD() is only used by gcm or in poly1305 mode - * - * @param string $aad - * @throws \BadMethodCallException if mode isn't GCM or if poly1305 isn't being utilized - */ - public function setAAD($aad) - { - if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { - throw new \BadMethodCallException('Additional authenticated data is only utilized in GCM mode or with Poly1305'); - } - $this->aad = $aad; - } - /** - * Returns whether or not the algorithm uses an IV - * - * @return bool - */ - public function usesIV() - { - return $this->mode != self::MODE_GCM && $this->mode != self::MODE_ECB; - } - /** - * Returns whether or not the algorithm uses a nonce - * - * @return bool - */ - public function usesNonce() - { - return $this->mode == self::MODE_GCM; - } - /** - * Returns the current key length in bits - * - * @return int - */ - public function getKeyLength() - { - return $this->key_length << 3; - } - /** - * Returns the current block length in bits - * - * @return int - */ - public function getBlockLength() - { - return $this->block_size << 3; - } - /** - * Returns the current block length in bytes - * - * @return int - */ - public function getBlockLengthInBytes() - { - return $this->block_size; - } - /** - * Sets the key length. - * - * Keys with explicitly set lengths need to be treated accordingly - * - * @param int $length - */ - public function setKeyLength($length) - { - $this->explicit_key_length = $length >> 3; - if (\is_string($this->key) && \strlen($this->key) != $this->explicit_key_length) { - $this->key = \false; - throw new InconsistentSetupException('Key has already been set and is not ' . $this->explicit_key_length . ' bytes long'); - } - } - /** - * Sets the key. - * - * The min/max length(s) of the key depends on the cipher which is used. - * If the key not fits the length(s) of the cipher it will paded with null bytes - * up to the closest valid key length. If the key is more than max length, - * we trim the excess bits. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @param string $key - */ - public function setKey($key) - { - if ($this->explicit_key_length !== \false && \strlen($key) != $this->explicit_key_length) { - throw new InconsistentSetupException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . \strlen($key) . ' bytes'); - } - $this->key = $key; - $this->key_length = \strlen($key); - $this->setEngine(); - } - /** - * Sets the password. - * - * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: - * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: - * $hash, $salt, $count, $dkLen - * - * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php - * {@link https://en.wikipedia.org/wiki/Bcrypt bcypt}: - * $salt, $rounds, $keylen - * - * This is a modified version of bcrypt used by OpenSSH. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see Crypt/Hash.php - * @param string $password - * @param string $method - * @param int|string ...$func_args - * @throws \LengthException if pbkdf1 is being used and the derived key length exceeds the hash length - * @throws \RuntimeException if bcrypt is being used and a salt isn't provided - * @return bool - */ - public function setPassword($password, $method = 'pbkdf2', ...$func_args) - { - $key = ''; - $method = \strtolower($method); - switch ($method) { - case 'bcrypt': - if (!isset($func_args[2])) { - throw new \RuntimeException('A salt must be provided for bcrypt to work'); - } - $salt = $func_args[0]; - $rounds = isset($func_args[1]) ? $func_args[1] : 16; - $keylen = isset($func_args[2]) ? $func_args[2] : $this->key_length; - $key = Blowfish::bcrypt_pbkdf($password, $salt, $keylen + $this->block_size, $rounds); - $this->setKey(\substr($key, 0, $keylen)); - $this->setIV(\substr($key, $keylen)); - return \true; - case 'pkcs12': - // from https://tools.ietf.org/html/rfc7292#appendix-B.2 - case 'pbkdf1': - case 'pbkdf2': - // Hash function - $hash = isset($func_args[0]) ? \strtolower($func_args[0]) : 'sha1'; - $hashObj = new Hash(); - $hashObj->setHash($hash); - // WPA and WPA2 use the SSID as the salt - $salt = isset($func_args[1]) ? $func_args[1] : $this->password_default_salt; - // RFC2898#section-4.2 uses 1,000 iterations by default - // WPA and WPA2 use 4,096. - $count = isset($func_args[2]) ? $func_args[2] : 1000; - // Keylength - if (isset($func_args[3])) { - if ($func_args[3] <= 0) { - throw new \LengthException('Derived key length cannot be longer 0 or less'); - } - $dkLen = $func_args[3]; - } else { - $key_length = $this->explicit_key_length !== \false ? $this->explicit_key_length : $this->key_length; - $dkLen = $method == 'pbkdf1' ? 2 * $key_length : $key_length; - } - switch (\true) { - case $method == 'pkcs12': - /* - In this specification, however, all passwords are created from - BMPStrings with a NULL terminator. This means that each character in - the original BMPString is encoded in 2 bytes in big-endian format - (most-significant byte first). There are no Unicode byte order - marks. The 2 bytes produced from the last character in the BMPString - are followed by 2 additional bytes with the value 0x00. - - -- https://tools.ietf.org/html/rfc7292#appendix-B.1 - */ - $password = "\x00" . \chunk_split($password, 1, "\x00") . "\x00"; - /* - This standard specifies 3 different values for the ID byte mentioned - above: - - 1. If ID=1, then the pseudorandom bits being produced are to be used - as key material for performing encryption or decryption. - - 2. If ID=2, then the pseudorandom bits being produced are to be used - as an IV (Initial Value) for encryption or decryption. - - 3. If ID=3, then the pseudorandom bits being produced are to be used - as an integrity key for MACing. - */ - // Construct a string, D (the "diversifier"), by concatenating v/8 - // copies of ID. - $blockLength = $hashObj->getBlockLengthInBytes(); - $d1 = \str_repeat(\chr(1), $blockLength); - $d2 = \str_repeat(\chr(2), $blockLength); - $s = ''; - if (\strlen($salt)) { - while (\strlen($s) < $blockLength) { - $s .= $salt; - } - } - $s = \substr($s, 0, $blockLength); - $p = ''; - if (\strlen($password)) { - while (\strlen($p) < $blockLength) { - $p .= $password; - } - } - $p = \substr($p, 0, $blockLength); - $i = $s . $p; - $this->setKey(self::pkcs12helper($dkLen, $hashObj, $i, $d1, $count)); - if ($this->usesIV()) { - $this->setIV(self::pkcs12helper($this->block_size, $hashObj, $i, $d2, $count)); - } - return \true; - case $method == 'pbkdf1': - if ($dkLen > $hashObj->getLengthInBytes()) { - throw new \LengthException('Derived key length cannot be longer than the hash length'); - } - $t = $password . $salt; - for ($i = 0; $i < $count; ++$i) { - $t = $hashObj->hash($t); - } - $key = \substr($t, 0, $dkLen); - $this->setKey(\substr($key, 0, $dkLen >> 1)); - if ($this->usesIV()) { - $this->setIV(\substr($key, $dkLen >> 1)); - } - return \true; - case !\in_array($hash, \hash_algos()): - $i = 1; - $hashObj->setKey($password); - while (\strlen($key) < $dkLen) { - $f = $u = $hashObj->hash($salt . \pack('N', $i++)); - for ($j = 2; $j <= $count; ++$j) { - $u = $hashObj->hash($u); - $f ^= $u; - } - $key .= $f; - } - $key = \substr($key, 0, $dkLen); - break; - default: - $key = \hash_pbkdf2($hash, $password, $salt, $count, $dkLen, \true); - } - break; - default: - throw new UnsupportedAlgorithmException($method . ' is not a supported password hashing method'); - } - $this->setKey($key); - return \true; - } - /** - * PKCS#12 KDF Helper Function - * - * As discussed here: - * - * {@link https://tools.ietf.org/html/rfc7292#appendix-B} - * - * @see self::setPassword() - * @param int $n - * @param \phpseclib3\Crypt\Hash $hashObj - * @param string $i - * @param string $d - * @param int $count - * @return string $a - */ - private static function pkcs12helper($n, $hashObj, $i, $d, $count) - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - $blockLength = $hashObj->getBlockLength() >> 3; - $c = \ceil($n / $hashObj->getLengthInBytes()); - $a = ''; - for ($j = 1; $j <= $c; $j++) { - $ai = $d . $i; - for ($k = 0; $k < $count; $k++) { - $ai = $hashObj->hash($ai); - } - $b = ''; - while (\strlen($b) < $blockLength) { - $b .= $ai; - } - $b = \substr($b, 0, $blockLength); - $b = new BigInteger($b, 256); - $newi = ''; - for ($k = 0; $k < \strlen($i); $k += $blockLength) { - $temp = \substr($i, $k, $blockLength); - $temp = new BigInteger($temp, 256); - $temp->setPrecision($blockLength << 3); - $temp = $temp->add($b); - $temp = $temp->add($one); - $newi .= $temp->toBytes(\false); - } - $i = $newi; - $a .= $ai; - } - return \substr($a, 0, $n); - } - /** - * Encrypts a message. - * - * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher - * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's - * necessary are discussed in the following - * URL: - * - * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} - * - * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. - * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that - * length. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::decrypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - if ($this->paddable) { - $plaintext = $this->pad($plaintext); - } - $this->setup(); - if ($this->mode == self::MODE_GCM) { - $oldIV = $this->iv; - Strings::increment_str($this->iv); - $cipher = new static('ctr'); - $cipher->setKey($this->key); - $cipher->setIV($this->iv); - $ciphertext = $cipher->encrypt($plaintext); - $s = $this->ghash(self::nullPad128($this->aad) . self::nullPad128($ciphertext) . self::len64($this->aad) . self::len64($ciphertext)); - $cipher->encryptIV = $this->iv = $this->encryptIV = $this->decryptIV = $oldIV; - $this->newtag = $cipher->encrypt($s); - return $ciphertext; - } - if (isset($this->poly1305Key)) { - $cipher = clone $this; - unset($cipher->poly1305Key); - $this->usePoly1305 = \false; - $ciphertext = $cipher->encrypt($plaintext); - $this->newtag = $this->poly1305($ciphertext); - return $ciphertext; - } - if ($this->engine === self::ENGINE_OPENSSL) { - switch ($this->mode) { - case self::MODE_STREAM: - return \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - case self::MODE_ECB: - return \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - case self::MODE_CBC: - $result = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->encryptIV); - if ($this->continuousBuffer) { - $this->encryptIV = \substr($result, -$this->block_size); - } - return $result; - case self::MODE_CTR: - return $this->openssl_ctr_process($plaintext, $this->encryptIV, $this->enbuffer); - case self::MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - $ciphertext = ''; - if ($this->continuousBuffer) { - $iv =& $this->encryptIV; - $pos =& $this->enbuffer['pos']; - } else { - $iv = $this->encryptIV; - $pos = 0; - } - $len = \strlen($plaintext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $this->block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = \substr($iv, $orig_pos) ^ $plaintext; - $iv = \substr_replace($iv, $ciphertext, $orig_pos, $i); - $plaintext = \substr($plaintext, $i); - } - $overflow = $len % $this->block_size; - if ($overflow) { - $ciphertext .= \openssl_encrypt(\substr($plaintext, 0, -$overflow) . \str_repeat("\x00", $this->block_size), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $iv = Strings::pop($ciphertext, $this->block_size); - $size = $len - $overflow; - $block = $iv ^ \substr($plaintext, -$overflow); - $iv = \substr_replace($iv, $block, 0, $overflow); - $ciphertext .= $block; - $pos = $overflow; - } elseif ($len) { - $ciphertext = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $iv = \substr($ciphertext, -$this->block_size); - } - return $ciphertext; - case self::MODE_CFB8: - $ciphertext = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->encryptIV); - if ($this->continuousBuffer) { - if (($len = \strlen($ciphertext)) >= $this->block_size) { - $this->encryptIV = \substr($ciphertext, -$this->block_size); - } else { - $this->encryptIV = \substr($this->encryptIV, $len - $this->block_size) . \substr($ciphertext, -$len); - } - } - return $ciphertext; - case self::MODE_OFB8: - $ciphertext = ''; - $len = \strlen($plaintext); - $iv = $this->encryptIV; - for ($i = 0; $i < $len; ++$i) { - $xor = \openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); - $ciphertext .= $plaintext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; - } - if ($this->continuousBuffer) { - $this->encryptIV = $iv; - } - break; - case self::MODE_OFB: - return $this->openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer); - } - } - if ($this->engine === self::ENGINE_MCRYPT) { - \set_error_handler(function () { - }); - if ($this->enchanged) { - \mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); - $this->enchanged = \false; - } - // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's - // rewritten CFB implementation the above outputs the same thing twice. - if ($this->mode == self::MODE_CFB && $this->continuousBuffer) { - $block_size = $this->block_size; - $iv =& $this->encryptIV; - $pos =& $this->enbuffer['pos']; - $len = \strlen($plaintext); - $ciphertext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - $ciphertext = \substr($iv, $orig_pos) ^ $plaintext; - $iv = \substr_replace($iv, $ciphertext, $orig_pos, $i); - $this->enbuffer['enmcrypt_init'] = \true; - } - if ($len >= $block_size) { - if ($this->enbuffer['enmcrypt_init'] === \false || $len > $this->cfb_init_len) { - if ($this->enbuffer['enmcrypt_init'] === \true) { - \mcrypt_generic_init($this->enmcrypt, $this->key, $iv); - $this->enbuffer['enmcrypt_init'] = \false; - } - $ciphertext .= \mcrypt_generic($this->enmcrypt, \substr($plaintext, $i, $len - $len % $block_size)); - $iv = \substr($ciphertext, -$block_size); - $len %= $block_size; - } else { - while ($len >= $block_size) { - $iv = \mcrypt_generic($this->ecb, $iv) ^ \substr($plaintext, $i, $block_size); - $ciphertext .= $iv; - $len -= $block_size; - $i += $block_size; - } - } - } - if ($len) { - $iv = \mcrypt_generic($this->ecb, $iv); - $block = $iv ^ \substr($plaintext, -$len); - $iv = \substr_replace($iv, $block, 0, $len); - $ciphertext .= $block; - $pos = $len; - } - \restore_error_handler(); - return $ciphertext; - } - $ciphertext = \mcrypt_generic($this->enmcrypt, $plaintext); - if (!$this->continuousBuffer) { - \mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); - } - \restore_error_handler(); - return $ciphertext; - } - if ($this->engine === self::ENGINE_EVAL) { - $inline = $this->inline_crypt; - return $inline('encrypt', $plaintext); - } - $buffer =& $this->enbuffer; - $block_size = $this->block_size; - $ciphertext = ''; - switch ($this->mode) { - case self::MODE_ECB: - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $ciphertext .= $this->encryptBlock(\substr($plaintext, $i, $block_size)); - } - break; - case self::MODE_CBC: - $xor = $this->encryptIV; - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - $block = $this->encryptBlock($block ^ $xor); - $xor = $block; - $ciphertext .= $block; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - } - break; - case self::MODE_CTR: - $xor = $this->encryptIV; - if (\strlen($buffer['ciphertext'])) { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= $this->encryptBlock($xor); - Strings::increment_str($xor); - } - $key = Strings::shift($buffer['ciphertext'], $block_size); - $ciphertext .= $block ^ $key; - } - } else { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - $key = $this->encryptBlock($xor); - Strings::increment_str($xor); - $ciphertext .= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = \strlen($plaintext) % $block_size) { - $buffer['ciphertext'] = \substr($key, $start) . $buffer['ciphertext']; - } - } - break; - case self::MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - if ($this->continuousBuffer) { - $iv =& $this->encryptIV; - $pos =& $buffer['pos']; - } else { - $iv = $this->encryptIV; - $pos = 0; - } - $len = \strlen($plaintext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = \substr($iv, $orig_pos) ^ $plaintext; - $iv = \substr_replace($iv, $ciphertext, $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->encryptBlock($iv) ^ \substr($plaintext, $i, $block_size); - $ciphertext .= $iv; - $len -= $block_size; - $i += $block_size; - } - if ($len) { - $iv = $this->encryptBlock($iv); - $block = $iv ^ \substr($plaintext, $i); - $iv = \substr_replace($iv, $block, 0, $len); - $ciphertext .= $block; - $pos = $len; - } - break; - case self::MODE_CFB8: - $ciphertext = ''; - $len = \strlen($plaintext); - $iv = $this->encryptIV; - for ($i = 0; $i < $len; ++$i) { - $ciphertext .= $c = $plaintext[$i] ^ $this->encryptBlock($iv); - $iv = \substr($iv, 1) . $c; - } - if ($this->continuousBuffer) { - if ($len >= $block_size) { - $this->encryptIV = \substr($ciphertext, -$block_size); - } else { - $this->encryptIV = \substr($this->encryptIV, $len - $block_size) . \substr($ciphertext, -$len); - } - } - break; - case self::MODE_OFB8: - $ciphertext = ''; - $len = \strlen($plaintext); - $iv = $this->encryptIV; - for ($i = 0; $i < $len; ++$i) { - $xor = $this->encryptBlock($iv); - $ciphertext .= $plaintext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; - } - if ($this->continuousBuffer) { - $this->encryptIV = $iv; - } - break; - case self::MODE_OFB: - $xor = $this->encryptIV; - if (\strlen($buffer['xor'])) { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['xor'])) { - $xor = $this->encryptBlock($xor); - $buffer['xor'] .= $xor; - } - $key = Strings::shift($buffer['xor'], $block_size); - $ciphertext .= $block ^ $key; - } - } else { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $xor = $this->encryptBlock($xor); - $ciphertext .= \substr($plaintext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = \strlen($plaintext) % $block_size) { - $buffer['xor'] = \substr($key, $start) . $buffer['xor']; - } - } - break; - case self::MODE_STREAM: - $ciphertext = $this->encryptBlock($plaintext); - break; - } - return $ciphertext; - } - /** - * Decrypts a message. - * - * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until - * it is. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::encrypt() - * @param string $ciphertext - * @return string $plaintext - * @throws \LengthException if we're inside a block cipher and the ciphertext length is not a multiple of the block size - */ - public function decrypt($ciphertext) - { - if ($this->paddable && \strlen($ciphertext) % $this->block_size) { - throw new \LengthException('The ciphertext length (' . \strlen($ciphertext) . ') needs to be a multiple of the block size (' . $this->block_size . ')'); - } - $this->setup(); - if ($this->mode == self::MODE_GCM || isset($this->poly1305Key)) { - if ($this->oldtag === \false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - if (isset($this->poly1305Key)) { - $newtag = $this->poly1305($ciphertext); - } else { - $oldIV = $this->iv; - Strings::increment_str($this->iv); - $cipher = new static('ctr'); - $cipher->setKey($this->key); - $cipher->setIV($this->iv); - $plaintext = $cipher->decrypt($ciphertext); - $s = $this->ghash(self::nullPad128($this->aad) . self::nullPad128($ciphertext) . self::len64($this->aad) . self::len64($ciphertext)); - $cipher->encryptIV = $this->iv = $this->encryptIV = $this->decryptIV = $oldIV; - $newtag = $cipher->encrypt($s); - } - if ($this->oldtag != \substr($newtag, 0, \strlen($newtag))) { - $cipher = clone $this; - unset($cipher->poly1305Key); - $this->usePoly1305 = \false; - $plaintext = $cipher->decrypt($ciphertext); - $this->oldtag = \false; - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - $this->oldtag = \false; - return $plaintext; - } - if ($this->engine === self::ENGINE_OPENSSL) { - switch ($this->mode) { - case self::MODE_STREAM: - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - break; - case self::MODE_ECB: - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - break; - case self::MODE_CBC: - $offset = $this->block_size; - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->decryptIV); - if ($this->continuousBuffer) { - $this->decryptIV = \substr($ciphertext, -$offset, $this->block_size); - } - break; - case self::MODE_CTR: - $plaintext = $this->openssl_ctr_process($ciphertext, $this->decryptIV, $this->debuffer); - break; - case self::MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - $plaintext = ''; - if ($this->continuousBuffer) { - $iv =& $this->decryptIV; - $pos =& $this->debuffer['pos']; - } else { - $iv = $this->decryptIV; - $pos = 0; - } - $len = \strlen($ciphertext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $this->block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize - $plaintext = \substr($iv, $orig_pos) ^ $ciphertext; - $iv = \substr_replace($iv, \substr($ciphertext, 0, $i), $orig_pos, $i); - $ciphertext = \substr($ciphertext, $i); - } - $overflow = $len % $this->block_size; - if ($overflow) { - $plaintext .= \openssl_decrypt(\substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - if ($len - $overflow) { - $iv = \substr($ciphertext, -$overflow - $this->block_size, -$overflow); - } - $iv = \openssl_encrypt(\str_repeat("\x00", $this->block_size), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $plaintext .= $iv ^ \substr($ciphertext, -$overflow); - $iv = \substr_replace($iv, \substr($ciphertext, -$overflow), 0, $overflow); - $pos = $overflow; - } elseif ($len) { - $plaintext .= \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $iv = \substr($ciphertext, -$this->block_size); - } - break; - case self::MODE_CFB8: - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->decryptIV); - if ($this->continuousBuffer) { - if (($len = \strlen($ciphertext)) >= $this->block_size) { - $this->decryptIV = \substr($ciphertext, -$this->block_size); - } else { - $this->decryptIV = \substr($this->decryptIV, $len - $this->block_size) . \substr($ciphertext, -$len); - } - } - break; - case self::MODE_OFB8: - $plaintext = ''; - $len = \strlen($ciphertext); - $iv = $this->decryptIV; - for ($i = 0; $i < $len; ++$i) { - $xor = \openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); - $plaintext .= $ciphertext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; - } - if ($this->continuousBuffer) { - $this->decryptIV = $iv; - } - break; - case self::MODE_OFB: - $plaintext = $this->openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer); - } - return $this->paddable ? $this->unpad($plaintext) : $plaintext; - } - if ($this->engine === self::ENGINE_MCRYPT) { - \set_error_handler(function () { - }); - $block_size = $this->block_size; - if ($this->dechanged) { - \mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); - $this->dechanged = \false; - } - if ($this->mode == self::MODE_CFB && $this->continuousBuffer) { - $iv =& $this->decryptIV; - $pos =& $this->debuffer['pos']; - $len = \strlen($ciphertext); - $plaintext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = \substr($iv, $orig_pos) ^ $ciphertext; - $iv = \substr_replace($iv, \substr($ciphertext, 0, $i), $orig_pos, $i); - } - if ($len >= $block_size) { - $cb = \substr($ciphertext, $i, $len - $len % $block_size); - $plaintext .= \mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; - $iv = \substr($cb, -$block_size); - $len %= $block_size; - } - if ($len) { - $iv = \mcrypt_generic($this->ecb, $iv); - $plaintext .= $iv ^ \substr($ciphertext, -$len); - $iv = \substr_replace($iv, \substr($ciphertext, -$len), 0, $len); - $pos = $len; - } - \restore_error_handler(); - return $plaintext; - } - $plaintext = \mdecrypt_generic($this->demcrypt, $ciphertext); - if (!$this->continuousBuffer) { - \mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); - } - \restore_error_handler(); - return $this->paddable ? $this->unpad($plaintext) : $plaintext; - } - if ($this->engine === self::ENGINE_EVAL) { - $inline = $this->inline_crypt; - return $inline('decrypt', $ciphertext); - } - $block_size = $this->block_size; - $buffer =& $this->debuffer; - $plaintext = ''; - switch ($this->mode) { - case self::MODE_ECB: - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $plaintext .= $this->decryptBlock(\substr($ciphertext, $i, $block_size)); - } - break; - case self::MODE_CBC: - $xor = $this->decryptIV; - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); - $plaintext .= $this->decryptBlock($block) ^ $xor; - $xor = $block; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - } - break; - case self::MODE_CTR: - $xor = $this->decryptIV; - if (\strlen($buffer['ciphertext'])) { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= $this->encryptBlock($xor); - Strings::increment_str($xor); - } - $key = Strings::shift($buffer['ciphertext'], $block_size); - $plaintext .= $block ^ $key; - } - } else { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); - $key = $this->encryptBlock($xor); - Strings::increment_str($xor); - $plaintext .= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = \strlen($ciphertext) % $block_size) { - $buffer['ciphertext'] = \substr($key, $start) . $buffer['ciphertext']; - } - } - break; - case self::MODE_CFB: - if ($this->continuousBuffer) { - $iv =& $this->decryptIV; - $pos =& $buffer['pos']; - } else { - $iv = $this->decryptIV; - $pos = 0; - } - $len = \strlen($ciphertext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = \substr($iv, $orig_pos) ^ $ciphertext; - $iv = \substr_replace($iv, \substr($ciphertext, 0, $i), $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->encryptBlock($iv); - $cb = \substr($ciphertext, $i, $block_size); - $plaintext .= $iv ^ $cb; - $iv = $cb; - $len -= $block_size; - $i += $block_size; - } - if ($len) { - $iv = $this->encryptBlock($iv); - $plaintext .= $iv ^ \substr($ciphertext, $i); - $iv = \substr_replace($iv, \substr($ciphertext, $i), 0, $len); - $pos = $len; - } - break; - case self::MODE_CFB8: - $plaintext = ''; - $len = \strlen($ciphertext); - $iv = $this->decryptIV; - for ($i = 0; $i < $len; ++$i) { - $plaintext .= $ciphertext[$i] ^ $this->encryptBlock($iv); - $iv = \substr($iv, 1) . $ciphertext[$i]; - } - if ($this->continuousBuffer) { - if ($len >= $block_size) { - $this->decryptIV = \substr($ciphertext, -$block_size); - } else { - $this->decryptIV = \substr($this->decryptIV, $len - $block_size) . \substr($ciphertext, -$len); - } - } - break; - case self::MODE_OFB8: - $plaintext = ''; - $len = \strlen($ciphertext); - $iv = $this->decryptIV; - for ($i = 0; $i < $len; ++$i) { - $xor = $this->encryptBlock($iv); - $plaintext .= $ciphertext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; - } - if ($this->continuousBuffer) { - $this->decryptIV = $iv; - } - break; - case self::MODE_OFB: - $xor = $this->decryptIV; - if (\strlen($buffer['xor'])) { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['xor'])) { - $xor = $this->encryptBlock($xor); - $buffer['xor'] .= $xor; - } - $key = Strings::shift($buffer['xor'], $block_size); - $plaintext .= $block ^ $key; - } - } else { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $xor = $this->encryptBlock($xor); - $plaintext .= \substr($ciphertext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = \strlen($ciphertext) % $block_size) { - $buffer['xor'] = \substr($key, $start) . $buffer['xor']; - } - } - break; - case self::MODE_STREAM: - $plaintext = $this->decryptBlock($ciphertext); - break; - } - return $this->paddable ? $this->unpad($plaintext) : $plaintext; - } - /** - * Get the authentication tag - * - * Only used in GCM or Poly1305 mode - * - * @see self::encrypt() - * @param int $length optional - * @return string - * @throws \LengthException if $length isn't of a sufficient length - * @throws \RuntimeException if GCM mode isn't being used - */ - public function getTag($length = 16) - { - if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { - throw new \BadMethodCallException('Authentication tags are only utilized in GCM mode or with Poly1305'); - } - if ($this->newtag === \false) { - throw new \BadMethodCallException('A tag can only be returned after a round of encryption has been performed'); - } - // the tag is 128-bits. it can't be greater than 16 bytes because that's bigger than the tag is. if it - // were 0 you might as well be doing CTR and less than 4 provides minimal security that could be trivially - // easily brute forced. - // see https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=36 - // for more info - if ($length < 4 || $length > 16) { - throw new \LengthException('The authentication tag must be between 4 and 16 bytes long'); - } - return $length == 16 ? $this->newtag : \substr($this->newtag, 0, $length); - } - /** - * Sets the authentication tag - * - * Only used in GCM mode - * - * @see self::decrypt() - * @param string $tag - * @throws \LengthException if $length isn't of a sufficient length - * @throws \RuntimeException if GCM mode isn't being used - */ - public function setTag($tag) - { - if ($this->usePoly1305 && !isset($this->poly1305Key) && \method_exists($this, 'createPoly1305Key')) { - $this->createPoly1305Key(); - } - if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { - throw new \BadMethodCallException('Authentication tags are only utilized in GCM mode or with Poly1305'); - } - $length = \strlen($tag); - if ($length < 4 || $length > 16) { - throw new \LengthException('The authentication tag must be between 4 and 16 bytes long'); - } - $this->oldtag = $tag; - } - /** - * Get the IV - * - * mcrypt requires an IV even if ECB is used - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $iv - * @return string - */ - protected function getIV($iv) - { - return $this->mode == self::MODE_ECB ? \str_repeat("\x00", $this->block_size) : $iv; - } - /** - * OpenSSL CTR Processor - * - * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream - * for CTR is the same for both encrypting and decrypting this function is re-used by both SymmetricKey::encrypt() - * and SymmetricKey::decrypt(). Also, OpenSSL doesn't implement CTR for all of it's symmetric ciphers so this - * function will emulate CTR with ECB when necessary. - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $plaintext - * @param string $encryptIV - * @param array $buffer - * @return string - */ - private function openssl_ctr_process($plaintext, &$encryptIV, &$buffer) - { - $ciphertext = ''; - $block_size = $this->block_size; - $key = $this->key; - if ($this->openssl_emulate_ctr) { - $xor = $encryptIV; - if (\strlen($buffer['ciphertext'])) { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= \openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - } - Strings::increment_str($xor); - $otp = Strings::shift($buffer['ciphertext'], $block_size); - $ciphertext .= $block ^ $otp; - } - } else { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - $otp = \openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - Strings::increment_str($xor); - $ciphertext .= $block ^ $otp; - } - } - if ($this->continuousBuffer) { - $encryptIV = $xor; - if ($start = \strlen($plaintext) % $block_size) { - $buffer['ciphertext'] = \substr($key, $start) . $buffer['ciphertext']; - } - } - return $ciphertext; - } - if (\strlen($buffer['ciphertext'])) { - $ciphertext = $plaintext ^ Strings::shift($buffer['ciphertext'], \strlen($plaintext)); - $plaintext = \substr($plaintext, \strlen($ciphertext)); - if (!\strlen($plaintext)) { - return $ciphertext; - } - } - $overflow = \strlen($plaintext) % $block_size; - if ($overflow) { - $plaintext2 = Strings::pop($plaintext, $overflow); - // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 - $encrypted = \openssl_encrypt($plaintext . \str_repeat("\x00", $block_size), $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); - $temp = Strings::pop($encrypted, $block_size); - $ciphertext .= $encrypted . ($plaintext2 ^ $temp); - if ($this->continuousBuffer) { - $buffer['ciphertext'] = \substr($temp, $overflow); - $encryptIV = $temp; - } - } elseif (!\strlen($buffer['ciphertext'])) { - $ciphertext .= \openssl_encrypt($plaintext . \str_repeat("\x00", $block_size), $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); - $temp = Strings::pop($ciphertext, $block_size); - if ($this->continuousBuffer) { - $encryptIV = $temp; - } - } - if ($this->continuousBuffer) { - $encryptIV = \openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); - if ($overflow) { - Strings::increment_str($encryptIV); - } - } - return $ciphertext; - } - /** - * OpenSSL OFB Processor - * - * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream - * for OFB is the same for both encrypting and decrypting this function is re-used by both SymmetricKey::encrypt() - * and SymmetricKey::decrypt(). - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $plaintext - * @param string $encryptIV - * @param array $buffer - * @return string - */ - private function openssl_ofb_process($plaintext, &$encryptIV, &$buffer) - { - if (\strlen($buffer['xor'])) { - $ciphertext = $plaintext ^ $buffer['xor']; - $buffer['xor'] = \substr($buffer['xor'], \strlen($ciphertext)); - $plaintext = \substr($plaintext, \strlen($ciphertext)); - } else { - $ciphertext = ''; - } - $block_size = $this->block_size; - $len = \strlen($plaintext); - $key = $this->key; - $overflow = $len % $block_size; - if (\strlen($plaintext)) { - if ($overflow) { - $ciphertext .= \openssl_encrypt(\substr($plaintext, 0, -$overflow) . \str_repeat("\x00", $block_size), $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); - $xor = Strings::pop($ciphertext, $block_size); - if ($this->continuousBuffer) { - $encryptIV = $xor; - } - $ciphertext .= Strings::shift($xor, $overflow) ^ \substr($plaintext, -$overflow); - if ($this->continuousBuffer) { - $buffer['xor'] = $xor; - } - } else { - $ciphertext = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); - if ($this->continuousBuffer) { - $encryptIV = \substr($ciphertext, -$block_size) ^ \substr($plaintext, -$block_size); - } - } - } - return $ciphertext; - } - /** - * phpseclib <-> OpenSSL Mode Mapper - * - * May need to be overwritten by classes extending this one in some cases - * - * @return string - */ - protected function openssl_translate_mode() - { - switch ($this->mode) { - case self::MODE_ECB: - return 'ecb'; - case self::MODE_CBC: - return 'cbc'; - case self::MODE_CTR: - case self::MODE_GCM: - return 'ctr'; - case self::MODE_CFB: - return 'cfb'; - case self::MODE_CFB8: - return 'cfb8'; - case self::MODE_OFB: - return 'ofb'; - } - } - /** - * Pad "packets". - * - * Block ciphers working by encrypting between their specified [$this->]block_size at a time - * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to - * pad the input so that it is of the proper length. - * - * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, - * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping - * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is - * transmitted separately) - * - * @see self::disablePadding() - */ - public function enablePadding() - { - $this->padding = \true; - } - /** - * Do not pad packets. - * - * @see self::enablePadding() - */ - public function disablePadding() - { - $this->padding = \false; - } - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->encrypt(substr($plaintext, 16, 16)); - * - * - * echo $rijndael->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the \phpseclib3\Crypt\*() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::disableContinuousBuffer() - */ - public function enableContinuousBuffer() - { - if ($this->mode == self::MODE_ECB) { - return; - } - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('This mode does not run in continuous mode'); - } - $this->continuousBuffer = \true; - $this->setEngine(); - } - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::enableContinuousBuffer() - */ - public function disableContinuousBuffer() - { - if ($this->mode == self::MODE_ECB) { - return; - } - if (!$this->continuousBuffer) { - return; - } - $this->continuousBuffer = \false; - $this->setEngine(); - } - /** - * Test for engine validity - * - * @see self::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_OPENSSL: - $this->openssl_emulate_ctr = \false; - $result = $this->cipher_name_openssl && \extension_loaded('openssl'); - if (!$result) { - return \false; - } - $methods = \openssl_get_cipher_methods(); - if (\in_array($this->cipher_name_openssl, $methods)) { - return \true; - } - // not all of openssl's symmetric cipher's support ctr. for those - // that don't we'll emulate it - switch ($this->mode) { - case self::MODE_CTR: - if (\in_array($this->cipher_name_openssl_ecb, $methods)) { - $this->openssl_emulate_ctr = \true; - return \true; - } - } - return \false; - case self::ENGINE_MCRYPT: - \set_error_handler(function () { - }); - $result = $this->cipher_name_mcrypt && \extension_loaded('mcrypt') && \in_array($this->cipher_name_mcrypt, \mcrypt_list_algorithms()); - \restore_error_handler(); - return $result; - case self::ENGINE_EVAL: - return \method_exists($this, 'setupInlineCrypt'); - case self::ENGINE_INTERNAL: - return \true; - } - return \false; - } - /** - * Test for engine validity - * - * @see self::__construct() - * @param string $engine - * @return bool - */ - public function isValidEngine($engine) - { - static $reverseMap; - if (!isset($reverseMap)) { - $reverseMap = \array_map('strtolower', self::ENGINE_MAP); - $reverseMap = \array_flip($reverseMap); - } - $engine = \strtolower($engine); - if (!isset($reverseMap[$engine])) { - return \false; - } - return $this->isValidEngineHelper($reverseMap[$engine]); - } - /** - * Sets the preferred crypt engine - * - * Currently, $engine could be: - * - * - libsodium[very fast] - * - * - OpenSSL [very fast] - * - * - mcrypt [fast] - * - * - Eval [slow] - * - * - PHP [slowest] - * - * If the preferred crypt engine is not available the fastest available one will be used - * - * @see self::__construct() - * @param string $engine - */ - public function setPreferredEngine($engine) - { - static $reverseMap; - if (!isset($reverseMap)) { - $reverseMap = \array_map('strtolower', self::ENGINE_MAP); - $reverseMap = \array_flip($reverseMap); - } - $engine = \is_string($engine) ? \strtolower($engine) : ''; - $this->preferredEngine = isset($reverseMap[$engine]) ? $reverseMap[$engine] : self::ENGINE_LIBSODIUM; - $this->setEngine(); - } - /** - * Returns the engine currently being utilized - * - * @see self::setEngine() - */ - public function getEngine() - { - return self::ENGINE_MAP[$this->engine]; - } - /** - * Sets the engine as appropriate - * - * @see self::__construct() - */ - protected function setEngine() - { - $this->engine = null; - $candidateEngines = [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM, self::ENGINE_OPENSSL, self::ENGINE_MCRYPT, self::ENGINE_EVAL]; - if (isset($this->preferredEngine)) { - $temp = [$this->preferredEngine]; - $candidateEngines = \array_merge($temp, \array_diff($candidateEngines, $temp)); - } - foreach ($candidateEngines as $engine) { - if ($this->isValidEngineHelper($engine)) { - $this->engine = $engine; - break; - } - } - if (!$this->engine) { - $this->engine = self::ENGINE_INTERNAL; - } - if ($this->engine != self::ENGINE_MCRYPT && $this->enmcrypt) { - \set_error_handler(function () { - }); - // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, - // (re)open them with the module named in $this->cipher_name_mcrypt - \mcrypt_module_close($this->enmcrypt); - \mcrypt_module_close($this->demcrypt); - $this->enmcrypt = null; - $this->demcrypt = null; - if ($this->ecb) { - \mcrypt_module_close($this->ecb); - $this->ecb = null; - } - \restore_error_handler(); - } - $this->changed = $this->nonIVChanged = \true; - } - /** - * Encrypts a block - * - * Note: Must be extended by the child \phpseclib3\Crypt\* class - * - * @param string $in - * @return string - */ - protected abstract function encryptBlock($in); - /** - * Decrypts a block - * - * Note: Must be extended by the child \phpseclib3\Crypt\* class - * - * @param string $in - * @return string - */ - protected abstract function decryptBlock($in); - /** - * Setup the key (expansion) - * - * Only used if $engine == self::ENGINE_INTERNAL - * - * Note: Must extend by the child \phpseclib3\Crypt\* class - * - * @see self::setup() - */ - protected abstract function setupKey(); - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine and flush all $buffers - * Used (only) if $engine == self::ENGINE_INTERNAL - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * {@internal setup() is always called before en/decryption.} - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::setKey() - * @see self::setIV() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - $this->changed = \false; - if ($this->usePoly1305 && !isset($this->poly1305Key) && \method_exists($this, 'createPoly1305Key')) { - $this->createPoly1305Key(); - } - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => \true]; - //$this->newtag = $this->oldtag = false; - if ($this->usesNonce()) { - if ($this->nonce === \false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - if ($this->mode == self::MODE_GCM && !\in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { - $this->setupGCM(); - } - } else { - $this->iv = $this->origIV; - } - if ($this->iv === \false && !\in_array($this->mode, [self::MODE_STREAM, self::MODE_ECB])) { - if ($this->mode != self::MODE_GCM || !\in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { - throw new InsufficientSetupException('No IV has been defined'); - } - } - if ($this->key === \false) { - throw new InsufficientSetupException('No key has been defined'); - } - $this->encryptIV = $this->decryptIV = $this->iv; - switch ($this->engine) { - case self::ENGINE_MCRYPT: - $this->enchanged = $this->dechanged = \true; - \set_error_handler(function () { - }); - if (!isset($this->enmcrypt)) { - static $mcrypt_modes = [self::MODE_CTR => 'ctr', self::MODE_ECB => \MCRYPT_MODE_ECB, self::MODE_CBC => \MCRYPT_MODE_CBC, self::MODE_CFB => 'ncfb', self::MODE_CFB8 => \MCRYPT_MODE_CFB, self::MODE_OFB => \MCRYPT_MODE_NOFB, self::MODE_OFB8 => \MCRYPT_MODE_OFB, self::MODE_STREAM => \MCRYPT_MODE_STREAM]; - $this->demcrypt = \mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - $this->enmcrypt = \mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() - // to workaround mcrypt's broken ncfb implementation in buffered mode - // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - if ($this->mode == self::MODE_CFB) { - $this->ecb = \mcrypt_module_open($this->cipher_name_mcrypt, '', \MCRYPT_MODE_ECB, ''); - } - } - // else should mcrypt_generic_deinit be called? - if ($this->mode == self::MODE_CFB) { - \mcrypt_generic_init($this->ecb, $this->key, \str_repeat("\x00", $this->block_size)); - } - \restore_error_handler(); - break; - case self::ENGINE_INTERNAL: - $this->setupKey(); - break; - case self::ENGINE_EVAL: - if ($this->nonIVChanged) { - $this->setupKey(); - $this->setupInlineCrypt(); - } - } - $this->nonIVChanged = \false; - } - /** - * Pads a string - * - * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. - * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to - * chr($this->block_size - (strlen($text) % $this->block_size) - * - * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless - * and padding will, hence forth, be enabled. - * - * @see self::unpad() - * @param string $text - * @throws \LengthException if padding is disabled and the plaintext's length is not a multiple of the block size - * @return string - */ - protected function pad($text) - { - $length = \strlen($text); - if (!$this->padding) { - if ($length % $this->block_size == 0) { - return $text; - } else { - throw new \LengthException("The plaintext's length ({$length}) is not a multiple of the block size ({$this->block_size}). Try enabling padding."); - } - } - $pad = $this->block_size - $length % $this->block_size; - return \str_pad($text, $length + $pad, \chr($pad)); - } - /** - * Unpads a string. - * - * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong - * and false will be returned. - * - * @see self::pad() - * @param string $text - * @throws \LengthException if the ciphertext's length is not a multiple of the block size - * @return string - */ - protected function unpad($text) - { - if (!$this->padding) { - return $text; - } - $length = \ord($text[\strlen($text) - 1]); - if (!$length || $length > $this->block_size) { - throw new BadDecryptionException("The ciphertext has an invalid padding length ({$length}) compared to the block size ({$this->block_size})"); - } - return \substr($text, 0, -$length); - } - /** - * Setup the performance-optimized function for de/encrypt() - * - * Stores the created (or existing) callback function-name - * in $this->inline_crypt - * - * Internally for phpseclib developers: - * - * _setupInlineCrypt() would be called only if: - * - * - $this->engine === self::ENGINE_EVAL - * - * - each time on _setup(), after(!) _setupKey() - * - * - * This ensures that _setupInlineCrypt() has always a - * full ready2go initializated internal cipher $engine state - * where, for example, the keys already expanded, - * keys/block_size calculated and such. - * - * It is, each time if called, the responsibility of _setupInlineCrypt(): - * - * - to set $this->inline_crypt to a valid and fully working callback function - * as a (faster) replacement for encrypt() / decrypt() - * - * - NOT to create unlimited callback functions (for memory reasons!) - * no matter how often _setupInlineCrypt() would be called. At some - * point of amount they must be generic re-useable. - * - * - the code of _setupInlineCrypt() it self, - * and the generated callback code, - * must be, in following order: - * - 100% safe - * - 100% compatible to encrypt()/decrypt() - * - using only php5+ features/lang-constructs/php-extensions if - * compatibility (down to php4) or fallback is provided - * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) - * - >= 10% faster than encrypt()/decrypt() [which is, by the way, - * the reason for the existence of _setupInlineCrypt() :-)] - * - memory-nice - * - short (as good as possible) - * - * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. - * - In case of using inline crypting, _setupInlineCrypt() must extend by the child \phpseclib3\Crypt\* class. - * - The following variable names are reserved: - * - $_* (all variable names prefixed with an underscore) - * - $self (object reference to it self. Do not use $this, but $self instead) - * - $in (the content of $in has to en/decrypt by the generated code) - * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only - * - * {@internal If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt()} - * - * @see self::setup() - * @see self::createInlineCryptFunction() - * @see self::encrypt() - * @see self::decrypt() - */ - //protected function setupInlineCrypt(); - /** - * Creates the performance-optimized function for en/decrypt() - * - * Internally for phpseclib developers: - * - * _createInlineCryptFunction(): - * - * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] - * with the current [$this->]mode of operation code - * - * - create the $inline function, which called by encrypt() / decrypt() - * as its replacement to speed up the en/decryption operations. - * - * - return the name of the created $inline callback function - * - * - used to speed up en/decryption - * - * - * - * The main reason why can speed up things [up to 50%] this way are: - * - * - using variables more effective then regular. - * (ie no use of expensive arrays but integers $k_0, $k_1 ... - * or even, for example, the pure $key[] values hardcoded) - * - * - avoiding 1000's of function calls of ie _encryptBlock() - * but inlining the crypt operations. - * in the mode of operation for() loop. - * - * - full loop unroll the (sometimes key-dependent) rounds - * avoiding this way ++$i counters and runtime-if's etc... - * - * The basic code architectur of the generated $inline en/decrypt() - * lambda function, in pseudo php, is: - * - * - * +----------------------------------------------------------------------------------------------+ - * | callback $inline = create_function: | - * | lambda_function_0001_crypt_ECB($action, $text) | - * | { | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_crypt']; // general init code. | - * | // ie: $sbox'es declarations used for | - * | // encrypt and decrypt'ing. | - * | | - * | switch ($action) { | - * | case 'encrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | - * | ie: specified $key or $box | - * | declarations for encrypt'ing. | - * | | - * | foreach ($ciphertext) { | - * | $in = $block_size of $ciphertext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for encryption. | - * | // $cipher_code['encrypt_block'] has to | - * | // encrypt the content of the $in variable | - * | | - * | $plaintext .= $in; | - * | } | - * | return $plaintext; | - * | | - * | case 'decrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_decrypt']; // decrypt sepcific init code | - * | ie: specified $key or $box | - * | declarations for decrypt'ing. | - * | foreach ($plaintext) { | - * | $in = $block_size of $plaintext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for decryption. | - * | // $cipher_code['decrypt_block'] has to | - * | // decrypt the content of the $in variable | - * | $ciphertext .= $in; | - * | } | - * | return $ciphertext; | - * | } | - * | } | - * +----------------------------------------------------------------------------------------------+ - * - * - * See also the \phpseclib3\Crypt\*::_setupInlineCrypt()'s for - * productive inline $cipher_code's how they works. - * - * Structure of: - * - * $cipher_code = [ - * 'init_crypt' => (string) '', // optional - * 'init_encrypt' => (string) '', // optional - * 'init_decrypt' => (string) '', // optional - * 'encrypt_block' => (string) '', // required - * 'decrypt_block' => (string) '' // required - * ]; - * - * - * @see self::setupInlineCrypt() - * @see self::encrypt() - * @see self::decrypt() - * @param array $cipher_code - * @return string (the name of the created callback function) - */ - protected function createInlineCryptFunction($cipher_code) - { - $block_size = $this->block_size; - // optional - $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; - $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; - $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; - // required - $encrypt_block = $cipher_code['encrypt_block']; - $decrypt_block = $cipher_code['decrypt_block']; - // Generating mode of operation inline code, - // merged with the $cipher_code algorithm - // for encrypt- and decryption. - switch ($this->mode) { - case self::MODE_ECB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $in = substr($_text, $_i, ' . $block_size . '); - ' . $encrypt_block . ' - $_ciphertext.= $in; - } - - return $_ciphertext; - '; - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + (' . $block_size . ' - strlen($_text) % ' . $block_size . ') % ' . $block_size . ', chr(0)); - $_ciphertext_len = strlen($_text); - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $in = substr($_text, $_i, ' . $block_size . '); - ' . $decrypt_block . ' - $_plaintext.= $in; - } - - return $this->unpad($_plaintext); - '; - break; - case self::MODE_CTR: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $this->encryptIV; - $_buffer = &$this->enbuffer; - if (strlen($_buffer["ciphertext"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["ciphertext"])) { - $in = $_xor; - ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); - $_buffer["ciphertext"].= $in; - } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - $in = $_xor; - ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); - $_key = $in; - $_ciphertext.= $_block ^ $_key; - } - } - if ($this->continuousBuffer) { - $this->encryptIV = $_xor; - if ($_start = $_plaintext_len % ' . $block_size . ') { - $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; - } - } - - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $this->decryptIV; - $_buffer = &$this->debuffer; - - if (strlen($_buffer["ciphertext"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["ciphertext"])) { - $in = $_xor; - ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); - $_buffer["ciphertext"].= $in; - } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - $in = $_xor; - ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); - $_key = $in; - $_plaintext.= $_block ^ $_key; - } - } - if ($this->continuousBuffer) { - $this->decryptIV = $_xor; - if ($_start = $_ciphertext_len % ' . $block_size . ') { - $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; - } - } - - return $_plaintext; - '; - break; - case self::MODE_CFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_buffer = &$this->enbuffer; - - if ($this->continuousBuffer) { - $_iv = &$this->encryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $this->encryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = ' . $block_size . ' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); - } - while ($_len >= ' . $block_size . ') { - $in = $_iv; - ' . $encrypt_block . '; - $_iv = $in ^ substr($_text, $_i, ' . $block_size . '); - $_ciphertext.= $_iv; - $_len-= ' . $block_size . '; - $_i+= ' . $block_size . '; - } - if ($_len) { - $in = $_iv; - ' . $encrypt_block . ' - $_iv = $in; - $_block = $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, $_block, 0, $_len); - $_ciphertext.= $_block; - $_pos = $_len; - } - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_buffer = &$this->debuffer; - - if ($this->continuousBuffer) { - $_iv = &$this->decryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $this->decryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = ' . $block_size . ' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_plaintext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); - } - while ($_len >= ' . $block_size . ') { - $in = $_iv; - ' . $encrypt_block . ' - $_iv = $in; - $cb = substr($_text, $_i, ' . $block_size . '); - $_plaintext.= $_iv ^ $cb; - $_iv = $cb; - $_len-= ' . $block_size . '; - $_i+= ' . $block_size . '; - } - if ($_len) { - $in = $_iv; - ' . $encrypt_block . ' - $_iv = $in; - $_plaintext.= $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); - $_pos = $_len; - } - - return $_plaintext; - '; - break; - case self::MODE_CFB8: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_len = strlen($_text); - $_iv = $this->encryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_ciphertext .= ($_c = $_text[$_i] ^ $in); - $_iv = substr($_iv, 1) . $_c; - } - - if ($this->continuousBuffer) { - if ($_len >= ' . $block_size . ') { - $this->encryptIV = substr($_ciphertext, -' . $block_size . '); - } else { - $this->encryptIV = substr($this->encryptIV, $_len - ' . $block_size . ') . substr($_ciphertext, -$_len); - } - } - - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_len = strlen($_text); - $_iv = $this->decryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_plaintext .= $_text[$_i] ^ $in; - $_iv = substr($_iv, 1) . $_text[$_i]; - } - - if ($this->continuousBuffer) { - if ($_len >= ' . $block_size . ') { - $this->decryptIV = substr($_text, -' . $block_size . '); - } else { - $this->decryptIV = substr($this->decryptIV, $_len - ' . $block_size . ') . substr($_text, -$_len); - } - } - - return $_plaintext; - '; - break; - case self::MODE_OFB8: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_len = strlen($_text); - $_iv = $this->encryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_ciphertext.= $_text[$_i] ^ $in; - $_iv = substr($_iv, 1) . $in[0]; - } - - if ($this->continuousBuffer) { - $this->encryptIV = $_iv; - } - - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_len = strlen($_text); - $_iv = $this->decryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_plaintext.= $_text[$_i] ^ $in; - $_iv = substr($_iv, 1) . $in[0]; - } - - if ($this->continuousBuffer) { - $this->decryptIV = $_iv; - } - - return $_plaintext; - '; - break; - case self::MODE_OFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $this->encryptIV; - $_buffer = &$this->enbuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["xor"], ' . $block_size . '); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_ciphertext.= substr($_text, $_i, ' . $block_size . ') ^ $_xor; - } - $_key = $_xor; - } - if ($this->continuousBuffer) { - $this->encryptIV = $_xor; - if ($_start = $_plaintext_len % ' . $block_size . ') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $this->decryptIV; - $_buffer = &$this->debuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["xor"], ' . $block_size . '); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_plaintext.= substr($_text, $_i, ' . $block_size . ') ^ $_xor; - } - $_key = $_xor; - } - if ($this->continuousBuffer) { - $this->decryptIV = $_xor; - if ($_start = $_ciphertext_len % ' . $block_size . ') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_plaintext; - '; - break; - case self::MODE_STREAM: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - ' . $encrypt_block . ' - return $_ciphertext; - '; - $decrypt = $init_decrypt . ' - $_plaintext = ""; - ' . $decrypt_block . ' - return $_plaintext; - '; - break; - // case self::MODE_CBC: - default: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - - $in = $this->encryptIV; - - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $in = substr($_text, $_i, ' . $block_size . ') ^ $in; - ' . $encrypt_block . ' - $_ciphertext.= $in; - } - - if ($this->continuousBuffer) { - $this->encryptIV = $in; - } - - return $_ciphertext; - '; - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + (' . $block_size . ' - strlen($_text) % ' . $block_size . ') % ' . $block_size . ', chr(0)); - $_ciphertext_len = strlen($_text); - - $_iv = $this->decryptIV; - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $in = $_block = substr($_text, $_i, ' . $block_size . '); - ' . $decrypt_block . ' - $_plaintext.= $in ^ $_iv; - $_iv = $_block; - } - - if ($this->continuousBuffer) { - $this->decryptIV = $_iv; - } - - return $this->unpad($_plaintext); - '; - break; - } - // Before discrediting this, please read the following: - // @see https://github.com/phpseclib/phpseclib/issues/1293 - // @see https://github.com/phpseclib/phpseclib/pull/1143 - eval('$func = function ($_action, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }};'); - return \Closure::bind($func, $this, static::class); - } - /** - * Convert float to int - * - * On ARM CPUs converting floats to ints doesn't always work - * - * @param string $x - * @return int - */ - protected static function safe_intval($x) - { - if (\is_int($x)) { - return $x; - } - if (self::$use_reg_intval) { - return \PHP_INT_SIZE == 4 && \PHP_VERSION_ID >= 80100 ? \intval($x) : $x; - } - return \fmod($x, 0x80000000) & 0x7fffffff | (\fmod(\floor($x / 0x80000000), 2) & 1) << 31; - } - /** - * eval()'able string for in-line float to int - * - * @return string - */ - protected static function safe_intval_inline() - { - if (self::$use_reg_intval) { - return \PHP_INT_SIZE == 4 && \PHP_VERSION_ID >= 80100 ? 'intval(%s)' : '%s'; - } - $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | '; - return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))'; - } - /** - * Sets up GCM parameters - * - * See steps 1-2 of https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=23 - * for more info - * - */ - private function setupGCM() - { - // don't keep on re-calculating $this->h - if (!$this->h || $this->hKey != $this->key) { - $cipher = new static('ecb'); - $cipher->setKey($this->key); - $cipher->disablePadding(); - $this->h = self::$gcmField->newInteger(Strings::switchEndianness($cipher->encrypt("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"))); - $this->hKey = $this->key; - } - if (\strlen($this->nonce) == 12) { - $this->iv = $this->nonce . "\x00\x00\x00\x01"; - } else { - $this->iv = $this->ghash(self::nullPad128($this->nonce) . \str_repeat("\x00", 8) . self::len64($this->nonce)); - } - } - /** - * Performs GHASH operation - * - * See https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=20 - * for more info - * - * @see self::decrypt() - * @see self::encrypt() - * @param string $x - * @return string - */ - private function ghash($x) - { - $h = $this->h; - $y = ["\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"]; - $x = \str_split($x, 16); - $n = 0; - // the switchEndianness calls are necessary because the multiplication algorithm in BinaryField/Integer - // interprets strings as polynomials in big endian order whereas in GCM they're interpreted in little - // endian order per https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=19. - // big endian order is what binary field elliptic curves use per http://www.secg.org/sec1-v2.pdf#page=18. - // we could switchEndianness here instead of in the while loop but doing so in the while loop seems like it - // might be slightly more performant - //$x = Strings::switchEndianness($x); - foreach ($x as $xn) { - $xn = Strings::switchEndianness($xn); - $t = $y[$n] ^ $xn; - $temp = self::$gcmField->newInteger($t); - $y[++$n] = $temp->multiply($h)->toBytes(); - $y[$n] = \substr($y[$n], 1); - } - $y[$n] = Strings::switchEndianness($y[$n]); - return $y[$n]; - } - /** - * Returns the bit length of a string in a packed format - * - * @see self::decrypt() - * @see self::encrypt() - * @see self::setupGCM() - * @param string $str - * @return string - */ - private static function len64($str) - { - return "\x00\x00\x00\x00" . \pack('N', 8 * \strlen($str)); - } - /** - * NULL pads a string to be a multiple of 128 - * - * @see self::decrypt() - * @see self::encrypt() - * @see self::setupGCM() - * @param string $str - * @return string - */ - protected static function nullPad128($str) - { - $len = \strlen($str); - return $str . \str_repeat("\x00", 16 * \ceil($len / 16) - $len); - } - /** - * Calculates Poly1305 MAC - * - * On my system ChaCha20, with libsodium, takes 0.5s. With this custom Poly1305 implementation - * it takes 1.2s. - * - * @see self::decrypt() - * @see self::encrypt() - * @param string $text - * @return string - */ - protected function poly1305($text) - { - $s = $this->poly1305Key; - // strlen($this->poly1305Key) == 32 - $r = Strings::shift($s, 16); - $r = \strrev($r); - $r &= "\x0f\xff\xff\xfc\x0f\xff\xff\xfc\x0f\xff\xff\xfc\x0f\xff\xff\xff"; - $s = \strrev($s); - $r = self::$poly1305Field->newInteger(new BigInteger($r, 256)); - $s = self::$poly1305Field->newInteger(new BigInteger($s, 256)); - $a = self::$poly1305Field->newInteger(new BigInteger()); - $blocks = \str_split($text, 16); - foreach ($blocks as $block) { - $n = \strrev($block . \chr(1)); - $n = self::$poly1305Field->newInteger(new BigInteger($n, 256)); - $a = $a->add($n); - $a = $a->multiply($r); - } - $r = $a->toBigInteger()->add($s->toBigInteger()); - $mask = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; - return \strrev($r->toBytes()) & $mask; - } - /** - * Return the mode - * - * You can do $obj instanceof AES or whatever to get the cipher but you can't do that to get the mode - * - * @return string - */ - public function getMode() - { - return \array_flip(self::MODE_MAP)[$this->mode]; - } - /** - * Is the continuous buffer enabled? - * - * @return boolean - */ - public function continuousBufferEnabled() - { - return $this->continuousBuffer; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php deleted file mode 100644 index 6a18937..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Traits; - -use phpseclib3\Crypt\Hash; -/** - * Fingerprint Trait for Private Keys - * - * @author Jim Wigginton - */ -trait Fingerprint -{ - /** - * Returns the public key's fingerprint - * - * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is - * no public key currently loaded, false is returned. - * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716) - * - * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned - * for invalid values. - * @return mixed - */ - public function getFingerprint($algorithm = 'md5') - { - $type = self::validatePlugin('Keys', 'OpenSSH', 'savePublicKey'); - if ($type === \false) { - return \false; - } - $key = $this->toString('OpenSSH', ['binary' => \true]); - if ($key === \false) { - return \false; - } - switch ($algorithm) { - case 'sha256': - $hash = new Hash('sha256'); - $base = \base64_encode($hash->hash($key)); - return \substr($base, 0, \strlen($base) - 1); - case 'md5': - return \substr(\chunk_split(\md5($key), 2, ':'), 0, -1); - default: - return \false; - } - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php deleted file mode 100644 index 20cfcec..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\Common\Traits; - -/** - * Password Protected Trait for Private Keys - * - * @author Jim Wigginton - */ -trait PasswordProtected -{ - /** - * Password - * - * @var string|bool - */ - private $password = \false; - /** - * Sets the password - * - * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. - * Or rather, pass in $password such that empty($password) && !is_string($password) is true. - * - * @see self::createKey() - * @see self::load() - * @param string|bool $password - */ - public function withPassword($password = \false) - { - $new = clone $this; - $new->password = $password; - return $new; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DES.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DES.php deleted file mode 100644 index 1295266..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DES.php +++ /dev/null @@ -1,522 +0,0 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\BlockCipher; -use phpseclib3\Exception\BadModeException; -/** - * Pure-PHP implementation of DES. - * - * @author Jim Wigginton - */ -class DES extends BlockCipher -{ - /** - * Contains $keys[self::ENCRYPT] - * - * @see \phpseclib3\Crypt\DES::setupKey() - * @see \phpseclib3\Crypt\DES::processBlock() - */ - const ENCRYPT = 0; - /** - * Contains $keys[self::DECRYPT] - * - * @see \phpseclib3\Crypt\DES::setupKey() - * @see \phpseclib3\Crypt\DES::processBlock() - */ - const DECRYPT = 1; - /** - * Block Length of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 8; - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setKeyLength() - * @var int - */ - protected $key_length = 8; - /** - * The mcrypt specific name of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'des'; - /** - * The OpenSSL names of the cipher / modes - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::openssl_mode_names - * @var array - */ - protected $openssl_mode_names = [self::MODE_ECB => 'des-ecb', self::MODE_CBC => 'des-cbc', self::MODE_CFB => 'des-cfb', self::MODE_OFB => 'des-ofb']; - /** - * Optimizing value while CFB-encrypting - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 500; - /** - * Switch for DES/3DES encryption - * - * Used only if $engine == self::ENGINE_INTERNAL - * - * @see self::setupKey() - * @see self::processBlock() - * @var int - */ - protected $des_rounds = 1; - /** - * max possible size of $key - * - * @see self::setKey() - * @var string - */ - protected $key_length_max = 8; - /** - * The Key Schedule - * - * @see self::setupKey() - * @var array - */ - private $keys; - /** - * Key Cache "key" - * - * @see self::setupKey() - * @var array - */ - private $kl; - /** - * Shuffle table. - * - * For each byte value index, the entry holds an 8-byte string - * with each byte containing all bits in the same state as the - * corresponding bit in the index value. - * - * @see self::processBlock() - * @see self::setupKey() - * @var array - */ - protected static $shuffle = ["\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xff", "\x00\x00\x00\x00\x00\x00\xff\x00", "\x00\x00\x00\x00\x00\x00\xff\xff", "\x00\x00\x00\x00\x00\xff\x00\x00", "\x00\x00\x00\x00\x00\xff\x00\xff", "\x00\x00\x00\x00\x00\xff\xff\x00", "\x00\x00\x00\x00\x00\xff\xff\xff", "\x00\x00\x00\x00\xff\x00\x00\x00", "\x00\x00\x00\x00\xff\x00\x00\xff", "\x00\x00\x00\x00\xff\x00\xff\x00", "\x00\x00\x00\x00\xff\x00\xff\xff", "\x00\x00\x00\x00\xff\xff\x00\x00", "\x00\x00\x00\x00\xff\xff\x00\xff", "\x00\x00\x00\x00\xff\xff\xff\x00", "\x00\x00\x00\x00\xff\xff\xff\xff", "\x00\x00\x00\xff\x00\x00\x00\x00", "\x00\x00\x00\xff\x00\x00\x00\xff", "\x00\x00\x00\xff\x00\x00\xff\x00", "\x00\x00\x00\xff\x00\x00\xff\xff", "\x00\x00\x00\xff\x00\xff\x00\x00", "\x00\x00\x00\xff\x00\xff\x00\xff", "\x00\x00\x00\xff\x00\xff\xff\x00", "\x00\x00\x00\xff\x00\xff\xff\xff", "\x00\x00\x00\xff\xff\x00\x00\x00", "\x00\x00\x00\xff\xff\x00\x00\xff", "\x00\x00\x00\xff\xff\x00\xff\x00", "\x00\x00\x00\xff\xff\x00\xff\xff", "\x00\x00\x00\xff\xff\xff\x00\x00", "\x00\x00\x00\xff\xff\xff\x00\xff", "\x00\x00\x00\xff\xff\xff\xff\x00", "\x00\x00\x00\xff\xff\xff\xff\xff", "\x00\x00\xff\x00\x00\x00\x00\x00", "\x00\x00\xff\x00\x00\x00\x00\xff", "\x00\x00\xff\x00\x00\x00\xff\x00", "\x00\x00\xff\x00\x00\x00\xff\xff", "\x00\x00\xff\x00\x00\xff\x00\x00", "\x00\x00\xff\x00\x00\xff\x00\xff", "\x00\x00\xff\x00\x00\xff\xff\x00", "\x00\x00\xff\x00\x00\xff\xff\xff", "\x00\x00\xff\x00\xff\x00\x00\x00", "\x00\x00\xff\x00\xff\x00\x00\xff", "\x00\x00\xff\x00\xff\x00\xff\x00", "\x00\x00\xff\x00\xff\x00\xff\xff", "\x00\x00\xff\x00\xff\xff\x00\x00", "\x00\x00\xff\x00\xff\xff\x00\xff", "\x00\x00\xff\x00\xff\xff\xff\x00", "\x00\x00\xff\x00\xff\xff\xff\xff", "\x00\x00\xff\xff\x00\x00\x00\x00", "\x00\x00\xff\xff\x00\x00\x00\xff", "\x00\x00\xff\xff\x00\x00\xff\x00", "\x00\x00\xff\xff\x00\x00\xff\xff", "\x00\x00\xff\xff\x00\xff\x00\x00", "\x00\x00\xff\xff\x00\xff\x00\xff", "\x00\x00\xff\xff\x00\xff\xff\x00", "\x00\x00\xff\xff\x00\xff\xff\xff", "\x00\x00\xff\xff\xff\x00\x00\x00", "\x00\x00\xff\xff\xff\x00\x00\xff", "\x00\x00\xff\xff\xff\x00\xff\x00", "\x00\x00\xff\xff\xff\x00\xff\xff", "\x00\x00\xff\xff\xff\xff\x00\x00", "\x00\x00\xff\xff\xff\xff\x00\xff", "\x00\x00\xff\xff\xff\xff\xff\x00", "\x00\x00\xff\xff\xff\xff\xff\xff", "\x00\xff\x00\x00\x00\x00\x00\x00", "\x00\xff\x00\x00\x00\x00\x00\xff", "\x00\xff\x00\x00\x00\x00\xff\x00", "\x00\xff\x00\x00\x00\x00\xff\xff", "\x00\xff\x00\x00\x00\xff\x00\x00", "\x00\xff\x00\x00\x00\xff\x00\xff", "\x00\xff\x00\x00\x00\xff\xff\x00", "\x00\xff\x00\x00\x00\xff\xff\xff", "\x00\xff\x00\x00\xff\x00\x00\x00", "\x00\xff\x00\x00\xff\x00\x00\xff", "\x00\xff\x00\x00\xff\x00\xff\x00", "\x00\xff\x00\x00\xff\x00\xff\xff", "\x00\xff\x00\x00\xff\xff\x00\x00", "\x00\xff\x00\x00\xff\xff\x00\xff", "\x00\xff\x00\x00\xff\xff\xff\x00", "\x00\xff\x00\x00\xff\xff\xff\xff", "\x00\xff\x00\xff\x00\x00\x00\x00", "\x00\xff\x00\xff\x00\x00\x00\xff", "\x00\xff\x00\xff\x00\x00\xff\x00", "\x00\xff\x00\xff\x00\x00\xff\xff", "\x00\xff\x00\xff\x00\xff\x00\x00", "\x00\xff\x00\xff\x00\xff\x00\xff", "\x00\xff\x00\xff\x00\xff\xff\x00", "\x00\xff\x00\xff\x00\xff\xff\xff", "\x00\xff\x00\xff\xff\x00\x00\x00", "\x00\xff\x00\xff\xff\x00\x00\xff", "\x00\xff\x00\xff\xff\x00\xff\x00", "\x00\xff\x00\xff\xff\x00\xff\xff", "\x00\xff\x00\xff\xff\xff\x00\x00", "\x00\xff\x00\xff\xff\xff\x00\xff", "\x00\xff\x00\xff\xff\xff\xff\x00", "\x00\xff\x00\xff\xff\xff\xff\xff", "\x00\xff\xff\x00\x00\x00\x00\x00", "\x00\xff\xff\x00\x00\x00\x00\xff", "\x00\xff\xff\x00\x00\x00\xff\x00", "\x00\xff\xff\x00\x00\x00\xff\xff", "\x00\xff\xff\x00\x00\xff\x00\x00", "\x00\xff\xff\x00\x00\xff\x00\xff", "\x00\xff\xff\x00\x00\xff\xff\x00", "\x00\xff\xff\x00\x00\xff\xff\xff", "\x00\xff\xff\x00\xff\x00\x00\x00", "\x00\xff\xff\x00\xff\x00\x00\xff", "\x00\xff\xff\x00\xff\x00\xff\x00", "\x00\xff\xff\x00\xff\x00\xff\xff", "\x00\xff\xff\x00\xff\xff\x00\x00", "\x00\xff\xff\x00\xff\xff\x00\xff", "\x00\xff\xff\x00\xff\xff\xff\x00", "\x00\xff\xff\x00\xff\xff\xff\xff", "\x00\xff\xff\xff\x00\x00\x00\x00", "\x00\xff\xff\xff\x00\x00\x00\xff", "\x00\xff\xff\xff\x00\x00\xff\x00", "\x00\xff\xff\xff\x00\x00\xff\xff", "\x00\xff\xff\xff\x00\xff\x00\x00", "\x00\xff\xff\xff\x00\xff\x00\xff", "\x00\xff\xff\xff\x00\xff\xff\x00", "\x00\xff\xff\xff\x00\xff\xff\xff", "\x00\xff\xff\xff\xff\x00\x00\x00", "\x00\xff\xff\xff\xff\x00\x00\xff", "\x00\xff\xff\xff\xff\x00\xff\x00", "\x00\xff\xff\xff\xff\x00\xff\xff", "\x00\xff\xff\xff\xff\xff\x00\x00", "\x00\xff\xff\xff\xff\xff\x00\xff", "\x00\xff\xff\xff\xff\xff\xff\x00", "\x00\xff\xff\xff\xff\xff\xff\xff", "\xff\x00\x00\x00\x00\x00\x00\x00", "\xff\x00\x00\x00\x00\x00\x00\xff", "\xff\x00\x00\x00\x00\x00\xff\x00", "\xff\x00\x00\x00\x00\x00\xff\xff", "\xff\x00\x00\x00\x00\xff\x00\x00", "\xff\x00\x00\x00\x00\xff\x00\xff", "\xff\x00\x00\x00\x00\xff\xff\x00", "\xff\x00\x00\x00\x00\xff\xff\xff", "\xff\x00\x00\x00\xff\x00\x00\x00", "\xff\x00\x00\x00\xff\x00\x00\xff", "\xff\x00\x00\x00\xff\x00\xff\x00", "\xff\x00\x00\x00\xff\x00\xff\xff", "\xff\x00\x00\x00\xff\xff\x00\x00", "\xff\x00\x00\x00\xff\xff\x00\xff", "\xff\x00\x00\x00\xff\xff\xff\x00", "\xff\x00\x00\x00\xff\xff\xff\xff", "\xff\x00\x00\xff\x00\x00\x00\x00", "\xff\x00\x00\xff\x00\x00\x00\xff", "\xff\x00\x00\xff\x00\x00\xff\x00", "\xff\x00\x00\xff\x00\x00\xff\xff", "\xff\x00\x00\xff\x00\xff\x00\x00", "\xff\x00\x00\xff\x00\xff\x00\xff", "\xff\x00\x00\xff\x00\xff\xff\x00", "\xff\x00\x00\xff\x00\xff\xff\xff", "\xff\x00\x00\xff\xff\x00\x00\x00", "\xff\x00\x00\xff\xff\x00\x00\xff", "\xff\x00\x00\xff\xff\x00\xff\x00", "\xff\x00\x00\xff\xff\x00\xff\xff", "\xff\x00\x00\xff\xff\xff\x00\x00", "\xff\x00\x00\xff\xff\xff\x00\xff", "\xff\x00\x00\xff\xff\xff\xff\x00", "\xff\x00\x00\xff\xff\xff\xff\xff", "\xff\x00\xff\x00\x00\x00\x00\x00", "\xff\x00\xff\x00\x00\x00\x00\xff", "\xff\x00\xff\x00\x00\x00\xff\x00", "\xff\x00\xff\x00\x00\x00\xff\xff", "\xff\x00\xff\x00\x00\xff\x00\x00", "\xff\x00\xff\x00\x00\xff\x00\xff", "\xff\x00\xff\x00\x00\xff\xff\x00", "\xff\x00\xff\x00\x00\xff\xff\xff", "\xff\x00\xff\x00\xff\x00\x00\x00", "\xff\x00\xff\x00\xff\x00\x00\xff", "\xff\x00\xff\x00\xff\x00\xff\x00", "\xff\x00\xff\x00\xff\x00\xff\xff", "\xff\x00\xff\x00\xff\xff\x00\x00", "\xff\x00\xff\x00\xff\xff\x00\xff", "\xff\x00\xff\x00\xff\xff\xff\x00", "\xff\x00\xff\x00\xff\xff\xff\xff", "\xff\x00\xff\xff\x00\x00\x00\x00", "\xff\x00\xff\xff\x00\x00\x00\xff", "\xff\x00\xff\xff\x00\x00\xff\x00", "\xff\x00\xff\xff\x00\x00\xff\xff", "\xff\x00\xff\xff\x00\xff\x00\x00", "\xff\x00\xff\xff\x00\xff\x00\xff", "\xff\x00\xff\xff\x00\xff\xff\x00", "\xff\x00\xff\xff\x00\xff\xff\xff", "\xff\x00\xff\xff\xff\x00\x00\x00", "\xff\x00\xff\xff\xff\x00\x00\xff", "\xff\x00\xff\xff\xff\x00\xff\x00", "\xff\x00\xff\xff\xff\x00\xff\xff", "\xff\x00\xff\xff\xff\xff\x00\x00", "\xff\x00\xff\xff\xff\xff\x00\xff", "\xff\x00\xff\xff\xff\xff\xff\x00", "\xff\x00\xff\xff\xff\xff\xff\xff", "\xff\xff\x00\x00\x00\x00\x00\x00", "\xff\xff\x00\x00\x00\x00\x00\xff", "\xff\xff\x00\x00\x00\x00\xff\x00", "\xff\xff\x00\x00\x00\x00\xff\xff", "\xff\xff\x00\x00\x00\xff\x00\x00", "\xff\xff\x00\x00\x00\xff\x00\xff", "\xff\xff\x00\x00\x00\xff\xff\x00", "\xff\xff\x00\x00\x00\xff\xff\xff", "\xff\xff\x00\x00\xff\x00\x00\x00", "\xff\xff\x00\x00\xff\x00\x00\xff", "\xff\xff\x00\x00\xff\x00\xff\x00", "\xff\xff\x00\x00\xff\x00\xff\xff", "\xff\xff\x00\x00\xff\xff\x00\x00", "\xff\xff\x00\x00\xff\xff\x00\xff", "\xff\xff\x00\x00\xff\xff\xff\x00", "\xff\xff\x00\x00\xff\xff\xff\xff", "\xff\xff\x00\xff\x00\x00\x00\x00", "\xff\xff\x00\xff\x00\x00\x00\xff", "\xff\xff\x00\xff\x00\x00\xff\x00", "\xff\xff\x00\xff\x00\x00\xff\xff", "\xff\xff\x00\xff\x00\xff\x00\x00", "\xff\xff\x00\xff\x00\xff\x00\xff", "\xff\xff\x00\xff\x00\xff\xff\x00", "\xff\xff\x00\xff\x00\xff\xff\xff", "\xff\xff\x00\xff\xff\x00\x00\x00", "\xff\xff\x00\xff\xff\x00\x00\xff", "\xff\xff\x00\xff\xff\x00\xff\x00", "\xff\xff\x00\xff\xff\x00\xff\xff", "\xff\xff\x00\xff\xff\xff\x00\x00", "\xff\xff\x00\xff\xff\xff\x00\xff", "\xff\xff\x00\xff\xff\xff\xff\x00", "\xff\xff\x00\xff\xff\xff\xff\xff", "\xff\xff\xff\x00\x00\x00\x00\x00", "\xff\xff\xff\x00\x00\x00\x00\xff", "\xff\xff\xff\x00\x00\x00\xff\x00", "\xff\xff\xff\x00\x00\x00\xff\xff", "\xff\xff\xff\x00\x00\xff\x00\x00", "\xff\xff\xff\x00\x00\xff\x00\xff", "\xff\xff\xff\x00\x00\xff\xff\x00", "\xff\xff\xff\x00\x00\xff\xff\xff", "\xff\xff\xff\x00\xff\x00\x00\x00", "\xff\xff\xff\x00\xff\x00\x00\xff", "\xff\xff\xff\x00\xff\x00\xff\x00", "\xff\xff\xff\x00\xff\x00\xff\xff", "\xff\xff\xff\x00\xff\xff\x00\x00", "\xff\xff\xff\x00\xff\xff\x00\xff", "\xff\xff\xff\x00\xff\xff\xff\x00", "\xff\xff\xff\x00\xff\xff\xff\xff", "\xff\xff\xff\xff\x00\x00\x00\x00", "\xff\xff\xff\xff\x00\x00\x00\xff", "\xff\xff\xff\xff\x00\x00\xff\x00", "\xff\xff\xff\xff\x00\x00\xff\xff", "\xff\xff\xff\xff\x00\xff\x00\x00", "\xff\xff\xff\xff\x00\xff\x00\xff", "\xff\xff\xff\xff\x00\xff\xff\x00", "\xff\xff\xff\xff\x00\xff\xff\xff", "\xff\xff\xff\xff\xff\x00\x00\x00", "\xff\xff\xff\xff\xff\x00\x00\xff", "\xff\xff\xff\xff\xff\x00\xff\x00", "\xff\xff\xff\xff\xff\x00\xff\xff", "\xff\xff\xff\xff\xff\xff\x00\x00", "\xff\xff\xff\xff\xff\xff\x00\xff", "\xff\xff\xff\xff\xff\xff\xff\x00", "\xff\xff\xff\xff\xff\xff\xff\xff"]; - /** - * IP mapping helper table. - * - * Indexing this table with each source byte performs the initial bit permutation. - * - * @var array - */ - protected static $ipmap = [0x0, 0x10, 0x1, 0x11, 0x20, 0x30, 0x21, 0x31, 0x2, 0x12, 0x3, 0x13, 0x22, 0x32, 0x23, 0x33, 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, 0x4, 0x14, 0x5, 0x15, 0x24, 0x34, 0x25, 0x35, 0x6, 0x16, 0x7, 0x17, 0x26, 0x36, 0x27, 0x37, 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, 0x80, 0x90, 0x81, 0x91, 0xa0, 0xb0, 0xa1, 0xb1, 0x82, 0x92, 0x83, 0x93, 0xa2, 0xb2, 0xa3, 0xb3, 0xc0, 0xd0, 0xc1, 0xd1, 0xe0, 0xf0, 0xe1, 0xf1, 0xc2, 0xd2, 0xc3, 0xd3, 0xe2, 0xf2, 0xe3, 0xf3, 0x84, 0x94, 0x85, 0x95, 0xa4, 0xb4, 0xa5, 0xb5, 0x86, 0x96, 0x87, 0x97, 0xa6, 0xb6, 0xa7, 0xb7, 0xc4, 0xd4, 0xc5, 0xd5, 0xe4, 0xf4, 0xe5, 0xf5, 0xc6, 0xd6, 0xc7, 0xd7, 0xe6, 0xf6, 0xe7, 0xf7, 0x8, 0x18, 0x9, 0x19, 0x28, 0x38, 0x29, 0x39, 0xa, 0x1a, 0xb, 0x1b, 0x2a, 0x3a, 0x2b, 0x3b, 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, 0x4a, 0x5a, 0x4b, 0x5b, 0x6a, 0x7a, 0x6b, 0x7b, 0xc, 0x1c, 0xd, 0x1d, 0x2c, 0x3c, 0x2d, 0x3d, 0xe, 0x1e, 0xf, 0x1f, 0x2e, 0x3e, 0x2f, 0x3f, 0x4c, 0x5c, 0x4d, 0x5d, 0x6c, 0x7c, 0x6d, 0x7d, 0x4e, 0x5e, 0x4f, 0x5f, 0x6e, 0x7e, 0x6f, 0x7f, 0x88, 0x98, 0x89, 0x99, 0xa8, 0xb8, 0xa9, 0xb9, 0x8a, 0x9a, 0x8b, 0x9b, 0xaa, 0xba, 0xab, 0xbb, 0xc8, 0xd8, 0xc9, 0xd9, 0xe8, 0xf8, 0xe9, 0xf9, 0xca, 0xda, 0xcb, 0xdb, 0xea, 0xfa, 0xeb, 0xfb, 0x8c, 0x9c, 0x8d, 0x9d, 0xac, 0xbc, 0xad, 0xbd, 0x8e, 0x9e, 0x8f, 0x9f, 0xae, 0xbe, 0xaf, 0xbf, 0xcc, 0xdc, 0xcd, 0xdd, 0xec, 0xfc, 0xed, 0xfd, 0xce, 0xde, 0xcf, 0xdf, 0xee, 0xfe, 0xef, 0xff]; - /** - * Inverse IP mapping helper table. - * Indexing this table with a byte value reverses the bit order. - * - * @var array - */ - protected static $invipmap = [0x0, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x8, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x4, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0xc, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x2, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0xa, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x6, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0xe, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x1, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x9, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x5, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0xd, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x3, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0xb, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x7, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0xf, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff]; - /** - * Pre-permuted S-box1 - * - * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the - * P table: concatenation can then be replaced by exclusive ORs. - * - * @var array - */ - protected static $sbox1 = [0x808200, 0x0, 0x8000, 0x808202, 0x808002, 0x8202, 0x2, 0x8000, 0x200, 0x808200, 0x808202, 0x200, 0x800202, 0x808002, 0x800000, 0x2, 0x202, 0x800200, 0x800200, 0x8200, 0x8200, 0x808000, 0x808000, 0x800202, 0x8002, 0x800002, 0x800002, 0x8002, 0x0, 0x202, 0x8202, 0x800000, 0x8000, 0x808202, 0x2, 0x808000, 0x808200, 0x800000, 0x800000, 0x200, 0x808002, 0x8000, 0x8200, 0x800002, 0x200, 0x2, 0x800202, 0x8202, 0x808202, 0x8002, 0x808000, 0x800202, 0x800002, 0x202, 0x8202, 0x808200, 0x202, 0x800200, 0x800200, 0x0, 0x8002, 0x8200, 0x0, 0x808002]; - /** - * Pre-permuted S-box2 - * - * @var array - */ - protected static $sbox2 = [0x40084010, 0x40004000, 0x4000, 0x84010, 0x80000, 0x10, 0x40080010, 0x40004010, 0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40004000, 0x80000, 0x10, 0x40080010, 0x84000, 0x80010, 0x40004010, 0x0, 0x40000000, 0x4000, 0x84010, 0x40080000, 0x80010, 0x40000010, 0x0, 0x84000, 0x4010, 0x40084000, 0x40080000, 0x4010, 0x0, 0x84010, 0x40080010, 0x80000, 0x40004010, 0x40080000, 0x40084000, 0x4000, 0x40080000, 0x40004000, 0x10, 0x40084010, 0x84010, 0x10, 0x4000, 0x40000000, 0x4010, 0x40084000, 0x80000, 0x40000010, 0x80010, 0x40004010, 0x40000010, 0x80010, 0x84000, 0x0, 0x40004000, 0x4010, 0x40000000, 0x40080010, 0x40084010, 0x84000]; - /** - * Pre-permuted S-box3 - * - * @var array - */ - protected static $sbox3 = [0x104, 0x4010100, 0x0, 0x4010004, 0x4000100, 0x0, 0x10104, 0x4000100, 0x10004, 0x4000004, 0x4000004, 0x10000, 0x4010104, 0x10004, 0x4010000, 0x104, 0x4000000, 0x4, 0x4010100, 0x100, 0x10100, 0x4010000, 0x4010004, 0x10104, 0x4000104, 0x10100, 0x10000, 0x4000104, 0x4, 0x4010104, 0x100, 0x4000000, 0x4010100, 0x4000000, 0x10004, 0x104, 0x10000, 0x4010100, 0x4000100, 0x0, 0x100, 0x10004, 0x4010104, 0x4000100, 0x4000004, 0x100, 0x0, 0x4010004, 0x4000104, 0x10000, 0x4000000, 0x4010104, 0x4, 0x10104, 0x10100, 0x4000004, 0x4010000, 0x4000104, 0x104, 0x4010000, 0x10104, 0x4, 0x4010004, 0x10100]; - /** - * Pre-permuted S-box4 - * - * @var array - */ - protected static $sbox4 = [0x80401000, 0x80001040, 0x80001040, 0x40, 0x401040, 0x80400040, 0x80400000, 0x80001000, 0x0, 0x401000, 0x401000, 0x80401040, 0x80000040, 0x0, 0x400040, 0x80400000, 0x80000000, 0x1000, 0x400000, 0x80401000, 0x40, 0x400000, 0x80001000, 0x1040, 0x80400040, 0x80000000, 0x1040, 0x400040, 0x1000, 0x401040, 0x80401040, 0x80000040, 0x400040, 0x80400000, 0x401000, 0x80401040, 0x80000040, 0x0, 0x0, 0x401000, 0x1040, 0x400040, 0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x40, 0x80401040, 0x80000040, 0x80000000, 0x1000, 0x80400000, 0x80001000, 0x401040, 0x80400040, 0x80001000, 0x1040, 0x400000, 0x80401000, 0x40, 0x400000, 0x1000, 0x401040]; - /** - * Pre-permuted S-box5 - * - * @var array - */ - protected static $sbox5 = [0x80, 0x1040080, 0x1040000, 0x21000080, 0x40000, 0x80, 0x20000000, 0x1040000, 0x20040080, 0x40000, 0x1000080, 0x20040080, 0x21000080, 0x21040000, 0x40080, 0x20000000, 0x1000000, 0x20040000, 0x20040000, 0x0, 0x20000080, 0x21040080, 0x21040080, 0x1000080, 0x21040000, 0x20000080, 0x0, 0x21000000, 0x1040080, 0x1000000, 0x21000000, 0x40080, 0x40000, 0x21000080, 0x80, 0x1000000, 0x20000000, 0x1040000, 0x21000080, 0x20040080, 0x1000080, 0x20000000, 0x21040000, 0x1040080, 0x20040080, 0x80, 0x1000000, 0x21040000, 0x21040080, 0x40080, 0x21000000, 0x21040080, 0x1040000, 0x0, 0x20040000, 0x21000000, 0x40080, 0x1000080, 0x20000080, 0x40000, 0x0, 0x20040000, 0x1040080, 0x20000080]; - /** - * Pre-permuted S-box6 - * - * @var array - */ - protected static $sbox6 = [0x10000008, 0x10200000, 0x2000, 0x10202008, 0x10200000, 0x8, 0x10202008, 0x200000, 0x10002000, 0x202008, 0x200000, 0x10000008, 0x200008, 0x10002000, 0x10000000, 0x2008, 0x0, 0x200008, 0x10002008, 0x2000, 0x202000, 0x10002008, 0x8, 0x10200008, 0x10200008, 0x0, 0x202008, 0x10202000, 0x2008, 0x202000, 0x10202000, 0x10000000, 0x10002000, 0x8, 0x10200008, 0x202000, 0x10202008, 0x200000, 0x2008, 0x10000008, 0x200000, 0x10002000, 0x10000000, 0x2008, 0x10000008, 0x10202008, 0x202000, 0x10200000, 0x202008, 0x10202000, 0x0, 0x10200008, 0x8, 0x2000, 0x10200000, 0x202008, 0x2000, 0x200008, 0x10002008, 0x0, 0x10202000, 0x10000000, 0x200008, 0x10002008]; - /** - * Pre-permuted S-box7 - * - * @var array - */ - protected static $sbox7 = [0x100000, 0x2100001, 0x2000401, 0x0, 0x400, 0x2000401, 0x100401, 0x2100400, 0x2100401, 0x100000, 0x0, 0x2000001, 0x1, 0x2000000, 0x2100001, 0x401, 0x2000400, 0x100401, 0x100001, 0x2000400, 0x2000001, 0x2100000, 0x2100400, 0x100001, 0x2100000, 0x400, 0x401, 0x2100401, 0x100400, 0x1, 0x2000000, 0x100400, 0x2000000, 0x100400, 0x100000, 0x2000401, 0x2000401, 0x2100001, 0x2100001, 0x1, 0x100001, 0x2000000, 0x2000400, 0x100000, 0x2100400, 0x401, 0x100401, 0x2100400, 0x401, 0x2000001, 0x2100401, 0x2100000, 0x100400, 0x0, 0x1, 0x2100401, 0x0, 0x100401, 0x2100000, 0x400, 0x2000001, 0x2000400, 0x400, 0x100001]; - /** - * Pre-permuted S-box8 - * - * @var array - */ - protected static $sbox8 = [0x8000820, 0x800, 0x20000, 0x8020820, 0x8000000, 0x8000820, 0x20, 0x8000000, 0x20020, 0x8020000, 0x8020820, 0x20800, 0x8020800, 0x20820, 0x800, 0x20, 0x8020000, 0x8000020, 0x8000800, 0x820, 0x20800, 0x20020, 0x8020020, 0x8020800, 0x820, 0x0, 0x0, 0x8020020, 0x8000020, 0x8000800, 0x20820, 0x20000, 0x20820, 0x20000, 0x8020800, 0x800, 0x20, 0x8020020, 0x800, 0x20820, 0x8000800, 0x20, 0x8000020, 0x8020000, 0x8020020, 0x8000000, 0x20000, 0x8000820, 0x0, 0x8020820, 0x20020, 0x8000020, 0x8020000, 0x8000800, 0x8000820, 0x0, 0x8020820, 0x20800, 0x20800, 0x820, 0x820, 0x20020, 0x8000000, 0x8020800]; - /** - * Default Constructor. - * - * @param string $mode - * @throws BadModeException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($this->key_length_max == 8) { - if ($engine == self::ENGINE_OPENSSL) { - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; - } - $this->cipher_name_openssl_ecb = 'des-ecb'; - $this->cipher_name_openssl = 'des-' . $this->openssl_translate_mode(); - } - } - return parent::isValidEngineHelper($engine); - } - /** - * Sets the key. - * - * Keys must be 64-bits long or 8 bytes long. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setKey() - * @param string $key - */ - public function setKey($key) - { - if (!$this instanceof \phpseclib3\Crypt\TripleDES && \strlen($key) != 8) { - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of size 8 are supported'); - } - // Sets the key - parent::setKey($key); - } - /** - * Encrypts a block - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encryptBlock() - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see self::encrypt() - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - return $this->processBlock($in, self::ENCRYPT); - } - /** - * Decrypts a block - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decryptBlock() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @see self::decrypt() - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - return $this->processBlock($in, self::DECRYPT); - } - /** - * Encrypts or decrypts a 64-bit block - * - * $mode should be either self::ENCRYPT or self::DECRYPT. See - * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general - * idea of what this function does. - * - * @see self::encryptBlock() - * @see self::decryptBlock() - * @param string $block - * @param int $mode - * @return string - */ - private function processBlock($block, $mode) - { - static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = \array_map('intval', self::$sbox1); - $sbox2 = \array_map('intval', self::$sbox2); - $sbox3 = \array_map('intval', self::$sbox3); - $sbox4 = \array_map('intval', self::$sbox4); - $sbox5 = \array_map('intval', self::$sbox5); - $sbox6 = \array_map('intval', self::$sbox6); - $sbox7 = \array_map('intval', self::$sbox7); - $sbox8 = \array_map('intval', self::$sbox8); - /* Merge $shuffle with $[inv]ipmap */ - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; - $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; - } - } - $keys = $this->keys[$mode]; - $ki = -1; - // Do the initial IP permutation. - $t = \unpack('Nl/Nr', $block); - list($l, $r) = [$t['l'], $t['r']]; - $block = $shuffleip[$r & 0xff] & "\x80\x80\x80\x80\x80\x80\x80\x80" | $shuffleip[$r >> 8 & 0xff] & "@@@@@@@@" | $shuffleip[$r >> 16 & 0xff] & " " | $shuffleip[$r >> 24 & 0xff] & "\x10\x10\x10\x10\x10\x10\x10\x10" | $shuffleip[$l & 0xff] & "\x08\x08\x08\x08\x08\x08\x08\x08" | $shuffleip[$l >> 8 & 0xff] & "\x04\x04\x04\x04\x04\x04\x04\x04" | $shuffleip[$l >> 16 & 0xff] & "\x02\x02\x02\x02\x02\x02\x02\x02" | $shuffleip[$l >> 24 & 0xff] & "\x01\x01\x01\x01\x01\x01\x01\x01"; - // Extract L0 and R0. - $t = \unpack('Nl/Nr', $block); - list($l, $r) = [$t['l'], $t['r']]; - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; $i++) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $b1 = $r >> 3 & 0x1fffffff ^ $r << 29 ^ $keys[++$ki]; - $b2 = $r >> 31 & 0x1 ^ $r << 1 ^ $keys[++$ki]; - // S-box indexing. - $t = $sbox1[$b1 >> 24 & 0x3f] ^ $sbox2[$b2 >> 24 & 0x3f] ^ $sbox3[$b1 >> 16 & 0x3f] ^ $sbox4[$b2 >> 16 & 0x3f] ^ $sbox5[$b1 >> 8 & 0x3f] ^ $sbox6[$b2 >> 8 & 0x3f] ^ $sbox7[$b1 & 0x3f] ^ $sbox8[$b2 & 0x3f] ^ $l; - // end of "the Feistel (F) function" - $l = $r; - $r = $t; - } - // Last step should not permute L & R. - $t = $l; - $l = $r; - $r = $t; - } - // Perform the inverse IP permutation. - return $shuffleinvip[$r >> 24 & 0xff] & "\x80\x80\x80\x80\x80\x80\x80\x80" | $shuffleinvip[$l >> 24 & 0xff] & "@@@@@@@@" | $shuffleinvip[$r >> 16 & 0xff] & " " | $shuffleinvip[$l >> 16 & 0xff] & "\x10\x10\x10\x10\x10\x10\x10\x10" | $shuffleinvip[$r >> 8 & 0xff] & "\x08\x08\x08\x08\x08\x08\x08\x08" | $shuffleinvip[$l >> 8 & 0xff] & "\x04\x04\x04\x04\x04\x04\x04\x04" | $shuffleinvip[$r & 0xff] & "\x02\x02\x02\x02\x02\x02\x02\x02" | $shuffleinvip[$l & 0xff] & "\x01\x01\x01\x01\x01\x01\x01\x01"; - } - /** - * Creates the key schedule - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key, 'des_rounds' => $this->des_rounds]; - static $shifts = [ - // number of key bits shifted per round - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 1, - ]; - static $pc1map = [0x0, 0x0, 0x8, 0x8, 0x4, 0x4, 0xc, 0xc, 0x2, 0x2, 0xa, 0xa, 0x6, 0x6, 0xe, 0xe, 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1c, 0x1c, 0x12, 0x12, 0x1a, 0x1a, 0x16, 0x16, 0x1e, 0x1e, 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2c, 0x2c, 0x22, 0x22, 0x2a, 0x2a, 0x26, 0x26, 0x2e, 0x2e, 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3c, 0x3c, 0x32, 0x32, 0x3a, 0x3a, 0x36, 0x36, 0x3e, 0x3e, 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4c, 0x4c, 0x42, 0x42, 0x4a, 0x4a, 0x46, 0x46, 0x4e, 0x4e, 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5c, 0x5c, 0x52, 0x52, 0x5a, 0x5a, 0x56, 0x56, 0x5e, 0x5e, 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6c, 0x6c, 0x62, 0x62, 0x6a, 0x6a, 0x66, 0x66, 0x6e, 0x6e, 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7c, 0x7c, 0x72, 0x72, 0x7a, 0x7a, 0x76, 0x76, 0x7e, 0x7e, 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8c, 0x8c, 0x82, 0x82, 0x8a, 0x8a, 0x86, 0x86, 0x8e, 0x8e, 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9c, 0x9c, 0x92, 0x92, 0x9a, 0x9a, 0x96, 0x96, 0x9e, 0x9e, 0xa0, 0xa0, 0xa8, 0xa8, 0xa4, 0xa4, 0xac, 0xac, 0xa2, 0xa2, 0xaa, 0xaa, 0xa6, 0xa6, 0xae, 0xae, 0xb0, 0xb0, 0xb8, 0xb8, 0xb4, 0xb4, 0xbc, 0xbc, 0xb2, 0xb2, 0xba, 0xba, 0xb6, 0xb6, 0xbe, 0xbe, 0xc0, 0xc0, 0xc8, 0xc8, 0xc4, 0xc4, 0xcc, 0xcc, 0xc2, 0xc2, 0xca, 0xca, 0xc6, 0xc6, 0xce, 0xce, 0xd0, 0xd0, 0xd8, 0xd8, 0xd4, 0xd4, 0xdc, 0xdc, 0xd2, 0xd2, 0xda, 0xda, 0xd6, 0xd6, 0xde, 0xde, 0xe0, 0xe0, 0xe8, 0xe8, 0xe4, 0xe4, 0xec, 0xec, 0xe2, 0xe2, 0xea, 0xea, 0xe6, 0xe6, 0xee, 0xee, 0xf0, 0xf0, 0xf8, 0xf8, 0xf4, 0xf4, 0xfc, 0xfc, 0xf2, 0xf2, 0xfa, 0xfa, 0xf6, 0xf6, 0xfe, 0xfe]; - // Mapping tables for the PC-2 transformation. - static $pc2mapc1 = [0x0, 0x400, 0x200000, 0x200400, 0x1, 0x401, 0x200001, 0x200401, 0x2000000, 0x2000400, 0x2200000, 0x2200400, 0x2000001, 0x2000401, 0x2200001, 0x2200401]; - static $pc2mapc2 = [0x0, 0x800, 0x8000000, 0x8000800, 0x10000, 0x10800, 0x8010000, 0x8010800, 0x0, 0x800, 0x8000000, 0x8000800, 0x10000, 0x10800, 0x8010000, 0x8010800, 0x100, 0x900, 0x8000100, 0x8000900, 0x10100, 0x10900, 0x8010100, 0x8010900, 0x100, 0x900, 0x8000100, 0x8000900, 0x10100, 0x10900, 0x8010100, 0x8010900, 0x10, 0x810, 0x8000010, 0x8000810, 0x10010, 0x10810, 0x8010010, 0x8010810, 0x10, 0x810, 0x8000010, 0x8000810, 0x10010, 0x10810, 0x8010010, 0x8010810, 0x110, 0x910, 0x8000110, 0x8000910, 0x10110, 0x10910, 0x8010110, 0x8010910, 0x110, 0x910, 0x8000110, 0x8000910, 0x10110, 0x10910, 0x8010110, 0x8010910, 0x40000, 0x40800, 0x8040000, 0x8040800, 0x50000, 0x50800, 0x8050000, 0x8050800, 0x40000, 0x40800, 0x8040000, 0x8040800, 0x50000, 0x50800, 0x8050000, 0x8050800, 0x40100, 0x40900, 0x8040100, 0x8040900, 0x50100, 0x50900, 0x8050100, 0x8050900, 0x40100, 0x40900, 0x8040100, 0x8040900, 0x50100, 0x50900, 0x8050100, 0x8050900, 0x40010, 0x40810, 0x8040010, 0x8040810, 0x50010, 0x50810, 0x8050010, 0x8050810, 0x40010, 0x40810, 0x8040010, 0x8040810, 0x50010, 0x50810, 0x8050010, 0x8050810, 0x40110, 0x40910, 0x8040110, 0x8040910, 0x50110, 0x50910, 0x8050110, 0x8050910, 0x40110, 0x40910, 0x8040110, 0x8040910, 0x50110, 0x50910, 0x8050110, 0x8050910, 0x1000000, 0x1000800, 0x9000000, 0x9000800, 0x1010000, 0x1010800, 0x9010000, 0x9010800, 0x1000000, 0x1000800, 0x9000000, 0x9000800, 0x1010000, 0x1010800, 0x9010000, 0x9010800, 0x1000100, 0x1000900, 0x9000100, 0x9000900, 0x1010100, 0x1010900, 0x9010100, 0x9010900, 0x1000100, 0x1000900, 0x9000100, 0x9000900, 0x1010100, 0x1010900, 0x9010100, 0x9010900, 0x1000010, 0x1000810, 0x9000010, 0x9000810, 0x1010010, 0x1010810, 0x9010010, 0x9010810, 0x1000010, 0x1000810, 0x9000010, 0x9000810, 0x1010010, 0x1010810, 0x9010010, 0x9010810, 0x1000110, 0x1000910, 0x9000110, 0x9000910, 0x1010110, 0x1010910, 0x9010110, 0x9010910, 0x1000110, 0x1000910, 0x9000110, 0x9000910, 0x1010110, 0x1010910, 0x9010110, 0x9010910, 0x1040000, 0x1040800, 0x9040000, 0x9040800, 0x1050000, 0x1050800, 0x9050000, 0x9050800, 0x1040000, 0x1040800, 0x9040000, 0x9040800, 0x1050000, 0x1050800, 0x9050000, 0x9050800, 0x1040100, 0x1040900, 0x9040100, 0x9040900, 0x1050100, 0x1050900, 0x9050100, 0x9050900, 0x1040100, 0x1040900, 0x9040100, 0x9040900, 0x1050100, 0x1050900, 0x9050100, 0x9050900, 0x1040010, 0x1040810, 0x9040010, 0x9040810, 0x1050010, 0x1050810, 0x9050010, 0x9050810, 0x1040010, 0x1040810, 0x9040010, 0x9040810, 0x1050010, 0x1050810, 0x9050010, 0x9050810, 0x1040110, 0x1040910, 0x9040110, 0x9040910, 0x1050110, 0x1050910, 0x9050110, 0x9050910, 0x1040110, 0x1040910, 0x9040110, 0x9040910, 0x1050110, 0x1050910, 0x9050110, 0x9050910]; - static $pc2mapc3 = [0x0, 0x4, 0x1000, 0x1004, 0x0, 0x4, 0x1000, 0x1004, 0x10000000, 0x10000004, 0x10001000, 0x10001004, 0x10000000, 0x10000004, 0x10001000, 0x10001004, 0x20, 0x24, 0x1020, 0x1024, 0x20, 0x24, 0x1020, 0x1024, 0x10000020, 0x10000024, 0x10001020, 0x10001024, 0x10000020, 0x10000024, 0x10001020, 0x10001024, 0x80000, 0x80004, 0x81000, 0x81004, 0x80000, 0x80004, 0x81000, 0x81004, 0x10080000, 0x10080004, 0x10081000, 0x10081004, 0x10080000, 0x10080004, 0x10081000, 0x10081004, 0x80020, 0x80024, 0x81020, 0x81024, 0x80020, 0x80024, 0x81020, 0x81024, 0x10080020, 0x10080024, 0x10081020, 0x10081024, 0x10080020, 0x10080024, 0x10081020, 0x10081024, 0x20000000, 0x20000004, 0x20001000, 0x20001004, 0x20000000, 0x20000004, 0x20001000, 0x20001004, 0x30000000, 0x30000004, 0x30001000, 0x30001004, 0x30000000, 0x30000004, 0x30001000, 0x30001004, 0x20000020, 0x20000024, 0x20001020, 0x20001024, 0x20000020, 0x20000024, 0x20001020, 0x20001024, 0x30000020, 0x30000024, 0x30001020, 0x30001024, 0x30000020, 0x30000024, 0x30001020, 0x30001024, 0x20080000, 0x20080004, 0x20081000, 0x20081004, 0x20080000, 0x20080004, 0x20081000, 0x20081004, 0x30080000, 0x30080004, 0x30081000, 0x30081004, 0x30080000, 0x30080004, 0x30081000, 0x30081004, 0x20080020, 0x20080024, 0x20081020, 0x20081024, 0x20080020, 0x20080024, 0x20081020, 0x20081024, 0x30080020, 0x30080024, 0x30081020, 0x30081024, 0x30080020, 0x30080024, 0x30081020, 0x30081024, 0x2, 0x6, 0x1002, 0x1006, 0x2, 0x6, 0x1002, 0x1006, 0x10000002, 0x10000006, 0x10001002, 0x10001006, 0x10000002, 0x10000006, 0x10001002, 0x10001006, 0x22, 0x26, 0x1022, 0x1026, 0x22, 0x26, 0x1022, 0x1026, 0x10000022, 0x10000026, 0x10001022, 0x10001026, 0x10000022, 0x10000026, 0x10001022, 0x10001026, 0x80002, 0x80006, 0x81002, 0x81006, 0x80002, 0x80006, 0x81002, 0x81006, 0x10080002, 0x10080006, 0x10081002, 0x10081006, 0x10080002, 0x10080006, 0x10081002, 0x10081006, 0x80022, 0x80026, 0x81022, 0x81026, 0x80022, 0x80026, 0x81022, 0x81026, 0x10080022, 0x10080026, 0x10081022, 0x10081026, 0x10080022, 0x10080026, 0x10081022, 0x10081026, 0x20000002, 0x20000006, 0x20001002, 0x20001006, 0x20000002, 0x20000006, 0x20001002, 0x20001006, 0x30000002, 0x30000006, 0x30001002, 0x30001006, 0x30000002, 0x30000006, 0x30001002, 0x30001006, 0x20000022, 0x20000026, 0x20001022, 0x20001026, 0x20000022, 0x20000026, 0x20001022, 0x20001026, 0x30000022, 0x30000026, 0x30001022, 0x30001026, 0x30000022, 0x30000026, 0x30001022, 0x30001026, 0x20080002, 0x20080006, 0x20081002, 0x20081006, 0x20080002, 0x20080006, 0x20081002, 0x20081006, 0x30080002, 0x30080006, 0x30081002, 0x30081006, 0x30080002, 0x30080006, 0x30081002, 0x30081006, 0x20080022, 0x20080026, 0x20081022, 0x20081026, 0x20080022, 0x20080026, 0x20081022, 0x20081026, 0x30080022, 0x30080026, 0x30081022, 0x30081026, 0x30080022, 0x30080026, 0x30081022, 0x30081026]; - static $pc2mapc4 = [0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208]; - static $pc2mapd1 = [0x0, 0x1, 0x8000000, 0x8000001, 0x200000, 0x200001, 0x8200000, 0x8200001, 0x2, 0x3, 0x8000002, 0x8000003, 0x200002, 0x200003, 0x8200002, 0x8200003]; - static $pc2mapd2 = [0x0, 0x100000, 0x800, 0x100800, 0x0, 0x100000, 0x800, 0x100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4, 0x100004, 0x804, 0x100804, 0x4, 0x100004, 0x804, 0x100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x0, 0x100000, 0x800, 0x100800, 0x0, 0x100000, 0x800, 0x100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4, 0x100004, 0x804, 0x100804, 0x4, 0x100004, 0x804, 0x100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x200, 0x100200, 0xa00, 0x100a00, 0x200, 0x100200, 0xa00, 0x100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x204, 0x100204, 0xa04, 0x100a04, 0x204, 0x100204, 0xa04, 0x100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x200, 0x100200, 0xa00, 0x100a00, 0x200, 0x100200, 0xa00, 0x100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x204, 0x100204, 0xa04, 0x100a04, 0x204, 0x100204, 0xa04, 0x100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x20000, 0x120000, 0x20800, 0x120800, 0x20000, 0x120000, 0x20800, 0x120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x20004, 0x120004, 0x20804, 0x120804, 0x20004, 0x120004, 0x20804, 0x120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x20000, 0x120000, 0x20800, 0x120800, 0x20000, 0x120000, 0x20800, 0x120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x20004, 0x120004, 0x20804, 0x120804, 0x20004, 0x120004, 0x20804, 0x120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04]; - static $pc2mapd3 = [0x0, 0x10000, 0x2000000, 0x2010000, 0x20, 0x10020, 0x2000020, 0x2010020, 0x40000, 0x50000, 0x2040000, 0x2050000, 0x40020, 0x50020, 0x2040020, 0x2050020, 0x2000, 0x12000, 0x2002000, 0x2012000, 0x2020, 0x12020, 0x2002020, 0x2012020, 0x42000, 0x52000, 0x2042000, 0x2052000, 0x42020, 0x52020, 0x2042020, 0x2052020, 0x0, 0x10000, 0x2000000, 0x2010000, 0x20, 0x10020, 0x2000020, 0x2010020, 0x40000, 0x50000, 0x2040000, 0x2050000, 0x40020, 0x50020, 0x2040020, 0x2050020, 0x2000, 0x12000, 0x2002000, 0x2012000, 0x2020, 0x12020, 0x2002020, 0x2012020, 0x42000, 0x52000, 0x2042000, 0x2052000, 0x42020, 0x52020, 0x2042020, 0x2052020, 0x10, 0x10010, 0x2000010, 0x2010010, 0x30, 0x10030, 0x2000030, 0x2010030, 0x40010, 0x50010, 0x2040010, 0x2050010, 0x40030, 0x50030, 0x2040030, 0x2050030, 0x2010, 0x12010, 0x2002010, 0x2012010, 0x2030, 0x12030, 0x2002030, 0x2012030, 0x42010, 0x52010, 0x2042010, 0x2052010, 0x42030, 0x52030, 0x2042030, 0x2052030, 0x10, 0x10010, 0x2000010, 0x2010010, 0x30, 0x10030, 0x2000030, 0x2010030, 0x40010, 0x50010, 0x2040010, 0x2050010, 0x40030, 0x50030, 0x2040030, 0x2050030, 0x2010, 0x12010, 0x2002010, 0x2012010, 0x2030, 0x12030, 0x2002030, 0x2012030, 0x42010, 0x52010, 0x2042010, 0x2052010, 0x42030, 0x52030, 0x2042030, 0x2052030, 0x20000000, 0x20010000, 0x22000000, 0x22010000, 0x20000020, 0x20010020, 0x22000020, 0x22010020, 0x20040000, 0x20050000, 0x22040000, 0x22050000, 0x20040020, 0x20050020, 0x22040020, 0x22050020, 0x20002000, 0x20012000, 0x22002000, 0x22012000, 0x20002020, 0x20012020, 0x22002020, 0x22012020, 0x20042000, 0x20052000, 0x22042000, 0x22052000, 0x20042020, 0x20052020, 0x22042020, 0x22052020, 0x20000000, 0x20010000, 0x22000000, 0x22010000, 0x20000020, 0x20010020, 0x22000020, 0x22010020, 0x20040000, 0x20050000, 0x22040000, 0x22050000, 0x20040020, 0x20050020, 0x22040020, 0x22050020, 0x20002000, 0x20012000, 0x22002000, 0x22012000, 0x20002020, 0x20012020, 0x22002020, 0x22012020, 0x20042000, 0x20052000, 0x22042000, 0x22052000, 0x20042020, 0x20052020, 0x22042020, 0x22052020, 0x20000010, 0x20010010, 0x22000010, 0x22010010, 0x20000030, 0x20010030, 0x22000030, 0x22010030, 0x20040010, 0x20050010, 0x22040010, 0x22050010, 0x20040030, 0x20050030, 0x22040030, 0x22050030, 0x20002010, 0x20012010, 0x22002010, 0x22012010, 0x20002030, 0x20012030, 0x22002030, 0x22012030, 0x20042010, 0x20052010, 0x22042010, 0x22052010, 0x20042030, 0x20052030, 0x22042030, 0x22052030, 0x20000010, 0x20010010, 0x22000010, 0x22010010, 0x20000030, 0x20010030, 0x22000030, 0x22010030, 0x20040010, 0x20050010, 0x22040010, 0x22050010, 0x20040030, 0x20050030, 0x22040030, 0x22050030, 0x20002010, 0x20012010, 0x22002010, 0x22012010, 0x20002030, 0x20012030, 0x22002030, 0x22012030, 0x20042010, 0x20052010, 0x22042010, 0x22052010, 0x20042030, 0x20052030, 0x22042030, 0x22052030]; - static $pc2mapd4 = [0x0, 0x400, 0x1000000, 0x1000400, 0x0, 0x400, 0x1000000, 0x1000400, 0x100, 0x500, 0x1000100, 0x1000500, 0x100, 0x500, 0x1000100, 0x1000500, 0x10000000, 0x10000400, 0x11000000, 0x11000400, 0x10000000, 0x10000400, 0x11000000, 0x11000400, 0x10000100, 0x10000500, 0x11000100, 0x11000500, 0x10000100, 0x10000500, 0x11000100, 0x11000500, 0x80000, 0x80400, 0x1080000, 0x1080400, 0x80000, 0x80400, 0x1080000, 0x1080400, 0x80100, 0x80500, 0x1080100, 0x1080500, 0x80100, 0x80500, 0x1080100, 0x1080500, 0x10080000, 0x10080400, 0x11080000, 0x11080400, 0x10080000, 0x10080400, 0x11080000, 0x11080400, 0x10080100, 0x10080500, 0x11080100, 0x11080500, 0x10080100, 0x10080500, 0x11080100, 0x11080500, 0x8, 0x408, 0x1000008, 0x1000408, 0x8, 0x408, 0x1000008, 0x1000408, 0x108, 0x508, 0x1000108, 0x1000508, 0x108, 0x508, 0x1000108, 0x1000508, 0x10000008, 0x10000408, 0x11000008, 0x11000408, 0x10000008, 0x10000408, 0x11000008, 0x11000408, 0x10000108, 0x10000508, 0x11000108, 0x11000508, 0x10000108, 0x10000508, 0x11000108, 0x11000508, 0x80008, 0x80408, 0x1080008, 0x1080408, 0x80008, 0x80408, 0x1080008, 0x1080408, 0x80108, 0x80508, 0x1080108, 0x1080508, 0x80108, 0x80508, 0x1080108, 0x1080508, 0x10080008, 0x10080408, 0x11080008, 0x11080408, 0x10080008, 0x10080408, 0x11080008, 0x11080408, 0x10080108, 0x10080508, 0x11080108, 0x11080508, 0x10080108, 0x10080508, 0x11080108, 0x11080508, 0x1000, 0x1400, 0x1001000, 0x1001400, 0x1000, 0x1400, 0x1001000, 0x1001400, 0x1100, 0x1500, 0x1001100, 0x1001500, 0x1100, 0x1500, 0x1001100, 0x1001500, 0x10001000, 0x10001400, 0x11001000, 0x11001400, 0x10001000, 0x10001400, 0x11001000, 0x11001400, 0x10001100, 0x10001500, 0x11001100, 0x11001500, 0x10001100, 0x10001500, 0x11001100, 0x11001500, 0x81000, 0x81400, 0x1081000, 0x1081400, 0x81000, 0x81400, 0x1081000, 0x1081400, 0x81100, 0x81500, 0x1081100, 0x1081500, 0x81100, 0x81500, 0x1081100, 0x1081500, 0x10081000, 0x10081400, 0x11081000, 0x11081400, 0x10081000, 0x10081400, 0x11081000, 0x11081400, 0x10081100, 0x10081500, 0x11081100, 0x11081500, 0x10081100, 0x10081500, 0x11081100, 0x11081500, 0x1008, 0x1408, 0x1001008, 0x1001408, 0x1008, 0x1408, 0x1001008, 0x1001408, 0x1108, 0x1508, 0x1001108, 0x1001508, 0x1108, 0x1508, 0x1001108, 0x1001508, 0x10001008, 0x10001408, 0x11001008, 0x11001408, 0x10001008, 0x10001408, 0x11001008, 0x11001408, 0x10001108, 0x10001508, 0x11001108, 0x11001508, 0x10001108, 0x10001508, 0x11001108, 0x11001508, 0x81008, 0x81408, 0x1081008, 0x1081408, 0x81008, 0x81408, 0x1081008, 0x1081408, 0x81108, 0x81508, 0x1081108, 0x1081508, 0x81108, 0x81508, 0x1081108, 0x1081508, 0x10081008, 0x10081408, 0x11081008, 0x11081408, 0x10081008, 0x10081408, 0x11081008, 0x11081408, 0x10081108, 0x10081508, 0x11081108, 0x11081508, 0x10081108, 0x10081508, 0x11081108, 0x11081508]; - $keys = []; - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // pad the key and remove extra characters as appropriate. - $key = \str_pad(\substr($this->key, $des_round * 8, 8), 8, "\x00"); - // Perform the PC/1 transformation and compute C and D. - $t = \unpack('Nl/Nr', $key); - list($l, $r) = [$t['l'], $t['r']]; - $key = self::$shuffle[$pc1map[$r & 0xff]] & "\x80\x80\x80\x80\x80\x80\x80\x00" | self::$shuffle[$pc1map[$r >> 8 & 0xff]] & "@@@@@@@\x00" | self::$shuffle[$pc1map[$r >> 16 & 0xff]] & " \x00" | self::$shuffle[$pc1map[$r >> 24 & 0xff]] & "\x10\x10\x10\x10\x10\x10\x10\x00" | self::$shuffle[$pc1map[$l & 0xff]] & "\x08\x08\x08\x08\x08\x08\x08\x00" | self::$shuffle[$pc1map[$l >> 8 & 0xff]] & "\x04\x04\x04\x04\x04\x04\x04\x00" | self::$shuffle[$pc1map[$l >> 16 & 0xff]] & "\x02\x02\x02\x02\x02\x02\x02\x00" | self::$shuffle[$pc1map[$l >> 24 & 0xff]] & "\x01\x01\x01\x01\x01\x01\x01\x00"; - $key = \unpack('Nc/Nd', $key); - $c = $key['c'] >> 4 & 0xfffffff; - $d = $key['d'] >> 4 & 0xffffff0 | $key['c'] & 0xf; - $keys[$des_round] = [self::ENCRYPT => [], self::DECRYPT => \array_fill(0, 32, 0)]; - for ($i = 0, $ki = 31; $i < 16; ++$i, $ki -= 2) { - $c <<= $shifts[$i]; - $c = ($c | $c >> 28) & 0xfffffff; - $d <<= $shifts[$i]; - $d = ($d | $d >> 28) & 0xfffffff; - // Perform the PC-2 transformation. - $cp = $pc2mapc1[$c >> 24] | $pc2mapc2[$c >> 16 & 0xff] | $pc2mapc3[$c >> 8 & 0xff] | $pc2mapc4[$c & 0xff]; - $dp = $pc2mapd1[$d >> 24] | $pc2mapd2[$d >> 16 & 0xff] | $pc2mapd3[$d >> 8 & 0xff] | $pc2mapd4[$d & 0xff]; - // Reorder: odd bytes/even bytes. Push the result in key schedule. - $val1 = $cp & \intval(0xff000000) | $cp << 8 & 0xff0000 | $dp >> 16 & 0xff00 | $dp >> 8 & 0xff; - $val2 = $cp << 8 & \intval(0xff000000) | $cp << 16 & 0xff0000 | $dp >> 8 & 0xff00 | $dp & 0xff; - $keys[$des_round][self::ENCRYPT][] = $val1; - $keys[$des_round][self::DECRYPT][$ki - 1] = $val1; - $keys[$des_round][self::ENCRYPT][] = $val2; - $keys[$des_round][self::DECRYPT][$ki] = $val2; - } - } - switch ($this->des_rounds) { - case 3: - // 3DES keys - $this->keys = [self::ENCRYPT => \array_merge($keys[0][self::ENCRYPT], $keys[1][self::DECRYPT], $keys[2][self::ENCRYPT]), self::DECRYPT => \array_merge($keys[2][self::DECRYPT], $keys[1][self::ENCRYPT], $keys[0][self::DECRYPT])]; - break; - // case 1: // DES keys - default: - $this->keys = [self::ENCRYPT => $keys[0][self::ENCRYPT], self::DECRYPT => $keys[0][self::DECRYPT]]; - } - } - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - // Engine configuration for: - // - DES ($des_rounds == 1) or - // - 3DES ($des_rounds == 3) - $des_rounds = $this->des_rounds; - $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map("intval", self::$sbox1); - $sbox2 = array_map("intval", self::$sbox2); - $sbox3 = array_map("intval", self::$sbox3); - $sbox4 = array_map("intval", self::$sbox4); - $sbox5 = array_map("intval", self::$sbox5); - $sbox6 = array_map("intval", self::$sbox6); - $sbox7 = array_map("intval", self::$sbox7); - $sbox8 = array_map("intval", self::$sbox8);' . ' - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; - $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; - } - } - '; - $k = [self::ENCRYPT => $this->keys[self::ENCRYPT], self::DECRYPT => $this->keys[self::DECRYPT]]; - $init_encrypt = ''; - $init_decrypt = ''; - // Creating code for en- and decryption. - $crypt_block = []; - foreach ([self::ENCRYPT, self::DECRYPT] as $c) { - /* Do the initial IP permutation. */ - $crypt_block[$c] = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - $in = unpack("N*", - ($shuffleip[ $r & 0xFF] & "\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\\x40\\x40\\x40\\x40\\x40\\x40\\x40\\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10") | - ($shuffleip[ $l & 0xFF] & "\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01") - ); - ' . ' - $l = $in[1]; - $r = $in[2]; - '; - $l = '$l'; - $r = '$r'; - // Perform DES or 3DES. - for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; ++$i) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $crypt_block[$c] .= ' - $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; - $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; - '; - // end of "the Feistel (F) function" - // swap L & R - list($l, $r) = [$r, $l]; - } - list($l, $r) = [$r, $l]; - } - // Perform the inverse IP permutation. - $crypt_block[$c] .= '$in = - ($shuffleinvip[($l >> 24) & 0xFF] & "\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80") | - ($shuffleinvip[($r >> 24) & 0xFF] & "\\x40\\x40\\x40\\x40\\x40\\x40\\x40\\x40") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04") | - ($shuffleinvip[ $l & 0xFF] & "\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02") | - ($shuffleinvip[ $r & 0xFF] & "\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01"); - '; - } - // Creates the inline-crypt function - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'init_encrypt' => $init_encrypt, 'init_decrypt' => $init_decrypt, 'encrypt_block' => $crypt_block[self::ENCRYPT], 'decrypt_block' => $crypt_block[self::DECRYPT]]); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH.php deleted file mode 100644 index c789c92..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH.php +++ /dev/null @@ -1,295 +0,0 @@ - - * - * - * - * @author Jim Wigginton - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\AsymmetricKey; -use phpseclib3\Crypt\DH\Parameters; -use phpseclib3\Crypt\DH\PrivateKey; -use phpseclib3\Crypt\DH\PublicKey; -use phpseclib3\Exception\NoKeyLoadedException; -use phpseclib3\Exception\UnsupportedOperationException; -use phpseclib3\Math\BigInteger; -/** - * Pure-PHP (EC)DH implementation - * - * @author Jim Wigginton - */ -abstract class DH extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'DH'; - /** - * DH prime - * - * @var \phpseclib3\Math\BigInteger - */ - protected $prime; - /** - * DH Base - * - * Prime divisor of p-1 - * - * @var \phpseclib3\Math\BigInteger - */ - protected $base; - /** - * Public Key - * - * @var \phpseclib3\Math\BigInteger - */ - protected $publicKey; - /** - * Create DH parameters - * - * This method is a bit polymorphic. It can take any of the following: - * - two BigInteger's (prime and base) - * - an integer representing the size of the prime in bits (the base is assumed to be 2) - * - a string (eg. diffie-hellman-group14-sha1) - * - * @return Parameters - */ - public static function createParameters(...$args) - { - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createParameters() should not be called from final classes (' . static::class . ')'); - } - $params = new Parameters(); - if (\count($args) == 2 && $args[0] instanceof BigInteger && $args[1] instanceof BigInteger) { - //if (!$args[0]->isPrime()) { - // throw new \InvalidArgumentException('The first parameter should be a prime number'); - //} - $params->prime = $args[0]; - $params->base = $args[1]; - return $params; - } elseif (\count($args) == 1 && \is_numeric($args[0])) { - $params->prime = BigInteger::randomPrime($args[0]); - $params->base = new BigInteger(2); - return $params; - } elseif (\count($args) != 1 || !\is_string($args[0])) { - throw new \InvalidArgumentException('Valid parameters are either: two BigInteger\'s (prime and base), a single integer (the length of the prime; base is assumed to be 2) or a string'); - } - switch ($args[0]) { - // see http://tools.ietf.org/html/rfc2409#section-6.2 and - // http://tools.ietf.org/html/rfc2412, appendex E - case 'diffie-hellman-group1-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; - break; - // see http://tools.ietf.org/html/rfc3526#section-3 - case 'diffie-hellman-group14-sha1': - // 2048-bit MODP Group - case 'diffie-hellman-group14-sha256': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-4 - case 'diffie-hellman-group15-sha512': - // 3072-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-5 - case 'diffie-hellman-group16-sha512': - // 4096-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-6 - case 'diffie-hellman-group17-sha512': - // 6144-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DCC4024FFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-7 - case 'diffie-hellman-group18-sha512': - // 8192-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4' . '38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED' . '2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652D' . 'E3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B' . '4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6' . '6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851D' . 'F9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92' . '4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA' . '9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFF'; - break; - default: - throw new \InvalidArgumentException('Invalid named prime provided'); - } - $params->prime = new BigInteger($prime, 16); - $params->base = new BigInteger(2); - return $params; - } - /** - * Create public / private key pair. - * - * The rationale for the second parameter is described in http://tools.ietf.org/html/rfc4419#section-6.2 : - * - * "To increase the speed of the key exchange, both client and server may - * reduce the size of their private exponents. It should be at least - * twice as long as the key material that is generated from the shared - * secret. For more details, see the paper by van Oorschot and Wiener - * [VAN-OORSCHOT]." - * - * $length is in bits - * - * @param Parameters $params - * @param int $length optional - * @return DH\PrivateKey - */ - public static function createKey(Parameters $params, $length = 0) - { - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - $one = new BigInteger(1); - if ($length) { - $max = $one->bitwise_leftShift($length); - $max = $max->subtract($one); - } else { - $max = $params->prime->subtract($one); - } - $key = new PrivateKey(); - $key->prime = $params->prime; - $key->base = $params->base; - $key->privateKey = BigInteger::randomRange($one, $max); - $key->publicKey = $key->base->powMod($key->privateKey, $key->prime); - return $key; - } - /** - * Compute Shared Secret - * - * @param PrivateKey|EC $private - * @param PublicKey|BigInteger|string $public - * @return mixed - */ - public static function computeSecret($private, $public) - { - if ($private instanceof PrivateKey) { - // DH\PrivateKey - switch (\true) { - case $public instanceof PublicKey: - if (!$private->prime->equals($public->prime) || !$private->base->equals($public->base)) { - throw new \InvalidArgumentException('The public and private key do not share the same prime and / or base numbers'); - } - return $public->publicKey->powMod($private->privateKey, $private->prime)->toBytes(\true); - case \is_string($public): - $public = new BigInteger($public, -256); - // fall-through - case $public instanceof BigInteger: - return $public->powMod($private->privateKey, $private->prime)->toBytes(\true); - default: - throw new \InvalidArgumentException('$public needs to be an instance of DH\\PublicKey, a BigInteger or a string'); - } - } - if ($private instanceof \phpseclib3\Crypt\EC\PrivateKey) { - switch (\true) { - case $public instanceof \phpseclib3\Crypt\EC\PublicKey: - $public = $public->getEncodedCoordinates(); - // fall-through - case \is_string($public): - $point = $private->multiply($public); - switch ($private->getCurve()) { - case 'Curve25519': - case 'Curve448': - $secret = $point; - break; - default: - // according to https://www.secg.org/sec1-v2.pdf#page=33 only X is returned - $secret = \substr($point, 1, \strlen($point) - 1 >> 1); - } - /* - if (($secret[0] & "\x80") === "\x80") { - $secret = "\0$secret"; - } - */ - return $secret; - default: - throw new \InvalidArgumentException('$public needs to be an instance of EC\\PublicKey or a string (an encoded coordinate)'); - } - } - } - /** - * Load the key - * - * @param string $key - * @param string $password optional - * @return AsymmetricKey - */ - public static function load($key, $password = \false) - { - try { - return \phpseclib3\Crypt\EC::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - return parent::load($key, $password); - } - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - if (!isset($components['privateKey']) && !isset($components['publicKey'])) { - $new = new Parameters(); - } else { - $new = isset($components['privateKey']) ? new PrivateKey() : new PublicKey(); - } - $new->prime = $components['prime']; - $new->base = $components['base']; - if (isset($components['privateKey'])) { - $new->privateKey = $components['privateKey']; - } - if (isset($components['publicKey'])) { - $new->publicKey = $components['publicKey']; - } - return $new; - } - /** - * Determines which hashing function should be used - * - * @param string $hash - */ - public function withHash($hash) - { - throw new UnsupportedOperationException('DH does not use a hash algorithm'); - } - /** - * Returns the hash algorithm currently being used - * - */ - public function getHash() - { - throw new UnsupportedOperationException('DH does not use a hash algorithm'); - } - /** - * Returns the parameters - * - * A public / private key is only returned if the currently loaded "key" contains an x or y - * value. - * - * @see self::getPublicKey() - * @return mixed - */ - public function getParameters() - { - $type = \phpseclib3\Crypt\DH::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - $key = $type::saveParameters($this->prime, $this->base); - return \phpseclib3\Crypt\DH::load($key, 'PKCS1'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php deleted file mode 100644 index f95ef12..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DH\Formats\Keys; - -use phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * "PKCS1" Formatted DH Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP); - if (!\is_array($components)) { - throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); - } - return $components; - } - /** - * Convert EC parameters to the appropriate format - * - * @return string - */ - public static function saveParameters(BigInteger $prime, BigInteger $base, array $options = []) - { - $params = ['prime' => $prime, 'base' => $base]; - $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - return "-----BEGIN DH PARAMETERS-----\r\n" . \chunk_split(\base64_encode($params), 64) . "-----END DH PARAMETERS-----\r\n"; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php deleted file mode 100644 index 2730b16..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DH\Formats\Keys; - -use phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * PKCS#8 Formatted DH Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'dhKeyAgreement'; - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.113549.1.3.1'; - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = \false; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; - $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); - if (empty($decoded)) { - throw new \RuntimeException('Unable to decode BER of parameters'); - } - $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP); - if (!\is_array($components)) { - throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); - } - $decoded = ASN1::decodeBER($key[$type]); - switch (\true) { - case !isset($decoded): - case !isset($decoded[0]['content']): - case !$decoded[0]['content'] instanceof BigInteger: - throw new \RuntimeException('Unable to decode BER of parameters'); - } - $components[$type] = $decoded[0]['content']; - return $components; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $prime - * @param \phpseclib3\Math\BigInteger $base - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Math\BigInteger $publicKey - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $prime, BigInteger $base, BigInteger $privateKey, BigInteger $publicKey, $password = '', array $options = []) - { - $params = ['prime' => $prime, 'base' => $base]; - $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($privateKey, ['type' => ASN1::TYPE_INTEGER]); - return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $prime - * @param \phpseclib3\Math\BigInteger $base - * @param \phpseclib3\Math\BigInteger $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $prime, BigInteger $base, BigInteger $publicKey, array $options = []) - { - $params = ['prime' => $prime, 'base' => $base]; - $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($publicKey, ['type' => ASN1::TYPE_INTEGER]); - return self::wrapPublicKey($key, $params); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php deleted file mode 100644 index 19bfd5a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DH; - -use phpseclib3\Crypt\DH; -/** - * DH Parameters - * - * @author Jim Wigginton - */ -final class Parameters extends DH -{ - /** - * Returns the parameters - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type = 'PKCS1', array $options = []) - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - return $type::saveParameters($this->prime, $this->base, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php deleted file mode 100644 index 4c66996..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DH; - -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\DH; -/** - * DH Private Key - * - * @author Jim Wigginton - */ -final class PrivateKey extends DH -{ - use Common\Traits\PasswordProtected; - /** - * Private Key - * - * @var \phpseclib3\Math\BigInteger - */ - protected $privateKey; - /** - * Public Key - * - * @var \phpseclib3\Math\BigInteger - */ - protected $publicKey; - /** - * Returns the public key - * - * @return DH\PublicKey - */ - public function getPublicKey() - { - $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); - if (!isset($this->publicKey)) { - $this->publicKey = $this->base->powMod($this->privateKey, $this->prime); - } - $key = $type::savePublicKey($this->prime, $this->base, $this->publicKey); - return DH::loadFormat('PKCS8', $key); - } - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); - if (!isset($this->publicKey)) { - $this->publicKey = $this->base->powMod($this->privateKey, $this->prime); - } - return $type::savePrivateKey($this->prime, $this->base, $this->privateKey, $this->publicKey, $this->password, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php deleted file mode 100644 index 744a088..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DH; - -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\DH; -/** - * DH Public Key - * - * @author Jim Wigginton - */ -final class PublicKey extends DH -{ - use Common\Traits\Fingerprint; - /** - * Returns the public key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - return $type::savePublicKey($this->prime, $this->base, $this->publicKey, $options); - } - /** - * Returns the public key as a BigInteger - * - * @return \phpseclib3\Math\BigInteger - */ - public function toBigInteger() - { - return $this->publicKey; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA.php deleted file mode 100644 index 8aacd7e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA.php +++ /dev/null @@ -1,292 +0,0 @@ - - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $signature = $private->sign($plaintext); - * - * echo $public->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * @author Jim Wigginton - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\AsymmetricKey; -use phpseclib3\Crypt\DSA\Parameters; -use phpseclib3\Crypt\DSA\PrivateKey; -use phpseclib3\Crypt\DSA\PublicKey; -use phpseclib3\Exception\InsufficientSetupException; -use phpseclib3\Math\BigInteger; -/** - * Pure-PHP FIPS 186-4 compliant implementation of DSA. - * - * @author Jim Wigginton - */ -abstract class DSA extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'DSA'; - /** - * DSA Prime P - * - * @var \phpseclib3\Math\BigInteger - */ - protected $p; - /** - * DSA Group Order q - * - * Prime divisor of p-1 - * - * @var \phpseclib3\Math\BigInteger - */ - protected $q; - /** - * DSA Group Generator G - * - * @var \phpseclib3\Math\BigInteger - */ - protected $g; - /** - * DSA public key value y - * - * @var \phpseclib3\Math\BigInteger - */ - protected $y; - /** - * Signature Format - * - * @var string - */ - protected $sigFormat; - /** - * Signature Format (Short) - * - * @var string - */ - protected $shortFormat; - /** - * Create DSA parameters - * - * @param int $L - * @param int $N - * @return \phpseclib3\Crypt\DSA|bool - */ - public static function createParameters($L = 2048, $N = 224) - { - self::initialize_static_variables(); - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createParameters() should not be called from final classes (' . static::class . ')'); - } - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - switch (\true) { - case $N == 160: - /* - in FIPS 186-1 and 186-2 N was fixed at 160 whereas K had an upper bound of 1024. - RFC 4253 (SSH Transport Layer Protocol) references FIPS 186-2 and as such most - SSH DSA implementations only support keys with an N of 160. - puttygen let's you set the size of L (but not the size of N) and uses 2048 as the - default L value. that's not really compliant with any of the FIPS standards, however, - for the purposes of maintaining compatibility with puttygen, we'll support it - */ - //case ($L >= 512 || $L <= 1024) && (($L & 0x3F) == 0) && $N == 160: - // FIPS 186-3 changed this as follows: - //case $L == 1024 && $N == 160: - case $L == 2048 && $N == 224: - case $L == 2048 && $N == 256: - case $L == 3072 && $N == 256: - break; - default: - throw new \InvalidArgumentException('Invalid values for N and L'); - } - $two = new BigInteger(2); - $q = BigInteger::randomPrime($N); - $divisor = $q->multiply($two); - do { - $x = BigInteger::random($L); - list(, $c) = $x->divide($divisor); - $p = $x->subtract($c->subtract(self::$one)); - } while ($p->getLength() != $L || !$p->isPrime()); - $p_1 = $p->subtract(self::$one); - list($e) = $p_1->divide($q); - // quoting http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf#page=50 , - // "h could be obtained from a random number generator or from a counter that - // changes after each use". PuTTY (sshdssg.c) starts h off at 1 and increments - // it on each loop. wikipedia says "commonly h = 2 is used" so we'll just do that - $h = clone $two; - while (\true) { - $g = $h->powMod($e, $p); - if (!$g->equals(self::$one)) { - break; - } - $h = $h->add(self::$one); - } - $dsa = new Parameters(); - $dsa->p = $p; - $dsa->q = $q; - $dsa->g = $g; - return $dsa; - } - /** - * Create public / private key pair. - * - * This method is a bit polymorphic. It can take a DSA/Parameters object, L / N as two distinct parameters or - * no parameters (at which point L and N will be generated with this method) - * - * Returns the private key, from which the publickey can be extracted - * - * @param int[] ...$args - * @return DSA\PrivateKey - */ - public static function createKey(...$args) - { - self::initialize_static_variables(); - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - if (\count($args) == 2 && \is_int($args[0]) && \is_int($args[1])) { - $params = self::createParameters($args[0], $args[1]); - } elseif (\count($args) == 1 && $args[0] instanceof Parameters) { - $params = $args[0]; - } elseif (!\count($args)) { - $params = self::createParameters(); - } else { - throw new InsufficientSetupException('Valid parameters are either two integers (L and N), a single DSA object or no parameters at all.'); - } - $private = new PrivateKey(); - $private->p = $params->p; - $private->q = $params->q; - $private->g = $params->g; - $private->x = BigInteger::randomRange(self::$one, $private->q->subtract(self::$one)); - $private->y = $private->g->powMod($private->x, $private->p); - //$public = clone $private; - //unset($public->x); - return $private->withHash($params->hash->getHash())->withSignatureFormat($params->shortFormat); - } - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - if (!isset($components['x']) && !isset($components['y'])) { - $new = new Parameters(); - } elseif (isset($components['x'])) { - $new = new PrivateKey(); - $new->x = $components['x']; - } else { - $new = new PublicKey(); - } - $new->p = $components['p']; - $new->q = $components['q']; - $new->g = $components['g']; - if (isset($components['y'])) { - $new->y = $components['y']; - } - return $new; - } - /** - * Constructor - * - * PublicKey and PrivateKey objects can only be created from abstract RSA class - */ - protected function __construct() - { - $this->sigFormat = self::validatePlugin('Signature', 'ASN1'); - $this->shortFormat = 'ASN1'; - parent::__construct(); - } - /** - * Returns the key size - * - * More specifically, this L (the length of DSA Prime P) and N (the length of DSA Group Order q) - * - * @return array - */ - public function getLength() - { - return ['L' => $this->p->getLength(), 'N' => $this->q->getLength()]; - } - /** - * Returns the current engine being used - * - * @see self::useInternalEngine() - * @see self::useBestEngine() - * @return string - */ - public function getEngine() - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - return self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods()) ? 'OpenSSL' : 'PHP'; - } - /** - * Returns the parameters - * - * A public / private key is only returned if the currently loaded "key" contains an x or y - * value. - * - * @see self::getPublicKey() - * @return mixed - */ - public function getParameters() - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - $key = $type::saveParameters($this->p, $this->q, $this->g); - return \phpseclib3\Crypt\DSA::load($key, 'PKCS1')->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); - } - /** - * Determines the signature padding mode - * - * Valid values are: ASN1, SSH2, Raw - * - * @param string $format - */ - public function withSignatureFormat($format) - { - $new = clone $this; - $new->shortFormat = $format; - $new->sigFormat = self::validatePlugin('Signature', $format); - return $new; - } - /** - * Returns the signature format currently being used - * - */ - public function getSignatureFormat() - { - return $this->shortFormat; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php deleted file mode 100644 index fc504c1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; -use phpseclib3\Math\BigInteger; -/** - * OpenSSH Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH extends Progenitor -{ - /** - * Supported Key Types - * - * @var array - */ - protected static $types = ['ssh-dss']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $parsed = parent::load($key, $password); - if (isset($parsed['paddedKey'])) { - list($type) = Strings::unpackSSH2('s', $parsed['paddedKey']); - if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ({$type} vs {$parsed['type']})"); - } - list($p, $q, $g, $y, $x, $comment) = Strings::unpackSSH2('i5s', $parsed['paddedKey']); - return \compact('p', 'q', 'g', 'y', 'x', 'comment'); - } - list($p, $q, $g, $y) = Strings::unpackSSH2('iiii', $parsed['publicKey']); - $comment = $parsed['comment']; - return \compact('p', 'q', 'g', 'y', 'comment'); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, array $options = []) - { - if ($q->getLength() != 160) { - throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); - } - // from : - // string "ssh-dss" - // mpint p - // mpint q - // mpint g - // mpint y - $DSAPublicKey = Strings::packSSH2('siiii', 'ssh-dss', $p, $q, $g, $y); - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $DSAPublicKey; - } - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $DSAPublicKey = 'ssh-dss ' . \base64_encode($DSAPublicKey) . ' ' . $comment; - return $DSAPublicKey; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param \phpseclib3\Math\BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) - { - $publicKey = self::savePublicKey($p, $q, $g, $y, ['binary' => \true]); - $privateKey = Strings::packSSH2('si5', 'ssh-dss', $p, $q, $g, $y, $x); - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php deleted file mode 100644 index 01ae28c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * PKCS#1 Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $key = ASN1::asn1map($decoded[0], Maps\DSAParams::MAP); - if (\is_array($key)) { - return $key; - } - $key = ASN1::asn1map($decoded[0], Maps\DSAPrivateKey::MAP); - if (\is_array($key)) { - return $key; - } - $key = ASN1::asn1map($decoded[0], Maps\DSAPublicKey::MAP); - if (\is_array($key)) { - return $key; - } - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - /** - * Convert DSA parameters to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @return string - */ - public static function saveParameters(BigInteger $p, BigInteger $q, BigInteger $g) - { - $key = ['p' => $p, 'q' => $q, 'g' => $g]; - $key = ASN1::encodeDER($key, Maps\DSAParams::MAP); - return "-----BEGIN DSA PARAMETERS-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END DSA PARAMETERS-----\r\n"; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param \phpseclib3\Math\BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) - { - $key = ['version' => 0, 'p' => $p, 'q' => $q, 'g' => $g, 'y' => $y, 'x' => $x]; - $key = ASN1::encodeDER($key, Maps\DSAPrivateKey::MAP); - return self::wrapPrivateKey($key, 'DSA', $password, $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - $key = ASN1::encodeDER($y, Maps\DSAPublicKey::MAP); - return self::wrapPublicKey($key, 'DSA'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php deleted file mode 100644 index 200b36e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Keys; - -use phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * PKCS#8 Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'id-dsa'; - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.10040.4.1'; - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = \false; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; - $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER of parameters'); - } - $components = ASN1::asn1map($decoded[0], Maps\DSAParams::MAP); - if (!\is_array($components)) { - throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); - } - $decoded = ASN1::decodeBER($key[$type]); - if (empty($decoded)) { - throw new \RuntimeException('Unable to decode BER'); - } - $var = $type == 'privateKey' ? 'x' : 'y'; - $components[$var] = ASN1::asn1map($decoded[0], Maps\DSAPublicKey::MAP); - if (!$components[$var] instanceof BigInteger) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - if (isset($key['meta'])) { - $components['meta'] = $key['meta']; - } - return $components; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param \phpseclib3\Math\BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) - { - $params = ['p' => $p, 'q' => $q, 'g' => $g]; - $params = ASN1::encodeDER($params, Maps\DSAParams::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($x, Maps\DSAPublicKey::MAP); - return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, array $options = []) - { - $params = ['p' => $p, 'q' => $q, 'g' => $g]; - $params = ASN1::encodeDER($params, Maps\DSAParams::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($y, Maps\DSAPublicKey::MAP); - return self::wrapPublicKey($key, $params); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php deleted file mode 100644 index 4868577..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,98 +0,0 @@ - 160 kinda useless, hence this handlers not supporting such keys. - * - * PHP version 5 - * - * @author Jim Wigginton - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; -use phpseclib3\Math\BigInteger; -/** - * PuTTY Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY extends Progenitor -{ - /** - * Public Handler - * - * @var string - */ - const PUBLIC_HANDLER = 'phpseclib3\\Crypt\\DSA\\Formats\\Keys\\OpenSSH'; - /** - * Algorithm Identifier - * - * @var array - */ - protected static $types = ['ssh-dss']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $components = parent::load($key, $password); - if (!isset($components['private'])) { - return $components; - } - \extract($components); - unset($components['public'], $components['private']); - list($p, $q, $g, $y) = Strings::unpackSSH2('iiii', $public); - list($x) = Strings::unpackSSH2('i', $private); - return \compact('p', 'q', 'g', 'y', 'x', 'comment'); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param \phpseclib3\Math\BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = \false, array $options = []) - { - if ($q->getLength() != 160) { - throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); - } - $public = Strings::packSSH2('iiii', $p, $q, $g, $y); - $private = Strings::packSSH2('i', $x); - return self::wrapPrivateKey($public, $private, 'ssh-dss', $password, $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - if ($q->getLength() != 160) { - throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); - } - return self::wrapPublicKey(Strings::packSSH2('iiii', $p, $q, $g, $y), 'ssh-dss'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php deleted file mode 100644 index a5914c1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Keys; - -use phpseclib3\Math\BigInteger; -/** - * Raw DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class Raw -{ - /** - * Break a public or private key down into its constituent components - * - * @param array $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!\is_array($key)) { - throw new \UnexpectedValueException('Key should be a array - not a ' . \gettype($key)); - } - switch (\true) { - case !isset($key['p']) || !isset($key['q']) || !isset($key['g']): - case !$key['p'] instanceof BigInteger: - case !$key['q'] instanceof BigInteger: - case !$key['g'] instanceof BigInteger: - case !isset($key['x']) && !isset($key['y']): - case isset($key['x']) && !$key['x'] instanceof BigInteger: - case isset($key['y']) && !$key['y'] instanceof BigInteger: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $options = ['p' => 1, 'q' => 1, 'g' => 1, 'x' => 1, 'y' => 1]; - return \array_intersect_key($key, $options); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @param \phpseclib3\Math\BigInteger $x - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '') - { - return \compact('p', 'q', 'g', 'y', 'x'); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - return \compact('p', 'q', 'g', 'y'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php deleted file mode 100644 index b52658e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php +++ /dev/null @@ -1,123 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\BadConfigurationException; -use phpseclib3\Math\BigInteger; -/** - * XML Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class XML -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - if (!\class_exists('DOMDocument')) { - throw new BadConfigurationException('The dom extension is not setup correctly on this system'); - } - $use_errors = \libxml_use_internal_errors(\true); - $dom = new \DOMDocument(); - if (\substr($key, 0, 5) != '' . $key . ''; - } - if (!$dom->loadXML($key)) { - \libxml_use_internal_errors($use_errors); - throw new \UnexpectedValueException('Key does not appear to contain XML'); - } - $xpath = new \DOMXPath($dom); - $keys = ['p', 'q', 'g', 'y', 'j', 'seed', 'pgencounter']; - foreach ($keys as $key) { - // $dom->getElementsByTagName($key) is case-sensitive - $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{$key}']"); - if (!$temp->length) { - continue; - } - $value = new BigInteger(Strings::base64_decode($temp->item(0)->nodeValue), 256); - switch ($key) { - case 'p': - // a prime modulus meeting the [DSS] requirements - // Parameters P, Q, and G can be public and common to a group of users. They might be known - // from application context. As such, they are optional but P and Q must either both appear - // or both be absent - $components['p'] = $value; - break; - case 'q': - // an integer in the range 2**159 < Q < 2**160 which is a prime divisor of P-1 - $components['q'] = $value; - break; - case 'g': - // an integer with certain properties with respect to P and Q - $components['g'] = $value; - break; - case 'y': - // G**X mod P (where X is part of the private key and not made public) - $components['y'] = $value; - // the remaining options do not do anything - case 'j': - // (P - 1) / Q - // Parameter J is available for inclusion solely for efficiency as it is calculatable from - // P and Q - case 'seed': - // a DSA prime generation seed - // Parameters seed and pgenCounter are used in the DSA prime number generation algorithm - // specified in [DSS]. As such, they are optional but must either both be present or both - // be absent - case 'pgencounter': - } - } - \libxml_use_internal_errors($use_errors); - if (!isset($components['y'])) { - throw new \UnexpectedValueException('Key is missing y component'); - } - switch (\true) { - case !isset($components['p']): - case !isset($components['q']): - case !isset($components['g']): - return ['y' => $components['y']]; - } - return $components; - } - /** - * Convert a public key to the appropriate format - * - * See https://www.w3.org/TR/xmldsig-core/#sec-DSAKeyValue - * - * @param \phpseclib3\Math\BigInteger $p - * @param \phpseclib3\Math\BigInteger $q - * @param \phpseclib3\Math\BigInteger $g - * @param \phpseclib3\Math\BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - return "\r\n" . '

      ' . Strings::base64_encode($p->toBytes()) . "

      \r\n" . ' ' . Strings::base64_encode($q->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($g->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($y->toBytes()) . "\r\n" . '
      '; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php deleted file mode 100644 index 76c172a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Signature; - -use phpseclib3\File\ASN1 as Encoder; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * ASN1 Signature Handler - * - * @author Jim Wigginton - */ -abstract class ASN1 -{ - /** - * Loads a signature - * - * @param string $sig - * @return array|bool - */ - public static function load($sig) - { - if (!\is_string($sig)) { - return \false; - } - $decoded = Encoder::decodeBER($sig); - if (empty($decoded)) { - return \false; - } - $components = Encoder::asn1map($decoded[0], Maps\DssSigValue::MAP); - return $components; - } - /** - * Returns a signature in the appropriate format - * - * @param \phpseclib3\Math\BigInteger $r - * @param \phpseclib3\Math\BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - return Encoder::encodeDER(\compact('r', 's'), Maps\DssSigValue::MAP); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php deleted file mode 100644 index 3c7d3e3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Signature; - -use phpseclib3\Crypt\Common\Formats\Signature\Raw as Progenitor; -/** - * Raw DSA Signature Handler - * - * @author Jim Wigginton - */ -abstract class Raw extends Progenitor -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php deleted file mode 100644 index 447daaf..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA\Formats\Signature; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Math\BigInteger; -/** - * SSH2 Signature Handler - * - * @author Jim Wigginton - */ -abstract class SSH2 -{ - /** - * Loads a signature - * - * @param string $sig - * @return mixed - */ - public static function load($sig) - { - if (!\is_string($sig)) { - return \false; - } - $result = Strings::unpackSSH2('ss', $sig); - if ($result === \false) { - return \false; - } - list($type, $blob) = $result; - if ($type != 'ssh-dss' || \strlen($blob) != 40) { - return \false; - } - return ['r' => new BigInteger(\substr($blob, 0, 20), 256), 's' => new BigInteger(\substr($blob, 20), 256)]; - } - /** - * Returns a signature in the appropriate format - * - * @param \phpseclib3\Math\BigInteger $r - * @param \phpseclib3\Math\BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - if ($r->getLength() > 160 || $s->getLength() > 160) { - return \false; - } - return Strings::packSSH2('ss', 'ssh-dss', \str_pad($r->toBytes(), 20, "\x00", \STR_PAD_LEFT) . \str_pad($s->toBytes(), 20, "\x00", \STR_PAD_LEFT)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php deleted file mode 100644 index af58b45..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA; - -use phpseclib3\Crypt\DSA; -/** - * DSA Parameters - * - * @author Jim Wigginton - */ -final class Parameters extends DSA -{ - /** - * Returns the parameters - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type = 'PKCS1', array $options = []) - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - return $type::saveParameters($this->p, $this->q, $this->g, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php deleted file mode 100644 index 4e2313f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php +++ /dev/null @@ -1,131 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA; - -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature; -use phpseclib3\Math\BigInteger; -/** - * DSA Private Key - * - * @author Jim Wigginton - */ -final class PrivateKey extends DSA implements Common\PrivateKey -{ - use Common\Traits\PasswordProtected; - /** - * DSA secret exponent x - * - * @var \phpseclib3\Math\BigInteger - */ - protected $x; - /** - * Returns the public key - * - * If you do "openssl rsa -in private.rsa -pubout -outform PEM" you get a PKCS8 formatted key - * that contains a publicKeyAlgorithm AlgorithmIdentifier and a publicKey BIT STRING. - * An AlgorithmIdentifier contains an OID and a parameters field. With RSA public keys this - * parameters field is NULL. With DSA PKCS8 public keys it is not - it contains the p, q and g - * variables. The publicKey BIT STRING contains, simply, the y variable. This can be verified - * by getting a DSA PKCS8 public key: - * - * "openssl dsa -in private.dsa -pubout -outform PEM" - * - * ie. just swap out rsa with dsa in the rsa command above. - * - * A PKCS1 public key corresponds to the publicKey portion of the PKCS8 key. In the case of RSA - * the publicKey portion /is/ the key. In the case of DSA it is not. You cannot verify a signature - * without the parameters and the PKCS1 DSA public key format does not include the parameters. - * - * @see self::getPrivateKey() - * @return mixed - */ - public function getPublicKey() - { - $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); - if (!isset($this->y)) { - $this->y = $this->g->powMod($this->x, $this->p); - } - $key = $type::savePublicKey($this->p, $this->q, $this->g, $this->y); - return DSA::loadFormat('PKCS8', $key)->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); - } - /** - * Create a signature - * - * @see self::verify() - * @param string $message - * @return mixed - */ - public function sign($message) - { - $format = $this->sigFormat; - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { - $signature = ''; - $result = \openssl_sign($message, $signature, $this->toString('PKCS8'), $this->hash->getHash()); - if ($result) { - if ($this->shortFormat == 'ASN1') { - return $signature; - } - \extract(ASN1Signature::load($signature)); - return $format::save($r, $s); - } - } - $h = $this->hash->hash($message); - $h = $this->bits2int($h); - while (\true) { - $k = BigInteger::randomRange(self::$one, $this->q->subtract(self::$one)); - $r = $this->g->powMod($k, $this->p); - list(, $r) = $r->divide($this->q); - if ($r->equals(self::$zero)) { - continue; - } - $kinv = $k->modInverse($this->q); - $temp = $h->add($this->x->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($this->q); - if (!$s->equals(self::$zero)) { - break; - } - } - // the following is an RFC6979 compliant implementation of deterministic DSA - // it's unused because it's mainly intended for use when a good CSPRNG isn't - // available. if phpseclib's CSPRNG isn't good then even key generation is - // suspect - /* - $h1 = $this->hash->hash($message); - $k = $this->computek($h1); - $r = $this->g->powMod($k, $this->p); - list(, $r) = $r->divide($this->q); - $kinv = $k->modInverse($this->q); - $h1 = $this->bits2int($h1); - $temp = $h1->add($this->x->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($this->q); - */ - return $format::save($r, $s); - } - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); - if (!isset($this->y)) { - $this->y = $this->g->powMod($this->x, $this->p); - } - return $type::savePrivateKey($this->p, $this->q, $this->g, $this->y, $this->x, $this->password, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php deleted file mode 100644 index 1cde29f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\DSA; - -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature; -/** - * DSA Public Key - * - * @author Jim Wigginton - */ -final class PublicKey extends DSA implements Common\PublicKey -{ - use Common\Traits\Fingerprint; - /** - * Verify a signature - * - * @see self::verify() - * @param string $message - * @param string $signature - * @return mixed - */ - public function verify($message, $signature) - { - $format = $this->sigFormat; - $params = $format::load($signature); - if ($params === \false || \count($params) != 2) { - return \false; - } - \extract($params); - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { - $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature; - $result = \openssl_verify($message, $sig, $this->toString('PKCS8'), $this->hash->getHash()); - if ($result != -1) { - return (bool) $result; - } - } - $q_1 = $this->q->subtract(self::$one); - if (!$r->between(self::$one, $q_1) || !$s->between(self::$one, $q_1)) { - return \false; - } - $w = $s->modInverse($this->q); - $h = $this->hash->hash($message); - $h = $this->bits2int($h); - list(, $u1) = $h->multiply($w)->divide($this->q); - list(, $u2) = $r->multiply($w)->divide($this->q); - $v1 = $this->g->powMod($u1, $this->p); - $v2 = $this->y->powMod($u2, $this->p); - list(, $v) = $v1->multiply($v2)->divide($this->p); - list(, $v) = $v->divide($this->q); - return $v->equals($r); - } - /** - * Returns the public key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - return $type::savePublicKey($this->p, $this->q, $this->g, $this->y, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC.php deleted file mode 100644 index 26dd841..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC.php +++ /dev/null @@ -1,414 +0,0 @@ - - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $signature = $private->sign($plaintext); - * - * echo $public->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * @author Jim Wigginton - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\AsymmetricKey; -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Crypt\EC\Curves\Curve25519; -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Crypt\EC\Curves\Ed448; -use phpseclib3\Crypt\EC\Formats\Keys\PKCS1; -use phpseclib3\Crypt\EC\Parameters; -use phpseclib3\Crypt\EC\PrivateKey; -use phpseclib3\Crypt\EC\PublicKey; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\Exception\UnsupportedOperationException; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps\ECParameters; -use phpseclib3\Math\BigInteger; -/** - * Pure-PHP implementation of EC. - * - * @author Jim Wigginton - */ -abstract class EC extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'EC'; - /** - * Public Key QA - * - * @var object[] - */ - protected $QA; - /** - * Curve - * - * @var \phpseclib3\Crypt\EC\BaseCurves\Base - */ - protected $curve; - /** - * Signature Format - * - * @var string - */ - protected $format; - /** - * Signature Format (Short) - * - * @var string - */ - protected $shortFormat; - /** - * Curve Name - * - * @var string - */ - private $curveName; - /** - * Curve Order - * - * Used for deterministic ECDSA - * - * @var \phpseclib3\Math\BigInteger - */ - protected $q; - /** - * Alias for the private key - * - * Used for deterministic ECDSA. AsymmetricKey expects $x. I don't like x because - * with x you have x * the base point yielding an (x, y)-coordinate that is the - * public key. But the x is different depending on which side of the equal sign - * you're on. It's less ambiguous if you do dA * base point = (x, y)-coordinate. - * - * @var \phpseclib3\Math\BigInteger - */ - protected $x; - /** - * Context - * - * @var string - */ - protected $context; - /** - * Signature Format - * - * @var string - */ - protected $sigFormat; - /** - * Create public / private key pair. - * - * @param string $curve - * @return \phpseclib3\Crypt\EC\PrivateKey - */ - public static function createKey($curve) - { - self::initialize_static_variables(); - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - $curve = \strtolower($curve); - if (self::$engines['libsodium'] && $curve == 'ed25519' && \function_exists('sodium_crypto_sign_keypair')) { - $kp = \sodium_crypto_sign_keypair(); - $privatekey = \phpseclib3\Crypt\EC::loadFormat('libsodium', \sodium_crypto_sign_secretkey($kp)); - //$publickey = EC::loadFormat('libsodium', sodium_crypto_sign_publickey($kp)); - $privatekey->curveName = 'Ed25519'; - //$publickey->curveName = $curve; - return $privatekey; - } - $privatekey = new PrivateKey(); - $curveName = $curve; - if (\preg_match('#(?:^curve|^ed)\\d+$#', $curveName)) { - $curveName = \ucfirst($curveName); - } elseif (\substr($curveName, 0, 10) == 'brainpoolp') { - $curveName = 'brainpoolP' . \substr($curveName, 10); - } - $curve = '\\phpseclib3\\Crypt\\EC\\Curves\\' . $curveName; - if (!\class_exists($curve)) { - throw new UnsupportedCurveException('Named Curve of ' . $curveName . ' is not supported'); - } - $reflect = new \ReflectionClass($curve); - $curveName = $reflect->isFinal() ? $reflect->getParentClass()->getShortName() : $reflect->getShortName(); - $curve = new $curve(); - if ($curve instanceof TwistedEdwardsCurve) { - $arr = $curve->extractSecret(\phpseclib3\Crypt\Random::string($curve instanceof Ed448 ? 57 : 32)); - $privatekey->dA = $dA = $arr['dA']; - $privatekey->secret = $arr['secret']; - } else { - $privatekey->dA = $dA = $curve->createRandomMultiplier(); - } - if ($curve instanceof Curve25519 && self::$engines['libsodium']) { - //$r = pack('H*', '0900000000000000000000000000000000000000000000000000000000000000'); - //$QA = sodium_crypto_scalarmult($dA->toBytes(), $r); - $QA = \sodium_crypto_box_publickey_from_secretkey($dA->toBytes()); - $privatekey->QA = [$curve->convertInteger(new BigInteger(\strrev($QA), 256))]; - } else { - $privatekey->QA = $curve->multiplyPoint($curve->getBasePoint(), $dA); - } - $privatekey->curve = $curve; - //$publickey = clone $privatekey; - //unset($publickey->dA); - //unset($publickey->x); - $privatekey->curveName = $curveName; - //$publickey->curveName = $curveName; - if ($privatekey->curve instanceof TwistedEdwardsCurve) { - return $privatekey->withHash($curve::HASH); - } - return $privatekey; - } - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - if (!isset($components['dA']) && !isset($components['QA'])) { - $new = new Parameters(); - $new->curve = $components['curve']; - return $new; - } - $new = isset($components['dA']) ? new PrivateKey() : new PublicKey(); - $new->curve = $components['curve']; - $new->QA = $components['QA']; - if (isset($components['dA'])) { - $new->dA = $components['dA']; - $new->secret = $components['secret']; - } - if ($new->curve instanceof TwistedEdwardsCurve) { - return $new->withHash($components['curve']::HASH); - } - return $new; - } - /** - * Constructor - * - * PublicKey and PrivateKey objects can only be created from abstract RSA class - */ - protected function __construct() - { - $this->sigFormat = self::validatePlugin('Signature', 'ASN1'); - $this->shortFormat = 'ASN1'; - parent::__construct(); - } - /** - * Returns the curve - * - * Returns a string if it's a named curve, an array if not - * - * @return string|array - */ - public function getCurve() - { - if ($this->curveName) { - return $this->curveName; - } - if ($this->curve instanceof MontgomeryCurve) { - $this->curveName = $this->curve instanceof Curve25519 ? 'Curve25519' : 'Curve448'; - return $this->curveName; - } - if ($this->curve instanceof TwistedEdwardsCurve) { - $this->curveName = $this->curve instanceof Ed25519 ? 'Ed25519' : 'Ed448'; - return $this->curveName; - } - $params = $this->getParameters()->toString('PKCS8', ['namedCurve' => \true]); - $decoded = ASN1::extractBER($params); - $decoded = ASN1::decodeBER($decoded); - $decoded = ASN1::asn1map($decoded[0], ECParameters::MAP); - if (isset($decoded['namedCurve'])) { - $this->curveName = $decoded['namedCurve']; - return $decoded['namedCurve']; - } - if (!$namedCurves) { - PKCS1::useSpecifiedCurve(); - } - return $decoded; - } - /** - * Returns the key size - * - * Quoting https://tools.ietf.org/html/rfc5656#section-2, - * - * "The size of a set of elliptic curve domain parameters on a prime - * curve is defined as the number of bits in the binary representation - * of the field order, commonly denoted by p. Size on a - * characteristic-2 curve is defined as the number of bits in the binary - * representation of the field, commonly denoted by m. A set of - * elliptic curve domain parameters defines a group of order n generated - * by a base point P" - * - * @return int - */ - public function getLength() - { - return $this->curve->getLength(); - } - /** - * Returns the current engine being used - * - * @see self::useInternalEngine() - * @see self::useBestEngine() - * @return string - */ - public function getEngine() - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context) ? 'libsodium' : 'PHP'; - } - return self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods()) ? 'OpenSSL' : 'PHP'; - } - /** - * Returns the public key coordinates as a string - * - * Used by ECDH - * - * @return string - */ - public function getEncodedCoordinates() - { - if ($this->curve instanceof MontgomeryCurve) { - return \strrev($this->QA[0]->toBytes(\true)); - } - if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve->encodePoint($this->QA); - } - return "\x04" . $this->QA[0]->toBytes(\true) . $this->QA[1]->toBytes(\true); - } - /** - * Returns the parameters - * - * @see self::getPublicKey() - * @param string $type optional - * @return mixed - */ - public function getParameters($type = 'PKCS1') - { - $type = self::validatePlugin('Keys', $type, 'saveParameters'); - $key = $type::saveParameters($this->curve); - return \phpseclib3\Crypt\EC::load($key, 'PKCS1')->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); - } - /** - * Determines the signature padding mode - * - * Valid values are: ASN1, SSH2, Raw - * - * @param string $format - */ - public function withSignatureFormat($format) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - $new = clone $this; - $new->shortFormat = $format; - $new->sigFormat = self::validatePlugin('Signature', $format); - return $new; - } - /** - * Returns the signature format currently being used - * - */ - public function getSignatureFormat() - { - return $this->shortFormat; - } - /** - * Sets the context - * - * Used by Ed25519 / Ed448. - * - * @see self::sign() - * @see self::verify() - * @param string $context optional - */ - public function withContext($context = null) - { - if (!$this->curve instanceof TwistedEdwardsCurve) { - throw new UnsupportedCurveException('Only Ed25519 and Ed448 support contexts'); - } - $new = clone $this; - if (!isset($context)) { - $new->context = null; - return $new; - } - if (!\is_string($context)) { - throw new \InvalidArgumentException('setContext expects a string'); - } - if (\strlen($context) > 255) { - throw new \LengthException('The context is supposed to be, at most, 255 bytes long'); - } - $new->context = $context; - return $new; - } - /** - * Returns the signature format currently being used - * - */ - public function getContext() - { - return $this->context; - } - /** - * Determines which hashing function should be used - * - * @param string $hash - */ - public function withHash($hash) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - if ($this->curve instanceof Ed25519 && $hash != 'sha512') { - throw new UnsupportedAlgorithmException('Ed25519 only supports sha512 as a hash'); - } - if ($this->curve instanceof Ed448 && $hash != 'shake256-912') { - throw new UnsupportedAlgorithmException('Ed448 only supports shake256 with a length of 114 bytes'); - } - return parent::withHash($hash); - } - /** - * __toString() magic method - * - * @return string - */ - public function __toString() - { - if ($this->curve instanceof MontgomeryCurve) { - return ''; - } - return parent::__toString(); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php deleted file mode 100644 index ac1a115..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php +++ /dev/null @@ -1,192 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\BaseCurves; - -use phpseclib3\Math\BigInteger; -/** - * Base - * - * @author Jim Wigginton - */ -abstract class Base -{ - /** - * The Order - * - * @var BigInteger - */ - protected $order; - /** - * Finite Field Integer factory - * - * @var \phpseclib3\Math\FiniteField\Integer - */ - protected $factory; - /** - * Returns a random integer - * - * @return object - */ - public function randomInteger() - { - return $this->factory->randomInteger(); - } - /** - * Converts a BigInteger to a \phpseclib3\Math\FiniteField\Integer integer - * - * @return object - */ - public function convertInteger(BigInteger $x) - { - return $this->factory->newInteger($x); - } - /** - * Returns the length, in bytes, of the modulo - * - * @return integer - */ - public function getLengthInBytes() - { - return $this->factory->getLengthInBytes(); - } - /** - * Returns the length, in bits, of the modulo - * - * @return integer - */ - public function getLength() - { - return $this->factory->getLength(); - } - /** - * Multiply a point on the curve by a scalar - * - * Uses the montgomery ladder technique as described here: - * - * https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Montgomery_ladder - * https://github.com/phpecc/phpecc/issues/16#issuecomment-59176772 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - $alreadyInternal = isset($p[2]); - $r = $alreadyInternal ? [[], $p] : [[], $this->convertToInternal($p)]; - $d = $d->toBits(); - for ($i = 0; $i < \strlen($d); $i++) { - $d_i = (int) $d[$i]; - $r[1 - $d_i] = $this->addPoint($r[0], $r[1]); - $r[$d_i] = $this->doublePoint($r[$d_i]); - } - return $alreadyInternal ? $r[0] : $this->convertToAffine($r[0]); - } - /** - * Creates a random scalar multiplier - * - * @return BigInteger - */ - public function createRandomMultiplier() - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - return BigInteger::randomRange($one, $this->order->subtract($one)); - } - /** - * Performs range check - */ - public function rangeCheck(BigInteger $x) - { - static $zero; - if (!isset($zero)) { - $zero = new BigInteger(); - } - if (!isset($this->order)) { - throw new \RuntimeException('setOrder needs to be called before this method'); - } - if ($x->compare($this->order) > 0 || $x->compare($zero) <= 0) { - throw new \RangeException('x must be between 1 and the order of the curve'); - } - } - /** - * Sets the Order - */ - public function setOrder(BigInteger $order) - { - $this->order = $order; - } - /** - * Returns the Order - * - * @return \phpseclib3\Math\BigInteger - */ - public function getOrder() - { - return $this->order; - } - /** - * Use a custom defined modular reduction function - * - * @return object - */ - public function setReduction(callable $func) - { - $this->factory->setReduction($func); - } - /** - * Returns the affine point - * - * @return object[] - */ - public function convertToAffine(array $p) - { - return $p; - } - /** - * Converts an affine point to a jacobian coordinate - * - * @return object[] - */ - public function convertToInternal(array $p) - { - return $p; - } - /** - * Negates a point - * - * @return object[] - */ - public function negatePoint(array $p) - { - $temp = [$p[0], $p[1]->negate()]; - if (isset($p[2])) { - $temp[] = $p[2]; - } - return $temp; - } - /** - * Multiply and Add Points - * - * @return int[] - */ - public function multiplyAddPoints(array $points, array $scalars) - { - $p1 = $this->convertToInternal($points[0]); - $p2 = $this->convertToInternal($points[1]); - $p1 = $this->multiplyPoint($p1, $scalars[0]); - $p2 = $this->multiplyPoint($p2, $scalars[1]); - $r = $this->addPoint($p1, $p2); - return $this->convertToAffine($r); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php deleted file mode 100644 index 12d12b5..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php +++ /dev/null @@ -1,324 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\BaseCurves; - -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\BinaryField; -use phpseclib3\Math\BinaryField\Integer as BinaryInteger; -/** - * Curves over y^2 + x*y = x^3 + a*x^2 + b - * - * @author Jim Wigginton - */ -class Binary extends \phpseclib3\Crypt\EC\BaseCurves\Base -{ - /** - * Binary Field Integer factory - * - * @var \phpseclib3\Math\BinaryField - */ - protected $factory; - /** - * Cofficient for x^1 - * - * @var object - */ - protected $a; - /** - * Cofficient for x^0 - * - * @var object - */ - protected $b; - /** - * Base Point - * - * @var object - */ - protected $p; - /** - * The number one over the specified finite field - * - * @var object - */ - protected $one; - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - /** - * The Order - * - * @var BigInteger - */ - protected $order; - /** - * Sets the modulo - */ - public function setModulo(...$modulo) - { - $this->modulo = $modulo; - $this->factory = new BinaryField(...$modulo); - $this->one = $this->factory->newInteger("\x01"); - } - /** - * Set coefficients a and b - * - * @param string $a - * @param string $b - */ - public function setCoefficients($a, $b) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger(\pack('H*', $a)); - $this->b = $this->factory->newInteger(\pack('H*', $b)); - } - /** - * Set x and y coordinates for the base point - * - * @param string|BinaryInteger $x - * @param string|BinaryInteger $y - */ - public function setBasePoint($x, $y) - { - switch (\true) { - case !\is_string($x) && !$x instanceof BinaryInteger: - throw new \UnexpectedValueException('Argument 1 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\\Integer'); - case !\is_string($y) && !$y instanceof BinaryInteger: - throw new \UnexpectedValueException('Argument 2 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [\is_string($x) ? $this->factory->newInteger(\pack('H*', $x)) : $x, \is_string($y) ? $this->factory->newInteger(\pack('H*', $y)) : $y]; - } - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p) || !\count($q)) { - if (\count($q)) { - return $q; - } - if (\count($p)) { - return $p; - } - return []; - } - if (!isset($p[2]) || !isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - if ($p[0]->equals($q[0])) { - return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); - } - // formulas from http://hyperelliptic.org/EFD/g12o/auto-shortw-jacobian.html - list($x1, $y1, $z1) = $p; - list($x2, $y2, $z2) = $q; - $o1 = $z1->multiply($z1); - $b = $x2->multiply($o1); - if ($z2->equals($this->one)) { - $d = $y2->multiply($o1)->multiply($z1); - $e = $x1->add($b); - $f = $y1->add($d); - $z3 = $e->multiply($z1); - $h = $f->multiply($x2)->add($z3->multiply($y2)); - $i = $f->add($z3); - $g = $z3->multiply($z3); - $p1 = $this->a->multiply($g); - $p2 = $f->multiply($i); - $p3 = $e->multiply($e)->multiply($e); - $x3 = $p1->add($p2)->add($p3); - $y3 = $i->multiply($x3)->add($g->multiply($h)); - return [$x3, $y3, $z3]; - } - $o2 = $z2->multiply($z2); - $a = $x1->multiply($o2); - $c = $y1->multiply($o2)->multiply($z2); - $d = $y2->multiply($o1)->multiply($z1); - $e = $a->add($b); - $f = $c->add($d); - $g = $e->multiply($z1); - $h = $f->multiply($x2)->add($g->multiply($y2)); - $z3 = $g->multiply($z2); - $i = $f->add($z3); - $p1 = $this->a->multiply($z3->multiply($z3)); - $p2 = $f->multiply($i); - $p3 = $e->multiply($e)->multiply($e); - $x3 = $p1->add($p2)->add($p3); - $y3 = $i->multiply($x3)->add($g->multiply($g)->multiply($h)); - return [$x3, $y3, $z3]; - } - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p)) { - return []; - } - if (!isset($p[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - // formulas from http://hyperelliptic.org/EFD/g12o/auto-shortw-jacobian.html - list($x1, $y1, $z1) = $p; - $a = $x1->multiply($x1); - $b = $a->multiply($a); - if ($z1->equals($this->one)) { - $x3 = $b->add($this->b); - $z3 = clone $x1; - $p1 = $a->add($y1)->add($z3)->multiply($this->b); - $p2 = $a->add($y1)->multiply($b); - $y3 = $p1->add($p2); - return [$x3, $y3, $z3]; - } - $c = $z1->multiply($z1); - $d = $c->multiply($c); - $x3 = $b->add($this->b->multiply($d->multiply($d))); - $z3 = $x1->multiply($c); - $p1 = $b->multiply($z3); - $p2 = $a->add($y1->multiply($z1))->add($z3)->multiply($x3); - $y3 = $p1->add($p2); - return [$x3, $y3, $z3]; - } - /** - * Returns the X coordinate and the derived Y coordinate - * - * Not supported because it is covered by patents. - * Quoting https://www.openssl.org/docs/man1.1.0/apps/ecparam.html , - * - * "Due to patent issues the compressed option is disabled by default for binary curves - * and can be enabled by defining the preprocessor macro OPENSSL_EC_BIN_PT_COMP at - * compile time." - * - * @return array - */ - public function derivePoint($m) - { - throw new \RuntimeException('Point compression on binary finite field elliptic curves is not supported'); - } - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $lhs = $y->multiply($y); - $lhs = $lhs->add($x->multiply($y)); - $x2 = $x->multiply($x); - $x3 = $x2->multiply($x); - $rhs = $x3->add($this->a->multiply($x2))->add($this->b); - return $lhs->equals($rhs); - } - /** - * Returns the modulo - * - * @return \phpseclib3\Math\BigInteger - */ - public function getModulo() - { - return $this->modulo; - } - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getA() - { - return $this->a; - } - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getB() - { - return $this->b; - } - /** - * Returns the affine point - * - * A Jacobian Coordinate is of the form (x, y, z). - * To convert a Jacobian Coordinate to an Affine Point - * you do (x / z^2, y / z^3) - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[2])) { - return $p; - } - list($x, $y, $z) = $p; - $z = $this->one->divide($z); - $z2 = $z->multiply($z); - return [$x->multiply($z2), $y->multiply($z2)->multiply($z)]; - } - /** - * Converts an affine point to a jacobian coordinate - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (isset($p[2])) { - return $p; - } - $p[2] = clone $this->one; - $p['fresh'] = \true; - return $p; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php deleted file mode 100644 index 710f2d1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\BaseCurves; - -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\PrimeField; -/** - * Curves over y^2 = x^3 + b - * - * @author Jim Wigginton - */ -class KoblitzPrime extends \phpseclib3\Crypt\EC\BaseCurves\Prime -{ - /** - * Basis - * - * @var list - */ - protected $basis; - /** - * Beta - * - * @var PrimeField\Integer - */ - protected $beta; - // don't overwrite setCoefficients() with one that only accepts one parameter so that - // one might be able to switch between KoblitzPrime and Prime more easily (for benchmarking - // purposes). - /** - * Multiply and Add Points - * - * Uses a efficiently computable endomorphism to achieve a slight speedup - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/curve/short.js#L219 - * - * @return int[] - */ - public function multiplyAddPoints(array $points, array $scalars) - { - static $zero, $one, $two; - if (!isset($two)) { - $two = new BigInteger(2); - $one = new BigInteger(1); - } - if (!isset($this->beta)) { - // get roots - $inv = $this->one->divide($this->two)->negate(); - $s = $this->three->negate()->squareRoot()->multiply($inv); - $betas = [$inv->add($s), $inv->subtract($s)]; - $this->beta = $betas[0]->compare($betas[1]) < 0 ? $betas[0] : $betas[1]; - //echo strtoupper($this->beta->toHex(true)) . "\n"; exit; - } - if (!isset($this->basis)) { - $factory = new PrimeField($this->order); - $tempOne = $factory->newInteger($one); - $tempTwo = $factory->newInteger($two); - $tempThree = $factory->newInteger(new BigInteger(3)); - $inv = $tempOne->divide($tempTwo)->negate(); - $s = $tempThree->negate()->squareRoot()->multiply($inv); - $lambdas = [$inv->add($s), $inv->subtract($s)]; - $lhs = $this->multiplyPoint($this->p, $lambdas[0])[0]; - $rhs = $this->p[0]->multiply($this->beta); - $lambda = $lhs->equals($rhs) ? $lambdas[0] : $lambdas[1]; - $this->basis = static::extendedGCD($lambda->toBigInteger(), $this->order); - ///* - foreach ($this->basis as $basis) { - echo \strtoupper($basis['a']->toHex(\true)) . "\n"; - echo \strtoupper($basis['b']->toHex(\true)) . "\n\n"; - } - exit; - //*/ - } - $npoints = $nscalars = []; - for ($i = 0; $i < \count($points); $i++) { - $p = $points[$i]; - $k = $scalars[$i]->toBigInteger(); - // begin split - list($v1, $v2) = $this->basis; - $c1 = $v2['b']->multiply($k); - list($c1, $r) = $c1->divide($this->order); - if ($this->order->compare($r->multiply($two)) <= 0) { - $c1 = $c1->add($one); - } - $c2 = $v1['b']->negate()->multiply($k); - list($c2, $r) = $c2->divide($this->order); - if ($this->order->compare($r->multiply($two)) <= 0) { - $c2 = $c2->add($one); - } - $p1 = $c1->multiply($v1['a']); - $p2 = $c2->multiply($v2['a']); - $q1 = $c1->multiply($v1['b']); - $q2 = $c2->multiply($v2['b']); - $k1 = $k->subtract($p1)->subtract($p2); - $k2 = $q1->add($q2)->negate(); - // end split - $beta = [$p[0]->multiply($this->beta), $p[1], clone $this->one]; - if (isset($p['naf'])) { - $beta['naf'] = \array_map(function ($p) { - return [$p[0]->multiply($this->beta), $p[1], clone $this->one]; - }, $p['naf']); - $beta['nafwidth'] = $p['nafwidth']; - } - if ($k1->isNegative()) { - $k1 = $k1->negate(); - $p = $this->negatePoint($p); - } - if ($k2->isNegative()) { - $k2 = $k2->negate(); - $beta = $this->negatePoint($beta); - } - $pos = 2 * $i; - $npoints[$pos] = $p; - $nscalars[$pos] = $this->factory->newInteger($k1); - $pos++; - $npoints[$pos] = $beta; - $nscalars[$pos] = $this->factory->newInteger($k2); - } - return parent::multiplyAddPoints($npoints, $nscalars); - } - /** - * Returns the numerator and denominator of the slope - * - * @return FiniteField[] - */ - protected function doublePointHelper(array $p) - { - $numerator = $this->three->multiply($p[0])->multiply($p[0]); - $denominator = $this->two->multiply($p[1]); - return [$numerator, $denominator]; - } - /** - * Doubles a jacobian coordinate on the curve - * - * See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l - * - * @return FiniteField[] - */ - protected function jacobianDoublePoint(array $p) - { - list($x1, $y1, $z1) = $p; - $a = $x1->multiply($x1); - $b = $y1->multiply($y1); - $c = $b->multiply($b); - $d = $x1->add($b); - $d = $d->multiply($d)->subtract($a)->subtract($c)->multiply($this->two); - $e = $this->three->multiply($a); - $f = $e->multiply($e); - $x3 = $f->subtract($this->two->multiply($d)); - $y3 = $e->multiply($d->subtract($x3))->subtract($this->eight->multiply($c)); - $z3 = $this->two->multiply($y1)->multiply($z1); - return [$x3, $y3, $z3]; - } - /** - * Doubles a "fresh" jacobian coordinate on the curve - * - * See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-mdbl-2007-bl - * - * @return FiniteField[] - */ - protected function jacobianDoublePointMixed(array $p) - { - list($x1, $y1) = $p; - $xx = $x1->multiply($x1); - $yy = $y1->multiply($y1); - $yyyy = $yy->multiply($yy); - $s = $x1->add($yy); - $s = $s->multiply($s)->subtract($xx)->subtract($yyyy)->multiply($this->two); - $m = $this->three->multiply($xx); - $t = $m->multiply($m)->subtract($this->two->multiply($s)); - $x3 = $t; - $y3 = $s->subtract($t); - $y3 = $m->multiply($y3)->subtract($this->eight->multiply($yyyy)); - $z3 = $this->two->multiply($y1); - return [$x3, $y3, $z3]; - } - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $lhs = $y->multiply($y); - $temp = $x->multiply($x)->multiply($x); - $rhs = $temp->add($this->b); - return $lhs->equals($rhs); - } - /** - * Calculates the parameters needed from the Euclidean algorithm as discussed at - * http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=148 - * - * @param BigInteger $u - * @param BigInteger $v - * @return BigInteger[] - */ - protected static function extendedGCD(BigInteger $u, BigInteger $v) - { - $one = new BigInteger(1); - $zero = new BigInteger(); - $a = clone $one; - $b = clone $zero; - $c = clone $zero; - $d = clone $one; - $stop = $v->bitwise_rightShift($v->getLength() >> 1); - $a1 = clone $zero; - $b1 = clone $zero; - $a2 = clone $zero; - $b2 = clone $zero; - $postGreatestIndex = 0; - while (!$v->equals($zero)) { - list($q) = $u->divide($v); - $temp = $u; - $u = $v; - $v = $temp->subtract($v->multiply($q)); - $temp = $a; - $a = $c; - $c = $temp->subtract($a->multiply($q)); - $temp = $b; - $b = $d; - $d = $temp->subtract($b->multiply($q)); - if ($v->compare($stop) > 0) { - $a0 = $v; - $b0 = $c; - } else { - $postGreatestIndex++; - } - if ($postGreatestIndex == 1) { - $a1 = $v; - $b1 = $c->negate(); - } - if ($postGreatestIndex == 2) { - $rhs = $a0->multiply($a0)->add($b0->multiply($b0)); - $lhs = $v->multiply($v)->add($b->multiply($b)); - if ($lhs->compare($rhs) <= 0) { - $a2 = $a0; - $b2 = $b0->negate(); - } else { - $a2 = $v; - $b2 = $c->negate(); - } - break; - } - } - return [['a' => $a1, 'b' => $b1], ['a' => $a2, 'b' => $b2]]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php deleted file mode 100644 index 1f7dab2..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php +++ /dev/null @@ -1,246 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\BaseCurves; - -use phpseclib3\Crypt\EC\Curves\Curve25519; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\PrimeField; -use phpseclib3\Math\PrimeField\Integer as PrimeInteger; -/** - * Curves over y^2 = x^3 + a*x + x - * - * @author Jim Wigginton - */ -class Montgomery extends \phpseclib3\Crypt\EC\BaseCurves\Base -{ - /** - * Prime Field Integer factory - * - * @var \phpseclib3\Math\PrimeField - */ - protected $factory; - /** - * Cofficient for x - * - * @var object - */ - protected $a; - /** - * Constant used for point doubling - * - * @var object - */ - protected $a24; - /** - * The Number Zero - * - * @var object - */ - protected $zero; - /** - * The Number One - * - * @var object - */ - protected $one; - /** - * Base Point - * - * @var object - */ - protected $p; - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - /** - * The Order - * - * @var BigInteger - */ - protected $order; - /** - * Sets the modulo - */ - public function setModulo(BigInteger $modulo) - { - $this->modulo = $modulo; - $this->factory = new PrimeField($modulo); - $this->zero = $this->factory->newInteger(new BigInteger()); - $this->one = $this->factory->newInteger(new BigInteger(1)); - } - /** - * Set coefficients a - */ - public function setCoefficients(BigInteger $a) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger($a); - $two = $this->factory->newInteger(new BigInteger(2)); - $four = $this->factory->newInteger(new BigInteger(4)); - $this->a24 = $this->a->subtract($two)->divide($four); - } - /** - * Set x and y coordinates for the base point - * - * @param BigInteger|PrimeInteger $x - * @param BigInteger|PrimeInteger $y - * @return PrimeInteger[] - */ - public function setBasePoint($x, $y) - { - switch (\true) { - case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); - case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [$x instanceof BigInteger ? $this->factory->newInteger($x) : $x, $y instanceof BigInteger ? $this->factory->newInteger($y) : $y]; - } - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - /** - * Doubles and adds a point on a curve - * - * See https://tools.ietf.org/html/draft-ietf-tls-curve25519-01#appendix-A.1.3 - * - * @return FiniteField[][] - */ - private function doubleAndAddPoint(array $p, array $q, PrimeInteger $x1) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p) || !\count($q)) { - return []; - } - if (!isset($p[1])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to XZ coordinates'); - } - list($x2, $z2) = $p; - list($x3, $z3) = $q; - $a = $x2->add($z2); - $aa = $a->multiply($a); - $b = $x2->subtract($z2); - $bb = $b->multiply($b); - $e = $aa->subtract($bb); - $c = $x3->add($z3); - $d = $x3->subtract($z3); - $da = $d->multiply($a); - $cb = $c->multiply($b); - $temp = $da->add($cb); - $x5 = $temp->multiply($temp); - $temp = $da->subtract($cb); - $z5 = $x1->multiply($temp->multiply($temp)); - $x4 = $aa->multiply($bb); - $temp = static::class == Curve25519::class ? $bb : $aa; - $z4 = $e->multiply($temp->add($this->a24->multiply($e))); - return [[$x4, $z4], [$x5, $z5]]; - } - /** - * Multiply a point on the curve by a scalar - * - * Uses the montgomery ladder technique as described here: - * - * https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Montgomery_ladder - * https://github.com/phpecc/phpecc/issues/16#issuecomment-59176772 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - $p1 = [$this->one, $this->zero]; - $alreadyInternal = isset($x[1]); - $p2 = $this->convertToInternal($p); - $x = $p[0]; - $b = $d->toBits(); - $b = \str_pad($b, 256, '0', \STR_PAD_LEFT); - for ($i = 0; $i < \strlen($b); $i++) { - $b_i = (int) $b[$i]; - if ($b_i) { - list($p2, $p1) = $this->doubleAndAddPoint($p2, $p1, $x); - } else { - list($p1, $p2) = $this->doubleAndAddPoint($p1, $p2, $x); - } - } - return $alreadyInternal ? $p1 : $this->convertToAffine($p1); - } - /** - * Converts an affine point to an XZ coordinate - * - * From https://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html - * - * XZ coordinates represent x y as X Z satsfying the following equations: - * - * x=X/Z - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (empty($p)) { - return [clone $this->zero, clone $this->one]; - } - if (isset($p[1])) { - return $p; - } - $p[1] = clone $this->one; - return $p; - } - /** - * Returns the affine point - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[1])) { - return $p; - } - list($x, $z) = $p; - return [$x->divide($z)]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php deleted file mode 100644 index ad4ef7e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php +++ /dev/null @@ -1,695 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\BaseCurves; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\Common\FiniteField\Integer; -use phpseclib3\Math\PrimeField; -use phpseclib3\Math\PrimeField\Integer as PrimeInteger; -/** - * Curves over y^2 = x^3 + a*x + b - * - * @author Jim Wigginton - */ -class Prime extends \phpseclib3\Crypt\EC\BaseCurves\Base -{ - /** - * Prime Field Integer factory - * - * @var \phpseclib3\Math\PrimeFields - */ - protected $factory; - /** - * Cofficient for x^1 - * - * @var object - */ - protected $a; - /** - * Cofficient for x^0 - * - * @var object - */ - protected $b; - /** - * Base Point - * - * @var object - */ - protected $p; - /** - * The number one over the specified finite field - * - * @var object - */ - protected $one; - /** - * The number two over the specified finite field - * - * @var object - */ - protected $two; - /** - * The number three over the specified finite field - * - * @var object - */ - protected $three; - /** - * The number four over the specified finite field - * - * @var object - */ - protected $four; - /** - * The number eight over the specified finite field - * - * @var object - */ - protected $eight; - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - /** - * The Order - * - * @var BigInteger - */ - protected $order; - /** - * Sets the modulo - */ - public function setModulo(BigInteger $modulo) - { - $this->modulo = $modulo; - $this->factory = new PrimeField($modulo); - $this->two = $this->factory->newInteger(new BigInteger(2)); - $this->three = $this->factory->newInteger(new BigInteger(3)); - // used by jacobian coordinates - $this->one = $this->factory->newInteger(new BigInteger(1)); - $this->four = $this->factory->newInteger(new BigInteger(4)); - $this->eight = $this->factory->newInteger(new BigInteger(8)); - } - /** - * Set coefficients a and b - */ - public function setCoefficients(BigInteger $a, BigInteger $b) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger($a); - $this->b = $this->factory->newInteger($b); - } - /** - * Set x and y coordinates for the base point - * - * @param BigInteger|PrimeInteger $x - * @param BigInteger|PrimeInteger $y - * @return PrimeInteger[] - */ - public function setBasePoint($x, $y) - { - switch (\true) { - case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); - case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [$x instanceof BigInteger ? $this->factory->newInteger($x) : $x, $y instanceof BigInteger ? $this->factory->newInteger($y) : $y]; - } - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - /** - * Adds two "fresh" jacobian form on the curve - * - * @return FiniteField[] - */ - protected function jacobianAddPointMixedXY(array $p, array $q) - { - list($u1, $s1) = $p; - list($u2, $s2) = $q; - if ($u1->equals($u2)) { - if (!$s1->equals($s2)) { - return []; - } else { - return $this->doublePoint($p); - } - } - $h = $u2->subtract($u1); - $r = $s2->subtract($s1); - $h2 = $h->multiply($h); - $h3 = $h2->multiply($h); - $v = $u1->multiply($h2); - $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply($v->subtract($x3))->subtract($s1->multiply($h3)); - return [$x3, $y3, $h]; - } - /** - * Adds one "fresh" jacobian form on the curve - * - * The second parameter should be the "fresh" one - * - * @return FiniteField[] - */ - protected function jacobianAddPointMixedX(array $p, array $q) - { - list($u1, $s1, $z1) = $p; - list($x2, $y2) = $q; - $z12 = $z1->multiply($z1); - $u2 = $x2->multiply($z12); - $s2 = $y2->multiply($z12->multiply($z1)); - if ($u1->equals($u2)) { - if (!$s1->equals($s2)) { - return []; - } else { - return $this->doublePoint($p); - } - } - $h = $u2->subtract($u1); - $r = $s2->subtract($s1); - $h2 = $h->multiply($h); - $h3 = $h2->multiply($h); - $v = $u1->multiply($h2); - $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply($v->subtract($x3))->subtract($s1->multiply($h3)); - $z3 = $h->multiply($z1); - return [$x3, $y3, $z3]; - } - /** - * Adds two jacobian coordinates on the curve - * - * @return FiniteField[] - */ - protected function jacobianAddPoint(array $p, array $q) - { - list($x1, $y1, $z1) = $p; - list($x2, $y2, $z2) = $q; - $z12 = $z1->multiply($z1); - $z22 = $z2->multiply($z2); - $u1 = $x1->multiply($z22); - $u2 = $x2->multiply($z12); - $s1 = $y1->multiply($z22->multiply($z2)); - $s2 = $y2->multiply($z12->multiply($z1)); - if ($u1->equals($u2)) { - if (!$s1->equals($s2)) { - return []; - } else { - return $this->doublePoint($p); - } - } - $h = $u2->subtract($u1); - $r = $s2->subtract($s1); - $h2 = $h->multiply($h); - $h3 = $h2->multiply($h); - $v = $u1->multiply($h2); - $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply($v->subtract($x3))->subtract($s1->multiply($h3)); - $z3 = $h->multiply($z1)->multiply($z2); - return [$x3, $y3, $z3]; - } - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p) || !\count($q)) { - if (\count($q)) { - return $q; - } - if (\count($p)) { - return $p; - } - return []; - } - // use jacobian coordinates - if (isset($p[2]) && isset($q[2])) { - if (isset($p['fresh']) && isset($q['fresh'])) { - return $this->jacobianAddPointMixedXY($p, $q); - } - if (isset($p['fresh'])) { - return $this->jacobianAddPointMixedX($q, $p); - } - if (isset($q['fresh'])) { - return $this->jacobianAddPointMixedX($p, $q); - } - return $this->jacobianAddPoint($p, $q); - } - if (isset($p[2]) || isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to Jacobi coordinates or vice versa'); - } - if ($p[0]->equals($q[0])) { - if (!$p[1]->equals($q[1])) { - return []; - } else { - // eg. doublePoint - list($numerator, $denominator) = $this->doublePointHelper($p); - } - } else { - $numerator = $q[1]->subtract($p[1]); - $denominator = $q[0]->subtract($p[0]); - } - $slope = $numerator->divide($denominator); - $x = $slope->multiply($slope)->subtract($p[0])->subtract($q[0]); - $y = $slope->multiply($p[0]->subtract($x))->subtract($p[1]); - return [$x, $y]; - } - /** - * Returns the numerator and denominator of the slope - * - * @return FiniteField[] - */ - protected function doublePointHelper(array $p) - { - $numerator = $this->three->multiply($p[0])->multiply($p[0])->add($this->a); - $denominator = $this->two->multiply($p[1]); - return [$numerator, $denominator]; - } - /** - * Doubles a jacobian coordinate on the curve - * - * @return FiniteField[] - */ - protected function jacobianDoublePoint(array $p) - { - list($x, $y, $z) = $p; - $x2 = $x->multiply($x); - $y2 = $y->multiply($y); - $z2 = $z->multiply($z); - $s = $this->four->multiply($x)->multiply($y2); - $m1 = $this->three->multiply($x2); - $m2 = $this->a->multiply($z2->multiply($z2)); - $m = $m1->add($m2); - $x1 = $m->multiply($m)->subtract($this->two->multiply($s)); - $y1 = $m->multiply($s->subtract($x1))->subtract($this->eight->multiply($y2->multiply($y2))); - $z1 = $this->two->multiply($y)->multiply($z); - return [$x1, $y1, $z1]; - } - /** - * Doubles a "fresh" jacobian coordinate on the curve - * - * @return FiniteField[] - */ - protected function jacobianDoublePointMixed(array $p) - { - list($x, $y) = $p; - $x2 = $x->multiply($x); - $y2 = $y->multiply($y); - $s = $this->four->multiply($x)->multiply($y2); - $m1 = $this->three->multiply($x2); - $m = $m1->add($this->a); - $x1 = $m->multiply($m)->subtract($this->two->multiply($s)); - $y1 = $m->multiply($s->subtract($x1))->subtract($this->eight->multiply($y2->multiply($y2))); - $z1 = $this->two->multiply($y); - return [$x1, $y1, $z1]; - } - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p)) { - return []; - } - // use jacobian coordinates - if (isset($p[2])) { - if (isset($p['fresh'])) { - return $this->jacobianDoublePointMixed($p); - } - return $this->jacobianDoublePoint($p); - } - list($numerator, $denominator) = $this->doublePointHelper($p); - $slope = $numerator->divide($denominator); - $x = $slope->multiply($slope)->subtract($p[0])->subtract($p[0]); - $y = $slope->multiply($p[0]->subtract($x))->subtract($p[1]); - return [$x, $y]; - } - /** - * Returns the X coordinate and the derived Y coordinate - * - * @return array - */ - public function derivePoint($m) - { - $y = \ord(Strings::shift($m)); - $x = new BigInteger($m, 256); - $xp = $this->convertInteger($x); - switch ($y) { - case 2: - $ypn = \false; - break; - case 3: - $ypn = \true; - break; - default: - throw new \RuntimeException('Coordinate not in recognized format'); - } - $temp = $xp->multiply($this->a); - $temp = $xp->multiply($xp)->multiply($xp)->add($temp); - $temp = $temp->add($this->b); - $b = $temp->squareRoot(); - if (!$b) { - throw new \RuntimeException('Unable to derive Y coordinate'); - } - $bn = $b->isOdd(); - $yp = $ypn == $bn ? $b : $b->negate(); - return [$xp, $yp]; - } - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $lhs = $y->multiply($y); - $temp = $x->multiply($this->a); - $temp = $x->multiply($x)->multiply($x)->add($temp); - $rhs = $temp->add($this->b); - return $lhs->equals($rhs); - } - /** - * Returns the modulo - * - * @return \phpseclib3\Math\BigInteger - */ - public function getModulo() - { - return $this->modulo; - } - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getA() - { - return $this->a; - } - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getB() - { - return $this->b; - } - /** - * Multiply and Add Points - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/curve/base.js#L125 - * - * @return int[] - */ - public function multiplyAddPoints(array $points, array $scalars) - { - $length = \count($points); - foreach ($points as &$point) { - $point = $this->convertToInternal($point); - } - $wnd = [$this->getNAFPoints($points[0], 7)]; - $wndWidth = [isset($points[0]['nafwidth']) ? $points[0]['nafwidth'] : 7]; - for ($i = 1; $i < $length; $i++) { - $wnd[] = $this->getNAFPoints($points[$i], 1); - $wndWidth[] = isset($points[$i]['nafwidth']) ? $points[$i]['nafwidth'] : 1; - } - $naf = []; - // comb all window NAFs - $max = 0; - for ($i = $length - 1; $i >= 1; $i -= 2) { - $a = $i - 1; - $b = $i; - if ($wndWidth[$a] != 1 || $wndWidth[$b] != 1) { - $naf[$a] = $scalars[$a]->getNAF($wndWidth[$a]); - $naf[$b] = $scalars[$b]->getNAF($wndWidth[$b]); - $max = \max(\count($naf[$a]), \count($naf[$b]), $max); - continue; - } - $comb = [ - $points[$a], - // 1 - null, - // 3 - null, - // 5 - $points[$b], - ]; - $comb[1] = $this->addPoint($points[$a], $points[$b]); - $comb[2] = $this->addPoint($points[$a], $this->negatePoint($points[$b])); - $index = [ - -3, - /* -1 -1 */ - -1, - /* -1 0 */ - -5, - /* -1 1 */ - -7, - /* 0 -1 */ - 0, - /* 0 -1 */ - 7, - /* 0 1 */ - 5, - /* 1 -1 */ - 1, - /* 1 0 */ - 3, - ]; - $jsf = self::getJSFPoints($scalars[$a], $scalars[$b]); - $max = \max(\count($jsf[0]), $max); - if ($max > 0) { - $naf[$a] = \array_fill(0, $max, 0); - $naf[$b] = \array_fill(0, $max, 0); - } else { - $naf[$a] = []; - $naf[$b] = []; - } - for ($j = 0; $j < $max; $j++) { - $ja = isset($jsf[0][$j]) ? $jsf[0][$j] : 0; - $jb = isset($jsf[1][$j]) ? $jsf[1][$j] : 0; - $naf[$a][$j] = $index[3 * ($ja + 1) + $jb + 1]; - $naf[$b][$j] = 0; - $wnd[$a] = $comb; - } - } - $acc = []; - $temp = [0, 0, 0, 0]; - for ($i = $max; $i >= 0; $i--) { - $k = 0; - while ($i >= 0) { - $zero = \true; - for ($j = 0; $j < $length; $j++) { - $temp[$j] = isset($naf[$j][$i]) ? $naf[$j][$i] : 0; - if ($temp[$j] != 0) { - $zero = \false; - } - } - if (!$zero) { - break; - } - $k++; - $i--; - } - if ($i >= 0) { - $k++; - } - while ($k--) { - $acc = $this->doublePoint($acc); - } - if ($i < 0) { - break; - } - for ($j = 0; $j < $length; $j++) { - $z = $temp[$j]; - $p = null; - if ($z == 0) { - continue; - } - $p = $z > 0 ? $wnd[$j][$z - 1 >> 1] : $this->negatePoint($wnd[$j][-$z - 1 >> 1]); - $acc = $this->addPoint($acc, $p); - } - } - return $this->convertToAffine($acc); - } - /** - * Precomputes NAF points - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/curve/base.js#L351 - * - * @return int[] - */ - private function getNAFPoints(array $point, $wnd) - { - if (isset($point['naf'])) { - return $point['naf']; - } - $res = [$point]; - $max = (1 << $wnd) - 1; - $dbl = $max == 1 ? null : $this->doublePoint($point); - for ($i = 1; $i < $max; $i++) { - $res[] = $this->addPoint($res[$i - 1], $dbl); - } - $point['naf'] = $res; - /* - $str = ''; - foreach ($res as $re) { - $re[0] = bin2hex($re[0]->toBytes()); - $re[1] = bin2hex($re[1]->toBytes()); - $str.= " ['$re[0]', '$re[1]'],\r\n"; - } - file_put_contents('temp.txt', $str); - exit; - */ - return $res; - } - /** - * Precomputes points in Joint Sparse Form - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/utils.js#L96 - * - * @return int[] - */ - private static function getJSFPoints(Integer $k1, Integer $k2) - { - static $three; - if (!isset($three)) { - $three = new BigInteger(3); - } - $jsf = [[], []]; - $k1 = $k1->toBigInteger(); - $k2 = $k2->toBigInteger(); - $d1 = 0; - $d2 = 0; - while ($k1->compare(new BigInteger(-$d1)) > 0 || $k2->compare(new BigInteger(-$d2)) > 0) { - // first phase - $m14 = $k1->testBit(0) + 2 * $k1->testBit(1); - $m14 += $d1; - $m14 &= 3; - $m24 = $k2->testBit(0) + 2 * $k2->testBit(1); - $m24 += $d2; - $m24 &= 3; - if ($m14 == 3) { - $m14 = -1; - } - if ($m24 == 3) { - $m24 = -1; - } - $u1 = 0; - if ($m14 & 1) { - // if $m14 is odd - $m8 = $k1->testBit(0) + 2 * $k1->testBit(1) + 4 * $k1->testBit(2); - $m8 += $d1; - $m8 &= 7; - $u1 = ($m8 == 3 || $m8 == 5) && $m24 == 2 ? -$m14 : $m14; - } - $jsf[0][] = $u1; - $u2 = 0; - if ($m24 & 1) { - // if $m24 is odd - $m8 = $k2->testBit(0) + 2 * $k2->testBit(1) + 4 * $k2->testBit(2); - $m8 += $d2; - $m8 &= 7; - $u2 = ($m8 == 3 || $m8 == 5) && $m14 == 2 ? -$m24 : $m24; - } - $jsf[1][] = $u2; - // second phase - if (2 * $d1 == $u1 + 1) { - $d1 = 1 - $d1; - } - if (2 * $d2 == $u2 + 1) { - $d2 = 1 - $d2; - } - $k1 = $k1->bitwise_rightShift(1); - $k2 = $k2->bitwise_rightShift(1); - } - return $jsf; - } - /** - * Returns the affine point - * - * A Jacobian Coordinate is of the form (x, y, z). - * To convert a Jacobian Coordinate to an Affine Point - * you do (x / z^2, y / z^3) - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[2])) { - return $p; - } - list($x, $y, $z) = $p; - $z = $this->one->divide($z); - $z2 = $z->multiply($z); - return [$x->multiply($z2), $y->multiply($z2)->multiply($z)]; - } - /** - * Converts an affine point to a jacobian coordinate - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (isset($p[2])) { - return $p; - } - $p[2] = clone $this->one; - $p['fresh'] = \true; - return $p; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php deleted file mode 100644 index 52cabdf..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php +++ /dev/null @@ -1,190 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\BaseCurves; - -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\PrimeField; -use phpseclib3\Math\PrimeField\Integer as PrimeInteger; -/** - * Curves over a*x^2 + y^2 = 1 + d*x^2*y^2 - * - * @author Jim Wigginton - */ -class TwistedEdwards extends \phpseclib3\Crypt\EC\BaseCurves\Base -{ - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - /** - * Cofficient for x^2 - * - * @var object - */ - protected $a; - /** - * Cofficient for x^2*y^2 - * - * @var object - */ - protected $d; - /** - * Base Point - * - * @var object[] - */ - protected $p; - /** - * The number zero over the specified finite field - * - * @var object - */ - protected $zero; - /** - * The number one over the specified finite field - * - * @var object - */ - protected $one; - /** - * The number two over the specified finite field - * - * @var object - */ - protected $two; - /** - * Sets the modulo - */ - public function setModulo(BigInteger $modulo) - { - $this->modulo = $modulo; - $this->factory = new PrimeField($modulo); - $this->zero = $this->factory->newInteger(new BigInteger(0)); - $this->one = $this->factory->newInteger(new BigInteger(1)); - $this->two = $this->factory->newInteger(new BigInteger(2)); - } - /** - * Set coefficients a and b - */ - public function setCoefficients(BigInteger $a, BigInteger $d) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger($a); - $this->d = $this->factory->newInteger($d); - } - /** - * Set x and y coordinates for the base point - */ - public function setBasePoint($x, $y) - { - switch (\true) { - case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); - case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [$x instanceof BigInteger ? $this->factory->newInteger($x) : $x, $y instanceof BigInteger ? $this->factory->newInteger($y) : $y]; - } - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getA() - { - return $this->a; - } - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getD() - { - return $this->d; - } - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - /** - * Returns the affine point - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[2])) { - return $p; - } - list($x, $y, $z) = $p; - $z = $this->one->divide($z); - return [$x->multiply($z), $y->multiply($z)]; - } - /** - * Returns the modulo - * - * @return \phpseclib3\Math\BigInteger - */ - public function getModulo() - { - return $this->modulo; - } - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $x2 = $x->multiply($x); - $y2 = $y->multiply($y); - $lhs = $this->a->multiply($x2)->add($y2); - $rhs = $this->d->multiply($x2)->multiply($y2)->add($this->one); - return $lhs->equals($rhs); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php deleted file mode 100644 index 9025f84..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Montgomery; -use phpseclib3\Math\BigInteger; -class Curve25519 extends Montgomery -{ - public function __construct() - { - // 2^255 - 19 - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED', 16)); - $this->a24 = $this->factory->newInteger(new BigInteger('121666')); - $this->p = [$this->factory->newInteger(new BigInteger(9))]; - // 2^252 + 0x14def9dea2f79cd65812631a5cf5d3ed - $this->setOrder(new BigInteger('1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED', 16)); - /* - $this->setCoefficients( - new BigInteger('486662'), // a - ); - $this->setBasePoint( - new BigInteger(9), - new BigInteger('14781619447589544791020593568409986887264606134616475288964881837755586237401') - ); - */ - } - /** - * Multiply a point on the curve by a scalar - * - * Modifies the scalar as described at https://tools.ietf.org/html/rfc7748#page-8 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - //$r = strrev(sodium_crypto_scalarmult($d->toBytes(), strrev($p[0]->toBytes()))); - //return [$this->factory->newInteger(new BigInteger($r, 256))]; - $d = $d->toBytes(); - $d &= "\xf8" . \str_repeat("\xff", 30) . ""; - $d = \strrev($d); - $d |= "@"; - $d = new BigInteger($d, -256); - return parent::multiplyPoint($p, $d); - } - /** - * Creates a random scalar multiplier - * - * @return BigInteger - */ - public function createRandomMultiplier() - { - return BigInteger::random(256); - } - /** - * Performs range check - */ - public function rangeCheck(BigInteger $x) - { - if ($x->getLength() > 256 || $x->isNegative()) { - throw new \RangeException('x must be a positive integer less than 256 bytes in length'); - } - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php deleted file mode 100644 index 478f8f4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Montgomery; -use phpseclib3\Math\BigInteger; -class Curve448 extends Montgomery -{ - public function __construct() - { - // 2^448 - 2^224 - 1 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->a24 = $this->factory->newInteger(new BigInteger('39081')); - $this->p = [$this->factory->newInteger(new BigInteger(5))]; - // 2^446 - 0x8335dc163bb124b65129c96fde933d8d723a70aadc873d6d54a7bb0d - $this->setOrder(new BigInteger('3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', 16)); - /* - $this->setCoefficients( - new BigInteger('156326'), // a - ); - $this->setBasePoint( - new BigInteger(5), - new BigInteger( - '355293926785568175264127502063783334808976399387714271831880898' . - '435169088786967410002932673765864550910142774147268105838985595290' . - '606362') - ); - */ - } - /** - * Multiply a point on the curve by a scalar - * - * Modifies the scalar as described at https://tools.ietf.org/html/rfc7748#page-8 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - //$r = strrev(sodium_crypto_scalarmult($d->toBytes(), strrev($p[0]->toBytes()))); - //return [$this->factory->newInteger(new BigInteger($r, 256))]; - $d = $d->toBytes(); - $d[0] = $d[0] & "\xfc"; - $d = \strrev($d); - $d |= "\x80"; - $d = new BigInteger($d, 256); - return parent::multiplyPoint($p, $d); - } - /** - * Creates a random scalar multiplier - * - * @return BigInteger - */ - public function createRandomMultiplier() - { - return BigInteger::random(446); - } - /** - * Performs range check - */ - public function rangeCheck(BigInteger $x) - { - if ($x->getLength() > 448 || $x->isNegative()) { - throw new \RangeException('x must be a positive integer less than 446 bytes in length'); - } - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php deleted file mode 100644 index 6bb583c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php +++ /dev/null @@ -1,295 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\Random; -use phpseclib3\Math\BigInteger; -class Ed25519 extends TwistedEdwards -{ - const HASH = 'sha512'; - /* - Per https://tools.ietf.org/html/rfc8032#page-6 EdDSA has several parameters, one of which is b: - - 2. An integer b with 2^(b-1) > p. EdDSA public keys have exactly b - bits, and EdDSA signatures have exactly 2*b bits. b is - recommended to be a multiple of 8, so public key and signature - lengths are an integral number of octets. - - SIZE corresponds to b - */ - const SIZE = 32; - public function __construct() - { - // 2^255 - 19 - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED', 16)); - $this->setCoefficients( - // -1 - new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC', 16), - // a - // -121665/121666 - new BigInteger('52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3', 16) - ); - $this->setBasePoint(new BigInteger('216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A', 16), new BigInteger('6666666666666666666666666666666666666666666666666666666666666658', 16)); - $this->setOrder(new BigInteger('1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED', 16)); - // algorithm 14.47 from http://cacr.uwaterloo.ca/hac/about/chap14.pdf#page=16 - /* - $this->setReduction(function($x) { - $parts = $x->bitwise_split(255); - $className = $this->className; - - if (count($parts) > 2) { - list(, $r) = $x->divide($className::$modulo); - return $r; - } - - $zero = new BigInteger(); - $c = new BigInteger(19); - - switch (count($parts)) { - case 2: - list($qi, $ri) = $parts; - break; - case 1: - $qi = $zero; - list($ri) = $parts; - break; - case 0: - return $zero; - } - $r = $ri; - - while ($qi->compare($zero) > 0) { - $temp = $qi->multiply($c)->bitwise_split(255); - if (count($temp) == 2) { - list($qi, $ri) = $temp; - } else { - $qi = $zero; - list($ri) = $temp; - } - $r = $r->add($ri); - } - - while ($r->compare($className::$modulo) > 0) { - $r = $r->subtract($className::$modulo); - } - return $r; - }); - */ - } - /** - * Recover X from Y - * - * Implements steps 2-4 at https://tools.ietf.org/html/rfc8032#section-5.1.3 - * - * Used by EC\Keys\Common.php - * - * @param BigInteger $y - * @param boolean $sign - * @return object[] - */ - public function recoverX(BigInteger $y, $sign) - { - $y = $this->factory->newInteger($y); - $y2 = $y->multiply($y); - $u = $y2->subtract($this->one); - $v = $this->d->multiply($y2)->add($this->one); - $x2 = $u->divide($v); - if ($x2->equals($this->zero)) { - if ($sign) { - throw new \RuntimeException('Unable to recover X coordinate (x2 = 0)'); - } - return clone $this->zero; - } - // find the square root - /* we don't do $x2->squareRoot() because, quoting from - https://tools.ietf.org/html/rfc8032#section-5.1.1: - - "For point decoding or "decompression", square roots modulo p are - needed. They can be computed using the Tonelli-Shanks algorithm or - the special case for p = 5 (mod 8). To find a square root of a, - first compute the candidate root x = a^((p+3)/8) (mod p)." - */ - $exp = $this->getModulo()->add(new BigInteger(3)); - $exp = $exp->bitwise_rightShift(3); - $x = $x2->pow($exp); - // If v x^2 = -u (mod p), set x <-- x * 2^((p-1)/4), which is a square root. - if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { - $temp = $this->getModulo()->subtract(new BigInteger(1)); - $temp = $temp->bitwise_rightShift(2); - $temp = $this->two->pow($temp); - $x = $x->multiply($temp); - if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { - throw new \RuntimeException('Unable to recover X coordinate'); - } - } - if ($x->isOdd() != $sign) { - $x = $x->negate(); - } - return [$x, $y]; - } - /** - * Extract Secret Scalar - * - * Implements steps 1-3 at https://tools.ietf.org/html/rfc8032#section-5.1.5 - * - * Used by the various key handlers - * - * @param string $str - * @return array - */ - public function extractSecret($str) - { - if (\strlen($str) != 32) { - throw new \LengthException('Private Key should be 32-bytes long'); - } - // 1. Hash the 32-byte private key using SHA-512, storing the digest in - // a 64-octet large buffer, denoted h. Only the lower 32 bytes are - // used for generating the public key. - $hash = new Hash('sha512'); - $h = $hash->hash($str); - $h = \substr($h, 0, 32); - // 2. Prune the buffer: The lowest three bits of the first octet are - // cleared, the highest bit of the last octet is cleared, and the - // second highest bit of the last octet is set. - $h[0] = $h[0] & \chr(0xf8); - $h = \strrev($h); - $h[0] = $h[0] & \chr(0x3f) | \chr(0x40); - // 3. Interpret the buffer as the little-endian integer, forming a - // secret scalar s. - $dA = new BigInteger($h, 256); - return ['dA' => $dA, 'secret' => $str]; - } - /** - * Encode a point as a string - * - * @param array $point - * @return string - */ - public function encodePoint($point) - { - list($x, $y) = $point; - $y = $y->toBytes(); - $y[0] = $y[0] & \chr(0x7f); - if ($x->isOdd()) { - $y[0] = $y[0] | \chr(0x80); - } - $y = \strrev($y); - return $y; - } - /** - * Creates a random scalar multiplier - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function createRandomMultiplier() - { - return $this->extractSecret(Random::string(32))['dA']; - } - /** - * Converts an affine point to an extended homogeneous coordinate - * - * From https://tools.ietf.org/html/rfc8032#section-5.1.4 : - * - * A point (x,y) is represented in extended homogeneous coordinates (X, Y, Z, T), - * with x = X/Z, y = Y/Z, x * y = T/Z. - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (empty($p)) { - return [clone $this->zero, clone $this->one, clone $this->one, clone $this->zero]; - } - if (isset($p[2])) { - return $p; - } - $p[2] = clone $this->one; - $p[3] = $p[0]->multiply($p[1]); - return $p; - } - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p)) { - return []; - } - if (!isset($p[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - // from https://tools.ietf.org/html/rfc8032#page-12 - list($x1, $y1, $z1, $t1) = $p; - $a = $x1->multiply($x1); - $b = $y1->multiply($y1); - $c = $this->two->multiply($z1)->multiply($z1); - $h = $a->add($b); - $temp = $x1->add($y1); - $e = $h->subtract($temp->multiply($temp)); - $g = $a->subtract($b); - $f = $c->add($g); - $x3 = $e->multiply($f); - $y3 = $g->multiply($h); - $t3 = $e->multiply($h); - $z3 = $f->multiply($g); - return [$x3, $y3, $z3, $t3]; - } - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p) || !\count($q)) { - if (\count($q)) { - return $q; - } - if (\count($p)) { - return $p; - } - return []; - } - if (!isset($p[2]) || !isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - if ($p[0]->equals($q[0])) { - return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); - } - // from https://tools.ietf.org/html/rfc8032#page-12 - list($x1, $y1, $z1, $t1) = $p; - list($x2, $y2, $z2, $t2) = $q; - $a = $y1->subtract($x1)->multiply($y2->subtract($x2)); - $b = $y1->add($x1)->multiply($y2->add($x2)); - $c = $t1->multiply($this->two)->multiply($this->d)->multiply($t2); - $d = $z1->multiply($this->two)->multiply($z2); - $e = $b->subtract($a); - $f = $d->subtract($c); - $g = $d->add($c); - $h = $b->add($a); - $x3 = $e->multiply($f); - $y3 = $g->multiply($h); - $t3 = $e->multiply($h); - $z3 = $f->multiply($g); - return [$x3, $y3, $z3, $t3]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php deleted file mode 100644 index 279b3f5..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php +++ /dev/null @@ -1,222 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\Random; -use phpseclib3\Math\BigInteger; -class Ed448 extends TwistedEdwards -{ - const HASH = 'shake256-912'; - const SIZE = 57; - public function __construct() - { - // 2^448 - 2^224 - 1 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger(1), - // -39081 - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6756', 16) - ); - $this->setBasePoint(new BigInteger('4F1970C66BED0DED221D15A622BF36DA9E146570470F1767EA6DE324' . 'A3D3A46412AE1AF72AB66511433B80E18B00938E2626A82BC70CC05E', 16), new BigInteger('693F46716EB6BC248876203756C9C7624BEA73736CA3984087789C1E' . '05A0C2D73AD3FF1CE67C39C4FDBD132C4ED7C8AD9808795BF230FA14', 16)); - $this->setOrder(new BigInteger('3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', 16)); - } - /** - * Recover X from Y - * - * Implements steps 2-4 at https://tools.ietf.org/html/rfc8032#section-5.2.3 - * - * Used by EC\Keys\Common.php - * - * @param BigInteger $y - * @param boolean $sign - * @return object[] - */ - public function recoverX(BigInteger $y, $sign) - { - $y = $this->factory->newInteger($y); - $y2 = $y->multiply($y); - $u = $y2->subtract($this->one); - $v = $this->d->multiply($y2)->subtract($this->one); - $x2 = $u->divide($v); - if ($x2->equals($this->zero)) { - if ($sign) { - throw new \RuntimeException('Unable to recover X coordinate (x2 = 0)'); - } - return clone $this->zero; - } - // find the square root - $exp = $this->getModulo()->add(new BigInteger(1)); - $exp = $exp->bitwise_rightShift(2); - $x = $x2->pow($exp); - if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { - throw new \RuntimeException('Unable to recover X coordinate'); - } - if ($x->isOdd() != $sign) { - $x = $x->negate(); - } - return [$x, $y]; - } - /** - * Extract Secret Scalar - * - * Implements steps 1-3 at https://tools.ietf.org/html/rfc8032#section-5.2.5 - * - * Used by the various key handlers - * - * @param string $str - * @return array - */ - public function extractSecret($str) - { - if (\strlen($str) != 57) { - throw new \LengthException('Private Key should be 57-bytes long'); - } - // 1. Hash the 57-byte private key using SHAKE256(x, 114), storing the - // digest in a 114-octet large buffer, denoted h. Only the lower 57 - // bytes are used for generating the public key. - $hash = new Hash('shake256-912'); - $h = $hash->hash($str); - $h = \substr($h, 0, 57); - // 2. Prune the buffer: The two least significant bits of the first - // octet are cleared, all eight bits the last octet are cleared, and - // the highest bit of the second to last octet is set. - $h[0] = $h[0] & \chr(0xfc); - $h = \strrev($h); - $h[0] = "\x00"; - $h[1] = $h[1] | \chr(0x80); - // 3. Interpret the buffer as the little-endian integer, forming a - // secret scalar s. - $dA = new BigInteger($h, 256); - return ['dA' => $dA, 'secret' => $str]; - $dA->secret = $str; - return $dA; - } - /** - * Encode a point as a string - * - * @param array $point - * @return string - */ - public function encodePoint($point) - { - list($x, $y) = $point; - $y = "\x00" . $y->toBytes(); - if ($x->isOdd()) { - $y[0] = $y[0] | \chr(0x80); - } - $y = \strrev($y); - return $y; - } - /** - * Creates a random scalar multiplier - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function createRandomMultiplier() - { - return $this->extractSecret(Random::string(57))['dA']; - } - /** - * Converts an affine point to an extended homogeneous coordinate - * - * From https://tools.ietf.org/html/rfc8032#section-5.2.4 : - * - * A point (x,y) is represented in extended homogeneous coordinates (X, Y, Z, T), - * with x = X/Z, y = Y/Z, x * y = T/Z. - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (empty($p)) { - return [clone $this->zero, clone $this->one, clone $this->one]; - } - if (isset($p[2])) { - return $p; - } - $p[2] = clone $this->one; - return $p; - } - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p)) { - return []; - } - if (!isset($p[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - // from https://tools.ietf.org/html/rfc8032#page-18 - list($x1, $y1, $z1) = $p; - $b = $x1->add($y1); - $b = $b->multiply($b); - $c = $x1->multiply($x1); - $d = $y1->multiply($y1); - $e = $c->add($d); - $h = $z1->multiply($z1); - $j = $e->subtract($this->two->multiply($h)); - $x3 = $b->subtract($e)->multiply($j); - $y3 = $c->subtract($d)->multiply($e); - $z3 = $e->multiply($j); - return [$x3, $y3, $z3]; - } - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - if (!\count($p) || !\count($q)) { - if (\count($q)) { - return $q; - } - if (\count($p)) { - return $p; - } - return []; - } - if (!isset($p[2]) || !isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - if ($p[0]->equals($q[0])) { - return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); - } - // from https://tools.ietf.org/html/rfc8032#page-17 - list($x1, $y1, $z1) = $p; - list($x2, $y2, $z2) = $q; - $a = $z1->multiply($z2); - $b = $a->multiply($a); - $c = $x1->multiply($x2); - $d = $y1->multiply($y2); - $e = $this->d->multiply($c)->multiply($d); - $f = $b->subtract($e); - $g = $b->add($e); - $h = $x1->add($y1)->multiply($x2->add($y2)); - $x3 = $a->multiply($f)->multiply($h->subtract($c)->subtract($d)); - $y3 = $a->multiply($g)->multiply($d->subtract($c)); - $z3 = $f->multiply($g); - return [$x3, $y3, $z3]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php deleted file mode 100644 index 8ba01ce..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP160r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16)); - $this->setCoefficients(new BigInteger('340E7BE2A280EB74E2BE61BADA745D97E8F7C300', 16), new BigInteger('1E589A8595423412134FAA2DBDEC95C8D8675E58', 16)); - $this->setBasePoint(new BigInteger('BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3', 16), new BigInteger('1667CB477A1A8EC338F94741669C976316DA6321', 16)); - $this->setOrder(new BigInteger('E95E4A5F737059DC60DF5991D45029409E60FC09', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php deleted file mode 100644 index 9f84125..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP160t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16)); - $this->setCoefficients( - new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620C', 16), - // eg. -3 - new BigInteger('7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380', 16) - ); - $this->setBasePoint(new BigInteger('B199B13B9B34EFC1397E64BAEB05ACC265FF2378', 16), new BigInteger('ADD6718B7C7C1961F0991B842443772152C9E0AD', 16)); - $this->setOrder(new BigInteger('E95E4A5F737059DC60DF5991D45029409E60FC09', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php deleted file mode 100644 index 0c612a8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP192r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16)); - $this->setCoefficients(new BigInteger('6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF', 16), new BigInteger('469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9', 16)); - $this->setBasePoint(new BigInteger('C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6', 16), new BigInteger('14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F', 16)); - $this->setOrder(new BigInteger('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php deleted file mode 100644 index 794d7cc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP192t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16)); - $this->setCoefficients( - new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294', 16), - // eg. -3 - new BigInteger('13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79', 16) - ); - $this->setBasePoint(new BigInteger('3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129', 16), new BigInteger('097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9', 16)); - $this->setOrder(new BigInteger('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php deleted file mode 100644 index 6350db1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP224r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16)); - $this->setCoefficients(new BigInteger('68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43', 16), new BigInteger('2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B', 16)); - $this->setBasePoint(new BigInteger('0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D', 16), new BigInteger('58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD', 16)); - $this->setOrder(new BigInteger('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php deleted file mode 100644 index e7bb2e6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP224t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16)); - $this->setCoefficients( - new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC', 16), - // eg. -3 - new BigInteger('4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D', 16) - ); - $this->setBasePoint(new BigInteger('6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580', 16), new BigInteger('0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C', 16)); - $this->setOrder(new BigInteger('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php deleted file mode 100644 index 316d685..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP256r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16)); - $this->setCoefficients(new BigInteger('7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9', 16), new BigInteger('26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6', 16)); - $this->setBasePoint(new BigInteger('8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262', 16), new BigInteger('547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997', 16)); - $this->setOrder(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php deleted file mode 100644 index 985ff91..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP256t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16)); - $this->setCoefficients( - new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374', 16), - // eg. -3 - new BigInteger('662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04', 16) - ); - $this->setBasePoint(new BigInteger('A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4', 16), new BigInteger('2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE', 16)); - $this->setOrder(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php deleted file mode 100644 index 448d6e6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP320r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . '2B9EC7893EC28FCD412B1F1B32E27', 16)); - $this->setCoefficients(new BigInteger('3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F4' . '92F375A97D860EB4', 16), new BigInteger('520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD88453981' . '6F5EB4AC8FB1F1A6', 16)); - $this->setBasePoint(new BigInteger('43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C7' . '10AF8D0D39E20611', 16), new BigInteger('14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7' . 'D35245D1692E8EE1', 16)); - $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . '82EC7EE8658E98691555B44C59311', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php deleted file mode 100644 index 647d14f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP320t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . '2B9EC7893EC28FCD412B1F1B32E27', 16)); - $this->setCoefficients( - new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28' . 'FCD412B1F1B32E24', 16), - // eg. -3 - new BigInteger('A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CE' . 'B5B4FEF422340353', 16) - ); - $this->setBasePoint(new BigInteger('925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF' . '3357F624A21BED52', 16), new BigInteger('63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B' . '1B9BC0455FB0D2C3', 16)); - $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . '82EC7EE8658E98691555B44C59311', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php deleted file mode 100644 index e52c661..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP384r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . '1874700133107EC53', 16)); - $this->setCoefficients(new BigInteger('7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503' . 'AD4EB04A8C7DD22CE2826', 16), new BigInteger('4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DB' . 'C9943AB78696FA504C11', 16)); - $this->setBasePoint(new BigInteger('1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D' . '646AAEF87B2E247D4AF1E', 16), new BigInteger('8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E464621779' . '1811142820341263C5315', 16)); - $this->setOrder(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . '03B883202E9046565', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php deleted file mode 100644 index e9f0396..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP384t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . '1874700133107EC53', 16)); - $this->setCoefficients( - new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901' . 'D1A71874700133107EC50', 16), - // eg. -3 - new BigInteger('7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B8' . '8805CED70355A33B471EE', 16) - ); - $this->setBasePoint(new BigInteger('18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946' . 'A5F54D8D0AA2F418808CC', 16), new BigInteger('25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC' . '2B2912675BF5B9E582928', 16)); - $this->setOrder(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . '03B883202E9046565', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php deleted file mode 100644 index 56fa08c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP512r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', 16)); - $this->setCoefficients(new BigInteger('7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA82' . '53AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA', 16), new BigInteger('3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C' . '1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723', 16)); - $this->setBasePoint(new BigInteger('81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D' . '0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822', 16), new BigInteger('7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5' . 'F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892', 16)); - $this->setOrder(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php deleted file mode 100644 index c853959..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class brainpoolP512t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', 16)); - $this->setCoefficients( - new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0', 16), - // eg. -3 - new BigInteger('7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA23049' . '76540F6450085F2DAE145C22553B465763689180EA2571867423E', 16) - ); - $this->setBasePoint(new BigInteger('640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CD' . 'B3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA', 16), new BigInteger('5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEE' . 'F216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332', 16)); - $this->setOrder(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php deleted file mode 100644 index 9bf8945..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistb233 extends \phpseclib3\Crypt\EC\Curves\sect233r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php deleted file mode 100644 index 8bca6cd..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistb409 extends \phpseclib3\Crypt\EC\Curves\sect409r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php deleted file mode 100644 index d2b1800..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistk163 extends \phpseclib3\Crypt\EC\Curves\sect163k1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php deleted file mode 100644 index b8bf9bc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistk233 extends \phpseclib3\Crypt\EC\Curves\sect233k1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php deleted file mode 100644 index e5adb4e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistk283 extends \phpseclib3\Crypt\EC\Curves\sect283k1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php deleted file mode 100644 index 3f064ca..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistk409 extends \phpseclib3\Crypt\EC\Curves\sect409k1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php deleted file mode 100644 index bb8068f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistp192 extends \phpseclib3\Crypt\EC\Curves\secp192r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php deleted file mode 100644 index 5dd12fb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistp224 extends \phpseclib3\Crypt\EC\Curves\secp224r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php deleted file mode 100644 index 5aebed3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistp256 extends \phpseclib3\Crypt\EC\Curves\secp256r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php deleted file mode 100644 index 12f31e5..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistp384 extends \phpseclib3\Crypt\EC\Curves\secp384r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php deleted file mode 100644 index 0c5d0b9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistp521 extends \phpseclib3\Crypt\EC\Curves\secp521r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php deleted file mode 100644 index dba3207..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class nistt571 extends \phpseclib3\Crypt\EC\Curves\sect571k1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php deleted file mode 100644 index 22bb6de..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class prime192v1 extends \phpseclib3\Crypt\EC\Curves\secp192r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php deleted file mode 100644 index 7819d4b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class prime192v2 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), new BigInteger('CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953', 16)); - $this->setBasePoint(new BigInteger('EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A', 16), new BigInteger('6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php deleted file mode 100644 index c926a9c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class prime192v3 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), new BigInteger('22123DC2395A05CAA7423DAECCC94760A7D462256BD56916', 16)); - $this->setBasePoint(new BigInteger('7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896', 16), new BigInteger('38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php deleted file mode 100644 index 4636b40..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class prime239v1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), new BigInteger('6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A', 16)); - $this->setBasePoint(new BigInteger('0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF', 16), new BigInteger('7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE', 16)); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php deleted file mode 100644 index 6a64e3a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class prime239v2 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), new BigInteger('617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C', 16)); - $this->setBasePoint(new BigInteger('38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7', 16), new BigInteger('5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA', 16)); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php deleted file mode 100644 index eae34bb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class prime239v3 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), new BigInteger('255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E', 16)); - $this->setBasePoint(new BigInteger('6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A', 16), new BigInteger('1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3', 16)); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php deleted file mode 100644 index de5e085..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -final class prime256v1 extends \phpseclib3\Crypt\EC\Curves\secp256r1 -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php deleted file mode 100644 index 8531d4e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp112r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('DB7C2ABF62E35E668076BEAD208B', 16)); - $this->setCoefficients(new BigInteger('DB7C2ABF62E35E668076BEAD2088', 16), new BigInteger('659EF8BA043916EEDE8911702B22', 16)); - $this->setBasePoint(new BigInteger('09487239995A5EE76B55F9C2F098', 16), new BigInteger('A89CE5AF8724C0A23E0E0FF77500', 16)); - $this->setOrder(new BigInteger('DB7C2ABF62E35E7628DFAC6561C5', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php deleted file mode 100644 index 763c36d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp112r2 extends Prime -{ - public function __construct() - { - // same modulo as secp112r1 - $this->setModulo(new BigInteger('DB7C2ABF62E35E668076BEAD208B', 16)); - $this->setCoefficients(new BigInteger('6127C24C05F38A0AAAF65C0EF02C', 16), new BigInteger('51DEF1815DB5ED74FCC34C85D709', 16)); - $this->setBasePoint(new BigInteger('4BA30AB5E892B4E1649DD0928643', 16), new BigInteger('ADCD46F5882E3747DEF36E956E97', 16)); - $this->setOrder(new BigInteger('36DF0AAFD8B8D7597CA10520D04B', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php deleted file mode 100644 index 6763b9c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp128r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC', 16), new BigInteger('E87579C11079F43DD824993C2CEE5ED3', 16)); - $this->setBasePoint(new BigInteger('161FF7528B899B2D0C28607CA52C5B86', 16), new BigInteger('CF5AC8395BAFEB13C02DA292DDED7A83', 16)); - $this->setOrder(new BigInteger('FFFFFFFE0000000075A30D1B9038A115', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php deleted file mode 100644 index e24f5c7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp128r2 extends Prime -{ - public function __construct() - { - // same as secp128r1 - $this->setModulo(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('D6031998D1B3BBFEBF59CC9BBFF9AEE1', 16), new BigInteger('5EEEFCA380D02919DC2C6558BB6D8A5D', 16)); - $this->setBasePoint(new BigInteger('7B6AA5D85E572983E6FB32A7CDEBC140', 16), new BigInteger('27B6916A894D3AEE7106FE805FC34B44', 16)); - $this->setOrder(new BigInteger('3FFFFFFF7FFFFFFFBE0024720613B5A3', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php deleted file mode 100644 index f4376ad..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use phpseclib3\Math\BigInteger; -class secp160k1 extends KoblitzPrime -{ - public function __construct() - { - // same as secp160r2 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73', 16)); - $this->setCoefficients(new BigInteger('0000000000000000000000000000000000000000', 16), new BigInteger('0000000000000000000000000000000000000007', 16)); - $this->setBasePoint(new BigInteger('3B4C382CE37AA192A4019E763036F4F5DD4D7EBB', 16), new BigInteger('938CF935318FDCED6BC28286531733C3F03C4FEE', 16)); - $this->setOrder(new BigInteger('0100000000000000000001B8FA16DFAB9ACA16B6B3', 16)); - $this->basis = []; - $this->basis[] = ['a' => new BigInteger('0096341F1138933BC2F505', -16), 'b' => new BigInteger('FF6E9D0418C67BB8D5F562', -16)]; - $this->basis[] = ['a' => new BigInteger('01BDCB3A09AAAABEAFF4A8', -16), 'b' => new BigInteger('04D12329FF0EF498EA67', -16)]; - $this->beta = $this->factory->newInteger(new BigInteger('645B7345A143464942CC46D7CF4D5D1E1E6CBB68', -16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php deleted file mode 100644 index ae5eb4d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp160r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC', 16), new BigInteger('1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45', 16)); - $this->setBasePoint(new BigInteger('4A96B5688EF573284664698968C38BB913CBFC82', 16), new BigInteger('23A628553168947D59DCC912042351377AC5FB32', 16)); - $this->setOrder(new BigInteger('0100000000000000000001F4C8F927AED3CA752257', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php deleted file mode 100644 index fc89beb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp160r2 extends Prime -{ - public function __construct() - { - // same as secp160k1 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70', 16), new BigInteger('B4E134D3FB59EB8BAB57274904664D5AF50388BA', 16)); - $this->setBasePoint(new BigInteger('52DCB034293A117E1F4FF11B30F7199D3144CE6D', 16), new BigInteger('FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E', 16)); - $this->setOrder(new BigInteger('0100000000000000000000351EE786A818F3A1A16B', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php deleted file mode 100644 index e91c7cb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use phpseclib3\Math\BigInteger; -class secp192k1 extends KoblitzPrime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37', 16)); - $this->setCoefficients(new BigInteger('000000000000000000000000000000000000000000000000', 16), new BigInteger('000000000000000000000000000000000000000000000003', 16)); - $this->setBasePoint(new BigInteger('DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D', 16), new BigInteger('9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D', 16)); - $this->basis = []; - $this->basis[] = ['a' => new BigInteger('00B3FB3400DEC5C4ADCEB8655C', -16), 'b' => new BigInteger('8EE96418CCF4CFC7124FDA0F', -16)]; - $this->basis[] = ['a' => new BigInteger('01D90D03E8F096B9948B20F0A9', -16), 'b' => new BigInteger('42E49819ABBA9474E1083F6B', -16)]; - $this->beta = $this->factory->newInteger(new BigInteger('447A96E6C647963E2F7809FEAAB46947F34B0AA3CA0BBA74', -16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php deleted file mode 100644 index ac8fe9f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp192r1 extends Prime -{ - public function __construct() - { - $modulo = new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16); - $this->setModulo($modulo); - // algorithm 2.27 from http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=66 - /* in theory this should be faster than regular modular reductions save for one small issue. - to convert to / from base-2**8 with BCMath you have to call bcmul() and bcdiv() a lot. - to convert to / from base-2**8 with PHP64 you have to call base256_rshift() a lot. - in short, converting to / from base-2**8 is pretty expensive and that expense is - enough to offset whatever else might be gained by a simplified reduction algorithm. - now, if PHP supported unsigned integers things might be different. no bit-shifting - would be required for the PHP engine and it'd be a lot faster. but as is, BigInteger - uses base-2**31 or base-2**26 depending on whether or not the system is has a 32-bit - or a 64-bit OS. - */ - /* - $m_length = $this->getLengthInBytes(); - $this->setReduction(function($c) use ($m_length) { - $cBytes = $c->toBytes(); - $className = $this->className; - - if (strlen($cBytes) > 2 * $m_length) { - list(, $r) = $c->divide($className::$modulo); - return $r; - } - - $c = str_pad($cBytes, 48, "\0", STR_PAD_LEFT); - $c = array_reverse(str_split($c, 8)); - - $null = "\0\0\0\0\0\0\0\0"; - $s1 = new BigInteger($c[2] . $c[1] . $c[0], 256); - $s2 = new BigInteger($null . $c[3] . $c[3], 256); - $s3 = new BigInteger($c[4] . $c[4] . $null, 256); - $s4 = new BigInteger($c[5] . $c[5] . $c[5], 256); - - $r = $s1->add($s2)->add($s3)->add($s4); - while ($r->compare($className::$modulo) >= 0) { - $r = $r->subtract($className::$modulo); - } - - return $r; - }); - */ - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), new BigInteger('64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1', 16)); - $this->setBasePoint(new BigInteger('188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012', 16), new BigInteger('07192B95FFC8DA78631011ED6B24CDD573F977A11E794811', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php deleted file mode 100644 index 04d0594..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use phpseclib3\Math\BigInteger; -class secp224k1 extends KoblitzPrime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D', 16)); - $this->setCoefficients(new BigInteger('00000000000000000000000000000000000000000000000000000000', 16), new BigInteger('00000000000000000000000000000000000000000000000000000005', 16)); - $this->setBasePoint(new BigInteger('A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C', 16), new BigInteger('7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5', 16)); - $this->setOrder(new BigInteger('010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7', 16)); - $this->basis = []; - $this->basis[] = ['a' => new BigInteger('00B8ADF1378A6EB73409FA6C9C637D', -16), 'b' => new BigInteger('94730F82B358A3776A826298FA6F', -16)]; - $this->basis[] = ['a' => new BigInteger('01DCE8D2EC6184CAF0A972769FCC8B', -16), 'b' => new BigInteger('4D2100BA3DC75AAB747CCF355DEC', -16)]; - $this->beta = $this->factory->newInteger(new BigInteger('01F178FFA4B17C89E6F73AECE2AAD57AF4C0A748B63C830947B27E04', -16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php deleted file mode 100644 index a1b949b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp224r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE', 16), new BigInteger('B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4', 16)); - $this->setBasePoint(new BigInteger('B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21', 16), new BigInteger('BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php deleted file mode 100644 index ea425ba..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -//use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use phpseclib3\Math\BigInteger; -//class secp256k1 extends Prime -class secp256k1 extends KoblitzPrime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F', 16)); - $this->setCoefficients(new BigInteger('0000000000000000000000000000000000000000000000000000000000000000', 16), new BigInteger('0000000000000000000000000000000000000000000000000000000000000007', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16)); - $this->setBasePoint(new BigInteger('79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 16), new BigInteger('483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 16)); - $this->basis = []; - $this->basis[] = ['a' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16), 'b' => new BigInteger('FF1BBC8129FEF177D790AB8056F5401B3D', -16)]; - $this->basis[] = ['a' => new BigInteger('114CA50F7A8E2F3F657C1108D9D44CFD8', -16), 'b' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16)]; - $this->beta = $this->factory->newInteger(new BigInteger('7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE', -16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php deleted file mode 100644 index 6e94fa9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp256r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', 16), new BigInteger('5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B', 16)); - $this->setBasePoint(new BigInteger('6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296', 16), new BigInteger('4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5', 16)); - $this->setOrder(new BigInteger('FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php deleted file mode 100644 index 63d8318..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp384r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC', 16), new BigInteger('B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF', 16)); - $this->setBasePoint(new BigInteger('AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7', 16), new BigInteger('3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php deleted file mode 100644 index 0cccf88..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Prime; -use phpseclib3\Math\BigInteger; -class secp521r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFF', 16)); - $this->setCoefficients(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFC', 16), new BigInteger('0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF1' . '09E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B50' . '3F00', 16)); - $this->setBasePoint(new BigInteger('00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D' . '3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5' . 'BD66', 16), new BigInteger('011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E' . '662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD1' . '6650', 16)); - $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E9138' . '6409', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php deleted file mode 100644 index 8b25085..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect113r1 extends Binary -{ - public function __construct() - { - $this->setModulo(113, 9, 0); - $this->setCoefficients('003088250CA6E7C7FE649CE85820F7', '00E8BEE4D3E2260744188BE0E9C723'); - $this->setBasePoint('009D73616F35F4AB1407D73562C10F', '00A52830277958EE84D1315ED31886'); - $this->setOrder(new BigInteger('0100000000000000D9CCEC8A39E56F', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php deleted file mode 100644 index 574b6b9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect113r2 extends Binary -{ - public function __construct() - { - $this->setModulo(113, 9, 0); - $this->setCoefficients('00689918DBEC7E5A0DD6DFC0AA55C7', '0095E9A9EC9B297BD4BF36E059184F'); - $this->setBasePoint('01A57A6A7B26CA5EF52FCDB8164797', '00B3ADC94ED1FE674C06E695BABA1D'); - $this->setOrder(new BigInteger('010000000000000108789B2496AF93', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php deleted file mode 100644 index 9a7405c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect131r1 extends Binary -{ - public function __construct() - { - $this->setModulo(131, 8, 3, 2, 0); - $this->setCoefficients('07A11B09A76B562144418FF3FF8C2570B8', '0217C05610884B63B9C6C7291678F9D341'); - $this->setBasePoint('0081BAF91FDF9833C40F9C181343638399', '078C6E7EA38C001F73C8134B1B4EF9E150'); - $this->setOrder(new BigInteger('0400000000000000023123953A9464B54D', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php deleted file mode 100644 index 467c03d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect131r2 extends Binary -{ - public function __construct() - { - $this->setModulo(131, 8, 3, 2, 0); - $this->setCoefficients('03E5A88919D7CAFCBF415F07C2176573B2', '04B8266A46C55657AC734CE38F018F2192'); - $this->setBasePoint('0356DCD8F2F95031AD652D23951BB366A8', '0648F06D867940A5366D9E265DE9EB240F'); - $this->setOrder(new BigInteger('0400000000000000016954A233049BA98F', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php deleted file mode 100644 index 2f9f244..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect163k1 extends Binary -{ - public function __construct() - { - $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients('000000000000000000000000000000000000000001', '000000000000000000000000000000000000000001'); - $this->setBasePoint('02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8', '0289070FB05D38FF58321F2E800536D538CCDAA3D9'); - $this->setOrder(new BigInteger('04000000000000000000020108A2E0CC0D99F8A5EF', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php deleted file mode 100644 index 4530b1a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect163r1 extends Binary -{ - public function __construct() - { - $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients('07B6882CAAEFA84F9554FF8428BD88E246D2782AE2', '0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9'); - $this->setBasePoint('0369979697AB43897789566789567F787A7876A654', '00435EDB42EFAFB2989D51FEFCE3C80988F41FF883'); - $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php deleted file mode 100644 index ea73637..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect163r2 extends Binary -{ - public function __construct() - { - $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients('000000000000000000000000000000000000000001', '020A601907B8C953CA1481EB10512F78744A3205FD'); - $this->setBasePoint('03F0EBA16286A2D57EA0991168D4994637E8343E36', '00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1'); - $this->setOrder(new BigInteger('040000000000000000000292FE77E70C12A4234C33', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php deleted file mode 100644 index ce86fdc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect193r1 extends Binary -{ - public function __construct() - { - $this->setModulo(193, 15, 0); - $this->setCoefficients('0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01', '00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814'); - $this->setBasePoint('01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1', '0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05'); - $this->setOrder(new BigInteger('01000000000000000000000000C7F34A778F443ACC920EBA49', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php deleted file mode 100644 index 40d5f02..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect193r2 extends Binary -{ - public function __construct() - { - $this->setModulo(193, 15, 0); - $this->setCoefficients('0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B', '00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE'); - $this->setBasePoint('00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F', '01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C'); - $this->setOrder(new BigInteger('010000000000000000000000015AAB561B005413CCD4EE99D5', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php deleted file mode 100644 index d00b6f2..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect233k1 extends Binary -{ - public function __construct() - { - $this->setModulo(233, 74, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126', '01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3'); - $this->setOrder(new BigInteger('8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php deleted file mode 100644 index a7565a4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect233r1 extends Binary -{ - public function __construct() - { - $this->setModulo(233, 74, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000001', '0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD'); - $this->setBasePoint('00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B', '01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052'); - $this->setOrder(new BigInteger('01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php deleted file mode 100644 index faa1b4e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect239k1 extends Binary -{ - public function __construct() - { - $this->setModulo(239, 158, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC', '76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA'); - $this->setOrder(new BigInteger('2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php deleted file mode 100644 index 9925de4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect283k1 extends Binary -{ - public function __construct() - { - $this->setModulo(283, 12, 7, 5, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836', '01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259'); - $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php deleted file mode 100644 index 9703404..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect283r1 extends Binary -{ - public function __construct() - { - $this->setModulo(283, 12, 7, 5, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000001', '027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5'); - $this->setBasePoint('05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053', '03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4'); - $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php deleted file mode 100644 index 40adbb2..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect409k1 extends Binary -{ - public function __construct() - { - $this->setModulo(409, 87, 0); - $this->setCoefficients('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746', '01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B'); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F' . '83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php deleted file mode 100644 index 8c82beb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect409r1 extends Binary -{ - public function __construct() - { - $this->setModulo(409, 87, 0); - $this->setCoefficients('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', '0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F'); - $this->setBasePoint('015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7', '0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706'); - $this->setOrder(new BigInteger('010000000000000000000000000000000000000000000000000001E2' . 'AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php deleted file mode 100644 index c25f4ed..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect571k1 extends Binary -{ - public function __construct() - { - $this->setModulo(571, 10, 5, 2, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000000' . '000000000000000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000000000000000000' . '000000000000000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA443709584' . '93B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972', '0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0' . 'AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3'); - $this->setOrder(new BigInteger('020000000000000000000000000000000000000000000000000000000000000000000000' . '131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php deleted file mode 100644 index e7355b3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Crypt\EC\Curves; - -use phpseclib3\Crypt\EC\BaseCurves\Binary; -use phpseclib3\Math\BigInteger; -class sect571r1 extends Binary -{ - public function __construct() - { - $this->setModulo(571, 10, 5, 2, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000000' . '000000000000000000000000000000000000000000000000000000000000000000000001', '02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD' . '8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A'); - $this->setBasePoint('0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950' . 'F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19', '037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43' . 'BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B'); - $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'E661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47', 16)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php deleted file mode 100644 index 5da8ef8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php +++ /dev/null @@ -1,489 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\BaseCurves\Binary as BinaryCurve; -use phpseclib3\Crypt\EC\BaseCurves\Prime as PrimeCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * Generic EC Key Parsing Helper functions - * - * @author Jim Wigginton - */ -trait Common -{ - /** - * Curve OIDs - * - * @var array - */ - private static $curveOIDs = []; - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = \false; - /** - * Use Named Curves - * - * @var bool - */ - private static $useNamedCurves = \true; - /** - * Initialize static variables - */ - private static function initialize_static_variables() - { - if (empty(self::$curveOIDs)) { - // the sec* curves are from the standards for efficient cryptography group - // sect* curves are curves over binary finite fields - // secp* curves are curves over prime finite fields - // sec*r* curves are regular curves; sec*k* curves are koblitz curves - // brainpool*r* curves are regular prime finite field curves - // brainpool*t* curves are twisted versions of the brainpool*r* curves - self::$curveOIDs = [ - 'prime192v1' => '1.2.840.10045.3.1.1', - // J.5.1, example 1 (aka secp192r1) - 'prime192v2' => '1.2.840.10045.3.1.2', - // J.5.1, example 2 - 'prime192v3' => '1.2.840.10045.3.1.3', - // J.5.1, example 3 - 'prime239v1' => '1.2.840.10045.3.1.4', - // J.5.2, example 1 - 'prime239v2' => '1.2.840.10045.3.1.5', - // J.5.2, example 2 - 'prime239v3' => '1.2.840.10045.3.1.6', - // J.5.2, example 3 - 'prime256v1' => '1.2.840.10045.3.1.7', - // J.5.3, example 1 (aka secp256r1) - // https://tools.ietf.org/html/rfc5656#section-10 - 'nistp256' => '1.2.840.10045.3.1.7', - // aka secp256r1 - 'nistp384' => '1.3.132.0.34', - // aka secp384r1 - 'nistp521' => '1.3.132.0.35', - // aka secp521r1 - 'nistk163' => '1.3.132.0.1', - // aka sect163k1 - 'nistp192' => '1.2.840.10045.3.1.1', - // aka secp192r1 - 'nistp224' => '1.3.132.0.33', - // aka secp224r1 - 'nistk233' => '1.3.132.0.26', - // aka sect233k1 - 'nistb233' => '1.3.132.0.27', - // aka sect233r1 - 'nistk283' => '1.3.132.0.16', - // aka sect283k1 - 'nistk409' => '1.3.132.0.36', - // aka sect409k1 - 'nistb409' => '1.3.132.0.37', - // aka sect409r1 - 'nistt571' => '1.3.132.0.38', - // aka sect571k1 - // from https://tools.ietf.org/html/rfc5915 - 'secp192r1' => '1.2.840.10045.3.1.1', - // aka prime192v1 - 'sect163k1' => '1.3.132.0.1', - 'sect163r2' => '1.3.132.0.15', - 'secp224r1' => '1.3.132.0.33', - 'sect233k1' => '1.3.132.0.26', - 'sect233r1' => '1.3.132.0.27', - 'secp256r1' => '1.2.840.10045.3.1.7', - // aka prime256v1 - 'sect283k1' => '1.3.132.0.16', - 'sect283r1' => '1.3.132.0.17', - 'secp384r1' => '1.3.132.0.34', - 'sect409k1' => '1.3.132.0.36', - 'sect409r1' => '1.3.132.0.37', - 'secp521r1' => '1.3.132.0.35', - 'sect571k1' => '1.3.132.0.38', - 'sect571r1' => '1.3.132.0.39', - // from http://www.secg.org/SEC2-Ver-1.0.pdf - 'secp112r1' => '1.3.132.0.6', - 'secp112r2' => '1.3.132.0.7', - 'secp128r1' => '1.3.132.0.28', - 'secp128r2' => '1.3.132.0.29', - 'secp160k1' => '1.3.132.0.9', - 'secp160r1' => '1.3.132.0.8', - 'secp160r2' => '1.3.132.0.30', - 'secp192k1' => '1.3.132.0.31', - 'secp224k1' => '1.3.132.0.32', - 'secp256k1' => '1.3.132.0.10', - 'sect113r1' => '1.3.132.0.4', - 'sect113r2' => '1.3.132.0.5', - 'sect131r1' => '1.3.132.0.22', - 'sect131r2' => '1.3.132.0.23', - 'sect163r1' => '1.3.132.0.2', - 'sect193r1' => '1.3.132.0.24', - 'sect193r2' => '1.3.132.0.25', - 'sect239k1' => '1.3.132.0.3', - // from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf#page=36 - /* - 'c2pnb163v1' => '1.2.840.10045.3.0.1', // J.4.1, example 1 - 'c2pnb163v2' => '1.2.840.10045.3.0.2', // J.4.1, example 2 - 'c2pnb163v3' => '1.2.840.10045.3.0.3', // J.4.1, example 3 - 'c2pnb172w1' => '1.2.840.10045.3.0.4', // J.4.2, example 1 - 'c2tnb191v1' => '1.2.840.10045.3.0.5', // J.4.3, example 1 - 'c2tnb191v2' => '1.2.840.10045.3.0.6', // J.4.3, example 2 - 'c2tnb191v3' => '1.2.840.10045.3.0.7', // J.4.3, example 3 - 'c2onb191v4' => '1.2.840.10045.3.0.8', // J.4.3, example 4 - 'c2onb191v5' => '1.2.840.10045.3.0.9', // J.4.3, example 5 - 'c2pnb208w1' => '1.2.840.10045.3.0.10', // J.4.4, example 1 - 'c2tnb239v1' => '1.2.840.10045.3.0.11', // J.4.5, example 1 - 'c2tnb239v2' => '1.2.840.10045.3.0.12', // J.4.5, example 2 - 'c2tnb239v3' => '1.2.840.10045.3.0.13', // J.4.5, example 3 - 'c2onb239v4' => '1.2.840.10045.3.0.14', // J.4.5, example 4 - 'c2onb239v5' => '1.2.840.10045.3.0.15', // J.4.5, example 5 - 'c2pnb272w1' => '1.2.840.10045.3.0.16', // J.4.6, example 1 - 'c2pnb304w1' => '1.2.840.10045.3.0.17', // J.4.7, example 1 - 'c2tnb359v1' => '1.2.840.10045.3.0.18', // J.4.8, example 1 - 'c2pnb368w1' => '1.2.840.10045.3.0.19', // J.4.9, example 1 - 'c2tnb431r1' => '1.2.840.10045.3.0.20', // J.4.10, example 1 - */ - // http://www.ecc-brainpool.org/download/Domain-parameters.pdf - // https://tools.ietf.org/html/rfc5639 - 'brainpoolP160r1' => '1.3.36.3.3.2.8.1.1.1', - 'brainpoolP160t1' => '1.3.36.3.3.2.8.1.1.2', - 'brainpoolP192r1' => '1.3.36.3.3.2.8.1.1.3', - 'brainpoolP192t1' => '1.3.36.3.3.2.8.1.1.4', - 'brainpoolP224r1' => '1.3.36.3.3.2.8.1.1.5', - 'brainpoolP224t1' => '1.3.36.3.3.2.8.1.1.6', - 'brainpoolP256r1' => '1.3.36.3.3.2.8.1.1.7', - 'brainpoolP256t1' => '1.3.36.3.3.2.8.1.1.8', - 'brainpoolP320r1' => '1.3.36.3.3.2.8.1.1.9', - 'brainpoolP320t1' => '1.3.36.3.3.2.8.1.1.10', - 'brainpoolP384r1' => '1.3.36.3.3.2.8.1.1.11', - 'brainpoolP384t1' => '1.3.36.3.3.2.8.1.1.12', - 'brainpoolP512r1' => '1.3.36.3.3.2.8.1.1.13', - 'brainpoolP512t1' => '1.3.36.3.3.2.8.1.1.14', - ]; - ASN1::loadOIDs([ - 'prime-field' => '1.2.840.10045.1.1', - 'characteristic-two-field' => '1.2.840.10045.1.2', - 'characteristic-two-basis' => '1.2.840.10045.1.2.3', - // per http://www.secg.org/SEC1-Ver-1.0.pdf#page=84, gnBasis "not used here" - 'gnBasis' => '1.2.840.10045.1.2.3.1', - // NULL - 'tpBasis' => '1.2.840.10045.1.2.3.2', - // Trinomial - 'ppBasis' => '1.2.840.10045.1.2.3.3', - ] + self::$curveOIDs); - } - } - /** - * Explicitly set the curve - * - * If the key contains an implicit curve phpseclib needs the curve - * to be explicitly provided - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - */ - public static function setImplicitCurve(BaseCurve $curve) - { - self::$implicitCurve = $curve; - } - /** - * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based - * on the curve parameters - * - * @param array $params - * @return \phpseclib3\Crypt\EC\BaseCurves\Base|false - */ - protected static function loadCurveByParam(array $params) - { - if (\count($params) > 1) { - throw new \RuntimeException('No parameters are present'); - } - if (isset($params['namedCurve'])) { - $curve = '\\phpseclib3\\Crypt\\EC\\Curves\\' . $params['namedCurve']; - if (!\class_exists($curve)) { - throw new UnsupportedCurveException('Named Curve of ' . $params['namedCurve'] . ' is not supported'); - } - return new $curve(); - } - if (isset($params['implicitCurve'])) { - if (!isset(self::$implicitCurve)) { - throw new \RuntimeException('Implicit curves can be provided by calling setImplicitCurve'); - } - return self::$implicitCurve; - } - if (isset($params['specifiedCurve'])) { - $data = $params['specifiedCurve']; - switch ($data['fieldID']['fieldType']) { - case 'prime-field': - $curve = new PrimeCurve(); - $curve->setModulo($data['fieldID']['parameters']); - $curve->setCoefficients(new BigInteger($data['curve']['a'], 256), new BigInteger($data['curve']['b'], 256)); - $point = self::extractPoint("\x00" . $data['base'], $curve); - $curve->setBasePoint(...$point); - $curve->setOrder($data['order']); - return $curve; - case 'characteristic-two-field': - $curve = new BinaryCurve(); - $params = ASN1::decodeBER($data['fieldID']['parameters']); - $params = ASN1::asn1map($params[0], Maps\Characteristic_two::MAP); - $modulo = [(int) $params['m']->toString()]; - switch ($params['basis']) { - case 'tpBasis': - $modulo[] = (int) $params['parameters']->toString(); - break; - case 'ppBasis': - $temp = ASN1::decodeBER($params['parameters']); - $temp = ASN1::asn1map($temp[0], Maps\Pentanomial::MAP); - $modulo[] = (int) $temp['k3']->toString(); - $modulo[] = (int) $temp['k2']->toString(); - $modulo[] = (int) $temp['k1']->toString(); - } - $modulo[] = 0; - $curve->setModulo(...$modulo); - $len = \ceil($modulo[0] / 8); - $curve->setCoefficients(Strings::bin2hex($data['curve']['a']), Strings::bin2hex($data['curve']['b'])); - $point = self::extractPoint("\x00" . $data['base'], $curve); - $curve->setBasePoint(...$point); - $curve->setOrder($data['order']); - return $curve; - default: - throw new UnsupportedCurveException('Field Type of ' . $data['fieldID']['fieldType'] . ' is not supported'); - } - } - throw new \RuntimeException('No valid parameters are present'); - } - /** - * Extract points from a string - * - * Supports both compressed and uncompressed points - * - * @param string $str - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @return object[] - */ - public static function extractPoint($str, BaseCurve $curve) - { - if ($curve instanceof TwistedEdwardsCurve) { - // first step of point deciding as discussed at the following URL's: - // https://tools.ietf.org/html/rfc8032#section-5.1.3 - // https://tools.ietf.org/html/rfc8032#section-5.2.3 - $y = $str; - $y = \strrev($y); - $sign = (bool) (\ord($y[0]) & 0x80); - $y[0] = $y[0] & \chr(0x7f); - $y = new BigInteger($y, 256); - if ($y->compare($curve->getModulo()) >= 0) { - throw new \RuntimeException('The Y coordinate should not be >= the modulo'); - } - $point = $curve->recoverX($y, $sign); - if (!$curve->verifyPoint($point)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - return $point; - } - // the first byte of a bit string represents the number of bits in the last byte that are to be ignored but, - // currently, bit strings wanting a non-zero amount of bits trimmed are not supported - if (($val = Strings::shift($str)) != "\x00") { - throw new \UnexpectedValueException('extractPoint expects the first byte to be null - not ' . Strings::bin2hex($val)); - } - if ($str == "\x00") { - return []; - } - $keylen = \strlen($str); - $order = $curve->getLengthInBytes(); - // point compression is being used - if ($keylen == $order + 1) { - return $curve->derivePoint($str); - } - // point compression is not being used - if ($keylen == 2 * $order + 1) { - \preg_match("#(.)(.{{$order}})(.{{$order}})#s", $str, $matches); - list(, $w, $x, $y) = $matches; - if ($w != "\x04") { - throw new \UnexpectedValueException('The first byte of an uncompressed point should be 04 - not ' . Strings::bin2hex($val)); - } - $point = [$curve->convertInteger(new BigInteger($x, 256)), $curve->convertInteger(new BigInteger($y, 256))]; - if (!$curve->verifyPoint($point)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - return $point; - } - throw new \UnexpectedValueException('The string representation of the points is not of an appropriate length'); - } - /** - * Encode Parameters - * - * @todo Maybe at some point this could be moved to __toString() for each of the curves? - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param bool $returnArray optional - * @param array $options optional - * @return string|false - */ - private static function encodeParameters(BaseCurve $curve, $returnArray = \false, array $options = []) - { - $useNamedCurves = isset($options['namedCurve']) ? $options['namedCurve'] : self::$useNamedCurves; - $reflect = new \ReflectionClass($curve); - $name = $reflect->getShortName(); - if ($useNamedCurves) { - if (isset(self::$curveOIDs[$name])) { - if ($reflect->isFinal()) { - $reflect = $reflect->getParentClass(); - $name = $reflect->getShortName(); - } - return $returnArray ? ['namedCurve' => $name] : ASN1::encodeDER(['namedCurve' => $name], Maps\ECParameters::MAP); - } - foreach (new \DirectoryIterator(__DIR__ . '/../../Curves/') as $file) { - if ($file->getExtension() != 'php') { - continue; - } - $testName = $file->getBasename('.php'); - $class = 'phpseclib3\\Crypt\\EC\\Curves\\' . $testName; - $reflect = new \ReflectionClass($class); - if ($reflect->isFinal()) { - continue; - } - $candidate = new $class(); - switch ($name) { - case 'Prime': - if (!$candidate instanceof PrimeCurve) { - break; - } - if (!$candidate->getModulo()->equals($curve->getModulo())) { - break; - } - if ($candidate->getA()->toBytes() != $curve->getA()->toBytes()) { - break; - } - if ($candidate->getB()->toBytes() != $curve->getB()->toBytes()) { - break; - } - list($candidateX, $candidateY) = $candidate->getBasePoint(); - list($curveX, $curveY) = $curve->getBasePoint(); - if ($candidateX->toBytes() != $curveX->toBytes()) { - break; - } - if ($candidateY->toBytes() != $curveY->toBytes()) { - break; - } - return $returnArray ? ['namedCurve' => $testName] : ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); - case 'Binary': - if (!$candidate instanceof BinaryCurve) { - break; - } - if ($candidate->getModulo() != $curve->getModulo()) { - break; - } - if ($candidate->getA()->toBytes() != $curve->getA()->toBytes()) { - break; - } - if ($candidate->getB()->toBytes() != $curve->getB()->toBytes()) { - break; - } - list($candidateX, $candidateY) = $candidate->getBasePoint(); - list($curveX, $curveY) = $curve->getBasePoint(); - if ($candidateX->toBytes() != $curveX->toBytes()) { - break; - } - if ($candidateY->toBytes() != $curveY->toBytes()) { - break; - } - return $returnArray ? ['namedCurve' => $testName] : ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); - } - } - } - $order = $curve->getOrder(); - // we could try to calculate the order thusly: - // https://crypto.stackexchange.com/a/27914/4520 - // https://en.wikipedia.org/wiki/Schoof%E2%80%93Elkies%E2%80%93Atkin_algorithm - if (!$order) { - throw new \RuntimeException('Specified Curves need the order to be specified'); - } - $point = $curve->getBasePoint(); - $x = $point[0]->toBytes(); - $y = $point[1]->toBytes(); - if ($curve instanceof PrimeCurve) { - /* - * valid versions are: - * - * ecdpVer1: - * - neither the curve or the base point are generated verifiably randomly. - * ecdpVer2: - * - curve and base point are generated verifiably at random and curve.seed is present - * ecdpVer3: - * - base point is generated verifiably at random but curve is not. curve.seed is present - */ - // other (optional) parameters can be calculated using the methods discused at - // https://crypto.stackexchange.com/q/28947/4520 - $data = ['version' => 'ecdpVer1', 'fieldID' => ['fieldType' => 'prime-field', 'parameters' => $curve->getModulo()], 'curve' => ['a' => $curve->getA()->toBytes(), 'b' => $curve->getB()->toBytes()], 'base' => "\x04" . $x . $y, 'order' => $order]; - return $returnArray ? ['specifiedCurve' => $data] : ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); - } - if ($curve instanceof BinaryCurve) { - $modulo = $curve->getModulo(); - $basis = \count($modulo); - $m = \array_shift($modulo); - \array_pop($modulo); - // the last parameter should always be 0 - //rsort($modulo); - switch ($basis) { - case 3: - $basis = 'tpBasis'; - $modulo = new BigInteger($modulo[0]); - break; - case 5: - $basis = 'ppBasis'; - // these should be in strictly ascending order (hence the commented out rsort above) - $modulo = ['k1' => new BigInteger($modulo[2]), 'k2' => new BigInteger($modulo[1]), 'k3' => new BigInteger($modulo[0])]; - $modulo = ASN1::encodeDER($modulo, Maps\Pentanomial::MAP); - $modulo = new ASN1\Element($modulo); - } - $params = ASN1::encodeDER(['m' => new BigInteger($m), 'basis' => $basis, 'parameters' => $modulo], Maps\Characteristic_two::MAP); - $params = new ASN1\Element($params); - $a = \ltrim($curve->getA()->toBytes(), "\x00"); - if (!\strlen($a)) { - $a = "\x00"; - } - $b = \ltrim($curve->getB()->toBytes(), "\x00"); - if (!\strlen($b)) { - $b = "\x00"; - } - $data = ['version' => 'ecdpVer1', 'fieldID' => ['fieldType' => 'characteristic-two-field', 'parameters' => $params], 'curve' => ['a' => $a, 'b' => $b], 'base' => "\x04" . $x . $y, 'order' => $order]; - return $returnArray ? ['specifiedCurve' => $data] : ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); - } - throw new UnsupportedCurveException('Curve cannot be serialized'); - } - /** - * Use Specified Curve - * - * A specified curve has all the coefficients, the base points, etc, explicitely included. - * A specified curve is a more verbose way of representing a curve - */ - public static function useSpecifiedCurve() - { - self::$useNamedCurves = \false; - } - /** - * Use Named Curve - * - * A named curve does not include any parameters. It is up to the EC parameters to - * know what the coefficients, the base points, etc, are from the name of the curve. - * A named curve is a more concise way of representing a curve - */ - public static function useNamedCurve() - { - self::$useNamedCurves = \true; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php deleted file mode 100644 index 3234598..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php +++ /dev/null @@ -1,155 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\JWK as Progenitor; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Crypt\EC\Curves\secp256k1; -use phpseclib3\Crypt\EC\Curves\secp256r1; -use phpseclib3\Crypt\EC\Curves\secp384r1; -use phpseclib3\Crypt\EC\Curves\secp521r1; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\Math\BigInteger; -/** - * JWK Formatted EC Handler - * - * @author Jim Wigginton - */ -abstract class JWK extends Progenitor -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - switch ($key->kty) { - case 'EC': - switch ($key->crv) { - case 'P-256': - case 'P-384': - case 'P-521': - case 'secp256k1': - break; - default: - throw new UnsupportedCurveException('Only P-256, P-384, P-521 and secp256k1 curves are accepted (' . $key->crv . ' provided)'); - } - break; - case 'OKP': - switch ($key->crv) { - case 'Ed25519': - case 'Ed448': - break; - default: - throw new UnsupportedCurveException('Only Ed25519 and Ed448 curves are accepted (' . $key->crv . ' provided)'); - } - break; - default: - throw new \Exception('Only EC and OKP JWK keys are supported'); - } - $curve = '\\phpseclib3\\Crypt\\EC\\Curves\\' . \str_replace('P-', 'nistp', $key->crv); - $curve = new $curve(); - if ($curve instanceof TwistedEdwardsCurve) { - $QA = self::extractPoint(Strings::base64url_decode($key->x), $curve); - if (!isset($key->d)) { - return \compact('curve', 'QA'); - } - $arr = $curve->extractSecret(Strings::base64url_decode($key->d)); - return \compact('curve', 'QA') + $arr; - } - $QA = [$curve->convertInteger(new BigInteger(Strings::base64url_decode($key->x), 256)), $curve->convertInteger(new BigInteger(Strings::base64url_decode($key->y), 256))]; - if (!$curve->verifyPoint($QA)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - if (!isset($key->d)) { - return \compact('curve', 'QA'); - } - $dA = new BigInteger(Strings::base64url_decode($key->d), 256); - $curve->rangeCheck($dA); - return \compact('curve', 'dA', 'QA'); - } - /** - * Returns the alias that corresponds to a curve - * - * @return string - */ - private static function getAlias(BaseCurve $curve) - { - switch (\true) { - case $curve instanceof secp256r1: - return 'P-256'; - case $curve instanceof secp384r1: - return 'P-384'; - case $curve instanceof secp521r1: - return 'P-521'; - case $curve instanceof secp256k1: - return 'secp256k1'; - } - $reflect = new \ReflectionClass($curve); - $curveName = $reflect->isFinal() ? $reflect->getParentClass()->getShortName() : $reflect->getShortName(); - throw new UnsupportedCurveException("{$curveName} is not a supported curve"); - } - /** - * Return the array superstructure for an EC public key - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return array - */ - private static function savePublicKeyHelper(BaseCurve $curve, array $publicKey) - { - if ($curve instanceof TwistedEdwardsCurve) { - return ['kty' => 'OKP', 'crv' => $curve instanceof Ed25519 ? 'Ed25519' : 'Ed448', 'x' => Strings::base64url_encode($curve->encodePoint($publicKey))]; - } - return ['kty' => 'EC', 'crv' => self::getAlias($curve), 'x' => Strings::base64url_encode($publicKey[0]->toBytes()), 'y' => Strings::base64url_encode($publicKey[1]->toBytes())]; - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - $key = self::savePublicKeyHelper($curve, $publicKey); - return self::wrapKey($key, $options); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\Curves\Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - $key = self::savePublicKeyHelper($curve, $publicKey); - $key['d'] = $curve instanceof TwistedEdwardsCurve ? $secret : $privateKey->toBytes(); - $key['d'] = Strings::base64url_encode($key['d']); - return self::wrapKey($key, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php deleted file mode 100644 index 8f2fb54..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\Curves\Curve25519; -use phpseclib3\Crypt\EC\Curves\Curve448; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\Math\BigInteger; -/** - * Montgomery Curve Private Key Handler - * - * @author Jim Wigginton - */ -abstract class MontgomeryPrivate -{ - /** - * Is invisible flag - * - */ - const IS_INVISIBLE = \true; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - switch (\strlen($key)) { - case 32: - $curve = new Curve25519(); - break; - case 56: - $curve = new Curve448(); - break; - default: - throw new \LengthException('The only supported lengths are 32 and 56'); - } - $components = ['curve' => $curve]; - $components['dA'] = new BigInteger($key, 256); - $curve->rangeCheck($components['dA']); - // note that EC::getEncodedCoordinates does some additional "magic" (it does strrev on the result) - $components['QA'] = $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - return $components; - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Montgomery $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return string - */ - public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) - { - return \strrev($publicKey[0]->toBytes()); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\BaseCurves\Montgomery $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, MontgomeryCurve $curve, array $publicKey, $secret = null, $password = '') - { - if (!empty($password) && \is_string($password)) { - throw new UnsupportedFormatException('MontgomeryPrivate private keys do not support encryption'); - } - return $privateKey->toBytes(); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php deleted file mode 100644 index 0de5f91..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\Curves\Curve25519; -use phpseclib3\Crypt\EC\Curves\Curve448; -use phpseclib3\Math\BigInteger; -/** - * Montgomery Public Key Handler - * - * @author Jim Wigginton - */ -abstract class MontgomeryPublic -{ - /** - * Is invisible flag - * - */ - const IS_INVISIBLE = \true; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - switch (\strlen($key)) { - case 32: - $curve = new Curve25519(); - break; - case 56: - $curve = new Curve448(); - break; - default: - throw new \LengthException('The only supported lengths are 32 and 56'); - } - $components = ['curve' => $curve]; - $components['QA'] = [$components['curve']->convertInteger(new BigInteger(\strrev($key), 256))]; - return $components; - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Montgomery $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return string - */ - public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) - { - return \strrev($publicKey[0]->toBytes()); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php deleted file mode 100644 index d4899b0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,163 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\Math\BigInteger; -/** - * OpenSSH Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH extends Progenitor -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * Supported Key Types - * - * @var array - */ - protected static $types = ['ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'ssh-ed25519']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $parsed = parent::load($key, $password); - if (isset($parsed['paddedKey'])) { - $paddedKey = $parsed['paddedKey']; - list($type) = Strings::unpackSSH2('s', $paddedKey); - if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ({$type} vs {$parsed['type']})"); - } - if ($type == 'ssh-ed25519') { - list(, $key, $comment) = Strings::unpackSSH2('sss', $paddedKey); - $key = \phpseclib3\Crypt\EC\Formats\Keys\libsodium::load($key); - $key['comment'] = $comment; - return $key; - } - list($curveName, $publicKey, $privateKey, $comment) = Strings::unpackSSH2('ssis', $paddedKey); - $curve = self::loadCurveByParam(['namedCurve' => $curveName]); - $curve->rangeCheck($privateKey); - return ['curve' => $curve, 'dA' => $privateKey, 'QA' => self::extractPoint("\x00{$publicKey}", $curve), 'comment' => $comment]; - } - if ($parsed['type'] == 'ssh-ed25519') { - if (Strings::shift($parsed['publicKey'], 4) != "\x00\x00\x00 ") { - throw new \RuntimeException('Length of ssh-ed25519 key should be 32'); - } - $curve = new Ed25519(); - $qa = self::extractPoint($parsed['publicKey'], $curve); - } else { - list($curveName, $publicKey) = Strings::unpackSSH2('ss', $parsed['publicKey']); - $curveName = '\\phpseclib3\\Crypt\\EC\\Curves\\' . $curveName; - $curve = new $curveName(); - $qa = self::extractPoint("\x00" . $publicKey, $curve); - } - return ['curve' => $curve, 'QA' => $qa, 'comment' => $parsed['comment']]; - } - /** - * Returns the alias that corresponds to a curve - * - * @return string - */ - private static function getAlias(BaseCurve $curve) - { - self::initialize_static_variables(); - $reflect = new \ReflectionClass($curve); - $name = $reflect->getShortName(); - $oid = self::$curveOIDs[$name]; - $aliases = \array_filter(self::$curveOIDs, function ($v) use($oid) { - return $v == $oid; - }); - $aliases = \array_keys($aliases); - for ($i = 0; $i < \count($aliases); $i++) { - if (\in_array('ecdsa-sha2-' . $aliases[$i], self::$types)) { - $alias = $aliases[$i]; - break; - } - } - if (!isset($alias)) { - throw new UnsupportedCurveException($name . ' is not a curve that the OpenSSH plugin supports'); - } - return $alias; - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - if ($curve instanceof Ed25519) { - $key = Strings::packSSH2('ss', 'ssh-ed25519', $curve->encodePoint($publicKey)); - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - $key = 'ssh-ed25519 ' . \base64_encode($key) . ' ' . $comment; - return $key; - } - $alias = self::getAlias($curve); - $points = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $key = Strings::packSSH2('sss', 'ecdsa-sha2-' . $alias, $alias, $points); - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - $key = 'ecdsa-sha2-' . $alias . ' ' . \base64_encode($key) . ' ' . $comment; - return $key; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\Curves\Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - if ($curve instanceof Ed25519) { - if (!isset($secret)) { - throw new \RuntimeException('Private Key does not have a secret set'); - } - if (\strlen($secret) != 32) { - throw new \RuntimeException('Private Key secret is not of the correct length'); - } - $pubKey = $curve->encodePoint($publicKey); - $publicKey = Strings::packSSH2('ss', 'ssh-ed25519', $pubKey); - $privateKey = Strings::packSSH2('sss', 'ssh-ed25519', $pubKey, $secret . $pubKey); - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } - $alias = self::getAlias($curve); - $points = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $publicKey = self::savePublicKey($curve, $publicKey, ['binary' => \true]); - $privateKey = Strings::packSSH2('sssi', 'ecdsa-sha2-' . $alias, $alias, $points, $privateKey); - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php deleted file mode 100644 index 0153d38..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * "PKCS1" (RFC5915) Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - self::initialize_static_variables(); - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - if (\strpos($key, 'BEGIN EC PARAMETERS') && \strpos($key, 'BEGIN EC PRIVATE KEY')) { - $components = []; - \preg_match('#-*BEGIN EC PRIVATE KEY-*[^-]*-*END EC PRIVATE KEY-*#s', $key, $matches); - $decoded = parent::load($matches[0], $password); - $decoded = ASN1::decodeBER($decoded); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $ecPrivate = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (!\is_array($ecPrivate)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - if (isset($ecPrivate['parameters'])) { - $components['curve'] = self::loadCurveByParam($ecPrivate['parameters']); - } - \preg_match('#-*BEGIN EC PARAMETERS-*[^-]*-*END EC PARAMETERS-*#s', $key, $matches); - $decoded = parent::load($matches[0], ''); - $decoded = ASN1::decodeBER($decoded); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $ecParams = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (!\is_array($ecParams)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - $ecParams = self::loadCurveByParam($ecParams); - // comparing $ecParams and $components['curve'] directly won't work because they'll have different Math\Common\FiniteField classes - // even if the modulo is the same - if (isset($components['curve']) && self::encodeParameters($ecParams, \false, []) != self::encodeParameters($components['curve'], \false, [])) { - throw new \RuntimeException('EC PARAMETERS does not correspond to EC PRIVATE KEY'); - } - if (!isset($components['curve'])) { - $components['curve'] = $ecParams; - } - $components['dA'] = new BigInteger($ecPrivate['privateKey'], 256); - $components['curve']->rangeCheck($components['dA']); - $components['QA'] = isset($ecPrivate['publicKey']) ? self::extractPoint($ecPrivate['publicKey'], $components['curve']) : $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - return $components; - } - $key = parent::load($key, $password); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $key = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (\is_array($key)) { - return ['curve' => self::loadCurveByParam($key)]; - } - $key = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (!\is_array($key)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - if (!isset($key['parameters'])) { - throw new \RuntimeException('Key cannot be loaded without parameters'); - } - $components = []; - $components['curve'] = self::loadCurveByParam($key['parameters']); - $components['dA'] = new BigInteger($key['privateKey'], 256); - $components['QA'] = isset($ecPrivate['publicKey']) ? self::extractPoint($ecPrivate['publicKey'], $components['curve']) : $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - return $components; - } - /** - * Convert EC parameters to the appropriate format - * - * @return string - */ - public static function saveParameters(BaseCurve $curve, array $options = []) - { - self::initialize_static_variables(); - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('TwistedEdwards and Montgomery Curves are not supported'); - } - $key = self::encodeParameters($curve, \false, $options); - return "-----BEGIN EC PARAMETERS-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END EC PARAMETERS-----\r\n"; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - self::initialize_static_variables(); - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('TwistedEdwards Curves are not supported'); - } - $publicKey = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $key = ['version' => 'ecPrivkeyVer1', 'privateKey' => $privateKey->toBytes(), 'parameters' => new ASN1\Element(self::encodeParameters($curve)), 'publicKey' => "\x00" . $publicKey]; - $key = ASN1::encodeDER($key, Maps\ECPrivateKey::MAP); - return self::wrapPrivateKey($key, 'EC', $password, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php deleted file mode 100644 index db87bb0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,186 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Crypt\EC\Curves\Ed448; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * PKCS#8 Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * OID Name - * - * @var array - */ - const OID_NAME = ['id-ecPublicKey', 'id-Ed25519', 'id-Ed448']; - /** - * OID Value - * - * @var string - */ - const OID_VALUE = ['1.2.840.10045.2.1', '1.3.101.112', '1.3.101.113']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - // initialize_static_variables() is defined in both the trait and the parent class - // when it's defined in two places it's the traits one that's called - // the parent one is needed, as well, but the parent one is called by other methods - // in the parent class as needed and in the context of the parent it's the parent - // one that's called - self::initialize_static_variables(); - $key = parent::load($key, $password); - $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; - switch ($key[$type . 'Algorithm']['algorithm']) { - case 'id-Ed25519': - case 'id-Ed448': - return self::loadEdDSA($key); - } - $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $params = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (!$params) { - throw new \RuntimeException('Unable to decode the parameters using Maps\\ECParameters'); - } - $components = []; - $components['curve'] = self::loadCurveByParam($params); - if ($type == 'publicKey') { - $components['QA'] = self::extractPoint("\x00" . $key['publicKey'], $components['curve']); - return $components; - } - $decoded = ASN1::decodeBER($key['privateKey']); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $key = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (isset($key['parameters']) && $params != $key['parameters']) { - throw new \RuntimeException('The PKCS8 parameter field does not match the private key parameter field'); - } - $components['dA'] = new BigInteger($key['privateKey'], 256); - $components['curve']->rangeCheck($components['dA']); - $components['QA'] = isset($key['publicKey']) ? self::extractPoint($key['publicKey'], $components['curve']) : $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - return $components; - } - /** - * Break a public or private EdDSA key down into its constituent components - * - * @return array - */ - private static function loadEdDSA(array $key) - { - $components = []; - if (isset($key['privateKey'])) { - $components['curve'] = $key['privateKeyAlgorithm']['algorithm'] == 'id-Ed25519' ? new Ed25519() : new Ed448(); - // 0x04 == octet string - // 0x20 == length (32 bytes) - if (\substr($key['privateKey'], 0, 2) != "\x04 ") { - throw new \RuntimeException('The first two bytes of the private key field should be 0x0420'); - } - $arr = $components['curve']->extractSecret(\substr($key['privateKey'], 2)); - $components['dA'] = $arr['dA']; - $components['secret'] = $arr['secret']; - } - if (isset($key['publicKey'])) { - if (!isset($components['curve'])) { - $components['curve'] = $key['publicKeyAlgorithm']['algorithm'] == 'id-Ed25519' ? new Ed25519() : new Ed448(); - } - $components['QA'] = self::extractPoint($key['publicKey'], $components['curve']); - } - if (isset($key['privateKey']) && !isset($components['QA'])) { - $components['QA'] = $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - } - return $components; - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - self::initialize_static_variables(); - if ($curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('Montgomery Curves are not supported'); - } - if ($curve instanceof TwistedEdwardsCurve) { - return self::wrapPublicKey($curve->encodePoint($publicKey), null, $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448'); - } - $params = new ASN1\Element(self::encodeParameters($curve, \false, $options)); - $key = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - return self::wrapPublicKey($key, $params, 'id-ecPublicKey'); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - self::initialize_static_variables(); - if ($curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('Montgomery Curves are not supported'); - } - if ($curve instanceof TwistedEdwardsCurve) { - return self::wrapPrivateKey("\x04 " . $secret, [], null, $password, $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448'); - } - $publicKey = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $params = new ASN1\Element(self::encodeParameters($curve, \false, $options)); - $key = [ - 'version' => 'ecPrivkeyVer1', - 'privateKey' => $privateKey->toBytes(), - //'parameters' => $params, - 'publicKey' => "\x00" . $publicKey, - ]; - $key = ASN1::encodeDER($key, Maps\ECPrivateKey::MAP); - return self::wrapPrivateKey($key, [], $params, $password, 'id-ecPublicKey', '', $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php deleted file mode 100644 index 48c49cb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Math\BigInteger; -/** - * PuTTY Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY extends Progenitor -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * Public Handler - * - * @var string - */ - const PUBLIC_HANDLER = 'phpseclib3\\Crypt\\EC\\Formats\\Keys\\OpenSSH'; - /** - * Supported Key Types - * - * @var array - */ - protected static $types = ['ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'ssh-ed25519']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $components = parent::load($key, $password); - if (!isset($components['private'])) { - return $components; - } - $private = $components['private']; - $temp = Strings::base64_encode(Strings::packSSH2('s', $components['type']) . $components['public']); - $components = \phpseclib3\Crypt\EC\Formats\Keys\OpenSSH::load($components['type'] . ' ' . $temp . ' ' . $components['comment']); - if ($components['curve'] instanceof TwistedEdwardsCurve) { - if (Strings::shift($private, 4) != "\x00\x00\x00 ") { - throw new \RuntimeException('Length of ssh-ed25519 key should be 32'); - } - $arr = $components['curve']->extractSecret($private); - $components['dA'] = $arr['dA']; - $components['secret'] = $arr['secret']; - } else { - list($components['dA']) = Strings::unpackSSH2('i', $private); - $components['curve']->rangeCheck($components['dA']); - } - return $components; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = \false, array $options = []) - { - self::initialize_static_variables(); - $public = \explode(' ', \phpseclib3\Crypt\EC\Formats\Keys\OpenSSH::savePublicKey($curve, $publicKey)); - $name = $public[0]; - $public = Strings::base64_decode($public[1]); - list(, $length) = \unpack('N', Strings::shift($public, 4)); - Strings::shift($public, $length); - // PuTTY pads private keys with a null byte per the following: - // https://github.com/github/putty/blob/a3d14d77f566a41fc61dfdc5c2e0e384c9e6ae8b/sshecc.c#L1926 - if (!$curve instanceof TwistedEdwardsCurve) { - $private = $privateKey->toBytes(); - if (!(\strlen($privateKey->toBits()) & 7)) { - $private = "\x00{$private}"; - } - } - $private = $curve instanceof TwistedEdwardsCurve ? Strings::packSSH2('s', $secret) : Strings::packSSH2('s', $private); - return self::wrapPrivateKey($public, $private, $name, $password, $options); - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField[] $publicKey - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey) - { - $public = \explode(' ', \phpseclib3\Crypt\EC\Formats\Keys\OpenSSH::savePublicKey($curve, $publicKey)); - $type = $public[0]; - $public = Strings::base64_decode($public[1]); - list(, $length) = \unpack('N', Strings::shift($public, 4)); - Strings::shift($public, $length); - return self::wrapPublicKey($public, $type); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php deleted file mode 100644 index 6f28a23..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php +++ /dev/null @@ -1,373 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\BaseCurves\Prime as PrimeCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Exception\BadConfigurationException; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\Math\BigInteger; -/** - * XML Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class XML -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * Default namespace - * - * @var string - */ - private static $namespace; - /** - * Flag for using RFC4050 syntax - * - * @var bool - */ - private static $rfc4050 = \false; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - self::initialize_static_variables(); - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - if (!\class_exists('DOMDocument')) { - throw new BadConfigurationException('The dom extension is not setup correctly on this system'); - } - $use_errors = \libxml_use_internal_errors(\true); - $temp = self::isolateNamespace($key, 'http://www.w3.org/2009/xmldsig11#'); - if ($temp) { - $key = $temp; - } - $temp = self::isolateNamespace($key, 'http://www.w3.org/2001/04/xmldsig-more#'); - if ($temp) { - $key = $temp; - } - $dom = new \DOMDocument(); - if (\substr($key, 0, 5) != '' . $key . ''; - } - if (!$dom->loadXML($key)) { - \libxml_use_internal_errors($use_errors); - throw new \UnexpectedValueException('Key does not appear to contain XML'); - } - $xpath = new \DOMXPath($dom); - \libxml_use_internal_errors($use_errors); - $curve = self::loadCurveByParam($xpath); - $pubkey = self::query($xpath, 'publickey', 'Public Key is not present'); - $QA = self::query($xpath, 'ecdsakeyvalue')->length ? self::extractPointRFC4050($xpath, $curve) : self::extractPoint("\x00" . $pubkey, $curve); - \libxml_use_internal_errors($use_errors); - return \compact('curve', 'QA'); - } - /** - * Case-insensitive xpath query - * - * @param \DOMXPath $xpath - * @param string $name - * @param string $error optional - * @param bool $decode optional - * @return \DOMNodeList - */ - private static function query(\DOMXPath $xpath, $name, $error = null, $decode = \true) - { - $query = '/'; - $names = \explode('/', $name); - foreach ($names as $name) { - $query .= "/*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{$name}']"; - } - $result = $xpath->query($query); - if (!isset($error)) { - return $result; - } - if (!$result->length) { - throw new \RuntimeException($error); - } - return $decode ? self::decodeValue($result->item(0)->textContent) : $result->item(0)->textContent; - } - /** - * Finds the first element in the relevant namespace, strips the namespacing and returns the XML for that element. - * - * @param string $xml - * @param string $ns - */ - private static function isolateNamespace($xml, $ns) - { - $dom = new \DOMDocument(); - if (!$dom->loadXML($xml)) { - return \false; - } - $xpath = new \DOMXPath($dom); - $nodes = $xpath->query("//*[namespace::*[.='{$ns}'] and not(../namespace::*[.='{$ns}'])]"); - if (!$nodes->length) { - return \false; - } - $node = $nodes->item(0); - $ns_name = $node->lookupPrefix($ns); - if ($ns_name) { - $node->removeAttributeNS($ns, $ns_name); - } - return $dom->saveXML($node); - } - /** - * Decodes the value - * - * @param string $value - */ - private static function decodeValue($value) - { - return Strings::base64_decode(\str_replace(["\r", "\n", ' ', "\t"], '', $value)); - } - /** - * Extract points from an XML document - * - * @param \DOMXPath $xpath - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @return object[] - */ - private static function extractPointRFC4050(\DOMXPath $xpath, BaseCurve $curve) - { - $x = self::query($xpath, 'publickey/x'); - $y = self::query($xpath, 'publickey/y'); - if (!$x->length || !$x->item(0)->hasAttribute('Value')) { - throw new \RuntimeException('Public Key / X coordinate not found'); - } - if (!$y->length || !$y->item(0)->hasAttribute('Value')) { - throw new \RuntimeException('Public Key / Y coordinate not found'); - } - $point = [$curve->convertInteger(new BigInteger($x->item(0)->getAttribute('Value'))), $curve->convertInteger(new BigInteger($y->item(0)->getAttribute('Value')))]; - if (!$curve->verifyPoint($point)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - return $point; - } - /** - * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based - * on the curve parameters - * - * @param \DomXPath $xpath - * @return \phpseclib3\Crypt\EC\BaseCurves\Base|false - */ - private static function loadCurveByParam(\DOMXPath $xpath) - { - $namedCurve = self::query($xpath, 'namedcurve'); - if ($namedCurve->length == 1) { - $oid = $namedCurve->item(0)->getAttribute('URN'); - $oid = \preg_replace('#[^\\d.]#', '', $oid); - $name = \array_search($oid, self::$curveOIDs); - if ($name === \false) { - throw new UnsupportedCurveException('Curve with OID of ' . $oid . ' is not supported'); - } - $curve = '\\phpseclib3\\Crypt\\EC\\Curves\\' . $name; - if (!\class_exists($curve)) { - throw new UnsupportedCurveException('Named Curve of ' . $name . ' is not supported'); - } - return new $curve(); - } - $params = self::query($xpath, 'explicitparams'); - if ($params->length) { - return self::loadCurveByParamRFC4050($xpath); - } - $params = self::query($xpath, 'ecparameters'); - if (!$params->length) { - throw new \RuntimeException('No parameters are present'); - } - $fieldTypes = ['prime-field' => ['fieldid/prime/p'], 'gnb' => ['fieldid/gnb/m'], 'tnb' => ['fieldid/tnb/k'], 'pnb' => ['fieldid/pnb/k1', 'fieldid/pnb/k2', 'fieldid/pnb/k3'], 'unknown' => []]; - foreach ($fieldTypes as $type => $queries) { - foreach ($queries as $query) { - $result = self::query($xpath, $query); - if (!$result->length) { - continue 2; - } - $param = \preg_replace('#.*/#', '', $query); - ${$param} = self::decodeValue($result->item(0)->textContent); - } - break; - } - $a = self::query($xpath, 'curve/a', 'A coefficient is not present'); - $b = self::query($xpath, 'curve/b', 'B coefficient is not present'); - $base = self::query($xpath, 'base', 'Base point is not present'); - $order = self::query($xpath, 'order', 'Order is not present'); - switch ($type) { - case 'prime-field': - $curve = new PrimeCurve(); - $curve->setModulo(new BigInteger($p, 256)); - $curve->setCoefficients(new BigInteger($a, 256), new BigInteger($b, 256)); - $point = self::extractPoint("\x00" . $base, $curve); - $curve->setBasePoint(...$point); - $curve->setOrder(new BigInteger($order, 256)); - return $curve; - case 'gnb': - case 'tnb': - case 'pnb': - default: - throw new UnsupportedCurveException('Field Type of ' . $type . ' is not supported'); - } - } - /** - * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based - * on the curve parameters - * - * @param \DomXPath $xpath - * @return \phpseclib3\Crypt\EC\BaseCurves\Base|false - */ - private static function loadCurveByParamRFC4050(\DOMXPath $xpath) - { - $fieldTypes = ['prime-field' => ['primefieldparamstype/p'], 'unknown' => []]; - foreach ($fieldTypes as $type => $queries) { - foreach ($queries as $query) { - $result = self::query($xpath, $query); - if (!$result->length) { - continue 2; - } - $param = \preg_replace('#.*/#', '', $query); - ${$param} = $result->item(0)->textContent; - } - break; - } - $a = self::query($xpath, 'curveparamstype/a', 'A coefficient is not present', \false); - $b = self::query($xpath, 'curveparamstype/b', 'B coefficient is not present', \false); - $x = self::query($xpath, 'basepointparams/basepoint/ecpointtype/x', 'Base Point X is not present', \false); - $y = self::query($xpath, 'basepointparams/basepoint/ecpointtype/y', 'Base Point Y is not present', \false); - $order = self::query($xpath, 'order', 'Order is not present', \false); - switch ($type) { - case 'prime-field': - $curve = new PrimeCurve(); - $p = \str_replace(["\r", "\n", ' ', "\t"], '', $p); - $curve->setModulo(new BigInteger($p)); - $a = \str_replace(["\r", "\n", ' ', "\t"], '', $a); - $b = \str_replace(["\r", "\n", ' ', "\t"], '', $b); - $curve->setCoefficients(new BigInteger($a), new BigInteger($b)); - $x = \str_replace(["\r", "\n", ' ', "\t"], '', $x); - $y = \str_replace(["\r", "\n", ' ', "\t"], '', $y); - $curve->setBasePoint(new BigInteger($x), new BigInteger($y)); - $order = \str_replace(["\r", "\n", ' ', "\t"], '', $order); - $curve->setOrder(new BigInteger($order)); - return $curve; - default: - throw new UnsupportedCurveException('Field Type of ' . $type . ' is not supported'); - } - } - /** - * Sets the namespace. dsig11 is the most common one. - * - * Set to null to unset. Used only for creating public keys. - * - * @param string $namespace - */ - public static function setNamespace($namespace) - { - self::$namespace = $namespace; - } - /** - * Uses the XML syntax specified in https://tools.ietf.org/html/rfc4050 - */ - public static function enableRFC4050Syntax() - { - self::$rfc4050 = \true; - } - /** - * Uses the XML syntax specified in https://www.w3.org/TR/xmldsig-core/#sec-ECParameters - */ - public static function disableRFC4050Syntax() - { - self::$rfc4050 = \false; - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - self::initialize_static_variables(); - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('TwistedEdwards and Montgomery Curves are not supported'); - } - if (empty(static::$namespace)) { - $pre = $post = ''; - } else { - $pre = static::$namespace . ':'; - $post = ':' . static::$namespace; - } - if (self::$rfc4050) { - return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2001/04/xmldsig-more#">' . "\r\n" . self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . '<' . $pre . 'PublicKey>' . "\r\n" . '<' . $pre . 'X Value="' . $publicKey[0] . '" />' . "\r\n" . '<' . $pre . 'Y Value="' . $publicKey[1] . '" />' . "\r\n" . '' . "\r\n" . ''; - } - $publicKey = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2009/xmldsig11#">' . "\r\n" . self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . '<' . $pre . 'PublicKey>' . Strings::base64_encode($publicKey) . '' . "\r\n" . ''; - } - /** - * Encode Parameters - * - * @param \phpseclib3\Crypt\EC\BaseCurves\Base $curve - * @param string $pre - * @param array $options optional - * @return string|false - */ - private static function encodeXMLParameters(BaseCurve $curve, $pre, array $options = []) - { - $result = self::encodeParameters($curve, \true, $options); - if (isset($result['namedCurve'])) { - $namedCurve = '<' . $pre . 'NamedCurve URI="urn:oid:' . self::$curveOIDs[$result['namedCurve']] . '" />'; - return self::$rfc4050 ? '' . \str_replace('URI', 'URN', $namedCurve) . '' : $namedCurve; - } - if (self::$rfc4050) { - $xml = '<' . $pre . 'ExplicitParams>' . "\r\n" . '<' . $pre . 'FieldParams>' . "\r\n"; - $temp = $result['specifiedCurve']; - switch ($temp['fieldID']['fieldType']) { - case 'prime-field': - $xml .= '<' . $pre . 'PrimeFieldParamsType>' . "\r\n" . '<' . $pre . 'P>' . $temp['fieldID']['parameters'] . '' . "\r\n" . '' . "\r\n"; - $a = $curve->getA(); - $b = $curve->getB(); - list($x, $y) = $curve->getBasePoint(); - break; - default: - throw new UnsupportedCurveException('Field Type of ' . $temp['fieldID']['fieldType'] . ' is not supported'); - } - $xml .= '' . "\r\n" . '<' . $pre . 'CurveParamsType>' . "\r\n" . '<' . $pre . 'A>' . $a . '' . "\r\n" . '<' . $pre . 'B>' . $b . '' . "\r\n" . '' . "\r\n" . '<' . $pre . 'BasePointParams>' . "\r\n" . '<' . $pre . 'BasePoint>' . "\r\n" . '<' . $pre . 'ECPointType>' . "\r\n" . '<' . $pre . 'X>' . $x . '' . "\r\n" . '<' . $pre . 'Y>' . $y . '' . "\r\n" . '' . "\r\n" . '' . "\r\n" . '<' . $pre . 'Order>' . $curve->getOrder() . '' . "\r\n" . '' . "\r\n" . '' . "\r\n"; - return $xml; - } - if (isset($result['specifiedCurve'])) { - $xml = '<' . $pre . 'ECParameters>' . "\r\n" . '<' . $pre . 'FieldID>' . "\r\n"; - $temp = $result['specifiedCurve']; - switch ($temp['fieldID']['fieldType']) { - case 'prime-field': - $xml .= '<' . $pre . 'Prime>' . "\r\n" . '<' . $pre . 'P>' . Strings::base64_encode($temp['fieldID']['parameters']->toBytes()) . '' . "\r\n" . '' . "\r\n"; - break; - default: - throw new UnsupportedCurveException('Field Type of ' . $temp['fieldID']['fieldType'] . ' is not supported'); - } - $xml .= '' . "\r\n" . '<' . $pre . 'Curve>' . "\r\n" . '<' . $pre . 'A>' . Strings::base64_encode($temp['curve']['a']) . '' . "\r\n" . '<' . $pre . 'B>' . Strings::base64_encode($temp['curve']['b']) . '' . "\r\n" . '' . "\r\n" . '<' . $pre . 'Base>' . Strings::base64_encode($temp['base']) . '' . "\r\n" . '<' . $pre . 'Order>' . Strings::base64_encode($temp['order']) . '' . "\r\n" . ''; - return $xml; - } - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php deleted file mode 100644 index c138fee..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Keys; - -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\Math\BigInteger; -/** - * libsodium Key Handler - * - * @author Jim Wigginton - */ -abstract class libsodium -{ - use \phpseclib3\Crypt\EC\Formats\Keys\Common; - /** - * Is invisible flag - * - */ - const IS_INVISIBLE = \true; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - switch (\strlen($key)) { - case 32: - $public = $key; - break; - case 64: - $private = \substr($key, 0, 32); - $public = \substr($key, -32); - break; - case 96: - $public = \substr($key, -32); - if (\substr($key, 32, 32) != $public) { - throw new \RuntimeException('Keys with 96 bytes should have the 2nd and 3rd set of 32 bytes match'); - } - $private = \substr($key, 0, 32); - break; - default: - throw new \RuntimeException('libsodium keys need to either be 32 bytes long, 64 bytes long or 96 bytes long'); - } - $curve = new Ed25519(); - $components = ['curve' => $curve]; - if (isset($private)) { - $arr = $curve->extractSecret($private); - $components['dA'] = $arr['dA']; - $components['secret'] = $arr['secret']; - } - $components['QA'] = isset($public) ? self::extractPoint($public, $curve) : $curve->multiplyPoint($curve->getBasePoint(), $components['dA']); - return $components; - } - /** - * Convert an EC public key to the appropriate format - * - * @param \phpseclib3\Crypt\EC\Curves\Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return string - */ - public static function savePublicKey(Ed25519 $curve, array $publicKey) - { - return $curve->encodePoint($publicKey); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $privateKey - * @param \phpseclib3\Crypt\EC\Curves\Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, Ed25519 $curve, array $publicKey, $secret = null, $password = '') - { - if (!isset($secret)) { - throw new \RuntimeException('Private Key does not have a secret set'); - } - if (\strlen($secret) != 32) { - throw new \RuntimeException('Private Key secret is not of the correct length'); - } - if (!empty($password) && \is_string($password)) { - throw new UnsupportedFormatException('libsodium private keys do not support encryption'); - } - return $secret . $curve->encodePoint($publicKey); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php deleted file mode 100644 index 12e55bc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Signature; - -use phpseclib3\File\ASN1 as Encoder; -use phpseclib3\File\ASN1\Maps\EcdsaSigValue; -use phpseclib3\Math\BigInteger; -/** - * ASN1 Signature Handler - * - * @author Jim Wigginton - */ -abstract class ASN1 -{ - /** - * Loads a signature - * - * @param string $sig - * @return array - */ - public static function load($sig) - { - if (!\is_string($sig)) { - return \false; - } - $decoded = Encoder::decodeBER($sig); - if (empty($decoded)) { - return \false; - } - $components = Encoder::asn1map($decoded[0], EcdsaSigValue::MAP); - return $components; - } - /** - * Returns a signature in the appropriate format - * - * @param \phpseclib3\Math\BigInteger $r - * @param \phpseclib3\Math\BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - return Encoder::encodeDER(\compact('r', 's'), EcdsaSigValue::MAP); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php deleted file mode 100644 index 172686a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Signature; - -use phpseclib3\Crypt\Common\Formats\Signature\Raw as Progenitor; -/** - * Raw DSA Signature Handler - * - * @author Jim Wigginton - */ -abstract class Raw extends Progenitor -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php deleted file mode 100644 index 18ed3d9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC\Formats\Signature; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Math\BigInteger; -/** - * SSH2 Signature Handler - * - * @author Jim Wigginton - */ -abstract class SSH2 -{ - /** - * Loads a signature - * - * @param string $sig - * @return mixed - */ - public static function load($sig) - { - if (!\is_string($sig)) { - return \false; - } - $result = Strings::unpackSSH2('ss', $sig); - if ($result === \false) { - return \false; - } - list($type, $blob) = $result; - switch ($type) { - // see https://tools.ietf.org/html/rfc5656#section-3.1.2 - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - case 'ecdsa-sha2-nistp521': - break; - default: - return \false; - } - $result = Strings::unpackSSH2('ii', $blob); - if ($result === \false) { - return \false; - } - return ['r' => $result[0], 's' => $result[1]]; - } - /** - * Returns a signature in the appropriate format - * - * @param \phpseclib3\Math\BigInteger $r - * @param \phpseclib3\Math\BigInteger $s - * @param string $curve - * @return string - */ - public static function save(BigInteger $r, BigInteger $s, $curve) - { - switch ($curve) { - case 'secp256r1': - $curve = 'nistp256'; - break; - case 'secp384r1': - $curve = 'nistp384'; - break; - case 'secp521r1': - $curve = 'nistp521'; - break; - default: - return \false; - } - $blob = Strings::packSSH2('ii', $r, $s); - return Strings::packSSH2('ss', 'ecdsa-sha2-' . $curve, $blob); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php deleted file mode 100644 index 7b6e25f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC; - -use phpseclib3\Crypt\EC; -/** - * EC Parameters - * - * @author Jim Wigginton - */ -final class Parameters extends EC -{ - /** - * Returns the parameters - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type = 'PKCS1', array $options = []) - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - return $type::saveParameters($this->curve, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php deleted file mode 100644 index c668cde..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php +++ /dev/null @@ -1,226 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\EC; -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Crypt\EC\Curves\Curve25519; -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Crypt\EC\Formats\Keys\PKCS1; -use phpseclib3\Crypt\EC\Formats\Signature\ASN1 as ASN1Signature; -use phpseclib3\Crypt\Hash; -use phpseclib3\Exception\UnsupportedOperationException; -use phpseclib3\Math\BigInteger; -/** - * EC Private Key - * - * @author Jim Wigginton - */ -final class PrivateKey extends EC implements Common\PrivateKey -{ - use Common\Traits\PasswordProtected; - /** - * Private Key dA - * - * sign() converts this to a BigInteger so one might wonder why this is a FiniteFieldInteger instead of - * a BigInteger. That's because a FiniteFieldInteger, when converted to a byte string, is null padded by - * a certain amount whereas a BigInteger isn't. - * - * @var object - */ - protected $dA; - /** - * @var string - */ - protected $secret; - /** - * Multiplies an encoded point by the private key - * - * Used by ECDH - * - * @param string $coordinates - * @return string - */ - public function multiply($coordinates) - { - if ($this->curve instanceof MontgomeryCurve) { - if ($this->curve instanceof Curve25519 && self::$engines['libsodium']) { - return \sodium_crypto_scalarmult($this->dA->toBytes(), $coordinates); - } - $point = [$this->curve->convertInteger(new BigInteger(\strrev($coordinates), 256))]; - $point = $this->curve->multiplyPoint($point, $this->dA); - return \strrev($point[0]->toBytes(\true)); - } - if (!$this->curve instanceof TwistedEdwardsCurve) { - $coordinates = "\x00{$coordinates}"; - } - $point = PKCS1::extractPoint($coordinates, $this->curve); - $point = $this->curve->multiplyPoint($point, $this->dA); - if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve->encodePoint($point); - } - if (empty($point)) { - throw new \RuntimeException('The infinity point is invalid'); - } - return "\x04" . $point[0]->toBytes(\true) . $point[1]->toBytes(\true); - } - /** - * Create a signature - * - * @see self::verify() - * @param string $message - * @return mixed - */ - public function sign($message) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - $dA = $this->dA; - $order = $this->curve->getOrder(); - $shortFormat = $this->shortFormat; - $format = $this->sigFormat; - if ($format === \false) { - return \false; - } - if ($this->curve instanceof TwistedEdwardsCurve) { - if ($this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context)) { - $result = \sodium_crypto_sign_detached($message, $this->withPassword()->toString('libsodium')); - return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . \strtolower($this->getCurve()), $result) : $result; - } - // contexts (Ed25519ctx) are supported but prehashing (Ed25519ph) is not. - // quoting https://tools.ietf.org/html/rfc8032#section-8.5 , - // "The Ed25519ph and Ed448ph variants ... SHOULD NOT be used" - $A = $this->curve->encodePoint($this->QA); - $curve = $this->curve; - $hash = new Hash($curve::HASH); - $secret = \substr($hash->hash($this->secret), $curve::SIZE); - if ($curve instanceof Ed25519) { - $dom = !isset($this->context) ? '' : 'SigEd25519 no Ed25519 collisions' . "\x00" . \chr(\strlen($this->context)) . $this->context; - } else { - $context = isset($this->context) ? $this->context : ''; - $dom = 'SigEd448' . "\x00" . \chr(\strlen($context)) . $context; - } - // SHA-512(dom2(F, C) || prefix || PH(M)) - $r = $hash->hash($dom . $secret . $message); - $r = \strrev($r); - $r = new BigInteger($r, 256); - list(, $r) = $r->divide($order); - $R = $curve->multiplyPoint($curve->getBasePoint(), $r); - $R = $curve->encodePoint($R); - $k = $hash->hash($dom . $R . $A . $message); - $k = \strrev($k); - $k = new BigInteger($k, 256); - list(, $k) = $k->divide($order); - $S = $k->multiply($dA)->add($r); - list(, $S) = $S->divide($order); - $S = \str_pad(\strrev($S->toBytes()), $curve::SIZE, "\x00"); - return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . \strtolower($this->getCurve()), $R . $S) : $R . $S; - } - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { - $signature = ''; - // altho PHP's OpenSSL bindings only supported EC key creation in PHP 7.1 they've long - // supported signing / verification - // we use specified curves to avoid issues with OpenSSL possibly not supporting a given named curve; - // doing this may mean some curve-specific optimizations can't be used but idk if OpenSSL even - // has curve-specific optimizations - $result = \openssl_sign($message, $signature, $this->toString('PKCS8', ['namedCurve' => \false]), $this->hash->getHash()); - if ($result) { - if ($shortFormat == 'ASN1') { - return $signature; - } - \extract(ASN1Signature::load($signature)); - return $shortFormat == 'SSH2' ? $format::save($r, $s, $this->getCurve()) : $format::save($r, $s); - } - } - $e = $this->hash->hash($message); - $e = new BigInteger($e, 256); - $Ln = $this->hash->getLength() - $order->getLength(); - $z = $Ln > 0 ? $e->bitwise_rightShift($Ln) : $e; - while (\true) { - $k = BigInteger::randomRange(self::$one, $order->subtract(self::$one)); - list($x, $y) = $this->curve->multiplyPoint($this->curve->getBasePoint(), $k); - $x = $x->toBigInteger(); - list(, $r) = $x->divide($order); - if ($r->equals(self::$zero)) { - continue; - } - $kinv = $k->modInverse($order); - $temp = $z->add($dA->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($order); - if (!$s->equals(self::$zero)) { - break; - } - } - // the following is an RFC6979 compliant implementation of deterministic ECDSA - // it's unused because it's mainly intended for use when a good CSPRNG isn't - // available. if phpseclib's CSPRNG isn't good then even key generation is - // suspect - /* - // if this were actually being used it'd probably be better if this lived in load() and createKey() - $this->q = $this->curve->getOrder(); - $dA = $this->dA->toBigInteger(); - $this->x = $dA; - - $h1 = $this->hash->hash($message); - $k = $this->computek($h1); - list($x, $y) = $this->curve->multiplyPoint($this->curve->getBasePoint(), $k); - $x = $x->toBigInteger(); - list(, $r) = $x->divide($this->q); - $kinv = $k->modInverse($this->q); - $h1 = $this->bits2int($h1); - $temp = $h1->add($dA->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($this->q); - */ - return $shortFormat == 'SSH2' ? $format::save($r, $s, $this->getCurve()) : $format::save($r, $s); - } - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); - return $type::savePrivateKey($this->dA, $this->curve, $this->QA, $this->secret, $this->password, $options); - } - /** - * Returns the public key - * - * @see self::getPrivateKey() - * @return mixed - */ - public function getPublicKey() - { - $format = 'PKCS8'; - if ($this->curve instanceof MontgomeryCurve) { - $format = 'MontgomeryPublic'; - } - $type = self::validatePlugin('Keys', $format, 'savePublicKey'); - $key = $type::savePublicKey($this->curve, $this->QA); - $key = EC::loadFormat($format, $key); - if ($this->curve instanceof MontgomeryCurve) { - return $key; - } - $key = $key->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); - if ($this->curve instanceof TwistedEdwardsCurve) { - $key = $key->withContext($this->context); - } - return $key; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php deleted file mode 100644 index 0a24a2d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\EC; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\EC; -use phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use phpseclib3\Crypt\EC\Curves\Ed25519; -use phpseclib3\Crypt\EC\Formats\Keys\PKCS1; -use phpseclib3\Crypt\EC\Formats\Signature\ASN1 as ASN1Signature; -use phpseclib3\Crypt\Hash; -use phpseclib3\Exception\UnsupportedOperationException; -use phpseclib3\Math\BigInteger; -/** - * EC Public Key - * - * @author Jim Wigginton - */ -final class PublicKey extends EC implements Common\PublicKey -{ - use Common\Traits\Fingerprint; - /** - * Verify a signature - * - * @see self::verify() - * @param string $message - * @param string $signature - * @return mixed - */ - public function verify($message, $signature) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - $shortFormat = $this->shortFormat; - $format = $this->sigFormat; - if ($format === \false) { - return \false; - } - $order = $this->curve->getOrder(); - if ($this->curve instanceof TwistedEdwardsCurve) { - if ($shortFormat == 'SSH2') { - list(, $signature) = Strings::unpackSSH2('ss', $signature); - } - if ($this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context)) { - return \sodium_crypto_sign_verify_detached($signature, $message, $this->toString('libsodium')); - } - $curve = $this->curve; - if (\strlen($signature) != 2 * $curve::SIZE) { - return \false; - } - $R = \substr($signature, 0, $curve::SIZE); - $S = \substr($signature, $curve::SIZE); - try { - $R = PKCS1::extractPoint($R, $curve); - $R = $this->curve->convertToInternal($R); - } catch (\Exception $e) { - return \false; - } - $S = \strrev($S); - $S = new BigInteger($S, 256); - if ($S->compare($order) >= 0) { - return \false; - } - $A = $curve->encodePoint($this->QA); - if ($curve instanceof Ed25519) { - $dom2 = !isset($this->context) ? '' : 'SigEd25519 no Ed25519 collisions' . "\x00" . \chr(\strlen($this->context)) . $this->context; - } else { - $context = isset($this->context) ? $this->context : ''; - $dom2 = 'SigEd448' . "\x00" . \chr(\strlen($context)) . $context; - } - $hash = new Hash($curve::HASH); - $k = $hash->hash($dom2 . \substr($signature, 0, $curve::SIZE) . $A . $message); - $k = \strrev($k); - $k = new BigInteger($k, 256); - list(, $k) = $k->divide($order); - $qa = $curve->convertToInternal($this->QA); - $lhs = $curve->multiplyPoint($curve->getBasePoint(), $S); - $rhs = $curve->multiplyPoint($qa, $k); - $rhs = $curve->addPoint($rhs, $R); - $rhs = $curve->convertToAffine($rhs); - return $lhs[0]->equals($rhs[0]) && $lhs[1]->equals($rhs[1]); - } - $params = $format::load($signature); - if ($params === \false || \count($params) != 2) { - return \false; - } - \extract($params); - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { - $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature; - $result = \openssl_verify($message, $sig, $this->toString('PKCS8', ['namedCurve' => \false]), $this->hash->getHash()); - if ($result != -1) { - return (bool) $result; - } - } - $n_1 = $order->subtract(self::$one); - if (!$r->between(self::$one, $n_1) || !$s->between(self::$one, $n_1)) { - return \false; - } - $e = $this->hash->hash($message); - $e = new BigInteger($e, 256); - $Ln = $this->hash->getLength() - $order->getLength(); - $z = $Ln > 0 ? $e->bitwise_rightShift($Ln) : $e; - $w = $s->modInverse($order); - list(, $u1) = $z->multiply($w)->divide($order); - list(, $u2) = $r->multiply($w)->divide($order); - $u1 = $this->curve->convertInteger($u1); - $u2 = $this->curve->convertInteger($u2); - list($x1, $y1) = $this->curve->multiplyAddPoints([$this->curve->getBasePoint(), $this->QA], [$u1, $u2]); - $x1 = $x1->toBigInteger(); - list(, $x1) = $x1->divide($order); - return $x1->equals($r); - } - /** - * Returns the public key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - return $type::savePublicKey($this->curve, $this->QA, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Hash.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Hash.php deleted file mode 100644 index f08dca4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Hash.php +++ /dev/null @@ -1,1134 +0,0 @@ - - * setKey('abcdefg'); - * - * echo base64_encode($hash->hash('abcdefg')); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2015 Jim Wigginton - * @author Andreas Fischer - * @copyright 2015 Andreas Fischer - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\InsufficientSetupException; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\PrimeField; -/** - * @author Jim Wigginton - * @author Andreas Fischer - */ -class Hash -{ - /** - * Padding Types - * - */ - const PADDING_KECCAK = 1; - /** - * Padding Types - * - */ - const PADDING_SHA3 = 2; - /** - * Padding Types - * - */ - const PADDING_SHAKE = 3; - /** - * Padding Type - * - * Only used by SHA3 - * - * @var int - */ - private $paddingType = 0; - /** - * Hash Parameter - * - * @see self::setHash() - * @var int - */ - private $hashParam; - /** - * Byte-length of hash output (Internal HMAC) - * - * @see self::setHash() - * @var int - */ - private $length; - /** - * Hash Algorithm - * - * @see self::setHash() - * @var string - */ - private $algo; - /** - * Key - * - * @see self::setKey() - * @var string - */ - private $key = \false; - /** - * Nonce - * - * @see self::setNonce() - * @var string - */ - private $nonce = \false; - /** - * Hash Parameters - * - * @var array - */ - private $parameters = []; - /** - * Computed Key - * - * @see self::_computeKey() - * @var string - */ - private $computedKey = \false; - /** - * Outer XOR (Internal HMAC) - * - * Used only for sha512/* - * - * @see self::hash() - * @var string - */ - private $opad; - /** - * Inner XOR (Internal HMAC) - * - * Used only for sha512/* - * - * @see self::hash() - * @var string - */ - private $ipad; - /** - * Recompute AES Key - * - * Used only for umac - * - * @see self::hash() - * @var boolean - */ - private $recomputeAESKey; - /** - * umac cipher object - * - * @see self::hash() - * @var \phpseclib3\Crypt\AES - */ - private $c; - /** - * umac pad - * - * @see self::hash() - * @var string - */ - private $pad; - /** - * Block Size - * - * @var int - */ - private $blockSize; - /**#@+ - * UMAC variables - * - * @var PrimeField - */ - private static $factory36; - private static $factory64; - private static $factory128; - private static $offset64; - private static $offset128; - private static $marker64; - private static $marker128; - private static $maxwordrange64; - private static $maxwordrange128; - /**#@-*/ - /** - * Default Constructor. - * - * @param string $hash - */ - public function __construct($hash = 'sha256') - { - $this->setHash($hash); - } - /** - * Sets the key for HMACs - * - * Keys can be of any length. - * - * @param string $key - */ - public function setKey($key = \false) - { - $this->key = $key; - $this->computeKey(); - $this->recomputeAESKey = \true; - } - /** - * Sets the nonce for UMACs - * - * Keys can be of any length. - * - * @param string $nonce - */ - public function setNonce($nonce = \false) - { - switch (\true) { - case !\is_string($nonce): - case \strlen($nonce) > 0 && \strlen($nonce) <= 16: - $this->recomputeAESKey = \true; - $this->nonce = $nonce; - return; - } - throw new \LengthException('The nonce length must be between 1 and 16 bytes, inclusive'); - } - /** - * Pre-compute the key used by the HMAC - * - * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes - * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC." - * - * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/ - * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during - * every call - * - */ - private function computeKey() - { - if ($this->key === \false) { - $this->computedKey = \false; - return; - } - if (\strlen($this->key) <= $this->getBlockLengthInBytes()) { - $this->computedKey = $this->key; - return; - } - $this->computedKey = \is_array($this->algo) ? \call_user_func($this->algo, $this->key) : \hash($this->algo, $this->key, \true); - } - /** - * Gets the hash function. - * - * As set by the constructor or by the setHash() method. - * - * @return string - */ - public function getHash() - { - return $this->hashParam; - } - /** - * Sets the hash function. - * - * @param string $hash - */ - public function setHash($hash) - { - $this->hashParam = $hash = \strtolower($hash); - switch ($hash) { - case 'umac-32': - case 'umac-64': - case 'umac-96': - case 'umac-128': - $this->blockSize = 128; - $this->length = \abs(\substr($hash, -3)) >> 3; - $this->algo = 'umac'; - return; - case 'md2-96': - case 'md5-96': - case 'sha1-96': - case 'sha224-96': - case 'sha256-96': - case 'sha384-96': - case 'sha512-96': - case 'sha512/224-96': - case 'sha512/256-96': - $hash = \substr($hash, 0, -3); - $this->length = 12; - // 96 / 8 = 12 - break; - case 'md2': - case 'md5': - $this->length = 16; - break; - case 'sha1': - $this->length = 20; - break; - case 'sha224': - case 'sha512/224': - case 'sha3-224': - $this->length = 28; - break; - case 'keccak256': - $this->paddingType = self::PADDING_KECCAK; - // fall-through - case 'sha256': - case 'sha512/256': - case 'sha3-256': - $this->length = 32; - break; - case 'sha384': - case 'sha3-384': - $this->length = 48; - break; - case 'sha512': - case 'sha3-512': - $this->length = 64; - break; - default: - if (\preg_match('#^(shake(?:128|256))-(\\d+)$#', $hash, $matches)) { - $this->paddingType = self::PADDING_SHAKE; - $hash = $matches[1]; - $this->length = $matches[2] >> 3; - } else { - throw new UnsupportedAlgorithmException("{$hash} is not a supported algorithm"); - } - } - switch ($hash) { - case 'md2': - case 'md2-96': - $this->blockSize = 128; - break; - case 'md5-96': - case 'sha1-96': - case 'sha224-96': - case 'sha256-96': - case 'md5': - case 'sha1': - case 'sha224': - case 'sha256': - $this->blockSize = 512; - break; - case 'sha3-224': - $this->blockSize = 1152; - // 1600 - 2*224 - break; - case 'sha3-256': - case 'shake256': - case 'keccak256': - $this->blockSize = 1088; - // 1600 - 2*256 - break; - case 'sha3-384': - $this->blockSize = 832; - // 1600 - 2*384 - break; - case 'sha3-512': - $this->blockSize = 576; - // 1600 - 2*512 - break; - case 'shake128': - $this->blockSize = 1344; - // 1600 - 2*128 - break; - default: - $this->blockSize = 1024; - } - if (\in_array(\substr($hash, 0, 5), ['sha3-', 'shake', 'kecca'])) { - // PHP 7.1.0 introduced support for "SHA3 fixed mode algorithms": - // http://php.net/ChangeLog-7.php#7.1.0 - if (\version_compare(\PHP_VERSION, '7.1.0') < 0 || \substr($hash, 0, 5) != 'sha3-') { - //preg_match('#(\d+)$#', $hash, $matches); - //$this->parameters['capacity'] = 2 * $matches[1]; // 1600 - $this->blockSize - //$this->parameters['rate'] = 1600 - $this->parameters['capacity']; // == $this->blockSize - if (!$this->paddingType) { - $this->paddingType = self::PADDING_SHA3; - } - $this->parameters = ['capacity' => 1600 - $this->blockSize, 'rate' => $this->blockSize, 'length' => $this->length, 'padding' => $this->paddingType]; - $hash = ['phpseclib3\\Crypt\\Hash', \PHP_INT_SIZE == 8 ? 'sha3_64' : 'sha3_32']; - } - } - if ($hash == 'sha512/224' || $hash == 'sha512/256') { - // PHP 7.1.0 introduced sha512/224 and sha512/256 support: - // http://php.net/ChangeLog-7.php#7.1.0 - if (\version_compare(\PHP_VERSION, '7.1.0') < 0) { - // from http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf#page=24 - $initial = $hash == 'sha512/256' ? ['22312194FC2BF72C', '9F555FA3C84C64C2', '2393B86B6F53B151', '963877195940EABD', '96283EE2A88EFFE3', 'BE5E1E2553863992', '2B0199FC2C85B8AA', '0EB72DDC81C52CA2'] : ['8C3D37C819544DA2', '73E1996689DCD4D6', '1DFAB7AE32FF9C82', '679DD514582F9FCF', '0F6D2B697BD44DA8', '77E36F7304C48942', '3F9D85A86A1D36C8', '1112E6AD91D692A1']; - for ($i = 0; $i < 8; $i++) { - $initial[$i] = new BigInteger($initial[$i], 16); - $initial[$i]->setPrecision(64); - } - $this->parameters = \compact('initial'); - $hash = ['phpseclib3\\Crypt\\Hash', 'sha512']; - } - } - if (\is_array($hash)) { - $b = $this->blockSize >> 3; - $this->ipad = \str_repeat(\chr(0x36), $b); - $this->opad = \str_repeat(\chr(0x5c), $b); - } - $this->algo = $hash; - $this->computeKey(); - } - /** - * KDF: Key-Derivation Function - * - * The key-derivation function generates pseudorandom bits used to key the hash functions. - * - * @param int $index a non-negative integer less than 2^64 - * @param int $numbytes a non-negative integer less than 2^64 - * @return string string of length numbytes bytes - */ - private function kdf($index, $numbytes) - { - $this->c->setIV(\pack('N4', 0, $index, 0, 1)); - return $this->c->encrypt(\str_repeat("\x00", $numbytes)); - } - /** - * PDF Algorithm - * - * @return string string of length taglen bytes. - */ - private function pdf() - { - $k = $this->key; - $nonce = $this->nonce; - $taglen = $this->length; - // - // Extract and zero low bit(s) of Nonce if needed - // - if ($taglen <= 8) { - $last = \strlen($nonce) - 1; - $mask = $taglen == 4 ? "\x03" : "\x01"; - $index = $nonce[$last] & $mask; - $nonce[$last] = $nonce[$last] ^ $index; - } - // - // Make Nonce BLOCKLEN bytes by appending zeroes if needed - // - $nonce = \str_pad($nonce, 16, "\x00"); - // - // Generate subkey, encipher and extract indexed substring - // - $kp = $this->kdf(0, 16); - $c = new \phpseclib3\Crypt\AES('ctr'); - $c->disablePadding(); - $c->setKey($kp); - $c->setIV($nonce); - $t = $c->encrypt("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"); - // we could use ord() but per https://paragonie.com/blog/2016/06/constant-time-encoding-boring-cryptography-rfc-4648-and-you - // unpack() doesn't leak timing info - return $taglen <= 8 ? \substr($t, \unpack('C', $index)[1] * $taglen, $taglen) : \substr($t, 0, $taglen); - } - /** - * UHASH Algorithm - * - * @param string $m string of length less than 2^67 bits. - * @param int $taglen the integer 4, 8, 12 or 16. - * @return string string of length taglen bytes. - */ - private function uhash($m, $taglen) - { - // - // One internal iteration per 4 bytes of output - // - $iters = $taglen >> 2; - // - // Define total key needed for all iterations using KDF. - // L1Key reuses most key material between iterations. - // - //$L1Key = $this->kdf(1, 1024 + ($iters - 1) * 16); - $L1Key = $this->kdf(1, (1024 + ($iters - 1)) * 16); - $L2Key = $this->kdf(2, $iters * 24); - $L3Key1 = $this->kdf(3, $iters * 64); - $L3Key2 = $this->kdf(4, $iters * 4); - // - // For each iteration, extract key and do three-layer hash. - // If bytelength(M) <= 1024, then skip L2-HASH. - // - $y = ''; - for ($i = 0; $i < $iters; $i++) { - $L1Key_i = \substr($L1Key, $i * 16, 1024); - $L2Key_i = \substr($L2Key, $i * 24, 24); - $L3Key1_i = \substr($L3Key1, $i * 64, 64); - $L3Key2_i = \substr($L3Key2, $i * 4, 4); - $a = self::L1Hash($L1Key_i, $m); - $b = \strlen($m) <= 1024 ? "\x00\x00\x00\x00\x00\x00\x00\x00{$a}" : self::L2Hash($L2Key_i, $a); - $c = self::L3Hash($L3Key1_i, $L3Key2_i, $b); - $y .= $c; - } - return $y; - } - /** - * L1-HASH Algorithm - * - * The first-layer hash breaks the message into 1024-byte chunks and - * hashes each with a function called NH. Concatenating the results - * forms a string, which is up to 128 times shorter than the original. - * - * @param string $k string of length 1024 bytes. - * @param string $m string of length less than 2^67 bits. - * @return string string of length (8 * ceil(bitlength(M)/8192)) bytes. - */ - private static function L1Hash($k, $m) - { - // - // Break M into 1024 byte chunks (final chunk may be shorter) - // - $m = \str_split($m, 1024); - // - // For each chunk, except the last: endian-adjust, NH hash - // and add bit-length. Use results to build Y. - // - $length = new BigInteger(1024 * 8); - $y = ''; - for ($i = 0; $i < \count($m) - 1; $i++) { - $m[$i] = \pack('N*', ...\unpack('V*', $m[$i])); - // ENDIAN-SWAP - $y .= static::nh($k, $m[$i], $length); - } - // - // For the last chunk: pad to 32-byte boundary, endian-adjust, - // NH hash and add bit-length. Concatenate the result to Y. - // - $length = \count($m) ? \strlen($m[$i]) : 0; - $pad = 32 - $length % 32; - $pad = \max(32, $length + $pad % 32); - $m[$i] = \str_pad(isset($m[$i]) ? $m[$i] : '', $pad, "\x00"); - // zeropad - $m[$i] = \pack('N*', ...\unpack('V*', $m[$i])); - // ENDIAN-SWAP - $y .= static::nh($k, $m[$i], new BigInteger($length * 8)); - return $y; - } - /** - * NH Algorithm - * - * @param string $k string of length 1024 bytes. - * @param string $m string with length divisible by 32 bytes. - * @return string string of length 8 bytes. - */ - private static function nh($k, $m, $length) - { - $toUInt32 = function ($x) { - $x = new BigInteger($x, 256); - $x->setPrecision(32); - return $x; - }; - // - // Break M and K into 4-byte chunks - // - //$t = strlen($m) >> 2; - $m = \str_split($m, 4); - $t = \count($m); - $k = \str_split($k, 4); - $k = \array_pad(\array_slice($k, 0, $t), $t, 0); - $m = \array_map($toUInt32, $m); - $k = \array_map($toUInt32, $k); - // - // Perform NH hash on the chunks, pairing words for multiplication - // which are 4 apart to accommodate vector-parallelism. - // - $y = new BigInteger(); - $y->setPrecision(64); - $i = 0; - while ($i < $t) { - $temp = $m[$i]->add($k[$i]); - $temp->setPrecision(64); - $temp = $temp->multiply($m[$i + 4]->add($k[$i + 4])); - $y = $y->add($temp); - $temp = $m[$i + 1]->add($k[$i + 1]); - $temp->setPrecision(64); - $temp = $temp->multiply($m[$i + 5]->add($k[$i + 5])); - $y = $y->add($temp); - $temp = $m[$i + 2]->add($k[$i + 2]); - $temp->setPrecision(64); - $temp = $temp->multiply($m[$i + 6]->add($k[$i + 6])); - $y = $y->add($temp); - $temp = $m[$i + 3]->add($k[$i + 3]); - $temp->setPrecision(64); - $temp = $temp->multiply($m[$i + 7]->add($k[$i + 7])); - $y = $y->add($temp); - $i += 8; - } - return $y->add($length)->toBytes(); - } - /** - * L2-HASH: Second-Layer Hash - * - * The second-layer rehashes the L1-HASH output using a polynomial hash - * called POLY. If the L1-HASH output is long, then POLY is called once - * on a prefix of the L1-HASH output and called using different settings - * on the remainder. (This two-step hashing of the L1-HASH output is - * needed only if the message length is greater than 16 megabytes.) - * Careful implementation of POLY is necessary to avoid a possible - * timing attack (see Section 6.6 for more information). - * - * @param string $k string of length 24 bytes. - * @param string $m string of length less than 2^64 bytes. - * @return string string of length 16 bytes. - */ - private static function L2Hash($k, $m) - { - // - // Extract keys and restrict to special key-sets - // - $k64 = $k & "\x01\xff\xff\xff\x01\xff\xff\xff"; - $k64 = new BigInteger($k64, 256); - $k128 = \substr($k, 8) & "\x01\xff\xff\xff\x01\xff\xff\xff\x01\xff\xff\xff\x01\xff\xff\xff"; - $k128 = new BigInteger($k128, 256); - // - // If M is no more than 2^17 bytes, hash under 64-bit prime, - // otherwise, hash first 2^17 bytes under 64-bit prime and - // remainder under 128-bit prime. - // - if (\strlen($m) <= 0x20000) { - // 2^14 64-bit words - $y = self::poly(64, self::$maxwordrange64, $k64, $m); - } else { - $m_1 = \substr($m, 0, 0x20000); - // 1 << 17 - $m_2 = \substr($m, 0x20000) . "\x80"; - $length = \strlen($m_2); - $pad = 16 - $length % 16; - $pad %= 16; - $m_2 = \str_pad($m_2, $length + $pad, "\x00"); - // zeropad - $y = self::poly(64, self::$maxwordrange64, $k64, $m_1); - $y = \str_pad($y, 16, "\x00", \STR_PAD_LEFT); - $y = self::poly(128, self::$maxwordrange128, $k128, $y . $m_2); - } - return \str_pad($y, 16, "\x00", \STR_PAD_LEFT); - } - /** - * POLY Algorithm - * - * @param int $wordbits the integer 64 or 128. - * @param BigInteger $maxwordrange positive integer less than 2^wordbits. - * @param BigInteger $k integer in the range 0 ... prime(wordbits) - 1. - * @param string $m string with length divisible by (wordbits / 8) bytes. - * @return integer in the range 0 ... prime(wordbits) - 1. - */ - private static function poly($wordbits, $maxwordrange, $k, $m) - { - // - // Define constants used for fixing out-of-range words - // - $wordbytes = $wordbits >> 3; - if ($wordbits == 128) { - $factory = self::$factory128; - $offset = self::$offset128; - $marker = self::$marker128; - } else { - $factory = self::$factory64; - $offset = self::$offset64; - $marker = self::$marker64; - } - $k = $factory->newInteger($k); - // - // Break M into chunks of length wordbytes bytes - // - $m_i = \str_split($m, $wordbytes); - // - // Each input word m is compared with maxwordrange. If not smaller - // then 'marker' and (m - offset), both in range, are hashed. - // - $y = $factory->newInteger(new BigInteger(1)); - foreach ($m_i as $m) { - $m = $factory->newInteger(new BigInteger($m, 256)); - if ($m->compare($maxwordrange) >= 0) { - $y = $k->multiply($y)->add($marker); - $y = $k->multiply($y)->add($m->subtract($offset)); - } else { - $y = $k->multiply($y)->add($m); - } - } - return $y->toBytes(); - } - /** - * L3-HASH: Third-Layer Hash - * - * The output from L2-HASH is 16 bytes long. This final hash function - * hashes the 16-byte string to a fixed length of 4 bytes. - * - * @param string $k1 string of length 64 bytes. - * @param string $k2 string of length 4 bytes. - * @param string $m string of length 16 bytes. - * @return string string of length 4 bytes. - */ - private static function L3Hash($k1, $k2, $m) - { - $factory = self::$factory36; - $y = $factory->newInteger(new BigInteger()); - for ($i = 0; $i < 8; $i++) { - $m_i = $factory->newInteger(new BigInteger(\substr($m, 2 * $i, 2), 256)); - $k_i = $factory->newInteger(new BigInteger(\substr($k1, 8 * $i, 8), 256)); - $y = $y->add($m_i->multiply($k_i)); - } - $y = \str_pad(\substr($y->toBytes(), -4), 4, "\x00", \STR_PAD_LEFT); - $y = $y ^ $k2; - return $y; - } - /** - * Compute the Hash / HMAC / UMAC. - * - * @param string $text - * @return string - */ - public function hash($text) - { - $algo = $this->algo; - if ($algo == 'umac') { - if ($this->recomputeAESKey) { - if (!\is_string($this->nonce)) { - throw new InsufficientSetupException('No nonce has been set'); - } - if (!\is_string($this->key)) { - throw new InsufficientSetupException('No key has been set'); - } - if (\strlen($this->key) != 16) { - throw new \LengthException('Key must be 16 bytes long'); - } - if (!isset(self::$maxwordrange64)) { - $one = new BigInteger(1); - $prime36 = new BigInteger("\x00\x00\x00\x0f\xff\xff\xff\xfb", 256); - self::$factory36 = new PrimeField($prime36); - $prime64 = new BigInteger("\xff\xff\xff\xff\xff\xff\xff\xc5", 256); - self::$factory64 = new PrimeField($prime64); - $prime128 = new BigInteger("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffa", 256); - self::$factory128 = new PrimeField($prime128); - self::$offset64 = new BigInteger("\x01\x00\x00\x00\x00\x00\x00\x00\x00", 256); - self::$offset64 = self::$factory64->newInteger(self::$offset64->subtract($prime64)); - self::$offset128 = new BigInteger("\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 256); - self::$offset128 = self::$factory128->newInteger(self::$offset128->subtract($prime128)); - self::$marker64 = self::$factory64->newInteger($prime64->subtract($one)); - self::$marker128 = self::$factory128->newInteger($prime128->subtract($one)); - $maxwordrange64 = $one->bitwise_leftShift(64)->subtract($one->bitwise_leftShift(32)); - self::$maxwordrange64 = self::$factory64->newInteger($maxwordrange64); - $maxwordrange128 = $one->bitwise_leftShift(128)->subtract($one->bitwise_leftShift(96)); - self::$maxwordrange128 = self::$factory128->newInteger($maxwordrange128); - } - $this->c = new \phpseclib3\Crypt\AES('ctr'); - $this->c->disablePadding(); - $this->c->setKey($this->key); - $this->pad = $this->pdf(); - $this->recomputeAESKey = \false; - } - $hashedmessage = $this->uhash($text, $this->length); - return $hashedmessage ^ $this->pad; - } - if (\is_array($algo)) { - if (empty($this->key) || !\is_string($this->key)) { - return \substr($algo($text, ...\array_values($this->parameters)), 0, $this->length); - } - // SHA3 HMACs are discussed at https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=30 - $key = \str_pad($this->computedKey, $b, \chr(0)); - $temp = $this->ipad ^ $key; - $temp .= $text; - $temp = \substr($algo($temp, ...\array_values($this->parameters)), 0, $this->length); - $output = $this->opad ^ $key; - $output .= $temp; - $output = $algo($output, ...\array_values($this->parameters)); - return \substr($output, 0, $this->length); - } - $output = !empty($this->key) || \is_string($this->key) ? \hash_hmac($algo, $text, $this->computedKey, \true) : \hash($algo, $text, \true); - return \strlen($output) > $this->length ? \substr($output, 0, $this->length) : $output; - } - /** - * Returns the hash length (in bits) - * - * @return int - */ - public function getLength() - { - return $this->length << 3; - } - /** - * Returns the hash length (in bytes) - * - * @return int - */ - public function getLengthInBytes() - { - return $this->length; - } - /** - * Returns the block length (in bits) - * - * @return int - */ - public function getBlockLength() - { - return $this->blockSize; - } - /** - * Returns the block length (in bytes) - * - * @return int - */ - public function getBlockLengthInBytes() - { - return $this->blockSize >> 3; - } - /** - * Pads SHA3 based on the mode - * - * @param int $padLength - * @param int $padType - * @return string - */ - private static function sha3_pad($padLength, $padType) - { - switch ($padType) { - case self::PADDING_KECCAK: - $temp = \chr(0x1) . \str_repeat("\x00", $padLength - 1); - $temp[$padLength - 1] = $temp[$padLength - 1] | \chr(0x80); - return $temp; - case self::PADDING_SHAKE: - $temp = \chr(0x1f) . \str_repeat("\x00", $padLength - 1); - $temp[$padLength - 1] = $temp[$padLength - 1] | \chr(0x80); - return $temp; - //case self::PADDING_SHA3: - default: - // from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=36 - return $padLength == 1 ? \chr(0x86) : \chr(0x6) . \str_repeat("\x00", $padLength - 2) . \chr(0x80); - } - } - /** - * Pure-PHP 32-bit implementation of SHA3 - * - * Whereas BigInteger.php's 32-bit engine works on PHP 64-bit this 32-bit implementation - * of SHA3 will *not* work on PHP 64-bit. This is because this implementation - * employees bitwise NOTs and bitwise left shifts. And the round constants only work - * on 32-bit PHP. eg. dechex(-2147483648) returns 80000000 on 32-bit PHP and - * FFFFFFFF80000000 on 64-bit PHP. Sure, we could do bitwise ANDs but that would slow - * things down. - * - * SHA512 requires BigInteger to simulate 64-bit unsigned integers because SHA2 employees - * addition whereas SHA3 just employees bitwise operators. PHP64 only supports signed - * 64-bit integers, which complicates addition, whereas that limitation isn't an issue - * for SHA3. - * - * In https://ws680.nist.gov/publication/get_pdf.cfm?pub_id=919061#page=16 KECCAK[C] is - * defined as "the KECCAK instance with KECCAK-f[1600] as the underlying permutation and - * capacity c". This is relevant because, altho the KECCAK standard defines a mode - * (KECCAK-f[800]) designed for 32-bit machines that mode is incompatible with SHA3 - * - * @param string $p - * @param int $c - * @param int $r - * @param int $d - * @param int $padType - */ - private static function sha3_32($p, $c, $r, $d, $padType) - { - $block_size = $r >> 3; - $padLength = $block_size - \strlen($p) % $block_size; - $num_ints = $block_size >> 2; - $p .= static::sha3_pad($padLength, $padType); - $n = \strlen($p) / $r; - // number of blocks - $s = [[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]]; - $p = \str_split($p, $block_size); - foreach ($p as $pi) { - $pi = \unpack('V*', $pi); - $x = $y = 0; - for ($i = 1; $i <= $num_ints; $i += 2) { - $s[$x][$y][0] ^= $pi[$i + 1]; - $s[$x][$y][1] ^= $pi[$i]; - if (++$y == 5) { - $y = 0; - $x++; - } - } - static::processSHA3Block32($s); - } - $z = ''; - $i = $j = 0; - while (\strlen($z) < $d) { - $z .= \pack('V2', $s[$i][$j][1], $s[$i][$j++][0]); - if ($j == 5) { - $j = 0; - $i++; - if ($i == 5) { - $i = 0; - static::processSHA3Block32($s); - } - } - } - return $z; - } - /** - * 32-bit block processing method for SHA3 - * - * @param array $s - */ - private static function processSHA3Block32(&$s) - { - static $rotationOffsets = [[0, 1, 62, 28, 27], [36, 44, 6, 55, 20], [3, 10, 43, 25, 39], [41, 45, 15, 21, 8], [18, 2, 61, 56, 14]]; - // the standards give these constants in hexadecimal notation. it's tempting to want to use - // that same notation, here, however, we can't, because 0x80000000, on PHP32, is a positive - // float - not the negative int that we need to be in PHP32. so we use -2147483648 instead - static $roundConstants = [[0, 1], [0, 32898], [-2147483648, 32906], [-2147483648, -2147450880], [0, 32907], [0, -2147483647], [-2147483648, -2147450751], [-2147483648, 32777], [0, 138], [0, 136], [0, -2147450871], [0, -2147483638], [0, -2147450741], [-2147483648, 139], [-2147483648, 32905], [-2147483648, 32771], [-2147483648, 32770], [-2147483648, 128], [0, 32778], [-2147483648, -2147483638], [-2147483648, -2147450751], [-2147483648, 32896], [0, -2147483647], [-2147483648, -2147450872]]; - for ($round = 0; $round < 24; $round++) { - // theta step - $parity = $rotated = []; - for ($i = 0; $i < 5; $i++) { - $parity[] = [$s[0][$i][0] ^ $s[1][$i][0] ^ $s[2][$i][0] ^ $s[3][$i][0] ^ $s[4][$i][0], $s[0][$i][1] ^ $s[1][$i][1] ^ $s[2][$i][1] ^ $s[3][$i][1] ^ $s[4][$i][1]]; - $rotated[] = static::rotateLeft32($parity[$i], 1); - } - $temp = [[$parity[4][0] ^ $rotated[1][0], $parity[4][1] ^ $rotated[1][1]], [$parity[0][0] ^ $rotated[2][0], $parity[0][1] ^ $rotated[2][1]], [$parity[1][0] ^ $rotated[3][0], $parity[1][1] ^ $rotated[3][1]], [$parity[2][0] ^ $rotated[4][0], $parity[2][1] ^ $rotated[4][1]], [$parity[3][0] ^ $rotated[0][0], $parity[3][1] ^ $rotated[0][1]]]; - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $s[$i][$j][0] ^= $temp[$j][0]; - $s[$i][$j][1] ^= $temp[$j][1]; - } - } - $st = $s; - // rho and pi steps - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $st[(2 * $i + 3 * $j) % 5][$j] = static::rotateLeft32($s[$j][$i], $rotationOffsets[$j][$i]); - } - } - // chi step - for ($i = 0; $i < 5; $i++) { - $s[$i][0] = [$st[$i][0][0] ^ ~$st[$i][1][0] & $st[$i][2][0], $st[$i][0][1] ^ ~$st[$i][1][1] & $st[$i][2][1]]; - $s[$i][1] = [$st[$i][1][0] ^ ~$st[$i][2][0] & $st[$i][3][0], $st[$i][1][1] ^ ~$st[$i][2][1] & $st[$i][3][1]]; - $s[$i][2] = [$st[$i][2][0] ^ ~$st[$i][3][0] & $st[$i][4][0], $st[$i][2][1] ^ ~$st[$i][3][1] & $st[$i][4][1]]; - $s[$i][3] = [$st[$i][3][0] ^ ~$st[$i][4][0] & $st[$i][0][0], $st[$i][3][1] ^ ~$st[$i][4][1] & $st[$i][0][1]]; - $s[$i][4] = [$st[$i][4][0] ^ ~$st[$i][0][0] & $st[$i][1][0], $st[$i][4][1] ^ ~$st[$i][0][1] & $st[$i][1][1]]; - } - // iota step - $s[0][0][0] ^= $roundConstants[$round][0]; - $s[0][0][1] ^= $roundConstants[$round][1]; - } - } - /** - * Rotate 32-bit int - * - * @param array $x - * @param int $shift - */ - private static function rotateLeft32($x, $shift) - { - if ($shift < 32) { - list($hi, $lo) = $x; - } else { - $shift -= 32; - list($lo, $hi) = $x; - } - return [$hi << $shift | $lo >> 32 - $shift & (1 << $shift) - 1, $lo << $shift | $hi >> 32 - $shift & (1 << $shift) - 1]; - } - /** - * Pure-PHP 64-bit implementation of SHA3 - * - * @param string $p - * @param int $c - * @param int $r - * @param int $d - * @param int $padType - */ - private static function sha3_64($p, $c, $r, $d, $padType) - { - $block_size = $r >> 3; - $padLength = $block_size - \strlen($p) % $block_size; - $num_ints = $block_size >> 2; - $p .= static::sha3_pad($padLength, $padType); - $n = \strlen($p) / $r; - // number of blocks - $s = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]; - $p = \str_split($p, $block_size); - foreach ($p as $pi) { - $pi = \unpack('P*', $pi); - $x = $y = 0; - foreach ($pi as $subpi) { - $s[$x][$y++] ^= $subpi; - if ($y == 5) { - $y = 0; - $x++; - } - } - static::processSHA3Block64($s); - } - $z = ''; - $i = $j = 0; - while (\strlen($z) < $d) { - $z .= \pack('P', $s[$i][$j++]); - if ($j == 5) { - $j = 0; - $i++; - if ($i == 5) { - $i = 0; - static::processSHA3Block64($s); - } - } - } - return $z; - } - /** - * 64-bit block processing method for SHA3 - * - * @param array $s - */ - private static function processSHA3Block64(&$s) - { - static $rotationOffsets = [[0, 1, 62, 28, 27], [36, 44, 6, 55, 20], [3, 10, 43, 25, 39], [41, 45, 15, 21, 8], [18, 2, 61, 56, 14]]; - static $roundConstants = [1, 32898, -9223372036854742902, -9223372034707259392, 32907, 2147483649, -9223372034707259263, -9223372036854743031, 138, 136, 2147516425, 2147483658, 2147516555, -9223372036854775669, -9223372036854742903, -9223372036854743037, -9223372036854743038, -9223372036854775680, 32778, -9223372034707292150, -9223372034707259263, -9223372036854742912, 2147483649, -9223372034707259384]; - for ($round = 0; $round < 24; $round++) { - // theta step - $parity = []; - for ($i = 0; $i < 5; $i++) { - $parity[] = $s[0][$i] ^ $s[1][$i] ^ $s[2][$i] ^ $s[3][$i] ^ $s[4][$i]; - } - $temp = [$parity[4] ^ static::rotateLeft64($parity[1], 1), $parity[0] ^ static::rotateLeft64($parity[2], 1), $parity[1] ^ static::rotateLeft64($parity[3], 1), $parity[2] ^ static::rotateLeft64($parity[4], 1), $parity[3] ^ static::rotateLeft64($parity[0], 1)]; - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $s[$i][$j] ^= $temp[$j]; - } - } - $st = $s; - // rho and pi steps - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $st[(2 * $i + 3 * $j) % 5][$j] = static::rotateLeft64($s[$j][$i], $rotationOffsets[$j][$i]); - } - } - // chi step - for ($i = 0; $i < 5; $i++) { - $s[$i] = [$st[$i][0] ^ ~$st[$i][1] & $st[$i][2], $st[$i][1] ^ ~$st[$i][2] & $st[$i][3], $st[$i][2] ^ ~$st[$i][3] & $st[$i][4], $st[$i][3] ^ ~$st[$i][4] & $st[$i][0], $st[$i][4] ^ ~$st[$i][0] & $st[$i][1]]; - } - // iota step - $s[0][0] ^= $roundConstants[$round]; - } - } - /** - * Rotate 64-bit int - * - * @param int $x - * @param int $shift - */ - private static function rotateLeft64($x, $shift) - { - return $x << $shift | $x >> 64 - $shift & (1 << $shift) - 1; - } - /** - * Pure-PHP implementation of SHA512 - * - * @param string $m - * @param array $hash - * @return string - */ - private static function sha512($m, $hash) - { - static $k; - if (!isset($k)) { - // Initialize table of round constants - // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = ['428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817']; - for ($i = 0; $i < 80; $i++) { - $k[$i] = new BigInteger($k[$i], 16); - } - } - // Pre-processing - $length = \strlen($m); - // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m .= \str_repeat(\chr(0), 128 - ($length + 16 & 0x7f)); - $m[$length] = \chr(0x80); - // we don't support hashing strings 512MB long - $m .= \pack('N4', 0, 0, 0, $length << 3); - // Process the message in successive 1024-bit chunks - $chunks = \str_split($m, 128); - foreach ($chunks as $chunk) { - $w = []; - for ($i = 0; $i < 16; $i++) { - $temp = new BigInteger(Strings::shift($chunk, 8), 256); - $temp->setPrecision(64); - $w[] = $temp; - } - // Extend the sixteen 32-bit words into eighty 32-bit words - for ($i = 16; $i < 80; $i++) { - $temp = [$w[$i - 15]->bitwise_rightRotate(1), $w[$i - 15]->bitwise_rightRotate(8), $w[$i - 15]->bitwise_rightShift(7)]; - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = [$w[$i - 2]->bitwise_rightRotate(19), $w[$i - 2]->bitwise_rightRotate(61), $w[$i - 2]->bitwise_rightShift(6)]; - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $w[$i] = clone $w[$i - 16]; - $w[$i] = $w[$i]->add($s0); - $w[$i] = $w[$i]->add($w[$i - 7]); - $w[$i] = $w[$i]->add($s1); - } - // Initialize hash value for this chunk - $a = clone $hash[0]; - $b = clone $hash[1]; - $c = clone $hash[2]; - $d = clone $hash[3]; - $e = clone $hash[4]; - $f = clone $hash[5]; - $g = clone $hash[6]; - $h = clone $hash[7]; - // Main loop - for ($i = 0; $i < 80; $i++) { - $temp = [$a->bitwise_rightRotate(28), $a->bitwise_rightRotate(34), $a->bitwise_rightRotate(39)]; - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = [$a->bitwise_and($b), $a->bitwise_and($c), $b->bitwise_and($c)]; - $maj = $temp[0]->bitwise_xor($temp[1]); - $maj = $maj->bitwise_xor($temp[2]); - $t2 = $s0->add($maj); - $temp = [$e->bitwise_rightRotate(14), $e->bitwise_rightRotate(18), $e->bitwise_rightRotate(41)]; - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $temp = [$e->bitwise_and($f), $g->bitwise_and($e->bitwise_not())]; - $ch = $temp[0]->bitwise_xor($temp[1]); - $t1 = $h->add($s1); - $t1 = $t1->add($ch); - $t1 = $t1->add($k[$i]); - $t1 = $t1->add($w[$i]); - $h = clone $g; - $g = clone $f; - $f = clone $e; - $e = $d->add($t1); - $d = clone $c; - $c = clone $b; - $b = clone $a; - $a = $t1->add($t2); - } - // Add this chunk's hash to result so far - $hash = [$hash[0]->add($a), $hash[1]->add($b), $hash[2]->add($c), $hash[3]->add($d), $hash[4]->add($e), $hash[5]->add($f), $hash[6]->add($g), $hash[7]->add($h)]; - } - // Produce the final hash value (big-endian) - // (\phpseclib3\Crypt\Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . $hash[4]->toBytes() . $hash[5]->toBytes() . $hash[6]->toBytes() . $hash[7]->toBytes(); - return $temp; - } - /** - * __toString() magic method - */ - public function __toString() - { - return $this->getHash(); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php deleted file mode 100644 index f1b9203..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\AsymmetricKey; -use phpseclib3\Crypt\Common\PrivateKey; -use phpseclib3\Crypt\Common\PublicKey; -use phpseclib3\Exception\NoKeyLoadedException; -use phpseclib3\File\X509; -/** - * PublicKeyLoader - * - * @author Jim Wigginton - */ -abstract class PublicKeyLoader -{ - /** - * Loads a public or private key - * - * @return AsymmetricKey - * @param string|array $key - * @param string $password optional - */ - public static function load($key, $password = \false) - { - try { - return \phpseclib3\Crypt\EC::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - try { - return \phpseclib3\Crypt\RSA::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - try { - return \phpseclib3\Crypt\DSA::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - try { - $x509 = new X509(); - $x509->loadX509($key); - $key = $x509->getPublicKey(); - if ($key) { - return $key; - } - } catch (\Exception $e) { - } - throw new NoKeyLoadedException('Unable to read key'); - } - /** - * Loads a private key - * - * @return PrivateKey - * @param string|array $key - * @param string $password optional - */ - public static function loadPrivateKey($key, $password = \false) - { - $key = self::load($key, $password); - if (!$key instanceof PrivateKey) { - throw new NoKeyLoadedException('The key that was loaded was not a private key'); - } - return $key; - } - /** - * Loads a public key - * - * @return PublicKey - * @param string|array $key - */ - public static function loadPublicKey($key) - { - $key = self::load($key); - if (!$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a public key'); - } - return $key; - } - /** - * Loads parameters - * - * @return AsymmetricKey - * @param string|array $key - */ - public static function loadParameters($key) - { - $key = self::load($key); - if (!$key instanceof PrivateKey && !$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a parameter'); - } - return $key; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC2.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC2.php deleted file mode 100644 index 342beb7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC2.php +++ /dev/null @@ -1,478 +0,0 @@ - - * setKey('abcdefgh'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $rc2->decrypt($rc2->encrypt($plaintext)); - * ?> - * - * - * @author Patrick Monnerat - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\BlockCipher; -use phpseclib3\Exception\BadModeException; -/** - * Pure-PHP implementation of RC2. - * - */ -class RC2 extends BlockCipher -{ - /** - * Block Length of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 8; - /** - * The Key - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::key - * @see self::setKey() - * @var string - */ - protected $key; - /** - * The Original (unpadded) Key - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::key - * @see self::setKey() - * @see self::encrypt() - * @see self::decrypt() - * @var string - */ - private $orig_key; - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\RC2::setKeyLength() - * @var int - */ - protected $key_length = 16; - // = 128 bits - /** - * The mcrypt specific name of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'rc2'; - /** - * Optimizing value while CFB-encrypting - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 500; - /** - * The key length in bits. - * - * {@internal Should be in range [1..1024].} - * - * {@internal Changing this value after setting the key has no effect.} - * - * @see self::setKeyLength() - * @see self::setKey() - * @var int - */ - private $default_key_length = 1024; - /** - * The key length in bits. - * - * {@internal Should be in range [1..1024].} - * - * @see self::isValidEnine() - * @see self::setKey() - * @var int - */ - private $current_key_length; - /** - * The Key Schedule - * - * @see self::setupKey() - * @var array - */ - private $keys; - /** - * Key expansion randomization table. - * Twice the same 256-value sequence to save a modulus in key expansion. - * - * @see self::setKey() - * @var array - */ - private static $pitable = [0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x9, 0x81, 0x7d, 0x32, 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0xb, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, 0x6f, 0xbf, 0xe, 0xda, 0x46, 0x69, 0x7, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x3, 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x6, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, 0x8, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x4, 0x18, 0xa4, 0xec, 0xc2, 0xe0, 0x41, 0x6e, 0xf, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x2, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x5, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, 0xd3, 0x0, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x1, 0x3f, 0x58, 0xe2, 0x89, 0xa9, 0xd, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0xc, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0xa, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad, 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x9, 0x81, 0x7d, 0x32, 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0xb, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, 0x6f, 0xbf, 0xe, 0xda, 0x46, 0x69, 0x7, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x3, 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x6, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, 0x8, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x4, 0x18, 0xa4, 0xec, 0xc2, 0xe0, 0x41, 0x6e, 0xf, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x2, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x5, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, 0xd3, 0x0, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x1, 0x3f, 0x58, 0xe2, 0x89, 0xa9, 0xd, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0xc, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0xa, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad]; - /** - * Inverse key expansion randomization table. - * - * @see self::setKey() - * @var array - */ - private static $invpitable = [0xd1, 0xda, 0xb9, 0x6f, 0x9c, 0xc8, 0x78, 0x66, 0x80, 0x2c, 0xf8, 0x37, 0xea, 0xe0, 0x62, 0xa4, 0xcb, 0x71, 0x50, 0x27, 0x4b, 0x95, 0xd9, 0x20, 0x9d, 0x4, 0x91, 0xe3, 0x47, 0x6a, 0x7e, 0x53, 0xfa, 0x3a, 0x3b, 0xb4, 0xa8, 0xbc, 0x5f, 0x68, 0x8, 0xca, 0x8f, 0x14, 0xd7, 0xc0, 0xef, 0x7b, 0x5b, 0xbf, 0x2f, 0xe5, 0xe2, 0x8c, 0xba, 0x12, 0xe1, 0xaf, 0xb2, 0x54, 0x5d, 0x59, 0x76, 0xdb, 0x32, 0xa2, 0x58, 0x6e, 0x1c, 0x29, 0x64, 0xf3, 0xe9, 0x96, 0xc, 0x98, 0x19, 0x8d, 0x3e, 0x26, 0xab, 0xa5, 0x85, 0x16, 0x40, 0xbd, 0x49, 0x67, 0xdc, 0x22, 0x94, 0xbb, 0x3c, 0xc1, 0x9b, 0xeb, 0x45, 0x28, 0x18, 0xd8, 0x1a, 0x42, 0x7d, 0xcc, 0xfb, 0x65, 0x8e, 0x3d, 0xcd, 0x2a, 0xa3, 0x60, 0xae, 0x93, 0x8a, 0x48, 0x97, 0x51, 0x15, 0xf7, 0x1, 0xb, 0xb7, 0x36, 0xb1, 0x2e, 0x11, 0xfd, 0x84, 0x2d, 0x3f, 0x13, 0x88, 0xb3, 0x34, 0x24, 0x1b, 0xde, 0xc5, 0x1d, 0x4d, 0x2b, 0x17, 0x31, 0x74, 0xa9, 0xc6, 0x43, 0x6d, 0x39, 0x90, 0xbe, 0xc3, 0xb0, 0x21, 0x6b, 0xf6, 0xf, 0xd5, 0x99, 0xd, 0xac, 0x1f, 0x5c, 0x9e, 0xf5, 0xf9, 0x4c, 0xd6, 0xdf, 0x89, 0xe4, 0x8b, 0xff, 0xc7, 0xaa, 0xe7, 0xed, 0x46, 0x25, 0xb6, 0x6, 0x5e, 0x35, 0xb5, 0xec, 0xce, 0xe8, 0x6c, 0x30, 0x55, 0x61, 0x4a, 0xfe, 0xa0, 0x79, 0x3, 0xf0, 0x10, 0x72, 0x7c, 0xcf, 0x52, 0xa6, 0xa7, 0xee, 0x44, 0xd3, 0x9a, 0x57, 0x92, 0xd0, 0x5a, 0x7a, 0x41, 0x7f, 0xe, 0x0, 0x63, 0xf2, 0x4f, 0x5, 0x83, 0xc9, 0xa1, 0xd4, 0xdd, 0xc4, 0x56, 0xf4, 0xd2, 0x77, 0x81, 0x9, 0x82, 0x33, 0x9f, 0x7, 0x86, 0x75, 0x38, 0x4e, 0x69, 0xf1, 0xad, 0x23, 0x73, 0x87, 0x70, 0x2, 0xc2, 0x1e, 0xb8, 0xa, 0xfc, 0xe6]; - /** - * Default Constructor. - * - * @param string $mode - * @throws \InvalidArgumentException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_OPENSSL: - if ($this->current_key_length != 128 || \strlen($this->orig_key) < 16) { - return \false; - } - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; - } - $this->cipher_name_openssl_ecb = 'rc2-ecb'; - $this->cipher_name_openssl = 'rc2-' . $this->openssl_translate_mode(); - } - return parent::isValidEngineHelper($engine); - } - /** - * Sets the key length. - * - * Valid key lengths are 8 to 1024. - * Calling this function after setting the key has no effect until the next - * \phpseclib3\Crypt\RC2::setKey() call. - * - * @param int $length in bits - * @throws \LengthException if the key length isn't supported - */ - public function setKeyLength($length) - { - if ($length < 8 || $length > 1024) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 1024 bits, inclusive, are supported'); - } - $this->default_key_length = $this->current_key_length = $length; - $this->explicit_key_length = $length >> 3; - } - /** - * Returns the current key length - * - * @return int - */ - public function getKeyLength() - { - return $this->current_key_length; - } - /** - * Sets the key. - * - * Keys can be of any length. RC2, itself, uses 8 to 1024 bit keys (eg. - * strlen($key) <= 128), however, we only use the first 128 bytes if $key - * has more then 128 bytes in it, and set $key to a single null byte if - * it is empty. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setKey() - * @param string $key - * @param int|boolean $t1 optional Effective key length in bits. - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key, $t1 = \false) - { - $this->orig_key = $key; - if ($t1 === \false) { - $t1 = $this->default_key_length; - } - if ($t1 < 1 || $t1 > 1024) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 1024 bits, inclusive, are supported'); - } - $this->current_key_length = $t1; - if (\strlen($key) < 1 || \strlen($key) > 128) { - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes between 8 and 1024 bits, inclusive, are supported'); - } - $t = \strlen($key); - // The mcrypt RC2 implementation only supports effective key length - // of 1024 bits. It is however possible to handle effective key - // lengths in range 1..1024 by expanding the key and applying - // inverse pitable mapping to the first byte before submitting it - // to mcrypt. - // Key expansion. - $l = \array_values(\unpack('C*', $key)); - $t8 = $t1 + 7 >> 3; - $tm = 0xff >> 8 * $t8 - $t1; - // Expand key. - $pitable = self::$pitable; - for ($i = $t; $i < 128; $i++) { - $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; - } - $i = 128 - $t8; - $l[$i] = $pitable[$l[$i] & $tm]; - while ($i--) { - $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; - } - // Prepare the key for mcrypt. - $l[0] = self::$invpitable[$l[0]]; - \array_unshift($l, 'C*'); - $this->key = \pack(...$l); - $this->key_length = \strlen($this->key); - $this->changed = $this->nonIVChanged = \true; - $this->setEngine(); - } - /** - * Encrypts a message. - * - * Mostly a wrapper for \phpseclib3\Crypt\Common\SymmetricKey::encrypt, with some additional OpenSSL handling code - * - * @see self::decrypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - if ($this->engine == self::ENGINE_OPENSSL) { - $temp = $this->key; - $this->key = $this->orig_key; - $result = parent::encrypt($plaintext); - $this->key = $temp; - return $result; - } - return parent::encrypt($plaintext); - } - /** - * Decrypts a message. - * - * Mostly a wrapper for \phpseclib3\Crypt\Common\SymmetricKey::decrypt, with some additional OpenSSL handling code - * - * @see self::encrypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if ($this->engine == self::ENGINE_OPENSSL) { - $temp = $this->key; - $this->key = $this->orig_key; - $result = parent::decrypt($ciphertext); - $this->key = $temp; - return $result; - } - return parent::decrypt($ciphertext); - } - /** - * Encrypts a block - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encryptBlock() - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - list($r0, $r1, $r2, $r3) = \array_values(\unpack('v*', $in)); - $keys = $this->keys; - $limit = 20; - $actions = [$limit => 44, 44 => 64]; - $j = 0; - for (;;) { - // Mixing round. - $r0 = ($r0 + $keys[$j++] + (($r1 ^ $r2) & $r3 ^ $r1) & 0xffff) << 1; - $r0 |= $r0 >> 16; - $r1 = ($r1 + $keys[$j++] + (($r2 ^ $r3) & $r0 ^ $r2) & 0xffff) << 2; - $r1 |= $r1 >> 16; - $r2 = ($r2 + $keys[$j++] + (($r3 ^ $r0) & $r1 ^ $r3) & 0xffff) << 3; - $r2 |= $r2 >> 16; - $r3 = ($r3 + $keys[$j++] + (($r0 ^ $r1) & $r2 ^ $r0) & 0xffff) << 5; - $r3 |= $r3 >> 16; - if ($j === $limit) { - if ($limit === 64) { - break; - } - // Mashing round. - $r0 += $keys[$r3 & 0x3f]; - $r1 += $keys[$r0 & 0x3f]; - $r2 += $keys[$r1 & 0x3f]; - $r3 += $keys[$r2 & 0x3f]; - $limit = $actions[$limit]; - } - } - return \pack('vvvv', $r0, $r1, $r2, $r3); - } - /** - * Decrypts a block - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decryptBlock() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - list($r0, $r1, $r2, $r3) = \array_values(\unpack('v*', $in)); - $keys = $this->keys; - $limit = 44; - $actions = [$limit => 20, 20 => 0]; - $j = 64; - for (;;) { - // R-mixing round. - $r3 = ($r3 | $r3 << 16) >> 5; - $r3 = $r3 - $keys[--$j] - (($r0 ^ $r1) & $r2 ^ $r0) & 0xffff; - $r2 = ($r2 | $r2 << 16) >> 3; - $r2 = $r2 - $keys[--$j] - (($r3 ^ $r0) & $r1 ^ $r3) & 0xffff; - $r1 = ($r1 | $r1 << 16) >> 2; - $r1 = $r1 - $keys[--$j] - (($r2 ^ $r3) & $r0 ^ $r2) & 0xffff; - $r0 = ($r0 | $r0 << 16) >> 1; - $r0 = $r0 - $keys[--$j] - (($r1 ^ $r2) & $r3 ^ $r1) & 0xffff; - if ($j === $limit) { - if ($limit === 0) { - break; - } - // R-mashing round. - $r3 = $r3 - $keys[$r2 & 0x3f] & 0xffff; - $r2 = $r2 - $keys[$r1 & 0x3f] & 0xffff; - $r1 = $r1 - $keys[$r0 & 0x3f] & 0xffff; - $r0 = $r0 - $keys[$r3 & 0x3f] & 0xffff; - $limit = $actions[$limit]; - } - } - return \pack('vvvv', $r0, $r1, $r2, $r3); - } - /** - * Creates the key schedule - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - if (!isset($this->key)) { - $this->setKey(''); - } - // Key has already been expanded in \phpseclib3\Crypt\RC2::setKey(): - // Only the first value must be altered. - $l = \unpack('Ca/Cb/v*', $this->key); - \array_unshift($l, self::$pitable[$l['a']] | $l['b'] << 8); - unset($l['a']); - unset($l['b']); - $this->keys = $l; - } - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - // Init code for both, encrypt and decrypt. - $init_crypt = '$keys = $this->keys;'; - $keys = $this->keys; - // $in is the current 8 bytes block which has to be en/decrypt - $encrypt_block = $decrypt_block = ' - $in = unpack("v4", $in); - $r0 = $in[1]; - $r1 = $in[2]; - $r2 = $in[3]; - $r3 = $in[4]; - '; - // Create code for encryption. - $limit = 20; - $actions = [$limit => 44, 44 => 64]; - $j = 0; - for (;;) { - // Mixing round. - $encrypt_block .= ' - $r0 = (($r0 + ' . $keys[$j++] . ' + - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + ' . $keys[$j++] . ' + - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + ' . $keys[$j++] . ' + - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + ' . $keys[$j++] . ' + - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16;'; - if ($j === $limit) { - if ($limit === 64) { - break; - } - // Mashing round. - $encrypt_block .= ' - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F];'; - $limit = $actions[$limit]; - } - } - $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - // Create code for decryption. - $limit = 44; - $actions = [$limit => 20, 20 => 0]; - $j = 64; - for (;;) { - // R-mixing round. - $decrypt_block .= ' - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - ' . $keys[--$j] . ' - - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - ' . $keys[--$j] . ' - - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - ' . $keys[--$j] . ' - - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - ' . $keys[--$j] . ' - - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; - if ($j === $limit) { - if ($limit === 0) { - break; - } - // R-mashing round. - $decrypt_block .= ' - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; - $limit = $actions[$limit]; - } - } - $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - // Creates the inline-crypt function - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC4.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC4.php deleted file mode 100644 index 9b37e0a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RC4.php +++ /dev/null @@ -1,258 +0,0 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rc4->decrypt($rc4->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\StreamCipher; -/** - * Pure-PHP implementation of RC4. - * - * @author Jim Wigginton - */ -class RC4 extends StreamCipher -{ - /** - * @see \phpseclib3\Crypt\RC4::_crypt() - */ - const ENCRYPT = 0; - /** - * @see \phpseclib3\Crypt\RC4::_crypt() - */ - const DECRYPT = 1; - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\RC4::setKeyLength() - * @var int - */ - protected $key_length = 128; - // = 1024 bits - /** - * The mcrypt specific name of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'arcfour'; - /** - * The Key - * - * @see self::setKey() - * @var string - */ - protected $key; - /** - * The Key Stream for decryption and encryption - * - * @see self::setKey() - * @var array - */ - private $stream; - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($engine == self::ENGINE_OPENSSL) { - if ($this->continuousBuffer) { - return \false; - } - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; - } - $this->cipher_name_openssl = 'rc4-40'; - } - return parent::isValidEngineHelper($engine); - } - /** - * Sets the key length - * - * Keys can be between 1 and 256 bytes long. - * - * @param int $length - * @throws \LengthException if the key length is invalid - */ - public function setKeyLength($length) - { - if ($length < 8 || $length > 2048) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 256 bytes are supported'); - } - $this->key_length = $length >> 3; - parent::setKeyLength($length); - } - /** - * Sets the key length - * - * Keys can be between 1 and 256 bytes long. - * - * @param string $key - */ - public function setKey($key) - { - $length = \strlen($key); - if ($length < 1 || $length > 256) { - throw new \LengthException('Key size of ' . $length . ' bytes is not supported by RC4. Keys must be between 1 and 256 bytes long'); - } - parent::setKey($key); - } - /** - * Encrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @see self::crypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - if ($this->engine != self::ENGINE_INTERNAL) { - return parent::encrypt($plaintext); - } - return $this->crypt($plaintext, self::ENCRYPT); - } - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see self::crypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if ($this->engine != self::ENGINE_INTERNAL) { - return parent::decrypt($ciphertext); - } - return $this->crypt($ciphertext, self::DECRYPT); - } - /** - * Encrypts a block - * - * @param string $in - */ - protected function encryptBlock($in) - { - // RC4 does not utilize this method - } - /** - * Decrypts a block - * - * @param string $in - */ - protected function decryptBlock($in) - { - // RC4 does not utilize this method - } - /** - * Setup the key (expansion) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupKey() - */ - protected function setupKey() - { - $key = $this->key; - $keyLength = \strlen($key); - $keyStream = \range(0, 255); - $j = 0; - for ($i = 0; $i < 256; $i++) { - $j = $j + $keyStream[$i] + \ord($key[$i % $keyLength]) & 255; - $temp = $keyStream[$i]; - $keyStream[$i] = $keyStream[$j]; - $keyStream[$j] = $temp; - } - $this->stream = []; - $this->stream[self::DECRYPT] = $this->stream[self::ENCRYPT] = [ - 0, - // index $i - 0, - // index $j - $keyStream, - ]; - } - /** - * Encrypts or decrypts a message. - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $text - * @param int $mode - * @return string $text - */ - private function crypt($text, $mode) - { - if ($this->changed) { - $this->setup(); - } - $stream =& $this->stream[$mode]; - if ($this->continuousBuffer) { - $i =& $stream[0]; - $j =& $stream[1]; - $keyStream =& $stream[2]; - } else { - $i = $stream[0]; - $j = $stream[1]; - $keyStream = $stream[2]; - } - $len = \strlen($text); - for ($k = 0; $k < $len; ++$k) { - $i = $i + 1 & 255; - $ksi = $keyStream[$i]; - $j = $j + $ksi & 255; - $ksj = $keyStream[$j]; - $keyStream[$i] = $ksj; - $keyStream[$j] = $ksi; - $text[$k] = $text[$k] ^ \chr($keyStream[$ksj + $ksi & 255]); - } - return $text; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA.php deleted file mode 100644 index 1b9dfc8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA.php +++ /dev/null @@ -1,823 +0,0 @@ - - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $ciphertext = $public->encrypt($plaintext); - * - * echo $private->decrypt($ciphertext); - * ?> - * - * - * Here's an example of how to create signatures and verify signatures with this library: - * - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $signature = $private->sign($plaintext); - * - * echo $public->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * One thing to consider when using this: so phpseclib uses PSS mode by default. - * Technically, id-RSASSA-PSS has a different key format than rsaEncryption. So - * should phpseclib save to the id-RSASSA-PSS format by default or the - * rsaEncryption format? For stand-alone keys I figure rsaEncryption is better - * because SSH doesn't use PSS and idk how many SSH servers would be able to - * decode an id-RSASSA-PSS key. For X.509 certificates the id-RSASSA-PSS - * format is used by default (unless you change it up to use PKCS1 instead) - * - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\AsymmetricKey; -use phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use phpseclib3\Crypt\RSA\PrivateKey; -use phpseclib3\Crypt\RSA\PublicKey; -use phpseclib3\Exception\InconsistentSetupException; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\Math\BigInteger; -/** - * Pure-PHP PKCS#1 compliant implementation of RSA. - * - * @author Jim Wigginton - */ -abstract class RSA extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'RSA'; - /** - * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} - * (OAEP) for encryption / decryption. - * - * Uses sha256 by default - * - * @see self::setHash() - * @see self::setMGFHash() - * @see self::encrypt() - * @see self::decrypt() - */ - const ENCRYPTION_OAEP = 1; - /** - * Use PKCS#1 padding. - * - * Although self::PADDING_OAEP / self::PADDING_PSS offers more security, including PKCS#1 padding is necessary for purposes of backwards - * compatibility with protocols (like SSH-1) written before OAEP's introduction. - * - * @see self::encrypt() - * @see self::decrypt() - */ - const ENCRYPTION_PKCS1 = 2; - /** - * Do not use any padding - * - * Although this method is not recommended it can none-the-less sometimes be useful if you're trying to decrypt some legacy - * stuff, if you're trying to diagnose why an encrypted message isn't decrypting, etc. - * - * @see self::encrypt() - * @see self::decrypt() - */ - const ENCRYPTION_NONE = 4; - /** - * Use the Probabilistic Signature Scheme for signing - * - * Uses sha256 and 0 as the salt length - * - * @see self::setSaltLength() - * @see self::setMGFHash() - * @see self::setHash() - * @see self::sign() - * @see self::verify() - * @see self::setHash() - */ - const SIGNATURE_PSS = 16; - /** - * Use a relaxed version of PKCS#1 padding for signature verification - * - * @see self::sign() - * @see self::verify() - * @see self::setHash() - */ - const SIGNATURE_RELAXED_PKCS1 = 32; - /** - * Use PKCS#1 padding for signature verification - * - * @see self::sign() - * @see self::verify() - * @see self::setHash() - */ - const SIGNATURE_PKCS1 = 64; - /** - * Encryption padding mode - * - * @var int - */ - protected $encryptionPadding = self::ENCRYPTION_OAEP; - /** - * Signature padding mode - * - * @var int - */ - protected $signaturePadding = self::SIGNATURE_PSS; - /** - * Length of hash function output - * - * @var int - */ - protected $hLen; - /** - * Length of salt - * - * @var int - */ - protected $sLen; - /** - * Label - * - * @var string - */ - protected $label = ''; - /** - * Hash function for the Mask Generation Function - * - * @var \phpseclib3\Crypt\Hash - */ - protected $mgfHash; - /** - * Length of MGF hash function output - * - * @var int - */ - protected $mgfHLen; - /** - * Modulus (ie. n) - * - * @var \phpseclib3\Math\BigInteger - */ - protected $modulus; - /** - * Modulus length - * - * @var \phpseclib3\Math\BigInteger - */ - protected $k; - /** - * Exponent (ie. e or d) - * - * @var \phpseclib3\Math\BigInteger - */ - protected $exponent; - /** - * Default public exponent - * - * @var int - * @link http://en.wikipedia.org/wiki/65537_%28number%29 - */ - private static $defaultExponent = 65537; - /** - * Enable Blinding? - * - * @var bool - */ - protected static $enableBlinding = \true; - /** - * OpenSSL configuration file name. - * - * @see self::createKey() - * @var ?string - */ - protected static $configFile; - /** - * Smallest Prime - * - * Per , this number ought not result in primes smaller - * than 256 bits. As a consequence if the key you're trying to create is 1024 bits and you've set smallestPrime - * to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). At least if - * engine is set to self::ENGINE_INTERNAL. If Engine is set to self::ENGINE_OPENSSL then smallest Prime is - * ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key generation when there's - * a chance neither gmp nor OpenSSL are installed) - * - * @var int - */ - private static $smallestPrime = 4096; - /** - * Public Exponent - * - * @var \phpseclib3\Math\BigInteger - */ - protected $publicExponent; - /** - * Sets the public exponent for key generation - * - * This will be 65537 unless changed. - * - * @param int $val - */ - public static function setExponent($val) - { - self::$defaultExponent = $val; - } - /** - * Sets the smallest prime number in bits. Used for key generation - * - * This will be 4096 unless changed. - * - * @param int $val - */ - public static function setSmallestPrime($val) - { - self::$smallestPrime = $val; - } - /** - * Sets the OpenSSL config file path - * - * Set to the empty string to use the default config file - * - * @param string $val - */ - public static function setOpenSSLConfigPath($val) - { - self::$configFile = $val; - } - /** - * Create a private key - * - * The public key can be extracted from the private key - * - * @return RSA\PrivateKey - * @param int $bits - */ - public static function createKey($bits = 2048) - { - self::initialize_static_variables(); - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - $regSize = $bits >> 1; - // divide by two to see how many bits P and Q would be - if ($regSize > self::$smallestPrime) { - $num_primes = \floor($bits / self::$smallestPrime); - $regSize = self::$smallestPrime; - } else { - $num_primes = 2; - } - if ($num_primes == 2 && $bits >= 384 && self::$defaultExponent == 65537) { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum - if (self::$engines['OpenSSL']) { - $config = []; - if (self::$configFile) { - $config['config'] = self::$configFile; - } - $rsa = \openssl_pkey_new(['private_key_bits' => $bits] + $config); - \openssl_pkey_export($rsa, $privatekeystr, null, $config); - // clear the buffer of error strings stemming from a minimalistic openssl.cnf - while (\openssl_error_string() !== \false) { - } - return \phpseclib3\Crypt\RSA::load($privatekeystr); - } - } - static $e; - if (!isset($e)) { - $e = new BigInteger(self::$defaultExponent); - } - $n = clone self::$one; - $exponents = $coefficients = $primes = []; - $lcm = ['top' => clone self::$one, 'bottom' => \false]; - do { - for ($i = 1; $i <= $num_primes; $i++) { - if ($i != $num_primes) { - $primes[$i] = BigInteger::randomPrime($regSize); - } else { - \extract(BigInteger::minMaxBits($bits)); - /** @var BigInteger $min - * @var BigInteger $max - */ - list($min) = $min->divide($n); - $min = $min->add(self::$one); - list($max) = $max->divide($n); - $primes[$i] = BigInteger::randomRangePrime($min, $max); - } - // the first coefficient is calculated differently from the rest - // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) - if ($i > 2) { - $coefficients[$i] = $n->modInverse($primes[$i]); - } - $n = $n->multiply($primes[$i]); - $temp = $primes[$i]->subtract(self::$one); - // textbook RSA implementations use Euler's totient function instead of the least common multiple. - // see http://en.wikipedia.org/wiki/Euler%27s_totient_function - $lcm['top'] = $lcm['top']->multiply($temp); - $lcm['bottom'] = $lcm['bottom'] === \false ? $temp : $lcm['bottom']->gcd($temp); - } - list($temp) = $lcm['top']->divide($lcm['bottom']); - $gcd = $temp->gcd($e); - $i0 = 1; - } while (!$gcd->equals(self::$one)); - $coefficients[2] = $primes[2]->modInverse($primes[1]); - $d = $e->modInverse($temp); - foreach ($primes as $i => $prime) { - $temp = $prime->subtract(self::$one); - $exponents[$i] = $e->modInverse($temp); - } - // from : - // RSAPrivateKey ::= SEQUENCE { - // version Version, - // modulus INTEGER, -- n - // publicExponent INTEGER, -- e - // privateExponent INTEGER, -- d - // prime1 INTEGER, -- p - // prime2 INTEGER, -- q - // exponent1 INTEGER, -- d mod (p-1) - // exponent2 INTEGER, -- d mod (q-1) - // coefficient INTEGER, -- (inverse of q) mod p - // otherPrimeInfos OtherPrimeInfos OPTIONAL - // } - $privatekey = new PrivateKey(); - $privatekey->modulus = $n; - $privatekey->k = $bits >> 3; - $privatekey->publicExponent = $e; - $privatekey->exponent = $d; - $privatekey->primes = $primes; - $privatekey->exponents = $exponents; - $privatekey->coefficients = $coefficients; - /* - $publickey = new PublicKey; - $publickey->modulus = $n; - $publickey->k = $bits >> 3; - $publickey->exponent = $e; - $publickey->publicExponent = $e; - $publickey->isPublic = true; - */ - return $privatekey; - } - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - $key = $components['isPublicKey'] ? new PublicKey() : new PrivateKey(); - $key->modulus = $components['modulus']; - $key->publicExponent = $components['publicExponent']; - $key->k = $key->modulus->getLengthInBytes(); - if ($components['isPublicKey'] || !isset($components['privateExponent'])) { - $key->exponent = $key->publicExponent; - } else { - $key->privateExponent = $components['privateExponent']; - $key->exponent = $key->privateExponent; - $key->primes = $components['primes']; - $key->exponents = $components['exponents']; - $key->coefficients = $components['coefficients']; - } - if ($components['format'] == PSS::class) { - // in the X509 world RSA keys are assumed to use PKCS1 padding by default. only if the key is - // explicitly a PSS key is the use of PSS assumed. phpseclib does not work like this. phpseclib - // uses PSS padding by default. it assumes the more secure method by default and altho it provides - // for the less secure PKCS1 method you have to go out of your way to use it. this is consistent - // with the latest trends in crypto. libsodium (NaCl) is actually a little more extreme in that - // not only does it defaults to the most secure methods - it doesn't even let you choose less - // secure methods - //$key = $key->withPadding(self::SIGNATURE_PSS); - if (isset($components['hash'])) { - $key = $key->withHash($components['hash']); - } - if (isset($components['MGFHash'])) { - $key = $key->withMGFHash($components['MGFHash']); - } - if (isset($components['saltLength'])) { - $key = $key->withSaltLength($components['saltLength']); - } - } - return $key; - } - /** - * Initialize static variables - */ - protected static function initialize_static_variables() - { - if (!isset(self::$configFile)) { - self::$configFile = \dirname(__FILE__) . '/../openssl.cnf'; - } - parent::initialize_static_variables(); - } - /** - * Constructor - * - * PublicKey and PrivateKey objects can only be created from abstract RSA class - */ - protected function __construct() - { - parent::__construct(); - $this->hLen = $this->hash->getLengthInBytes(); - $this->mgfHash = new \phpseclib3\Crypt\Hash('sha256'); - $this->mgfHLen = $this->mgfHash->getLengthInBytes(); - } - /** - * Integer-to-Octet-String primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. - * - * @param bool|\phpseclib3\Math\BigInteger $x - * @param int $xLen - * @return bool|string - */ - protected function i2osp($x, $xLen) - { - if ($x === \false) { - return \false; - } - $x = $x->toBytes(); - if (\strlen($x) > $xLen) { - throw new \OutOfRangeException('Resultant string length out of range'); - } - return \str_pad($x, $xLen, \chr(0), \STR_PAD_LEFT); - } - /** - * Octet-String-to-Integer primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. - * - * @param string $x - * @return \phpseclib3\Math\BigInteger - */ - protected function os2ip($x) - { - return new BigInteger($x, 256); - } - /** - * EMSA-PKCS1-V1_5-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. - * - * @param string $m - * @param int $emLen - * @throws \LengthException if the intended encoded message length is too short - * @return string - */ - protected function emsa_pkcs1_v1_5_encode($m, $emLen) - { - $h = $this->hash->hash($m); - // see http://tools.ietf.org/html/rfc3447#page-43 - switch ($this->hash->getHash()) { - case 'md2': - $t = "0 0\f\x06\x08*\x86H\x86\xf7\r\x02\x02\x05\x00\x04\x10"; - break; - case 'md5': - $t = "0 0\f\x06\x08*\x86H\x86\xf7\r\x02\x05\x05\x00\x04\x10"; - break; - case 'sha1': - $t = "0!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14"; - break; - case 'sha256': - $t = "010\r\x06\t`\x86H\x01e\x03\x04\x02\x01\x05\x00\x04 "; - break; - case 'sha384': - $t = "0A0\r\x06\t`\x86H\x01e\x03\x04\x02\x02\x05\x00\x040"; - break; - case 'sha512': - $t = "0Q0\r\x06\t`\x86H\x01e\x03\x04\x02\x03\x05\x00\x04@"; - break; - // from https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf#page=40 - case 'sha224': - $t = "0-0\r\x06\t`\x86H\x01e\x03\x04\x02\x04\x05\x00\x04\x1c"; - break; - case 'sha512/224': - $t = "0-0\r\x06\t`\x86H\x01e\x03\x04\x02\x05\x05\x00\x04\x1c"; - break; - case 'sha512/256': - $t = "010\r\x06\t`\x86H\x01e\x03\x04\x02\x06\x05\x00\x04 "; - } - $t .= $h; - $tLen = \strlen($t); - if ($emLen < $tLen + 11) { - throw new \LengthException('Intended encoded message length too short'); - } - $ps = \str_repeat(\chr(0xff), $emLen - $tLen - 3); - $em = "\x00\x01{$ps}\x00{$t}"; - return $em; - } - /** - * EMSA-PKCS1-V1_5-ENCODE (without NULL) - * - * Quoting https://tools.ietf.org/html/rfc8017#page-65, - * - * "The parameters field associated with id-sha1, id-sha224, id-sha256, - * id-sha384, id-sha512, id-sha512/224, and id-sha512/256 should - * generally be omitted, but if present, it shall have a value of type - * NULL" - * - * @param string $m - * @param int $emLen - * @return string - */ - protected function emsa_pkcs1_v1_5_encode_without_null($m, $emLen) - { - $h = $this->hash->hash($m); - // see http://tools.ietf.org/html/rfc3447#page-43 - switch ($this->hash->getHash()) { - case 'sha1': - $t = "0\x1f0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14"; - break; - case 'sha256': - $t = "0/0\v\x06\t`\x86H\x01e\x03\x04\x02\x01\x04 "; - break; - case 'sha384': - $t = "0?0\v\x06\t`\x86H\x01e\x03\x04\x02\x02\x040"; - break; - case 'sha512': - $t = "0O0\v\x06\t`\x86H\x01e\x03\x04\x02\x03\x04@"; - break; - // from https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf#page=40 - case 'sha224': - $t = "0+0\v\x06\t`\x86H\x01e\x03\x04\x02\x04\x04\x1c"; - break; - case 'sha512/224': - $t = "0+0\v\x06\t`\x86H\x01e\x03\x04\x02\x05\x04\x1c"; - break; - case 'sha512/256': - $t = "0/0\v\x06\t`\x86H\x01e\x03\x04\x02\x06\x04 "; - break; - default: - throw new UnsupportedAlgorithmException('md2 and md5 require NULLs'); - } - $t .= $h; - $tLen = \strlen($t); - if ($emLen < $tLen + 11) { - throw new \LengthException('Intended encoded message length too short'); - } - $ps = \str_repeat(\chr(0xff), $emLen - $tLen - 3); - $em = "\x00\x01{$ps}\x00{$t}"; - return $em; - } - /** - * MGF1 - * - * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. - * - * @param string $mgfSeed - * @param int $maskLen - * @return string - */ - protected function mgf1($mgfSeed, $maskLen) - { - // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. - $t = ''; - $count = \ceil($maskLen / $this->mgfHLen); - for ($i = 0; $i < $count; $i++) { - $c = \pack('N', $i); - $t .= $this->mgfHash->hash($mgfSeed . $c); - } - return \substr($t, 0, $maskLen); - } - /** - * Returns the key size - * - * More specifically, this returns the size of the modulo in bits. - * - * @return int - */ - public function getLength() - { - return !isset($this->modulus) ? 0 : $this->modulus->getLength(); - } - /** - * Determines which hashing function should be used - * - * Used with signature production / verification and (if the encryption mode is self::PADDING_OAEP) encryption and - * decryption. - * - * @param string $hash - */ - public function withHash($hash) - { - $new = clone $this; - // \phpseclib3\Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch (\strtolower($hash)) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - case 'sha224': - case 'sha512/224': - case 'sha512/256': - $new->hash = new \phpseclib3\Crypt\Hash($hash); - break; - default: - throw new UnsupportedAlgorithmException('The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256'); - } - $new->hLen = $new->hash->getLengthInBytes(); - return $new; - } - /** - * Determines which hashing function should be used for the mask generation function - * - * The mask generation function is used by self::PADDING_OAEP and self::PADDING_PSS and although it's - * best if Hash and MGFHash are set to the same thing this is not a requirement. - * - * @param string $hash - */ - public function withMGFHash($hash) - { - $new = clone $this; - // \phpseclib3\Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch (\strtolower($hash)) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - case 'sha224': - case 'sha512/224': - case 'sha512/256': - $new->mgfHash = new \phpseclib3\Crypt\Hash($hash); - break; - default: - throw new UnsupportedAlgorithmException('The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256'); - } - $new->mgfHLen = $new->mgfHash->getLengthInBytes(); - return $new; - } - /** - * Returns the MGF hash algorithm currently being used - * - */ - public function getMGFHash() - { - return clone $this->mgfHash; - } - /** - * Determines the salt length - * - * Used by RSA::PADDING_PSS - * - * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: - * - * Typical salt lengths in octets are hLen (the length of the output - * of the hash function Hash) and 0. - * - * @param int $sLen - */ - public function withSaltLength($sLen) - { - $new = clone $this; - $new->sLen = $sLen; - return $new; - } - /** - * Returns the salt length currently being used - * - */ - public function getSaltLength() - { - return $this->sLen !== null ? $this->sLen : $this->hLen; - } - /** - * Determines the label - * - * Used by RSA::PADDING_OAEP - * - * To quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: - * - * Both the encryption and the decryption operations of RSAES-OAEP take - * the value of a label L as input. In this version of PKCS #1, L is - * the empty string; other uses of the label are outside the scope of - * this document. - * - * @param string $label - */ - public function withLabel($label) - { - $new = clone $this; - $new->label = $label; - return $new; - } - /** - * Returns the label currently being used - * - */ - public function getLabel() - { - return $this->label; - } - /** - * Determines the padding modes - * - * Example: $key->withPadding(RSA::ENCRYPTION_PKCS1 | RSA::SIGNATURE_PKCS1); - * - * @param int $padding - */ - public function withPadding($padding) - { - $masks = [self::ENCRYPTION_OAEP, self::ENCRYPTION_PKCS1, self::ENCRYPTION_NONE]; - $encryptedCount = 0; - $selected = 0; - foreach ($masks as $mask) { - if ($padding & $mask) { - $selected = $mask; - $encryptedCount++; - } - } - if ($encryptedCount > 1) { - throw new InconsistentSetupException('Multiple encryption padding modes have been selected; at most only one should be selected'); - } - $encryptionPadding = $selected; - $masks = [self::SIGNATURE_PSS, self::SIGNATURE_RELAXED_PKCS1, self::SIGNATURE_PKCS1]; - $signatureCount = 0; - $selected = 0; - foreach ($masks as $mask) { - if ($padding & $mask) { - $selected = $mask; - $signatureCount++; - } - } - if ($signatureCount > 1) { - throw new InconsistentSetupException('Multiple signature padding modes have been selected; at most only one should be selected'); - } - $signaturePadding = $selected; - $new = clone $this; - if ($encryptedCount) { - $new->encryptionPadding = $encryptionPadding; - } - if ($signatureCount) { - $new->signaturePadding = $signaturePadding; - } - return $new; - } - /** - * Returns the padding currently being used - * - */ - public function getPadding() - { - return $this->signaturePadding | $this->encryptionPadding; - } - /** - * Returns the current engine being used - * - * OpenSSL is only used in this class (and it's subclasses) for key generation - * Even then it depends on the parameters you're using. It's not used for - * multi-prime RSA nor is it used if the key length is outside of the range - * supported by OpenSSL - * - * @see self::useInternalEngine() - * @see self::useBestEngine() - * @return string - */ - public function getEngine() - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - return self::$engines['OpenSSL'] && self::$defaultExponent == 65537 ? 'OpenSSL' : 'PHP'; - } - /** - * Enable RSA Blinding - * - */ - public static function enableBlinding() - { - static::$enableBlinding = \true; - } - /** - * Disable RSA Blinding - * - */ - public static function disableBlinding() - { - static::$enableBlinding = \false; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php deleted file mode 100644 index dea3aee..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\JWK as Progenitor; -use phpseclib3\Math\BigInteger; -/** - * JWK Formatted RSA Handler - * - * @author Jim Wigginton - */ -abstract class JWK extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - if ($key->kty != 'RSA') { - throw new \RuntimeException('Only RSA JWK keys are supported'); - } - $count = $publicCount = 0; - $vars = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'qi']; - foreach ($vars as $var) { - if (!isset($key->{$var}) || !\is_string($key->{$var})) { - continue; - } - $count++; - $value = new BigInteger(Strings::base64url_decode($key->{$var}), 256); - switch ($var) { - case 'n': - $publicCount++; - $components['modulus'] = $value; - break; - case 'e': - $publicCount++; - $components['publicExponent'] = $value; - break; - case 'd': - $components['privateExponent'] = $value; - break; - case 'p': - $components['primes'][1] = $value; - break; - case 'q': - $components['primes'][2] = $value; - break; - case 'dp': - $components['exponents'][1] = $value; - break; - case 'dq': - $components['exponents'][2] = $value; - break; - case 'qi': - $components['coefficients'][2] = $value; - } - } - if ($count == \count($vars)) { - return $components + ['isPublicKey' => \false]; - } - if ($count == 2 && $publicCount == 2) { - return $components + ['isPublicKey' => \true]; - } - throw new \UnexpectedValueException('Key does not have an appropriate number of RSA parameters'); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - if (\count($primes) != 2) { - throw new \InvalidArgumentException('JWK does not support multi-prime RSA keys'); - } - $key = ['kty' => 'RSA', 'n' => Strings::base64url_encode($n->toBytes()), 'e' => Strings::base64url_encode($e->toBytes()), 'd' => Strings::base64url_encode($d->toBytes()), 'p' => Strings::base64url_encode($primes[1]->toBytes()), 'q' => Strings::base64url_encode($primes[2]->toBytes()), 'dp' => Strings::base64url_encode($exponents[1]->toBytes()), 'dq' => Strings::base64url_encode($exponents[2]->toBytes()), 'qi' => Strings::base64url_encode($coefficients[2]->toBytes())]; - return self::wrapKey($key, $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - $key = ['kty' => 'RSA', 'n' => Strings::base64url_encode($n->toBytes()), 'e' => Strings::base64url_encode($e->toBytes())]; - return self::wrapKey($key, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php deleted file mode 100644 index 34c46d3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php +++ /dev/null @@ -1,207 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\Math\BigInteger; -/** - * Microsoft BLOB Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class MSBLOB -{ - /** - * Public/Private Key Pair - * - */ - const PRIVATEKEYBLOB = 0x7; - /** - * Public Key - * - */ - const PUBLICKEYBLOB = 0x6; - /** - * Public Key - * - */ - const PUBLICKEYBLOBEX = 0xa; - /** - * RSA public key exchange algorithm - * - */ - const CALG_RSA_KEYX = 0xa400; - /** - * RSA public key exchange algorithm - * - */ - const CALG_RSA_SIGN = 0x2400; - /** - * Public Key - * - */ - const RSA1 = 0x31415352; - /** - * Private Key - * - */ - const RSA2 = 0x32415352; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - $key = Strings::base64_decode($key); - if (!\is_string($key)) { - throw new \UnexpectedValueException('Base64 decoding produced an error'); - } - if (\strlen($key) < 20) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - // PUBLICKEYSTRUC publickeystruc - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387453(v=vs.85).aspx - \extract(\unpack('atype/aversion/vreserved/Valgo', Strings::shift($key, 8))); - /** - * @var string $type - * @var string $version - * @var integer $reserved - * @var integer $algo - */ - switch (\ord($type)) { - case self::PUBLICKEYBLOB: - case self::PUBLICKEYBLOBEX: - $publickey = \true; - break; - case self::PRIVATEKEYBLOB: - $publickey = \false; - break; - default: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $components = ['isPublicKey' => $publickey]; - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx - switch ($algo) { - case self::CALG_RSA_KEYX: - case self::CALG_RSA_SIGN: - break; - default: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - // RSAPUBKEY rsapubkey - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387685(v=vs.85).aspx - // could do V for pubexp but that's unsigned 32-bit whereas some PHP installs only do signed 32-bit - \extract(\unpack('Vmagic/Vbitlen/a4pubexp', Strings::shift($key, 12))); - /** - * @var integer $magic - * @var integer $bitlen - * @var string $pubexp - */ - switch ($magic) { - case self::RSA2: - $components['isPublicKey'] = \false; - // fall-through - case self::RSA1: - break; - default: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $baseLength = $bitlen / 16; - if (\strlen($key) != 2 * $baseLength && \strlen($key) != 9 * $baseLength) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $components[$components['isPublicKey'] ? 'publicExponent' : 'privateExponent'] = new BigInteger(\strrev($pubexp), 256); - // BYTE modulus[rsapubkey.bitlen/8] - $components['modulus'] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 8)), 256); - if ($publickey) { - return $components; - } - $components['isPublicKey'] = \false; - // BYTE prime1[rsapubkey.bitlen/16] - $components['primes'] = [1 => new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256)]; - // BYTE prime2[rsapubkey.bitlen/16] - $components['primes'][] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256); - // BYTE exponent1[rsapubkey.bitlen/16] - $components['exponents'] = [1 => new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256)]; - // BYTE exponent2[rsapubkey.bitlen/16] - $components['exponents'][] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256); - // BYTE coefficient[rsapubkey.bitlen/16] - $components['coefficients'] = [2 => new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256)]; - if (isset($components['privateExponent'])) { - $components['publicExponent'] = $components['privateExponent']; - } - // BYTE privateExponent[rsapubkey.bitlen/8] - $components['privateExponent'] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 8)), 256); - return $components; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '') - { - if (\count($primes) != 2) { - throw new \InvalidArgumentException('MSBLOB does not support multi-prime RSA keys'); - } - if (!empty($password) && \is_string($password)) { - throw new UnsupportedFormatException('MSBLOB private keys do not support encryption'); - } - $n = \strrev($n->toBytes()); - $e = \str_pad(\strrev($e->toBytes()), 4, "\x00"); - $key = \pack('aavV', \chr(self::PRIVATEKEYBLOB), \chr(2), 0, self::CALG_RSA_KEYX); - $key .= \pack('VVa*', self::RSA2, 8 * \strlen($n), $e); - $key .= $n; - $key .= \strrev($primes[1]->toBytes()); - $key .= \strrev($primes[2]->toBytes()); - $key .= \strrev($exponents[1]->toBytes()); - $key .= \strrev($exponents[2]->toBytes()); - $key .= \strrev($coefficients[2]->toBytes()); - $key .= \strrev($d->toBytes()); - return Strings::base64_encode($key); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - $n = \strrev($n->toBytes()); - $e = \str_pad(\strrev($e->toBytes()), 4, "\x00"); - $key = \pack('aavV', \chr(self::PUBLICKEYBLOB), \chr(2), 0, self::CALG_RSA_KEYX); - $key .= \pack('VVa*', self::RSA1, 8 * \strlen($n), $e); - $key .= $n; - return Strings::base64_encode($key); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php deleted file mode 100644 index 7d8ada0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,101 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; -use phpseclib3\Math\BigInteger; -/** - * OpenSSH Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH extends Progenitor -{ - /** - * Supported Key Types - * - * @var array - */ - protected static $types = ['ssh-rsa']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - $parsed = parent::load($key, $password); - if (isset($parsed['paddedKey'])) { - list($type) = Strings::unpackSSH2('s', $parsed['paddedKey']); - if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ({$type} vs {$parsed['type']})"); - } - $primes = $coefficients = []; - list($modulus, $publicExponent, $privateExponent, $coefficients[2], $primes[1], $primes[2], $comment, ) = Strings::unpackSSH2('i6s', $parsed['paddedKey']); - $temp = $primes[1]->subtract($one); - $exponents = [1 => $publicExponent->modInverse($temp)]; - $temp = $primes[2]->subtract($one); - $exponents[] = $publicExponent->modInverse($temp); - $isPublicKey = \false; - return \compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); - } - list($publicExponent, $modulus) = Strings::unpackSSH2('ii', $parsed['publicKey']); - return ['isPublicKey' => \true, 'modulus' => $modulus, 'publicExponent' => $publicExponent, 'comment' => $parsed['comment']]; - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - $RSAPublicKey = Strings::packSSH2('sii', 'ssh-rsa', $e, $n); - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $RSAPublicKey; - } - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $RSAPublicKey = 'ssh-rsa ' . \base64_encode($RSAPublicKey) . ' ' . $comment; - return $RSAPublicKey; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - $publicKey = self::savePublicKey($n, $e, ['binary' => \true]); - $privateKey = Strings::packSSH2('si6', 'ssh-rsa', $n, $e, $d, $coefficients[2], $primes[1], $primes[2]); - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php deleted file mode 100644 index 8005ead..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,120 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * PKCS#1 Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - if (\strpos($key, 'PUBLIC') !== \false) { - $components = ['isPublicKey' => \true]; - } elseif (\strpos($key, 'PRIVATE') !== \false) { - $components = ['isPublicKey' => \false]; - } else { - $components = []; - } - $key = parent::load($key, $password); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $key = ASN1::asn1map($decoded[0], Maps\RSAPrivateKey::MAP); - if (\is_array($key)) { - $components += ['modulus' => $key['modulus'], 'publicExponent' => $key['publicExponent'], 'privateExponent' => $key['privateExponent'], 'primes' => [1 => $key['prime1'], $key['prime2']], 'exponents' => [1 => $key['exponent1'], $key['exponent2']], 'coefficients' => [2 => $key['coefficient']]]; - if ($key['version'] == 'multi') { - foreach ($key['otherPrimeInfos'] as $primeInfo) { - $components['primes'][] = $primeInfo['prime']; - $components['exponents'][] = $primeInfo['exponent']; - $components['coefficients'][] = $primeInfo['coefficient']; - } - } - if (!isset($components['isPublicKey'])) { - $components['isPublicKey'] = \false; - } - return $components; - } - $key = ASN1::asn1map($decoded[0], Maps\RSAPublicKey::MAP); - if (!\is_array($key)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - if (!isset($components['isPublicKey'])) { - $components['isPublicKey'] = \true; - } - return $components + $key; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - $num_primes = \count($primes); - $key = ['version' => $num_primes == 2 ? 'two-prime' : 'multi', 'modulus' => $n, 'publicExponent' => $e, 'privateExponent' => $d, 'prime1' => $primes[1], 'prime2' => $primes[2], 'exponent1' => $exponents[1], 'exponent2' => $exponents[2], 'coefficient' => $coefficients[2]]; - for ($i = 3; $i <= $num_primes; $i++) { - $key['otherPrimeInfos'][] = ['prime' => $primes[$i], 'exponent' => $exponents[$i], 'coefficient' => $coefficients[$i]]; - } - $key = ASN1::encodeDER($key, Maps\RSAPrivateKey::MAP); - return self::wrapPrivateKey($key, 'RSA', $password, $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - $key = ['modulus' => $n, 'publicExponent' => $e]; - $key = ASN1::encodeDER($key, Maps\RSAPublicKey::MAP); - return self::wrapPublicKey($key, 'RSA'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php deleted file mode 100644 index 12a65c5..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,111 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\Math\BigInteger; -/** - * PKCS#8 Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'rsaEncryption'; - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.113549.1.1.1'; - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = \false; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - if (isset($key['privateKey'])) { - $components['isPublicKey'] = \false; - $type = 'private'; - } else { - $components['isPublicKey'] = \true; - $type = 'public'; - } - $result = $components + \phpseclib3\Crypt\RSA\Formats\Keys\PKCS1::load($key[$type . 'Key']); - if (isset($key['meta'])) { - $result['meta'] = $key['meta']; - } - return $result; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - $key = \phpseclib3\Crypt\RSA\Formats\Keys\PKCS1::savePrivateKey($n, $e, $d, $primes, $exponents, $coefficients); - $key = ASN1::extractBER($key); - return self::wrapPrivateKey($key, [], null, $password, null, '', $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - $key = \phpseclib3\Crypt\RSA\Formats\Keys\PKCS1::savePublicKey($n, $e); - $key = ASN1::extractBER($key); - return self::wrapPublicKey($key, null); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php deleted file mode 100644 index c35218c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php +++ /dev/null @@ -1,193 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * PKCS#8 Formatted RSA-PSS Key Handler - * - * @author Jim Wigginton - */ -abstract class PSS extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'id-RSASSA-PSS'; - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.113549.1.1.10'; - /** - * OIDs loaded - * - * @var bool - */ - private static $oidsLoaded = \false; - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = \false; - /** - * Initialize static variables - */ - private static function initialize_static_variables() - { - if (!self::$oidsLoaded) { - ASN1::loadOIDs(['md2' => '1.2.840.113549.2.2', 'md4' => '1.2.840.113549.2.4', 'md5' => '1.2.840.113549.2.5', 'id-sha1' => '1.3.14.3.2.26', 'id-sha256' => '2.16.840.1.101.3.4.2.1', 'id-sha384' => '2.16.840.1.101.3.4.2.2', 'id-sha512' => '2.16.840.1.101.3.4.2.3', 'id-sha224' => '2.16.840.1.101.3.4.2.4', 'id-sha512/224' => '2.16.840.1.101.3.4.2.5', 'id-sha512/256' => '2.16.840.1.101.3.4.2.6', 'id-mgf1' => '1.2.840.113549.1.1.8']); - self::$oidsLoaded = \true; - } - } - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - self::initialize_static_variables(); - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - $components = ['isPublicKey' => \strpos($key, 'PUBLIC') !== \false]; - $key = parent::load($key, $password); - $type = isset($key['privateKey']) ? 'private' : 'public'; - $result = $components + \phpseclib3\Crypt\RSA\Formats\Keys\PKCS1::load($key[$type . 'Key']); - if (isset($key[$type . 'KeyAlgorithm']['parameters'])) { - $decoded = ASN1::decodeBER($key[$type . 'KeyAlgorithm']['parameters']); - if ($decoded === \false) { - throw new \UnexpectedValueException('Unable to decode parameters'); - } - $params = ASN1::asn1map($decoded[0], Maps\RSASSA_PSS_params::MAP); - } else { - $params = []; - } - if (isset($params['maskGenAlgorithm']['parameters'])) { - $decoded = ASN1::decodeBER($params['maskGenAlgorithm']['parameters']); - if ($decoded === \false) { - throw new \UnexpectedValueException('Unable to decode parameters'); - } - $params['maskGenAlgorithm']['parameters'] = ASN1::asn1map($decoded[0], Maps\HashAlgorithm::MAP); - } else { - $params['maskGenAlgorithm'] = ['algorithm' => 'id-mgf1', 'parameters' => ['algorithm' => 'id-sha1']]; - } - if (!isset($params['hashAlgorithm']['algorithm'])) { - $params['hashAlgorithm']['algorithm'] = 'id-sha1'; - } - $result['hash'] = \str_replace('id-', '', $params['hashAlgorithm']['algorithm']); - $result['MGFHash'] = \str_replace('id-', '', $params['maskGenAlgorithm']['parameters']['algorithm']); - if (isset($params['saltLength'])) { - $result['saltLength'] = (int) $params['saltLength']->toString(); - } - if (isset($key['meta'])) { - $result['meta'] = $key['meta']; - } - return $result; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - self::initialize_static_variables(); - $key = \phpseclib3\Crypt\RSA\Formats\Keys\PKCS1::savePrivateKey($n, $e, $d, $primes, $exponents, $coefficients); - $key = ASN1::extractBER($key); - $params = self::savePSSParams($options); - return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - self::initialize_static_variables(); - $key = \phpseclib3\Crypt\RSA\Formats\Keys\PKCS1::savePublicKey($n, $e); - $key = ASN1::extractBER($key); - $params = self::savePSSParams($options); - return self::wrapPublicKey($key, $params); - } - /** - * Encodes PSS parameters - * - * @param array $options - * @return string - */ - public static function savePSSParams(array $options) - { - /* - The trailerField field is an integer. It provides - compatibility with IEEE Std 1363a-2004 [P1363A]. The value - MUST be 1, which represents the trailer field with hexadecimal - value 0xBC. Other trailer fields, including the trailer field - composed of HashID concatenated with 0xCC that is specified in - IEEE Std 1363a, are not supported. Implementations that - perform signature generation MUST omit the trailerField field, - indicating that the default trailer field value was used. - Implementations that perform signature validation MUST - recognize both a present trailerField field with value 1 and an - absent trailerField field. - - source: https://tools.ietf.org/html/rfc4055#page-9 - */ - $params = ['trailerField' => new BigInteger(1)]; - if (isset($options['hash'])) { - $params['hashAlgorithm']['algorithm'] = 'id-' . $options['hash']; - } - if (isset($options['MGFHash'])) { - $temp = ['algorithm' => 'id-' . $options['MGFHash']]; - $temp = ASN1::encodeDER($temp, Maps\HashAlgorithm::MAP); - $params['maskGenAlgorithm'] = ['algorithm' => 'id-mgf1', 'parameters' => new ASN1\Element($temp)]; - } - if (isset($options['saltLength'])) { - $params['saltLength'] = new BigInteger($options['saltLength']); - } - return new ASN1\Element(ASN1::encodeDER($params, Maps\RSASSA_PSS_params::MAP)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php deleted file mode 100644 index 563f52c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; -use phpseclib3\Math\BigInteger; -/** - * PuTTY Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY extends Progenitor -{ - /** - * Public Handler - * - * @var string - */ - const PUBLIC_HANDLER = 'phpseclib3\\Crypt\\RSA\\Formats\\Keys\\OpenSSH'; - /** - * Algorithm Identifier - * - * @var array - */ - protected static $types = ['ssh-rsa']; - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - $components = parent::load($key, $password); - if (!isset($components['private'])) { - return $components; - } - \extract($components); - unset($components['public'], $components['private']); - $isPublicKey = \false; - $result = Strings::unpackSSH2('ii', $public); - if ($result === \false) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - list($publicExponent, $modulus) = $result; - $result = Strings::unpackSSH2('iiii', $private); - if ($result === \false) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $primes = $coefficients = []; - list($privateExponent, $primes[1], $primes[2], $coefficients[2]) = $result; - $temp = $primes[1]->subtract($one); - $exponents = [1 => $publicExponent->modInverse($temp)]; - $temp = $primes[2]->subtract($one); - $exponents[] = $publicExponent->modInverse($temp); - return \compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - if (\count($primes) != 2) { - throw new \InvalidArgumentException('PuTTY does not support multi-prime RSA keys'); - } - $public = Strings::packSSH2('ii', $e, $n); - $private = Strings::packSSH2('iiii', $d, $primes[1], $primes[2], $coefficients[2]); - return self::wrapPrivateKey($public, $private, 'ssh-rsa', $password, $options); - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - return self::wrapPublicKey(Strings::packSSH2('ii', $e, $n), 'ssh-rsa'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php deleted file mode 100644 index 692e3b4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php +++ /dev/null @@ -1,153 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Math\BigInteger; -/** - * Raw RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class Raw -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!\is_array($key)) { - throw new \UnexpectedValueException('Key should be a array - not a ' . \gettype($key)); - } - $key = \array_change_key_case($key, \CASE_LOWER); - $components = ['isPublicKey' => \false]; - foreach (['e', 'exponent', 'publicexponent', 0, 'privateexponent', 'd'] as $index) { - if (isset($key[$index])) { - $components['publicExponent'] = $key[$index]; - break; - } - } - foreach (['n', 'modulo', 'modulus', 1] as $index) { - if (isset($key[$index])) { - $components['modulus'] = $key[$index]; - break; - } - } - if (!isset($components['publicExponent']) || !isset($components['modulus'])) { - throw new \UnexpectedValueException('Modulus / exponent not present'); - } - if (isset($key['primes'])) { - $components['primes'] = $key['primes']; - } elseif (isset($key['p']) && isset($key['q'])) { - $indices = [['p', 'q'], ['prime1', 'prime2']]; - foreach ($indices as $index) { - list($i0, $i1) = $index; - if (isset($key[$i0]) && isset($key[$i1])) { - $components['primes'] = [1 => $key[$i0], $key[$i1]]; - } - } - } - if (isset($key['exponents'])) { - $components['exponents'] = $key['exponents']; - } else { - $indices = [['dp', 'dq'], ['exponent1', 'exponent2']]; - foreach ($indices as $index) { - list($i0, $i1) = $index; - if (isset($key[$i0]) && isset($key[$i1])) { - $components['exponents'] = [1 => $key[$i0], $key[$i1]]; - } - } - } - if (isset($key['coefficients'])) { - $components['coefficients'] = $key['coefficients']; - } else { - foreach (['inverseq', 'q\'', 'coefficient'] as $index) { - if (isset($key[$index])) { - $components['coefficients'] = [2 => $key[$index]]; - } - } - } - if (!isset($components['primes'])) { - $components['isPublicKey'] = \true; - return $components; - } - if (!isset($components['exponents'])) { - $one = new BigInteger(1); - $temp = $components['primes'][1]->subtract($one); - $exponents = [1 => $components['publicExponent']->modInverse($temp)]; - $temp = $components['primes'][2]->subtract($one); - $exponents[] = $components['publicExponent']->modInverse($temp); - $components['exponents'] = $exponents; - } - if (!isset($components['coefficients'])) { - $components['coefficients'] = [2 => $components['primes'][2]->modInverse($components['primes'][1])]; - } - foreach (['privateexponent', 'd'] as $index) { - if (isset($key[$index])) { - $components['privateExponent'] = $key[$index]; - break; - } - } - return $components; - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return array - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - if (!empty($password) && \is_string($password)) { - throw new \phpseclib3\Crypt\RSA\Formats\Keys\UnsupportedFormatException('Raw private keys do not support encryption'); - } - return ['e' => clone $e, 'n' => clone $n, 'd' => clone $d, 'primes' => \array_map(function ($var) { - return clone $var; - }, $primes), 'exponents' => \array_map(function ($var) { - return clone $var; - }, $exponents), 'coefficients' => \array_map(function ($var) { - return clone $var; - }, $coefficients)]; - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @return array - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - return ['e' => clone $e, 'n' => clone $n]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php deleted file mode 100644 index 0edb448..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php +++ /dev/null @@ -1,140 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA\Formats\Keys; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\BadConfigurationException; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\Math\BigInteger; -/** - * XML Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class XML -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); - } - if (!\class_exists('DOMDocument')) { - throw new BadConfigurationException('The dom extension is not setup correctly on this system'); - } - $components = ['isPublicKey' => \false, 'primes' => [], 'exponents' => [], 'coefficients' => []]; - $use_errors = \libxml_use_internal_errors(\true); - $dom = new \DOMDocument(); - if (\substr($key, 0, 5) != '' . $key . ''; - } - if (!$dom->loadXML($key)) { - \libxml_use_internal_errors($use_errors); - throw new \UnexpectedValueException('Key does not appear to contain XML'); - } - $xpath = new \DOMXPath($dom); - $keys = ['modulus', 'exponent', 'p', 'q', 'dp', 'dq', 'inverseq', 'd']; - foreach ($keys as $key) { - // $dom->getElementsByTagName($key) is case-sensitive - $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{$key}']"); - if (!$temp->length) { - continue; - } - $value = new BigInteger(Strings::base64_decode($temp->item(0)->nodeValue), 256); - switch ($key) { - case 'modulus': - $components['modulus'] = $value; - break; - case 'exponent': - $components['publicExponent'] = $value; - break; - case 'p': - $components['primes'][1] = $value; - break; - case 'q': - $components['primes'][2] = $value; - break; - case 'dp': - $components['exponents'][1] = $value; - break; - case 'dq': - $components['exponents'][2] = $value; - break; - case 'inverseq': - $components['coefficients'][2] = $value; - break; - case 'd': - $components['privateExponent'] = $value; - } - } - \libxml_use_internal_errors($use_errors); - foreach ($components as $key => $value) { - if (\is_array($value) && !\count($value)) { - unset($components[$key]); - } - } - if (isset($components['modulus']) && isset($components['publicExponent'])) { - if (\count($components) == 3) { - $components['isPublicKey'] = \true; - } - return $components; - } - throw new \UnexpectedValueException('Modulus / exponent not present'); - } - /** - * Convert a private key to the appropriate format. - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @param \phpseclib3\Math\BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '') - { - if (\count($primes) != 2) { - throw new \InvalidArgumentException('XML does not support multi-prime RSA keys'); - } - if (!empty($password) && \is_string($password)) { - throw new UnsupportedFormatException('XML private keys do not support encryption'); - } - return "\r\n" . ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . '

      ' . Strings::base64_encode($primes[1]->toBytes()) . "

      \r\n" . ' ' . Strings::base64_encode($primes[2]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($exponents[1]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($exponents[2]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($coefficients[2]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($d->toBytes()) . "\r\n" . '
      '; - } - /** - * Convert a public key to the appropriate format - * - * @param \phpseclib3\Math\BigInteger $n - * @param \phpseclib3\Math\BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - return "\r\n" . ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . ''; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php deleted file mode 100644 index 0d04f06..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php +++ /dev/null @@ -1,441 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA; - -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\Random; -use phpseclib3\Crypt\RSA; -use phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\Math\BigInteger; -/** - * Raw RSA Key Handler - * - * @author Jim Wigginton - */ -final class PrivateKey extends RSA implements Common\PrivateKey -{ - use Common\Traits\PasswordProtected; - /** - * Primes for Chinese Remainder Theorem (ie. p and q) - * - * @var array - */ - protected $primes; - /** - * Exponents for Chinese Remainder Theorem (ie. dP and dQ) - * - * @var array - */ - protected $exponents; - /** - * Coefficients for Chinese Remainder Theorem (ie. qInv) - * - * @var array - */ - protected $coefficients; - /** - * Private Exponent - * - * @var \phpseclib3\Math\BigInteger - */ - protected $privateExponent; - /** - * RSADP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. - * - * @return bool|\phpseclib3\Math\BigInteger - */ - private function rsadp(BigInteger $c) - { - if ($c->compare(self::$zero) < 0 || $c->compare($this->modulus) > 0) { - throw new \OutOfRangeException('Ciphertext representative out of range'); - } - return $this->exponentiate($c); - } - /** - * RSASP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. - * - * @return bool|\phpseclib3\Math\BigInteger - */ - private function rsasp1(BigInteger $m) - { - if ($m->compare(self::$zero) < 0 || $m->compare($this->modulus) > 0) { - throw new \OutOfRangeException('Signature representative out of range'); - } - return $this->exponentiate($m); - } - /** - * Exponentiate - * - * @param \phpseclib3\Math\BigInteger $x - * @return \phpseclib3\Math\BigInteger - */ - protected function exponentiate(BigInteger $x) - { - switch (\true) { - case empty($this->primes): - case $this->primes[1]->equals(self::$zero): - case empty($this->coefficients): - case $this->coefficients[2]->equals(self::$zero): - case empty($this->exponents): - case $this->exponents[1]->equals(self::$zero): - return $x->modPow($this->exponent, $this->modulus); - } - $num_primes = \count($this->primes); - if (!static::$enableBlinding) { - $m_i = [1 => $x->modPow($this->exponents[1], $this->primes[1]), 2 => $x->modPow($this->exponents[2], $this->primes[2])]; - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); - $r = $r->multiply($this->primes[$i - 1]); - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - $m = $m->add($r->multiply($h)); - } - } else { - $smallest = $this->primes[1]; - for ($i = 2; $i <= $num_primes; $i++) { - if ($smallest->compare($this->primes[$i]) > 0) { - $smallest = $this->primes[$i]; - } - } - $r = BigInteger::randomRange(self::$one, $smallest->subtract(self::$one)); - $m_i = [1 => $this->blind($x, $r, 1), 2 => $this->blind($x, $r, 2)]; - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $this->blind($x, $r, $i); - $r = $r->multiply($this->primes[$i - 1]); - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - $m = $m->add($r->multiply($h)); - } - } - return $m; - } - /** - * Performs RSA Blinding - * - * Protects against timing attacks by employing RSA Blinding. - * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) - * - * @param \phpseclib3\Math\BigInteger $x - * @param \phpseclib3\Math\BigInteger $r - * @param int $i - * @return \phpseclib3\Math\BigInteger - */ - private function blind(BigInteger $x, BigInteger $r, $i) - { - $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); - $x = $x->modPow($this->exponents[$i], $this->primes[$i]); - $r = $r->modInverse($this->primes[$i]); - $x = $x->multiply($r); - list(, $x) = $x->divide($this->primes[$i]); - return $x; - } - /** - * EMSA-PSS-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. - * - * @return string - * @param string $m - * @throws \RuntimeException on encoding error - * @param int $emBits - */ - private function emsa_pss_encode($m, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - $emLen = $emBits + 1 >> 3; - // ie. ceil($emBits / 8) - $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - throw new \LengthException('RSA modulus too short'); - } - $salt = Random::string($sLen); - $m2 = "\x00\x00\x00\x00\x00\x00\x00\x00" . $mHash . $salt; - $h = $this->hash->hash($m2); - $ps = \str_repeat(\chr(0), $emLen - $sLen - $this->hLen - 2); - $db = $ps . \chr(1) . $salt; - $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); - // ie. stlren($db) - $maskedDB = $db ^ $dbMask; - $maskedDB[0] = ~\chr(0xff << ($emBits & 7)) & $maskedDB[0]; - $em = $maskedDB . $h . \chr(0xbc); - return $em; - } - /** - * RSASSA-PSS-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. - * - * @param string $m - * @return bool|string - */ - private function rsassa_pss_sign($m) - { - // EMSA-PSS encoding - $em = $this->emsa_pss_encode($m, 8 * $this->k - 1); - // RSA signature - $m = $this->os2ip($em); - $s = $this->rsasp1($m); - $s = $this->i2osp($s, $this->k); - // Output the signature S - return $s; - } - /** - * RSASSA-PKCS1-V1_5-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. - * - * @param string $m - * @throws \LengthException if the RSA modulus is too short - * @return bool|string - */ - private function rsassa_pkcs1_v1_5_sign($m) - { - // EMSA-PKCS1-v1_5 encoding - // If the encoding operation outputs "intended encoded message length too short," output "RSA modulus - // too short" and stop. - try { - $em = $this->emsa_pkcs1_v1_5_encode($m, $this->k); - } catch (\LengthException $e) { - throw new \LengthException('RSA modulus too short'); - } - // RSA signature - $m = $this->os2ip($em); - $s = $this->rsasp1($m); - $s = $this->i2osp($s, $this->k); - // Output the signature S - return $s; - } - /** - * Create a signature - * - * @see self::verify() - * @param string $message - * @return string - */ - public function sign($message) - { - switch ($this->signaturePadding) { - case self::SIGNATURE_PKCS1: - case self::SIGNATURE_RELAXED_PKCS1: - return $this->rsassa_pkcs1_v1_5_sign($message); - //case self::SIGNATURE_PSS: - default: - return $this->rsassa_pss_sign($message); - } - } - /** - * RSAES-PKCS1-V1_5-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. - * - * @param string $c - * @return bool|string - */ - private function rsaes_pkcs1_v1_5_decrypt($c) - { - // Length checking - if (\strlen($c) != $this->k) { - // or if k < 11 - throw new \LengthException('Ciphertext representative too long'); - } - // RSA decryption - $c = $this->os2ip($c); - $m = $this->rsadp($c); - $em = $this->i2osp($m, $this->k); - // EME-PKCS1-v1_5 decoding - if (\ord($em[0]) != 0 || \ord($em[1]) > 2) { - throw new \RuntimeException('Decryption error'); - } - $ps = \substr($em, 2, \strpos($em, \chr(0), 2) - 2); - $m = \substr($em, \strlen($ps) + 3); - if (\strlen($ps) < 8) { - throw new \RuntimeException('Decryption error'); - } - // Output M - return $m; - } - /** - * RSAES-OAEP-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error - * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: - * - * Note. Care must be taken to ensure that an opponent cannot - * distinguish the different error conditions in Step 3.g, whether by - * error message or timing, or, more generally, learn partial - * information about the encoded message EM. Otherwise an opponent may - * be able to obtain useful information about the decryption of the - * ciphertext C, leading to a chosen-ciphertext attack such as the one - * observed by Manger [36]. - * - * @param string $c - * @return bool|string - */ - private function rsaes_oaep_decrypt($c) - { - // Length checking - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - if (\strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { - throw new \LengthException('Ciphertext representative too long'); - } - // RSA decryption - $c = $this->os2ip($c); - $m = $this->rsadp($c); - $em = $this->i2osp($m, $this->k); - // EME-OAEP decoding - $lHash = $this->hash->hash($this->label); - $y = \ord($em[0]); - $maskedSeed = \substr($em, 1, $this->hLen); - $maskedDB = \substr($em, $this->hLen + 1); - $seedMask = $this->mgf1($maskedDB, $this->hLen); - $seed = $maskedSeed ^ $seedMask; - $dbMask = $this->mgf1($seed, $this->k - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $lHash2 = \substr($db, 0, $this->hLen); - $m = \substr($db, $this->hLen); - $hashesMatch = \hash_equals($lHash, $lHash2); - $leadingZeros = 1; - $patternMatch = 0; - $offset = 0; - for ($i = 0; $i < \strlen($m); $i++) { - $patternMatch |= $leadingZeros & $m[$i] === "\x01"; - $leadingZeros &= $m[$i] === "\x00"; - $offset += $patternMatch ? 0 : 1; - } - // we do | instead of || to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation - // to protect against timing attacks - if (!$hashesMatch | !$patternMatch) { - throw new \RuntimeException('Decryption error'); - } - // Output the message M - return \substr($m, $offset + 1); - } - /** - * Raw Encryption / Decryption - * - * Doesn't use padding and is not recommended. - * - * @param string $m - * @return bool|string - * @throws \LengthException if strlen($m) > $this->k - */ - private function raw_encrypt($m) - { - if (\strlen($m) > $this->k) { - throw new \LengthException('Ciphertext representative too long'); - } - $temp = $this->os2ip($m); - $temp = $this->rsadp($temp); - return $this->i2osp($temp, $this->k); - } - /** - * Decryption - * - * @see self::encrypt() - * @param string $ciphertext - * @return bool|string - */ - public function decrypt($ciphertext) - { - switch ($this->encryptionPadding) { - case self::ENCRYPTION_NONE: - return $this->raw_encrypt($ciphertext); - case self::ENCRYPTION_PKCS1: - return $this->rsaes_pkcs1_v1_5_decrypt($ciphertext); - //case self::ENCRYPTION_OAEP: - default: - return $this->rsaes_oaep_decrypt($ciphertext); - } - } - /** - * Returns the public key - * - * @return mixed - */ - public function getPublicKey() - { - $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); - if (empty($this->modulus) || empty($this->publicExponent)) { - throw new \RuntimeException('Public key components not found'); - } - $key = $type::savePublicKey($this->modulus, $this->publicExponent); - return RSA::loadFormat('PKCS8', $key)->withHash($this->hash->getHash())->withMGFHash($this->mgfHash->getHash())->withSaltLength($this->sLen)->withLabel($this->label)->withPadding($this->signaturePadding | $this->encryptionPadding); - } - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, empty($this->primes) ? 'savePublicKey' : 'savePrivateKey'); - if ($type == PSS::class) { - if ($this->signaturePadding == self::SIGNATURE_PSS) { - $options += ['hash' => $this->hash->getHash(), 'MGFHash' => $this->mgfHash->getHash(), 'saltLength' => $this->getSaltLength()]; - } else { - throw new UnsupportedFormatException('The PSS format can only be used when the signature method has been explicitly set to PSS'); - } - } - if (empty($this->primes)) { - return $type::savePublicKey($this->modulus, $this->exponent, $options); - } - return $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients, $this->password, $options); - /* - $key = $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients, $this->password, $options); - if ($key !== false || count($this->primes) == 2) { - return $key; - } - - $nSize = $this->getSize() >> 1; - - $primes = [1 => clone self::$one, clone self::$one]; - $i = 1; - foreach ($this->primes as $prime) { - $primes[$i] = $primes[$i]->multiply($prime); - if ($primes[$i]->getLength() >= $nSize) { - $i++; - } - } - - $exponents = []; - $coefficients = [2 => $primes[2]->modInverse($primes[1])]; - - foreach ($primes as $i => $prime) { - $temp = $prime->subtract(self::$one); - $exponents[$i] = $this->modulus->modInverse($temp); - } - - return $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $primes, $exponents, $coefficients, $this->password, $options); - */ - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php deleted file mode 100644 index 2592898..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php +++ /dev/null @@ -1,439 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt\RSA; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\Random; -use phpseclib3\Crypt\RSA; -use phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\Exception\UnsupportedFormatException; -use phpseclib3\File\ASN1; -use phpseclib3\File\ASN1\Maps\DigestInfo; -use phpseclib3\Math\BigInteger; -/** - * Raw RSA Key Handler - * - * @author Jim Wigginton - */ -final class PublicKey extends RSA implements Common\PublicKey -{ - use Common\Traits\Fingerprint; - /** - * Exponentiate - * - * @param \phpseclib3\Math\BigInteger $x - * @return \phpseclib3\Math\BigInteger - */ - private function exponentiate(BigInteger $x) - { - return $x->modPow($this->exponent, $this->modulus); - } - /** - * RSAVP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. - * - * @param \phpseclib3\Math\BigInteger $s - * @return bool|\phpseclib3\Math\BigInteger - */ - private function rsavp1($s) - { - if ($s->compare(self::$zero) < 0 || $s->compare($this->modulus) > 0) { - return \false; - } - return $this->exponentiate($s); - } - /** - * RSASSA-PKCS1-V1_5-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. - * - * @param string $m - * @param string $s - * @throws \LengthException if the RSA modulus is too short - * @return bool - */ - private function rsassa_pkcs1_v1_5_verify($m, $s) - { - // Length checking - if (\strlen($s) != $this->k) { - return \false; - } - // RSA verification - $s = $this->os2ip($s); - $m2 = $this->rsavp1($s); - if ($m2 === \false) { - return \false; - } - $em = $this->i2osp($m2, $this->k); - if ($em === \false) { - return \false; - } - // EMSA-PKCS1-v1_5 encoding - $exception = \false; - // If the encoding operation outputs "intended encoded message length too short," output "RSA modulus - // too short" and stop. - try { - $em2 = $this->emsa_pkcs1_v1_5_encode($m, $this->k); - $r1 = \hash_equals($em, $em2); - } catch (\LengthException $e) { - $exception = \true; - } - try { - $em3 = $this->emsa_pkcs1_v1_5_encode_without_null($m, $this->k); - $r2 = \hash_equals($em, $em3); - } catch (\LengthException $e) { - $exception = \true; - } catch (UnsupportedAlgorithmException $e) { - $r2 = \false; - } - if ($exception) { - throw new \LengthException('RSA modulus too short'); - } - // Compare - return $r1 || $r2; - } - /** - * RSASSA-PKCS1-V1_5-VERIFY (relaxed matching) - * - * Per {@link http://tools.ietf.org/html/rfc3447#page-43 RFC3447#page-43} PKCS1 v1.5 - * specified the use BER encoding rather than DER encoding that PKCS1 v2.0 specified. - * This means that under rare conditions you can have a perfectly valid v1.5 signature - * that fails to validate with _rsassa_pkcs1_v1_5_verify(). PKCS1 v2.1 also recommends - * that if you're going to validate these types of signatures you "should indicate - * whether the underlying BER encoding is a DER encoding and hence whether the signature - * is valid with respect to the specification given in [PKCS1 v2.0+]". so if you do - * $rsa->getLastPadding() and get RSA::PADDING_RELAXED_PKCS1 back instead of - * RSA::PADDING_PKCS1... that means BER encoding was used. - * - * @param string $m - * @param string $s - * @return bool - */ - private function rsassa_pkcs1_v1_5_relaxed_verify($m, $s) - { - // Length checking - if (\strlen($s) != $this->k) { - return \false; - } - // RSA verification - $s = $this->os2ip($s); - $m2 = $this->rsavp1($s); - if ($m2 === \false) { - return \false; - } - $em = $this->i2osp($m2, $this->k); - if ($em === \false) { - return \false; - } - if (Strings::shift($em, 2) != "\x00\x01") { - return \false; - } - $em = \ltrim($em, "\xff"); - if (Strings::shift($em) != "\x00") { - return \false; - } - $decoded = ASN1::decodeBER($em); - if (!\is_array($decoded) || empty($decoded[0]) || \strlen($em) > $decoded[0]['length']) { - return \false; - } - static $oids; - if (!isset($oids)) { - $oids = [ - 'md2' => '1.2.840.113549.2.2', - 'md4' => '1.2.840.113549.2.4', - // from PKCS1 v1.5 - 'md5' => '1.2.840.113549.2.5', - 'id-sha1' => '1.3.14.3.2.26', - 'id-sha256' => '2.16.840.1.101.3.4.2.1', - 'id-sha384' => '2.16.840.1.101.3.4.2.2', - 'id-sha512' => '2.16.840.1.101.3.4.2.3', - // from PKCS1 v2.2 - 'id-sha224' => '2.16.840.1.101.3.4.2.4', - 'id-sha512/224' => '2.16.840.1.101.3.4.2.5', - 'id-sha512/256' => '2.16.840.1.101.3.4.2.6', - ]; - ASN1::loadOIDs($oids); - } - $decoded = ASN1::asn1map($decoded[0], DigestInfo::MAP); - if (!isset($decoded) || $decoded === \false) { - return \false; - } - if (!isset($oids[$decoded['digestAlgorithm']['algorithm']])) { - return \false; - } - if (isset($decoded['digestAlgorithm']['parameters']) && $decoded['digestAlgorithm']['parameters'] !== ['null' => '']) { - return \false; - } - $hash = $decoded['digestAlgorithm']['algorithm']; - $hash = \substr($hash, 0, 3) == 'id-' ? \substr($hash, 3) : $hash; - $hash = new Hash($hash); - $em = $hash->hash($m); - $em2 = $decoded['digest']; - return \hash_equals($em, $em2); - } - /** - * EMSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. - * - * @param string $m - * @param string $em - * @param int $emBits - * @return string - */ - private function emsa_pss_verify($m, $em, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - $emLen = $emBits + 7 >> 3; - // ie. ceil($emBits / 8); - $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - return \false; - } - if ($em[\strlen($em) - 1] != \chr(0xbc)) { - return \false; - } - $maskedDB = \substr($em, 0, -$this->hLen - 1); - $h = \substr($em, -$this->hLen - 1, $this->hLen); - $temp = \chr(0xff << ($emBits & 7)); - if ((~$maskedDB[0] & $temp) != $temp) { - return \false; - } - $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $db[0] = ~\chr(0xff << ($emBits & 7)) & $db[0]; - $temp = $emLen - $this->hLen - $sLen - 2; - if (\substr($db, 0, $temp) != \str_repeat(\chr(0), $temp) || \ord($db[$temp]) != 1) { - return \false; - } - $salt = \substr($db, $temp + 1); - // should be $sLen long - $m2 = "\x00\x00\x00\x00\x00\x00\x00\x00" . $mHash . $salt; - $h2 = $this->hash->hash($m2); - return \hash_equals($h, $h2); - } - /** - * RSASSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. - * - * @param string $m - * @param string $s - * @return bool|string - */ - private function rsassa_pss_verify($m, $s) - { - // Length checking - if (\strlen($s) != $this->k) { - return \false; - } - // RSA verification - $modBits = \strlen($this->modulus->toBits()); - $s2 = $this->os2ip($s); - $m2 = $this->rsavp1($s2); - $em = $this->i2osp($m2, $this->k); - if ($em === \false) { - return \false; - } - // EMSA-PSS verification - return $this->emsa_pss_verify($m, $em, $modBits - 1); - } - /** - * Verifies a signature - * - * @see self::sign() - * @param string $message - * @param string $signature - * @return bool - */ - public function verify($message, $signature) - { - switch ($this->signaturePadding) { - case self::SIGNATURE_RELAXED_PKCS1: - return $this->rsassa_pkcs1_v1_5_relaxed_verify($message, $signature); - case self::SIGNATURE_PKCS1: - return $this->rsassa_pkcs1_v1_5_verify($message, $signature); - //case self::SIGNATURE_PSS: - default: - return $this->rsassa_pss_verify($message, $signature); - } - } - /** - * RSAES-PKCS1-V1_5-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. - * - * @param string $m - * @param bool $pkcs15_compat optional - * @throws \LengthException if strlen($m) > $this->k - 11 - * @return bool|string - */ - private function rsaes_pkcs1_v1_5_encrypt($m, $pkcs15_compat = \false) - { - $mLen = \strlen($m); - // Length checking - if ($mLen > $this->k - 11) { - throw new \LengthException('Message too long'); - } - // EME-PKCS1-v1_5 encoding - $psLen = $this->k - $mLen - 3; - $ps = ''; - while (\strlen($ps) != $psLen) { - $temp = Random::string($psLen - \strlen($ps)); - $temp = \str_replace("\x00", '', $temp); - $ps .= $temp; - } - $type = 2; - $em = \chr(0) . \chr($type) . $ps . \chr(0) . $m; - // RSA encryption - $m = $this->os2ip($em); - $c = $this->rsaep($m); - $c = $this->i2osp($c, $this->k); - // Output the ciphertext C - return $c; - } - /** - * RSAES-OAEP-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and - * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. - * - * @param string $m - * @throws \LengthException if strlen($m) > $this->k - 2 * $this->hLen - 2 - * @return string - */ - private function rsaes_oaep_encrypt($m) - { - $mLen = \strlen($m); - // Length checking - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - if ($mLen > $this->k - 2 * $this->hLen - 2) { - throw new \LengthException('Message too long'); - } - // EME-OAEP encoding - $lHash = $this->hash->hash($this->label); - $ps = \str_repeat(\chr(0), $this->k - $mLen - 2 * $this->hLen - 2); - $db = $lHash . $ps . \chr(1) . $m; - $seed = Random::string($this->hLen); - $dbMask = $this->mgf1($seed, $this->k - $this->hLen - 1); - $maskedDB = $db ^ $dbMask; - $seedMask = $this->mgf1($maskedDB, $this->hLen); - $maskedSeed = $seed ^ $seedMask; - $em = \chr(0) . $maskedSeed . $maskedDB; - // RSA encryption - $m = $this->os2ip($em); - $c = $this->rsaep($m); - $c = $this->i2osp($c, $this->k); - // Output the ciphertext C - return $c; - } - /** - * RSAEP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. - * - * @param \phpseclib3\Math\BigInteger $m - * @return bool|\phpseclib3\Math\BigInteger - */ - private function rsaep($m) - { - if ($m->compare(self::$zero) < 0 || $m->compare($this->modulus) > 0) { - throw new \OutOfRangeException('Message representative out of range'); - } - return $this->exponentiate($m); - } - /** - * Raw Encryption / Decryption - * - * Doesn't use padding and is not recommended. - * - * @param string $m - * @return bool|string - * @throws \LengthException if strlen($m) > $this->k - */ - private function raw_encrypt($m) - { - if (\strlen($m) > $this->k) { - throw new \LengthException('Message too long'); - } - $temp = $this->os2ip($m); - $temp = $this->rsaep($temp); - return $this->i2osp($temp, $this->k); - } - /** - * Encryption - * - * Both self::PADDING_OAEP and self::PADDING_PKCS1 both place limits on how long $plaintext can be. - * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will - * be concatenated together. - * - * @see self::decrypt() - * @param string $plaintext - * @return bool|string - * @throws \LengthException if the RSA modulus is too short - */ - public function encrypt($plaintext) - { - switch ($this->encryptionPadding) { - case self::ENCRYPTION_NONE: - return $this->raw_encrypt($plaintext); - case self::ENCRYPTION_PKCS1: - return $this->rsaes_pkcs1_v1_5_encrypt($plaintext); - //case self::ENCRYPTION_OAEP: - default: - return $this->rsaes_oaep_encrypt($plaintext); - } - } - /** - * Returns the public key - * - * The public key is only returned under two circumstances - if the private key had the public key embedded within it - * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this - * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. - * - * @param string $type - * @param array $options optional - * @return mixed - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - if ($type == PSS::class) { - if ($this->signaturePadding == self::SIGNATURE_PSS) { - $options += ['hash' => $this->hash->getHash(), 'MGFHash' => $this->mgfHash->getHash(), 'saltLength' => $this->getSaltLength()]; - } else { - throw new UnsupportedFormatException('The PSS format can only be used when the signature method has been explicitly set to PSS'); - } - } - return $type::savePublicKey($this->modulus, $this->publicExponent, $options); - } - /** - * Converts a public key to a private key - * - * @return RSA - */ - public function asPrivateKey() - { - $new = new \phpseclib3\Crypt\RSA\PrivateKey(); - $new->exponent = $this->exponent; - $new->modulus = $this->modulus; - $new->k = $this->k; - $new->format = $this->format; - return $new->withHash($this->hash->getHash())->withMGFHash($this->mgfHash->getHash())->withSaltLength($this->sLen)->withLabel($this->label)->withPadding($this->signaturePadding | $this->encryptionPadding); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Random.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Random.php deleted file mode 100644 index 5dc8e39..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Random.php +++ /dev/null @@ -1,202 +0,0 @@ - - * - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -/** - * Pure-PHP Random Number Generator - * - * @author Jim Wigginton - */ -abstract class Random -{ - /** - * Generate a random string. - * - * Although microoptimizations are generally discouraged as they impair readability this function is ripe with - * microoptimizations because this function has the potential of being called a huge number of times. - * eg. for RSA key generation. - * - * @param int $length - * @throws \RuntimeException if a symmetric cipher is needed but not loaded - * @return string - */ - public static function string($length) - { - if (!$length) { - return ''; - } - try { - return \random_bytes($length); - } catch (\Exception $e) { - // random_compat will throw an Exception, which in PHP 5 does not implement Throwable - } catch (\Throwable $e) { - // If a sufficient source of randomness is unavailable, random_bytes() will throw an - // object that implements the Throwable interface (Exception, TypeError, Error). - // We don't actually need to do anything here. The string() method should just continue - // as normal. Note, however, that if we don't have a sufficient source of randomness for - // random_bytes(), most of the other calls here will fail too, so we'll end up using - // the PHP implementation. - } - // at this point we have no choice but to use a pure-PHP CSPRNG - // cascade entropy across multiple PHP instances by fixing the session and collecting all - // environmental variables, including the previous session data and the current session - // data. - // - // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) - // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but - // PHP isn't low level to be able to use those as sources and on a web server there's not likely - // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use - // however, a ton of people visiting the website. obviously you don't want to base your seeding - // solely on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled - // by the user and (2) this isn't just looking at the data sent by the current user - it's based - // on the data sent by all users. one user requests the page and a hash of their info is saved. - // another user visits the page and the serialization of their data is utilized along with the - // server environment stuff and a hash of the previous http request data (which itself utilizes - // a hash of the session data before that). certainly an attacker should be assumed to have - // full control over his own http requests. he, however, is not going to have control over - // everyone's http requests. - static $crypto = \false, $v; - if ($crypto === \false) { - // save old session data - $old_session_id = \session_id(); - $old_use_cookies = \ini_get('session.use_cookies'); - $old_session_cache_limiter = \session_cache_limiter(); - $_OLD_SESSION = isset($_SESSION) ? $_SESSION : \false; - if ($old_session_id != '') { - \session_write_close(); - } - \session_id(1); - \ini_set('session.use_cookies', 0); - \session_cache_limiter(''); - \session_start(); - $v = (isset($_SERVER) ? self::safe_serialize($_SERVER) : '') . (isset($_POST) ? self::safe_serialize($_POST) : '') . (isset($_GET) ? self::safe_serialize($_GET) : '') . (isset($_COOKIE) ? self::safe_serialize($_COOKIE) : '') . (\version_compare(\PHP_VERSION, '8.1.0', '>=') ? \serialize($GLOBALS) : self::safe_serialize($GLOBALS)) . self::safe_serialize($_SESSION) . self::safe_serialize($_OLD_SESSION); - $v = $seed = $_SESSION['seed'] = \sha1($v, \true); - if (!isset($_SESSION['count'])) { - $_SESSION['count'] = 0; - } - $_SESSION['count']++; - \session_write_close(); - // restore old session data - if ($old_session_id != '') { - \session_id($old_session_id); - \session_start(); - \ini_set('session.use_cookies', $old_use_cookies); - \session_cache_limiter($old_session_cache_limiter); - } else { - if ($_OLD_SESSION !== \false) { - $_SESSION = $_OLD_SESSION; - unset($_OLD_SESSION); - } else { - unset($_SESSION); - } - } - // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. - // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. - // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the - // original hash and the current hash. we'll be emulating that. for more info see the following URL: - // - // http://tools.ietf.org/html/rfc4253#section-7.2 - // - // see the is_string($crypto) part for an example of how to expand the keys - $key = \sha1($seed . 'A', \true); - $iv = \sha1($seed . 'C', \true); - // ciphers are used as per the nist.gov link below. also, see this link: - // - // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives - switch (\true) { - case \class_exists('\\phpseclib3\\Crypt\\AES'): - $crypto = new \phpseclib3\Crypt\AES('ctr'); - break; - case \class_exists('\\phpseclib3\\Crypt\\Twofish'): - $crypto = new \phpseclib3\Crypt\Twofish('ctr'); - break; - case \class_exists('\\phpseclib3\\Crypt\\Blowfish'): - $crypto = new \phpseclib3\Crypt\Blowfish('ctr'); - break; - case \class_exists('\\phpseclib3\\Crypt\\TripleDES'): - $crypto = new \phpseclib3\Crypt\TripleDES('ctr'); - break; - case \class_exists('\\phpseclib3\\Crypt\\DES'): - $crypto = new \phpseclib3\Crypt\DES('ctr'); - break; - case \class_exists('\\phpseclib3\\Crypt\\RC4'): - $crypto = new \phpseclib3\Crypt\RC4(); - break; - default: - throw new \RuntimeException(__CLASS__ . ' requires at least one symmetric cipher be loaded'); - } - $crypto->setKey(\substr($key, 0, $crypto->getKeyLength() >> 3)); - $crypto->setIV(\substr($iv, 0, $crypto->getBlockLength() >> 3)); - $crypto->enableContinuousBuffer(); - } - //return $crypto->encrypt(str_repeat("\0", $length)); - // the following is based off of ANSI X9.31: - // - // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf - // - // OpenSSL uses that same standard for it's random numbers: - // - // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c - // (do a search for "ANS X9.31 A.2.4") - $result = ''; - while (\strlen($result) < $length) { - $i = $crypto->encrypt(\microtime()); - // strlen(microtime()) == 21 - $r = $crypto->encrypt($i ^ $v); - // strlen($v) == 20 - $v = $crypto->encrypt($r ^ $i); - // strlen($r) == 20 - $result .= $r; - } - return \substr($result, 0, $length); - } - /** - * Safely serialize variables - * - * If a class has a private __sleep() it'll emit a warning - * @return mixed - * @param mixed $arr - */ - private static function safe_serialize(&$arr) - { - if (\is_object($arr)) { - return ''; - } - if (!\is_array($arr)) { - return \serialize($arr); - } - // prevent circular array recursion - if (isset($arr['__phpseclib_marker'])) { - return ''; - } - $safearr = []; - $arr['__phpseclib_marker'] = \true; - foreach (\array_keys($arr) as $key) { - // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage - if ($key !== '__phpseclib_marker') { - $safearr[$key] = self::safe_serialize($arr[$key]); - } - } - unset($arr['__phpseclib_marker']); - return \serialize($safearr); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php deleted file mode 100644 index 75889a4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php +++ /dev/null @@ -1,1050 +0,0 @@ - - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\BlockCipher; -use phpseclib3\Exception\BadDecryptionException; -use phpseclib3\Exception\BadModeException; -use phpseclib3\Exception\InconsistentSetupException; -use phpseclib3\Exception\InsufficientSetupException; -/** - * Pure-PHP implementation of Rijndael. - * - * @author Jim Wigginton - */ -class Rijndael extends BlockCipher -{ - /** - * The mcrypt specific name of the cipher - * - * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not. - * \phpseclib3\Crypt\Rijndael determines automatically whether mcrypt is useable - * or not for the current $block_size/$key_length. - * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @see \phpseclib3\Crypt\Common\SymmetricKey::engine - * @see self::isValidEngine() - * @var string - */ - protected $cipher_name_mcrypt = 'rijndael-128'; - /** - * The Key Schedule - * - * @see self::setup() - * @var array - */ - private $w; - /** - * The Inverse Key Schedule - * - * @see self::setup() - * @var array - */ - private $dw; - /** - * The Block Length divided by 32 - * - * {@internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size - * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could - * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once.} - * - * @see self::setBlockLength() - * @var int - */ - private $Nb = 4; - /** - * The Key Length (in bytes) - * - * {@internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk - * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could - * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once.} - * - * @see self::setKeyLength() - * @var int - */ - protected $key_length = 16; - /** - * The Key Length divided by 32 - * - * @see self::setKeyLength() - * @var int - * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 - */ - private $Nk = 4; - /** - * The Number of Rounds - * - * {@internal The max value is 14, the min value is 10.} - * - * @var int - */ - private $Nr; - /** - * Shift offsets - * - * @var array - */ - private $c; - /** - * Holds the last used key- and block_size information - * - * @var array - */ - private $kl; - /** - * Default Constructor. - * - * @param string $mode - * @throws \InvalidArgumentException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - /** - * Sets the key length. - * - * Valid key lengths are 128, 160, 192, 224, and 256. - * - * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined - * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to - * 192/256 bits as, for example, mcrypt will do. - * - * That said, if you want be compatible with other Rijndael and AES implementations, - * you should not setKeyLength(160) or setKeyLength(224). - * - * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use - * the mcrypt php extension, even if available. - * This results then in slower encryption. - * - * @throws \LengthException if the key length is invalid - * @param int $length - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 160: - case 192: - case 224: - case 256: - $this->key_length = $length >> 3; - break; - default: - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128, 160, 192, 224 or 256 bits are supported'); - } - parent::setKeyLength($length); - } - /** - * Sets the key. - * - * Rijndael supports five different key lengths - * - * @see setKeyLength() - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (\strlen($key)) { - case 16: - case 20: - case 24: - case 28: - case 32: - break; - default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 20, 24, 28 or 32 are supported'); - } - parent::setKey($key); - } - /** - * Sets the block length - * - * Valid block lengths are 128, 160, 192, 224, and 256. - * - * @param int $length - */ - public function setBlockLength($length) - { - switch ($length) { - case 128: - case 160: - case 192: - case 224: - case 256: - break; - default: - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128, 160, 192, 224 or 256 bits are supported'); - } - $this->Nb = $length >> 5; - $this->block_size = $length >> 3; - $this->changed = $this->nonIVChanged = \true; - $this->setEngine(); - } - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_LIBSODIUM: - return \function_exists('sodium_crypto_aead_aes256gcm_is_available') && \sodium_crypto_aead_aes256gcm_is_available() && $this->mode == self::MODE_GCM && $this->key_length == 32 && $this->nonce && \strlen($this->nonce) == 12 && $this->block_size == 16; - case self::ENGINE_OPENSSL_GCM: - if (!\extension_loaded('openssl')) { - return \false; - } - $methods = \openssl_get_cipher_methods(); - return $this->mode == self::MODE_GCM && \version_compare(\PHP_VERSION, '7.1.0', '>=') && \in_array('aes-' . $this->getKeyLength() . '-gcm', $methods) && $this->block_size == 16; - case self::ENGINE_OPENSSL: - if ($this->block_size != 16) { - return \false; - } - $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb'; - $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->openssl_translate_mode(); - break; - case self::ENGINE_MCRYPT: - $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); - if ($this->key_length % 8) { - // is it a 160/224-bit key? - // mcrypt is not usable for them, only for 128/192/256-bit keys - return \false; - } - } - return parent::isValidEngineHelper($engine); - } - /** - * Encrypts a block - * - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - static $tables; - if (empty($tables)) { - $tables =& $this->getTables(); - } - $t0 = $tables[0]; - $t1 = $tables[1]; - $t2 = $tables[2]; - $t3 = $tables[3]; - $sbox = $tables[4]; - $state = []; - $words = \unpack('N*', $in); - $c = $this->c; - $w = $this->w; - $Nb = $this->Nb; - $Nr = $this->Nr; - // addRoundKey - $wc = $Nb - 1; - foreach ($words as $word) { - $state[] = $word ^ $w[++$wc]; - } - // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - - // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding - // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. - // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. - // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], - // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. - // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf - $temp = []; - for ($round = 1; $round < $Nr; ++$round) { - $i = 0; - // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - while ($i < $Nb) { - $temp[$i] = $t0[$state[$i] >> 24 & 0xff] ^ $t1[$state[$j] >> 16 & 0xff] ^ $t2[$state[$k] >> 8 & 0xff] ^ $t3[$state[$l] & 0xff] ^ $w[++$wc]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - // subWord - for ($i = 0; $i < $Nb; ++$i) { - $state[$i] = $sbox[$state[$i] & 0xff] | $sbox[$state[$i] >> 8 & 0xff] << 8 | $sbox[$state[$i] >> 16 & 0xff] << 16 | $sbox[$state[$i] >> 24 & 0xff] << 24; - } - // shiftRows + addRoundKey - $i = 0; - // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - while ($i < $Nb) { - $temp[$i] = $state[$i] & \intval(0xff000000) ^ $state[$j] & 0xff0000 ^ $state[$k] & 0xff00 ^ $state[$l] & 0xff ^ $w[$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - return \pack('N*', ...$temp); - } - /** - * Decrypts a block - * - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - static $invtables; - if (empty($invtables)) { - $invtables =& $this->getInvTables(); - } - $dt0 = $invtables[0]; - $dt1 = $invtables[1]; - $dt2 = $invtables[2]; - $dt3 = $invtables[3]; - $isbox = $invtables[4]; - $state = []; - $words = \unpack('N*', $in); - $c = $this->c; - $dw = $this->dw; - $Nb = $this->Nb; - $Nr = $this->Nr; - // addRoundKey - $wc = $Nb - 1; - foreach ($words as $word) { - $state[] = $word ^ $dw[++$wc]; - } - $temp = []; - for ($round = $Nr - 1; $round > 0; --$round) { - $i = 0; - // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - while ($i < $Nb) { - $temp[$i] = $dt0[$state[$i] >> 24 & 0xff] ^ $dt1[$state[$j] >> 16 & 0xff] ^ $dt2[$state[$k] >> 8 & 0xff] ^ $dt3[$state[$l] & 0xff] ^ $dw[++$wc]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - // invShiftRows + invSubWord + addRoundKey - $i = 0; - // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - while ($i < $Nb) { - $word = $state[$i] & \intval(0xff000000) | $state[$j] & 0xff0000 | $state[$k] & 0xff00 | $state[$l] & 0xff; - $temp[$i] = $dw[$i] ^ ($isbox[$word & 0xff] | $isbox[$word >> 8 & 0xff] << 8 | $isbox[$word >> 16 & 0xff] << 16 | $isbox[$word >> 24 & 0xff] << 24); - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - return \pack('N*', ...$temp); - } - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine and flush all $buffers - * Used (only) if $engine == self::ENGINE_INTERNAL - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * {@internal setup() is always called before en/decryption.} - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::setKey() - * @see self::setIV() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - parent::setup(); - if (\is_string($this->iv) && \strlen($this->iv) != $this->block_size) { - throw new InconsistentSetupException('The IV length (' . \strlen($this->iv) . ') does not match the block size (' . $this->block_size . ')'); - } - } - /** - * Setup the key (expansion) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. - // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse - static $rcon; - if (!isset($rcon)) { - $rcon = [0, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000, 0x6c000000, 0xd8000000, 0xab000000, 0x4d000000, 0x9a000000, 0x2f000000, 0x5e000000, 0xbc000000, 0x63000000, 0xc6000000, 0x97000000, 0x35000000, 0x6a000000, 0xd4000000, 0xb3000000, 0x7d000000, 0xfa000000, 0xef000000, 0xc5000000, 0x91000000]; - $rcon = \array_map('intval', $rcon); - } - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size]; - $this->Nk = $this->key_length >> 2; - // see Rijndael-ammended.pdf#page=44 - $this->Nr = \max($this->Nk, $this->Nb) + 6; - // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, - // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" - // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, - // "Table 2: Shift offsets for different block lengths" - switch ($this->Nb) { - case 4: - case 5: - case 6: - $this->c = [0, 1, 2, 3]; - break; - case 7: - $this->c = [0, 1, 2, 4]; - break; - case 8: - $this->c = [0, 1, 3, 4]; - } - $w = \array_values(\unpack('N*words', $this->key)); - $length = $this->Nb * ($this->Nr + 1); - for ($i = $this->Nk; $i < $length; $i++) { - $temp = $w[$i - 1]; - if ($i % $this->Nk == 0) { - // according to , "the size of an integer is platform-dependent". - // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, - // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' - // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. - $temp = $temp << 8 & \intval(0xffffff00) | $temp >> 24 & 0xff; - // rotWord - $temp = $this->subWord($temp) ^ $rcon[$i / $this->Nk]; - } elseif ($this->Nk > 6 && $i % $this->Nk == 4) { - $temp = $this->subWord($temp); - } - $w[$i] = $w[$i - $this->Nk] ^ $temp; - } - // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns - // and generate the inverse key schedule. more specifically, - // according to (section 5.3.3), - // "The key expansion for the Inverse Cipher is defined as follows: - // 1. Apply the Key Expansion. - // 2. Apply InvMixColumn to all Round Keys except the first and the last one." - // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" - list($dt0, $dt1, $dt2, $dt3) = $this->getInvTables(); - $temp = $this->w = $this->dw = []; - for ($i = $row = $col = 0; $i < $length; $i++, $col++) { - if ($col == $this->Nb) { - if ($row == 0) { - $this->dw[0] = $this->w[0]; - } else { - // subWord + invMixColumn + invSubWord = invMixColumn - $j = 0; - while ($j < $this->Nb) { - $dw = $this->subWord($this->w[$row][$j]); - $temp[$j] = $dt0[$dw >> 24 & 0xff] ^ $dt1[$dw >> 16 & 0xff] ^ $dt2[$dw >> 8 & 0xff] ^ $dt3[$dw & 0xff]; - $j++; - } - $this->dw[$row] = $temp; - } - $col = 0; - $row++; - } - $this->w[$row][$col] = $w[$i]; - } - $this->dw[$row] = $this->w[$row]; - // Converting to 1-dim key arrays (both ascending) - $this->dw = \array_reverse($this->dw); - $w = \array_pop($this->w); - $dw = \array_pop($this->dw); - foreach ($this->w as $r => $wr) { - foreach ($wr as $c => $wc) { - $w[] = $wc; - $dw[] = $this->dw[$r][$c]; - } - } - $this->w = $w; - $this->dw = $dw; - } - /** - * Performs S-Box substitutions - * - * @return array - * @param int $word - */ - private function subWord($word) - { - static $sbox; - if (empty($sbox)) { - list(, , , , $sbox) = self::getTables(); - } - return $sbox[$word & 0xff] | $sbox[$word >> 8 & 0xff] << 8 | $sbox[$word >> 16 & 0xff] << 16 | $sbox[$word >> 24 & 0xff] << 24; - } - /** - * Provides the mixColumns and sboxes tables - * - * @see self::encryptBlock() - * @see self::setupInlineCrypt() - * @see self::subWord() - * @return array &$tables - */ - protected function &getTables() - { - static $tables; - if (empty($tables)) { - // according to (section 5.2.1), - // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so - // those are the names we'll use. - $t3 = \array_map('intval', [ - // with array_map('intval', ...) we ensure we have only int's and not - // some slower floats converted by php automatically on high values - 0x6363a5c6, - 0x7c7c84f8, - 0x777799ee, - 0x7b7b8df6, - 0xf2f20dff, - 0x6b6bbdd6, - 0x6f6fb1de, - 0xc5c55491, - 0x30305060, - 0x1010302, - 0x6767a9ce, - 0x2b2b7d56, - 0xfefe19e7, - 0xd7d762b5, - 0xababe64d, - 0x76769aec, - 0xcaca458f, - 0x82829d1f, - 0xc9c94089, - 0x7d7d87fa, - 0xfafa15ef, - 0x5959ebb2, - 0x4747c98e, - 0xf0f00bfb, - 0xadadec41, - 0xd4d467b3, - 0xa2a2fd5f, - 0xafafea45, - 0x9c9cbf23, - 0xa4a4f753, - 0x727296e4, - 0xc0c05b9b, - 0xb7b7c275, - 0xfdfd1ce1, - 0x9393ae3d, - 0x26266a4c, - 0x36365a6c, - 0x3f3f417e, - 0xf7f702f5, - 0xcccc4f83, - 0x34345c68, - 0xa5a5f451, - 0xe5e534d1, - 0xf1f108f9, - 0x717193e2, - 0xd8d873ab, - 0x31315362, - 0x15153f2a, - 0x4040c08, - 0xc7c75295, - 0x23236546, - 0xc3c35e9d, - 0x18182830, - 0x9696a137, - 0x5050f0a, - 0x9a9ab52f, - 0x707090e, - 0x12123624, - 0x80809b1b, - 0xe2e23ddf, - 0xebeb26cd, - 0x2727694e, - 0xb2b2cd7f, - 0x75759fea, - 0x9091b12, - 0x83839e1d, - 0x2c2c7458, - 0x1a1a2e34, - 0x1b1b2d36, - 0x6e6eb2dc, - 0x5a5aeeb4, - 0xa0a0fb5b, - 0x5252f6a4, - 0x3b3b4d76, - 0xd6d661b7, - 0xb3b3ce7d, - 0x29297b52, - 0xe3e33edd, - 0x2f2f715e, - 0x84849713, - 0x5353f5a6, - 0xd1d168b9, - 0x0, - 0xeded2cc1, - 0x20206040, - 0xfcfc1fe3, - 0xb1b1c879, - 0x5b5bedb6, - 0x6a6abed4, - 0xcbcb468d, - 0xbebed967, - 0x39394b72, - 0x4a4ade94, - 0x4c4cd498, - 0x5858e8b0, - 0xcfcf4a85, - 0xd0d06bbb, - 0xefef2ac5, - 0xaaaae54f, - 0xfbfb16ed, - 0x4343c586, - 0x4d4dd79a, - 0x33335566, - 0x85859411, - 0x4545cf8a, - 0xf9f910e9, - 0x2020604, - 0x7f7f81fe, - 0x5050f0a0, - 0x3c3c4478, - 0x9f9fba25, - 0xa8a8e34b, - 0x5151f3a2, - 0xa3a3fe5d, - 0x4040c080, - 0x8f8f8a05, - 0x9292ad3f, - 0x9d9dbc21, - 0x38384870, - 0xf5f504f1, - 0xbcbcdf63, - 0xb6b6c177, - 0xdada75af, - 0x21216342, - 0x10103020, - 0xffff1ae5, - 0xf3f30efd, - 0xd2d26dbf, - 0xcdcd4c81, - 0xc0c1418, - 0x13133526, - 0xecec2fc3, - 0x5f5fe1be, - 0x9797a235, - 0x4444cc88, - 0x1717392e, - 0xc4c45793, - 0xa7a7f255, - 0x7e7e82fc, - 0x3d3d477a, - 0x6464acc8, - 0x5d5de7ba, - 0x19192b32, - 0x737395e6, - 0x6060a0c0, - 0x81819819, - 0x4f4fd19e, - 0xdcdc7fa3, - 0x22226644, - 0x2a2a7e54, - 0x9090ab3b, - 0x8888830b, - 0x4646ca8c, - 0xeeee29c7, - 0xb8b8d36b, - 0x14143c28, - 0xdede79a7, - 0x5e5ee2bc, - 0xb0b1d16, - 0xdbdb76ad, - 0xe0e03bdb, - 0x32325664, - 0x3a3a4e74, - 0xa0a1e14, - 0x4949db92, - 0x6060a0c, - 0x24246c48, - 0x5c5ce4b8, - 0xc2c25d9f, - 0xd3d36ebd, - 0xacacef43, - 0x6262a6c4, - 0x9191a839, - 0x9595a431, - 0xe4e437d3, - 0x79798bf2, - 0xe7e732d5, - 0xc8c8438b, - 0x3737596e, - 0x6d6db7da, - 0x8d8d8c01, - 0xd5d564b1, - 0x4e4ed29c, - 0xa9a9e049, - 0x6c6cb4d8, - 0x5656faac, - 0xf4f407f3, - 0xeaea25cf, - 0x6565afca, - 0x7a7a8ef4, - 0xaeaee947, - 0x8081810, - 0xbabad56f, - 0x787888f0, - 0x25256f4a, - 0x2e2e725c, - 0x1c1c2438, - 0xa6a6f157, - 0xb4b4c773, - 0xc6c65197, - 0xe8e823cb, - 0xdddd7ca1, - 0x74749ce8, - 0x1f1f213e, - 0x4b4bdd96, - 0xbdbddc61, - 0x8b8b860d, - 0x8a8a850f, - 0x707090e0, - 0x3e3e427c, - 0xb5b5c471, - 0x6666aacc, - 0x4848d890, - 0x3030506, - 0xf6f601f7, - 0xe0e121c, - 0x6161a3c2, - 0x35355f6a, - 0x5757f9ae, - 0xb9b9d069, - 0x86869117, - 0xc1c15899, - 0x1d1d273a, - 0x9e9eb927, - 0xe1e138d9, - 0xf8f813eb, - 0x9898b32b, - 0x11113322, - 0x6969bbd2, - 0xd9d970a9, - 0x8e8e8907, - 0x9494a733, - 0x9b9bb62d, - 0x1e1e223c, - 0x87879215, - 0xe9e920c9, - 0xcece4987, - 0x5555ffaa, - 0x28287850, - 0xdfdf7aa5, - 0x8c8c8f03, - 0xa1a1f859, - 0x89898009, - 0xd0d171a, - 0xbfbfda65, - 0xe6e631d7, - 0x4242c684, - 0x6868b8d0, - 0x4141c382, - 0x9999b029, - 0x2d2d775a, - 0xf0f111e, - 0xb0b0cb7b, - 0x5454fca8, - 0xbbbbd66d, - 0x16163a2c, - ]); - foreach ($t3 as $t3i) { - $t0[] = $t3i << 24 & \intval(0xff000000) | $t3i >> 8 & 0xffffff; - $t1[] = $t3i << 16 & \intval(0xffff0000) | $t3i >> 16 & 0xffff; - $t2[] = $t3i << 8 & \intval(0xffffff00) | $t3i >> 24 & 0xff; - } - $tables = [ - // The Precomputed mixColumns tables t0 - t3 - $t0, - $t1, - $t2, - $t3, - // The SubByte S-Box - [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x1, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x4, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x5, 0x9a, 0x7, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x9, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x0, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x2, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0xc, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0xb, 0xdb, 0xe0, 0x32, 0x3a, 0xa, 0x49, 0x6, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x8, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x3, 0xf6, 0xe, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0xd, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0xf, 0xb0, 0x54, 0xbb, 0x16], - ]; - } - return $tables; - } - /** - * Provides the inverse mixColumns and inverse sboxes tables - * - * @see self::decryptBlock() - * @see self::setupInlineCrypt() - * @see self::setupKey() - * @return array &$tables - */ - protected function &getInvTables() - { - static $tables; - if (empty($tables)) { - $dt3 = \array_map('intval', [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x24c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x82b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x36aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x7f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x5bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x6d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x0, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0xefffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0xfd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0xa67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x90d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x1269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x4984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0xb412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0xd9541ff, 0xa8017139, 0xcb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]); - foreach ($dt3 as $dt3i) { - $dt0[] = $dt3i << 24 & \intval(0xff000000) | $dt3i >> 8 & 0xffffff; - $dt1[] = $dt3i << 16 & \intval(0xffff0000) | $dt3i >> 16 & 0xffff; - $dt2[] = $dt3i << 8 & \intval(0xffffff00) | $dt3i >> 24 & 0xff; - } - $tables = [ - // The Precomputed inverse mixColumns tables dt0 - dt3 - $dt0, - $dt1, - $dt2, - $dt3, - // The inverse SubByte S-Box - [0x52, 0x9, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0xb, 0x42, 0xfa, 0xc3, 0x4e, 0x8, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x0, 0x8c, 0xbc, 0xd3, 0xa, 0xf7, 0xe4, 0x58, 0x5, 0xb8, 0xb3, 0x45, 0x6, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0xf, 0x2, 0xc1, 0xaf, 0xbd, 0x3, 0x1, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0xe, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x7, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0xd, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x4, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0xc, 0x7d], - ]; - } - return $tables; - } - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - $w = $this->w; - $dw = $this->dw; - $init_encrypt = ''; - $init_decrypt = ''; - $Nr = $this->Nr; - $Nb = $this->Nb; - $c = $this->c; - // Generating encrypt code: - $init_encrypt .= ' - static $tables; - if (empty($tables)) { - $tables = &$this->getTables(); - } - $t0 = $tables[0]; - $t1 = $tables[1]; - $t2 = $tables[2]; - $t3 = $tables[3]; - $sbox = $tables[4]; - '; - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - // Preround: addRoundKey - $encrypt_block = '$in = unpack("N*", $in);' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$s' . $i . ' = $in[' . ($i + 1) . '] ^ ' . $w[++$wc] . ";\n"; - } - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = [$e, $s]; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$' . $e . $i . ' = - $t0[($' . $s . $i . ' >> 24) & 0xff] ^ - $t1[($' . $s . ($i + $c[1]) % $Nb . ' >> 16) & 0xff] ^ - $t2[($' . $s . ($i + $c[2]) % $Nb . ' >> 8) & 0xff] ^ - $t3[ $' . $s . ($i + $c[3]) % $Nb . ' & 0xff] ^ - ' . $w[++$wc] . ";\n"; - } - } - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$' . $e . $i . ' = - $sbox[ $' . $e . $i . ' & 0xff] | - ($sbox[($' . $e . $i . ' >> 8) & 0xff] << 8) | - ($sbox[($' . $e . $i . ' >> 16) & 0xff] << 16) | - ($sbox[($' . $e . $i . ' >> 24) & 0xff] << 24);' . "\n"; - } - $encrypt_block .= '$in = pack("N*"' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= ', - ($' . $e . $i . ' & ' . (int) 0xff000000 . ') ^ - ($' . $e . ($i + $c[1]) % $Nb . ' & 0x00FF0000 ) ^ - ($' . $e . ($i + $c[2]) % $Nb . ' & 0x0000FF00 ) ^ - ($' . $e . ($i + $c[3]) % $Nb . ' & 0x000000FF ) ^ - ' . $w[$i] . "\n"; - } - $encrypt_block .= ');'; - // Generating decrypt code: - $init_decrypt .= ' - static $invtables; - if (empty($invtables)) { - $invtables = &$this->getInvTables(); - } - $dt0 = $invtables[0]; - $dt1 = $invtables[1]; - $dt2 = $invtables[2]; - $dt3 = $invtables[3]; - $isbox = $invtables[4]; - '; - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - // Preround: addRoundKey - $decrypt_block = '$in = unpack("N*", $in);' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$s' . $i . ' = $in[' . ($i + 1) . '] ^ ' . $dw[++$wc] . ';' . "\n"; - } - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = [$e, $s]; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$' . $e . $i . ' = - $dt0[($' . $s . $i . ' >> 24) & 0xff] ^ - $dt1[($' . $s . ($Nb + $i - $c[1]) % $Nb . ' >> 16) & 0xff] ^ - $dt2[($' . $s . ($Nb + $i - $c[2]) % $Nb . ' >> 8) & 0xff] ^ - $dt3[ $' . $s . ($Nb + $i - $c[3]) % $Nb . ' & 0xff] ^ - ' . $dw[++$wc] . ";\n"; - } - } - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$' . $e . $i . ' = - $isbox[ $' . $e . $i . ' & 0xff] | - ($isbox[($' . $e . $i . ' >> 8) & 0xff] << 8) | - ($isbox[($' . $e . $i . ' >> 16) & 0xff] << 16) | - ($isbox[($' . $e . $i . ' >> 24) & 0xff] << 24);' . "\n"; - } - $decrypt_block .= '$in = pack("N*"' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= ', - ($' . $e . $i . ' & ' . (int) 0xff000000 . ') ^ - ($' . $e . ($Nb + $i - $c[1]) % $Nb . ' & 0x00FF0000 ) ^ - ($' . $e . ($Nb + $i - $c[2]) % $Nb . ' & 0x0000FF00 ) ^ - ($' . $e . ($Nb + $i - $c[3]) % $Nb . ' & 0x000000FF ) ^ - ' . $dw[$i] . "\n"; - } - $decrypt_block .= ');'; - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => '', 'init_encrypt' => $init_encrypt, 'init_decrypt' => $init_decrypt, 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); - } - /** - * Encrypts a message. - * - * @see self::decrypt() - * @see parent::encrypt() - * @param string $plaintext - * @return string - */ - public function encrypt($plaintext) - { - $this->setup(); - switch ($this->engine) { - case self::ENGINE_LIBSODIUM: - $this->newtag = \sodium_crypto_aead_aes256gcm_encrypt($plaintext, $this->aad, $this->nonce, $this->key); - return Strings::shift($this->newtag, \strlen($plaintext)); - case self::ENGINE_OPENSSL_GCM: - return \openssl_encrypt($plaintext, 'aes-' . $this->getKeyLength() . '-gcm', $this->key, \OPENSSL_RAW_DATA, $this->nonce, $this->newtag, $this->aad); - } - return parent::encrypt($plaintext); - } - /** - * Decrypts a message. - * - * @see self::encrypt() - * @see parent::decrypt() - * @param string $ciphertext - * @return string - */ - public function decrypt($ciphertext) - { - $this->setup(); - switch ($this->engine) { - case self::ENGINE_LIBSODIUM: - if ($this->oldtag === \false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - if (\strlen($this->oldtag) != 16) { - break; - } - $plaintext = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext . $this->oldtag, $this->aad, $this->nonce, $this->key); - if ($plaintext === \false) { - $this->oldtag = \false; - throw new BadDecryptionException('Error decrypting ciphertext with libsodium'); - } - return $plaintext; - case self::ENGINE_OPENSSL_GCM: - if ($this->oldtag === \false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - $plaintext = \openssl_decrypt($ciphertext, 'aes-' . $this->getKeyLength() . '-gcm', $this->key, \OPENSSL_RAW_DATA, $this->nonce, $this->oldtag, $this->aad); - if ($plaintext === \false) { - $this->oldtag = \false; - throw new BadDecryptionException('Error decrypting ciphertext with OpenSSL'); - } - return $plaintext; - } - return parent::decrypt($ciphertext); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php deleted file mode 100644 index cfab218..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php +++ /dev/null @@ -1,454 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\StreamCipher; -use phpseclib3\Exception\BadDecryptionException; -use phpseclib3\Exception\InsufficientSetupException; -/** - * Pure-PHP implementation of Salsa20. - * - * @author Jim Wigginton - */ -class Salsa20 extends StreamCipher -{ - /** - * Part 1 of the state - * - * @var string|false - */ - protected $p1 = \false; - /** - * Part 2 of the state - * - * @var string|false - */ - protected $p2 = \false; - /** - * Key Length (in bytes) - * - * @var int - */ - protected $key_length = 32; - // = 256 bits - /** - * @see \phpseclib3\Crypt\Salsa20::crypt() - */ - const ENCRYPT = 0; - /** - * @see \phpseclib3\Crypt\Salsa20::crypt() - */ - const DECRYPT = 1; - /** - * Encryption buffer for continuous mode - * - * @var array - */ - protected $enbuffer; - /** - * Decryption buffer for continuous mode - * - * @var array - */ - protected $debuffer; - /** - * Counter - * - * @var int - */ - protected $counter = 0; - /** - * Using Generated Poly1305 Key - * - * @var boolean - */ - protected $usingGeneratedPoly1305Key = \false; - /** - * Salsa20 uses a nonce - * - * @return bool - */ - public function usesNonce() - { - return \true; - } - /** - * Sets the key. - * - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (\strlen($key)) { - case 16: - case 32: - break; - default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 32 are supported'); - } - parent::setKey($key); - } - /** - * Sets the nonce. - * - * @param string $nonce - */ - public function setNonce($nonce) - { - if (\strlen($nonce) != 8) { - throw new \LengthException('Nonce of size ' . \strlen($key) . ' not supported by this algorithm. Only an 64-bit nonce is supported'); - } - $this->nonce = $nonce; - $this->changed = \true; - $this->setEngine(); - } - /** - * Sets the counter. - * - * @param int $counter - */ - public function setCounter($counter) - { - $this->counter = $counter; - $this->setEngine(); - } - /** - * Creates a Poly1305 key using the method discussed in RFC8439 - * - * See https://tools.ietf.org/html/rfc8439#section-2.6.1 - */ - protected function createPoly1305Key() - { - if ($this->nonce === \false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - if ($this->key === \false) { - throw new InsufficientSetupException('No key has been defined'); - } - $c = clone $this; - $c->setCounter(0); - $c->usePoly1305 = \false; - $block = $c->encrypt(\str_repeat("\x00", 256)); - $this->setPoly1305Key(\substr($block, 0, 32)); - if ($this->counter == 0) { - $this->counter++; - } - } - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setNonce() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * @see self::setKey() - * @see self::setNonce() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter]; - $this->changed = $this->nonIVChanged = \false; - if ($this->nonce === \false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - if ($this->key === \false) { - throw new InsufficientSetupException('No key has been defined'); - } - if ($this->usePoly1305 && !isset($this->poly1305Key)) { - $this->usingGeneratedPoly1305Key = \true; - $this->createPoly1305Key(); - } - $key = $this->key; - if (\strlen($key) == 16) { - $constant = 'expand 16-byte k'; - $key .= $key; - } else { - $constant = 'expand 32-byte k'; - } - $this->p1 = \substr($constant, 0, 4) . \substr($key, 0, 16) . \substr($constant, 4, 4) . $this->nonce . "\x00\x00\x00\x00"; - $this->p2 = \substr($constant, 8, 4) . \substr($key, 16, 16) . \substr($constant, 12, 4); - } - /** - * Setup the key (expansion) - */ - protected function setupKey() - { - // Salsa20 does not utilize this method - } - /** - * Encrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @see self::crypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - $ciphertext = $this->crypt($plaintext, self::ENCRYPT); - if (isset($this->poly1305Key)) { - $this->newtag = $this->poly1305($ciphertext); - } - return $ciphertext; - } - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see self::crypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if (isset($this->poly1305Key)) { - if ($this->oldtag === \false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - $newtag = $this->poly1305($ciphertext); - if ($this->oldtag != \substr($newtag, 0, \strlen($this->oldtag))) { - $this->oldtag = \false; - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - $this->oldtag = \false; - } - return $this->crypt($ciphertext, self::DECRYPT); - } - /** - * Encrypts a block - * - * @param string $in - */ - protected function encryptBlock($in) - { - // Salsa20 does not utilize this method - } - /** - * Decrypts a block - * - * @param string $in - */ - protected function decryptBlock($in) - { - // Salsa20 does not utilize this method - } - /** - * Encrypts or decrypts a message. - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $text - * @param int $mode - * @return string $text - */ - private function crypt($text, $mode) - { - $this->setup(); - if (!$this->continuousBuffer) { - if ($this->engine == self::ENGINE_OPENSSL) { - $iv = \pack('V', $this->counter) . $this->p2; - return \openssl_encrypt($text, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA, $iv); - } - $i = $this->counter; - $blocks = \str_split($text, 64); - foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . \pack('V', $i++) . $this->p2); - } - return \implode('', $blocks); - } - if ($mode == self::ENCRYPT) { - $buffer =& $this->enbuffer; - } else { - $buffer =& $this->debuffer; - } - if (!\strlen($buffer['ciphertext'])) { - $ciphertext = ''; - } else { - $ciphertext = $text ^ Strings::shift($buffer['ciphertext'], \strlen($text)); - $text = \substr($text, \strlen($ciphertext)); - if (!\strlen($text)) { - return $ciphertext; - } - } - $overflow = \strlen($text) % 64; - // & 0x3F - if ($overflow) { - $text2 = Strings::pop($text, $overflow); - if ($this->engine == self::ENGINE_OPENSSL) { - $iv = \pack('V', $buffer['counter']) . $this->p2; - // at this point $text should be a multiple of 64 - $buffer['counter'] += (\strlen($text) >> 6) + 1; - // ie. divide by 64 - $encrypted = \openssl_encrypt($text . \str_repeat("\x00", 64), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA, $iv); - $temp = Strings::pop($encrypted, 64); - } else { - $blocks = \str_split($text, 64); - if (\strlen($text)) { - foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . \pack('V', $buffer['counter']++) . $this->p2); - } - } - $encrypted = \implode('', $blocks); - $temp = static::salsa20($this->p1 . \pack('V', $buffer['counter']++) . $this->p2); - } - $ciphertext .= $encrypted . ($text2 ^ $temp); - $buffer['ciphertext'] = \substr($temp, $overflow); - } elseif (!\strlen($buffer['ciphertext'])) { - if ($this->engine == self::ENGINE_OPENSSL) { - $iv = \pack('V', $buffer['counter']) . $this->p2; - $buffer['counter'] += \strlen($text) >> 6; - $ciphertext .= \openssl_encrypt($text, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA, $iv); - } else { - $blocks = \str_split($text, 64); - foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . \pack('V', $buffer['counter']++) . $this->p2); - } - $ciphertext .= \implode('', $blocks); - } - } - return $ciphertext; - } - /** - * Left Rotate - * - * @param int $x - * @param int $n - * @return int - */ - protected static function leftRotate($x, $n) - { - if (\PHP_INT_SIZE == 8) { - $r1 = $x << $n; - $r1 &= 0xffffffff; - $r2 = ($x & 0xffffffff) >> 32 - $n; - } else { - $x = (int) $x; - $r1 = $x << $n; - $r2 = $x >> 32 - $n; - $r2 &= (1 << $n) - 1; - } - return $r1 | $r2; - } - /** - * The quarterround function - * - * @param int $a - * @param int $b - * @param int $c - * @param int $d - */ - protected static function quarterRound(&$a, &$b, &$c, &$d) - { - $b ^= self::leftRotate($a + $d, 7); - $c ^= self::leftRotate($b + $a, 9); - $d ^= self::leftRotate($c + $b, 13); - $a ^= self::leftRotate($d + $c, 18); - } - /** - * The doubleround function - * - * @param int $x0 (by reference) - * @param int $x1 (by reference) - * @param int $x2 (by reference) - * @param int $x3 (by reference) - * @param int $x4 (by reference) - * @param int $x5 (by reference) - * @param int $x6 (by reference) - * @param int $x7 (by reference) - * @param int $x8 (by reference) - * @param int $x9 (by reference) - * @param int $x10 (by reference) - * @param int $x11 (by reference) - * @param int $x12 (by reference) - * @param int $x13 (by reference) - * @param int $x14 (by reference) - * @param int $x15 (by reference) - */ - protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, &$x7, &$x8, &$x9, &$x10, &$x11, &$x12, &$x13, &$x14, &$x15) - { - // columnRound - static::quarterRound($x0, $x4, $x8, $x12); - static::quarterRound($x5, $x9, $x13, $x1); - static::quarterRound($x10, $x14, $x2, $x6); - static::quarterRound($x15, $x3, $x7, $x11); - // rowRound - static::quarterRound($x0, $x1, $x2, $x3); - static::quarterRound($x5, $x6, $x7, $x4); - static::quarterRound($x10, $x11, $x8, $x9); - static::quarterRound($x15, $x12, $x13, $x14); - } - /** - * The Salsa20 hash function function - * - * @param string $x - */ - protected static function salsa20($x) - { - $z = $x = \unpack('V*', $x); - for ($i = 0; $i < 10; $i++) { - static::doubleRound($z[1], $z[2], $z[3], $z[4], $z[5], $z[6], $z[7], $z[8], $z[9], $z[10], $z[11], $z[12], $z[13], $z[14], $z[15], $z[16]); - } - for ($i = 1; $i <= 16; $i++) { - $x[$i] += $z[$i]; - } - return \pack('V*', ...$x); - } - /** - * Calculates Poly1305 MAC - * - * @see self::decrypt() - * @see self::encrypt() - * @param string $ciphertext - * @return string - */ - protected function poly1305($ciphertext) - { - if (!$this->usingGeneratedPoly1305Key) { - return parent::poly1305($this->aad . $ciphertext); - } else { - /* - sodium_crypto_aead_chacha20poly1305_encrypt does not calculate the poly1305 tag - the same way sodium_crypto_aead_chacha20poly1305_ietf_encrypt does. you can see - how the latter encrypts it in Salsa20::encrypt(). here's how the former encrypts - it: - - $this->newtag = $this->poly1305( - $this->aad . - pack('V', strlen($this->aad)) . "\0\0\0\0" . - $ciphertext . - pack('V', strlen($ciphertext)) . "\0\0\0\0" - ); - - phpseclib opts to use the IETF construction, even when the nonce is 64-bits - instead of 96-bits - */ - return parent::poly1305(self::nullPad128($this->aad) . self::nullPad128($ciphertext) . \pack('V', \strlen($this->aad)) . "\x00\x00\x00\x00" . \pack('V', \strlen($ciphertext)) . "\x00\x00\x00\x00"); - } - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php deleted file mode 100644 index c59a3ce..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php +++ /dev/null @@ -1,384 +0,0 @@ - - * setKey('abcdefghijklmnopqrstuvwx'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -/** - * Pure-PHP implementation of Triple DES. - * - * @author Jim Wigginton - */ -class TripleDES extends \phpseclib3\Crypt\DES -{ - /** - * Encrypt / decrypt using inner chaining - * - * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (self::MODE_CBC3). - */ - const MODE_3CBC = -2; - /** - * Encrypt / decrypt using outer chaining - * - * Outer chaining is used by SSH-2 and when the mode is set to \phpseclib3\Crypt\Common\BlockCipher::MODE_CBC. - */ - const MODE_CBC3 = self::MODE_CBC; - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\TripleDES::setKeyLength() - * @var int - */ - protected $key_length = 24; - /** - * The mcrypt specific name of the cipher - * - * @see \phpseclib3\Crypt\DES::cipher_name_mcrypt - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'tripledes'; - /** - * Optimizing value while CFB-encrypting - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 750; - /** - * max possible size of $key - * - * @see self::setKey() - * @see \phpseclib3\Crypt\DES::setKey() - * @var string - */ - protected $key_length_max = 24; - /** - * Internal flag whether using self::MODE_3CBC or not - * - * @var bool - */ - private $mode_3cbc; - /** - * The \phpseclib3\Crypt\DES objects - * - * Used only if $mode_3cbc === true - * - * @var array - */ - private $des; - /** - * Default Constructor. - * - * Determines whether or not the mcrypt or OpenSSL extensions should be used. - * - * $mode could be: - * - * - ecb - * - * - cbc - * - * - ctr - * - * - cfb - * - * - ofb - * - * - 3cbc - * - * - cbc3 (same as cbc) - * - * @see \phpseclib3\Crypt\DES::__construct() - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param string $mode - */ - public function __construct($mode) - { - switch (\strtolower($mode)) { - // In case of self::MODE_3CBC, we init as CRYPT_DES_MODE_CBC - // and additional flag us internally as 3CBC - case '3cbc': - parent::__construct('cbc'); - $this->mode_3cbc = \true; - // This three $des'es will do the 3CBC work (if $key > 64bits) - $this->des = [new \phpseclib3\Crypt\DES('cbc'), new \phpseclib3\Crypt\DES('cbc'), new \phpseclib3\Crypt\DES('cbc')]; - // we're going to be doing the padding, ourselves, so disable it in the \phpseclib3\Crypt\DES objects - $this->des[0]->disablePadding(); - $this->des[1]->disablePadding(); - $this->des[2]->disablePadding(); - break; - case 'cbc3': - $mode = 'cbc'; - // fall-through - // If not 3CBC, we init as usual - default: - parent::__construct($mode); - if ($this->mode == self::MODE_STREAM) { - throw new \phpseclib3\Crypt\BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - } - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($engine == self::ENGINE_OPENSSL) { - $this->cipher_name_openssl_ecb = 'des-ede3'; - $mode = $this->openssl_translate_mode(); - $this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode; - } - return parent::isValidEngineHelper($engine); - } - /** - * Sets the initialization vector. - * - * SetIV is not required when \phpseclib3\Crypt\Common\SymmetricKey::MODE_ECB is being used. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setIV() - * @param string $iv - */ - public function setIV($iv) - { - parent::setIV($iv); - if ($this->mode_3cbc) { - $this->des[0]->setIV($iv); - $this->des[1]->setIV($iv); - $this->des[2]->setIV($iv); - } - } - /** - * Sets the key length. - * - * Valid key lengths are 128 and 192 bits. - * - * If you want to use a 64-bit key use DES.php - * - * @see \phpseclib3\Crypt\Common\SymmetricKey:setKeyLength() - * @throws \LengthException if the key length is invalid - * @param int $length - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 192: - break; - default: - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128 or 192 bits are supported'); - } - parent::setKeyLength($length); - } - /** - * Sets the key. - * - * Triple DES can use 128-bit (eg. strlen($key) == 16) or 192-bit (eg. strlen($key) == 24) keys. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * @see \phpseclib3\Crypt\DES::setKey() - * @see \phpseclib3\Crypt\Common\SymmetricKey::setKey() - * @throws \LengthException if the key length is invalid - * @param string $key - */ - public function setKey($key) - { - if ($this->explicit_key_length !== \false && \strlen($key) != $this->explicit_key_length) { - throw new \LengthException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . \strlen($key) . ' bytes'); - } - switch (\strlen($key)) { - case 16: - $key .= \substr($key, 0, 8); - break; - case 24: - break; - default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 24 are supported'); - } - // copied from self::setKey() - $this->key = $key; - $this->key_length = \strlen($key); - $this->changed = $this->nonIVChanged = \true; - $this->setEngine(); - if ($this->mode_3cbc) { - $this->des[0]->setKey(\substr($key, 0, 8)); - $this->des[1]->setKey(\substr($key, 8, 8)); - $this->des[2]->setKey(\substr($key, 16, 8)); - } - } - /** - * Encrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @param string $plaintext - * @return string $cipertext - */ - public function encrypt($plaintext) - { - // parent::en/decrypt() is able to do all the work for all modes and keylengths, - // except for: self::MODE_3CBC (inner chaining CBC) with a key > 64bits - // if the key is smaller then 8, do what we'd normally do - if ($this->mode_3cbc && \strlen($this->key) > 8) { - return $this->des[2]->encrypt($this->des[1]->decrypt($this->des[0]->encrypt($this->pad($plaintext)))); - } - return parent::encrypt($plaintext); - } - /** - * Decrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if ($this->mode_3cbc && \strlen($this->key) > 8) { - return $this->unpad($this->des[0]->decrypt($this->des[1]->encrypt($this->des[2]->decrypt(\str_pad($ciphertext, \strlen($ciphertext) + 7 & 0xfffffff8, "\x00"))))); - } - return parent::decrypt($ciphertext); - } - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->encrypt(substr($plaintext, 8, 8)); - * - * - * echo $des->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the \phpseclib3\Crypt\DES() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::enableContinuousBuffer() - * @see self::disableContinuousBuffer() - */ - public function enableContinuousBuffer() - { - parent::enableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->enableContinuousBuffer(); - $this->des[1]->enableContinuousBuffer(); - $this->des[2]->enableContinuousBuffer(); - } - } - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::disableContinuousBuffer() - * @see self::enableContinuousBuffer() - */ - public function disableContinuousBuffer() - { - parent::disableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->disableContinuousBuffer(); - $this->des[1]->disableContinuousBuffer(); - $this->des[2]->disableContinuousBuffer(); - } - } - /** - * Creates the key schedule - * - * @see \phpseclib3\Crypt\DES::setupKey() - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - switch (\true) { - // if $key <= 64bits we configure our internal pure-php cipher engine - // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. - case \strlen($this->key) <= 8: - $this->des_rounds = 1; - break; - // otherwise, if $key > 64bits, we configure our engine to work as 3DES. - default: - $this->des_rounds = 3; - // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. - if ($this->mode_3cbc) { - $this->des[0]->setupKey(); - $this->des[1]->setupKey(); - $this->des[2]->setupKey(); - // because $des[0-2] will, now, do all the work we can return here - // not need unnecessary stress parent::setupKey() with our, now unused, $key. - return; - } - } - // setup our key - parent::setupKey(); - } - /** - * Sets the internal crypt engine - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @see \phpseclib3\Crypt\Common\SymmetricKey::setPreferredEngine() - * @param int $engine - */ - public function setPreferredEngine($engine) - { - if ($this->mode_3cbc) { - $this->des[0]->setPreferredEngine($engine); - $this->des[1]->setPreferredEngine($engine); - $this->des[2]->setPreferredEngine($engine); - } - parent::setPreferredEngine($engine); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php b/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php deleted file mode 100644 index 6ab22a6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php +++ /dev/null @@ -1,506 +0,0 @@ - - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $twofish->decrypt($twofish->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Crypt; - -use phpseclib3\Crypt\Common\BlockCipher; -use phpseclib3\Exception\BadModeException; -/** - * Pure-PHP implementation of Twofish. - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - */ -class Twofish extends BlockCipher -{ - /** - * The mcrypt specific name of the cipher - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'twofish'; - /** - * Optimizing value while CFB-encrypting - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 800; - /** - * Q-Table - * - * @var array - */ - private static $q0 = [0xa9, 0x67, 0xb3, 0xe8, 0x4, 0xfd, 0xa3, 0x76, 0x9a, 0x92, 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, 0xd, 0xc6, 0x35, 0x98, 0x18, 0xf7, 0xec, 0x6c, 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 0x94, 0x48, 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54, 0xdf, 0x23, 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, 0x63, 0x1, 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, 0xa6, 0xeb, 0xa5, 0xbe, 0x16, 0xc, 0xe3, 0x61, 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 0x25, 0xb, 0xbb, 0x4e, 0x89, 0x6b, 0x53, 0x6a, 0xb4, 0xf1, 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, 0xcc, 0x95, 0x3, 0x56, 0xd4, 0x1c, 0x1e, 0xd7, 0xfb, 0xc3, 0x8e, 0xb5, 0xe9, 0xcf, 0xbf, 0xba, 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 0x62, 0x71, 0x81, 0x79, 0x9, 0xad, 0x24, 0xcd, 0xf9, 0xd8, 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x8, 0x86, 0xe7, 0xa1, 0x1d, 0xaa, 0xed, 0x6, 0x70, 0xb2, 0xd2, 0x41, 0x7b, 0xa0, 0x11, 0x31, 0xc2, 0x27, 0x90, 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c, 0xb1, 0xab, 0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0xa, 0xef, 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, 0x47, 0x87, 0x6d, 0x46, 0xd6, 0x3e, 0x69, 0x64, 0x2a, 0xce, 0xcb, 0x2f, 0xfc, 0x97, 0x5, 0x7a, 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0xe, 0xa7, 0x5a, 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x2, 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, 0x57, 0xc7, 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, 0x7e, 0x15, 0x22, 0x12, 0x58, 0x7, 0x99, 0x34, 0x6e, 0x50, 0xde, 0x68, 0x65, 0xbc, 0xdb, 0xf8, 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0xf, 0x0, 0x6f, 0x9d, 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0]; - /** - * Q-Table - * - * @var array - */ - private static $q1 = [0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, 0x4a, 0xd3, 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, 0xd6, 0x32, 0xd8, 0xfd, 0x37, 0x71, 0xf1, 0xe1, 0x30, 0xf, 0xf8, 0x1b, 0x87, 0xfa, 0x6, 0x3f, 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x0, 0xbc, 0x9d, 0x6d, 0xc1, 0xb1, 0xe, 0x80, 0x5d, 0xd2, 0xd5, 0xa0, 0x84, 0x7, 0x14, 0xb5, 0x90, 0x2c, 0xa3, 0xb2, 0x73, 0x4c, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 0x62, 0x96, 0x6c, 0x42, 0xf7, 0x10, 0x7c, 0x28, 0x27, 0x8c, 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, 0xca, 0xe3, 0x85, 0xcb, 0x11, 0xd0, 0x93, 0xb8, 0xa6, 0x83, 0x20, 0xff, 0x9f, 0x77, 0xc3, 0xcc, 0x3, 0x6f, 0x8, 0xbf, 0x40, 0xe7, 0x2b, 0xe2, 0x79, 0xc, 0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, 0x66, 0x94, 0xa1, 0x1d, 0x3d, 0xf0, 0xde, 0xb3, 0xb, 0x72, 0xa7, 0x1c, 0xef, 0xd1, 0x53, 0x3e, 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 0x2a, 0x49, 0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x1, 0x18, 0x23, 0xdd, 0x1f, 0x4e, 0x2d, 0xf9, 0x48, 0x4f, 0xf2, 0x65, 0x8e, 0x78, 0x5c, 0x58, 0x19, 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f, 0x5, 0x64, 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, 0x29, 0x2e, 0xac, 0x15, 0x59, 0xa8, 0xa, 0x9e, 0x6e, 0x47, 0xdf, 0x34, 0x35, 0x6a, 0xcf, 0xdc, 0x22, 0xc9, 0xc0, 0x9b, 0x89, 0xd4, 0xed, 0xab, 0x12, 0xa2, 0xd, 0x52, 0xbb, 0x2, 0x2f, 0xa9, 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x4, 0xf6, 0xc2, 0x16, 0x25, 0x86, 0x56, 0x55, 0x9, 0xbe, 0x91]; - /** - * M-Table - * - * @var array - */ - private static $m0 = [0xbcbc3275, 0xecec21f3, 0x202043c6, 0xb3b3c9f4, 0xdada03db, 0x2028b7b, 0xe2e22bfb, 0x9e9efac8, 0xc9c9ec4a, 0xd4d409d3, 0x18186be6, 0x1e1e9f6b, 0x98980e45, 0xb2b2387d, 0xa6a6d2e8, 0x2626b74b, 0x3c3c57d6, 0x93938a32, 0x8282eed8, 0x525298fd, 0x7b7bd437, 0xbbbb3771, 0x5b5b97f1, 0x474783e1, 0x24243c30, 0x5151e20f, 0xbabac6f8, 0x4a4af31b, 0xbfbf4887, 0xd0d70fa, 0xb0b0b306, 0x7575de3f, 0xd2d2fd5e, 0x7d7d20ba, 0x666631ae, 0x3a3aa35b, 0x59591c8a, 0x0, 0xcdcd93bc, 0x1a1ae09d, 0xaeae2c6d, 0x7f7fabc1, 0x2b2bc7b1, 0xbebeb90e, 0xe0e0a080, 0x8a8a105d, 0x3b3b52d2, 0x6464bad5, 0xd8d888a0, 0xe7e7a584, 0x5f5fe807, 0x1b1b1114, 0x2c2cc2b5, 0xfcfcb490, 0x3131272c, 0x808065a3, 0x73732ab2, 0xc0c8173, 0x79795f4c, 0x6b6b4154, 0x4b4b0292, 0x53536974, 0x94948f36, 0x83831f51, 0x2a2a3638, 0xc4c49cb0, 0x2222c8bd, 0xd5d5f85a, 0xbdbdc3fc, 0x48487860, 0xffffce62, 0x4c4c0796, 0x4141776c, 0xc7c7e642, 0xebeb24f7, 0x1c1c1410, 0x5d5d637c, 0x36362228, 0x6767c027, 0xe9e9af8c, 0x4444f913, 0x1414ea95, 0xf5f5bb9c, 0xcfcf18c7, 0x3f3f2d24, 0xc0c0e346, 0x7272db3b, 0x54546c70, 0x29294cca, 0xf0f035e3, 0x808fe85, 0xc6c617cb, 0xf3f34f11, 0x8c8ce4d0, 0xa4a45993, 0xcaca96b8, 0x68683ba6, 0xb8b84d83, 0x38382820, 0xe5e52eff, 0xadad569f, 0xb0b8477, 0xc8c81dc3, 0x9999ffcc, 0x5858ed03, 0x19199a6f, 0xe0e0a08, 0x95957ebf, 0x70705040, 0xf7f730e7, 0x6e6ecf2b, 0x1f1f6ee2, 0xb5b53d79, 0x9090f0c, 0x616134aa, 0x57571682, 0x9f9f0b41, 0x9d9d803a, 0x111164ea, 0x2525cdb9, 0xafafdde4, 0x4545089a, 0xdfdf8da4, 0xa3a35c97, 0xeaead57e, 0x353558da, 0xededd07a, 0x4343fc17, 0xf8f8cb66, 0xfbfbb194, 0x3737d3a1, 0xfafa401d, 0xc2c2683d, 0xb4b4ccf0, 0x32325dde, 0x9c9c71b3, 0x5656e70b, 0xe3e3da72, 0x878760a7, 0x15151b1c, 0xf9f93aef, 0x6363bfd1, 0x3434a953, 0x9a9a853e, 0xb1b1428f, 0x7c7cd133, 0x88889b26, 0x3d3da65f, 0xa1a1d7ec, 0xe4e4df76, 0x8181942a, 0x91910149, 0xf0ffb81, 0xeeeeaa88, 0x161661ee, 0xd7d77321, 0x9797f5c4, 0xa5a5a81a, 0xfefe3feb, 0x6d6db5d9, 0x7878aec5, 0xc5c56d39, 0x1d1de599, 0x7676a4cd, 0x3e3edcad, 0xcbcb6731, 0xb6b6478b, 0xefef5b01, 0x12121e18, 0x6060c523, 0x6a6ab0dd, 0x4d4df61f, 0xcecee94e, 0xdede7c2d, 0x55559df9, 0x7e7e5a48, 0x2121b24f, 0x3037af2, 0xa0a02665, 0x5e5e198e, 0x5a5a6678, 0x65654b5c, 0x62624e58, 0xfdfd4519, 0x606f48d, 0x404086e5, 0xf2f2be98, 0x3333ac57, 0x17179067, 0x5058e7f, 0xe8e85e05, 0x4f4f7d64, 0x89896aaf, 0x10109563, 0x74742fb6, 0xa0a75fe, 0x5c5c92f5, 0x9b9b74b7, 0x2d2d333c, 0x3030d6a5, 0x2e2e49ce, 0x494989e9, 0x46467268, 0x77775544, 0xa8a8d8e0, 0x9696044d, 0x2828bd43, 0xa9a92969, 0xd9d97929, 0x8686912e, 0xd1d187ac, 0xf4f44a15, 0x8d8d1559, 0xd6d682a8, 0xb9b9bc0a, 0x42420d9e, 0xf6f6c16e, 0x2f2fb847, 0xdddd06df, 0x23233934, 0xcccc6235, 0xf1f1c46a, 0xc1c112cf, 0x8585ebdc, 0x8f8f9e22, 0x7171a1c9, 0x9090f0c0, 0xaaaa539b, 0x101f189, 0x8b8be1d4, 0x4e4e8ced, 0x8e8e6fab, 0xababa212, 0x6f6f3ea2, 0xe6e6540d, 0xdbdbf252, 0x92927bbb, 0xb7b7b602, 0x6969ca2f, 0x3939d9a9, 0xd3d30cd7, 0xa7a72361, 0xa2a2ad1e, 0xc3c399b4, 0x6c6c4450, 0x7070504, 0x4047ff6, 0x272746c2, 0xacaca716, 0xd0d07625, 0x50501386, 0xdcdcf756, 0x84841a55, 0xe1e15109, 0x7a7a25be, 0x1313ef91]; - /** - * M-Table - * - * @var array - */ - private static $m1 = [0xa9d93939, 0x67901717, 0xb3719c9c, 0xe8d2a6a6, 0x4050707, 0xfd985252, 0xa3658080, 0x76dfe4e4, 0x9a084545, 0x92024b4b, 0x80a0e0e0, 0x78665a5a, 0xe4ddafaf, 0xddb06a6a, 0xd1bf6363, 0x38362a2a, 0xd54e6e6, 0xc6432020, 0x3562cccc, 0x98bef2f2, 0x181e1212, 0xf724ebeb, 0xecd7a1a1, 0x6c774141, 0x43bd2828, 0x7532bcbc, 0x37d47b7b, 0x269b8888, 0xfa700d0d, 0x13f94444, 0x94b1fbfb, 0x485a7e7e, 0xf27a0303, 0xd0e48c8c, 0x8b47b6b6, 0x303c2424, 0x84a5e7e7, 0x54416b6b, 0xdf06dddd, 0x23c56060, 0x1945fdfd, 0x5ba33a3a, 0x3d68c2c2, 0x59158d8d, 0xf321ecec, 0xae316666, 0xa23e6f6f, 0x82165757, 0x63951010, 0x15befef, 0x834db8b8, 0x2e918686, 0xd9b56d6d, 0x511f8383, 0x9b53aaaa, 0x7c635d5d, 0xa63b6868, 0xeb3ffefe, 0xa5d63030, 0xbe257a7a, 0x16a7acac, 0xc0f0909, 0xe335f0f0, 0x6123a7a7, 0xc0f09090, 0x8cafe9e9, 0x3a809d9d, 0xf5925c5c, 0x73810c0c, 0x2c273131, 0x2576d0d0, 0xbe75656, 0xbb7b9292, 0x4ee9cece, 0x89f10101, 0x6b9f1e1e, 0x53a93434, 0x6ac4f1f1, 0xb499c3c3, 0xf1975b5b, 0xe1834747, 0xe66b1818, 0xbdc82222, 0x450e9898, 0xe26e1f1f, 0xf4c9b3b3, 0xb62f7474, 0x66cbf8f8, 0xccff9999, 0x95ea1414, 0x3ed5858, 0x56f7dcdc, 0xd4e18b8b, 0x1c1b1515, 0x1eada2a2, 0xd70cd3d3, 0xfb2be2e2, 0xc31dc8c8, 0x8e195e5e, 0xb5c22c2c, 0xe9894949, 0xcf12c1c1, 0xbf7e9595, 0xba207d7d, 0xea641111, 0x77840b0b, 0x396dc5c5, 0xaf6a8989, 0x33d17c7c, 0xc9a17171, 0x62ceffff, 0x7137bbbb, 0x81fb0f0f, 0x793db5b5, 0x951e1e1, 0xaddc3e3e, 0x242d3f3f, 0xcda47676, 0xf99d5555, 0xd8ee8282, 0xe5864040, 0xc5ae7878, 0xb9cd2525, 0x4d049696, 0x44557777, 0x80a0e0e, 0x86135050, 0xe730f7f7, 0xa1d33737, 0x1d40fafa, 0xaa346161, 0xed8c4e4e, 0x6b3b0b0, 0x706c5454, 0xb22a7373, 0xd2523b3b, 0x410b9f9f, 0x7b8b0202, 0xa088d8d8, 0x114ff3f3, 0x3167cbcb, 0xc2462727, 0x27c06767, 0x90b4fcfc, 0x20283838, 0xf67f0404, 0x60784848, 0xff2ee5e5, 0x96074c4c, 0x5c4b6565, 0xb1c72b2b, 0xab6f8e8e, 0x9e0d4242, 0x9cbbf5f5, 0x52f2dbdb, 0x1bf34a4a, 0x5fa63d3d, 0x9359a4a4, 0xabcb9b9, 0xef3af9f9, 0x91ef1313, 0x85fe0808, 0x49019191, 0xee611616, 0x2d7cdede, 0x4fb22121, 0x8f42b1b1, 0x3bdb7272, 0x47b82f2f, 0x8748bfbf, 0x6d2caeae, 0x46e3c0c0, 0xd6573c3c, 0x3e859a9a, 0x6929a9a9, 0x647d4f4f, 0x2a948181, 0xce492e2e, 0xcb17c6c6, 0x2fca6969, 0xfcc3bdbd, 0x975ca3a3, 0x55ee8e8, 0x7ad0eded, 0xac87d1d1, 0x7f8e0505, 0xd5ba6464, 0x1aa8a5a5, 0x4bb72626, 0xeb9bebe, 0xa7608787, 0x5af8d5d5, 0x28223636, 0x14111b1b, 0x3fde7575, 0x2979d9d9, 0x88aaeeee, 0x3c332d2d, 0x4c5f7979, 0x2b6b7b7, 0xb896caca, 0xda583535, 0xb09cc4c4, 0x17fc4343, 0x551a8484, 0x1ff64d4d, 0x8a1c5959, 0x7d38b2b2, 0x57ac3333, 0xc718cfcf, 0x8df40606, 0x74695353, 0xb7749b9b, 0xc4f59797, 0x9f56adad, 0x72dae3e3, 0x7ed5eaea, 0x154af4f4, 0x229e8f8f, 0x12a2abab, 0x584e6262, 0x7e85f5f, 0x99e51d1d, 0x34392323, 0x6ec1f6f6, 0x50446c6c, 0xde5d3232, 0x68724646, 0x6526a0a0, 0xbc93cdcd, 0xdb03dada, 0xf8c6baba, 0xc8fa9e9e, 0xa882d6d6, 0x2bcf6e6e, 0x40507070, 0xdceb8585, 0xfe750a0a, 0x328a9393, 0xa48ddfdf, 0xca4c2929, 0x10141c1c, 0x2173d7d7, 0xf0ccb4b4, 0xd309d4d4, 0x5d108a8a, 0xfe25151, 0x0, 0x6f9a1919, 0x9de01a1a, 0x368f9494, 0x42e6c7c7, 0x4aecc9c9, 0x5efdd2d2, 0xc1ab7f7f, 0xe0d8a8a8]; - /** - * M-Table - * - * @var array - */ - private static $m2 = [0xbc75bc32, 0xecf3ec21, 0x20c62043, 0xb3f4b3c9, 0xdadbda03, 0x27b028b, 0xe2fbe22b, 0x9ec89efa, 0xc94ac9ec, 0xd4d3d409, 0x18e6186b, 0x1e6b1e9f, 0x9845980e, 0xb27db238, 0xa6e8a6d2, 0x264b26b7, 0x3cd63c57, 0x9332938a, 0x82d882ee, 0x52fd5298, 0x7b377bd4, 0xbb71bb37, 0x5bf15b97, 0x47e14783, 0x2430243c, 0x510f51e2, 0xbaf8bac6, 0x4a1b4af3, 0xbf87bf48, 0xdfa0d70, 0xb006b0b3, 0x753f75de, 0xd25ed2fd, 0x7dba7d20, 0x66ae6631, 0x3a5b3aa3, 0x598a591c, 0x0, 0xcdbccd93, 0x1a9d1ae0, 0xae6dae2c, 0x7fc17fab, 0x2bb12bc7, 0xbe0ebeb9, 0xe080e0a0, 0x8a5d8a10, 0x3bd23b52, 0x64d564ba, 0xd8a0d888, 0xe784e7a5, 0x5f075fe8, 0x1b141b11, 0x2cb52cc2, 0xfc90fcb4, 0x312c3127, 0x80a38065, 0x73b2732a, 0xc730c81, 0x794c795f, 0x6b546b41, 0x4b924b02, 0x53745369, 0x9436948f, 0x8351831f, 0x2a382a36, 0xc4b0c49c, 0x22bd22c8, 0xd55ad5f8, 0xbdfcbdc3, 0x48604878, 0xff62ffce, 0x4c964c07, 0x416c4177, 0xc742c7e6, 0xebf7eb24, 0x1c101c14, 0x5d7c5d63, 0x36283622, 0x672767c0, 0xe98ce9af, 0x441344f9, 0x149514ea, 0xf59cf5bb, 0xcfc7cf18, 0x3f243f2d, 0xc046c0e3, 0x723b72db, 0x5470546c, 0x29ca294c, 0xf0e3f035, 0x88508fe, 0xc6cbc617, 0xf311f34f, 0x8cd08ce4, 0xa493a459, 0xcab8ca96, 0x68a6683b, 0xb883b84d, 0x38203828, 0xe5ffe52e, 0xad9fad56, 0xb770b84, 0xc8c3c81d, 0x99cc99ff, 0x580358ed, 0x196f199a, 0xe080e0a, 0x95bf957e, 0x70407050, 0xf7e7f730, 0x6e2b6ecf, 0x1fe21f6e, 0xb579b53d, 0x90c090f, 0x61aa6134, 0x57825716, 0x9f419f0b, 0x9d3a9d80, 0x11ea1164, 0x25b925cd, 0xafe4afdd, 0x459a4508, 0xdfa4df8d, 0xa397a35c, 0xea7eead5, 0x35da3558, 0xed7aedd0, 0x431743fc, 0xf866f8cb, 0xfb94fbb1, 0x37a137d3, 0xfa1dfa40, 0xc23dc268, 0xb4f0b4cc, 0x32de325d, 0x9cb39c71, 0x560b56e7, 0xe372e3da, 0x87a78760, 0x151c151b, 0xf9eff93a, 0x63d163bf, 0x345334a9, 0x9a3e9a85, 0xb18fb142, 0x7c337cd1, 0x8826889b, 0x3d5f3da6, 0xa1eca1d7, 0xe476e4df, 0x812a8194, 0x91499101, 0xf810ffb, 0xee88eeaa, 0x16ee1661, 0xd721d773, 0x97c497f5, 0xa51aa5a8, 0xfeebfe3f, 0x6dd96db5, 0x78c578ae, 0xc539c56d, 0x1d991de5, 0x76cd76a4, 0x3ead3edc, 0xcb31cb67, 0xb68bb647, 0xef01ef5b, 0x1218121e, 0x602360c5, 0x6add6ab0, 0x4d1f4df6, 0xce4ecee9, 0xde2dde7c, 0x55f9559d, 0x7e487e5a, 0x214f21b2, 0x3f2037a, 0xa065a026, 0x5e8e5e19, 0x5a785a66, 0x655c654b, 0x6258624e, 0xfd19fd45, 0x68d06f4, 0x40e54086, 0xf298f2be, 0x335733ac, 0x17671790, 0x57f058e, 0xe805e85e, 0x4f644f7d, 0x89af896a, 0x10631095, 0x74b6742f, 0xafe0a75, 0x5cf55c92, 0x9bb79b74, 0x2d3c2d33, 0x30a530d6, 0x2ece2e49, 0x49e94989, 0x46684672, 0x77447755, 0xa8e0a8d8, 0x964d9604, 0x284328bd, 0xa969a929, 0xd929d979, 0x862e8691, 0xd1acd187, 0xf415f44a, 0x8d598d15, 0xd6a8d682, 0xb90ab9bc, 0x429e420d, 0xf66ef6c1, 0x2f472fb8, 0xdddfdd06, 0x23342339, 0xcc35cc62, 0xf16af1c4, 0xc1cfc112, 0x85dc85eb, 0x8f228f9e, 0x71c971a1, 0x90c090f0, 0xaa9baa53, 0x18901f1, 0x8bd48be1, 0x4eed4e8c, 0x8eab8e6f, 0xab12aba2, 0x6fa26f3e, 0xe60de654, 0xdb52dbf2, 0x92bb927b, 0xb702b7b6, 0x692f69ca, 0x39a939d9, 0xd3d7d30c, 0xa761a723, 0xa21ea2ad, 0xc3b4c399, 0x6c506c44, 0x7040705, 0x4f6047f, 0x27c22746, 0xac16aca7, 0xd025d076, 0x50865013, 0xdc56dcf7, 0x8455841a, 0xe109e151, 0x7abe7a25, 0x139113ef]; - /** - * M-Table - * - * @var array - */ - private static $m3 = [0xd939a9d9, 0x90176790, 0x719cb371, 0xd2a6e8d2, 0x5070405, 0x9852fd98, 0x6580a365, 0xdfe476df, 0x8459a08, 0x24b9202, 0xa0e080a0, 0x665a7866, 0xddafe4dd, 0xb06addb0, 0xbf63d1bf, 0x362a3836, 0x54e60d54, 0x4320c643, 0x62cc3562, 0xbef298be, 0x1e12181e, 0x24ebf724, 0xd7a1ecd7, 0x77416c77, 0xbd2843bd, 0x32bc7532, 0xd47b37d4, 0x9b88269b, 0x700dfa70, 0xf94413f9, 0xb1fb94b1, 0x5a7e485a, 0x7a03f27a, 0xe48cd0e4, 0x47b68b47, 0x3c24303c, 0xa5e784a5, 0x416b5441, 0x6dddf06, 0xc56023c5, 0x45fd1945, 0xa33a5ba3, 0x68c23d68, 0x158d5915, 0x21ecf321, 0x3166ae31, 0x3e6fa23e, 0x16578216, 0x95106395, 0x5bef015b, 0x4db8834d, 0x91862e91, 0xb56dd9b5, 0x1f83511f, 0x53aa9b53, 0x635d7c63, 0x3b68a63b, 0x3ffeeb3f, 0xd630a5d6, 0x257abe25, 0xa7ac16a7, 0xf090c0f, 0x35f0e335, 0x23a76123, 0xf090c0f0, 0xafe98caf, 0x809d3a80, 0x925cf592, 0x810c7381, 0x27312c27, 0x76d02576, 0xe7560be7, 0x7b92bb7b, 0xe9ce4ee9, 0xf10189f1, 0x9f1e6b9f, 0xa93453a9, 0xc4f16ac4, 0x99c3b499, 0x975bf197, 0x8347e183, 0x6b18e66b, 0xc822bdc8, 0xe98450e, 0x6e1fe26e, 0xc9b3f4c9, 0x2f74b62f, 0xcbf866cb, 0xff99ccff, 0xea1495ea, 0xed5803ed, 0xf7dc56f7, 0xe18bd4e1, 0x1b151c1b, 0xada21ead, 0xcd3d70c, 0x2be2fb2b, 0x1dc8c31d, 0x195e8e19, 0xc22cb5c2, 0x8949e989, 0x12c1cf12, 0x7e95bf7e, 0x207dba20, 0x6411ea64, 0x840b7784, 0x6dc5396d, 0x6a89af6a, 0xd17c33d1, 0xa171c9a1, 0xceff62ce, 0x37bb7137, 0xfb0f81fb, 0x3db5793d, 0x51e10951, 0xdc3eaddc, 0x2d3f242d, 0xa476cda4, 0x9d55f99d, 0xee82d8ee, 0x8640e586, 0xae78c5ae, 0xcd25b9cd, 0x4964d04, 0x55774455, 0xa0e080a, 0x13508613, 0x30f7e730, 0xd337a1d3, 0x40fa1d40, 0x3461aa34, 0x8c4eed8c, 0xb3b006b3, 0x6c54706c, 0x2a73b22a, 0x523bd252, 0xb9f410b, 0x8b027b8b, 0x88d8a088, 0x4ff3114f, 0x67cb3167, 0x4627c246, 0xc06727c0, 0xb4fc90b4, 0x28382028, 0x7f04f67f, 0x78486078, 0x2ee5ff2e, 0x74c9607, 0x4b655c4b, 0xc72bb1c7, 0x6f8eab6f, 0xd429e0d, 0xbbf59cbb, 0xf2db52f2, 0xf34a1bf3, 0xa63d5fa6, 0x59a49359, 0xbcb90abc, 0x3af9ef3a, 0xef1391ef, 0xfe0885fe, 0x1914901, 0x6116ee61, 0x7cde2d7c, 0xb2214fb2, 0x42b18f42, 0xdb723bdb, 0xb82f47b8, 0x48bf8748, 0x2cae6d2c, 0xe3c046e3, 0x573cd657, 0x859a3e85, 0x29a96929, 0x7d4f647d, 0x94812a94, 0x492ece49, 0x17c6cb17, 0xca692fca, 0xc3bdfcc3, 0x5ca3975c, 0x5ee8055e, 0xd0ed7ad0, 0x87d1ac87, 0x8e057f8e, 0xba64d5ba, 0xa8a51aa8, 0xb7264bb7, 0xb9be0eb9, 0x6087a760, 0xf8d55af8, 0x22362822, 0x111b1411, 0xde753fde, 0x79d92979, 0xaaee88aa, 0x332d3c33, 0x5f794c5f, 0xb6b702b6, 0x96cab896, 0x5835da58, 0x9cc4b09c, 0xfc4317fc, 0x1a84551a, 0xf64d1ff6, 0x1c598a1c, 0x38b27d38, 0xac3357ac, 0x18cfc718, 0xf4068df4, 0x69537469, 0x749bb774, 0xf597c4f5, 0x56ad9f56, 0xdae372da, 0xd5ea7ed5, 0x4af4154a, 0x9e8f229e, 0xa2ab12a2, 0x4e62584e, 0xe85f07e8, 0xe51d99e5, 0x39233439, 0xc1f66ec1, 0x446c5044, 0x5d32de5d, 0x72466872, 0x26a06526, 0x93cdbc93, 0x3dadb03, 0xc6baf8c6, 0xfa9ec8fa, 0x82d6a882, 0xcf6e2bcf, 0x50704050, 0xeb85dceb, 0x750afe75, 0x8a93328a, 0x8ddfa48d, 0x4c29ca4c, 0x141c1014, 0x73d72173, 0xccb4f0cc, 0x9d4d309, 0x108a5d10, 0xe2510fe2, 0x0, 0x9a196f9a, 0xe01a9de0, 0x8f94368f, 0xe6c742e6, 0xecc94aec, 0xfdd25efd, 0xab7fc1ab, 0xd8a8e0d8]; - /** - * The Key Schedule Array - * - * @var array - */ - private $K = []; - /** - * The Key depended S-Table 0 - * - * @var array - */ - private $S0 = []; - /** - * The Key depended S-Table 1 - * - * @var array - */ - private $S1 = []; - /** - * The Key depended S-Table 2 - * - * @var array - */ - private $S2 = []; - /** - * The Key depended S-Table 3 - * - * @var array - */ - private $S3 = []; - /** - * Holds the last used key - * - * @var array - */ - private $kl; - /** - * The Key Length (in bytes) - * - * @see Crypt_Twofish::setKeyLength() - * @var int - */ - protected $key_length = 16; - /** - * Default Constructor. - * - * @param string $mode - * @throws BadModeException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - /** - * Initialize Static Variables - */ - protected static function initialize_static_variables() - { - if (\is_float(self::$m3[0])) { - self::$m0 = \array_map('intval', self::$m0); - self::$m1 = \array_map('intval', self::$m1); - self::$m2 = \array_map('intval', self::$m2); - self::$m3 = \array_map('intval', self::$m3); - self::$q0 = \array_map('intval', self::$q0); - self::$q1 = \array_map('intval', self::$q1); - } - parent::initialize_static_variables(); - } - /** - * Sets the key length. - * - * Valid key lengths are 128, 192 or 256 bits - * - * @param int $length - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 192: - case 256: - break; - default: - throw new \LengthException('Key of size ' . $length . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); - } - parent::setKeyLength($length); - } - /** - * Sets the key. - * - * Rijndael supports five different key lengths - * - * @see setKeyLength() - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (\strlen($key)) { - case 16: - case 24: - case 32: - break; - default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); - } - parent::setKey($key); - } - /** - * Setup the key (expansion) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupKey() - */ - protected function setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key]; - /* Key expanding and generating the key-depended s-boxes */ - $le_longs = \unpack('V*', $this->key); - $key = \unpack('C*', $this->key); - $m0 = self::$m0; - $m1 = self::$m1; - $m2 = self::$m2; - $m3 = self::$m3; - $q0 = self::$q0; - $q1 = self::$q1; - $K = $S0 = $S1 = $S2 = $S3 = []; - switch (\strlen($this->key)) { - case 16: - list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[1], $le_longs[2]); - list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[3], $le_longs[4]); - for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$i] ^ $key[9]] ^ $key[1]] ^ $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; - $B = $B << 8 | $B >> 24 & 0xff; - $A = self::safe_intval($A + $B); - $K[] = $A; - $A = self::safe_intval($A + $B); - $K[] = $A << 9 | $A >> 23 & 0x1ff; - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; - } - break; - case 24: - list($sb, $sa, $s9, $s8) = $this->mdsrem($le_longs[1], $le_longs[2]); - list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[3], $le_longs[4]); - list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[5], $le_longs[6]); - for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[9]] ^ $key[1]] ^ $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = $B << 8 | $B >> 24 & 0xff; - $A = self::safe_intval($A + $B); - $K[] = $A; - $A = self::safe_intval($A + $B); - $K[] = $A << 9 | $A >> 23 & 0x1ff; - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; - } - break; - default: - // 32 - list($sf, $se, $sd, $sc) = $this->mdsrem($le_longs[1], $le_longs[2]); - list($sb, $sa, $s9, $s8) = $this->mdsrem($le_longs[3], $le_longs[4]); - list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[5], $le_longs[6]); - list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[7], $le_longs[8]); - for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[9]] ^ $key[1]] ^ $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = $B << 8 | $B >> 24 & 0xff; - $A = self::safe_intval($A + $B); - $K[] = $A; - $A = self::safe_intval($A + $B); - $K[] = $A << 9 | $A >> 23 & 0x1ff; - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; - } - } - $this->K = $K; - $this->S0 = $S0; - $this->S1 = $S1; - $this->S2 = $S2; - $this->S3 = $S3; - } - /** - * _mdsrem function using by the twofish cipher algorithm - * - * @param string $A - * @param string $B - * @return array - */ - private function mdsrem($A, $B) - { - // No gain by unrolling this loop. - for ($i = 0; $i < 8; ++$i) { - // Get most significant coefficient. - $t = 0xff & $B >> 24; - // Shift the others up. - $B = $B << 8 | 0xff & $A >> 24; - $A <<= 8; - $u = $t << 1; - // Subtract the modular polynomial on overflow. - if ($t & 0x80) { - $u ^= 0x14d; - } - // Remove t * (a * x^2 + 1). - $B ^= $t ^ $u << 16; - // Form u = a*t + t/a = t*(a + 1/a). - $u ^= 0x7fffffff & $t >> 1; - // Add the modular polynomial on underflow. - if ($t & 0x1) { - $u ^= 0xa6; - } - // Remove t * (a + 1/a) * (x^3 + x). - $B ^= $u << 24 | $u << 8; - } - return [0xff & $B >> 24, 0xff & $B >> 16, 0xff & $B >> 8, 0xff & $B]; - } - /** - * Encrypts a block - * - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - $in = \unpack("V4", $in); - $R0 = $K[0] ^ $in[1]; - $R1 = $K[1] ^ $in[2]; - $R2 = $K[2] ^ $in[3]; - $R3 = $K[3] ^ $in[4]; - $ki = 7; - while ($ki < 39) { - $t0 = $S0[$R0 & 0xff] ^ $S1[$R0 >> 8 & 0xff] ^ $S2[$R0 >> 16 & 0xff] ^ $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ $S1[$R1 & 0xff] ^ $S2[$R1 >> 8 & 0xff] ^ $S3[$R1 >> 16 & 0xff]; - $R2 ^= self::safe_intval($t0 + $t1 + $K[++$ki]); - $R2 = $R2 >> 1 & 0x7fffffff | $R2 << 31; - $R3 = ($R3 >> 31 & 1 | $R3 << 1) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); - $t0 = $S0[$R2 & 0xff] ^ $S1[$R2 >> 8 & 0xff] ^ $S2[$R2 >> 16 & 0xff] ^ $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ $S1[$R3 & 0xff] ^ $S2[$R3 >> 8 & 0xff] ^ $S3[$R3 >> 16 & 0xff]; - $R0 ^= self::safe_intval($t0 + $t1 + $K[++$ki]); - $R0 = $R0 >> 1 & 0x7fffffff | $R0 << 31; - $R1 = ($R1 >> 31 & 1 | $R1 << 1) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); - } - // @codingStandardsIgnoreStart - return \pack("V4", $K[4] ^ $R2, $K[5] ^ $R3, $K[6] ^ $R0, $K[7] ^ $R1); - // @codingStandardsIgnoreEnd - } - /** - * Decrypts a block - * - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - $in = \unpack("V4", $in); - $R0 = $K[4] ^ $in[1]; - $R1 = $K[5] ^ $in[2]; - $R2 = $K[6] ^ $in[3]; - $R3 = $K[7] ^ $in[4]; - $ki = 40; - while ($ki > 8) { - $t0 = $S0[$R0 & 0xff] ^ $S1[$R0 >> 8 & 0xff] ^ $S2[$R0 >> 16 & 0xff] ^ $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ $S1[$R1 & 0xff] ^ $S2[$R1 >> 8 & 0xff] ^ $S3[$R1 >> 16 & 0xff]; - $R3 ^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]); - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]); - $t0 = $S0[$R2 & 0xff] ^ $S1[$R2 >> 8 & 0xff] ^ $S2[$R2 >> 16 & 0xff] ^ $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ $S1[$R3 & 0xff] ^ $S2[$R3 >> 8 & 0xff] ^ $S3[$R3 >> 16 & 0xff]; - $R1 ^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]); - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]); - } - // @codingStandardsIgnoreStart - return \pack("V4", $K[0] ^ $R2, $K[1] ^ $R3, $K[2] ^ $R0, $K[3] ^ $R1); - // @codingStandardsIgnoreEnd - } - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::_setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - $K = $this->K; - $init_crypt = ' - static $S0, $S1, $S2, $S3; - if (!$S0) { - for ($i = 0; $i < 256; ++$i) { - $S0[] = (int)$this->S0[$i]; - $S1[] = (int)$this->S1[$i]; - $S2[] = (int)$this->S2[$i]; - $S3[] = (int)$this->S3[$i]; - } - } - '; - $safeint = self::safe_intval_inline(); - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("V4", $in); - $R0 = ' . $K[0] . ' ^ $in[1]; - $R1 = ' . $K[1] . ' ^ $in[2]; - $R2 = ' . $K[2] . ' ^ $in[3]; - $R3 = ' . $K[3] . ' ^ $in[4]; - '; - for ($ki = 7, $i = 0; $i < 8; ++$i) { - $encrypt_block .= ' - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2^= ' . \sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . '; - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . \sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0^= ' . \sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . '; - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . \sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; - '; - } - $encrypt_block .= ' - $in = pack("V4", ' . $K[4] . ' ^ $R2, - ' . $K[5] . ' ^ $R3, - ' . $K[6] . ' ^ $R0, - ' . $K[7] . ' ^ $R1); - '; - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("V4", $in); - $R0 = ' . $K[4] . ' ^ $in[1]; - $R1 = ' . $K[5] . ' ^ $in[2]; - $R2 = ' . $K[6] . ' ^ $in[3]; - $R3 = ' . $K[7] . ' ^ $in[4]; - '; - for ($ki = 40, $i = 0; $i < 8; ++$i) { - $decrypt_block .= ' - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3^= ' . \sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . \sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1^= ' . \sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . \sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; - '; - } - $decrypt_block .= ' - $in = pack("V4", ' . $K[0] . ' ^ $R2, - ' . $K[1] . ' ^ $R3, - ' . $K[2] . ' ^ $R0, - ' . $K[3] . ' ^ $R1); - '; - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'init_encrypt' => '', 'init_decrypt' => '', 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php deleted file mode 100644 index 8a2459e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * BadConfigurationException - * - * @author Jim Wigginton - */ -class BadConfigurationException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php deleted file mode 100644 index 30af296..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * BadDecryptionException - * - * @author Jim Wigginton - */ -class BadDecryptionException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php deleted file mode 100644 index a532806..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * BadModeException - * - * @author Jim Wigginton - */ -class BadModeException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php deleted file mode 100644 index 9ac921e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * ConnectionClosedException - * - * @author Jim Wigginton - */ -class ConnectionClosedException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php deleted file mode 100644 index ae06190..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * FileNotFoundException - * - * @author Jim Wigginton - */ -class FileNotFoundException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php deleted file mode 100644 index 8811c3d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * InconsistentSetupException - * - * @author Jim Wigginton - */ -class InconsistentSetupException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php deleted file mode 100644 index 0aafa1c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * InsufficientSetupException - * - * @author Jim Wigginton - */ -class InsufficientSetupException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php deleted file mode 100644 index 6093b3a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * NoKeyLoadedException - * - * @author Jim Wigginton - */ -class NoKeyLoadedException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php deleted file mode 100644 index 44ce634..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * NoSupportedAlgorithmsException - * - * @author Jim Wigginton - */ -class NoSupportedAlgorithmsException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php deleted file mode 100644 index 46b32e1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * UnableToConnectException - * - * @author Jim Wigginton - */ -class UnableToConnectException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php deleted file mode 100644 index 5cccb82..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * UnsupportedAlgorithmException - * - * @author Jim Wigginton - */ -class UnsupportedAlgorithmException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php deleted file mode 100644 index e5448f3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * UnsupportedCurveException - * - * @author Jim Wigginton - */ -class UnsupportedCurveException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php deleted file mode 100644 index 0194e65..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * UnsupportedFormatException - * - * @author Jim Wigginton - */ -class UnsupportedFormatException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php b/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php deleted file mode 100644 index 9d70381..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Exception; - -/** - * UnsupportedOperationException - * - * @author Jim Wigginton - */ -class UnsupportedOperationException extends \RuntimeException -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ANSI.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ANSI.php deleted file mode 100644 index a5c3e35..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ANSI.php +++ /dev/null @@ -1,553 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File; - -/** - * Pure-PHP ANSI Decoder - * - * @author Jim Wigginton - */ -class ANSI -{ - /** - * Max Width - * - * @var int - */ - private $max_x; - /** - * Max Height - * - * @var int - */ - private $max_y; - /** - * Max History - * - * @var int - */ - private $max_history; - /** - * History - * - * @var array - */ - private $history; - /** - * History Attributes - * - * @var array - */ - private $history_attrs; - /** - * Current Column - * - * @var int - */ - private $x; - /** - * Current Row - * - * @var int - */ - private $y; - /** - * Old Column - * - * @var int - */ - private $old_x; - /** - * Old Row - * - * @var int - */ - private $old_y; - /** - * An empty attribute cell - * - * @var object - */ - private $base_attr_cell; - /** - * The current attribute cell - * - * @var object - */ - private $attr_cell; - /** - * An empty attribute row - * - * @var array - */ - private $attr_row; - /** - * The current screen text - * - * @var list - */ - private $screen; - /** - * The current screen attributes - * - * @var array - */ - private $attrs; - /** - * Current ANSI code - * - * @var string - */ - private $ansi; - /** - * Tokenization - * - * @var array - */ - private $tokenization; - /** - * Default Constructor. - * - * @return \phpseclib3\File\ANSI - */ - public function __construct() - { - $attr_cell = new \stdClass(); - $attr_cell->bold = \false; - $attr_cell->underline = \false; - $attr_cell->blink = \false; - $attr_cell->background = 'black'; - $attr_cell->foreground = 'white'; - $attr_cell->reverse = \false; - $this->base_attr_cell = clone $attr_cell; - $this->attr_cell = clone $attr_cell; - $this->setHistory(200); - $this->setDimensions(80, 24); - } - /** - * Set terminal width and height - * - * Resets the screen as well - * - * @param int $x - * @param int $y - */ - public function setDimensions($x, $y) - { - $this->max_x = $x - 1; - $this->max_y = $y - 1; - $this->x = $this->y = 0; - $this->history = $this->history_attrs = []; - $this->attr_row = \array_fill(0, $this->max_x + 2, $this->base_attr_cell); - $this->screen = \array_fill(0, $this->max_y + 1, ''); - $this->attrs = \array_fill(0, $this->max_y + 1, $this->attr_row); - $this->ansi = ''; - } - /** - * Set the number of lines that should be logged past the terminal height - * - * @param int $history - */ - public function setHistory($history) - { - $this->max_history = $history; - } - /** - * Load a string - * - * @param string $source - */ - public function loadString($source) - { - $this->setDimensions($this->max_x + 1, $this->max_y + 1); - $this->appendString($source); - } - /** - * Appdend a string - * - * @param string $source - */ - public function appendString($source) - { - $this->tokenization = ['']; - for ($i = 0; $i < \strlen($source); $i++) { - if (\strlen($this->ansi)) { - $this->ansi .= $source[$i]; - $chr = \ord($source[$i]); - // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements - // single character CSI's not currently supported - switch (\true) { - case $this->ansi == "\x1b=": - $this->ansi = ''; - continue 2; - case \strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != \ord('['): - case \strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: - break; - default: - continue 2; - } - $this->tokenization[] = $this->ansi; - $this->tokenization[] = ''; - // http://ascii-table.com/ansi-escape-sequences-vt-100.php - switch ($this->ansi) { - case "\x1b[H": - // Move cursor to upper left corner - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $this->y = 0; - break; - case "\x1b[J": - // Clear screen from cursor down - $this->history = \array_merge($this->history, \array_slice(\array_splice($this->screen, $this->y + 1), 0, $this->old_y)); - $this->screen = \array_merge($this->screen, \array_fill($this->y, $this->max_y, '')); - $this->history_attrs = \array_merge($this->history_attrs, \array_slice(\array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); - $this->attrs = \array_merge($this->attrs, \array_fill($this->y, $this->max_y, $this->attr_row)); - if (\count($this->history) == $this->max_history) { - \array_shift($this->history); - \array_shift($this->history_attrs); - } - // fall-through - case "\x1b[K": - // Clear screen from cursor right - $this->screen[$this->y] = \substr($this->screen[$this->y], 0, $this->x); - \array_splice($this->attrs[$this->y], $this->x + 1, $this->max_x - $this->x, \array_fill($this->x, $this->max_x - ($this->x - 1), $this->base_attr_cell)); - break; - case "\x1b[2K": - // Clear entire line - $this->screen[$this->y] = \str_repeat(' ', $this->x); - $this->attrs[$this->y] = $this->attr_row; - break; - case "\x1b[?1h": - // set cursor key to application - case "\x1b[?25h": - // show the cursor - case "\x1b(B": - // set united states g0 character set - break; - case "\x1bE": - // Move to next line - $this->newLine(); - $this->x = 0; - break; - default: - switch (\true) { - case \preg_match('#\\x1B\\[(\\d+)B#', $this->ansi, $match): - // Move cursor down n lines - $this->old_y = $this->y; - $this->y += (int) $match[1]; - break; - case \preg_match('#\\x1B\\[(\\d+);(\\d+)H#', $this->ansi, $match): - // Move cursor to screen location v,h - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $match[2] - 1; - $this->y = (int) $match[1] - 1; - break; - case \preg_match('#\\x1B\\[(\\d+)C#', $this->ansi, $match): - // Move cursor right n lines - $this->old_x = $this->x; - $this->x += $match[1]; - break; - case \preg_match('#\\x1B\\[(\\d+)D#', $this->ansi, $match): - // Move cursor left n lines - $this->old_x = $this->x; - $this->x -= $match[1]; - if ($this->x < 0) { - $this->x = 0; - } - break; - case \preg_match('#\\x1B\\[(\\d+);(\\d+)r#', $this->ansi, $match): - // Set top and bottom lines of a window - break; - case \preg_match('#\\x1B\\[(\\d*(?:;\\d*)*)m#', $this->ansi, $match): - // character attributes - $attr_cell =& $this->attr_cell; - $mods = \explode(';', $match[1]); - foreach ($mods as $mod) { - switch ($mod) { - case '': - case '0': - // Turn off character attributes - $attr_cell = clone $this->base_attr_cell; - break; - case '1': - // Turn bold mode on - $attr_cell->bold = \true; - break; - case '4': - // Turn underline mode on - $attr_cell->underline = \true; - break; - case '5': - // Turn blinking mode on - $attr_cell->blink = \true; - break; - case '7': - // Turn reverse video on - $attr_cell->reverse = !$attr_cell->reverse; - $temp = $attr_cell->background; - $attr_cell->background = $attr_cell->foreground; - $attr_cell->foreground = $temp; - break; - default: - // set colors - //$front = $attr_cell->reverse ? &$attr_cell->background : &$attr_cell->foreground; - $front =& $attr_cell->{$attr_cell->reverse ? 'background' : 'foreground'}; - //$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background; - $back =& $attr_cell->{$attr_cell->reverse ? 'foreground' : 'background'}; - switch ($mod) { - // @codingStandardsIgnoreStart - case '30': - $front = 'black'; - break; - case '31': - $front = 'red'; - break; - case '32': - $front = 'green'; - break; - case '33': - $front = 'yellow'; - break; - case '34': - $front = 'blue'; - break; - case '35': - $front = 'magenta'; - break; - case '36': - $front = 'cyan'; - break; - case '37': - $front = 'white'; - break; - case '40': - $back = 'black'; - break; - case '41': - $back = 'red'; - break; - case '42': - $back = 'green'; - break; - case '43': - $back = 'yellow'; - break; - case '44': - $back = 'blue'; - break; - case '45': - $back = 'magenta'; - break; - case '46': - $back = 'cyan'; - break; - case '47': - $back = 'white'; - break; - // @codingStandardsIgnoreEnd - default: - //user_error('Unsupported attribute: ' . $mod); - $this->ansi = ''; - break 2; - } - } - } - break; - default: - } - } - $this->ansi = ''; - continue; - } - $this->tokenization[\count($this->tokenization) - 1] .= $source[$i]; - switch ($source[$i]) { - case "\r": - $this->x = 0; - break; - case "\n": - $this->newLine(); - break; - case "\x08": - // backspace - if ($this->x) { - $this->x--; - $this->attrs[$this->y][$this->x] = clone $this->base_attr_cell; - $this->screen[$this->y] = \substr_replace($this->screen[$this->y], $source[$i], $this->x, 1); - } - break; - case "\x0f": - // shift - break; - case "\x1b": - // start ANSI escape code - $this->tokenization[\count($this->tokenization) - 1] = \substr($this->tokenization[\count($this->tokenization) - 1], 0, -1); - //if (!strlen($this->tokenization[count($this->tokenization) - 1])) { - // array_pop($this->tokenization); - //} - $this->ansi .= "\x1b"; - break; - default: - $this->attrs[$this->y][$this->x] = clone $this->attr_cell; - if ($this->x > \strlen($this->screen[$this->y])) { - $this->screen[$this->y] = \str_repeat(' ', $this->x); - } - $this->screen[$this->y] = \substr_replace($this->screen[$this->y], $source[$i], $this->x, 1); - if ($this->x > $this->max_x) { - $this->x = 0; - $this->newLine(); - } else { - $this->x++; - } - } - } - } - /** - * Add a new line - * - * Also update the $this->screen and $this->history buffers - * - */ - private function newLine() - { - //if ($this->y < $this->max_y) { - // $this->y++; - //} - while ($this->y >= $this->max_y) { - $this->history = \array_merge($this->history, [\array_shift($this->screen)]); - $this->screen[] = ''; - $this->history_attrs = \array_merge($this->history_attrs, [\array_shift($this->attrs)]); - $this->attrs[] = $this->attr_row; - if (\count($this->history) >= $this->max_history) { - \array_shift($this->history); - \array_shift($this->history_attrs); - } - $this->y--; - } - $this->y++; - } - /** - * Returns the current coordinate without preformating - * - * @param \stdClass $last_attr - * @param \stdClass $cur_attr - * @param string $char - * @return string - */ - private function processCoordinate(\stdClass $last_attr, \stdClass $cur_attr, $char) - { - $output = ''; - if ($last_attr != $cur_attr) { - $close = $open = ''; - if ($last_attr->foreground != $cur_attr->foreground) { - if ($cur_attr->foreground != 'white') { - $open .= ''; - } - if ($last_attr->foreground != 'white') { - $close = '' . $close; - } - } - if ($last_attr->background != $cur_attr->background) { - if ($cur_attr->background != 'black') { - $open .= ''; - } - if ($last_attr->background != 'black') { - $close = '' . $close; - } - } - if ($last_attr->bold != $cur_attr->bold) { - if ($cur_attr->bold) { - $open .= ''; - } else { - $close = '' . $close; - } - } - if ($last_attr->underline != $cur_attr->underline) { - if ($cur_attr->underline) { - $open .= ''; - } else { - $close = '' . $close; - } - } - if ($last_attr->blink != $cur_attr->blink) { - if ($cur_attr->blink) { - $open .= ''; - } else { - $close = '' . $close; - } - } - $output .= $close . $open; - } - $output .= \htmlspecialchars($char); - return $output; - } - /** - * Returns the current screen without preformating - * - * @return string - */ - private function getScreenHelper() - { - $output = ''; - $last_attr = $this->base_attr_cell; - for ($i = 0; $i <= $this->max_y; $i++) { - for ($j = 0; $j <= $this->max_x; $j++) { - $cur_attr = $this->attrs[$i][$j]; - $output .= $this->processCoordinate($last_attr, $cur_attr, isset($this->screen[$i][$j]) ? $this->screen[$i][$j] : ''); - $last_attr = $this->attrs[$i][$j]; - } - $output .= "\r\n"; - } - $output = \substr($output, 0, -2); - // close any remaining open tags - $output .= $this->processCoordinate($last_attr, $this->base_attr_cell, ''); - return \rtrim($output); - } - /** - * Returns the current screen - * - * @return string - */ - public function getScreen() - { - return '
      ' . $this->getScreenHelper() . '
      '; - } - /** - * Returns the current screen and the x previous lines - * - * @return string - */ - public function getHistory() - { - $scrollback = ''; - $last_attr = $this->base_attr_cell; - for ($i = 0; $i < \count($this->history); $i++) { - for ($j = 0; $j <= $this->max_x + 1; $j++) { - $cur_attr = $this->history_attrs[$i][$j]; - $scrollback .= $this->processCoordinate($last_attr, $cur_attr, isset($this->history[$i][$j]) ? $this->history[$i][$j] : ''); - $last_attr = $this->history_attrs[$i][$j]; - } - $scrollback .= "\r\n"; - } - $base_attr_cell = $this->base_attr_cell; - $this->base_attr_cell = $last_attr; - $scrollback .= $this->getScreen(); - $this->base_attr_cell = $base_attr_cell; - return '
      ' . $scrollback . '
      '; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1.php deleted file mode 100644 index 57c920f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1.php +++ /dev/null @@ -1,1393 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\File\ASN1\Element; -use phpseclib3\Math\BigInteger; -/** - * Pure-PHP ASN.1 Parser - * - * @author Jim Wigginton - */ -abstract class ASN1 -{ - // Tag Classes - // http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 - const CLASS_UNIVERSAL = 0; - const CLASS_APPLICATION = 1; - const CLASS_CONTEXT_SPECIFIC = 2; - const CLASS_PRIVATE = 3; - // Tag Classes - // http://www.obj-sys.com/asn1tutorial/node124.html - const TYPE_BOOLEAN = 1; - const TYPE_INTEGER = 2; - const TYPE_BIT_STRING = 3; - const TYPE_OCTET_STRING = 4; - const TYPE_NULL = 5; - const TYPE_OBJECT_IDENTIFIER = 6; - //const TYPE_OBJECT_DESCRIPTOR = 7; - //const TYPE_INSTANCE_OF = 8; // EXTERNAL - const TYPE_REAL = 9; - const TYPE_ENUMERATED = 10; - //const TYPE_EMBEDDED = 11; - const TYPE_UTF8_STRING = 12; - //const TYPE_RELATIVE_OID = 13; - const TYPE_SEQUENCE = 16; - // SEQUENCE OF - const TYPE_SET = 17; - // SET OF - // More Tag Classes - // http://www.obj-sys.com/asn1tutorial/node10.html - const TYPE_NUMERIC_STRING = 18; - const TYPE_PRINTABLE_STRING = 19; - const TYPE_TELETEX_STRING = 20; - // T61String - const TYPE_VIDEOTEX_STRING = 21; - const TYPE_IA5_STRING = 22; - const TYPE_UTC_TIME = 23; - const TYPE_GENERALIZED_TIME = 24; - const TYPE_GRAPHIC_STRING = 25; - const TYPE_VISIBLE_STRING = 26; - // ISO646String - const TYPE_GENERAL_STRING = 27; - const TYPE_UNIVERSAL_STRING = 28; - //const TYPE_CHARACTER_STRING = 29; - const TYPE_BMP_STRING = 30; - // Tag Aliases - // These tags are kinda place holders for other tags. - const TYPE_CHOICE = -1; - const TYPE_ANY = -2; - /** - * ASN.1 object identifiers - * - * @var array - * @link http://en.wikipedia.org/wiki/Object_identifier - */ - private static $oids = []; - /** - * ASN.1 object identifier reverse mapping - * - * @var array - */ - private static $reverseOIDs = []; - /** - * Default date format - * - * @var string - * @link http://php.net/class.datetime - */ - private static $format = 'D, d M Y H:i:s O'; - /** - * Filters - * - * If the mapping type is self::TYPE_ANY what do we actually encode it as? - * - * @var array - * @see self::encode_der() - */ - private static $filters; - /** - * Current Location of most recent ASN.1 encode process - * - * Useful for debug purposes - * - * @var array - * @see self::encode_der() - */ - private static $location; - /** - * DER Encoded String - * - * In case we need to create ASN1\Element object's.. - * - * @var string - * @see self::decodeDER() - */ - private static $encoded; - /** - * Type mapping table for the ANY type. - * - * Structured or unknown types are mapped to a \phpseclib3\File\ASN1\Element. - * Unambiguous types get the direct mapping (int/real/bool). - * Others are mapped as a choice, with an extra indexing level. - * - * @var array - */ - const ANY_MAP = [ - self::TYPE_BOOLEAN => \true, - self::TYPE_INTEGER => \true, - self::TYPE_BIT_STRING => 'bitString', - self::TYPE_OCTET_STRING => 'octetString', - self::TYPE_NULL => 'null', - self::TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', - self::TYPE_REAL => \true, - self::TYPE_ENUMERATED => 'enumerated', - self::TYPE_UTF8_STRING => 'utf8String', - self::TYPE_NUMERIC_STRING => 'numericString', - self::TYPE_PRINTABLE_STRING => 'printableString', - self::TYPE_TELETEX_STRING => 'teletexString', - self::TYPE_VIDEOTEX_STRING => 'videotexString', - self::TYPE_IA5_STRING => 'ia5String', - self::TYPE_UTC_TIME => 'utcTime', - self::TYPE_GENERALIZED_TIME => 'generalTime', - self::TYPE_GRAPHIC_STRING => 'graphicString', - self::TYPE_VISIBLE_STRING => 'visibleString', - self::TYPE_GENERAL_STRING => 'generalString', - self::TYPE_UNIVERSAL_STRING => 'universalString', - //self::TYPE_CHARACTER_STRING => 'characterString', - self::TYPE_BMP_STRING => 'bmpString', - ]; - /** - * String type to character size mapping table. - * - * Non-convertable types are absent from this table. - * size == 0 indicates variable length encoding. - * - * @var array - */ - const STRING_TYPE_SIZE = [self::TYPE_UTF8_STRING => 0, self::TYPE_BMP_STRING => 2, self::TYPE_UNIVERSAL_STRING => 4, self::TYPE_PRINTABLE_STRING => 1, self::TYPE_TELETEX_STRING => 1, self::TYPE_IA5_STRING => 1, self::TYPE_VISIBLE_STRING => 1]; - /** - * Parse BER-encoding - * - * Serves a similar purpose to openssl's asn1parse - * - * @param Element|string $encoded - * @return ?array - */ - public static function decodeBER($encoded) - { - if ($encoded instanceof Element) { - $encoded = $encoded->element; - } - self::$encoded = $encoded; - $decoded = self::decode_ber($encoded); - if ($decoded === \false) { - return null; - } - return [$decoded]; - } - /** - * Parse BER-encoding (Helper function) - * - * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. - * $encoded is passed by reference for the recursive calls done for self::TYPE_BIT_STRING and - * self::TYPE_OCTET_STRING. In those cases, the indefinite length is used. - * - * @param string $encoded - * @param int $start - * @param int $encoded_pos - * @return array|bool - */ - private static function decode_ber($encoded, $start = 0, $encoded_pos = 0) - { - $current = ['start' => $start]; - if (!isset($encoded[$encoded_pos])) { - return \false; - } - $type = \ord($encoded[$encoded_pos++]); - $startOffset = 1; - $constructed = $type >> 5 & 1; - $tag = $type & 0x1f; - if ($tag == 0x1f) { - $tag = 0; - // process septets (since the eighth bit is ignored, it's not an octet) - do { - if (!isset($encoded[$encoded_pos])) { - return \false; - } - $temp = \ord($encoded[$encoded_pos++]); - $startOffset++; - $loop = $temp >> 7; - $tag <<= 7; - $temp &= 0x7f; - // "bits 7 to 1 of the first subsequent octet shall not all be zero" - if ($startOffset == 2 && $temp == 0) { - return \false; - } - $tag |= $temp; - } while ($loop); - } - $start += $startOffset; - // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 - if (!isset($encoded[$encoded_pos])) { - return \false; - } - $length = \ord($encoded[$encoded_pos++]); - $start++; - if ($length == 0x80) { - // indefinite length - // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all - // immediately available." -- paragraph 8.1.3.2.c - $length = \strlen($encoded) - $encoded_pos; - } elseif ($length & 0x80) { - // definite length, long form - // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only - // support it up to four. - $length &= 0x7f; - $temp = \substr($encoded, $encoded_pos, $length); - $encoded_pos += $length; - // tags of indefinte length don't really have a header length; this length includes the tag - $current += ['headerlength' => $length + 2]; - $start += $length; - \extract(\unpack('Nlength', \substr(\str_pad($temp, 4, \chr(0), \STR_PAD_LEFT), -4))); - /** @var integer $length */ - } else { - $current += ['headerlength' => 2]; - } - if ($length > \strlen($encoded) - $encoded_pos) { - return \false; - } - $content = \substr($encoded, $encoded_pos, $length); - $content_pos = 0; - // at this point $length can be overwritten. it's only accurate for definite length things as is - /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 - built-in types. It defines an application-independent data type that must be distinguishable from all other - data types. The other three classes are user defined. The APPLICATION class distinguishes data types that - have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within - a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the - alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this - data type; the term CONTEXT-SPECIFIC does not appear. - - -- http://www.obj-sys.com/asn1tutorial/node12.html */ - $class = $type >> 6 & 3; - switch ($class) { - case self::CLASS_APPLICATION: - case self::CLASS_PRIVATE: - case self::CLASS_CONTEXT_SPECIFIC: - if (!$constructed) { - return ['type' => $class, 'constant' => $tag, 'content' => $content, 'length' => $length + $start - $current['start']] + $current; - } - $newcontent = []; - $remainingLength = $length; - while ($remainingLength > 0) { - $temp = self::decode_ber($content, $start, $content_pos); - if ($temp === \false) { - break; - } - $length = $temp['length']; - // end-of-content octets - see paragraph 8.1.5 - if (\substr($content, $content_pos + $length, 2) == "\x00\x00") { - $length += 2; - $start += $length; - $newcontent[] = $temp; - break; - } - $start += $length; - $remainingLength -= $length; - $newcontent[] = $temp; - $content_pos += $length; - } - return [ - 'type' => $class, - 'constant' => $tag, - // the array encapsulation is for BC with the old format - 'content' => $newcontent, - // the only time when $content['headerlength'] isn't defined is when the length is indefinite. - // the absence of $content['headerlength'] is how we know if something is indefinite or not. - // technically, it could be defined to be 2 and then another indicator could be used but whatever. - 'length' => $start - $current['start'], - ] + $current; - } - $current += ['type' => $tag]; - // decode UNIVERSAL tags - switch ($tag) { - case self::TYPE_BOOLEAN: - // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 - if ($constructed || \strlen($content) != 1) { - return \false; - } - $current['content'] = (bool) \ord($content[$content_pos]); - break; - case self::TYPE_INTEGER: - case self::TYPE_ENUMERATED: - if ($constructed) { - return \false; - } - $current['content'] = new BigInteger(\substr($content, $content_pos), -256); - break; - case self::TYPE_REAL: - // not currently supported - return \false; - case self::TYPE_BIT_STRING: - // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - // the number of unused bits in the final subsequent octet. The number shall be in the range zero to - // seven. - if (!$constructed) { - $current['content'] = \substr($content, $content_pos); - } else { - $temp = self::decode_ber($content, $start, $content_pos); - if ($temp === \false) { - return \false; - } - $length -= \strlen($content) - $content_pos; - $last = \count($temp) - 1; - for ($i = 0; $i < $last; $i++) { - // all subtags should be bit strings - if ($temp[$i]['type'] != self::TYPE_BIT_STRING) { - return \false; - } - $current['content'] .= \substr($temp[$i]['content'], 1); - } - // all subtags should be bit strings - if ($temp[$last]['type'] != self::TYPE_BIT_STRING) { - return \false; - } - $current['content'] = $temp[$last]['content'][0] . $current['content'] . \substr($temp[$i]['content'], 1); - } - break; - case self::TYPE_OCTET_STRING: - if (!$constructed) { - $current['content'] = \substr($content, $content_pos); - } else { - $current['content'] = ''; - $length = 0; - while (\substr($content, $content_pos, 2) != "\x00\x00") { - $temp = self::decode_ber($content, $length + $start, $content_pos); - if ($temp === \false) { - return \false; - } - $content_pos += $temp['length']; - // all subtags should be octet strings - if ($temp['type'] != self::TYPE_OCTET_STRING) { - return \false; - } - $current['content'] .= $temp['content']; - $length += $temp['length']; - } - if (\substr($content, $content_pos, 2) == "\x00\x00") { - $length += 2; - // +2 for the EOC - } - } - break; - case self::TYPE_NULL: - // "The contents octets shall not contain any octets." -- paragraph 8.8.2 - if ($constructed || \strlen($content)) { - return \false; - } - break; - case self::TYPE_SEQUENCE: - case self::TYPE_SET: - if (!$constructed) { - return \false; - } - $offset = 0; - $current['content'] = []; - $content_len = \strlen($content); - while ($content_pos < $content_len) { - // if indefinite length construction was used and we have an end-of-content string next - // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 - if (!isset($current['headerlength']) && \substr($content, $content_pos, 2) == "\x00\x00") { - $length = $offset + 2; - // +2 for the EOC - break 2; - } - $temp = self::decode_ber($content, $start + $offset, $content_pos); - if ($temp === \false) { - return \false; - } - $content_pos += $temp['length']; - $current['content'][] = $temp; - $offset += $temp['length']; - } - break; - case self::TYPE_OBJECT_IDENTIFIER: - if ($constructed) { - return \false; - } - $current['content'] = self::decodeOID(\substr($content, $content_pos)); - if ($current['content'] === \false) { - return \false; - } - break; - /* Each character string type shall be encoded as if it had been declared: - [UNIVERSAL x] IMPLICIT OCTET STRING - - -- X.690-0207.pdf#page=23 (paragraph 8.21.3) - - Per that, we're not going to do any validation. If there are any illegal characters in the string, - we don't really care */ - case self::TYPE_NUMERIC_STRING: - // 0,1,2,3,4,5,6,7,8,9, and space - case self::TYPE_PRINTABLE_STRING: - // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, - // hyphen, full stop, solidus, colon, equal sign, question mark - case self::TYPE_TELETEX_STRING: - // The Teletex character set in CCITT's T61, space, and delete - // see http://en.wikipedia.org/wiki/Teletex#Character_sets - case self::TYPE_VIDEOTEX_STRING: - // The Videotex character set in CCITT's T.100 and T.101, space, and delete - case self::TYPE_VISIBLE_STRING: - // Printing character sets of international ASCII, and space - case self::TYPE_IA5_STRING: - // International Alphabet 5 (International ASCII) - case self::TYPE_GRAPHIC_STRING: - // All registered G sets, and space - case self::TYPE_GENERAL_STRING: - // All registered C and G sets, space and delete - case self::TYPE_UTF8_STRING: - // ???? - case self::TYPE_BMP_STRING: - if ($constructed) { - return \false; - } - $current['content'] = \substr($content, $content_pos); - break; - case self::TYPE_UTC_TIME: - case self::TYPE_GENERALIZED_TIME: - if ($constructed) { - return \false; - } - $current['content'] = self::decodeTime(\substr($content, $content_pos), $tag); - break; - default: - return \false; - } - $start += $length; - // ie. length is the length of the full TLV encoding - it's not just the length of the value - return $current + ['length' => $start - $current['start']]; - } - /** - * ASN.1 Map - * - * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format. - * - * "Special" mappings may be applied on a per tag-name basis via $special. - * - * @param array $decoded - * @param array $mapping - * @param array $special - * @return array|bool|Element|string|null - */ - public static function asn1map(array $decoded, $mapping, $special = []) - { - if (isset($mapping['explicit']) && \is_array($decoded['content'])) { - $decoded = $decoded['content'][0]; - } - switch (\true) { - case $mapping['type'] == self::TYPE_ANY: - $intype = $decoded['type']; - // !isset(self::ANY_MAP[$intype]) produces a fatal error on PHP 5.6 - if (isset($decoded['constant']) || !\array_key_exists($intype, self::ANY_MAP) || \ord(self::$encoded[$decoded['start']]) & 0x20) { - return new Element(\substr(self::$encoded, $decoded['start'], $decoded['length'])); - } - $inmap = self::ANY_MAP[$intype]; - if (\is_string($inmap)) { - return [$inmap => self::asn1map($decoded, ['type' => $intype] + $mapping, $special)]; - } - break; - case $mapping['type'] == self::TYPE_CHOICE: - foreach ($mapping['children'] as $key => $option) { - switch (\true) { - case isset($option['constant']) && $option['constant'] == $decoded['constant']: - case !isset($option['constant']) && $option['type'] == $decoded['type']: - $value = self::asn1map($decoded, $option, $special); - break; - case !isset($option['constant']) && $option['type'] == self::TYPE_CHOICE: - $v = self::asn1map($decoded, $option, $special); - if (isset($v)) { - $value = $v; - } - } - if (isset($value)) { - if (isset($special[$key])) { - $value = $special[$key]($value); - } - return [$key => $value]; - } - } - return null; - case isset($mapping['implicit']): - case isset($mapping['explicit']): - case $decoded['type'] == $mapping['type']: - break; - default: - // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, - // let it through - switch (\true) { - case $decoded['type'] < 18: - // self::TYPE_NUMERIC_STRING == 18 - case $decoded['type'] > 30: - // self::TYPE_BMP_STRING == 30 - case $mapping['type'] < 18: - case $mapping['type'] > 30: - return null; - } - } - if (isset($mapping['implicit'])) { - $decoded['type'] = $mapping['type']; - } - switch ($decoded['type']) { - case self::TYPE_SEQUENCE: - $map = []; - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = self::asn1map($content, $child, $special)) === null) { - return null; - } - } - return $map; - } - $n = \count($decoded['content']); - $i = 0; - foreach ($mapping['children'] as $key => $child) { - $maymatch = $i < $n; - // Match only existing input. - if ($maymatch) { - $temp = $decoded['content'][$i]; - if ($child['type'] != self::TYPE_CHOICE) { - // Get the mapping and input class & constant. - $childClass = $tempClass = self::CLASS_UNIVERSAL; - $constant = null; - if (isset($temp['constant'])) { - $tempClass = $temp['type']; - } - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = self::CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && \array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== \false; - } - } - } - if ($maymatch) { - // Attempt submapping. - $candidate = self::asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - if ($maymatch) { - // Got the match: use it. - if (isset($special[$key])) { - $candidate = $special[$key]($candidate); - } - $map[$key] = $candidate; - $i++; - } elseif (isset($child['default'])) { - $map[$key] = $child['default']; - } elseif (!isset($child['optional'])) { - return null; - // Syntax error. - } - } - // Fail mapping if all input items have not been consumed. - return $i < $n ? null : $map; - // the main diff between sets and sequences is the encapsulation of the foreach in another for loop - case self::TYPE_SET: - $map = []; - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = self::asn1map($content, $child, $special)) === null) { - return null; - } - } - return $map; - } - for ($i = 0; $i < \count($decoded['content']); $i++) { - $temp = $decoded['content'][$i]; - $tempClass = self::CLASS_UNIVERSAL; - if (isset($temp['constant'])) { - $tempClass = $temp['type']; - } - foreach ($mapping['children'] as $key => $child) { - if (isset($map[$key])) { - continue; - } - $maymatch = \true; - if ($child['type'] != self::TYPE_CHOICE) { - $childClass = self::CLASS_UNIVERSAL; - $constant = null; - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = self::CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && \array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== \false; - } - } - if ($maymatch) { - // Attempt submapping. - $candidate = self::asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - if (!$maymatch) { - break; - } - // Got the match: use it. - if (isset($special[$key])) { - $candidate = $special[$key]($candidate); - } - $map[$key] = $candidate; - break; - } - } - foreach ($mapping['children'] as $key => $child) { - if (!isset($map[$key])) { - if (isset($child['default'])) { - $map[$key] = $child['default']; - } elseif (!isset($child['optional'])) { - return null; - } - } - } - return $map; - case self::TYPE_OBJECT_IDENTIFIER: - return isset(self::$oids[$decoded['content']]) ? self::$oids[$decoded['content']] : $decoded['content']; - case self::TYPE_UTC_TIME: - case self::TYPE_GENERALIZED_TIME: - // for explicitly tagged optional stuff - if (\is_array($decoded['content'])) { - $decoded['content'] = $decoded['content'][0]['content']; - } - // for implicitly tagged optional stuff - // in theory, doing isset($mapping['implicit']) would work but malformed certs do exist - // in the wild that OpenSSL decodes without issue so we'll support them as well - if (!\is_object($decoded['content'])) { - $decoded['content'] = self::decodeTime($decoded['content'], $decoded['type']); - } - return $decoded['content'] ? $decoded['content']->format(self::$format) : \false; - case self::TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $offset = \ord($decoded['content'][0]); - $size = (\strlen($decoded['content']) - 1) * 8 - $offset; - /* - From X.680-0207.pdf#page=46 (21.7): - - "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) - arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should - therefore ensure that different semantics are not associated with such values which differ only in the number of trailing - 0 bits." - */ - $bits = \count($mapping['mapping']) == $size ? [] : \array_fill(0, \count($mapping['mapping']) - $size, \false); - for ($i = \strlen($decoded['content']) - 1; $i > 0; $i--) { - $current = \ord($decoded['content'][$i]); - for ($j = $offset; $j < 8; $j++) { - $bits[] = (bool) ($current & 1 << $j); - } - $offset = 0; - } - $values = []; - $map = \array_reverse($mapping['mapping']); - foreach ($map as $i => $value) { - if ($bits[$i]) { - $values[] = $value; - } - } - return $values; - } - // fall-through - case self::TYPE_OCTET_STRING: - return $decoded['content']; - case self::TYPE_NULL: - return ''; - case self::TYPE_BOOLEAN: - case self::TYPE_NUMERIC_STRING: - case self::TYPE_PRINTABLE_STRING: - case self::TYPE_TELETEX_STRING: - case self::TYPE_VIDEOTEX_STRING: - case self::TYPE_IA5_STRING: - case self::TYPE_GRAPHIC_STRING: - case self::TYPE_VISIBLE_STRING: - case self::TYPE_GENERAL_STRING: - case self::TYPE_UNIVERSAL_STRING: - case self::TYPE_UTF8_STRING: - case self::TYPE_BMP_STRING: - return $decoded['content']; - case self::TYPE_INTEGER: - case self::TYPE_ENUMERATED: - $temp = $decoded['content']; - if (isset($mapping['implicit'])) { - $temp = new BigInteger($decoded['content'], -256); - } - if (isset($mapping['mapping'])) { - $temp = (int) $temp->toString(); - return isset($mapping['mapping'][$temp]) ? $mapping['mapping'][$temp] : \false; - } - return $temp; - } - } - /** - * DER-decode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @param string $string - * @return int - */ - public static function decodeLength(&$string) - { - $length = \ord(Strings::shift($string)); - if ($length & 0x80) { - // definite length, long form - $length &= 0x7f; - $temp = Strings::shift($string, $length); - list(, $length) = \unpack('N', \substr(\str_pad($temp, 4, \chr(0), \STR_PAD_LEFT), -4)); - } - return $length; - } - /** - * ASN.1 Encode - * - * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function - * an ASN.1 compiler. - * - * "Special" mappings can be applied via $special. - * - * @param Element|string|array $source - * @param array $mapping - * @param array $special - * @return string - */ - public static function encodeDER($source, $mapping, $special = []) - { - self::$location = []; - return self::encode_der($source, $mapping, null, $special); - } - /** - * ASN.1 Encode (Helper function) - * - * @param Element|string|array|null $source - * @param array $mapping - * @param int $idx - * @param array $special - * @return string - */ - private static function encode_der($source, array $mapping, $idx = null, array $special = []) - { - if ($source instanceof Element) { - return $source->element; - } - // do not encode (implicitly optional) fields with value set to default - if (isset($mapping['default']) && $source === $mapping['default']) { - return ''; - } - if (isset($idx)) { - if (isset($special[$idx])) { - $source = $special[$idx]($source); - } - self::$location[] = $idx; - } - $tag = $mapping['type']; - switch ($tag) { - case self::TYPE_SET: - // Children order is not important, thus process in sequence. - case self::TYPE_SEQUENCE: - $tag |= 0x20; - // set the constructed bit - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $value = []; - $child = $mapping['children']; - foreach ($source as $content) { - $temp = self::encode_der($content, $child, null, $special); - if ($temp === \false) { - return \false; - } - $value[] = $temp; - } - /* "The encodings of the component values of a set-of value shall appear in ascending order, the encodings being compared - as octet strings with the shorter components being padded at their trailing end with 0-octets. - NOTE - The padding octets are for comparison purposes only and do not appear in the encodings." - - -- sec 11.6 of http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ - if ($mapping['type'] == self::TYPE_SET) { - \sort($value); - } - $value = \implode('', $value); - break; - } - $value = ''; - foreach ($mapping['children'] as $key => $child) { - if (!\array_key_exists($key, $source)) { - if (!isset($child['optional'])) { - return \false; - } - continue; - } - $temp = self::encode_der($source[$key], $child, $key, $special); - if ($temp === \false) { - return \false; - } - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - /* - From X.680-0207.pdf#page=58 (30.6): - - "The tagging construction specifies explicit tagging if any of the following holds: - ... - c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or - AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or - an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." - */ - if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | 0x20 | $child['constant']); - $temp = $subtag . self::encodeLength(\strlen($temp)) . $temp; - } else { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | \ord($temp[0]) & 0x20 | $child['constant']); - $temp = $subtag . \substr($temp, 1); - } - } - $value .= $temp; - } - break; - case self::TYPE_CHOICE: - $temp = \false; - foreach ($mapping['children'] as $key => $child) { - if (!isset($source[$key])) { - continue; - } - $temp = self::encode_der($source[$key], $child, $key, $special); - if ($temp === \false) { - return \false; - } - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - $tag = \ord($temp[0]); - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | 0x20 | $child['constant']); - $temp = $subtag . self::encodeLength(\strlen($temp)) . $temp; - } else { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | \ord($temp[0]) & 0x20 | $child['constant']); - $temp = $subtag . \substr($temp, 1); - } - } - } - if (isset($idx)) { - \array_pop(self::$location); - } - if ($temp && isset($mapping['cast'])) { - $temp[0] = \chr($mapping['class'] << 6 | $tag & 0x20 | $mapping['cast']); - } - return $temp; - case self::TYPE_INTEGER: - case self::TYPE_ENUMERATED: - if (!isset($mapping['mapping'])) { - if (\is_numeric($source)) { - $source = new BigInteger($source); - } - $value = $source->toBytes(\true); - } else { - $value = \array_search($source, $mapping['mapping']); - if ($value === \false) { - return \false; - } - $value = new BigInteger($value); - $value = $value->toBytes(\true); - } - if (!\strlen($value)) { - $value = \chr(0); - } - break; - case self::TYPE_UTC_TIME: - case self::TYPE_GENERALIZED_TIME: - $format = $mapping['type'] == self::TYPE_UTC_TIME ? 'y' : 'Y'; - $format .= 'mdHis'; - // if $source does _not_ include timezone information within it then assume that the timezone is GMT - $date = new \DateTime($source, new \DateTimeZone('GMT')); - // if $source _does_ include timezone information within it then convert the time to GMT - $date->setTimezone(new \DateTimeZone('GMT')); - $value = $date->format($format) . 'Z'; - break; - case self::TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $bits = \array_fill(0, \count($mapping['mapping']), 0); - $size = 0; - for ($i = 0; $i < \count($mapping['mapping']); $i++) { - if (\in_array($mapping['mapping'][$i], $source)) { - $bits[$i] = 1; - $size = $i; - } - } - if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { - $size = $mapping['min'] - 1; - } - $offset = 8 - ($size + 1 & 7); - $offset = $offset !== 8 ? $offset : 0; - $value = \chr($offset); - for ($i = $size + 1; $i < \count($mapping['mapping']); $i++) { - unset($bits[$i]); - } - $bits = \implode('', \array_pad($bits, $size + $offset + 1, 0)); - $bytes = \explode(' ', \rtrim(\chunk_split($bits, 8, ' '))); - foreach ($bytes as $byte) { - $value .= \chr(\bindec($byte)); - } - break; - } - // fall-through - case self::TYPE_OCTET_STRING: - /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. - - -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ - $value = $source; - break; - case self::TYPE_OBJECT_IDENTIFIER: - $value = self::encodeOID($source); - break; - case self::TYPE_ANY: - $loc = self::$location; - if (isset($idx)) { - \array_pop(self::$location); - } - switch (\true) { - case !isset($source): - return self::encode_der(null, ['type' => self::TYPE_NULL] + $mapping, null, $special); - case \is_int($source): - case $source instanceof BigInteger: - return self::encode_der($source, ['type' => self::TYPE_INTEGER] + $mapping, null, $special); - case \is_float($source): - return self::encode_der($source, ['type' => self::TYPE_REAL] + $mapping, null, $special); - case \is_bool($source): - return self::encode_der($source, ['type' => self::TYPE_BOOLEAN] + $mapping, null, $special); - case \is_array($source) && \count($source) == 1: - $typename = \implode('', \array_keys($source)); - $outtype = \array_search($typename, self::ANY_MAP, \true); - if ($outtype !== \false) { - return self::encode_der($source[$typename], ['type' => $outtype] + $mapping, null, $special); - } - } - $filters = self::$filters; - foreach ($loc as $part) { - if (!isset($filters[$part])) { - $filters = \false; - break; - } - $filters = $filters[$part]; - } - if ($filters === \false) { - throw new \RuntimeException('No filters defined for ' . \implode('/', $loc)); - } - return self::encode_der($source, $filters + $mapping, null, $special); - case self::TYPE_NULL: - $value = ''; - break; - case self::TYPE_NUMERIC_STRING: - case self::TYPE_TELETEX_STRING: - case self::TYPE_PRINTABLE_STRING: - case self::TYPE_UNIVERSAL_STRING: - case self::TYPE_UTF8_STRING: - case self::TYPE_BMP_STRING: - case self::TYPE_IA5_STRING: - case self::TYPE_VISIBLE_STRING: - case self::TYPE_VIDEOTEX_STRING: - case self::TYPE_GRAPHIC_STRING: - case self::TYPE_GENERAL_STRING: - $value = $source; - break; - case self::TYPE_BOOLEAN: - $value = $source ? "\xff" : "\x00"; - break; - default: - throw new \RuntimeException('Mapping provides no type definition for ' . \implode('/', self::$location)); - } - if (isset($idx)) { - \array_pop(self::$location); - } - if (isset($mapping['cast'])) { - if (isset($mapping['explicit']) || $mapping['type'] == self::TYPE_CHOICE) { - $value = \chr($tag) . self::encodeLength(\strlen($value)) . $value; - $tag = $mapping['class'] << 6 | 0x20 | $mapping['cast']; - } else { - $tag = $mapping['class'] << 6 | \ord($temp[0]) & 0x20 | $mapping['cast']; - } - } - return \chr($tag) . self::encodeLength(\strlen($value)) . $value; - } - /** - * BER-decode the OID - * - * Called by _decode_ber() - * - * @param string $content - * @return string - */ - public static function decodeOID($content) - { - static $eighty; - if (!$eighty) { - $eighty = new BigInteger(80); - } - $oid = []; - $pos = 0; - $len = \strlen($content); - if (\ord($content[$len - 1]) & 0x80) { - return \false; - } - $n = new BigInteger(); - while ($pos < $len) { - $temp = \ord($content[$pos++]); - $n = $n->bitwise_leftShift(7); - $n = $n->bitwise_or(new BigInteger($temp & 0x7f)); - if (~$temp & 0x80) { - $oid[] = $n; - $n = new BigInteger(); - } - } - $part1 = \array_shift($oid); - $first = \floor(\ord($content[0]) / 40); - /* - "This packing of the first two object identifier components recognizes that only three values are allocated from the root - node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1." - - -- https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=22 - */ - if ($first <= 2) { - // ie. 0 <= ord($content[0]) < 120 (0x78) - \array_unshift($oid, \ord($content[0]) % 40); - \array_unshift($oid, $first); - } else { - \array_unshift($oid, $part1->subtract($eighty)); - \array_unshift($oid, 2); - } - return \implode('.', $oid); - } - /** - * DER-encode the OID - * - * Called by _encode_der() - * - * @param string $source - * @return string - */ - public static function encodeOID($source) - { - static $mask, $zero, $forty; - if (!$mask) { - $mask = new BigInteger(0x7f); - $zero = new BigInteger(); - $forty = new BigInteger(40); - } - if (!\preg_match('#(?:\\d+\\.)+#', $source)) { - $oid = isset(self::$reverseOIDs[$source]) ? self::$reverseOIDs[$source] : \false; - } else { - $oid = $source; - } - if ($oid === \false) { - throw new \RuntimeException('Invalid OID'); - } - $parts = \explode('.', $oid); - $part1 = \array_shift($parts); - $part2 = \array_shift($parts); - $first = new BigInteger($part1); - $first = $first->multiply($forty); - $first = $first->add(new BigInteger($part2)); - \array_unshift($parts, $first->toString()); - $value = ''; - foreach ($parts as $part) { - if (!$part) { - $temp = "\x00"; - } else { - $temp = ''; - $part = new BigInteger($part); - while (!$part->equals($zero)) { - $submask = $part->bitwise_and($mask); - $submask->setPrecision(8); - $temp = (\chr(0x80) | $submask->toBytes()) . $temp; - $part = $part->bitwise_rightShift(7); - } - $temp[\strlen($temp) - 1] = $temp[\strlen($temp) - 1] & \chr(0x7f); - } - $value .= $temp; - } - return $value; - } - /** - * BER-decode the time - * - * Called by _decode_ber() and in the case of implicit tags asn1map(). - * - * @param string $content - * @param int $tag - * @return \DateTime|false - */ - private static function decodeTime($content, $tag) - { - /* UTCTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 - http://www.obj-sys.com/asn1tutorial/node15.html - - GeneralizedTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 - http://www.obj-sys.com/asn1tutorial/node14.html */ - $format = 'YmdHis'; - if ($tag == self::TYPE_UTC_TIME) { - // https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=28 says "the seconds - // element shall always be present" but none-the-less I've seen X509 certs where it isn't and if the - // browsers parse it phpseclib ought to too - if (\preg_match('#^(\\d{10})(Z|[+-]\\d{4})$#', $content, $matches)) { - $content = $matches[1] . '00' . $matches[2]; - } - $prefix = \substr($content, 0, 2) >= 50 ? '19' : '20'; - $content = $prefix . $content; - } elseif (\strpos($content, '.') !== \false) { - $format .= '.u'; - } - if ($content[\strlen($content) - 1] == 'Z') { - $content = \substr($content, 0, -1) . '+0000'; - } - if (\strpos($content, '-') !== \false || \strpos($content, '+') !== \false) { - $format .= 'O'; - } - // error supression isn't necessary as of PHP 7.0: - // http://php.net/manual/en/migration70.other-changes.php - return @\DateTime::createFromFormat($format, $content); - } - /** - * Set the time format - * - * Sets the time / date format for asn1map(). - * - * @param string $format - */ - public static function setTimeFormat($format) - { - self::$format = $format; - } - /** - * Load OIDs - * - * Load the relevant OIDs for a particular ASN.1 semantic mapping. - * Previously loaded OIDs are retained. - * - * @param array $oids - */ - public static function loadOIDs(array $oids) - { - self::$reverseOIDs += $oids; - self::$oids = \array_flip(self::$reverseOIDs); - } - /** - * Set filters - * - * See \phpseclib3\File\X509, etc, for an example. - * Previously loaded filters are not retained. - * - * @param array $filters - */ - public static function setFilters(array $filters) - { - self::$filters = $filters; - } - /** - * String type conversion - * - * This is a lazy conversion, dealing only with character size. - * No real conversion table is used. - * - * @param string $in - * @param int $from - * @param int $to - * @return string - */ - public static function convert($in, $from = self::TYPE_UTF8_STRING, $to = self::TYPE_UTF8_STRING) - { - // isset(self::STRING_TYPE_SIZE[$from] returns a fatal error on PHP 5.6 - if (!\array_key_exists($from, self::STRING_TYPE_SIZE) || !\array_key_exists($to, self::STRING_TYPE_SIZE)) { - return \false; - } - $insize = self::STRING_TYPE_SIZE[$from]; - $outsize = self::STRING_TYPE_SIZE[$to]; - $inlength = \strlen($in); - $out = ''; - for ($i = 0; $i < $inlength;) { - if ($inlength - $i < $insize) { - return \false; - } - // Get an input character as a 32-bit value. - $c = \ord($in[$i++]); - switch (\true) { - case $insize == 4: - $c = $c << 8 | \ord($in[$i++]); - $c = $c << 8 | \ord($in[$i++]); - // fall-through - case $insize == 2: - $c = $c << 8 | \ord($in[$i++]); - // fall-through - case $insize == 1: - break; - case ($c & 0x80) == 0x0: - break; - case ($c & 0x40) == 0x0: - return \false; - default: - $bit = 6; - do { - if ($bit > 25 || $i >= $inlength || (\ord($in[$i]) & 0xc0) != 0x80) { - return \false; - } - $c = $c << 6 | \ord($in[$i++]) & 0x3f; - $bit += 5; - $mask = 1 << $bit; - } while ($c & $bit); - $c &= $mask - 1; - break; - } - // Convert and append the character to output string. - $v = ''; - switch (\true) { - case $outsize == 4: - $v .= \chr($c & 0xff); - $c >>= 8; - $v .= \chr($c & 0xff); - $c >>= 8; - // fall-through - case $outsize == 2: - $v .= \chr($c & 0xff); - $c >>= 8; - // fall-through - case $outsize == 1: - $v .= \chr($c & 0xff); - $c >>= 8; - if ($c) { - return \false; - } - break; - case ($c & (\PHP_INT_SIZE == 8 ? 0x80000000 : 1 << 31)) != 0: - return \false; - case $c >= 0x4000000: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x4000000; - // fall-through - case $c >= 0x200000: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x200000; - // fall-through - case $c >= 0x10000: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x10000; - // fall-through - case $c >= 0x800: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x800; - // fall-through - case $c >= 0x80: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0xc0; - // fall-through - default: - $v .= \chr($c); - break; - } - $out .= \strrev($v); - } - return $out; - } - /** - * Extract raw BER from Base64 encoding - * - * @param string $str - * @return string - */ - public static function extractBER($str) - { - /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them - * above and beyond the ceritificate. - * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: - * - * Bag Attributes - * localKeyID: 01 00 00 00 - * subject=/O=organization/OU=org unit/CN=common name - * issuer=/O=organization/CN=common name - */ - if (\strlen($str) > \ini_get('pcre.backtrack_limit')) { - $temp = $str; - } else { - $temp = \preg_replace('#.*?^-+[^-]+-+[\\r\\n ]*$#ms', '', $str, 1); - $temp = \preg_replace('#-+END.*[\\r\\n ]*.*#ms', '', $temp, 1); - } - // remove new lines - $temp = \str_replace(["\r", "\n", ' '], '', $temp); - // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = \preg_replace('#^-+[^-]+-+|-+[^-]+-+$#', '', $temp); - $temp = \preg_match('#^[a-zA-Z\\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : \false; - return $temp != \false ? $temp : $str; - } - /** - * DER-encode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @param int $length - * @return string - */ - public static function encodeLength($length) - { - if ($length <= 0x7f) { - return \chr($length); - } - $temp = \ltrim(\pack('N', $length), \chr(0)); - return \pack('Ca*', 0x80 | \strlen($temp), $temp); - } - /** - * Returns the OID corresponding to a name - * - * What's returned in the associative array returned by loadX509() (or load*()) is either a name or an OID if - * no OID to name mapping is available. The problem with this is that what may be an unmapped OID in one version - * of phpseclib may not be unmapped in the next version, so apps that are looking at this OID may not be able - * to work from version to version. - * - * This method will return the OID if a name is passed to it and if no mapping is avialable it'll assume that - * what's being passed to it already is an OID and return that instead. A few examples. - * - * getOID('2.16.840.1.101.3.4.2.1') == '2.16.840.1.101.3.4.2.1' - * getOID('id-sha256') == '2.16.840.1.101.3.4.2.1' - * getOID('zzz') == 'zzz' - * - * @param string $name - * @return string - */ - public static function getOID($name) - { - return isset(self::$reverseOIDs[$name]) ? self::$reverseOIDs[$name] : $name; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php deleted file mode 100644 index 6b0f4e3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1; - -/** - * ASN.1 Raw Element - * - * An ASN.1 ANY mapping will return an ASN1\Element object. Use of this object - * will also bypass the normal encoding rules in ASN1::encodeDER() - * - * @author Jim Wigginton - */ -class Element -{ - /** - * Raw element value - * - * @var string - */ - public $element; - /** - * Constructor - * - * @param string $encoded - * @return \phpseclib3\File\ASN1\Element - */ - public function __construct($encoded) - { - $this->element = $encoded; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php deleted file mode 100644 index e844db1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AccessDescription - * - * @author Jim Wigginton - */ -abstract class AccessDescription -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['accessMethod' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'accessLocation' => \phpseclib3\File\ASN1\Maps\GeneralName::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php deleted file mode 100644 index 857d506..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AdministrationDomainName - * - * @author Jim Wigginton - */ -abstract class AdministrationDomainName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - // if class isn't present it's assumed to be \phpseclib3\File\ASN1::CLASS_UNIVERSAL or - // (if constant is present) \phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC - 'class' => ASN1::CLASS_APPLICATION, - 'cast' => 2, - 'children' => ['numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING]], - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php deleted file mode 100644 index f491291..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AlgorithmIdentifier - * - * @author Jim Wigginton - */ -abstract class AlgorithmIdentifier -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['algorithm' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'parameters' => ['type' => ASN1::TYPE_ANY, 'optional' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php deleted file mode 100644 index db9aba5..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AnotherName - * - * @author Jim Wigginton - */ -abstract class AnotherName -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type-id' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'value' => ['type' => ASN1::TYPE_ANY, 'constant' => 0, 'optional' => \true, 'explicit' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php deleted file mode 100644 index 20dff1c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Attribute - * - * @author Jim Wigginton - */ -abstract class Attribute -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type' => \phpseclib3\File\ASN1\Maps\AttributeType::MAP, 'value' => ['type' => ASN1::TYPE_SET, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\AttributeValue::MAP]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php deleted file mode 100644 index 202da4c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AttributeType - * - * @author Jim Wigginton - */ -abstract class AttributeType -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php deleted file mode 100644 index fc1609b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AttributeTypeAndValue - * - * @author Jim Wigginton - */ -abstract class AttributeTypeAndValue -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type' => \phpseclib3\File\ASN1\Maps\AttributeType::MAP, 'value' => \phpseclib3\File\ASN1\Maps\AttributeValue::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php deleted file mode 100644 index 26f7df8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AttributeValue - * - * @author Jim Wigginton - */ -abstract class AttributeValue -{ - const MAP = ['type' => ASN1::TYPE_ANY]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php deleted file mode 100644 index a378662..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Attributes - * - * @author Jim Wigginton - */ -abstract class Attributes -{ - const MAP = ['type' => ASN1::TYPE_SET, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\Attribute::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php deleted file mode 100644 index 7a26a71..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AuthorityInfoAccessSyntax - * - * @author Jim Wigginton - */ -abstract class AuthorityInfoAccessSyntax -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\AccessDescription::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php deleted file mode 100644 index 9431903..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * AuthorityKeyIdentifier - * - * @author Jim Wigginton - */ -abstract class AuthorityKeyIdentifier -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['keyIdentifier' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\KeyIdentifier::MAP, 'authorityCertIssuer' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\GeneralNames::MAP, 'authorityCertSerialNumber' => ['constant' => 2, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\CertificateSerialNumber::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php deleted file mode 100644 index 4053073..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * BaseDistance - * - * @author Jim Wigginton - */ -abstract class BaseDistance -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php deleted file mode 100644 index 7df6ed0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * BasicConstraints - * - * @author Jim Wigginton - */ -abstract class BasicConstraints -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['cA' => ['type' => ASN1::TYPE_BOOLEAN, 'optional' => \true, 'default' => \false], 'pathLenConstraint' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php deleted file mode 100644 index f68c31c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * BuiltInDomainDefinedAttribute - * - * @author Jim Wigginton - */ -abstract class BuiltInDomainDefinedAttribute -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type' => ['type' => ASN1::TYPE_PRINTABLE_STRING], 'value' => ['type' => ASN1::TYPE_PRINTABLE_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php deleted file mode 100644 index bbb5157..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * BuiltInDomainDefinedAttributes - * - * @author Jim Wigginton - */ -abstract class BuiltInDomainDefinedAttributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, - // ub-domain-defined-attributes - 'children' => \phpseclib3\File\ASN1\Maps\BuiltInDomainDefinedAttribute::MAP, - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php deleted file mode 100644 index 14cd815..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * BuiltInStandardAttributes - * - * @author Jim Wigginton - */ -abstract class BuiltInStandardAttributes -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['country-name' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\CountryName::MAP, 'administration-domain-name' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\AdministrationDomainName::MAP, 'network-address' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\NetworkAddress::MAP, 'terminal-identifier' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\TerminalIdentifier::MAP, 'private-domain-name' => ['constant' => 2, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\PrivateDomainName::MAP, 'organization-name' => ['constant' => 3, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\OrganizationName::MAP, 'numeric-user-identifier' => ['constant' => 4, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\NumericUserIdentifier::MAP, 'personal-name' => ['constant' => 5, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\PersonalName::MAP, 'organizational-unit-names' => ['constant' => 6, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\OrganizationalUnitNames::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php deleted file mode 100644 index 0e4eb9d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CPSuri - * - * @author Jim Wigginton - */ -abstract class CPSuri -{ - const MAP = ['type' => ASN1::TYPE_IA5_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php deleted file mode 100644 index c7279a0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CRLDistributionPoints - * - * @author Jim Wigginton - */ -abstract class CRLDistributionPoints -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\DistributionPoint::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php deleted file mode 100644 index 6aac437..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CRLNumber - * - * @author Jim Wigginton - */ -abstract class CRLNumber -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php deleted file mode 100644 index 6b9fb83..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CRLReason - * - * @author Jim Wigginton - */ -abstract class CRLReason -{ - const MAP = ['type' => ASN1::TYPE_ENUMERATED, 'mapping' => [ - 'unspecified', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - // Value 7 is not used. - 8 => 'removeFromCRL', - 'privilegeWithdrawn', - 'aACompromise', - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php deleted file mode 100644 index a324d09..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CertPolicyId - * - * @author Jim Wigginton - */ -abstract class CertPolicyId -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php deleted file mode 100644 index 8dd9071..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Certificate - * - * @author Jim Wigginton - */ -abstract class Certificate -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['tbsCertificate' => \phpseclib3\File\ASN1\Maps\TBSCertificate::MAP, 'signatureAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php deleted file mode 100644 index ef707d8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -/** - * CertificateIssuer - * - * @author Jim Wigginton - */ -abstract class CertificateIssuer -{ - const MAP = \phpseclib3\File\ASN1\Maps\GeneralNames::MAP; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php deleted file mode 100644 index bb1bdfd..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CertificateList - * - * @author Jim Wigginton - */ -abstract class CertificateList -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['tbsCertList' => \phpseclib3\File\ASN1\Maps\TBSCertList::MAP, 'signatureAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php deleted file mode 100644 index a4f9fc8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CertificatePolicies - * - * @author Jim Wigginton - */ -abstract class CertificatePolicies -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\PolicyInformation::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php deleted file mode 100644 index f91deb3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CertificateSerialNumber - * - * @author Jim Wigginton - */ -abstract class CertificateSerialNumber -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php deleted file mode 100644 index d69dbd9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CertificationRequest - * - * @author Jim Wigginton - */ -abstract class CertificationRequest -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['certificationRequestInfo' => \phpseclib3\File\ASN1\Maps\CertificationRequestInfo::MAP, 'signatureAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php deleted file mode 100644 index a178a69..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CertificationRequestInfo - * - * @author Jim Wigginton - */ -abstract class CertificationRequestInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1']], 'subject' => \phpseclib3\File\ASN1\Maps\Name::MAP, 'subjectPKInfo' => \phpseclib3\File\ASN1\Maps\SubjectPublicKeyInfo::MAP, 'attributes' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\Attributes::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php deleted file mode 100644 index 9e2831a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Characteristic_two - * - * @author Jim Wigginton - */ -abstract class Characteristic_two -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'm' => ['type' => ASN1::TYPE_INTEGER], - // field size 2**m - 'basis' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'parameters' => ['type' => ASN1::TYPE_ANY, 'optional' => \true], - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php deleted file mode 100644 index 0eab4d6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * CountryName - * - * @author Jim Wigginton - */ -abstract class CountryName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - // if class isn't present it's assumed to be \phpseclib3\File\ASN1::CLASS_UNIVERSAL or - // (if constant is present) \phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC - 'class' => ASN1::CLASS_APPLICATION, - 'cast' => 1, - 'children' => ['x121-dcc-code' => ['type' => ASN1::TYPE_NUMERIC_STRING], 'iso-3166-alpha2-code' => ['type' => ASN1::TYPE_PRINTABLE_STRING]], - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php deleted file mode 100644 index 0eb060c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Curve - * - * @author Jim Wigginton - */ -abstract class Curve -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['a' => \phpseclib3\File\ASN1\Maps\FieldElement::MAP, 'b' => \phpseclib3\File\ASN1\Maps\FieldElement::MAP, 'seed' => ['type' => ASN1::TYPE_BIT_STRING, 'optional' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php deleted file mode 100644 index 270254e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DHParameter - * - * @author Jim Wigginton - */ -abstract class DHParameter -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['prime' => ['type' => ASN1::TYPE_INTEGER], 'base' => ['type' => ASN1::TYPE_INTEGER], 'privateValueLength' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php deleted file mode 100644 index 41d23be..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DSAParams - * - * @author Jim Wigginton - */ -abstract class DSAParams -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['p' => ['type' => ASN1::TYPE_INTEGER], 'q' => ['type' => ASN1::TYPE_INTEGER], 'g' => ['type' => ASN1::TYPE_INTEGER]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php deleted file mode 100644 index 2faee7d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DSAPrivateKey - * - * @author Jim Wigginton - */ -abstract class DSAPrivateKey -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER], 'p' => ['type' => ASN1::TYPE_INTEGER], 'q' => ['type' => ASN1::TYPE_INTEGER], 'g' => ['type' => ASN1::TYPE_INTEGER], 'y' => ['type' => ASN1::TYPE_INTEGER], 'x' => ['type' => ASN1::TYPE_INTEGER]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php deleted file mode 100644 index beaf352..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DSAPublicKey - * - * @author Jim Wigginton - */ -abstract class DSAPublicKey -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php deleted file mode 100644 index 49821a6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DigestInfo - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class DigestInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['digestAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'digest' => ['type' => ASN1::TYPE_OCTET_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php deleted file mode 100644 index e50a927..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DirectoryString - * - * @author Jim Wigginton - */ -abstract class DirectoryString -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['teletexString' => ['type' => ASN1::TYPE_TELETEX_STRING], 'printableString' => ['type' => ASN1::TYPE_PRINTABLE_STRING], 'universalString' => ['type' => ASN1::TYPE_UNIVERSAL_STRING], 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING], 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php deleted file mode 100644 index 25f8e92..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DisplayText - * - * @author Jim Wigginton - */ -abstract class DisplayText -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['ia5String' => ['type' => ASN1::TYPE_IA5_STRING], 'visibleString' => ['type' => ASN1::TYPE_VISIBLE_STRING], 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING], 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php deleted file mode 100644 index f5c88fa..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DistributionPoint - * - * @author Jim Wigginton - */ -abstract class DistributionPoint -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['distributionPoint' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\DistributionPointName::MAP, 'reasons' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\ReasonFlags::MAP, 'cRLIssuer' => ['constant' => 2, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\GeneralNames::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php deleted file mode 100644 index bf108be..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DistributionPointName - * - * @author Jim Wigginton - */ -abstract class DistributionPointName -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['fullName' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\GeneralNames::MAP, 'nameRelativeToCRLIssuer' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\RelativeDistinguishedName::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php deleted file mode 100644 index f91c4c0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * DssSigValue - * - * @author Jim Wigginton - */ -abstract class DssSigValue -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['r' => ['type' => ASN1::TYPE_INTEGER], 's' => ['type' => ASN1::TYPE_INTEGER]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php deleted file mode 100644 index c6be599..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ECParameters - * - * ECParameters ::= CHOICE { - * namedCurve OBJECT IDENTIFIER - * -- implicitCurve NULL - * -- specifiedCurve SpecifiedECDomain - * } - * -- implicitCurve and specifiedCurve MUST NOT be used in PKIX. - * -- Details for SpecifiedECDomain can be found in [X9.62]. - * -- Any future additions to this CHOICE should be coordinated - * -- with ANSI X9. - * - * @author Jim Wigginton - */ -abstract class ECParameters -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['namedCurve' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'implicitCurve' => ['type' => ASN1::TYPE_NULL], 'specifiedCurve' => \phpseclib3\File\ASN1\Maps\SpecifiedECDomain::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php deleted file mode 100644 index 1a1d08c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ECPoint - * - * @author Jim Wigginton - */ -abstract class ECPoint -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php deleted file mode 100644 index 8bb8844..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ECPrivateKey - * - * @author Jim Wigginton - */ -abstract class ECPrivateKey -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => [1 => 'ecPrivkeyVer1']], 'privateKey' => ['type' => ASN1::TYPE_OCTET_STRING], 'parameters' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\ECParameters::MAP, 'publicKey' => ['type' => ASN1::TYPE_BIT_STRING, 'constant' => 1, 'optional' => \true, 'explicit' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php deleted file mode 100644 index 6a61605..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * EDIPartyName - * - * @author Jim Wigginton - */ -abstract class EDIPartyName -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'nameAssigner' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\DirectoryString::MAP, - // partyName is technically required but \phpseclib3\File\ASN1 doesn't currently support non-optional constants and - // setting it to optional gets the job done in any event. - 'partyName' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\DirectoryString::MAP, - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php deleted file mode 100644 index 51b4848..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * EcdsaSigValue - * - * @author Jim Wigginton - */ -abstract class EcdsaSigValue -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['r' => ['type' => ASN1::TYPE_INTEGER], 's' => ['type' => ASN1::TYPE_INTEGER]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php deleted file mode 100644 index b74add7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * EncryptedData - * - * @author Jim Wigginton - */ -abstract class EncryptedData -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php deleted file mode 100644 index ce1d678..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * EncryptedPrivateKeyInfo - * - * @author Jim Wigginton - */ -abstract class EncryptedPrivateKeyInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['encryptionAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'encryptedData' => \phpseclib3\File\ASN1\Maps\EncryptedData::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php deleted file mode 100644 index 1a31abd..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ExtKeyUsageSyntax - * - * @author Jim Wigginton - */ -abstract class ExtKeyUsageSyntax -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\KeyPurposeId::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php deleted file mode 100644 index 936d0e5..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Extension - * - * A certificate using system MUST reject the certificate if it encounters - * a critical extension it does not recognize; however, a non-critical - * extension may be ignored if it is not recognized. - * - * http://tools.ietf.org/html/rfc5280#section-4.2 - * - * @author Jim Wigginton - */ -abstract class Extension -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['extnId' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'critical' => ['type' => ASN1::TYPE_BOOLEAN, 'optional' => \true, 'default' => \false], 'extnValue' => ['type' => ASN1::TYPE_OCTET_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php deleted file mode 100644 index e844250..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ExtensionAttribute - * - * @author Jim Wigginton - */ -abstract class ExtensionAttribute -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['extension-attribute-type' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 0, 'optional' => \true, 'implicit' => \true], 'extension-attribute-value' => ['type' => ASN1::TYPE_ANY, 'constant' => 1, 'optional' => \true, 'explicit' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php deleted file mode 100644 index 81b2bf2..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ExtensionAttributes - * - * @author Jim Wigginton - */ -abstract class ExtensionAttributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SET, - 'min' => 1, - 'max' => 256, - // ub-extension-attributes - 'children' => \phpseclib3\File\ASN1\Maps\ExtensionAttribute::MAP, - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php deleted file mode 100644 index e523f3c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Extensions - * - * @author Jim Wigginton - */ -abstract class Extensions -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - // technically, it's MAX, but we'll assume anything < 0 is MAX - 'max' => -1, - // if 'children' isn't an array then 'min' and 'max' must be defined - 'children' => \phpseclib3\File\ASN1\Maps\Extension::MAP, - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php deleted file mode 100644 index 6e18598..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * FieldElement - * - * @author Jim Wigginton - */ -abstract class FieldElement -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php deleted file mode 100644 index cc52506..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * FieldID - * - * @author Jim Wigginton - */ -abstract class FieldID -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['fieldType' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'parameters' => ['type' => ASN1::TYPE_ANY, 'optional' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php deleted file mode 100644 index f2ab3f9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * GeneralName - * - * @author Jim Wigginton - */ -abstract class GeneralName -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['otherName' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\AnotherName::MAP, 'rfc822Name' => ['type' => ASN1::TYPE_IA5_STRING, 'constant' => 1, 'optional' => \true, 'implicit' => \true], 'dNSName' => ['type' => ASN1::TYPE_IA5_STRING, 'constant' => 2, 'optional' => \true, 'implicit' => \true], 'x400Address' => ['constant' => 3, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\ORAddress::MAP, 'directoryName' => ['constant' => 4, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\Name::MAP, 'ediPartyName' => ['constant' => 5, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\EDIPartyName::MAP, 'uniformResourceIdentifier' => ['type' => ASN1::TYPE_IA5_STRING, 'constant' => 6, 'optional' => \true, 'implicit' => \true], 'iPAddress' => ['type' => ASN1::TYPE_OCTET_STRING, 'constant' => 7, 'optional' => \true, 'implicit' => \true], 'registeredID' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER, 'constant' => 8, 'optional' => \true, 'implicit' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php deleted file mode 100644 index 2e07db9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * GeneralNames - * - * @author Jim Wigginton - */ -abstract class GeneralNames -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\GeneralName::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php deleted file mode 100644 index 9cb722a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * GeneralSubtree - * - * @author Jim Wigginton - */ -abstract class GeneralSubtree -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['base' => \phpseclib3\File\ASN1\Maps\GeneralName::MAP, 'minimum' => ['constant' => 0, 'optional' => \true, 'implicit' => \true, 'default' => '0'] + \phpseclib3\File\ASN1\Maps\BaseDistance::MAP, 'maximum' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\BaseDistance::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php deleted file mode 100644 index c753b50..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * GeneralSubtrees - * - * @author Jim Wigginton - */ -abstract class GeneralSubtrees -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\GeneralSubtree::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php deleted file mode 100644 index bb8a9cc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -/** - * HashAglorithm - * - * @author Jim Wigginton - */ -abstract class HashAlgorithm -{ - const MAP = \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php deleted file mode 100644 index 3f4fe6e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * HoldInstructionCode - * - * @author Jim Wigginton - */ -abstract class HoldInstructionCode -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php deleted file mode 100644 index aad4a49..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * InvalidityDate - * - * @author Jim Wigginton - */ -abstract class InvalidityDate -{ - const MAP = ['type' => ASN1::TYPE_GENERALIZED_TIME]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php deleted file mode 100644 index 365cd35..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -/** - * IssuerAltName - * - * @author Jim Wigginton - */ -abstract class IssuerAltName -{ - const MAP = \phpseclib3\File\ASN1\Maps\GeneralNames::MAP; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php deleted file mode 100644 index 9d5cb7c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * IssuingDistributionPoint - * - * @author Jim Wigginton - */ -abstract class IssuingDistributionPoint -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['distributionPoint' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\DistributionPointName::MAP, 'onlyContainsUserCerts' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 1, 'optional' => \true, 'default' => \false, 'implicit' => \true], 'onlyContainsCACerts' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 2, 'optional' => \true, 'default' => \false, 'implicit' => \true], 'onlySomeReasons' => ['constant' => 3, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\ReasonFlags::MAP, 'indirectCRL' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 4, 'optional' => \true, 'default' => \false, 'implicit' => \true], 'onlyContainsAttributeCerts' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 5, 'optional' => \true, 'default' => \false, 'implicit' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php deleted file mode 100644 index 0d201c9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * KeyIdentifier - * - * @author Jim Wigginton - */ -abstract class KeyIdentifier -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php deleted file mode 100644 index e335197..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * KeyPurposeId - * - * @author Jim Wigginton - */ -abstract class KeyPurposeId -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php deleted file mode 100644 index 59dace3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * KeyUsage - * - * @author Jim Wigginton - */ -abstract class KeyUsage -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING, 'mapping' => ['digitalSignature', 'nonRepudiation', 'keyEncipherment', 'dataEncipherment', 'keyAgreement', 'keyCertSign', 'cRLSign', 'encipherOnly', 'decipherOnly']]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php deleted file mode 100644 index bcba3cf..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -/** - * MaskGenAglorithm - * - * @author Jim Wigginton - */ -abstract class MaskGenAlgorithm -{ - const MAP = \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php deleted file mode 100644 index 1f25cbc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Name - * - * @author Jim Wigginton - */ -abstract class Name -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['rdnSequence' => \phpseclib3\File\ASN1\Maps\RDNSequence::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php deleted file mode 100644 index b4f39d1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * NameConstraints - * - * @author Jim Wigginton - */ -abstract class NameConstraints -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['permittedSubtrees' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\GeneralSubtrees::MAP, 'excludedSubtrees' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\GeneralSubtrees::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php deleted file mode 100644 index 545265d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * NetworkAddress - * - * @author Jim Wigginton - */ -abstract class NetworkAddress -{ - const MAP = ['type' => ASN1::TYPE_NUMERIC_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php deleted file mode 100644 index c2f3c1f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * NoticeReference - * - * @author Jim Wigginton - */ -abstract class NoticeReference -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['organization' => \phpseclib3\File\ASN1\Maps\DisplayText::MAP, 'noticeNumbers' => ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => 200, 'children' => ['type' => ASN1::TYPE_INTEGER]]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php deleted file mode 100644 index a9c740f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * NumericUserIdentifier - * - * @author Jim Wigginton - */ -abstract class NumericUserIdentifier -{ - const MAP = ['type' => ASN1::TYPE_NUMERIC_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php deleted file mode 100644 index 704bbb2..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ORAddress - * - * @author Jim Wigginton - */ -abstract class ORAddress -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['built-in-standard-attributes' => \phpseclib3\File\ASN1\Maps\BuiltInStandardAttributes::MAP, 'built-in-domain-defined-attributes' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\BuiltInDomainDefinedAttributes::MAP, 'extension-attributes' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\ExtensionAttributes::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php deleted file mode 100644 index bdfa744..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * OneAsymmetricKey - * - * @author Jim Wigginton - */ -abstract class OneAsymmetricKey -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1', 'v2']], 'privateKeyAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'privateKey' => \phpseclib3\File\ASN1\Maps\PrivateKey::MAP, 'attributes' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\Attributes::MAP, 'publicKey' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\PublicKey::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php deleted file mode 100644 index fea83f4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * OrganizationName - * - * @author Jim Wigginton - */ -abstract class OrganizationName -{ - const MAP = ['type' => ASN1::TYPE_PRINTABLE_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php deleted file mode 100644 index eaa5bb7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * OrganizationalUnitNames - * - * @author Jim Wigginton - */ -abstract class OrganizationalUnitNames -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, - // ub-organizational-units - 'children' => ['type' => ASN1::TYPE_PRINTABLE_STRING], - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php deleted file mode 100644 index f8f3f40..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * OtherPrimeInfo - * - * @author Jim Wigginton - */ -abstract class OtherPrimeInfo -{ - // version must be multi if otherPrimeInfos present - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'prime' => ['type' => ASN1::TYPE_INTEGER], - // ri - 'exponent' => ['type' => ASN1::TYPE_INTEGER], - // di - 'coefficient' => ['type' => ASN1::TYPE_INTEGER], - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php deleted file mode 100644 index 91477b3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * OtherPrimeInfos - * - * @author Jim Wigginton - */ -abstract class OtherPrimeInfos -{ - // version must be multi if otherPrimeInfos present - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\OtherPrimeInfo::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php deleted file mode 100644 index 5c8bd28..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PBEParameter - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBEParameter -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['salt' => ['type' => ASN1::TYPE_OCTET_STRING], 'iterationCount' => ['type' => ASN1::TYPE_INTEGER]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php deleted file mode 100644 index 674beea..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PBES2params - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBES2params -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['keyDerivationFunc' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'encryptionScheme' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php deleted file mode 100644 index 179b374..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PBKDF2params - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBKDF2params -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - // technically, this is a CHOICE in RFC2898 but the other "choice" is, currently, more of a placeholder - // in the RFC - 'salt' => ['type' => ASN1::TYPE_OCTET_STRING], - 'iterationCount' => ['type' => ASN1::TYPE_INTEGER], - 'keyLength' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true], - 'prf' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP + ['optional' => \true], - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php deleted file mode 100644 index f4a02c9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PBMAC1params - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBMAC1params -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['keyDerivationFunc' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'messageAuthScheme' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php deleted file mode 100644 index 9f90a6a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PKCS9String - * - * @author Jim Wigginton - */ -abstract class PKCS9String -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['ia5String' => ['type' => ASN1::TYPE_IA5_STRING], 'directoryString' => \phpseclib3\File\ASN1\Maps\DirectoryString::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php deleted file mode 100644 index b242774..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Pentanomial - * - * @author Jim Wigginton - */ -abstract class Pentanomial -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'k1' => ['type' => ASN1::TYPE_INTEGER], - // k1 > 0 - 'k2' => ['type' => ASN1::TYPE_INTEGER], - // k2 > k1 - 'k3' => ['type' => ASN1::TYPE_INTEGER], - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php deleted file mode 100644 index 839aba7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PersonalName - * - * @author Jim Wigginton - */ -abstract class PersonalName -{ - const MAP = ['type' => ASN1::TYPE_SET, 'children' => ['surname' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 0, 'optional' => \true, 'implicit' => \true], 'given-name' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 1, 'optional' => \true, 'implicit' => \true], 'initials' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 2, 'optional' => \true, 'implicit' => \true], 'generation-qualifier' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 3, 'optional' => \true, 'implicit' => \true]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php deleted file mode 100644 index 418ed11..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PolicyInformation - * - * @author Jim Wigginton - */ -abstract class PolicyInformation -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['policyIdentifier' => \phpseclib3\File\ASN1\Maps\CertPolicyId::MAP, 'policyQualifiers' => ['type' => ASN1::TYPE_SEQUENCE, 'min' => 0, 'max' => -1, 'optional' => \true, 'children' => \phpseclib3\File\ASN1\Maps\PolicyQualifierInfo::MAP]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php deleted file mode 100644 index 1ef8f68..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PolicyMappings - * - * @author Jim Wigginton - */ -abstract class PolicyMappings -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['issuerDomainPolicy' => \phpseclib3\File\ASN1\Maps\CertPolicyId::MAP, 'subjectDomainPolicy' => \phpseclib3\File\ASN1\Maps\CertPolicyId::MAP]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php deleted file mode 100644 index 625a703..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PolicyQualifierId - * - * @author Jim Wigginton - */ -abstract class PolicyQualifierId -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php deleted file mode 100644 index 163d4f9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PolicyQualifierInfo - * - * @author Jim Wigginton - */ -abstract class PolicyQualifierInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['policyQualifierId' => \phpseclib3\File\ASN1\Maps\PolicyQualifierId::MAP, 'qualifier' => ['type' => ASN1::TYPE_ANY]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php deleted file mode 100644 index a31a569..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PostalAddress - * - * @author Jim Wigginton - */ -abstract class PostalAddress -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'optional' => \true, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\DirectoryString::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php deleted file mode 100644 index 4f83740..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Prime_p - * - * @author Jim Wigginton - */ -abstract class Prime_p -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php deleted file mode 100644 index d7f1d47..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PrivateDomainName - * - * @author Jim Wigginton - */ -abstract class PrivateDomainName -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php deleted file mode 100644 index 39ed123..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PrivateKey - * - * @author Jim Wigginton - */ -abstract class PrivateKey -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php deleted file mode 100644 index 4b4f85b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PrivateKeyInfo - * - * @author Jim Wigginton - */ -abstract class PrivateKeyInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1']], 'privateKeyAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'privateKey' => \phpseclib3\File\ASN1\Maps\PrivateKey::MAP, 'attributes' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\Attributes::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php deleted file mode 100644 index a6b6690..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PrivateKeyUsagePeriod - * - * @author Jim Wigginton - */ -abstract class PrivateKeyUsagePeriod -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['notBefore' => ['constant' => 0, 'optional' => \true, 'implicit' => \true, 'type' => ASN1::TYPE_GENERALIZED_TIME], 'notAfter' => ['constant' => 1, 'optional' => \true, 'implicit' => \true, 'type' => ASN1::TYPE_GENERALIZED_TIME]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php deleted file mode 100644 index 8b89dd0..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PublicKey - * - * @author Jim Wigginton - */ -abstract class PublicKey -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php deleted file mode 100644 index c56566a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PublicKeyAndChallenge - * - * @author Jim Wigginton - */ -abstract class PublicKeyAndChallenge -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['spki' => \phpseclib3\File\ASN1\Maps\SubjectPublicKeyInfo::MAP, 'challenge' => ['type' => ASN1::TYPE_IA5_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php deleted file mode 100644 index fcb0a59..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * PublicKeyInfo - * - * this format is not formally defined anywhere but is none-the-less the form you - * get when you do "openssl rsa -in private.pem -outform PEM -pubout" - * - * @author Jim Wigginton - */ -abstract class PublicKeyInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['publicKeyAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'publicKey' => ['type' => ASN1::TYPE_BIT_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php deleted file mode 100644 index 3b1ec9b..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RC2CBCParameter - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class RC2CBCParameter -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['rc2ParametersVersion' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true], 'iv' => ['type' => ASN1::TYPE_OCTET_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php deleted file mode 100644 index 0c52482..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RDNSequence - * - * In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, - * but they can be useful at times when either there is no unique attribute in the entry or you - * want to ensure that the entry's DN contains some useful identifying information. - * - * - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName - * - * @author Jim Wigginton - */ -abstract class RDNSequence -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - // RDNSequence does not define a min or a max, which means it doesn't have one - 'min' => 0, - 'max' => -1, - 'children' => \phpseclib3\File\ASN1\Maps\RelativeDistinguishedName::MAP, - ]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php deleted file mode 100644 index a945d8e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RSAPrivateKey - * - * @author Jim Wigginton - */ -abstract class RSAPrivateKey -{ - // version must be multi if otherPrimeInfos present - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['two-prime', 'multi']], - 'modulus' => ['type' => ASN1::TYPE_INTEGER], - // n - 'publicExponent' => ['type' => ASN1::TYPE_INTEGER], - // e - 'privateExponent' => ['type' => ASN1::TYPE_INTEGER], - // d - 'prime1' => ['type' => ASN1::TYPE_INTEGER], - // p - 'prime2' => ['type' => ASN1::TYPE_INTEGER], - // q - 'exponent1' => ['type' => ASN1::TYPE_INTEGER], - // d mod (p-1) - 'exponent2' => ['type' => ASN1::TYPE_INTEGER], - // d mod (q-1) - 'coefficient' => ['type' => ASN1::TYPE_INTEGER], - // (inverse of q) mod p - 'otherPrimeInfos' => \phpseclib3\File\ASN1\Maps\OtherPrimeInfos::MAP + ['optional' => \true], - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php deleted file mode 100644 index bc39d01..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RSAPublicKey - * - * @author Jim Wigginton - */ -abstract class RSAPublicKey -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['modulus' => ['type' => ASN1::TYPE_INTEGER], 'publicExponent' => ['type' => ASN1::TYPE_INTEGER]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php deleted file mode 100644 index 5ff6fc3..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RSASSA_PSS_params - * - * @author Jim Wigginton - */ -abstract class RSASSA_PSS_params -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['hashAlgorithm' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\HashAlgorithm::MAP, 'maskGenAlgorithm' => ['constant' => 1, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\MaskGenAlgorithm::MAP, 'saltLength' => ['type' => ASN1::TYPE_INTEGER, 'constant' => 2, 'optional' => \true, 'explicit' => \true, 'default' => 20], 'trailerField' => ['type' => ASN1::TYPE_INTEGER, 'constant' => 3, 'optional' => \true, 'explicit' => \true, 'default' => 1]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php deleted file mode 100644 index c961072..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * ReasonFlags - * - * @author Jim Wigginton - */ -abstract class ReasonFlags -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING, 'mapping' => ['unused', 'keyCompromise', 'cACompromise', 'affiliationChanged', 'superseded', 'cessationOfOperation', 'certificateHold', 'privilegeWithdrawn', 'aACompromise']]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php deleted file mode 100644 index c98dda8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RelativeDistinguishedName - * - * In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, - * but they can be useful at times when either there is no unique attribute in the entry or you - * want to ensure that the entry's DN contains some useful identifying information. - * - * - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName - * - * @author Jim Wigginton - */ -abstract class RelativeDistinguishedName -{ - const MAP = ['type' => ASN1::TYPE_SET, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\AttributeTypeAndValue::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php deleted file mode 100644 index 8647e05..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * RevokedCertificate - * - * @author Jim Wigginton - */ -abstract class RevokedCertificate -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['userCertificate' => \phpseclib3\File\ASN1\Maps\CertificateSerialNumber::MAP, 'revocationDate' => \phpseclib3\File\ASN1\Maps\Time::MAP, 'crlEntryExtensions' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\Extensions::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php deleted file mode 100644 index e9487b9..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * SignedPublicKeyAndChallenge - * - * @author Jim Wigginton - */ -abstract class SignedPublicKeyAndChallenge -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['publicKeyAndChallenge' => \phpseclib3\File\ASN1\Maps\PublicKeyAndChallenge::MAP, 'signatureAlgorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php deleted file mode 100644 index cc5d20e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * SpecifiedECDomain - * - * @author Jim Wigginton - */ -abstract class SpecifiedECDomain -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => [1 => 'ecdpVer1', 'ecdpVer2', 'ecdpVer3']], 'fieldID' => \phpseclib3\File\ASN1\Maps\FieldID::MAP, 'curve' => \phpseclib3\File\ASN1\Maps\Curve::MAP, 'base' => \phpseclib3\File\ASN1\Maps\ECPoint::MAP, 'order' => ['type' => ASN1::TYPE_INTEGER], 'cofactor' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true], 'hash' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\HashAlgorithm::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php deleted file mode 100644 index fbb9a94..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -/** - * SubjectAltName - * - * @author Jim Wigginton - */ -abstract class SubjectAltName -{ - const MAP = \phpseclib3\File\ASN1\Maps\GeneralNames::MAP; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php deleted file mode 100644 index dd61136..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * SubjectDirectoryAttributes - * - * @author Jim Wigginton - */ -abstract class SubjectDirectoryAttributes -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\Attribute::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php deleted file mode 100644 index 18de399..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * SubjectInfoAccessSyntax - * - * @author Jim Wigginton - */ -abstract class SubjectInfoAccessSyntax -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\AccessDescription::MAP]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php deleted file mode 100644 index 417bfc4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * SubjectPublicKeyInfo - * - * @author Jim Wigginton - */ -abstract class SubjectPublicKeyInfo -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['algorithm' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'subjectPublicKey' => ['type' => ASN1::TYPE_BIT_STRING]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php deleted file mode 100644 index ef1a01d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * TBSCertList - * - * @author Jim Wigginton - */ -abstract class TBSCertList -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1', 'v2', 'v3'], 'optional' => \true, 'default' => 'v2'], 'signature' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, 'issuer' => \phpseclib3\File\ASN1\Maps\Name::MAP, 'thisUpdate' => \phpseclib3\File\ASN1\Maps\Time::MAP, 'nextUpdate' => ['optional' => \true] + \phpseclib3\File\ASN1\Maps\Time::MAP, 'revokedCertificates' => ['type' => ASN1::TYPE_SEQUENCE, 'optional' => \true, 'min' => 0, 'max' => -1, 'children' => \phpseclib3\File\ASN1\Maps\RevokedCertificate::MAP], 'crlExtensions' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\Extensions::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php deleted file mode 100644 index e0cfd64..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * TBSCertificate - * - * @author Jim Wigginton - */ -abstract class TBSCertificate -{ - // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - // technically, default implies optional, but we'll define it as being optional, none-the-less, just to - // reenforce that fact - 'version' => ['type' => ASN1::TYPE_INTEGER, 'constant' => 0, 'optional' => \true, 'explicit' => \true, 'mapping' => ['v1', 'v2', 'v3'], 'default' => 'v1'], - 'serialNumber' => \phpseclib3\File\ASN1\Maps\CertificateSerialNumber::MAP, - 'signature' => \phpseclib3\File\ASN1\Maps\AlgorithmIdentifier::MAP, - 'issuer' => \phpseclib3\File\ASN1\Maps\Name::MAP, - 'validity' => \phpseclib3\File\ASN1\Maps\Validity::MAP, - 'subject' => \phpseclib3\File\ASN1\Maps\Name::MAP, - 'subjectPublicKeyInfo' => \phpseclib3\File\ASN1\Maps\SubjectPublicKeyInfo::MAP, - // implicit means that the T in the TLV structure is to be rewritten, regardless of the type - 'issuerUniqueID' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\UniqueIdentifier::MAP, - 'subjectUniqueID' => ['constant' => 2, 'optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\UniqueIdentifier::MAP, - // doesn't use the EXPLICIT keyword but if - // it's not IMPLICIT, it's EXPLICIT - 'extensions' => ['constant' => 3, 'optional' => \true, 'explicit' => \true] + \phpseclib3\File\ASN1\Maps\Extensions::MAP, - ]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php deleted file mode 100644 index 7f6fbfb..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * TerminalIdentifier - * - * @author Jim Wigginton - */ -abstract class TerminalIdentifier -{ - const MAP = ['type' => ASN1::TYPE_PRINTABLE_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php deleted file mode 100644 index acf6254..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Time - * - * @author Jim Wigginton - */ -abstract class Time -{ - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['utcTime' => ['type' => ASN1::TYPE_UTC_TIME], 'generalTime' => ['type' => ASN1::TYPE_GENERALIZED_TIME]]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php deleted file mode 100644 index 9ae5dc6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Trinomial - * - * @author Jim Wigginton - */ -abstract class Trinomial -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php deleted file mode 100644 index aef38d4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * UniqueIdentifier - * - * @author Jim Wigginton - */ -abstract class UniqueIdentifier -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php deleted file mode 100644 index c89a198..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * UserNotice - * - * @author Jim Wigginton - */ -abstract class UserNotice -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['noticeRef' => ['optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\NoticeReference::MAP, 'explicitText' => ['optional' => \true, 'implicit' => \true] + \phpseclib3\File\ASN1\Maps\DisplayText::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php deleted file mode 100644 index 2ee6ba8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * Validity - * - * @author Jim Wigginton - */ -abstract class Validity -{ - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['notBefore' => \phpseclib3\File\ASN1\Maps\Time::MAP, 'notAfter' => \phpseclib3\File\ASN1\Maps\Time::MAP]]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php deleted file mode 100644 index b141ce1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * netscape_ca_policy_url - * - * @author Jim Wigginton - */ -abstract class netscape_ca_policy_url -{ - const MAP = ['type' => ASN1::TYPE_IA5_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php deleted file mode 100644 index f566cd8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * netscape_cert_type - * - * mapping is from - * - * @author Jim Wigginton - */ -abstract class netscape_cert_type -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING, 'mapping' => ['SSLClient', 'SSLServer', 'Email', 'ObjectSigning', 'Reserved', 'SSLCA', 'EmailCA', 'ObjectSigningCA']]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php b/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php deleted file mode 100644 index 39a4993..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File\ASN1\Maps; - -use phpseclib3\File\ASN1; -/** - * netscape_comment - * - * @author Jim Wigginton - */ -abstract class netscape_comment -{ - const MAP = ['type' => ASN1::TYPE_IA5_STRING]; -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/File/X509.php b/dependencies/phpseclib/phpseclib/phpseclib/File/X509.php deleted file mode 100644 index fc3a87f..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/File/X509.php +++ /dev/null @@ -1,3504 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\File; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\PrivateKey; -use phpseclib3\Crypt\Common\PublicKey; -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\EC; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\PublicKeyLoader; -use phpseclib3\Crypt\Random; -use phpseclib3\Crypt\RSA; -use phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\File\ASN1\Element; -use phpseclib3\File\ASN1\Maps; -use phpseclib3\Math\BigInteger; -/** - * Pure-PHP X.509 Parser - * - * @author Jim Wigginton - */ -class X509 -{ - /** - * Flag to only accept signatures signed by certificate authorities - * - * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs - * - */ - const VALIDATE_SIGNATURE_BY_CA = 1; - /** - * Return internal array representation - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_ARRAY = 0; - /** - * Return string - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_STRING = 1; - /** - * Return ASN.1 name string - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_ASN1 = 2; - /** - * Return OpenSSL compatible array - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_OPENSSL = 3; - /** - * Return canonical ASN.1 RDNs string - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_CANON = 4; - /** - * Return name hash for file indexing - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_HASH = 5; - /** - * Save as PEM - * - * ie. a base64-encoded PEM with a header and a footer - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - */ - const FORMAT_PEM = 0; - /** - * Save as DER - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - */ - const FORMAT_DER = 1; - /** - * Save as a SPKAC - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - * - * Only works on CSRs. Not currently supported. - */ - const FORMAT_SPKAC = 2; - /** - * Auto-detect the format - * - * Used only by the load*() functions - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - */ - const FORMAT_AUTO_DETECT = 3; - /** - * Attribute value disposition. - * If disposition is >= 0, this is the index of the target value. - */ - const ATTR_ALL = -1; - // All attribute values (array). - const ATTR_APPEND = -2; - // Add a value. - const ATTR_REPLACE = -3; - // Clear first, then add a value. - /** - * Distinguished Name - * - * @var array - */ - private $dn; - /** - * Public key - * - * @var string|PublicKey - */ - private $publicKey; - /** - * Private key - * - * @var string|PrivateKey - */ - private $privateKey; - /** - * The certificate authorities - * - * @var array - */ - private $CAs = []; - /** - * The currently loaded certificate - * - * @var array - */ - private $currentCert; - /** - * The signature subject - * - * There's no guarantee \phpseclib3\File\X509 is going to re-encode an X.509 cert in the same way it was originally - * encoded so we take save the portion of the original cert that the signature would have made for. - * - * @var string - */ - private $signatureSubject; - /** - * Certificate Start Date - * - * @var string - */ - private $startDate; - /** - * Certificate End Date - * - * @var string|Element - */ - private $endDate; - /** - * Serial Number - * - * @var string - */ - private $serialNumber; - /** - * Key Identifier - * - * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and - * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}. - * - * @var string - */ - private $currentKeyIdentifier; - /** - * CA Flag - * - * @var bool - */ - private $caFlag = \false; - /** - * SPKAC Challenge - * - * @var string - */ - private $challenge; - /** - * @var array - */ - private $extensionValues = []; - /** - * OIDs loaded - * - * @var bool - */ - private static $oidsLoaded = \false; - /** - * Recursion Limit - * - * @var int - */ - private static $recur_limit = 5; - /** - * URL fetch flag - * - * @var bool - */ - private static $disable_url_fetch = \false; - /** - * @var array - */ - private static $extensions = []; - /** - * @var ?array - */ - private $ipAddresses = null; - /** - * @var ?array - */ - private $domains = null; - /** - * Default Constructor. - * - * @return \phpseclib3\File\X509 - */ - public function __construct() - { - // Explicitly Tagged Module, 1988 Syntax - // http://tools.ietf.org/html/rfc5280#appendix-A.1 - if (!self::$oidsLoaded) { - // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 - \phpseclib3\File\ASN1::loadOIDs([ - //'id-pkix' => '1.3.6.1.5.5.7', - //'id-pe' => '1.3.6.1.5.5.7.1', - //'id-qt' => '1.3.6.1.5.5.7.2', - //'id-kp' => '1.3.6.1.5.5.7.3', - //'id-ad' => '1.3.6.1.5.5.7.48', - 'id-qt-cps' => '1.3.6.1.5.5.7.2.1', - 'id-qt-unotice' => '1.3.6.1.5.5.7.2.2', - 'id-ad-ocsp' => '1.3.6.1.5.5.7.48.1', - 'id-ad-caIssuers' => '1.3.6.1.5.5.7.48.2', - 'id-ad-timeStamping' => '1.3.6.1.5.5.7.48.3', - 'id-ad-caRepository' => '1.3.6.1.5.5.7.48.5', - //'id-at' => '2.5.4', - 'id-at-name' => '2.5.4.41', - 'id-at-surname' => '2.5.4.4', - 'id-at-givenName' => '2.5.4.42', - 'id-at-initials' => '2.5.4.43', - 'id-at-generationQualifier' => '2.5.4.44', - 'id-at-commonName' => '2.5.4.3', - 'id-at-localityName' => '2.5.4.7', - 'id-at-stateOrProvinceName' => '2.5.4.8', - 'id-at-organizationName' => '2.5.4.10', - 'id-at-organizationalUnitName' => '2.5.4.11', - 'id-at-title' => '2.5.4.12', - 'id-at-description' => '2.5.4.13', - 'id-at-dnQualifier' => '2.5.4.46', - 'id-at-countryName' => '2.5.4.6', - 'id-at-serialNumber' => '2.5.4.5', - 'id-at-pseudonym' => '2.5.4.65', - 'id-at-postalCode' => '2.5.4.17', - 'id-at-streetAddress' => '2.5.4.9', - 'id-at-uniqueIdentifier' => '2.5.4.45', - 'id-at-role' => '2.5.4.72', - 'id-at-postalAddress' => '2.5.4.16', - 'jurisdictionOfIncorporationCountryName' => '1.3.6.1.4.1.311.60.2.1.3', - 'jurisdictionOfIncorporationStateOrProvinceName' => '1.3.6.1.4.1.311.60.2.1.2', - 'jurisdictionLocalityName' => '1.3.6.1.4.1.311.60.2.1.1', - 'id-at-businessCategory' => '2.5.4.15', - //'id-domainComponent' => '0.9.2342.19200300.100.1.25', - //'pkcs-9' => '1.2.840.113549.1.9', - 'pkcs-9-at-emailAddress' => '1.2.840.113549.1.9.1', - //'id-ce' => '2.5.29', - 'id-ce-authorityKeyIdentifier' => '2.5.29.35', - 'id-ce-subjectKeyIdentifier' => '2.5.29.14', - 'id-ce-keyUsage' => '2.5.29.15', - 'id-ce-privateKeyUsagePeriod' => '2.5.29.16', - 'id-ce-certificatePolicies' => '2.5.29.32', - //'anyPolicy' => '2.5.29.32.0', - 'id-ce-policyMappings' => '2.5.29.33', - 'id-ce-subjectAltName' => '2.5.29.17', - 'id-ce-issuerAltName' => '2.5.29.18', - 'id-ce-subjectDirectoryAttributes' => '2.5.29.9', - 'id-ce-basicConstraints' => '2.5.29.19', - 'id-ce-nameConstraints' => '2.5.29.30', - 'id-ce-policyConstraints' => '2.5.29.36', - 'id-ce-cRLDistributionPoints' => '2.5.29.31', - 'id-ce-extKeyUsage' => '2.5.29.37', - //'anyExtendedKeyUsage' => '2.5.29.37.0', - 'id-kp-serverAuth' => '1.3.6.1.5.5.7.3.1', - 'id-kp-clientAuth' => '1.3.6.1.5.5.7.3.2', - 'id-kp-codeSigning' => '1.3.6.1.5.5.7.3.3', - 'id-kp-emailProtection' => '1.3.6.1.5.5.7.3.4', - 'id-kp-timeStamping' => '1.3.6.1.5.5.7.3.8', - 'id-kp-OCSPSigning' => '1.3.6.1.5.5.7.3.9', - 'id-ce-inhibitAnyPolicy' => '2.5.29.54', - 'id-ce-freshestCRL' => '2.5.29.46', - 'id-pe-authorityInfoAccess' => '1.3.6.1.5.5.7.1.1', - 'id-pe-subjectInfoAccess' => '1.3.6.1.5.5.7.1.11', - 'id-ce-cRLNumber' => '2.5.29.20', - 'id-ce-issuingDistributionPoint' => '2.5.29.28', - 'id-ce-deltaCRLIndicator' => '2.5.29.27', - 'id-ce-cRLReasons' => '2.5.29.21', - 'id-ce-certificateIssuer' => '2.5.29.29', - 'id-ce-holdInstructionCode' => '2.5.29.23', - //'holdInstruction' => '1.2.840.10040.2', - 'id-holdinstruction-none' => '1.2.840.10040.2.1', - 'id-holdinstruction-callissuer' => '1.2.840.10040.2.2', - 'id-holdinstruction-reject' => '1.2.840.10040.2.3', - 'id-ce-invalidityDate' => '2.5.29.24', - 'rsaEncryption' => '1.2.840.113549.1.1.1', - 'md2WithRSAEncryption' => '1.2.840.113549.1.1.2', - 'md5WithRSAEncryption' => '1.2.840.113549.1.1.4', - 'sha1WithRSAEncryption' => '1.2.840.113549.1.1.5', - 'sha224WithRSAEncryption' => '1.2.840.113549.1.1.14', - 'sha256WithRSAEncryption' => '1.2.840.113549.1.1.11', - 'sha384WithRSAEncryption' => '1.2.840.113549.1.1.12', - 'sha512WithRSAEncryption' => '1.2.840.113549.1.1.13', - 'id-ecPublicKey' => '1.2.840.10045.2.1', - 'ecdsa-with-SHA1' => '1.2.840.10045.4.1', - // from https://tools.ietf.org/html/rfc5758#section-3.2 - 'ecdsa-with-SHA224' => '1.2.840.10045.4.3.1', - 'ecdsa-with-SHA256' => '1.2.840.10045.4.3.2', - 'ecdsa-with-SHA384' => '1.2.840.10045.4.3.3', - 'ecdsa-with-SHA512' => '1.2.840.10045.4.3.4', - 'id-dsa' => '1.2.840.10040.4.1', - 'id-dsa-with-sha1' => '1.2.840.10040.4.3', - // from https://tools.ietf.org/html/rfc5758#section-3.1 - 'id-dsa-with-sha224' => '2.16.840.1.101.3.4.3.1', - 'id-dsa-with-sha256' => '2.16.840.1.101.3.4.3.2', - // from https://tools.ietf.org/html/rfc8410: - 'id-Ed25519' => '1.3.101.112', - 'id-Ed448' => '1.3.101.113', - 'id-RSASSA-PSS' => '1.2.840.113549.1.1.10', - //'id-sha224' => '2.16.840.1.101.3.4.2.4', - //'id-sha256' => '2.16.840.1.101.3.4.2.1', - //'id-sha384' => '2.16.840.1.101.3.4.2.2', - //'id-sha512' => '2.16.840.1.101.3.4.2.3', - //'id-GostR3411-94-with-GostR3410-94' => '1.2.643.2.2.4', - //'id-GostR3411-94-with-GostR3410-2001' => '1.2.643.2.2.3', - //'id-GostR3410-2001' => '1.2.643.2.2.20', - //'id-GostR3410-94' => '1.2.643.2.2.19', - // Netscape Object Identifiers from "Netscape Certificate Extensions" - 'netscape' => '2.16.840.1.113730', - 'netscape-cert-extension' => '2.16.840.1.113730.1', - 'netscape-cert-type' => '2.16.840.1.113730.1.1', - 'netscape-comment' => '2.16.840.1.113730.1.13', - 'netscape-ca-policy-url' => '2.16.840.1.113730.1.8', - // the following are X.509 extensions not supported by phpseclib - 'id-pe-logotype' => '1.3.6.1.5.5.7.1.12', - 'entrustVersInfo' => '1.2.840.113533.7.65.0', - 'verisignPrivate' => '2.16.840.1.113733.1.6.9', - // for Certificate Signing Requests - // see http://tools.ietf.org/html/rfc2985 - 'pkcs-9-at-unstructuredName' => '1.2.840.113549.1.9.2', - // PKCS #9 unstructured name - 'pkcs-9-at-challengePassword' => '1.2.840.113549.1.9.7', - // Challenge password for certificate revocations - 'pkcs-9-at-extensionRequest' => '1.2.840.113549.1.9.14', - ]); - } - } - /** - * Load X.509 certificate - * - * Returns an associative array describing the X.509 cert or a false if the cert failed to load - * - * @param array|string $cert - * @param int $mode - * @return mixed - */ - public function loadX509($cert, $mode = self::FORMAT_AUTO_DETECT) - { - if (\is_array($cert) && isset($cert['tbsCertificate'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - $this->dn = $cert['tbsCertificate']['subject']; - if (!isset($this->dn)) { - return \false; - } - $this->currentCert = $cert; - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = \is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - unset($this->signatureSubject); - return $cert; - } - if ($mode != self::FORMAT_DER) { - $newcert = \phpseclib3\File\ASN1::extractBER($cert); - if ($mode == self::FORMAT_PEM && $cert == $newcert) { - return \false; - } - $cert = $newcert; - } - if ($cert === \false) { - $this->currentCert = \false; - return \false; - } - $decoded = \phpseclib3\File\ASN1::decodeBER($cert); - if ($decoded) { - $x509 = \phpseclib3\File\ASN1::asn1map($decoded[0], Maps\Certificate::MAP); - } - if (!isset($x509) || $x509 === \false) { - $this->currentCert = \false; - return \false; - } - $this->signatureSubject = \substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - if ($this->isSubArrayValid($x509, 'tbsCertificate/extensions')) { - $this->mapInExtensions($x509, 'tbsCertificate/extensions'); - } - $this->mapInDNs($x509, 'tbsCertificate/issuer/rdnSequence'); - $this->mapInDNs($x509, 'tbsCertificate/subject/rdnSequence'); - $key = $x509['tbsCertificate']['subjectPublicKeyInfo']; - $key = \phpseclib3\File\ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($key), 64) . "-----END PUBLIC KEY-----"; - $this->currentCert = $x509; - $this->dn = $x509['tbsCertificate']['subject']; - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = \is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - return $x509; - } - /** - * Save X.509 certificate - * - * @param array $cert - * @param int $format optional - * @return string - */ - public function saveX509(array $cert, $format = self::FORMAT_PEM) - { - if (!\is_array($cert) || !isset($cert['tbsCertificate'])) { - return \false; - } - switch (\true) { - // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" - case !($algorithm = $this->subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): - case \is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - break; - default: - $cert['tbsCertificate']['subjectPublicKeyInfo'] = new Element(\base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']))); - } - if ($algorithm == 'rsaEncryption') { - $cert['signatureAlgorithm']['parameters'] = null; - $cert['tbsCertificate']['signature']['parameters'] = null; - } - $filters = []; - $type_utf8_string = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; - $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string; - $filters['signatureAlgorithm']['parameters'] = $type_utf8_string; - $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; - $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; - foreach (self::$extensions as $extension) { - $filters['tbsCertificate']['extensions'][] = $extension; - } - /* in the case of policyQualifiers/qualifier, the type has to be \phpseclib3\File\ASN1::TYPE_IA5_STRING. - \phpseclib3\File\ASN1::TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random - characters. - */ - $filters['policyQualifiers']['qualifier'] = ['type' => \phpseclib3\File\ASN1::TYPE_IA5_STRING]; - \phpseclib3\File\ASN1::setFilters($filters); - $this->mapOutExtensions($cert, 'tbsCertificate/extensions'); - $this->mapOutDNs($cert, 'tbsCertificate/issuer/rdnSequence'); - $this->mapOutDNs($cert, 'tbsCertificate/subject/rdnSequence'); - $cert = \phpseclib3\File\ASN1::encodeDER($cert, Maps\Certificate::MAP); - switch ($format) { - case self::FORMAT_DER: - return $cert; - // case self::FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE-----\r\n" . \chunk_split(Strings::base64_encode($cert), 64) . '-----END CERTIFICATE-----'; - } - } - /** - * Map extension values from octet string to extension-specific internal - * format. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapInExtensions(array &$root, $path) - { - $extensions =& $this->subArrayUnchecked($root, $path); - if ($extensions) { - for ($i = 0; $i < \count($extensions); $i++) { - $id = $extensions[$i]['extnId']; - $value =& $extensions[$i]['extnValue']; - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->getMapping($id); - if (!\is_bool($map)) { - $decoder = $id == 'id-ce-nameConstraints' ? [static::class, 'decodeNameConstraintIP'] : [static::class, 'decodeIP']; - $decoded = \phpseclib3\File\ASN1::decodeBER($value); - if (!$decoded) { - continue; - } - $mapped = \phpseclib3\File\ASN1::asn1map($decoded[0], $map, ['iPAddress' => $decoder]); - $value = $mapped === \false ? $decoded[0] : $mapped; - if ($id == 'id-ce-certificatePolicies') { - for ($j = 0; $j < \count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < \count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->getMapping($subid); - $subvalue =& $value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== \false) { - $decoded = \phpseclib3\File\ASN1::decodeBER($subvalue); - if (!$decoded) { - continue; - } - $mapped = \phpseclib3\File\ASN1::asn1map($decoded[0], $map); - $subvalue = $mapped === \false ? $decoded[0] : $mapped; - } - } - } - } - } - } - } - } - /** - * Map extension values from extension-specific internal format to - * octet string. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapOutExtensions(array &$root, $path) - { - $extensions =& $this->subArray($root, $path, !empty($this->extensionValues)); - foreach ($this->extensionValues as $id => $data) { - \extract($data); - $newext = ['extnId' => $id, 'extnValue' => $value, 'critical' => $critical]; - if ($replace) { - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - $extensions[$key] = $newext; - continue 2; - } - } - } - $extensions[] = $newext; - } - if (\is_array($extensions)) { - $size = \count($extensions); - for ($i = 0; $i < $size; $i++) { - if ($extensions[$i] instanceof Element) { - continue; - } - $id = $extensions[$i]['extnId']; - $value =& $extensions[$i]['extnValue']; - switch ($id) { - case 'id-ce-certificatePolicies': - for ($j = 0; $j < \count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < \count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->getMapping($subid); - $subvalue =& $value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== \false) { - // by default \phpseclib3\File\ASN1 will try to render qualifier as a \phpseclib3\File\ASN1::TYPE_IA5_STRING since it's - // actual type is \phpseclib3\File\ASN1::TYPE_ANY - $subvalue = new Element(\phpseclib3\File\ASN1::encodeDER($subvalue, $map)); - } - } - } - break; - case 'id-ce-authorityKeyIdentifier': - // use 00 as the serial number instead of an empty string - if (isset($value['authorityCertSerialNumber'])) { - if ($value['authorityCertSerialNumber']->toBytes() == '') { - $temp = \chr(\phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC << 6 | 2) . "\x01\x00"; - $value['authorityCertSerialNumber'] = new Element($temp); - } - } - } - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->getMapping($id); - if (\is_bool($map)) { - if (!$map) { - //user_error($id . ' is not a currently supported extension'); - unset($extensions[$i]); - } - } else { - $value = \phpseclib3\File\ASN1::encodeDER($value, $map, ['iPAddress' => [static::class, 'encodeIP']]); - } - } - } - } - /** - * Map attribute values from ANY type to attribute-specific internal - * format. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapInAttributes(&$root, $path) - { - $attributes =& $this->subArray($root, $path); - if (\is_array($attributes)) { - for ($i = 0; $i < \count($attributes); $i++) { - $id = $attributes[$i]['type']; - /* $value contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $map = $this->getMapping($id); - if (\is_array($attributes[$i]['value'])) { - $values =& $attributes[$i]['value']; - for ($j = 0; $j < \count($values); $j++) { - $value = \phpseclib3\File\ASN1::encodeDER($values[$j], Maps\AttributeValue::MAP); - $decoded = \phpseclib3\File\ASN1::decodeBER($value); - if (!\is_bool($map)) { - if (!$decoded) { - continue; - } - $mapped = \phpseclib3\File\ASN1::asn1map($decoded[0], $map); - if ($mapped !== \false) { - $values[$j] = $mapped; - } - if ($id == 'pkcs-9-at-extensionRequest' && $this->isSubArrayValid($values, $j)) { - $this->mapInExtensions($values, $j); - } - } elseif ($map) { - $values[$j] = $value; - } - } - } - } - } - } - /** - * Map attribute values from attribute-specific internal format to - * ANY type. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapOutAttributes(&$root, $path) - { - $attributes =& $this->subArray($root, $path); - if (\is_array($attributes)) { - $size = \count($attributes); - for ($i = 0; $i < $size; $i++) { - /* [value] contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $id = $attributes[$i]['type']; - $map = $this->getMapping($id); - if ($map === \false) { - //user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); - unset($attributes[$i]); - } elseif (\is_array($attributes[$i]['value'])) { - $values =& $attributes[$i]['value']; - for ($j = 0; $j < \count($values); $j++) { - switch ($id) { - case 'pkcs-9-at-extensionRequest': - $this->mapOutExtensions($values, $j); - break; - } - if (!\is_bool($map)) { - $temp = \phpseclib3\File\ASN1::encodeDER($values[$j], $map); - $decoded = \phpseclib3\File\ASN1::decodeBER($temp); - if (!$decoded) { - continue; - } - $values[$j] = \phpseclib3\File\ASN1::asn1map($decoded[0], Maps\AttributeValue::MAP); - } - } - } - } - } - } - /** - * Map DN values from ANY type to DN-specific internal - * format. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapInDNs(array &$root, $path) - { - $dns =& $this->subArray($root, $path); - if (\is_array($dns)) { - for ($i = 0; $i < \count($dns); $i++) { - for ($j = 0; $j < \count($dns[$i]); $j++) { - $type = $dns[$i][$j]['type']; - $value =& $dns[$i][$j]['value']; - if (\is_object($value) && $value instanceof Element) { - $map = $this->getMapping($type); - if (!\is_bool($map)) { - $decoded = \phpseclib3\File\ASN1::decodeBER($value); - if (!$decoded) { - continue; - } - $value = \phpseclib3\File\ASN1::asn1map($decoded[0], $map); - } - } - } - } - } - } - /** - * Map DN values from DN-specific internal format to - * ANY type. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapOutDNs(array &$root, $path) - { - $dns =& $this->subArray($root, $path); - if (\is_array($dns)) { - $size = \count($dns); - for ($i = 0; $i < $size; $i++) { - for ($j = 0; $j < \count($dns[$i]); $j++) { - $type = $dns[$i][$j]['type']; - $value =& $dns[$i][$j]['value']; - if (\is_object($value) && $value instanceof Element) { - continue; - } - $map = $this->getMapping($type); - if (!\is_bool($map)) { - $value = new Element(\phpseclib3\File\ASN1::encodeDER($value, $map)); - } - } - } - } - } - /** - * Associate an extension ID to an extension mapping - * - * @param string $extnId - * @return mixed - */ - private function getMapping($extnId) - { - if (!\is_string($extnId)) { - // eg. if it's a \phpseclib3\File\ASN1\Element object - return \true; - } - if (isset(self::$extensions[$extnId])) { - return self::$extensions[$extnId]; - } - switch ($extnId) { - case 'id-ce-keyUsage': - return Maps\KeyUsage::MAP; - case 'id-ce-basicConstraints': - return Maps\BasicConstraints::MAP; - case 'id-ce-subjectKeyIdentifier': - return Maps\KeyIdentifier::MAP; - case 'id-ce-cRLDistributionPoints': - return Maps\CRLDistributionPoints::MAP; - case 'id-ce-authorityKeyIdentifier': - return Maps\AuthorityKeyIdentifier::MAP; - case 'id-ce-certificatePolicies': - return Maps\CertificatePolicies::MAP; - case 'id-ce-extKeyUsage': - return Maps\ExtKeyUsageSyntax::MAP; - case 'id-pe-authorityInfoAccess': - return Maps\AuthorityInfoAccessSyntax::MAP; - case 'id-ce-subjectAltName': - return Maps\SubjectAltName::MAP; - case 'id-ce-subjectDirectoryAttributes': - return Maps\SubjectDirectoryAttributes::MAP; - case 'id-ce-privateKeyUsagePeriod': - return Maps\PrivateKeyUsagePeriod::MAP; - case 'id-ce-issuerAltName': - return Maps\IssuerAltName::MAP; - case 'id-ce-policyMappings': - return Maps\PolicyMappings::MAP; - case 'id-ce-nameConstraints': - return Maps\NameConstraints::MAP; - case 'netscape-cert-type': - return Maps\netscape_cert_type::MAP; - case 'netscape-comment': - return Maps\netscape_comment::MAP; - case 'netscape-ca-policy-url': - return Maps\netscape_ca_policy_url::MAP; - // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets - // back around to asn1map() and we don't want it decoded again. - //case 'id-qt-cps': - // return Maps\CPSuri::MAP; - case 'id-qt-unotice': - return Maps\UserNotice::MAP; - // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). - case 'id-pe-logotype': - // http://www.ietf.org/rfc/rfc3709.txt - case 'entrustVersInfo': - // http://support.microsoft.com/kb/287547 - case '1.3.6.1.4.1.311.20.2': - // szOID_ENROLL_CERTTYPE_EXTENSION - case '1.3.6.1.4.1.311.21.1': - // szOID_CERTSRV_CA_VERSION - // "SET Secure Electronic Transaction Specification" - // http://www.maithean.com/docs/set_bk3.pdf - case '2.23.42.7.0': - // id-set-hashedRootKey - // "Certificate Transparency" - // https://tools.ietf.org/html/rfc6962 - case '1.3.6.1.4.1.11129.2.4.2': - // "Qualified Certificate statements" - // https://tools.ietf.org/html/rfc3739#section-3.2.6 - case '1.3.6.1.5.5.7.1.3': - return \true; - // CSR attributes - case 'pkcs-9-at-unstructuredName': - return Maps\PKCS9String::MAP; - case 'pkcs-9-at-challengePassword': - return Maps\DirectoryString::MAP; - case 'pkcs-9-at-extensionRequest': - return Maps\Extensions::MAP; - // CRL extensions. - case 'id-ce-cRLNumber': - return Maps\CRLNumber::MAP; - case 'id-ce-deltaCRLIndicator': - return Maps\CRLNumber::MAP; - case 'id-ce-issuingDistributionPoint': - return Maps\IssuingDistributionPoint::MAP; - case 'id-ce-freshestCRL': - return Maps\CRLDistributionPoints::MAP; - case 'id-ce-cRLReasons': - return Maps\CRLReason::MAP; - case 'id-ce-invalidityDate': - return Maps\InvalidityDate::MAP; - case 'id-ce-certificateIssuer': - return Maps\CertificateIssuer::MAP; - case 'id-ce-holdInstructionCode': - return Maps\HoldInstructionCode::MAP; - case 'id-at-postalAddress': - return Maps\PostalAddress::MAP; - } - return \false; - } - /** - * Load an X.509 certificate as a certificate authority - * - * @param string $cert - * @return bool - */ - public function loadCA($cert) - { - $olddn = $this->dn; - $oldcert = $this->currentCert; - $oldsigsubj = $this->signatureSubject; - $oldkeyid = $this->currentKeyIdentifier; - $cert = $this->loadX509($cert); - if (!$cert) { - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - $this->currentKeyIdentifier = $oldkeyid; - return \false; - } - /* From RFC5280 "PKIX Certificate and CRL Profile": - - If the keyUsage extension is present, then the subject public key - MUST NOT be used to verify signatures on certificates or CRLs unless - the corresponding keyCertSign or cRLSign bit is set. */ - //$keyUsage = $this->getExtension('id-ce-keyUsage'); - //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { - // return false; - //} - /* From RFC5280 "PKIX Certificate and CRL Profile": - - The cA boolean indicates whether the certified public key may be used - to verify certificate signatures. If the cA boolean is not asserted, - then the keyCertSign bit in the key usage extension MUST NOT be - asserted. If the basic constraints extension is not present in a - version 3 certificate, or the extension is present but the cA boolean - is not asserted, then the certified public key MUST NOT be used to - verify certificate signatures. */ - //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); - //if (!$basicConstraints || !$basicConstraints['cA']) { - // return false; - //} - $this->CAs[] = $cert; - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - return \true; - } - /** - * Validate an X.509 certificate against a URL - * - * From RFC2818 "HTTP over TLS": - * - * Matching is performed using the matching rules specified by - * [RFC2459]. If more than one identity of a given type is present in - * the certificate (e.g., more than one dNSName name, a match in any one - * of the set is considered acceptable.) Names may contain the wildcard - * character * which is considered to match any single domain name - * component or component fragment. E.g., *.a.com matches foo.a.com but - * not bar.foo.a.com. f*.com matches foo.com but not bar.com. - * - * @param string $url - * @return bool - */ - public function validateURL($url) - { - if (!\is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return \false; - } - $components = \parse_url($url); - if (!isset($components['host'])) { - return \false; - } - if ($names = $this->getExtension('id-ce-subjectAltName')) { - foreach ($names as $name) { - foreach ($name as $key => $value) { - $value = \str_replace(['.', '*'], ['\\.', '[^.]*'], $value); - switch ($key) { - case 'dNSName': - /* From RFC2818 "HTTP over TLS": - - If a subjectAltName extension of type dNSName is present, that MUST - be used as the identity. Otherwise, the (most specific) Common Name - field in the Subject field of the certificate MUST be used. Although - the use of the Common Name is existing practice, it is deprecated and - Certification Authorities are encouraged to use the dNSName instead. */ - if (\preg_match('#^' . $value . '$#', $components['host'])) { - return \true; - } - break; - case 'iPAddress': - /* From RFC2818 "HTTP over TLS": - - In some cases, the URI is specified as an IP address rather than a - hostname. In this case, the iPAddress subjectAltName must be present - in the certificate and must exactly match the IP in the URI. */ - if (\preg_match('#(?:\\d{1-3}\\.){4}#', $components['host'] . '.') && \preg_match('#^' . $value . '$#', $components['host'])) { - return \true; - } - } - } - } - return \false; - } - if ($value = $this->getDNProp('id-at-commonName')) { - $value = \str_replace(['.', '*'], ['\\.', '[^.]*'], $value[0]); - return \preg_match('#^' . $value . '$#', $components['host']) === 1; - } - return \false; - } - /** - * Validate a date - * - * If $date isn't defined it is assumed to be the current date. - * - * @param \DateTimeInterface|string $date optional - * @return bool - */ - public function validateDate($date = null) - { - if (!\is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return \false; - } - if (!isset($date)) { - $date = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); - } - $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; - $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; - $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; - $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; - if (\is_string($date)) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@\date_default_timezone_get())); - } - $notBefore = new \DateTimeImmutable($notBefore, new \DateTimeZone(@\date_default_timezone_get())); - $notAfter = new \DateTimeImmutable($notAfter, new \DateTimeZone(@\date_default_timezone_get())); - return $date >= $notBefore && $date <= $notAfter; - } - /** - * Fetches a URL - * - * @param string $url - * @return bool|string - */ - private static function fetchURL($url) - { - if (self::$disable_url_fetch) { - return \false; - } - $parts = \parse_url($url); - $data = ''; - switch ($parts['scheme']) { - case 'http': - $fsock = @\fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80); - if (!$fsock) { - return \false; - } - $path = $parts['path']; - if (isset($parts['query'])) { - $path .= '?' . $parts['query']; - } - \fputs($fsock, "GET {$path} HTTP/1.0\r\n"); - \fputs($fsock, "Host: {$parts['host']}\r\n\r\n"); - $line = \fgets($fsock, 1024); - if (\strlen($line) < 3) { - return \false; - } - \preg_match('#HTTP/1.\\d (\\d{3})#', $line, $temp); - if ($temp[1] != '200') { - return \false; - } - // skip the rest of the headers in the http response - while (!\feof($fsock) && \fgets($fsock, 1024) != "\r\n") { - } - while (!\feof($fsock)) { - $temp = \fread($fsock, 1024); - if ($temp === \false) { - return \false; - } - $data .= $temp; - } - break; - } - return $data; - } - /** - * Validates an intermediate cert as identified via authority info access extension - * - * See https://tools.ietf.org/html/rfc4325 for more info - * - * @param bool $caonly - * @param int $count - * @return bool - */ - private function testForIntermediate($caonly, $count) - { - $opts = $this->getExtension('id-pe-authorityInfoAccess'); - if (!\is_array($opts)) { - return \false; - } - foreach ($opts as $opt) { - if ($opt['accessMethod'] == 'id-ad-caIssuers') { - // accessLocation is a GeneralName. GeneralName fields support stuff like email addresses, IP addresses, LDAP, - // etc, but we're only supporting URI's. URI's and LDAP are the only thing https://tools.ietf.org/html/rfc4325 - // discusses - if (isset($opt['accessLocation']['uniformResourceIdentifier'])) { - $url = $opt['accessLocation']['uniformResourceIdentifier']; - break; - } - } - } - if (!isset($url)) { - return \false; - } - $cert = static::fetchURL($url); - if (!\is_string($cert)) { - return \false; - } - $parent = new static(); - $parent->CAs = $this->CAs; - /* - "Conforming applications that support HTTP or FTP for accessing - certificates MUST be able to accept .cer files and SHOULD be able - to accept .p7c files." -- https://tools.ietf.org/html/rfc4325 - - A .p7c file is 'a "certs-only" CMS message as specified in RFC 2797" - - These are currently unsupported - */ - if (!\is_array($parent->loadX509($cert))) { - return \false; - } - if (!$parent->validateSignatureCountable($caonly, ++$count)) { - return \false; - } - $this->CAs[] = $parent->currentCert; - //$this->loadCA($cert); - return \true; - } - /** - * Validate a signature - * - * Works on X.509 certs, CSR's and CRL's. - * Returns true if the signature is verified, false if it is not correct or null on error - * - * By default returns false for self-signed certs. Call validateSignature(false) to make this support - * self-signed. - * - * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}. - * - * @param bool $caonly optional - * @return mixed - */ - public function validateSignature($caonly = \true) - { - return $this->validateSignatureCountable($caonly, 0); - } - /** - * Validate a signature - * - * Performs said validation whilst keeping track of how many times validation method is called - * - * @param bool $caonly - * @param int $count - * @return mixed - */ - private function validateSignatureCountable($caonly, $count) - { - if (!\is_array($this->currentCert) || !isset($this->signatureSubject)) { - return null; - } - if ($count == self::$recur_limit) { - return \false; - } - /* TODO: - "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 - - implement pathLenConstraint in the id-ce-basicConstraints extension */ - switch (\true) { - case isset($this->currentCert['tbsCertificate']): - // self-signed cert - switch (\true) { - case !\defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']: - case \defined('FILE_X509_IGNORE_TYPE') && $this->getIssuerDN(self::DN_STRING) === $this->getDN(self::DN_STRING): - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); - switch (\true) { - case !\is_array($authorityKey): - case !$subjectKeyID: - case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $this->currentCert; - } - } - if (!empty($this->CAs)) { - for ($i = 0; $i < \count($this->CAs); $i++) { - // even if the cert is a self-signed one we still want to see if it's a CA; - // if not, we'll conditionally return an error - $ca = $this->CAs[$i]; - switch (\true) { - case !\defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']: - case \defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertificate']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (\true) { - case !\is_array($authorityKey): - case !$subjectKeyID: - case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if (\is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { - break 2; - // serial mismatch - check other ca - } - $signingCert = $ca; - // working cert - break 3; - } - } - } - if (\count($this->CAs) == $i && $caonly) { - return $this->testForIntermediate($caonly, $count) && $this->validateSignature($caonly); - } - } elseif (!isset($signingCert) || $caonly) { - return $this->testForIntermediate($caonly, $count) && $this->validateSignature($caonly); - } - return $this->validateSignatureHelper($signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); - case isset($this->currentCert['certificationRequestInfo']): - return $this->validateSignatureHelper($this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); - case isset($this->currentCert['publicKeyAndChallenge']): - return $this->validateSignatureHelper($this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); - case isset($this->currentCert['tbsCertList']): - if (!empty($this->CAs)) { - for ($i = 0; $i < \count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - switch (\true) { - case !\defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']: - case \defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertList']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (\true) { - case !\is_array($authorityKey): - case !$subjectKeyID: - case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if (\is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { - break 2; - // serial mismatch - check other ca - } - $signingCert = $ca; - // working cert - break 3; - } - } - } - } - if (!isset($signingCert)) { - return \false; - } - return $this->validateSignatureHelper($signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); - default: - return \false; - } - } - /** - * Validates a signature - * - * Returns true if the signature is verified and false if it is not correct. - * If the algorithms are unsupposed an exception is thrown. - * - * @param string $publicKeyAlgorithm - * @param string $publicKey - * @param string $signatureAlgorithm - * @param string $signature - * @param string $signatureSubject - * @throws \phpseclib3\Exception\UnsupportedAlgorithmException if the algorithm is unsupported - * @return bool - */ - private function validateSignatureHelper($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject) - { - switch ($publicKeyAlgorithm) { - case 'id-RSASSA-PSS': - $key = RSA::loadFormat('PSS', $publicKey); - break; - case 'rsaEncryption': - $key = RSA::loadFormat('PKCS8', $publicKey); - switch ($signatureAlgorithm) { - case 'id-RSASSA-PSS': - break; - case 'md2WithRSAEncryption': - case 'md5WithRSAEncryption': - case 'sha1WithRSAEncryption': - case 'sha224WithRSAEncryption': - case 'sha256WithRSAEncryption': - case 'sha384WithRSAEncryption': - case 'sha512WithRSAEncryption': - $key = $key->withHash(\preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm))->withPadding(RSA::SIGNATURE_PKCS1); - break; - default: - throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); - } - break; - case 'id-Ed25519': - case 'id-Ed448': - $key = EC::loadFormat('PKCS8', $publicKey); - break; - case 'id-ecPublicKey': - $key = EC::loadFormat('PKCS8', $publicKey); - switch ($signatureAlgorithm) { - case 'ecdsa-with-SHA1': - case 'ecdsa-with-SHA224': - case 'ecdsa-with-SHA256': - case 'ecdsa-with-SHA384': - case 'ecdsa-with-SHA512': - $key = $key->withHash(\preg_replace('#^ecdsa-with-#', '', \strtolower($signatureAlgorithm))); - break; - default: - throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); - } - break; - case 'id-dsa': - $key = DSA::loadFormat('PKCS8', $publicKey); - switch ($signatureAlgorithm) { - case 'id-dsa-with-sha1': - case 'id-dsa-with-sha224': - case 'id-dsa-with-sha256': - $key = $key->withHash(\preg_replace('#^id-dsa-with-#', '', \strtolower($signatureAlgorithm))); - break; - default: - throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); - } - break; - default: - throw new UnsupportedAlgorithmException('Public key algorithm unsupported'); - } - return $key->verify($signatureSubject, $signature); - } - /** - * Sets the recursion limit - * - * When validating a signature it may be necessary to download intermediate certs from URI's. - * An intermediate cert that linked to itself would result in an infinite loop so to prevent - * that we set a recursion limit. A negative number means that there is no recursion limit. - * - * @param int $count - */ - public static function setRecurLimit($count) - { - self::$recur_limit = $count; - } - /** - * Prevents URIs from being automatically retrieved - * - */ - public static function disableURLFetch() - { - self::$disable_url_fetch = \true; - } - /** - * Allows URIs to be automatically retrieved - * - */ - public static function enableURLFetch() - { - self::$disable_url_fetch = \false; - } - /** - * Decodes an IP address - * - * Takes in a base64 encoded "blob" and returns a human readable IP address - * - * @param string $ip - * @return string - */ - public static function decodeIP($ip) - { - return \inet_ntop($ip); - } - /** - * Decodes an IP address in a name constraints extension - * - * Takes in a base64 encoded "blob" and returns a human readable IP address / mask - * - * @param string $ip - * @return array - */ - public static function decodeNameConstraintIP($ip) - { - $size = \strlen($ip) >> 1; - $mask = \substr($ip, $size); - $ip = \substr($ip, 0, $size); - return [\inet_ntop($ip), \inet_ntop($mask)]; - } - /** - * Encodes an IP address - * - * Takes a human readable IP address into a base64-encoded "blob" - * - * @param string|array $ip - * @return string - */ - public static function encodeIP($ip) - { - return \is_string($ip) ? \inet_pton($ip) : \inet_pton($ip[0]) . \inet_pton($ip[1]); - } - /** - * "Normalizes" a Distinguished Name property - * - * @param string $propName - * @return mixed - */ - private function translateDNProp($propName) - { - switch (\strtolower($propName)) { - case 'jurisdictionofincorporationcountryname': - case 'jurisdictioncountryname': - case 'jurisdictionc': - return 'jurisdictionOfIncorporationCountryName'; - case 'jurisdictionofincorporationstateorprovincename': - case 'jurisdictionstateorprovincename': - case 'jurisdictionst': - return 'jurisdictionOfIncorporationStateOrProvinceName'; - case 'jurisdictionlocalityname': - case 'jurisdictionl': - return 'jurisdictionLocalityName'; - case 'id-at-businesscategory': - case 'businesscategory': - return 'id-at-businessCategory'; - case 'id-at-countryname': - case 'countryname': - case 'c': - return 'id-at-countryName'; - case 'id-at-organizationname': - case 'organizationname': - case 'o': - return 'id-at-organizationName'; - case 'id-at-dnqualifier': - case 'dnqualifier': - return 'id-at-dnQualifier'; - case 'id-at-commonname': - case 'commonname': - case 'cn': - return 'id-at-commonName'; - case 'id-at-stateorprovincename': - case 'stateorprovincename': - case 'state': - case 'province': - case 'provincename': - case 'st': - return 'id-at-stateOrProvinceName'; - case 'id-at-localityname': - case 'localityname': - case 'l': - return 'id-at-localityName'; - case 'id-emailaddress': - case 'emailaddress': - return 'pkcs-9-at-emailAddress'; - case 'id-at-serialnumber': - case 'serialnumber': - return 'id-at-serialNumber'; - case 'id-at-postalcode': - case 'postalcode': - return 'id-at-postalCode'; - case 'id-at-streetaddress': - case 'streetaddress': - return 'id-at-streetAddress'; - case 'id-at-name': - case 'name': - return 'id-at-name'; - case 'id-at-givenname': - case 'givenname': - return 'id-at-givenName'; - case 'id-at-surname': - case 'surname': - case 'sn': - return 'id-at-surname'; - case 'id-at-initials': - case 'initials': - return 'id-at-initials'; - case 'id-at-generationqualifier': - case 'generationqualifier': - return 'id-at-generationQualifier'; - case 'id-at-organizationalunitname': - case 'organizationalunitname': - case 'ou': - return 'id-at-organizationalUnitName'; - case 'id-at-pseudonym': - case 'pseudonym': - return 'id-at-pseudonym'; - case 'id-at-title': - case 'title': - return 'id-at-title'; - case 'id-at-description': - case 'description': - return 'id-at-description'; - case 'id-at-role': - case 'role': - return 'id-at-role'; - case 'id-at-uniqueidentifier': - case 'uniqueidentifier': - case 'x500uniqueidentifier': - return 'id-at-uniqueIdentifier'; - case 'postaladdress': - case 'id-at-postaladdress': - return 'id-at-postalAddress'; - default: - return \false; - } - } - /** - * Set a Distinguished Name property - * - * @param string $propName - * @param mixed $propValue - * @param string $type optional - * @return bool - */ - public function setDNProp($propName, $propValue, $type = 'utf8String') - { - if (empty($this->dn)) { - $this->dn = ['rdnSequence' => []]; - } - if (($propName = $this->translateDNProp($propName)) === \false) { - return \false; - } - foreach ((array) $propValue as $v) { - if (!\is_array($v) && isset($type)) { - $v = [$type => $v]; - } - $this->dn['rdnSequence'][] = [['type' => $propName, 'value' => $v]]; - } - return \true; - } - /** - * Remove Distinguished Name properties - * - * @param string $propName - */ - public function removeDNProp($propName) - { - if (empty($this->dn)) { - return; - } - if (($propName = $this->translateDNProp($propName)) === \false) { - return; - } - $dn =& $this->dn['rdnSequence']; - $size = \count($dn); - for ($i = 0; $i < $size; $i++) { - if ($dn[$i][0]['type'] == $propName) { - unset($dn[$i]); - } - } - $dn = \array_values($dn); - // fix for https://bugs.php.net/75433 affecting PHP 7.2 - if (!isset($dn[0])) { - $dn = \array_splice($dn, 0, 0); - } - } - /** - * Get Distinguished Name properties - * - * @param string $propName - * @param array $dn optional - * @param bool $withType optional - * @return mixed - */ - public function getDNProp($propName, array $dn = null, $withType = \false) - { - if (!isset($dn)) { - $dn = $this->dn; - } - if (empty($dn)) { - return \false; - } - if (($propName = $this->translateDNProp($propName)) === \false) { - return \false; - } - $filters = []; - $filters['value'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - \phpseclib3\File\ASN1::setFilters($filters); - $this->mapOutDNs($dn, 'rdnSequence'); - $dn = $dn['rdnSequence']; - $result = []; - for ($i = 0; $i < \count($dn); $i++) { - if ($dn[$i][0]['type'] == $propName) { - $v = $dn[$i][0]['value']; - if (!$withType) { - if (\is_array($v)) { - foreach ($v as $type => $s) { - $type = \array_search($type, \phpseclib3\File\ASN1::ANY_MAP); - if ($type !== \false && \array_key_exists($type, \phpseclib3\File\ASN1::STRING_TYPE_SIZE)) { - $s = \phpseclib3\File\ASN1::convert($s, $type); - if ($s !== \false) { - $v = $s; - break; - } - } - } - if (\is_array($v)) { - $v = \array_pop($v); - // Always strip data type. - } - } elseif (\is_object($v) && $v instanceof Element) { - $map = $this->getMapping($propName); - if (!\is_bool($map)) { - $decoded = \phpseclib3\File\ASN1::decodeBER($v); - if (!$decoded) { - return \false; - } - $v = \phpseclib3\File\ASN1::asn1map($decoded[0], $map); - } - } - } - $result[] = $v; - } - } - return $result; - } - /** - * Set a Distinguished Name - * - * @param mixed $dn - * @param bool $merge optional - * @param string $type optional - * @return bool - */ - public function setDN($dn, $merge = \false, $type = 'utf8String') - { - if (!$merge) { - $this->dn = null; - } - if (\is_array($dn)) { - if (isset($dn['rdnSequence'])) { - $this->dn = $dn; - // No merge here. - return \true; - } - // handles stuff generated by openssl_x509_parse() - foreach ($dn as $prop => $value) { - if (!$this->setDNProp($prop, $value, $type)) { - return \false; - } - } - return \true; - } - // handles everything else - $results = \preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=|postalAddress=))#', $dn, -1, \PREG_SPLIT_DELIM_CAPTURE); - for ($i = 1; $i < \count($results); $i += 2) { - $prop = \trim($results[$i], ', =/'); - $value = $results[$i + 1]; - if (!$this->setDNProp($prop, $value, $type)) { - return \false; - } - } - return \true; - } - /** - * Get the Distinguished Name for a certificates subject - * - * @param mixed $format optional - * @param array $dn optional - * @return array|bool|string - */ - public function getDN($format = self::DN_ARRAY, array $dn = null) - { - if (!isset($dn)) { - $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; - } - switch ((int) $format) { - case self::DN_ARRAY: - return $dn; - case self::DN_ASN1: - $filters = []; - $filters['rdnSequence']['value'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - \phpseclib3\File\ASN1::setFilters($filters); - $this->mapOutDNs($dn, 'rdnSequence'); - return \phpseclib3\File\ASN1::encodeDER($dn, Maps\Name::MAP); - case self::DN_CANON: - // No SEQUENCE around RDNs and all string values normalized as - // trimmed lowercase UTF-8 with all spacing as one blank. - // constructed RDNs will not be canonicalized - $filters = []; - $filters['value'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - \phpseclib3\File\ASN1::setFilters($filters); - $result = ''; - $this->mapOutDNs($dn, 'rdnSequence'); - foreach ($dn['rdnSequence'] as $rdn) { - foreach ($rdn as $i => $attr) { - $attr =& $rdn[$i]; - if (\is_array($attr['value'])) { - foreach ($attr['value'] as $type => $v) { - $type = \array_search($type, \phpseclib3\File\ASN1::ANY_MAP, \true); - if ($type !== \false && \array_key_exists($type, \phpseclib3\File\ASN1::STRING_TYPE_SIZE)) { - $v = \phpseclib3\File\ASN1::convert($v, $type); - if ($v !== \false) { - $v = \preg_replace('/\\s+/', ' ', $v); - $attr['value'] = \strtolower(\trim($v)); - break; - } - } - } - } - } - $result .= \phpseclib3\File\ASN1::encodeDER($rdn, Maps\RelativeDistinguishedName::MAP); - } - return $result; - case self::DN_HASH: - $dn = $this->getDN(self::DN_CANON, $dn); - $hash = new Hash('sha1'); - $hash = $hash->hash($dn); - \extract(\unpack('Vhash', $hash)); - return \strtolower(Strings::bin2hex(\pack('N', $hash))); - } - // Default is to return a string. - $start = \true; - $output = ''; - $result = []; - $filters = []; - $filters['rdnSequence']['value'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - \phpseclib3\File\ASN1::setFilters($filters); - $this->mapOutDNs($dn, 'rdnSequence'); - foreach ($dn['rdnSequence'] as $field) { - $prop = $field[0]['type']; - $value = $field[0]['value']; - $delim = ', '; - switch ($prop) { - case 'id-at-countryName': - $desc = 'C'; - break; - case 'id-at-stateOrProvinceName': - $desc = 'ST'; - break; - case 'id-at-organizationName': - $desc = 'O'; - break; - case 'id-at-organizationalUnitName': - $desc = 'OU'; - break; - case 'id-at-commonName': - $desc = 'CN'; - break; - case 'id-at-localityName': - $desc = 'L'; - break; - case 'id-at-surname': - $desc = 'SN'; - break; - case 'id-at-uniqueIdentifier': - $delim = '/'; - $desc = 'x500UniqueIdentifier'; - break; - case 'id-at-postalAddress': - $delim = '/'; - $desc = 'postalAddress'; - break; - default: - $delim = '/'; - $desc = \preg_replace('#.+-([^-]+)$#', '$1', $prop); - } - if (!$start) { - $output .= $delim; - } - if (\is_array($value)) { - foreach ($value as $type => $v) { - $type = \array_search($type, \phpseclib3\File\ASN1::ANY_MAP, \true); - if ($type !== \false && \array_key_exists($type, \phpseclib3\File\ASN1::STRING_TYPE_SIZE)) { - $v = \phpseclib3\File\ASN1::convert($v, $type); - if ($v !== \false) { - $value = $v; - break; - } - } - } - if (\is_array($value)) { - $value = \array_pop($value); - // Always strip data type. - } - } elseif (\is_object($value) && $value instanceof Element) { - $callback = function ($x) { - return '\\x' . \bin2hex($x[0]); - }; - $value = \strtoupper(\preg_replace_callback('#[^\\x20-\\x7E]#', $callback, $value->element)); - } - $output .= $desc . '=' . $value; - $result[$desc] = isset($result[$desc]) ? \array_merge((array) $result[$desc], [$value]) : $value; - $start = \false; - } - return $format == self::DN_OPENSSL ? $result : $output; - } - /** - * Get the Distinguished Name for a certificate/crl issuer - * - * @param int $format optional - * @return mixed - */ - public function getIssuerDN($format = self::DN_ARRAY) - { - switch (\true) { - case !isset($this->currentCert) || !\is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); - case isset($this->currentCert['tbsCertList']): - return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); - } - return \false; - } - /** - * Get the Distinguished Name for a certificate/csr subject - * Alias of getDN() - * - * @param int $format optional - * @return mixed - */ - public function getSubjectDN($format = self::DN_ARRAY) - { - switch (\true) { - case !empty($this->dn): - return $this->getDN($format); - case !isset($this->currentCert) || !\is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); - } - return \false; - } - /** - * Get an individual Distinguished Name property for a certificate/crl issuer - * - * @param string $propName - * @param bool $withType optional - * @return mixed - */ - public function getIssuerDNProp($propName, $withType = \false) - { - switch (\true) { - case !isset($this->currentCert) || !\is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); - case isset($this->currentCert['tbsCertList']): - return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); - } - return \false; - } - /** - * Get an individual Distinguished Name property for a certificate/csr subject - * - * @param string $propName - * @param bool $withType optional - * @return mixed - */ - public function getSubjectDNProp($propName, $withType = \false) - { - switch (\true) { - case !empty($this->dn): - return $this->getDNProp($propName, null, $withType); - case !isset($this->currentCert) || !\is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); - } - return \false; - } - /** - * Get the certificate chain for the current cert - * - * @return mixed - */ - public function getChain() - { - $chain = [$this->currentCert]; - if (!\is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return \false; - } - while (\true) { - $currentCert = $chain[\count($chain) - 1]; - for ($i = 0; $i < \count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (\true) { - case !\is_array($authorityKey): - case \is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if ($currentCert === $ca) { - break 3; - } - $chain[] = $ca; - break 2; - } - } - } - if ($i == \count($this->CAs)) { - break; - } - } - foreach ($chain as $key => $value) { - $chain[$key] = new \phpseclib3\File\X509(); - $chain[$key]->loadX509($value); - } - return $chain; - } - /** - * Returns the current cert - * - * @return array|bool - */ - public function &getCurrentCert() - { - return $this->currentCert; - } - /** - * Set public key - * - * Key needs to be a \phpseclib3\Crypt\RSA object - * - * @param PublicKey $key - * @return void - */ - public function setPublicKey(PublicKey $key) - { - $this->publicKey = $key; - } - /** - * Set private key - * - * Key needs to be a \phpseclib3\Crypt\RSA object - * - * @param PrivateKey $key - */ - public function setPrivateKey(PrivateKey $key) - { - $this->privateKey = $key; - } - /** - * Set challenge - * - * Used for SPKAC CSR's - * - * @param string $challenge - */ - public function setChallenge($challenge) - { - $this->challenge = $challenge; - } - /** - * Gets the public key - * - * Returns a \phpseclib3\Crypt\RSA object or a false. - * - * @return mixed - */ - public function getPublicKey() - { - if (isset($this->publicKey)) { - return $this->publicKey; - } - if (isset($this->currentCert) && \is_array($this->currentCert)) { - $paths = ['tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo', 'publicKeyAndChallenge/spki']; - foreach ($paths as $path) { - $keyinfo = $this->subArray($this->currentCert, $path); - if (!empty($keyinfo)) { - break; - } - } - } - if (empty($keyinfo)) { - return \false; - } - $key = $keyinfo['subjectPublicKey']; - switch ($keyinfo['algorithm']['algorithm']) { - case 'id-RSASSA-PSS': - return RSA::loadFormat('PSS', $key); - case 'rsaEncryption': - return RSA::loadFormat('PKCS8', $key)->withPadding(RSA::SIGNATURE_PKCS1); - case 'id-ecPublicKey': - case 'id-Ed25519': - case 'id-Ed448': - return EC::loadFormat('PKCS8', $key); - case 'id-dsa': - return DSA::loadFormat('PKCS8', $key); - } - return \false; - } - /** - * Load a Certificate Signing Request - * - * @param string $csr - * @param int $mode - * @return mixed - */ - public function loadCSR($csr, $mode = self::FORMAT_AUTO_DETECT) - { - if (\is_array($csr) && isset($csr['certificationRequestInfo'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->dn = $csr['certificationRequestInfo']['subject']; - if (!isset($this->dn)) { - return \false; - } - $this->currentCert = $csr; - return $csr; - } - // see http://tools.ietf.org/html/rfc2986 - if ($mode != self::FORMAT_DER) { - $newcsr = \phpseclib3\File\ASN1::extractBER($csr); - if ($mode == self::FORMAT_PEM && $csr == $newcsr) { - return \false; - } - $csr = $newcsr; - } - $orig = $csr; - if ($csr === \false) { - $this->currentCert = \false; - return \false; - } - $decoded = \phpseclib3\File\ASN1::decodeBER($csr); - if (!$decoded) { - $this->currentCert = \false; - return \false; - } - $csr = \phpseclib3\File\ASN1::asn1map($decoded[0], Maps\CertificationRequest::MAP); - if (!isset($csr) || $csr === \false) { - $this->currentCert = \false; - return \false; - } - $this->mapInAttributes($csr, 'certificationRequestInfo/attributes'); - $this->mapInDNs($csr, 'certificationRequestInfo/subject/rdnSequence'); - $this->dn = $csr['certificationRequestInfo']['subject']; - $this->signatureSubject = \substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - $key = $csr['certificationRequestInfo']['subjectPKInfo']; - $key = \phpseclib3\File\ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($key), 64) . "-----END PUBLIC KEY-----"; - $this->currentKeyIdentifier = null; - $this->currentCert = $csr; - $this->publicKey = null; - $this->publicKey = $this->getPublicKey(); - return $csr; - } - /** - * Save CSR request - * - * @param array $csr - * @param int $format optional - * @return string - */ - public function saveCSR(array $csr, $format = self::FORMAT_PEM) - { - if (!\is_array($csr) || !isset($csr['certificationRequestInfo'])) { - return \false; - } - switch (\true) { - case !($algorithm = $this->subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): - case \is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): - break; - default: - $csr['certificationRequestInfo']['subjectPKInfo'] = new Element(\base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']))); - } - $filters = []; - $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - \phpseclib3\File\ASN1::setFilters($filters); - $this->mapOutDNs($csr, 'certificationRequestInfo/subject/rdnSequence'); - $this->mapOutAttributes($csr, 'certificationRequestInfo/attributes'); - $csr = \phpseclib3\File\ASN1::encodeDER($csr, Maps\CertificationRequest::MAP); - switch ($format) { - case self::FORMAT_DER: - return $csr; - // case self::FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . \chunk_split(Strings::base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; - } - } - /** - * Load a SPKAC CSR - * - * SPKAC's are produced by the HTML5 keygen element: - * - * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen - * - * @param string $spkac - * @return mixed - */ - public function loadSPKAC($spkac) - { - if (\is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->currentCert = $spkac; - return $spkac; - } - // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge - // OpenSSL produces SPKAC's that are preceded by the string SPKAC= - $temp = \preg_replace('#(?:SPKAC=)|[ \\r\\n\\\\]#', '', $spkac); - $temp = \preg_match('#^[a-zA-Z\\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : \false; - if ($temp != \false) { - $spkac = $temp; - } - $orig = $spkac; - if ($spkac === \false) { - $this->currentCert = \false; - return \false; - } - $decoded = \phpseclib3\File\ASN1::decodeBER($spkac); - if (!$decoded) { - $this->currentCert = \false; - return \false; - } - $spkac = \phpseclib3\File\ASN1::asn1map($decoded[0], Maps\SignedPublicKeyAndChallenge::MAP); - if (!isset($spkac) || !\is_array($spkac)) { - $this->currentCert = \false; - return \false; - } - $this->signatureSubject = \substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - $key = $spkac['publicKeyAndChallenge']['spki']; - $key = \phpseclib3\File\ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($key), 64) . "-----END PUBLIC KEY-----"; - $this->currentKeyIdentifier = null; - $this->currentCert = $spkac; - $this->publicKey = null; - $this->publicKey = $this->getPublicKey(); - return $spkac; - } - /** - * Save a SPKAC CSR request - * - * @param array $spkac - * @param int $format optional - * @return string - */ - public function saveSPKAC(array $spkac, $format = self::FORMAT_PEM) - { - if (!\is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { - return \false; - } - $algorithm = $this->subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); - switch (\true) { - case !$algorithm: - case \is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']): - break; - default: - $spkac['publicKeyAndChallenge']['spki'] = new Element(\base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']))); - } - $spkac = \phpseclib3\File\ASN1::encodeDER($spkac, Maps\SignedPublicKeyAndChallenge::MAP); - switch ($format) { - case self::FORMAT_DER: - return $spkac; - // case self::FORMAT_PEM: - default: - // OpenSSL's implementation of SPKAC requires the SPKAC be preceded by SPKAC= and since there are pretty much - // no other SPKAC decoders phpseclib will use that same format - return 'SPKAC=' . Strings::base64_encode($spkac); - } - } - /** - * Load a Certificate Revocation List - * - * @param string $crl - * @param int $mode - * @return mixed - */ - public function loadCRL($crl, $mode = self::FORMAT_AUTO_DETECT) - { - if (\is_array($crl) && isset($crl['tbsCertList'])) { - $this->currentCert = $crl; - unset($this->signatureSubject); - return $crl; - } - if ($mode != self::FORMAT_DER) { - $newcrl = \phpseclib3\File\ASN1::extractBER($crl); - if ($mode == self::FORMAT_PEM && $crl == $newcrl) { - return \false; - } - $crl = $newcrl; - } - $orig = $crl; - if ($crl === \false) { - $this->currentCert = \false; - return \false; - } - $decoded = \phpseclib3\File\ASN1::decodeBER($crl); - if (!$decoded) { - $this->currentCert = \false; - return \false; - } - $crl = \phpseclib3\File\ASN1::asn1map($decoded[0], Maps\CertificateList::MAP); - if (!isset($crl) || $crl === \false) { - $this->currentCert = \false; - return \false; - } - $this->signatureSubject = \substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - $this->mapInDNs($crl, 'tbsCertList/issuer/rdnSequence'); - if ($this->isSubArrayValid($crl, 'tbsCertList/crlExtensions')) { - $this->mapInExtensions($crl, 'tbsCertList/crlExtensions'); - } - if ($this->isSubArrayValid($crl, 'tbsCertList/revokedCertificates')) { - $rclist_ref =& $this->subArrayUnchecked($crl, 'tbsCertList/revokedCertificates'); - if ($rclist_ref) { - $rclist = $crl['tbsCertList']['revokedCertificates']; - foreach ($rclist as $i => $extension) { - if ($this->isSubArrayValid($rclist, "{$i}/crlEntryExtensions")) { - $this->mapInExtensions($rclist_ref, "{$i}/crlEntryExtensions"); - } - } - } - } - $this->currentKeyIdentifier = null; - $this->currentCert = $crl; - return $crl; - } - /** - * Save Certificate Revocation List. - * - * @param array $crl - * @param int $format optional - * @return string - */ - public function saveCRL(array $crl, $format = self::FORMAT_PEM) - { - if (!\is_array($crl) || !isset($crl['tbsCertList'])) { - return \false; - } - $filters = []; - $filters['tbsCertList']['issuer']['rdnSequence']['value'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - $filters['tbsCertList']['signature']['parameters'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - $filters['signatureAlgorithm']['parameters'] = ['type' => \phpseclib3\File\ASN1::TYPE_UTF8_STRING]; - if (empty($crl['tbsCertList']['signature']['parameters'])) { - $filters['tbsCertList']['signature']['parameters'] = ['type' => \phpseclib3\File\ASN1::TYPE_NULL]; - } - if (empty($crl['signatureAlgorithm']['parameters'])) { - $filters['signatureAlgorithm']['parameters'] = ['type' => \phpseclib3\File\ASN1::TYPE_NULL]; - } - \phpseclib3\File\ASN1::setFilters($filters); - $this->mapOutDNs($crl, 'tbsCertList/issuer/rdnSequence'); - $this->mapOutExtensions($crl, 'tbsCertList/crlExtensions'); - $rclist =& $this->subArray($crl, 'tbsCertList/revokedCertificates'); - if (\is_array($rclist)) { - foreach ($rclist as $i => $extension) { - $this->mapOutExtensions($rclist, "{$i}/crlEntryExtensions"); - } - } - $crl = \phpseclib3\File\ASN1::encodeDER($crl, Maps\CertificateList::MAP); - switch ($format) { - case self::FORMAT_DER: - return $crl; - // case self::FORMAT_PEM: - default: - return "-----BEGIN X509 CRL-----\r\n" . \chunk_split(Strings::base64_encode($crl), 64) . '-----END X509 CRL-----'; - } - } - /** - * Helper function to build a time field according to RFC 3280 section - * - 4.1.2.5 Validity - * - 5.1.2.4 This Update - * - 5.1.2.5 Next Update - * - 5.1.2.6 Revoked Certificates - * by choosing utcTime iff year of date given is before 2050 and generalTime else. - * - * @param string $date in format date('D, d M Y H:i:s O') - * @return array|Element - */ - private function timeField($date) - { - if ($date instanceof Element) { - return $date; - } - $dateObj = new \DateTimeImmutable($date, new \DateTimeZone('GMT')); - $year = $dateObj->format('Y'); - // the same way ASN1.php parses this - if ($year < 2050) { - return ['utcTime' => $date]; - } else { - return ['generalTime' => $date]; - } - } - /** - * Sign an X.509 certificate - * - * $issuer's private key needs to be loaded. - * $subject can be either an existing X.509 cert (if you want to resign it), - * a CSR or something with the DN and public key explicitly set. - * - * @return mixed - */ - public function sign(\phpseclib3\File\X509 $issuer, \phpseclib3\File\X509 $subject) - { - if (!\is_object($issuer->privateKey) || empty($issuer->dn)) { - return \false; - } - if (isset($subject->publicKey) && !($subjectPublicKey = $subject->formatSubjectPublicKey())) { - return \false; - } - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($issuer->privateKey); - if (isset($subject->currentCert) && \is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { - $this->currentCert = $subject->currentCert; - $this->currentCert['tbsCertificate']['signature'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - if (!empty($this->startDate)) { - $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->timeField($this->startDate); - } - if (!empty($this->endDate)) { - $this->currentCert['tbsCertificate']['validity']['notAfter'] = $this->timeField($this->endDate); - } - if (!empty($this->serialNumber)) { - $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber; - } - if (!empty($subject->dn)) { - $this->currentCert['tbsCertificate']['subject'] = $subject->dn; - } - if (!empty($subject->publicKey)) { - $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey; - } - $this->removeExtension('id-ce-authorityKeyIdentifier'); - if (isset($subject->domains)) { - $this->removeExtension('id-ce-subjectAltName'); - } - } elseif (isset($subject->currentCert) && \is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { - return \false; - } else { - if (!isset($subject->publicKey)) { - return \false; - } - $startDate = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); - $startDate = !empty($this->startDate) ? $this->startDate : $startDate->format('D, d M Y H:i:s O'); - $endDate = new \DateTimeImmutable('+1 year', new \DateTimeZone(@\date_default_timezone_get())); - $endDate = !empty($this->endDate) ? $this->endDate : $endDate->format('D, d M Y H:i:s O'); - /* "The serial number MUST be a positive integer" - "Conforming CAs MUST NOT use serialNumber values longer than 20 octets." - -- https://tools.ietf.org/html/rfc5280#section-4.1.2.2 - - for the integer to be positive the leading bit needs to be 0 hence the - application of a bitmap - */ - $serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new BigInteger(Random::string(20) & "" . \str_repeat("\xff", 19), 256); - $this->currentCert = ['tbsCertificate' => [ - 'version' => 'v3', - 'serialNumber' => $serialNumber, - // $this->setSerialNumber() - 'signature' => $signatureAlgorithm, - 'issuer' => \false, - // this is going to be overwritten later - 'validity' => [ - 'notBefore' => $this->timeField($startDate), - // $this->setStartDate() - 'notAfter' => $this->timeField($endDate), - ], - 'subject' => $subject->dn, - 'subjectPublicKeyInfo' => $subjectPublicKey, - ], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; - // Copy extensions from CSR. - $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); - if (!empty($csrexts)) { - $this->currentCert['tbsCertificate']['extensions'] = $csrexts; - } - } - $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', [ - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier, - ]); - //$extensions = &$this->currentCert['tbsCertificate']['extensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - if (isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); - } - $altName = []; - if (isset($subject->domains) && \count($subject->domains)) { - $altName = \array_map(['\\phpseclib3\\File\\X509', 'dnsName'], $subject->domains); - } - if (isset($subject->ipAddresses) && \count($subject->ipAddresses)) { - // should an IP address appear as the CN if no domain name is specified? idk - //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); - $ipAddresses = []; - foreach ($subject->ipAddresses as $ipAddress) { - $encoded = $subject->ipAddress($ipAddress); - if ($encoded !== \false) { - $ipAddresses[] = $encoded; - } - } - if (\count($ipAddresses)) { - $altName = \array_merge($altName, $ipAddresses); - } - } - if (!empty($altName)) { - $this->setExtension('id-ce-subjectAltName', $altName); - } - if ($this->caFlag) { - $keyUsage = $this->getExtension('id-ce-keyUsage'); - if (!$keyUsage) { - $keyUsage = []; - } - $this->setExtension('id-ce-keyUsage', \array_values(\array_unique(\array_merge($keyUsage, ['cRLSign', 'keyCertSign'])))); - $basicConstraints = $this->getExtension('id-ce-basicConstraints'); - if (!$basicConstraints) { - $basicConstraints = []; - } - $this->setExtension('id-ce-basicConstraints', \array_merge(['cA' => \true], $basicConstraints), \true); - if (!isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $this->computeKeyIdentifier($this->currentCert), \false, \false); - } - } - // resync $this->signatureSubject - // save $tbsCertificate in case there are any \phpseclib3\File\ASN1\Element objects in it - $tbsCertificate = $this->currentCert['tbsCertificate']; - $this->loadX509($this->saveX509($this->currentCert)); - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $issuer->privateKey->sign($this->signatureSubject); - $result['tbsCertificate'] = $tbsCertificate; - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - return $result; - } - /** - * Sign a CSR - * - * @return mixed - */ - public function signCSR() - { - if (!\is_object($this->privateKey) || empty($this->dn)) { - return \false; - } - $origPublicKey = $this->publicKey; - $this->publicKey = $this->privateKey->getPublicKey(); - $publicKey = $this->formatSubjectPublicKey(); - $this->publicKey = $origPublicKey; - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($this->privateKey); - if (isset($this->currentCert) && \is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - if (!empty($this->dn)) { - $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; - } - $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; - } else { - $this->currentCert = ['certificationRequestInfo' => ['version' => 'v1', 'subject' => $this->dn, 'subjectPKInfo' => $publicKey], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; - } - // resync $this->signatureSubject - // save $certificationRequestInfo in case there are any \phpseclib3\File\ASN1\Element objects in it - $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; - $this->loadCSR($this->saveCSR($this->currentCert)); - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $this->privateKey->sign($this->signatureSubject); - $result['certificationRequestInfo'] = $certificationRequestInfo; - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - return $result; - } - /** - * Sign a SPKAC - * - * @return mixed - */ - public function signSPKAC() - { - if (!\is_object($this->privateKey)) { - return \false; - } - $origPublicKey = $this->publicKey; - $this->publicKey = $this->privateKey->getPublicKey(); - $publicKey = $this->formatSubjectPublicKey(); - $this->publicKey = $origPublicKey; - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($this->privateKey); - // re-signing a SPKAC seems silly but since everything else supports re-signing why not? - if (isset($this->currentCert) && \is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; - if (!empty($this->challenge)) { - // the bitwise AND ensures that the output is a valid IA5String - $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & \str_repeat("", \strlen($this->challenge)); - } - } else { - $this->currentCert = ['publicKeyAndChallenge' => [ - 'spki' => $publicKey, - // quoting , - // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." - // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way - // we could alternatively do this instead if we ignored the specs: - // Random::string(8) & str_repeat("\x7F", 8) - 'challenge' => !empty($this->challenge) ? $this->challenge : '', - ], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; - } - // resync $this->signatureSubject - // save $publicKeyAndChallenge in case there are any \phpseclib3\File\ASN1\Element objects in it - $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; - $this->loadSPKAC($this->saveSPKAC($this->currentCert)); - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $this->privateKey->sign($this->signatureSubject); - $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - return $result; - } - /** - * Sign a CRL - * - * $issuer's private key needs to be loaded. - * - * @return mixed - */ - public function signCRL(\phpseclib3\File\X509 $issuer, \phpseclib3\File\X509 $crl) - { - if (!\is_object($issuer->privateKey) || empty($issuer->dn)) { - return \false; - } - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($issuer->privateKey); - $thisUpdate = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); - $thisUpdate = !empty($this->startDate) ? $this->startDate : $thisUpdate->format('D, d M Y H:i:s O'); - if (isset($crl->currentCert) && \is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { - $this->currentCert = $crl->currentCert; - $this->currentCert['tbsCertList']['signature'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - } else { - $this->currentCert = ['tbsCertList' => [ - 'version' => 'v2', - 'signature' => $signatureAlgorithm, - 'issuer' => \false, - // this is going to be overwritten later - 'thisUpdate' => $this->timeField($thisUpdate), - ], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; - } - $tbsCertList =& $this->currentCert['tbsCertList']; - $tbsCertList['issuer'] = $issuer->dn; - $tbsCertList['thisUpdate'] = $this->timeField($thisUpdate); - if (!empty($this->endDate)) { - $tbsCertList['nextUpdate'] = $this->timeField($this->endDate); - // $this->setEndDate() - } else { - unset($tbsCertList['nextUpdate']); - } - if (!empty($this->serialNumber)) { - $crlNumber = $this->serialNumber; - } else { - $crlNumber = $this->getExtension('id-ce-cRLNumber'); - // "The CRL number is a non-critical CRL extension that conveys a - // monotonically increasing sequence number for a given CRL scope and - // CRL issuer. This extension allows users to easily determine when a - // particular CRL supersedes another CRL." - // -- https://tools.ietf.org/html/rfc5280#section-5.2.3 - $crlNumber = $crlNumber !== \false ? $crlNumber->add(new BigInteger(1)) : null; - } - $this->removeExtension('id-ce-authorityKeyIdentifier'); - $this->removeExtension('id-ce-issuerAltName'); - // Be sure version >= v2 if some extension found. - $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; - if (!$version) { - if (!empty($tbsCertList['crlExtensions'])) { - $version = 1; - // v2. - } elseif (!empty($tbsCertList['revokedCertificates'])) { - foreach ($tbsCertList['revokedCertificates'] as $cert) { - if (!empty($cert['crlEntryExtensions'])) { - $version = 1; - // v2. - } - } - } - if ($version) { - $tbsCertList['version'] = $version; - } - } - // Store additional extensions. - if (!empty($tbsCertList['version'])) { - // At least v2. - if (!empty($crlNumber)) { - $this->setExtension('id-ce-cRLNumber', $crlNumber); - } - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', [ - //'authorityCertIssuer' => array( - // ] - // 'directoryName' => $issuer->dn - // ] - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier, - ]); - //$extensions = &$tbsCertList['crlExtensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); - if ($issuerAltName !== \false) { - $this->setExtension('id-ce-issuerAltName', $issuerAltName); - } - } - if (empty($tbsCertList['revokedCertificates'])) { - unset($tbsCertList['revokedCertificates']); - } - unset($tbsCertList); - // resync $this->signatureSubject - // save $tbsCertList in case there are any \phpseclib3\File\ASN1\Element objects in it - $tbsCertList = $this->currentCert['tbsCertList']; - $this->loadCRL($this->saveCRL($this->currentCert)); - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $issuer->privateKey->sign($this->signatureSubject); - $result['tbsCertList'] = $tbsCertList; - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - return $result; - } - /** - * Identify signature algorithm from key settings - * - * @param PrivateKey $key - * @throws \phpseclib3\Exception\UnsupportedAlgorithmException if the algorithm is unsupported - * @return array - */ - private static function identifySignatureAlgorithm(PrivateKey $key) - { - if ($key instanceof RSA) { - if ($key->getPadding() & RSA::SIGNATURE_PSS) { - $r = PSS::load($key->withPassword()->toString('PSS')); - return ['algorithm' => 'id-RSASSA-PSS', 'parameters' => PSS::savePSSParams($r)]; - } - switch ($key->getHash()) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha224': - case 'sha256': - case 'sha384': - case 'sha512': - return ['algorithm' => $key->getHash() . 'WithRSAEncryption']; - } - throw new UnsupportedAlgorithmException('The only supported hash algorithms for RSA are: md2, md5, sha1, sha224, sha256, sha384, sha512'); - } - if ($key instanceof DSA) { - switch ($key->getHash()) { - case 'sha1': - case 'sha224': - case 'sha256': - return ['algorithm' => 'id-dsa-with-' . $key->getHash()]; - } - throw new UnsupportedAlgorithmException('The only supported hash algorithms for DSA are: sha1, sha224, sha256'); - } - if ($key instanceof EC) { - switch ($key->getCurve()) { - case 'Ed25519': - case 'Ed448': - return ['algorithm' => 'id-' . $key->getCurve()]; - } - switch ($key->getHash()) { - case 'sha1': - case 'sha224': - case 'sha256': - case 'sha384': - case 'sha512': - return ['algorithm' => 'ecdsa-with-' . \strtoupper($key->getHash())]; - } - throw new UnsupportedAlgorithmException('The only supported hash algorithms for EC are: sha1, sha224, sha256, sha384, sha512'); - } - throw new UnsupportedAlgorithmException('The only supported public key classes are: RSA, DSA, EC'); - } - /** - * Set certificate start date - * - * @param \DateTimeInterface|string $date - */ - public function setStartDate($date) - { - if (!\is_object($date) || !$date instanceof \DateTimeInterface) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@\date_default_timezone_get())); - } - $this->startDate = $date->format('D, d M Y H:i:s O'); - } - /** - * Set certificate end date - * - * @param \DateTimeInterface|string $date - */ - public function setEndDate($date) - { - /* - To indicate that a certificate has no well-defined expiration date, - the notAfter SHOULD be assigned the GeneralizedTime value of - 99991231235959Z. - - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 - */ - if (\is_string($date) && \strtolower($date) === 'lifetime') { - $temp = '99991231235959Z'; - $temp = \chr(\phpseclib3\File\ASN1::TYPE_GENERALIZED_TIME) . \phpseclib3\File\ASN1::encodeLength(\strlen($temp)) . $temp; - $this->endDate = new Element($temp); - } else { - if (!\is_object($date) || !$date instanceof \DateTimeInterface) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@\date_default_timezone_get())); - } - $this->endDate = $date->format('D, d M Y H:i:s O'); - } - } - /** - * Set Serial Number - * - * @param string $serial - * @param int $base optional - */ - public function setSerialNumber($serial, $base = -256) - { - $this->serialNumber = new BigInteger($serial, $base); - } - /** - * Turns the certificate into a certificate authority - * - */ - public function makeCA() - { - $this->caFlag = \true; - } - /** - * Check for validity of subarray - * - * This is intended for use in conjunction with _subArrayUnchecked(), - * implementing the checks included in _subArray() but without copying - * a potentially large array by passing its reference by-value to is_array(). - * - * @param array $root - * @param string $path - * @return boolean - */ - private function isSubArrayValid(array $root, $path) - { - if (!\is_array($root)) { - return \false; - } - foreach (\explode('/', $path) as $i) { - if (!\is_array($root)) { - return \false; - } - if (!isset($root[$i])) { - return \true; - } - $root = $root[$i]; - } - return \true; - } - /** - * Get a reference to a subarray - * - * This variant of _subArray() does no is_array() checking, - * so $root should be checked with _isSubArrayValid() first. - * - * This is here for performance reasons: - * Passing a reference (i.e. $root) by-value (i.e. to is_array()) - * creates a copy. If $root is an especially large array, this is expensive. - * - * @param array $root - * @param string $path absolute path with / as component separator - * @param bool $create optional - * @return array|false - */ - private function &subArrayUnchecked(array &$root, $path, $create = \false) - { - $false = \false; - foreach (\explode('/', $path) as $i) { - if (!isset($root[$i])) { - if (!$create) { - return $false; - } - $root[$i] = []; - } - $root =& $root[$i]; - } - return $root; - } - /** - * Get a reference to a subarray - * - * @param array $root - * @param string $path absolute path with / as component separator - * @param bool $create optional - * @return array|false - */ - private function &subArray(array &$root = null, $path, $create = \false) - { - $false = \false; - if (!\is_array($root)) { - return $false; - } - foreach (\explode('/', $path) as $i) { - if (!\is_array($root)) { - return $false; - } - if (!isset($root[$i])) { - if (!$create) { - return $false; - } - $root[$i] = []; - } - $root =& $root[$i]; - } - return $root; - } - /** - * Get a reference to an extension subarray - * - * @param array $root - * @param string $path optional absolute path with / as component separator - * @param bool $create optional - * @return array|false - */ - private function &extensions(array &$root = null, $path = null, $create = \false) - { - if (!isset($root)) { - $root = $this->currentCert; - } - switch (\true) { - case !empty($path): - case !\is_array($root): - break; - case isset($root['tbsCertificate']): - $path = 'tbsCertificate/extensions'; - break; - case isset($root['tbsCertList']): - $path = 'tbsCertList/crlExtensions'; - break; - case isset($root['certificationRequestInfo']): - $pth = 'certificationRequestInfo/attributes'; - $attributes =& $this->subArray($root, $pth, $create); - if (\is_array($attributes)) { - foreach ($attributes as $key => $value) { - if ($value['type'] == 'pkcs-9-at-extensionRequest') { - $path = "{$pth}/{$key}/value/0"; - break 2; - } - } - if ($create) { - $key = \count($attributes); - $attributes[] = ['type' => 'pkcs-9-at-extensionRequest', 'value' => []]; - $path = "{$pth}/{$key}/value/0"; - } - } - break; - } - $extensions =& $this->subArray($root, $path, $create); - if (!\is_array($extensions)) { - $false = \false; - return $false; - } - return $extensions; - } - /** - * Remove an Extension - * - * @param string $id - * @param string $path optional - * @return bool - */ - private function removeExtensionHelper($id, $path = null) - { - $extensions =& $this->extensions($this->currentCert, $path); - if (!\is_array($extensions)) { - return \false; - } - $result = \false; - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - unset($extensions[$key]); - $result = \true; - } - } - $extensions = \array_values($extensions); - // fix for https://bugs.php.net/75433 affecting PHP 7.2 - if (!isset($extensions[0])) { - $extensions = \array_splice($extensions, 0, 0); - } - return $result; - } - /** - * Get an Extension - * - * Returns the extension if it exists and false if not - * - * @param string $id - * @param array $cert optional - * @param string $path optional - * @return mixed - */ - private function getExtensionHelper($id, array $cert = null, $path = null) - { - $extensions = $this->extensions($cert, $path); - if (!\is_array($extensions)) { - return \false; - } - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - return $value['extnValue']; - } - } - return \false; - } - /** - * Returns a list of all extensions in use - * - * @param array $cert optional - * @param string $path optional - * @return array - */ - private function getExtensionsHelper(array $cert = null, $path = null) - { - $exts = $this->extensions($cert, $path); - $extensions = []; - if (\is_array($exts)) { - foreach ($exts as $extension) { - $extensions[] = $extension['extnId']; - } - } - return $extensions; - } - /** - * Set an Extension - * - * @param string $id - * @param mixed $value - * @param bool $critical optional - * @param bool $replace optional - * @param string $path optional - * @return bool - */ - private function setExtensionHelper($id, $value, $critical = \false, $replace = \true, $path = null) - { - $extensions =& $this->extensions($this->currentCert, $path, \true); - if (!\is_array($extensions)) { - return \false; - } - $newext = ['extnId' => $id, 'critical' => $critical, 'extnValue' => $value]; - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - if (!$replace) { - return \false; - } - $extensions[$key] = $newext; - return \true; - } - } - $extensions[] = $newext; - return \true; - } - /** - * Remove a certificate, CSR or CRL Extension - * - * @param string $id - * @return bool - */ - public function removeExtension($id) - { - return $this->removeExtensionHelper($id); - } - /** - * Get a certificate, CSR or CRL Extension - * - * Returns the extension if it exists and false if not - * - * @param string $id - * @param array $cert optional - * @param string $path - * @return mixed - */ - public function getExtension($id, array $cert = null, $path = null) - { - return $this->getExtensionHelper($id, $cert, $path); - } - /** - * Returns a list of all extensions in use in certificate, CSR or CRL - * - * @param array $cert optional - * @param string $path optional - * @return array - */ - public function getExtensions(array $cert = null, $path = null) - { - return $this->getExtensionsHelper($cert, $path); - } - /** - * Set a certificate, CSR or CRL Extension - * - * @param string $id - * @param mixed $value - * @param bool $critical optional - * @param bool $replace optional - * @return bool - */ - public function setExtension($id, $value, $critical = \false, $replace = \true) - { - return $this->setExtensionHelper($id, $value, $critical, $replace); - } - /** - * Remove a CSR attribute. - * - * @param string $id - * @param int $disposition optional - * @return bool - */ - public function removeAttribute($id, $disposition = self::ATTR_ALL) - { - $attributes =& $this->subArray($this->currentCert, 'certificationRequestInfo/attributes'); - if (!\is_array($attributes)) { - return \false; - } - $result = \false; - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = \count($attribute['value']); - switch (\true) { - case $disposition == self::ATTR_APPEND: - case $disposition == self::ATTR_REPLACE: - return \false; - case $disposition >= $n: - $disposition -= $n; - break; - case $disposition == self::ATTR_ALL: - case $n == 1: - unset($attributes[$key]); - $result = \true; - break; - default: - unset($attributes[$key]['value'][$disposition]); - $attributes[$key]['value'] = \array_values($attributes[$key]['value']); - $result = \true; - break; - } - if ($result && $disposition != self::ATTR_ALL) { - break; - } - } - } - $attributes = \array_values($attributes); - return $result; - } - /** - * Get a CSR attribute - * - * Returns the attribute if it exists and false if not - * - * @param string $id - * @param int $disposition optional - * @param array $csr optional - * @return mixed - */ - public function getAttribute($id, $disposition = self::ATTR_ALL, array $csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - $attributes = $this->subArray($csr, 'certificationRequestInfo/attributes'); - if (!\is_array($attributes)) { - return \false; - } - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = \count($attribute['value']); - switch (\true) { - case $disposition == self::ATTR_APPEND: - case $disposition == self::ATTR_REPLACE: - return \false; - case $disposition == self::ATTR_ALL: - return $attribute['value']; - case $disposition >= $n: - $disposition -= $n; - break; - default: - return $attribute['value'][$disposition]; - } - } - } - return \false; - } - /** - * Returns a list of all CSR attributes in use - * - * @param array $csr optional - * @return array - */ - public function getAttributes(array $csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - $attributes = $this->subArray($csr, 'certificationRequestInfo/attributes'); - $attrs = []; - if (\is_array($attributes)) { - foreach ($attributes as $attribute) { - $attrs[] = $attribute['type']; - } - } - return $attrs; - } - /** - * Set a CSR attribute - * - * @param string $id - * @param mixed $value - * @param int $disposition optional - * @return bool - */ - public function setAttribute($id, $value, $disposition = self::ATTR_ALL) - { - $attributes =& $this->subArray($this->currentCert, 'certificationRequestInfo/attributes', \true); - if (!\is_array($attributes)) { - return \false; - } - switch ($disposition) { - case self::ATTR_REPLACE: - $disposition = self::ATTR_APPEND; - // fall-through - case self::ATTR_ALL: - $this->removeAttribute($id); - break; - } - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = \count($attribute['value']); - switch (\true) { - case $disposition == self::ATTR_APPEND: - $last = $key; - break; - case $disposition >= $n: - $disposition -= $n; - break; - default: - $attributes[$key]['value'][$disposition] = $value; - return \true; - } - } - } - switch (\true) { - case $disposition >= 0: - return \false; - case isset($last): - $attributes[$last]['value'][] = $value; - break; - default: - $attributes[] = ['type' => $id, 'value' => $disposition == self::ATTR_ALL ? $value : [$value]]; - break; - } - return \true; - } - /** - * Sets the subject key identifier - * - * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions. - * - * @param string $value - */ - public function setKeyIdentifier($value) - { - if (empty($value)) { - unset($this->currentKeyIdentifier); - } else { - $this->currentKeyIdentifier = $value; - } - } - /** - * Compute a public key identifier. - * - * Although key identifiers may be set to any unique value, this function - * computes key identifiers from public key according to the two - * recommended methods (4.2.1.2 RFC 3280). - * Highly polymorphic: try to accept all possible forms of key: - * - Key object - * - \phpseclib3\File\X509 object with public or private key defined - * - Certificate or CSR array - * - \phpseclib3\File\ASN1\Element object - * - PEM or DER string - * - * @param mixed $key optional - * @param int $method optional - * @return string binary key identifier - */ - public function computeKeyIdentifier($key = null, $method = 1) - { - if (\is_null($key)) { - $key = $this; - } - switch (\true) { - case \is_string($key): - break; - case \is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); - case \is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); - case !\is_object($key): - return \false; - case $key instanceof Element: - // Assume the element is a bitstring-packed key. - $decoded = \phpseclib3\File\ASN1::decodeBER($key->element); - if (!$decoded) { - return \false; - } - $raw = \phpseclib3\File\ASN1::asn1map($decoded[0], ['type' => \phpseclib3\File\ASN1::TYPE_BIT_STRING]); - if (empty($raw)) { - return \false; - } - // If the key is private, compute identifier from its corresponding public key. - $key = PublicKeyLoader::load($raw); - if ($key instanceof PrivateKey) { - // If private. - return $this->computeKeyIdentifier($key, $method); - } - $key = $raw; - // Is a public key. - break; - case $key instanceof \phpseclib3\File\X509: - if (isset($key->publicKey)) { - return $this->computeKeyIdentifier($key->publicKey, $method); - } - if (isset($key->privateKey)) { - return $this->computeKeyIdentifier($key->privateKey, $method); - } - if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { - return $this->computeKeyIdentifier($key->currentCert, $method); - } - return \false; - default: - // Should be a key object (i.e.: \phpseclib3\Crypt\RSA). - $key = $key->getPublicKey(); - break; - } - // If in PEM format, convert to binary. - $key = \phpseclib3\File\ASN1::extractBER($key); - // Now we have the key string: compute its sha-1 sum. - $hash = new Hash('sha1'); - $hash = $hash->hash($key); - if ($method == 2) { - $hash = \substr($hash, -8); - $hash[0] = \chr(\ord($hash[0]) & 0xf | 0x40); - } - return $hash; - } - /** - * Format a public key as appropriate - * - * @return array|false - */ - private function formatSubjectPublicKey() - { - $format = $this->publicKey instanceof RSA && $this->publicKey->getPadding() & RSA::SIGNATURE_PSS ? 'PSS' : 'PKCS8'; - $publicKey = \base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $this->publicKey->toString($format))); - $decoded = \phpseclib3\File\ASN1::decodeBER($publicKey); - if (!$decoded) { - return \false; - } - $mapped = \phpseclib3\File\ASN1::asn1map($decoded[0], Maps\SubjectPublicKeyInfo::MAP); - if (!\is_array($mapped)) { - return \false; - } - $mapped['subjectPublicKey'] = $this->publicKey->toString($format); - return $mapped; - } - /** - * Set the domain name's which the cert is to be valid for - * - * @param mixed ...$domains - * @return void - */ - public function setDomain(...$domains) - { - $this->domains = $domains; - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->domains[0]); - } - /** - * Set the IP Addresses's which the cert is to be valid for - * - * @param mixed[] ...$ipAddresses - */ - public function setIPAddress(...$ipAddresses) - { - $this->ipAddresses = $ipAddresses; - /* - if (!isset($this->domains)) { - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->ipAddresses[0]); - } - */ - } - /** - * Helper function to build domain array - * - * @param string $domain - * @return array - */ - private static function dnsName($domain) - { - return ['dNSName' => $domain]; - } - /** - * Helper function to build IP Address array - * - * (IPv6 is not currently supported) - * - * @param string $address - * @return array - */ - private function iPAddress($address) - { - return ['iPAddress' => $address]; - } - /** - * Get the index of a revoked certificate. - * - * @param array $rclist - * @param string $serial - * @param bool $create optional - * @return int|false - */ - private function revokedCertificate(array &$rclist, $serial, $create = \false) - { - $serial = new BigInteger($serial); - foreach ($rclist as $i => $rc) { - if (!$serial->compare($rc['userCertificate'])) { - return $i; - } - } - if (!$create) { - return \false; - } - $i = \count($rclist); - $revocationDate = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); - $rclist[] = ['userCertificate' => $serial, 'revocationDate' => $this->timeField($revocationDate->format('D, d M Y H:i:s O'))]; - return $i; - } - /** - * Revoke a certificate. - * - * @param string $serial - * @param string $date optional - * @return bool - */ - public function revoke($serial, $date = null) - { - if (isset($this->currentCert['tbsCertList'])) { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', \true))) { - if ($this->revokedCertificate($rclist, $serial) === \false) { - // If not yet revoked - if (($i = $this->revokedCertificate($rclist, $serial, \true)) !== \false) { - if (!empty($date)) { - $rclist[$i]['revocationDate'] = $this->timeField($date); - } - return \true; - } - } - } - } - return \false; - } - /** - * Unrevoke a certificate. - * - * @param string $serial - * @return bool - */ - public function unrevoke($serial) - { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - unset($rclist[$i]); - $rclist = \array_values($rclist); - return \true; - } - } - return \false; - } - /** - * Get a revoked certificate. - * - * @param string $serial - * @return mixed - */ - public function getRevoked($serial) - { - if (\is_array($rclist = $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $rclist[$i]; - } - } - return \false; - } - /** - * List revoked certificates - * - * @param array $crl optional - * @return array|bool - */ - public function listRevoked(array $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - if (!isset($crl['tbsCertList'])) { - return \false; - } - $result = []; - if (\is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - foreach ($rclist as $rc) { - $result[] = $rc['userCertificate']->toString(); - } - } - return $result; - } - /** - * Remove a Revoked Certificate Extension - * - * @param string $serial - * @param string $id - * @return bool - */ - public function removeRevokedCertificateExtension($serial, $id) - { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $this->removeExtensionHelper($id, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); - } - } - return \false; - } - /** - * Get a Revoked Certificate Extension - * - * Returns the extension if it exists and false if not - * - * @param string $serial - * @param string $id - * @param array $crl optional - * @return mixed - */ - public function getRevokedCertificateExtension($serial, $id, array $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - if (\is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $this->getExtension($id, $crl, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); - } - } - return \false; - } - /** - * Returns a list of all extensions in use for a given revoked certificate - * - * @param string $serial - * @param array $crl optional - * @return array|bool - */ - public function getRevokedCertificateExtensions($serial, array $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - if (\is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $this->getExtensions($crl, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); - } - } - return \false; - } - /** - * Set a Revoked Certificate Extension - * - * @param string $serial - * @param string $id - * @param mixed $value - * @param bool $critical optional - * @param bool $replace optional - * @return bool - */ - public function setRevokedCertificateExtension($serial, $id, $value, $critical = \false, $replace = \true) - { - if (isset($this->currentCert['tbsCertList'])) { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', \true))) { - if (($i = $this->revokedCertificate($rclist, $serial, \true)) !== \false) { - return $this->setExtensionHelper($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); - } - } - } - return \false; - } - /** - * Register the mapping for a custom/unsupported extension. - * - * @param string $id - * @param array $mapping - */ - public static function registerExtension($id, array $mapping) - { - if (isset(self::$extensions[$id]) && self::$extensions[$id] !== $mapping) { - throw new \RuntimeException('Extension ' . $id . ' has already been defined with a different mapping.'); - } - self::$extensions[$id] = $mapping; - } - /** - * Register the mapping for a custom/unsupported extension. - * - * @param string $id - * - * @return array|null - */ - public static function getRegisteredExtension($id) - { - return isset(self::$extensions[$id]) ? self::$extensions[$id] : null; - } - /** - * Register the mapping for a custom/unsupported extension. - * - * @param string $id - * @param mixed $value - * @param bool $critical - * @param bool $replace - */ - public function setExtensionValue($id, $value, $critical = \false, $replace = \false) - { - $this->extensionValues[$id] = \compact('critical', 'replace', 'value'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger.php deleted file mode 100644 index dd0f4b6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger.php +++ /dev/null @@ -1,801 +0,0 @@ - - * add($b); - * - * echo $c->toString(); // outputs 5 - * ?> - * - * - * @author Jim Wigginton - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Math; - -use phpseclib3\Exception\BadConfigurationException; -use phpseclib3\Math\BigInteger\Engines\Engine; -/** - * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 - * numbers. - * - * @author Jim Wigginton - */ -class BigInteger implements \JsonSerializable -{ - /** - * Main Engine - * - * @var class-string - */ - private static $mainEngine; - /** - * Selected Engines - * - * @var list - */ - private static $engines; - /** - * The actual BigInteger object - * - * @var object - */ - private $value; - /** - * Mode independent value used for serialization. - * - * @see self::__sleep() - * @see self::__wakeup() - * @var string - */ - private $hex; - /** - * Precision (used only for serialization) - * - * @see self::__sleep() - * @see self::__wakeup() - * @var int - */ - private $precision; - /** - * Sets engine type. - * - * Throws an exception if the type is invalid - * - * @param string $main - * @param list $modexps optional - * @return void - */ - public static function setEngine($main, array $modexps = ['DefaultEngine']) - { - self::$engines = []; - $fqmain = 'phpseclib3\\Math\\BigInteger\\Engines\\' . $main; - if (!\class_exists($fqmain) || !\method_exists($fqmain, 'isValidEngine')) { - throw new \InvalidArgumentException("{$main} is not a valid engine"); - } - if (!$fqmain::isValidEngine()) { - throw new BadConfigurationException("{$main} is not setup correctly on this system"); - } - /** @var class-string $fqmain */ - self::$mainEngine = $fqmain; - $found = \false; - foreach ($modexps as $modexp) { - try { - $fqmain::setModExpEngine($modexp); - $found = \true; - break; - } catch (\Exception $e) { - } - } - if (!$found) { - throw new BadConfigurationException("No valid modular exponentiation engine found for {$main}"); - } - self::$engines = [$main, $modexp]; - } - /** - * Returns the engine type - * - * @return string[] - */ - public static function getEngine() - { - self::initialize_static_variables(); - return self::$engines; - } - /** - * Initialize static variables - */ - private static function initialize_static_variables() - { - if (!isset(self::$mainEngine)) { - $engines = [['GMP', ['DefaultEngine']], ['PHP64', ['OpenSSL']], ['BCMath', ['OpenSSL']], ['PHP32', ['OpenSSL']], ['PHP64', ['DefaultEngine']], ['PHP32', ['DefaultEngine']]]; - foreach ($engines as $engine) { - try { - self::setEngine($engine[0], $engine[1]); - break; - } catch (\Exception $e) { - } - } - } - } - /** - * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. - * - * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using - * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. - * - * @param string|int|BigInteger\Engines\Engine $x Base-10 number or base-$base number if $base set. - * @param int $base - */ - public function __construct($x = 0, $base = 10) - { - self::initialize_static_variables(); - if ($x instanceof self::$mainEngine) { - $this->value = clone $x; - } elseif ($x instanceof \phpseclib3\Math\BigInteger\Engines\Engine) { - $this->value = new static("{$x}"); - $this->value->setPrecision($x->getPrecision()); - } else { - $this->value = new self::$mainEngine($x, $base); - } - } - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - return $this->value->toString(); - } - /** - * __toString() magic method - */ - public function __toString() - { - return (string) $this->value; - } - /** - * __debugInfo() magic method - * - * Will be called, automatically, when print_r() or var_dump() are called - */ - public function __debugInfo() - { - return $this->value->__debugInfo(); - } - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = \false) - { - return $this->value->toBytes($twos_compliment); - } - /** - * Converts a BigInteger to a hex string (eg. base-16). - * - * @param bool $twos_compliment - * @return string - */ - public function toHex($twos_compliment = \false) - { - return $this->value->toHex($twos_compliment); - } - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * @param bool $twos_compliment - * @return string - */ - public function toBits($twos_compliment = \false) - { - return $this->value->toBits($twos_compliment); - } - /** - * Adds two BigIntegers. - * - * @param BigInteger $y - * @return BigInteger - */ - public function add(\phpseclib3\Math\BigInteger $y) - { - return new static($this->value->add($y->value)); - } - /** - * Subtracts two BigIntegers. - * - * @param BigInteger $y - * @return BigInteger - */ - public function subtract(\phpseclib3\Math\BigInteger $y) - { - return new static($this->value->subtract($y->value)); - } - /** - * Multiplies two BigIntegers - * - * @param BigInteger $x - * @return BigInteger - */ - public function multiply(\phpseclib3\Math\BigInteger $x) - { - return new static($this->value->multiply($x->value)); - } - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * Here's an example: - * - * divide($b); - * - * echo $quotient->toString(); // outputs 0 - * echo "\r\n"; - * echo $remainder->toString(); // outputs 10 - * ?> - * - * - * @param BigInteger $y - * @return BigInteger[] - */ - public function divide(\phpseclib3\Math\BigInteger $y) - { - list($q, $r) = $this->value->divide($y->value); - return [new static($q), new static($r)]; - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param BigInteger $n - * @return BigInteger - */ - public function modInverse(\phpseclib3\Math\BigInteger $n) - { - return new static($this->value->modInverse($n->value)); - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param BigInteger $n - * @return BigInteger[] - */ - public function extendedGCD(\phpseclib3\Math\BigInteger $n) - { - \extract($this->value->extendedGCD($n->value)); - /** - * @var BigInteger $gcd - * @var BigInteger $x - * @var BigInteger $y - */ - return ['gcd' => new static($gcd), 'x' => new static($x), 'y' => new static($y)]; - } - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param BigInteger $n - * @return BigInteger - */ - public function gcd(\phpseclib3\Math\BigInteger $n) - { - return new static($this->value->gcd($n->value)); - } - /** - * Absolute value. - * - * @return BigInteger - */ - public function abs() - { - return new static($this->value->abs()); - } - /** - * Set Precision - * - * Some bitwise operations give different results depending on the precision being used. Examples include left - * shift, not, and rotates. - * - * @param int $bits - */ - public function setPrecision($bits) - { - $this->value->setPrecision($bits); - } - /** - * Get Precision - * - * Returns the precision if it exists, false if it doesn't - * - * @return int|bool - */ - public function getPrecision() - { - return $this->value->getPrecision(); - } - /** - * Serialize - * - * Will be called, automatically, when serialize() is called on a BigInteger object. - * - * __sleep() / __wakeup() have been around since PHP 4.0 - * - * \Serializable was introduced in PHP 5.1 and deprecated in PHP 8.1: - * https://wiki.php.net/rfc/phase_out_serializable - * - * __serialize() / __unserialize() were introduced in PHP 7.4: - * https://wiki.php.net/rfc/custom_object_serialization - * - * @return array - */ - public function __sleep() - { - $this->hex = $this->toHex(\true); - $vars = ['hex']; - if ($this->getPrecision() > 0) { - $vars[] = 'precision'; - } - return $vars; - } - /** - * Serialize - * - * Will be called, automatically, when unserialize() is called on a BigInteger object. - */ - public function __wakeup() - { - $temp = new static($this->hex, -16); - $this->value = $temp->value; - if ($this->precision > 0) { - // recalculate $this->bitmask - $this->setPrecision($this->precision); - } - } - /** - * JSON Serialize - * - * Will be called, automatically, when json_encode() is called on a BigInteger object. - * - * @return array{hex: string, precision?: int] - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - $result = ['hex' => $this->toHex(\true)]; - if ($this->precision > 0) { - $result['precision'] = $this->getPrecision(); - } - return $result; - } - /** - * Performs modular exponentiation. - * - * @param BigInteger $e - * @param BigInteger $n - * @return BigInteger - */ - public function powMod(\phpseclib3\Math\BigInteger $e, \phpseclib3\Math\BigInteger $n) - { - return new static($this->value->powMod($e->value, $n->value)); - } - /** - * Performs modular exponentiation. - * - * @param BigInteger $e - * @param BigInteger $n - * @return BigInteger - */ - public function modPow(\phpseclib3\Math\BigInteger $e, \phpseclib3\Math\BigInteger $n) - { - return new static($this->value->modPow($e->value, $n->value)); - } - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this - * is demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param BigInteger $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(\phpseclib3\Math\BigInteger $y) - { - return $this->value->compare($y->value); - } - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param BigInteger $x - * @return bool - */ - public function equals(\phpseclib3\Math\BigInteger $x) - { - return $this->value->equals($x->value); - } - /** - * Logical Not - * - * @return BigInteger - */ - public function bitwise_not() - { - return new static($this->value->bitwise_not()); - } - /** - * Logical And - * - * @param BigInteger $x - * @return BigInteger - */ - public function bitwise_and(\phpseclib3\Math\BigInteger $x) - { - return new static($this->value->bitwise_and($x->value)); - } - /** - * Logical Or - * - * @param BigInteger $x - * @return BigInteger - */ - public function bitwise_or(\phpseclib3\Math\BigInteger $x) - { - return new static($this->value->bitwise_or($x->value)); - } - /** - * Logical Exclusive Or - * - * @param BigInteger $x - * @return BigInteger - */ - public function bitwise_xor(\phpseclib3\Math\BigInteger $x) - { - return new static($this->value->bitwise_xor($x->value)); - } - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_rightShift($shift) - { - return new static($this->value->bitwise_rightShift($shift)); - } - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_leftShift($shift) - { - return new static($this->value->bitwise_leftShift($shift)); - } - /** - * Logical Left Rotate - * - * Instead of the top x bits being dropped they're appended to the shifted bit string. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_leftRotate($shift) - { - return new static($this->value->bitwise_leftRotate($shift)); - } - /** - * Logical Right Rotate - * - * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_rightRotate($shift) - { - return new static($this->value->bitwise_rightRotate($shift)); - } - /** - * Returns the smallest and largest n-bit number - * - * @param int $bits - * @return BigInteger[] - */ - public static function minMaxBits($bits) - { - self::initialize_static_variables(); - $class = self::$mainEngine; - \extract($class::minMaxBits($bits)); - /** @var BigInteger $min - * @var BigInteger $max - */ - return ['min' => new static($min), 'max' => new static($max)]; - } - /** - * Return the size of a BigInteger in bits - * - * @return int - */ - public function getLength() - { - return $this->value->getLength(); - } - /** - * Return the size of a BigInteger in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return $this->value->getLengthInBytes(); - } - /** - * Generates a random number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return BigInteger - */ - public static function random($size) - { - self::initialize_static_variables(); - $class = self::$mainEngine; - return new static($class::random($size)); - } - /** - * Generates a random prime number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return BigInteger - */ - public static function randomPrime($size) - { - self::initialize_static_variables(); - $class = self::$mainEngine; - return new static($class::randomPrime($size)); - } - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param BigInteger $min - * @param BigInteger $max - * @return false|BigInteger - */ - public static function randomRangePrime(\phpseclib3\Math\BigInteger $min, \phpseclib3\Math\BigInteger $max) - { - $class = self::$mainEngine; - return new static($class::randomRangePrime($min->value, $max->value)); - } - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param BigInteger $min - * @param BigInteger $max - * @return BigInteger - */ - public static function randomRange(\phpseclib3\Math\BigInteger $min, \phpseclib3\Math\BigInteger $max) - { - $class = self::$mainEngine; - return new static($class::randomRange($min->value, $max->value)); - } - /** - * Checks a numer to see if it's prime - * - * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the - * $t parameter is distributability. BigInteger::randomPrime() can be distributed across multiple pageloads - * on a website instead of just one. - * - * @param int|bool $t - * @return bool - */ - public function isPrime($t = \false) - { - return $this->value->isPrime($t); - } - /** - * Calculates the nth root of a biginteger. - * - * Returns the nth root of a positive biginteger, where n defaults to 2 - * - * @param int $n optional - * @return BigInteger - */ - public function root($n = 2) - { - return new static($this->value->root($n)); - } - /** - * Performs exponentiation. - * - * @param BigInteger $n - * @return BigInteger - */ - public function pow(\phpseclib3\Math\BigInteger $n) - { - return new static($this->value->pow($n->value)); - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param BigInteger ...$nums - * @return BigInteger - */ - public static function min(\phpseclib3\Math\BigInteger ...$nums) - { - $class = self::$mainEngine; - $nums = \array_map(function ($num) { - return $num->value; - }, $nums); - return new static($class::min(...$nums)); - } - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param BigInteger ...$nums - * @return BigInteger - */ - public static function max(\phpseclib3\Math\BigInteger ...$nums) - { - $class = self::$mainEngine; - $nums = \array_map(function ($num) { - return $num->value; - }, $nums); - return new static($class::max(...$nums)); - } - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param BigInteger $min - * @param BigInteger $max - * @return bool - */ - public function between(\phpseclib3\Math\BigInteger $min, \phpseclib3\Math\BigInteger $max) - { - return $this->value->between($min->value, $max->value); - } - /** - * Clone - */ - public function __clone() - { - $this->value = clone $this->value; - } - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return $this->value->isOdd(); - } - /** - * Tests if a bit is set - * - * @param int $x - * @return bool - */ - public function testBit($x) - { - return $this->value->testBit($x); - } - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return $this->value->isNegative(); - } - /** - * Negate - * - * Given $k, returns -$k - * - * @return BigInteger - */ - public function negate() - { - return new static($this->value->negate()); - } - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param BigInteger $r - * @return int - */ - public static function scan1divide(\phpseclib3\Math\BigInteger $r) - { - $class = self::$mainEngine; - return $class::scan1divide($r->value); - } - /** - * Create Recurring Modulo Function - * - * Sometimes it may be desirable to do repeated modulos with the same number outside of - * modular exponentiation - * - * @return callable - */ - public function createRecurringModuloFunction() - { - $func = $this->value->createRecurringModuloFunction(); - return function (\phpseclib3\Math\BigInteger $x) use($func) { - return new static($func($x->value)); - }; - } - /** - * Bitwise Split - * - * Splits BigInteger's into chunks of $split bits - * - * @param int $split - * @return BigInteger[] - */ - public function bitwise_split($split) - { - return \array_map(function ($val) { - return new static($val); - }, $this->value->bitwise_split($split)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php deleted file mode 100644 index bece252..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php +++ /dev/null @@ -1,601 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\BadConfigurationException; -/** - * BCMath Engine. - * - * @author Jim Wigginton - */ -class BCMath extends \phpseclib3\Math\BigInteger\Engines\Engine -{ - /** - * Can Bitwise operations be done fast? - * - * @see parent::bitwise_leftRotate() - * @see parent::bitwise_rightRotate() - */ - const FAST_BITWISE = \false; - /** - * Engine Directory - * - * @see parent::setModExpEngine - */ - const ENGINE_DIR = 'BCMath'; - /** - * Test for engine validity - * - * @return bool - * @see parent::__construct() - */ - public static function isValidEngine() - { - return \function_exists('bcadd'); - } - /** - * Default constructor - * - * @param mixed $x integer Base-10 number or base-$base number if $base set. - * @param int $base - * @see parent::__construct() - */ - public function __construct($x = 0, $base = 10) - { - if (!isset(static::$isValidEngine[static::class])) { - static::$isValidEngine[static::class] = self::isValidEngine(); - } - if (!static::$isValidEngine[static::class]) { - throw new BadConfigurationException('BCMath is not setup correctly on this system'); - } - $this->value = '0'; - parent::__construct($x, $base); - } - /** - * Initialize a BCMath BigInteger Engine instance - * - * @param int $base - * @see parent::__construct() - */ - protected function initialize($base) - { - switch (\abs($base)) { - case 256: - // round $len to the nearest 4 - $len = \strlen($this->value) + 3 & ~3; - $x = \str_pad($this->value, $len, \chr(0), \STR_PAD_LEFT); - $this->value = '0'; - for ($i = 0; $i < $len; $i += 4) { - $this->value = \bcmul($this->value, '4294967296', 0); - // 4294967296 == 2**32 - $this->value = \bcadd($this->value, 0x1000000 * \ord($x[$i]) + (\ord($x[$i + 1]) << 16 | \ord($x[$i + 2]) << 8 | \ord($x[$i + 3])), 0); - } - if ($this->is_negative) { - $this->value = '-' . $this->value; - } - break; - case 16: - $x = \strlen($this->value) & 1 ? '0' . $this->value : $this->value; - $temp = new self(Strings::hex2bin($x), 256); - $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; - $this->is_negative = \false; - break; - case 10: - // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different - // results then doing it on '-1' does (modInverse does $x[0]) - $this->value = $this->value === '-' ? '0' : (string) $this->value; - } - } - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - if ($this->value === '0') { - return '0'; - } - return \ltrim($this->value, '0'); - } - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = \false) - { - if ($twos_compliment) { - return $this->toBytesHelper(); - } - $value = ''; - $current = $this->value; - if ($current[0] == '-') { - $current = \substr($current, 1); - } - while (\bccomp($current, '0', 0) > 0) { - $temp = \bcmod($current, '16777216'); - $value = \chr($temp >> 16) . \chr($temp >> 8) . \chr($temp) . $value; - $current = \bcdiv($current, '16777216', 0); - } - return $this->precision > 0 ? \substr(\str_pad($value, $this->precision >> 3, \chr(0), \STR_PAD_LEFT), -($this->precision >> 3)) : \ltrim($value, \chr(0)); - } - /** - * Adds two BigIntegers. - * - * @param BCMath $y - * @return BCMath - */ - public function add(\phpseclib3\Math\BigInteger\Engines\BCMath $y) - { - $temp = new self(); - $temp->value = \bcadd($this->value, $y->value); - return $this->normalize($temp); - } - /** - * Subtracts two BigIntegers. - * - * @param BCMath $y - * @return BCMath - */ - public function subtract(\phpseclib3\Math\BigInteger\Engines\BCMath $y) - { - $temp = new self(); - $temp->value = \bcsub($this->value, $y->value); - return $this->normalize($temp); - } - /** - * Multiplies two BigIntegers. - * - * @param BCMath $x - * @return BCMath - */ - public function multiply(\phpseclib3\Math\BigInteger\Engines\BCMath $x) - { - $temp = new self(); - $temp->value = \bcmul($this->value, $x->value); - return $this->normalize($temp); - } - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param BCMath $y - * @return array{static, static} - */ - public function divide(\phpseclib3\Math\BigInteger\Engines\BCMath $y) - { - $quotient = new self(); - $remainder = new self(); - $quotient->value = \bcdiv($this->value, $y->value, 0); - $remainder->value = \bcmod($this->value, $y->value); - if ($remainder->value[0] == '-') { - $remainder->value = \bcadd($remainder->value, $y->value[0] == '-' ? \substr($y->value, 1) : $y->value, 0); - } - return [$this->normalize($quotient), $this->normalize($remainder)]; - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param BCMath $n - * @return false|BCMath - */ - public function modInverse(\phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - return $this->modInverseHelper($n); - } - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that - * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which - * combination is returned is dependent upon which mode is in use. See - * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. - * - * @param BCMath $n - * @return array{gcd: static, x: static, y: static} - */ - public function extendedGCD(\phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works - // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, - // the basic extended euclidean algorithim is what we're using. - $u = $this->value; - $v = $n->value; - $a = '1'; - $b = '0'; - $c = '0'; - $d = '1'; - while (\bccomp($v, '0', 0) != 0) { - $q = \bcdiv($u, $v, 0); - $temp = $u; - $u = $v; - $v = \bcsub($temp, \bcmul($v, $q, 0), 0); - $temp = $a; - $a = $c; - $c = \bcsub($temp, \bcmul($a, $q, 0), 0); - $temp = $b; - $b = $d; - $d = \bcsub($temp, \bcmul($b, $q, 0), 0); - } - return ['gcd' => $this->normalize(new static($u)), 'x' => $this->normalize(new static($a)), 'y' => $this->normalize(new static($b))]; - } - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param BCMath $n - * @return BCMath - */ - public function gcd(\phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - \extract($this->extendedGCD($n)); - /** @var BCMath $gcd */ - return $gcd; - } - /** - * Absolute value. - * - * @return BCMath - */ - public function abs() - { - $temp = new static(); - $temp->value = \strlen($this->value) && $this->value[0] == '-' ? \substr($this->value, 1) : $this->value; - return $temp; - } - /** - * Logical And - * - * @param BCMath $x - * @return BCMath - */ - public function bitwise_and(\phpseclib3\Math\BigInteger\Engines\BCMath $x) - { - return $this->bitwiseAndHelper($x); - } - /** - * Logical Or - * - * @param BCMath $x - * @return BCMath - */ - public function bitwise_or(\phpseclib3\Math\BigInteger\Engines\BCMath $x) - { - return $this->bitwiseXorHelper($x); - } - /** - * Logical Exclusive Or - * - * @param BCMath $x - * @return BCMath - */ - public function bitwise_xor(\phpseclib3\Math\BigInteger\Engines\BCMath $x) - { - return $this->bitwiseXorHelper($x); - } - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return BCMath - */ - public function bitwise_rightShift($shift) - { - $temp = new static(); - $temp->value = \bcdiv($this->value, \bcpow('2', $shift, 0), 0); - return $this->normalize($temp); - } - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return BCMath - */ - public function bitwise_leftShift($shift) - { - $temp = new static(); - $temp->value = \bcmul($this->value, \bcpow('2', $shift, 0), 0); - return $this->normalize($temp); - } - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this - * is demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param BCMath $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(\phpseclib3\Math\BigInteger\Engines\BCMath $y) - { - return \bccomp($this->value, $y->value, 0); - } - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param BCMath $x - * @return bool - */ - public function equals(\phpseclib3\Math\BigInteger\Engines\BCMath $x) - { - return $this->value == $x->value; - } - /** - * Performs modular exponentiation. - * - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - public function modPow(\phpseclib3\Math\BigInteger\Engines\BCMath $e, \phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - return $this->powModOuter($e, $n); - } - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - public function powMod(\phpseclib3\Math\BigInteger\Engines\BCMath $e, \phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - return $this->powModOuter($e, $n); - } - /** - * Performs modular exponentiation. - * - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - protected function powModInner(\phpseclib3\Math\BigInteger\Engines\BCMath $e, \phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - try { - $class = static::$modexpEngine[static::class]; - return $class::powModHelper($this, $e, $n, static::class); - } catch (\Exception $err) { - return \phpseclib3\Math\BigInteger\Engines\BCMath\DefaultEngine::powModHelper($this, $e, $n, static::class); - } - } - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param BCMath $result - * @return BCMath - */ - protected function normalize(\phpseclib3\Math\BigInteger\Engines\BCMath $result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - if ($result->bitmask !== \false) { - $result->value = \bcmod($result->value, $result->bitmask->value); - } - return $result; - } - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param BCMath $min - * @param BCMath $max - * @return false|BCMath - */ - public static function randomRangePrime(\phpseclib3\Math\BigInteger\Engines\BCMath $min, \phpseclib3\Math\BigInteger\Engines\BCMath $max) - { - return self::randomRangePrimeOuter($min, $max); - } - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param BCMath $min - * @param BCMath $max - * @return BCMath - */ - public static function randomRange(\phpseclib3\Math\BigInteger\Engines\BCMath $min, \phpseclib3\Math\BigInteger\Engines\BCMath $max) - { - return self::randomRangeHelper($min, $max); - } - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see self::randomPrime() - */ - protected function make_odd() - { - if (!$this->isOdd()) { - $this->value = \bcadd($this->value, '1'); - } - } - /** - * Test the number against small primes. - * - * @see self::isPrime() - */ - protected function testSmallPrimes() - { - if ($this->value === '1') { - return \false; - } - if ($this->value === '2') { - return \true; - } - if ($this->value[\strlen($this->value) - 1] % 2 == 0) { - return \false; - } - $value = $this->value; - foreach (self::PRIMES as $prime) { - $r = \bcmod($this->value, $prime); - if ($r == '0') { - return $this->value == $prime; - } - } - return \true; - } - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param BCMath $r - * @return int - * @see self::isPrime() - */ - public static function scan1divide(\phpseclib3\Math\BigInteger\Engines\BCMath $r) - { - $r_value =& $r->value; - $s = 0; - // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals(static::$one[static::class]) check earlier - while ($r_value[\strlen($r_value) - 1] % 2 == 0) { - $r_value = \bcdiv($r_value, '2', 0); - ++$s; - } - return $s; - } - /** - * Performs exponentiation. - * - * @param BCMath $n - * @return BCMath - */ - public function pow(\phpseclib3\Math\BigInteger\Engines\BCMath $n) - { - $temp = new self(); - $temp->value = \bcpow($this->value, $n->value); - return $this->normalize($temp); - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param BCMath ...$nums - * @return BCMath - */ - public static function min(\phpseclib3\Math\BigInteger\Engines\BCMath ...$nums) - { - return self::minHelper($nums); - } - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param BCMath ...$nums - * @return BCMath - */ - public static function max(\phpseclib3\Math\BigInteger\Engines\BCMath ...$nums) - { - return self::maxHelper($nums); - } - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param BCMath $min - * @param BCMath $max - * @return bool - */ - public function between(\phpseclib3\Math\BigInteger\Engines\BCMath $min, \phpseclib3\Math\BigInteger\Engines\BCMath $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } - /** - * Set Bitmask - * - * @param int $bits - * @return Engine - * @see self::setPrecision() - */ - protected static function setBitmask($bits) - { - $temp = parent::setBitmask($bits); - return $temp->add(static::$one[static::class]); - } - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return $this->value[\strlen($this->value) - 1] % 2 == 1; - } - /** - * Tests if a bit is set - * - * @return bool - */ - public function testBit($x) - { - return \bccomp(\bcmod($this->value, \bcpow('2', $x + 1, 0)), \bcpow('2', $x, 0), 0) >= 0; - } - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return \strlen($this->value) && $this->value[0] == '-'; - } - /** - * Negate - * - * Given $k, returns -$k - * - * @return BCMath - */ - public function negate() - { - $temp = clone $this; - if (!\strlen($temp->value)) { - return $temp; - } - $temp->value = $temp->value[0] == '-' ? \substr($this->value, 1) : '-' . $this->value; - return $temp; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php deleted file mode 100644 index adcc370..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\BCMath; - -use phpseclib3\Math\BigInteger\Engines\BCMath; -/** - * Sliding Window Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Base extends BCMath -{ - /** - * Cache constants - * - * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. - * - */ - const VARIABLE = 0; - /** - * $cache[self::DATA] contains the cached data. - * - */ - const DATA = 1; - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return static::class != __CLASS__; - } - /** - * Performs modular exponentiation. - * - * @param BCMath $x - * @param BCMath $e - * @param BCMath $n - * @param string $class - * @return BCMath - */ - protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n, $class) - { - if (empty($e->value)) { - $temp = new $class(); - $temp->value = '1'; - return $x->normalize($temp); - } - return $x->normalize(static::slidingWindow($x, $e, $n, $class)); - } - /** - * Modular reduction preparation - * - * @param string $x - * @param string $n - * @param string $class - * @see self::slidingWindow() - * @return string - */ - protected static function prepareReduce($x, $n, $class) - { - return static::reduce($x, $n); - } - /** - * Modular multiply - * - * @param string $x - * @param string $y - * @param string $n - * @param string $class - * @see self::slidingWindow() - * @return string - */ - protected static function multiplyReduce($x, $y, $n, $class) - { - return static::reduce(\bcmul($x, $y), $n); - } - /** - * Modular square - * - * @param string $x - * @param string $n - * @param string $class - * @see self::slidingWindow() - * @return string - */ - protected static function squareReduce($x, $n, $class) - { - return static::reduce(\bcmul($x, $x), $n); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php deleted file mode 100644 index f38f2ce..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\BCMath; - -use phpseclib3\Math\BigInteger\Engines\BCMath; -/** - * Built-In BCMath Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class BuiltIn extends BCMath -{ - /** - * Performs modular exponentiation. - * - * @param BCMath $x - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n) - { - $temp = new BCMath(); - $temp->value = \bcpowmod($x->value, $e->value, $n->value); - return $x->normalize($temp); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php deleted file mode 100644 index 54af044..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\BCMath; - -use phpseclib3\Math\BigInteger\Engines\BCMath\Reductions\Barrett; -/** - * PHP Default Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class DefaultEngine extends Barrett -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php deleted file mode 100644 index 22010f1..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\BCMath; - -use phpseclib3\Math\BigInteger\Engines\OpenSSL as Progenitor; -/** - * OpenSSL Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class OpenSSL extends Progenitor -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php deleted file mode 100644 index 9352500..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php +++ /dev/null @@ -1,157 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\BCMath\Reductions; - -use phpseclib3\Math\BigInteger\Engines\BCMath\Base; -/** - * PHP Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Barrett extends Base -{ - /** - * Cache constants - * - * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. - * - */ - const VARIABLE = 0; - /** - * $cache[self::DATA] contains the cached data. - * - */ - const DATA = 1; - /** - * Barrett Modular Reduction - * - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, - * so as not to require negative numbers (initially, this script didn't support negative numbers). - * - * Employs "folding", as described at - * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from - * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." - * - * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that - * usable on account of (1) its not using reasonable radix points as discussed in - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable - * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that - * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line - * comments for details. - * - * @param string $n - * @param string $m - * @return string - */ - protected static function reduce($n, $m) - { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $m_length = \strlen($m); - if (\strlen($n) > 2 * $m_length) { - return \bcmod($n, $m); - } - // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced - if ($m_length < 5) { - return self::regularBarrett($n, $m); - } - // n = 2 * m.length - if (($key = \array_search($m, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $m; - $lhs = '1' . \str_repeat('0', $m_length + ($m_length >> 1)); - $u = \bcdiv($lhs, $m, 0); - $m1 = \bcsub($lhs, \bcmul($u, $m)); - $cache[self::DATA][] = [ - 'u' => $u, - // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1' => $m1, - ]; - } else { - \extract($cache[self::DATA][$key]); - } - $cutoff = $m_length + ($m_length >> 1); - $lsd = \substr($n, -$cutoff); - $msd = \substr($n, 0, -$cutoff); - $temp = \bcmul($msd, $m1); - // m.length + (m.length >> 1) - $n = \bcadd($lsd, $temp); - // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) - //if ($m_length & 1) { - // return self::regularBarrett($n, $m); - //} - // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = \substr($n, 0, -$m_length + 1); - // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 - // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - $temp = \bcmul($temp, $u); - // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 - // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = \substr($temp, 0, -($m_length >> 1) - 1); - // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 - // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = \bcmul($temp, $m); - // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit - // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop - // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - $result = \bcsub($n, $temp); - //if (bccomp($result, '0') < 0) { - if ($result[0] == '-') { - $temp = '1' . \str_repeat('0', $m_length + 1); - $result = \bcadd($result, $temp); - } - while (\bccomp($result, $m) >= 0) { - $result = \bcsub($result, $m); - } - return $result; - } - /** - * (Regular) Barrett Modular Reduction - * - * For numbers with more than four digits BigInteger::_barrett() is faster. The difference between that and this - * is that this function does not fold the denominator into a smaller form. - * - * @param string $x - * @param string $n - * @return string - */ - private static function regularBarrett($x, $n) - { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $n_length = \strlen($n); - if (\strlen($x) > 2 * $n_length) { - return \bcmod($x, $n); - } - if (($key = \array_search($n, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $n; - $lhs = '1' . \str_repeat('0', 2 * $n_length); - $cache[self::DATA][] = \bcdiv($lhs, $n, 0); - } - $temp = \substr($x, 0, -$n_length + 1); - $temp = \bcmul($temp, $cache[self::DATA][$key]); - $temp = \substr($temp, 0, -$n_length - 1); - $r1 = \substr($x, -$n_length - 1); - $r2 = \substr(\bcmul($temp, $n), -$n_length - 1); - $result = \bcsub($r1, $r2); - //if (bccomp($result, '0') < 0) { - if ($result[0] == '-') { - $q = '1' . \str_repeat('0', $n_length + 1); - $result = \bcadd($result, $q); - } - while (\bccomp($result, $n) >= 0) { - $result = \bcsub($result, $n); - } - return $result; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php deleted file mode 100644 index 46d1ae6..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\BCMath\Reductions; - -use phpseclib3\Math\BigInteger\Engines\BCMath; -use phpseclib3\Math\BigInteger\Engines\BCMath\Base; -/** - * PHP Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class EvalBarrett extends Base -{ - /** - * Custom Reduction Function - * - * @see self::generateCustomReduction - */ - private static $custom_reduction; - /** - * Barrett Modular Reduction - * - * This calls a dynamically generated loop unrolled function that's specific to a given modulo. - * Array lookups are avoided as are if statements testing for how many bits the host OS supports, etc. - * - * @param string $n - * @param string $m - * @return string - */ - protected static function reduce($n, $m) - { - $inline = self::$custom_reduction; - return $inline($n); - } - /** - * Generate Custom Reduction - * - * @param BCMath $m - * @param string $class - * @return callable|void - */ - protected static function generateCustomReduction(BCMath $m, $class) - { - $m_length = \strlen($m); - if ($m_length < 5) { - $code = 'return bcmod($x, $n);'; - eval('$func = function ($n) { ' . $code . '};'); - self::$custom_reduction = $func; - return; - } - $lhs = '1' . \str_repeat('0', $m_length + ($m_length >> 1)); - $u = \bcdiv($lhs, $m, 0); - $m1 = \bcsub($lhs, \bcmul($u, $m)); - $cutoff = $m_length + ($m_length >> 1); - $m = "'{$m}'"; - $u = "'{$u}'"; - $m1 = "'{$m1}'"; - $code = ' - $lsd = substr($n, -' . $cutoff . '); - $msd = substr($n, 0, -' . $cutoff . '); - - $temp = bcmul($msd, ' . $m1 . '); - $n = bcadd($lsd, $temp); - - $temp = substr($n, 0, ' . (-$m_length + 1) . '); - $temp = bcmul($temp, ' . $u . '); - $temp = substr($temp, 0, ' . (-($m_length >> 1) - 1) . '); - $temp = bcmul($temp, ' . $m . '); - - $result = bcsub($n, $temp); - - if ($result[0] == \'-\') { - $temp = \'1' . \str_repeat('0', $m_length + 1) . '\'; - $result = bcadd($result, $temp); - } - - while (bccomp($result, ' . $m . ') >= 0) { - $result = bcsub($result, ' . $m . '); - } - - return $result;'; - eval('$func = function ($n) { ' . $code . '};'); - self::$custom_reduction = $func; - return $func; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php deleted file mode 100644 index c9a585d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php +++ /dev/null @@ -1,1148 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Random; -use phpseclib3\Exception\BadConfigurationException; -use phpseclib3\Math\BigInteger; -/** - * Base Engine. - * - * @author Jim Wigginton - */ -abstract class Engine implements \JsonSerializable -{ - /* final protected */ - const PRIMES = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; - /** - * BigInteger(0) - * - * @var array, static> - */ - protected static $zero = []; - /** - * BigInteger(1) - * - * @var array, static> - */ - protected static $one = []; - /** - * BigInteger(2) - * - * @var array, static> - */ - protected static $two = []; - /** - * Modular Exponentiation Engine - * - * @var array, class-string> - */ - protected static $modexpEngine; - /** - * Engine Validity Flag - * - * @var array, bool> - */ - protected static $isValidEngine; - /** - * Holds the BigInteger's value - * - * @var \GMP|string|array|int - */ - protected $value; - /** - * Holds the BigInteger's sign - * - * @var bool - */ - protected $is_negative; - /** - * Precision - * - * @see static::setPrecision() - * @var int - */ - protected $precision = -1; - /** - * Precision Bitmask - * - * @see static::setPrecision() - * @var static|false - */ - protected $bitmask = \false; - /** - * Recurring Modulo Function - * - * @var callable - */ - protected $reduce; - /** - * Mode independent value used for serialization. - * - * @see self::__sleep() - * @see self::__wakeup() - * @var string - */ - protected $hex; - /** - * Default constructor - * - * @param int|numeric-string $x integer Base-10 number or base-$base number if $base set. - * @param int $base - */ - public function __construct($x = 0, $base = 10) - { - if (!\array_key_exists(static::class, static::$zero)) { - static::$zero[static::class] = null; - // Placeholder to prevent infinite loop. - static::$zero[static::class] = new static(0); - static::$one[static::class] = new static(1); - static::$two[static::class] = new static(2); - } - // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 - // '0' is the only value like this per http://php.net/empty - if (empty($x) && (\abs($base) != 256 || $x !== '0')) { - return; - } - switch ($base) { - case -256: - case 256: - if ($base == -256 && \ord($x[0]) & 0x80) { - $this->value = ~$x; - $this->is_negative = \true; - } else { - $this->value = $x; - $this->is_negative = \false; - } - $this->initialize($base); - if ($this->is_negative) { - $temp = $this->add(new static('-1')); - $this->value = $temp->value; - } - break; - case -16: - case 16: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = \true; - $x = \substr($x, 1); - } - $x = \preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#s', '$1', $x); - $is_negative = \false; - if ($base < 0 && \hexdec($x[0]) >= 8) { - $this->is_negative = $is_negative = \true; - $x = Strings::bin2hex(~Strings::hex2bin($x)); - } - $this->value = $x; - $this->initialize($base); - if ($is_negative) { - $temp = $this->add(new static('-1')); - $this->value = $temp->value; - } - break; - case -10: - case 10: - // (?value = \preg_replace('#(?value) || $this->value == '-') { - $this->value = '0'; - } - $this->initialize($base); - break; - case -2: - case 2: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = \true; - $x = \substr($x, 1); - } - $x = \preg_replace('#^([01]*).*#s', '$1', $x); - $temp = new static(Strings::bits2bin($x), 128 * $base); - // ie. either -16 or +16 - $this->value = $temp->value; - if ($temp->is_negative) { - $this->is_negative = \true; - } - break; - default: - } - } - /** - * Sets engine type. - * - * Throws an exception if the type is invalid - * - * @param class-string $engine - */ - public static function setModExpEngine($engine) - { - $fqengine = '\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\' . $engine; - if (!\class_exists($fqengine) || !\method_exists($fqengine, 'isValidEngine')) { - throw new \InvalidArgumentException("{$engine} is not a valid engine"); - } - if (!$fqengine::isValidEngine()) { - throw new BadConfigurationException("{$engine} is not setup correctly on this system"); - } - static::$modexpEngine[static::class] = $fqengine; - } - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * @return string - */ - protected function toBytesHelper() - { - $comparison = $this->compare(new static()); - if ($comparison == 0) { - return $this->precision > 0 ? \str_repeat(\chr(0), $this->precision + 1 >> 3) : ''; - } - $temp = $comparison < 0 ? $this->add(new static(1)) : $this; - $bytes = $temp->toBytes(); - if (!\strlen($bytes)) { - // eg. if the number we're trying to convert is -1 - $bytes = \chr(0); - } - if (\ord($bytes[0]) & 0x80) { - $bytes = \chr(0) . $bytes; - } - return $comparison < 0 ? ~$bytes : $bytes; - } - /** - * Converts a BigInteger to a hex string (eg. base-16). - * - * @param bool $twos_compliment - * @return string - */ - public function toHex($twos_compliment = \false) - { - return Strings::bin2hex($this->toBytes($twos_compliment)); - } - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * @param bool $twos_compliment - * @return string - */ - public function toBits($twos_compliment = \false) - { - $hex = $this->toBytes($twos_compliment); - $bits = Strings::bin2bits($hex); - $result = $this->precision > 0 ? \substr($bits, -$this->precision) : \ltrim($bits, '0'); - if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { - return '0' . $result; - } - return $result; - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * {@internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information.} - * - * @param Engine $n - * @return static|false - */ - protected function modInverseHelper(\phpseclib3\Math\BigInteger\Engines\Engine $n) - { - // $x mod -$n == $x mod $n. - $n = $n->abs(); - if ($this->compare(static::$zero[static::class]) < 0) { - $temp = $this->abs(); - $temp = $temp->modInverse($n); - return $this->normalize($n->subtract($temp)); - } - \extract($this->extendedGCD($n)); - /** - * @var Engine $gcd - * @var Engine $x - */ - if (!$gcd->equals(static::$one[static::class])) { - return \false; - } - $x = $x->compare(static::$zero[static::class]) < 0 ? $x->add($n) : $x; - return $this->compare(static::$zero[static::class]) < 0 ? $this->normalize($n->subtract($x)) : $this->normalize($x); - } - /** - * Serialize - * - * Will be called, automatically, when serialize() is called on a BigInteger object. - * - * @return array - */ - public function __sleep() - { - $this->hex = $this->toHex(\true); - $vars = ['hex']; - if ($this->precision > 0) { - $vars[] = 'precision'; - } - return $vars; - } - /** - * Serialize - * - * Will be called, automatically, when unserialize() is called on a BigInteger object. - * - * @return void - */ - public function __wakeup() - { - $temp = new static($this->hex, -16); - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - if ($this->precision > 0) { - // recalculate $this->bitmask - $this->setPrecision($this->precision); - } - } - /** - * JSON Serialize - * - * Will be called, automatically, when json_encode() is called on a BigInteger object. - * - * @return array{hex: string, precision?: int] - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - $result = ['hex' => $this->toHex(\true)]; - if ($this->precision > 0) { - $result['precision'] = $this->precision; - } - return $result; - } - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } - /** - * __debugInfo() magic method - * - * Will be called, automatically, when print_r() or var_dump() are called - * - * @return array - */ - public function __debugInfo() - { - $result = ['value' => '0x' . $this->toHex(\true), 'engine' => \basename(static::class)]; - return $this->precision > 0 ? $result + ['precision' => $this->precision] : $result; - } - /** - * Set Precision - * - * Some bitwise operations give different results depending on the precision being used. Examples include left - * shift, not, and rotates. - * - * @param int $bits - */ - public function setPrecision($bits) - { - if ($bits < 1) { - $this->precision = -1; - $this->bitmask = \false; - return; - } - $this->precision = $bits; - $this->bitmask = static::setBitmask($bits); - $temp = $this->normalize($this); - $this->value = $temp->value; - } - /** - * Get Precision - * - * Returns the precision if it exists, -1 if it doesn't - * - * @return int - */ - public function getPrecision() - { - return $this->precision; - } - /** - * Set Bitmask - * @return static - * @param int $bits - * @see self::setPrecision() - */ - protected static function setBitmask($bits) - { - return new static(\chr((1 << ($bits & 0x7)) - 1) . \str_repeat(\chr(0xff), $bits >> 3), 256); - } - /** - * Logical Not - * - * @return Engine|string - */ - public function bitwise_not() - { - // calculuate "not" without regard to $this->precision - // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) - $temp = $this->toBytes(); - if ($temp == '') { - return $this->normalize(static::$zero[static::class]); - } - $pre_msb = \decbin(\ord($temp[0])); - $temp = ~$temp; - $msb = \decbin(\ord($temp[0])); - if (\strlen($msb) == 8) { - $msb = \substr($msb, \strpos($msb, '0')); - } - $temp[0] = \chr(\bindec($msb)); - // see if we need to add extra leading 1's - $current_bits = \strlen($pre_msb) + 8 * \strlen($temp) - 8; - $new_bits = $this->precision - $current_bits; - if ($new_bits <= 0) { - return $this->normalize(new static($temp, 256)); - } - // generate as many leading 1's as we need to. - $leading_ones = \chr((1 << ($new_bits & 0x7)) - 1) . \str_repeat(\chr(0xff), $new_bits >> 3); - self::base256_lshift($leading_ones, $current_bits); - $temp = \str_pad($temp, \strlen($leading_ones), \chr(0), \STR_PAD_LEFT); - return $this->normalize(new static($leading_ones | $temp, 256)); - } - /** - * Logical Left Shift - * - * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. - * - * @param string $x - * @param int $shift - * @return void - */ - protected static function base256_lshift(&$x, $shift) - { - if ($shift == 0) { - return; - } - $num_bytes = $shift >> 3; - // eg. floor($shift/8) - $shift &= 7; - // eg. $shift % 8 - $carry = 0; - for ($i = \strlen($x) - 1; $i >= 0; --$i) { - $temp = \ord($x[$i]) << $shift | $carry; - $x[$i] = \chr($temp); - $carry = $temp >> 8; - } - $carry = $carry != 0 ? \chr($carry) : ''; - $x = $carry . $x . \str_repeat(\chr(0), $num_bytes); - } - /** - * Logical Left Rotate - * - * Instead of the top x bits being dropped they're appended to the shifted bit string. - * - * @param int $shift - * @return Engine - */ - public function bitwise_leftRotate($shift) - { - $bits = $this->toBytes(); - if ($this->precision > 0) { - $precision = $this->precision; - if (static::FAST_BITWISE) { - $mask = $this->bitmask->toBytes(); - } else { - $mask = $this->bitmask->subtract(new static(1)); - $mask = $mask->toBytes(); - } - } else { - $temp = \ord($bits[0]); - for ($i = 0; $temp >> $i; ++$i) { - } - $precision = 8 * \strlen($bits) - 8 + $i; - $mask = \chr((1 << ($precision & 0x7)) - 1) . \str_repeat(\chr(0xff), $precision >> 3); - } - if ($shift < 0) { - $shift += $precision; - } - $shift %= $precision; - if (!$shift) { - return clone $this; - } - $left = $this->bitwise_leftShift($shift); - $left = $left->bitwise_and(new static($mask, 256)); - $right = $this->bitwise_rightShift($precision - $shift); - $result = static::FAST_BITWISE ? $left->bitwise_or($right) : $left->add($right); - return $this->normalize($result); - } - /** - * Logical Right Rotate - * - * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. - * - * @param int $shift - * @return Engine - */ - public function bitwise_rightRotate($shift) - { - return $this->bitwise_leftRotate(-$shift); - } - /** - * Returns the smallest and largest n-bit number - * - * @param int $bits - * @return array{min: static, max: static} - */ - public static function minMaxBits($bits) - { - $bytes = $bits >> 3; - $min = \str_repeat(\chr(0), $bytes); - $max = \str_repeat(\chr(0xff), $bytes); - $msb = $bits & 7; - if ($msb) { - $min = \chr(1 << $msb - 1) . $min; - $max = \chr((1 << $msb) - 1) . $max; - } else { - $min[0] = \chr(0x80); - } - return ['min' => new static($min, 256), 'max' => new static($max, 256)]; - } - /** - * Return the size of a BigInteger in bits - * - * @return int - */ - public function getLength() - { - return \strlen($this->toBits()); - } - /** - * Return the size of a BigInteger in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return \strlen($this->toBytes()); - } - /** - * Performs some pre-processing for powMod - * - * @param Engine $e - * @param Engine $n - * @return static|false - */ - protected function powModOuter(\phpseclib3\Math\BigInteger\Engines\Engine $e, \phpseclib3\Math\BigInteger\Engines\Engine $n) - { - $n = $this->bitmask !== \false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); - if ($e->compare(new static()) < 0) { - $e = $e->abs(); - $temp = $this->modInverse($n); - if ($temp === \false) { - return \false; - } - return $this->normalize($temp->powModInner($e, $n)); - } - if ($this->compare($n) > 0) { - list(, $temp) = $this->divide($n); - return $temp->powModInner($e, $n); - } - return $this->powModInner($e, $n); - } - /** - * Sliding Window k-ary Modular Exponentiation - * - * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, - * however, this function performs a modular reduction after every multiplication and squaring operation. - * As such, this function has the same preconditions that the reductions being used do. - * - * @template T of Engine - * @param Engine $x - * @param Engine $e - * @param Engine $n - * @param class-string $class - * @return T - */ - protected static function slidingWindow(\phpseclib3\Math\BigInteger\Engines\Engine $x, \phpseclib3\Math\BigInteger\Engines\Engine $e, \phpseclib3\Math\BigInteger\Engines\Engine $n, $class) - { - static $window_ranges = [7, 25, 81, 241, 673, 1793]; - // from BigInteger.java's oddModPow function - //static $window_ranges = [0, 7, 36, 140, 450, 1303, 3529]; // from MPM 7.3.1 - $e_bits = $e->toBits(); - $e_length = \strlen($e_bits); - // calculate the appropriate window size. - // $window_size == 3 if $window_ranges is between 25 and 81, for example. - for ($i = 0, $window_size = 1; $i < \count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { - } - $n_value = $n->value; - if (\method_exists(static::class, 'generateCustomReduction')) { - static::generateCustomReduction($n, $class); - } - // precompute $this^0 through $this^$window_size - $powers = []; - $powers[1] = static::prepareReduce($x->value, $n_value, $class); - $powers[2] = static::squareReduce($powers[1], $n_value, $class); - // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end - // in a 1. ie. it's supposed to be odd. - $temp = 1 << $window_size - 1; - for ($i = 1; $i < $temp; ++$i) { - $i2 = $i << 1; - $powers[$i2 + 1] = static::multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $class); - } - $result = new $class(1); - $result = static::prepareReduce($result->value, $n_value, $class); - for ($i = 0; $i < $e_length;) { - if (!$e_bits[$i]) { - $result = static::squareReduce($result, $n_value, $class); - ++$i; - } else { - for ($j = $window_size - 1; $j > 0; --$j) { - if (!empty($e_bits[$i + $j])) { - break; - } - } - // eg. the length of substr($e_bits, $i, $j + 1) - for ($k = 0; $k <= $j; ++$k) { - $result = static::squareReduce($result, $n_value, $class); - } - $result = static::multiplyReduce($result, $powers[\bindec(\substr($e_bits, $i, $j + 1))], $n_value, $class); - $i += $j + 1; - } - } - $temp = new $class(); - $temp->value = static::reduce($result, $n_value, $class); - return $temp; - } - /** - * Generates a random number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return Engine - */ - public static function random($size) - { - \extract(static::minMaxBits($size)); - /** - * @var BigInteger $min - * @var BigInteger $max - */ - return static::randomRange($min, $max); - } - /** - * Generates a random prime number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return Engine - */ - public static function randomPrime($size) - { - \extract(static::minMaxBits($size)); - /** - * @var static $min - * @var static $max - */ - return static::randomRangePrime($min, $max); - } - /** - * Performs some pre-processing for randomRangePrime - * - * @param Engine $min - * @param Engine $max - * @return static|false - */ - protected static function randomRangePrimeOuter(\phpseclib3\Math\BigInteger\Engines\Engine $min, \phpseclib3\Math\BigInteger\Engines\Engine $max) - { - $compare = $max->compare($min); - if (!$compare) { - return $min->isPrime() ? $min : \false; - } elseif ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - $x = static::randomRange($min, $max); - return static::randomRangePrimeInner($x, $min, $max); - } - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param Engine $min - * @param Engine $max - * @return Engine - */ - protected static function randomRangeHelper(\phpseclib3\Math\BigInteger\Engines\Engine $min, \phpseclib3\Math\BigInteger\Engines\Engine $max) - { - $compare = $max->compare($min); - if (!$compare) { - return $min; - } elseif ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - if (!isset(static::$one[static::class])) { - static::$one[static::class] = new static(1); - } - $max = $max->subtract($min->subtract(static::$one[static::class])); - $size = \strlen(\ltrim($max->toBytes(), \chr(0))); - /* - doing $random % $max doesn't work because some numbers will be more likely to occur than others. - eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 - would produce 5 whereas the only value of random that could produce 139 would be 139. ie. - not all numbers would be equally likely. some would be more likely than others. - - creating a whole new random number until you find one that is within the range doesn't work - because, for sufficiently small ranges, the likelihood that you'd get a number within that range - would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability - would be pretty high that $random would be greater than $max. - - phpseclib works around this using the technique described here: - - http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string - */ - $random_max = new static(\chr(1) . \str_repeat("\x00", $size), 256); - $random = new static(Random::string($size), 256); - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - while ($random->compare($max_multiple) >= 0) { - $random = $random->subtract($max_multiple); - $random_max = $random_max->subtract($max_multiple); - $random = $random->bitwise_leftShift(8); - $random = $random->add(new static(Random::string(1), 256)); - $random_max = $random_max->bitwise_leftShift(8); - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - } - list(, $random) = $random->divide($max); - return $random->add($min); - } - /** - * Performs some post-processing for randomRangePrime - * - * @param Engine $x - * @param Engine $min - * @param Engine $max - * @return static|false - */ - protected static function randomRangePrimeInner(\phpseclib3\Math\BigInteger\Engines\Engine $x, \phpseclib3\Math\BigInteger\Engines\Engine $min, \phpseclib3\Math\BigInteger\Engines\Engine $max) - { - if (!isset(static::$two[static::class])) { - static::$two[static::class] = new static('2'); - } - $x->make_odd(); - if ($x->compare($max) > 0) { - // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range - if ($min->equals($max)) { - return \false; - } - $x = clone $min; - $x->make_odd(); - } - $initial_x = clone $x; - while (\true) { - if ($x->isPrime()) { - return $x; - } - $x = $x->add(static::$two[static::class]); - if ($x->compare($max) > 0) { - $x = clone $min; - if ($x->equals(static::$two[static::class])) { - return $x; - } - $x->make_odd(); - } - if ($x->equals($initial_x)) { - return \false; - } - } - } - /** - * Sets the $t parameter for primality testing - * - * @return int - */ - protected function setupIsPrime() - { - $length = $this->getLengthInBytes(); - // see HAC 4.49 "Note (controlling the error probability)" - // @codingStandardsIgnoreStart - if ($length >= 163) { - $t = 2; - } else { - if ($length >= 106) { - $t = 3; - } else { - if ($length >= 81) { - $t = 4; - } else { - if ($length >= 68) { - $t = 5; - } else { - if ($length >= 56) { - $t = 6; - } else { - if ($length >= 50) { - $t = 7; - } else { - if ($length >= 43) { - $t = 8; - } else { - if ($length >= 37) { - $t = 9; - } else { - if ($length >= 31) { - $t = 12; - } else { - if ($length >= 25) { - $t = 15; - } else { - if ($length >= 18) { - $t = 18; - } else { - $t = 27; - } - } - } - } - } - } - } - } - } - } - } - // @codingStandardsIgnoreEnd - return $t; - } - /** - * Tests Primality - * - * Uses the {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24} for more info. - * - * @param int $t - * @return bool - */ - protected function testPrimality($t) - { - if (!$this->testSmallPrimes()) { - return \false; - } - $n = clone $this; - $n_1 = $n->subtract(static::$one[static::class]); - $n_2 = $n->subtract(static::$two[static::class]); - $r = clone $n_1; - $s = static::scan1divide($r); - for ($i = 0; $i < $t; ++$i) { - $a = static::randomRange(static::$two[static::class], $n_2); - $y = $a->modPow($r, $n); - if (!$y->equals(static::$one[static::class]) && !$y->equals($n_1)) { - for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { - $y = $y->modPow(static::$two[static::class], $n); - if ($y->equals(static::$one[static::class])) { - return \false; - } - } - if (!$y->equals($n_1)) { - return \false; - } - } - } - return \true; - } - /** - * Checks a numer to see if it's prime - * - * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the - * $t parameter is distributability. BigInteger::randomPrime() can be distributed across multiple pageloads - * on a website instead of just one. - * - * @param int|bool $t - * @return bool - */ - public function isPrime($t = \false) - { - if (!$t) { - $t = $this->setupIsPrime(); - } - return $this->testPrimality($t); - } - /** - * Performs a few preliminary checks on root - * - * @param int $n - * @return Engine - */ - protected function rootHelper($n) - { - if ($n < 1) { - return clone static::$zero[static::class]; - } - // we want positive exponents - if ($this->compare(static::$one[static::class]) < 0) { - return clone static::$zero[static::class]; - } - // we want positive numbers - if ($this->compare(static::$two[static::class]) < 0) { - return clone static::$one[static::class]; - } - // n-th root of 1 or 2 is 1 - return $this->rootInner($n); - } - /** - * Calculates the nth root of a biginteger. - * - * Returns the nth root of a positive biginteger, where n defaults to 2 - * - * {@internal This function is based off of {@link http://mathforum.org/library/drmath/view/52605.html this page} and {@link http://stackoverflow.com/questions/11242920/calculating-nth-root-with-bcmath-in-php this stackoverflow question}.} - * - * @param int $n - * @return Engine - */ - protected function rootInner($n) - { - $n = new static($n); - // g is our guess number - $g = static::$two[static::class]; - // while (g^n < num) g=g*2 - while ($g->pow($n)->compare($this) < 0) { - $g = $g->multiply(static::$two[static::class]); - } - // if (g^n==num) num is a power of 2, we're lucky, end of job - // == 0 bccomp(bcpow($g, $n), $n->value)==0 - if ($g->pow($n)->equals($this) > 0) { - $root = $g; - return $this->normalize($root); - } - // if we're here num wasn't a power of 2 :( - $og = $g; - // og means original guess and here is our upper bound - $g = $g->divide(static::$two[static::class])[0]; - // g is set to be our lower bound - $step = $og->subtract($g)->divide(static::$two[static::class])[0]; - // step is the half of upper bound - lower bound - $g = $g->add($step); - // we start at lower bound + step , basically in the middle of our interval - // while step>1 - while ($step->compare(static::$one[static::class]) == 1) { - $guess = $g->pow($n); - $step = $step->divide(static::$two[static::class])[0]; - $comp = $guess->compare($this); - // compare our guess with real number - switch ($comp) { - case -1: - // if guess is lower we add the new step - $g = $g->add($step); - break; - case 1: - // if guess is higher we sub the new step - $g = $g->subtract($step); - break; - case 0: - // if guess is exactly the num we're done, we return the value - $root = $g; - break 2; - } - } - if ($comp == 1) { - $g = $g->subtract($step); - } - // whatever happened, g is the closest guess we can make so return it - $root = $g; - return $this->normalize($root); - } - /** - * Calculates the nth root of a biginteger. - * - * @param int $n - * @return Engine - */ - public function root($n = 2) - { - return $this->rootHelper($n); - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param array $nums - * @return Engine - */ - protected static function minHelper(array $nums) - { - if (\count($nums) == 1) { - return $nums[0]; - } - $min = $nums[0]; - for ($i = 1; $i < \count($nums); $i++) { - $min = $min->compare($nums[$i]) > 0 ? $nums[$i] : $min; - } - return $min; - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param array $nums - * @return Engine - */ - protected static function maxHelper(array $nums) - { - if (\count($nums) == 1) { - return $nums[0]; - } - $max = $nums[0]; - for ($i = 1; $i < \count($nums); $i++) { - $max = $max->compare($nums[$i]) < 0 ? $nums[$i] : $max; - } - return $max; - } - /** - * Create Recurring Modulo Function - * - * Sometimes it may be desirable to do repeated modulos with the same number outside of - * modular exponentiation - * - * @return callable - */ - public function createRecurringModuloFunction() - { - $class = static::class; - $fqengine = !\method_exists(static::$modexpEngine[static::class], 'reduce') ? '\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\DefaultEngine' : static::$modexpEngine[static::class]; - if (\method_exists($fqengine, 'generateCustomReduction')) { - $func = $fqengine::generateCustomReduction($this, static::class); - return eval('return function(' . static::class . ' $x) use ($func, $class) { - $r = new $class(); - $r->value = $func($x->value); - return $r; - };'); - } - $n = $this->value; - return eval('return function(' . static::class . ' $x) use ($n, $fqengine, $class) { - $r = new $class(); - $r->value = $fqengine::reduce($x->value, $n, $class); - return $r; - };'); - } - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * @param Engine $n - * @return array{gcd: Engine, x: Engine, y: Engine} - */ - protected function extendedGCDHelper(\phpseclib3\Math\BigInteger\Engines\Engine $n) - { - $u = clone $this; - $v = clone $n; - $one = new static(1); - $zero = new static(); - $a = clone $one; - $b = clone $zero; - $c = clone $zero; - $d = clone $one; - while (!$v->equals($zero)) { - list($q) = $u->divide($v); - $temp = $u; - $u = $v; - $v = $temp->subtract($v->multiply($q)); - $temp = $a; - $a = $c; - $c = $temp->subtract($a->multiply($q)); - $temp = $b; - $b = $d; - $d = $temp->subtract($b->multiply($q)); - } - return ['gcd' => $u, 'x' => $a, 'y' => $b]; - } - /** - * Bitwise Split - * - * Splits BigInteger's into chunks of $split bits - * - * @param int $split - * @return Engine[] - */ - public function bitwise_split($split) - { - if ($split < 1) { - throw new \RuntimeException('Offset must be greater than 1'); - } - $mask = static::$one[static::class]->bitwise_leftShift($split)->subtract(static::$one[static::class]); - $num = clone $this; - $vals = []; - while (!$num->equals(static::$zero[static::class])) { - $vals[] = $num->bitwise_and($mask); - $num = $num->bitwise_rightShift($split); - } - return \array_reverse($vals); - } - /** - * Logical And - * - * @param Engine $x - * @return Engine - */ - protected function bitwiseAndHelper(\phpseclib3\Math\BigInteger\Engines\Engine $x) - { - $left = $this->toBytes(\true); - $right = $x->toBytes(\true); - $length = \max(\strlen($left), \strlen($right)); - $left = \str_pad($left, $length, \chr(0), \STR_PAD_LEFT); - $right = \str_pad($right, $length, \chr(0), \STR_PAD_LEFT); - return $this->normalize(new static($left & $right, -256)); - } - /** - * Logical Or - * - * @param Engine $x - * @return Engine - */ - protected function bitwiseOrHelper(\phpseclib3\Math\BigInteger\Engines\Engine $x) - { - $left = $this->toBytes(\true); - $right = $x->toBytes(\true); - $length = \max(\strlen($left), \strlen($right)); - $left = \str_pad($left, $length, \chr(0), \STR_PAD_LEFT); - $right = \str_pad($right, $length, \chr(0), \STR_PAD_LEFT); - return $this->normalize(new static($left | $right, -256)); - } - /** - * Logical Exclusive Or - * - * @param Engine $x - * @return Engine - */ - protected function bitwiseXorHelper(\phpseclib3\Math\BigInteger\Engines\Engine $x) - { - $left = $this->toBytes(\true); - $right = $x->toBytes(\true); - $length = \max(\strlen($left), \strlen($right)); - $left = \str_pad($left, $length, \chr(0), \STR_PAD_LEFT); - $right = \str_pad($right, $length, \chr(0), \STR_PAD_LEFT); - return $this->normalize(new static($left ^ $right, -256)); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php deleted file mode 100644 index 79d7bff..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php +++ /dev/null @@ -1,612 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -use phpseclib3\Exception\BadConfigurationException; -/** - * GMP Engine. - * - * @author Jim Wigginton - */ -class GMP extends \phpseclib3\Math\BigInteger\Engines\Engine -{ - /** - * Can Bitwise operations be done fast? - * - * @see parent::bitwise_leftRotate() - * @see parent::bitwise_rightRotate() - */ - const FAST_BITWISE = \true; - /** - * Engine Directory - * - * @see parent::setModExpEngine - */ - const ENGINE_DIR = 'GMP'; - /** - * Test for engine validity - * - * @return bool - * @see parent::__construct() - */ - public static function isValidEngine() - { - return \extension_loaded('gmp'); - } - /** - * Default constructor - * - * @param mixed $x integer Base-10 number or base-$base number if $base set. - * @param int $base - * @see parent::__construct() - */ - public function __construct($x = 0, $base = 10) - { - if (!isset(static::$isValidEngine[static::class])) { - static::$isValidEngine[static::class] = self::isValidEngine(); - } - if (!static::$isValidEngine[static::class]) { - throw new BadConfigurationException('GMP is not setup correctly on this system'); - } - if ($x instanceof \GMP) { - $this->value = $x; - return; - } - $this->value = \gmp_init(0); - parent::__construct($x, $base); - } - /** - * Initialize a GMP BigInteger Engine instance - * - * @param int $base - * @see parent::__construct() - */ - protected function initialize($base) - { - switch (\abs($base)) { - case 256: - $this->value = \gmp_import($this->value); - if ($this->is_negative) { - $this->value = -$this->value; - } - break; - case 16: - $temp = $this->is_negative ? '-0x' . $this->value : '0x' . $this->value; - $this->value = \gmp_init($temp); - break; - case 10: - $this->value = \gmp_init(isset($this->value) ? $this->value : '0'); - } - } - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - return (string) $this->value; - } - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * @param bool $twos_compliment - * @return string - */ - public function toBits($twos_compliment = \false) - { - $hex = $this->toHex($twos_compliment); - $bits = \gmp_strval(\gmp_init($hex, 16), 2); - if ($this->precision > 0) { - $bits = \substr($bits, -$this->precision); - } - if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { - return '0' . $bits; - } - return $bits; - } - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = \false) - { - if ($twos_compliment) { - return $this->toBytesHelper(); - } - if (\gmp_cmp($this->value, \gmp_init(0)) == 0) { - return $this->precision > 0 ? \str_repeat(\chr(0), $this->precision + 1 >> 3) : ''; - } - $temp = \gmp_export($this->value); - return $this->precision > 0 ? \substr(\str_pad($temp, $this->precision >> 3, \chr(0), \STR_PAD_LEFT), -($this->precision >> 3)) : \ltrim($temp, \chr(0)); - } - /** - * Adds two BigIntegers. - * - * @param GMP $y - * @return GMP - */ - public function add(\phpseclib3\Math\BigInteger\Engines\GMP $y) - { - $temp = new self(); - $temp->value = $this->value + $y->value; - return $this->normalize($temp); - } - /** - * Subtracts two BigIntegers. - * - * @param GMP $y - * @return GMP - */ - public function subtract(\phpseclib3\Math\BigInteger\Engines\GMP $y) - { - $temp = new self(); - $temp->value = $this->value - $y->value; - return $this->normalize($temp); - } - /** - * Multiplies two BigIntegers. - * - * @param GMP $x - * @return GMP - */ - public function multiply(\phpseclib3\Math\BigInteger\Engines\GMP $x) - { - $temp = new self(); - $temp->value = $this->value * $x->value; - return $this->normalize($temp); - } - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param GMP $y - * @return array{GMP, GMP} - */ - public function divide(\phpseclib3\Math\BigInteger\Engines\GMP $y) - { - $quotient = new self(); - $remainder = new self(); - list($quotient->value, $remainder->value) = \gmp_div_qr($this->value, $y->value); - if (\gmp_sign($remainder->value) < 0) { - $remainder->value = $remainder->value + \gmp_abs($y->value); - } - return [$this->normalize($quotient), $this->normalize($remainder)]; - } - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this - * is demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param GMP $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(\phpseclib3\Math\BigInteger\Engines\GMP $y) - { - $r = \gmp_cmp($this->value, $y->value); - if ($r < -1) { - $r = -1; - } - if ($r > 1) { - $r = 1; - } - return $r; - } - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param GMP $x - * @return bool - */ - public function equals(\phpseclib3\Math\BigInteger\Engines\GMP $x) - { - return $this->value == $x->value; - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param GMP $n - * @return false|GMP - */ - public function modInverse(\phpseclib3\Math\BigInteger\Engines\GMP $n) - { - $temp = new self(); - $temp->value = \gmp_invert($this->value, $n->value); - return $temp->value === \false ? \false : $this->normalize($temp); - } - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that - * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which - * combination is returned is dependent upon which mode is in use. See - * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. - * - * @param GMP $n - * @return GMP[] - */ - public function extendedGCD(\phpseclib3\Math\BigInteger\Engines\GMP $n) - { - \extract(\gmp_gcdext($this->value, $n->value)); - return ['gcd' => $this->normalize(new self($g)), 'x' => $this->normalize(new self($s)), 'y' => $this->normalize(new self($t))]; - } - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param GMP $n - * @return GMP - */ - public function gcd(\phpseclib3\Math\BigInteger\Engines\GMP $n) - { - $r = \gmp_gcd($this->value, $n->value); - return $this->normalize(new self($r)); - } - /** - * Absolute value. - * - * @return GMP - */ - public function abs() - { - $temp = new self(); - $temp->value = \gmp_abs($this->value); - return $temp; - } - /** - * Logical And - * - * @param GMP $x - * @return GMP - */ - public function bitwise_and(\phpseclib3\Math\BigInteger\Engines\GMP $x) - { - $temp = new self(); - $temp->value = $this->value & $x->value; - return $this->normalize($temp); - } - /** - * Logical Or - * - * @param GMP $x - * @return GMP - */ - public function bitwise_or(\phpseclib3\Math\BigInteger\Engines\GMP $x) - { - $temp = new self(); - $temp->value = $this->value | $x->value; - return $this->normalize($temp); - } - /** - * Logical Exclusive Or - * - * @param GMP $x - * @return GMP - */ - public function bitwise_xor(\phpseclib3\Math\BigInteger\Engines\GMP $x) - { - $temp = new self(); - $temp->value = $this->value ^ $x->value; - return $this->normalize($temp); - } - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return GMP - */ - public function bitwise_rightShift($shift) - { - // 0xFFFFFFFF >> 2 == -1 (on 32-bit systems) - // gmp_init('0xFFFFFFFF') >> 2 == gmp_init('0x3FFFFFFF') - $temp = new self(); - $temp->value = $this->value >> $shift; - return $this->normalize($temp); - } - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return GMP - */ - public function bitwise_leftShift($shift) - { - $temp = new self(); - $temp->value = $this->value << $shift; - return $this->normalize($temp); - } - /** - * Performs modular exponentiation. - * - * @param GMP $e - * @param GMP $n - * @return GMP - */ - public function modPow(\phpseclib3\Math\BigInteger\Engines\GMP $e, \phpseclib3\Math\BigInteger\Engines\GMP $n) - { - return $this->powModOuter($e, $n); - } - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param GMP $e - * @param GMP $n - * @return GMP - */ - public function powMod(\phpseclib3\Math\BigInteger\Engines\GMP $e, \phpseclib3\Math\BigInteger\Engines\GMP $n) - { - return $this->powModOuter($e, $n); - } - /** - * Performs modular exponentiation. - * - * @param GMP $e - * @param GMP $n - * @return GMP - */ - protected function powModInner(\phpseclib3\Math\BigInteger\Engines\GMP $e, \phpseclib3\Math\BigInteger\Engines\GMP $n) - { - $class = static::$modexpEngine[static::class]; - return $class::powModHelper($this, $e, $n); - } - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param GMP $result - * @return GMP - */ - protected function normalize(\phpseclib3\Math\BigInteger\Engines\GMP $result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - if ($result->bitmask !== \false) { - $flip = $result->value < 0; - if ($flip) { - $result->value = -$result->value; - } - $result->value = $result->value & $result->bitmask->value; - if ($flip) { - $result->value = -$result->value; - } - } - return $result; - } - /** - * Performs some post-processing for randomRangePrime - * - * @param Engine $x - * @param Engine $min - * @param Engine $max - * @return GMP - */ - protected static function randomRangePrimeInner(\phpseclib3\Math\BigInteger\Engines\Engine $x, \phpseclib3\Math\BigInteger\Engines\Engine $min, \phpseclib3\Math\BigInteger\Engines\Engine $max) - { - $p = \gmp_nextprime($x->value); - if ($p <= $max->value) { - return new self($p); - } - if ($min->value != $x->value) { - $x = new self($x->value - 1); - } - return self::randomRangePrime($min, $x); - } - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param GMP $min - * @param GMP $max - * @return false|GMP - */ - public static function randomRangePrime(\phpseclib3\Math\BigInteger\Engines\GMP $min, \phpseclib3\Math\BigInteger\Engines\GMP $max) - { - return self::randomRangePrimeOuter($min, $max); - } - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param GMP $min - * @param GMP $max - * @return GMP - */ - public static function randomRange(\phpseclib3\Math\BigInteger\Engines\GMP $min, \phpseclib3\Math\BigInteger\Engines\GMP $max) - { - return self::randomRangeHelper($min, $max); - } - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see self::randomPrime() - */ - protected function make_odd() - { - \gmp_setbit($this->value, 0); - } - /** - * Tests Primality - * - * @param int $t - * @return bool - */ - protected function testPrimality($t) - { - return \gmp_prob_prime($this->value, $t) != 0; - } - /** - * Calculates the nth root of a biginteger. - * - * Returns the nth root of a positive biginteger, where n defaults to 2 - * - * @param int $n - * @return GMP - */ - protected function rootInner($n) - { - $root = new self(); - $root->value = \gmp_root($this->value, $n); - return $this->normalize($root); - } - /** - * Performs exponentiation. - * - * @param GMP $n - * @return GMP - */ - public function pow(\phpseclib3\Math\BigInteger\Engines\GMP $n) - { - $temp = new self(); - $temp->value = $this->value ** $n->value; - return $this->normalize($temp); - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param GMP ...$nums - * @return GMP - */ - public static function min(\phpseclib3\Math\BigInteger\Engines\GMP ...$nums) - { - return self::minHelper($nums); - } - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param GMP ...$nums - * @return GMP - */ - public static function max(\phpseclib3\Math\BigInteger\Engines\GMP ...$nums) - { - return self::maxHelper($nums); - } - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param GMP $min - * @param GMP $max - * @return bool - */ - public function between(\phpseclib3\Math\BigInteger\Engines\GMP $min, \phpseclib3\Math\BigInteger\Engines\GMP $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } - /** - * Create Recurring Modulo Function - * - * Sometimes it may be desirable to do repeated modulos with the same number outside of - * modular exponentiation - * - * @return callable - */ - public function createRecurringModuloFunction() - { - $temp = $this->value; - return function (\phpseclib3\Math\BigInteger\Engines\GMP $x) use($temp) { - return new \phpseclib3\Math\BigInteger\Engines\GMP($x->value % $temp); - }; - } - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param GMP $r - * @return int - */ - public static function scan1divide(\phpseclib3\Math\BigInteger\Engines\GMP $r) - { - $s = \gmp_scan1($r->value, 0); - $r->value >>= $s; - return $s; - } - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return \gmp_testbit($this->value, 0); - } - /** - * Tests if a bit is set - * - * @return bool - */ - public function testBit($x) - { - return \gmp_testbit($this->value, $x); - } - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return \gmp_sign($this->value) == -1; - } - /** - * Negate - * - * Given $k, returns -$k - * - * @return GMP - */ - public function negate() - { - $temp = clone $this; - $temp->value = -$this->value; - return $temp; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php deleted file mode 100644 index b81576a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\GMP; - -use phpseclib3\Math\BigInteger\Engines\GMP; -/** - * GMP Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class DefaultEngine extends GMP -{ - /** - * Performs modular exponentiation. - * - * @param GMP $x - * @param GMP $e - * @param GMP $n - * @return GMP - */ - protected static function powModHelper(GMP $x, GMP $e, GMP $n) - { - $temp = new GMP(); - $temp->value = \gmp_powm($x->value, $e->value, $n->value); - return $x->normalize($temp); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php deleted file mode 100644 index 67f9b3e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -use phpseclib3\Crypt\RSA\Formats\Keys\PKCS8; -use phpseclib3\Math\BigInteger; -/** - * OpenSSL Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class OpenSSL -{ - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return \extension_loaded('openssl') && static::class != __CLASS__; - } - /** - * Performs modular exponentiation. - * - * @param Engine $x - * @param Engine $e - * @param Engine $n - * @return Engine - */ - public static function powModHelper(\phpseclib3\Math\BigInteger\Engines\Engine $x, \phpseclib3\Math\BigInteger\Engines\Engine $e, \phpseclib3\Math\BigInteger\Engines\Engine $n) - { - if ($n->getLengthInBytes() < 31 || $n->getLengthInBytes() > 16384) { - throw new \OutOfRangeException('Only modulo between 31 and 16384 bits are accepted'); - } - $key = PKCS8::savePublicKey(new BigInteger($n), new BigInteger($e)); - $plaintext = \str_pad($x->toBytes(), $n->getLengthInBytes(), "\x00", \STR_PAD_LEFT); - // this is easily prone to failure. if the modulo is a multiple of 2 or 3 or whatever it - // won't work and you'll get a "failure: error:0906D06C:PEM routines:PEM_read_bio:no start line" - // error. i suppose, for even numbers, we could do what PHP\Montgomery.php does, but then what - // about odd numbers divisible by 3, by 5, etc? - if (!\openssl_public_encrypt($plaintext, $result, $key, \OPENSSL_NO_PADDING)) { - throw new \UnexpectedValueException(\openssl_error_string()); - } - $class = \get_class($x); - return new $class($result, 256); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php deleted file mode 100644 index f3bef75..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php +++ /dev/null @@ -1,1086 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\BadConfigurationException; -/** - * Pure-PHP Engine. - * - * @author Jim Wigginton - */ -abstract class PHP extends \phpseclib3\Math\BigInteger\Engines\Engine -{ - /**#@+ - * Array constants - * - * Rather than create a thousands and thousands of new BigInteger objects in repeated function calls to add() and - * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. - * - */ - /** - * $result[self::VALUE] contains the value. - */ - const VALUE = 0; - /** - * $result[self::SIGN] contains the sign. - */ - const SIGN = 1; - /**#@-*/ - /** - * Karatsuba Cutoff - * - * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? - * - */ - const KARATSUBA_CUTOFF = 25; - /** - * Can Bitwise operations be done fast? - * - * @see parent::bitwise_leftRotate() - * @see parent::bitwise_rightRotate() - */ - const FAST_BITWISE = \true; - /** - * Engine Directory - * - * @see parent::setModExpEngine - */ - const ENGINE_DIR = 'PHP'; - /** - * Default constructor - * - * @param mixed $x integer Base-10 number or base-$base number if $base set. - * @param int $base - * @return PHP - * @see parent::__construct() - */ - public function __construct($x = 0, $base = 10) - { - if (!isset(static::$isValidEngine[static::class])) { - static::$isValidEngine[static::class] = static::isValidEngine(); - } - if (!static::$isValidEngine[static::class]) { - throw new BadConfigurationException(static::class . ' is not setup correctly on this system'); - } - $this->value = []; - parent::__construct($x, $base); - } - /** - * Initialize a PHP BigInteger Engine instance - * - * @param int $base - * @see parent::__construct() - */ - protected function initialize($base) - { - switch (\abs($base)) { - case 16: - $x = \strlen($this->value) & 1 ? '0' . $this->value : $this->value; - $temp = new static(Strings::hex2bin($x), 256); - $this->value = $temp->value; - break; - case 10: - $temp = new static(); - $multiplier = new static(); - $multiplier->value = [static::MAX10]; - $x = $this->value; - if ($x[0] == '-') { - $this->is_negative = \true; - $x = \substr($x, 1); - } - $x = \str_pad($x, \strlen($x) + (static::MAX10LEN - 1) * \strlen($x) % static::MAX10LEN, 0, \STR_PAD_LEFT); - while (\strlen($x)) { - $temp = $temp->multiply($multiplier); - $temp = $temp->add(new static($this->int2bytes(\substr($x, 0, static::MAX10LEN)), 256)); - $x = \substr($x, static::MAX10LEN); - } - $this->value = $temp->value; - } - } - /** - * Pads strings so that unpack may be used on them - * - * @param string $str - * @return string - */ - protected function pad($str) - { - $length = \strlen($str); - $pad = 4 - \strlen($str) % 4; - return \str_pad($str, $length + $pad, "\x00", \STR_PAD_LEFT); - } - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - if (!\count($this->value)) { - return '0'; - } - $temp = clone $this; - $temp->bitmask = \false; - $temp->is_negative = \false; - $divisor = new static(); - $divisor->value = [static::MAX10]; - $result = ''; - while (\count($temp->value)) { - list($temp, $mod) = $temp->divide($divisor); - $result = \str_pad(isset($mod->value[0]) ? $mod->value[0] : '', static::MAX10LEN, '0', \STR_PAD_LEFT) . $result; - } - $result = \ltrim($result, '0'); - if (empty($result)) { - $result = '0'; - } - if ($this->is_negative) { - $result = '-' . $result; - } - return $result; - } - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = \false) - { - if ($twos_compliment) { - return $this->toBytesHelper(); - } - if (!\count($this->value)) { - return $this->precision > 0 ? \str_repeat(\chr(0), $this->precision + 1 >> 3) : ''; - } - $result = $this->bitwise_small_split(8); - $result = \implode('', \array_map('chr', $result)); - return $this->precision > 0 ? \str_pad(\substr($result, -($this->precision + 7 >> 3)), $this->precision + 7 >> 3, \chr(0), \STR_PAD_LEFT) : $result; - } - /** - * Performs addition. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return array - */ - protected static function addHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - $x_size = \count($x_value); - $y_size = \count($y_value); - if ($x_size == 0) { - return [self::VALUE => $y_value, self::SIGN => $y_negative]; - } elseif ($y_size == 0) { - return [self::VALUE => $x_value, self::SIGN => $x_negative]; - } - // subtract, if appropriate - if ($x_negative != $y_negative) { - if ($x_value == $y_value) { - return [self::VALUE => [], self::SIGN => \false]; - } - $temp = self::subtractHelper($x_value, \false, $y_value, \false); - $temp[self::SIGN] = self::compareHelper($x_value, \false, $y_value, \false) > 0 ? $x_negative : $y_negative; - return $temp; - } - if ($x_size < $y_size) { - $size = $x_size; - $value = $y_value; - } else { - $size = $y_size; - $value = $x_value; - } - $value[\count($value)] = 0; - // just in case the carry adds an extra digit - $carry = 0; - for ($i = 0, $j = 1; $j < $size; $i += 2, $j += 2) { - //$sum = $x_value[$j] * static::BASE_FULL + $x_value[$i] + $y_value[$j] * static::BASE_FULL + $y_value[$i] + $carry; - $sum = ($x_value[$j] + $y_value[$j]) * static::BASE_FULL + $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= static::MAX_DIGIT2; - // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum - static::MAX_DIGIT2 : $sum; - $temp = static::BASE === 26 ? \intval($sum / 0x4000000) : $sum >> 31; - $value[$i] = (int) ($sum - static::BASE_FULL * $temp); - // eg. a faster alternative to fmod($sum, 0x4000000) - $value[$j] = $temp; - } - if ($j == $size) { - // ie. if $y_size is odd - $sum = $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= static::BASE_FULL; - $value[$i] = $carry ? $sum - static::BASE_FULL : $sum; - ++$i; - // ie. let $i = $j since we've just done $value[$i] - } - if ($carry) { - for (; $value[$i] == static::MAX_DIGIT; ++$i) { - $value[$i] = 0; - } - ++$value[$i]; - } - return [self::VALUE => self::trim($value), self::SIGN => $x_negative]; - } - /** - * Performs subtraction. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return array - */ - public static function subtractHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - $x_size = \count($x_value); - $y_size = \count($y_value); - if ($x_size == 0) { - return [self::VALUE => $y_value, self::SIGN => !$y_negative]; - } elseif ($y_size == 0) { - return [self::VALUE => $x_value, self::SIGN => $x_negative]; - } - // add, if appropriate (ie. -$x - +$y or +$x - -$y) - if ($x_negative != $y_negative) { - $temp = self::addHelper($x_value, \false, $y_value, \false); - $temp[self::SIGN] = $x_negative; - return $temp; - } - $diff = self::compareHelper($x_value, $x_negative, $y_value, $y_negative); - if (!$diff) { - return [self::VALUE => [], self::SIGN => \false]; - } - // switch $x and $y around, if appropriate. - if (!$x_negative && $diff < 0 || $x_negative && $diff > 0) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - $x_negative = !$x_negative; - $x_size = \count($x_value); - $y_size = \count($y_value); - } - // at this point, $x_value should be at least as big as - if not bigger than - $y_value - $carry = 0; - for ($i = 0, $j = 1; $j < $y_size; $i += 2, $j += 2) { - $sum = ($x_value[$j] - $y_value[$j]) * static::BASE_FULL + $x_value[$i] - $y_value[$i] - $carry; - $carry = $sum < 0; - // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum + static::MAX_DIGIT2 : $sum; - $temp = static::BASE === 26 ? \intval($sum / 0x4000000) : $sum >> 31; - $x_value[$i] = (int) ($sum - static::BASE_FULL * $temp); - $x_value[$j] = $temp; - } - if ($j == $y_size) { - // ie. if $y_size is odd - $sum = $x_value[$i] - $y_value[$i] - $carry; - $carry = $sum < 0; - $x_value[$i] = $carry ? $sum + static::BASE_FULL : $sum; - ++$i; - } - if ($carry) { - for (; !$x_value[$i]; ++$i) { - $x_value[$i] = static::MAX_DIGIT; - } - --$x_value[$i]; - } - return [self::VALUE => self::trim($x_value), self::SIGN => $x_negative]; - } - /** - * Performs multiplication. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return array - */ - protected static function multiplyHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - //if ( $x_value == $y_value ) { - // return [ - // self::VALUE => self::square($x_value), - // self::SIGN => $x_sign != $y_value - // ]; - //} - $x_length = \count($x_value); - $y_length = \count($y_value); - if (!$x_length || !$y_length) { - // a 0 is being multiplied - return [self::VALUE => [], self::SIGN => \false]; - } - return [self::VALUE => \min($x_length, $y_length) < 2 * self::KARATSUBA_CUTOFF ? self::trim(self::regularMultiply($x_value, $y_value)) : self::trim(self::karatsuba($x_value, $y_value)), self::SIGN => $x_negative != $y_negative]; - } - /** - * Performs Karatsuba multiplication on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. - * - * @param array $x_value - * @param array $y_value - * @return array - */ - private static function karatsuba(array $x_value, array $y_value) - { - $m = \min(\count($x_value) >> 1, \count($y_value) >> 1); - if ($m < self::KARATSUBA_CUTOFF) { - return self::regularMultiply($x_value, $y_value); - } - $x1 = \array_slice($x_value, $m); - $x0 = \array_slice($x_value, 0, $m); - $y1 = \array_slice($y_value, $m); - $y0 = \array_slice($y_value, 0, $m); - $z2 = self::karatsuba($x1, $y1); - $z0 = self::karatsuba($x0, $y0); - $z1 = self::addHelper($x1, \false, $x0, \false); - $temp = self::addHelper($y1, \false, $y0, \false); - $z1 = self::karatsuba($z1[self::VALUE], $temp[self::VALUE]); - $temp = self::addHelper($z2, \false, $z0, \false); - $z1 = self::subtractHelper($z1, \false, $temp[self::VALUE], \false); - $z2 = \array_merge(\array_fill(0, 2 * $m, 0), $z2); - $z1[self::VALUE] = \array_merge(\array_fill(0, $m, 0), $z1[self::VALUE]); - $xy = self::addHelper($z2, \false, $z1[self::VALUE], $z1[self::SIGN]); - $xy = self::addHelper($xy[self::VALUE], $xy[self::SIGN], $z0, \false); - return $xy[self::VALUE]; - } - /** - * Performs long multiplication on two BigIntegers - * - * Modeled after 'multiply' in MutableBigInteger.java. - * - * @param array $x_value - * @param array $y_value - * @return array - */ - protected static function regularMultiply(array $x_value, array $y_value) - { - $x_length = \count($x_value); - $y_length = \count($y_value); - if (!$x_length || !$y_length) { - // a 0 is being multiplied - return []; - } - $product_value = self::array_repeat(0, $x_length + $y_length); - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - $carry = 0; - for ($j = 0; $j < $x_length; ++$j) { - // ie. $i = 0 - $temp = $x_value[$j] * $y_value[0] + $carry; - // $product_value[$k] == 0 - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $product_value[$j] = (int) ($temp - static::BASE_FULL * $carry); - } - $product_value[$j] = $carry; - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $product_value[$k] = (int) ($temp - static::BASE_FULL * $carry); - } - $product_value[$k] = $carry; - } - return $product_value; - } - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @return array{static, static} - * @internal This function is based off of - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. - */ - protected function divideHelper(\phpseclib3\Math\BigInteger\Engines\PHP $y) - { - if (\count($y->value) == 1) { - list($q, $r) = $this->divide_digit($this->value, $y->value[0]); - $quotient = new static(); - $remainder = new static(); - $quotient->value = $q; - $remainder->value = [$r]; - $quotient->is_negative = $this->is_negative != $y->is_negative; - return [$this->normalize($quotient), $this->normalize($remainder)]; - } - $x = clone $this; - $y = clone $y; - $x_sign = $x->is_negative; - $y_sign = $y->is_negative; - $x->is_negative = $y->is_negative = \false; - $diff = $x->compare($y); - if (!$diff) { - $temp = new static(); - $temp->value = [1]; - $temp->is_negative = $x_sign != $y_sign; - return [$this->normalize($temp), $this->normalize(static::$zero[static::class])]; - } - if ($diff < 0) { - // if $x is negative, "add" $y. - if ($x_sign) { - $x = $y->subtract($x); - } - return [$this->normalize(static::$zero[static::class]), $this->normalize($x)]; - } - // normalize $x and $y as described in HAC 14.23 / 14.24 - $msb = $y->value[\count($y->value) - 1]; - for ($shift = 0; !($msb & static::MSB); ++$shift) { - $msb <<= 1; - } - $x->lshift($shift); - $y->lshift($shift); - $y_value =& $y->value; - $x_max = \count($x->value) - 1; - $y_max = \count($y->value) - 1; - $quotient = new static(); - $quotient_value =& $quotient->value; - $quotient_value = self::array_repeat(0, $x_max - $y_max + 1); - static $temp, $lhs, $rhs; - if (!isset($temp)) { - $temp = new static(); - $lhs = new static(); - $rhs = new static(); - } - if (static::class != \get_class($temp)) { - $temp = new static(); - $lhs = new static(); - $rhs = new static(); - } - $temp_value =& $temp->value; - $rhs_value =& $rhs->value; - // $temp = $y << ($x_max - $y_max-1) in base 2**26 - $temp_value = \array_merge(self::array_repeat(0, $x_max - $y_max), $y_value); - while ($x->compare($temp) >= 0) { - // calculate the "common residue" - ++$quotient_value[$x_max - $y_max]; - $x = $x->subtract($temp); - $x_max = \count($x->value) - 1; - } - for ($i = $x_max; $i >= $y_max + 1; --$i) { - $x_value =& $x->value; - $x_window = [isset($x_value[$i]) ? $x_value[$i] : 0, isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0]; - $y_window = [$y_value[$y_max], $y_max > 0 ? $y_value[$y_max - 1] : 0]; - $q_index = $i - $y_max - 1; - if ($x_window[0] == $y_window[0]) { - $quotient_value[$q_index] = static::MAX_DIGIT; - } else { - $quotient_value[$q_index] = self::safe_divide($x_window[0] * static::BASE_FULL + $x_window[1], $y_window[0]); - } - $temp_value = [$y_window[1], $y_window[0]]; - $lhs->value = [$quotient_value[$q_index]]; - $lhs = $lhs->multiply($temp); - $rhs_value = [$x_window[2], $x_window[1], $x_window[0]]; - while ($lhs->compare($rhs) > 0) { - --$quotient_value[$q_index]; - $lhs->value = [$quotient_value[$q_index]]; - $lhs = $lhs->multiply($temp); - } - $adjust = self::array_repeat(0, $q_index); - $temp_value = [$quotient_value[$q_index]]; - $temp = $temp->multiply($y); - $temp_value =& $temp->value; - if (\count($temp_value)) { - $temp_value = \array_merge($adjust, $temp_value); - } - $x = $x->subtract($temp); - if ($x->compare(static::$zero[static::class]) < 0) { - $temp_value = \array_merge($adjust, $y_value); - $x = $x->add($temp); - --$quotient_value[$q_index]; - } - $x_max = \count($x_value) - 1; - } - // unnormalize the remainder - $x->rshift($shift); - $quotient->is_negative = $x_sign != $y_sign; - // calculate the "common residue", if appropriate - if ($x_sign) { - $y->rshift($shift); - $x = $y->subtract($x); - } - return [$this->normalize($quotient), $this->normalize($x)]; - } - /** - * Divides a BigInteger by a regular integer - * - * abc / x = a00 / x + b0 / x + c / x - * - * @param array $dividend - * @param int $divisor - * @return array - */ - private static function divide_digit(array $dividend, $divisor) - { - $carry = 0; - $result = []; - for ($i = \count($dividend) - 1; $i >= 0; --$i) { - $temp = static::BASE_FULL * $carry + $dividend[$i]; - $result[$i] = self::safe_divide($temp, $divisor); - $carry = (int) ($temp - $divisor * $result[$i]); - } - return [$result, $carry]; - } - /** - * Single digit division - * - * Even if int64 is being used the division operator will return a float64 value - * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't - * have the precision of int64 this is a problem so, when int64 is being used, - * we'll guarantee that the dividend is divisible by first subtracting the remainder. - * - * @param int $x - * @param int $y - * @return int - */ - private static function safe_divide($x, $y) - { - if (static::BASE === 26) { - return (int) ($x / $y); - } - // static::BASE === 31 - /** @var int */ - return ($x - $x % $y) / $y; - } - /** - * Convert an array / boolean to a PHP BigInteger object - * - * @param array $arr - * @return static - */ - protected function convertToObj(array $arr) - { - $result = new static(); - $result->value = $arr[self::VALUE]; - $result->is_negative = $arr[self::SIGN]; - return $this->normalize($result); - } - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param PHP $result - * @return static - */ - protected function normalize(\phpseclib3\Math\BigInteger\Engines\PHP $result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - $value =& $result->value; - if (!\count($value)) { - $result->is_negative = \false; - return $result; - } - $value = static::trim($value); - if (!empty($result->bitmask->value)) { - $length = \min(\count($value), \count($result->bitmask->value)); - $value = \array_slice($value, 0, $length); - for ($i = 0; $i < $length; ++$i) { - $value[$i] = $value[$i] & $result->bitmask->value[$i]; - } - $value = static::trim($value); - } - return $result; - } - /** - * Compares two numbers. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return int - * @see static::compare() - */ - protected static function compareHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - if ($x_negative != $y_negative) { - return !$x_negative && $y_negative ? 1 : -1; - } - $result = $x_negative ? -1 : 1; - if (\count($x_value) != \count($y_value)) { - return \count($x_value) > \count($y_value) ? $result : -$result; - } - $size = \max(\count($x_value), \count($y_value)); - $x_value = \array_pad($x_value, $size, 0); - $y_value = \array_pad($y_value, $size, 0); - for ($i = \count($x_value) - 1; $i >= 0; --$i) { - if ($x_value[$i] != $y_value[$i]) { - return $x_value[$i] > $y_value[$i] ? $result : -$result; - } - } - return 0; - } - /** - * Absolute value. - * - * @return PHP - */ - public function abs() - { - $temp = new static(); - $temp->value = $this->value; - return $temp; - } - /** - * Trim - * - * Removes leading zeros - * - * @param list $value - * @return list - */ - protected static function trim(array $value) - { - for ($i = \count($value) - 1; $i >= 0; --$i) { - if ($value[$i]) { - break; - } - unset($value[$i]); - } - return $value; - } - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return PHP - */ - public function bitwise_rightShift($shift) - { - $temp = new static(); - // could just replace lshift with this, but then all lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->rshift($shift); - return $this->normalize($temp); - } - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return PHP - */ - public function bitwise_leftShift($shift) - { - $temp = new static(); - // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->lshift($shift); - return $this->normalize($temp); - } - /** - * Converts 32-bit integers to bytes. - * - * @param int $x - * @return string - */ - private static function int2bytes($x) - { - return \ltrim(\pack('N', $x), \chr(0)); - } - /** - * Array Repeat - * - * @param int $input - * @param int $multiplier - * @return array - */ - protected static function array_repeat($input, $multiplier) - { - return $multiplier ? \array_fill(0, $multiplier, $input) : []; - } - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param int $shift - */ - protected function lshift($shift) - { - if ($shift == 0) { - return; - } - $num_digits = (int) ($shift / static::BASE); - $shift %= static::BASE; - $shift = 1 << $shift; - $carry = 0; - for ($i = 0; $i < \count($this->value); ++$i) { - $temp = $this->value[$i] * $shift + $carry; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $this->value[$i] = (int) ($temp - $carry * static::BASE_FULL); - } - if ($carry) { - $this->value[\count($this->value)] = $carry; - } - while ($num_digits--) { - \array_unshift($this->value, 0); - } - } - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param int $shift - */ - protected function rshift($shift) - { - if ($shift == 0) { - return; - } - $num_digits = (int) ($shift / static::BASE); - $shift %= static::BASE; - $carry_shift = static::BASE - $shift; - $carry_mask = (1 << $shift) - 1; - if ($num_digits) { - $this->value = \array_slice($this->value, $num_digits); - } - $carry = 0; - for ($i = \count($this->value) - 1; $i >= 0; --$i) { - $temp = $this->value[$i] >> $shift | $carry; - $carry = ($this->value[$i] & $carry_mask) << $carry_shift; - $this->value[$i] = $temp; - } - $this->value = static::trim($this->value); - } - /** - * Performs modular exponentiation. - * - * @param PHP $e - * @param PHP $n - * @return PHP - */ - protected function powModInner(\phpseclib3\Math\BigInteger\Engines\PHP $e, \phpseclib3\Math\BigInteger\Engines\PHP $n) - { - try { - $class = static::$modexpEngine[static::class]; - return $class::powModHelper($this, $e, $n, static::class); - } catch (\Exception $err) { - return \phpseclib3\Math\BigInteger\Engines\PHP\DefaultEngine::powModHelper($this, $e, $n, static::class); - } - } - /** - * Performs squaring - * - * @param list $x - * @return list - */ - protected static function square(array $x) - { - return \count($x) < 2 * self::KARATSUBA_CUTOFF ? self::trim(self::baseSquare($x)) : self::trim(self::karatsubaSquare($x)); - } - /** - * Performs traditional squaring on two BigIntegers - * - * Squaring can be done faster than multiplying a number by itself can be. See - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. - * - * @param array $value - * @return array - */ - protected static function baseSquare(array $value) - { - if (empty($value)) { - return []; - } - $square_value = self::array_repeat(0, 2 * \count($value)); - for ($i = 0, $max_index = \count($value) - 1; $i <= $max_index; ++$i) { - $i2 = $i << 1; - $temp = $square_value[$i2] + $value[$i] * $value[$i]; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $square_value[$i2] = (int) ($temp - static::BASE_FULL * $carry); - // note how we start from $i+1 instead of 0 as we do in multiplication. - for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { - $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $square_value[$k] = (int) ($temp - static::BASE_FULL * $carry); - } - // the following line can yield values larger 2**15. at this point, PHP should switch - // over to floats. - $square_value[$i + $max_index + 1] = $carry; - } - return $square_value; - } - /** - * Performs Karatsuba "squaring" on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. - * - * @param array $value - * @return array - */ - protected static function karatsubaSquare(array $value) - { - $m = \count($value) >> 1; - if ($m < self::KARATSUBA_CUTOFF) { - return self::baseSquare($value); - } - $x1 = \array_slice($value, $m); - $x0 = \array_slice($value, 0, $m); - $z2 = self::karatsubaSquare($x1); - $z0 = self::karatsubaSquare($x0); - $z1 = self::addHelper($x1, \false, $x0, \false); - $z1 = self::karatsubaSquare($z1[self::VALUE]); - $temp = self::addHelper($z2, \false, $z0, \false); - $z1 = self::subtractHelper($z1, \false, $temp[self::VALUE], \false); - $z2 = \array_merge(\array_fill(0, 2 * $m, 0), $z2); - $z1[self::VALUE] = \array_merge(\array_fill(0, $m, 0), $z1[self::VALUE]); - $xx = self::addHelper($z2, \false, $z1[self::VALUE], $z1[self::SIGN]); - $xx = self::addHelper($xx[self::VALUE], $xx[self::SIGN], $z0, \false); - return $xx[self::VALUE]; - } - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see self::randomPrime() - */ - protected function make_odd() - { - $this->value[0] |= 1; - } - /** - * Test the number against small primes. - * - * @see self::isPrime() - */ - protected function testSmallPrimes() - { - if ($this->value == [1]) { - return \false; - } - if ($this->value == [2]) { - return \true; - } - if (~$this->value[0] & 1) { - return \false; - } - $value = $this->value; - foreach (static::PRIMES as $prime) { - list(, $r) = self::divide_digit($value, $prime); - if (!$r) { - return \count($value) == 1 && $value[0] == $prime; - } - } - return \true; - } - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param PHP $r - * @return int - * @see self::isPrime() - */ - public static function scan1divide(\phpseclib3\Math\BigInteger\Engines\PHP $r) - { - $r_value =& $r->value; - for ($i = 0, $r_length = \count($r_value); $i < $r_length; ++$i) { - $temp = ~$r_value[$i] & static::MAX_DIGIT; - for ($j = 1; $temp >> $j & 1; ++$j) { - } - if ($j <= static::BASE) { - break; - } - } - $s = static::BASE * $i + $j; - $r->rshift($s); - return $s; - } - /** - * Performs exponentiation. - * - * @param PHP $n - * @return PHP - */ - protected function powHelper(\phpseclib3\Math\BigInteger\Engines\PHP $n) - { - if ($n->compare(static::$zero[static::class]) == 0) { - return new static(1); - } - // n^0 = 1 - $temp = clone $this; - while (!$n->equals(static::$one[static::class])) { - $temp = $temp->multiply($this); - $n = $n->subtract(static::$one[static::class]); - } - return $temp; - } - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return (bool) ($this->value[0] & 1); - } - /** - * Tests if a bit is set - * - * @return bool - */ - public function testBit($x) - { - $digit = (int) \floor($x / static::BASE); - $bit = $x % static::BASE; - if (!isset($this->value[$digit])) { - return \false; - } - return (bool) ($this->value[$digit] & 1 << $bit); - } - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return $this->is_negative; - } - /** - * Negate - * - * Given $k, returns -$k - * - * @return static - */ - public function negate() - { - $temp = clone $this; - $temp->is_negative = !$temp->is_negative; - return $temp; - } - /** - * Bitwise Split - * - * Splits BigInteger's into chunks of $split bits - * - * @param int $split - * @return list - */ - public function bitwise_split($split) - { - if ($split < 1) { - throw new \RuntimeException('Offset must be greater than 1'); - } - $width = (int) ($split / static::BASE); - if (!$width) { - $arr = $this->bitwise_small_split($split); - return \array_map(function ($digit) { - $temp = new static(); - $temp->value = $digit != 0 ? [$digit] : []; - return $temp; - }, $arr); - } - $vals = []; - $val = $this->value; - $i = $overflow = 0; - $len = \count($val); - while ($i < $len) { - $digit = []; - if (!$overflow) { - $digit = \array_slice($val, $i, $width); - $i += $width; - $overflow = $split % static::BASE; - if ($overflow) { - $mask = (1 << $overflow) - 1; - $temp = isset($val[$i]) ? $val[$i] : 0; - $digit[] = $temp & $mask; - } - } else { - $remaining = static::BASE - $overflow; - $tempsplit = $split - $remaining; - $tempwidth = (int) ($tempsplit / static::BASE + 1); - $digit = \array_slice($val, $i, $tempwidth); - $i += $tempwidth; - $tempoverflow = $tempsplit % static::BASE; - if ($tempoverflow) { - $tempmask = (1 << $tempoverflow) - 1; - $temp = isset($val[$i]) ? $val[$i] : 0; - $digit[] = $temp & $tempmask; - } - $newbits = 0; - for ($j = \count($digit) - 1; $j >= 0; $j--) { - $temp = $digit[$j] & $mask; - $digit[$j] = $digit[$j] >> $overflow | $newbits << $remaining; - $newbits = $temp; - } - $overflow = $tempoverflow; - $mask = $tempmask; - } - $temp = new static(); - $temp->value = static::trim($digit); - $vals[] = $temp; - } - return \array_reverse($vals); - } - /** - * Bitwise Split where $split < static::BASE - * - * @param int $split - * @return list - */ - private function bitwise_small_split($split) - { - $vals = []; - $val = $this->value; - $mask = (1 << $split) - 1; - $i = $overflow = 0; - $len = \count($val); - $val[] = 0; - $remaining = static::BASE; - while ($i != $len) { - $digit = $val[$i] & $mask; - $val[$i] >>= $split; - if (!$overflow) { - $remaining -= $split; - $overflow = $split <= $remaining ? 0 : $split - $remaining; - if (!$remaining) { - $i++; - $remaining = static::BASE; - $overflow = 0; - } - } elseif (++$i != $len) { - $tempmask = (1 << $overflow) - 1; - $digit |= ($val[$i] & $tempmask) << $remaining; - $val[$i] >>= $overflow; - $remaining = static::BASE - $overflow; - $overflow = $split <= $remaining ? 0 : $split - $remaining; - } - $vals[] = $digit; - } - while ($vals[\count($vals) - 1] == 0) { - unset($vals[\count($vals) - 1]); - } - return \array_reverse($vals); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php deleted file mode 100644 index 678719e..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php +++ /dev/null @@ -1,133 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP; - -use phpseclib3\Math\BigInteger\Engines\PHP; -/** - * PHP Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Base extends PHP -{ - /** - * Cache constants - * - * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. - * - */ - const VARIABLE = 0; - /** - * $cache[self::DATA] contains the cached data. - * - */ - const DATA = 1; - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return static::class != __CLASS__; - } - /** - * Performs modular exponentiation. - * - * The most naive approach to modular exponentiation has very unreasonable requirements, and - * and although the approach involving repeated squaring does vastly better, it, too, is impractical - * for our purposes. The reason being that division - by far the most complicated and time-consuming - * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. - * - * Modular reductions resolve this issue. Although an individual modular reduction takes more time - * then an individual division, when performed in succession (with the same modulo), they're a lot faster. - * - * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, - * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the - * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because - * the product of two odd numbers is odd), but what about when RSA isn't used? - * - * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a - * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the - * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, - * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and - * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. - * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. - * - * @param PHP $x - * @param PHP $e - * @param PHP $n - * @param string $class - * @return PHP - */ - protected static function powModHelper(PHP $x, PHP $e, PHP $n, $class) - { - if (empty($e->value)) { - $temp = new $class(); - $temp->value = [1]; - return $x->normalize($temp); - } - if ($e->value == [1]) { - list(, $temp) = $x->divide($n); - return $x->normalize($temp); - } - if ($e->value == [2]) { - $temp = new $class(); - $temp->value = $class::square($x->value); - list(, $temp) = $temp->divide($n); - return $x->normalize($temp); - } - return $x->normalize(static::slidingWindow($x, $e, $n, $class)); - } - /** - * Modular reduction preparation - * - * @param array $x - * @param array $n - * @param string $class - * @see self::slidingWindow() - * @return array - */ - protected static function prepareReduce(array $x, array $n, $class) - { - return static::reduce($x, $n, $class); - } - /** - * Modular multiply - * - * @param array $x - * @param array $y - * @param array $n - * @param string $class - * @see self::slidingWindow() - * @return array - */ - protected static function multiplyReduce(array $x, array $y, array $n, $class) - { - $temp = $class::multiplyHelper($x, \false, $y, \false); - return static::reduce($temp[self::VALUE], $n, $class); - } - /** - * Modular square - * - * @param array $x - * @param array $n - * @param string $class - * @see self::slidingWindow() - * @return array - */ - protected static function squareReduce(array $x, array $n, $class) - { - return static::reduce($class::square($x), $n, $class); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php deleted file mode 100644 index 0524bc7..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP; - -use phpseclib3\Math\BigInteger\Engines\PHP\Reductions\EvalBarrett; -/** - * PHP Default Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class DefaultEngine extends EvalBarrett -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php deleted file mode 100644 index eb20d68..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP; - -use phpseclib3\Math\BigInteger\Engines\Engine; -use phpseclib3\Math\BigInteger\Engines\PHP; -use phpseclib3\Math\BigInteger\Engines\PHP\Reductions\PowerOfTwo; -/** - * PHP Montgomery Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Montgomery extends \phpseclib3\Math\BigInteger\Engines\PHP\Base -{ - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return static::class != __CLASS__; - } - /** - * Performs modular exponentiation. - * - * @template T of Engine - * @param Engine $x - * @param Engine $e - * @param Engine $n - * @param class-string $class - * @return T - */ - protected static function slidingWindow(Engine $x, Engine $e, Engine $n, $class) - { - // is the modulo odd? - if ($n->value[0] & 1) { - return parent::slidingWindow($x, $e, $n, $class); - } - // if it's not, it's even - // find the lowest set bit (eg. the max pow of 2 that divides $n) - for ($i = 0; $i < \count($n->value); ++$i) { - if ($n->value[$i]) { - $temp = \decbin($n->value[$i]); - $j = \strlen($temp) - \strrpos($temp, '1') - 1; - $j += $class::BASE * $i; - break; - } - } - // at this point, 2^$j * $n/(2^$j) == $n - $mod1 = clone $n; - $mod1->rshift($j); - $mod2 = new $class(); - $mod2->value = [1]; - $mod2->lshift($j); - $part1 = $mod1->value != [1] ? parent::slidingWindow($x, $e, $mod1, $class) : new $class(); - $part2 = PowerOfTwo::slidingWindow($x, $e, $mod2, $class); - $y1 = $mod2->modInverse($mod1); - $y2 = $mod1->modInverse($mod2); - $result = $part1->multiply($mod2); - $result = $result->multiply($y1); - $temp = $part2->multiply($mod1); - $temp = $temp->multiply($y2); - $result = $result->add($temp); - list(, $result) = $result->divide($n); - return $result; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php deleted file mode 100644 index 92ed520..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP; - -use phpseclib3\Math\BigInteger\Engines\OpenSSL as Progenitor; -/** - * OpenSSL Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class OpenSSL extends Progenitor -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php deleted file mode 100644 index 0174d27..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php +++ /dev/null @@ -1,239 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use phpseclib3\Math\BigInteger\Engines\PHP; -use phpseclib3\Math\BigInteger\Engines\PHP\Base; -/** - * PHP Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Barrett extends Base -{ - /** - * Barrett Modular Reduction - * - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, - * so as not to require negative numbers (initially, this script didn't support negative numbers). - * - * Employs "folding", as described at - * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from - * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." - * - * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that - * usable on account of (1) its not using reasonable radix points as discussed in - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable - * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that - * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line - * comments for details. - * - * @param array $n - * @param array $m - * @param class-string $class - * @return array - */ - protected static function reduce(array $n, array $m, $class) - { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $m_length = \count($m); - // if (self::compareHelper($n, $static::square($m)) >= 0) { - if (\count($n) > 2 * $m_length) { - $lhs = new $class(); - $rhs = new $class(); - $lhs->value = $n; - $rhs->value = $m; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced - if ($m_length < 5) { - return self::regularBarrett($n, $m, $class); - } - // n = 2 * m.length - if (($key = \array_search($m, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $m; - $lhs = new $class(); - $lhs_value =& $lhs->value; - $lhs_value = self::array_repeat(0, $m_length + ($m_length >> 1)); - $lhs_value[] = 1; - $rhs = new $class(); - $rhs->value = $m; - list($u, $m1) = $lhs->divide($rhs); - $u = $u->value; - $m1 = $m1->value; - $cache[self::DATA][] = [ - 'u' => $u, - // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1' => $m1, - ]; - } else { - \extract($cache[self::DATA][$key]); - } - $cutoff = $m_length + ($m_length >> 1); - $lsd = \array_slice($n, 0, $cutoff); - // m.length + (m.length >> 1) - $msd = \array_slice($n, $cutoff); - // m.length >> 1 - $lsd = self::trim($lsd); - $temp = $class::multiplyHelper($msd, \false, $m1, \false); - // m.length + (m.length >> 1) - $n = $class::addHelper($lsd, \false, $temp[self::VALUE], \false); - // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) - //if ($m_length & 1) { - // return self::regularBarrett($n[self::VALUE], $m, $class); - //} - // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = \array_slice($n[self::VALUE], $m_length - 1); - // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 - // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - $temp = $class::multiplyHelper($temp, \false, $u, \false); - // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 - // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = \array_slice($temp[self::VALUE], ($m_length >> 1) + 1); - // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 - // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = $class::multiplyHelper($temp, \false, $m, \false); - // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit - // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop - // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - $result = $class::subtractHelper($n[self::VALUE], \false, $temp[self::VALUE], \false); - while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $m, \false) >= 0) { - $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $m, \false); - } - return $result[self::VALUE]; - } - /** - * (Regular) Barrett Modular Reduction - * - * For numbers with more than four digits BigInteger::_barrett() is faster. The difference between that and this - * is that this function does not fold the denominator into a smaller form. - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - private static function regularBarrett(array $x, array $n, $class) - { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $n_length = \count($n); - if (\count($x) > 2 * $n_length) { - $lhs = new $class(); - $rhs = new $class(); - $lhs->value = $x; - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - if (($key = \array_search($n, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $n; - $lhs = new $class(); - $lhs_value =& $lhs->value; - $lhs_value = self::array_repeat(0, 2 * $n_length); - $lhs_value[] = 1; - $rhs = new $class(); - $rhs->value = $n; - list($temp, ) = $lhs->divide($rhs); - // m.length - $cache[self::DATA][] = $temp->value; - } - // 2 * m.length - (m.length - 1) = m.length + 1 - $temp = \array_slice($x, $n_length - 1); - // (m.length + 1) + m.length = 2 * m.length + 1 - $temp = $class::multiplyHelper($temp, \false, $cache[self::DATA][$key], \false); - // (2 * m.length + 1) - (m.length - 1) = m.length + 2 - $temp = \array_slice($temp[self::VALUE], $n_length + 1); - // m.length + 1 - $result = \array_slice($x, 0, $n_length + 1); - // m.length + 1 - $temp = self::multiplyLower($temp, \false, $n, \false, $n_length + 1, $class); - // $temp == array_slice($class::regularMultiply($temp, false, $n, false)->value, 0, $n_length + 1) - if (self::compareHelper($result, \false, $temp[self::VALUE], $temp[self::SIGN]) < 0) { - $corrector_value = self::array_repeat(0, $n_length + 1); - $corrector_value[\count($corrector_value)] = 1; - $result = $class::addHelper($result, \false, $corrector_value, \false); - $result = $result[self::VALUE]; - } - // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits - $result = $class::subtractHelper($result, \false, $temp[self::VALUE], $temp[self::SIGN]); - while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $n, \false) > 0) { - $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $n, \false); - } - return $result[self::VALUE]; - } - /** - * Performs long multiplication up to $stop digits - * - * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. - * - * @see self::regularBarrett() - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @param int $stop - * @param string $class - * @return array - */ - private static function multiplyLower(array $x_value, $x_negative, array $y_value, $y_negative, $stop, $class) - { - $x_length = \count($x_value); - $y_length = \count($y_value); - if (!$x_length || !$y_length) { - // a 0 is being multiplied - return [self::VALUE => [], self::SIGN => \false]; - } - if ($x_length < $y_length) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - $x_length = \count($x_value); - $y_length = \count($y_value); - } - $product_value = self::array_repeat(0, $x_length + $y_length); - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - $carry = 0; - for ($j = 0; $j < $x_length; ++$j) { - // ie. $i = 0, $k = $i - $temp = $x_value[$j] * $y_value[0] + $carry; - // $product_value[$k] == 0 - $carry = $class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $product_value[$j] = (int) ($temp - $class::BASE_FULL * $carry); - } - if ($j < $stop) { - $product_value[$j] = $carry; - } - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = $class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $product_value[$k] = (int) ($temp - $class::BASE_FULL * $carry); - } - if ($k < $stop) { - $product_value[$k] = $carry; - } - } - return [self::VALUE => self::trim($product_value), self::SIGN => $x_negative != $y_negative]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php deleted file mode 100644 index 4df992d..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use phpseclib3\Math\BigInteger\Engines\PHP\Base; -/** - * PHP Classic Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Classic extends Base -{ - /** - * Regular Division - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function reduce(array $x, array $n, $class) - { - $lhs = new $class(); - $lhs->value = $x; - $rhs = new $class(); - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php deleted file mode 100644 index 305073a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php +++ /dev/null @@ -1,412 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use phpseclib3\Math\BigInteger\Engines\PHP; -use phpseclib3\Math\BigInteger\Engines\PHP\Base; -/** - * PHP Dynamic Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class EvalBarrett extends Base -{ - /** - * Custom Reduction Function - * - * @see self::generateCustomReduction - */ - private static $custom_reduction; - /** - * Barrett Modular Reduction - * - * This calls a dynamically generated loop unrolled function that's specific to a given modulo. - * Array lookups are avoided as are if statements testing for how many bits the host OS supports, etc. - * - * @param array $n - * @param array $m - * @param string $class - * @return array - */ - protected static function reduce(array $n, array $m, $class) - { - $inline = self::$custom_reduction; - return $inline($n); - } - /** - * Generate Custom Reduction - * - * @param PHP $m - * @param string $class - * @return callable - */ - protected static function generateCustomReduction(PHP $m, $class) - { - $m_length = \count($m->value); - if ($m_length < 5) { - $code = ' - $lhs = new ' . $class . '(); - $lhs->value = $x; - $rhs = new ' . $class . '(); - $rhs->value = [' . \implode(',', \array_map(self::class . '::float2string', $m->value)) . ']; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - '; - eval('$func = function ($x) { ' . $code . '};'); - self::$custom_reduction = $func; - //self::$custom_reduction = \Closure::bind($func, $m, $class); - return $func; - } - $lhs = new $class(); - $lhs_value =& $lhs->value; - $lhs_value = self::array_repeat(0, $m_length + ($m_length >> 1)); - $lhs_value[] = 1; - $rhs = new $class(); - list($u, $m1) = $lhs->divide($m); - if ($class::BASE != 26) { - $u = $u->value; - } else { - $lhs_value = self::array_repeat(0, 2 * $m_length); - $lhs_value[] = 1; - $rhs = new $class(); - list($u) = $lhs->divide($m); - $u = $u->value; - } - $m = $m->value; - $m1 = $m1->value; - $cutoff = \count($m) + (\count($m) >> 1); - $code = ' - if (count($n) > ' . 2 * \count($m) . ') { - $lhs = new ' . $class . '(); - $rhs = new ' . $class . '(); - $lhs->value = $n; - $rhs->value = [' . \implode(',', \array_map(self::class . '::float2string', $m)) . ']; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - $lsd = array_slice($n, 0, ' . $cutoff . '); - $msd = array_slice($n, ' . $cutoff . ');'; - $code .= self::generateInlineTrim('msd'); - $code .= self::generateInlineMultiply('msd', $m1, 'temp', $class); - $code .= self::generateInlineAdd('lsd', 'temp', 'n', $class); - $code .= '$temp = array_slice($n, ' . (\count($m) - 1) . ');'; - $code .= self::generateInlineMultiply('temp', $u, 'temp2', $class); - $code .= self::generateInlineTrim('temp2'); - $code .= $class::BASE == 26 ? '$temp = array_slice($temp2, ' . (\count($m) + 1) . ');' : '$temp = array_slice($temp2, ' . ((\count($m) >> 1) + 1) . ');'; - $code .= self::generateInlineMultiply('temp', $m, 'temp2', $class); - $code .= self::generateInlineTrim('temp2'); - /* - if ($class::BASE == 26) { - $code.= '$n = array_slice($n, 0, ' . (count($m) + 1) . '); - $temp2 = array_slice($temp2, 0, ' . (count($m) + 1) . ');'; - } - */ - $code .= self::generateInlineSubtract2('n', 'temp2', 'temp', $class); - $subcode = self::generateInlineSubtract1('temp', $m, 'temp2', $class); - $subcode .= '$temp = $temp2;'; - $code .= self::generateInlineCompare($m, 'temp', $subcode); - $code .= 'return $temp;'; - eval('$func = function ($n) { ' . $code . '};'); - self::$custom_reduction = $func; - return $func; - //self::$custom_reduction = \Closure::bind($func, $m, $class); - } - /** - * Inline Trim - * - * Removes leading zeros - * - * @param string $name - * @return string - */ - private static function generateInlineTrim($name) - { - return ' - for ($i = count($' . $name . ') - 1; $i >= 0; --$i) { - if ($' . $name . '[$i]) { - break; - } - unset($' . $name . '[$i]); - }'; - } - /** - * Inline Multiply (unknown, known) - * - * @param string $input - * @param array $arr - * @param string $output - * @param string $class - * @return string - */ - private static function generateInlineMultiply($input, array $arr, $output, $class) - { - if (!\count($arr)) { - return 'return [];'; - } - $regular = ' - $length = count($' . $input . '); - if (!$length) { - $' . $output . ' = []; - }else{ - $' . $output . ' = array_fill(0, $length + ' . \count($arr) . ', 0); - $carry = 0;'; - for ($i = 0; $i < \count($arr); $i++) { - $regular .= ' - $subtemp = $' . $input . '[0] * ' . $arr[$i]; - $regular .= $i ? ' + $carry;' : ';'; - $regular .= '$carry = '; - $regular .= $class::BASE === 26 ? 'intval($subtemp / 0x4000000);' : '$subtemp >> 31;'; - $regular .= '$' . $output . '[' . $i . '] = '; - if ($class::BASE === 26) { - $regular .= '(int) ('; - } - $regular .= '$subtemp - ' . $class::BASE_FULL . ' * $carry'; - $regular .= $class::BASE === 26 ? ');' : ';'; - } - $regular .= '$' . $output . '[' . \count($arr) . '] = $carry;'; - $regular .= ' - for ($i = 1; $i < $length; ++$i) {'; - for ($j = 0; $j < \count($arr); $j++) { - $regular .= $j ? '$k++;' : '$k = $i;'; - $regular .= ' - $subtemp = $' . $output . '[$k] + $' . $input . '[$i] * ' . $arr[$j]; - $regular .= $j ? ' + $carry;' : ';'; - $regular .= '$carry = '; - $regular .= $class::BASE === 26 ? 'intval($subtemp / 0x4000000);' : '$subtemp >> 31;'; - $regular .= '$' . $output . '[$k] = '; - if ($class::BASE === 26) { - $regular .= '(int) ('; - } - $regular .= '$subtemp - ' . $class::BASE_FULL . ' * $carry'; - $regular .= $class::BASE === 26 ? ');' : ';'; - } - $regular .= '$' . $output . '[++$k] = $carry; $carry = 0;'; - $regular .= '}}'; - //if (count($arr) < 2 * self::KARATSUBA_CUTOFF) { - //} - return $regular; - } - /** - * Inline Addition - * - * @param string $x - * @param string $y - * @param string $result - * @param string $class - * @return string - */ - private static function generateInlineAdd($x, $y, $result, $class) - { - $code = ' - $length = max(count($' . $x . '), count($' . $y . ')); - $' . $result . ' = array_pad($' . $x . ', $length + 1, 0); - $_' . $y . ' = array_pad($' . $y . ', $length, 0); - $carry = 0; - for ($i = 0, $j = 1; $j < $length; $i+=2, $j+=2) { - $sum = ($' . $result . '[$j] + $_' . $y . '[$j]) * ' . $class::BASE_FULL . ' - + $' . $result . '[$i] + $_' . $y . '[$i] + - $carry; - $carry = $sum >= ' . self::float2string($class::MAX_DIGIT2) . '; - $sum = $carry ? $sum - ' . self::float2string($class::MAX_DIGIT2) . ' : $sum;'; - $code .= $class::BASE === 26 ? '$upper = intval($sum / 0x4000000); $' . $result . '[$i] = (int) ($sum - ' . $class::BASE_FULL . ' * $upper);' : '$upper = $sum >> 31; $' . $result . '[$i] = $sum - ' . $class::BASE_FULL . ' * $upper;'; - $code .= ' - $' . $result . '[$j] = $upper; - } - if ($j == $length) { - $sum = $' . $result . '[$i] + $_' . $y . '[$i] + $carry; - $carry = $sum >= ' . self::float2string($class::BASE_FULL) . '; - $' . $result . '[$i] = $carry ? $sum - ' . self::float2string($class::BASE_FULL) . ' : $sum; - ++$i; - } - if ($carry) { - for (; $' . $result . '[$i] == ' . $class::MAX_DIGIT . '; ++$i) { - $' . $result . '[$i] = 0; - } - ++$' . $result . '[$i]; - }'; - $code .= self::generateInlineTrim($result); - return $code; - } - /** - * Inline Subtraction 2 - * - * For when $known is more digits than $unknown. This is the harder use case to optimize for. - * - * @param string $known - * @param string $unknown - * @param string $result - * @param string $class - * @return string - */ - private static function generateInlineSubtract2($known, $unknown, $result, $class) - { - $code = ' - $' . $result . ' = $' . $known . '; - $carry = 0; - $size = count($' . $unknown . '); - for ($i = 0, $j = 1; $j < $size; $i+= 2, $j+= 2) { - $sum = ($' . $known . '[$j] - $' . $unknown . '[$j]) * ' . $class::BASE_FULL . ' + $' . $known . '[$i] - - $' . $unknown . '[$i] - - $carry; - $carry = $sum < 0; - if ($carry) { - $sum+= ' . self::float2string($class::MAX_DIGIT2) . '; - } - $subtemp = '; - $code .= $class::BASE === 26 ? 'intval($sum / 0x4000000);' : '$sum >> 31;'; - $code .= '$' . $result . '[$i] = '; - if ($class::BASE === 26) { - $code .= '(int) ('; - } - $code .= '$sum - ' . $class::BASE_FULL . ' * $subtemp'; - if ($class::BASE === 26) { - $code .= ')'; - } - $code .= '; - $' . $result . '[$j] = $subtemp; - } - if ($j == $size) { - $sum = $' . $known . '[$i] - $' . $unknown . '[$i] - $carry; - $carry = $sum < 0; - $' . $result . '[$i] = $carry ? $sum + ' . $class::BASE_FULL . ' : $sum; - ++$i; - } - - if ($carry) { - for (; !$' . $result . '[$i]; ++$i) { - $' . $result . '[$i] = ' . $class::MAX_DIGIT . '; - } - --$' . $result . '[$i]; - }'; - $code .= self::generateInlineTrim($result); - return $code; - } - /** - * Inline Subtraction 1 - * - * For when $unknown is more digits than $known. This is the easier use case to optimize for. - * - * @param string $unknown - * @param array $known - * @param string $result - * @param string $class - * @return string - */ - private static function generateInlineSubtract1($unknown, array $known, $result, $class) - { - $code = '$' . $result . ' = $' . $unknown . ';'; - for ($i = 0, $j = 1; $j < \count($known); $i += 2, $j += 2) { - $code .= '$sum = $' . $unknown . '[' . $j . '] * ' . $class::BASE_FULL . ' + $' . $unknown . '[' . $i . '] - '; - $code .= self::float2string($known[$j] * $class::BASE_FULL + $known[$i]); - if ($i != 0) { - $code .= ' - $carry'; - } - $code .= '; - if ($carry = $sum < 0) { - $sum+= ' . self::float2string($class::MAX_DIGIT2) . '; - } - $subtemp = '; - $code .= $class::BASE === 26 ? 'intval($sum / 0x4000000);' : '$sum >> 31;'; - $code .= ' - $' . $result . '[' . $i . '] = '; - if ($class::BASE === 26) { - $code .= ' (int) ('; - } - $code .= '$sum - ' . $class::BASE_FULL . ' * $subtemp'; - if ($class::BASE === 26) { - $code .= ')'; - } - $code .= '; - $' . $result . '[' . $j . '] = $subtemp;'; - } - $code .= '$i = ' . $i . ';'; - if ($j == \count($known)) { - $code .= ' - $sum = $' . $unknown . '[' . $i . '] - ' . $known[$i] . ' - $carry; - $carry = $sum < 0; - $' . $result . '[' . $i . '] = $carry ? $sum + ' . $class::BASE_FULL . ' : $sum; - ++$i;'; - } - $code .= ' - if ($carry) { - for (; !$' . $result . '[$i]; ++$i) { - $' . $result . '[$i] = ' . $class::MAX_DIGIT . '; - } - --$' . $result . '[$i]; - }'; - $code .= self::generateInlineTrim($result); - return $code; - } - /** - * Inline Comparison - * - * If $unknown >= $known then loop - * - * @param array $known - * @param string $unknown - * @param string $subcode - * @return string - */ - private static function generateInlineCompare(array $known, $unknown, $subcode) - { - $uniqid = \uniqid(); - $code = 'loop_' . $uniqid . ': - $clength = count($' . $unknown . '); - switch (true) { - case $clength < ' . \count($known) . ': - goto end_' . $uniqid . '; - case $clength > ' . \count($known) . ':'; - for ($i = \count($known) - 1; $i >= 0; $i--) { - $code .= ' - case $' . $unknown . '[' . $i . '] > ' . $known[$i] . ': - goto subcode_' . $uniqid . '; - case $' . $unknown . '[' . $i . '] < ' . $known[$i] . ': - goto end_' . $uniqid . ';'; - } - $code .= ' - default: - // do subcode - } - - subcode_' . $uniqid . ':' . $subcode . ' - goto loop_' . $uniqid . '; - - end_' . $uniqid . ':'; - return $code; - } - /** - * Convert a float to a string - * - * If you do echo floatval(pow(2, 52)) you'll get 4.6116860184274E+18. It /can/ be displayed without a loss of - * precision but displayed in this way there will be precision loss, hence the need for this method. - * - * @param int|float $num - * @return string - */ - private static function float2string($num) - { - if (!\is_float($num)) { - return (string) $num; - } - if ($num < 0) { - return '-' . self::float2string(\abs($num)); - } - $temp = ''; - while ($num) { - $temp = \fmod($num, 10) . $temp; - $num = \floor($num / 10); - } - return $temp; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php deleted file mode 100644 index b56a097..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php +++ /dev/null @@ -1,113 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use phpseclib3\Math\BigInteger\Engines\PHP\Montgomery as Progenitor; -/** - * PHP Montgomery Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Montgomery extends Progenitor -{ - /** - * Prepare a number for use in Montgomery Modular Reductions - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function prepareReduce(array $x, array $n, $class) - { - $lhs = new $class(); - $lhs->value = \array_merge(self::array_repeat(0, \count($n)), $x); - $rhs = new $class(); - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - /** - * Montgomery Multiply - * - * Interleaves the montgomery reduction and long multiplication algorithms together as described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function reduce(array $x, array $n, $class) - { - static $cache = [self::VARIABLE => [], self::DATA => []]; - if (($key = \array_search($n, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $x; - $cache[self::DATA][] = self::modInverse67108864($n, $class); - } - $k = \count($n); - $result = [self::VALUE => $x]; - for ($i = 0; $i < $k; ++$i) { - $temp = $result[self::VALUE][$i] * $cache[self::DATA][$key]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31); - $temp = $class::regularMultiply([$temp], $n); - $temp = \array_merge(self::array_repeat(0, $i), $temp); - $result = $class::addHelper($result[self::VALUE], \false, $temp, \false); - } - $result[self::VALUE] = \array_slice($result[self::VALUE], $k); - if (self::compareHelper($result, \false, $n, \false) >= 0) { - $result = $class::subtractHelper($result[self::VALUE], \false, $n, \false); - } - return $result[self::VALUE]; - } - /** - * Modular Inverse of a number mod 2**26 (eg. 67108864) - * - * Based off of the bnpInvDigit function implemented and justified in the following URL: - * - * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} - * - * The following URL provides more info: - * - * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} - * - * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For - * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields - * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't - * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that - * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the - * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to - * 40 bits, which only 64-bit floating points will support. - * - * Thanks to Pedro Gimeno Fortea for input! - * - * @param array $x - * @param string $class - * @return int - */ - protected static function modInverse67108864(array $x, $class) - { - $x = -$x[0]; - $result = $x & 0x3; - // x**-1 mod 2**2 - $result = $result * (2 - $x * $result) & 0xf; - // x**-1 mod 2**4 - $result = $result * (2 - ($x & 0xff) * $result) & 0xff; - // x**-1 mod 2**8 - $result = $result * (2 - ($x & 0xffff) * $result & 0xffff) & 0xffff; - // x**-1 mod 2**16 - $result = $class::BASE == 26 ? \fmod($result * (2 - \fmod($x * $result, $class::BASE_FULL)), $class::BASE_FULL) : $result * (2 - $x * $result % $class::BASE_FULL) % $class::BASE_FULL; - return $result & $class::MAX_DIGIT; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php deleted file mode 100644 index f8c0125..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use phpseclib3\Math\BigInteger\Engines\PHP; -/** - * PHP Montgomery Modular Exponentiation Engine with interleaved multiplication - * - * @author Jim Wigginton - */ -abstract class MontgomeryMult extends \phpseclib3\Math\BigInteger\Engines\PHP\Reductions\Montgomery -{ - /** - * Montgomery Multiply - * - * Interleaves the montgomery reduction and long multiplication algorithms together as described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} - * - * @see self::_prepMontgomery() - * @see self::_montgomery() - * @param array $x - * @param array $y - * @param array $m - * @param class-string $class - * @return array - */ - public static function multiplyReduce(array $x, array $y, array $m, $class) - { - // the following code, although not callable, can be run independently of the above code - // although the above code performed better in my benchmarks the following could might - // perform better under different circumstances. in lieu of deleting it it's just been - // made uncallable - static $cache = [self::VARIABLE => [], self::DATA => []]; - if (($key = \array_search($m, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $m; - $cache[self::DATA][] = self::modInverse67108864($m, $class); - } - $n = \max(\count($x), \count($y), \count($m)); - $x = \array_pad($x, $n, 0); - $y = \array_pad($y, $n, 0); - $m = \array_pad($m, $n, 0); - $a = [self::VALUE => self::array_repeat(0, $n + 1)]; - for ($i = 0; $i < $n; ++$i) { - $temp = $a[self::VALUE][0] + $x[$i] * $y[0]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31); - $temp = $temp * $cache[self::DATA][$key]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31); - $temp = $class::addHelper($class::regularMultiply([$x[$i]], $y), \false, $class::regularMultiply([$temp], $m), \false); - $a = $class::addHelper($a[self::VALUE], \false, $temp[self::VALUE], \false); - $a[self::VALUE] = \array_slice($a[self::VALUE], 1); - } - if (self::compareHelper($a[self::VALUE], \false, $m, \false) >= 0) { - $a = $class::subtractHelper($a[self::VALUE], \false, $m, \false); - } - return $a[self::VALUE]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php deleted file mode 100644 index 053fb7c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use phpseclib3\Math\BigInteger\Engines\PHP\Base; -/** - * PHP Power Of Two Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class PowerOfTwo extends Base -{ - /** - * Prepare a number for use in Montgomery Modular Reductions - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function prepareReduce(array $x, array $n, $class) - { - return self::reduce($x, $n, $class); - } - /** - * Power Of Two Reduction - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function reduce(array $x, array $n, $class) - { - $lhs = new $class(); - $lhs->value = $x; - $rhs = new $class(); - $rhs->value = $n; - $temp = new $class(); - $temp->value = [1]; - $result = $lhs->bitwise_and($rhs->subtract($temp)); - return $result->value; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php deleted file mode 100644 index 1d91c20..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php +++ /dev/null @@ -1,341 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -/** - * Pure-PHP 32-bit Engine. - * - * Uses 64-bit floats if int size is 4 bits - * - * @author Jim Wigginton - */ -class PHP32 extends \phpseclib3\Math\BigInteger\Engines\PHP -{ - // Constants used by PHP.php - const BASE = 26; - const BASE_FULL = 0x4000000; - const MAX_DIGIT = 0x3ffffff; - const MSB = 0x2000000; - /** - * MAX10 in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10 = 10000000; - /** - * MAX10LEN in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10LEN = 7; - const MAX_DIGIT2 = 4503599627370496; - /** - * Initialize a PHP32 BigInteger Engine instance - * - * @param int $base - * @see parent::initialize() - */ - protected function initialize($base) - { - if ($base != 256 && $base != -256) { - return parent::initialize($base); - } - $val = $this->value; - $this->value = []; - $vals =& $this->value; - $i = \strlen($val); - if (!$i) { - return; - } - while (\true) { - $i -= 4; - if ($i < 0) { - if ($i == -4) { - break; - } - $val = \substr($val, 0, 4 + $i); - $val = \str_pad($val, 4, "\x00", \STR_PAD_LEFT); - if ($val == "\x00\x00\x00\x00") { - break; - } - $i = 0; - } - list(, $digit) = \unpack('N', \substr($val, $i, 4)); - if ($digit < 0) { - $digit += 0xffffffff + 1; - } - $step = \count($vals) & 3; - if ($step) { - $digit = (int) \floor($digit / \pow(2, 2 * $step)); - } - if ($step != 3) { - $digit = (int) \fmod($digit, static::BASE_FULL); - $i++; - } - $vals[] = $digit; - } - while (\end($vals) === 0) { - \array_pop($vals); - } - \reset($vals); - } - /** - * Test for engine validity - * - * @see parent::__construct() - * @return bool - */ - public static function isValidEngine() - { - return \PHP_INT_SIZE >= 4; - } - /** - * Adds two BigIntegers. - * - * @param PHP32 $y - * @return PHP32 - */ - public function add(\phpseclib3\Math\BigInteger\Engines\PHP32 $y) - { - $temp = self::addHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - return $this->convertToObj($temp); - } - /** - * Subtracts two BigIntegers. - * - * @param PHP32 $y - * @return PHP32 - */ - public function subtract(\phpseclib3\Math\BigInteger\Engines\PHP32 $y) - { - $temp = self::subtractHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - return $this->convertToObj($temp); - } - /** - * Multiplies two BigIntegers. - * - * @param PHP32 $y - * @return PHP32 - */ - public function multiply(\phpseclib3\Math\BigInteger\Engines\PHP32 $y) - { - $temp = self::multiplyHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - return $this->convertToObj($temp); - } - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param PHP32 $y - * @return array{PHP32, PHP32} - */ - public function divide(\phpseclib3\Math\BigInteger\Engines\PHP32 $y) - { - return $this->divideHelper($y); - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP32 $n - * @return false|PHP32 - */ - public function modInverse(\phpseclib3\Math\BigInteger\Engines\PHP32 $n) - { - return $this->modInverseHelper($n); - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP32 $n - * @return PHP32[] - */ - public function extendedGCD(\phpseclib3\Math\BigInteger\Engines\PHP32 $n) - { - return $this->extendedGCDHelper($n); - } - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param PHP32 $n - * @return PHP32 - */ - public function gcd(\phpseclib3\Math\BigInteger\Engines\PHP32 $n) - { - return $this->extendedGCD($n)['gcd']; - } - /** - * Logical And - * - * @param PHP32 $x - * @return PHP32 - */ - public function bitwise_and(\phpseclib3\Math\BigInteger\Engines\PHP32 $x) - { - return $this->bitwiseAndHelper($x); - } - /** - * Logical Or - * - * @param PHP32 $x - * @return PHP32 - */ - public function bitwise_or(\phpseclib3\Math\BigInteger\Engines\PHP32 $x) - { - return $this->bitwiseOrHelper($x); - } - /** - * Logical Exclusive Or - * - * @param PHP32 $x - * @return PHP32 - */ - public function bitwise_xor(\phpseclib3\Math\BigInteger\Engines\PHP32 $x) - { - return $this->bitwiseXorHelper($x); - } - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is - * demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param PHP32 $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(\phpseclib3\Math\BigInteger\Engines\PHP32 $y) - { - return $this->compareHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - } - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param PHP32 $x - * @return bool - */ - public function equals(\phpseclib3\Math\BigInteger\Engines\PHP32 $x) - { - return $this->value === $x->value && $this->is_negative == $x->is_negative; - } - /** - * Performs modular exponentiation. - * - * @param PHP32 $e - * @param PHP32 $n - * @return PHP32 - */ - public function modPow(\phpseclib3\Math\BigInteger\Engines\PHP32 $e, \phpseclib3\Math\BigInteger\Engines\PHP32 $n) - { - return $this->powModOuter($e, $n); - } - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param PHP32 $e - * @param PHP32 $n - * @return PHP32 - */ - public function powMod(\phpseclib3\Math\BigInteger\Engines\PHP32 $e, \phpseclib3\Math\BigInteger\Engines\PHP32 $n) - { - return $this->powModOuter($e, $n); - } - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param PHP32 $min - * @param PHP32 $max - * @return false|PHP32 - */ - public static function randomRangePrime(\phpseclib3\Math\BigInteger\Engines\PHP32 $min, \phpseclib3\Math\BigInteger\Engines\PHP32 $max) - { - return self::randomRangePrimeOuter($min, $max); - } - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param PHP32 $min - * @param PHP32 $max - * @return PHP32 - */ - public static function randomRange(\phpseclib3\Math\BigInteger\Engines\PHP32 $min, \phpseclib3\Math\BigInteger\Engines\PHP32 $max) - { - return self::randomRangeHelper($min, $max); - } - /** - * Performs exponentiation. - * - * @param PHP32 $n - * @return PHP32 - */ - public function pow(\phpseclib3\Math\BigInteger\Engines\PHP32 $n) - { - return $this->powHelper($n); - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP32 ...$nums - * @return PHP32 - */ - public static function min(\phpseclib3\Math\BigInteger\Engines\PHP32 ...$nums) - { - return self::minHelper($nums); - } - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP32 ...$nums - * @return PHP32 - */ - public static function max(\phpseclib3\Math\BigInteger\Engines\PHP32 ...$nums) - { - return self::maxHelper($nums); - } - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param PHP32 $min - * @param PHP32 $max - * @return bool - */ - public function between(\phpseclib3\Math\BigInteger\Engines\PHP32 $min, \phpseclib3\Math\BigInteger\Engines\PHP32 $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php deleted file mode 100644 index b0ed10c..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php +++ /dev/null @@ -1,342 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math\BigInteger\Engines; - -/** - * Pure-PHP 64-bit Engine. - * - * Uses 64-bit integers if int size is 8 bits - * - * @author Jim Wigginton - */ -class PHP64 extends \phpseclib3\Math\BigInteger\Engines\PHP -{ - // Constants used by PHP.php - const BASE = 31; - const BASE_FULL = 0x80000000; - const MAX_DIGIT = 0x7fffffff; - const MSB = 0x40000000; - /** - * MAX10 in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10 = 1000000000; - /** - * MAX10LEN in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10LEN = 9; - const MAX_DIGIT2 = 4611686018427387904; - /** - * Initialize a PHP64 BigInteger Engine instance - * - * @param int $base - * @see parent::initialize() - */ - protected function initialize($base) - { - if ($base != 256 && $base != -256) { - return parent::initialize($base); - } - $val = $this->value; - $this->value = []; - $vals =& $this->value; - $i = \strlen($val); - if (!$i) { - return; - } - while (\true) { - $i -= 4; - if ($i < 0) { - if ($i == -4) { - break; - } - $val = \substr($val, 0, 4 + $i); - $val = \str_pad($val, 4, "\x00", \STR_PAD_LEFT); - if ($val == "\x00\x00\x00\x00") { - break; - } - $i = 0; - } - list(, $digit) = \unpack('N', \substr($val, $i, 4)); - $step = \count($vals) & 7; - if (!$step) { - $digit &= static::MAX_DIGIT; - $i++; - } else { - $shift = 8 - $step; - $digit >>= $shift; - $shift = 32 - $shift; - $digit &= (1 << $shift) - 1; - $temp = $i > 0 ? \ord($val[$i - 1]) : 0; - $digit |= $temp << $shift & 0x7f000000; - } - $vals[] = $digit; - } - while (\end($vals) === 0) { - \array_pop($vals); - } - \reset($vals); - } - /** - * Test for engine validity - * - * @see parent::__construct() - * @return bool - */ - public static function isValidEngine() - { - return \PHP_INT_SIZE >= 8; - } - /** - * Adds two BigIntegers. - * - * @param PHP64 $y - * @return PHP64 - */ - public function add(\phpseclib3\Math\BigInteger\Engines\PHP64 $y) - { - $temp = self::addHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - return $this->convertToObj($temp); - } - /** - * Subtracts two BigIntegers. - * - * @param PHP64 $y - * @return PHP64 - */ - public function subtract(\phpseclib3\Math\BigInteger\Engines\PHP64 $y) - { - $temp = self::subtractHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - return $this->convertToObj($temp); - } - /** - * Multiplies two BigIntegers. - * - * @param PHP64 $y - * @return PHP64 - */ - public function multiply(\phpseclib3\Math\BigInteger\Engines\PHP64 $y) - { - $temp = self::multiplyHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - return $this->convertToObj($temp); - } - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param PHP64 $y - * @return array{PHP64, PHP64} - */ - public function divide(\phpseclib3\Math\BigInteger\Engines\PHP64 $y) - { - return $this->divideHelper($y); - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP64 $n - * @return false|PHP64 - */ - public function modInverse(\phpseclib3\Math\BigInteger\Engines\PHP64 $n) - { - return $this->modInverseHelper($n); - } - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP64 $n - * @return PHP64[] - */ - public function extendedGCD(\phpseclib3\Math\BigInteger\Engines\PHP64 $n) - { - return $this->extendedGCDHelper($n); - } - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param PHP64 $n - * @return PHP64 - */ - public function gcd(\phpseclib3\Math\BigInteger\Engines\PHP64 $n) - { - return $this->extendedGCD($n)['gcd']; - } - /** - * Logical And - * - * @param PHP64 $x - * @return PHP64 - */ - public function bitwise_and(\phpseclib3\Math\BigInteger\Engines\PHP64 $x) - { - return $this->bitwiseAndHelper($x); - } - /** - * Logical Or - * - * @param PHP64 $x - * @return PHP64 - */ - public function bitwise_or(\phpseclib3\Math\BigInteger\Engines\PHP64 $x) - { - return $this->bitwiseOrHelper($x); - } - /** - * Logical Exclusive Or - * - * @param PHP64 $x - * @return PHP64 - */ - public function bitwise_xor(\phpseclib3\Math\BigInteger\Engines\PHP64 $x) - { - return $this->bitwiseXorHelper($x); - } - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is - * demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param PHP64 $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(\phpseclib3\Math\BigInteger\Engines\PHP64 $y) - { - return parent::compareHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - } - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param PHP64 $x - * @return bool - */ - public function equals(\phpseclib3\Math\BigInteger\Engines\PHP64 $x) - { - return $this->value === $x->value && $this->is_negative == $x->is_negative; - } - /** - * Performs modular exponentiation. - * - * @param PHP64 $e - * @param PHP64 $n - * @return PHP64 - */ - public function modPow(\phpseclib3\Math\BigInteger\Engines\PHP64 $e, \phpseclib3\Math\BigInteger\Engines\PHP64 $n) - { - return $this->powModOuter($e, $n); - } - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param PHP64 $e - * @param PHP64 $n - * @return PHP64|false - */ - public function powMod(\phpseclib3\Math\BigInteger\Engines\PHP64 $e, \phpseclib3\Math\BigInteger\Engines\PHP64 $n) - { - return $this->powModOuter($e, $n); - } - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param PHP64 $min - * @param PHP64 $max - * @return false|PHP64 - */ - public static function randomRangePrime(\phpseclib3\Math\BigInteger\Engines\PHP64 $min, \phpseclib3\Math\BigInteger\Engines\PHP64 $max) - { - return self::randomRangePrimeOuter($min, $max); - } - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param PHP64 $min - * @param PHP64 $max - * @return PHP64 - */ - public static function randomRange(\phpseclib3\Math\BigInteger\Engines\PHP64 $min, \phpseclib3\Math\BigInteger\Engines\PHP64 $max) - { - return self::randomRangeHelper($min, $max); - } - /** - * Performs exponentiation. - * - * @param PHP64 $n - * @return PHP64 - */ - public function pow(\phpseclib3\Math\BigInteger\Engines\PHP64 $n) - { - return $this->powHelper($n); - } - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP64 ...$nums - * @return PHP64 - */ - public static function min(\phpseclib3\Math\BigInteger\Engines\PHP64 ...$nums) - { - return self::minHelper($nums); - } - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP64 ...$nums - * @return PHP64 - */ - public static function max(\phpseclib3\Math\BigInteger\Engines\PHP64 ...$nums) - { - return self::maxHelper($nums); - } - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param PHP64 $min - * @param PHP64 $max - * @return bool - */ - public function between(\phpseclib3\Math\BigInteger\Engines\PHP64 $min, \phpseclib3\Math\BigInteger\Engines\PHP64 $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField.php deleted file mode 100644 index 7f87640..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField.php +++ /dev/null @@ -1,174 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Math; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Math\BinaryField\Integer; -use phpseclib3\Math\Common\FiniteField; -/** - * Binary Finite Fields - * - * @author Jim Wigginton - */ -class BinaryField extends FiniteField -{ - /** - * Instance Counter - * - * @var int - */ - private static $instanceCounter = 0; - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - /** @var BigInteger */ - private $randomMax; - /** - * Default constructor - */ - public function __construct(...$indices) - { - $m = \array_shift($indices); - $val = \str_repeat('0', $m) . '1'; - foreach ($indices as $index) { - $val[$index] = '1'; - } - $modulo = static::base2ToBase256(\strrev($val)); - $mStart = 2 * $m - 2; - $t = \ceil($m / 8); - $finalMask = \chr((1 << $m % 8) - 1); - if ($finalMask == "\x00") { - $finalMask = "\xff"; - } - $bitLen = $mStart + 1; - $pad = \ceil($bitLen / 8); - $h = $bitLen & 7; - $h = $h ? 8 - $h : 0; - $r = \rtrim(\substr($val, 0, -1), '0'); - $u = [static::base2ToBase256(\strrev($r))]; - for ($i = 1; $i < 8; $i++) { - $u[] = static::base2ToBase256(\strrev(\str_repeat('0', $i) . $r)); - } - // implements algorithm 2.40 (in section 2.3.5) in "Guide to Elliptic Curve Cryptography" - // with W = 8 - $reduce = function ($c) use($u, $mStart, $m, $t, $finalMask, $pad, $h) { - $c = \str_pad($c, $pad, "\x00", \STR_PAD_LEFT); - for ($i = $mStart; $i >= $m;) { - $g = $h >> 3; - $mask = $h & 7; - $mask = $mask ? 1 << 7 - $mask : 0x80; - for (; $mask > 0; $mask >>= 1, $i--, $h++) { - if (\ord($c[$g]) & $mask) { - $temp = $i - $m; - $j = $temp >> 3; - $k = $temp & 7; - $t1 = $j ? \substr($c, 0, -$j) : $c; - $length = \strlen($t1); - if ($length) { - $t2 = \str_pad($u[$k], $length, "\x00", \STR_PAD_LEFT); - $temp = $t1 ^ $t2; - $c = $j ? \substr_replace($c, $temp, 0, $length) : $temp; - } - } - } - } - $c = \substr($c, -$t); - if (\strlen($c) == $t) { - $c[0] = $c[0] & $finalMask; - } - return \ltrim($c, "\x00"); - }; - $this->instanceID = self::$instanceCounter++; - Integer::setModulo($this->instanceID, $modulo); - Integer::setRecurringModuloFunction($this->instanceID, $reduce); - $this->randomMax = new \phpseclib3\Math\BigInteger($modulo, 2); - } - /** - * Returns an instance of a dynamically generated PrimeFieldInteger class - * - * @param string $num - * @return Integer - */ - public function newInteger($num) - { - return new Integer($this->instanceID, $num instanceof \phpseclib3\Math\BigInteger ? $num->toBytes() : $num); - } - /** - * Returns an integer on the finite field between one and the prime modulo - * - * @return Integer - */ - public function randomInteger() - { - static $one; - if (!isset($one)) { - $one = new \phpseclib3\Math\BigInteger(1); - } - return new Integer($this->instanceID, \phpseclib3\Math\BigInteger::randomRange($one, $this->randomMax)->toBytes()); - } - /** - * Returns the length of the modulo in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return \strlen(Integer::getModulo($this->instanceID)); - } - /** - * Returns the length of the modulo in bits - * - * @return int - */ - public function getLength() - { - return \strlen(Integer::getModulo($this->instanceID)) << 3; - } - /** - * Converts a base-2 string to a base-256 string - * - * @param string $x - * @param int|null $size - * @return string - */ - public static function base2ToBase256($x, $size = null) - { - $str = Strings::bits2bin($x); - $pad = \strlen($x) >> 3; - if (\strlen($x) & 3) { - $pad++; - } - $str = \str_pad($str, $pad, "\x00", \STR_PAD_LEFT); - if (isset($size)) { - $str = \str_pad($str, $size, "\x00", \STR_PAD_LEFT); - } - return $str; - } - /** - * Converts a base-256 string to a base-2 string - * - * @param string $x - * @return string - */ - public static function base256ToBase2($x) - { - if (\function_exists('gmp_import')) { - return \gmp_strval(\gmp_import($x), 2); - } - return Strings::bin2bits($x); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php deleted file mode 100644 index 28a8923..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php +++ /dev/null @@ -1,442 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Math\BinaryField; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\BinaryField; -use phpseclib3\Math\Common\FiniteField\Integer as Base; -/** - * Binary Finite Fields - * - * @author Jim Wigginton - */ -class Integer extends Base -{ - /** - * Holds the BinaryField's value - * - * @var string - */ - protected $value; - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - /** - * Holds the PrimeField's modulo - * - * @var array - */ - protected static $modulo; - /** - * Holds a pre-generated function to perform modulo reductions - * - * @var callable[] - */ - protected static $reduce; - /** - * Default constructor - */ - public function __construct($instanceID, $num = '') - { - $this->instanceID = $instanceID; - if (!\strlen($num)) { - $this->value = ''; - } else { - $reduce = static::$reduce[$instanceID]; - $this->value = $reduce($num); - } - } - /** - * Set the modulo for a given instance - * @param int $instanceID - * @param string $modulo - */ - public static function setModulo($instanceID, $modulo) - { - static::$modulo[$instanceID] = $modulo; - } - /** - * Set the modulo for a given instance - */ - public static function setRecurringModuloFunction($instanceID, callable $function) - { - static::$reduce[$instanceID] = $function; - } - /** - * Tests a parameter to see if it's of the right instance - * - * Throws an exception if the incorrect class is being utilized - */ - private static function checkInstance(self $x, self $y) - { - if ($x->instanceID != $y->instanceID) { - throw new \UnexpectedValueException('The instances of the two BinaryField\\Integer objects do not match'); - } - } - /** - * Tests the equality of two numbers. - * - * @return bool - */ - public function equals(self $x) - { - static::checkInstance($this, $x); - return $this->value == $x->value; - } - /** - * Compares two numbers. - * - * @return int - */ - public function compare(self $x) - { - static::checkInstance($this, $x); - $a = $this->value; - $b = $x->value; - $length = \max(\strlen($a), \strlen($b)); - $a = \str_pad($a, $length, "\x00", \STR_PAD_LEFT); - $b = \str_pad($b, $length, "\x00", \STR_PAD_LEFT); - return \strcmp($a, $b); - } - /** - * Returns the degree of the polynomial - * - * @param string $x - * @return int - */ - private static function deg($x) - { - $x = \ltrim($x, "\x00"); - $xbit = \decbin(\ord($x[0])); - $xlen = $xbit == '0' ? 0 : \strlen($xbit); - $len = \strlen($x); - if (!$len) { - return -1; - } - return 8 * \strlen($x) - 9 + $xlen; - } - /** - * Perform polynomial division - * - * @return string[] - * @link https://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor#Euclidean_division - */ - private static function polynomialDivide($x, $y) - { - // in wikipedia's description of the algorithm, lc() is the leading coefficient. over a binary field that's - // always going to be 1. - $q = \chr(0); - $d = static::deg($y); - $r = $x; - while (($degr = static::deg($r)) >= $d) { - $s = '1' . \str_repeat('0', $degr - $d); - $s = BinaryField::base2ToBase256($s); - $length = \max(\strlen($s), \strlen($q)); - $q = !isset($q) ? $s : \str_pad($q, $length, "\x00", \STR_PAD_LEFT) ^ \str_pad($s, $length, "\x00", \STR_PAD_LEFT); - $s = static::polynomialMultiply($s, $y); - $length = \max(\strlen($r), \strlen($s)); - $r = \str_pad($r, $length, "\x00", \STR_PAD_LEFT) ^ \str_pad($s, $length, "\x00", \STR_PAD_LEFT); - } - return [\ltrim($q, "\x00"), \ltrim($r, "\x00")]; - } - /** - * Perform polynomial multiplation in the traditional way - * - * @return string - * @link https://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplication - */ - private static function regularPolynomialMultiply($x, $y) - { - $precomputed = [\ltrim($x, "\x00")]; - $x = \strrev(BinaryField::base256ToBase2($x)); - $y = \strrev(BinaryField::base256ToBase2($y)); - if (\strlen($x) == \strlen($y)) { - $length = \strlen($x); - } else { - $length = \max(\strlen($x), \strlen($y)); - $x = \str_pad($x, $length, '0'); - $y = \str_pad($y, $length, '0'); - } - $result = \str_repeat('0', 2 * $length - 1); - $result = BinaryField::base2ToBase256($result); - $size = \strlen($result); - $x = \strrev($x); - // precompute left shift 1 through 7 - for ($i = 1; $i < 8; $i++) { - $precomputed[$i] = BinaryField::base2ToBase256($x . \str_repeat('0', $i)); - } - for ($i = 0; $i < \strlen($y); $i++) { - if ($y[$i] == '1') { - $temp = $precomputed[$i & 7] . \str_repeat("\x00", $i >> 3); - $result ^= \str_pad($temp, $size, "\x00", \STR_PAD_LEFT); - } - } - return $result; - } - /** - * Perform polynomial multiplation - * - * Uses karatsuba multiplication to reduce x-bit multiplications to a series of 32-bit multiplications - * - * @return string - * @link https://en.wikipedia.org/wiki/Karatsuba_algorithm - */ - private static function polynomialMultiply($x, $y) - { - if (\strlen($x) == \strlen($y)) { - $length = \strlen($x); - } else { - $length = \max(\strlen($x), \strlen($y)); - $x = \str_pad($x, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y, $length, "\x00", \STR_PAD_LEFT); - } - switch (\true) { - case \PHP_INT_SIZE == 8 && $length <= 4: - return $length != 4 ? self::subMultiply(\str_pad($x, 4, "\x00", \STR_PAD_LEFT), \str_pad($y, 4, "\x00", \STR_PAD_LEFT)) : self::subMultiply($x, $y); - case \PHP_INT_SIZE == 4 || $length > 32: - return self::regularPolynomialMultiply($x, $y); - } - $m = $length >> 1; - $x1 = \substr($x, 0, -$m); - $x0 = \substr($x, -$m); - $y1 = \substr($y, 0, -$m); - $y0 = \substr($y, -$m); - $z2 = self::polynomialMultiply($x1, $y1); - $z0 = self::polynomialMultiply($x0, $y0); - $z1 = self::polynomialMultiply(self::subAdd2($x1, $x0), self::subAdd2($y1, $y0)); - $z1 = self::subAdd3($z1, $z2, $z0); - $xy = self::subAdd3($z2 . \str_repeat("\x00", 2 * $m), $z1 . \str_repeat("\x00", $m), $z0); - return \ltrim($xy, "\x00"); - } - /** - * Perform polynomial multiplication on 2x 32-bit numbers, returning - * a 64-bit number - * - * @param string $x - * @param string $y - * @return string - * @link https://www.bearssl.org/constanttime.html#ghash-for-gcm - */ - private static function subMultiply($x, $y) - { - $x = \unpack('N', $x)[1]; - $y = \unpack('N', $y)[1]; - $x0 = $x & 0x11111111; - $x1 = $x & 0x22222222; - $x2 = $x & 0x44444444; - $x3 = $x & 0x88888888; - $y0 = $y & 0x11111111; - $y1 = $y & 0x22222222; - $y2 = $y & 0x44444444; - $y3 = $y & 0x88888888; - $z0 = $x0 * $y0 ^ $x1 * $y3 ^ $x2 * $y2 ^ $x3 * $y1; - $z1 = $x0 * $y1 ^ $x1 * $y0 ^ $x2 * $y3 ^ $x3 * $y2; - $z2 = $x0 * $y2 ^ $x1 * $y1 ^ $x2 * $y0 ^ $x3 * $y3; - $z3 = $x0 * $y3 ^ $x1 * $y2 ^ $x2 * $y1 ^ $x3 * $y0; - $z0 &= 0x1111111111111111; - $z1 &= 0x2222222222222222; - $z2 &= 0x4444444444444444; - $z3 &= -8608480567731124088; - // 0x8888888888888888 gets interpreted as a float - $z = $z0 | $z1 | $z2 | $z3; - return \pack('J', $z); - } - /** - * Adds two numbers - * - * @param string $x - * @param string $y - * @return string - */ - private static function subAdd2($x, $y) - { - $length = \max(\strlen($x), \strlen($y)); - $x = \str_pad($x, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y, $length, "\x00", \STR_PAD_LEFT); - return $x ^ $y; - } - /** - * Adds three numbers - * - * @param string $x - * @param string $y - * @return string - */ - private static function subAdd3($x, $y, $z) - { - $length = \max(\strlen($x), \strlen($y), \strlen($z)); - $x = \str_pad($x, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y, $length, "\x00", \STR_PAD_LEFT); - $z = \str_pad($z, $length, "\x00", \STR_PAD_LEFT); - return $x ^ $y ^ $z; - } - /** - * Adds two BinaryFieldIntegers. - * - * @return static - */ - public function add(self $y) - { - static::checkInstance($this, $y); - $length = \strlen(static::$modulo[$this->instanceID]); - $x = \str_pad($this->value, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y->value, $length, "\x00", \STR_PAD_LEFT); - return new static($this->instanceID, $x ^ $y); - } - /** - * Subtracts two BinaryFieldIntegers. - * - * @return static - */ - public function subtract(self $x) - { - return $this->add($x); - } - /** - * Multiplies two BinaryFieldIntegers. - * - * @return static - */ - public function multiply(self $y) - { - static::checkInstance($this, $y); - return new static($this->instanceID, static::polynomialMultiply($this->value, $y->value)); - } - /** - * Returns the modular inverse of a BinaryFieldInteger - * - * @return static - */ - public function modInverse() - { - $remainder0 = static::$modulo[$this->instanceID]; - $remainder1 = $this->value; - if ($remainder1 == '') { - return new static($this->instanceID); - } - $aux0 = "\x00"; - $aux1 = "\x01"; - while ($remainder1 != "\x01") { - list($q, $r) = static::polynomialDivide($remainder0, $remainder1); - $remainder0 = $remainder1; - $remainder1 = $r; - // the auxiliary in row n is given by the sum of the auxiliary in - // row n-2 and the product of the quotient and the auxiliary in row - // n-1 - $temp = static::polynomialMultiply($aux1, $q); - $aux = \str_pad($aux0, \strlen($temp), "\x00", \STR_PAD_LEFT) ^ \str_pad($temp, \strlen($aux0), "\x00", \STR_PAD_LEFT); - $aux0 = $aux1; - $aux1 = $aux; - } - $temp = new static($this->instanceID); - $temp->value = \ltrim($aux1, "\x00"); - return $temp; - } - /** - * Divides two PrimeFieldIntegers. - * - * @return static - */ - public function divide(self $x) - { - static::checkInstance($this, $x); - $x = $x->modInverse(); - return $this->multiply($x); - } - /** - * Negate - * - * A negative number can be written as 0-12. With modulos, 0 is the same thing as the modulo - * so 0-12 is the same thing as modulo-12 - * - * @return object - */ - public function negate() - { - $x = \str_pad($this->value, \strlen(static::$modulo[$this->instanceID]), "\x00", \STR_PAD_LEFT); - return new static($this->instanceID, $x ^ static::$modulo[$this->instanceID]); - } - /** - * Returns the modulo - * - * @return string - */ - public static function getModulo($instanceID) - { - return static::$modulo[$instanceID]; - } - /** - * Converts an Integer to a byte string (eg. base-256). - * - * @return string - */ - public function toBytes() - { - return \str_pad($this->value, \strlen(static::$modulo[$this->instanceID]), "\x00", \STR_PAD_LEFT); - } - /** - * Converts an Integer to a hex string (eg. base-16). - * - * @return string - */ - public function toHex() - { - return Strings::bin2hex($this->toBytes()); - } - /** - * Converts an Integer to a bit string (eg. base-2). - * - * @return string - */ - public function toBits() - { - //return str_pad(BinaryField::base256ToBase2($this->value), strlen(static::$modulo[$this->instanceID]), '0', STR_PAD_LEFT); - return BinaryField::base256ToBase2($this->value); - } - /** - * Converts an Integer to a BigInteger - * - * @return string - */ - public function toBigInteger() - { - return new BigInteger($this->value, 256); - } - /** - * __toString() magic method - * - */ - public function __toString() - { - return (string) $this->toBigInteger(); - } - /** - * __debugInfo() magic method - * - */ - public function __debugInfo() - { - return ['value' => $this->toHex()]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php deleted file mode 100644 index 9f14fd8..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php +++ /dev/null @@ -1,21 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Math\Common; - -/** - * Finite Fields - * - * @author Jim Wigginton - */ -abstract class FiniteField -{ -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php deleted file mode 100644 index ecaf166..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Math\Common\FiniteField; - -/** - * Finite Field Integer - * - * @author Jim Wigginton - */ -abstract class Integer implements \JsonSerializable -{ - /** - * JSON Serialize - * - * Will be called, automatically, when json_encode() is called on a BigInteger object. - * - * PHP Serialize isn't supported because unserializing would require the factory be - * serialized as well and that just sounds like too much - * - * @return array{hex: string} - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return ['hex' => $this->toHex(\true)]; - } - /** - * Converts an Integer to a hex string (eg. base-16). - * - * @return string - */ - public abstract function toHex(); -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField.php deleted file mode 100644 index 5354757..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ -namespace phpseclib3\Math; - -use phpseclib3\Math\Common\FiniteField; -use phpseclib3\Math\PrimeField\Integer; -/** - * Prime Finite Fields - * - * @author Jim Wigginton - */ -class PrimeField extends FiniteField -{ - /** - * Instance Counter - * - * @var int - */ - private static $instanceCounter = 0; - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - /** - * Default constructor - */ - public function __construct(\phpseclib3\Math\BigInteger $modulo) - { - if (!$modulo->isPrime()) { - throw new \UnexpectedValueException('PrimeField requires a prime number be passed to the constructor'); - } - $this->instanceID = self::$instanceCounter++; - Integer::setModulo($this->instanceID, $modulo); - Integer::setRecurringModuloFunction($this->instanceID, $modulo->createRecurringModuloFunction()); - } - /** - * Use a custom defined modular reduction function - * - * @return void - */ - public function setReduction(\Closure $func) - { - $this->reduce = $func->bindTo($this, $this); - } - /** - * Returns an instance of a dynamically generated PrimeFieldInteger class - * - * @return Integer - */ - public function newInteger(\phpseclib3\Math\BigInteger $num) - { - return new Integer($this->instanceID, $num); - } - /** - * Returns an integer on the finite field between one and the prime modulo - * - * @return Integer - */ - public function randomInteger() - { - static $one; - if (!isset($one)) { - $one = new \phpseclib3\Math\BigInteger(1); - } - return new Integer($this->instanceID, \phpseclib3\Math\BigInteger::randomRange($one, Integer::getModulo($this->instanceID))); - } - /** - * Returns the length of the modulo in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return Integer::getModulo($this->instanceID)->getLengthInBytes(); - } - /** - * Returns the length of the modulo in bits - * - * @return int - */ - public function getLength() - { - return Integer::getModulo($this->instanceID)->getLength(); - } - /** - * Destructor - */ - public function __destruct() - { - Integer::cleanupCache($this->instanceID); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php b/dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php deleted file mode 100644 index bb38b5a..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php +++ /dev/null @@ -1,370 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ -namespace phpseclib3\Math\PrimeField; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Math\BigInteger; -use phpseclib3\Math\Common\FiniteField\Integer as Base; -/** - * Prime Finite Fields - * - * @author Jim Wigginton - */ -class Integer extends Base -{ - /** - * Holds the PrimeField's value - * - * @var BigInteger - */ - protected $value; - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - /** - * Holds the PrimeField's modulo - * - * @var array - */ - protected static $modulo; - /** - * Holds a pre-generated function to perform modulo reductions - * - * @var array - */ - protected static $reduce; - /** - * Zero - * - * @var BigInteger - */ - protected static $zero; - /** - * Default constructor - * - * @param int $instanceID - */ - public function __construct($instanceID, BigInteger $num = null) - { - $this->instanceID = $instanceID; - if (!isset($num)) { - $this->value = clone static::$zero[static::class]; - } else { - $reduce = static::$reduce[$instanceID]; - $this->value = $reduce($num); - } - } - /** - * Set the modulo for a given instance - * - * @param int $instanceID - * @return void - */ - public static function setModulo($instanceID, BigInteger $modulo) - { - static::$modulo[$instanceID] = $modulo; - } - /** - * Set the modulo for a given instance - * - * @param int $instanceID - * @return void - */ - public static function setRecurringModuloFunction($instanceID, callable $function) - { - static::$reduce[$instanceID] = $function; - if (!isset(static::$zero[static::class])) { - static::$zero[static::class] = new BigInteger(); - } - } - /** - * Delete the modulo for a given instance - */ - public static function cleanupCache($instanceID) - { - unset(static::$modulo[$instanceID]); - unset(static::$reduce[$instanceID]); - } - /** - * Returns the modulo - * - * @param int $instanceID - * @return BigInteger - */ - public static function getModulo($instanceID) - { - return static::$modulo[$instanceID]; - } - /** - * Tests a parameter to see if it's of the right instance - * - * Throws an exception if the incorrect class is being utilized - * - * @return void - */ - public static function checkInstance(self $x, self $y) - { - if ($x->instanceID != $y->instanceID) { - throw new \UnexpectedValueException('The instances of the two PrimeField\\Integer objects do not match'); - } - } - /** - * Tests the equality of two numbers. - * - * @return bool - */ - public function equals(self $x) - { - static::checkInstance($this, $x); - return $this->value->equals($x->value); - } - /** - * Compares two numbers. - * - * @return int - */ - public function compare(self $x) - { - static::checkInstance($this, $x); - return $this->value->compare($x->value); - } - /** - * Adds two PrimeFieldIntegers. - * - * @return static - */ - public function add(self $x) - { - static::checkInstance($this, $x); - $temp = new static($this->instanceID); - $temp->value = $this->value->add($x->value); - if ($temp->value->compare(static::$modulo[$this->instanceID]) >= 0) { - $temp->value = $temp->value->subtract(static::$modulo[$this->instanceID]); - } - return $temp; - } - /** - * Subtracts two PrimeFieldIntegers. - * - * @return static - */ - public function subtract(self $x) - { - static::checkInstance($this, $x); - $temp = new static($this->instanceID); - $temp->value = $this->value->subtract($x->value); - if ($temp->value->isNegative()) { - $temp->value = $temp->value->add(static::$modulo[$this->instanceID]); - } - return $temp; - } - /** - * Multiplies two PrimeFieldIntegers. - * - * @return static - */ - public function multiply(self $x) - { - static::checkInstance($this, $x); - return new static($this->instanceID, $this->value->multiply($x->value)); - } - /** - * Divides two PrimeFieldIntegers. - * - * @return static - */ - public function divide(self $x) - { - static::checkInstance($this, $x); - $denominator = $x->value->modInverse(static::$modulo[$this->instanceID]); - return new static($this->instanceID, $this->value->multiply($denominator)); - } - /** - * Performs power operation on a PrimeFieldInteger. - * - * @return static - */ - public function pow(BigInteger $x) - { - $temp = new static($this->instanceID); - $temp->value = $this->value->powMod($x, static::$modulo[$this->instanceID]); - return $temp; - } - /** - * Calculates the square root - * - * @link https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm - * @return static|false - */ - public function squareRoot() - { - static $one, $two; - if (!isset($one)) { - $one = new BigInteger(1); - $two = new BigInteger(2); - } - $reduce = static::$reduce[$this->instanceID]; - $p_1 = static::$modulo[$this->instanceID]->subtract($one); - $q = clone $p_1; - $s = BigInteger::scan1divide($q); - list($pow) = $p_1->divide($two); - for ($z = $one; !$z->equals(static::$modulo[$this->instanceID]); $z = $z->add($one)) { - $temp = $z->powMod($pow, static::$modulo[$this->instanceID]); - if ($temp->equals($p_1)) { - break; - } - } - $m = new BigInteger($s); - $c = $z->powMod($q, static::$modulo[$this->instanceID]); - $t = $this->value->powMod($q, static::$modulo[$this->instanceID]); - list($temp) = $q->add($one)->divide($two); - $r = $this->value->powMod($temp, static::$modulo[$this->instanceID]); - while (!$t->equals($one)) { - for ($i == clone $one; $i->compare($m) < 0; $i = $i->add($one)) { - if ($t->powMod($two->pow($i), static::$modulo[$this->instanceID])->equals($one)) { - break; - } - } - if ($i->compare($m) == 0) { - return \false; - } - $b = $c->powMod($two->pow($m->subtract($i)->subtract($one)), static::$modulo[$this->instanceID]); - $m = $i; - $c = $reduce($b->multiply($b)); - $t = $reduce($t->multiply($c)); - $r = $reduce($r->multiply($b)); - } - return new static($this->instanceID, $r); - } - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return $this->value->isOdd(); - } - /** - * Negate - * - * A negative number can be written as 0-12. With modulos, 0 is the same thing as the modulo - * so 0-12 is the same thing as modulo-12 - * - * @return static - */ - public function negate() - { - return new static($this->instanceID, static::$modulo[$this->instanceID]->subtract($this->value)); - } - /** - * Converts an Integer to a byte string (eg. base-256). - * - * @return string - */ - public function toBytes() - { - if (isset(static::$modulo[$this->instanceID])) { - $length = static::$modulo[$this->instanceID]->getLengthInBytes(); - return \str_pad($this->value->toBytes(), $length, "\x00", \STR_PAD_LEFT); - } - return $this->value->toBytes(); - } - /** - * Converts an Integer to a hex string (eg. base-16). - * - * @return string - */ - public function toHex() - { - return Strings::bin2hex($this->toBytes()); - } - /** - * Converts an Integer to a bit string (eg. base-2). - * - * @return string - */ - public function toBits() - { - // return $this->value->toBits(); - static $length; - if (!isset($length)) { - $length = static::$modulo[$this->instanceID]->getLength(); - } - return \str_pad($this->value->toBits(), $length, '0', \STR_PAD_LEFT); - } - /** - * Returns the w-ary non-adjacent form (wNAF) - * - * @param int $w optional - * @return array - */ - public function getNAF($w = 1) - { - $w++; - $mask = new BigInteger((1 << $w) - 1); - $sub = new BigInteger(1 << $w); - //$sub = new BigInteger(1 << ($w - 1)); - $d = $this->toBigInteger(); - $d_i = []; - $i = 0; - while ($d->compare(static::$zero[static::class]) > 0) { - if ($d->isOdd()) { - // start mods - $bigInteger = $d->testBit($w - 1) ? $d->bitwise_and($mask)->subtract($sub) : $d->bitwise_and($mask); - // end mods - $d = $d->subtract($bigInteger); - $d_i[$i] = (int) $bigInteger->toString(); - } else { - $d_i[$i] = 0; - } - $shift = !$d->equals(static::$zero[static::class]) && $d->bitwise_and($mask)->equals(static::$zero[static::class]) ? $w : 1; - // $w or $w + 1? - $d = $d->bitwise_rightShift($shift); - while (--$shift > 0) { - $d_i[++$i] = 0; - } - $i++; - } - return $d_i; - } - /** - * Converts an Integer to a BigInteger - * - * @return BigInteger - */ - public function toBigInteger() - { - return clone $this->value; - } - /** - * __toString() magic method - * - * @return string - */ - public function __toString() - { - return (string) $this->value; - } - /** - * __debugInfo() magic method - * - * @return array - */ - public function __debugInfo() - { - return ['value' => $this->toHex()]; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP.php b/dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP.php deleted file mode 100644 index f0f3e31..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP.php +++ /dev/null @@ -1,3057 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $sftp->pwd() . "\r\n"; - * $sftp->put('filename.ext', 'hello, world!'); - * print_r($sftp->nlist()); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Net; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Exception\FileNotFoundException; -/** - * Pure-PHP implementations of SFTP. - * - * @author Jim Wigginton - */ -class SFTP extends \phpseclib3\Net\SSH2 -{ - /** - * SFTP channel constant - * - * \phpseclib3\Net\SSH2::exec() uses 0 and \phpseclib3\Net\SSH2::read() / \phpseclib3\Net\SSH2::write() use 1. - * - * @see \phpseclib3\Net\SSH2::send_channel_packet() - * @see \phpseclib3\Net\SSH2::get_channel_packet() - */ - const CHANNEL = 0x100; - /** - * Reads data from a local file. - * - * @see \phpseclib3\Net\SFTP::put() - */ - const SOURCE_LOCAL_FILE = 1; - /** - * Reads data from a string. - * - * @see \phpseclib3\Net\SFTP::put() - */ - // this value isn't really used anymore but i'm keeping it reserved for historical reasons - const SOURCE_STRING = 2; - /** - * Reads data from callback: - * function callback($length) returns string to proceed, null for EOF - * - * @see \phpseclib3\Net\SFTP::put() - */ - const SOURCE_CALLBACK = 16; - /** - * Resumes an upload - * - * @see \phpseclib3\Net\SFTP::put() - */ - const RESUME = 4; - /** - * Append a local file to an already existing remote file - * - * @see \phpseclib3\Net\SFTP::put() - */ - const RESUME_START = 8; - /** - * Packet Types - * - * @see self::__construct() - * @var array - * @access private - */ - private static $packet_types = []; - /** - * Status Codes - * - * @see self::__construct() - * @var array - * @access private - */ - private static $status_codes = []; - /** @var array */ - private static $attributes; - /** @var array */ - private static $open_flags; - /** @var array */ - private static $open_flags5; - /** @var array */ - private static $file_types; - /** - * The Request ID - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var boolean - * @see self::_send_sftp_packet() - */ - private $use_request_id = \false; - /** - * The Packet Type - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var int - * @see self::_get_sftp_packet() - */ - private $packet_type = -1; - /** - * Packet Buffer - * - * @var string - * @see self::_get_sftp_packet() - */ - private $packet_buffer = ''; - /** - * Extensions supported by the server - * - * @var array - * @see self::_initChannel() - */ - private $extensions = []; - /** - * Server SFTP version - * - * @var int - * @see self::_initChannel() - */ - private $version; - /** - * Default Server SFTP version - * - * @var int - * @see self::_initChannel() - */ - private $defaultVersion; - /** - * Preferred SFTP version - * - * @var int - * @see self::_initChannel() - */ - private $preferredVersion = 3; - /** - * Current working directory - * - * @var string|bool - * @see self::realpath() - * @see self::chdir() - */ - private $pwd = \false; - /** - * Packet Type Log - * - * @see self::getLog() - * @var array - */ - private $packet_type_log = []; - /** - * Packet Log - * - * @see self::getLog() - * @var array - */ - private $packet_log = []; - /** - * Real-time log file pointer - * - * @see self::_append_log() - * @var resource|closed-resource - */ - private $realtime_log_file; - /** - * Real-time log file size - * - * @see self::_append_log() - * @var int - */ - private $realtime_log_size; - /** - * Real-time log file wrap boolean - * - * @see self::_append_log() - * @var bool - */ - private $realtime_log_wrap; - /** - * Current log size - * - * Should never exceed self::LOG_MAX_SIZE - * - * @var int - */ - private $log_size; - /** - * Error information - * - * @see self::getSFTPErrors() - * @see self::getLastSFTPError() - * @var array - */ - private $sftp_errors = []; - /** - * Stat Cache - * - * Rather than always having to open a directory and close it immediately there after to see if a file is a directory - * we'll cache the results. - * - * @see self::_update_stat_cache() - * @see self::_remove_from_stat_cache() - * @see self::_query_stat_cache() - * @var array - */ - private $stat_cache = []; - /** - * Max SFTP Packet Size - * - * @see self::__construct() - * @see self::get() - * @var int - */ - private $max_sftp_packet; - /** - * Stat Cache Flag - * - * @see self::disableStatCache() - * @see self::enableStatCache() - * @var bool - */ - private $use_stat_cache = \true; - /** - * Sort Options - * - * @see self::_comparator() - * @see self::setListOrder() - * @var array - */ - protected $sortOptions = []; - /** - * Canonicalization Flag - * - * Determines whether or not paths should be canonicalized before being - * passed on to the remote server. - * - * @see self::enablePathCanonicalization() - * @see self::disablePathCanonicalization() - * @see self::realpath() - * @var bool - */ - private $canonicalize_paths = \true; - /** - * Request Buffers - * - * @see self::_get_sftp_packet() - * @var array - */ - private $requestBuffer = []; - /** - * Preserve timestamps on file downloads / uploads - * - * @see self::get() - * @see self::put() - * @var bool - */ - private $preserveTime = \false; - /** - * Arbitrary Length Packets Flag - * - * Determines whether or not packets of any length should be allowed, - * in cases where the server chooses the packet length (such as - * directory listings). By default, packets are only allowed to be - * 256 * 1024 bytes (SFTP_MAX_MSG_LENGTH from OpenSSH's sftp-common.h) - * - * @see self::enableArbitraryLengthPackets() - * @see self::_get_sftp_packet() - * @var bool - */ - private $allow_arbitrary_length_packets = \false; - /** - * Was the last packet due to the channels being closed or not? - * - * @see self::get() - * @see self::get_sftp_packet() - * @var bool - */ - private $channel_close = \false; - /** - * Has the SFTP channel been partially negotiated? - * - * @var bool - */ - private $partial_init = \false; - /** - * Default Constructor. - * - * Connects to an SFTP server - * - * $host can either be a string, representing the host, or a stream resource. - * - * @param mixed $host - * @param int $port - * @param int $timeout - */ - public function __construct($host, $port = 22, $timeout = 10) - { - parent::__construct($host, $port, $timeout); - $this->max_sftp_packet = 1 << 15; - if (empty(self::$packet_types)) { - self::$packet_types = [1 => 'NET_SFTP_INIT', 2 => 'NET_SFTP_VERSION', 3 => 'NET_SFTP_OPEN', 4 => 'NET_SFTP_CLOSE', 5 => 'NET_SFTP_READ', 6 => 'NET_SFTP_WRITE', 7 => 'NET_SFTP_LSTAT', 9 => 'NET_SFTP_SETSTAT', 10 => 'NET_SFTP_FSETSTAT', 11 => 'NET_SFTP_OPENDIR', 12 => 'NET_SFTP_READDIR', 13 => 'NET_SFTP_REMOVE', 14 => 'NET_SFTP_MKDIR', 15 => 'NET_SFTP_RMDIR', 16 => 'NET_SFTP_REALPATH', 17 => 'NET_SFTP_STAT', 18 => 'NET_SFTP_RENAME', 19 => 'NET_SFTP_READLINK', 20 => 'NET_SFTP_SYMLINK', 21 => 'NET_SFTP_LINK', 101 => 'NET_SFTP_STATUS', 102 => 'NET_SFTP_HANDLE', 103 => 'NET_SFTP_DATA', 104 => 'NET_SFTP_NAME', 105 => 'NET_SFTP_ATTRS', 200 => 'NET_SFTP_EXTENDED']; - self::$status_codes = [0 => 'NET_SFTP_STATUS_OK', 1 => 'NET_SFTP_STATUS_EOF', 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', 4 => 'NET_SFTP_STATUS_FAILURE', 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', 6 => 'NET_SFTP_STATUS_NO_CONNECTION', 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', 13 => 'NET_SFTP_STATUS_NO_MEDIA', 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', 21 => 'NET_SFTP_STATUS_LINK_LOOP', 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', 27 => 'NET_SFTP_STATUS_DELETE_PENDING', 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', 29 => 'NET_SFTP_STATUS_OWNER_INVALID', 30 => 'NET_SFTP_STATUS_GROUP_INVALID', 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK']; - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 - // the order, in this case, matters quite a lot - see \phpseclib3\Net\SFTP::_parseAttributes() to understand why - self::$attributes = [ - 0x1 => 'NET_SFTP_ATTR_SIZE', - 0x2 => 'NET_SFTP_ATTR_UIDGID', - // defined in SFTPv3, removed in SFTPv4+ - 0x80 => 'NET_SFTP_ATTR_OWNERGROUP', - // defined in SFTPv4+ - 0x4 => 'NET_SFTP_ATTR_PERMISSIONS', - 0x8 => 'NET_SFTP_ATTR_ACCESSTIME', - 0x10 => 'NET_SFTP_ATTR_CREATETIME', - // SFTPv4+ - 0x20 => 'NET_SFTP_ATTR_MODIFYTIME', - 0x40 => 'NET_SFTP_ATTR_ACL', - 0x100 => 'NET_SFTP_ATTR_SUBSECOND_TIMES', - 0x200 => 'NET_SFTP_ATTR_BITS', - // SFTPv5+ - 0x400 => 'NET_SFTP_ATTR_ALLOCATION_SIZE', - // SFTPv6+ - 0x800 => 'NET_SFTP_ATTR_TEXT_HINT', - 0x1000 => 'NET_SFTP_ATTR_MIME_TYPE', - 0x2000 => 'NET_SFTP_ATTR_LINK_COUNT', - 0x4000 => 'NET_SFTP_ATTR_UNTRANSLATED_NAME', - 0x8000 => 'NET_SFTP_ATTR_CTIME', - // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers - // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in - // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. - // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. - \PHP_INT_SIZE == 4 ? -1 << 31 : 0x80000000 => 'NET_SFTP_ATTR_EXTENDED', - ]; - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 - // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name - // the array for that $this->open5_flags and similarly alter the constant names. - self::$open_flags = [0x1 => 'NET_SFTP_OPEN_READ', 0x2 => 'NET_SFTP_OPEN_WRITE', 0x4 => 'NET_SFTP_OPEN_APPEND', 0x8 => 'NET_SFTP_OPEN_CREATE', 0x10 => 'NET_SFTP_OPEN_TRUNCATE', 0x20 => 'NET_SFTP_OPEN_EXCL', 0x40 => 'NET_SFTP_OPEN_TEXT']; - // SFTPv5+ changed the flags up: - // https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-8.1.1.3 - self::$open_flags5 = [ - // when SSH_FXF_ACCESS_DISPOSITION is a 3 bit field that controls how the file is opened - 0x0 => 'NET_SFTP_OPEN_CREATE_NEW', - 0x1 => 'NET_SFTP_OPEN_CREATE_TRUNCATE', - 0x2 => 'NET_SFTP_OPEN_OPEN_EXISTING', - 0x3 => 'NET_SFTP_OPEN_OPEN_OR_CREATE', - 0x4 => 'NET_SFTP_OPEN_TRUNCATE_EXISTING', - // the rest of the flags are not supported - 0x8 => 'NET_SFTP_OPEN_APPEND_DATA', - // "the offset field of SS_FXP_WRITE requests is ignored" - 0x10 => 'NET_SFTP_OPEN_APPEND_DATA_ATOMIC', - 0x20 => 'NET_SFTP_OPEN_TEXT_MODE', - 0x40 => 'NET_SFTP_OPEN_BLOCK_READ', - 0x80 => 'NET_SFTP_OPEN_BLOCK_WRITE', - 0x100 => 'NET_SFTP_OPEN_BLOCK_DELETE', - 0x200 => 'NET_SFTP_OPEN_BLOCK_ADVISORY', - 0x400 => 'NET_SFTP_OPEN_NOFOLLOW', - 0x800 => 'NET_SFTP_OPEN_DELETE_ON_CLOSE', - 0x1000 => 'NET_SFTP_OPEN_ACCESS_AUDIT_ALARM_INFO', - 0x2000 => 'NET_SFTP_OPEN_ACCESS_BACKUP', - 0x4000 => 'NET_SFTP_OPEN_BACKUP_STREAM', - 0x8000 => 'NET_SFTP_OPEN_OVERRIDE_OWNER', - ]; - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 - // see \phpseclib3\Net\SFTP::_parseLongname() for an explanation - self::$file_types = [ - 1 => 'NET_SFTP_TYPE_REGULAR', - 2 => 'NET_SFTP_TYPE_DIRECTORY', - 3 => 'NET_SFTP_TYPE_SYMLINK', - 4 => 'NET_SFTP_TYPE_SPECIAL', - 5 => 'NET_SFTP_TYPE_UNKNOWN', - // the following types were first defined for use in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - 6 => 'NET_SFTP_TYPE_SOCKET', - 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', - 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', - 9 => 'NET_SFTP_TYPE_FIFO', - ]; - self::define_array(self::$packet_types, self::$status_codes, self::$attributes, self::$open_flags, self::$open_flags5, self::$file_types); - } - if (!\defined('NET_SFTP_QUEUE_SIZE')) { - \define('NET_SFTP_QUEUE_SIZE', 32); - } - if (!\defined('NET_SFTP_UPLOAD_QUEUE_SIZE')) { - \define('NET_SFTP_UPLOAD_QUEUE_SIZE', 1024); - } - } - /** - * Check a few things before SFTP functions are called - * - * @return bool - */ - private function precheck() - { - if (!($this->bitmap & \phpseclib3\Net\SSH2::MASK_LOGIN)) { - return \false; - } - if ($this->pwd === \false) { - return $this->init_sftp_connection(); - } - return \true; - } - /** - * Partially initialize an SFTP connection - * - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - private function partial_init_sftp_connection() - { - $response = $this->openChannel(self::CHANNEL, \true); - if ($response === \true && $this->isTimeout()) { - return \false; - } - $packet = Strings::packSSH2('CNsbs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], 'subsystem', \true, 'sftp'); - $this->send_binary_packet($packet); - $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - $response = $this->get_channel_packet(self::CHANNEL, \true); - if ($response === \false) { - // from PuTTY's psftp.exe - $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . "exec sftp-server"; - // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does - // is redundant - $packet = Strings::packSSH2('CNsCs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], 'exec', 1, $command); - $this->send_binary_packet($packet); - $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - $response = $this->get_channel_packet(self::CHANNEL, \true); - if ($response === \false) { - return \false; - } - } elseif ($response === \true && $this->isTimeout()) { - return \false; - } - $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; - $this->send_sftp_packet(NET_SFTP_INIT, "\x00\x00\x00\x03"); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_VERSION) { - throw new \UnexpectedValueException('Expected NET_SFTP_VERSION. ' . 'Got packet type: ' . $this->packet_type); - } - $this->use_request_id = \true; - list($this->defaultVersion) = Strings::unpackSSH2('N', $response); - while (!empty($response)) { - list($key, $value) = Strings::unpackSSH2('ss', $response); - $this->extensions[$key] = $value; - } - $this->partial_init = \true; - return \true; - } - /** - * (Re)initializes the SFTP channel - * - * @return bool - */ - private function init_sftp_connection() - { - if (!$this->partial_init && !$this->partial_init_sftp_connection()) { - return \false; - } - /* - A Note on SFTPv4/5/6 support: - states the following: - - "If the client wishes to interoperate with servers that support noncontiguous version - numbers it SHOULD send '3'" - - Given that the server only sends its version number after the client has already done so, the above - seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the - most popular. - - states the following; - - "If the server did not send the "versions" extension, or the version-from-list was not included, the - server MAY send a status response describing the failure, but MUST then close the channel without - processing any further requests." - - So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and - a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements - v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed - in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what \phpseclib3\Net\SFTP would do is close the - channel and reopen it with a new and updated SSH_FXP_INIT packet. - */ - $this->version = $this->defaultVersion; - if (isset($this->extensions['versions']) && (!$this->preferredVersion || $this->preferredVersion != $this->version)) { - $versions = \explode(',', $this->extensions['versions']); - $supported = [6, 5, 4]; - if ($this->preferredVersion) { - $supported = \array_diff($supported, [$this->preferredVersion]); - \array_unshift($supported, $this->preferredVersion); - } - foreach ($supported as $ver) { - if (\in_array($ver, $versions)) { - if ($ver === $this->version) { - break; - } - $this->version = (int) $ver; - $packet = Strings::packSSH2('ss', 'version-select', "{$ver}"); - $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS_OK. ' . ' Got ' . $status); - } - break; - } - } - } - /* - SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', - however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's - not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for - one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that - 'newline@vandyke.com' would. - */ - /* - if (isset($this->extensions['newline@vandyke.com'])) { - $this->extensions['newline'] = $this->extensions['newline@vandyke.com']; - unset($this->extensions['newline@vandyke.com']); - } - */ - if ($this->version < 2 || $this->version > 6) { - return \false; - } - $this->pwd = \true; - try { - $this->pwd = $this->realpath('.'); - } catch (\UnexpectedValueException $e) { - if (!$this->canonicalize_paths) { - throw $e; - } - $this->canonicalize_paths = \false; - $this->reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST); - } - $this->update_stat_cache($this->pwd, []); - return \true; - } - /** - * Disable the stat cache - * - */ - public function disableStatCache() - { - $this->use_stat_cache = \false; - } - /** - * Enable the stat cache - * - */ - public function enableStatCache() - { - $this->use_stat_cache = \true; - } - /** - * Clear the stat cache - * - */ - public function clearStatCache() - { - $this->stat_cache = []; - } - /** - * Enable path canonicalization - * - */ - public function enablePathCanonicalization() - { - $this->canonicalize_paths = \true; - } - /** - * Disable path canonicalization - * - * If this is enabled then $sftp->pwd() will not return the canonicalized absolute path - * - */ - public function disablePathCanonicalization() - { - $this->canonicalize_paths = \false; - } - /** - * Enable arbitrary length packets - * - */ - public function enableArbitraryLengthPackets() - { - $this->allow_arbitrary_length_packets = \true; - } - /** - * Disable arbitrary length packets - * - */ - public function disableArbitraryLengthPackets() - { - $this->allow_arbitrary_length_packets = \false; - } - /** - * Returns the current directory name - * - * @return string|bool - */ - public function pwd() - { - if (!$this->precheck()) { - return \false; - } - return $this->pwd; - } - /** - * Logs errors - * - * @param string $response - * @param int $status - */ - private function logError($response, $status = -1) - { - if ($status == -1) { - list($status) = Strings::unpackSSH2('N', $response); - } - $error = self::$status_codes[$status]; - if ($this->version > 2) { - list($message) = Strings::unpackSSH2('s', $response); - $this->sftp_errors[] = "{$error}: {$message}"; - } else { - $this->sftp_errors[] = $error; - } - } - /** - * Canonicalize the Server-Side Path Name - * - * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns - * the absolute (canonicalized) path. - * - * If canonicalize_paths has been disabled using disablePathCanonicalization(), $path is returned as-is. - * - * @see self::chdir() - * @see self::disablePathCanonicalization() - * @param string $path - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return mixed - */ - public function realpath($path) - { - if ($this->precheck() === \false) { - return \false; - } - if (!$this->canonicalize_paths) { - if ($this->pwd === \true) { - return '.'; - } - if (!\strlen($path) || $path[0] != '/') { - $path = $this->pwd . '/' . $path; - } - $parts = \explode('/', $path); - $afterPWD = $beforePWD = []; - foreach ($parts as $part) { - switch ($part) { - //case '': // some SFTP servers /require/ double /'s. see https://github.com/phpseclib/phpseclib/pull/1137 - case '.': - break; - case '..': - if (!empty($afterPWD)) { - \array_pop($afterPWD); - } else { - $beforePWD[] = '..'; - } - break; - default: - $afterPWD[] = $part; - } - } - $beforePWD = \count($beforePWD) ? \implode('/', $beforePWD) : '.'; - return $beforePWD . '/' . \implode('/', $afterPWD); - } - if ($this->pwd === \true) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 - $this->send_sftp_packet(NET_SFTP_REALPATH, Strings::packSSH2('s', $path)); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following - // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks - // at is the first part and that part is defined the same in SFTP versions 3 through 6. - list(, $filename) = Strings::unpackSSH2('Ns', $response); - return $filename; - case NET_SFTP_STATUS: - $this->logError($response); - return \false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - } - if (!\strlen($path) || $path[0] != '/') { - $path = $this->pwd . '/' . $path; - } - $path = \explode('/', $path); - $new = []; - foreach ($path as $dir) { - if (!\strlen($dir)) { - continue; - } - switch ($dir) { - case '..': - \array_pop($new); - // fall-through - case '.': - break; - default: - $new[] = $dir; - } - } - return '/' . \implode('/', $new); - } - /** - * Changes the current directory - * - * @param string $dir - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function chdir($dir) - { - if (!$this->precheck()) { - return \false; - } - // assume current dir if $dir is empty - if ($dir === '') { - $dir = './'; - // suffix a slash if needed - } elseif ($dir[\strlen($dir) - 1] != '/') { - $dir .= '/'; - } - $dir = $this->realpath($dir); - // confirm that $dir is, in fact, a valid directory - if ($this->use_stat_cache && \is_array($this->query_stat_cache($dir))) { - $this->pwd = $dir; - return \true; - } - // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us - // the currently logged in user has the appropriate permissions or not. maybe you could see if - // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy - // way to get those with SFTP - $this->send_sftp_packet(NET_SFTP_OPENDIR, Strings::packSSH2('s', $dir)); - // see \phpseclib3\Net\SFTP::nlist() for a more thorough explanation of the following - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = \substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->logError($response); - return \false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS' . 'Got packet type: ' . $this->packet_type); - } - if (!$this->close_handle($handle)) { - return \false; - } - $this->update_stat_cache($dir, []); - $this->pwd = $dir; - return \true; - } - /** - * Returns a list of files in the given directory - * - * @param string $dir - * @param bool $recursive - * @return array|false - */ - public function nlist($dir = '.', $recursive = \false) - { - return $this->nlist_helper($dir, $recursive, ''); - } - /** - * Helper method for nlist - * - * @param string $dir - * @param bool $recursive - * @param string $relativeDir - * @return array|false - */ - private function nlist_helper($dir, $recursive, $relativeDir) - { - $files = $this->readlist($dir, \false); - // If we get an int back, then that is an "unexpected" status. - // We do not have a file list, so return false. - if (\is_int($files)) { - return \false; - } - if (!$recursive || $files === \false) { - return $files; - } - $result = []; - foreach ($files as $value) { - if ($value == '.' || $value == '..') { - $result[] = $relativeDir . $value; - continue; - } - if (\is_array($this->query_stat_cache($this->realpath($dir . '/' . $value)))) { - $temp = $this->nlist_helper($dir . '/' . $value, \true, $relativeDir . $value . '/'); - $temp = \is_array($temp) ? $temp : []; - $result = \array_merge($result, $temp); - } else { - $result[] = $relativeDir . $value; - } - } - return $result; - } - /** - * Returns a detailed list of files in the given directory - * - * @param string $dir - * @param bool $recursive - * @return array|false - */ - public function rawlist($dir = '.', $recursive = \false) - { - $files = $this->readlist($dir, \true); - // If we get an int back, then that is an "unexpected" status. - // We do not have a file list, so return false. - if (\is_int($files)) { - return \false; - } - if (!$recursive || $files === \false) { - return $files; - } - static $depth = 0; - foreach ($files as $key => $value) { - if ($depth != 0 && $key == '..') { - unset($files[$key]); - continue; - } - $is_directory = \false; - if ($key != '.' && $key != '..') { - if ($this->use_stat_cache) { - $is_directory = \is_array($this->query_stat_cache($this->realpath($dir . '/' . $key))); - } else { - $stat = $this->lstat($dir . '/' . $key); - $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY; - } - } - if ($is_directory) { - $depth++; - $files[$key] = $this->rawlist($dir . '/' . $key, \true); - $depth--; - } else { - $files[$key] = (object) $value; - } - } - return $files; - } - /** - * Reads a list, be it detailed or not, of files in the given directory - * - * @param string $dir - * @param bool $raw - * @return array|false - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - private function readlist($dir, $raw = \true) - { - if (!$this->precheck()) { - return \false; - } - $dir = $this->realpath($dir . '/'); - if ($dir === \false) { - return \false; - } - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 - $this->send_sftp_packet(NET_SFTP_OPENDIR, Strings::packSSH2('s', $dir)); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 - // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that - // represent the length of the string and leave it at that - $handle = \substr($response, 4); - break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - $this->logError($response, $status); - return $status; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - $this->update_stat_cache($dir, []); - $contents = []; - while (\true) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 - // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many - // SSH_MSG_CHANNEL_DATA messages is not known to me. - $this->send_sftp_packet(NET_SFTP_READDIR, Strings::packSSH2('s', $handle)); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - list($count) = Strings::unpackSSH2('N', $response); - for ($i = 0; $i < $count; $i++) { - list($shortname) = Strings::unpackSSH2('s', $response); - // SFTPv4 "removed the long filename from the names structure-- it can now be - // built from information available in the attrs structure." - if ($this->version < 4) { - list($longname) = Strings::unpackSSH2('s', $response); - } - $attributes = $this->parseAttributes($response); - if (!isset($attributes['type']) && $this->version < 4) { - $fileType = $this->parseLongname($longname); - if ($fileType) { - $attributes['type'] = $fileType; - } - } - $contents[$shortname] = $attributes + ['filename' => $shortname]; - if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { - $this->update_stat_cache($dir . '/' . $shortname, []); - } else { - if ($shortname == '..') { - $temp = $this->realpath($dir . '/..') . '/.'; - } else { - $temp = $dir . '/' . $shortname; - } - $this->update_stat_cache($temp, (object) ['lstat' => $attributes]); - } - // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the - // final SSH_FXP_STATUS packet should tell us that, already. - } - break; - case NET_SFTP_STATUS: - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_EOF) { - $this->logError($response, $status); - return $status; - } - break 2; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - } - if (!$this->close_handle($handle)) { - return \false; - } - if (\count($this->sortOptions)) { - \uasort($contents, [&$this, 'comparator']); - } - return $raw ? $contents : \array_map('strval', \array_keys($contents)); - } - /** - * Compares two rawlist entries using parameters set by setListOrder() - * - * Intended for use with uasort() - * - * @param array $a - * @param array $b - * @return int - */ - private function comparator(array $a, array $b) - { - switch (\true) { - case $a['filename'] === '.' || $b['filename'] === '.': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '.' ? -1 : 1; - case $a['filename'] === '..' || $b['filename'] === '..': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '..' ? -1 : 1; - case isset($a['type']) && $a['type'] === NET_SFTP_TYPE_DIRECTORY: - if (!isset($b['type'])) { - return 1; - } - if ($b['type'] !== $a['type']) { - return -1; - } - break; - case isset($b['type']) && $b['type'] === NET_SFTP_TYPE_DIRECTORY: - return 1; - } - foreach ($this->sortOptions as $sort => $order) { - if (!isset($a[$sort]) || !isset($b[$sort])) { - if (isset($a[$sort])) { - return -1; - } - if (isset($b[$sort])) { - return 1; - } - return 0; - } - switch ($sort) { - case 'filename': - $result = \strcasecmp($a['filename'], $b['filename']); - if ($result) { - return $order === \SORT_DESC ? -$result : $result; - } - break; - case 'mode': - $a[$sort] &= 07777; - $b[$sort] &= 07777; - // fall-through - default: - if ($a[$sort] === $b[$sort]) { - break; - } - return $order === \SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; - } - } - } - /** - * Defines how nlist() and rawlist() will be sorted - if at all. - * - * If sorting is enabled directories and files will be sorted independently with - * directories appearing before files in the resultant array that is returned. - * - * Any parameter returned by stat is a valid sort parameter for this function. - * Filename comparisons are case insensitive. - * - * Examples: - * - * $sftp->setListOrder('filename', SORT_ASC); - * $sftp->setListOrder('size', SORT_DESC, 'filename', SORT_ASC); - * $sftp->setListOrder(true); - * Separates directories from files but doesn't do any sorting beyond that - * $sftp->setListOrder(); - * Don't do any sort of sorting - * - * @param string ...$args - */ - public function setListOrder(...$args) - { - $this->sortOptions = []; - if (empty($args)) { - return; - } - $len = \count($args) & 0x7ffffffe; - for ($i = 0; $i < $len; $i += 2) { - $this->sortOptions[$args[$i]] = $args[$i + 1]; - } - if (!\count($this->sortOptions)) { - $this->sortOptions = ['bogus' => \true]; - } - } - /** - * Save files / directories to cache - * - * @param string $path - * @param mixed $value - */ - private function update_stat_cache($path, $value) - { - if ($this->use_stat_cache === \false) { - return; - } - // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) - $dirs = \explode('/', \preg_replace('#^/|/(?=/)|/$#', '', $path)); - $temp =& $this->stat_cache; - $max = \count($dirs) - 1; - foreach ($dirs as $i => $dir) { - // if $temp is an object that means one of two things. - // 1. a file was deleted and changed to a directory behind phpseclib's back - // 2. it's a symlink. when lstat is done it's unclear what it's a symlink to - if (\is_object($temp)) { - $temp = []; - } - if (!isset($temp[$dir])) { - $temp[$dir] = []; - } - if ($i === $max) { - if (\is_object($temp[$dir]) && \is_object($value)) { - if (!isset($value->stat) && isset($temp[$dir]->stat)) { - $value->stat = $temp[$dir]->stat; - } - if (!isset($value->lstat) && isset($temp[$dir]->lstat)) { - $value->lstat = $temp[$dir]->lstat; - } - } - $temp[$dir] = $value; - break; - } - $temp =& $temp[$dir]; - } - } - /** - * Remove files / directories from cache - * - * @param string $path - * @return bool - */ - private function remove_from_stat_cache($path) - { - $dirs = \explode('/', \preg_replace('#^/|/(?=/)|/$#', '', $path)); - $temp =& $this->stat_cache; - $max = \count($dirs) - 1; - foreach ($dirs as $i => $dir) { - if (!\is_array($temp)) { - return \false; - } - if ($i === $max) { - unset($temp[$dir]); - return \true; - } - if (!isset($temp[$dir])) { - return \false; - } - $temp =& $temp[$dir]; - } - } - /** - * Checks cache for path - * - * Mainly used by file_exists - * - * @param string $path - * @return mixed - */ - private function query_stat_cache($path) - { - $dirs = \explode('/', \preg_replace('#^/|/(?=/)|/$#', '', $path)); - $temp =& $this->stat_cache; - foreach ($dirs as $dir) { - if (!\is_array($temp)) { - return null; - } - if (!isset($temp[$dir])) { - return null; - } - $temp =& $temp[$dir]; - } - return $temp; - } - /** - * Returns general information about a file. - * - * Returns an array on success and false otherwise. - * - * @param string $filename - * @return array|false - */ - public function stat($filename) - { - if (!$this->precheck()) { - return \false; - } - $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; - } - if ($this->use_stat_cache) { - $result = $this->query_stat_cache($filename); - if (\is_array($result) && isset($result['.']) && isset($result['.']->stat)) { - return $result['.']->stat; - } - if (\is_object($result) && isset($result->stat)) { - return $result->stat; - } - } - $stat = $this->stat_helper($filename, NET_SFTP_STAT); - if ($stat === \false) { - $this->remove_from_stat_cache($filename); - return \false; - } - if (isset($stat['type'])) { - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['stat' => $stat]); - return $stat; - } - $pwd = $this->pwd; - $stat['type'] = $this->chdir($filename) ? NET_SFTP_TYPE_DIRECTORY : NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['stat' => $stat]); - return $stat; - } - /** - * Returns general information about a file or symbolic link. - * - * Returns an array on success and false otherwise. - * - * @param string $filename - * @return array|false - */ - public function lstat($filename) - { - if (!$this->precheck()) { - return \false; - } - $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; - } - if ($this->use_stat_cache) { - $result = $this->query_stat_cache($filename); - if (\is_array($result) && isset($result['.']) && isset($result['.']->lstat)) { - return $result['.']->lstat; - } - if (\is_object($result) && isset($result->lstat)) { - return $result->lstat; - } - } - $lstat = $this->stat_helper($filename, NET_SFTP_LSTAT); - if ($lstat === \false) { - $this->remove_from_stat_cache($filename); - return \false; - } - if (isset($lstat['type'])) { - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); - return $lstat; - } - $stat = $this->stat_helper($filename, NET_SFTP_STAT); - if ($lstat != $stat) { - $lstat = \array_merge($lstat, ['type' => NET_SFTP_TYPE_SYMLINK]); - $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); - return $stat; - } - $pwd = $this->pwd; - $lstat['type'] = $this->chdir($filename) ? NET_SFTP_TYPE_DIRECTORY : NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); - return $lstat; - } - /** - * Returns general information about a file or symbolic link - * - * Determines information without calling \phpseclib3\Net\SFTP::realpath(). - * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT. - * - * @param string $filename - * @param int $type - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return array|false - */ - private function stat_helper($filename, $type) - { - // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = Strings::packSSH2('s', $filename); - $this->send_sftp_packet($type, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - return $this->parseAttributes($response); - case NET_SFTP_STATUS: - $this->logError($response); - return \false; - } - throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - /** - * Truncates a file to a given length - * - * @param string $filename - * @param int $new_size - * @return bool - */ - public function truncate($filename, $new_size) - { - $attr = Strings::packSSH2('NQ', NET_SFTP_ATTR_SIZE, $new_size); - return $this->setstat($filename, $attr, \false); - } - /** - * Sets access and modification time of file. - * - * If the file does not exist, it will be created. - * - * @param string $filename - * @param int $time - * @param int $atime - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function touch($filename, $time = null, $atime = null) - { - if (!$this->precheck()) { - return \false; - } - $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; - } - if (!isset($time)) { - $time = \time(); - } - if (!isset($atime)) { - $atime = $time; - } - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_ACCESSTIME, $atime, $time) : Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $atime, $time); - $packet = Strings::packSSH2('s', $filename); - $packet .= $this->version >= 5 ? \pack('N2', 0, NET_SFTP_OPEN_OPEN_EXISTING) : \pack('N', NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL); - $packet .= $attr; - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return $this->close_handle(\substr($response, 4)); - case NET_SFTP_STATUS: - $this->logError($response); - break; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - return $this->setstat($filename, $attr, \false); - } - /** - * Changes file or directory owner - * - * $uid should be an int for SFTPv3 and a string for SFTPv4+. Ideally the string - * would be of the form "user@dns_domain" but it does not need to be. - * `$sftp->getSupportedVersions()['version']` will return the specific version - * that's being used. - * - * Returns true on success or false on error. - * - * @param string $filename - * @param int|string $uid - * @param bool $recursive - * @return bool - */ - public function chown($filename, $uid, $recursive = \false) - { - /* - quoting , - - "To avoid a representation that is tied to a particular underlying - implementation at the client or server, the use of UTF-8 strings has - been chosen. The string should be of the form "user@dns_domain". - This will allow for a client and server that do not use the same - local representation the ability to translate to a common syntax that - can be interpreted by both. In the case where there is no - translation available to the client or server, the attribute value - must be constructed without the "@"." - - phpseclib _could_ auto append the dns_domain to $uid BUT what if it shouldn't - have one? phpseclib would have no way of knowing so rather than guess phpseclib - will just use whatever value the user provided - */ - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1) : Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, $uid, ''); - return $this->setstat($filename, $attr, $recursive); - } - /** - * Changes file or directory group - * - * $gid should be an int for SFTPv3 and a string for SFTPv4+. Ideally the string - * would be of the form "user@dns_domain" but it does not need to be. - * `$sftp->getSupportedVersions()['version']` will return the specific version - * that's being used. - * - * Returns true on success or false on error. - * - * @param string $filename - * @param int|string $gid - * @param bool $recursive - * @return bool - */ - public function chgrp($filename, $gid, $recursive = \false) - { - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid) : Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, '', $gid); - return $this->setstat($filename, $attr, $recursive); - } - /** - * Set permissions on a file. - * - * Returns the new file permissions on success or false on error. - * If $recursive is true than this just returns true or false. - * - * @param int $mode - * @param string $filename - * @param bool $recursive - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return mixed - */ - public function chmod($mode, $filename, $recursive = \false) - { - if (\is_string($mode) && \is_int($filename)) { - $temp = $mode; - $mode = $filename; - $filename = $temp; - } - $attr = \pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); - if (!$this->setstat($filename, $attr, $recursive)) { - return \false; - } - if ($recursive) { - return \true; - } - $filename = $this->realpath($filename); - // rather than return what the permissions *should* be, we'll return what they actually are. this will also - // tell us if the file actually exists. - // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = \pack('Na*', \strlen($filename), $filename); - $this->send_sftp_packet(NET_SFTP_STAT, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - $attrs = $this->parseAttributes($response); - return $attrs['mode']; - case NET_SFTP_STATUS: - $this->logError($response); - return \false; - } - throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - /** - * Sets information about a file - * - * @param string $filename - * @param string $attr - * @param bool $recursive - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - private function setstat($filename, $attr, $recursive) - { - if (!$this->precheck()) { - return \false; - } - $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; - } - $this->remove_from_stat_cache($filename); - if ($recursive) { - $i = 0; - $result = $this->setstat_recursive($filename, $attr, $i); - $this->read_put_responses($i); - return $result; - } - $packet = Strings::packSSH2('s', $filename); - $packet .= $this->version >= 4 ? \pack('a*Ca*', \substr($attr, 0, 4), NET_SFTP_TYPE_UNKNOWN, \substr($attr, 4)) : $attr; - $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); - /* - "Because some systems must use separate system calls to set various attributes, it is possible that a failure - response will be returned, but yet some of the attributes may be have been successfully modified. If possible, - servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." - - -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 - */ - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return \false; - } - return \true; - } - /** - * Recursively sets information on directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param string $path - * @param string $attr - * @param int $i - * @return bool - */ - private function setstat_recursive($path, $attr, &$i) - { - if (!$this->read_put_responses($i)) { - return \false; - } - $i = 0; - $entries = $this->readlist($path, \true); - if ($entries === \false || \is_int($entries)) { - return $this->setstat($path, $attr, \false); - } - // normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading - if (empty($entries)) { - return \false; - } - unset($entries['.'], $entries['..']); - foreach ($entries as $filename => $props) { - if (!isset($props['type'])) { - return \false; - } - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->setstat_recursive($temp, $attr, $i)) { - return \false; - } - } else { - $packet = Strings::packSSH2('s', $temp); - $packet .= $this->version >= 4 ? \pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : $attr; - $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); - $i++; - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return \false; - } - $i = 0; - } - } - } - $packet = Strings::packSSH2('s', $path); - $packet .= $this->version >= 4 ? \pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : $attr; - $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); - $i++; - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return \false; - } - $i = 0; - } - return \true; - } - /** - * Return the target of a symbolic link - * - * @param string $link - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return mixed - */ - public function readlink($link) - { - if (!$this->precheck()) { - return \false; - } - $link = $this->realpath($link); - $this->send_sftp_packet(NET_SFTP_READLINK, Strings::packSSH2('s', $link)); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - break; - case NET_SFTP_STATUS: - $this->logError($response); - return \false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($count) = Strings::unpackSSH2('N', $response); - // the file isn't a symlink - if (!$count) { - return \false; - } - list($filename) = Strings::unpackSSH2('s', $response); - return $filename; - } - /** - * Create a symlink - * - * symlink() creates a symbolic link to the existing target with the specified name link. - * - * @param string $target - * @param string $link - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function symlink($target, $link) - { - if (!$this->precheck()) { - return \false; - } - //$target = $this->realpath($target); - $link = $this->realpath($link); - /* quoting https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-09#section-12.1 : - - Changed the SYMLINK packet to be LINK and give it the ability to - create hard links. Also change it's packet number because many - implementation implemented SYMLINK with the arguments reversed. - Hopefully the new argument names make it clear which way is which. - */ - if ($this->version == 6) { - $type = NET_SFTP_LINK; - $packet = Strings::packSSH2('ssC', $link, $target, 1); - } else { - $type = NET_SFTP_SYMLINK; - /* quoting http://bxr.su/OpenBSD/usr.bin/ssh/PROTOCOL#347 : - - 3.1. sftp: Reversal of arguments to SSH_FXP_SYMLINK - - When OpenSSH's sftp-server was implemented, the order of the arguments - to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately, - the reversal was not noticed until the server was widely deployed. Since - fixing this to follow the specification would cause incompatibility, the - current order was retained. For correct operation, clients should send - SSH_FXP_SYMLINK as follows: - - uint32 id - string targetpath - string linkpath */ - $packet = \substr($this->server_identifier, 0, 15) == 'SSH-2.0-OpenSSH' ? Strings::packSSH2('ss', $target, $link) : Strings::packSSH2('ss', $link, $target); - } - $this->send_sftp_packet($type, $packet); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return \false; - } - return \true; - } - /** - * Creates a directory. - * - * @param string $dir - * @param int $mode - * @param bool $recursive - * @return bool - */ - public function mkdir($dir, $mode = -1, $recursive = \false) - { - if (!$this->precheck()) { - return \false; - } - $dir = $this->realpath($dir); - if ($recursive) { - $dirs = \explode('/', \preg_replace('#/(?=/)|/$#', '', $dir)); - if (empty($dirs[0])) { - \array_shift($dirs); - $dirs[0] = '/' . $dirs[0]; - } - for ($i = 0; $i < \count($dirs); $i++) { - $temp = \array_slice($dirs, 0, $i + 1); - $temp = \implode('/', $temp); - $result = $this->mkdir_helper($temp, $mode); - } - return $result; - } - return $this->mkdir_helper($dir, $mode); - } - /** - * Helper function for directory creation - * - * @param string $dir - * @param int $mode - * @return bool - */ - private function mkdir_helper($dir, $mode) - { - // send SSH_FXP_MKDIR without any attributes (that's what the \0\0\0\0 is doing) - $this->send_sftp_packet(NET_SFTP_MKDIR, Strings::packSSH2('s', $dir) . "\x00\x00\x00\x00"); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return \false; - } - if ($mode !== -1) { - $this->chmod($mode, $dir); - } - return \true; - } - /** - * Removes a directory. - * - * @param string $dir - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function rmdir($dir) - { - if (!$this->precheck()) { - return \false; - } - $dir = $this->realpath($dir); - if ($dir === \false) { - return \false; - } - $this->send_sftp_packet(NET_SFTP_RMDIR, Strings::packSSH2('s', $dir)); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? - $this->logError($response, $status); - return \false; - } - $this->remove_from_stat_cache($dir); - // the following will do a soft delete, which would be useful if you deleted a file - // and then tried to do a stat on the deleted file. the above, in contrast, does - // a hard delete - //$this->update_stat_cache($dir, false); - return \true; - } - /** - * Uploads a file to the SFTP server. - * - * By default, \phpseclib3\Net\SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. - * So, for example, if you set $data to 'filename.ext' and then do \phpseclib3\Net\SFTP::get(), you will get a file, twelve bytes - * long, containing 'filename.ext' as its contents. - * - * Setting $mode to self::SOURCE_LOCAL_FILE will change the above behavior. With self::SOURCE_LOCAL_FILE, $remote_file will - * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how - * large $remote_file will be, as well. - * - * Setting $mode to self::SOURCE_CALLBACK will use $data as callback function, which gets only one parameter -- number - * of bytes to return, and returns a string if there is some data or null if there is no more data - * - * If $data is a resource then it'll be used as a resource instead. - * - * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take - * care of that, yourself. - * - * $mode can take an additional two parameters - self::RESUME and self::RESUME_START. These are bitwise AND'd with - * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following: - * - * self::SOURCE_LOCAL_FILE | self::RESUME - * - * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace - * self::RESUME with self::RESUME_START. - * - * If $mode & (self::RESUME | self::RESUME_START) then self::RESUME_START will be assumed. - * - * $start and $local_start give you more fine grained control over this process and take precident over self::RESUME - * when they're non-negative. ie. $start could let you write at the end of a file (like self::RESUME) or in the middle - * of one. $local_start could let you start your reading from the end of a file (like self::RESUME_START) or in the - * middle of one. - * - * Setting $local_start to > 0 or $mode | self::RESUME_START doesn't do anything unless $mode | self::SOURCE_LOCAL_FILE. - * - * {@internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - \phpseclib3\Net\SFTP::setMode().} - * - * @param string $remote_file - * @param string|resource $data - * @param int $mode - * @param int $start - * @param int $local_start - * @param callable|null $progressCallback - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \BadFunctionCallException if you're uploading via a callback and the callback function is invalid - * @throws \phpseclib3\Exception\FileNotFoundException if you're uploading via a file and the file doesn't exist - * @return bool - */ - public function put($remote_file, $data, $mode = self::SOURCE_STRING, $start = -1, $local_start = -1, $progressCallback = null) - { - if (!$this->precheck()) { - return \false; - } - $remote_file = $this->realpath($remote_file); - if ($remote_file === \false) { - return \false; - } - $this->remove_from_stat_cache($remote_file); - if ($this->version >= 5) { - $flags = NET_SFTP_OPEN_OPEN_OR_CREATE; - } else { - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; - // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file." - // in practice, it doesn't seem to do that. - //$flags|= ($mode & self::RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; - } - if ($start >= 0) { - $offset = $start; - } elseif ($mode & (self::RESUME | self::RESUME_START)) { - // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called - $size = $this->stat($remote_file)['size']; - $offset = $size !== \false ? $size : 0; - } else { - $offset = 0; - if ($this->version >= 5) { - $flags = NET_SFTP_OPEN_CREATE_TRUNCATE; - } else { - $flags |= NET_SFTP_OPEN_TRUNCATE; - } - } - $this->remove_from_stat_cache($remote_file); - $packet = Strings::packSSH2('s', $remote_file); - $packet .= $this->version >= 5 ? \pack('N3', 0, $flags, 0) : \pack('N2', $flags, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = \substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->logError($response); - return \false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 - $dataCallback = \false; - switch (\true) { - case $mode & self::SOURCE_CALLBACK: - if (!\is_callable($data)) { - throw new \BadFunctionCallException("\$data should be is_callable() if you specify SOURCE_CALLBACK flag"); - } - $dataCallback = $data; - // do nothing - break; - case \is_resource($data): - $mode = $mode & ~self::SOURCE_LOCAL_FILE; - $info = \stream_get_meta_data($data); - if (isset($info['wrapper_type']) && $info['wrapper_type'] == 'PHP' && $info['stream_type'] == 'Input') { - $fp = \fopen('php://memory', 'w+'); - \stream_copy_to_stream($data, $fp); - \rewind($fp); - } else { - $fp = $data; - } - break; - case $mode & self::SOURCE_LOCAL_FILE: - if (!\is_file($data)) { - throw new FileNotFoundException("{$data} is not a valid file"); - } - $fp = @\fopen($data, 'rb'); - if (!$fp) { - return \false; - } - } - if (isset($fp)) { - $stat = \fstat($fp); - $size = !empty($stat) ? $stat['size'] : 0; - if ($local_start >= 0) { - \fseek($fp, $local_start); - $size -= $local_start; - } elseif ($mode & self::RESUME) { - \fseek($fp, $offset); - $size -= $offset; - } - } elseif ($dataCallback) { - $size = 0; - } else { - $size = \strlen($data); - } - $sent = 0; - $size = $size < 0 ? ($size & 0x7fffffff) + 0x80000000 : $size; - $sftp_packet_size = $this->max_sftp_packet; - // make the SFTP packet be exactly the SFTP packet size by including the bytes in the NET_SFTP_WRITE packets "header" - $sftp_packet_size -= \strlen($handle) + 25; - $i = $j = 0; - while ($dataCallback || ($size === 0 || $sent < $size)) { - if ($dataCallback) { - $temp = $dataCallback($sftp_packet_size); - if (\is_null($temp)) { - break; - } - } else { - $temp = isset($fp) ? \fread($fp, $sftp_packet_size) : \substr($data, $sent, $sftp_packet_size); - if ($temp === \false || $temp === '') { - break; - } - } - $subtemp = $offset + $sent; - $packet = \pack('Na*N3a*', \strlen($handle), $handle, $subtemp / 4294967296, $subtemp, \strlen($temp), $temp); - try { - $this->send_sftp_packet(NET_SFTP_WRITE, $packet, $j); - } catch (\Exception $e) { - if ($mode & self::SOURCE_LOCAL_FILE) { - \fclose($fp); - } - throw $e; - } - $sent += \strlen($temp); - if (\is_callable($progressCallback)) { - $progressCallback($sent); - } - $i++; - $j++; - if ($i == NET_SFTP_UPLOAD_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - $i = 0; - break; - } - $i = 0; - } - } - $result = $this->close_handle($handle); - if (!$this->read_put_responses($i)) { - if ($mode & self::SOURCE_LOCAL_FILE) { - \fclose($fp); - } - $this->close_handle($handle); - return \false; - } - if ($mode & \phpseclib3\Net\SFTP::SOURCE_LOCAL_FILE) { - if (isset($fp) && \is_resource($fp)) { - \fclose($fp); - } - if ($this->preserveTime) { - $stat = \stat($data); - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_ACCESSTIME, $stat['atime'], $stat['mtime']) : Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $stat['atime'], $stat['mtime']); - if (!$this->setstat($remote_file, $attr, \false)) { - throw new \RuntimeException('Error setting file time'); - } - } - } - return $result; - } - /** - * Reads multiple successive SSH_FXP_WRITE responses - * - * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i - * SSH_FXP_WRITEs, in succession, and then reading $i responses. - * - * @param int $i - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - private function read_put_responses($i) - { - while ($i--) { - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - break; - } - } - return $i < 0; - } - /** - * Close handle - * - * @param string $handle - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - private function close_handle($handle) - { - $this->send_sftp_packet(NET_SFTP_CLOSE, \pack('Na*', \strlen($handle), $handle)); - // "The client MUST release all resources associated with the handle regardless of the status." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return \false; - } - return \true; - } - /** - * Downloads a file from the SFTP server. - * - * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if - * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the - * operation. - * - * $offset and $length can be used to download files in chunks. - * - * @param string $remote_file - * @param string|bool|resource|callable $local_file - * @param int $offset - * @param int $length - * @param callable|null $progressCallback - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return string|bool - */ - public function get($remote_file, $local_file = \false, $offset = 0, $length = -1, $progressCallback = null) - { - if (!$this->precheck()) { - return \false; - } - $remote_file = $this->realpath($remote_file); - if ($remote_file === \false) { - return \false; - } - $packet = Strings::packSSH2('s', $remote_file); - $packet .= $this->version >= 5 ? \pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : \pack('N2', NET_SFTP_OPEN_READ, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = \substr($response, 4); - break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->logError($response); - return \false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - if (\is_resource($local_file)) { - $fp = $local_file; - $stat = \fstat($fp); - $res_offset = $stat['size']; - } else { - $res_offset = 0; - if ($local_file !== \false && !\is_callable($local_file)) { - $fp = \fopen($local_file, 'wb'); - if (!$fp) { - return \false; - } - } else { - $content = ''; - } - } - $fclose_check = $local_file !== \false && !\is_callable($local_file) && !\is_resource($local_file); - $start = $offset; - $read = 0; - while (\true) { - $i = 0; - while ($i < NET_SFTP_QUEUE_SIZE && ($length < 0 || $read < $length)) { - $tempoffset = $start + $read; - $packet_size = $length > 0 ? \min($this->max_sftp_packet, $length - $read) : $this->max_sftp_packet; - $packet = Strings::packSSH2('sN3', $handle, $tempoffset / 4294967296, $tempoffset, $packet_size); - try { - $this->send_sftp_packet(NET_SFTP_READ, $packet, $i); - } catch (\Exception $e) { - if ($fclose_check) { - \fclose($fp); - } - throw $e; - } - $packet = null; - $read += $packet_size; - $i++; - } - if (!$i) { - break; - } - $packets_sent = $i - 1; - $clear_responses = \false; - while ($i > 0) { - $i--; - if ($clear_responses) { - $this->get_sftp_packet($packets_sent - $i); - continue; - } else { - $response = $this->get_sftp_packet($packets_sent - $i); - } - switch ($this->packet_type) { - case NET_SFTP_DATA: - $temp = \substr($response, 4); - $offset += \strlen($temp); - if ($local_file === \false) { - $content .= $temp; - } elseif (\is_callable($local_file)) { - $local_file($temp); - } else { - \fputs($fp, $temp); - } - if (\is_callable($progressCallback)) { - \call_user_func($progressCallback, $offset); - } - $temp = null; - break; - case NET_SFTP_STATUS: - // could, in theory, return false if !strlen($content) but we'll hold off for the time being - $this->logError($response); - $clear_responses = \true; - // don't break out of the loop yet, so we can read the remaining responses - break; - default: - if ($fclose_check) { - \fclose($fp); - } - if ($this->channel_close) { - $this->partial_init = \false; - $this->init_sftp_connection(); - return \false; - } else { - throw new \UnexpectedValueException('Expected NET_SFTP_DATA or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - } - $response = null; - } - if ($clear_responses) { - break; - } - } - if ($fclose_check) { - \fclose($fp); - if ($this->preserveTime) { - $stat = $this->stat($remote_file); - \touch($local_file, $stat['mtime'], $stat['atime']); - } - } - if (!$this->close_handle($handle)) { - return \false; - } - // if $content isn't set that means a file was written to - return isset($content) ? $content : \true; - } - /** - * Deletes a file on the SFTP server. - * - * @param string $path - * @param bool $recursive - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - public function delete($path, $recursive = \true) - { - if (!$this->precheck()) { - return \false; - } - if (\is_object($path)) { - // It's an object. Cast it as string before we check anything else. - $path = (string) $path; - } - if (!\is_string($path) || $path == '') { - return \false; - } - $path = $this->realpath($path); - if ($path === \false) { - return \false; - } - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $this->send_sftp_packet(NET_SFTP_REMOVE, \pack('Na*', \strlen($path), $path)); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - if (!$recursive) { - return \false; - } - $i = 0; - $result = $this->delete_recursive($path, $i); - $this->read_put_responses($i); - return $result; - } - $this->remove_from_stat_cache($path); - return \true; - } - /** - * Recursively deletes directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param string $path - * @param int $i - * @return bool - */ - private function delete_recursive($path, &$i) - { - if (!$this->read_put_responses($i)) { - return \false; - } - $i = 0; - $entries = $this->readlist($path, \true); - // The folder does not exist at all, so we cannot delete it. - if ($entries === NET_SFTP_STATUS_NO_SUCH_FILE) { - return \false; - } - // Normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading. If this happens then default to an empty list of files. - if ($entries === \false || \is_int($entries)) { - $entries = []; - } - unset($entries['.'], $entries['..']); - foreach ($entries as $filename => $props) { - if (!isset($props['type'])) { - return \false; - } - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->delete_recursive($temp, $i)) { - return \false; - } - } else { - $this->send_sftp_packet(NET_SFTP_REMOVE, Strings::packSSH2('s', $temp)); - $this->remove_from_stat_cache($temp); - $i++; - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return \false; - } - $i = 0; - } - } - } - $this->send_sftp_packet(NET_SFTP_RMDIR, Strings::packSSH2('s', $path)); - $this->remove_from_stat_cache($path); - $i++; - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return \false; - } - $i = 0; - } - return \true; - } - /** - * Checks whether a file or directory exists - * - * @param string $path - * @return bool - */ - public function file_exists($path) - { - if ($this->use_stat_cache) { - if (!$this->precheck()) { - return \false; - } - $path = $this->realpath($path); - $result = $this->query_stat_cache($path); - if (isset($result)) { - // return true if $result is an array or if it's an stdClass object - return $result !== \false; - } - } - return $this->stat($path) !== \false; - } - /** - * Tells whether the filename is a directory - * - * @param string $path - * @return bool - */ - public function is_dir($path) - { - $result = $this->get_stat_cache_prop($path, 'type'); - if ($result === \false) { - return \false; - } - return $result === NET_SFTP_TYPE_DIRECTORY; - } - /** - * Tells whether the filename is a regular file - * - * @param string $path - * @return bool - */ - public function is_file($path) - { - $result = $this->get_stat_cache_prop($path, 'type'); - if ($result === \false) { - return \false; - } - return $result === NET_SFTP_TYPE_REGULAR; - } - /** - * Tells whether the filename is a symbolic link - * - * @param string $path - * @return bool - */ - public function is_link($path) - { - $result = $this->get_lstat_cache_prop($path, 'type'); - if ($result === \false) { - return \false; - } - return $result === NET_SFTP_TYPE_SYMLINK; - } - /** - * Tells whether a file exists and is readable - * - * @param string $path - * @return bool - */ - public function is_readable($path) - { - if (!$this->precheck()) { - return \false; - } - $packet = Strings::packSSH2('sNN', $this->realpath($path), NET_SFTP_OPEN_READ, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return \true; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - return \false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - } - /** - * Tells whether the filename is writable - * - * @param string $path - * @return bool - */ - public function is_writable($path) - { - if (!$this->precheck()) { - return \false; - } - $packet = Strings::packSSH2('sNN', $this->realpath($path), NET_SFTP_OPEN_WRITE, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return \true; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - return \false; - default: - throw new \UnexpectedValueException('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - } - /** - * Tells whether the filename is writeable - * - * Alias of is_writable - * - * @param string $path - * @return bool - */ - public function is_writeable($path) - { - return $this->is_writable($path); - } - /** - * Gets last access time of file - * - * @param string $path - * @return mixed - */ - public function fileatime($path) - { - return $this->get_stat_cache_prop($path, 'atime'); - } - /** - * Gets file modification time - * - * @param string $path - * @return mixed - */ - public function filemtime($path) - { - return $this->get_stat_cache_prop($path, 'mtime'); - } - /** - * Gets file permissions - * - * @param string $path - * @return mixed - */ - public function fileperms($path) - { - return $this->get_stat_cache_prop($path, 'mode'); - } - /** - * Gets file owner - * - * @param string $path - * @return mixed - */ - public function fileowner($path) - { - return $this->get_stat_cache_prop($path, 'uid'); - } - /** - * Gets file group - * - * @param string $path - * @return mixed - */ - public function filegroup($path) - { - return $this->get_stat_cache_prop($path, 'gid'); - } - /** - * Recursively go through rawlist() output to get the total filesize - * - * @return int - */ - private static function recursiveFilesize(array $files) - { - $size = 0; - foreach ($files as $name => $file) { - if ($name == '.' || $name == '..') { - continue; - } - $size += \is_array($file) ? self::recursiveFilesize($file) : $file->size; - } - return $size; - } - /** - * Gets file size - * - * @param string $path - * @param bool $recursive - * @return mixed - */ - public function filesize($path, $recursive = \false) - { - return !$recursive || $this->filetype($path) != 'dir' ? $this->get_stat_cache_prop($path, 'size') : self::recursiveFilesize($this->rawlist($path, \true)); - } - /** - * Gets file type - * - * @param string $path - * @return string|false - */ - public function filetype($path) - { - $type = $this->get_stat_cache_prop($path, 'type'); - if ($type === \false) { - return \false; - } - switch ($type) { - case NET_SFTP_TYPE_BLOCK_DEVICE: - return 'block'; - case NET_SFTP_TYPE_CHAR_DEVICE: - return 'char'; - case NET_SFTP_TYPE_DIRECTORY: - return 'dir'; - case NET_SFTP_TYPE_FIFO: - return 'fifo'; - case NET_SFTP_TYPE_REGULAR: - return 'file'; - case NET_SFTP_TYPE_SYMLINK: - return 'link'; - default: - return \false; - } - } - /** - * Return a stat properity - * - * Uses cache if appropriate. - * - * @param string $path - * @param string $prop - * @return mixed - */ - private function get_stat_cache_prop($path, $prop) - { - return $this->get_xstat_cache_prop($path, $prop, 'stat'); - } - /** - * Return an lstat properity - * - * Uses cache if appropriate. - * - * @param string $path - * @param string $prop - * @return mixed - */ - private function get_lstat_cache_prop($path, $prop) - { - return $this->get_xstat_cache_prop($path, $prop, 'lstat'); - } - /** - * Return a stat or lstat properity - * - * Uses cache if appropriate. - * - * @param string $path - * @param string $prop - * @param string $type - * @return mixed - */ - private function get_xstat_cache_prop($path, $prop, $type) - { - if (!$this->precheck()) { - return \false; - } - if ($this->use_stat_cache) { - $path = $this->realpath($path); - $result = $this->query_stat_cache($path); - if (\is_object($result) && isset($result->{$type})) { - return $result->{$type}[$prop]; - } - } - $result = $this->{$type}($path); - if ($result === \false || !isset($result[$prop])) { - return \false; - } - return $result[$prop]; - } - /** - * Renames a file or a directory on the SFTP server. - * - * If the file already exists this will return false - * - * @param string $oldname - * @param string $newname - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - public function rename($oldname, $newname) - { - if (!$this->precheck()) { - return \false; - } - $oldname = $this->realpath($oldname); - $newname = $this->realpath($newname); - if ($oldname === \false || $newname === \false) { - return \false; - } - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $packet = Strings::packSSH2('ss', $oldname, $newname); - if ($this->version >= 5) { - /* quoting https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-05#section-6.5 , - - 'flags' is 0 or a combination of: - - SSH_FXP_RENAME_OVERWRITE 0x00000001 - SSH_FXP_RENAME_ATOMIC 0x00000002 - SSH_FXP_RENAME_NATIVE 0x00000004 - - (none of these are currently supported) */ - $packet .= "\x00\x00\x00\x00"; - } - $this->send_sftp_packet(NET_SFTP_RENAME, $packet); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); - } - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return \false; - } - // don't move the stat cache entry over since this operation could very well change the - // atime and mtime attributes - //$this->update_stat_cache($newname, $this->query_stat_cache($oldname)); - $this->remove_from_stat_cache($oldname); - $this->remove_from_stat_cache($newname); - return \true; - } - /** - * Parse Time - * - * See '7.7. Times' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param string $key - * @param int $flags - * @param string $response - * @return array - */ - private function parseTime($key, $flags, &$response) - { - $attr = []; - list($attr[$key]) = Strings::unpackSSH2('Q', $response); - if ($flags & NET_SFTP_ATTR_SUBSECOND_TIMES) { - list($attr[$key . '-nseconds']) = Strings::unpackSSH2('N', $response); - } - return $attr; - } - /** - * Parse Attributes - * - * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param string $response - * @return array - */ - protected function parseAttributes(&$response) - { - if ($this->version >= 4) { - list($flags, $attr['type']) = Strings::unpackSSH2('NC', $response); - } else { - list($flags) = Strings::unpackSSH2('N', $response); - } - foreach (self::$attributes as $key => $value) { - switch ($flags & $key) { - case NET_SFTP_ATTR_UIDGID: - if ($this->version > 3) { - continue 2; - } - break; - case NET_SFTP_ATTR_CREATETIME: - case NET_SFTP_ATTR_MODIFYTIME: - case NET_SFTP_ATTR_ACL: - case NET_SFTP_ATTR_OWNERGROUP: - case NET_SFTP_ATTR_SUBSECOND_TIMES: - if ($this->version < 4) { - continue 2; - } - break; - case NET_SFTP_ATTR_BITS: - if ($this->version < 5) { - continue 2; - } - break; - case NET_SFTP_ATTR_ALLOCATION_SIZE: - case NET_SFTP_ATTR_TEXT_HINT: - case NET_SFTP_ATTR_MIME_TYPE: - case NET_SFTP_ATTR_LINK_COUNT: - case NET_SFTP_ATTR_UNTRANSLATED_NAME: - case NET_SFTP_ATTR_CTIME: - if ($this->version < 6) { - continue 2; - } - } - switch ($flags & $key) { - case NET_SFTP_ATTR_SIZE: - // 0x00000001 - // The size attribute is defined as an unsigned 64-bit integer. - // The following will use floats on 32-bit platforms, if necessary. - // As can be seen in the BigInteger class, floats are generally - // IEEE 754 binary64 "double precision" on such platforms and - // as such can represent integers of at least 2^50 without loss - // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. - list($attr['size']) = Strings::unpackSSH2('Q', $response); - break; - case NET_SFTP_ATTR_UIDGID: - // 0x00000002 (SFTPv3 only) - list($attr['uid'], $attr['gid']) = Strings::unpackSSH2('NN', $response); - break; - case NET_SFTP_ATTR_PERMISSIONS: - // 0x00000004 - list($attr['mode']) = Strings::unpackSSH2('N', $response); - $fileType = $this->parseMode($attr['mode']); - if ($this->version < 4 && $fileType !== \false) { - $attr += ['type' => $fileType]; - } - break; - case NET_SFTP_ATTR_ACCESSTIME: - // 0x00000008 - if ($this->version >= 4) { - $attr += $this->parseTime('atime', $flags, $response); - break; - } - list($attr['atime'], $attr['mtime']) = Strings::unpackSSH2('NN', $response); - break; - case NET_SFTP_ATTR_CREATETIME: - // 0x00000010 (SFTPv4+) - $attr += $this->parseTime('createtime', $flags, $response); - break; - case NET_SFTP_ATTR_MODIFYTIME: - // 0x00000020 - $attr += $this->parseTime('mtime', $flags, $response); - break; - case NET_SFTP_ATTR_ACL: - // 0x00000040 - // access control list - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-04#section-5.7 - // currently unsupported - list($count) = Strings::unpackSSH2('N', $response); - for ($i = 0; $i < $count; $i++) { - list($type, $flag, $mask, $who) = Strings::unpackSSH2('N3s', $result); - } - break; - case NET_SFTP_ATTR_OWNERGROUP: - // 0x00000080 - list($attr['owner'], $attr['$group']) = Strings::unpackSSH2('ss', $response); - break; - case NET_SFTP_ATTR_SUBSECOND_TIMES: - // 0x00000100 - break; - case NET_SFTP_ATTR_BITS: - // 0x00000200 (SFTPv5+) - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-05#section-5.8 - // currently unsupported - // tells if you file is: - // readonly, system, hidden, case inensitive, archive, encrypted, compressed, sparse - // append only, immutable, sync - list($attrib_bits, $attrib_bits_valid) = Strings::unpackSSH2('N2', $response); - // if we were actually gonna implement the above it ought to be - // $attr['attrib-bits'] and $attr['attrib-bits-valid'] - // eg. - instead of _ - break; - case NET_SFTP_ATTR_ALLOCATION_SIZE: - // 0x00000400 (SFTPv6+) - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.4 - // represents the number of bytes that the file consumes on the disk. will - // usually be larger than the 'size' field - list($attr['allocation-size']) = Strings::unpackSSH2('Q', $response); - break; - case NET_SFTP_ATTR_TEXT_HINT: - // 0x00000800 - // https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.10 - // currently unsupported - // tells if file is "known text", "guessed text", "known binary", "guessed binary" - list($text_hint) = Strings::unpackSSH2('C', $response); - // the above should be $attr['text-hint'] - break; - case NET_SFTP_ATTR_MIME_TYPE: - // 0x00001000 - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.11 - list($attr['mime-type']) = Strings::unpackSSH2('s', $response); - break; - case NET_SFTP_ATTR_LINK_COUNT: - // 0x00002000 - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.12 - list($attr['link-count']) = Strings::unpackSSH2('N', $response); - break; - case NET_SFTP_ATTR_UNTRANSLATED_NAME: - // 0x00004000 - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.13 - list($attr['untranslated-name']) = Strings::unpackSSH2('s', $response); - break; - case NET_SFTP_ATTR_CTIME: - // 0x00008000 - // 'ctime' contains the last time the file attributes were changed. The - // exact meaning of this field depends on the server. - $attr += $this->parseTime('ctime', $flags, $response); - break; - case NET_SFTP_ATTR_EXTENDED: - // 0x80000000 - list($count) = Strings::unpackSSH2('N', $response); - for ($i = 0; $i < $count; $i++) { - list($key, $value) = Strings::unpackSSH2('ss', $response); - $attr[$key] = $value; - } - } - } - return $attr; - } - /** - * Attempt to identify the file type - * - * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway - * - * @param int $mode - * @return int - */ - private function parseMode($mode) - { - // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 - // see, also, http://linux.die.net/man/2/stat - switch ($mode & 0170000) { - // ie. 1111 0000 0000 0000 - case 00: - // no file type specified - figure out the file type using alternative means - return \false; - case 040000: - return NET_SFTP_TYPE_DIRECTORY; - case 0100000: - return NET_SFTP_TYPE_REGULAR; - case 0120000: - return NET_SFTP_TYPE_SYMLINK; - // new types introduced in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - case 010000: - // named pipe (fifo) - return NET_SFTP_TYPE_FIFO; - case 020000: - // character special - return NET_SFTP_TYPE_CHAR_DEVICE; - case 060000: - // block special - return NET_SFTP_TYPE_BLOCK_DEVICE; - case 0140000: - // socket - return NET_SFTP_TYPE_SOCKET; - case 0160000: - // whiteout - // "SPECIAL should be used for files that are of - // a known type which cannot be expressed in the protocol" - return NET_SFTP_TYPE_SPECIAL; - default: - return NET_SFTP_TYPE_UNKNOWN; - } - } - /** - * Parse Longname - * - * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open - * a file as a directory and see if an error is returned or you could try to parse the - * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does. - * The result is returned using the - * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}. - * - * If the longname is in an unrecognized format bool(false) is returned. - * - * @param string $longname - * @return mixed - */ - private function parseLongname($longname) - { - // http://en.wikipedia.org/wiki/Unix_file_types - // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions - if (\preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { - switch ($longname[0]) { - case '-': - return NET_SFTP_TYPE_REGULAR; - case 'd': - return NET_SFTP_TYPE_DIRECTORY; - case 'l': - return NET_SFTP_TYPE_SYMLINK; - default: - return NET_SFTP_TYPE_SPECIAL; - } - } - return \false; - } - /** - * Sends SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param int $type - * @param string $data - * @param int $request_id - * @see self::_get_sftp_packet() - * @see self::send_channel_packet() - * @return void - */ - private function send_sftp_packet($type, $data, $request_id = 1) - { - // in SSH2.php the timeout is cumulative per function call. eg. exec() will - // timeout after 10s. but for SFTP.php it's cumulative per packet - $this->curTimeout = $this->timeout; - $packet = $this->use_request_id ? \pack('NCNa*', \strlen($data) + 5, $type, $request_id, $data) : \pack('NCa*', \strlen($data) + 1, $type, $data); - $start = \microtime(\true); - $this->send_channel_packet(self::CHANNEL, $packet); - $stop = \microtime(\true); - if (\defined('NET_SFTP_LOGGING')) { - $packet_type = '-> ' . self::$packet_types[$type] . ' (' . \round($stop - $start, 4) . 's)'; - $this->append_log($packet_type, $data); - } - } - /** - * Resets a connection for re-use - * - * @param int $reason - */ - protected function reset_connection($reason) - { - parent::reset_connection($reason); - $this->use_request_id = \false; - $this->pwd = \false; - $this->requestBuffer = []; - } - /** - * Receives SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present. - * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA - * messages containing one SFTP packet. - * - * @see self::_send_sftp_packet() - * @return string - */ - private function get_sftp_packet($request_id = null) - { - $this->channel_close = \false; - if (isset($request_id) && isset($this->requestBuffer[$request_id])) { - $this->packet_type = $this->requestBuffer[$request_id]['packet_type']; - $temp = $this->requestBuffer[$request_id]['packet']; - unset($this->requestBuffer[$request_id]); - return $temp; - } - // in SSH2.php the timeout is cumulative per function call. eg. exec() will - // timeout after 10s. but for SFTP.php it's cumulative per packet - $this->curTimeout = $this->timeout; - $start = \microtime(\true); - // SFTP packet length - while (\strlen($this->packet_buffer) < 4) { - $temp = $this->get_channel_packet(self::CHANNEL, \true); - if ($temp === \true) { - if ($this->channel_status[self::CHANNEL] === NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->channel_close = \true; - } - $this->packet_type = \false; - $this->packet_buffer = ''; - return \false; - } - $this->packet_buffer .= $temp; - } - if (\strlen($this->packet_buffer) < 4) { - throw new \RuntimeException('Packet is too small'); - } - \extract(\unpack('Nlength', Strings::shift($this->packet_buffer, 4))); - /** @var integer $length */ - $tempLength = $length; - $tempLength -= \strlen($this->packet_buffer); - // 256 * 1024 is what SFTP_MAX_MSG_LENGTH is set to in OpenSSH's sftp-common.h - if (!$this->allow_arbitrary_length_packets && !$this->use_request_id && $tempLength > 256 * 1024) { - throw new \RuntimeException('Invalid Size'); - } - // SFTP packet type and data payload - while ($tempLength > 0) { - $temp = $this->get_channel_packet(self::CHANNEL, \true); - if ($temp === \true) { - if ($this->channel_status[self::CHANNEL] === NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->channel_close = \true; - } - $this->packet_type = \false; - $this->packet_buffer = ''; - return \false; - } - $this->packet_buffer .= $temp; - $tempLength -= \strlen($temp); - } - $stop = \microtime(\true); - $this->packet_type = \ord(Strings::shift($this->packet_buffer)); - if ($this->use_request_id) { - \extract(\unpack('Npacket_id', Strings::shift($this->packet_buffer, 4))); - // remove the request id - $length -= 5; - // account for the request id and the packet type - } else { - $length -= 1; - // account for the packet type - } - $packet = Strings::shift($this->packet_buffer, $length); - if (\defined('NET_SFTP_LOGGING')) { - $packet_type = '<- ' . self::$packet_types[$this->packet_type] . ' (' . \round($stop - $start, 4) . 's)'; - $this->append_log($packet_type, $packet); - } - if (isset($request_id) && $this->use_request_id && $packet_id != $request_id) { - $this->requestBuffer[$packet_id] = ['packet_type' => $this->packet_type, 'packet' => $packet]; - return $this->get_sftp_packet($request_id); - } - return $packet; - } - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param string $message_number - * @param string $message - */ - private function append_log($message_number, $message) - { - $this->append_log_helper(NET_SFTP_LOGGING, $message_number, $message, $this->packet_type_log, $this->packet_log, $this->log_size, $this->realtime_log_file, $this->realtime_log_wrap, $this->realtime_log_size); - } - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SFTP_LOGGING == self::LOG_COMPLEX, an array if NET_SFTP_LOGGING == self::LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING') - * - * @return array|string|false - */ - public function getSFTPLog() - { - if (!\defined('NET_SFTP_LOGGING')) { - return \false; - } - switch (NET_SFTP_LOGGING) { - case self::LOG_COMPLEX: - return $this->format_log($this->packet_log, $this->packet_type_log); - break; - //case self::LOG_SIMPLE: - default: - return $this->packet_type_log; - } - } - /** - * Returns all errors - * - * @return array - */ - public function getSFTPErrors() - { - return $this->sftp_errors; - } - /** - * Returns the last error - * - * @return string - */ - public function getLastSFTPError() - { - return \count($this->sftp_errors) ? $this->sftp_errors[\count($this->sftp_errors) - 1] : ''; - } - /** - * Get supported SFTP versions - * - * @return array - */ - public function getSupportedVersions() - { - if (!($this->bitmap & \phpseclib3\Net\SSH2::MASK_LOGIN)) { - return \false; - } - if (!$this->partial_init) { - $this->partial_init_sftp_connection(); - } - $temp = ['version' => $this->defaultVersion]; - if (isset($this->extensions['versions'])) { - $temp['extensions'] = $this->extensions['versions']; - } - return $temp; - } - /** - * Get supported SFTP versions - * - * @return int|false - */ - public function getNegotiatedVersion() - { - if (!$this->precheck()) { - return \false; - } - return $this->version; - } - /** - * Set preferred version - * - * If you're preferred version isn't supported then the highest supported - * version of SFTP will be utilized. Set to null or false or int(0) to - * unset the preferred version - * - * @param int $version - */ - public function setPreferredVersion($version) - { - $this->preferredVersion = $version; - } - /** - * Disconnect - * - * @param int $reason - * @return false - */ - protected function disconnect_helper($reason) - { - $this->pwd = \false; - return parent::disconnect_helper($reason); - } - /** - * Enable Date Preservation - * - */ - public function enableDatePreservation() - { - $this->preserveTime = \true; - } - /** - * Disable Date Preservation - * - */ - public function disableDatePreservation() - { - $this->preserveTime = \false; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php b/dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php deleted file mode 100644 index ec8d5e4..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php +++ /dev/null @@ -1,697 +0,0 @@ - - * @copyright 2013 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Net\SFTP; - -use phpseclib3\Crypt\Common\PrivateKey; -use phpseclib3\Net\SFTP; -use phpseclib3\Net\SSH2; -/** - * SFTP Stream Wrapper - * - * @author Jim Wigginton - */ -class Stream -{ - /** - * SFTP instances - * - * Rather than re-create the connection we re-use instances if possible - * - * @var array - */ - public static $instances; - /** - * SFTP instance - * - * @var object - */ - private $sftp; - /** - * Path - * - * @var string - */ - private $path; - /** - * Mode - * - * @var string - */ - private $mode; - /** - * Position - * - * @var int - */ - private $pos; - /** - * Size - * - * @var int - */ - private $size; - /** - * Directory entries - * - * @var array - */ - private $entries; - /** - * EOF flag - * - * @var bool - */ - private $eof; - /** - * Context resource - * - * Technically this needs to be publicly accessible so PHP can set it directly - * - * @var resource - */ - public $context; - /** - * Notification callback function - * - * @var callable - */ - private $notification; - /** - * Registers this class as a URL wrapper. - * - * @param string $protocol The wrapper name to be registered. - * @return bool True on success, false otherwise. - */ - public static function register($protocol = 'sftp') - { - if (\in_array($protocol, \stream_get_wrappers(), \true)) { - return \false; - } - return \stream_wrapper_register($protocol, \get_called_class()); - } - /** - * The Constructor - * - */ - public function __construct() - { - if (\defined('NET_SFTP_STREAM_LOGGING')) { - echo "__construct()\r\n"; - } - } - /** - * Path Parser - * - * Extract a path from a URI and actually connect to an SSH server if appropriate - * - * If "notification" is set as a context parameter the message code for successful login is - * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE. - * - * @param string $path - * @return string - */ - protected function parse_path($path) - { - $orig = $path; - \extract(\parse_url($path) + ['port' => 22]); - if (isset($query)) { - $path .= '?' . $query; - } elseif (\preg_match('/(\\?|\\?#)$/', $orig)) { - $path .= '?'; - } - if (isset($fragment)) { - $path .= '#' . $fragment; - } elseif ($orig[\strlen($orig) - 1] == '#') { - $path .= '#'; - } - if (!isset($host)) { - return \false; - } - if (isset($this->context)) { - $context = \stream_context_get_params($this->context); - if (isset($context['notification'])) { - $this->notification = $context['notification']; - } - } - if (\preg_match('/^{[a-z0-9]+}$/i', $host)) { - $host = SSH2::getConnectionByResourceId($host); - if ($host === \false) { - return \false; - } - $this->sftp = $host; - } else { - if (isset($this->context)) { - $context = \stream_context_get_options($this->context); - } - if (isset($context[$scheme]['session'])) { - $sftp = $context[$scheme]['session']; - } - if (isset($context[$scheme]['sftp'])) { - $sftp = $context[$scheme]['sftp']; - } - if (isset($sftp) && $sftp instanceof SFTP) { - $this->sftp = $sftp; - return $path; - } - if (isset($context[$scheme]['username'])) { - $user = $context[$scheme]['username']; - } - if (isset($context[$scheme]['password'])) { - $pass = $context[$scheme]['password']; - } - if (isset($context[$scheme]['privkey']) && $context[$scheme]['privkey'] instanceof PrivateKey) { - $pass = $context[$scheme]['privkey']; - } - if (!isset($user) || !isset($pass)) { - return \false; - } - // casting $pass to a string is necessary in the event that it's a \phpseclib3\Crypt\RSA object - if (isset(self::$instances[$host][$port][$user][(string) $pass])) { - $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; - } else { - $this->sftp = new SFTP($host, $port); - $this->sftp->disableStatCache(); - if (isset($this->notification) && \is_callable($this->notification)) { - /* if !is_callable($this->notification) we could do this: - - user_error('fopen(): failed to call user notifier', E_USER_WARNING); - - the ftp wrapper gives errors like that when the notifier isn't callable. - i've opted not to do that, however, since the ftp wrapper gives the line - on which the fopen occurred as the line number - not the line that the - user_error is on. - */ - \call_user_func($this->notification, \STREAM_NOTIFY_CONNECT, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - \call_user_func($this->notification, \STREAM_NOTIFY_AUTH_REQUIRED, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - if (!$this->sftp->login($user, $pass)) { - \call_user_func($this->notification, \STREAM_NOTIFY_AUTH_RESULT, \STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); - return \false; - } - \call_user_func($this->notification, \STREAM_NOTIFY_AUTH_RESULT, \STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); - } else { - if (!$this->sftp->login($user, $pass)) { - return \false; - } - } - self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; - } - } - return $path; - } - /** - * Opens file or URL - * - * @param string $path - * @param string $mode - * @param int $options - * @param string $opened_path - * @return bool - */ - private function _stream_open($path, $mode, $options, &$opened_path) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - $this->path = $path; - $this->size = $this->sftp->filesize($path); - $this->mode = \preg_replace('#[bt]$#', '', $mode); - $this->eof = \false; - if ($this->size === \false) { - if ($this->mode[0] == 'r') { - return \false; - } else { - $this->sftp->touch($path); - $this->size = 0; - } - } else { - switch ($this->mode[0]) { - case 'x': - return \false; - case 'w': - $this->sftp->truncate($path, 0); - $this->size = 0; - } - } - $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; - return \true; - } - /** - * Read from stream - * - * @param int $count - * @return mixed - */ - private function _stream_read($count) - { - switch ($this->mode) { - case 'w': - case 'a': - case 'x': - case 'c': - return \false; - } - // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite - //if ($this->pos >= $this->size) { - // $this->eof = true; - // return false; - //} - $result = $this->sftp->get($this->path, \false, $this->pos, $count); - if (isset($this->notification) && \is_callable($this->notification)) { - if ($result === \false) { - \call_user_func($this->notification, \STREAM_NOTIFY_FAILURE, \STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP calls stream_read in 8k chunks - \call_user_func($this->notification, \STREAM_NOTIFY_PROGRESS, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, \strlen($result), $this->size); - } - if (empty($result)) { - // ie. false or empty string - $this->eof = \true; - return \false; - } - $this->pos += \strlen($result); - return $result; - } - /** - * Write to stream - * - * @param string $data - * @return int|false - */ - private function _stream_write($data) - { - switch ($this->mode) { - case 'r': - return \false; - } - $result = $this->sftp->put($this->path, $data, SFTP::SOURCE_STRING, $this->pos); - if (isset($this->notification) && \is_callable($this->notification)) { - if (!$result) { - \call_user_func($this->notification, \STREAM_NOTIFY_FAILURE, \STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP splits up strings into 8k blocks before calling stream_write - \call_user_func($this->notification, \STREAM_NOTIFY_PROGRESS, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, \strlen($data), \strlen($data)); - } - if ($result === \false) { - return \false; - } - $this->pos += \strlen($data); - if ($this->pos > $this->size) { - $this->size = $this->pos; - } - $this->eof = \false; - return \strlen($data); - } - /** - * Retrieve the current position of a stream - * - * @return int - */ - private function _stream_tell() - { - return $this->pos; - } - /** - * Tests for end-of-file on a file pointer - * - * In my testing there are four classes functions that normally effect the pointer: - * fseek, fputs / fwrite, fgets / fread and ftruncate. - * - * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. - * - * @return bool - */ - private function _stream_eof() - { - return $this->eof; - } - /** - * Seeks to specific location in a stream - * - * @param int $offset - * @param int $whence - * @return bool - */ - private function _stream_seek($offset, $whence) - { - switch ($whence) { - case \SEEK_SET: - if ($offset < 0) { - return \false; - } - break; - case \SEEK_CUR: - $offset += $this->pos; - break; - case \SEEK_END: - $offset += $this->size; - } - $this->pos = $offset; - $this->eof = \false; - return \true; - } - /** - * Change stream options - * - * @param string $path - * @param int $option - * @param mixed $var - * @return bool - */ - private function _stream_metadata($path, $option, $var) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined - // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 - // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 - switch ($option) { - case 1: - // PHP_STREAM_META_TOUCH - $time = isset($var[0]) ? $var[0] : null; - $atime = isset($var[1]) ? $var[1] : null; - return $this->sftp->touch($path, $time, $atime); - case 2: - // PHP_STREAM_OWNER_NAME - case 3: - // PHP_STREAM_GROUP_NAME - return \false; - case 4: - // PHP_STREAM_META_OWNER - return $this->sftp->chown($path, $var); - case 5: - // PHP_STREAM_META_GROUP - return $this->sftp->chgrp($path, $var); - case 6: - // PHP_STREAM_META_ACCESS - return $this->sftp->chmod($path, $var) !== \false; - } - } - /** - * Retrieve the underlaying resource - * - * @param int $cast_as - * @return resource - */ - private function _stream_cast($cast_as) - { - return $this->sftp->fsock; - } - /** - * Advisory file locking - * - * @param int $operation - * @return bool - */ - private function _stream_lock($operation) - { - return \false; - } - /** - * Renames a file or directory - * - * Attempts to rename oldname to newname, moving it between directories if necessary. - * If newname exists, it will be overwritten. This is a departure from what \phpseclib3\Net\SFTP - * does. - * - * @param string $path_from - * @param string $path_to - * @return bool - */ - private function _rename($path_from, $path_to) - { - $path1 = \parse_url($path_from); - $path2 = \parse_url($path_to); - unset($path1['path'], $path2['path']); - if ($path1 != $path2) { - return \false; - } - $path_from = $this->parse_path($path_from); - $path_to = \parse_url($path_to); - if ($path_from === \false) { - return \false; - } - $path_to = $path_to['path']; - // the $component part of parse_url() was added in PHP 5.1.2 - // "It is an error if there already exists a file with the name specified by newpath." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 - if (!$this->sftp->rename($path_from, $path_to)) { - if ($this->sftp->stat($path_to)) { - return $this->sftp->delete($path_to, \true) && $this->sftp->rename($path_from, $path_to); - } - return \false; - } - return \true; - } - /** - * Open directory handle - * - * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and - * removed in 5.4 I'm just going to ignore it. - * - * Also, nlist() is the best that this function is realistically going to be able to do. When an SFTP client - * sends a SSH_FXP_READDIR packet you don't generally get info on just one file but on multiple files. Quoting - * the SFTP specs: - * - * The SSH_FXP_NAME response has the following format: - * - * uint32 id - * uint32 count - * repeats count times: - * string filename - * string longname - * ATTRS attrs - * - * @param string $path - * @param int $options - * @return bool - */ - private function _dir_opendir($path, $options) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - $this->pos = 0; - $this->entries = $this->sftp->nlist($path); - return $this->entries !== \false; - } - /** - * Read entry from directory handle - * - * @return mixed - */ - private function _dir_readdir() - { - if (isset($this->entries[$this->pos])) { - return $this->entries[$this->pos++]; - } - return \false; - } - /** - * Rewind directory handle - * - * @return bool - */ - private function _dir_rewinddir() - { - $this->pos = 0; - return \true; - } - /** - * Close directory handle - * - * @return bool - */ - private function _dir_closedir() - { - return \true; - } - /** - * Create a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE - * - * @param string $path - * @param int $mode - * @param int $options - * @return bool - */ - private function _mkdir($path, $mode, $options) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - return $this->sftp->mkdir($path, $mode, $options & \STREAM_MKDIR_RECURSIVE); - } - /** - * Removes a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE per , however, - * does not have a $recursive parameter as mkdir() does so I don't know how - * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as - * $options. What does 8 correspond to? - * - * @param string $path - * @param int $options - * @return bool - */ - private function _rmdir($path, $options) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - return $this->sftp->rmdir($path); - } - /** - * Flushes the output - * - * See . Always returns true because \phpseclib3\Net\SFTP doesn't cache stuff before writing - * - * @return bool - */ - private function _stream_flush() - { - return \true; - } - /** - * Retrieve information about a file resource - * - * @return mixed - */ - private function _stream_stat() - { - $results = $this->sftp->stat($this->path); - if ($results === \false) { - return \false; - } - return $results; - } - /** - * Delete a file - * - * @param string $path - * @return bool - */ - private function _unlink($path) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - return $this->sftp->delete($path, \false); - } - /** - * Retrieve information about a file - * - * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of \phpseclib3\Net\SFTP\Stream is quiet by default - * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll - * cross that bridge when and if it's reached - * - * @param string $path - * @param int $flags - * @return mixed - */ - private function _url_stat($path, $flags) - { - $path = $this->parse_path($path); - if ($path === \false) { - return \false; - } - $results = $flags & \STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); - if ($results === \false) { - return \false; - } - return $results; - } - /** - * Truncate stream - * - * @param int $new_size - * @return bool - */ - private function _stream_truncate($new_size) - { - if (!$this->sftp->truncate($this->path, $new_size)) { - return \false; - } - $this->eof = \false; - $this->size = $new_size; - return \true; - } - /** - * Change stream options - * - * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't. - * The other two aren't supported because of limitations in \phpseclib3\Net\SFTP. - * - * @param int $option - * @param int $arg1 - * @param int $arg2 - * @return bool - */ - private function _stream_set_option($option, $arg1, $arg2) - { - return \false; - } - /** - * Close an resource - * - */ - private function _stream_close() - { - } - /** - * __call Magic Method - * - * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you. - * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function - * lets you figure that out. - * - * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not - * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method. - * - * @param string $name - * @param array $arguments - * @return mixed - */ - public function __call($name, array $arguments) - { - if (\defined('NET_SFTP_STREAM_LOGGING')) { - echo $name . '('; - $last = \count($arguments) - 1; - foreach ($arguments as $i => $argument) { - \var_export($argument); - if ($i != $last) { - echo ','; - } - } - echo ")\r\n"; - } - $name = '_' . $name; - if (!\method_exists($this, $name)) { - return \false; - } - return $this->{$name}(...$arguments); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/Net/SSH2.php b/dependencies/phpseclib/phpseclib/phpseclib/Net/SSH2.php deleted file mode 100644 index 6c714ff..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/Net/SSH2.php +++ /dev/null @@ -1,4482 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * - * login('username', $key)) { - * exit('Login Failed'); - * } - * - * echo $ssh->read('username@username:~$'); - * $ssh->write("ls -la\n"); - * echo $ssh->read('username@username:~$'); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\Net; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Blowfish; -use phpseclib3\Crypt\ChaCha20; -use phpseclib3\Crypt\Common\AsymmetricKey; -use phpseclib3\Crypt\Common\PrivateKey; -use phpseclib3\Crypt\Common\PublicKey; -use phpseclib3\Crypt\Common\SymmetricKey; -use phpseclib3\Crypt\DH; -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\EC; -use phpseclib3\Crypt\Hash; -use phpseclib3\Crypt\Random; -use phpseclib3\Crypt\RC4; -use phpseclib3\Crypt\Rijndael; -use phpseclib3\Crypt\RSA; -use phpseclib3\Crypt\TripleDES; -// Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. -use phpseclib3\Crypt\Twofish; -use phpseclib3\Exception\ConnectionClosedException; -use phpseclib3\Exception\InsufficientSetupException; -use phpseclib3\Exception\NoSupportedAlgorithmsException; -use phpseclib3\Exception\UnableToConnectException; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\Exception\UnsupportedCurveException; -use phpseclib3\Math\BigInteger; -use phpseclib3\System\SSH\Agent; -/** - * Pure-PHP implementation of SSHv2. - * - * @author Jim Wigginton - */ -class SSH2 -{ - /**#@+ - * Compression Types - * - */ - /** - * No compression - */ - const NET_SSH2_COMPRESSION_NONE = 1; - /** - * zlib compression - */ - const NET_SSH2_COMPRESSION_ZLIB = 2; - /** - * zlib@openssh.com - */ - const NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH = 3; - /**#@-*/ - // Execution Bitmap Masks - const MASK_CONSTRUCTOR = 0x1; - const MASK_CONNECTED = 0x2; - const MASK_LOGIN_REQ = 0x4; - const MASK_LOGIN = 0x8; - const MASK_SHELL = 0x10; - const MASK_WINDOW_ADJUST = 0x20; - /* - * Channel constants - * - * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer - * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with - * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a - * recipient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel - * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snippet: - * The 'recipient channel' is the channel number given in the original - * open request, and 'sender channel' is the channel number allocated by - * the other side. - * - * @see \phpseclib3\Net\SSH2::send_channel_packet() - * @see \phpseclib3\Net\SSH2::get_channel_packet() - */ - const CHANNEL_EXEC = 1; - // PuTTy uses 0x100 - const CHANNEL_SHELL = 2; - const CHANNEL_SUBSYSTEM = 3; - const CHANNEL_AGENT_FORWARD = 4; - const CHANNEL_KEEP_ALIVE = 5; - /** - * Returns the message numbers - * - * @see \phpseclib3\Net\SSH2::getLog() - */ - const LOG_SIMPLE = 1; - /** - * Returns the message content - * - * @see \phpseclib3\Net\SSH2::getLog() - */ - const LOG_COMPLEX = 2; - /** - * Outputs the content real-time - */ - const LOG_REALTIME = 3; - /** - * Dumps the content real-time to a file - */ - const LOG_REALTIME_FILE = 4; - /** - * Outputs the message numbers real-time - */ - const LOG_SIMPLE_REALTIME = 5; - /** - * Make sure that the log never gets larger than this - * - * @see \phpseclib3\Net\SSH2::getLog() - */ - const LOG_MAX_SIZE = 1048576; - // 1024 * 1024 - /** - * Returns when a string matching $expect exactly is found - * - * @see \phpseclib3\Net\SSH2::read() - */ - const READ_SIMPLE = 1; - /** - * Returns when a string matching the regular expression $expect is found - * - * @see \phpseclib3\Net\SSH2::read() - */ - const READ_REGEX = 2; - /** - * Returns whenever a data packet is received. - * - * Some data packets may only contain a single character so it may be necessary - * to call read() multiple times when using this option - * - * @see \phpseclib3\Net\SSH2::read() - */ - const READ_NEXT = 3; - /** - * The SSH identifier - * - * @var string - */ - private $identifier; - /** - * The Socket Object - * - * @var resource|closed-resource|null - */ - public $fsock; - /** - * Execution Bitmap - * - * The bits that are set represent functions that have been called already. This is used to determine - * if a requisite function has been successfully executed. If not, an error should be thrown. - * - * @var int - */ - protected $bitmap = 0; - /** - * Error information - * - * @see self::getErrors() - * @see self::getLastError() - * @var array - */ - private $errors = []; - /** - * Server Identifier - * - * @see self::getServerIdentification() - * @var string|false - */ - protected $server_identifier = \false; - /** - * Key Exchange Algorithms - * - * @see self::getKexAlgorithims() - * @var array|false - */ - private $kex_algorithms = \false; - /** - * Key Exchange Algorithm - * - * @see self::getMethodsNegotiated() - * @var string|false - */ - private $kex_algorithm = \false; - /** - * Minimum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods - * - * @see self::_key_exchange() - * @var int - */ - private $kex_dh_group_size_min = 1536; - /** - * Preferred Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods - * - * @see self::_key_exchange() - * @var int - */ - private $kex_dh_group_size_preferred = 2048; - /** - * Maximum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods - * - * @see self::_key_exchange() - * @var int - */ - private $kex_dh_group_size_max = 4096; - /** - * Server Host Key Algorithms - * - * @see self::getServerHostKeyAlgorithms() - * @var array|false - */ - private $server_host_key_algorithms = \false; - /** - * Supported Private Key Algorithms - * - * In theory this should be the same as the Server Host Key Algorithms but, in practice, - * some servers (eg. Azure) will support rsa-sha2-512 as a server host key algorithm but - * not a private key algorithm - * - * @see self::privatekey_login() - * @var array|false - */ - private $supported_private_key_algorithms = \false; - /** - * Encryption Algorithms: Client to Server - * - * @see self::getEncryptionAlgorithmsClient2Server() - * @var array|false - */ - private $encryption_algorithms_client_to_server = \false; - /** - * Encryption Algorithms: Server to Client - * - * @see self::getEncryptionAlgorithmsServer2Client() - * @var array|false - */ - private $encryption_algorithms_server_to_client = \false; - /** - * MAC Algorithms: Client to Server - * - * @see self::getMACAlgorithmsClient2Server() - * @var array|false - */ - private $mac_algorithms_client_to_server = \false; - /** - * MAC Algorithms: Server to Client - * - * @see self::getMACAlgorithmsServer2Client() - * @var array|false - */ - private $mac_algorithms_server_to_client = \false; - /** - * Compression Algorithms: Client to Server - * - * @see self::getCompressionAlgorithmsClient2Server() - * @var array|false - */ - private $compression_algorithms_client_to_server = \false; - /** - * Compression Algorithms: Server to Client - * - * @see self::getCompressionAlgorithmsServer2Client() - * @var array|false - */ - private $compression_algorithms_server_to_client = \false; - /** - * Languages: Server to Client - * - * @see self::getLanguagesServer2Client() - * @var array|false - */ - private $languages_server_to_client = \false; - /** - * Languages: Client to Server - * - * @see self::getLanguagesClient2Server() - * @var array|false - */ - private $languages_client_to_server = \false; - /** - * Preferred Algorithms - * - * @see self::setPreferredAlgorithms() - * @var array - */ - private $preferred = []; - /** - * Block Size for Server to Client Encryption - * - * "Note that the length of the concatenation of 'packet_length', - * 'padding_length', 'payload', and 'random padding' MUST be a multiple - * of the cipher block size or 8, whichever is larger. This constraint - * MUST be enforced, even when using stream ciphers." - * - * -- http://tools.ietf.org/html/rfc4253#section-6 - * - * @see self::__construct() - * @see self::_send_binary_packet() - * @var int - */ - private $encrypt_block_size = 8; - /** - * Block Size for Client to Server Encryption - * - * @see self::__construct() - * @see self::_get_binary_packet() - * @var int - */ - private $decrypt_block_size = 8; - /** - * Server to Client Encryption Object - * - * @see self::_get_binary_packet() - * @var SymmetricKey|false - */ - private $decrypt = \false; - /** - * Decryption Algorithm Name - * - * @var string|null - */ - private $decryptName; - /** - * Decryption Invocation Counter - * - * Used by GCM - * - * @var string|null - */ - private $decryptInvocationCounter; - /** - * Fixed Part of Nonce - * - * Used by GCM - * - * @var string|null - */ - private $decryptFixedPart; - /** - * Server to Client Length Encryption Object - * - * @see self::_get_binary_packet() - * @var object - */ - private $lengthDecrypt = \false; - /** - * Client to Server Encryption Object - * - * @see self::_send_binary_packet() - * @var SymmetricKey|false - */ - private $encrypt = \false; - /** - * Encryption Algorithm Name - * - * @var string|null - */ - private $encryptName; - /** - * Encryption Invocation Counter - * - * Used by GCM - * - * @var string|null - */ - private $encryptInvocationCounter; - /** - * Fixed Part of Nonce - * - * Used by GCM - * - * @var string|null - */ - private $encryptFixedPart; - /** - * Client to Server Length Encryption Object - * - * @see self::_send_binary_packet() - * @var object - */ - private $lengthEncrypt = \false; - /** - * Client to Server HMAC Object - * - * @see self::_send_binary_packet() - * @var object - */ - private $hmac_create = \false; - /** - * Client to Server HMAC Name - * - * @var string|false - */ - private $hmac_create_name; - /** - * Client to Server ETM - * - * @var int|false - */ - private $hmac_create_etm; - /** - * Server to Client HMAC Object - * - * @see self::_get_binary_packet() - * @var object - */ - private $hmac_check = \false; - /** - * Server to Client HMAC Name - * - * @var string|false - */ - private $hmac_check_name; - /** - * Server to Client ETM - * - * @var int|false - */ - private $hmac_check_etm; - /** - * Size of server to client HMAC - * - * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read. - * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is - * append it. - * - * @see self::_get_binary_packet() - * @var int - */ - private $hmac_size = \false; - /** - * Server Public Host Key - * - * @see self::getServerPublicHostKey() - * @var string - */ - private $server_public_host_key; - /** - * Session identifier - * - * "The exchange hash H from the first key exchange is additionally - * used as the session identifier, which is a unique identifier for - * this connection." - * - * -- http://tools.ietf.org/html/rfc4253#section-7.2 - * - * @see self::_key_exchange() - * @var string - */ - private $session_id = \false; - /** - * Exchange hash - * - * The current exchange hash - * - * @see self::_key_exchange() - * @var string - */ - private $exchange_hash = \false; - /** - * Message Numbers - * - * @see self::__construct() - * @var array - * @access private - */ - private static $message_numbers = []; - /** - * Disconnection Message 'reason codes' defined in RFC4253 - * - * @see self::__construct() - * @var array - * @access private - */ - private static $disconnect_reasons = []; - /** - * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 - * - * @see self::__construct() - * @var array - * @access private - */ - private static $channel_open_failure_reasons = []; - /** - * Terminal Modes - * - * @link http://tools.ietf.org/html/rfc4254#section-8 - * @see self::__construct() - * @var array - * @access private - */ - private static $terminal_modes = []; - /** - * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes - * - * @link http://tools.ietf.org/html/rfc4254#section-5.2 - * @see self::__construct() - * @var array - * @access private - */ - private static $channel_extended_data_type_codes = []; - /** - * Send Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see self::_send_binary_packet() - * @var int - */ - private $send_seq_no = 0; - /** - * Get Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see self::_get_binary_packet() - * @var int - */ - private $get_seq_no = 0; - /** - * Server Channels - * - * Maps client channels to server channels - * - * @see self::get_channel_packet() - * @see self::exec() - * @var array - */ - protected $server_channels = []; - /** - * Channel Buffers - * - * If a client requests a packet from one channel but receives two packets from another those packets should - * be placed in a buffer - * - * @see self::get_channel_packet() - * @see self::exec() - * @var array - */ - private $channel_buffers = []; - /** - * Channel Status - * - * Contains the type of the last sent message - * - * @see self::get_channel_packet() - * @var array - */ - protected $channel_status = []; - /** - * The identifier of the interactive channel which was opened most recently - * - * @see self::getInteractiveChannelId() - * @var int - */ - private $channel_id_last_interactive = 0; - /** - * Packet Size - * - * Maximum packet size indexed by channel - * - * @see self::send_channel_packet() - * @var array - */ - private $packet_size_client_to_server = []; - /** - * Message Number Log - * - * @see self::getLog() - * @var array - */ - private $message_number_log = []; - /** - * Message Log - * - * @see self::getLog() - * @var array - */ - private $message_log = []; - /** - * The Window Size - * - * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB) - * - * @var int - * @see self::send_channel_packet() - * @see self::exec() - */ - protected $window_size = 0x7fffffff; - /** - * What we resize the window to - * - * When PuTTY resizes the window it doesn't add an additional 0x7FFFFFFF bytes - it adds 0x40000000 bytes. - * Some SFTP clients (GoAnywhere) don't support adding 0x7FFFFFFF to the window size after the fact so - * we'll just do what PuTTY does - * - * @var int - * @see self::_send_channel_packet() - * @see self::exec() - */ - private $window_resize = 0x40000000; - /** - * Window size, server to client - * - * Window size indexed by channel - * - * @see self::send_channel_packet() - * @var array - */ - protected $window_size_server_to_client = []; - /** - * Window size, client to server - * - * Window size indexed by channel - * - * @see self::get_channel_packet() - * @var array - */ - private $window_size_client_to_server = []; - /** - * Server signature - * - * Verified against $this->session_id - * - * @see self::getServerPublicHostKey() - * @var string - */ - private $signature = ''; - /** - * Server signature format - * - * ssh-rsa or ssh-dss. - * - * @see self::getServerPublicHostKey() - * @var string - */ - private $signature_format = ''; - /** - * Interactive Buffer - * - * @see self::read() - * @var string - */ - private $interactiveBuffer = ''; - /** - * Current log size - * - * Should never exceed self::LOG_MAX_SIZE - * - * @see self::_send_binary_packet() - * @see self::_get_binary_packet() - * @var int - */ - private $log_size; - /** - * Timeout - * - * @see self::setTimeout() - */ - protected $timeout; - /** - * Current Timeout - * - * @see self::get_channel_packet() - */ - protected $curTimeout; - /** - * Keep Alive Interval - * - * @see self::setKeepAlive() - */ - private $keepAlive; - /** - * Real-time log file pointer - * - * @see self::_append_log() - * @var resource|closed-resource - */ - private $realtime_log_file; - /** - * Real-time log file size - * - * @see self::_append_log() - * @var int - */ - private $realtime_log_size; - /** - * Has the signature been validated? - * - * @see self::getServerPublicHostKey() - * @var bool - */ - private $signature_validated = \false; - /** - * Real-time log file wrap boolean - * - * @see self::_append_log() - * @var bool - */ - private $realtime_log_wrap; - /** - * Flag to suppress stderr from output - * - * @see self::enableQuietMode() - */ - private $quiet_mode = \false; - /** - * Time of first network activity - * - * @var float - */ - private $last_packet; - /** - * Exit status returned from ssh if any - * - * @var int - */ - private $exit_status; - /** - * Flag to request a PTY when using exec() - * - * @var bool - * @see self::enablePTY() - */ - private $request_pty = \false; - /** - * Contents of stdError - * - * @var string - */ - private $stdErrorLog; - /** - * The Last Interactive Response - * - * @see self::_keyboard_interactive_process() - * @var string - */ - private $last_interactive_response = ''; - /** - * Keyboard Interactive Request / Responses - * - * @see self::_keyboard_interactive_process() - * @var array - */ - private $keyboard_requests_responses = []; - /** - * Banner Message - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @see self::_filter() - * @see self::getBannerMessage() - * @var string - */ - private $banner_message = ''; - /** - * Did read() timeout or return normally? - * - * @see self::isTimeout() - * @var bool - */ - private $is_timeout = \false; - /** - * Log Boundary - * - * @see self::_format_log() - * @var string - */ - private $log_boundary = ':'; - /** - * Log Long Width - * - * @see self::_format_log() - * @var int - */ - private $log_long_width = 65; - /** - * Log Short Width - * - * @see self::_format_log() - * @var int - */ - private $log_short_width = 16; - /** - * Hostname - * - * @see self::__construct() - * @see self::_connect() - * @var string - */ - private $host; - /** - * Port Number - * - * @see self::__construct() - * @see self::_connect() - * @var int - */ - private $port; - /** - * Number of columns for terminal window size - * - * @see self::getWindowColumns() - * @see self::setWindowColumns() - * @see self::setWindowSize() - * @var int - */ - private $windowColumns = 80; - /** - * Number of columns for terminal window size - * - * @see self::getWindowRows() - * @see self::setWindowRows() - * @see self::setWindowSize() - * @var int - */ - private $windowRows = 24; - /** - * Crypto Engine - * - * @see self::setCryptoEngine() - * @see self::_key_exchange() - * @var int - */ - private static $crypto_engine = \false; - /** - * A System_SSH_Agent for use in the SSH2 Agent Forwarding scenario - * - * @var Agent - */ - private $agent; - /** - * Connection storage to replicates ssh2 extension functionality: - * {@link http://php.net/manual/en/wrappers.ssh2.php#refsect1-wrappers.ssh2-examples} - * - * @var array> - */ - private static $connections; - /** - * Send the identification string first? - * - * @var bool - */ - private $send_id_string_first = \true; - /** - * Send the key exchange initiation packet first? - * - * @var bool - */ - private $send_kex_first = \true; - /** - * Some versions of OpenSSH incorrectly calculate the key size - * - * @var bool - */ - private $bad_key_size_fix = \false; - /** - * Should we try to re-connect to re-establish keys? - * - * @var bool - */ - private $retry_connect = \false; - /** - * Binary Packet Buffer - * - * @var string|false - */ - private $binary_packet_buffer = \false; - /** - * Preferred Signature Format - * - * @var string|false - */ - protected $preferred_signature_format = \false; - /** - * Authentication Credentials - * - * @var array - */ - protected $auth = []; - /** - * Terminal - * - * @var string - */ - private $term = 'vt100'; - /** - * The authentication methods that may productively continue authentication. - * - * @see https://tools.ietf.org/html/rfc4252#section-5.1 - * @var array|null - */ - private $auth_methods_to_continue = null; - /** - * Compression method - * - * @var int - */ - private $compress = self::NET_SSH2_COMPRESSION_NONE; - /** - * Decompression method - * - * @var int - */ - private $decompress = self::NET_SSH2_COMPRESSION_NONE; - /** - * Compression context - * - * @var resource|false|null - */ - private $compress_context; - /** - * Decompression context - * - * @var resource|object - */ - private $decompress_context; - /** - * Regenerate Compression Context - * - * @var bool - */ - private $regenerate_compression_context = \false; - /** - * Regenerate Decompression Context - * - * @var bool - */ - private $regenerate_decompression_context = \false; - /** - * Smart multi-factor authentication flag - * - * @var bool - */ - private $smartMFA = \true; - /** - * How many channels are currently opened - * - * @var int - */ - private $channelCount = 0; - /** - * Does the server support multiple channels? If not then error out - * when multiple channels are attempted to be opened - * - * @var bool - */ - private $errorOnMultipleChannels; - /** - * Default Constructor. - * - * $host can either be a string, representing the host, or a stream resource. - * - * @param mixed $host - * @param int $port - * @param int $timeout - * @see self::login() - */ - public function __construct($host, $port = 22, $timeout = 10) - { - if (empty(self::$message_numbers)) { - self::$message_numbers = [1 => 'NET_SSH2_MSG_DISCONNECT', 2 => 'NET_SSH2_MSG_IGNORE', 3 => 'NET_SSH2_MSG_UNIMPLEMENTED', 4 => 'NET_SSH2_MSG_DEBUG', 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', 20 => 'NET_SSH2_MSG_KEXINIT', 21 => 'NET_SSH2_MSG_NEWKEYS', 30 => 'NET_SSH2_MSG_KEXDH_INIT', 31 => 'NET_SSH2_MSG_KEXDH_REPLY', 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST', 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', 90 => 'NET_SSH2_MSG_CHANNEL_OPEN', 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION', 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE', 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST', 94 => 'NET_SSH2_MSG_CHANNEL_DATA', 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA', 96 => 'NET_SSH2_MSG_CHANNEL_EOF', 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE']; - self::$disconnect_reasons = [1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', 4 => 'NET_SSH2_DISCONNECT_RESERVED', 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME']; - self::$channel_open_failure_reasons = [1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED']; - self::$terminal_modes = [0 => 'NET_SSH2_TTY_OP_END']; - self::$channel_extended_data_type_codes = [1 => 'NET_SSH2_EXTENDED_DATA_STDERR']; - self::define_array( - self::$message_numbers, - self::$disconnect_reasons, - self::$channel_open_failure_reasons, - self::$terminal_modes, - self::$channel_extended_data_type_codes, - [60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'], - [60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'], - [60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'], - // RFC 4419 - diffie-hellman-group-exchange-sha{1,256} - [30 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST_OLD', 31 => 'NET_SSH2_MSG_KEXDH_GEX_GROUP', 32 => 'NET_SSH2_MSG_KEXDH_GEX_INIT', 33 => 'NET_SSH2_MSG_KEXDH_GEX_REPLY', 34 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'], - // RFC 5656 - Elliptic Curves (for curve25519-sha256@libssh.org) - [30 => 'NET_SSH2_MSG_KEX_ECDH_INIT', 31 => 'NET_SSH2_MSG_KEX_ECDH_REPLY'] - ); - } - /** - * Typehint is required due to a bug in Psalm: https://github.com/vimeo/psalm/issues/7508 - * @var \WeakReference|SSH2 - */ - self::$connections[$this->getResourceId()] = \class_exists('WeakReference') ? \WeakReference::create($this) : $this; - if (\is_resource($host)) { - $this->fsock = $host; - return; - } - if (Strings::is_stringable($host)) { - $this->host = $host; - $this->port = $port; - $this->timeout = $timeout; - } - } - /** - * Set Crypto Engine Mode - * - * Possible $engine values: - * OpenSSL, mcrypt, Eval, PHP - * - * @param int $engine - */ - public static function setCryptoEngine($engine) - { - self::$crypto_engine = $engine; - } - /** - * Send Identification String First - * - * https://tools.ietf.org/html/rfc4253#section-4.2 says "when the connection has been established, - * both sides MUST send an identification string". It does not say which side sends it first. In - * theory it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendIdentificationStringFirst() - { - $this->send_id_string_first = \true; - } - /** - * Send Identification String Last - * - * https://tools.ietf.org/html/rfc4253#section-4.2 says "when the connection has been established, - * both sides MUST send an identification string". It does not say which side sends it first. In - * theory it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendIdentificationStringLast() - { - $this->send_id_string_first = \false; - } - /** - * Send SSH_MSG_KEXINIT First - * - * https://tools.ietf.org/html/rfc4253#section-7.1 says "key exchange begins by each sending - * sending the [SSH_MSG_KEXINIT] packet". It does not say which side sends it first. In theory - * it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendKEXINITFirst() - { - $this->send_kex_first = \true; - } - /** - * Send SSH_MSG_KEXINIT Last - * - * https://tools.ietf.org/html/rfc4253#section-7.1 says "key exchange begins by each sending - * sending the [SSH_MSG_KEXINIT] packet". It does not say which side sends it first. In theory - * it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendKEXINITLast() - { - $this->send_kex_first = \false; - } - /** - * stream_select wrapper - * - * Quoting https://stackoverflow.com/a/14262151/569976, - * "The general approach to `EINTR` is to simply handle the error and retry the operation again" - * - * This wrapper does that loop - */ - private static function stream_select(&$read, &$write, &$except, $seconds, $microseconds = null) - { - $remaining = $seconds + $microseconds / 1000000; - $start = \microtime(\true); - while (\true) { - $result = @\stream_select($read, $write, $except, $seconds, $microseconds); - if ($result !== \false) { - return $result; - } - $elapsed = \microtime(\true) - $start; - $seconds = (int) ($remaining - \floor($elapsed)); - $microseconds = (int) (1000000 * ($remaining - $seconds)); - if ($elapsed >= $remaining) { - return \false; - } - } - } - /** - * Connect to an SSHv2 server - * - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - */ - private function connect() - { - if ($this->bitmap & self::MASK_CONSTRUCTOR) { - return; - } - $this->bitmap |= self::MASK_CONSTRUCTOR; - $this->curTimeout = $this->timeout; - $this->last_packet = \microtime(\true); - if (!\is_resource($this->fsock)) { - $start = \microtime(\true); - // with stream_select a timeout of 0 means that no timeout takes place; - // with fsockopen a timeout of 0 means that you instantly timeout - // to resolve this incompatibility a timeout of 100,000 will be used for fsockopen if timeout is 0 - $this->fsock = @\fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout == 0 ? 100000 : $this->curTimeout); - if (!$this->fsock) { - $host = $this->host . ':' . $this->port; - throw new UnableToConnectException(\rtrim("Cannot connect to {$host}. Error {$errno}. {$errstr}")); - } - $elapsed = \microtime(\true) - $start; - if ($this->curTimeout) { - $this->curTimeout -= $elapsed; - if ($this->curTimeout < 0) { - throw new \RuntimeException('Connection timed out whilst attempting to open socket connection'); - } - } - } - $this->identifier = $this->generate_identifier(); - if ($this->send_id_string_first) { - \fputs($this->fsock, $this->identifier . "\r\n"); - } - /* According to the SSH2 specs, - - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." */ - $data = ''; - while (!\feof($this->fsock) && !\preg_match('#(.*)^(SSH-(\\d\\.\\d+).*)#ms', $data, $matches)) { - $line = ''; - while (\true) { - if ($this->curTimeout) { - if ($this->curTimeout < 0) { - throw new \RuntimeException('Connection timed out whilst receiving server identification string'); - } - $read = [$this->fsock]; - $write = $except = null; - $start = \microtime(\true); - $sec = (int) \floor($this->curTimeout); - $usec = (int) (1000000 * ($this->curTimeout - $sec)); - if (static::stream_select($read, $write, $except, $sec, $usec) === \false) { - throw new \RuntimeException('Connection timed out whilst receiving server identification string'); - } - $elapsed = \microtime(\true) - $start; - $this->curTimeout -= $elapsed; - } - $temp = \stream_get_line($this->fsock, 255, "\n"); - if ($temp === \false) { - throw new \RuntimeException('Error reading from socket'); - } - if (\strlen($temp) == 255) { - continue; - } - $line .= "{$temp}\n"; - // quoting RFC4253, "Implementers who wish to maintain - // compatibility with older, undocumented versions of this protocol may - // want to process the identification string without expecting the - // presence of the carriage return character for reasons described in - // Section 5 of this document." - //if (substr($line, -2) == "\r\n") { - // break; - //} - break; - } - $data .= $line; - } - if (\feof($this->fsock)) { - $this->bitmap = 0; - throw new ConnectionClosedException('Connection closed by server'); - } - $extra = $matches[1]; - if (\defined('NET_SSH2_LOGGING')) { - $this->append_log('<-', $matches[0]); - $this->append_log('->', $this->identifier . "\r\n"); - } - $this->server_identifier = \trim($temp, "\r\n"); - if (\strlen($extra)) { - $this->errors[] = $data; - } - if (\version_compare($matches[3], '1.99', '<')) { - $this->bitmap = 0; - throw new UnableToConnectException("Cannot connect to SSH {$matches[3]} servers"); - } - // Ubuntu's OpenSSH from 5.8 to 6.9 didn't work with multiple channels. see - // https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/1334916 for more info. - // https://lists.ubuntu.com/archives/oneiric-changes/2011-July/005772.html discusses - // when consolekit was incorporated. - // https://marc.info/?l=openssh-unix-dev&m=163409903417589&w=2 discusses some of the - // issues with how Ubuntu incorporated consolekit - $pattern = '#^SSH-2\\.0-OpenSSH_([\\d.]+)[^ ]* Ubuntu-.*$#'; - $match = \preg_match($pattern, $this->server_identifier, $matches); - $match = $match && \version_compare('5.8', $matches[1], '<='); - $match = $match && \version_compare('6.9', $matches[1], '>='); - $this->errorOnMultipleChannels = $match; - if (!$this->send_id_string_first) { - \fputs($this->fsock, $this->identifier . "\r\n"); - } - if (!$this->send_kex_first) { - $response = $this->get_binary_packet(); - if (\is_bool($response) || !\strlen($response) || \ord($response[0]) != NET_SSH2_MSG_KEXINIT) { - $this->bitmap = 0; - throw new \UnexpectedValueException('Expected SSH_MSG_KEXINIT'); - } - $this->key_exchange($response); - } - if ($this->send_kex_first) { - $this->key_exchange(); - } - $this->bitmap |= self::MASK_CONNECTED; - return \true; - } - /** - * Generates the SSH identifier - * - * You should overwrite this method in your own class if you want to use another identifier - * - * @return string - */ - private function generate_identifier() - { - $identifier = 'SSH-2.0-phpseclib_3.0'; - $ext = []; - if (\extension_loaded('sodium')) { - $ext[] = 'libsodium'; - } - if (\extension_loaded('openssl')) { - $ext[] = 'openssl'; - } elseif (\extension_loaded('mcrypt')) { - $ext[] = 'mcrypt'; - } - if (\extension_loaded('gmp')) { - $ext[] = 'gmp'; - } elseif (\function_exists('bcadd')) { - $ext[] = 'bcmath'; - } - if (!empty($ext)) { - $identifier .= ' (' . \implode(', ', $ext) . ')'; - } - return $identifier; - } - /** - * Key Exchange - * - * @return bool - * @param string|bool $kexinit_payload_server optional - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - * @throws \phpseclib3\Exception\NoSupportedAlgorithmsException when none of the algorithms phpseclib has loaded are compatible - */ - private function key_exchange($kexinit_payload_server = \false) - { - $preferred = $this->preferred; - $send_kex = \true; - $kex_algorithms = isset($preferred['kex']) ? $preferred['kex'] : \phpseclib3\Net\SSH2::getSupportedKEXAlgorithms(); - $server_host_key_algorithms = isset($preferred['hostkey']) ? $preferred['hostkey'] : \phpseclib3\Net\SSH2::getSupportedHostKeyAlgorithms(); - $s2c_encryption_algorithms = isset($preferred['server_to_client']['crypt']) ? $preferred['server_to_client']['crypt'] : \phpseclib3\Net\SSH2::getSupportedEncryptionAlgorithms(); - $c2s_encryption_algorithms = isset($preferred['client_to_server']['crypt']) ? $preferred['client_to_server']['crypt'] : \phpseclib3\Net\SSH2::getSupportedEncryptionAlgorithms(); - $s2c_mac_algorithms = isset($preferred['server_to_client']['mac']) ? $preferred['server_to_client']['mac'] : \phpseclib3\Net\SSH2::getSupportedMACAlgorithms(); - $c2s_mac_algorithms = isset($preferred['client_to_server']['mac']) ? $preferred['client_to_server']['mac'] : \phpseclib3\Net\SSH2::getSupportedMACAlgorithms(); - $s2c_compression_algorithms = isset($preferred['server_to_client']['comp']) ? $preferred['server_to_client']['comp'] : \phpseclib3\Net\SSH2::getSupportedCompressionAlgorithms(); - $c2s_compression_algorithms = isset($preferred['client_to_server']['comp']) ? $preferred['client_to_server']['comp'] : \phpseclib3\Net\SSH2::getSupportedCompressionAlgorithms(); - // some SSH servers have buggy implementations of some of the above algorithms - switch (\true) { - case $this->server_identifier == 'SSH-2.0-SSHD': - case \substr($this->server_identifier, 0, 13) == 'SSH-2.0-DLINK': - if (!isset($preferred['server_to_client']['mac'])) { - $s2c_mac_algorithms = \array_values(\array_diff($s2c_mac_algorithms, ['hmac-sha1-96', 'hmac-md5-96'])); - } - if (!isset($preferred['client_to_server']['mac'])) { - $c2s_mac_algorithms = \array_values(\array_diff($c2s_mac_algorithms, ['hmac-sha1-96', 'hmac-md5-96'])); - } - } - $client_cookie = Random::string(16); - $kexinit_payload_client = \pack('Ca*', NET_SSH2_MSG_KEXINIT, $client_cookie); - $kexinit_payload_client .= Strings::packSSH2( - 'L10bN', - $kex_algorithms, - $server_host_key_algorithms, - $c2s_encryption_algorithms, - $s2c_encryption_algorithms, - $c2s_mac_algorithms, - $s2c_mac_algorithms, - $c2s_compression_algorithms, - $s2c_compression_algorithms, - [], - // language, client to server - [], - // language, server to client - \false, - // first_kex_packet_follows - 0 - ); - if ($kexinit_payload_server === \false) { - $this->send_binary_packet($kexinit_payload_client); - $kexinit_payload_server = $this->get_binary_packet(); - if (\is_bool($kexinit_payload_server) || !\strlen($kexinit_payload_server) || \ord($kexinit_payload_server[0]) != NET_SSH2_MSG_KEXINIT) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new \UnexpectedValueException('Expected SSH_MSG_KEXINIT'); - } - $send_kex = \false; - } - $response = $kexinit_payload_server; - Strings::shift($response, 1); - // skip past the message number (it should be SSH_MSG_KEXINIT) - $server_cookie = Strings::shift($response, 16); - list($this->kex_algorithms, $this->server_host_key_algorithms, $this->encryption_algorithms_client_to_server, $this->encryption_algorithms_server_to_client, $this->mac_algorithms_client_to_server, $this->mac_algorithms_server_to_client, $this->compression_algorithms_client_to_server, $this->compression_algorithms_server_to_client, $this->languages_client_to_server, $this->languages_server_to_client, $first_kex_packet_follows) = Strings::unpackSSH2('L10C', $response); - $this->supported_private_key_algorithms = $this->server_host_key_algorithms; - if ($send_kex) { - $this->send_binary_packet($kexinit_payload_client); - } - // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange - // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the - // diffie-hellman key exchange as fast as possible - $decrypt = self::array_intersect_first($s2c_encryption_algorithms, $this->encryption_algorithms_server_to_client); - $decryptKeyLength = $this->encryption_algorithm_to_key_size($decrypt); - if ($decryptKeyLength === null) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server to client encryption algorithms found'); - } - $encrypt = self::array_intersect_first($c2s_encryption_algorithms, $this->encryption_algorithms_client_to_server); - $encryptKeyLength = $this->encryption_algorithm_to_key_size($encrypt); - if ($encryptKeyLength === null) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible client to server encryption algorithms found'); - } - // through diffie-hellman key exchange a symmetric key is obtained - $this->kex_algorithm = self::array_intersect_first($kex_algorithms, $this->kex_algorithms); - if ($this->kex_algorithm === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible key exchange algorithms found'); - } - $server_host_key_algorithm = self::array_intersect_first($server_host_key_algorithms, $this->server_host_key_algorithms); - if ($server_host_key_algorithm === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server host key algorithms found'); - } - $mac_algorithm_out = self::array_intersect_first($c2s_mac_algorithms, $this->mac_algorithms_client_to_server); - if ($mac_algorithm_out === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible client to server message authentication algorithms found'); - } - $mac_algorithm_in = self::array_intersect_first($s2c_mac_algorithms, $this->mac_algorithms_server_to_client); - if ($mac_algorithm_in === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server to client message authentication algorithms found'); - } - $compression_map = ['none' => self::NET_SSH2_COMPRESSION_NONE, 'zlib' => self::NET_SSH2_COMPRESSION_ZLIB, 'zlib@openssh.com' => self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH]; - $compression_algorithm_in = self::array_intersect_first($s2c_compression_algorithms, $this->compression_algorithms_server_to_client); - if ($compression_algorithm_in === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server to client compression algorithms found'); - } - $this->decompress = $compression_map[$compression_algorithm_in]; - $compression_algorithm_out = self::array_intersect_first($c2s_compression_algorithms, $this->compression_algorithms_client_to_server); - if ($compression_algorithm_out === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible client to server compression algorithms found'); - } - $this->compress = $compression_map[$compression_algorithm_out]; - switch ($this->kex_algorithm) { - case 'diffie-hellman-group15-sha512': - case 'diffie-hellman-group16-sha512': - case 'diffie-hellman-group17-sha512': - case 'diffie-hellman-group18-sha512': - case 'ecdh-sha2-nistp521': - $kexHash = new Hash('sha512'); - break; - case 'ecdh-sha2-nistp384': - $kexHash = new Hash('sha384'); - break; - case 'diffie-hellman-group-exchange-sha256': - case 'diffie-hellman-group14-sha256': - case 'ecdh-sha2-nistp256': - case 'curve25519-sha256@libssh.org': - case 'curve25519-sha256': - $kexHash = new Hash('sha256'); - break; - default: - $kexHash = new Hash('sha1'); - } - // Only relevant in diffie-hellman-group-exchange-sha{1,256}, otherwise empty. - $exchange_hash_rfc4419 = ''; - if (\strpos($this->kex_algorithm, 'curve25519-sha256') === 0 || \strpos($this->kex_algorithm, 'ecdh-sha2-nistp') === 0) { - $curve = \strpos($this->kex_algorithm, 'curve25519-sha256') === 0 ? 'Curve25519' : \substr($this->kex_algorithm, 10); - $ourPrivate = EC::createKey($curve); - $ourPublicBytes = $ourPrivate->getPublicKey()->getEncodedCoordinates(); - $clientKexInitMessage = 'NET_SSH2_MSG_KEX_ECDH_INIT'; - $serverKexReplyMessage = 'NET_SSH2_MSG_KEX_ECDH_REPLY'; - } else { - if (\strpos($this->kex_algorithm, 'diffie-hellman-group-exchange') === 0) { - $dh_group_sizes_packed = \pack('NNN', $this->kex_dh_group_size_min, $this->kex_dh_group_size_preferred, $this->kex_dh_group_size_max); - $packet = \pack('Ca*', NET_SSH2_MSG_KEXDH_GEX_REQUEST, $dh_group_sizes_packed); - $this->send_binary_packet($packet); - $this->updateLogHistory('UNKNOWN (34)', 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'); - $response = $this->get_binary_packet(); - list($type, $primeBytes, $gBytes) = Strings::unpackSSH2('Css', $response); - if ($type != NET_SSH2_MSG_KEXDH_GEX_GROUP) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new \UnexpectedValueException('Expected SSH_MSG_KEX_DH_GEX_GROUP'); - } - $this->updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEXDH_GEX_GROUP'); - $prime = new BigInteger($primeBytes, -256); - $g = new BigInteger($gBytes, -256); - $exchange_hash_rfc4419 = $dh_group_sizes_packed . Strings::packSSH2('ss', $primeBytes, $gBytes); - $params = DH::createParameters($prime, $g); - $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_GEX_INIT'; - $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_GEX_REPLY'; - } else { - $params = DH::createParameters($this->kex_algorithm); - $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_INIT'; - $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_REPLY'; - } - $keyLength = \min($kexHash->getLengthInBytes(), \max($encryptKeyLength, $decryptKeyLength)); - $ourPrivate = DH::createKey($params, 16 * $keyLength); - // 2 * 8 * $keyLength - $ourPublic = $ourPrivate->getPublicKey()->toBigInteger(); - $ourPublicBytes = $ourPublic->toBytes(\true); - } - $data = \pack('CNa*', \constant($clientKexInitMessage), \strlen($ourPublicBytes), $ourPublicBytes); - $this->send_binary_packet($data); - switch ($clientKexInitMessage) { - case 'NET_SSH2_MSG_KEX_ECDH_INIT': - $this->updateLogHistory('NET_SSH2_MSG_KEXDH_INIT', 'NET_SSH2_MSG_KEX_ECDH_INIT'); - break; - case 'NET_SSH2_MSG_KEXDH_GEX_INIT': - $this->updateLogHistory('UNKNOWN (32)', 'NET_SSH2_MSG_KEXDH_GEX_INIT'); - } - $response = $this->get_binary_packet(); - list($type, $server_public_host_key, $theirPublicBytes, $this->signature) = Strings::unpackSSH2('Csss', $response); - if ($type != \constant($serverKexReplyMessage)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new \UnexpectedValueException("Expected {$serverKexReplyMessage}"); - } - switch ($serverKexReplyMessage) { - case 'NET_SSH2_MSG_KEX_ECDH_REPLY': - $this->updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEX_ECDH_REPLY'); - break; - case 'NET_SSH2_MSG_KEXDH_GEX_REPLY': - $this->updateLogHistory('UNKNOWN (33)', 'NET_SSH2_MSG_KEXDH_GEX_REPLY'); - } - $this->server_public_host_key = $server_public_host_key; - list($public_key_format) = Strings::unpackSSH2('s', $server_public_host_key); - if (\strlen($this->signature) < 4) { - throw new \LengthException('The signature needs at least four bytes'); - } - $temp = \unpack('Nlength', \substr($this->signature, 0, 4)); - $this->signature_format = \substr($this->signature, 4, $temp['length']); - $keyBytes = DH::computeSecret($ourPrivate, $theirPublicBytes); - if (($keyBytes & "\xff\x80") === "\x00\x00") { - $keyBytes = \substr($keyBytes, 1); - } elseif (($keyBytes[0] & "\x80") === "\x80") { - $keyBytes = "\x00{$keyBytes}"; - } - $this->exchange_hash = Strings::packSSH2('s5', $this->identifier, $this->server_identifier, $kexinit_payload_client, $kexinit_payload_server, $this->server_public_host_key); - $this->exchange_hash .= $exchange_hash_rfc4419; - $this->exchange_hash .= Strings::packSSH2('s3', $ourPublicBytes, $theirPublicBytes, $keyBytes); - $this->exchange_hash = $kexHash->hash($this->exchange_hash); - if ($this->session_id === \false) { - $this->session_id = $this->exchange_hash; - } - switch ($server_host_key_algorithm) { - case 'rsa-sha2-256': - case 'rsa-sha2-512': - //case 'ssh-rsa': - $expected_key_format = 'ssh-rsa'; - break; - default: - $expected_key_format = $server_host_key_algorithm; - } - if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) { - switch (\true) { - case $this->signature_format == $server_host_key_algorithm: - case $server_host_key_algorithm != 'rsa-sha2-256' && $server_host_key_algorithm != 'rsa-sha2-512': - case $this->signature_format != 'ssh-rsa': - $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - throw new \RuntimeException('Server Host Key Algorithm Mismatch (' . $this->signature_format . ' vs ' . $server_host_key_algorithm . ')'); - } - } - $packet = \pack('C', NET_SSH2_MSG_NEWKEYS); - $this->send_binary_packet($packet); - $response = $this->get_binary_packet(); - if ($response === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed by server'); - } - list($type) = Strings::unpackSSH2('C', $response); - if ($type != NET_SSH2_MSG_NEWKEYS) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new \UnexpectedValueException('Expected SSH_MSG_NEWKEYS'); - } - $keyBytes = \pack('Na*', \strlen($keyBytes), $keyBytes); - $this->encrypt = self::encryption_algorithm_to_crypt_instance($encrypt); - if ($this->encrypt) { - if (self::$crypto_engine) { - $this->encrypt->setPreferredEngine(self::$crypto_engine); - } - if ($this->encrypt->getBlockLengthInBytes()) { - $this->encrypt_block_size = $this->encrypt->getBlockLengthInBytes(); - } - $this->encrypt->disablePadding(); - if ($this->encrypt->usesIV()) { - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - while ($this->encrypt_block_size > \strlen($iv)) { - $iv .= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->encrypt->setIV(\substr($iv, 0, $this->encrypt_block_size)); - } - switch ($encrypt) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $nonce = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - $this->encryptFixedPart = \substr($nonce, 0, 4); - $this->encryptInvocationCounter = \substr($nonce, 4, 8); - // fall-through - case 'chacha20-poly1305@openssh.com': - break; - default: - $this->encrypt->enableContinuousBuffer(); - } - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); - while ($encryptKeyLength > \strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - switch ($encrypt) { - case 'chacha20-poly1305@openssh.com': - $encryptKeyLength = 32; - $this->lengthEncrypt = self::encryption_algorithm_to_crypt_instance($encrypt); - $this->lengthEncrypt->setKey(\substr($key, 32, 32)); - } - $this->encrypt->setKey(\substr($key, 0, $encryptKeyLength)); - $this->encryptName = $encrypt; - } - $this->decrypt = self::encryption_algorithm_to_crypt_instance($decrypt); - if ($this->decrypt) { - if (self::$crypto_engine) { - $this->decrypt->setPreferredEngine(self::$crypto_engine); - } - if ($this->decrypt->getBlockLengthInBytes()) { - $this->decrypt_block_size = $this->decrypt->getBlockLengthInBytes(); - } - $this->decrypt->disablePadding(); - if ($this->decrypt->usesIV()) { - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - while ($this->decrypt_block_size > \strlen($iv)) { - $iv .= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->decrypt->setIV(\substr($iv, 0, $this->decrypt_block_size)); - } - switch ($decrypt) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - // see https://tools.ietf.org/html/rfc5647#section-7.1 - $nonce = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - $this->decryptFixedPart = \substr($nonce, 0, 4); - $this->decryptInvocationCounter = \substr($nonce, 4, 8); - // fall-through - case 'chacha20-poly1305@openssh.com': - break; - default: - $this->decrypt->enableContinuousBuffer(); - } - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); - while ($decryptKeyLength > \strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - switch ($decrypt) { - case 'chacha20-poly1305@openssh.com': - $decryptKeyLength = 32; - $this->lengthDecrypt = self::encryption_algorithm_to_crypt_instance($decrypt); - $this->lengthDecrypt->setKey(\substr($key, 32, 32)); - } - $this->decrypt->setKey(\substr($key, 0, $decryptKeyLength)); - $this->decryptName = $decrypt; - } - /* The "arcfour128" algorithm is the RC4 cipher, as described in - [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream - generated by the cipher MUST be discarded, and the first byte of the - first encrypted packet MUST be encrypted using the 1537th byte of - keystream. - - -- http://tools.ietf.org/html/rfc4345#section-4 */ - if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { - $this->encrypt->encrypt(\str_repeat("\x00", 1536)); - } - if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { - $this->decrypt->decrypt(\str_repeat("\x00", 1536)); - } - if (!$this->encrypt->usesNonce()) { - list($this->hmac_create, $createKeyLength) = self::mac_algorithm_to_hash_instance($mac_algorithm_out); - } else { - $this->hmac_create = new \stdClass(); - $this->hmac_create_name = $mac_algorithm_out; - //$mac_algorithm_out = 'none'; - $createKeyLength = 0; - } - if ($this->hmac_create instanceof Hash) { - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); - while ($createKeyLength > \strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_create->setKey(\substr($key, 0, $createKeyLength)); - $this->hmac_create_name = $mac_algorithm_out; - $this->hmac_create_etm = \preg_match('#-etm@openssh\\.com$#', $mac_algorithm_out); - } - if (!$this->decrypt->usesNonce()) { - list($this->hmac_check, $checkKeyLength) = self::mac_algorithm_to_hash_instance($mac_algorithm_in); - $this->hmac_size = $this->hmac_check->getLengthInBytes(); - } else { - $this->hmac_check = new \stdClass(); - $this->hmac_check_name = $mac_algorithm_in; - //$mac_algorithm_in = 'none'; - $checkKeyLength = 0; - $this->hmac_size = 0; - } - if ($this->hmac_check instanceof Hash) { - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); - while ($checkKeyLength > \strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_check->setKey(\substr($key, 0, $checkKeyLength)); - $this->hmac_check_name = $mac_algorithm_in; - $this->hmac_check_etm = \preg_match('#-etm@openssh\\.com$#', $mac_algorithm_in); - } - $this->regenerate_compression_context = $this->regenerate_decompression_context = \true; - return \true; - } - /** - * Maps an encryption algorithm name to the number of key bytes. - * - * @param string $algorithm Name of the encryption algorithm - * @return int|null Number of bytes as an integer or null for unknown - */ - private function encryption_algorithm_to_key_size($algorithm) - { - if ($this->bad_key_size_fix && self::bad_algorithm_candidate($algorithm)) { - return 16; - } - switch ($algorithm) { - case 'none': - return 0; - case 'aes128-gcm@openssh.com': - case 'aes128-cbc': - case 'aes128-ctr': - case 'arcfour': - case 'arcfour128': - case 'blowfish-cbc': - case 'blowfish-ctr': - case 'twofish128-cbc': - case 'twofish128-ctr': - return 16; - case '3des-cbc': - case '3des-ctr': - case 'aes192-cbc': - case 'aes192-ctr': - case 'twofish192-cbc': - case 'twofish192-ctr': - return 24; - case 'aes256-gcm@openssh.com': - case 'aes256-cbc': - case 'aes256-ctr': - case 'arcfour256': - case 'twofish-cbc': - case 'twofish256-cbc': - case 'twofish256-ctr': - return 32; - case 'chacha20-poly1305@openssh.com': - return 64; - } - return null; - } - /** - * Maps an encryption algorithm name to an instance of a subclass of - * \phpseclib3\Crypt\Common\SymmetricKey. - * - * @param string $algorithm Name of the encryption algorithm - * @return SymmetricKey|null - */ - private static function encryption_algorithm_to_crypt_instance($algorithm) - { - switch ($algorithm) { - case '3des-cbc': - return new TripleDES('cbc'); - case '3des-ctr': - return new TripleDES('ctr'); - case 'aes256-cbc': - case 'aes192-cbc': - case 'aes128-cbc': - return new Rijndael('cbc'); - case 'aes256-ctr': - case 'aes192-ctr': - case 'aes128-ctr': - return new Rijndael('ctr'); - case 'blowfish-cbc': - return new Blowfish('cbc'); - case 'blowfish-ctr': - return new Blowfish('ctr'); - case 'twofish128-cbc': - case 'twofish192-cbc': - case 'twofish256-cbc': - case 'twofish-cbc': - return new Twofish('cbc'); - case 'twofish128-ctr': - case 'twofish192-ctr': - case 'twofish256-ctr': - return new Twofish('ctr'); - case 'arcfour': - case 'arcfour128': - case 'arcfour256': - return new RC4(); - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - return new Rijndael('gcm'); - case 'chacha20-poly1305@openssh.com': - return new ChaCha20(); - } - return null; - } - /** - * Maps an encryption algorithm name to an instance of a subclass of - * \phpseclib3\Crypt\Hash. - * - * @param string $algorithm Name of the encryption algorithm - * @return array{Hash, int}|null - */ - private static function mac_algorithm_to_hash_instance($algorithm) - { - switch ($algorithm) { - case 'umac-64@openssh.com': - case 'umac-64-etm@openssh.com': - return [new Hash('umac-64'), 16]; - case 'umac-128@openssh.com': - case 'umac-128-etm@openssh.com': - return [new Hash('umac-128'), 16]; - case 'hmac-sha2-512': - case 'hmac-sha2-512-etm@openssh.com': - return [new Hash('sha512'), 64]; - case 'hmac-sha2-256': - case 'hmac-sha2-256-etm@openssh.com': - return [new Hash('sha256'), 32]; - case 'hmac-sha1': - case 'hmac-sha1-etm@openssh.com': - return [new Hash('sha1'), 20]; - case 'hmac-sha1-96': - return [new Hash('sha1-96'), 20]; - case 'hmac-md5': - return [new Hash('md5'), 16]; - case 'hmac-md5-96': - return [new Hash('md5-96'), 16]; - } - } - /* - * Tests whether or not proposed algorithm has a potential for issues - * - * @link https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ssh2-aesctr-openssh.html - * @link https://bugzilla.mindrot.org/show_bug.cgi?id=1291 - * @param string $algorithm Name of the encryption algorithm - * @return bool - */ - private static function bad_algorithm_candidate($algorithm) - { - switch ($algorithm) { - case 'arcfour256': - case 'aes192-ctr': - case 'aes256-ctr': - return \true; - } - return \false; - } - /** - * Login - * - * The $password parameter can be a plaintext password, a \phpseclib3\Crypt\RSA|EC|DSA object, a \phpseclib3\System\SSH\Agent object or an array - * - * @param string $username - * @param string|PrivateKey|array[]|Agent|null ...$args - * @return bool - * @see self::_login() - */ - public function login($username, ...$args) - { - $this->auth[] = \func_get_args(); - // try logging with 'none' as an authentication method first since that's what - // PuTTY does - if (\substr($this->server_identifier, 0, 15) != 'SSH-2.0-CoreFTP' && $this->auth_methods_to_continue === null) { - if ($this->sublogin($username)) { - return \true; - } - if (!\count($args)) { - return \false; - } - } - return $this->sublogin($username, ...$args); - } - /** - * Login Helper - * - * @param string $username - * @param string|PrivateKey|array[]|Agent|null ...$args - * @return bool - * @see self::_login_helper() - */ - protected function sublogin($username, ...$args) - { - if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { - $this->connect(); - } - if (empty($args)) { - return $this->login_helper($username); - } - foreach ($args as $arg) { - switch (\true) { - case $arg instanceof PublicKey: - throw new \UnexpectedValueException('A PublicKey object was passed to the login method instead of a PrivateKey object'); - case $arg instanceof PrivateKey: - case $arg instanceof Agent: - case \is_array($arg): - case Strings::is_stringable($arg): - break; - default: - throw new \UnexpectedValueException('$password needs to either be an instance of \\phpseclib3\\Crypt\\Common\\PrivateKey, \\System\\SSH\\Agent, an array or a string'); - } - } - while (\count($args)) { - if (!$this->auth_methods_to_continue || !$this->smartMFA) { - $newargs = $args; - $args = []; - } else { - $newargs = []; - foreach ($this->auth_methods_to_continue as $method) { - switch ($method) { - case 'publickey': - foreach ($args as $key => $arg) { - if ($arg instanceof PrivateKey || $arg instanceof Agent) { - $newargs[] = $arg; - unset($args[$key]); - break; - } - } - break; - case 'keyboard-interactive': - $hasArray = $hasString = \false; - foreach ($args as $arg) { - if ($hasArray || \is_array($arg)) { - $hasArray = \true; - break; - } - if ($hasString || Strings::is_stringable($arg)) { - $hasString = \true; - break; - } - } - if ($hasArray && $hasString) { - foreach ($args as $key => $arg) { - if (\is_array($arg)) { - $newargs[] = $arg; - break 2; - } - } - } - // fall-through - case 'password': - foreach ($args as $key => $arg) { - $newargs[] = $arg; - unset($args[$key]); - break; - } - } - } - } - if (!\count($newargs)) { - return \false; - } - foreach ($newargs as $arg) { - if ($this->login_helper($username, $arg)) { - return \true; - } - } - } - return \false; - } - /** - * Login Helper - * - * {@internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages.} - * - * @param string $username - * @param string|AsymmetricKey|array[]|Agent|null ...$args - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - */ - private function login_helper($username, $password = null) - { - if (!($this->bitmap & self::MASK_CONNECTED)) { - return \false; - } - if (!($this->bitmap & self::MASK_LOGIN_REQ)) { - $packet = Strings::packSSH2('Cs', NET_SSH2_MSG_SERVICE_REQUEST, 'ssh-userauth'); - $this->send_binary_packet($packet); - try { - $response = $this->get_binary_packet(); - } catch (\Exception $e) { - if ($this->retry_connect) { - $this->retry_connect = \false; - $this->connect(); - return $this->login_helper($username, $password); - } - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed by server'); - } - list($type, $service) = Strings::unpackSSH2('Cs', $response); - if ($type != NET_SSH2_MSG_SERVICE_ACCEPT || $service != 'ssh-userauth') { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new \UnexpectedValueException('Expected SSH_MSG_SERVICE_ACCEPT'); - } - $this->bitmap |= self::MASK_LOGIN_REQ; - } - if (\strlen($this->last_interactive_response)) { - return !Strings::is_stringable($password) && !\is_array($password) ? \false : $this->keyboard_interactive_process($password); - } - if ($password instanceof PrivateKey) { - return $this->privatekey_login($username, $password); - } - if ($password instanceof Agent) { - return $this->ssh_agent_login($username, $password); - } - if (\is_array($password)) { - if ($this->keyboard_interactive_login($username, $password)) { - $this->bitmap |= self::MASK_LOGIN; - return \true; - } - return \false; - } - if (!isset($password)) { - $packet = Strings::packSSH2('Cs3', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'none'); - $this->send_binary_packet($packet); - $response = $this->get_binary_packet(); - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return \true; - case NET_SSH2_MSG_USERAUTH_FAILURE: - list($auth_methods) = Strings::unpackSSH2('L', $response); - $this->auth_methods_to_continue = $auth_methods; - // fall-through - default: - return \false; - } - } - $packet = Strings::packSSH2('Cs3bs', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'password', \false, $password); - // remove the username and password from the logged packet - if (!\defined('NET_SSH2_LOGGING')) { - $logged = null; - } else { - $logged = Strings::packSSH2('Cs3bs', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'password', \false, 'password'); - } - $this->send_binary_packet($packet, $logged); - $response = $this->get_binary_packet(); - if ($response === \false) { - return \false; - } - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: - // in theory, the password can be changed - $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'); - list($message) = Strings::unpackSSH2('s', $response); - $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $message; - return $this->disconnect_helper(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); - case NET_SSH2_MSG_USERAUTH_FAILURE: - // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees - // multi-factor authentication - list($auth_methods, $partial_success) = Strings::unpackSSH2('Lb', $response); - $this->auth_methods_to_continue = $auth_methods; - if (!$partial_success && \in_array('keyboard-interactive', $auth_methods)) { - if ($this->keyboard_interactive_login($username, $password)) { - $this->bitmap |= self::MASK_LOGIN; - return \true; - } - return \false; - } - return \false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return \true; - } - return \false; - } - /** - * Login via keyboard-interactive authentication - * - * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator. - * - * @param string $username - * @param string|array $password - * @return bool - */ - private function keyboard_interactive_login($username, $password) - { - $packet = Strings::packSSH2( - 'Cs5', - NET_SSH2_MSG_USERAUTH_REQUEST, - $username, - 'ssh-connection', - 'keyboard-interactive', - '', - // language tag - '' - ); - $this->send_binary_packet($packet); - return $this->keyboard_interactive_process($password); - } - /** - * Handle the keyboard-interactive requests / responses. - * - * @param string|array ...$responses - * @return bool - * @throws \RuntimeException on connection error - */ - private function keyboard_interactive_process(...$responses) - { - if (\strlen($this->last_interactive_response)) { - $response = $this->last_interactive_response; - } else { - $orig = $response = $this->get_binary_packet(); - } - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: - list(, , , $num_prompts) = Strings::unpackSSH2('s3N', $response); - for ($i = 0; $i < \count($responses); $i++) { - if (\is_array($responses[$i])) { - foreach ($responses[$i] as $key => $value) { - $this->keyboard_requests_responses[$key] = $value; - } - unset($responses[$i]); - } - } - $responses = \array_values($responses); - if (isset($this->keyboard_requests_responses)) { - for ($i = 0; $i < $num_prompts; $i++) { - list($prompt, ) = Strings::unpackSSH2('sC', $response); - foreach ($this->keyboard_requests_responses as $key => $value) { - if (\substr($prompt, 0, \strlen($key)) == $key) { - $responses[] = $value; - break; - } - } - } - } - // see http://tools.ietf.org/html/rfc4256#section-3.2 - if (\strlen($this->last_interactive_response)) { - $this->last_interactive_response = ''; - } else { - $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST'); - } - if (!\count($responses) && $num_prompts) { - $this->last_interactive_response = $orig; - return \false; - } - /* - After obtaining the requested information from the user, the client - MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. - */ - // see http://tools.ietf.org/html/rfc4256#section-3.4 - $packet = $logged = \pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, \count($responses)); - for ($i = 0; $i < \count($responses); $i++) { - $packet .= Strings::packSSH2('s', $responses[$i]); - $logged .= Strings::packSSH2('s', 'dummy-answer'); - } - $this->send_binary_packet($packet, $logged); - $this->updateLogHistory('UNKNOWN (61)', 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'); - /* - After receiving the response, the server MUST send either an - SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another - SSH_MSG_USERAUTH_INFO_REQUEST message. - */ - // maybe phpseclib should force close the connection after x request / responses? unless something like that is done - // there could be an infinite loop of request / responses. - return $this->keyboard_interactive_process(); - case NET_SSH2_MSG_USERAUTH_SUCCESS: - return \true; - case NET_SSH2_MSG_USERAUTH_FAILURE: - list($auth_methods) = Strings::unpackSSH2('L', $response); - $this->auth_methods_to_continue = $auth_methods; - return \false; - } - return \false; - } - /** - * Login with an ssh-agent provided key - * - * @param string $username - * @param \phpseclib3\System\SSH\Agent $agent - * @return bool - */ - private function ssh_agent_login($username, Agent $agent) - { - $this->agent = $agent; - $keys = $agent->requestIdentities(); - foreach ($keys as $key) { - if ($this->privatekey_login($username, $key)) { - return \true; - } - } - return \false; - } - /** - * Login with an RSA private key - * - * {@internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages.} - * - * @param string $username - * @param \phpseclib3\Crypt\Common\PrivateKey $privatekey - * @return bool - * @throws \RuntimeException on connection error - */ - private function privatekey_login($username, PrivateKey $privatekey) - { - $publickey = $privatekey->getPublicKey(); - if ($publickey instanceof RSA) { - $privatekey = $privatekey->withPadding(RSA::SIGNATURE_PKCS1); - $algos = ['rsa-sha2-256', 'rsa-sha2-512', 'ssh-rsa']; - if (isset($this->preferred['hostkey'])) { - $algos = \array_intersect($this->preferred['hostkey'], $algos); - } - $algo = self::array_intersect_first($algos, $this->supported_private_key_algorithms); - switch ($algo) { - case 'rsa-sha2-512': - $hash = 'sha512'; - $signatureType = 'rsa-sha2-512'; - break; - case 'rsa-sha2-256': - $hash = 'sha256'; - $signatureType = 'rsa-sha2-256'; - break; - //case 'ssh-rsa': - default: - $hash = 'sha1'; - $signatureType = 'ssh-rsa'; - } - } elseif ($publickey instanceof EC) { - $privatekey = $privatekey->withSignatureFormat('SSH2'); - $curveName = $privatekey->getCurve(); - switch ($curveName) { - case 'Ed25519': - $hash = 'sha512'; - $signatureType = 'ssh-ed25519'; - break; - case 'secp256r1': - // nistp256 - $hash = 'sha256'; - $signatureType = 'ecdsa-sha2-nistp256'; - break; - case 'secp384r1': - // nistp384 - $hash = 'sha384'; - $signatureType = 'ecdsa-sha2-nistp384'; - break; - case 'secp521r1': - // nistp521 - $hash = 'sha512'; - $signatureType = 'ecdsa-sha2-nistp521'; - break; - default: - if (\is_array($curveName)) { - throw new UnsupportedCurveException('Specified Curves are not supported by SSH2'); - } - throw new UnsupportedCurveException('Named Curve of ' . $curveName . ' is not supported by phpseclib3\'s SSH2 implementation'); - } - } elseif ($publickey instanceof DSA) { - $privatekey = $privatekey->withSignatureFormat('SSH2'); - $hash = 'sha1'; - $signatureType = 'ssh-dss'; - } else { - throw new UnsupportedAlgorithmException('Please use either an RSA key, an EC one or a DSA key'); - } - $publickeyStr = $publickey->toString('OpenSSH', ['binary' => \true]); - $part1 = Strings::packSSH2('Csss', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'publickey'); - $part2 = Strings::packSSH2('ss', $signatureType, $publickeyStr); - $packet = $part1 . \chr(0) . $part2; - $this->send_binary_packet($packet); - $response = $this->get_binary_packet(); - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - list($auth_methods) = Strings::unpackSSH2('L', $response); - if (\in_array('publickey', $auth_methods) && \substr($signatureType, 0, 9) == 'rsa-sha2-') { - $this->supported_private_key_algorithms = \array_diff($this->supported_private_key_algorithms, ['rsa-sha2-256', 'rsa-sha2-512']); - return $this->privatekey_login($username, $privatekey); - } - $this->auth_methods_to_continue = $auth_methods; - $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE'; - return \false; - case NET_SSH2_MSG_USERAUTH_PK_OK: - // we'll just take it on faith that the public key blob and the public key algorithm name are as - // they should be - $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PK_OK'); - break; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return \true; - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new ConnectionClosedException('Unexpected response to publickey authentication pt 1'); - } - $packet = $part1 . \chr(1) . $part2; - $privatekey = $privatekey->withHash($hash); - $signature = $privatekey->sign(Strings::packSSH2('s', $this->session_id) . $packet); - if ($publickey instanceof RSA) { - $signature = Strings::packSSH2('ss', $signatureType, $signature); - } - $packet .= Strings::packSSH2('s', $signature); - $this->send_binary_packet($packet); - $response = $this->get_binary_packet(); - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - // either the login is bad or the server employs multi-factor authentication - list($auth_methods) = Strings::unpackSSH2('L', $response); - $this->auth_methods_to_continue = $auth_methods; - return \false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return \true; - } - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new ConnectionClosedException('Unexpected response to publickey authentication pt 2'); - } - /** - * Return the currently configured timeout - * - * @return int - */ - public function getTimeout() - { - return $this->timeout; - } - /** - * Set Timeout - * - * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. - * Setting $timeout to false or 0 will mean there is no timeout. - * - * @param mixed $timeout - */ - public function setTimeout($timeout) - { - $this->timeout = $this->curTimeout = $timeout; - } - /** - * Set Keep Alive - * - * Sends an SSH2_MSG_IGNORE message every x seconds, if x is a positive non-zero number. - * - * @param int $interval - */ - public function setKeepAlive($interval) - { - $this->keepAlive = $interval; - } - /** - * Get the output from stdError - * - */ - public function getStdError() - { - return $this->stdErrorLog; - } - /** - * Execute Command - * - * If $callback is set to false then \phpseclib3\Net\SSH2::get_channel_packet(self::CHANNEL_EXEC) will need to be called manually. - * In all likelihood, this is not a feature you want to be taking advantage of. - * - * @param string $command - * @return string|bool - * @psalm-return ($callback is callable ? bool : string|bool) - * @throws \RuntimeException on connection error - */ - public function exec($command, callable $callback = null) - { - $this->curTimeout = $this->timeout; - $this->is_timeout = \false; - $this->stdErrorLog = ''; - if (!$this->isAuthenticated()) { - return \false; - } - //if ($this->isPTYOpen()) { - // throw new \RuntimeException('If you want to run multiple exec()\'s you will need to disable (and re-enable if appropriate) a PTY for each one.'); - //} - $this->openChannel(self::CHANNEL_EXEC); - if ($this->request_pty === \true) { - $terminal_modes = \pack('C', NET_SSH2_TTY_OP_END); - $packet = Strings::packSSH2('CNsCsN4s', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_EXEC], 'pty-req', 1, $this->term, $this->windowColumns, $this->windowRows, 0, 0, $terminal_modes); - $this->send_binary_packet($packet); - $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; - if (!$this->get_channel_packet(self::CHANNEL_EXEC)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unable to request pseudo-terminal'); - } - } - // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things - // down. the one place where it might be desirable is if you're doing something like \phpseclib3\Net\SSH2::exec('ping localhost &'). - // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then - // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but - // neither will your script. - // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by - // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the - // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. - $packet = Strings::packSSH2('CNsCs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_EXEC], 'exec', 1, $command); - $this->send_binary_packet($packet); - $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; - if (!$this->get_channel_packet(self::CHANNEL_EXEC)) { - return \false; - } - $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; - if ($this->request_pty === \true) { - $this->channel_id_last_interactive = self::CHANNEL_EXEC; - return \true; - } - $output = ''; - while (\true) { - $temp = $this->get_channel_packet(self::CHANNEL_EXEC); - switch (\true) { - case $temp === \true: - return \is_callable($callback) ? \true : $output; - case $temp === \false: - return \false; - default: - if (\is_callable($callback)) { - if ($callback($temp) === \true) { - $this->close_channel(self::CHANNEL_EXEC); - return \true; - } - } else { - $output .= $temp; - } - } - } - } - /** - * How many channels are currently open? - * - * @return int - */ - public function getOpenChannelCount() - { - return $this->channelCount; - } - /** - * Opens a channel - * - * @param string $channel - * @param bool $skip_extended - * @return bool - */ - protected function openChannel($channel, $skip_extended = \false) - { - if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_CLOSE) { - throw new \RuntimeException('Please close the channel (' . $channel . ') before trying to open it again'); - } - $this->channelCount++; - if ($this->channelCount > 1 && $this->errorOnMultipleChannels) { - throw new \RuntimeException("Ubuntu's OpenSSH from 5.8 to 6.9 doesn't work with multiple channels"); - } - // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to - // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, - // honestly, if you're transferring more than 2GB, you probably shouldn't be using phpseclib, anyway. - // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info - $this->window_size_server_to_client[$channel] = $this->window_size; - // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy - // uses 0x4000, that's what will be used here, as well. - $packet_size = 0x4000; - $packet = Strings::packSSH2('CsN3', NET_SSH2_MSG_CHANNEL_OPEN, 'session', $channel, $this->window_size_server_to_client[$channel], $packet_size); - $this->send_binary_packet($packet); - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_OPEN; - return $this->get_channel_packet($channel, $skip_extended); - } - /** - * Creates an interactive shell - * - * Returns bool(true) if the shell was opened. - * Returns bool(false) if the shell was already open. - * - * @see self::isShellOpen() - * @see self::read() - * @see self::write() - * @return bool - * @throws InsufficientSetupException if not authenticated - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - */ - public function openShell() - { - if (!$this->isAuthenticated()) { - throw new InsufficientSetupException('Operation disallowed prior to login()'); - } - $this->openChannel(self::CHANNEL_SHELL); - $terminal_modes = \pack('C', NET_SSH2_TTY_OP_END); - $packet = Strings::packSSH2( - 'CNsbsN4s', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL_SHELL], - 'pty-req', - \true, - // want reply - $this->term, - $this->windowColumns, - $this->windowRows, - 0, - 0, - $terminal_modes - ); - $this->send_binary_packet($packet); - $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; - if (!$this->get_channel_packet(self::CHANNEL_SHELL)) { - throw new \RuntimeException('Unable to request pty'); - } - $packet = Strings::packSSH2('CNsb', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SHELL], 'shell', \true); - $this->send_binary_packet($packet); - $response = $this->get_channel_packet(self::CHANNEL_SHELL); - if ($response === \false) { - throw new \RuntimeException('Unable to request shell'); - } - $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; - $this->channel_id_last_interactive = self::CHANNEL_SHELL; - $this->bitmap |= self::MASK_SHELL; - return \true; - } - /** - * Return the channel to be used with read(), write(), and reset(), if none were specified - * @deprecated for lack of transparency in intended channel target, to be potentially replaced - * with method which guarantees open-ness of all yielded channels and throws - * error for multiple open channels - * @see self::read() - * @see self::write() - * @return int - */ - private function get_interactive_channel() - { - switch (\true) { - case $this->is_channel_status_data(self::CHANNEL_SUBSYSTEM): - return self::CHANNEL_SUBSYSTEM; - case $this->is_channel_status_data(self::CHANNEL_EXEC): - return self::CHANNEL_EXEC; - default: - return self::CHANNEL_SHELL; - } - } - /** - * Indicates the DATA status on the given channel - * - * @param int $channel The channel number to evaluate - * @return bool - */ - private function is_channel_status_data($channel) - { - return isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA; - } - /** - * Return an available open channel - * - * @return int - */ - private function get_open_channel() - { - $channel = self::CHANNEL_EXEC; - do { - if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_OPEN) { - return $channel; - } - } while ($channel++ < self::CHANNEL_SUBSYSTEM); - return \false; - } - /** - * Request agent forwarding of remote server - * - * @return bool - */ - public function requestAgentForwarding() - { - $request_channel = $this->get_open_channel(); - if ($request_channel === \false) { - return \false; - } - $packet = Strings::packSSH2('CNsC', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[$request_channel], 'auth-agent-req@openssh.com', 1); - $this->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_REQUEST; - $this->send_binary_packet($packet); - if (!$this->get_channel_packet($request_channel)) { - return \false; - } - $this->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_OPEN; - return \true; - } - /** - * Returns the output of an interactive shell - * - * Returns when there's a match for $expect, which can take the form of a string literal or, - * if $mode == self::READ_REGEX, a regular expression. - * - * If not specifying a channel, an open interactive channel will be selected, or, if there are - * no open channels, an interactive shell will be created. If there are multiple open - * interactive channels, a legacy behavior will apply in which channel selection prioritizes - * an active subsystem, the exec pty, and, lastly, the shell. If using multiple interactive - * channels, callers are discouraged from relying on this legacy behavior and should specify - * the intended channel. - * - * @see self::write() - * @param string $expect - * @param int $mode One of the self::READ_* constants - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return string|bool|null - * @throws \RuntimeException on connection error - * @throws InsufficientSetupException on unexpected channel status, possibly due to closure - */ - public function read($expect = '', $mode = self::READ_SIMPLE, $channel = null) - { - if (!$this->isAuthenticated()) { - throw new InsufficientSetupException('Operation disallowed prior to login()'); - } - $this->curTimeout = $this->timeout; - $this->is_timeout = \false; - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - if (!$this->is_channel_status_data($channel) && empty($this->channel_buffers[$channel])) { - if ($channel != self::CHANNEL_SHELL) { - throw new InsufficientSetupException('Data is not available on channel'); - } elseif (!$this->openShell()) { - throw new \RuntimeException('Unable to initiate an interactive shell session'); - } - } - if ($mode == self::READ_NEXT) { - return $this->get_channel_packet($channel); - } - $match = $expect; - while (\true) { - if ($mode == self::READ_REGEX) { - \preg_match($expect, \substr($this->interactiveBuffer, -1024), $matches); - $match = isset($matches[0]) ? $matches[0] : ''; - } - $pos = \strlen($match) ? \strpos($this->interactiveBuffer, $match) : \false; - if ($pos !== \false) { - return Strings::shift($this->interactiveBuffer, $pos + \strlen($match)); - } - $response = $this->get_channel_packet($channel); - if ($response === \true) { - return Strings::shift($this->interactiveBuffer, \strlen($this->interactiveBuffer)); - } - $this->interactiveBuffer .= $response; - } - } - /** - * Inputs a command into an interactive shell. - * - * If not specifying a channel, an open interactive channel will be selected, or, if there are - * no open channels, an interactive shell will be created. If there are multiple open - * interactive channels, a legacy behavior will apply in which channel selection prioritizes - * an active subsystem, the exec pty, and, lastly, the shell. If using multiple interactive - * channels, callers are discouraged from relying on this legacy behavior and should specify - * the intended channel. - * - * @see SSH2::read() - * @param string $cmd - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return void - * @throws \RuntimeException on connection error - * @throws InsufficientSetupException on unexpected channel status, possibly due to closure - */ - public function write($cmd, $channel = null) - { - if (!$this->isAuthenticated()) { - throw new InsufficientSetupException('Operation disallowed prior to login()'); - } - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - if (!$this->is_channel_status_data($channel)) { - if ($channel != self::CHANNEL_SHELL) { - throw new InsufficientSetupException('Data is not available on channel'); - } elseif (!$this->openShell()) { - throw new \RuntimeException('Unable to initiate an interactive shell session'); - } - } - $this->send_channel_packet($channel, $cmd); - } - /** - * Start a subsystem. - * - * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept - * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened. - * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and - * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented - * if there's sufficient demand for such a feature. - * - * @see self::stopSubsystem() - * @param string $subsystem - * @return bool - */ - public function startSubsystem($subsystem) - { - $this->openChannel(self::CHANNEL_SUBSYSTEM); - $packet = Strings::packSSH2('CNsCs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SUBSYSTEM], 'subsystem', 1, $subsystem); - $this->send_binary_packet($packet); - $this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; - if (!$this->get_channel_packet(self::CHANNEL_SUBSYSTEM)) { - return \false; - } - $this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; - $this->channel_id_last_interactive = self::CHANNEL_SUBSYSTEM; - return \true; - } - /** - * Stops a subsystem. - * - * @see self::startSubsystem() - * @return bool - */ - public function stopSubsystem() - { - if ($this->isInteractiveChannelOpen(self::CHANNEL_SUBSYSTEM)) { - $this->close_channel(self::CHANNEL_SUBSYSTEM); - } - return \true; - } - /** - * Closes a channel - * - * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call - * - * If not specifying a channel, an open interactive channel will be selected. If there are - * multiple open interactive channels, a legacy behavior will apply in which channel selection - * prioritizes an active subsystem, the exec pty, and, lastly, the shell. If using multiple - * interactive channels, callers are discouraged from relying on this legacy behavior and - * should specify the intended channel. - * - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return void - */ - public function reset($channel = null) - { - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - if ($this->isInteractiveChannelOpen($channel)) { - $this->close_channel($channel); - } - } - /** - * Is timeout? - * - * Did exec() or read() return because they timed out or because they encountered the end? - * - */ - public function isTimeout() - { - return $this->is_timeout; - } - /** - * Disconnect - * - */ - public function disconnect() - { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - if (isset($this->realtime_log_file) && \is_resource($this->realtime_log_file)) { - \fclose($this->realtime_log_file); - } - unset(self::$connections[$this->getResourceId()]); - } - /** - * Destructor. - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * disconnect(). - * - */ - public function __destruct() - { - $this->disconnect(); - } - /** - * Is the connection still active? - * - * @return bool - */ - public function isConnected() - { - return $this->bitmap & self::MASK_CONNECTED && \is_resource($this->fsock) && !\feof($this->fsock); - } - /** - * Have you successfully been logged in? - * - * @return bool - */ - public function isAuthenticated() - { - return (bool) ($this->bitmap & self::MASK_LOGIN); - } - /** - * Is the interactive shell active? - * - * @return bool - */ - public function isShellOpen() - { - return $this->isInteractiveChannelOpen(self::CHANNEL_SHELL); - } - /** - * Is the exec pty active? - * - * @return bool - */ - public function isPTYOpen() - { - return $this->isInteractiveChannelOpen(self::CHANNEL_EXEC); - } - /** - * Is the given interactive channel active? - * - * @param int $channel Channel id returned by self::getInteractiveChannelId() - * @return bool - */ - public function isInteractiveChannelOpen($channel) - { - return $this->isAuthenticated() && $this->is_channel_status_data($channel); - } - /** - * Returns a channel identifier, presently of the last interactive channel opened, regardless of current status. - * Returns 0 if no interactive channel has been opened. - * - * @see self::isInteractiveChannelOpen() - * @return int - */ - public function getInteractiveChannelId() - { - return $this->channel_id_last_interactive; - } - /** - * Pings a server connection, or tries to reconnect if the connection has gone down - * - * Inspired by http://php.net/manual/en/mysqli.ping.php - * - * @return bool - */ - public function ping() - { - if (!$this->isAuthenticated()) { - if (!empty($this->auth)) { - return $this->reconnect(); - } - return \false; - } - try { - $this->openChannel(self::CHANNEL_KEEP_ALIVE); - } catch (\RuntimeException $e) { - return $this->reconnect(); - } - $this->close_channel(self::CHANNEL_KEEP_ALIVE); - return \true; - } - /** - * In situ reconnect method - * - * @return boolean - */ - private function reconnect() - { - $this->reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST); - $this->retry_connect = \true; - $this->connect(); - foreach ($this->auth as $auth) { - $result = $this->login(...$auth); - } - return $result; - } - /** - * Resets a connection for re-use - * - * @param int $reason - */ - protected function reset_connection($reason) - { - $this->disconnect_helper($reason); - $this->decrypt = $this->encrypt = \false; - $this->decrypt_block_size = $this->encrypt_block_size = 8; - $this->hmac_check = $this->hmac_create = \false; - $this->hmac_size = \false; - $this->session_id = \false; - $this->retry_connect = \true; - $this->get_seq_no = $this->send_seq_no = 0; - } - /** - * Gets Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @see self::_send_binary_packet() - * @param bool $skip_channel_filter - * @return bool|string - */ - private function get_binary_packet($skip_channel_filter = \false) - { - if ($skip_channel_filter) { - if (!\is_resource($this->fsock)) { - throw new \InvalidArgumentException('fsock is not a resource.'); - } - $read = [$this->fsock]; - $write = $except = null; - if (!$this->curTimeout) { - if ($this->keepAlive <= 0) { - static::stream_select($read, $write, $except, null); - } else { - if (!static::stream_select($read, $write, $except, $this->keepAlive)) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_IGNORE, 0)); - return $this->get_binary_packet(\true); - } - } - } else { - if ($this->curTimeout < 0) { - $this->is_timeout = \true; - return \true; - } - $start = \microtime(\true); - if ($this->keepAlive > 0 && $this->keepAlive < $this->curTimeout) { - if (!static::stream_select($read, $write, $except, $this->keepAlive)) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_IGNORE, 0)); - $elapsed = \microtime(\true) - $start; - $this->curTimeout -= $elapsed; - return $this->get_binary_packet(\true); - } - $elapsed = \microtime(\true) - $start; - $this->curTimeout -= $elapsed; - } - $sec = (int) \floor($this->curTimeout); - $usec = (int) (1000000 * ($this->curTimeout - $sec)); - // this can return a "stream_select(): unable to select [4]: Interrupted system call" error - if (!static::stream_select($read, $write, $except, $sec, $usec)) { - $this->is_timeout = \true; - return \true; - } - $elapsed = \microtime(\true) - $start; - $this->curTimeout -= $elapsed; - } - } - if (!\is_resource($this->fsock) || \feof($this->fsock)) { - $this->bitmap = 0; - $str = 'Connection closed (by server) prematurely'; - if (isset($elapsed)) { - $str .= ' ' . $elapsed . 's'; - } - throw new ConnectionClosedException($str); - } - $start = \microtime(\true); - $raw = \stream_get_contents($this->fsock, $this->decrypt_block_size); - if (!\strlen($raw)) { - $this->bitmap = 0; - throw new ConnectionClosedException('No data received from server'); - } - if ($this->decrypt) { - switch ($this->decryptName) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $this->decrypt->setNonce($this->decryptFixedPart . $this->decryptInvocationCounter); - Strings::increment_str($this->decryptInvocationCounter); - $this->decrypt->setAAD($temp = Strings::shift($raw, 4)); - \extract(\unpack('Npacket_length', $temp)); - /** - * @var integer $packet_length - */ - $raw .= $this->read_remaining_bytes($packet_length - $this->decrypt_block_size + 4); - $stop = \microtime(\true); - $tag = \stream_get_contents($this->fsock, $this->decrypt_block_size); - $this->decrypt->setTag($tag); - $raw = $this->decrypt->decrypt($raw); - $raw = $temp . $raw; - $remaining_length = 0; - break; - case 'chacha20-poly1305@openssh.com': - // This should be impossible, but we are checking anyway to narrow the type for Psalm. - if (!$this->decrypt instanceof ChaCha20) { - throw new \LogicException('$this->decrypt is not a ' . ChaCha20::class); - } - $nonce = \pack('N2', 0, $this->get_seq_no); - $this->lengthDecrypt->setNonce($nonce); - $temp = $this->lengthDecrypt->decrypt($aad = Strings::shift($raw, 4)); - \extract(\unpack('Npacket_length', $temp)); - /** - * @var integer $packet_length - */ - $raw .= $this->read_remaining_bytes($packet_length - $this->decrypt_block_size + 4); - $stop = \microtime(\true); - $tag = \stream_get_contents($this->fsock, 16); - $this->decrypt->setNonce($nonce); - $this->decrypt->setCounter(0); - // this is the same approach that's implemented in Salsa20::createPoly1305Key() - // but we don't want to use the same AEAD construction that RFC8439 describes - // for ChaCha20-Poly1305 so we won't rely on it (see Salsa20::poly1305()) - $this->decrypt->setPoly1305Key($this->decrypt->encrypt(\str_repeat("\x00", 32))); - $this->decrypt->setAAD($aad); - $this->decrypt->setCounter(1); - $this->decrypt->setTag($tag); - $raw = $this->decrypt->decrypt($raw); - $raw = $temp . $raw; - $remaining_length = 0; - break; - default: - if (!$this->hmac_check instanceof Hash || !$this->hmac_check_etm) { - $raw = $this->decrypt->decrypt($raw); - break; - } - \extract(\unpack('Npacket_length', $temp = Strings::shift($raw, 4))); - /** - * @var integer $packet_length - */ - $raw .= $this->read_remaining_bytes($packet_length - $this->decrypt_block_size + 4); - $stop = \microtime(\true); - $encrypted = $temp . $raw; - $raw = $temp . $this->decrypt->decrypt($raw); - $remaining_length = 0; - } - } - if (\strlen($raw) < 5) { - $this->bitmap = 0; - throw new \RuntimeException('Plaintext is too short'); - } - \extract(\unpack('Npacket_length/Cpadding_length', Strings::shift($raw, 5))); - /** - * @var integer $packet_length - * @var integer $padding_length - */ - if (!isset($remaining_length)) { - $remaining_length = $packet_length + 4 - $this->decrypt_block_size; - } - $buffer = $this->read_remaining_bytes($remaining_length); - if (!isset($stop)) { - $stop = \microtime(\true); - } - if (\strlen($buffer)) { - $raw .= $this->decrypt ? $this->decrypt->decrypt($buffer) : $buffer; - } - $payload = Strings::shift($raw, $packet_length - $padding_length - 1); - $padding = Strings::shift($raw, $padding_length); - // should leave $raw empty - if ($this->hmac_check instanceof Hash) { - $hmac = \stream_get_contents($this->fsock, $this->hmac_size); - if ($hmac === \false || \strlen($hmac) != $this->hmac_size) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); - throw new \RuntimeException('Error reading socket'); - } - $reconstructed = !$this->hmac_check_etm ? \pack('NCa*', $packet_length, $padding_length, $payload . $padding) : $encrypted; - if (($this->hmac_check->getHash() & "\xff\xff\xff\xff") == 'umac') { - $this->hmac_check->setNonce("\x00\x00\x00\x00" . \pack('N', $this->get_seq_no)); - if ($hmac != $this->hmac_check->hash($reconstructed)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); - throw new \RuntimeException('Invalid UMAC'); - } - } else { - if ($hmac != $this->hmac_check->hash(\pack('Na*', $this->get_seq_no, $reconstructed))) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); - throw new \RuntimeException('Invalid HMAC'); - } - } - } - switch ($this->decompress) { - case self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH: - if (!$this->isAuthenticated()) { - break; - } - // fall-through - case self::NET_SSH2_COMPRESSION_ZLIB: - if ($this->regenerate_decompression_context) { - $this->regenerate_decompression_context = \false; - $cmf = \ord($payload[0]); - $cm = $cmf & 0xf; - if ($cm != 8) { - // deflate - \user_error("Only CM = 8 ('deflate') is supported ({$cm})"); - } - $cinfo = ($cmf & 0xf0) >> 4; - if ($cinfo > 7) { - \user_error("CINFO above 7 is not allowed ({$cinfo})"); - } - $windowSize = 1 << $cinfo + 8; - $flg = \ord($payload[1]); - //$fcheck = $flg && 0x0F; - if (($cmf << 8 | $flg) % 31) { - \user_error('fcheck failed'); - } - $fdict = \boolval($flg & 0x20); - $flevel = ($flg & 0xc0) >> 6; - $this->decompress_context = \inflate_init(\ZLIB_ENCODING_RAW, ['window' => $cinfo + 8]); - $payload = \substr($payload, 2); - } - if ($this->decompress_context) { - $payload = \inflate_add($this->decompress_context, $payload, \ZLIB_PARTIAL_FLUSH); - } - } - $this->get_seq_no++; - if (\defined('NET_SSH2_LOGGING')) { - $current = \microtime(\true); - $message_number = isset(self::$message_numbers[\ord($payload[0])]) ? self::$message_numbers[\ord($payload[0])] : 'UNKNOWN (' . \ord($payload[0]) . ')'; - $message_number = '<- ' . $message_number . ' (since last: ' . \round($current - $this->last_packet, 4) . ', network: ' . \round($stop - $start, 4) . 's)'; - $this->append_log($message_number, $payload); - $this->last_packet = $current; - } - return $this->filter($payload, $skip_channel_filter); - } - /** - * Read Remaining Bytes - * - * @see self::get_binary_packet() - * @param int $remaining_length - * @return string - */ - private function read_remaining_bytes($remaining_length) - { - if (!$remaining_length) { - return ''; - } - $adjustLength = \false; - if ($this->decrypt) { - switch (\true) { - case $this->decryptName == 'aes128-gcm@openssh.com': - case $this->decryptName == 'aes256-gcm@openssh.com': - case $this->decryptName == 'chacha20-poly1305@openssh.com': - case $this->hmac_check instanceof Hash && $this->hmac_check_etm: - $remaining_length += $this->decrypt_block_size - 4; - $adjustLength = \true; - } - } - // quoting , - // "implementations SHOULD check that the packet length is reasonable" - // PuTTY uses 0x9000 as the actual max packet size and so to shall we - // don't do this when GCM mode is used since GCM mode doesn't encrypt the length - if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) { - if (!$this->bad_key_size_fix && self::bad_algorithm_candidate($this->decrypt ? $this->decryptName : '') && !($this->bitmap & \phpseclib3\Net\SSH2::MASK_LOGIN)) { - $this->bad_key_size_fix = \true; - $this->reset_connection(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - return \false; - } - throw new \RuntimeException('Invalid size'); - } - if ($adjustLength) { - $remaining_length -= $this->decrypt_block_size - 4; - } - $buffer = ''; - while ($remaining_length > 0) { - $temp = \stream_get_contents($this->fsock, $remaining_length); - if ($temp === \false || \feof($this->fsock)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new \RuntimeException('Error reading from socket'); - } - $buffer .= $temp; - $remaining_length -= \strlen($temp); - } - return $buffer; - } - /** - * Filter Binary Packets - * - * Because some binary packets need to be ignored... - * - * @see self::_get_binary_packet() - * @param string $payload - * @param bool $skip_channel_filter - * @return string|bool - */ - private function filter($payload, $skip_channel_filter) - { - switch (\ord($payload[0])) { - case NET_SSH2_MSG_DISCONNECT: - Strings::shift($payload, 1); - list($reason_code, $message) = Strings::unpackSSH2('Ns', $payload); - $this->errors[] = 'SSH_MSG_DISCONNECT: ' . static::$disconnect_reasons[$reason_code] . "\r\n{$message}"; - $this->bitmap = 0; - return \false; - case NET_SSH2_MSG_IGNORE: - $payload = $this->get_binary_packet($skip_channel_filter); - break; - case NET_SSH2_MSG_DEBUG: - Strings::shift($payload, 2); - // second byte is "always_display" - list($message) = Strings::unpackSSH2('s', $payload); - $this->errors[] = "SSH_MSG_DEBUG: {$message}"; - $payload = $this->get_binary_packet($skip_channel_filter); - break; - case NET_SSH2_MSG_UNIMPLEMENTED: - return \false; - case NET_SSH2_MSG_KEXINIT: - if ($this->session_id !== \false) { - if (!$this->key_exchange($payload)) { - $this->bitmap = 0; - return \false; - } - $payload = $this->get_binary_packet($skip_channel_filter); - } - } - // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in - if ($this->bitmap & self::MASK_CONNECTED && !$this->isAuthenticated() && !\is_bool($payload) && \ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { - Strings::shift($payload, 1); - list($this->banner_message) = Strings::unpackSSH2('s', $payload); - $payload = $this->get_binary_packet(); - } - // only called when we've already logged in - if ($this->bitmap & self::MASK_CONNECTED && $this->isAuthenticated()) { - if (\is_bool($payload)) { - return $payload; - } - switch (\ord($payload[0])) { - case NET_SSH2_MSG_CHANNEL_REQUEST: - if (\strlen($payload) == 31) { - \extract(\unpack('cpacket_type/Nchannel/Nlength', $payload)); - if (\substr($payload, 9, $length) == 'keepalive@openssh.com' && isset($this->server_channels[$channel])) { - if (\ord(\substr($payload, 9 + $length))) { - // want reply - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_SUCCESS, $this->server_channels[$channel])); - } - $payload = $this->get_binary_packet($skip_channel_filter); - } - } - break; - case NET_SSH2_MSG_CHANNEL_DATA: - case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: - case NET_SSH2_MSG_CHANNEL_CLOSE: - case NET_SSH2_MSG_CHANNEL_EOF: - if (!$skip_channel_filter && !empty($this->server_channels)) { - $this->binary_packet_buffer = $payload; - $this->get_channel_packet(\true); - $payload = $this->get_binary_packet(); - } - break; - case NET_SSH2_MSG_GLOBAL_REQUEST: - // see http://tools.ietf.org/html/rfc4254#section-4 - Strings::shift($payload, 1); - list($request_name) = Strings::unpackSSH2('s', $payload); - $this->errors[] = "SSH_MSG_GLOBAL_REQUEST: {$request_name}"; - try { - $this->send_binary_packet(\pack('C', NET_SSH2_MSG_REQUEST_FAILURE)); - } catch (\RuntimeException $e) { - return $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - $payload = $this->get_binary_packet($skip_channel_filter); - break; - case NET_SSH2_MSG_CHANNEL_OPEN: - // see http://tools.ietf.org/html/rfc4254#section-5.1 - Strings::shift($payload, 1); - list($data, $server_channel) = Strings::unpackSSH2('sN', $payload); - switch ($data) { - case 'auth-agent': - case 'auth-agent@openssh.com': - if (isset($this->agent)) { - $new_channel = self::CHANNEL_AGENT_FORWARD; - list($remote_window_size, $remote_maximum_packet_size) = Strings::unpackSSH2('NN', $payload); - $this->packet_size_client_to_server[$new_channel] = $remote_window_size; - $this->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size; - $this->window_size_client_to_server[$new_channel] = $this->window_size; - $packet_size = 0x4000; - $packet = \pack('CN4', NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, $server_channel, $new_channel, $packet_size, $packet_size); - $this->server_channels[$new_channel] = $server_channel; - $this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION; - $this->send_binary_packet($packet); - } - break; - default: - $packet = Strings::packSSH2( - 'CN2ss', - NET_SSH2_MSG_CHANNEL_OPEN_FAILURE, - $server_channel, - NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, - '', - // description - '' - ); - try { - $this->send_binary_packet($packet); - } catch (\RuntimeException $e) { - return $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - } - $payload = $this->get_binary_packet($skip_channel_filter); - break; - case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: - Strings::shift($payload, 1); - list($channel, $window_size) = Strings::unpackSSH2('NN', $payload); - $this->window_size_client_to_server[$channel] += $window_size; - $payload = $this->bitmap & self::MASK_WINDOW_ADJUST ? \true : $this->get_binary_packet($skip_channel_filter); - } - } - return $payload; - } - /** - * Enable Quiet Mode - * - * Suppress stderr from output - * - */ - public function enableQuietMode() - { - $this->quiet_mode = \true; - } - /** - * Disable Quiet Mode - * - * Show stderr in output - * - */ - public function disableQuietMode() - { - $this->quiet_mode = \false; - } - /** - * Returns whether Quiet Mode is enabled or not - * - * @see self::enableQuietMode() - * @see self::disableQuietMode() - * @return bool - */ - public function isQuietModeEnabled() - { - return $this->quiet_mode; - } - /** - * Enable request-pty when using exec() - * - */ - public function enablePTY() - { - $this->request_pty = \true; - } - /** - * Disable request-pty when using exec() - * - */ - public function disablePTY() - { - if ($this->isPTYOpen()) { - $this->close_channel(self::CHANNEL_EXEC); - } - $this->request_pty = \false; - } - /** - * Returns whether request-pty is enabled or not - * - * @see self::enablePTY() - * @see self::disablePTY() - * @return bool - */ - public function isPTYEnabled() - { - return $this->request_pty; - } - /** - * Gets channel data - * - * Returns the data as a string. bool(true) is returned if: - * - * - the server closes the channel - * - if the connection times out - * - if the channel status is CHANNEL_OPEN and the response was CHANNEL_OPEN_CONFIRMATION - * - if the channel status is CHANNEL_REQUEST and the response was CHANNEL_SUCCESS - * - if the channel status is CHANNEL_CLOSE and the response was CHANNEL_CLOSE - * - * bool(false) is returned if: - * - * - if the channel status is CHANNEL_REQUEST and the response was CHANNEL_FAILURE - * - * @param int $client_channel - * @param bool $skip_extended - * @return mixed - * @throws \RuntimeException on connection error - */ - protected function get_channel_packet($client_channel, $skip_extended = \false) - { - if (!empty($this->channel_buffers[$client_channel])) { - switch ($this->channel_status[$client_channel]) { - case NET_SSH2_MSG_CHANNEL_REQUEST: - foreach ($this->channel_buffers[$client_channel] as $i => $packet) { - switch (\ord($packet[0])) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - case NET_SSH2_MSG_CHANNEL_FAILURE: - unset($this->channel_buffers[$client_channel][$i]); - return \substr($packet, 1); - } - } - break; - default: - return \substr(\array_shift($this->channel_buffers[$client_channel]), 1); - } - } - while (\true) { - if ($this->binary_packet_buffer !== \false) { - $response = $this->binary_packet_buffer; - $this->binary_packet_buffer = \false; - } else { - $response = $this->get_binary_packet(\true); - if ($response === \true && $this->is_timeout) { - if ($client_channel == self::CHANNEL_EXEC && !$this->request_pty) { - $this->close_channel($client_channel); - } - return \true; - } - if ($response === \false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed by server'); - } - } - if ($client_channel == -1 && $response === \true) { - return \true; - } - list($type, $channel) = Strings::unpackSSH2('CN', $response); - // will not be setup yet on incoming channel open request - if (isset($channel) && isset($this->channel_status[$channel]) && isset($this->window_size_server_to_client[$channel])) { - $this->window_size_server_to_client[$channel] -= \strlen($response); - // resize the window, if appropriate - if ($this->window_size_server_to_client[$channel] < 0) { - // PuTTY does something more analogous to the following: - //if ($this->window_size_server_to_client[$channel] < 0x3FFFFFFF) { - $packet = \pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_resize); - $this->send_binary_packet($packet); - $this->window_size_server_to_client[$channel] += $this->window_resize; - } - switch ($type) { - case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: - /* - if ($client_channel == self::CHANNEL_EXEC) { - $this->send_channel_packet($client_channel, chr(0)); - } - */ - // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR - list($data_type_code, $data) = Strings::unpackSSH2('Ns', $response); - $this->stdErrorLog .= $data; - if ($skip_extended || $this->quiet_mode) { - continue 2; - } - if ($client_channel == $channel && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA) { - return $data; - } - $this->channel_buffers[$channel][] = \chr($type) . $data; - continue 2; - case NET_SSH2_MSG_CHANNEL_REQUEST: - if ($this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_CLOSE) { - continue 2; - } - list($value) = Strings::unpackSSH2('s', $response); - switch ($value) { - case 'exit-signal': - list(, $signal_name, , $error_message) = Strings::unpackSSH2('bsbs', $response); - $this->errors[] = "SSH_MSG_CHANNEL_REQUEST (exit-signal): {$signal_name}"; - if (\strlen($error_message)) { - $this->errors[\count($this->errors) - 1] .= "\r\n{$error_message}"; - } - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_EOF; - continue 3; - case 'exit-status': - list(, $this->exit_status) = Strings::unpackSSH2('CN', $response); - // "The client MAY ignore these messages." - // -- http://tools.ietf.org/html/rfc4254#section-6.10 - continue 3; - default: - // "Some systems may not implement signals, in which case they SHOULD ignore this message." - // -- http://tools.ietf.org/html/rfc4254#section-6.9 - continue 3; - } - } - switch ($this->channel_status[$channel]) { - case NET_SSH2_MSG_CHANNEL_OPEN: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: - list($this->server_channels[$channel], $window_size, $this->packet_size_client_to_server[$channel]) = Strings::unpackSSH2('NNN', $response); - if ($window_size < 0) { - $window_size &= 0x7fffffff; - $window_size += 0x80000000; - } - $this->window_size_client_to_server[$channel] = $window_size; - $result = $client_channel == $channel ? \true : $this->get_channel_packet($client_channel, $skip_extended); - $this->on_channel_open(); - return $result; - case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unable to open channel'); - default: - if ($client_channel == $channel) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unexpected response to open request'); - } - return $this->get_channel_packet($client_channel, $skip_extended); - } - break; - case NET_SSH2_MSG_CHANNEL_REQUEST: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - return \true; - case NET_SSH2_MSG_CHANNEL_FAILURE: - return \false; - case NET_SSH2_MSG_CHANNEL_DATA: - list($data) = Strings::unpackSSH2('s', $response); - $this->channel_buffers[$channel][] = \chr($type) . $data; - return $this->get_channel_packet($client_channel, $skip_extended); - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unable to fulfill channel request'); - } - case NET_SSH2_MSG_CHANNEL_CLOSE: - if ($client_channel == $channel && $type == NET_SSH2_MSG_CHANNEL_CLOSE) { - return \true; - } - return $this->get_channel_packet($client_channel, $skip_extended); - } - } - // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA - switch ($type) { - case NET_SSH2_MSG_CHANNEL_DATA: - /* - if ($channel == self::CHANNEL_EXEC) { - // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server - // this actually seems to make things twice as fast. more to the point, the message right after - // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise. - // in OpenSSH it slows things down but only by a couple thousandths of a second. - $this->send_channel_packet($channel, chr(0)); - } - */ - list($data) = Strings::unpackSSH2('s', $response); - if ($channel == self::CHANNEL_AGENT_FORWARD) { - $agent_response = $this->agent->forwardData($data); - if (!\is_bool($agent_response)) { - $this->send_channel_packet($channel, $agent_response); - } - break; - } - if ($client_channel == $channel) { - return $data; - } - $this->channel_buffers[$channel][] = \chr($type) . $data; - break; - case NET_SSH2_MSG_CHANNEL_CLOSE: - $this->curTimeout = 5; - $this->close_channel_bitmap($channel); - if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - } - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - $this->channelCount--; - if ($client_channel == $channel) { - return \true; - } - // fall-through - case NET_SSH2_MSG_CHANNEL_EOF: - break; - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException("Error reading channel data ({$type})"); - } - } - } - /** - * Sends Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @param string $data - * @param string $logged - * @see self::_get_binary_packet() - * @return void - */ - protected function send_binary_packet($data, $logged = null) - { - if (!\is_resource($this->fsock) || \feof($this->fsock)) { - $this->bitmap = 0; - throw new ConnectionClosedException('Connection closed prematurely'); - } - if (!isset($logged)) { - $logged = $data; - } - switch ($this->compress) { - case self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH: - if (!$this->isAuthenticated()) { - break; - } - // fall-through - case self::NET_SSH2_COMPRESSION_ZLIB: - if (!$this->regenerate_compression_context) { - $header = ''; - } else { - $this->regenerate_compression_context = \false; - $this->compress_context = \deflate_init(\ZLIB_ENCODING_RAW, ['window' => 15]); - $header = "x\x9c"; - } - if ($this->compress_context) { - $data = $header . \deflate_add($this->compress_context, $data, \ZLIB_PARTIAL_FLUSH); - } - } - // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 - $packet_length = \strlen($data) + 9; - if ($this->encrypt && $this->encrypt->usesNonce()) { - $packet_length -= 4; - } - // round up to the nearest $this->encrypt_block_size - $packet_length += ($this->encrypt_block_size - 1) * $packet_length % $this->encrypt_block_size; - // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length - $padding_length = $packet_length - \strlen($data) - 5; - switch (\true) { - case $this->encrypt && $this->encrypt->usesNonce(): - case $this->hmac_create instanceof Hash && $this->hmac_create_etm: - $padding_length += 4; - $packet_length += 4; - } - $padding = Random::string($padding_length); - // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself - $packet = \pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); - $hmac = ''; - if ($this->hmac_create instanceof Hash && !$this->hmac_create_etm) { - if (($this->hmac_create->getHash() & "\xff\xff\xff\xff") == 'umac') { - $this->hmac_create->setNonce("\x00\x00\x00\x00" . \pack('N', $this->send_seq_no)); - $hmac = $this->hmac_create->hash($packet); - } else { - $hmac = $this->hmac_create->hash(\pack('Na*', $this->send_seq_no, $packet)); - } - } - if ($this->encrypt) { - switch ($this->encryptName) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $this->encrypt->setNonce($this->encryptFixedPart . $this->encryptInvocationCounter); - Strings::increment_str($this->encryptInvocationCounter); - $this->encrypt->setAAD($temp = $packet & "\xff\xff\xff\xff"); - $packet = $temp . $this->encrypt->encrypt(\substr($packet, 4)); - break; - case 'chacha20-poly1305@openssh.com': - // This should be impossible, but we are checking anyway to narrow the type for Psalm. - if (!$this->encrypt instanceof ChaCha20) { - throw new \LogicException('$this->encrypt is not a ' . ChaCha20::class); - } - $nonce = \pack('N2', 0, $this->send_seq_no); - $this->encrypt->setNonce($nonce); - $this->lengthEncrypt->setNonce($nonce); - $length = $this->lengthEncrypt->encrypt($packet & "\xff\xff\xff\xff"); - $this->encrypt->setCounter(0); - // this is the same approach that's implemented in Salsa20::createPoly1305Key() - // but we don't want to use the same AEAD construction that RFC8439 describes - // for ChaCha20-Poly1305 so we won't rely on it (see Salsa20::poly1305()) - $this->encrypt->setPoly1305Key($this->encrypt->encrypt(\str_repeat("\x00", 32))); - $this->encrypt->setAAD($length); - $this->encrypt->setCounter(1); - $packet = $length . $this->encrypt->encrypt(\substr($packet, 4)); - break; - default: - $packet = $this->hmac_create instanceof Hash && $this->hmac_create_etm ? ($packet & "\xff\xff\xff\xff") . $this->encrypt->encrypt(\substr($packet, 4)) : $this->encrypt->encrypt($packet); - } - } - if ($this->hmac_create instanceof Hash && $this->hmac_create_etm) { - if (($this->hmac_create->getHash() & "\xff\xff\xff\xff") == 'umac') { - $this->hmac_create->setNonce("\x00\x00\x00\x00" . \pack('N', $this->send_seq_no)); - $hmac = $this->hmac_create->hash($packet); - } else { - $hmac = $this->hmac_create->hash(\pack('Na*', $this->send_seq_no, $packet)); - } - } - $this->send_seq_no++; - $packet .= $this->encrypt && $this->encrypt->usesNonce() ? $this->encrypt->getTag() : $hmac; - $start = \microtime(\true); - $sent = @\fputs($this->fsock, $packet); - $stop = \microtime(\true); - if (\defined('NET_SSH2_LOGGING')) { - $current = \microtime(\true); - $message_number = isset(self::$message_numbers[\ord($logged[0])]) ? self::$message_numbers[\ord($logged[0])] : 'UNKNOWN (' . \ord($logged[0]) . ')'; - $message_number = '-> ' . $message_number . ' (since last: ' . \round($current - $this->last_packet, 4) . ', network: ' . \round($stop - $start, 4) . 's)'; - $this->append_log($message_number, $logged); - $this->last_packet = $current; - } - if (\strlen($packet) != $sent) { - $this->bitmap = 0; - $message = $sent === \false ? 'Unable to write ' . \strlen($packet) . ' bytes' : "Only {$sent} of " . \strlen($packet) . " bytes were sent"; - throw new \RuntimeException($message); - } - } - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param string $message_number - * @param string $message - */ - private function append_log($message_number, $message) - { - $this->append_log_helper(NET_SSH2_LOGGING, $message_number, $message, $this->message_number_log, $this->message_log, $this->log_size, $this->realtime_log_file, $this->realtime_log_wrap, $this->realtime_log_size); - } - /** - * Logs data packet helper - * - * @param int $constant - * @param string $message_number - * @param string $message - * @param array &$message_number_log - * @param array &$message_log - * @param int &$log_size - * @param resource &$realtime_log_file - * @param bool &$realtime_log_wrap - * @param int &$realtime_log_size - */ - protected function append_log_helper($constant, $message_number, $message, array &$message_number_log, array &$message_log, &$log_size, &$realtime_log_file, &$realtime_log_wrap, &$realtime_log_size) - { - // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) - if (\strlen($message_number) > 2) { - Strings::shift($message); - } - switch ($constant) { - // useful for benchmarks - case self::LOG_SIMPLE: - $message_number_log[] = $message_number; - break; - case self::LOG_SIMPLE_REALTIME: - echo $message_number; - echo \PHP_SAPI == 'cli' ? "\r\n" : '
      '; - @\flush(); - @\ob_flush(); - break; - // the most useful log for SSH2 - case self::LOG_COMPLEX: - $message_number_log[] = $message_number; - $log_size += \strlen($message); - $message_log[] = $message; - while ($log_size > self::LOG_MAX_SIZE) { - $log_size -= \strlen(\array_shift($message_log)); - \array_shift($message_number_log); - } - break; - // dump the output out realtime; packets may be interspersed with non packets, - // passwords won't be filtered out and select other packets may not be correctly - // identified - case self::LOG_REALTIME: - switch (\PHP_SAPI) { - case 'cli': - $start = $stop = "\r\n"; - break; - default: - $start = '
      ';
      -                        $stop = '
      '; - } - echo $start . $this->format_log([$message], [$message_number]) . $stop; - @\flush(); - @\ob_flush(); - break; - // basically the same thing as self::LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILENAME - // needs to be defined and that the resultant log file will be capped out at self::LOG_MAX_SIZE. - // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily - // at the beginning of the file - case self::LOG_REALTIME_FILE: - if (!isset($realtime_log_file)) { - // PHP doesn't seem to like using constants in fopen() - $filename = NET_SSH2_LOG_REALTIME_FILENAME; - $fp = \fopen($filename, 'w'); - $realtime_log_file = $fp; - } - if (!\is_resource($realtime_log_file)) { - break; - } - $entry = $this->format_log([$message], [$message_number]); - if ($realtime_log_wrap) { - $temp = "<<< START >>>\r\n"; - $entry .= $temp; - \fseek($realtime_log_file, \ftell($realtime_log_file) - \strlen($temp)); - } - $realtime_log_size += \strlen($entry); - if ($realtime_log_size > self::LOG_MAX_SIZE) { - \fseek($realtime_log_file, 0); - $realtime_log_size = \strlen($entry); - $realtime_log_wrap = \true; - } - \fputs($realtime_log_file, $entry); - } - } - /** - * Sends channel data - * - * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate - * - * @param int $client_channel - * @param string $data - * @return void - */ - protected function send_channel_packet($client_channel, $data) - { - while (\strlen($data)) { - if (!$this->window_size_client_to_server[$client_channel]) { - $this->bitmap ^= self::MASK_WINDOW_ADJUST; - // using an invalid channel will let the buffers be built up for the valid channels - $this->get_channel_packet(-1); - $this->bitmap ^= self::MASK_WINDOW_ADJUST; - } - /* The maximum amount of data allowed is determined by the maximum - packet size for the channel, and the current window size, whichever - is smaller. - -- http://tools.ietf.org/html/rfc4254#section-5.2 */ - $max_size = \min($this->packet_size_client_to_server[$client_channel], $this->window_size_client_to_server[$client_channel]); - $temp = Strings::shift($data, $max_size); - $packet = Strings::packSSH2('CNs', NET_SSH2_MSG_CHANNEL_DATA, $this->server_channels[$client_channel], $temp); - $this->window_size_client_to_server[$client_channel] -= \strlen($temp); - $this->send_binary_packet($packet); - } - } - /** - * Closes and flushes a channel - * - * \phpseclib3\Net\SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server - * and for SFTP channels are presumably closed when the client disconnects. This functions is intended - * for SCP more than anything. - * - * @param int $client_channel - * @param bool $want_reply - * @return void - */ - private function close_channel($client_channel, $want_reply = \false) - { - // see http://tools.ietf.org/html/rfc4254#section-5.3 - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - if (!$want_reply) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - } - $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - $this->channelCount--; - $this->curTimeout = 5; - while (!\is_bool($this->get_channel_packet($client_channel))) { - } - if ($want_reply) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - } - $this->close_channel_bitmap($client_channel); - } - /** - * Maintains execution state bitmap in response to channel closure - * - * @param int $client_channel The channel number to maintain closure status of - * @return void - */ - private function close_channel_bitmap($client_channel) - { - switch ($client_channel) { - case self::CHANNEL_SHELL: - // Shell status has been maintained in the bitmap for backwards - // compatibility sake, but can be removed going forward - if ($this->bitmap & self::MASK_SHELL) { - $this->bitmap &= ~self::MASK_SHELL; - } - break; - } - } - /** - * Disconnect - * - * @param int $reason - * @return false - */ - protected function disconnect_helper($reason) - { - if ($this->bitmap & self::MASK_CONNECTED) { - $data = Strings::packSSH2('CNss', NET_SSH2_MSG_DISCONNECT, $reason, '', ''); - try { - $this->send_binary_packet($data); - } catch (\Exception $e) { - } - } - $this->bitmap = 0; - if (\is_resource($this->fsock) && \get_resource_type($this->fsock) === 'stream') { - \fclose($this->fsock); - } - return \false; - } - /** - * Define Array - * - * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of - * named constants from it, using the value as the name of the constant and the index as the value of the constant. - * If any of the constants that would be defined already exists, none of the constants will be defined. - * - * @param mixed[] ...$args - * @access protected - */ - protected static function define_array(...$args) - { - foreach ($args as $arg) { - foreach ($arg as $key => $value) { - if (!\defined($value)) { - \define($value, $key); - } else { - break 2; - } - } - } - } - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SSH2_LOGGING == self::LOG_COMPLEX, an array if NET_SSH2_LOGGING == self::LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING') - * - * @return array|false|string - */ - public function getLog() - { - if (!\defined('NET_SSH2_LOGGING')) { - return \false; - } - switch (NET_SSH2_LOGGING) { - case self::LOG_SIMPLE: - return $this->message_number_log; - case self::LOG_COMPLEX: - $log = $this->format_log($this->message_log, $this->message_number_log); - return \PHP_SAPI == 'cli' ? $log : '
      ' . $log . '
      '; - default: - return \false; - } - } - /** - * Formats a log for printing - * - * @param array $message_log - * @param array $message_number_log - * @return string - */ - protected function format_log(array $message_log, array $message_number_log) - { - $output = ''; - for ($i = 0; $i < \count($message_log); $i++) { - $output .= $message_number_log[$i] . "\r\n"; - $current_log = $message_log[$i]; - $j = 0; - do { - if (\strlen($current_log)) { - $output .= \str_pad(\dechex($j), 7, '0', \STR_PAD_LEFT) . '0 '; - } - $fragment = Strings::shift($current_log, $this->log_short_width); - $hex = \substr(\preg_replace_callback('#.#s', function ($matches) { - return $this->log_boundary . \str_pad(\dechex(\ord($matches[0])), 2, '0', \STR_PAD_LEFT); - }, $fragment), \strlen($this->log_boundary)); - // replace non ASCII printable characters with dots - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters - // also replace < with a . since < messes up the output on web browsers - $raw = \preg_replace('#[^\\x20-\\x7E]|<#', '.', $fragment); - $output .= \str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; - $j++; - } while (\strlen($current_log)); - $output .= "\r\n"; - } - return $output; - } - /** - * Helper function for agent->on_channel_open() - * - * Used when channels are created to inform agent - * of said channel opening. Must be called after - * channel open confirmation received - * - */ - private function on_channel_open() - { - if (isset($this->agent)) { - $this->agent->registerChannelOpen($this); - } - } - /** - * Returns the first value of the intersection of two arrays or false if - * the intersection is empty. The order is defined by the first parameter. - * - * @param array $array1 - * @param array $array2 - * @return mixed False if intersection is empty, else intersected value. - */ - private static function array_intersect_first(array $array1, array $array2) - { - foreach ($array1 as $value) { - if (\in_array($value, $array2)) { - return $value; - } - } - return \false; - } - /** - * Returns all errors - * - * @return string[] - */ - public function getErrors() - { - return $this->errors; - } - /** - * Returns the last error - * - * @return string - */ - public function getLastError() - { - $count = \count($this->errors); - if ($count > 0) { - return $this->errors[$count - 1]; - } - } - /** - * Return the server identification. - * - * @return string|false - */ - public function getServerIdentification() - { - $this->connect(); - return $this->server_identifier; - } - /** - * Returns a list of algorithms the server supports - * - * @return array - */ - public function getServerAlgorithms() - { - $this->connect(); - return ['kex' => $this->kex_algorithms, 'hostkey' => $this->server_host_key_algorithms, 'client_to_server' => ['crypt' => $this->encryption_algorithms_client_to_server, 'mac' => $this->mac_algorithms_client_to_server, 'comp' => $this->compression_algorithms_client_to_server, 'lang' => $this->languages_client_to_server], 'server_to_client' => ['crypt' => $this->encryption_algorithms_server_to_client, 'mac' => $this->mac_algorithms_server_to_client, 'comp' => $this->compression_algorithms_server_to_client, 'lang' => $this->languages_server_to_client]]; - } - /** - * Returns a list of KEX algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedKEXAlgorithms() - { - $kex_algorithms = [ - // Elliptic Curve Diffie-Hellman Key Agreement (ECDH) using - // Curve25519. See doc/curve25519-sha256@libssh.org.txt in the - // libssh repository for more information. - 'curve25519-sha256', - 'curve25519-sha256@libssh.org', - 'ecdh-sha2-nistp256', - // RFC 5656 - 'ecdh-sha2-nistp384', - // RFC 5656 - 'ecdh-sha2-nistp521', - // RFC 5656 - 'diffie-hellman-group-exchange-sha256', - // RFC 4419 - 'diffie-hellman-group-exchange-sha1', - // RFC 4419 - // Diffie-Hellman Key Agreement (DH) using integer modulo prime - // groups. - 'diffie-hellman-group14-sha256', - 'diffie-hellman-group14-sha1', - // REQUIRED - 'diffie-hellman-group15-sha512', - 'diffie-hellman-group16-sha512', - 'diffie-hellman-group17-sha512', - 'diffie-hellman-group18-sha512', - 'diffie-hellman-group1-sha1', - ]; - return $kex_algorithms; - } - /** - * Returns a list of host key algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedHostKeyAlgorithms() - { - return [ - 'ssh-ed25519', - // https://tools.ietf.org/html/draft-ietf-curdle-ssh-ed25519-02 - 'ecdsa-sha2-nistp256', - // RFC 5656 - 'ecdsa-sha2-nistp384', - // RFC 5656 - 'ecdsa-sha2-nistp521', - // RFC 5656 - 'rsa-sha2-256', - // RFC 8332 - 'rsa-sha2-512', - // RFC 8332 - 'ssh-rsa', - // RECOMMENDED sign Raw RSA Key - 'ssh-dss', - ]; - } - /** - * Returns a list of symmetric key algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedEncryptionAlgorithms() - { - $algos = [ - // from : - 'aes128-gcm@openssh.com', - 'aes256-gcm@openssh.com', - // from : - 'arcfour256', - 'arcfour128', - //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key - // CTR modes from : - 'aes128-ctr', - // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key - 'aes192-ctr', - // RECOMMENDED AES with 192-bit key - 'aes256-ctr', - // RECOMMENDED AES with 256-bit key - // from : - // one of the big benefits of chacha20-poly1305 is speed. the problem is... - // libsodium doesn't generate the poly1305 keys in the way ssh does and openssl's PHP bindings don't even - // seem to support poly1305 currently. so even if libsodium or openssl are being used for the chacha20 - // part, pure-PHP has to be used for the poly1305 part and that's gonna cause a big slow down. - // speed-wise it winds up being faster to use AES (when openssl or mcrypt are available) and some HMAC - // (which is always gonna be super fast to compute thanks to the hash extension, which - // "is bundled and compiled into PHP by default") - 'chacha20-poly1305@openssh.com', - 'twofish128-ctr', - // OPTIONAL Twofish in SDCTR mode, with 128-bit key - 'twofish192-ctr', - // OPTIONAL Twofish with 192-bit key - 'twofish256-ctr', - // OPTIONAL Twofish with 256-bit key - 'aes128-cbc', - // RECOMMENDED AES with a 128-bit key - 'aes192-cbc', - // OPTIONAL AES with a 192-bit key - 'aes256-cbc', - // OPTIONAL AES in CBC mode, with a 256-bit key - 'twofish128-cbc', - // OPTIONAL Twofish with a 128-bit key - 'twofish192-cbc', - // OPTIONAL Twofish with a 192-bit key - 'twofish256-cbc', - 'twofish-cbc', - // OPTIONAL alias for "twofish256-cbc" - // (this is being retained for historical reasons) - 'blowfish-ctr', - // OPTIONAL Blowfish in SDCTR mode - 'blowfish-cbc', - // OPTIONAL Blowfish in CBC mode - '3des-ctr', - // RECOMMENDED Three-key 3DES in SDCTR mode - '3des-cbc', - ]; - if (self::$crypto_engine) { - $engines = [self::$crypto_engine]; - } else { - $engines = ['libsodium', 'OpenSSL (GCM)', 'OpenSSL', 'mcrypt', 'Eval', 'PHP']; - } - $ciphers = []; - foreach ($engines as $engine) { - foreach ($algos as $algo) { - $obj = self::encryption_algorithm_to_crypt_instance($algo); - if ($obj instanceof Rijndael) { - $obj->setKeyLength(\preg_replace('#[^\\d]#', '', $algo)); - } - switch ($algo) { - case 'chacha20-poly1305@openssh.com': - case 'arcfour128': - case 'arcfour256': - if ($engine != 'Eval') { - continue 2; - } - break; - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - if ($engine == 'OpenSSL') { - continue 2; - } - $obj->setNonce('dummydummydu'); - } - if ($obj->isValidEngine($engine)) { - $algos = \array_diff($algos, [$algo]); - $ciphers[] = $algo; - } - } - } - return $ciphers; - } - /** - * Returns a list of MAC algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedMACAlgorithms() - { - return [ - 'hmac-sha2-256-etm@openssh.com', - 'hmac-sha2-512-etm@openssh.com', - 'umac-64-etm@openssh.com', - 'umac-128-etm@openssh.com', - 'hmac-sha1-etm@openssh.com', - // from : - 'hmac-sha2-256', - // RECOMMENDED HMAC-SHA256 (digest length = key length = 32) - 'hmac-sha2-512', - // OPTIONAL HMAC-SHA512 (digest length = key length = 64) - // from : - 'umac-64@openssh.com', - 'umac-128@openssh.com', - 'hmac-sha1-96', - // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) - 'hmac-sha1', - // REQUIRED HMAC-SHA1 (digest length = key length = 20) - 'hmac-md5-96', - // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) - 'hmac-md5', - ]; - } - /** - * Returns a list of compression algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedCompressionAlgorithms() - { - $algos = ['none']; - // REQUIRED no compression - if (\function_exists('deflate_init')) { - $algos[] = 'zlib@openssh.com'; - // https://datatracker.ietf.org/doc/html/draft-miller-secsh-compression-delayed - $algos[] = 'zlib'; - } - return $algos; - } - /** - * Return list of negotiated algorithms - * - * Uses the same format as https://www.php.net/ssh2-methods-negotiated - * - * @return array - */ - public function getAlgorithmsNegotiated() - { - $this->connect(); - $compression_map = [self::NET_SSH2_COMPRESSION_NONE => 'none', self::NET_SSH2_COMPRESSION_ZLIB => 'zlib', self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH => 'zlib@openssh.com']; - return ['kex' => $this->kex_algorithm, 'hostkey' => $this->signature_format, 'client_to_server' => ['crypt' => $this->encryptName, 'mac' => $this->hmac_create_name, 'comp' => $compression_map[$this->compress]], 'server_to_client' => ['crypt' => $this->decryptName, 'mac' => $this->hmac_check_name, 'comp' => $compression_map[$this->decompress]]]; - } - /** - * Force multiple channels (even if phpseclib has decided to disable them) - */ - public function forceMultipleChannels() - { - $this->errorOnMultipleChannels = \false; - } - /** - * Allows you to set the terminal - * - * @param string $term - */ - public function setTerminal($term) - { - $this->term = $term; - } - /** - * Accepts an associative array with up to four parameters as described at - * - * - * @param array $methods - */ - public function setPreferredAlgorithms(array $methods) - { - $preferred = $methods; - if (isset($preferred['kex'])) { - $preferred['kex'] = \array_intersect($preferred['kex'], static::getSupportedKEXAlgorithms()); - } - if (isset($preferred['hostkey'])) { - $preferred['hostkey'] = \array_intersect($preferred['hostkey'], static::getSupportedHostKeyAlgorithms()); - } - $keys = ['client_to_server', 'server_to_client']; - foreach ($keys as $key) { - if (isset($preferred[$key])) { - $a =& $preferred[$key]; - if (isset($a['crypt'])) { - $a['crypt'] = \array_intersect($a['crypt'], static::getSupportedEncryptionAlgorithms()); - } - if (isset($a['comp'])) { - $a['comp'] = \array_intersect($a['comp'], static::getSupportedCompressionAlgorithms()); - } - if (isset($a['mac'])) { - $a['mac'] = \array_intersect($a['mac'], static::getSupportedMACAlgorithms()); - } - } - } - $keys = ['kex', 'hostkey', 'client_to_server/crypt', 'client_to_server/comp', 'client_to_server/mac', 'server_to_client/crypt', 'server_to_client/comp', 'server_to_client/mac']; - foreach ($keys as $key) { - $p = $preferred; - $m = $methods; - $subkeys = \explode('/', $key); - foreach ($subkeys as $subkey) { - if (!isset($p[$subkey])) { - continue 2; - } - $p = $p[$subkey]; - $m = $m[$subkey]; - } - if (\count($p) != \count($m)) { - $diff = \array_diff($m, $p); - $msg = \count($diff) == 1 ? ' is not a supported algorithm' : ' are not supported algorithms'; - throw new UnsupportedAlgorithmException(\implode(', ', $diff) . $msg); - } - } - $this->preferred = $preferred; - } - /** - * Returns the banner message. - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @return string - */ - public function getBannerMessage() - { - return $this->banner_message; - } - /** - * Returns the server public host key. - * - * Caching this the first time you connect to a server and checking the result on subsequent connections - * is recommended. Returns false if the server signature is not signed correctly with the public host key. - * - * @return string|false - * @throws \RuntimeException on badly formatted keys - * @throws \phpseclib3\Exception\NoSupportedAlgorithmsException when the key isn't in a supported format - */ - public function getServerPublicHostKey() - { - if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { - $this->connect(); - } - $signature = $this->signature; - $server_public_host_key = \base64_encode($this->server_public_host_key); - if ($this->signature_validated) { - return $this->bitmap ? $this->signature_format . ' ' . $server_public_host_key : \false; - } - $this->signature_validated = \true; - switch ($this->signature_format) { - case 'ssh-ed25519': - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - case 'ecdsa-sha2-nistp521': - $key = EC::loadFormat('OpenSSH', $server_public_host_key)->withSignatureFormat('SSH2'); - switch ($this->signature_format) { - case 'ssh-ed25519': - $hash = 'sha512'; - break; - case 'ecdsa-sha2-nistp256': - $hash = 'sha256'; - break; - case 'ecdsa-sha2-nistp384': - $hash = 'sha384'; - break; - case 'ecdsa-sha2-nistp521': - $hash = 'sha512'; - } - $key = $key->withHash($hash); - break; - case 'ssh-dss': - $key = DSA::loadFormat('OpenSSH', $server_public_host_key)->withSignatureFormat('SSH2')->withHash('sha1'); - break; - case 'ssh-rsa': - case 'rsa-sha2-256': - case 'rsa-sha2-512': - // could be ssh-rsa, rsa-sha2-256, rsa-sha2-512 - // we don't check here because we already checked in key_exchange - // some signatures have the type embedded within the message and some don't - list(, $signature) = Strings::unpackSSH2('ss', $signature); - $key = RSA::loadFormat('OpenSSH', $server_public_host_key)->withPadding(RSA::SIGNATURE_PKCS1); - switch ($this->signature_format) { - case 'rsa-sha2-512': - $hash = 'sha512'; - break; - case 'rsa-sha2-256': - $hash = 'sha256'; - break; - //case 'ssh-rsa': - default: - $hash = 'sha1'; - } - $key = $key->withHash($hash); - break; - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - throw new NoSupportedAlgorithmsException('Unsupported signature format'); - } - if (!$key->verify($this->exchange_hash, $signature)) { - return $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - return $this->signature_format . ' ' . $server_public_host_key; - } - /** - * Returns the exit status of an SSH command or false. - * - * @return false|int - */ - public function getExitStatus() - { - if (\is_null($this->exit_status)) { - return \false; - } - return $this->exit_status; - } - /** - * Returns the number of columns for the terminal window size. - * - * @return int - */ - public function getWindowColumns() - { - return $this->windowColumns; - } - /** - * Returns the number of rows for the terminal window size. - * - * @return int - */ - public function getWindowRows() - { - return $this->windowRows; - } - /** - * Sets the number of columns for the terminal window size. - * - * @param int $value - */ - public function setWindowColumns($value) - { - $this->windowColumns = $value; - } - /** - * Sets the number of rows for the terminal window size. - * - * @param int $value - */ - public function setWindowRows($value) - { - $this->windowRows = $value; - } - /** - * Sets the number of columns and rows for the terminal window size. - * - * @param int $columns - * @param int $rows - */ - public function setWindowSize($columns = 80, $rows = 24) - { - $this->windowColumns = $columns; - $this->windowRows = $rows; - } - /** - * To String Magic Method - * - * @return string - */ - #[\ReturnTypeWillChange] - public function __toString() - { - return $this->getResourceId(); - } - /** - * Get Resource ID - * - * We use {} because that symbols should not be in URL according to - * {@link http://tools.ietf.org/html/rfc3986#section-2 RFC}. - * It will safe us from any conflicts, because otherwise regexp will - * match all alphanumeric domains. - * - * @return string - */ - public function getResourceId() - { - return '{' . \spl_object_hash($this) . '}'; - } - /** - * Return existing connection - * - * @param string $id - * - * @return bool|SSH2 will return false if no such connection - */ - public static function getConnectionByResourceId($id) - { - if (isset(self::$connections[$id])) { - return self::$connections[$id] instanceof \WeakReference ? self::$connections[$id]->get() : self::$connections[$id]; - } - return \false; - } - /** - * Return all excising connections - * - * @return array - */ - public static function getConnections() - { - if (!\class_exists('WeakReference')) { - /** @var array */ - return self::$connections; - } - $temp = []; - foreach (self::$connections as $key => $ref) { - $temp[$key] = $ref->get(); - } - return $temp; - } - /* - * Update packet types in log history - * - * @param string $old - * @param string $new - */ - private function updateLogHistory($old, $new) - { - if (\defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) { - $this->message_number_log[\count($this->message_number_log) - 1] = \str_replace($old, $new, $this->message_number_log[\count($this->message_number_log) - 1]); - } - } - /** - * Return the list of authentication methods that may productively continue authentication. - * - * @see https://tools.ietf.org/html/rfc4252#section-5.1 - * @return array|null - */ - public function getAuthMethodsToContinue() - { - return $this->auth_methods_to_continue; - } - /** - * Enables "smart" multi-factor authentication (MFA) - */ - public function enableSmartMFA() - { - $this->smartMFA = \true; - } - /** - * Disables "smart" multi-factor authentication (MFA) - */ - public function disableSmartMFA() - { - $this->smartMFA = \false; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php b/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php deleted file mode 100644 index 1550725..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php +++ /dev/null @@ -1,253 +0,0 @@ - - * login('username', $agent)) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2014 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\System\SSH; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\PublicKeyLoader; -use phpseclib3\Crypt\RSA; -use phpseclib3\Exception\BadConfigurationException; -use phpseclib3\Net\SSH2; -use phpseclib3\System\SSH\Agent\Identity; -/** - * Pure-PHP ssh-agent client identity factory - * - * requestIdentities() method pumps out \phpseclib3\System\SSH\Agent\Identity objects - * - * @author Jim Wigginton - */ -class Agent -{ - use \phpseclib3\System\SSH\Common\Traits\ReadBytes; - // Message numbers - // to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) - const SSH_AGENTC_REQUEST_IDENTITIES = 11; - // this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). - const SSH_AGENT_IDENTITIES_ANSWER = 12; - // the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3) - const SSH_AGENTC_SIGN_REQUEST = 13; - // the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) - const SSH_AGENT_SIGN_RESPONSE = 14; - // Agent forwarding status - // no forwarding requested and not active - const FORWARD_NONE = 0; - // request agent forwarding when opportune - const FORWARD_REQUEST = 1; - // forwarding has been request and is active - const FORWARD_ACTIVE = 2; - /** - * Unused - */ - const SSH_AGENT_FAILURE = 5; - /** - * Socket Resource - * - * @var resource - */ - private $fsock; - /** - * Agent forwarding status - * - * @var int - */ - private $forward_status = self::FORWARD_NONE; - /** - * Buffer for accumulating forwarded authentication - * agent data arriving on SSH data channel destined - * for agent unix socket - * - * @var string - */ - private $socket_buffer = ''; - /** - * Tracking the number of bytes we are expecting - * to arrive for the agent socket on the SSH data - * channel - * - * @var int - */ - private $expected_bytes = 0; - /** - * Default Constructor - * - * @return \phpseclib3\System\SSH\Agent - * @throws \phpseclib3\Exception\BadConfigurationException if SSH_AUTH_SOCK cannot be found - * @throws \RuntimeException on connection errors - */ - public function __construct($address = null) - { - if (!$address) { - switch (\true) { - case isset($_SERVER['SSH_AUTH_SOCK']): - $address = $_SERVER['SSH_AUTH_SOCK']; - break; - case isset($_ENV['SSH_AUTH_SOCK']): - $address = $_ENV['SSH_AUTH_SOCK']; - break; - default: - throw new BadConfigurationException('SSH_AUTH_SOCK not found'); - } - } - if (\in_array('unix', \stream_get_transports())) { - $this->fsock = \fsockopen('unix://' . $address, 0, $errno, $errstr); - if (!$this->fsock) { - throw new \RuntimeException("Unable to connect to ssh-agent (Error {$errno}: {$errstr})"); - } - } else { - if (\substr($address, 0, 9) != '\\\\.\\pipe\\' || \strpos(\substr($address, 9), '\\') !== \false) { - throw new \RuntimeException('Address is not formatted as a named pipe should be'); - } - $this->fsock = \fopen($address, 'r+b'); - if (!$this->fsock) { - throw new \RuntimeException('Unable to open address'); - } - } - } - /** - * Request Identities - * - * See "2.5.2 Requesting a list of protocol 2 keys" - * Returns an array containing zero or more \phpseclib3\System\SSH\Agent\Identity objects - * - * @return array - * @throws \RuntimeException on receipt of unexpected packets - */ - public function requestIdentities() - { - if (!$this->fsock) { - return []; - } - $packet = \pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES); - if (\strlen($packet) != \fputs($this->fsock, $packet)) { - throw new \RuntimeException('Connection closed while requesting identities'); - } - $length = \current(\unpack('N', $this->readBytes(4))); - $packet = $this->readBytes($length); - list($type, $keyCount) = Strings::unpackSSH2('CN', $packet); - if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) { - throw new \RuntimeException('Unable to request identities'); - } - $identities = []; - for ($i = 0; $i < $keyCount; $i++) { - list($key_blob, $comment) = Strings::unpackSSH2('ss', $packet); - $temp = $key_blob; - list($key_type) = Strings::unpackSSH2('s', $temp); - switch ($key_type) { - case 'ssh-rsa': - case 'ssh-dss': - case 'ssh-ed25519': - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - case 'ecdsa-sha2-nistp521': - $key = PublicKeyLoader::load($key_type . ' ' . \base64_encode($key_blob)); - } - // resources are passed by reference by default - if (isset($key)) { - $identity = (new Identity($this->fsock))->withPublicKey($key)->withPublicKeyBlob($key_blob); - $identities[] = $identity; - unset($key); - } - } - return $identities; - } - /** - * Signal that agent forwarding should - * be requested when a channel is opened - * - * @return void - */ - public function startSSHForwarding() - { - if ($this->forward_status == self::FORWARD_NONE) { - $this->forward_status = self::FORWARD_REQUEST; - } - } - /** - * Request agent forwarding of remote server - * - * @param \phpseclib3\Net\SSH2 $ssh - * @return bool - */ - private function request_forwarding(SSH2 $ssh) - { - if (!$ssh->requestAgentForwarding()) { - return \false; - } - $this->forward_status = self::FORWARD_ACTIVE; - return \true; - } - /** - * On successful channel open - * - * This method is called upon successful channel - * open to give the SSH Agent an opportunity - * to take further action. i.e. request agent forwarding - * - * @param \phpseclib3\Net\SSH2 $ssh - */ - public function registerChannelOpen(SSH2 $ssh) - { - if ($this->forward_status == self::FORWARD_REQUEST) { - $this->request_forwarding($ssh); - } - } - /** - * Forward data to SSH Agent and return data reply - * - * @param string $data - * @return string Data from SSH Agent - * @throws \RuntimeException on connection errors - */ - public function forwardData($data) - { - if ($this->expected_bytes > 0) { - $this->socket_buffer .= $data; - $this->expected_bytes -= \strlen($data); - } else { - $agent_data_bytes = \current(\unpack('N', $data)); - $current_data_bytes = \strlen($data); - $this->socket_buffer = $data; - if ($current_data_bytes != $agent_data_bytes + 4) { - $this->expected_bytes = $agent_data_bytes + 4 - $current_data_bytes; - return \false; - } - } - if (\strlen($this->socket_buffer) != \fwrite($this->fsock, $this->socket_buffer)) { - throw new \RuntimeException('Connection closed attempting to forward data to SSH agent'); - } - $this->socket_buffer = ''; - $this->expected_bytes = 0; - $agent_reply_bytes = \current(\unpack('N', $this->readBytes(4))); - $agent_reply_data = $this->readBytes($agent_reply_bytes); - $agent_reply_data = \current(\unpack('a*', $agent_reply_data)); - return \pack('Na*', $agent_reply_bytes, $agent_reply_data); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php b/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php deleted file mode 100644 index ba77b66..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php +++ /dev/null @@ -1,280 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\System\SSH\Agent; - -use phpseclib3\Common\Functions\Strings; -use phpseclib3\Crypt\Common\PrivateKey; -use phpseclib3\Crypt\Common\PublicKey; -use phpseclib3\Crypt\DSA; -use phpseclib3\Crypt\EC; -use phpseclib3\Crypt\RSA; -use phpseclib3\Exception\UnsupportedAlgorithmException; -use phpseclib3\System\SSH\Agent; -use phpseclib3\System\SSH\Common\Traits\ReadBytes; -/** - * Pure-PHP ssh-agent client identity object - * - * Instantiation should only be performed by \phpseclib3\System\SSH\Agent class. - * This could be thought of as implementing an interface that phpseclib3\Crypt\RSA - * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something. - * The methods in this interface would be getPublicKey and sign since those are the - * methods phpseclib looks for to perform public key authentication. - * - * @author Jim Wigginton - * @internal - */ -class Identity implements PrivateKey -{ - use ReadBytes; - // Signature Flags - // See https://tools.ietf.org/html/draft-miller-ssh-agent-00#section-5.3 - const SSH_AGENT_RSA2_256 = 2; - const SSH_AGENT_RSA2_512 = 4; - /** - * Key Object - * - * @var PublicKey - * @see self::getPublicKey() - */ - private $key; - /** - * Key Blob - * - * @var string - * @see self::sign() - */ - private $key_blob; - /** - * Socket Resource - * - * @var resource - * @see self::sign() - */ - private $fsock; - /** - * Signature flags - * - * @var int - * @see self::sign() - * @see self::setHash() - */ - private $flags = 0; - /** - * Curve Aliases - * - * @var array - */ - private static $curveAliases = ['secp256r1' => 'nistp256', 'secp384r1' => 'nistp384', 'secp521r1' => 'nistp521', 'Ed25519' => 'Ed25519']; - /** - * Default Constructor. - * - * @param resource $fsock - */ - public function __construct($fsock) - { - $this->fsock = $fsock; - } - /** - * Set Public Key - * - * Called by \phpseclib3\System\SSH\Agent::requestIdentities() - * - * @param \phpseclib3\Crypt\Common\PublicKey $key - */ - public function withPublicKey(PublicKey $key) - { - if ($key instanceof EC) { - if (\is_array($key->getCurve()) || !isset(self::$curveAliases[$key->getCurve()])) { - throw new UnsupportedAlgorithmException('The only supported curves are nistp256, nistp384, nistp512 and Ed25519'); - } - } - $new = clone $this; - $new->key = $key; - return $new; - } - /** - * Set Public Key - * - * Called by \phpseclib3\System\SSH\Agent::requestIdentities(). The key blob could be extracted from $this->key - * but this saves a small amount of computation. - * - * @param string $key_blob - */ - public function withPublicKeyBlob($key_blob) - { - $new = clone $this; - $new->key_blob = $key_blob; - return $new; - } - /** - * Get Public Key - * - * Wrapper for $this->key->getPublicKey() - * - * @param string $type optional - * @return mixed - */ - public function getPublicKey($type = 'PKCS8') - { - return $this->key; - } - /** - * Sets the hash - * - * @param string $hash - */ - public function withHash($hash) - { - $new = clone $this; - $hash = \strtolower($hash); - if ($this->key instanceof RSA) { - $new->flags = 0; - switch ($hash) { - case 'sha1': - break; - case 'sha256': - $new->flags = self::SSH_AGENT_RSA2_256; - break; - case 'sha512': - $new->flags = self::SSH_AGENT_RSA2_512; - break; - default: - throw new UnsupportedAlgorithmException('The only supported hashes for RSA are sha1, sha256 and sha512'); - } - } - if ($this->key instanceof EC) { - switch ($this->key->getCurve()) { - case 'secp256r1': - $expectedHash = 'sha256'; - break; - case 'secp384r1': - $expectedHash = 'sha384'; - break; - //case 'secp521r1': - //case 'Ed25519': - default: - $expectedHash = 'sha512'; - } - if ($hash != $expectedHash) { - throw new UnsupportedAlgorithmException('The only supported hash for ' . self::$curveAliases[$this->key->getCurve()] . ' is ' . $expectedHash); - } - } - if ($this->key instanceof DSA) { - if ($hash != 'sha1') { - throw new UnsupportedAlgorithmException('The only supported hash for DSA is sha1'); - } - } - return $new; - } - /** - * Sets the padding - * - * Only PKCS1 padding is supported - * - * @param string $padding - */ - public function withPadding($padding) - { - if (!$this->key instanceof RSA) { - throw new UnsupportedAlgorithmException('Only RSA keys support padding'); - } - if ($padding != RSA::SIGNATURE_PKCS1 && $padding != RSA::SIGNATURE_RELAXED_PKCS1) { - throw new UnsupportedAlgorithmException('ssh-agent can only create PKCS1 signatures'); - } - return $this; - } - /** - * Determines the signature padding mode - * - * Valid values are: ASN1, SSH2, Raw - * - * @param string $format - */ - public function withSignatureFormat($format) - { - if ($this->key instanceof RSA) { - throw new UnsupportedAlgorithmException('Only DSA and EC keys support signature format setting'); - } - if ($format != 'SSH2') { - throw new UnsupportedAlgorithmException('Only SSH2-formatted signatures are currently supported'); - } - return $this; - } - /** - * Returns the curve - * - * Returns a string if it's a named curve, an array if not - * - * @return string|array - */ - public function getCurve() - { - if (!$this->key instanceof EC) { - throw new UnsupportedAlgorithmException('Only EC keys have curves'); - } - return $this->key->getCurve(); - } - /** - * Create a signature - * - * See "2.6.2 Protocol 2 private key signature request" - * - * @param string $message - * @return string - * @throws \RuntimeException on connection errors - * @throws \phpseclib3\Exception\UnsupportedAlgorithmException if the algorithm is unsupported - */ - public function sign($message) - { - // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE - $packet = Strings::packSSH2('CssN', Agent::SSH_AGENTC_SIGN_REQUEST, $this->key_blob, $message, $this->flags); - $packet = Strings::packSSH2('s', $packet); - if (\strlen($packet) != \fputs($this->fsock, $packet)) { - throw new \RuntimeException('Connection closed during signing'); - } - $length = \current(\unpack('N', $this->readBytes(4))); - $packet = $this->readBytes($length); - list($type, $signature_blob) = Strings::unpackSSH2('Cs', $packet); - if ($type != Agent::SSH_AGENT_SIGN_RESPONSE) { - throw new \RuntimeException('Unable to retrieve signature'); - } - if (!$this->key instanceof RSA) { - return $signature_blob; - } - list($type, $signature_blob) = Strings::unpackSSH2('ss', $signature_blob); - return $signature_blob; - } - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - throw new \RuntimeException('ssh-agent does not provide a mechanism to get the private key'); - } - /** - * Sets the password - * - * @param string|bool $password - * @return never - */ - public function withPassword($password = \false) - { - throw new \RuntimeException('ssh-agent does not provide a mechanism to get the private key'); - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php b/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php deleted file mode 100644 index d2e09fc..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ -namespace phpseclib3\System\SSH\Common\Traits; - -/** - * ReadBytes trait - * - * @author Jim Wigginton - */ -trait ReadBytes -{ - /** - * Read data - * - * @param int $length - * @throws \RuntimeException on connection errors - */ - public function readBytes($length) - { - $temp = \fread($this->fsock, $length); - if (\strlen($temp) != $length) { - throw new \RuntimeException("Expected {$length} bytes; got " . \strlen($temp)); - } - return $temp; - } -} diff --git a/dependencies/phpseclib/phpseclib/phpseclib/bootstrap.php b/dependencies/phpseclib/phpseclib/phpseclib/bootstrap.php deleted file mode 100644 index ced3fef..0000000 --- a/dependencies/phpseclib/phpseclib/phpseclib/bootstrap.php +++ /dev/null @@ -1,27 +0,0 @@ -\\|int\\|string\\>\\|null\\.$#" - count: 1 - path: src/Ast/NodeTraverser.php - - - - message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" - count: 1 - path: src/Ast/NodeTraverser.php - - - - message: "#^Method PHPStan\\\\PhpDocParser\\\\Parser\\\\StringUnescaper\\:\\:parseEscapeSequences\\(\\) should return string but returns string\\|null\\.$#" - count: 1 - path: src/Parser/StringUnescaper.php - - - - message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" - count: 2 - path: src/Printer/Printer.php diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php b/dependencies/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php deleted file mode 100644 index 356e765..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php +++ /dev/null @@ -1,30 +0,0 @@ -key = $key; - $this->value = $value; - } - public function __toString() : string - { - if ($this->key !== null) { - return sprintf('%s => %s', $this->key, $this->value); - } - return (string) $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php deleted file mode 100644 index 359bfc0..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php +++ /dev/null @@ -1,24 +0,0 @@ -items = $items; - } - public function __toString() : string - { - return '[' . implode(', ', $this->items) . ']'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php deleted file mode 100644 index a0ae653..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php +++ /dev/null @@ -1,14 +0,0 @@ -value = $value; - } - public function __toString() : string - { - return $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php deleted file mode 100644 index 68e7cce..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php +++ /dev/null @@ -1,20 +0,0 @@ -value = $value; - } - public function __toString() : string - { - return $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php deleted file mode 100644 index 20a2d33..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php +++ /dev/null @@ -1,9 +0,0 @@ -value = $value; - } - public function __toString() : string - { - return $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php deleted file mode 100644 index 5aeb76f..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php +++ /dev/null @@ -1,14 +0,0 @@ -className = $className; - $this->name = $name; - } - public function __toString() : string - { - if ($this->className === '') { - return $this->name; - } - return "{$this->className}::{$this->name}"; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php deleted file mode 100644 index 0b4f7ba..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php +++ /dev/null @@ -1,35 +0,0 @@ -value = $value; - } - public function __toString() : string - { - return self::escape($this->value); - } - public static function unescape(string $value) : string - { - // from https://github.com/doctrine/annotations/blob/a9ec7af212302a75d1f92fa65d3abfbd16245a2a/lib/Doctrine/Common/Annotations/DocLexer.php#L103-L107 - return str_replace('""', '"', substr($value, 1, strlen($value) - 2)); - } - private static function escape(string $value) : string - { - // from https://github.com/phpstan/phpdoc-parser/issues/205#issuecomment-1662323656 - return sprintf('"%s"', str_replace('"', '""', $value)); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php deleted file mode 100644 index 7290db8..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php +++ /dev/null @@ -1,67 +0,0 @@ -quoteType = $quoteType; - } - public function __toString() : string - { - if ($this->quoteType === self::SINGLE_QUOTED) { - // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 - return sprintf("'%s'", addcslashes($this->value, '\'\\')); - } - // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 - return sprintf('"%s"', $this->escapeDoubleQuotedString()); - } - private function escapeDoubleQuotedString() : string - { - $quote = '"'; - $escaped = addcslashes($this->value, "\n\r\t\f\v\$" . $quote . '\\'); - // Escape control characters and non-UTF-8 characters. - // Regex based on https://stackoverflow.com/a/11709412/385378. - $regex = '/( - [\\x00-\\x08\\x0E-\\x1F] # Control characters - | [\\xC0-\\xC1] # Invalid UTF-8 Bytes - | [\\xF5-\\xFF] # Invalid UTF-8 Bytes - | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point - | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point - | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start - | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start - | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start - | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle - | (? */ - private $attributes = []; - /** - * @param mixed $value - */ - public function setAttribute(string $key, $value) : void - { - $this->attributes[$key] = $value; - } - public function hasAttribute(string $key) : bool - { - return array_key_exists($key, $this->attributes); - } - /** - * @return mixed - */ - public function getAttribute(string $key) - { - if ($this->hasAttribute($key)) { - return $this->attributes[$key]; - } - return null; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php b/dependencies/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php deleted file mode 100644 index 97b1214..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php +++ /dev/null @@ -1,263 +0,0 @@ - Visitors */ - private $visitors = []; - /** @var bool Whether traversal should be stopped */ - private $stopTraversal; - /** - * @param list $visitors - */ - public function __construct(array $visitors) - { - $this->visitors = $visitors; - } - /** - * Traverses an array of nodes using the registered visitors. - * - * @param Node[] $nodes Array of nodes - * - * @return Node[] Traversed array of nodes - */ - public function traverse(array $nodes) : array - { - $this->stopTraversal = \false; - foreach ($this->visitors as $visitor) { - $return = $visitor->beforeTraverse($nodes); - if ($return === null) { - continue; - } - $nodes = $return; - } - $nodes = $this->traverseArray($nodes); - foreach ($this->visitors as $visitor) { - $return = $visitor->afterTraverse($nodes); - if ($return === null) { - continue; - } - $nodes = $return; - } - return $nodes; - } - /** - * Recursively traverse a node. - * - * @param Node $node Node to traverse. - * - * @return Node Result of traversal (may be original node or new one) - */ - private function traverseNode(Node $node) : Node - { - $subNodeNames = array_keys(get_object_vars($node)); - foreach ($subNodeNames as $name) { - $subNode =& $node->{$name}; - if (is_array($subNode)) { - $subNode = $this->traverseArray($subNode); - if ($this->stopTraversal) { - break; - } - } elseif ($subNode instanceof Node) { - $traverseChildren = \true; - $breakVisitorIndex = null; - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($subNode); - if ($return === null) { - continue; - } - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { - $traverseChildren = \false; - } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { - $traverseChildren = \false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = \true; - break 2; - } else { - throw new LogicException('enterNode() returned invalid value of type ' . gettype($return)); - } - } - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { - break; - } - } - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($subNode); - if ($return !== null) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = \true; - break 2; - } elseif (is_array($return)) { - throw new LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); - } else { - throw new LogicException('leaveNode() returned invalid value of type ' . gettype($return)); - } - } - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } - } - return $node; - } - /** - * Recursively traverse array (usually of nodes). - * - * @param mixed[] $nodes Array to traverse - * - * @return mixed[] Result of traversal (may be original array or changed one) - */ - private function traverseArray(array $nodes) : array - { - $doNodes = []; - foreach ($nodes as $i => &$node) { - if ($node instanceof Node) { - $traverseChildren = \true; - $breakVisitorIndex = null; - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($node); - if ($return === null) { - continue; - } - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (is_array($return)) { - $doNodes[] = [$i, $return]; - continue 2; - } elseif ($return === self::REMOVE_NODE) { - $doNodes[] = [$i, []]; - continue 2; - } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { - $traverseChildren = \false; - } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { - $traverseChildren = \false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = \true; - break 2; - } else { - throw new LogicException('enterNode() returned invalid value of type ' . gettype($return)); - } - } - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { - break; - } - } - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($node); - if ($return !== null) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (is_array($return)) { - $doNodes[] = [$i, $return]; - break; - } elseif ($return === self::REMOVE_NODE) { - $doNodes[] = [$i, []]; - break; - } elseif ($return === self::STOP_TRAVERSAL) { - $this->stopTraversal = \true; - break 2; - } else { - throw new LogicException('leaveNode() returned invalid value of type ' . gettype($return)); - } - } - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } elseif (is_array($node)) { - throw new LogicException('Invalid node structure: Contains nested arrays'); - } - } - if (count($doNodes) > 0) { - while ([$i, $replace] = array_pop($doNodes)) { - array_splice($nodes, $i, 1, $replace); - } - } - return $nodes; - } - private function ensureReplacementReasonable(Node $old, Node $new) : void - { - if ($old instanceof TypeNode && !$new instanceof TypeNode) { - throw new LogicException(sprintf('Trying to replace TypeNode with %s', get_class($new))); - } - if ($old instanceof ConstExprNode && !$new instanceof ConstExprNode) { - throw new LogicException(sprintf('Trying to replace ConstExprNode with %s', get_class($new))); - } - if ($old instanceof PhpDocChildNode && !$new instanceof PhpDocChildNode) { - throw new LogicException(sprintf('Trying to replace PhpDocChildNode with %s', get_class($new))); - } - if ($old instanceof PhpDocTagValueNode && !$new instanceof PhpDocTagValueNode) { - throw new LogicException(sprintf('Trying to replace PhpDocTagValueNode with %s', get_class($new))); - } - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php b/dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php deleted file mode 100644 index db2437f..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php +++ /dev/null @@ -1,83 +0,0 @@ - $node stays as-is - * * array (of Nodes) - * => The return value is merged into the parent array (at the position of the $node) - * * NodeTraverser::REMOVE_NODE - * => $node is removed from the parent array - * * NodeTraverser::DONT_TRAVERSE_CHILDREN - * => Children of $node are not traversed. $node stays as-is - * * NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN - * => Further visitors for the current node are skipped, and its children are not - * traversed. $node stays as-is. - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return Node|Node[]|NodeTraverser::*|null Replacement node (or special return value) - */ - public function enterNode(Node $node); - /** - * Called when leaving a node. - * - * Return value semantics: - * * null - * => $node stays as-is - * * NodeTraverser::REMOVE_NODE - * => $node is removed from the parent array - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * array (of Nodes) - * => The return value is merged into the parent array (at the position of the $node) - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return Node|Node[]|NodeTraverser::REMOVE_NODE|NodeTraverser::STOP_TRAVERSAL|null Replacement node (or special return value) - */ - public function leaveNode(Node $node); - /** - * Called once after traversal. - * - * Return value semantics: - * * null: $nodes stays as-is - * * otherwise: $nodes is set to the return value - * - * @param Node[] $nodes Array of nodes - * - * @return Node[]|null Array of nodes - */ - public function afterTraverse(array $nodes) : ?array; -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php b/dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php deleted file mode 100644 index 1d5d561..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php +++ /dev/null @@ -1,17 +0,0 @@ -setAttribute(Attribute::ORIGINAL_NODE, $originalNode); - return $node; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php deleted file mode 100644 index 0cae636..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php +++ /dev/null @@ -1,39 +0,0 @@ -type = $type; - $this->parameter = $parameter; - $this->method = $method; - $this->isNegated = $isNegated; - $this->isEquality = $isEquality; - $this->description = $description; - } - public function __toString() : string - { - $isNegated = $this->isNegated ? '!' : ''; - $isEquality = $this->isEquality ? '=' : ''; - return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->method}() {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php deleted file mode 100644 index e3434e4..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php +++ /dev/null @@ -1,39 +0,0 @@ -type = $type; - $this->parameter = $parameter; - $this->property = $property; - $this->isNegated = $isNegated; - $this->isEquality = $isEquality; - $this->description = $description; - } - public function __toString() : string - { - $isNegated = $this->isNegated ? '!' : ''; - $isEquality = $this->isEquality ? '=' : ''; - return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->property} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php deleted file mode 100644 index e7d9df1..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php +++ /dev/null @@ -1,36 +0,0 @@ -type = $type; - $this->parameter = $parameter; - $this->isNegated = $isNegated; - $this->isEquality = $isEquality; - $this->description = $description; - } - public function __toString() : string - { - $isNegated = $this->isNegated ? '!' : ''; - $isEquality = $this->isEquality ? '=' : ''; - return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php deleted file mode 100644 index 6a6ae73..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php +++ /dev/null @@ -1,21 +0,0 @@ -description = $description; - } - public function __toString() : string - { - return trim($this->description); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php deleted file mode 100644 index 5c7955e..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php +++ /dev/null @@ -1,29 +0,0 @@ - */ - public $arguments; - /** - * @param list $arguments - */ - public function __construct(string $name, array $arguments) - { - $this->name = $name; - $this->arguments = $arguments; - } - public function __toString() : string - { - $arguments = implode(', ', $this->arguments); - return $this->name . '(' . $arguments . ')'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php deleted file mode 100644 index 31174d0..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php +++ /dev/null @@ -1,35 +0,0 @@ -key = $key; - $this->value = $value; - } - public function __toString() : string - { - if ($this->key === null) { - return (string) $this->value; - } - return $this->key . '=' . $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php deleted file mode 100644 index b465862..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php +++ /dev/null @@ -1,26 +0,0 @@ - */ - public $items; - /** - * @param list $items - */ - public function __construct(array $items) - { - $this->items = $items; - } - public function __toString() : string - { - $items = implode(', ', $this->items); - return '{' . $items . '}'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php deleted file mode 100644 index 222081c..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php +++ /dev/null @@ -1,39 +0,0 @@ -key = $key; - $this->value = $value; - } - public function __toString() : string - { - if ($this->key === null) { - return (string) $this->value; - } - return $this->key . '=' . $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php deleted file mode 100644 index 063371d..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -annotation = $annotation; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->annotation} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php deleted file mode 100644 index d30de6a..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php deleted file mode 100644 index d74ea76..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php +++ /dev/null @@ -1,20 +0,0 @@ -value = $value; - } - public function __toString() : string - { - return $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php deleted file mode 100644 index 44f0c12..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php deleted file mode 100644 index dbe8eaa..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php +++ /dev/null @@ -1,38 +0,0 @@ -value = $value; - $this->exceptionArgs = [$exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine()]; - } - public function __get(string $name) : ?ParserException - { - if ($name !== 'exception') { - trigger_error(sprintf('Undefined property: %s::$%s', self::class, $name), E_USER_WARNING); - return null; - } - return new ParserException(...$this->exceptionArgs); - } - public function __toString() : string - { - return $this->value; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php deleted file mode 100644 index cd6c7de..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php +++ /dev/null @@ -1,47 +0,0 @@ -isStatic = $isStatic; - $this->returnType = $returnType; - $this->methodName = $methodName; - $this->parameters = $parameters; - $this->description = $description; - $this->templateTypes = $templateTypes; - } - public function __toString() : string - { - $static = $this->isStatic ? 'static ' : ''; - $returnType = $this->returnType !== null ? "{$this->returnType} " : ''; - $parameters = implode(', ', $this->parameters); - $description = $this->description !== '' ? " {$this->description}" : ''; - $templateTypes = count($this->templateTypes) > 0 ? '<' . implode(', ', $this->templateTypes) . '>' : ''; - return "{$static}{$returnType}{$this->methodName}{$templateTypes}({$parameters}){$description}"; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php deleted file mode 100644 index 1dff9fb..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php +++ /dev/null @@ -1,39 +0,0 @@ -type = $type; - $this->isReference = $isReference; - $this->isVariadic = $isVariadic; - $this->parameterName = $parameterName; - $this->defaultValue = $defaultValue; - } - public function __toString() : string - { - $type = $this->type !== null ? "{$this->type} " : ''; - $isReference = $this->isReference ? '&' : ''; - $isVariadic = $this->isVariadic ? '...' : ''; - $default = $this->defaultValue !== null ? " = {$this->defaultValue}" : ''; - return "{$type}{$isReference}{$isVariadic}{$this->parameterName}{$default}"; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php deleted file mode 100644 index 24420bf..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php deleted file mode 100644 index f088937..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php +++ /dev/null @@ -1,28 +0,0 @@ -type = $type; - $this->parameterName = $parameterName; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->parameterName} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php deleted file mode 100644 index 0ac6d4e..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php +++ /dev/null @@ -1,36 +0,0 @@ -type = $type; - $this->isReference = $isReference; - $this->isVariadic = $isVariadic; - $this->parameterName = $parameterName; - $this->description = $description; - } - public function __toString() : string - { - $reference = $this->isReference ? '&' : ''; - $variadic = $this->isVariadic ? '...' : ''; - return trim("{$this->type} {$reference}{$variadic}{$this->parameterName} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php deleted file mode 100644 index 05ddf64..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php +++ /dev/null @@ -1,9 +0,0 @@ -children = $children; - } - /** - * @return PhpDocTagNode[] - */ - public function getTags() : array - { - return array_filter($this->children, static function (PhpDocChildNode $child) : bool { - return $child instanceof PhpDocTagNode; - }); - } - /** - * @return PhpDocTagNode[] - */ - public function getTagsByName(string $tagName) : array - { - return array_filter($this->getTags(), static function (PhpDocTagNode $tag) use($tagName) : bool { - return $tag->name === $tagName; - }); - } - /** - * @return VarTagValueNode[] - */ - public function getVarTagValues(string $tagName = '@var') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof VarTagValueNode; - }); - } - /** - * @return ParamTagValueNode[] - */ - public function getParamTagValues(string $tagName = '@param') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof ParamTagValueNode; - }); - } - /** - * @return TypelessParamTagValueNode[] - */ - public function getTypelessParamTagValues(string $tagName = '@param') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof TypelessParamTagValueNode; - }); - } - /** - * @return TemplateTagValueNode[] - */ - public function getTemplateTagValues(string $tagName = '@template') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof TemplateTagValueNode; - }); - } - /** - * @return ExtendsTagValueNode[] - */ - public function getExtendsTagValues(string $tagName = '@extends') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof ExtendsTagValueNode; - }); - } - /** - * @return ImplementsTagValueNode[] - */ - public function getImplementsTagValues(string $tagName = '@implements') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof ImplementsTagValueNode; - }); - } - /** - * @return UsesTagValueNode[] - */ - public function getUsesTagValues(string $tagName = '@use') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof UsesTagValueNode; - }); - } - /** - * @return ReturnTagValueNode[] - */ - public function getReturnTagValues(string $tagName = '@return') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof ReturnTagValueNode; - }); - } - /** - * @return ThrowsTagValueNode[] - */ - public function getThrowsTagValues(string $tagName = '@throws') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof ThrowsTagValueNode; - }); - } - /** - * @return MixinTagValueNode[] - */ - public function getMixinTagValues(string $tagName = '@mixin') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof MixinTagValueNode; - }); - } - /** - * @return DeprecatedTagValueNode[] - */ - public function getDeprecatedTagValues() : array - { - return array_filter(array_column($this->getTagsByName('@deprecated'), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof DeprecatedTagValueNode; - }); - } - /** - * @return PropertyTagValueNode[] - */ - public function getPropertyTagValues(string $tagName = '@property') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof PropertyTagValueNode; - }); - } - /** - * @return PropertyTagValueNode[] - */ - public function getPropertyReadTagValues(string $tagName = '@property-read') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof PropertyTagValueNode; - }); - } - /** - * @return PropertyTagValueNode[] - */ - public function getPropertyWriteTagValues(string $tagName = '@property-write') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof PropertyTagValueNode; - }); - } - /** - * @return MethodTagValueNode[] - */ - public function getMethodTagValues(string $tagName = '@method') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof MethodTagValueNode; - }); - } - /** - * @return TypeAliasTagValueNode[] - */ - public function getTypeAliasTagValues(string $tagName = '@phpstan-type') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof TypeAliasTagValueNode; - }); - } - /** - * @return TypeAliasImportTagValueNode[] - */ - public function getTypeAliasImportTagValues(string $tagName = '@phpstan-import-type') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof TypeAliasImportTagValueNode; - }); - } - /** - * @return AssertTagValueNode[] - */ - public function getAssertTagValues(string $tagName = '@phpstan-assert') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof AssertTagValueNode; - }); - } - /** - * @return AssertTagPropertyValueNode[] - */ - public function getAssertPropertyTagValues(string $tagName = '@phpstan-assert') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof AssertTagPropertyValueNode; - }); - } - /** - * @return AssertTagMethodValueNode[] - */ - public function getAssertMethodTagValues(string $tagName = '@phpstan-assert') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof AssertTagMethodValueNode; - }); - } - /** - * @return SelfOutTagValueNode[] - */ - public function getSelfOutTypeTagValues(string $tagName = '@phpstan-this-out') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof SelfOutTagValueNode; - }); - } - /** - * @return ParamOutTagValueNode[] - */ - public function getParamOutTypeTagValues(string $tagName = '@param-out') : array - { - return array_filter(array_column($this->getTagsByName($tagName), 'value'), static function (PhpDocTagValueNode $value) : bool { - return $value instanceof ParamOutTagValueNode; - }); - } - public function __toString() : string - { - $children = array_map(static function (PhpDocChildNode $child) : string { - $s = (string) $child; - return $s === '' ? '' : ' ' . $s; - }, $this->children); - return "/**\n *" . implode("\n *", $children) . "\n */"; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php deleted file mode 100644 index f148435..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php +++ /dev/null @@ -1,28 +0,0 @@ -name = $name; - $this->value = $value; - } - public function __toString() : string - { - if ($this->value instanceof DoctrineTagValueNode) { - return (string) $this->value; - } - return trim("{$this->name} {$this->value}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php deleted file mode 100644 index 8db881a..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php +++ /dev/null @@ -1,9 +0,0 @@ -text = $text; - } - public function __toString() : string - { - return $this->text; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php deleted file mode 100644 index 4353421..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php +++ /dev/null @@ -1,28 +0,0 @@ -type = $type; - $this->propertyName = $propertyName; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->propertyName} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php deleted file mode 100644 index 999489a..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php deleted file mode 100644 index 53ea59b..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim($this->type . ' ' . $this->description); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php deleted file mode 100644 index 9e94a6b..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php +++ /dev/null @@ -1,33 +0,0 @@ -name = $name; - $this->bound = $bound; - $this->default = $default; - $this->description = $description; - } - public function __toString() : string - { - $bound = $this->bound !== null ? " of {$this->bound}" : ''; - $default = $this->default !== null ? " = {$this->default}" : ''; - return trim("{$this->name}{$bound}{$default} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php deleted file mode 100644 index 365e337..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php deleted file mode 100644 index f538bfa..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php +++ /dev/null @@ -1,28 +0,0 @@ -importedAlias = $importedAlias; - $this->importedFrom = $importedFrom; - $this->importedAs = $importedAs; - } - public function __toString() : string - { - return trim("{$this->importedAlias} from {$this->importedFrom}" . ($this->importedAs !== null ? " as {$this->importedAs}" : '')); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php deleted file mode 100644 index 6e7c790..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -alias = $alias; - $this->type = $type; - } - public function __toString() : string - { - return trim("{$this->alias} {$this->type}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php deleted file mode 100644 index 813c013..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php +++ /dev/null @@ -1,32 +0,0 @@ -isReference = $isReference; - $this->isVariadic = $isVariadic; - $this->parameterName = $parameterName; - $this->description = $description; - } - public function __toString() : string - { - $reference = $this->isReference ? '&' : ''; - $variadic = $this->isVariadic ? '...' : ''; - return trim("{$reference}{$variadic}{$this->parameterName} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php deleted file mode 100644 index 7e4ba7d..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php +++ /dev/null @@ -1,25 +0,0 @@ -type = $type; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} {$this->description}"); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php deleted file mode 100644 index 8a26d94..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php +++ /dev/null @@ -1,28 +0,0 @@ -type = $type; - $this->variableName = $variableName; - $this->description = $description; - } - public function __toString() : string - { - return trim("{$this->type} " . trim("{$this->variableName} {$this->description}")); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php deleted file mode 100644 index 05e741b..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php +++ /dev/null @@ -1,35 +0,0 @@ -keyName = $keyName; - $this->optional = $optional; - $this->valueType = $valueType; - } - public function __toString() : string - { - if ($this->keyName !== null) { - return sprintf('%s%s: %s', (string) $this->keyName, $this->optional ? '?' : '', (string) $this->valueType); - } - return (string) $this->valueType; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php deleted file mode 100644 index 4bae824..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php +++ /dev/null @@ -1,37 +0,0 @@ -items = $items; - $this->sealed = $sealed; - $this->kind = $kind; - } - public function __toString() : string - { - $items = $this->items; - if (!$this->sealed) { - $items[] = '...'; - } - return $this->kind . '{' . implode(', ', $items) . '}'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php deleted file mode 100644 index cfb3b42..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php +++ /dev/null @@ -1,23 +0,0 @@ -type = $type; - } - public function __toString() : string - { - if ($this->type instanceof CallableTypeNode || $this->type instanceof ConstTypeNode || $this->type instanceof NullableTypeNode) { - return '(' . $this->type . ')[]'; - } - return $this->type . '[]'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php deleted file mode 100644 index 372b791..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php +++ /dev/null @@ -1,35 +0,0 @@ -identifier = $identifier; - $this->parameters = $parameters; - $this->returnType = $returnType; - } - public function __toString() : string - { - $returnType = $this->returnType; - if ($returnType instanceof self) { - $returnType = "({$returnType})"; - } - $parameters = implode(', ', $this->parameters); - return "{$this->identifier}({$parameters}): {$returnType}"; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php deleted file mode 100644 index 8eca13d..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php +++ /dev/null @@ -1,38 +0,0 @@ -type = $type; - $this->isReference = $isReference; - $this->isVariadic = $isVariadic; - $this->parameterName = $parameterName; - $this->isOptional = $isOptional; - } - public function __toString() : string - { - $type = "{$this->type} "; - $isReference = $this->isReference ? '&' : ''; - $isVariadic = $this->isVariadic ? '...' : ''; - $isOptional = $this->isOptional ? '=' : ''; - return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $isOptional; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php deleted file mode 100644 index 09bac5a..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php +++ /dev/null @@ -1,33 +0,0 @@ -parameterName = $parameterName; - $this->targetType = $targetType; - $this->if = $if; - $this->else = $else; - $this->negated = $negated; - } - public function __toString() : string - { - return sprintf('(%s %s %s ? %s : %s)', $this->parameterName, $this->negated ? 'is not' : 'is', $this->targetType, $this->if, $this->else); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php deleted file mode 100644 index 6eae043..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php +++ /dev/null @@ -1,33 +0,0 @@ -subjectType = $subjectType; - $this->targetType = $targetType; - $this->if = $if; - $this->else = $else; - $this->negated = $negated; - } - public function __toString() : string - { - return sprintf('(%s %s %s ? %s : %s)', $this->subjectType, $this->negated ? 'is not' : 'is', $this->targetType, $this->if, $this->else); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php deleted file mode 100644 index 3cf1fd1..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php +++ /dev/null @@ -1,21 +0,0 @@ -constExpr = $constExpr; - } - public function __toString() : string - { - return $this->constExpr->__toString(); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php deleted file mode 100644 index 6e54b54..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php +++ /dev/null @@ -1,47 +0,0 @@ -type = $type; - $this->genericTypes = $genericTypes; - $this->variances = $variances; - } - public function __toString() : string - { - $genericTypes = []; - foreach ($this->genericTypes as $index => $type) { - $variance = $this->variances[$index] ?? self::VARIANCE_INVARIANT; - if ($variance === self::VARIANCE_INVARIANT) { - $genericTypes[] = (string) $type; - } elseif ($variance === self::VARIANCE_BIVARIANT) { - $genericTypes[] = '*'; - } else { - $genericTypes[] = sprintf('%s %s', $variance, $type); - } - } - return $this->type . '<' . implode(', ', $genericTypes) . '>'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php deleted file mode 100644 index d8ee3dc..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php +++ /dev/null @@ -1,20 +0,0 @@ -name = $name; - } - public function __toString() : string - { - return $this->name; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php deleted file mode 100644 index ead5dcc..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php +++ /dev/null @@ -1,30 +0,0 @@ -types = $types; - } - public function __toString() : string - { - return '(' . implode(' & ', array_map(static function (TypeNode $type) : string { - if ($type instanceof NullableTypeNode) { - return '(' . $type . ')'; - } - return (string) $type; - }, $this->types)) . ')'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php deleted file mode 100644 index 0905e35..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php +++ /dev/null @@ -1,25 +0,0 @@ -exceptionArgs = [$exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine()]; - } - public function getException() : ParserException - { - return new ParserException(...$this->exceptionArgs); - } - public function __toString() : string - { - return '*Invalid type*'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php deleted file mode 100644 index e51a349..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php +++ /dev/null @@ -1,20 +0,0 @@ -type = $type; - } - public function __toString() : string - { - return '?' . $this->type; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php deleted file mode 100644 index f674e77..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php +++ /dev/null @@ -1,34 +0,0 @@ -keyName = $keyName; - $this->optional = $optional; - $this->valueType = $valueType; - } - public function __toString() : string - { - if ($this->keyName !== null) { - return sprintf('%s%s: %s', (string) $this->keyName, $this->optional ? '?' : '', (string) $this->valueType); - } - return (string) $this->valueType; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php deleted file mode 100644 index 28ee185..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php +++ /dev/null @@ -1,25 +0,0 @@ -items = $items; - } - public function __toString() : string - { - $items = $this->items; - return 'object{' . implode(', ', $items) . '}'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php deleted file mode 100644 index d55213c..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php +++ /dev/null @@ -1,26 +0,0 @@ -type = $type; - $this->offset = $offset; - } - public function __toString() : string - { - if ($this->type instanceof CallableTypeNode || $this->type instanceof ConstTypeNode || $this->type instanceof NullableTypeNode) { - return '(' . $this->type . ')[' . $this->offset . ']'; - } - return $this->type . '[' . $this->offset . ']'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php b/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php deleted file mode 100644 index 7a20015..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php +++ /dev/null @@ -1,14 +0,0 @@ -types = $types; - } - public function __toString() : string - { - return '(' . implode(' | ', array_map(static function (TypeNode $type) : string { - if ($type instanceof NullableTypeNode) { - return '(' . $type . ')'; - } - return (string) $type; - }, $this->types)) . ')'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Lexer/Lexer.php b/dependencies/phpstan/phpdoc-parser/src/Lexer/Lexer.php deleted file mode 100644 index a25ce0f..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Lexer/Lexer.php +++ /dev/null @@ -1,134 +0,0 @@ - '\'&\'', self::TOKEN_UNION => '\'|\'', self::TOKEN_INTERSECTION => '\'&\'', self::TOKEN_NULLABLE => '\'?\'', self::TOKEN_NEGATED => '\'!\'', self::TOKEN_OPEN_PARENTHESES => '\'(\'', self::TOKEN_CLOSE_PARENTHESES => '\')\'', self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', self::TOKEN_OPEN_CURLY_BRACKET => '\'{\'', self::TOKEN_CLOSE_CURLY_BRACKET => '\'}\'', self::TOKEN_COMMA => '\',\'', self::TOKEN_COLON => '\':\'', self::TOKEN_VARIADIC => '\'...\'', self::TOKEN_DOUBLE_COLON => '\'::\'', self::TOKEN_DOUBLE_ARROW => '\'=>\'', self::TOKEN_ARROW => '\'->\'', self::TOKEN_EQUAL => '\'=\'', self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', self::TOKEN_DOCTRINE_TAG => 'TOKEN_DOCTRINE_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', self::TOKEN_DOCTRINE_ANNOTATION_STRING => 'TOKEN_DOCTRINE_ANNOTATION_STRING', self::TOKEN_IDENTIFIER => 'type', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'variable', self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', self::TOKEN_OTHER => 'TOKEN_OTHER', self::TOKEN_END => 'TOKEN_END', self::TOKEN_WILDCARD => '*']; - public const VALUE_OFFSET = 0; - public const TYPE_OFFSET = 1; - public const LINE_OFFSET = 2; - /** @var bool */ - private $parseDoctrineAnnotations; - /** @var string|null */ - private $regexp; - public function __construct(bool $parseDoctrineAnnotations = \false) - { - $this->parseDoctrineAnnotations = $parseDoctrineAnnotations; - } - /** - * @return list - */ - public function tokenize(string $s) : array - { - if ($this->regexp === null) { - $this->regexp = $this->generateRegexp(); - } - preg_match_all($this->regexp, $s, $matches, PREG_SET_ORDER); - $tokens = []; - $line = 1; - foreach ($matches as $match) { - $type = (int) $match['MARK']; - $tokens[] = [$match[0], $type, $line]; - if ($type !== self::TOKEN_PHPDOC_EOL) { - continue; - } - $line++; - } - $tokens[] = ['', self::TOKEN_END, $line]; - return $tokens; - } - private function generateRegexp() : string - { - $patterns = [ - self::TOKEN_HORIZONTAL_WS => '[\\x09\\x20]++', - self::TOKEN_IDENTIFIER => '(?:[\\\\]?+[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF-]*+)++', - self::TOKEN_THIS_VARIABLE => '\\$this(?![0-9a-z_\\x80-\\xFF])', - self::TOKEN_VARIABLE => '\\$[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF]*+', - // '&' followed by TOKEN_VARIADIC, TOKEN_VARIABLE, TOKEN_EQUAL, TOKEN_EQUAL or TOKEN_CLOSE_PARENTHESES - self::TOKEN_REFERENCE => '&(?=\\s*+(?:[.,=)]|(?:\\$(?!this(?![0-9a-z_\\x80-\\xFF])))))', - self::TOKEN_UNION => '\\|', - self::TOKEN_INTERSECTION => '&', - self::TOKEN_NULLABLE => '\\?', - self::TOKEN_NEGATED => '!', - self::TOKEN_OPEN_PARENTHESES => '\\(', - self::TOKEN_CLOSE_PARENTHESES => '\\)', - self::TOKEN_OPEN_ANGLE_BRACKET => '<', - self::TOKEN_CLOSE_ANGLE_BRACKET => '>', - self::TOKEN_OPEN_SQUARE_BRACKET => '\\[', - self::TOKEN_CLOSE_SQUARE_BRACKET => '\\]', - self::TOKEN_OPEN_CURLY_BRACKET => '\\{', - self::TOKEN_CLOSE_CURLY_BRACKET => '\\}', - self::TOKEN_COMMA => ',', - self::TOKEN_VARIADIC => '\\.\\.\\.', - self::TOKEN_DOUBLE_COLON => '::', - self::TOKEN_DOUBLE_ARROW => '=>', - self::TOKEN_ARROW => '->', - self::TOKEN_EQUAL => '=', - self::TOKEN_COLON => ':', - self::TOKEN_OPEN_PHPDOC => '/\\*\\*(?=\\s)\\x20?+', - self::TOKEN_CLOSE_PHPDOC => '\\*/', - self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+', - self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?', - self::TOKEN_FLOAT => '[+\\-]?(?:(?:[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+\\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+\\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]++(_[0-9]++)*e[+\\-]?[0-9]++(_[0-9]++)*))', - self::TOKEN_INTEGER => '[+\\-]?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))', - self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'', - self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"', - self::TOKEN_WILDCARD => '\\*', - ]; - if ($this->parseDoctrineAnnotations) { - $patterns[self::TOKEN_DOCTRINE_TAG] = '@[a-z_\\\\][a-z0-9_\\:\\\\]*[a-z_][a-z0-9_]*'; - $patterns[self::TOKEN_DOCTRINE_ANNOTATION_STRING] = '"(?:""|[^"])*+"'; - } - // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL - $patterns[self::TOKEN_OTHER] = '(?:(?!\\*/)[^\\s])++'; - foreach ($patterns as $type => &$pattern) { - $pattern = '(?:' . $pattern . ')(*MARK:' . $type . ')'; - } - return '~' . implode('|', $patterns) . '~Asi'; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php b/dependencies/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php deleted file mode 100644 index c4996eb..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php +++ /dev/null @@ -1,188 +0,0 @@ -unescapeStrings = $unescapeStrings; - $this->quoteAwareConstExprString = $quoteAwareConstExprString; - $this->useLinesAttributes = $usedAttributes['lines'] ?? \false; - $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; - $this->parseDoctrineStrings = \false; - } - /** - * @internal - */ - public function toDoctrine() : self - { - $self = new self($this->unescapeStrings, $this->quoteAwareConstExprString, ['lines' => $this->useLinesAttributes, 'indexes' => $this->useIndexAttributes]); - $self->parseDoctrineStrings = \true; - return $self; - } - public function parse(TokenIterator $tokens, bool $trimStrings = \false) : Ast\ConstExpr\ConstExprNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_FLOAT)) { - $value = $tokens->currentTokenValue(); - $tokens->next(); - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprFloatNode(str_replace('_', '', $value)), $startLine, $startIndex); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { - $value = $tokens->currentTokenValue(); - $tokens->next(); - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $value)), $startLine, $startIndex); - } - if ($this->parseDoctrineStrings && $tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { - $value = $tokens->currentTokenValue(); - $tokens->next(); - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($value)), $startLine, $startIndex); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - if ($this->parseDoctrineStrings) { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_DOUBLE_QUOTED_STRING, null, $tokens->currentTokenLine()); - } - $value = $tokens->currentTokenValue(); - $tokens->next(); - return $this->enrichWithAttributes($tokens, $this->parseDoctrineString($value, $tokens), $startLine, $startIndex); - } - $value = $tokens->currentTokenValue(); - $type = $tokens->currentTokenType(); - if ($trimStrings) { - if ($this->unescapeStrings) { - $value = StringUnescaper::unescapeString($value); - } else { - $value = substr($value, 1, -1); - } - } - $tokens->next(); - if ($this->quoteAwareConstExprString) { - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\QuoteAwareConstExprStringNode($value, $type === Lexer::TOKEN_SINGLE_QUOTED_STRING ? Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED : Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED), $startLine, $startIndex); - } - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprStringNode($value), $startLine, $startIndex); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { - $identifier = $tokens->currentTokenValue(); - $tokens->next(); - switch (strtolower($identifier)) { - case 'true': - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprTrueNode(), $startLine, $startIndex); - case 'false': - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprFalseNode(), $startLine, $startIndex); - case 'null': - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprNullNode(), $startLine, $startIndex); - case 'array': - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); - return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES, $startIndex); - } - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) { - $classConstantName = ''; - $lastType = null; - while (\true) { - if ($lastType !== Lexer::TOKEN_IDENTIFIER && $tokens->currentTokenType() === Lexer::TOKEN_IDENTIFIER) { - $classConstantName .= $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $lastType = Lexer::TOKEN_IDENTIFIER; - continue; - } - if ($lastType !== Lexer::TOKEN_WILDCARD && $tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { - $classConstantName .= '*'; - $lastType = Lexer::TOKEN_WILDCARD; - if ($tokens->getSkippedHorizontalWhiteSpaceIfAny() !== '') { - break; - } - continue; - } - if ($lastType === null) { - // trigger parse error if nothing valid was consumed - $tokens->consumeTokenType(Lexer::TOKEN_WILDCARD); - } - break; - } - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName), $startLine, $startIndex); - } - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstFetchNode('', $identifier), $startLine, $startIndex); - } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET, $startIndex); - } - throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); - } - private function parseArray(TokenIterator $tokens, int $endToken, int $startIndex) : Ast\ConstExpr\ConstExprArrayNode - { - $items = []; - $startLine = $tokens->currentTokenLine(); - if (!$tokens->tryConsumeTokenType($endToken)) { - do { - $items[] = $this->parseArrayItem($tokens); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA) && !$tokens->isCurrentTokenType($endToken)); - $tokens->consumeTokenType($endToken); - } - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprArrayNode($items), $startLine, $startIndex); - } - /** - * This method is supposed to be called with TokenIterator after reading TOKEN_DOUBLE_QUOTED_STRING and shifting - * to the next token. - */ - public function parseDoctrineString(string $text, TokenIterator $tokens) : Ast\ConstExpr\DoctrineConstExprStringNode - { - // Because of how Lexer works, a valid Doctrine string - // can consist of a sequence of TOKEN_DOUBLE_QUOTED_STRING and TOKEN_DOCTRINE_ANNOTATION_STRING - while ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING, Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { - $text .= $tokens->currentTokenValue(); - $tokens->next(); - } - return new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($text)); - } - private function parseArrayItem(TokenIterator $tokens) : Ast\ConstExpr\ConstExprArrayItemNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $expr = $this->parse($tokens); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_ARROW)) { - $key = $expr; - $value = $this->parse($tokens); - } else { - $key = null; - $value = $expr; - } - return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprArrayItemNode($key, $value), $startLine, $startIndex); - } - /** - * @template T of Ast\ConstExpr\ConstExprNode - * @param T $node - * @return T - */ - private function enrichWithAttributes(TokenIterator $tokens, Ast\ConstExpr\ConstExprNode $node, int $startLine, int $startIndex) : Ast\ConstExpr\ConstExprNode - { - if ($this->useLinesAttributes) { - $node->setAttribute(Ast\Attribute::START_LINE, $startLine); - $node->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); - } - if ($this->useIndexAttributes) { - $node->setAttribute(Ast\Attribute::START_INDEX, $startIndex); - $node->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); - } - return $node; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Parser/ParserException.php b/dependencies/phpstan/phpdoc-parser/src/Parser/ParserException.php deleted file mode 100644 index 3c39169..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Parser/ParserException.php +++ /dev/null @@ -1,68 +0,0 @@ -currentTokenValue = $currentTokenValue; - $this->currentTokenType = $currentTokenType; - $this->currentOffset = $currentOffset; - $this->expectedTokenType = $expectedTokenType; - $this->expectedTokenValue = $expectedTokenValue; - $this->currentTokenLine = $currentTokenLine; - parent::__construct(sprintf('Unexpected token %s, expected %s%s at offset %d%s', $this->formatValue($currentTokenValue), Lexer::TOKEN_LABELS[$expectedTokenType], $expectedTokenValue !== null ? sprintf(' (%s)', $this->formatValue($expectedTokenValue)) : '', $currentOffset, $currentTokenLine === null ? '' : sprintf(' on line %d', $currentTokenLine))); - } - public function getCurrentTokenValue() : string - { - return $this->currentTokenValue; - } - public function getCurrentTokenType() : int - { - return $this->currentTokenType; - } - public function getCurrentOffset() : int - { - return $this->currentOffset; - } - public function getExpectedTokenType() : int - { - return $this->expectedTokenType; - } - public function getExpectedTokenValue() : ?string - { - return $this->expectedTokenValue; - } - public function getCurrentTokenLine() : ?int - { - return $this->currentTokenLine; - } - private function formatValue(string $value) : string - { - $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE); - assert($json !== \false); - return $json; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php b/dependencies/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php deleted file mode 100644 index fcb821f..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php +++ /dev/null @@ -1,854 +0,0 @@ -typeParser = $typeParser; - $this->constantExprParser = $constantExprParser; - $this->doctrineConstantExprParser = $constantExprParser->toDoctrine(); - $this->requireWhitespaceBeforeDescription = $requireWhitespaceBeforeDescription; - $this->preserveTypeAliasesWithInvalidTypes = $preserveTypeAliasesWithInvalidTypes; - $this->parseDoctrineAnnotations = $parseDoctrineAnnotations; - $this->useLinesAttributes = $usedAttributes['lines'] ?? \false; - $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; - $this->textBetweenTagsBelongsToDescription = $textBetweenTagsBelongsToDescription; - } - public function parse(TokenIterator $tokens) : Ast\PhpDoc\PhpDocNode - { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PHPDOC); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $children = []; - if ($this->parseDoctrineAnnotations) { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $lastChild = $this->parseChild($tokens); - $children[] = $lastChild; - while (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode && ($lastChild->value instanceof Doctrine\DoctrineTagValueNode || $lastChild->value instanceof Ast\PhpDoc\GenericTagValueNode)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - break; - } - $lastChild = $this->parseChild($tokens); - $children[] = $lastChild; - continue; - } - if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - break; - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - break; - } - $lastChild = $this->parseChild($tokens); - $children[] = $lastChild; - } - } - } else { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $children[] = $this->parseChild($tokens); - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL) && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $children[] = $this->parseChild($tokens); - } - } - } - try { - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PHPDOC); - } catch (ParserException $e) { - $name = ''; - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if (count($children) > 0) { - $lastChild = $children[count($children) - 1]; - if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode) { - $name = $lastChild->name; - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - } - } - $tag = new Ast\PhpDoc\PhpDocTagNode($name, $this->enrichWithAttributes($tokens, new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e), $startLine, $startIndex)); - $tokens->forwardToTheEnd(); - return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode([$this->enrichWithAttributes($tokens, $tag, $startLine, $startIndex)]), 1, 0); - } - return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode(array_values($children)), 1, 0); - } - /** @phpstan-impure */ - private function parseChild(TokenIterator $tokens) : Ast\PhpDoc\PhpDocChildNode - { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - return $this->enrichWithAttributes($tokens, $this->parseTag($tokens), $startLine, $startIndex); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_TAG)) { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $tag = $tokens->currentTokenValue(); - $tokens->next(); - $tagStartLine = $tokens->currentTokenLine(); - $tagStartIndex = $tokens->currentTokenIndex(); - return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocTagNode($tag, $this->enrichWithAttributes($tokens, $this->parseDoctrineTagValue($tokens, $tag), $tagStartLine, $tagStartIndex)), $startLine, $startIndex); - } - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $text = $this->parseText($tokens); - return $this->enrichWithAttributes($tokens, $text, $startLine, $startIndex); - } - /** - * @template T of Ast\Node - * @param T $tag - * @return T - */ - private function enrichWithAttributes(TokenIterator $tokens, Ast\Node $tag, int $startLine, int $startIndex) : Ast\Node - { - if ($this->useLinesAttributes) { - $tag->setAttribute(Ast\Attribute::START_LINE, $startLine); - $tag->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); - } - if ($this->useIndexAttributes) { - $tag->setAttribute(Ast\Attribute::START_INDEX, $startIndex); - $tag->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); - } - return $tag; - } - private function parseText(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTextNode - { - $text = ''; - $endTokens = [Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - if ($this->textBetweenTagsBelongsToDescription) { - $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - } - $savepoint = \false; - // if the next token is EOL, everything below is skipped and empty string is returned - while ($this->textBetweenTagsBelongsToDescription || !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); - $text .= $tmpText; - // stop if we're not at EOL - meaning it's the end of PHPDoc - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - break; - } - if ($this->textBetweenTagsBelongsToDescription) { - if (!$savepoint) { - $tokens->pushSavePoint(); - $savepoint = \true; - } elseif ($tmpText !== '') { - $tokens->dropSavePoint(); - $tokens->pushSavePoint(); - } - } - $tokens->pushSavePoint(); - $tokens->next(); - // if we're at EOL, check what's next - // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop - if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { - $tokens->rollback(); - break; - } - // otherwise if the next is text, continue building the description string - $tokens->dropSavePoint(); - $text .= $tokens->getDetectedNewline() ?? "\n"; - } - if ($savepoint) { - $tokens->rollback(); - $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); - } - return new Ast\PhpDoc\PhpDocTextNode(trim($text, " \t")); - } - private function parseOptionalDescriptionAfterDoctrineTag(TokenIterator $tokens) : string - { - $text = ''; - $endTokens = [Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - if ($this->textBetweenTagsBelongsToDescription) { - $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; - } - $savepoint = \false; - // if the next token is EOL, everything below is skipped and empty string is returned - while ($this->textBetweenTagsBelongsToDescription || !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); - $text .= $tmpText; - // stop if we're not at EOL - meaning it's the end of PHPDoc - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - if (!$tokens->isPrecededByHorizontalWhitespace()) { - return trim($text . $this->parseText($tokens)->text, " \t"); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { - $tokens->pushSavePoint(); - $child = $this->parseChild($tokens); - if ($child instanceof Ast\PhpDoc\PhpDocTagNode) { - if ($child->value instanceof Ast\PhpDoc\GenericTagValueNode || $child->value instanceof Doctrine\DoctrineTagValueNode) { - $tokens->rollback(); - break; - } - if ($child->value instanceof Ast\PhpDoc\InvalidTagValueNode) { - $tokens->rollback(); - $tokens->pushSavePoint(); - $tokens->next(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $tokens->rollback(); - break; - } - $tokens->rollback(); - return trim($text . $this->parseText($tokens)->text, " \t"); - } - } - $tokens->rollback(); - return trim($text . $this->parseText($tokens)->text, " \t"); - } - break; - } - if ($this->textBetweenTagsBelongsToDescription) { - if (!$savepoint) { - $tokens->pushSavePoint(); - $savepoint = \true; - } elseif ($tmpText !== '') { - $tokens->dropSavePoint(); - $tokens->pushSavePoint(); - } - } - $tokens->pushSavePoint(); - $tokens->next(); - // if we're at EOL, check what's next - // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop - if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { - $tokens->rollback(); - break; - } - // otherwise if the next is text, continue building the description string - $tokens->dropSavePoint(); - $text .= $tokens->getDetectedNewline() ?? "\n"; - } - if ($savepoint) { - $tokens->rollback(); - $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); - } - return trim($text, " \t"); - } - public function parseTag(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagNode - { - $tag = $tokens->currentTokenValue(); - $tokens->next(); - $value = $this->parseTagValue($tokens, $tag); - return new Ast\PhpDoc\PhpDocTagNode($tag, $value); - } - public function parseTagValue(TokenIterator $tokens, string $tag) : Ast\PhpDoc\PhpDocTagValueNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - try { - $tokens->pushSavePoint(); - switch ($tag) { - case '@param': - case '@phpstan-param': - case '@psalm-param': - $tagValue = $this->parseParamTagValue($tokens); - break; - case '@var': - case '@phpstan-var': - case '@psalm-var': - $tagValue = $this->parseVarTagValue($tokens); - break; - case '@return': - case '@phpstan-return': - case '@psalm-return': - $tagValue = $this->parseReturnTagValue($tokens); - break; - case '@throws': - case '@phpstan-throws': - $tagValue = $this->parseThrowsTagValue($tokens); - break; - case '@mixin': - $tagValue = $this->parseMixinTagValue($tokens); - break; - case '@deprecated': - $tagValue = $this->parseDeprecatedTagValue($tokens); - break; - case '@property': - case '@property-read': - case '@property-write': - case '@phpstan-property': - case '@phpstan-property-read': - case '@phpstan-property-write': - case '@psalm-property': - case '@psalm-property-read': - case '@psalm-property-write': - $tagValue = $this->parsePropertyTagValue($tokens); - break; - case '@method': - case '@phpstan-method': - case '@psalm-method': - $tagValue = $this->parseMethodTagValue($tokens); - break; - case '@template': - case '@phpstan-template': - case '@psalm-template': - case '@template-covariant': - case '@phpstan-template-covariant': - case '@psalm-template-covariant': - case '@template-contravariant': - case '@phpstan-template-contravariant': - case '@psalm-template-contravariant': - $tagValue = $this->parseTemplateTagValue($tokens, \true); - break; - case '@extends': - case '@phpstan-extends': - case '@template-extends': - $tagValue = $this->parseExtendsTagValue('@extends', $tokens); - break; - case '@implements': - case '@phpstan-implements': - case '@template-implements': - $tagValue = $this->parseExtendsTagValue('@implements', $tokens); - break; - case '@use': - case '@phpstan-use': - case '@template-use': - $tagValue = $this->parseExtendsTagValue('@use', $tokens); - break; - case '@phpstan-type': - case '@psalm-type': - $tagValue = $this->parseTypeAliasTagValue($tokens); - break; - case '@phpstan-import-type': - case '@psalm-import-type': - $tagValue = $this->parseTypeAliasImportTagValue($tokens); - break; - case '@phpstan-assert': - case '@phpstan-assert-if-true': - case '@phpstan-assert-if-false': - case '@psalm-assert': - case '@psalm-assert-if-true': - case '@psalm-assert-if-false': - $tagValue = $this->parseAssertTagValue($tokens); - break; - case '@phpstan-this-out': - case '@phpstan-self-out': - case '@psalm-this-out': - case '@psalm-self-out': - $tagValue = $this->parseSelfOutTagValue($tokens); - break; - case '@param-out': - case '@phpstan-param-out': - case '@psalm-param-out': - $tagValue = $this->parseParamOutTagValue($tokens); - break; - default: - if ($this->parseDoctrineAnnotations) { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $tagValue = $this->parseDoctrineTagValue($tokens, $tag); - } else { - $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescriptionAfterDoctrineTag($tokens)); - } - break; - } - $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescription($tokens)); - break; - } - $tokens->dropSavePoint(); - } catch (ParserException $e) { - $tokens->rollback(); - $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens), $e); - } - return $this->enrichWithAttributes($tokens, $tagValue, $startLine, $startIndex); - } - private function parseDoctrineTagValue(TokenIterator $tokens, string $tag) : Ast\PhpDoc\PhpDocTagValueNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - return new Doctrine\DoctrineTagValueNode($this->enrichWithAttributes($tokens, new Doctrine\DoctrineAnnotation($tag, $this->parseDoctrineArguments($tokens, \false)), $startLine, $startIndex), $this->parseOptionalDescriptionAfterDoctrineTag($tokens)); - } - /** - * @return list - */ - private function parseDoctrineArguments(TokenIterator $tokens, bool $deep) : array - { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - return []; - } - if (!$deep) { - $tokens->addEndOfLineToSkippedTokens(); - } - $arguments = []; - try { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); - do { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { - break; - } - $arguments[] = $this->parseDoctrineArgument($tokens); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - } finally { - if (!$deep) { - $tokens->removeEndOfLineFromSkippedTokens(); - } - } - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - return $arguments; - } - private function parseDoctrineArgument(TokenIterator $tokens) : Doctrine\DoctrineArgument - { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex); - } - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - try { - $tokens->pushSavePoint(); - $currentValue = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $key = $this->enrichWithAttributes($tokens, new IdentifierTypeNode($currentValue), $startLine, $startIndex); - $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); - $value = $this->parseDoctrineArgumentValue($tokens); - $tokens->dropSavePoint(); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArgument($key, $value), $startLine, $startIndex); - } catch (ParserException $e) { - $tokens->rollback(); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex); - } - } - /** - * @return DoctrineValueType - */ - private function parseDoctrineArgumentValue(TokenIterator $tokens) - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG)) { - $name = $tokens->currentTokenValue(); - $tokens->next(); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineAnnotation($name, $this->parseDoctrineArguments($tokens, \true)), $startLine, $startIndex); - } - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET)) { - $items = []; - do { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { - break; - } - $items[] = $this->parseDoctrineArrayItem($tokens); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArray($items), $startLine, $startIndex); - } - $currentTokenValue = $tokens->currentTokenValue(); - $tokens->pushSavePoint(); - // because of ConstFetchNode - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { - $identifier = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { - $tokens->dropSavePoint(); - return $identifier; - } - $tokens->rollback(); - // because of ConstFetchNode - } else { - $tokens->dropSavePoint(); - // because of ConstFetchNode - } - $currentTokenValue = $tokens->currentTokenValue(); - $currentTokenType = $tokens->currentTokenType(); - $currentTokenOffset = $tokens->currentTokenOffset(); - $currentTokenLine = $tokens->currentTokenLine(); - try { - $constExpr = $this->doctrineConstantExprParser->parse($tokens, \true); - if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - return $constExpr; - } catch (LogicException $e) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - } - private function parseDoctrineArrayItem(TokenIterator $tokens) : Doctrine\DoctrineArrayItem - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - try { - $tokens->pushSavePoint(); - $key = $this->parseDoctrineArrayKey($tokens); - if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { - if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COLON)) { - $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); - // will throw exception - } - } - $value = $this->parseDoctrineArgumentValue($tokens); - $tokens->dropSavePoint(); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArrayItem($key, $value), $startLine, $startIndex); - } catch (ParserException $e) { - $tokens->rollback(); - return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArrayItem(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex); - } - } - /** - * @return ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|ConstFetchNode - */ - private function parseDoctrineArrayKey(TokenIterator $tokens) - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { - $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); - $tokens->next(); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { - $key = new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($tokens->currentTokenValue())); - $tokens->next(); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - $value = $tokens->currentTokenValue(); - $tokens->next(); - $key = $this->doctrineConstantExprParser->parseDoctrineString($value, $tokens); - } else { - $currentTokenValue = $tokens->currentTokenValue(); - $tokens->pushSavePoint(); - // because of ConstFetchNode - if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { - $tokens->dropSavePoint(); - throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); - } - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { - $tokens->dropSavePoint(); - return $this->enrichWithAttributes($tokens, new IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); - } - $tokens->rollback(); - $constExpr = $this->doctrineConstantExprParser->parse($tokens, \true); - if (!$constExpr instanceof Ast\ConstExpr\ConstFetchNode) { - throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); - } - return $constExpr; - } - return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); - } - /** - * @return Ast\PhpDoc\ParamTagValueNode|Ast\PhpDoc\TypelessParamTagValueNode - */ - private function parseParamTagValue(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagValueNode - { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE, Lexer::TOKEN_VARIADIC, Lexer::TOKEN_VARIABLE)) { - $type = null; - } else { - $type = $this->typeParser->parse($tokens); - } - $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); - $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); - $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); - if ($type !== null) { - return new Ast\PhpDoc\ParamTagValueNode($type, $isVariadic, $parameterName, $description, $isReference); - } - return new Ast\PhpDoc\TypelessParamTagValueNode($isVariadic, $parameterName, $description, $isReference); - } - private function parseVarTagValue(TokenIterator $tokens) : Ast\PhpDoc\VarTagValueNode - { - $type = $this->typeParser->parse($tokens); - $variableName = $this->parseOptionalVariableName($tokens); - $description = $this->parseOptionalDescription($tokens, $variableName === ''); - return new Ast\PhpDoc\VarTagValueNode($type, $variableName, $description); - } - private function parseReturnTagValue(TokenIterator $tokens) : Ast\PhpDoc\ReturnTagValueNode - { - $type = $this->typeParser->parse($tokens); - $description = $this->parseOptionalDescription($tokens, \true); - return new Ast\PhpDoc\ReturnTagValueNode($type, $description); - } - private function parseThrowsTagValue(TokenIterator $tokens) : Ast\PhpDoc\ThrowsTagValueNode - { - $type = $this->typeParser->parse($tokens); - $description = $this->parseOptionalDescription($tokens, \true); - return new Ast\PhpDoc\ThrowsTagValueNode($type, $description); - } - private function parseMixinTagValue(TokenIterator $tokens) : Ast\PhpDoc\MixinTagValueNode - { - $type = $this->typeParser->parse($tokens); - $description = $this->parseOptionalDescription($tokens, \true); - return new Ast\PhpDoc\MixinTagValueNode($type, $description); - } - private function parseDeprecatedTagValue(TokenIterator $tokens) : Ast\PhpDoc\DeprecatedTagValueNode - { - $description = $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\DeprecatedTagValueNode($description); - } - private function parsePropertyTagValue(TokenIterator $tokens) : Ast\PhpDoc\PropertyTagValueNode - { - $type = $this->typeParser->parse($tokens); - $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\PropertyTagValueNode($type, $parameterName, $description); - } - private function parseMethodTagValue(TokenIterator $tokens) : Ast\PhpDoc\MethodTagValueNode - { - $isStatic = $tokens->tryConsumeTokenValue('static'); - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $returnTypeOrMethodName = $this->typeParser->parse($tokens); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { - $returnType = $returnTypeOrMethodName; - $methodName = $tokens->currentTokenValue(); - $tokens->next(); - } elseif ($returnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode) { - $returnType = $isStatic ? $this->typeParser->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('static'), $startLine, $startIndex) : null; - $methodName = $returnTypeOrMethodName->name; - $isStatic = \false; - } else { - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - // will throw exception - exit; - } - $templateTypes = []; - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { - do { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $templateTypes[] = $this->enrichWithAttributes($tokens, $this->parseTemplateTagValue($tokens, \false), $startLine, $startIndex); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); - } - $parameters = []; - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { - $parameters[] = $this->parseMethodTagValueParameter($tokens); - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $parameters[] = $this->parseMethodTagValueParameter($tokens); - } - } - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - $description = $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\MethodTagValueNode($isStatic, $returnType, $methodName, $parameters, $description, $templateTypes); - } - private function parseMethodTagValueParameter(TokenIterator $tokens) : Ast\PhpDoc\MethodTagValueParameterNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - switch ($tokens->currentTokenType()) { - case Lexer::TOKEN_IDENTIFIER: - case Lexer::TOKEN_OPEN_PARENTHESES: - case Lexer::TOKEN_NULLABLE: - $parameterType = $this->typeParser->parse($tokens); - break; - default: - $parameterType = null; - } - $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); - $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); - $parameterName = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { - $defaultValue = $this->constantExprParser->parse($tokens); - } else { - $defaultValue = null; - } - return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue), $startLine, $startIndex); - } - private function parseTemplateTagValue(TokenIterator $tokens, bool $parseDescription) : Ast\PhpDoc\TemplateTagValueNode - { - $name = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - if ($tokens->tryConsumeTokenValue('of') || $tokens->tryConsumeTokenValue('as')) { - $bound = $this->typeParser->parse($tokens); - } else { - $bound = null; - } - if ($tokens->tryConsumeTokenValue('=')) { - $default = $this->typeParser->parse($tokens); - } else { - $default = null; - } - if ($parseDescription) { - $description = $this->parseOptionalDescription($tokens); - } else { - $description = ''; - } - return new Ast\PhpDoc\TemplateTagValueNode($name, $bound, $description, $default); - } - private function parseExtendsTagValue(string $tagName, TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagValueNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $type = $this->typeParser->parseGeneric($tokens, $this->typeParser->enrichWithAttributes($tokens, $baseType, $startLine, $startIndex)); - $description = $this->parseOptionalDescription($tokens); - switch ($tagName) { - case '@extends': - return new Ast\PhpDoc\ExtendsTagValueNode($type, $description); - case '@implements': - return new Ast\PhpDoc\ImplementsTagValueNode($type, $description); - case '@use': - return new Ast\PhpDoc\UsesTagValueNode($type, $description); - } - throw new ShouldNotHappenException(); - } - private function parseTypeAliasTagValue(TokenIterator $tokens) : Ast\PhpDoc\TypeAliasTagValueNode - { - $alias = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - // support psalm-type syntax - $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); - if ($this->preserveTypeAliasesWithInvalidTypes) { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - try { - $type = $this->typeParser->parse($tokens); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_PHPDOC_EOL, null, $tokens->currentTokenLine()); - } - } - return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); - } catch (ParserException $e) { - $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex)); - } - } - $type = $this->typeParser->parse($tokens); - return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); - } - private function parseTypeAliasImportTagValue(TokenIterator $tokens) : Ast\PhpDoc\TypeAliasImportTagValueNode - { - $importedAlias = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'from'); - $identifierStartLine = $tokens->currentTokenLine(); - $identifierStartIndex = $tokens->currentTokenIndex(); - $importedFrom = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $importedFromType = $this->enrichWithAttributes($tokens, new IdentifierTypeNode($importedFrom), $identifierStartLine, $identifierStartIndex); - $importedAs = null; - if ($tokens->tryConsumeTokenValue('as')) { - $importedAs = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - } - return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, $importedFromType, $importedAs); - } - /** - * @return Ast\PhpDoc\AssertTagValueNode|Ast\PhpDoc\AssertTagPropertyValueNode|Ast\PhpDoc\AssertTagMethodValueNode - */ - private function parseAssertTagValue(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagValueNode - { - $isNegated = $tokens->tryConsumeTokenType(Lexer::TOKEN_NEGATED); - $isEquality = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); - $type = $this->typeParser->parse($tokens); - $parameter = $this->parseAssertParameter($tokens); - $description = $this->parseOptionalDescription($tokens); - if (array_key_exists('method', $parameter)) { - return new Ast\PhpDoc\AssertTagMethodValueNode($type, $parameter['parameter'], $parameter['method'], $isNegated, $description, $isEquality); - } elseif (array_key_exists('property', $parameter)) { - return new Ast\PhpDoc\AssertTagPropertyValueNode($type, $parameter['parameter'], $parameter['property'], $isNegated, $description, $isEquality); - } - return new Ast\PhpDoc\AssertTagValueNode($type, $parameter['parameter'], $isNegated, $description, $isEquality); - } - /** - * @return array{parameter: string}|array{parameter: string, property: string}|array{parameter: string, method: string} - */ - private function parseAssertParameter(TokenIterator $tokens) : array - { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { - $parameter = '$this'; - $tokens->next(); - } else { - $parameter = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_ARROW)) { - $tokens->consumeTokenType(Lexer::TOKEN_ARROW); - $propertyOrMethod = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - return ['parameter' => $parameter, 'method' => $propertyOrMethod]; - } - return ['parameter' => $parameter, 'property' => $propertyOrMethod]; - } - return ['parameter' => $parameter]; - } - private function parseSelfOutTagValue(TokenIterator $tokens) : Ast\PhpDoc\SelfOutTagValueNode - { - $type = $this->typeParser->parse($tokens); - $description = $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\SelfOutTagValueNode($type, $description); - } - private function parseParamOutTagValue(TokenIterator $tokens) : Ast\PhpDoc\ParamOutTagValueNode - { - $type = $this->typeParser->parse($tokens); - $parameterName = $this->parseRequiredVariableName($tokens); - $description = $this->parseOptionalDescription($tokens); - return new Ast\PhpDoc\ParamOutTagValueNode($type, $parameterName, $description); - } - private function parseOptionalVariableName(TokenIterator $tokens) : string - { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { - $parameterName = $tokens->currentTokenValue(); - $tokens->next(); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { - $parameterName = '$this'; - $tokens->next(); - } else { - $parameterName = ''; - } - return $parameterName; - } - private function parseRequiredVariableName(TokenIterator $tokens) : string - { - $parameterName = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); - return $parameterName; - } - private function parseOptionalDescription(TokenIterator $tokens, bool $limitStartToken = \false) : string - { - if ($limitStartToken) { - foreach (self::DISALLOWED_DESCRIPTION_START_TOKENS as $disallowedStartToken) { - if (!$tokens->isCurrentTokenType($disallowedStartToken)) { - continue; - } - $tokens->consumeTokenType(Lexer::TOKEN_OTHER); - // will throw exception - } - if ($this->requireWhitespaceBeforeDescription && !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END) && !$tokens->isPrecededByHorizontalWhitespace()) { - $tokens->consumeTokenType(Lexer::TOKEN_HORIZONTAL_WS); - // will throw exception - } - } - return $this->parseText($tokens)->text; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php b/dependencies/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php deleted file mode 100644 index 65d3351..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php +++ /dev/null @@ -1,63 +0,0 @@ - '\\', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; - public static function unescapeString(string $string) : string - { - $quote = $string[0]; - if ($quote === '\'') { - return str_replace(['\\\\', '\\\''], ['\\', '\''], substr($string, 1, -1)); - } - return self::parseEscapeSequences(substr($string, 1, -1), '"'); - } - /** - * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L90-L130 - */ - private static function parseEscapeSequences(string $str, string $quote) : string - { - $str = str_replace('\\' . $quote, $quote, $str); - return preg_replace_callback('~\\\\([\\\\nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\\{([0-9a-fA-F]+)\\})~', static function ($matches) { - $str = $matches[1]; - if (isset(self::REPLACEMENTS[$str])) { - return self::REPLACEMENTS[$str]; - } - if ($str[0] === 'x' || $str[0] === 'X') { - return chr((int) hexdec(substr($str, 1))); - } - if ($str[0] === 'u') { - return self::codePointToUtf8((int) hexdec($matches[2])); - } - return chr((int) octdec($str)); - }, $str); - } - /** - * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L132-L154 - */ - private static function codePointToUtf8(int $num) : string - { - if ($num <= 0x7f) { - return chr($num); - } - if ($num <= 0x7ff) { - return chr(($num >> 6) + 0xc0) . chr(($num & 0x3f) + 0x80); - } - if ($num <= 0xffff) { - return chr(($num >> 12) + 0xe0) . chr(($num >> 6 & 0x3f) + 0x80) . chr(($num & 0x3f) + 0x80); - } - if ($num <= 0x1fffff) { - return chr(($num >> 18) + 0xf0) . chr(($num >> 12 & 0x3f) + 0x80) . chr(($num >> 6 & 0x3f) + 0x80) . chr(($num & 0x3f) + 0x80); - } - // Invalid UTF-8 codepoint escape sequence: Codepoint too large - return "�"; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Parser/TokenIterator.php b/dependencies/phpstan/phpdoc-parser/src/Parser/TokenIterator.php deleted file mode 100644 index d239529..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Parser/TokenIterator.php +++ /dev/null @@ -1,287 +0,0 @@ - */ - private $tokens; - /** @var int */ - private $index; - /** @var int[] */ - private $savePoints = []; - /** @var list */ - private $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; - /** @var string|null */ - private $newline = null; - /** - * @param list $tokens - */ - public function __construct(array $tokens, int $index = 0) - { - $this->tokens = $tokens; - $this->index = $index; - $this->skipIrrelevantTokens(); - } - /** - * @return list - */ - public function getTokens() : array - { - return $this->tokens; - } - public function getContentBetween(int $startPos, int $endPos) : string - { - if ($startPos < 0 || $endPos > count($this->tokens)) { - throw new LogicException(); - } - $content = ''; - for ($i = $startPos; $i < $endPos; $i++) { - $content .= $this->tokens[$i][Lexer::VALUE_OFFSET]; - } - return $content; - } - public function getTokenCount() : int - { - return count($this->tokens); - } - public function currentTokenValue() : string - { - return $this->tokens[$this->index][Lexer::VALUE_OFFSET]; - } - public function currentTokenType() : int - { - return $this->tokens[$this->index][Lexer::TYPE_OFFSET]; - } - public function currentTokenOffset() : int - { - $offset = 0; - for ($i = 0; $i < $this->index; $i++) { - $offset += strlen($this->tokens[$i][Lexer::VALUE_OFFSET]); - } - return $offset; - } - public function currentTokenLine() : int - { - return $this->tokens[$this->index][Lexer::LINE_OFFSET]; - } - public function currentTokenIndex() : int - { - return $this->index; - } - public function endIndexOfLastRelevantToken() : int - { - $endIndex = $this->currentTokenIndex(); - $endIndex--; - while (in_array($this->tokens[$endIndex][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, \true)) { - if (!isset($this->tokens[$endIndex - 1])) { - break; - } - $endIndex--; - } - return $endIndex; - } - public function isCurrentTokenValue(string $tokenValue) : bool - { - return $this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue; - } - public function isCurrentTokenType(int ...$tokenType) : bool - { - return in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, \true); - } - public function isPrecededByHorizontalWhitespace() : bool - { - return ($this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] ?? -1) === Lexer::TOKEN_HORIZONTAL_WS; - } - /** - * @throws ParserException - */ - public function consumeTokenType(int $tokenType) : void - { - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { - $this->throwError($tokenType); - } - if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { - if ($this->newline === null) { - $this->detectNewline(); - } - } - $this->index++; - $this->skipIrrelevantTokens(); - } - /** - * @throws ParserException - */ - public function consumeTokenValue(int $tokenType, string $tokenValue) : void - { - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { - $this->throwError($tokenType, $tokenValue); - } - $this->index++; - $this->skipIrrelevantTokens(); - } - /** @phpstan-impure */ - public function tryConsumeTokenValue(string $tokenValue) : bool - { - if ($this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { - return \false; - } - $this->index++; - $this->skipIrrelevantTokens(); - return \true; - } - /** @phpstan-impure */ - public function tryConsumeTokenType(int $tokenType) : bool - { - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { - return \false; - } - if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { - if ($this->newline === null) { - $this->detectNewline(); - } - } - $this->index++; - $this->skipIrrelevantTokens(); - return \true; - } - private function detectNewline() : void - { - $value = $this->currentTokenValue(); - if (substr($value, 0, 2) === "\r\n") { - $this->newline = "\r\n"; - } elseif (substr($value, 0, 1) === "\n") { - $this->newline = "\n"; - } - } - public function getSkippedHorizontalWhiteSpaceIfAny() : string - { - if ($this->index > 0 && $this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { - return $this->tokens[$this->index - 1][Lexer::VALUE_OFFSET]; - } - return ''; - } - /** @phpstan-impure */ - public function joinUntil(int ...$tokenType) : string - { - $s = ''; - while (!in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, \true)) { - $s .= $this->tokens[$this->index++][Lexer::VALUE_OFFSET]; - } - return $s; - } - public function next() : void - { - $this->index++; - $this->skipIrrelevantTokens(); - } - private function skipIrrelevantTokens() : void - { - if (!isset($this->tokens[$this->index])) { - return; - } - while (in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, \true)) { - if (!isset($this->tokens[$this->index + 1])) { - break; - } - $this->index++; - } - } - public function addEndOfLineToSkippedTokens() : void - { - $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL]; - } - public function removeEndOfLineFromSkippedTokens() : void - { - $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; - } - /** @phpstan-impure */ - public function forwardToTheEnd() : void - { - $lastToken = count($this->tokens) - 1; - $this->index = $lastToken; - } - public function pushSavePoint() : void - { - $this->savePoints[] = $this->index; - } - public function dropSavePoint() : void - { - array_pop($this->savePoints); - } - public function rollback() : void - { - $index = array_pop($this->savePoints); - assert($index !== null); - $this->index = $index; - } - /** - * @throws ParserException - */ - private function throwError(int $expectedTokenType, ?string $expectedTokenValue = null) : void - { - throw new ParserException($this->currentTokenValue(), $this->currentTokenType(), $this->currentTokenOffset(), $expectedTokenType, $expectedTokenValue, $this->currentTokenLine()); - } - /** - * Check whether the position is directly preceded by a certain token type. - * - * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped - */ - public function hasTokenImmediatelyBefore(int $pos, int $expectedTokenType) : bool - { - $tokens = $this->tokens; - $pos--; - for (; $pos >= 0; $pos--) { - $token = $tokens[$pos]; - $type = $token[Lexer::TYPE_OFFSET]; - if ($type === $expectedTokenType) { - return \true; - } - if (!in_array($type, [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL], \true)) { - break; - } - } - return \false; - } - /** - * Check whether the position is directly followed by a certain token type. - * - * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped - */ - public function hasTokenImmediatelyAfter(int $pos, int $expectedTokenType) : bool - { - $tokens = $this->tokens; - $pos++; - for ($c = count($tokens); $pos < $c; $pos++) { - $token = $tokens[$pos]; - $type = $token[Lexer::TYPE_OFFSET]; - if ($type === $expectedTokenType) { - return \true; - } - if (!in_array($type, [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL], \true)) { - break; - } - } - return \false; - } - public function getDetectedNewline() : ?string - { - return $this->newline; - } - /** - * Whether the given position is immediately surrounded by parenthesis. - */ - public function hasParentheses(int $startPos, int $endPos) : bool - { - return $this->hasTokenImmediatelyBefore($startPos, Lexer::TOKEN_OPEN_PARENTHESES) && $this->hasTokenImmediatelyAfter($endPos, Lexer::TOKEN_CLOSE_PARENTHESES); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Parser/TypeParser.php b/dependencies/phpstan/phpdoc-parser/src/Parser/TypeParser.php deleted file mode 100644 index bee2727..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Parser/TypeParser.php +++ /dev/null @@ -1,624 +0,0 @@ -constExprParser = $constExprParser; - $this->quoteAwareConstExprString = $quoteAwareConstExprString; - $this->useLinesAttributes = $usedAttributes['lines'] ?? \false; - $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; - } - /** @phpstan-impure */ - public function parse(TokenIterator $tokens) : Ast\Type\TypeNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { - $type = $this->parseNullable($tokens); - } else { - $type = $this->parseAtomic($tokens); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { - $type = $this->parseUnion($tokens, $type); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { - $type = $this->parseIntersection($tokens, $type); - } - } - return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - /** - * @internal - * @template T of Ast\Node - * @param T $type - * @return T - */ - public function enrichWithAttributes(TokenIterator $tokens, Ast\Node $type, int $startLine, int $startIndex) : Ast\Node - { - if ($this->useLinesAttributes) { - $type->setAttribute(Ast\Attribute::START_LINE, $startLine); - $type->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); - } - if ($this->useIndexAttributes) { - $type->setAttribute(Ast\Attribute::START_INDEX, $startIndex); - $type->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); - } - return $type; - } - /** @phpstan-impure */ - private function subParse(TokenIterator $tokens) : Ast\Type\TypeNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { - $type = $this->parseNullable($tokens); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { - $type = $this->parseConditionalForParameter($tokens, $tokens->currentTokenValue()); - } else { - $type = $this->parseAtomic($tokens); - if ($tokens->isCurrentTokenValue('is')) { - $type = $this->parseConditional($tokens, $type); - } else { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { - $type = $this->subParseUnion($tokens, $type); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { - $type = $this->subParseIntersection($tokens, $type); - } - } - } - return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - /** @phpstan-impure */ - private function parseAtomic(TokenIterator $tokens) : Ast\Type\TypeNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $type = $this->subParse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } - return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { - $type = $this->enrichWithAttributes($tokens, new Ast\Type\ThisTypeNode(), $startLine, $startIndex); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } - return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - $currentTokenValue = $tokens->currentTokenValue(); - $tokens->pushSavePoint(); - // because of ConstFetchNode - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { - $type = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { - $tokens->dropSavePoint(); - // because of ConstFetchNode - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { - $tokens->pushSavePoint(); - $isHtml = $this->isHtml($tokens); - $tokens->rollback(); - if ($isHtml) { - return $type; - } - $type = $this->parseGeneric($tokens, $type); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $type = $this->tryParseCallable($tokens, $type); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } elseif (in_array($type->name, ['array', 'list', 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { - if ($type->name === 'object') { - $type = $this->parseObjectShape($tokens); - } else { - $type = $this->parseArrayShape($tokens, $type, $type->name); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } - } - return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } else { - $tokens->rollback(); - // because of ConstFetchNode - } - } else { - $tokens->dropSavePoint(); - // because of ConstFetchNode - } - $currentTokenValue = $tokens->currentTokenValue(); - $currentTokenType = $tokens->currentTokenType(); - $currentTokenOffset = $tokens->currentTokenOffset(); - $currentTokenLine = $tokens->currentTokenLine(); - if ($this->constExprParser === null) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - try { - $constExpr = $this->constExprParser->parse($tokens, \true); - if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - return $this->enrichWithAttributes($tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex); - } catch (LogicException $e) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - } - /** @phpstan-impure */ - private function parseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode - { - $types = [$type]; - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { - $types[] = $this->parseAtomic($tokens); - } - return new Ast\Type\UnionTypeNode($types); - } - /** @phpstan-impure */ - private function subParseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode - { - $types = [$type]; - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $types[] = $this->parseAtomic($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } - return new Ast\Type\UnionTypeNode($types); - } - /** @phpstan-impure */ - private function parseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode - { - $types = [$type]; - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { - $types[] = $this->parseAtomic($tokens); - } - return new Ast\Type\IntersectionTypeNode($types); - } - /** @phpstan-impure */ - private function subParseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode - { - $types = [$type]; - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $types[] = $this->parseAtomic($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } - return new Ast\Type\IntersectionTypeNode($types); - } - /** @phpstan-impure */ - private function parseConditional(TokenIterator $tokens, Ast\Type\TypeNode $subjectType) : Ast\Type\TypeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $negated = \false; - if ($tokens->isCurrentTokenValue('not')) { - $negated = \true; - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - } - $targetType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $ifType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $elseType = $this->subParse($tokens); - return new Ast\Type\ConditionalTypeNode($subjectType, $targetType, $ifType, $elseType, $negated); - } - /** @phpstan-impure */ - private function parseConditionalForParameter(TokenIterator $tokens, string $parameterName) : Ast\Type\TypeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); - $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'is'); - $negated = \false; - if ($tokens->isCurrentTokenValue('not')) { - $negated = \true; - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - } - $targetType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $ifType = $this->parse($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $elseType = $this->subParse($tokens); - return new Ast\Type\ConditionalTypeForParameterNode($parameterName, $targetType, $ifType, $elseType, $negated); - } - /** @phpstan-impure */ - private function parseNullable(TokenIterator $tokens) : Ast\Type\TypeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); - $type = $this->parseAtomic($tokens); - return new Ast\Type\NullableTypeNode($type); - } - /** @phpstan-impure */ - public function isHtml(TokenIterator $tokens) : bool - { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { - return \false; - } - $htmlTagName = $tokens->currentTokenValue(); - $tokens->next(); - if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { - return \false; - } - while (!$tokens->isCurrentTokenType(Lexer::TOKEN_END)) { - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET) && strpos($tokens->currentTokenValue(), '/' . $htmlTagName . '>') !== \false) { - return \true; - } - $tokens->next(); - } - return \false; - } - /** @phpstan-impure */ - public function parseGeneric(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $baseType) : Ast\Type\GenericTypeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); - $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); - $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); - $genericTypes = []; - $variances = []; - $isFirst = \true; - while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - // trailing comma case - if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { - break; - } - $isFirst = \false; - [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } - $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); - if ($startLine !== null && $startIndex !== null) { - $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); - return $type; - } - /** - * @phpstan-impure - * @return array{Ast\Type\TypeNode, Ast\Type\GenericTypeNode::VARIANCE_*} - */ - public function parseGenericTypeArgument(TokenIterator $tokens) : array - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { - return [$this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('mixed'), $startLine, $startIndex), Ast\Type\GenericTypeNode::VARIANCE_BIVARIANT]; - } - if ($tokens->tryConsumeTokenValue('contravariant')) { - $variance = Ast\Type\GenericTypeNode::VARIANCE_CONTRAVARIANT; - } elseif ($tokens->tryConsumeTokenValue('covariant')) { - $variance = Ast\Type\GenericTypeNode::VARIANCE_COVARIANT; - } else { - $variance = Ast\Type\GenericTypeNode::VARIANCE_INVARIANT; - } - $type = $this->parse($tokens); - return [$type, $variance]; - } - /** @phpstan-impure */ - private function parseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier) : Ast\Type\TypeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $parameters = []; - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { - $parameters[] = $this->parseCallableParameter($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { - break; - } - $parameters[] = $this->parseCallableParameter($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } - } - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $returnType = $this->enrichWithAttributes($tokens, $this->parseCallableReturnType($tokens), $startLine, $startIndex); - return new Ast\Type\CallableTypeNode($identifier, $parameters, $returnType); - } - /** @phpstan-impure */ - private function parseCallableParameter(TokenIterator $tokens) : Ast\Type\CallableTypeParameterNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $type = $this->parse($tokens); - $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); - $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { - $parameterName = $tokens->currentTokenValue(); - $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); - } else { - $parameterName = ''; - } - $isOptional = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); - return $this->enrichWithAttributes($tokens, new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional), $startLine, $startIndex); - } - /** @phpstan-impure */ - private function parseCallableReturnType(TokenIterator $tokens) : Ast\Type\TypeNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { - return $this->parseNullable($tokens); - } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $type = $this->subParse($tokens); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } - return $type; - } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { - $type = new Ast\Type\ThisTypeNode(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } - return $type; - } else { - $currentTokenValue = $tokens->currentTokenValue(); - $tokens->pushSavePoint(); - // because of ConstFetchNode - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { - $type = new Ast\Type\IdentifierTypeNode($currentTokenValue); - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { - $type = $this->parseGeneric($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } elseif (in_array($type->name, ['array', 'list', 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { - if ($type->name === 'object') { - $type = $this->parseObjectShape($tokens); - } else { - $type = $this->parseArrayShape($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex), $type->name); - } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } - } - return $type; - } else { - $tokens->rollback(); - // because of ConstFetchNode - } - } else { - $tokens->dropSavePoint(); - // because of ConstFetchNode - } - } - $currentTokenValue = $tokens->currentTokenValue(); - $currentTokenType = $tokens->currentTokenType(); - $currentTokenOffset = $tokens->currentTokenOffset(); - $currentTokenLine = $tokens->currentTokenLine(); - if ($this->constExprParser === null) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - try { - $constExpr = $this->constExprParser->parse($tokens, \true); - if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - $type = new Ast\Type\ConstTypeNode($constExpr); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); - } - return $type; - } catch (LogicException $e) { - throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); - } - } - /** @phpstan-impure */ - private function tryParseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier) : Ast\Type\TypeNode - { - try { - $tokens->pushSavePoint(); - $type = $this->parseCallable($tokens, $identifier); - $tokens->dropSavePoint(); - } catch (ParserException $e) { - $tokens->rollback(); - $type = $identifier; - } - return $type; - } - /** @phpstan-impure */ - private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode - { - $startLine = $type->getAttribute(Ast\Attribute::START_LINE); - $startIndex = $type->getAttribute(Ast\Attribute::START_INDEX); - try { - while ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $tokens->pushSavePoint(); - $canBeOffsetAccessType = !$tokens->isPrecededByHorizontalWhitespace(); - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET); - if ($canBeOffsetAccessType && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET)) { - $offset = $this->parse($tokens); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); - $tokens->dropSavePoint(); - $type = new Ast\Type\OffsetAccessTypeNode($type, $offset); - if ($startLine !== null && $startIndex !== null) { - $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - } else { - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); - $tokens->dropSavePoint(); - $type = new Ast\Type\ArrayTypeNode($type); - if ($startLine !== null && $startIndex !== null) { - $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - } - } - } catch (ParserException $e) { - $tokens->rollback(); - } - return $type; - } - /** - * @phpstan-impure - * @param Ast\Type\ArrayShapeNode::KIND_* $kind - */ - private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type, string $kind) : Ast\Type\ArrayShapeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); - $items = []; - $sealed = \true; - do { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { - return new Ast\Type\ArrayShapeNode($items, \true, $kind); - } - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC)) { - $sealed = \false; - $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA); - break; - } - $items[] = $this->parseArrayShapeItem($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); - return new Ast\Type\ArrayShapeNode($items, $sealed, $kind); - } - /** @phpstan-impure */ - private function parseArrayShapeItem(TokenIterator $tokens) : Ast\Type\ArrayShapeItemNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - try { - $tokens->pushSavePoint(); - $key = $this->parseArrayShapeKey($tokens); - $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); - $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $value = $this->parse($tokens); - $tokens->dropSavePoint(); - return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeItemNode($key, $optional, $value), $startLine, $startIndex); - } catch (ParserException $e) { - $tokens->rollback(); - $value = $this->parse($tokens); - return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeItemNode(null, \false, $value), $startLine, $startIndex); - } - } - /** - * @phpstan-impure - * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode - */ - private function parseArrayShapeKey(TokenIterator $tokens) - { - $startIndex = $tokens->currentTokenIndex(); - $startLine = $tokens->currentTokenLine(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { - $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); - $tokens->next(); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); - } - $tokens->next(); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); - } - $tokens->next(); - } else { - $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - } - return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); - } - /** - * @phpstan-impure - */ - private function parseObjectShape(TokenIterator $tokens) : Ast\Type\ObjectShapeNode - { - $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); - $items = []; - do { - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { - return new Ast\Type\ObjectShapeNode($items); - } - $items[] = $this->parseObjectShapeItem($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); - return new Ast\Type\ObjectShapeNode($items); - } - /** @phpstan-impure */ - private function parseObjectShapeItem(TokenIterator $tokens) : Ast\Type\ObjectShapeItemNode - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - $key = $this->parseObjectShapeKey($tokens); - $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); - $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $value = $this->parse($tokens); - return $this->enrichWithAttributes($tokens, new Ast\Type\ObjectShapeItemNode($key, $optional, $value), $startLine, $startIndex); - } - /** - * @phpstan-impure - * @return Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode - */ - private function parseObjectShapeKey(TokenIterator $tokens) - { - $startLine = $tokens->currentTokenLine(); - $startIndex = $tokens->currentTokenIndex(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); - } - $tokens->next(); - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - if ($this->quoteAwareConstExprString) { - $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); - } else { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); - } - $tokens->next(); - } else { - $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - } - return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Printer/DiffElem.php b/dependencies/phpstan/phpdoc-parser/src/Printer/DiffElem.php deleted file mode 100644 index b9d92bd..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Printer/DiffElem.php +++ /dev/null @@ -1,39 +0,0 @@ -type = $type; - $this->old = $old; - $this->new = $new; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Printer/Differ.php b/dependencies/phpstan/phpdoc-parser/src/Printer/Differ.php deleted file mode 100644 index 55f1e82..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Printer/Differ.php +++ /dev/null @@ -1,173 +0,0 @@ -isEqual = $isEqual; - } - /** - * Calculate diff (edit script) from $old to $new. - * - * @param T[] $old Original array - * @param T[] $new New array - * - * @return DiffElem[] Diff (edit script) - */ - public function diff(array $old, array $new) : array - { - [$trace, $x, $y] = $this->calculateTrace($old, $new); - return $this->extractDiff($trace, $x, $y, $old, $new); - } - /** - * Calculate diff, including "replace" operations. - * - * If a sequence of remove operations is followed by the same number of add operations, these - * will be coalesced into replace operations. - * - * @param T[] $old Original array - * @param T[] $new New array - * - * @return DiffElem[] Diff (edit script), including replace operations - */ - public function diffWithReplacements(array $old, array $new) : array - { - return $this->coalesceReplacements($this->diff($old, $new)); - } - /** - * @param T[] $old - * @param T[] $new - * @return array{array>, int, int} - */ - private function calculateTrace(array $old, array $new) : array - { - $n = count($old); - $m = count($new); - $max = $n + $m; - $v = [1 => 0]; - $trace = []; - for ($d = 0; $d <= $max; $d++) { - $trace[] = $v; - for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { - $x = $v[$k + 1]; - } else { - $x = $v[$k - 1] + 1; - } - $y = $x - $k; - while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { - $x++; - $y++; - } - $v[$k] = $x; - if ($x >= $n && $y >= $m) { - return [$trace, $x, $y]; - } - } - } - throw new Exception('Should not happen'); - } - /** - * @param array> $trace - * @param T[] $old - * @param T[] $new - * @return DiffElem[] - */ - private function extractDiff(array $trace, int $x, int $y, array $old, array $new) : array - { - $result = []; - for ($d = count($trace) - 1; $d >= 0; $d--) { - $v = $trace[$d]; - $k = $x - $y; - if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { - $prevK = $k + 1; - } else { - $prevK = $k - 1; - } - $prevX = $v[$prevK]; - $prevY = $prevX - $prevK; - while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); - $x--; - $y--; - } - if ($d === 0) { - break; - } - while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); - $x--; - } - while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); - $y--; - } - } - return array_reverse($result); - } - /** - * Coalesce equal-length sequences of remove+add into a replace operation. - * - * @param DiffElem[] $diff - * @return DiffElem[] - */ - private function coalesceReplacements(array $diff) : array - { - $newDiff = []; - $c = count($diff); - for ($i = 0; $i < $c; $i++) { - $diffType = $diff[$i]->type; - if ($diffType !== DiffElem::TYPE_REMOVE) { - $newDiff[] = $diff[$i]; - continue; - } - $j = $i; - while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { - $j++; - } - $k = $j; - while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { - $k++; - } - if ($j - $i === $k - $j) { - $len = $j - $i; - for ($n = 0; $n < $len; $n++) { - $newDiff[] = new DiffElem(DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new); - } - } else { - for (; $i < $k; $i++) { - $newDiff[] = $diff[$i]; - } - } - $i = $k - 1; - } - return $newDiff; - } -} diff --git a/dependencies/phpstan/phpdoc-parser/src/Printer/Printer.php b/dependencies/phpstan/phpdoc-parser/src/Printer/Printer.php deleted file mode 100644 index 191dce8..0000000 --- a/dependencies/phpstan/phpdoc-parser/src/Printer/Printer.php +++ /dev/null @@ -1,633 +0,0 @@ - */ - private $differ; - /** - * Map From "{$class}->{$subNode}" to string that should be inserted - * between elements of this list subnode - * - * @var array - */ - private $listInsertionMap = [PhpDocNode::class . '->children' => "\n * ", UnionTypeNode::class . '->types' => '|', IntersectionTypeNode::class . '->types' => '&', ArrayShapeNode::class . '->items' => ', ', ObjectShapeNode::class . '->items' => ', ', CallableTypeNode::class . '->parameters' => ', ', GenericTypeNode::class . '->genericTypes' => ', ', ConstExprArrayNode::class . '->items' => ', ', MethodTagValueNode::class . '->parameters' => ', ', DoctrineArray::class . '->items' => ', ', DoctrineAnnotation::class . '->arguments' => ', ']; - /** - * [$find, $extraLeft, $extraRight] - * - * @var array - */ - private $emptyListInsertionMap = [CallableTypeNode::class . '->parameters' => ['(', '', ''], ArrayShapeNode::class . '->items' => ['{', '', ''], ObjectShapeNode::class . '->items' => ['{', '', ''], DoctrineArray::class . '->items' => ['{', '', ''], DoctrineAnnotation::class . '->arguments' => ['(', '', '']]; - /** @var array>> */ - private $parenthesesMap = [CallableTypeNode::class . '->returnType' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class], ArrayTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ConstTypeNode::class, NullableTypeNode::class], OffsetAccessTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ConstTypeNode::class, NullableTypeNode::class]]; - /** @var array>> */ - private $parenthesesListMap = [IntersectionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class], UnionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class]]; - public function printFormatPreserving(PhpDocNode $node, PhpDocNode $originalNode, TokenIterator $originalTokens) : string - { - $this->differ = new Differ(static function ($a, $b) { - if ($a instanceof Node && $b instanceof Node) { - return $a === $b->getAttribute(Attribute::ORIGINAL_NODE); - } - return \false; - }); - $tokenIndex = 0; - $result = $this->printArrayFormatPreserving($node->children, $originalNode->children, $originalTokens, $tokenIndex, PhpDocNode::class, 'children'); - if ($result !== null) { - return $result . $originalTokens->getContentBetween($tokenIndex, $originalTokens->getTokenCount()); - } - return $this->print($node); - } - public function print(Node $node) : string - { - if ($node instanceof PhpDocNode) { - return "/**\n *" . implode("\n *", array_map(function (PhpDocChildNode $child) : string { - $s = $this->print($child); - return $s === '' ? '' : ' ' . $s; - }, $node->children)) . "\n */"; - } - if ($node instanceof PhpDocTextNode) { - return $node->text; - } - if ($node instanceof PhpDocTagNode) { - if ($node->value instanceof DoctrineTagValueNode) { - return $this->print($node->value); - } - return trim(sprintf('%s %s', $node->name, $this->print($node->value))); - } - if ($node instanceof PhpDocTagValueNode) { - return $this->printTagValue($node); - } - if ($node instanceof TypeNode) { - return $this->printType($node); - } - if ($node instanceof ConstExprNode) { - return $this->printConstExpr($node); - } - if ($node instanceof MethodTagValueParameterNode) { - $type = $node->type !== null ? $this->print($node->type) . ' ' : ''; - $isReference = $node->isReference ? '&' : ''; - $isVariadic = $node->isVariadic ? '...' : ''; - $default = $node->defaultValue !== null ? ' = ' . $this->print($node->defaultValue) : ''; - return "{$type}{$isReference}{$isVariadic}{$node->parameterName}{$default}"; - } - if ($node instanceof CallableTypeParameterNode) { - $type = $this->print($node->type) . ' '; - $isReference = $node->isReference ? '&' : ''; - $isVariadic = $node->isVariadic ? '...' : ''; - $isOptional = $node->isOptional ? '=' : ''; - return trim("{$type}{$isReference}{$isVariadic}{$node->parameterName}") . $isOptional; - } - if ($node instanceof DoctrineAnnotation) { - return (string) $node; - } - if ($node instanceof DoctrineArgument) { - return (string) $node; - } - if ($node instanceof DoctrineArray) { - return (string) $node; - } - if ($node instanceof DoctrineArrayItem) { - return (string) $node; - } - throw new LogicException(sprintf('Unknown node type %s', get_class($node))); - } - private function printTagValue(PhpDocTagValueNode $node) : string - { - // only nodes that contain another node are handled here - // the rest falls back on (string) $node - if ($node instanceof AssertTagMethodValueNode) { - $isNegated = $node->isNegated ? '!' : ''; - $isEquality = $node->isEquality ? '=' : ''; - $type = $this->printType($node->type); - return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->method}() {$node->description}"); - } - if ($node instanceof AssertTagPropertyValueNode) { - $isNegated = $node->isNegated ? '!' : ''; - $isEquality = $node->isEquality ? '=' : ''; - $type = $this->printType($node->type); - return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->property} {$node->description}"); - } - if ($node instanceof AssertTagValueNode) { - $isNegated = $node->isNegated ? '!' : ''; - $isEquality = $node->isEquality ? '=' : ''; - $type = $this->printType($node->type); - return trim("{$isNegated}{$isEquality}{$type} {$node->parameter} {$node->description}"); - } - if ($node instanceof ExtendsTagValueNode || $node instanceof ImplementsTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->description}"); - } - if ($node instanceof MethodTagValueNode) { - $static = $node->isStatic ? 'static ' : ''; - $returnType = $node->returnType !== null ? $this->printType($node->returnType) . ' ' : ''; - $parameters = implode(', ', array_map(function (MethodTagValueParameterNode $parameter) : string { - return $this->print($parameter); - }, $node->parameters)); - $description = $node->description !== '' ? " {$node->description}" : ''; - $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(function (TemplateTagValueNode $templateTag) : string { - return $this->print($templateTag); - }, $node->templateTypes)) . '>' : ''; - return "{$static}{$returnType}{$node->methodName}{$templateTypes}({$parameters}){$description}"; - } - if ($node instanceof MixinTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->description}"); - } - if ($node instanceof ParamOutTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->parameterName} {$node->description}"); - } - if ($node instanceof ParamTagValueNode) { - $reference = $node->isReference ? '&' : ''; - $variadic = $node->isVariadic ? '...' : ''; - $type = $this->printType($node->type); - return trim("{$type} {$reference}{$variadic}{$node->parameterName} {$node->description}"); - } - if ($node instanceof PropertyTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->propertyName} {$node->description}"); - } - if ($node instanceof ReturnTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->description}"); - } - if ($node instanceof SelfOutTagValueNode) { - $type = $this->printType($node->type); - return trim($type . ' ' . $node->description); - } - if ($node instanceof TemplateTagValueNode) { - $bound = $node->bound !== null ? ' of ' . $this->printType($node->bound) : ''; - $default = $node->default !== null ? ' = ' . $this->printType($node->default) : ''; - return trim("{$node->name}{$bound}{$default} {$node->description}"); - } - if ($node instanceof ThrowsTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->description}"); - } - if ($node instanceof TypeAliasImportTagValueNode) { - return trim("{$node->importedAlias} from " . $this->printType($node->importedFrom) . ($node->importedAs !== null ? " as {$node->importedAs}" : '')); - } - if ($node instanceof TypeAliasTagValueNode) { - $type = $this->printType($node->type); - return trim("{$node->alias} {$type}"); - } - if ($node instanceof UsesTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} {$node->description}"); - } - if ($node instanceof VarTagValueNode) { - $type = $this->printType($node->type); - return trim("{$type} " . trim("{$node->variableName} {$node->description}")); - } - return (string) $node; - } - private function printType(TypeNode $node) : string - { - if ($node instanceof ArrayShapeNode) { - $items = array_map(function (ArrayShapeItemNode $item) : string { - return $this->printType($item); - }, $node->items); - if (!$node->sealed) { - $items[] = '...'; - } - return $node->kind . '{' . implode(', ', $items) . '}'; - } - if ($node instanceof ArrayShapeItemNode) { - if ($node->keyName !== null) { - return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); - } - return $this->printType($node->valueType); - } - if ($node instanceof ArrayTypeNode) { - return $this->printOffsetAccessType($node->type) . '[]'; - } - if ($node instanceof CallableTypeNode) { - if ($node->returnType instanceof CallableTypeNode || $node->returnType instanceof UnionTypeNode || $node->returnType instanceof IntersectionTypeNode) { - $returnType = $this->wrapInParentheses($node->returnType); - } else { - $returnType = $this->printType($node->returnType); - } - $parameters = implode(', ', array_map(function (CallableTypeParameterNode $parameterNode) : string { - return $this->print($parameterNode); - }, $node->parameters)); - return "{$node->identifier}({$parameters}): {$returnType}"; - } - if ($node instanceof ConditionalTypeForParameterNode) { - return sprintf('(%s %s %s ? %s : %s)', $node->parameterName, $node->negated ? 'is not' : 'is', $this->printType($node->targetType), $this->printType($node->if), $this->printType($node->else)); - } - if ($node instanceof ConditionalTypeNode) { - return sprintf('(%s %s %s ? %s : %s)', $this->printType($node->subjectType), $node->negated ? 'is not' : 'is', $this->printType($node->targetType), $this->printType($node->if), $this->printType($node->else)); - } - if ($node instanceof ConstTypeNode) { - return $this->printConstExpr($node->constExpr); - } - if ($node instanceof GenericTypeNode) { - $genericTypes = []; - foreach ($node->genericTypes as $index => $type) { - $variance = $node->variances[$index] ?? GenericTypeNode::VARIANCE_INVARIANT; - if ($variance === GenericTypeNode::VARIANCE_INVARIANT) { - $genericTypes[] = $this->printType($type); - } elseif ($variance === GenericTypeNode::VARIANCE_BIVARIANT) { - $genericTypes[] = '*'; - } else { - $genericTypes[] = sprintf('%s %s', $variance, $this->print($type)); - } - } - return $node->type . '<' . implode(', ', $genericTypes) . '>'; - } - if ($node instanceof IdentifierTypeNode) { - return $node->name; - } - if ($node instanceof IntersectionTypeNode || $node instanceof UnionTypeNode) { - $items = []; - foreach ($node->types as $type) { - if ($type instanceof IntersectionTypeNode || $type instanceof UnionTypeNode || $type instanceof NullableTypeNode) { - $items[] = $this->wrapInParentheses($type); - continue; - } - $items[] = $this->printType($type); - } - return implode($node instanceof IntersectionTypeNode ? '&' : '|', $items); - } - if ($node instanceof InvalidTypeNode) { - return (string) $node; - } - if ($node instanceof NullableTypeNode) { - if ($node->type instanceof IntersectionTypeNode || $node->type instanceof UnionTypeNode) { - return '?(' . $this->printType($node->type) . ')'; - } - return '?' . $this->printType($node->type); - } - if ($node instanceof ObjectShapeNode) { - $items = array_map(function (ObjectShapeItemNode $item) : string { - return $this->printType($item); - }, $node->items); - return 'object{' . implode(', ', $items) . '}'; - } - if ($node instanceof ObjectShapeItemNode) { - if ($node->keyName !== null) { - return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); - } - return $this->printType($node->valueType); - } - if ($node instanceof OffsetAccessTypeNode) { - return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; - } - if ($node instanceof ThisTypeNode) { - return (string) $node; - } - throw new LogicException(sprintf('Unknown node type %s', get_class($node))); - } - private function wrapInParentheses(TypeNode $node) : string - { - return '(' . $this->printType($node) . ')'; - } - private function printOffsetAccessType(TypeNode $type) : string - { - if ($type instanceof CallableTypeNode || $type instanceof UnionTypeNode || $type instanceof IntersectionTypeNode || $type instanceof ConstTypeNode || $type instanceof NullableTypeNode) { - return $this->wrapInParentheses($type); - } - return $this->printType($type); - } - private function printConstExpr(ConstExprNode $node) : string - { - // this is fine - ConstExprNode classes do not contain nodes that need smart printer logic - return (string) $node; - } - /** - * @param Node[] $nodes - * @param Node[] $originalNodes - */ - private function printArrayFormatPreserving(array $nodes, array $originalNodes, TokenIterator $originalTokens, int &$tokenIndex, string $parentNodeClass, string $subNodeName) : ?string - { - $diff = $this->differ->diffWithReplacements($originalNodes, $nodes); - $mapKey = $parentNodeClass . '->' . $subNodeName; - $insertStr = $this->listInsertionMap[$mapKey] ?? null; - $result = ''; - $beforeFirstKeepOrReplace = \true; - $delayedAdd = []; - $insertNewline = \false; - [$isMultiline, $beforeAsteriskIndent, $afterAsteriskIndent] = $this->isMultiline($tokenIndex, $originalNodes, $originalTokens); - if ($insertStr === "\n * ") { - $insertStr = sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); - } - foreach ($diff as $i => $diffElem) { - $diffType = $diffElem->type; - $newNode = $diffElem->new; - $originalNode = $diffElem->old; - if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { - $beforeFirstKeepOrReplace = \false; - if (!$newNode instanceof Node || !$originalNode instanceof Node) { - return null; - } - $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); - $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); - if ($itemStartPos < 0 || $itemEndPos < 0 || $itemStartPos < $tokenIndex) { - throw new LogicException(); - } - $result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos); - if (count($delayedAdd) > 0) { - foreach ($delayedAdd as $delayedAddNode) { - $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($delayedAddNode), $this->parenthesesListMap[$mapKey], \true); - if ($parenthesesNeeded) { - $result .= '('; - } - $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); - if ($parenthesesNeeded) { - $result .= ')'; - } - if ($insertNewline) { - $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); - } else { - $result .= $insertStr; - } - } - $delayedAdd = []; - } - $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], \true) && !in_array(get_class($originalNode), $this->parenthesesListMap[$mapKey], \true); - $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($itemStartPos, $itemEndPos); - if ($addParentheses) { - $result .= '('; - } - $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); - if ($addParentheses) { - $result .= ')'; - } - $tokenIndex = $itemEndPos + 1; - } elseif ($diffType === DiffElem::TYPE_ADD) { - if ($insertStr === null) { - return null; - } - if (!$newNode instanceof Node) { - return null; - } - if ($insertStr === ', ' && $isMultiline) { - $insertStr = ','; - $insertNewline = \true; - } - if ($beforeFirstKeepOrReplace) { - // Will be inserted at the next "replace" or "keep" element - $delayedAdd[] = $newNode; - continue; - } - $itemEndPos = $tokenIndex - 1; - if ($insertNewline) { - $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); - } else { - $result .= $insertStr; - } - $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], \true); - if ($parenthesesNeeded) { - $result .= '('; - } - $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); - if ($parenthesesNeeded) { - $result .= ')'; - } - $tokenIndex = $itemEndPos + 1; - } elseif ($diffType === DiffElem::TYPE_REMOVE) { - if (!$originalNode instanceof Node) { - return null; - } - $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); - $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); - if ($itemStartPos < 0 || $itemEndPos < 0) { - throw new LogicException(); - } - if ($i === 0) { - // If we're removing from the start, keep the tokens before the node and drop those after it, - // instead of the other way around. - $originalTokensArray = $originalTokens->getTokens(); - for ($j = $tokenIndex; $j < $itemStartPos; $j++) { - if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) { - break; - } - $result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET]; - } - } - $tokenIndex = $itemEndPos + 1; - } - } - if (count($delayedAdd) > 0) { - if (!isset($this->emptyListInsertionMap[$mapKey])) { - return null; - } - [$findToken, $extraLeft, $extraRight] = $this->emptyListInsertionMap[$mapKey]; - if ($findToken !== null) { - $originalTokensArray = $originalTokens->getTokens(); - for (; $tokenIndex < count($originalTokensArray); $tokenIndex++) { - $result .= $originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET]; - if ($originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET] !== $findToken) { - continue; - } - $tokenIndex++; - break; - } - } - $first = \true; - $result .= $extraLeft; - foreach ($delayedAdd as $delayedAddNode) { - if (!$first) { - $result .= $insertStr; - if ($insertNewline) { - $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); - } - } - $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); - $first = \false; - } - $result .= $extraRight; - } - return $result; - } - /** - * @param Node[] $nodes - * @return array{bool, string, string} - */ - private function isMultiline(int $initialIndex, array $nodes, TokenIterator $originalTokens) : array - { - $isMultiline = count($nodes) > 1; - $pos = $initialIndex; - $allText = ''; - /** @var Node|null $node */ - foreach ($nodes as $node) { - if (!$node instanceof Node) { - continue; - } - $endPos = $node->getAttribute(Attribute::END_INDEX) + 1; - $text = $originalTokens->getContentBetween($pos, $endPos); - $allText .= $text; - if (strpos($text, "\n") === \false) { - // We require that a newline is present between *every* item. If the formatting - // is inconsistent, with only some items having newlines, we don't consider it - // as multiline - $isMultiline = \false; - } - $pos = $endPos; - } - $c = preg_match_all('~\\n(?[\\x09\\x20]*)\\*(?\\x20*)~', $allText, $matches, PREG_SET_ORDER); - if ($c === 0) { - return [$isMultiline, '', '']; - } - $before = ''; - $after = ''; - foreach ($matches as $match) { - if (strlen($match['before']) > strlen($before)) { - $before = $match['before']; - } - if (strlen($match['after']) <= strlen($after)) { - continue; - } - $after = $match['after']; - } - return [$isMultiline, $before, $after]; - } - private function printNodeFormatPreserving(Node $node, TokenIterator $originalTokens) : string - { - /** @var Node|null $originalNode */ - $originalNode = $node->getAttribute(Attribute::ORIGINAL_NODE); - if ($originalNode === null) { - return $this->print($node); - } - $class = get_class($node); - if ($class !== get_class($originalNode)) { - throw new LogicException(); - } - $startPos = $originalNode->getAttribute(Attribute::START_INDEX); - $endPos = $originalNode->getAttribute(Attribute::END_INDEX); - if ($startPos < 0 || $endPos < 0) { - throw new LogicException(); - } - $result = ''; - $pos = $startPos; - $subNodeNames = array_keys(get_object_vars($node)); - foreach ($subNodeNames as $subNodeName) { - $subNode = $node->{$subNodeName}; - $origSubNode = $originalNode->{$subNodeName}; - if (!$subNode instanceof Node && $subNode !== null || !$origSubNode instanceof Node && $origSubNode !== null) { - if ($subNode === $origSubNode) { - // Unchanged, can reuse old code - continue; - } - if (is_array($subNode) && is_array($origSubNode)) { - // Array subnode changed, we might be able to reconstruct it - $listResult = $this->printArrayFormatPreserving($subNode, $origSubNode, $originalTokens, $pos, $class, $subNodeName); - if ($listResult === null) { - return $this->print($node); - } - $result .= $listResult; - continue; - } - return $this->print($node); - } - if ($origSubNode === null) { - if ($subNode === null) { - // Both null, nothing to do - continue; - } - return $this->print($node); - } - $subStartPos = $origSubNode->getAttribute(Attribute::START_INDEX); - $subEndPos = $origSubNode->getAttribute(Attribute::END_INDEX); - if ($subStartPos < 0 || $subEndPos < 0) { - throw new LogicException(); - } - if ($subNode === null) { - return $this->print($node); - } - $result .= $originalTokens->getContentBetween($pos, $subStartPos); - $mapKey = get_class($node) . '->' . $subNodeName; - $parenthesesNeeded = isset($this->parenthesesMap[$mapKey]) && in_array(get_class($subNode), $this->parenthesesMap[$mapKey], \true); - if ($subNode->getAttribute(Attribute::ORIGINAL_NODE) !== null) { - $parenthesesNeeded = $parenthesesNeeded && !in_array(get_class($subNode->getAttribute(Attribute::ORIGINAL_NODE)), $this->parenthesesMap[$mapKey], \true); - } - $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($subStartPos, $subEndPos); - if ($addParentheses) { - $result .= '('; - } - $result .= $this->printNodeFormatPreserving($subNode, $originalTokens); - if ($addParentheses) { - $result .= ')'; - } - $pos = $subEndPos + 1; - } - return $result . $originalTokens->getContentBetween($pos, $endPos + 1); - } -} diff --git a/dependencies/psr/cache/src/CacheException.php b/dependencies/psr/cache/src/CacheException.php deleted file mode 100644 index 0cf7ade..0000000 --- a/dependencies/psr/cache/src/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ -getHeaders() as $name => $values) { - * echo $name . ": " . implode(", ", $values); - * } - * - * // Emit headers iteratively: - * foreach ($message->getHeaders() as $name => $values) { - * foreach ($values as $value) { - * header(sprintf('%s: %s', $name, $value), false); - * } - * } - * - * While header names are not case-sensitive, getHeaders() will preserve the - * exact case in which headers were originally specified. - * - * @return string[][] Returns an associative array of the message's headers. Each - * key MUST be a header name, and each value MUST be an array of strings - * for that header. - */ - public function getHeaders() : array; - /** - * Checks if a header exists by the given case-insensitive name. - * - * @param string $name Case-insensitive header field name. - * @return bool Returns true if any header names match the given header - * name using a case-insensitive string comparison. Returns false if - * no matching header name is found in the message. - */ - public function hasHeader(string $name) : bool; - /** - * Retrieves a message header value by the given case-insensitive name. - * - * This method returns an array of all the header values of the given - * case-insensitive header name. - * - * If the header does not appear in the message, this method MUST return an - * empty array. - * - * @param string $name Case-insensitive header field name. - * @return string[] An array of string values as provided for the given - * header. If the header does not appear in the message, this method MUST - * return an empty array. - */ - public function getHeader(string $name) : array; - /** - * Retrieves a comma-separated string of the values for a single header. - * - * This method returns all of the header values of the given - * case-insensitive header name as a string concatenated together using - * a comma. - * - * NOTE: Not all header values may be appropriately represented using - * comma concatenation. For such headers, use getHeader() instead - * and supply your own delimiter when concatenating. - * - * If the header does not appear in the message, this method MUST return - * an empty string. - * - * @param string $name Case-insensitive header field name. - * @return string A string of values as provided for the given header - * concatenated together using a comma. If the header does not appear in - * the message, this method MUST return an empty string. - */ - public function getHeaderLine(string $name) : string; - /** - * Return an instance with the provided value replacing the specified header. - * - * While header names are case-insensitive, the casing of the header will - * be preserved by this function, and returned from getHeaders(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new and/or updated header and value. - * - * @param string $name Case-insensitive header field name. - * @param string|string[] $value Header value(s). - * @return static - * @throws \InvalidArgumentException for invalid header names or values. - */ - public function withHeader(string $name, $value) : MessageInterface; - /** - * Return an instance with the specified header appended with the given value. - * - * Existing values for the specified header will be maintained. The new - * value(s) will be appended to the existing list. If the header did not - * exist previously, it will be added. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new header and/or value. - * - * @param string $name Case-insensitive header field name to add. - * @param string|string[] $value Header value(s). - * @return static - * @throws \InvalidArgumentException for invalid header names or values. - */ - public function withAddedHeader(string $name, $value) : MessageInterface; - /** - * Return an instance without the specified header. - * - * Header resolution MUST be done without case-sensitivity. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that removes - * the named header. - * - * @param string $name Case-insensitive header field name to remove. - * @return static - */ - public function withoutHeader(string $name) : MessageInterface; - /** - * Gets the body of the message. - * - * @return StreamInterface Returns the body as a stream. - */ - public function getBody() : StreamInterface; - /** - * Return an instance with the specified message body. - * - * The body MUST be a StreamInterface object. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return a new instance that has the - * new body stream. - * - * @param StreamInterface $body Body. - * @return static - * @throws \InvalidArgumentException When the body is not valid. - */ - public function withBody(StreamInterface $body) : MessageInterface; -} diff --git a/dependencies/psr/http-message/src/RequestInterface.php b/dependencies/psr/http-message/src/RequestInterface.php deleted file mode 100644 index f06407e..0000000 --- a/dependencies/psr/http-message/src/RequestInterface.php +++ /dev/null @@ -1,124 +0,0 @@ -getQuery()` - * or from the `QUERY_STRING` server param. - * - * @return array - */ - public function getQueryParams() : array; - /** - * Return an instance with the specified query string arguments. - * - * These values SHOULD remain immutable over the course of the incoming - * request. They MAY be injected during instantiation, such as from PHP's - * $_GET superglobal, or MAY be derived from some other value such as the - * URI. In cases where the arguments are parsed from the URI, the data - * MUST be compatible with what PHP's parse_str() would return for - * purposes of how duplicate query parameters are handled, and how nested - * sets are handled. - * - * Setting query string arguments MUST NOT change the URI stored by the - * request, nor the values in the server params. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated query string arguments. - * - * @param array $query Array of query string arguments, typically from - * $_GET. - * @return static - */ - public function withQueryParams(array $query) : ServerRequestInterface; - /** - * Retrieve normalized file upload data. - * - * This method returns upload metadata in a normalized tree, with each leaf - * an instance of Psr\Http\Message\UploadedFileInterface. - * - * These values MAY be prepared from $_FILES or the message body during - * instantiation, or MAY be injected via withUploadedFiles(). - * - * @return array An array tree of UploadedFileInterface instances; an empty - * array MUST be returned if no data is present. - */ - public function getUploadedFiles() : array; - /** - * Create a new instance with the specified uploaded files. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param array $uploadedFiles An array tree of UploadedFileInterface instances. - * @return static - * @throws \InvalidArgumentException if an invalid structure is provided. - */ - public function withUploadedFiles(array $uploadedFiles) : ServerRequestInterface; - /** - * Retrieve any parameters provided in the request body. - * - * If the request Content-Type is either application/x-www-form-urlencoded - * or multipart/form-data, and the request method is POST, this method MUST - * return the contents of $_POST. - * - * Otherwise, this method may return any results of deserializing - * the request body content; as parsing returns structured content, the - * potential types MUST be arrays or objects only. A null value indicates - * the absence of body content. - * - * @return null|array|object The deserialized body parameters, if any. - * These will typically be an array or object. - */ - public function getParsedBody(); - /** - * Return an instance with the specified body parameters. - * - * These MAY be injected during instantiation. - * - * If the request Content-Type is either application/x-www-form-urlencoded - * or multipart/form-data, and the request method is POST, use this method - * ONLY to inject the contents of $_POST. - * - * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of - * deserializing the request body content. Deserialization/parsing returns - * structured data, and, as such, this method ONLY accepts arrays or objects, - * or a null value if nothing was available to parse. - * - * As an example, if content negotiation determines that the request data - * is a JSON payload, this method could be used to create a request - * instance with the deserialized parameters. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param null|array|object $data The deserialized body data. This will - * typically be in an array or object. - * @return static - * @throws \InvalidArgumentException if an unsupported argument type is - * provided. - */ - public function withParsedBody($data) : ServerRequestInterface; - /** - * Retrieve attributes derived from the request. - * - * The request "attributes" may be used to allow injection of any - * parameters derived from the request: e.g., the results of path - * match operations; the results of decrypting cookies; the results of - * deserializing non-form-encoded message bodies; etc. Attributes - * will be application and request specific, and CAN be mutable. - * - * @return array Attributes derived from the request. - */ - public function getAttributes() : array; - /** - * Retrieve a single derived request attribute. - * - * Retrieves a single derived request attribute as described in - * getAttributes(). If the attribute has not been previously set, returns - * the default value as provided. - * - * This method obviates the need for a hasAttribute() method, as it allows - * specifying a default value to return if the attribute is not found. - * - * @see getAttributes() - * @param string $name The attribute name. - * @param mixed $default Default value to return if the attribute does not exist. - * @return mixed - */ - public function getAttribute(string $name, $default = null); - /** - * Return an instance with the specified derived request attribute. - * - * This method allows setting a single derived request attribute as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated attribute. - * - * @see getAttributes() - * @param string $name The attribute name. - * @param mixed $value The value of the attribute. - * @return static - */ - public function withAttribute(string $name, $value) : ServerRequestInterface; - /** - * Return an instance that removes the specified derived request attribute. - * - * This method allows removing a single derived request attribute as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that removes - * the attribute. - * - * @see getAttributes() - * @param string $name The attribute name. - * @return static - */ - public function withoutAttribute(string $name) : ServerRequestInterface; -} diff --git a/dependencies/psr/http-message/src/StreamInterface.php b/dependencies/psr/http-message/src/StreamInterface.php deleted file mode 100644 index 4198d26..0000000 --- a/dependencies/psr/http-message/src/StreamInterface.php +++ /dev/null @@ -1,144 +0,0 @@ - - * [user-info@]host[:port] - * - * - * 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 - * @return string The URI authority, in "[user-info@]host[:port]" format. - */ - public function getAuthority() : string; - /** - * Retrieve the user information component of the URI. - * - * If no user information is present, this method MUST return an empty - * string. - * - * 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. - * - * @return string The URI user information, in "username[:password]" format. - */ - public function getUserInfo() : string; - /** - * Retrieve the host component of the URI. - * - * If no host is present, this method MUST return an empty string. - * - * 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 - * @return string The URI host. - */ - 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. - * - * @return null|int The URI port. - */ - 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 - * @return string The URI path. - */ - public function getPath() : string; - /** - * Retrieve the query string of the URI. - * - * If no query string is present, this method MUST return an empty string. - * - * 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 - * @return string The URI query string. - */ - public function getQuery() : string; - /** - * Retrieve the fragment component of the URI. - * - * If no fragment is present, this method MUST return an empty string. - * - * 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 - * @return string The URI fragment. - */ - public function getFragment() : string; - /** - * 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. - * - * Implementations MUST support the schemes "http" and "https" case - * insensitively, and MAY accommodate other schemes if required. - * - * An empty scheme is equivalent to removing the scheme. - * - * @param string $scheme The scheme to use with the new instance. - * @return static A new instance with the specified scheme. - * @throws \InvalidArgumentException for invalid or unsupported schemes. - */ - public function withScheme(string $scheme) : UriInterface; - /** - * 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; an empty string for the user is equivalent to removing user - * information. - * - * @param string $user The user name to use for authority. - * @param null|string $password The password associated with $user. - * @return static A new instance with the specified user information. - */ - public function withUserInfo(string $user, ?string $password = null) : UriInterface; - /** - * 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. - * - * An empty host value is equivalent to removing the host. - * - * @param string $host The hostname to use with the new instance. - * @return static A new instance with the specified host. - * @throws \InvalidArgumentException for invalid hostnames. - */ - public function withHost(string $host) : UriInterface; - /** - * 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. - * - * Implementations MUST raise an exception for ports outside the - * established TCP and UDP port ranges. - * - * A null value provided for the port is equivalent to removing the port - * information. - * - * @param null|int $port The port to use with the new instance; a null value - * removes the port information. - * @return static A new instance with the specified port. - * @throws \InvalidArgumentException for invalid ports. - */ - public function withPort(?int $port) : UriInterface; - /** - * 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. - * - * If the path is intended to be domain-relative rather than path relative then - * it must begin with a slash ("/"). Paths not starting with a slash ("/") - * are assumed to be relative to some base path known to the application or - * consumer. - * - * Users can provide both encoded and decoded path characters. - * Implementations ensure the correct encoding as outlined in getPath(). - * - * @param string $path The path to use with the new instance. - * @return static A new instance with the specified path. - * @throws \InvalidArgumentException for invalid paths. - */ - public function withPath(string $path) : UriInterface; - /** - * 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(). - * - * An empty query string value is equivalent to removing the query string. - * - * @param string $query The query string to use with the new instance. - * @return static A new instance with the specified query string. - * @throws \InvalidArgumentException for invalid query strings. - */ - public function withQuery(string $query) : UriInterface; - /** - * 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(). - * - * An empty fragment value is equivalent to removing the fragment. - * - * @param string $fragment The fragment to use with the new instance. - * @return static A new instance with the specified fragment. - */ - public function withFragment(string $fragment) : UriInterface; - /** - * Return the string representation as a URI reference. - * - * Depending on which components of the URI are present, the resulting - * string is either a full URI or relative reference according to RFC 3986, - * Section 4.1. The method concatenates the various components of the URI, - * using the appropriate delimiters: - * - * - If a scheme is present, it MUST be suffixed by ":". - * - If an authority is present, it MUST be prefixed by "//". - * - The path can be concatenated without delimiters. But there are two - * cases where the path has to be adjusted to make the URI reference - * valid as PHP does not allow to throw an exception in __toString(): - * - If the path is rootless and an authority is present, the path MUST - * be prefixed by "/". - * - If the path is starting with more than one "/" and no authority is - * present, the starting slashes MUST be reduced to one. - * - If a query is present, it MUST be prefixed by "?". - * - If a fragment is present, it MUST be prefixed by "#". - * - * @see http://tools.ietf.org/html/rfc3986#section-4.1 - * @return string - */ - public function __toString() : string; -} diff --git a/dependencies/psr/log/src/AbstractLogger.php b/dependencies/psr/log/src/AbstractLogger.php deleted file mode 100644 index 2ed8cf8..0000000 --- a/dependencies/psr/log/src/AbstractLogger.php +++ /dev/null @@ -1,15 +0,0 @@ -logger = $logger; - } -} diff --git a/dependencies/psr/log/src/LoggerInterface.php b/dependencies/psr/log/src/LoggerInterface.php deleted file mode 100644 index f24fc27..0000000 --- a/dependencies/psr/log/src/LoggerInterface.php +++ /dev/null @@ -1,117 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function alert($message, array $context = []) - { - $this->log(LogLevel::ALERT, $message, $context); - } - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function critical($message, array $context = []) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function error($message, array $context = []) - { - $this->log(LogLevel::ERROR, $message, $context); - } - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function warning($message, array $context = []) - { - $this->log(LogLevel::WARNING, $message, $context); - } - /** - * Normal but significant events. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function notice($message, array $context = []) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function info($message, array $context = []) - { - $this->log(LogLevel::INFO, $message, $context); - } - /** - * Detailed debug information. - * - * @param string|\Stringable $message - * @param array $context - * - * @return void - */ - public function debug($message, array $context = []) - { - $this->log(LogLevel::DEBUG, $message, $context); - } - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string|\Stringable $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - public abstract function log($level, $message, array $context = []); -} diff --git a/dependencies/psr/log/src/NullLogger.php b/dependencies/psr/log/src/NullLogger.php deleted file mode 100644 index d1b48ae..0000000 --- a/dependencies/psr/log/src/NullLogger.php +++ /dev/null @@ -1,30 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string|\Stringable $message - * @param array $context - * - * @return void - * - * @throws \Psr\Log\InvalidArgumentException - */ - public function log($level, $message, array $context = []) - { - // noop - } -} diff --git a/dependencies/psr/simple-cache/src/CacheException.php b/dependencies/psr/simple-cache/src/CacheException.php deleted file mode 100644 index f404bfa..0000000 --- a/dependencies/psr/simple-cache/src/CacheException.php +++ /dev/null @@ -1,10 +0,0 @@ - value pairs. Cache keys that do not exist or are stale will have $default as value. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - */ - public function getMultiple($keys, $default = null); - /** - * Persists a set of key => value pairs in the cache, with an optional TTL. - * - * @param iterable $values A list of key => value pairs for a multiple-set operation. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * - * @return bool True on success and false on failure. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $values is neither an array nor a Traversable, - * or if any of the $values are not a legal value. - */ - public function setMultiple($values, $ttl = null); - /** - * Deletes multiple cache items in a single operation. - * - * @param iterable $keys A list of string-based keys to be deleted. - * - * @return bool True if the items were successfully removed. False if there was an error. - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - */ - public function deleteMultiple($keys); - /** - * Determines whether an item is present in the cache. - * - * NOTE: It is recommended that has() is only to be used for cache warming type purposes - * and not to be used within your live applications operations for get/set, as this method - * is subject to a race condition where your has() will return true and immediately after, - * another script can remove it making the state of your app out of date. - * - * @param string $key The cache item key. - * - * @return bool - * - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - */ - public function has($key); -} diff --git a/dependencies/psr/simple-cache/src/InvalidArgumentException.php b/dependencies/psr/simple-cache/src/InvalidArgumentException.php deleted file mode 100644 index 97af301..0000000 --- a/dependencies/psr/simple-cache/src/InvalidArgumentException.php +++ /dev/null @@ -1,13 +0,0 @@ - - - Rakit validation coding standard - - - - - - - - - - - - src - tests - \ No newline at end of file diff --git a/dependencies/rakit/validation/src/Attribute.php b/dependencies/rakit/validation/src/Attribute.php deleted file mode 100644 index edc1ed0..0000000 --- a/dependencies/rakit/validation/src/Attribute.php +++ /dev/null @@ -1,271 +0,0 @@ -validation = $validation; - $this->alias = $alias; - $this->key = $key; - foreach ($rules as $rule) { - $this->addRule($rule); - } - } - /** - * Set the primary attribute - * - * @param \Rakit\Validation\Attribute $primaryAttribute - * @return void - */ - public function setPrimaryAttribute(Attribute $primaryAttribute) - { - $this->primaryAttribute = $primaryAttribute; - } - /** - * Set key indexes - * - * @param array $keyIndexes - * @return void - */ - public function setKeyIndexes(array $keyIndexes) - { - $this->keyIndexes = $keyIndexes; - } - /** - * Get primary attributes - * - * @return \Rakit\Validation\Attribute|null - */ - public function getPrimaryAttribute() - { - return $this->primaryAttribute; - } - /** - * Set other attributes - * - * @param array $otherAttributes - * @return void - */ - public function setOtherAttributes(array $otherAttributes) - { - $this->otherAttributes = []; - foreach ($otherAttributes as $otherAttribute) { - $this->addOtherAttribute($otherAttribute); - } - } - /** - * Add other attributes - * - * @param \Rakit\Validation\Attribute $otherAttribute - * @return void - */ - public function addOtherAttribute(Attribute $otherAttribute) - { - $this->otherAttributes[] = $otherAttribute; - } - /** - * Get other attributes - * - * @return array - */ - public function getOtherAttributes() : array - { - return $this->otherAttributes; - } - /** - * Add rule - * - * @param \Rakit\Validation\Rule $rule - * @return void - */ - public function addRule(Rule $rule) - { - $rule->setAttribute($this); - $rule->setValidation($this->validation); - $this->rules[$rule->getKey()] = $rule; - } - /** - * Get rule - * - * @param string $ruleKey - * @return void - */ - public function getRule(string $ruleKey) - { - return $this->hasRule($ruleKey) ? $this->rules[$ruleKey] : null; - } - /** - * Get rules - * - * @return array - */ - public function getRules() : array - { - return $this->rules; - } - /** - * Check the $ruleKey has in the rule - * - * @param string $ruleKey - * @return bool - */ - public function hasRule(string $ruleKey) : bool - { - return isset($this->rules[$ruleKey]); - } - /** - * Set required - * - * @param boolean $required - * @return void - */ - public function setRequired(bool $required) - { - $this->required = $required; - } - /** - * Set rule is required - * - * @return boolean - */ - public function isRequired() : bool - { - return $this->required; - } - /** - * Get key - * - * @return string - */ - public function getKey() : string - { - return $this->key; - } - /** - * Get key indexes - * - * @return array - */ - public function getKeyIndexes() : array - { - return $this->keyIndexes; - } - /** - * Get value - * - * @param string|null $key - * @return mixed - */ - public function getValue(string $key = null) - { - if ($key && $this->isArrayAttribute()) { - $key = $this->resolveSiblingKey($key); - } - if (!$key) { - $key = $this->getKey(); - } - return $this->validation->getValue($key); - } - /** - * Get that is array attribute - * - * @return boolean - */ - public function isArrayAttribute() : bool - { - return \count($this->getKeyIndexes()) > 0; - } - /** - * Check this attribute is using dot notation - * - * @return boolean - */ - public function isUsingDotNotation() : bool - { - return \strpos($this->getKey(), '.') !== \false; - } - /** - * Resolve sibling key - * - * @param string $key - * @return string - */ - public function resolveSiblingKey(string $key) : string - { - $indexes = $this->getKeyIndexes(); - $keys = \explode("*", $key); - $countAsterisks = \count($keys) - 1; - if (\count($indexes) < $countAsterisks) { - $indexes = \array_merge($indexes, \array_fill(0, $countAsterisks - \count($indexes), "*")); - } - $args = \array_merge([\str_replace("*", "%s", $key)], $indexes); - return \call_user_func_array('sprintf', $args); - } - /** - * Get humanize key - * - * @return string - */ - public function getHumanizedKey() - { - $primaryAttribute = $this->getPrimaryAttribute(); - $key = \str_replace('_', ' ', $this->key); - // Resolve key from array validation - if ($primaryAttribute) { - $split = \explode('.', $key); - $key = \implode(' ', \array_map(function ($word) { - if (\is_numeric($word)) { - $word = $word + 1; - } - return Helper::snakeCase($word, ' '); - }, $split)); - } - return \ucfirst($key); - } - /** - * Set alias - * - * @param string $alias - * @return void - */ - public function setAlias(string $alias) - { - $this->alias = $alias; - } - /** - * Get alias - * - * @return string|null - */ - public function getAlias() - { - return $this->alias; - } -} diff --git a/dependencies/rakit/validation/src/ErrorBag.php b/dependencies/rakit/validation/src/ErrorBag.php deleted file mode 100644 index e35f364..0000000 --- a/dependencies/rakit/validation/src/ErrorBag.php +++ /dev/null @@ -1,224 +0,0 @@ -messages = $messages; - } - /** - * Add message for given key and rule - * - * @param string $key - * @param string $rule - * @param string $message - * @return void - */ - public function add(string $key, string $rule, string $message) - { - if (!isset($this->messages[$key])) { - $this->messages[$key] = []; - } - $this->messages[$key][$rule] = $message; - } - /** - * Get messages count - * - * @return int - */ - public function count() : int - { - return \count($this->all()); - } - /** - * Check given key is existed - * - * @param string $key - * @return bool - */ - public function has(string $key) : bool - { - list($key, $ruleName) = $this->parsekey($key); - if ($this->isWildcardKey($key)) { - $messages = $this->filterMessagesForWildcardKey($key, $ruleName); - return \count(Helper::arrayDot($messages)) > 0; - } else { - $messages = isset($this->messages[$key]) ? $this->messages[$key] : null; - if (!$ruleName) { - return !empty($messages); - } else { - return !empty($messages) and isset($messages[$ruleName]); - } - } - } - /** - * Get the first value of array - * - * @param string $key - * @return mixed - */ - public function first(string $key) - { - list($key, $ruleName) = $this->parsekey($key); - if ($this->isWildcardKey($key)) { - $messages = $this->filterMessagesForWildcardKey($key, $ruleName); - $flattenMessages = Helper::arrayDot($messages); - return \array_shift($flattenMessages); - } else { - $keyMessages = isset($this->messages[$key]) ? $this->messages[$key] : []; - if (empty($keyMessages)) { - return null; - } - if ($ruleName) { - return isset($keyMessages[$ruleName]) ? $keyMessages[$ruleName] : null; - } else { - return \array_shift($keyMessages); - } - } - } - /** - * Get messages from given key, can be use custom format - * - * @param string $key - * @param string $format - * @return array - */ - public function get(string $key, string $format = ':message') : array - { - list($key, $ruleName) = $this->parsekey($key); - $results = []; - if ($this->isWildcardKey($key)) { - $messages = $this->filterMessagesForWildcardKey($key, $ruleName); - foreach ($messages as $explicitKey => $keyMessages) { - foreach ($keyMessages as $rule => $message) { - $results[$explicitKey][$rule] = $this->formatMessage($message, $format); - } - } - } else { - $keyMessages = isset($this->messages[$key]) ? $this->messages[$key] : []; - foreach ($keyMessages as $rule => $message) { - if ($ruleName and $ruleName != $rule) { - continue; - } - $results[$rule] = $this->formatMessage($message, $format); - } - } - return $results; - } - /** - * Get all messages - * - * @param string $format - * @return array - */ - public function all(string $format = ':message') : array - { - $messages = $this->messages; - $results = []; - foreach ($messages as $key => $keyMessages) { - foreach ($keyMessages as $message) { - $results[] = $this->formatMessage($message, $format); - } - } - return $results; - } - /** - * Get the first message from existing keys - * - * @param string $format - * @param boolean $dotNotation - * @return array - */ - public function firstOfAll(string $format = ':message', bool $dotNotation = \false) : array - { - $messages = $this->messages; - $results = []; - foreach ($messages as $key => $keyMessages) { - if ($dotNotation) { - $results[$key] = $this->formatMessage(\array_shift($messages[$key]), $format); - } else { - Helper::arraySet($results, $key, $this->formatMessage(\array_shift($messages[$key]), $format)); - } - } - return $results; - } - /** - * Get plain array messages - * - * @return array - */ - public function toArray() : array - { - return $this->messages; - } - /** - * Parse $key to get the array of $key and $ruleName - * - * @param string $key - * @return array - */ - protected function parseKey(string $key) : array - { - $expl = \explode(':', $key, 2); - $key = $expl[0]; - $ruleName = isset($expl[1]) ? $expl[1] : null; - return [$key, $ruleName]; - } - /** - * Check the $key is wildcard - * - * @param mixed $key - * @return bool - */ - protected function isWildcardKey(string $key) : bool - { - return \false !== \strpos($key, '*'); - } - /** - * Filter messages with wildcard key - * - * @param string $key - * @param mixed $ruleName - * @return array - */ - protected function filterMessagesForWildcardKey(string $key, $ruleName = null) : array - { - $messages = $this->messages; - $pattern = \preg_quote($key, '#'); - $pattern = \str_replace('\\*', '.*', $pattern); - $filteredMessages = []; - foreach ($messages as $k => $keyMessages) { - if ((bool) \preg_match('#^' . $pattern . '\\z#u', $k) === \false) { - continue; - } - foreach ($keyMessages as $rule => $message) { - if ($ruleName and $rule != $ruleName) { - continue; - } - $filteredMessages[$k][$rule] = $message; - } - } - return $filteredMessages; - } - /** - * Get formatted message - * - * @param string $message - * @param string $format - * @return string - */ - protected function formatMessage(string $message, string $format) : string - { - return \str_replace(':message', $message, $format); - } -} diff --git a/dependencies/rakit/validation/src/Helper.php b/dependencies/rakit/validation/src/Helper.php deleted file mode 100644 index 424c637..0000000 --- a/dependencies/rakit/validation/src/Helper.php +++ /dev/null @@ -1,226 +0,0 @@ - $value) { - if (\is_array($value) && !empty($value)) { - $results = \array_merge($results, static::arrayDot($value, $prepend . $key . '.')); - } else { - $results[$prepend . $key] = $value; - } - } - return $results; - } - /** - * Set an item on an array or object using dot notation. - * Adapted from: https://github.com/illuminate/support/blob/v5.3.23/helpers.php#L437 - * - * @param mixed $target - * @param string|array|null $key - * @param mixed $value - * @param bool $overwrite - * @return mixed - */ - public static function arraySet(&$target, $key, $value, $overwrite = \true) : array - { - if (\is_null($key)) { - if ($overwrite) { - return $target = \array_merge($target, $value); - } - return $target = \array_merge($value, $target); - } - $segments = \is_array($key) ? $key : \explode('.', $key); - if (($segment = \array_shift($segments)) === '*') { - if (!\is_array($target)) { - $target = []; - } - if ($segments) { - foreach ($target as &$inner) { - static::arraySet($inner, $segments, $value, $overwrite); - } - } elseif ($overwrite) { - foreach ($target as &$inner) { - $inner = $value; - } - } - } elseif (\is_array($target)) { - if ($segments) { - if (!\array_key_exists($segment, $target)) { - $target[$segment] = []; - } - static::arraySet($target[$segment], $segments, $value, $overwrite); - } elseif ($overwrite || !\array_key_exists($segment, $target)) { - $target[$segment] = $value; - } - } else { - $target = []; - if ($segments) { - static::arraySet($target[$segment], $segments, $value, $overwrite); - } elseif ($overwrite) { - $target[$segment] = $value; - } - } - return $target; - } - /** - * Unset an item on an array or object using dot notation. - * - * @param mixed $target - * @param string|array $key - * @return mixed - */ - public static function arrayUnset(&$target, $key) - { - if (!\is_array($target)) { - return $target; - } - $segments = \is_array($key) ? $key : \explode('.', $key); - $segment = \array_shift($segments); - if ($segment == '*') { - $target = []; - } elseif ($segments) { - if (\array_key_exists($segment, $target)) { - static::arrayUnset($target[$segment], $segments); - } - } elseif (\array_key_exists($segment, $target)) { - unset($target[$segment]); - } - return $target; - } - /** - * Get snake_case format from given string - * - * @param string $value - * @param string $delimiter - * @return string - */ - public static function snakeCase(string $value, string $delimiter = '_') : string - { - if (!\ctype_lower($value)) { - $value = \preg_replace('/\\s+/u', '', \ucwords($value)); - $value = \strtolower(\preg_replace('/(.)(?=[A-Z])/u', '$1' . $delimiter, $value)); - } - return $value; - } - /** - * Join string[] to string with given $separator and $lastSeparator. - * - * @param array $pieces - * @param string $separator - * @param string|null $lastSeparator - * @return string - */ - public static function join(array $pieces, string $separator, string $lastSeparator = null) : string - { - if (\is_null($lastSeparator)) { - $lastSeparator = $separator; - } - $last = \array_pop($pieces); - switch (\count($pieces)) { - case 0: - return $last ?: ''; - case 1: - return $pieces[0] . $lastSeparator . $last; - default: - return \implode($separator, $pieces) . $lastSeparator . $last; - } - } - /** - * Wrap string[] by given $prefix and $suffix - * - * @param array $strings - * @param string $prefix - * @param string|null $suffix - * @return array - */ - public static function wraps(array $strings, string $prefix, string $suffix = null) : array - { - if (\is_null($suffix)) { - $suffix = $prefix; - } - return \array_map(function ($str) use($prefix, $suffix) { - return $prefix . $str . $suffix; - }, $strings); - } -} diff --git a/dependencies/rakit/validation/src/MimeTypeGuesser.php b/dependencies/rakit/validation/src/MimeTypeGuesser.php deleted file mode 100644 index 1107f91..0000000 --- a/dependencies/rakit/validation/src/MimeTypeGuesser.php +++ /dev/null @@ -1,30 +0,0 @@ - 'ez', 'application/applixware' => 'aw', 'application/atom+xml' => 'atom', 'application/atomcat+xml' => 'atomcat', 'application/atomsvc+xml' => 'atomsvc', 'application/ccxml+xml' => 'ccxml', 'application/cdmi-capability' => 'cdmia', 'application/cdmi-container' => 'cdmic', 'application/cdmi-domain' => 'cdmid', 'application/cdmi-object' => 'cdmio', 'application/cdmi-queue' => 'cdmiq', 'application/cu-seeme' => 'cu', 'application/davmount+xml' => 'davmount', 'application/docbook+xml' => 'dbk', 'application/dssc+der' => 'dssc', 'application/dssc+xml' => 'xdssc', 'application/ecmascript' => 'ecma', 'application/emma+xml' => 'emma', 'application/epub+zip' => 'epub', 'application/exi' => 'exi', 'application/font-tdpfr' => 'pfr', 'application/gml+xml' => 'gml', 'application/gpx+xml' => 'gpx', 'application/gxf' => 'gxf', 'application/hyperstudio' => 'stk', 'application/inkml+xml' => 'ink', 'application/ipfix' => 'ipfix', 'application/java-archive' => 'jar', 'application/java-serialized-object' => 'ser', 'application/java-vm' => 'class', 'application/javascript' => 'js', 'application/json' => 'json', 'application/jsonml+json' => 'jsonml', 'application/lost+xml' => 'lostxml', 'application/mac-binhex40' => 'hqx', 'application/mac-compactpro' => 'cpt', 'application/mads+xml' => 'mads', 'application/marc' => 'mrc', 'application/marcxml+xml' => 'mrcx', 'application/mathematica' => 'ma', 'application/mathml+xml' => 'mathml', 'application/mbox' => 'mbox', 'application/mediaservercontrol+xml' => 'mscml', 'application/metalink+xml' => 'metalink', 'application/metalink4+xml' => 'meta4', 'application/mets+xml' => 'mets', 'application/mods+xml' => 'mods', 'application/mp21' => 'm21', 'application/mp4' => 'mp4s', 'application/msword' => 'doc', 'application/mxf' => 'mxf', 'application/octet-stream' => 'bin', 'application/oda' => 'oda', 'application/oebps-package+xml' => 'opf', 'application/ogg' => 'ogx', 'application/omdoc+xml' => 'omdoc', 'application/onenote' => 'onetoc', 'application/oxps' => 'oxps', 'application/patch-ops-error+xml' => 'xer', 'application/pdf' => 'pdf', 'application/pgp-encrypted' => 'pgp', 'application/pgp-signature' => 'asc', 'application/pics-rules' => 'prf', 'application/pkcs10' => 'p10', 'application/pkcs7-mime' => 'p7m', 'application/pkcs7-signature' => 'p7s', 'application/pkcs8' => 'p8', 'application/pkix-attr-cert' => 'ac', 'application/pkix-cert' => 'cer', 'application/pkix-crl' => 'crl', 'application/pkix-pkipath' => 'pkipath', 'application/pkixcmp' => 'pki', 'application/pls+xml' => 'pls', 'application/postscript' => 'ai', 'application/prs.cww' => 'cww', 'application/pskc+xml' => 'pskcxml', 'application/rdf+xml' => 'rdf', 'application/reginfo+xml' => 'rif', 'application/relax-ng-compact-syntax' => 'rnc', 'application/resource-lists+xml' => 'rl', 'application/resource-lists-diff+xml' => 'rld', 'application/rls-services+xml' => 'rs', 'application/rpki-ghostbusters' => 'gbr', 'application/rpki-manifest' => 'mft', 'application/rpki-roa' => 'roa', 'application/rsd+xml' => 'rsd', 'application/rss+xml' => 'rss', 'application/rtf' => 'rtf', 'application/sbml+xml' => 'sbml', 'application/scvp-cv-request' => 'scq', 'application/scvp-cv-response' => 'scs', 'application/scvp-vp-request' => 'spq', 'application/scvp-vp-response' => 'spp', 'application/sdp' => 'sdp', 'application/set-payment-initiation' => 'setpay', 'application/set-registration-initiation' => 'setreg', 'application/shf+xml' => 'shf', 'application/smil+xml' => 'smi', 'application/sparql-query' => 'rq', 'application/sparql-results+xml' => 'srx', 'application/srgs' => 'gram', 'application/srgs+xml' => 'grxml', 'application/sru+xml' => 'sru', 'application/ssdl+xml' => 'ssdl', 'application/ssml+xml' => 'ssml', 'application/tei+xml' => 'tei', 'application/thraud+xml' => 'tfi', 'application/timestamped-data' => 'tsd', 'application/vnd.3gpp.pic-bw-large' => 'plb', 'application/vnd.3gpp.pic-bw-small' => 'psb', 'application/vnd.3gpp.pic-bw-var' => 'pvb', 'application/vnd.3gpp2.tcap' => 'tcap', 'application/vnd.3m.post-it-notes' => 'pwn', 'application/vnd.accpac.simply.aso' => 'aso', 'application/vnd.accpac.simply.imp' => 'imp', 'application/vnd.acucobol' => 'acu', 'application/vnd.acucorp' => 'atc', 'application/vnd.adobe.air-application-installer-package+zip' => 'air', 'application/vnd.adobe.formscentral.fcdt' => 'fcdt', 'application/vnd.adobe.fxp' => 'fxp', 'application/vnd.adobe.xdp+xml' => 'xdp', 'application/vnd.adobe.xfdf' => 'xfdf', 'application/vnd.ahead.space' => 'ahead', 'application/vnd.airzip.filesecure.azf' => 'azf', 'application/vnd.airzip.filesecure.azs' => 'azs', 'application/vnd.amazon.ebook' => 'azw', 'application/vnd.americandynamics.acc' => 'acc', 'application/vnd.amiga.ami' => 'ami', 'application/vnd.android.package-archive' => 'apk', 'application/vnd.anser-web-certificate-issue-initiation' => 'cii', 'application/vnd.anser-web-funds-transfer-initiation' => 'fti', 'application/vnd.antix.game-component' => 'atx', 'application/vnd.apple.installer+xml' => 'mpkg', 'application/vnd.apple.mpegurl' => 'm3u8', 'application/vnd.aristanetworks.swi' => 'swi', 'application/vnd.astraea-software.iota' => 'iota', 'application/vnd.audiograph' => 'aep', 'application/vnd.blueice.multipass' => 'mpm', 'application/vnd.bmi' => 'bmi', 'application/vnd.businessobjects' => 'rep', 'application/vnd.chemdraw+xml' => 'cdxml', 'application/vnd.chipnuts.karaoke-mmd' => 'mmd', 'application/vnd.cinderella' => 'cdy', 'application/vnd.claymore' => 'cla', 'application/vnd.cloanto.rp9' => 'rp9', 'application/vnd.clonk.c4group' => 'c4g', 'application/vnd.cluetrust.cartomobile-config' => 'c11amc', 'application/vnd.cluetrust.cartomobile-config-pkg' => 'c11amz', 'application/vnd.commonspace' => 'csp', 'application/vnd.contact.cmsg' => 'cdbcmsg', 'application/vnd.cosmocaller' => 'cmc', 'application/vnd.crick.clicker' => 'clkx', 'application/vnd.crick.clicker.keyboard' => 'clkk', 'application/vnd.crick.clicker.palette' => 'clkp', 'application/vnd.crick.clicker.template' => 'clkt', 'application/vnd.crick.clicker.wordbank' => 'clkw', 'application/vnd.criticaltools.wbs+xml' => 'wbs', 'application/vnd.ctc-posml' => 'pml', 'application/vnd.cups-ppd' => 'ppd', 'application/vnd.curl.car' => 'car', 'application/vnd.curl.pcurl' => 'pcurl', 'application/vnd.dart' => 'dart', 'application/vnd.data-vision.rdz' => 'rdz', 'application/vnd.dece.data' => 'uvf', 'application/vnd.dece.ttml+xml' => 'uvt', 'application/vnd.dece.unspecified' => 'uvx', 'application/vnd.dece.zip' => 'uvz', 'application/vnd.denovo.fcselayout-link' => 'fe_launch', 'application/vnd.dna' => 'dna', 'application/vnd.dolby.mlp' => 'mlp', 'application/vnd.dpgraph' => 'dpg', 'application/vnd.dreamfactory' => 'dfac', 'application/vnd.ds-keypoint' => 'kpxx', 'application/vnd.dvb.ait' => 'ait', 'application/vnd.dvb.service' => 'svc', 'application/vnd.dynageo' => 'geo', 'application/vnd.ecowin.chart' => 'mag', 'application/vnd.enliven' => 'nml', 'application/vnd.epson.esf' => 'esf', 'application/vnd.epson.msf' => 'msf', 'application/vnd.epson.quickanime' => 'qam', 'application/vnd.epson.salt' => 'slt', 'application/vnd.epson.ssf' => 'ssf', 'application/vnd.eszigno3+xml' => 'es3', 'application/vnd.ezpix-album' => 'ez2', 'application/vnd.ezpix-package' => 'ez3', 'application/vnd.fdf' => 'fdf', 'application/vnd.fdsn.mseed' => 'mseed', 'application/vnd.fdsn.seed' => 'seed', 'application/vnd.flographit' => 'gph', 'application/vnd.fluxtime.clip' => 'ftc', 'application/vnd.framemaker' => 'fm', 'application/vnd.frogans.fnc' => 'fnc', 'application/vnd.frogans.ltf' => 'ltf', 'application/vnd.fsc.weblaunch' => 'fsc', 'application/vnd.fujitsu.oasys' => 'oas', 'application/vnd.fujitsu.oasys2' => 'oa2', 'application/vnd.fujitsu.oasys3' => 'oa3', 'application/vnd.fujitsu.oasysgp' => 'fg5', 'application/vnd.fujitsu.oasysprs' => 'bh2', 'application/vnd.fujixerox.ddd' => 'ddd', 'application/vnd.fujixerox.docuworks' => 'xdw', 'application/vnd.fujixerox.docuworks.binder' => 'xbd', 'application/vnd.fuzzysheet' => 'fzs', 'application/vnd.genomatix.tuxedo' => 'txd', 'application/vnd.geogebra.file' => 'ggb', 'application/vnd.geogebra.tool' => 'ggt', 'application/vnd.geometry-explorer' => 'gex', 'application/vnd.geonext' => 'gxt', 'application/vnd.geoplan' => 'g2w', 'application/vnd.geospace' => 'g3w', 'application/vnd.gmx' => 'gmx', 'application/vnd.google-earth.kml+xml' => 'kml', 'application/vnd.google-earth.kmz' => 'kmz', 'application/vnd.grafeq' => 'gqf', 'application/vnd.groove-account' => 'gac', 'application/vnd.groove-help' => 'ghf', 'application/vnd.groove-identity-message' => 'gim', 'application/vnd.groove-injector' => 'grv', 'application/vnd.groove-tool-message' => 'gtm', 'application/vnd.groove-tool-template' => 'tpl', 'application/vnd.groove-vcard' => 'vcg', 'application/vnd.hal+xml' => 'hal', 'application/vnd.handheld-entertainment+xml' => 'zmm', 'application/vnd.hbci' => 'hbci', 'application/vnd.hhe.lesson-player' => 'les', 'application/vnd.hp-hpgl' => 'hpgl', 'application/vnd.hp-hpid' => 'hpid', 'application/vnd.hp-hps' => 'hps', 'application/vnd.hp-jlyt' => 'jlt', 'application/vnd.hp-pcl' => 'pcl', 'application/vnd.hp-pclxl' => 'pclxl', 'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx', 'application/vnd.ibm.minipay' => 'mpy', 'application/vnd.ibm.modcap' => 'afp', 'application/vnd.ibm.rights-management' => 'irm', 'application/vnd.ibm.secure-container' => 'sc', 'application/vnd.iccprofile' => 'icc', 'application/vnd.igloader' => 'igl', 'application/vnd.immervision-ivp' => 'ivp', 'application/vnd.immervision-ivu' => 'ivu', 'application/vnd.insors.igm' => 'igm', 'application/vnd.intercon.formnet' => 'xpw', 'application/vnd.intergeo' => 'i2g', 'application/vnd.intu.qbo' => 'qbo', 'application/vnd.intu.qfx' => 'qfx', 'application/vnd.ipunplugged.rcprofile' => 'rcprofile', 'application/vnd.irepository.package+xml' => 'irp', 'application/vnd.is-xpr' => 'xpr', 'application/vnd.isac.fcs' => 'fcs', 'application/vnd.jam' => 'jam', 'application/vnd.jcp.javame.midlet-rms' => 'rms', 'application/vnd.jisp' => 'jisp', 'application/vnd.joost.joda-archive' => 'joda', 'application/vnd.kahootz' => 'ktz', 'application/vnd.kde.karbon' => 'karbon', 'application/vnd.kde.kchart' => 'chrt', 'application/vnd.kde.kformula' => 'kfo', 'application/vnd.kde.kivio' => 'flw', 'application/vnd.kde.kontour' => 'kon', 'application/vnd.kde.kpresenter' => 'kpr', 'application/vnd.kde.kspread' => 'ksp', 'application/vnd.kde.kword' => 'kwd', 'application/vnd.kenameaapp' => 'htke', 'application/vnd.kidspiration' => 'kia', 'application/vnd.kinar' => 'kne', 'application/vnd.koan' => 'skp', 'application/vnd.kodak-descriptor' => 'sse', 'application/vnd.las.las+xml' => 'lasxml', 'application/vnd.llamagraphics.life-balance.desktop' => 'lbd', 'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe', 'application/vnd.lotus-1-2-3' => '123', 'application/vnd.lotus-approach' => 'apr', 'application/vnd.lotus-freelance' => 'pre', 'application/vnd.lotus-notes' => 'nsf', 'application/vnd.lotus-organizer' => 'org', 'application/vnd.lotus-screencam' => 'scm', 'application/vnd.lotus-wordpro' => 'lwp', 'application/vnd.macports.portpkg' => 'portpkg', 'application/vnd.mcd' => 'mcd', 'application/vnd.medcalcdata' => 'mc1', 'application/vnd.mediastation.cdkey' => 'cdkey', 'application/vnd.mfer' => 'mwf', 'application/vnd.mfmp' => 'mfm', 'application/vnd.micrografx.flo' => 'flo', 'application/vnd.micrografx.igx' => 'igx', 'application/vnd.mif' => 'mif', 'application/vnd.mobius.daf' => 'daf', 'application/vnd.mobius.dis' => 'dis', 'application/vnd.mobius.mbk' => 'mbk', 'application/vnd.mobius.mqy' => 'mqy', 'application/vnd.mobius.msl' => 'msl', 'application/vnd.mobius.plc' => 'plc', 'application/vnd.mobius.txf' => 'txf', 'application/vnd.mophun.application' => 'mpn', 'application/vnd.mophun.certificate' => 'mpc', 'application/vnd.mozilla.xul+xml' => 'xul', 'application/vnd.ms-artgalry' => 'cil', 'application/vnd.ms-cab-compressed' => 'cab', 'application/vnd.ms-excel' => 'xls', 'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam', 'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb', 'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm', 'application/vnd.ms-excel.template.macroenabled.12' => 'xltm', 'application/vnd.ms-fontobject' => 'eot', 'application/vnd.ms-htmlhelp' => 'chm', 'application/vnd.ms-ims' => 'ims', 'application/vnd.ms-lrm' => 'lrm', 'application/vnd.ms-officetheme' => 'thmx', 'application/vnd.ms-pki.seccat' => 'cat', 'application/vnd.ms-pki.stl' => 'stl', 'application/vnd.ms-powerpoint' => 'ppt', 'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam', 'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm', 'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm', 'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm', 'application/vnd.ms-project' => 'mpp', 'application/vnd.ms-word.document.macroenabled.12' => 'docm', 'application/vnd.ms-word.template.macroenabled.12' => 'dotm', 'application/vnd.ms-works' => 'wps', 'application/vnd.ms-wpl' => 'wpl', 'application/vnd.ms-xpsdocument' => 'xps', 'application/vnd.mseq' => 'mseq', 'application/vnd.musician' => 'mus', 'application/vnd.muvee.style' => 'msty', 'application/vnd.mynfc' => 'taglet', 'application/vnd.neurolanguage.nlu' => 'nlu', 'application/vnd.nitf' => 'ntf', 'application/vnd.noblenet-directory' => 'nnd', 'application/vnd.noblenet-sealer' => 'nns', 'application/vnd.noblenet-web' => 'nnw', 'application/vnd.nokia.n-gage.data' => 'ngdat', 'application/vnd.nokia.n-gage.symbian.install' => 'n-gage', 'application/vnd.nokia.radio-preset' => 'rpst', 'application/vnd.nokia.radio-presets' => 'rpss', 'application/vnd.novadigm.edm' => 'edm', 'application/vnd.novadigm.edx' => 'edx', 'application/vnd.novadigm.ext' => 'ext', 'application/vnd.oasis.opendocument.chart' => 'odc', 'application/vnd.oasis.opendocument.chart-template' => 'otc', 'application/vnd.oasis.opendocument.database' => 'odb', 'application/vnd.oasis.opendocument.formula' => 'odf', 'application/vnd.oasis.opendocument.formula-template' => 'odft', 'application/vnd.oasis.opendocument.graphics' => 'odg', 'application/vnd.oasis.opendocument.graphics-template' => 'otg', 'application/vnd.oasis.opendocument.image' => 'odi', 'application/vnd.oasis.opendocument.image-template' => 'oti', 'application/vnd.oasis.opendocument.presentation' => 'odp', 'application/vnd.oasis.opendocument.presentation-template' => 'otp', 'application/vnd.oasis.opendocument.spreadsheet' => 'ods', 'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots', 'application/vnd.oasis.opendocument.text' => 'odt', 'application/vnd.oasis.opendocument.text-master' => 'odm', 'application/vnd.oasis.opendocument.text-template' => 'ott', 'application/vnd.oasis.opendocument.text-web' => 'oth', 'application/vnd.olpc-sugar' => 'xo', 'application/vnd.oma.dd2+xml' => 'dd2', 'application/vnd.openofficeorg.extension' => 'oxt', 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx', 'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx', 'application/vnd.osgeo.mapguide.package' => 'mgp', 'application/vnd.osgi.dp' => 'dp', 'application/vnd.osgi.subsystem' => 'esa', 'application/vnd.palm' => 'pdb', 'application/vnd.pawaafile' => 'paw', 'application/vnd.pg.format' => 'str', 'application/vnd.pg.osasli' => 'ei6', 'application/vnd.picsel' => 'efif', 'application/vnd.pmi.widget' => 'wg', 'application/vnd.pocketlearn' => 'plf', 'application/vnd.powerbuilder6' => 'pbd', 'application/vnd.previewsystems.box' => 'box', 'application/vnd.proteus.magazine' => 'mgz', 'application/vnd.publishare-delta-tree' => 'qps', 'application/vnd.pvi.ptid1' => 'ptid', 'application/vnd.quark.quarkxpress' => 'qxd', 'application/vnd.realvnc.bed' => 'bed', 'application/vnd.recordare.musicxml' => 'mxl', 'application/vnd.recordare.musicxml+xml' => 'musicxml', 'application/vnd.rig.cryptonote' => 'cryptonote', 'application/vnd.rim.cod' => 'cod', 'application/vnd.rn-realmedia' => 'rm', 'application/vnd.rn-realmedia-vbr' => 'rmvb', 'application/vnd.route66.link66+xml' => 'link66', 'application/vnd.sailingtracker.track' => 'st', 'application/vnd.seemail' => 'see', 'application/vnd.sema' => 'sema', 'application/vnd.semd' => 'semd', 'application/vnd.semf' => 'semf', 'application/vnd.shana.informed.formdata' => 'ifm', 'application/vnd.shana.informed.formtemplate' => 'itp', 'application/vnd.shana.informed.interchange' => 'iif', 'application/vnd.shana.informed.package' => 'ipk', 'application/vnd.simtech-mindmapper' => 'twd', 'application/vnd.smaf' => 'mmf', 'application/vnd.smart.teacher' => 'teacher', 'application/vnd.solent.sdkm+xml' => 'sdkm', 'application/vnd.spotfire.dxp' => 'dxp', 'application/vnd.spotfire.sfs' => 'sfs', 'application/vnd.stardivision.calc' => 'sdc', 'application/vnd.stardivision.draw' => 'sda', 'application/vnd.stardivision.impress' => 'sdd', 'application/vnd.stardivision.math' => 'smf', 'application/vnd.stardivision.writer' => 'sdw', 'application/vnd.stardivision.writer-global' => 'sgl', 'application/vnd.stepmania.package' => 'smzip', 'application/vnd.stepmania.stepchart' => 'sm', 'application/vnd.sun.xml.calc' => 'sxc', 'application/vnd.sun.xml.calc.template' => 'stc', 'application/vnd.sun.xml.draw' => 'sxd', 'application/vnd.sun.xml.draw.template' => 'std', 'application/vnd.sun.xml.impress' => 'sxi', 'application/vnd.sun.xml.impress.template' => 'sti', 'application/vnd.sun.xml.math' => 'sxm', 'application/vnd.sun.xml.writer' => 'sxw', 'application/vnd.sun.xml.writer.global' => 'sxg', 'application/vnd.sun.xml.writer.template' => 'stw', 'application/vnd.sus-calendar' => 'sus', 'application/vnd.svd' => 'svd', 'application/vnd.symbian.install' => 'sis', 'application/vnd.syncml+xml' => 'xsm', 'application/vnd.syncml.dm+wbxml' => 'bdm', 'application/vnd.syncml.dm+xml' => 'xdm', 'application/vnd.tao.intent-module-archive' => 'tao', 'application/vnd.tcpdump.pcap' => 'pcap', 'application/vnd.tmobile-livetv' => 'tmo', 'application/vnd.trid.tpt' => 'tpt', 'application/vnd.triscape.mxs' => 'mxs', 'application/vnd.trueapp' => 'tra', 'application/vnd.ufdl' => 'ufd', 'application/vnd.uiq.theme' => 'utz', 'application/vnd.umajin' => 'umj', 'application/vnd.unity' => 'unityweb', 'application/vnd.uoml+xml' => 'uoml', 'application/vnd.vcx' => 'vcx', 'application/vnd.visio' => 'vsd', 'application/vnd.visionary' => 'vis', 'application/vnd.vsf' => 'vsf', 'application/vnd.wap.wbxml' => 'wbxml', 'application/vnd.wap.wmlc' => 'wmlc', 'application/vnd.wap.wmlscriptc' => 'wmlsc', 'application/vnd.webturbo' => 'wtb', 'application/vnd.wolfram.player' => 'nbp', 'application/vnd.wordperfect' => 'wpd', 'application/vnd.wqd' => 'wqd', 'application/vnd.wt.stf' => 'stf', 'application/vnd.xara' => 'xar', 'application/vnd.xfdl' => 'xfdl', 'application/vnd.yamaha.hv-dic' => 'hvd', 'application/vnd.yamaha.hv-script' => 'hvs', 'application/vnd.yamaha.hv-voice' => 'hvp', 'application/vnd.yamaha.openscoreformat' => 'osf', 'application/vnd.yamaha.openscoreformat.osfpvg+xml' => 'osfpvg', 'application/vnd.yamaha.smaf-audio' => 'saf', 'application/vnd.yamaha.smaf-phrase' => 'spf', 'application/vnd.yellowriver-custom-menu' => 'cmp', 'application/vnd.zul' => 'zir', 'application/vnd.zzazz.deck+xml' => 'zaz', 'application/voicexml+xml' => 'vxml', 'application/widget' => 'wgt', 'application/winhlp' => 'hlp', 'application/wsdl+xml' => 'wsdl', 'application/wspolicy+xml' => 'wspolicy', 'application/x-7z-compressed' => '7z', 'application/x-abiword' => 'abw', 'application/x-ace-compressed' => 'ace', 'application/x-apple-diskimage' => 'dmg', 'application/x-authorware-bin' => 'aab', 'application/x-authorware-map' => 'aam', 'application/x-authorware-seg' => 'aas', 'application/x-bcpio' => 'bcpio', 'application/x-bittorrent' => 'torrent', 'application/x-blorb' => 'blb', 'application/x-bzip' => 'bz', 'application/x-bzip2' => 'bz2', 'application/x-cbr' => 'cbr', 'application/x-cdlink' => 'vcd', 'application/x-cfs-compressed' => 'cfs', 'application/x-chat' => 'chat', 'application/x-chess-pgn' => 'pgn', 'application/x-conference' => 'nsc', 'application/x-cpio' => 'cpio', 'application/x-csh' => 'csh', 'application/x-debian-package' => 'deb', 'application/x-dgc-compressed' => 'dgc', 'application/x-director' => 'dir', 'application/x-doom' => 'wad', 'application/x-dtbncx+xml' => 'ncx', 'application/x-dtbook+xml' => 'dtb', 'application/x-dtbresource+xml' => 'res', 'application/x-dvi' => 'dvi', 'application/x-envoy' => 'evy', 'application/x-eva' => 'eva', 'application/x-font-bdf' => 'bdf', 'application/x-font-ghostscript' => 'gsf', 'application/x-font-linux-psf' => 'psf', 'application/x-font-otf' => 'otf', 'application/x-font-pcf' => 'pcf', 'application/x-font-snf' => 'snf', 'application/x-font-ttf' => 'ttf', 'application/x-font-type1' => 'pfa', 'application/x-font-woff' => 'woff', 'application/x-freearc' => 'arc', 'application/x-futuresplash' => 'spl', 'application/x-gca-compressed' => 'gca', 'application/x-glulx' => 'ulx', 'application/x-gnumeric' => 'gnumeric', 'application/x-gramps-xml' => 'gramps', 'application/x-gtar' => 'gtar', 'application/x-hdf' => 'hdf', 'application/x-install-instructions' => 'install', 'application/x-iso9660-image' => 'iso', 'application/x-java-jnlp-file' => 'jnlp', 'application/x-latex' => 'latex', 'application/x-lzh-compressed' => 'lzh', 'application/x-mie' => 'mie', 'application/x-mobipocket-ebook' => 'prc', 'application/x-ms-application' => 'application', 'application/x-ms-shortcut' => 'lnk', 'application/x-ms-wmd' => 'wmd', 'application/x-ms-wmz' => 'wmz', 'application/x-ms-xbap' => 'xbap', 'application/x-msaccess' => 'mdb', 'application/x-msbinder' => 'obd', 'application/x-mscardfile' => 'crd', 'application/x-msclip' => 'clp', 'application/x-msdownload' => 'exe', 'application/x-msmediaview' => 'mvb', 'application/x-msmetafile' => 'wmf', 'application/x-msmoney' => 'mny', 'application/x-mspublisher' => 'pub', 'application/x-msschedule' => 'scd', 'application/x-msterminal' => 'trm', 'application/x-mswrite' => 'wri', 'application/x-netcdf' => 'nc', 'application/x-nzb' => 'nzb', 'application/x-pkcs12' => 'p12', 'application/x-pkcs7-certificates' => 'p7b', 'application/x-pkcs7-certreqresp' => 'p7r', 'application/x-rar-compressed' => 'rar', 'application/x-rar' => 'rar', 'application/x-research-info-systems' => 'ris', 'application/x-sh' => 'sh', 'application/x-shar' => 'shar', 'application/x-shockwave-flash' => 'swf', 'application/x-silverlight-app' => 'xap', 'application/x-sql' => 'sql', 'application/x-stuffit' => 'sit', 'application/x-stuffitx' => 'sitx', 'application/x-subrip' => 'srt', 'application/x-sv4cpio' => 'sv4cpio', 'application/x-sv4crc' => 'sv4crc', 'application/x-t3vm-image' => 't3', 'application/x-tads' => 'gam', 'application/x-tar' => 'tar', 'application/x-tcl' => 'tcl', 'application/x-tex' => 'tex', 'application/x-tex-tfm' => 'tfm', 'application/x-texinfo' => 'texinfo', 'application/x-tgif' => 'obj', 'application/x-ustar' => 'ustar', 'application/x-wais-source' => 'src', 'application/x-x509-ca-cert' => 'der', 'application/x-xfig' => 'fig', 'application/x-xliff+xml' => 'xlf', 'application/x-xpinstall' => 'xpi', 'application/x-xz' => 'xz', 'application/x-zmachine' => 'z1', 'application/xaml+xml' => 'xaml', 'application/xcap-diff+xml' => 'xdf', 'application/xenc+xml' => 'xenc', 'application/xhtml+xml' => 'xhtml', 'application/xml' => 'xml', 'application/xml-dtd' => 'dtd', 'application/xop+xml' => 'xop', 'application/xproc+xml' => 'xpl', 'application/xslt+xml' => 'xslt', 'application/xspf+xml' => 'xspf', 'application/xv+xml' => 'mxml', 'application/yang' => 'yang', 'application/yin+xml' => 'yin', 'application/zip' => 'zip', 'audio/adpcm' => 'adp', 'audio/basic' => 'au', 'audio/midi' => 'mid', 'audio/mp3' => 'mp3', 'audio/mp4' => 'mp4a', 'audio/mpeg' => 'mpga', 'audio/ogg' => 'oga', 'audio/s3m' => 's3m', 'audio/silk' => 'sil', 'audio/vnd.dece.audio' => 'uva', 'audio/vnd.digital-winds' => 'eol', 'audio/vnd.dra' => 'dra', 'audio/vnd.dts' => 'dts', 'audio/vnd.dts.hd' => 'dtshd', 'audio/vnd.lucent.voice' => 'lvp', 'audio/vnd.ms-playready.media.pya' => 'pya', 'audio/vnd.nuera.ecelp4800' => 'ecelp4800', 'audio/vnd.nuera.ecelp7470' => 'ecelp7470', 'audio/vnd.nuera.ecelp9600' => 'ecelp9600', 'audio/vnd.rip' => 'rip', 'audio/webm' => 'weba', 'audio/x-aac' => 'aac', 'audio/x-aiff' => 'aif', 'audio/x-caf' => 'caf', 'audio/x-flac' => 'flac', 'audio/x-matroska' => 'mka', 'audio/x-mpegurl' => 'm3u', 'audio/x-ms-wax' => 'wax', 'audio/x-ms-wma' => 'wma', 'audio/x-pn-realaudio' => 'ram', 'audio/x-pn-realaudio-plugin' => 'rmp', 'audio/x-wav' => 'wav', 'audio/xm' => 'xm', 'chemical/x-cdx' => 'cdx', 'chemical/x-cif' => 'cif', 'chemical/x-cmdf' => 'cmdf', 'chemical/x-cml' => 'cml', 'chemical/x-csml' => 'csml', 'chemical/x-xyz' => 'xyz', 'image/bmp' => 'bmp', 'image/x-ms-bmp' => 'bmp', 'image/cgm' => 'cgm', 'image/g3fax' => 'g3', 'image/gif' => 'gif', 'image/ief' => 'ief', 'image/jpeg' => 'jpeg', 'image/pjpeg' => 'jpeg', 'image/ktx' => 'ktx', 'image/png' => 'png', 'image/prs.btif' => 'btif', 'image/sgi' => 'sgi', 'image/svg+xml' => 'svg', 'image/tiff' => 'tiff', 'image/vnd.adobe.photoshop' => 'psd', 'image/vnd.dece.graphic' => 'uvi', 'image/vnd.dvb.subtitle' => 'sub', 'image/vnd.djvu' => 'djvu', 'image/vnd.dwg' => 'dwg', 'image/vnd.dxf' => 'dxf', 'image/vnd.fastbidsheet' => 'fbs', 'image/vnd.fpx' => 'fpx', 'image/vnd.fst' => 'fst', 'image/vnd.fujixerox.edmics-mmr' => 'mmr', 'image/vnd.fujixerox.edmics-rlc' => 'rlc', 'image/vnd.ms-modi' => 'mdi', 'image/vnd.ms-photo' => 'wdp', 'image/vnd.net-fpx' => 'npx', 'image/vnd.wap.wbmp' => 'wbmp', 'image/vnd.xiff' => 'xif', 'image/webp' => 'webp', 'image/x-3ds' => '3ds', 'image/x-cmu-raster' => 'ras', 'image/x-cmx' => 'cmx', 'image/x-freehand' => 'fh', 'image/x-icon' => 'ico', 'image/x-mrsid-image' => 'sid', 'image/x-pcx' => 'pcx', 'image/x-pict' => 'pic', 'image/x-portable-anymap' => 'pnm', 'image/x-portable-bitmap' => 'pbm', 'image/x-portable-graymap' => 'pgm', 'image/x-portable-pixmap' => 'ppm', 'image/x-rgb' => 'rgb', 'image/x-tga' => 'tga', 'image/x-xbitmap' => 'xbm', 'image/x-xpixmap' => 'xpm', 'image/x-xwindowdump' => 'xwd', 'message/rfc822' => 'eml', 'model/iges' => 'igs', 'model/mesh' => 'msh', 'model/vnd.collada+xml' => 'dae', 'model/vnd.dwf' => 'dwf', 'model/vnd.gdl' => 'gdl', 'model/vnd.gtw' => 'gtw', 'model/vnd.mts' => 'mts', 'model/vnd.vtu' => 'vtu', 'model/vrml' => 'wrl', 'model/x3d+binary' => 'x3db', 'model/x3d+vrml' => 'x3dv', 'model/x3d+xml' => 'x3d', 'text/cache-manifest' => 'appcache', 'text/calendar' => 'ics', 'text/css' => 'css', 'text/csv' => 'csv', 'text/html' => 'html', 'text/n3' => 'n3', 'text/plain' => 'txt', 'text/prs.lines.tag' => 'dsc', 'text/richtext' => 'rtx', 'text/rtf' => 'rtf', 'text/sgml' => 'sgml', 'text/tab-separated-values' => 'tsv', 'text/troff' => 't', 'text/turtle' => 'ttl', 'text/uri-list' => 'uri', 'text/vcard' => 'vcard', 'text/vnd.curl' => 'curl', 'text/vnd.curl.dcurl' => 'dcurl', 'text/vnd.curl.scurl' => 'scurl', 'text/vnd.curl.mcurl' => 'mcurl', 'text/vnd.dvb.subtitle' => 'sub', 'text/vnd.fly' => 'fly', 'text/vnd.fmi.flexstor' => 'flx', 'text/vnd.graphviz' => 'gv', 'text/vnd.in3d.3dml' => '3dml', 'text/vnd.in3d.spot' => 'spot', 'text/vnd.sun.j2me.app-descriptor' => 'jad', 'text/vnd.wap.wml' => 'wml', 'text/vnd.wap.wmlscript' => 'wmls', 'text/x-asm' => 's', 'text/x-c' => 'c', 'text/x-fortran' => 'f', 'text/x-pascal' => 'p', 'text/x-java-source' => 'java', 'text/x-opml' => 'opml', 'text/x-nfo' => 'nfo', 'text/x-setext' => 'etx', 'text/x-sfv' => 'sfv', 'text/x-uuencode' => 'uu', 'text/x-vcalendar' => 'vcs', 'text/x-vcard' => 'vcf', 'video/3gpp' => '3gp', 'video/3gpp2' => '3g2', 'video/h261' => 'h261', 'video/h263' => 'h263', 'video/h264' => 'h264', 'video/jpeg' => 'jpgv', 'video/jpm' => 'jpm', 'video/mj2' => 'mj2', 'video/mp4' => 'mp4', 'video/mpeg' => 'mpeg', 'video/ogg' => 'ogv', 'video/quicktime' => 'qt', 'video/vnd.dece.hd' => 'uvh', 'video/vnd.dece.mobile' => 'uvm', 'video/vnd.dece.pd' => 'uvp', 'video/vnd.dece.sd' => 'uvs', 'video/vnd.dece.video' => 'uvv', 'video/vnd.dvb.file' => 'dvb', 'video/vnd.fvt' => 'fvt', 'video/vnd.mpegurl' => 'mxu', 'video/vnd.ms-playready.media.pyv' => 'pyv', 'video/vnd.uvvu.mp4' => 'uvu', 'video/vnd.vivo' => 'viv', 'video/webm' => 'webm', 'video/x-f4v' => 'f4v', 'video/x-fli' => 'fli', 'video/x-flv' => 'flv', 'video/x-m4v' => 'm4v', 'video/x-matroska' => 'mkv', 'video/x-mng' => 'mng', 'video/x-ms-asf' => 'asf', 'video/x-ms-vob' => 'vob', 'video/x-ms-wm' => 'wm', 'video/x-ms-wmv' => 'wmv', 'video/x-ms-wmx' => 'wmx', 'video/x-ms-wvx' => 'wvx', 'video/x-msvideo' => 'avi', 'video/x-sgi-movie' => 'movie', 'video/x-smv' => 'smv', 'x-conference/x-cooltalk' => 'ice']; - /** - * Get extension by mime type - * - * @param string $mimeType - * @return string|null - */ - public function getExtension(string $mimeType) - { - return isset($this->mimeTypes[$mimeType]) ? $this->mimeTypes[$mimeType] : null; - } - /** - * Get mime type by extension - * - * @param string $extension - * @return string|null - */ - public function getMimeType(string $extension) - { - $key = \array_search($extension, $this->mimeTypes); - return $key ?: null; - } -} diff --git a/dependencies/rakit/validation/src/MissingRequiredParameterException.php b/dependencies/rakit/validation/src/MissingRequiredParameterException.php deleted file mode 100644 index 53f96ea..0000000 --- a/dependencies/rakit/validation/src/MissingRequiredParameterException.php +++ /dev/null @@ -1,7 +0,0 @@ -validation = $validation; - } - /** - * Set key - * - * @param string $key - * @return void - */ - public function setKey(string $key) - { - $this->key = $key; - } - /** - * Get key - * - * @return string - */ - public function getKey() - { - return $this->key ?: \get_class($this); - } - /** - * Set attribute - * - * @param \Rakit\Validation\Attribute $attribute - * @return void - */ - public function setAttribute(Attribute $attribute) - { - $this->attribute = $attribute; - } - /** - * Get attribute - * - * @return \Rakit\Validation\Attribute|null - */ - public function getAttribute() - { - return $this->attribute; - } - /** - * Get parameters - * - * @return array - */ - public function getParameters() : array - { - return $this->params; - } - /** - * Set params - * - * @param array $params - * @return \Rakit\Validation\Rule - */ - public function setParameters(array $params) : Rule - { - $this->params = \array_merge($this->params, $params); - return $this; - } - /** - * Set parameters - * - * @param string $key - * @param mixed $value - * @return \Rakit\Validation\Rule - */ - public function setParameter(string $key, $value) : Rule - { - $this->params[$key] = $value; - return $this; - } - /** - * Fill $params to $this->params - * - * @param array $params - * @return \Rakit\Validation\Rule - */ - public function fillParameters(array $params) : Rule - { - foreach ($this->fillableParams as $key) { - if (empty($params)) { - break; - } - $this->params[$key] = \array_shift($params); - } - return $this; - } - /** - * Get parameter from given $key, return null if it not exists - * - * @param string $key - * @return mixed - */ - public function parameter(string $key) - { - return isset($this->params[$key]) ? $this->params[$key] : null; - } - /** - * Set parameter text that can be displayed in error message using ':param_key' - * - * @param string $key - * @param string $text - * @return void - */ - public function setParameterText(string $key, string $text) - { - $this->paramsTexts[$key] = $text; - } - /** - * Get $paramsTexts - * - * @return array - */ - public function getParametersTexts() : array - { - return $this->paramsTexts; - } - /** - * Check whether this rule is implicit - * - * @return boolean - */ - public function isImplicit() : bool - { - return $this->implicit; - } - /** - * Just alias of setMessage - * - * @param string $message - * @return \Rakit\Validation\Rule - */ - public function message(string $message) : Rule - { - return $this->setMessage($message); - } - /** - * Set message - * - * @param string $message - * @return \Rakit\Validation\Rule - */ - public function setMessage(string $message) : Rule - { - $this->message = $message; - return $this; - } - /** - * Get message - * - * @return string - */ - public function getMessage() : string - { - return $this->message; - } - /** - * Check given $params must be exists - * - * @param array $params - * @return void - * @throws \Rakit\Validation\MissingRequiredParameterException - */ - protected function requireParameters(array $params) - { - foreach ($params as $param) { - if (!isset($this->params[$param])) { - $rule = $this->getKey(); - throw new MissingRequiredParameterException("Missing required parameter '{$param}' on rule '{$rule}'"); - } - } - } -} diff --git a/dependencies/rakit/validation/src/RuleNotFoundException.php b/dependencies/rakit/validation/src/RuleNotFoundException.php deleted file mode 100644 index 3275fa5..0000000 --- a/dependencies/rakit/validation/src/RuleNotFoundException.php +++ /dev/null @@ -1,8 +0,0 @@ -requireParameters($this->fillableParams); - $time = $this->parameter('time'); - if (!$this->isValidDate($value)) { - throw $this->throwException($value); - } - if (!$this->isValidDate($time)) { - throw $this->throwException($time); - } - return $this->getTimeStamp($time) < $this->getTimeStamp($value); - } -} diff --git a/dependencies/rakit/validation/src/Rules/Alpha.php b/dependencies/rakit/validation/src/Rules/Alpha.php deleted file mode 100644 index 1802b8d..0000000 --- a/dependencies/rakit/validation/src/Rules/Alpha.php +++ /dev/null @@ -1,20 +0,0 @@ - 0; - } -} diff --git a/dependencies/rakit/validation/src/Rules/AlphaNum.php b/dependencies/rakit/validation/src/Rules/AlphaNum.php deleted file mode 100644 index 5d6f764..0000000 --- a/dependencies/rakit/validation/src/Rules/AlphaNum.php +++ /dev/null @@ -1,23 +0,0 @@ - 0; - } -} diff --git a/dependencies/rakit/validation/src/Rules/AlphaSpaces.php b/dependencies/rakit/validation/src/Rules/AlphaSpaces.php deleted file mode 100644 index d9030db..0000000 --- a/dependencies/rakit/validation/src/Rules/AlphaSpaces.php +++ /dev/null @@ -1,23 +0,0 @@ - 0; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Before.php b/dependencies/rakit/validation/src/Rules/Before.php deleted file mode 100644 index 7ba0715..0000000 --- a/dependencies/rakit/validation/src/Rules/Before.php +++ /dev/null @@ -1,32 +0,0 @@ -requireParameters($this->fillableParams); - $time = $this->parameter('time'); - if (!$this->isValidDate($value)) { - throw $this->throwException($value); - } - if (!$this->isValidDate($time)) { - throw $this->throwException($time); - } - return $this->getTimeStamp($time) > $this->getTimeStamp($value); - } -} diff --git a/dependencies/rakit/validation/src/Rules/Between.php b/dependencies/rakit/validation/src/Rules/Between.php deleted file mode 100644 index 56d77d8..0000000 --- a/dependencies/rakit/validation/src/Rules/Between.php +++ /dev/null @@ -1,30 +0,0 @@ -requireParameters($this->fillableParams); - $min = $this->getBytesSize($this->parameter('min')); - $max = $this->getBytesSize($this->parameter('max')); - $valueSize = $this->getValueSize($value); - if (!\is_numeric($valueSize)) { - return \false; - } - return $valueSize >= $min && $valueSize <= $max; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Boolean.php b/dependencies/rakit/validation/src/Rules/Boolean.php deleted file mode 100644 index c8d29cd..0000000 --- a/dependencies/rakit/validation/src/Rules/Boolean.php +++ /dev/null @@ -1,21 +0,0 @@ -setParameter('callback', $callback); - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - * @throws \Exception - */ - public function check($value) : bool - { - $this->requireParameters($this->fillableParams); - $callback = $this->parameter('callback'); - if (\false === $callback instanceof Closure) { - $key = $this->attribute->getKey(); - throw new InvalidArgumentException("Callback rule for '{$key}' is not callable."); - } - $callback = $callback->bindTo($this); - $invalidMessage = $callback($value); - if (\is_string($invalidMessage)) { - $this->setMessage($invalidMessage); - return \false; - } elseif (\false === $invalidMessage) { - return \false; - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Date.php b/dependencies/rakit/validation/src/Rules/Date.php deleted file mode 100644 index e61f3bc..0000000 --- a/dependencies/rakit/validation/src/Rules/Date.php +++ /dev/null @@ -1,26 +0,0 @@ - 'Y-m-d']; - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters($this->fillableParams); - $format = $this->parameter('format'); - return \date_create_from_format($format, $value) !== \false; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Defaults.php b/dependencies/rakit/validation/src/Rules/Defaults.php deleted file mode 100644 index b0faa70..0000000 --- a/dependencies/rakit/validation/src/Rules/Defaults.php +++ /dev/null @@ -1,43 +0,0 @@ -requireParameters($this->fillableParams); - $default = $this->parameter('default'); - return \true; - } - /** - * {@inheritDoc} - */ - public function modifyValue($value) - { - return $this->isEmptyValue($value) ? $this->parameter('default') : $value; - } - /** - * Check $value is empty value - * - * @param mixed $value - * @return boolean - */ - protected function isEmptyValue($value) : bool - { - $requiredValidator = new Required(); - return \false === $requiredValidator->check($value, []); - } -} diff --git a/dependencies/rakit/validation/src/Rules/Different.php b/dependencies/rakit/validation/src/Rules/Different.php deleted file mode 100644 index d08b701..0000000 --- a/dependencies/rakit/validation/src/Rules/Different.php +++ /dev/null @@ -1,25 +0,0 @@ -requireParameters($this->fillableParams); - $field = $this->parameter('field'); - $anotherValue = $this->validation->getValue($field); - return $value != $anotherValue; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Digits.php b/dependencies/rakit/validation/src/Rules/Digits.php deleted file mode 100644 index d5d1741..0000000 --- a/dependencies/rakit/validation/src/Rules/Digits.php +++ /dev/null @@ -1,24 +0,0 @@ -requireParameters($this->fillableParams); - $length = (int) $this->parameter('length'); - return !\preg_match('/[^0-9]/', $value) && \strlen((string) $value) == $length; - } -} diff --git a/dependencies/rakit/validation/src/Rules/DigitsBetween.php b/dependencies/rakit/validation/src/Rules/DigitsBetween.php deleted file mode 100644 index 6c87d85..0000000 --- a/dependencies/rakit/validation/src/Rules/DigitsBetween.php +++ /dev/null @@ -1,26 +0,0 @@ -requireParameters($this->fillableParams); - $min = (int) $this->parameter('min'); - $max = (int) $this->parameter('max'); - $length = \strlen((string) $value); - return !\preg_match('/[^0-9]/', $value) && $length >= $min && $length <= $max; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Email.php b/dependencies/rakit/validation/src/Rules/Email.php deleted file mode 100644 index 5fa09c3..0000000 --- a/dependencies/rakit/validation/src/Rules/Email.php +++ /dev/null @@ -1,20 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - if (\count($params) == 1 && \is_array($params[0])) { - $params = $params[0]; - } - $this->params['allowed_extensions'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['allowed_extensions']); - $allowedExtensions = $this->parameter('allowed_extensions'); - foreach ($allowedExtensions as $key => $ext) { - $allowedExtensions[$key] = \ltrim($ext, '.'); - } - $or = $this->validation ? $this->validation->getTranslation('or') : 'or'; - $allowedExtensionsText = Helper::join(Helper::wraps($allowedExtensions, ".", ""), ', ', ", {$or} "); - $this->setParameterText('allowed_extensions', $allowedExtensionsText); - $ext = \strtolower(\pathinfo($value, \PATHINFO_EXTENSION)); - return $ext && \in_array($ext, $allowedExtensions) ? \true : \false; - } -} diff --git a/dependencies/rakit/validation/src/Rules/In.php b/dependencies/rakit/validation/src/Rules/In.php deleted file mode 100644 index 2551592..0000000 --- a/dependencies/rakit/validation/src/Rules/In.php +++ /dev/null @@ -1,52 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - if (\count($params) == 1 && \is_array($params[0])) { - $params = $params[0]; - } - $this->params['allowed_values'] = $params; - return $this; - } - /** - * Set strict value - * - * @param bool $strict - * @return void - */ - public function strict(bool $strict = \true) - { - $this->strict = $strict; - } - /** - * Check $value is existed - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['allowed_values']); - $allowedValues = $this->parameter('allowed_values'); - $or = $this->validation ? $this->validation->getTranslation('or') : 'or'; - $allowedValuesText = Helper::join(Helper::wraps($allowedValues, "'"), ', ', ", {$or} "); - $this->setParameterText('allowed_values', $allowedValuesText); - return \in_array($value, $allowedValues, $this->strict); - } -} diff --git a/dependencies/rakit/validation/src/Rules/Integer.php b/dependencies/rakit/validation/src/Rules/Integer.php deleted file mode 100644 index 2887234..0000000 --- a/dependencies/rakit/validation/src/Rules/Integer.php +++ /dev/null @@ -1,20 +0,0 @@ -requireParameters($this->fillableParams); - $max = $this->getBytesSize($this->parameter('max')); - $valueSize = $this->getValueSize($value); - if (!\is_numeric($valueSize)) { - return \false; - } - return $valueSize <= $max; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Mimes.php b/dependencies/rakit/validation/src/Rules/Mimes.php deleted file mode 100644 index 256debb..0000000 --- a/dependencies/rakit/validation/src/Rules/Mimes.php +++ /dev/null @@ -1,78 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->allowTypes($params); - return $this; - } - /** - * Given $types and assign $this->params - * - * @param mixed $types - * @return self - */ - public function allowTypes($types) : Rule - { - if (\is_string($types)) { - $types = \explode('|', $types); - } - $this->params['allowed_types'] = $types; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $allowedTypes = $this->parameter('allowed_types'); - if ($allowedTypes) { - $or = $this->validation ? $this->validation->getTranslation('or') : 'or'; - $this->setParameterText('allowed_types', Helper::join(Helper::wraps($allowedTypes, "'"), ', ', ", {$or} ")); - } - // below is Required rule job - if (!$this->isValueFromUploadedFiles($value) or $value['error'] == \UPLOAD_ERR_NO_FILE) { - return \true; - } - if (!$this->isUploadedFile($value)) { - return \false; - } - // just make sure there is no error - if ($value['error']) { - return \false; - } - if (!empty($allowedTypes)) { - $guesser = new MimeTypeGuesser(); - $ext = $guesser->getExtension($value['type']); - unset($guesser); - if (!\in_array($ext, $allowedTypes)) { - return \false; - } - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Min.php b/dependencies/rakit/validation/src/Rules/Min.php deleted file mode 100644 index 1a624ca..0000000 --- a/dependencies/rakit/validation/src/Rules/Min.php +++ /dev/null @@ -1,29 +0,0 @@ -requireParameters($this->fillableParams); - $min = $this->getBytesSize($this->parameter('min')); - $valueSize = $this->getValueSize($value); - if (!\is_numeric($valueSize)) { - return \false; - } - return $valueSize >= $min; - } -} diff --git a/dependencies/rakit/validation/src/Rules/NotIn.php b/dependencies/rakit/validation/src/Rules/NotIn.php deleted file mode 100644 index a09ca4f..0000000 --- a/dependencies/rakit/validation/src/Rules/NotIn.php +++ /dev/null @@ -1,52 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - if (\count($params) == 1 and \is_array($params[0])) { - $params = $params[0]; - } - $this->params['disallowed_values'] = $params; - return $this; - } - /** - * Set strict value - * - * @param bool $strict - * @return void - */ - public function strict($strict = \true) - { - $this->strict = $strict; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['disallowed_values']); - $disallowedValues = (array) $this->parameter('disallowed_values'); - $and = $this->validation ? $this->validation->getTranslation('and') : 'and'; - $disallowedValuesText = Helper::join(Helper::wraps($disallowedValues, "'"), ', ', ", {$and} "); - $this->setParameterText('disallowed_values', $disallowedValuesText); - return !\in_array($value, $disallowedValues, $this->strict); - } -} diff --git a/dependencies/rakit/validation/src/Rules/Nullable.php b/dependencies/rakit/validation/src/Rules/Nullable.php deleted file mode 100644 index d5a23f8..0000000 --- a/dependencies/rakit/validation/src/Rules/Nullable.php +++ /dev/null @@ -1,18 +0,0 @@ -setAttributeAsRequired(); - return $this->validation->hasValue($this->attribute->getKey()); - } - /** - * Set attribute is required if $this->attribute is set - * - * @return void - */ - protected function setAttributeAsRequired() - { - if ($this->attribute) { - $this->attribute->setRequired(\true); - } - } -} diff --git a/dependencies/rakit/validation/src/Rules/Regex.php b/dependencies/rakit/validation/src/Rules/Regex.php deleted file mode 100644 index f2520ea..0000000 --- a/dependencies/rakit/validation/src/Rules/Regex.php +++ /dev/null @@ -1,24 +0,0 @@ -requireParameters($this->fillableParams); - $regex = $this->parameter('regex'); - return \preg_match($regex, $value) > 0; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Required.php b/dependencies/rakit/validation/src/Rules/Required.php deleted file mode 100644 index 694a4fe..0000000 --- a/dependencies/rakit/validation/src/Rules/Required.php +++ /dev/null @@ -1,44 +0,0 @@ -setAttributeAsRequired(); - if ($this->attribute and $this->attribute->hasRule('uploaded_file')) { - return $this->isValueFromUploadedFiles($value) and $value['error'] != \UPLOAD_ERR_NO_FILE; - } - if (\is_string($value)) { - return \mb_strlen(\trim($value), 'UTF-8') > 0; - } - if (\is_array($value)) { - return \count($value) > 0; - } - return !\is_null($value); - } - /** - * Set attribute is required if $this->attribute is set - * - * @return void - */ - protected function setAttributeAsRequired() - { - if ($this->attribute) { - $this->attribute->setRequired(\true); - } - } -} diff --git a/dependencies/rakit/validation/src/Rules/RequiredIf.php b/dependencies/rakit/validation/src/Rules/RequiredIf.php deleted file mode 100644 index d30c1f8..0000000 --- a/dependencies/rakit/validation/src/Rules/RequiredIf.php +++ /dev/null @@ -1,44 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->params['field'] = \array_shift($params); - $this->params['values'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['field', 'values']); - $anotherAttribute = $this->parameter('field'); - $definedValues = $this->parameter('values'); - $anotherValue = $this->getAttribute()->getValue($anotherAttribute); - $validator = $this->validation->getValidator(); - $requiredValidator = $validator('required'); - if (\in_array($anotherValue, $definedValues)) { - $this->setAttributeAsRequired(); - return $requiredValidator->check($value, []); - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/RequiredUnless.php b/dependencies/rakit/validation/src/Rules/RequiredUnless.php deleted file mode 100644 index f8608ac..0000000 --- a/dependencies/rakit/validation/src/Rules/RequiredUnless.php +++ /dev/null @@ -1,44 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->params['field'] = \array_shift($params); - $this->params['values'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['field', 'values']); - $anotherAttribute = $this->parameter('field'); - $definedValues = $this->parameter('values'); - $anotherValue = $this->getAttribute()->getValue($anotherAttribute); - $validator = $this->validation->getValidator(); - $requiredValidator = $validator('required'); - if (!\in_array($anotherValue, $definedValues)) { - $this->setAttributeAsRequired(); - return $requiredValidator->check($value, []); - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/RequiredWith.php b/dependencies/rakit/validation/src/Rules/RequiredWith.php deleted file mode 100644 index 54cd1f7..0000000 --- a/dependencies/rakit/validation/src/Rules/RequiredWith.php +++ /dev/null @@ -1,43 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->params['fields'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['fields']); - $fields = $this->parameter('fields'); - $validator = $this->validation->getValidator(); - $requiredValidator = $validator('required'); - foreach ($fields as $field) { - if ($this->validation->hasValue($field)) { - $this->setAttributeAsRequired(); - return $requiredValidator->check($value, []); - } - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/RequiredWithAll.php b/dependencies/rakit/validation/src/Rules/RequiredWithAll.php deleted file mode 100644 index cbfabbe..0000000 --- a/dependencies/rakit/validation/src/Rules/RequiredWithAll.php +++ /dev/null @@ -1,43 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->params['fields'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['fields']); - $fields = $this->parameter('fields'); - $validator = $this->validation->getValidator(); - $requiredValidator = $validator('required'); - foreach ($fields as $field) { - if (!$this->validation->hasValue($field)) { - return \true; - } - } - $this->setAttributeAsRequired(); - return $requiredValidator->check($value, []); - } -} diff --git a/dependencies/rakit/validation/src/Rules/RequiredWithout.php b/dependencies/rakit/validation/src/Rules/RequiredWithout.php deleted file mode 100644 index a17fb84..0000000 --- a/dependencies/rakit/validation/src/Rules/RequiredWithout.php +++ /dev/null @@ -1,43 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->params['fields'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['fields']); - $fields = $this->parameter('fields'); - $validator = $this->validation->getValidator(); - $requiredValidator = $validator('required'); - foreach ($fields as $field) { - if (!$this->validation->hasValue($field)) { - $this->setAttributeAsRequired(); - return $requiredValidator->check($value, []); - } - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/RequiredWithoutAll.php b/dependencies/rakit/validation/src/Rules/RequiredWithoutAll.php deleted file mode 100644 index 7e41727..0000000 --- a/dependencies/rakit/validation/src/Rules/RequiredWithoutAll.php +++ /dev/null @@ -1,43 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->params['fields'] = $params; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $this->requireParameters(['fields']); - $fields = $this->parameter('fields'); - $validator = $this->validation->getValidator(); - $requiredValidator = $validator('required'); - foreach ($fields as $field) { - if ($this->validation->hasValue($field)) { - return \true; - } - } - $this->setAttributeAsRequired(); - return $requiredValidator->check($value, []); - } -} diff --git a/dependencies/rakit/validation/src/Rules/Same.php b/dependencies/rakit/validation/src/Rules/Same.php deleted file mode 100644 index 03da26c..0000000 --- a/dependencies/rakit/validation/src/Rules/Same.php +++ /dev/null @@ -1,25 +0,0 @@ -requireParameters($this->fillableParams); - $field = $this->parameter('field'); - $anotherValue = $this->getAttribute()->getValue($field); - return $value == $anotherValue; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Traits/DateUtilsTrait.php b/dependencies/rakit/validation/src/Rules/Traits/DateUtilsTrait.php deleted file mode 100644 index a4877ea..0000000 --- a/dependencies/rakit/validation/src/Rules/Traits/DateUtilsTrait.php +++ /dev/null @@ -1,39 +0,0 @@ -isValueFromUploadedFiles($value) && \is_uploaded_file($value['tmp_name']); - } - /** - * Resolve uploaded file value - * - * @param mixed $value - * @return array|null - */ - public function resolveUploadedFileValue($value) - { - if (!$this->isValueFromUploadedFiles($value)) { - return null; - } - // Here $value should be an array: - // [ - // 'name' => string|array, - // 'type' => string|array, - // 'size' => int|array, - // 'tmp_name' => string|array, - // 'error' => string|array, - // ] - // Flatten $value to it's array dot format, - // so our array must be something like: - // ['name' => string, 'type' => string, 'size' => int, ...] - // or for multiple values: - // ['name.0' => string, 'name.1' => string, 'type.0' => string, 'type.1' => string, ...] - // or for nested array: - // ['name.foo.bar' => string, 'name.foo.baz' => string, 'type.foo.bar' => string, 'type.foo.baz' => string, ...] - $arrayDots = Helper::arrayDot($value); - $results = []; - foreach ($arrayDots as $key => $val) { - // Move first key to last key - // name.foo.bar -> foo.bar.name - $splits = \explode(".", $key); - $firstKey = \array_shift($splits); - $key = \count($splits) ? \implode(".", $splits) . ".{$firstKey}" : $firstKey; - Helper::arraySet($results, $key, $val); - } - return $results; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Traits/SizeTrait.php b/dependencies/rakit/validation/src/Rules/Traits/SizeTrait.php deleted file mode 100644 index 0d2ecdb..0000000 --- a/dependencies/rakit/validation/src/Rules/Traits/SizeTrait.php +++ /dev/null @@ -1,90 +0,0 @@ -getAttribute() && ($this->getAttribute()->hasRule('numeric') || $this->getAttribute()->hasRule('integer')) && \is_numeric($value)) { - $value = (float) $value; - } - if (\is_int($value) || \is_float($value)) { - return (float) $value; - } elseif (\is_string($value)) { - return (float) \mb_strlen($value, 'UTF-8'); - } elseif ($this->isUploadedFileValue($value)) { - return (float) $value['size']; - } elseif (\is_array($value)) { - return (float) \count($value); - } else { - return \false; - } - } - /** - * Given $size and get the bytes - * - * @param string|int $size - * @return float - * @throws InvalidArgumentException - */ - protected function getBytesSize($size) - { - if (\is_numeric($size)) { - return (float) $size; - } - if (!\is_string($size)) { - throw new InvalidArgumentException("Size must be string or numeric Bytes", 1); - } - if (!\preg_match("/^(?((\\d+)?\\.)?\\d+)(?(B|K|M|G|T|P)B?)?\$/i", $size, $match)) { - throw new InvalidArgumentException("Size is not valid format", 1); - } - $number = (float) $match['number']; - $format = isset($match['format']) ? $match['format'] : ''; - switch (\strtoupper($format)) { - case "KB": - case "K": - return $number * 1024; - case "MB": - case "M": - return $number * \pow(1024, 2); - case "GB": - case "G": - return $number * \pow(1024, 3); - case "TB": - case "T": - return $number * \pow(1024, 4); - case "PB": - case "P": - return $number * \pow(1024, 5); - default: - return $number; - } - } - /** - * Check whether value is from $_FILES - * - * @param mixed $value - * @return bool - */ - public function isUploadedFileValue($value) : bool - { - if (!\is_array($value)) { - return \false; - } - $keys = ['name', 'type', 'tmp_name', 'size', 'error']; - foreach ($keys as $key) { - if (!\array_key_exists($key, $value)) { - return \false; - } - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/TypeArray.php b/dependencies/rakit/validation/src/Rules/TypeArray.php deleted file mode 100644 index 86b2908..0000000 --- a/dependencies/rakit/validation/src/Rules/TypeArray.php +++ /dev/null @@ -1,20 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - $this->minSize(\array_shift($params)); - $this->maxSize(\array_shift($params)); - $this->fileTypes($params); - return $this; - } - /** - * Given $size and set the max size - * - * @param string|int $size - * @return self - */ - public function maxSize($size) : Rule - { - $this->params['max_size'] = $size; - return $this; - } - /** - * Given $size and set the min size - * - * @param string|int $size - * @return self - */ - public function minSize($size) : Rule - { - $this->params['min_size'] = $size; - return $this; - } - /** - * Given $min and $max then set the range size - * - * @param string|int $min - * @param string|int $max - * @return self - */ - public function sizeBetween($min, $max) : Rule - { - $this->minSize($min); - $this->maxSize($max); - return $this; - } - /** - * Given $types and assign $this->params - * - * @param mixed $types - * @return self - */ - public function fileTypes($types) : Rule - { - if (\is_string($types)) { - $types = \explode('|', $types); - } - $this->params['allowed_types'] = $types; - return $this; - } - /** - * {@inheritDoc} - */ - public function beforeValidate() - { - $attribute = $this->getAttribute(); - // We only resolve uploaded file value - // from complex attribute such as 'files.photo', 'images.*', 'images.foo.bar', etc. - if (!$attribute->isUsingDotNotation()) { - return; - } - $keys = \explode(".", $attribute->getKey()); - $firstKey = \array_shift($keys); - $firstKeyValue = $this->validation->getValue($firstKey); - $resolvedValue = $this->resolveUploadedFileValue($firstKeyValue); - // Return original value if $value can't be resolved as uploaded file value - if (!$resolvedValue) { - return; - } - $this->validation->setValue($firstKey, $resolvedValue); - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $minSize = $this->parameter('min_size'); - $maxSize = $this->parameter('max_size'); - $allowedTypes = $this->parameter('allowed_types'); - if ($allowedTypes) { - $or = $this->validation ? $this->validation->getTranslation('or') : 'or'; - $this->setParameterText('allowed_types', Helper::join(Helper::wraps($allowedTypes, "'"), ', ', ", {$or} ")); - } - // below is Required rule job - if (!$this->isValueFromUploadedFiles($value) or $value['error'] == \UPLOAD_ERR_NO_FILE) { - return \true; - } - if (!$this->isUploadedFile($value)) { - return \false; - } - // just make sure there is no error - if ($value['error']) { - return \false; - } - if ($minSize) { - $bytesMinSize = $this->getBytesSize($minSize); - if ($value['size'] < $bytesMinSize) { - $this->setMessage('The :attribute file is too small, minimum size is :min_size'); - return \false; - } - } - if ($maxSize) { - $bytesMaxSize = $this->getBytesSize($maxSize); - if ($value['size'] > $bytesMaxSize) { - $this->setMessage('The :attribute file is too large, maximum size is :max_size'); - return \false; - } - } - if (!empty($allowedTypes)) { - $guesser = new MimeTypeGuesser(); - $ext = $guesser->getExtension($value['type']); - unset($guesser); - if (!\in_array($ext, $allowedTypes)) { - $this->setMessage('The :attribute file type must be :allowed_types'); - return \false; - } - } - return \true; - } -} diff --git a/dependencies/rakit/validation/src/Rules/Uppercase.php b/dependencies/rakit/validation/src/Rules/Uppercase.php deleted file mode 100644 index de79757..0000000 --- a/dependencies/rakit/validation/src/Rules/Uppercase.php +++ /dev/null @@ -1,20 +0,0 @@ -params - * - * @param array $params - * @return self - */ - public function fillParameters(array $params) : Rule - { - if (\count($params) == 1 and \is_array($params[0])) { - $params = $params[0]; - } - return $this->forScheme($params); - } - /** - * Given $schemes and assign $this->params - * - * @param array $schemes - * @return self - */ - public function forScheme($schemes) : Rule - { - $this->params['schemes'] = (array) $schemes; - return $this; - } - /** - * Check the $value is valid - * - * @param mixed $value - * @return bool - */ - public function check($value) : bool - { - $schemes = $this->parameter('schemes'); - if (!$schemes) { - return $this->validateCommonScheme($value); - } else { - foreach ($schemes as $scheme) { - $method = 'validate' . \ucfirst($scheme) . 'Scheme'; - if (\method_exists($this, $method)) { - if ($this->{$method}($value)) { - return \true; - } - } elseif ($this->validateCommonScheme($value, $scheme)) { - return \true; - } - } - return \false; - } - } - /** - * Validate $value is valid URL format - * - * @param mixed $value - * @return bool - */ - public function validateBasic($value) : bool - { - return \filter_var($value, \FILTER_VALIDATE_URL) !== \false; - } - /** - * Validate $value is correct $scheme format - * - * @param mixed $value - * @param null $scheme - * @return bool - */ - public function validateCommonScheme($value, $scheme = null) : bool - { - if (!$scheme) { - return $this->validateBasic($value) && (bool) \preg_match("/^\\w+:\\/\\//i", $value); - } else { - return $this->validateBasic($value) && (bool) \preg_match("/^{$scheme}:\\/\\//", $value); - } - } - /** - * Validate the $value is mailto scheme format - * - * @param mixed $value - * @return bool - */ - public function validateMailtoScheme($value) : bool - { - return $this->validateBasic($value) && \preg_match("/^mailto:/", $value); - } - /** - * Validate the $value is jdbc scheme format - * - * @param mixed $value - * @return bool - */ - public function validateJdbcScheme($value) : bool - { - return (bool) \preg_match("/^jdbc:\\w+:\\/\\//", $value); - } -} diff --git a/dependencies/rakit/validation/src/Traits/MessagesTrait.php b/dependencies/rakit/validation/src/Traits/MessagesTrait.php deleted file mode 100644 index deb95d4..0000000 --- a/dependencies/rakit/validation/src/Traits/MessagesTrait.php +++ /dev/null @@ -1,49 +0,0 @@ -messages[$key] = $message; - } - /** - * Given $messages and set multiple messages - * - * @param array $messages - * @return void - */ - public function setMessages(array $messages) - { - $this->messages = \array_merge($this->messages, $messages); - } - /** - * Given message from given $key - * - * @param string $key - * @return string - */ - public function getMessage(string $key) : string - { - return \array_key_exists($key, $this->messages) ? $this->messages[$key] : $key; - } - /** - * Get all $messages - * - * @return array - */ - public function getMessages() : array - { - return $this->messages; - } -} diff --git a/dependencies/rakit/validation/src/Traits/TranslationsTrait.php b/dependencies/rakit/validation/src/Traits/TranslationsTrait.php deleted file mode 100644 index 7878019..0000000 --- a/dependencies/rakit/validation/src/Traits/TranslationsTrait.php +++ /dev/null @@ -1,49 +0,0 @@ -translations[$key] = $translation; - } - /** - * Given $translations and set multiple translations - * - * @param array $translations - * @return void - */ - public function setTranslations(array $translations) - { - $this->translations = \array_merge($this->translations, $translations); - } - /** - * Given translation from given $key - * - * @param string $key - * @return string - */ - public function getTranslation(string $key) : string - { - return \array_key_exists($key, $this->translations) ? $this->translations[$key] : $key; - } - /** - * Get all $translations - * - * @return array - */ - public function getTranslations() : array - { - return $this->translations; - } -} diff --git a/dependencies/rakit/validation/src/Validation.php b/dependencies/rakit/validation/src/Validation.php deleted file mode 100644 index cab40eb..0000000 --- a/dependencies/rakit/validation/src/Validation.php +++ /dev/null @@ -1,608 +0,0 @@ -validator = $validator; - $this->inputs = $this->resolveInputAttributes($inputs); - $this->messages = $messages; - $this->errors = new ErrorBag(); - foreach ($rules as $attributeKey => $rules) { - $this->addAttribute($attributeKey, $rules); - } - } - /** - * Add attribute rules - * - * @param string $attributeKey - * @param string|array $rules - * @return void - */ - public function addAttribute(string $attributeKey, $rules) - { - $resolvedRules = $this->resolveRules($rules); - $attribute = new Attribute($this, $attributeKey, $this->getAlias($attributeKey), $resolvedRules); - $this->attributes[$attributeKey] = $attribute; - } - /** - * Get attribute by key - * - * @param string $attributeKey - * @return null|\Rakit\Validation\Attribute - */ - public function getAttribute(string $attributeKey) - { - return isset($this->attributes[$attributeKey]) ? $this->attributes[$attributeKey] : null; - } - /** - * Run validation - * - * @param array $inputs - * @return void - */ - public function validate(array $inputs = []) - { - $this->errors = new ErrorBag(); - // reset error bag - $this->inputs = \array_merge($this->inputs, $this->resolveInputAttributes($inputs)); - // Before validation hooks - foreach ($this->attributes as $attributeKey => $attribute) { - foreach ($attribute->getRules() as $rule) { - if ($rule instanceof BeforeValidate) { - $rule->beforeValidate(); - } - } - } - foreach ($this->attributes as $attributeKey => $attribute) { - $this->validateAttribute($attribute); - } - } - /** - * Get ErrorBag instance - * - * @return \Rakit\Validation\ErrorBag - */ - public function errors() : ErrorBag - { - return $this->errors; - } - /** - * Validate attribute - * - * @param \Rakit\Validation\Attribute $attribute - * @return void - */ - protected function validateAttribute(Attribute $attribute) - { - if ($this->isArrayAttribute($attribute)) { - $attributes = $this->parseArrayAttribute($attribute); - foreach ($attributes as $i => $attr) { - $this->validateAttribute($attr); - } - return; - } - $attributeKey = $attribute->getKey(); - $rules = $attribute->getRules(); - $value = $this->getValue($attributeKey); - $isEmptyValue = $this->isEmptyValue($value); - if ($attribute->hasRule('nullable') && $isEmptyValue) { - $rules = []; - } - $isValid = \true; - foreach ($rules as $ruleValidator) { - $ruleValidator->setAttribute($attribute); - if ($ruleValidator instanceof ModifyValue) { - $value = $ruleValidator->modifyValue($value); - $isEmptyValue = $this->isEmptyValue($value); - } - $valid = $ruleValidator->check($value); - if ($isEmptyValue and $this->ruleIsOptional($attribute, $ruleValidator)) { - continue; - } - if (!$valid) { - $isValid = \false; - $this->addError($attribute, $value, $ruleValidator); - if ($ruleValidator->isImplicit()) { - break; - } - } - } - if ($isValid) { - $this->setValidData($attribute, $value); - } else { - $this->setInvalidData($attribute, $value); - } - } - /** - * Check whether given $attribute is array attribute - * - * @param \Rakit\Validation\Attribute $attribute - * @return bool - */ - protected function isArrayAttribute(Attribute $attribute) : bool - { - $key = $attribute->getKey(); - return \strpos($key, '*') !== \false; - } - /** - * Parse array attribute into it's child attributes - * - * @param \Rakit\Validation\Attribute $attribute - * @return array - */ - protected function parseArrayAttribute(Attribute $attribute) : array - { - $attributeKey = $attribute->getKey(); - $data = Helper::arrayDot($this->initializeAttributeOnData($attributeKey)); - $pattern = \str_replace('\\*', '([^\\.]+)', \preg_quote($attributeKey)); - $data = \array_merge($data, $this->extractValuesForWildcards($data, $attributeKey)); - $attributes = []; - foreach ($data as $key => $value) { - if ((bool) \preg_match('/^' . $pattern . '\\z/', $key, $match)) { - $attr = new Attribute($this, $key, null, $attribute->getRules()); - $attr->setPrimaryAttribute($attribute); - $attr->setKeyIndexes(\array_slice($match, 1)); - $attributes[] = $attr; - } - } - // set other attributes to each attributes - foreach ($attributes as $i => $attr) { - $otherAttributes = $attributes; - unset($otherAttributes[$i]); - $attr->setOtherAttributes($otherAttributes); - } - return $attributes; - } - /** - * Gather a copy of the attribute data filled with any missing attributes. - * Adapted from: https://github.com/illuminate/validation/blob/v5.3.23/Validator.php#L334 - * - * @param string $attribute - * @return array - */ - protected function initializeAttributeOnData(string $attributeKey) : array - { - $explicitPath = $this->getLeadingExplicitAttributePath($attributeKey); - $data = $this->extractDataFromPath($explicitPath); - $asteriskPos = \strpos($attributeKey, '*'); - if (\false === $asteriskPos || $asteriskPos === \mb_strlen($attributeKey, 'UTF-8') - 1) { - return $data; - } - return Helper::arraySet($data, $attributeKey, null, \true); - } - /** - * Get all of the exact attribute values for a given wildcard attribute. - * Adapted from: https://github.com/illuminate/validation/blob/v5.3.23/Validator.php#L354 - * - * @param array $data - * @param string $attributeKey - * @return array - */ - public function extractValuesForWildcards(array $data, string $attributeKey) : array - { - $keys = []; - $pattern = \str_replace('\\*', '[^\\.]+', \preg_quote($attributeKey)); - foreach ($data as $key => $value) { - if ((bool) \preg_match('/^' . $pattern . '/', $key, $matches)) { - $keys[] = $matches[0]; - } - } - $keys = \array_unique($keys); - $data = []; - foreach ($keys as $key) { - $data[$key] = Helper::arrayGet($this->inputs, $key); - } - return $data; - } - /** - * Get the explicit part of the attribute name. - * Adapted from: https://github.com/illuminate/validation/blob/v5.3.23/Validator.php#L2817 - * - * E.g. 'foo.bar.*.baz' -> 'foo.bar' - * - * Allows us to not spin through all of the flattened data for some operations. - * - * @param string $attributeKey - * @return string|null null when root wildcard - */ - protected function getLeadingExplicitAttributePath(string $attributeKey) - { - return \rtrim(\explode('*', $attributeKey)[0], '.') ?: null; - } - /** - * Extract data based on the given dot-notated path. - * Adapted from: https://github.com/illuminate/validation/blob/v5.3.23/Validator.php#L2830 - * - * Used to extract a sub-section of the data for faster iteration. - * - * @param string|null $attributeKey - * @return array - */ - protected function extractDataFromPath($attributeKey) : array - { - $results = []; - $value = Helper::arrayGet($this->inputs, $attributeKey, '__missing__'); - if ($value != '__missing__') { - Helper::arraySet($results, $attributeKey, $value); - } - return $results; - } - /** - * Add error to the $this->errors - * - * @param \Rakit\Validation\Attribute $attribute - * @param mixed $value - * @param \Rakit\Validation\Rule $ruleValidator - * @return void - */ - protected function addError(Attribute $attribute, $value, Rule $ruleValidator) - { - $ruleName = $ruleValidator->getKey(); - $message = $this->resolveMessage($attribute, $value, $ruleValidator); - $this->errors->add($attribute->getKey(), $ruleName, $message); - } - /** - * Check $value is empty value - * - * @param mixed $value - * @return boolean - */ - protected function isEmptyValue($value) : bool - { - $requiredValidator = new Required(); - return \false === $requiredValidator->check($value, []); - } - /** - * Check the rule is optional - * - * @param \Rakit\Validation\Attribute $attribute - * @param \Rakit\Validation\Rule $rule - * @return bool - */ - protected function ruleIsOptional(Attribute $attribute, Rule $rule) : bool - { - return \false === $attribute->isRequired() and \false === $rule->isImplicit() and \false === $rule instanceof Required; - } - /** - * Resolve attribute name - * - * @param \Rakit\Validation\Attribute $attribute - * @return string - */ - protected function resolveAttributeName(Attribute $attribute) : string - { - $primaryAttribute = $attribute->getPrimaryAttribute(); - if (isset($this->aliases[$attribute->getKey()])) { - return $this->aliases[$attribute->getKey()]; - } elseif ($primaryAttribute and isset($this->aliases[$primaryAttribute->getKey()])) { - return $this->aliases[$primaryAttribute->getKey()]; - } elseif ($this->validator->isUsingHumanizedKey()) { - return $attribute->getHumanizedKey(); - } else { - return $attribute->getKey(); - } - } - /** - * Resolve message - * - * @param \Rakit\Validation\Attribute $attribute - * @param mixed $value - * @param \Rakit\Validation\Rule $validator - * @return mixed - */ - protected function resolveMessage(Attribute $attribute, $value, Rule $validator) : string - { - $primaryAttribute = $attribute->getPrimaryAttribute(); - $params = \array_merge($validator->getParameters(), $validator->getParametersTexts()); - $attributeKey = $attribute->getKey(); - $ruleKey = $validator->getKey(); - $alias = $attribute->getAlias() ?: $this->resolveAttributeName($attribute); - $message = $validator->getMessage(); - // default rule message - $messageKeys = [$attributeKey . $this->messageSeparator . $ruleKey, $attributeKey, $ruleKey]; - if ($primaryAttribute) { - // insert primaryAttribute keys - // $messageKeys = [ - // $attributeKey.$this->messageSeparator.$ruleKey, - // >> here [1] << - // $attributeKey, - // >> and here [3] << - // $ruleKey - // ]; - $primaryAttributeKey = $primaryAttribute->getKey(); - \array_splice($messageKeys, 1, 0, $primaryAttributeKey . $this->messageSeparator . $ruleKey); - \array_splice($messageKeys, 3, 0, $primaryAttributeKey); - } - foreach ($messageKeys as $key) { - if (isset($this->messages[$key])) { - $message = $this->messages[$key]; - break; - } - } - // Replace message params - $vars = \array_merge($params, ['attribute' => $alias, 'value' => $value]); - foreach ($vars as $key => $value) { - $value = $this->stringify($value); - $message = \str_replace(':' . $key, $value, $message); - } - // Replace key indexes - $keyIndexes = $attribute->getKeyIndexes(); - foreach ($keyIndexes as $pathIndex => $index) { - $replacers = ["[{$pathIndex}]" => $index]; - if (\is_numeric($index)) { - $replacers["{{$pathIndex}}"] = $index + 1; - } - $message = \str_replace(\array_keys($replacers), \array_values($replacers), $message); - } - return $message; - } - /** - * Stringify $value - * - * @param mixed $value - * @return string - */ - protected function stringify($value) : string - { - if (\is_string($value) || \is_numeric($value)) { - return $value; - } elseif (\is_array($value) || \is_object($value)) { - return \json_encode($value); - } else { - return ''; - } - } - /** - * Resolve $rules - * - * @param mixed $rules - * @return array - */ - protected function resolveRules($rules) : array - { - if (\is_string($rules)) { - $rules = \explode('|', $rules); - } - $resolvedRules = []; - $validatorFactory = $this->getValidator(); - foreach ($rules as $i => $rule) { - if (empty($rule)) { - continue; - } - $params = []; - if (\is_string($rule)) { - list($rulename, $params) = $this->parseRule($rule); - $validator = \call_user_func_array($validatorFactory, \array_merge([$rulename], $params)); - } elseif ($rule instanceof Rule) { - $validator = $rule; - } elseif ($rule instanceof Closure) { - $validator = \call_user_func_array($validatorFactory, ['callback', $rule]); - } else { - $ruleName = \is_object($rule) ? \get_class($rule) : \gettype($rule); - $message = "Rule must be a string, Closure or '" . Rule::class . "' instance. " . $ruleName . " given"; - throw new \Exception(); - } - $resolvedRules[] = $validator; - } - return $resolvedRules; - } - /** - * Parse $rule - * - * @param string $rule - * @return array - */ - protected function parseRule(string $rule) : array - { - $exp = \explode(':', $rule, 2); - $rulename = $exp[0]; - if ($rulename !== 'regex') { - $params = isset($exp[1]) ? \explode(',', $exp[1]) : []; - } else { - $params = [$exp[1]]; - } - return [$rulename, $params]; - } - /** - * Given $attributeKey and $alias then assign alias - * - * @param mixed $attributeKey - * @param mixed $alias - * @return void - */ - public function setAlias(string $attributeKey, string $alias) - { - $this->aliases[$attributeKey] = $alias; - } - /** - * Get attribute alias from given key - * - * @param mixed $attributeKey - * @return string|null - */ - public function getAlias(string $attributeKey) - { - return isset($this->aliases[$attributeKey]) ? $this->aliases[$attributeKey] : null; - } - /** - * Set attributes aliases - * - * @param array $aliases - * @return void - */ - public function setAliases(array $aliases) - { - $this->aliases = \array_merge($this->aliases, $aliases); - } - /** - * Check validations are passed - * - * @return bool - */ - public function passes() : bool - { - return $this->errors->count() == 0; - } - /** - * Check validations are failed - * - * @return bool - */ - public function fails() : bool - { - return !$this->passes(); - } - /** - * Given $key and get value - * - * @param string $key - * @return mixed - */ - public function getValue(string $key) - { - return Helper::arrayGet($this->inputs, $key); - } - /** - * Set input value - * - * @param string $key - * @param mixed $value - * @return void - */ - public function setValue(string $key, $value) - { - Helper::arraySet($this->inputs, $key, $value); - } - /** - * Given $key and check value is exsited - * - * @param string $key - * @return boolean - */ - public function hasValue(string $key) : bool - { - return Helper::arrayHas($this->inputs, $key); - } - /** - * Get Validator class instance - * - * @return \Rakit\Validation\Validator - */ - public function getValidator() : Validator - { - return $this->validator; - } - /** - * Given $inputs and resolve input attributes - * - * @param array $inputs - * @return array - */ - protected function resolveInputAttributes(array $inputs) : array - { - $resolvedInputs = []; - foreach ($inputs as $key => $rules) { - $exp = \explode(':', $key); - if (\count($exp) > 1) { - // set attribute alias - $this->aliases[$exp[0]] = $exp[1]; - } - $resolvedInputs[$exp[0]] = $rules; - } - return $resolvedInputs; - } - /** - * Get validated data - * - * @return array - */ - public function getValidatedData() : array - { - return \array_merge($this->validData, $this->invalidData); - } - /** - * Set valid data - * - * @param \Rakit\Validation\Attribute $attribute - * @param mixed $value - * @return void - */ - protected function setValidData(Attribute $attribute, $value) - { - $key = $attribute->getKey(); - if ($attribute->isArrayAttribute() || $attribute->isUsingDotNotation()) { - Helper::arraySet($this->validData, $key, $value); - Helper::arrayUnset($this->invalidData, $key); - } else { - $this->validData[$key] = $value; - } - } - /** - * Get valid data - * - * @return array - */ - public function getValidData() : array - { - return $this->validData; - } - /** - * Set invalid data - * - * @param \Rakit\Validation\Attribute $attribute - * @param mixed $value - * @return void - */ - protected function setInvalidData(Attribute $attribute, $value) - { - $key = $attribute->getKey(); - if ($attribute->isArrayAttribute() || $attribute->isUsingDotNotation()) { - Helper::arraySet($this->invalidData, $key, $value); - Helper::arrayUnset($this->validData, $key); - } else { - $this->invalidData[$key] = $value; - } - } - /** - * Get invalid data - * - * @return void - */ - public function getInvalidData() : array - { - return $this->invalidData; - } -} diff --git a/dependencies/rakit/validation/src/Validator.php b/dependencies/rakit/validation/src/Validator.php deleted file mode 100644 index a2bc5bc..0000000 --- a/dependencies/rakit/validation/src/Validator.php +++ /dev/null @@ -1,200 +0,0 @@ -messages = $messages; - $this->registerBaseValidators(); - } - /** - * Register or override existing validator - * - * @param mixed $key - * @param \Rakit\Validation\Rule $rule - * @return void - */ - public function setValidator(string $key, Rule $rule) - { - $this->validators[$key] = $rule; - $rule->setKey($key); - } - /** - * Get validator object from given $key - * - * @param mixed $key - * @return mixed - */ - public function getValidator($key) - { - return isset($this->validators[$key]) ? $this->validators[$key] : null; - } - /** - * Validate $inputs - * - * @param array $inputs - * @param array $rules - * @param array $messages - * @return Validation - */ - public function validate(array $inputs, array $rules, array $messages = []) : Validation - { - $validation = $this->make($inputs, $rules, $messages); - $validation->validate(); - return $validation; - } - /** - * Given $inputs, $rules and $messages to make the Validation class instance - * - * @param array $inputs - * @param array $rules - * @param array $messages - * @return Validation - */ - public function make(array $inputs, array $rules, array $messages = []) : Validation - { - $messages = \array_merge($this->messages, $messages); - $validation = new Validation($this, $inputs, $rules, $messages); - $validation->setTranslations($this->getTranslations()); - return $validation; - } - /** - * Magic invoke method to make Rule instance - * - * @param string $rule - * @return Rule - * @throws RuleNotFoundException - */ - public function __invoke(string $rule) : Rule - { - $args = \func_get_args(); - $rule = \array_shift($args); - $params = $args; - $validator = $this->getValidator($rule); - if (!$validator) { - throw new RuleNotFoundException("Validator '{$rule}' is not registered", 1); - } - $clonedValidator = clone $validator; - $clonedValidator->fillParameters($params); - return $clonedValidator; - } - /** - * Initialize base validators array - * - * @return void - */ - protected function registerBaseValidators() - { - $baseValidator = [ - 'required' => new Rules\Required(), - 'required_if' => new Rules\RequiredIf(), - 'required_unless' => new Rules\RequiredUnless(), - 'required_with' => new Rules\RequiredWith(), - 'required_without' => new Rules\RequiredWithout(), - 'required_with_all' => new Rules\RequiredWithAll(), - 'required_without_all' => new Rules\RequiredWithoutAll(), - 'email' => new Rules\Email(), - 'alpha' => new Rules\Alpha(), - 'numeric' => new Rules\Numeric(), - 'alpha_num' => new Rules\AlphaNum(), - 'alpha_dash' => new Rules\AlphaDash(), - 'alpha_spaces' => new Rules\AlphaSpaces(), - 'in' => new Rules\In(), - 'not_in' => new Rules\NotIn(), - 'min' => new Rules\Min(), - 'max' => new Rules\Max(), - 'between' => new Rules\Between(), - 'url' => new Rules\Url(), - 'integer' => new Rules\Integer(), - 'boolean' => new Rules\Boolean(), - 'ip' => new Rules\Ip(), - 'ipv4' => new Rules\Ipv4(), - 'ipv6' => new Rules\Ipv6(), - 'extension' => new Rules\Extension(), - 'array' => new Rules\TypeArray(), - 'same' => new Rules\Same(), - 'regex' => new Rules\Regex(), - 'date' => new Rules\Date(), - 'accepted' => new Rules\Accepted(), - 'present' => new Rules\Present(), - 'different' => new Rules\Different(), - 'uploaded_file' => new Rules\UploadedFile(), - 'mimes' => new Rules\Mimes(), - 'callback' => new Rules\Callback(), - 'before' => new Rules\Before(), - 'after' => new Rules\After(), - 'lowercase' => new Rules\Lowercase(), - 'uppercase' => new Rules\Uppercase(), - 'json' => new Rules\Json(), - 'digits' => new Rules\Digits(), - 'digits_between' => new Rules\DigitsBetween(), - 'defaults' => new Rules\Defaults(), - 'default' => new Rules\Defaults(), - // alias of defaults - 'nullable' => new Rules\Nullable(), - ]; - foreach ($baseValidator as $key => $validator) { - $this->setValidator($key, $validator); - } - } - /** - * Given $ruleName and $rule to add new validator - * - * @param string $ruleName - * @param \Rakit\Validation\Rule $rule - * @return void - */ - public function addValidator(string $ruleName, Rule $rule) - { - if (!$this->allowRuleOverride && \array_key_exists($ruleName, $this->validators)) { - throw new RuleQuashException("You cannot override a built in rule. You have to rename your rule"); - } - $this->setValidator($ruleName, $rule); - } - /** - * Set rule can allow to be overrided - * - * @param boolean $status - * @return void - */ - public function allowRuleOverride(bool $status = \false) - { - $this->allowRuleOverride = $status; - } - /** - * Set this can use humanize keys - * - * @param boolean $useHumanizedKeys - * @return void - */ - public function setUseHumanizedKeys(bool $useHumanizedKeys = \true) - { - $this->useHumanizedKeys = $useHumanizedKeys; - } - /** - * Get $this->useHumanizedKeys value - * - * @return void - */ - public function isUsingHumanizedKey() : bool - { - return $this->useHumanizedKeys; - } -} diff --git a/dependencies/ralouphie/getallheaders/src/getallheaders.php b/dependencies/ralouphie/getallheaders/src/getallheaders.php deleted file mode 100644 index f999326..0000000 --- a/dependencies/ralouphie/getallheaders/src/getallheaders.php +++ /dev/null @@ -1,38 +0,0 @@ - 'Content-Type', 'CONTENT_LENGTH' => 'Content-Length', 'CONTENT_MD5' => 'Content-Md5'); - foreach ($_SERVER as $key => $value) { - if (\substr($key, 0, 5) === 'HTTP_') { - $key = \substr($key, 5); - if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { - $key = \str_replace(' ', '-', \ucwords(\strtolower(\str_replace('_', ' ', $key)))); - $headers[$key] = $value; - } - } elseif (isset($copy_server[$key])) { - $headers[$copy_server[$key]] = $value; - } - } - if (!isset($headers['Authorization'])) { - if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { - $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; - } elseif (isset($_SERVER['PHP_AUTH_USER'])) { - $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; - $headers['Authorization'] = 'Basic ' . \base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); - } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { - $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; - } - } - return $headers; - } -} diff --git a/dependencies/remotelyliving/php-dns/_config.yml b/dependencies/remotelyliving/php-dns/_config.yml deleted file mode 100644 index c419263..0000000 --- a/dependencies/remotelyliving/php-dns/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/dependencies/remotelyliving/php-dns/bootstrap/repl.php b/dependencies/remotelyliving/php-dns/bootstrap/repl.php deleted file mode 100644 index f93da31..0000000 --- a/dependencies/remotelyliving/php-dns/bootstrap/repl.php +++ /dev/null @@ -1,37 +0,0 @@ -addSubscriber($IOSubscriber); -$googleDNSResolver = new GoogleDNS(); -$googleDNSResolver->addSubscriber($IOSubscriber); -$cloudFlareResolver = new CloudFlare(); -$cloudFlareResolver->addSubscriber($IOSubscriber); -$digResolver = new \WP_Ultimo\Dependencies\RemotelyLiving\PHPDNS\Resolvers\Dig(new SpatieDNS(), new Dig()); -$digResolver->addSubscriber($IOSubscriber); -$chainResolver = new Chain($cloudFlareResolver, $googleDNSResolver, $localSystemResolver); -$cachedResolver = new Cached(new FilesystemAdapter(), $chainResolver); -$cachedResolver->addSubscriber($IOSubscriber); diff --git a/dependencies/remotelyliving/php-dns/churn.yml b/dependencies/remotelyliving/php-dns/churn.yml deleted file mode 100644 index 2cbd675..0000000 --- a/dependencies/remotelyliving/php-dns/churn.yml +++ /dev/null @@ -1,56 +0,0 @@ -# The maximum number of files to display in the results table. -# Default: 10 -filesToShow: 20 - -# The minimum score a file need to display in the results table. -# Disabled if null. -# Default: 0.1 -minScoreToShow: 0 - -# The command returns an 1 exit code if the highest score is greater than the threshold. -# Disabled if null. -# Default: null -maxScoreThreshold: 0.9 - -# The number of parallel jobs to use when processing files. -# Default: 10 -parallelJobs: 10 - -# How far back in the VCS history to count the number of commits to a file -# Can be a human readable date like 'One week ago' or a date like '2017-07-12' -# Default: '10 Years ago' -commitsSince: One year ago - -# Files to ignore when processing. The full path to the file relative to the root of your project is required. -# Also supports regular expressions. -# Default: All PHP files in the path provided to churn-php are processed. -#filesToIgnore: - -# File extensions to use when processing. -# Default: php -fileExtensions: - - php - - inc - -# This list is used only if there is no argument when running churn. -# Default: -directoriesToScan: - - src - - tests/ - -# List of user-defined hooks. -# They can be referenced by their full qualified class name if churn has access to the autoloader. -# Otherwise the file path can be used as well. -# See below the section about hooks for more details. -# Default: -#hooks: - -# The version control system used for your project. -# Accepted values: fossil, git, mercurial, subversion, none -# Default: git -vcs: git - -# The path of the cache file. It doesn't need to exist before running churn. -# Disabled if null. -# Default: null -cachePath: .churn.cache diff --git a/dependencies/remotelyliving/php-dns/phpstan.neon b/dependencies/remotelyliving/php-dns/phpstan.neon deleted file mode 100644 index d572bb4..0000000 --- a/dependencies/remotelyliving/php-dns/phpstan.neon +++ /dev/null @@ -1,4 +0,0 @@ -parameters: - checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false - ignoreErrors: diff --git a/dependencies/remotelyliving/php-dns/psalm.xml b/dependencies/remotelyliving/php-dns/psalm.xml deleted file mode 100644 index a9d2217..0000000 --- a/dependencies/remotelyliving/php-dns/psalm.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/remotelyliving/php-dns/rector.php b/dependencies/remotelyliving/php-dns/rector.php deleted file mode 100644 index fe8d7ef..0000000 --- a/dependencies/remotelyliving/php-dns/rector.php +++ /dev/null @@ -1,20 +0,0 @@ -parameters(); - $parameters->set(Option::PATHS, [__DIR__ . '/src']); - // Define what rule sets will be applied - $containerConfigurator->import(LevelSetList::UP_TO_PHP_81); - // get services (needed for register a single rule) - $services = $containerConfigurator->services(); - // register a single rule - $services->set(TypedPropertyRector::class); -}; diff --git a/dependencies/remotelyliving/php-dns/src/Entities/CAAData.php b/dependencies/remotelyliving/php-dns/src/Entities/CAAData.php deleted file mode 100644 index d0b6fc8..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/CAAData.php +++ /dev/null @@ -1,64 +0,0 @@ -flags = $flags; - $this->tag = $tag; - $this->value = $value ? $this->normalizeValue($value) : null; - } - public function __toString() : string - { - return "{$this->flags} {$this->tag} \"{$this->value}\""; - } - public function getFlags() : int - { - return $this->flags; - } - public function getTag() : string - { - return $this->tag; - } - public function getValue() : ?string - { - return $this->value; - } - public function toArray() : array - { - return ['flags' => $this->flags, 'tag' => $this->tag, 'value' => $this->value]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->flags = $unserialized['flags']; - $this->tag = $unserialized['tag']; - $this->value = $unserialized['value']; - } - private function normalizeValue(string $value) : string - { - $normalized = trim(str_ireplace('"', '', $value)); - if (preg_match('/\\s/m', $normalized)) { - throw new Exceptions\InvalidArgumentException("{$value} is not a valid CAA value"); - } - return $normalized; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/CNAMEData.php b/dependencies/remotelyliving/php-dns/src/Entities/CNAMEData.php deleted file mode 100644 index 8fa967c..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/CNAMEData.php +++ /dev/null @@ -1,39 +0,0 @@ -hostname = $hostname; - } - public function __toString() : string - { - return (string) $this->hostname; - } - public function getHostname() : Hostname - { - return $this->hostname; - } - public function toArray() : array - { - return ['hostname' => (string) $this->hostname]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - /** @var array{'hostname': string} $unserialized */ - $unserialized = unserialize($serialized); - $this->hostname = new Hostname($unserialized['hostname']); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/DNSRecord.php b/dependencies/remotelyliving/php-dns/src/Entities/DNSRecord.php deleted file mode 100644 index 4dc66dc..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/DNSRecord.php +++ /dev/null @@ -1,103 +0,0 @@ -recordType = $recordType; - $this->hostname = $hostname; - $this->TTL = $ttl; - $this->IPAddress = $IPAddress; - $this->class = $class; - $this->data = $data; - } - public static function createFromPrimitives(string $recordType, string $hostname, int $ttl, string $IPAddress = null, string $class = 'IN', string $data = null) : DNSRecord - { - $type = DNSRecordType::createFromString($recordType); - $hostname = Hostname::createFromString($hostname); - $data = $data !== null ? DataAbstract::createFromTypeAndString($type, $data) : null; - return new self($type, $hostname, $ttl, $IPAddress ? IPAddress::createFromString($IPAddress) : null, $class, $data); - } - public function getType() : DNSRecordType - { - return $this->recordType; - } - public function getHostname() : Hostname - { - return $this->hostname; - } - public function getTTL() : int - { - return $this->TTL; - } - public function getIPAddress() : ?IPAddress - { - return $this->IPAddress; - } - public function getClass() : string - { - return $this->class; - } - public function getData() : ?DataAbstract - { - return $this->data; - } - public function setTTL(int $ttl) : DNSRecordInterface - { - $this->TTL = $ttl; - return $this; - } - public function toArray() : array - { - $formatted = ['hostname' => (string) $this->hostname, 'type' => (string) $this->recordType, 'TTL' => $this->TTL, 'class' => $this->class]; - if ($this->IPAddress) { - $formatted['IPAddress'] = (string) $this->IPAddress; - } - if ($this->data) { - $formatted[self::DATA] = (string) $this->data; - } - return $formatted; - } - public function equals(DNSRecordInterface $record) : bool - { - return $this->hostname->equals($record->getHostname()) && $this->recordType->equals($record->getType()) && (string) $this->data === (string) $record->getData() && (string) $this->IPAddress === (string) $record->getIPAddress(); - // could be null - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $rawIPAddres = $unserialized['IPAddress'] ?? null; - $this->recordType = DNSRecordType::createFromString($unserialized['type']); - $this->hostname = Hostname::createFromString($unserialized['hostname']); - $this->TTL = (int) $unserialized['TTL']; - $this->IPAddress = $rawIPAddres ? IPAddress::createFromString($rawIPAddres) : null; - $this->class = $unserialized['class']; - $this->data = isset($unserialized[self::DATA]) ? DataAbstract::createFromTypeAndString($this->recordType, $unserialized[self::DATA]) : null; - } - public function jsonSerialize() : array - { - return $this->toArray(); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/DNSRecordCollection.php b/dependencies/remotelyliving/php-dns/src/Entities/DNSRecordCollection.php deleted file mode 100644 index d548007..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/DNSRecordCollection.php +++ /dev/null @@ -1,151 +0,0 @@ -records = new ArrayIterator($records); - } - public function toArray() : array - { - return $this->records->getArrayCopy(); - } - public function pickFirst() : ?DNSRecordInterface - { - $copy = $this->records->getArrayCopy(); - return array_shift($copy); - } - public function filteredByType(DNSRecordType $type) : self - { - $fn = fn(DNSRecordInterface $record) => $record->getType()->equals($type); - return new self(...array_filter($this->records->getArrayCopy(), $fn)); - } - public function has(DNSRecordInterface $lookupRecord) : bool - { - foreach ($this->records->getArrayCopy() as $record) { - if ($lookupRecord->equals($record)) { - return \true; - } - } - return \false; - } - public function current() : ?DNSRecordInterface - { - return $this->records->current(); - } - public function next() : void - { - $this->records->next(); - } - /** - * @return int|string|bool - */ - public function key() - { - return $this->records->key(); - } - public function valid() : bool - { - return $this->records->valid(); - } - public function rewind() : void - { - $this->records->rewind(); - } - /** - * @param mixed $offset - * @return bool - */ - public function offsetExists($offset) : bool - { - return $this->records->offsetExists($offset); - } - /** - * @param mixed $offset - * @return \RemotelyLiving\PHPDNS\Entities\Interfaces\DNSRecordInterface - */ - public function offsetGet($offset) : DNSRecordInterface - { - return $this->records->offsetGet($offset); - } - /** - * @param mixed $offset - * @param mixed $value - * @throws \RemotelyLiving\PHPDNS\Exceptions\InvalidArgumentException - */ - public function offsetSet($offset, $value) : void - { - if (!$value instanceof DNSRecordInterface) { - throw new InvalidArgumentException('Invalid value'); - } - $this->records->offsetSet( - $offset, - /** @scrutinizer ignore-type */ - $value - ); - } - /** - * @param mixed $offset - */ - public function offsetUnset($offset) : void - { - $this->records->offsetUnset($offset); - } - public function count() : int - { - return $this->records->count(); - } - public function isEmpty() : bool - { - return $this->count() === 0; - } - public function serialize() : string - { - return serialize($this->records->getArrayCopy()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $this->records = new ArrayIterator(unserialize($serialized)); - } - public function jsonSerialize() : array - { - return $this->toArray(); - } - public function withUniqueValuesExcluded() : self - { - return $this->filterValues(fn(DNSRecordInterface $candidateRecord, DNSRecordCollection $remaining): bool => $remaining->has($candidateRecord))->withUniqueValues(); - } - public function withUniqueValues() : self - { - return $this->filterValues(fn(DNSRecordInterface $candidateRecord, DNSRecordCollection $remaining): bool => !$remaining->has($candidateRecord)); - } - private function filterValues(callable $eval) : self - { - $filtered = new self(); - $records = $this->records->getArrayCopy(); - while ($record = array_shift($records)) { - if ($eval($record, new self(...$records))) { - $filtered[] = $record; - } - } - return $filtered; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/DNSRecordType.php b/dependencies/remotelyliving/php-dns/src/Entities/DNSRecordType.php deleted file mode 100644 index f496499..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/DNSRecordType.php +++ /dev/null @@ -1,124 +0,0 @@ - DNSRecordType::TYPE_A, 5 => DNSRecordType::TYPE_CNAME, 13 => DNSRecordType::TYPE_HINFO, 257 => DNSRecordType::TYPE_CAA, 15 => DNSRecordType::TYPE_MX, 2 => DNSRecordType::TYPE_NS, 12 => DNSRecordType::TYPE_PTR, 6 => DNSRecordType::TYPE_SOA, 16 => DNSRecordType::TYPE_TXT, 28 => DNSRecordType::TYPE_AAAA, 33 => DNSRecordType::TYPE_SRV, 35 => DNSRecordType::TYPE_NAPTR, 38 => DNSRecordType::TYPE_A6, 255 => DNSRecordType::TYPE_ANY]; - private string $type; - /** - * @throws \RemotelyLiving\PHPDNS\Exceptions\InvalidArgumentException - */ - public function __construct(string $type) - { - if (!in_array($type, self::VALID_TYPES, \true)) { - throw new InvalidArgumentException("{$type} is not an existing DNS record type"); - } - $this->type = $type; - } - public function __toString() : string - { - return $this->type; - } - /** - * @throws \RemotelyLiving\PHPDNS\Exceptions\InvalidArgumentException - */ - public static function createFromInt(int $code) : DNSRecordType - { - if (!isset(self::CODE_TYPE_MAP[$code])) { - throw new InvalidArgumentException("{$code} is not able to be mapped to an existing DNS record type"); - } - return new self(self::CODE_TYPE_MAP[$code]); - } - public static function createFromString(string $type) : DNSRecordType - { - return new self($type); - } - public function toInt() : int - { - return array_flip(self::CODE_TYPE_MAP)[$this->type]; - } - public function isA(string $type) : bool - { - return $this->type === strtoupper($type); - } - public function equals(DNSRecordType $recordType) : bool - { - return $this->type === (string) $recordType; - } - public static function createA() : self - { - return self::createFromString(self::TYPE_A); - } - public static function createCNAME() : self - { - return self::createFromString(self::TYPE_CNAME); - } - public static function createHINFO() : self - { - return self::createFromString(self::TYPE_HINFO); - } - public static function createCAA() : self - { - return self::createFromString(self::TYPE_CAA); - } - public static function createMX() : self - { - return self::createFromString(self::TYPE_MX); - } - public static function createNS() : self - { - return self::createFromString(self::TYPE_NS); - } - public static function createPTR() : self - { - return self::createFromString(self::TYPE_PTR); - } - public static function createSOA() : self - { - return self::createFromString(self::TYPE_SOA); - } - public static function createTXT() : self - { - return self::createFromString(self::TYPE_TXT); - } - public static function createAAAA() : self - { - return self::createFromString(self::TYPE_AAAA); - } - public static function createSRV() : self - { - return self::createFromString(self::TYPE_SRV); - } - public static function createNAPTR() : self - { - return self::createFromString(self::TYPE_NAPTR); - } - public static function createA6() : self - { - return self::createFromString(self::TYPE_A6); - } - public static function createANY() : self - { - return self::createFromString(self::TYPE_ANY); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/DataAbstract.php b/dependencies/remotelyliving/php-dns/src/Entities/DataAbstract.php deleted file mode 100644 index b370b90..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/DataAbstract.php +++ /dev/null @@ -1,59 +0,0 @@ -isA(DNSRecordType::TYPE_TXT)) { - return new TXTData(trim($data, '"')); - } - if ($recordType->isA(DNSRecordType::TYPE_NS)) { - return new NSData(new Hostname($data)); - } - if ($recordType->isA(DNSRecordType::TYPE_CNAME)) { - return new CNAMEData(new Hostname($data)); - } - $parsed = self::parseDataToArray($data); - if ($recordType->isA(DNSRecordType::TYPE_MX)) { - return new MXData(new Hostname($parsed[1]), (int) $parsed[0]); - } - if ($recordType->isA(DNSRecordType::TYPE_SOA)) { - return new SOAData(new Hostname($parsed[0]), new Hostname($parsed[1]), (int) ($parsed[2] ?? 0), (int) ($parsed[3] ?? 0), (int) ($parsed[4] ?? 0), (int) ($parsed[5] ?? 0), (int) ($parsed[6] ?? 0)); - } - if ($recordType->isA(DNSRecordType::TYPE_CAA) && count($parsed) === 3) { - return new CAAData((int) $parsed[0], (string) $parsed[1], $parsed[2]); - } - if ($recordType->isA(DNSRecordType::TYPE_SRV)) { - return new SRVData((int) $parsed[0] ?: 0, (int) $parsed[1] ?: 0, (int) $parsed[2] ?: 0, new Hostname($parsed[3])); - } - if ($recordType->isA(DNSRecordType::TYPE_PTR)) { - return new PTRData(new Hostname($data)); - } - throw new InvalidArgumentException("{$data} could not be created with type {$recordType}"); - } - public function jsonSerialize() : array - { - return $this->toArray(); - } - private static function parseDataToArray(string $data) : array - { - return explode(' ', $data); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/EntityAbstract.php b/dependencies/remotelyliving/php-dns/src/Entities/EntityAbstract.php deleted file mode 100644 index a985c15..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/EntityAbstract.php +++ /dev/null @@ -1,7 +0,0 @@ -normalizeHostName($hostname); - if (filter_var($hostname, \FILTER_VALIDATE_DOMAIN) !== $hostname) { - throw new InvalidArgumentException("{$hostname} is not a valid hostname"); - } - $this->hostname = $hostname; - } - public function __toString() : string - { - return $this->hostname; - } - public function equals(Hostname $hostname) : bool - { - return $this->hostname === (string) $hostname; - } - public static function createFromString(string $hostname) : Hostname - { - return new self($hostname); - } - public function getHostName() : string - { - return $this->hostname; - } - public function getHostnameWithoutTrailingDot() : string - { - return substr($this->hostname, 0, -1); - } - public function isPunycoded() : bool - { - return $this->toUTF8() !== $this->hostname; - } - public function toUTF8() : string - { - return (string) idn_to_utf8($this->hostname, \IDNA_ERROR_PUNYCODE, \INTL_IDNA_VARIANT_UTS46); - } - private static function punyCode(string $hostname) : string - { - return (string) idn_to_ascii($hostname, \IDNA_ERROR_PUNYCODE, \INTL_IDNA_VARIANT_UTS46); - } - private function normalizeHostName(string $hostname) : string - { - $hostname = self::punyCode(mb_strtolower(trim($hostname))); - if (substr($hostname, -1) !== '.') { - return "{$hostname}."; - } - return $hostname; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/IPAddress.php b/dependencies/remotelyliving/php-dns/src/Entities/IPAddress.php deleted file mode 100644 index 8494e5b..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/IPAddress.php +++ /dev/null @@ -1,50 +0,0 @@ -IPAddress = $IPAddress; - } - public function __toString() : string - { - return $this->IPAddress; - } - public static function isValid(string $IPAddress) : bool - { - return (bool) filter_var($IPAddress, \FILTER_VALIDATE_IP); - } - public static function createFromString(string $IPAddress) : IPAddress - { - return new self($IPAddress); - } - public function equals(IPAddress $IPAddress) : bool - { - return $this->IPAddress === (string) $IPAddress; - } - public function getIPAddress() : string - { - return $this->IPAddress; - } - public function isIPv6() : bool - { - return (bool) filter_var($this->IPAddress, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6); - } - public function isIPv4() : bool - { - return (bool) filter_var($this->IPAddress, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/Interfaces/Arrayable.php b/dependencies/remotelyliving/php-dns/src/Entities/Interfaces/Arrayable.php deleted file mode 100644 index 97fa3e7..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/Interfaces/Arrayable.php +++ /dev/null @@ -1,8 +0,0 @@ -target = $target; - $this->priority = $priority; - } - public function __toString() : string - { - return "{$this->priority} {$this->target}"; - } - public function getTarget() : Hostname - { - return $this->target; - } - public function getPriority() : int - { - return $this->priority; - } - public function toArray() : array - { - return ['target' => (string) $this->target, 'priority' => $this->priority]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->target = new Hostname($unserialized['target']); - $this->priority = $unserialized['priority']; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/NSData.php b/dependencies/remotelyliving/php-dns/src/Entities/NSData.php deleted file mode 100644 index 112529a..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/NSData.php +++ /dev/null @@ -1,38 +0,0 @@ -target = $target; - } - public function __toString() : string - { - return (string) $this->target; - } - public function getTarget() : Hostname - { - return $this->target; - } - public function toArray() : array - { - return ['target' => (string) $this->target]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->target = new Hostname($unserialized['target']); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/PTRData.php b/dependencies/remotelyliving/php-dns/src/Entities/PTRData.php deleted file mode 100644 index 2d39495..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/PTRData.php +++ /dev/null @@ -1,38 +0,0 @@ -hostname = $hostname; - } - public function __toString() : string - { - return (string) $this->hostname; - } - public function getHostname() : Hostname - { - return $this->hostname; - } - public function toArray() : array - { - return ['hostname' => (string) $this->hostname]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->hostname = new Hostname($unserialized['hostname']); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/SOAData.php b/dependencies/remotelyliving/php-dns/src/Entities/SOAData.php deleted file mode 100644 index adc3419..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/SOAData.php +++ /dev/null @@ -1,106 +0,0 @@ -mname = $mname; - $this->rname = $rname; - $this->serial = $serial; - $this->refresh = $refresh; - $this->retry = $retry; - $this->expire = $expire; - $this->minTTL = $minTTL; - } - public function __toString() : string - { - return vsprintf(self::TEMPLATE, $this->toArray()); - } - /** - * @return \RemotelyLiving\PHPDNS\Entities\Hostname - */ - public function getMname() : Hostname - { - return $this->mname; - } - /** - * @return \RemotelyLiving\PHPDNS\Entities\Hostname - */ - public function getRname() : Hostname - { - return $this->rname; - } - /** - * @return int - */ - public function getSerial() : int - { - return $this->serial; - } - /** - * @return int - */ - public function getRefresh() : int - { - return $this->refresh; - } - /** - * @return int - */ - public function getRetry() : int - { - return $this->retry; - } - /** - * @return int - */ - public function getExpire() : int - { - return $this->expire; - } - /** - * @return int - */ - public function getMinTTL() : int - { - return $this->minTTL; - } - public function toArray() : array - { - return ['mname' => (string) $this->mname, 'rname' => (string) $this->rname, 'serial' => $this->serial, 'refresh' => $this->refresh, 'retry' => $this->retry, 'expire' => $this->expire, 'minimumTTL' => $this->minTTL]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->mname = new Hostname($unserialized['mname']); - $this->rname = new Hostname($unserialized['rname']); - $this->serial = $unserialized['serial']; - $this->refresh = $unserialized['refresh']; - $this->retry = $unserialized['retry']; - $this->expire = $unserialized['expire']; - $this->minTTL = $unserialized['minimumTTL']; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/SRVData.php b/dependencies/remotelyliving/php-dns/src/Entities/SRVData.php deleted file mode 100644 index 1a62e5b..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/SRVData.php +++ /dev/null @@ -1,59 +0,0 @@ -priority = $priority; - $this->weight = $weight; - $this->port = $port; - $this->target = $target; - } - public function __toString() : string - { - return "{$this->priority} {$this->weight} {$this->port} {$this->target}"; - } - public function getPriority() : int - { - return $this->priority; - } - public function getWeight() : int - { - return $this->weight; - } - public function getPort() : int - { - return $this->port; - } - public function getTarget() : Hostname - { - return $this->target; - } - public function toArray() : array - { - return ['priority' => $this->priority, 'weight' => $this->weight, 'port' => $this->port, 'target' => (string) $this->target]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->priority = $unserialized['priority']; - $this->weight = $unserialized['weight']; - $this->port = $unserialized['port']; - $this->target = new Hostname($unserialized['target']); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Entities/TXTData.php b/dependencies/remotelyliving/php-dns/src/Entities/TXTData.php deleted file mode 100644 index 5b0ba68..0000000 --- a/dependencies/remotelyliving/php-dns/src/Entities/TXTData.php +++ /dev/null @@ -1,38 +0,0 @@ -value = $value; - } - public function __toString() : string - { - return $this->value; - } - public function getValue() : string - { - return $this->value; - } - public function toArray() : array - { - return ['value' => $this->value]; - } - public function serialize() : string - { - return serialize($this->toArray()); - } - /** - * @param string $serialized - */ - public function unserialize($serialized) : void - { - $unserialized = unserialize($serialized); - $this->value = $unserialized['value']; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Exceptions/Exception.php b/dependencies/remotelyliving/php-dns/src/Exceptions/Exception.php deleted file mode 100644 index 7e0fe1a..0000000 --- a/dependencies/remotelyliving/php-dns/src/Exceptions/Exception.php +++ /dev/null @@ -1,12 +0,0 @@ - $this->getMessage(), 'code' => $this->getCode(), 'file' => $this->getFile(), 'line' => $this->getLine(), 'trace' => $this->getTraceAsString()]; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Exceptions/InvalidArgumentException.php b/dependencies/remotelyliving/php-dns/src/Exceptions/InvalidArgumentException.php deleted file mode 100644 index cc811aa..0000000 --- a/dependencies/remotelyliving/php-dns/src/Exceptions/InvalidArgumentException.php +++ /dev/null @@ -1,7 +0,0 @@ -fields['type']); - $IPAddress = isset($this->fields[self::DATA]) && IPAddress::isValid($this->fields[self::DATA]) ? $this->fields[self::DATA] : null; - $value = isset($this->fields[self::DATA]) && !$IPAddress ? str_ireplace('"', '', (string) $this->fields[self::DATA]) : null; - return DNSRecord::createFromPrimitives((string) $type, $this->fields['name'], $this->fields['TTL'], $IPAddress, 'IN', $value); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Mappers/Dig.php b/dependencies/remotelyliving/php-dns/src/Mappers/Dig.php deleted file mode 100644 index a33b962..0000000 --- a/dependencies/remotelyliving/php-dns/src/Mappers/Dig.php +++ /dev/null @@ -1,18 +0,0 @@ -fields[3]); - if ($type->isA(DNSRecordType::TYPE_A) || $type->isA(DNSRecordType::TYPE_AAAA)) { - return DNSRecord::createFromPrimitives($this->fields[3], (string) $this->fields[0], (int) $this->fields[1], $this->fields[4]); - } - return DNSRecord::createFromPrimitives($this->fields[3], (string) $this->fields[0], (int) $this->fields[1], null, 'IN', $this->fields[4]); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Mappers/GoogleDNS.php b/dependencies/remotelyliving/php-dns/src/Mappers/GoogleDNS.php deleted file mode 100644 index 2876d52..0000000 --- a/dependencies/remotelyliving/php-dns/src/Mappers/GoogleDNS.php +++ /dev/null @@ -1,24 +0,0 @@ -fields['type']); - $IPAddress = isset($this->fields[self::DATA]) && IPAddress::isValid($this->fields[self::DATA]) ? $this->fields[self::DATA] : null; - $value = isset($this->fields[self::DATA]) && !$IPAddress ? str_ireplace('"', '', (string) $this->fields[self::DATA]) : null; - return DNSRecord::createFromPrimitives((string) $type, $this->fields['name'], $this->fields['TTL'], $IPAddress, 'IN', $value); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Mappers/LocalSystem.php b/dependencies/remotelyliving/php-dns/src/Mappers/LocalSystem.php deleted file mode 100644 index 636ba42..0000000 --- a/dependencies/remotelyliving/php-dns/src/Mappers/LocalSystem.php +++ /dev/null @@ -1,76 +0,0 @@ - DNSRecordType::TYPE_A, DNS_CNAME => DNSRecordType::TYPE_CNAME, DNS_HINFO => DNSRecordType::TYPE_HINFO, DNS_CAA => DNSRecordType::TYPE_CAA, DNS_MX => DNSRecordType::TYPE_MX, DNS_NS => DNSRecordType::TYPE_NS, DNS_PTR => DNSRecordType::TYPE_PTR, DNS_SOA => DNSRecordType::TYPE_SOA, DNS_TXT => DNSRecordType::TYPE_TXT, DNS_AAAA => DNSRecordType::TYPE_AAAA, DNS_SRV => DNSRecordType::TYPE_SRV, DNS_NAPTR => DNSRecordType::TYPE_NAPTR, DNS_A6 => DNSRecordType::TYPE_A6, DNS_ANY => DNSRecordType::TYPE_ANY]; - /** - * @var string - */ - private const TARGET = 'target'; - /** - * @var string - */ - private const PRI = 'pri'; - /** - * @var string - */ - private const TEMPLATE = '%s %s %s %s %s %s %s'; - public function toDNSRecord() : DNSRecordInterface - { - $IPAddress = null; - if (isset($this->fields['ipv6'])) { - $IPAddress = $this->fields['ipv6']; - } - if (isset($this->fields['ip'])) { - $IPAddress = $this->fields['ip']; - } - return DNSRecord::createFromPrimitives($this->fields['type'], $this->fields['host'], $this->fields['ttl'], $IPAddress, $this->fields['class'], $this->formatData($this->fields)); - } - public function getTypeCodeFromType(DNSRecordType $type) : int - { - return array_flip(self::PHP_CODE_TYPE_MAP)[(string) $type] ?? DNS_ANY; - } - private function formatData(array $fields) : ?string - { - if (isset($this->fields['flags'], $fields['tag'], $fields['value'])) { - return "{$fields['flags']} {$fields['tag']} \"{$fields['value']}\""; - } - if (isset($fields['mname'])) { - return sprintf(self::TEMPLATE, $fields['mname'], $fields['rname'], $fields['serial'], $fields['refresh'], $fields['retry'], $fields['expire'], $fields['minimum-ttl']); - } - if (isset($fields[self::TARGET], $fields[self::PRI], $fields['weight'], $fields['port'])) { - return "{$fields[self::PRI]} {$fields['weight']} {$fields['port']} {$fields[self::TARGET]}"; - } - if (isset($fields[self::TARGET], $fields[self::PRI])) { - return "{$fields[self::PRI]} {$fields[self::TARGET]}"; - } - if (isset($fields[self::TARGET])) { - return $fields[self::TARGET]; - } - if (isset($fields['txt'])) { - return $fields['txt']; - } - return null; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Mappers/MapperAbstract.php b/dependencies/remotelyliving/php-dns/src/Mappers/MapperAbstract.php deleted file mode 100644 index 587e43a..0000000 --- a/dependencies/remotelyliving/php-dns/src/Mappers/MapperAbstract.php +++ /dev/null @@ -1,18 +0,0 @@ -fields = $fields; - } - public function mapFields(array $fields) : MapperInterface - { - return new static($fields); - } - public abstract function toDNSRecord() : DNSRecordInterface; -} diff --git a/dependencies/remotelyliving/php-dns/src/Mappers/MapperInterface.php b/dependencies/remotelyliving/php-dns/src/Mappers/MapperInterface.php deleted file mode 100644 index 4f00901..0000000 --- a/dependencies/remotelyliving/php-dns/src/Mappers/MapperInterface.php +++ /dev/null @@ -1,10 +0,0 @@ -resolver = $resolver; - $this->hostname = $hostname; - $this->recordType = $recordType; - $this->recordCollection = $recordCollection ?? new DNSRecordCollection(); - } - public function getResolver() : Resolver - { - return $this->resolver; - } - public function getHostname() : Hostname - { - return $this->hostname; - } - public function getRecordType() : DNSRecordType - { - return $this->recordType; - } - public function getRecordCollection() : DNSRecordCollection - { - return $this->recordCollection; - } - public static function getName() : string - { - return self::NAME; - } - public function toArray() : array - { - return ['resolver' => $this->resolver->getName(), 'hostname' => (string) $this->hostname, 'type' => (string) $this->recordType, 'records' => $this->formatCollection($this->recordCollection), 'empty' => $this->recordCollection->isEmpty()]; - } - private function formatCollection(DNSRecordCollection $recordCollection) : array - { - $formatted = []; - foreach ($recordCollection as $record) { - if ($record) { - $formatted[] = $record->toArray(); - } - } - return $formatted; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryFailed.php b/dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryFailed.php deleted file mode 100644 index 2364251..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryFailed.php +++ /dev/null @@ -1,48 +0,0 @@ -resolver = $resolver; - $this->hostname = $hostname; - $this->recordType = $recordType; - $this->error = $error; - } - public function getResolver() : Resolver - { - return $this->resolver; - } - public function getHostName() : Hostname - { - return $this->hostname; - } - public function getRecordType() : DNSRecordType - { - return $this->recordType; - } - public function getError() : Exception - { - return $this->error; - } - public static function getName() : string - { - return self::NAME; - } - public function toArray() : array - { - return ['resolver' => $this->resolver->getName(), 'hostname' => (string) $this->hostname, 'type' => (string) $this->recordType, 'error' => $this->error]; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryProfiled.php b/dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryProfiled.php deleted file mode 100644 index 7ea6fc6..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Events/DNSQueryProfiled.php +++ /dev/null @@ -1,28 +0,0 @@ -profile = $profile; - } - public function getProfile() : ProfileInterface - { - return $this->profile; - } - public static function getName() : string - { - return self::NAME; - } - public function toArray() : array - { - return ['elapsedSeconds' => $this->profile->getElapsedSeconds(), 'transactionName' => $this->profile->getTransactionName(), 'peakMemoryUsage' => $this->profile->getPeakMemoryUsage()]; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Events/ObservableEventAbstract.php b/dependencies/remotelyliving/php-dns/src/Observability/Events/ObservableEventAbstract.php deleted file mode 100644 index 00a94d8..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Events/ObservableEventAbstract.php +++ /dev/null @@ -1,15 +0,0 @@ - $this->toArray()]; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Interfaces/Observable.php b/dependencies/remotelyliving/php-dns/src/Observability/Interfaces/Observable.php deleted file mode 100644 index e47a601..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Interfaces/Observable.php +++ /dev/null @@ -1,10 +0,0 @@ -transactionName = $transactionName; - $this->time = $time ?? new Timer(); - } - public function startTransaction() : void - { - $this->startTime = $this->time->getMicroTime(); - } - public function endTransaction() : void - { - $this->stopTime = $this->time->getMicroTime(); - } - public function getTransactionName() : string - { - return $this->transactionName; - } - public function getElapsedSeconds() : float - { - return $this->stopTime - $this->startTime; - } - public function samplePeakMemoryUsage() : void - { - $this->peakMemoryUsage = memory_get_peak_usage(); - } - public function getPeakMemoryUsage() : int - { - return $this->peakMemoryUsage; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Performance/ProfileFactory.php b/dependencies/remotelyliving/php-dns/src/Observability/Performance/ProfileFactory.php deleted file mode 100644 index 488ceb2..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Performance/ProfileFactory.php +++ /dev/null @@ -1,11 +0,0 @@ -STDOUT = $stdOut; - $this->STDERR = $stdErr; - } - public static function getSubscribedEvents() - { - return [DNSQueryFailed::getName() => 'onDNSQueryFailed', DNSQueried::getName() => 'onDNSQueried', DNSQueryProfiled::getName() => 'onDNSQueryProfiled']; - } - public function onDNSQueryFailed(ObservableEventAbstract $event) : void - { - $this->STDERR->fwrite(json_encode($event, \JSON_PRETTY_PRINT) . \PHP_EOL); - } - public function onDNSQueried(ObservableEventAbstract $event) : void - { - $this->STDOUT->fwrite(json_encode($event, \JSON_PRETTY_PRINT) . \PHP_EOL); - } - public function onDNSQueryProfiled(ObservableEventAbstract $event) : void - { - $this->STDOUT->fwrite(json_encode($event, \JSON_PRETTY_PRINT) . \PHP_EOL); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Traits/Dispatcher.php b/dependencies/remotelyliving/php-dns/src/Observability/Traits/Dispatcher.php deleted file mode 100644 index e212bcb..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Traits/Dispatcher.php +++ /dev/null @@ -1,53 +0,0 @@ -dispatcher = $dispatcher; - } - public function addSubscriber(EventSubscriberInterface $subscriber) : void - { - $this->getDispatcher()->addSubscriber($subscriber); - } - public function addListener(string $eventName, callable $listener, int $priority = 0) : void - { - $this->getDispatcher()->addListener($eventName, $listener, $priority); - } - public function dispatch(ObservableEventAbstract $event) : void - { - call_user_func_array([$this->getDispatcher(), 'dispatch'], $this->getOrderedDispatcherArguments($event)); - } - private function getOrderedDispatcherArguments(ObservableEventAbstract $event) : array - { - $reflection = new ReflectionClass($this->getDispatcher()); - foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - if ($method->getName() !== 'dispatch') { - continue; - } - // handle the reverse argument BC from symfony dispatcher 3.* to 4.* - foreach ($method->getParameters() as $parameter) { - return $parameter->getName() === 'event' ? [$event, $event::getName()] : [$event::getName(), $event]; - } - } - throw new LogicException('Could not determine argument order for dispatcher'); - } - private function getDispatcher() : EventDispatcherInterface - { - if ($this->dispatcher === null) { - $this->dispatcher = new EventDispatcher(); - } - return $this->dispatcher; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Traits/Logger.php b/dependencies/remotelyliving/php-dns/src/Observability/Traits/Logger.php deleted file mode 100644 index d708cd2..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Traits/Logger.php +++ /dev/null @@ -1,21 +0,0 @@ -logger = $logger; - } - protected function getLogger() : LoggerInterface - { - if ($this->logger === null) { - $this->logger = new NullLogger(); - } - return $this->logger; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Observability/Traits/Profileable.php b/dependencies/remotelyliving/php-dns/src/Observability/Traits/Profileable.php deleted file mode 100644 index 574cee3..0000000 --- a/dependencies/remotelyliving/php-dns/src/Observability/Traits/Profileable.php +++ /dev/null @@ -1,25 +0,0 @@ -getProfileFactory()->create($transactionName); - } - public function setProfileFactory(ProfileFactory $profileFactory) : void - { - $this->profileFactory = $profileFactory; - } - private function getProfileFactory() : ProfileFactory - { - if ($this->profileFactory === null) { - $this->profileFactory = new ProfileFactory(); - } - return $this->profileFactory; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/Cached.php b/dependencies/remotelyliving/php-dns/src/Resolvers/Cached.php deleted file mode 100644 index aeb3c1e..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/Cached.php +++ /dev/null @@ -1,94 +0,0 @@ -cache = $cache; - $this->resolver = $resolver; - $this->ttlSeconds = $ttlSeconds; - } - public function flush() : void - { - $this->cache->clear(); - } - public function withEmptyResultCachingDisabled() : self - { - $emptyCachingDisabled = new self($this->cache, $this->resolver, $this->ttlSeconds); - $emptyCachingDisabled->shouldCacheEmptyResults = \false; - return $emptyCachingDisabled; - } - protected function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection - { - $cachedResult = $this->cache->getItem($this->buildCacheKey($hostname, $recordType)); - if ($cachedResult->isHit()) { - return $this->unwrapResults($cachedResult->get()); - } - $dnsRecords = $this->resolver->getRecords((string) $hostname, (string) $recordType); - if ($dnsRecords->isEmpty() && $this->shouldCacheEmptyResults === \false) { - return $dnsRecords; - } - $ttlSeconds = $this->ttlSeconds ?? $this->extractLowestTTL($dnsRecords); - $cachedResult->expiresAfter($ttlSeconds); - $cachedResult->set(['recordCollection' => $dnsRecords, 'timestamp' => $this->getTimeStamp()]); - $this->cache->save($cachedResult); - return $dnsRecords; - } - private function buildCacheKey(Hostname $hostname, DNSRecordType $recordType) : string - { - return md5(sprintf(self::CACHE_KEY_TEMPLATE, self::NAMESPACE, (string) $hostname, (string) $recordType)); - } - private function extractLowestTTL(DNSRecordCollection $recordCollection) : int - { - $ttls = []; - /** @var \RemotelyLiving\PHPDNS\Entities\DNSRecord $record */ - foreach ($recordCollection as $record) { - /** @scrutinizer ignore-call */ - if ($record->getTTL() <= 0) { - continue; - } - $ttls[] = $record->getTTL(); - } - return count($ttls) ? min($ttls) : self::DEFAULT_CACHE_TTL; - } - /** - * @param array $results ['recordCollection' => $recordCollection, 'timestamp' => $timeStamp] - */ - private function unwrapResults(array $results) : DNSRecordCollection - { - /** @var DNSRecordCollection $records */ - $records = $results['recordCollection']; - /** - * @var int $key - * @var \RemotelyLiving\PHPDNS\Entities\DNSRecord $record - */ - foreach ($records as $key => $record) { - $records[$key] = $record->setTTL(max($record->getTTL() - ($this->getTimeStamp() - (int) $results['timestamp']), 0)); - } - return $records; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/Chain.php b/dependencies/remotelyliving/php-dns/src/Resolvers/Chain.php deleted file mode 100644 index 39f7775..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/Chain.php +++ /dev/null @@ -1,119 +0,0 @@ -pushResolver($resolver); - } - } - public function pushResolver(Resolver ...$resolvers) : void - { - foreach ($resolvers as $resolver) { - $this->resolvers[] = $resolver; - } - } - public function withAllResults() : Interfaces\Chain - { - $all = new self(...$this->resolvers); - $all->callThroughStrategy = self::STRATEGY_ALL_RESULTS; - return $all; - } - public function withFirstResults() : Interfaces\Chain - { - $first = new self(...$this->resolvers); - $first->callThroughStrategy = self::STRATEGY_FIRST_TO_FIND; - return $first; - } - public function withConsensusResults() : Interfaces\Chain - { - $consensus = new self(...$this->resolvers); - $consensus->callThroughStrategy = self::STRATEGY_CONSENSUS; - return $consensus; - } - public function randomly() : Interfaces\Chain - { - $randomized = clone $this; - shuffle($randomized->resolvers); - return $randomized; - } - public function addSubscriber(EventSubscriberInterface $subscriber) : void - { - foreach ($this->resolvers as $resolver) { - if ($resolver instanceof Observable) { - $resolver->addSubscriber($subscriber); - } - } - } - public function addListener(string $eventName, callable $listener, int $priority = 0) : void - { - foreach ($this->resolvers as $resolver) { - if ($resolver instanceof Observable) { - $resolver->addListener($eventName, $listener, $priority); - } - } - } - public function setLogger(LoggerInterface $logger) : void - { - foreach ($this->resolvers as $resolver) { - if ($resolver instanceof LoggerAwareInterface) { - $resolver->setLogger($logger); - } - } - } - public function hasRecord(DNSRecordInterface $record) : bool - { - foreach ($this->resolvers as $resolver) { - if ($resolver->hasRecord($record)) { - return \true; - } - } - return \false; - } - protected function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection - { - $merged = []; - foreach ($this->resolvers as $resolver) { - try { - $records = $resolver->getRecords((string) $hostname, (string) $recordType); - } catch (Exception $e) { - $this->getLogger()->error('Something went wrong in the chain of resolvers', ['exception' => json_encode($e), 'resolver' => $resolver->getName()]); - continue; - } - if ($this->callThroughStrategy === self::STRATEGY_FIRST_TO_FIND && !$records->isEmpty()) { - return $records; - } - /** @var DNSRecord $record */ - foreach ($records as $record) { - $merged[] = $record; - } - } - $collection = new DNSRecordCollection(...$merged); - return $this->callThroughStrategy === self::STRATEGY_CONSENSUS ? $collection->withUniqueValuesExcluded() : $collection->withUniqueValues(); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/CloudFlare.php b/dependencies/remotelyliving/php-dns/src/Resolvers/CloudFlare.php deleted file mode 100644 index 0ccfdc3..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/CloudFlare.php +++ /dev/null @@ -1,83 +0,0 @@ - self::BASE_URI, 'connect_timeout' => self::DEFAULT_TIMEOUT, 'strict' => \true, 'allow_redirects' => \false, 'protocols' => ['https'], 'headers' => ['Accept' => 'application/dns-json']]; - private ClientInterface $http; - private CloudFlareMapper $mapper; - /** - * @var array - */ - private array $options; - public function __construct(ClientInterface $http = null, CloudFlareMapper $mapper = null, array $options = self::DEFAULT_OPTIONS) - { - $this->http = $http ?? new Client(); - $this->mapper = $mapper ?? new CloudFlareMapper(); - $this->options = $options; - } - protected function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection - { - try { - return !$recordType->isA(DNSRecordType::TYPE_ANY) ? $this->doApiQuery($hostname, $recordType) : $this->doAnyApiQuery($hostname); - } catch (Throwable $e) { - throw new QueryFailure("Unable to query CloudFlare API", 0, $e); - } - } - /** - * Cloudflare does not support ANY queries, so we must ask for all record types individually - */ - private function doAnyApiQuery(Hostname $hostname) : DNSRecordCollection - { - $results = []; - $eachPromise = new EachPromise($this->generateEachTypeQuery($hostname), ['concurrency' => 4, 'fulfilled' => function (ResponseInterface $response) use(&$results) { - $results = array_merge($results, $this->parseResult((array) json_decode((string) $response->getBody(), \true))); - }, 'rejected' => function (Throwable $e) : void { - throw $e; - }]); - $eachPromise->promise()->wait(\true); - return $this->mapResults($this->mapper, $results); - } - private function generateEachTypeQuery(Hostname $hostname) : Generator - { - foreach (DNSRecordType::VALID_TYPES as $type) { - if ($type === DNSRecordType::TYPE_ANY) { - continue 1; - } - (yield $this->http->requestAsync('GET', '/dns-query?' . http_build_query(['name' => (string) $hostname, 'type' => $type]), $this->options)); - } - } - private function doApiQuery(Hostname $hostname, DNSRecordType $type) : DNSRecordCollection - { - $url = '/dns-query?' . http_build_query(['name' => (string) $hostname, 'type' => (string) $type]); - $decoded = (array) json_decode((string) $this->http->requestAsync('GET', $url, $this->options)->wait(\true)->getBody(), \true); - return $this->mapResults($this->mapper, $this->parseResult($decoded)); - } - private function parseResult(array $result) : array - { - if (isset($result['Answer'])) { - return $result['Answer']; - } - if (isset($result['Authority'])) { - return $result['Authority']; - } - return []; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/Dig.php b/dependencies/remotelyliving/php-dns/src/Resolvers/Dig.php deleted file mode 100644 index c38b3ee..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/Dig.php +++ /dev/null @@ -1,73 +0,0 @@ -spatieDNSFactory = $spatieDNSFactory ?? new SpatieDNS(); - $this->mapper = $mapper ?? new DigMapper(); - $this->nameserver = $nameserver; - } - protected function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection - { - if (!self::isSupportedQueryType($recordType)) { - return new DNSRecordCollection(); - } - $dig = $this->spatieDNSFactory->createResolver($hostname, $this->nameserver); - try { - $response = $recordType->equals(DNSRecordType::createANY()) ? $dig->getRecords(...self::SUPPORTED_QUERY_TYPES) : $dig->getRecords((string) $recordType); - } catch (Throwable $e) { - throw new QueryFailure($e->getMessage(), 0, $e); - } - return $this->mapResults($this->mapper, self::parseDigResponseToRows($response)); - } - private static function parseDigResponseToRows(string $digResponse) : array - { - $rows = []; - foreach (explode(\PHP_EOL, self::normalizeColumns($digResponse)) as $line) { - if (!trim($line)) { - continue; - } - $columns = explode(' ', $line); - $rows[] = [$columns[0], $columns[1], $columns[2], $columns[3], implode(' ', array_slice($columns, 4))]; - } - return $rows; - } - private static function normalizeColumns(string $response) : string - { - $keysRemoved = preg_replace('/;(.*)/m', ' ', trim($response)); - $tabsRemoved = preg_replace('/(\\t+)/m', ' ', (string) $keysRemoved); - $breaksRemoved = preg_replace('/\\s\\s/m', '', (string) $tabsRemoved); - return (string) preg_replace('/(\\(\\s|(\\s\\)))/m', '', (string) $breaksRemoved); - } - private static function isSupportedQueryType(DNSRecordType $type) : bool - { - if ($type->isA(DNSRecordType::TYPE_ANY)) { - return \true; - } - foreach (self::SUPPORTED_QUERY_TYPES as $queryType) { - if ($type->isA($queryType)) { - return \true; - } - } - return \false; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/Exceptions/QueryFailure.php b/dependencies/remotelyliving/php-dns/src/Resolvers/Exceptions/QueryFailure.php deleted file mode 100644 index 524a6ba..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/Exceptions/QueryFailure.php +++ /dev/null @@ -1,8 +0,0 @@ - self::BASE_URI, 'strict' => \true, 'allow_redirects' => \false, 'connect_timeout' => self::DEFAULT_TIMEOUT, 'protocols' => ['https'], 'headers' => ['Accept' => 'application/json']]; - private ClientInterface $http; - private GoogleDNSMapper $mapper; - private int $consensusAttempts; - /** - * @var array - */ - private array $options; - public function __construct(ClientInterface $http = null, GoogleDNSMapper $mapper = null, int $consensusAttempts = 3, array $options = self::DEFAULT_OPTIONS) - { - $this->http = $http ?? new Client(); - $this->mapper = $mapper ?? new GoogleDNSMapper(); - $this->consensusAttempts = $consensusAttempts; - $this->options = $options; - } - /** - * Google DNS has consistency issues so this tries a few times to get an answer - */ - public function hasRecord(DNSRecordInterface $record) : bool - { - $attempts = 0; - do { - $hasRecord = $this->getRecords((string) $record->getHostname(), (string) $record->getType())->has($record); - ++$attempts; - } while ($hasRecord === \false && $attempts < $this->consensusAttempts); - return $hasRecord; - } - protected function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection - { - $results = $this->doApiQuery(['name' => (string) $hostname, 'type' => (string) $recordType]); - return $this->mapResults($this->mapper, $results); - } - /** - * @throws \RemotelyLiving\PHPDNS\Resolvers\Exceptions\QueryFailure - */ - private function doApiQuery(array $query = []) : array - { - try { - $response = $this->http->request('GET', '/resolve?' . http_build_query($query), $this->options); - } catch (Throwable $e) { - throw new QueryFailure("Unable to query GoogleDNS API", 0, $e); - } - $result = (array) json_decode((string) $response->getBody(), \true); - if (isset($result['Answer'])) { - return $result['Answer']; - } - if (isset($result['Authority'])) { - return $result['Authority']; - } - return []; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/Chain.php b/dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/Chain.php deleted file mode 100644 index b8f79e9..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/Interfaces/Chain.php +++ /dev/null @@ -1,26 +0,0 @@ -systemDNS = $systemDNS ?? new LocalDNSService(); - $this->mapper = $mapper ?? new LocalMapper(); - } - public function getHostnameByAddress(string $IPAddress) : Hostname - { - $result = $this->systemDNS->getHostnameByAddress((string) new IPAddress($IPAddress)); - return Hostname::createFromString($result); - } - protected function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection - { - $results = $this->systemDNS->getRecord( - $hostname->getHostnameWithoutTrailingDot(), - // dns_get_record doesn't like trailing dot as much! - $this->mapper->getTypeCodeFromType($recordType) - ); - $collection = new DNSRecordCollection(); - foreach ($results as $result) { - $collection[] = $this->mapper->mapFields($result)->toDNSRecord(); - } - return $collection; - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/ResolverAbstract.php b/dependencies/remotelyliving/php-dns/src/Resolvers/ResolverAbstract.php deleted file mode 100644 index 298c92a..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/ResolverAbstract.php +++ /dev/null @@ -1,115 +0,0 @@ -name)) { - $explodedClass = explode('\\', get_class($this)); - $this->name = array_pop($explodedClass); - } - return $this->name; - } - public function getARecords(string $hostname) : DNSRecordCollection - { - return $this->getRecords($hostname, (string) DNSRecordType::createA()); - } - public function getAAAARecords(string $hostname) : DNSRecordCollection - { - return $this->getRecords($hostname, (string) DNSRecordType::createAAAA()); - } - public function getCNAMERecords(string $hostname) : DNSRecordCollection - { - return $this->getRecords($hostname, (string) DNSRecordType::createCNAME()); - } - public function getTXTRecords(string $hostname) : DNSRecordCollection - { - return $this->getRecords($hostname, (string) DNSRecordType::createTXT()); - } - public function getMXRecords(string $hostname) : DNSRecordCollection - { - return $this->getRecords($hostname, (string) DNSRecordType::createMX()); - } - public function recordTypeExists(string $hostname, string $recordType) : bool - { - return !$this->getRecords($hostname, $recordType)->isEmpty(); - } - public function hasRecord(DNSRecordInterface $record) : bool - { - return $this->getRecords((string) $record->getHostname(), (string) $record->getType())->has($record); - } - /** - * @throws \RemotelyLiving\PHPDNS\Resolvers\Exceptions\QueryFailure - */ - public function getRecords(string $hostname, string $recordType = null) : DNSRecordCollection - { - $recordType = DNSRecordType::createFromString($recordType ?? 'ANY'); - $hostname = Hostname::createFromString($hostname); - $profile = $this->createProfile("{$this->getName()}:{$hostname}:{$recordType}"); - $profile->startTransaction(); - try { - $result = $recordType->equals(DNSRecordType::createANY()) ? $this->doQuery($hostname, $recordType) : $this->doQuery($hostname, $recordType)->filteredByType($recordType); - } catch (QueryFailure $e) { - $dnsQueryFailureEvent = new DNSQueryFailed($this, $hostname, $recordType, $e); - $this->dispatch($dnsQueryFailureEvent); - $this->getLogger()->error('DNS query failed', [self::EVENT => json_encode($dnsQueryFailureEvent), 'exception' => $e]); - throw $e; - } finally { - $profile->endTransaction(); - $profile->samplePeakMemoryUsage(); - $dnsQueryProfiledEvent = new DNSQueryProfiled($profile); - $this->dispatch($dnsQueryProfiledEvent); - $this->getLogger()->info('DNS query profiled', [self::EVENT => json_encode($dnsQueryProfiledEvent)]); - } - $dnsQueriedEvent = new DNSQueried($this, $hostname, $recordType, $result); - $this->dispatch($dnsQueriedEvent); - $this->getLogger()->info('DNS queried', [self::EVENT => json_encode($dnsQueriedEvent)]); - return $result; - } - public function mapResults(MapperInterface $mapper, array $results) : DNSRecordCollection - { - $collection = new DNSRecordCollection(); - array_map(function (array $fields) use(&$collection, $mapper) { - try { - $collection[] = $mapper->mapFields($fields)->toDNSRecord(); - } catch (InvalidArgumentException $e) { - $this->getLogger()->warning('Invalid fields passed to mapper', $fields); - } - }, $results); - return $collection; - } - /** - * @throws \RemotelyLiving\PHPDNS\Resolvers\Exceptions\QueryFailure - */ - protected abstract function doQuery(Hostname $hostname, DNSRecordType $recordType) : DNSRecordCollection; -} diff --git a/dependencies/remotelyliving/php-dns/src/Resolvers/Traits/Time.php b/dependencies/remotelyliving/php-dns/src/Resolvers/Traits/Time.php deleted file mode 100644 index c65b1d3..0000000 --- a/dependencies/remotelyliving/php-dns/src/Resolvers/Traits/Time.php +++ /dev/null @@ -1,24 +0,0 @@ -dateTimeImmutable = $dateTimeImmutable; - } - public function getTimeStamp() : int - { - return $this->getNewDateTimeImmutable()->getTimestamp(); - } - private function getNewDateTimeImmutable() : DateTimeImmutable - { - if (!$this->dateTimeImmutable) { - $this->dateTimeImmutable = new DateTimeImmutable(); - } - return $this->dateTimeImmutable->setTimestamp(\time()); - } -} diff --git a/dependencies/remotelyliving/php-dns/src/Services/Interfaces/LocalSystemDNS.php b/dependencies/remotelyliving/php-dns/src/Services/Interfaces/LocalSystemDNS.php deleted file mode 100644 index 9851302..0000000 --- a/dependencies/remotelyliving/php-dns/src/Services/Interfaces/LocalSystemDNS.php +++ /dev/null @@ -1,23 +0,0 @@ - array(), 'limit' => 0, 'offset' => 0, 'sort_key' => null, 'sort_order' => 'ASC'); - /** - * @var str $key_split The string to split keys when checking a deep multidimensional array value. - */ - public static $key_split = '.'; - /** - * @var arr $operators A list of valid operators for comparisons. - */ - public static $operators = array('==', '===', '!=', '!==', '>', '<', '>=', '<=', '~', '!~'); - /** - * This method combines the functionality of the where() and sort() methods, - * with additional limit and offset parameters. Returns an array of matching - * array items. Will only sort if a sort key is set. - * - * @param arr $data The array of objects or associative arrays to search. - * @param arr $options The query options, see Arrch::$defaults. - * @param misc $key An item's key or index value. - * @return arr The result array. - */ - public static function find(array $data, array $options = array(), $key = 'all') - { - $options = static::merge(static::$defaults, $options); - $data = static::where($data, $options['where']); - $data = $options['sort_key'] ? static::sort($data, $options['sort_key'], $options['sort_order']) : $data; - $data = \array_slice($data, $options['offset'], $options['limit'] == 0 ? null : $options['limit'], \true); - switch ($key) { - case 'all': - return $data; - break; - case 'first': - return \array_shift($data); - break; - case 'last': - return \array_pop($data); - break; - default: - return isset($data[$key]) ? $data[$key] : null; - break; - } - } - /** - * Sorts an array of objects by the specified key. - * - * @param arr $data The array of objects or associative arrays to sort. - * @param str $key The object key or key path to use in sort evaluation. - * @param str $order ASC or DESC. - * @return arr The result array. - */ - public static function sort(array $data, $key, $order = null) - { - \uasort($data, function ($a, $b) use($key) { - $a_val = Arrch::extractValues($a, $key); - $b_val = Arrch::extractValues($b, $key); - // Strings - if (\is_string($a_val) && \is_string($b_val)) { - return \strcasecmp($a_val, $b_val); - } else { - if ($a_val == $b_val) { - return 0; - } else { - return $a_val > $b_val ? 1 : -1; - } - } - }); - if (\strtoupper($order ?: Arrch::$defaults['sort_order']) == 'DESC') { - $data = \array_reverse($data, \true); - } - return $data; - } - /** - * Evaluates an object based on an array of conditions - * passed into the function, formatted like so... - * - * array('city', 'arlington'); - * array('city', '!=', 'arlington'); - * - * @param arr $data The array of objects or associative arrays to search. - * @param arr $conditions The conditions to evaluate against. - * @return arr The result array. - */ - public static function where(array $data, array $conditions = array()) - { - foreach ($conditions as $condition) { - if (!\is_array($condition)) { - \trigger_error('Condition ' . \var_export($condition, \true) . ' must be an array!', \E_USER_ERROR); - } else { - \array_map(function ($item, $key) use(&$data, $condition) { - $return = 0; - $operator = \array_key_exists(2, $condition) ? $condition[1] : '==='; - $search_value = \array_key_exists(2, $condition) ? $condition[2] : $condition[1]; - if (\is_array($condition[0])) { - // array of keys - if (\is_array($search_value)) { - // array of values - foreach ($condition[0] as $prop) { - $value = Arrch::extractValues($item, $prop); - foreach ($search_value as $query_val) { - $return += Arrch::compare(array($value, $operator, $query_val)) ? 1 : 0; - } - } - } else { - // single value - foreach ($condition[0] as $prop) { - $value = Arrch::extractValues($item, $prop); - $return += Arrch::compare(array($value, $operator, $search_value)) ? 1 : 0; - } - } - } elseif (\is_array($search_value)) { - // single key, array of query values - $value = Arrch::extractValues($item, $condition[0]); - $c = 0; - foreach ($search_value as $query_val) { - $c += Arrch::compare(array($value, $operator, $query_val)) ? 1 : 0; - } - // Negate options that don't pass all negative assertions - if (\in_array($operator, array('!==', '!=', '!~')) && $c < \count($search_value)) { - $c = 0; - } - $return += $c; - } else { - // single key, single value - $value = Arrch::extractValues($item, $condition[0]); - $return = Arrch::compare(array($value, $operator, $search_value)); - } - // Unset - if (!$return) { - unset($data[$key]); - } - }, $data, \array_keys($data)); - } - } - return $data; - } - /** - * Finds the requested value in a multidimensional array or an object and - * returns it. - * - * @param mixed $item The item containing the value. - * @param str $key The key or key path to the desired value. - * @return mixed The found value or null. - */ - public static function extractValues($item, $key) - { - // Array of results - $results = array(); - // Cast as array if object - $item = \is_object($item) ? (array) $item : $item; - // Array of keys - $keys = \strstr($key, static::$key_split) ? \explode(static::$key_split, $key) : array($key); - $keys = \array_filter($keys); - // Key count - $key_count = \count($keys); - // key count > 0 - if ($key_count > 0) { - $curr_key = \array_shift($keys); - $arrayValues = \array_values($item); - $child = \is_array($item) ? \array_shift($arrayValues) : null; - // it's an array - if (\is_array($item)) { - // Clean non-ASCII keys - foreach ($item as $k => $v) { - $sanitized = \preg_replace('/[^(\\x20-\\x7F)]*/', '', $k); - if ($sanitized !== $k) { - $item[$sanitized] = $v; - unset($item[$k]); - } - } - // it has the keys - if (\array_key_exists($curr_key, $item)) { - $results = \array_merge($results, static::extractValues($item[$curr_key], \implode(static::$key_split, $keys))); - // else it's child has the key - } elseif (\is_array($child) || \is_object($child)) { - if (\array_key_exists($curr_key, $child)) { - foreach ($item as $child) { - $results = \array_merge($results, static::extractValues($child, $key)); - } - } - } - } - // no key - } else { - $results[] = $item; - } - return $results; - } - /** - * Runs comparison operations on an array of values formatted like so... - * - * e.g. array($value, $operator, $value) - * - * Returns true or false depending on the outcome of the requested - * comparative operation (<, >, =, etc..). - * - * @param arr $array The comparison array. - * @return bool Whether the operation evaluates to true or false. - */ - public static function compare(array $array) - { - $return = 0; - foreach ($array[0] as $value) { - if ($array[1] === '~') { - // Check if variables loosely match right away - if ($value != $array[2]) { - if (\is_string($value) && \is_string($array[2])) { - $return += \stristr($value, $array[2]) ? 1 : 0; - } elseif (\is_null($value) && \is_null($array[2])) { - $return += 1; - } elseif (\is_array($value) || \is_object($value)) { - $return += \stristr(\var_export($value, \true), $array[2]) ? 1 : 0; - } - } else { - $return += 1; - } - } elseif ($array[1] === '!~') { - if (\is_string($value) && \is_string($array[2])) { - $return += !\stristr($value, $array[2]) ? 1 : 0; - } elseif (\is_null($value) && \is_null($array[2])) { - $return += 0; - } elseif (\is_array($value) || \is_object($value)) { - $return += !\stristr(\var_export($value, \true), $array[2]) ? 1 : 0; - } - } else { - if (\is_array($value) || \is_object($value)) { - \trigger_error('Cannot compare object of type ' . \strtoupper(\gettype($value)) . ' with the "' . $array[1] . '" operator.', \E_USER_WARNING); - } - if (!\in_array($array[1], static::$operators)) { - \trigger_error('Operator "' . $array[1] . '" is not valid.', \E_USER_ERROR); - } else { - switch ($array[1]) { - case '==': - $return += $value == $array[2] ? 1 : 0; - break; - case '===': - $return += $value === $array[2] ? 1 : 0; - break; - case '!=': - $return += $value != $array[2] ? 1 : 0; - break; - case '!==': - $return += $value !== $array[2] ? 1 : 0; - break; - case '>': - $return += $value > $array[2] ? 1 : 0; - break; - case '<': - $return += $value < $array[2] ? 1 : 0; - break; - case '>=': - $return += $value >= $array[2] ? 1 : 0; - break; - case '<=': - $return += $value <= $array[2] ? 1 : 0; - break; - } - } - } - } - return $return; - } - /** - * Recursive array merge for options arrays to eliminate duplicates - * in a smart manner using a variable number of array arguments. - * - * @param arr Various options arrays. - * @return arr The merged array. - */ - public static function merge() - { - $args = \func_get_args(); - $where = array(); - $options = array(); - foreach ($args as $o) { - $options = \array_merge($options, $o); - if (isset($o['where'])) { - if (\count($where) === 0) { - $where = $o['where']; - } else { - foreach ($o['where'] as $oc) { - $matches = 0; - foreach ($where as $wc) { - if ($oc == $wc) { - $matches += 1; - } - } - if ($matches === 0) { - $where[] = $oc; - } - } - } - } - } - $options['where'] = $where; - return $options; - } -} diff --git a/dependencies/scoper-autoload.php b/dependencies/scoper-autoload.php deleted file mode 100644 index d876f2a..0000000 --- a/dependencies/scoper-autoload.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * @internal - */ -class Range -{ - /** - * @var float|int - */ - public $first; - /** - * @var float|int - */ - public $last; - /** - * Initialize range - * - * @param int|float $first - * @param int|float $last - */ - public function __construct($first, $last) - { - $this->first = $first; - $this->last = $last; - } - /** - * Test for inclusion in range - * - * @param int|float $value - * - * @return bool - */ - public function includes($value) - { - return $value >= $this->first && $value <= $this->last; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block.php b/dependencies/scssphp/scssphp/src/Block.php deleted file mode 100644 index 2b0d75d..0000000 --- a/dependencies/scssphp/scssphp/src/Block.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * @internal - */ -class Block -{ - /** - * @var string|null - */ - public $type; - /** - * @var Block|null - */ - public $parent; - /** - * @var string - */ - public $sourceName; - /** - * @var int - */ - public $sourceIndex; - /** - * @var int - */ - public $sourceLine; - /** - * @var int - */ - public $sourceColumn; - /** - * @var array|null - */ - public $selectors; - /** - * @var array - */ - public $comments; - /** - * @var array - */ - public $children; - /** - * @var Block|null - */ - public $selfParent; -} diff --git a/dependencies/scssphp/scssphp/src/Block/AtRootBlock.php b/dependencies/scssphp/scssphp/src/Block/AtRootBlock.php deleted file mode 100644 index 671f845..0000000 --- a/dependencies/scssphp/scssphp/src/Block/AtRootBlock.php +++ /dev/null @@ -1,33 +0,0 @@ -type = Type::T_AT_ROOT; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/CallableBlock.php b/dependencies/scssphp/scssphp/src/Block/CallableBlock.php deleted file mode 100644 index 0190517..0000000 --- a/dependencies/scssphp/scssphp/src/Block/CallableBlock.php +++ /dev/null @@ -1,40 +0,0 @@ -type = $type; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/ContentBlock.php b/dependencies/scssphp/scssphp/src/Block/ContentBlock.php deleted file mode 100644 index a83088f..0000000 --- a/dependencies/scssphp/scssphp/src/Block/ContentBlock.php +++ /dev/null @@ -1,34 +0,0 @@ -type = Type::T_INCLUDE; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/DirectiveBlock.php b/dependencies/scssphp/scssphp/src/Block/DirectiveBlock.php deleted file mode 100644 index ddca575..0000000 --- a/dependencies/scssphp/scssphp/src/Block/DirectiveBlock.php +++ /dev/null @@ -1,33 +0,0 @@ -type = Type::T_DIRECTIVE; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/EachBlock.php b/dependencies/scssphp/scssphp/src/Block/EachBlock.php deleted file mode 100644 index 1dfcb0f..0000000 --- a/dependencies/scssphp/scssphp/src/Block/EachBlock.php +++ /dev/null @@ -1,33 +0,0 @@ -type = Type::T_EACH; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/ElseBlock.php b/dependencies/scssphp/scssphp/src/Block/ElseBlock.php deleted file mode 100644 index 875428f..0000000 --- a/dependencies/scssphp/scssphp/src/Block/ElseBlock.php +++ /dev/null @@ -1,25 +0,0 @@ -type = Type::T_ELSE; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/ElseifBlock.php b/dependencies/scssphp/scssphp/src/Block/ElseifBlock.php deleted file mode 100644 index 727d80d..0000000 --- a/dependencies/scssphp/scssphp/src/Block/ElseifBlock.php +++ /dev/null @@ -1,29 +0,0 @@ -type = Type::T_ELSEIF; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/ForBlock.php b/dependencies/scssphp/scssphp/src/Block/ForBlock.php deleted file mode 100644 index f671421..0000000 --- a/dependencies/scssphp/scssphp/src/Block/ForBlock.php +++ /dev/null @@ -1,41 +0,0 @@ -type = Type::T_FOR; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/IfBlock.php b/dependencies/scssphp/scssphp/src/Block/IfBlock.php deleted file mode 100644 index e0a1c46..0000000 --- a/dependencies/scssphp/scssphp/src/Block/IfBlock.php +++ /dev/null @@ -1,33 +0,0 @@ - - */ - public $cases = []; - public function __construct() - { - $this->type = Type::T_IF; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/MediaBlock.php b/dependencies/scssphp/scssphp/src/Block/MediaBlock.php deleted file mode 100644 index 45652bd..0000000 --- a/dependencies/scssphp/scssphp/src/Block/MediaBlock.php +++ /dev/null @@ -1,33 +0,0 @@ -type = Type::T_MEDIA; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/NestedPropertyBlock.php b/dependencies/scssphp/scssphp/src/Block/NestedPropertyBlock.php deleted file mode 100644 index bbcc72a..0000000 --- a/dependencies/scssphp/scssphp/src/Block/NestedPropertyBlock.php +++ /dev/null @@ -1,33 +0,0 @@ -type = Type::T_NESTED_PROPERTY; - } -} diff --git a/dependencies/scssphp/scssphp/src/Block/WhileBlock.php b/dependencies/scssphp/scssphp/src/Block/WhileBlock.php deleted file mode 100644 index 39fdce8..0000000 --- a/dependencies/scssphp/scssphp/src/Block/WhileBlock.php +++ /dev/null @@ -1,29 +0,0 @@ -type = Type::T_WHILE; - } -} diff --git a/dependencies/scssphp/scssphp/src/Cache.php b/dependencies/scssphp/scssphp/src/Cache.php deleted file mode 100644 index 72cfaa6..0000000 --- a/dependencies/scssphp/scssphp/src/Cache.php +++ /dev/null @@ -1,215 +0,0 @@ - - * - * @internal - */ -class Cache -{ - const CACHE_VERSION = 1; - /** - * directory used for storing data - * - * @var string|false - */ - public static $cacheDir = \false; - /** - * prefix for the storing data - * - * @var string - */ - public static $prefix = 'scssphp_'; - /** - * force a refresh : 'once' for refreshing the first hit on a cache only, true to never use the cache in this hit - * - * @var bool|string - */ - public static $forceRefresh = \false; - /** - * specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up - * - * @var int - */ - public static $gcLifetime = 604800; - /** - * array of already refreshed cache if $forceRefresh==='once' - * - * @var array - */ - protected static $refreshed = []; - /** - * Constructor - * - * @param array $options - * - * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string} $options - */ - public function __construct($options) - { - // check $cacheDir - if (isset($options['cacheDir'])) { - self::$cacheDir = $options['cacheDir']; - } - if (empty(self::$cacheDir)) { - throw new Exception('cacheDir not set'); - } - if (isset($options['prefix'])) { - self::$prefix = $options['prefix']; - } - if (empty(self::$prefix)) { - throw new Exception('prefix not set'); - } - if (isset($options['forceRefresh'])) { - self::$forceRefresh = $options['forceRefresh']; - } - self::checkCacheDir(); - } - /** - * Get the cached result of $operation on $what, - * which is known as dependant from the content of $options - * - * @param string $operation parse, compile... - * @param mixed $what content key (e.g., filename to be treated) - * @param array $options any option that affect the operation result on the content - * @param int|null $lastModified last modified timestamp - * - * @return mixed - * - * @throws \Exception - */ - public function getCache($operation, $what, $options = [], $lastModified = null) - { - $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options); - if ((self::$forceRefresh === \false || self::$forceRefresh === 'once' && isset(self::$refreshed[$fileCache])) && \file_exists($fileCache)) { - $cacheTime = \filemtime($fileCache); - if ((\is_null($lastModified) || $cacheTime > $lastModified) && $cacheTime + self::$gcLifetime > \time()) { - $c = \file_get_contents($fileCache); - $c = \unserialize($c); - if (\is_array($c) && isset($c['value'])) { - return $c['value']; - } - } - } - return null; - } - /** - * Put in cache the result of $operation on $what, - * which is known as dependant from the content of $options - * - * @param string $operation - * @param mixed $what - * @param mixed $value - * @param array $options - * - * @return void - */ - public function setCache($operation, $what, $value, $options = []) - { - $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options); - $c = ['value' => $value]; - $c = \serialize($c); - \file_put_contents($fileCache, $c); - if (self::$forceRefresh === 'once') { - self::$refreshed[$fileCache] = \true; - } - } - /** - * Get the cache name for the caching of $operation on $what, - * which is known as dependant from the content of $options - * - * @param string $operation - * @param mixed $what - * @param array $options - * - * @return string - */ - private static function cacheName($operation, $what, $options = []) - { - $t = ['version' => self::CACHE_VERSION, 'scssphpVersion' => Version::VERSION, 'operation' => $operation, 'what' => $what, 'options' => $options]; - $t = self::$prefix . \sha1(\json_encode($t)) . ".{$operation}" . ".scsscache"; - return $t; - } - /** - * Check that the cache dir exists and is writeable - * - * @return void - * - * @throws \Exception - */ - public static function checkCacheDir() - { - self::$cacheDir = \str_replace('\\', '/', self::$cacheDir); - self::$cacheDir = \rtrim(self::$cacheDir, '/') . '/'; - if (!\is_dir(self::$cacheDir)) { - throw new Exception('Cache directory doesn\'t exist: ' . self::$cacheDir); - } - if (!\is_writable(self::$cacheDir)) { - throw new Exception('Cache directory isn\'t writable: ' . self::$cacheDir); - } - } - /** - * Delete unused cached files - * - * @return void - */ - public static function cleanCache() - { - static $clean = \false; - if ($clean || empty(self::$cacheDir)) { - return; - } - $clean = \true; - // only remove files with extensions created by SCSSPHP Cache - // css files removed based on the list files - $removeTypes = ['scsscache' => 1]; - $files = \scandir(self::$cacheDir); - if (!$files) { - return; - } - $checkTime = \time() - self::$gcLifetime; - foreach ($files as $file) { - // don't delete if the file wasn't created with SCSSPHP Cache - if (\strpos($file, self::$prefix) !== 0) { - continue; - } - $parts = \explode('.', $file); - $type = \array_pop($parts); - if (!isset($removeTypes[$type])) { - continue; - } - $fullPath = self::$cacheDir . $file; - $mtime = \filemtime($fullPath); - // don't delete if it's a relatively new file - if ($mtime > $checkTime) { - continue; - } - \unlink($fullPath); - } - } -} diff --git a/dependencies/scssphp/scssphp/src/Colors.php b/dependencies/scssphp/scssphp/src/Colors.php deleted file mode 100644 index f35e914..0000000 --- a/dependencies/scssphp/scssphp/src/Colors.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * @internal - */ -class Colors -{ - /** - * CSS Colors - * - * @see http://www.w3.org/TR/css3-color - * - * @var array - */ - protected static $cssColors = ['aliceblue' => '240,248,255', 'antiquewhite' => '250,235,215', 'aqua' => '0,255,255', 'cyan' => '0,255,255', 'aquamarine' => '127,255,212', 'azure' => '240,255,255', 'beige' => '245,245,220', 'bisque' => '255,228,196', 'black' => '0,0,0', 'blanchedalmond' => '255,235,205', 'blue' => '0,0,255', 'blueviolet' => '138,43,226', 'brown' => '165,42,42', 'burlywood' => '222,184,135', 'cadetblue' => '95,158,160', 'chartreuse' => '127,255,0', 'chocolate' => '210,105,30', 'coral' => '255,127,80', 'cornflowerblue' => '100,149,237', 'cornsilk' => '255,248,220', 'crimson' => '220,20,60', 'darkblue' => '0,0,139', 'darkcyan' => '0,139,139', 'darkgoldenrod' => '184,134,11', 'darkgray' => '169,169,169', 'darkgrey' => '169,169,169', 'darkgreen' => '0,100,0', 'darkkhaki' => '189,183,107', 'darkmagenta' => '139,0,139', 'darkolivegreen' => '85,107,47', 'darkorange' => '255,140,0', 'darkorchid' => '153,50,204', 'darkred' => '139,0,0', 'darksalmon' => '233,150,122', 'darkseagreen' => '143,188,143', 'darkslateblue' => '72,61,139', 'darkslategray' => '47,79,79', 'darkslategrey' => '47,79,79', 'darkturquoise' => '0,206,209', 'darkviolet' => '148,0,211', 'deeppink' => '255,20,147', 'deepskyblue' => '0,191,255', 'dimgray' => '105,105,105', 'dimgrey' => '105,105,105', 'dodgerblue' => '30,144,255', 'firebrick' => '178,34,34', 'floralwhite' => '255,250,240', 'forestgreen' => '34,139,34', 'fuchsia' => '255,0,255', 'magenta' => '255,0,255', 'gainsboro' => '220,220,220', 'ghostwhite' => '248,248,255', 'gold' => '255,215,0', 'goldenrod' => '218,165,32', 'gray' => '128,128,128', 'grey' => '128,128,128', 'green' => '0,128,0', 'greenyellow' => '173,255,47', 'honeydew' => '240,255,240', 'hotpink' => '255,105,180', 'indianred' => '205,92,92', 'indigo' => '75,0,130', 'ivory' => '255,255,240', 'khaki' => '240,230,140', 'lavender' => '230,230,250', 'lavenderblush' => '255,240,245', 'lawngreen' => '124,252,0', 'lemonchiffon' => '255,250,205', 'lightblue' => '173,216,230', 'lightcoral' => '240,128,128', 'lightcyan' => '224,255,255', 'lightgoldenrodyellow' => '250,250,210', 'lightgray' => '211,211,211', 'lightgrey' => '211,211,211', 'lightgreen' => '144,238,144', 'lightpink' => '255,182,193', 'lightsalmon' => '255,160,122', 'lightseagreen' => '32,178,170', 'lightskyblue' => '135,206,250', 'lightslategray' => '119,136,153', 'lightslategrey' => '119,136,153', 'lightsteelblue' => '176,196,222', 'lightyellow' => '255,255,224', 'lime' => '0,255,0', 'limegreen' => '50,205,50', 'linen' => '250,240,230', 'maroon' => '128,0,0', 'mediumaquamarine' => '102,205,170', 'mediumblue' => '0,0,205', 'mediumorchid' => '186,85,211', 'mediumpurple' => '147,112,219', 'mediumseagreen' => '60,179,113', 'mediumslateblue' => '123,104,238', 'mediumspringgreen' => '0,250,154', 'mediumturquoise' => '72,209,204', 'mediumvioletred' => '199,21,133', 'midnightblue' => '25,25,112', 'mintcream' => '245,255,250', 'mistyrose' => '255,228,225', 'moccasin' => '255,228,181', 'navajowhite' => '255,222,173', 'navy' => '0,0,128', 'oldlace' => '253,245,230', 'olive' => '128,128,0', 'olivedrab' => '107,142,35', 'orange' => '255,165,0', 'orangered' => '255,69,0', 'orchid' => '218,112,214', 'palegoldenrod' => '238,232,170', 'palegreen' => '152,251,152', 'paleturquoise' => '175,238,238', 'palevioletred' => '219,112,147', 'papayawhip' => '255,239,213', 'peachpuff' => '255,218,185', 'peru' => '205,133,63', 'pink' => '255,192,203', 'plum' => '221,160,221', 'powderblue' => '176,224,230', 'purple' => '128,0,128', 'red' => '255,0,0', 'rosybrown' => '188,143,143', 'royalblue' => '65,105,225', 'saddlebrown' => '139,69,19', 'salmon' => '250,128,114', 'sandybrown' => '244,164,96', 'seagreen' => '46,139,87', 'seashell' => '255,245,238', 'sienna' => '160,82,45', 'silver' => '192,192,192', 'skyblue' => '135,206,235', 'slateblue' => '106,90,205', 'slategray' => '112,128,144', 'slategrey' => '112,128,144', 'snow' => '255,250,250', 'springgreen' => '0,255,127', 'steelblue' => '70,130,180', 'tan' => '210,180,140', 'teal' => '0,128,128', 'thistle' => '216,191,216', 'tomato' => '255,99,71', 'turquoise' => '64,224,208', 'violet' => '238,130,238', 'wheat' => '245,222,179', 'white' => '255,255,255', 'whitesmoke' => '245,245,245', 'yellow' => '255,255,0', 'yellowgreen' => '154,205,50', 'rebeccapurple' => '102,51,153', 'transparent' => '0,0,0,0']; - /** - * Convert named color in a [r,g,b[,a]] array - * - * @param string $colorName - * - * @return int[]|null - */ - public static function colorNameToRGBa($colorName) - { - if (\is_string($colorName) && isset(static::$cssColors[$colorName])) { - $rgba = \explode(',', static::$cssColors[$colorName]); - // only case with opacity is transparent, with opacity=0, so we can intval on opacity also - $rgba = \array_map('intval', $rgba); - return $rgba; - } - return null; - } - /** - * Reverse conversion : from RGBA to a color name if possible - * - * @param int $r - * @param int $g - * @param int $b - * @param int|float $a - * - * @return string|null - */ - public static function RGBaToColorName($r, $g, $b, $a = 1) - { - static $reverseColorTable = null; - if (!\is_numeric($r) || !\is_numeric($g) || !\is_numeric($b) || !\is_numeric($a)) { - return null; - } - if ($a < 1) { - return null; - } - if (\is_null($reverseColorTable)) { - $reverseColorTable = []; - foreach (static::$cssColors as $name => $rgb_str) { - $rgb_str = \explode(',', $rgb_str); - if (\count($rgb_str) == 3 && !isset($reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])])) { - $reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])] = $name; - } - } - } - if (isset($reverseColorTable[\intval($r)][\intval($g)][\intval($b)])) { - return $reverseColorTable[\intval($r)][\intval($g)][\intval($b)]; - } - return null; - } -} diff --git a/dependencies/scssphp/scssphp/src/CompilationResult.php b/dependencies/scssphp/scssphp/src/CompilationResult.php deleted file mode 100644 index 624bb58..0000000 --- a/dependencies/scssphp/scssphp/src/CompilationResult.php +++ /dev/null @@ -1,62 +0,0 @@ -css = $css; - $this->sourceMap = $sourceMap; - $this->includedFiles = $includedFiles; - } - /** - * @return string - */ - public function getCss() - { - return $this->css; - } - /** - * @return string[] - */ - public function getIncludedFiles() - { - return $this->includedFiles; - } - /** - * The sourceMap content, if it was generated - * - * @return null|string - */ - public function getSourceMap() - { - return $this->sourceMap; - } -} diff --git a/dependencies/scssphp/scssphp/src/Compiler.php b/dependencies/scssphp/scssphp/src/Compiler.php deleted file mode 100644 index d2430e9..0000000 --- a/dependencies/scssphp/scssphp/src/Compiler.php +++ /dev/null @@ -1,8372 +0,0 @@ - - * - * @final Extending the Compiler is deprecated - */ -class Compiler -{ - /** - * @deprecated - */ - const LINE_COMMENTS = 1; - /** - * @deprecated - */ - const DEBUG_INFO = 2; - /** - * @deprecated - */ - const WITH_RULE = 1; - /** - * @deprecated - */ - const WITH_MEDIA = 2; - /** - * @deprecated - */ - const WITH_SUPPORTS = 4; - /** - * @deprecated - */ - const WITH_ALL = 7; - const SOURCE_MAP_NONE = 0; - const SOURCE_MAP_INLINE = 1; - const SOURCE_MAP_FILE = 2; - /** - * @var array - */ - protected static $operatorNames = ['+' => 'add', '-' => 'sub', '*' => 'mul', '/' => 'div', '%' => 'mod', '==' => 'eq', '!=' => 'neq', '<' => 'lt', '>' => 'gt', '<=' => 'lte', '>=' => 'gte']; - /** - * @var array - */ - protected static $namespaces = ['special' => '%', 'mixin' => '@', 'function' => '^']; - public static $true = [Type::T_KEYWORD, 'true']; - public static $false = [Type::T_KEYWORD, 'false']; - /** @deprecated */ - public static $NaN = [Type::T_KEYWORD, 'NaN']; - /** @deprecated */ - public static $Infinity = [Type::T_KEYWORD, 'Infinity']; - public static $null = [Type::T_NULL]; - public static $nullString = [Type::T_STRING, '', []]; - public static $defaultValue = [Type::T_KEYWORD, '']; - public static $selfSelector = [Type::T_SELF]; - public static $emptyList = [Type::T_LIST, '', []]; - public static $emptyMap = [Type::T_MAP, [], []]; - public static $emptyString = [Type::T_STRING, '"', []]; - public static $with = [Type::T_KEYWORD, 'with']; - public static $without = [Type::T_KEYWORD, 'without']; - private static $emptyArgumentList = [Type::T_LIST, '', [], []]; - /** - * @var array - */ - protected $importPaths = []; - /** - * @var array - */ - protected $importCache = []; - /** - * @var string[] - */ - protected $importedFiles = []; - /** - * @var array - * @phpstan-var array - */ - protected $userFunctions = []; - /** - * @var array - */ - protected $registeredVars = []; - /** - * @var array - */ - protected $registeredFeatures = ['extend-selector-pseudoclass' => \false, 'at-error' => \true, 'units-level-3' => \true, 'global-variable-shadowing' => \false]; - /** - * @var string|null - */ - protected $encoding = null; - /** - * @var null - * @deprecated - */ - protected $lineNumberStyle = null; - /** - * @var int|SourceMapGenerator - * @phpstan-var self::SOURCE_MAP_*|SourceMapGenerator - */ - protected $sourceMap = self::SOURCE_MAP_NONE; - /** - * @var array - * @phpstan-var array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} - */ - protected $sourceMapOptions = []; - /** - * @var bool - */ - private $charset = \true; - /** - * @var Formatter - */ - protected $formatter; - /** - * @var string - * @phpstan-var class-string - */ - private $configuredFormatter = Expanded::class; - /** - * @var Environment - */ - protected $rootEnv; - /** - * @var OutputBlock|null - */ - protected $rootBlock; - /** - * @var \ScssPhp\ScssPhp\Compiler\Environment - */ - protected $env; - /** - * @var OutputBlock|null - */ - protected $scope; - /** - * @var Environment|null - */ - protected $storeEnv; - /** - * @var bool|null - * - * @deprecated - */ - protected $charsetSeen; - /** - * @var array - */ - protected $sourceNames; - /** - * @var Cache|null - */ - protected $cache; - /** - * @var bool - */ - protected $cacheCheckImportResolutions = \false; - /** - * @var int - */ - protected $indentLevel; - /** - * @var array[] - */ - protected $extends; - /** - * @var array - */ - protected $extendsMap; - /** - * @var array - */ - protected $parsedFiles = []; - /** - * @var Parser|null - */ - protected $parser; - /** - * @var int|null - */ - protected $sourceIndex; - /** - * @var int|null - */ - protected $sourceLine; - /** - * @var int|null - */ - protected $sourceColumn; - /** - * @var bool|null - */ - protected $shouldEvaluate; - /** - * @var null - * @deprecated - */ - protected $ignoreErrors; - /** - * @var bool - */ - protected $ignoreCallStackMessage = \false; - /** - * @var array[] - */ - protected $callStack = []; - /** - * @var array - * @phpstan-var list - */ - private $resolvedImports = []; - /** - * The directory of the currently processed file - * - * @var string|null - */ - private $currentDirectory; - /** - * The directory of the input file - * - * @var string - */ - private $rootDirectory; - /** - * @var bool - */ - private $legacyCwdImportPath = \true; - /** - * @var LoggerInterface - */ - private $logger; - /** - * @var array - */ - private $warnedChildFunctions = []; - /** - * Constructor - * - * @param array|null $cacheOptions - * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string, checkImportResolutions?: bool}|null $cacheOptions - */ - public function __construct($cacheOptions = null) - { - $this->sourceNames = []; - if ($cacheOptions) { - $this->cache = new Cache($cacheOptions); - if (!empty($cacheOptions['checkImportResolutions'])) { - $this->cacheCheckImportResolutions = \true; - } - } - $this->logger = new StreamLogger(\fopen('php://stderr', 'w'), \true); - } - /** - * Get compiler options - * - * @return array - * - * @internal - */ - public function getCompileOptions() - { - $options = ['importPaths' => $this->importPaths, 'registeredVars' => $this->registeredVars, 'registeredFeatures' => $this->registeredFeatures, 'encoding' => $this->encoding, 'sourceMap' => \serialize($this->sourceMap), 'sourceMapOptions' => $this->sourceMapOptions, 'formatter' => $this->configuredFormatter, 'legacyImportPath' => $this->legacyCwdImportPath]; - return $options; - } - /** - * Sets an alternative logger. - * - * Changing the logger in the middle of the compilation is not - * supported and will result in an undefined behavior. - * - * @param LoggerInterface $logger - * - * @return void - */ - public function setLogger(LoggerInterface $logger) - { - $this->logger = $logger; - } - /** - * Set an alternative error output stream, for testing purpose only - * - * @param resource $handle - * - * @return void - * - * @deprecated Use {@see setLogger} instead - */ - public function setErrorOuput($handle) - { - @\trigger_error('The method "setErrorOuput" is deprecated. Use "setLogger" instead.', \E_USER_DEPRECATED); - $this->logger = new StreamLogger($handle); - } - /** - * Compile scss - * - * @param string $code - * @param string|null $path - * - * @return string - * - * @throws SassException when the source fails to compile - * - * @deprecated Use {@see compileString} instead. - */ - public function compile($code, $path = null) - { - @\trigger_error(\sprintf('The "%s" method is deprecated. Use "compileString" instead.', __METHOD__), \E_USER_DEPRECATED); - $result = $this->compileString($code, $path); - $sourceMap = $result->getSourceMap(); - if ($sourceMap !== null) { - if ($this->sourceMap instanceof SourceMapGenerator) { - $this->sourceMap->saveMap($sourceMap); - } elseif ($this->sourceMap === self::SOURCE_MAP_FILE) { - $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions); - $sourceMapGenerator->saveMap($sourceMap); - } - } - return $result->getCss(); - } - /** - * Compile scss - * - * @param string $source - * @param string|null $path - * - * @return CompilationResult - * - * @throws SassException when the source fails to compile - */ - public function compileString($source, $path = null) - { - if ($this->cache) { - $cacheKey = ($path ? $path : '(stdin)') . ':' . \md5($source); - $compileOptions = $this->getCompileOptions(); - $cachedResult = $this->cache->getCache('compile', $cacheKey, $compileOptions); - if ($cachedResult instanceof CachedResult && $this->isFreshCachedResult($cachedResult)) { - return $cachedResult->getResult(); - } - } - $this->indentLevel = -1; - $this->extends = []; - $this->extendsMap = []; - $this->sourceIndex = null; - $this->sourceLine = null; - $this->sourceColumn = null; - $this->env = null; - $this->scope = null; - $this->storeEnv = null; - $this->shouldEvaluate = null; - $this->ignoreCallStackMessage = \false; - $this->parsedFiles = []; - $this->importedFiles = []; - $this->resolvedImports = []; - if (!\is_null($path) && \is_file($path)) { - $path = \realpath($path) ?: $path; - $this->currentDirectory = \dirname($path); - $this->rootDirectory = $this->currentDirectory; - } else { - $this->currentDirectory = null; - $this->rootDirectory = \getcwd(); - } - try { - $this->parser = $this->parserFactory($path); - $tree = $this->parser->parse($source); - $this->parser = null; - $this->formatter = new $this->configuredFormatter(); - $this->rootBlock = null; - $this->rootEnv = $this->pushEnv($tree); - $warnCallback = function ($message, $deprecation) { - $this->logger->warn($message, $deprecation); - }; - $previousWarnCallback = Warn::setCallback($warnCallback); - try { - $this->injectVariables($this->registeredVars); - $this->compileRoot($tree); - $this->popEnv(); - } finally { - Warn::setCallback($previousWarnCallback); - } - $sourceMapGenerator = null; - if ($this->sourceMap) { - if (\is_object($this->sourceMap) && $this->sourceMap instanceof SourceMapGenerator) { - $sourceMapGenerator = $this->sourceMap; - $this->sourceMap = self::SOURCE_MAP_FILE; - } elseif ($this->sourceMap !== self::SOURCE_MAP_NONE) { - $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions); - } - } - \assert($this->scope !== null); - $out = $this->formatter->format($this->scope, $sourceMapGenerator); - $prefix = ''; - if ($this->charset && \strlen($out) !== Util::mbStrlen($out)) { - $prefix = '@charset "UTF-8";' . "\n"; - $out = $prefix . $out; - } - $sourceMap = null; - if (!empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) { - \assert($sourceMapGenerator !== null); - $sourceMap = $sourceMapGenerator->generateJson($prefix); - $sourceMapUrl = null; - switch ($this->sourceMap) { - case self::SOURCE_MAP_INLINE: - $sourceMapUrl = \sprintf('data:application/json,%s', Util::encodeURIComponent($sourceMap)); - break; - case self::SOURCE_MAP_FILE: - if (isset($this->sourceMapOptions['sourceMapURL'])) { - $sourceMapUrl = $this->sourceMapOptions['sourceMapURL']; - } - break; - } - if ($sourceMapUrl !== null) { - $out .= \sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl); - } - } - } catch (SassScriptException $e) { - throw new CompilerException($this->addLocationToMessage($e->getMessage()), 0, $e); - } - $includedFiles = []; - foreach ($this->resolvedImports as $resolvedImport) { - $includedFiles[$resolvedImport['filePath']] = $resolvedImport['filePath']; - } - $result = new CompilationResult($out, $sourceMap, \array_values($includedFiles)); - if ($this->cache && isset($cacheKey) && isset($compileOptions)) { - $this->cache->setCache('compile', $cacheKey, new CachedResult($result, $this->parsedFiles, $this->resolvedImports), $compileOptions); - } - // Reset state to free memory - // TODO in 2.0, reset parsedFiles as well when the getter is removed. - $this->resolvedImports = []; - $this->importedFiles = []; - return $result; - } - /** - * @param CachedResult $result - * - * @return bool - */ - private function isFreshCachedResult(CachedResult $result) - { - // check if any dependency file changed since the result was compiled - foreach ($result->getParsedFiles() as $file => $mtime) { - if (!\is_file($file) || \filemtime($file) !== $mtime) { - return \false; - } - } - if ($this->cacheCheckImportResolutions) { - $resolvedImports = []; - foreach ($result->getResolvedImports() as $import) { - $currentDir = $import['currentDir']; - $path = $import['path']; - // store the check across all the results in memory to avoid multiple findImport() on the same path - // with same context. - // this is happening in a same hit with multiple compilations (especially with big frameworks) - if (empty($resolvedImports[$currentDir][$path])) { - $resolvedImports[$currentDir][$path] = $this->findImport($path, $currentDir); - } - if ($resolvedImports[$currentDir][$path] !== $import['filePath']) { - return \false; - } - } - } - return \true; - } - /** - * Instantiate parser - * - * @param string|null $path - * - * @return \ScssPhp\ScssPhp\Parser - */ - protected function parserFactory($path) - { - // https://sass-lang.com/documentation/at-rules/import - // CSS files imported by Sass don’t allow any special Sass features. - // In order to make sure authors don’t accidentally write Sass in their CSS, - // all Sass features that aren’t also valid CSS will produce errors. - // Otherwise, the CSS will be rendered as-is. It can even be extended! - $cssOnly = \false; - if ($path !== null && \substr($path, -4) === '.css') { - $cssOnly = \true; - } - $parser = new Parser($path, \count($this->sourceNames), $this->encoding, $this->cache, $cssOnly, $this->logger); - $this->sourceNames[] = $path; - $this->addParsedFile($path); - return $parser; - } - /** - * Is self extend? - * - * @param array $target - * @param array $origin - * - * @return bool - */ - protected function isSelfExtend($target, $origin) - { - foreach ($origin as $sel) { - if (\in_array($target, $sel)) { - return \true; - } - } - return \false; - } - /** - * Push extends - * - * @param string[] $target - * @param array $origin - * @param array|null $block - * - * @return void - */ - protected function pushExtends($target, $origin, $block) - { - $i = \count($this->extends); - $this->extends[] = [$target, $origin, $block]; - foreach ($target as $part) { - if (isset($this->extendsMap[$part])) { - $this->extendsMap[$part][] = $i; - } else { - $this->extendsMap[$part] = [$i]; - } - } - } - /** - * Make output block - * - * @param string|null $type - * @param string[]|null $selectors - * - * @return \ScssPhp\ScssPhp\Formatter\OutputBlock - */ - protected function makeOutputBlock($type, $selectors = null) - { - $out = new OutputBlock(); - $out->type = $type; - $out->lines = []; - $out->children = []; - $out->parent = $this->scope; - $out->selectors = $selectors; - $out->depth = $this->env->depth; - if ($this->env->block instanceof Block) { - $out->sourceName = $this->env->block->sourceName; - $out->sourceLine = $this->env->block->sourceLine; - $out->sourceColumn = $this->env->block->sourceColumn; - } else { - $out->sourceName = isset($this->sourceNames[$this->sourceIndex]) ? $this->sourceNames[$this->sourceIndex] : '(stdin)'; - $out->sourceLine = $this->sourceLine; - $out->sourceColumn = $this->sourceColumn; - } - return $out; - } - /** - * Compile root - * - * @param \ScssPhp\ScssPhp\Block $rootBlock - * - * @return void - */ - protected function compileRoot(Block $rootBlock) - { - $this->rootBlock = $this->scope = $this->makeOutputBlock(Type::T_ROOT); - $this->compileChildrenNoReturn($rootBlock->children, $this->scope); - \assert($this->scope !== null); - $this->flattenSelectors($this->scope); - $this->missingSelectors(); - } - /** - * Report missing selectors - * - * @return void - */ - protected function missingSelectors() - { - foreach ($this->extends as $extend) { - if (isset($extend[3])) { - continue; - } - list($target, $origin, $block) = $extend; - // ignore if !optional - if ($block[2]) { - continue; - } - $target = \implode(' ', $target); - $origin = $this->collapseSelectors($origin); - $this->sourceLine = $block[Parser::SOURCE_LINE]; - throw $this->error("\"{$origin}\" failed to @extend \"{$target}\". The selector \"{$target}\" was not found."); - } - } - /** - * Flatten selectors - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * @param string $parentKey - * - * @return void - */ - protected function flattenSelectors(OutputBlock $block, $parentKey = null) - { - if ($block->selectors) { - $selectors = []; - foreach ($block->selectors as $s) { - $selectors[] = $s; - if (!\is_array($s)) { - continue; - } - // check extends - if (!empty($this->extendsMap)) { - $this->matchExtends($s, $selectors); - // remove duplicates - \array_walk($selectors, function (&$value) { - $value = \serialize($value); - }); - $selectors = \array_unique($selectors); - \array_walk($selectors, function (&$value) { - $value = \unserialize($value); - }); - } - } - $block->selectors = []; - $placeholderSelector = \false; - foreach ($selectors as $selector) { - if ($this->hasSelectorPlaceholder($selector)) { - $placeholderSelector = \true; - continue; - } - $block->selectors[] = $this->compileSelector($selector); - } - if ($placeholderSelector && 0 === \count($block->selectors) && null !== $parentKey) { - \assert($block->parent !== null); - unset($block->parent->children[$parentKey]); - return; - } - } - foreach ($block->children as $key => $child) { - $this->flattenSelectors($child, $key); - } - } - /** - * Glue parts of :not( or :nth-child( ... that are in general split in selectors parts - * - * @param array $parts - * - * @return array - */ - protected function glueFunctionSelectors($parts) - { - $new = []; - foreach ($parts as $part) { - if (\is_array($part)) { - $part = $this->glueFunctionSelectors($part); - $new[] = $part; - } else { - // a selector part finishing with a ) is the last part of a :not( or :nth-child( - // and need to be joined to this - if (\count($new) && \is_string($new[\count($new) - 1]) && \strlen($part) && \substr($part, -1) === ')' && \strpos($part, '(') === \false) { - while (\count($new) > 1 && \substr($new[\count($new) - 1], -1) !== '(') { - $part = \array_pop($new) . $part; - } - $new[\count($new) - 1] .= $part; - } else { - $new[] = $part; - } - } - } - return $new; - } - /** - * Match extends - * - * @param array $selector - * @param array $out - * @param int $from - * @param bool $initial - * - * @return void - */ - protected function matchExtends($selector, &$out, $from = 0, $initial = \true) - { - static $partsPile = []; - $selector = $this->glueFunctionSelectors($selector); - if (\count($selector) == 1 && \in_array(\reset($selector), $partsPile)) { - return; - } - $outRecurs = []; - foreach ($selector as $i => $part) { - if ($i < $from) { - continue; - } - // check that we are not building an infinite loop of extensions - // if the new part is just including a previous part don't try to extend anymore - if (\count($part) > 1) { - foreach ($partsPile as $previousPart) { - if (!\count(\array_diff($previousPart, $part))) { - continue 2; - } - } - } - $partsPile[] = $part; - if ($this->matchExtendsSingle($part, $origin, $initial)) { - $after = \array_slice($selector, $i + 1); - $before = \array_slice($selector, 0, $i); - list($before, $nonBreakableBefore) = $this->extractRelationshipFromFragment($before); - foreach ($origin as $new) { - $k = 0; - // remove shared parts - if (\count($new) > 1) { - while ($k < $i && isset($new[$k]) && $selector[$k] === $new[$k]) { - $k++; - } - } - if (\count($nonBreakableBefore) && $k === \count($new)) { - $k--; - } - $replacement = []; - $tempReplacement = $k > 0 ? \array_slice($new, $k) : $new; - for ($l = \count($tempReplacement) - 1; $l >= 0; $l--) { - $slice = []; - foreach ($tempReplacement[$l] as $chunk) { - if (!\in_array($chunk, $slice)) { - $slice[] = $chunk; - } - } - \array_unshift($replacement, $slice); - if (!$this->isImmediateRelationshipCombinator(\end($slice))) { - break; - } - } - $afterBefore = $l != 0 ? \array_slice($tempReplacement, 0, $l) : []; - // Merge shared direct relationships. - $mergedBefore = $this->mergeDirectRelationships($afterBefore, $nonBreakableBefore); - $result = \array_merge($before, $mergedBefore, $replacement, $after); - if ($result === $selector) { - continue; - } - $this->pushOrMergeExtentedSelector($out, $result); - // recursively check for more matches - $startRecurseFrom = \count($before) + \min(\count($nonBreakableBefore), \count($mergedBefore)); - if (\count($origin) > 1) { - $this->matchExtends($result, $out, $startRecurseFrom, \false); - } else { - $this->matchExtends($result, $outRecurs, $startRecurseFrom, \false); - } - // selector sequence merging - if (!empty($before) && \count($new) > 1) { - $preSharedParts = $k > 0 ? \array_slice($before, 0, $k) : []; - $postSharedParts = $k > 0 ? \array_slice($before, $k) : $before; - list($betweenSharedParts, $nonBreakabl2) = $this->extractRelationshipFromFragment($afterBefore); - $result2 = \array_merge($preSharedParts, $betweenSharedParts, $postSharedParts, $nonBreakabl2, $nonBreakableBefore, $replacement, $after); - $this->pushOrMergeExtentedSelector($out, $result2); - } - } - } - \array_pop($partsPile); - } - while (\count($outRecurs)) { - $result = \array_shift($outRecurs); - $this->pushOrMergeExtentedSelector($out, $result); - } - } - /** - * Test a part for being a pseudo selector - * - * @param string $part - * @param array $matches - * - * @return bool - */ - protected function isPseudoSelector($part, &$matches) - { - if (\strpos($part, ':') === 0 && \preg_match(",^::?([\\w-]+)\\((.+)\\)\$,", $part, $matches)) { - return \true; - } - return \false; - } - /** - * Push extended selector except if - * - this is a pseudo selector - * - same as previous - * - in a white list - * in this case we merge the pseudo selector content - * - * @param array $out - * @param array $extended - * - * @return void - */ - protected function pushOrMergeExtentedSelector(&$out, $extended) - { - if (\count($out) && \count($extended) === 1 && \count(\reset($extended)) === 1) { - $single = \reset($extended); - $part = \reset($single); - if ($this->isPseudoSelector($part, $matchesExtended) && \in_array($matchesExtended[1], ['slotted'])) { - $prev = \end($out); - $prev = $this->glueFunctionSelectors($prev); - if (\count($prev) === 1 && \count(\reset($prev)) === 1) { - $single = \reset($prev); - $part = \reset($single); - if ($this->isPseudoSelector($part, $matchesPrev) && $matchesPrev[1] === $matchesExtended[1]) { - $extended = \explode($matchesExtended[1] . '(', $matchesExtended[0], 2); - $extended[1] = $matchesPrev[2] . ', ' . $extended[1]; - $extended = \implode($matchesExtended[1] . '(', $extended); - $extended = [[$extended]]; - \array_pop($out); - } - } - } - } - $out[] = $extended; - } - /** - * Match extends single - * - * @param array $rawSingle - * @param array $outOrigin - * @param bool $initial - * - * @return bool - */ - protected function matchExtendsSingle($rawSingle, &$outOrigin, $initial = \true) - { - $counts = []; - $single = []; - // simple usual cases, no need to do the whole trick - if (\in_array($rawSingle, [['>'], ['+'], ['~']])) { - return \false; - } - foreach ($rawSingle as $part) { - // matches Number - if (!\is_string($part)) { - return \false; - } - if (!\preg_match('/^[\\[.:#%]/', $part) && \count($single)) { - $single[\count($single) - 1] .= $part; - } else { - $single[] = $part; - } - } - $extendingDecoratedTag = \false; - if (\count($single) > 1) { - $matches = null; - $extendingDecoratedTag = \preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : \false; - } - $outOrigin = []; - $found = \false; - foreach ($single as $k => $part) { - if (isset($this->extendsMap[$part])) { - foreach ($this->extendsMap[$part] as $idx) { - $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1; - } - } - if ($initial && $this->isPseudoSelector($part, $matches) && !\in_array($matches[1], ['not'])) { - $buffer = $matches[2]; - $parser = $this->parserFactory(__METHOD__); - if ($parser->parseSelector($buffer, $subSelectors, \false)) { - foreach ($subSelectors as $ksub => $subSelector) { - $subExtended = []; - $this->matchExtends($subSelector, $subExtended, 0, \false); - if ($subExtended) { - $subSelectorsExtended = $subSelectors; - $subSelectorsExtended[$ksub] = $subExtended; - foreach ($subSelectorsExtended as $ksse => $sse) { - $subSelectorsExtended[$ksse] = $this->collapseSelectors($sse); - } - $subSelectorsExtended = \implode(', ', $subSelectorsExtended); - $singleExtended = $single; - $singleExtended[$k] = \str_replace('(' . $buffer . ')', "({$subSelectorsExtended})", $part); - $outOrigin[] = [$singleExtended]; - $found = \true; - } - } - } - } - } - foreach ($counts as $idx => $count) { - list($target, $origin, ) = $this->extends[$idx]; - $origin = $this->glueFunctionSelectors($origin); - // check count - if ($count !== \count($target)) { - continue; - } - $this->extends[$idx][3] = \true; - $rem = \array_diff($single, $target); - foreach ($origin as $j => $new) { - // prevent infinite loop when target extends itself - if ($this->isSelfExtend($single, $origin) && !$initial) { - return \false; - } - $replacement = \end($new); - // Extending a decorated tag with another tag is not possible. - if ($extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag && \preg_match('/^[a-z0-9]+$/i', $replacement[0])) { - unset($origin[$j]); - continue; - } - $combined = $this->combineSelectorSingle($replacement, $rem); - if (\count(\array_diff($combined, $origin[$j][\count($origin[$j]) - 1]))) { - $origin[$j][\count($origin[$j]) - 1] = $combined; - } - } - $outOrigin = \array_merge($outOrigin, $origin); - $found = \true; - } - return $found; - } - /** - * Extract a relationship from the fragment. - * - * When extracting the last portion of a selector we will be left with a - * fragment which may end with a direction relationship combinator. This - * method will extract the relationship fragment and return it along side - * the rest. - * - * @param array $fragment The selector fragment maybe ending with a direction relationship combinator. - * - * @return array The selector without the relationship fragment if any, the relationship fragment. - */ - protected function extractRelationshipFromFragment(array $fragment) - { - $parents = []; - $children = []; - $j = $i = \count($fragment); - for (;;) { - $children = $j != $i ? \array_slice($fragment, $j, $i - $j) : []; - $parents = \array_slice($fragment, 0, $j); - $slice = \end($parents); - if (empty($slice) || !$this->isImmediateRelationshipCombinator($slice[0])) { - break; - } - $j -= 2; - } - return [$parents, $children]; - } - /** - * Combine selector single - * - * @param array $base - * @param array $other - * - * @return array - */ - protected function combineSelectorSingle($base, $other) - { - $tag = []; - $out = []; - $wasTag = \false; - $pseudo = []; - while (\count($other) && \strpos(\end($other), ':') === 0) { - \array_unshift($pseudo, \array_pop($other)); - } - foreach ([\array_reverse($base), \array_reverse($other)] as $single) { - $rang = \count($single); - foreach ($single as $part) { - if (\preg_match('/^[\\[:]/', $part)) { - $out[] = $part; - $wasTag = \false; - } elseif (\preg_match('/^[\\.#]/', $part)) { - \array_unshift($out, $part); - $wasTag = \false; - } elseif (\preg_match('/^[^_-]/', $part) && $rang === 1) { - $tag[] = $part; - $wasTag = \true; - } elseif ($wasTag) { - $tag[\count($tag) - 1] .= $part; - } else { - \array_unshift($out, $part); - } - $rang--; - } - } - if (\count($tag)) { - \array_unshift($out, $tag[0]); - } - while (\count($pseudo)) { - $out[] = \array_shift($pseudo); - } - return $out; - } - /** - * Compile media - * - * @param \ScssPhp\ScssPhp\Block $media - * - * @return void - */ - protected function compileMedia(Block $media) - { - \assert($media instanceof MediaBlock); - $this->pushEnv($media); - $mediaQueries = $this->compileMediaQuery($this->multiplyMedia($this->env)); - if (!empty($mediaQueries)) { - \assert($this->scope !== null); - $previousScope = $this->scope; - $parentScope = $this->mediaParent($this->scope); - foreach ($mediaQueries as $mediaQuery) { - $this->scope = $this->makeOutputBlock(Type::T_MEDIA, [$mediaQuery]); - $parentScope->children[] = $this->scope; - $parentScope = $this->scope; - } - // top level properties in a media cause it to be wrapped - $needsWrap = \false; - foreach ($media->children as $child) { - $type = $child[0]; - if ($type !== Type::T_BLOCK && $type !== Type::T_MEDIA && $type !== Type::T_DIRECTIVE && $type !== Type::T_IMPORT) { - $needsWrap = \true; - break; - } - } - if ($needsWrap) { - $wrapped = new Block(); - $wrapped->sourceName = $media->sourceName; - $wrapped->sourceIndex = $media->sourceIndex; - $wrapped->sourceLine = $media->sourceLine; - $wrapped->sourceColumn = $media->sourceColumn; - $wrapped->selectors = []; - $wrapped->comments = []; - $wrapped->parent = $media; - $wrapped->children = $media->children; - $media->children = [[Type::T_BLOCK, $wrapped]]; - } - $this->compileChildrenNoReturn($media->children, $this->scope); - $this->scope = $previousScope; - } - $this->popEnv(); - } - /** - * Media parent - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope - * - * @return \ScssPhp\ScssPhp\Formatter\OutputBlock - */ - protected function mediaParent(OutputBlock $scope) - { - while (!empty($scope->parent)) { - if (!empty($scope->type) && $scope->type !== Type::T_MEDIA) { - break; - } - $scope = $scope->parent; - } - return $scope; - } - /** - * Compile directive - * - * @param DirectiveBlock|array $directive - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * - * @return void - */ - protected function compileDirective($directive, OutputBlock $out) - { - if (\is_array($directive)) { - $directiveName = $this->compileDirectiveName($directive[0]); - $s = '@' . $directiveName; - if (!empty($directive[1])) { - $s .= ' ' . $this->compileValue($directive[1]); - } - // sass-spec compliance on newline after directives, a bit tricky :/ - $appendNewLine = !empty($directive[2]) || \strpos($s, "\n") ? "\n" : ""; - if (\is_array($directive[0]) && empty($directive[1])) { - $appendNewLine = "\n"; - } - if (empty($directive[3])) { - $this->appendRootDirective($s . ';' . $appendNewLine, $out, [Type::T_COMMENT, Type::T_DIRECTIVE]); - } else { - $this->appendOutputLine($out, Type::T_DIRECTIVE, $s . ';'); - } - } else { - $directive->name = $this->compileDirectiveName($directive->name); - $s = '@' . $directive->name; - if (!empty($directive->value)) { - $s .= ' ' . $this->compileValue($directive->value); - } - if ($directive->name === 'keyframes' || \substr($directive->name, -10) === '-keyframes') { - $this->compileKeyframeBlock($directive, [$s]); - } else { - $this->compileNestedBlock($directive, [$s]); - } - } - } - /** - * directive names can include some interpolation - * - * @param string|array $directiveName - * @return string - * @throws CompilerException - */ - protected function compileDirectiveName($directiveName) - { - if (\is_string($directiveName)) { - return $directiveName; - } - return $this->compileValue($directiveName); - } - /** - * Compile at-root - * - * @param \ScssPhp\ScssPhp\Block $block - * - * @return void - */ - protected function compileAtRoot(Block $block) - { - \assert($block instanceof AtRootBlock); - $env = $this->pushEnv($block); - $envs = $this->compactEnv($env); - list($with, $without) = $this->compileWith(isset($block->with) ? $block->with : null); - // wrap inline selector - if ($block->selector) { - $wrapped = new Block(); - $wrapped->sourceName = $block->sourceName; - $wrapped->sourceIndex = $block->sourceIndex; - $wrapped->sourceLine = $block->sourceLine; - $wrapped->sourceColumn = $block->sourceColumn; - $wrapped->selectors = $block->selector; - $wrapped->comments = []; - $wrapped->parent = $block; - $wrapped->children = $block->children; - $wrapped->selfParent = $block->selfParent; - $block->children = [[Type::T_BLOCK, $wrapped]]; - $block->selector = null; - } - $selfParent = $block->selfParent; - \assert($selfParent !== null, 'at-root blocks must have a selfParent set.'); - if (!$selfParent->selectors && isset($block->parent) && isset($block->parent->selectors) && $block->parent->selectors) { - $selfParent = $block->parent; - } - $this->env = $this->filterWithWithout($envs, $with, $without); - \assert($this->scope !== null); - $saveScope = $this->scope; - $this->scope = $this->filterScopeWithWithout($saveScope, $with, $without); - // propagate selfParent to the children where they still can be useful - $this->compileChildrenNoReturn($block->children, $this->scope, $selfParent); - \assert($this->scope !== null); - $this->completeScope($this->scope, $saveScope); - $this->scope = $saveScope; - $this->env = $this->extractEnv($envs); - $this->popEnv(); - } - /** - * Filter at-root scope depending on with/without option - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope - * @param array $with - * @param array $without - * - * @return OutputBlock - */ - protected function filterScopeWithWithout($scope, $with, $without) - { - $filteredScopes = []; - $childStash = []; - if ($scope->type === Type::T_ROOT) { - return $scope; - } - \assert($this->rootBlock !== null); - // start from the root - while ($scope->parent && $scope->parent->type !== Type::T_ROOT) { - \array_unshift($childStash, $scope); - \assert($scope->parent !== null); - $scope = $scope->parent; - } - for (;;) { - if (!$scope) { - break; - } - if ($this->isWith($scope, $with, $without)) { - $s = clone $scope; - $s->children = []; - $s->lines = []; - $s->parent = null; - if ($s->type !== Type::T_MEDIA && $s->type !== Type::T_DIRECTIVE) { - $s->selectors = []; - } - $filteredScopes[] = $s; - } - if (\count($childStash)) { - $scope = \array_shift($childStash); - } elseif ($scope->children) { - $scope = \end($scope->children); - } else { - $scope = null; - } - } - if (!\count($filteredScopes)) { - return $this->rootBlock; - } - $newScope = \array_shift($filteredScopes); - $newScope->parent = $this->rootBlock; - $this->rootBlock->children[] = $newScope; - $p =& $newScope; - while (\count($filteredScopes)) { - $s = \array_shift($filteredScopes); - $s->parent = $p; - $p->children[] = $s; - $newScope =& $p->children[0]; - $p =& $p->children[0]; - } - return $newScope; - } - /** - * found missing selector from a at-root compilation in the previous scope - * (if at-root is just enclosing a property, the selector is in the parent tree) - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $previousScope - * - * @return OutputBlock - */ - protected function completeScope($scope, $previousScope) - { - if (!$scope->type && !$scope->selectors && \count($scope->lines)) { - $scope->selectors = $this->findScopeSelectors($previousScope, $scope->depth); - } - if ($scope->children) { - foreach ($scope->children as $k => $c) { - $scope->children[$k] = $this->completeScope($c, $previousScope); - } - } - return $scope; - } - /** - * Find a selector by the depth node in the scope - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope - * @param int $depth - * - * @return array - */ - protected function findScopeSelectors($scope, $depth) - { - if ($scope->depth === $depth && $scope->selectors) { - return $scope->selectors; - } - if ($scope->children) { - foreach (\array_reverse($scope->children) as $c) { - if ($s = $this->findScopeSelectors($c, $depth)) { - return $s; - } - } - } - return []; - } - /** - * Compile @at-root's with: inclusion / without: exclusion into 2 lists uses to filter scope/env later - * - * @param array|null $withCondition - * - * @return array - * - * @phpstan-return array{array, array} - */ - protected function compileWith($withCondition) - { - // just compile what we have in 2 lists - $with = []; - $without = ['rule' => \true]; - if ($withCondition) { - if ($withCondition[0] === Type::T_INTERPOLATE) { - $w = $this->compileValue($withCondition); - $buffer = "({$w})"; - $parser = $this->parserFactory(__METHOD__); - if ($parser->parseValue($buffer, $reParsedWith)) { - $withCondition = $reParsedWith; - } - } - $withConfig = $this->mapGet($withCondition, static::$with); - if ($withConfig !== null) { - $without = []; - // cancel the default - $list = $this->coerceList($withConfig); - foreach ($list[2] as $item) { - $keyword = $this->compileStringContent($this->coerceString($item)); - $with[$keyword] = \true; - } - } - $withoutConfig = $this->mapGet($withCondition, static::$without); - if ($withoutConfig !== null) { - $without = []; - // cancel the default - $list = $this->coerceList($withoutConfig); - foreach ($list[2] as $item) { - $keyword = $this->compileStringContent($this->coerceString($item)); - $without[$keyword] = \true; - } - } - } - return [$with, $without]; - } - /** - * Filter env stack - * - * @param Environment[] $envs - * @param array $with - * @param array $without - * - * @return Environment - * - * @phpstan-param non-empty-array $envs - */ - protected function filterWithWithout($envs, $with, $without) - { - $filtered = []; - foreach ($envs as $e) { - if ($e->block && !$this->isWith($e->block, $with, $without)) { - $ec = clone $e; - $ec->block = null; - $ec->selectors = []; - $filtered[] = $ec; - } else { - $filtered[] = $e; - } - } - return $this->extractEnv($filtered); - } - /** - * Filter WITH rules - * - * @param \ScssPhp\ScssPhp\Block|\ScssPhp\ScssPhp\Formatter\OutputBlock $block - * @param array $with - * @param array $without - * - * @return bool - */ - protected function isWith($block, $with, $without) - { - if (isset($block->type)) { - if ($block->type === Type::T_MEDIA) { - return $this->testWithWithout('media', $with, $without); - } - if ($block->type === Type::T_DIRECTIVE) { - \assert($block instanceof DirectiveBlock || $block instanceof OutputBlock); - if (isset($block->name)) { - return $this->testWithWithout($this->compileDirectiveName($block->name), $with, $without); - } elseif (isset($block->selectors) && \preg_match(',@(\\w+),ims', \json_encode($block->selectors), $m)) { - return $this->testWithWithout($m[1], $with, $without); - } else { - return $this->testWithWithout('???', $with, $without); - } - } - } elseif (isset($block->selectors)) { - // a selector starting with number is a keyframe rule - if (\count($block->selectors)) { - $s = \reset($block->selectors); - while (\is_array($s)) { - $s = \reset($s); - } - if (\is_object($s) && $s instanceof Number) { - return $this->testWithWithout('keyframes', $with, $without); - } - } - return $this->testWithWithout('rule', $with, $without); - } - return \true; - } - /** - * Test a single type of block against with/without lists - * - * @param string $what - * @param array $with - * @param array $without - * - * @return bool - * true if the block should be kept, false to reject - */ - protected function testWithWithout($what, $with, $without) - { - // if without, reject only if in the list (or 'all' is in the list) - if (\count($without)) { - return isset($without[$what]) || isset($without['all']) ? \false : \true; - } - // otherwise reject all what is not in the with list - return isset($with[$what]) || isset($with['all']) ? \true : \false; - } - /** - * Compile keyframe block - * - * @param \ScssPhp\ScssPhp\Block $block - * @param string[] $selectors - * - * @return void - */ - protected function compileKeyframeBlock(Block $block, $selectors) - { - $env = $this->pushEnv($block); - $envs = $this->compactEnv($env); - $this->env = $this->extractEnv(\array_filter($envs, function (Environment $e) { - return !isset($e->block->selectors); - })); - $this->scope = $this->makeOutputBlock($block->type, $selectors); - $this->scope->depth = 1; - \assert($this->scope->parent !== null); - $this->scope->parent->children[] = $this->scope; - $this->compileChildrenNoReturn($block->children, $this->scope); - \assert($this->scope !== null); - $this->scope = $this->scope->parent; - $this->env = $this->extractEnv($envs); - $this->popEnv(); - } - /** - * Compile nested properties lines - * - * @param \ScssPhp\ScssPhp\Block $block - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * - * @return void - */ - protected function compileNestedPropertiesBlock(Block $block, OutputBlock $out) - { - \assert($block instanceof NestedPropertyBlock); - $prefix = $this->compileValue($block->prefix) . '-'; - $nested = $this->makeOutputBlock($block->type); - $nested->parent = $out; - if ($block->hasValue) { - $nested->depth = $out->depth + 1; - } - $out->children[] = $nested; - foreach ($block->children as $child) { - switch ($child[0]) { - case Type::T_ASSIGN: - \array_unshift($child[1][2], $prefix); - break; - case Type::T_NESTED_PROPERTY: - \assert($child[1] instanceof NestedPropertyBlock); - \array_unshift($child[1]->prefix[2], $prefix); - break; - } - $this->compileChild($child, $nested); - } - } - /** - * Compile nested block - * - * @param \ScssPhp\ScssPhp\Block $block - * @param string[] $selectors - * - * @return void - */ - protected function compileNestedBlock(Block $block, $selectors) - { - $this->pushEnv($block); - $this->scope = $this->makeOutputBlock($block->type, $selectors); - \assert($this->scope->parent !== null); - $this->scope->parent->children[] = $this->scope; - // wrap assign children in a block - // except for @font-face - if (!$block instanceof DirectiveBlock || $this->compileDirectiveName($block->name) !== 'font-face') { - // need wrapping? - $needWrapping = \false; - foreach ($block->children as $child) { - if ($child[0] === Type::T_ASSIGN) { - $needWrapping = \true; - break; - } - } - if ($needWrapping) { - $wrapped = new Block(); - $wrapped->sourceName = $block->sourceName; - $wrapped->sourceIndex = $block->sourceIndex; - $wrapped->sourceLine = $block->sourceLine; - $wrapped->sourceColumn = $block->sourceColumn; - $wrapped->selectors = []; - $wrapped->comments = []; - $wrapped->parent = $block; - $wrapped->children = $block->children; - $wrapped->selfParent = $block->selfParent; - $block->children = [[Type::T_BLOCK, $wrapped]]; - } - } - $this->compileChildrenNoReturn($block->children, $this->scope); - \assert($this->scope !== null); - $this->scope = $this->scope->parent; - $this->popEnv(); - } - /** - * Recursively compiles a block. - * - * A block is analogous to a CSS block in most cases. A single SCSS document - * is encapsulated in a block when parsed, but it does not have parent tags - * so all of its children appear on the root level when compiled. - * - * Blocks are made up of selectors and children. - * - * The children of a block are just all the blocks that are defined within. - * - * Compiling the block involves pushing a fresh environment on the stack, - * and iterating through the props, compiling each one. - * - * @see Compiler::compileChild() - * - * @param \ScssPhp\ScssPhp\Block $block - * - * @return void - */ - protected function compileBlock(Block $block) - { - $env = $this->pushEnv($block); - \assert($block->selectors !== null); - $env->selectors = $this->evalSelectors($block->selectors); - $out = $this->makeOutputBlock(null); - \assert($this->scope !== null); - $this->scope->children[] = $out; - if (\count($block->children)) { - $out->selectors = $this->multiplySelectors($env, $block->selfParent); - // propagate selfParent to the children where they still can be useful - $selfParentSelectors = null; - if (isset($block->selfParent->selectors)) { - $selfParentSelectors = $block->selfParent->selectors; - $block->selfParent->selectors = $out->selectors; - } - $this->compileChildrenNoReturn($block->children, $out, $block->selfParent); - // and revert for the following children of the same block - if ($selfParentSelectors) { - \assert($block->selfParent !== null); - $block->selfParent->selectors = $selfParentSelectors; - } - } - $this->popEnv(); - } - /** - * Compile the value of a comment that can have interpolation - * - * @param array $value - * @param bool $pushEnv - * - * @return string - */ - protected function compileCommentValue($value, $pushEnv = \false) - { - $c = $value[1]; - if (isset($value[2])) { - if ($pushEnv) { - $this->pushEnv(); - } - try { - $c = $this->compileValue($value[2]); - } catch (SassScriptException $e) { - $this->logger->warn('Ignoring interpolation errors in multiline comments is deprecated and will be removed in ScssPhp 2.0. ' . $this->addLocationToMessage($e->getMessage()), \true); - // ignore error in comment compilation which are only interpolation - } catch (SassException $e) { - $this->logger->warn('Ignoring interpolation errors in multiline comments is deprecated and will be removed in ScssPhp 2.0. ' . $e->getMessage(), \true); - // ignore error in comment compilation which are only interpolation - } - if ($pushEnv) { - $this->popEnv(); - } - } - return $c; - } - /** - * Compile root level comment - * - * @param array $block - * - * @return void - */ - protected function compileComment($block) - { - $out = $this->makeOutputBlock(Type::T_COMMENT); - $out->lines[] = $this->compileCommentValue($block, \true); - \assert($this->scope !== null); - $this->scope->children[] = $out; - } - /** - * Evaluate selectors - * - * @param array $selectors - * - * @return array - */ - protected function evalSelectors($selectors) - { - $this->shouldEvaluate = \false; - $evaluatedSelectors = []; - foreach ($selectors as $selector) { - $evaluatedSelectors[] = $this->evalSelector($selector); - } - $selectors = $evaluatedSelectors; - // after evaluating interpolates, we might need a second pass - if ($this->shouldEvaluate) { - $selectors = $this->replaceSelfSelector($selectors, '&'); - $buffer = $this->collapseSelectors($selectors); - $parser = $this->parserFactory(__METHOD__); - try { - $isValid = $parser->parseSelector($buffer, $newSelectors, \true); - } catch (ParserException $e) { - throw $this->error($e->getMessage()); - } - if ($isValid) { - $selectors = \array_map([$this, 'evalSelector'], $newSelectors); - } - } - return $selectors; - } - /** - * Evaluate selector - * - * @param array $selector - * - * @return array - * - * @phpstan-impure - */ - protected function evalSelector($selector) - { - return \array_map([$this, 'evalSelectorPart'], $selector); - } - /** - * Evaluate selector part; replaces all the interpolates, stripping quotes - * - * @param array $part - * - * @return array - * - * @phpstan-impure - */ - protected function evalSelectorPart($part) - { - foreach ($part as &$p) { - if (\is_array($p) && ($p[0] === Type::T_INTERPOLATE || $p[0] === Type::T_STRING)) { - $p = $this->compileValue($p); - // force re-evaluation if self char or non standard char - if (\preg_match(',[^\\w-],', $p)) { - $this->shouldEvaluate = \true; - } - } elseif (\is_string($p) && \strlen($p) >= 2 && ($p[0] === '"' || $p[0] === "'") && \substr($p, -1) === $p[0]) { - $p = \substr($p, 1, -1); - } - } - return $this->flattenSelectorSingle($part); - } - /** - * Collapse selectors - * - * @param array $selectors - * - * @return string - */ - protected function collapseSelectors($selectors) - { - $parts = []; - foreach ($selectors as $selector) { - $output = []; - foreach ($selector as $node) { - $compound = ''; - if (!\is_array($node)) { - $output[] = $node; - continue; - } - \array_walk_recursive($node, function ($value, $key) use(&$compound) { - $compound .= $value; - }); - $output[] = $compound; - } - $parts[] = \implode(' ', $output); - } - return \implode(', ', $parts); - } - /** - * Collapse selectors - * - * @param array $selectors - * - * @return array - */ - private function collapseSelectorsAsList($selectors) - { - $parts = []; - foreach ($selectors as $selector) { - $output = []; - $glueNext = \false; - foreach ($selector as $node) { - $compound = ''; - if (!\is_array($node)) { - $compound .= $node; - } else { - \array_walk_recursive($node, function ($value, $key) use(&$compound) { - $compound .= $value; - }); - } - if ($this->isImmediateRelationshipCombinator($compound)) { - if (\count($output)) { - $output[\count($output) - 1] .= ' ' . $compound; - } else { - $output[] = $compound; - } - $glueNext = \true; - } elseif ($glueNext) { - $output[\count($output) - 1] .= ' ' . $compound; - $glueNext = \false; - } else { - $output[] = $compound; - } - } - foreach ($output as &$o) { - $o = [Type::T_STRING, '', [$o]]; - } - $parts[] = [Type::T_LIST, ' ', $output]; - } - return [Type::T_LIST, ',', $parts]; - } - /** - * Parse down the selector and revert [self] to "&" before a reparsing - * - * @param array $selectors - * @param string|null $replace - * - * @return array - */ - protected function replaceSelfSelector($selectors, $replace = null) - { - foreach ($selectors as &$part) { - if (\is_array($part)) { - if ($part === [Type::T_SELF]) { - if (\is_null($replace)) { - $replace = $this->reduce([Type::T_SELF]); - $replace = $this->compileValue($replace); - } - $part = $replace; - } else { - $part = $this->replaceSelfSelector($part, $replace); - } - } - } - return $selectors; - } - /** - * Flatten selector single; joins together .classes and #ids - * - * @param array $single - * - * @return array - */ - protected function flattenSelectorSingle($single) - { - $joined = []; - foreach ($single as $part) { - if (empty($joined) || !\is_string($part) || \preg_match('/[\\[.:#%]/', $part)) { - $joined[] = $part; - continue; - } - if (\is_array(\end($joined))) { - $joined[] = $part; - } else { - $joined[\count($joined) - 1] .= $part; - } - } - return $joined; - } - /** - * Compile selector to string; self(&) should have been replaced by now - * - * @param string|array $selector - * - * @return string - */ - protected function compileSelector($selector) - { - if (!\is_array($selector)) { - return $selector; - // media and the like - } - return \implode(' ', \array_map([$this, 'compileSelectorPart'], $selector)); - } - /** - * Compile selector part - * - * @param array $piece - * - * @return string - */ - protected function compileSelectorPart($piece) - { - foreach ($piece as &$p) { - if (!\is_array($p)) { - continue; - } - switch ($p[0]) { - case Type::T_SELF: - $p = '&'; - break; - default: - $p = $this->compileValue($p); - break; - } - } - return \implode($piece); - } - /** - * Has selector placeholder? - * - * @param array $selector - * - * @return bool - */ - protected function hasSelectorPlaceholder($selector) - { - if (!\is_array($selector)) { - return \false; - } - foreach ($selector as $parts) { - foreach ($parts as $part) { - if (\strlen($part) && '%' === $part[0]) { - return \true; - } - } - } - return \false; - } - /** - * @param string $name - * - * @return void - */ - protected function pushCallStack($name = '') - { - $this->callStack[] = ['n' => $name, Parser::SOURCE_INDEX => $this->sourceIndex, Parser::SOURCE_LINE => $this->sourceLine, Parser::SOURCE_COLUMN => $this->sourceColumn]; - // infinite calling loop - if (\count($this->callStack) > 25000) { - // not displayed but you can var_dump it to deep debug - $msg = $this->callStackMessage(\true, 100); - $msg = 'Infinite calling loop'; - throw $this->error($msg); - } - } - /** - * @return void - */ - protected function popCallStack() - { - \array_pop($this->callStack); - } - /** - * Compile children and return result - * - * @param array $stms - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * @param string $traceName - * - * @return array|Number|null - */ - protected function compileChildren($stms, OutputBlock $out, $traceName = '') - { - $this->pushCallStack($traceName); - foreach ($stms as $stm) { - $ret = $this->compileChild($stm, $out); - if (isset($ret)) { - $this->popCallStack(); - return $ret; - } - } - $this->popCallStack(); - return null; - } - /** - * Compile children and throw exception if unexpected at-return - * - * @param array[] $stms - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * @param \ScssPhp\ScssPhp\Block $selfParent - * @param string $traceName - * - * @return void - * - * @throws \Exception - */ - protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '') - { - $this->pushCallStack($traceName); - foreach ($stms as $stm) { - if ($selfParent && isset($stm[1]) && \is_object($stm[1]) && $stm[1] instanceof Block) { - $oldSelfParent = $stm[1]->selfParent; - $stm[1]->selfParent = $selfParent; - $ret = $this->compileChild($stm, $out); - $stm[1]->selfParent = $oldSelfParent; - } elseif ($selfParent && \in_array($stm[0], [Type::T_INCLUDE, Type::T_EXTEND])) { - $stm['selfParent'] = $selfParent; - $ret = $this->compileChild($stm, $out); - } else { - $ret = $this->compileChild($stm, $out); - } - if (isset($ret)) { - throw $this->error('@return may only be used within a function'); - } - } - $this->popCallStack(); - } - /** - * evaluate media query : compile internal value keeping the structure unchanged - * - * @param array $queryList - * - * @return array - */ - protected function evaluateMediaQuery($queryList) - { - static $parser = null; - $outQueryList = []; - foreach ($queryList as $kql => $query) { - $shouldReparse = \false; - foreach ($query as $kq => $q) { - for ($i = 1; $i < \count($q); $i++) { - $value = $this->compileValue($q[$i]); - // the parser had no mean to know if media type or expression if it was an interpolation - // so you need to reparse if the T_MEDIA_TYPE looks like anything else a media type - if ($q[0] == Type::T_MEDIA_TYPE && (\strpos($value, '(') !== \false || \strpos($value, ')') !== \false || \strpos($value, ':') !== \false || \strpos($value, ',') !== \false)) { - $shouldReparse = \true; - } - $queryList[$kql][$kq][$i] = [Type::T_KEYWORD, $value]; - } - } - if ($shouldReparse) { - if (\is_null($parser)) { - $parser = $this->parserFactory(__METHOD__); - } - $queryString = $this->compileMediaQuery([$queryList[$kql]]); - $queryString = \reset($queryString); - if ($queryString !== \false && \strpos($queryString, '@media ') === 0) { - $queryString = \substr($queryString, 7); - $queries = []; - if ($parser->parseMediaQueryList($queryString, $queries)) { - $queries = $this->evaluateMediaQuery($queries[2]); - while (\count($queries)) { - $outQueryList[] = \array_shift($queries); - } - continue; - } - } - } - $outQueryList[] = $queryList[$kql]; - } - return $outQueryList; - } - /** - * Compile media query - * - * @param array $queryList - * - * @return string[] - */ - protected function compileMediaQuery($queryList) - { - $start = '@media '; - $default = \trim($start); - $out = []; - $current = ''; - foreach ($queryList as $query) { - $type = null; - $parts = []; - $mediaTypeOnly = \true; - foreach ($query as $q) { - if ($q[0] !== Type::T_MEDIA_TYPE) { - $mediaTypeOnly = \false; - break; - } - } - foreach ($query as $q) { - switch ($q[0]) { - case Type::T_MEDIA_TYPE: - $newType = \array_map([$this, 'compileValue'], \array_slice($q, 1)); - // combining not and anything else than media type is too risky and should be avoided - if (!$mediaTypeOnly) { - if (\in_array(Type::T_NOT, $newType) || $type && \in_array(Type::T_NOT, $type)) { - if ($type) { - \array_unshift($parts, \implode(' ', \array_filter($type))); - } - if (!empty($parts)) { - if (\strlen($current)) { - $current .= $this->formatter->tagSeparator; - } - $current .= \implode(' and ', $parts); - } - if ($current) { - $out[] = $start . $current; - } - $current = ''; - $type = null; - $parts = []; - } - } - if ($newType === ['all'] && $default) { - $default = $start . 'all'; - } - // all can be safely ignored and mixed with whatever else - if ($newType !== ['all']) { - if ($type) { - $type = $this->mergeMediaTypes($type, $newType); - if (empty($type)) { - // merge failed : ignore this query that is not valid, skip to the next one - $parts = []; - $default = ''; - // if everything fail, no @media at all - continue 3; - } - } else { - $type = $newType; - } - } - break; - case Type::T_MEDIA_EXPRESSION: - if (isset($q[2])) { - $parts[] = '(' . $this->compileValue($q[1]) . $this->formatter->assignSeparator . $this->compileValue($q[2]) . ')'; - } else { - $parts[] = '(' . $this->compileValue($q[1]) . ')'; - } - break; - case Type::T_MEDIA_VALUE: - $parts[] = $this->compileValue($q[1]); - break; - } - } - if ($type) { - \array_unshift($parts, \implode(' ', \array_filter($type))); - } - if (!empty($parts)) { - if (\strlen($current)) { - $current .= $this->formatter->tagSeparator; - } - $current .= \implode(' and ', $parts); - } - } - if ($current) { - $out[] = $start . $current; - } - // no @media type except all, and no conflict? - if (!$out && $default) { - $out[] = $default; - } - return $out; - } - /** - * Merge direct relationships between selectors - * - * @param array $selectors1 - * @param array $selectors2 - * - * @return array - */ - protected function mergeDirectRelationships($selectors1, $selectors2) - { - if (empty($selectors1) || empty($selectors2)) { - return \array_merge($selectors1, $selectors2); - } - $part1 = \end($selectors1); - $part2 = \end($selectors2); - if (!$this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) { - return \array_merge($selectors1, $selectors2); - } - $merged = []; - do { - $part1 = \array_pop($selectors1); - $part2 = \array_pop($selectors2); - if (!$this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) { - if ($this->isImmediateRelationshipCombinator(\reset($merged)[0])) { - \array_unshift($merged, [$part1[0] . $part2[0]]); - $merged = \array_merge($selectors1, $selectors2, $merged); - } else { - $merged = \array_merge($selectors1, [$part1], $selectors2, [$part2], $merged); - } - break; - } - \array_unshift($merged, $part1); - } while (!empty($selectors1) && !empty($selectors2)); - return $merged; - } - /** - * Merge media types - * - * @param array $type1 - * @param array $type2 - * - * @return array|null - */ - protected function mergeMediaTypes($type1, $type2) - { - if (empty($type1)) { - return $type2; - } - if (empty($type2)) { - return $type1; - } - if (\count($type1) > 1) { - $m1 = \strtolower($type1[0]); - $t1 = \strtolower($type1[1]); - } else { - $m1 = ''; - $t1 = \strtolower($type1[0]); - } - if (\count($type2) > 1) { - $m2 = \strtolower($type2[0]); - $t2 = \strtolower($type2[1]); - } else { - $m2 = ''; - $t2 = \strtolower($type2[0]); - } - if ($m1 === Type::T_NOT ^ $m2 === Type::T_NOT) { - if ($t1 === $t2) { - return null; - } - return [$m1 === Type::T_NOT ? $m2 : $m1, $m1 === Type::T_NOT ? $t2 : $t1]; - } - if ($m1 === Type::T_NOT && $m2 === Type::T_NOT) { - // CSS has no way of representing "neither screen nor print" - if ($t1 !== $t2) { - return null; - } - return [Type::T_NOT, $t1]; - } - if ($t1 !== $t2) { - return null; - } - // t1 == t2, neither m1 nor m2 are "not" - return [empty($m1) ? $m2 : $m1, $t1]; - } - /** - * Compile import; returns true if the value was something that could be imported - * - * @param array $rawPath - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * @param bool $once - * - * @return bool - */ - protected function compileImport($rawPath, OutputBlock $out, $once = \false) - { - if ($rawPath[0] === Type::T_STRING) { - $path = $this->compileStringContent($rawPath); - if (\strpos($path, 'url(') !== 0 && ($filePath = $this->findImport($path, $this->currentDirectory))) { - $this->registerImport($this->currentDirectory, $path, $filePath); - if (!$once || !\in_array($filePath, $this->importedFiles)) { - $this->importFile($filePath, $out); - $this->importedFiles[] = $filePath; - } - return \true; - } - $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out); - return \false; - } - if ($rawPath[0] === Type::T_LIST) { - // handle a list of strings - if (\count($rawPath[2]) === 0) { - return \false; - } - foreach ($rawPath[2] as $path) { - if ($path[0] !== Type::T_STRING) { - $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out); - return \false; - } - } - foreach ($rawPath[2] as $path) { - $this->compileImport($path, $out, $once); - } - return \true; - } - $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out); - return \false; - } - /** - * @param array $rawPath - * @return string - * @throws CompilerException - */ - protected function compileImportPath($rawPath) - { - $path = $this->compileValue($rawPath); - // case url() without quotes : suppress \r \n remaining in the path - // if this is a real string there can not be CR or LF char - if (\strpos($path, 'url(') === 0) { - $path = \str_replace(array("\r", "\n"), array('', ' '), $path); - } else { - // if this is a file name in a string, spaces should be escaped - $path = $this->reduce($rawPath); - $path = $this->escapeImportPathString($path); - $path = $this->compileValue($path); - } - return $path; - } - /** - * @param array $path - * @return array - * @throws CompilerException - */ - protected function escapeImportPathString($path) - { - switch ($path[0]) { - case Type::T_LIST: - foreach ($path[2] as $k => $v) { - $path[2][$k] = $this->escapeImportPathString($v); - } - break; - case Type::T_STRING: - if ($path[1]) { - $path = $this->compileValue($path); - $path = \str_replace(' ', '\\ ', $path); - $path = [Type::T_KEYWORD, $path]; - } - break; - } - return $path; - } - /** - * Append a root directive like @import or @charset as near as the possible from the source code - * (keeping before comments, @import and @charset coming before in the source code) - * - * @param string $line - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * @param array $allowed - * - * @return void - */ - protected function appendRootDirective($line, $out, $allowed = [Type::T_COMMENT]) - { - $root = $out; - while ($root->parent) { - $root = $root->parent; - } - $i = 0; - while ($i < \count($root->children)) { - if (!isset($root->children[$i]->type) || !\in_array($root->children[$i]->type, $allowed)) { - break; - } - $i++; - } - // remove incompatible children from the bottom of the list - $saveChildren = []; - while ($i < \count($root->children)) { - $saveChildren[] = \array_pop($root->children); - } - // insert the directive as a comment - $child = $this->makeOutputBlock(Type::T_COMMENT); - $child->lines[] = $line; - $child->sourceName = $this->sourceNames[$this->sourceIndex] ?: '(stdin)'; - $child->sourceLine = $this->sourceLine; - $child->sourceColumn = $this->sourceColumn; - $root->children[] = $child; - // repush children - while (\count($saveChildren)) { - $root->children[] = \array_pop($saveChildren); - } - } - /** - * Append lines to the current output block: - * directly to the block or through a child if necessary - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * @param string $type - * @param string $line - * - * @return void - */ - protected function appendOutputLine(OutputBlock $out, $type, $line) - { - $outWrite =& $out; - // check if it's a flat output or not - if (\count($out->children)) { - $lastChild =& $out->children[\count($out->children) - 1]; - if ($lastChild->depth === $out->depth && \is_null($lastChild->selectors) && !\count($lastChild->children)) { - $outWrite = $lastChild; - } else { - $nextLines = $this->makeOutputBlock($type); - $nextLines->parent = $out; - $nextLines->depth = $out->depth; - $out->children[] = $nextLines; - $outWrite =& $nextLines; - } - } - $outWrite->lines[] = $line; - } - /** - * Compile child; returns a value to halt execution - * - * @param array $child - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * - * @return array|Number|null - */ - protected function compileChild($child, OutputBlock $out) - { - if (isset($child[Parser::SOURCE_LINE])) { - $this->sourceIndex = isset($child[Parser::SOURCE_INDEX]) ? $child[Parser::SOURCE_INDEX] : null; - $this->sourceLine = $child[Parser::SOURCE_LINE]; - $this->sourceColumn = isset($child[Parser::SOURCE_COLUMN]) ? $child[Parser::SOURCE_COLUMN] : -1; - } elseif (\is_array($child) && isset($child[1]->sourceLine) && $child[1] instanceof Block) { - $this->sourceIndex = $child[1]->sourceIndex; - $this->sourceLine = $child[1]->sourceLine; - $this->sourceColumn = $child[1]->sourceColumn; - } elseif (!empty($out->sourceLine) && !empty($out->sourceName)) { - $this->sourceLine = $out->sourceLine; - $sourceIndex = \array_search($out->sourceName, $this->sourceNames); - $this->sourceColumn = $out->sourceColumn; - if ($sourceIndex === \false) { - $sourceIndex = null; - } - $this->sourceIndex = $sourceIndex; - } - switch ($child[0]) { - case Type::T_SCSSPHP_IMPORT_ONCE: - $rawPath = $this->reduce($child[1]); - $this->compileImport($rawPath, $out, \true); - break; - case Type::T_IMPORT: - $rawPath = $this->reduce($child[1]); - $this->compileImport($rawPath, $out); - break; - case Type::T_DIRECTIVE: - $this->compileDirective($child[1], $out); - break; - case Type::T_AT_ROOT: - $this->compileAtRoot($child[1]); - break; - case Type::T_MEDIA: - $this->compileMedia($child[1]); - break; - case Type::T_BLOCK: - $this->compileBlock($child[1]); - break; - case Type::T_CHARSET: - break; - case Type::T_CUSTOM_PROPERTY: - list(, $name, $value) = $child; - $compiledName = $this->compileValue($name); - // if the value reduces to null from something else then - // the property should be discarded - if ($value[0] !== Type::T_NULL) { - $value = $this->reduce($value); - if ($value[0] === Type::T_NULL || $value === static::$nullString) { - break; - } - } - $compiledValue = $this->compileValue($value); - $line = $this->formatter->customProperty($compiledName, $compiledValue); - $this->appendOutputLine($out, Type::T_ASSIGN, $line); - break; - case Type::T_ASSIGN: - list(, $name, $value) = $child; - if ($name[0] === Type::T_VARIABLE) { - $flags = isset($child[3]) ? $child[3] : []; - $isDefault = \in_array('!default', $flags); - $isGlobal = \in_array('!global', $flags); - if ($isGlobal) { - $this->set($name[1], $this->reduce($value), \false, $this->rootEnv, $value); - break; - } - $shouldSet = $isDefault && (\is_null($result = $this->get($name[1], \false)) || $result === static::$null); - if (!$isDefault || $shouldSet) { - $this->set($name[1], $this->reduce($value), \true, null, $value); - } - break; - } - $compiledName = $this->compileValue($name); - // handle shorthand syntaxes : size / line-height... - if (\in_array($compiledName, ['font', 'grid-row', 'grid-column', 'border-radius'])) { - if ($value[0] === Type::T_VARIABLE) { - // if the font value comes from variable, the content is already reduced - // (i.e., formulas were already calculated), so we need the original unreduced value - $value = $this->get($value[1], \true, null, \true); - } - $shorthandValue =& $value; - $shorthandDividerNeedsUnit = \false; - $maxListElements = null; - $maxShorthandDividers = 1; - switch ($compiledName) { - case 'border-radius': - $maxListElements = 4; - $shorthandDividerNeedsUnit = \true; - break; - } - if ($compiledName === 'font' && $value[0] === Type::T_LIST && $value[1] === ',') { - // this is the case if more than one font is given: example: "font: 400 1em/1.3 arial,helvetica" - // we need to handle the first list element - $shorthandValue =& $value[2][0]; - } - if ($shorthandValue[0] === Type::T_EXPRESSION && $shorthandValue[1] === '/') { - $revert = \true; - if ($shorthandDividerNeedsUnit) { - $divider = $shorthandValue[3]; - if (\is_array($divider)) { - $divider = $this->reduce($divider, \true); - } - if ($divider instanceof Number && \intval($divider->getDimension()) && $divider->unitless()) { - $revert = \false; - } - } - if ($revert) { - $shorthandValue = $this->expToString($shorthandValue); - } - } elseif ($shorthandValue[0] === Type::T_LIST) { - foreach ($shorthandValue[2] as &$item) { - if ($item[0] === Type::T_EXPRESSION && $item[1] === '/') { - if ($maxShorthandDividers > 0) { - $revert = \true; - // if the list of values is too long, this has to be a shorthand, - // otherwise it could be a real division - if (\is_null($maxListElements) || \count($shorthandValue[2]) <= $maxListElements) { - if ($shorthandDividerNeedsUnit) { - $divider = $item[3]; - if (\is_array($divider)) { - $divider = $this->reduce($divider, \true); - } - if ($divider instanceof Number && \intval($divider->getDimension()) && $divider->unitless()) { - $revert = \false; - } - } - } - if ($revert) { - $item = $this->expToString($item); - $maxShorthandDividers--; - } - } - } - } - } - } - // if the value reduces to null from something else then - // the property should be discarded - if ($value[0] !== Type::T_NULL) { - $value = $this->reduce($value); - if ($value[0] === Type::T_NULL || $value === static::$nullString) { - break; - } - } - $compiledValue = $this->compileValue($value); - // ignore empty value - if (\strlen($compiledValue)) { - $line = $this->formatter->property($compiledName, $compiledValue); - $this->appendOutputLine($out, Type::T_ASSIGN, $line); - } - break; - case Type::T_COMMENT: - if ($out->type === Type::T_ROOT) { - $this->compileComment($child); - break; - } - $line = $this->compileCommentValue($child, \true); - $this->appendOutputLine($out, Type::T_COMMENT, $line); - break; - case Type::T_MIXIN: - case Type::T_FUNCTION: - list(, $block) = $child; - \assert($block instanceof CallableBlock); - // the block need to be able to go up to it's parent env to resolve vars - $block->parentEnv = $this->getStoreEnv(); - $this->set(static::$namespaces[$block->type] . $block->name, $block, \true); - break; - case Type::T_EXTEND: - foreach ($child[1] as $sel) { - $replacedSel = $this->replaceSelfSelector($sel); - if ($replacedSel !== $sel) { - throw $this->error('Parent selectors aren\'t allowed here.'); - } - $results = $this->evalSelectors([$sel]); - foreach ($results as $result) { - if (\count($result) !== 1) { - throw $this->error('complex selectors may not be extended.'); - } - // only use the first one - $result = $result[0]; - $selectors = $out->selectors; - if (!$selectors && isset($child['selfParent'])) { - $selectors = $this->multiplySelectors($this->env, $child['selfParent']); - } - \assert($selectors !== null); - if (\count($result) > 1) { - $replacement = \implode(', ', $result); - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - $message = <<logger->warn($message); - } - $this->pushExtends($result, $selectors, $child); - } - } - break; - case Type::T_IF: - list(, $if) = $child; - \assert($if instanceof IfBlock); - if ($this->isTruthy($this->reduce($if->cond, \true))) { - return $this->compileChildren($if->children, $out); - } - foreach ($if->cases as $case) { - if ($case instanceof ElseBlock || $case instanceof ElseifBlock && $this->isTruthy($this->reduce($case->cond))) { - return $this->compileChildren($case->children, $out); - } - } - break; - case Type::T_EACH: - list(, $each) = $child; - \assert($each instanceof EachBlock); - $list = $this->coerceList($this->reduce($each->list), ',', \true); - $this->pushEnv(); - foreach ($list[2] as $item) { - if (\count($each->vars) === 1) { - $this->set($each->vars[0], $item, \true); - } else { - list(, , $values) = $this->coerceList($item); - foreach ($each->vars as $i => $var) { - $this->set($var, isset($values[$i]) ? $values[$i] : static::$null, \true); - } - } - $ret = $this->compileChildren($each->children, $out); - if ($ret) { - $store = $this->env->store; - $this->popEnv(); - $this->backPropagateEnv($store, $each->vars); - return $ret; - } - } - $store = $this->env->store; - $this->popEnv(); - $this->backPropagateEnv($store, $each->vars); - break; - case Type::T_WHILE: - list(, $while) = $child; - \assert($while instanceof WhileBlock); - while ($this->isTruthy($this->reduce($while->cond, \true))) { - $ret = $this->compileChildren($while->children, $out); - if ($ret) { - return $ret; - } - } - break; - case Type::T_FOR: - list(, $for) = $child; - \assert($for instanceof ForBlock); - $startNumber = $this->assertNumber($this->reduce($for->start, \true)); - $endNumber = $this->assertNumber($this->reduce($for->end, \true)); - $start = $this->assertInteger($startNumber); - $numeratorUnits = $startNumber->getNumeratorUnits(); - $denominatorUnits = $startNumber->getDenominatorUnits(); - $end = $this->assertInteger($endNumber->coerce($numeratorUnits, $denominatorUnits)); - $d = $start < $end ? 1 : -1; - $this->pushEnv(); - for (;;) { - if (!$for->until && $start - $d == $end || $for->until && $start == $end) { - break; - } - $this->set($for->var, new Number($start, $numeratorUnits, $denominatorUnits)); - $start += $d; - $ret = $this->compileChildren($for->children, $out); - if ($ret) { - $store = $this->env->store; - $this->popEnv(); - $this->backPropagateEnv($store, [$for->var]); - return $ret; - } - } - $store = $this->env->store; - $this->popEnv(); - $this->backPropagateEnv($store, [$for->var]); - break; - case Type::T_RETURN: - return $this->reduce($child[1], \true); - case Type::T_NESTED_PROPERTY: - $this->compileNestedPropertiesBlock($child[1], $out); - break; - case Type::T_INCLUDE: - // including a mixin - list(, $name, $argValues, $content, $argUsing) = $child; - $mixin = $this->get(static::$namespaces['mixin'] . $name, \false); - if (!$mixin) { - throw $this->error("Undefined mixin {$name}"); - } - \assert($mixin instanceof CallableBlock); - $callingScope = $this->getStoreEnv(); - // push scope, apply args - $this->pushEnv(); - $this->env->depth--; - // Find the parent selectors in the env to be able to know what '&' refers to in the mixin - // and assign this fake parent to childs - $selfParent = null; - if (isset($child['selfParent']) && $child['selfParent'] instanceof Block && isset($child['selfParent']->selectors)) { - $selfParent = $child['selfParent']; - } else { - $parentSelectors = $this->multiplySelectors($this->env); - if ($parentSelectors) { - $parent = new Block(); - $parent->selectors = $parentSelectors; - foreach ($mixin->children as $k => $child) { - if (isset($child[1]) && $child[1] instanceof Block) { - $mixin->children[$k][1]->parent = $parent; - } - } - } - } - // clone the stored content to not have its scope spoiled by a further call to the same mixin - // i.e., recursive @include of the same mixin - if (isset($content)) { - $copyContent = clone $content; - $copyContent->scope = clone $callingScope; - $this->setRaw(static::$namespaces['special'] . 'content', $copyContent, $this->env); - } else { - $this->setRaw(static::$namespaces['special'] . 'content', null, $this->env); - } - // save the "using" argument list for applying it to when "@content" is invoked - if (isset($argUsing)) { - $this->setRaw(static::$namespaces['special'] . 'using', $argUsing, $this->env); - } else { - $this->setRaw(static::$namespaces['special'] . 'using', null, $this->env); - } - if (isset($mixin->args)) { - $this->applyArguments($mixin->args, $argValues); - } - $this->env->marker = 'mixin'; - if (!empty($mixin->parentEnv)) { - $this->env->declarationScopeParent = $mixin->parentEnv; - } else { - throw $this->error("@mixin {$name}() without parentEnv"); - } - $this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . ' ' . $name); - $this->popEnv(); - break; - case Type::T_MIXIN_CONTENT: - $env = isset($this->storeEnv) ? $this->storeEnv : $this->env; - $content = $this->get(static::$namespaces['special'] . 'content', \false, $env); - $argUsing = $this->get(static::$namespaces['special'] . 'using', \false, $env); - $argContent = $child[1]; - if (!$content) { - break; - } - $storeEnv = $this->storeEnv; - $varsUsing = []; - if (isset($argUsing) && isset($argContent)) { - // Get the arguments provided for the content with the names provided in the "using" argument list - $this->storeEnv = null; - $varsUsing = $this->applyArguments($argUsing, $argContent, \false); - } - // restore the scope from the @content - $this->storeEnv = $content->scope; - // append the vars from using if any - foreach ($varsUsing as $name => $val) { - $this->set($name, $val, \true, $this->storeEnv); - } - $this->compileChildrenNoReturn($content->children, $out); - $this->storeEnv = $storeEnv; - break; - case Type::T_DEBUG: - list(, $value) = $child; - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - $value = $this->compileDebugValue($value); - $this->logger->debug("{$fname}:{$line} DEBUG: {$value}"); - break; - case Type::T_WARN: - list(, $value) = $child; - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - $value = $this->compileDebugValue($value); - $this->logger->warn("{$value}\n on line {$line} of {$fname}"); - break; - case Type::T_ERROR: - list(, $value) = $child; - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - $value = $this->compileValue($this->reduce($value, \true)); - throw $this->error("File {$fname} on line {$line} ERROR: {$value}\n"); - default: - throw $this->error("unknown child type: {$child[0]}"); - } - return null; - } - /** - * Reduce expression to string - * - * @param array $exp - * @param bool $keepParens - * - * @return array - */ - protected function expToString($exp, $keepParens = \false) - { - list(, $op, $left, $right, $inParens, $whiteLeft, $whiteRight) = $exp; - $content = []; - if ($keepParens && $inParens) { - $content[] = '('; - } - $content[] = $this->reduce($left); - if ($whiteLeft) { - $content[] = ' '; - } - $content[] = $op; - if ($whiteRight) { - $content[] = ' '; - } - $content[] = $this->reduce($right); - if ($keepParens && $inParens) { - $content[] = ')'; - } - return [Type::T_STRING, '', $content]; - } - /** - * Is truthy? - * - * @param array|Number $value - * - * @return bool - */ - public function isTruthy($value) - { - return $value !== static::$false && $value !== static::$null; - } - /** - * Is the value a direct relationship combinator? - * - * @param string $value - * - * @return bool - */ - protected function isImmediateRelationshipCombinator($value) - { - return $value === '>' || $value === '+' || $value === '~'; - } - /** - * Should $value cause its operand to eval - * - * @param array $value - * - * @return bool - */ - protected function shouldEval($value) - { - switch ($value[0]) { - case Type::T_EXPRESSION: - if ($value[1] === '/') { - return $this->shouldEval($value[2]) || $this->shouldEval($value[3]); - } - // fall-thru - case Type::T_VARIABLE: - case Type::T_FUNCTION_CALL: - return \true; - } - return \false; - } - /** - * Reduce value - * - * @param array|Number $value - * @param bool $inExp - * - * @return array|Number - */ - protected function reduce($value, $inExp = \false) - { - if ($value instanceof Number) { - return $value; - } - switch ($value[0]) { - case Type::T_EXPRESSION: - list(, $op, $left, $right, $inParens) = $value; - $opName = isset(static::$operatorNames[$op]) ? static::$operatorNames[$op] : $op; - $inExp = $inExp || $this->shouldEval($left) || $this->shouldEval($right); - $left = $this->reduce($left, \true); - if ($op !== 'and' && $op !== 'or') { - $right = $this->reduce($right, \true); - } - // special case: looks like css shorthand - if ($opName == 'div' && !$inParens && !$inExp && ($right[0] !== Type::T_NUMBER && isset($right[2]) && $right[2] != '' || $right[0] === Type::T_NUMBER && !$right->unitless())) { - return $this->expToString($value); - } - $left = $this->coerceForExpression($left); - $right = $this->coerceForExpression($right); - $ltype = $left[0]; - $rtype = $right[0]; - $ucOpName = \ucfirst($opName); - $ucLType = \ucfirst($ltype); - $ucRType = \ucfirst($rtype); - $shouldEval = $inParens || $inExp; - // this tries: - // 1. op[op name][left type][right type] - // 2. op[left type][right type] (passing the op as first arg) - // 3. op[op name] - if (\is_callable([$this, $fn = "op{$ucOpName}{$ucLType}{$ucRType}"])) { - $out = $this->{$fn}($left, $right, $shouldEval); - } elseif (\is_callable([$this, $fn = "op{$ucLType}{$ucRType}"])) { - $out = $this->{$fn}($op, $left, $right, $shouldEval); - } elseif (\is_callable([$this, $fn = "op{$ucOpName}"])) { - $out = $this->{$fn}($left, $right, $shouldEval); - } else { - $out = null; - } - if (isset($out)) { - return $out; - } - return $this->expToString($value); - case Type::T_UNARY: - list(, $op, $exp, $inParens) = $value; - $inExp = $inExp || $this->shouldEval($exp); - $exp = $this->reduce($exp); - if ($exp instanceof Number) { - switch ($op) { - case '+': - return $exp; - case '-': - return $exp->unaryMinus(); - } - } - if ($op === 'not') { - if ($inExp || $inParens) { - if ($exp === static::$false || $exp === static::$null) { - return static::$true; - } - return static::$false; - } - $op = $op . ' '; - } - return [Type::T_STRING, '', [$op, $exp]]; - case Type::T_VARIABLE: - return $this->reduce($this->get($value[1])); - case Type::T_LIST: - foreach ($value[2] as &$item) { - $item = $this->reduce($item); - } - unset($item); - if (isset($value[3]) && \is_array($value[3])) { - foreach ($value[3] as &$item) { - $item = $this->reduce($item); - } - unset($item); - } - return $value; - case Type::T_MAP: - foreach ($value[1] as &$item) { - $item = $this->reduce($item); - } - foreach ($value[2] as &$item) { - $item = $this->reduce($item); - } - return $value; - case Type::T_STRING: - foreach ($value[2] as &$item) { - if (\is_array($item) || $item instanceof Number) { - $item = $this->reduce($item); - } - } - return $value; - case Type::T_INTERPOLATE: - $value[1] = $this->reduce($value[1]); - if ($inExp) { - return [Type::T_KEYWORD, $this->compileValue($value, \false)]; - } - return $value; - case Type::T_FUNCTION_CALL: - return $this->fncall($value[1], $value[2]); - case Type::T_SELF: - $selfParent = !empty($this->env->block->selfParent) ? $this->env->block->selfParent : null; - $selfSelector = $this->multiplySelectors($this->env, $selfParent); - $selfSelector = $this->collapseSelectorsAsList($selfSelector); - return $selfSelector; - default: - return $value; - } - } - /** - * Function caller - * - * @param string|array $functionReference - * @param array $argValues - * - * @return array|Number - */ - protected function fncall($functionReference, $argValues) - { - // a string means this is a static hard reference coming from the parsing - if (\is_string($functionReference)) { - $name = $functionReference; - $functionReference = $this->getFunctionReference($name); - if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) { - $functionReference = [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]]; - } - } - // a function type means we just want a plain css function call - if ($functionReference[0] === Type::T_FUNCTION) { - // for CSS functions, simply flatten the arguments into a list - $listArgs = []; - foreach ((array) $argValues as $arg) { - if (empty($arg[0]) || \count($argValues) === 1) { - $listArgs[] = $this->reduce($this->stringifyFncallArgs($arg[1])); - } - } - return [Type::T_FUNCTION, $functionReference[1], [Type::T_LIST, ',', $listArgs]]; - } - if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) { - return static::$defaultValue; - } - switch ($functionReference[1]) { - // SCSS @function - case 'scss': - return $this->callScssFunction($functionReference[3], $argValues); - // native PHP functions - case 'user': - case 'native': - list(, , $name, $fn, $prototype) = $functionReference; - // special cases of css valid functions min/max - $name = \strtolower($name); - if (\in_array($name, ['min', 'max']) && \count($argValues) >= 1) { - $cssFunction = $this->cssValidArg([Type::T_FUNCTION_CALL, $name, $argValues], ['min', 'max', 'calc', 'env', 'var']); - if ($cssFunction !== \false) { - return $cssFunction; - } - } - $returnValue = $this->callNativeFunction($name, $fn, $prototype, $argValues); - if (!isset($returnValue)) { - return $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $argValues); - } - return $returnValue; - default: - return static::$defaultValue; - } - } - /** - * @param array|Number $arg - * @param string[] $allowed_function - * @param bool $inFunction - * - * @return array|Number|false - */ - protected function cssValidArg($arg, $allowed_function = [], $inFunction = \false) - { - if ($arg instanceof Number) { - return $this->stringifyFncallArgs($arg); - } - switch ($arg[0]) { - case Type::T_INTERPOLATE: - return [Type::T_KEYWORD, $this->CompileValue($arg)]; - case Type::T_FUNCTION: - if (!\in_array($arg[1], $allowed_function)) { - return \false; - } - if ($arg[2][0] === Type::T_LIST) { - foreach ($arg[2][2] as $k => $subarg) { - $arg[2][2][$k] = $this->cssValidArg($subarg, $allowed_function, $arg[1]); - if ($arg[2][2][$k] === \false) { - return \false; - } - } - } - return $arg; - case Type::T_FUNCTION_CALL: - if (!\in_array($arg[1], $allowed_function)) { - return \false; - } - $cssArgs = []; - foreach ($arg[2] as $argValue) { - if ($argValue === static::$null) { - return \false; - } - $cssArg = $this->cssValidArg($argValue[1], $allowed_function, $arg[1]); - if (empty($argValue[0]) && $cssArg !== \false) { - $cssArgs[] = [$argValue[0], $cssArg]; - } else { - return \false; - } - } - return $this->fncall([Type::T_FUNCTION, $arg[1], [Type::T_LIST, ',', []]], $cssArgs); - case Type::T_STRING: - case Type::T_KEYWORD: - if (!$inFunction or !\in_array($inFunction, ['calc', 'env', 'var'])) { - return \false; - } - return $this->stringifyFncallArgs($arg); - case Type::T_LIST: - if (!$inFunction) { - return \false; - } - if (empty($arg['enclosing']) and $arg[1] === '') { - foreach ($arg[2] as $k => $subarg) { - $arg[2][$k] = $this->cssValidArg($subarg, $allowed_function, $inFunction); - if ($arg[2][$k] === \false) { - return \false; - } - } - $arg[0] = Type::T_STRING; - return $arg; - } - return \false; - case Type::T_EXPRESSION: - if (!\in_array($arg[1], ['+', '-', '/', '*'])) { - return \false; - } - $arg[2] = $this->cssValidArg($arg[2], $allowed_function, $inFunction); - $arg[3] = $this->cssValidArg($arg[3], $allowed_function, $inFunction); - if ($arg[2] === \false || $arg[3] === \false) { - return \false; - } - return $this->expToString($arg, \true); - case Type::T_VARIABLE: - case Type::T_SELF: - default: - return \false; - } - } - /** - * Reformat fncall arguments to proper css function output - * - * @param array|Number $arg - * - * @return array|Number - */ - protected function stringifyFncallArgs($arg) - { - if ($arg instanceof Number) { - return $arg; - } - switch ($arg[0]) { - case Type::T_LIST: - foreach ($arg[2] as $k => $v) { - $arg[2][$k] = $this->stringifyFncallArgs($v); - } - break; - case Type::T_EXPRESSION: - if ($arg[1] === '/') { - $arg[2] = $this->stringifyFncallArgs($arg[2]); - $arg[3] = $this->stringifyFncallArgs($arg[3]); - $arg[5] = $arg[6] = \false; - // no space around / - $arg = $this->expToString($arg); - } - break; - case Type::T_FUNCTION_CALL: - $name = \strtolower($arg[1]); - if (\in_array($name, ['max', 'min', 'calc'])) { - $args = $arg[2]; - $arg = $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $args); - } - break; - } - return $arg; - } - /** - * Find a function reference - * @param string $name - * @param bool $safeCopy - * @return array - */ - protected function getFunctionReference($name, $safeCopy = \false) - { - // SCSS @function - if ($func = $this->get(static::$namespaces['function'] . $name, \false)) { - if ($safeCopy) { - $func = clone $func; - } - return [Type::T_FUNCTION_REFERENCE, 'scss', $name, $func]; - } - // native PHP functions - // try to find a native lib function - $normalizedName = $this->normalizeName($name); - if (isset($this->userFunctions[$normalizedName])) { - // see if we can find a user function - list($f, $prototype) = $this->userFunctions[$normalizedName]; - return [Type::T_FUNCTION_REFERENCE, 'user', $name, $f, $prototype]; - } - $lowercasedName = \strtolower($normalizedName); - // Special functions overriding a CSS function are case-insensitive. We normalize them as lowercase - // to avoid the deprecation warning about the wrong case being used. - if ($lowercasedName === 'min' || $lowercasedName === 'max' || $lowercasedName === 'rgb' || $lowercasedName === 'rgba' || $lowercasedName === 'hsl' || $lowercasedName === 'hsla') { - $normalizedName = $lowercasedName; - } - if (($f = $this->getBuiltinFunction($normalizedName)) && \is_callable($f)) { - /** @var string $libName */ - $libName = $f[1]; - $prototype = isset(static::${$libName}) ? static::${$libName} : null; - // All core functions have a prototype defined. Not finding the - // prototype can mean 2 things: - // - the function comes from a child class (deprecated just after) - // - the function was found with a different case, which relates to calling the - // wrong Sass function due to our camelCase usage (`fade-in()` vs `fadein()`), - // because PHP method names are case-insensitive while property names are - // case-sensitive. - if ($prototype === null || \strtolower($normalizedName) !== $normalizedName) { - $r = new \ReflectionMethod($this, $libName); - $actualLibName = $r->name; - if ($actualLibName !== $libName || \strtolower($normalizedName) !== $normalizedName) { - $kebabCaseName = \preg_replace('~(?<=\\w)([A-Z])~', '-$1', \substr($actualLibName, 3)); - \assert($kebabCaseName !== null); - $originalName = \strtolower($kebabCaseName); - $warning = "Calling built-in functions with a non-standard name is deprecated since Scssphp 1.8.0 and will not work anymore in 2.0 (they will be treated as CSS function calls instead).\nUse \"{$originalName}\" instead of \"{$name}\"."; - @\trigger_error($warning, \E_USER_DEPRECATED); - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - Warn::deprecation("{$warning}\n on line {$line} of {$fname}"); - // Use the actual function definition - $prototype = isset(static::${$actualLibName}) ? static::${$actualLibName} : null; - $f[1] = $libName = $actualLibName; - } - } - if (\get_class($this) !== __CLASS__ && !isset($this->warnedChildFunctions[$libName])) { - $r = new \ReflectionMethod($this, $libName); - $declaringClass = $r->getDeclaringClass()->name; - $needsWarning = $this->warnedChildFunctions[$libName] = $declaringClass !== __CLASS__; - if ($needsWarning) { - if (\method_exists(__CLASS__, $libName)) { - @\trigger_error(\sprintf('Overriding the "%s" core function by extending the Compiler is deprecated and will be unsupported in 2.0. Remove the "%s::%s" method.', $normalizedName, $declaringClass, $libName), \E_USER_DEPRECATED); - } else { - @\trigger_error(\sprintf('Registering custom functions by extending the Compiler and using the lib* discovery mechanism is deprecated and will be removed in 2.0. Replace the "%s::%s" method with registering the "%s" function through "Compiler::registerFunction".', $declaringClass, $libName, $normalizedName), \E_USER_DEPRECATED); - } - } - } - return [Type::T_FUNCTION_REFERENCE, 'native', $name, $f, $prototype]; - } - return static::$null; - } - /** - * Normalize name - * - * @param string $name - * - * @return string - */ - protected function normalizeName($name) - { - return \str_replace('-', '_', $name); - } - /** - * Normalize value - * - * @internal - * - * @param array|Number $value - * - * @return array|Number - */ - public function normalizeValue($value) - { - $value = $this->coerceForExpression($this->reduce($value)); - if ($value instanceof Number) { - return $value; - } - switch ($value[0]) { - case Type::T_LIST: - $value = $this->extractInterpolation($value); - if ($value[0] !== Type::T_LIST) { - return [Type::T_KEYWORD, $this->compileValue($value)]; - } - foreach ($value[2] as $key => $item) { - $value[2][$key] = $this->normalizeValue($item); - } - if (!empty($value['enclosing'])) { - unset($value['enclosing']); - } - if ($value[1] === '' && \count($value[2]) > 1) { - $value[1] = ' '; - } - return $value; - case Type::T_STRING: - return [$value[0], '"', [$this->compileStringContent($value)]]; - case Type::T_INTERPOLATE: - return [Type::T_KEYWORD, $this->compileValue($value)]; - default: - return $value; - } - } - /** - * Add numbers - * - * @param Number $left - * @param Number $right - * - * @return Number - */ - protected function opAddNumberNumber(Number $left, Number $right) - { - return $left->plus($right); - } - /** - * Multiply numbers - * - * @param Number $left - * @param Number $right - * - * @return Number - */ - protected function opMulNumberNumber(Number $left, Number $right) - { - return $left->times($right); - } - /** - * Subtract numbers - * - * @param Number $left - * @param Number $right - * - * @return Number - */ - protected function opSubNumberNumber(Number $left, Number $right) - { - return $left->minus($right); - } - /** - * Divide numbers - * - * @param Number $left - * @param Number $right - * - * @return Number - */ - protected function opDivNumberNumber(Number $left, Number $right) - { - return $left->dividedBy($right); - } - /** - * Mod numbers - * - * @param Number $left - * @param Number $right - * - * @return Number - */ - protected function opModNumberNumber(Number $left, Number $right) - { - return $left->modulo($right); - } - /** - * Add strings - * - * @param array $left - * @param array $right - * - * @return array|null - */ - protected function opAdd($left, $right) - { - if ($strLeft = $this->coerceString($left)) { - if ($right[0] === Type::T_STRING) { - $right[1] = ''; - } - $strLeft[2][] = $right; - return $strLeft; - } - if ($strRight = $this->coerceString($right)) { - if ($left[0] === Type::T_STRING) { - $left[1] = ''; - } - \array_unshift($strRight[2], $left); - return $strRight; - } - return null; - } - /** - * Boolean and - * - * @param array|Number $left - * @param array|Number $right - * @param bool $shouldEval - * - * @return array|Number|null - */ - protected function opAnd($left, $right, $shouldEval) - { - $truthy = $left === static::$null || $right === static::$null || ($left === static::$false || $left === static::$true) && ($right === static::$false || $right === static::$true); - if (!$shouldEval) { - if (!$truthy) { - return null; - } - } - if ($left !== static::$false && $left !== static::$null) { - return $this->reduce($right, \true); - } - return $left; - } - /** - * Boolean or - * - * @param array|Number $left - * @param array|Number $right - * @param bool $shouldEval - * - * @return array|Number|null - */ - protected function opOr($left, $right, $shouldEval) - { - $truthy = $left === static::$null || $right === static::$null || ($left === static::$false || $left === static::$true) && ($right === static::$false || $right === static::$true); - if (!$shouldEval) { - if (!$truthy) { - return null; - } - } - if ($left !== static::$false && $left !== static::$null) { - return $left; - } - return $this->reduce($right, \true); - } - /** - * Compare colors - * - * @param string $op - * @param array $left - * @param array $right - * - * @return array - */ - protected function opColorColor($op, $left, $right) - { - if ($op !== '==' && $op !== '!=') { - $warning = "Color arithmetic is deprecated and will be an error in future versions.\n" . "Consider using Sass's color functions instead."; - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - Warn::deprecation("{$warning}\n on line {$line} of {$fname}"); - } - $out = [Type::T_COLOR]; - foreach ([1, 2, 3] as $i) { - $lval = isset($left[$i]) ? $left[$i] : 0; - $rval = isset($right[$i]) ? $right[$i] : 0; - switch ($op) { - case '+': - $out[] = $lval + $rval; - break; - case '-': - $out[] = $lval - $rval; - break; - case '*': - $out[] = $lval * $rval; - break; - case '%': - if ($rval == 0) { - throw $this->error("color: Can't take modulo by zero"); - } - $out[] = $lval % $rval; - break; - case '/': - if ($rval == 0) { - throw $this->error("color: Can't divide by zero"); - } - $out[] = (int) ($lval / $rval); - break; - case '==': - return $this->opEq($left, $right); - case '!=': - return $this->opNeq($left, $right); - default: - throw $this->error("color: unknown op {$op}"); - } - } - if (isset($left[4])) { - $out[4] = $left[4]; - } elseif (isset($right[4])) { - $out[4] = $right[4]; - } - return $this->fixColor($out); - } - /** - * Compare color and number - * - * @param string $op - * @param array $left - * @param Number $right - * - * @return array - */ - protected function opColorNumber($op, $left, Number $right) - { - if ($op === '==') { - return static::$false; - } - if ($op === '!=') { - return static::$true; - } - $value = $right->getDimension(); - return $this->opColorColor($op, $left, [Type::T_COLOR, $value, $value, $value]); - } - /** - * Compare number and color - * - * @param string $op - * @param Number $left - * @param array $right - * - * @return array - */ - protected function opNumberColor($op, Number $left, $right) - { - if ($op === '==') { - return static::$false; - } - if ($op === '!=') { - return static::$true; - } - $value = $left->getDimension(); - return $this->opColorColor($op, [Type::T_COLOR, $value, $value, $value], $right); - } - /** - * Compare number1 == number2 - * - * @param array|Number $left - * @param array|Number $right - * - * @return array - */ - protected function opEq($left, $right) - { - if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) { - $lStr[1] = ''; - $rStr[1] = ''; - $left = $this->compileValue($lStr); - $right = $this->compileValue($rStr); - } - return $this->toBool($left === $right); - } - /** - * Compare number1 != number2 - * - * @param array|Number $left - * @param array|Number $right - * - * @return array - */ - protected function opNeq($left, $right) - { - if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) { - $lStr[1] = ''; - $rStr[1] = ''; - $left = $this->compileValue($lStr); - $right = $this->compileValue($rStr); - } - return $this->toBool($left !== $right); - } - /** - * Compare number1 == number2 - * - * @param Number $left - * @param Number $right - * - * @return array - */ - protected function opEqNumberNumber(Number $left, Number $right) - { - return $this->toBool($left->equals($right)); - } - /** - * Compare number1 != number2 - * - * @param Number $left - * @param Number $right - * - * @return array - */ - protected function opNeqNumberNumber(Number $left, Number $right) - { - return $this->toBool(!$left->equals($right)); - } - /** - * Compare number1 >= number2 - * - * @param Number $left - * @param Number $right - * - * @return array - */ - protected function opGteNumberNumber(Number $left, Number $right) - { - return $this->toBool($left->greaterThanOrEqual($right)); - } - /** - * Compare number1 > number2 - * - * @param Number $left - * @param Number $right - * - * @return array - */ - protected function opGtNumberNumber(Number $left, Number $right) - { - return $this->toBool($left->greaterThan($right)); - } - /** - * Compare number1 <= number2 - * - * @param Number $left - * @param Number $right - * - * @return array - */ - protected function opLteNumberNumber(Number $left, Number $right) - { - return $this->toBool($left->lessThanOrEqual($right)); - } - /** - * Compare number1 < number2 - * - * @param Number $left - * @param Number $right - * - * @return array - */ - protected function opLtNumberNumber(Number $left, Number $right) - { - return $this->toBool($left->lessThan($right)); - } - /** - * Cast to boolean - * - * @api - * - * @param bool $thing - * - * @return array - */ - public function toBool($thing) - { - return $thing ? static::$true : static::$false; - } - /** - * Escape non printable chars in strings output as in dart-sass - * - * @internal - * - * @param string $string - * @param bool $inKeyword - * - * @return string - */ - public function escapeNonPrintableChars($string, $inKeyword = \false) - { - static $replacement = []; - if (empty($replacement[$inKeyword])) { - for ($i = 0; $i < 32; $i++) { - if ($i !== 9 || $inKeyword) { - $replacement[$inKeyword][\chr($i)] = '\\' . \dechex($i) . ($inKeyword ? ' ' : \chr(0)); - } - } - } - $string = \str_replace(\array_keys($replacement[$inKeyword]), \array_values($replacement[$inKeyword]), $string); - // chr(0) is not a possible char from the input, so any chr(0) comes from our escaping replacement - if (\strpos($string, \chr(0)) !== \false) { - if (\substr($string, -1) === \chr(0)) { - $string = \substr($string, 0, -1); - } - $string = \str_replace([\chr(0) . '\\', \chr(0) . ' '], ['\\', ' '], $string); - if (\strpos($string, \chr(0)) !== \false) { - $parts = \explode(\chr(0), $string); - $string = \array_shift($parts); - while (\count($parts)) { - $next = \array_shift($parts); - if (\strpos("0123456789abcdefABCDEF" . \chr(9), $next[0]) !== \false) { - $string .= " "; - } - $string .= $next; - } - } - } - return $string; - } - /** - * Compiles a primitive value into a CSS property value. - * - * Values in scssphp are typed by being wrapped in arrays, their format is - * typically: - * - * array(type, contents [, additional_contents]*) - * - * The input is expected to be reduced. This function will not work on - * things like expressions and variables. - * - * @api - * - * @param array|Number $value - * @param bool $quote - * - * @return string - */ - public function compileValue($value, $quote = \true) - { - $value = $this->reduce($value); - if ($value instanceof Number) { - return $value->output($this); - } - switch ($value[0]) { - case Type::T_KEYWORD: - return $this->escapeNonPrintableChars($value[1], \true); - case Type::T_COLOR: - // [1] - red component (either number for a %) - // [2] - green component - // [3] - blue component - // [4] - optional alpha component - list(, $r, $g, $b) = $value; - $r = $this->compileRGBAValue($r); - $g = $this->compileRGBAValue($g); - $b = $this->compileRGBAValue($b); - if (\count($value) === 5) { - $alpha = $this->compileRGBAValue($value[4], \true); - if (!\is_numeric($alpha) || $alpha < 1) { - $colorName = Colors::RGBaToColorName($r, $g, $b, $alpha); - if (!\is_null($colorName)) { - return $colorName; - } - if (\is_int($alpha) || \is_float($alpha)) { - $a = new Number($alpha, ''); - } elseif (\is_numeric($alpha)) { - $a = new Number((float) $alpha, ''); - } else { - $a = $alpha; - } - return 'rgba(' . $r . ', ' . $g . ', ' . $b . ', ' . $a . ')'; - } - } - if (!\is_numeric($r) || !\is_numeric($g) || !\is_numeric($b)) { - return 'rgb(' . $r . ', ' . $g . ', ' . $b . ')'; - } - $colorName = Colors::RGBaToColorName($r, $g, $b); - if (!\is_null($colorName)) { - return $colorName; - } - $h = \sprintf('#%02x%02x%02x', $r, $g, $b); - // Converting hex color to short notation (e.g. #003399 to #039) - if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { - $h = '#' . $h[1] . $h[3] . $h[5]; - } - return $h; - case Type::T_STRING: - $content = $this->compileStringContent($value, $quote); - if ($value[1] && $quote) { - $content = \str_replace('\\', '\\\\', $content); - $content = $this->escapeNonPrintableChars($content); - // force double quote as string quote for the output in certain cases - if ($value[1] === "'" && (\strpos($content, '"') === \false or \strpos($content, "'") !== \false)) { - $value[1] = '"'; - } elseif ($value[1] === '"' && (\strpos($content, '"') !== \false and \strpos($content, "'") === \false)) { - $value[1] = "'"; - } - $content = \str_replace($value[1], '\\' . $value[1], $content); - } - return $value[1] . $content . $value[1]; - case Type::T_FUNCTION: - $args = !empty($value[2]) ? $this->compileValue($value[2], $quote) : ''; - return "{$value[1]}({$args})"; - case Type::T_FUNCTION_REFERENCE: - $name = !empty($value[2]) ? $value[2] : ''; - return "get-function(\"{$name}\")"; - case Type::T_LIST: - $value = $this->extractInterpolation($value); - if ($value[0] !== Type::T_LIST) { - return $this->compileValue($value, $quote); - } - list(, $delim, $items) = $value; - $pre = $post = ''; - if (!empty($value['enclosing'])) { - switch ($value['enclosing']) { - case 'parent': - //$pre = '('; - //$post = ')'; - break; - case 'forced_parent': - $pre = '('; - $post = ')'; - break; - case 'bracket': - case 'forced_bracket': - $pre = '['; - $post = ']'; - break; - } - } - $separator = $delim === '/' ? ' /' : $delim; - $prefix_value = ''; - if ($delim !== ' ') { - $prefix_value = ' '; - } - $filtered = []; - $same_string_quote = null; - foreach ($items as $item) { - if (\is_null($same_string_quote)) { - $same_string_quote = \false; - if ($item[0] === Type::T_STRING) { - $same_string_quote = $item[1]; - foreach ($items as $ii) { - if ($ii[0] !== Type::T_STRING) { - $same_string_quote = \false; - break; - } - } - } - } - if ($item[0] === Type::T_NULL) { - continue; - } - if ($same_string_quote === '"' && $item[0] === Type::T_STRING && $item[1]) { - $item[1] = $same_string_quote; - } - $compiled = $this->compileValue($item, $quote); - if ($prefix_value && \strlen($compiled)) { - $compiled = $prefix_value . $compiled; - } - $filtered[] = $compiled; - } - return $pre . \substr(\implode($separator, $filtered), \strlen($prefix_value)) . $post; - case Type::T_MAP: - $keys = $value[1]; - $values = $value[2]; - $filtered = []; - for ($i = 0, $s = \count($keys); $i < $s; $i++) { - $filtered[$this->compileValue($keys[$i], $quote)] = $this->compileValue($values[$i], $quote); - } - \array_walk($filtered, function (&$value, $key) { - $value = $key . ': ' . $value; - }); - return '(' . \implode(', ', $filtered) . ')'; - case Type::T_INTERPOLATED: - // node created by extractInterpolation - list(, $interpolate, $left, $right) = $value; - list(, , $whiteLeft, $whiteRight) = $interpolate; - $delim = $left[1]; - if ($delim && $delim !== ' ' && !$whiteLeft) { - $delim .= ' '; - } - $left = \count($left[2]) > 0 ? $this->compileValue($left, $quote) . $delim . $whiteLeft : ''; - $delim = $right[1]; - if ($delim && $delim !== ' ') { - $delim .= ' '; - } - $right = \count($right[2]) > 0 ? $whiteRight . $delim . $this->compileValue($right, $quote) : ''; - return $left . $this->compileValue($interpolate, $quote) . $right; - case Type::T_INTERPOLATE: - // strip quotes if it's a string - $reduced = $this->reduce($value[1]); - if ($reduced instanceof Number) { - return $this->compileValue($reduced, $quote); - } - switch ($reduced[0]) { - case Type::T_LIST: - $reduced = $this->extractInterpolation($reduced); - if ($reduced[0] !== Type::T_LIST) { - break; - } - list(, $delim, $items) = $reduced; - if ($delim !== ' ') { - $delim .= ' '; - } - $filtered = []; - foreach ($items as $item) { - if ($item[0] === Type::T_NULL) { - continue; - } - if ($item[0] === Type::T_STRING) { - $filtered[] = $this->compileStringContent($item, $quote); - } elseif ($item[0] === Type::T_KEYWORD) { - $filtered[] = $item[1]; - } else { - $filtered[] = $this->compileValue($item, $quote); - } - } - $reduced = [Type::T_KEYWORD, \implode("{$delim}", $filtered)]; - break; - case Type::T_STRING: - $reduced = [Type::T_STRING, '', [$this->compileStringContent($reduced)]]; - break; - case Type::T_NULL: - $reduced = [Type::T_KEYWORD, '']; - } - return $this->compileValue($reduced, $quote); - case Type::T_NULL: - return 'null'; - case Type::T_COMMENT: - return $this->compileCommentValue($value); - default: - throw $this->error('unknown value type: ' . \json_encode($value)); - } - } - /** - * @param array|Number $value - * - * @return string - */ - protected function compileDebugValue($value) - { - $value = $this->reduce($value, \true); - if ($value instanceof Number) { - return $this->compileValue($value); - } - switch ($value[0]) { - case Type::T_STRING: - return $this->compileStringContent($value); - default: - return $this->compileValue($value); - } - } - /** - * Flatten list - * - * @param array $list - * - * @return string - * - * @deprecated - */ - protected function flattenList($list) - { - @\trigger_error(\sprintf('The "%s" method is deprecated.', __METHOD__), \E_USER_DEPRECATED); - return $this->compileValue($list); - } - /** - * Gets the text of a Sass string - * - * Calling this method on anything else than a SassString is unsupported. Use {@see assertString} first - * to ensure that the value is indeed a string. - * - * @param array $value - * - * @return string - */ - public function getStringText(array $value) - { - if ($value[0] !== Type::T_STRING) { - throw new \InvalidArgumentException('The argument is not a sass string. Did you forgot to use "assertString"?'); - } - return $this->compileStringContent($value); - } - /** - * Compile string content - * - * @param array $string - * @param bool $quote - * - * @return string - */ - protected function compileStringContent($string, $quote = \true) - { - $parts = []; - foreach ($string[2] as $part) { - if (\is_array($part) || $part instanceof Number) { - $parts[] = $this->compileValue($part, $quote); - } else { - $parts[] = $part; - } - } - return \implode($parts); - } - /** - * Extract interpolation; it doesn't need to be recursive, compileValue will handle that - * - * @param array $list - * - * @return array - */ - protected function extractInterpolation($list) - { - $items = $list[2]; - foreach ($items as $i => $item) { - if ($item[0] === Type::T_INTERPOLATE) { - $before = [Type::T_LIST, $list[1], \array_slice($items, 0, $i)]; - $after = [Type::T_LIST, $list[1], \array_slice($items, $i + 1)]; - return [Type::T_INTERPOLATED, $item, $before, $after]; - } - } - return $list; - } - /** - * Find the final set of selectors - * - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * @param \ScssPhp\ScssPhp\Block $selfParent - * - * @return array - */ - protected function multiplySelectors(Environment $env, $selfParent = null) - { - $envs = $this->compactEnv($env); - $selectors = []; - $parentSelectors = [[]]; - $selfParentSelectors = null; - if (!\is_null($selfParent) && $selfParent->selectors) { - $selfParentSelectors = $this->evalSelectors($selfParent->selectors); - } - while ($env = \array_pop($envs)) { - if (empty($env->selectors)) { - continue; - } - $selectors = $env->selectors; - do { - $stillHasSelf = \false; - $prevSelectors = $selectors; - $selectors = []; - foreach ($parentSelectors as $parent) { - foreach ($prevSelectors as $selector) { - if ($selfParentSelectors) { - foreach ($selfParentSelectors as $selfParent) { - // if no '&' in the selector, each call will give same result, only add once - $s = $this->joinSelectors($parent, $selector, $stillHasSelf, $selfParent); - $selectors[\serialize($s)] = $s; - } - } else { - $s = $this->joinSelectors($parent, $selector, $stillHasSelf); - $selectors[\serialize($s)] = $s; - } - } - } - } while ($stillHasSelf); - $parentSelectors = $selectors; - } - $selectors = \array_values($selectors); - // case we are just starting a at-root : nothing to multiply but parentSelectors - if (!$selectors && $selfParentSelectors) { - $selectors = $selfParentSelectors; - } - return $selectors; - } - /** - * Join selectors; looks for & to replace, or append parent before child - * - * @param array $parent - * @param array $child - * @param bool $stillHasSelf - * @param array $selfParentSelectors - * @return array - */ - protected function joinSelectors($parent, $child, &$stillHasSelf, $selfParentSelectors = null) - { - $setSelf = \false; - $out = []; - foreach ($child as $part) { - $newPart = []; - foreach ($part as $p) { - // only replace & once and should be recalled to be able to make combinations - if ($p === static::$selfSelector && $setSelf) { - $stillHasSelf = \true; - } - if ($p === static::$selfSelector && !$setSelf) { - $setSelf = \true; - if (\is_null($selfParentSelectors)) { - $selfParentSelectors = $parent; - } - foreach ($selfParentSelectors as $i => $parentPart) { - if ($i > 0) { - $out[] = $newPart; - $newPart = []; - } - foreach ($parentPart as $pp) { - if (\is_array($pp)) { - $flatten = []; - \array_walk_recursive($pp, function ($a) use(&$flatten) { - $flatten[] = $a; - }); - $pp = \implode($flatten); - } - $newPart[] = $pp; - } - } - } else { - $newPart[] = $p; - } - } - $out[] = $newPart; - } - return $setSelf ? $out : \array_merge($parent, $child); - } - /** - * Multiply media - * - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * @param array $childQueries - * - * @return array - */ - protected function multiplyMedia(Environment $env = null, $childQueries = null) - { - if (!isset($env) || !empty($env->block->type) && $env->block->type !== Type::T_MEDIA) { - return $childQueries; - } - // plain old block, skip - if (empty($env->block->type)) { - return $this->multiplyMedia($env->parent, $childQueries); - } - \assert($env->block instanceof MediaBlock); - $parentQueries = isset($env->block->queryList) ? $env->block->queryList : [[[Type::T_MEDIA_VALUE, $env->block->value]]]; - $store = [$this->env, $this->storeEnv]; - $this->env = $env; - $this->storeEnv = null; - $parentQueries = $this->evaluateMediaQuery($parentQueries); - list($this->env, $this->storeEnv) = $store; - if (\is_null($childQueries)) { - $childQueries = $parentQueries; - } else { - $originalQueries = $childQueries; - $childQueries = []; - foreach ($parentQueries as $parentQuery) { - foreach ($originalQueries as $childQuery) { - $childQueries[] = \array_merge($parentQuery, [[Type::T_MEDIA_TYPE, [Type::T_KEYWORD, 'all']]], $childQuery); - } - } - } - return $this->multiplyMedia($env->parent, $childQueries); - } - /** - * Convert env linked list to stack - * - * @param Environment $env - * - * @return Environment[] - * - * @phpstan-return non-empty-array - */ - protected function compactEnv(Environment $env) - { - for ($envs = []; $env; $env = $env->parent) { - $envs[] = $env; - } - return $envs; - } - /** - * Convert env stack to singly linked list - * - * @param Environment[] $envs - * - * @return Environment - * - * @phpstan-param non-empty-array $envs - */ - protected function extractEnv($envs) - { - for ($env = null; $e = \array_pop($envs);) { - $e->parent = $env; - $env = $e; - } - return $env; - } - /** - * Push environment - * - * @param \ScssPhp\ScssPhp\Block $block - * - * @return \ScssPhp\ScssPhp\Compiler\Environment - */ - protected function pushEnv(Block $block = null) - { - $env = new Environment(); - $env->parent = $this->env; - $env->parentStore = $this->storeEnv; - $env->store = []; - $env->block = $block; - $env->depth = isset($this->env->depth) ? $this->env->depth + 1 : 0; - $this->env = $env; - $this->storeEnv = null; - return $env; - } - /** - * Pop environment - * - * @return void - */ - protected function popEnv() - { - $this->storeEnv = $this->env->parentStore; - $this->env = $this->env->parent; - } - /** - * Propagate vars from a just poped Env (used in @each and @for) - * - * @param array $store - * @param null|string[] $excludedVars - * - * @return void - */ - protected function backPropagateEnv($store, $excludedVars = null) - { - foreach ($store as $key => $value) { - if (empty($excludedVars) || !\in_array($key, $excludedVars)) { - $this->set($key, $value, \true); - } - } - } - /** - * Get store environment - * - * @return \ScssPhp\ScssPhp\Compiler\Environment - */ - protected function getStoreEnv() - { - return isset($this->storeEnv) ? $this->storeEnv : $this->env; - } - /** - * Set variable - * - * @param string $name - * @param mixed $value - * @param bool $shadow - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * @param mixed $valueUnreduced - * - * @return void - */ - protected function set($name, $value, $shadow = \false, Environment $env = null, $valueUnreduced = null) - { - $name = $this->normalizeName($name); - if (!isset($env)) { - $env = $this->getStoreEnv(); - } - if ($shadow) { - $this->setRaw($name, $value, $env, $valueUnreduced); - } else { - $this->setExisting($name, $value, $env, $valueUnreduced); - } - } - /** - * Set existing variable - * - * @param string $name - * @param mixed $value - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * @param mixed $valueUnreduced - * - * @return void - */ - protected function setExisting($name, $value, Environment $env, $valueUnreduced = null) - { - $storeEnv = $env; - $specialContentKey = static::$namespaces['special'] . 'content'; - $hasNamespace = $name[0] === '^' || $name[0] === '@' || $name[0] === '%'; - $maxDepth = 10000; - for (;;) { - if ($maxDepth-- <= 0) { - break; - } - if (\array_key_exists($name, $env->store)) { - break; - } - if (!$hasNamespace && isset($env->marker)) { - if (!empty($env->store[$specialContentKey])) { - $env = $env->store[$specialContentKey]->scope; - continue; - } - if (!empty($env->declarationScopeParent)) { - $env = $env->declarationScopeParent; - continue; - } else { - $env = $storeEnv; - break; - } - } - if (isset($env->parentStore)) { - $env = $env->parentStore; - } elseif (isset($env->parent)) { - $env = $env->parent; - } else { - $env = $storeEnv; - break; - } - } - $env->store[$name] = $value; - if ($valueUnreduced) { - $env->storeUnreduced[$name] = $valueUnreduced; - } - } - /** - * Set raw variable - * - * @param string $name - * @param mixed $value - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * @param mixed $valueUnreduced - * - * @return void - */ - protected function setRaw($name, $value, Environment $env, $valueUnreduced = null) - { - $env->store[$name] = $value; - if ($valueUnreduced) { - $env->storeUnreduced[$name] = $valueUnreduced; - } - } - /** - * Get variable - * - * @internal - * - * @param string $name - * @param bool $shouldThrow - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * @param bool $unreduced - * - * @return mixed|null - */ - public function get($name, $shouldThrow = \true, Environment $env = null, $unreduced = \false) - { - $normalizedName = $this->normalizeName($name); - $specialContentKey = static::$namespaces['special'] . 'content'; - if (!isset($env)) { - $env = $this->getStoreEnv(); - } - $hasNamespace = $normalizedName[0] === '^' || $normalizedName[0] === '@' || $normalizedName[0] === '%'; - $maxDepth = 10000; - for (;;) { - if ($maxDepth-- <= 0) { - break; - } - if (\array_key_exists($normalizedName, $env->store)) { - if ($unreduced && isset($env->storeUnreduced[$normalizedName])) { - return $env->storeUnreduced[$normalizedName]; - } - return $env->store[$normalizedName]; - } - if (!$hasNamespace && isset($env->marker)) { - if (!empty($env->store[$specialContentKey])) { - $env = $env->store[$specialContentKey]->scope; - continue; - } - if (!empty($env->declarationScopeParent)) { - $env = $env->declarationScopeParent; - } else { - $env = $this->rootEnv; - } - continue; - } - if (isset($env->parentStore)) { - $env = $env->parentStore; - } elseif (isset($env->parent)) { - $env = $env->parent; - } else { - break; - } - } - if ($shouldThrow) { - throw $this->error("Undefined variable \${$name}" . ($maxDepth <= 0 ? ' (infinite recursion)' : '')); - } - // found nothing - return null; - } - /** - * Has variable? - * - * @param string $name - * @param \ScssPhp\ScssPhp\Compiler\Environment $env - * - * @return bool - */ - protected function has($name, Environment $env = null) - { - return !\is_null($this->get($name, \false, $env)); - } - /** - * Inject variables - * - * @param array $args - * - * @return void - */ - protected function injectVariables(array $args) - { - if (empty($args)) { - return; - } - $parser = $this->parserFactory(__METHOD__); - foreach ($args as $name => $strValue) { - if ($name[0] === '$') { - $name = \substr($name, 1); - } - if (!\is_string($strValue) || !$parser->parseValue($strValue, $value)) { - $value = $this->coerceValue($strValue); - } - $this->set($name, $value); - } - } - /** - * Replaces variables. - * - * @param array $variables - * - * @return void - */ - public function replaceVariables(array $variables) - { - $this->registeredVars = []; - $this->addVariables($variables); - } - /** - * Replaces variables. - * - * @param array $variables - * - * @return void - */ - public function addVariables(array $variables) - { - $triggerWarning = \false; - foreach ($variables as $name => $value) { - if (!$value instanceof Number && !\is_array($value)) { - $triggerWarning = \true; - } - $this->registeredVars[$name] = $value; - } - if ($triggerWarning) { - @\trigger_error('Passing raw values to as custom variables to the Compiler is deprecated. Use "\\ScssPhp\\ScssPhp\\ValueConverter::parseValue" or "\\ScssPhp\\ScssPhp\\ValueConverter::fromPhp" to convert them instead.', \E_USER_DEPRECATED); - } - } - /** - * Set variables - * - * @api - * - * @param array $variables - * - * @return void - * - * @deprecated Use "addVariables" or "replaceVariables" instead. - */ - public function setVariables(array $variables) - { - @\trigger_error('The method "setVariables" of the Compiler is deprecated. Use the "addVariables" method for the equivalent behavior or "replaceVariables" if merging with previous variables was not desired.'); - $this->addVariables($variables); - } - /** - * Unset variable - * - * @api - * - * @param string $name - * - * @return void - */ - public function unsetVariable($name) - { - unset($this->registeredVars[$name]); - } - /** - * Returns list of variables - * - * @api - * - * @return array - */ - public function getVariables() - { - return $this->registeredVars; - } - /** - * Adds to list of parsed files - * - * @internal - * - * @param string|null $path - * - * @return void - */ - public function addParsedFile($path) - { - if (!\is_null($path) && \is_file($path)) { - $this->parsedFiles[\realpath($path)] = \filemtime($path); - } - } - /** - * Returns list of parsed files - * - * @deprecated - * @return array - */ - public function getParsedFiles() - { - @\trigger_error('The method "getParsedFiles" of the Compiler is deprecated. Use the "getIncludedFiles" method on the CompilationResult instance returned by compileString() instead. Be careful that the signature of the method is different.', \E_USER_DEPRECATED); - return $this->parsedFiles; - } - /** - * Add import path - * - * @api - * - * @param string|callable $path - * - * @return void - */ - public function addImportPath($path) - { - if (!\in_array($path, $this->importPaths)) { - $this->importPaths[] = $path; - } - } - /** - * Set import paths - * - * @api - * - * @param string|array $path - * - * @return void - */ - public function setImportPaths($path) - { - $paths = (array) $path; - $actualImportPaths = \array_filter($paths, function ($path) { - return $path !== ''; - }); - $this->legacyCwdImportPath = \count($actualImportPaths) !== \count($paths); - if ($this->legacyCwdImportPath) { - @\trigger_error('Passing an empty string in the import paths to refer to the current working directory is deprecated. If that\'s the intended behavior, the value of "getcwd()" should be used directly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.', \E_USER_DEPRECATED); - } - $this->importPaths = $actualImportPaths; - } - /** - * Set number precision - * - * @api - * - * @param int $numberPrecision - * - * @return void - * - * @deprecated The number precision is not configurable anymore. The default is enough for all browsers. - */ - public function setNumberPrecision($numberPrecision) - { - @\trigger_error('The number precision is not configurable anymore. ' . 'The default is enough for all browsers.', \E_USER_DEPRECATED); - } - /** - * Sets the output style. - * - * @api - * - * @param string $style One of the OutputStyle constants - * - * @return void - * - * @phpstan-param OutputStyle::* $style - */ - public function setOutputStyle($style) - { - switch ($style) { - case OutputStyle::EXPANDED: - $this->configuredFormatter = Expanded::class; - break; - case OutputStyle::COMPRESSED: - $this->configuredFormatter = Compressed::class; - break; - default: - throw new \InvalidArgumentException(\sprintf('Invalid output style "%s".', $style)); - } - } - /** - * Set formatter - * - * @api - * - * @param string $formatterName - * - * @return void - * - * @deprecated Use {@see setOutputStyle} instead. - * - * @phpstan-param class-string $formatterName - */ - public function setFormatter($formatterName) - { - if (!\in_array($formatterName, [Expanded::class, Compressed::class], \true)) { - @\trigger_error('Formatters other than Expanded and Compressed are deprecated.', \E_USER_DEPRECATED); - } - @\trigger_error('The method "setFormatter" is deprecated. Use "setOutputStyle" instead.', \E_USER_DEPRECATED); - $this->configuredFormatter = $formatterName; - } - /** - * Set line number style - * - * @api - * - * @param string $lineNumberStyle - * - * @return void - * - * @deprecated The line number output is not supported anymore. Use source maps instead. - */ - public function setLineNumberStyle($lineNumberStyle) - { - @\trigger_error('The line number output is not supported anymore. ' . 'Use source maps instead.', \E_USER_DEPRECATED); - } - /** - * Configures the handling of non-ASCII outputs. - * - * If $charset is `true`, this will include a `@charset` declaration or a - * UTF-8 [byte-order mark][] if the stylesheet contains any non-ASCII - * characters. Otherwise, it will never include a `@charset` declaration or a - * byte-order mark. - * - * [byte-order mark]: https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 - * - * @param bool $charset - * - * @return void - */ - public function setCharset($charset) - { - $this->charset = $charset; - } - /** - * Enable/disable source maps - * - * @api - * - * @param int $sourceMap - * - * @return void - * - * @phpstan-param self::SOURCE_MAP_* $sourceMap - */ - public function setSourceMap($sourceMap) - { - $this->sourceMap = $sourceMap; - } - /** - * Set source map options - * - * @api - * - * @param array $sourceMapOptions - * - * @phpstan-param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $sourceMapOptions - * - * @return void - */ - public function setSourceMapOptions($sourceMapOptions) - { - $this->sourceMapOptions = $sourceMapOptions; - } - /** - * Register function - * - * @api - * - * @param string $name - * @param callable $callback - * @param string[]|null $argumentDeclaration - * - * @return void - */ - public function registerFunction($name, $callback, $argumentDeclaration = null) - { - if (self::isNativeFunction($name)) { - @\trigger_error(\sprintf('The "%s" function is a core sass function. Overriding it with a custom implementation through "%s" is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', $name, __METHOD__), \E_USER_DEPRECATED); - } - if ($argumentDeclaration === null) { - @\trigger_error('Omitting the argument declaration when registering custom function is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', \E_USER_DEPRECATED); - } - $this->userFunctions[$this->normalizeName($name)] = [$callback, $argumentDeclaration]; - } - /** - * Unregister function - * - * @api - * - * @param string $name - * - * @return void - */ - public function unregisterFunction($name) - { - unset($this->userFunctions[$this->normalizeName($name)]); - } - /** - * Add feature - * - * @api - * - * @param string $name - * - * @return void - * - * @deprecated Registering additional features is deprecated. - */ - public function addFeature($name) - { - @\trigger_error('Registering additional features is deprecated.', \E_USER_DEPRECATED); - $this->registeredFeatures[$name] = \true; - } - /** - * Import file - * - * @param string $path - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out - * - * @return void - */ - protected function importFile($path, OutputBlock $out) - { - $this->pushCallStack('import ' . $this->getPrettyPath($path)); - // see if tree is cached - $realPath = \realpath($path); - if ($realPath === \false) { - $realPath = $path; - } - if (\substr($path, -5) === '.sass') { - $this->sourceIndex = \count($this->sourceNames); - $this->sourceNames[] = $path; - $this->sourceLine = 1; - $this->sourceColumn = 1; - throw $this->error('The Sass indented syntax is not implemented.'); - } - if (isset($this->importCache[$realPath])) { - $this->handleImportLoop($realPath); - $tree = $this->importCache[$realPath]; - } else { - $code = \file_get_contents($path); - $parser = $this->parserFactory($path); - $tree = $parser->parse($code); - $this->importCache[$realPath] = $tree; - } - $currentDirectory = $this->currentDirectory; - $this->currentDirectory = \dirname($path); - $this->compileChildrenNoReturn($tree->children, $out); - $this->currentDirectory = $currentDirectory; - $this->popCallStack(); - } - /** - * Save the imported files with their resolving path context - * - * @param string|null $currentDirectory - * @param string $path - * @param string $filePath - * - * @return void - */ - private function registerImport($currentDirectory, $path, $filePath) - { - $this->resolvedImports[] = ['currentDir' => $currentDirectory, 'path' => $path, 'filePath' => $filePath]; - } - /** - * Detects whether the import is a CSS import. - * - * For legacy reasons, custom importers are called for those, allowing them - * to replace them with an actual Sass import. However this behavior is - * deprecated. Custom importers are expected to return null when they receive - * a CSS import. - * - * @param string $url - * - * @return bool - */ - public static function isCssImport($url) - { - return 1 === \preg_match('~\\.css$|^https?://|^//~', $url); - } - /** - * Return the file path for an import url if it exists - * - * @internal - * - * @param string $url - * @param string|null $currentDir - * - * @return string|null - */ - public function findImport($url, $currentDir = null) - { - // Vanilla css and external requests. These are not meant to be Sass imports. - // Callback importers are still called for BC. - if (self::isCssImport($url)) { - foreach ($this->importPaths as $dir) { - if (\is_string($dir)) { - continue; - } - if (\is_callable($dir)) { - // check custom callback for import path - $file = \call_user_func($dir, $url); - if (!\is_null($file)) { - if (\is_array($dir)) { - $callableDescription = (\is_object($dir[0]) ? \get_class($dir[0]) : $dir[0]) . '::' . $dir[1]; - } elseif ($dir instanceof \Closure) { - $r = new \ReflectionFunction($dir); - if (\false !== \strpos($r->name, '{closure}')) { - $callableDescription = \sprintf('closure{%s:%s}', $r->getFileName(), $r->getStartLine()); - } elseif ($class = $r->getClosureScopeClass()) { - $callableDescription = $class->name . '::' . $r->name; - } else { - $callableDescription = $r->name; - } - } elseif (\is_object($dir)) { - $callableDescription = \get_class($dir) . '::__invoke'; - } else { - $callableDescription = 'callable'; - // Fallback if we don't have a dedicated description - } - @\trigger_error(\sprintf('Returning a file to import for CSS or external references in custom importer callables is deprecated and will not be supported anymore in ScssPhp 2.0. This behavior is not compliant with the Sass specification. Update your "%s" importer.', $callableDescription), \E_USER_DEPRECATED); - return $file; - } - } - } - return null; - } - if (!\is_null($currentDir)) { - $relativePath = $this->resolveImportPath($url, $currentDir); - if (!\is_null($relativePath)) { - return $relativePath; - } - } - foreach ($this->importPaths as $dir) { - if (\is_string($dir)) { - $path = $this->resolveImportPath($url, $dir); - if (!\is_null($path)) { - return $path; - } - } elseif (\is_callable($dir)) { - // check custom callback for import path - $file = \call_user_func($dir, $url); - if (!\is_null($file)) { - return $file; - } - } - } - if ($this->legacyCwdImportPath) { - $path = $this->resolveImportPath($url, \getcwd()); - if (!\is_null($path)) { - @\trigger_error('Resolving imports relatively to the current working directory is deprecated. If that\'s the intended behavior, the value of "getcwd()" should be added as an import path explicitly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.', \E_USER_DEPRECATED); - return $path; - } - } - throw $this->error("`{$url}` file not found for @import"); - } - /** - * @param string $url - * @param string $baseDir - * - * @return string|null - */ - private function resolveImportPath($url, $baseDir) - { - $path = Path::join($baseDir, $url); - $hasExtension = \preg_match('/.s[ac]ss$/', $url); - if ($hasExtension) { - return $this->checkImportPathConflicts($this->tryImportPath($path)); - } - $result = $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path)); - if (!\is_null($result)) { - return $result; - } - return $this->tryImportPathAsDirectory($path); - } - /** - * @param string[] $paths - * - * @return string|null - */ - private function checkImportPathConflicts(array $paths) - { - if (\count($paths) === 0) { - return null; - } - if (\count($paths) === 1) { - return $paths[0]; - } - $formattedPrettyPaths = []; - foreach ($paths as $path) { - $formattedPrettyPaths[] = ' ' . $this->getPrettyPath($path); - } - throw $this->error("It's not clear which file to import. Found:\n" . \implode("\n", $formattedPrettyPaths)); - } - /** - * @param string $path - * - * @return string[] - */ - private function tryImportPathWithExtensions($path) - { - $result = \array_merge($this->tryImportPath($path . '.sass'), $this->tryImportPath($path . '.scss')); - if ($result) { - return $result; - } - return $this->tryImportPath($path . '.css'); - } - /** - * @param string $path - * - * @return string[] - */ - private function tryImportPath($path) - { - $partial = \dirname($path) . '/_' . \basename($path); - $candidates = []; - if (\is_file($partial)) { - $candidates[] = $partial; - } - if (\is_file($path)) { - $candidates[] = $path; - } - return $candidates; - } - /** - * @param string $path - * - * @return string|null - */ - private function tryImportPathAsDirectory($path) - { - if (!\is_dir($path)) { - return null; - } - return $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path . '/index')); - } - /** - * @param string|null $path - * - * @return string - */ - private function getPrettyPath($path) - { - if ($path === null) { - return '(unknown file)'; - } - $normalizedPath = $path; - $normalizedRootDirectory = $this->rootDirectory . '/'; - if (\DIRECTORY_SEPARATOR === '\\') { - $normalizedRootDirectory = \str_replace('\\', '/', $normalizedRootDirectory); - $normalizedPath = \str_replace('\\', '/', $path); - } - if (0 === \strpos($normalizedPath, $normalizedRootDirectory)) { - return \substr($path, \strlen($normalizedRootDirectory)); - } - return $path; - } - /** - * Set encoding - * - * @api - * - * @param string|null $encoding - * - * @return void - * - * @deprecated Non-compliant support for other encodings than UTF-8 is deprecated. - */ - public function setEncoding($encoding) - { - if (!$encoding || \strtolower($encoding) === 'utf-8') { - @\trigger_error(\sprintf('The "%s" method is deprecated.', __METHOD__), \E_USER_DEPRECATED); - } else { - @\trigger_error(\sprintf('The "%s" method is deprecated. Parsing will only support UTF-8 in ScssPhp 2.0. The non-UTF-8 parsing of ScssPhp 1.x is not spec compliant.', __METHOD__), \E_USER_DEPRECATED); - } - $this->encoding = $encoding; - } - /** - * Ignore errors? - * - * @api - * - * @param bool $ignoreErrors - * - * @return \ScssPhp\ScssPhp\Compiler - * - * @deprecated Ignoring Sass errors is not longer supported. - */ - public function setIgnoreErrors($ignoreErrors) - { - @\trigger_error('Ignoring Sass errors is not longer supported.', \E_USER_DEPRECATED); - return $this; - } - /** - * Get source position - * - * @api - * - * @return array - * - * @deprecated - */ - public function getSourcePosition() - { - @\trigger_error(\sprintf('The "%s" method is deprecated.', __METHOD__), \E_USER_DEPRECATED); - $sourceFile = isset($this->sourceNames[$this->sourceIndex]) ? $this->sourceNames[$this->sourceIndex] : ''; - return [$sourceFile, $this->sourceLine, $this->sourceColumn]; - } - /** - * Throw error (exception) - * - * @api - * - * @param string $msg Message with optional sprintf()-style vararg parameters - * - * @return never - * - * @throws \ScssPhp\ScssPhp\Exception\CompilerException - * - * @deprecated use "error" and throw the exception in the caller instead. - */ - public function throwError($msg) - { - @\trigger_error('The method "throwError" is deprecated. Use "error" and throw the exception in the caller instead', \E_USER_DEPRECATED); - throw $this->error(...\func_get_args()); - } - /** - * Build an error (exception) - * - * @internal - * - * @param string $msg Message with optional sprintf()-style vararg parameters - * @param bool|float|int|string|null ...$args - * - * @return CompilerException - */ - public function error($msg, ...$args) - { - if ($args) { - $msg = \sprintf($msg, ...$args); - } - if (!$this->ignoreCallStackMessage) { - $msg = $this->addLocationToMessage($msg); - } - return new CompilerException($msg); - } - /** - * @param string $msg - * - * @return string - */ - private function addLocationToMessage($msg) - { - $line = $this->sourceLine; - $column = $this->sourceColumn; - $loc = isset($this->sourceNames[$this->sourceIndex]) ? $this->getPrettyPath($this->sourceNames[$this->sourceIndex]) . " on line {$line}, at column {$column}" : "line: {$line}, column: {$column}"; - $msg = "{$msg}: {$loc}"; - $callStackMsg = $this->callStackMessage(); - if ($callStackMsg) { - $msg .= "\nCall Stack:\n" . $callStackMsg; - } - return $msg; - } - /** - * @param string $functionName - * @param array $ExpectedArgs - * @param int $nbActual - * @return CompilerException - * - * @deprecated - */ - public function errorArgsNumber($functionName, $ExpectedArgs, $nbActual) - { - @\trigger_error(\sprintf('The "%s" method is deprecated.', __METHOD__), \E_USER_DEPRECATED); - $nbExpected = \count($ExpectedArgs); - if ($nbActual > $nbExpected) { - return $this->error('Error: Only %d arguments allowed in %s(), but %d were passed.', $nbExpected, $functionName, $nbActual); - } else { - $missing = []; - while (\count($ExpectedArgs) && \count($ExpectedArgs) > $nbActual) { - \array_unshift($missing, \array_pop($ExpectedArgs)); - } - return $this->error('Error: %s() argument%s %s missing.', $functionName, \count($missing) > 1 ? 's' : '', \implode(', ', $missing)); - } - } - /** - * Beautify call stack for output - * - * @param bool $all - * @param int|null $limit - * - * @return string - */ - protected function callStackMessage($all = \false, $limit = null) - { - $callStackMsg = []; - $ncall = 0; - if ($this->callStack) { - foreach (\array_reverse($this->callStack) as $call) { - if ($all || isset($call['n']) && $call['n']) { - $msg = '#' . $ncall++ . ' ' . $call['n'] . ' '; - $msg .= isset($this->sourceNames[$call[Parser::SOURCE_INDEX]]) ? $this->getPrettyPath($this->sourceNames[$call[Parser::SOURCE_INDEX]]) : '(unknown file)'; - $msg .= ' on line ' . $call[Parser::SOURCE_LINE]; - $callStackMsg[] = $msg; - if (!\is_null($limit) && $ncall > $limit) { - break; - } - } - } - } - return \implode("\n", $callStackMsg); - } - /** - * Handle import loop - * - * @param string $name - * - * @return void - * - * @throws \Exception - */ - protected function handleImportLoop($name) - { - for ($env = $this->env; $env; $env = $env->parent) { - if (!$env->block) { - continue; - } - $file = $this->sourceNames[$env->block->sourceIndex]; - if ($file === null) { - continue; - } - if (\realpath($file) === $name) { - throw $this->error('An @import loop has been found: %s imports %s', $file, \basename($file)); - } - } - } - /** - * Call SCSS @function - * - * @param CallableBlock|null $func - * @param array $argValues - * - * @return array|Number - */ - protected function callScssFunction($func, $argValues) - { - if (!$func) { - return static::$defaultValue; - } - $name = $func->name; - $this->pushEnv(); - // set the args - if (isset($func->args)) { - $this->applyArguments($func->args, $argValues); - } - // throw away lines and children - $tmp = new OutputBlock(); - $tmp->lines = []; - $tmp->children = []; - $this->env->marker = 'function'; - if (!empty($func->parentEnv)) { - $this->env->declarationScopeParent = $func->parentEnv; - } else { - throw $this->error("@function {$name}() without parentEnv"); - } - $ret = $this->compileChildren($func->children, $tmp, $this->env->marker . ' ' . $name); - $this->popEnv(); - return !isset($ret) ? static::$defaultValue : $ret; - } - /** - * Call built-in and registered (PHP) functions - * - * @param string $name - * @param callable $function - * @param array $prototype - * @param array $args - * - * @return array|Number|null - */ - protected function callNativeFunction($name, $function, $prototype, $args) - { - $libName = \is_array($function) ? \end($function) : null; - $sorted_kwargs = $this->sortNativeFunctionArgs($libName, $prototype, $args); - if (\is_null($sorted_kwargs)) { - return null; - } - @(list($sorted, $kwargs) = $sorted_kwargs); - if ($name !== 'if') { - foreach ($sorted as &$val) { - if ($val !== null) { - $val = $this->reduce($val, \true); - } - } - } - $returnValue = \call_user_func($function, $sorted, $kwargs); - if (!isset($returnValue)) { - return null; - } - if (\is_array($returnValue) || $returnValue instanceof Number) { - return $returnValue; - } - @\trigger_error(\sprintf('Returning a PHP value from the "%s" custom function is deprecated. A sass value must be returned instead.', $name), \E_USER_DEPRECATED); - return $this->coerceValue($returnValue); - } - /** - * Get built-in function - * - * @param string $name Normalized name - * - * @return array - */ - protected function getBuiltinFunction($name) - { - $libName = self::normalizeNativeFunctionName($name); - return [$this, $libName]; - } - /** - * Normalize native function name - * - * @internal - * - * @param string $name - * - * @return string - */ - public static function normalizeNativeFunctionName($name) - { - $name = \str_replace("-", "_", $name); - $libName = 'lib' . \preg_replace_callback('/_(.)/', function ($m) { - return \ucfirst($m[1]); - }, \ucfirst($name)); - return $libName; - } - /** - * Check if a function is a native built-in scss function, for css parsing - * - * @internal - * - * @param string $name - * - * @return bool - */ - public static function isNativeFunction($name) - { - return \method_exists(Compiler::class, self::normalizeNativeFunctionName($name)); - } - /** - * Sorts keyword arguments - * - * @param string $functionName - * @param array|null $prototypes - * @param array $args - * - * @return array|null - */ - protected function sortNativeFunctionArgs($functionName, $prototypes, $args) - { - static $parser = null; - if (!isset($prototypes)) { - $keyArgs = []; - $posArgs = []; - if (\is_array($args) && \count($args) && \end($args) === static::$null) { - \array_pop($args); - } - // separate positional and keyword arguments - foreach ($args as $arg) { - list($key, $value) = $arg; - if (empty($key) or empty($key[1])) { - $posArgs[] = empty($arg[2]) ? $value : $arg; - } else { - $keyArgs[$key[1]] = $value; - } - } - return [$posArgs, $keyArgs]; - } - // specific cases ? - if (\in_array($functionName, ['libRgb', 'libRgba', 'libHsl', 'libHsla'])) { - // notation 100 127 255 / 0 is in fact a simple list of 4 values - foreach ($args as $k => $arg) { - if (!isset($arg[1])) { - continue; - // This happens when using a trailing comma - } - if ($arg[1][0] === Type::T_LIST && \count($arg[1][2]) === 3) { - $args[$k][1][2] = $this->extractSlashAlphaInColorFunction($arg[1][2]); - } - } - } - list($positionalArgs, $namedArgs, $names, $separator, $hasSplat) = $this->evaluateArguments($args, \false); - if (!\is_array(\reset($prototypes))) { - $prototypes = [$prototypes]; - } - $parsedPrototypes = \array_map([$this, 'parseFunctionPrototype'], $prototypes); - \assert(!empty($parsedPrototypes)); - $matchedPrototype = $this->selectFunctionPrototype($parsedPrototypes, \count($positionalArgs), $names); - $this->verifyPrototype($matchedPrototype, \count($positionalArgs), $names, $hasSplat); - $vars = $this->applyArgumentsToDeclaration($matchedPrototype, $positionalArgs, $namedArgs, $separator); - $finalArgs = []; - $keyArgs = []; - foreach ($matchedPrototype['arguments'] as $argument) { - list($normalizedName, $originalName, $default) = $argument; - if (isset($vars[$normalizedName])) { - $value = $vars[$normalizedName]; - } else { - $value = $default; - } - // special null value as default: translate to real null here - if ($value === [Type::T_KEYWORD, 'null']) { - $value = null; - } - $finalArgs[] = $value; - $keyArgs[$originalName] = $value; - } - if ($matchedPrototype['rest_argument'] !== null) { - $value = $vars[$matchedPrototype['rest_argument']]; - $finalArgs[] = $value; - $keyArgs[$matchedPrototype['rest_argument']] = $value; - } - return [$finalArgs, $keyArgs]; - } - /** - * Parses a function prototype to the internal representation of arguments. - * - * The input is an array of strings describing each argument, as supported - * in {@see registerFunction}. Argument names don't include the `$`. - * The output contains the list of positional argument, with their normalized - * name (underscores are replaced by dashes), their original name (to be used - * in case of error reporting) and their default value. The output also contains - * the normalized name of the rest argument, or null if the function prototype - * is not variadic. - * - * @param string[] $prototype - * - * @return array - * @phpstan-return array{arguments: list, rest_argument: string|null} - */ - private function parseFunctionPrototype(array $prototype) - { - static $parser = null; - $arguments = []; - $restArgument = null; - foreach ($prototype as $p) { - if (null !== $restArgument) { - throw new \InvalidArgumentException('The argument declaration is invalid. The rest argument must be the last one.'); - } - $default = null; - $p = \explode(':', $p, 2); - $name = \str_replace('_', '-', $p[0]); - if (isset($p[1])) { - $defaultSource = \trim($p[1]); - if ($defaultSource === 'null') { - // differentiate this null from the static::$null - $default = [Type::T_KEYWORD, 'null']; - } else { - if (\is_null($parser)) { - $parser = $this->parserFactory(__METHOD__); - } - $parser->parseValue($defaultSource, $default); - } - } - if (\substr($name, -3) === '...') { - $restArgument = \substr($name, 0, -3); - } else { - $arguments[] = [$name, $p[0], $default]; - } - } - return ['arguments' => $arguments, 'rest_argument' => $restArgument]; - } - /** - * Returns the function prototype for the given positional and named arguments. - * - * If no exact match is found, finds the closest approximation. Note that this - * doesn't guarantee that $positional and $names are valid for the returned - * prototype. - * - * @param array[] $prototypes - * @param int $positional - * @param array $names A set of names, as both keys and values - * - * @return array - * - * @phpstan-param non-empty-list, rest_argument: string|null}> $prototypes - * @phpstan-return array{arguments: list, rest_argument: string|null} - */ - private function selectFunctionPrototype(array $prototypes, $positional, array $names) - { - $fuzzyMatch = null; - $minMismatchDistance = null; - foreach ($prototypes as $prototype) { - // Ideally, find an exact match. - if ($this->checkPrototypeMatches($prototype, $positional, $names)) { - return $prototype; - } - $mismatchDistance = \count($prototype['arguments']) - $positional; - if ($minMismatchDistance !== null) { - if (\abs($mismatchDistance) > \abs($minMismatchDistance)) { - continue; - } - // If two overloads have the same mismatch distance, favor the overload - // that has more arguments. - if (\abs($mismatchDistance) === \abs($minMismatchDistance) && $mismatchDistance < 0) { - continue; - } - } - $minMismatchDistance = $mismatchDistance; - $fuzzyMatch = $prototype; - } - return $fuzzyMatch; - } - /** - * Checks whether the argument invocation matches the callable prototype. - * - * The rules are similar to {@see verifyPrototype}. The boolean return value - * avoids the overhead of building and catching exceptions when the reason of - * not matching the prototype does not need to be known. - * - * @param array $prototype - * @param int $positional - * @param array $names - * - * @return bool - * - * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype - */ - private function checkPrototypeMatches(array $prototype, $positional, array $names) - { - $nameUsed = 0; - foreach ($prototype['arguments'] as $i => $argument) { - list($name, $originalName, $default) = $argument; - if ($i < $positional) { - if (isset($names[$name])) { - return \false; - } - } elseif (isset($names[$name])) { - $nameUsed++; - } elseif ($default === null) { - return \false; - } - } - if ($prototype['rest_argument'] !== null) { - return \true; - } - if ($positional > \count($prototype['arguments'])) { - return \false; - } - if ($nameUsed < \count($names)) { - return \false; - } - return \true; - } - /** - * Verifies that the argument invocation is valid for the callable prototype. - * - * @param array $prototype - * @param int $positional - * @param array $names - * @param bool $hasSplat - * - * @return void - * - * @throws SassScriptException - * - * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype - */ - private function verifyPrototype(array $prototype, $positional, array $names, $hasSplat) - { - $nameUsed = 0; - foreach ($prototype['arguments'] as $i => $argument) { - list($name, $originalName, $default) = $argument; - if ($i < $positional) { - if (isset($names[$name])) { - throw new SassScriptException(\sprintf('Argument $%s was passed both by position and by name.', $originalName)); - } - } elseif (isset($names[$name])) { - $nameUsed++; - } elseif ($default === null) { - throw new SassScriptException(\sprintf('Missing argument $%s', $originalName)); - } - } - if ($prototype['rest_argument'] !== null) { - return; - } - if ($positional > \count($prototype['arguments'])) { - $message = \sprintf('Only %d %sargument%s allowed, but %d %s passed.', \count($prototype['arguments']), empty($names) ? '' : 'positional ', \count($prototype['arguments']) === 1 ? '' : 's', $positional, $positional === 1 ? 'was' : 'were'); - if (!$hasSplat) { - throw new SassScriptException($message); - } - $message = $this->addLocationToMessage($message); - $message .= "\nThis will be an error in future versions of Sass."; - $this->logger->warn($message, \true); - } - if ($nameUsed < \count($names)) { - $unknownNames = \array_values(\array_diff($names, \array_column($prototype['arguments'], 0))); - $lastName = \array_pop($unknownNames); - $message = \sprintf('No argument%s named $%s%s.', $unknownNames ? 's' : '', $unknownNames ? \implode(', $', $unknownNames) . ' or $' : '', $lastName); - throw new SassScriptException($message); - } - } - /** - * Evaluates the argument from the invocation. - * - * This returns several things about this invocation: - * - the list of positional arguments - * - the map of named arguments, indexed by normalized names - * - the set of names used in the arguments (that's an array using the normalized names as keys for O(1) access) - * - the separator used by the list using the splat operator, if any - * - a boolean indicator whether any splat argument (list or map) was used, to support the incomplete error reporting. - * - * @param array[] $args - * @param bool $reduce Whether arguments should be reduced to their value - * - * @return array - * - * @throws SassScriptException - * - * @phpstan-return array{0: list, 1: array, 2: array, 3: string|null, 4: bool} - */ - private function evaluateArguments(array $args, $reduce = \true) - { - // this represents trailing commas - if (\count($args) && \end($args) === static::$null) { - \array_pop($args); - } - $splatSeparator = null; - $keywordArgs = []; - $names = []; - $positionalArgs = []; - $hasKeywordArgument = \false; - $hasSplat = \false; - foreach ($args as $arg) { - if (!empty($arg[0])) { - $hasKeywordArgument = \true; - \assert(\is_string($arg[0][1])); - $name = \str_replace('_', '-', $arg[0][1]); - if (isset($keywordArgs[$name])) { - throw new SassScriptException(\sprintf('Duplicate named argument $%s.', $arg[0][1])); - } - $keywordArgs[$name] = $this->maybeReduce($reduce, $arg[1]); - $names[$name] = $name; - } elseif (!empty($arg[2])) { - // $arg[2] means a var followed by ... in the arg ($list... ) - $val = $this->reduce($arg[1], \true); - $hasSplat = \true; - if ($val[0] === Type::T_LIST) { - foreach ($val[2] as $item) { - if (\is_null($splatSeparator)) { - $splatSeparator = $val[1]; - } - $positionalArgs[] = $this->maybeReduce($reduce, $item); - } - if (isset($val[3]) && \is_array($val[3])) { - foreach ($val[3] as $name => $item) { - \assert(\is_string($name)); - $normalizedName = \str_replace('_', '-', $name); - if (isset($keywordArgs[$normalizedName])) { - throw new SassScriptException(\sprintf('Duplicate named argument $%s.', $name)); - } - $keywordArgs[$normalizedName] = $this->maybeReduce($reduce, $item); - $names[$normalizedName] = $normalizedName; - $hasKeywordArgument = \true; - } - } - } elseif ($val[0] === Type::T_MAP) { - foreach ($val[1] as $i => $name) { - $name = $this->compileStringContent($this->coerceString($name)); - $item = $val[2][$i]; - if (!\is_numeric($name)) { - $normalizedName = \str_replace('_', '-', $name); - if (isset($keywordArgs[$normalizedName])) { - throw new SassScriptException(\sprintf('Duplicate named argument $%s.', $name)); - } - $keywordArgs[$normalizedName] = $this->maybeReduce($reduce, $item); - $names[$normalizedName] = $normalizedName; - $hasKeywordArgument = \true; - } else { - if (\is_null($splatSeparator)) { - $splatSeparator = $val[1]; - } - $positionalArgs[] = $this->maybeReduce($reduce, $item); - } - } - } elseif ($val[0] !== Type::T_NULL) { - // values other than null are treated a single-element lists, while null is the empty list - $positionalArgs[] = $this->maybeReduce($reduce, $val); - } - } elseif ($hasKeywordArgument) { - throw new SassScriptException('Positional arguments must come before keyword arguments.'); - } else { - $positionalArgs[] = $this->maybeReduce($reduce, $arg[1]); - } - } - return [$positionalArgs, $keywordArgs, $names, $splatSeparator, $hasSplat]; - } - /** - * @param bool $reduce - * @param array|Number $value - * - * @return array|Number - */ - private function maybeReduce($reduce, $value) - { - if ($reduce) { - return $this->reduce($value, \true); - } - return $value; - } - /** - * Apply argument values per definition - * - * @param array[] $argDef - * @param array|null $argValues - * @param bool $storeInEnv - * @param bool $reduce only used if $storeInEnv = false - * - * @return array - * - * @phpstan-param list $argDef - * - * @throws \Exception - */ - protected function applyArguments($argDef, $argValues, $storeInEnv = \true, $reduce = \true) - { - $output = []; - if (\is_null($argValues)) { - $argValues = []; - } - if ($storeInEnv) { - $storeEnv = $this->getStoreEnv(); - $env = new Environment(); - $env->store = $storeEnv->store; - } - $prototype = ['arguments' => [], 'rest_argument' => null]; - $originalRestArgumentName = null; - foreach ($argDef as $arg) { - list($name, $default, $isVariable) = $arg; - $normalizedName = \str_replace('_', '-', $name); - if ($isVariable) { - $originalRestArgumentName = $name; - $prototype['rest_argument'] = $normalizedName; - } else { - $prototype['arguments'][] = [$normalizedName, $name, !empty($default) ? $default : null]; - } - } - list($positionalArgs, $namedArgs, $names, $splatSeparator, $hasSplat) = $this->evaluateArguments($argValues, $reduce); - $this->verifyPrototype($prototype, \count($positionalArgs), $names, $hasSplat); - $vars = $this->applyArgumentsToDeclaration($prototype, $positionalArgs, $namedArgs, $splatSeparator); - foreach ($prototype['arguments'] as $argument) { - list($normalizedName, $name) = $argument; - if (!isset($vars[$normalizedName])) { - continue; - } - $val = $vars[$normalizedName]; - if ($storeInEnv) { - $this->set($name, $this->reduce($val, \true), \true, $env); - } else { - $output[$name] = $reduce ? $this->reduce($val, \true) : $val; - } - } - if ($prototype['rest_argument'] !== null) { - \assert($originalRestArgumentName !== null); - $name = $originalRestArgumentName; - $val = $vars[$prototype['rest_argument']]; - if ($storeInEnv) { - $this->set($name, $this->reduce($val, \true), \true, $env); - } else { - $output[$name] = $reduce ? $this->reduce($val, \true) : $val; - } - } - if ($storeInEnv) { - $storeEnv->store = $env->store; - } - foreach ($prototype['arguments'] as $argument) { - list($normalizedName, $name, $default) = $argument; - if (isset($vars[$normalizedName])) { - continue; - } - \assert($default !== null); - if ($storeInEnv) { - $this->set($name, $this->reduce($default, \true), \true); - } else { - $output[$name] = $reduce ? $this->reduce($default, \true) : $default; - } - } - return $output; - } - /** - * Apply argument values per definition. - * - * This method assumes that the arguments are valid for the provided prototype. - * The validation with {@see verifyPrototype} must have been run before calling - * it. - * Arguments are returned as a map from the normalized argument names to the - * value. Additional arguments are collected in a sass argument list available - * under the name of the rest argument in the result. - * - * Defaults are not applied as they are resolved in a different environment. - * - * @param array $prototype - * @param array $positionalArgs - * @param array $namedArgs - * @param string|null $splatSeparator - * - * @return array - * - * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype - */ - private function applyArgumentsToDeclaration(array $prototype, array $positionalArgs, array $namedArgs, $splatSeparator) - { - $output = []; - $minLength = \min(\count($positionalArgs), \count($prototype['arguments'])); - for ($i = 0; $i < $minLength; $i++) { - list($name) = $prototype['arguments'][$i]; - $val = $positionalArgs[$i]; - $output[$name] = $val; - } - $restNamed = $namedArgs; - for ($i = \count($positionalArgs); $i < \count($prototype['arguments']); $i++) { - $argument = $prototype['arguments'][$i]; - list($name) = $argument; - if (isset($namedArgs[$name])) { - $val = $namedArgs[$name]; - unset($restNamed[$name]); - } else { - continue; - } - $output[$name] = $val; - } - if ($prototype['rest_argument'] !== null) { - $name = $prototype['rest_argument']; - $rest = \array_values(\array_slice($positionalArgs, \count($prototype['arguments']))); - $val = [Type::T_LIST, \is_null($splatSeparator) ? ',' : $splatSeparator, $rest, $restNamed]; - $output[$name] = $val; - } - return $output; - } - /** - * Coerce a php value into a scss one - * - * @param mixed $value - * - * @return array|Number - */ - protected function coerceValue($value) - { - if (\is_array($value) || $value instanceof Number) { - return $value; - } - if (\is_bool($value)) { - return $this->toBool($value); - } - if (\is_null($value)) { - return static::$null; - } - if (\is_int($value) || \is_float($value)) { - return new Number($value, ''); - } - if (\is_numeric($value)) { - return new Number((float) $value, ''); - } - if ($value === '') { - return static::$emptyString; - } - $value = [Type::T_KEYWORD, $value]; - $color = $this->coerceColor($value); - if ($color) { - return $color; - } - return $value; - } - /** - * Tries to convert an item to a Sass map - * - * @param Number|array $item - * - * @return array|null - */ - private function tryMap($item) - { - if ($item instanceof Number) { - return null; - } - if ($item[0] === Type::T_MAP) { - return $item; - } - if ($item[0] === Type::T_LIST && $item[2] === []) { - return static::$emptyMap; - } - return null; - } - /** - * Coerce something to map - * - * @param array|Number $item - * - * @return array|Number - */ - protected function coerceMap($item) - { - $map = $this->tryMap($item); - if ($map !== null) { - return $map; - } - return $item; - } - /** - * Coerce something to list - * - * @param array|Number $item - * @param string $delim - * @param bool $removeTrailingNull - * - * @return array - */ - protected function coerceList($item, $delim = ',', $removeTrailingNull = \false) - { - if ($item instanceof Number) { - return [Type::T_LIST, '', [$item]]; - } - if ($item[0] === Type::T_LIST) { - // remove trailing null from the list - if ($removeTrailingNull && \end($item[2]) === static::$null) { - \array_pop($item[2]); - } - return $item; - } - if ($item[0] === Type::T_MAP) { - $keys = $item[1]; - $values = $item[2]; - $list = []; - for ($i = 0, $s = \count($keys); $i < $s; $i++) { - $key = $keys[$i]; - $value = $values[$i]; - $list[] = [Type::T_LIST, ' ', [$key, $value]]; - } - return [Type::T_LIST, $list ? ',' : '', $list]; - } - return [Type::T_LIST, '', [$item]]; - } - /** - * Coerce color for expression - * - * @param array|Number $value - * - * @return array|Number - */ - protected function coerceForExpression($value) - { - if ($color = $this->coerceColor($value)) { - return $color; - } - return $value; - } - /** - * Coerce value to color - * - * @param array|Number $value - * @param bool $inRGBFunction - * - * @return array|null - */ - protected function coerceColor($value, $inRGBFunction = \false) - { - if ($value instanceof Number) { - return null; - } - switch ($value[0]) { - case Type::T_COLOR: - for ($i = 1; $i <= 3; $i++) { - if (!\is_numeric($value[$i])) { - $cv = $this->compileRGBAValue($value[$i]); - if (!\is_numeric($cv)) { - return null; - } - $value[$i] = $cv; - } - if (isset($value[4])) { - if (!\is_numeric($value[4])) { - $cv = $this->compileRGBAValue($value[4], \true); - if (!\is_numeric($cv)) { - return null; - } - $value[4] = $cv; - } - } - } - return $value; - case Type::T_LIST: - if ($inRGBFunction) { - if (\count($value[2]) == 3 || \count($value[2]) == 4) { - $color = $value[2]; - \array_unshift($color, Type::T_COLOR); - return $this->coerceColor($color); - } - } - return null; - case Type::T_KEYWORD: - if (!\is_string($value[1])) { - return null; - } - $name = \strtolower($value[1]); - // hexa color? - if (\preg_match('/^#([0-9a-f]+)$/i', $name, $m)) { - $nofValues = \strlen($m[1]); - if (\in_array($nofValues, [3, 4, 6, 8])) { - $nbChannels = 3; - $color = []; - $num = \hexdec($m[1]); - switch ($nofValues) { - case 4: - $nbChannels = 4; - // then continuing with the case 3: - case 3: - for ($i = 0; $i < $nbChannels; $i++) { - $t = $num & 0xf; - \array_unshift($color, $t << 4 | $t); - $num >>= 4; - } - break; - case 8: - $nbChannels = 4; - // then continuing with the case 6: - case 6: - for ($i = 0; $i < $nbChannels; $i++) { - \array_unshift($color, $num & 0xff); - $num >>= 8; - } - break; - } - if ($nbChannels === 4) { - if ($color[3] === 255) { - $color[3] = 1; - // fully opaque - } else { - $color[3] = \round($color[3] / 255, Number::PRECISION); - } - } - \array_unshift($color, Type::T_COLOR); - return $color; - } - } - if ($rgba = Colors::colorNameToRGBa($name)) { - return isset($rgba[3]) ? [Type::T_COLOR, $rgba[0], $rgba[1], $rgba[2], $rgba[3]] : [Type::T_COLOR, $rgba[0], $rgba[1], $rgba[2]]; - } - return null; - } - return null; - } - /** - * @param int|Number $value - * @param bool $isAlpha - * - * @return int|mixed - */ - protected function compileRGBAValue($value, $isAlpha = \false) - { - if ($isAlpha) { - return $this->compileColorPartValue($value, 0, 1, \false); - } - return $this->compileColorPartValue($value, 0, 255, \true); - } - /** - * @param mixed $value - * @param int|float $min - * @param int|float $max - * @param bool $isInt - * - * @return int|mixed - */ - protected function compileColorPartValue($value, $min, $max, $isInt = \true) - { - if (!\is_numeric($value)) { - if (\is_array($value)) { - $reduced = $this->reduce($value); - if ($reduced instanceof Number) { - $value = $reduced; - } - } - if ($value instanceof Number) { - if ($value->unitless()) { - $num = $value->getDimension(); - } elseif ($value->hasUnit('%')) { - $num = $max * $value->getDimension() / 100; - } else { - throw $this->error('Expected %s to have no units or "%%".', $value); - } - $value = $num; - } elseif (\is_array($value)) { - $value = $this->compileValue($value); - } - } - if (\is_numeric($value)) { - if ($isInt) { - $value = \round($value); - } - $value = \min($max, \max($min, $value)); - return $value; - } - return $value; - } - /** - * Coerce value to string - * - * @param array|Number $value - * - * @return array - */ - protected function coerceString($value) - { - if ($value[0] === Type::T_STRING) { - \assert(\is_array($value)); - return $value; - } - return [Type::T_STRING, '', [$this->compileValue($value)]]; - } - /** - * Assert value is a string - * - * This method deals with internal implementation details of the value - * representation where unquoted strings can sometimes be stored under - * other types. - * The returned value is always using the T_STRING type. - * - * @api - * - * @param array|Number $value - * @param string|null $varName - * - * @return array - * - * @throws SassScriptException - */ - public function assertString($value, $varName = null) - { - // case of url(...) parsed a a function - if ($value[0] === Type::T_FUNCTION) { - $value = $this->coerceString($value); - } - if (!\in_array($value[0], [Type::T_STRING, Type::T_KEYWORD])) { - $value = $this->compileValue($value); - throw SassScriptException::forArgument("{$value} is not a string.", $varName); - } - return $this->coerceString($value); - } - /** - * Coerce value to a percentage - * - * @param array|Number $value - * - * @return int|float - * - * @deprecated - */ - protected function coercePercent($value) - { - @\trigger_error(\sprintf('"%s" is deprecated since 1.7.0.', __METHOD__), \E_USER_DEPRECATED); - if ($value instanceof Number) { - if ($value->hasUnit('%')) { - return $value->getDimension() / 100; - } - return $value->getDimension(); - } - return 0; - } - /** - * Assert value is a map - * - * @api - * - * @param array|Number $value - * @param string|null $varName - * - * @return array - * - * @throws SassScriptException - */ - public function assertMap($value, $varName = null) - { - $map = $this->tryMap($value); - if ($map === null) { - $value = $this->compileValue($value); - throw SassScriptException::forArgument("{$value} is not a map.", $varName); - } - return $map; - } - /** - * Assert value is a list - * - * @api - * - * @param array|Number $value - * - * @return array - * - * @throws \Exception - */ - public function assertList($value) - { - if ($value[0] !== Type::T_LIST) { - throw $this->error('expecting list, %s received', $value[0]); - } - \assert(\is_array($value)); - return $value; - } - /** - * Gets the keywords of an argument list. - * - * Keys in the returned array are normalized names (underscores are replaced with dashes) - * without the leading `$`. - * Calling this helper with anything that an argument list received for a rest argument - * of the function argument declaration is not supported. - * - * @param array|Number $value - * - * @return array - */ - public function getArgumentListKeywords($value) - { - if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) { - throw new \InvalidArgumentException('The argument is not a sass argument list.'); - } - return $value[3]; - } - /** - * Assert value is a color - * - * @api - * - * @param array|Number $value - * @param string|null $varName - * - * @return array - * - * @throws SassScriptException - */ - public function assertColor($value, $varName = null) - { - if ($color = $this->coerceColor($value)) { - return $color; - } - $value = $this->compileValue($value); - throw SassScriptException::forArgument("{$value} is not a color.", $varName); - } - /** - * Assert value is a number - * - * @api - * - * @param array|Number $value - * @param string|null $varName - * - * @return Number - * - * @throws SassScriptException - */ - public function assertNumber($value, $varName = null) - { - if (!$value instanceof Number) { - $value = $this->compileValue($value); - throw SassScriptException::forArgument("{$value} is not a number.", $varName); - } - return $value; - } - /** - * Assert value is a integer - * - * @api - * - * @param array|Number $value - * @param string|null $varName - * - * @return int - * - * @throws SassScriptException - */ - public function assertInteger($value, $varName = null) - { - $value = $this->assertNumber($value, $varName)->getDimension(); - if (\round($value - \intval($value), Number::PRECISION) > 0) { - throw SassScriptException::forArgument("{$value} is not an integer.", $varName); - } - return \intval($value); - } - /** - * Extract the ... / alpha on the last argument of channel arg - * in color functions - * - * @param array $args - * @return array - */ - private function extractSlashAlphaInColorFunction($args) - { - $last = \end($args); - if (\count($args) === 3 && $last[0] === Type::T_EXPRESSION && $last[1] === '/') { - \array_pop($args); - $args[] = $last[2]; - $args[] = $last[3]; - } - return $args; - } - /** - * Make sure a color's components don't go out of bounds - * - * @param array $c - * - * @return array - */ - protected function fixColor($c) - { - foreach ([1, 2, 3] as $i) { - if ($c[$i] < 0) { - $c[$i] = 0; - } - if ($c[$i] > 255) { - $c[$i] = 255; - } - if (!\is_int($c[$i])) { - $c[$i] = \round($c[$i]); - } - } - return $c; - } - /** - * Convert RGB to HSL - * - * @internal - * - * @param int $red - * @param int $green - * @param int $blue - * - * @return array - */ - public function toHSL($red, $green, $blue) - { - $min = \min($red, $green, $blue); - $max = \max($red, $green, $blue); - $l = $min + $max; - $d = $max - $min; - if ((int) $d === 0) { - $h = $s = 0; - } else { - if ($l < 255) { - $s = $d / $l; - } else { - $s = $d / (510 - $l); - } - if ($red == $max) { - $h = 60 * ($green - $blue) / $d; - } elseif ($green == $max) { - $h = 60 * ($blue - $red) / $d + 120; - } else { - $h = 60 * ($red - $green) / $d + 240; - } - } - return [Type::T_HSL, \fmod($h + 360, 360), $s * 100, $l / 5.1]; - } - /** - * Hue to RGB helper - * - * @param float $m1 - * @param float $m2 - * @param float $h - * - * @return float - */ - protected function hueToRGB($m1, $m2, $h) - { - if ($h < 0) { - $h += 1; - } elseif ($h > 1) { - $h -= 1; - } - if ($h * 6 < 1) { - return $m1 + ($m2 - $m1) * $h * 6; - } - if ($h * 2 < 1) { - return $m2; - } - if ($h * 3 < 2) { - return $m1 + ($m2 - $m1) * (2 / 3 - $h) * 6; - } - return $m1; - } - /** - * Convert HSL to RGB - * - * @internal - * - * @param int|float $hue H from 0 to 360 - * @param int|float $saturation S from 0 to 100 - * @param int|float $lightness L from 0 to 100 - * - * @return array - */ - public function toRGB($hue, $saturation, $lightness) - { - if ($hue < 0) { - $hue += 360; - } - $h = $hue / 360; - $s = \min(100, \max(0, $saturation)) / 100; - $l = \min(100, \max(0, $lightness)) / 100; - $m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s; - $m1 = $l * 2 - $m2; - $r = $this->hueToRGB($m1, $m2, $h + 1 / 3) * 255; - $g = $this->hueToRGB($m1, $m2, $h) * 255; - $b = $this->hueToRGB($m1, $m2, $h - 1 / 3) * 255; - $out = [Type::T_COLOR, $r, $g, $b]; - return $out; - } - /** - * Convert HWB to RGB - * https://www.w3.org/TR/css-color-4/#hwb-to-rgb - * - * @api - * - * @param int|float $hue H from 0 to 360 - * @param int|float $whiteness W from 0 to 100 - * @param int|float $blackness B from 0 to 100 - * - * @return array - */ - private function HWBtoRGB($hue, $whiteness, $blackness) - { - $w = \min(100, \max(0, $whiteness)) / 100; - $b = \min(100, \max(0, $blackness)) / 100; - $sum = $w + $b; - if ($sum > 1.0) { - $w = $w / $sum; - $b = $b / $sum; - } - $b = \min(1.0 - $w, $b); - $rgb = $this->toRGB($hue, 100, 50); - for ($i = 1; $i < 4; $i++) { - $rgb[$i] *= 1.0 - $w - $b; - $rgb[$i] = \round($rgb[$i] + 255 * $w + 0.0001); - } - return $rgb; - } - /** - * Convert RGB to HWB - * - * @api - * - * @param int $red - * @param int $green - * @param int $blue - * - * @return array - */ - private function RGBtoHWB($red, $green, $blue) - { - $min = \min($red, $green, $blue); - $max = \max($red, $green, $blue); - $d = $max - $min; - if ((int) $d === 0) { - $h = 0; - } else { - if ($red == $max) { - $h = 60 * ($green - $blue) / $d; - } elseif ($green == $max) { - $h = 60 * ($blue - $red) / $d + 120; - } else { - $h = 60 * ($red - $green) / $d + 240; - } - } - return [Type::T_HWB, \fmod($h, 360), $min / 255 * 100, 100 - $max / 255 * 100]; - } - // Built in functions - protected static $libCall = ['function', 'args...']; - protected function libCall($args) - { - $functionReference = $args[0]; - if (\in_array($functionReference[0], [Type::T_STRING, Type::T_KEYWORD])) { - $name = $this->compileStringContent($this->coerceString($functionReference)); - $warning = "Passing a string to call() is deprecated and will be illegal\n" . "in Sass 4.0. Use call(function-reference({$name})) instead."; - Warn::deprecation($warning); - $functionReference = $this->libGetFunction([$this->assertString($functionReference, 'function')]); - } - if ($functionReference === static::$null) { - return static::$null; - } - if (!\in_array($functionReference[0], [Type::T_FUNCTION_REFERENCE, Type::T_FUNCTION])) { - throw $this->error('Function reference expected, got ' . $functionReference[0]); - } - $callArgs = [[null, $args[1], \true]]; - return $this->reduce([Type::T_FUNCTION_CALL, $functionReference, $callArgs]); - } - protected static $libGetFunction = [['name'], ['name', 'css']]; - protected function libGetFunction($args) - { - $name = $this->compileStringContent($this->assertString(\array_shift($args), 'name')); - $isCss = \false; - if (\count($args)) { - $isCss = \array_shift($args); - $isCss = $isCss === static::$true ? \true : \false; - } - if ($isCss) { - return [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]]; - } - return $this->getFunctionReference($name, \true); - } - protected static $libIf = ['condition', 'if-true', 'if-false:']; - protected function libIf($args) - { - list($cond, $t, $f) = $args; - if (!$this->isTruthy($this->reduce($cond, \true))) { - return $this->reduce($f, \true); - } - return $this->reduce($t, \true); - } - protected static $libIndex = ['list', 'value']; - protected function libIndex($args) - { - list($list, $value) = $args; - if ($list[0] === Type::T_MAP || $list[0] === Type::T_STRING || $list[0] === Type::T_KEYWORD || $list[0] === Type::T_INTERPOLATE) { - $list = $this->coerceList($list, ' '); - } - if ($list[0] !== Type::T_LIST) { - return static::$null; - } - // Numbers are represented with value objects, for which the PHP equality operator does not - // match the Sass rules (and we cannot overload it). As they are the only type of values - // represented with a value object for now, they require a special case. - if ($value instanceof Number) { - $key = 0; - foreach ($list[2] as $item) { - $key++; - $itemValue = $this->normalizeValue($item); - if ($itemValue instanceof Number && $value->equals($itemValue)) { - return new Number($key, ''); - } - } - return static::$null; - } - $values = []; - foreach ($list[2] as $item) { - $values[] = $this->normalizeValue($item); - } - $key = \array_search($this->normalizeValue($value), $values); - return \false === $key ? static::$null : new Number($key + 1, ''); - } - protected static $libRgb = [['color'], ['color', 'alpha'], ['channels'], ['red', 'green', 'blue'], ['red', 'green', 'blue', 'alpha']]; - /** - * @param array $args - * @param array $kwargs - * @param string $funcName - * - * @return array - */ - protected function libRgb($args, $kwargs, $funcName = 'rgb') - { - switch (\count($args)) { - case 1: - if (!($color = $this->coerceColor($args[0], \true))) { - $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ')']]; - } - break; - case 3: - $color = [Type::T_COLOR, $args[0], $args[1], $args[2]]; - if (!($color = $this->coerceColor($color))) { - $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']]; - } - return $color; - case 2: - if ($color = $this->coerceColor($args[0], \true)) { - $alpha = $this->compileRGBAValue($args[1], \true); - if (\is_numeric($alpha)) { - $color[4] = $alpha; - } else { - $color = [Type::T_STRING, '', [$funcName . '(', $color[1], ', ', $color[2], ', ', $color[3], ', ', $alpha, ')']]; - } - } else { - $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ')']]; - } - break; - case 4: - default: - $color = [Type::T_COLOR, $args[0], $args[1], $args[2], $args[3]]; - if (!($color = $this->coerceColor($color))) { - $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']]; - } - break; - } - return $color; - } - protected static $libRgba = [['color'], ['color', 'alpha'], ['channels'], ['red', 'green', 'blue'], ['red', 'green', 'blue', 'alpha']]; - protected function libRgba($args, $kwargs) - { - return $this->libRgb($args, $kwargs, 'rgba'); - } - /** - * Helper function for adjust_color, change_color, and scale_color - * - * @param array $args - * @param string $operation - * @param callable $fn - * - * @return array - * - * @phpstan-param callable(float|int, float|int|null, float|int): (float|int) $fn - */ - protected function alterColor(array $args, $operation, $fn) - { - $color = $this->assertColor($args[0], 'color'); - if ($args[1][2]) { - throw new SassScriptException('Only one positional argument is allowed. All other arguments must be passed by name.'); - } - $kwargs = $this->getArgumentListKeywords($args[1]); - $scale = $operation === 'scale'; - $change = $operation === 'change'; - /** @phpstan-var callable(string, float|int, bool=, bool=): (float|int|null) $getParam */ - $getParam = function ($name, $max, $checkPercent = \false, $assertPercent = \false) use(&$kwargs, $scale, $change) { - if (!isset($kwargs[$name])) { - return null; - } - $number = $this->assertNumber($kwargs[$name], $name); - unset($kwargs[$name]); - if (!$scale && $checkPercent) { - if (!$number->hasUnit('%')) { - $warning = $this->error("{$name} Passing a number `{$number}` without unit % is deprecated."); - $this->logger->warn($warning->getMessage(), \true); - } - } - if ($scale || $assertPercent) { - $number->assertUnit('%', $name); - } - if ($scale) { - $max = 100; - } - if ($scale || $assertPercent) { - return $number->valueInRange($change ? 0 : -$max, $max, $name); - } - return $number->valueInRangeWithUnit($change ? 0 : -$max, $max, $name, $checkPercent ? '%' : ''); - }; - $alpha = $getParam('alpha', 1); - $red = $getParam('red', 255); - $green = $getParam('green', 255); - $blue = $getParam('blue', 255); - if ($scale || !isset($kwargs['hue'])) { - $hue = null; - } else { - $hueNumber = $this->assertNumber($kwargs['hue'], 'hue'); - unset($kwargs['hue']); - $hue = $hueNumber->getDimension(); - } - $saturation = $getParam('saturation', 100, \true); - $lightness = $getParam('lightness', 100, \true); - $whiteness = $getParam('whiteness', 100, \false, \true); - $blackness = $getParam('blackness', 100, \false, \true); - if (!empty($kwargs)) { - $unknownNames = \array_keys($kwargs); - $lastName = \array_pop($unknownNames); - $message = \sprintf('No argument%s named $%s%s.', $unknownNames ? 's' : '', $unknownNames ? \implode(', $', $unknownNames) . ' or $' : '', $lastName); - throw new SassScriptException($message); - } - $hasRgb = $red !== null || $green !== null || $blue !== null; - $hasSL = $saturation !== null || $lightness !== null; - $hasWB = $whiteness !== null || $blackness !== null; - if ($hasRgb && ($hasSL || $hasWB || $hue !== null)) { - throw new SassScriptException(\sprintf('RGB parameters may not be passed along with %s parameters.', $hasWB ? 'HWB' : 'HSL')); - } - if ($hasWB && $hasSL) { - throw new SassScriptException('HSL parameters may not be passed along with HWB parameters.'); - } - if ($hasRgb) { - $color[1] = \round($fn($color[1], $red, 255)); - $color[2] = \round($fn($color[2], $green, 255)); - $color[3] = \round($fn($color[3], $blue, 255)); - } elseif ($hasWB) { - $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]); - if ($hue !== null) { - $hwb[1] = $change ? $hue : $hwb[1] + $hue; - } - $hwb[2] = $fn($hwb[2], $whiteness, 100); - $hwb[3] = $fn($hwb[3], $blackness, 100); - $rgb = $this->HWBtoRGB($hwb[1], $hwb[2], $hwb[3]); - if (isset($color[4])) { - $rgb[4] = $color[4]; - } - $color = $rgb; - } elseif ($hue !== null || $hasSL) { - $hsl = $this->toHSL($color[1], $color[2], $color[3]); - if ($hue !== null) { - $hsl[1] = $change ? $hue : $hsl[1] + $hue; - } - $hsl[2] = $fn($hsl[2], $saturation, 100); - $hsl[3] = $fn($hsl[3], $lightness, 100); - $rgb = $this->toRGB($hsl[1], $hsl[2], $hsl[3]); - if (isset($color[4])) { - $rgb[4] = $color[4]; - } - $color = $rgb; - } - if ($alpha !== null) { - $existingAlpha = isset($color[4]) ? $color[4] : 1; - $color[4] = $fn($existingAlpha, $alpha, 1); - } - return $color; - } - protected static $libAdjustColor = ['color', 'kwargs...']; - protected function libAdjustColor($args) - { - return $this->alterColor($args, 'adjust', function ($base, $alter, $max) { - if ($alter === null) { - return $base; - } - $new = $base + $alter; - if ($new < 0) { - return 0; - } - if ($new > $max) { - return $max; - } - return $new; - }); - } - protected static $libChangeColor = ['color', 'kwargs...']; - protected function libChangeColor($args) - { - return $this->alterColor($args, 'change', function ($base, $alter, $max) { - if ($alter === null) { - return $base; - } - return $alter; - }); - } - protected static $libScaleColor = ['color', 'kwargs...']; - protected function libScaleColor($args) - { - return $this->alterColor($args, 'scale', function ($base, $scale, $max) { - if ($scale === null) { - return $base; - } - $scale = $scale / 100; - if ($scale < 0) { - return $base * $scale + $base; - } - return ($max - $base) * $scale + $base; - }); - } - protected static $libIeHexStr = ['color']; - protected function libIeHexStr($args) - { - $color = $this->coerceColor($args[0]); - if (\is_null($color)) { - throw $this->error('Error: argument `$color` of `ie-hex-str($color)` must be a color'); - } - $color[4] = isset($color[4]) ? \round(255 * $color[4]) : 255; - return [Type::T_STRING, '', [\sprintf('#%02X%02X%02X%02X', $color[4], $color[1], $color[2], $color[3])]]; - } - protected static $libRed = ['color']; - protected function libRed($args) - { - $color = $this->coerceColor($args[0]); - if (\is_null($color)) { - throw $this->error('Error: argument `$color` of `red($color)` must be a color'); - } - return new Number((int) $color[1], ''); - } - protected static $libGreen = ['color']; - protected function libGreen($args) - { - $color = $this->coerceColor($args[0]); - if (\is_null($color)) { - throw $this->error('Error: argument `$color` of `green($color)` must be a color'); - } - return new Number((int) $color[2], ''); - } - protected static $libBlue = ['color']; - protected function libBlue($args) - { - $color = $this->coerceColor($args[0]); - if (\is_null($color)) { - throw $this->error('Error: argument `$color` of `blue($color)` must be a color'); - } - return new Number((int) $color[3], ''); - } - protected static $libAlpha = ['color']; - protected function libAlpha($args) - { - if ($color = $this->coerceColor($args[0])) { - return new Number(isset($color[4]) ? $color[4] : 1, ''); - } - // this might be the IE function, so return value unchanged - return null; - } - protected static $libOpacity = ['color']; - protected function libOpacity($args) - { - $value = $args[0]; - if ($value instanceof Number) { - return null; - } - return $this->libAlpha($args); - } - // mix two colors - protected static $libMix = [['color1', 'color2', 'weight:50%'], ['color-1', 'color-2', 'weight:50%']]; - protected function libMix($args) - { - list($first, $second, $weight) = $args; - $first = $this->assertColor($first, 'color1'); - $second = $this->assertColor($second, 'color2'); - $weightScale = $this->assertNumber($weight, 'weight')->valueInRange(0, 100, 'weight') / 100; - $firstAlpha = isset($first[4]) ? $first[4] : 1; - $secondAlpha = isset($second[4]) ? $second[4] : 1; - $normalizedWeight = $weightScale * 2 - 1; - $alphaDistance = $firstAlpha - $secondAlpha; - $combinedWeight = $normalizedWeight * $alphaDistance == -1 ? $normalizedWeight : ($normalizedWeight + $alphaDistance) / (1 + $normalizedWeight * $alphaDistance); - $weight1 = ($combinedWeight + 1) / 2.0; - $weight2 = 1.0 - $weight1; - $new = [Type::T_COLOR, $weight1 * $first[1] + $weight2 * $second[1], $weight1 * $first[2] + $weight2 * $second[2], $weight1 * $first[3] + $weight2 * $second[3]]; - if ($firstAlpha != 1.0 || $secondAlpha != 1.0) { - $new[] = $firstAlpha * $weightScale + $secondAlpha * (1 - $weightScale); - } - return $this->fixColor($new); - } - protected static $libHsl = [['channels'], ['hue', 'saturation'], ['hue', 'saturation', 'lightness'], ['hue', 'saturation', 'lightness', 'alpha']]; - /** - * @param array $args - * @param array $kwargs - * @param string $funcName - * - * @return array|null - */ - protected function libHsl($args, $kwargs, $funcName = 'hsl') - { - $args_to_check = $args; - if (\count($args) == 1) { - if ($args[0][0] !== Type::T_LIST || \count($args[0][2]) < 3 || \count($args[0][2]) > 4) { - return [Type::T_STRING, '', [$funcName . '(', $args[0], ')']]; - } - $args = $args[0][2]; - $args_to_check = $kwargs['channels'][2]; - } - if (\count($args) === 2) { - // if var() is used as an argument, return as a css function - foreach ($args as $arg) { - if ($arg[0] === Type::T_FUNCTION && \in_array($arg[1], ['var'])) { - return null; - } - } - throw new SassScriptException('Missing argument $lightness.'); - } - foreach ($kwargs as $arg) { - if (\in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && \in_array($arg[1], ['min', 'max'])) { - return null; - } - } - foreach ($args_to_check as $k => $arg) { - if (\in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && \in_array($arg[1], ['min', 'max'])) { - if (\count($kwargs) > 1 || $k >= 2 && \count($args) === 4) { - return null; - } - $args[$k] = $this->stringifyFncallArgs($arg); - } - if ($k >= 2 && \count($args) === 4 && \in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && \in_array($arg[1], ['calc', 'env'])) { - return null; - } - } - $hue = $this->reduce($args[0]); - $saturation = $this->reduce($args[1]); - $lightness = $this->reduce($args[2]); - $alpha = null; - if (\count($args) === 4) { - $alpha = $this->compileColorPartValue($args[3], 0, 100, \false); - if (!$hue instanceof Number || !$saturation instanceof Number || !$lightness instanceof Number || !\is_numeric($alpha)) { - return [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']]; - } - } else { - if (!$hue instanceof Number || !$saturation instanceof Number || !$lightness instanceof Number) { - return [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']]; - } - } - $hueValue = \fmod($hue->getDimension(), 360); - while ($hueValue < 0) { - $hueValue += 360; - } - $color = $this->toRGB($hueValue, \max(0, \min($saturation->getDimension(), 100)), \max(0, \min($lightness->getDimension(), 100))); - if (!\is_null($alpha)) { - $color[4] = $alpha; - } - return $color; - } - protected static $libHsla = [['channels'], ['hue', 'saturation'], ['hue', 'saturation', 'lightness'], ['hue', 'saturation', 'lightness', 'alpha']]; - protected function libHsla($args, $kwargs) - { - return $this->libHsl($args, $kwargs, 'hsla'); - } - protected static $libHue = ['color']; - protected function libHue($args) - { - $color = $this->assertColor($args[0], 'color'); - $hsl = $this->toHSL($color[1], $color[2], $color[3]); - return new Number($hsl[1], 'deg'); - } - protected static $libSaturation = ['color']; - protected function libSaturation($args) - { - $color = $this->assertColor($args[0], 'color'); - $hsl = $this->toHSL($color[1], $color[2], $color[3]); - return new Number($hsl[2], '%'); - } - protected static $libLightness = ['color']; - protected function libLightness($args) - { - $color = $this->assertColor($args[0], 'color'); - $hsl = $this->toHSL($color[1], $color[2], $color[3]); - return new Number($hsl[3], '%'); - } - /* - * Todo : a integrer dans le futur module color - protected static $libHwb = [ - ['channels'], - ['hue', 'whiteness', 'blackness'], - ['hue', 'whiteness', 'blackness', 'alpha'] ]; - protected function libHwb($args, $kwargs, $funcName = 'hwb') - { - $args_to_check = $args; - - if (\count($args) == 1) { - if ($args[0][0] !== Type::T_LIST) { - throw $this->error("Missing elements \$whiteness and \$blackness"); - } - - if (\trim($args[0][1])) { - throw $this->error("\$channels must be a space-separated list."); - } - - if (! empty($args[0]['enclosing'])) { - throw $this->error("\$channels must be an unbracketed list."); - } - - $args = $args[0][2]; - if (\count($args) > 3) { - throw $this->error("hwb() : Only 3 elements are allowed but ". \count($args) . "were passed"); - } - - $args_to_check = $this->extractSlashAlphaInColorFunction($kwargs['channels'][2]); - if (\count($args_to_check) !== \count($kwargs['channels'][2])) { - $args = $args_to_check; - } - } - - if (\count($args_to_check) < 2) { - throw $this->error("Missing elements \$whiteness and \$blackness"); - } - if (\count($args_to_check) < 3) { - throw $this->error("Missing element \$blackness"); - } - if (\count($args_to_check) > 4) { - throw $this->error("hwb() : Only 4 elements are allowed but ". \count($args) . "were passed"); - } - - foreach ($kwargs as $k => $arg) { - if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) { - return null; - } - } - - foreach ($args_to_check as $k => $arg) { - if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) { - if (count($kwargs) > 1 || ($k >= 2 && count($args) === 4)) { - return null; - } - - $args[$k] = $this->stringifyFncallArgs($arg); - } - - if ( - $k >= 2 && count($args) === 4 && - in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && - in_array($arg[1], ['calc','env']) - ) { - return null; - } - } - - $hue = $this->reduce($args[0]); - $whiteness = $this->reduce($args[1]); - $blackness = $this->reduce($args[2]); - $alpha = null; - - if (\count($args) === 4) { - $alpha = $this->compileColorPartValue($args[3], 0, 1, false); - - if (! \is_numeric($alpha)) { - $val = $this->compileValue($args[3]); - throw $this->error("\$alpha: $val is not a number"); - } - } - - $this->assertNumber($hue, 'hue'); - $this->assertUnit($whiteness, ['%'], 'whiteness'); - $this->assertUnit($blackness, ['%'], 'blackness'); - - $this->assertRange($whiteness, 0, 100, "0% and 100%", "whiteness"); - $this->assertRange($blackness, 0, 100, "0% and 100%", "blackness"); - - $w = $whiteness->getDimension(); - $b = $blackness->getDimension(); - - $hueValue = $hue->getDimension() % 360; - - while ($hueValue < 0) { - $hueValue += 360; - } - - $color = $this->HWBtoRGB($hueValue, $w, $b); - - if (! \is_null($alpha)) { - $color[4] = $alpha; - } - - return $color; - } - - protected static $libWhiteness = ['color']; - protected function libWhiteness($args, $kwargs, $funcName = 'whiteness') { - - $color = $this->assertColor($args[0]); - $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]); - - return new Number($hwb[2], '%'); - } - - protected static $libBlackness = ['color']; - protected function libBlackness($args, $kwargs, $funcName = 'blackness') { - - $color = $this->assertColor($args[0]); - $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]); - - return new Number($hwb[3], '%'); - } - */ - /** - * @param array $color - * @param int $idx - * @param int|float $amount - * - * @return array - */ - protected function adjustHsl($color, $idx, $amount) - { - $hsl = $this->toHSL($color[1], $color[2], $color[3]); - $hsl[$idx] += $amount; - if ($idx !== 1) { - // Clamp the saturation and lightness - $hsl[$idx] = \min(\max(0, $hsl[$idx]), 100); - } - $out = $this->toRGB($hsl[1], $hsl[2], $hsl[3]); - if (isset($color[4])) { - $out[4] = $color[4]; - } - return $out; - } - protected static $libAdjustHue = ['color', 'degrees']; - protected function libAdjustHue($args) - { - $color = $this->assertColor($args[0], 'color'); - $degrees = $this->assertNumber($args[1], 'degrees')->getDimension(); - return $this->adjustHsl($color, 1, $degrees); - } - protected static $libLighten = ['color', 'amount']; - protected function libLighten($args) - { - $color = $this->assertColor($args[0], 'color'); - $amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%'); - return $this->adjustHsl($color, 3, $amount); - } - protected static $libDarken = ['color', 'amount']; - protected function libDarken($args) - { - $color = $this->assertColor($args[0], 'color'); - $amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%'); - return $this->adjustHsl($color, 3, -$amount); - } - protected static $libSaturate = [['color', 'amount'], ['amount']]; - protected function libSaturate($args) - { - $value = $args[0]; - if (\count($args) === 1) { - $this->assertNumber($args[0], 'amount'); - return null; - } - $color = $this->assertColor($args[0], 'color'); - $amount = $this->assertNumber($args[1], 'amount'); - return $this->adjustHsl($color, 2, $amount->valueInRange(0, 100, 'amount')); - } - protected static $libDesaturate = ['color', 'amount']; - protected function libDesaturate($args) - { - $color = $this->assertColor($args[0], 'color'); - $amount = $this->assertNumber($args[1], 'amount'); - return $this->adjustHsl($color, 2, -$amount->valueInRange(0, 100, 'amount')); - } - protected static $libGrayscale = ['color']; - protected function libGrayscale($args) - { - $value = $args[0]; - if ($value instanceof Number) { - return null; - } - return $this->adjustHsl($this->assertColor($value, 'color'), 2, -100); - } - protected static $libComplement = ['color']; - protected function libComplement($args) - { - return $this->adjustHsl($this->assertColor($args[0], 'color'), 1, 180); - } - protected static $libInvert = ['color', 'weight:100%']; - protected function libInvert($args) - { - $value = $args[0]; - $weight = $this->assertNumber($args[1], 'weight'); - if ($value instanceof Number) { - if ($weight->getDimension() != 100 || !$weight->hasUnit('%')) { - throw new SassScriptException('Only one argument may be passed to the plain-CSS invert() function.'); - } - return null; - } - $color = $this->assertColor($value, 'color'); - $inverted = $color; - $inverted[1] = 255 - $inverted[1]; - $inverted[2] = 255 - $inverted[2]; - $inverted[3] = 255 - $inverted[3]; - return $this->libMix([$inverted, $color, $weight]); - } - // increases opacity by amount - protected static $libOpacify = ['color', 'amount']; - protected function libOpacify($args) - { - $color = $this->assertColor($args[0], 'color'); - $amount = $this->assertNumber($args[1], 'amount'); - $color[4] = (isset($color[4]) ? $color[4] : 1) + $amount->valueInRangeWithUnit(0, 1, 'amount', ''); - $color[4] = \min(1, \max(0, $color[4])); - return $color; - } - protected static $libFadeIn = ['color', 'amount']; - protected function libFadeIn($args) - { - return $this->libOpacify($args); - } - // decreases opacity by amount - protected static $libTransparentize = ['color', 'amount']; - protected function libTransparentize($args) - { - $color = $this->assertColor($args[0], 'color'); - $amount = $this->assertNumber($args[1], 'amount'); - $color[4] = (isset($color[4]) ? $color[4] : 1) - $amount->valueInRangeWithUnit(0, 1, 'amount', ''); - $color[4] = \min(1, \max(0, $color[4])); - return $color; - } - protected static $libFadeOut = ['color', 'amount']; - protected function libFadeOut($args) - { - return $this->libTransparentize($args); - } - protected static $libUnquote = ['string']; - protected function libUnquote($args) - { - try { - $str = $this->assertString($args[0], 'string'); - } catch (SassScriptException $e) { - $value = $this->compileValue($args[0]); - $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); - $line = $this->sourceLine; - $message = "Passing {$value}, a non-string value, to unquote()\nwill be an error in future versions of Sass.\n on line {$line} of {$fname}"; - $this->logger->warn($message, \true); - return $args[0]; - } - $str[1] = ''; - return $str; - } - protected static $libQuote = ['string']; - protected function libQuote($args) - { - $value = $this->assertString($args[0], 'string'); - $value[1] = '"'; - return $value; - } - protected static $libPercentage = ['number']; - protected function libPercentage($args) - { - $num = $this->assertNumber($args[0], 'number'); - $num->assertNoUnits('number'); - return new Number($num->getDimension() * 100, '%'); - } - protected static $libRound = ['number']; - protected function libRound($args) - { - $num = $this->assertNumber($args[0], 'number'); - return new Number(\round($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); - } - protected static $libFloor = ['number']; - protected function libFloor($args) - { - $num = $this->assertNumber($args[0], 'number'); - return new Number(\floor($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); - } - protected static $libCeil = ['number']; - protected function libCeil($args) - { - $num = $this->assertNumber($args[0], 'number'); - return new Number(\ceil($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); - } - protected static $libAbs = ['number']; - protected function libAbs($args) - { - $num = $this->assertNumber($args[0], 'number'); - return new Number(\abs($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); - } - protected static $libMin = ['numbers...']; - protected function libMin($args) - { - /** - * @var Number|null - */ - $min = null; - foreach ($args[0][2] as $arg) { - $number = $this->assertNumber($arg); - if (\is_null($min) || $min->greaterThan($number)) { - $min = $number; - } - } - if (!\is_null($min)) { - return $min; - } - throw $this->error('At least one argument must be passed.'); - } - protected static $libMax = ['numbers...']; - protected function libMax($args) - { - /** - * @var Number|null - */ - $max = null; - foreach ($args[0][2] as $arg) { - $number = $this->assertNumber($arg); - if (\is_null($max) || $max->lessThan($number)) { - $max = $number; - } - } - if (!\is_null($max)) { - return $max; - } - throw $this->error('At least one argument must be passed.'); - } - protected static $libLength = ['list']; - protected function libLength($args) - { - $list = $this->coerceList($args[0], ',', \true); - return new Number(\count($list[2]), ''); - } - protected static $libListSeparator = ['list']; - protected function libListSeparator($args) - { - if (!\in_array($args[0][0], [Type::T_LIST, Type::T_MAP])) { - return [Type::T_KEYWORD, 'space']; - } - $list = $this->coerceList($args[0]); - if ($list[1] === '' && \count($list[2]) <= 1 && empty($list['enclosing'])) { - return [Type::T_KEYWORD, 'space']; - } - if ($list[1] === ',') { - return [Type::T_KEYWORD, 'comma']; - } - if ($list[1] === '/') { - return [Type::T_KEYWORD, 'slash']; - } - return [Type::T_KEYWORD, 'space']; - } - protected static $libNth = ['list', 'n']; - protected function libNth($args) - { - $list = $this->coerceList($args[0], ',', \false); - $n = $this->assertInteger($args[1]); - if ($n > 0) { - $n--; - } elseif ($n < 0) { - $n += \count($list[2]); - } - return isset($list[2][$n]) ? $list[2][$n] : static::$defaultValue; - } - protected static $libSetNth = ['list', 'n', 'value']; - protected function libSetNth($args) - { - $list = $this->coerceList($args[0]); - $n = $this->assertInteger($args[1]); - if ($n > 0) { - $n--; - } elseif ($n < 0) { - $n += \count($list[2]); - } - if (!isset($list[2][$n])) { - throw $this->error('Invalid argument for "n"'); - } - $list[2][$n] = $args[2]; - return $list; - } - protected static $libMapGet = ['map', 'key', 'keys...']; - protected function libMapGet($args) - { - $map = $this->assertMap($args[0], 'map'); - if (!isset($args[2])) { - // BC layer for usages of the function from PHP code rather than from the Sass function - $args[2] = self::$emptyArgumentList; - } - $keys = \array_merge([$args[1]], $args[2][2]); - $value = static::$null; - foreach ($keys as $key) { - if (!\is_array($map) || $map[0] !== Type::T_MAP) { - return static::$null; - } - $map = $this->mapGet($map, $key); - if ($map === null) { - return static::$null; - } - $value = $map; - } - return $value; - } - /** - * Gets the value corresponding to that key in the map - * - * @param array $map - * @param Number|array $key - * - * @return Number|array|null - */ - private function mapGet(array $map, $key) - { - $index = $this->mapGetEntryIndex($map, $key); - if ($index !== null) { - return $map[2][$index]; - } - return null; - } - /** - * Gets the index corresponding to that key in the map entries - * - * @param array $map - * @param Number|array $key - * - * @return int|null - */ - private function mapGetEntryIndex(array $map, $key) - { - $key = $this->compileStringContent($this->coerceString($key)); - for ($i = \count($map[1]) - 1; $i >= 0; $i--) { - if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) { - return $i; - } - } - return null; - } - protected static $libMapKeys = ['map']; - protected function libMapKeys($args) - { - $map = $this->assertMap($args[0], 'map'); - $keys = $map[1]; - return [Type::T_LIST, ',', $keys]; - } - protected static $libMapValues = ['map']; - protected function libMapValues($args) - { - $map = $this->assertMap($args[0], 'map'); - $values = $map[2]; - return [Type::T_LIST, ',', $values]; - } - protected static $libMapRemove = [['map'], ['map', 'key', 'keys...']]; - protected function libMapRemove($args) - { - $map = $this->assertMap($args[0], 'map'); - if (\count($args) === 1) { - return $map; - } - $keys = []; - $keys[] = $this->compileStringContent($this->coerceString($args[1])); - foreach ($args[2][2] as $key) { - $keys[] = $this->compileStringContent($this->coerceString($key)); - } - for ($i = \count($map[1]) - 1; $i >= 0; $i--) { - if (\in_array($this->compileStringContent($this->coerceString($map[1][$i])), $keys)) { - \array_splice($map[1], $i, 1); - \array_splice($map[2], $i, 1); - } - } - return $map; - } - protected static $libMapHasKey = ['map', 'key', 'keys...']; - protected function libMapHasKey($args) - { - $map = $this->assertMap($args[0], 'map'); - if (!isset($args[2])) { - // BC layer for usages of the function from PHP code rather than from the Sass function - $args[2] = self::$emptyArgumentList; - } - $keys = \array_merge([$args[1]], $args[2][2]); - $lastKey = \array_pop($keys); - foreach ($keys as $key) { - $value = $this->mapGet($map, $key); - if ($value === null || $value instanceof Number || $value[0] !== Type::T_MAP) { - return self::$false; - } - $map = $value; - } - return $this->toBool($this->mapHasKey($map, $lastKey)); - } - /** - * @param array|Number $keyValue - * - * @return bool - */ - private function mapHasKey(array $map, $keyValue) - { - $key = $this->compileStringContent($this->coerceString($keyValue)); - for ($i = \count($map[1]) - 1; $i >= 0; $i--) { - if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) { - return \true; - } - } - return \false; - } - protected static $libMapMerge = [['map1', 'map2'], ['map-1', 'map-2'], ['map1', 'args...']]; - protected function libMapMerge($args) - { - $map1 = $this->assertMap($args[0], 'map1'); - $map2 = $args[1]; - $keys = []; - if ($map2[0] === Type::T_LIST && isset($map2[3]) && \is_array($map2[3])) { - // This is an argument list for the variadic signature - if (\count($map2[2]) === 0) { - throw new SassScriptException('Expected $args to contain a key.'); - } - if (\count($map2[2]) === 1) { - throw new SassScriptException('Expected $args to contain a value.'); - } - $keys = $map2[2]; - $map2 = \array_pop($keys); - } - $map2 = $this->assertMap($map2, 'map2'); - return $this->modifyMap($map1, $keys, function ($oldValue) use($map2) { - $nestedMap = $this->tryMap($oldValue); - if ($nestedMap === null) { - return $map2; - } - return $this->mergeMaps($nestedMap, $map2); - }); - } - /** - * @param array $map - * @param array $keys - * @param callable $modify - * @param bool $addNesting - * - * @return Number|array - * - * @phpstan-param array $keys - * @phpstan-param callable(Number|array): (Number|array) $modify - */ - private function modifyMap(array $map, array $keys, callable $modify, $addNesting = \true) - { - if ($keys === []) { - return $modify($map); - } - return $this->modifyNestedMap($map, $keys, $modify, $addNesting); - } - /** - * @param array $map - * @param array $keys - * @param callable $modify - * @param bool $addNesting - * - * @return array - * - * @phpstan-param non-empty-array $keys - * @phpstan-param callable(Number|array): (Number|array) $modify - */ - private function modifyNestedMap(array $map, array $keys, callable $modify, $addNesting) - { - $key = \array_shift($keys); - $nestedValueIndex = $this->mapGetEntryIndex($map, $key); - if ($keys === []) { - if ($nestedValueIndex !== null) { - $map[2][$nestedValueIndex] = $modify($map[2][$nestedValueIndex]); - } else { - $map[1][] = $key; - $map[2][] = $modify(self::$null); - } - return $map; - } - $nestedMap = $nestedValueIndex !== null ? $this->tryMap($map[2][$nestedValueIndex]) : null; - if ($nestedMap === null && !$addNesting) { - return $map; - } - if ($nestedMap === null) { - $nestedMap = self::$emptyMap; - } - $newNestedMap = $this->modifyNestedMap($nestedMap, $keys, $modify, $addNesting); - if ($nestedValueIndex !== null) { - $map[2][$nestedValueIndex] = $newNestedMap; - } else { - $map[1][] = $key; - $map[2][] = $newNestedMap; - } - return $map; - } - /** - * Merges 2 Sass maps together - * - * @param array $map1 - * @param array $map2 - * - * @return array - */ - private function mergeMaps(array $map1, array $map2) - { - foreach ($map2[1] as $i2 => $key2) { - $map1EntryIndex = $this->mapGetEntryIndex($map1, $key2); - if ($map1EntryIndex !== null) { - $map1[2][$map1EntryIndex] = $map2[2][$i2]; - continue; - } - $map1[1][] = $key2; - $map1[2][] = $map2[2][$i2]; - } - return $map1; - } - protected static $libKeywords = ['args']; - protected function libKeywords($args) - { - $value = $args[0]; - if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) { - $compiledValue = $this->compileValue($value); - throw SassScriptException::forArgument($compiledValue . ' is not an argument list.', 'args'); - } - $keys = []; - $values = []; - foreach ($this->getArgumentListKeywords($value) as $name => $arg) { - $keys[] = [Type::T_KEYWORD, $name]; - $values[] = $arg; - } - return [Type::T_MAP, $keys, $values]; - } - protected static $libIsBracketed = ['list']; - protected function libIsBracketed($args) - { - $list = $args[0]; - $this->coerceList($list, ' '); - if (!empty($list['enclosing']) && $list['enclosing'] === 'bracket') { - return self::$true; - } - return self::$false; - } - /** - * @param array $list1 - * @param array|Number|null $sep - * - * @return string - * @throws CompilerException - * - * @deprecated - */ - protected function listSeparatorForJoin($list1, $sep) - { - @\trigger_error(\sprintf('The "%s" method is deprecated.', __METHOD__), \E_USER_DEPRECATED); - if (!isset($sep)) { - return $list1[1]; - } - switch ($this->compileValue($sep)) { - case 'comma': - return ','; - case 'space': - return ' '; - default: - return $list1[1]; - } - } - protected static $libJoin = ['list1', 'list2', 'separator:auto', 'bracketed:auto']; - protected function libJoin($args) - { - list($list1, $list2, $sep, $bracketed) = $args; - $list1 = $this->coerceList($list1, ' ', \true); - $list2 = $this->coerceList($list2, ' ', \true); - switch ($this->compileStringContent($this->assertString($sep, 'separator'))) { - case 'comma': - $separator = ','; - break; - case 'space': - $separator = ' '; - break; - case 'slash': - $separator = '/'; - break; - case 'auto': - if ($list1[1] !== '' || \count($list1[2]) > 1 || !empty($list1['enclosing']) && $list1['enclosing'] !== 'parent') { - $separator = $list1[1] ?: ' '; - } elseif ($list2[1] !== '' || \count($list2[2]) > 1 || !empty($list2['enclosing']) && $list2['enclosing'] !== 'parent') { - $separator = $list2[1] ?: ' '; - } else { - $separator = ' '; - } - break; - default: - throw SassScriptException::forArgument('Must be "space", "comma", "slash", or "auto".', 'separator'); - } - if ($bracketed === static::$true) { - $bracketed = \true; - } elseif ($bracketed === static::$false) { - $bracketed = \false; - } elseif ($bracketed === [Type::T_KEYWORD, 'auto']) { - $bracketed = 'auto'; - } elseif ($bracketed === static::$null) { - $bracketed = \false; - } else { - $bracketed = $this->compileValue($bracketed); - $bracketed = !!$bracketed; - if ($bracketed === \true) { - $bracketed = \true; - } - } - if ($bracketed === 'auto') { - $bracketed = \false; - if (!empty($list1['enclosing']) && $list1['enclosing'] === 'bracket') { - $bracketed = \true; - } - } - $res = [Type::T_LIST, $separator, \array_merge($list1[2], $list2[2])]; - if ($bracketed) { - $res['enclosing'] = 'bracket'; - } - return $res; - } - protected static $libAppend = ['list', 'val', 'separator:auto']; - protected function libAppend($args) - { - list($list1, $value, $sep) = $args; - $list1 = $this->coerceList($list1, ' ', \true); - switch ($this->compileStringContent($this->assertString($sep, 'separator'))) { - case 'comma': - $separator = ','; - break; - case 'space': - $separator = ' '; - break; - case 'slash': - $separator = '/'; - break; - case 'auto': - $separator = $list1[1] === '' && \count($list1[2]) <= 1 && (empty($list1['enclosing']) || $list1['enclosing'] === 'parent') ? ' ' : $list1[1]; - break; - default: - throw SassScriptException::forArgument('Must be "space", "comma", "slash", or "auto".', 'separator'); - } - $res = [Type::T_LIST, $separator, \array_merge($list1[2], [$value])]; - if (isset($list1['enclosing'])) { - $res['enclosing'] = $list1['enclosing']; - } - return $res; - } - protected static $libZip = ['lists...']; - protected function libZip($args) - { - $argLists = []; - foreach ($args[0][2] as $arg) { - $argLists[] = $this->coerceList($arg); - } - $lists = []; - $firstList = \array_shift($argLists); - $result = [Type::T_LIST, ',', $lists]; - if (!\is_null($firstList)) { - foreach ($firstList[2] as $key => $item) { - $list = [Type::T_LIST, ' ', [$item]]; - foreach ($argLists as $arg) { - if (isset($arg[2][$key])) { - $list[2][] = $arg[2][$key]; - } else { - break 2; - } - } - $lists[] = $list; - } - $result[2] = $lists; - } else { - $result['enclosing'] = 'parent'; - } - return $result; - } - protected static $libTypeOf = ['value']; - protected function libTypeOf($args) - { - $value = $args[0]; - return [Type::T_KEYWORD, $this->getTypeOf($value)]; - } - /** - * @param array|Number $value - * - * @return string - */ - private function getTypeOf($value) - { - switch ($value[0]) { - case Type::T_KEYWORD: - if ($value === static::$true || $value === static::$false) { - return 'bool'; - } - if ($this->coerceColor($value)) { - return 'color'; - } - // fall-thru - case Type::T_FUNCTION: - return 'string'; - case Type::T_FUNCTION_REFERENCE: - return 'function'; - case Type::T_LIST: - if (isset($value[3]) && \is_array($value[3])) { - return 'arglist'; - } - // fall-thru - default: - return $value[0]; - } - } - protected static $libUnit = ['number']; - protected function libUnit($args) - { - $num = $this->assertNumber($args[0], 'number'); - return [Type::T_STRING, '"', [$num->unitStr()]]; - } - protected static $libUnitless = ['number']; - protected function libUnitless($args) - { - $value = $this->assertNumber($args[0], 'number'); - return $this->toBool($value->unitless()); - } - protected static $libComparable = [['number1', 'number2'], ['number-1', 'number-2']]; - protected function libComparable($args) - { - list($number1, $number2) = $args; - if (!$number1 instanceof Number || !$number2 instanceof Number) { - throw $this->error('Invalid argument(s) for "comparable"'); - } - return $this->toBool($number1->isComparableTo($number2)); - } - protected static $libStrIndex = ['string', 'substring']; - protected function libStrIndex($args) - { - $string = $this->assertString($args[0], 'string'); - $stringContent = $this->compileStringContent($string); - $substring = $this->assertString($args[1], 'substring'); - $substringContent = $this->compileStringContent($substring); - if (!\strlen($substringContent)) { - $result = 0; - } else { - $result = Util::mbStrpos($stringContent, $substringContent); - } - return $result === \false ? static::$null : new Number($result + 1, ''); - } - protected static $libStrInsert = ['string', 'insert', 'index']; - protected function libStrInsert($args) - { - $string = $this->assertString($args[0], 'string'); - $stringContent = $this->compileStringContent($string); - $insert = $this->assertString($args[1], 'insert'); - $insertContent = $this->compileStringContent($insert); - $index = $this->assertInteger($args[2], 'index'); - if ($index > 0) { - $index = $index - 1; - } - if ($index < 0) { - $index = \max(Util::mbStrlen($stringContent) + 1 + $index, 0); - } - $string[2] = [Util::mbSubstr($stringContent, 0, $index), $insertContent, Util::mbSubstr($stringContent, $index)]; - return $string; - } - protected static $libStrLength = ['string']; - protected function libStrLength($args) - { - $string = $this->assertString($args[0], 'string'); - $stringContent = $this->compileStringContent($string); - return new Number(Util::mbStrlen($stringContent), ''); - } - protected static $libStrSlice = ['string', 'start-at', 'end-at:-1']; - protected function libStrSlice($args) - { - $string = $this->assertString($args[0], 'string'); - $stringContent = $this->compileStringContent($string); - $start = $this->assertNumber($args[1], 'start-at'); - $start->assertNoUnits('start-at'); - $startInt = $this->assertInteger($start, 'start-at'); - $end = $this->assertNumber($args[2], 'end-at'); - $end->assertNoUnits('end-at'); - $endInt = $this->assertInteger($end, 'end-at'); - if ($endInt === 0) { - return [Type::T_STRING, $string[1], []]; - } - if ($startInt > 0) { - $startInt--; - } - if ($endInt < 0) { - $endInt = Util::mbStrlen($stringContent) + $endInt; - } else { - $endInt--; - } - if ($endInt < $startInt) { - return [Type::T_STRING, $string[1], []]; - } - $length = $endInt - $startInt + 1; - // The end of the slice is inclusive - $string[2] = [Util::mbSubstr($stringContent, $startInt, $length)]; - return $string; - } - protected static $libToLowerCase = ['string']; - protected function libToLowerCase($args) - { - $string = $this->assertString($args[0], 'string'); - $stringContent = $this->compileStringContent($string); - $string[2] = [$this->stringTransformAsciiOnly($stringContent, 'strtolower')]; - return $string; - } - protected static $libToUpperCase = ['string']; - protected function libToUpperCase($args) - { - $string = $this->assertString($args[0], 'string'); - $stringContent = $this->compileStringContent($string); - $string[2] = [$this->stringTransformAsciiOnly($stringContent, 'strtoupper')]; - return $string; - } - /** - * Apply a filter on a string content, only on ascii chars - * let extended chars untouched - * - * @param string $stringContent - * @param callable $filter - * @return string - */ - protected function stringTransformAsciiOnly($stringContent, $filter) - { - $mblength = Util::mbStrlen($stringContent); - if ($mblength === \strlen($stringContent)) { - return $filter($stringContent); - } - $filteredString = ""; - for ($i = 0; $i < $mblength; $i++) { - $char = Util::mbSubstr($stringContent, $i, 1); - if (\strlen($char) > 1) { - $filteredString .= $char; - } else { - $filteredString .= $filter($char); - } - } - return $filteredString; - } - protected static $libFeatureExists = ['feature']; - protected function libFeatureExists($args) - { - $string = $this->assertString($args[0], 'feature'); - $name = $this->compileStringContent($string); - return $this->toBool(\array_key_exists($name, $this->registeredFeatures) ? $this->registeredFeatures[$name] : \false); - } - protected static $libFunctionExists = ['name']; - protected function libFunctionExists($args) - { - $string = $this->assertString($args[0], 'name'); - $name = $this->compileStringContent($string); - // user defined functions - if ($this->has(static::$namespaces['function'] . $name)) { - return self::$true; - } - $name = $this->normalizeName($name); - if (isset($this->userFunctions[$name])) { - return self::$true; - } - // built-in functions - $f = $this->getBuiltinFunction($name); - return $this->toBool(\is_callable($f)); - } - protected static $libGlobalVariableExists = ['name']; - protected function libGlobalVariableExists($args) - { - $string = $this->assertString($args[0], 'name'); - $name = $this->compileStringContent($string); - return $this->toBool($this->has($name, $this->rootEnv)); - } - protected static $libMixinExists = ['name']; - protected function libMixinExists($args) - { - $string = $this->assertString($args[0], 'name'); - $name = $this->compileStringContent($string); - return $this->toBool($this->has(static::$namespaces['mixin'] . $name)); - } - protected static $libVariableExists = ['name']; - protected function libVariableExists($args) - { - $string = $this->assertString($args[0], 'name'); - $name = $this->compileStringContent($string); - return $this->toBool($this->has($name)); - } - protected static $libCounter = ['args...']; - /** - * Workaround IE7's content counter bug. - * - * @param array $args - * - * @return array - */ - protected function libCounter($args) - { - $list = \array_map([$this, 'compileValue'], $args[0][2]); - return [Type::T_STRING, '', ['counter(' . \implode(',', $list) . ')']]; - } - protected static $libRandom = ['limit:null']; - protected function libRandom($args) - { - if (isset($args[0]) && $args[0] !== static::$null) { - $limit = $this->assertNumber($args[0], 'limit'); - if ($limit->hasUnits()) { - $unitString = $limit->unitStr(); - $message = <<addLocationToMessage($message)); - } - $n = $this->assertInteger($limit, 'limit'); - if ($n < 1) { - throw new SassScriptException("\$limit: Must be greater than 0, was {$n}."); - } - return new Number(\mt_rand(1, $n), ''); - } - $max = \mt_getrandmax(); - return new Number(\mt_rand(0, $max - 1) / $max, ''); - } - protected static $libUniqueId = []; - protected function libUniqueId() - { - static $id; - if (!isset($id)) { - $id = \PHP_INT_SIZE === 4 ? \mt_rand(0, \pow(36, 5)) . \str_pad(\mt_rand(0, \pow(36, 5)) % 10000000, 7, '0', \STR_PAD_LEFT) : \mt_rand(0, \pow(36, 8)); - } - $id += \mt_rand(0, 10) + 1; - return [Type::T_STRING, '', ['u' . \str_pad(\base_convert($id, 10, 36), 8, '0', \STR_PAD_LEFT)]]; - } - /** - * @param array|Number $value - * @param bool $force_enclosing_display - * - * @return array - */ - protected function inspectFormatValue($value, $force_enclosing_display = \false) - { - if ($value === static::$null) { - $value = [Type::T_KEYWORD, 'null']; - } - $stringValue = [$value]; - if ($value instanceof Number) { - return [Type::T_STRING, '', $stringValue]; - } - if ($value[0] === Type::T_LIST) { - if (\end($value[2]) === static::$null) { - \array_pop($value[2]); - $value[2][] = [Type::T_STRING, '', ['']]; - $force_enclosing_display = \true; - } - if (!empty($value['enclosing']) && ($force_enclosing_display || $value['enclosing'] === 'bracket' || !\count($value[2]))) { - $value['enclosing'] = 'forced_' . $value['enclosing']; - $force_enclosing_display = \true; - } elseif (!\count($value[2])) { - $value['enclosing'] = 'forced_parent'; - } - foreach ($value[2] as $k => $listelement) { - $value[2][$k] = $this->inspectFormatValue($listelement, $force_enclosing_display); - } - $stringValue = [$value]; - } - return [Type::T_STRING, '', $stringValue]; - } - protected static $libInspect = ['value']; - protected function libInspect($args) - { - $value = $args[0]; - return $this->inspectFormatValue($value); - } - /** - * Preprocess selector args - * - * @param array $arg - * @param string|null $varname - * @param bool $allowParent - * - * @return array - */ - protected function getSelectorArg($arg, $varname = null, $allowParent = \false) - { - static $parser = null; - if (\is_null($parser)) { - $parser = $this->parserFactory(__METHOD__); - } - if (!$this->checkSelectorArgType($arg)) { - $var_value = $this->compileValue($arg); - throw SassScriptException::forArgument("{$var_value} is not a valid selector: it must be a string, a list of strings, or a list of lists of strings", $varname); - } - if ($arg[0] === Type::T_STRING) { - $arg[1] = ''; - } - $arg = $this->compileValue($arg); - $parsedSelector = []; - if ($parser->parseSelector($arg, $parsedSelector, \true)) { - $selector = $this->evalSelectors($parsedSelector); - $gluedSelector = $this->glueFunctionSelectors($selector); - if (!$allowParent) { - foreach ($gluedSelector as $selector) { - foreach ($selector as $s) { - if (\in_array(static::$selfSelector, $s)) { - throw SassScriptException::forArgument("Parent selectors aren't allowed here.", $varname); - } - } - } - } - return $gluedSelector; - } - throw SassScriptException::forArgument("expected more input, invalid selector.", $varname); - } - /** - * Check variable type for getSelectorArg() function - * @param array $arg - * @param int $maxDepth - * @return bool - */ - protected function checkSelectorArgType($arg, $maxDepth = 2) - { - if ($arg[0] === Type::T_LIST && $maxDepth > 0) { - foreach ($arg[2] as $elt) { - if (!$this->checkSelectorArgType($elt, $maxDepth - 1)) { - return \false; - } - } - return \true; - } - if (!\in_array($arg[0], [Type::T_STRING, Type::T_KEYWORD])) { - return \false; - } - return \true; - } - /** - * Postprocess selector to output in right format - * - * @param array $selectors - * - * @return array - */ - protected function formatOutputSelector($selectors) - { - $selectors = $this->collapseSelectorsAsList($selectors); - return $selectors; - } - protected static $libIsSuperselector = ['super', 'sub']; - protected function libIsSuperselector($args) - { - list($super, $sub) = $args; - $super = $this->getSelectorArg($super, 'super'); - $sub = $this->getSelectorArg($sub, 'sub'); - return $this->toBool($this->isSuperSelector($super, $sub)); - } - /** - * Test a $super selector again $sub - * - * @param array $super - * @param array $sub - * - * @return bool - */ - protected function isSuperSelector($super, $sub) - { - // one and only one selector for each arg - if (!$super) { - throw $this->error('Invalid super selector for isSuperSelector()'); - } - if (!$sub) { - throw $this->error('Invalid sub selector for isSuperSelector()'); - } - if (\count($sub) > 1) { - foreach ($sub as $s) { - if (!$this->isSuperSelector($super, [$s])) { - return \false; - } - } - return \true; - } - if (\count($super) > 1) { - foreach ($super as $s) { - if ($this->isSuperSelector([$s], $sub)) { - return \true; - } - } - return \false; - } - $super = \reset($super); - $sub = \reset($sub); - $i = 0; - $nextMustMatch = \false; - foreach ($super as $node) { - $compound = ''; - \array_walk_recursive($node, function ($value, $key) use(&$compound) { - $compound .= $value; - }); - if ($this->isImmediateRelationshipCombinator($compound)) { - if ($node !== $sub[$i]) { - return \false; - } - $nextMustMatch = \true; - $i++; - } else { - while ($i < \count($sub) && !$this->isSuperPart($node, $sub[$i])) { - if ($nextMustMatch) { - return \false; - } - $i++; - } - if ($i >= \count($sub)) { - return \false; - } - $nextMustMatch = \false; - $i++; - } - } - return \true; - } - /** - * Test a part of super selector again a part of sub selector - * - * @param array $superParts - * @param array $subParts - * - * @return bool - */ - protected function isSuperPart($superParts, $subParts) - { - $i = 0; - foreach ($superParts as $superPart) { - while ($i < \count($subParts) && $subParts[$i] !== $superPart) { - $i++; - } - if ($i >= \count($subParts)) { - return \false; - } - $i++; - } - return \true; - } - protected static $libSelectorAppend = ['selector...']; - protected function libSelectorAppend($args) - { - // get the selector... list - $args = \reset($args); - $args = $args[2]; - if (\count($args) < 1) { - throw $this->error('selector-append() needs at least 1 argument'); - } - $selectors = []; - foreach ($args as $arg) { - $selectors[] = $this->getSelectorArg($arg, 'selector'); - } - return $this->formatOutputSelector($this->selectorAppend($selectors)); - } - /** - * Append parts of the last selector in the list to the previous, recursively - * - * @param array $selectors - * - * @return array - * - * @throws \ScssPhp\ScssPhp\Exception\CompilerException - */ - protected function selectorAppend($selectors) - { - $lastSelectors = \array_pop($selectors); - if (!$lastSelectors) { - throw $this->error('Invalid selector list in selector-append()'); - } - while (\count($selectors)) { - $previousSelectors = \array_pop($selectors); - if (!$previousSelectors) { - throw $this->error('Invalid selector list in selector-append()'); - } - // do the trick, happening $lastSelector to $previousSelector - $appended = []; - foreach ($previousSelectors as $previousSelector) { - foreach ($lastSelectors as $lastSelector) { - $previous = $previousSelector; - foreach ($previousSelector as $j => $previousSelectorParts) { - foreach ($lastSelector as $lastSelectorParts) { - foreach ($lastSelectorParts as $lastSelectorPart) { - $previous[$j][] = $lastSelectorPart; - } - } - } - $appended[] = $previous; - } - } - $lastSelectors = $appended; - } - return $lastSelectors; - } - protected static $libSelectorExtend = [['selector', 'extendee', 'extender'], ['selectors', 'extendee', 'extender']]; - protected function libSelectorExtend($args) - { - list($selectors, $extendee, $extender) = $args; - $selectors = $this->getSelectorArg($selectors, 'selector'); - $extendee = $this->getSelectorArg($extendee, 'extendee'); - $extender = $this->getSelectorArg($extender, 'extender'); - if (!$selectors || !$extendee || !$extender) { - throw $this->error('selector-extend() invalid arguments'); - } - $extended = $this->extendOrReplaceSelectors($selectors, $extendee, $extender); - return $this->formatOutputSelector($extended); - } - protected static $libSelectorReplace = [['selector', 'original', 'replacement'], ['selectors', 'original', 'replacement']]; - protected function libSelectorReplace($args) - { - list($selectors, $original, $replacement) = $args; - $selectors = $this->getSelectorArg($selectors, 'selector'); - $original = $this->getSelectorArg($original, 'original'); - $replacement = $this->getSelectorArg($replacement, 'replacement'); - if (!$selectors || !$original || !$replacement) { - throw $this->error('selector-replace() invalid arguments'); - } - $replaced = $this->extendOrReplaceSelectors($selectors, $original, $replacement, \true); - return $this->formatOutputSelector($replaced); - } - /** - * Extend/replace in selectors - * used by selector-extend and selector-replace that use the same logic - * - * @param array $selectors - * @param array $extendee - * @param array $extender - * @param bool $replace - * - * @return array - */ - protected function extendOrReplaceSelectors($selectors, $extendee, $extender, $replace = \false) - { - $saveExtends = $this->extends; - $saveExtendsMap = $this->extendsMap; - $this->extends = []; - $this->extendsMap = []; - foreach ($extendee as $es) { - if (\count($es) !== 1) { - throw $this->error('Can\'t extend complex selector.'); - } - // only use the first one - $this->pushExtends(\reset($es), $extender, null); - } - $extended = []; - foreach ($selectors as $selector) { - if (!$replace) { - $extended[] = $selector; - } - $n = \count($extended); - $this->matchExtends($selector, $extended); - // if didnt match, keep the original selector if we are in a replace operation - if ($replace && \count($extended) === $n) { - $extended[] = $selector; - } - } - $this->extends = $saveExtends; - $this->extendsMap = $saveExtendsMap; - return $extended; - } - protected static $libSelectorNest = ['selector...']; - protected function libSelectorNest($args) - { - // get the selector... list - $args = \reset($args); - $args = $args[2]; - if (\count($args) < 1) { - throw $this->error('selector-nest() needs at least 1 argument'); - } - $selectorsMap = []; - foreach ($args as $arg) { - $selectorsMap[] = $this->getSelectorArg($arg, 'selector', \true); - } - \assert(!empty($selectorsMap)); - $envs = []; - foreach ($selectorsMap as $selectors) { - $env = new Environment(); - $env->selectors = $selectors; - $envs[] = $env; - } - $envs = \array_reverse($envs); - $env = $this->extractEnv($envs); - $outputSelectors = $this->multiplySelectors($env); - return $this->formatOutputSelector($outputSelectors); - } - protected static $libSelectorParse = [['selector'], ['selectors']]; - protected function libSelectorParse($args) - { - $selectors = \reset($args); - $selectors = $this->getSelectorArg($selectors, 'selector'); - return $this->formatOutputSelector($selectors); - } - protected static $libSelectorUnify = ['selectors1', 'selectors2']; - protected function libSelectorUnify($args) - { - list($selectors1, $selectors2) = $args; - $selectors1 = $this->getSelectorArg($selectors1, 'selectors1'); - $selectors2 = $this->getSelectorArg($selectors2, 'selectors2'); - if (!$selectors1 || !$selectors2) { - throw $this->error('selector-unify() invalid arguments'); - } - // only consider the first compound of each - $compound1 = \reset($selectors1); - $compound2 = \reset($selectors2); - // unify them and that's it - $unified = $this->unifyCompoundSelectors($compound1, $compound2); - return $this->formatOutputSelector($unified); - } - /** - * The selector-unify magic as its best - * (at least works as expected on test cases) - * - * @param array $compound1 - * @param array $compound2 - * - * @return array - */ - protected function unifyCompoundSelectors($compound1, $compound2) - { - if (!\count($compound1)) { - return $compound2; - } - if (!\count($compound2)) { - return $compound1; - } - // check that last part are compatible - $lastPart1 = \array_pop($compound1); - $lastPart2 = \array_pop($compound2); - $last = $this->mergeParts($lastPart1, $lastPart2); - if (!$last) { - return [[]]; - } - $unifiedCompound = [$last]; - $unifiedSelectors = [$unifiedCompound]; - // do the rest - while (\count($compound1) || \count($compound2)) { - $part1 = \end($compound1); - $part2 = \end($compound2); - if ($part1 && ($match2 = $this->matchPartInCompound($part1, $compound2))) { - list($compound2, $part2, $after2) = $match2; - if ($after2) { - $unifiedSelectors = $this->prependSelectors($unifiedSelectors, $after2); - } - $c = $this->mergeParts($part1, $part2); - $unifiedSelectors = $this->prependSelectors($unifiedSelectors, [$c]); - $part1 = $part2 = null; - \array_pop($compound1); - } - if ($part2 && ($match1 = $this->matchPartInCompound($part2, $compound1))) { - list($compound1, $part1, $after1) = $match1; - if ($after1) { - $unifiedSelectors = $this->prependSelectors($unifiedSelectors, $after1); - } - $c = $this->mergeParts($part2, $part1); - $unifiedSelectors = $this->prependSelectors($unifiedSelectors, [$c]); - $part1 = $part2 = null; - \array_pop($compound2); - } - $new = []; - if ($part1 && $part2) { - \array_pop($compound1); - \array_pop($compound2); - $s = $this->prependSelectors($unifiedSelectors, [$part2]); - $new = \array_merge($new, $this->prependSelectors($s, [$part1])); - $s = $this->prependSelectors($unifiedSelectors, [$part1]); - $new = \array_merge($new, $this->prependSelectors($s, [$part2])); - } elseif ($part1) { - \array_pop($compound1); - $new = \array_merge($new, $this->prependSelectors($unifiedSelectors, [$part1])); - } elseif ($part2) { - \array_pop($compound2); - $new = \array_merge($new, $this->prependSelectors($unifiedSelectors, [$part2])); - } - if ($new) { - $unifiedSelectors = $new; - } - } - return $unifiedSelectors; - } - /** - * Prepend each selector from $selectors with $parts - * - * @param array $selectors - * @param array $parts - * - * @return array - */ - protected function prependSelectors($selectors, $parts) - { - $new = []; - foreach ($selectors as $compoundSelector) { - \array_unshift($compoundSelector, $parts); - $new[] = $compoundSelector; - } - return $new; - } - /** - * Try to find a matching part in a compound: - * - with same html tag name - * - with some class or id or something in common - * - * @param array $part - * @param array $compound - * - * @return array|false - */ - protected function matchPartInCompound($part, $compound) - { - $partTag = $this->findTagName($part); - $before = $compound; - $after = []; - // try to find a match by tag name first - while (\count($before)) { - $p = \array_pop($before); - if ($partTag && $partTag !== '*' && $partTag == $this->findTagName($p)) { - return [$before, $p, $after]; - } - $after[] = $p; - } - // try again matching a non empty intersection and a compatible tagname - $before = $compound; - $after = []; - while (\count($before)) { - $p = \array_pop($before); - if ($this->checkCompatibleTags($partTag, $this->findTagName($p))) { - if (\count(\array_intersect($part, $p))) { - return [$before, $p, $after]; - } - } - $after[] = $p; - } - return \false; - } - /** - * Merge two part list taking care that - * - the html tag is coming first - if any - * - the :something are coming last - * - * @param array $parts1 - * @param array $parts2 - * - * @return array - */ - protected function mergeParts($parts1, $parts2) - { - $tag1 = $this->findTagName($parts1); - $tag2 = $this->findTagName($parts2); - $tag = $this->checkCompatibleTags($tag1, $tag2); - // not compatible tags - if ($tag === \false) { - return []; - } - if ($tag) { - if ($tag1) { - $parts1 = \array_diff($parts1, [$tag1]); - } - if ($tag2) { - $parts2 = \array_diff($parts2, [$tag2]); - } - } - $mergedParts = \array_merge($parts1, $parts2); - $mergedOrderedParts = []; - foreach ($mergedParts as $part) { - if (\strpos($part, ':') === 0) { - $mergedOrderedParts[] = $part; - } - } - $mergedParts = \array_diff($mergedParts, $mergedOrderedParts); - $mergedParts = \array_merge($mergedParts, $mergedOrderedParts); - if ($tag) { - \array_unshift($mergedParts, $tag); - } - return $mergedParts; - } - /** - * Check the compatibility between two tag names: - * if both are defined they should be identical or one has to be '*' - * - * @param string $tag1 - * @param string $tag2 - * - * @return array|false - */ - protected function checkCompatibleTags($tag1, $tag2) - { - $tags = [$tag1, $tag2]; - $tags = \array_unique($tags); - $tags = \array_filter($tags); - if (\count($tags) > 1) { - $tags = \array_diff($tags, ['*']); - } - // not compatible nodes - if (\count($tags) > 1) { - return \false; - } - return $tags; - } - /** - * Find the html tag name in a selector parts list - * - * @param string[] $parts - * - * @return string - */ - protected function findTagName($parts) - { - foreach ($parts as $part) { - if (!\preg_match('/^[\\[.:#%_-]/', $part)) { - return $part; - } - } - return ''; - } - protected static $libSimpleSelectors = ['selector']; - protected function libSimpleSelectors($args) - { - $selector = \reset($args); - $selector = $this->getSelectorArg($selector, 'selector'); - // remove selectors list layer, keeping the first one - $selector = \reset($selector); - // remove parts list layer, keeping the first part - $part = \reset($selector); - $listParts = []; - foreach ($part as $p) { - $listParts[] = [Type::T_STRING, '', [$p]]; - } - return [Type::T_LIST, ',', $listParts]; - } - protected static $libScssphpGlob = ['pattern']; - protected function libScssphpGlob($args) - { - @\trigger_error(\sprintf('The "scssphp-glob" function is deprecated an will be removed in ScssPhp 2.0. Register your own alternative through "%s::registerFunction', __CLASS__), \E_USER_DEPRECATED); - $this->logger->warn('The "scssphp-glob" function is deprecated an will be removed in ScssPhp 2.0.', \true); - $string = $this->assertString($args[0], 'pattern'); - $pattern = $this->compileStringContent($string); - $matches = \glob($pattern); - $listParts = []; - foreach ($matches as $match) { - if (!\is_file($match)) { - continue; - } - $listParts[] = [Type::T_STRING, '"', [$match]]; - } - return [Type::T_LIST, ',', $listParts]; - } -} diff --git a/dependencies/scssphp/scssphp/src/Compiler/CachedResult.php b/dependencies/scssphp/scssphp/src/Compiler/CachedResult.php deleted file mode 100644 index 29a4b40..0000000 --- a/dependencies/scssphp/scssphp/src/Compiler/CachedResult.php +++ /dev/null @@ -1,69 +0,0 @@ - - */ - private $parsedFiles; - /** - * @var array - * @phpstan-var list - */ - private $resolvedImports; - /** - * @param CompilationResult $result - * @param array $parsedFiles - * @param array $resolvedImports - * - * @phpstan-param list $resolvedImports - */ - public function __construct(CompilationResult $result, array $parsedFiles, array $resolvedImports) - { - $this->result = $result; - $this->parsedFiles = $parsedFiles; - $this->resolvedImports = $resolvedImports; - } - /** - * @return CompilationResult - */ - public function getResult() - { - return $this->result; - } - /** - * @return array - */ - public function getParsedFiles() - { - return $this->parsedFiles; - } - /** - * @return array - * - * @phpstan-return list - */ - public function getResolvedImports() - { - return $this->resolvedImports; - } -} diff --git a/dependencies/scssphp/scssphp/src/Compiler/Environment.php b/dependencies/scssphp/scssphp/src/Compiler/Environment.php deleted file mode 100644 index d0bf40d..0000000 --- a/dependencies/scssphp/scssphp/src/Compiler/Environment.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * @internal - */ -class Environment -{ - /** - * @var \ScssPhp\ScssPhp\Block|null - */ - public $block; - /** - * @var \ScssPhp\ScssPhp\Compiler\Environment|null - */ - public $parent; - /** - * @var Environment|null - */ - public $declarationScopeParent; - /** - * @var Environment|null - */ - public $parentStore; - /** - * @var array|null - */ - public $selectors; - /** - * @var string|null - */ - public $marker; - /** - * @var array - */ - public $store; - /** - * @var array - */ - public $storeUnreduced; - /** - * @var int - */ - public $depth; -} diff --git a/dependencies/scssphp/scssphp/src/Exception/CompilerException.php b/dependencies/scssphp/scssphp/src/Exception/CompilerException.php deleted file mode 100644 index 36d3b7e..0000000 --- a/dependencies/scssphp/scssphp/src/Exception/CompilerException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * @internal - */ -class CompilerException extends \Exception implements SassException -{ -} diff --git a/dependencies/scssphp/scssphp/src/Exception/ParserException.php b/dependencies/scssphp/scssphp/src/Exception/ParserException.php deleted file mode 100644 index e4bbd78..0000000 --- a/dependencies/scssphp/scssphp/src/Exception/ParserException.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * @internal - */ -class ParserException extends \Exception implements SassException -{ - /** - * @var array|null - * @phpstan-var array{string, int, int}|null - */ - private $sourcePosition; - /** - * Get source position - * - * @api - * - * @return array|null - * @phpstan-return array{string, int, int}|null - */ - public function getSourcePosition() - { - return $this->sourcePosition; - } - /** - * Set source position - * - * @api - * - * @param array $sourcePosition - * - * @return void - * - * @phpstan-param array{string, int, int} $sourcePosition - */ - public function setSourcePosition($sourcePosition) - { - $this->sourcePosition = $sourcePosition; - } -} diff --git a/dependencies/scssphp/scssphp/src/Exception/RangeException.php b/dependencies/scssphp/scssphp/src/Exception/RangeException.php deleted file mode 100644 index e0b6c13..0000000 --- a/dependencies/scssphp/scssphp/src/Exception/RangeException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * @internal - */ -class RangeException extends \Exception implements SassException -{ -} diff --git a/dependencies/scssphp/scssphp/src/Exception/SassException.php b/dependencies/scssphp/scssphp/src/Exception/SassException.php deleted file mode 100644 index 18c36e3..0000000 --- a/dependencies/scssphp/scssphp/src/Exception/SassException.php +++ /dev/null @@ -1,7 +0,0 @@ - - * - * @deprecated The Scssphp server should define its own exception instead. - */ -class ServerException extends \Exception implements SassException -{ -} diff --git a/dependencies/scssphp/scssphp/src/Formatter.php b/dependencies/scssphp/scssphp/src/Formatter.php deleted file mode 100644 index 46c5d8a..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter.php +++ /dev/null @@ -1,313 +0,0 @@ - - * - * @internal - */ -abstract class Formatter -{ - /** - * @var int - */ - public $indentLevel; - /** - * @var string - */ - public $indentChar; - /** - * @var string - */ - public $break; - /** - * @var string - */ - public $open; - /** - * @var string - */ - public $close; - /** - * @var string - */ - public $tagSeparator; - /** - * @var string - */ - public $assignSeparator; - /** - * @var bool - */ - public $keepSemicolons; - /** - * @var \ScssPhp\ScssPhp\Formatter\OutputBlock - */ - protected $currentBlock; - /** - * @var int - */ - protected $currentLine; - /** - * @var int - */ - protected $currentColumn; - /** - * @var \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null - */ - protected $sourceMapGenerator; - /** - * @var string - */ - protected $strippedSemicolon; - /** - * Initialize formatter - * - * @api - */ - public abstract function __construct(); - /** - * Return indentation (whitespace) - * - * @return string - */ - protected function indentStr() - { - return ''; - } - /** - * Return property assignment - * - * @api - * - * @param string $name - * @param mixed $value - * - * @return string - */ - public function property($name, $value) - { - return \rtrim($name) . $this->assignSeparator . $value . ';'; - } - /** - * Return custom property assignment - * differs in that you have to keep spaces in the value as is - * - * @api - * - * @param string $name - * @param mixed $value - * - * @return string - */ - public function customProperty($name, $value) - { - return \rtrim($name) . \trim($this->assignSeparator) . $value . ';'; - } - /** - * Output lines inside a block - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * - * @return void - */ - protected function blockLines(OutputBlock $block) - { - $inner = $this->indentStr(); - $glue = $this->break . $inner; - $this->write($inner . \implode($glue, $block->lines)); - if (!empty($block->children)) { - $this->write($this->break); - } - } - /** - * Output block selectors - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * - * @return void - */ - protected function blockSelectors(OutputBlock $block) - { - \assert(!empty($block->selectors)); - $inner = $this->indentStr(); - $this->write($inner . \implode($this->tagSeparator, $block->selectors) . $this->open . $this->break); - } - /** - * Output block children - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * - * @return void - */ - protected function blockChildren(OutputBlock $block) - { - foreach ($block->children as $child) { - $this->block($child); - } - } - /** - * Output non-empty block - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * - * @return void - */ - protected function block(OutputBlock $block) - { - if (empty($block->lines) && empty($block->children)) { - return; - } - $this->currentBlock = $block; - $pre = $this->indentStr(); - if (!empty($block->selectors)) { - $this->blockSelectors($block); - $this->indentLevel++; - } - if (!empty($block->lines)) { - $this->blockLines($block); - } - if (!empty($block->children)) { - $this->blockChildren($block); - } - if (!empty($block->selectors)) { - $this->indentLevel--; - if (!$this->keepSemicolons) { - $this->strippedSemicolon = ''; - } - if (empty($block->children)) { - $this->write($this->break); - } - $this->write($pre . $this->close . $this->break); - } - } - /** - * Test and clean safely empty children - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * - * @return bool - */ - protected function testEmptyChildren($block) - { - $isEmpty = empty($block->lines); - if ($block->children) { - foreach ($block->children as $k => &$child) { - if (!$this->testEmptyChildren($child)) { - $isEmpty = \false; - continue; - } - if ($child->type === Type::T_MEDIA || $child->type === Type::T_DIRECTIVE) { - $child->children = []; - $child->selectors = null; - } - } - } - return $isEmpty; - } - /** - * Entry point to formatting a block - * - * @api - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block An abstract syntax tree - * @param \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null $sourceMapGenerator Optional source map generator - * - * @return string - */ - public function format(OutputBlock $block, SourceMapGenerator $sourceMapGenerator = null) - { - $this->sourceMapGenerator = null; - if ($sourceMapGenerator) { - $this->currentLine = 1; - $this->currentColumn = 0; - $this->sourceMapGenerator = $sourceMapGenerator; - } - $this->testEmptyChildren($block); - \ob_start(); - try { - $this->block($block); - } catch (\Exception $e) { - \ob_end_clean(); - throw $e; - } catch (\Throwable $e) { - \ob_end_clean(); - throw $e; - } - $out = \ob_get_clean(); - \assert($out !== \false); - return $out; - } - /** - * Output content - * - * @param string $str - * - * @return void - */ - protected function write($str) - { - if (!empty($this->strippedSemicolon)) { - echo $this->strippedSemicolon; - $this->strippedSemicolon = ''; - } - /* - * Maybe Strip semi-colon appended by property(); it's a separator, not a terminator - * will be striped for real before a closing, otherwise displayed unchanged starting the next write - */ - if (!$this->keepSemicolons && $str && \strpos($str, ';') !== \false && \substr($str, -1) === ';') { - $str = \substr($str, 0, -1); - $this->strippedSemicolon = ';'; - } - if ($this->sourceMapGenerator) { - $lines = \explode("\n", $str); - $lastLine = \array_pop($lines); - foreach ($lines as $line) { - // If the written line starts is empty, adding a mapping would add it for - // a non-existent column as we are at the end of the line - if ($line !== '') { - \assert($this->currentBlock->sourceLine !== null); - \assert($this->currentBlock->sourceName !== null); - $this->sourceMapGenerator->addMapping( - $this->currentLine, - $this->currentColumn, - $this->currentBlock->sourceLine, - //columns from parser are off by one - $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0, - $this->currentBlock->sourceName - ); - } - $this->currentLine++; - $this->currentColumn = 0; - } - if ($lastLine !== '') { - \assert($this->currentBlock->sourceLine !== null); - \assert($this->currentBlock->sourceName !== null); - $this->sourceMapGenerator->addMapping( - $this->currentLine, - $this->currentColumn, - $this->currentBlock->sourceLine, - //columns from parser are off by one - $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0, - $this->currentBlock->sourceName - ); - } - $this->currentColumn += \strlen($lastLine); - } - echo $str; - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/Compact.php b/dependencies/scssphp/scssphp/src/Formatter/Compact.php deleted file mode 100644 index ec25447..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/Compact.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * @deprecated since 1.4.0. Use the Compressed formatter instead. - * - * @internal - */ -class Compact extends Formatter -{ - /** - * {@inheritdoc} - */ - public function __construct() - { - @\trigger_error('The Compact formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', \E_USER_DEPRECATED); - $this->indentLevel = 0; - $this->indentChar = ''; - $this->break = ''; - $this->open = ' {'; - $this->close = "}\n\n"; - $this->tagSeparator = ','; - $this->assignSeparator = ':'; - $this->keepSemicolons = \true; - } - /** - * {@inheritdoc} - */ - public function indentStr() - { - return ' '; - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/Compressed.php b/dependencies/scssphp/scssphp/src/Formatter/Compressed.php deleted file mode 100644 index b0802b1..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/Compressed.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * @internal - */ -class Compressed extends Formatter -{ - /** - * {@inheritdoc} - */ - public function __construct() - { - $this->indentLevel = 0; - $this->indentChar = ' '; - $this->break = ''; - $this->open = '{'; - $this->close = '}'; - $this->tagSeparator = ','; - $this->assignSeparator = ':'; - $this->keepSemicolons = \false; - } - /** - * {@inheritdoc} - */ - public function blockLines(OutputBlock $block) - { - $inner = $this->indentStr(); - $glue = $this->break . $inner; - foreach ($block->lines as $index => $line) { - if (\substr($line, 0, 2) === '/*' && \substr($line, 2, 1) !== '!') { - unset($block->lines[$index]); - } - } - $this->write($inner . \implode($glue, $block->lines)); - if (!empty($block->children)) { - $this->write($this->break); - } - } - /** - * Output block selectors - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - */ - protected function blockSelectors(OutputBlock $block) - { - \assert(!empty($block->selectors)); - $inner = $this->indentStr(); - $this->write($inner . \implode($this->tagSeparator, \str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors)) . $this->open . $this->break); - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/Crunched.php b/dependencies/scssphp/scssphp/src/Formatter/Crunched.php deleted file mode 100644 index 9e8c7d6..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/Crunched.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * @deprecated since 1.4.0. Use the Compressed formatter instead. - * - * @internal - */ -class Crunched extends Formatter -{ - /** - * {@inheritdoc} - */ - public function __construct() - { - @\trigger_error('The Crunched formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', \E_USER_DEPRECATED); - $this->indentLevel = 0; - $this->indentChar = ' '; - $this->break = ''; - $this->open = '{'; - $this->close = '}'; - $this->tagSeparator = ','; - $this->assignSeparator = ':'; - $this->keepSemicolons = \false; - } - /** - * {@inheritdoc} - */ - public function blockLines(OutputBlock $block) - { - $inner = $this->indentStr(); - $glue = $this->break . $inner; - foreach ($block->lines as $index => $line) { - if (\substr($line, 0, 2) === '/*') { - unset($block->lines[$index]); - } - } - $this->write($inner . \implode($glue, $block->lines)); - if (!empty($block->children)) { - $this->write($this->break); - } - } - /** - * Output block selectors - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - */ - protected function blockSelectors(OutputBlock $block) - { - \assert(!empty($block->selectors)); - $inner = $this->indentStr(); - $this->write($inner . \implode($this->tagSeparator, \str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors)) . $this->open . $this->break); - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/Debug.php b/dependencies/scssphp/scssphp/src/Formatter/Debug.php deleted file mode 100644 index 51eeaef..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/Debug.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * @deprecated since 1.4.0. - * - * @internal - */ -class Debug extends Formatter -{ - /** - * {@inheritdoc} - */ - public function __construct() - { - @\trigger_error('The Debug formatter is deprecated since 1.4.0.', \E_USER_DEPRECATED); - $this->indentLevel = 0; - $this->indentChar = ''; - $this->break = "\n"; - $this->open = ' {'; - $this->close = ' }'; - $this->tagSeparator = ', '; - $this->assignSeparator = ': '; - $this->keepSemicolons = \true; - } - /** - * {@inheritdoc} - */ - protected function indentStr() - { - return \str_repeat(' ', $this->indentLevel); - } - /** - * {@inheritdoc} - */ - protected function blockLines(OutputBlock $block) - { - $indent = $this->indentStr(); - if (empty($block->lines)) { - $this->write("{$indent}block->lines: []\n"); - return; - } - foreach ($block->lines as $index => $line) { - $this->write("{$indent}block->lines[{$index}]: {$line}\n"); - } - } - /** - * {@inheritdoc} - */ - protected function blockSelectors(OutputBlock $block) - { - $indent = $this->indentStr(); - if (empty($block->selectors)) { - $this->write("{$indent}block->selectors: []\n"); - return; - } - foreach ($block->selectors as $index => $selector) { - $this->write("{$indent}block->selectors[{$index}]: {$selector}\n"); - } - } - /** - * {@inheritdoc} - */ - protected function blockChildren(OutputBlock $block) - { - $indent = $this->indentStr(); - if (empty($block->children)) { - $this->write("{$indent}block->children: []\n"); - return; - } - $this->indentLevel++; - foreach ($block->children as $i => $child) { - $this->block($child); - } - $this->indentLevel--; - } - /** - * {@inheritdoc} - */ - protected function block(OutputBlock $block) - { - $indent = $this->indentStr(); - $this->write("{$indent}block->type: {$block->type}\n" . "{$indent}block->depth: {$block->depth}\n"); - $this->currentBlock = $block; - $this->blockSelectors($block); - $this->blockLines($block); - $this->blockChildren($block); - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/Expanded.php b/dependencies/scssphp/scssphp/src/Formatter/Expanded.php deleted file mode 100644 index 3eaa314..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/Expanded.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * @internal - */ -class Expanded extends Formatter -{ - /** - * {@inheritdoc} - */ - public function __construct() - { - $this->indentLevel = 0; - $this->indentChar = ' '; - $this->break = "\n"; - $this->open = ' {'; - $this->close = '}'; - $this->tagSeparator = ', '; - $this->assignSeparator = ': '; - $this->keepSemicolons = \true; - } - /** - * {@inheritdoc} - */ - protected function indentStr() - { - return \str_repeat($this->indentChar, $this->indentLevel); - } - /** - * {@inheritdoc} - */ - protected function blockLines(OutputBlock $block) - { - $inner = $this->indentStr(); - $glue = $this->break . $inner; - foreach ($block->lines as $index => $line) { - if (\substr($line, 0, 2) === '/*') { - $replacedLine = \preg_replace('/\\r\\n?|\\n|\\f/', $this->break, $line); - \assert($replacedLine !== null); - $block->lines[$index] = $replacedLine; - } - } - $this->write($inner . \implode($glue, $block->lines)); - if (empty($block->selectors) || !empty($block->children)) { - $this->write($this->break); - } - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/Nested.php b/dependencies/scssphp/scssphp/src/Formatter/Nested.php deleted file mode 100644 index 0057def..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/Nested.php +++ /dev/null @@ -1,192 +0,0 @@ - - * - * @deprecated since 1.4.0. Use the Expanded formatter instead. - * - * @internal - */ -class Nested extends Formatter -{ - /** - * @var int - */ - private $depth; - /** - * {@inheritdoc} - */ - public function __construct() - { - @\trigger_error('The Nested formatter is deprecated since 1.4.0. Use the Expanded formatter instead.', \E_USER_DEPRECATED); - $this->indentLevel = 0; - $this->indentChar = ' '; - $this->break = "\n"; - $this->open = ' {'; - $this->close = ' }'; - $this->tagSeparator = ', '; - $this->assignSeparator = ': '; - $this->keepSemicolons = \true; - } - /** - * {@inheritdoc} - */ - protected function indentStr() - { - $n = $this->depth - 1; - return \str_repeat($this->indentChar, \max($this->indentLevel + $n, 0)); - } - /** - * {@inheritdoc} - */ - protected function blockLines(OutputBlock $block) - { - $inner = $this->indentStr(); - $glue = $this->break . $inner; - foreach ($block->lines as $index => $line) { - if (\substr($line, 0, 2) === '/*') { - $replacedLine = \preg_replace('/\\r\\n?|\\n|\\f/', $this->break, $line); - \assert($replacedLine !== null); - $block->lines[$index] = $replacedLine; - } - } - $this->write($inner . \implode($glue, $block->lines)); - } - /** - * {@inheritdoc} - */ - protected function block(OutputBlock $block) - { - static $depths; - static $downLevel; - static $closeBlock; - static $previousEmpty; - static $previousHasSelector; - if ($block->type === 'root') { - $depths = [0]; - $downLevel = ''; - $closeBlock = ''; - $this->depth = 0; - $previousEmpty = \false; - $previousHasSelector = \false; - } - $isMediaOrDirective = \in_array($block->type, [Type::T_DIRECTIVE, Type::T_MEDIA]); - $isSupport = $block->type === Type::T_DIRECTIVE && $block->selectors && \strpos(\implode('', $block->selectors), '@supports') !== \false; - while ($block->depth < \end($depths) || $block->depth == 1 && \end($depths) == 1) { - \array_pop($depths); - $this->depth--; - if (!$this->depth && ($block->depth <= 1 || !$this->indentLevel && $block->type === Type::T_COMMENT) && ($block->selectors && !$isMediaOrDirective || $previousHasSelector)) { - $downLevel = $this->break; - } - if (empty($block->lines) && empty($block->children)) { - $previousEmpty = \true; - } - } - if (empty($block->lines) && empty($block->children)) { - return; - } - $this->currentBlock = $block; - if (!empty($block->lines) || !empty($block->children) && ($this->depth < 1 || $isSupport)) { - if ($block->depth > \end($depths)) { - if (!$previousEmpty || $this->depth < 1) { - $this->depth++; - $depths[] = $block->depth; - } else { - // keep the current depth unchanged but take the block depth as a new reference for following blocks - \array_pop($depths); - $depths[] = $block->depth; - } - } - } - $previousEmpty = $block->type === Type::T_COMMENT; - $previousHasSelector = \false; - if (!empty($block->selectors)) { - if ($closeBlock) { - $this->write($closeBlock); - $closeBlock = ''; - } - if ($downLevel) { - $this->write($downLevel); - $downLevel = ''; - } - $this->blockSelectors($block); - $this->indentLevel++; - } - if (!empty($block->lines)) { - if ($closeBlock) { - $this->write($closeBlock); - $closeBlock = ''; - } - if ($downLevel) { - $this->write($downLevel); - $downLevel = ''; - } - $this->blockLines($block); - $closeBlock = $this->break; - } - if (!empty($block->children)) { - if ($this->depth > 0 && ($isMediaOrDirective || !$this->hasFlatChild($block))) { - \array_pop($depths); - $this->depth--; - $this->blockChildren($block); - $this->depth++; - $depths[] = $block->depth; - } else { - $this->blockChildren($block); - } - } - // reclear to not be spoiled by children if T_DIRECTIVE - if ($block->type === Type::T_DIRECTIVE) { - $previousHasSelector = \false; - } - if (!empty($block->selectors)) { - $this->indentLevel--; - if (!$this->keepSemicolons) { - $this->strippedSemicolon = ''; - } - $this->write($this->close); - $closeBlock = $this->break; - if ($this->depth > 1 && !empty($block->children)) { - \array_pop($depths); - $this->depth--; - } - if (!$isMediaOrDirective) { - $previousHasSelector = \true; - } - } - if ($block->type === 'root') { - $this->write($this->break); - } - } - /** - * Block has flat child - * - * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block - * - * @return bool - */ - private function hasFlatChild($block) - { - foreach ($block->children as $child) { - if (empty($child->selectors)) { - return \true; - } - } - return \false; - } -} diff --git a/dependencies/scssphp/scssphp/src/Formatter/OutputBlock.php b/dependencies/scssphp/scssphp/src/Formatter/OutputBlock.php deleted file mode 100644 index b152632..0000000 --- a/dependencies/scssphp/scssphp/src/Formatter/OutputBlock.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * @internal - */ -class OutputBlock -{ - /** - * @var string|null - */ - public $type; - /** - * @var int - */ - public $depth; - /** - * @var array|null - */ - public $selectors; - /** - * @var string[] - */ - public $lines; - /** - * @var OutputBlock[] - */ - public $children; - /** - * @var OutputBlock|null - */ - public $parent; - /** - * @var string|null - */ - public $sourceName; - /** - * @var int|null - */ - public $sourceLine; - /** - * @var int|null - */ - public $sourceColumn; -} diff --git a/dependencies/scssphp/scssphp/src/Logger/LoggerInterface.php b/dependencies/scssphp/scssphp/src/Logger/LoggerInterface.php deleted file mode 100644 index 4099981..0000000 --- a/dependencies/scssphp/scssphp/src/Logger/LoggerInterface.php +++ /dev/null @@ -1,46 +0,0 @@ -stream = $stream; - $this->closeOnDestruct = $closeOnDestruct; - } - /** - * @internal - */ - public function __destruct() - { - if ($this->closeOnDestruct) { - \fclose($this->stream); - } - } - /** - * @inheritDoc - */ - public function warn($message, $deprecation = \false) - { - $prefix = ($deprecation ? 'DEPRECATION ' : '') . 'WARNING: '; - \fwrite($this->stream, $prefix . $message . "\n\n"); - } - /** - * @inheritDoc - */ - public function debug($message) - { - \fwrite($this->stream, $message . "\n"); - } -} diff --git a/dependencies/scssphp/scssphp/src/Node.php b/dependencies/scssphp/scssphp/src/Node.php deleted file mode 100644 index dd6404b..0000000 --- a/dependencies/scssphp/scssphp/src/Node.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * @internal - */ -abstract class Node -{ - /** - * @var string - */ - public $type; - /** - * @var int - */ - public $sourceIndex; - /** - * @var int|null - */ - public $sourceLine; - /** - * @var int|null - */ - public $sourceColumn; -} diff --git a/dependencies/scssphp/scssphp/src/Node/Number.php b/dependencies/scssphp/scssphp/src/Node/Number.php deleted file mode 100644 index 9316768..0000000 --- a/dependencies/scssphp/scssphp/src/Node/Number.php +++ /dev/null @@ -1,682 +0,0 @@ - - * - * @template-implements \ArrayAccess - */ -class Number extends Node implements \ArrayAccess -{ - const PRECISION = 10; - /** - * @var int - * @deprecated use {Number::PRECISION} instead to read the precision. Configuring it is not supported anymore. - */ - public static $precision = self::PRECISION; - /** - * @see http://www.w3.org/TR/2012/WD-css3-values-20120308/ - * - * @var array - * @phpstan-var array> - */ - protected static $unitTable = ['in' => ['in' => 1, 'pc' => 6, 'pt' => 72, 'px' => 96, 'cm' => 2.54, 'mm' => 25.4, 'q' => 101.6], 'turn' => [ - 'deg' => 360, - 'grad' => 400, - 'rad' => 6.283185307179586, - // 2 * M_PI - 'turn' => 1, - ], 's' => ['s' => 1, 'ms' => 1000], 'Hz' => ['Hz' => 1, 'kHz' => 0.001], 'dpi' => ['dpi' => 1, 'dpcm' => 1 / 2.54, 'dppx' => 1 / 96]]; - /** - * @var int|float - */ - private $dimension; - /** - * @var string[] - * @phpstan-var list - */ - private $numeratorUnits; - /** - * @var string[] - * @phpstan-var list - */ - private $denominatorUnits; - /** - * Initialize number - * - * @param int|float $dimension - * @param string[]|string $numeratorUnits - * @param string[] $denominatorUnits - * - * @phpstan-param list|string $numeratorUnits - * @phpstan-param list $denominatorUnits - */ - public function __construct($dimension, $numeratorUnits, array $denominatorUnits = []) - { - if (\is_string($numeratorUnits)) { - $numeratorUnits = $numeratorUnits ? [$numeratorUnits] : []; - } elseif (isset($numeratorUnits['numerator_units'], $numeratorUnits['denominator_units'])) { - // TODO get rid of this once `$number[2]` is not used anymore - $denominatorUnits = $numeratorUnits['denominator_units']; - $numeratorUnits = $numeratorUnits['numerator_units']; - } - $this->dimension = $dimension; - $this->numeratorUnits = $numeratorUnits; - $this->denominatorUnits = $denominatorUnits; - } - /** - * @return float|int - */ - public function getDimension() - { - return $this->dimension; - } - /** - * @return string[] - */ - public function getNumeratorUnits() - { - return $this->numeratorUnits; - } - /** - * @return string[] - */ - public function getDenominatorUnits() - { - return $this->denominatorUnits; - } - /** - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists($offset) - { - if ($offset === -3) { - return !\is_null($this->sourceColumn); - } - if ($offset === -2) { - return !\is_null($this->sourceLine); - } - if ($offset === -1 || $offset === 0 || $offset === 1 || $offset === 2) { - return \true; - } - return \false; - } - /** - * @return mixed - */ - #[\ReturnTypeWillChange] - public function offsetGet($offset) - { - switch ($offset) { - case -3: - return $this->sourceColumn; - case -2: - return $this->sourceLine; - case -1: - return $this->sourceIndex; - case 0: - return Type::T_NUMBER; - case 1: - return $this->dimension; - case 2: - return array('numerator_units' => $this->numeratorUnits, 'denominator_units' => $this->denominatorUnits); - } - } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetSet($offset, $value) - { - throw new \BadMethodCallException('Number is immutable'); - } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetUnset($offset) - { - throw new \BadMethodCallException('Number is immutable'); - } - /** - * Returns true if the number is unitless - * - * @return bool - */ - public function unitless() - { - return \count($this->numeratorUnits) === 0 && \count($this->denominatorUnits) === 0; - } - /** - * Returns true if the number has any units - * - * @return bool - */ - public function hasUnits() - { - return !$this->unitless(); - } - /** - * Checks whether the number has exactly this unit - * - * @param string $unit - * - * @return bool - */ - public function hasUnit($unit) - { - return \count($this->numeratorUnits) === 1 && \count($this->denominatorUnits) === 0 && $this->numeratorUnits[0] === $unit; - } - /** - * Returns unit(s) as the product of numerator units divided by the product of denominator units - * - * @return string - */ - public function unitStr() - { - if ($this->unitless()) { - return ''; - } - return self::getUnitString($this->numeratorUnits, $this->denominatorUnits); - } - /** - * @param float|int $min - * @param float|int $max - * @param string|null $name - * - * @return float|int - * @throws SassScriptException - */ - public function valueInRange($min, $max, $name = null) - { - try { - return Util::checkRange('', new Range($min, $max), $this); - } catch (RangeException $e) { - throw SassScriptException::forArgument(\sprintf('Expected %s to be within %s%s and %s%3$s.', $this, $min, $this->unitStr(), $max), $name); - } - } - /** - * @param float|int $min - * @param float|int $max - * @param string $name - * @param string $unit - * - * @return float|int - * @throws SassScriptException - * - * @internal - */ - public function valueInRangeWithUnit($min, $max, $name, $unit) - { - try { - return Util::checkRange('', new Range($min, $max), $this); - } catch (RangeException $e) { - throw SassScriptException::forArgument(\sprintf('Expected %s to be within %s%s and %s%3$s.', $this, $min, $unit, $max), $name); - } - } - /** - * @param string|null $varName - * - * @return void - */ - public function assertNoUnits($varName = null) - { - if ($this->unitless()) { - return; - } - throw SassScriptException::forArgument(\sprintf('Expected %s to have no units.', $this), $varName); - } - /** - * @param string $unit - * @param string|null $varName - * - * @return void - */ - public function assertUnit($unit, $varName = null) - { - if ($this->hasUnit($unit)) { - return; - } - throw SassScriptException::forArgument(\sprintf('Expected %s to have unit "%s".', $this, $unit), $varName); - } - /** - * @param Number $other - * - * @return void - */ - public function assertSameUnitOrUnitless(Number $other) - { - if ($other->unitless()) { - return; - } - if ($this->numeratorUnits === $other->numeratorUnits && $this->denominatorUnits === $other->denominatorUnits) { - return; - } - throw new SassScriptException(\sprintf('Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($other->numeratorUnits, $other->denominatorUnits))); - } - /** - * Returns a copy of this number, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. - * - * This does not throw an error if this number is unitless and - * $newNumeratorUnits/$newDenominatorUnits are not empty, or vice versa. Instead, - * it treats all unitless numbers as convertible to and from all units without - * changing the value. - * - * @param string[] $newNumeratorUnits - * @param string[] $newDenominatorUnits - * - * @return Number - * - * @phpstan-param list $newNumeratorUnits - * @phpstan-param list $newDenominatorUnits - * - * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits - */ - public function coerce(array $newNumeratorUnits, array $newDenominatorUnits) - { - return new Number($this->valueInUnits($newNumeratorUnits, $newDenominatorUnits), $newNumeratorUnits, $newDenominatorUnits); - } - /** - * @param Number $other - * - * @return bool - */ - public function isComparableTo(Number $other) - { - if ($this->unitless() || $other->unitless()) { - return \true; - } - try { - $this->greaterThan($other); - return \true; - } catch (SassScriptException $e) { - return \false; - } - } - /** - * @param Number $other - * - * @return bool - */ - public function lessThan(Number $other) - { - return $this->coerceUnits($other, function ($num1, $num2) { - return $num1 < $num2; - }); - } - /** - * @param Number $other - * - * @return bool - */ - public function lessThanOrEqual(Number $other) - { - return $this->coerceUnits($other, function ($num1, $num2) { - return $num1 <= $num2; - }); - } - /** - * @param Number $other - * - * @return bool - */ - public function greaterThan(Number $other) - { - return $this->coerceUnits($other, function ($num1, $num2) { - return $num1 > $num2; - }); - } - /** - * @param Number $other - * - * @return bool - */ - public function greaterThanOrEqual(Number $other) - { - return $this->coerceUnits($other, function ($num1, $num2) { - return $num1 >= $num2; - }); - } - /** - * @param Number $other - * - * @return Number - */ - public function plus(Number $other) - { - return $this->coerceNumber($other, function ($num1, $num2) { - return $num1 + $num2; - }); - } - /** - * @param Number $other - * - * @return Number - */ - public function minus(Number $other) - { - return $this->coerceNumber($other, function ($num1, $num2) { - return $num1 - $num2; - }); - } - /** - * @return Number - */ - public function unaryMinus() - { - return new Number(-$this->dimension, $this->numeratorUnits, $this->denominatorUnits); - } - /** - * @param Number $other - * - * @return Number - */ - public function modulo(Number $other) - { - return $this->coerceNumber($other, function ($num1, $num2) { - if ($num2 == 0) { - return \NAN; - } - $result = \fmod($num1, $num2); - if ($result == 0) { - return 0; - } - if ($num2 < 0 xor $num1 < 0) { - $result += $num2; - } - return $result; - }); - } - /** - * @param Number $other - * - * @return Number - */ - public function times(Number $other) - { - return $this->multiplyUnits($this->dimension * $other->dimension, $this->numeratorUnits, $this->denominatorUnits, $other->numeratorUnits, $other->denominatorUnits); - } - /** - * @param Number $other - * - * @return Number - */ - public function dividedBy(Number $other) - { - if ($other->dimension == 0) { - if ($this->dimension == 0) { - $value = \NAN; - } elseif ($this->dimension > 0) { - $value = \INF; - } else { - $value = -\INF; - } - } else { - $value = $this->dimension / $other->dimension; - } - return $this->multiplyUnits($value, $this->numeratorUnits, $this->denominatorUnits, $other->denominatorUnits, $other->numeratorUnits); - } - /** - * @param Number $other - * - * @return bool - */ - public function equals(Number $other) - { - // Unitless numbers are convertable to unit numbers, but not equal, so we special-case unitless here. - if ($this->unitless() !== $other->unitless()) { - return \false; - } - // In Sass, neither NaN nor Infinity are equal to themselves, while PHP defines INF==INF - if (\is_nan($this->dimension) || \is_nan($other->dimension) || !\is_finite($this->dimension) || !\is_finite($other->dimension)) { - return \false; - } - if ($this->unitless()) { - return \round($this->dimension, self::PRECISION) == \round($other->dimension, self::PRECISION); - } - try { - return $this->coerceUnits($other, function ($num1, $num2) { - return \round($num1, self::PRECISION) == \round($num2, self::PRECISION); - }); - } catch (SassScriptException $e) { - return \false; - } - } - /** - * Output number - * - * @param \ScssPhp\ScssPhp\Compiler $compiler - * - * @return string - */ - public function output(Compiler $compiler = null) - { - $dimension = \round($this->dimension, self::PRECISION); - if (\is_nan($dimension)) { - return 'NaN'; - } - if ($dimension === \INF) { - return 'Infinity'; - } - if ($dimension === -\INF) { - return '-Infinity'; - } - if ($compiler) { - $unit = $this->unitStr(); - } elseif (isset($this->numeratorUnits[0])) { - $unit = $this->numeratorUnits[0]; - } else { - $unit = ''; - } - $dimension = \number_format($dimension, self::PRECISION, '.', ''); - return \rtrim(\rtrim($dimension, '0'), '.') . $unit; - } - /** - * {@inheritdoc} - */ - public function __toString() - { - return $this->output(); - } - /** - * @param Number $other - * @param callable $operation - * - * @return Number - * - * @phpstan-param callable(int|float, int|float): (int|float) $operation - */ - private function coerceNumber(Number $other, $operation) - { - $result = $this->coerceUnits($other, $operation); - if (!$this->unitless()) { - return new Number($result, $this->numeratorUnits, $this->denominatorUnits); - } - return new Number($result, $other->numeratorUnits, $other->denominatorUnits); - } - /** - * @param Number $other - * @param callable $operation - * - * @return mixed - * - * @phpstan-template T - * @phpstan-param callable(int|float, int|float): T $operation - * @phpstan-return T - */ - private function coerceUnits(Number $other, $operation) - { - if (!$this->unitless()) { - $num1 = $this->dimension; - $num2 = $other->valueInUnits($this->numeratorUnits, $this->denominatorUnits); - } else { - $num1 = $this->valueInUnits($other->numeratorUnits, $other->denominatorUnits); - $num2 = $other->dimension; - } - return \call_user_func($operation, $num1, $num2); - } - /** - * @param string[] $numeratorUnits - * @param string[] $denominatorUnits - * - * @return int|float - * - * @phpstan-param list $numeratorUnits - * @phpstan-param list $denominatorUnits - * - * @throws SassScriptException if this number's units are not compatible with $numeratorUnits and $denominatorUnits - */ - private function valueInUnits(array $numeratorUnits, array $denominatorUnits) - { - if ($this->unitless() || \count($numeratorUnits) === 0 && \count($denominatorUnits) === 0 || $this->numeratorUnits === $numeratorUnits && $this->denominatorUnits === $denominatorUnits) { - return $this->dimension; - } - $value = $this->dimension; - $oldNumerators = $this->numeratorUnits; - foreach ($numeratorUnits as $newNumerator) { - foreach ($oldNumerators as $key => $oldNumerator) { - $conversionFactor = self::getConversionFactor($newNumerator, $oldNumerator); - if (\is_null($conversionFactor)) { - continue; - } - $value *= $conversionFactor; - unset($oldNumerators[$key]); - continue 2; - } - throw new SassScriptException(\sprintf('Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($numeratorUnits, $denominatorUnits))); - } - $oldDenominators = $this->denominatorUnits; - foreach ($denominatorUnits as $newDenominator) { - foreach ($oldDenominators as $key => $oldDenominator) { - $conversionFactor = self::getConversionFactor($newDenominator, $oldDenominator); - if (\is_null($conversionFactor)) { - continue; - } - $value /= $conversionFactor; - unset($oldDenominators[$key]); - continue 2; - } - throw new SassScriptException(\sprintf('Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($numeratorUnits, $denominatorUnits))); - } - if (\count($oldNumerators) || \count($oldDenominators)) { - throw new SassScriptException(\sprintf('Incompatible units %s and %s.', self::getUnitString($this->numeratorUnits, $this->denominatorUnits), self::getUnitString($numeratorUnits, $denominatorUnits))); - } - return $value; - } - /** - * @param int|float $value - * @param string[] $numerators1 - * @param string[] $denominators1 - * @param string[] $numerators2 - * @param string[] $denominators2 - * - * @return Number - * - * @phpstan-param list $numerators1 - * @phpstan-param list $denominators1 - * @phpstan-param list $numerators2 - * @phpstan-param list $denominators2 - */ - private function multiplyUnits($value, array $numerators1, array $denominators1, array $numerators2, array $denominators2) - { - $newNumerators = array(); - foreach ($numerators1 as $numerator) { - foreach ($denominators2 as $key => $denominator) { - $conversionFactor = self::getConversionFactor($numerator, $denominator); - if (\is_null($conversionFactor)) { - continue; - } - $value /= $conversionFactor; - unset($denominators2[$key]); - continue 2; - } - $newNumerators[] = $numerator; - } - foreach ($numerators2 as $numerator) { - foreach ($denominators1 as $key => $denominator) { - $conversionFactor = self::getConversionFactor($numerator, $denominator); - if (\is_null($conversionFactor)) { - continue; - } - $value /= $conversionFactor; - unset($denominators1[$key]); - continue 2; - } - $newNumerators[] = $numerator; - } - $newDenominators = \array_values(\array_merge($denominators1, $denominators2)); - return new Number($value, $newNumerators, $newDenominators); - } - /** - * Returns the number of [unit1]s per [unit2]. - * - * Equivalently, `1unit1 * conversionFactor(unit1, unit2) = 1unit2`. - * - * @param string $unit1 - * @param string $unit2 - * - * @return float|int|null - */ - private static function getConversionFactor($unit1, $unit2) - { - if ($unit1 === $unit2) { - return 1; - } - foreach (static::$unitTable as $unitVariants) { - if (isset($unitVariants[$unit1]) && isset($unitVariants[$unit2])) { - return $unitVariants[$unit1] / $unitVariants[$unit2]; - } - } - return null; - } - /** - * Returns unit(s) as the product of numerator units divided by the product of denominator units - * - * @param string[] $numerators - * @param string[] $denominators - * - * @phpstan-param list $numerators - * @phpstan-param list $denominators - * - * @return string - */ - private static function getUnitString(array $numerators, array $denominators) - { - if (!\count($numerators)) { - if (\count($denominators) === 0) { - return 'no units'; - } - if (\count($denominators) === 1) { - return $denominators[0] . '^-1'; - } - return '(' . \implode('*', $denominators) . ')^-1'; - } - return \implode('*', $numerators) . (\count($denominators) ? '/' . \implode('*', $denominators) : ''); - } -} diff --git a/dependencies/scssphp/scssphp/src/OutputStyle.php b/dependencies/scssphp/scssphp/src/OutputStyle.php deleted file mode 100644 index 2fcc618..0000000 --- a/dependencies/scssphp/scssphp/src/OutputStyle.php +++ /dev/null @@ -1,9 +0,0 @@ - - * - * @internal - */ -class Parser -{ - const SOURCE_INDEX = -1; - const SOURCE_LINE = -2; - const SOURCE_COLUMN = -3; - /** - * @var array - */ - protected static $precedence = ['=' => 0, 'or' => 1, 'and' => 2, '==' => 3, '!=' => 3, '<=' => 4, '>=' => 4, '<' => 4, '>' => 4, '+' => 5, '-' => 5, '*' => 6, '/' => 6, '%' => 6]; - /** - * @var string - */ - protected static $commentPattern; - /** - * @var string - */ - protected static $operatorPattern; - /** - * @var string - */ - protected static $whitePattern; - /** - * @var Cache|null - */ - protected $cache; - private $sourceName; - private $sourceIndex; - /** - * @var array - */ - private $sourcePositions; - /** - * The current offset in the buffer - * - * @var int - */ - private $count; - /** - * @var Block|null - */ - private $env; - /** - * @var bool - */ - private $inParens; - /** - * @var bool - */ - private $eatWhiteDefault; - /** - * @var bool - */ - private $discardComments; - private $allowVars; - /** - * @var string - */ - private $buffer; - private $utf8; - /** - * @var string|null - */ - private $encoding; - private $patternModifiers; - private $commentsSeen; - private $cssOnly; - /** - * @var LoggerInterface - */ - private $logger; - /** - * Constructor - * - * @api - * - * @param string|null $sourceName - * @param int $sourceIndex - * @param string|null $encoding - * @param Cache|null $cache - * @param bool $cssOnly - * @param LoggerInterface|null $logger - */ - public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', Cache $cache = null, $cssOnly = \false, LoggerInterface $logger = null) - { - $this->sourceName = $sourceName ?: '(stdin)'; - $this->sourceIndex = $sourceIndex; - $this->utf8 = !$encoding || \strtolower($encoding) === 'utf-8'; - $this->patternModifiers = $this->utf8 ? 'Aisu' : 'Ais'; - $this->commentsSeen = []; - $this->allowVars = \true; - $this->cssOnly = $cssOnly; - $this->logger = $logger ?: new QuietLogger(); - if (empty(static::$operatorPattern)) { - static::$operatorPattern = '([*\\/%+-]|[!=]\\=|\\>\\=?|\\<\\=?|and|or)'; - $commentSingle = '\\/\\/'; - $commentMultiLeft = '\\/\\*'; - $commentMultiRight = '\\*\\/'; - static::$commentPattern = $commentMultiLeft . '.*?' . $commentMultiRight; - static::$whitePattern = $this->utf8 ? '/' . $commentSingle . '[^\\n]*\\s*|(' . static::$commentPattern . ')\\s*|\\s+/AisuS' : '/' . $commentSingle . '[^\\n]*\\s*|(' . static::$commentPattern . ')\\s*|\\s+/AisS'; - } - $this->cache = $cache; - } - /** - * Get source file name - * - * @api - * - * @return string - */ - public function getSourceName() - { - return $this->sourceName; - } - /** - * Throw parser error - * - * @api - * - * @param string $msg - * - * @phpstan-return never-return - * - * @throws ParserException - * - * @deprecated use "parseError" and throw the exception in the caller instead. - */ - public function throwParseError($msg = 'parse error') - { - @\trigger_error('The method "throwParseError" is deprecated. Use "parseError" and throw the exception in the caller instead', \E_USER_DEPRECATED); - throw $this->parseError($msg); - } - /** - * Creates a parser error - * - * @api - * - * @param string $msg - * - * @return ParserException - */ - public function parseError($msg = 'parse error') - { - list($line, $column) = $this->getSourcePosition($this->count); - $loc = empty($this->sourceName) ? "line: {$line}, column: {$column}" : "{$this->sourceName} on line {$line}, at column {$column}"; - if ($this->peek('(.*?)(\\n|$)', $m, $this->count)) { - $this->restoreEncoding(); - $e = new ParserException("{$msg}: failed at `{$m[1]}` {$loc}"); - $e->setSourcePosition([$this->sourceName, $line, $column]); - return $e; - } - $this->restoreEncoding(); - $e = new ParserException("{$msg}: {$loc}"); - $e->setSourcePosition([$this->sourceName, $line, $column]); - return $e; - } - /** - * Parser buffer - * - * @api - * - * @param string $buffer - * - * @return Block - */ - public function parse($buffer) - { - if ($this->cache) { - $cacheKey = $this->sourceName . ':' . \md5($buffer); - $parseOptions = ['utf8' => $this->utf8]; - $v = $this->cache->getCache('parse', $cacheKey, $parseOptions); - if (!\is_null($v)) { - return $v; - } - } - // strip BOM (byte order marker) - if (\substr($buffer, 0, 3) === "") { - $buffer = \substr($buffer, 3); - } - $this->buffer = \rtrim($buffer, "\x00..\x1f"); - $this->count = 0; - $this->env = null; - $this->inParens = \false; - $this->eatWhiteDefault = \true; - $this->saveEncoding(); - $this->extractLineNumbers($buffer); - if ($this->utf8 && !\preg_match('//u', $buffer)) { - $message = $this->sourceName ? 'Invalid UTF-8 file: ' . $this->sourceName : 'Invalid UTF-8 file'; - throw new ParserException($message); - } - $this->pushBlock(null); - // root block - $this->whitespace(); - $this->pushBlock(null); - $this->popBlock(); - while ($this->parseChunk()) { - } - if ($this->count !== \strlen($this->buffer)) { - throw $this->parseError(); - } - if (!empty($this->env->parent)) { - throw $this->parseError('unclosed block'); - } - $this->restoreEncoding(); - \assert($this->env !== null); - if ($this->cache) { - $this->cache->setCache('parse', $cacheKey, $this->env, $parseOptions); - } - return $this->env; - } - /** - * Parse a value or value list - * - * @api - * - * @param string $buffer - * @param string|array $out - * - * @return bool - */ - public function parseValue($buffer, &$out) - { - $this->count = 0; - $this->env = null; - $this->inParens = \false; - $this->eatWhiteDefault = \true; - $this->buffer = (string) $buffer; - $this->saveEncoding(); - $this->extractLineNumbers($this->buffer); - $list = $this->valueList($out); - $this->restoreEncoding(); - return $list; - } - /** - * Parse a selector or selector list - * - * @api - * - * @param string $buffer - * @param string|array $out - * @param bool $shouldValidate - * - * @return bool - */ - public function parseSelector($buffer, &$out, $shouldValidate = \true) - { - $this->count = 0; - $this->env = null; - $this->inParens = \false; - $this->eatWhiteDefault = \true; - $this->buffer = (string) $buffer; - $this->saveEncoding(); - $this->extractLineNumbers($this->buffer); - // discard space/comments at the start - $this->discardComments = \true; - $this->whitespace(); - $this->discardComments = \false; - $selector = $this->selectors($out); - $this->restoreEncoding(); - if ($shouldValidate && $this->count !== \strlen($buffer)) { - throw $this->parseError("`" . \substr($buffer, $this->count) . "` is not a valid Selector in `{$buffer}`"); - } - return $selector; - } - /** - * Parse a media Query - * - * @api - * - * @param string $buffer - * @param array $out - * - * @return bool - */ - public function parseMediaQueryList($buffer, &$out) - { - $this->count = 0; - $this->env = null; - $this->inParens = \false; - $this->eatWhiteDefault = \true; - $this->buffer = (string) $buffer; - $this->saveEncoding(); - $this->extractLineNumbers($this->buffer); - $isMediaQuery = $this->mediaQueryList($out); - $this->restoreEncoding(); - return $isMediaQuery; - } - /** - * Parse a single chunk off the head of the buffer and append it to the - * current parse environment. - * - * Returns false when the buffer is empty, or when there is an error. - * - * This function is called repeatedly until the entire document is - * parsed. - * - * This parser is most similar to a recursive descent parser. Single - * functions represent discrete grammatical rules for the language, and - * they are able to capture the text that represents those rules. - * - * Consider the function Compiler::keyword(). (All parse functions are - * structured the same.) - * - * The function takes a single reference argument. When calling the - * function it will attempt to match a keyword on the head of the buffer. - * If it is successful, it will place the keyword in the referenced - * argument, advance the position in the buffer, and return true. If it - * fails then it won't advance the buffer and it will return false. - * - * All of these parse functions are powered by Compiler::match(), which behaves - * the same way, but takes a literal regular expression. Sometimes it is - * more convenient to use match instead of creating a new function. - * - * Because of the format of the functions, to parse an entire string of - * grammatical rules, you can chain them together using &&. - * - * But, if some of the rules in the chain succeed before one fails, then - * the buffer position will be left at an invalid state. In order to - * avoid this, Compiler::seek() is used to remember and set buffer positions. - * - * Before parsing a chain, use $s = $this->count to remember the current - * position into $s. Then if a chain fails, use $this->seek($s) to - * go back where we started. - * - * @return bool - */ - protected function parseChunk() - { - $s = $this->count; - // the directives - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '@') { - if ($this->literal('@at-root', 8) && ($this->selectors($selector) || \true) && ($this->map($with) || \true) && ($this->matchChar('(') && $this->interpolation($with) && $this->matchChar(')') || \true) && $this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $atRoot = new AtRootBlock(); - $this->registerPushedBlock($atRoot, $s); - $atRoot->selector = $selector; - $atRoot->with = $with; - return \true; - } - $this->seek($s); - if ($this->literal('@media', 6) && $this->mediaQueryList($mediaQueryList) && $this->matchChar('{', \false)) { - $media = new MediaBlock(); - $this->registerPushedBlock($media, $s); - $media->queryList = $mediaQueryList[2]; - return \true; - } - $this->seek($s); - if ($this->literal('@mixin', 6) && $this->keyword($mixinName) && ($this->argumentDef($args) || \true) && $this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $mixin = new CallableBlock(Type::T_MIXIN); - $this->registerPushedBlock($mixin, $s); - $mixin->name = $mixinName; - $mixin->args = $args; - return \true; - } - $this->seek($s); - if ($this->literal('@include', 8) && $this->keyword($mixinName) && ($this->matchChar('(') && ($this->argValues($argValues) || \true) && $this->matchChar(')') || \true) && $this->end() || $this->literal('using', 5) && $this->argumentDef($argUsing) && ($this->end() || $this->matchChar('{') && ($hasBlock = \true)) || $this->matchChar('{') && ($hasBlock = \true)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $child = [Type::T_INCLUDE, $mixinName, isset($argValues) ? $argValues : null, null, isset($argUsing) ? $argUsing : null]; - if (!empty($hasBlock)) { - $include = new ContentBlock(); - $this->registerPushedBlock($include, $s); - $include->child = $child; - } else { - $this->append($child, $s); - } - return \true; - } - $this->seek($s); - if ($this->literal('@scssphp-import-once', 20) && $this->valueList($importPath) && $this->end()) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - list($line, $column) = $this->getSourcePosition($s); - $file = $this->sourceName; - $this->logger->warn("The \"@scssphp-import-once\" directive is deprecated and will be removed in ScssPhp 2.0, in \"{$file}\", line {$line}, column {$column}.", \true); - $this->append([Type::T_SCSSPHP_IMPORT_ONCE, $importPath], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@import', 7) && $this->valueList($importPath) && $importPath[0] !== Type::T_FUNCTION_CALL && $this->end()) { - if ($this->cssOnly) { - $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s); - $this->append([Type::T_COMMENT, \rtrim(\substr($this->buffer, $s, $this->count - $s))]); - return \true; - } - $this->append([Type::T_IMPORT, $importPath], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@import', 7) && $this->url($importPath) && $this->end()) { - if ($this->cssOnly) { - $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s); - $this->append([Type::T_COMMENT, \rtrim(\substr($this->buffer, $s, $this->count - $s))]); - return \true; - } - $this->append([Type::T_IMPORT, $importPath], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@extend', 7) && $this->selectors($selectors) && $this->end()) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - // check for '!flag' - $optional = $this->stripOptionalFlag($selectors); - $this->append([Type::T_EXTEND, $selectors, $optional], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@function', 9) && $this->keyword($fnName) && $this->argumentDef($args) && $this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $func = new CallableBlock(Type::T_FUNCTION); - $this->registerPushedBlock($func, $s); - $func->name = $fnName; - $func->args = $args; - return \true; - } - $this->seek($s); - if ($this->literal('@return', 7) && ($this->valueList($retVal) || \true) && $this->end()) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $this->append([Type::T_RETURN, isset($retVal) ? $retVal : [Type::T_NULL]], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@each', 5) && $this->genericList($varNames, 'variable', ',', \false) && $this->literal('in', 2) && $this->valueList($list) && $this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $each = new EachBlock(); - $this->registerPushedBlock($each, $s); - foreach ($varNames[2] as $varName) { - $each->vars[] = $varName[1]; - } - $each->list = $list; - return \true; - } - $this->seek($s); - if ($this->literal('@while', 6) && $this->expression($cond) && $this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - while ($cond[0] === Type::T_LIST && !empty($cond['enclosing']) && $cond['enclosing'] === 'parent' && \count($cond[2]) == 1) { - $cond = \reset($cond[2]); - } - $while = new WhileBlock(); - $this->registerPushedBlock($while, $s); - $while->cond = $cond; - return \true; - } - $this->seek($s); - if ($this->literal('@for', 4) && $this->variable($varName) && $this->literal('from', 4) && $this->expression($start) && ($this->literal('through', 7) || ($forUntil = \true && $this->literal('to', 2))) && $this->expression($end) && $this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $for = new ForBlock(); - $this->registerPushedBlock($for, $s); - $for->var = $varName[1]; - $for->start = $start; - $for->end = $end; - $for->until = isset($forUntil); - return \true; - } - $this->seek($s); - if ($this->literal('@if', 3) && $this->functionCallArgumentsList($cond, \false, '{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $if = new IfBlock(); - $this->registerPushedBlock($if, $s); - while ($cond[0] === Type::T_LIST && !empty($cond['enclosing']) && $cond['enclosing'] === 'parent' && \count($cond[2]) == 1) { - $cond = \reset($cond[2]); - } - $if->cond = $cond; - $if->cases = []; - return \true; - } - $this->seek($s); - if ($this->literal('@debug', 6) && $this->functionCallArgumentsList($value, \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $this->append([Type::T_DEBUG, $value], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@warn', 5) && $this->functionCallArgumentsList($value, \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $this->append([Type::T_WARN, $value], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@error', 6) && $this->functionCallArgumentsList($value, \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $this->append([Type::T_ERROR, $value], $s); - return \true; - } - $this->seek($s); - if ($this->literal('@content', 8) && ($this->end() || $this->matchChar('(') && $this->argValues($argContent) && $this->matchChar(')') && $this->end())) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - $this->append([Type::T_MIXIN_CONTENT, isset($argContent) ? $argContent : null], $s); - return \true; - } - $this->seek($s); - $last = $this->last(); - if (isset($last) && $last[0] === Type::T_IF) { - list(, $if) = $last; - \assert($if instanceof IfBlock); - if ($this->literal('@else', 5)) { - if ($this->matchChar('{', \false)) { - $else = new ElseBlock(); - } elseif ($this->literal('if', 2) && $this->functionCallArgumentsList($cond, \false, '{', \false)) { - $else = new ElseifBlock(); - $else->cond = $cond; - } - if (isset($else)) { - $this->registerPushedBlock($else, $s); - $if->cases[] = $else; - return \true; - } - } - $this->seek($s); - } - // only retain the first @charset directive encountered - if ($this->literal('@charset', 8) && $this->valueList($charset) && $this->end()) { - return \true; - } - $this->seek($s); - if ($this->literal('@supports', 9) && ($t1 = $this->supportsQuery($supportQuery)) && ($t2 = $this->matchChar('{', \false))) { - $directive = new DirectiveBlock(); - $this->registerPushedBlock($directive, $s); - $directive->name = 'supports'; - $directive->value = $supportQuery; - return \true; - } - $this->seek($s); - // doesn't match built in directive, do generic one - if ($this->matchChar('@', \false) && $this->mixedKeyword($dirName) && $this->directiveValue($dirValue, '{')) { - if (\count($dirName) === 1 && \is_string(\reset($dirName))) { - $dirName = \reset($dirName); - } else { - $dirName = [Type::T_STRING, '', $dirName]; - } - if ($dirName === 'media') { - $directive = new MediaBlock(); - } else { - $directive = new DirectiveBlock(); - $directive->name = $dirName; - } - $this->registerPushedBlock($directive, $s); - if (isset($dirValue)) { - !$this->cssOnly || ($dirValue = $this->assertPlainCssValid($dirValue)); - $directive->value = $dirValue; - } - return \true; - } - $this->seek($s); - // maybe it's a generic blockless directive - if ($this->matchChar('@', \false) && $this->mixedKeyword($dirName) && !$this->isKnownGenericDirective($dirName) && ($this->end(\false) || $this->directiveValue($dirValue, '') && $this->end(\false))) { - if (\count($dirName) === 1 && \is_string(\reset($dirName))) { - $dirName = \reset($dirName); - } else { - $dirName = [Type::T_STRING, '', $dirName]; - } - if (!empty($this->env->parent) && $this->env->type && !\in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA])) { - $plain = \trim(\substr($this->buffer, $s, $this->count - $s)); - throw $this->parseError("Unknown directive `{$plain}` not allowed in `" . $this->env->type . "` block"); - } - // blockless directives with a blank line after keeps their blank lines after - // sass-spec compliance purpose - $s = $this->count; - $hasBlankLine = \false; - if ($this->match('\\s*?\\n\\s*\\n', $out, \false)) { - $hasBlankLine = \true; - $this->seek($s); - } - $isNotRoot = !empty($this->env->parent); - $this->append([Type::T_DIRECTIVE, [$dirName, $dirValue, $hasBlankLine, $isNotRoot]], $s); - $this->whitespace(); - return \true; - } - $this->seek($s); - return \false; - } - $inCssSelector = null; - if ($this->cssOnly) { - $inCssSelector = !empty($this->env->parent) && !\in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA]); - } - // custom properties : right part is static - if ($this->customProperty($name) && $this->matchChar(':', \false)) { - $start = $this->count; - // but can be complex and finish with ; or } - foreach ([';', '}'] as $ending) { - if ($this->openString($ending, $stringValue, '(', ')', \false) && $this->end()) { - $end = $this->count; - $value = $stringValue; - // check if we have only a partial value due to nested [] or { } to take in account - $nestingPairs = [['[', ']'], ['{', '}']]; - foreach ($nestingPairs as $nestingPair) { - $p = \strpos($this->buffer, $nestingPair[0], $start); - if ($p && $p < $end) { - $this->seek($start); - if ($this->openString($ending, $stringValue, $nestingPair[0], $nestingPair[1], \false) && $this->end() && $this->count > $end) { - $end = $this->count; - $value = $stringValue; - } - } - } - $this->seek($end); - $this->append([Type::T_CUSTOM_PROPERTY, $name, $value], $s); - return \true; - } - } - // TODO: output an error here if nothing found according to sass spec - } - $this->seek($s); - // property shortcut - // captures most properties before having to parse a selector - if ($this->keyword($name, \false) && $this->literal(': ', 2) && $this->valueList($value) && $this->end()) { - $name = [Type::T_STRING, '', [$name]]; - $this->append([Type::T_ASSIGN, $name, $value], $s); - return \true; - } - $this->seek($s); - // variable assigns - if ($this->variable($name) && $this->matchChar(':') && $this->valueList($value) && $this->end()) { - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - // check for '!flag' - $assignmentFlags = $this->stripAssignmentFlags($value); - $this->append([Type::T_ASSIGN, $name, $value, $assignmentFlags], $s); - return \true; - } - $this->seek($s); - // opening css block - if ($this->selectors($selectors) && $this->matchChar('{', \false)) { - !$this->cssOnly || !$inCssSelector || $this->assertPlainCssValid(\false); - $this->pushBlock($selectors, $s); - if ($this->eatWhiteDefault) { - $this->whitespace(); - $this->append(null); - // collect comments at the beginning if needed - } - return \true; - } - $this->seek($s); - // property assign, or nested assign - if ($this->propertyName($name) && $this->matchChar(':')) { - $foundSomething = \false; - if ($this->valueList($value)) { - if (empty($this->env->parent)) { - throw $this->parseError('expected "{"'); - } - $this->append([Type::T_ASSIGN, $name, $value], $s); - $foundSomething = \true; - } - if ($this->matchChar('{', \false)) { - !$this->cssOnly || $this->assertPlainCssValid(\false); - $propBlock = new NestedPropertyBlock(); - $this->registerPushedBlock($propBlock, $s); - $propBlock->prefix = $name; - $propBlock->hasValue = $foundSomething; - $foundSomething = \true; - } elseif ($foundSomething) { - $foundSomething = $this->end(); - } - if ($foundSomething) { - return \true; - } - } - $this->seek($s); - // closing a block - if ($this->matchChar('}', \false)) { - $block = $this->popBlock(); - if (!isset($block->type) || $block->type !== Type::T_IF) { - \assert($this->env !== null); - if ($this->env->parent) { - $this->append(null); - // collect comments before next statement if needed - } - } - if ($block instanceof ContentBlock) { - $include = $block->child; - \assert(\is_array($include)); - unset($block->child); - $include[3] = $block; - $this->append($include, $s); - } elseif (!$block instanceof ElseBlock && !$block instanceof ElseifBlock) { - $type = isset($block->type) ? $block->type : Type::T_BLOCK; - $this->append([$type, $block], $s); - } - // collect comments just after the block closing if needed - if ($this->eatWhiteDefault) { - $this->whitespace(); - \assert($this->env !== null); - if ($this->env->comments) { - $this->append(null); - } - } - return \true; - } - // extra stuff - if ($this->matchChar(';')) { - return \true; - } - return \false; - } - /** - * Push block onto parse tree - * - * @param array|null $selectors - * @param int $pos - * - * @return Block - */ - protected function pushBlock($selectors, $pos = 0) - { - $b = new Block(); - $b->selectors = $selectors; - $this->registerPushedBlock($b, $pos); - return $b; - } - /** - * @param Block $b - * @param int $pos - * - * @return void - */ - private function registerPushedBlock(Block $b, $pos) - { - list($line, $column) = $this->getSourcePosition($pos); - $b->sourceName = $this->sourceName; - $b->sourceLine = $line; - $b->sourceColumn = $column; - $b->sourceIndex = $this->sourceIndex; - $b->comments = []; - $b->parent = $this->env; - if (!$this->env) { - $b->children = []; - } elseif (empty($this->env->children)) { - $this->env->children = $this->env->comments; - $b->children = []; - $this->env->comments = []; - } else { - $b->children = $this->env->comments; - $this->env->comments = []; - } - $this->env = $b; - // collect comments at the beginning of a block if needed - if ($this->eatWhiteDefault) { - $this->whitespace(); - \assert($this->env !== null); - if ($this->env->comments) { - $this->append(null); - } - } - } - /** - * Push special (named) block onto parse tree - * - * @deprecated - * - * @param string $type - * @param int $pos - * - * @return Block - */ - protected function pushSpecialBlock($type, $pos) - { - $block = $this->pushBlock(null, $pos); - $block->type = $type; - return $block; - } - /** - * Pop scope and return last block - * - * @return Block - * - * @throws \Exception - */ - protected function popBlock() - { - \assert($this->env !== null); - // collect comments ending just before of a block closing - if ($this->env->comments) { - $this->append(null); - } - // pop the block - $block = $this->env; - if (empty($block->parent)) { - throw $this->parseError('unexpected }'); - } - if ($block->type == Type::T_AT_ROOT) { - // keeps the parent in case of self selector & - $block->selfParent = $block->parent; - } - $this->env = $block->parent; - unset($block->parent); - return $block; - } - /** - * Peek input stream - * - * @param string $regex - * @param array $out - * @param int $from - * - * @return int - */ - protected function peek($regex, &$out, $from = null) - { - if (!isset($from)) { - $from = $this->count; - } - $r = '/' . $regex . '/' . $this->patternModifiers; - $result = \preg_match($r, $this->buffer, $out, 0, $from); - return $result; - } - /** - * Seek to position in input stream (or return current position in input stream) - * - * @param int $where - * - * @return void - */ - protected function seek($where) - { - $this->count = $where; - } - /** - * Assert a parsed part is plain CSS Valid - * - * @param array|false $parsed - * @param int $startPos - * - * @return array - * - * @throws ParserException - */ - protected function assertPlainCssValid($parsed, $startPos = null) - { - $type = ''; - if ($parsed) { - $type = $parsed[0]; - $parsed = $this->isPlainCssValidElement($parsed); - } - if (!$parsed) { - if (!\is_null($startPos)) { - $plain = \rtrim(\substr($this->buffer, $startPos, $this->count - $startPos)); - $message = "Error : `{$plain}` isn't allowed in plain CSS"; - } else { - $message = 'Error: SCSS syntax not allowed in CSS file'; - } - if ($type) { - $message .= " ({$type})"; - } - throw $this->parseError($message); - } - return $parsed; - } - /** - * Check a parsed element is plain CSS Valid - * - * @param array $parsed - * @param bool $allowExpression - * - * @return array|false - */ - protected function isPlainCssValidElement($parsed, $allowExpression = \false) - { - // keep string as is - if (\is_string($parsed)) { - return $parsed; - } - if (\in_array($parsed[0], [Type::T_FUNCTION, Type::T_FUNCTION_CALL]) && !\in_array($parsed[1], ['alpha', 'attr', 'calc', 'cubic-bezier', 'env', 'grayscale', 'hsl', 'hsla', 'hwb', 'invert', 'linear-gradient', 'min', 'max', 'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient', 'rgb', 'rgba', 'rotate', 'saturate', 'var']) && Compiler::isNativeFunction($parsed[1])) { - return \false; - } - switch ($parsed[0]) { - case Type::T_BLOCK: - case Type::T_KEYWORD: - case Type::T_NULL: - case Type::T_NUMBER: - case Type::T_MEDIA: - return $parsed; - case Type::T_COMMENT: - if (isset($parsed[2])) { - return \false; - } - return $parsed; - case Type::T_DIRECTIVE: - if (\is_array($parsed[1])) { - $parsed[1][1] = $this->isPlainCssValidElement($parsed[1][1]); - if (!$parsed[1][1]) { - return \false; - } - } - return $parsed; - case Type::T_IMPORT: - if ($parsed[1][0] === Type::T_LIST) { - return \false; - } - $parsed[1] = $this->isPlainCssValidElement($parsed[1]); - if ($parsed[1] === \false) { - return \false; - } - return $parsed; - case Type::T_STRING: - foreach ($parsed[2] as $k => $substr) { - if (\is_array($substr)) { - $parsed[2][$k] = $this->isPlainCssValidElement($substr); - if (!$parsed[2][$k]) { - return \false; - } - } - } - return $parsed; - case Type::T_LIST: - if (!empty($parsed['enclosing'])) { - return \false; - } - foreach ($parsed[2] as $k => $listElement) { - $parsed[2][$k] = $this->isPlainCssValidElement($listElement); - if (!$parsed[2][$k]) { - return \false; - } - } - return $parsed; - case Type::T_ASSIGN: - foreach ([1, 2, 3] as $k) { - if (!empty($parsed[$k])) { - $parsed[$k] = $this->isPlainCssValidElement($parsed[$k]); - if (!$parsed[$k]) { - return \false; - } - } - } - return $parsed; - case Type::T_EXPRESSION: - list(, $op, $lhs, $rhs, $inParens, $whiteBefore, $whiteAfter) = $parsed; - if (!$allowExpression && !\in_array($op, ['and', 'or', '/'])) { - return \false; - } - $lhs = $this->isPlainCssValidElement($lhs, \true); - if (!$lhs) { - return \false; - } - $rhs = $this->isPlainCssValidElement($rhs, \true); - if (!$rhs) { - return \false; - } - return [Type::T_STRING, '', [$this->inParens ? '(' : '', $lhs, ($whiteBefore ? ' ' : '') . $op . ($whiteAfter ? ' ' : ''), $rhs, $this->inParens ? ')' : '']]; - case Type::T_CUSTOM_PROPERTY: - case Type::T_UNARY: - $parsed[2] = $this->isPlainCssValidElement($parsed[2]); - if (!$parsed[2]) { - return \false; - } - return $parsed; - case Type::T_FUNCTION: - $argsList = $parsed[2]; - foreach ($argsList[2] as $argElement) { - if (!$this->isPlainCssValidElement($argElement)) { - return \false; - } - } - return $parsed; - case Type::T_FUNCTION_CALL: - $parsed[0] = Type::T_FUNCTION; - $argsList = [Type::T_LIST, ',', []]; - foreach ($parsed[2] as $arg) { - if ($arg[0] || !empty($arg[2])) { - // no named arguments possible in a css function call - // nor ... argument - return \false; - } - $arg = $this->isPlainCssValidElement($arg[1], $parsed[1] === 'calc'); - if (!$arg) { - return \false; - } - $argsList[2][] = $arg; - } - $parsed[2] = $argsList; - return $parsed; - } - return \false; - } - /** - * Match string looking for either ending delim, escape, or string interpolation - * - * {@internal This is a workaround for preg_match's 250K string match limit. }} - * - * @param array $m Matches (passed by reference) - * @param string $delim Delimiter - * - * @return bool True if match; false otherwise - * - * @phpstan-impure - */ - protected function matchString(&$m, $delim) - { - $token = null; - $end = \strlen($this->buffer); - // look for either ending delim, escape, or string interpolation - foreach (['#{', '\\', "\r", $delim] as $lookahead) { - $pos = \strpos($this->buffer, $lookahead, $this->count); - if ($pos !== \false && $pos < $end) { - $end = $pos; - $token = $lookahead; - } - } - if (!isset($token)) { - return \false; - } - $match = \substr($this->buffer, $this->count, $end - $this->count); - $m = [$match . $token, $match, $token]; - $this->count = $end + \strlen($token); - return \true; - } - /** - * Try to match something on head of buffer - * - * @param string $regex - * @param array $out - * @param bool $eatWhitespace - * - * @return bool - * - * @phpstan-impure - */ - protected function match($regex, &$out, $eatWhitespace = null) - { - $r = '/' . $regex . '/' . $this->patternModifiers; - if (!\preg_match($r, $this->buffer, $out, 0, $this->count)) { - return \false; - } - $this->count += \strlen($out[0]); - if (!isset($eatWhitespace)) { - $eatWhitespace = $this->eatWhiteDefault; - } - if ($eatWhitespace) { - $this->whitespace(); - } - return \true; - } - /** - * Match a single string - * - * @param string $char - * @param bool $eatWhitespace - * - * @return bool - * - * @phpstan-impure - */ - protected function matchChar($char, $eatWhitespace = null) - { - if (!isset($this->buffer[$this->count]) || $this->buffer[$this->count] !== $char) { - return \false; - } - $this->count++; - if (!isset($eatWhitespace)) { - $eatWhitespace = $this->eatWhiteDefault; - } - if ($eatWhitespace) { - $this->whitespace(); - } - return \true; - } - /** - * Match literal string - * - * @param string $what - * @param int $len - * @param bool $eatWhitespace - * - * @return bool - * - * @phpstan-impure - */ - protected function literal($what, $len, $eatWhitespace = null) - { - if (\strcasecmp(\substr($this->buffer, $this->count, $len), $what) !== 0) { - return \false; - } - $this->count += $len; - if (!isset($eatWhitespace)) { - $eatWhitespace = $this->eatWhiteDefault; - } - if ($eatWhitespace) { - $this->whitespace(); - } - return \true; - } - /** - * Match some whitespace - * - * @return bool - * - * @phpstan-impure - */ - protected function whitespace() - { - $gotWhite = \false; - while (\preg_match(static::$whitePattern, $this->buffer, $m, 0, $this->count)) { - if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { - // comment that are kept in the output CSS - $comment = []; - $startCommentCount = $this->count; - $endCommentCount = $this->count + \strlen($m[1]); - // find interpolations in comment - $p = \strpos($this->buffer, '#{', $this->count); - while ($p !== \false && $p < $endCommentCount) { - $c = \substr($this->buffer, $this->count, $p - $this->count); - $comment[] = $c; - $this->count = $p; - $out = null; - if ($this->interpolation($out)) { - // keep right spaces in the following string part - if ($out[3]) { - while ($this->buffer[$this->count - 1] !== '}') { - $this->count--; - } - $out[3] = ''; - } - $comment[] = [Type::T_COMMENT, \substr($this->buffer, $p, $this->count - $p), $out]; - } else { - list($line, $column) = $this->getSourcePosition($this->count); - $file = $this->sourceName; - if (!$this->discardComments) { - $this->logger->warn("Unterminated interpolations in multiline comments are deprecated and will be removed in ScssPhp 2.0, in \"{$file}\", line {$line}, column {$column}.", \true); - } - $comment[] = \substr($this->buffer, $this->count, 2); - $this->count += 2; - } - $p = \strpos($this->buffer, '#{', $this->count); - } - // remaining part - $c = \substr($this->buffer, $this->count, $endCommentCount - $this->count); - if (!$comment) { - // single part static comment - $commentStatement = [Type::T_COMMENT, $c]; - } else { - $comment[] = $c; - $staticComment = \substr($this->buffer, $startCommentCount, $endCommentCount - $startCommentCount); - $commentStatement = [Type::T_COMMENT, $staticComment, [Type::T_STRING, '', $comment]]; - } - list($line, $column) = $this->getSourcePosition($startCommentCount); - $commentStatement[self::SOURCE_LINE] = $line; - $commentStatement[self::SOURCE_COLUMN] = $column; - $commentStatement[self::SOURCE_INDEX] = $this->sourceIndex; - $this->appendComment($commentStatement); - $this->commentsSeen[$startCommentCount] = \true; - $this->count = $endCommentCount; - } else { - // comment that are ignored and not kept in the output css - $this->count += \strlen($m[0]); - // silent comments are not allowed in plain CSS files - !$this->cssOnly || !\strlen(\trim($m[0])) || $this->assertPlainCssValid(\false, $this->count - \strlen($m[0])); - } - $gotWhite = \true; - } - return $gotWhite; - } - /** - * Append comment to current block - * - * @param array $comment - * - * @return void - */ - protected function appendComment($comment) - { - \assert($this->env !== null); - if (!$this->discardComments) { - $this->env->comments[] = $comment; - } - } - /** - * Append statement to current block - * - * @param array|null $statement - * @param int $pos - * - * @return void - */ - protected function append($statement, $pos = null) - { - \assert($this->env !== null); - if (!\is_null($statement)) { - !$this->cssOnly || ($statement = $this->assertPlainCssValid($statement, $pos)); - if (!\is_null($pos)) { - list($line, $column) = $this->getSourcePosition($pos); - $statement[static::SOURCE_LINE] = $line; - $statement[static::SOURCE_COLUMN] = $column; - $statement[static::SOURCE_INDEX] = $this->sourceIndex; - } - $this->env->children[] = $statement; - } - $comments = $this->env->comments; - if ($comments) { - $this->env->children = \array_merge($this->env->children, $comments); - $this->env->comments = []; - } - } - /** - * Returns last child was appended - * - * @return array|null - */ - protected function last() - { - \assert($this->env !== null); - $i = \count($this->env->children) - 1; - if (isset($this->env->children[$i])) { - return $this->env->children[$i]; - } - return null; - } - /** - * Parse media query list - * - * @param array $out - * - * @return bool - */ - protected function mediaQueryList(&$out) - { - return $this->genericList($out, 'mediaQuery', ',', \false); - } - /** - * Parse media query - * - * @param array $out - * - * @return bool - */ - protected function mediaQuery(&$out) - { - $expressions = null; - $parts = []; - if (($this->literal('only', 4) && ($only = \true) || $this->literal('not', 3) && ($not = \true) || \true) && $this->mixedKeyword($mediaType)) { - $prop = [Type::T_MEDIA_TYPE]; - if (isset($only)) { - $prop[] = [Type::T_KEYWORD, 'only']; - } - if (isset($not)) { - $prop[] = [Type::T_KEYWORD, 'not']; - } - $media = [Type::T_LIST, '', []]; - foreach ((array) $mediaType as $type) { - if (\is_array($type)) { - $media[2][] = $type; - } else { - $media[2][] = [Type::T_KEYWORD, $type]; - } - } - $prop[] = $media; - $parts[] = $prop; - } - if (empty($parts) || $this->literal('and', 3)) { - $this->genericList($expressions, 'mediaExpression', 'and', \false); - if (\is_array($expressions)) { - $parts = \array_merge($parts, $expressions[2]); - } - } - $out = $parts; - return \true; - } - /** - * Parse supports query - * - * @param array $out - * - * @return bool - */ - protected function supportsQuery(&$out) - { - $expressions = null; - $parts = []; - $s = $this->count; - $not = \false; - if (($this->literal('not', 3) && ($not = \true) || \true) && $this->matchChar('(') && $this->expression($property) && $this->literal(': ', 2) && $this->valueList($value) && $this->matchChar(')')) { - $support = [Type::T_STRING, '', [[Type::T_KEYWORD, ($not ? 'not ' : '') . '(']]]; - $support[2][] = $property; - $support[2][] = [Type::T_KEYWORD, ': ']; - $support[2][] = $value; - $support[2][] = [Type::T_KEYWORD, ')']; - $parts[] = $support; - $s = $this->count; - } else { - $this->seek($s); - } - if ($this->matchChar('(') && $this->supportsQuery($subQuery) && $this->matchChar(')')) { - $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, '('], $subQuery, [Type::T_KEYWORD, ')']]]; - $s = $this->count; - } else { - $this->seek($s); - } - if ($this->literal('not', 3) && $this->supportsQuery($subQuery)) { - $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, 'not '], $subQuery]]; - $s = $this->count; - } else { - $this->seek($s); - } - if ($this->literal('selector(', 9) && $this->selector($selector) && $this->matchChar(')')) { - $support = [Type::T_STRING, '', [[Type::T_KEYWORD, 'selector(']]]; - $selectorList = [Type::T_LIST, '', []]; - foreach ($selector as $sc) { - $compound = [Type::T_STRING, '', []]; - foreach ($sc as $scp) { - if (\is_array($scp)) { - $compound[2][] = $scp; - } else { - $compound[2][] = [Type::T_KEYWORD, $scp]; - } - } - $selectorList[2][] = $compound; - } - $support[2][] = $selectorList; - $support[2][] = [Type::T_KEYWORD, ')']; - $parts[] = $support; - $s = $this->count; - } else { - $this->seek($s); - } - if ($this->variable($var) or $this->interpolation($var)) { - $parts[] = $var; - $s = $this->count; - } else { - $this->seek($s); - } - if ($this->literal('and', 3) && $this->genericList($expressions, 'supportsQuery', ' and', \false)) { - \array_unshift($expressions[2], [Type::T_STRING, '', $parts]); - $parts = [$expressions]; - $s = $this->count; - } else { - $this->seek($s); - } - if ($this->literal('or', 2) && $this->genericList($expressions, 'supportsQuery', ' or', \false)) { - \array_unshift($expressions[2], [Type::T_STRING, '', $parts]); - $parts = [$expressions]; - $s = $this->count; - } else { - $this->seek($s); - } - if (\count($parts)) { - if ($this->eatWhiteDefault) { - $this->whitespace(); - } - $out = [Type::T_STRING, '', $parts]; - return \true; - } - return \false; - } - /** - * Parse media expression - * - * @param array $out - * - * @return bool - */ - protected function mediaExpression(&$out) - { - $s = $this->count; - $value = null; - if ($this->matchChar('(') && $this->expression($feature) && ($this->matchChar(':') && $this->expression($value) || \true) && $this->matchChar(')')) { - $out = [Type::T_MEDIA_EXPRESSION, $feature]; - if ($value) { - $out[] = $value; - } - return \true; - } - $this->seek($s); - return \false; - } - /** - * Parse argument values - * - * @param array $out - * - * @return bool - */ - protected function argValues(&$out) - { - $discardComments = $this->discardComments; - $this->discardComments = \true; - if ($this->genericList($list, 'argValue', ',', \false)) { - $out = $list[2]; - $this->discardComments = $discardComments; - return \true; - } - $this->discardComments = $discardComments; - return \false; - } - /** - * Parse argument value - * - * @param array $out - * - * @return bool - */ - protected function argValue(&$out) - { - $s = $this->count; - $keyword = null; - if (!$this->variable($keyword) || !$this->matchChar(':')) { - $this->seek($s); - $keyword = null; - } - if ($this->genericList($value, 'expression', '', \true)) { - $out = [$keyword, $value, \false]; - $s = $this->count; - if ($this->literal('...', 3)) { - $out[2] = \true; - } else { - $this->seek($s); - } - return \true; - } - return \false; - } - /** - * Check if a generic directive is known to be able to allow almost any syntax or not - * @param mixed $directiveName - * @return bool - */ - protected function isKnownGenericDirective($directiveName) - { - if (\is_array($directiveName) && \is_string(\reset($directiveName))) { - $directiveName = \reset($directiveName); - } - if (!\is_string($directiveName)) { - return \false; - } - if (\in_array($directiveName, [ - 'at-root', - 'media', - 'mixin', - 'include', - 'scssphp-import-once', - 'import', - 'extend', - 'function', - 'break', - 'continue', - 'return', - 'each', - 'while', - 'for', - 'if', - 'debug', - 'warn', - 'error', - 'content', - 'else', - 'charset', - 'supports', - // Todo - 'use', - 'forward', - ])) { - return \true; - } - return \false; - } - /** - * Parse directive value list that considers $vars as keyword - * - * @param array $out - * @param string|false $endChar - * - * @return bool - * - * @phpstan-impure - */ - protected function directiveValue(&$out, $endChar = \false) - { - $s = $this->count; - if ($this->variable($out)) { - if ($endChar && $this->matchChar($endChar, \false)) { - return \true; - } - if (!$endChar && $this->end()) { - return \true; - } - } - $this->seek($s); - if (\is_string($endChar) && $this->openString($endChar ? $endChar : ';', $out, null, null, \true, ";}{")) { - if ($endChar && $this->matchChar($endChar, \false)) { - return \true; - } - $ss = $this->count; - if (!$endChar && $this->end()) { - $this->seek($ss); - return \true; - } - } - $this->seek($s); - $allowVars = $this->allowVars; - $this->allowVars = \false; - $res = $this->genericList($out, 'spaceList', ','); - $this->allowVars = $allowVars; - if ($res) { - if ($endChar && $this->matchChar($endChar, \false)) { - return \true; - } - if (!$endChar && $this->end()) { - return \true; - } - } - $this->seek($s); - if ($endChar && $this->matchChar($endChar, \false)) { - return \true; - } - return \false; - } - /** - * Parse comma separated value list - * - * @param array $out - * - * @return bool - */ - protected function valueList(&$out) - { - $discardComments = $this->discardComments; - $this->discardComments = \true; - $res = $this->genericList($out, 'spaceList', ','); - $this->discardComments = $discardComments; - return $res; - } - /** - * Parse a function call, where externals () are part of the call - * and not of the value list - * - * @param array $out - * @param bool $mandatoryEnclos - * @param null|string $charAfter - * @param null|bool $eatWhiteSp - * - * @return bool - */ - protected function functionCallArgumentsList(&$out, $mandatoryEnclos = \true, $charAfter = null, $eatWhiteSp = null) - { - $s = $this->count; - if ($this->matchChar('(') && $this->valueList($out) && $this->matchChar(')') && ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end())) { - return \true; - } - if (!$mandatoryEnclos) { - $this->seek($s); - if ($this->valueList($out) && ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end())) { - return \true; - } - } - $this->seek($s); - return \false; - } - /** - * Parse space separated value list - * - * @param array $out - * - * @return bool - */ - protected function spaceList(&$out) - { - return $this->genericList($out, 'expression'); - } - /** - * Parse generic list - * - * @param array $out - * @param string $parseItem The name of the method used to parse items - * @param string $delim - * @param bool $flatten - * - * @return bool - */ - protected function genericList(&$out, $parseItem, $delim = '', $flatten = \true) - { - $s = $this->count; - $items = []; - /** @var array|Number|null $value */ - $value = null; - while ($this->{$parseItem}($value)) { - $trailing_delim = \false; - $items[] = $value; - if ($delim) { - if (!$this->literal($delim, \strlen($delim))) { - break; - } - $trailing_delim = \true; - } else { - \assert(\is_array($value) || $value instanceof Number); - // if no delim watch that a keyword didn't eat the single/double quote - // from the following starting string - if ($value[0] === Type::T_KEYWORD) { - \assert(\is_array($value)); - /** @var string $word */ - $word = $value[1]; - $last_char = \substr($word, -1); - if (\strlen($word) > 1 && \in_array($last_char, ["'", '"']) && \substr($word, -2, 1) !== '\\') { - // if there is a non escaped opening quote in the keyword, this seems unlikely a mistake - $word = \str_replace('\\' . $last_char, '\\\\', $word); - if (\strpos($word, $last_char) < \strlen($word) - 1) { - continue; - } - $currentCount = $this->count; - // let's try to rewind to previous char and try a parse - $this->count--; - // in case the keyword also eat spaces - while (\substr($this->buffer, $this->count, 1) !== $last_char) { - $this->count--; - } - /** @var array|Number|null $nextValue */ - $nextValue = null; - if ($this->{$parseItem}($nextValue)) { - \assert(\is_array($nextValue) || $nextValue instanceof Number); - if ($nextValue[0] === Type::T_KEYWORD && $nextValue[1] === $last_char) { - // bad try, forget it - $this->seek($currentCount); - continue; - } - if ($nextValue[0] !== Type::T_STRING) { - // bad try, forget it - $this->seek($currentCount); - continue; - } - // OK it was a good idea - $value[1] = \substr($value[1], 0, -1); - \array_pop($items); - $items[] = $value; - $items[] = $nextValue; - } else { - // bad try, forget it - $this->seek($currentCount); - continue; - } - } - } - } - } - if (!$items) { - $this->seek($s); - return \false; - } - if ($trailing_delim) { - $items[] = [Type::T_NULL]; - } - if ($flatten && \count($items) === 1) { - $out = $items[0]; - } else { - $out = [Type::T_LIST, $delim, $items]; - } - return \true; - } - /** - * Parse expression - * - * @param array $out - * @param bool $listOnly - * @param bool $lookForExp - * - * @return bool - * - * @phpstan-impure - */ - protected function expression(&$out, $listOnly = \false, $lookForExp = \true) - { - $s = $this->count; - $discard = $this->discardComments; - $this->discardComments = \true; - $allowedTypes = $listOnly ? [Type::T_LIST] : [Type::T_LIST, Type::T_MAP]; - if ($this->matchChar('(')) { - if ($this->enclosedExpression($lhs, $s, ')', $allowedTypes)) { - if ($lookForExp) { - $out = $this->expHelper($lhs, 0); - } else { - $out = $lhs; - } - $this->discardComments = $discard; - return \true; - } - $this->seek($s); - } - if (\in_array(Type::T_LIST, $allowedTypes) && $this->matchChar('[')) { - if ($this->enclosedExpression($lhs, $s, ']', [Type::T_LIST])) { - if ($lookForExp) { - $out = $this->expHelper($lhs, 0); - } else { - $out = $lhs; - } - $this->discardComments = $discard; - return \true; - } - $this->seek($s); - } - if (!$listOnly && $this->value($lhs)) { - if ($lookForExp) { - $out = $this->expHelper($lhs, 0); - } else { - $out = $lhs; - } - $this->discardComments = $discard; - return \true; - } - $this->discardComments = $discard; - return \false; - } - /** - * Parse expression specifically checking for lists in parenthesis or brackets - * - * @param array $out - * @param int $s - * @param string $closingParen - * @param string[] $allowedTypes - * - * @return bool - * - * @phpstan-param array $allowedTypes - */ - protected function enclosedExpression(&$out, $s, $closingParen = ')', $allowedTypes = [Type::T_LIST, Type::T_MAP]) - { - if ($this->matchChar($closingParen) && \in_array(Type::T_LIST, $allowedTypes)) { - $out = [Type::T_LIST, '', []]; - switch ($closingParen) { - case ')': - $out['enclosing'] = 'parent'; - // parenthesis list - break; - case ']': - $out['enclosing'] = 'bracket'; - // bracketed list - break; - } - return \true; - } - if ($this->valueList($out) && $this->matchChar($closingParen) && !($closingParen === ')' && \in_array($out[0], [Type::T_EXPRESSION, Type::T_UNARY])) && \in_array(Type::T_LIST, $allowedTypes)) { - if ($out[0] !== Type::T_LIST || !empty($out['enclosing'])) { - $out = [Type::T_LIST, '', [$out]]; - } - switch ($closingParen) { - case ')': - $out['enclosing'] = 'parent'; - // parenthesis list - break; - case ']': - $out['enclosing'] = 'bracket'; - // bracketed list - break; - } - return \true; - } - $this->seek($s); - if (\in_array(Type::T_MAP, $allowedTypes) && $this->map($out)) { - return \true; - } - return \false; - } - /** - * Parse left-hand side of subexpression - * - * @param array $lhs - * @param int $minP - * - * @return array - */ - protected function expHelper($lhs, $minP) - { - $operators = static::$operatorPattern; - $ss = $this->count; - $whiteBefore = isset($this->buffer[$this->count - 1]) && \ctype_space($this->buffer[$this->count - 1]); - while ($this->match($operators, $m, \false) && static::$precedence[\strtolower($m[1])] >= $minP) { - $whiteAfter = isset($this->buffer[$this->count]) && \ctype_space($this->buffer[$this->count]); - $varAfter = isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '$'; - $this->whitespace(); - $op = $m[1]; - // don't turn negative numbers into expressions - if ($op === '-' && $whiteBefore && !$whiteAfter && !$varAfter) { - break; - } - if (!$this->value($rhs) && !$this->expression($rhs, \true, \false)) { - break; - } - if ($op === '-' && !$whiteAfter && $rhs[0] === Type::T_KEYWORD) { - break; - } - // consume higher-precedence operators on the right-hand side - $rhs = $this->expHelper($rhs, static::$precedence[\strtolower($op)] + 1); - $lhs = [Type::T_EXPRESSION, $op, $lhs, $rhs, $this->inParens, $whiteBefore, $whiteAfter]; - $ss = $this->count; - $whiteBefore = isset($this->buffer[$this->count - 1]) && \ctype_space($this->buffer[$this->count - 1]); - } - $this->seek($ss); - return $lhs; - } - /** - * Parse value - * - * @param array $out - * - * @return bool - */ - protected function value(&$out) - { - if (!isset($this->buffer[$this->count])) { - return \false; - } - $s = $this->count; - $char = $this->buffer[$this->count]; - if ($this->literal('url(', 4) && $this->match('data:([a-z]+)\\/([a-z0-9.+-]+);base64,', $m, \false)) { - $len = \strspn($this->buffer, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz0123456789+/=', $this->count); - $this->count += $len; - if ($this->matchChar(')')) { - $content = \substr($this->buffer, $s, $this->count - $s); - $out = [Type::T_KEYWORD, $content]; - return \true; - } - } - $this->seek($s); - if ($this->literal('url(', 4, \false) && $this->match('\\s*(\\/\\/[^\\s\\)]+)\\s*', $m)) { - $content = 'url(' . $m[1]; - if ($this->matchChar(')')) { - $content .= ')'; - $out = [Type::T_KEYWORD, $content]; - return \true; - } - } - $this->seek($s); - // not - if ($char === 'n' && $this->literal('not', 3, \false)) { - if ($this->whitespace() && $this->value($inner)) { - $out = [Type::T_UNARY, 'not', $inner, $this->inParens]; - return \true; - } - $this->seek($s); - if ($this->parenValue($inner)) { - $out = [Type::T_UNARY, 'not', $inner, $this->inParens]; - return \true; - } - $this->seek($s); - } - // addition - if ($char === '+') { - $this->count++; - $follow_white = $this->whitespace(); - if ($this->value($inner)) { - $out = [Type::T_UNARY, '+', $inner, $this->inParens]; - return \true; - } - if ($follow_white) { - $out = [Type::T_KEYWORD, $char]; - return \true; - } - $this->seek($s); - return \false; - } - // negation - if ($char === '-') { - if ($this->customProperty($out)) { - return \true; - } - $this->count++; - $follow_white = $this->whitespace(); - if ($this->variable($inner) || $this->unit($inner) || $this->parenValue($inner)) { - $out = [Type::T_UNARY, '-', $inner, $this->inParens]; - return \true; - } - if ($this->keyword($inner) && !$this->func($inner, $out)) { - $out = [Type::T_UNARY, '-', $inner, $this->inParens]; - return \true; - } - if ($follow_white) { - $out = [Type::T_KEYWORD, $char]; - return \true; - } - $this->seek($s); - } - // paren - if ($char === '(' && $this->parenValue($out)) { - return \true; - } - if ($char === '#') { - if ($this->interpolation($out) || $this->color($out)) { - return \true; - } - $this->count++; - if ($this->keyword($keyword)) { - $out = [Type::T_KEYWORD, '#' . $keyword]; - return \true; - } - $this->count--; - } - if ($this->matchChar('&', \true)) { - $out = [Type::T_SELF]; - return \true; - } - if ($char === '$' && $this->variable($out)) { - return \true; - } - if ($char === 'p' && $this->progid($out)) { - return \true; - } - if (($char === '"' || $char === "'") && $this->string($out)) { - return \true; - } - if ($this->unit($out)) { - return \true; - } - // unicode range with wildcards - if ($this->literal('U+', 2) && $this->match('\\?+|([0-9A-F]+(\\?+|(-[0-9A-F]+))?)', $m, \false)) { - $unicode = \explode('-', $m[0]); - if (\strlen(\reset($unicode)) <= 6 && \strlen(\end($unicode)) <= 6) { - $out = [Type::T_KEYWORD, 'U+' . $m[0]]; - return \true; - } - $this->count -= \strlen($m[0]) + 2; - } - if ($this->keyword($keyword, \false)) { - if ($this->func($keyword, $out)) { - return \true; - } - $this->whitespace(); - if ($keyword === 'null') { - $out = [Type::T_NULL]; - } else { - $out = [Type::T_KEYWORD, $keyword]; - } - return \true; - } - return \false; - } - /** - * Parse parenthesized value - * - * @param array $out - * - * @return bool - */ - protected function parenValue(&$out) - { - $s = $this->count; - $inParens = $this->inParens; - if ($this->matchChar('(')) { - if ($this->matchChar(')')) { - $out = [Type::T_LIST, '', []]; - return \true; - } - $this->inParens = \true; - if ($this->expression($exp) && $this->matchChar(')')) { - $out = $exp; - $this->inParens = $inParens; - return \true; - } - } - $this->inParens = $inParens; - $this->seek($s); - return \false; - } - /** - * Parse "progid:" - * - * @param array $out - * - * @return bool - */ - protected function progid(&$out) - { - $s = $this->count; - if ($this->literal('progid:', 7, \false) && $this->openString('(', $fn) && $this->matchChar('(')) { - $this->openString(')', $args, '('); - if ($this->matchChar(')')) { - $out = [Type::T_STRING, '', ['progid:', $fn, '(', $args, ')']]; - return \true; - } - } - $this->seek($s); - return \false; - } - /** - * Parse function call - * - * @param string $name - * @param array $func - * - * @return bool - */ - protected function func($name, &$func) - { - $s = $this->count; - if ($this->matchChar('(')) { - if ($name === 'alpha' && $this->argumentList($args)) { - $func = [Type::T_FUNCTION, $name, [Type::T_STRING, '', $args]]; - return \true; - } - if ($name !== 'expression' && !\preg_match('/^(-[a-z]+-)?calc$/', $name)) { - $ss = $this->count; - if ($this->argValues($args) && $this->matchChar(')')) { - if (\strtolower($name) === 'var' && \count($args) === 2 && $args[1][0] === Type::T_NULL) { - $args[1] = [null, [Type::T_STRING, '', [' ']], \false]; - } - $func = [Type::T_FUNCTION_CALL, $name, $args]; - return \true; - } - $this->seek($ss); - } - if (($this->openString(')', $str, '(') || \true) && $this->matchChar(')')) { - $args = []; - if (!empty($str)) { - $args[] = [null, [Type::T_STRING, '', [$str]]]; - } - $func = [Type::T_FUNCTION_CALL, $name, $args]; - return \true; - } - } - $this->seek($s); - return \false; - } - /** - * Parse function call argument list - * - * @param array $out - * - * @return bool - */ - protected function argumentList(&$out) - { - $s = $this->count; - $this->matchChar('('); - $args = []; - while ($this->keyword($var)) { - if ($this->matchChar('=') && $this->expression($exp)) { - $args[] = [Type::T_STRING, '', [$var . '=']]; - $arg = $exp; - } else { - break; - } - $args[] = $arg; - if (!$this->matchChar(',')) { - break; - } - $args[] = [Type::T_STRING, '', [', ']]; - } - if (!$this->matchChar(')') || !$args) { - $this->seek($s); - return \false; - } - $out = $args; - return \true; - } - /** - * Parse mixin/function definition argument list - * - * @param array $out - * - * @return bool - */ - protected function argumentDef(&$out) - { - $s = $this->count; - $this->matchChar('('); - $args = []; - while ($this->variable($var)) { - $arg = [$var[1], null, \false]; - $ss = $this->count; - if ($this->matchChar(':') && $this->genericList($defaultVal, 'expression', '', \true)) { - $arg[1] = $defaultVal; - } else { - $this->seek($ss); - } - $ss = $this->count; - if ($this->literal('...', 3)) { - $sss = $this->count; - if (!$this->matchChar(')')) { - throw $this->parseError('... has to be after the final argument'); - } - $arg[2] = \true; - $this->seek($sss); - } else { - $this->seek($ss); - } - $args[] = $arg; - if (!$this->matchChar(',')) { - break; - } - } - if (!$this->matchChar(')')) { - $this->seek($s); - return \false; - } - $out = $args; - return \true; - } - /** - * Parse map - * - * @param array $out - * - * @return bool - */ - protected function map(&$out) - { - $s = $this->count; - if (!$this->matchChar('(')) { - return \false; - } - $keys = []; - $values = []; - while ($this->genericList($key, 'expression', '', \true) && $this->matchChar(':') && $this->genericList($value, 'expression', '', \true)) { - $keys[] = $key; - $values[] = $value; - if (!$this->matchChar(',')) { - break; - } - } - if (!$keys || !$this->matchChar(')')) { - $this->seek($s); - return \false; - } - $out = [Type::T_MAP, $keys, $values]; - return \true; - } - /** - * Parse color - * - * @param array $out - * - * @return bool - */ - protected function color(&$out) - { - $s = $this->count; - if ($this->match('(#([0-9a-f]+)\\b)', $m)) { - if (\in_array(\strlen($m[2]), [3, 4, 6, 8])) { - $out = [Type::T_KEYWORD, $m[0]]; - return \true; - } - $this->seek($s); - return \false; - } - return \false; - } - /** - * Parse number with unit - * - * @param array $unit - * - * @return bool - */ - protected function unit(&$unit) - { - $s = $this->count; - if ($this->match('([0-9]*(\\.)?[0-9]+)([%a-zA-Z]+)?', $m, \false)) { - if (\strlen($this->buffer) === $this->count || !\ctype_digit($this->buffer[$this->count])) { - $this->whitespace(); - $unit = new Node\Number($m[1], empty($m[3]) ? '' : $m[3]); - return \true; - } - $this->seek($s); - } - return \false; - } - /** - * Parse string - * - * @param array $out - * @param bool $keepDelimWithInterpolation - * - * @return bool - */ - protected function string(&$out, $keepDelimWithInterpolation = \false) - { - $s = $this->count; - if ($this->matchChar('"', \false)) { - $delim = '"'; - } elseif ($this->matchChar("'", \false)) { - $delim = "'"; - } else { - return \false; - } - $content = []; - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = \false; - $hasInterpolation = \false; - while ($this->matchString($m, $delim)) { - if ($m[1] !== '') { - $content[] = $m[1]; - } - if ($m[2] === '#{') { - $this->count -= \strlen($m[2]); - if ($this->interpolation($inter, \false)) { - $content[] = $inter; - $hasInterpolation = \true; - } else { - $this->count += \strlen($m[2]); - $content[] = '#{'; - // ignore it - } - } elseif ($m[2] === "\r") { - $content[] = \chr(10); - // TODO : warning - # DEPRECATION WARNING on line x, column y of zzz: - # Unescaped multiline strings are deprecated and will be removed in a future version of Sass. - # To include a newline in a string, use "\a" or "\a " as in CSS. - if ($this->matchChar("\n", \false)) { - $content[] = ' '; - } - } elseif ($m[2] === '\\') { - if ($this->literal("\r\n", 2, \false) || $this->matchChar("\r", \false) || $this->matchChar("\n", \false) || $this->matchChar("\f", \false)) { - // this is a continuation escaping, to be ignored - } elseif ($this->matchEscapeCharacter($c)) { - $content[] = $c; - } else { - throw $this->parseError('Unterminated escape sequence'); - } - } else { - $this->count -= \strlen($delim); - break; - // delim - } - } - $this->eatWhiteDefault = $oldWhite; - if ($this->literal($delim, \strlen($delim))) { - if ($hasInterpolation && !$keepDelimWithInterpolation) { - $delim = '"'; - } - $out = [Type::T_STRING, $delim, $content]; - return \true; - } - $this->seek($s); - return \false; - } - /** - * @param string $out - * @param bool $inKeywords - * - * @return bool - */ - protected function matchEscapeCharacter(&$out, $inKeywords = \false) - { - $s = $this->count; - if ($this->match('[a-f0-9]', $m, \false)) { - $hex = $m[0]; - for ($i = 5; $i--;) { - if ($this->match('[a-f0-9]', $m, \false)) { - $hex .= $m[0]; - } else { - break; - } - } - // CSS allows Unicode escape sequences to be followed by a delimiter space - // (necessary in some cases for shorter sequences to disambiguate their end) - $this->matchChar(' ', \false); - $value = \hexdec($hex); - if (!$inKeywords && ($value == 0 || $value >= 0xd800 && $value <= 0xdfff || $value >= 0x10ffff)) { - $out = "�"; - // "\u{FFFD}" but with a syntax supported on PHP 5 - } elseif ($value < 0x20) { - $out = Util::mbChr($value); - } else { - $out = Util::mbChr($value); - } - return \true; - } - if ($this->match('.', $m, \false)) { - if ($inKeywords && \in_array($m[0], ["'", '"', '@', '&', ' ', '\\', ':', '/', '%'])) { - $this->seek($s); - return \false; - } - $out = $m[0]; - return \true; - } - return \false; - } - /** - * Parse keyword or interpolation - * - * @param array $out - * @param bool $restricted - * - * @return bool - */ - protected function mixedKeyword(&$out, $restricted = \false) - { - $parts = []; - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = \false; - for (;;) { - if ($restricted ? $this->restrictedKeyword($key) : $this->keyword($key)) { - $parts[] = $key; - continue; - } - if ($this->interpolation($inter)) { - $parts[] = $inter; - continue; - } - break; - } - $this->eatWhiteDefault = $oldWhite; - if (!$parts) { - return \false; - } - if ($this->eatWhiteDefault) { - $this->whitespace(); - } - $out = $parts; - return \true; - } - /** - * Parse an unbounded string stopped by $end - * - * @param string $end - * @param array $out - * @param string $nestOpen - * @param string $nestClose - * @param bool $rtrim - * @param string $disallow - * - * @return bool - */ - protected function openString($end, &$out, $nestOpen = null, $nestClose = null, $rtrim = \true, $disallow = null) - { - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = \false; - if ($nestOpen && !$nestClose) { - $nestClose = $end; - } - $patt = $disallow ? '[^' . $this->pregQuote($disallow) . ']' : '.'; - $patt = '(' . $patt . '*?)([\'"]|#\\{|' . $this->pregQuote($end) . '|' . ($nestClose && $nestClose !== $end ? $this->pregQuote($nestClose) . '|' : '') . static::$commentPattern . ')'; - $nestingLevel = 0; - $content = []; - while ($this->match($patt, $m, \false)) { - if (isset($m[1]) && $m[1] !== '') { - $content[] = $m[1]; - if ($nestOpen) { - $nestingLevel += \substr_count($m[1], $nestOpen); - } - } - $tok = $m[2]; - $this->count -= \strlen($tok); - if ($tok === $end && !$nestingLevel) { - break; - } - if ($tok === $nestClose) { - $nestingLevel--; - } - if (($tok === "'" || $tok === '"') && $this->string($str, \true)) { - $content[] = $str; - continue; - } - if ($tok === '#{' && $this->interpolation($inter)) { - $content[] = $inter; - continue; - } - $content[] = $tok; - $this->count += \strlen($tok); - } - $this->eatWhiteDefault = $oldWhite; - if (!$content || $tok !== $end) { - return \false; - } - // trim the end - if ($rtrim && \is_string(\end($content))) { - $content[\count($content) - 1] = \rtrim(\end($content)); - } - $out = [Type::T_STRING, '', $content]; - return \true; - } - /** - * Parser interpolation - * - * @param string|array $out - * @param bool $lookWhite save information about whitespace before and after - * - * @return bool - */ - protected function interpolation(&$out, $lookWhite = \true) - { - $oldWhite = $this->eatWhiteDefault; - $allowVars = $this->allowVars; - $this->allowVars = \true; - $this->eatWhiteDefault = \true; - $s = $this->count; - if ($this->literal('#{', 2) && $this->valueList($value) && $this->matchChar('}', \false)) { - if ($value === [Type::T_SELF]) { - $out = $value; - } else { - if ($lookWhite) { - $left = $s > 0 && \preg_match('/\\s/', $this->buffer[$s - 1]) ? ' ' : ''; - $right = !empty($this->buffer[$this->count]) && \preg_match('/\\s/', $this->buffer[$this->count]) ? ' ' : ''; - } else { - $left = $right = \false; - } - $out = [Type::T_INTERPOLATE, $value, $left, $right]; - } - $this->eatWhiteDefault = $oldWhite; - $this->allowVars = $allowVars; - if ($this->eatWhiteDefault) { - $this->whitespace(); - } - return \true; - } - $this->seek($s); - $this->eatWhiteDefault = $oldWhite; - $this->allowVars = $allowVars; - return \false; - } - /** - * Parse property name (as an array of parts or a string) - * - * @param array $out - * - * @return bool - */ - protected function propertyName(&$out) - { - $parts = []; - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = \false; - for (;;) { - if ($this->interpolation($inter)) { - $parts[] = $inter; - continue; - } - if ($this->keyword($text)) { - $parts[] = $text; - continue; - } - if (!$parts && $this->match('[:.#]', $m, \false)) { - // css hacks - $parts[] = $m[0]; - continue; - } - break; - } - $this->eatWhiteDefault = $oldWhite; - if (!$parts) { - return \false; - } - // match comment hack - if (\preg_match(static::$whitePattern, $this->buffer, $m, 0, $this->count)) { - if (!empty($m[0])) { - $parts[] = $m[0]; - $this->count += \strlen($m[0]); - } - } - $this->whitespace(); - // get any extra whitespace - $out = [Type::T_STRING, '', $parts]; - return \true; - } - /** - * Parse custom property name (as an array of parts or a string) - * - * @param array $out - * - * @return bool - */ - protected function customProperty(&$out) - { - $s = $this->count; - if (!$this->literal('--', 2, \false)) { - return \false; - } - $parts = ['--']; - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = \false; - for (;;) { - if ($this->interpolation($inter)) { - $parts[] = $inter; - continue; - } - if ($this->matchChar('&', \false)) { - $parts[] = [Type::T_SELF]; - continue; - } - if ($this->variable($var)) { - $parts[] = $var; - continue; - } - if ($this->keyword($text)) { - $parts[] = $text; - continue; - } - break; - } - $this->eatWhiteDefault = $oldWhite; - if (\count($parts) == 1) { - $this->seek($s); - return \false; - } - $this->whitespace(); - // get any extra whitespace - $out = [Type::T_STRING, '', $parts]; - return \true; - } - /** - * Parse comma separated selector list - * - * @param array $out - * @param string|bool $subSelector - * - * @return bool - */ - protected function selectors(&$out, $subSelector = \false) - { - $s = $this->count; - $selectors = []; - while ($this->selector($sel, $subSelector)) { - $selectors[] = $sel; - if (!$this->matchChar(',', \true)) { - break; - } - while ($this->matchChar(',', \true)) { - // ignore extra - } - } - if (!$selectors) { - $this->seek($s); - return \false; - } - $out = $selectors; - return \true; - } - /** - * Parse whitespace separated selector list - * - * @param array $out - * @param string|bool $subSelector - * - * @return bool - */ - protected function selector(&$out, $subSelector = \false) - { - $selector = []; - $discardComments = $this->discardComments; - $this->discardComments = \true; - for (;;) { - $s = $this->count; - if ($this->match('[>+~]+', $m, \true)) { - if ($subSelector && \is_string($subSelector) && \strpos($subSelector, 'nth-') === 0 && $m[0] === '+' && $this->match("(\\d+|n\\b)", $counter)) { - $this->seek($s); - } else { - $selector[] = [$m[0]]; - continue; - } - } - if ($this->selectorSingle($part, $subSelector)) { - $selector[] = $part; - $this->whitespace(); - continue; - } - break; - } - $this->discardComments = $discardComments; - if (!$selector) { - return \false; - } - $out = $selector; - return \true; - } - /** - * parsing escaped chars in selectors: - * - escaped single chars are kept escaped in the selector but in a normalized form - * (if not in 0-9a-f range as this would be ambigous) - * - other escaped sequences (multibyte chars or 0-9a-f) are kept in their initial escaped form, - * normalized to lowercase - * - * TODO: this is a fallback solution. Ideally escaped chars in selectors should be encoded as the genuine chars, - * and escaping added when printing in the Compiler, where/if it's mandatory - * - but this require a better formal selector representation instead of the array we have now - * - * @param string $out - * @param bool $keepEscapedNumber - * - * @return bool - */ - protected function matchEscapeCharacterInSelector(&$out, $keepEscapedNumber = \false) - { - $s_escape = $this->count; - if ($this->match('\\\\', $m)) { - $out = '\\' . $m[0]; - return \true; - } - if ($this->matchEscapeCharacter($escapedout, \true)) { - if (\strlen($escapedout) === 1) { - if (!\preg_match(",\\w,", $escapedout)) { - $out = '\\' . $escapedout; - return \true; - } elseif (!$keepEscapedNumber || !\is_numeric($escapedout)) { - $out = $escapedout; - return \true; - } - } - $escape_sequence = \rtrim(\substr($this->buffer, $s_escape, $this->count - $s_escape)); - if (\strlen($escape_sequence) < 6) { - $escape_sequence .= ' '; - } - $out = '\\' . \strtolower($escape_sequence); - return \true; - } - if ($this->match('\\S', $m)) { - $out = '\\' . $m[0]; - return \true; - } - return \false; - } - /** - * Parse the parts that make up a selector - * - * {@internal - * div[yes=no]#something.hello.world:nth-child(-2n+1)%placeholder - * }} - * - * @param array $out - * @param string|bool $subSelector - * - * @return bool - */ - protected function selectorSingle(&$out, $subSelector = \false) - { - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = \false; - $parts = []; - if ($this->matchChar('*', \false)) { - $parts[] = '*'; - } - for (;;) { - if (!isset($this->buffer[$this->count])) { - break; - } - $s = $this->count; - $char = $this->buffer[$this->count]; - // see if we can stop early - if ($char === '{' || $char === ',' || $char === ';' || $char === '}' || $char === '@') { - break; - } - // parsing a sub selector in () stop with the closing ) - if ($subSelector && $char === ')') { - break; - } - //self - switch ($char) { - case '&': - $parts[] = Compiler::$selfSelector; - $this->count++; - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - continue 2; - case '.': - $parts[] = '.'; - $this->count++; - continue 2; - case '|': - $parts[] = '|'; - $this->count++; - continue 2; - } - // handling of escaping in selectors : get the escaped char - if ($char === '\\') { - $this->count++; - if ($this->matchEscapeCharacterInSelector($escaped, \true)) { - $parts[] = $escaped; - continue; - } - $this->count--; - } - if ($char === '%') { - $this->count++; - if ($this->placeholder($placeholder)) { - $parts[] = '%'; - $parts[] = $placeholder; - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - continue; - } - break; - } - if ($char === '#') { - if ($this->interpolation($inter)) { - $parts[] = $inter; - !$this->cssOnly || $this->assertPlainCssValid(\false, $s); - continue; - } - $parts[] = '#'; - $this->count++; - continue; - } - // a pseudo selector - if ($char === ':') { - if ($this->buffer[$this->count + 1] === ':') { - $this->count += 2; - $part = '::'; - } else { - $this->count++; - $part = ':'; - } - if ($this->mixedKeyword($nameParts, \true)) { - $parts[] = $part; - foreach ($nameParts as $sub) { - $parts[] = $sub; - } - $ss = $this->count; - if ($nameParts === ['not'] || $nameParts === ['is'] || $nameParts === ['has'] || $nameParts === ['where'] || $nameParts === ['slotted'] || $nameParts === ['nth-child'] || $nameParts === ['nth-last-child'] || $nameParts === ['nth-of-type'] || $nameParts === ['nth-last-of-type']) { - if ($this->matchChar('(', \true) && ($this->selectors($subs, \reset($nameParts)) || \true) && $this->matchChar(')')) { - $parts[] = '('; - while ($sub = \array_shift($subs)) { - while ($ps = \array_shift($sub)) { - foreach ($ps as &$p) { - $parts[] = $p; - } - if (\count($sub) && \reset($sub)) { - $parts[] = ' '; - } - } - if (\count($subs) && \reset($subs)) { - $parts[] = ', '; - } - } - $parts[] = ')'; - } else { - $this->seek($ss); - } - } elseif ($this->matchChar('(', \true) && ($this->openString(')', $str, '(') || \true) && $this->matchChar(')')) { - $parts[] = '('; - if (!empty($str)) { - $parts[] = $str; - } - $parts[] = ')'; - } else { - $this->seek($ss); - } - continue; - } - } - $this->seek($s); - // 2n+1 - if ($subSelector && \is_string($subSelector) && \strpos($subSelector, 'nth-') === 0) { - if ($this->match("(\\s*(\\+\\s*|\\-\\s*)?(\\d+|n|\\d+n))+", $counter)) { - $parts[] = $counter[0]; - //$parts[] = str_replace(' ', '', $counter[0]); - continue; - } - } - $this->seek($s); - // attribute selector - if ($char === '[' && $this->matchChar('[') && ($this->openString(']', $str, '[') || \true) && $this->matchChar(']')) { - $parts[] = '['; - if (!empty($str)) { - $parts[] = $str; - } - $parts[] = ']'; - continue; - } - $this->seek($s); - // for keyframes - if ($this->unit($unit)) { - $parts[] = $unit; - continue; - } - if ($this->restrictedKeyword($name, \false, \true)) { - $parts[] = $name; - continue; - } - break; - } - $this->eatWhiteDefault = $oldWhite; - if (!$parts) { - return \false; - } - $out = $parts; - return \true; - } - /** - * Parse a variable - * - * @param array $out - * - * @return bool - */ - protected function variable(&$out) - { - $s = $this->count; - if ($this->matchChar('$', \false) && $this->keyword($name)) { - if ($this->allowVars) { - $out = [Type::T_VARIABLE, $name]; - } else { - $out = [Type::T_KEYWORD, '$' . $name]; - } - return \true; - } - $this->seek($s); - return \false; - } - /** - * Parse a keyword - * - * @param string $word - * @param bool $eatWhitespace - * @param bool $inSelector - * - * @return bool - */ - protected function keyword(&$word, $eatWhitespace = null, $inSelector = \false) - { - $s = $this->count; - $match = $this->match($this->utf8 ? '(([\\pL\\w\\x{00A0}-\\x{10FFFF}_\\-\\*!"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)([\\pL\\w\\x{00A0}-\\x{10FFFF}\\-_"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)*)' : '(([\\w_\\-\\*!"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)([\\w\\-_"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)*)', $m, \false); - if ($match) { - $word = $m[1]; - // handling of escaping in keyword : get the escaped char - if (\strpos($word, '\\') !== \false) { - $send = $this->count; - $escapedWord = []; - $this->seek($s); - $previousEscape = \false; - while ($this->count < $send) { - $char = $this->buffer[$this->count]; - $this->count++; - if ($this->count < $send && $char === '\\' && !$previousEscape && ($inSelector ? $this->matchEscapeCharacterInSelector($out) : $this->matchEscapeCharacter($out, \true))) { - $escapedWord[] = $out; - } else { - if ($previousEscape) { - $previousEscape = \false; - } elseif ($char === '\\') { - $previousEscape = \true; - } - $escapedWord[] = $char; - } - } - $word = \implode('', $escapedWord); - } - if (\is_null($eatWhitespace) ? $this->eatWhiteDefault : $eatWhitespace) { - $this->whitespace(); - } - return \true; - } - return \false; - } - /** - * Parse a keyword that should not start with a number - * - * @param string $word - * @param bool $eatWhitespace - * @param bool $inSelector - * - * @return bool - */ - protected function restrictedKeyword(&$word, $eatWhitespace = null, $inSelector = \false) - { - $s = $this->count; - if ($this->keyword($word, $eatWhitespace, $inSelector) && (\ord($word[0]) > 57 || \ord($word[0]) < 48)) { - return \true; - } - $this->seek($s); - return \false; - } - /** - * Parse a placeholder - * - * @param string|array $placeholder - * - * @return bool - */ - protected function placeholder(&$placeholder) - { - $match = $this->match($this->utf8 ? '([\\pL\\w\\-_]+)' : '([\\w\\-_]+)', $m); - if ($match) { - $placeholder = $m[1]; - return \true; - } - if ($this->interpolation($placeholder)) { - return \true; - } - return \false; - } - /** - * Parse a url - * - * @param array $out - * - * @return bool - */ - protected function url(&$out) - { - if ($this->literal('url(', 4)) { - $s = $this->count; - if (($this->string($out) || $this->spaceList($out)) && $this->matchChar(')')) { - $out = [Type::T_STRING, '', ['url(', $out, ')']]; - return \true; - } - $this->seek($s); - if ($this->openString(')', $out) && $this->matchChar(')')) { - $out = [Type::T_STRING, '', ['url(', $out, ')']]; - return \true; - } - } - return \false; - } - /** - * Consume an end of statement delimiter - * @param bool $eatWhitespace - * - * @return bool - */ - protected function end($eatWhitespace = null) - { - if ($this->matchChar(';', $eatWhitespace)) { - return \true; - } - if ($this->count === \strlen($this->buffer) || $this->buffer[$this->count] === '}') { - // if there is end of file or a closing block next then we don't need a ; - return \true; - } - return \false; - } - /** - * Strip assignment flag from the list - * - * @param array $value - * - * @return string[] - */ - protected function stripAssignmentFlags(&$value) - { - $flags = []; - for ($token =& $value; $token[0] === Type::T_LIST && ($s = \count($token[2])); $token =& $lastNode) { - $lastNode =& $token[2][$s - 1]; - while ($lastNode[0] === Type::T_KEYWORD && \in_array($lastNode[1], ['!default', '!global'])) { - \array_pop($token[2]); - $node = \end($token[2]); - $token = $this->flattenList($token); - $flags[] = $lastNode[1]; - $lastNode = $node; - } - } - return $flags; - } - /** - * Strip optional flag from selector list - * - * @param array $selectors - * - * @return bool - */ - protected function stripOptionalFlag(&$selectors) - { - $optional = \false; - $selector = \end($selectors); - $part = \end($selector); - if ($part === ['!optional']) { - \array_pop($selectors[\count($selectors) - 1]); - $optional = \true; - } - return $optional; - } - /** - * Turn list of length 1 into value type - * - * @param array $value - * - * @return array - */ - protected function flattenList($value) - { - if ($value[0] === Type::T_LIST && \count($value[2]) === 1) { - return $this->flattenList($value[2][0]); - } - return $value; - } - /** - * Quote regular expression - * - * @param string $what - * - * @return string - */ - private function pregQuote($what) - { - return \preg_quote($what, '/'); - } - /** - * Extract line numbers from buffer - * - * @param string $buffer - * - * @return void - */ - private function extractLineNumbers($buffer) - { - $this->sourcePositions = [0 => 0]; - $prev = 0; - while (($pos = \strpos($buffer, "\n", $prev)) !== \false) { - $this->sourcePositions[] = $pos; - $prev = $pos + 1; - } - $this->sourcePositions[] = \strlen($buffer); - if (\substr($buffer, -1) !== "\n") { - $this->sourcePositions[] = \strlen($buffer) + 1; - } - } - /** - * Get source line number and column (given character position in the buffer) - * - * @param int $pos - * - * @return array - * @phpstan-return array{int, int} - */ - private function getSourcePosition($pos) - { - $low = 0; - $high = \count($this->sourcePositions); - while ($low < $high) { - $mid = (int) (($high + $low) / 2); - if ($pos < $this->sourcePositions[$mid]) { - $high = $mid - 1; - continue; - } - if ($pos >= $this->sourcePositions[$mid + 1]) { - $low = $mid + 1; - continue; - } - return [$mid + 1, $pos - $this->sourcePositions[$mid]]; - } - return [$low + 1, $pos - $this->sourcePositions[$low]]; - } - /** - * Save internal encoding of mbstring - * - * When mbstring.func_overload is used to replace the standard PHP string functions, - * this method configures the internal encoding to a single-byte one so that the - * behavior matches the normal behavior of PHP string functions while using the parser. - * The existing internal encoding is saved and will be restored when calling {@see restoreEncoding}. - * - * If mbstring.func_overload is not used (or does not override string functions), this method is a no-op. - * - * @return void - */ - private function saveEncoding() - { - if (\PHP_VERSION_ID < 80000 && \extension_loaded('mbstring') && (2 & (int) \ini_get('mbstring.func_overload')) > 0) { - $this->encoding = \mb_internal_encoding(); - \mb_internal_encoding('iso-8859-1'); - } - } - /** - * Restore internal encoding - * - * @return void - */ - private function restoreEncoding() - { - if (\extension_loaded('mbstring') && $this->encoding) { - \mb_internal_encoding($this->encoding); - } - } -} diff --git a/dependencies/scssphp/scssphp/src/SourceMap/Base64.php b/dependencies/scssphp/scssphp/src/SourceMap/Base64.php deleted file mode 100644 index 3a45202..0000000 --- a/dependencies/scssphp/scssphp/src/SourceMap/Base64.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * @internal - */ -class Base64 -{ - /** - * @var array - */ - private static $encodingMap = [0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K', 11 => 'L', 12 => 'M', 13 => 'N', 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U', 21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', 28 => 'c', 29 => 'd', 30 => 'e', 31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o', 41 => 'p', 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', 49 => 'x', 50 => 'y', 51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8', 61 => '9', 62 => '+', 63 => '/']; - /** - * @var array - */ - private static $decodingMap = ['A' => 0, 'B' => 1, 'C' => 2, 'D' => 3, 'E' => 4, 'F' => 5, 'G' => 6, 'H' => 7, 'I' => 8, 'J' => 9, 'K' => 10, 'L' => 11, 'M' => 12, 'N' => 13, 'O' => 14, 'P' => 15, 'Q' => 16, 'R' => 17, 'S' => 18, 'T' => 19, 'U' => 20, 'V' => 21, 'W' => 22, 'X' => 23, 'Y' => 24, 'Z' => 25, 'a' => 26, 'b' => 27, 'c' => 28, 'd' => 29, 'e' => 30, 'f' => 31, 'g' => 32, 'h' => 33, 'i' => 34, 'j' => 35, 'k' => 36, 'l' => 37, 'm' => 38, 'n' => 39, 'o' => 40, 'p' => 41, 'q' => 42, 'r' => 43, 's' => 44, 't' => 45, 'u' => 46, 'v' => 47, 'w' => 48, 'x' => 49, 'y' => 50, 'z' => 51, 0 => 52, 1 => 53, 2 => 54, 3 => 55, 4 => 56, 5 => 57, 6 => 58, 7 => 59, 8 => 60, 9 => 61, '+' => 62, '/' => 63]; - /** - * Convert to base64 - * - * @param int $value - * - * @return string - */ - public static function encode($value) - { - return self::$encodingMap[$value]; - } - /** - * Convert from base64 - * - * @param string $value - * - * @return int - */ - public static function decode($value) - { - return self::$decodingMap[$value]; - } -} diff --git a/dependencies/scssphp/scssphp/src/SourceMap/Base64VLQ.php b/dependencies/scssphp/scssphp/src/SourceMap/Base64VLQ.php deleted file mode 100644 index 8c0b444..0000000 --- a/dependencies/scssphp/scssphp/src/SourceMap/Base64VLQ.php +++ /dev/null @@ -1,133 +0,0 @@ - - * @author Anthon Pang - * - * @internal - */ -class Base64VLQ -{ - // A Base64 VLQ digit can represent 5 bits, so it is base-32. - const VLQ_BASE_SHIFT = 5; - // A mask of bits for a VLQ digit (11111), 31 decimal. - const VLQ_BASE_MASK = 31; - // The continuation bit is the 6th bit. - const VLQ_CONTINUATION_BIT = 32; - /** - * Returns the VLQ encoded value. - * - * @param int $value - * - * @return string - */ - public static function encode($value) - { - $encoded = ''; - $vlq = self::toVLQSigned($value); - do { - $digit = $vlq & self::VLQ_BASE_MASK; - //$vlq >>>= self::VLQ_BASE_SHIFT; // unsigned right shift - $vlq = ($vlq >> 1 & \PHP_INT_MAX) >> self::VLQ_BASE_SHIFT - 1; - if ($vlq > 0) { - $digit |= self::VLQ_CONTINUATION_BIT; - } - $encoded .= Base64::encode($digit); - } while ($vlq > 0); - return $encoded; - } - /** - * Decodes VLQValue. - * - * @param string $str - * @param int $index - * - * @return int - */ - public static function decode($str, &$index) - { - $result = 0; - $shift = 0; - do { - $c = $str[$index++]; - $digit = Base64::decode($c); - $continuation = ($digit & self::VLQ_CONTINUATION_BIT) != 0; - $digit &= self::VLQ_BASE_MASK; - $result = $result + ($digit << $shift); - $shift = $shift + self::VLQ_BASE_SHIFT; - } while ($continuation); - return self::fromVLQSigned($result); - } - /** - * Converts from a two-complement value to a value where the sign bit is - * is placed in the least significant bit. For example, as decimals: - * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) - * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) - * - * @param int $value - * - * @return int - */ - private static function toVLQSigned($value) - { - if ($value < 0) { - return (-$value << 1) + 1; - } - return ($value << 1) + 0; - } - /** - * Converts to a two-complement value from a value where the sign bit is - * is placed in the least significant bit. For example, as decimals: - * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 - * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 - * - * @param int $value - * - * @return int - */ - private static function fromVLQSigned($value) - { - $negate = ($value & 1) === 1; - //$value >>>= 1; // unsigned right shift - $value = $value >> 1 & \PHP_INT_MAX; - if (!$negate) { - return $value; - } - // We need to OR 0x80000000 here to ensure the 32nd bit (the sign bit) is - // always set for negative numbers. If `value` were 1, (meaning `negate` is - // true and all other bits were zeros), `value` would now be 0. -0 is just - // 0, and doesn't flip the 32nd bit as intended. All positive numbers will - // successfully flip the 32nd bit without issue, so it's a noop for them. - return -$value | 0x80000000; - } -} diff --git a/dependencies/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php b/dependencies/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php deleted file mode 100644 index 87f9ef6..0000000 --- a/dependencies/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php +++ /dev/null @@ -1,315 +0,0 @@ - - * @author Nicolas FRANÇOIS - * - * @internal - */ -class SourceMapGenerator -{ - /** - * What version of source map does the generator generate? - */ - const VERSION = 3; - /** - * Array of default options - * - * @var array - * @phpstan-var array{sourceRoot: string, sourceMapFilename: string|null, sourceMapURL: string|null, sourceMapWriteTo: string|null, outputSourceFiles: bool, sourceMapRootpath: string, sourceMapBasepath: string} - */ - protected $defaultOptions = [ - // an optional source root, useful for relocating source files - // on a server or removing repeated values in the 'sources' entry. - // This value is prepended to the individual entries in the 'source' field. - 'sourceRoot' => '', - // an optional name of the generated code that this source map is associated with. - 'sourceMapFilename' => null, - // url of the map - 'sourceMapURL' => null, - // absolute path to a file to write the map to - 'sourceMapWriteTo' => null, - // output source contents? - 'outputSourceFiles' => \false, - // base path for filename normalization - 'sourceMapRootpath' => '', - // base path for filename normalization - 'sourceMapBasepath' => '', - ]; - /** - * The base64 VLQ encoder - * - * @var \ScssPhp\ScssPhp\SourceMap\Base64VLQ - */ - protected $encoder; - /** - * Array of mappings - * - * @var array - * @phpstan-var list - */ - protected $mappings = []; - /** - * Array of contents map - * - * @var array - */ - protected $contentsMap = []; - /** - * File to content map - * - * @var array - */ - protected $sources = []; - /** - * @var array - */ - protected $sourceKeys = []; - /** - * @var array - * @phpstan-var array{sourceRoot: string, sourceMapFilename: string|null, sourceMapURL: string|null, sourceMapWriteTo: string|null, outputSourceFiles: bool, sourceMapRootpath: string, sourceMapBasepath: string} - */ - private $options; - /** - * @phpstan-param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $options - */ - public function __construct(array $options = []) - { - $this->options = \array_replace($this->defaultOptions, $options); - $this->encoder = new Base64VLQ(); - } - /** - * Adds a mapping - * - * @param int $generatedLine The line number in generated file - * @param int $generatedColumn The column number in generated file - * @param int $originalLine The line number in original file - * @param int $originalColumn The column number in original file - * @param string $sourceFile The original source file - * - * @return void - */ - public function addMapping($generatedLine, $generatedColumn, $originalLine, $originalColumn, $sourceFile) - { - $this->mappings[] = ['generated_line' => $generatedLine, 'generated_column' => $generatedColumn, 'original_line' => $originalLine, 'original_column' => $originalColumn, 'source_file' => $sourceFile]; - $this->sources[$sourceFile] = $sourceFile; - } - /** - * Saves the source map to a file - * - * @param string $content The content to write - * - * @return string|null - * - * @throws \ScssPhp\ScssPhp\Exception\CompilerException If the file could not be saved - * @deprecated - */ - public function saveMap($content) - { - $file = $this->options['sourceMapWriteTo']; - \assert($file !== null); - $dir = \dirname($file); - // directory does not exist - if (!\is_dir($dir)) { - // FIXME: create the dir automatically? - throw new CompilerException(\sprintf('The directory "%s" does not exist. Cannot save the source map.', $dir)); - } - // FIXME: proper saving, with dir write check! - if (\file_put_contents($file, $content) === \false) { - throw new CompilerException(\sprintf('Cannot save the source map to "%s"', $file)); - } - return $this->options['sourceMapURL']; - } - /** - * Generates the JSON source map - * - * @param string $prefix A prefix added in the output file, which needs to shift mappings - * - * @return string - * - * @see https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit# - */ - public function generateJson($prefix = '') - { - $sourceMap = []; - $mappings = $this->generateMappings($prefix); - // File version (always the first entry in the object) and must be a positive integer. - $sourceMap['version'] = self::VERSION; - // An optional name of the generated code that this source map is associated with. - $file = $this->options['sourceMapFilename']; - if ($file) { - $sourceMap['file'] = $file; - } - // An optional source root, useful for relocating source files on a server or removing repeated values in the - // 'sources' entry. This value is prepended to the individual entries in the 'source' field. - $root = $this->options['sourceRoot']; - if ($root) { - $sourceMap['sourceRoot'] = $root; - } - // A list of original sources used by the 'mappings' entry. - $sourceMap['sources'] = []; - foreach ($this->sources as $sourceFilename) { - $sourceMap['sources'][] = $this->normalizeFilename($sourceFilename); - } - // A list of symbol names used by the 'mappings' entry. - $sourceMap['names'] = []; - // A string with the encoded mapping data. - $sourceMap['mappings'] = $mappings; - if ($this->options['outputSourceFiles']) { - // An optional list of source content, useful when the 'source' can't be hosted. - // The contents are listed in the same order as the sources above. - // 'null' may be used if some original sources should be retrieved by name. - $sourceMap['sourcesContent'] = $this->getSourcesContent(); - } - // less.js compat fixes - if (\count($sourceMap['sources']) && empty($sourceMap['sourceRoot'])) { - unset($sourceMap['sourceRoot']); - } - $jsonSourceMap = \json_encode($sourceMap, \JSON_UNESCAPED_SLASHES); - if (\json_last_error() !== \JSON_ERROR_NONE) { - throw new \RuntimeException(\json_last_error_msg()); - } - \assert($jsonSourceMap !== \false); - return $jsonSourceMap; - } - /** - * Returns the sources contents - * - * @return string[]|null - */ - protected function getSourcesContent() - { - if (empty($this->sources)) { - return null; - } - $content = []; - foreach ($this->sources as $sourceFile) { - $content[] = \file_get_contents($sourceFile); - } - return $content; - } - /** - * Generates the mappings string - * - * @param string $prefix A prefix added in the output file, which needs to shift mappings - * - * @return string - */ - public function generateMappings($prefix = '') - { - if (!\count($this->mappings)) { - return ''; - } - $prefixLines = \substr_count($prefix, "\n"); - $lastPrefixNewLine = \strrpos($prefix, "\n"); - $lastPrefixLineStart = \false === $lastPrefixNewLine ? 0 : $lastPrefixNewLine + 1; - $prefixColumn = \strlen($prefix) - $lastPrefixLineStart; - $this->sourceKeys = \array_flip(\array_keys($this->sources)); - // group mappings by generated line number. - $groupedMap = $groupedMapEncoded = []; - foreach ($this->mappings as $m) { - $groupedMap[$m['generated_line']][] = $m; - } - \ksort($groupedMap); - $lastGeneratedLine = $lastOriginalIndex = $lastOriginalLine = $lastOriginalColumn = 0; - foreach ($groupedMap as $lineNumber => $lineMap) { - if ($lineNumber > 1) { - // The prefix only impacts the column for the first line of the original output - $prefixColumn = 0; - } - $lineNumber += $prefixLines; - while (++$lastGeneratedLine < $lineNumber) { - $groupedMapEncoded[] = ';'; - } - $lineMapEncoded = []; - $lastGeneratedColumn = 0; - foreach ($lineMap as $m) { - $generatedColumn = $m['generated_column'] + $prefixColumn; - $mapEncoded = $this->encoder->encode($generatedColumn - $lastGeneratedColumn); - $lastGeneratedColumn = $generatedColumn; - // find the index - if ($m['source_file']) { - $index = $this->findFileIndex($m['source_file']); - if ($index !== \false) { - $mapEncoded .= $this->encoder->encode($index - $lastOriginalIndex); - $lastOriginalIndex = $index; - // lines are stored 0-based in SourceMap spec version 3 - $mapEncoded .= $this->encoder->encode($m['original_line'] - 1 - $lastOriginalLine); - $lastOriginalLine = $m['original_line'] - 1; - $mapEncoded .= $this->encoder->encode($m['original_column'] - $lastOriginalColumn); - $lastOriginalColumn = $m['original_column']; - } - } - $lineMapEncoded[] = $mapEncoded; - } - $groupedMapEncoded[] = \implode(',', $lineMapEncoded) . ';'; - } - return \rtrim(\implode($groupedMapEncoded), ';'); - } - /** - * Finds the index for the filename - * - * @param string $filename - * - * @return int|false - */ - protected function findFileIndex($filename) - { - return $this->sourceKeys[$filename]; - } - /** - * Normalize filename - * - * @param string $filename - * - * @return string - */ - protected function normalizeFilename($filename) - { - $filename = $this->fixWindowsPath($filename); - $rootpath = $this->options['sourceMapRootpath']; - $basePath = $this->options['sourceMapBasepath']; - // "Trim" the 'sourceMapBasepath' from the output filename. - if (\strlen($basePath) && \strpos($filename, $basePath) === 0) { - $filename = \substr($filename, \strlen($basePath)); - } - // Remove extra leading path separators. - if (\strpos($filename, '\\') === 0 || \strpos($filename, '/') === 0) { - $filename = \substr($filename, 1); - } - return $rootpath . $filename; - } - /** - * Fix windows paths - * - * @param string $path - * @param bool $addEndSlash - * - * @return string - */ - public function fixWindowsPath($path, $addEndSlash = \false) - { - $slash = $addEndSlash ? '/' : ''; - if (!empty($path)) { - $path = \str_replace('\\', '/', $path); - $path = \rtrim($path, '/') . $slash; - } - return $path; - } -} diff --git a/dependencies/scssphp/scssphp/src/Type.php b/dependencies/scssphp/scssphp/src/Type.php deleted file mode 100644 index c73a199..0000000 --- a/dependencies/scssphp/scssphp/src/Type.php +++ /dev/null @@ -1,207 +0,0 @@ - - */ -class Type -{ - /** - * @internal - */ - const T_ASSIGN = 'assign'; - /** - * @internal - */ - const T_AT_ROOT = 'at-root'; - /** - * @internal - */ - const T_BLOCK = 'block'; - /** - * @deprecated - * @internal - */ - const T_BREAK = 'break'; - /** - * @internal - */ - const T_CHARSET = 'charset'; - const T_COLOR = 'color'; - /** - * @internal - */ - const T_COMMENT = 'comment'; - /** - * @deprecated - * @internal - */ - const T_CONTINUE = 'continue'; - /** - * @deprecated - * @internal - */ - const T_CONTROL = 'control'; - /** - * @internal - */ - const T_CUSTOM_PROPERTY = 'custom'; - /** - * @internal - */ - const T_DEBUG = 'debug'; - /** - * @internal - */ - const T_DIRECTIVE = 'directive'; - /** - * @internal - */ - const T_EACH = 'each'; - /** - * @internal - */ - const T_ELSE = 'else'; - /** - * @internal - */ - const T_ELSEIF = 'elseif'; - /** - * @internal - */ - const T_ERROR = 'error'; - /** - * @internal - */ - const T_EXPRESSION = 'exp'; - /** - * @internal - */ - const T_EXTEND = 'extend'; - /** - * @internal - */ - const T_FOR = 'for'; - const T_FUNCTION = 'function'; - /** - * @internal - */ - const T_FUNCTION_REFERENCE = 'function-reference'; - /** - * @internal - */ - const T_FUNCTION_CALL = 'fncall'; - /** - * @internal - */ - const T_HSL = 'hsl'; - /** - * @internal - */ - const T_HWB = 'hwb'; - /** - * @internal - */ - const T_IF = 'if'; - /** - * @internal - */ - const T_IMPORT = 'import'; - /** - * @internal - */ - const T_INCLUDE = 'include'; - /** - * @internal - */ - const T_INTERPOLATE = 'interpolate'; - /** - * @internal - */ - const T_INTERPOLATED = 'interpolated'; - /** - * @internal - */ - const T_KEYWORD = 'keyword'; - const T_LIST = 'list'; - const T_MAP = 'map'; - /** - * @internal - */ - const T_MEDIA = 'media'; - /** - * @internal - */ - const T_MEDIA_EXPRESSION = 'mediaExp'; - /** - * @internal - */ - const T_MEDIA_TYPE = 'mediaType'; - /** - * @internal - */ - const T_MEDIA_VALUE = 'mediaValue'; - /** - * @internal - */ - const T_MIXIN = 'mixin'; - /** - * @internal - */ - const T_MIXIN_CONTENT = 'mixin_content'; - /** - * @internal - */ - const T_NESTED_PROPERTY = 'nestedprop'; - /** - * @internal - */ - const T_NOT = 'not'; - const T_NULL = 'null'; - const T_NUMBER = 'number'; - /** - * @internal - */ - const T_RETURN = 'return'; - /** - * @internal - */ - const T_ROOT = 'root'; - /** - * @internal - */ - const T_SCSSPHP_IMPORT_ONCE = 'scssphp-import-once'; - /** - * @internal - */ - const T_SELF = 'self'; - const T_STRING = 'string'; - /** - * @internal - */ - const T_UNARY = 'unary'; - /** - * @internal - */ - const T_VARIABLE = 'var'; - /** - * @internal - */ - const T_WARN = 'warn'; - /** - * @internal - */ - const T_WHILE = 'while'; -} diff --git a/dependencies/scssphp/scssphp/src/Util.php b/dependencies/scssphp/scssphp/src/Util.php deleted file mode 100644 index bb08645..0000000 --- a/dependencies/scssphp/scssphp/src/Util.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * @internal - */ -class Util -{ - /** - * Asserts that `value` falls within `range` (inclusive), leaving - * room for slight floating-point errors. - * - * @param string $name The name of the value. Used in the error message. - * @param Range $range Range of values. - * @param array|Number $value The value to check. - * @param string $unit The unit of the value. Used in error reporting. - * - * @return mixed `value` adjusted to fall within range, if it was outside by a floating-point margin. - * - * @throws \ScssPhp\ScssPhp\Exception\RangeException - */ - public static function checkRange($name, Range $range, $value, $unit = '') - { - $val = $value[1]; - $grace = new Range(-1.0E-5, 1.0E-5); - if (!\is_numeric($val)) { - throw new RangeException("{$name} {$val} is not a number."); - } - if ($range->includes($val)) { - return $val; - } - if ($grace->includes($val - $range->first)) { - return $range->first; - } - if ($grace->includes($val - $range->last)) { - return $range->last; - } - throw new RangeException("{$name} {$val} must be between {$range->first} and {$range->last}{$unit}"); - } - /** - * Encode URI component - * - * @param string $string - * - * @return string - */ - public static function encodeURIComponent($string) - { - $revert = ['%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')']; - return \strtr(\rawurlencode($string), $revert); - } - /** - * mb_chr() wrapper - * - * @param int $code - * - * @return string - */ - public static function mbChr($code) - { - // Use the native implementation if available, but not on PHP 7.2 as mb_chr(0) is buggy there - if (\PHP_VERSION_ID > 70300 && \function_exists('mb_chr')) { - return \mb_chr($code, 'UTF-8'); - } - if (0x80 > ($code %= 0x200000)) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); - } elseif (0x10000 > $code) { - $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); - } else { - $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); - } - return $s; - } - /** - * mb_strlen() wrapper - * - * @param string $string - * @return int - */ - public static function mbStrlen($string) - { - // Use the native implementation if available. - if (\function_exists('mb_strlen')) { - return \mb_strlen($string, 'UTF-8'); - } - if (\function_exists('iconv_strlen')) { - return (int) @\iconv_strlen($string, 'UTF-8'); - } - throw new \LogicException('Either mbstring (recommended) or iconv is necessary to use Scssphp.'); - } - /** - * mb_substr() wrapper - * @param string $string - * @param int $start - * @param null|int $length - * @return string - */ - public static function mbSubstr($string, $start, $length = null) - { - // Use the native implementation if available. - if (\function_exists('mb_substr')) { - return \mb_substr($string, $start, $length, 'UTF-8'); - } - if (\function_exists('iconv_substr')) { - if ($start < 0) { - $start = static::mbStrlen($string) + $start; - if ($start < 0) { - $start = 0; - } - } - if (null === $length) { - $length = 2147483647; - } elseif ($length < 0) { - $length = static::mbStrlen($string) + $length - $start; - if ($length < 0) { - return ''; - } - } - return (string) \iconv_substr($string, $start, $length, 'UTF-8'); - } - throw new \LogicException('Either mbstring (recommended) or iconv is necessary to use Scssphp.'); - } - /** - * mb_strpos wrapper - * @param string $haystack - * @param string $needle - * @param int $offset - * - * @return int|false - */ - public static function mbStrpos($haystack, $needle, $offset = 0) - { - if (\function_exists('mb_strpos')) { - return \mb_strpos($haystack, $needle, $offset, 'UTF-8'); - } - if (\function_exists('iconv_strpos')) { - return \iconv_strpos($haystack, $needle, $offset, 'UTF-8'); - } - throw new \LogicException('Either mbstring (recommended) or iconv is necessary to use Scssphp.'); - } -} diff --git a/dependencies/scssphp/scssphp/src/Util/Path.php b/dependencies/scssphp/scssphp/src/Util/Path.php deleted file mode 100644 index d2ac852..0000000 --- a/dependencies/scssphp/scssphp/src/Util/Path.php +++ /dev/null @@ -1,64 +0,0 @@ -parseValue($source, $value)) { - throw new \InvalidArgumentException(\sprintf('Invalid value source "%s".', $source)); - } - return $value; - } - /** - * Converts a PHP value to a Sass value - * - * The returned value is guaranteed to be supported by the - * Compiler methods for registering custom variables. No other - * guarantee about it is provided. It should be considered - * opaque values by the caller. - * - * @param mixed $value - * - * @return mixed - */ - public static function fromPhp($value) - { - if ($value instanceof Number) { - return $value; - } - if (\is_array($value) && isset($value[0]) && \in_array($value[0], [Type::T_NULL, Type::T_COLOR, Type::T_KEYWORD, Type::T_LIST, Type::T_MAP, Type::T_STRING])) { - return $value; - } - if ($value === null) { - return Compiler::$null; - } - if ($value === \true) { - return Compiler::$true; - } - if ($value === \false) { - return Compiler::$false; - } - if ($value === '') { - return Compiler::$emptyString; - } - if (\is_int($value) || \is_float($value)) { - return new Number($value, ''); - } - if (\is_string($value)) { - return [Type::T_STRING, '"', [$value]]; - } - throw new \InvalidArgumentException(\sprintf('Cannot convert the value of type "%s" to a Sass value.', \gettype($value))); - } -} diff --git a/dependencies/scssphp/scssphp/src/Version.php b/dependencies/scssphp/scssphp/src/Version.php deleted file mode 100644 index 046eea6..0000000 --- a/dependencies/scssphp/scssphp/src/Version.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ -class Version -{ - const VERSION = '1.11.1'; -} diff --git a/dependencies/scssphp/scssphp/src/Warn.php b/dependencies/scssphp/scssphp/src/Warn.php deleted file mode 100644 index d713504..0000000 --- a/dependencies/scssphp/scssphp/src/Warn.php +++ /dev/null @@ -1,77 +0,0 @@ -currentTemplateId !== null) { - throw new \BadMethodCallException('The page format cannot be changed when writing to a template.'); - } - if (!\in_array($orientation, ['P', 'L'], \true)) { - throw new \InvalidArgumentException(\sprintf('Invalid page orientation "%s"! Only "P" and "L" are allowed!', $orientation)); - } - $size = $this->_getpagesize($size); - if ($orientation != $this->CurOrientation || $size[0] != $this->CurPageSize[0] || $size[1] != $this->CurPageSize[1]) { - // New size or orientation - if ($orientation === 'P') { - $this->w = $size[0]; - $this->h = $size[1]; - } else { - $this->w = $size[1]; - $this->h = $size[0]; - } - $this->wPt = $this->w * $this->k; - $this->hPt = $this->h * $this->k; - $this->PageBreakTrigger = $this->h - $this->bMargin; - $this->CurOrientation = $orientation; - $this->CurPageSize = $size; - $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt); - } - } - /** - * Draws a template onto the page or another template. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param array|float|int $x The abscissa of upper-left corner. Alternatively you could use an assoc array - * with the keys "x", "y", "width", "height", "adjustPageSize". - * @param float|int $y The ordinate of upper-left corner. - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @param bool $adjustPageSize - * @return array The size - * @see FpdfTplTrait::getTemplateSize() - */ - public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = \false) - { - if (!isset($this->templates[$tpl])) { - throw new \InvalidArgumentException('Template does not exist!'); - } - if (\is_array($x)) { - unset($x['tpl']); - \extract($x, \EXTR_IF_EXISTS); - /** @noinspection NotOptimalIfConditionsInspection */ - /** @noinspection PhpConditionAlreadyCheckedInspection */ - if (\is_array($x)) { - $x = 0; - } - } - $template = $this->templates[$tpl]; - $originalSize = $this->getTemplateSize($tpl); - $newSize = $this->getTemplateSize($tpl, $width, $height); - if ($adjustPageSize) { - $this->setPageFormat($newSize, $newSize['orientation']); - } - $this->_out( - // reset standard values, translate and scale - \sprintf('q 0 J 1 w 0 j 0 G 0 g %.4F 0 0 %.4F %.4F %.4F cm /%s Do Q', $newSize['width'] / $originalSize['width'], $newSize['height'] / $originalSize['height'], $x * $this->k, ($this->h - $y - $newSize['height']) * $this->k, $template['id']) - ); - return $newSize; - } - /** - * Get the size of a template. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) - */ - public function getTemplateSize($tpl, $width = null, $height = null) - { - if (!isset($this->templates[$tpl])) { - return \false; - } - if ($width === null && $height === null) { - $width = $this->templates[$tpl]['width']; - $height = $this->templates[$tpl]['height']; - } elseif ($width === null) { - $width = $height * $this->templates[$tpl]['width'] / $this->templates[$tpl]['height']; - } - if ($height === null) { - $height = $width * $this->templates[$tpl]['height'] / $this->templates[$tpl]['width']; - } - if ($height <= 0.0 || $width <= 0.0) { - throw new \InvalidArgumentException('Width or height parameter needs to be larger than zero.'); - } - return ['width' => $width, 'height' => $height, 0 => $width, 1 => $height, 'orientation' => $width > $height ? 'L' : 'P']; - } - /** - * Begins a new template. - * - * @param float|int|null $width The width of the template. If null, the current page width is used. - * @param float|int|null $height The height of the template. If null, the current page height is used. - * @param bool $groupXObject Define the form XObject as a group XObject to support transparency (if used). - * @return int A template identifier. - */ - public function beginTemplate($width = null, $height = null, $groupXObject = \false) - { - if ($width === null) { - $width = $this->w; - } - if ($height === null) { - $height = $this->h; - } - $templateId = $this->getNextTemplateId(); - // initiate buffer with current state of FPDF - $buffer = "2 J\n" . \sprintf('%.2F w', $this->LineWidth * $this->k) . "\n"; - if ($this->FontFamily) { - $buffer .= \sprintf("BT /F%d %.2F Tf ET\n", $this->CurrentFont['i'], $this->FontSizePt); - } - if ($this->DrawColor !== '0 G') { - $buffer .= $this->DrawColor . "\n"; - } - if ($this->FillColor !== '0 g') { - $buffer .= $this->FillColor . "\n"; - } - if ($groupXObject && \version_compare('1.4', $this->PDFVersion, '>')) { - $this->PDFVersion = '1.4'; - } - $this->templates[$templateId] = ['objectNumber' => null, 'id' => 'TPL' . $templateId, 'buffer' => $buffer, 'width' => $width, 'height' => $height, 'groupXObject' => $groupXObject, 'state' => ['x' => $this->x, 'y' => $this->y, 'AutoPageBreak' => $this->AutoPageBreak, 'bMargin' => $this->bMargin, 'tMargin' => $this->tMargin, 'lMargin' => $this->lMargin, 'rMargin' => $this->rMargin, 'h' => $this->h, 'hPt' => $this->hPt, 'w' => $this->w, 'wPt' => $this->wPt, 'FontFamily' => $this->FontFamily, 'FontStyle' => $this->FontStyle, 'FontSizePt' => $this->FontSizePt, 'FontSize' => $this->FontSize, 'underline' => $this->underline, 'TextColor' => $this->TextColor, 'DrawColor' => $this->DrawColor, 'FillColor' => $this->FillColor, 'ColorFlag' => $this->ColorFlag]]; - $this->SetAutoPageBreak(\false); - $this->currentTemplateId = $templateId; - $this->h = $height; - $this->hPt = $height / $this->k; - $this->w = $width; - $this->wPt = $width / $this->k; - $this->SetXY($this->lMargin, $this->tMargin); - $this->SetRightMargin($this->w - $width + $this->rMargin); - return $templateId; - } - /** - * Ends a template. - * - * @return bool|int|null A template identifier. - */ - public function endTemplate() - { - if ($this->currentTemplateId === null) { - return \false; - } - $templateId = $this->currentTemplateId; - $template = $this->templates[$templateId]; - $state = $template['state']; - $this->SetXY($state['x'], $state['y']); - $this->tMargin = $state['tMargin']; - $this->lMargin = $state['lMargin']; - $this->rMargin = $state['rMargin']; - $this->h = $state['h']; - $this->hPt = $state['hPt']; - $this->w = $state['w']; - $this->wPt = $state['wPt']; - $this->SetAutoPageBreak($state['AutoPageBreak'], $state['bMargin']); - $this->FontFamily = $state['FontFamily']; - $this->FontStyle = $state['FontStyle']; - $this->FontSizePt = $state['FontSizePt']; - $this->FontSize = $state['FontSize']; - $this->TextColor = $state['TextColor']; - $this->DrawColor = $state['DrawColor']; - $this->FillColor = $state['FillColor']; - $this->ColorFlag = $state['ColorFlag']; - $this->underline = $state['underline']; - $fontKey = $this->FontFamily . $this->FontStyle; - if ($fontKey) { - $this->CurrentFont =& $this->fonts[$fontKey]; - } else { - unset($this->CurrentFont); - } - $this->currentTemplateId = null; - return $templateId; - } - /** - * Get the next template id. - * - * @return int - */ - protected function getNextTemplateId() - { - return $this->templateId++; - } - /* overwritten FPDF methods: */ - /** - * @inheritdoc - */ - public function AddPage($orientation = '', $size = '', $rotation = 0) - { - if ($this->currentTemplateId !== null) { - throw new \BadMethodCallException('Pages cannot be added when writing to a template.'); - } - parent::AddPage($orientation, $size, $rotation); - } - /** - * @inheritdoc - */ - public function Link($x, $y, $w, $h, $link) - { - if ($this->currentTemplateId !== null) { - throw new \BadMethodCallException('Links cannot be set when writing to a template.'); - } - parent::Link($x, $y, $w, $h, $link); - } - /** - * @inheritdoc - */ - public function SetLink($link, $y = 0, $page = -1) - { - if ($this->currentTemplateId !== null) { - throw new \BadMethodCallException('Links cannot be set when writing to a template.'); - } - return parent::SetLink($link, $y, $page); - } - /** - * @inheritdoc - */ - public function SetDrawColor($r, $g = null, $b = null) - { - parent::SetDrawColor($r, $g, $b); - if ($this->page === 0 && $this->currentTemplateId !== null) { - $this->_out($this->DrawColor); - } - } - /** - * @inheritdoc - */ - public function SetFillColor($r, $g = null, $b = null) - { - parent::SetFillColor($r, $g, $b); - if ($this->page === 0 && $this->currentTemplateId !== null) { - $this->_out($this->FillColor); - } - } - /** - * @inheritdoc - */ - public function SetLineWidth($width) - { - parent::SetLineWidth($width); - if ($this->page === 0 && $this->currentTemplateId !== null) { - $this->_out(\sprintf('%.2F w', $width * $this->k)); - } - } - /** - * @inheritdoc - */ - public function SetFont($family, $style = '', $size = 0) - { - parent::SetFont($family, $style, $size); - if ($this->page === 0 && $this->currentTemplateId !== null) { - $this->_out(\sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); - } - } - /** - * @inheritdoc - */ - public function SetFontSize($size) - { - parent::SetFontSize($size); - if ($this->page === 0 && $this->currentTemplateId !== null) { - $this->_out(\sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); - } - } - protected function _putimages() - { - parent::_putimages(); - foreach ($this->templates as $key => $template) { - $this->_newobj(); - $this->templates[$key]['objectNumber'] = $this->n; - $this->_put('<_put(\sprintf('/BBox[0 0 %.2F %.2F]', $template['width'] * $this->k, $template['height'] * $this->k)); - $this->_put('/Resources 2 0 R'); - // default resources dictionary of FPDF - if ($this->compress) { - $buffer = \gzcompress($template['buffer']); - $this->_put('/Filter/FlateDecode'); - } else { - $buffer = $template['buffer']; - } - $this->_put('/Length ' . \strlen($buffer)); - if ($template['groupXObject']) { - $this->_put('/Group <>'); - } - $this->_put('>>'); - $this->_putstream($buffer); - $this->_put('endobj'); - } - } - /** - * @inheritdoc - */ - protected function _putxobjectdict() - { - foreach ($this->templates as $key => $template) { - $this->_put('/' . $template['id'] . ' ' . $template['objectNumber'] . ' 0 R'); - } - parent::_putxobjectdict(); - } - /** - * @inheritdoc - */ - public function _out($s) - { - if ($this->currentTemplateId !== null) { - $this->templates[$this->currentTemplateId]['buffer'] .= $s . "\n"; - } else { - parent::_out($s); - } - } -} diff --git a/dependencies/setasign/fpdi/src/FpdfTrait.php b/dependencies/setasign/fpdi/src/FpdfTrait.php deleted file mode 100644 index 7142fb1..0000000 --- a/dependencies/setasign/fpdi/src/FpdfTrait.php +++ /dev/null @@ -1,168 +0,0 @@ -cleanUp(); - } - /** - * Draws an imported page or a template onto the page or another template. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array - * with the keys "x", "y", "width", "height", "adjustPageSize". - * @param float|int $y The ordinate of upper-left corner. - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @param bool $adjustPageSize - * @return array The size - * @see Fpdi::getTemplateSize() - */ - public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = \false) - { - if (isset($this->importedPages[$tpl])) { - $size = $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize); - if ($this->currentTemplateId !== null) { - $this->templates[$this->currentTemplateId]['resources']['templates']['importedPages'][$tpl] = $tpl; - } - return $size; - } - return parent::useTemplate($tpl, $x, $y, $width, $height, $adjustPageSize); - } - /** - * Get the size of an imported page or template. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) - */ - public function getTemplateSize($tpl, $width = null, $height = null) - { - $size = parent::getTemplateSize($tpl, $width, $height); - if ($size === \false) { - return $this->getImportedPageSize($tpl, $width, $height); - } - return $size; - } - /** - * @throws CrossReferenceException - * @throws PdfParserException - */ - protected function _putimages() - { - $this->currentReaderId = null; - parent::_putimages(); - foreach ($this->importedPages as $key => $pageData) { - $this->_newobj(); - $this->importedPages[$key]['objectNumber'] = $this->n; - $this->currentReaderId = $pageData['readerId']; - $this->writePdfType($pageData['stream']); - $this->_put('endobj'); - } - foreach (\array_keys($this->readers) as $readerId) { - $parser = $this->getPdfReader($readerId)->getParser(); - $this->currentReaderId = $readerId; - while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) { - try { - $object = $parser->getIndirectObject($objectNumber); - } catch (CrossReferenceException $e) { - if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) { - $object = PdfIndirectObject::create($objectNumber, 0, new PdfNull()); - } else { - throw $e; - } - } - $this->writePdfType($object); - } - } - $this->currentReaderId = null; - } - /** - * @inheritdoc - */ - protected function _putxobjectdict() - { - foreach ($this->importedPages as $pageData) { - $this->_put('/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R'); - } - parent::_putxobjectdict(); - } - /** - * @param int $n - * @return void - * @throws PdfParser\Type\PdfTypeException - */ - protected function _putlinks($n) - { - foreach ($this->PageLinks[$n] as $pl) { - $this->_newobj(); - $rect = \sprintf('%.2F %.2F %.2F %.2F', $pl[0], $pl[1], $pl[0] + $pl[2], $pl[1] - $pl[3]); - $this->_put('<_put('/A <_textstring($pl[4]) . '>>'); - if (isset($pl['importedLink'])) { - $values = $pl['importedLink']['pdfObject']->value; - unset($values['P'], $values['NM'], $values['AP'], $values['AS'], $values['Type'], $values['Subtype'], $values['Rect'], $values['A'], $values['QuadPoints'], $values['Rotate'], $values['M'], $values['StructParent']); - foreach ($values as $name => $entry) { - $this->_put('/' . $name . ' ', \false); - $this->writePdfType($entry); - } - if (isset($pl['quadPoints'])) { - $s = '/QuadPoints['; - foreach ($pl['quadPoints'] as $value) { - $s .= \sprintf('%.2F ', $value); - } - $s .= ']'; - $this->_put($s); - } - } else { - $this->_put('/Border [0 0 0]', \false); - } - $this->_put('>>'); - } else { - $this->_put('/Border [0 0 0] ', \false); - $l = $this->links[$pl[4]]; - if (isset($this->PageInfo[$l[0]]['size'])) { - $h = $this->PageInfo[$l[0]]['size'][1]; - } else { - $h = $this->DefOrientation === 'P' ? $this->DefPageSize[1] * $this->k : $this->DefPageSize[0] * $this->k; - } - $this->_put(\sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>', $this->PageInfo[$l[0]]['n'], $h - $l[1] * $this->k)); - } - $this->_put('endobj'); - } - } - protected function _put($s, $newLine = \true) - { - if ($newLine) { - $this->buffer .= $s . "\n"; - } else { - $this->buffer .= $s; - } - } -} diff --git a/dependencies/setasign/fpdi/src/Fpdi.php b/dependencies/setasign/fpdi/src/Fpdi.php deleted file mode 100644 index 723ed69..0000000 --- a/dependencies/setasign/fpdi/src/Fpdi.php +++ /dev/null @@ -1,31 +0,0 @@ -readers) : $this->createdReaders; - foreach ($readers as $id) { - $this->readers[$id]->getParser()->getStreamReader()->cleanUp(); - unset($this->readers[$id]); - } - $this->createdReaders = []; - } - /** - * Set the minimal PDF version. - * - * @param string $pdfVersion - */ - protected function setMinPdfVersion($pdfVersion) - { - if (\version_compare($pdfVersion, $this->PDFVersion, '>')) { - $this->PDFVersion = $pdfVersion; - } - } - /** @noinspection PhpUndefinedClassInspection */ - /** - * Get a new pdf parser instance. - * - * @param StreamReader $streamReader - * @param array $parserParams Individual parameters passed to the parser instance. - * @return PdfParser|FpdiPdfParser - */ - protected function getPdfParserInstance(StreamReader $streamReader, array $parserParams = []) - { - // note: if you get an exception here - turn off errors/warnings on not found for your autoloader. - // psr-4 (https://www.php-fig.org/psr/psr-4/) says: Autoloader implementations MUST NOT throw - // exceptions, MUST NOT raise errors of any level, and SHOULD NOT return a value. - /** @noinspection PhpUndefinedClassInspection */ - if (\class_exists(FpdiPdfParser::class)) { - /** @noinspection PhpUndefinedClassInspection */ - return new FpdiPdfParser($streamReader, $parserParams); - } - return new PdfParser($streamReader); - } - /** - * Get an unique reader id by the $file parameter. - * - * @param string|resource|PdfReader|StreamReader $file An open file descriptor, a path to a file, a PdfReader - * instance or a StreamReader instance. - * @param array $parserParams Individual parameters passed to the parser instance. - * @return string - */ - protected function getPdfReaderId($file, array $parserParams = []) - { - if (\is_resource($file)) { - $id = (string) $file; - } elseif (\is_string($file)) { - $id = \realpath($file); - if ($id === \false) { - $id = $file; - } - } elseif (\is_object($file)) { - $id = \spl_object_hash($file); - } else { - throw new \InvalidArgumentException(\sprintf('Invalid type in $file parameter (%s)', \gettype($file))); - } - /** @noinspection OffsetOperationsInspection */ - if (isset($this->readers[$id])) { - return $id; - } - if (\is_resource($file)) { - $streamReader = new StreamReader($file); - } elseif (\is_string($file)) { - $streamReader = StreamReader::createByFile($file); - $this->createdReaders[] = $id; - } else { - $streamReader = $file; - } - $reader = new PdfReader($this->getPdfParserInstance($streamReader, $parserParams)); - /** @noinspection OffsetOperationsInspection */ - $this->readers[$id] = $reader; - return $id; - } - /** - * Get a pdf reader instance by its id. - * - * @param string $id - * @return PdfReader - */ - protected function getPdfReader($id) - { - if (isset($this->readers[$id])) { - return $this->readers[$id]; - } - throw new \InvalidArgumentException(\sprintf('No pdf reader with the given id (%s) exists.', $id)); - } - /** - * Set the source PDF file. - * - * @param string|resource|StreamReader $file Path to the file or a stream resource or a StreamReader instance. - * @return int The page count of the PDF document. - * @throws PdfParserException - */ - public function setSourceFile($file) - { - return $this->setSourceFileWithParserParams($file); - } - /** - * Set the source PDF file with parameters which are passed to the parser instance. - * - * This method allows us to pass e.g. authentication information to the parser instance. - * - * @param string|resource|StreamReader $file Path to the file or a stream resource or a StreamReader instance. - * @param array $parserParams Individual parameters passed to the parser instance. - * @return int The page count of the PDF document. - * @throws CrossReferenceException - * @throws PdfParserException - * @throws PdfTypeException - */ - public function setSourceFileWithParserParams($file, array $parserParams = []) - { - $this->currentReaderId = $this->getPdfReaderId($file, $parserParams); - $this->objectsToCopy[$this->currentReaderId] = []; - $reader = $this->getPdfReader($this->currentReaderId); - $this->setMinPdfVersion($reader->getPdfVersion()); - return $reader->getPageCount(); - } - /** - * Imports a page. - * - * @param int $pageNumber The page number. - * @param string $box The page boundary to import. Default set to PageBoundaries::CROP_BOX. - * @param bool $groupXObject Define the form XObject as a group XObject to support transparency (if used). - * @param bool $importExternalLinks Define whether external links are imported or not. - * @return string A unique string identifying the imported page. - * @throws CrossReferenceException - * @throws FilterException - * @throws PdfParserException - * @throws PdfTypeException - * @throws PdfReaderException - * @see PageBoundaries - */ - public function importPage($pageNumber, $box = PageBoundaries::CROP_BOX, $groupXObject = \true, $importExternalLinks = \false) - { - if ($this->currentReaderId === null) { - throw new \BadMethodCallException('No reader initiated. Call setSourceFile() first.'); - } - $pageId = $this->currentReaderId; - $pageNumber = (int) $pageNumber; - $pageId .= '|' . $pageNumber . '|' . ($groupXObject ? '1' : '0') . '|' . ($importExternalLinks ? '1' : '0'); - // for backwards compatibility with FPDI 1 - $box = \ltrim($box, '/'); - if (!PageBoundaries::isValidName($box)) { - throw new \InvalidArgumentException(\sprintf('Box name is invalid: "%s"', $box)); - } - $pageId .= '|' . $box; - if (isset($this->importedPages[$pageId])) { - return $pageId; - } - $reader = $this->getPdfReader($this->currentReaderId); - $page = $reader->getPage($pageNumber); - $bbox = $page->getBoundary($box); - if ($bbox === \false) { - throw new PdfReaderException(\sprintf("Page doesn't have a boundary box (%s).", $box), PdfReaderException::MISSING_DATA); - } - $dict = new PdfDictionary(); - $dict->value['Type'] = PdfName::create('XObject'); - $dict->value['Subtype'] = PdfName::create('Form'); - $dict->value['FormType'] = PdfNumeric::create(1); - $dict->value['BBox'] = $bbox->toPdfArray(); - if ($groupXObject) { - $this->setMinPdfVersion('1.4'); - $dict->value['Group'] = PdfDictionary::create(['Type' => PdfName::create('Group'), 'S' => PdfName::create('Transparency')]); - } - $resources = $page->getAttribute('Resources'); - if ($resources !== null) { - $dict->value['Resources'] = $resources; - } - list($width, $height) = $page->getWidthAndHeight($box); - $a = 1; - $b = 0; - $c = 0; - $d = 1; - $e = -$bbox->getLlx(); - $f = -$bbox->getLly(); - $rotation = $page->getRotation(); - if ($rotation !== 0) { - $rotation *= -1; - $angle = $rotation * \M_PI / 180; - $a = \cos($angle); - $b = \sin($angle); - $c = -$b; - $d = $a; - switch ($rotation) { - case -90: - $e = -$bbox->getLly(); - $f = $bbox->getUrx(); - break; - case -180: - $e = $bbox->getUrx(); - $f = $bbox->getUry(); - break; - case -270: - $e = $bbox->getUry(); - $f = -$bbox->getLlx(); - break; - } - } - // we need to rotate/translate - if ($a != 1 || $b != 0 || $c != 0 || $d != 1 || $e != 0 || $f != 0) { - $dict->value['Matrix'] = PdfArray::create([PdfNumeric::create($a), PdfNumeric::create($b), PdfNumeric::create($c), PdfNumeric::create($d), PdfNumeric::create($e), PdfNumeric::create($f)]); - } - // try to use the existing content stream - $pageDict = $page->getPageDictionary(); - try { - $contentsObject = PdfType::resolve(PdfDictionary::get($pageDict, 'Contents'), $reader->getParser(), \true); - $contents = PdfType::resolve($contentsObject, $reader->getParser()); - // just copy the stream reference if it is only a single stream - if (($contentsIsStream = $contents instanceof PdfStream) || $contents instanceof PdfArray && \count($contents->value) === 1) { - if ($contentsIsStream) { - /** - * @var PdfIndirectObject $contentsObject - */ - $stream = $contents; - } else { - $stream = PdfType::resolve($contents->value[0], $reader->getParser()); - } - $filter = PdfDictionary::get($stream->value, 'Filter'); - if (!$filter instanceof PdfNull) { - $dict->value['Filter'] = $filter; - } - $length = PdfType::resolve(PdfDictionary::get($stream->value, 'Length'), $reader->getParser()); - $dict->value['Length'] = $length; - $stream->value = $dict; - // otherwise extract it from the array and re-compress the whole stream - } else { - $streamContent = $this->compress ? \gzcompress($page->getContentStream()) : $page->getContentStream(); - $dict->value['Length'] = PdfNumeric::create(\strlen($streamContent)); - if ($this->compress) { - $dict->value['Filter'] = PdfName::create('FlateDecode'); - } - $stream = PdfStream::create($dict, $streamContent); - } - // Catch faulty pages and use an empty content stream - } catch (FpdiException $e) { - $dict->value['Length'] = PdfNumeric::create(0); - $stream = PdfStream::create($dict, ''); - } - $externalLinks = []; - if ($importExternalLinks) { - $externalLinks = $page->getExternalLinks($box); - } - $this->importedPages[$pageId] = ['objectNumber' => null, 'readerId' => $this->currentReaderId, 'id' => 'TPL' . $this->getNextTemplateId(), 'width' => $width / $this->k, 'height' => $height / $this->k, 'stream' => $stream, 'externalLinks' => $externalLinks]; - return $pageId; - } - /** - * Draws an imported page onto the page. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $pageId The page id - * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array - * with the keys "x", "y", "width", "height", "adjustPageSize". - * @param float|int $y The ordinate of upper-left corner. - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @param bool $adjustPageSize - * @return array The size. - * @see Fpdi::getTemplateSize() - */ - public function useImportedPage($pageId, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = \false) - { - if (\is_array($x)) { - /** @noinspection OffsetOperationsInspection */ - unset($x['pageId']); - \extract($x, \EXTR_IF_EXISTS); - /** @noinspection NotOptimalIfConditionsInspection */ - if (\is_array($x)) { - $x = 0; - } - } - if (!isset($this->importedPages[$pageId])) { - throw new \InvalidArgumentException('Imported page does not exist!'); - } - $importedPage = $this->importedPages[$pageId]; - $originalSize = $this->getTemplateSize($pageId); - $newSize = $this->getTemplateSize($pageId, $width, $height); - if ($adjustPageSize) { - $this->setPageFormat($newSize, $newSize['orientation']); - } - $scaleX = $newSize['width'] / $originalSize['width']; - $scaleY = $newSize['height'] / $originalSize['height']; - $xPt = $x * $this->k; - $yPt = $y * $this->k; - $newHeightPt = $newSize['height'] * $this->k; - $this->_out( - // reset standard values, translate and scale - \sprintf('q 0 J 1 w 0 j 0 G 0 g %.4F 0 0 %.4F %.4F %.4F cm /%s Do Q', $scaleX, $scaleY, $xPt, $this->hPt - $yPt - $newHeightPt, $importedPage['id']) - ); - if (\count($importedPage['externalLinks']) > 0) { - foreach ($importedPage['externalLinks'] as $externalLink) { - // mPDF uses also 'externalLinks' but doesn't come with a rect-value - if (!isset($externalLink['rect'])) { - continue; - } - /** @var Rectangle $rect */ - $rect = $externalLink['rect']; - $this->Link($x + $rect->getLlx() / $this->k * $scaleX, $y + $newSize['height'] - ($rect->getLly() + $rect->getHeight()) / $this->k * $scaleY, $rect->getWidth() / $this->k * $scaleX, $rect->getHeight() / $this->k * $scaleY, $externalLink['uri']); - $this->adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeightPt, $scaleY, $importedPage); - } - } - return $newSize; - } - /** - * This method will add additional data to the last created link/annotation. - * - * It is separated because TCPDF uses its own logic to handle link annotations. - * This method is overwritten in the TCPDF implementation. - * - * @param array $externalLink - * @param float|int $xPt - * @param float|int $scaleX - * @param float|int $yPt - * @param float|int $newHeightPt - * @param float|int $scaleY - * @param array $importedPage - * @return void - */ - protected function adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeightPt, $scaleY, $importedPage) - { - // let's create a relation of the newly created link to the data of the external link - $lastLink = \count($this->PageLinks[$this->page]); - $this->PageLinks[$this->page][$lastLink - 1]['importedLink'] = $externalLink; - if (\count($externalLink['quadPoints']) > 0) { - $quadPoints = []; - for ($i = 0, $n = \count($externalLink['quadPoints']); $i < $n; $i += 2) { - $quadPoints[] = $xPt + $externalLink['quadPoints'][$i] * $scaleX; - $quadPoints[] = $this->hPt - $yPt - $newHeightPt + $externalLink['quadPoints'][$i + 1] * $scaleY; - } - $this->PageLinks[$this->page][$lastLink - 1]['quadPoints'] = $quadPoints; - } - } - /** - * Get the size of an imported page. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) - */ - public function getImportedPageSize($tpl, $width = null, $height = null) - { - if (isset($this->importedPages[$tpl])) { - $importedPage = $this->importedPages[$tpl]; - if ($width === null && $height === null) { - $width = $importedPage['width']; - $height = $importedPage['height']; - } elseif ($width === null) { - $width = $height * $importedPage['width'] / $importedPage['height']; - } - if ($height === null) { - $height = $width * $importedPage['height'] / $importedPage['width']; - } - if ($height <= 0.0 || $width <= 0.0) { - throw new \InvalidArgumentException('Width or height parameter needs to be larger than zero.'); - } - return ['width' => $width, 'height' => $height, 0 => $width, 1 => $height, 'orientation' => $width > $height ? 'L' : 'P']; - } - return \false; - } - /** - * Writes a PdfType object to the resulting buffer. - * - * @param PdfType $value - * @throws PdfTypeException - */ - protected function writePdfType(PdfType $value) - { - if ($value instanceof PdfNumeric) { - if (\is_int($value->value)) { - $this->_put($value->value . ' ', \false); - } else { - $this->_put(\rtrim(\rtrim(\sprintf('%.5F', $value->value), '0'), '.') . ' ', \false); - } - } elseif ($value instanceof PdfName) { - $this->_put('/' . $value->value . ' ', \false); - } elseif ($value instanceof PdfString) { - $this->_put('(' . $value->value . ')', \false); - } elseif ($value instanceof PdfHexString) { - $this->_put('<' . $value->value . '>'); - } elseif ($value instanceof PdfBoolean) { - $this->_put($value->value ? 'true ' : 'false ', \false); - } elseif ($value instanceof PdfArray) { - $this->_put('[', \false); - foreach ($value->value as $entry) { - $this->writePdfType($entry); - } - $this->_put(']'); - } elseif ($value instanceof PdfDictionary) { - $this->_put('<<', \false); - foreach ($value->value as $name => $entry) { - $this->_put('/' . $name . ' ', \false); - $this->writePdfType($entry); - } - $this->_put('>>'); - } elseif ($value instanceof PdfToken) { - $this->_put($value->value); - } elseif ($value instanceof PdfNull) { - $this->_put('null '); - } elseif ($value instanceof PdfStream) { - /** - * @var $value PdfStream - */ - $this->writePdfType($value->value); - $this->_put('stream'); - $this->_put($value->getStream()); - $this->_put('endstream'); - } elseif ($value instanceof PdfIndirectObjectReference) { - if (!isset($this->objectMap[$this->currentReaderId])) { - $this->objectMap[$this->currentReaderId] = []; - } - if (!isset($this->objectMap[$this->currentReaderId][$value->value])) { - $this->objectMap[$this->currentReaderId][$value->value] = ++$this->n; - $this->objectsToCopy[$this->currentReaderId][] = $value->value; - } - $this->_put($this->objectMap[$this->currentReaderId][$value->value] . ' 0 R ', \false); - } elseif ($value instanceof PdfIndirectObject) { - /** - * @var PdfIndirectObject $value - */ - $n = $this->objectMap[$this->currentReaderId][$value->objectNumber]; - $this->_newobj($n); - $this->writePdfType($value->value); - $this->_put('endobj'); - } - } -} diff --git a/dependencies/setasign/fpdi/src/GraphicsState.php b/dependencies/setasign/fpdi/src/GraphicsState.php deleted file mode 100644 index c045fe3..0000000 --- a/dependencies/setasign/fpdi/src/GraphicsState.php +++ /dev/null @@ -1,85 +0,0 @@ -ctm = $ctm; - } - /** - * @param Matrix $matrix - * @return $this - */ - public function add(Matrix $matrix) - { - $this->ctm = $matrix->multiply($this->ctm); - return $this; - } - /** - * @param int|float $x - * @param int|float $y - * @param int|float $angle - * @return $this - */ - public function rotate($x, $y, $angle) - { - if (\abs($angle) < 1.0E-5) { - return $this; - } - $angle = \deg2rad($angle); - $c = \cos($angle); - $s = \sin($angle); - $this->add(new Matrix($c, $s, -$s, $c, $x, $y)); - return $this->translate(-$x, -$y); - } - /** - * @param int|float $shiftX - * @param int|float $shiftY - * @return $this - */ - public function translate($shiftX, $shiftY) - { - return $this->add(new Matrix(1, 0, 0, 1, $shiftX, $shiftY)); - } - /** - * @param int|float $scaleX - * @param int|float $scaleY - * @return $this - */ - public function scale($scaleX, $scaleY) - { - return $this->add(new Matrix($scaleX, 0, 0, $scaleY, 0, 0)); - } - /** - * @param Vector $vector - * @return Vector - */ - public function toUserSpace(Vector $vector) - { - return $vector->multiplyWithMatrix($this->ctm); - } -} diff --git a/dependencies/setasign/fpdi/src/Math/Matrix.php b/dependencies/setasign/fpdi/src/Math/Matrix.php deleted file mode 100644 index e2f48bb..0000000 --- a/dependencies/setasign/fpdi/src/Math/Matrix.php +++ /dev/null @@ -1,79 +0,0 @@ -a = (float) $a; - $this->b = (float) $b; - $this->c = (float) $c; - $this->d = (float) $d; - $this->e = (float) $e; - $this->f = (float) $f; - } - /** - * @return float[] - */ - public function getValues() - { - return [$this->a, $this->b, $this->c, $this->d, $this->e, $this->f]; - } - /** - * @param Matrix $by - * @return Matrix - */ - public function multiply(self $by) - { - $a = $this->a * $by->a + $this->b * $by->c; - $b = $this->a * $by->b + $this->b * $by->d; - $c = $this->c * $by->a + $this->d * $by->c; - $d = $this->c * $by->b + $this->d * $by->d; - $e = $this->e * $by->a + $this->f * $by->c + $by->e; - $f = $this->e * $by->b + $this->f * $by->d + $by->f; - return new self($a, $b, $c, $d, $e, $f); - } -} diff --git a/dependencies/setasign/fpdi/src/Math/Vector.php b/dependencies/setasign/fpdi/src/Math/Vector.php deleted file mode 100644 index 0e3f618..0000000 --- a/dependencies/setasign/fpdi/src/Math/Vector.php +++ /dev/null @@ -1,59 +0,0 @@ -x = (float) $x; - $this->y = (float) $y; - } - /** - * @return float - */ - public function getX() - { - return $this->x; - } - /** - * @return float - */ - public function getY() - { - return $this->y; - } - /** - * @param Matrix $matrix - * @return Vector - */ - public function multiplyWithMatrix(Matrix $matrix) - { - list($a, $b, $c, $d, $e, $f) = $matrix->getValues(); - $x = $a * $this->x + $c * $this->y + $e; - $y = $b * $this->x + $d * $this->y + $f; - return new self($x, $y); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php b/dependencies/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php deleted file mode 100644 index 4f278d4..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php +++ /dev/null @@ -1,73 +0,0 @@ -parser = $parser; - $this->readTrailer(); - } - /** - * Get the trailer dictionary. - * - * @return PdfDictionary - */ - public function getTrailer() - { - return $this->trailer; - } - /** - * Read the trailer dictionary. - * - * @throws CrossReferenceException - * @throws PdfTypeException - */ - protected function readTrailer() - { - try { - $trailerKeyword = $this->parser->readValue(null, PdfToken::class); - if ($trailerKeyword->value !== 'trailer') { - throw new CrossReferenceException(\sprintf('Unexpected end of cross reference. "trailer"-keyword expected, got: %s.', $trailerKeyword->value), CrossReferenceException::UNEXPECTED_END); - } - } catch (PdfTypeException $e) { - throw new CrossReferenceException('Unexpected end of cross reference. "trailer"-keyword expected, got an invalid object type.', CrossReferenceException::UNEXPECTED_END, $e); - } - try { - $trailer = $this->parser->readValue(null, PdfDictionary::class); - } catch (PdfTypeException $e) { - throw new CrossReferenceException('Unexpected end of cross reference. Trailer not found.', CrossReferenceException::UNEXPECTED_END, $e); - } - $this->trailer = $trailer; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php b/dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php deleted file mode 100644 index b504db9..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php +++ /dev/null @@ -1,254 +0,0 @@ -parser = $parser; - $this->fileHeaderOffset = $fileHeaderOffset; - $offset = $this->findStartXref(); - $reader = null; - /** @noinspection TypeUnsafeComparisonInspection */ - while ($offset != \false) { - // By doing an unsafe comparsion we ignore faulty references to byte offset 0 - try { - $reader = $this->readXref($offset + $this->fileHeaderOffset); - } catch (CrossReferenceException $e) { - // sometimes the file header offset is part of the byte offsets, so let's retry by resetting it to zero. - if ($e->getCode() === CrossReferenceException::INVALID_DATA && $this->fileHeaderOffset !== 0) { - $this->fileHeaderOffset = 0; - $reader = $this->readXref($offset + $this->fileHeaderOffset); - } else { - throw $e; - } - } - $trailer = $reader->getTrailer(); - $this->checkForEncryption($trailer); - $this->readers[] = $reader; - if (isset($trailer->value['Prev'])) { - $offset = $trailer->value['Prev']->value; - } else { - $offset = \false; - } - } - // fix faulty sub-section header - if ($reader instanceof FixedReader) { - /** - * @var FixedReader $reader - */ - $reader->fixFaultySubSectionShift(); - } - if ($reader === null) { - throw new CrossReferenceException('No cross-reference found.', CrossReferenceException::NO_XREF_FOUND); - } - } - /** - * Get the size of the cross reference. - * - * @return integer - */ - public function getSize() - { - return $this->getTrailer()->value['Size']->value; - } - /** - * Get the trailer dictionary. - * - * @return PdfDictionary - */ - public function getTrailer() - { - return $this->readers[0]->getTrailer(); - } - /** - * Get the cross reference readser instances. - * - * @return ReaderInterface[] - */ - public function getReaders() - { - return $this->readers; - } - /** - * Get the offset by an object number. - * - * @param int $objectNumber - * @return integer|bool - */ - public function getOffsetFor($objectNumber) - { - foreach ($this->getReaders() as $reader) { - $offset = $reader->getOffsetFor($objectNumber); - if ($offset !== \false) { - return $offset; - } - } - return \false; - } - /** - * Get an indirect object by its object number. - * - * @param int $objectNumber - * @return PdfIndirectObject - * @throws CrossReferenceException - */ - public function getIndirectObject($objectNumber) - { - $offset = $this->getOffsetFor($objectNumber); - if ($offset === \false) { - throw new CrossReferenceException(\sprintf('Object (id:%s) not found.', $objectNumber), CrossReferenceException::OBJECT_NOT_FOUND); - } - $parser = $this->parser; - $parser->getTokenizer()->clearStack(); - $parser->getStreamReader()->reset($offset + $this->fileHeaderOffset); - try { - /** @var PdfIndirectObject $object */ - $object = $parser->readValue(null, PdfIndirectObject::class); - } catch (PdfTypeException $e) { - throw new CrossReferenceException(\sprintf('Object (id:%s) not found at location (%s).', $objectNumber, $offset), CrossReferenceException::OBJECT_NOT_FOUND, $e); - } - if ($object->objectNumber !== $objectNumber) { - throw new CrossReferenceException(\sprintf('Wrong object found, got %s while %s was expected.', $object->objectNumber, $objectNumber), CrossReferenceException::OBJECT_NOT_FOUND); - } - return $object; - } - /** - * Read the cross-reference table at a given offset. - * - * Internally the method will try to evaluate the best reader for this cross-reference. - * - * @param int $offset - * @return ReaderInterface - * @throws CrossReferenceException - * @throws PdfTypeException - */ - protected function readXref($offset) - { - $this->parser->getStreamReader()->reset($offset); - $this->parser->getTokenizer()->clearStack(); - $initValue = $this->parser->readValue(); - return $this->initReaderInstance($initValue); - } - /** - * Get a cross-reference reader instance. - * - * @param PdfToken|PdfIndirectObject $initValue - * @return ReaderInterface|bool - * @throws CrossReferenceException - * @throws PdfTypeException - */ - protected function initReaderInstance($initValue) - { - $position = $this->parser->getStreamReader()->getPosition() + $this->parser->getStreamReader()->getOffset() + $this->fileHeaderOffset; - if ($initValue instanceof PdfToken && $initValue->value === 'xref') { - try { - return new FixedReader($this->parser); - } catch (CrossReferenceException $e) { - $this->parser->getStreamReader()->reset($position); - $this->parser->getTokenizer()->clearStack(); - return new LineReader($this->parser); - } - } - if ($initValue instanceof PdfIndirectObject) { - try { - $stream = PdfStream::ensure($initValue->value); - } catch (PdfTypeException $e) { - throw new CrossReferenceException('Invalid object type at xref reference offset.', CrossReferenceException::INVALID_DATA, $e); - } - $type = PdfDictionary::get($stream->value, 'Type'); - if ($type->value !== 'XRef') { - throw new CrossReferenceException('The xref position points to an incorrect object type.', CrossReferenceException::INVALID_DATA); - } - $this->checkForEncryption($stream->value); - throw new CrossReferenceException('This PDF document probably uses a compression technique which is not supported by the ' . 'free parser shipped with FPDI. (See https://www.setasign.com/fpdi-pdf-parser for more details)', CrossReferenceException::COMPRESSED_XREF); - } - throw new CrossReferenceException('The xref position points to an incorrect object type.', CrossReferenceException::INVALID_DATA); - } - /** - * Check for encryption. - * - * @param PdfDictionary $dictionary - * @throws CrossReferenceException - */ - protected function checkForEncryption(PdfDictionary $dictionary) - { - if (isset($dictionary->value['Encrypt'])) { - throw new CrossReferenceException('This PDF document is encrypted and cannot be processed with FPDI.', CrossReferenceException::ENCRYPTED); - } - } - /** - * Find the start position for the first cross-reference. - * - * @return int The byte-offset position of the first cross-reference. - * @throws CrossReferenceException - */ - protected function findStartXref() - { - $reader = $this->parser->getStreamReader(); - $reader->reset(-self::$trailerSearchLength, self::$trailerSearchLength); - $buffer = $reader->getBuffer(\false); - $pos = \strrpos($buffer, 'startxref'); - $addOffset = 9; - if ($pos === \false) { - // Some corrupted documents uses startref, instead of startxref - $pos = \strrpos($buffer, 'startref'); - if ($pos === \false) { - throw new CrossReferenceException('Unable to find pointer to xref table', CrossReferenceException::NO_STARTXREF_FOUND); - } - $addOffset = 8; - } - $reader->setOffset($pos + $addOffset); - try { - $value = $this->parser->readValue(null, PdfNumeric::class); - } catch (PdfTypeException $e) { - throw new CrossReferenceException('Invalid data after startxref keyword.', CrossReferenceException::INVALID_DATA, $e); - } - return $value->value; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php b/dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php deleted file mode 100644 index d5d45e4..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php +++ /dev/null @@ -1,66 +0,0 @@ -reader = $parser->getStreamReader(); - $this->read(); - parent::__construct($parser); - } - /** - * Get all subsection data. - * - * @return array - */ - public function getSubSections() - { - return $this->subSections; - } - /** - * @inheritdoc - * @return int|false - */ - public function getOffsetFor($objectNumber) - { - foreach ($this->subSections as $offset => list($startObject, $objectCount)) { - /** - * @var int $startObject - * @var int $objectCount - */ - if ($objectNumber >= $startObject && $objectNumber < $startObject + $objectCount) { - $position = $offset + 20 * ($objectNumber - $startObject); - $this->reader->ensure($position, 20); - $line = $this->reader->readBytes(20); - if ($line[17] === 'f') { - return \false; - } - return (int) \substr($line, 0, 10); - } - } - return \false; - } - /** - * Read the cross-reference. - * - * This reader will only read the subsections in this method. The offsets were resolved individually by this - * information. - * - * @throws CrossReferenceException - */ - protected function read() - { - $subSections = []; - $startObject = $entryCount = $lastLineStart = null; - $validityChecked = \false; - while (($line = $this->reader->readLine(20)) !== \false) { - if (\strpos($line, 'trailer') !== \false) { - $this->reader->reset($lastLineStart); - break; - } - // jump over if line content doesn't match the expected string - if (\sscanf($line, '%d %d', $startObject, $entryCount) !== 2) { - continue; - } - $oldPosition = $this->reader->getPosition(); - $position = $oldPosition + $this->reader->getOffset(); - if (!$validityChecked && $entryCount > 0) { - $nextLine = $this->reader->readBytes(21); - /* Check the next line for maximum of 20 bytes and not longer - * By catching 21 bytes and trimming the length should be still 21. - */ - if (\strlen(\trim($nextLine)) !== 21) { - throw new CrossReferenceException('Cross-reference entries are larger than 20 bytes.', CrossReferenceException::ENTRIES_TOO_LARGE); - } - /* Check for less than 20 bytes: cut the line to 20 bytes and trim; have to result in exactly 18 bytes. - * If it would have less bytes the substring would get the first bytes of the next line which would - * evaluate to a 20 bytes long string after trimming. - */ - if (\strlen(\trim(\substr($nextLine, 0, 20))) !== 18) { - throw new CrossReferenceException('Cross-reference entries are less than 20 bytes.', CrossReferenceException::ENTRIES_TOO_SHORT); - } - $validityChecked = \true; - } - $subSections[$position] = [$startObject, $entryCount]; - $lastLineStart = $position + $entryCount * 20; - $this->reader->reset($lastLineStart); - } - // reset after the last correct parsed line - $this->reader->reset($lastLineStart); - if (\count($subSections) === 0) { - throw new CrossReferenceException('No entries found in cross-reference.', CrossReferenceException::NO_ENTRIES); - } - $this->subSections = $subSections; - } - /** - * Fixes an invalid object number shift. - * - * This method can be used to repair documents with an invalid subsection header: - * - * - * xref - * 1 7 - * 0000000000 65535 f - * 0000000009 00000 n - * 0000412075 00000 n - * 0000412172 00000 n - * 0000412359 00000 n - * 0000412417 00000 n - * 0000412468 00000 n - * - * - * It shall only be called on the first table. - * - * @return bool - */ - public function fixFaultySubSectionShift() - { - $subSections = $this->getSubSections(); - if (\count($subSections) > 1) { - return \false; - } - $subSection = \current($subSections); - if ($subSection[0] != 1) { - return \false; - } - if ($this->getOffsetFor(1) === \false) { - foreach ($subSections as $offset => list($startObject, $objectCount)) { - $this->subSections[$offset] = [$startObject - 1, $objectCount]; - } - return \true; - } - return \false; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php b/dependencies/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php deleted file mode 100644 index b2f598a..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php +++ /dev/null @@ -1,138 +0,0 @@ - 20 bytes). - */ -class LineReader extends AbstractReader implements ReaderInterface -{ - /** - * The object offsets. - * - * @var array - */ - protected $offsets; - /** - * LineReader constructor. - * - * @param PdfParser $parser - * @throws CrossReferenceException - */ - public function __construct(PdfParser $parser) - { - $this->read($this->extract($parser->getStreamReader())); - parent::__construct($parser); - } - /** - * @inheritdoc - * @return int|false - */ - public function getOffsetFor($objectNumber) - { - if (isset($this->offsets[$objectNumber])) { - return $this->offsets[$objectNumber][0]; - } - return \false; - } - /** - * Get all found offsets. - * - * @return array - */ - public function getOffsets() - { - return $this->offsets; - } - /** - * Extracts the cross reference data from the stream reader. - * - * @param StreamReader $reader - * @return string - * @throws CrossReferenceException - */ - protected function extract(StreamReader $reader) - { - $bytesPerCycle = 100; - $reader->reset(null, $bytesPerCycle); - $cycles = 0; - do { - // 6 = length of "trailer" - 1 - $pos = \max($bytesPerCycle * $cycles - 6, 0); - $trailerPos = \strpos($reader->getBuffer(\false), 'trailer', $pos); - $cycles++; - } while ($trailerPos === \false && $reader->increaseLength($bytesPerCycle) !== \false); - if ($trailerPos === \false) { - throw new CrossReferenceException('Unexpected end of cross reference. "trailer"-keyword not found.', CrossReferenceException::NO_TRAILER_FOUND); - } - $xrefContent = \substr($reader->getBuffer(\false), 0, $trailerPos); - $reader->reset($reader->getPosition() + $trailerPos); - return $xrefContent; - } - /** - * Read the cross-reference entries. - * - * @param string $xrefContent - * @throws CrossReferenceException - */ - protected function read($xrefContent) - { - // get eol markers in the first 100 bytes - \preg_match_all("/(\r\n|\n|\r)/", \substr($xrefContent, 0, 100), $m); - if (\count($m[0]) === 0) { - throw new CrossReferenceException('No data found in cross-reference.', CrossReferenceException::INVALID_DATA); - } - // count(array_count_values()) is faster then count(array_unique()) - // @see https://github.com/symfony/symfony/pull/23731 - // can be reverted for php7.2 - $differentLineEndings = \count(\array_count_values($m[0])); - if ($differentLineEndings > 1) { - $lines = \preg_split("/(\r\n|\n|\r)/", $xrefContent, -1, \PREG_SPLIT_NO_EMPTY); - } else { - $lines = \explode($m[0][0], $xrefContent); - } - unset($differentLineEndings, $m); - if (!\is_array($lines)) { - $this->offsets = []; - return; - } - $start = 0; - $offsets = []; - // trim all lines and remove empty lines - $lines = \array_filter(\array_map('\\trim', $lines)); - foreach ($lines as $line) { - $pieces = \explode(' ', $line); - switch (\count($pieces)) { - case 2: - $start = (int) $pieces[0]; - break; - case 3: - switch ($pieces[2]) { - case 'n': - $offsets[$start] = [(int) $pieces[0], (int) $pieces[1]]; - $start++; - break 2; - case 'f': - $start++; - break 2; - } - // fall through if pieces doesn't match - default: - throw new CrossReferenceException(\sprintf('Unexpected data in xref table (%s)', \implode(' ', $pieces)), CrossReferenceException::INVALID_DATA); - } - } - $this->offsets = $offsets; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php b/dependencies/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php deleted file mode 100644 index 8851729..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - if ($ch === 126 && isset($data[$k + 1]) && (\ord($data[$k + 1]) & 0xff) === 62) { - break; - } - if ($ch === 122 && $state === 0) { - $out .= \chr(0) . \chr(0) . \chr(0) . \chr(0); - continue; - } - if ($ch < 33 || $ch > 117) { - throw new Ascii85Exception('Illegal character found while ASCII85 decode.', Ascii85Exception::ILLEGAL_CHAR_FOUND); - } - $chn[$state] = $ch - 33; - /* ! */ - $state++; - if ($state === 5) { - $state = 0; - $r = 0; - for ($j = 0; $j < 5; ++$j) { - /** @noinspection UnnecessaryCastingInspection */ - $r = (int) ($r * 85 + $chn[$j]); - } - $out .= \chr($r >> 24) . \chr($r >> 16) . \chr($r >> 8) . \chr($r); - } - } - if ($state === 1) { - throw new Ascii85Exception('Illegal length while ASCII85 decode.', Ascii85Exception::ILLEGAL_LENGTH); - } - if ($state === 2) { - $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1] + 1) * 85 * 85 * 85; - $out .= \chr($r >> 24); - } elseif ($state === 3) { - $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2] + 1) * 85 * 85; - $out .= \chr($r >> 24); - $out .= \chr($r >> 16); - } elseif ($state === 4) { - $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3] + 1) * 85; - $out .= \chr($r >> 24); - $out .= \chr($r >> 16); - $out .= \chr($r >> 8); - } - return $out; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php b/dependencies/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php deleted file mode 100644 index b4b22fb..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php +++ /dev/null @@ -1,25 +0,0 @@ -')); - if (\strlen($data) % 2 === 1) { - $data .= '0'; - } - return \pack('H*', $data); - } - /** - * Converts a string into ASCII hexadecimal representation. - * - * @param string $data The input string - * @param boolean $leaveEOD - * @return string - */ - public function encode($data, $leaveEOD = \false) - { - $t = \unpack('H*', $data); - return \current($t) . ($leaveEOD ? '' : '>'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Filter/FilterException.php b/dependencies/setasign/fpdi/src/PdfParser/Filter/FilterException.php deleted file mode 100644 index a0e412c..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Filter/FilterException.php +++ /dev/null @@ -1,20 +0,0 @@ -extensionLoaded()) { - $oData = $data; - $data = $data !== '' ? @\gzuncompress($data) : ''; - if ($data === \false) { - // let's try if the checksum is CRC32 - $fh = \fopen('php://temp', 'w+b'); - \fwrite($fh, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $oData); - // "window" == 31 -> 16 + (8 to 15): Uses the low 4 bits of the value as the window size logarithm. - // The input must include a gzip header and trailer (via 16). - \stream_filter_append($fh, 'zlib.inflate', \STREAM_FILTER_READ, ['window' => 31]); - \fseek($fh, 0); - $data = @\stream_get_contents($fh); - \fclose($fh); - if ($data) { - return $data; - } - // Try this fallback - $tries = 0; - $oDataLen = \strlen($oData); - while ($tries < 6 && ($data === \false || \strlen($data) < $oDataLen - $tries - 1)) { - $data = @\gzinflate(\substr($oData, $tries)); - $tries++; - } - // let's use this fallback only if the $data is longer than the original data - if (\strlen($data) > $oDataLen - $tries - 1) { - return $data; - } - if (!$data) { - throw new FlateException('Error while decompressing stream.', FlateException::DECOMPRESS_ERROR); - } - } - } else { - throw new FlateException('To handle FlateDecode filter, enable zlib support in PHP.', FlateException::NO_ZLIB); - } - return $data; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Filter/FlateException.php b/dependencies/setasign/fpdi/src/PdfParser/Filter/FlateException.php deleted file mode 100644 index d14af65..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Filter/FlateException.php +++ /dev/null @@ -1,25 +0,0 @@ -initsTable(); - $this->data = $data; - $this->dataLength = \strlen($data); - // Initialize pointers - $this->bytePointer = 0; - $this->nextData = 0; - $this->nextBits = 0; - $prevCode = 0; - $uncompData = ''; - while (($code = $this->getNextCode()) !== 257) { - if ($code === 256) { - $this->initsTable(); - } elseif ($prevCode === 256) { - $uncompData .= $this->sTable[$code]; - } elseif ($code < $this->tIdx) { - $string = $this->sTable[$code]; - $uncompData .= $string; - $this->addStringToTable($this->sTable[$prevCode], $string[0]); - } else { - $string = $this->sTable[$prevCode]; - $string .= $string[0]; - $uncompData .= $string; - $this->addStringToTable($string); - } - $prevCode = $code; - } - return $uncompData; - } - /** - * Initialize the string table. - */ - protected function initsTable() - { - $this->sTable = []; - for ($i = 0; $i < 256; $i++) { - $this->sTable[$i] = \chr($i); - } - $this->tIdx = 258; - $this->bitsToGet = 9; - } - /** - * Add a new string to the string table. - * - * @param string $oldString - * @param string $newString - */ - protected function addStringToTable($oldString, $newString = '') - { - $string = $oldString . $newString; - // Add this new String to the table - $this->sTable[$this->tIdx++] = $string; - if ($this->tIdx === 511) { - $this->bitsToGet = 10; - } elseif ($this->tIdx === 1023) { - $this->bitsToGet = 11; - } elseif ($this->tIdx === 2047) { - $this->bitsToGet = 12; - } - } - /** - * Returns the next 9, 10, 11 or 12 bits. - * - * @return int - */ - protected function getNextCode() - { - if ($this->bytePointer === $this->dataLength) { - return 257; - } - $this->nextData = $this->nextData << 8 | \ord($this->data[$this->bytePointer++]) & 0xff; - $this->nextBits += 8; - if ($this->nextBits < $this->bitsToGet) { - $this->nextData = $this->nextData << 8 | \ord($this->data[$this->bytePointer++]) & 0xff; - $this->nextBits += 8; - } - $code = $this->nextData >> $this->nextBits - $this->bitsToGet & $this->andTable[$this->bitsToGet - 9]; - $this->nextBits -= $this->bitsToGet; - return $code; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Filter/LzwException.php b/dependencies/setasign/fpdi/src/PdfParser/Filter/LzwException.php deleted file mode 100644 index 07f39bd..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Filter/LzwException.php +++ /dev/null @@ -1,21 +0,0 @@ -streamReader = $streamReader; - $this->tokenizer = new Tokenizer($streamReader); - } - /** - * Removes cycled references. - * - * @internal - */ - public function cleanUp() - { - $this->xref = null; - } - /** - * Get the stream reader instance. - * - * @return StreamReader - */ - public function getStreamReader() - { - return $this->streamReader; - } - /** - * Get the tokenizer instance. - * - * @return Tokenizer - */ - public function getTokenizer() - { - return $this->tokenizer; - } - /** - * Resolves the file header. - * - * @throws PdfParserException - * @return int - */ - protected function resolveFileHeader() - { - if ($this->fileHeader) { - return $this->fileHeaderOffset; - } - $this->streamReader->reset(0); - $maxIterations = 1000; - while (\true) { - $buffer = $this->streamReader->getBuffer(\false); - $offset = \strpos($buffer, '%PDF-'); - if ($offset === \false) { - if (!$this->streamReader->increaseLength(100) || --$maxIterations === 0) { - throw new PdfParserException('Unable to find PDF file header.', PdfParserException::FILE_HEADER_NOT_FOUND); - } - continue; - } - break; - } - $this->fileHeaderOffset = $offset; - $this->streamReader->setOffset($offset); - $this->fileHeader = \trim($this->streamReader->readLine()); - return $this->fileHeaderOffset; - } - /** - * Get the cross-reference instance. - * - * @return CrossReference - * @throws CrossReferenceException - * @throws PdfParserException - */ - public function getCrossReference() - { - if ($this->xref === null) { - $this->xref = new CrossReference($this, $this->resolveFileHeader()); - } - return $this->xref; - } - /** - * Get the PDF version. - * - * @return int[] An array of major and minor version. - * @throws PdfParserException - */ - public function getPdfVersion() - { - $this->resolveFileHeader(); - if (\preg_match('/%PDF-(\\d)\\.(\\d)/', $this->fileHeader, $result) === 0) { - throw new PdfParserException('Unable to extract PDF version from file header.', PdfParserException::PDF_VERSION_NOT_FOUND); - } - list(, $major, $minor) = $result; - $catalog = $this->getCatalog(); - if (isset($catalog->value['Version'])) { - $versionParts = \explode('.', PdfName::unescape(PdfType::resolve($catalog->value['Version'], $this)->value)); - if (\count($versionParts) === 2) { - list($major, $minor) = $versionParts; - } - } - return [(int) $major, (int) $minor]; - } - /** - * Get the catalog dictionary. - * - * @return PdfDictionary - * @throws Type\PdfTypeException - * @throws CrossReferenceException - * @throws PdfParserException - */ - public function getCatalog() - { - $trailer = $this->getCrossReference()->getTrailer(); - $catalog = PdfType::resolve(PdfDictionary::get($trailer, 'Root'), $this); - return PdfDictionary::ensure($catalog); - } - /** - * Get an indirect object by its object number. - * - * @param int $objectNumber - * @param bool $cache - * @return PdfIndirectObject - * @throws CrossReferenceException - * @throws PdfParserException - */ - public function getIndirectObject($objectNumber, $cache = \false) - { - $objectNumber = (int) $objectNumber; - if (isset($this->objects[$objectNumber])) { - return $this->objects[$objectNumber]; - } - $object = $this->getCrossReference()->getIndirectObject($objectNumber); - if ($cache) { - $this->objects[$objectNumber] = $object; - } - return $object; - } - /** - * Read a PDF value. - * - * @param null|bool|string $token - * @param null|string $expectedType - * @return false|PdfArray|PdfBoolean|PdfDictionary|PdfHexString|PdfIndirectObject|PdfIndirectObjectReference|PdfName|PdfNull|PdfNumeric|PdfStream|PdfString|PdfToken - * @throws Type\PdfTypeException - */ - public function readValue($token = null, $expectedType = null) - { - if ($token === null) { - $token = $this->tokenizer->getNextToken(); - } - if ($token === \false) { - if ($expectedType !== null) { - throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); - } - return \false; - } - switch ($token) { - case '(': - $this->ensureExpectedType($token, $expectedType); - return $this->parsePdfString(); - case '<': - if ($this->streamReader->getByte() === '<') { - $this->ensureExpectedType('<<', $expectedType); - $this->streamReader->addOffset(1); - return $this->parsePdfDictionary(); - } - $this->ensureExpectedType($token, $expectedType); - return $this->parsePdfHexString(); - case '/': - $this->ensureExpectedType($token, $expectedType); - return $this->parsePdfName(); - case '[': - $this->ensureExpectedType($token, $expectedType); - return $this->parsePdfArray(); - default: - if (\is_numeric($token)) { - if (($token2 = $this->tokenizer->getNextToken()) !== \false) { - if (\is_numeric($token2) && ($token3 = $this->tokenizer->getNextToken()) !== \false) { - switch ($token3) { - case 'obj': - if ($expectedType !== null && $expectedType !== PdfIndirectObject::class) { - throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); - } - return $this->parsePdfIndirectObject((int) $token, (int) $token2); - case 'R': - if ($expectedType !== null && $expectedType !== PdfIndirectObjectReference::class) { - throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); - } - return PdfIndirectObjectReference::create((int) $token, (int) $token2); - } - $this->tokenizer->pushStack($token3); - } - $this->tokenizer->pushStack($token2); - } - if ($expectedType !== null && $expectedType !== PdfNumeric::class) { - throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); - } - return PdfNumeric::create($token + 0); - } - if ($token === 'true' || $token === 'false') { - $this->ensureExpectedType($token, $expectedType); - return PdfBoolean::create($token === 'true'); - } - if ($token === 'null') { - $this->ensureExpectedType($token, $expectedType); - return new PdfNull(); - } - if ($expectedType !== null && $expectedType !== PdfToken::class) { - throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); - } - $v = new PdfToken(); - $v->value = $token; - return $v; - } - } - /** - * @return PdfString - */ - protected function parsePdfString() - { - return PdfString::parse($this->streamReader); - } - /** - * @return false|PdfHexString - */ - protected function parsePdfHexString() - { - return PdfHexString::parse($this->streamReader); - } - /** - * @return bool|PdfDictionary - * @throws PdfTypeException - */ - protected function parsePdfDictionary() - { - return PdfDictionary::parse($this->tokenizer, $this->streamReader, $this); - } - /** - * @return PdfName - */ - protected function parsePdfName() - { - return PdfName::parse($this->tokenizer, $this->streamReader); - } - /** - * @return false|PdfArray - * @throws PdfTypeException - */ - protected function parsePdfArray() - { - return PdfArray::parse($this->tokenizer, $this); - } - /** - * @param int $objectNumber - * @param int $generationNumber - * @return false|PdfIndirectObject - * @throws Type\PdfTypeException - */ - protected function parsePdfIndirectObject($objectNumber, $generationNumber) - { - return PdfIndirectObject::parse($objectNumber, $generationNumber, $this, $this->tokenizer, $this->streamReader); - } - /** - * Ensures that the token will evaluate to an expected object type (or not). - * - * @param string $token - * @param string|null $expectedType - * @return bool - * @throws Type\PdfTypeException - */ - protected function ensureExpectedType($token, $expectedType) - { - static $mapping = ['(' => PdfString::class, '<' => PdfHexString::class, '<<' => PdfDictionary::class, '/' => PdfName::class, '[' => PdfArray::class, 'true' => PdfBoolean::class, 'false' => PdfBoolean::class, 'null' => PdfNull::class]; - if ($expectedType === null || $mapping[$token] === $expectedType) { - return \true; - } - throw new Type\PdfTypeException('Got unexpected token type.', Type\PdfTypeException::INVALID_DATA_TYPE); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/PdfParserException.php b/dependencies/setasign/fpdi/src/PdfParser/PdfParserException.php deleted file mode 100644 index e1be7e8..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/PdfParserException.php +++ /dev/null @@ -1,42 +0,0 @@ -stream = $stream; - $this->closeStream = $closeStream; - $this->reset(); - } - /** - * The destructor. - */ - public function __destruct() - { - $this->cleanUp(); - } - /** - * Closes the file handle. - */ - public function cleanUp() - { - if ($this->closeStream && \is_resource($this->stream)) { - \fclose($this->stream); - } - } - /** - * Returns the byte length of the buffer. - * - * @param bool $atOffset - * @return int - */ - public function getBufferLength($atOffset = \false) - { - if ($atOffset === \false) { - return $this->bufferLength; - } - return $this->bufferLength - $this->offset; - } - /** - * Get the current position in the stream. - * - * @return int - */ - public function getPosition() - { - return $this->position; - } - /** - * Returns the current buffer. - * - * @param bool $atOffset - * @return string - */ - public function getBuffer($atOffset = \true) - { - if ($atOffset === \false) { - return $this->buffer; - } - $string = \substr($this->buffer, $this->offset); - return (string) $string; - } - /** - * Gets a byte at a specific position in the buffer. - * - * If the position is invalid the method will return false. - * - * If the $position parameter is set to null the value of $this->offset will be used. - * - * @param int|null $position - * @return string|bool - */ - public function getByte($position = null) - { - $position = (int) ($position !== null ? $position : $this->offset); - if ($position >= $this->bufferLength && (!$this->increaseLength() || $position >= $this->bufferLength)) { - return \false; - } - return $this->buffer[$position]; - } - /** - * Returns a byte at a specific position, and set the offset to the next byte position. - * - * If the position is invalid the method will return false. - * - * If the $position parameter is set to null the value of $this->offset will be used. - * - * @param int|null $position - * @return string|bool - */ - public function readByte($position = null) - { - if ($position !== null) { - $position = (int) $position; - // check if needed bytes are available in the current buffer - if (!($position >= $this->position && $position < $this->position + $this->bufferLength)) { - $this->reset($position); - $offset = $this->offset; - } else { - $offset = $position - $this->position; - } - } else { - $offset = $this->offset; - } - if ($offset >= $this->bufferLength && (!$this->increaseLength() || $offset >= $this->bufferLength)) { - return \false; - } - $this->offset = $offset + 1; - return $this->buffer[$offset]; - } - /** - * Read bytes from the current or a specific offset position and set the internal pointer to the next byte. - * - * If the position is invalid the method will return false. - * - * If the $position parameter is set to null the value of $this->offset will be used. - * - * @param int $length - * @param int|null $position - * @return string|false - */ - public function readBytes($length, $position = null) - { - $length = (int) $length; - if ($position !== null) { - // check if needed bytes are available in the current buffer - if (!($position >= $this->position && $position < $this->position + $this->bufferLength)) { - $this->reset($position, $length); - $offset = $this->offset; - } else { - $offset = $position - $this->position; - } - } else { - $offset = $this->offset; - } - if ($offset + $length > $this->bufferLength && (!$this->increaseLength($length) || $offset + $length > $this->bufferLength)) { - return \false; - } - $bytes = \substr($this->buffer, $offset, $length); - $this->offset = $offset + $length; - return $bytes; - } - /** - * Read a line from the current position. - * - * @param int $length - * @return string|bool - */ - public function readLine($length = 1024) - { - if ($this->ensureContent() === \false) { - return \false; - } - $line = ''; - while ($this->ensureContent()) { - $char = $this->readByte(); - if ($char === "\n") { - break; - } - if ($char === "\r") { - if ($this->getByte() === "\n") { - $this->addOffset(1); - } - break; - } - $line .= $char; - if (\strlen($line) >= $length) { - break; - } - } - return $line; - } - /** - * Set the offset position in the current buffer. - * - * @param int $offset - */ - public function setOffset($offset) - { - if ($offset > $this->bufferLength || $offset < 0) { - throw new \OutOfRangeException(\sprintf('Offset (%s) out of range (length: %s)', $offset, $this->bufferLength)); - } - $this->offset = (int) $offset; - } - /** - * Returns the current offset in the current buffer. - * - * @return int - */ - public function getOffset() - { - return $this->offset; - } - /** - * Add an offset to the current offset. - * - * @param int $offset - */ - public function addOffset($offset) - { - $this->setOffset($this->offset + $offset); - } - /** - * Make sure that there is at least one character beyond the current offset in the buffer. - * - * @return bool - */ - public function ensureContent() - { - while ($this->offset >= $this->bufferLength) { - if (!$this->increaseLength()) { - return \false; - } - } - return \true; - } - /** - * Returns the stream. - * - * @return resource - */ - public function getStream() - { - return $this->stream; - } - /** - * Gets the total available length. - * - * @return int - */ - public function getTotalLength() - { - if ($this->totalLength === null) { - $stat = \fstat($this->stream); - $this->totalLength = $stat['size']; - } - return $this->totalLength; - } - /** - * Resets the buffer to a position and re-read the buffer with the given length. - * - * If the $pos parameter is negative the start buffer position will be the $pos'th position from - * the end of the file. - * - * If the $pos parameter is negative and the absolute value is bigger then the totalLength of - * the file $pos will set to zero. - * - * @param int|null $pos Start position of the new buffer - * @param int $length Length of the new buffer. Mustn't be negative - */ - public function reset($pos = 0, $length = 200) - { - if ($pos === null) { - $pos = $this->position + $this->offset; - } elseif ($pos < 0) { - $pos = \max(0, $this->getTotalLength() + $pos); - } - \fseek($this->stream, $pos); - $this->position = $pos; - $this->buffer = $length > 0 ? \fread($this->stream, $length) : ''; - $this->bufferLength = \strlen($this->buffer); - $this->offset = 0; - // If a stream wrapper is in use it is possible that - // length values > 8096 will be ignored, so use the - // increaseLength()-method to correct that behavior - if ($this->bufferLength < $length && $this->increaseLength($length - $this->bufferLength)) { - // increaseLength parameter is $minLength, so cut to have only the required bytes in the buffer - $this->buffer = \substr($this->buffer, 0, $length); - $this->bufferLength = \strlen($this->buffer); - } - } - /** - * Ensures bytes in the buffer with a specific length and location in the file. - * - * @param int $pos - * @param int $length - * @see reset() - */ - public function ensure($pos, $length) - { - if ($pos >= $this->position && $pos < $this->position + $this->bufferLength && $this->position + $this->bufferLength >= $pos + $length) { - $this->offset = $pos - $this->position; - } else { - $this->reset($pos, $length); - } - } - /** - * Forcefully read more data into the buffer. - * - * @param int $minLength - * @return bool Returns false if the stream reaches the end - */ - public function increaseLength($minLength = 100) - { - $length = \max($minLength, 100); - if (\feof($this->stream) || $this->getTotalLength() === $this->position + $this->bufferLength) { - return \false; - } - $newLength = $this->bufferLength + $length; - do { - $this->buffer .= \fread($this->stream, $newLength - $this->bufferLength); - $this->bufferLength = \strlen($this->buffer); - } while ($this->bufferLength !== $newLength && !\feof($this->stream)); - return \true; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Tokenizer.php b/dependencies/setasign/fpdi/src/PdfParser/Tokenizer.php deleted file mode 100644 index 5d437b8..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Tokenizer.php +++ /dev/null @@ -1,126 +0,0 @@ -streamReader = $streamReader; - } - /** - * Get the stream reader instance. - * - * @return StreamReader - */ - public function getStreamReader() - { - return $this->streamReader; - } - /** - * Clear the token stack. - */ - public function clearStack() - { - $this->stack = []; - } - /** - * Push a token onto the stack. - * - * @param string $token - */ - public function pushStack($token) - { - $this->stack[] = $token; - } - /** - * Get next token. - * - * @return bool|string - */ - public function getNextToken() - { - $token = \array_pop($this->stack); - if ($token !== null) { - return $token; - } - if (($byte = $this->streamReader->readByte()) === \false) { - return \false; - } - if (\in_array($byte, [" ", "\n", "\r", "\f", "\t", "\x00"], \true)) { - if ($this->leapWhiteSpaces() === \false) { - return \false; - } - $byte = $this->streamReader->readByte(); - } - switch ($byte) { - case '/': - case '[': - case ']': - case '(': - case ')': - case '{': - case '}': - case '<': - case '>': - return $byte; - case '%': - $this->streamReader->readLine(); - return $this->getNextToken(); - } - /* This way is faster than checking single bytes. - */ - $bufferOffset = $this->streamReader->getOffset(); - do { - $lastBuffer = $this->streamReader->getBuffer(\false); - $pos = \strcspn($lastBuffer, "\x00\t\n\f\r ()<>[]{}/%", $bufferOffset); - } while ($lastBuffer !== \false && ($bufferOffset + $pos === \strlen($lastBuffer) && $this->streamReader->increaseLength())); - $result = \substr($lastBuffer, $bufferOffset - 1, $pos + 1); - $this->streamReader->setOffset($bufferOffset + $pos); - return $result; - } - /** - * Leap white spaces. - * - * @return boolean - */ - public function leapWhiteSpaces() - { - do { - if (!$this->streamReader->ensureContent()) { - return \false; - } - $buffer = $this->streamReader->getBuffer(\false); - $matches = \strspn($buffer, " \n\f\r\t\x00", $this->streamReader->getOffset()); - if ($matches > 0) { - $this->streamReader->addOffset($matches); - } - } while ($this->streamReader->getOffset() >= $this->streamReader->getBufferLength()); - return \true; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfArray.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfArray.php deleted file mode 100644 index 7b0179a..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfArray.php +++ /dev/null @@ -1,71 +0,0 @@ -getNextToken()) !== ']') { - if ($token === \false || ($value = $parser->readValue($token)) === \false) { - return \false; - } - $result[] = $value; - } - $v = new self(); - $v->value = $result; - return $v; - } - /** - * Helper method to create an instance. - * - * @param PdfType[] $values - * @return self - */ - public static function create(array $values = []) - { - $v = new self(); - $v->value = $values; - return $v; - } - /** - * Ensures that the passed array is a PdfArray instance with a (optional) specific size. - * - * @param mixed $array - * @param null|int $size - * @return self - * @throws PdfTypeException - */ - public static function ensure($array, $size = null) - { - $result = PdfType::ensureType(self::class, $array, 'Array value expected.'); - if ($size !== null && \count($array->value) !== $size) { - throw new PdfTypeException(\sprintf('Array with %s entries expected.', $size), PdfTypeException::INVALID_DATA_SIZE); - } - return $result; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php deleted file mode 100644 index 43c0459..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php +++ /dev/null @@ -1,40 +0,0 @@ -value = (bool) $value; - return $v; - } - /** - * Ensures that the passed value is a PdfBoolean instance. - * - * @param mixed $value - * @return self - * @throws PdfTypeException - */ - public static function ensure($value) - { - return PdfType::ensureType(self::class, $value, 'Boolean value expected.'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php deleted file mode 100644 index bae3ddf..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php +++ /dev/null @@ -1,112 +0,0 @@ -getNextToken(); - if ($token === '>' && $streamReader->getByte() === '>') { - $streamReader->addOffset(1); - break; - } - $key = $parser->readValue($token); - if ($key === \false) { - return \false; - } - // ensure the first value to be a Name object - if (!$key instanceof PdfName) { - $lastToken = null; - // ignore all other entries and search for the closing brackets - while (($token = $tokenizer->getNextToken()) !== '>' && $token !== \false && $lastToken !== '>') { - $lastToken = $token; - } - if ($token === \false) { - return \false; - } - break; - } - $value = $parser->readValue(); - if ($value === \false) { - return \false; - } - if ($value instanceof PdfNull) { - continue; - } - // catch missing value - if ($value instanceof PdfToken && $value->value === '>' && $streamReader->getByte() === '>') { - $streamReader->addOffset(1); - break; - } - $entries[$key->value] = $value; - } - $v = new self(); - $v->value = $entries; - return $v; - } - /** - * Helper method to create an instance. - * - * @param PdfType[] $entries The keys are the name entries of the dictionary. - * @return self - */ - public static function create(array $entries = []) - { - $v = new self(); - $v->value = $entries; - return $v; - } - /** - * Get a value by its key from a dictionary or a default value. - * - * @param mixed $dictionary - * @param string $key - * @param PdfType|null $default - * @return PdfNull|PdfType - * @throws PdfTypeException - */ - public static function get($dictionary, $key, PdfType $default = null) - { - $dictionary = self::ensure($dictionary); - if (isset($dictionary->value[$key])) { - return $dictionary->value[$key]; - } - return $default === null ? new PdfNull() : $default; - } - /** - * Ensures that the passed value is a PdfDictionary instance. - * - * @param mixed $dictionary - * @return self - * @throws PdfTypeException - */ - public static function ensure($dictionary) - { - return PdfType::ensureType(self::class, $dictionary, 'Dictionary value expected.'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfHexString.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfHexString.php deleted file mode 100644 index 3e0a735..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfHexString.php +++ /dev/null @@ -1,67 +0,0 @@ -getOffset(); - while (\true) { - $buffer = $streamReader->getBuffer(\false); - $pos = \strpos($buffer, '>', $bufferOffset); - if ($pos === \false) { - if (!$streamReader->increaseLength()) { - return \false; - } - continue; - } - break; - } - $result = \substr($buffer, $bufferOffset, $pos - $bufferOffset); - $streamReader->setOffset($pos + 1); - $v = new self(); - $v->value = $result; - return $v; - } - /** - * Helper method to create an instance. - * - * @param string $string The hex encoded string. - * @return self - */ - public static function create($string) - { - $v = new self(); - $v->value = $string; - return $v; - } - /** - * Ensures that the passed value is a PdfHexString instance. - * - * @param mixed $hexString - * @return self - * @throws PdfTypeException - */ - public static function ensure($hexString) - { - return PdfType::ensureType(self::class, $hexString, 'Hex string value expected.'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php deleted file mode 100644 index cb717f8..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php +++ /dev/null @@ -1,88 +0,0 @@ -readValue(); - if ($value === \false) { - return \false; - } - $nextToken = $tokenizer->getNextToken(); - if ($nextToken === 'stream') { - $value = PdfStream::parse($value, $reader, $parser); - } elseif ($nextToken !== \false) { - $tokenizer->pushStack($nextToken); - } - $v = new self(); - $v->objectNumber = (int) $objectNumber; - $v->generationNumber = (int) $objectGenerationNumber; - $v->value = $value; - return $v; - } - /** - * Helper method to create an instance. - * - * @param int $objectNumber - * @param int $generationNumber - * @param PdfType $value - * @return self - */ - public static function create($objectNumber, $generationNumber, PdfType $value) - { - $v = new self(); - $v->objectNumber = (int) $objectNumber; - $v->generationNumber = (int) $generationNumber; - $v->value = $value; - return $v; - } - /** - * Ensures that the passed value is a PdfIndirectObject instance. - * - * @param mixed $indirectObject - * @return self - * @throws PdfTypeException - */ - public static function ensure($indirectObject) - { - return PdfType::ensureType(self::class, $indirectObject, 'Indirect object expected.'); - } - /** - * The object number. - * - * @var int - */ - public $objectNumber; - /** - * The generation number. - * - * @var int - */ - public $generationNumber; -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php deleted file mode 100644 index 71dfb52..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php +++ /dev/null @@ -1,48 +0,0 @@ -value = (int) $objectNumber; - $v->generationNumber = (int) $generationNumber; - return $v; - } - /** - * Ensures that the passed value is a PdfIndirectObject instance. - * - * @param mixed $value - * @return self - * @throws PdfTypeException - */ - public static function ensure($value) - { - return PdfType::ensureType(self::class, $value, 'Indirect reference value expected.'); - } - /** - * The generation number. - * - * @var int - */ - public $generationNumber; -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfName.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfName.php deleted file mode 100644 index e21fcb7..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfName.php +++ /dev/null @@ -1,74 +0,0 @@ -getByte(), "\x00\t\n\f\r ()<>[]{}/%") === 0) { - $v->value = (string) $tokenizer->getNextToken(); - return $v; - } - $v->value = ''; - return $v; - } - /** - * Unescapes a name string. - * - * @param string $value - * @return string - */ - public static function unescape($value) - { - if (\strpos($value, '#') === \false) { - return $value; - } - return \preg_replace_callback('/#([a-fA-F\\d]{2})/', function ($matches) { - return \chr(\hexdec($matches[1])); - }, $value); - } - /** - * Helper method to create an instance. - * - * @param string $string - * @return self - */ - public static function create($string) - { - $v = new self(); - $v->value = $string; - return $v; - } - /** - * Ensures that the passed value is a PdfName instance. - * - * @param mixed $name - * @return self - * @throws PdfTypeException - */ - public static function ensure($name) - { - return PdfType::ensureType(self::class, $name, 'Name value expected.'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfNull.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfNull.php deleted file mode 100644 index 4e252cf..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfNull.php +++ /dev/null @@ -1,18 +0,0 @@ -value = $value + 0; - return $v; - } - /** - * Ensures that the passed value is a PdfNumeric instance. - * - * @param mixed $value - * @return self - * @throws PdfTypeException - */ - public static function ensure($value) - { - return PdfType::ensureType(self::class, $value, 'Numeric value expected.'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfStream.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfStream.php deleted file mode 100644 index f6f7be1..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfStream.php +++ /dev/null @@ -1,284 +0,0 @@ -value = $dictionary; - $v->reader = $reader; - $v->parser = $parser; - $offset = $reader->getOffset(); - // Find the first "newline" - while (($firstByte = $reader->getByte($offset)) !== \false) { - $offset++; - if ($firstByte === "\n" || $firstByte === "\r") { - break; - } - } - if ($firstByte === \false) { - throw new PdfTypeException('Unable to parse stream data. No newline after the stream keyword found.', PdfTypeException::NO_NEWLINE_AFTER_STREAM_KEYWORD); - } - $sndByte = $reader->getByte($offset); - if ($sndByte === "\n" && $firstByte !== "\n") { - $offset++; - } - $reader->setOffset($offset); - // let's only save the byte-offset and read the stream only when needed - $v->stream = $reader->getPosition() + $reader->getOffset(); - return $v; - } - /** - * Helper method to create an instance. - * - * @param PdfDictionary $dictionary - * @param string $stream - * @return self - */ - public static function create(PdfDictionary $dictionary, $stream) - { - $v = new self(); - $v->value = $dictionary; - $v->stream = (string) $stream; - return $v; - } - /** - * Ensures that the passed value is a PdfStream instance. - * - * @param mixed $stream - * @return self - * @throws PdfTypeException - */ - public static function ensure($stream) - { - return PdfType::ensureType(self::class, $stream, 'Stream value expected.'); - } - /** - * The stream or its byte-offset position. - * - * @var int|string - */ - protected $stream; - /** - * The stream reader instance. - * - * @var StreamReader|null - */ - protected $reader; - /** - * The PDF parser instance. - * - * @var PdfParser - */ - protected $parser; - /** - * Get the stream data. - * - * @param bool $cache Whether cache the stream data or not. - * @return bool|string - * @throws PdfTypeException - * @throws CrossReferenceException - * @throws PdfParserException - */ - public function getStream($cache = \false) - { - if (\is_int($this->stream)) { - $length = PdfDictionary::get($this->value, 'Length'); - if ($this->parser !== null) { - $length = PdfType::resolve($length, $this->parser); - } - if (!$length instanceof PdfNumeric || $length->value === 0) { - $this->reader->reset($this->stream, 100000); - $buffer = $this->extractStream(); - } else { - $this->reader->reset($this->stream, $length->value); - $buffer = $this->reader->getBuffer(\false); - if ($this->parser !== null) { - $this->reader->reset($this->stream + \strlen($buffer)); - $this->parser->getTokenizer()->clearStack(); - $token = $this->parser->readValue(); - if ($token === \false || !$token instanceof PdfToken || $token->value !== 'endstream') { - $this->reader->reset($this->stream, 100000); - $buffer = $this->extractStream(); - $this->reader->reset($this->stream + \strlen($buffer)); - } - } - } - if ($cache === \false) { - return $buffer; - } - $this->stream = $buffer; - $this->reader = null; - } - return $this->stream; - } - /** - * Extract the stream "manually". - * - * @return string - * @throws PdfTypeException - */ - protected function extractStream() - { - while (\true) { - $buffer = $this->reader->getBuffer(\false); - $length = \strpos($buffer, 'endstream'); - if ($length === \false) { - if (!$this->reader->increaseLength(100000)) { - throw new PdfTypeException('Cannot extract stream.'); - } - continue; - } - break; - } - $buffer = \substr($buffer, 0, $length); - $lastByte = \substr($buffer, -1); - /* Check for EOL marker = - * CARRIAGE RETURN (\r) and a LINE FEED (\n) or just a LINE FEED (\n}, - * and not by a CARRIAGE RETURN (\r) alone - */ - if ($lastByte === "\n") { - $buffer = \substr($buffer, 0, -1); - $lastByte = \substr($buffer, -1); - if ($lastByte === "\r") { - $buffer = \substr($buffer, 0, -1); - } - } - // There are streams in the wild, which have only white signs in them but need to be parsed manually due - // to a problem encountered before (e.g. Length === 0). We should set them to empty streams to avoid problems - // in further processing (e.g. applying of filters). - if (\trim($buffer) === '') { - $buffer = ''; - } - return $buffer; - } - /** - * Get all filters defined for this stream. - * - * @return PdfType[] - * @throws PdfTypeException - */ - public function getFilters() - { - $filters = PdfDictionary::get($this->value, 'Filter'); - if ($filters instanceof PdfNull) { - return []; - } - if ($filters instanceof PdfArray) { - $filters = $filters->value; - } else { - $filters = [$filters]; - } - return $filters; - } - /** - * Get the unfiltered stream data. - * - * @return string - * @throws FilterException - * @throws PdfParserException - */ - public function getUnfilteredStream() - { - $stream = $this->getStream(); - $filters = $this->getFilters(); - if ($filters === []) { - return $stream; - } - $decodeParams = PdfDictionary::get($this->value, 'DecodeParms'); - if ($decodeParams instanceof PdfArray) { - $decodeParams = $decodeParams->value; - } else { - $decodeParams = [$decodeParams]; - } - foreach ($filters as $key => $filter) { - if (!$filter instanceof PdfName) { - continue; - } - $decodeParam = null; - if (isset($decodeParams[$key])) { - $decodeParam = $decodeParams[$key] instanceof PdfDictionary ? $decodeParams[$key] : null; - } - switch ($filter->value) { - case 'FlateDecode': - case 'Fl': - case 'LZWDecode': - case 'LZW': - if (\strpos($filter->value, 'LZW') === 0) { - $filterObject = new Lzw(); - } else { - $filterObject = new Flate(); - } - $stream = $filterObject->decode($stream); - if ($decodeParam instanceof PdfDictionary) { - $predictor = PdfDictionary::get($decodeParam, 'Predictor', PdfNumeric::create(1)); - if ($predictor->value !== 1) { - if (!\class_exists(Predictor::class)) { - throw new PdfParserException('This PDF document makes use of features which are only implemented in the ' . 'commercial "FPDI PDF-Parser" add-on (see https://www.setasign.com/fpdi-pdf-' . 'parser).', PdfParserException::IMPLEMENTED_IN_FPDI_PDF_PARSER); - } - $colors = PdfDictionary::get($decodeParam, 'Colors', PdfNumeric::create(1)); - $bitsPerComponent = PdfDictionary::get($decodeParam, 'BitsPerComponent', PdfNumeric::create(8)); - $columns = PdfDictionary::get($decodeParam, 'Columns', PdfNumeric::create(1)); - $filterObject = new Predictor($predictor->value, $colors->value, $bitsPerComponent->value, $columns->value); - $stream = $filterObject->decode($stream); - } - } - break; - case 'ASCII85Decode': - case 'A85': - $filterObject = new Ascii85(); - $stream = $filterObject->decode($stream); - break; - case 'ASCIIHexDecode': - case 'AHx': - $filterObject = new AsciiHex(); - $stream = $filterObject->decode($stream); - break; - case 'Crypt': - if (!$decodeParam instanceof PdfDictionary) { - break; - } - // Filter is "Identity" - $name = PdfDictionary::get($decodeParam, 'Name'); - if (!$name instanceof PdfName || $name->value !== 'Identity') { - break; - } - throw new FilterException('Support for Crypt filters other than "Identity" is not implemented.', FilterException::UNSUPPORTED_FILTER); - default: - throw new FilterException(\sprintf('Unsupported filter "%s".', $filter->value), FilterException::UNSUPPORTED_FILTER); - } - } - return $stream; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfString.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfString.php deleted file mode 100644 index db5d0d4..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfString.php +++ /dev/null @@ -1,158 +0,0 @@ -getOffset(); - $openBrackets = 1; - do { - $buffer = $streamReader->getBuffer(\false); - for ($length = \strlen($buffer); $openBrackets !== 0 && $pos < $length; $pos++) { - switch ($buffer[$pos]) { - case '(': - $openBrackets++; - break; - case ')': - $openBrackets--; - break; - case '\\': - $pos++; - } - } - } while ($openBrackets !== 0 && $streamReader->increaseLength()); - $result = \substr($buffer, $startPos, $openBrackets + $pos - $startPos - 1); - $streamReader->setOffset($pos); - $v = new self(); - $v->value = $result; - return $v; - } - /** - * Helper method to create an instance. - * - * @param string $value The string needs to be escaped accordingly. - * @return self - */ - public static function create($value) - { - $v = new self(); - $v->value = $value; - return $v; - } - /** - * Ensures that the passed value is a PdfString instance. - * - * @param mixed $string - * @return self - * @throws PdfTypeException - */ - public static function ensure($string) - { - return PdfType::ensureType(self::class, $string, 'String value expected.'); - } - /** - * Escapes sequences in a string according to the PDF specification. - * - * @param string $s - * @return string - */ - public static function escape($s) - { - // Still a bit faster, than direct replacing - if (\strpos($s, '\\') !== \false || \strpos($s, ')') !== \false || \strpos($s, '(') !== \false || \strpos($s, "\r") !== \false || \strpos($s, "\n") !== \false || \strpos($s, "\t") !== \false || \strpos($s, "\x08") !== \false || \strpos($s, "\f") !== \false) { - // is faster than strtr(...) - return \str_replace(['\\', ')', '(', "\r", "\n", "\t", "\x08", "\f"], ['\\\\', '\\)', '\\(', '\\r', '\\n', '\\t', '\\b', '\\f'], $s); - } - return $s; - } - /** - * Unescapes escaped sequences in a PDF string according to the PDF specification. - * - * @param string $s - * @return string - */ - public static function unescape($s) - { - $out = ''; - /** @noinspection ForeachInvariantsInspection */ - for ($count = 0, $n = \strlen($s); $count < $n; $count++) { - if ($s[$count] !== '\\') { - $out .= $s[$count]; - } else { - // A backslash at the end of the string - ignore it - if ($count === $n - 1) { - break; - } - switch ($s[++$count]) { - case ')': - case '(': - case '\\': - $out .= $s[$count]; - break; - case 'f': - $out .= "\f"; - break; - case 'b': - $out .= "\x08"; - break; - case 't': - $out .= "\t"; - break; - case 'r': - $out .= "\r"; - break; - case 'n': - $out .= "\n"; - break; - case "\r": - if ($count !== $n - 1 && $s[$count + 1] === "\n") { - $count++; - } - break; - case "\n": - break; - default: - $actualChar = \ord($s[$count]); - // ascii 48 = number 0 - // ascii 57 = number 9 - if ($actualChar >= 48 && $actualChar <= 57) { - $oct = '' . $s[$count]; - /** @noinspection NotOptimalIfConditionsInspection */ - if ($count + 1 < $n && \ord($s[$count + 1]) >= 48 && \ord($s[$count + 1]) <= 57) { - $count++; - $oct .= $s[$count]; - /** @noinspection NotOptimalIfConditionsInspection */ - if ($count + 1 < $n && \ord($s[$count + 1]) >= 48 && \ord($s[$count + 1]) <= 57) { - $oct .= $s[++$count]; - } - } - $out .= \chr(\octdec($oct)); - } else { - // If the character is not one of those defined, the backslash is ignored - $out .= $s[$count]; - } - } - } - } - return $out; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfToken.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfToken.php deleted file mode 100644 index 8c8500a..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfToken.php +++ /dev/null @@ -1,40 +0,0 @@ -value = $token; - return $v; - } - /** - * Ensures that the passed value is a PdfToken instance. - * - * @param mixed $token - * @return self - * @throws PdfTypeException - */ - public static function ensure($token) - { - return PdfType::ensureType(self::class, $token, 'Token value expected.'); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfType.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfType.php deleted file mode 100644 index 8dee352..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfType.php +++ /dev/null @@ -1,67 +0,0 @@ -value, $parser, $stopAtIndirectObject); - } - if ($value instanceof PdfIndirectObjectReference) { - return self::resolve($parser->getIndirectObject($value->value), $parser, $stopAtIndirectObject); - } - return $value; - } - /** - * Ensure that a value is an instance of a specific PDF type. - * - * @param string $type - * @param PdfType $value - * @param string $errorMessage - * @return mixed - * @throws PdfTypeException - */ - protected static function ensureType($type, $value, $errorMessage) - { - if (!$value instanceof $type) { - throw new PdfTypeException($errorMessage, PdfTypeException::INVALID_DATA_TYPE); - } - return $value; - } - /** - * The value of the PDF type. - * - * @var mixed - */ - public $value; -} diff --git a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php b/dependencies/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php deleted file mode 100644 index 7b0d55c..0000000 --- a/dependencies/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php +++ /dev/null @@ -1,22 +0,0 @@ -value; - $ax = PdfNumeric::ensure(PdfType::resolve($array[0], $parser))->value; - $ay = PdfNumeric::ensure(PdfType::resolve($array[1], $parser))->value; - $bx = PdfNumeric::ensure(PdfType::resolve($array[2], $parser))->value; - $by = PdfNumeric::ensure(PdfType::resolve($array[3], $parser))->value; - return new self($ax, $ay, $bx, $by); - } - public static function byVectors(Vector $ll, Vector $ur) - { - return new self($ll->getX(), $ll->getY(), $ur->getX(), $ur->getY()); - } - /** - * Rectangle constructor. - * - * @param float|int $ax - * @param float|int $ay - * @param float|int $bx - * @param float|int $by - */ - public function __construct($ax, $ay, $bx, $by) - { - $this->llx = \min($ax, $bx); - $this->lly = \min($ay, $by); - $this->urx = \max($ax, $bx); - $this->ury = \max($ay, $by); - } - /** - * Get the width of the rectangle. - * - * @return float|int - */ - public function getWidth() - { - return $this->urx - $this->llx; - } - /** - * Get the height of the rectangle. - * - * @return float|int - */ - public function getHeight() - { - return $this->ury - $this->lly; - } - /** - * Get the lower left abscissa. - * - * @return float|int - */ - public function getLlx() - { - return $this->llx; - } - /** - * Get the lower left ordinate. - * - * @return float|int - */ - public function getLly() - { - return $this->lly; - } - /** - * Get the upper right abscissa. - * - * @return float|int - */ - public function getUrx() - { - return $this->urx; - } - /** - * Get the upper right ordinate. - * - * @return float|int - */ - public function getUry() - { - return $this->ury; - } - /** - * Get the rectangle as an array. - * - * @return array - */ - public function toArray() - { - return [$this->llx, $this->lly, $this->urx, $this->ury]; - } - /** - * Get the rectangle as a PdfArray. - * - * @return PdfArray - */ - public function toPdfArray() - { - $array = new PdfArray(); - $array->value[] = PdfNumeric::create($this->llx); - $array->value[] = PdfNumeric::create($this->lly); - $array->value[] = PdfNumeric::create($this->urx); - $array->value[] = PdfNumeric::create($this->ury); - return $array; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfReader/Page.php b/dependencies/setasign/fpdi/src/PdfReader/Page.php deleted file mode 100644 index 1a3b359..0000000 --- a/dependencies/setasign/fpdi/src/PdfReader/Page.php +++ /dev/null @@ -1,325 +0,0 @@ -pageObject = $page; - $this->parser = $parser; - } - /** - * Get the indirect object of this page. - * - * @return PdfIndirectObject - */ - public function getPageObject() - { - return $this->pageObject; - } - /** - * Get the dictionary of this page. - * - * @return PdfDictionary - * @throws PdfParserException - * @throws PdfTypeException - * @throws CrossReferenceException - */ - public function getPageDictionary() - { - if ($this->pageDictionary === null) { - $this->pageDictionary = PdfDictionary::ensure(PdfType::resolve($this->getPageObject(), $this->parser)); - } - return $this->pageDictionary; - } - /** - * Get a page attribute. - * - * @param string $name - * @param bool $inherited - * @return PdfType|null - * @throws PdfParserException - * @throws PdfTypeException - * @throws CrossReferenceException - */ - public function getAttribute($name, $inherited = \true) - { - $dict = $this->getPageDictionary(); - if (isset($dict->value[$name])) { - return $dict->value[$name]; - } - $inheritedKeys = ['Resources', 'MediaBox', 'CropBox', 'Rotate']; - if ($inherited && \in_array($name, $inheritedKeys, \true)) { - if ($this->inheritedAttributes === null) { - $this->inheritedAttributes = []; - $inheritedKeys = \array_filter($inheritedKeys, function ($key) use($dict) { - return !isset($dict->value[$key]); - }); - if (\count($inheritedKeys) > 0) { - $parentDict = PdfType::resolve(PdfDictionary::get($dict, 'Parent'), $this->parser); - while ($parentDict instanceof PdfDictionary) { - foreach ($inheritedKeys as $index => $key) { - if (isset($parentDict->value[$key])) { - $this->inheritedAttributes[$key] = $parentDict->value[$key]; - unset($inheritedKeys[$index]); - } - } - /** @noinspection NotOptimalIfConditionsInspection */ - if (isset($parentDict->value['Parent']) && \count($inheritedKeys) > 0) { - $parentDict = PdfType::resolve(PdfDictionary::get($parentDict, 'Parent'), $this->parser); - } else { - break; - } - } - } - } - if (isset($this->inheritedAttributes[$name])) { - return $this->inheritedAttributes[$name]; - } - } - return null; - } - /** - * Get the rotation value. - * - * @return int - * @throws PdfParserException - * @throws PdfTypeException - * @throws CrossReferenceException - */ - public function getRotation() - { - $rotation = $this->getAttribute('Rotate'); - if ($rotation === null) { - return 0; - } - $rotation = PdfNumeric::ensure(PdfType::resolve($rotation, $this->parser))->value % 360; - if ($rotation < 0) { - $rotation += 360; - } - return $rotation; - } - /** - * Get a boundary of this page. - * - * @param string $box - * @param bool $fallback - * @return bool|Rectangle - * @throws PdfParserException - * @throws PdfTypeException - * @throws CrossReferenceException - * @see PageBoundaries - */ - public function getBoundary($box = PageBoundaries::CROP_BOX, $fallback = \true) - { - $value = $this->getAttribute($box); - if ($value !== null) { - return Rectangle::byPdfArray($value, $this->parser); - } - if ($fallback === \false) { - return \false; - } - switch ($box) { - case PageBoundaries::BLEED_BOX: - case PageBoundaries::TRIM_BOX: - case PageBoundaries::ART_BOX: - return $this->getBoundary(PageBoundaries::CROP_BOX, \true); - case PageBoundaries::CROP_BOX: - return $this->getBoundary(PageBoundaries::MEDIA_BOX, \true); - } - return \false; - } - /** - * Get the width and height of this page. - * - * @param string $box - * @param bool $fallback - * @return array|bool - * @throws PdfParserException - * @throws PdfTypeException - * @throws CrossReferenceException - */ - public function getWidthAndHeight($box = PageBoundaries::CROP_BOX, $fallback = \true) - { - $boundary = $this->getBoundary($box, $fallback); - if ($boundary === \false) { - return \false; - } - $rotation = $this->getRotation(); - $interchange = $rotation / 90 % 2; - return [$interchange ? $boundary->getHeight() : $boundary->getWidth(), $interchange ? $boundary->getWidth() : $boundary->getHeight()]; - } - /** - * Get the raw content stream. - * - * @return string - * @throws PdfReaderException - * @throws PdfTypeException - * @throws FilterException - * @throws PdfParserException - */ - public function getContentStream() - { - $dict = $this->getPageDictionary(); - $contents = PdfType::resolve(PdfDictionary::get($dict, 'Contents'), $this->parser); - if ($contents instanceof PdfNull) { - return ''; - } - if ($contents instanceof PdfArray) { - $result = []; - foreach ($contents->value as $content) { - $content = PdfType::resolve($content, $this->parser); - if (!$content instanceof PdfStream) { - continue; - } - $result[] = $content->getUnfilteredStream(); - } - return \implode("\n", $result); - } - if ($contents instanceof PdfStream) { - return $contents->getUnfilteredStream(); - } - throw new PdfReaderException('Array or stream expected.', PdfReaderException::UNEXPECTED_DATA_TYPE); - } - /** - * Get information of all external links on this page. - * - * All coordinates are normalized in view to rotation and translation of the boundary-box, so that their - * origin is lower-left. - * - * @return array - * @throws CrossReferenceException - * @throws PdfParserException - * @throws PdfTypeException - */ - public function getExternalLinks($box = PageBoundaries::CROP_BOX) - { - $dict = $this->getPageDictionary(); - $annotations = PdfType::resolve(PdfDictionary::get($dict, 'Annots'), $this->parser); - if (!$annotations instanceof PdfArray) { - return []; - } - $links = []; - foreach ($annotations->value as $entry) { - $annotation = PdfType::resolve($entry, $this->parser); - $value = PdfType::resolve(PdfDictionary::get($annotation, 'Subtype'), $this->parser); - if (!$value instanceof PdfName || $value->value !== 'Link') { - continue; - } - $dest = PdfType::resolve(PdfDictionary::get($annotation, 'Dest'), $this->parser); - if (!$dest instanceof PdfNull) { - continue; - } - $action = PdfType::resolve(PdfDictionary::get($annotation, 'A'), $this->parser); - if (!$action instanceof PdfDictionary) { - continue; - } - $actionType = PdfType::resolve(PdfDictionary::get($action, 'S'), $this->parser); - if (!$actionType instanceof PdfName || $actionType->value !== 'URI') { - continue; - } - $uri = PdfType::resolve(PdfDictionary::get($action, 'URI'), $this->parser); - if ($uri instanceof PdfString) { - $uriValue = PdfString::unescape($uri->value); - } elseif ($uri instanceof PdfHexString) { - $uriValue = \hex2bin($uri->value); - } else { - continue; - } - $rect = PdfType::resolve(PdfDictionary::get($annotation, 'Rect'), $this->parser); - if (!$rect instanceof PdfArray || \count($rect->value) !== 4) { - continue; - } - $rect = Rectangle::byPdfArray($rect, $this->parser); - if ($rect->getWidth() === 0 || $rect->getHeight() === 0) { - continue; - } - $bbox = $this->getBoundary($box); - $rotation = $this->getRotation(); - $gs = new GraphicsState(); - $gs->translate(-$bbox->getLlx(), -$bbox->getLly()); - $gs->rotate($bbox->getLlx(), $bbox->getLly(), -$rotation); - switch ($rotation) { - case 90: - $gs->translate(-$bbox->getWidth(), 0); - break; - case 180: - $gs->translate(-$bbox->getWidth(), -$bbox->getHeight()); - break; - case 270: - $gs->translate(0, -$bbox->getHeight()); - break; - } - $normalizedRect = Rectangle::byVectors($gs->toUserSpace(new Vector($rect->getLlx(), $rect->getLly())), $gs->toUserSpace(new Vector($rect->getUrx(), $rect->getUry()))); - $quadPoints = PdfType::resolve(PdfDictionary::get($annotation, 'QuadPoints'), $this->parser); - $normalizedQuadPoints = []; - if ($quadPoints instanceof PdfArray) { - $quadPointsCount = \count($quadPoints->value); - if ($quadPointsCount % 8 === 0) { - for ($i = 0; $i + 1 < $quadPointsCount; $i += 2) { - $x = PdfNumeric::ensure(PdfType::resolve($quadPoints->value[$i], $this->parser)); - $y = PdfNumeric::ensure(PdfType::resolve($quadPoints->value[$i + 1], $this->parser)); - $v = $gs->toUserSpace(new Vector($x->value, $y->value)); - $normalizedQuadPoints[] = $v->getX(); - $normalizedQuadPoints[] = $v->getY(); - } - } - } - $links[] = ['rect' => $normalizedRect, 'quadPoints' => $normalizedQuadPoints, 'uri' => $uriValue, 'pdfObject' => $annotation]; - } - return $links; - } -} diff --git a/dependencies/setasign/fpdi/src/PdfReader/PageBoundaries.php b/dependencies/setasign/fpdi/src/PdfReader/PageBoundaries.php deleted file mode 100644 index 4c166aa..0000000 --- a/dependencies/setasign/fpdi/src/PdfReader/PageBoundaries.php +++ /dev/null @@ -1,81 +0,0 @@ -parser = $parser; - } - /** - * PdfReader destructor. - */ - public function __destruct() - { - if ($this->parser !== null) { - $this->parser->cleanUp(); - } - } - /** - * Get the pdf parser instance. - * - * @return PdfParser - */ - public function getParser() - { - return $this->parser; - } - /** - * Get the PDF version. - * - * @return string - * @throws PdfParserException - */ - public function getPdfVersion() - { - return \implode('.', $this->parser->getPdfVersion()); - } - /** - * Get the page count. - * - * @return int - * @throws PdfTypeException - * @throws CrossReferenceException - * @throws PdfParserException - */ - public function getPageCount() - { - if ($this->pageCount === null) { - $catalog = $this->parser->getCatalog(); - $pages = PdfType::resolve(PdfDictionary::get($catalog, 'Pages'), $this->parser); - $count = PdfType::resolve(PdfDictionary::get($pages, 'Count'), $this->parser); - $this->pageCount = PdfNumeric::ensure($count)->value; - } - return $this->pageCount; - } - /** - * Get a page instance. - * - * @param int $pageNumber - * @return Page - * @throws PdfTypeException - * @throws CrossReferenceException - * @throws PdfParserException - * @throws \InvalidArgumentException - */ - public function getPage($pageNumber) - { - if (!\is_numeric($pageNumber)) { - throw new \InvalidArgumentException('Page number needs to be a number.'); - } - if ($pageNumber < 1 || $pageNumber > $this->getPageCount()) { - throw new \InvalidArgumentException(\sprintf('Page number "%s" out of available page range (1 - %s)', $pageNumber, $this->getPageCount())); - } - $this->readPages(); - $page = $this->pages[$pageNumber - 1]; - if ($page instanceof PdfIndirectObjectReference) { - $readPages = function ($kids) use(&$readPages) { - $kids = PdfArray::ensure($kids); - /** @noinspection LoopWhichDoesNotLoopInspection */ - foreach ($kids->value as $reference) { - $reference = PdfIndirectObjectReference::ensure($reference); - $object = $this->parser->getIndirectObject($reference->value); - $type = PdfDictionary::get($object->value, 'Type'); - if ($type->value === 'Pages') { - return $readPages(PdfDictionary::get($object->value, 'Kids')); - } - return $object; - } - throw new PdfReaderException('Kids array cannot be empty.', PdfReaderException::KIDS_EMPTY); - }; - $page = $this->parser->getIndirectObject($page->value); - $dict = PdfType::resolve($page, $this->parser); - $type = PdfDictionary::get($dict, 'Type'); - if ($type->value === 'Pages') { - $kids = PdfType::resolve(PdfDictionary::get($dict, 'Kids'), $this->parser); - try { - $page = $this->pages[$pageNumber - 1] = $readPages($kids); - } catch (PdfReaderException $e) { - if ($e->getCode() !== PdfReaderException::KIDS_EMPTY) { - throw $e; - } - // let's reset the pages array and read all page objects - $this->pages = []; - $this->readPages(\true); - // @phpstan-ignore-next-line - $page = $this->pages[$pageNumber - 1]; - } - } else { - $this->pages[$pageNumber - 1] = $page; - } - } - return new Page($page, $this->parser); - } - /** - * Walk the page tree and resolve all indirect objects of all pages. - * - * @param bool $readAll - * @throws CrossReferenceException - * @throws PdfParserException - * @throws PdfTypeException - */ - protected function readPages($readAll = \false) - { - if (\count($this->pages) > 0) { - return; - } - $expectedPageCount = $this->getPageCount(); - $readPages = function ($kids, $count) use(&$readPages, $readAll, $expectedPageCount) { - $kids = PdfArray::ensure($kids); - $isLeaf = $count->value === \count($kids->value); - foreach ($kids->value as $reference) { - $reference = PdfIndirectObjectReference::ensure($reference); - if (!$readAll && $isLeaf) { - $this->pages[] = $reference; - continue; - } - $object = $this->parser->getIndirectObject($reference->value); - $type = PdfDictionary::get($object->value, 'Type'); - if ($type->value === 'Pages') { - $readPages(PdfDictionary::get($object->value, 'Kids'), PdfDictionary::get($object->value, 'Count')); - } else { - $this->pages[] = $object; - } - // stop if all pages are read - faulty documents exists with additional entries with invalid data. - if (\count($this->pages) === $expectedPageCount) { - break; - } - } - }; - $catalog = $this->parser->getCatalog(); - $pages = PdfType::resolve(PdfDictionary::get($catalog, 'Pages'), $this->parser); - $count = PdfType::resolve(PdfDictionary::get($pages, 'Count'), $this->parser); - $kids = PdfType::resolve(PdfDictionary::get($pages, 'Kids'), $this->parser); - $readPages($kids, $count); - } -} diff --git a/dependencies/setasign/fpdi/src/PdfReader/PdfReaderException.php b/dependencies/setasign/fpdi/src/PdfReader/PdfReaderException.php deleted file mode 100644 index 21a641c..0000000 --- a/dependencies/setasign/fpdi/src/PdfReader/PdfReaderException.php +++ /dev/null @@ -1,30 +0,0 @@ -cleanUp(); - } - /** - * Get the next template id. - * - * @return int - */ - protected function getNextTemplateId() - { - return $this->templateId++; - } - /** - * Draws an imported page onto the page or another template. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array - * with the keys "x", "y", "width", "height", "adjustPageSize". - * @param float|int $y The ordinate of upper-left corner. - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @param bool $adjustPageSize - * @return array The size - * @see FpdiTrait::getTemplateSize() - */ - public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = \false) - { - return $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize); - } - /** - * Draws an imported page onto the page. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $pageId The page id - * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array - * with the keys "x", "y", "width", "height", "adjustPageSize". - * @param float|int $y The ordinate of upper-left corner. - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @param bool $adjustPageSize - * @return array The size. - * @see Fpdi::getTemplateSize() - */ - public function useImportedPage($pageId, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = \false) - { - $size = $this->fpdiUseImportedPage($pageId, $x, $y, $width, $height, $adjustPageSize); - if ($this->inxobj) { - $importedPage = $this->importedPages[$pageId]; - $this->xobjects[$this->xobjid]['importedPages'][$importedPage['id']] = $pageId; - } - return $size; - } - /** - * Get the size of an imported page. - * - * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the - * aspect ratio. - * - * @param mixed $tpl The template id - * @param float|int|null $width The width. - * @param float|int|null $height The height. - * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) - */ - public function getTemplateSize($tpl, $width = null, $height = null) - { - return $this->getImportedPageSize($tpl, $width, $height); - } - /** - * @inheritdoc - * @return string - */ - protected function _getxobjectdict() - { - $out = parent::_getxobjectdict(); - foreach ($this->importedPages as $pageData) { - $out .= '/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R '; - } - return $out; - } - /** - * @inheritdoc - * @throws CrossReferenceException - * @throws PdfParserException - */ - protected function _putxobjects() - { - foreach ($this->importedPages as $key => $pageData) { - $this->currentObjectNumber = $this->_newobj(); - $this->importedPages[$key]['objectNumber'] = $this->currentObjectNumber; - $this->currentReaderId = $pageData['readerId']; - $this->writePdfType($pageData['stream']); - $this->_put('endobj'); - } - foreach (\array_keys($this->readers) as $readerId) { - $parser = $this->getPdfReader($readerId)->getParser(); - $this->currentReaderId = $readerId; - while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) { - try { - $object = $parser->getIndirectObject($objectNumber); - } catch (CrossReferenceException $e) { - if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) { - $object = PdfIndirectObject::create($objectNumber, 0, new PdfNull()); - } else { - throw $e; - } - } - $this->writePdfType($object); - } - } - // let's prepare resources for imported pages in templates - foreach ($this->xobjects as $xObjectId => $data) { - if (!isset($data['importedPages'])) { - continue; - } - foreach ($data['importedPages'] as $id => $pageKey) { - $page = $this->importedPages[$pageKey]; - $this->xobjects[$xObjectId]['xobjects'][$id] = ['n' => $page['objectNumber']]; - } - } - parent::_putxobjects(); - $this->currentObjectNumber = null; - } - /** - * Append content to the buffer of TCPDF. - * - * @param string $s - * @param bool $newLine - */ - protected function _put($s, $newLine = \true) - { - if ($newLine) { - $this->setBuffer($s . "\n"); - } else { - $this->setBuffer($s); - } - } - /** - * Begin a new object and return the object number. - * - * @param int|string $objid Object ID (leave empty to get a new ID). - * @return int object number - */ - protected function _newobj($objid = '') - { - $this->_out($this->_getobj($objid)); - return $this->n; - } - /** - * Writes a PdfType object to the resulting buffer. - * - * @param PdfType $value - * @throws PdfTypeException - */ - protected function writePdfType(PdfType $value) - { - if (!$this->encrypted) { - $this->fpdiWritePdfType($value); - return; - } - if ($value instanceof PdfString) { - $string = PdfString::unescape($value->value); - $string = $this->_encrypt_data($this->currentObjectNumber, $string); - $value->value = PdfString::escape($string); - } elseif ($value instanceof PdfHexString) { - $filter = new AsciiHex(); - $string = $filter->decode($value->value); - $string = $this->_encrypt_data($this->currentObjectNumber, $string); - $value->value = $filter->encode($string, \true); - } elseif ($value instanceof PdfStream) { - $stream = $value->getStream(); - $stream = $this->_encrypt_data($this->currentObjectNumber, $stream); - $dictionary = $value->value; - $dictionary->value['Length'] = PdfNumeric::create(\strlen($stream)); - $value = PdfStream::create($dictionary, $stream); - } elseif ($value instanceof PdfIndirectObject) { - /** - * @var PdfIndirectObject $value - */ - $this->currentObjectNumber = $this->objectMap[$this->currentReaderId][$value->objectNumber]; - } - $this->fpdiWritePdfType($value); - } - /** - * This method will add additional data to the last created link/annotation. - * - * It will copy styling properties (supported by TCPDF) of the imported link. - * - * @param array $externalLink - * @param float|int $xPt - * @param float|int $scaleX - * @param float|int $yPt - * @param float|int $newHeightPt - * @param float|int $scaleY - * @param array $importedPage - * @return void - */ - protected function adjustLastLink($externalLink, $xPt, $scaleX, $yPt, $newHeightPt, $scaleY, $importedPage) - { - $parser = $this->getPdfReader($importedPage['readerId'])->getParser(); - if ($this->inxobj) { - // store parameters for later use on template - $lastAnnotationKey = \count($this->xobjects[$this->xobjid]['annotations']) - 1; - $lastAnnotationOpt =& $this->xobjects[$this->xobjid]['annotations'][$lastAnnotationKey]['opt']; - } else { - $lastAnnotationKey = \count($this->PageAnnots[$this->page]) - 1; - $lastAnnotationOpt =& $this->PageAnnots[$this->page][$lastAnnotationKey]['opt']; - } - // ensure we have a default value - otherwise TCPDF will set it to 4 throughout - $lastAnnotationOpt['f'] = 0; - $values = $externalLink['pdfObject']->value; - unset($values['P'], $values['NM'], $values['AP'], $values['AS'], $values['Type'], $values['Subtype'], $values['Rect'], $values['A'], $values['QuadPoints'], $values['Rotate'], $values['M'], $values['StructParent']); - foreach ($values as $key => $value) { - try { - switch ($key) { - case 'BS': - $value = PdfDictionary::ensure($value); - $bs = []; - if (isset($value->value['W'])) { - $bs['w'] = PdfNumeric::ensure(PdfType::resolve($value->value['W'], $parser))->value; - } - if (isset($value->value['S'])) { - $bs['s'] = PdfName::ensure(PdfType::resolve($value->value['S'], $parser))->value; - } - if (isset($value->value['D'])) { - $d = []; - foreach (PdfArray::ensure(PdfType::resolve($value->value['D'], $parser))->value as $item) { - $d[] = PdfNumeric::ensure(PdfType::resolve($item, $parser))->value; - } - $bs['d'] = $d; - } - $lastAnnotationOpt['bs'] = $bs; - break; - case 'Border': - $borderArray = PdfArray::ensure(PdfType::resolve($value, $parser))->value; - if (\count($borderArray) < 3) { - continue 2; - } - $border = [PdfNumeric::ensure(PdfType::resolve($borderArray[0], $parser))->value, PdfNumeric::ensure(PdfType::resolve($borderArray[1], $parser))->value, PdfNumeric::ensure(PdfType::resolve($borderArray[2], $parser))->value]; - if (isset($borderArray[3])) { - $dashArray = []; - foreach (PdfArray::ensure(PdfType::resolve($borderArray[3], $parser))->value as $item) { - $dashArray[] = PdfNumeric::ensure(PdfType::resolve($item, $parser))->value; - } - $border[] = $dashArray; - } - $lastAnnotationOpt['border'] = $border; - break; - case 'C': - $c = []; - $colors = PdfArray::ensure(PdfType::resolve($value, $parser))->value; - $m = \count($colors) === 4 ? 100 : 255; - foreach ($colors as $item) { - $c[] = PdfNumeric::ensure(PdfType::resolve($item, $parser))->value * $m; - } - $lastAnnotationOpt['c'] = $c; - break; - case 'F': - $lastAnnotationOpt['f'] = $value->value; - break; - case 'BE': - // is broken in current TCPDF version: "bc" key is checked but "bs" is used. - break; - } - // let's silence invalid/not supported values - } catch (FpdiException $e) { - continue; - } - } - // QuadPoints are not supported by TCPDF - // if (count($externalLink['quadPoints']) > 0) { - // $quadPoints = []; - // for ($i = 0, $n = count($externalLink['quadPoints']); $i < $n; $i += 2) { - // $quadPoints[] = $xPt + $externalLink['quadPoints'][$i] * $scaleX; - // $quadPoints[] = $this->hPt - $yPt - $newHeightPt + $externalLink['quadPoints'][$i + 1] * $scaleY; - // } - // - // ????? = $quadPoints; - // } - } -} diff --git a/dependencies/setasign/fpdi/src/TcpdfFpdi.php b/dependencies/setasign/fpdi/src/TcpdfFpdi.php deleted file mode 100644 index 8b80112..0000000 --- a/dependencies/setasign/fpdi/src/TcpdfFpdi.php +++ /dev/null @@ -1,22 +0,0 @@ -nameserver = $nameserver; - $this->domain = $this->sanitizeDomainName($domain); - } - public function useNameserver(string $nameserver) - { - $this->nameserver = $nameserver; - return $this; - } - public function getDomain() : string - { - return $this->domain; - } - public function getNameserver() : string - { - return $this->nameserver; - } - public function getRecords(...$types) : string - { - $types = $this->determineTypes($types); - $types = \count($types) ? $types : $this->recordTypes; - $dnsRecords = \array_map([$this, 'getRecordsOfType'], $types); - return \implode('', \array_filter($dnsRecords)); - } - /** - * @throws InvalidArgument - */ - protected function determineTypes(array $types) : array - { - $types = \is_array($types[0] ?? null) ? $types[0] : $types; - $types = \array_map('strtoupper', $types); - if ($invalidTypes = \array_diff($types, $this->recordTypes)) { - throw InvalidArgument::filterIsNotAValidRecordType(\reset($invalidTypes), $this->recordTypes); - } - return $types; - } - protected function sanitizeDomainName(string $domain) : string - { - $domain = \str_replace(['http://', 'https://'], '', $domain); - $domain = \strtok($domain, '/'); - return \strtolower($domain); - } - /** - * @throws CouldNotFetchDns - */ - protected function getRecordsOfType(string $type) : string - { - $nameserverPart = $this->getSpecificNameserverPart(); - $command = \array_filter(['dig', '+nocmd', $nameserverPart, $this->domain, $type, '+multiline', '+noall', '+answer', '+noidnout']); - $process = new Process($command); - $process->run(); - if (!$process->isSuccessful()) { - throw CouldNotFetchDns::digReturnedWithError(\trim($process->getErrorOutput())); - } - return $process->getOutput(); - } - protected function getSpecificNameserverPart() : ?string - { - if ($this->nameserver === '') { - return null; - } - return '@' . $this->nameserver; - } -} diff --git a/dependencies/spatie/dns/src/Exceptions/CouldNotFetchDns.php b/dependencies/spatie/dns/src/Exceptions/CouldNotFetchDns.php deleted file mode 100644 index 2a234e2..0000000 --- a/dependencies/spatie/dns/src/Exceptions/CouldNotFetchDns.php +++ /dev/null @@ -1,11 +0,0 @@ -getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED); - foreach ($methods as $method) { - $method->setAccessible(\true); - static::macro($method->name, $method->invoke($mixin)); - } - } - public static function hasMacro(string $name) : bool - { - return isset(static::$macros[$name]); - } - public static function __callStatic($method, $parameters) - { - if (!static::hasMacro($method)) { - throw new BadMethodCallException("Method {$method} does not exist."); - } - $macro = static::$macros[$method]; - if ($macro instanceof Closure) { - return \call_user_func_array(Closure::bind($macro, null, static::class), $parameters); - } - return \call_user_func_array($macro, $parameters); - } - public function __call($method, $parameters) - { - if (!static::hasMacro($method)) { - throw new BadMethodCallException("Method {$method} does not exist."); - } - $macro = static::$macros[$method]; - if ($macro instanceof Closure) { - return \call_user_func_array($macro->bindTo($this, static::class), $parameters); - } - return \call_user_func_array($macro, $parameters); - } -} diff --git a/dependencies/spatie/ssl-certificate/src/Downloader.php b/dependencies/spatie/ssl-certificate/src/Downloader.php deleted file mode 100644 index ee8bd5b..0000000 --- a/dependencies/spatie/ssl-certificate/src/Downloader.php +++ /dev/null @@ -1,132 +0,0 @@ -port = $port; - return $this; - } - public function usingSni(bool $sni) - { - $this->enableSni = $sni; - return $this; - } - public function withSocketContextOptions(array $socketContextOptions) - { - $this->socketContextOptions = $socketContextOptions; - return $this; - } - public function withFullChain(bool $fullChain) - { - $this->capturePeerChain = $fullChain; - return $this; - } - public function withVerifyPeer(bool $verifyPeer) - { - $this->verifyPeer = $verifyPeer; - return $this; - } - public function withVerifyPeerName(bool $verifyPeerName) - { - $this->verifyPeerName = $verifyPeerName; - return $this; - } - public function setTimeout(int $timeOutInSeconds) - { - $this->timeout = $timeOutInSeconds; - return $this; - } - public function setFollowLocation(int $followLocation) - { - $this->followLocation = $followLocation; - return $this; - } - public function fromIpAddress(string $ipAddress) - { - if (!\filter_var($ipAddress, \FILTER_VALIDATE_IP)) { - throw InvalidIpAddress::couldNotValidate($ipAddress); - } - $this->ipAddress = $ipAddress; - $this->usingIpAddress = \true; - return $this; - } - public function getCertificates(string $hostName) : array - { - $response = $this->fetchCertificates($hostName); - $remoteAddress = $response['remoteAddress']; - $peerCertificate = $response['options']['ssl']['peer_certificate']; - $peerCertificateChain = $response['options']['ssl']['peer_certificate_chain'] ?? []; - $fullCertificateChain = \array_merge([$peerCertificate], $peerCertificateChain); - $certificates = \array_map(function ($certificate) use($remoteAddress) { - $certificateFields = \openssl_x509_parse($certificate); - $fingerprint = \openssl_x509_fingerprint($certificate); - $fingerprintSha256 = \openssl_x509_fingerprint($certificate, 'sha256'); - return new SslCertificate($certificateFields, $fingerprint, $fingerprintSha256, $remoteAddress); - }, $fullCertificateChain); - return \array_unique($certificates); - } - public function forHost(string $hostName) : SslCertificate - { - $hostName = (new Url($hostName))->getHostName(); - $certificates = $this->getCertificates($hostName); - return $certificates[0] ?? \false; - } - public static function downloadCertificateFromUrl(string $url, int $timeout = 30, bool $verifyCertificate = \true) : SslCertificate - { - return (new static())->setTimeout($timeout)->withVerifyPeer($verifyCertificate)->withVerifyPeerName($verifyCertificate)->forHost($url); - } - protected function fetchCertificates(string $hostName) : array - { - $hostName = (new Url($hostName))->getHostName(); - $sslOptions = ['capture_peer_cert' => \true, 'capture_peer_cert_chain' => $this->capturePeerChain, 'SNI_enabled' => $this->enableSni, 'peer_name' => $hostName, 'verify_peer' => $this->verifyPeer, 'verify_peer_name' => $this->verifyPeerName, 'follow_location' => $this->followLocation]; - $streamContext = \stream_context_create(['socket' => $this->socketContextOptions, 'ssl' => $sslOptions]); - $connectTo = $this->usingIpAddress ? $this->ipAddress : $hostName; - $client = @\stream_socket_client("ssl://{$connectTo}:{$this->port}", $errorNumber, $errorDescription, $this->timeout, \STREAM_CLIENT_CONNECT, $streamContext); - if (!empty($errorDescription)) { - throw $this->buildFailureException($connectTo, $errorDescription); - } - if (!$client) { - $clientErrorMessage = $this->usingIpAddress ? "Could not connect to `{$connectTo}` or it does not have a certificate matching `{$hostName}`." : "Could not connect to `{$connectTo}`."; - throw CouldNotDownloadCertificate::unknownError($hostName, $clientErrorMessage); - } - $response = \stream_context_get_params($client); - $response['remoteAddress'] = \stream_socket_get_name($client, \true); - \fclose($client); - return $response; - } - protected function buildFailureException(string $hostName, string $errorDescription) - { - if (\str_contains($errorDescription, 'getaddrinfo failed')) { - return CouldNotDownloadCertificate::hostDoesNotExist($hostName); - } - if (\str_contains($errorDescription, 'error:14090086')) { - return CouldNotDownloadCertificate::noCertificateInstalled($hostName); - } - return CouldNotDownloadCertificate::unknownError($hostName, $errorDescription); - } -} diff --git a/dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate.php b/dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate.php deleted file mode 100644 index 914df95..0000000 --- a/dependencies/spatie/ssl-certificate/src/Exceptions/CouldNotDownloadCertificate.php +++ /dev/null @@ -1,23 +0,0 @@ -rawCertificateFields = $rawCertificateFields; - $this->fingerprint = $fingerprint; - $this->fingerprintSha256 = $fingerprintSha256; - $this->remoteAddress = $remoteAddress; - } - public function getRawCertificateFields() : array - { - return $this->rawCertificateFields; - } - public function getIssuer() : string - { - return $this->rawCertificateFields['issuer']['CN'] ?? ''; - } - public function getDomain() : string - { - if (!\array_key_exists('CN', $this->rawCertificateFields['subject'])) { - return ''; - } - if (\is_string($this->rawCertificateFields['subject']['CN'])) { - return $this->rawCertificateFields['subject']['CN']; - } - if (\is_array($this->rawCertificateFields['subject']['CN'])) { - return $this->rawCertificateFields['subject']['CN'][0]; - } - return ''; - } - public function getSignatureAlgorithm() : string - { - return $this->rawCertificateFields['signatureTypeSN'] ?? ''; - } - public function getOrganization() : string - { - return $this->rawCertificateFields['issuer']['O'] ?? ''; - } - public function getFingerprint() : string - { - return $this->fingerprint; - } - /** - * @return string - */ - public function getFingerprintSha256() : string - { - return $this->fingerprintSha256; - } - public function getAdditionalDomains() : array - { - $additionalDomains = \explode(', ', $this->rawCertificateFields['extensions']['subjectAltName'] ?? ''); - return \array_map(function (string $domain) { - return \str_replace('DNS:', '', $domain); - }, $additionalDomains); - } - public function validFromDate() : Carbon - { - return Carbon::createFromTimestampUTC($this->rawCertificateFields['validFrom_time_t']); - } - public function expirationDate() : Carbon - { - return Carbon::createFromTimestampUTC($this->rawCertificateFields['validTo_time_t']); - } - public function lifespanInDays() : int - { - return $this->validFromDate()->diffInDays($this->expirationDate()); - } - public function isExpired() : bool - { - return $this->expirationDate()->isPast(); - } - public function isValid(string $url = null) - { - if (!Carbon::now()->between($this->validFromDate(), $this->expirationDate())) { - return \false; - } - if (!empty($url)) { - return $this->appliesToUrl($url ?? $this->getDomain()); - } - return \true; - } - public function isSelfSigned() : bool - { - return $this->getIssuer() === $this->getDomain(); - } - public function usesSha1Hash() : bool - { - $certificateFields = $this->getRawCertificateFields(); - if ($certificateFields['signatureTypeSN'] === 'RSA-SHA1') { - return \true; - } - if ($certificateFields['signatureTypeLN'] === 'sha1WithRSAEncryption') { - return \true; - } - return \false; - } - public function isValidUntil(Carbon $carbon, string $url = null) : bool - { - if ($this->expirationDate()->lte($carbon)) { - return \false; - } - return $this->isValid($url); - } - public function daysUntilExpirationDate() : int - { - $endDate = $this->expirationDate(); - $interval = Carbon::now()->diff($endDate); - return (int) $interval->format('%r%a'); - } - public function getDomains() : array - { - $allDomains = $this->getAdditionalDomains(); - $allDomains[] = $this->getDomain(); - $uniqueDomains = \array_unique($allDomains); - return \array_values(\array_filter($uniqueDomains)); - } - public function appliesToUrl(string $url) : bool - { - if (\filter_var($url, \FILTER_VALIDATE_IP)) { - $host = $url; - } else { - $host = (new Url($url))->getHostName(); - } - $certificateHosts = $this->getDomains(); - foreach ($certificateHosts as $certificateHost) { - $certificateHost = \str_replace('ip address:', '', \strtolower($certificateHost)); - if ($host === $certificateHost) { - return \true; - } - if ($this->wildcardHostCoversHost($certificateHost, $host)) { - return \true; - } - } - return \false; - } - protected function wildcardHostCoversHost(string $wildcardHost, string $host) : bool - { - if ($host === $wildcardHost) { - return \true; - } - if (!starts_with($wildcardHost, '*')) { - return \false; - } - if (\substr_count($wildcardHost, '.') < \substr_count($host, '.')) { - return \false; - } - $wildcardHostWithoutWildcard = \substr($wildcardHost, 1); - $hostWithDottedPrefix = ".{$host}"; - return ends_with($hostWithDottedPrefix, $wildcardHostWithoutWildcard); - } - public function getRawCertificateFieldsJson() : string - { - return \json_encode($this->getRawCertificateFields()); - } - public function getHash() : string - { - return \md5($this->getRawCertificateFieldsJson()); - } - public function getRemoteAddress() : string - { - return $this->remoteAddress; - } - public function __toString() : string - { - return $this->getRawCertificateFieldsJson(); - } - public function containsDomain(string $domain) : bool - { - $certificateHosts = $this->getDomains(); - foreach ($certificateHosts as $certificateHost) { - if ($certificateHost == $domain) { - return \true; - } - if (ends_with($domain, '.' . $certificateHost)) { - return \true; - } - } - return \false; - } - public function isPreCertificate() : bool - { - if (!\array_key_exists('extensions', $this->rawCertificateFields)) { - return \false; - } - if (!\array_key_exists('ct_precert_poison', $this->rawCertificateFields['extensions'])) { - return \false; - } - return \true; - } -} diff --git a/dependencies/spatie/ssl-certificate/src/Url.php b/dependencies/spatie/ssl-certificate/src/Url.php deleted file mode 100644 index 41f98bf..0000000 --- a/dependencies/spatie/ssl-certificate/src/Url.php +++ /dev/null @@ -1,37 +0,0 @@ -url = $url; - $this->parsedUrl = \parse_url($url); - if (!isset($this->parsedUrl['host'])) { - throw InvalidUrl::couldNotDetermineHost($this->url); - } - } - public function getHostName() : string - { - return $this->parsedUrl['host']; - } - public function getPort() : int - { - return $this->parsedUrl['port'] ?? 443; - } -} diff --git a/dependencies/spatie/ssl-certificate/src/helpers.php b/dependencies/spatie/ssl-certificate/src/helpers.php deleted file mode 100644 index 987e9eb..0000000 --- a/dependencies/spatie/ssl-certificate/src/helpers.php +++ /dev/null @@ -1,71 +0,0 @@ -Account Link - * for a Standard or Express account, some parameters are no longer returned. These are marked as Custom Only or Custom and Express - * below. Learn about the differences between accounts. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $business_profile Business information about the account. - * @property null|string $business_type The business type. - * @property null|\Stripe\StripeObject $capabilities - * @property null|bool $charges_enabled Whether the account can create live charges. - * @property null|\Stripe\StripeObject $company - * @property null|\Stripe\StripeObject $controller - * @property null|string $country The account's country. - * @property null|int $created Time at which the account was connected. Measured in seconds since the Unix epoch. - * @property null|string $default_currency Three-letter ISO currency code representing the default currency for the account. This must be a currency that Stripe supports in the account's country. - * @property null|bool $details_submitted Whether account details have been submitted. Standard accounts cannot receive payouts before this is true. - * @property null|string $email An email address associated with the account. It's not used for authentication and Stripe doesn't market to this field without explicit approval from the platform. - * @property null|\Stripe\Collection<\Stripe\BankAccount|\Stripe\Card> $external_accounts External accounts (bank accounts and debit cards) currently attached to this account - * @property null|\Stripe\StripeObject $future_requirements - * @property null|\Stripe\Person $individual

      This is an object representing a person associated with a Stripe account.

      A platform cannot access a Standard or Express account's persons after the account starts onboarding, such as after generating an account link for the account. See the Standard onboarding or Express onboarding documentation for information about platform prefilling and account onboarding steps.

      Related guide: Handling identity verification with the API

      - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|bool $payouts_enabled Whether Stripe can send payouts to this account. - * @property null|\Stripe\StripeObject $requirements - * @property null|\Stripe\StripeObject $settings Options for customizing how the account functions within Stripe. - * @property null|\Stripe\StripeObject $tos_acceptance - * @property null|string $type The Stripe account type. Can be standard, express, or custom. - */ -class Account extends ApiResource -{ - const OBJECT_NAME = 'account'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\NestedResource; - use ApiOperations\Update; - const BUSINESS_TYPE_COMPANY = 'company'; - const BUSINESS_TYPE_GOVERNMENT_ENTITY = 'government_entity'; - const BUSINESS_TYPE_INDIVIDUAL = 'individual'; - const BUSINESS_TYPE_NON_PROFIT = 'non_profit'; - const TYPE_CUSTOM = 'custom'; - const TYPE_EXPRESS = 'express'; - const TYPE_STANDARD = 'standard'; - use ApiOperations\Retrieve { - retrieve as protected _retrieve; - } - public static function getSavedNestedResources() - { - static $savedNestedResources = null; - if (null === $savedNestedResources) { - $savedNestedResources = new Util\Set(['external_account', 'bank_account']); - } - return $savedNestedResources; - } - public function instanceUrl() - { - if (null === $this['id']) { - return '/v1/account'; - } - return parent::instanceUrl(); - } - /** - * @param null|array|string $id the ID of the account to retrieve, or an - * options array containing an `id` key - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account - */ - public static function retrieve($id = null, $opts = null) - { - if (!$opts && \is_string($id) && 'sk_' === \substr($id, 0, 3)) { - $opts = $id; - $id = null; - } - return self::_retrieve($id, $opts); - } - public function serializeParameters($force = \false) - { - $update = parent::serializeParameters($force); - if (isset($this->_values['legal_entity'])) { - $entity = $this['legal_entity']; - if (isset($entity->_values['additional_owners'])) { - $owners = $entity['additional_owners']; - $entityUpdate = isset($update['legal_entity']) ? $update['legal_entity'] : []; - $entityUpdate['additional_owners'] = $this->serializeAdditionalOwners($entity, $owners); - $update['legal_entity'] = $entityUpdate; - } - } - if (isset($this->_values['individual'])) { - $individual = $this['individual']; - if ($individual instanceof Person && !isset($update['individual'])) { - $update['individual'] = $individual->serializeParameters($force); - } - } - return $update; - } - private function serializeAdditionalOwners($legalEntity, $additionalOwners) - { - if (isset($legalEntity->_originalValues['additional_owners'])) { - $originalValue = $legalEntity->_originalValues['additional_owners']; - } else { - $originalValue = []; - } - if ($originalValue && \count($originalValue) > \count($additionalOwners)) { - throw new Exception\InvalidArgumentException('You cannot delete an item from an array, you must instead set a new array'); - } - $updateArr = []; - foreach ($additionalOwners as $i => $v) { - $update = $v instanceof StripeObject ? $v->serializeParameters() : $v; - if ([] !== $update) { - if (!$originalValue || !\array_key_exists($i, $originalValue) || $update !== $legalEntity->serializeParamsValue($originalValue[$i], null, \false, \true)) { - $updateArr[$i] = $update; - } - } - } - return $updateArr; - } - /** - * @param null|array $clientId - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\StripeObject object containing the response from the API - */ - public function deauthorize($clientId = null, $opts = null) - { - $params = ['client_id' => $clientId, 'stripe_user_id' => $this->id]; - return OAuth::deauthorize($params, $opts); - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account the rejected account - */ - public function reject($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/reject'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - const PATH_CAPABILITIES = '/capabilities'; - /** - * @param string $id the ID of the account on which to retrieve the capabilities - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Capability> the list of capabilities - */ - public static function allCapabilities($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_CAPABILITIES, $params, $opts); - } - /** - * @param string $id the ID of the account to which the capability belongs - * @param string $capabilityId the ID of the capability to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Capability - */ - public static function retrieveCapability($id, $capabilityId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); - } - /** - * @param string $id the ID of the account to which the capability belongs - * @param string $capabilityId the ID of the capability to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Capability - */ - public static function updateCapability($id, $capabilityId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); - } - const PATH_EXTERNAL_ACCOUNTS = '/external_accounts'; - /** - * @param string $id the ID of the account on which to retrieve the external accounts - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\BankAccount|\Stripe\Card> the list of external accounts (BankAccount or Card) - */ - public static function allExternalAccounts($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts); - } - /** - * @param string $id the ID of the account on which to create the external account - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public static function createExternalAccount($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts); - } - /** - * @param string $id the ID of the account to which the external account belongs - * @param string $externalAccountId the ID of the external account to delete - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public static function deleteExternalAccount($id, $externalAccountId, $params = null, $opts = null) - { - return self::_deleteNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); - } - /** - * @param string $id the ID of the account to which the external account belongs - * @param string $externalAccountId the ID of the external account to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public static function retrieveExternalAccount($id, $externalAccountId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); - } - /** - * @param string $id the ID of the account to which the external account belongs - * @param string $externalAccountId the ID of the external account to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public static function updateExternalAccount($id, $externalAccountId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); - } - const PATH_LOGIN_LINKS = '/login_links'; - /** - * @param string $id the ID of the account on which to create the login link - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\LoginLink - */ - public static function createLoginLink($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_LOGIN_LINKS, $params, $opts); - } - const PATH_PERSONS = '/persons'; - /** - * @param string $id the ID of the account on which to retrieve the persons - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Person> the list of persons - */ - public static function allPersons($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_PERSONS, $params, $opts); - } - /** - * @param string $id the ID of the account on which to create the person - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public static function createPerson($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_PERSONS, $params, $opts); - } - /** - * @param string $id the ID of the account to which the person belongs - * @param string $personId the ID of the person to delete - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public static function deletePerson($id, $personId, $params = null, $opts = null) - { - return self::_deleteNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); - } - /** - * @param string $id the ID of the account to which the person belongs - * @param string $personId the ID of the person to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public static function retrievePerson($id, $personId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); - } - /** - * @param string $id the ID of the account to which the person belongs - * @param string $personId the ID of the person to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public static function updatePerson($id, $personId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/AccountLink.php b/dependencies/stripe/stripe-php/lib/AccountLink.php deleted file mode 100644 index 65bce2d..0000000 --- a/dependencies/stripe/stripe-php/lib/AccountLink.php +++ /dev/null @@ -1,21 +0,0 @@ -Connect Onboarding - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property int $expires_at The timestamp at which this account link will expire. - * @property string $url The URL for the account link. - */ -class AccountLink extends ApiResource -{ - const OBJECT_NAME = 'account_link'; - use ApiOperations\Create; -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/All.php b/dependencies/stripe/stripe-php/lib/ApiOperations/All.php deleted file mode 100644 index 1bb73f2..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/All.php +++ /dev/null @@ -1,33 +0,0 @@ -json, $opts); - if (!$obj instanceof \WP_Ultimo\Dependencies\Stripe\Collection) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\UnexpectedValueException('Expected type ' . \WP_Ultimo\Dependencies\Stripe\Collection::class . ', got "' . \get_class($obj) . '" instead.'); - } - $obj->setLastResponse($response); - $obj->setFilters($params); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/Create.php b/dependencies/stripe/stripe-php/lib/ApiOperations/Create.php deleted file mode 100644 index 1b33629..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/Create.php +++ /dev/null @@ -1,29 +0,0 @@ -json, $opts); - $obj->setLastResponse($response); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/Delete.php b/dependencies/stripe/stripe-php/lib/ApiOperations/Delete.php deleted file mode 100644 index 1bf80f7..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/Delete.php +++ /dev/null @@ -1,28 +0,0 @@ -instanceUrl(); - list($response, $opts) = $this->_request('delete', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/NestedResource.php b/dependencies/stripe/stripe-php/lib/ApiOperations/NestedResource.php deleted file mode 100644 index 6d688c3..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/NestedResource.php +++ /dev/null @@ -1,121 +0,0 @@ -json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param string $id - * @param string $nestedPath - * @param null|string $nestedId - * - * @return string - */ - protected static function _nestedResourceUrl($id, $nestedPath, $nestedId = null) - { - $url = static::resourceUrl($id) . $nestedPath; - if (null !== $nestedId) { - $url .= "/{$nestedId}"; - } - return $url; - } - /** - * @param string $id - * @param string $nestedPath - * @param null|array $params - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\StripeObject - */ - protected static function _createNestedResource($id, $nestedPath, $params = null, $options = null) - { - $url = static::_nestedResourceUrl($id, $nestedPath); - return self::_nestedResourceOperation('post', $url, $params, $options); - } - /** - * @param string $id - * @param string $nestedPath - * @param null|string $nestedId - * @param null|array $params - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\StripeObject - */ - protected static function _retrieveNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) - { - $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); - return self::_nestedResourceOperation('get', $url, $params, $options); - } - /** - * @param string $id - * @param string $nestedPath - * @param null|string $nestedId - * @param null|array $params - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\StripeObject - */ - protected static function _updateNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) - { - $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); - return self::_nestedResourceOperation('post', $url, $params, $options); - } - /** - * @param string $id - * @param string $nestedPath - * @param null|string $nestedId - * @param null|array $params - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\StripeObject - */ - protected static function _deleteNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) - { - $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); - return self::_nestedResourceOperation('delete', $url, $params, $options); - } - /** - * @param string $id - * @param string $nestedPath - * @param null|array $params - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\StripeObject - */ - protected static function _allNestedResources($id, $nestedPath, $params = null, $options = null) - { - $url = static::_nestedResourceUrl($id, $nestedPath); - return self::_nestedResourceOperation('get', $url, $params, $options); - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/Request.php b/dependencies/stripe/stripe-php/lib/ApiOperations/Request.php deleted file mode 100644 index 35897c6..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/Request.php +++ /dev/null @@ -1,90 +0,0 @@ - 100, " . "'currency' => 'usd', 'source' => 'tok_1234'])\")"; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($message); - } - } - /** - * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) - * @param string $url URL for the request - * @param array $params list of parameters for the request - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return array tuple containing (the JSON response, $options) - */ - protected function _request($method, $url, $params = [], $options = null) - { - $opts = $this->_opts->merge($options); - list($resp, $options) = static::_staticRequest($method, $url, $params, $opts); - $this->setLastResponse($resp); - return [$resp->json, $options]; - } - /** - * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) - * @param string $url URL for the request - * @param callable $readBodyChunk function that will receive chunks of data from a successful request body - * @param array $params list of parameters for the request - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - */ - protected function _requestStream($method, $url, $readBodyChunk, $params = [], $options = null) - { - $opts = $this->_opts->merge($options); - static::_staticStreamingRequest($method, $url, $readBodyChunk, $params, $opts); - } - /** - * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) - * @param string $url URL for the request - * @param array $params list of parameters for the request - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return array tuple containing (the JSON response, $options) - */ - protected static function _staticRequest($method, $url, $params, $options) - { - $opts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($options); - $baseUrl = isset($opts->apiBase) ? $opts->apiBase : static::baseUrl(); - $requestor = new \WP_Ultimo\Dependencies\Stripe\ApiRequestor($opts->apiKey, $baseUrl); - list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers); - $opts->discardNonPersistentHeaders(); - return [$response, $opts]; - } - /** - * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) - * @param string $url URL for the request - * @param callable $readBodyChunk function that will receive chunks of data from a successful request body - * @param array $params list of parameters for the request - * @param null|array|string $options - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - */ - protected static function _staticStreamingRequest($method, $url, $readBodyChunk, $params, $options) - { - $opts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($options); - $baseUrl = isset($opts->apiBase) ? $opts->apiBase : static::baseUrl(); - $requestor = new \WP_Ultimo\Dependencies\Stripe\ApiRequestor($opts->apiKey, $baseUrl); - $requestor->requestStream($method, $url, $readBodyChunk, $params, $opts->headers); - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/Retrieve.php b/dependencies/stripe/stripe-php/lib/ApiOperations/Retrieve.php deleted file mode 100644 index 3279c46..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/Retrieve.php +++ /dev/null @@ -1,29 +0,0 @@ -refresh(); - return $instance; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/Search.php b/dependencies/stripe/stripe-php/lib/ApiOperations/Search.php deleted file mode 100644 index 94d5767..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/Search.php +++ /dev/null @@ -1,33 +0,0 @@ -json, $opts); - if (!$obj instanceof \WP_Ultimo\Dependencies\Stripe\SearchResult) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\UnexpectedValueException('Expected type ' . \WP_Ultimo\Dependencies\Stripe\SearchResult::class . ', got "' . \get_class($obj) . '" instead.'); - } - $obj->setLastResponse($response); - $obj->setFilters($params); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php b/dependencies/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php deleted file mode 100644 index b0c7e4a..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/SingletonRetrieve.php +++ /dev/null @@ -1,28 +0,0 @@ -refresh(); - return $instance; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiOperations/Update.php b/dependencies/stripe/stripe-php/lib/ApiOperations/Update.php deleted file mode 100644 index f4744cb..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiOperations/Update.php +++ /dev/null @@ -1,52 +0,0 @@ -json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return static the saved resource - * - * @deprecated The `save` method is deprecated and will be removed in a - * future major version of the library. Use the static method `update` - * on the resource instead. - */ - public function save($opts = null) - { - $params = $this->serializeParameters(); - if (\count($params) > 0) { - $url = $this->instanceUrl(); - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - } - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiRequestor.php b/dependencies/stripe/stripe-php/lib/ApiRequestor.php deleted file mode 100644 index 7f253ab..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiRequestor.php +++ /dev/null @@ -1,482 +0,0 @@ -_apiKey = $apiKey; - if (!$apiBase) { - $apiBase = Stripe::$apiBase; - } - $this->_apiBase = $apiBase; - } - /** - * Creates a telemetry json blob for use in 'X-Stripe-Client-Telemetry' headers. - * - * @static - * - * @param RequestTelemetry $requestTelemetry - * - * @return string - */ - private static function _telemetryJson($requestTelemetry) - { - $payload = ['last_request_metrics' => ['request_id' => $requestTelemetry->requestId, 'request_duration_ms' => $requestTelemetry->requestDuration]]; - $result = \json_encode($payload); - if (\false !== $result) { - return $result; - } - Stripe::getLogger()->error('Serializing telemetry payload failed!'); - return '{}'; - } - /** - * @static - * - * @param ApiResource|array|bool|mixed $d - * - * @return ApiResource|array|mixed|string - */ - private static function _encodeObjects($d) - { - if ($d instanceof ApiResource) { - return Util\Util::utf8($d->id); - } - if (\true === $d) { - return 'true'; - } - if (\false === $d) { - return 'false'; - } - if (\is_array($d)) { - $res = []; - foreach ($d as $k => $v) { - $res[$k] = self::_encodeObjects($v); - } - return $res; - } - return Util\Util::utf8($d); - } - /** - * @param 'delete'|'get'|'post' $method - * @param string $url - * @param null|array $params - * @param null|array $headers - * - * @throws Exception\ApiErrorException - * - * @return array tuple containing (ApiReponse, API key) - */ - public function request($method, $url, $params = null, $headers = null) - { - $params = $params ?: []; - $headers = $headers ?: []; - list($rbody, $rcode, $rheaders, $myApiKey) = $this->_requestRaw($method, $url, $params, $headers); - $json = $this->_interpretResponse($rbody, $rcode, $rheaders); - $resp = new ApiResponse($rbody, $rcode, $rheaders, $json); - return [$resp, $myApiKey]; - } - /** - * @param 'delete'|'get'|'post' $method - * @param string $url - * @param callable $readBodyChunkCallable - * @param null|array $params - * @param null|array $headers - * - * @throws Exception\ApiErrorException - */ - public function requestStream($method, $url, $readBodyChunkCallable, $params = null, $headers = null) - { - $params = $params ?: []; - $headers = $headers ?: []; - list($rbody, $rcode, $rheaders, $myApiKey) = $this->_requestRawStreaming($method, $url, $params, $headers, $readBodyChunkCallable); - if ($rcode >= 300) { - $this->_interpretResponse($rbody, $rcode, $rheaders); - } - } - /** - * @param string $rbody a JSON string - * @param int $rcode - * @param array $rheaders - * @param array $resp - * - * @throws Exception\UnexpectedValueException - * @throws Exception\ApiErrorException - */ - public function handleErrorResponse($rbody, $rcode, $rheaders, $resp) - { - if (!\is_array($resp) || !isset($resp['error'])) { - $msg = "Invalid response object from API: {$rbody} " . "(HTTP response code was {$rcode})"; - throw new Exception\UnexpectedValueException($msg); - } - $errorData = $resp['error']; - $error = null; - if (\is_string($errorData)) { - $error = self::_specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorData); - } - if (!$error) { - $error = self::_specificAPIError($rbody, $rcode, $rheaders, $resp, $errorData); - } - throw $error; - } - /** - * @static - * - * @param string $rbody - * @param int $rcode - * @param array $rheaders - * @param array $resp - * @param array $errorData - * - * @return Exception\ApiErrorException - */ - private static function _specificAPIError($rbody, $rcode, $rheaders, $resp, $errorData) - { - $msg = isset($errorData['message']) ? $errorData['message'] : null; - $param = isset($errorData['param']) ? $errorData['param'] : null; - $code = isset($errorData['code']) ? $errorData['code'] : null; - $type = isset($errorData['type']) ? $errorData['type'] : null; - $declineCode = isset($errorData['decline_code']) ? $errorData['decline_code'] : null; - switch ($rcode) { - case 400: - // 'rate_limit' code is deprecated, but left here for backwards compatibility - // for API versions earlier than 2015-09-08 - if ('rate_limit' === $code) { - return Exception\RateLimitException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); - } - if ('idempotency_error' === $type) { - return Exception\IdempotencyException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); - } - // no break - case 404: - return Exception\InvalidRequestException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); - case 401: - return Exception\AuthenticationException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); - case 402: - return Exception\CardException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $declineCode, $param); - case 403: - return Exception\PermissionException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); - case 429: - return Exception\RateLimitException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); - default: - return Exception\UnknownApiErrorException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); - } - } - /** - * @static - * - * @param bool|string $rbody - * @param int $rcode - * @param array $rheaders - * @param array $resp - * @param string $errorCode - * - * @return Exception\OAuth\OAuthErrorException - */ - private static function _specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorCode) - { - $description = isset($resp['error_description']) ? $resp['error_description'] : $errorCode; - switch ($errorCode) { - case 'invalid_client': - return Exception\OAuth\InvalidClientException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - case 'invalid_grant': - return Exception\OAuth\InvalidGrantException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - case 'invalid_request': - return Exception\OAuth\InvalidRequestException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - case 'invalid_scope': - return Exception\OAuth\InvalidScopeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - case 'unsupported_grant_type': - return Exception\OAuth\UnsupportedGrantTypeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - case 'unsupported_response_type': - return Exception\OAuth\UnsupportedResponseTypeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - default: - return Exception\OAuth\UnknownOAuthErrorException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); - } - } - /** - * @static - * - * @param null|array $appInfo - * - * @return null|string - */ - private static function _formatAppInfo($appInfo) - { - if (null !== $appInfo) { - $string = $appInfo['name']; - if (null !== $appInfo['version']) { - $string .= '/' . $appInfo['version']; - } - if (null !== $appInfo['url']) { - $string .= ' (' . $appInfo['url'] . ')'; - } - return $string; - } - return null; - } - /** - * @static - * - * @param string $disableFunctionsOutput - String value of the 'disable_function' setting, as output by \ini_get('disable_functions') - * @param string $functionName - Name of the function we are interesting in seeing whether or not it is disabled - * - * @return bool - */ - private static function _isDisabled($disableFunctionsOutput, $functionName) - { - $disabledFunctions = \explode(',', $disableFunctionsOutput); - foreach ($disabledFunctions as $disabledFunction) { - if (\trim($disabledFunction) === $functionName) { - return \true; - } - } - return \false; - } - /** - * @static - * - * @param string $apiKey - * @param null $clientInfo - * - * @return array - */ - private static function _defaultHeaders($apiKey, $clientInfo = null) - { - $uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION; - $langVersion = \PHP_VERSION; - $uname_disabled = self::_isDisabled(\ini_get('disable_functions'), 'php_uname'); - $uname = $uname_disabled ? '(disabled)' : \php_uname(); - $appInfo = Stripe::getAppInfo(); - $ua = ['bindings_version' => Stripe::VERSION, 'lang' => 'php', 'lang_version' => $langVersion, 'publisher' => 'stripe', 'uname' => $uname]; - if ($clientInfo) { - $ua = \array_merge($clientInfo, $ua); - } - if (null !== $appInfo) { - $uaString .= ' ' . self::_formatAppInfo($appInfo); - $ua['application'] = $appInfo; - } - return ['X-Stripe-Client-User-Agent' => \json_encode($ua), 'User-Agent' => $uaString, 'Authorization' => 'Bearer ' . $apiKey]; - } - private function _prepareRequest($method, $url, $params, $headers) - { - $myApiKey = $this->_apiKey; - if (!$myApiKey) { - $myApiKey = Stripe::$apiKey; - } - if (!$myApiKey) { - $msg = 'No API key provided. (HINT: set your API key using ' . '"Stripe::setApiKey()". You can generate API keys from ' . 'the Stripe web interface. See https://stripe.com/api for ' . 'details, or email support@stripe.com if you have any questions.'; - throw new Exception\AuthenticationException($msg); - } - // Clients can supply arbitrary additional keys to be included in the - // X-Stripe-Client-User-Agent header via the optional getUserAgentInfo() - // method - $clientUAInfo = null; - if (\method_exists($this->httpClient(), 'getUserAgentInfo')) { - $clientUAInfo = $this->httpClient()->getUserAgentInfo(); - } - if ($params && \is_array($params)) { - $optionKeysInParams = \array_filter(self::$OPTIONS_KEYS, function ($key) use($params) { - return \array_key_exists($key, $params); - }); - if (\count($optionKeysInParams) > 0) { - $message = \sprintf('Options found in $params: %s. Options should ' . 'be passed in their own array after $params. (HINT: pass an ' . 'empty array to $params if you do not have any.)', \implode(', ', $optionKeysInParams)); - \trigger_error($message, \E_USER_WARNING); - } - } - $absUrl = $this->_apiBase . $url; - $params = self::_encodeObjects($params); - $defaultHeaders = $this->_defaultHeaders($myApiKey, $clientUAInfo); - if (Stripe::$apiVersion) { - $defaultHeaders['Stripe-Version'] = Stripe::$apiVersion; - } - if (Stripe::$accountId) { - $defaultHeaders['Stripe-Account'] = Stripe::$accountId; - } - if (Stripe::$enableTelemetry && null !== self::$requestTelemetry) { - $defaultHeaders['X-Stripe-Client-Telemetry'] = self::_telemetryJson(self::$requestTelemetry); - } - $hasFile = \false; - foreach ($params as $k => $v) { - if (\is_resource($v)) { - $hasFile = \true; - $params[$k] = self::_processResourceParam($v); - } elseif ($v instanceof \CURLFile) { - $hasFile = \true; - } - } - if ($hasFile) { - $defaultHeaders['Content-Type'] = 'multipart/form-data'; - } else { - $defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded'; - } - $combinedHeaders = \array_merge($defaultHeaders, $headers); - $rawHeaders = []; - foreach ($combinedHeaders as $header => $value) { - $rawHeaders[] = $header . ': ' . $value; - } - return [$absUrl, $rawHeaders, $params, $hasFile, $myApiKey]; - } - /** - * @param 'delete'|'get'|'post' $method - * @param string $url - * @param array $params - * @param array $headers - * - * @throws Exception\AuthenticationException - * @throws Exception\ApiConnectionException - * - * @return array - */ - private function _requestRaw($method, $url, $params, $headers) - { - list($absUrl, $rawHeaders, $params, $hasFile, $myApiKey) = $this->_prepareRequest($method, $url, $params, $headers); - $requestStartMs = Util\Util::currentTimeMillis(); - list($rbody, $rcode, $rheaders) = $this->httpClient()->request($method, $absUrl, $rawHeaders, $params, $hasFile); - if (isset($rheaders['request-id']) && \is_string($rheaders['request-id']) && '' !== $rheaders['request-id']) { - self::$requestTelemetry = new RequestTelemetry($rheaders['request-id'], Util\Util::currentTimeMillis() - $requestStartMs); - } - return [$rbody, $rcode, $rheaders, $myApiKey]; - } - /** - * @param 'delete'|'get'|'post' $method - * @param string $url - * @param array $params - * @param array $headers - * @param callable $readBodyChunkCallable - * - * @throws Exception\AuthenticationException - * @throws Exception\ApiConnectionException - * - * @return array - */ - private function _requestRawStreaming($method, $url, $params, $headers, $readBodyChunkCallable) - { - list($absUrl, $rawHeaders, $params, $hasFile, $myApiKey) = $this->_prepareRequest($method, $url, $params, $headers); - $requestStartMs = Util\Util::currentTimeMillis(); - list($rbody, $rcode, $rheaders) = $this->streamingHttpClient()->requestStream($method, $absUrl, $rawHeaders, $params, $hasFile, $readBodyChunkCallable); - if (isset($rheaders['request-id']) && \is_string($rheaders['request-id']) && '' !== $rheaders['request-id']) { - self::$requestTelemetry = new RequestTelemetry($rheaders['request-id'], Util\Util::currentTimeMillis() - $requestStartMs); - } - return [$rbody, $rcode, $rheaders, $myApiKey]; - } - /** - * @param resource $resource - * - * @throws Exception\InvalidArgumentException - * - * @return \CURLFile|string - */ - private function _processResourceParam($resource) - { - if ('stream' !== \get_resource_type($resource)) { - throw new Exception\InvalidArgumentException('Attempted to upload a resource that is not a stream'); - } - $metaData = \stream_get_meta_data($resource); - if ('plainfile' !== $metaData['wrapper_type']) { - throw new Exception\InvalidArgumentException('Only plainfile resource streams are supported'); - } - // We don't have the filename or mimetype, but the API doesn't care - return new \CURLFile($metaData['uri']); - } - /** - * @param string $rbody - * @param int $rcode - * @param array $rheaders - * - * @throws Exception\UnexpectedValueException - * @throws Exception\ApiErrorException - * - * @return array - */ - private function _interpretResponse($rbody, $rcode, $rheaders) - { - $resp = \json_decode($rbody, \true); - $jsonError = \json_last_error(); - if (null === $resp && \JSON_ERROR_NONE !== $jsonError) { - $msg = "Invalid response body from API: {$rbody} " . "(HTTP response code was {$rcode}, json_last_error() was {$jsonError})"; - throw new Exception\UnexpectedValueException($msg, $rcode); - } - if ($rcode < 200 || $rcode >= 300) { - $this->handleErrorResponse($rbody, $rcode, $rheaders, $resp); - } - return $resp; - } - /** - * @static - * - * @param HttpClient\ClientInterface $client - */ - public static function setHttpClient($client) - { - self::$_httpClient = $client; - } - /** - * @static - * - * @param HttpClient\StreamingClientInterface $client - */ - public static function setStreamingHttpClient($client) - { - self::$_streamingHttpClient = $client; - } - /** - * @static - * - * Resets any stateful telemetry data - */ - public static function resetTelemetry() - { - self::$requestTelemetry = null; - } - /** - * @return HttpClient\ClientInterface - */ - private function httpClient() - { - if (!self::$_httpClient) { - self::$_httpClient = HttpClient\CurlClient::instance(); - } - return self::$_httpClient; - } - /** - * @return HttpClient\StreamingClientInterface - */ - private function streamingHttpClient() - { - if (!self::$_streamingHttpClient) { - self::$_streamingHttpClient = HttpClient\CurlClient::instance(); - } - return self::$_streamingHttpClient; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiResource.php b/dependencies/stripe/stripe-php/lib/ApiResource.php deleted file mode 100644 index 4ac46c1..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiResource.php +++ /dev/null @@ -1,101 +0,0 @@ -{$k}; - if (static::getSavedNestedResources()->includes($k) && $v instanceof ApiResource) { - $v->saveWithParent = \true; - } - } - /** - * @throws Exception\ApiErrorException - * - * @return ApiResource the refreshed resource - */ - public function refresh() - { - $requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl()); - $url = $this->instanceUrl(); - list($response, $this->_opts->apiKey) = $requestor->request('get', $url, $this->_retrieveOptions, $this->_opts->headers); - $this->setLastResponse($response); - $this->refreshFrom($response->json, $this->_opts); - return $this; - } - /** - * @return string the base URL for the given class - */ - public static function baseUrl() - { - return Stripe::$apiBase; - } - /** - * @return string the endpoint URL for the given class - */ - public static function classUrl() - { - // Replace dots with slashes for namespaced resources, e.g. if the object's name is - // "foo.bar", then its URL will be "/v1/foo/bars". - /** @phpstan-ignore-next-line */ - $base = \str_replace('.', '/', static::OBJECT_NAME); - return "/v1/{$base}s"; - } - /** - * @param null|string $id the ID of the resource - * - * @throws Exception\UnexpectedValueException if $id is null - * - * @return string the instance endpoint URL for the given class - */ - public static function resourceUrl($id) - { - if (null === $id) { - $class = static::class; - $message = 'Could not determine which URL to request: ' . "{$class} instance has invalid ID: {$id}"; - throw new Exception\UnexpectedValueException($message); - } - $id = Util\Util::utf8($id); - $base = static::classUrl(); - $extn = \urlencode($id); - return "{$base}/{$extn}"; - } - /** - * @return string the full API URL for this API resource - */ - public function instanceUrl() - { - return static::resourceUrl($this['id']); - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApiResponse.php b/dependencies/stripe/stripe-php/lib/ApiResponse.php deleted file mode 100644 index 06fb619..0000000 --- a/dependencies/stripe/stripe-php/lib/ApiResponse.php +++ /dev/null @@ -1,40 +0,0 @@ -body = $body; - $this->code = $code; - $this->headers = $headers; - $this->json = $json; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApplePayDomain.php b/dependencies/stripe/stripe-php/lib/ApplePayDomain.php deleted file mode 100644 index d49d575..0000000 --- a/dependencies/stripe/stripe-php/lib/ApplePayDomain.php +++ /dev/null @@ -1,28 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - */ -class ApplePayDomain extends ApiResource -{ - const OBJECT_NAME = 'apple_pay_domain'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\Retrieve; - /** - * @return string The class URL for this resource. It needs to be special - * cased because it doesn't fit into the standard resource pattern. - */ - public static function classUrl() - { - return '/v1/apple_pay/domains'; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApplicationFee.php b/dependencies/stripe/stripe-php/lib/ApplicationFee.php deleted file mode 100644 index 68de489..0000000 --- a/dependencies/stripe/stripe-php/lib/ApplicationFee.php +++ /dev/null @@ -1,83 +0,0 @@ -ISO currency code, in lowercase. Must be a supported currency. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string|\Stripe\Charge $originating_transaction ID of the corresponding charge on the platform account, if this fee was the result of a charge using the destination parameter. - * @property bool $refunded Whether the fee has been fully refunded. If the fee is only partially refunded, this attribute will still be false. - * @property \Stripe\Collection<\Stripe\ApplicationFeeRefund> $refunds A list of refunds that have been applied to the fee. - */ -class ApplicationFee extends ApiResource -{ - const OBJECT_NAME = 'application_fee'; - use ApiOperations\All; - use ApiOperations\NestedResource; - use ApiOperations\Retrieve; - const PATH_REFUNDS = '/refunds'; - /** - * @param string $id the ID of the application fee on which to retrieve the fee refunds - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\ApplicationFeeRefund> the list of fee refunds - */ - public static function allRefunds($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_REFUNDS, $params, $opts); - } - /** - * @param string $id the ID of the application fee on which to create the fee refund - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFeeRefund - */ - public static function createRefund($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_REFUNDS, $params, $opts); - } - /** - * @param string $id the ID of the application fee to which the fee refund belongs - * @param string $refundId the ID of the fee refund to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFeeRefund - */ - public static function retrieveRefund($id, $refundId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); - } - /** - * @param string $id the ID of the application fee to which the fee refund belongs - * @param string $refundId the ID of the fee refund to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFeeRefund - */ - public static function updateRefund($id, $refundId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/ApplicationFeeRefund.php b/dependencies/stripe/stripe-php/lib/ApplicationFeeRefund.php deleted file mode 100644 index f63ced1..0000000 --- a/dependencies/stripe/stripe-php/lib/ApplicationFeeRefund.php +++ /dev/null @@ -1,54 +0,0 @@ -Application Fee Refund objects allow you to refund an application fee that - * has previously been created but not yet refunded. Funds will be refunded to - * the Stripe account from which the fee was originally collected. - * - * Related guide: Refunding application fees - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount, in cents (or local equivalent). - * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact on your account balance. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string|\Stripe\ApplicationFee $fee ID of the application fee that was refunded. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - */ -class ApplicationFeeRefund extends ApiResource -{ - const OBJECT_NAME = 'fee_refund'; - use ApiOperations\Update { - save as protected _save; - } - /** - * @return string the API URL for this Stripe refund - */ - public function instanceUrl() - { - $id = $this['id']; - $fee = $this['fee']; - if (!$id) { - throw new Exception\UnexpectedValueException('Could not determine which URL to request: ' . "class instance has invalid ID: {$id}", null); - } - $id = Util\Util::utf8($id); - $fee = Util\Util::utf8($fee); - $base = ApplicationFee::classUrl(); - $feeExtn = \urlencode($fee); - $extn = \urlencode($id); - return "{$base}/{$feeExtn}/refunds/{$extn}"; - } - /** - * @param null|array|string $opts - * - * @return ApplicationFeeRefund the saved refund - */ - public function save($opts = null) - { - return $this->_save($opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Apps/Secret.php b/dependencies/stripe/stripe-php/lib/Apps/Secret.php deleted file mode 100644 index f3c2b98..0000000 --- a/dependencies/stripe/stripe-php/lib/Apps/Secret.php +++ /dev/null @@ -1,64 +0,0 @@ -secret. Other apps can't view secrets created by an app. Additionally, secrets are scoped to provide further permission control. - * - * All Dashboard users and the app backend share account scoped secrets. Use the account scope for secrets that don't change per-user, like a third-party API key. - * - * A user scoped secret is accessible by the app backend and one specific Dashboard user. Use the user scope for per-user secrets like per-user OAuth tokens, where different users might have different permissions. - * - * Related guide: Store data between page reloads - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|bool $deleted If true, indicates that this secret has been deleted - * @property null|int $expires_at The Unix timestamp for the expiry time of the secret, after which the secret deletes. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $name A name for the secret that's unique within the scope. - * @property null|string $payload The plaintext secret value to be stored. - * @property \Stripe\StripeObject $scope - */ -class Secret extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'apps.secret'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Apps\Secret the deleted secret - */ - public static function deleteWhere($params = null, $opts = null) - { - $url = static::classUrl() . '/delete'; - list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Apps\Secret the finded secret - */ - public static function find($params = null, $opts = null) - { - $url = static::classUrl() . '/find'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Balance.php b/dependencies/stripe/stripe-php/lib/Balance.php deleted file mode 100644 index 389987e..0000000 --- a/dependencies/stripe/stripe-php/lib/Balance.php +++ /dev/null @@ -1,31 +0,0 @@ -transactions that contributed to the balance - * (charges, payouts, and so forth). - * - * The available and pending amounts for each currency are broken down further by - * payment source types. - * - * Related guide: Understanding Connect account balances - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject[] $available Funds that are available to be transferred or paid out, whether automatically by Stripe or explicitly via the Transfers API or Payouts API. The available balance for each currency and payment type can be found in the source_types property. - * @property null|\Stripe\StripeObject[] $connect_reserved Funds held due to negative balances on connected Custom accounts. The connect reserve balance for each currency and payment type can be found in the source_types property. - * @property null|\Stripe\StripeObject[] $instant_available Funds that can be paid out using Instant Payouts. - * @property null|\Stripe\StripeObject $issuing - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject[] $pending Funds that are not yet available in the balance. The pending balance for each currency, and for each payment type, can be found in the source_types property. - */ -class Balance extends SingletonApiResource -{ - const OBJECT_NAME = 'balance'; - use ApiOperations\SingletonRetrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/BalanceTransaction.php b/dependencies/stripe/stripe-php/lib/BalanceTransaction.php deleted file mode 100644 index 1443d96..0000000 --- a/dependencies/stripe/stripe-php/lib/BalanceTransaction.php +++ /dev/null @@ -1,66 +0,0 @@ -Balance transaction types - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Gross amount of the transaction, in cents (or local equivalent). - * @property int $available_on The date the transaction's net funds will become available in the Stripe balance. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|float $exchange_rate The exchange rate used, if applicable, for this transaction. Specifically, if money was converted from currency A to currency B, then the amount in currency A, times exchange_rate, would be the amount in currency B. For example, suppose you charged a customer 10.00 EUR. Then the PaymentIntent's amount would be 1000 and currency would be eur. Suppose this was converted into 12.34 USD in your Stripe account. Then the BalanceTransaction's amount would be 1234, currency would be usd, and exchange_rate would be 1.234. - * @property int $fee Fees (in cents (or local equivalent)) paid for this transaction. - * @property \Stripe\StripeObject[] $fee_details Detailed breakdown of fees (in cents (or local equivalent)) paid for this transaction. - * @property int $net Net amount of the transaction, in cents (or local equivalent). - * @property string $reporting_category Learn more about how reporting categories can help you understand balance transactions from an accounting perspective. - * @property null|string|\Stripe\StripeObject $source The Stripe object to which this transaction is related. - * @property string $status If the transaction's net funds are available in the Stripe balance yet. Either available or pending. - * @property string $type Transaction type: adjustment, advance, advance_funding, anticipation_repayment, application_fee, application_fee_refund, charge, connect_collection_transfer, contribution, issuing_authorization_hold, issuing_authorization_release, issuing_dispute, issuing_transaction, payment, payment_failure_refund, payment_refund, payment_reversal, payout, payout_cancel, payout_failure, refund, refund_failure, reserve_transaction, reserved_funds, stripe_fee, stripe_fx_fee, tax_fee, topup, topup_reversal, transfer, transfer_cancel, transfer_failure, or transfer_refund. Learn more about balance transaction types and what they represent. If you are looking to classify transactions for accounting purposes, you might want to consider reporting_category instead. - */ -class BalanceTransaction extends ApiResource -{ - const OBJECT_NAME = 'balance_transaction'; - use ApiOperations\All; - use ApiOperations\Retrieve; - const TYPE_ADJUSTMENT = 'adjustment'; - const TYPE_ADVANCE = 'advance'; - const TYPE_ADVANCE_FUNDING = 'advance_funding'; - const TYPE_ANTICIPATION_REPAYMENT = 'anticipation_repayment'; - const TYPE_APPLICATION_FEE = 'application_fee'; - const TYPE_APPLICATION_FEE_REFUND = 'application_fee_refund'; - const TYPE_CHARGE = 'charge'; - const TYPE_CONNECT_COLLECTION_TRANSFER = 'connect_collection_transfer'; - const TYPE_CONTRIBUTION = 'contribution'; - const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold'; - const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release'; - const TYPE_ISSUING_DISPUTE = 'issuing_dispute'; - const TYPE_ISSUING_TRANSACTION = 'issuing_transaction'; - const TYPE_PAYMENT = 'payment'; - const TYPE_PAYMENT_FAILURE_REFUND = 'payment_failure_refund'; - const TYPE_PAYMENT_REFUND = 'payment_refund'; - const TYPE_PAYMENT_REVERSAL = 'payment_reversal'; - const TYPE_PAYOUT = 'payout'; - const TYPE_PAYOUT_CANCEL = 'payout_cancel'; - const TYPE_PAYOUT_FAILURE = 'payout_failure'; - const TYPE_REFUND = 'refund'; - const TYPE_REFUND_FAILURE = 'refund_failure'; - const TYPE_RESERVED_FUNDS = 'reserved_funds'; - const TYPE_RESERVE_TRANSACTION = 'reserve_transaction'; - const TYPE_STRIPE_FEE = 'stripe_fee'; - const TYPE_STRIPE_FX_FEE = 'stripe_fx_fee'; - const TYPE_TAX_FEE = 'tax_fee'; - const TYPE_TOPUP = 'topup'; - const TYPE_TOPUP_REVERSAL = 'topup_reversal'; - const TYPE_TRANSFER = 'transfer'; - const TYPE_TRANSFER_CANCEL = 'transfer_cancel'; - const TYPE_TRANSFER_FAILURE = 'transfer_failure'; - const TYPE_TRANSFER_REFUND = 'transfer_refund'; -} diff --git a/dependencies/stripe/stripe-php/lib/BankAccount.php b/dependencies/stripe/stripe-php/lib/BankAccount.php deleted file mode 100644 index c9706b0..0000000 --- a/dependencies/stripe/stripe-php/lib/BankAccount.php +++ /dev/null @@ -1,110 +0,0 @@ -Customer objects. - * - * On the other hand External Accounts are transfer - * destinations on Account objects for Custom accounts. - * They can be bank accounts or debit cards as well, and are documented in the links above. - * - * Related guide: Bank debits and transfers - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string|\Stripe\Account $account The ID of the account that the bank account is associated with. - * @property null|string $account_holder_name The name of the person or business that owns the bank account. - * @property null|string $account_holder_type The type of entity that holds the account. This can be either individual or company. - * @property null|string $account_type The bank account type. This can only be checking or savings in most countries. In Japan, this can only be futsu or toza. - * @property null|string[] $available_payout_methods A set of available payout methods for this bank account. Only values from this set should be passed as the method when creating a payout. - * @property null|string $bank_name Name of the bank associated with the routing number (e.g., WELLS FARGO). - * @property string $country Two-letter ISO code representing the country the bank account is located in. - * @property string $currency Three-letter ISO code for the currency paid out to the bank account. - * @property null|string|\Stripe\Customer $customer The ID of the customer that the bank account is associated with. - * @property null|bool $default_for_currency Whether this bank account is the default external account for its currency. - * @property null|string $fingerprint Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same. - * @property null|\Stripe\StripeObject $future_requirements Information about upcoming new requirements for the bank account, including what information needs to be collected. - * @property string $last4 The last four digits of the bank account number. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $requirements Information about the requirements for the bank account, including what information needs to be collected. - * @property null|string $routing_number The routing transit number for the bank account. - * @property string $status

      For bank accounts, possible values are new, validated, verified, verification_failed, or errored. A bank account that hasn't had any activity or validation performed is new. If Stripe can determine that the bank account exists, its status will be validated. Note that there often isn’t enough information to know (e.g., for smaller credit unions), and the validation is not always run. If customer bank account verification has succeeded, the bank account status will be verified. If the verification failed for any reason, such as microdeposit failure, the status will be verification_failed. If a transfer sent to this bank account fails, we'll set the status to errored and will not continue to send transfers until the bank details are updated.

      For external accounts, possible values are new, errored and verification_failed. If a transfer fails, the status is set to errored and transfers are stopped until account details are updated. In India, if we can't verify the owner of the bank account, we'll set the status to verification_failed. Other validations aren't run against external accounts because they're only used for payouts. This means the other statuses don't apply.

      - */ -class BankAccount extends ApiResource -{ - const OBJECT_NAME = 'bank_account'; - use ApiOperations\Delete; - use ApiOperations\Update; - /** - * Possible string representations of the bank verification status. - * - * @see https://stripe.com/docs/api/external_account_bank_accounts/object#account_bank_account_object-status - */ - const STATUS_NEW = 'new'; - const STATUS_VALIDATED = 'validated'; - const STATUS_VERIFIED = 'verified'; - const STATUS_VERIFICATION_FAILED = 'verification_failed'; - const STATUS_ERRORED = 'errored'; - /** - * @return string The instance URL for this resource. It needs to be special - * cased because it doesn't fit into the standard resource pattern. - */ - public function instanceUrl() - { - if ($this['customer']) { - $base = Customer::classUrl(); - $parent = $this['customer']; - $path = 'sources'; - } elseif ($this['account']) { - $base = Account::classUrl(); - $parent = $this['account']; - $path = 'external_accounts'; - } else { - $msg = 'Bank accounts cannot be accessed without a customer ID or account ID.'; - throw new Exception\UnexpectedValueException($msg, null); - } - $parentExtn = \urlencode(Util\Util::utf8($parent)); - $extn = \urlencode(Util\Util::utf8($this['id'])); - return "{$base}/{$parentExtn}/{$path}/{$extn}"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Bank accounts cannot be retrieved without a customer ID or ' . 'an account ID. Retrieve a bank account using ' . "`Customer::retrieveSource('customer_id', " . "'bank_account_id')` or `Account::retrieveExternalAccount(" . "'account_id', 'bank_account_id')`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param string $_id - * @param null|array $_params - * @param null|array|string $_options - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function update($_id, $_params = null, $_options = null) - { - $msg = 'Bank accounts cannot be updated without a customer ID or an ' . 'account ID. Update a bank account using ' . "`Customer::updateSource('customer_id', 'bank_account_id', " . '$updateParams)` or `Account::updateExternalAccount(' . "'account_id', 'bank_account_id', \$updateParams)`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return BankAccount the verified bank account - */ - public function verify($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/verify'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/BaseStripeClient.php b/dependencies/stripe/stripe-php/lib/BaseStripeClient.php deleted file mode 100644 index 484de1c..0000000 --- a/dependencies/stripe/stripe-php/lib/BaseStripeClient.php +++ /dev/null @@ -1,252 +0,0 @@ - */ - const DEFAULT_CONFIG = ['api_key' => null, 'client_id' => null, 'stripe_account' => null, 'stripe_version' => null, 'api_base' => self::DEFAULT_API_BASE, 'connect_base' => self::DEFAULT_CONNECT_BASE, 'files_base' => self::DEFAULT_FILES_BASE]; - /** @var array */ - private $config; - /** @var \Stripe\Util\RequestOptions */ - private $defaultOpts; - /** - * Initializes a new instance of the {@link BaseStripeClient} class. - * - * The constructor takes a single argument. The argument can be a string, in which case it - * should be the API key. It can also be an array with various configuration settings. - * - * Configuration settings include the following options: - * - * - api_key (null|string): the Stripe API key, to be used in regular API requests. - * - client_id (null|string): the Stripe client ID, to be used in OAuth requests. - * - stripe_account (null|string): a Stripe account ID. If set, all requests sent by the client - * will automatically use the {@code Stripe-Account} header with that account ID. - * - stripe_version (null|string): a Stripe API verion. If set, all requests sent by the client - * will include the {@code Stripe-Version} header with that API version. - * - * The following configuration settings are also available, though setting these should rarely be necessary - * (only useful if you want to send requests to a mock server like stripe-mock): - * - * - api_base (string): the base URL for regular API requests. Defaults to - * {@link DEFAULT_API_BASE}. - * - connect_base (string): the base URL for OAuth requests. Defaults to - * {@link DEFAULT_CONNECT_BASE}. - * - files_base (string): the base URL for file creation requests. Defaults to - * {@link DEFAULT_FILES_BASE}. - * - * @param array|string $config the API key as a string, or an array containing - * the client configuration settings - */ - public function __construct($config = []) - { - if (\is_string($config)) { - $config = ['api_key' => $config]; - } elseif (!\is_array($config)) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('$config must be a string or an array'); - } - $config = \array_merge(self::DEFAULT_CONFIG, $config); - $this->validateConfig($config); - $this->config = $config; - $this->defaultOpts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse(['stripe_account' => $config['stripe_account'], 'stripe_version' => $config['stripe_version']]); - } - /** - * Gets the API key used by the client to send requests. - * - * @return null|string the API key used by the client to send requests - */ - public function getApiKey() - { - return $this->config['api_key']; - } - /** - * Gets the client ID used by the client in OAuth requests. - * - * @return null|string the client ID used by the client in OAuth requests - */ - public function getClientId() - { - return $this->config['client_id']; - } - /** - * Gets the base URL for Stripe's API. - * - * @return string the base URL for Stripe's API - */ - public function getApiBase() - { - return $this->config['api_base']; - } - /** - * Gets the base URL for Stripe's OAuth API. - * - * @return string the base URL for Stripe's OAuth API - */ - public function getConnectBase() - { - return $this->config['connect_base']; - } - /** - * Gets the base URL for Stripe's Files API. - * - * @return string the base URL for Stripe's Files API - */ - public function getFilesBase() - { - return $this->config['files_base']; - } - /** - * Sends a request to Stripe's API. - * - * @param 'delete'|'get'|'post' $method the HTTP method - * @param string $path the path of the request - * @param array $params the parameters of the request - * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request - * - * @return \Stripe\StripeObject the object returned by Stripe's API - */ - public function request($method, $path, $params, $opts) - { - $opts = $this->defaultOpts->merge($opts, \true); - $baseUrl = $opts->apiBase ?: $this->getApiBase(); - $requestor = new \WP_Ultimo\Dependencies\Stripe\ApiRequestor($this->apiKeyForRequest($opts), $baseUrl); - list($response, $opts->apiKey) = $requestor->request($method, $path, $params, $opts->headers); - $opts->discardNonPersistentHeaders(); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * Sends a request to Stripe's API, passing chunks of the streamed response - * into a user-provided $readBodyChunkCallable callback. - * - * @param 'delete'|'get'|'post' $method the HTTP method - * @param string $path the path of the request - * @param callable $readBodyChunkCallable a function that will be called - * @param array $params the parameters of the request - * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request - * with chunks of bytes from the body if the request is successful - */ - public function requestStream($method, $path, $readBodyChunkCallable, $params, $opts) - { - $opts = $this->defaultOpts->merge($opts, \true); - $baseUrl = $opts->apiBase ?: $this->getApiBase(); - $requestor = new \WP_Ultimo\Dependencies\Stripe\ApiRequestor($this->apiKeyForRequest($opts), $baseUrl); - list($response, $opts->apiKey) = $requestor->requestStream($method, $path, $readBodyChunkCallable, $params, $opts->headers); - } - /** - * Sends a request to Stripe's API. - * - * @param 'delete'|'get'|'post' $method the HTTP method - * @param string $path the path of the request - * @param array $params the parameters of the request - * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request - * - * @return \Stripe\Collection of ApiResources - */ - public function requestCollection($method, $path, $params, $opts) - { - $obj = $this->request($method, $path, $params, $opts); - if (!$obj instanceof \WP_Ultimo\Dependencies\Stripe\Collection) { - $received_class = \get_class($obj); - $msg = "Expected to receive `Stripe\\Collection` object from Stripe API. Instead received `{$received_class}`."; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\UnexpectedValueException($msg); - } - $obj->setFilters($params); - return $obj; - } - /** - * Sends a request to Stripe's API. - * - * @param 'delete'|'get'|'post' $method the HTTP method - * @param string $path the path of the request - * @param array $params the parameters of the request - * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request - * - * @return \Stripe\SearchResult of ApiResources - */ - public function requestSearchResult($method, $path, $params, $opts) - { - $obj = $this->request($method, $path, $params, $opts); - if (!$obj instanceof \WP_Ultimo\Dependencies\Stripe\SearchResult) { - $received_class = \get_class($obj); - $msg = "Expected to receive `Stripe\\SearchResult` object from Stripe API. Instead received `{$received_class}`."; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\UnexpectedValueException($msg); - } - $obj->setFilters($params); - return $obj; - } - /** - * @param \Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\AuthenticationException - * - * @return string - */ - private function apiKeyForRequest($opts) - { - $apiKey = $opts->apiKey ?: $this->getApiKey(); - if (null === $apiKey) { - $msg = 'No API key provided. Set your API key when constructing the ' . 'StripeClient instance, or provide it on a per-request basis ' . 'using the `api_key` key in the $opts argument.'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\AuthenticationException($msg); - } - return $apiKey; - } - /** - * @param array $config - * - * @throws \Stripe\Exception\InvalidArgumentException - */ - private function validateConfig($config) - { - // api_key - if (null !== $config['api_key'] && !\is_string($config['api_key'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('api_key must be null or a string'); - } - if (null !== $config['api_key'] && '' === $config['api_key']) { - $msg = 'api_key cannot be the empty string'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($msg); - } - if (null !== $config['api_key'] && \preg_match('/\\s/', $config['api_key'])) { - $msg = 'api_key cannot contain whitespace'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($msg); - } - // client_id - if (null !== $config['client_id'] && !\is_string($config['client_id'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('client_id must be null or a string'); - } - // stripe_account - if (null !== $config['stripe_account'] && !\is_string($config['stripe_account'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('stripe_account must be null or a string'); - } - // stripe_version - if (null !== $config['stripe_version'] && !\is_string($config['stripe_version'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('stripe_version must be null or a string'); - } - // api_base - if (!\is_string($config['api_base'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('api_base must be a string'); - } - // connect_base - if (!\is_string($config['connect_base'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('connect_base must be a string'); - } - // files_base - if (!\is_string($config['files_base'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('files_base must be a string'); - } - // check absence of extra keys - $extraConfigKeys = \array_diff(\array_keys($config), \array_keys(self::DEFAULT_CONFIG)); - if (!empty($extraConfigKeys)) { - // Wrap in single quote to more easily catch trailing spaces errors - $invalidKeys = "'" . \implode("', '", $extraConfigKeys) . "'"; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('Found unknown key(s) in configuration array: ' . $invalidKeys); - } - } -} diff --git a/dependencies/stripe/stripe-php/lib/BaseStripeClientInterface.php b/dependencies/stripe/stripe-php/lib/BaseStripeClientInterface.php deleted file mode 100644 index 35b292c..0000000 --- a/dependencies/stripe/stripe-php/lib/BaseStripeClientInterface.php +++ /dev/null @@ -1,40 +0,0 @@ -overriden when creating the session. - * @property \Stripe\StripeObject $features - * @property bool $is_default Whether the configuration is the default. If true, this configuration can be managed in the Dashboard and portal sessions will use this configuration unless it is overriden when creating the session. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $login_page - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. - */ -class Configuration extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'billing_portal.configuration'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/BillingPortal/Session.php b/dependencies/stripe/stripe-php/lib/BillingPortal/Session.php deleted file mode 100644 index 349fe96..0000000 --- a/dependencies/stripe/stripe-php/lib/BillingPortal/Session.php +++ /dev/null @@ -1,38 +0,0 @@ -integration guide. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property string|\Stripe\BillingPortal\Configuration $configuration The configuration used by this session, describing the features available. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $customer The ID of the customer for this session. - * @property null|\Stripe\StripeObject $flow Information about a specific flow for the customer to go through. See the docs to learn more about using customer portal deep links and flows. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $locale The IETF language tag of the locale Customer Portal is displayed in. If blank or auto, the customer’s preferred_locales or browser’s locale is used. - * @property null|string $on_behalf_of The account for which the session was created on behalf of. When specified, only subscriptions and invoices with this on_behalf_of account appear in the portal. For more information, see the docs. Use the Accounts API to modify the on_behalf_of account's branding settings, which the portal displays. - * @property null|string $return_url The URL to redirect customers to when they click on the portal's link to return to your website. - * @property string $url The short-lived URL of the session that gives customers access to the customer portal. - */ -class Session extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'billing_portal.session'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; -} diff --git a/dependencies/stripe/stripe-php/lib/Capability.php b/dependencies/stripe/stripe-php/lib/Capability.php deleted file mode 100644 index ed49a74..0000000 --- a/dependencies/stripe/stripe-php/lib/Capability.php +++ /dev/null @@ -1,68 +0,0 @@ -Account capabilities - * - * @property string $id The identifier for the capability. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property string|\Stripe\Account $account The account for which the capability enables functionality. - * @property null|\Stripe\StripeObject $future_requirements - * @property bool $requested Whether the capability has been requested. - * @property null|int $requested_at Time at which the capability was requested. Measured in seconds since the Unix epoch. - * @property null|\Stripe\StripeObject $requirements - * @property string $status The status of the capability. Can be active, inactive, pending, or unrequested. - */ -class Capability extends ApiResource -{ - const OBJECT_NAME = 'capability'; - use ApiOperations\Update; - const STATUS_ACTIVE = 'active'; - const STATUS_INACTIVE = 'inactive'; - const STATUS_PENDING = 'pending'; - const STATUS_UNREQUESTED = 'unrequested'; - /** - * @return string the API URL for this Stripe account reversal - */ - public function instanceUrl() - { - $id = $this['id']; - $account = $this['account']; - if (!$id) { - throw new Exception\UnexpectedValueException('Could not determine which URL to request: ' . "class instance has invalid ID: {$id}", null); - } - $id = Util\Util::utf8($id); - $account = Util\Util::utf8($account); - $base = Account::classUrl(); - $accountExtn = \urlencode($account); - $extn = \urlencode($id); - return "{$base}/{$accountExtn}/capabilities/{$extn}"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Capabilities cannot be retrieved without an account ID. ' . 'Retrieve a capability using `Account::retrieveCapability(' . "'account_id', 'capability_id')`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param string $_id - * @param null|array $_params - * @param null|array|string $_options - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function update($_id, $_params = null, $_options = null) - { - $msg = 'Capabilities cannot be updated without an account ID. ' . 'Update a capability using `Account::updateCapability(' . "'account_id', 'capability_id', \$updateParams)`."; - throw new Exception\BadMethodCallException($msg); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Card.php b/dependencies/stripe/stripe-php/lib/Card.php deleted file mode 100644 index c81965c..0000000 --- a/dependencies/stripe/stripe-php/lib/Card.php +++ /dev/null @@ -1,118 +0,0 @@ -Card payments with Sources - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string|\Stripe\Account $account The account this card belongs to. This attribute will not be in the card object if the card belongs to a customer or recipient instead. - * @property null|string $address_city City/District/Suburb/Town/Village. - * @property null|string $address_country Billing address country, if provided when creating card. - * @property null|string $address_line1 Address line 1 (Street address/PO Box/Company name). - * @property null|string $address_line1_check If address_line1 was provided, results of the check: pass, fail, unavailable, or unchecked. - * @property null|string $address_line2 Address line 2 (Apartment/Suite/Unit/Building). - * @property null|string $address_state State/County/Province/Region. - * @property null|string $address_zip ZIP or postal code. - * @property null|string $address_zip_check If address_zip was provided, results of the check: pass, fail, unavailable, or unchecked. - * @property null|string[] $available_payout_methods A set of available payout methods for this card. Only values from this set should be passed as the method when creating a payout. - * @property string $brand Card brand. Can be American Express, Diners Club, Discover, Eftpos Australia, JCB, MasterCard, UnionPay, Visa, or Unknown. - * @property null|string $country Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. - * @property null|string $currency Three-letter ISO code for currency. Only applicable on accounts (not customers or recipients). The card can be used as a transfer destination for funds in this currency. - * @property null|string|\Stripe\Customer $customer The customer that this card belongs to. This attribute will not be in the card object if the card belongs to an account or recipient instead. - * @property null|string $cvc_check If a CVC was provided, results of the check: pass, fail, unavailable, or unchecked. A result of unchecked indicates that CVC was provided but hasn't been checked yet. Checks are typically performed when attaching a card to a Customer object, or when creating a charge. For more details, see Check if a card is valid without a charge. - * @property null|bool $default_for_currency Whether this card is the default external account for its currency. - * @property null|string $dynamic_last4 (For tokenized numbers only.) The last four digits of the device account number. - * @property int $exp_month Two-digit number representing the card's expiration month. - * @property int $exp_year Four-digit number representing the card's expiration year. - * @property null|string $fingerprint

      Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.

      Starting May 1, 2021, card fingerprint in India for Connect will change to allow two fingerprints for the same card --- one for India and one for the rest of the world.

      - * @property string $funding Card funding type. Can be credit, debit, prepaid, or unknown. - * @property string $last4 The last four digits of the card. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $name Cardholder name. - * @property null|string $status For external accounts, possible values are new and errored. If a transfer fails, the status is set to errored and transfers are stopped until account details are updated. - * @property null|string $tokenization_method If the card number is tokenized, this is the method that was used. Can be android_pay (includes Google Pay), apple_pay, masterpass, visa_checkout, or null. - */ -class Card extends ApiResource -{ - const OBJECT_NAME = 'card'; - use ApiOperations\Delete; - use ApiOperations\Update; - /** - * Possible string representations of the CVC check status. - * - * @see https://stripe.com/docs/api/cards/object#card_object-cvc_check - */ - const CVC_CHECK_FAIL = 'fail'; - const CVC_CHECK_PASS = 'pass'; - const CVC_CHECK_UNAVAILABLE = 'unavailable'; - const CVC_CHECK_UNCHECKED = 'unchecked'; - /** - * Possible string representations of the funding of the card. - * - * @see https://stripe.com/docs/api/cards/object#card_object-funding - */ - const FUNDING_CREDIT = 'credit'; - const FUNDING_DEBIT = 'debit'; - const FUNDING_PREPAID = 'prepaid'; - const FUNDING_UNKNOWN = 'unknown'; - /** - * Possible string representations of the tokenization method when using Apple Pay or Google Pay. - * - * @see https://stripe.com/docs/api/cards/object#card_object-tokenization_method - */ - const TOKENIZATION_METHOD_APPLE_PAY = 'apple_pay'; - const TOKENIZATION_METHOD_GOOGLE_PAY = 'google_pay'; - /** - * @return string The instance URL for this resource. It needs to be special - * cased because cards are nested resources that may belong to different - * top-level resources. - */ - public function instanceUrl() - { - if ($this['customer']) { - $base = Customer::classUrl(); - $parent = $this['customer']; - $path = 'sources'; - } elseif ($this['account']) { - $base = Account::classUrl(); - $parent = $this['account']; - $path = 'external_accounts'; - } else { - $msg = 'Cards cannot be accessed without a customer ID, or account ID.'; - throw new Exception\UnexpectedValueException($msg); - } - $parentExtn = \urlencode(Util\Util::utf8($parent)); - $extn = \urlencode(Util\Util::utf8($this['id'])); - return "{$base}/{$parentExtn}/{$path}/{$extn}"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Cards cannot be retrieved without a customer ID or an ' . 'account ID. Retrieve a card using ' . "`Customer::retrieveSource('customer_id', 'card_id')` or " . "`Account::retrieveExternalAccount('account_id', 'card_id')`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param string $_id - * @param null|array $_params - * @param null|array|string $_options - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function update($_id, $_params = null, $_options = null) - { - $msg = 'Cards cannot be updated without a customer ID or an ' . 'account ID. Update a card using ' . "`Customer::updateSource('customer_id', 'card_id', " . '$updateParams)` or `Account::updateExternalAccount(' . "'account_id', 'card_id', \$updateParams)`."; - throw new Exception\BadMethodCallException($msg); - } -} diff --git a/dependencies/stripe/stripe-php/lib/CashBalance.php b/dependencies/stripe/stripe-php/lib/CashBalance.php deleted file mode 100644 index 408b172..0000000 --- a/dependencies/stripe/stripe-php/lib/CashBalance.php +++ /dev/null @@ -1,52 +0,0 @@ -Cash balance represents real funds. Customers can add funds to their cash balance by sending a bank transfer. These funds can be used for payment and can eventually be paid out to your bank account. - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $available A hash of all cash balances available to this customer. You cannot delete a customer with any cash balances, even if the balance is 0. Amounts are represented in the smallest currency unit. - * @property string $customer The ID of the customer whose cash balance this object represents. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $settings - */ -class CashBalance extends ApiResource -{ - const OBJECT_NAME = 'cash_balance'; - /** - * @return string the API URL for this balance transaction - */ - public function instanceUrl() - { - $customer = $this['customer']; - $customer = Util\Util::utf8($customer); - $base = Customer::classUrl(); - $customerExtn = \urlencode($customer); - return "{$base}/{$customerExtn}/cash_balance"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Customer Cash Balance cannot be retrieved without a ' . 'customer ID. Retrieve a Customer Cash Balance using ' . "`Customer::retrieveCashBalance('customer_id')`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param string $_id - * @param null|array $_params - * @param null|array|string $_options - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function update($_id, $_params = null, $_options = null) - { - $msg = 'Customer Cash Balance cannot be updated without a ' . 'customer ID. Retrieve a Customer Cash Balance using ' . "`Customer::updateCashBalance('customer_id')`."; - throw new Exception\BadMethodCallException($msg); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Charge.php b/dependencies/stripe/stripe-php/lib/Charge.php deleted file mode 100644 index 85510f7..0000000 --- a/dependencies/stripe/stripe-php/lib/Charge.php +++ /dev/null @@ -1,155 +0,0 @@ -Charge object represents a single attempt to move money into your Stripe account. - * PaymentIntent confirmation is the most common way to create Charges, but transferring - * money to a different Stripe account through Connect also creates Charges. - * Some legacy payment flows create Charges directly, which is not recommended for new integrations. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $alternate_statement_descriptors - * @property int $amount Amount intended to be collected by this payment. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). - * @property int $amount_captured Amount in cents (or local equivalent) captured (can be less than the amount attribute on the charge if a partial capture was made). - * @property int $amount_refunded Amount in cents (or local equivalent) refunded (can be less than the amount attribute on the charge if a partial refund was issued). - * @property null|string|\Stripe\StripeObject $application ID of the Connect application that created the charge. - * @property null|string|\Stripe\ApplicationFee $application_fee The application fee (if any) for the charge. See the Connect documentation for details. - * @property null|int $application_fee_amount The amount of the application fee (if any) requested for the charge. See the Connect documentation for details. - * @property null|string $authorization_code Authorization code on the charge. - * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction that describes the impact of this charge on your account balance (not including refunds or disputes). - * @property \Stripe\StripeObject $billing_details - * @property null|string $calculated_statement_descriptor The full statement descriptor that is passed to card networks, and that is displayed on your customers' credit card and bank statements. Allows you to see what the statement descriptor looks like after the static and dynamic portions are combined. - * @property bool $captured If the charge was created without capturing, this Boolean represents whether it is still uncaptured or has since been captured. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string|\Stripe\Customer $customer ID of the customer this charge is for if one exists. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string|\Stripe\Account $destination ID of an existing, connected Stripe account to transfer funds to if transfer_data was specified in the charge request. - * @property null|string|\Stripe\Dispute $dispute Details about the dispute if the charge has been disputed. - * @property bool $disputed Whether the charge has been disputed. - * @property null|string|\Stripe\BalanceTransaction $failure_balance_transaction ID of the balance transaction that describes the reversal of the balance on your account due to payment failure. - * @property null|string $failure_code Error code explaining reason for charge failure if available (see the errors section for a list of codes). - * @property null|string $failure_message Message to user further explaining reason for charge failure if available. - * @property null|\Stripe\StripeObject $fraud_details Information on fraud assessments for the charge. - * @property null|string|\Stripe\Invoice $invoice ID of the invoice this charge is for if one exists. - * @property null|\Stripe\StripeObject $level3 - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string|\Stripe\Account $on_behalf_of The account (if any) the charge was made on behalf of without triggering an automatic transfer. See the Connect documentation for details. - * @property null|\Stripe\StripeObject $outcome Details about whether the payment was accepted, and why. See understanding declines for details. - * @property bool $paid true if the charge succeeded, or was successfully authorized for later capture. - * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the PaymentIntent associated with this charge, if one exists. - * @property null|string $payment_method ID of the payment method used in this charge. - * @property null|\Stripe\StripeObject $payment_method_details Details about the payment method at the time of the transaction. - * @property null|\Stripe\StripeObject $radar_options Options to configure Radar. See Radar Session for more information. - * @property null|string $receipt_email This is the email address that the receipt for this charge was sent to. - * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this charge. This attribute will be null until a receipt has been sent. - * @property null|string $receipt_url This is the URL to view the receipt for this charge. The receipt is kept up-to-date to the latest state of the charge, including any refunds. If the charge is for an Invoice, the receipt will be stylized as an Invoice receipt. - * @property bool $refunded Whether the charge has been fully refunded. If the charge is only partially refunded, this attribute will still be false. - * @property null|\Stripe\Collection<\Stripe\Refund> $refunds A list of refunds that have been applied to the charge. - * @property null|string|\Stripe\Review $review ID of the review associated with this charge if one exists. - * @property null|\Stripe\StripeObject $shipping Shipping information for the charge. - * @property null|\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source $source This is a legacy field that will be removed in the future. It contains the Source, Card, or BankAccount object used for the charge. For details about the payment method used for this charge, refer to payment_method or payment_method_details instead. - * @property null|string|\Stripe\Transfer $source_transfer The transfer ID which created this charge. Only present if the charge came from another Stripe account. See the Connect documentation for details. - * @property null|string $statement_descriptor For card charges, use statement_descriptor_suffix instead. Otherwise, you can use this value as the complete description of a charge on your customers’ statements. Must contain at least one letter, maximum 22 characters. - * @property null|string $statement_descriptor_suffix Provides information about the charge that customers see on their statements. Concatenated with the prefix (shortened descriptor) or statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters for the concatenated descriptor. - * @property string $status The status of the payment is either succeeded, pending, or failed. - * @property null|string|\Stripe\Transfer $transfer ID of the transfer to the destination account (only applicable if the charge was created using the destination parameter). - * @property null|\Stripe\StripeObject $transfer_data An optional dictionary including the account to automatically transfer to as part of a destination charge. See the Connect documentation for details. - * @property null|string $transfer_group A string that identifies this transaction as part of a group. See the Connect documentation for details. - */ -class Charge extends ApiResource -{ - const OBJECT_NAME = 'charge'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const STATUS_FAILED = 'failed'; - const STATUS_PENDING = 'pending'; - const STATUS_SUCCEEDED = 'succeeded'; - /** - * Possible string representations of decline codes. - * These strings are applicable to the decline_code property of the \Stripe\Exception\CardException exception. - * - * @see https://stripe.com/docs/declines/codes - */ - const DECLINED_AUTHENTICATION_REQUIRED = 'authentication_required'; - const DECLINED_APPROVE_WITH_ID = 'approve_with_id'; - const DECLINED_CALL_ISSUER = 'call_issuer'; - const DECLINED_CARD_NOT_SUPPORTED = 'card_not_supported'; - const DECLINED_CARD_VELOCITY_EXCEEDED = 'card_velocity_exceeded'; - const DECLINED_CURRENCY_NOT_SUPPORTED = 'currency_not_supported'; - const DECLINED_DO_NOT_HONOR = 'do_not_honor'; - const DECLINED_DO_NOT_TRY_AGAIN = 'do_not_try_again'; - const DECLINED_DUPLICATED_TRANSACTION = 'duplicate_transaction'; - const DECLINED_EXPIRED_CARD = 'expired_card'; - const DECLINED_FRAUDULENT = 'fraudulent'; - const DECLINED_GENERIC_DECLINE = 'generic_decline'; - const DECLINED_INCORRECT_NUMBER = 'incorrect_number'; - const DECLINED_INCORRECT_CVC = 'incorrect_cvc'; - const DECLINED_INCORRECT_PIN = 'incorrect_pin'; - const DECLINED_INCORRECT_ZIP = 'incorrect_zip'; - const DECLINED_INSUFFICIENT_FUNDS = 'insufficient_funds'; - const DECLINED_INVALID_ACCOUNT = 'invalid_account'; - const DECLINED_INVALID_AMOUNT = 'invalid_amount'; - const DECLINED_INVALID_CVC = 'invalid_cvc'; - const DECLINED_INVALID_EXPIRY_YEAR = 'invalid_expiry_year'; - const DECLINED_INVALID_NUMBER = 'invalid_number'; - const DECLINED_INVALID_PIN = 'invalid_pin'; - const DECLINED_ISSUER_NOT_AVAILABLE = 'issuer_not_available'; - const DECLINED_LOST_CARD = 'lost_card'; - const DECLINED_MERCHANT_BLACKLIST = 'merchant_blacklist'; - const DECLINED_NEW_ACCOUNT_INFORMATION_AVAILABLE = 'new_account_information_available'; - const DECLINED_NO_ACTION_TAKEN = 'no_action_taken'; - const DECLINED_NOT_PERMITTED = 'not_permitted'; - const DECLINED_OFFLINE_PIN_REQUIRED = 'offline_pin_required'; - const DECLINED_ONLINE_OR_OFFLINE_PIN_REQUIRED = 'online_or_offline_pin_required'; - const DECLINED_PICKUP_CARD = 'pickup_card'; - const DECLINED_PIN_TRY_EXCEEDED = 'pin_try_exceeded'; - const DECLINED_PROCESSING_ERROR = 'processing_error'; - const DECLINED_REENTER_TRANSACTION = 'reenter_transaction'; - const DECLINED_RESTRICTED_CARD = 'restricted_card'; - const DECLINED_REVOCATION_OF_ALL_AUTHORIZATIONS = 'revocation_of_all_authorizations'; - const DECLINED_REVOCATION_OF_AUTHORIZATION = 'revocation_of_authorization'; - const DECLINED_SECURITY_VIOLATION = 'security_violation'; - const DECLINED_SERVICE_NOT_ALLOWED = 'service_not_allowed'; - const DECLINED_STOLEN_CARD = 'stolen_card'; - const DECLINED_STOP_PAYMENT_ORDER = 'stop_payment_order'; - const DECLINED_TESTMODE_DECLINE = 'testmode_decline'; - const DECLINED_TRANSACTION_NOT_ALLOWED = 'transaction_not_allowed'; - const DECLINED_TRY_AGAIN_LATER = 'try_again_later'; - const DECLINED_WITHDRAWAL_COUNT_LIMIT_EXCEEDED = 'withdrawal_count_limit_exceeded'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Charge the captured charge - */ - public function capture($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/capture'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Charge> the charge search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/charges/search'; - return self::_searchResource($url, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Checkout/Session.php b/dependencies/stripe/stripe-php/lib/Checkout/Session.php deleted file mode 100644 index ed92e6c..0000000 --- a/dependencies/stripe/stripe-php/lib/Checkout/Session.php +++ /dev/null @@ -1,129 +0,0 @@ -Checkout - * or Payment Links. We recommend creating a - * new Session each time your customer attempts to pay. - * - * Once payment is successful, the Checkout Session will contain a reference - * to the Customer, and either the successful - * PaymentIntent or an active - * Subscription. - * - * You can create a Checkout Session on your server and redirect to its URL - * to begin Checkout. - * - * Related guide: Checkout quickstart - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $after_expiration When set, provides configuration for actions to take if this Checkout Session expires. - * @property null|bool $allow_promotion_codes Enables user redeemable promotion codes. - * @property null|int $amount_subtotal Total of all items before discounts or taxes are applied. - * @property null|int $amount_total Total of all items after discounts and taxes are applied. - * @property \Stripe\StripeObject $automatic_tax - * @property null|string $billing_address_collection Describes whether Checkout should collect the customer's billing address. - * @property null|string $cancel_url If set, Checkout displays a back button and customers will be directed to this URL if they decide to cancel payment and return to your website. - * @property null|string $client_reference_id A unique string to reference the Checkout Session. This can be a customer ID, a cart ID, or similar, and can be used to reconcile the Session with your internal systems. - * @property null|\Stripe\StripeObject $consent Results of consent_collection for this session. - * @property null|\Stripe\StripeObject $consent_collection When set, provides configuration for the Checkout Session to gather active consent from customers. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|\Stripe\StripeObject $currency_conversion Currency conversion details for automatic currency conversion sessions - * @property \Stripe\StripeObject[] $custom_fields Collect additional information from your customer using custom fields. Up to 2 fields are supported. - * @property \Stripe\StripeObject $custom_text - * @property null|string|\Stripe\Customer $customer The ID of the customer for this Session. For Checkout Sessions in payment or subscription mode, Checkout will create a new customer object based on information provided during the payment flow unless an existing customer was provided when the Session was created. - * @property null|string $customer_creation Configure whether a Checkout Session creates a Customer when the Checkout Session completes. - * @property null|\Stripe\StripeObject $customer_details The customer details including the customer's tax exempt status and the customer's tax IDs. Only the customer's email is present on Sessions in setup mode. - * @property null|string $customer_email If provided, this value will be used when the Customer object is created. If not provided, customers will be asked to enter their email address. Use this parameter to prefill customer data if you already have an email on file. To access information about the customer once the payment flow is complete, use the customer attribute. - * @property int $expires_at The timestamp at which the Checkout Session will expire. - * @property null|string|\Stripe\Invoice $invoice ID of the invoice created by the Checkout Session, if it exists. - * @property null|\Stripe\StripeObject $invoice_creation Details on the state of invoice creation for the Checkout Session. - * @property null|\Stripe\Collection<\Stripe\LineItem> $line_items The line items purchased by the customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $locale The IETF language tag of the locale Checkout is displayed in. If blank or auto, the browser's locale is used. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $mode The mode of the Checkout Session. - * @property null|string|\Stripe\PaymentIntent $payment_intent The ID of the PaymentIntent for Checkout Sessions in payment mode. - * @property null|string|\Stripe\PaymentLink $payment_link The ID of the Payment Link that created this Session. - * @property null|string $payment_method_collection Configure whether a Checkout Session should collect a payment method. - * @property null|\Stripe\StripeObject $payment_method_options Payment-method-specific configuration for the PaymentIntent or SetupIntent of this CheckoutSession. - * @property string[] $payment_method_types A list of the types of payment methods (e.g. card) this Checkout Session is allowed to accept. - * @property string $payment_status The payment status of the Checkout Session, one of paid, unpaid, or no_payment_required. You can use this value to decide when to fulfill your customer's order. - * @property null|\Stripe\StripeObject $phone_number_collection - * @property null|string $recovered_from The ID of the original expired Checkout Session that triggered the recovery flow. - * @property null|string|\Stripe\SetupIntent $setup_intent The ID of the SetupIntent for Checkout Sessions in setup mode. - * @property null|\Stripe\StripeObject $shipping_address_collection When set, provides configuration for Checkout to collect a shipping address from a customer. - * @property null|\Stripe\StripeObject $shipping_cost The details of the customer cost of shipping, including the customer chosen ShippingRate. - * @property null|\Stripe\StripeObject $shipping_details Shipping information for this Checkout Session. - * @property \Stripe\StripeObject[] $shipping_options The shipping rate options applied to this Session. - * @property null|string $status The status of the Checkout Session, one of open, complete, or expired. - * @property null|string $submit_type Describes the type of transaction being performed by Checkout in order to customize relevant text on the page, such as the submit button. submit_type can only be specified on Checkout Sessions in payment mode, but not Checkout Sessions in subscription or setup mode. - * @property null|string|\Stripe\Subscription $subscription The ID of the subscription for Checkout Sessions in subscription mode. - * @property null|string $success_url The URL the customer will be directed to after the payment or subscription creation is successful. - * @property null|\Stripe\StripeObject $tax_id_collection - * @property null|\Stripe\StripeObject $total_details Tax and discount details for the computed total amount. - * @property null|string $url The URL to the Checkout Session. Redirect customers to this URL to take them to Checkout. If you’re using Custom Domains, the URL will use your subdomain. Otherwise, it’ll use checkout.stripe.com. This value is only present when the session is active. - */ -class Session extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'checkout.session'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const BILLING_ADDRESS_COLLECTION_AUTO = 'auto'; - const BILLING_ADDRESS_COLLECTION_REQUIRED = 'required'; - const CUSTOMER_CREATION_ALWAYS = 'always'; - const CUSTOMER_CREATION_IF_REQUIRED = 'if_required'; - const MODE_PAYMENT = 'payment'; - const MODE_SETUP = 'setup'; - const MODE_SUBSCRIPTION = 'subscription'; - const PAYMENT_METHOD_COLLECTION_ALWAYS = 'always'; - const PAYMENT_METHOD_COLLECTION_IF_REQUIRED = 'if_required'; - const PAYMENT_STATUS_NO_PAYMENT_REQUIRED = 'no_payment_required'; - const PAYMENT_STATUS_PAID = 'paid'; - const PAYMENT_STATUS_UNPAID = 'unpaid'; - const STATUS_COMPLETE = 'complete'; - const STATUS_EXPIRED = 'expired'; - const STATUS_OPEN = 'open'; - const SUBMIT_TYPE_AUTO = 'auto'; - const SUBMIT_TYPE_BOOK = 'book'; - const SUBMIT_TYPE_DONATE = 'donate'; - const SUBMIT_TYPE_PAY = 'pay'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Checkout\Session the expired session - */ - public function expire($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/expire'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> list of line items - */ - public static function allLineItems($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/line_items'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Collection.php b/dependencies/stripe/stripe-php/lib/Collection.php deleted file mode 100644 index 8b8e066..0000000 --- a/dependencies/stripe/stripe-php/lib/Collection.php +++ /dev/null @@ -1,259 +0,0 @@ - - * - * @property string $object - * @property string $url - * @property bool $has_more - * @property TStripeObject[] $data - */ -class Collection extends StripeObject implements \Countable, \IteratorAggregate -{ - const OBJECT_NAME = 'list'; - use ApiOperations\Request; - /** @var array */ - protected $filters = []; - /** - * @return string the base URL for the given class - */ - public static function baseUrl() - { - return Stripe::$apiBase; - } - /** - * Returns the filters. - * - * @return array the filters - */ - public function getFilters() - { - return $this->filters; - } - /** - * Sets the filters, removing paging options. - * - * @param array $filters the filters - */ - public function setFilters($filters) - { - $this->filters = $filters; - } - /** - * @return mixed - */ - #[\ReturnTypeWillChange] - public function offsetGet($k) - { - if (\is_string($k)) { - return parent::offsetGet($k); - } - $msg = "You tried to access the {$k} index, but Collection " . 'types only support string keys. (HINT: List calls ' . 'return an object with a `data` (which is the data ' . "array). You likely want to call ->data[{$k}])"; - throw new Exception\InvalidArgumentException($msg); - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws Exception\ApiErrorException - * - * @return Collection - */ - public function all($params = null, $opts = null) - { - self::_validateParams($params); - list($url, $params) = $this->extractPathAndUpdateParams($params); - list($response, $opts) = $this->_request('get', $url, $params, $opts); - $obj = Util\Util::convertToStripeObject($response, $opts); - if (!$obj instanceof \WP_Ultimo\Dependencies\Stripe\Collection) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\UnexpectedValueException('Expected type ' . \WP_Ultimo\Dependencies\Stripe\Collection::class . ', got "' . \get_class($obj) . '" instead.'); - } - $obj->setFilters($params); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws Exception\ApiErrorException - * - * @return TStripeObject - */ - public function create($params = null, $opts = null) - { - self::_validateParams($params); - list($url, $params) = $this->extractPathAndUpdateParams($params); - list($response, $opts) = $this->_request('post', $url, $params, $opts); - return Util\Util::convertToStripeObject($response, $opts); - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws Exception\ApiErrorException - * - * @return TStripeObject - */ - public function retrieve($id, $params = null, $opts = null) - { - self::_validateParams($params); - list($url, $params) = $this->extractPathAndUpdateParams($params); - $id = Util\Util::utf8($id); - $extn = \urlencode($id); - list($response, $opts) = $this->_request('get', "{$url}/{$extn}", $params, $opts); - return Util\Util::convertToStripeObject($response, $opts); - } - /** - * @return int the number of objects in the current page - */ - #[\ReturnTypeWillChange] - public function count() - { - return \count($this->data); - } - /** - * @return \ArrayIterator an iterator that can be used to iterate - * across objects in the current page - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->data); - } - /** - * @return \ArrayIterator an iterator that can be used to iterate - * backwards across objects in the current page - */ - public function getReverseIterator() - { - return new \ArrayIterator(\array_reverse($this->data)); - } - /** - * @return \Generator|TStripeObject[] A generator that can be used to - * iterate across all objects across all pages. As page boundaries are - * encountered, the next page will be fetched automatically for - * continued iteration. - */ - public function autoPagingIterator() - { - $page = $this; - while (\true) { - $filters = $this->filters ?: []; - if (\array_key_exists('ending_before', $filters) && !\array_key_exists('starting_after', $filters)) { - foreach ($page->getReverseIterator() as $item) { - (yield $item); - } - $page = $page->previousPage(); - } else { - foreach ($page as $item) { - (yield $item); - } - $page = $page->nextPage(); - } - if ($page->isEmpty()) { - break; - } - } - } - /** - * Returns an empty collection. This is returned from {@see nextPage()} - * when we know that there isn't a next page in order to replicate the - * behavior of the API when it attempts to return a page beyond the last. - * - * @param null|array|string $opts - * - * @return Collection - */ - public static function emptyCollection($opts = null) - { - return Collection::constructFrom(['data' => []], $opts); - } - /** - * Returns true if the page object contains no element. - * - * @return bool - */ - public function isEmpty() - { - return empty($this->data); - } - /** - * Fetches the next page in the resource list (if there is one). - * - * This method will try to respect the limit of the current page. If none - * was given, the default limit will be fetched again. - * - * @param null|array $params - * @param null|array|string $opts - * - * @return Collection - */ - public function nextPage($params = null, $opts = null) - { - if (!$this->has_more) { - return static::emptyCollection($opts); - } - $lastId = \end($this->data)->id; - $params = \array_merge($this->filters ?: [], ['starting_after' => $lastId], $params ?: []); - return $this->all($params, $opts); - } - /** - * Fetches the previous page in the resource list (if there is one). - * - * This method will try to respect the limit of the current page. If none - * was given, the default limit will be fetched again. - * - * @param null|array $params - * @param null|array|string $opts - * - * @return Collection - */ - public function previousPage($params = null, $opts = null) - { - if (!$this->has_more) { - return static::emptyCollection($opts); - } - $firstId = $this->data[0]->id; - $params = \array_merge($this->filters ?: [], ['ending_before' => $firstId], $params ?: []); - return $this->all($params, $opts); - } - /** - * Gets the first item from the current page. Returns `null` if the current page is empty. - * - * @return null|TStripeObject - */ - public function first() - { - return \count($this->data) > 0 ? $this->data[0] : null; - } - /** - * Gets the last item from the current page. Returns `null` if the current page is empty. - * - * @return null|TStripeObject - */ - public function last() - { - return \count($this->data) > 0 ? $this->data[\count($this->data) - 1] : null; - } - private function extractPathAndUpdateParams($params) - { - $url = \parse_url($this->url); - if (!isset($url['path'])) { - throw new Exception\UnexpectedValueException("Could not parse list url into parts: {$url}"); - } - if (isset($url['query'])) { - // If the URL contains a query param, parse it out into $params so they - // don't interact weirdly with each other. - $query = []; - \parse_str($url['query'], $query); - $params = \array_merge($params ?: [], $query); - } - return [$url['path'], $params]; - } -} diff --git a/dependencies/stripe/stripe-php/lib/CountrySpec.php b/dependencies/stripe/stripe-php/lib/CountrySpec.php deleted file mode 100644 index 969977d..0000000 --- a/dependencies/stripe/stripe-php/lib/CountrySpec.php +++ /dev/null @@ -1,28 +0,0 @@ -an online - * guide. - * - * @property string $id Unique identifier for the object. Represented as the ISO country code for this country. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property string $default_currency The default currency for this country. This applies to both payment methods and bank accounts. - * @property \Stripe\StripeObject $supported_bank_account_currencies Currencies that can be accepted in the specific country (for transfers). - * @property string[] $supported_payment_currencies Currencies that can be accepted in the specified country (for payments). - * @property string[] $supported_payment_methods Payment methods available in the specified country. You may need to enable some payment methods (e.g., ACH) on your account before they appear in this list. The stripe payment method refers to charging through your platform. - * @property string[] $supported_transfer_countries Countries that can accept transfers from the specified country. - * @property \Stripe\StripeObject $verification_fields - */ -class CountrySpec extends ApiResource -{ - const OBJECT_NAME = 'country_spec'; - use ApiOperations\All; - use ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/Coupon.php b/dependencies/stripe/stripe-php/lib/Coupon.php deleted file mode 100644 index 813e9af..0000000 --- a/dependencies/stripe/stripe-php/lib/Coupon.php +++ /dev/null @@ -1,40 +0,0 @@ -subscriptions, invoices, - * checkout sessions, quotes, and more. Coupons do not work with conventional one-off charges or payment intents. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|int $amount_off Amount (in the currency specified) that will be taken off the subtotal of any invoices for this customer. - * @property null|\Stripe\StripeObject $applies_to - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $currency If amount_off has been set, the three-letter ISO code for the currency of the amount to take off. - * @property null|\Stripe\StripeObject $currency_options Coupons defined in each available currency option. Each key must be a three-letter ISO currency code and a supported currency. - * @property string $duration One of forever, once, and repeating. Describes how long a customer who applies this coupon will get the discount. - * @property null|int $duration_in_months If duration is repeating, the number of months the coupon applies. Null if coupon duration is forever or once. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|int $max_redemptions Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $name Name of the coupon displayed to customers on for instance invoices or receipts. - * @property null|float $percent_off Percent that will be taken off the subtotal of any invoices for this customer for the duration of the coupon. For example, a coupon with percent_off of 50 will make a $ (or local equivalent)100 invoice $ (or local equivalent)50 instead. - * @property null|int $redeem_by Date after which the coupon can no longer be redeemed. - * @property int $times_redeemed Number of times this coupon has been applied to a customer. - * @property bool $valid Taking account of the above properties, whether this coupon can still be applied to a customer. - */ -class Coupon extends ApiResource -{ - const OBJECT_NAME = 'coupon'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const DURATION_FOREVER = 'forever'; - const DURATION_ONCE = 'once'; - const DURATION_REPEATING = 'repeating'; -} diff --git a/dependencies/stripe/stripe-php/lib/CreditNote.php b/dependencies/stripe/stripe-php/lib/CreditNote.php deleted file mode 100644 index a6bd0a3..0000000 --- a/dependencies/stripe/stripe-php/lib/CreditNote.php +++ /dev/null @@ -1,119 +0,0 @@ -Credit notes - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount The integer amount in cents (or local equivalent) representing the total amount of the credit note, including tax. - * @property int $amount_shipping This is the sum of all the shipping amounts. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string|\Stripe\Customer $customer ID of the customer. - * @property null|string|\Stripe\CustomerBalanceTransaction $customer_balance_transaction Customer balance transaction related to this credit note. - * @property int $discount_amount The integer amount in cents (or local equivalent) representing the total amount of discount that was credited. - * @property \Stripe\StripeObject[] $discount_amounts The aggregate amounts calculated per discount for all line items. - * @property null|int $effective_at The date when this credit note is in effect. Same as created unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF. - * @property string|\Stripe\Invoice $invoice ID of the invoice. - * @property \Stripe\Collection<\Stripe\CreditNoteLineItem> $lines Line items that make up the credit note - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $memo Customer-facing text that appears on the credit note PDF. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $number A unique number that identifies this particular credit note and appears on the PDF of the credit note and its associated invoice. - * @property null|int $out_of_band_amount Amount that was credited outside of Stripe. - * @property string $pdf The link to download the PDF of the credit note. - * @property null|string $reason Reason for issuing this credit note, one of duplicate, fraudulent, order_change, or product_unsatisfactory - * @property null|string|\Stripe\Refund $refund Refund related to this credit note. - * @property null|\Stripe\StripeObject $shipping_cost The details of the cost of shipping, including the ShippingRate applied to the invoice. - * @property string $status Status of this credit note, one of issued or void. Learn more about voiding credit notes. - * @property int $subtotal The integer amount in cents (or local equivalent) representing the amount of the credit note, excluding exclusive tax and invoice level discounts. - * @property null|int $subtotal_excluding_tax The integer amount in cents (or local equivalent) representing the amount of the credit note, excluding all tax and invoice level discounts. - * @property \Stripe\StripeObject[] $tax_amounts The aggregate amounts calculated per tax rate for all line items. - * @property int $total The integer amount in cents (or local equivalent) representing the total amount of the credit note, including tax and all discount. - * @property null|int $total_excluding_tax The integer amount in cents (or local equivalent) representing the total amount of the credit note, excluding tax, but including discounts. - * @property string $type Type of this credit note, one of pre_payment or post_payment. A pre_payment credit note means it was issued when the invoice was open. A post_payment credit note means it was issued when the invoice was paid. - * @property null|int $voided_at The time that the credit note was voided. - */ -class CreditNote extends ApiResource -{ - const OBJECT_NAME = 'credit_note'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\NestedResource; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const REASON_DUPLICATE = 'duplicate'; - const REASON_FRAUDULENT = 'fraudulent'; - const REASON_ORDER_CHANGE = 'order_change'; - const REASON_PRODUCT_UNSATISFACTORY = 'product_unsatisfactory'; - const STATUS_ISSUED = 'issued'; - const STATUS_VOID = 'void'; - const TYPE_POST_PAYMENT = 'post_payment'; - const TYPE_PRE_PAYMENT = 'pre_payment'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote the previewed credit note - */ - public static function preview($params = null, $opts = null) - { - $url = static::classUrl() . '/preview'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> list of credit note line items - */ - public static function previewLines($params = null, $opts = null) - { - $url = static::classUrl() . '/preview/lines'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote the voided credit note - */ - public function voidCreditNote($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/void'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - const PATH_LINES = '/lines'; - /** - * @param string $id the ID of the credit note on which to retrieve the credit note line items - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> the list of credit note line items - */ - public static function allLines($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_LINES, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/CreditNoteLineItem.php b/dependencies/stripe/stripe-php/lib/CreditNoteLineItem.php deleted file mode 100644 index 98dc881..0000000 --- a/dependencies/stripe/stripe-php/lib/CreditNoteLineItem.php +++ /dev/null @@ -1,29 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|int $quantity The number of units of product being credited. - * @property \Stripe\StripeObject[] $tax_amounts The amount of tax calculated per tax rate for this line item - * @property \Stripe\TaxRate[] $tax_rates The tax rates which apply to the line item. - * @property string $type The type of the credit note line item, one of invoice_line_item or custom_line_item. When the type is invoice_line_item there is an additional invoice_line_item property on the resource the value of which is the id of the credited line item on the invoice. - * @property null|int $unit_amount The cost of each unit of product being credited. - * @property null|string $unit_amount_decimal Same as unit_amount, but contains a decimal value with at most 12 decimal places. - * @property null|string $unit_amount_excluding_tax The amount in cents (or local equivalent) representing the unit amount being credited for this line item, excluding all tax and discounts. - */ -class CreditNoteLineItem extends ApiResource -{ - const OBJECT_NAME = 'credit_note_line_item'; -} diff --git a/dependencies/stripe/stripe-php/lib/Customer.php b/dependencies/stripe/stripe-php/lib/Customer.php deleted file mode 100644 index e23b28e..0000000 --- a/dependencies/stripe/stripe-php/lib/Customer.php +++ /dev/null @@ -1,357 +0,0 @@ -Save a card during payment - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $address The customer's address. - * @property null|int $balance Current balance, if any, being stored on the customer. If negative, the customer has credit to apply to their next invoice. If positive, the customer has an amount owed that will be added to their next invoice. The balance does not refer to any unpaid invoices; it solely takes into account amounts that have yet to be successfully applied to any invoice. This balance is only taken into account as invoices are finalized. - * @property null|\Stripe\CashBalance $cash_balance The current funds being held by Stripe on behalf of the customer. These funds can be applied towards payment intents with source "cash_balance". The settings[reconciliation_mode] field describes whether these funds are applied to such payment intents manually or automatically. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $currency Three-letter ISO code for the currency the customer can be charged in for recurring billing purposes. - * @property null|string|\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source $default_source

      ID of the default payment source for the customer.

      If you are using payment methods created via the PaymentMethods API, see the invoice_settings.default_payment_method field instead.

      - * @property null|bool $delinquent

      When the customer's latest invoice is billed by charging automatically, delinquent is true if the invoice's latest charge failed. When the customer's latest invoice is billed by sending an invoice, delinquent is true if the invoice isn't paid by its due date.

      If an invoice is marked uncollectible by dunning, delinquent doesn't get reset to false.

      - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|\Stripe\Discount $discount Describes the current discount active on the customer, if there is one. - * @property null|string $email The customer's email address. - * @property null|\Stripe\StripeObject $invoice_credit_balance The current multi-currency balances, if any, being stored on the customer. If positive in a currency, the customer has a credit to apply to their next invoice denominated in that currency. If negative, the customer has an amount owed that will be added to their next invoice denominated in that currency. These balances do not refer to any unpaid invoices. They solely track amounts that have yet to be successfully applied to any invoice. A balance in a particular currency is only applied to any invoice as an invoice in that currency is finalized. - * @property null|string $invoice_prefix The prefix for the customer used to generate unique invoice numbers. - * @property null|\Stripe\StripeObject $invoice_settings - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $name The customer's full name or business name. - * @property null|int $next_invoice_sequence The suffix of the customer's next invoice number, e.g., 0001. - * @property null|string $phone The customer's phone number. - * @property null|string[] $preferred_locales The customer's preferred locales (languages), ordered by preference. - * @property null|\Stripe\StripeObject $shipping Mailing and shipping address for the customer. Appears on invoices emailed to this customer. - * @property null|\Stripe\Collection<\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source> $sources The customer's payment sources, if any. - * @property null|\Stripe\Collection<\Stripe\Subscription> $subscriptions The customer's current subscriptions, if any. - * @property null|\Stripe\StripeObject $tax - * @property null|string $tax_exempt Describes the customer's tax exemption status. One of none, exempt, or reverse. When set to reverse, invoice and receipt PDFs include the text "Reverse charge". - * @property null|\Stripe\Collection<\Stripe\TaxId> $tax_ids The customer's tax IDs. - * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this customer belongs to. - */ -class Customer extends ApiResource -{ - const OBJECT_NAME = 'customer'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\NestedResource; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const TAX_EXEMPT_EXEMPT = 'exempt'; - const TAX_EXEMPT_NONE = 'none'; - const TAX_EXEMPT_REVERSE = 'reverse'; - public static function getSavedNestedResources() - { - static $savedNestedResources = null; - if (null === $savedNestedResources) { - $savedNestedResources = new Util\Set(['source']); - } - return $savedNestedResources; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @return \Stripe\Customer the updated customer - */ - public function deleteDiscount($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/discount'; - list($response, $opts) = $this->_request('delete', $url, $params, $opts); - $this->refreshFrom(['discount' => null], $opts, \true); - return $this; - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\PaymentMethod> list of payment methods - */ - public static function allPaymentMethods($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/payment_methods'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param string $payment_method - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod the retrieved payment method - */ - public function retrievePaymentMethod($payment_method, $params = null, $opts = null) - { - $url = $this->instanceUrl() . '/payment_methods/' . $payment_method; - list($response, $opts) = $this->_request('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Customer> the customer search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/customers/search'; - return self::_searchResource($url, $params, $opts); - } - const PATH_CASH_BALANCE = '/cash_balance'; - /** - * @param string $id the ID of the customer to which the cash balance belongs - * @param null|array $params - * @param null|array|string $opts - * @param mixed $cashBalanceId - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CashBalance - */ - public static function retrieveCashBalance($id, $cashBalanceId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_CASH_BALANCE, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the cash balance belongs - * @param null|array $params - * @param null|array|string $opts - * @param mixed $cashBalanceId - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CashBalance - */ - public static function updateCashBalance($id, $cashBalanceId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_CASH_BALANCE, $params, $opts); - } - const PATH_BALANCE_TRANSACTIONS = '/balance_transactions'; - /** - * @param string $id the ID of the customer on which to retrieve the customer balance transactions - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CustomerBalanceTransaction> the list of customer balance transactions - */ - public static function allBalanceTransactions($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts); - } - /** - * @param string $id the ID of the customer on which to create the customer balance transaction - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerBalanceTransaction - */ - public static function createBalanceTransaction($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the customer balance transaction belongs - * @param string $balanceTransactionId the ID of the customer balance transaction to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerBalanceTransaction - */ - public static function retrieveBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the customer balance transaction belongs - * @param string $balanceTransactionId the ID of the customer balance transaction to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerBalanceTransaction - */ - public static function updateBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts); - } - const PATH_CASH_BALANCE_TRANSACTIONS = '/cash_balance_transactions'; - /** - * @param string $id the ID of the customer on which to retrieve the customer cash balance transactions - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CustomerCashBalanceTransaction> the list of customer cash balance transactions - */ - public static function allCashBalanceTransactions($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_CASH_BALANCE_TRANSACTIONS, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the customer cash balance transaction belongs - * @param string $cashBalanceTransactionId the ID of the customer cash balance transaction to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerCashBalanceTransaction - */ - public static function retrieveCashBalanceTransaction($id, $cashBalanceTransactionId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_CASH_BALANCE_TRANSACTIONS, $cashBalanceTransactionId, $params, $opts); - } - const PATH_SOURCES = '/sources'; - /** - * @param string $id the ID of the customer on which to retrieve the payment sources - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\BankAccount|\Stripe\Card|\Stripe\Source> the list of payment sources (BankAccount, Card or Source) - */ - public static function allSources($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_SOURCES, $params, $opts); - } - /** - * @param string $id the ID of the customer on which to create the payment source - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public static function createSource($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_SOURCES, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the payment source belongs - * @param string $sourceId the ID of the payment source to delete - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public static function deleteSource($id, $sourceId, $params = null, $opts = null) - { - return self::_deleteNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the payment source belongs - * @param string $sourceId the ID of the payment source to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public static function retrieveSource($id, $sourceId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the payment source belongs - * @param string $sourceId the ID of the payment source to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public static function updateSource($id, $sourceId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); - } - const PATH_TAX_IDS = '/tax_ids'; - /** - * @param string $id the ID of the customer on which to retrieve the tax ids - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\TaxId> the list of tax ids - */ - public static function allTaxIds($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_TAX_IDS, $params, $opts); - } - /** - * @param string $id the ID of the customer on which to create the tax id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxId - */ - public static function createTaxId($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_TAX_IDS, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the tax id belongs - * @param string $taxIdId the ID of the tax id to delete - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxId - */ - public static function deleteTaxId($id, $taxIdId, $params = null, $opts = null) - { - return self::_deleteNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts); - } - /** - * @param string $id the ID of the customer to which the tax id belongs - * @param string $taxIdId the ID of the tax id to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxId - */ - public static function retrieveTaxId($id, $taxIdId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/CustomerBalanceTransaction.php b/dependencies/stripe/stripe-php/lib/CustomerBalanceTransaction.php deleted file mode 100644 index 63c8951..0000000 --- a/dependencies/stripe/stripe-php/lib/CustomerBalanceTransaction.php +++ /dev/null @@ -1,80 +0,0 @@ -Balance value, - * which denotes a debit or credit that's automatically applied to their next invoice upon finalization. - * You may modify the value directly by using the update customer API, - * or by creating a Customer Balance Transaction, which increments or decrements the customer's balance by the specified amount. - * - * Related guide: Customer balance - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount The amount of the transaction. A negative value is a credit for the customer's balance, and a positive value is a debit to the customer's balance. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string|\Stripe\CreditNote $credit_note The ID of the credit note (if any) related to the transaction. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string|\Stripe\Customer $customer The ID of the customer the transaction belongs to. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property int $ending_balance The customer's balance after the transaction was applied. A negative value decreases the amount due on the customer's next invoice. A positive value increases the amount due on the customer's next invoice. - * @property null|string|\Stripe\Invoice $invoice The ID of the invoice (if any) related to the transaction. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $type Transaction type: adjustment, applied_to_invoice, credit_note, initial, invoice_overpaid, invoice_too_large, invoice_too_small, unspent_receiver_credit, or unapplied_from_invoice. See the Customer Balance page to learn more about transaction types. - */ -class CustomerBalanceTransaction extends ApiResource -{ - const OBJECT_NAME = 'customer_balance_transaction'; - const TYPE_ADJUSTMENT = 'adjustment'; - const TYPE_APPLIED_TO_INVOICE = 'applied_to_invoice'; - const TYPE_CREDIT_NOTE = 'credit_note'; - const TYPE_INITIAL = 'initial'; - const TYPE_INVOICE_OVERPAID = 'invoice_overpaid'; - const TYPE_INVOICE_TOO_LARGE = 'invoice_too_large'; - const TYPE_INVOICE_TOO_SMALL = 'invoice_too_small'; - const TYPE_UNSPENT_RECEIVER_CREDIT = 'unspent_receiver_credit'; - const TYPE_ADJUSTEMENT = 'adjustment'; - /** - * @return string the API URL for this balance transaction - */ - public function instanceUrl() - { - $id = $this['id']; - $customer = $this['customer']; - if (!$id) { - throw new Exception\UnexpectedValueException("Could not determine which URL to request: class instance has invalid ID: {$id}", null); - } - $id = Util\Util::utf8($id); - $customer = Util\Util::utf8($customer); - $base = Customer::classUrl(); - $customerExtn = \urlencode($customer); - $extn = \urlencode($id); - return "{$base}/{$customerExtn}/balance_transactions/{$extn}"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Customer Balance Transactions cannot be retrieved without a ' . 'customer ID. Retrieve a Customer Balance Transaction using ' . "`Customer::retrieveBalanceTransaction('customer_id', " . "'balance_transaction_id')`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param string $_id - * @param null|array $_params - * @param null|array|string $_options - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function update($_id, $_params = null, $_options = null) - { - $msg = 'Customer Balance Transactions cannot be updated without a ' . 'customer ID. Update a Customer Balance Transaction using ' . "`Customer::updateBalanceTransaction('customer_id', " . "'balance_transaction_id', \$updateParams)`."; - throw new Exception\BadMethodCallException($msg); - } -} diff --git a/dependencies/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php b/dependencies/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php deleted file mode 100644 index c36e2dd..0000000 --- a/dependencies/stripe/stripe-php/lib/CustomerCashBalanceTransaction.php +++ /dev/null @@ -1,40 +0,0 @@ -ISO currency code, in lowercase. Must be a supported currency. - * @property string|\Stripe\Customer $customer The customer whose available cash balance changed as a result of this transaction. - * @property int $ending_balance The total available cash balance for the specified currency after this transaction was applied. Represented in the smallest currency unit. - * @property null|\Stripe\StripeObject $funded - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property int $net_amount The amount by which the cash balance changed, represented in the smallest currency unit. A positive value represents funds being added to the cash balance, a negative value represents funds being removed from the cash balance. - * @property null|\Stripe\StripeObject $refunded_from_payment - * @property string $type The type of the cash balance transaction. New types may be added in future. See Customer Balance to learn more about these types. - * @property null|\Stripe\StripeObject $unapplied_from_payment - */ -class CustomerCashBalanceTransaction extends ApiResource -{ - const OBJECT_NAME = 'customer_cash_balance_transaction'; - use ApiOperations\All; - use ApiOperations\Retrieve; - const TYPE_ADJUSTED_FOR_OVERDRAFT = 'adjusted_for_overdraft'; - const TYPE_APPLIED_TO_PAYMENT = 'applied_to_payment'; - const TYPE_FUNDED = 'funded'; - const TYPE_FUNDING_REVERSED = 'funding_reversed'; - const TYPE_REFUNDED_FROM_PAYMENT = 'refunded_from_payment'; - const TYPE_RETURN_CANCELED = 'return_canceled'; - const TYPE_RETURN_INITIATED = 'return_initiated'; - const TYPE_UNAPPLIED_FROM_PAYMENT = 'unapplied_from_payment'; -} diff --git a/dependencies/stripe/stripe-php/lib/Discount.php b/dependencies/stripe/stripe-php/lib/Discount.php deleted file mode 100644 index dfcb460..0000000 --- a/dependencies/stripe/stripe-php/lib/Discount.php +++ /dev/null @@ -1,23 +0,0 @@ -Disputes and - * Fraud documentation. - * - * Related guide: Disputes and fraud - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Disputed amount. Usually the amount of the charge, but can differ (usually because of currency fluctuation or because only part of the order is disputed). - * @property \Stripe\BalanceTransaction[] $balance_transactions List of zero, one, or two balance transactions that show funds withdrawn and reinstated to your Stripe account as a result of this dispute. - * @property string|\Stripe\Charge $charge ID of the charge that was disputed. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property \Stripe\StripeObject $evidence - * @property \Stripe\StripeObject $evidence_details - * @property bool $is_charge_refundable If true, it is still possible to refund the disputed payment. Once the payment has been fully refunded, no further funds will be withdrawn from your Stripe account as a result of this dispute. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $network_reason_code Network-dependent reason code for the dispute. - * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the PaymentIntent that was disputed. - * @property string $reason Reason given by cardholder for dispute. Possible values are bank_cannot_process, check_returned, credit_not_processed, customer_initiated, debit_not_authorized, duplicate, fraudulent, general, incorrect_account_details, insufficient_funds, product_not_received, product_unacceptable, subscription_canceled, or unrecognized. Read more about dispute reasons. - * @property string $status Current status of dispute. Possible values are warning_needs_response, warning_under_review, warning_closed, needs_response, under_review, charge_refunded, won, or lost. - */ -class Dispute extends ApiResource -{ - const OBJECT_NAME = 'dispute'; - use ApiOperations\All; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const REASON_BANK_CANNOT_PROCESS = 'bank_cannot_process'; - const REASON_CHECK_RETURNED = 'check_returned'; - const REASON_CREDIT_NOT_PROCESSED = 'credit_not_processed'; - const REASON_CUSTOMER_INITIATED = 'customer_initiated'; - const REASON_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; - const REASON_DUPLICATE = 'duplicate'; - const REASON_FRAUDULENT = 'fraudulent'; - const REASON_GENERAL = 'general'; - const REASON_INCORRECT_ACCOUNT_DETAILS = 'incorrect_account_details'; - const REASON_INSUFFICIENT_FUNDS = 'insufficient_funds'; - const REASON_PRODUCT_NOT_RECEIVED = 'product_not_received'; - const REASON_PRODUCT_UNACCEPTABLE = 'product_unacceptable'; - const REASON_SUBSCRIPTION_CANCELED = 'subscription_canceled'; - const REASON_UNRECOGNIZED = 'unrecognized'; - const STATUS_CHARGE_REFUNDED = 'charge_refunded'; - const STATUS_LOST = 'lost'; - const STATUS_NEEDS_RESPONSE = 'needs_response'; - const STATUS_UNDER_REVIEW = 'under_review'; - const STATUS_WARNING_CLOSED = 'warning_closed'; - const STATUS_WARNING_NEEDS_RESPONSE = 'warning_needs_response'; - const STATUS_WARNING_UNDER_REVIEW = 'warning_under_review'; - const STATUS_WON = 'won'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Dispute the closed dispute - */ - public function close($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/close'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/EphemeralKey.php b/dependencies/stripe/stripe-php/lib/EphemeralKey.php deleted file mode 100644 index 1b72260..0000000 --- a/dependencies/stripe/stripe-php/lib/EphemeralKey.php +++ /dev/null @@ -1,37 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $secret The key's secret. You can use this value to make authorized requests to the Stripe API. - */ -class EphemeralKey extends ApiResource -{ - const OBJECT_NAME = 'ephemeral_key'; - use ApiOperations\Create { - create as protected _create; - } - use ApiOperations\Delete; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\InvalidArgumentException if stripe_version is missing - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\EphemeralKey the created key - */ - public static function create($params = null, $opts = null) - { - if (!$opts || !isset($opts['stripe_version'])) { - throw new Exception\InvalidArgumentException('stripe_version must be specified to create an ephemeral key'); - } - return self::_create($params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/ErrorObject.php b/dependencies/stripe/stripe-php/lib/ErrorObject.php deleted file mode 100644 index 2510cf8..0000000 --- a/dependencies/stripe/stripe-php/lib/ErrorObject.php +++ /dev/null @@ -1,218 +0,0 @@ - null, 'code' => null, 'decline_code' => null, 'doc_url' => null, 'message' => null, 'param' => null, 'payment_intent' => null, 'payment_method' => null, 'setup_intent' => null, 'source' => null, 'type' => null], $values); - parent::refreshFrom($values, $opts, $partial); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Event.php b/dependencies/stripe/stripe-php/lib/Event.php deleted file mode 100644 index 6669ea5..0000000 --- a/dependencies/stripe/stripe-php/lib/Event.php +++ /dev/null @@ -1,279 +0,0 @@ -Event - * object. For example, when a charge succeeds, we create a charge.succeeded - * event; and when an invoice payment attempt fails, we create an - * invoice.payment_failed event. Note that many API requests may cause multiple - * events to be created. For example, if you create a new subscription for a - * customer, you will receive both a customer.subscription.created event and a - * charge.succeeded event. - * - * Events occur when the state of another API resource changes. The state of that - * resource at the time of the change is embedded in the event's data field. For - * example, a charge.succeeded event will contain a charge, and an - * invoice.payment_failed event will contain an invoice. - * - * As with other API resources, you can use endpoints to retrieve an - * individual event or a list of events - * from the API. We also have a separate - * webhooks system for sending the - * Event objects directly to an endpoint on your server. Webhooks are managed - * in your - * account settings, - * and our Using Webhooks guide will help you get set up. - * - * When using Connect, you can also receive notifications of - * events that occur in connected accounts. For these events, there will be an - * additional account attribute in the received Event object. - * - * NOTE: Right now, access to events through the Retrieve Event API is - * guaranteed only for 30 days. - * - * This class includes constants for the possible string representations of - * event types. See https://stripe.com/docs/api#event_types for more details. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $account The connected account that originated the event. - * @property null|string $api_version The Stripe API version used to render data. Note: This property is populated only for events on or after October 31, 2014. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property \Stripe\StripeObject $data - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property int $pending_webhooks Number of webhooks that have yet to be successfully delivered (i.e., to return a 20x response) to the URLs you've specified. - * @property null|\Stripe\StripeObject $request Information on the API request that instigated the event. - * @property string $type Description of the event (e.g., invoice.created or charge.refunded). - */ -class Event extends ApiResource -{ - const OBJECT_NAME = 'event'; - use ApiOperations\All; - use ApiOperations\Retrieve; - const ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized'; - const ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized'; - const ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created'; - const ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted'; - const ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated'; - const ACCOUNT_UPDATED = 'account.updated'; - const APPLICATION_FEE_CREATED = 'application_fee.created'; - const APPLICATION_FEE_REFUNDED = 'application_fee.refunded'; - const APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated'; - const BALANCE_AVAILABLE = 'balance.available'; - const BILLING_PORTAL_CONFIGURATION_CREATED = 'billing_portal.configuration.created'; - const BILLING_PORTAL_CONFIGURATION_UPDATED = 'billing_portal.configuration.updated'; - const BILLING_PORTAL_SESSION_CREATED = 'billing_portal.session.created'; - const CAPABILITY_UPDATED = 'capability.updated'; - const CASH_BALANCE_FUNDS_AVAILABLE = 'cash_balance.funds_available'; - const CHARGE_CAPTURED = 'charge.captured'; - const CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed'; - const CHARGE_DISPUTE_CREATED = 'charge.dispute.created'; - const CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated'; - const CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn'; - const CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated'; - const CHARGE_EXPIRED = 'charge.expired'; - const CHARGE_FAILED = 'charge.failed'; - const CHARGE_PENDING = 'charge.pending'; - const CHARGE_REFUNDED = 'charge.refunded'; - const CHARGE_REFUND_UPDATED = 'charge.refund.updated'; - const CHARGE_SUCCEEDED = 'charge.succeeded'; - const CHARGE_UPDATED = 'charge.updated'; - const CHECKOUT_SESSION_ASYNC_PAYMENT_FAILED = 'checkout.session.async_payment_failed'; - const CHECKOUT_SESSION_ASYNC_PAYMENT_SUCCEEDED = 'checkout.session.async_payment_succeeded'; - const CHECKOUT_SESSION_COMPLETED = 'checkout.session.completed'; - const CHECKOUT_SESSION_EXPIRED = 'checkout.session.expired'; - const COUPON_CREATED = 'coupon.created'; - const COUPON_DELETED = 'coupon.deleted'; - const COUPON_UPDATED = 'coupon.updated'; - const CREDIT_NOTE_CREATED = 'credit_note.created'; - const CREDIT_NOTE_UPDATED = 'credit_note.updated'; - const CREDIT_NOTE_VOIDED = 'credit_note.voided'; - const CUSTOMER_CASH_BALANCE_TRANSACTION_CREATED = 'customer_cash_balance_transaction.created'; - const CUSTOMER_CREATED = 'customer.created'; - const CUSTOMER_DELETED = 'customer.deleted'; - const CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created'; - const CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted'; - const CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated'; - const CUSTOMER_SOURCE_CREATED = 'customer.source.created'; - const CUSTOMER_SOURCE_DELETED = 'customer.source.deleted'; - const CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring'; - const CUSTOMER_SOURCE_UPDATED = 'customer.source.updated'; - const CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created'; - const CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted'; - const CUSTOMER_SUBSCRIPTION_PAUSED = 'customer.subscription.paused'; - const CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_APPLIED = 'customer.subscription.pending_update_applied'; - const CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_EXPIRED = 'customer.subscription.pending_update_expired'; - const CUSTOMER_SUBSCRIPTION_RESUMED = 'customer.subscription.resumed'; - const CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end'; - const CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated'; - const CUSTOMER_TAX_ID_CREATED = 'customer.tax_id.created'; - const CUSTOMER_TAX_ID_DELETED = 'customer.tax_id.deleted'; - const CUSTOMER_TAX_ID_UPDATED = 'customer.tax_id.updated'; - const CUSTOMER_UPDATED = 'customer.updated'; - const FILE_CREATED = 'file.created'; - const FINANCIAL_CONNECTIONS_ACCOUNT_CREATED = 'financial_connections.account.created'; - const FINANCIAL_CONNECTIONS_ACCOUNT_DEACTIVATED = 'financial_connections.account.deactivated'; - const FINANCIAL_CONNECTIONS_ACCOUNT_DISCONNECTED = 'financial_connections.account.disconnected'; - const FINANCIAL_CONNECTIONS_ACCOUNT_REACTIVATED = 'financial_connections.account.reactivated'; - const FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_BALANCE = 'financial_connections.account.refreshed_balance'; - const IDENTITY_VERIFICATION_SESSION_CANCELED = 'identity.verification_session.canceled'; - const IDENTITY_VERIFICATION_SESSION_CREATED = 'identity.verification_session.created'; - const IDENTITY_VERIFICATION_SESSION_PROCESSING = 'identity.verification_session.processing'; - const IDENTITY_VERIFICATION_SESSION_REDACTED = 'identity.verification_session.redacted'; - const IDENTITY_VERIFICATION_SESSION_REQUIRES_INPUT = 'identity.verification_session.requires_input'; - const IDENTITY_VERIFICATION_SESSION_VERIFIED = 'identity.verification_session.verified'; - const INVOICEITEM_CREATED = 'invoiceitem.created'; - const INVOICEITEM_DELETED = 'invoiceitem.deleted'; - const INVOICEITEM_UPDATED = 'invoiceitem.updated'; - const INVOICE_CREATED = 'invoice.created'; - const INVOICE_DELETED = 'invoice.deleted'; - const INVOICE_FINALIZATION_FAILED = 'invoice.finalization_failed'; - const INVOICE_FINALIZED = 'invoice.finalized'; - const INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible'; - const INVOICE_PAID = 'invoice.paid'; - const INVOICE_PAYMENT_ACTION_REQUIRED = 'invoice.payment_action_required'; - const INVOICE_PAYMENT_FAILED = 'invoice.payment_failed'; - const INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded'; - const INVOICE_SENT = 'invoice.sent'; - const INVOICE_UPCOMING = 'invoice.upcoming'; - const INVOICE_UPDATED = 'invoice.updated'; - const INVOICE_VOIDED = 'invoice.voided'; - const ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created'; - const ISSUING_AUTHORIZATION_REQUEST = 'issuing_authorization.request'; - const ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated'; - const ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created'; - const ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated'; - const ISSUING_CARD_CREATED = 'issuing_card.created'; - const ISSUING_CARD_UPDATED = 'issuing_card.updated'; - const ISSUING_DISPUTE_CLOSED = 'issuing_dispute.closed'; - const ISSUING_DISPUTE_CREATED = 'issuing_dispute.created'; - const ISSUING_DISPUTE_FUNDS_REINSTATED = 'issuing_dispute.funds_reinstated'; - const ISSUING_DISPUTE_SUBMITTED = 'issuing_dispute.submitted'; - const ISSUING_DISPUTE_UPDATED = 'issuing_dispute.updated'; - const ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created'; - const ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated'; - const MANDATE_UPDATED = 'mandate.updated'; - const ORDER_CREATED = 'order.created'; - const PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated'; - const PAYMENT_INTENT_CANCELED = 'payment_intent.canceled'; - const PAYMENT_INTENT_CREATED = 'payment_intent.created'; - const PAYMENT_INTENT_PARTIALLY_FUNDED = 'payment_intent.partially_funded'; - const PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed'; - const PAYMENT_INTENT_PROCESSING = 'payment_intent.processing'; - const PAYMENT_INTENT_REQUIRES_ACTION = 'payment_intent.requires_action'; - const PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded'; - const PAYMENT_LINK_CREATED = 'payment_link.created'; - const PAYMENT_LINK_UPDATED = 'payment_link.updated'; - const PAYMENT_METHOD_ATTACHED = 'payment_method.attached'; - const PAYMENT_METHOD_AUTOMATICALLY_UPDATED = 'payment_method.automatically_updated'; - const PAYMENT_METHOD_DETACHED = 'payment_method.detached'; - const PAYMENT_METHOD_UPDATED = 'payment_method.updated'; - const PAYOUT_CANCELED = 'payout.canceled'; - const PAYOUT_CREATED = 'payout.created'; - const PAYOUT_FAILED = 'payout.failed'; - const PAYOUT_PAID = 'payout.paid'; - const PAYOUT_RECONCILIATION_COMPLETED = 'payout.reconciliation_completed'; - const PAYOUT_UPDATED = 'payout.updated'; - const PERSON_CREATED = 'person.created'; - const PERSON_DELETED = 'person.deleted'; - const PERSON_UPDATED = 'person.updated'; - const PLAN_CREATED = 'plan.created'; - const PLAN_DELETED = 'plan.deleted'; - const PLAN_UPDATED = 'plan.updated'; - const PRICE_CREATED = 'price.created'; - const PRICE_DELETED = 'price.deleted'; - const PRICE_UPDATED = 'price.updated'; - const PRODUCT_CREATED = 'product.created'; - const PRODUCT_DELETED = 'product.deleted'; - const PRODUCT_UPDATED = 'product.updated'; - const PROMOTION_CODE_CREATED = 'promotion_code.created'; - const PROMOTION_CODE_UPDATED = 'promotion_code.updated'; - const QUOTE_ACCEPTED = 'quote.accepted'; - const QUOTE_CANCELED = 'quote.canceled'; - const QUOTE_CREATED = 'quote.created'; - const QUOTE_FINALIZED = 'quote.finalized'; - const RADAR_EARLY_FRAUD_WARNING_CREATED = 'radar.early_fraud_warning.created'; - const RADAR_EARLY_FRAUD_WARNING_UPDATED = 'radar.early_fraud_warning.updated'; - const RECIPIENT_CREATED = 'recipient.created'; - const RECIPIENT_DELETED = 'recipient.deleted'; - const RECIPIENT_UPDATED = 'recipient.updated'; - const REFUND_CREATED = 'refund.created'; - const REFUND_UPDATED = 'refund.updated'; - const REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed'; - const REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded'; - const REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated'; - const REVIEW_CLOSED = 'review.closed'; - const REVIEW_OPENED = 'review.opened'; - const SETUP_INTENT_CANCELED = 'setup_intent.canceled'; - const SETUP_INTENT_CREATED = 'setup_intent.created'; - const SETUP_INTENT_REQUIRES_ACTION = 'setup_intent.requires_action'; - const SETUP_INTENT_SETUP_FAILED = 'setup_intent.setup_failed'; - const SETUP_INTENT_SUCCEEDED = 'setup_intent.succeeded'; - const SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created'; - const SKU_CREATED = 'sku.created'; - const SKU_DELETED = 'sku.deleted'; - const SKU_UPDATED = 'sku.updated'; - const SOURCE_CANCELED = 'source.canceled'; - const SOURCE_CHARGEABLE = 'source.chargeable'; - const SOURCE_FAILED = 'source.failed'; - const SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification'; - const SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required'; - const SOURCE_TRANSACTION_CREATED = 'source.transaction.created'; - const SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated'; - const SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted'; - const SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled'; - const SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed'; - const SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created'; - const SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring'; - const SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released'; - const SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated'; - const TAX_RATE_CREATED = 'tax_rate.created'; - const TAX_RATE_UPDATED = 'tax_rate.updated'; - const TAX_SETTINGS_UPDATED = 'tax.settings.updated'; - const TERMINAL_READER_ACTION_FAILED = 'terminal.reader.action_failed'; - const TERMINAL_READER_ACTION_SUCCEEDED = 'terminal.reader.action_succeeded'; - const TEST_HELPERS_TEST_CLOCK_ADVANCING = 'test_helpers.test_clock.advancing'; - const TEST_HELPERS_TEST_CLOCK_CREATED = 'test_helpers.test_clock.created'; - const TEST_HELPERS_TEST_CLOCK_DELETED = 'test_helpers.test_clock.deleted'; - const TEST_HELPERS_TEST_CLOCK_INTERNAL_FAILURE = 'test_helpers.test_clock.internal_failure'; - const TEST_HELPERS_TEST_CLOCK_READY = 'test_helpers.test_clock.ready'; - const TOPUP_CANCELED = 'topup.canceled'; - const TOPUP_CREATED = 'topup.created'; - const TOPUP_FAILED = 'topup.failed'; - const TOPUP_REVERSED = 'topup.reversed'; - const TOPUP_SUCCEEDED = 'topup.succeeded'; - const TRANSFER_CREATED = 'transfer.created'; - const TRANSFER_REVERSED = 'transfer.reversed'; - const TRANSFER_UPDATED = 'transfer.updated'; - const TREASURY_CREDIT_REVERSAL_CREATED = 'treasury.credit_reversal.created'; - const TREASURY_CREDIT_REVERSAL_POSTED = 'treasury.credit_reversal.posted'; - const TREASURY_DEBIT_REVERSAL_COMPLETED = 'treasury.debit_reversal.completed'; - const TREASURY_DEBIT_REVERSAL_CREATED = 'treasury.debit_reversal.created'; - const TREASURY_DEBIT_REVERSAL_INITIAL_CREDIT_GRANTED = 'treasury.debit_reversal.initial_credit_granted'; - const TREASURY_FINANCIAL_ACCOUNT_CLOSED = 'treasury.financial_account.closed'; - const TREASURY_FINANCIAL_ACCOUNT_CREATED = 'treasury.financial_account.created'; - const TREASURY_FINANCIAL_ACCOUNT_FEATURES_STATUS_UPDATED = 'treasury.financial_account.features_status_updated'; - const TREASURY_INBOUND_TRANSFER_CANCELED = 'treasury.inbound_transfer.canceled'; - const TREASURY_INBOUND_TRANSFER_CREATED = 'treasury.inbound_transfer.created'; - const TREASURY_INBOUND_TRANSFER_FAILED = 'treasury.inbound_transfer.failed'; - const TREASURY_INBOUND_TRANSFER_SUCCEEDED = 'treasury.inbound_transfer.succeeded'; - const TREASURY_OUTBOUND_PAYMENT_CANCELED = 'treasury.outbound_payment.canceled'; - const TREASURY_OUTBOUND_PAYMENT_CREATED = 'treasury.outbound_payment.created'; - const TREASURY_OUTBOUND_PAYMENT_EXPECTED_ARRIVAL_DATE_UPDATED = 'treasury.outbound_payment.expected_arrival_date_updated'; - const TREASURY_OUTBOUND_PAYMENT_FAILED = 'treasury.outbound_payment.failed'; - const TREASURY_OUTBOUND_PAYMENT_POSTED = 'treasury.outbound_payment.posted'; - const TREASURY_OUTBOUND_PAYMENT_RETURNED = 'treasury.outbound_payment.returned'; - const TREASURY_OUTBOUND_TRANSFER_CANCELED = 'treasury.outbound_transfer.canceled'; - const TREASURY_OUTBOUND_TRANSFER_CREATED = 'treasury.outbound_transfer.created'; - const TREASURY_OUTBOUND_TRANSFER_EXPECTED_ARRIVAL_DATE_UPDATED = 'treasury.outbound_transfer.expected_arrival_date_updated'; - const TREASURY_OUTBOUND_TRANSFER_FAILED = 'treasury.outbound_transfer.failed'; - const TREASURY_OUTBOUND_TRANSFER_POSTED = 'treasury.outbound_transfer.posted'; - const TREASURY_OUTBOUND_TRANSFER_RETURNED = 'treasury.outbound_transfer.returned'; - const TREASURY_RECEIVED_CREDIT_CREATED = 'treasury.received_credit.created'; - const TREASURY_RECEIVED_CREDIT_FAILED = 'treasury.received_credit.failed'; - const TREASURY_RECEIVED_CREDIT_SUCCEEDED = 'treasury.received_credit.succeeded'; - const TREASURY_RECEIVED_DEBIT_CREATED = 'treasury.received_debit.created'; -} diff --git a/dependencies/stripe/stripe-php/lib/Exception/ApiConnectionException.php b/dependencies/stripe/stripe-php/lib/Exception/ApiConnectionException.php deleted file mode 100644 index 0a6c4f4..0000000 --- a/dependencies/stripe/stripe-php/lib/Exception/ApiConnectionException.php +++ /dev/null @@ -1,12 +0,0 @@ -setHttpStatus($httpStatus); - $instance->setHttpBody($httpBody); - $instance->setJsonBody($jsonBody); - $instance->setHttpHeaders($httpHeaders); - $instance->setStripeCode($stripeCode); - $instance->setRequestId(null); - if ($httpHeaders && isset($httpHeaders['Request-Id'])) { - $instance->setRequestId($httpHeaders['Request-Id']); - } - $instance->setError($instance->constructErrorObject()); - return $instance; - } - /** - * Gets the Stripe error object. - * - * @return null|\Stripe\ErrorObject - */ - public function getError() - { - return $this->error; - } - /** - * Sets the Stripe error object. - * - * @param null|\Stripe\ErrorObject $error - */ - public function setError($error) - { - $this->error = $error; - } - /** - * Gets the HTTP body as a string. - * - * @return null|string - */ - public function getHttpBody() - { - return $this->httpBody; - } - /** - * Sets the HTTP body as a string. - * - * @param null|string $httpBody - */ - public function setHttpBody($httpBody) - { - $this->httpBody = $httpBody; - } - /** - * Gets the HTTP headers array. - * - * @return null|array|\Stripe\Util\CaseInsensitiveArray - */ - public function getHttpHeaders() - { - return $this->httpHeaders; - } - /** - * Sets the HTTP headers array. - * - * @param null|array|\Stripe\Util\CaseInsensitiveArray $httpHeaders - */ - public function setHttpHeaders($httpHeaders) - { - $this->httpHeaders = $httpHeaders; - } - /** - * Gets the HTTP status code. - * - * @return null|int - */ - public function getHttpStatus() - { - return $this->httpStatus; - } - /** - * Sets the HTTP status code. - * - * @param null|int $httpStatus - */ - public function setHttpStatus($httpStatus) - { - $this->httpStatus = $httpStatus; - } - /** - * Gets the JSON deserialized body. - * - * @return null|array - */ - public function getJsonBody() - { - return $this->jsonBody; - } - /** - * Sets the JSON deserialized body. - * - * @param null|array $jsonBody - */ - public function setJsonBody($jsonBody) - { - $this->jsonBody = $jsonBody; - } - /** - * Gets the Stripe request ID. - * - * @return null|string - */ - public function getRequestId() - { - return $this->requestId; - } - /** - * Sets the Stripe request ID. - * - * @param null|string $requestId - */ - public function setRequestId($requestId) - { - $this->requestId = $requestId; - } - /** - * Gets the Stripe error code. - * - * Cf. the `CODE_*` constants on {@see \Stripe\ErrorObject} for possible - * values. - * - * @return null|string - */ - public function getStripeCode() - { - return $this->stripeCode; - } - /** - * Sets the Stripe error code. - * - * @param null|string $stripeCode - */ - public function setStripeCode($stripeCode) - { - $this->stripeCode = $stripeCode; - } - /** - * Returns the string representation of the exception. - * - * @return string - */ - public function __toString() - { - $statusStr = null === $this->getHttpStatus() ? '' : "(Status {$this->getHttpStatus()}) "; - $idStr = null === $this->getRequestId() ? '' : "(Request {$this->getRequestId()}) "; - return "{$statusStr}{$idStr}{$this->getMessage()}"; - } - protected function constructErrorObject() - { - if (null === $this->jsonBody || !\array_key_exists('error', $this->jsonBody)) { - return null; - } - return \WP_Ultimo\Dependencies\Stripe\ErrorObject::constructFrom($this->jsonBody['error']); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Exception/AuthenticationException.php b/dependencies/stripe/stripe-php/lib/Exception/AuthenticationException.php deleted file mode 100644 index 178a038..0000000 --- a/dependencies/stripe/stripe-php/lib/Exception/AuthenticationException.php +++ /dev/null @@ -1,11 +0,0 @@ -setDeclineCode($declineCode); - $instance->setStripeParam($stripeParam); - return $instance; - } - /** - * Gets the decline code. - * - * @return null|string - */ - public function getDeclineCode() - { - return $this->declineCode; - } - /** - * Sets the decline code. - * - * @param null|string $declineCode - */ - public function setDeclineCode($declineCode) - { - $this->declineCode = $declineCode; - } - /** - * Gets the parameter related to the error. - * - * @return null|string - */ - public function getStripeParam() - { - return $this->stripeParam; - } - /** - * Sets the parameter related to the error. - * - * @param null|string $stripeParam - */ - public function setStripeParam($stripeParam) - { - $this->stripeParam = $stripeParam; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Exception/ExceptionInterface.php b/dependencies/stripe/stripe-php/lib/Exception/ExceptionInterface.php deleted file mode 100644 index 6cefc05..0000000 --- a/dependencies/stripe/stripe-php/lib/Exception/ExceptionInterface.php +++ /dev/null @@ -1,22 +0,0 @@ -setStripeParam($stripeParam); - return $instance; - } - /** - * Gets the parameter related to the error. - * - * @return null|string - */ - public function getStripeParam() - { - return $this->stripeParam; - } - /** - * Sets the parameter related to the error. - * - * @param null|string $stripeParam - */ - public function setStripeParam($stripeParam) - { - $this->stripeParam = $stripeParam; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php b/dependencies/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php deleted file mode 100644 index 4e49c1f..0000000 --- a/dependencies/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php +++ /dev/null @@ -1,10 +0,0 @@ -jsonBody) { - return null; - } - return \WP_Ultimo\Dependencies\Stripe\OAuthErrorObject::constructFrom($this->jsonBody); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php b/dependencies/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php deleted file mode 100644 index 540f810..0000000 --- a/dependencies/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php +++ /dev/null @@ -1,12 +0,0 @@ -setHttpBody($httpBody); - $instance->setSigHeader($sigHeader); - return $instance; - } - /** - * Gets the HTTP body as a string. - * - * @return null|string - */ - public function getHttpBody() - { - return $this->httpBody; - } - /** - * Sets the HTTP body as a string. - * - * @param null|string $httpBody - */ - public function setHttpBody($httpBody) - { - $this->httpBody = $httpBody; - } - /** - * Gets the `Stripe-Signature` HTTP header. - * - * @return null|string - */ - public function getSigHeader() - { - return $this->sigHeader; - } - /** - * Sets the `Stripe-Signature` HTTP header. - * - * @param null|string $sigHeader - */ - public function setSigHeader($sigHeader) - { - $this->sigHeader = $sigHeader; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Exception/UnexpectedValueException.php b/dependencies/stripe/stripe-php/lib/Exception/UnexpectedValueException.php deleted file mode 100644 index a738c95..0000000 --- a/dependencies/stripe/stripe-php/lib/Exception/UnexpectedValueException.php +++ /dev/null @@ -1,7 +0,0 @@ -Exchange Rate objects allow you to determine the rates that Stripe is - * currently using to convert from one currency to another. Since this number is - * variable throughout the day, there are various reasons why you might want to - * know the current rate (for example, to dynamically price an item for a user - * with a default payment in a foreign currency). - * - * If you want a guarantee that the charge is made with a certain exchange rate - * you expect is current, you can pass in exchange_rate to charges endpoints. - * If the value is no longer up to date, the charge won't go through. Please - * refer to our Exchange Rates API guide for more - * details. - * - * @property string $id Unique identifier for the object. Represented as the three-letter ISO currency code in lowercase. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject $rates Hash where the keys are supported currencies and the values are the exchange rate at which the base id currency converts to the key currency. - */ -class ExchangeRate extends ApiResource -{ - const OBJECT_NAME = 'exchange_rate'; - use ApiOperations\All; - use ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/File.php b/dependencies/stripe/stripe-php/lib/File.php deleted file mode 100644 index cc34e5e..0000000 --- a/dependencies/stripe/stripe-php/lib/File.php +++ /dev/null @@ -1,74 +0,0 @@ -create file - * request (for example, when uploading dispute evidence) or it may have - * been created by Stripe (for example, the results of a Sigma scheduled - * query). - * - * Related guide: File upload guide - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|int $expires_at The time at which the file expires and is no longer available in epoch seconds. - * @property null|string $filename A filename for the file, suitable for saving to a filesystem. - * @property null|\Stripe\Collection<\Stripe\FileLink> $links A list of file links that point at this file. - * @property string $purpose The purpose of the uploaded file. - * @property int $size The size in bytes of the file object. - * @property null|string $title A user friendly title for the document. - * @property null|string $type The type of the file returned (e.g., csv, pdf, jpg, or png). - * @property null|string $url The URL from which the file can be downloaded using your live secret API key. - */ -class File extends ApiResource -{ - const OBJECT_NAME = 'file'; - use ApiOperations\All; - use ApiOperations\Retrieve; - const PURPOSE_ACCOUNT_REQUIREMENT = 'account_requirement'; - const PURPOSE_ADDITIONAL_VERIFICATION = 'additional_verification'; - const PURPOSE_BUSINESS_ICON = 'business_icon'; - const PURPOSE_BUSINESS_LOGO = 'business_logo'; - const PURPOSE_CUSTOMER_SIGNATURE = 'customer_signature'; - const PURPOSE_DISPUTE_EVIDENCE = 'dispute_evidence'; - const PURPOSE_DOCUMENT_PROVIDER_IDENTITY_DOCUMENT = 'document_provider_identity_document'; - const PURPOSE_FINANCE_REPORT_RUN = 'finance_report_run'; - const PURPOSE_IDENTITY_DOCUMENT = 'identity_document'; - const PURPOSE_IDENTITY_DOCUMENT_DOWNLOADABLE = 'identity_document_downloadable'; - const PURPOSE_PCI_DOCUMENT = 'pci_document'; - const PURPOSE_SELFIE = 'selfie'; - const PURPOSE_SIGMA_SCHEDULED_QUERY = 'sigma_scheduled_query'; - const PURPOSE_TAX_DOCUMENT_USER_UPLOAD = 'tax_document_user_upload'; - const PURPOSE_TERMINAL_READER_SPLASHSCREEN = 'terminal_reader_splashscreen'; - // This resource can have two different object names. In latter API - // versions, only `file` is used, but since stripe-php may be used with - // any API version, we need to support deserializing the older - // `file_upload` object into the same class. - const OBJECT_NAME_ALT = 'file_upload'; - use ApiOperations\Create { - create as protected _create; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\File the created file - */ - public static function create($params = null, $opts = null) - { - $opts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($opts); - if (null === $opts->apiBase) { - $opts->apiBase = Stripe::$apiUploadBase; - } - // Manually flatten params, otherwise curl's multipart encoder will - // choke on nested arrays. - $flatParams = \array_column(\WP_Ultimo\Dependencies\Stripe\Util\Util::flattenParams($params), 1, 0); - return static::_create($flatParams, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/FileLink.php b/dependencies/stripe/stripe-php/lib/FileLink.php deleted file mode 100644 index 9ceb0e4..0000000 --- a/dependencies/stripe/stripe-php/lib/FileLink.php +++ /dev/null @@ -1,28 +0,0 @@ -File object with non-Stripe users, you can - * create a FileLink. FileLinks contain a URL that can be used to - * retrieve the contents of the file without authentication. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $expired Whether this link is already expired. - * @property null|int $expires_at Time at which the link expires. - * @property string|\Stripe\File $file The file object this link points to. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $url The publicly accessible URL to download the file. - */ -class FileLink extends ApiResource -{ - const OBJECT_NAME = 'file_link'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/FinancialConnections/Account.php b/dependencies/stripe/stripe-php/lib/FinancialConnections/Account.php deleted file mode 100644 index 0697397..0000000 --- a/dependencies/stripe/stripe-php/lib/FinancialConnections/Account.php +++ /dev/null @@ -1,92 +0,0 @@ -subcategory. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $display_name A human-readable name that has been assigned to this account, either by the account holder or by the institution. - * @property string $institution_name The name of the institution that holds this account. - * @property null|string $last4 The last 4 digits of the account number. If present, this will be 4 numeric characters. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string|\Stripe\FinancialConnections\AccountOwnership $ownership The most recent information about the account's owners. - * @property null|\Stripe\StripeObject $ownership_refresh The state of the most recent attempt to refresh the account owners. - * @property null|string[] $permissions The list of permissions granted by this account. - * @property string $status The status of the link to the account. - * @property string $subcategory

      If category is cash, one of:

      - checking - savings - other

      If category is credit, one of:

      - mortgage - line_of_credit - credit_card - other

      If category is investment or other, this will be other.

      - * @property string[] $supported_payment_method_types The PaymentMethod type(s) that can be created from this account. - */ -class Account extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'financial_connections.account'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const CATEGORY_CASH = 'cash'; - const CATEGORY_CREDIT = 'credit'; - const CATEGORY_INVESTMENT = 'investment'; - const CATEGORY_OTHER = 'other'; - const STATUS_ACTIVE = 'active'; - const STATUS_DISCONNECTED = 'disconnected'; - const STATUS_INACTIVE = 'inactive'; - const SUBCATEGORY_CHECKING = 'checking'; - const SUBCATEGORY_CREDIT_CARD = 'credit_card'; - const SUBCATEGORY_LINE_OF_CREDIT = 'line_of_credit'; - const SUBCATEGORY_MORTGAGE = 'mortgage'; - const SUBCATEGORY_OTHER = 'other'; - const SUBCATEGORY_SAVINGS = 'savings'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Account the disconnected account - */ - public function disconnect($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/disconnect'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\FinancialConnections\AccountOwner> list of account owners - */ - public static function allOwners($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/owners'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Account the refreshed account - */ - public function refreshAccount($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/refresh'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php b/dependencies/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php deleted file mode 100644 index ef7cd6c..0000000 --- a/dependencies/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php +++ /dev/null @@ -1,21 +0,0 @@ - $owners A paginated list of owners for this account. - */ -class AccountOwnership extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'financial_connections.account_ownership'; -} diff --git a/dependencies/stripe/stripe-php/lib/FinancialConnections/Session.php b/dependencies/stripe/stripe-php/lib/FinancialConnections/Session.php deleted file mode 100644 index 4be4774..0000000 --- a/dependencies/stripe/stripe-php/lib/FinancialConnections/Session.php +++ /dev/null @@ -1,24 +0,0 @@ - $accounts The accounts that were collected as part of this Session. - * @property string $client_secret A value that will be passed to the client to launch the authentication flow. - * @property null|\Stripe\StripeObject $filters - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string[] $permissions Permissions requested for accounts collected during this session. - * @property null|string $return_url For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app. - */ -class Session extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'financial_connections.session'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/FundingInstructions.php b/dependencies/stripe/stripe-php/lib/FundingInstructions.php deleted file mode 100644 index 580b505..0000000 --- a/dependencies/stripe/stripe-php/lib/FundingInstructions.php +++ /dev/null @@ -1,23 +0,0 @@ -balance that is - * automatically applied to future invoices and payments using the customer_balance payment method. - * Customers can fund this balance by initiating a bank transfer to any account in the - * financial_addresses field. - * Related guide: Customer balance funding instructions. - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject $bank_transfer - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string $funding_type The funding_type of the returned instructions - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - */ -class FundingInstructions extends ApiResource -{ - const OBJECT_NAME = 'funding_instructions'; - const FUNDING_TYPE_BANK_TRANSFER = 'bank_transfer'; -} diff --git a/dependencies/stripe/stripe-php/lib/HttpClient/ClientInterface.php b/dependencies/stripe/stripe-php/lib/HttpClient/ClientInterface.php deleted file mode 100644 index 21b3592..0000000 --- a/dependencies/stripe/stripe-php/lib/HttpClient/ClientInterface.php +++ /dev/null @@ -1,22 +0,0 @@ -defaultOptions = $defaultOptions; - $this->randomGenerator = $randomGenerator ?: new Util\RandomGenerator(); - $this->initUserAgentInfo(); - $this->enableHttp2 = $this->canSafelyUseHttp2(); - } - public function __destruct() - { - $this->closeCurlHandle(); - } - public function initUserAgentInfo() - { - $curlVersion = \curl_version(); - $this->userAgentInfo = ['httplib' => 'curl ' . $curlVersion['version'], 'ssllib' => $curlVersion['ssl_version']]; - } - public function getDefaultOptions() - { - return $this->defaultOptions; - } - public function getUserAgentInfo() - { - return $this->userAgentInfo; - } - /** - * @return bool - */ - public function getEnablePersistentConnections() - { - return $this->enablePersistentConnections; - } - /** - * @param bool $enable - */ - public function setEnablePersistentConnections($enable) - { - $this->enablePersistentConnections = $enable; - } - /** - * @return bool - */ - public function getEnableHttp2() - { - return $this->enableHttp2; - } - /** - * @param bool $enable - */ - public function setEnableHttp2($enable) - { - $this->enableHttp2 = $enable; - } - /** - * @return null|callable - */ - public function getRequestStatusCallback() - { - return $this->requestStatusCallback; - } - /** - * Sets a callback that is called after each request. The callback will - * receive the following parameters: - *
        - *
      1. string $rbody The response body
      2. - *
      3. integer $rcode The response status code
      4. - *
      5. \Stripe\Util\CaseInsensitiveArray $rheaders The response headers
      6. - *
      7. integer $errno The curl error number
      8. - *
      9. string|null $message The curl error message
      10. - *
      11. boolean $shouldRetry Whether the request will be retried
      12. - *
      13. integer $numRetries The number of the retry attempt
      14. - *
      . - * - * @param null|callable $requestStatusCallback - */ - public function setRequestStatusCallback($requestStatusCallback) - { - $this->requestStatusCallback = $requestStatusCallback; - } - // USER DEFINED TIMEOUTS - const DEFAULT_TIMEOUT = 80; - const DEFAULT_CONNECT_TIMEOUT = 30; - private $timeout = self::DEFAULT_TIMEOUT; - private $connectTimeout = self::DEFAULT_CONNECT_TIMEOUT; - public function setTimeout($seconds) - { - $this->timeout = (int) \max($seconds, 0); - return $this; - } - public function setConnectTimeout($seconds) - { - $this->connectTimeout = (int) \max($seconds, 0); - return $this; - } - public function getTimeout() - { - return $this->timeout; - } - public function getConnectTimeout() - { - return $this->connectTimeout; - } - // END OF USER DEFINED TIMEOUTS - private function constructRequest($method, $absUrl, $headers, $params, $hasFile) - { - $method = \strtolower($method); - $opts = []; - if (\is_callable($this->defaultOptions)) { - // call defaultOptions callback, set options to return value - $opts = \call_user_func_array($this->defaultOptions, \func_get_args()); - if (!\is_array($opts)) { - throw new Exception\UnexpectedValueException('Non-array value returned by defaultOptions CurlClient callback'); - } - } elseif (\is_array($this->defaultOptions)) { - // set default curlopts from array - $opts = $this->defaultOptions; - } - $params = Util\Util::objectsToIds($params); - if ('get' === $method) { - if ($hasFile) { - throw new Exception\UnexpectedValueException('Issuing a GET request with a file parameter'); - } - $opts[\CURLOPT_HTTPGET] = 1; - if (\count($params) > 0) { - $encoded = Util\Util::encodeParameters($params); - $absUrl = "{$absUrl}?{$encoded}"; - } - } elseif ('post' === $method) { - $opts[\CURLOPT_POST] = 1; - $opts[\CURLOPT_POSTFIELDS] = $hasFile ? $params : Util\Util::encodeParameters($params); - } elseif ('delete' === $method) { - $opts[\CURLOPT_CUSTOMREQUEST] = 'DELETE'; - if (\count($params) > 0) { - $encoded = Util\Util::encodeParameters($params); - $absUrl = "{$absUrl}?{$encoded}"; - } - } else { - throw new Exception\UnexpectedValueException("Unrecognized method {$method}"); - } - // It is only safe to retry network failures on POST requests if we - // add an Idempotency-Key header - if ('post' === $method && Stripe::$maxNetworkRetries > 0) { - if (!$this->hasHeader($headers, 'Idempotency-Key')) { - $headers[] = 'Idempotency-Key: ' . $this->randomGenerator->uuid(); - } - } - // By default for large request body sizes (> 1024 bytes), cURL will - // send a request without a body and with a `Expect: 100-continue` - // header, which gives the server a chance to respond with an error - // status code in cases where one can be determined right away (say - // on an authentication problem for example), and saves the "large" - // request body from being ever sent. - // - // Unfortunately, the bindings don't currently correctly handle the - // success case (in which the server sends back a 100 CONTINUE), so - // we'll error under that condition. To compensate for that problem - // for the time being, override cURL's behavior by simply always - // sending an empty `Expect:` header. - $headers[] = 'Expect: '; - $absUrl = Util\Util::utf8($absUrl); - $opts[\CURLOPT_URL] = $absUrl; - $opts[\CURLOPT_RETURNTRANSFER] = \true; - $opts[\CURLOPT_CONNECTTIMEOUT] = $this->connectTimeout; - $opts[\CURLOPT_TIMEOUT] = $this->timeout; - $opts[\CURLOPT_HTTPHEADER] = $headers; - $opts[\CURLOPT_CAINFO] = Stripe::getCABundlePath(); - if (!Stripe::getVerifySslCerts()) { - $opts[\CURLOPT_SSL_VERIFYPEER] = \false; - } - if (!isset($opts[\CURLOPT_HTTP_VERSION]) && $this->getEnableHttp2()) { - // For HTTPS requests, enable HTTP/2, if supported - $opts[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2TLS; - } - // If the user didn't explicitly specify a CURLOPT_IPRESOLVE option, we - // force IPv4 resolving as Stripe's API servers are only accessible over - // IPv4 (see. https://github.com/stripe/stripe-php/issues/1045). - // We let users specify a custom option in case they need to say proxy - // through an IPv6 proxy. - if (!isset($opts[\CURLOPT_IPRESOLVE])) { - $opts[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; - } - return [$opts, $absUrl]; - } - public function request($method, $absUrl, $headers, $params, $hasFile) - { - list($opts, $absUrl) = $this->constructRequest($method, $absUrl, $headers, $params, $hasFile); - list($rbody, $rcode, $rheaders) = $this->executeRequestWithRetries($opts, $absUrl); - return [$rbody, $rcode, $rheaders]; - } - public function requestStream($method, $absUrl, $headers, $params, $hasFile, $readBodyChunk) - { - list($opts, $absUrl) = $this->constructRequest($method, $absUrl, $headers, $params, $hasFile); - $opts[\CURLOPT_RETURNTRANSFER] = \false; - list($rbody, $rcode, $rheaders) = $this->executeStreamingRequestWithRetries($opts, $absUrl, $readBodyChunk); - return [$rbody, $rcode, $rheaders]; - } - /** - * Curl permits sending \CURLOPT_HEADERFUNCTION, which is called with lines - * from the header and \CURLOPT_WRITEFUNCTION, which is called with bytes - * from the body. You usually want to handle the body differently depending - * on what was in the header. - * - * This function makes it easier to specify different callbacks depending - * on the contents of the heeder. After the header has been completely read - * and the body begins to stream, it will call $determineWriteCallback with - * the array of headers. $determineWriteCallback should, based on the - * headers it receives, return a "writeCallback" that describes what to do - * with the incoming HTTP response body. - * - * @param array $opts - * @param callable $determineWriteCallback - * - * @return array - */ - private function useHeadersToDetermineWriteCallback($opts, $determineWriteCallback) - { - $rheaders = new Util\CaseInsensitiveArray(); - $headerCallback = function ($curl, $header_line) use(&$rheaders) { - return self::parseLineIntoHeaderArray($header_line, $rheaders); - }; - $writeCallback = null; - $writeCallbackWrapper = function ($curl, $data) use(&$writeCallback, &$rheaders, &$determineWriteCallback) { - if (null === $writeCallback) { - $writeCallback = \call_user_func_array($determineWriteCallback, [$rheaders]); - } - return \call_user_func_array($writeCallback, [$curl, $data]); - }; - return [$headerCallback, $writeCallbackWrapper]; - } - private static function parseLineIntoHeaderArray($line, &$headers) - { - if (\false === \strpos($line, ':')) { - return \strlen($line); - } - list($key, $value) = \explode(':', \trim($line), 2); - $headers[\trim($key)] = \trim($value); - return \strlen($line); - } - /** - * Like `executeRequestWithRetries` except: - * 1. Does not buffer the body of a successful (status code < 300) - * response into memory -- instead, calls the caller-provided - * $readBodyChunk with each chunk of incoming data. - * 2. Does not retry if a network error occurs while streaming the - * body of a successful response. - * - * @param array $opts cURL options - * @param string $absUrl - * @param callable $readBodyChunk - * - * @return array - */ - public function executeStreamingRequestWithRetries($opts, $absUrl, $readBodyChunk) - { - /** @var bool */ - $shouldRetry = \false; - /** @var int */ - $numRetries = 0; - // Will contain the bytes of the body of the last request - // if it was not successful and should not be retries - /** @var null|string */ - $rbody = null; - // Status code of the last request - /** @var null|bool */ - $rcode = null; - // Array of headers from the last request - /** @var null|array */ - $lastRHeaders = null; - $errno = null; - $message = null; - $determineWriteCallback = function ($rheaders) use(&$readBodyChunk, &$shouldRetry, &$rbody, &$numRetries, &$rcode, &$lastRHeaders, &$errno) { - $lastRHeaders = $rheaders; - $errno = \curl_errno($this->curlHandle); - $rcode = \curl_getinfo($this->curlHandle, \CURLINFO_HTTP_CODE); - // Send the bytes from the body of a successful request to the caller-provided $readBodyChunk. - if ($rcode < 300) { - $rbody = null; - return function ($curl, $data) use(&$readBodyChunk) { - // Don't expose the $curl handle to the user, and don't require them to - // return the length of $data. - \call_user_func_array($readBodyChunk, [$data]); - return \strlen($data); - }; - } - $shouldRetry = $this->shouldRetry($errno, $rcode, $rheaders, $numRetries); - // Discard the body from an unsuccessful request that should be retried. - if ($shouldRetry) { - return function ($curl, $data) { - return \strlen($data); - }; - } else { - // Otherwise, buffer the body into $rbody. It will need to be parsed to determine - // which exception to throw to the user. - $rbody = ''; - return function ($curl, $data) use(&$rbody) { - $rbody .= $data; - return \strlen($data); - }; - } - }; - while (\true) { - list($headerCallback, $writeCallback) = $this->useHeadersToDetermineWriteCallback($opts, $determineWriteCallback); - $opts[\CURLOPT_HEADERFUNCTION] = $headerCallback; - $opts[\CURLOPT_WRITEFUNCTION] = $writeCallback; - $shouldRetry = \false; - $rbody = null; - $this->resetCurlHandle(); - \curl_setopt_array($this->curlHandle, $opts); - $result = \curl_exec($this->curlHandle); - $errno = \curl_errno($this->curlHandle); - if (0 !== $errno) { - $message = \curl_error($this->curlHandle); - } - if (!$this->getEnablePersistentConnections()) { - $this->closeCurlHandle(); - } - if (\is_callable($this->getRequestStatusCallback())) { - \call_user_func_array($this->getRequestStatusCallback(), [$rbody, $rcode, $lastRHeaders, $errno, $message, $shouldRetry, $numRetries]); - } - if ($shouldRetry) { - ++$numRetries; - $sleepSeconds = $this->sleepTime($numRetries, $lastRHeaders); - \usleep((int) ($sleepSeconds * 1000000)); - } else { - break; - } - } - if (0 !== $errno) { - $this->handleCurlError($absUrl, $errno, $message, $numRetries); - } - return [$rbody, $rcode, $lastRHeaders]; - } - /** - * @param array $opts cURL options - * @param string $absUrl - */ - public function executeRequestWithRetries($opts, $absUrl) - { - $numRetries = 0; - while (\true) { - $rcode = 0; - $errno = 0; - $message = null; - // Create a callback to capture HTTP headers for the response - $rheaders = new Util\CaseInsensitiveArray(); - $headerCallback = function ($curl, $header_line) use(&$rheaders) { - return CurlClient::parseLineIntoHeaderArray($header_line, $rheaders); - }; - $opts[\CURLOPT_HEADERFUNCTION] = $headerCallback; - $this->resetCurlHandle(); - \curl_setopt_array($this->curlHandle, $opts); - $rbody = \curl_exec($this->curlHandle); - if (\false === $rbody) { - $errno = \curl_errno($this->curlHandle); - $message = \curl_error($this->curlHandle); - } else { - $rcode = \curl_getinfo($this->curlHandle, \CURLINFO_HTTP_CODE); - } - if (!$this->getEnablePersistentConnections()) { - $this->closeCurlHandle(); - } - $shouldRetry = $this->shouldRetry($errno, $rcode, $rheaders, $numRetries); - if (\is_callable($this->getRequestStatusCallback())) { - \call_user_func_array($this->getRequestStatusCallback(), [$rbody, $rcode, $rheaders, $errno, $message, $shouldRetry, $numRetries]); - } - if ($shouldRetry) { - ++$numRetries; - $sleepSeconds = $this->sleepTime($numRetries, $rheaders); - \usleep((int) ($sleepSeconds * 1000000)); - } else { - break; - } - } - if (\false === $rbody) { - $this->handleCurlError($absUrl, $errno, $message, $numRetries); - } - return [$rbody, $rcode, $rheaders]; - } - /** - * @param string $url - * @param int $errno - * @param string $message - * @param int $numRetries - * - * @throws Exception\ApiConnectionException - */ - private function handleCurlError($url, $errno, $message, $numRetries) - { - switch ($errno) { - case \CURLE_COULDNT_CONNECT: - case \CURLE_COULDNT_RESOLVE_HOST: - case \CURLE_OPERATION_TIMEOUTED: - $msg = "Could not connect to Stripe ({$url}). Please check your " . 'internet connection and try again. If this problem persists, ' . "you should check Stripe's service status at " . 'https://twitter.com/stripestatus, or'; - break; - case \CURLE_SSL_CACERT: - case \CURLE_SSL_PEER_CERTIFICATE: - $msg = "Could not verify Stripe's SSL certificate. Please make sure " . 'that your network is not intercepting certificates. ' . "(Try going to {$url} in your browser.) " . 'If this problem persists,'; - break; - default: - $msg = 'Unexpected error communicating with Stripe. ' . 'If this problem persists,'; - } - $msg .= ' let us know at support@stripe.com.'; - $msg .= "\n\n(Network error [errno {$errno}]: {$message})"; - if ($numRetries > 0) { - $msg .= "\n\nRequest was retried {$numRetries} times."; - } - throw new Exception\ApiConnectionException($msg); - } - /** - * Checks if an error is a problem that we should retry on. This includes both - * socket errors that may represent an intermittent problem and some special - * HTTP statuses. - * - * @param int $errno - * @param int $rcode - * @param array|\Stripe\Util\CaseInsensitiveArray $rheaders - * @param int $numRetries - * - * @return bool - */ - private function shouldRetry($errno, $rcode, $rheaders, $numRetries) - { - if ($numRetries >= Stripe::getMaxNetworkRetries()) { - return \false; - } - // Retry on timeout-related problems (either on open or read). - if (\CURLE_OPERATION_TIMEOUTED === $errno) { - return \true; - } - // Destination refused the connection, the connection was reset, or a - // variety of other connection failures. This could occur from a single - // saturated server, so retry in case it's intermittent. - if (\CURLE_COULDNT_CONNECT === $errno) { - return \true; - } - // The API may ask us not to retry (eg; if doing so would be a no-op) - // or advise us to retry (eg; in cases of lock timeouts); we defer to that. - if (isset($rheaders['stripe-should-retry'])) { - if ('false' === $rheaders['stripe-should-retry']) { - return \false; - } - if ('true' === $rheaders['stripe-should-retry']) { - return \true; - } - } - // 409 Conflict - if (409 === $rcode) { - return \true; - } - // Retry on 500, 503, and other internal errors. - // - // Note that we expect the stripe-should-retry header to be false - // in most cases when a 500 is returned, since our idempotency framework - // would typically replay it anyway. - if ($rcode >= 500) { - return \true; - } - return \false; - } - /** - * Provides the number of seconds to wait before retrying a request. - * - * @param int $numRetries - * @param array|\Stripe\Util\CaseInsensitiveArray $rheaders - * - * @return int - */ - private function sleepTime($numRetries, $rheaders) - { - // Apply exponential backoff with $initialNetworkRetryDelay on the - // number of $numRetries so far as inputs. Do not allow the number to exceed - // $maxNetworkRetryDelay. - $sleepSeconds = \min(Stripe::getInitialNetworkRetryDelay() * 1.0 * 2 ** ($numRetries - 1), Stripe::getMaxNetworkRetryDelay()); - // Apply some jitter by randomizing the value in the range of - // ($sleepSeconds / 2) to ($sleepSeconds). - $sleepSeconds *= 0.5 * (1 + $this->randomGenerator->randFloat()); - // But never sleep less than the base sleep seconds. - $sleepSeconds = \max(Stripe::getInitialNetworkRetryDelay(), $sleepSeconds); - // And never sleep less than the time the API asks us to wait, assuming it's a reasonable ask. - $retryAfter = isset($rheaders['retry-after']) ? (float) $rheaders['retry-after'] : 0.0; - if (\floor($retryAfter) === $retryAfter && $retryAfter <= Stripe::getMaxRetryAfter()) { - $sleepSeconds = \max($sleepSeconds, $retryAfter); - } - return $sleepSeconds; - } - /** - * Initializes the curl handle. If already initialized, the handle is closed first. - */ - private function initCurlHandle() - { - $this->closeCurlHandle(); - $this->curlHandle = \curl_init(); - } - /** - * Closes the curl handle if initialized. Do nothing if already closed. - */ - private function closeCurlHandle() - { - if (null !== $this->curlHandle) { - \curl_close($this->curlHandle); - $this->curlHandle = null; - } - } - /** - * Resets the curl handle. If the handle is not already initialized, or if persistent - * connections are disabled, the handle is reinitialized instead. - */ - private function resetCurlHandle() - { - if (null !== $this->curlHandle && $this->getEnablePersistentConnections()) { - \curl_reset($this->curlHandle); - } else { - $this->initCurlHandle(); - } - } - /** - * Indicates whether it is safe to use HTTP/2 or not. - * - * @return bool - */ - private function canSafelyUseHttp2() - { - // Versions of curl older than 7.60.0 don't respect GOAWAY frames - // (cf. https://github.com/curl/curl/issues/2416), which Stripe use. - $curlVersion = \curl_version()['version']; - return \version_compare($curlVersion, '7.60.0') >= 0; - } - /** - * Checks if a list of headers contains a specific header name. - * - * @param string[] $headers - * @param string $name - * - * @return bool - */ - private function hasHeader($headers, $name) - { - foreach ($headers as $header) { - if (0 === \strncasecmp($header, "{$name}: ", \strlen($name) + 2)) { - return \true; - } - } - return \false; - } -} diff --git a/dependencies/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php b/dependencies/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php deleted file mode 100644 index 679b02c..0000000 --- a/dependencies/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -type and options - * parameters used. You can find the result of each verification check performed in the - * appropriate sub-resource: document, id_number, selfie. - * - * Each VerificationReport contains a copy of any data collected by the user as well as - * reference IDs which can be used to access collected images through the FileUpload - * API. To configure and create VerificationReports, use the - * VerificationSession API. - * - * Related guides: Accessing verification results. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|\Stripe\StripeObject $document Result from a document check - * @property null|\Stripe\StripeObject $id_number Result from an id_number check - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $options - * @property null|\Stripe\StripeObject $selfie Result from a selfie check - * @property null|string $type Type of report. - * @property null|string $verification_session ID of the VerificationSession that created this report. - */ -class VerificationReport extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'identity.verification_report'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const TYPE_DOCUMENT = 'document'; - const TYPE_ID_NUMBER = 'id_number'; -} diff --git a/dependencies/stripe/stripe-php/lib/Identity/VerificationSession.php b/dependencies/stripe/stripe-php/lib/Identity/VerificationSession.php deleted file mode 100644 index b130cc8..0000000 --- a/dependencies/stripe/stripe-php/lib/Identity/VerificationSession.php +++ /dev/null @@ -1,77 +0,0 @@ -verification - * check to perform. Only create one VerificationSession for - * each verification in your system. - * - * A VerificationSession transitions through multiple - * statuses throughout its lifetime as it progresses through - * the verification flow. The VerificationSession contains the user's verified data after - * verification checks are complete. - * - * Related guide: The Verification Sessions API - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $client_secret The short-lived client secret used by Stripe.js to show a verification modal inside your app. This client secret expires after 24 hours and can only be used once. Don’t store it, log it, embed it in a URL, or expose it to anyone other than the user. Make sure that you have TLS enabled on any page that includes the client secret. Refer to our docs on passing the client secret to the frontend to learn more. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|\Stripe\StripeObject $last_error If present, this property tells you the last error encountered when processing the verification. - * @property null|string|\Stripe\Identity\VerificationReport $last_verification_report ID of the most recent VerificationReport. Learn more about accessing detailed verification results. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $options A set of options for the session’s verification checks. - * @property null|\Stripe\StripeObject $redaction Redaction status of this VerificationSession. If the VerificationSession is not redacted, this field will be null. - * @property string $status Status of this VerificationSession. Learn more about the lifecycle of sessions. - * @property null|string $type The type of verification check to be performed. - * @property null|string $url The short-lived URL that you use to redirect a user to Stripe to submit their identity information. This URL expires after 48 hours and can only be used once. Don’t store it, log it, send it in emails or expose it to anyone other than the user. Refer to our docs on verifying identity documents to learn how to redirect users to Stripe. - * @property null|\Stripe\StripeObject $verified_outputs The user’s verified data. - */ -class VerificationSession extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'identity.verification_session'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const STATUS_CANCELED = 'canceled'; - const STATUS_PROCESSING = 'processing'; - const STATUS_REQUIRES_INPUT = 'requires_input'; - const STATUS_VERIFIED = 'verified'; - const TYPE_DOCUMENT = 'document'; - const TYPE_ID_NUMBER = 'id_number'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession the canceled verification session - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession the redacted verification session - */ - public function redact($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/redact'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Invoice.php b/dependencies/stripe/stripe-php/lib/Invoice.php deleted file mode 100644 index 0d293e9..0000000 --- a/dependencies/stripe/stripe-php/lib/Invoice.php +++ /dev/null @@ -1,289 +0,0 @@ -invoice items, and proration adjustments - * that may be caused by subscription upgrades/downgrades (if necessary). - * - * If your invoice is configured to be billed through automatic charges, - * Stripe automatically finalizes your invoice and attempts payment. Note - * that finalizing the invoice, - * when automatic, does - * not happen immediately as the invoice is created. Stripe waits - * until one hour after the last webhook was successfully sent (or the last - * webhook timed out after failing). If you (and the platforms you may have - * connected to) have no webhooks configured, Stripe waits one hour after - * creation to finalize the invoice. - * - * If your invoice is configured to be billed by sending an email, then based on your - * email settings, - * Stripe will email the invoice to your customer and await payment. These - * emails can contain a link to a hosted page to pay the invoice. - * - * Stripe applies any customer credit on the account before determining the - * amount due for the invoice (i.e., the amount that will be actually - * charged). If the amount due for the invoice is less than Stripe's minimum allowed charge - * per currency, the - * invoice is automatically marked paid, and we add the amount due to the - * customer's credit balance which is applied to the next invoice. - * - * More details on the customer's credit balance are - * here. - * - * Related guide: Send invoices to customers - * - * @property null|string $id Unique identifier for the object. This property is always present unless the invoice is an upcoming invoice. See Retrieve an upcoming invoice for more details. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $account_country The country of the business associated with this invoice, most often the business creating the invoice. - * @property null|string $account_name The public name of the business associated with this invoice, most often the business creating the invoice. - * @property null|(string|\Stripe\TaxId)[] $account_tax_ids The account tax IDs associated with the invoice. Only editable when the invoice is a draft. - * @property int $amount_due Final amount due at this time for this invoice. If the invoice's total is smaller than the minimum charge amount, for example, or if there is account credit that can be applied to the invoice, the amount_due may be 0. If there is a positive starting_balance for the invoice (the customer owes money), the amount_due will also take that into account. The charge that gets generated for the invoice will be for the amount specified in amount_due. - * @property int $amount_paid The amount, in cents (or local equivalent), that was paid. - * @property int $amount_remaining The difference between amount_due and amount_paid, in cents (or local equivalent). - * @property int $amount_shipping This is the sum of all the shipping amounts. - * @property null|string|\Stripe\StripeObject $application ID of the Connect Application that created the invoice. - * @property null|int $application_fee_amount The fee in cents (or local equivalent) that will be applied to the invoice and transferred to the application owner's Stripe account when the invoice is paid. - * @property int $attempt_count Number of payment attempts made for this invoice, from the perspective of the payment retry schedule. Any payment attempt counts as the first attempt, and subsequently only automatic retries increment the attempt count. In other words, manual payment attempts after the first attempt do not affect the retry schedule. - * @property bool $attempted Whether an attempt has been made to pay the invoice. An invoice is not attempted until 1 hour after the invoice.created webhook, for example, so you might not want to display that invoice as unpaid to your users. - * @property null|bool $auto_advance Controls whether Stripe performs automatic collection of the invoice. If false, the invoice's state doesn't automatically advance without an explicit action. - * @property \Stripe\StripeObject $automatic_tax - * @property null|string $billing_reason Indicates the reason why the invoice was created. subscription_cycle indicates an invoice created by a subscription advancing into a new period. subscription_create indicates an invoice created due to creating a subscription. subscription_update indicates an invoice created due to updating a subscription. subscription is set for all old invoices to indicate either a change to a subscription or a period advancement. manual is set for all invoices unrelated to a subscription (for example: created via the invoice editor). The upcoming value is reserved for simulated invoices per the upcoming invoice endpoint. subscription_threshold indicates an invoice created due to a billing threshold being reached. - * @property null|string|\Stripe\Charge $charge ID of the latest charge generated for this invoice, if any. - * @property string $collection_method Either charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay this invoice using the default source attached to the customer. When sending an invoice, Stripe will email this invoice to the customer with payment instructions. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|\Stripe\StripeObject[] $custom_fields Custom fields displayed on the invoice. - * @property null|string|\Stripe\Customer $customer The ID of the customer who will be billed. - * @property null|\Stripe\StripeObject $customer_address The customer's address. Until the invoice is finalized, this field will equal customer.address. Once the invoice is finalized, this field will no longer be updated. - * @property null|string $customer_email The customer's email. Until the invoice is finalized, this field will equal customer.email. Once the invoice is finalized, this field will no longer be updated. - * @property null|string $customer_name The customer's name. Until the invoice is finalized, this field will equal customer.name. Once the invoice is finalized, this field will no longer be updated. - * @property null|string $customer_phone The customer's phone number. Until the invoice is finalized, this field will equal customer.phone. Once the invoice is finalized, this field will no longer be updated. - * @property null|\Stripe\StripeObject $customer_shipping The customer's shipping information. Until the invoice is finalized, this field will equal customer.shipping. Once the invoice is finalized, this field will no longer be updated. - * @property null|string $customer_tax_exempt The customer's tax exempt status. Until the invoice is finalized, this field will equal customer.tax_exempt. Once the invoice is finalized, this field will no longer be updated. - * @property null|\Stripe\StripeObject[] $customer_tax_ids The customer's tax IDs. Until the invoice is finalized, this field will contain the same tax IDs as customer.tax_ids. Once the invoice is finalized, this field will no longer be updated. - * @property null|string|\Stripe\PaymentMethod $default_payment_method ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings. - * @property null|string|\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source $default_source ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source. - * @property \Stripe\TaxRate[] $default_tax_rates The tax rates applied to this invoice, if any. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard. - * @property null|\Stripe\Discount $discount Describes the current discount applied to this invoice, if there is one. Not populated if there are multiple discounts. - * @property null|(string|\Stripe\Discount)[] $discounts The discounts applied to the invoice. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. - * @property null|int $due_date The date on which payment for this invoice is due. This value will be null for invoices where collection_method=charge_automatically. - * @property null|int $effective_at The date when this invoice is in effect. Same as finalized_at unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the invoice PDF and receipt. - * @property null|int $ending_balance Ending customer balance after the invoice is finalized. Invoices are finalized approximately an hour after successful webhook delivery or when payment collection is attempted for the invoice. If the invoice has not been finalized yet, this will be null. - * @property null|string $footer Footer displayed on the invoice. - * @property null|\Stripe\StripeObject $from_invoice Details of the invoice that was cloned. See the revision documentation for more details. - * @property null|string $hosted_invoice_url The URL for the hosted invoice page, which allows customers to view and pay an invoice. If the invoice has not been finalized yet, this will be null. - * @property null|string $invoice_pdf The link to download the PDF for the invoice. If the invoice has not been finalized yet, this will be null. - * @property null|\Stripe\StripeObject $last_finalization_error The error encountered during the previous attempt to finalize the invoice. This field is cleared when the invoice is successfully finalized. - * @property null|string|\Stripe\Invoice $latest_revision The ID of the most recent non-draft revision of this invoice - * @property \Stripe\Collection<\Stripe\InvoiceLineItem> $lines The individual line items that make up the invoice. lines is sorted as follows: (1) pending invoice items (including prorations) in reverse chronological order, (2) subscription items in reverse chronological order, and (3) invoice items added after invoice creation in chronological order. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|int $next_payment_attempt The time at which payment will next be attempted. This value will be null for invoices where collection_method=send_invoice. - * @property null|string $number A unique, identifying string that appears on emails sent to the customer for this invoice. This starts with the customer's unique invoice_prefix if it is specified. - * @property null|string|\Stripe\Account $on_behalf_of The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the Invoices with Connect documentation for details. - * @property bool $paid Whether payment was successfully collected for this invoice. An invoice can be paid (most commonly) with a charge or with credit from the customer's account balance. - * @property bool $paid_out_of_band Returns true if the invoice was manually marked paid, returns false if the invoice hasn't been paid yet or was paid on Stripe. - * @property null|string|\Stripe\PaymentIntent $payment_intent The PaymentIntent associated with this invoice. The PaymentIntent is generated when the invoice is finalized, and can then be used to pay the invoice. Note that voiding an invoice will cancel the PaymentIntent. - * @property \Stripe\StripeObject $payment_settings - * @property int $period_end End of the usage period during which invoice items were added to this invoice. - * @property int $period_start Start of the usage period during which invoice items were added to this invoice. - * @property int $post_payment_credit_notes_amount Total amount of all post-payment credit notes issued for this invoice. - * @property int $pre_payment_credit_notes_amount Total amount of all pre-payment credit notes issued for this invoice. - * @property null|string|\Stripe\Quote $quote The quote this invoice was generated from. - * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this invoice. - * @property null|\Stripe\StripeObject $rendering_options Options for invoice PDF rendering. - * @property null|\Stripe\StripeObject $shipping_cost The details of the cost of shipping, including the ShippingRate applied on the invoice. - * @property null|\Stripe\StripeObject $shipping_details Shipping details for the invoice. The Invoice PDF will use the shipping_details value if it is set, otherwise the PDF will render the shipping address from the customer. - * @property int $starting_balance Starting customer balance before the invoice is finalized. If the invoice has not been finalized yet, this will be the current customer balance. For revision invoices, this also includes any customer balance that was applied to the original invoice. - * @property null|string $statement_descriptor Extra information about an invoice for the customer's credit card statement. - * @property null|string $status The status of the invoice, one of draft, open, paid, uncollectible, or void. Learn more - * @property \Stripe\StripeObject $status_transitions - * @property null|string|\Stripe\Subscription $subscription The subscription that this invoice was prepared for, if any. - * @property null|\Stripe\StripeObject $subscription_details Details about the subscription that created this invoice. - * @property null|int $subscription_proration_date Only set for upcoming invoices that preview prorations. The time used to calculate prorations. - * @property int $subtotal Total of all subscriptions, invoice items, and prorations on the invoice before any invoice level discount or exclusive tax is applied. Item discounts are already incorporated - * @property null|int $subtotal_excluding_tax The integer amount in cents (or local equivalent) representing the subtotal of the invoice before any invoice level discount or tax is applied. Item discounts are already incorporated - * @property null|int $tax The amount of tax on this invoice. This is the sum of all the tax amounts on this invoice. - * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this invoice belongs to. - * @property null|\Stripe\StripeObject $threshold_reason - * @property int $total Total after discounts and taxes. - * @property null|\Stripe\StripeObject[] $total_discount_amounts The aggregate amounts calculated per discount across all line items. - * @property null|int $total_excluding_tax The integer amount in cents (or local equivalent) representing the total amount of the invoice including all discounts but excluding all tax. - * @property \Stripe\StripeObject[] $total_tax_amounts The aggregate amounts calculated per tax rate for all line items. - * @property null|\Stripe\StripeObject $transfer_data The account (if any) the payment will be attributed to for tax reporting, and where funds from the payment will be transferred to for the invoice. - * @property null|int $webhooks_delivered_at Invoices are automatically paid or sent 1 hour after webhooks are delivered, or until all webhook delivery attempts have been exhausted. This field tracks the time when webhooks for this invoice were successfully delivered. If the invoice had no webhooks to deliver, this will be set while the invoice is being created. - */ -class Invoice extends ApiResource -{ - const OBJECT_NAME = 'invoice'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\NestedResource; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const BILLING_REASON_AUTOMATIC_PENDING_INVOICE_ITEM_INVOICE = 'automatic_pending_invoice_item_invoice'; - const BILLING_REASON_MANUAL = 'manual'; - const BILLING_REASON_QUOTE_ACCEPT = 'quote_accept'; - const BILLING_REASON_SUBSCRIPTION = 'subscription'; - const BILLING_REASON_SUBSCRIPTION_CREATE = 'subscription_create'; - const BILLING_REASON_SUBSCRIPTION_CYCLE = 'subscription_cycle'; - const BILLING_REASON_SUBSCRIPTION_THRESHOLD = 'subscription_threshold'; - const BILLING_REASON_SUBSCRIPTION_UPDATE = 'subscription_update'; - const BILLING_REASON_UPCOMING = 'upcoming'; - const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; - const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; - const CUSTOMER_TAX_EXEMPT_EXEMPT = 'exempt'; - const CUSTOMER_TAX_EXEMPT_NONE = 'none'; - const CUSTOMER_TAX_EXEMPT_REVERSE = 'reverse'; - const STATUS_DRAFT = 'draft'; - const STATUS_OPEN = 'open'; - const STATUS_PAID = 'paid'; - const STATUS_UNCOLLECTIBLE = 'uncollectible'; - const STATUS_VOID = 'void'; - const BILLING_CHARGE_AUTOMATICALLY = 'charge_automatically'; - const BILLING_SEND_INVOICE = 'send_invoice'; - /** @deprecated */ - const STATUS_DELETED = 'deleted'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice the finalized invoice - */ - public function finalizeInvoice($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/finalize'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice the uncollectible invoice - */ - public function markUncollectible($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/mark_uncollectible'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice the paid invoice - */ - public function pay($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/pay'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice the sent invoice - */ - public function sendInvoice($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/send'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice the upcoming invoice - */ - public static function upcoming($params = null, $opts = null) - { - $url = static::classUrl() . '/upcoming'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\InvoiceLineItem> list of invoice line items - */ - public static function upcomingLines($params = null, $opts = null) - { - $url = static::classUrl() . '/upcoming/lines'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice the voided invoice - */ - public function voidInvoice($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/void'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Invoice> the invoice search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/invoices/search'; - return self::_searchResource($url, $params, $opts); - } - const PATH_LINES = '/lines'; - /** - * @param string $id the ID of the invoice on which to retrieve the line items - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> the list of line items - */ - public static function allLines($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_LINES, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/InvoiceItem.php b/dependencies/stripe/stripe-php/lib/InvoiceItem.php deleted file mode 100644 index 0dd394f..0000000 --- a/dependencies/stripe/stripe-php/lib/InvoiceItem.php +++ /dev/null @@ -1,51 +0,0 @@ -invoice. An invoice item is added to an - * invoice by creating or updating it with an invoice field, at which point it will be included as - * an invoice line item within - * invoice.lines. - * - * Invoice Items can be created before you are ready to actually send the invoice. This can be particularly useful when combined - * with a subscription. Sometimes you want to add a charge or credit to a customer, but actually charge - * or credit the customer’s card only at the end of a regular billing cycle. This is useful for combining several charges - * (to minimize per-transaction fees), or for having Stripe tabulate your usage-based billing totals. - * - * Related guides: Integrate with the Invoicing API, Subscription Invoices. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in the currency specified) of the invoice item. This should always be equal to unit_amount * quantity. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string|\Stripe\Customer $customer The ID of the customer who will be billed when this invoice item is billed. - * @property int $date Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property bool $discountable If true, discounts will apply to this invoice item. Always false for prorations. - * @property null|(string|\Stripe\Discount)[] $discounts The discounts which apply to the invoice item. Item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. - * @property null|string|\Stripe\Invoice $invoice The ID of the invoice this invoice item belongs to. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property \Stripe\StripeObject $period - * @property null|\Stripe\Plan $plan If the invoice item is a proration, the plan of the subscription that the proration was computed for. - * @property null|\Stripe\Price $price The price of the invoice item. - * @property bool $proration Whether the invoice item was created automatically as a proration adjustment when the customer switched plans. - * @property int $quantity Quantity of units for the invoice item. If the invoice item is a proration, the quantity of the subscription that the proration was computed for. - * @property null|string|\Stripe\Subscription $subscription The subscription that this invoice item has been created for, if any. - * @property null|string $subscription_item The subscription item that this invoice item has been created for, if any. - * @property null|\Stripe\TaxRate[] $tax_rates The tax rates which apply to the invoice item. When set, the default_tax_rates on the invoice do not apply to this invoice item. - * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this invoice item belongs to. - * @property null|int $unit_amount Unit amount (in the currency specified) of the invoice item. - * @property null|string $unit_amount_decimal Same as unit_amount, but contains a decimal value with at most 12 decimal places. - */ -class InvoiceItem extends ApiResource -{ - const OBJECT_NAME = 'invoiceitem'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\Retrieve; - use ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/InvoiceLineItem.php b/dependencies/stripe/stripe-php/lib/InvoiceLineItem.php deleted file mode 100644 index 98c748b..0000000 --- a/dependencies/stripe/stripe-php/lib/InvoiceLineItem.php +++ /dev/null @@ -1,35 +0,0 @@ -ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|\Stripe\StripeObject[] $discount_amounts The amount of discount calculated per discount for this line item. - * @property bool $discountable If true, discounts will apply to this line item. Always false for prorations. - * @property null|(string|\Stripe\Discount)[] $discounts The discounts applied to the invoice line item. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. - * @property null|string|\Stripe\InvoiceItem $invoice_item The ID of the invoice item associated with this line item if any. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Note that for line items with type=subscription this will reflect the metadata of the subscription that caused the line item to be created. - * @property \Stripe\StripeObject $period - * @property null|\Stripe\Plan $plan The plan of the subscription, if the line item is a subscription or a proration. - * @property null|\Stripe\Price $price The price of the line item. - * @property bool $proration Whether this is a proration. - * @property null|\Stripe\StripeObject $proration_details Additional details for proration line items - * @property null|int $quantity The quantity of the subscription, if the line item is a subscription or a proration. - * @property null|string|\Stripe\Subscription $subscription The subscription that the invoice item pertains to, if any. - * @property null|string|\Stripe\SubscriptionItem $subscription_item The subscription item that generated this line item. Left empty if the line item is not an explicit result of a subscription. - * @property null|\Stripe\StripeObject[] $tax_amounts The amount of tax calculated per tax rate for this line item - * @property null|\Stripe\TaxRate[] $tax_rates The tax rates which apply to the line item. - * @property string $type A string identifying the type of the source of this line item, either an invoiceitem or a subscription. - * @property null|string $unit_amount_excluding_tax The amount in cents (or local equivalent) representing the unit amount for this line item, excluding all tax and discounts. - */ -class InvoiceLineItem extends ApiResource -{ - const OBJECT_NAME = 'line_item'; -} diff --git a/dependencies/stripe/stripe-php/lib/Issuing/Authorization.php b/dependencies/stripe/stripe-php/lib/Issuing/Authorization.php deleted file mode 100644 index cfb7d4a..0000000 --- a/dependencies/stripe/stripe-php/lib/Issuing/Authorization.php +++ /dev/null @@ -1,82 +0,0 @@ -issued card is used to make a purchase, an Issuing Authorization - * object is created. Authorizations must be approved for the - * purchase to be completed successfully. - * - * Related guide: Issued card authorizations - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount The total amount that was authorized or rejected. This amount is in the card's currency and in the smallest currency unit. - * @property null|\Stripe\StripeObject $amount_details Detailed breakdown of amount components. These amounts are denominated in currency and in the smallest currency unit. - * @property bool $approved Whether the authorization has been approved. - * @property string $authorization_method How the card details were provided. - * @property \Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with this authorization. - * @property \Stripe\Issuing\Card $card You can create physical or virtual cards that are issued to cardholders. - * @property null|string|\Stripe\Issuing\Cardholder $cardholder The cardholder to whom this authorization belongs. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property int $merchant_amount The total amount that was authorized or rejected. This amount is in the merchant_currency and in the smallest currency unit. - * @property string $merchant_currency The currency that was presented to the cardholder for the authorization. Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property \Stripe\StripeObject $merchant_data - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $network_data Details about the authorization, such as identifiers, set by the card network. - * @property null|\Stripe\StripeObject $pending_request The pending authorization request. This field will only be non-null during an issuing_authorization.request webhook. - * @property \Stripe\StripeObject[] $request_history History of every time a pending_request authorization was approved/declined, either by you directly or by Stripe (e.g. based on your spending_controls). If the merchant changes the authorization by performing an incremental authorization, you can look at this field to see the previous requests for the authorization. This field can be helpful in determining why a given authorization was approved/declined. - * @property string $status The current status of the authorization in its lifecycle. - * @property \Stripe\Issuing\Transaction[] $transactions List of transactions associated with this authorization. - * @property null|\Stripe\StripeObject $treasury Treasury details related to this authorization if it was created on a FinancialAccount. - * @property \Stripe\StripeObject $verification_data - * @property null|string $wallet The digital wallet used for this transaction. One of apple_pay, google_pay, or samsung_pay. Will populate as null when no digital wallet was utilized. - */ -class Authorization extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'issuing.authorization'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const AUTHORIZATION_METHOD_CHIP = 'chip'; - const AUTHORIZATION_METHOD_CONTACTLESS = 'contactless'; - const AUTHORIZATION_METHOD_KEYED_IN = 'keyed_in'; - const AUTHORIZATION_METHOD_ONLINE = 'online'; - const AUTHORIZATION_METHOD_SWIPE = 'swipe'; - const STATUS_CLOSED = 'closed'; - const STATUS_PENDING = 'pending'; - const STATUS_REVERSED = 'reversed'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Authorization the approved authorization - */ - public function approve($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/approve'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Authorization the declined authorization - */ - public function decline($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/decline'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Issuing/Card.php b/dependencies/stripe/stripe-php/lib/Issuing/Card.php deleted file mode 100644 index 19f106e..0000000 --- a/dependencies/stripe/stripe-php/lib/Issuing/Card.php +++ /dev/null @@ -1,52 +0,0 @@ -create physical or virtual cards that are issued to cardholders. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property string $brand The brand of the card. - * @property null|string $cancellation_reason The reason why the card was canceled. - * @property \Stripe\Issuing\Cardholder $cardholder

      An Issuing Cardholder object represents an individual or business entity who is issued cards.

      Related guide: How to create a cardholder

      - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Supported currencies are usd in the US, eur in the EU, and gbp in the UK. - * @property null|string $cvc The card's CVC. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. - * @property int $exp_month The expiration month of the card. - * @property int $exp_year The expiration year of the card. - * @property null|string $financial_account The financial account this card is attached to. - * @property string $last4 The last 4 digits of the card number. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $number The full unredacted card number. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. - * @property null|string|\Stripe\Issuing\Card $replaced_by The latest card that replaces this card, if any. - * @property null|string|\Stripe\Issuing\Card $replacement_for The card this card replaces, if any. - * @property null|string $replacement_reason The reason why the previous card needed to be replaced. - * @property null|\Stripe\StripeObject $shipping Where and how the card will be shipped. - * @property \Stripe\StripeObject $spending_controls - * @property string $status Whether authorizations can be approved on this card. May be blocked from activating cards depending on past-due Cardholder requirements. Defaults to inactive. - * @property string $type The type of the card. - * @property null|\Stripe\StripeObject $wallets Information relating to digital wallets (like Apple Pay and Google Pay). - */ -class Card extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'issuing.card'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const CANCELLATION_REASON_DESIGN_REJECTED = 'design_rejected'; - const CANCELLATION_REASON_LOST = 'lost'; - const CANCELLATION_REASON_STOLEN = 'stolen'; - const REPLACEMENT_REASON_DAMAGED = 'damaged'; - const REPLACEMENT_REASON_EXPIRED = 'expired'; - const REPLACEMENT_REASON_LOST = 'lost'; - const REPLACEMENT_REASON_STOLEN = 'stolen'; - const STATUS_ACTIVE = 'active'; - const STATUS_CANCELED = 'canceled'; - const STATUS_INACTIVE = 'inactive'; - const TYPE_PHYSICAL = 'physical'; - const TYPE_VIRTUAL = 'virtual'; -} diff --git a/dependencies/stripe/stripe-php/lib/Issuing/CardDetails.php b/dependencies/stripe/stripe-php/lib/Issuing/CardDetails.php deleted file mode 100644 index c80ed95..0000000 --- a/dependencies/stripe/stripe-php/lib/Issuing/CardDetails.php +++ /dev/null @@ -1,19 +0,0 @@ -Cardholder object represents an individual or business entity who is issued cards. - * - * Related guide: How to create a cardholder - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject $billing - * @property null|\Stripe\StripeObject $company Additional information about a company cardholder. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $email The cardholder's email address. - * @property null|\Stripe\StripeObject $individual Additional information about an individual cardholder. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $name The cardholder's name. This will be printed on cards issued to them. - * @property null|string $phone_number The cardholder's phone number. This is required for all cardholders who will be creating EU cards. See the 3D Secure documentation for more details. - * @property null|string[] $preferred_locales The cardholder’s preferred locales (languages), ordered by preference. Locales can be de, en, es, fr, or it. This changes the language of the 3D Secure flow and one-time password messages sent to the cardholder. - * @property \Stripe\StripeObject $requirements - * @property null|\Stripe\StripeObject $spending_controls Rules that control spending across this cardholder's cards. Refer to our documentation for more details. - * @property string $status Specifies whether to permit authorizations on this cardholder's cards. - * @property string $type One of individual or company. See Choose a cardholder type for more details. - */ -class Cardholder extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'issuing.cardholder'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const STATUS_ACTIVE = 'active'; - const STATUS_BLOCKED = 'blocked'; - const STATUS_INACTIVE = 'inactive'; - const TYPE_COMPANY = 'company'; - const TYPE_INDIVIDUAL = 'individual'; -} diff --git a/dependencies/stripe/stripe-php/lib/Issuing/Dispute.php b/dependencies/stripe/stripe-php/lib/Issuing/Dispute.php deleted file mode 100644 index a62d973..0000000 --- a/dependencies/stripe/stripe-php/lib/Issuing/Dispute.php +++ /dev/null @@ -1,51 +0,0 @@ -card issuer, you can dispute transactions that the cardholder does not recognize, suspects to be fraudulent, or has other issues with. - * - * Related guide: Issuing disputes - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Disputed amount in the card's currency and in the smallest currency unit. Usually the amount of the transaction, but can differ (usually because of currency fluctuation). - * @property null|\Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with the dispute. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency The currency the transaction was made in. - * @property \Stripe\StripeObject $evidence - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $status Current status of the dispute. - * @property string|\Stripe\Issuing\Transaction $transaction The transaction being disputed. - * @property null|\Stripe\StripeObject $treasury Treasury details related to this dispute if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts - */ -class Dispute extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'issuing.dispute'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const STATUS_EXPIRED = 'expired'; - const STATUS_LOST = 'lost'; - const STATUS_SUBMITTED = 'submitted'; - const STATUS_UNSUBMITTED = 'unsubmitted'; - const STATUS_WON = 'won'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Dispute the submited dispute - */ - public function submit($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/submit'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Issuing/Transaction.php b/dependencies/stripe/stripe-php/lib/Issuing/Transaction.php deleted file mode 100644 index 0ac093d..0000000 --- a/dependencies/stripe/stripe-php/lib/Issuing/Transaction.php +++ /dev/null @@ -1,45 +0,0 @@ -issued card that results in funds entering or leaving - * your Stripe account, such as a completed purchase or refund, is represented by an Issuing - * Transaction object. - * - * Related guide: Issued card transactions - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount The transaction amount, which will be reflected in your balance. This amount is in your currency and in the smallest currency unit. - * @property null|\Stripe\StripeObject $amount_details Detailed breakdown of amount components. These amounts are denominated in currency and in the smallest currency unit. - * @property null|string|\Stripe\Issuing\Authorization $authorization The Authorization object that led to this transaction. - * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction associated with this transaction. - * @property string|\Stripe\Issuing\Card $card The card used to make this transaction. - * @property null|string|\Stripe\Issuing\Cardholder $cardholder The cardholder to whom this transaction belongs. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string|\Stripe\Issuing\Dispute $dispute If you've disputed the transaction, the ID of the dispute. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property int $merchant_amount The amount that the merchant will receive, denominated in merchant_currency and in the smallest currency unit. It will be different from amount if the merchant is taking payment in a different currency. - * @property string $merchant_currency The currency with which the merchant is taking payment. - * @property \Stripe\StripeObject $merchant_data - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $purchase_details Additional purchase information that is optionally provided by the merchant. - * @property null|\Stripe\StripeObject $treasury Treasury details related to this transaction if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts - * @property string $type The nature of the transaction. - * @property null|string $wallet The digital wallet used for this transaction. One of apple_pay, google_pay, or samsung_pay. - */ -class Transaction extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'issuing.transaction'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const TYPE_CAPTURE = 'capture'; - const TYPE_REFUND = 'refund'; - const WALLET_APPLE_PAY = 'apple_pay'; - const WALLET_GOOGLE_PAY = 'google_pay'; - const WALLET_SAMSUNG_PAY = 'samsung_pay'; -} diff --git a/dependencies/stripe/stripe-php/lib/LineItem.php b/dependencies/stripe/stripe-php/lib/LineItem.php deleted file mode 100644 index 48dd6f4..0000000 --- a/dependencies/stripe/stripe-php/lib/LineItem.php +++ /dev/null @@ -1,25 +0,0 @@ -ISO currency code, in lowercase. Must be a supported currency. - * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. Defaults to product name. - * @property null|\Stripe\StripeObject[] $discounts The discounts applied to the line item. - * @property null|\Stripe\Price $price The price used to generate the line item. - * @property null|int $quantity The quantity of products being purchased. - * @property null|\Stripe\StripeObject[] $taxes The taxes applied to the line item. - */ -class LineItem extends ApiResource -{ - const OBJECT_NAME = 'item'; -} diff --git a/dependencies/stripe/stripe-php/lib/LoginLink.php b/dependencies/stripe/stripe-php/lib/LoginLink.php deleted file mode 100644 index 6eb49d4..0000000 --- a/dependencies/stripe/stripe-php/lib/LoginLink.php +++ /dev/null @@ -1,16 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $multi_use - * @property null|string $on_behalf_of The account (if any) for which the mandate is intended. - * @property string|\Stripe\PaymentMethod $payment_method ID of the payment method associated with this mandate. - * @property \Stripe\StripeObject $payment_method_details - * @property null|\Stripe\StripeObject $single_use - * @property string $status The status of the mandate, which indicates whether it can be used to initiate a payment. - * @property string $type The type of the mandate. - */ -class Mandate extends ApiResource -{ - const OBJECT_NAME = 'mandate'; - use ApiOperations\Retrieve; - const STATUS_ACTIVE = 'active'; - const STATUS_INACTIVE = 'inactive'; - const STATUS_PENDING = 'pending'; - const TYPE_MULTI_USE = 'multi_use'; - const TYPE_SINGLE_USE = 'single_use'; -} diff --git a/dependencies/stripe/stripe-php/lib/OAuth.php b/dependencies/stripe/stripe-php/lib/OAuth.php deleted file mode 100644 index dcb9b2a..0000000 --- a/dependencies/stripe/stripe-php/lib/OAuth.php +++ /dev/null @@ -1,75 +0,0 @@ -request('post', '/oauth/token', $params, null); - return Util\Util::convertToStripeObject($response->json, $opts); - } - /** - * Disconnects an account from your platform. - * - * @param null|array $params - * @param null|array $opts - * - * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails - * - * @return StripeObject object containing the response from the API - */ - public static function deauthorize($params = null, $opts = null) - { - $params = $params ?: []; - $base = $opts && \array_key_exists('connect_base', $opts) ? $opts['connect_base'] : Stripe::$connectBase; - $requestor = new ApiRequestor(null, $base); - $params['client_id'] = self::_getClientId($params); - list($response, $apiKey) = $requestor->request('post', '/oauth/deauthorize', $params, null); - return Util\Util::convertToStripeObject($response->json, $opts); - } - private static function _getClientId($params = null) - { - $clientId = $params && \array_key_exists('client_id', $params) ? $params['client_id'] : null; - if (null === $clientId) { - $clientId = Stripe::getClientId(); - } - if (null === $clientId) { - $msg = 'No client_id provided. (HINT: set your client_id using ' . '"Stripe::setClientId()". You can find your client_ids ' . 'in your Stripe dashboard at ' . 'https://dashboard.stripe.com/account/applications/settings, ' . 'after registering your account as a platform. See ' . 'https://stripe.com/docs/connect/standard-accounts for details, ' . 'or email support@stripe.com if you have any questions.'; - throw new Exception\AuthenticationException($msg); - } - return $clientId; - } -} diff --git a/dependencies/stripe/stripe-php/lib/OAuthErrorObject.php b/dependencies/stripe/stripe-php/lib/OAuthErrorObject.php deleted file mode 100644 index beea0d2..0000000 --- a/dependencies/stripe/stripe-php/lib/OAuthErrorObject.php +++ /dev/null @@ -1,28 +0,0 @@ - null, 'error_description' => null], $values); - parent::refreshFrom($values, $opts, $partial); - } -} diff --git a/dependencies/stripe/stripe-php/lib/PaymentIntent.php b/dependencies/stripe/stripe-php/lib/PaymentIntent.php deleted file mode 100644 index 7e2b4bb..0000000 --- a/dependencies/stripe/stripe-php/lib/PaymentIntent.php +++ /dev/null @@ -1,191 +0,0 @@ -multiple statuses - * throughout its lifetime as it interfaces with Stripe.js to perform - * authentication flows and ultimately creates at most one successful charge. - * - * Related guide: Payment Intents API - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). - * @property int $amount_capturable Amount that can be captured from this PaymentIntent. - * @property null|\Stripe\StripeObject $amount_details - * @property int $amount_received Amount that was collected by this PaymentIntent. - * @property null|string|\Stripe\StripeObject $application ID of the Connect application that created the PaymentIntent. - * @property null|int $application_fee_amount The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents use case for connected accounts. - * @property null|\Stripe\StripeObject $automatic_payment_methods Settings to configure compatible payment methods from the Stripe Dashboard - * @property null|int $canceled_at Populated when status is canceled, this is the time at which the PaymentIntent was canceled. Measured in seconds since the Unix epoch. - * @property null|string $cancellation_reason Reason for cancellation of this PaymentIntent, either user-provided (duplicate, fraudulent, requested_by_customer, or abandoned) or generated by Stripe internally (failed_invoice, void_invoice, or automatic). - * @property string $capture_method Controls when the funds will be captured from the customer's account. - * @property null|string $client_secret

      The client secret of this PaymentIntent. Used for client-side retrieval using a publishable key.

      The client secret can be used to complete a payment from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.

      Refer to our docs to accept a payment and learn about how client_secret should be handled.

      - * @property string $confirmation_method - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string|\Stripe\Customer $customer

      ID of the Customer this PaymentIntent belongs to, if one exists.

      Payment methods attached to other Customers cannot be used with this PaymentIntent.

      If present in combination with setup_future_usage, this PaymentIntent's payment method will be attached to the Customer after the PaymentIntent has been confirmed and any required actions from the user are complete.

      - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string|\Stripe\Invoice $invoice ID of the invoice that created this PaymentIntent, if it exists. - * @property null|\Stripe\StripeObject $last_payment_error The payment error encountered in the previous PaymentIntent confirmation. It will be cleared if the PaymentIntent is later updated for any reason. - * @property null|string|\Stripe\Charge $latest_charge The latest charge created by this payment intent. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. For more information, see the documentation. - * @property null|\Stripe\StripeObject $next_action If present, this property tells you what actions you need to take in order for your customer to fulfill a payment using the provided source. - * @property null|string|\Stripe\Account $on_behalf_of The account (if any) for which the funds of the PaymentIntent are intended. See the PaymentIntents use case for connected accounts for details. - * @property null|string|\Stripe\PaymentMethod $payment_method ID of the payment method used in this PaymentIntent. - * @property null|\Stripe\StripeObject $payment_method_options Payment-method-specific configuration for this PaymentIntent. - * @property string[] $payment_method_types The list of payment method types (e.g. card) that this PaymentIntent is allowed to use. - * @property null|\Stripe\StripeObject $processing If present, this property tells you about the processing state of the payment. - * @property null|string $receipt_email Email address that the receipt for the resulting payment will be sent to. If receipt_email is specified for a payment in live mode, a receipt will be sent regardless of your email settings. - * @property null|string|\Stripe\Review $review ID of the review associated with this PaymentIntent, if any. - * @property null|string $setup_future_usage

      Indicates that you intend to make future payments with this PaymentIntent's payment method.

      Providing this parameter will attach the payment method to the PaymentIntent's Customer, if present, after the PaymentIntent is confirmed and any required actions from the user are complete. If no Customer was provided, the payment method can still be attached to a Customer after the transaction completes.

      When processing card payments, Stripe also uses setup_future_usage to dynamically optimize your payment flow and comply with regional legislation and network rules, such as SCA.

      - * @property null|\Stripe\StripeObject $shipping Shipping information for this PaymentIntent. - * @property null|string|\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source $source This is a legacy field that will be removed in the future. It is the ID of the Source object that is associated with this PaymentIntent, if one was supplied. - * @property null|string $statement_descriptor For non-card charges, you can use this value as the complete description that appears on your customers’ statements. Must contain at least one letter, maximum 22 characters. - * @property null|string $statement_descriptor_suffix Provides information about a card payment that customers see on their statements. Concatenated with the prefix (shortened descriptor) or statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters for the concatenated descriptor. - * @property string $status Status of this PaymentIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, requires_capture, canceled, or succeeded. Read more about each PaymentIntent status. - * @property null|\Stripe\StripeObject $transfer_data The data with which to automatically create a Transfer when the payment is finalized. See the PaymentIntents use case for connected accounts for details. - * @property null|string $transfer_group A string that identifies the resulting payment as part of a group. See the PaymentIntents use case for connected accounts for details. - */ -class PaymentIntent extends ApiResource -{ - const OBJECT_NAME = 'payment_intent'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const CANCELLATION_REASON_ABANDONED = 'abandoned'; - const CANCELLATION_REASON_AUTOMATIC = 'automatic'; - const CANCELLATION_REASON_DUPLICATE = 'duplicate'; - const CANCELLATION_REASON_FAILED_INVOICE = 'failed_invoice'; - const CANCELLATION_REASON_FRAUDULENT = 'fraudulent'; - const CANCELLATION_REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; - const CANCELLATION_REASON_VOID_INVOICE = 'void_invoice'; - const CAPTURE_METHOD_AUTOMATIC = 'automatic'; - const CAPTURE_METHOD_AUTOMATIC_ASYNC = 'automatic_async'; - const CAPTURE_METHOD_MANUAL = 'manual'; - const CONFIRMATION_METHOD_AUTOMATIC = 'automatic'; - const CONFIRMATION_METHOD_MANUAL = 'manual'; - const SETUP_FUTURE_USAGE_OFF_SESSION = 'off_session'; - const SETUP_FUTURE_USAGE_ON_SESSION = 'on_session'; - const STATUS_CANCELED = 'canceled'; - const STATUS_PROCESSING = 'processing'; - const STATUS_REQUIRES_ACTION = 'requires_action'; - const STATUS_REQUIRES_CAPTURE = 'requires_capture'; - const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation'; - const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method'; - const STATUS_SUCCEEDED = 'succeeded'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent the applied payment intent - */ - public function applyCustomerBalance($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/apply_customer_balance'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent the canceled payment intent - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent the captured payment intent - */ - public function capture($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/capture'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent the confirmed payment intent - */ - public function confirm($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/confirm'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent the incremented payment intent - */ - public function incrementAuthorization($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/increment_authorization'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent the verified payment intent - */ - public function verifyMicrodeposits($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/verify_microdeposits'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\PaymentIntent> the payment intent search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/payment_intents/search'; - return self::_searchResource($url, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/PaymentLink.php b/dependencies/stripe/stripe-php/lib/PaymentLink.php deleted file mode 100644 index 0301167..0000000 --- a/dependencies/stripe/stripe-php/lib/PaymentLink.php +++ /dev/null @@ -1,78 +0,0 @@ -checkout session to render the payment page. You can use checkout session events to track payments through payment links. - * - * Related guide: Payment Links API - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Whether the payment link's url is active. If false, customers visiting the URL will be shown a page saying that the link has been deactivated. - * @property \Stripe\StripeObject $after_completion - * @property bool $allow_promotion_codes Whether user redeemable promotion codes are enabled. - * @property null|int $application_fee_amount The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. - * @property null|float $application_fee_percent This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. - * @property \Stripe\StripeObject $automatic_tax - * @property string $billing_address_collection Configuration for collecting the customer's billing address. - * @property null|\Stripe\StripeObject $consent_collection When set, provides configuration to gather active consent from customers. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property \Stripe\StripeObject[] $custom_fields Collect additional information from your customer using custom fields. Up to 2 fields are supported. - * @property \Stripe\StripeObject $custom_text - * @property string $customer_creation Configuration for Customer creation during checkout. - * @property null|\Stripe\StripeObject $invoice_creation Configuration for creating invoice for payment mode payment links. - * @property null|\Stripe\Collection<\Stripe\LineItem> $line_items The line items representing what is being sold. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string|\Stripe\Account $on_behalf_of The account on behalf of which to charge. See the Connect documentation for details. - * @property null|\Stripe\StripeObject $payment_intent_data Indicates the parameters to be passed to PaymentIntent creation during checkout. - * @property string $payment_method_collection Configuration for collecting a payment method during checkout. - * @property null|string[] $payment_method_types The list of payment method types that customers can use. When null, Stripe will dynamically show relevant payment methods you've enabled in your payment method settings. - * @property \Stripe\StripeObject $phone_number_collection - * @property null|\Stripe\StripeObject $shipping_address_collection Configuration for collecting the customer's shipping address. - * @property \Stripe\StripeObject[] $shipping_options The shipping rate options applied to the session. - * @property string $submit_type Indicates the type of transaction being performed which customizes relevant text on the page, such as the submit button. - * @property null|\Stripe\StripeObject $subscription_data When creating a subscription, the specified configuration data will be used. There must be at least one line item with a recurring price to use subscription_data. - * @property \Stripe\StripeObject $tax_id_collection - * @property null|\Stripe\StripeObject $transfer_data The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to. - * @property string $url The public URL that can be shared with customers. - */ -class PaymentLink extends ApiResource -{ - const OBJECT_NAME = 'payment_link'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const BILLING_ADDRESS_COLLECTION_AUTO = 'auto'; - const BILLING_ADDRESS_COLLECTION_REQUIRED = 'required'; - const CUSTOMER_CREATION_ALWAYS = 'always'; - const CUSTOMER_CREATION_IF_REQUIRED = 'if_required'; - const PAYMENT_METHOD_COLLECTION_ALWAYS = 'always'; - const PAYMENT_METHOD_COLLECTION_IF_REQUIRED = 'if_required'; - const SUBMIT_TYPE_AUTO = 'auto'; - const SUBMIT_TYPE_BOOK = 'book'; - const SUBMIT_TYPE_DONATE = 'donate'; - const SUBMIT_TYPE_PAY = 'pay'; - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> list of line items - */ - public static function allLineItems($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/line_items'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/PaymentMethod.php b/dependencies/stripe/stripe-php/lib/PaymentMethod.php deleted file mode 100644 index c248ed9..0000000 --- a/dependencies/stripe/stripe-php/lib/PaymentMethod.php +++ /dev/null @@ -1,126 +0,0 @@ -PaymentIntents to collect payments or save them to - * Customer objects to store instrument details for future payments. - * - * Related guides: Payment Methods and More Payment Scenarios. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $acss_debit - * @property null|\Stripe\StripeObject $affirm - * @property null|\Stripe\StripeObject $afterpay_clearpay - * @property null|\Stripe\StripeObject $alipay - * @property null|\Stripe\StripeObject $au_becs_debit - * @property null|\Stripe\StripeObject $bacs_debit - * @property null|\Stripe\StripeObject $bancontact - * @property \Stripe\StripeObject $billing_details - * @property null|\Stripe\StripeObject $blik - * @property null|\Stripe\StripeObject $boleto - * @property null|\Stripe\StripeObject $card - * @property null|\Stripe\StripeObject $card_present - * @property null|\Stripe\StripeObject $cashapp - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string|\Stripe\Customer $customer The ID of the Customer to which this PaymentMethod is saved. This will not be set when the PaymentMethod has not been saved to a Customer. - * @property null|\Stripe\StripeObject $customer_balance - * @property null|\Stripe\StripeObject $eps - * @property null|\Stripe\StripeObject $fpx - * @property null|\Stripe\StripeObject $giropay - * @property null|\Stripe\StripeObject $grabpay - * @property null|\Stripe\StripeObject $ideal - * @property null|\Stripe\StripeObject $interac_present - * @property null|\Stripe\StripeObject $klarna - * @property null|\Stripe\StripeObject $konbini - * @property null|\Stripe\StripeObject $link - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $oxxo - * @property null|\Stripe\StripeObject $p24 - * @property null|\Stripe\StripeObject $paynow - * @property null|\Stripe\StripeObject $paypal - * @property null|\Stripe\StripeObject $pix - * @property null|\Stripe\StripeObject $promptpay - * @property null|\Stripe\StripeObject $radar_options Options to configure Radar. See Radar Session for more information. - * @property null|\Stripe\StripeObject $sepa_debit - * @property null|\Stripe\StripeObject $sofort - * @property string $type The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type. - * @property null|\Stripe\StripeObject $us_bank_account - * @property null|\Stripe\StripeObject $wechat_pay - * @property null|\Stripe\StripeObject $zip - */ -class PaymentMethod extends ApiResource -{ - const OBJECT_NAME = 'payment_method'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const TYPE_ACSS_DEBIT = 'acss_debit'; - const TYPE_AFFIRM = 'affirm'; - const TYPE_AFTERPAY_CLEARPAY = 'afterpay_clearpay'; - const TYPE_ALIPAY = 'alipay'; - const TYPE_AU_BECS_DEBIT = 'au_becs_debit'; - const TYPE_BACS_DEBIT = 'bacs_debit'; - const TYPE_BANCONTACT = 'bancontact'; - const TYPE_BLIK = 'blik'; - const TYPE_BOLETO = 'boleto'; - const TYPE_CARD = 'card'; - const TYPE_CARD_PRESENT = 'card_present'; - const TYPE_CASHAPP = 'cashapp'; - const TYPE_CUSTOMER_BALANCE = 'customer_balance'; - const TYPE_EPS = 'eps'; - const TYPE_FPX = 'fpx'; - const TYPE_GIROPAY = 'giropay'; - const TYPE_GRABPAY = 'grabpay'; - const TYPE_IDEAL = 'ideal'; - const TYPE_INTERAC_PRESENT = 'interac_present'; - const TYPE_KLARNA = 'klarna'; - const TYPE_KONBINI = 'konbini'; - const TYPE_LINK = 'link'; - const TYPE_OXXO = 'oxxo'; - const TYPE_P24 = 'p24'; - const TYPE_PAYNOW = 'paynow'; - const TYPE_PAYPAL = 'paypal'; - const TYPE_PIX = 'pix'; - const TYPE_PROMPTPAY = 'promptpay'; - const TYPE_SEPA_DEBIT = 'sepa_debit'; - const TYPE_SOFORT = 'sofort'; - const TYPE_US_BANK_ACCOUNT = 'us_bank_account'; - const TYPE_WECHAT_PAY = 'wechat_pay'; - const TYPE_ZIP = 'zip'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod the attached payment method - */ - public function attach($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/attach'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod the detached payment method - */ - public function detach($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/detach'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Payout.php b/dependencies/stripe/stripe-php/lib/Payout.php deleted file mode 100644 index f27abd0..0000000 --- a/dependencies/stripe/stripe-php/lib/Payout.php +++ /dev/null @@ -1,104 +0,0 @@ -Payout object is created when you receive funds from Stripe, or when you - * initiate a payout to either a bank account or debit card of a connected - * Stripe account. You can retrieve individual payouts, - * as well as list all payouts. Payouts are made on varying - * schedules, depending on your country and - * industry. - * - * Related guide: Receiving payouts - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents (or local equivalent)) to be transferred to your bank account or debit card. - * @property int $arrival_date Date the payout is expected to arrive in the bank. This factors in delays like weekends or bank holidays. - * @property bool $automatic Returns true if the payout was created by an automated payout schedule, and false if it was requested manually. - * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction that describes the impact of this payout on your account balance. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string|\Stripe\BankAccount|\Stripe\Card $destination ID of the bank account or card the payout was sent to. - * @property null|string|\Stripe\BalanceTransaction $failure_balance_transaction If the payout failed or was canceled, this will be the ID of the balance transaction that reversed the initial balance transaction, and puts the funds from the failed payout back in your balance. - * @property null|string $failure_code Error code explaining reason for payout failure if available. See Types of payout failures for a list of failure codes. - * @property null|string $failure_message Message to user further explaining reason for payout failure if available. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $method The method used to send this payout, which can be standard or instant. instant is only supported for payouts to debit cards. (See Instant payouts for marketplaces for more information.) - * @property null|string|\Stripe\Payout $original_payout If the payout reverses another, this is the ID of the original payout. - * @property string $reconciliation_status If completed, the Balance Transactions API may be used to list all Balance Transactions that were paid out in this payout. - * @property null|string|\Stripe\Payout $reversed_by If the payout was reversed, this is the ID of the payout that reverses this payout. - * @property string $source_type The source balance this payout came from. One of card, fpx, or bank_account. - * @property null|string $statement_descriptor Extra information about a payout to be displayed on the user's bank statement. - * @property string $status Current status of the payout: paid, pending, in_transit, canceled or failed. A payout is pending until it is submitted to the bank, when it becomes in_transit. The status then changes to paid if the transaction goes through, or to failed or canceled (within 5 business days). Some failed payouts may initially show as paid but then change to failed. - * @property string $type Can be bank_account or card. - */ -class Payout extends ApiResource -{ - const OBJECT_NAME = 'payout'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const METHOD_INSTANT = 'instant'; - const METHOD_STANDARD = 'standard'; - const RECONCILIATION_STATUS_COMPLETED = 'completed'; - const RECONCILIATION_STATUS_IN_PROGRESS = 'in_progress'; - const RECONCILIATION_STATUS_NOT_APPLICABLE = 'not_applicable'; - const STATUS_CANCELED = 'canceled'; - const STATUS_FAILED = 'failed'; - const STATUS_IN_TRANSIT = 'in_transit'; - const STATUS_PAID = 'paid'; - const STATUS_PENDING = 'pending'; - const TYPE_BANK_ACCOUNT = 'bank_account'; - const TYPE_CARD = 'card'; - const FAILURE_ACCOUNT_CLOSED = 'account_closed'; - const FAILURE_ACCOUNT_FROZEN = 'account_frozen'; - const FAILURE_BANK_ACCOUNT_RESTRICTED = 'bank_account_restricted'; - const FAILURE_BANK_OWNERSHIP_CHANGED = 'bank_ownership_changed'; - const FAILURE_COULD_NOT_PROCESS = 'could_not_process'; - const FAILURE_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; - const FAILURE_DECLINED = 'declined'; - const FAILURE_INCORRECT_ACCOUNT_HOLDER_ADDRESS = 'incorrect_account_holder_address'; - const FAILURE_INCORRECT_ACCOUNT_HOLDER_NAME = 'incorrect_account_holder_name'; - const FAILURE_INCORRECT_ACCOUNT_HOLDER_TAX_ID = 'incorrect_account_holder_tax_id'; - const FAILURE_INSUFFICIENT_FUNDS = 'insufficient_funds'; - const FAILURE_INVALID_ACCOUNT_NUMBER = 'invalid_account_number'; - const FAILURE_INVALID_CURRENCY = 'invalid_currency'; - const FAILURE_NO_ACCOUNT = 'no_account'; - const FAILURE_UNSUPPORTED_CARD = 'unsupported_card'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout the canceled payout - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout the reversed payout - */ - public function reverse($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/reverse'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Person.php b/dependencies/stripe/stripe-php/lib/Person.php deleted file mode 100644 index f42e32b..0000000 --- a/dependencies/stripe/stripe-php/lib/Person.php +++ /dev/null @@ -1,97 +0,0 @@ -Standard onboarding or Express onboarding documentation for information about platform prefilling and account onboarding steps. - * - * Related guide: Handling identity verification with the API - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $account The account the person is associated with. - * @property null|\Stripe\StripeObject $address - * @property null|\Stripe\StripeObject $address_kana The Kana variation of the person's address (Japan only). - * @property null|\Stripe\StripeObject $address_kanji The Kanji variation of the person's address (Japan only). - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|\Stripe\StripeObject $dob - * @property null|string $email The person's email address. - * @property null|string $first_name The person's first name. - * @property null|string $first_name_kana The Kana variation of the person's first name (Japan only). - * @property null|string $first_name_kanji The Kanji variation of the person's first name (Japan only). - * @property null|string[] $full_name_aliases A list of alternate names or aliases that the person is known by. - * @property null|\Stripe\StripeObject $future_requirements Information about the upcoming new requirements for this person, including what information needs to be collected, and by when. - * @property null|string $gender The person's gender (International regulations require either "male" or "female"). - * @property null|bool $id_number_provided Whether the person's id_number was provided. - * @property null|bool $id_number_secondary_provided Whether the person's id_number_secondary was provided. - * @property null|string $last_name The person's last name. - * @property null|string $last_name_kana The Kana variation of the person's last name (Japan only). - * @property null|string $last_name_kanji The Kanji variation of the person's last name (Japan only). - * @property null|string $maiden_name The person's maiden name. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $nationality The country where the person is a national. - * @property null|string $phone The person's phone number. - * @property null|string $political_exposure Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction. - * @property null|\Stripe\StripeObject $registered_address - * @property null|\Stripe\StripeObject $relationship - * @property null|\Stripe\StripeObject $requirements Information about the requirements for this person, including what information needs to be collected, and by when. - * @property null|bool $ssn_last_4_provided Whether the last four digits of the person's Social Security number have been provided (U.S. only). - * @property null|\Stripe\StripeObject $verification - */ -class Person extends ApiResource -{ - const OBJECT_NAME = 'person'; - use ApiOperations\Delete; - use ApiOperations\Update; - const GENDER_FEMALE = 'female'; - const GENDER_MALE = 'male'; - const POLITICAL_EXPOSURE_EXISTING = 'existing'; - const POLITICAL_EXPOSURE_NONE = 'none'; - const VERIFICATION_STATUS_PENDING = 'pending'; - const VERIFICATION_STATUS_UNVERIFIED = 'unverified'; - const VERIFICATION_STATUS_VERIFIED = 'verified'; - /** - * @return string the API URL for this Stripe account reversal - */ - public function instanceUrl() - { - $id = $this['id']; - $account = $this['account']; - if (!$id) { - throw new Exception\UnexpectedValueException('Could not determine which URL to request: ' . "class instance has invalid ID: {$id}", null); - } - $id = Util\Util::utf8($id); - $account = Util\Util::utf8($account); - $base = Account::classUrl(); - $accountExtn = \urlencode($account); - $extn = \urlencode($id); - return "{$base}/{$accountExtn}/persons/{$extn}"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Persons cannot be retrieved without an account ID. Retrieve ' . "a person using `Account::retrievePerson('account_id', " . "'person_id')`."; - throw new Exception\BadMethodCallException($msg); - } - /** - * @param string $_id - * @param null|array $_params - * @param null|array|string $_options - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function update($_id, $_params = null, $_options = null) - { - $msg = 'Persons cannot be updated without an account ID. Update ' . "a person using `Account::updatePerson('account_id', " . "'person_id', \$updateParams)`."; - throw new Exception\BadMethodCallException($msg); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Plan.php b/dependencies/stripe/stripe-php/lib/Plan.php deleted file mode 100644 index 20221fe..0000000 --- a/dependencies/stripe/stripe-php/lib/Plan.php +++ /dev/null @@ -1,59 +0,0 @@ -Prices API. It replaces the Plans API and is backwards compatible to simplify your migration. - * - * Plans define the base price, currency, and billing cycle for recurring purchases of products. - * Products help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme. - * - * For example, you might have a single "gold" product that has plans for $10/month, $100/year, €9/month, and €90/year. - * - * Related guides: Set up a subscription and more about products and prices. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Whether the plan can be used for new purchases. - * @property null|string $aggregate_usage Specifies a usage aggregation strategy for plans of usage_type=metered. Allowed values are sum for summing up all usage during a period, last_during_period for using the last usage record reported within a period, last_ever for using the last usage record ever (across period bounds) or max which uses the usage record with the maximum reported usage during a period. Defaults to sum. - * @property null|int $amount The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if billing_scheme=per_unit. - * @property null|string $amount_decimal The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if billing_scheme=per_unit. - * @property string $billing_scheme Describes how to compute the price per period. Either per_unit or tiered. per_unit indicates that the fixed amount (specified in amount) will be charged per unit in quantity (for plans with usage_type=licensed), or per unit of total usage (for plans with usage_type=metered). tiered indicates that the unit pricing will be computed using a tiering strategy as defined using the tiers and tiers_mode attributes. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string $interval The frequency at which a subscription is billed. One of day, week, month or year. - * @property int $interval_count The number of intervals (specified in the interval attribute) between subscription billings. For example, interval=month and interval_count=3 bills every 3 months. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $nickname A brief description of the plan, hidden from customers. - * @property null|string|\Stripe\Product $product The product whose pricing this plan determines. - * @property null|\Stripe\StripeObject[] $tiers Each element represents a pricing tier. This parameter requires billing_scheme to be set to tiered. See also the documentation for billing_scheme. - * @property null|string $tiers_mode Defines if the tiering price should be graduated or volume based. In volume-based tiering, the maximum quantity within a period determines the per unit price. In graduated tiering, pricing can change as the quantity grows. - * @property null|\Stripe\StripeObject $transform_usage Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with tiers. - * @property null|int $trial_period_days Default number of trial days when subscribing a customer to this plan using trial_from_plan=true. - * @property string $usage_type Configures how the quantity per period should be determined. Can be either metered or licensed. licensed automatically bills the quantity set when adding it to a subscription. metered aggregates the total usage based on usage records. Defaults to licensed. - */ -class Plan extends ApiResource -{ - const OBJECT_NAME = 'plan'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const AGGREGATE_USAGE_LAST_DURING_PERIOD = 'last_during_period'; - const AGGREGATE_USAGE_LAST_EVER = 'last_ever'; - const AGGREGATE_USAGE_MAX = 'max'; - const AGGREGATE_USAGE_SUM = 'sum'; - const BILLING_SCHEME_PER_UNIT = 'per_unit'; - const BILLING_SCHEME_TIERED = 'tiered'; - const INTERVAL_DAY = 'day'; - const INTERVAL_MONTH = 'month'; - const INTERVAL_WEEK = 'week'; - const INTERVAL_YEAR = 'year'; - const TIERS_MODE_GRADUATED = 'graduated'; - const TIERS_MODE_VOLUME = 'volume'; - const USAGE_TYPE_LICENSED = 'licensed'; - const USAGE_TYPE_METERED = 'metered'; -} diff --git a/dependencies/stripe/stripe-php/lib/Price.php b/dependencies/stripe/stripe-php/lib/Price.php deleted file mode 100644 index b960ab1..0000000 --- a/dependencies/stripe/stripe-php/lib/Price.php +++ /dev/null @@ -1,66 +0,0 @@ -Products help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme. - * - * For example, you might have a single "gold" product that has prices for $10/month, $100/year, and €9 once. - * - * Related guides: Set up a subscription, create an invoice, and more about products and prices. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Whether the price can be used for new purchases. - * @property string $billing_scheme Describes how to compute the price per period. Either per_unit or tiered. per_unit indicates that the fixed amount (specified in unit_amount or unit_amount_decimal) will be charged per unit in quantity (for prices with usage_type=licensed), or per unit of total usage (for prices with usage_type=metered). tiered indicates that the unit pricing will be computed using a tiering strategy as defined using the tiers and tiers_mode attributes. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|\Stripe\StripeObject $currency_options Prices defined in each available currency option. Each key must be a three-letter ISO currency code and a supported currency. - * @property null|\Stripe\StripeObject $custom_unit_amount When set, provides configuration for the amount to be adjusted by the customer during Checkout Sessions and Payment Links. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $lookup_key A lookup key used to retrieve prices dynamically from a static string. This may be up to 200 characters. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $nickname A brief description of the price, hidden from customers. - * @property string|\Stripe\Product $product The ID of the product this price is associated with. - * @property null|\Stripe\StripeObject $recurring The recurring components of a price such as interval and usage_type. - * @property null|string $tax_behavior Only required if a default tax behavior was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of inclusive, exclusive, or unspecified. Once specified as either inclusive or exclusive, it cannot be changed. - * @property null|\Stripe\StripeObject[] $tiers Each element represents a pricing tier. This parameter requires billing_scheme to be set to tiered. See also the documentation for billing_scheme. - * @property null|string $tiers_mode Defines if the tiering price should be graduated or volume based. In volume-based tiering, the maximum quantity within a period determines the per unit price. In graduated tiering, pricing can change as the quantity grows. - * @property null|\Stripe\StripeObject $transform_quantity Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with tiers. - * @property string $type One of one_time or recurring depending on whether the price is for a one-time purchase or a recurring (subscription) purchase. - * @property null|int $unit_amount The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if billing_scheme=per_unit. - * @property null|string $unit_amount_decimal The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if billing_scheme=per_unit. - */ -class Price extends ApiResource -{ - const OBJECT_NAME = 'price'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const BILLING_SCHEME_PER_UNIT = 'per_unit'; - const BILLING_SCHEME_TIERED = 'tiered'; - const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; - const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; - const TAX_BEHAVIOR_UNSPECIFIED = 'unspecified'; - const TIERS_MODE_GRADUATED = 'graduated'; - const TIERS_MODE_VOLUME = 'volume'; - const TYPE_ONE_TIME = 'one_time'; - const TYPE_RECURRING = 'recurring'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Price> the price search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/prices/search'; - return self::_searchResource($url, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Product.php b/dependencies/stripe/stripe-php/lib/Product.php deleted file mode 100644 index 8597990..0000000 --- a/dependencies/stripe/stripe-php/lib/Product.php +++ /dev/null @@ -1,62 +0,0 @@ -Prices to configure pricing in Payment Links, Checkout, and Subscriptions. - * - * Related guides: Set up a subscription, - * share a Payment Link, - * accept payments with Checkout, - * and more about Products and Prices - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Whether the product is currently available for purchase. - * @property null|string[] $attributes A list of up to 5 attributes that each SKU can provide values for (e.g., ["color", "size"]). - * @property null|string $caption A short one-line description of the product, meant to be displayable to the customer. Only applicable to products of type=good. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string[] $deactivate_on An array of connect application identifiers that cannot purchase this product. Only applicable to products of type=good. - * @property null|string|\Stripe\Price $default_price The ID of the Price object that is the default price for this product. - * @property null|string $description The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes. - * @property string[] $images A list of up to 8 URLs of images for this product, meant to be displayable to the customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $name The product's name, meant to be displayable to the customer. - * @property null|\Stripe\StripeObject $package_dimensions The dimensions of this product for shipping purposes. - * @property null|bool $shippable Whether this product is shipped (i.e., physical goods). - * @property null|string $statement_descriptor Extra information about a product which will appear on your customer's credit card statement. In the case that multiple products are billed at once, the first statement descriptor will be used. - * @property null|string|\Stripe\TaxCode $tax_code A tax code ID. - * @property string $type The type of the product. The product is either of type good, which is eligible for use with Orders and SKUs, or service, which is eligible for use with Subscriptions and Plans. - * @property null|string $unit_label A label that represents units of this product. When set, this will be included in customers' receipts, invoices, Checkout, and the customer portal. - * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. - * @property null|string $url A URL of a publicly-accessible webpage for this product. - */ -class Product extends ApiResource -{ - const OBJECT_NAME = 'product'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const TYPE_GOOD = 'good'; - const TYPE_SERVICE = 'service'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Product> the product search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/products/search'; - return self::_searchResource($url, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/PromotionCode.php b/dependencies/stripe/stripe-php/lib/PromotionCode.php deleted file mode 100644 index 367251e..0000000 --- a/dependencies/stripe/stripe-php/lib/PromotionCode.php +++ /dev/null @@ -1,31 +0,0 @@ -coupon. It can be used to - * create multiple codes for a single coupon. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Whether the promotion code is currently active. A promotion code is only active if the coupon is also valid. - * @property string $code The customer-facing code. Regardless of case, this code must be unique across all active promotion codes for each customer. - * @property \Stripe\Coupon $coupon A coupon contains information about a percent-off or amount-off discount you might want to apply to a customer. Coupons may be applied to subscriptions, invoices, checkout sessions, quotes, and more. Coupons do not work with conventional one-off charges or payment intents. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string|\Stripe\Customer $customer The customer that this promotion code can be used by. - * @property null|int $expires_at Date at which the promotion code can no longer be redeemed. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|int $max_redemptions Maximum number of times this promotion code can be redeemed. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property \Stripe\StripeObject $restrictions - * @property int $times_redeemed Number of times this promotion code has been used. - */ -class PromotionCode extends ApiResource -{ - const OBJECT_NAME = 'promotion_code'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/Quote.php b/dependencies/stripe/stripe-php/lib/Quote.php deleted file mode 100644 index d50ff0a..0000000 --- a/dependencies/stripe/stripe-php/lib/Quote.php +++ /dev/null @@ -1,156 +0,0 @@ -charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay invoices at the end of the subscription cycle or on finalization using the default payment method attached to the subscription or customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as active. Defaults to charge_automatically. - * @property \Stripe\StripeObject $computed - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string|\Stripe\Customer $customer The customer which this quote belongs to. A customer is required before finalizing the quote. Once specified, it cannot be changed. - * @property null|(string|\Stripe\TaxRate)[] $default_tax_rates The tax rates applied to this quote. - * @property null|string $description A description that will be displayed on the quote PDF. - * @property (string|\Stripe\Discount)[] $discounts The discounts applied to this quote. - * @property int $expires_at The date on which the quote will be canceled if in open or draft status. Measured in seconds since the Unix epoch. - * @property null|string $footer A footer that will be displayed on the quote PDF. - * @property null|\Stripe\StripeObject $from_quote Details of the quote that was cloned. See the cloning documentation for more details. - * @property null|string $header A header that will be displayed on the quote PDF. - * @property null|string|\Stripe\Invoice $invoice The invoice that was created from this quote. - * @property null|\Stripe\StripeObject $invoice_settings All invoices will be billed using the specified settings. - * @property null|\Stripe\Collection<\Stripe\LineItem> $line_items A list of items the customer is being quoted for. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $number A unique number that identifies this particular quote. This number is assigned once the quote is finalized. - * @property null|string|\Stripe\Account $on_behalf_of The account on behalf of which to charge. See the Connect documentation for details. - * @property string $status The status of the quote. - * @property \Stripe\StripeObject $status_transitions - * @property null|string|\Stripe\Subscription $subscription The subscription that was created or updated from this quote. - * @property \Stripe\StripeObject $subscription_data - * @property null|string|\Stripe\SubscriptionSchedule $subscription_schedule The subscription schedule that was created or updated from this quote. - * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this quote belongs to. - * @property \Stripe\StripeObject $total_details - * @property null|\Stripe\StripeObject $transfer_data The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the invoices. - */ -class Quote extends ApiResource -{ - const OBJECT_NAME = 'quote'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; - const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; - const STATUS_ACCEPTED = 'accepted'; - const STATUS_CANCELED = 'canceled'; - const STATUS_DRAFT = 'draft'; - const STATUS_OPEN = 'open'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote the accepted quote - */ - public function accept($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/accept'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote the canceled quote - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote the finalized quote - */ - public function finalizeQuote($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/finalize'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> list of line items - */ - public static function allComputedUpfrontLineItems($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/computed_upfront_line_items'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> list of line items - */ - public static function allLineItems($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/line_items'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param callable $readBodyChunkCallable - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return void - */ - public function pdf($readBodyChunkCallable, $params = null, $opts = null) - { - $opts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($opts); - if (!isset($opts->apiBase)) { - $opts->apiBase = \WP_Ultimo\Dependencies\Stripe\Stripe::$apiUploadBase; - } - $url = $this->instanceUrl() . '/pdf'; - $this->_requestStream('get', $url, $readBodyChunkCallable, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php b/dependencies/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php deleted file mode 100644 index aab05be..0000000 --- a/dependencies/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php +++ /dev/null @@ -1,33 +0,0 @@ -Early fraud warnings - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $actionable An EFW is actionable if it has not received a dispute and has not been fully refunded. You may wish to proactively refund a charge that receives an EFW, in order to avoid receiving a dispute later. - * @property string|\Stripe\Charge $charge ID of the charge this early fraud warning is for, optionally expanded. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $fraud_type The type of fraud labelled by the issuer. One of card_never_received, fraudulent_card_application, made_with_counterfeit_card, made_with_lost_card, made_with_stolen_card, misc, unauthorized_use_of_card. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the Payment Intent this early fraud warning is for, optionally expanded. - */ -class EarlyFraudWarning extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'radar.early_fraud_warning'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const FRAUD_TYPE_CARD_NEVER_RECEIVED = 'card_never_received'; - const FRAUD_TYPE_FRAUDULENT_CARD_APPLICATION = 'fraudulent_card_application'; - const FRAUD_TYPE_MADE_WITH_COUNTERFEIT_CARD = 'made_with_counterfeit_card'; - const FRAUD_TYPE_MADE_WITH_LOST_CARD = 'made_with_lost_card'; - const FRAUD_TYPE_MADE_WITH_STOLEN_CARD = 'made_with_stolen_card'; - const FRAUD_TYPE_MISC = 'misc'; - const FRAUD_TYPE_UNAUTHORIZED_USE_OF_CARD = 'unauthorized_use_of_card'; -} diff --git a/dependencies/stripe/stripe-php/lib/Radar/ValueList.php b/dependencies/stripe/stripe-php/lib/Radar/ValueList.php deleted file mode 100644 index a713805..0000000 --- a/dependencies/stripe/stripe-php/lib/Radar/ValueList.php +++ /dev/null @@ -1,40 +0,0 @@ -Default Stripe lists - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property string $alias The name of the value list for use in rules. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $created_by The name or email address of the user who created this value list. - * @property string $item_type The type of items in the value list. One of card_fingerprint, us_bank_account_fingerprint, sepa_debit_fingerprint, card_bin, email, ip_address, country, string, case_sensitive_string, or customer_id. - * @property \Stripe\Collection<\Stripe\Radar\ValueListItem> $list_items List of items contained within this value list. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $name The name of the value list. - */ -class ValueList extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'radar.value_list'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Delete; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const ITEM_TYPE_CARD_BIN = 'card_bin'; - const ITEM_TYPE_CARD_FINGERPRINT = 'card_fingerprint'; - const ITEM_TYPE_CASE_SENSITIVE_STRING = 'case_sensitive_string'; - const ITEM_TYPE_COUNTRY = 'country'; - const ITEM_TYPE_CUSTOMER_ID = 'customer_id'; - const ITEM_TYPE_EMAIL = 'email'; - const ITEM_TYPE_IP_ADDRESS = 'ip_address'; - const ITEM_TYPE_SEPA_DEBIT_FINGERPRINT = 'sepa_debit_fingerprint'; - const ITEM_TYPE_STRING = 'string'; - const ITEM_TYPE_US_BANK_ACCOUNT_FINGERPRINT = 'us_bank_account_fingerprint'; -} diff --git a/dependencies/stripe/stripe-php/lib/Radar/ValueListItem.php b/dependencies/stripe/stripe-php/lib/Radar/ValueListItem.php deleted file mode 100644 index 87a2793..0000000 --- a/dependencies/stripe/stripe-php/lib/Radar/ValueListItem.php +++ /dev/null @@ -1,26 +0,0 @@ -Managing list items - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $created_by The name or email address of the user who added this item to the value list. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $value The value of the item. - * @property string $value_list The identifier of the value list this item belongs to. - */ -class ValueListItem extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'radar.value_list_item'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Delete; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/RecipientTransfer.php b/dependencies/stripe/stripe-php/lib/RecipientTransfer.php deleted file mode 100644 index 1cb27b6..0000000 --- a/dependencies/stripe/stripe-php/lib/RecipientTransfer.php +++ /dev/null @@ -1,36 +0,0 @@ -Refund objects allow you to refund a charge that has previously been created - * but not yet refunded. Funds will be refunded to the credit or debit card that - * was originally charged. - * - * Related guide: Refunds - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount, in cents (or local equivalent). - * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact on your account balance. - * @property null|string|\Stripe\Charge $charge ID of the charge that was refunded. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. (Available on non-card refunds only) - * @property null|string|\Stripe\BalanceTransaction $failure_balance_transaction If the refund failed, this balance transaction describes the adjustment made on your account balance that reverses the initial balance transaction. - * @property null|string $failure_reason If the refund failed, the reason for refund failure if known. Possible values are lost_or_stolen_card, expired_or_canceled_card, charge_for_pending_refund_disputed, insufficient_funds, declined, merchant_request or unknown. - * @property null|string $instructions_email For payment methods without native refund support (e.g., Konbini, PromptPay), email for the customer to receive refund instructions. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $next_action - * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the PaymentIntent that was refunded. - * @property null|string $reason Reason for the refund, either user-provided (duplicate, fraudulent, or requested_by_customer) or generated by Stripe internally (expired_uncaptured_charge). - * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this refund. - * @property null|string|\Stripe\TransferReversal $source_transfer_reversal The transfer reversal that is associated with the refund. Only present if the charge came from another Stripe account. See the Connect documentation for details. - * @property null|string $status Status of the refund. For credit card refunds, this can be pending, succeeded, or failed. For other types of refunds, it can be pending, requires_action, succeeded, failed, or canceled. Refer to our refunds documentation for more details. - * @property null|string|\Stripe\TransferReversal $transfer_reversal If the accompanying transfer was reversed, the transfer reversal object. Only applicable if the charge was created using the destination parameter. - */ -class Refund extends ApiResource -{ - const OBJECT_NAME = 'refund'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const FAILURE_REASON_EXPIRED_OR_CANCELED_CARD = 'expired_or_canceled_card'; - const FAILURE_REASON_LOST_OR_STOLEN_CARD = 'lost_or_stolen_card'; - const FAILURE_REASON_UNKNOWN = 'unknown'; - const REASON_DUPLICATE = 'duplicate'; - const REASON_EXPIRED_UNCAPTURED_CHARGE = 'expired_uncaptured_charge'; - const REASON_FRAUDULENT = 'fraudulent'; - const REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; - const STATUS_CANCELED = 'canceled'; - const STATUS_FAILED = 'failed'; - const STATUS_PENDING = 'pending'; - const STATUS_REQUIRES_ACTION = 'requires_action'; - const STATUS_SUCCEEDED = 'succeeded'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Refund the canceled refund - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Reporting/ReportRun.php b/dependencies/stripe/stripe-php/lib/Reporting/ReportRun.php deleted file mode 100644 index 243a593..0000000 --- a/dependencies/stripe/stripe-php/lib/Reporting/ReportRun.php +++ /dev/null @@ -1,33 +0,0 @@ -API Access to Reports. - * - * Note that certain report types can only be run based on your live-mode data (not test-mode - * data), and will error when queried without a live-mode API key. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $error If something should go wrong during the run, a message about the failure (populated when status=failed). - * @property bool $livemode true if the report is run on live mode data and false if it is run on test mode data. - * @property \Stripe\StripeObject $parameters - * @property string $report_type The ID of the report type to run, such as "balance.summary.1". - * @property null|\Stripe\File $result The file object representing the result of the report run (populated when status=succeeded). - * @property string $status Status of this report run. This will be pending when the run is initially created. When the run finishes, this will be set to succeeded and the result field will be populated. Rarely, we may encounter an error, at which point this will be set to failed and the error field will be populated. - * @property null|int $succeeded_at Timestamp at which this run successfully finished (populated when status=succeeded). Measured in seconds since the Unix epoch. - */ -class ReportRun extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'reporting.report_run'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/Reporting/ReportType.php b/dependencies/stripe/stripe-php/lib/Reporting/ReportType.php deleted file mode 100644 index a764df0..0000000 --- a/dependencies/stripe/stripe-php/lib/Reporting/ReportType.php +++ /dev/null @@ -1,31 +0,0 @@ -API Access to Reports documentation - * for those Report Type IDs, along with required and optional parameters. - * - * Note that certain report types can only be run based on your live-mode data (not test-mode - * data), and will error when queried without a live-mode API key. - * - * @property string $id The ID of the Report Type, such as balance.summary.1. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $data_available_end Most recent time for which this Report Type is available. Measured in seconds since the Unix epoch. - * @property int $data_available_start Earliest time for which this Report Type is available. Measured in seconds since the Unix epoch. - * @property null|string[] $default_columns List of column names that are included by default when this Report Type gets run. (If the Report Type doesn't support the columns parameter, this will be null.) - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $name Human-readable name of the Report Type - * @property int $updated When this Report Type was latest updated. Measured in seconds since the Unix epoch. - * @property int $version Version of the Report Type. Different versions report with the same ID will have the same purpose, but may take different run parameters or have different result schemas. - */ -class ReportType extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'reporting.report_type'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/RequestTelemetry.php b/dependencies/stripe/stripe-php/lib/RequestTelemetry.php deleted file mode 100644 index 781a690..0000000 --- a/dependencies/stripe/stripe-php/lib/RequestTelemetry.php +++ /dev/null @@ -1,25 +0,0 @@ -requestId = $requestId; - $this->requestDuration = $requestDuration; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Review.php b/dependencies/stripe/stripe-php/lib/Review.php deleted file mode 100644 index 0ce6b93..0000000 --- a/dependencies/stripe/stripe-php/lib/Review.php +++ /dev/null @@ -1,67 +0,0 @@ -Radar and reviewing payments - * here. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $billing_zip The ZIP or postal code of the card used, if applicable. - * @property null|string|\Stripe\Charge $charge The charge associated with this review. - * @property null|string $closed_reason The reason the review was closed, or null if it has not yet been closed. One of approved, refunded, refunded_as_fraud, disputed, or redacted. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $ip_address The IP address where the payment originated. - * @property null|\Stripe\StripeObject $ip_address_location Information related to the location of the payment. Note that this information is an approximation and attempts to locate the nearest population center - it should not be used to determine a specific address. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property bool $open If true, the review needs action. - * @property string $opened_reason The reason the review was opened. One of rule or manual. - * @property null|string|\Stripe\PaymentIntent $payment_intent The PaymentIntent ID associated with this review, if one exists. - * @property string $reason The reason the review is currently open or closed. One of rule, manual, approved, refunded, refunded_as_fraud, disputed, or redacted. - * @property null|\Stripe\StripeObject $session Information related to the browsing session of the user who initiated the payment. - */ -class Review extends ApiResource -{ - const OBJECT_NAME = 'review'; - use ApiOperations\All; - use ApiOperations\Retrieve; - const CLOSED_REASON_APPROVED = 'approved'; - const CLOSED_REASON_DISPUTED = 'disputed'; - const CLOSED_REASON_REDACTED = 'redacted'; - const CLOSED_REASON_REFUNDED = 'refunded'; - const CLOSED_REASON_REFUNDED_AS_FRAUD = 'refunded_as_fraud'; - const OPENED_REASON_MANUAL = 'manual'; - const OPENED_REASON_RULE = 'rule'; - /** - * Possible string representations of the current, the opening or the closure reason of the review. - * Not all of these enumeration apply to all of the ´reason´ fields. Please consult the Review object to - * determine where these are apply. - * - * @see https://stripe.com/docs/api/radar/reviews/object - */ - const REASON_APPROVED = 'approved'; - const REASON_DISPUTED = 'disputed'; - const REASON_MANUAL = 'manual'; - const REASON_REFUNDED = 'refunded'; - const REASON_REFUNDED_AS_FRAUD = 'refunded_as_fraud'; - const REASON_RULE = 'rule'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Review the approved review - */ - public function approve($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/approve'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/SearchResult.php b/dependencies/stripe/stripe-php/lib/SearchResult.php deleted file mode 100644 index 1131e53..0000000 --- a/dependencies/stripe/stripe-php/lib/SearchResult.php +++ /dev/null @@ -1,202 +0,0 @@ -Collection in that they both wrap - * around a list of objects and provide pagination. However the - * SearchResult object paginates by relying on a - * next_page token included in the response rather than using - * object IDs and a starting_before/ending_after - * parameter. Thus, SearchResult only supports forwards pagination. - * - * The {@see $total_count} property is only available when - * the `expand` parameter contains `total_count`. - * - * @template TStripeObject of StripeObject - * @template-implements \IteratorAggregate - * - * @property string $object - * @property string $url - * @property string $next_page - * @property int $total_count - * @property bool $has_more - * @property TStripeObject[] $data - */ -class SearchResult extends StripeObject implements \Countable, \IteratorAggregate -{ - const OBJECT_NAME = 'search_result'; - use ApiOperations\Request; - /** @var array */ - protected $filters = []; - /** - * @return string the base URL for the given class - */ - public static function baseUrl() - { - return Stripe::$apiBase; - } - /** - * Returns the filters. - * - * @return array the filters - */ - public function getFilters() - { - return $this->filters; - } - /** - * Sets the filters, removing paging options. - * - * @param array $filters the filters - */ - public function setFilters($filters) - { - $this->filters = $filters; - } - /** - * @return mixed - */ - #[\ReturnTypeWillChange] - public function offsetGet($k) - { - if (\is_string($k)) { - return parent::offsetGet($k); - } - $msg = "You tried to access the {$k} index, but SearchResult " . 'types only support string keys. (HINT: Search calls ' . 'return an object with a `data` (which is the data ' . "array). You likely want to call ->data[{$k}])"; - throw new Exception\InvalidArgumentException($msg); - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws Exception\ApiErrorException - * - * @return SearchResult - */ - public function all($params = null, $opts = null) - { - self::_validateParams($params); - list($url, $params) = $this->extractPathAndUpdateParams($params); - list($response, $opts) = $this->_request('get', $url, $params, $opts); - $obj = Util\Util::convertToStripeObject($response, $opts); - if (!$obj instanceof \WP_Ultimo\Dependencies\Stripe\SearchResult) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\UnexpectedValueException('Expected type ' . \WP_Ultimo\Dependencies\Stripe\SearchResult::class . ', got "' . \get_class($obj) . '" instead.'); - } - $obj->setFilters($params); - return $obj; - } - /** - * @return int the number of objects in the current page - */ - #[\ReturnTypeWillChange] - public function count() - { - return \count($this->data); - } - /** - * @return \ArrayIterator an iterator that can be used to iterate - * across objects in the current page - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->data); - } - /** - * @return \Generator|TStripeObject[] A generator that can be used to - * iterate across all objects across all pages. As page boundaries are - * encountered, the next page will be fetched automatically for - * continued iteration. - */ - public function autoPagingIterator() - { - $page = $this; - while (\true) { - foreach ($page as $item) { - (yield $item); - } - $page = $page->nextPage(); - if ($page->isEmpty()) { - break; - } - } - } - /** - * Returns an empty set of search results. This is returned from - * {@see nextPage()} when we know that there isn't a next page in order to - * replicate the behavior of the API when it attempts to return a page - * beyond the last. - * - * @param null|array|string $opts - * - * @return SearchResult - */ - public static function emptySearchResult($opts = null) - { - return SearchResult::constructFrom(['data' => []], $opts); - } - /** - * Returns true if the page object contains no element. - * - * @return bool - */ - public function isEmpty() - { - return empty($this->data); - } - /** - * Fetches the next page in the resource list (if there is one). - * - * This method will try to respect the limit of the current page. If none - * was given, the default limit will be fetched again. - * - * @param null|array $params - * @param null|array|string $opts - * - * @return SearchResult - */ - public function nextPage($params = null, $opts = null) - { - if (!$this->has_more) { - return static::emptySearchResult($opts); - } - $params = \array_merge($this->filters ?: [], ['page' => $this->next_page], $params ?: []); - return $this->all($params, $opts); - } - /** - * Gets the first item from the current page. Returns `null` if the current page is empty. - * - * @return null|TStripeObject - */ - public function first() - { - return \count($this->data) > 0 ? $this->data[0] : null; - } - /** - * Gets the last item from the current page. Returns `null` if the current page is empty. - * - * @return null|TStripeObject - */ - public function last() - { - return \count($this->data) > 0 ? $this->data[\count($this->data) - 1] : null; - } - private function extractPathAndUpdateParams($params) - { - $url = \parse_url($this->url); - if (!isset($url['path'])) { - throw new Exception\UnexpectedValueException("Could not parse list url into parts: {$url}"); - } - if (isset($url['query'])) { - // If the URL contains a query param, parse it out into $params so they - // don't interact weirdly with each other. - $query = []; - \parse_str($url['query'], $query); - $params = \array_merge($params ?: [], $query); - } - return [$url['path'], $params]; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/AbstractService.php b/dependencies/stripe/stripe-php/lib/Service/AbstractService.php deleted file mode 100644 index 9445b72..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/AbstractService.php +++ /dev/null @@ -1,98 +0,0 @@ -client = $client; - $this->streamingClient = $client; - } - /** - * Gets the client used by this service to send requests. - * - * @return \Stripe\StripeClientInterface - */ - public function getClient() - { - return $this->client; - } - /** - * Gets the client used by this service to send requests. - * - * @return \Stripe\StripeStreamingClientInterface - */ - public function getStreamingClient() - { - return $this->streamingClient; - } - /** - * Translate null values to empty strings. For service methods, - * we interpret null as a request to unset the field, which - * corresponds to sending an empty string for the field to the - * API. - * - * @param null|array $params - */ - private static function formatParams($params) - { - if (null === $params) { - return null; - } - \array_walk_recursive($params, function (&$value, $key) { - if (null === $value) { - $value = ''; - } - }); - return $params; - } - protected function request($method, $path, $params, $opts) - { - return $this->getClient()->request($method, $path, self::formatParams($params), $opts); - } - protected function requestStream($method, $path, $readBodyChunkCallable, $params, $opts) - { - // TODO (MAJOR): Add this method to StripeClientInterface - // @phpstan-ignore-next-line - return $this->getStreamingClient()->requestStream($method, $path, $readBodyChunkCallable, self::formatParams($params), $opts); - } - protected function requestCollection($method, $path, $params, $opts) - { - // TODO (MAJOR): Add this method to StripeClientInterface - // @phpstan-ignore-next-line - return $this->getClient()->requestCollection($method, $path, self::formatParams($params), $opts); - } - protected function requestSearchResult($method, $path, $params, $opts) - { - // TODO (MAJOR): Add this method to StripeClientInterface - // @phpstan-ignore-next-line - return $this->getClient()->requestSearchResult($method, $path, self::formatParams($params), $opts); - } - protected function buildPath($basePath, ...$ids) - { - foreach ($ids as $id) { - if (null === $id || '' === \trim($id)) { - $msg = 'The resource ID cannot be null or whitespace.'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($msg); - } - } - return \sprintf($basePath, ...\array_map('\\urlencode', $ids)); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/AbstractServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/AbstractServiceFactory.php deleted file mode 100644 index 253f617..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/AbstractServiceFactory.php +++ /dev/null @@ -1,61 +0,0 @@ - */ - private $services; - /** - * @param \Stripe\StripeClientInterface $client - */ - public function __construct($client) - { - $this->client = $client; - $this->services = []; - } - /** - * @param string $name - * - * @return null|string - */ - protected abstract function getServiceClass($name); - /** - * @param string $name - * - * @return null|AbstractService|AbstractServiceFactory - */ - public function __get($name) - { - return $this->getService($name); - } - /** - * @param string $name - * - * @return null|AbstractService|AbstractServiceFactory - */ - public function getService($name) - { - $serviceClass = $this->getServiceClass($name); - if (null !== $serviceClass) { - if (!\array_key_exists($name, $this->services)) { - $this->services[$name] = new $serviceClass($this->client); - } - return $this->services[$name]; - } - \trigger_error('Undefined property: ' . static::class . '::$' . $name); - return null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/AccountLinkService.php b/dependencies/stripe/stripe-php/lib/Service/AccountLinkService.php deleted file mode 100644 index 01f1f7d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/AccountLinkService.php +++ /dev/null @@ -1,24 +0,0 @@ -request('post', '/v1/account_links', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/AccountService.php b/dependencies/stripe/stripe-php/lib/Service/AccountService.php deleted file mode 100644 index 941251e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/AccountService.php +++ /dev/null @@ -1,371 +0,0 @@ -Connect. If you’re not a platform, the list is empty. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Account> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/accounts', $params, $opts); - } - /** - * Returns a list of capabilities associated with the account. The capabilities are - * returned sorted by creation date, with the most recent capability appearing - * first. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Capability> - */ - public function allCapabilities($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/capabilities', $parentId), $params, $opts); - } - /** - * List external accounts for an account. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\BankAccount|\Stripe\Card> - */ - public function allExternalAccounts($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/external_accounts', $parentId), $params, $opts); - } - /** - * Returns a list of people associated with the account’s legal entity. The people - * are returned sorted by creation date, with the most recent people appearing - * first. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Person> - */ - public function allPersons($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/persons', $parentId), $params, $opts); - } - /** - * With Connect, you can create Stripe accounts for - * your users. To do this, you’ll first need to register your - * platform. - * - * If you’ve already collected information for your connected accounts, you can prefill that information - * when creating the account. Connect Onboarding won’t ask for the prefilled - * information during account onboarding. You can prefill any information on the - * account. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/accounts', $params, $opts); - } - /** - * Create an external account for a given account. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public function createExternalAccount($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/external_accounts', $parentId), $params, $opts); - } - /** - * Creates a single-use login link for an Express account to access their Stripe - * dashboard. - * - * You may only create login links for Express accounts connected to your - * platform. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\LoginLink - */ - public function createLoginLink($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/login_links', $parentId), $params, $opts); - } - /** - * Creates a new person. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public function createPerson($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/persons', $parentId), $params, $opts); - } - /** - * With Connect, you can delete accounts you manage. - * - * Accounts created using test-mode keys can be deleted at any time. Standard - * accounts created using live-mode keys cannot be deleted. Custom or Express - * accounts created using live-mode keys can only be deleted once all balances are - * zero. - * - * If you want to delete your own account, use the account information tab in - * your account settings instead. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); - } - /** - * Delete a specified external account for a given account. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public function deleteExternalAccount($parentId, $id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); - } - /** - * Deletes an existing person’s relationship to the account’s legal entity. Any - * person with a relationship for an account can be deleted through the API, except - * if the person is the account_opener. If your integration is using - * the executive parameter, you cannot delete the only verified - * executive on file. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public function deletePerson($parentId, $id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); - } - /** - * With Connect, you may flag accounts as suspicious. - * - * Test-mode Custom and Express accounts can be rejected at any time. Accounts - * created using live-mode keys may only be rejected once all balances are zero. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account - */ - public function reject($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/reject', $id), $params, $opts); - } - /** - * Retrieves information about the specified Account Capability. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Capability - */ - public function retrieveCapability($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/accounts/%s/capabilities/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieve a specified external account for a given account. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public function retrieveExternalAccount($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves an existing person. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public function retrievePerson($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); - } - /** - * Updates a connected account by setting the - * values of the parameters passed. Any parameters not provided are left unchanged. - * - * For Custom accounts, you can update any information on the account. For other - * accounts, you can update all information until that account has started to go - * through Connect Onboarding. Once you create an Account Link for a Standard or Express - * account, some parameters can no longer be changed. These are marked as - * Custom Only or Custom and Express below. - * - * To update your own account, use the Dashboard. Refer to our - * Connect documentation to learn - * more about updating accounts. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); - } - /** - * Updates an existing Account Capability. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Capability - */ - public function updateCapability($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/capabilities/%s', $parentId, $id), $params, $opts); - } - /** - * Updates the metadata, account holder name, account holder type of a bank account - * belonging to a Custom account, and - * optionally sets it as the default for its currency. Other bank account details - * are not editable by design. - * - * You can re-enable a disabled bank account by performing an update call without - * providing any arguments or changes. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BankAccount|\Stripe\Card - */ - public function updateExternalAccount($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); - } - /** - * Updates an existing person. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Person - */ - public function updatePerson($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves the details of an account. - * - * @param null|string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account - */ - public function retrieve($id = null, $params = null, $opts = null) - { - if (null === $id) { - return $this->request('get', '/v1/account', $params, $opts); - } - return $this->request('get', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ApplePayDomainService.php b/dependencies/stripe/stripe-php/lib/Service/ApplePayDomainService.php deleted file mode 100644 index e2e6ebe..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ApplePayDomainService.php +++ /dev/null @@ -1,66 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/apple_pay/domains', $params, $opts); - } - /** - * Create an apple pay domain. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplePayDomain - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/apple_pay/domains', $params, $opts); - } - /** - * Delete an apple pay domain. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplePayDomain - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/apple_pay/domains/%s', $id), $params, $opts); - } - /** - * Retrieve an apple pay domain. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplePayDomain - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/apple_pay/domains/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ApplicationFeeService.php b/dependencies/stripe/stripe-php/lib/Service/ApplicationFeeService.php deleted file mode 100644 index 097f3b0..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ApplicationFeeService.php +++ /dev/null @@ -1,119 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/application_fees', $params, $opts); - } - /** - * You can see a list of the refunds belonging to a specific application fee. Note - * that the 10 most recent refunds are always available by default on the - * application fee object. If you need more than those 10, you can use this API - * method and the limit and starting_after parameters to - * page through additional refunds. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\ApplicationFeeRefund> - */ - public function allRefunds($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/application_fees/%s/refunds', $parentId), $params, $opts); - } - /** - * Refunds an application fee that has previously been collected but not yet - * refunded. Funds will be refunded to the Stripe account from which the fee was - * originally collected. - * - * You can optionally refund only part of an application fee. You can do so - * multiple times, until the entire fee has been refunded. - * - * Once entirely refunded, an application fee can’t be refunded again. This method - * will raise an error when called on an already-refunded application fee, or when - * trying to refund more money than is left on an application fee. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFeeRefund - */ - public function createRefund($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/application_fees/%s/refunds', $parentId), $params, $opts); - } - /** - * Retrieves the details of an application fee that your account has collected. The - * same information is returned when refunding the application fee. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFee - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/application_fees/%s', $id), $params, $opts); - } - /** - * By default, you can see the 10 most recent refunds stored directly on the - * application fee object, but you can also retrieve details about a specific - * refund stored on the application fee. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFeeRefund - */ - public function retrieveRefund($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/application_fees/%s/refunds/%s', $parentId, $id), $params, $opts); - } - /** - * Updates the specified application fee refund by setting the values of the - * parameters passed. Any parameters not provided will be left unchanged. - * - * This request only accepts metadata as an argument. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ApplicationFeeRefund - */ - public function updateRefund($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/application_fees/%s/refunds/%s', $parentId, $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php deleted file mode 100644 index 8b6b683..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Apps/AppsServiceFactory.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - private static $classMap = ['secrets' => SecretService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Apps/SecretService.php b/dependencies/stripe/stripe-php/lib/Service/Apps/SecretService.php deleted file mode 100644 index 510f64d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Apps/SecretService.php +++ /dev/null @@ -1,64 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/apps/secrets', $params, $opts); - } - /** - * Create or replace a secret in the secret store. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Apps\Secret - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/apps/secrets', $params, $opts); - } - /** - * Deletes a secret from the secret store by name and scope. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Apps\Secret - */ - public function deleteWhere($params = null, $opts = null) - { - return $this->request('post', '/v1/apps/secrets/delete', $params, $opts); - } - /** - * Finds a secret in the secret store by name and scope. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Apps\Secret - */ - public function find($params = null, $opts = null) - { - return $this->request('get', '/v1/apps/secrets/find', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/BalanceService.php b/dependencies/stripe/stripe-php/lib/Service/BalanceService.php deleted file mode 100644 index 900951d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/BalanceService.php +++ /dev/null @@ -1,25 +0,0 @@ -Accounting - * for negative balances. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Balance - */ - public function retrieve($params = null, $opts = null) - { - return $this->request('get', '/v1/balance', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/BalanceTransactionService.php b/dependencies/stripe/stripe-php/lib/Service/BalanceTransactionService.php deleted file mode 100644 index 78959b7..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/BalanceTransactionService.php +++ /dev/null @@ -1,45 +0,0 @@ -/v1/balance/history. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\BalanceTransaction> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/balance_transactions', $params, $opts); - } - /** - * Retrieves the balance transaction with the given ID. - * - * Note that this endpoint previously used the path - * /v1/balance/history/:id. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BalanceTransaction - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/balance_transactions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php deleted file mode 100644 index 1914e9a..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - private static $classMap = ['configurations' => ConfigurationService::class, 'sessions' => SessionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php b/dependencies/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php deleted file mode 100644 index 38820f4..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php +++ /dev/null @@ -1,69 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/billing_portal/configurations', $params, $opts); - } - /** - * Creates a configuration that describes the functionality and behavior of a - * PortalSession. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BillingPortal\Configuration - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/billing_portal/configurations', $params, $opts); - } - /** - * Retrieves a configuration that describes the functionality of the customer - * portal. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BillingPortal\Configuration - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/billing_portal/configurations/%s', $id), $params, $opts); - } - /** - * Updates a configuration that describes the functionality of the customer portal. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\BillingPortal\Configuration - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/billing_portal/configurations/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php b/dependencies/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php deleted file mode 100644 index d951488..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php +++ /dev/null @@ -1,22 +0,0 @@ -request('post', '/v1/billing_portal/sessions', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ChargeService.php b/dependencies/stripe/stripe-php/lib/Service/ChargeService.php deleted file mode 100644 index ee25c81..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ChargeService.php +++ /dev/null @@ -1,116 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/charges', $params, $opts); - } - /** - * Capture the payment of an existing, uncaptured charge that was created with the - * capture option set to false. - * - * Uncaptured payments expire a set number of days after they are created (7 by default), after which they are - * marked as refunded and capture attempts will fail. - * - * Don’t use this method to capture a PaymentIntent-initiated charge. Use Capture a PaymentIntent. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Charge - */ - public function capture($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/charges/%s/capture', $id), $params, $opts); - } - /** - * Use the Payment Intents API to initiate - * a new payment instead of using this method. Confirmation of the PaymentIntent - * creates the Charge object used to request payment, so this method - * is limited to legacy integrations. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Charge - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/charges', $params, $opts); - } - /** - * Retrieves the details of a charge that has previously been created. Supply the - * unique charge ID that was returned from your previous request, and Stripe will - * return the corresponding charge information. The same information is returned - * when creating or refunding the charge. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Charge - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/charges/%s', $id), $params, $opts); - } - /** - * Search for charges you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Charge> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/charges/search', $params, $opts); - } - /** - * Updates the specified charge by setting the values of the parameters passed. Any - * parameters not provided will be left unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Charge - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/charges/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php deleted file mode 100644 index 8d52202..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - private static $classMap = ['sessions' => SessionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Checkout/SessionService.php b/dependencies/stripe/stripe-php/lib/Service/Checkout/SessionService.php deleted file mode 100644 index e04eb02..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Checkout/SessionService.php +++ /dev/null @@ -1,87 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/checkout/sessions', $params, $opts); - } - /** - * When retrieving a Checkout Session, there is an includable - * line_items property containing the first handful of those - * items. There is also a URL where you can retrieve the full (paginated) list of - * line items. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> - */ - public function allLineItems($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/checkout/sessions/%s/line_items', $id), $params, $opts); - } - /** - * Creates a Session object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Checkout\Session - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/checkout/sessions', $params, $opts); - } - /** - * A Session can be expired when it is in one of these statuses: open. - * - * After it expires, a customer can’t complete a Session and customers loading the - * Session see a message saying the Session is expired. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Checkout\Session - */ - public function expire($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/checkout/sessions/%s/expire', $id), $params, $opts); - } - /** - * Retrieves a Session object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Checkout\Session - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/checkout/sessions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/CoreServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/CoreServiceFactory.php deleted file mode 100644 index f5873b6..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/CoreServiceFactory.php +++ /dev/null @@ -1,78 +0,0 @@ - - */ - private static $classMap = ['accountLinks' => AccountLinkService::class, 'accounts' => AccountService::class, 'applePayDomains' => ApplePayDomainService::class, 'applicationFees' => ApplicationFeeService::class, 'apps' => Apps\AppsServiceFactory::class, 'balance' => BalanceService::class, 'balanceTransactions' => BalanceTransactionService::class, 'billingPortal' => BillingPortal\BillingPortalServiceFactory::class, 'charges' => ChargeService::class, 'checkout' => Checkout\CheckoutServiceFactory::class, 'countrySpecs' => CountrySpecService::class, 'coupons' => CouponService::class, 'creditNotes' => CreditNoteService::class, 'customers' => CustomerService::class, 'disputes' => DisputeService::class, 'ephemeralKeys' => EphemeralKeyService::class, 'events' => EventService::class, 'exchangeRates' => ExchangeRateService::class, 'fileLinks' => FileLinkService::class, 'files' => FileService::class, 'financialConnections' => FinancialConnections\FinancialConnectionsServiceFactory::class, 'identity' => Identity\IdentityServiceFactory::class, 'invoiceItems' => InvoiceItemService::class, 'invoices' => InvoiceService::class, 'issuing' => Issuing\IssuingServiceFactory::class, 'mandates' => MandateService::class, 'oauth' => OAuthService::class, 'paymentIntents' => PaymentIntentService::class, 'paymentLinks' => PaymentLinkService::class, 'paymentMethods' => PaymentMethodService::class, 'payouts' => PayoutService::class, 'plans' => PlanService::class, 'prices' => PriceService::class, 'products' => ProductService::class, 'promotionCodes' => PromotionCodeService::class, 'quotes' => QuoteService::class, 'radar' => Radar\RadarServiceFactory::class, 'refunds' => RefundService::class, 'reporting' => Reporting\ReportingServiceFactory::class, 'reviews' => ReviewService::class, 'setupAttempts' => SetupAttemptService::class, 'setupIntents' => SetupIntentService::class, 'shippingRates' => ShippingRateService::class, 'sigma' => Sigma\SigmaServiceFactory::class, 'sources' => SourceService::class, 'subscriptionItems' => SubscriptionItemService::class, 'subscriptions' => SubscriptionService::class, 'subscriptionSchedules' => SubscriptionScheduleService::class, 'tax' => Tax\TaxServiceFactory::class, 'taxCodes' => TaxCodeService::class, 'taxRates' => TaxRateService::class, 'terminal' => Terminal\TerminalServiceFactory::class, 'testHelpers' => TestHelpers\TestHelpersServiceFactory::class, 'tokens' => TokenService::class, 'topups' => TopupService::class, 'transfers' => TransferService::class, 'treasury' => Treasury\TreasuryServiceFactory::class, 'webhookEndpoints' => WebhookEndpointService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/CountrySpecService.php b/dependencies/stripe/stripe-php/lib/Service/CountrySpecService.php deleted file mode 100644 index 3e4ee39..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/CountrySpecService.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/country_specs', $params, $opts); - } - /** - * Returns a Country Spec for a given Country code. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CountrySpec - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/country_specs/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/CouponService.php b/dependencies/stripe/stripe-php/lib/Service/CouponService.php deleted file mode 100644 index 024b611..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/CouponService.php +++ /dev/null @@ -1,99 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/coupons', $params, $opts); - } - /** - * You can create coupons easily via the coupon management page of the - * Stripe dashboard. Coupon creation is also accessible via the API if you need to - * create coupons on the fly. - * - * A coupon has either a percent_off or an amount_off and - * currency. If you set an amount_off, that amount will - * be subtracted from any invoice’s subtotal. For example, an invoice with a - * subtotal of 100 will have a final total of - * 0 if a coupon with an amount_off of - * 200 is applied to it and an invoice with a subtotal of - * 300 will have a final total of 100 if - * a coupon with an amount_off of 200 is applied to - * it. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Coupon - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/coupons', $params, $opts); - } - /** - * You can delete coupons via the coupon management page of the - * Stripe dashboard. However, deleting a coupon does not affect any customers who - * have already applied the coupon; it means that new customers can’t redeem the - * coupon. You can also delete coupons via the API. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Coupon - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); - } - /** - * Retrieves the coupon with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Coupon - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); - } - /** - * Updates the metadata of a coupon. Other coupon details (currency, duration, - * amount_off) are, by design, not editable. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Coupon - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/CreditNoteService.php b/dependencies/stripe/stripe-php/lib/Service/CreditNoteService.php deleted file mode 100644 index f1e3c4d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/CreditNoteService.php +++ /dev/null @@ -1,148 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/credit_notes', $params, $opts); - } - /** - * When retrieving a credit note, you’ll get a lines property - * containing the the first handful of those items. There is also a URL where you - * can retrieve the full (paginated) list of line items. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> - */ - public function allLines($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/credit_notes/%s/lines', $parentId), $params, $opts); - } - /** - * Issue a credit note to adjust the amount of a finalized invoice. For a - * status=open invoice, a credit note reduces its - * amount_due. For a status=paid invoice, a credit note - * does not affect its amount_due. Instead, it can result in any - * combination of the following:. - * - *
      • Refund: create a new refund (using refund_amount) or link - * an existing refund (using refund).
      • Customer balance - * credit: credit the customer’s balance (using credit_amount) which - * will be automatically applied to their next invoice when it’s finalized.
      • - *
      • Outside of Stripe credit: record the amount that is or will be credited - * outside of Stripe (using out_of_band_amount).
      - * - * For post-payment credit notes the sum of the refund, credit and outside of - * Stripe amounts must equal the credit note total. - * - * You may issue multiple credit notes for an invoice. Each credit note will - * increment the invoice’s pre_payment_credit_notes_amount or - * post_payment_credit_notes_amount depending on its - * status at the time of credit note creation. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/credit_notes', $params, $opts); - } - /** - * Get a preview of a credit note without creating it. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote - */ - public function preview($params = null, $opts = null) - { - return $this->request('get', '/v1/credit_notes/preview', $params, $opts); - } - /** - * When retrieving a credit note preview, you’ll get a lines - * property containing the first handful of those items. This URL you can retrieve - * the full (paginated) list of line items. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> - */ - public function previewLines($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/credit_notes/preview/lines', $params, $opts); - } - /** - * Retrieves the credit note object with the given identifier. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/credit_notes/%s', $id), $params, $opts); - } - /** - * Updates an existing credit note. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/credit_notes/%s', $id), $params, $opts); - } - /** - * Marks a credit note as void. Learn more about voiding credit notes. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CreditNote - */ - public function voidCreditNote($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/credit_notes/%s/void', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/CustomerService.php b/dependencies/stripe/stripe-php/lib/Service/CustomerService.php deleted file mode 100644 index ea0977c..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/CustomerService.php +++ /dev/null @@ -1,470 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/customers', $params, $opts); - } - /** - * Returns a list of transactions that updated the customer’s balances. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CustomerBalanceTransaction> - */ - public function allBalanceTransactions($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/balance_transactions', $parentId), $params, $opts); - } - /** - * Returns a list of transactions that modified the customer’s cash balance. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\CustomerCashBalanceTransaction> - */ - public function allCashBalanceTransactions($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/cash_balance_transactions', $parentId), $params, $opts); - } - /** - * Returns a list of PaymentMethods for a given Customer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\PaymentMethod> - */ - public function allPaymentMethods($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/payment_methods', $id), $params, $opts); - } - /** - * List sources for a specified customer. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source> - */ - public function allSources($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/sources', $parentId), $params, $opts); - } - /** - * Returns a list of tax IDs for a customer. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\TaxId> - */ - public function allTaxIds($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/tax_ids', $parentId), $params, $opts); - } - /** - * Creates a new customer object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Customer - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/customers', $params, $opts); - } - /** - * Creates an immutable transaction that updates the customer’s credit balance. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerBalanceTransaction - */ - public function createBalanceTransaction($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/balance_transactions', $parentId), $params, $opts); - } - /** - * Retrieve funding instructions for a customer cash balance. If funding - * instructions do not yet exist for the customer, new funding instructions will be - * created. If funding instructions have already been created for a given customer, - * the same funding instructions will be retrieved. In other words, we will return - * the same funding instructions each time. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FundingInstructions - */ - public function createFundingInstructions($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/funding_instructions', $id), $params, $opts); - } - /** - * When you create a new credit card, you must specify a customer or recipient on - * which to create it. - * - * If the card’s owner has no default card, then the new card will become the - * default. However, if the owner already has a default, then it will not change. - * To change the default, you should update the - * customer to have a new default_source. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public function createSource($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/sources', $parentId), $params, $opts); - } - /** - * Creates a new TaxID object for a customer. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxId - */ - public function createTaxId($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/tax_ids', $parentId), $params, $opts); - } - /** - * Permanently deletes a customer. It cannot be undone. Also immediately cancels - * any active subscriptions on the customer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Customer - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/customers/%s', $id), $params, $opts); - } - /** - * Removes the currently applied discount on a customer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Discount - */ - public function deleteDiscount($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/customers/%s/discount', $id), $params, $opts); - } - /** - * Delete a specified source for a given customer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public function deleteSource($parentId, $id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); - } - /** - * Deletes an existing TaxID object. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxId - */ - public function deleteTaxId($parentId, $id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/customers/%s/tax_ids/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves a Customer object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Customer - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s', $id), $params, $opts); - } - /** - * Retrieves a specific customer balance transaction that updated the customer’s balances. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerBalanceTransaction - */ - public function retrieveBalanceTransaction($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s/balance_transactions/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves a customer’s cash balance. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CashBalance - */ - public function retrieveCashBalance($parentId, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s/cash_balance', $parentId), $params, $opts); - } - /** - * Retrieves a specific cash balance transaction, which updated the customer’s cash balance. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerCashBalanceTransaction - */ - public function retrieveCashBalanceTransaction($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s/cash_balance_transactions/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves a PaymentMethod object for a given Customer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod - */ - public function retrievePaymentMethod($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s/payment_methods/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieve a specified source for a given customer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public function retrieveSource($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves the TaxID object with the given identifier. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxId - */ - public function retrieveTaxId($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/customers/%s/tax_ids/%s', $parentId, $id), $params, $opts); - } - /** - * Search for customers you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Customer> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/customers/search', $params, $opts); - } - /** - * Updates the specified customer by setting the values of the parameters passed. - * Any parameters not provided will be left unchanged. For example, if you pass the - * source parameter, that becomes the customer’s active source - * (e.g., a card) to be used for all charges in the future. When you update a - * customer to a new valid card source by passing the source - * parameter: for each of the customer’s current subscriptions, if the subscription - * bills automatically and is in the past_due state, then the latest - * open invoice for the subscription with automatic collection enabled will be - * retried. This retry will not count as an automatic retry, and will not affect - * the next regularly scheduled payment for the invoice. Changing the - * default_source for a customer will not trigger this behavior. - * - * This request accepts mostly the same arguments as the customer creation call. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Customer - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s', $id), $params, $opts); - } - /** - * Most credit balance transaction fields are immutable, but you may update its - * description and metadata. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CustomerBalanceTransaction - */ - public function updateBalanceTransaction($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/balance_transactions/%s', $parentId, $id), $params, $opts); - } - /** - * Changes the settings on a customer’s cash balance. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\CashBalance - */ - public function updateCashBalance($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/cash_balance', $parentId), $params, $opts); - } - /** - * Update a specified source for a given customer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public function updateSource($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); - } - /** - * Verify a specified bank account for a given customer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public function verifySource($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/customers/%s/sources/%s/verify', $parentId, $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/DisputeService.php b/dependencies/stripe/stripe-php/lib/Service/DisputeService.php deleted file mode 100644 index 609767f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/DisputeService.php +++ /dev/null @@ -1,79 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/disputes', $params, $opts); - } - /** - * Closing the dispute for a charge indicates that you do not have any evidence to - * submit and are essentially dismissing the dispute, acknowledging it as lost. - * - * The status of the dispute will change from needs_response to - * lost. Closing a dispute is irreversible. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Dispute - */ - public function close($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/disputes/%s/close', $id), $params, $opts); - } - /** - * Retrieves the dispute with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Dispute - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/disputes/%s', $id), $params, $opts); - } - /** - * When you get a dispute, contacting your customer is always the best first step. - * If that doesn’t work, you can submit evidence to help us resolve the dispute in - * your favor. You can do this in your dashboard, but if you prefer, - * you can use the API to submit evidence programmatically. - * - * Depending on your dispute type, different evidence fields will give you a better - * chance of winning your dispute. To figure out which evidence fields to provide, - * see our guide to dispute types. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Dispute - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/disputes/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/EphemeralKeyService.php b/dependencies/stripe/stripe-php/lib/Service/EphemeralKeyService.php deleted file mode 100644 index c34f0c0..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/EphemeralKeyService.php +++ /dev/null @@ -1,40 +0,0 @@ -request('delete', $this->buildPath('/v1/ephemeral_keys/%s', $id), $params, $opts); - } - /** - * Creates a short-lived API key for a given resource. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\EphemeralKey - */ - public function create($params = null, $opts = null) - { - if (!$opts || !isset($opts['stripe_version'])) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('stripe_version must be specified to create an ephemeral key'); - } - return $this->request('post', '/v1/ephemeral_keys', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/EventService.php b/dependencies/stripe/stripe-php/lib/Service/EventService.php deleted file mode 100644 index 3bf5605..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/EventService.php +++ /dev/null @@ -1,42 +0,0 @@ -event object api_version - * attribute (not according to your current Stripe API version or - * Stripe-Version header). - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Event> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/events', $params, $opts); - } - /** - * Retrieves the details of an event. Supply the unique identifier of the event, - * which you might have received in a webhook. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Event - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/events/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ExchangeRateService.php b/dependencies/stripe/stripe-php/lib/Service/ExchangeRateService.php deleted file mode 100644 index 489aff0..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ExchangeRateService.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/exchange_rates', $params, $opts); - } - /** - * Retrieves the exchange rates from the given currency to every supported - * currency. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ExchangeRate - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/exchange_rates/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/FileLinkService.php b/dependencies/stripe/stripe-php/lib/Service/FileLinkService.php deleted file mode 100644 index 9b492a3..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/FileLinkService.php +++ /dev/null @@ -1,66 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/file_links', $params, $opts); - } - /** - * Creates a new file link object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FileLink - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/file_links', $params, $opts); - } - /** - * Retrieves the file link with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FileLink - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/file_links/%s', $id), $params, $opts); - } - /** - * Updates an existing file link object. Expired links can no longer be updated. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FileLink - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/file_links/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/FileService.php b/dependencies/stripe/stripe-php/lib/Service/FileService.php deleted file mode 100644 index 058c76e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/FileService.php +++ /dev/null @@ -1,61 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/files', $params, $opts); - } - /** - * Retrieves the details of an existing file object. Supply the unique file ID from - * a file, and Stripe will return the corresponding file object. To access file - * contents, see the File Upload - * Guide. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\File - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/files/%s', $id), $params, $opts); - } - /** - * Create a file. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @return \Stripe\File - */ - public function create($params = null, $opts = null) - { - $opts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($opts); - if (!isset($opts->apiBase)) { - $opts->apiBase = $this->getClient()->getFilesBase(); - } - // Manually flatten params, otherwise curl's multipart encoder will - // choke on nested null|arrays. - $flatParams = \array_column(\WP_Ultimo\Dependencies\Stripe\Util\Util::flattenParams($params), 1, 0); - return $this->request('post', '/v1/files', $flatParams, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php b/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php deleted file mode 100644 index 708ce52..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php +++ /dev/null @@ -1,84 +0,0 @@ -Account objects. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\FinancialConnections\Account> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/financial_connections/accounts', $params, $opts); - } - /** - * Lists all owners for a given Account. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\FinancialConnections\AccountOwner> - */ - public function allOwners($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/financial_connections/accounts/%s/owners', $id), $params, $opts); - } - /** - * Disables your access to a Financial Connections Account. You will - * no longer be able to access data associated with the account (e.g. balances, - * transactions). - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Account - */ - public function disconnect($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/financial_connections/accounts/%s/disconnect', $id), $params, $opts); - } - /** - * Refreshes the data associated with a Financial Connections Account. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Account - */ - public function refresh($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/financial_connections/accounts/%s/refresh', $id), $params, $opts); - } - /** - * Retrieves the details of an Financial Connections Account. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Account - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/financial_connections/accounts/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php deleted file mode 100644 index d1f121d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - private static $classMap = ['accounts' => AccountService::class, 'sessions' => SessionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php b/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php deleted file mode 100644 index 05680c7..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php +++ /dev/null @@ -1,39 +0,0 @@ -Session. The session’s client_secret can be used to - * launch the flow using Stripe.js. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Session - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/financial_connections/sessions', $params, $opts); - } - /** - * Retrieves the details of a Financial Connections Session. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\FinancialConnections\Session - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/financial_connections/sessions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php deleted file mode 100644 index a2cb446..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - private static $classMap = ['verificationReports' => VerificationReportService::class, 'verificationSessions' => VerificationSessionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php b/dependencies/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php deleted file mode 100644 index 916e84a..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/identity/verification_reports', $params, $opts); - } - /** - * Retrieves an existing VerificationReport. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationReport - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/identity/verification_reports/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php b/dependencies/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php deleted file mode 100644 index 0f17c48..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php +++ /dev/null @@ -1,140 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/identity/verification_sessions', $params, $opts); - } - /** - * A VerificationSession object can be canceled when it is in - * requires_input status. - * - * Once canceled, future submission attempts are disabled. This cannot be undone. - * Learn more. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/identity/verification_sessions/%s/cancel', $id), $params, $opts); - } - /** - * Creates a VerificationSession object. - * - * After the VerificationSession is created, display a verification modal using the - * session client_secret or send your users to the session’s - * url. - * - * If your API key is in test mode, verification checks won’t actually process, - * though everything else will occur as if in live mode. - * - * Related guide: Verify your - * users’ identity documents - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/identity/verification_sessions', $params, $opts); - } - /** - * Redact a VerificationSession to remove all collected information from Stripe. - * This will redact the VerificationSession and all objects related to it, - * including VerificationReports, Events, request logs, etc. - * - * A VerificationSession object can be redacted when it is in - * requires_input or verified status. Redacting a - * VerificationSession in requires_action state will automatically - * cancel it. - * - * The redaction process may take up to four days. When the redaction process is in - * progress, the VerificationSession’s redaction.status field will be - * set to processing; when the process is finished, it will change to - * redacted and an identity.verification_session.redacted - * event will be emitted. - * - * Redaction is irreversible. Redacted objects are still accessible in the Stripe - * API, but all the fields that contain personal data will be replaced by the - * string [redacted] or a similar placeholder. The - * metadata field will also be erased. Redacted objects cannot be - * updated or used for any purpose. - * - * Learn more. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession - */ - public function redact($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/identity/verification_sessions/%s/redact', $id), $params, $opts); - } - /** - * Retrieves the details of a VerificationSession that was previously created. - * - * When the session status is requires_input, you can use this method - * to retrieve a valid client_secret or url to allow - * re-submission. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/identity/verification_sessions/%s', $id), $params, $opts); - } - /** - * Updates a VerificationSession object. - * - * When the session status is requires_input, you can use this method - * to update the verification check and options. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Identity\VerificationSession - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/identity/verification_sessions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/InvoiceItemService.php b/dependencies/stripe/stripe-php/lib/Service/InvoiceItemService.php deleted file mode 100644 index 69e7536..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/InvoiceItemService.php +++ /dev/null @@ -1,88 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/invoiceitems', $params, $opts); - } - /** - * Creates an item to be added to a draft invoice (up to 250 items per invoice). If - * no invoice is specified, the item will be on the next invoice created for the - * customer specified. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\InvoiceItem - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/invoiceitems', $params, $opts); - } - /** - * Deletes an invoice item, removing it from an invoice. Deleting invoice items is - * only possible when they’re not attached to invoices, or if it’s attached to a - * draft invoice. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\InvoiceItem - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); - } - /** - * Retrieves the invoice item with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\InvoiceItem - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); - } - /** - * Updates the amount or description of an invoice item on an upcoming invoice. - * Updating an invoice item is only possible before the invoice it’s attached to is - * closed. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\InvoiceItem - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/InvoiceService.php b/dependencies/stripe/stripe-php/lib/Service/InvoiceService.php deleted file mode 100644 index f455766..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/InvoiceService.php +++ /dev/null @@ -1,276 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/invoices', $params, $opts); - } - /** - * When retrieving an invoice, you’ll get a lines property - * containing the total count of line items and the first handful of those items. - * There is also a URL where you can retrieve the full (paginated) list of line - * items. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\InvoiceLineItem> - */ - public function allLines($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/invoices/%s/lines', $parentId), $params, $opts); - } - /** - * This endpoint creates a draft invoice for a given customer. The invoice remains - * a draft until you finalize the invoice, which - * allows you to pay or send - * the invoice to your customers. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/invoices', $params, $opts); - } - /** - * Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to - * delete invoices that are no longer in a draft state will fail; once an invoice - * has been finalized or if an invoice is for a subscription, it must be voided. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); - } - /** - * Stripe automatically finalizes drafts before sending and attempting payment on - * invoices. However, if you’d like to finalize a draft invoice manually, you can - * do so using this method. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function finalizeInvoice($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoices/%s/finalize', $id), $params, $opts); - } - /** - * Marking an invoice as uncollectible is useful for keeping track of bad debts - * that can be written off for accounting purposes. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function markUncollectible($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoices/%s/mark_uncollectible', $id), $params, $opts); - } - /** - * Stripe automatically creates and then attempts to collect payment on invoices - * for customers on subscriptions according to your subscriptions - * settings. However, if you’d like to attempt payment on an invoice out of the - * normal collection schedule or for some other reason, you can do so. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function pay($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoices/%s/pay', $id), $params, $opts); - } - /** - * Retrieves the invoice with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); - } - /** - * Search for invoices you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Invoice> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/invoices/search', $params, $opts); - } - /** - * Stripe will automatically send invoices to customers according to your subscriptions - * settings. However, if you’d like to manually send an invoice to your - * customer out of the normal schedule, you can do so. When sending invoices that - * have already been paid, there will be no reference to the payment in the email. - * - * Requests made in test-mode result in no emails being sent, despite sending an - * invoice.sent event. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function sendInvoice($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoices/%s/send', $id), $params, $opts); - } - /** - * At any time, you can preview the upcoming invoice for a customer. This will show - * you all the charges that are pending, including subscription renewal charges, - * invoice item charges, etc. It will also show you any discounts that are - * applicable to the invoice. - * - * Note that when you are viewing an upcoming invoice, you are simply viewing a - * preview – the invoice has not yet been created. As such, the upcoming invoice - * will not show up in invoice listing calls, and you cannot use the API to pay or - * edit the invoice. If you want to change the amount that your customer will be - * billed, you can add, remove, or update pending invoice items, or update the - * customer’s discount. - * - * You can preview the effects of updating a subscription, including a preview of - * what proration will take place. To ensure that the actual proration is - * calculated exactly the same as the previewed proration, you should pass a - * proration_date parameter when doing the actual subscription update. - * The value passed in should be the same as the - * subscription_proration_date returned on the upcoming invoice - * resource. The recommended way to get only the prorations being previewed is to - * consider only proration line items where period[start] is equal to - * the subscription_proration_date on the upcoming invoice resource. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function upcoming($params = null, $opts = null) - { - return $this->request('get', '/v1/invoices/upcoming', $params, $opts); - } - /** - * When retrieving an upcoming invoice, you’ll get a lines - * property containing the total count of line items and the first handful of those - * items. There is also a URL where you can retrieve the full (paginated) list of - * line items. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\InvoiceLineItem> - */ - public function upcomingLines($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/invoices/upcoming/lines', $params, $opts); - } - /** - * Draft invoices are fully editable. Once an invoice is finalized, monetary values, - * as well as collection_method, become uneditable. - * - * If you would like to stop the Stripe Billing engine from automatically - * finalizing, reattempting payments on, sending reminders for, or automatically reconciling - * invoices, pass auto_advance=false. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); - } - /** - * Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is - * similar to deletion, however it only applies to - * finalized invoices and maintains a papertrail where the invoice can still be - * found. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Invoice - */ - public function voidInvoice($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/invoices/%s/void', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php b/dependencies/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php deleted file mode 100644 index 5d341a5..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php +++ /dev/null @@ -1,96 +0,0 @@ -Authorization objects. The objects are - * sorted in descending order by creation date, with the most recently created - * object appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Issuing\Authorization> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/issuing/authorizations', $params, $opts); - } - /** - * Approves a pending Issuing Authorization object. This request - * should be made within the timeout window of the real-time - * authorization flow. You can also respond directly to the webhook request to - * approve an authorization (preferred). More details can be found here. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Authorization - */ - public function approve($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s/approve', $id), $params, $opts); - } - /** - * Declines a pending Issuing Authorization object. This request - * should be made within the timeout window of the real time - * authorization flow. You can also respond directly to the webhook request to - * decline an authorization (preferred). More details can be found here. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Authorization - */ - public function decline($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s/decline', $id), $params, $opts); - } - /** - * Retrieves an Issuing Authorization object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Authorization - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/issuing/authorizations/%s', $id), $params, $opts); - } - /** - * Updates the specified Issuing Authorization object by setting the - * values of the parameters passed. Any parameters not provided will be left - * unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Authorization - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Issuing/CardService.php b/dependencies/stripe/stripe-php/lib/Service/Issuing/CardService.php deleted file mode 100644 index ed805e5..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Issuing/CardService.php +++ /dev/null @@ -1,69 +0,0 @@ -Card objects. The objects are sorted in - * descending order by creation date, with the most recently created object - * appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Issuing\Card> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/issuing/cards', $params, $opts); - } - /** - * Creates an Issuing Card object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/issuing/cards', $params, $opts); - } - /** - * Retrieves an Issuing Card object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/issuing/cards/%s', $id), $params, $opts); - } - /** - * Updates the specified Issuing Card object by setting the values of - * the parameters passed. Any parameters not provided will be left unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/cards/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Issuing/CardholderService.php b/dependencies/stripe/stripe-php/lib/Service/Issuing/CardholderService.php deleted file mode 100644 index 2d7df38..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Issuing/CardholderService.php +++ /dev/null @@ -1,70 +0,0 @@ -Cardholder objects. The objects are - * sorted in descending order by creation date, with the most recently created - * object appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Issuing\Cardholder> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/issuing/cardholders', $params, $opts); - } - /** - * Creates a new Issuing Cardholder object that can be issued cards. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Cardholder - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/issuing/cardholders', $params, $opts); - } - /** - * Retrieves an Issuing Cardholder object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Cardholder - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/issuing/cardholders/%s', $id), $params, $opts); - } - /** - * Updates the specified Issuing Cardholder object by setting the - * values of the parameters passed. Any parameters not provided will be left - * unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Cardholder - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/cardholders/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Issuing/DisputeService.php b/dependencies/stripe/stripe-php/lib/Service/Issuing/DisputeService.php deleted file mode 100644 index 6573e65..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Issuing/DisputeService.php +++ /dev/null @@ -1,94 +0,0 @@ -Dispute objects. The objects are sorted - * in descending order by creation date, with the most recently created object - * appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Issuing\Dispute> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/issuing/disputes', $params, $opts); - } - /** - * Creates an Issuing Dispute object. Individual pieces of evidence - * within the evidence object are optional at this point. Stripe only - * validates that required evidence is present during submission. Refer to Dispute - * reasons and evidence for more details about evidence requirements. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Dispute - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/issuing/disputes', $params, $opts); - } - /** - * Retrieves an Issuing Dispute object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Dispute - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/issuing/disputes/%s', $id), $params, $opts); - } - /** - * Submits an Issuing Dispute to the card network. Stripe validates - * that all evidence fields required for the dispute’s reason are present. For more - * details, see Dispute - * reasons and evidence. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Dispute - */ - public function submit($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/disputes/%s/submit', $id), $params, $opts); - } - /** - * Updates the specified Issuing Dispute object by setting the values - * of the parameters passed. Any parameters not provided will be left unchanged. - * Properties on the evidence object can be unset by passing in an - * empty string. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Dispute - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/disputes/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php deleted file mode 100644 index 116ad0d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ - private static $classMap = ['authorizations' => AuthorizationService::class, 'cardholders' => CardholderService::class, 'cards' => CardService::class, 'disputes' => DisputeService::class, 'transactions' => TransactionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Issuing/TransactionService.php b/dependencies/stripe/stripe-php/lib/Service/Issuing/TransactionService.php deleted file mode 100644 index a7330d4..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Issuing/TransactionService.php +++ /dev/null @@ -1,56 +0,0 @@ -Transaction objects. The objects are - * sorted in descending order by creation date, with the most recently created - * object appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Issuing\Transaction> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/issuing/transactions', $params, $opts); - } - /** - * Retrieves an Issuing Transaction object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Transaction - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/issuing/transactions/%s', $id), $params, $opts); - } - /** - * Updates the specified Issuing Transaction object by setting the - * values of the parameters passed. Any parameters not provided will be left - * unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Transaction - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/issuing/transactions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/MandateService.php b/dependencies/stripe/stripe-php/lib/Service/MandateService.php deleted file mode 100644 index f96a84b..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/MandateService.php +++ /dev/null @@ -1,23 +0,0 @@ -request('get', $this->buildPath('/v1/mandates/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/OAuthService.php b/dependencies/stripe/stripe-php/lib/Service/OAuthService.php deleted file mode 100644 index 868ae7c..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/OAuthService.php +++ /dev/null @@ -1,124 +0,0 @@ -_parseOpts($opts); - $opts->apiBase = $this->_getBase($opts); - return $this->request($method, $path, $params, $opts); - } - /** - * Generates a URL to Stripe's OAuth form. - * - * @param null|array $params - * @param null|array $opts - * - * @return string the URL to Stripe's OAuth form - */ - public function authorizeUrl($params = null, $opts = null) - { - $params = $params ?: []; - $opts = $this->_parseOpts($opts); - $base = $this->_getBase($opts); - $params['client_id'] = $this->_getClientId($params); - if (!\array_key_exists('response_type', $params)) { - $params['response_type'] = 'code'; - } - $query = \WP_Ultimo\Dependencies\Stripe\Util\Util::encodeParameters($params); - return $base . '/oauth/authorize?' . $query; - } - /** - * Use an authoriztion code to connect an account to your platform and - * fetch the user's credentials. - * - * @param null|array $params - * @param null|array $opts - * - * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails - * - * @return \Stripe\StripeObject object containing the response from the API - */ - public function token($params = null, $opts = null) - { - $params = $params ?: []; - $params['client_secret'] = $this->_getClientSecret($params); - return $this->requestConnect('post', '/oauth/token', $params, $opts); - } - /** - * Disconnects an account from your platform. - * - * @param null|array $params - * @param null|array $opts - * - * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails - * - * @return \Stripe\StripeObject object containing the response from the API - */ - public function deauthorize($params = null, $opts = null) - { - $params = $params ?: []; - $params['client_id'] = $this->_getClientId($params); - return $this->requestConnect('post', '/oauth/deauthorize', $params, $opts); - } - private function _getClientId($params = null) - { - $clientId = $params && \array_key_exists('client_id', $params) ? $params['client_id'] : null; - if (null === $clientId) { - $clientId = $this->client->getClientId(); - } - if (null === $clientId) { - $msg = 'No client_id provided. (HINT: set your client_id using ' . '`new \\Stripe\\StripeClient([clientId => - ])`)". You can find your client_ids ' . 'in your Stripe dashboard at ' . 'https://dashboard.stripe.com/account/applications/settings, ' . 'after registering your account as a platform. See ' . 'https://stripe.com/docs/connect/standard-accounts for details, ' . 'or email support@stripe.com if you have any questions.'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\AuthenticationException($msg); - } - return $clientId; - } - private function _getClientSecret($params = null) - { - if (\array_key_exists('client_secret', $params)) { - return $params['client_secret']; - } - return $this->client->getApiKey(); - } - /** - * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request - * - * @throws \Stripe\Exception\InvalidArgumentException - * - * @return \Stripe\Util\RequestOptions - */ - private function _parseOpts($opts) - { - if (\is_array($opts)) { - if (\array_key_exists('connect_base', $opts)) { - // Throw an exception for the convenience of anybody migrating to - // \Stripe\Service\OAuthService from \Stripe\OAuth, where `connect_base` - // was the name of the parameter that behaves as `api_base` does here. - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException('Use `api_base`, not `connect_base`'); - } - } - return \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($opts); - } - /** - * @param \Stripe\Util\RequestOptions $opts - * - * @return string - */ - private function _getBase($opts) - { - return isset($opts->apiBase) ? $opts->apiBase : $this->client->getConnectBase(); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PaymentIntentService.php b/dependencies/stripe/stripe-php/lib/Service/PaymentIntentService.php deleted file mode 100644 index fab6a3b..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PaymentIntentService.php +++ /dev/null @@ -1,265 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/payment_intents', $params, $opts); - } - /** - * Manually reconcile the remaining amount for a customer_balance PaymentIntent. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function applyCustomerBalance($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s/apply_customer_balance', $id), $params, $opts); - } - /** - * A PaymentIntent object can be canceled when it is in one of these statuses: - * requires_payment_method, requires_capture, - * requires_confirmation, requires_action or, in rare cases, processing. - * - * Once canceled, no additional charges will be made by the PaymentIntent and any - * operations on the PaymentIntent will fail with an error. For PaymentIntents with - * a status of requires_capture, the remaining - * amount_capturable will automatically be refunded. - * - * You cannot cancel the PaymentIntent for a Checkout Session. Expire the Checkout Session - * instead. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s/cancel', $id), $params, $opts); - } - /** - * Capture the funds of an existing uncaptured PaymentIntent when its status is - * requires_capture. - * - * Uncaptured PaymentIntents will be canceled a set number of days after they are - * created (7 by default). - * - * Learn more about separate authorization - * and capture. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function capture($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s/capture', $id), $params, $opts); - } - /** - * Confirm that your customer intends to pay with current or provided payment - * method. Upon confirmation, the PaymentIntent will attempt to initiate a payment. - * If the selected payment method requires additional authentication steps, the - * PaymentIntent will transition to the requires_action status and - * suggest additional actions via next_action. If payment fails, the - * PaymentIntent transitions to the requires_payment_method status or - * the canceled status if the confirmation limit is reached. If - * payment succeeds, the PaymentIntent will transition to the - * succeeded status (or requires_capture, if - * capture_method is set to manual). If the - * confirmation_method is automatic, payment may be - * attempted using our client SDKs and - * the PaymentIntent’s client_secret. After - * next_actions are handled by the client, no additional confirmation - * is required to complete the payment. If the confirmation_method is - * manual, all payment attempts must be initiated using a secret key. - * If any actions are required for the payment, the PaymentIntent will return to - * the requires_confirmation state after those actions are completed. - * Your server needs to then explicitly re-confirm the PaymentIntent to initiate - * the next payment attempt. Read the expanded documentation to - * learn more about manual confirmation. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function confirm($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s/confirm', $id), $params, $opts); - } - /** - * Creates a PaymentIntent object. - * - * After the PaymentIntent is created, attach a payment method and confirm to continue the payment. - * You can read more about the different payment flows available via the Payment - * Intents API here. - * - * When confirm=true is used during creation, it is equivalent to - * creating and confirming the PaymentIntent in the same call. You may use any - * parameters available in the confirm - * API when confirm=true is supplied. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/payment_intents', $params, $opts); - } - /** - * Perform an incremental authorization on an eligible PaymentIntent. To be eligible, the - * PaymentIntent’s status must be requires_capture and incremental_authorization_supported - * must be true. - * - * Incremental authorizations attempt to increase the authorized amount on your - * customer’s card to the new, higher amount provided. As with the - * initial authorization, incremental authorizations may be declined. A single - * PaymentIntent can call this endpoint multiple times to further increase the - * authorized amount. - * - * If the incremental authorization succeeds, the PaymentIntent object is returned - * with the updated amount. - * If the incremental authorization fails, a card_declined error is returned, and - * no fields on the PaymentIntent or Charge are updated. The PaymentIntent object - * remains capturable for the previously authorized amount. - * - * Each PaymentIntent can have a maximum of 10 incremental authorization attempts, - * including declines. Once captured, a PaymentIntent can no longer be incremented. - * - * Learn more about incremental - * authorizations. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function incrementAuthorization($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s/increment_authorization', $id), $params, $opts); - } - /** - * Retrieves the details of a PaymentIntent that has previously been created. - * - * Client-side retrieval using a publishable key is allowed when the - * client_secret is provided in the query string. - * - * When retrieved with a publishable key, only a subset of properties will be - * returned. Please refer to the payment - * intent object reference for more details. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/payment_intents/%s', $id), $params, $opts); - } - /** - * Search for PaymentIntents you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\PaymentIntent> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/payment_intents/search', $params, $opts); - } - /** - * Updates properties on a PaymentIntent object without confirming. - * - * Depending on which properties you update, you may need to confirm the - * PaymentIntent again. For example, updating the payment_method will - * always require you to confirm the PaymentIntent again. If you prefer to update - * and confirm at the same time, we recommend updating properties via the confirm API instead. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s', $id), $params, $opts); - } - /** - * Verifies microdeposits on a PaymentIntent object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentIntent - */ - public function verifyMicrodeposits($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_intents/%s/verify_microdeposits', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PaymentLinkService.php b/dependencies/stripe/stripe-php/lib/Service/PaymentLinkService.php deleted file mode 100644 index 834a9b5..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PaymentLinkService.php +++ /dev/null @@ -1,84 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/payment_links', $params, $opts); - } - /** - * When retrieving a payment link, there is an includable - * line_items property containing the first handful of those - * items. There is also a URL where you can retrieve the full (paginated) list of - * line items. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> - */ - public function allLineItems($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/payment_links/%s/line_items', $id), $params, $opts); - } - /** - * Creates a payment link. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentLink - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/payment_links', $params, $opts); - } - /** - * Retrieve a payment link. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentLink - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/payment_links/%s', $id), $params, $opts); - } - /** - * Updates a payment link. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentLink - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_links/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PaymentMethodService.php b/dependencies/stripe/stripe-php/lib/Service/PaymentMethodService.php deleted file mode 100644 index 0947822..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PaymentMethodService.php +++ /dev/null @@ -1,129 +0,0 @@ -List a Customer’s - * PaymentMethods API instead. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\PaymentMethod> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/payment_methods', $params, $opts); - } - /** - * Attaches a PaymentMethod object to a Customer. - * - * To attach a new PaymentMethod to a customer for future payments, we recommend - * you use a SetupIntent or a PaymentIntent - * with setup_future_usage. - * These approaches will perform any necessary steps to set up the PaymentMethod - * for future payments. Using the /v1/payment_methods/:id/attach - * endpoint without first using a SetupIntent or PaymentIntent with - * setup_future_usage does not optimize the PaymentMethod for future - * use, which makes later declines and payment friction more likely. See Optimizing cards for future - * payments for more information about setting up future payments. - * - * To use this PaymentMethod as the default for invoice or subscription payments, - * set invoice_settings.default_payment_method, - * on the Customer to the PaymentMethod’s ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod - */ - public function attach($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_methods/%s/attach', $id), $params, $opts); - } - /** - * Creates a PaymentMethod object. Read the Stripe.js - * reference to learn how to create PaymentMethods via Stripe.js. - * - * Instead of creating a PaymentMethod directly, we recommend using the PaymentIntents API to accept a - * payment immediately or the SetupIntent API to collect payment - * method details ahead of a future payment. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/payment_methods', $params, $opts); - } - /** - * Detaches a PaymentMethod object from a Customer. After a PaymentMethod is - * detached, it can no longer be used for a payment or re-attached to a Customer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod - */ - public function detach($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_methods/%s/detach', $id), $params, $opts); - } - /** - * Retrieves a PaymentMethod object attached to the StripeAccount. To retrieve a - * payment method attached to a Customer, you should use Retrieve a Customer’s - * PaymentMethods. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/payment_methods/%s', $id), $params, $opts); - } - /** - * Updates a PaymentMethod object. A PaymentMethod must be attached a customer to - * be updated. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PaymentMethod - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payment_methods/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PayoutService.php b/dependencies/stripe/stripe-php/lib/Service/PayoutService.php deleted file mode 100644 index 42ca759..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PayoutService.php +++ /dev/null @@ -1,121 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/payouts', $params, $opts); - } - /** - * A previously created payout can be canceled if it has not yet been paid out. - * Funds will be refunded to your available balance. You may not cancel automatic - * Stripe payouts. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payouts/%s/cancel', $id), $params, $opts); - } - /** - * To send funds to your own bank account, you create a new payout object. Your Stripe balance must be able to cover the payout amount, or - * you’ll receive an “Insufficient Funds” error. - * - * If your API key is in test mode, money won’t actually be sent, though everything - * else will occur as if in live mode. - * - * If you are creating a manual payout on a Stripe account that uses multiple - * payment source types, you’ll need to specify the source type balance that the - * payout should draw from. The balance object - * details available and pending amounts by source type. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/payouts', $params, $opts); - } - /** - * Retrieves the details of an existing payout. Supply the unique payout ID from - * either a payout creation request or the payout list, and Stripe will return the - * corresponding payout information. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/payouts/%s', $id), $params, $opts); - } - /** - * Reverses a payout by debiting the destination bank account. Only payouts for - * connected accounts to US bank accounts may be reversed at this time. If the - * payout is in the pending status, - * /v1/payouts/:id/cancel should be used instead. - * - * By requesting a reversal via /v1/payouts/:id/reverse, you confirm - * that the authorized signatory of the selected bank account has authorized the - * debit on the bank account and that no other authorization is required. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout - */ - public function reverse($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payouts/%s/reverse', $id), $params, $opts); - } - /** - * Updates the specified payout by setting the values of the parameters passed. Any - * parameters not provided will be left unchanged. This request accepts only the - * metadata as arguments. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Payout - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/payouts/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PlanService.php b/dependencies/stripe/stripe-php/lib/Service/PlanService.php deleted file mode 100644 index dd1bb4c..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PlanService.php +++ /dev/null @@ -1,86 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/plans', $params, $opts); - } - /** - * You can now model subscriptions more flexibly using the Prices - * API. It replaces the Plans API and is backwards compatible to simplify your - * migration. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Plan - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/plans', $params, $opts); - } - /** - * Deleting plans means new subscribers can’t be added. Existing subscribers aren’t - * affected. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Plan - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/plans/%s', $id), $params, $opts); - } - /** - * Retrieves the plan with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Plan - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/plans/%s', $id), $params, $opts); - } - /** - * Updates the specified plan by setting the values of the parameters passed. Any - * parameters not provided are left unchanged. By design, you cannot change a - * plan’s ID, amount, currency, or billing cycle. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Plan - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/plans/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PriceService.php b/dependencies/stripe/stripe-php/lib/Service/PriceService.php deleted file mode 100644 index 946724f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PriceService.php +++ /dev/null @@ -1,87 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/prices', $params, $opts); - } - /** - * Creates a new price for an existing product. The price can be recurring or - * one-time. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Price - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/prices', $params, $opts); - } - /** - * Retrieves the price with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Price - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/prices/%s', $id), $params, $opts); - } - /** - * Search for prices you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Price> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/prices/search', $params, $opts); - } - /** - * Updates the specified price by setting the values of the parameters passed. Any - * parameters not provided are left unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Price - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/prices/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ProductService.php b/dependencies/stripe/stripe-php/lib/Service/ProductService.php deleted file mode 100644 index a352123..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ProductService.php +++ /dev/null @@ -1,106 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/products', $params, $opts); - } - /** - * Creates a new product object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Product - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/products', $params, $opts); - } - /** - * Delete a product. Deleting a product is only possible if it has no prices - * associated with it. Additionally, deleting a product with type=good - * is only possible if it has no SKUs associated with it. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Product - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/products/%s', $id), $params, $opts); - } - /** - * Retrieves the details of an existing product. Supply the unique product ID from - * either a product creation request or the product list, and Stripe will return - * the corresponding product information. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Product - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/products/%s', $id), $params, $opts); - } - /** - * Search for products you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Product> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/products/search', $params, $opts); - } - /** - * Updates the specific product by setting the values of the parameters passed. Any - * parameters not provided will be left unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Product - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/products/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/PromotionCodeService.php b/dependencies/stripe/stripe-php/lib/Service/PromotionCodeService.php deleted file mode 100644 index 604bdf6..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/PromotionCodeService.php +++ /dev/null @@ -1,71 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/promotion_codes', $params, $opts); - } - /** - * A promotion code points to a coupon. You can optionally restrict the code to a - * specific customer, redemption limit, and expiration date. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PromotionCode - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/promotion_codes', $params, $opts); - } - /** - * Retrieves the promotion code with the given ID. In order to retrieve a promotion - * code by the customer-facing code use list with the desired - * code. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PromotionCode - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/promotion_codes/%s', $id), $params, $opts); - } - /** - * Updates the specified promotion code by setting the values of the parameters - * passed. Most fields are, by design, not editable. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\PromotionCode - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/promotion_codes/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/QuoteService.php b/dependencies/stripe/stripe-php/lib/Service/QuoteService.php deleted file mode 100644 index afbc80e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/QuoteService.php +++ /dev/null @@ -1,169 +0,0 @@ -request('post', $this->buildPath('/v1/quotes/%s/accept', $id), $params, $opts); - } - /** - * Returns a list of your quotes. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Quote> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/quotes', $params, $opts); - } - /** - * When retrieving a quote, there is an includable computed.upfront.line_items - * property containing the first handful of those items. There is also a URL where - * you can retrieve the full (paginated) list of upfront line items. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> - */ - public function allComputedUpfrontLineItems($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/quotes/%s/computed_upfront_line_items', $id), $params, $opts); - } - /** - * When retrieving a quote, there is an includable line_items - * property containing the first handful of those items. There is also a URL where - * you can retrieve the full (paginated) list of line items. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\LineItem> - */ - public function allLineItems($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/quotes/%s/line_items', $id), $params, $opts); - } - /** - * Cancels the quote. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/quotes/%s/cancel', $id), $params, $opts); - } - /** - * A quote models prices and services for a customer. Default options for - * header, description, footer, and - * expires_at can be set in the dashboard via the quote template. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/quotes', $params, $opts); - } - /** - * Finalizes the quote. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote - */ - public function finalizeQuote($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/quotes/%s/finalize', $id), $params, $opts); - } - /** - * Download the PDF for a finalized quote. - * - * @param string $id - * @param callable $readBodyChunkCallable - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return mixed - */ - public function pdf($id, $readBodyChunkCallable, $params = null, $opts = null) - { - $opts = \WP_Ultimo\Dependencies\Stripe\Util\RequestOptions::parse($opts); - if (!isset($opts->apiBase)) { - $opts->apiBase = $this->getClient()->getFilesBase(); - } - return $this->requestStream('get', $this->buildPath('/v1/quotes/%s/pdf', $id), $readBodyChunkCallable, $params, $opts); - } - /** - * Retrieves the quote with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/quotes/%s', $id), $params, $opts); - } - /** - * A quote models prices and services for a customer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Quote - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/quotes/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php b/dependencies/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php deleted file mode 100644 index ca17289..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php +++ /dev/null @@ -1,41 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/radar/early_fraud_warnings', $params, $opts); - } - /** - * Retrieves the details of an early fraud warning that has previously been - * created. - * - * Please refer to the early fraud - * warning object reference for more details. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\EarlyFraudWarning - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/radar/early_fraud_warnings/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php deleted file mode 100644 index 1f77db5..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - private static $classMap = ['earlyFraudWarnings' => EarlyFraudWarningService::class, 'valueListItems' => ValueListItemService::class, 'valueLists' => ValueListService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php b/dependencies/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php deleted file mode 100644 index 7055997..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php +++ /dev/null @@ -1,70 +0,0 @@ -ValueListItem objects. The objects are sorted in - * descending order by creation date, with the most recently created object - * appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Radar\ValueListItem> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/radar/value_list_items', $params, $opts); - } - /** - * Creates a new ValueListItem object, which is added to the specified - * parent value list. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueListItem - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/radar/value_list_items', $params, $opts); - } - /** - * Deletes a ValueListItem object, removing it from its parent value - * list. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueListItem - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/radar/value_list_items/%s', $id), $params, $opts); - } - /** - * Retrieves a ValueListItem object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueListItem - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/radar/value_list_items/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Radar/ValueListService.php b/dependencies/stripe/stripe-php/lib/Service/Radar/ValueListService.php deleted file mode 100644 index 8d44b2b..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Radar/ValueListService.php +++ /dev/null @@ -1,88 +0,0 @@ -ValueList objects. The objects are sorted in - * descending order by creation date, with the most recently created object - * appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Radar\ValueList> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/radar/value_lists', $params, $opts); - } - /** - * Creates a new ValueList object, which can then be referenced in - * rules. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueList - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/radar/value_lists', $params, $opts); - } - /** - * Deletes a ValueList object, also deleting any items contained - * within the value list. To be deleted, a value list must not be referenced in any - * rules. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueList - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); - } - /** - * Retrieves a ValueList object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueList - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); - } - /** - * Updates a ValueList object by setting the values of the parameters - * passed. Any parameters not provided will be left unchanged. Note that - * item_type is immutable. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Radar\ValueList - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/RefundService.php b/dependencies/stripe/stripe-php/lib/Service/RefundService.php deleted file mode 100644 index 8207236..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/RefundService.php +++ /dev/null @@ -1,90 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/refunds', $params, $opts); - } - /** - * Cancels a refund with a status of requires_action. - * - * Refunds in other states cannot be canceled, and only refunds for payment methods - * that require customer action will enter the requires_action state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Refund - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/refunds/%s/cancel', $id), $params, $opts); - } - /** - * Create a refund. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Refund - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/refunds', $params, $opts); - } - /** - * Retrieves the details of an existing refund. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Refund - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/refunds/%s', $id), $params, $opts); - } - /** - * Updates the specified refund by setting the values of the parameters passed. Any - * parameters not provided will be left unchanged. - * - * This request only accepts metadata as an argument. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Refund - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/refunds/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php b/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php deleted file mode 100644 index 602d674..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php +++ /dev/null @@ -1,52 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/reporting/report_runs', $params, $opts); - } - /** - * Creates a new object and begin running the report. (Certain report types require - * a live-mode API key.). - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Reporting\ReportRun - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/reporting/report_runs', $params, $opts); - } - /** - * Retrieves the details of an existing Report Run. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Reporting\ReportRun - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/reporting/report_runs/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php b/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php deleted file mode 100644 index 76a2a9a..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php +++ /dev/null @@ -1,38 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/reporting/report_types', $params, $opts); - } - /** - * Retrieves the details of a Report Type. (Certain report types require a live-mode API key.). - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Reporting\ReportType - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/reporting/report_types/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php deleted file mode 100644 index 2d88b4e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - private static $classMap = ['reportRuns' => ReportRunService::class, 'reportTypes' => ReportTypeService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ReviewService.php b/dependencies/stripe/stripe-php/lib/Service/ReviewService.php deleted file mode 100644 index 6ea88c6..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ReviewService.php +++ /dev/null @@ -1,55 +0,0 @@ -Review objects that have open set to - * true. The objects are sorted in descending order by creation date, - * with the most recently created object appearing first. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Review> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/reviews', $params, $opts); - } - /** - * Approves a Review object, closing it and removing it from the list - * of reviews. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Review - */ - public function approve($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/reviews/%s/approve', $id), $params, $opts); - } - /** - * Retrieves a Review object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Review - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/reviews/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/SetupAttemptService.php b/dependencies/stripe/stripe-php/lib/Service/SetupAttemptService.php deleted file mode 100644 index 92474cb..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/SetupAttemptService.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/setup_attempts', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/SetupIntentService.php b/dependencies/stripe/stripe-php/lib/Service/SetupIntentService.php deleted file mode 100644 index 69f54a6..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/SetupIntentService.php +++ /dev/null @@ -1,137 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/setup_intents', $params, $opts); - } - /** - * A SetupIntent object can be canceled when it is in one of these statuses: - * requires_payment_method, requires_confirmation, or - * requires_action. - * - * Once canceled, setup is abandoned and any operations on the SetupIntent will - * fail with an error. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/setup_intents/%s/cancel', $id), $params, $opts); - } - /** - * Confirm that your customer intends to set up the current or provided payment - * method. For example, you would confirm a SetupIntent when a customer hits the - * “Save” button on a payment method management page on your website. - * - * If the selected payment method does not require any additional steps from the - * customer, the SetupIntent will transition to the succeeded status. - * - * Otherwise, it will transition to the requires_action status and - * suggest additional actions via next_action. If setup fails, the - * SetupIntent will transition to the requires_payment_method status - * or the canceled status if the confirmation limit is reached. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent - */ - public function confirm($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/setup_intents/%s/confirm', $id), $params, $opts); - } - /** - * Creates a SetupIntent object. - * - * After the SetupIntent is created, attach a payment method and confirm to collect any required - * permissions to charge the payment method later. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/setup_intents', $params, $opts); - } - /** - * Retrieves the details of a SetupIntent that has previously been created. - * - * Client-side retrieval using a publishable key is allowed when the - * client_secret is provided in the query string. - * - * When retrieved with a publishable key, only a subset of properties will be - * returned. Please refer to the SetupIntent - * object reference for more details. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/setup_intents/%s', $id), $params, $opts); - } - /** - * Updates a SetupIntent object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/setup_intents/%s', $id), $params, $opts); - } - /** - * Verifies microdeposits on a SetupIntent object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent - */ - public function verifyMicrodeposits($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/setup_intents/%s/verify_microdeposits', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/ShippingRateService.php b/dependencies/stripe/stripe-php/lib/Service/ShippingRateService.php deleted file mode 100644 index 1b2c6cc..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/ShippingRateService.php +++ /dev/null @@ -1,66 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/shipping_rates', $params, $opts); - } - /** - * Creates a new shipping rate object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ShippingRate - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/shipping_rates', $params, $opts); - } - /** - * Returns the shipping rate object with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ShippingRate - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/shipping_rates/%s', $id), $params, $opts); - } - /** - * Updates an existing shipping rate object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\ShippingRate - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/shipping_rates/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php b/dependencies/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php deleted file mode 100644 index 64b3c87..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/sigma/scheduled_query_runs', $params, $opts); - } - /** - * Retrieves the details of an scheduled query run. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Sigma\ScheduledQueryRun - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/sigma/scheduled_query_runs/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php deleted file mode 100644 index 5645c76..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - private static $classMap = ['scheduledQueryRuns' => ScheduledQueryRunService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/SourceService.php b/dependencies/stripe/stripe-php/lib/Service/SourceService.php deleted file mode 100644 index 0098ad7..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/SourceService.php +++ /dev/null @@ -1,106 +0,0 @@ - - */ - public function allSourceTransactions($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/sources/%s/source_transactions', $id), $params, $opts); - } - /** - * Creates a new source object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Source - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/sources', $params, $opts); - } - /** - * Delete a specified source for a given customer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source - */ - public function detach($parentId, $id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); - } - /** - * Retrieves an existing source object. Supply the unique source ID from a source - * creation request and Stripe will return the corresponding up-to-date source - * object information. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Source - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/sources/%s', $id), $params, $opts); - } - /** - * Updates the specified source by setting the values of the parameters passed. Any - * parameters not provided will be left unchanged. - * - * This request accepts the metadata and owner as - * arguments. It is also possible to update type specific information for selected - * payment methods. Please refer to our payment method - * guides for more detail. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Source - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/sources/%s', $id), $params, $opts); - } - /** - * Verify a given source. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Source - */ - public function verify($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/sources/%s/verify', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/SubscriptionItemService.php b/dependencies/stripe/stripe-php/lib/Service/SubscriptionItemService.php deleted file mode 100644 index 72b9941..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/SubscriptionItemService.php +++ /dev/null @@ -1,144 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/subscription_items', $params, $opts); - } - /** - * For the specified subscription item, returns a list of summary objects. Each - * object in the list provides usage information that’s been summarized from - * multiple usage records and over a subscription billing period (e.g., 15 usage - * records in the month of September). - * - * The list is sorted in reverse-chronological order (newest first). The first list - * item represents the most current usage period that hasn’t ended yet. Since new - * usage records can still be added, the returned summary information for the - * subscription item’s ID should be seen as unstable until the subscription billing - * period ends. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\UsageRecordSummary> - */ - public function allUsageRecordSummaries($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/subscription_items/%s/usage_record_summaries', $parentId), $params, $opts); - } - /** - * Adds a new item to an existing subscription. No existing items will be changed - * or replaced. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionItem - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/subscription_items', $params, $opts); - } - /** - * Creates a usage record for a specified subscription item and date, and fills it - * with a quantity. - * - * Usage records provide quantity information that Stripe uses to - * track how much a customer is using your service. With usage information and the - * pricing model set up by the metered - * billing plan, Stripe helps you send accurate invoices to your customers. - * - * The default calculation for usage is to add up all the quantity - * values of the usage records within a billing period. You can change this default - * behavior with the billing plan’s aggregate_usage parameter. When - * there is more than one usage record with the same timestamp, Stripe adds the - * quantity values together. In most cases, this is the desired - * resolution, however, you can change this behavior with the action - * parameter. - * - * The default pricing model for metered billing is per-unit pricing. - * For finer granularity, you can configure metered billing to have a tiered pricing - * model. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\UsageRecord - */ - public function createUsageRecord($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscription_items/%s/usage_records', $parentId), $params, $opts); - } - /** - * Deletes an item from the subscription. Removing a subscription item from a - * subscription will not cancel the subscription. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionItem - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); - } - /** - * Retrieves the subscription item with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionItem - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); - } - /** - * Updates the plan or quantity of an item on a current subscription. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionItem - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php b/dependencies/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php deleted file mode 100644 index 6ef4598..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php +++ /dev/null @@ -1,107 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/subscription_schedules', $params, $opts); - } - /** - * Cancels a subscription schedule and its associated subscription immediately (if - * the subscription schedule has an active subscription). A subscription schedule - * can only be canceled if its status is not_started or - * active. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s/cancel', $id), $params, $opts); - } - /** - * Creates a new subscription schedule object. Each customer can have up to 500 - * active or scheduled subscriptions. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/subscription_schedules', $params, $opts); - } - /** - * Releases the subscription schedule immediately, which will stop scheduling of - * its phases, but leave any existing subscription in place. A schedule can only be - * released if its status is not_started or active. If - * the subscription schedule is currently associated with a subscription, releasing - * it will remove its subscription property and set the subscription’s - * ID to the released_subscription property. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule - */ - public function release($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s/release', $id), $params, $opts); - } - /** - * Retrieves the details of an existing subscription schedule. You only need to - * supply the unique subscription schedule identifier that was returned upon - * subscription schedule creation. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/subscription_schedules/%s', $id), $params, $opts); - } - /** - * Updates an existing subscription schedule. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/SubscriptionService.php b/dependencies/stripe/stripe-php/lib/Service/SubscriptionService.php deleted file mode 100644 index 2353d1e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/SubscriptionService.php +++ /dev/null @@ -1,168 +0,0 @@ -status=canceled. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Subscription> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/subscriptions', $params, $opts); - } - /** - * Cancels a customer’s subscription immediately. The customer will not be charged - * again for the subscription. - * - * Note, however, that any pending invoice items that you’ve created will still be - * charged for at the end of the period, unless manually deleted. If you’ve set the subscription to cancel - * at the end of the period, any pending prorations will also be left in place and - * collected at the end of the period. But if the subscription is set to cancel - * immediately, pending prorations will be removed. - * - * By default, upon subscription cancellation, Stripe will stop automatic - * collection of all finalized invoices for the customer. This is intended to - * prevent unexpected payment attempts after the customer has canceled a - * subscription. However, you can resume automatic collection of the invoices - * manually after subscription cancellation to have us proceed. Or, you could check - * for unpaid invoices before allowing the customer to cancel the subscription at - * all. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); - } - /** - * Creates a new subscription on an existing customer. Each customer can have up to - * 500 active or scheduled subscriptions. - * - * When you create a subscription with - * collection_method=charge_automatically, the first invoice is - * finalized as part of the request. The payment_behavior parameter - * determines the exact behavior of the initial payment. - * - * To start subscriptions where the first invoice always begins in a - * draft status, use subscription - * schedules instead. Schedules provide the flexibility to model more complex - * billing configurations that change over time. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/subscriptions', $params, $opts); - } - /** - * Removes the currently applied discount on a subscription. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Discount - */ - public function deleteDiscount($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/subscriptions/%s/discount', $id), $params, $opts); - } - /** - * Initiates resumption of a paused subscription, optionally resetting the billing - * cycle anchor and creating prorations. If a resumption invoice is generated, it - * must be paid or marked uncollectible before the subscription will be unpaused. - * If payment succeeds the subscription will become active, and if - * payment fails the subscription will be past_due. The resumption - * invoice will void automatically if not paid by the expiration date. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription - */ - public function resume($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscriptions/%s/resume', $id), $params, $opts); - } - /** - * Retrieves the subscription with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); - } - /** - * Search for subscriptions you’ve previously created using Stripe’s Search Query Language. Don’t use - * search in read-after-write flows where strict consistency is necessary. Under - * normal operating conditions, data is searchable in less than a minute. - * Occasionally, propagation of new or updated data can be up to an hour behind - * during outages. Search functionality is not available to merchants in India. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Subscription> - */ - public function search($params = null, $opts = null) - { - return $this->requestSearchResult('get', '/v1/subscriptions/search', $params, $opts); - } - /** - * Updates an existing subscription on a customer to match the specified - * parameters. When changing plans or quantities, we will optionally prorate the - * price we charge next month to make up for any price changes. To preview how the - * proration will be calculated, use the upcoming - * invoice endpoint. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Tax/CalculationService.php b/dependencies/stripe/stripe-php/lib/Service/Tax/CalculationService.php deleted file mode 100644 index bdd8343..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Tax/CalculationService.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - public function allLineItems($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/tax/calculations/%s/line_items', $id), $params, $opts); - } - /** - * Calculates tax based on input and returns a Tax Calculation object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Calculation - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/tax/calculations', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Tax/SettingsService.php b/dependencies/stripe/stripe-php/lib/Service/Tax/SettingsService.php deleted file mode 100644 index 7903fa3..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Tax/SettingsService.php +++ /dev/null @@ -1,37 +0,0 @@ -Settings for a merchant. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Settings - */ - public function retrieve($params = null, $opts = null) - { - return $this->request('get', '/v1/tax/settings', $params, $opts); - } - /** - * Updates Tax Settings parameters used in tax calculations. All - * parameters are editable but none can be removed once set. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Settings - */ - public function update($params = null, $opts = null) - { - return $this->request('post', '/v1/tax/settings', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php deleted file mode 100644 index a64527e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Tax/TaxServiceFactory.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - private static $classMap = ['calculations' => CalculationService::class, 'settings' => SettingsService::class, 'transactions' => TransactionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Tax/TransactionService.php b/dependencies/stripe/stripe-php/lib/Service/Tax/TransactionService.php deleted file mode 100644 index b28b1d1..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Tax/TransactionService.php +++ /dev/null @@ -1,66 +0,0 @@ - - */ - public function allLineItems($id, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/tax/transactions/%s/line_items', $id), $params, $opts); - } - /** - * Creates a Tax Transaction from a calculation. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Transaction - */ - public function createFromCalculation($params = null, $opts = null) - { - return $this->request('post', '/v1/tax/transactions/create_from_calculation', $params, $opts); - } - /** - * Partially or fully reverses a previously created Transaction. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Transaction - */ - public function createReversal($params = null, $opts = null) - { - return $this->request('post', '/v1/tax/transactions/create_reversal', $params, $opts); - } - /** - * Retrieves a Tax Transaction object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Transaction - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/tax/transactions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TaxCodeService.php b/dependencies/stripe/stripe-php/lib/Service/TaxCodeService.php deleted file mode 100644 index 19c8b7d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TaxCodeService.php +++ /dev/null @@ -1,39 +0,0 @@ -all tax codes - * available to add to Products in order to allow specific tax calculations. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\TaxCode> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/tax_codes', $params, $opts); - } - /** - * Retrieves the details of an existing tax code. Supply the unique tax code ID and - * Stripe will return the corresponding tax code information. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxCode - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/tax_codes/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TaxRateService.php b/dependencies/stripe/stripe-php/lib/Service/TaxRateService.php deleted file mode 100644 index 4222de7..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TaxRateService.php +++ /dev/null @@ -1,67 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/tax_rates', $params, $opts); - } - /** - * Creates a new tax rate. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxRate - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/tax_rates', $params, $opts); - } - /** - * Retrieves a tax rate with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxRate - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/tax_rates/%s', $id), $params, $opts); - } - /** - * Updates an existing tax rate. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TaxRate - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/tax_rates/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php b/dependencies/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php deleted file mode 100644 index 89bb05e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php +++ /dev/null @@ -1,81 +0,0 @@ -Configuration objects. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Terminal\Configuration> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/terminal/configurations', $params, $opts); - } - /** - * Creates a new Configuration object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Configuration - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/terminal/configurations', $params, $opts); - } - /** - * Deletes a Configuration object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Configuration - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/terminal/configurations/%s', $id), $params, $opts); - } - /** - * Retrieves a Configuration object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Configuration - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/terminal/configurations/%s', $id), $params, $opts); - } - /** - * Updates a new Configuration object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Configuration - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/configurations/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php b/dependencies/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php deleted file mode 100644 index 07f9884..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php +++ /dev/null @@ -1,24 +0,0 @@ -request('post', '/v1/terminal/connection_tokens', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Terminal/LocationService.php b/dependencies/stripe/stripe-php/lib/Service/Terminal/LocationService.php deleted file mode 100644 index f48a5b3..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Terminal/LocationService.php +++ /dev/null @@ -1,84 +0,0 @@ -Location objects. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Terminal\Location> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/terminal/locations', $params, $opts); - } - /** - * Creates a new Location object. For further details, including which - * address fields are required in each country, see the Manage locations guide. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Location - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/terminal/locations', $params, $opts); - } - /** - * Deletes a Location object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Location - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); - } - /** - * Retrieves a Location object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Location - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); - } - /** - * Updates a Location object by setting the values of the parameters - * passed. Any parameters not provided will be left unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Location - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Terminal/ReaderService.php b/dependencies/stripe/stripe-php/lib/Service/Terminal/ReaderService.php deleted file mode 100644 index 58e293f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Terminal/ReaderService.php +++ /dev/null @@ -1,157 +0,0 @@ -Reader objects. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Terminal\Reader> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/terminal/readers', $params, $opts); - } - /** - * Cancels the current reader action. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function cancelAction($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/cancel_action', $id), $params, $opts); - } - /** - * Creates a new Reader object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/terminal/readers', $params, $opts); - } - /** - * Deletes a Reader object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); - } - /** - * Initiates a payment flow on a Reader. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function processPaymentIntent($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/process_payment_intent', $id), $params, $opts); - } - /** - * Initiates a setup intent flow on a Reader. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function processSetupIntent($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/process_setup_intent', $id), $params, $opts); - } - /** - * Initiates a refund on a Reader. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function refundPayment($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/refund_payment', $id), $params, $opts); - } - /** - * Retrieves a Reader object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); - } - /** - * Sets reader display to show cart details. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function setReaderDisplay($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/set_reader_display', $id), $params, $opts); - } - /** - * Updates a Reader object by setting the values of the parameters - * passed. Any parameters not provided will be left unchanged. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php deleted file mode 100644 index c4ca6a9..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - private static $classMap = ['configurations' => ConfigurationService::class, 'connectionTokens' => ConnectionTokenService::class, 'locations' => LocationService::class, 'readers' => ReaderService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php deleted file mode 100644 index c0218ac..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/CustomerService.php +++ /dev/null @@ -1,23 +0,0 @@ -request('post', $this->buildPath('/v1/test_helpers/customers/%s/fund_cash_balance', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php deleted file mode 100644 index 1d1a33f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php +++ /dev/null @@ -1,72 +0,0 @@ -Card object to - * delivered. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function deliverCard($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/deliver', $id), $params, $opts); - } - /** - * Updates the shipping status of the specified Issuing Card object to - * failure. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function failCard($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/fail', $id), $params, $opts); - } - /** - * Updates the shipping status of the specified Issuing Card object to - * returned. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function returnCard($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/return', $id), $params, $opts); - } - /** - * Updates the shipping status of the specified Issuing Card object to - * shipped. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Issuing\Card - */ - public function shipCard($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/ship', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php deleted file mode 100644 index e08817d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - private static $classMap = ['cards' => CardService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php deleted file mode 100644 index 249a6d8..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php +++ /dev/null @@ -1,23 +0,0 @@ -requires_action. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Refund - */ - public function expire($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/refunds/%s/expire', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php deleted file mode 100644 index cb00e14..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php +++ /dev/null @@ -1,24 +0,0 @@ -request('post', $this->buildPath('/v1/test_helpers/terminal/readers/%s/present_payment_method', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php deleted file mode 100644 index 5b8340e..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - private static $classMap = ['readers' => ReaderService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php deleted file mode 100644 index f17a670..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php +++ /dev/null @@ -1,82 +0,0 @@ -Ready. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TestHelpers\TestClock - */ - public function advance($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/test_clocks/%s/advance', $id), $params, $opts); - } - /** - * Returns a list of your test clocks. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\TestHelpers\TestClock> - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/test_helpers/test_clocks', $params, $opts); - } - /** - * Creates a new test clock that can be attached to new customers and quotes. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TestHelpers\TestClock - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/test_helpers/test_clocks', $params, $opts); - } - /** - * Deletes a test clock. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TestHelpers\TestClock - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/test_helpers/test_clocks/%s', $id), $params, $opts); - } - /** - * Retrieves a test clock. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TestHelpers\TestClock - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/test_helpers/test_clocks/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php deleted file mode 100644 index 13fb35d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - private static $classMap = ['customers' => CustomerService::class, 'issuing' => Issuing\IssuingServiceFactory::class, 'refunds' => RefundService::class, 'terminal' => Terminal\TerminalServiceFactory::class, 'testClocks' => TestClockService::class, 'treasury' => Treasury\TreasuryServiceFactory::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php deleted file mode 100644 index d89dcfa..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php +++ /dev/null @@ -1,59 +0,0 @@ -failed - * status. The InboundTransfer must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer - */ - public function fail($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/inbound_transfers/%s/fail', $id), $params, $opts); - } - /** - * Marks the test mode InboundTransfer object as returned and links the - * InboundTransfer to a ReceivedDebit. The InboundTransfer must already be in the - * succeeded state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer - */ - public function returnInboundTransfer($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/inbound_transfers/%s/return', $id), $params, $opts); - } - /** - * Transitions a test mode created InboundTransfer to the succeeded - * status. The InboundTransfer must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer - */ - public function succeed($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/inbound_transfers/%s/succeed', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php deleted file mode 100644 index b1fd190..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php +++ /dev/null @@ -1,59 +0,0 @@ -failed - * status. The OutboundPayment must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment - */ - public function fail($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s/fail', $id), $params, $opts); - } - /** - * Transitions a test mode created OutboundPayment to the posted - * status. The OutboundPayment must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment - */ - public function post($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s/post', $id), $params, $opts); - } - /** - * Transitions a test mode created OutboundPayment to the returned - * status. The OutboundPayment must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment - */ - public function returnOutboundPayment($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s/return', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php deleted file mode 100644 index 1dbd9fb..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php +++ /dev/null @@ -1,59 +0,0 @@ -failed - * status. The OutboundTransfer must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer - */ - public function fail($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s/fail', $id), $params, $opts); - } - /** - * Transitions a test mode created OutboundTransfer to the posted - * status. The OutboundTransfer must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer - */ - public function post($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s/post', $id), $params, $opts); - } - /** - * Transitions a test mode created OutboundTransfer to the returned - * status. The OutboundTransfer must already be in the processing - * state. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer - */ - public function returnOutboundTransfer($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s/return', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php deleted file mode 100644 index 6141662..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php +++ /dev/null @@ -1,24 +0,0 @@ -request('post', '/v1/test_helpers/treasury/received_credits', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php deleted file mode 100644 index 4d1641b..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php +++ /dev/null @@ -1,24 +0,0 @@ -request('post', '/v1/test_helpers/treasury/received_debits', $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php deleted file mode 100644 index dcd5d81..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ - private static $classMap = ['inboundTransfers' => InboundTransferService::class, 'outboundPayments' => OutboundPaymentService::class, 'outboundTransfers' => OutboundTransferService::class, 'receivedCredits' => ReceivedCreditService::class, 'receivedDebits' => ReceivedDebitService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TokenService.php b/dependencies/stripe/stripe-php/lib/Service/TokenService.php deleted file mode 100644 index d1fc3cf..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TokenService.php +++ /dev/null @@ -1,40 +0,0 @@ -Custom - * account. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Token - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/tokens', $params, $opts); - } - /** - * Retrieves the token with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Token - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/tokens/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TopupService.php b/dependencies/stripe/stripe-php/lib/Service/TopupService.php deleted file mode 100644 index 6f3162d..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TopupService.php +++ /dev/null @@ -1,84 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/topups', $params, $opts); - } - /** - * Cancels a top-up. Only pending top-ups can be canceled. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Topup - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/topups/%s/cancel', $id), $params, $opts); - } - /** - * Top up the balance of an account. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Topup - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/topups', $params, $opts); - } - /** - * Retrieves the details of a top-up that has previously been created. Supply the - * unique top-up ID that was returned from your previous request, and Stripe will - * return the corresponding top-up information. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Topup - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/topups/%s', $id), $params, $opts); - } - /** - * Updates the metadata of a top-up. Other top-up details are not editable by - * design. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Topup - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/topups/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/TransferService.php b/dependencies/stripe/stripe-php/lib/Service/TransferService.php deleted file mode 100644 index 7476ea3..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/TransferService.php +++ /dev/null @@ -1,153 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/transfers', $params, $opts); - } - /** - * You can see a list of the reversals belonging to a specific transfer. Note that - * the 10 most recent reversals are always available by default on the transfer - * object. If you need more than those 10, you can use this API method and the - * limit and starting_after parameters to page through - * additional reversals. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\TransferReversal> - */ - public function allReversals($parentId, $params = null, $opts = null) - { - return $this->requestCollection('get', $this->buildPath('/v1/transfers/%s/reversals', $parentId), $params, $opts); - } - /** - * To send funds from your Stripe account to a connected account, you create a new - * transfer object. Your Stripe balance must be able to - * cover the transfer amount, or you’ll receive an “Insufficient Funds” error. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Transfer - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/transfers', $params, $opts); - } - /** - * When you create a new reversal, you must specify a transfer to create it on. - * - * When reversing transfers, you can optionally reverse part of the transfer. You - * can do so as many times as you wish until the entire transfer has been reversed. - * - * Once entirely reversed, a transfer can’t be reversed again. This method will - * return an error when called on an already-reversed transfer, or when trying to - * reverse more money than is left on a transfer. - * - * @param string $parentId - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TransferReversal - */ - public function createReversal($parentId, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/transfers/%s/reversals', $parentId), $params, $opts); - } - /** - * Retrieves the details of an existing transfer. Supply the unique transfer ID - * from either a transfer creation request or the transfer list, and Stripe will - * return the corresponding transfer information. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Transfer - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/transfers/%s', $id), $params, $opts); - } - /** - * By default, you can see the 10 most recent reversals stored directly on the - * transfer object, but you can also retrieve details about a specific reversal - * stored on the transfer. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TransferReversal - */ - public function retrieveReversal($parentId, $id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/transfers/%s/reversals/%s', $parentId, $id), $params, $opts); - } - /** - * Updates the specified transfer by setting the values of the parameters passed. - * Any parameters not provided will be left unchanged. - * - * This request accepts only metadata as an argument. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Transfer - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/transfers/%s', $id), $params, $opts); - } - /** - * Updates the specified reversal by setting the values of the parameters passed. - * Any parameters not provided will be left unchanged. - * - * This request only accepts metadata and description as arguments. - * - * @param string $parentId - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TransferReversal - */ - public function updateReversal($parentId, $id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/transfers/%s/reversals/%s', $parentId, $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php deleted file mode 100644 index 1df6b65..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/CreditReversalService.php +++ /dev/null @@ -1,53 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/credit_reversals', $params, $opts); - } - /** - * Reverses a ReceivedCredit and creates a CreditReversal object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\CreditReversal - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/treasury/credit_reversals', $params, $opts); - } - /** - * Retrieves the details of an existing CreditReversal by passing the unique - * CreditReversal ID from either the CreditReversal creation request or - * CreditReversal list. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\CreditReversal - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/credit_reversals/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php deleted file mode 100644 index ad989b9..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/DebitReversalService.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/debit_reversals', $params, $opts); - } - /** - * Reverses a ReceivedDebit and creates a DebitReversal object. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\DebitReversal - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/treasury/debit_reversals', $params, $opts); - } - /** - * Retrieves a DebitReversal object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\DebitReversal - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/debit_reversals/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php deleted file mode 100644 index 454d38f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/FinancialAccountService.php +++ /dev/null @@ -1,97 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/financial_accounts', $params, $opts); - } - /** - * Creates a new FinancialAccount. For now, each connected account can only have - * one FinancialAccount. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccount - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/treasury/financial_accounts', $params, $opts); - } - /** - * Retrieves the details of a FinancialAccount. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccount - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/financial_accounts/%s', $id), $params, $opts); - } - /** - * Retrieves Features information associated with the FinancialAccount. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccountFeatures - */ - public function retrieveFeatures($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/financial_accounts/%s/features', $id), $params, $opts); - } - /** - * Updates the details of a FinancialAccount. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccount - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/treasury/financial_accounts/%s', $id), $params, $opts); - } - /** - * Updates the Features associated with a FinancialAccount. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccountFeatures - */ - public function updateFeatures($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/treasury/financial_accounts/%s/features', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php deleted file mode 100644 index dcc17c7..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/InboundTransferService.php +++ /dev/null @@ -1,66 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/inbound_transfers', $params, $opts); - } - /** - * Cancels an InboundTransfer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/treasury/inbound_transfers/%s/cancel', $id), $params, $opts); - } - /** - * Creates an InboundTransfer. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/treasury/inbound_transfers', $params, $opts); - } - /** - * Retrieves the details of an existing InboundTransfer. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/inbound_transfers/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php deleted file mode 100644 index 7939f0f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundPaymentService.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/outbound_payments', $params, $opts); - } - /** - * Cancel an OutboundPayment. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/treasury/outbound_payments/%s/cancel', $id), $params, $opts); - } - /** - * Creates an OutboundPayment. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/treasury/outbound_payments', $params, $opts); - } - /** - * Retrieves the details of an existing OutboundPayment by passing the unique - * OutboundPayment ID from either the OutboundPayment creation request or - * OutboundPayment list. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/outbound_payments/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php deleted file mode 100644 index 4a16d77..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/OutboundTransferService.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/outbound_transfers', $params, $opts); - } - /** - * An OutboundTransfer can be canceled if the funds have not yet been paid out. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer - */ - public function cancel($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/treasury/outbound_transfers/%s/cancel', $id), $params, $opts); - } - /** - * Creates an OutboundTransfer. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/treasury/outbound_transfers', $params, $opts); - } - /** - * Retrieves the details of an existing OutboundTransfer by passing the unique - * OutboundTransfer ID from either the OutboundTransfer creation request or - * OutboundTransfer list. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/outbound_transfers/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php deleted file mode 100644 index 1c8016f..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedCreditService.php +++ /dev/null @@ -1,38 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/received_credits', $params, $opts); - } - /** - * Retrieves the details of an existing ReceivedCredit by passing the unique - * ReceivedCredit ID from the ReceivedCredit list. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\ReceivedCredit - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/received_credits/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php deleted file mode 100644 index 9e6ddd2..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/ReceivedDebitService.php +++ /dev/null @@ -1,38 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/received_debits', $params, $opts); - } - /** - * Retrieves the details of an existing ReceivedDebit by passing the unique - * ReceivedDebit ID from the ReceivedDebit list. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\ReceivedDebit - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/received_debits/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php deleted file mode 100644 index 40ec337..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionEntryService.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/transaction_entries', $params, $opts); - } - /** - * Retrieves a TransactionEntry object. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\TransactionEntry - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/transaction_entries/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionService.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionService.php deleted file mode 100644 index 23310b5..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/TransactionService.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/treasury/transactions', $params, $opts); - } - /** - * Retrieves the details of an existing Transaction. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\Transaction - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/treasury/transactions/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php b/dependencies/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php deleted file mode 100644 index 8ec002c..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ - private static $classMap = ['creditReversals' => CreditReversalService::class, 'debitReversals' => DebitReversalService::class, 'financialAccounts' => FinancialAccountService::class, 'inboundTransfers' => InboundTransferService::class, 'outboundPayments' => OutboundPaymentService::class, 'outboundTransfers' => OutboundTransferService::class, 'receivedCredits' => ReceivedCreditService::class, 'receivedDebits' => ReceivedDebitService::class, 'transactionEntries' => TransactionEntryService::class, 'transactions' => TransactionService::class]; - protected function getServiceClass($name) - { - return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Service/WebhookEndpointService.php b/dependencies/stripe/stripe-php/lib/Service/WebhookEndpointService.php deleted file mode 100644 index 90b1ebc..0000000 --- a/dependencies/stripe/stripe-php/lib/Service/WebhookEndpointService.php +++ /dev/null @@ -1,92 +0,0 @@ - - */ - public function all($params = null, $opts = null) - { - return $this->requestCollection('get', '/v1/webhook_endpoints', $params, $opts); - } - /** - * A webhook endpoint must have a url and a list of - * enabled_events. You may optionally specify the Boolean - * connect parameter. If set to true, then a Connect webhook endpoint - * that notifies the specified url about events from all connected - * accounts is created; otherwise an account webhook endpoint that notifies the - * specified url only about events from your account is created. You - * can also create webhook endpoints in the webhooks settings - * section of the Dashboard. - * - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\WebhookEndpoint - */ - public function create($params = null, $opts = null) - { - return $this->request('post', '/v1/webhook_endpoints', $params, $opts); - } - /** - * You can also delete webhook endpoints via the webhook endpoint - * management page of the Stripe dashboard. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\WebhookEndpoint - */ - public function delete($id, $params = null, $opts = null) - { - return $this->request('delete', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); - } - /** - * Retrieves the webhook endpoint with the given ID. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\WebhookEndpoint - */ - public function retrieve($id, $params = null, $opts = null) - { - return $this->request('get', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); - } - /** - * Updates the webhook endpoint. You may edit the url, the list of - * enabled_events, and the status of your endpoint. - * - * @param string $id - * @param null|array $params - * @param null|array|\Stripe\Util\RequestOptions $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\WebhookEndpoint - */ - public function update($id, $params = null, $opts = null) - { - return $this->request('post', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/SetupAttempt.php b/dependencies/stripe/stripe-php/lib/SetupAttempt.php deleted file mode 100644 index 4049589..0000000 --- a/dependencies/stripe/stripe-php/lib/SetupAttempt.php +++ /dev/null @@ -1,32 +0,0 @@ -application on the SetupIntent at the time of this confirmation. - * @property null|bool $attach_to_self

      If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.

      It can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.

      - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string|\Stripe\Customer $customer The value of customer on the SetupIntent at the time of this confirmation. - * @property null|string[] $flow_directions

      Indicates the directions of money movement for which this payment method is intended to be used.

      Include inbound if you intend to use the payment method as the origin to pull funds from. Include outbound if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.

      - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string|\Stripe\Account $on_behalf_of The value of on_behalf_of on the SetupIntent at the time of this confirmation. - * @property string|\Stripe\PaymentMethod $payment_method ID of the payment method used with this SetupAttempt. - * @property \Stripe\StripeObject $payment_method_details - * @property null|\Stripe\StripeObject $setup_error The error encountered during this attempt to confirm the SetupIntent, if any. - * @property string|\Stripe\SetupIntent $setup_intent ID of the SetupIntent that this attempt belongs to. - * @property string $status Status of this SetupAttempt, one of requires_confirmation, requires_action, processing, succeeded, failed, or abandoned. - * @property string $usage The value of usage on the SetupIntent at the time of this confirmation, one of off_session or on_session. - */ -class SetupAttempt extends ApiResource -{ - const OBJECT_NAME = 'setup_attempt'; - use ApiOperations\All; -} diff --git a/dependencies/stripe/stripe-php/lib/SetupIntent.php b/dependencies/stripe/stripe-php/lib/SetupIntent.php deleted file mode 100644 index 1a70f18..0000000 --- a/dependencies/stripe/stripe-php/lib/SetupIntent.php +++ /dev/null @@ -1,116 +0,0 @@ -PaymentIntents to drive the payment flow. - * - * Create a SetupIntent as soon as you're ready to collect your customer's payment credentials. - * Do not maintain long-lived, unconfirmed SetupIntents as they may no longer be valid. - * The SetupIntent then transitions through multiple statuses as it guides - * you through the setup process. - * - * Successful SetupIntents result in payment credentials that are optimized for future payments. - * For example, cardholders in certain regions may need to be run through - * Strong Customer Authentication at the time of payment method collection - * in order to streamline later off-session payments. - * If the SetupIntent is used with a Customer, upon success, - * it will automatically attach the resulting payment method to that Customer. - * We recommend using SetupIntents or setup_future_usage on - * PaymentIntents to save payment methods in order to prevent saving invalid or unoptimized payment methods. - * - * By using SetupIntents, you ensure that your customers experience the minimum set of required friction, - * even as regulations change over time. - * - * Related guide: Setup Intents API - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string|\Stripe\StripeObject $application ID of the Connect application that created the SetupIntent. - * @property null|bool $attach_to_self

      If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.

      It can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.

      - * @property null|\Stripe\StripeObject $automatic_payment_methods Settings for automatic payment methods compatible with this Setup Intent - * @property null|string $cancellation_reason Reason for cancellation of this SetupIntent, one of abandoned, requested_by_customer, or duplicate. - * @property null|string $client_secret

      The client secret of this SetupIntent. Used for client-side retrieval using a publishable key.

      The client secret can be used to complete payment setup from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.

      - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string|\Stripe\Customer $customer

      ID of the Customer this SetupIntent belongs to, if one exists.

      If present, the SetupIntent's payment method will be attached to the Customer on successful setup. Payment methods attached to other Customers cannot be used with this SetupIntent.

      - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string[] $flow_directions

      Indicates the directions of money movement for which this payment method is intended to be used.

      Include inbound if you intend to use the payment method as the origin to pull funds from. Include outbound if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.

      - * @property null|\Stripe\StripeObject $last_setup_error The error encountered in the previous SetupIntent confirmation. - * @property null|string|\Stripe\SetupAttempt $latest_attempt The most recent SetupAttempt for this SetupIntent. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string|\Stripe\Mandate $mandate ID of the multi use Mandate generated by the SetupIntent. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $next_action If present, this property tells you what actions you need to take in order for your customer to continue payment setup. - * @property null|string|\Stripe\Account $on_behalf_of The account (if any) for which the setup is intended. - * @property null|string|\Stripe\PaymentMethod $payment_method ID of the payment method used with this SetupIntent. - * @property null|\Stripe\StripeObject $payment_method_options Payment-method-specific configuration for this SetupIntent. - * @property string[] $payment_method_types The list of payment method types (e.g. card) that this SetupIntent is allowed to set up. - * @property null|string|\Stripe\Mandate $single_use_mandate ID of the single_use Mandate generated by the SetupIntent. - * @property string $status Status of this SetupIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, canceled, or succeeded. - * @property string $usage

      Indicates how the payment method is intended to be used in the future.

      Use on_session if you intend to only reuse the payment method when the customer is in your checkout flow. Use off_session if your customer may or may not be in your checkout flow. If not provided, this value defaults to off_session.

      - */ -class SetupIntent extends ApiResource -{ - const OBJECT_NAME = 'setup_intent'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const CANCELLATION_REASON_ABANDONED = 'abandoned'; - const CANCELLATION_REASON_DUPLICATE = 'duplicate'; - const CANCELLATION_REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; - const STATUS_CANCELED = 'canceled'; - const STATUS_PROCESSING = 'processing'; - const STATUS_REQUIRES_ACTION = 'requires_action'; - const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation'; - const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method'; - const STATUS_SUCCEEDED = 'succeeded'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent the canceled setup intent - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent the confirmed setup intent - */ - public function confirm($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/confirm'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SetupIntent the verified setup intent - */ - public function verifyMicrodeposits($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/verify_microdeposits'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/ShippingRate.php b/dependencies/stripe/stripe-php/lib/ShippingRate.php deleted file mode 100644 index 0fec334..0000000 --- a/dependencies/stripe/stripe-php/lib/ShippingRate.php +++ /dev/null @@ -1,34 +0,0 @@ -Charge for shipping. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Whether the shipping rate can be used for new purchases. Defaults to true. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|\Stripe\StripeObject $delivery_estimate The estimated range for how long shipping will take, meant to be displayable to the customer. This will appear on CheckoutSessions. - * @property null|string $display_name The name of the shipping rate, meant to be displayable to the customer. This will appear on CheckoutSessions. - * @property null|\Stripe\StripeObject $fixed_amount - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $tax_behavior Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of inclusive, exclusive, or unspecified. - * @property null|string|\Stripe\TaxCode $tax_code A tax code ID. The Shipping tax code is txcd_92010001. - * @property string $type The type of calculation to use on the shipping rate. Can only be fixed_amount for now. - */ -class ShippingRate extends ApiResource -{ - const OBJECT_NAME = 'shipping_rate'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; - const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; - const TAX_BEHAVIOR_UNSPECIFIED = 'unspecified'; - const TYPE_FIXED_AMOUNT = 'fixed_amount'; -} diff --git a/dependencies/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php b/dependencies/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php deleted file mode 100644 index 6261d2d..0000000 --- a/dependencies/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php +++ /dev/null @@ -1,33 +0,0 @@ -scheduled a Sigma query, you'll - * receive a sigma.scheduled_query_run.created webhook each time the query - * runs. The webhook contains a ScheduledQueryRun object, which you can use to - * retrieve the query results. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property int $data_load_time When the query was run, Sigma contained a snapshot of your Stripe data at this time. - * @property null|\Stripe\StripeObject $error - * @property null|\Stripe\File $file The file object representing the results of the query. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property int $result_available_until Time at which the result expires and is no longer available for download. - * @property string $sql SQL for the query. - * @property string $status The query's execution status, which will be completed for successful runs, and canceled, failed, or timed_out otherwise. - * @property string $title Title of the query. - */ -class ScheduledQueryRun extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'scheduled_query_run'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - public static function classUrl() - { - return '/v1/sigma/scheduled_query_runs'; - } -} diff --git a/dependencies/stripe/stripe-php/lib/SingletonApiResource.php b/dependencies/stripe/stripe-php/lib/SingletonApiResource.php deleted file mode 100644 index 4ac8301..0000000 --- a/dependencies/stripe/stripe-php/lib/SingletonApiResource.php +++ /dev/null @@ -1,28 +0,0 @@ -Source objects allow you to accept a variety of payment methods. They - * represent a customer's payment instrument, and can be used with the Stripe API - * just like a Card object: once chargeable, they can be charged, or can be - * attached to customers. - * - * Stripe doesn't recommend using the deprecated Sources API. - * We recommend that you adopt the PaymentMethods API. - * This newer API provides access to our latest features and payment method types. - * - * Related guides: Sources API and Sources & Customers. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $ach_credit_transfer - * @property null|\Stripe\StripeObject $ach_debit - * @property null|\Stripe\StripeObject $acss_debit - * @property null|\Stripe\StripeObject $alipay - * @property null|int $amount A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount associated with the source. This is the amount for which the source will be chargeable once ready. Required for single_use sources. - * @property null|\Stripe\StripeObject $au_becs_debit - * @property null|\Stripe\StripeObject $bancontact - * @property null|\Stripe\StripeObject $card - * @property null|\Stripe\StripeObject $card_present - * @property string $client_secret The client secret of the source. Used for client-side retrieval using a publishable key. - * @property null|\Stripe\StripeObject $code_verification - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $currency Three-letter ISO code for the currency associated with the source. This is the currency for which the source will be chargeable once ready. Required for single_use sources. - * @property null|string $customer The ID of the customer to which this source is attached. This will not be present when the source has not been attached to a customer. - * @property null|\Stripe\StripeObject $eps - * @property string $flow The authentication flow of the source. flow is one of redirect, receiver, code_verification, none. - * @property null|\Stripe\StripeObject $giropay - * @property null|\Stripe\StripeObject $ideal - * @property null|\Stripe\StripeObject $klarna - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $multibanco - * @property null|\Stripe\StripeObject $owner Information about the owner of the payment instrument that may be used or required by particular source types. - * @property null|\Stripe\StripeObject $p24 - * @property null|\Stripe\StripeObject $receiver - * @property null|\Stripe\StripeObject $redirect - * @property null|\Stripe\StripeObject $sepa_credit_transfer - * @property null|\Stripe\StripeObject $sepa_debit - * @property null|\Stripe\StripeObject $sofort - * @property null|\Stripe\StripeObject $source_order - * @property null|string $statement_descriptor Extra information about a source. This will appear on your customer's statement every time you charge the source. - * @property string $status The status of the source, one of canceled, chargeable, consumed, failed, or pending. Only chargeable sources can be used to create a charge. - * @property null|\Stripe\StripeObject $three_d_secure - * @property string $type The type of the source. The type is a payment method, one of ach_credit_transfer, ach_debit, alipay, bancontact, card, card_present, eps, giropay, ideal, multibanco, klarna, p24, sepa_debit, sofort, three_d_secure, or wechat. An additional hash is included on the source with a name matching this value. It contains additional information specific to the payment method used. - * @property null|string $usage Either reusable or single_use. Whether this source should be reusable or not. Some source types may or may not be reusable by construction, while others may leave the option at creation. If an incompatible value is passed, an error will be returned. - * @property null|\Stripe\StripeObject $wechat - */ -class Source extends ApiResource -{ - const OBJECT_NAME = 'source'; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const FLOW_CODE_VERIFICATION = 'code_verification'; - const FLOW_NONE = 'none'; - const FLOW_RECEIVER = 'receiver'; - const FLOW_REDIRECT = 'redirect'; - const STATUS_CANCELED = 'canceled'; - const STATUS_CHARGEABLE = 'chargeable'; - const STATUS_CONSUMED = 'consumed'; - const STATUS_FAILED = 'failed'; - const STATUS_PENDING = 'pending'; - const TYPE_ACH_CREDIT_TRANSFER = 'ach_credit_transfer'; - const TYPE_ACH_DEBIT = 'ach_debit'; - const TYPE_ACSS_DEBIT = 'acss_debit'; - const TYPE_ALIPAY = 'alipay'; - const TYPE_AU_BECS_DEBIT = 'au_becs_debit'; - const TYPE_BANCONTACT = 'bancontact'; - const TYPE_CARD = 'card'; - const TYPE_CARD_PRESENT = 'card_present'; - const TYPE_EPS = 'eps'; - const TYPE_GIROPAY = 'giropay'; - const TYPE_IDEAL = 'ideal'; - const TYPE_KLARNA = 'klarna'; - const TYPE_MULTIBANCO = 'multibanco'; - const TYPE_P24 = 'p24'; - const TYPE_SEPA_CREDIT_TRANSFER = 'sepa_credit_transfer'; - const TYPE_SEPA_DEBIT = 'sepa_debit'; - const TYPE_SOFORT = 'sofort'; - const TYPE_THREE_D_SECURE = 'three_d_secure'; - const TYPE_WECHAT = 'wechat'; - const USAGE_REUSABLE = 'reusable'; - const USAGE_SINGLE_USE = 'single_use'; - use ApiOperations\NestedResource; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\UnexpectedValueException if the source is not attached to a customer - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Source the detached source - */ - public function detach($params = null, $opts = null) - { - self::_validateParams($params); - $id = $this['id']; - if (!$id) { - $class = static::class; - $msg = "Could not determine which URL to request: {$class} instance " . "has invalid ID: {$id}"; - throw new Exception\UnexpectedValueException($msg, null); - } - if ($this['customer']) { - $base = Customer::classUrl(); - $parentExtn = \urlencode(Util\Util::utf8($this['customer'])); - $extn = \urlencode(Util\Util::utf8($id)); - $url = "{$base}/{$parentExtn}/sources/{$extn}"; - list($response, $opts) = $this->_request('delete', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - $message = 'This source object does not appear to be currently attached ' . 'to a customer object.'; - throw new Exception\UnexpectedValueException($message); - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\SourceTransaction> list of source transactions - */ - public static function allSourceTransactions($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/source_transactions'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Source the verified source - */ - public function verify($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/verify'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/SourceTransaction.php b/dependencies/stripe/stripe-php/lib/SourceTransaction.php deleted file mode 100644 index 93c5445..0000000 --- a/dependencies/stripe/stripe-php/lib/SourceTransaction.php +++ /dev/null @@ -1,20 +0,0 @@ -getService($name); - } - public function getService($name) - { - if (null === $this->coreServiceFactory) { - $this->coreServiceFactory = new \WP_Ultimo\Dependencies\Stripe\Service\CoreServiceFactory($this); - } - return $this->coreServiceFactory->getService($name); - } -} diff --git a/dependencies/stripe/stripe-php/lib/StripeClientInterface.php b/dependencies/stripe/stripe-php/lib/StripeClientInterface.php deleted file mode 100644 index a2d949c..0000000 --- a/dependencies/stripe/stripe-php/lib/StripeClientInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - "old_value"] - * - * If we update the object with `metadata[new]=new_value`, the server side - * object now has *both* fields: - * - * metadata = ["old" => "old_value", "new" => "new_value"] - * - * This is okay in itself because usually users will want to treat it as - * additive: - * - * $obj->metadata["new"] = "new_value"; - * $obj->save(); - * - * However, in other cases, they may want to replace the entire existing - * contents: - * - * $obj->metadata = ["new" => "new_value"]; - * $obj->save(); - * - * This is where things get a little bit tricky because in order to clear - * any old keys that may have existed, we actually have to send an explicit - * empty string to the server. So the operation above would have to send - * this form to get the intended behavior: - * - * metadata[old]=&metadata[new]=new_value - * - * This method allows us to track which parameters are considered additive, - * and lets us behave correctly where appropriate when serializing - * parameters to be sent. - * - * @return Util\Set Set of additive parameters - */ - public static function getAdditiveParams() - { - static $additiveParams = null; - if (null === $additiveParams) { - // Set `metadata` as additive so that when it's set directly we remember - // to clear keys that may have been previously set by sending empty - // values for them. - // - // It's possible that not every object has `metadata`, but having this - // option set when there is no `metadata` field is not harmful. - $additiveParams = new Util\Set(['metadata']); - } - return $additiveParams; - } - public function __construct($id = null, $opts = null) - { - list($id, $this->_retrieveOptions) = Util\Util::normalizeId($id); - $this->_opts = Util\RequestOptions::parse($opts); - $this->_originalValues = []; - $this->_values = []; - $this->_unsavedValues = new Util\Set(); - $this->_transientValues = new Util\Set(); - if (null !== $id) { - $this->_values['id'] = $id; - } - } - // Standard accessor magic methods - public function __set($k, $v) - { - if (static::getPermanentAttributes()->includes($k)) { - throw new Exception\InvalidArgumentException("Cannot set {$k} on this object. HINT: you can't set: " . \implode(', ', static::getPermanentAttributes()->toArray())); - } - if ('' === $v) { - throw new Exception\InvalidArgumentException('You cannot set \'' . $k . '\'to an empty string. ' . 'We interpret empty strings as NULL in requests. ' . 'You may set obj->' . $k . ' = NULL to delete the property'); - } - $this->_values[$k] = Util\Util::convertToStripeObject($v, $this->_opts); - $this->dirtyValue($this->_values[$k]); - $this->_unsavedValues->add($k); - } - /** - * @param mixed $k - * - * @return bool - */ - public function __isset($k) - { - return isset($this->_values[$k]); - } - public function __unset($k) - { - unset($this->_values[$k]); - $this->_transientValues->add($k); - $this->_unsavedValues->discard($k); - } - public function &__get($k) - { - // function should return a reference, using $nullval to return a reference to null - $nullval = null; - if (!empty($this->_values) && \array_key_exists($k, $this->_values)) { - return $this->_values[$k]; - } - if (!empty($this->_transientValues) && $this->_transientValues->includes($k)) { - $class = static::class; - $attrs = \implode(', ', \array_keys($this->_values)); - $message = "Stripe Notice: Undefined property of {$class} instance: {$k}. " . "HINT: The {$k} attribute was set in the past, however. " . 'It was then wiped when refreshing the object ' . "with the result returned by Stripe's API, " . 'probably as a result of a save(). The attributes currently ' . "available on this object are: {$attrs}"; - Stripe::getLogger()->error($message); - return $nullval; - } - $class = static::class; - Stripe::getLogger()->error("Stripe Notice: Undefined property of {$class} instance: {$k}"); - return $nullval; - } - /** - * Magic method for var_dump output. Only works with PHP >= 5.6. - * - * @return array - */ - public function __debugInfo() - { - return $this->_values; - } - // ArrayAccess methods - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetSet($k, $v) - { - $this->{$k} = $v; - } - /** - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists($k) - { - return \array_key_exists($k, $this->_values); - } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetUnset($k) - { - unset($this->{$k}); - } - /** - * @return mixed - */ - #[\ReturnTypeWillChange] - public function offsetGet($k) - { - return \array_key_exists($k, $this->_values) ? $this->_values[$k] : null; - } - /** - * @return int - */ - #[\ReturnTypeWillChange] - public function count() - { - return \count($this->_values); - } - public function keys() - { - return \array_keys($this->_values); - } - public function values() - { - return \array_values($this->_values); - } - /** - * This unfortunately needs to be public to be used in Util\Util. - * - * @param array $values - * @param null|array|string|Util\RequestOptions $opts - * - * @return static the object constructed from the given values - */ - public static function constructFrom($values, $opts = null) - { - $obj = new static(isset($values['id']) ? $values['id'] : null); - $obj->refreshFrom($values, $opts); - return $obj; - } - /** - * Refreshes this object using the provided values. - * - * @param array $values - * @param null|array|string|Util\RequestOptions $opts - * @param bool $partial defaults to false - */ - public function refreshFrom($values, $opts, $partial = \false) - { - $this->_opts = Util\RequestOptions::parse($opts); - $this->_originalValues = self::deepCopy($values); - if ($values instanceof StripeObject) { - $values = $values->toArray(); - } - // Wipe old state before setting new. This is useful for e.g. updating a - // customer, where there is no persistent card parameter. Mark those values - // which don't persist as transient - if ($partial) { - $removed = new Util\Set(); - } else { - $removed = new Util\Set(\array_diff(\array_keys($this->_values), \array_keys($values))); - } - foreach ($removed->toArray() as $k) { - unset($this->{$k}); - } - $this->updateAttributes($values, $opts, \false); - foreach ($values as $k => $v) { - $this->_transientValues->discard($k); - $this->_unsavedValues->discard($k); - } - } - /** - * Mass assigns attributes on the model. - * - * @param array $values - * @param null|array|string|Util\RequestOptions $opts - * @param bool $dirty defaults to true - */ - public function updateAttributes($values, $opts = null, $dirty = \true) - { - foreach ($values as $k => $v) { - // Special-case metadata to always be cast as a StripeObject - // This is necessary in case metadata is empty, as PHP arrays do - // not differentiate between lists and hashes, and we consider - // empty arrays to be lists. - if ('metadata' === $k && \is_array($v)) { - $this->_values[$k] = StripeObject::constructFrom($v, $opts); - } else { - $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts); - } - if ($dirty) { - $this->dirtyValue($this->_values[$k]); - } - $this->_unsavedValues->add($k); - } - } - /** - * @param bool $force defaults to false - * - * @return array a recursive mapping of attributes to values for this object, - * including the proper value for deleted attributes - */ - public function serializeParameters($force = \false) - { - $updateParams = []; - foreach ($this->_values as $k => $v) { - // There are a few reasons that we may want to add in a parameter for - // update: - // - // 1. The `$force` option has been set. - // 2. We know that it was modified. - // 3. Its value is a StripeObject. A StripeObject may contain modified - // values within in that its parent StripeObject doesn't know about. - // - $original = \array_key_exists($k, $this->_originalValues) ? $this->_originalValues[$k] : null; - $unsaved = $this->_unsavedValues->includes($k); - if ($force || $unsaved || $v instanceof StripeObject) { - $updateParams[$k] = $this->serializeParamsValue($this->_values[$k], $original, $unsaved, $force, $k); - } - } - // a `null` that makes it out of `serializeParamsValue` signals an empty - // value that we shouldn't appear in the serialized form of the object - return \array_filter($updateParams, function ($v) { - return null !== $v; - }); - } - public function serializeParamsValue($value, $original, $unsaved, $force, $key = null) - { - // The logic here is that essentially any object embedded in another - // object that had a `type` is actually an API resource of a different - // type that's been included in the response. These other resources must - // be updated from their proper endpoints, and therefore they are not - // included when serializing even if they've been modified. - // - // There are _some_ known exceptions though. - // - // For example, if the value is unsaved (meaning the user has set it), and - // it looks like the API resource is persisted with an ID, then we include - // the object so that parameters are serialized with a reference to its - // ID. - // - // Another example is that on save API calls it's sometimes desirable to - // update a customer's default source by setting a new card (or other) - // object with `->source=` and then saving the customer. The - // `saveWithParent` flag to override the default behavior allows us to - // handle these exceptions. - // - // We throw an error if a property was set explicitly but we can't do - // anything with it because the integration is probably not working as the - // user intended it to. - if (null === $value) { - return ''; - } - if ($value instanceof ApiResource && !$value->saveWithParent) { - if (!$unsaved) { - return null; - } - if (isset($value->id)) { - return $value; - } - throw new Exception\InvalidArgumentException("Cannot save property `{$key}` containing an API resource of type " . \get_class($value) . ". It doesn't appear to be persisted and is " . 'not marked as `saveWithParent`.'); - } - if (\is_array($value)) { - if (Util\Util::isList($value)) { - // Sequential array, i.e. a list - $update = []; - foreach ($value as $v) { - $update[] = $this->serializeParamsValue($v, null, \true, $force); - } - // This prevents an array that's unchanged from being resent. - if ($update !== $this->serializeParamsValue($original, null, \true, $force, $key)) { - return $update; - } - } else { - // Associative array, i.e. a map - return Util\Util::convertToStripeObject($value, $this->_opts)->serializeParameters(); - } - } elseif ($value instanceof StripeObject) { - $update = $value->serializeParameters($force); - if ($original && $unsaved && $key && static::getAdditiveParams()->includes($key)) { - $update = \array_merge(self::emptyValues($original), $update); - } - return $update; - } else { - return $value; - } - } - /** - * @return mixed - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return $this->toArray(); - } - /** - * Returns an associative array with the key and values composing the - * Stripe object. - * - * @return array the associative array - */ - public function toArray() - { - $maybeToArray = function ($value) { - if (null === $value) { - return null; - } - return \is_object($value) && \method_exists($value, 'toArray') ? $value->toArray() : $value; - }; - return \array_reduce(\array_keys($this->_values), function ($acc, $k) use($maybeToArray) { - if ('_' === \substr((string) $k, 0, 1)) { - return $acc; - } - $v = $this->_values[$k]; - if (Util\Util::isList($v)) { - $acc[$k] = \array_map($maybeToArray, $v); - } else { - $acc[$k] = $maybeToArray($v); - } - return $acc; - }, []); - } - /** - * Returns a pretty JSON representation of the Stripe object. - * - * @return string the JSON representation of the Stripe object - */ - public function toJSON() - { - return \json_encode($this->toArray(), \JSON_PRETTY_PRINT); - } - public function __toString() - { - $class = static::class; - return $class . ' JSON: ' . $this->toJSON(); - } - /** - * Sets all keys within the StripeObject as unsaved so that they will be - * included with an update when `serializeParameters` is called. This - * method is also recursive, so any StripeObjects contained as values or - * which are values in a tenant array are also marked as dirty. - */ - public function dirty() - { - $this->_unsavedValues = new Util\Set(\array_keys($this->_values)); - foreach ($this->_values as $k => $v) { - $this->dirtyValue($v); - } - } - protected function dirtyValue($value) - { - if (\is_array($value)) { - foreach ($value as $v) { - $this->dirtyValue($v); - } - } elseif ($value instanceof StripeObject) { - $value->dirty(); - } - } - /** - * Produces a deep copy of the given object including support for arrays - * and StripeObjects. - * - * @param mixed $obj - */ - protected static function deepCopy($obj) - { - if (\is_array($obj)) { - $copy = []; - foreach ($obj as $k => $v) { - $copy[$k] = self::deepCopy($v); - } - return $copy; - } - if ($obj instanceof StripeObject) { - return $obj::constructFrom(self::deepCopy($obj->_values), clone $obj->_opts); - } - return $obj; - } - /** - * Returns a hash of empty values for all the values that are in the given - * StripeObject. - * - * @param mixed $obj - */ - public static function emptyValues($obj) - { - if (\is_array($obj)) { - $values = $obj; - } elseif ($obj instanceof StripeObject) { - $values = $obj->_values; - } else { - throw new Exception\InvalidArgumentException('empty_values got unexpected object type: ' . \get_class($obj)); - } - return \array_fill_keys(\array_keys($values), ''); - } - /** - * @return null|ApiResponse The last response from the Stripe API - */ - public function getLastResponse() - { - return $this->_lastResponse; - } - /** - * Sets the last response from the Stripe API. - * - * @param ApiResponse $resp - */ - public function setLastResponse($resp) - { - $this->_lastResponse = $resp; - } - /** - * Indicates whether or not the resource has been deleted on the server. - * Note that some, but not all, resources can indicate whether they have - * been deleted. - * - * @return bool whether the resource is deleted - */ - public function isDeleted() - { - return isset($this->_values['deleted']) ? $this->_values['deleted'] : \false; - } -} diff --git a/dependencies/stripe/stripe-php/lib/StripeStreamingClientInterface.php b/dependencies/stripe/stripe-php/lib/StripeStreamingClientInterface.php deleted file mode 100644 index 617ab1d..0000000 --- a/dependencies/stripe/stripe-php/lib/StripeStreamingClientInterface.php +++ /dev/null @@ -1,11 +0,0 @@ -Creating subscriptions - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string|\Stripe\StripeObject $application ID of the Connect Application that created the subscription. - * @property null|float $application_fee_percent A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. - * @property \Stripe\StripeObject $automatic_tax - * @property int $billing_cycle_anchor Determines the date of the first full invoice, and, for plans with month or year intervals, the day of the month for subsequent invoices. The timestamp is in UTC format. - * @property null|\Stripe\StripeObject $billing_thresholds Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period - * @property null|int $cancel_at A date in the future at which the subscription will automatically get canceled - * @property bool $cancel_at_period_end If the subscription has been canceled with the at_period_end flag set to true, cancel_at_period_end on the subscription will be true. You can use this attribute to determine whether a subscription that has a status of active is scheduled to be canceled at the end of the current period. - * @property null|int $canceled_at If the subscription has been canceled, the date of that cancellation. If the subscription was canceled with cancel_at_period_end, canceled_at will reflect the time of the most recent update request, not the end of the subscription period when the subscription is automatically moved to a canceled state. - * @property null|\Stripe\StripeObject $cancellation_details Details about why this subscription was cancelled - * @property string $collection_method Either charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as active. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property int $current_period_end End of the current period that the subscription has been invoiced for. At the end of this period, a new invoice will be created. - * @property int $current_period_start Start of the current period that the subscription has been invoiced for. - * @property string|\Stripe\Customer $customer ID of the customer who owns the subscription. - * @property null|int $days_until_due Number of days a customer has to pay invoices generated by this subscription. This value will be null for subscriptions where collection_method=charge_automatically. - * @property null|string|\Stripe\PaymentMethod $default_payment_method ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over default_source. If neither are set, invoices will use the customer's invoice_settings.default_payment_method or default_source. - * @property null|string|\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source $default_source ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If default_payment_method is also set, default_payment_method will take precedence. If neither are set, invoices will use the customer's invoice_settings.default_payment_method or default_source. - * @property null|\Stripe\TaxRate[] $default_tax_rates The tax rates that will apply to any subscription item that does not have tax_rates set. Invoices created will have their default_tax_rates populated from the subscription. - * @property null|string $description The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces. - * @property null|\Stripe\Discount $discount Describes the current discount applied to this subscription, if there is one. When billing, a discount applied to a subscription overrides a discount applied on a customer-wide basis. - * @property null|int $ended_at If the subscription has ended, the date the subscription ended. - * @property \Stripe\Collection<\Stripe\SubscriptionItem> $items List of subscription items, each with an attached price. - * @property null|string|\Stripe\Invoice $latest_invoice The most recent invoice this subscription has generated. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|int $next_pending_invoice_item_invoice Specifies the approximate timestamp on which any pending invoice items will be billed according to the schedule provided at pending_invoice_item_interval. - * @property null|string|\Stripe\Account $on_behalf_of The account (if any) the charge was made on behalf of for charges associated with this subscription. See the Connect documentation for details. - * @property null|\Stripe\StripeObject $pause_collection If specified, payment collection for this subscription will be paused. - * @property null|\Stripe\StripeObject $payment_settings Payment settings passed on to invoices created by the subscription. - * @property null|\Stripe\StripeObject $pending_invoice_item_interval Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling Create an invoice for the given subscription at the specified interval. - * @property null|string|\Stripe\SetupIntent $pending_setup_intent You can use this SetupIntent to collect user authentication when creating a subscription without immediate payment or updating a subscription's payment method, allowing you to optimize for off-session payments. Learn more in the SCA Migration Guide. - * @property null|\Stripe\StripeObject $pending_update If specified, pending updates that will be applied to the subscription once the latest_invoice has been paid. - * @property null|string|\Stripe\SubscriptionSchedule $schedule The schedule attached to the subscription - * @property int $start_date Date when the subscription was first created. The date might differ from the created date due to backdating. - * @property string $status

      Possible values are incomplete, incomplete_expired, trialing, active, past_due, canceled, or unpaid.

      For collection_method=charge_automatically a subscription moves into incomplete if the initial payment attempt fails. A subscription in this state can only have metadata and default_source updated. Once the first invoice is paid, the subscription moves into an active state. If the first invoice is not paid within 23 hours, the subscription transitions to incomplete_expired. This is a terminal state, the open invoice will be voided and no further invoices will be generated.

      A subscription that is currently in a trial period is trialing and moves to active when the trial period is over.

      If subscription collection_method=charge_automatically, it becomes past_due when payment is required but cannot be paid (due to failed payment or awaiting additional user actions). Once Stripe has exhausted all payment retry attempts, the subscription will become canceled or unpaid (depending on your subscriptions settings).

      If subscription collection_method=send_invoice it becomes past_due when its invoice is not paid by the due date, and canceled or unpaid if it is still not paid by an additional deadline after that. Note that when a subscription has a status of unpaid, no subsequent invoices will be attempted (invoices will be created, but then immediately automatically closed). After receiving updated payment information from a customer, you may choose to reopen and pay their closed invoices.

      - * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this subscription belongs to. - * @property null|\Stripe\StripeObject $transfer_data The account (if any) the subscription's payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the subscription's invoices. - * @property null|int $trial_end If the subscription has a trial, the end of that trial. - * @property null|\Stripe\StripeObject $trial_settings Settings related to subscription trials. - * @property null|int $trial_start If the subscription has a trial, the beginning of that trial. - */ -class Subscription extends ApiResource -{ - const OBJECT_NAME = 'subscription'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Search; - use ApiOperations\Update; - const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; - const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; - const STATUS_ACTIVE = 'active'; - const STATUS_CANCELED = 'canceled'; - const STATUS_INCOMPLETE = 'incomplete'; - const STATUS_INCOMPLETE_EXPIRED = 'incomplete_expired'; - const STATUS_PAST_DUE = 'past_due'; - const STATUS_PAUSED = 'paused'; - const STATUS_TRIALING = 'trialing'; - const STATUS_UNPAID = 'unpaid'; - use ApiOperations\Delete { - delete as protected _delete; - } - public static function getSavedNestedResources() - { - static $savedNestedResources = null; - if (null === $savedNestedResources) { - $savedNestedResources = new Util\Set(['source']); - } - return $savedNestedResources; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription the updated subscription - */ - public function deleteDiscount($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/discount'; - list($response, $opts) = $this->_request('delete', $url, $params, $opts); - $this->refreshFrom(['discount' => null], $opts, \true); - return $this; - } - const PAYMENT_BEHAVIOR_ALLOW_INCOMPLETE = 'allow_incomplete'; - const PAYMENT_BEHAVIOR_DEFAULT_INCOMPLETE = 'default_incomplete'; - const PAYMENT_BEHAVIOR_ERROR_IF_INCOMPLETE = 'error_if_incomplete'; - const PAYMENT_BEHAVIOR_PENDING_IF_INCOMPLETE = 'pending_if_incomplete'; - const PRORATION_BEHAVIOR_ALWAYS_INVOICE = 'always_invoice'; - const PRORATION_BEHAVIOR_CREATE_PRORATIONS = 'create_prorations'; - const PRORATION_BEHAVIOR_NONE = 'none'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription the canceled subscription - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl(); - list($response, $opts) = $this->_request('delete', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Subscription the resumed subscription - */ - public function resume($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/resume'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SearchResult<\Stripe\Subscription> the subscription search results - */ - public static function search($params = null, $opts = null) - { - $url = '/v1/subscriptions/search'; - return self::_searchResource($url, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/SubscriptionItem.php b/dependencies/stripe/stripe-php/lib/SubscriptionItem.php deleted file mode 100644 index 9da6cdc..0000000 --- a/dependencies/stripe/stripe-php/lib/SubscriptionItem.php +++ /dev/null @@ -1,58 +0,0 @@ -key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property \Stripe\Plan $plan

      You can now model subscriptions more flexibly using the Prices API. It replaces the Plans API and is backwards compatible to simplify your migration.

      Plans define the base price, currency, and billing cycle for recurring purchases of products. Products help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme.

      For example, you might have a single "gold" product that has plans for $10/month, $100/year, €9/month, and €90/year.

      Related guides: Set up a subscription and more about products and prices.

      - * @property \Stripe\Price $price

      Prices define the unit cost, currency, and (optional) billing cycle for both recurring and one-time purchases of products. Products help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme.

      For example, you might have a single "gold" product that has prices for $10/month, $100/year, and €9 once.

      Related guides: Set up a subscription, create an invoice, and more about products and prices.

      - * @property null|int $quantity The quantity of the plan to which the customer should be subscribed. - * @property string $subscription The subscription this subscription_item belongs to. - * @property null|\Stripe\TaxRate[] $tax_rates The tax rates which apply to this subscription_item. When set, the default_tax_rates on the subscription do not apply to this subscription_item. - */ -class SubscriptionItem extends ApiResource -{ - const OBJECT_NAME = 'subscription_item'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\NestedResource; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const PATH_USAGE_RECORDS = '/usage_records'; - /** - * @param string $id the ID of the subscription item on which to create the usage record - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\UsageRecord - */ - public static function createUsageRecord($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_USAGE_RECORDS, $params, $opts); - } - const PATH_USAGE_RECORD_SUMMARIES = '/usage_record_summaries'; - /** - * @param string $id the ID of the subscription item on which to retrieve the usage record summaries - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\UsageRecordSummary> the list of usage record summaries - */ - public static function allUsageRecordSummaries($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_USAGE_RECORD_SUMMARIES, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/SubscriptionSchedule.php b/dependencies/stripe/stripe-php/lib/SubscriptionSchedule.php deleted file mode 100644 index 4f31bf3..0000000 --- a/dependencies/stripe/stripe-php/lib/SubscriptionSchedule.php +++ /dev/null @@ -1,76 +0,0 @@ -Subscription schedules - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string|\Stripe\StripeObject $application ID of the Connect Application that created the schedule. - * @property null|int $canceled_at Time at which the subscription schedule was canceled. Measured in seconds since the Unix epoch. - * @property null|int $completed_at Time at which the subscription schedule was completed. Measured in seconds since the Unix epoch. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|\Stripe\StripeObject $current_phase Object representing the start and end dates for the current phase of the subscription schedule, if it is active. - * @property string|\Stripe\Customer $customer ID of the customer who owns the subscription schedule. - * @property \Stripe\StripeObject $default_settings - * @property string $end_behavior Behavior of the subscription schedule and underlying subscription when it ends. Possible values are release or cancel with the default being release. release will end the subscription schedule and keep the underlying subscription running.cancel will end the subscription schedule and cancel the underlying subscription. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property \Stripe\StripeObject[] $phases Configuration for the subscription schedule's phases. - * @property null|int $released_at Time at which the subscription schedule was released. Measured in seconds since the Unix epoch. - * @property null|string $released_subscription ID of the subscription once managed by the subscription schedule (if it is released). - * @property string $status The present status of the subscription schedule. Possible values are not_started, active, completed, released, and canceled. You can read more about the different states in our behavior guide. - * @property null|string|\Stripe\Subscription $subscription ID of the subscription managed by the subscription schedule. - * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this subscription schedule belongs to. - */ -class SubscriptionSchedule extends ApiResource -{ - const OBJECT_NAME = 'subscription_schedule'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const END_BEHAVIOR_CANCEL = 'cancel'; - const END_BEHAVIOR_NONE = 'none'; - const END_BEHAVIOR_RELEASE = 'release'; - const END_BEHAVIOR_RENEW = 'renew'; - const STATUS_ACTIVE = 'active'; - const STATUS_CANCELED = 'canceled'; - const STATUS_COMPLETED = 'completed'; - const STATUS_NOT_STARTED = 'not_started'; - const STATUS_RELEASED = 'released'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule the canceled subscription schedule - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\SubscriptionSchedule the released subscription schedule - */ - public function release($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/release'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Tax/Calculation.php b/dependencies/stripe/stripe-php/lib/Tax/Calculation.php deleted file mode 100644 index 1147744..0000000 --- a/dependencies/stripe/stripe-php/lib/Tax/Calculation.php +++ /dev/null @@ -1,47 +0,0 @@ -Calculate tax in your custom payment flow - * - * @property null|string $id Unique identifier for the calculation. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount_total Total after taxes. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $customer The ID of an existing Customer used for the resource. - * @property \Stripe\StripeObject $customer_details - * @property null|int $expires_at Timestamp of date at which the tax calculation will expire. - * @property null|\Stripe\Collection<\Stripe\Tax\CalculationLineItem> $line_items The list of items the customer is purchasing. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $shipping_cost The shipping cost details for the calculation. - * @property int $tax_amount_exclusive The amount of tax to be collected on top of the line item prices. - * @property int $tax_amount_inclusive The amount of tax already included in the line item prices. - * @property \Stripe\StripeObject[] $tax_breakdown Breakdown of individual tax amounts that add up to the total. - * @property int $tax_date Timestamp of date at which the tax rules and rates in effect applies for the calculation. - */ -class Calculation extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'tax.calculation'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Tax\CalculationLineItem> list of calculation line items - */ - public static function allLineItems($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/line_items'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Tax/CalculationLineItem.php b/dependencies/stripe/stripe-php/lib/Tax/CalculationLineItem.php deleted file mode 100644 index 9f861fd..0000000 --- a/dependencies/stripe/stripe-php/lib/Tax/CalculationLineItem.php +++ /dev/null @@ -1,24 +0,0 @@ -tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. - * @property int $amount_tax The amount of tax calculated for this line item, in integer cents. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $product The ID of an existing Product. - * @property int $quantity The number of units of the item being purchased. For reversals, this is the quantity reversed. - * @property null|string $reference A custom identifier for this line item. - * @property string $tax_behavior Specifies whether the amount includes taxes. If tax_behavior=inclusive, then the amount includes taxes. - * @property null|\Stripe\StripeObject[] $tax_breakdown Detailed account of taxes relevant to this line item. - * @property string $tax_code The tax code ID used for this resource. - */ -class CalculationLineItem extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'tax.calculation_line_item'; - const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; - const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; -} diff --git a/dependencies/stripe/stripe-php/lib/Tax/Settings.php b/dependencies/stripe/stripe-php/lib/Tax/Settings.php deleted file mode 100644 index 3377928..0000000 --- a/dependencies/stripe/stripe-php/lib/Tax/Settings.php +++ /dev/null @@ -1,25 +0,0 @@ -Settings to manage configurations used by Stripe Tax calculations. - * - * Related guide: Using the Settings API - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject $defaults - * @property null|\Stripe\StripeObject $head_office The place where your business is located. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $status The active status indicates you have all required settings to calculate tax. A status can transition out of active when new required settings are introduced. - * @property \Stripe\StripeObject $status_details - */ -class Settings extends \WP_Ultimo\Dependencies\Stripe\SingletonApiResource -{ - const OBJECT_NAME = 'tax.settings'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\SingletonRetrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const STATUS_ACTIVE = 'active'; - const STATUS_PENDING = 'pending'; -} diff --git a/dependencies/stripe/stripe-php/lib/Tax/Transaction.php b/dependencies/stripe/stripe-php/lib/Tax/Transaction.php deleted file mode 100644 index 9fae5f4..0000000 --- a/dependencies/stripe/stripe-php/lib/Tax/Transaction.php +++ /dev/null @@ -1,81 +0,0 @@ -Calculate tax in your custom payment flow - * - * @property string $id Unique identifier for the transaction. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $customer The ID of an existing Customer used for the resource. - * @property \Stripe\StripeObject $customer_details - * @property null|\Stripe\Collection<\Stripe\Tax\TransactionLineItem> $line_items The tax collected or refunded, by line item. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $reference A custom unique identifier, such as 'myOrder_123'. - * @property null|\Stripe\StripeObject $reversal If type=reversal, contains information about what was reversed. - * @property null|\Stripe\StripeObject $shipping_cost The shipping cost details for the transaction. - * @property int $tax_date Timestamp of date at which the tax rules and rates in effect applies for the calculation. - * @property string $type If reversal, this transaction reverses an earlier transaction. - */ -class Transaction extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'tax.transaction'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const TYPE_REVERSAL = 'reversal'; - const TYPE_TRANSACTION = 'transaction'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Transaction the created transaction - */ - public static function createFromCalculation($params = null, $opts = null) - { - $url = static::classUrl() . '/create_from_calculation'; - list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Tax\Transaction the created transaction - */ - public static function createReversal($params = null, $opts = null) - { - $url = static::classUrl() . '/create_reversal'; - list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param string $id - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\Tax\TransactionLineItem> list of transaction line items - */ - public static function allLineItems($id, $params = null, $opts = null) - { - $url = static::resourceUrl($id) . '/line_items'; - list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response->json, $opts); - $obj->setLastResponse($response); - return $obj; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Tax/TransactionLineItem.php b/dependencies/stripe/stripe-php/lib/Tax/TransactionLineItem.php deleted file mode 100644 index 818c938..0000000 --- a/dependencies/stripe/stripe-php/lib/Tax/TransactionLineItem.php +++ /dev/null @@ -1,28 +0,0 @@ -tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. - * @property int $amount_tax The amount of tax calculated for this line item, in integer cents. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $product The ID of an existing Product. - * @property int $quantity The number of units of the item being purchased. For reversals, this is the quantity reversed. - * @property string $reference A custom identifier for this line item in the transaction. - * @property null|\Stripe\StripeObject $reversal If type=reversal, contains information about what was reversed. - * @property string $tax_behavior Specifies whether the amount includes taxes. If tax_behavior=inclusive, then the amount includes taxes. - * @property string $tax_code The tax code ID used for this resource. - * @property string $type If reversal, this line item reverses an earlier transaction. - */ -class TransactionLineItem extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'tax.transaction_line_item'; - const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; - const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; - const TYPE_REVERSAL = 'reversal'; - const TYPE_TRANSACTION = 'transaction'; -} diff --git a/dependencies/stripe/stripe-php/lib/TaxCode.php b/dependencies/stripe/stripe-php/lib/TaxCode.php deleted file mode 100644 index 6b51c3e..0000000 --- a/dependencies/stripe/stripe-php/lib/TaxCode.php +++ /dev/null @@ -1,19 +0,0 @@ -Tax codes classify goods and services for tax purposes. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property string $description A detailed description of which types of products the tax code represents. - * @property string $name A short name for the tax code. - */ -class TaxCode extends ApiResource -{ - const OBJECT_NAME = 'tax_code'; - use ApiOperations\All; - use ApiOperations\Retrieve; -} diff --git a/dependencies/stripe/stripe-php/lib/TaxId.php b/dependencies/stripe/stripe-php/lib/TaxId.php deleted file mode 100644 index b7ecf90..0000000 --- a/dependencies/stripe/stripe-php/lib/TaxId.php +++ /dev/null @@ -1,125 +0,0 @@ -customer. - * A customer's tax IDs are displayed on invoices and credit notes issued for the customer. - * - * Related guide: Customer tax identification numbers - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $country Two-letter ISO code representing the country of the tax ID. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string|\Stripe\Customer $customer ID of the customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $type Type of the tax ID, one of ad_nrt, ae_trn, ar_cuit, au_abn, au_arn, bg_uic, bo_tin, br_cnpj, br_cpf, ca_bn, ca_gst_hst, ca_pst_bc, ca_pst_mb, ca_pst_sk, ca_qst, ch_vat, cl_tin, cn_tin, co_nit, cr_tin, do_rcn, ec_ruc, eg_tin, es_cif, eu_oss_vat, eu_vat, gb_vat, ge_vat, hk_br, hu_tin, id_npwp, il_vat, in_gst, is_vat, jp_cn, jp_rn, jp_trn, ke_pin, kr_brn, li_uid, mx_rfc, my_frp, my_itn, my_sst, no_vat, nz_gst, pe_ruc, ph_tin, ro_tin, rs_pib, ru_inn, ru_kpp, sa_vat, sg_gst, sg_uen, si_tin, sv_nit, th_vat, tr_tin, tw_vat, ua_vat, us_ein, uy_ruc, ve_rif, vn_tin, or za_vat. Note that some legacy tax IDs have type unknown - * @property string $value Value of the tax ID. - * @property null|\Stripe\StripeObject $verification Tax ID verification information. - */ -class TaxId extends ApiResource -{ - const OBJECT_NAME = 'tax_id'; - use ApiOperations\Delete; - const TYPE_AD_NRT = 'ad_nrt'; - const TYPE_AE_TRN = 'ae_trn'; - const TYPE_AR_CUIT = 'ar_cuit'; - const TYPE_AU_ABN = 'au_abn'; - const TYPE_AU_ARN = 'au_arn'; - const TYPE_BG_UIC = 'bg_uic'; - const TYPE_BO_TIN = 'bo_tin'; - const TYPE_BR_CNPJ = 'br_cnpj'; - const TYPE_BR_CPF = 'br_cpf'; - const TYPE_CA_BN = 'ca_bn'; - const TYPE_CA_GST_HST = 'ca_gst_hst'; - const TYPE_CA_PST_BC = 'ca_pst_bc'; - const TYPE_CA_PST_MB = 'ca_pst_mb'; - const TYPE_CA_PST_SK = 'ca_pst_sk'; - const TYPE_CA_QST = 'ca_qst'; - const TYPE_CH_VAT = 'ch_vat'; - const TYPE_CL_TIN = 'cl_tin'; - const TYPE_CN_TIN = 'cn_tin'; - const TYPE_CO_NIT = 'co_nit'; - const TYPE_CR_TIN = 'cr_tin'; - const TYPE_DO_RCN = 'do_rcn'; - const TYPE_EC_RUC = 'ec_ruc'; - const TYPE_EG_TIN = 'eg_tin'; - const TYPE_ES_CIF = 'es_cif'; - const TYPE_EU_OSS_VAT = 'eu_oss_vat'; - const TYPE_EU_VAT = 'eu_vat'; - const TYPE_GB_VAT = 'gb_vat'; - const TYPE_GE_VAT = 'ge_vat'; - const TYPE_HK_BR = 'hk_br'; - const TYPE_HU_TIN = 'hu_tin'; - const TYPE_ID_NPWP = 'id_npwp'; - const TYPE_IL_VAT = 'il_vat'; - const TYPE_IN_GST = 'in_gst'; - const TYPE_IS_VAT = 'is_vat'; - const TYPE_JP_CN = 'jp_cn'; - const TYPE_JP_RN = 'jp_rn'; - const TYPE_JP_TRN = 'jp_trn'; - const TYPE_KE_PIN = 'ke_pin'; - const TYPE_KR_BRN = 'kr_brn'; - const TYPE_LI_UID = 'li_uid'; - const TYPE_MX_RFC = 'mx_rfc'; - const TYPE_MY_FRP = 'my_frp'; - const TYPE_MY_ITN = 'my_itn'; - const TYPE_MY_SST = 'my_sst'; - const TYPE_NO_VAT = 'no_vat'; - const TYPE_NZ_GST = 'nz_gst'; - const TYPE_PE_RUC = 'pe_ruc'; - const TYPE_PH_TIN = 'ph_tin'; - const TYPE_RO_TIN = 'ro_tin'; - const TYPE_RS_PIB = 'rs_pib'; - const TYPE_RU_INN = 'ru_inn'; - const TYPE_RU_KPP = 'ru_kpp'; - const TYPE_SA_VAT = 'sa_vat'; - const TYPE_SG_GST = 'sg_gst'; - const TYPE_SG_UEN = 'sg_uen'; - const TYPE_SI_TIN = 'si_tin'; - const TYPE_SV_NIT = 'sv_nit'; - const TYPE_TH_VAT = 'th_vat'; - const TYPE_TR_TIN = 'tr_tin'; - const TYPE_TW_VAT = 'tw_vat'; - const TYPE_UA_VAT = 'ua_vat'; - const TYPE_UNKNOWN = 'unknown'; - const TYPE_US_EIN = 'us_ein'; - const TYPE_UY_RUC = 'uy_ruc'; - const TYPE_VE_RIF = 've_rif'; - const TYPE_VN_TIN = 'vn_tin'; - const TYPE_ZA_VAT = 'za_vat'; - const VERIFICATION_STATUS_PENDING = 'pending'; - const VERIFICATION_STATUS_UNAVAILABLE = 'unavailable'; - const VERIFICATION_STATUS_UNVERIFIED = 'unverified'; - const VERIFICATION_STATUS_VERIFIED = 'verified'; - /** - * @return string the API URL for this tax id - */ - public function instanceUrl() - { - $id = $this['id']; - $customer = $this['customer']; - if (!$id) { - throw new Exception\UnexpectedValueException("Could not determine which URL to request: class instance has invalid ID: {$id}"); - } - $id = Util\Util::utf8($id); - $customer = Util\Util::utf8($customer); - $base = Customer::classUrl(); - $customerExtn = \urlencode($customer); - $extn = \urlencode($id); - return "{$base}/{$customerExtn}/tax_ids/{$extn}"; - } - /** - * @param array|string $_id - * @param null|array|string $_opts - * - * @throws \Stripe\Exception\BadMethodCallException - */ - public static function retrieve($_id, $_opts = null) - { - $msg = 'Tax IDs cannot be retrieved without a customer ID. Retrieve ' . "a tax ID using `Customer::retrieveTaxId('customer_id', " . "'tax_id_id')`."; - throw new Exception\BadMethodCallException($msg); - } -} diff --git a/dependencies/stripe/stripe-php/lib/TaxRate.php b/dependencies/stripe/stripe-php/lib/TaxRate.php deleted file mode 100644 index b422e59..0000000 --- a/dependencies/stripe/stripe-php/lib/TaxRate.php +++ /dev/null @@ -1,47 +0,0 @@ -invoices, subscriptions and Checkout Sessions to collect tax. - * - * Related guide: Tax rates - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $active Defaults to true. When set to false, this tax rate cannot be used with new applications or Checkout Sessions, but will still work for subscriptions and invoices that already have it set. - * @property null|string $country Two-letter country code (ISO 3166-1 alpha-2). - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $description An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers. - * @property string $display_name The display name of the tax rates as it will appear to your customer on their receipt email, PDF, and the hosted invoice page. - * @property null|float $effective_percentage Actual/effective tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true, this percentage reflects the rate actually used to calculate tax based on the product's taxability and whether the user is registered to collect taxes in the corresponding jurisdiction. - * @property bool $inclusive This specifies if the tax rate is inclusive or exclusive. - * @property null|string $jurisdiction The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property float $percentage Tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true, this percentage includes the statutory tax rate of non-taxable jurisdictions. - * @property null|string $state ISO 3166-2 subdivision code, without country prefix. For example, "NY" for New York, United States. - * @property null|string $tax_type The high-level tax type, such as vat or sales_tax. - */ -class TaxRate extends ApiResource -{ - const OBJECT_NAME = 'tax_rate'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const TAX_TYPE_AMUSEMENT_TAX = 'amusement_tax'; - const TAX_TYPE_COMMUNICATIONS_TAX = 'communications_tax'; - const TAX_TYPE_GST = 'gst'; - const TAX_TYPE_HST = 'hst'; - const TAX_TYPE_IGST = 'igst'; - const TAX_TYPE_JCT = 'jct'; - const TAX_TYPE_LEASE_TAX = 'lease_tax'; - const TAX_TYPE_PST = 'pst'; - const TAX_TYPE_QST = 'qst'; - const TAX_TYPE_RST = 'rst'; - const TAX_TYPE_SALES_TAX = 'sales_tax'; - const TAX_TYPE_SERVICE_TAX = 'service_tax'; - const TAX_TYPE_VAT = 'vat'; -} diff --git a/dependencies/stripe/stripe-php/lib/Terminal/Configuration.php b/dependencies/stripe/stripe-php/lib/Terminal/Configuration.php deleted file mode 100644 index 93369ac..0000000 --- a/dependencies/stripe/stripe-php/lib/Terminal/Configuration.php +++ /dev/null @@ -1,25 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $tipping - * @property null|\Stripe\StripeObject $verifone_p400 - */ -class Configuration extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'terminal.configuration'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Delete; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/Terminal/ConnectionToken.php b/dependencies/stripe/stripe-php/lib/Terminal/ConnectionToken.php deleted file mode 100644 index 99e78d4..0000000 --- a/dependencies/stripe/stripe-php/lib/Terminal/ConnectionToken.php +++ /dev/null @@ -1,19 +0,0 @@ -Fleet management - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $location The id of the location that this connection token is scoped to. Note that location scoping only applies to internet-connected readers. For more details, see the docs on scoping connection tokens. - * @property string $secret Your application should pass this token to the Stripe Terminal SDK. - */ -class ConnectionToken extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'terminal.connection_token'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; -} diff --git a/dependencies/stripe/stripe-php/lib/Terminal/Location.php b/dependencies/stripe/stripe-php/lib/Terminal/Location.php deleted file mode 100644 index 3c39890..0000000 --- a/dependencies/stripe/stripe-php/lib/Terminal/Location.php +++ /dev/null @@ -1,27 +0,0 @@ -Fleet management - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject $address - * @property null|string $configuration_overrides The ID of a configuration that will be used to customize all readers in this location. - * @property string $display_name The display name of the location. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - */ -class Location extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'terminal.location'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Delete; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/Terminal/Reader.php b/dependencies/stripe/stripe-php/lib/Terminal/Reader.php deleted file mode 100644 index fa0dea5..0000000 --- a/dependencies/stripe/stripe-php/lib/Terminal/Reader.php +++ /dev/null @@ -1,113 +0,0 @@ -Connecting to a reader - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $action The most recent action performed by the reader. - * @property null|string $device_sw_version The current software version of the reader. - * @property string $device_type Type of reader, one of bbpos_wisepad3, stripe_m2, bbpos_chipper2x, bbpos_wisepos_e, verifone_P400, or simulated_wisepos_e. - * @property null|string $ip_address The local IP address of the reader. - * @property string $label Custom label given to the reader for easier identification. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string|\Stripe\Terminal\Location $location The location identifier of the reader. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $serial_number Serial number of the reader. - * @property null|string $status The networking status of the reader. - */ -class Reader extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'terminal.reader'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Delete; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const DEVICE_TYPE_BBPOS_CHIPPER2X = 'bbpos_chipper2x'; - const DEVICE_TYPE_BBPOS_WISEPAD3 = 'bbpos_wisepad3'; - const DEVICE_TYPE_BBPOS_WISEPOS_E = 'bbpos_wisepos_e'; - const DEVICE_TYPE_SIMULATED_WISEPOS_E = 'simulated_wisepos_e'; - const DEVICE_TYPE_STRIPE_M2 = 'stripe_m2'; - const DEVICE_TYPE_VERIFONE_P400 = 'verifone_P400'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader the canceled reader - */ - public function cancelAction($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel_action'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader the processed reader - */ - public function processPaymentIntent($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/process_payment_intent'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader the processed reader - */ - public function processSetupIntent($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/process_setup_intent'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader the refunded reader - */ - public function refundPayment($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/refund_payment'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Terminal\Reader the seted reader - */ - public function setReaderDisplay($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/set_reader_display'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/TestHelpers/TestClock.php b/dependencies/stripe/stripe-php/lib/TestHelpers/TestClock.php deleted file mode 100644 index 065f1db..0000000 --- a/dependencies/stripe/stripe-php/lib/TestHelpers/TestClock.php +++ /dev/null @@ -1,45 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|string $name The custom name supplied at creation. - * @property string $status The status of the Test Clock. - */ -class TestClock extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'test_helpers.test_clock'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Delete; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const STATUS_ADVANCING = 'advancing'; - const STATUS_INTERNAL_FAILURE = 'internal_failure'; - const STATUS_READY = 'ready'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TestHelpers\TestClock the advanced test clock - */ - public function advance($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/advance'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Token.php b/dependencies/stripe/stripe-php/lib/Token.php deleted file mode 100644 index 575d9a3..0000000 --- a/dependencies/stripe/stripe-php/lib/Token.php +++ /dev/null @@ -1,47 +0,0 @@ -recommended payments integrations to perform this process - * client-side. This ensures that no sensitive card data touches your server, - * and allows your integration to operate in a PCI-compliant way. - * - * If you cannot use client-side tokenization, you can also create tokens using - * the API with either your publishable or secret API key. Keep in mind that if - * your integration uses this method, you are responsible for any PCI compliance - * that may be required, and you must keep your secret API key safe. Unlike with - * client-side tokenization, your customer's information is not sent directly to - * Stripe, so we cannot determine how it is handled or stored. - * - * Tokens cannot be stored or used more than once. To store card or bank account - * information for later use, you can create Customer - * objects or Custom accounts. Note that - * Radar, our integrated solution for automatic fraud protection, - * performs best with integrations that use client-side tokenization. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\BankAccount $bank_account

      These bank accounts are payment methods on Customer objects.

      On the other hand External Accounts are transfer destinations on Account objects for Custom accounts. They can be bank accounts or debit cards as well, and are documented in the links above.

      Related guide: Bank debits and transfers

      - * @property null|\Stripe\Card $card

      You can store multiple cards on a customer in order to charge the customer later. You can also store multiple debit cards on a recipient in order to transfer to those cards later.

      Related guide: Card payments with Sources

      - * @property null|string $client_ip IP address of the client that generated the token. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $type Type of the token: account, bank_account, card, or pii. - * @property bool $used Whether this token has already been used (tokens can be used only once). - */ -class Token extends ApiResource -{ - const OBJECT_NAME = 'token'; - use ApiOperations\Create; - use ApiOperations\Retrieve; - const TYPE_ACCOUNT = 'account'; - const TYPE_BANK_ACCOUNT = 'bank_account'; - const TYPE_CARD = 'card'; - const TYPE_PII = 'pii'; -} diff --git a/dependencies/stripe/stripe-php/lib/Topup.php b/dependencies/stripe/stripe-php/lib/Topup.php deleted file mode 100644 index af725c5..0000000 --- a/dependencies/stripe/stripe-php/lib/Topup.php +++ /dev/null @@ -1,57 +0,0 @@ -Topping up your platform account - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount transferred. - * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction that describes the impact of this top-up on your account balance. May not be specified depending on status of top-up. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|int $expected_availability_date Date the funds are expected to arrive in your Stripe account for payouts. This factors in delays like weekends or bank holidays. May not be specified depending on status of top-up. - * @property null|string $failure_code Error code explaining reason for top-up failure if available (see the errors section for a list of codes). - * @property null|string $failure_message Message to user further explaining reason for top-up failure if available. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\Source $source For most Stripe users, the source of every top-up is a bank account. This hash is then the source object describing that bank account. - * @property null|string $statement_descriptor Extra information about a top-up. This will appear on your source's bank statement. It must contain at least one letter. - * @property string $status The status of the top-up is either canceled, failed, pending, reversed, or succeeded. - * @property null|string $transfer_group A string that identifies this top-up as part of a group. - */ -class Topup extends ApiResource -{ - const OBJECT_NAME = 'topup'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const STATUS_CANCELED = 'canceled'; - const STATUS_FAILED = 'failed'; - const STATUS_PENDING = 'pending'; - const STATUS_REVERSED = 'reversed'; - const STATUS_SUCCEEDED = 'succeeded'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Topup the canceled topup - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Transfer.php b/dependencies/stripe/stripe-php/lib/Transfer.php deleted file mode 100644 index b014a03..0000000 --- a/dependencies/stripe/stripe-php/lib/Transfer.php +++ /dev/null @@ -1,102 +0,0 @@ -Transfer object is created when you move funds between Stripe accounts as - * part of Connect. - * - * Before April 6, 2017, transfers also represented movement of funds from a - * Stripe account to a card or bank account. This behavior has since been split - * out into a Payout object, with corresponding payout endpoints. For more - * information, read about the - * transfer/payout split. - * - * Related guide: Creating separate charges and transfers - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount in cents (or local equivalent) to be transferred. - * @property int $amount_reversed Amount in cents (or local equivalent) reversed (can be less than the amount attribute on the transfer if a partial reversal was issued). - * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact of this transfer on your account balance. - * @property int $created Time that this record of the transfer was first created. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string|\Stripe\Account $destination ID of the Stripe account the transfer was sent to. - * @property null|string|\Stripe\Charge $destination_payment If the destination is a Stripe account, this will be the ID of the payment that the destination account received for the transfer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property \Stripe\Collection<\Stripe\TransferReversal> $reversals A list of reversals that have been applied to the transfer. - * @property bool $reversed Whether the transfer has been fully reversed. If the transfer is only partially reversed, this attribute will still be false. - * @property null|string|\Stripe\Charge $source_transaction ID of the charge or payment that was used to fund the transfer. If null, the transfer was funded from the available balance. - * @property null|string $source_type The source balance this transfer came from. One of card, fpx, or bank_account. - * @property null|string $transfer_group A string that identifies this transaction as part of a group. See the Connect documentation for details. - */ -class Transfer extends ApiResource -{ - const OBJECT_NAME = 'transfer'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\NestedResource; - use ApiOperations\Retrieve; - use ApiOperations\Update; - const SOURCE_TYPE_BANK_ACCOUNT = 'bank_account'; - const SOURCE_TYPE_CARD = 'card'; - const SOURCE_TYPE_FPX = 'fpx'; - const PATH_REVERSALS = '/reversals'; - /** - * @param string $id the ID of the transfer on which to retrieve the transfer reversals - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Collection<\Stripe\TransferReversal> the list of transfer reversals - */ - public static function allReversals($id, $params = null, $opts = null) - { - return self::_allNestedResources($id, static::PATH_REVERSALS, $params, $opts); - } - /** - * @param string $id the ID of the transfer on which to create the transfer reversal - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TransferReversal - */ - public static function createReversal($id, $params = null, $opts = null) - { - return self::_createNestedResource($id, static::PATH_REVERSALS, $params, $opts); - } - /** - * @param string $id the ID of the transfer to which the transfer reversal belongs - * @param string $reversalId the ID of the transfer reversal to retrieve - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TransferReversal - */ - public static function retrieveReversal($id, $reversalId, $params = null, $opts = null) - { - return self::_retrieveNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts); - } - /** - * @param string $id the ID of the transfer to which the transfer reversal belongs - * @param string $reversalId the ID of the transfer reversal to update - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\TransferReversal - */ - public static function updateReversal($id, $reversalId, $params = null, $opts = null) - { - return self::_updateNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/TransferReversal.php b/dependencies/stripe/stripe-php/lib/TransferReversal.php deleted file mode 100644 index fd9324a..0000000 --- a/dependencies/stripe/stripe-php/lib/TransferReversal.php +++ /dev/null @@ -1,66 +0,0 @@ -Stripe Connect platforms can reverse transfers made to a - * connected account, either entirely or partially, and can also specify whether - * to refund any related application fees. Transfer reversals add to the - * platform's balance and subtract from the destination account's balance. - * - * Reversing a transfer that was made for a destination - * charge is allowed only up to the amount of - * the charge. It is possible to reverse a - * transfer_group - * transfer only if the destination account has enough balance to cover the - * reversal. - * - * Related guide: Reversing transfers - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount, in cents (or local equivalent). - * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact on your account balance. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string|\Stripe\Refund $destination_payment_refund Linked payment refund for the transfer reversal. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string|\Stripe\Refund $source_refund ID of the refund responsible for the transfer reversal. - * @property string|\Stripe\Transfer $transfer ID of the transfer that was reversed. - */ -class TransferReversal extends ApiResource -{ - const OBJECT_NAME = 'transfer_reversal'; - use ApiOperations\Update { - save as protected _save; - } - /** - * @return string the API URL for this Stripe transfer reversal - */ - public function instanceUrl() - { - $id = $this['id']; - $transfer = $this['transfer']; - if (!$id) { - throw new Exception\UnexpectedValueException('Could not determine which URL to request: ' . "class instance has invalid ID: {$id}", null); - } - $id = Util\Util::utf8($id); - $transfer = Util\Util::utf8($transfer); - $base = Transfer::classUrl(); - $transferExtn = \urlencode($transfer); - $extn = \urlencode($id); - return "{$base}/{$transferExtn}/reversals/{$extn}"; - } - /** - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return TransferReversal the saved reversal - */ - public function save($opts = null) - { - return $this->_save($opts); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/CreditReversal.php b/dependencies/stripe/stripe-php/lib/Treasury/CreditReversal.php deleted file mode 100644 index f7e038f..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/CreditReversal.php +++ /dev/null @@ -1,35 +0,0 @@ -ReceivedCredits depending on their network and source flow. Reversing a ReceivedCredit leads to the creation of a new object known as a CreditReversal. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string $financial_account The FinancialAccount to reverse funds from. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $network The rails used to reverse the funds. - * @property string $received_credit The ReceivedCredit being reversed. - * @property string $status Status of the CreditReversal - * @property \Stripe\StripeObject $status_transitions - * @property null|string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class CreditReversal extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.credit_reversal'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const NETWORK_ACH = 'ach'; - const NETWORK_STRIPE = 'stripe'; - const STATUS_CANCELED = 'canceled'; - const STATUS_POSTED = 'posted'; - const STATUS_PROCESSING = 'processing'; -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/DebitReversal.php b/dependencies/stripe/stripe-php/lib/Treasury/DebitReversal.php deleted file mode 100644 index 6ad8afe..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/DebitReversal.php +++ /dev/null @@ -1,36 +0,0 @@ -ReceivedDebits depending on their network and source flow. Reversing a ReceivedDebit leads to the creation of a new object known as a DebitReversal. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $financial_account The FinancialAccount to reverse funds from. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property null|\Stripe\StripeObject $linked_flows Other flows linked to a DebitReversal. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $network The rails used to reverse the funds. - * @property string $received_debit The ReceivedDebit being reversed. - * @property string $status Status of the DebitReversal - * @property \Stripe\StripeObject $status_transitions - * @property null|string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class DebitReversal extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.debit_reversal'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const NETWORK_ACH = 'ach'; - const NETWORK_CARD = 'card'; - const STATUS_FAILED = 'failed'; - const STATUS_PROCESSING = 'processing'; - const STATUS_SUCCEEDED = 'succeeded'; -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/FinancialAccount.php b/dependencies/stripe/stripe-php/lib/Treasury/FinancialAccount.php deleted file mode 100644 index 5c79ddf..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/FinancialAccount.php +++ /dev/null @@ -1,67 +0,0 @@ -ISO 3166-1 alpha-2). - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|\Stripe\Treasury\FinancialAccountFeatures $features Encodes whether a FinancialAccount has access to a particular Feature, with a status enum and associated status_details. Stripe or the platform can control Features via the requested field. - * @property \Stripe\StripeObject[] $financial_addresses The set of credentials that resolve to a FinancialAccount. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string[] $pending_features The array of paths to pending Features in the Features hash. - * @property null|\Stripe\StripeObject $platform_restrictions The set of functionalities that the platform can restrict on the FinancialAccount. - * @property null|string[] $restricted_features The array of paths to restricted Features in the Features hash. - * @property string $status The enum specifying what state the account is in. - * @property \Stripe\StripeObject $status_details - * @property string[] $supported_currencies The currencies the FinancialAccount can hold a balance in. Three-letter ISO currency code, in lowercase. - */ -class FinancialAccount extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.financial_account'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Update; - const STATUS_CLOSED = 'closed'; - const STATUS_OPEN = 'open'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccountFeatures the retrieved financial account features - */ - public function retrieveFeatures($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/features'; - list($response, $opts) = $this->_request('get', $url, $params, $opts); - $obj = \WP_Ultimo\Dependencies\Stripe\Util\Util::convertToStripeObject($response, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\FinancialAccountFeatures the updated financial account features - */ - public function updateFeatures($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/features'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php b/dependencies/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php deleted file mode 100644 index eb8c06b..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/FinancialAccountFeatures.php +++ /dev/null @@ -1,22 +0,0 @@ -status enum and associated status_details. - * Stripe or the platform can control Features via the requested field. - * - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|\Stripe\StripeObject $card_issuing Toggle settings for enabling/disabling a feature - * @property null|\Stripe\StripeObject $deposit_insurance Toggle settings for enabling/disabling a feature - * @property null|\Stripe\StripeObject $financial_addresses Settings related to Financial Addresses features on a Financial Account - * @property null|\Stripe\StripeObject $inbound_transfers InboundTransfers contains inbound transfers features for a FinancialAccount. - * @property null|\Stripe\StripeObject $intra_stripe_flows Toggle settings for enabling/disabling a feature - * @property null|\Stripe\StripeObject $outbound_payments Settings related to Outbound Payments features on a Financial Account - * @property null|\Stripe\StripeObject $outbound_transfers OutboundTransfers contains outbound transfers features for a FinancialAccount. - */ -class FinancialAccountFeatures extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.financial_account_features'; -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/InboundTransfer.php b/dependencies/stripe/stripe-php/lib/Treasury/InboundTransfer.php deleted file mode 100644 index 4f39ee5..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/InboundTransfer.php +++ /dev/null @@ -1,55 +0,0 @@ -InboundTransfers to add funds to your FinancialAccount via a PaymentMethod that is owned by you. The funds will be transferred via an ACH debit. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property bool $cancelable Returns true if the InboundTransfer is able to be canceled. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|\Stripe\StripeObject $failure_details Details about this InboundTransfer's failure. Only set when status is failed. - * @property string $financial_account The FinancialAccount that received the funds. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property \Stripe\StripeObject $linked_flows - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property string $origin_payment_method The origin payment method to be debited for an InboundTransfer. - * @property null|\Stripe\StripeObject $origin_payment_method_details Details about the PaymentMethod for an InboundTransfer. - * @property null|bool $returned Returns true if the funds for an InboundTransfer were returned after the InboundTransfer went to the succeeded state. - * @property string $statement_descriptor Statement descriptor shown when funds are debited from the source. Not all payment networks support statement_descriptor. - * @property string $status Status of the InboundTransfer: processing, succeeded, failed, and canceled. An InboundTransfer is processing if it is created and pending. The status changes to succeeded once the funds have been "confirmed" and a transaction is created and posted. The status changes to failed if the transfer fails. - * @property \Stripe\StripeObject $status_transitions - * @property null|string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class InboundTransfer extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.inbound_transfer'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const STATUS_CANCELED = 'canceled'; - const STATUS_FAILED = 'failed'; - const STATUS_PROCESSING = 'processing'; - const STATUS_SUCCEEDED = 'succeeded'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\InboundTransfer the canceled inbound transfer - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/OutboundPayment.php b/dependencies/stripe/stripe-php/lib/Treasury/OutboundPayment.php deleted file mode 100644 index 54e7210..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/OutboundPayment.php +++ /dev/null @@ -1,59 +0,0 @@ -FinancialAccount. To send money to an account belonging to the same user, use an OutboundTransfer. - * - * Simulate OutboundPayment state changes with the /v1/test_helpers/treasury/outbound_payments endpoints. These methods can only be called on test mode objects. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property bool $cancelable Returns true if the object can be canceled, and false otherwise. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $customer ID of the customer to whom an OutboundPayment is sent. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string $destination_payment_method The PaymentMethod via which an OutboundPayment is sent. This field can be empty if the OutboundPayment was created using destination_payment_method_data. - * @property null|\Stripe\StripeObject $destination_payment_method_details Details about the PaymentMethod for an OutboundPayment. - * @property null|\Stripe\StripeObject $end_user_details Details about the end user. - * @property int $expected_arrival_date The date when funds are expected to arrive in the destination account. - * @property string $financial_account The FinancialAccount that funds were pulled from. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $returned_details Details about a returned OutboundPayment. Only set when the status is returned. - * @property string $statement_descriptor The description that appears on the receiving end for an OutboundPayment (for example, bank statement for external bank transfer). - * @property string $status Current status of the OutboundPayment: processing, failed, posted, returned, canceled. An OutboundPayment is processing if it has been created and is pending. The status changes to posted once the OutboundPayment has been "confirmed" and funds have left the account, or to failed or canceled. If an OutboundPayment fails to arrive at its destination, its status will change to returned. - * @property \Stripe\StripeObject $status_transitions - * @property string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class OutboundPayment extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.outbound_payment'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const STATUS_CANCELED = 'canceled'; - const STATUS_FAILED = 'failed'; - const STATUS_POSTED = 'posted'; - const STATUS_PROCESSING = 'processing'; - const STATUS_RETURNED = 'returned'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundPayment the canceled outbound payment - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/OutboundTransfer.php b/dependencies/stripe/stripe-php/lib/Treasury/OutboundTransfer.php deleted file mode 100644 index 00e9ec8..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/OutboundTransfer.php +++ /dev/null @@ -1,57 +0,0 @@ -FinancialAccount to a PaymentMethod belonging to the same entity. To send funds to a different party, use OutboundPayments instead. You can send funds over ACH rails or through a domestic wire transfer to a user's own external bank account. - * - * Simulate OutboundTransfer state changes with the /v1/test_helpers/treasury/outbound_transfers endpoints. These methods can only be called on test mode objects. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property bool $cancelable Returns true if the object can be canceled, and false otherwise. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string $destination_payment_method The PaymentMethod used as the payment instrument for an OutboundTransfer. - * @property \Stripe\StripeObject $destination_payment_method_details - * @property int $expected_arrival_date The date when funds are expected to arrive in the destination account. - * @property string $financial_account The FinancialAccount that funds were pulled from. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|\Stripe\StripeObject $returned_details Details about a returned OutboundTransfer. Only set when the status is returned. - * @property string $statement_descriptor Information about the OutboundTransfer to be sent to the recipient account. - * @property string $status Current status of the OutboundTransfer: processing, failed, canceled, posted, returned. An OutboundTransfer is processing if it has been created and is pending. The status changes to posted once the OutboundTransfer has been "confirmed" and funds have left the account, or to failed or canceled. If an OutboundTransfer fails to arrive at its destination, its status will change to returned. - * @property \Stripe\StripeObject $status_transitions - * @property string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class OutboundTransfer extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.outbound_transfer'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Create; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const STATUS_CANCELED = 'canceled'; - const STATUS_FAILED = 'failed'; - const STATUS_POSTED = 'posted'; - const STATUS_PROCESSING = 'processing'; - const STATUS_RETURNED = 'returned'; - /** - * @param null|array $params - * @param null|array|string $opts - * - * @throws \Stripe\Exception\ApiErrorException if the request fails - * - * @return \Stripe\Treasury\OutboundTransfer the canceled outbound transfer - */ - public function cancel($params = null, $opts = null) - { - $url = $this->instanceUrl() . '/cancel'; - list($response, $opts) = $this->_request('post', $url, $params, $opts); - $this->refreshFrom($response, $opts); - return $this; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/ReceivedCredit.php b/dependencies/stripe/stripe-php/lib/Treasury/ReceivedCredit.php deleted file mode 100644 index ff0839a..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/ReceivedCredit.php +++ /dev/null @@ -1,40 +0,0 @@ -FinancialAccount (for example, via ACH or wire). These money movements are not initiated from the FinancialAccount. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string $failure_code Reason for the failure. A ReceivedCredit might fail because the receiving FinancialAccount is closed or frozen. - * @property null|string $financial_account The FinancialAccount that received the funds. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property \Stripe\StripeObject $initiating_payment_method_details - * @property \Stripe\StripeObject $linked_flows - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $network The rails used to send the funds. - * @property null|\Stripe\StripeObject $reversal_details Details describing when a ReceivedCredit may be reversed. - * @property string $status Status of the ReceivedCredit. ReceivedCredits are created either succeeded (approved) or failed (declined). If a ReceivedCredit is declined, the failure reason can be found in the failure_code field. - * @property null|string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class ReceivedCredit extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.received_credit'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const FAILURE_CODE_ACCOUNT_CLOSED = 'account_closed'; - const FAILURE_CODE_ACCOUNT_FROZEN = 'account_frozen'; - const FAILURE_CODE_OTHER = 'other'; - const NETWORK_ACH = 'ach'; - const NETWORK_CARD = 'card'; - const NETWORK_STRIPE = 'stripe'; - const NETWORK_US_DOMESTIC_WIRE = 'us_domestic_wire'; - const STATUS_FAILED = 'failed'; - const STATUS_SUCCEEDED = 'succeeded'; -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/ReceivedDebit.php b/dependencies/stripe/stripe-php/lib/Treasury/ReceivedDebit.php deleted file mode 100644 index fb5caef..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/ReceivedDebit.php +++ /dev/null @@ -1,40 +0,0 @@ -FinancialAccount. These are not initiated from the FinancialAccount. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|string $failure_code Reason for the failure. A ReceivedDebit might fail because the FinancialAccount doesn't have sufficient funds, is closed, or is frozen. - * @property null|string $financial_account The FinancialAccount that funds were pulled from. - * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property null|\Stripe\StripeObject $initiating_payment_method_details - * @property \Stripe\StripeObject $linked_flows - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $network The network used for the ReceivedDebit. - * @property null|\Stripe\StripeObject $reversal_details Details describing when a ReceivedDebit might be reversed. - * @property string $status Status of the ReceivedDebit. ReceivedDebits are created with a status of either succeeded (approved) or failed (declined). The failure reason can be found under the failure_code. - * @property null|string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - */ -class ReceivedDebit extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.received_debit'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const FAILURE_CODE_ACCOUNT_CLOSED = 'account_closed'; - const FAILURE_CODE_ACCOUNT_FROZEN = 'account_frozen'; - const FAILURE_CODE_INSUFFICIENT_FUNDS = 'insufficient_funds'; - const FAILURE_CODE_OTHER = 'other'; - const NETWORK_ACH = 'ach'; - const NETWORK_CARD = 'card'; - const NETWORK_STRIPE = 'stripe'; - const STATUS_FAILED = 'failed'; - const STATUS_SUCCEEDED = 'succeeded'; -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/Transaction.php b/dependencies/stripe/stripe-php/lib/Treasury/Transaction.php deleted file mode 100644 index 9c3e518..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/Transaction.php +++ /dev/null @@ -1,42 +0,0 @@ -FinancialAccount's balance. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount Amount (in cents) transferred. - * @property \Stripe\StripeObject $balance_impact Change to a FinancialAccount's balance - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property null|\Stripe\Collection<\Stripe\Treasury\TransactionEntry> $entries A list of TransactionEntries that are part of this Transaction. This cannot be expanded in any list endpoints. - * @property string $financial_account The FinancialAccount associated with this object. - * @property null|string $flow ID of the flow that created the Transaction. - * @property null|\Stripe\StripeObject $flow_details Details of the flow that created the Transaction. - * @property string $flow_type Type of the flow that created the Transaction. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string $status Status of the Transaction. - * @property \Stripe\StripeObject $status_transitions - */ -class Transaction extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.transaction'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const FLOW_TYPE_CREDIT_REVERSAL = 'credit_reversal'; - const FLOW_TYPE_DEBIT_REVERSAL = 'debit_reversal'; - const FLOW_TYPE_INBOUND_TRANSFER = 'inbound_transfer'; - const FLOW_TYPE_ISSUING_AUTHORIZATION = 'issuing_authorization'; - const FLOW_TYPE_OTHER = 'other'; - const FLOW_TYPE_OUTBOUND_PAYMENT = 'outbound_payment'; - const FLOW_TYPE_OUTBOUND_TRANSFER = 'outbound_transfer'; - const FLOW_TYPE_RECEIVED_CREDIT = 'received_credit'; - const FLOW_TYPE_RECEIVED_DEBIT = 'received_debit'; - const STATUS_OPEN = 'open'; - const STATUS_POSTED = 'posted'; - const STATUS_VOID = 'void'; -} diff --git a/dependencies/stripe/stripe-php/lib/Treasury/TransactionEntry.php b/dependencies/stripe/stripe-php/lib/Treasury/TransactionEntry.php deleted file mode 100644 index fa8c6fb..0000000 --- a/dependencies/stripe/stripe-php/lib/Treasury/TransactionEntry.php +++ /dev/null @@ -1,57 +0,0 @@ -Transaction. - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property \Stripe\StripeObject $balance_impact Change to a FinancialAccount's balance - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property int $effective_at When the TransactionEntry will impact the FinancialAccount's balance. - * @property string $financial_account The FinancialAccount associated with this object. - * @property null|string $flow Token of the flow associated with the TransactionEntry. - * @property null|\Stripe\StripeObject $flow_details Details of the flow associated with the TransactionEntry. - * @property string $flow_type Type of the flow associated with the TransactionEntry. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property string|\Stripe\Treasury\Transaction $transaction The Transaction associated with this object. - * @property string $type The specific money movement that generated the TransactionEntry. - */ -class TransactionEntry extends \WP_Ultimo\Dependencies\Stripe\ApiResource -{ - const OBJECT_NAME = 'treasury.transaction_entry'; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\All; - use \WP_Ultimo\Dependencies\Stripe\ApiOperations\Retrieve; - const FLOW_TYPE_CREDIT_REVERSAL = 'credit_reversal'; - const FLOW_TYPE_DEBIT_REVERSAL = 'debit_reversal'; - const FLOW_TYPE_INBOUND_TRANSFER = 'inbound_transfer'; - const FLOW_TYPE_ISSUING_AUTHORIZATION = 'issuing_authorization'; - const FLOW_TYPE_OTHER = 'other'; - const FLOW_TYPE_OUTBOUND_PAYMENT = 'outbound_payment'; - const FLOW_TYPE_OUTBOUND_TRANSFER = 'outbound_transfer'; - const FLOW_TYPE_RECEIVED_CREDIT = 'received_credit'; - const FLOW_TYPE_RECEIVED_DEBIT = 'received_debit'; - const TYPE_CREDIT_REVERSAL = 'credit_reversal'; - const TYPE_CREDIT_REVERSAL_POSTING = 'credit_reversal_posting'; - const TYPE_DEBIT_REVERSAL = 'debit_reversal'; - const TYPE_INBOUND_TRANSFER = 'inbound_transfer'; - const TYPE_INBOUND_TRANSFER_RETURN = 'inbound_transfer_return'; - const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold'; - const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release'; - const TYPE_OTHER = 'other'; - const TYPE_OUTBOUND_PAYMENT = 'outbound_payment'; - const TYPE_OUTBOUND_PAYMENT_CANCELLATION = 'outbound_payment_cancellation'; - const TYPE_OUTBOUND_PAYMENT_FAILURE = 'outbound_payment_failure'; - const TYPE_OUTBOUND_PAYMENT_POSTING = 'outbound_payment_posting'; - const TYPE_OUTBOUND_PAYMENT_RETURN = 'outbound_payment_return'; - const TYPE_OUTBOUND_TRANSFER = 'outbound_transfer'; - const TYPE_OUTBOUND_TRANSFER_CANCELLATION = 'outbound_transfer_cancellation'; - const TYPE_OUTBOUND_TRANSFER_FAILURE = 'outbound_transfer_failure'; - const TYPE_OUTBOUND_TRANSFER_POSTING = 'outbound_transfer_posting'; - const TYPE_OUTBOUND_TRANSFER_RETURN = 'outbound_transfer_return'; - const TYPE_RECEIVED_CREDIT = 'received_credit'; - const TYPE_RECEIVED_DEBIT = 'received_debit'; -} diff --git a/dependencies/stripe/stripe-php/lib/UsageRecord.php b/dependencies/stripe/stripe-php/lib/UsageRecord.php deleted file mode 100644 index 1bdcbf7..0000000 --- a/dependencies/stripe/stripe-php/lib/UsageRecord.php +++ /dev/null @@ -1,22 +0,0 @@ -Metered billing - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property int $quantity The usage quantity for the specified date. - * @property string $subscription_item The ID of the subscription item this usage record contains data for. - * @property int $timestamp The timestamp when this usage occurred. - */ -class UsageRecord extends ApiResource -{ - const OBJECT_NAME = 'usage_record'; -} diff --git a/dependencies/stripe/stripe-php/lib/UsageRecordSummary.php b/dependencies/stripe/stripe-php/lib/UsageRecordSummary.php deleted file mode 100644 index 7d039d2..0000000 --- a/dependencies/stripe/stripe-php/lib/UsageRecordSummary.php +++ /dev/null @@ -1,18 +0,0 @@ -true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $period - * @property string $subscription_item The ID of the subscription item this summary is describing. - * @property int $total_usage The total usage within this usage period. - */ -class UsageRecordSummary extends ApiResource -{ - const OBJECT_NAME = 'usage_record_summary'; -} diff --git a/dependencies/stripe/stripe-php/lib/Util/ApiVersion.php b/dependencies/stripe/stripe-php/lib/Util/ApiVersion.php deleted file mode 100644 index 5b2cc64..0000000 --- a/dependencies/stripe/stripe-php/lib/Util/ApiVersion.php +++ /dev/null @@ -1,9 +0,0 @@ -container = \array_change_key_case($initial_array, \CASE_LOWER); - } - /** - * @return int - */ - #[\ReturnTypeWillChange] - public function count() - { - return \count($this->container); - } - /** - * @return \ArrayIterator - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->container); - } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetSet($offset, $value) - { - $offset = self::maybeLowercase($offset); - if (null === $offset) { - $this->container[] = $value; - } else { - $this->container[$offset] = $value; - } - } - /** - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists($offset) - { - $offset = self::maybeLowercase($offset); - return isset($this->container[$offset]); - } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetUnset($offset) - { - $offset = self::maybeLowercase($offset); - unset($this->container[$offset]); - } - /** - * @return mixed - */ - #[\ReturnTypeWillChange] - public function offsetGet($offset) - { - $offset = self::maybeLowercase($offset); - return isset($this->container[$offset]) ? $this->container[$offset] : null; - } - private static function maybeLowercase($v) - { - if (\is_string($v)) { - return \strtolower($v); - } - return $v; - } -} diff --git a/dependencies/stripe/stripe-php/lib/Util/DefaultLogger.php b/dependencies/stripe/stripe-php/lib/Util/DefaultLogger.php deleted file mode 100644 index 7d4bfaf..0000000 --- a/dependencies/stripe/stripe-php/lib/Util/DefaultLogger.php +++ /dev/null @@ -1,26 +0,0 @@ - 0) { - throw new \WP_Ultimo\Dependencies\Stripe\Exception\BadMethodCallException('DefaultLogger does not currently implement context. Please implement if you need it.'); - } - if (null === $this->destination) { - \error_log($message, $this->messageType); - } else { - \error_log($message, $this->messageType, $this->destination); - } - } -} diff --git a/dependencies/stripe/stripe-php/lib/Util/LoggerInterface.php b/dependencies/stripe/stripe-php/lib/Util/LoggerInterface.php deleted file mode 100644 index 332bc75..0000000 --- a/dependencies/stripe/stripe-php/lib/Util/LoggerInterface.php +++ /dev/null @@ -1,34 +0,0 @@ - \WP_Ultimo\Dependencies\Stripe\Account::class, \WP_Ultimo\Dependencies\Stripe\AccountLink::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\AccountLink::class, \WP_Ultimo\Dependencies\Stripe\ApplePayDomain::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\ApplePayDomain::class, \WP_Ultimo\Dependencies\Stripe\ApplicationFee::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\ApplicationFee::class, \WP_Ultimo\Dependencies\Stripe\ApplicationFeeRefund::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\ApplicationFeeRefund::class, \WP_Ultimo\Dependencies\Stripe\Apps\Secret::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Apps\Secret::class, \WP_Ultimo\Dependencies\Stripe\Balance::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Balance::class, \WP_Ultimo\Dependencies\Stripe\BalanceTransaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\BalanceTransaction::class, \WP_Ultimo\Dependencies\Stripe\BankAccount::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\BankAccount::class, \WP_Ultimo\Dependencies\Stripe\BillingPortal\Configuration::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\BillingPortal\Configuration::class, \WP_Ultimo\Dependencies\Stripe\BillingPortal\Session::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\BillingPortal\Session::class, \WP_Ultimo\Dependencies\Stripe\Capability::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Capability::class, \WP_Ultimo\Dependencies\Stripe\Card::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Card::class, \WP_Ultimo\Dependencies\Stripe\CashBalance::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\CashBalance::class, \WP_Ultimo\Dependencies\Stripe\Charge::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Charge::class, \WP_Ultimo\Dependencies\Stripe\Checkout\Session::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Checkout\Session::class, \WP_Ultimo\Dependencies\Stripe\Collection::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Collection::class, \WP_Ultimo\Dependencies\Stripe\CountrySpec::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\CountrySpec::class, \WP_Ultimo\Dependencies\Stripe\Coupon::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Coupon::class, \WP_Ultimo\Dependencies\Stripe\CreditNote::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\CreditNote::class, \WP_Ultimo\Dependencies\Stripe\CreditNoteLineItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\CreditNoteLineItem::class, \WP_Ultimo\Dependencies\Stripe\Customer::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Customer::class, \WP_Ultimo\Dependencies\Stripe\CustomerBalanceTransaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\CustomerBalanceTransaction::class, \WP_Ultimo\Dependencies\Stripe\CustomerCashBalanceTransaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\CustomerCashBalanceTransaction::class, \WP_Ultimo\Dependencies\Stripe\Discount::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Discount::class, \WP_Ultimo\Dependencies\Stripe\Dispute::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Dispute::class, \WP_Ultimo\Dependencies\Stripe\EphemeralKey::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\EphemeralKey::class, \WP_Ultimo\Dependencies\Stripe\Event::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Event::class, \WP_Ultimo\Dependencies\Stripe\ExchangeRate::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\ExchangeRate::class, \WP_Ultimo\Dependencies\Stripe\File::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\File::class, \WP_Ultimo\Dependencies\Stripe\File::OBJECT_NAME_ALT => \WP_Ultimo\Dependencies\Stripe\File::class, \WP_Ultimo\Dependencies\Stripe\FileLink::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\FileLink::class, \WP_Ultimo\Dependencies\Stripe\FinancialConnections\Account::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\FinancialConnections\Account::class, \WP_Ultimo\Dependencies\Stripe\FinancialConnections\AccountOwner::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\FinancialConnections\AccountOwner::class, \WP_Ultimo\Dependencies\Stripe\FinancialConnections\AccountOwnership::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\FinancialConnections\AccountOwnership::class, \WP_Ultimo\Dependencies\Stripe\FinancialConnections\Session::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\FinancialConnections\Session::class, \WP_Ultimo\Dependencies\Stripe\FundingInstructions::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\FundingInstructions::class, \WP_Ultimo\Dependencies\Stripe\Identity\VerificationReport::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Identity\VerificationReport::class, \WP_Ultimo\Dependencies\Stripe\Identity\VerificationSession::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Identity\VerificationSession::class, \WP_Ultimo\Dependencies\Stripe\Invoice::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Invoice::class, \WP_Ultimo\Dependencies\Stripe\InvoiceItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\InvoiceItem::class, \WP_Ultimo\Dependencies\Stripe\InvoiceLineItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\InvoiceLineItem::class, \WP_Ultimo\Dependencies\Stripe\Issuing\Authorization::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Issuing\Authorization::class, \WP_Ultimo\Dependencies\Stripe\Issuing\Card::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Issuing\Card::class, \WP_Ultimo\Dependencies\Stripe\Issuing\CardDetails::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Issuing\CardDetails::class, \WP_Ultimo\Dependencies\Stripe\Issuing\Cardholder::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Issuing\Cardholder::class, \WP_Ultimo\Dependencies\Stripe\Issuing\Dispute::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Issuing\Dispute::class, \WP_Ultimo\Dependencies\Stripe\Issuing\Transaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Issuing\Transaction::class, \WP_Ultimo\Dependencies\Stripe\LineItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\LineItem::class, \WP_Ultimo\Dependencies\Stripe\LoginLink::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\LoginLink::class, \WP_Ultimo\Dependencies\Stripe\Mandate::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Mandate::class, \WP_Ultimo\Dependencies\Stripe\PaymentIntent::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\PaymentIntent::class, \WP_Ultimo\Dependencies\Stripe\PaymentLink::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\PaymentLink::class, \WP_Ultimo\Dependencies\Stripe\PaymentMethod::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\PaymentMethod::class, \WP_Ultimo\Dependencies\Stripe\Payout::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Payout::class, \WP_Ultimo\Dependencies\Stripe\Person::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Person::class, \WP_Ultimo\Dependencies\Stripe\Plan::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Plan::class, \WP_Ultimo\Dependencies\Stripe\Price::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Price::class, \WP_Ultimo\Dependencies\Stripe\Product::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Product::class, \WP_Ultimo\Dependencies\Stripe\PromotionCode::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\PromotionCode::class, \WP_Ultimo\Dependencies\Stripe\Quote::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Quote::class, \WP_Ultimo\Dependencies\Stripe\Radar\EarlyFraudWarning::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Radar\EarlyFraudWarning::class, \WP_Ultimo\Dependencies\Stripe\Radar\ValueList::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Radar\ValueList::class, \WP_Ultimo\Dependencies\Stripe\Radar\ValueListItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Radar\ValueListItem::class, \WP_Ultimo\Dependencies\Stripe\Refund::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Refund::class, \WP_Ultimo\Dependencies\Stripe\Reporting\ReportRun::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Reporting\ReportRun::class, \WP_Ultimo\Dependencies\Stripe\Reporting\ReportType::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Reporting\ReportType::class, \WP_Ultimo\Dependencies\Stripe\Review::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Review::class, \WP_Ultimo\Dependencies\Stripe\SearchResult::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\SearchResult::class, \WP_Ultimo\Dependencies\Stripe\SetupAttempt::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\SetupAttempt::class, \WP_Ultimo\Dependencies\Stripe\SetupIntent::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\SetupIntent::class, \WP_Ultimo\Dependencies\Stripe\ShippingRate::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\ShippingRate::class, \WP_Ultimo\Dependencies\Stripe\Sigma\ScheduledQueryRun::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Sigma\ScheduledQueryRun::class, \WP_Ultimo\Dependencies\Stripe\Source::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Source::class, \WP_Ultimo\Dependencies\Stripe\SourceTransaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\SourceTransaction::class, \WP_Ultimo\Dependencies\Stripe\Subscription::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Subscription::class, \WP_Ultimo\Dependencies\Stripe\SubscriptionItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\SubscriptionItem::class, \WP_Ultimo\Dependencies\Stripe\SubscriptionSchedule::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\SubscriptionSchedule::class, \WP_Ultimo\Dependencies\Stripe\Tax\Calculation::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Tax\Calculation::class, \WP_Ultimo\Dependencies\Stripe\Tax\CalculationLineItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Tax\CalculationLineItem::class, \WP_Ultimo\Dependencies\Stripe\Tax\Settings::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Tax\Settings::class, \WP_Ultimo\Dependencies\Stripe\Tax\Transaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Tax\Transaction::class, \WP_Ultimo\Dependencies\Stripe\Tax\TransactionLineItem::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Tax\TransactionLineItem::class, \WP_Ultimo\Dependencies\Stripe\TaxCode::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\TaxCode::class, \WP_Ultimo\Dependencies\Stripe\TaxId::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\TaxId::class, \WP_Ultimo\Dependencies\Stripe\TaxRate::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\TaxRate::class, \WP_Ultimo\Dependencies\Stripe\Terminal\Configuration::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Terminal\Configuration::class, \WP_Ultimo\Dependencies\Stripe\Terminal\ConnectionToken::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Terminal\ConnectionToken::class, \WP_Ultimo\Dependencies\Stripe\Terminal\Location::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Terminal\Location::class, \WP_Ultimo\Dependencies\Stripe\Terminal\Reader::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Terminal\Reader::class, \WP_Ultimo\Dependencies\Stripe\TestHelpers\TestClock::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\TestHelpers\TestClock::class, \WP_Ultimo\Dependencies\Stripe\Token::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Token::class, \WP_Ultimo\Dependencies\Stripe\Topup::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Topup::class, \WP_Ultimo\Dependencies\Stripe\Transfer::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Transfer::class, \WP_Ultimo\Dependencies\Stripe\TransferReversal::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\TransferReversal::class, \WP_Ultimo\Dependencies\Stripe\Treasury\CreditReversal::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\CreditReversal::class, \WP_Ultimo\Dependencies\Stripe\Treasury\DebitReversal::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\DebitReversal::class, \WP_Ultimo\Dependencies\Stripe\Treasury\FinancialAccount::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\FinancialAccount::class, \WP_Ultimo\Dependencies\Stripe\Treasury\FinancialAccountFeatures::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\FinancialAccountFeatures::class, \WP_Ultimo\Dependencies\Stripe\Treasury\InboundTransfer::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\InboundTransfer::class, \WP_Ultimo\Dependencies\Stripe\Treasury\OutboundPayment::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\OutboundPayment::class, \WP_Ultimo\Dependencies\Stripe\Treasury\OutboundTransfer::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\OutboundTransfer::class, \WP_Ultimo\Dependencies\Stripe\Treasury\ReceivedCredit::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\ReceivedCredit::class, \WP_Ultimo\Dependencies\Stripe\Treasury\ReceivedDebit::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\ReceivedDebit::class, \WP_Ultimo\Dependencies\Stripe\Treasury\Transaction::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\Transaction::class, \WP_Ultimo\Dependencies\Stripe\Treasury\TransactionEntry::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\Treasury\TransactionEntry::class, \WP_Ultimo\Dependencies\Stripe\UsageRecord::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\UsageRecord::class, \WP_Ultimo\Dependencies\Stripe\UsageRecordSummary::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\UsageRecordSummary::class, \WP_Ultimo\Dependencies\Stripe\WebhookEndpoint::OBJECT_NAME => \WP_Ultimo\Dependencies\Stripe\WebhookEndpoint::class]; -} diff --git a/dependencies/stripe/stripe-php/lib/Util/RandomGenerator.php b/dependencies/stripe/stripe-php/lib/Util/RandomGenerator.php deleted file mode 100644 index d656797..0000000 --- a/dependencies/stripe/stripe-php/lib/Util/RandomGenerator.php +++ /dev/null @@ -1,34 +0,0 @@ - a list of headers that should be persisted across requests - */ - public static $HEADERS_TO_PERSIST = ['Stripe-Account', 'Stripe-Version']; - /** @var array */ - public $headers; - /** @var null|string */ - public $apiKey; - /** @var null|string */ - public $apiBase; - /** - * @param null|string $key - * @param array $headers - * @param null|string $base - */ - public function __construct($key = null, $headers = [], $base = null) - { - $this->apiKey = $key; - $this->headers = $headers; - $this->apiBase = $base; - } - /** - * @return array - */ - public function __debugInfo() - { - return ['apiKey' => $this->redactedApiKey(), 'headers' => $this->headers, 'apiBase' => $this->apiBase]; - } - /** - * Unpacks an options array and merges it into the existing RequestOptions - * object. - * - * @param null|array|RequestOptions|string $options a key => value array - * @param bool $strict when true, forbid string form and arbitrary keys in array form - * - * @return RequestOptions - */ - public function merge($options, $strict = \false) - { - $other_options = self::parse($options, $strict); - if (null === $other_options->apiKey) { - $other_options->apiKey = $this->apiKey; - } - if (null === $other_options->apiBase) { - $other_options->apiBase = $this->apiBase; - } - $other_options->headers = \array_merge($this->headers, $other_options->headers); - return $other_options; - } - /** - * Discards all headers that we don't want to persist across requests. - */ - public function discardNonPersistentHeaders() - { - foreach ($this->headers as $k => $v) { - if (!\in_array($k, self::$HEADERS_TO_PERSIST, \true)) { - unset($this->headers[$k]); - } - } - } - /** - * Unpacks an options array into an RequestOptions object. - * - * @param null|array|RequestOptions|string $options a key => value array - * @param bool $strict when true, forbid string form and arbitrary keys in array form - * - * @throws \Stripe\Exception\InvalidArgumentException - * - * @return RequestOptions - */ - public static function parse($options, $strict = \false) - { - if ($options instanceof self) { - return clone $options; - } - if (null === $options) { - return new RequestOptions(null, [], null); - } - if (\is_string($options)) { - if ($strict) { - $message = 'Do not pass a string for request options. If you want to set the ' . 'API key, pass an array like ["api_key" => ] instead.'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($message); - } - return new RequestOptions($options, [], null); - } - if (\is_array($options)) { - $headers = []; - $key = null; - $base = null; - if (\array_key_exists('api_key', $options)) { - $key = $options['api_key']; - unset($options['api_key']); - } - if (\array_key_exists('idempotency_key', $options)) { - $headers['Idempotency-Key'] = $options['idempotency_key']; - unset($options['idempotency_key']); - } - if (\array_key_exists('stripe_account', $options)) { - $headers['Stripe-Account'] = $options['stripe_account']; - unset($options['stripe_account']); - } - if (\array_key_exists('stripe_version', $options)) { - $headers['Stripe-Version'] = $options['stripe_version']; - unset($options['stripe_version']); - } - if (\array_key_exists('api_base', $options)) { - $base = $options['api_base']; - unset($options['api_base']); - } - if ($strict && !empty($options)) { - $message = 'Got unexpected keys in options array: ' . \implode(', ', \array_keys($options)); - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($message); - } - return new RequestOptions($key, $headers, $base); - } - $message = 'The second argument to Stripe API method calls is an ' . 'optional per-request apiKey, which must be a string, or ' . 'per-request options, which must be an array. (HINT: you can set ' . 'a global apiKey by "Stripe::setApiKey()")'; - throw new \WP_Ultimo\Dependencies\Stripe\Exception\InvalidArgumentException($message); - } - /** @return string */ - private function redactedApiKey() - { - if (null === $this->apiKey) { - return ''; - } - $pieces = \explode('_', $this->apiKey, 3); - $last = \array_pop($pieces); - $redactedLast = \strlen($last) > 4 ? \str_repeat('*', \strlen($last) - 4) . \substr($last, -4) : $last; - $pieces[] = $redactedLast; - return \implode('_', $pieces); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Util/Set.php b/dependencies/stripe/stripe-php/lib/Util/Set.php deleted file mode 100644 index 06b7ec7..0000000 --- a/dependencies/stripe/stripe-php/lib/Util/Set.php +++ /dev/null @@ -1,41 +0,0 @@ -_elts = []; - foreach ($members as $item) { - $this->_elts[$item] = \true; - } - } - public function includes($elt) - { - return isset($this->_elts[$elt]); - } - public function add($elt) - { - $this->_elts[$elt] = \true; - } - public function discard($elt) - { - unset($this->_elts[$elt]); - } - public function toArray() - { - return \array_keys($this->_elts); - } - /** - * @return ArrayIterator - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new ArrayIterator($this->toArray()); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Util/Util.php b/dependencies/stripe/stripe-php/lib/Util/Util.php deleted file mode 100644 index 5fc4b78..0000000 --- a/dependencies/stripe/stripe-php/lib/Util/Util.php +++ /dev/null @@ -1,228 +0,0 @@ -id; - } - if (static::isList($h)) { - $results = []; - foreach ($h as $v) { - $results[] = static::objectsToIds($v); - } - return $results; - } - if (\is_array($h)) { - $results = []; - foreach ($h as $k => $v) { - if (null === $v) { - continue; - } - $results[$k] = static::objectsToIds($v); - } - return $results; - } - return $h; - } - /** - * @param array $params - * - * @return string - */ - public static function encodeParameters($params) - { - $flattenedParams = self::flattenParams($params); - $pieces = []; - foreach ($flattenedParams as $param) { - list($k, $v) = $param; - $pieces[] = self::urlEncode($k) . '=' . self::urlEncode($v); - } - return \implode('&', $pieces); - } - /** - * @param array $params - * @param null|string $parentKey - * - * @return array - */ - public static function flattenParams($params, $parentKey = null) - { - $result = []; - foreach ($params as $key => $value) { - $calculatedKey = $parentKey ? "{$parentKey}[{$key}]" : $key; - if (self::isList($value)) { - $result = \array_merge($result, self::flattenParamsList($value, $calculatedKey)); - } elseif (\is_array($value)) { - $result = \array_merge($result, self::flattenParams($value, $calculatedKey)); - } else { - \array_push($result, [$calculatedKey, $value]); - } - } - return $result; - } - /** - * @param array $value - * @param string $calculatedKey - * - * @return array - */ - public static function flattenParamsList($value, $calculatedKey) - { - $result = []; - foreach ($value as $i => $elem) { - if (self::isList($elem)) { - $result = \array_merge($result, self::flattenParamsList($elem, $calculatedKey)); - } elseif (\is_array($elem)) { - $result = \array_merge($result, self::flattenParams($elem, "{$calculatedKey}[{$i}]")); - } else { - \array_push($result, ["{$calculatedKey}[{$i}]", $elem]); - } - } - return $result; - } - /** - * @param string $key a string to URL-encode - * - * @return string the URL-encoded string - */ - public static function urlEncode($key) - { - $s = \urlencode((string) $key); - // Don't use strict form encoding by changing the square bracket control - // characters back to their literals. This is fine by the server, and - // makes these parameter strings easier to read. - $s = \str_replace('%5B', '[', $s); - return \str_replace('%5D', ']', $s); - } - public static function normalizeId($id) - { - if (\is_array($id)) { - $params = $id; - $id = $params['id']; - unset($params['id']); - } else { - $params = []; - } - return [$id, $params]; - } - /** - * Returns UNIX timestamp in milliseconds. - * - * @return int current time in millis - */ - public static function currentTimeMillis() - { - return (int) \round(\microtime(\true) * 1000); - } -} diff --git a/dependencies/stripe/stripe-php/lib/Webhook.php b/dependencies/stripe/stripe-php/lib/Webhook.php deleted file mode 100644 index 9451183..0000000 --- a/dependencies/stripe/stripe-php/lib/Webhook.php +++ /dev/null @@ -1,37 +0,0 @@ -webhook endpoints via the API to be - * notified about events that happen in your Stripe account or connected - * accounts. - * - * Most users configure webhooks from the dashboard, which provides a user interface for registering and testing your webhook endpoints. - * - * Related guide: Setting up webhooks - * - * @property string $id Unique identifier for the object. - * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $api_version The API version events are rendered as for this webhook endpoint. - * @property null|string $application The ID of the associated Connect application. - * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property null|string $description An optional description of what the webhook is used for. - * @property string[] $enabled_events The list of events to enable for this endpoint. ['*'] indicates that all events are enabled, except those that require explicit selection. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|string $secret The endpoint's secret, used to generate webhook signatures. Only returned at creation. - * @property string $status The status of the webhook. It can be enabled or disabled. - * @property string $url The URL of the webhook endpoint. - */ -class WebhookEndpoint extends ApiResource -{ - const OBJECT_NAME = 'webhook_endpoint'; - use ApiOperations\All; - use ApiOperations\Create; - use ApiOperations\Delete; - use ApiOperations\Retrieve; - use ApiOperations\Update; -} diff --git a/dependencies/stripe/stripe-php/lib/WebhookSignature.php b/dependencies/stripe/stripe-php/lib/WebhookSignature.php deleted file mode 100644 index d3d50f7..0000000 --- a/dependencies/stripe/stripe-php/lib/WebhookSignature.php +++ /dev/null @@ -1,111 +0,0 @@ - 0 && \abs(\time() - $timestamp) > $tolerance) { - throw Exception\SignatureVerificationException::factory('Timestamp outside the tolerance zone', $payload, $header); - } - return \true; - } - /** - * Extracts the timestamp in a signature header. - * - * @param string $header the signature header - * - * @return int the timestamp contained in the header, or -1 if no valid - * timestamp is found - */ - private static function getTimestamp($header) - { - $items = \explode(',', $header); - foreach ($items as $item) { - $itemParts = \explode('=', $item, 2); - if ('t' === $itemParts[0]) { - if (!\is_numeric($itemParts[1])) { - return -1; - } - return (int) $itemParts[1]; - } - } - return -1; - } - /** - * Extracts the signatures matching a given scheme in a signature header. - * - * @param string $header the signature header - * @param string $scheme the signature scheme to look for - * - * @return array the list of signatures matching the provided scheme - */ - private static function getSignatures($header, $scheme) - { - $signatures = []; - $items = \explode(',', $header); - foreach ($items as $item) { - $itemParts = \explode('=', $item, 2); - if (\trim($itemParts[0]) === $scheme) { - $signatures[] = $itemParts[1]; - } - } - return $signatures; - } - /** - * Computes the signature for a given payload and secret. - * - * The current scheme used by Stripe ("v1") is HMAC/SHA-256. - * - * @param string $payload the payload to sign - * @param string $secret the secret used to generate the signature - * - * @return string the signature as a string - */ - private static function computeSignature($payload, $secret) - { - return \hash_hmac('sha256', $payload, $secret); - } -} diff --git a/dependencies/symfony/cache-contracts/CacheInterface.php b/dependencies/symfony/cache-contracts/CacheInterface.php deleted file mode 100644 index 11f0c7b..0000000 --- a/dependencies/symfony/cache-contracts/CacheInterface.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Cache; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException; -/** - * Covers most simple to advanced caching needs. - * - * @author Nicolas Grekas - */ -interface CacheInterface -{ - /** - * Fetches a value from the pool or computes it if not found. - * - * On cache misses, a callback is called that should return the missing value. - * This callback is given a PSR-6 CacheItemInterface instance corresponding to the - * requested key, that could be used e.g. for expiration control. It could also - * be an ItemInterface instance when its additional features are needed. - * - * @param string $key The key of the item to retrieve from the cache - * @param callable|CallbackInterface $callback Should return the computed value for the given key/item - * @param float|null $beta A float that, as it grows, controls the likeliness of triggering - * early expiration. 0 disables it, INF forces immediate expiration. - * The default (or providing null) is implementation dependent but should - * typically be 1.0, which should provide optimal stampede protection. - * See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration - * @param array &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()} - * - * @return mixed - * - * @throws InvalidArgumentException When $key is not valid or when $beta is negative - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null); - /** - * Removes an item from the pool. - * - * @param string $key The key to delete - * - * @throws InvalidArgumentException When $key is not valid - * - * @return bool True if the item was successfully removed, false if there was any error - */ - public function delete(string $key) : bool; -} diff --git a/dependencies/symfony/cache-contracts/CacheTrait.php b/dependencies/symfony/cache-contracts/CacheTrait.php deleted file mode 100644 index 868c238..0000000 --- a/dependencies/symfony/cache-contracts/CacheTrait.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Cache; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -// Help opcache.preload discover always-needed symbols -\class_exists(InvalidArgumentException::class); -/** - * An implementation of CacheInterface for PSR-6 CacheItemPoolInterface classes. - * - * @author Nicolas Grekas - */ -trait CacheTrait -{ - /** - * {@inheritdoc} - * - * @return mixed - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - return $this->doGet($this, $key, $callback, $beta, $metadata); - } - /** - * {@inheritdoc} - */ - public function delete(string $key) : bool - { - return $this->deleteItem($key); - } - private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null, LoggerInterface $logger = null) - { - if (0 > ($beta = $beta ?? 1.0)) { - throw new class(\sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException - { - }; - } - $item = $pool->getItem($key); - $recompute = !$item->isHit() || \INF === $beta; - $metadata = $item instanceof ItemInterface ? $item->getMetadata() : []; - if (!$recompute && $metadata) { - $expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? \false; - $ctime = $metadata[ItemInterface::METADATA_CTIME] ?? \false; - if ($recompute = $ctime && $expiry && $expiry <= ($now = \microtime(\true)) - $ctime / 1000 * $beta * \log(\random_int(1, \PHP_INT_MAX) / \PHP_INT_MAX)) { - // force applying defaultLifetime to expiry - $item->expiresAt(null); - $logger && $logger->info('Item "{key}" elected for early recomputation {delta}s before its expiration', ['key' => $key, 'delta' => \sprintf('%.1f', $expiry - $now)]); - } - } - if ($recompute) { - $save = \true; - $item->set($callback($item, $save)); - if ($save) { - $pool->save($item); - } - } - return $item->get(); - } -} diff --git a/dependencies/symfony/cache-contracts/CallbackInterface.php b/dependencies/symfony/cache-contracts/CallbackInterface.php deleted file mode 100644 index da7367f..0000000 --- a/dependencies/symfony/cache-contracts/CallbackInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Cache; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -/** - * Computes and returns the cached value of an item. - * - * @author Nicolas Grekas - */ -interface CallbackInterface -{ - /** - * @param CacheItemInterface|ItemInterface $item The item to compute the value for - * @param bool &$save Should be set to false when the value should not be saved in the pool - * - * @return mixed The computed value for the passed item - */ - public function __invoke(CacheItemInterface $item, bool &$save); -} diff --git a/dependencies/symfony/cache-contracts/ItemInterface.php b/dependencies/symfony/cache-contracts/ItemInterface.php deleted file mode 100644 index 28ac36b..0000000 --- a/dependencies/symfony/cache-contracts/ItemInterface.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Cache; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheException; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException; -/** - * Augments PSR-6's CacheItemInterface with support for tags and metadata. - * - * @author Nicolas Grekas - */ -interface ItemInterface extends CacheItemInterface -{ - /** - * References the Unix timestamp stating when the item will expire. - */ - public const METADATA_EXPIRY = 'expiry'; - /** - * References the time the item took to be created, in milliseconds. - */ - public const METADATA_CTIME = 'ctime'; - /** - * References the list of tags that were assigned to the item, as string[]. - */ - public const METADATA_TAGS = 'tags'; - /** - * Reserved characters that cannot be used in a key or tag. - */ - public const RESERVED_CHARACTERS = '{}()/\\@:'; - /** - * Adds a tag to a cache item. - * - * Tags are strings that follow the same validation rules as keys. - * - * @param string|string[] $tags A tag or array of tags - * - * @return $this - * - * @throws InvalidArgumentException When $tag is not valid - * @throws CacheException When the item comes from a pool that is not tag-aware - */ - public function tag($tags) : self; - /** - * Returns a list of metadata info that were saved alongside with the cached value. - * - * See ItemInterface::METADATA_* consts for keys potentially found in the returned array. - */ - public function getMetadata() : array; -} diff --git a/dependencies/symfony/cache-contracts/TagAwareCacheInterface.php b/dependencies/symfony/cache-contracts/TagAwareCacheInterface.php deleted file mode 100644 index 42cd2ca..0000000 --- a/dependencies/symfony/cache-contracts/TagAwareCacheInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Cache; - -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException; -/** - * Allows invalidating cached items using tags. - * - * @author Nicolas Grekas - */ -interface TagAwareCacheInterface extends CacheInterface -{ - /** - * Invalidates cached items using tags. - * - * When implemented on a PSR-6 pool, invalidation should not apply - * to deferred items. Instead, they should be committed as usual. - * This allows replacing old tagged values by new ones without - * race conditions. - * - * @param string[] $tags An array of tags to invalidate - * - * @return bool True on success - * - * @throws InvalidArgumentException When $tags is not valid - */ - public function invalidateTags(array $tags); -} diff --git a/dependencies/symfony/cache/Adapter/AbstractAdapter.php b/dependencies/symfony/cache/Adapter/AbstractAdapter.php deleted file mode 100644 index c5fb529..0000000 --- a/dependencies/symfony/cache/Adapter/AbstractAdapter.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\AbstractAdapterTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ContractsTrait; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -/** - * @author Nicolas Grekas - */ -abstract class AbstractAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface -{ - use AbstractAdapterTrait; - use ContractsTrait; - /** - * @internal - */ - protected const NS_SEPARATOR = ':'; - private static $apcuSupported; - private static $phpFilesSupported; - protected function __construct(string $namespace = '', int $defaultLifetime = 0) - { - $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace) . static::NS_SEPARATOR; - $this->defaultLifetime = $defaultLifetime; - if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { - throw new InvalidArgumentException(\sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace)); - } - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key, $value, $isHit) { - $item = new CacheItem(); - $item->key = $key; - $item->value = $v = $value; - $item->isHit = $isHit; - // Detect wrapped values that encode for their expiry and creation duration - // For compactness, these values are packed in the key of an array using - // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F - if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) \array_key_first($v)) && "\x9d" === $k[0] && "\x00" === $k[5] && "_" === $k[9]) { - $item->value = $v[$k]; - $v = \unpack('Ve/Nc', \substr($k, 1, -1)); - $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; - $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; - } - return $item; - }, null, CacheItem::class)); - self::$mergeByLifetime ?? (self::$mergeByLifetime = \Closure::bind(static function ($deferred, $namespace, &$expiredIds, $getId, $defaultLifetime) { - $byLifetime = []; - $now = \microtime(\true); - $expiredIds = []; - foreach ($deferred as $key => $item) { - $key = (string) $key; - if (null === $item->expiry) { - $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0; - } elseif (!$item->expiry) { - $ttl = 0; - } elseif (0 >= ($ttl = (int) (0.1 + $item->expiry - $now))) { - $expiredIds[] = $getId($key); - continue; - } - if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) { - unset($metadata[CacheItem::METADATA_TAGS]); - } - // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators - $byLifetime[$ttl][$getId($key)] = $metadata ? ["\x9d" . \pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME]) . "_" => $item->value] : $item->value; - } - return $byLifetime; - }, null, CacheItem::class)); - } - /** - * Returns the best possible adapter that your runtime supports. - * - * Using ApcuAdapter makes system caches compatible with read-only filesystems. - * - * @return AdapterInterface - */ - public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, LoggerInterface $logger = null) - { - $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, \true); - if (null !== $logger) { - $opcache->setLogger($logger); - } - if (!(self::$apcuSupported = self::$apcuSupported ?? ApcuAdapter::isSupported())) { - return $opcache; - } - if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], \true) && !\filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { - return $opcache; - } - $apcu = new ApcuAdapter($namespace, \intdiv($defaultLifetime, 5), $version); - if (null !== $logger) { - $apcu->setLogger($logger); - } - return new ChainAdapter([$apcu, $opcache]); - } - public static function createConnection(string $dsn, array $options = []) - { - if (\str_starts_with($dsn, 'redis:') || \str_starts_with($dsn, 'rediss:')) { - return RedisAdapter::createConnection($dsn, $options); - } - if (\str_starts_with($dsn, 'memcached:')) { - return MemcachedAdapter::createConnection($dsn, $options); - } - if (0 === \strpos($dsn, 'couchbase:')) { - if (CouchbaseBucketAdapter::isSupported()) { - return CouchbaseBucketAdapter::createConnection($dsn, $options); - } - return CouchbaseCollectionAdapter::createConnection($dsn, $options); - } - throw new InvalidArgumentException(\sprintf('Unsupported DSN: "%s".', $dsn)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - $ok = \true; - $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, \Closure::fromCallable([$this, 'getId']), $this->defaultLifetime); - $retry = $this->deferred = []; - if ($expiredIds) { - try { - $this->doDelete($expiredIds); - } catch (\Exception $e) { - $ok = \false; - CacheItem::log($this->logger, 'Failed to delete expired items: ' . $e->getMessage(), ['exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - } - } - foreach ($byLifetime as $lifetime => $values) { - try { - $e = $this->doSave($values, $lifetime); - } catch (\Exception $e) { - } - if (\true === $e || [] === $e) { - continue; - } - if (\is_array($e) || 1 === \count($values)) { - foreach (\is_array($e) ? $e : \array_keys($values) as $id) { - $ok = \false; - $v = $values[$id]; - $type = \get_debug_type($v); - $message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['key' => \substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => \get_debug_type($this)]); - } - } else { - foreach ($values as $id => $v) { - $retry[$lifetime][] = $id; - } - } - } - // When bulk-save failed, retry each item individually - foreach ($retry as $lifetime => $ids) { - foreach ($ids as $id) { - try { - $v = $byLifetime[$lifetime][$id]; - $e = $this->doSave([$id => $v], $lifetime); - } catch (\Exception $e) { - } - if (\true === $e || [] === $e) { - continue; - } - $ok = \false; - $type = \get_debug_type($v); - $message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['key' => \substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => \get_debug_type($this)]); - } - } - return $ok; - } -} diff --git a/dependencies/symfony/cache/Adapter/AbstractTagAwareAdapter.php b/dependencies/symfony/cache/Adapter/AbstractTagAwareAdapter.php deleted file mode 100644 index 90eea55..0000000 --- a/dependencies/symfony/cache/Adapter/AbstractTagAwareAdapter.php +++ /dev/null @@ -1,287 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\AbstractAdapterTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ContractsTrait; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\TagAwareCacheInterface; -/** - * Abstract for native TagAware adapters. - * - * To keep info on tags, the tags are both serialized as part of cache value and provided as tag ids - * to Adapters on operations when needed for storage to doSave(), doDelete() & doInvalidate(). - * - * @author Nicolas Grekas - * @author André Rømcke - * - * @internal - */ -abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, LoggerAwareInterface, ResettableInterface -{ - use AbstractAdapterTrait; - use ContractsTrait; - private const TAGS_PREFIX = "\x00tags\x00"; - protected function __construct(string $namespace = '', int $defaultLifetime = 0) - { - $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace) . ':'; - $this->defaultLifetime = $defaultLifetime; - if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { - throw new InvalidArgumentException(\sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace)); - } - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key, $value, $isHit) { - $item = new CacheItem(); - $item->key = $key; - $item->isTaggable = \true; - // If structure does not match what we expect return item as is (no value and not a hit) - if (!\is_array($value) || !\array_key_exists('value', $value)) { - return $item; - } - $item->isHit = $isHit; - // Extract value, tags and meta data from the cache value - $item->value = $value['value']; - $item->metadata[CacheItem::METADATA_TAGS] = $value['tags'] ?? []; - if (isset($value['meta'])) { - // For compactness these values are packed, & expiry is offset to reduce size - $v = \unpack('Ve/Nc', $value['meta']); - $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; - $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; - } - return $item; - }, null, CacheItem::class)); - self::$mergeByLifetime ?? (self::$mergeByLifetime = \Closure::bind(static function ($deferred, &$expiredIds, $getId, $tagPrefix, $defaultLifetime) { - $byLifetime = []; - $now = \microtime(\true); - $expiredIds = []; - foreach ($deferred as $key => $item) { - $key = (string) $key; - if (null === $item->expiry) { - $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0; - } elseif (!$item->expiry) { - $ttl = 0; - } elseif (0 >= ($ttl = (int) (0.1 + $item->expiry - $now))) { - $expiredIds[] = $getId($key); - continue; - } - // Store Value and Tags on the cache value - if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) { - $value = ['value' => $item->value, 'tags' => $metadata[CacheItem::METADATA_TAGS]]; - unset($metadata[CacheItem::METADATA_TAGS]); - } else { - $value = ['value' => $item->value, 'tags' => []]; - } - if ($metadata) { - // For compactness, expiry and creation duration are packed, using magic numbers as separators - $value['meta'] = \pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME]); - } - // Extract tag changes, these should be removed from values in doSave() - $value['tag-operations'] = ['add' => [], 'remove' => []]; - $oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? []; - foreach (\array_diff($value['tags'], $oldTags) as $addedTag) { - $value['tag-operations']['add'][] = $getId($tagPrefix . $addedTag); - } - foreach (\array_diff($oldTags, $value['tags']) as $removedTag) { - $value['tag-operations']['remove'][] = $getId($tagPrefix . $removedTag); - } - $byLifetime[$ttl][$getId($key)] = $value; - $item->metadata = $item->newMetadata; - } - return $byLifetime; - }, null, CacheItem::class)); - } - /** - * Persists several cache items immediately. - * - * @param array $values The values to cache, indexed by their cache identifier - * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning - * @param array[] $addTagData Hash where key is tag id, and array value is list of cache id's to add to tag - * @param array[] $removeTagData Hash where key is tag id, and array value is list of cache id's to remove to tag - * - * @return array The identifiers that failed to be cached or a boolean stating if caching succeeded or not - */ - protected abstract function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []) : array; - /** - * Removes multiple items from the pool and their corresponding tags. - * - * @param array $ids An array of identifiers that should be removed from the pool - * - * @return bool - */ - protected abstract function doDelete(array $ids); - /** - * Removes relations between tags and deleted items. - * - * @param array $tagData Array of tag => key identifiers that should be removed from the pool - */ - protected abstract function doDeleteTagRelations(array $tagData) : bool; - /** - * Invalidates cached items using tags. - * - * @param string[] $tagIds An array of tags to invalidate, key is tag and value is tag id - */ - protected abstract function doInvalidate(array $tagIds) : bool; - /** - * Delete items and yields the tags they were bound to. - */ - protected function doDeleteYieldTags(array $ids) : iterable - { - foreach ($this->doFetch($ids) as $id => $value) { - (yield $id => \is_array($value) && \is_array($value['tags'] ?? null) ? $value['tags'] : []); - } - $this->doDelete($ids); - } - /** - * {@inheritdoc} - */ - public function commit() : bool - { - $ok = \true; - $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, \Closure::fromCallable([$this, 'getId']), self::TAGS_PREFIX, $this->defaultLifetime); - $retry = $this->deferred = []; - if ($expiredIds) { - // Tags are not cleaned up in this case, however that is done on invalidateTags(). - try { - $this->doDelete($expiredIds); - } catch (\Exception $e) { - $ok = \false; - CacheItem::log($this->logger, 'Failed to delete expired items: ' . $e->getMessage(), ['exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - } - } - foreach ($byLifetime as $lifetime => $values) { - try { - $values = $this->extractTagData($values, $addTagData, $removeTagData); - $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData); - } catch (\Exception $e) { - } - if (\true === $e || [] === $e) { - continue; - } - if (\is_array($e) || 1 === \count($values)) { - foreach (\is_array($e) ? $e : \array_keys($values) as $id) { - $ok = \false; - $v = $values[$id]; - $type = \get_debug_type($v); - $message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['key' => \substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => \get_debug_type($this)]); - } - } else { - foreach ($values as $id => $v) { - $retry[$lifetime][] = $id; - } - } - } - // When bulk-save failed, retry each item individually - foreach ($retry as $lifetime => $ids) { - foreach ($ids as $id) { - try { - $v = $byLifetime[$lifetime][$id]; - $values = $this->extractTagData([$id => $v], $addTagData, $removeTagData); - $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData); - } catch (\Exception $e) { - } - if (\true === $e || [] === $e) { - continue; - } - $ok = \false; - $type = \get_debug_type($v); - $message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['key' => \substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => \get_debug_type($this)]); - } - } - return $ok; - } - /** - * {@inheritdoc} - */ - public function deleteItems(array $keys) : bool - { - if (!$keys) { - return \true; - } - $ok = \true; - $ids = []; - $tagData = []; - foreach ($keys as $key) { - $ids[$key] = $this->getId($key); - unset($this->deferred[$key]); - } - try { - foreach ($this->doDeleteYieldTags(\array_values($ids)) as $id => $tags) { - foreach ($tags as $tag) { - $tagData[$this->getId(self::TAGS_PREFIX . $tag)][] = $id; - } - } - } catch (\Exception $e) { - $ok = \false; - } - try { - if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) { - return \true; - } - } catch (\Exception $e) { - } - // When bulk-delete failed, retry each item individually - foreach ($ids as $key => $id) { - try { - $e = null; - if ($this->doDelete([$id])) { - continue; - } - } catch (\Exception $e) { - } - $message = 'Failed to delete key "{key}"' . ($e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - $ok = \false; - } - return $ok; - } - /** - * {@inheritdoc} - */ - public function invalidateTags(array $tags) - { - if (empty($tags)) { - return \false; - } - $tagIds = []; - foreach (\array_unique($tags) as $tag) { - $tagIds[] = $this->getId(self::TAGS_PREFIX . $tag); - } - try { - if ($this->doInvalidate($tagIds)) { - return \true; - } - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to invalidate tags: ' . $e->getMessage(), ['exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - } - return \false; - } - /** - * Extracts tags operation data from $values set in mergeByLifetime, and returns values without it. - */ - private function extractTagData(array $values, ?array &$addTagData, ?array &$removeTagData) : array - { - $addTagData = $removeTagData = []; - foreach ($values as $id => $value) { - foreach ($value['tag-operations']['add'] as $tag => $tagId) { - $addTagData[$tagId][] = $id; - } - foreach ($value['tag-operations']['remove'] as $tag => $tagId) { - $removeTagData[$tagId][] = $id; - } - unset($values[$id]['tag-operations']); - } - return $values; - } -} diff --git a/dependencies/symfony/cache/Adapter/AdapterInterface.php b/dependencies/symfony/cache/Adapter/AdapterInterface.php deleted file mode 100644 index 383c311..0000000 --- a/dependencies/symfony/cache/Adapter/AdapterInterface.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -// Help opcache.preload discover always-needed symbols -\class_exists(CacheItem::class); -/** - * Interface for adapters managing instances of Symfony's CacheItem. - * - * @author Kévin Dunglas - */ -interface AdapterInterface extends CacheItemPoolInterface -{ - /** - * {@inheritdoc} - * - * @return CacheItem - */ - public function getItem($key); - /** - * {@inheritdoc} - * - * @return \Traversable - */ - public function getItems(array $keys = []); - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = ''); -} diff --git a/dependencies/symfony/cache/Adapter/ApcuAdapter.php b/dependencies/symfony/cache/Adapter/ApcuAdapter.php deleted file mode 100644 index ca892b8..0000000 --- a/dependencies/symfony/cache/Adapter/ApcuAdapter.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -/** - * @author Nicolas Grekas - */ -class ApcuAdapter extends AbstractAdapter -{ - private $marshaller; - /** - * @throws CacheException if APCu is not enabled - */ - public function __construct(string $namespace = '', int $defaultLifetime = 0, string $version = null, MarshallerInterface $marshaller = null) - { - if (!static::isSupported()) { - throw new CacheException('APCu is not enabled.'); - } - if ('cli' === \PHP_SAPI) { - \ini_set('apc.use_request_time', 0); - } - parent::__construct($namespace, $defaultLifetime); - if (null !== $version) { - CacheItem::validateKey($version); - if (!\apcu_exists($version . '@' . $namespace)) { - $this->doClear($namespace); - \apcu_add($version . '@' . $namespace, null); - } - } - $this->marshaller = $marshaller; - } - public static function isSupported() - { - return \function_exists('apcu_fetch') && \filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOLEAN); - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - $unserializeCallbackHandler = \ini_set('unserialize_callback_func', __CLASS__ . '::handleUnserializeCallback'); - try { - $values = []; - $ids = \array_flip($ids); - foreach (\apcu_fetch(\array_keys($ids), $ok) ?: [] as $k => $v) { - if (!isset($ids[$k])) { - // work around https://github.com/krakjoe/apcu/issues/247 - $k = \key($ids); - } - unset($ids[$k]); - if (null !== $v || $ok) { - $values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v; - } - } - return $values; - } catch (\Error $e) { - throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); - } finally { - \ini_set('unserialize_callback_func', $unserializeCallbackHandler); - } - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - return \apcu_exists($id); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - return isset($namespace[0]) && \class_exists(\APCUIterator::class, \false) && ('cli' !== \PHP_SAPI || \filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) ? \apcu_delete(new \APCUIterator(\sprintf('/^%s/', \preg_quote($namespace, '/')), \APC_ITER_KEY)) : \apcu_clear_cache(); - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - foreach ($ids as $id) { - \apcu_delete($id); - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - if (null !== $this->marshaller && !($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - try { - if (\false === ($failures = \apcu_store($values, null, $lifetime))) { - $failures = $values; - } - return \array_keys($failures); - } catch (\Throwable $e) { - if (1 === \count($values)) { - // Workaround https://github.com/krakjoe/apcu/issues/170 - \apcu_delete(\array_key_first($values)); - } - throw $e; - } - } -} diff --git a/dependencies/symfony/cache/Adapter/ArrayAdapter.php b/dependencies/symfony/cache/Adapter/ArrayAdapter.php deleted file mode 100644 index 6e49b88..0000000 --- a/dependencies/symfony/cache/Adapter/ArrayAdapter.php +++ /dev/null @@ -1,346 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -/** - * An in-memory cache storage. - * - * Acts as a least-recently-used (LRU) storage when configured with a maximum number of items. - * - * @author Nicolas Grekas - */ -class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface -{ - use LoggerAwareTrait; - private $storeSerialized; - private $values = []; - private $expiries = []; - private $defaultLifetime; - private $maxLifetime; - private $maxItems; - private static $createCacheItem; - /** - * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise - */ - public function __construct(int $defaultLifetime = 0, bool $storeSerialized = \true, float $maxLifetime = 0, int $maxItems = 0) - { - if (0 > $maxLifetime) { - throw new InvalidArgumentException(\sprintf('Argument $maxLifetime must be positive, %F passed.', $maxLifetime)); - } - if (0 > $maxItems) { - throw new InvalidArgumentException(\sprintf('Argument $maxItems must be a positive integer, %d passed.', $maxItems)); - } - $this->defaultLifetime = $defaultLifetime; - $this->storeSerialized = $storeSerialized; - $this->maxLifetime = $maxLifetime; - $this->maxItems = $maxItems; - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key, $value, $isHit) { - $item = new CacheItem(); - $item->key = $key; - $item->value = $value; - $item->isHit = $isHit; - return $item; - }, null, CacheItem::class)); - } - /** - * {@inheritdoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - $item = $this->getItem($key); - $metadata = $item->getMetadata(); - // ArrayAdapter works in memory, we don't care about stampede protection - if (\INF === $beta || !$item->isHit()) { - $save = \true; - $item->set($callback($item, $save)); - if ($save) { - $this->save($item); - } - } - return $item->get(); - } - /** - * {@inheritdoc} - */ - public function delete(string $key) : bool - { - return $this->deleteItem($key); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > \microtime(\true)) { - if ($this->maxItems) { - // Move the item last in the storage - $value = $this->values[$key]; - unset($this->values[$key]); - $this->values[$key] = $value; - } - return \true; - } - \assert('' !== CacheItem::validateKey($key)); - return isset($this->expiries[$key]) && !$this->deleteItem($key); - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - if (!($isHit = $this->hasItem($key))) { - $value = null; - if (!$this->maxItems) { - // Track misses in non-LRU mode only - $this->values[$key] = null; - } - } else { - $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; - } - return (self::$createCacheItem)($key, $value, $isHit); - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - \assert(self::validateKeys($keys)); - return $this->generateItems($keys, \microtime(\true), self::$createCacheItem); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - \assert('' !== CacheItem::validateKey($key)); - unset($this->values[$key], $this->expiries[$key]); - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - foreach ($keys as $key) { - $this->deleteItem($key); - } - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - if (!$item instanceof CacheItem) { - return \false; - } - $item = (array) $item; - $key = $item["\x00*\x00key"]; - $value = $item["\x00*\x00value"]; - $expiry = $item["\x00*\x00expiry"]; - $now = \microtime(\true); - if (null !== $expiry) { - if (!$expiry) { - $expiry = \PHP_INT_MAX; - } elseif ($expiry <= $now) { - $this->deleteItem($key); - return \true; - } - } - if ($this->storeSerialized && null === ($value = $this->freeze($value, $key))) { - return \false; - } - if (null === $expiry && 0 < $this->defaultLifetime) { - $expiry = $this->defaultLifetime; - $expiry = $now + ($expiry > ($this->maxLifetime ?: $expiry) ? $this->maxLifetime : $expiry); - } elseif ($this->maxLifetime && (null === $expiry || $expiry > $now + $this->maxLifetime)) { - $expiry = $now + $this->maxLifetime; - } - if ($this->maxItems) { - unset($this->values[$key]); - // Iterate items and vacuum expired ones while we are at it - foreach ($this->values as $k => $v) { - if ($this->expiries[$k] > $now && \count($this->values) < $this->maxItems) { - break; - } - unset($this->values[$k], $this->expiries[$k]); - } - } - $this->values[$key] = $value; - $this->expiries[$key] = $expiry ?? \PHP_INT_MAX; - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - return $this->save($item); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - if ('' !== $prefix) { - $now = \microtime(\true); - foreach ($this->values as $key => $value) { - if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || 0 === \strpos($key, $prefix)) { - unset($this->values[$key], $this->expiries[$key]); - } - } - if ($this->values) { - return \true; - } - } - $this->values = $this->expiries = []; - return \true; - } - /** - * Returns all cached values, with cache miss as null. - * - * @return array - */ - public function getValues() - { - if (!$this->storeSerialized) { - return $this->values; - } - $values = $this->values; - foreach ($values as $k => $v) { - if (null === $v || 'N;' === $v) { - continue; - } - if (!\is_string($v) || !isset($v[2]) || ':' !== $v[1]) { - $values[$k] = \serialize($v); - } - } - return $values; - } - /** - * {@inheritdoc} - */ - public function reset() - { - $this->clear(); - } - private function generateItems(array $keys, float $now, \Closure $f) : \Generator - { - foreach ($keys as $i => $key) { - if (!($isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key)))) { - $value = null; - if (!$this->maxItems) { - // Track misses in non-LRU mode only - $this->values[$key] = null; - } - } else { - if ($this->maxItems) { - // Move the item last in the storage - $value = $this->values[$key]; - unset($this->values[$key]); - $this->values[$key] = $value; - } - $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; - } - unset($keys[$i]); - (yield $key => $f($key, $value, $isHit)); - } - foreach ($keys as $key) { - (yield $key => $f($key, null, \false)); - } - } - private function freeze($value, string $key) - { - if (null === $value) { - return 'N;'; - } - if (\is_string($value)) { - // Serialize strings if they could be confused with serialized objects or arrays - if ('N;' === $value || isset($value[2]) && ':' === $value[1]) { - return \serialize($value); - } - } elseif (!\is_scalar($value)) { - try { - $serialized = \serialize($value); - } catch (\Exception $e) { - unset($this->values[$key]); - $type = \get_debug_type($value); - $message = \sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage()); - CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - return; - } - // Keep value serialized if it contains any objects or any internal references - if ('C' === $serialized[0] || 'O' === $serialized[0] || \preg_match('/;[OCRr]:[1-9]/', $serialized)) { - return $serialized; - } - } - return $value; - } - private function unfreeze(string $key, bool &$isHit) - { - if ('N;' === ($value = $this->values[$key])) { - return null; - } - if (\is_string($value) && isset($value[2]) && ':' === $value[1]) { - try { - $value = \unserialize($value); - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to unserialize key "{key}": ' . $e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - $value = \false; - } - if (\false === $value) { - $value = null; - $isHit = \false; - if (!$this->maxItems) { - $this->values[$key] = null; - } - } - } - return $value; - } - private function validateKeys(array $keys) : bool - { - foreach ($keys as $key) { - if (!\is_string($key) || !isset($this->expiries[$key])) { - CacheItem::validateKey($key); - } - } - return \true; - } -} diff --git a/dependencies/symfony/cache/Adapter/ChainAdapter.php b/dependencies/symfony/cache/Adapter/ChainAdapter.php deleted file mode 100644 index 709002e..0000000 --- a/dependencies/symfony/cache/Adapter/ChainAdapter.php +++ /dev/null @@ -1,287 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ContractsTrait; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ResetInterface; -/** - * Chains several adapters together. - * - * Cached items are fetched from the first adapter having them in its data store. - * They are saved and deleted in all adapters at once. - * - * @author Kévin Dunglas - */ -class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface -{ - use ContractsTrait; - private $adapters = []; - private $adapterCount; - private $defaultLifetime; - private static $syncItem; - /** - * @param CacheItemPoolInterface[] $adapters The ordered list of adapters used to fetch cached items - * @param int $defaultLifetime The default lifetime of items propagated from lower adapters to upper ones - */ - public function __construct(array $adapters, int $defaultLifetime = 0) - { - if (!$adapters) { - throw new InvalidArgumentException('At least one adapter must be specified.'); - } - foreach ($adapters as $adapter) { - if (!$adapter instanceof CacheItemPoolInterface) { - throw new InvalidArgumentException(\sprintf('The class "%s" does not implement the "%s" interface.', \get_debug_type($adapter), CacheItemPoolInterface::class)); - } - if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], \true) && $adapter instanceof ApcuAdapter && !\filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { - continue; - // skip putting APCu in the chain when the backend is disabled - } - if ($adapter instanceof AdapterInterface) { - $this->adapters[] = $adapter; - } else { - $this->adapters[] = new ProxyAdapter($adapter); - } - } - $this->adapterCount = \count($this->adapters); - $this->defaultLifetime = $defaultLifetime; - self::$syncItem ?? (self::$syncItem = \Closure::bind(static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) { - $sourceItem->isTaggable = \false; - $sourceMetadata = $sourceMetadata ?? $sourceItem->metadata; - unset($sourceMetadata[CacheItem::METADATA_TAGS]); - $item->value = $sourceItem->value; - $item->isHit = $sourceItem->isHit; - $item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata; - if (isset($item->metadata[CacheItem::METADATA_EXPIRY])) { - $item->expiresAt(\DateTime::createFromFormat('U.u', \sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY]))); - } elseif (0 < $defaultLifetime) { - $item->expiresAfter($defaultLifetime); - } - return $item; - }, null, CacheItem::class)); - } - /** - * {@inheritdoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - $doSave = \true; - $callback = static function (CacheItem $item, bool &$save) use($callback, &$doSave) { - $value = $callback($item, $save); - $doSave = $save; - return $value; - }; - $lastItem = null; - $i = 0; - $wrap = function (CacheItem $item = null, bool &$save = \true) use($key, $callback, $beta, &$wrap, &$i, &$doSave, &$lastItem, &$metadata) { - $adapter = $this->adapters[$i]; - if (isset($this->adapters[++$i])) { - $callback = $wrap; - $beta = \INF === $beta ? \INF : 0; - } - if ($adapter instanceof CacheInterface) { - $value = $adapter->get($key, $callback, $beta, $metadata); - } else { - $value = $this->doGet($adapter, $key, $callback, $beta, $metadata); - } - if (null !== $item) { - (self::$syncItem)($lastItem = $lastItem ?? $item, $item, $this->defaultLifetime, $metadata); - } - $save = $doSave; - return $value; - }; - return $wrap(); - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - $syncItem = self::$syncItem; - $misses = []; - foreach ($this->adapters as $i => $adapter) { - $item = $adapter->getItem($key); - if ($item->isHit()) { - while (0 <= --$i) { - $this->adapters[$i]->save($syncItem($item, $misses[$i], $this->defaultLifetime)); - } - return $item; - } - $misses[$i] = $item; - } - return $item; - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - return $this->generateItems($this->adapters[0]->getItems($keys), 0); - } - private function generateItems(iterable $items, int $adapterIndex) : \Generator - { - $missing = []; - $misses = []; - $nextAdapterIndex = $adapterIndex + 1; - $nextAdapter = $this->adapters[$nextAdapterIndex] ?? null; - foreach ($items as $k => $item) { - if (!$nextAdapter || $item->isHit()) { - (yield $k => $item); - } else { - $missing[] = $k; - $misses[$k] = $item; - } - } - if ($missing) { - $syncItem = self::$syncItem; - $adapter = $this->adapters[$adapterIndex]; - $items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex); - foreach ($items as $k => $item) { - if ($item->isHit()) { - $adapter->save($syncItem($item, $misses[$k], $this->defaultLifetime)); - } - (yield $k => $item); - } - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - foreach ($this->adapters as $adapter) { - if ($adapter->hasItem($key)) { - return \true; - } - } - return \false; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - $cleared = \true; - $i = $this->adapterCount; - while ($i--) { - if ($this->adapters[$i] instanceof AdapterInterface) { - $cleared = $this->adapters[$i]->clear($prefix) && $cleared; - } else { - $cleared = $this->adapters[$i]->clear() && $cleared; - } - } - return $cleared; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - $deleted = \true; - $i = $this->adapterCount; - while ($i--) { - $deleted = $this->adapters[$i]->deleteItem($key) && $deleted; - } - return $deleted; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - $deleted = \true; - $i = $this->adapterCount; - while ($i--) { - $deleted = $this->adapters[$i]->deleteItems($keys) && $deleted; - } - return $deleted; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - $saved = \true; - $i = $this->adapterCount; - while ($i--) { - $saved = $this->adapters[$i]->save($item) && $saved; - } - return $saved; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - $saved = \true; - $i = $this->adapterCount; - while ($i--) { - $saved = $this->adapters[$i]->saveDeferred($item) && $saved; - } - return $saved; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - $committed = \true; - $i = $this->adapterCount; - while ($i--) { - $committed = $this->adapters[$i]->commit() && $committed; - } - return $committed; - } - /** - * {@inheritdoc} - */ - public function prune() - { - $pruned = \true; - foreach ($this->adapters as $adapter) { - if ($adapter instanceof PruneableInterface) { - $pruned = $adapter->prune() && $pruned; - } - } - return $pruned; - } - /** - * {@inheritdoc} - */ - public function reset() - { - foreach ($this->adapters as $adapter) { - if ($adapter instanceof ResetInterface) { - $adapter->reset(); - } - } - } -} diff --git a/dependencies/symfony/cache/Adapter/CouchbaseBucketAdapter.php b/dependencies/symfony/cache/Adapter/CouchbaseBucketAdapter.php deleted file mode 100644 index 0d6aefe..0000000 --- a/dependencies/symfony/cache/Adapter/CouchbaseBucketAdapter.php +++ /dev/null @@ -1,196 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -/** - * @author Antonio Jose Cerezo Aranda - */ -class CouchbaseBucketAdapter extends AbstractAdapter -{ - private const THIRTY_DAYS_IN_SECONDS = 2592000; - private const MAX_KEY_LENGTH = 250; - private const KEY_NOT_FOUND = 13; - private const VALID_DSN_OPTIONS = ['operationTimeout', 'configTimeout', 'configNodeTimeout', 'n1qlTimeout', 'httpTimeout', 'configDelay', 'htconfigIdleTimeout', 'durabilityInterval', 'durabilityTimeout']; - private $bucket; - private $marshaller; - public function __construct(\WP_Ultimo\Dependencies\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) - { - if (!static::isSupported()) { - throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.'); - } - $this->maxIdLength = static::MAX_KEY_LENGTH; - $this->bucket = $bucket; - parent::__construct($namespace, $defaultLifetime); - $this->enableVersioning(); - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - } - /** - * @param array|string $servers - */ - public static function createConnection($servers, array $options = []) : \WP_Ultimo\Dependencies\CouchbaseBucket - { - if (\is_string($servers)) { - $servers = [$servers]; - } elseif (!\is_array($servers)) { - throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be array or string, "%s" given.', __METHOD__, \get_debug_type($servers))); - } - if (!static::isSupported()) { - throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.'); - } - \set_error_handler(function ($type, $msg, $file, $line) { - throw new \ErrorException($msg, 0, $type, $file, $line); - }); - $dsnPattern = '/^(?couchbase(?:s)?)\\:\\/\\/(?:(?[^\\:]+)\\:(?[^\\@]{6,})@)?' . '(?[^\\:]+(?:\\:\\d+)?)(?:\\/(?[^\\?]+))(?:\\?(?.*))?$/i'; - $newServers = []; - $protocol = 'couchbase'; - try { - $options = self::initOptions($options); - $username = $options['username']; - $password = $options['password']; - foreach ($servers as $dsn) { - if (0 !== \strpos($dsn, 'couchbase:')) { - throw new InvalidArgumentException(\sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $dsn)); - } - \preg_match($dsnPattern, $dsn, $matches); - $username = $matches['username'] ?: $username; - $password = $matches['password'] ?: $password; - $protocol = $matches['protocol'] ?: $protocol; - if (isset($matches['options'])) { - $optionsInDsn = self::getOptions($matches['options']); - foreach ($optionsInDsn as $parameter => $value) { - $options[$parameter] = $value; - } - } - $newServers[] = $matches['host']; - } - $connectionString = $protocol . '://' . \implode(',', $newServers); - $client = new \WP_Ultimo\Dependencies\CouchbaseCluster($connectionString); - $client->authenticateAs($username, $password); - $bucket = $client->openBucket($matches['bucketName']); - unset($options['username'], $options['password']); - foreach ($options as $option => $value) { - if (!empty($value)) { - $bucket->{$option} = $value; - } - } - return $bucket; - } finally { - \restore_error_handler(); - } - } - public static function isSupported() : bool - { - return \extension_loaded('couchbase') && \version_compare(\phpversion('couchbase'), '2.6.0', '>=') && \version_compare(\phpversion('couchbase'), '3.0', '<'); - } - private static function getOptions(string $options) : array - { - $results = []; - $optionsInArray = \explode('&', $options); - foreach ($optionsInArray as $option) { - [$key, $value] = \explode('=', $option); - if (\in_array($key, static::VALID_DSN_OPTIONS, \true)) { - $results[$key] = $value; - } - } - return $results; - } - private static function initOptions(array $options) : array - { - $options['username'] = $options['username'] ?? ''; - $options['password'] = $options['password'] ?? ''; - $options['operationTimeout'] = $options['operationTimeout'] ?? 0; - $options['configTimeout'] = $options['configTimeout'] ?? 0; - $options['configNodeTimeout'] = $options['configNodeTimeout'] ?? 0; - $options['n1qlTimeout'] = $options['n1qlTimeout'] ?? 0; - $options['httpTimeout'] = $options['httpTimeout'] ?? 0; - $options['configDelay'] = $options['configDelay'] ?? 0; - $options['htconfigIdleTimeout'] = $options['htconfigIdleTimeout'] ?? 0; - $options['durabilityInterval'] = $options['durabilityInterval'] ?? 0; - $options['durabilityTimeout'] = $options['durabilityTimeout'] ?? 0; - return $options; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - $resultsCouchbase = $this->bucket->get($ids); - $results = []; - foreach ($resultsCouchbase as $key => $value) { - if (null !== $value->error) { - continue; - } - $results[$key] = $this->marshaller->unmarshall($value->value); - } - return $results; - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) : bool - { - return \false !== $this->bucket->get($id); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) : bool - { - if ('' === $namespace) { - $this->bucket->manager()->flush(); - return \true; - } - return \false; - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) : bool - { - $results = $this->bucket->remove(\array_values($ids)); - foreach ($results as $key => $result) { - if (null !== $result->error && static::KEY_NOT_FOUND !== $result->error->getCode()) { - continue; - } - unset($results[$key]); - } - return 0 === \count($results); - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - if (!($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - $lifetime = $this->normalizeExpiry($lifetime); - $ko = []; - foreach ($values as $key => $value) { - $result = $this->bucket->upsert($key, $value, ['expiry' => $lifetime]); - if (null !== $result->error) { - $ko[$key] = $result; - } - } - return [] === $ko ? \true : $ko; - } - private function normalizeExpiry(int $expiry) : int - { - if ($expiry && $expiry > static::THIRTY_DAYS_IN_SECONDS) { - $expiry += \time(); - } - return $expiry; - } -} diff --git a/dependencies/symfony/cache/Adapter/CouchbaseCollectionAdapter.php b/dependencies/symfony/cache/Adapter/CouchbaseCollectionAdapter.php deleted file mode 100644 index 38f4208..0000000 --- a/dependencies/symfony/cache/Adapter/CouchbaseCollectionAdapter.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use Couchbase\Bucket; -use Couchbase\Cluster; -use Couchbase\ClusterOptions; -use Couchbase\Collection; -use Couchbase\DocumentNotFoundException; -use Couchbase\UpsertOptions; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -/** - * @author Antonio Jose Cerezo Aranda - */ -class CouchbaseCollectionAdapter extends AbstractAdapter -{ - private const MAX_KEY_LENGTH = 250; - /** @var Collection */ - private $connection; - private $marshaller; - public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) - { - if (!static::isSupported()) { - throw new CacheException('Couchbase >= 3.0.0 < 4.0.0 is required.'); - } - $this->maxIdLength = static::MAX_KEY_LENGTH; - $this->connection = $connection; - parent::__construct($namespace, $defaultLifetime); - $this->enableVersioning(); - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - } - /** - * @param array|string $dsn - * - * @return Bucket|Collection - */ - public static function createConnection($dsn, array $options = []) - { - if (\is_string($dsn)) { - $dsn = [$dsn]; - } elseif (!\is_array($dsn)) { - throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be array or string, "%s" given.', __METHOD__, \get_debug_type($dsn))); - } - if (!static::isSupported()) { - throw new CacheException('Couchbase >= 3.0.0 < 4.0.0 is required.'); - } - \set_error_handler(function ($type, $msg, $file, $line) : bool { - throw new \ErrorException($msg, 0, $type, $file, $line); - }); - $dsnPattern = '/^(?couchbase(?:s)?)\\:\\/\\/(?:(?[^\\:]+)\\:(?[^\\@]{6,})@)?' . '(?[^\\:]+(?:\\:\\d+)?)(?:\\/(?[^\\/\\?]+))(?:(?:\\/(?[^\\/]+))' . '(?:\\/(?[^\\/\\?]+)))?(?:\\/)?(?:\\?(?.*))?$/i'; - $newServers = []; - $protocol = 'couchbase'; - try { - $username = $options['username'] ?? ''; - $password = $options['password'] ?? ''; - foreach ($dsn as $server) { - if (0 !== \strpos($server, 'couchbase:')) { - throw new InvalidArgumentException(\sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $server)); - } - \preg_match($dsnPattern, $server, $matches); - $username = $matches['username'] ?: $username; - $password = $matches['password'] ?: $password; - $protocol = $matches['protocol'] ?: $protocol; - if (isset($matches['options'])) { - $optionsInDsn = self::getOptions($matches['options']); - foreach ($optionsInDsn as $parameter => $value) { - $options[$parameter] = $value; - } - } - $newServers[] = $matches['host']; - } - $option = isset($matches['options']) ? '?' . $matches['options'] : ''; - $connectionString = $protocol . '://' . \implode(',', $newServers) . $option; - $clusterOptions = new ClusterOptions(); - $clusterOptions->credentials($username, $password); - $client = new Cluster($connectionString, $clusterOptions); - $bucket = $client->bucket($matches['bucketName']); - $collection = $bucket->defaultCollection(); - if (!empty($matches['scopeName'])) { - $scope = $bucket->scope($matches['scopeName']); - $collection = $scope->collection($matches['collectionName']); - } - return $collection; - } finally { - \restore_error_handler(); - } - } - public static function isSupported() : bool - { - return \extension_loaded('couchbase') && \version_compare(\phpversion('couchbase'), '3.0.5', '>=') && \version_compare(\phpversion('couchbase'), '4.0', '<'); - } - private static function getOptions(string $options) : array - { - $results = []; - $optionsInArray = \explode('&', $options); - foreach ($optionsInArray as $option) { - [$key, $value] = \explode('=', $option); - $results[$key] = $value; - } - return $results; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) : array - { - $results = []; - foreach ($ids as $id) { - try { - $resultCouchbase = $this->connection->get($id); - } catch (DocumentNotFoundException $exception) { - continue; - } - $content = $resultCouchbase->value ?? $resultCouchbase->content(); - $results[$id] = $this->marshaller->unmarshall($content); - } - return $results; - } - /** - * {@inheritdoc} - */ - protected function doHave($id) : bool - { - return $this->connection->exists($id)->exists(); - } - /** - * {@inheritdoc} - */ - protected function doClear($namespace) : bool - { - return \false; - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) : bool - { - $idsErrors = []; - foreach ($ids as $id) { - try { - $result = $this->connection->remove($id); - if (null === $result->mutationToken()) { - $idsErrors[] = $id; - } - } catch (DocumentNotFoundException $exception) { - } - } - return 0 === \count($idsErrors); - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, $lifetime) - { - if (!($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - $upsertOptions = new UpsertOptions(); - $upsertOptions->expiry($lifetime); - $ko = []; - foreach ($values as $key => $value) { - try { - $this->connection->upsert($key, $value, $upsertOptions); - } catch (\Exception $exception) { - $ko[$key] = ''; - } - } - return [] === $ko ? \true : $ko; - } -} diff --git a/dependencies/symfony/cache/Adapter/DoctrineAdapter.php b/dependencies/symfony/cache/Adapter/DoctrineAdapter.php deleted file mode 100644 index 3436473..0000000 --- a/dependencies/symfony/cache/Adapter/DoctrineAdapter.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Doctrine\Common\Cache\CacheProvider; -use WP_Ultimo\Dependencies\Doctrine\Common\Cache\Psr6\CacheAdapter; -/** - * @author Nicolas Grekas - * - * @deprecated Since Symfony 5.4, use Doctrine\Common\Cache\Psr6\CacheAdapter instead - */ -class DoctrineAdapter extends AbstractAdapter -{ - private $provider; - public function __construct(CacheProvider $provider, string $namespace = '', int $defaultLifetime = 0) - { - trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "%s" instead.', __CLASS__, CacheAdapter::class); - parent::__construct('', $defaultLifetime); - $this->provider = $provider; - $provider->setNamespace($namespace); - } - /** - * {@inheritdoc} - */ - public function reset() - { - parent::reset(); - $this->provider->setNamespace($this->provider->getNamespace()); - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - $unserializeCallbackHandler = \ini_set('unserialize_callback_func', parent::class . '::handleUnserializeCallback'); - try { - return $this->provider->fetchMultiple($ids); - } catch (\Error $e) { - $trace = $e->getTrace(); - if (isset($trace[0]['function']) && !isset($trace[0]['class'])) { - switch ($trace[0]['function']) { - case 'unserialize': - case 'apcu_fetch': - case 'apc_fetch': - throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); - } - } - throw $e; - } finally { - \ini_set('unserialize_callback_func', $unserializeCallbackHandler); - } - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - return $this->provider->contains($id); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - $namespace = $this->provider->getNamespace(); - return isset($namespace[0]) ? $this->provider->deleteAll() : $this->provider->flushAll(); - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - $ok = \true; - foreach ($ids as $id) { - $ok = $this->provider->delete($id) && $ok; - } - return $ok; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - return $this->provider->saveMultiple($values, $lifetime); - } -} diff --git a/dependencies/symfony/cache/Adapter/DoctrineDbalAdapter.php b/dependencies/symfony/cache/Adapter/DoctrineDbalAdapter.php deleted file mode 100644 index 76504fc..0000000 --- a/dependencies/symfony/cache/Adapter/DoctrineDbalAdapter.php +++ /dev/null @@ -1,356 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Doctrine\DBAL\ArrayParameterType; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Configuration; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Connection; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Driver\ServerInfoAwareConnection; -use WP_Ultimo\Dependencies\Doctrine\DBAL\DriverManager; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Exception as DBALException; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Exception\TableNotFoundException; -use WP_Ultimo\Dependencies\Doctrine\DBAL\ParameterType; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Schema\Schema; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Tools\DsnParser; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface -{ - protected $maxIdLength = 255; - private $marshaller; - private $conn; - private $platformName; - private $serverVersion; - private $table = 'cache_items'; - private $idCol = 'item_id'; - private $dataCol = 'item_data'; - private $lifetimeCol = 'item_lifetime'; - private $timeCol = 'item_time'; - private $namespace; - /** - * You can either pass an existing database Doctrine DBAL Connection or - * a DSN string that will be used to connect to the database. - * - * The cache table is created automatically when possible. - * Otherwise, use the createTable() method. - * - * List of available options: - * * db_table: The name of the table [default: cache_items] - * * db_id_col: The column where to store the cache id [default: item_id] - * * db_data_col: The column where to store the cache data [default: item_data] - * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] - * * db_time_col: The column where to store the timestamp [default: item_time] - * - * @param Connection|string $connOrDsn - * - * @throws InvalidArgumentException When namespace contains invalid characters - */ - public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) - { - if (isset($namespace[0]) && \preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { - throw new InvalidArgumentException(\sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); - } - if ($connOrDsn instanceof Connection) { - $this->conn = $connOrDsn; - } elseif (\is_string($connOrDsn)) { - if (!\class_exists(DriverManager::class)) { - throw new InvalidArgumentException(\sprintf('Failed to parse the DSN "%s". Try running "composer require doctrine/dbal".', $connOrDsn)); - } - if (\class_exists(DsnParser::class)) { - $params = (new DsnParser(['db2' => 'ibm_db2', 'mssql' => 'pdo_sqlsrv', 'mysql' => 'pdo_mysql', 'mysql2' => 'pdo_mysql', 'postgres' => 'pdo_pgsql', 'postgresql' => 'pdo_pgsql', 'pgsql' => 'pdo_pgsql', 'sqlite' => 'pdo_sqlite', 'sqlite3' => 'pdo_sqlite']))->parse($connOrDsn); - } else { - $params = ['url' => $connOrDsn]; - } - $config = new Configuration(); - if (\class_exists(DefaultSchemaManagerFactory::class)) { - $config->setSchemaManagerFactory(new DefaultSchemaManagerFactory()); - } - $this->conn = DriverManager::getConnection($params, $config); - } else { - throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be "%s" or string, "%s" given.', __METHOD__, Connection::class, \get_debug_type($connOrDsn))); - } - $this->table = $options['db_table'] ?? $this->table; - $this->idCol = $options['db_id_col'] ?? $this->idCol; - $this->dataCol = $options['db_data_col'] ?? $this->dataCol; - $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; - $this->timeCol = $options['db_time_col'] ?? $this->timeCol; - $this->namespace = $namespace; - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - parent::__construct($namespace, $defaultLifetime); - } - /** - * Creates the table to store cache items which can be called once for setup. - * - * Cache ID are saved in a column of maximum length 255. Cache data is - * saved in a BLOB. - * - * @throws DBALException When the table already exists - */ - public function createTable() - { - $schema = new Schema(); - $this->addTableToSchema($schema); - foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) { - $this->conn->executeStatement($sql); - } - } - /** - * {@inheritdoc} - */ - public function configureSchema(Schema $schema, Connection $forConnection) : void - { - // only update the schema for this connection - if ($forConnection !== $this->conn) { - return; - } - if ($schema->hasTable($this->table)) { - return; - } - $this->addTableToSchema($schema); - } - /** - * {@inheritdoc} - */ - public function prune() : bool - { - $deleteSql = "DELETE FROM {$this->table} WHERE {$this->lifetimeCol} + {$this->timeCol} <= ?"; - $params = [\time()]; - $paramTypes = [ParameterType::INTEGER]; - if ('' !== $this->namespace) { - $deleteSql .= " AND {$this->idCol} LIKE ?"; - $params[] = \sprintf('%s%%', $this->namespace); - $paramTypes[] = ParameterType::STRING; - } - try { - $this->conn->executeStatement($deleteSql, $params, $paramTypes); - } catch (TableNotFoundException $e) { - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) : iterable - { - $now = \time(); - $expired = []; - $sql = "SELECT {$this->idCol}, CASE WHEN {$this->lifetimeCol} IS NULL OR {$this->lifetimeCol} + {$this->timeCol} > ? THEN {$this->dataCol} ELSE NULL END FROM {$this->table} WHERE {$this->idCol} IN (?)"; - $result = $this->conn->executeQuery($sql, [$now, $ids], [ParameterType::INTEGER, \class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY])->iterateNumeric(); - foreach ($result as $row) { - if (null === $row[1]) { - $expired[] = $row[0]; - } else { - (yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? \stream_get_contents($row[1]) : $row[1])); - } - } - if ($expired) { - $sql = "DELETE FROM {$this->table} WHERE {$this->lifetimeCol} + {$this->timeCol} <= ? AND {$this->idCol} IN (?)"; - $this->conn->executeStatement($sql, [$now, $expired], [ParameterType::INTEGER, \class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY]); - } - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) : bool - { - $sql = "SELECT 1 FROM {$this->table} WHERE {$this->idCol} = ? AND ({$this->lifetimeCol} IS NULL OR {$this->lifetimeCol} + {$this->timeCol} > ?)"; - $result = $this->conn->executeQuery($sql, [$id, \time()], [ParameterType::STRING, ParameterType::INTEGER]); - return (bool) $result->fetchOne(); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) : bool - { - if ('' === $namespace) { - if ('sqlite' === $this->getPlatformName()) { - $sql = "DELETE FROM {$this->table}"; - } else { - $sql = "TRUNCATE TABLE {$this->table}"; - } - } else { - $sql = "DELETE FROM {$this->table} WHERE {$this->idCol} LIKE '{$namespace}%'"; - } - try { - $this->conn->executeStatement($sql); - } catch (TableNotFoundException $e) { - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) : bool - { - $sql = "DELETE FROM {$this->table} WHERE {$this->idCol} IN (?)"; - try { - $this->conn->executeStatement($sql, [\array_values($ids)], [\class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY]); - } catch (TableNotFoundException $e) { - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - if (!($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - $platformName = $this->getPlatformName(); - $insertSql = "INSERT INTO {$this->table} ({$this->idCol}, {$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) VALUES (?, ?, ?, ?)"; - switch (\true) { - case 'mysql' === $platformName: - $sql = $insertSql . " ON DUPLICATE KEY UPDATE {$this->dataCol} = VALUES({$this->dataCol}), {$this->lifetimeCol} = VALUES({$this->lifetimeCol}), {$this->timeCol} = VALUES({$this->timeCol})"; - break; - case 'oci' === $platformName: - // DUAL is Oracle specific dummy table - $sql = "MERGE INTO {$this->table} USING DUAL ON ({$this->idCol} = ?) " . "WHEN NOT MATCHED THEN INSERT ({$this->idCol}, {$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) VALUES (?, ?, ?, ?) " . "WHEN MATCHED THEN UPDATE SET {$this->dataCol} = ?, {$this->lifetimeCol} = ?, {$this->timeCol} = ?"; - break; - case 'sqlsrv' === $platformName && \version_compare($this->getServerVersion(), '10', '>='): - // MERGE is only available since SQL Server 2008 and must be terminated by semicolon - // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx - $sql = "MERGE INTO {$this->table} WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ({$this->idCol} = ?) " . "WHEN NOT MATCHED THEN INSERT ({$this->idCol}, {$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) VALUES (?, ?, ?, ?) " . "WHEN MATCHED THEN UPDATE SET {$this->dataCol} = ?, {$this->lifetimeCol} = ?, {$this->timeCol} = ?;"; - break; - case 'sqlite' === $platformName: - $sql = 'INSERT OR REPLACE' . \substr($insertSql, 6); - break; - case 'pgsql' === $platformName && \version_compare($this->getServerVersion(), '9.5', '>='): - $sql = $insertSql . " ON CONFLICT ({$this->idCol}) DO UPDATE SET ({$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) = (EXCLUDED.{$this->dataCol}, EXCLUDED.{$this->lifetimeCol}, EXCLUDED.{$this->timeCol})"; - break; - default: - $platformName = null; - $sql = "UPDATE {$this->table} SET {$this->dataCol} = ?, {$this->lifetimeCol} = ?, {$this->timeCol} = ? WHERE {$this->idCol} = ?"; - break; - } - $now = \time(); - $lifetime = $lifetime ?: null; - try { - $stmt = $this->conn->prepare($sql); - } catch (TableNotFoundException $e) { - if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], \true)) { - $this->createTable(); - } - $stmt = $this->conn->prepare($sql); - } - if ('sqlsrv' === $platformName || 'oci' === $platformName) { - $bind = static function ($id, $data) use($stmt) { - $stmt->bindValue(1, $id); - $stmt->bindValue(2, $id); - $stmt->bindValue(3, $data, ParameterType::LARGE_OBJECT); - $stmt->bindValue(6, $data, ParameterType::LARGE_OBJECT); - }; - $stmt->bindValue(4, $lifetime, ParameterType::INTEGER); - $stmt->bindValue(5, $now, ParameterType::INTEGER); - $stmt->bindValue(7, $lifetime, ParameterType::INTEGER); - $stmt->bindValue(8, $now, ParameterType::INTEGER); - } elseif (null !== $platformName) { - $bind = static function ($id, $data) use($stmt) { - $stmt->bindValue(1, $id); - $stmt->bindValue(2, $data, ParameterType::LARGE_OBJECT); - }; - $stmt->bindValue(3, $lifetime, ParameterType::INTEGER); - $stmt->bindValue(4, $now, ParameterType::INTEGER); - } else { - $stmt->bindValue(2, $lifetime, ParameterType::INTEGER); - $stmt->bindValue(3, $now, ParameterType::INTEGER); - $insertStmt = $this->conn->prepare($insertSql); - $insertStmt->bindValue(3, $lifetime, ParameterType::INTEGER); - $insertStmt->bindValue(4, $now, ParameterType::INTEGER); - $bind = static function ($id, $data) use($stmt, $insertStmt) { - $stmt->bindValue(1, $data, ParameterType::LARGE_OBJECT); - $stmt->bindValue(4, $id); - $insertStmt->bindValue(1, $id); - $insertStmt->bindValue(2, $data, ParameterType::LARGE_OBJECT); - }; - } - foreach ($values as $id => $data) { - $bind($id, $data); - try { - $rowCount = $stmt->executeStatement(); - } catch (TableNotFoundException $e) { - if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], \true)) { - $this->createTable(); - } - $rowCount = $stmt->executeStatement(); - } - if (null === $platformName && 0 === $rowCount) { - try { - $insertStmt->executeStatement(); - } catch (DBALException $e) { - // A concurrent write won, let it be - } - } - } - return $failed; - } - /** - * @internal - */ - protected function getId($key) - { - if ('pgsql' !== $this->getPlatformName()) { - return parent::getId($key); - } - if (\str_contains($key, "\x00") || \str_contains($key, '%') || !\preg_match('//u', $key)) { - $key = \rawurlencode($key); - } - return parent::getId($key); - } - private function getPlatformName() : string - { - if (isset($this->platformName)) { - return $this->platformName; - } - $platform = $this->conn->getDatabasePlatform(); - switch (\true) { - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\MySQLPlatform: - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\MySQL57Platform: - return $this->platformName = 'mysql'; - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\SqlitePlatform: - return $this->platformName = 'sqlite'; - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\PostgreSQLPlatform: - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\PostgreSQL94Platform: - return $this->platformName = 'pgsql'; - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\OraclePlatform: - return $this->platformName = 'oci'; - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\SQLServerPlatform: - case $platform instanceof \WP_Ultimo\Dependencies\Doctrine\DBAL\Platforms\SQLServer2012Platform: - return $this->platformName = 'sqlsrv'; - default: - return $this->platformName = \get_class($platform); - } - } - private function getServerVersion() : string - { - if (isset($this->serverVersion)) { - return $this->serverVersion; - } - $conn = $this->conn->getWrappedConnection(); - if ($conn instanceof ServerInfoAwareConnection) { - return $this->serverVersion = $conn->getServerVersion(); - } - return $this->serverVersion = '0'; - } - private function addTableToSchema(Schema $schema) : void - { - $types = ['mysql' => 'binary', 'sqlite' => 'text']; - $table = $schema->createTable($this->table); - $table->addColumn($this->idCol, $types[$this->getPlatformName()] ?? 'string', ['length' => 255]); - $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]); - $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => \true, 'notnull' => \false]); - $table->addColumn($this->timeCol, 'integer', ['unsigned' => \true]); - $table->setPrimaryKey([$this->idCol]); - } -} diff --git a/dependencies/symfony/cache/Adapter/FilesystemAdapter.php b/dependencies/symfony/cache/Adapter/FilesystemAdapter.php deleted file mode 100644 index ac31043..0000000 --- a/dependencies/symfony/cache/Adapter/FilesystemAdapter.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\FilesystemTrait; -class FilesystemAdapter extends AbstractAdapter implements PruneableInterface -{ - use FilesystemTrait; - public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null) - { - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - parent::__construct('', $defaultLifetime); - $this->init($namespace, $directory); - } -} diff --git a/dependencies/symfony/cache/Adapter/FilesystemTagAwareAdapter.php b/dependencies/symfony/cache/Adapter/FilesystemTagAwareAdapter.php deleted file mode 100644 index 0609be0..0000000 --- a/dependencies/symfony/cache/Adapter/FilesystemTagAwareAdapter.php +++ /dev/null @@ -1,205 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\TagAwareMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\FilesystemTrait; -/** - * Stores tag id <> cache id relationship as a symlink, and lookup on invalidation calls. - * - * @author Nicolas Grekas - * @author André Rømcke - */ -class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface -{ - use FilesystemTrait { - doClear as private doClearCache; - doSave as private doSaveCache; - } - /** - * Folder used for tag symlinks. - */ - private const TAG_FOLDER = 'tags'; - public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null) - { - $this->marshaller = new TagAwareMarshaller($marshaller); - parent::__construct('', $defaultLifetime); - $this->init($namespace, $directory); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - $ok = $this->doClearCache($namespace); - if ('' !== $namespace) { - return $ok; - } - \set_error_handler(static function () { - }); - $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - try { - foreach ($this->scanHashDir($this->directory . self::TAG_FOLDER . \DIRECTORY_SEPARATOR) as $dir) { - if (\rename($dir, $renamed = \substr_replace($dir, \bin2hex(\random_bytes(4)), -8))) { - $dir = $renamed . \DIRECTORY_SEPARATOR; - } else { - $dir .= \DIRECTORY_SEPARATOR; - $renamed = null; - } - for ($i = 0; $i < 38; ++$i) { - if (!\is_dir($dir . $chars[$i])) { - continue; - } - for ($j = 0; $j < 38; ++$j) { - if (!\is_dir($d = $dir . $chars[$i] . \DIRECTORY_SEPARATOR . $chars[$j])) { - continue; - } - foreach (\scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) { - if ('.' !== $link && '..' !== $link && (null !== $renamed || !\realpath($d . \DIRECTORY_SEPARATOR . $link))) { - \unlink($d . \DIRECTORY_SEPARATOR . $link); - } - } - null === $renamed ?: \rmdir($d); - } - null === $renamed ?: \rmdir($dir . $chars[$i]); - } - null === $renamed ?: \rmdir($renamed); - } - } finally { - \restore_error_handler(); - } - return $ok; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []) : array - { - $failed = $this->doSaveCache($values, $lifetime); - // Add Tags as symlinks - foreach ($addTagData as $tagId => $ids) { - $tagFolder = $this->getTagFolder($tagId); - foreach ($ids as $id) { - if ($failed && \in_array($id, $failed, \true)) { - continue; - } - $file = $this->getFile($id); - if (!@\symlink($file, $tagLink = $this->getFile($id, \true, $tagFolder)) && !\is_link($tagLink)) { - @\unlink($file); - $failed[] = $id; - } - } - } - // Unlink removed Tags - foreach ($removeTagData as $tagId => $ids) { - $tagFolder = $this->getTagFolder($tagId); - foreach ($ids as $id) { - if ($failed && \in_array($id, $failed, \true)) { - continue; - } - @\unlink($this->getFile($id, \false, $tagFolder)); - } - } - return $failed; - } - /** - * {@inheritdoc} - */ - protected function doDeleteYieldTags(array $ids) : iterable - { - foreach ($ids as $id) { - $file = $this->getFile($id); - if (!\is_file($file) || !($h = @\fopen($file, 'r'))) { - continue; - } - if ((\PHP_VERSION_ID >= 70300 || '\\' !== \DIRECTORY_SEPARATOR) && !@\unlink($file)) { - \fclose($h); - continue; - } - $meta = \explode("\n", \fread($h, 4096), 3)[2] ?? ''; - // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F - if (13 < \strlen($meta) && "\x9d" === $meta[0] && "\x00" === $meta[5] && "_" === $meta[9]) { - $meta[9] = "\x00"; - $tagLen = \unpack('Nlen', $meta, 9)['len']; - $meta = \substr($meta, 13, $tagLen); - if (0 < ($tagLen -= \strlen($meta))) { - $meta .= \fread($h, $tagLen); - } - try { - (yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta)); - } catch (\Exception $e) { - (yield $id => []); - } - } - \fclose($h); - if (\PHP_VERSION_ID < 70300 && '\\' === \DIRECTORY_SEPARATOR) { - @\unlink($file); - } - } - } - /** - * {@inheritdoc} - */ - protected function doDeleteTagRelations(array $tagData) : bool - { - foreach ($tagData as $tagId => $idList) { - $tagFolder = $this->getTagFolder($tagId); - foreach ($idList as $id) { - @\unlink($this->getFile($id, \false, $tagFolder)); - } - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doInvalidate(array $tagIds) : bool - { - foreach ($tagIds as $tagId) { - if (!\is_dir($tagFolder = $this->getTagFolder($tagId))) { - continue; - } - \set_error_handler(static function () { - }); - try { - if (\rename($tagFolder, $renamed = \substr_replace($tagFolder, \bin2hex(\random_bytes(4)), -9))) { - $tagFolder = $renamed . \DIRECTORY_SEPARATOR; - } else { - $renamed = null; - } - foreach ($this->scanHashDir($tagFolder) as $itemLink) { - \unlink(\realpath($itemLink) ?: $itemLink); - \unlink($itemLink); - } - if (null === $renamed) { - continue; - } - $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - for ($i = 0; $i < 38; ++$i) { - for ($j = 0; $j < 38; ++$j) { - \rmdir($tagFolder . $chars[$i] . \DIRECTORY_SEPARATOR . $chars[$j]); - } - \rmdir($tagFolder . $chars[$i]); - } - \rmdir($renamed); - } finally { - \restore_error_handler(); - } - } - return \true; - } - private function getTagFolder(string $tagId) : string - { - return $this->getFile($tagId, \false, $this->directory . self::TAG_FOLDER . \DIRECTORY_SEPARATOR) . \DIRECTORY_SEPARATOR; - } -} diff --git a/dependencies/symfony/cache/Adapter/MemcachedAdapter.php b/dependencies/symfony/cache/Adapter/MemcachedAdapter.php deleted file mode 100644 index 3462bea..0000000 --- a/dependencies/symfony/cache/Adapter/MemcachedAdapter.php +++ /dev/null @@ -1,303 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -/** - * @author Rob Frawley 2nd - * @author Nicolas Grekas - */ -class MemcachedAdapter extends AbstractAdapter -{ - /** - * We are replacing characters that are illegal in Memcached keys with reserved characters from - * {@see \Symfony\Contracts\Cache\ItemInterface::RESERVED_CHARACTERS} that are legal in Memcached. - * Note: don’t use {@see \Symfony\Component\Cache\Adapter\AbstractAdapter::NS_SEPARATOR}. - */ - private const RESERVED_MEMCACHED = " \n\r\t\v\f\x00"; - private const RESERVED_PSR6 = '@()\\{}/'; - protected $maxIdLength = 250; - private $marshaller; - private $client; - private $lazyClient; - /** - * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged. - * Using a RedisAdapter is recommended instead. If you cannot do otherwise, be aware that: - * - the Memcached::OPT_BINARY_PROTOCOL must be enabled - * (that's the default when using MemcachedAdapter::createConnection()); - * - tags eviction by Memcached's LRU algorithm will break by-tags invalidation; - * your Memcached memory should be large enough to never trigger LRU. - * - * Using a MemcachedAdapter as a pure items store is fine. - */ - public function __construct(\Memcached $client, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) - { - if (!static::isSupported()) { - throw new CacheException('Memcached ' . (\PHP_VERSION_ID >= 80100 ? '> 3.1.5' : '>= 2.2.0') . ' is required.'); - } - if ('Memcached' === \get_class($client)) { - $opt = $client->getOption(\Memcached::OPT_SERIALIZER); - if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) { - throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".'); - } - $this->maxIdLength -= \strlen($client->getOption(\Memcached::OPT_PREFIX_KEY)); - $this->client = $client; - } else { - $this->lazyClient = $client; - } - parent::__construct($namespace, $defaultLifetime); - $this->enableVersioning(); - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - } - public static function isSupported() - { - return \extension_loaded('memcached') && \version_compare(\phpversion('memcached'), \PHP_VERSION_ID >= 80100 ? '3.1.6' : '2.2.0', '>='); - } - /** - * Creates a Memcached instance. - * - * By default, the binary protocol, no block, and libketama compatible options are enabled. - * - * Examples for servers: - * - 'memcached://user:pass@localhost?weight=33' - * - [['localhost', 11211, 33]] - * - * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs - * - * @return \Memcached - * - * @throws \ErrorException When invalid options or servers are provided - */ - public static function createConnection($servers, array $options = []) - { - if (\is_string($servers)) { - $servers = [$servers]; - } elseif (!\is_array($servers)) { - throw new InvalidArgumentException(\sprintf('MemcachedAdapter::createClient() expects array or string as first argument, "%s" given.', \get_debug_type($servers))); - } - if (!static::isSupported()) { - throw new CacheException('Memcached ' . (\PHP_VERSION_ID >= 80100 ? '> 3.1.5' : '>= 2.2.0') . ' is required.'); - } - \set_error_handler(function ($type, $msg, $file, $line) { - throw new \ErrorException($msg, 0, $type, $file, $line); - }); - try { - $client = new \Memcached($options['persistent_id'] ?? null); - $username = $options['username'] ?? null; - $password = $options['password'] ?? null; - // parse any DSN in $servers - foreach ($servers as $i => $dsn) { - if (\is_array($dsn)) { - continue; - } - if (!\str_starts_with($dsn, 'memcached:')) { - throw new InvalidArgumentException(\sprintf('Invalid Memcached DSN: "%s" does not start with "memcached:".', $dsn)); - } - $params = \preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use(&$username, &$password) { - if (!empty($m[2])) { - [$username, $password] = \explode(':', $m[2], 2) + [1 => null]; - } - return 'file:' . ($m[1] ?? ''); - }, $dsn); - if (\false === ($params = \parse_url($params))) { - throw new InvalidArgumentException(\sprintf('Invalid Memcached DSN: "%s".', $dsn)); - } - $query = $hosts = []; - if (isset($params['query'])) { - \parse_str($params['query'], $query); - if (isset($query['host'])) { - if (!\is_array($hosts = $query['host'])) { - throw new InvalidArgumentException(\sprintf('Invalid Memcached DSN: "%s".', $dsn)); - } - foreach ($hosts as $host => $weight) { - if (\false === ($port = \strrpos($host, ':'))) { - $hosts[$host] = [$host, 11211, (int) $weight]; - } else { - $hosts[$host] = [\substr($host, 0, $port), (int) \substr($host, 1 + $port), (int) $weight]; - } - } - $hosts = \array_values($hosts); - unset($query['host']); - } - if ($hosts && !isset($params['host']) && !isset($params['path'])) { - unset($servers[$i]); - $servers = \array_merge($servers, $hosts); - continue; - } - } - if (!isset($params['host']) && !isset($params['path'])) { - throw new InvalidArgumentException(\sprintf('Invalid Memcached DSN: "%s".', $dsn)); - } - if (isset($params['path']) && \preg_match('#/(\\d+)$#', $params['path'], $m)) { - $params['weight'] = $m[1]; - $params['path'] = \substr($params['path'], 0, -\strlen($m[0])); - } - $params += ['host' => $params['host'] ?? $params['path'], 'port' => isset($params['host']) ? 11211 : null, 'weight' => 0]; - if ($query) { - $params += $query; - $options = $query + $options; - } - $servers[$i] = [$params['host'], $params['port'], $params['weight']]; - if ($hosts) { - $servers = \array_merge($servers, $hosts); - } - } - // set client's options - unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']); - $options = \array_change_key_case($options, \CASE_UPPER); - $client->setOption(\Memcached::OPT_BINARY_PROTOCOL, \true); - $client->setOption(\Memcached::OPT_NO_BLOCK, \true); - $client->setOption(\Memcached::OPT_TCP_NODELAY, \true); - if (!\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) { - $client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, \true); - } - foreach ($options as $name => $value) { - if (\is_int($name)) { - continue; - } - if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) { - $value = \constant('Memcached::' . $name . '_' . \strtoupper($value)); - } - unset($options[$name]); - if (\defined('Memcached::OPT_' . $name)) { - $options[\constant('Memcached::OPT_' . $name)] = $value; - } - } - $client->setOptions($options + [\Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP]); - // set client's servers, taking care of persistent connections - if (!$client->isPristine()) { - $oldServers = []; - foreach ($client->getServerList() as $server) { - $oldServers[] = [$server['host'], $server['port']]; - } - $newServers = []; - foreach ($servers as $server) { - if (1 < \count($server)) { - $server = \array_values($server); - unset($server[2]); - $server[1] = (int) $server[1]; - } - $newServers[] = $server; - } - if ($oldServers !== $newServers) { - $client->resetServerList(); - $client->addServers($servers); - } - } else { - $client->addServers($servers); - } - if (null !== $username || null !== $password) { - if (!\method_exists($client, 'setSaslAuthData')) { - \trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.'); - } - $client->setSaslAuthData($username, $password); - } - return $client; - } finally { - \restore_error_handler(); - } - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - if (!($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - if ($lifetime && $lifetime > 30 * 86400) { - $lifetime += \time(); - } - $encodedValues = []; - foreach ($values as $key => $value) { - $encodedValues[self::encodeKey($key)] = $value; - } - return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : \false; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - try { - $encodedIds = \array_map([__CLASS__, 'encodeKey'], $ids); - $encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds)); - $result = []; - foreach ($encodedResult as $key => $value) { - $result[self::decodeKey($key)] = $this->marshaller->unmarshall($value); - } - return $result; - } catch (\Error $e) { - throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); - } - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - return \false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode()); - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - $ok = \true; - $encodedIds = \array_map([__CLASS__, 'encodeKey'], $ids); - foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) { - if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) { - $ok = \false; - } - } - return $ok; - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - return '' === $namespace && $this->getClient()->flush(); - } - private function checkResultCode($result) - { - $code = $this->client->getResultCode(); - if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) { - return $result; - } - throw new CacheException('MemcachedAdapter client error: ' . \strtolower($this->client->getResultMessage())); - } - private function getClient() : \Memcached - { - if ($this->client) { - return $this->client; - } - $opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER); - if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) { - throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".'); - } - if ('' !== ($prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY))) { - throw new CacheException(\sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix)); - } - return $this->client = $this->lazyClient; - } - private static function encodeKey(string $key) : string - { - return \strtr($key, self::RESERVED_MEMCACHED, self::RESERVED_PSR6); - } - private static function decodeKey(string $key) : string - { - return \strtr($key, self::RESERVED_PSR6, self::RESERVED_MEMCACHED); - } -} diff --git a/dependencies/symfony/cache/Adapter/NullAdapter.php b/dependencies/symfony/cache/Adapter/NullAdapter.php deleted file mode 100644 index 95ed6fa..0000000 --- a/dependencies/symfony/cache/Adapter/NullAdapter.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -/** - * @author Titouan Galopin - */ -class NullAdapter implements AdapterInterface, CacheInterface -{ - private static $createCacheItem; - public function __construct() - { - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key) { - $item = new CacheItem(); - $item->key = $key; - $item->isHit = \false; - return $item; - }, null, CacheItem::class)); - } - /** - * {@inheritdoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - $save = \true; - return $callback((self::$createCacheItem)($key), $save); - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - return (self::$createCacheItem)($key); - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - return $this->generateItems($keys); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - return \false; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - return \true; - } - /** - * {@inheritdoc} - */ - public function delete(string $key) : bool - { - return $this->deleteItem($key); - } - private function generateItems(array $keys) : \Generator - { - $f = self::$createCacheItem; - foreach ($keys as $key) { - (yield $key => $f($key)); - } - } -} diff --git a/dependencies/symfony/cache/Adapter/ParameterNormalizer.php b/dependencies/symfony/cache/Adapter/ParameterNormalizer.php deleted file mode 100644 index bb3ddf7..0000000 --- a/dependencies/symfony/cache/Adapter/ParameterNormalizer.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -/** - * @author Lars Strojny - */ -final class ParameterNormalizer -{ - public static function normalizeDuration(string $duration) : int - { - if (\is_numeric($duration)) { - return $duration; - } - if (\false !== ($time = \strtotime($duration, 0))) { - return $time; - } - try { - return \DateTime::createFromFormat('U', 0)->add(new \DateInterval($duration))->getTimestamp(); - } catch (\Exception $e) { - throw new \InvalidArgumentException(\sprintf('Cannot parse date interval "%s".', $duration), 0, $e); - } - } -} diff --git a/dependencies/symfony/cache/Adapter/PdoAdapter.php b/dependencies/symfony/cache/Adapter/PdoAdapter.php deleted file mode 100644 index b4d8194..0000000 --- a/dependencies/symfony/cache/Adapter/PdoAdapter.php +++ /dev/null @@ -1,512 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Doctrine\DBAL\Connection; -use WP_Ultimo\Dependencies\Doctrine\DBAL\Schema\Schema; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -class PdoAdapter extends AbstractAdapter implements PruneableInterface -{ - protected $maxIdLength = 255; - private $marshaller; - private $conn; - private $dsn; - private $driver; - private $serverVersion; - private $table = 'cache_items'; - private $idCol = 'item_id'; - private $dataCol = 'item_data'; - private $lifetimeCol = 'item_lifetime'; - private $timeCol = 'item_time'; - private $username = ''; - private $password = ''; - private $connectionOptions = []; - private $namespace; - private $dbalAdapter; - /** - * You can either pass an existing database connection as PDO instance or - * a DSN string that will be used to lazy-connect to the database when the - * cache is actually used. - * - * List of available options: - * * db_table: The name of the table [default: cache_items] - * * db_id_col: The column where to store the cache id [default: item_id] - * * db_data_col: The column where to store the cache data [default: item_data] - * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] - * * db_time_col: The column where to store the timestamp [default: item_time] - * * db_username: The username when lazy-connect [default: ''] - * * db_password: The password when lazy-connect [default: ''] - * * db_connection_options: An array of driver-specific connection options [default: []] - * - * @param \PDO|string $connOrDsn - * - * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string - * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION - * @throws InvalidArgumentException When namespace contains invalid characters - */ - public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) - { - if ($connOrDsn instanceof Connection || \is_string($connOrDsn) && \str_contains($connOrDsn, '://')) { - trigger_deprecation('symfony/cache', '5.4', 'Usage of a DBAL Connection with "%s" is deprecated and will be removed in symfony 6.0. Use "%s" instead.', __CLASS__, DoctrineDbalAdapter::class); - $this->dbalAdapter = new DoctrineDbalAdapter($connOrDsn, $namespace, $defaultLifetime, $options, $marshaller); - return; - } - if (isset($namespace[0]) && \preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { - throw new InvalidArgumentException(\sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); - } - if ($connOrDsn instanceof \PDO) { - if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) { - throw new InvalidArgumentException(\sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__)); - } - $this->conn = $connOrDsn; - } elseif (\is_string($connOrDsn)) { - $this->dsn = $connOrDsn; - } else { - throw new InvalidArgumentException(\sprintf('"%s" requires PDO or Doctrine\\DBAL\\Connection instance or DSN string as first argument, "%s" given.', __CLASS__, \get_debug_type($connOrDsn))); - } - $this->table = $options['db_table'] ?? $this->table; - $this->idCol = $options['db_id_col'] ?? $this->idCol; - $this->dataCol = $options['db_data_col'] ?? $this->dataCol; - $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; - $this->timeCol = $options['db_time_col'] ?? $this->timeCol; - $this->username = $options['db_username'] ?? $this->username; - $this->password = $options['db_password'] ?? $this->password; - $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions; - $this->namespace = $namespace; - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - parent::__construct($namespace, $defaultLifetime); - } - /** - * {@inheritDoc} - */ - public function getItem($key) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->getItem($key); - } - return parent::getItem($key); - } - /** - * {@inheritDoc} - */ - public function getItems(array $keys = []) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->getItems($keys); - } - return parent::getItems($keys); - } - /** - * {@inheritDoc} - */ - public function hasItem($key) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->hasItem($key); - } - return parent::hasItem($key); - } - /** - * {@inheritDoc} - */ - public function deleteItem($key) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->deleteItem($key); - } - return parent::deleteItem($key); - } - /** - * {@inheritDoc} - */ - public function deleteItems(array $keys) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->deleteItems($keys); - } - return parent::deleteItems($keys); - } - /** - * {@inheritDoc} - */ - public function clear(string $prefix = '') - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->clear($prefix); - } - return parent::clear($prefix); - } - /** - * {@inheritDoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->get($key, $callback, $beta, $metadata); - } - return parent::get($key, $callback, $beta, $metadata); - } - /** - * {@inheritDoc} - */ - public function delete(string $key) : bool - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->delete($key); - } - return parent::delete($key); - } - /** - * {@inheritDoc} - */ - public function save(CacheItemInterface $item) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->save($item); - } - return parent::save($item); - } - /** - * {@inheritDoc} - */ - public function saveDeferred(CacheItemInterface $item) - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->saveDeferred($item); - } - return parent::saveDeferred($item); - } - /** - * {@inheritDoc} - */ - public function setLogger(LoggerInterface $logger) : void - { - if (isset($this->dbalAdapter)) { - $this->dbalAdapter->setLogger($logger); - return; - } - parent::setLogger($logger); - } - /** - * {@inheritDoc} - */ - public function commit() - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->commit(); - } - return parent::commit(); - } - /** - * {@inheritDoc} - */ - public function reset() - { - if (isset($this->dbalAdapter)) { - $this->dbalAdapter->reset(); - return; - } - parent::reset(); - } - /** - * Creates the table to store cache items which can be called once for setup. - * - * Cache ID are saved in a column of maximum length 255. Cache data is - * saved in a BLOB. - * - * @throws \PDOException When the table already exists - * @throws \DomainException When an unsupported PDO driver is used - */ - public function createTable() - { - if (isset($this->dbalAdapter)) { - $this->dbalAdapter->createTable(); - return; - } - // connect if we are not yet - $conn = $this->getConnection(); - switch ($this->driver) { - case 'mysql': - // We use varbinary for the ID column because it prevents unwanted conversions: - // - character set conversions between server and client - // - trailing space removal - // - case-insensitivity - // - language processing like é == e - $sql = "CREATE TABLE {$this->table} ({$this->idCol} VARBINARY(255) NOT NULL PRIMARY KEY, {$this->dataCol} MEDIUMBLOB NOT NULL, {$this->lifetimeCol} INTEGER UNSIGNED, {$this->timeCol} INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB"; - break; - case 'sqlite': - $sql = "CREATE TABLE {$this->table} ({$this->idCol} TEXT NOT NULL PRIMARY KEY, {$this->dataCol} BLOB NOT NULL, {$this->lifetimeCol} INTEGER, {$this->timeCol} INTEGER NOT NULL)"; - break; - case 'pgsql': - $sql = "CREATE TABLE {$this->table} ({$this->idCol} VARCHAR(255) NOT NULL PRIMARY KEY, {$this->dataCol} BYTEA NOT NULL, {$this->lifetimeCol} INTEGER, {$this->timeCol} INTEGER NOT NULL)"; - break; - case 'oci': - $sql = "CREATE TABLE {$this->table} ({$this->idCol} VARCHAR2(255) NOT NULL PRIMARY KEY, {$this->dataCol} BLOB NOT NULL, {$this->lifetimeCol} INTEGER, {$this->timeCol} INTEGER NOT NULL)"; - break; - case 'sqlsrv': - $sql = "CREATE TABLE {$this->table} ({$this->idCol} VARCHAR(255) NOT NULL PRIMARY KEY, {$this->dataCol} VARBINARY(MAX) NOT NULL, {$this->lifetimeCol} INTEGER, {$this->timeCol} INTEGER NOT NULL)"; - break; - default: - throw new \DomainException(\sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver)); - } - $conn->exec($sql); - } - /** - * Adds the Table to the Schema if the adapter uses this Connection. - * - * @deprecated since symfony/cache 5.4 use DoctrineDbalAdapter instead - */ - public function configureSchema(Schema $schema, Connection $forConnection) : void - { - if (isset($this->dbalAdapter)) { - $this->dbalAdapter->configureSchema($schema, $forConnection); - } - } - /** - * {@inheritdoc} - */ - public function prune() - { - if (isset($this->dbalAdapter)) { - return $this->dbalAdapter->prune(); - } - $deleteSql = "DELETE FROM {$this->table} WHERE {$this->lifetimeCol} + {$this->timeCol} <= :time"; - if ('' !== $this->namespace) { - $deleteSql .= " AND {$this->idCol} LIKE :namespace"; - } - $connection = $this->getConnection(); - try { - $delete = $connection->prepare($deleteSql); - } catch (\PDOException $e) { - return \true; - } - $delete->bindValue(':time', \time(), \PDO::PARAM_INT); - if ('' !== $this->namespace) { - $delete->bindValue(':namespace', \sprintf('%s%%', $this->namespace), \PDO::PARAM_STR); - } - try { - return $delete->execute(); - } catch (\PDOException $e) { - return \true; - } - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - $connection = $this->getConnection(); - $now = \time(); - $expired = []; - $sql = \str_pad('', (\count($ids) << 1) - 1, '?,'); - $sql = "SELECT {$this->idCol}, CASE WHEN {$this->lifetimeCol} IS NULL OR {$this->lifetimeCol} + {$this->timeCol} > ? THEN {$this->dataCol} ELSE NULL END FROM {$this->table} WHERE {$this->idCol} IN ({$sql})"; - $stmt = $connection->prepare($sql); - $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT); - foreach ($ids as $id) { - $stmt->bindValue(++$i, $id); - } - $result = $stmt->execute(); - if (\is_object($result)) { - $result = $result->iterateNumeric(); - } else { - $stmt->setFetchMode(\PDO::FETCH_NUM); - $result = $stmt; - } - foreach ($result as $row) { - if (null === $row[1]) { - $expired[] = $row[0]; - } else { - (yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? \stream_get_contents($row[1]) : $row[1])); - } - } - if ($expired) { - $sql = \str_pad('', (\count($expired) << 1) - 1, '?,'); - $sql = "DELETE FROM {$this->table} WHERE {$this->lifetimeCol} + {$this->timeCol} <= ? AND {$this->idCol} IN ({$sql})"; - $stmt = $connection->prepare($sql); - $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT); - foreach ($expired as $id) { - $stmt->bindValue(++$i, $id); - } - $stmt->execute(); - } - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - $connection = $this->getConnection(); - $sql = "SELECT 1 FROM {$this->table} WHERE {$this->idCol} = :id AND ({$this->lifetimeCol} IS NULL OR {$this->lifetimeCol} + {$this->timeCol} > :time)"; - $stmt = $connection->prepare($sql); - $stmt->bindValue(':id', $id); - $stmt->bindValue(':time', \time(), \PDO::PARAM_INT); - $stmt->execute(); - return (bool) $stmt->fetchColumn(); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - $conn = $this->getConnection(); - if ('' === $namespace) { - if ('sqlite' === $this->driver) { - $sql = "DELETE FROM {$this->table}"; - } else { - $sql = "TRUNCATE TABLE {$this->table}"; - } - } else { - $sql = "DELETE FROM {$this->table} WHERE {$this->idCol} LIKE '{$namespace}%'"; - } - try { - $conn->exec($sql); - } catch (\PDOException $e) { - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - $sql = \str_pad('', (\count($ids) << 1) - 1, '?,'); - $sql = "DELETE FROM {$this->table} WHERE {$this->idCol} IN ({$sql})"; - try { - $stmt = $this->getConnection()->prepare($sql); - $stmt->execute(\array_values($ids)); - } catch (\PDOException $e) { - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - if (!($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - $conn = $this->getConnection(); - $driver = $this->driver; - $insertSql = "INSERT INTO {$this->table} ({$this->idCol}, {$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) VALUES (:id, :data, :lifetime, :time)"; - switch (\true) { - case 'mysql' === $driver: - $sql = $insertSql . " ON DUPLICATE KEY UPDATE {$this->dataCol} = VALUES({$this->dataCol}), {$this->lifetimeCol} = VALUES({$this->lifetimeCol}), {$this->timeCol} = VALUES({$this->timeCol})"; - break; - case 'oci' === $driver: - // DUAL is Oracle specific dummy table - $sql = "MERGE INTO {$this->table} USING DUAL ON ({$this->idCol} = ?) " . "WHEN NOT MATCHED THEN INSERT ({$this->idCol}, {$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) VALUES (?, ?, ?, ?) " . "WHEN MATCHED THEN UPDATE SET {$this->dataCol} = ?, {$this->lifetimeCol} = ?, {$this->timeCol} = ?"; - break; - case 'sqlsrv' === $driver && \version_compare($this->getServerVersion(), '10', '>='): - // MERGE is only available since SQL Server 2008 and must be terminated by semicolon - // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx - $sql = "MERGE INTO {$this->table} WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ({$this->idCol} = ?) " . "WHEN NOT MATCHED THEN INSERT ({$this->idCol}, {$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) VALUES (?, ?, ?, ?) " . "WHEN MATCHED THEN UPDATE SET {$this->dataCol} = ?, {$this->lifetimeCol} = ?, {$this->timeCol} = ?;"; - break; - case 'sqlite' === $driver: - $sql = 'INSERT OR REPLACE' . \substr($insertSql, 6); - break; - case 'pgsql' === $driver && \version_compare($this->getServerVersion(), '9.5', '>='): - $sql = $insertSql . " ON CONFLICT ({$this->idCol}) DO UPDATE SET ({$this->dataCol}, {$this->lifetimeCol}, {$this->timeCol}) = (EXCLUDED.{$this->dataCol}, EXCLUDED.{$this->lifetimeCol}, EXCLUDED.{$this->timeCol})"; - break; - default: - $driver = null; - $sql = "UPDATE {$this->table} SET {$this->dataCol} = :data, {$this->lifetimeCol} = :lifetime, {$this->timeCol} = :time WHERE {$this->idCol} = :id"; - break; - } - $now = \time(); - $lifetime = $lifetime ?: null; - try { - $stmt = $conn->prepare($sql); - } catch (\PDOException $e) { - if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], \true)) { - $this->createTable(); - } - $stmt = $conn->prepare($sql); - } - // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution. - if ('sqlsrv' === $driver || 'oci' === $driver) { - $stmt->bindParam(1, $id); - $stmt->bindParam(2, $id); - $stmt->bindParam(3, $data, \PDO::PARAM_LOB); - $stmt->bindValue(4, $lifetime, \PDO::PARAM_INT); - $stmt->bindValue(5, $now, \PDO::PARAM_INT); - $stmt->bindParam(6, $data, \PDO::PARAM_LOB); - $stmt->bindValue(7, $lifetime, \PDO::PARAM_INT); - $stmt->bindValue(8, $now, \PDO::PARAM_INT); - } else { - $stmt->bindParam(':id', $id); - $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); - $stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT); - $stmt->bindValue(':time', $now, \PDO::PARAM_INT); - } - if (null === $driver) { - $insertStmt = $conn->prepare($insertSql); - $insertStmt->bindParam(':id', $id); - $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB); - $insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT); - $insertStmt->bindValue(':time', $now, \PDO::PARAM_INT); - } - foreach ($values as $id => $data) { - try { - $stmt->execute(); - } catch (\PDOException $e) { - if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], \true)) { - $this->createTable(); - } - $stmt->execute(); - } - if (null === $driver && !$stmt->rowCount()) { - try { - $insertStmt->execute(); - } catch (\PDOException $e) { - // A concurrent write won, let it be - } - } - } - return $failed; - } - /** - * @internal - */ - protected function getId($key) - { - if ('pgsql' !== $this->driver ?? ($this->getConnection() ? $this->driver : null)) { - return parent::getId($key); - } - if (\str_contains($key, "\x00") || \str_contains($key, '%') || !\preg_match('//u', $key)) { - $key = \rawurlencode($key); - } - return parent::getId($key); - } - private function getConnection() : \PDO - { - if (null === $this->conn) { - $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions); - $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - } - if (null === $this->driver) { - $this->driver = $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME); - } - return $this->conn; - } - private function getServerVersion() : string - { - if (null === $this->serverVersion) { - $this->serverVersion = $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION); - } - return $this->serverVersion; - } -} diff --git a/dependencies/symfony/cache/Adapter/PhpArrayAdapter.php b/dependencies/symfony/cache/Adapter/PhpArrayAdapter.php deleted file mode 100644 index b98033a..0000000 --- a/dependencies/symfony/cache/Adapter/PhpArrayAdapter.php +++ /dev/null @@ -1,372 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ContractsTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ProxyTrait; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\VarExporter; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -/** - * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0. - * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter. - * - * @author Titouan Galopin - * @author Nicolas Grekas - */ -class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface -{ - use ContractsTrait; - use ProxyTrait; - private $file; - private $keys; - private $values; - private static $createCacheItem; - private static $valuesCache = []; - /** - * @param string $file The PHP file were values are cached - * @param AdapterInterface $fallbackPool A pool to fallback on when an item is not hit - */ - public function __construct(string $file, AdapterInterface $fallbackPool) - { - $this->file = $file; - $this->pool = $fallbackPool; - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key, $value, $isHit) { - $item = new CacheItem(); - $item->key = $key; - $item->value = $value; - $item->isHit = $isHit; - return $item; - }, null, CacheItem::class)); - } - /** - * This adapter takes advantage of how PHP stores arrays in its latest versions. - * - * @param string $file The PHP file were values are cached - * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit - * - * @return CacheItemPoolInterface - */ - public static function create(string $file, CacheItemPoolInterface $fallbackPool) - { - if (!$fallbackPool instanceof AdapterInterface) { - $fallbackPool = new ProxyAdapter($fallbackPool); - } - return new static($file, $fallbackPool); - } - /** - * {@inheritdoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - if (null === $this->values) { - $this->initialize(); - } - if (!isset($this->keys[$key])) { - get_from_pool: - if ($this->pool instanceof CacheInterface) { - return $this->pool->get($key, $callback, $beta, $metadata); - } - return $this->doGet($this->pool, $key, $callback, $beta, $metadata); - } - $value = $this->values[$this->keys[$key]]; - if ('N;' === $value) { - return null; - } - try { - if ($value instanceof \Closure) { - return $value(); - } - } catch (\Throwable $e) { - unset($this->keys[$key]); - goto get_from_pool; - } - return $value; - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - if (!\is_string($key)) { - throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', \get_debug_type($key))); - } - if (null === $this->values) { - $this->initialize(); - } - if (!isset($this->keys[$key])) { - return $this->pool->getItem($key); - } - $value = $this->values[$this->keys[$key]]; - $isHit = \true; - if ('N;' === $value) { - $value = null; - } elseif ($value instanceof \Closure) { - try { - $value = $value(); - } catch (\Throwable $e) { - $value = null; - $isHit = \false; - } - } - return (self::$createCacheItem)($key, $value, $isHit); - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - foreach ($keys as $key) { - if (!\is_string($key)) { - throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', \get_debug_type($key))); - } - } - if (null === $this->values) { - $this->initialize(); - } - return $this->generateItems($keys); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - if (!\is_string($key)) { - throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', \get_debug_type($key))); - } - if (null === $this->values) { - $this->initialize(); - } - return isset($this->keys[$key]) || $this->pool->hasItem($key); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - if (!\is_string($key)) { - throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', \get_debug_type($key))); - } - if (null === $this->values) { - $this->initialize(); - } - return !isset($this->keys[$key]) && $this->pool->deleteItem($key); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - $deleted = \true; - $fallbackKeys = []; - foreach ($keys as $key) { - if (!\is_string($key)) { - throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', \get_debug_type($key))); - } - if (isset($this->keys[$key])) { - $deleted = \false; - } else { - $fallbackKeys[] = $key; - } - } - if (null === $this->values) { - $this->initialize(); - } - if ($fallbackKeys) { - $deleted = $this->pool->deleteItems($fallbackKeys) && $deleted; - } - return $deleted; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - if (null === $this->values) { - $this->initialize(); - } - return !isset($this->keys[$item->getKey()]) && $this->pool->save($item); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - if (null === $this->values) { - $this->initialize(); - } - return !isset($this->keys[$item->getKey()]) && $this->pool->saveDeferred($item); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - return $this->pool->commit(); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - $this->keys = $this->values = []; - $cleared = @\unlink($this->file) || !\file_exists($this->file); - unset(self::$valuesCache[$this->file]); - if ($this->pool instanceof AdapterInterface) { - return $this->pool->clear($prefix) && $cleared; - } - return $this->pool->clear() && $cleared; - } - /** - * Store an array of cached values. - * - * @param array $values The cached values - * - * @return string[] A list of classes to preload on PHP 7.4+ - */ - public function warmUp(array $values) - { - if (\file_exists($this->file)) { - if (!\is_file($this->file)) { - throw new InvalidArgumentException(\sprintf('Cache path exists and is not a file: "%s".', $this->file)); - } - if (!\is_writable($this->file)) { - throw new InvalidArgumentException(\sprintf('Cache file is not writable: "%s".', $this->file)); - } - } else { - $directory = \dirname($this->file); - if (!\is_dir($directory) && !@\mkdir($directory, 0777, \true)) { - throw new InvalidArgumentException(\sprintf('Cache directory does not exist and cannot be created: "%s".', $directory)); - } - if (!\is_writable($directory)) { - throw new InvalidArgumentException(\sprintf('Cache directory is not writable: "%s".', $directory)); - } - } - $preload = []; - $dumpedValues = ''; - $dumpedMap = []; - $dump = <<<'EOF' - $value) { - CacheItem::validateKey(\is_int($key) ? (string) $key : $key); - $isStaticValue = \true; - if (null === $value) { - $value = "'N;'"; - } elseif (\is_object($value) || \is_array($value)) { - try { - $value = VarExporter::export($value, $isStaticValue, $preload); - } catch (\Exception $e) { - throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, \get_debug_type($value)), 0, $e); - } - } elseif (\is_string($value)) { - // Wrap "N;" in a closure to not confuse it with an encoded `null` - if ('N;' === $value) { - $isStaticValue = \false; - } - $value = \var_export($value, \true); - } elseif (!\is_scalar($value)) { - throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, \get_debug_type($value))); - } else { - $value = \var_export($value, \true); - } - if (!$isStaticValue) { - $value = \str_replace("\n", "\n ", $value); - $value = "static function () {\n return {$value};\n}"; - } - $hash = \hash('md5', $value); - if (null === ($id = $dumpedMap[$hash] ?? null)) { - $id = $dumpedMap[$hash] = \count($dumpedMap); - $dumpedValues .= "{$id} => {$value},\n"; - } - $dump .= \var_export($key, \true) . " => {$id},\n"; - } - $dump .= "\n], [\n\n{$dumpedValues}\n]];\n"; - $tmpFile = \uniqid($this->file, \true); - \file_put_contents($tmpFile, $dump); - @\chmod($tmpFile, 0666 & ~\umask()); - unset($serialized, $value, $dump); - @\rename($tmpFile, $this->file); - unset(self::$valuesCache[$this->file]); - $this->initialize(); - return $preload; - } - /** - * Load the cache file. - */ - private function initialize() - { - if (isset(self::$valuesCache[$this->file])) { - $values = self::$valuesCache[$this->file]; - } elseif (!\is_file($this->file)) { - $this->keys = $this->values = []; - return; - } else { - $values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []]; - } - if (2 !== \count($values) || !isset($values[0], $values[1])) { - $this->keys = $this->values = []; - } else { - [$this->keys, $this->values] = $values; - } - } - private function generateItems(array $keys) : \Generator - { - $f = self::$createCacheItem; - $fallbackKeys = []; - foreach ($keys as $key) { - if (isset($this->keys[$key])) { - $value = $this->values[$this->keys[$key]]; - if ('N;' === $value) { - (yield $key => $f($key, null, \true)); - } elseif ($value instanceof \Closure) { - try { - (yield $key => $f($key, $value(), \true)); - } catch (\Throwable $e) { - (yield $key => $f($key, null, \false)); - } - } else { - (yield $key => $f($key, $value, \true)); - } - } else { - $fallbackKeys[] = $key; - } - } - if ($fallbackKeys) { - yield from $this->pool->getItems($fallbackKeys); - } - } -} diff --git a/dependencies/symfony/cache/Adapter/PhpFilesAdapter.php b/dependencies/symfony/cache/Adapter/PhpFilesAdapter.php deleted file mode 100644 index f21fbdf..0000000 --- a/dependencies/symfony/cache/Adapter/PhpFilesAdapter.php +++ /dev/null @@ -1,284 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\FilesystemCommonTrait; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\VarExporter; -/** - * @author Piotr Stankowski - * @author Nicolas Grekas - * @author Rob Frawley 2nd - */ -class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface -{ - use FilesystemCommonTrait { - doClear as private doCommonClear; - doDelete as private doCommonDelete; - } - private $includeHandler; - private $appendOnly; - private $values = []; - private $files = []; - private static $startTime; - private static $valuesCache = []; - /** - * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire. - * Doing so is encouraged because it fits perfectly OPcache's memory model. - * - * @throws CacheException if OPcache is not enabled - */ - public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, bool $appendOnly = \false) - { - $this->appendOnly = $appendOnly; - self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? \time(); - parent::__construct('', $defaultLifetime); - $this->init($namespace, $directory); - $this->includeHandler = static function ($type, $msg, $file, $line) { - throw new \ErrorException($msg, 0, $type, $file, $line); - }; - } - public static function isSupported() - { - self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? \time(); - return \function_exists('opcache_invalidate') && \filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], \true) || \filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN)); - } - /** - * @return bool - */ - public function prune() - { - $time = \time(); - $pruned = \true; - $getExpiry = \true; - \set_error_handler($this->includeHandler); - try { - foreach ($this->scanHashDir($this->directory) as $file) { - try { - if (\is_array($expiresAt = (include $file))) { - $expiresAt = $expiresAt[0]; - } - } catch (\ErrorException $e) { - $expiresAt = $time; - } - if ($time >= $expiresAt) { - $pruned = ($this->doUnlink($file) || !\file_exists($file)) && $pruned; - } - } - } finally { - \restore_error_handler(); - } - return $pruned; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - if ($this->appendOnly) { - $now = 0; - $missingIds = []; - } else { - $now = \time(); - $missingIds = $ids; - $ids = []; - } - $values = []; - begin: - $getExpiry = \false; - foreach ($ids as $id) { - if (null === ($value = $this->values[$id] ?? null)) { - $missingIds[] = $id; - } elseif ('N;' === $value) { - $values[$id] = null; - } elseif (!\is_object($value)) { - $values[$id] = $value; - } elseif (!$value instanceof LazyValue) { - $values[$id] = $value(); - } elseif (\false === ($values[$id] = (include $value->file))) { - unset($values[$id], $this->values[$id]); - $missingIds[] = $id; - } - if (!$this->appendOnly) { - unset($this->values[$id]); - } - } - if (!$missingIds) { - return $values; - } - \set_error_handler($this->includeHandler); - try { - $getExpiry = \true; - foreach ($missingIds as $k => $id) { - try { - $file = $this->files[$id] ?? ($this->files[$id] = $this->getFile($id)); - if (isset(self::$valuesCache[$file])) { - [$expiresAt, $this->values[$id]] = self::$valuesCache[$file]; - } elseif (\is_array($expiresAt = (include $file))) { - if ($this->appendOnly) { - self::$valuesCache[$file] = $expiresAt; - } - [$expiresAt, $this->values[$id]] = $expiresAt; - } elseif ($now < $expiresAt) { - $this->values[$id] = new LazyValue($file); - } - if ($now >= $expiresAt) { - unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]); - } - } catch (\ErrorException $e) { - unset($missingIds[$k]); - } - } - } finally { - \restore_error_handler(); - } - $ids = $missingIds; - $missingIds = []; - goto begin; - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - if ($this->appendOnly && isset($this->values[$id])) { - return \true; - } - \set_error_handler($this->includeHandler); - try { - $file = $this->files[$id] ?? ($this->files[$id] = $this->getFile($id)); - $getExpiry = \true; - if (isset(self::$valuesCache[$file])) { - [$expiresAt, $value] = self::$valuesCache[$file]; - } elseif (\is_array($expiresAt = (include $file))) { - if ($this->appendOnly) { - self::$valuesCache[$file] = $expiresAt; - } - [$expiresAt, $value] = $expiresAt; - } elseif ($this->appendOnly) { - $value = new LazyValue($file); - } - } catch (\ErrorException $e) { - return \false; - } finally { - \restore_error_handler(); - } - if ($this->appendOnly) { - $now = 0; - $this->values[$id] = $value; - } else { - $now = \time(); - } - return $now < $expiresAt; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - $ok = \true; - $expiry = $lifetime ? \time() + $lifetime : 'PHP_INT_MAX'; - $allowCompile = self::isSupported(); - foreach ($values as $key => $value) { - unset($this->values[$key]); - $isStaticValue = \true; - if (null === $value) { - $value = "'N;'"; - } elseif (\is_object($value) || \is_array($value)) { - try { - $value = VarExporter::export($value, $isStaticValue); - } catch (\Exception $e) { - throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, \get_debug_type($value)), 0, $e); - } - } elseif (\is_string($value)) { - // Wrap "N;" in a closure to not confuse it with an encoded `null` - if ('N;' === $value) { - $isStaticValue = \false; - } - $value = \var_export($value, \true); - } elseif (!\is_scalar($value)) { - throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, \get_debug_type($value))); - } else { - $value = \var_export($value, \true); - } - $encodedKey = \rawurlencode($key); - if ($isStaticValue) { - $value = "return [{$expiry}, {$value}];"; - } elseif ($this->appendOnly) { - $value = "return [{$expiry}, static function () { return {$value}; }];"; - } else { - // We cannot use a closure here because of https://bugs.php.net/76982 - $value = \str_replace('\\Symfony\\Component\\VarExporter\\Internal\\', '', $value); - $value = "namespace Symfony\\Component\\VarExporter\\Internal;\n\nreturn \$getExpiry ? {$expiry} : {$value};"; - } - $file = $this->files[$key] = $this->getFile($key, \true); - // Since OPcache only compiles files older than the script execution start, set the file's mtime in the past - $ok = $this->write($file, "directory)) { - throw new CacheException(\sprintf('Cache directory is not writable (%s).', $this->directory)); - } - return $ok; - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - $this->values = []; - return $this->doCommonClear($namespace); - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - foreach ($ids as $id) { - unset($this->values[$id]); - } - return $this->doCommonDelete($ids); - } - protected function doUnlink(string $file) - { - unset(self::$valuesCache[$file]); - if (self::isSupported()) { - @\opcache_invalidate($file, \true); - } - return @\unlink($file); - } - private function getFileKey(string $file) : string - { - if (!($h = @\fopen($file, 'r'))) { - return ''; - } - $encodedKey = \substr(\fgets($h), 8); - \fclose($h); - return \rawurldecode(\rtrim($encodedKey)); - } -} -/** - * @internal - */ -class LazyValue -{ - public $file; - public function __construct(string $file) - { - $this->file = $file; - } -} diff --git a/dependencies/symfony/cache/Adapter/ProxyAdapter.php b/dependencies/symfony/cache/Adapter/ProxyAdapter.php deleted file mode 100644 index 27e383a..0000000 --- a/dependencies/symfony/cache/Adapter/ProxyAdapter.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ContractsTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ProxyTrait; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -/** - * @author Nicolas Grekas - */ -class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface -{ - use ContractsTrait; - use ProxyTrait; - private $namespace = ''; - private $namespaceLen; - private $poolHash; - private $defaultLifetime; - private static $createCacheItem; - private static $setInnerItem; - public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0) - { - $this->pool = $pool; - $this->poolHash = $poolHash = \spl_object_hash($pool); - if ('' !== $namespace) { - \assert('' !== CacheItem::validateKey($namespace)); - $this->namespace = $namespace; - } - $this->namespaceLen = \strlen($namespace); - $this->defaultLifetime = $defaultLifetime; - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key, $innerItem, $poolHash) { - $item = new CacheItem(); - $item->key = $key; - if (null === $innerItem) { - return $item; - } - $item->value = $v = $innerItem->get(); - $item->isHit = $innerItem->isHit(); - $item->innerItem = $innerItem; - $item->poolHash = $poolHash; - // Detect wrapped values that encode for their expiry and creation duration - // For compactness, these values are packed in the key of an array using - // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F - if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) \array_key_first($v)) && "\x9d" === $k[0] && "\x00" === $k[5] && "_" === $k[9]) { - $item->value = $v[$k]; - $v = \unpack('Ve/Nc', \substr($k, 1, -1)); - $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; - $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; - } elseif ($innerItem instanceof CacheItem) { - $item->metadata = $innerItem->metadata; - } - $innerItem->set(null); - return $item; - }, null, CacheItem::class)); - self::$setInnerItem ?? (self::$setInnerItem = \Closure::bind( - /** - * @param array $item A CacheItem cast to (array); accessing protected properties requires adding the "\0*\0" PHP prefix - */ - static function (CacheItemInterface $innerItem, array $item) { - // Tags are stored separately, no need to account for them when considering this item's newly set metadata - if (isset(($metadata = $item["\x00*\x00newMetadata"])[CacheItem::METADATA_TAGS])) { - unset($metadata[CacheItem::METADATA_TAGS]); - } - if ($metadata) { - // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators - $item["\x00*\x00value"] = ["\x9d" . \pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME]) . "_" => $item["\x00*\x00value"]]; - } - $innerItem->set($item["\x00*\x00value"]); - $innerItem->expiresAt(null !== $item["\x00*\x00expiry"] ? \DateTime::createFromFormat('U.u', \sprintf('%.6F', $item["\x00*\x00expiry"])) : null); - }, - null, - CacheItem::class - )); - } - /** - * {@inheritdoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - if (!$this->pool instanceof CacheInterface) { - return $this->doGet($this, $key, $callback, $beta, $metadata); - } - return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use($key, $callback) { - $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash); - $item->set($value = $callback($item, $save)); - (self::$setInnerItem)($innerItem, (array) $item); - return $value; - }, $beta, $metadata); - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - $item = $this->pool->getItem($this->getId($key)); - return (self::$createCacheItem)($key, $item, $this->poolHash); - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - if ($this->namespaceLen) { - foreach ($keys as $i => $key) { - $keys[$i] = $this->getId($key); - } - } - return $this->generateItems($this->pool->getItems($keys)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - return $this->pool->hasItem($this->getId($key)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - if ($this->pool instanceof AdapterInterface) { - return $this->pool->clear($this->namespace . $prefix); - } - return $this->pool->clear(); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - return $this->pool->deleteItem($this->getId($key)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - if ($this->namespaceLen) { - foreach ($keys as $i => $key) { - $keys[$i] = $this->getId($key); - } - } - return $this->pool->deleteItems($keys); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - return $this->doSave($item, __FUNCTION__); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - return $this->doSave($item, __FUNCTION__); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - return $this->pool->commit(); - } - private function doSave(CacheItemInterface $item, string $method) - { - if (!$item instanceof CacheItem) { - return \false; - } - $item = (array) $item; - if (null === $item["\x00*\x00expiry"] && 0 < $this->defaultLifetime) { - $item["\x00*\x00expiry"] = \microtime(\true) + $this->defaultLifetime; - } - if ($item["\x00*\x00poolHash"] === $this->poolHash && $item["\x00*\x00innerItem"]) { - $innerItem = $item["\x00*\x00innerItem"]; - } elseif ($this->pool instanceof AdapterInterface) { - // this is an optimization specific for AdapterInterface implementations - // so we can save a round-trip to the backend by just creating a new item - $innerItem = (self::$createCacheItem)($this->namespace . $item["\x00*\x00key"], null, $this->poolHash); - } else { - $innerItem = $this->pool->getItem($this->namespace . $item["\x00*\x00key"]); - } - (self::$setInnerItem)($innerItem, $item); - return $this->pool->{$method}($innerItem); - } - private function generateItems(iterable $items) : \Generator - { - $f = self::$createCacheItem; - foreach ($items as $key => $item) { - if ($this->namespaceLen) { - $key = \substr($key, $this->namespaceLen); - } - (yield $key => $f($key, $item, $this->poolHash)); - } - } - private function getId($key) : string - { - \assert('' !== CacheItem::validateKey($key)); - return $this->namespace . $key; - } -} diff --git a/dependencies/symfony/cache/Adapter/Psr16Adapter.php b/dependencies/symfony/cache/Adapter/Psr16Adapter.php deleted file mode 100644 index 1f8674a..0000000 --- a/dependencies/symfony/cache/Adapter/Psr16Adapter.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\SimpleCache\CacheInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ProxyTrait; -/** - * Turns a PSR-16 cache into a PSR-6 one. - * - * @author Nicolas Grekas - */ -class Psr16Adapter extends AbstractAdapter implements PruneableInterface, ResettableInterface -{ - use ProxyTrait; - /** - * @internal - */ - protected const NS_SEPARATOR = '_'; - private $miss; - public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0) - { - parent::__construct($namespace, $defaultLifetime); - $this->pool = $pool; - $this->miss = new \stdClass(); - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) { - if ($this->miss !== $value) { - (yield $key => $value); - } - } - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - return $this->pool->has($id); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - return $this->pool->clear(); - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - return $this->pool->deleteMultiple($ids); - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime); - } -} diff --git a/dependencies/symfony/cache/Adapter/RedisAdapter.php b/dependencies/symfony/cache/Adapter/RedisAdapter.php deleted file mode 100644 index 7ad691b..0000000 --- a/dependencies/symfony/cache/Adapter/RedisAdapter.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\RedisClusterProxy; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\RedisProxy; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\RedisTrait; -class RedisAdapter extends AbstractAdapter -{ - use RedisTrait; - /** - * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis The redis client - * @param string $namespace The default namespace - * @param int $defaultLifetime The default lifetime - */ - public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) - { - $this->init($redis, $namespace, $defaultLifetime, $marshaller); - } -} diff --git a/dependencies/symfony/cache/Adapter/RedisTagAwareAdapter.php b/dependencies/symfony/cache/Adapter/RedisTagAwareAdapter.php deleted file mode 100644 index 0675193..0000000 --- a/dependencies/symfony/cache/Adapter/RedisTagAwareAdapter.php +++ /dev/null @@ -1,278 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Predis\Connection\Aggregate\ClusterInterface; -use WP_Ultimo\Dependencies\Predis\Connection\Aggregate\PredisCluster; -use WP_Ultimo\Dependencies\Predis\Connection\Aggregate\ReplicationInterface; -use WP_Ultimo\Dependencies\Predis\Response\ErrorInterface; -use WP_Ultimo\Dependencies\Predis\Response\Status; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\LogicException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DeflateMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\TagAwareMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\RedisClusterProxy; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\RedisProxy; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\RedisTrait; -/** - * Stores tag id <> cache id relationship as a Redis Set. - * - * Set (tag relation info) is stored without expiry (non-volatile), while cache always gets an expiry (volatile) even - * if not set by caller. Thus if you configure redis with the right eviction policy you can be safe this tag <> cache - * relationship survives eviction (cache cleanup when Redis runs out of memory). - * - * Redis server 2.8+ with any `volatile-*` eviction policy, OR `noeviction` if you're sure memory will NEVER fill up - * - * Design limitations: - * - Max 4 billion cache keys per cache tag as limited by Redis Set datatype. - * E.g. If you use a "all" items tag for expiry instead of clear(), that limits you to 4 billion cache items also. - * - * @see https://redis.io/topics/lru-cache#eviction-policies Documentation for Redis eviction policies. - * @see https://redis.io/topics/data-types#sets Documentation for Redis Set datatype. - * - * @author Nicolas Grekas - * @author André Rømcke - */ -class RedisTagAwareAdapter extends AbstractTagAwareAdapter -{ - use RedisTrait; - /** - * On cache items without a lifetime set, we set it to 100 days. This is to make sure cache items are - * preferred to be evicted over tag Sets, if eviction policy is configured according to requirements. - */ - private const DEFAULT_CACHE_TTL = 8640000; - /** - * @var string|null detected eviction policy used on Redis server - */ - private $redisEvictionPolicy; - private $namespace; - /** - * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis The redis client - * @param string $namespace The default namespace - * @param int $defaultLifetime The default lifetime - */ - public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) - { - if ($redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) { - throw new InvalidArgumentException(\sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, \get_debug_type($redis->getConnection()))); - } - if (\defined('Redis::OPT_COMPRESSION') && ($redis instanceof \Redis || $redis instanceof \RedisArray || $redis instanceof \RedisCluster)) { - $compression = $redis->getOption(\Redis::OPT_COMPRESSION); - foreach (\is_array($compression) ? $compression : [$compression] as $c) { - if (\Redis::COMPRESSION_NONE !== $c) { - throw new InvalidArgumentException(\sprintf('phpredis compression must be disabled when using "%s", use "%s" instead.', static::class, DeflateMarshaller::class)); - } - } - } - $this->init($redis, $namespace, $defaultLifetime, new TagAwareMarshaller($marshaller)); - $this->namespace = $namespace; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime, array $addTagData = [], array $delTagData = []) : array - { - $eviction = $this->getRedisEvictionPolicy(); - if ('noeviction' !== $eviction && !\str_starts_with($eviction, 'volatile-')) { - throw new LogicException(\sprintf('Redis maxmemory-policy setting "%s" is *not* supported by RedisTagAwareAdapter, use "noeviction" or "volatile-*" eviction policies.', $eviction)); - } - // serialize values - if (!($serialized = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - // While pipeline isn't supported on RedisCluster, other setups will at least benefit from doing this in one op - $results = $this->pipeline(static function () use($serialized, $lifetime, $addTagData, $delTagData, $failed) { - // Store cache items, force a ttl if none is set, as there is no MSETEX we need to set each one - foreach ($serialized as $id => $value) { - (yield 'setEx' => [$id, 0 >= $lifetime ? self::DEFAULT_CACHE_TTL : $lifetime, $value]); - } - // Add and Remove Tags - foreach ($addTagData as $tagId => $ids) { - if (!$failed || ($ids = \array_diff($ids, $failed))) { - (yield 'sAdd' => \array_merge([$tagId], $ids)); - } - } - foreach ($delTagData as $tagId => $ids) { - if (!$failed || ($ids = \array_diff($ids, $failed))) { - (yield 'sRem' => \array_merge([$tagId], $ids)); - } - } - }); - foreach ($results as $id => $result) { - // Skip results of SADD/SREM operations, they'll be 1 or 0 depending on if set value already existed or not - if (\is_numeric($result)) { - continue; - } - // setEx results - if (\true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) { - $failed[] = $id; - } - } - return $failed; - } - /** - * {@inheritdoc} - */ - protected function doDeleteYieldTags(array $ids) : iterable - { - $lua = <<<'EOLUA' - local v = redis.call('GET', KEYS[1]) - local e = redis.pcall('UNLINK', KEYS[1]) - - if type(e) ~= 'number' then - redis.call('DEL', KEYS[1]) - end - - if not v or v:len() <= 13 or v:byte(1) ~= 0x9D or v:byte(6) ~= 0 or v:byte(10) ~= 0x5F then - return '' - end - - return v:sub(14, 13 + v:byte(13) + v:byte(12) * 256 + v:byte(11) * 65536) -EOLUA; - $results = $this->pipeline(function () use($ids, $lua) { - foreach ($ids as $id) { - (yield 'eval' => $this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface ? [$lua, 1, $id] : [$lua, [$id], 1]); - } - }); - foreach ($results as $id => $result) { - if ($result instanceof \RedisException || $result instanceof ErrorInterface) { - CacheItem::log($this->logger, 'Failed to delete key "{key}": ' . $result->getMessage(), ['key' => \substr($id, \strlen($this->namespace)), 'exception' => $result]); - continue; - } - try { - (yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result)); - } catch (\Exception $e) { - (yield $id => []); - } - } - } - /** - * {@inheritdoc} - */ - protected function doDeleteTagRelations(array $tagData) : bool - { - $results = $this->pipeline(static function () use($tagData) { - foreach ($tagData as $tagId => $idList) { - \array_unshift($idList, $tagId); - (yield 'sRem' => $idList); - } - }); - foreach ($results as $result) { - // no-op - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doInvalidate(array $tagIds) : bool - { - // This script scans the set of items linked to tag: it empties the set - // and removes the linked items. When the set is still not empty after - // the scan, it means we're in cluster mode and that the linked items - // are on other nodes: we move the links to a temporary set and we - // garbage collect that set from the client side. - $lua = <<<'EOLUA' - redis.replicate_commands() - - local cursor = '0' - local id = KEYS[1] - repeat - local result = redis.call('SSCAN', id, cursor, 'COUNT', 5000); - cursor = result[1]; - local rems = {} - - for _, v in ipairs(result[2]) do - local ok, _ = pcall(redis.call, 'DEL', ARGV[1]..v) - if ok then - table.insert(rems, v) - end - end - if 0 < #rems then - redis.call('SREM', id, unpack(rems)) - end - until '0' == cursor; - - redis.call('SUNIONSTORE', '{'..id..'}'..id, id) - redis.call('DEL', id) - - return redis.call('SSCAN', '{'..id..'}'..id, '0', 'COUNT', 5000) -EOLUA; - $results = $this->pipeline(function () use($tagIds, $lua) { - if ($this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface) { - $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; - } elseif (\is_array($prefix = $this->redis->getOption(\Redis::OPT_PREFIX) ?? '')) { - $prefix = \current($prefix); - } - foreach ($tagIds as $id) { - (yield 'eval' => $this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface ? [$lua, 1, $id, $prefix] : [$lua, [$id, $prefix], 1]); - } - }); - $lua = <<<'EOLUA' - redis.replicate_commands() - - local id = KEYS[1] - local cursor = table.remove(ARGV) - redis.call('SREM', '{'..id..'}'..id, unpack(ARGV)) - - return redis.call('SSCAN', '{'..id..'}'..id, cursor, 'COUNT', 5000) -EOLUA; - $success = \true; - foreach ($results as $id => $values) { - if ($values instanceof \RedisException || $values instanceof ErrorInterface) { - CacheItem::log($this->logger, 'Failed to invalidate key "{key}": ' . $values->getMessage(), ['key' => \substr($id, \strlen($this->namespace)), 'exception' => $values]); - $success = \false; - continue; - } - [$cursor, $ids] = $values; - while ($ids || '0' !== $cursor) { - $this->doDelete($ids); - $evalArgs = [$id, $cursor]; - \array_splice($evalArgs, 1, 0, $ids); - if ($this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface) { - \array_unshift($evalArgs, $lua, 1); - } else { - $evalArgs = [$lua, $evalArgs, 1]; - } - $results = $this->pipeline(function () use($evalArgs) { - (yield 'eval' => $evalArgs); - }); - foreach ($results as [$cursor, $ids]) { - // no-op - } - } - } - return $success; - } - private function getRedisEvictionPolicy() : string - { - if (null !== $this->redisEvictionPolicy) { - return $this->redisEvictionPolicy; - } - $hosts = $this->getHosts(); - $host = \reset($hosts); - if ($host instanceof \WP_Ultimo\Dependencies\Predis\Client && $host->getConnection() instanceof ReplicationInterface) { - // Predis supports info command only on the master in replication environments - $hosts = [$host->getClientFor('master')]; - } - foreach ($hosts as $host) { - $info = $host->info('Memory'); - if ($info instanceof ErrorInterface) { - continue; - } - $info = $info['Memory'] ?? $info; - return $this->redisEvictionPolicy = $info['maxmemory_policy']; - } - return $this->redisEvictionPolicy = ''; - } -} diff --git a/dependencies/symfony/cache/Adapter/TagAwareAdapter.php b/dependencies/symfony/cache/Adapter/TagAwareAdapter.php deleted file mode 100644 index d4683e2..0000000 --- a/dependencies/symfony/cache/Adapter/TagAwareAdapter.php +++ /dev/null @@ -1,350 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException; -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ContractsTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ProxyTrait; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\TagAwareCacheInterface; -/** - * @author Nicolas Grekas - */ -class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface -{ - use ContractsTrait; - use LoggerAwareTrait; - use ProxyTrait; - public const TAGS_PREFIX = "\x00tags\x00"; - private $deferred = []; - private $tags; - private $knownTagVersions = []; - private $knownTagVersionsTtl; - private static $createCacheItem; - private static $setCacheItemTags; - private static $getTagsByKey; - private static $saveTags; - public function __construct(AdapterInterface $itemsPool, AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15) - { - $this->pool = $itemsPool; - $this->tags = $tagsPool ?: $itemsPool; - $this->knownTagVersionsTtl = $knownTagVersionsTtl; - self::$createCacheItem ?? (self::$createCacheItem = \Closure::bind(static function ($key, $value, CacheItem $protoItem) { - $item = new CacheItem(); - $item->key = $key; - $item->value = $value; - $item->expiry = $protoItem->expiry; - $item->poolHash = $protoItem->poolHash; - return $item; - }, null, CacheItem::class)); - self::$setCacheItemTags ?? (self::$setCacheItemTags = \Closure::bind(static function (CacheItem $item, $key, array &$itemTags) { - $item->isTaggable = \true; - if (!$item->isHit) { - return $item; - } - if (isset($itemTags[$key])) { - foreach ($itemTags[$key] as $tag => $version) { - $item->metadata[CacheItem::METADATA_TAGS][$tag] = $tag; - } - unset($itemTags[$key]); - } else { - $item->value = null; - $item->isHit = \false; - } - return $item; - }, null, CacheItem::class)); - self::$getTagsByKey ?? (self::$getTagsByKey = \Closure::bind(static function ($deferred) { - $tagsByKey = []; - foreach ($deferred as $key => $item) { - $tagsByKey[$key] = $item->newMetadata[CacheItem::METADATA_TAGS] ?? []; - $item->metadata = $item->newMetadata; - } - return $tagsByKey; - }, null, CacheItem::class)); - self::$saveTags ?? (self::$saveTags = \Closure::bind(static function (AdapterInterface $tagsAdapter, array $tags) { - \ksort($tags); - foreach ($tags as $v) { - $v->expiry = 0; - $tagsAdapter->saveDeferred($v); - } - return $tagsAdapter->commit(); - }, null, CacheItem::class)); - } - /** - * {@inheritdoc} - */ - public function invalidateTags(array $tags) - { - $ids = []; - foreach ($tags as $tag) { - \assert('' !== CacheItem::validateKey($tag)); - unset($this->knownTagVersions[$tag]); - $ids[] = $tag . static::TAGS_PREFIX; - } - return !$tags || $this->tags->deleteItems($ids); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - if (\is_string($key) && isset($this->deferred[$key])) { - $this->commit(); - } - if (!$this->pool->hasItem($key)) { - return \false; - } - $itemTags = $this->pool->getItem(static::TAGS_PREFIX . $key); - if (!$itemTags->isHit()) { - return \false; - } - if (!($itemTags = $itemTags->get())) { - return \true; - } - foreach ($this->getTagVersions([$itemTags]) as $tag => $version) { - if ($itemTags[$tag] !== $version) { - return \false; - } - } - return \true; - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - foreach ($this->getItems([$key]) as $item) { - return $item; - } - return null; - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - $tagKeys = []; - $commit = \false; - foreach ($keys as $key) { - if ('' !== $key && \is_string($key)) { - $commit = $commit || isset($this->deferred[$key]); - $key = static::TAGS_PREFIX . $key; - $tagKeys[$key] = $key; - } - } - if ($commit) { - $this->commit(); - } - try { - $items = $this->pool->getItems($tagKeys + $keys); - } catch (InvalidArgumentException $e) { - $this->pool->getItems($keys); - // Should throw an exception - throw $e; - } - return $this->generateItems($items, $tagKeys); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - if ('' !== $prefix) { - foreach ($this->deferred as $key => $item) { - if (\str_starts_with($key, $prefix)) { - unset($this->deferred[$key]); - } - } - } else { - $this->deferred = []; - } - if ($this->pool instanceof AdapterInterface) { - return $this->pool->clear($prefix); - } - return $this->pool->clear(); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - return $this->deleteItems([$key]); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - foreach ($keys as $key) { - if ('' !== $key && \is_string($key)) { - $keys[] = static::TAGS_PREFIX . $key; - } - } - return $this->pool->deleteItems($keys); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - if (!$item instanceof CacheItem) { - return \false; - } - $this->deferred[$item->getKey()] = $item; - return $this->commit(); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - if (!$item instanceof CacheItem) { - return \false; - } - $this->deferred[$item->getKey()] = $item; - return \true; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - if (!$this->deferred) { - return \true; - } - $ok = \true; - foreach ($this->deferred as $key => $item) { - if (!$this->pool->saveDeferred($item)) { - unset($this->deferred[$key]); - $ok = \false; - } - } - $items = $this->deferred; - $tagsByKey = (self::$getTagsByKey)($items); - $this->deferred = []; - $tagVersions = $this->getTagVersions($tagsByKey); - $f = self::$createCacheItem; - foreach ($tagsByKey as $key => $tags) { - $this->pool->saveDeferred($f(static::TAGS_PREFIX . $key, \array_intersect_key($tagVersions, $tags), $items[$key])); - } - return $this->pool->commit() && $ok; - } - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize ' . __CLASS__); - } - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); - } - public function __destruct() - { - $this->commit(); - } - private function generateItems(iterable $items, array $tagKeys) : \Generator - { - $bufferedItems = $itemTags = []; - $f = self::$setCacheItemTags; - foreach ($items as $key => $item) { - if (!$tagKeys) { - (yield $key => $f($item, static::TAGS_PREFIX . $key, $itemTags)); - continue; - } - if (!isset($tagKeys[$key])) { - $bufferedItems[$key] = $item; - continue; - } - unset($tagKeys[$key]); - if ($item->isHit()) { - $itemTags[$key] = $item->get() ?: []; - } - if (!$tagKeys) { - $tagVersions = $this->getTagVersions($itemTags); - foreach ($itemTags as $key => $tags) { - foreach ($tags as $tag => $version) { - if ($tagVersions[$tag] !== $version) { - unset($itemTags[$key]); - continue 2; - } - } - } - $tagVersions = $tagKeys = null; - foreach ($bufferedItems as $key => $item) { - (yield $key => $f($item, static::TAGS_PREFIX . $key, $itemTags)); - } - $bufferedItems = null; - } - } - } - private function getTagVersions(array $tagsByKey) - { - $tagVersions = []; - $fetchTagVersions = \false; - foreach ($tagsByKey as $tags) { - $tagVersions += $tags; - foreach ($tags as $tag => $version) { - if ($tagVersions[$tag] !== $version) { - unset($this->knownTagVersions[$tag]); - } - } - } - if (!$tagVersions) { - return []; - } - $now = \microtime(\true); - $tags = []; - foreach ($tagVersions as $tag => $version) { - $tags[$tag . static::TAGS_PREFIX] = $tag; - if ($fetchTagVersions || ($this->knownTagVersions[$tag][1] ?? null) !== $version || $now - $this->knownTagVersions[$tag][0] >= $this->knownTagVersionsTtl) { - // reuse previously fetched tag versions up to the ttl - $fetchTagVersions = \true; - } - } - if (!$fetchTagVersions) { - return $tagVersions; - } - $newTags = []; - $newVersion = null; - foreach ($this->tags->getItems(\array_keys($tags)) as $tag => $version) { - if (!$version->isHit()) { - $newTags[$tag] = $version->set($newVersion ?? ($newVersion = \random_int(\PHP_INT_MIN, \PHP_INT_MAX))); - } - $tagVersions[$tag = $tags[$tag]] = $version->get(); - $this->knownTagVersions[$tag] = [$now, $tagVersions[$tag]]; - } - if ($newTags) { - (self::$saveTags)($this->tags, $newTags); - } - return $tagVersions; - } -} diff --git a/dependencies/symfony/cache/Adapter/TagAwareAdapterInterface.php b/dependencies/symfony/cache/Adapter/TagAwareAdapterInterface.php deleted file mode 100644 index a4b54a6..0000000 --- a/dependencies/symfony/cache/Adapter/TagAwareAdapterInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException; -/** - * Interface for invalidating cached items using tags. - * - * @author Nicolas Grekas - */ -interface TagAwareAdapterInterface extends AdapterInterface -{ - /** - * Invalidates cached items using tags. - * - * @param string[] $tags An array of tags to invalidate - * - * @return bool - * - * @throws InvalidArgumentException When $tags is not valid - */ - public function invalidateTags(array $tags); -} diff --git a/dependencies/symfony/cache/Adapter/TraceableAdapter.php b/dependencies/symfony/cache/Adapter/TraceableAdapter.php deleted file mode 100644 index a772327..0000000 --- a/dependencies/symfony/cache/Adapter/TraceableAdapter.php +++ /dev/null @@ -1,266 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\ResettableInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ResetInterface; -/** - * An adapter that collects data about all cache calls. - * - * @author Aaron Scherer - * @author Tobias Nyholm - * @author Nicolas Grekas - */ -class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface -{ - protected $pool; - private $calls = []; - public function __construct(AdapterInterface $pool) - { - $this->pool = $pool; - } - /** - * {@inheritdoc} - */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) - { - if (!$this->pool instanceof CacheInterface) { - throw new \BadMethodCallException(\sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', \get_debug_type($this->pool), CacheInterface::class)); - } - $isHit = \true; - $callback = function (CacheItem $item, bool &$save) use($callback, &$isHit) { - $isHit = $item->isHit(); - return $callback($item, $save); - }; - $event = $this->start(__FUNCTION__); - try { - $value = $this->pool->get($key, $callback, $beta, $metadata); - $event->result[$key] = \get_debug_type($value); - } finally { - $event->end = \microtime(\true); - } - if ($isHit) { - ++$event->hits; - } else { - ++$event->misses; - } - return $value; - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - $event = $this->start(__FUNCTION__); - try { - $item = $this->pool->getItem($key); - } finally { - $event->end = \microtime(\true); - } - if ($event->result[$key] = $item->isHit()) { - ++$event->hits; - } else { - ++$event->misses; - } - return $item; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - $event = $this->start(__FUNCTION__); - try { - return $event->result[$key] = $this->pool->hasItem($key); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - $event = $this->start(__FUNCTION__); - try { - return $event->result[$key] = $this->pool->deleteItem($key); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - $event = $this->start(__FUNCTION__); - try { - return $event->result[$item->getKey()] = $this->pool->save($item); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - $event = $this->start(__FUNCTION__); - try { - return $event->result[$item->getKey()] = $this->pool->saveDeferred($item); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - $event = $this->start(__FUNCTION__); - try { - $result = $this->pool->getItems($keys); - } finally { - $event->end = \microtime(\true); - } - $f = function () use($result, $event) { - $event->result = []; - foreach ($result as $key => $item) { - if ($event->result[$key] = $item->isHit()) { - ++$event->hits; - } else { - ++$event->misses; - } - (yield $key => $item); - } - }; - return $f(); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - $event = $this->start(__FUNCTION__); - try { - if ($this->pool instanceof AdapterInterface) { - return $event->result = $this->pool->clear($prefix); - } - return $event->result = $this->pool->clear(); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - $event = $this->start(__FUNCTION__); - $event->result['keys'] = $keys; - try { - return $event->result['result'] = $this->pool->deleteItems($keys); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function commit() - { - $event = $this->start(__FUNCTION__); - try { - return $event->result = $this->pool->commit(); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - */ - public function prune() - { - if (!$this->pool instanceof PruneableInterface) { - return \false; - } - $event = $this->start(__FUNCTION__); - try { - return $event->result = $this->pool->prune(); - } finally { - $event->end = \microtime(\true); - } - } - /** - * {@inheritdoc} - */ - public function reset() - { - if ($this->pool instanceof ResetInterface) { - $this->pool->reset(); - } - $this->clearCalls(); - } - /** - * {@inheritdoc} - */ - public function delete(string $key) : bool - { - $event = $this->start(__FUNCTION__); - try { - return $event->result[$key] = $this->pool->deleteItem($key); - } finally { - $event->end = \microtime(\true); - } - } - public function getCalls() - { - return $this->calls; - } - public function clearCalls() - { - $this->calls = []; - } - protected function start(string $name) - { - $this->calls[] = $event = new TraceableAdapterEvent(); - $event->name = $name; - $event->start = \microtime(\true); - return $event; - } -} -class TraceableAdapterEvent -{ - public $name; - public $start; - public $end; - public $result; - public $hits = 0; - public $misses = 0; -} diff --git a/dependencies/symfony/cache/Adapter/TraceableTagAwareAdapter.php b/dependencies/symfony/cache/Adapter/TraceableTagAwareAdapter.php deleted file mode 100644 index 96f7ff2..0000000 --- a/dependencies/symfony/cache/Adapter/TraceableTagAwareAdapter.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\TagAwareCacheInterface; -/** - * @author Robin Chalas - */ -class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface -{ - public function __construct(TagAwareAdapterInterface $pool) - { - parent::__construct($pool); - } - /** - * {@inheritdoc} - */ - public function invalidateTags(array $tags) - { - $event = $this->start(__FUNCTION__); - try { - return $event->result = $this->pool->invalidateTags($tags); - } finally { - $event->end = \microtime(\true); - } - } -} diff --git a/dependencies/symfony/cache/CacheItem.php b/dependencies/symfony/cache/CacheItem.php deleted file mode 100644 index 79284a7..0000000 --- a/dependencies/symfony/cache/CacheItem.php +++ /dev/null @@ -1,174 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\LogicException; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\ItemInterface; -/** - * @author Nicolas Grekas - */ -final class CacheItem implements ItemInterface -{ - private const METADATA_EXPIRY_OFFSET = 1527506807; - protected $key; - protected $value; - protected $isHit = \false; - protected $expiry; - protected $metadata = []; - protected $newMetadata = []; - protected $innerItem; - protected $poolHash; - protected $isTaggable = \false; - /** - * {@inheritdoc} - */ - public function getKey() : string - { - return $this->key; - } - /** - * {@inheritdoc} - * - * @return mixed - */ - public function get() - { - return $this->value; - } - /** - * {@inheritdoc} - */ - public function isHit() : bool - { - return $this->isHit; - } - /** - * {@inheritdoc} - * - * @return $this - */ - public function set($value) : self - { - $this->value = $value; - return $this; - } - /** - * {@inheritdoc} - * - * @return $this - */ - public function expiresAt($expiration) : self - { - if (null === $expiration) { - $this->expiry = null; - } elseif ($expiration instanceof \DateTimeInterface) { - $this->expiry = (float) $expiration->format('U.u'); - } else { - throw new InvalidArgumentException(\sprintf('Expiration date must implement DateTimeInterface or be null, "%s" given.', \get_debug_type($expiration))); - } - return $this; - } - /** - * {@inheritdoc} - * - * @return $this - */ - public function expiresAfter($time) : self - { - if (null === $time) { - $this->expiry = null; - } elseif ($time instanceof \DateInterval) { - $this->expiry = \microtime(\true) + \DateTime::createFromFormat('U', 0)->add($time)->format('U.u'); - } elseif (\is_int($time)) { - $this->expiry = $time + \microtime(\true); - } else { - throw new InvalidArgumentException(\sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given.', \get_debug_type($time))); - } - return $this; - } - /** - * {@inheritdoc} - */ - public function tag($tags) : ItemInterface - { - if (!$this->isTaggable) { - throw new LogicException(\sprintf('Cache item "%s" comes from a non tag-aware pool: you cannot tag it.', $this->key)); - } - if (!\is_iterable($tags)) { - $tags = [$tags]; - } - foreach ($tags as $tag) { - if (!\is_string($tag) && !(\is_object($tag) && \method_exists($tag, '__toString'))) { - throw new InvalidArgumentException(\sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', \is_object($tag) ? \get_class($tag) : \gettype($tag))); - } - $tag = (string) $tag; - if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) { - continue; - } - if ('' === $tag) { - throw new InvalidArgumentException('Cache tag length must be greater than zero.'); - } - if (\false !== \strpbrk($tag, self::RESERVED_CHARACTERS)) { - throw new InvalidArgumentException(\sprintf('Cache tag "%s" contains reserved characters "%s".', $tag, self::RESERVED_CHARACTERS)); - } - $this->newMetadata[self::METADATA_TAGS][$tag] = $tag; - } - return $this; - } - /** - * {@inheritdoc} - */ - public function getMetadata() : array - { - return $this->metadata; - } - /** - * Validates a cache key according to PSR-6. - * - * @param mixed $key The key to validate - * - * @throws InvalidArgumentException When $key is not valid - */ - public static function validateKey($key) : string - { - if (!\is_string($key)) { - throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', \get_debug_type($key))); - } - if ('' === $key) { - throw new InvalidArgumentException('Cache key length must be greater than zero.'); - } - if (\false !== \strpbrk($key, self::RESERVED_CHARACTERS)) { - throw new InvalidArgumentException(\sprintf('Cache key "%s" contains reserved characters "%s".', $key, self::RESERVED_CHARACTERS)); - } - return $key; - } - /** - * Internal logging helper. - * - * @internal - */ - public static function log(?LoggerInterface $logger, string $message, array $context = []) - { - if ($logger) { - $logger->warning($message, $context); - } else { - $replace = []; - foreach ($context as $k => $v) { - if (\is_scalar($v)) { - $replace['{' . $k . '}'] = $v; - } - } - @\trigger_error(\strtr($message, $replace), \E_USER_WARNING); - } - } -} diff --git a/dependencies/symfony/cache/DataCollector/CacheDataCollector.php b/dependencies/symfony/cache/DataCollector/CacheDataCollector.php deleted file mode 100644 index ecb879c..0000000 --- a/dependencies/symfony/cache/DataCollector/CacheDataCollector.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\DataCollector; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\TraceableAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\TraceableAdapterEvent; -use WP_Ultimo\Dependencies\Symfony\Component\HttpFoundation\Request; -use WP_Ultimo\Dependencies\Symfony\Component\HttpFoundation\Response; -use WP_Ultimo\Dependencies\Symfony\Component\HttpKernel\DataCollector\DataCollector; -use WP_Ultimo\Dependencies\Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; -/** - * @author Aaron Scherer - * @author Tobias Nyholm - * - * @final - */ -class CacheDataCollector extends DataCollector implements LateDataCollectorInterface -{ - /** - * @var TraceableAdapter[] - */ - private $instances = []; - public function addInstance(string $name, TraceableAdapter $instance) - { - $this->instances[$name] = $instance; - } - /** - * {@inheritdoc} - */ - public function collect(Request $request, Response $response, \Throwable $exception = null) - { - $empty = ['calls' => [], 'config' => [], 'options' => [], 'statistics' => []]; - $this->data = ['instances' => $empty, 'total' => $empty]; - foreach ($this->instances as $name => $instance) { - $this->data['instances']['calls'][$name] = $instance->getCalls(); - } - $this->data['instances']['statistics'] = $this->calculateStatistics(); - $this->data['total']['statistics'] = $this->calculateTotalStatistics(); - } - public function reset() - { - $this->data = []; - foreach ($this->instances as $instance) { - $instance->clearCalls(); - } - } - public function lateCollect() - { - $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']); - } - /** - * {@inheritdoc} - */ - public function getName() : string - { - return 'cache'; - } - /** - * Method returns amount of logged Cache reads: "get" calls. - */ - public function getStatistics() : array - { - return $this->data['instances']['statistics']; - } - /** - * Method returns the statistic totals. - */ - public function getTotals() : array - { - return $this->data['total']['statistics']; - } - /** - * Method returns all logged Cache call objects. - * - * @return mixed - */ - public function getCalls() - { - return $this->data['instances']['calls']; - } - private function calculateStatistics() : array - { - $statistics = []; - foreach ($this->data['instances']['calls'] as $name => $calls) { - $statistics[$name] = ['calls' => 0, 'time' => 0, 'reads' => 0, 'writes' => 0, 'deletes' => 0, 'hits' => 0, 'misses' => 0]; - /** @var TraceableAdapterEvent $call */ - foreach ($calls as $call) { - ++$statistics[$name]['calls']; - $statistics[$name]['time'] += ($call->end ?? \microtime(\true)) - $call->start; - if ('get' === $call->name) { - ++$statistics[$name]['reads']; - if ($call->hits) { - ++$statistics[$name]['hits']; - } else { - ++$statistics[$name]['misses']; - ++$statistics[$name]['writes']; - } - } elseif ('getItem' === $call->name) { - ++$statistics[$name]['reads']; - if ($call->hits) { - ++$statistics[$name]['hits']; - } else { - ++$statistics[$name]['misses']; - } - } elseif ('getItems' === $call->name) { - $statistics[$name]['reads'] += $call->hits + $call->misses; - $statistics[$name]['hits'] += $call->hits; - $statistics[$name]['misses'] += $call->misses; - } elseif ('hasItem' === $call->name) { - ++$statistics[$name]['reads']; - foreach ($call->result ?? [] as $result) { - ++$statistics[$name][$result ? 'hits' : 'misses']; - } - } elseif ('save' === $call->name) { - ++$statistics[$name]['writes']; - } elseif ('deleteItem' === $call->name) { - ++$statistics[$name]['deletes']; - } - } - if ($statistics[$name]['reads']) { - $statistics[$name]['hit_read_ratio'] = \round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2); - } else { - $statistics[$name]['hit_read_ratio'] = null; - } - } - return $statistics; - } - private function calculateTotalStatistics() : array - { - $statistics = $this->getStatistics(); - $totals = ['calls' => 0, 'time' => 0, 'reads' => 0, 'writes' => 0, 'deletes' => 0, 'hits' => 0, 'misses' => 0]; - foreach ($statistics as $name => $values) { - foreach ($totals as $key => $value) { - $totals[$key] += $statistics[$name][$key]; - } - } - if ($totals['reads']) { - $totals['hit_read_ratio'] = \round(100 * $totals['hits'] / $totals['reads'], 2); - } else { - $totals['hit_read_ratio'] = null; - } - return $totals; - } -} diff --git a/dependencies/symfony/cache/DependencyInjection/CacheCollectorPass.php b/dependencies/symfony/cache/DependencyInjection/CacheCollectorPass.php deleted file mode 100644 index 4f74584..0000000 --- a/dependencies/symfony/cache/DependencyInjection/CacheCollectorPass.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\TagAwareAdapterInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\TraceableAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Definition; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -/** - * Inject a data collector to all the cache services to be able to get detailed statistics. - * - * @author Tobias Nyholm - */ -class CacheCollectorPass implements CompilerPassInterface -{ - private $dataCollectorCacheId; - private $cachePoolTag; - private $cachePoolRecorderInnerSuffix; - public function __construct(string $dataCollectorCacheId = 'data_collector.cache', string $cachePoolTag = 'cache.pool', string $cachePoolRecorderInnerSuffix = '.recorder_inner') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - $this->dataCollectorCacheId = $dataCollectorCacheId; - $this->cachePoolTag = $cachePoolTag; - $this->cachePoolRecorderInnerSuffix = $cachePoolRecorderInnerSuffix; - } - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->dataCollectorCacheId)) { - return; - } - foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $attributes) { - $poolName = $attributes[0]['name'] ?? $id; - $this->addToCollector($id, $poolName, $container); - } - } - private function addToCollector(string $id, string $name, ContainerBuilder $container) - { - $definition = $container->getDefinition($id); - if ($definition->isAbstract()) { - return; - } - $collectorDefinition = $container->getDefinition($this->dataCollectorCacheId); - $recorder = new Definition(\is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class); - $recorder->setTags($definition->getTags()); - if (!$definition->isPublic() || !$definition->isPrivate()) { - $recorder->setPublic($definition->isPublic()); - } - $recorder->setArguments([new Reference($innerId = $id . $this->cachePoolRecorderInnerSuffix)]); - foreach ($definition->getMethodCalls() as [$method, $args]) { - if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) { - continue; - } - if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) { - $args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']); - } - } - $definition->setTags([]); - $definition->setPublic(\false); - $container->setDefinition($innerId, $definition); - $container->setDefinition($id, $recorder); - // Tell the collector to add the new instance - $collectorDefinition->addMethodCall('addInstance', [$name, new Reference($id)]); - $collectorDefinition->setPublic(\false); - } -} diff --git a/dependencies/symfony/cache/DependencyInjection/CachePoolClearerPass.php b/dependencies/symfony/cache/DependencyInjection/CachePoolClearerPass.php deleted file mode 100644 index cc20033..0000000 --- a/dependencies/symfony/cache/DependencyInjection/CachePoolClearerPass.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -/** - * @author Nicolas Grekas - */ -class CachePoolClearerPass implements CompilerPassInterface -{ - private $cachePoolClearerTag; - public function __construct(string $cachePoolClearerTag = 'cache.pool.clearer') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - $this->cachePoolClearerTag = $cachePoolClearerTag; - } - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - $container->getParameterBag()->remove('cache.prefix.seed'); - foreach ($container->findTaggedServiceIds($this->cachePoolClearerTag) as $id => $attr) { - $clearer = $container->getDefinition($id); - $pools = []; - foreach ($clearer->getArgument(0) as $name => $ref) { - if ($container->hasDefinition($ref)) { - $pools[$name] = new Reference($ref); - } - } - $clearer->replaceArgument(0, $pools); - } - } -} diff --git a/dependencies/symfony/cache/DependencyInjection/CachePoolPass.php b/dependencies/symfony/cache/DependencyInjection/CachePoolPass.php deleted file mode 100644 index c995b73..0000000 --- a/dependencies/symfony/cache/DependencyInjection/CachePoolPass.php +++ /dev/null @@ -1,223 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\AbstractAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\ArrayAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\ChainAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\NullAdapter; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\ParameterNormalizer; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Messenger\EarlyExpirationDispatcher; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ChildDefinition; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Definition; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -/** - * @author Nicolas Grekas - */ -class CachePoolPass implements CompilerPassInterface -{ - private $cachePoolTag; - private $kernelResetTag; - private $cacheClearerId; - private $cachePoolClearerTag; - private $cacheSystemClearerId; - private $cacheSystemClearerTag; - private $reverseContainerId; - private $reversibleTag; - private $messageHandlerId; - public function __construct(string $cachePoolTag = 'cache.pool', string $kernelResetTag = 'kernel.reset', string $cacheClearerId = 'cache.global_clearer', string $cachePoolClearerTag = 'cache.pool.clearer', string $cacheSystemClearerId = 'cache.system_clearer', string $cacheSystemClearerTag = 'kernel.cache_clearer', string $reverseContainerId = 'reverse_container', string $reversibleTag = 'container.reversible', string $messageHandlerId = 'cache.early_expiration_handler') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - $this->cachePoolTag = $cachePoolTag; - $this->kernelResetTag = $kernelResetTag; - $this->cacheClearerId = $cacheClearerId; - $this->cachePoolClearerTag = $cachePoolClearerTag; - $this->cacheSystemClearerId = $cacheSystemClearerId; - $this->cacheSystemClearerTag = $cacheSystemClearerTag; - $this->reverseContainerId = $reverseContainerId; - $this->reversibleTag = $reversibleTag; - $this->messageHandlerId = $messageHandlerId; - } - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - if ($container->hasParameter('cache.prefix.seed')) { - $seed = $container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed')); - } else { - $seed = '_' . $container->getParameter('kernel.project_dir'); - $seed .= '.' . $container->getParameter('kernel.container_class'); - } - $needsMessageHandler = \false; - $allPools = []; - $clearers = []; - $attributes = ['provider', 'name', 'namespace', 'default_lifetime', 'early_expiration_message_bus', 'reset']; - foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $tags) { - $adapter = $pool = $container->getDefinition($id); - if ($pool->isAbstract()) { - continue; - } - $class = $adapter->getClass(); - while ($adapter instanceof ChildDefinition) { - $adapter = $container->findDefinition($adapter->getParent()); - $class = $class ?: $adapter->getClass(); - if ($t = $adapter->getTag($this->cachePoolTag)) { - $tags[0] += $t[0]; - } - } - $name = $tags[0]['name'] ?? $id; - if (!isset($tags[0]['namespace'])) { - $namespaceSeed = $seed; - if (null !== $class) { - $namespaceSeed .= '.' . $class; - } - $tags[0]['namespace'] = $this->getNamespace($namespaceSeed, $name); - } - if (isset($tags[0]['clearer'])) { - $clearer = $tags[0]['clearer']; - while ($container->hasAlias($clearer)) { - $clearer = (string) $container->getAlias($clearer); - } - } else { - $clearer = null; - } - unset($tags[0]['clearer'], $tags[0]['name']); - if (isset($tags[0]['provider'])) { - $tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider'])); - } - if (ChainAdapter::class === $class) { - $adapters = []; - foreach ($adapter->getArgument(0) as $provider => $adapter) { - if ($adapter instanceof ChildDefinition) { - $chainedPool = $adapter; - } else { - $chainedPool = $adapter = new ChildDefinition($adapter); - } - $chainedTags = [\is_int($provider) ? [] : ['provider' => $provider]]; - $chainedClass = ''; - while ($adapter instanceof ChildDefinition) { - $adapter = $container->findDefinition($adapter->getParent()); - $chainedClass = $chainedClass ?: $adapter->getClass(); - if ($t = $adapter->getTag($this->cachePoolTag)) { - $chainedTags[0] += $t[0]; - } - } - if (ChainAdapter::class === $chainedClass) { - throw new InvalidArgumentException(\sprintf('Invalid service "%s": chain of adapters cannot reference another chain, found "%s".', $id, $chainedPool->getParent())); - } - $i = 0; - if (isset($chainedTags[0]['provider'])) { - $chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider']))); - } - if (isset($tags[0]['namespace']) && !\in_array($adapter->getClass(), [ArrayAdapter::class, NullAdapter::class], \true)) { - $chainedPool->replaceArgument($i++, $tags[0]['namespace']); - } - if (isset($tags[0]['default_lifetime'])) { - $chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']); - } - $adapters[] = $chainedPool; - } - $pool->replaceArgument(0, $adapters); - unset($tags[0]['provider'], $tags[0]['namespace']); - $i = 1; - } else { - $i = 0; - } - foreach ($attributes as $attr) { - if (!isset($tags[0][$attr])) { - // no-op - } elseif ('reset' === $attr) { - if ($tags[0][$attr]) { - $pool->addTag($this->kernelResetTag, ['method' => $tags[0][$attr]]); - } - } elseif ('early_expiration_message_bus' === $attr) { - $needsMessageHandler = \true; - $pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class))->addArgument(new Reference($tags[0]['early_expiration_message_bus']))->addArgument(new Reference($this->reverseContainerId))->addArgument((new Definition('callable'))->setFactory([new Reference($id), 'setCallbackWrapper'])->addArgument(null))]); - $pool->addTag($this->reversibleTag); - } elseif ('namespace' !== $attr || !\in_array($class, [ArrayAdapter::class, NullAdapter::class], \true)) { - $argument = $tags[0][$attr]; - if ('default_lifetime' === $attr && !\is_numeric($argument)) { - $argument = (new Definition('int', [$argument]))->setFactory([ParameterNormalizer::class, 'normalizeDuration']); - } - $pool->replaceArgument($i++, $argument); - } - unset($tags[0][$attr]); - } - if (!empty($tags[0])) { - throw new InvalidArgumentException(\sprintf('Invalid "%s" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $this->cachePoolTag, $id, \implode('", "', \array_keys($tags[0])))); - } - if (null !== $clearer) { - $clearers[$clearer][$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE); - } - $allPools[$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE); - } - if (!$needsMessageHandler) { - $container->removeDefinition($this->messageHandlerId); - } - $notAliasedCacheClearerId = $this->cacheClearerId; - while ($container->hasAlias($this->cacheClearerId)) { - $this->cacheClearerId = (string) $container->getAlias($this->cacheClearerId); - } - if ($container->hasDefinition($this->cacheClearerId)) { - $clearers[$notAliasedCacheClearerId] = $allPools; - } - foreach ($clearers as $id => $pools) { - $clearer = $container->getDefinition($id); - if ($clearer instanceof ChildDefinition) { - $clearer->replaceArgument(0, $pools); - } else { - $clearer->setArgument(0, $pools); - } - $clearer->addTag($this->cachePoolClearerTag); - if ($this->cacheSystemClearerId === $id) { - $clearer->addTag($this->cacheSystemClearerTag); - } - } - $allPoolsKeys = \array_keys($allPools); - if ($container->hasDefinition('console.command.cache_pool_list')) { - $container->getDefinition('console.command.cache_pool_list')->replaceArgument(0, $allPoolsKeys); - } - if ($container->hasDefinition('console.command.cache_pool_clear')) { - $container->getDefinition('console.command.cache_pool_clear')->addArgument($allPoolsKeys); - } - if ($container->hasDefinition('console.command.cache_pool_delete')) { - $container->getDefinition('console.command.cache_pool_delete')->addArgument($allPoolsKeys); - } - } - private function getNamespace(string $seed, string $id) - { - return \substr(\str_replace('/', '-', \base64_encode(\hash('sha256', $id . $seed, \true))), 0, 10); - } - /** - * @internal - */ - public static function getServiceProvider(ContainerBuilder $container, string $name) - { - $container->resolveEnvPlaceholders($name, null, $usedEnvs); - if ($usedEnvs || \preg_match('#^[a-z]++:#', $name)) { - $dsn = $name; - if (!$container->hasDefinition($name = '.cache_connection.' . ContainerBuilder::hash($dsn))) { - $definition = new Definition(AbstractAdapter::class); - $definition->setPublic(\false); - $definition->setFactory([AbstractAdapter::class, 'createConnection']); - $definition->setArguments([$dsn, ['lazy' => \true]]); - $container->setDefinition($name, $definition); - } - } - return $name; - } -} diff --git a/dependencies/symfony/cache/DependencyInjection/CachePoolPrunerPass.php b/dependencies/symfony/cache/DependencyInjection/CachePoolPrunerPass.php deleted file mode 100644 index 3bda3bb..0000000 --- a/dependencies/symfony/cache/DependencyInjection/CachePoolPrunerPass.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Argument\IteratorArgument; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -/** - * @author Rob Frawley 2nd - */ -class CachePoolPrunerPass implements CompilerPassInterface -{ - private $cacheCommandServiceId; - private $cachePoolTag; - public function __construct(string $cacheCommandServiceId = 'console.command.cache_pool_prune', string $cachePoolTag = 'cache.pool') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/cache', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - $this->cacheCommandServiceId = $cacheCommandServiceId; - $this->cachePoolTag = $cachePoolTag; - } - /** - * {@inheritdoc} - */ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->cacheCommandServiceId)) { - return; - } - $services = []; - foreach ($container->findTaggedServiceIds($this->cachePoolTag) as $id => $tags) { - $class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass()); - if (!($reflection = $container->getReflectionClass($class))) { - throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if ($reflection->implementsInterface(PruneableInterface::class)) { - $services[$id] = new Reference($id); - } - } - $container->getDefinition($this->cacheCommandServiceId)->replaceArgument(0, new IteratorArgument($services)); - } -} diff --git a/dependencies/symfony/cache/DoctrineProvider.php b/dependencies/symfony/cache/DoctrineProvider.php deleted file mode 100644 index db35e32..0000000 --- a/dependencies/symfony/cache/DoctrineProvider.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache; - -use WP_Ultimo\Dependencies\Doctrine\Common\Cache\CacheProvider; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ResetInterface; -if (!\class_exists(CacheProvider::class)) { - return; -} -/** - * @author Nicolas Grekas - * - * @deprecated Use Doctrine\Common\Cache\Psr6\DoctrineProvider instead - */ -class DoctrineProvider extends CacheProvider implements PruneableInterface, ResettableInterface -{ - private $pool; - public function __construct(CacheItemPoolInterface $pool) - { - trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "Doctrine\\Common\\Cache\\Psr6\\DoctrineProvider" instead.', __CLASS__); - $this->pool = $pool; - } - /** - * {@inheritdoc} - */ - public function prune() - { - return $this->pool instanceof PruneableInterface && $this->pool->prune(); - } - /** - * {@inheritdoc} - */ - public function reset() - { - if ($this->pool instanceof ResetInterface) { - $this->pool->reset(); - } - $this->setNamespace($this->getNamespace()); - } - /** - * {@inheritdoc} - * - * @return mixed - */ - protected function doFetch($id) - { - $item = $this->pool->getItem(\rawurlencode($id)); - return $item->isHit() ? $item->get() : \false; - } - /** - * {@inheritdoc} - * - * @return bool - */ - protected function doContains($id) - { - return $this->pool->hasItem(\rawurlencode($id)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - protected function doSave($id, $data, $lifeTime = 0) - { - $item = $this->pool->getItem(\rawurlencode($id)); - if (0 < $lifeTime) { - $item->expiresAfter($lifeTime); - } - return $this->pool->save($item->set($data)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - protected function doDelete($id) - { - return $this->pool->deleteItem(\rawurlencode($id)); - } - /** - * {@inheritdoc} - * - * @return bool - */ - protected function doFlush() - { - return $this->pool->clear(); - } - /** - * {@inheritdoc} - * - * @return array|null - */ - protected function doGetStats() - { - return null; - } -} diff --git a/dependencies/symfony/cache/Exception/CacheException.php b/dependencies/symfony/cache/Exception/CacheException.php deleted file mode 100644 index 2cad093..0000000 --- a/dependencies/symfony/cache/Exception/CacheException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheException as Psr6CacheInterface; -use WP_Ultimo\Dependencies\Psr\SimpleCache\CacheException as SimpleCacheInterface; -if (\interface_exists(SimpleCacheInterface::class)) { - class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface - { - } -} else { - class CacheException extends \Exception implements Psr6CacheInterface - { - } -} diff --git a/dependencies/symfony/cache/Exception/InvalidArgumentException.php b/dependencies/symfony/cache/Exception/InvalidArgumentException.php deleted file mode 100644 index d895827..0000000 --- a/dependencies/symfony/cache/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception; - -use WP_Ultimo\Dependencies\Psr\Cache\InvalidArgumentException as Psr6CacheInterface; -use WP_Ultimo\Dependencies\Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface; -if (\interface_exists(SimpleCacheInterface::class)) { - class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface - { - } -} else { - class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface - { - } -} diff --git a/dependencies/symfony/cache/Exception/LogicException.php b/dependencies/symfony/cache/Exception/LogicException.php deleted file mode 100644 index a1bf3d4..0000000 --- a/dependencies/symfony/cache/Exception/LogicException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheException as Psr6CacheInterface; -use WP_Ultimo\Dependencies\Psr\SimpleCache\CacheException as SimpleCacheInterface; -if (\interface_exists(SimpleCacheInterface::class)) { - class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface - { - } -} else { - class LogicException extends \LogicException implements Psr6CacheInterface - { - } -} diff --git a/dependencies/symfony/cache/LockRegistry.php b/dependencies/symfony/cache/LockRegistry.php deleted file mode 100644 index 3e9851a..0000000 --- a/dependencies/symfony/cache/LockRegistry.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\ItemInterface; -/** - * LockRegistry is used internally by existing adapters to protect against cache stampede. - * - * It does so by wrapping the computation of items in a pool of locks. - * Foreach each apps, there can be at most 20 concurrent processes that - * compute items at the same time and only one per cache-key. - * - * @author Nicolas Grekas - */ -final class LockRegistry -{ - private static $openedFiles = []; - private static $lockedFiles; - private static $signalingException; - private static $signalingCallback; - /** - * The number of items in this list controls the max number of concurrent processes. - */ - private static $files = [__DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'AbstractAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'AbstractTagAwareAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'AdapterInterface.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'ApcuAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'ArrayAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'ChainAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'CouchbaseBucketAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'CouchbaseCollectionAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'DoctrineAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'DoctrineDbalAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'FilesystemAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'FilesystemTagAwareAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'MemcachedAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'NullAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'ParameterNormalizer.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'PdoAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'PhpArrayAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'PhpFilesAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'ProxyAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'Psr16Adapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'RedisAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'RedisTagAwareAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'TagAwareAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'TagAwareAdapterInterface.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'TraceableAdapter.php', __DIR__ . \DIRECTORY_SEPARATOR . 'Adapter' . \DIRECTORY_SEPARATOR . 'TraceableTagAwareAdapter.php']; - /** - * Defines a set of existing files that will be used as keys to acquire locks. - * - * @return array The previously defined set of files - */ - public static function setFiles(array $files) : array - { - $previousFiles = self::$files; - self::$files = $files; - foreach (self::$openedFiles as $file) { - if ($file) { - \flock($file, \LOCK_UN); - \fclose($file); - } - } - self::$openedFiles = self::$lockedFiles = []; - return $previousFiles; - } - public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata = null, LoggerInterface $logger = null) - { - if ('\\' === \DIRECTORY_SEPARATOR && null === self::$lockedFiles) { - // disable locking on Windows by default - self::$files = self::$lockedFiles = []; - } - $key = self::$files ? \abs(\crc32($item->getKey())) % \count(self::$files) : -1; - if ($key < 0 || self::$lockedFiles || !($lock = self::open($key))) { - return $callback($item, $save); - } - self::$signalingException ?? (self::$signalingException = \unserialize("O:9:\"Exception\":1:{s:16:\"\x00Exception\x00trace\";a:0:{}}")); - self::$signalingCallback ?? (self::$signalingCallback = function () { - throw self::$signalingException; - }); - while (\true) { - try { - $locked = \false; - // race to get the lock in non-blocking mode - $locked = \flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock); - if ($locked || !$wouldBlock) { - $logger && $logger->info(\sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]); - self::$lockedFiles[$key] = \true; - $value = $callback($item, $save); - if ($save) { - if ($setMetadata) { - $setMetadata($item); - } - $pool->save($item->set($value)); - $save = \false; - } - return $value; - } - // if we failed the race, retry locking in blocking mode to wait for the winner - $logger && $logger->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]); - \flock($lock, \LOCK_SH); - } finally { - \flock($lock, \LOCK_UN); - unset(self::$lockedFiles[$key]); - } - try { - $value = $pool->get($item->getKey(), self::$signalingCallback, 0); - $logger && $logger->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]); - $save = \false; - return $value; - } catch (\Exception $e) { - if (self::$signalingException !== $e) { - throw $e; - } - $logger && $logger->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]); - } - } - return null; - } - private static function open(int $key) - { - if (null !== ($h = self::$openedFiles[$key] ?? null)) { - return $h; - } - \set_error_handler(function () { - }); - try { - $h = \fopen(self::$files[$key], 'r+'); - } finally { - \restore_error_handler(); - } - return self::$openedFiles[$key] = $h ?: @\fopen(self::$files[$key], 'r'); - } -} diff --git a/dependencies/symfony/cache/Marshaller/DefaultMarshaller.php b/dependencies/symfony/cache/Marshaller/DefaultMarshaller.php deleted file mode 100644 index 813507a..0000000 --- a/dependencies/symfony/cache/Marshaller/DefaultMarshaller.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -/** - * Serializes/unserializes values using igbinary_serialize() if available, serialize() otherwise. - * - * @author Nicolas Grekas - */ -class DefaultMarshaller implements MarshallerInterface -{ - private $useIgbinarySerialize = \true; - private $throwOnSerializationFailure; - public function __construct(bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = \false) - { - if (null === $useIgbinarySerialize) { - $useIgbinarySerialize = \extension_loaded('igbinary') && (\PHP_VERSION_ID < 70400 || \version_compare('3.1.6', \phpversion('igbinary'), '<=')); - } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || \PHP_VERSION_ID >= 70400 && \version_compare('3.1.6', \phpversion('igbinary'), '>'))) { - throw new CacheException(\extension_loaded('igbinary') && \PHP_VERSION_ID >= 70400 ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.'); - } - $this->useIgbinarySerialize = $useIgbinarySerialize; - $this->throwOnSerializationFailure = $throwOnSerializationFailure; - } - /** - * {@inheritdoc} - */ - public function marshall(array $values, ?array &$failed) : array - { - $serialized = $failed = []; - foreach ($values as $id => $value) { - try { - if ($this->useIgbinarySerialize) { - $serialized[$id] = \igbinary_serialize($value); - } else { - $serialized[$id] = \serialize($value); - } - } catch (\Exception $e) { - if ($this->throwOnSerializationFailure) { - throw new \ValueError($e->getMessage(), 0, $e); - } - $failed[] = $id; - } - } - return $serialized; - } - /** - * {@inheritdoc} - */ - public function unmarshall(string $value) - { - if ('b:0;' === $value) { - return \false; - } - if ('N;' === $value) { - return null; - } - static $igbinaryNull; - if ($value === ($igbinaryNull ?? ($igbinaryNull = \extension_loaded('igbinary') ? \igbinary_serialize(null) : \false))) { - return null; - } - $unserializeCallbackHandler = \ini_set('unserialize_callback_func', __CLASS__ . '::handleUnserializeCallback'); - try { - if (':' === ($value[1] ?? ':')) { - if (\false !== ($value = \unserialize($value))) { - return $value; - } - } elseif (\false === $igbinaryNull) { - throw new \RuntimeException('Failed to unserialize values, did you forget to install the "igbinary" extension?'); - } elseif (null !== ($value = \igbinary_unserialize($value))) { - return $value; - } - throw new \DomainException(\error_get_last() ? \error_get_last()['message'] : 'Failed to unserialize values.'); - } catch (\Error $e) { - throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); - } finally { - \ini_set('unserialize_callback_func', $unserializeCallbackHandler); - } - } - /** - * @internal - */ - public static function handleUnserializeCallback(string $class) - { - throw new \DomainException('Class not found: ' . $class); - } -} diff --git a/dependencies/symfony/cache/Marshaller/DeflateMarshaller.php b/dependencies/symfony/cache/Marshaller/DeflateMarshaller.php deleted file mode 100644 index da85472..0000000 --- a/dependencies/symfony/cache/Marshaller/DeflateMarshaller.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -/** - * Compresses values using gzdeflate(). - * - * @author Nicolas Grekas - */ -class DeflateMarshaller implements MarshallerInterface -{ - private $marshaller; - public function __construct(MarshallerInterface $marshaller) - { - if (!\function_exists('gzdeflate')) { - throw new CacheException('The "zlib" PHP extension is not loaded.'); - } - $this->marshaller = $marshaller; - } - /** - * {@inheritdoc} - */ - public function marshall(array $values, ?array &$failed) : array - { - return \array_map('gzdeflate', $this->marshaller->marshall($values, $failed)); - } - /** - * {@inheritdoc} - */ - public function unmarshall(string $value) - { - if (\false !== ($inflatedValue = @\gzinflate($value))) { - $value = $inflatedValue; - } - return $this->marshaller->unmarshall($value); - } -} diff --git a/dependencies/symfony/cache/Marshaller/MarshallerInterface.php b/dependencies/symfony/cache/Marshaller/MarshallerInterface.php deleted file mode 100644 index 6442550..0000000 --- a/dependencies/symfony/cache/Marshaller/MarshallerInterface.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller; - -/** - * Serializes/unserializes PHP values. - * - * Implementations of this interface MUST deal with errors carefully. They MUST - * also deal with forward and backward compatibility at the storage format level. - * - * @author Nicolas Grekas - */ -interface MarshallerInterface -{ - /** - * Serializes a list of values. - * - * When serialization fails for a specific value, no exception should be - * thrown. Instead, its key should be listed in $failed. - */ - public function marshall(array $values, ?array &$failed) : array; - /** - * Unserializes a single value and throws an exception if anything goes wrong. - * - * @return mixed - * - * @throws \Exception Whenever unserialization fails - */ - public function unmarshall(string $value); -} diff --git a/dependencies/symfony/cache/Marshaller/SodiumMarshaller.php b/dependencies/symfony/cache/Marshaller/SodiumMarshaller.php deleted file mode 100644 index da3f0e9..0000000 --- a/dependencies/symfony/cache/Marshaller/SodiumMarshaller.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -/** - * Encrypt/decrypt values using Libsodium. - * - * @author Ahmed TAILOULOUTE - */ -class SodiumMarshaller implements MarshallerInterface -{ - private $marshaller; - private $decryptionKeys; - /** - * @param string[] $decryptionKeys The key at index "0" is required and is used to decrypt and encrypt values; - * more rotating keys can be provided to decrypt values; - * each key must be generated using sodium_crypto_box_keypair() - */ - public function __construct(array $decryptionKeys, MarshallerInterface $marshaller = null) - { - if (!self::isSupported()) { - throw new CacheException('The "sodium" PHP extension is not loaded.'); - } - if (!isset($decryptionKeys[0])) { - throw new InvalidArgumentException('At least one decryption key must be provided at index "0".'); - } - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - $this->decryptionKeys = $decryptionKeys; - } - public static function isSupported() : bool - { - return \function_exists('sodium_crypto_box_seal'); - } - /** - * {@inheritdoc} - */ - public function marshall(array $values, ?array &$failed) : array - { - $encryptionKey = \sodium_crypto_box_publickey($this->decryptionKeys[0]); - $encryptedValues = []; - foreach ($this->marshaller->marshall($values, $failed) as $k => $v) { - $encryptedValues[$k] = \sodium_crypto_box_seal($v, $encryptionKey); - } - return $encryptedValues; - } - /** - * {@inheritdoc} - */ - public function unmarshall(string $value) - { - foreach ($this->decryptionKeys as $k) { - if (\false !== ($decryptedValue = @\sodium_crypto_box_seal_open($value, $k))) { - $value = $decryptedValue; - break; - } - } - return $this->marshaller->unmarshall($value); - } -} diff --git a/dependencies/symfony/cache/Marshaller/TagAwareMarshaller.php b/dependencies/symfony/cache/Marshaller/TagAwareMarshaller.php deleted file mode 100644 index 7fa6efb..0000000 --- a/dependencies/symfony/cache/Marshaller/TagAwareMarshaller.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller; - -/** - * A marshaller optimized for data structures generated by AbstractTagAwareAdapter. - * - * @author Nicolas Grekas - */ -class TagAwareMarshaller implements MarshallerInterface -{ - private $marshaller; - public function __construct(MarshallerInterface $marshaller = null) - { - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - } - /** - * {@inheritdoc} - */ - public function marshall(array $values, ?array &$failed) : array - { - $failed = $notSerialized = $serialized = []; - foreach ($values as $id => $value) { - if (\is_array($value) && \is_array($value['tags'] ?? null) && \array_key_exists('value', $value) && \count($value) === 2 + (\is_string($value['meta'] ?? null) && 8 === \strlen($value['meta']))) { - // if the value is an array with keys "tags", "value" and "meta", use a compact serialization format - // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F allow detecting this format quickly in unmarshall() - $v = $this->marshaller->marshall($value, $f); - if ($f) { - $f = []; - $failed[] = $id; - } else { - if ([] === $value['tags']) { - $v['tags'] = ''; - } - $serialized[$id] = "\x9d" . ($value['meta'] ?? "\x00\x00\x00\x00\x00\x00\x00\x00") . \pack('N', \strlen($v['tags'])) . $v['tags'] . $v['value']; - $serialized[$id][9] = "_"; - } - } else { - // other arbitrary values are serialized using the decorated marshaller below - $notSerialized[$id] = $value; - } - } - if ($notSerialized) { - $serialized += $this->marshaller->marshall($notSerialized, $f); - $failed = \array_merge($failed, $f); - } - return $serialized; - } - /** - * {@inheritdoc} - */ - public function unmarshall(string $value) - { - // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F - if (13 >= \strlen($value) || "\x9d" !== $value[0] || "\x00" !== $value[5] || "_" !== $value[9]) { - return $this->marshaller->unmarshall($value); - } - // data consists of value, tags and metadata which we need to unpack - $meta = \substr($value, 1, 12); - $meta[8] = "\x00"; - $tagLen = \unpack('Nlen', $meta, 8)['len']; - $meta = \substr($meta, 0, 8); - return ['value' => $this->marshaller->unmarshall(\substr($value, 13 + $tagLen)), 'tags' => $tagLen ? $this->marshaller->unmarshall(\substr($value, 13, $tagLen)) : [], 'meta' => "\x00\x00\x00\x00\x00\x00\x00\x00" === $meta ? null : $meta]; - } -} diff --git a/dependencies/symfony/cache/Messenger/EarlyExpirationDispatcher.php b/dependencies/symfony/cache/Messenger/EarlyExpirationDispatcher.php deleted file mode 100644 index 752b01c..0000000 --- a/dependencies/symfony/cache/Messenger/EarlyExpirationDispatcher.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Messenger; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\AdapterInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ReverseContainer; -use WP_Ultimo\Dependencies\Symfony\Component\Messenger\MessageBusInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Messenger\Stamp\HandledStamp; -/** - * Sends the computation of cached values to a message bus. - */ -class EarlyExpirationDispatcher -{ - private $bus; - private $reverseContainer; - private $callbackWrapper; - public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, callable $callbackWrapper = null) - { - $this->bus = $bus; - $this->reverseContainer = $reverseContainer; - $this->callbackWrapper = $callbackWrapper; - } - public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null) - { - if (!$item->isHit() || null === ($message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool))) { - // The item is stale or the callback cannot be reversed: we must compute the value now - $logger && $logger->info('Computing item "{key}" online: ' . ($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]); - return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save); - } - $envelope = $this->bus->dispatch($message); - if ($logger) { - if ($envelope->last(HandledStamp::class)) { - $logger->info('Item "{key}" was computed online', ['key' => $item->getKey()]); - } else { - $logger->info('Item "{key}" sent for recomputation', ['key' => $item->getKey()]); - } - } - // The item's value is not stale, no need to write it to the backend - $save = \false; - return $message->getItem()->get() ?? $item->get(); - } -} diff --git a/dependencies/symfony/cache/Messenger/EarlyExpirationHandler.php b/dependencies/symfony/cache/Messenger/EarlyExpirationHandler.php deleted file mode 100644 index 05dc28d..0000000 --- a/dependencies/symfony/cache/Messenger/EarlyExpirationHandler.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Messenger; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ReverseContainer; -use WP_Ultimo\Dependencies\Symfony\Component\Messenger\Handler\MessageHandlerInterface; -/** - * Computes cached values sent to a message bus. - */ -class EarlyExpirationHandler implements MessageHandlerInterface -{ - private $reverseContainer; - private $processedNonces = []; - public function __construct(ReverseContainer $reverseContainer) - { - $this->reverseContainer = $reverseContainer; - } - public function __invoke(EarlyExpirationMessage $message) - { - $item = $message->getItem(); - $metadata = $item->getMetadata(); - $expiry = $metadata[CacheItem::METADATA_EXPIRY] ?? 0; - $ctime = $metadata[CacheItem::METADATA_CTIME] ?? 0; - if ($expiry && $ctime) { - // skip duplicate or expired messages - $processingNonce = [$expiry, $ctime]; - $pool = $message->getPool(); - $key = $item->getKey(); - if (($this->processedNonces[$pool][$key] ?? null) === $processingNonce) { - return; - } - if (\microtime(\true) >= $expiry) { - return; - } - $this->processedNonces[$pool] = [$key => $processingNonce] + ($this->processedNonces[$pool] ?? []); - if (\count($this->processedNonces[$pool]) > 100) { - \array_pop($this->processedNonces[$pool]); - } - } - static $setMetadata; - $setMetadata ?? ($setMetadata = \Closure::bind(function (CacheItem $item, float $startTime) { - if ($item->expiry > ($endTime = \microtime(\true))) { - $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry; - $item->newMetadata[CacheItem::METADATA_CTIME] = (int) \ceil(1000 * ($endTime - $startTime)); - } - }, null, CacheItem::class)); - $startTime = \microtime(\true); - $pool = $message->findPool($this->reverseContainer); - $callback = $message->findCallback($this->reverseContainer); - $save = \true; - $value = $callback($item, $save); - $setMetadata($item, $startTime); - $pool->save($item->set($value)); - } -} diff --git a/dependencies/symfony/cache/Messenger/EarlyExpirationMessage.php b/dependencies/symfony/cache/Messenger/EarlyExpirationMessage.php deleted file mode 100644 index 1e4956f..0000000 --- a/dependencies/symfony/cache/Messenger/EarlyExpirationMessage.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Messenger; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\AdapterInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ReverseContainer; -/** - * Conveys a cached value that needs to be computed. - */ -final class EarlyExpirationMessage -{ - private $item; - private $pool; - private $callback; - public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool) : ?self - { - try { - $item = clone $item; - $item->set(null); - } catch (\Exception $e) { - return null; - } - $pool = $reverseContainer->getId($pool); - if (\is_object($callback)) { - if (null === ($id = $reverseContainer->getId($callback))) { - return null; - } - $callback = '@' . $id; - } elseif (!\is_array($callback)) { - $callback = (string) $callback; - } elseif (!\is_object($callback[0])) { - $callback = [(string) $callback[0], (string) $callback[1]]; - } else { - if (null === ($id = $reverseContainer->getId($callback[0]))) { - return null; - } - $callback = ['@' . $id, (string) $callback[1]]; - } - return new self($item, $pool, $callback); - } - public function getItem() : CacheItem - { - return $this->item; - } - public function getPool() : string - { - return $this->pool; - } - public function getCallback() - { - return $this->callback; - } - public function findPool(ReverseContainer $reverseContainer) : AdapterInterface - { - return $reverseContainer->getService($this->pool); - } - public function findCallback(ReverseContainer $reverseContainer) : callable - { - if (\is_string($callback = $this->callback)) { - return '@' === $callback[0] ? $reverseContainer->getService(\substr($callback, 1)) : $callback; - } - if ('@' === $callback[0][0]) { - $callback[0] = $reverseContainer->getService(\substr($callback[0], 1)); - } - return $callback; - } - private function __construct(CacheItem $item, string $pool, $callback) - { - $this->item = $item; - $this->pool = $pool; - $this->callback = $callback; - } -} diff --git a/dependencies/symfony/cache/PruneableInterface.php b/dependencies/symfony/cache/PruneableInterface.php deleted file mode 100644 index bdd68bf..0000000 --- a/dependencies/symfony/cache/PruneableInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache; - -/** - * Interface extends psr-6 and psr-16 caches to allow for pruning (deletion) of all expired cache items. - */ -interface PruneableInterface -{ - /** - * @return bool - */ - public function prune(); -} diff --git a/dependencies/symfony/cache/Psr16Cache.php b/dependencies/symfony/cache/Psr16Cache.php deleted file mode 100644 index 473fd09..0000000 --- a/dependencies/symfony/cache/Psr16Cache.php +++ /dev/null @@ -1,255 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheException as Psr6CacheException; -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemPoolInterface; -use WP_Ultimo\Dependencies\Psr\SimpleCache\CacheException as SimpleCacheException; -use WP_Ultimo\Dependencies\Psr\SimpleCache\CacheInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\AdapterInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits\ProxyTrait; -if (null !== (new \ReflectionMethod(CacheInterface::class, 'get'))->getReturnType()) { - throw new \LogicException('psr/simple-cache 3.0+ is not compatible with this version of symfony/cache. Please upgrade symfony/cache to 6.0+ or downgrade psr/simple-cache to 1.x or 2.x.'); -} -/** - * Turns a PSR-6 cache into a PSR-16 one. - * - * @author Nicolas Grekas - */ -class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterface -{ - use ProxyTrait; - private const METADATA_EXPIRY_OFFSET = 1527506807; - private $createCacheItem; - private $cacheItemPrototype; - public function __construct(CacheItemPoolInterface $pool) - { - $this->pool = $pool; - if (!$pool instanceof AdapterInterface) { - return; - } - $cacheItemPrototype =& $this->cacheItemPrototype; - $createCacheItem = \Closure::bind(static function ($key, $value, $allowInt = \false) use(&$cacheItemPrototype) { - $item = clone $cacheItemPrototype; - $item->poolHash = $item->innerItem = null; - if ($allowInt && \is_int($key)) { - $item->key = (string) $key; - } else { - \assert('' !== CacheItem::validateKey($key)); - $item->key = $key; - } - $item->value = $value; - $item->isHit = \false; - return $item; - }, null, CacheItem::class); - $this->createCacheItem = function ($key, $value, $allowInt = \false) use($createCacheItem) { - if (null === $this->cacheItemPrototype) { - $this->get($allowInt && \is_int($key) ? (string) $key : $key); - } - $this->createCacheItem = $createCacheItem; - return $createCacheItem($key, null, $allowInt)->set($value); - }; - } - /** - * {@inheritdoc} - * - * @return mixed - */ - public function get($key, $default = null) - { - try { - $item = $this->pool->getItem($key); - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - if (null === $this->cacheItemPrototype) { - $this->cacheItemPrototype = clone $item; - $this->cacheItemPrototype->set(null); - } - return $item->isHit() ? $item->get() : $default; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function set($key, $value, $ttl = null) - { - try { - if (null !== ($f = $this->createCacheItem)) { - $item = $f($key, $value); - } else { - $item = $this->pool->getItem($key)->set($value); - } - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - if (null !== $ttl) { - $item->expiresAfter($ttl); - } - return $this->pool->save($item); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function delete($key) - { - try { - return $this->pool->deleteItem($key); - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear() - { - return $this->pool->clear(); - } - /** - * {@inheritdoc} - * - * @return iterable - */ - public function getMultiple($keys, $default = null) - { - if ($keys instanceof \Traversable) { - $keys = \iterator_to_array($keys, \false); - } elseif (!\is_array($keys)) { - throw new InvalidArgumentException(\sprintf('Cache keys must be array or Traversable, "%s" given.', \get_debug_type($keys))); - } - try { - $items = $this->pool->getItems($keys); - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - $values = []; - if (!$this->pool instanceof AdapterInterface) { - foreach ($items as $key => $item) { - $values[$key] = $item->isHit() ? $item->get() : $default; - } - return $values; - } - foreach ($items as $key => $item) { - if (!$item->isHit()) { - $values[$key] = $default; - continue; - } - $values[$key] = $item->get(); - if (!($metadata = $item->getMetadata())) { - continue; - } - unset($metadata[CacheItem::METADATA_TAGS]); - if ($metadata) { - $values[$key] = ["\x9d" . \pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME]) . "_" => $values[$key]]; - } - } - return $values; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function setMultiple($values, $ttl = null) - { - $valuesIsArray = \is_array($values); - if (!$valuesIsArray && !$values instanceof \Traversable) { - throw new InvalidArgumentException(\sprintf('Cache values must be array or Traversable, "%s" given.', \get_debug_type($values))); - } - $items = []; - try { - if (null !== ($f = $this->createCacheItem)) { - $valuesIsArray = \false; - foreach ($values as $key => $value) { - $items[$key] = $f($key, $value, \true); - } - } elseif ($valuesIsArray) { - $items = []; - foreach ($values as $key => $value) { - $items[] = (string) $key; - } - $items = $this->pool->getItems($items); - } else { - foreach ($values as $key => $value) { - if (\is_int($key)) { - $key = (string) $key; - } - $items[$key] = $this->pool->getItem($key)->set($value); - } - } - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - $ok = \true; - foreach ($items as $key => $item) { - if ($valuesIsArray) { - $item->set($values[$key]); - } - if (null !== $ttl) { - $item->expiresAfter($ttl); - } - $ok = $this->pool->saveDeferred($item) && $ok; - } - return $this->pool->commit() && $ok; - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteMultiple($keys) - { - if ($keys instanceof \Traversable) { - $keys = \iterator_to_array($keys, \false); - } elseif (!\is_array($keys)) { - throw new InvalidArgumentException(\sprintf('Cache keys must be array or Traversable, "%s" given.', \get_debug_type($keys))); - } - try { - return $this->pool->deleteItems($keys); - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function has($key) - { - try { - return $this->pool->hasItem($key); - } catch (SimpleCacheException $e) { - throw $e; - } catch (Psr6CacheException $e) { - throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); - } - } -} diff --git a/dependencies/symfony/cache/ResettableInterface.php b/dependencies/symfony/cache/ResettableInterface.php deleted file mode 100644 index deae05a..0000000 --- a/dependencies/symfony/cache/ResettableInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ResetInterface; -/** - * Resets a pool's local state. - */ -interface ResettableInterface extends ResetInterface -{ -} diff --git a/dependencies/symfony/cache/Traits/AbstractAdapterTrait.php b/dependencies/symfony/cache/Traits/AbstractAdapterTrait.php deleted file mode 100644 index 040dfee..0000000 --- a/dependencies/symfony/cache/Traits/AbstractAdapterTrait.php +++ /dev/null @@ -1,372 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -use WP_Ultimo\Dependencies\Psr\Cache\CacheItemInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerAwareTrait; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -/** - * @author Nicolas Grekas - * - * @internal - */ -trait AbstractAdapterTrait -{ - use LoggerAwareTrait; - /** - * @var \Closure needs to be set by class, signature is function(string , mixed , bool ) - */ - private static $createCacheItem; - /** - * @var \Closure needs to be set by class, signature is function(array , string , array <&expiredIds>) - */ - private static $mergeByLifetime; - private $namespace = ''; - private $defaultLifetime; - private $namespaceVersion = ''; - private $versioningIsEnabled = \false; - private $deferred = []; - private $ids = []; - /** - * @var int|null The maximum length to enforce for identifiers or null when no limit applies - */ - protected $maxIdLength; - /** - * Fetches several cache items. - * - * @param array $ids The cache identifiers to fetch - * - * @return array|\Traversable - */ - protected abstract function doFetch(array $ids); - /** - * Confirms if the cache contains specified cache item. - * - * @param string $id The identifier for which to check existence - * - * @return bool - */ - protected abstract function doHave(string $id); - /** - * Deletes all items in the pool. - * - * @param string $namespace The prefix used for all identifiers managed by this pool - * - * @return bool - */ - protected abstract function doClear(string $namespace); - /** - * Removes multiple items from the pool. - * - * @param array $ids An array of identifiers that should be removed from the pool - * - * @return bool - */ - protected abstract function doDelete(array $ids); - /** - * Persists several cache items immediately. - * - * @param array $values The values to cache, indexed by their cache identifier - * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning - * - * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not - */ - protected abstract function doSave(array $values, int $lifetime); - /** - * {@inheritdoc} - * - * @return bool - */ - public function hasItem($key) - { - $id = $this->getId($key); - if (isset($this->deferred[$key])) { - $this->commit(); - } - try { - return $this->doHave($id); - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached: ' . $e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - return \false; - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function clear(string $prefix = '') - { - $this->deferred = []; - if ($cleared = $this->versioningIsEnabled) { - if ('' === ($namespaceVersionToClear = $this->namespaceVersion)) { - foreach ($this->doFetch([static::NS_SEPARATOR . $this->namespace]) as $v) { - $namespaceVersionToClear = $v; - } - } - $namespaceToClear = $this->namespace . $namespaceVersionToClear; - $namespaceVersion = self::formatNamespaceVersion(\mt_rand()); - try { - $e = $this->doSave([static::NS_SEPARATOR . $this->namespace => $namespaceVersion], 0); - } catch (\Exception $e) { - } - if (\true !== $e && [] !== $e) { - $cleared = \false; - $message = 'Failed to save the new namespace' . ($e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => \get_debug_type($this)]); - } else { - $this->namespaceVersion = $namespaceVersion; - $this->ids = []; - } - } else { - $namespaceToClear = $this->namespace . $prefix; - } - try { - return $this->doClear($namespaceToClear) || $cleared; - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to clear the cache: ' . $e->getMessage(), ['exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - return \false; - } - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItem($key) - { - return $this->deleteItems([$key]); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function deleteItems(array $keys) - { - $ids = []; - foreach ($keys as $key) { - $ids[$key] = $this->getId($key); - unset($this->deferred[$key]); - } - try { - if ($this->doDelete($ids)) { - return \true; - } - } catch (\Exception $e) { - } - $ok = \true; - // When bulk-delete failed, retry each item individually - foreach ($ids as $key => $id) { - try { - $e = null; - if ($this->doDelete([$id])) { - continue; - } - } catch (\Exception $e) { - } - $message = 'Failed to delete key "{key}"' . ($e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - $ok = \false; - } - return $ok; - } - /** - * {@inheritdoc} - */ - public function getItem($key) - { - $id = $this->getId($key); - if (isset($this->deferred[$key])) { - $this->commit(); - } - $isHit = \false; - $value = null; - try { - foreach ($this->doFetch([$id]) as $value) { - $isHit = \true; - } - return (self::$createCacheItem)($key, $value, $isHit); - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to fetch key "{key}": ' . $e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - } - return (self::$createCacheItem)($key, null, \false); - } - /** - * {@inheritdoc} - */ - public function getItems(array $keys = []) - { - $ids = []; - $commit = \false; - foreach ($keys as $key) { - $ids[] = $this->getId($key); - $commit = $commit || isset($this->deferred[$key]); - } - if ($commit) { - $this->commit(); - } - try { - $items = $this->doFetch($ids); - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to fetch items: ' . $e->getMessage(), ['keys' => $keys, 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - $items = []; - } - $ids = \array_combine($ids, $keys); - return $this->generateItems($items, $ids); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function save(CacheItemInterface $item) - { - if (!$item instanceof CacheItem) { - return \false; - } - $this->deferred[$item->getKey()] = $item; - return $this->commit(); - } - /** - * {@inheritdoc} - * - * @return bool - */ - public function saveDeferred(CacheItemInterface $item) - { - if (!$item instanceof CacheItem) { - return \false; - } - $this->deferred[$item->getKey()] = $item; - return \true; - } - /** - * Enables/disables versioning of items. - * - * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed, - * but old keys may need garbage collection and extra round-trips to the back-end are required. - * - * Calling this method also clears the memoized namespace version and thus forces a resynchronization of it. - * - * @return bool the previous state of versioning - */ - public function enableVersioning(bool $enable = \true) - { - $wasEnabled = $this->versioningIsEnabled; - $this->versioningIsEnabled = $enable; - $this->namespaceVersion = ''; - $this->ids = []; - return $wasEnabled; - } - /** - * {@inheritdoc} - */ - public function reset() - { - if ($this->deferred) { - $this->commit(); - } - $this->namespaceVersion = ''; - $this->ids = []; - } - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize ' . __CLASS__); - } - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); - } - public function __destruct() - { - if ($this->deferred) { - $this->commit(); - } - } - private function generateItems(iterable $items, array &$keys) : \Generator - { - $f = self::$createCacheItem; - try { - foreach ($items as $id => $value) { - if (!isset($keys[$id])) { - throw new InvalidArgumentException(\sprintf('Could not match value id "%s" to keys "%s".', $id, \implode('", "', $keys))); - } - $key = $keys[$id]; - unset($keys[$id]); - (yield $key => $f($key, $value, \true)); - } - } catch (\Exception $e) { - CacheItem::log($this->logger, 'Failed to fetch items: ' . $e->getMessage(), ['keys' => \array_values($keys), 'exception' => $e, 'cache-adapter' => \get_debug_type($this)]); - } - foreach ($keys as $key) { - (yield $key => $f($key, null, \false)); - } - } - /** - * @internal - */ - protected function getId($key) - { - if ($this->versioningIsEnabled && '' === $this->namespaceVersion) { - $this->ids = []; - $this->namespaceVersion = '1' . static::NS_SEPARATOR; - try { - foreach ($this->doFetch([static::NS_SEPARATOR . $this->namespace]) as $v) { - $this->namespaceVersion = $v; - } - $e = \true; - if ('1' . static::NS_SEPARATOR === $this->namespaceVersion) { - $this->namespaceVersion = self::formatNamespaceVersion(\time()); - $e = $this->doSave([static::NS_SEPARATOR . $this->namespace => $this->namespaceVersion], 0); - } - } catch (\Exception $e) { - } - if (\true !== $e && [] !== $e) { - $message = 'Failed to save the new namespace' . ($e instanceof \Exception ? ': ' . $e->getMessage() : '.'); - CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => \get_debug_type($this)]); - } - } - if (\is_string($key) && isset($this->ids[$key])) { - return $this->namespace . $this->namespaceVersion . $this->ids[$key]; - } - \assert('' !== CacheItem::validateKey($key)); - $this->ids[$key] = $key; - if (\count($this->ids) > 1000) { - $this->ids = \array_slice($this->ids, 500, null, \true); - // stop memory leak if there are many keys - } - if (null === $this->maxIdLength) { - return $this->namespace . $this->namespaceVersion . $key; - } - if (\strlen($id = $this->namespace . $this->namespaceVersion . $key) > $this->maxIdLength) { - // Use MD5 to favor speed over security, which is not an issue here - $this->ids[$key] = $id = \substr_replace(\base64_encode(\hash('md5', $key, \true)), static::NS_SEPARATOR, -(\strlen($this->namespaceVersion) + 2)); - $id = $this->namespace . $this->namespaceVersion . $id; - } - return $id; - } - /** - * @internal - */ - public static function handleUnserializeCallback(string $class) - { - throw new \DomainException('Class not found: ' . $class); - } - private static function formatNamespaceVersion(int $value) : string - { - return \strtr(\substr_replace(\base64_encode(\pack('V', $value)), static::NS_SEPARATOR, 5), '/', '_'); - } -} diff --git a/dependencies/symfony/cache/Traits/ContractsTrait.php b/dependencies/symfony/cache/Traits/ContractsTrait.php deleted file mode 100644 index 302f4ac..0000000 --- a/dependencies/symfony/cache/Traits/ContractsTrait.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\AdapterInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\CacheItem; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\LockRegistry; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\CacheTrait; -use WP_Ultimo\Dependencies\Symfony\Contracts\Cache\ItemInterface; -/** - * @author Nicolas Grekas - * - * @internal - */ -trait ContractsTrait -{ - use CacheTrait { - doGet as private contractsGet; - } - private $callbackWrapper; - private $computing = []; - /** - * Wraps the callback passed to ->get() in a callable. - * - * @return callable the previous callback wrapper - */ - public function setCallbackWrapper(?callable $callbackWrapper) : callable - { - if (!isset($this->callbackWrapper)) { - $this->callbackWrapper = \Closure::fromCallable([LockRegistry::class, 'compute']); - if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], \true)) { - $this->setCallbackWrapper(null); - } - } - $previousWrapper = $this->callbackWrapper; - $this->callbackWrapper = $callbackWrapper ?? static function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) { - return $callback($item, $save); - }; - return $previousWrapper; - } - private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null) - { - if (0 > ($beta = $beta ?? 1.0)) { - throw new InvalidArgumentException(\sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)); - } - static $setMetadata; - $setMetadata ?? ($setMetadata = \Closure::bind(static function (CacheItem $item, float $startTime, ?array &$metadata) { - if ($item->expiry > ($endTime = \microtime(\true))) { - $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry; - $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) \ceil(1000 * ($endTime - $startTime)); - } else { - unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME]); - } - }, null, CacheItem::class)); - return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use($pool, $callback, $setMetadata, &$metadata, $key) { - // don't wrap nor save recursive calls - if (isset($this->computing[$key])) { - $value = $callback($item, $save); - $save = \false; - return $value; - } - $this->computing[$key] = $key; - $startTime = \microtime(\true); - if (!isset($this->callbackWrapper)) { - $this->setCallbackWrapper($this->setCallbackWrapper(null)); - } - try { - $value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use($setMetadata, $startTime, &$metadata) { - $setMetadata($item, $startTime, $metadata); - }, $this->logger ?? null); - $setMetadata($item, $startTime, $metadata); - return $value; - } finally { - unset($this->computing[$key]); - } - }, $beta, $metadata, $this->logger ?? null); - } -} diff --git a/dependencies/symfony/cache/Traits/FilesystemCommonTrait.php b/dependencies/symfony/cache/Traits/FilesystemCommonTrait.php deleted file mode 100644 index 861ddb6..0000000 --- a/dependencies/symfony/cache/Traits/FilesystemCommonTrait.php +++ /dev/null @@ -1,168 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -/** - * @author Nicolas Grekas - * - * @internal - */ -trait FilesystemCommonTrait -{ - private $directory; - private $tmp; - private function init(string $namespace, ?string $directory) - { - if (!isset($directory[0])) { - $directory = \sys_get_temp_dir() . \DIRECTORY_SEPARATOR . 'symfony-cache'; - } else { - $directory = \realpath($directory) ?: $directory; - } - if (isset($namespace[0])) { - if (\preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) { - throw new InvalidArgumentException(\sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); - } - $directory .= \DIRECTORY_SEPARATOR . $namespace; - } else { - $directory .= \DIRECTORY_SEPARATOR . '@'; - } - if (!\is_dir($directory)) { - @\mkdir($directory, 0777, \true); - } - $directory .= \DIRECTORY_SEPARATOR; - // On Windows the whole path is limited to 258 chars - if ('\\' === \DIRECTORY_SEPARATOR && \strlen($directory) > 234) { - throw new InvalidArgumentException(\sprintf('Cache directory too long (%s).', $directory)); - } - $this->directory = $directory; - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - $ok = \true; - foreach ($this->scanHashDir($this->directory) as $file) { - if ('' !== $namespace && !\str_starts_with($this->getFileKey($file), $namespace)) { - continue; - } - $ok = ($this->doUnlink($file) || !\file_exists($file)) && $ok; - } - return $ok; - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - $ok = \true; - foreach ($ids as $id) { - $file = $this->getFile($id); - $ok = (!\is_file($file) || $this->doUnlink($file) || !\file_exists($file)) && $ok; - } - return $ok; - } - protected function doUnlink(string $file) - { - return @\unlink($file); - } - private function write(string $file, string $data, int $expiresAt = null) - { - \set_error_handler(__CLASS__ . '::throwError'); - try { - if (null === $this->tmp) { - $this->tmp = $this->directory . \bin2hex(\random_bytes(6)); - } - try { - $h = \fopen($this->tmp, 'x'); - } catch (\ErrorException $e) { - if (!\str_contains($e->getMessage(), 'File exists')) { - throw $e; - } - $this->tmp = $this->directory . \bin2hex(\random_bytes(6)); - $h = \fopen($this->tmp, 'x'); - } - \fwrite($h, $data); - \fclose($h); - if (null !== $expiresAt) { - \touch($this->tmp, $expiresAt ?: \time() + 31556952); - // 1 year in seconds - } - return \rename($this->tmp, $file); - } finally { - \restore_error_handler(); - } - } - private function getFile(string $id, bool $mkdir = \false, string $directory = null) - { - // Use MD5 to favor speed over security, which is not an issue here - $hash = \str_replace('/', '-', \base64_encode(\hash('md5', static::class . $id, \true))); - $dir = ($directory ?? $this->directory) . \strtoupper($hash[0] . \DIRECTORY_SEPARATOR . $hash[1] . \DIRECTORY_SEPARATOR); - if ($mkdir && !\is_dir($dir)) { - @\mkdir($dir, 0777, \true); - } - return $dir . \substr($hash, 2, 20); - } - private function getFileKey(string $file) : string - { - return ''; - } - private function scanHashDir(string $directory) : \Generator - { - if (!\is_dir($directory)) { - return; - } - $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - for ($i = 0; $i < 38; ++$i) { - if (!\is_dir($directory . $chars[$i])) { - continue; - } - for ($j = 0; $j < 38; ++$j) { - if (!\is_dir($dir = $directory . $chars[$i] . \DIRECTORY_SEPARATOR . $chars[$j])) { - continue; - } - foreach (@\scandir($dir, \SCANDIR_SORT_NONE) ?: [] as $file) { - if ('.' !== $file && '..' !== $file) { - (yield $dir . \DIRECTORY_SEPARATOR . $file); - } - } - } - } - } - /** - * @internal - */ - public static function throwError(int $type, string $message, string $file, int $line) - { - throw new \ErrorException($message, 0, $type, $file, $line); - } - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize ' . __CLASS__); - } - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); - } - public function __destruct() - { - if (\method_exists(parent::class, '__destruct')) { - parent::__destruct(); - } - if (null !== $this->tmp && \is_file($this->tmp)) { - \unlink($this->tmp); - } - } -} diff --git a/dependencies/symfony/cache/Traits/FilesystemTrait.php b/dependencies/symfony/cache/Traits/FilesystemTrait.php deleted file mode 100644 index 58be706..0000000 --- a/dependencies/symfony/cache/Traits/FilesystemTrait.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -/** - * @author Nicolas Grekas - * @author Rob Frawley 2nd - * - * @internal - */ -trait FilesystemTrait -{ - use FilesystemCommonTrait; - private $marshaller; - /** - * @return bool - */ - public function prune() - { - $time = \time(); - $pruned = \true; - foreach ($this->scanHashDir($this->directory) as $file) { - if (!($h = @\fopen($file, 'r'))) { - continue; - } - if (($expiresAt = (int) \fgets($h)) && $time >= $expiresAt) { - \fclose($h); - $pruned = (@\unlink($file) || !\file_exists($file)) && $pruned; - } else { - \fclose($h); - } - } - return $pruned; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - $values = []; - $now = \time(); - foreach ($ids as $id) { - $file = $this->getFile($id); - if (!\is_file($file) || !($h = @\fopen($file, 'r'))) { - continue; - } - if (($expiresAt = (int) \fgets($h)) && $now >= $expiresAt) { - \fclose($h); - @\unlink($file); - } else { - $i = \rawurldecode(\rtrim(\fgets($h))); - $value = \stream_get_contents($h); - \fclose($h); - if ($i === $id) { - $values[$id] = $this->marshaller->unmarshall($value); - } - } - } - return $values; - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - $file = $this->getFile($id); - return \is_file($file) && (@\filemtime($file) > \time() || $this->doFetch([$id])); - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - $expiresAt = $lifetime ? \time() + $lifetime : 0; - $values = $this->marshaller->marshall($values, $failed); - foreach ($values as $id => $value) { - if (!$this->write($this->getFile($id, \true), $expiresAt . "\n" . \rawurlencode($id) . "\n" . $value, $expiresAt)) { - $failed[] = $id; - } - } - if ($failed && !\is_writable($this->directory)) { - throw new CacheException(\sprintf('Cache directory is not writable (%s).', $this->directory)); - } - return $failed; - } - private function getFileKey(string $file) : string - { - if (!($h = @\fopen($file, 'r'))) { - return ''; - } - \fgets($h); - // expiry - $encodedKey = \fgets($h); - \fclose($h); - return \rawurldecode(\rtrim($encodedKey)); - } -} diff --git a/dependencies/symfony/cache/Traits/ProxyTrait.php b/dependencies/symfony/cache/Traits/ProxyTrait.php deleted file mode 100644 index 30471d4..0000000 --- a/dependencies/symfony/cache/Traits/ProxyTrait.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -use WP_Ultimo\Dependencies\Symfony\Component\Cache\PruneableInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ResetInterface; -/** - * @author Nicolas Grekas - * - * @internal - */ -trait ProxyTrait -{ - private $pool; - /** - * {@inheritdoc} - */ - public function prune() - { - return $this->pool instanceof PruneableInterface && $this->pool->prune(); - } - /** - * {@inheritdoc} - */ - public function reset() - { - if ($this->pool instanceof ResetInterface) { - $this->pool->reset(); - } - } -} diff --git a/dependencies/symfony/cache/Traits/RedisClusterNodeProxy.php b/dependencies/symfony/cache/Traits/RedisClusterNodeProxy.php deleted file mode 100644 index d9c6d38..0000000 --- a/dependencies/symfony/cache/Traits/RedisClusterNodeProxy.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -/** - * This file acts as a wrapper to the \RedisCluster implementation so it can accept the same type of calls as - * individual \Redis objects. - * - * Calls are made to individual nodes via: RedisCluster->{method}($host, ...args)' - * according to https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#directed-node-commands - * - * @author Jack Thomas - * - * @internal - */ -class RedisClusterNodeProxy -{ - private $host; - private $redis; - /** - * @param \RedisCluster|RedisClusterProxy $redis - */ - public function __construct(array $host, $redis) - { - $this->host = $host; - $this->redis = $redis; - } - public function __call(string $method, array $args) - { - return $this->redis->{$method}($this->host, ...$args); - } - public function scan(&$iIterator, $strPattern = null, $iCount = null) - { - return $this->redis->scan($iIterator, $this->host, $strPattern, $iCount); - } - public function getOption($name) - { - return $this->redis->getOption($name); - } -} diff --git a/dependencies/symfony/cache/Traits/RedisClusterProxy.php b/dependencies/symfony/cache/Traits/RedisClusterProxy.php deleted file mode 100644 index ee8009b..0000000 --- a/dependencies/symfony/cache/Traits/RedisClusterProxy.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -/** - * @author Alessandro Chitolina - * - * @internal - */ -class RedisClusterProxy -{ - private $redis; - private $initializer; - public function __construct(\Closure $initializer) - { - $this->initializer = $initializer; - } - public function __call(string $method, array $args) - { - $this->redis ?: ($this->redis = $this->initializer->__invoke()); - return $this->redis->{$method}(...$args); - } - public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null) - { - $this->redis ?: ($this->redis = $this->initializer->__invoke()); - return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount); - } - public function scan(&$iIterator, $strPattern = null, $iCount = null) - { - $this->redis ?: ($this->redis = $this->initializer->__invoke()); - return $this->redis->scan($iIterator, $strPattern, $iCount); - } - public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null) - { - $this->redis ?: ($this->redis = $this->initializer->__invoke()); - return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount); - } - public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null) - { - $this->redis ?: ($this->redis = $this->initializer->__invoke()); - return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount); - } -} diff --git a/dependencies/symfony/cache/Traits/RedisProxy.php b/dependencies/symfony/cache/Traits/RedisProxy.php deleted file mode 100644 index 3995fcb..0000000 --- a/dependencies/symfony/cache/Traits/RedisProxy.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -/** - * @author Nicolas Grekas - * - * @internal - */ -class RedisProxy -{ - private $redis; - private $initializer; - private $ready = \false; - public function __construct(\Redis $redis, \Closure $initializer) - { - $this->redis = $redis; - $this->initializer = $initializer; - } - public function __call(string $method, array $args) - { - $this->ready ?: ($this->ready = $this->initializer->__invoke($this->redis)); - return $this->redis->{$method}(...$args); - } - public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null) - { - $this->ready ?: ($this->ready = $this->initializer->__invoke($this->redis)); - return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount); - } - public function scan(&$iIterator, $strPattern = null, $iCount = null) - { - $this->ready ?: ($this->ready = $this->initializer->__invoke($this->redis)); - return $this->redis->scan($iIterator, $strPattern, $iCount); - } - public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null) - { - $this->ready ?: ($this->ready = $this->initializer->__invoke($this->redis)); - return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount); - } - public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null) - { - $this->ready ?: ($this->ready = $this->initializer->__invoke($this->redis)); - return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount); - } -} diff --git a/dependencies/symfony/cache/Traits/RedisTrait.php b/dependencies/symfony/cache/Traits/RedisTrait.php deleted file mode 100644 index bb80ae4..0000000 --- a/dependencies/symfony/cache/Traits/RedisTrait.php +++ /dev/null @@ -1,557 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Cache\Traits; - -use WP_Ultimo\Dependencies\Predis\Command\Redis\UNLINK; -use WP_Ultimo\Dependencies\Predis\Connection\Aggregate\ClusterInterface; -use WP_Ultimo\Dependencies\Predis\Connection\Aggregate\RedisCluster; -use WP_Ultimo\Dependencies\Predis\Connection\Aggregate\ReplicationInterface; -use WP_Ultimo\Dependencies\Predis\Response\ErrorInterface; -use WP_Ultimo\Dependencies\Predis\Response\Status; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\CacheException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\DefaultMarshaller; -use WP_Ultimo\Dependencies\Symfony\Component\Cache\Marshaller\MarshallerInterface; -/** - * @author Aurimas Niekis - * @author Nicolas Grekas - * - * @internal - */ -trait RedisTrait -{ - private static $defaultConnectionOptions = ['class' => null, 'persistent' => 0, 'persistent_id' => null, 'timeout' => 30, 'read_timeout' => 0, 'retry_interval' => 0, 'tcp_keepalive' => 0, 'lazy' => null, 'redis_cluster' => \false, 'redis_sentinel' => null, 'dbindex' => 0, 'failover' => 'none', 'ssl' => null]; - private $redis; - private $marshaller; - /** - * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis - */ - private function init($redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller) - { - parent::__construct($namespace, $defaultLifetime); - if (\preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) { - throw new InvalidArgumentException(\sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); - } - if (!$redis instanceof \Redis && !$redis instanceof \RedisArray && !$redis instanceof \RedisCluster && !$redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && !$redis instanceof RedisProxy && !$redis instanceof RedisClusterProxy) { - throw new InvalidArgumentException(\sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\\ClientInterface, "%s" given.', __METHOD__, \get_debug_type($redis))); - } - if ($redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && $redis->getOptions()->exceptions) { - $options = clone $redis->getOptions(); - \Closure::bind(function () { - $this->options['exceptions'] = \false; - }, $options, $options)(); - $redis = new $redis($redis->getConnection(), $options); - } - $this->redis = $redis; - $this->marshaller = $marshaller ?? new DefaultMarshaller(); - } - /** - * Creates a Redis connection using a DSN configuration. - * - * Example DSN: - * - redis://localhost - * - redis://example.com:1234 - * - redis://secret@example.com/13 - * - redis:///var/run/redis.sock - * - redis://secret@/var/run/redis.sock/13 - * - * @param array $options See self::$defaultConnectionOptions - * - * @return \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface According to the "class" option - * - * @throws InvalidArgumentException when the DSN is invalid - */ - public static function createConnection(string $dsn, array $options = []) - { - if (\str_starts_with($dsn, 'redis:')) { - $scheme = 'redis'; - } elseif (\str_starts_with($dsn, 'rediss:')) { - $scheme = 'rediss'; - } else { - throw new InvalidArgumentException(\sprintf('Invalid Redis DSN: "%s" does not start with "redis:" or "rediss".', $dsn)); - } - if (!\extension_loaded('redis') && !\class_exists(\WP_Ultimo\Dependencies\Predis\Client::class)) { - throw new CacheException(\sprintf('Cannot find the "redis" extension nor the "predis/predis" package: "%s".', $dsn)); - } - $params = \preg_replace_callback('#^' . $scheme . ':(//)?(?:(?:[^:@]*+:)?([^@]*+)@)?#', function ($m) use(&$auth) { - if (isset($m[2])) { - $auth = $m[2]; - if ('' === $auth) { - $auth = null; - } - } - return 'file:' . ($m[1] ?? ''); - }, $dsn); - if (\false === ($params = \parse_url($params))) { - throw new InvalidArgumentException(\sprintf('Invalid Redis DSN: "%s".', $dsn)); - } - $query = $hosts = []; - $tls = 'rediss' === $scheme; - $tcpScheme = $tls ? 'tls' : 'tcp'; - if (isset($params['query'])) { - \parse_str($params['query'], $query); - if (isset($query['host'])) { - if (!\is_array($hosts = $query['host'])) { - throw new InvalidArgumentException(\sprintf('Invalid Redis DSN: "%s".', $dsn)); - } - foreach ($hosts as $host => $parameters) { - if (\is_string($parameters)) { - \parse_str($parameters, $parameters); - } - if (\false === ($i = \strrpos($host, ':'))) { - $hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters; - } elseif ($port = (int) \substr($host, 1 + $i)) { - $hosts[$host] = ['scheme' => $tcpScheme, 'host' => \substr($host, 0, $i), 'port' => $port] + $parameters; - } else { - $hosts[$host] = ['scheme' => 'unix', 'path' => \substr($host, 0, $i)] + $parameters; - } - } - $hosts = \array_values($hosts); - } - } - if (isset($params['host']) || isset($params['path'])) { - if (!isset($params['dbindex']) && isset($params['path'])) { - if (\preg_match('#/(\\d+)?$#', $params['path'], $m)) { - $params['dbindex'] = $m[1] ?? '0'; - $params['path'] = \substr($params['path'], 0, -\strlen($m[0])); - } elseif (isset($params['host'])) { - throw new InvalidArgumentException(\sprintf('Invalid Redis DSN: "%s", the "dbindex" parameter must be a number.', $dsn)); - } - } - if (isset($params['host'])) { - \array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]); - } else { - \array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]); - } - } - if (!$hosts) { - throw new InvalidArgumentException(\sprintf('Invalid Redis DSN: "%s".', $dsn)); - } - $params += $query + $options + self::$defaultConnectionOptions; - if (isset($params['redis_sentinel']) && !\class_exists(\WP_Ultimo\Dependencies\Predis\Client::class) && !\class_exists(\RedisSentinel::class)) { - throw new CacheException(\sprintf('Redis Sentinel support requires the "predis/predis" package or the "redis" extension v5.2 or higher: "%s".', $dsn)); - } - if (isset($params['lazy'])) { - $params['lazy'] = \filter_var($params['lazy'], \FILTER_VALIDATE_BOOLEAN); - } - $params['redis_cluster'] = \filter_var($params['redis_cluster'], \FILTER_VALIDATE_BOOLEAN); - if ($params['redis_cluster'] && isset($params['redis_sentinel'])) { - throw new InvalidArgumentException(\sprintf('Cannot use both "redis_cluster" and "redis_sentinel" at the same time: "%s".', $dsn)); - } - if (null === $params['class'] && \extension_loaded('redis')) { - $class = $params['redis_cluster'] ? \RedisCluster::class : (1 < \count($hosts) && !isset($params['redis_sentinel']) ? \RedisArray::class : \Redis::class); - } else { - $class = $params['class'] ?? \WP_Ultimo\Dependencies\Predis\Client::class; - if (isset($params['redis_sentinel']) && !\is_a($class, \WP_Ultimo\Dependencies\Predis\Client::class, \true) && !\class_exists(\RedisSentinel::class)) { - throw new CacheException(\sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\\Client" and ext-redis >= 5.2 not found: "%s".', $class, $dsn)); - } - } - if (\is_a($class, \Redis::class, \true)) { - $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect'; - $redis = new $class(); - $initializer = static function ($redis) use($connect, $params, $dsn, $auth, $hosts, $tls) { - $hostIndex = 0; - do { - $host = $hosts[$hostIndex]['host'] ?? $hosts[$hostIndex]['path']; - $port = $hosts[$hostIndex]['port'] ?? 0; - $passAuth = \defined('Redis::OPT_NULL_MULTIBULK_AS_NULL') && isset($params['auth']); - $address = \false; - if (isset($hosts[$hostIndex]['host']) && $tls) { - $host = 'tls://' . $host; - } - if (!isset($params['redis_sentinel'])) { - break; - } - if (\version_compare(\phpversion('redis'), '6.0.0', '>=')) { - $options = ['host' => $host, 'port' => $port, 'connectTimeout' => $params['timeout'], 'persistent' => $params['persistent_id'], 'retryInterval' => $params['retry_interval'], 'readTimeout' => $params['read_timeout']]; - if ($passAuth) { - $options['auth'] = $params['auth']; - } - $sentinel = new \RedisSentinel($options); - } else { - $extra = $passAuth ? [$params['auth']] : []; - $sentinel = new \RedisSentinel($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...$extra); - } - try { - if ($address = $sentinel->getMasterAddrByName($params['redis_sentinel'])) { - [$host, $port] = $address; - } - } catch (\RedisException $e) { - } - } while (++$hostIndex < \count($hosts) && !$address); - if (isset($params['redis_sentinel']) && !$address) { - throw new InvalidArgumentException(\sprintf('Failed to retrieve master information from sentinel "%s" and dsn "%s".', $params['redis_sentinel'], $dsn)); - } - try { - $extra = ['stream' => $params['ssl'] ?? null]; - if (isset($params['auth'])) { - $extra['auth'] = $params['auth']; - } - @$redis->{$connect}($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\defined('Redis::SCAN_PREFIX') ? [$extra] : []); - \set_error_handler(function ($type, $msg) use(&$error) { - $error = $msg; - }); - try { - $isConnected = $redis->isConnected(); - } finally { - \restore_error_handler(); - } - if (!$isConnected) { - $error = \preg_match('/^Redis::p?connect\\(\\): (.*)/', $error ?? '', $error) ? \sprintf(' (%s)', $error[1]) : ''; - throw new InvalidArgumentException(\sprintf('Redis connection "%s" failed: ', $dsn) . $error . '.'); - } - if (null !== $auth && !$redis->auth($auth) || $params['dbindex'] && !$redis->select($params['dbindex'])) { - $e = \preg_replace('/^ERR /', '', $redis->getLastError()); - throw new InvalidArgumentException(\sprintf('Redis connection "%s" failed: ', $dsn) . $e . '.'); - } - if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) { - $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); - } - } catch (\RedisException $e) { - throw new InvalidArgumentException(\sprintf('Redis connection "%s" failed: ', $dsn) . $e->getMessage()); - } - return \true; - }; - if ($params['lazy']) { - $redis = new RedisProxy($redis, $initializer); - } else { - $initializer($redis); - } - } elseif (\is_a($class, \RedisArray::class, \true)) { - foreach ($hosts as $i => $host) { - switch ($host['scheme']) { - case 'tcp': - $hosts[$i] = $host['host'] . ':' . $host['port']; - break; - case 'tls': - $hosts[$i] = 'tls://' . $host['host'] . ':' . $host['port']; - break; - default: - $hosts[$i] = $host['path']; - } - } - $params['lazy_connect'] = $params['lazy'] ?? \true; - $params['connect_timeout'] = $params['timeout']; - try { - $redis = new $class($hosts, $params); - } catch (\RedisClusterException $e) { - throw new InvalidArgumentException(\sprintf('Redis connection "%s" failed: ', $dsn) . $e->getMessage()); - } - if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) { - $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); - } - } elseif (\is_a($class, \RedisCluster::class, \true)) { - $initializer = static function () use($class, $params, $dsn, $hosts) { - foreach ($hosts as $i => $host) { - switch ($host['scheme']) { - case 'tcp': - $hosts[$i] = $host['host'] . ':' . $host['port']; - break; - case 'tls': - $hosts[$i] = 'tls://' . $host['host'] . ':' . $host['port']; - break; - default: - $hosts[$i] = $host['path']; - } - } - try { - $redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent'], $params['auth'] ?? '', ...\defined('Redis::SCAN_PREFIX') ? [$params['ssl'] ?? null] : []); - } catch (\RedisClusterException $e) { - throw new InvalidArgumentException(\sprintf('Redis connection "%s" failed: ', $dsn) . $e->getMessage()); - } - if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) { - $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); - } - switch ($params['failover']) { - case 'error': - $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_ERROR); - break; - case 'distribute': - $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE); - break; - case 'slaves': - $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES); - break; - } - return $redis; - }; - $redis = $params['lazy'] ? new RedisClusterProxy($initializer) : $initializer(); - } elseif (\is_a($class, \WP_Ultimo\Dependencies\Predis\ClientInterface::class, \true)) { - if ($params['redis_cluster']) { - $params['cluster'] = 'redis'; - } elseif (isset($params['redis_sentinel'])) { - $params['replication'] = 'sentinel'; - $params['service'] = $params['redis_sentinel']; - } - $params += ['parameters' => []]; - $params['parameters'] += ['persistent' => $params['persistent'], 'timeout' => $params['timeout'], 'read_write_timeout' => $params['read_timeout'], 'tcp_nodelay' => \true]; - if ($params['dbindex']) { - $params['parameters']['database'] = $params['dbindex']; - } - if (null !== $auth) { - $params['parameters']['password'] = $auth; - } - if (isset($params['ssl'])) { - foreach ($hosts as $i => $host) { - if (!isset($host['ssl'])) { - $hosts[$i]['ssl'] = $params['ssl']; - } - } - } - if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) { - $hosts = $hosts[0]; - } elseif (\in_array($params['failover'], ['slaves', 'distribute'], \true) && !isset($params['replication'])) { - $params['replication'] = \true; - $hosts[0] += ['alias' => 'master']; - } - $params['exceptions'] = \false; - $redis = new $class($hosts, \array_diff_key($params, self::$defaultConnectionOptions)); - if (isset($params['redis_sentinel'])) { - $redis->getConnection()->setSentinelTimeout($params['timeout']); - } - } elseif (\class_exists($class, \false)) { - throw new InvalidArgumentException(\sprintf('"%s" is not a subclass of "Redis", "RedisArray", "RedisCluster" nor "Predis\\ClientInterface".', $class)); - } else { - throw new InvalidArgumentException(\sprintf('Class "%s" does not exist.', $class)); - } - return $redis; - } - /** - * {@inheritdoc} - */ - protected function doFetch(array $ids) - { - if (!$ids) { - return []; - } - $result = []; - if ($this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) { - $values = $this->pipeline(function () use($ids) { - foreach ($ids as $id) { - (yield 'get' => [$id]); - } - }); - } else { - $values = $this->redis->mget($ids); - if (!\is_array($values) || \count($values) !== \count($ids)) { - return []; - } - $values = \array_combine($ids, $values); - } - foreach ($values as $id => $v) { - if ($v) { - $result[$id] = $this->marshaller->unmarshall($v); - } - } - return $result; - } - /** - * {@inheritdoc} - */ - protected function doHave(string $id) - { - return (bool) $this->redis->exists($id); - } - /** - * {@inheritdoc} - */ - protected function doClear(string $namespace) - { - if ($this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface) { - $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; - $prefixLen = \strlen($prefix ?? ''); - } - $cleared = \true; - $hosts = $this->getHosts(); - $host = \reset($hosts); - if ($host instanceof \WP_Ultimo\Dependencies\Predis\Client && $host->getConnection() instanceof ReplicationInterface) { - // Predis supports info command only on the master in replication environments - $hosts = [$host->getClientFor('master')]; - } - foreach ($hosts as $host) { - if (!isset($namespace[0])) { - $cleared = $host->flushDb() && $cleared; - continue; - } - $info = $host->info('Server'); - $info = !$info instanceof ErrorInterface ? $info['Server'] ?? $info : ['redis_version' => '2.0']; - if (!$host instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface) { - $prefix = \defined('Redis::SCAN_PREFIX') && \Redis::SCAN_PREFIX & $host->getOption(\Redis::OPT_SCAN) ? '' : $host->getOption(\Redis::OPT_PREFIX); - $prefixLen = \strlen($host->getOption(\Redis::OPT_PREFIX) ?? ''); - } - $pattern = $prefix . $namespace . '*'; - if (!\version_compare($info['redis_version'], '2.8', '>=')) { - // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS - // can hang your server when it is executed against large databases (millions of items). - // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above. - $unlink = \version_compare($info['redis_version'], '4.0', '>=') ? 'UNLINK' : 'DEL'; - $args = $this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface ? [0, $pattern] : [[$pattern], 0]; - $cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]) for i=1,#keys,5000 do redis.call('{$unlink}',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $args[0], $args[1]) && $cleared; - continue; - } - $cursor = null; - do { - $keys = $host instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface ? $host->scan($cursor, 'MATCH', $pattern, 'COUNT', 1000) : $host->scan($cursor, $pattern, 1000); - if (isset($keys[1]) && \is_array($keys[1])) { - $cursor = $keys[0]; - $keys = $keys[1]; - } - if ($keys) { - if ($prefixLen) { - foreach ($keys as $i => $key) { - $keys[$i] = \substr($key, $prefixLen); - } - } - $this->doDelete($keys); - } - } while ($cursor = (int) $cursor); - } - return $cleared; - } - /** - * {@inheritdoc} - */ - protected function doDelete(array $ids) - { - if (!$ids) { - return \true; - } - if ($this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) { - static $del; - $del = $del ?? (\class_exists(UNLINK::class) ? 'unlink' : 'del'); - $this->pipeline(function () use($ids, $del) { - foreach ($ids as $id) { - (yield $del => [$id]); - } - })->rewind(); - } else { - static $unlink = \true; - if ($unlink) { - try { - $unlink = \false !== $this->redis->unlink($ids); - } catch (\Throwable $e) { - $unlink = \false; - } - } - if (!$unlink) { - $this->redis->del($ids); - } - } - return \true; - } - /** - * {@inheritdoc} - */ - protected function doSave(array $values, int $lifetime) - { - if (!($values = $this->marshaller->marshall($values, $failed))) { - return $failed; - } - $results = $this->pipeline(function () use($values, $lifetime) { - foreach ($values as $id => $value) { - if (0 >= $lifetime) { - (yield 'set' => [$id, $value]); - } else { - (yield 'setEx' => [$id, $lifetime, $value]); - } - } - }); - foreach ($results as $id => $result) { - if (\true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) { - $failed[] = $id; - } - } - return $failed; - } - private function pipeline(\Closure $generator, object $redis = null) : \Generator - { - $ids = []; - $redis = $redis ?? $this->redis; - if ($redis instanceof RedisClusterProxy || $redis instanceof \RedisCluster || $redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && $redis->getConnection() instanceof RedisCluster) { - // phpredis & predis don't support pipelining with RedisCluster - // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining - // see https://github.com/nrk/predis/issues/267#issuecomment-123781423 - $results = []; - foreach ($generator() as $command => $args) { - $results[] = $redis->{$command}(...$args); - $ids[] = 'eval' === $command ? $redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface ? $args[2] : $args[1][0] : $args[0]; - } - } elseif ($redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface) { - $results = $redis->pipeline(static function ($redis) use($generator, &$ids) { - foreach ($generator() as $command => $args) { - $redis->{$command}(...$args); - $ids[] = 'eval' === $command ? $args[2] : $args[0]; - } - }); - } elseif ($redis instanceof \RedisArray) { - $connections = $results = $ids = []; - foreach ($generator() as $command => $args) { - $id = 'eval' === $command ? $args[1][0] : $args[0]; - if (!isset($connections[$h = $redis->_target($id)])) { - $connections[$h] = [$redis->_instance($h), -1]; - $connections[$h][0]->multi(\Redis::PIPELINE); - } - $connections[$h][0]->{$command}(...$args); - $results[] = [$h, ++$connections[$h][1]]; - $ids[] = $id; - } - foreach ($connections as $h => $c) { - $connections[$h] = $c[0]->exec(); - } - foreach ($results as $k => [$h, $c]) { - $results[$k] = $connections[$h][$c]; - } - } else { - $redis->multi(\Redis::PIPELINE); - foreach ($generator() as $command => $args) { - $redis->{$command}(...$args); - $ids[] = 'eval' === $command ? $args[1][0] : $args[0]; - } - $results = $redis->exec(); - } - if (!$redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface && 'eval' === $command && $redis->getLastError()) { - $e = new \RedisException($redis->getLastError()); - $results = \array_map(function ($v) use($e) { - return \false === $v ? $e : $v; - }, (array) $results); - } - if (\is_bool($results)) { - return; - } - foreach ($ids as $k => $id) { - (yield $id => $results[$k]); - } - } - private function getHosts() : array - { - $hosts = [$this->redis]; - if ($this->redis instanceof \WP_Ultimo\Dependencies\Predis\ClientInterface) { - $connection = $this->redis->getConnection(); - if ($connection instanceof ClusterInterface && $connection instanceof \Traversable) { - $hosts = []; - foreach ($connection as $c) { - $hosts[] = new \WP_Ultimo\Dependencies\Predis\Client($c); - } - } - } elseif ($this->redis instanceof \RedisArray) { - $hosts = []; - foreach ($this->redis->_hosts() as $host) { - $hosts[] = $this->redis->_instance($host); - } - } elseif ($this->redis instanceof RedisClusterProxy || $this->redis instanceof \RedisCluster) { - $hosts = []; - foreach ($this->redis->_masters() as $host) { - $hosts[] = new RedisClusterNodeProxy($host, $this->redis); - } - } - return $hosts; - } -} diff --git a/dependencies/symfony/deprecation-contracts/function.php b/dependencies/symfony/deprecation-contracts/function.php deleted file mode 100644 index 78a2166..0000000 --- a/dependencies/symfony/deprecation-contracts/function.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (!\function_exists('WP_Ultimo\\Dependencies\\trigger_deprecation')) { - /** - * Triggers a silenced deprecation notice. - * - * @param string $package The name of the Composer package that is triggering the deprecation - * @param string $version The version of the package that introduced the deprecation - * @param string $message The message of the deprecation - * @param mixed ...$args Values to insert in the message using printf() formatting - * - * @author Nicolas Grekas - */ - function trigger_deprecation(string $package, string $version, string $message, mixed ...$args) : void - { - @\trigger_error(($package || $version ? "Since {$package} {$version}: " : '') . ($args ? \vsprintf($message, $args) : $message), \E_USER_DEPRECATED); - } -} diff --git a/dependencies/symfony/event-dispatcher-contracts/Event.php b/dependencies/symfony/event-dispatcher-contracts/Event.php deleted file mode 100644 index c80ae22..0000000 --- a/dependencies/symfony/event-dispatcher-contracts/Event.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\EventDispatcher; - -use WP_Ultimo\Dependencies\Psr\EventDispatcher\StoppableEventInterface; -/** - * Event is the base class for classes containing event data. - * - * This class contains no event data. It is used by events that do not pass - * state information to an event handler when an event is raised. - * - * You can call the method stopPropagation() to abort the execution of - * further listeners in your event listener. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Nicolas Grekas - */ -class Event implements StoppableEventInterface -{ - private bool $propagationStopped = \false; - public function isPropagationStopped() : bool - { - return $this->propagationStopped; - } - /** - * Stops the propagation of the event to further event listeners. - * - * If multiple event listeners are connected to the same event, no - * further event listener will be triggered once any trigger calls - * stopPropagation(). - */ - public function stopPropagation() : void - { - $this->propagationStopped = \true; - } -} diff --git a/dependencies/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/dependencies/symfony/event-dispatcher-contracts/EventDispatcherInterface.php deleted file mode 100644 index 31b4845..0000000 --- a/dependencies/symfony/event-dispatcher-contracts/EventDispatcherInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\EventDispatcher; - -use WP_Ultimo\Dependencies\Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface; -/** - * Allows providing hooks on domain-specific lifecycles by dispatching events. - */ -interface EventDispatcherInterface extends PsrEventDispatcherInterface -{ - /** - * Dispatches an event to all registered listeners. - * - * @template T of object - * - * @param T $event The event to pass to the event handlers/listeners - * @param string|null $eventName The name of the event to dispatch. If not supplied, - * the class of $event should be used instead. - * - * @return T The passed $event MUST be returned - */ - public function dispatch(object $event, string $eventName = null) : object; -} diff --git a/dependencies/symfony/event-dispatcher/Attribute/AsEventListener.php b/dependencies/symfony/event-dispatcher/Attribute/AsEventListener.php deleted file mode 100644 index dfcc12f..0000000 --- a/dependencies/symfony/event-dispatcher/Attribute/AsEventListener.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\Attribute; - -/** - * Service tag to autoconfigure event listeners. - * - * @author Alexander M. Turek - */ -#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] -class AsEventListener -{ - public function __construct(public ?string $event = null, public ?string $method = null, public int $priority = 0, public ?string $dispatcher = null) - { - } -} diff --git a/dependencies/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/dependencies/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php deleted file mode 100644 index 851972b..0000000 --- a/dependencies/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ /dev/null @@ -1,315 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\Debug; - -use WP_Ultimo\Dependencies\Psr\EventDispatcher\StoppableEventInterface; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\EventDispatcherInterface; -use WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\EventSubscriberInterface; -use WP_Ultimo\Dependencies\Symfony\Component\HttpFoundation\Request; -use WP_Ultimo\Dependencies\Symfony\Component\HttpFoundation\RequestStack; -use WP_Ultimo\Dependencies\Symfony\Component\Stopwatch\Stopwatch; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ResetInterface; -/** - * Collects some data about event listeners. - * - * This event dispatcher delegates the dispatching to another one. - * - * @author Fabien Potencier - */ -class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface -{ - protected $logger; - protected $stopwatch; - /** - * @var \SplObjectStorage - */ - private $callStack; - private $dispatcher; - private $wrappedListeners; - private $orphanedEvents; - private $requestStack; - private $currentRequestHash = ''; - public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null, RequestStack $requestStack = null) - { - $this->dispatcher = $dispatcher; - $this->stopwatch = $stopwatch; - $this->logger = $logger; - $this->wrappedListeners = []; - $this->orphanedEvents = []; - $this->requestStack = $requestStack; - } - /** - * {@inheritdoc} - */ - public function addListener(string $eventName, $listener, int $priority = 0) - { - $this->dispatcher->addListener($eventName, $listener, $priority); - } - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->dispatcher->addSubscriber($subscriber); - } - /** - * {@inheritdoc} - */ - public function removeListener(string $eventName, $listener) - { - if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener || $listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener) { - $listener = $wrappedListener; - unset($this->wrappedListeners[$eventName][$index]); - break; - } - } - } - return $this->dispatcher->removeListener($eventName, $listener); - } - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - return $this->dispatcher->removeSubscriber($subscriber); - } - /** - * {@inheritdoc} - */ - public function getListeners(string $eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - /** - * {@inheritdoc} - */ - public function getListenerPriority(string $eventName, $listener) - { - // we might have wrapped listeners for the event (if called while dispatching) - // in that case get the priority by wrapper - if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener || $listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener) { - return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); - } - } - } - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - /** - * {@inheritdoc} - */ - public function hasListeners(string $eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null) : object - { - $eventName = $eventName ?? \get_class($event); - if (null === $this->callStack) { - $this->callStack = new \SplObjectStorage(); - } - $currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? \spl_object_hash($request) : ''; - if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) { - $this->logger->debug(\sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName)); - } - $this->preProcess($eventName); - try { - $this->beforeDispatch($eventName, $event); - try { - $e = $this->stopwatch->start($eventName, 'section'); - try { - $this->dispatcher->dispatch($event, $eventName); - } finally { - if ($e->isStarted()) { - $e->stop(); - } - } - } finally { - $this->afterDispatch($eventName, $event); - } - } finally { - $this->currentRequestHash = $currentRequestHash; - $this->postProcess($eventName); - } - return $event; - } - /** - * @return array - */ - public function getCalledListeners(Request $request = null) - { - if (null === $this->callStack) { - return []; - } - $hash = $request ? \spl_object_hash($request) : null; - $called = []; - foreach ($this->callStack as $listener) { - [$eventName, $requestHash] = $this->callStack->getInfo(); - if (null === $hash || $hash === $requestHash) { - $called[] = $listener->getInfo($eventName); - } - } - return $called; - } - /** - * @return array - */ - public function getNotCalledListeners(Request $request = null) - { - try { - $allListeners = $this->getListeners(); - } catch (\Exception $e) { - if (null !== $this->logger) { - $this->logger->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]); - } - // unable to retrieve the uncalled listeners - return []; - } - $hash = $request ? \spl_object_hash($request) : null; - $calledListeners = []; - if (null !== $this->callStack) { - foreach ($this->callStack as $calledListener) { - [, $requestHash] = $this->callStack->getInfo(); - if (null === $hash || $hash === $requestHash) { - $calledListeners[] = $calledListener->getWrappedListener(); - } - } - } - $notCalled = []; - foreach ($allListeners as $eventName => $listeners) { - foreach ($listeners as $listener) { - if (!\in_array($listener, $calledListeners, \true)) { - if (!$listener instanceof WrappedListener) { - $listener = new WrappedListener($listener, null, $this->stopwatch, $this); - } - $notCalled[] = $listener->getInfo($eventName); - } - } - } - \uasort($notCalled, [$this, 'sortNotCalledListeners']); - return $notCalled; - } - public function getOrphanedEvents(Request $request = null) : array - { - if ($request) { - return $this->orphanedEvents[\spl_object_hash($request)] ?? []; - } - if (!$this->orphanedEvents) { - return []; - } - return \array_merge(...\array_values($this->orphanedEvents)); - } - public function reset() - { - $this->callStack = null; - $this->orphanedEvents = []; - $this->currentRequestHash = ''; - } - /** - * Proxies all method calls to the original event dispatcher. - * - * @param string $method The method name - * @param array $arguments The method arguments - * - * @return mixed - */ - public function __call(string $method, array $arguments) - { - return $this->dispatcher->{$method}(...$arguments); - } - /** - * Called before dispatching the event. - */ - protected function beforeDispatch(string $eventName, object $event) - { - } - /** - * Called after dispatching the event. - */ - protected function afterDispatch(string $eventName, object $event) - { - } - private function preProcess(string $eventName) : void - { - if (!$this->dispatcher->hasListeners($eventName)) { - $this->orphanedEvents[$this->currentRequestHash][] = $eventName; - return; - } - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - $priority = $this->getListenerPriority($eventName, $listener); - $wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this); - $this->wrappedListeners[$eventName][] = $wrappedListener; - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $wrappedListener, $priority); - $this->callStack->attach($wrappedListener, [$eventName, $this->currentRequestHash]); - } - } - private function postProcess(string $eventName) : void - { - unset($this->wrappedListeners[$eventName]); - $skipped = \false; - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - if (!$listener instanceof WrappedListener) { - // #12845: a new listener was added during dispatch. - continue; - } - // Unwrap listener - $priority = $this->getListenerPriority($eventName, $listener); - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority); - if (null !== $this->logger) { - $context = ['event' => $eventName, 'listener' => $listener->getPretty()]; - } - if ($listener->wasCalled()) { - if (null !== $this->logger) { - $this->logger->debug('Notified event "{event}" to listener "{listener}".', $context); - } - } else { - $this->callStack->detach($listener); - } - if (null !== $this->logger && $skipped) { - $this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context); - } - if ($listener->stoppedPropagation()) { - if (null !== $this->logger) { - $this->logger->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context); - } - $skipped = \true; - } - } - } - private function sortNotCalledListeners(array $a, array $b) - { - if (0 !== ($cmp = \strcmp($a['event'], $b['event']))) { - return $cmp; - } - if (\is_int($a['priority']) && !\is_int($b['priority'])) { - return 1; - } - if (!\is_int($a['priority']) && \is_int($b['priority'])) { - return -1; - } - if ($a['priority'] === $b['priority']) { - return 0; - } - if ($a['priority'] > $b['priority']) { - return -1; - } - return 1; - } -} diff --git a/dependencies/symfony/event-dispatcher/Debug/WrappedListener.php b/dependencies/symfony/event-dispatcher/Debug/WrappedListener.php deleted file mode 100644 index 6730906..0000000 --- a/dependencies/symfony/event-dispatcher/Debug/WrappedListener.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\Debug; - -use WP_Ultimo\Dependencies\Psr\EventDispatcher\StoppableEventInterface; -use WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\EventDispatcherInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Stopwatch\Stopwatch; -use WP_Ultimo\Dependencies\Symfony\Component\VarDumper\Caster\ClassStub; -/** - * @author Fabien Potencier - */ -final class WrappedListener -{ - private $listener; - private $optimizedListener; - private $name; - private $called; - private $stoppedPropagation; - private $stopwatch; - private $dispatcher; - private $pretty; - private $stub; - private $priority; - private static $hasClassStub; - public function __construct($listener, ?string $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) - { - $this->listener = $listener; - $this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null); - $this->stopwatch = $stopwatch; - $this->dispatcher = $dispatcher; - $this->called = \false; - $this->stoppedPropagation = \false; - if (\is_array($listener)) { - $this->name = \is_object($listener[0]) ? \get_debug_type($listener[0]) : $listener[0]; - $this->pretty = $this->name . '::' . $listener[1]; - } elseif ($listener instanceof \Closure) { - $r = new \ReflectionFunction($listener); - if (\str_contains($r->name, '{closure}')) { - $this->pretty = $this->name = 'closure'; - } elseif ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) { - $this->name = $class->name; - $this->pretty = $this->name . '::' . $r->name; - } else { - $this->pretty = $this->name = $r->name; - } - } elseif (\is_string($listener)) { - $this->pretty = $this->name = $listener; - } else { - $this->name = \get_debug_type($listener); - $this->pretty = $this->name . '::__invoke'; - } - if (null !== $name) { - $this->name = $name; - } - if (null === self::$hasClassStub) { - self::$hasClassStub = \class_exists(ClassStub::class); - } - } - public function getWrappedListener() - { - return $this->listener; - } - public function wasCalled() : bool - { - return $this->called; - } - public function stoppedPropagation() : bool - { - return $this->stoppedPropagation; - } - public function getPretty() : string - { - return $this->pretty; - } - public function getInfo(string $eventName) : array - { - if (null === $this->stub) { - $this->stub = self::$hasClassStub ? new ClassStub($this->pretty . '()', $this->listener) : $this->pretty . '()'; - } - return ['event' => $eventName, 'priority' => null !== $this->priority ? $this->priority : (null !== $this->dispatcher ? $this->dispatcher->getListenerPriority($eventName, $this->listener) : null), 'pretty' => $this->pretty, 'stub' => $this->stub]; - } - public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher) : void - { - $dispatcher = $this->dispatcher ?: $dispatcher; - $this->called = \true; - $this->priority = $dispatcher->getListenerPriority($eventName, $this->listener); - $e = $this->stopwatch->start($this->name, 'event_listener'); - try { - ($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher); - } finally { - if ($e->isStarted()) { - $e->stop(); - } - } - if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { - $this->stoppedPropagation = \true; - } - } -} diff --git a/dependencies/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php b/dependencies/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php deleted file mode 100644 index d17ffe9..0000000 --- a/dependencies/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -/** - * This pass allows bundles to extend the list of event aliases. - * - * @author Alexander M. Turek - */ -class AddEventAliasesPass implements CompilerPassInterface -{ - private $eventAliases; - private $eventAliasesParameter; - public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases') - { - if (1 < \func_num_args()) { - trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - $this->eventAliases = $eventAliases; - $this->eventAliasesParameter = $eventAliasesParameter; - } - public function process(ContainerBuilder $container) : void - { - $eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : []; - $container->setParameter($this->eventAliasesParameter, \array_merge($eventAliases, $this->eventAliases)); - } -} diff --git a/dependencies/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/dependencies/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php deleted file mode 100644 index 706971c..0000000 --- a/dependencies/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php +++ /dev/null @@ -1,189 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -use WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\EventDispatcher; -use WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\EventSubscriberInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\EventDispatcher\Event; -/** - * Compiler pass to register tagged services for an event dispatcher. - */ -class RegisterListenersPass implements CompilerPassInterface -{ - protected $dispatcherService; - protected $listenerTag; - protected $subscriberTag; - protected $eventAliasesParameter; - private $hotPathEvents = []; - private $hotPathTagName = 'container.hot_path'; - private $noPreloadEvents = []; - private $noPreloadTagName = 'container.no_preload'; - public function __construct(string $dispatcherService = 'event_dispatcher', string $listenerTag = 'kernel.event_listener', string $subscriberTag = 'kernel.event_subscriber', string $eventAliasesParameter = 'event_dispatcher.event_aliases') - { - if (0 < \func_num_args()) { - trigger_deprecation('symfony/event-dispatcher', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); - } - $this->dispatcherService = $dispatcherService; - $this->listenerTag = $listenerTag; - $this->subscriberTag = $subscriberTag; - $this->eventAliasesParameter = $eventAliasesParameter; - } - /** - * @return $this - */ - public function setHotPathEvents(array $hotPathEvents) - { - $this->hotPathEvents = \array_flip($hotPathEvents); - if (1 < \func_num_args()) { - trigger_deprecation('symfony/event-dispatcher', '5.4', 'Configuring "$tagName" in "%s" is deprecated.', __METHOD__); - $this->hotPathTagName = \func_get_arg(1); - } - return $this; - } - /** - * @return $this - */ - public function setNoPreloadEvents(array $noPreloadEvents) : self - { - $this->noPreloadEvents = \array_flip($noPreloadEvents); - if (1 < \func_num_args()) { - trigger_deprecation('symfony/event-dispatcher', '5.4', 'Configuring "$tagName" in "%s" is deprecated.', __METHOD__); - $this->noPreloadTagName = \func_get_arg(1); - } - return $this; - } - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { - return; - } - $aliases = []; - if ($container->hasParameter($this->eventAliasesParameter)) { - $aliases = $container->getParameter($this->eventAliasesParameter); - } - $globalDispatcherDefinition = $container->findDefinition($this->dispatcherService); - foreach ($container->findTaggedServiceIds($this->listenerTag, \true) as $id => $events) { - $noPreload = 0; - foreach ($events as $event) { - $priority = $event['priority'] ?? 0; - if (!isset($event['event'])) { - if ($container->getDefinition($id)->hasTag($this->subscriberTag)) { - continue; - } - $event['method'] = $event['method'] ?? '__invoke'; - $event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']); - } - $event['event'] = $aliases[$event['event']] ?? $event['event']; - if (!isset($event['method'])) { - $event['method'] = 'on' . \preg_replace_callback(['/(?<=\\b|_)[a-z]/i', '/[^a-z0-9]/i'], function ($matches) { - return \strtoupper($matches[0]); - }, $event['event']); - $event['method'] = \preg_replace('/[^a-z0-9]/i', '', $event['method']); - if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, \false)) && !$r->hasMethod($event['method'])) { - if (!$r->hasMethod('__invoke')) { - throw new InvalidArgumentException(\sprintf('None of the "%s" or "__invoke" methods exist for the service "%s". Please define the "method" attribute on "%s" tags.', $event['method'], $id, $this->listenerTag)); - } - $event['method'] = '__invoke'; - } - } - $dispatcherDefinition = $globalDispatcherDefinition; - if (isset($event['dispatcher'])) { - $dispatcherDefinition = $container->findDefinition($event['dispatcher']); - } - $dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]); - if (isset($this->hotPathEvents[$event['event']])) { - $container->getDefinition($id)->addTag($this->hotPathTagName); - } elseif (isset($this->noPreloadEvents[$event['event']])) { - ++$noPreload; - } - } - if ($noPreload && \count($events) === $noPreload) { - $container->getDefinition($id)->addTag($this->noPreloadTagName); - } - } - $extractingDispatcher = new ExtractingEventDispatcher(); - foreach ($container->findTaggedServiceIds($this->subscriberTag, \true) as $id => $tags) { - $def = $container->getDefinition($id); - // We must assume that the class value has been correctly filled, even if the service is created by a factory - $class = $def->getClass(); - if (!($r = $container->getReflectionClass($class))) { - throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(EventSubscriberInterface::class)) { - throw new InvalidArgumentException(\sprintf('Service "%s" must implement interface "%s".', $id, EventSubscriberInterface::class)); - } - $class = $r->name; - $dispatcherDefinitions = []; - foreach ($tags as $attributes) { - if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) { - continue; - } - $dispatcherDefinitions[$attributes['dispatcher']] = $container->findDefinition($attributes['dispatcher']); - } - if (!$dispatcherDefinitions) { - $dispatcherDefinitions = [$globalDispatcherDefinition]; - } - $noPreload = 0; - ExtractingEventDispatcher::$aliases = $aliases; - ExtractingEventDispatcher::$subscriber = $class; - $extractingDispatcher->addSubscriber($extractingDispatcher); - foreach ($extractingDispatcher->listeners as $args) { - $args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]]; - foreach ($dispatcherDefinitions as $dispatcherDefinition) { - $dispatcherDefinition->addMethodCall('addListener', $args); - } - if (isset($this->hotPathEvents[$args[0]])) { - $container->getDefinition($id)->addTag($this->hotPathTagName); - } elseif (isset($this->noPreloadEvents[$args[0]])) { - ++$noPreload; - } - } - if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) { - $container->getDefinition($id)->addTag($this->noPreloadTagName); - } - $extractingDispatcher->listeners = []; - ExtractingEventDispatcher::$aliases = []; - } - } - private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method) : string - { - if (null === ($class = $container->getDefinition($id)->getClass()) || !($r = $container->getReflectionClass($class, \false)) || !$r->hasMethod($method) || 1 > ($m = $r->getMethod($method))->getNumberOfParameters() || !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType || $type->isBuiltin() || Event::class === ($name = $type->getName())) { - throw new InvalidArgumentException(\sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); - } - return $name; - } -} -/** - * @internal - */ -class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface -{ - public $listeners = []; - public static $aliases = []; - public static $subscriber; - public function addListener(string $eventName, $listener, int $priority = 0) - { - $this->listeners[] = [$eventName, $listener[1], $priority]; - } - public static function getSubscribedEvents() : array - { - $events = []; - foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) { - $events[self::$aliases[$eventName] ?? $eventName] = $params; - } - return $events; - } -} diff --git a/dependencies/symfony/event-dispatcher/EventDispatcher.php b/dependencies/symfony/event-dispatcher/EventDispatcher.php deleted file mode 100644 index a54e9cd..0000000 --- a/dependencies/symfony/event-dispatcher/EventDispatcher.php +++ /dev/null @@ -1,247 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher; - -use WP_Ultimo\Dependencies\Psr\EventDispatcher\StoppableEventInterface; -use WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher\Debug\WrappedListener; -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Fabien Potencier - * @author Jordi Boggiano - * @author Jordan Alliot - * @author Nicolas Grekas - */ -class EventDispatcher implements EventDispatcherInterface -{ - private $listeners = []; - private $sorted = []; - private $optimized; - public function __construct() - { - if (__CLASS__ === static::class) { - $this->optimized = []; - } - } - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null) : object - { - $eventName = $eventName ?? \get_class($event); - if (null !== $this->optimized) { - $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName)); - } else { - $listeners = $this->getListeners($eventName); - } - if ($listeners) { - $this->callListeners($listeners, $eventName, $event); - } - return $event; - } - /** - * {@inheritdoc} - */ - public function getListeners(string $eventName = null) - { - if (null !== $eventName) { - if (empty($this->listeners[$eventName])) { - return []; - } - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - return $this->sorted[$eventName]; - } - foreach ($this->listeners as $eventName => $eventListeners) { - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - } - return \array_filter($this->sorted); - } - /** - * {@inheritdoc} - */ - public function getListenerPriority(string $eventName, $listener) - { - if (empty($this->listeners[$eventName])) { - return null; - } - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - foreach ($this->listeners[$eventName] as $priority => &$listeners) { - foreach ($listeners as &$v) { - if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { - $v[0] = $v[0](); - $v[1] = $v[1] ?? '__invoke'; - } - if ($v === $listener || $listener instanceof \Closure && $v == $listener) { - return $priority; - } - } - } - return null; - } - /** - * {@inheritdoc} - */ - public function hasListeners(string $eventName = null) - { - if (null !== $eventName) { - return !empty($this->listeners[$eventName]); - } - foreach ($this->listeners as $eventListeners) { - if ($eventListeners) { - return \true; - } - } - return \false; - } - /** - * {@inheritdoc} - */ - public function addListener(string $eventName, $listener, int $priority = 0) - { - $this->listeners[$eventName][$priority][] = $listener; - unset($this->sorted[$eventName], $this->optimized[$eventName]); - } - /** - * {@inheritdoc} - */ - public function removeListener(string $eventName, $listener) - { - if (empty($this->listeners[$eventName])) { - return; - } - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - foreach ($this->listeners[$eventName] as $priority => &$listeners) { - foreach ($listeners as $k => &$v) { - if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) { - $v[0] = $v[0](); - $v[1] = $v[1] ?? '__invoke'; - } - if ($v === $listener || $listener instanceof \Closure && $v == $listener) { - unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); - } - } - if (!$listeners) { - unset($this->listeners[$eventName][$priority]); - } - } - } - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (\is_string($params)) { - $this->addListener($eventName, [$subscriber, $params]); - } elseif (\is_string($params[0])) { - $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0); - } else { - foreach ($params as $listener) { - $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0); - } - } - } - } - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (\is_array($params) && \is_array($params[0])) { - foreach ($params as $listener) { - $this->removeListener($eventName, [$subscriber, $listener[0]]); - } - } else { - $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); - } - } - } - /** - * Triggers the listeners of an event. - * - * This method can be overridden to add functionality that is executed - * for each listener. - * - * @param callable[] $listeners The event listeners - * @param string $eventName The name of the event to dispatch - * @param object $event The event object to pass to the event handlers/listeners - */ - protected function callListeners(iterable $listeners, string $eventName, object $event) - { - $stoppable = $event instanceof StoppableEventInterface; - foreach ($listeners as $listener) { - if ($stoppable && $event->isPropagationStopped()) { - break; - } - $listener($event, $eventName, $this); - } - } - /** - * Sorts the internal list of listeners for the given event by priority. - */ - private function sortListeners(string $eventName) - { - \krsort($this->listeners[$eventName]); - $this->sorted[$eventName] = []; - foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as $k => &$listener) { - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - $this->sorted[$eventName][] = $listener; - } - } - } - /** - * Optimizes the internal list of listeners for the given event by priority. - */ - private function optimizeListeners(string $eventName) : array - { - \krsort($this->listeners[$eventName]); - $this->optimized[$eventName] = []; - foreach ($this->listeners[$eventName] as &$listeners) { - foreach ($listeners as &$listener) { - $closure =& $this->optimized[$eventName][]; - if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) { - $closure = static function (...$args) use(&$listener, &$closure) { - if ($listener[0] instanceof \Closure) { - $listener[0] = $listener[0](); - $listener[1] = $listener[1] ?? '__invoke'; - } - ($closure = \Closure::fromCallable($listener))(...$args); - }; - } else { - $closure = $listener instanceof \Closure || $listener instanceof WrappedListener ? $listener : \Closure::fromCallable($listener); - } - } - } - return $this->optimized[$eventName]; - } -} diff --git a/dependencies/symfony/event-dispatcher/EventDispatcherInterface.php b/dependencies/symfony/event-dispatcher/EventDispatcherInterface.php deleted file mode 100644 index 31ab403..0000000 --- a/dependencies/symfony/event-dispatcher/EventDispatcherInterface.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher; - -use WP_Ultimo\Dependencies\Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface; -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Bernhard Schussek - */ -interface EventDispatcherInterface extends ContractsEventDispatcherInterface -{ - /** - * Adds an event listener that listens on the specified events. - * - * @param int $priority The higher this value, the earlier an event - * listener will be triggered in the chain (defaults to 0) - */ - public function addListener(string $eventName, callable $listener, int $priority = 0); - /** - * Adds an event subscriber. - * - * The subscriber is asked for all the events it is - * interested in and added as a listener for these events. - */ - public function addSubscriber(EventSubscriberInterface $subscriber); - /** - * Removes an event listener from the specified events. - */ - public function removeListener(string $eventName, callable $listener); - public function removeSubscriber(EventSubscriberInterface $subscriber); - /** - * Gets the listeners of a specific event or all listeners sorted by descending priority. - * - * @return array - */ - public function getListeners(string $eventName = null); - /** - * Gets the listener priority for a specific event. - * - * Returns null if the event or the listener does not exist. - * - * @return int|null - */ - public function getListenerPriority(string $eventName, callable $listener); - /** - * Checks whether an event has any registered listeners. - * - * @return bool - */ - public function hasListeners(string $eventName = null); -} diff --git a/dependencies/symfony/event-dispatcher/EventSubscriberInterface.php b/dependencies/symfony/event-dispatcher/EventSubscriberInterface.php deleted file mode 100644 index 619dadd..0000000 --- a/dependencies/symfony/event-dispatcher/EventSubscriberInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher; - -/** - * An EventSubscriber knows itself what events it is interested in. - * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes - * {@link getSubscribedEvents} and registers the subscriber as a listener for all - * returned events. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - */ -interface EventSubscriberInterface -{ - /** - * Returns an array of event names this subscriber wants to listen to. - * - * The array keys are event names and the value can be: - * - * * The method name to call (priority defaults to 0) - * * An array composed of the method name to call and the priority - * * An array of arrays composed of the method names to call and respective - * priorities, or 0 if unset - * - * For instance: - * - * * ['eventName' => 'methodName'] - * * ['eventName' => ['methodName', $priority]] - * * ['eventName' => [['methodName1', $priority], ['methodName2']]] - * - * The code must not depend on runtime state as it will only be called at compile time. - * All logic depending on runtime state must be put into the individual methods handling the events. - * - * @return array> - */ - public static function getSubscribedEvents(); -} diff --git a/dependencies/symfony/event-dispatcher/GenericEvent.php b/dependencies/symfony/event-dispatcher/GenericEvent.php deleted file mode 100644 index 32229e5..0000000 --- a/dependencies/symfony/event-dispatcher/GenericEvent.php +++ /dev/null @@ -1,165 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher; - -use WP_Ultimo\Dependencies\Symfony\Contracts\EventDispatcher\Event; -/** - * Event encapsulation class. - * - * Encapsulates events thus decoupling the observer from the subject they encapsulate. - * - * @author Drak - * - * @implements \ArrayAccess - * @implements \IteratorAggregate - */ -class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate -{ - protected $subject; - protected $arguments; - /** - * Encapsulate an event with $subject and $args. - * - * @param mixed $subject The subject of the event, usually an object or a callable - * @param array $arguments Arguments to store in the event - */ - public function __construct($subject = null, array $arguments = []) - { - $this->subject = $subject; - $this->arguments = $arguments; - } - /** - * Getter for subject property. - * - * @return mixed - */ - public function getSubject() - { - return $this->subject; - } - /** - * Get argument by key. - * - * @return mixed - * - * @throws \InvalidArgumentException if key is not found - */ - public function getArgument(string $key) - { - if ($this->hasArgument($key)) { - return $this->arguments[$key]; - } - throw new \InvalidArgumentException(\sprintf('Argument "%s" not found.', $key)); - } - /** - * Add argument to event. - * - * @param mixed $value Value - * - * @return $this - */ - public function setArgument(string $key, $value) - { - $this->arguments[$key] = $value; - return $this; - } - /** - * Getter for all arguments. - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - /** - * Set args property. - * - * @return $this - */ - public function setArguments(array $args = []) - { - $this->arguments = $args; - return $this; - } - /** - * Has argument. - * - * @return bool - */ - public function hasArgument(string $key) - { - return \array_key_exists($key, $this->arguments); - } - /** - * ArrayAccess for argument getter. - * - * @param string $key Array key - * - * @return mixed - * - * @throws \InvalidArgumentException if key does not exist in $this->args - */ - #[\ReturnTypeWillChange] - public function offsetGet($key) - { - return $this->getArgument($key); - } - /** - * ArrayAccess for argument setter. - * - * @param string $key Array key to set - * @param mixed $value Value - * - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetSet($key, $value) - { - $this->setArgument($key, $value); - } - /** - * ArrayAccess for unset argument. - * - * @param string $key Array key - * - * @return void - */ - #[\ReturnTypeWillChange] - public function offsetUnset($key) - { - if ($this->hasArgument($key)) { - unset($this->arguments[$key]); - } - } - /** - * ArrayAccess has argument. - * - * @param string $key Array key - * - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists($key) - { - return $this->hasArgument($key); - } - /** - * IteratorAggregate for iterating over the object like an array. - * - * @return \ArrayIterator - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->arguments); - } -} diff --git a/dependencies/symfony/event-dispatcher/ImmutableEventDispatcher.php b/dependencies/symfony/event-dispatcher/ImmutableEventDispatcher.php deleted file mode 100644 index b413ed5..0000000 --- a/dependencies/symfony/event-dispatcher/ImmutableEventDispatcher.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher; - -/** - * A read-only proxy for an event dispatcher. - * - * @author Bernhard Schussek - */ -class ImmutableEventDispatcher implements EventDispatcherInterface -{ - private $dispatcher; - public function __construct(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - /** - * {@inheritdoc} - */ - public function dispatch(object $event, string $eventName = null) : object - { - return $this->dispatcher->dispatch($event, $eventName); - } - /** - * {@inheritdoc} - */ - public function addListener(string $eventName, $listener, int $priority = 0) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - /** - * {@inheritdoc} - */ - public function removeListener(string $eventName, $listener) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - /** - * {@inheritdoc} - */ - public function getListeners(string $eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - /** - * {@inheritdoc} - */ - public function getListenerPriority(string $eventName, $listener) - { - return $this->dispatcher->getListenerPriority($eventName, $listener); - } - /** - * {@inheritdoc} - */ - public function hasListeners(string $eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } -} diff --git a/dependencies/symfony/event-dispatcher/LegacyEventDispatcherProxy.php b/dependencies/symfony/event-dispatcher/LegacyEventDispatcherProxy.php deleted file mode 100644 index 4fa9642..0000000 --- a/dependencies/symfony/event-dispatcher/LegacyEventDispatcherProxy.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\EventDispatcher; - -use WP_Ultimo\Dependencies\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; -trigger_deprecation('symfony/event-dispatcher', '5.1', '%s is deprecated, use the event dispatcher without the proxy.', LegacyEventDispatcherProxy::class); -/** - * A helper class to provide BC/FC with the legacy signature of EventDispatcherInterface::dispatch(). - * - * @author Nicolas Grekas - * - * @deprecated since Symfony 5.1 - */ -final class LegacyEventDispatcherProxy -{ - public static function decorate(?EventDispatcherInterface $dispatcher) : ?EventDispatcherInterface - { - return $dispatcher; - } -} diff --git a/dependencies/symfony/polyfill-mbstring/Mbstring.php b/dependencies/symfony/polyfill-mbstring/Mbstring.php deleted file mode 100644 index 3b0a3eb..0000000 --- a/dependencies/symfony/polyfill-mbstring/Mbstring.php +++ /dev/null @@ -1,753 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Polyfill\Mbstring; - -/** - * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. - * - * Implemented: - * - mb_chr - Returns a specific character from its Unicode code point - * - mb_convert_encoding - Convert character encoding - * - mb_convert_variables - Convert character code in variable(s) - * - mb_decode_mimeheader - Decode string in MIME header field - * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED - * - mb_decode_numericentity - Decode HTML numeric string reference to character - * - mb_encode_numericentity - Encode character to HTML numeric string reference - * - mb_convert_case - Perform case folding on a string - * - mb_detect_encoding - Detect character encoding - * - mb_get_info - Get internal settings of mbstring - * - mb_http_input - Detect HTTP input character encoding - * - mb_http_output - Set/Get HTTP output character encoding - * - mb_internal_encoding - Set/Get internal character encoding - * - mb_list_encodings - Returns an array of all supported encodings - * - mb_ord - Returns the Unicode code point of a character - * - mb_output_handler - Callback function converts character encoding in output buffer - * - mb_scrub - Replaces ill-formed byte sequences with substitute characters - * - mb_strlen - Get string length - * - mb_strpos - Find position of first occurrence of string in a string - * - mb_strrpos - Find position of last occurrence of a string in a string - * - mb_str_split - Convert a string to an array - * - mb_strtolower - Make a string lowercase - * - mb_strtoupper - Make a string uppercase - * - mb_substitute_character - Set/Get substitution character - * - mb_substr - Get part of string - * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive - * - mb_stristr - Finds first occurrence of a string within another, case insensitive - * - mb_strrchr - Finds the last occurrence of a character in a string within another - * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive - * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive - * - mb_strstr - Finds first occurrence of a string within another - * - mb_strwidth - Return width of string - * - mb_substr_count - Count the number of substring occurrences - * - * Not implemented: - * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) - * - mb_ereg_* - Regular expression with multibyte support - * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable - * - mb_preferred_mime_name - Get MIME charset string - * - mb_regex_encoding - Returns current encoding for multibyte regex as string - * - mb_regex_set_options - Set/Get the default options for mbregex functions - * - mb_send_mail - Send encoded mail - * - mb_split - Split multibyte string using regular expression - * - mb_strcut - Get part of string - * - mb_strimwidth - Get truncated string with specified width - * - * @author Nicolas Grekas - * - * @internal - */ -final class Mbstring -{ - public const MB_CASE_FOLD = \PHP_INT_MAX; - private const SIMPLE_CASE_FOLD = [['µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι']]; - private static $encodingList = ['ASCII', 'UTF-8']; - private static $language = 'neutral'; - private static $internalEncoding = 'UTF-8'; - public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) - { - if (\is_array($fromEncoding) || null !== $fromEncoding && \false !== \strpos($fromEncoding, ',')) { - $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); - } else { - $fromEncoding = self::getEncoding($fromEncoding); - } - $toEncoding = self::getEncoding($toEncoding); - if ('BASE64' === $fromEncoding) { - $s = \base64_decode($s); - $fromEncoding = $toEncoding; - } - if ('BASE64' === $toEncoding) { - return \base64_encode($s); - } - if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { - if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { - $fromEncoding = 'Windows-1252'; - } - if ('UTF-8' !== $fromEncoding) { - $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); - } - return \preg_replace_callback('/[\\x80-\\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); - } - if ('HTML-ENTITIES' === $fromEncoding) { - $s = \html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); - $fromEncoding = 'UTF-8'; - } - return \iconv($fromEncoding, $toEncoding . '//IGNORE', $s); - } - public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) - { - $ok = \true; - \array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) { - if (\false === ($v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding))) { - $ok = \false; - } - }); - return $ok ? $fromEncoding : \false; - } - public static function mb_decode_mimeheader($s) - { - return \iconv_mime_decode($s, 2, self::$internalEncoding); - } - public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) - { - \trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); - } - public static function mb_decode_numericentity($s, $convmap, $encoding = null) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { - \trigger_error('mb_decode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); - return null; - } - if (!\is_array($convmap) || 80000 > \PHP_VERSION_ID && !$convmap) { - return \false; - } - if (null !== $encoding && !\is_scalar($encoding)) { - \trigger_error('mb_decode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); - return ''; - // Instead of null (cf. mb_encode_numericentity). - } - $s = (string) $s; - if ('' === $s) { - return ''; - } - $encoding = self::getEncoding($encoding); - if ('UTF-8' === $encoding) { - $encoding = null; - if (!\preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - $cnt = \floor(\count($convmap) / 4) * 4; - for ($i = 0; $i < $cnt; $i += 4) { - // collector_decode_htmlnumericentity ignores $convmap[$i + 3] - $convmap[$i] += $convmap[$i + 2]; - $convmap[$i + 1] += $convmap[$i + 2]; - } - $s = \preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use($cnt, $convmap) { - $c = isset($m[2]) ? (int) \hexdec($m[2]) : $m[1]; - for ($i = 0; $i < $cnt; $i += 4) { - if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { - return self::mb_chr($c - $convmap[$i + 2]); - } - } - return $m[0]; - }, $s); - if (null === $encoding) { - return $s; - } - return \iconv('UTF-8', $encoding . '//IGNORE', $s); - } - public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = \false) - { - if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { - \trigger_error('mb_encode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); - return null; - } - if (!\is_array($convmap) || 80000 > \PHP_VERSION_ID && !$convmap) { - return \false; - } - if (null !== $encoding && !\is_scalar($encoding)) { - \trigger_error('mb_encode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); - return null; - // Instead of '' (cf. mb_decode_numericentity). - } - if (null !== $is_hex && !\is_scalar($is_hex)) { - \trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, ' . \gettype($s) . ' given', \E_USER_WARNING); - return null; - } - $s = (string) $s; - if ('' === $s) { - return ''; - } - $encoding = self::getEncoding($encoding); - if ('UTF-8' === $encoding) { - $encoding = null; - if (!\preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; - $cnt = \floor(\count($convmap) / 4) * 4; - $i = 0; - $len = \strlen($s); - $result = ''; - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; - $uchr = \substr($s, $i, $ulen); - $i += $ulen; - $c = self::mb_ord($uchr); - for ($j = 0; $j < $cnt; $j += 4) { - if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { - $cOffset = $c + $convmap[$j + 2] & $convmap[$j + 3]; - $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#' . $cOffset . ';'; - continue 2; - } - } - $result .= $uchr; - } - if (null === $encoding) { - return $result; - } - return \iconv('UTF-8', $encoding . '//IGNORE', $result); - } - public static function mb_convert_case($s, $mode, $encoding = null) - { - $s = (string) $s; - if ('' === $s) { - return ''; - } - $encoding = self::getEncoding($encoding); - if ('UTF-8' === $encoding) { - $encoding = null; - if (!\preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); - } - } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - if (\MB_CASE_TITLE == $mode) { - static $titleRegexp = null; - if (null === $titleRegexp) { - $titleRegexp = self::getData('titleCaseRegexp'); - } - $s = \preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); - } else { - if (\MB_CASE_UPPER == $mode) { - static $upper = null; - if (null === $upper) { - $upper = self::getData('upperCase'); - } - $map = $upper; - } else { - if (self::MB_CASE_FOLD === $mode) { - static $caseFolding = null; - if (null === $caseFolding) { - $caseFolding = self::getData('caseFolding'); - } - $s = \strtr($s, $caseFolding); - } - static $lower = null; - if (null === $lower) { - $lower = self::getData('lowerCase'); - } - $map = $lower; - } - static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; - $i = 0; - $len = \strlen($s); - while ($i < $len) { - $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; - $uchr = \substr($s, $i, $ulen); - $i += $ulen; - if (isset($map[$uchr])) { - $uchr = $map[$uchr]; - $nlen = \strlen($uchr); - if ($nlen == $ulen) { - $nlen = $i; - do { - $s[--$nlen] = $uchr[--$ulen]; - } while ($ulen); - } else { - $s = \substr_replace($s, $uchr, $i - $ulen, $ulen); - $len += $nlen - $ulen; - $i += $nlen - $ulen; - } - } - } - } - if (null === $encoding) { - return $s; - } - return \iconv('UTF-8', $encoding . '//IGNORE', $s); - } - public static function mb_internal_encoding($encoding = null) - { - if (null === $encoding) { - return self::$internalEncoding; - } - $normalizedEncoding = self::getEncoding($encoding); - if ('UTF-8' === $normalizedEncoding || \false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { - self::$internalEncoding = $normalizedEncoding; - return \true; - } - if (80000 > \PHP_VERSION_ID) { - return \false; - } - throw new \ValueError(\sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - public static function mb_language($lang = null) - { - if (null === $lang) { - return self::$language; - } - switch ($normalizedLang = \strtolower($lang)) { - case 'uni': - case 'neutral': - self::$language = $normalizedLang; - return \true; - } - if (80000 > \PHP_VERSION_ID) { - return \false; - } - throw new \ValueError(\sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); - } - public static function mb_list_encodings() - { - return ['UTF-8']; - } - public static function mb_encoding_aliases($encoding) - { - switch (\strtoupper($encoding)) { - case 'UTF8': - case 'UTF-8': - return ['utf8']; - } - return \false; - } - public static function mb_check_encoding($var = null, $encoding = null) - { - if (\PHP_VERSION_ID < 70200 && \is_array($var)) { - \trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING); - return null; - } - if (null === $encoding) { - if (null === $var) { - return \false; - } - $encoding = self::$internalEncoding; - } - if (!\is_array($var)) { - return self::mb_detect_encoding($var, [$encoding]) || \false !== @\iconv($encoding, $encoding, $var); - } - foreach ($var as $key => $value) { - if (!self::mb_check_encoding($key, $encoding)) { - return \false; - } - if (!self::mb_check_encoding($value, $encoding)) { - return \false; - } - } - return \true; - } - public static function mb_detect_encoding($str, $encodingList = null, $strict = \false) - { - if (null === $encodingList) { - $encodingList = self::$encodingList; - } else { - if (!\is_array($encodingList)) { - $encodingList = \array_map('trim', \explode(',', $encodingList)); - } - $encodingList = \array_map('strtoupper', $encodingList); - } - foreach ($encodingList as $enc) { - switch ($enc) { - case 'ASCII': - if (!\preg_match('/[\\x80-\\xFF]/', $str)) { - return $enc; - } - break; - case 'UTF8': - case 'UTF-8': - if (\preg_match('//u', $str)) { - return 'UTF-8'; - } - break; - default: - if (0 === \strncmp($enc, 'ISO-8859-', 9)) { - return $enc; - } - } - } - return \false; - } - public static function mb_detect_order($encodingList = null) - { - if (null === $encodingList) { - return self::$encodingList; - } - if (!\is_array($encodingList)) { - $encodingList = \array_map('trim', \explode(',', $encodingList)); - } - $encodingList = \array_map('strtoupper', $encodingList); - foreach ($encodingList as $enc) { - switch ($enc) { - default: - if (\strncmp($enc, 'ISO-8859-', 9)) { - return \false; - } - // no break - case 'ASCII': - case 'UTF8': - case 'UTF-8': - } - } - self::$encodingList = $encodingList; - return \true; - } - public static function mb_strlen($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strlen($s); - } - return @\iconv_strlen($s, $encoding); - } - public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strpos($haystack, $needle, $offset); - } - $needle = (string) $needle; - if ('' === $needle) { - if (80000 > \PHP_VERSION_ID) { - \trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING); - return \false; - } - return 0; - } - return \iconv_strpos($haystack, $needle, $offset, $encoding); - } - public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return \strrpos($haystack, $needle, $offset); - } - if ($offset != (int) $offset) { - $offset = 0; - } elseif ($offset = (int) $offset) { - if ($offset < 0) { - if (0 > ($offset += self::mb_strlen($needle))) { - $haystack = self::mb_substr($haystack, 0, $offset, $encoding); - } - $offset = 0; - } else { - $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); - } - } - $pos = '' !== $needle || 80000 > \PHP_VERSION_ID ? \iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); - return \false !== $pos ? $offset + $pos : \false; - } - public static function mb_str_split($string, $split_length = 1, $encoding = null) - { - if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { - \trigger_error('mb_str_split() expects parameter 1 to be string, ' . \gettype($string) . ' given', \E_USER_WARNING); - return null; - } - if (1 > ($split_length = (int) $split_length)) { - if (80000 > \PHP_VERSION_ID) { - \trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); - return \false; - } - throw new \ValueError('Argument #2 ($length) must be greater than 0'); - } - if (null === $encoding) { - $encoding = \mb_internal_encoding(); - } - if ('UTF-8' === ($encoding = self::getEncoding($encoding))) { - $rx = '/('; - while (65535 < $split_length) { - $rx .= '.{65535}'; - $split_length -= 65535; - } - $rx .= '.{' . $split_length . '})/us'; - return \preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); - } - $result = []; - $length = \mb_strlen($string, $encoding); - for ($i = 0; $i < $length; $i += $split_length) { - $result[] = \mb_substr($string, $i, $split_length, $encoding); - } - return $result; - } - public static function mb_strtolower($s, $encoding = null) - { - return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); - } - public static function mb_strtoupper($s, $encoding = null) - { - return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); - } - public static function mb_substitute_character($c = null) - { - if (null === $c) { - return 'none'; - } - if (0 === \strcasecmp($c, 'none')) { - return \true; - } - if (80000 > \PHP_VERSION_ID) { - return \false; - } - if (\is_int($c) || 'long' === $c || 'entity' === $c) { - return \false; - } - throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); - } - public static function mb_substr($s, $start, $length = null, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - return (string) \substr($s, $start, null === $length ? 2147483647 : $length); - } - if ($start < 0) { - $start = \iconv_strlen($s, $encoding) + $start; - if ($start < 0) { - $start = 0; - } - } - if (null === $length) { - $length = 2147483647; - } elseif ($length < 0) { - $length = \iconv_strlen($s, $encoding) + $length - $start; - if ($length < 0) { - return ''; - } - } - return (string) \iconv_substr($s, $start, $length, $encoding); - } - public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) - { - [$haystack, $needle] = \str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding)]); - return self::mb_strpos($haystack, $needle, $offset, $encoding); - } - public static function mb_stristr($haystack, $needle, $part = \false, $encoding = null) - { - $pos = self::mb_stripos($haystack, $needle, 0, $encoding); - return self::getSubpart($pos, $part, $haystack, $encoding); - } - public static function mb_strrchr($haystack, $needle, $part = \false, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('CP850' === $encoding || 'ASCII' === $encoding) { - $pos = \strrpos($haystack, $needle); - } else { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = \iconv_strrpos($haystack, $needle, $encoding); - } - return self::getSubpart($pos, $part, $haystack, $encoding); - } - public static function mb_strrichr($haystack, $needle, $part = \false, $encoding = null) - { - $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = self::mb_strripos($haystack, $needle, $encoding); - return self::getSubpart($pos, $part, $haystack, $encoding); - } - public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) - { - $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); - $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); - $haystack = \str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); - $needle = \str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); - return self::mb_strrpos($haystack, $needle, $offset, $encoding); - } - public static function mb_strstr($haystack, $needle, $part = \false, $encoding = null) - { - $pos = \strpos($haystack, $needle); - if (\false === $pos) { - return \false; - } - if ($part) { - return \substr($haystack, 0, $pos); - } - return \substr($haystack, $pos); - } - public static function mb_get_info($type = 'all') - { - $info = ['internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off']; - if ('all' === $type) { - return $info; - } - if (isset($info[$type])) { - return $info[$type]; - } - return \false; - } - public static function mb_http_input($type = '') - { - return \false; - } - public static function mb_http_output($encoding = null) - { - return null !== $encoding ? 'pass' === $encoding : 'pass'; - } - public static function mb_strwidth($s, $encoding = null) - { - $encoding = self::getEncoding($encoding); - if ('UTF-8' !== $encoding) { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); - } - $s = \preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide); - return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); - } - public static function mb_substr_count($haystack, $needle, $encoding = null) - { - return \substr_count($haystack, $needle); - } - public static function mb_output_handler($contents, $status) - { - return $contents; - } - public static function mb_chr($code, $encoding = null) - { - if (0x80 > ($code %= 0x200000)) { - $s = \chr($code); - } elseif (0x800 > $code) { - $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); - } elseif (0x10000 > $code) { - $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); - } else { - $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); - } - if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { - $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); - } - return $s; - } - public static function mb_ord($s, $encoding = null) - { - if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { - $s = \mb_convert_encoding($s, 'UTF-8', $encoding); - } - if (1 === \strlen($s)) { - return \ord($s); - } - $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; - if (0xf0 <= $code) { - return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; - } - if (0xe0 <= $code) { - return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; - } - if (0xc0 <= $code) { - return ($code - 0xc0 << 6) + $s[2] - 0x80; - } - return $code; - } - public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null) : string - { - if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], \true)) { - throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); - } - if (null === $encoding) { - $encoding = self::mb_internal_encoding(); - } - try { - $validEncoding = @self::mb_check_encoding('', $encoding); - } catch (\ValueError $e) { - throw new \ValueError(\sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - // BC for PHP 7.3 and lower - if (!$validEncoding) { - throw new \ValueError(\sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); - } - if (self::mb_strlen($pad_string, $encoding) <= 0) { - throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); - } - $paddingRequired = $length - self::mb_strlen($string, $encoding); - if ($paddingRequired < 1) { - return $string; - } - switch ($pad_type) { - case \STR_PAD_LEFT: - return self::mb_substr(\str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding) . $string; - case \STR_PAD_RIGHT: - return $string . self::mb_substr(\str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); - default: - $leftPaddingLength = \floor($paddingRequired / 2); - $rightPaddingLength = $paddingRequired - $leftPaddingLength; - return self::mb_substr(\str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding) . $string . self::mb_substr(\str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); - } - } - private static function getSubpart($pos, $part, $haystack, $encoding) - { - if (\false === $pos) { - return \false; - } - if ($part) { - return self::mb_substr($haystack, 0, $pos, $encoding); - } - return self::mb_substr($haystack, $pos, null, $encoding); - } - private static function html_encoding_callback(array $m) - { - $i = 1; - $entities = ''; - $m = \unpack('C*', \htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); - while (isset($m[$i])) { - if (0x80 > $m[$i]) { - $entities .= \chr($m[$i++]); - continue; - } - if (0xf0 <= $m[$i]) { - $c = ($m[$i++] - 0xf0 << 18) + ($m[$i++] - 0x80 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; - } elseif (0xe0 <= $m[$i]) { - $c = ($m[$i++] - 0xe0 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; - } else { - $c = ($m[$i++] - 0xc0 << 6) + $m[$i++] - 0x80; - } - $entities .= '&#' . $c . ';'; - } - return $entities; - } - private static function title_case(array $s) - { - return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8') . self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); - } - private static function getData($file) - { - if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { - return require $file; - } - return \false; - } - private static function getEncoding($encoding) - { - if (null === $encoding) { - return self::$internalEncoding; - } - if ('UTF-8' === $encoding) { - return 'UTF-8'; - } - $encoding = \strtoupper($encoding); - if ('8BIT' === $encoding || 'BINARY' === $encoding) { - return 'CP850'; - } - if ('UTF8' === $encoding) { - return 'UTF-8'; - } - return $encoding; - } -} diff --git a/dependencies/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/dependencies/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php deleted file mode 100644 index e1c25c5..0000000 --- a/dependencies/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +++ /dev/null @@ -1,5 +0,0 @@ - 'i̇', 'µ' => 'μ', 'ſ' => 's', 'ͅ' => 'ι', 'ς' => 'σ', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϵ' => 'ε', 'ẛ' => 'ṡ', 'ι' => 'ι', 'ß' => 'ss', 'ʼn' => 'ʼn', 'ǰ' => 'ǰ', 'ΐ' => 'ΐ', 'ΰ' => 'ΰ', 'և' => 'եւ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẚ' => 'aʾ', 'ẞ' => 'ss', 'ὐ' => 'ὐ', 'ὒ' => 'ὒ', 'ὔ' => 'ὔ', 'ὖ' => 'ὖ', 'ᾀ' => 'ἀι', 'ᾁ' => 'ἁι', 'ᾂ' => 'ἂι', 'ᾃ' => 'ἃι', 'ᾄ' => 'ἄι', 'ᾅ' => 'ἅι', 'ᾆ' => 'ἆι', 'ᾇ' => 'ἇι', 'ᾈ' => 'ἀι', 'ᾉ' => 'ἁι', 'ᾊ' => 'ἂι', 'ᾋ' => 'ἃι', 'ᾌ' => 'ἄι', 'ᾍ' => 'ἅι', 'ᾎ' => 'ἆι', 'ᾏ' => 'ἇι', 'ᾐ' => 'ἠι', 'ᾑ' => 'ἡι', 'ᾒ' => 'ἢι', 'ᾓ' => 'ἣι', 'ᾔ' => 'ἤι', 'ᾕ' => 'ἥι', 'ᾖ' => 'ἦι', 'ᾗ' => 'ἧι', 'ᾘ' => 'ἠι', 'ᾙ' => 'ἡι', 'ᾚ' => 'ἢι', 'ᾛ' => 'ἣι', 'ᾜ' => 'ἤι', 'ᾝ' => 'ἥι', 'ᾞ' => 'ἦι', 'ᾟ' => 'ἧι', 'ᾠ' => 'ὠι', 'ᾡ' => 'ὡι', 'ᾢ' => 'ὢι', 'ᾣ' => 'ὣι', 'ᾤ' => 'ὤι', 'ᾥ' => 'ὥι', 'ᾦ' => 'ὦι', 'ᾧ' => 'ὧι', 'ᾨ' => 'ὠι', 'ᾩ' => 'ὡι', 'ᾪ' => 'ὢι', 'ᾫ' => 'ὣι', 'ᾬ' => 'ὤι', 'ᾭ' => 'ὥι', 'ᾮ' => 'ὦι', 'ᾯ' => 'ὧι', 'ᾲ' => 'ὰι', 'ᾳ' => 'αι', 'ᾴ' => 'άι', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾶι', 'ᾼ' => 'αι', 'ῂ' => 'ὴι', 'ῃ' => 'ηι', 'ῄ' => 'ήι', 'ῆ' => 'ῆ', 'ῇ' => 'ῆι', 'ῌ' => 'ηι', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'ῲ' => 'ὼι', 'ῳ' => 'ωι', 'ῴ' => 'ώι', 'ῶ' => 'ῶ', 'ῷ' => 'ῶι', 'ῼ' => 'ωι', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ']; diff --git a/dependencies/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/dependencies/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php deleted file mode 100644 index 42e1402..0000000 --- a/dependencies/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +++ /dev/null @@ -1,5 +0,0 @@ - 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃'); diff --git a/dependencies/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/dependencies/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php deleted file mode 100644 index f34bc0f..0000000 --- a/dependencies/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +++ /dev/null @@ -1,6 +0,0 @@ - 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι'); diff --git a/dependencies/symfony/polyfill-mbstring/bootstrap.php b/dependencies/symfony/polyfill-mbstring/bootstrap.php deleted file mode 100644 index ecf1a03..0000000 --- a/dependencies/symfony/polyfill-mbstring/bootstrap.php +++ /dev/null @@ -1,151 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Mbstring as p; - -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__.'/bootstrap80.php'; -} - -if (!function_exists('mb_convert_encoding')) { - function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } -} -if (!function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } -} -if (!function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } -} -if (!function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } -} -if (!function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } -} -if (!function_exists('mb_convert_case')) { - function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } -} -if (!function_exists('mb_internal_encoding')) { - function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } -} -if (!function_exists('mb_language')) { - function mb_language($language = null) { return p\Mbstring::mb_language($language); } -} -if (!function_exists('mb_list_encodings')) { - function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } -} -if (!function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } -} -if (!function_exists('mb_check_encoding')) { - function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } -} -if (!function_exists('mb_detect_encoding')) { - function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } -} -if (!function_exists('mb_detect_order')) { - function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } -} -if (!function_exists('mb_parse_str')) { - function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } -} -if (!function_exists('mb_strlen')) { - function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } -} -if (!function_exists('mb_strpos')) { - function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strtolower')) { - function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } -} -if (!function_exists('mb_strtoupper')) { - function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } -} -if (!function_exists('mb_substitute_character')) { - function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } -} -if (!function_exists('mb_substr')) { - function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } -} -if (!function_exists('mb_stripos')) { - function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_stristr')) { - function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrchr')) { - function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strrichr')) { - function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_strripos')) { - function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strrpos')) { - function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } -} -if (!function_exists('mb_strstr')) { - function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } -} -if (!function_exists('mb_get_info')) { - function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } -} -if (!function_exists('mb_http_output')) { - function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } -} -if (!function_exists('mb_strwidth')) { - function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } -} -if (!function_exists('mb_substr_count')) { - function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } -} -if (!function_exists('mb_output_handler')) { - function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } -} -if (!function_exists('mb_http_input')) { - function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } -} - -if (!function_exists('mb_convert_variables')) { - function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } -} - -if (!function_exists('mb_ord')) { - function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } -} -if (!function_exists('mb_chr')) { - function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } -} -if (!function_exists('mb_scrub')) { - function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } -} -if (!function_exists('mb_str_split')) { - function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } -} - -if (!function_exists('mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } -} - -if (extension_loaded('mbstring')) { - return; -} - -if (!defined('MB_CASE_UPPER')) { - define('MB_CASE_UPPER', 0); -} -if (!defined('MB_CASE_LOWER')) { - define('MB_CASE_LOWER', 1); -} -if (!defined('MB_CASE_TITLE')) { - define('MB_CASE_TITLE', 2); -} diff --git a/dependencies/symfony/polyfill-mbstring/bootstrap80.php b/dependencies/symfony/polyfill-mbstring/bootstrap80.php deleted file mode 100644 index 2415df3..0000000 --- a/dependencies/symfony/polyfill-mbstring/bootstrap80.php +++ /dev/null @@ -1,261 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -use Symfony\Polyfill\Mbstring as p; -if (!\function_exists('mb_convert_encoding')) { - function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null) : array|string|false - { - return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); - } -} -if (!\function_exists('mb_decode_mimeheader')) { - function mb_decode_mimeheader(?string $string) : string - { - return p\Mbstring::mb_decode_mimeheader((string) $string); - } -} -if (!\function_exists('mb_encode_mimeheader')) { - function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0) : string - { - return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); - } -} -if (!\function_exists('mb_decode_numericentity')) { - function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null) : string - { - return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); - } -} -if (!\function_exists('mb_encode_numericentity')) { - function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = \false) : string - { - return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); - } -} -if (!\function_exists('mb_convert_case')) { - function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null) : string - { - return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); - } -} -if (!\function_exists('mb_internal_encoding')) { - function mb_internal_encoding(?string $encoding = null) : string|bool - { - return p\Mbstring::mb_internal_encoding($encoding); - } -} -if (!\function_exists('mb_language')) { - function mb_language(?string $language = null) : string|bool - { - return p\Mbstring::mb_language($language); - } -} -if (!\function_exists('mb_list_encodings')) { - function mb_list_encodings() : array - { - return p\Mbstring::mb_list_encodings(); - } -} -if (!\function_exists('mb_encoding_aliases')) { - function mb_encoding_aliases(?string $encoding) : array - { - return p\Mbstring::mb_encoding_aliases((string) $encoding); - } -} -if (!\function_exists('mb_check_encoding')) { - function mb_check_encoding(array|string|null $value = null, ?string $encoding = null) : bool - { - return p\Mbstring::mb_check_encoding($value, $encoding); - } -} -if (!\function_exists('mb_detect_encoding')) { - function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = \false) : string|false - { - return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); - } -} -if (!\function_exists('mb_detect_order')) { - function mb_detect_order(array|string|null $encoding = null) : array|bool - { - return p\Mbstring::mb_detect_order($encoding); - } -} -if (!\function_exists('mb_parse_str')) { - function mb_parse_str(?string $string, &$result = []) : bool - { - \parse_str((string) $string, $result); - return (bool) $result; - } -} -if (!\function_exists('mb_strlen')) { - function mb_strlen(?string $string, ?string $encoding = null) : int - { - return p\Mbstring::mb_strlen((string) $string, $encoding); - } -} -if (!\function_exists('mb_strpos')) { - function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false - { - return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); - } -} -if (!\function_exists('mb_strtolower')) { - function mb_strtolower(?string $string, ?string $encoding = null) : string - { - return p\Mbstring::mb_strtolower((string) $string, $encoding); - } -} -if (!\function_exists('mb_strtoupper')) { - function mb_strtoupper(?string $string, ?string $encoding = null) : string - { - return p\Mbstring::mb_strtoupper((string) $string, $encoding); - } -} -if (!\function_exists('mb_substitute_character')) { - function mb_substitute_character(string|int|null $substitute_character = null) : string|int|bool - { - return p\Mbstring::mb_substitute_character($substitute_character); - } -} -if (!\function_exists('mb_substr')) { - function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null) : string - { - return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); - } -} -if (!\function_exists('mb_stripos')) { - function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false - { - return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); - } -} -if (!\function_exists('mb_stristr')) { - function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false - { - return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); - } -} -if (!\function_exists('mb_strrchr')) { - function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false - { - return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); - } -} -if (!\function_exists('mb_strrichr')) { - function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false - { - return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); - } -} -if (!\function_exists('mb_strripos')) { - function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false - { - return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); - } -} -if (!\function_exists('mb_strrpos')) { - function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false - { - return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); - } -} -if (!\function_exists('mb_strstr')) { - function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false - { - return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); - } -} -if (!\function_exists('mb_get_info')) { - function mb_get_info(?string $type = 'all') : array|string|int|false - { - return p\Mbstring::mb_get_info((string) $type); - } -} -if (!\function_exists('mb_http_output')) { - function mb_http_output(?string $encoding = null) : string|bool - { - return p\Mbstring::mb_http_output($encoding); - } -} -if (!\function_exists('mb_strwidth')) { - function mb_strwidth(?string $string, ?string $encoding = null) : int - { - return p\Mbstring::mb_strwidth((string) $string, $encoding); - } -} -if (!\function_exists('mb_substr_count')) { - function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null) : int - { - return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); - } -} -if (!\function_exists('mb_output_handler')) { - function mb_output_handler(?string $string, ?int $status) : string - { - return p\Mbstring::mb_output_handler((string) $string, (int) $status); - } -} -if (!\function_exists('mb_http_input')) { - function mb_http_input(?string $type = null) : array|string|false - { - return p\Mbstring::mb_http_input($type); - } -} -if (!\function_exists('mb_convert_variables')) { - function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars) : string|false - { - return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); - } -} -if (!\function_exists('mb_ord')) { - function mb_ord(?string $string, ?string $encoding = null) : int|false - { - return p\Mbstring::mb_ord((string) $string, $encoding); - } -} -if (!\function_exists('mb_chr')) { - function mb_chr(?int $codepoint, ?string $encoding = null) : string|false - { - return p\Mbstring::mb_chr((int) $codepoint, $encoding); - } -} -if (!\function_exists('mb_scrub')) { - function mb_scrub(?string $string, ?string $encoding = null) : string - { - $encoding ??= \mb_internal_encoding(); - return \mb_convert_encoding((string) $string, $encoding, $encoding); - } -} -if (!\function_exists('mb_str_split')) { - function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null) : array - { - return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); - } -} -if (!\function_exists('WP_Ultimo\\Dependencies\\mb_str_pad')) { - function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null) : string - { - return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); - } -} -if (\extension_loaded('mbstring')) { - return; -} -if (!\defined('MB_CASE_UPPER')) { - \define('MB_CASE_UPPER', 0); -} -if (!\defined('MB_CASE_LOWER')) { - \define('MB_CASE_LOWER', 1); -} -if (!\defined('MB_CASE_TITLE')) { - \define('MB_CASE_TITLE', 2); -} diff --git a/dependencies/symfony/polyfill-php73/Php73.php b/dependencies/symfony/polyfill-php73/Php73.php deleted file mode 100644 index 58faf71..0000000 --- a/dependencies/symfony/polyfill-php73/Php73.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Polyfill\Php73; - -/** - * @author Gabriel Caruso - * @author Ion Bazan - * - * @internal - */ -final class Php73 -{ - public static $startAt = 1533462603; - /** - * @param bool $asNum - * - * @return array|float|int - */ - public static function hrtime($asNum = \false) - { - $ns = \microtime(\false); - $s = \substr($ns, 11) - self::$startAt; - $ns = 1000000000.0 * (float) $ns; - if ($asNum) { - $ns += $s * 1000000000.0; - return \PHP_INT_SIZE === 4 ? $ns : (int) $ns; - } - return [$s, (int) $ns]; - } -} diff --git a/dependencies/symfony/polyfill-php73/Resources/stubs/JsonException.php b/dependencies/symfony/polyfill-php73/Resources/stubs/JsonException.php deleted file mode 100644 index 090f101..0000000 --- a/dependencies/symfony/polyfill-php73/Resources/stubs/JsonException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID < 70300) { - class JsonException extends \Exception - { - } -} diff --git a/dependencies/symfony/polyfill-php73/bootstrap.php b/dependencies/symfony/polyfill-php73/bootstrap.php deleted file mode 100644 index 4bd9acf..0000000 --- a/dependencies/symfony/polyfill-php73/bootstrap.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -use Symfony\Polyfill\Php73 as p; -if (\PHP_VERSION_ID >= 70300) { - return; -} -if (!\function_exists('is_countable')) { - function is_countable($value) - { - return \is_array($value) || $value instanceof \Countable || $value instanceof \ResourceBundle || $value instanceof \SimpleXmlElement; - } -} -if (!\function_exists('hrtime')) { - require_once __DIR__ . '/Php73.php'; - p\Php73::$startAt = (int) \microtime(\true); - function hrtime($as_number = \false) - { - return p\Php73::hrtime($as_number); - } -} -if (!\function_exists('array_key_first')) { - function array_key_first(array $array) - { - foreach ($array as $key => $value) { - return $key; - } - } -} -if (!\function_exists('array_key_last')) { - function array_key_last(array $array) - { - return \key(\array_slice($array, -1, 1, \true)); - } -} diff --git a/dependencies/symfony/polyfill-php80/Php80.php b/dependencies/symfony/polyfill-php80/Php80.php deleted file mode 100644 index 1471f0b..0000000 --- a/dependencies/symfony/polyfill-php80/Php80.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Polyfill\Php80; - -/** - * @author Ion Bazan - * @author Nico Oelgart - * @author Nicolas Grekas - * - * @internal - */ -final class Php80 -{ - public static function fdiv(float $dividend, float $divisor) : float - { - return @($dividend / $divisor); - } - public static function get_debug_type($value) : string - { - switch (\true) { - case null === $value: - return 'null'; - case \is_bool($value): - return 'bool'; - case \is_string($value): - return 'string'; - case \is_array($value): - return 'array'; - case \is_int($value): - return 'int'; - case \is_float($value): - return 'float'; - case \is_object($value): - break; - case $value instanceof \__PHP_Incomplete_Class: - return '__PHP_Incomplete_Class'; - default: - if (null === ($type = @\get_resource_type($value))) { - return 'unknown'; - } - if ('Unknown' === $type) { - $type = 'closed'; - } - return "resource ({$type})"; - } - $class = \get_class($value); - if (\false === \strpos($class, '@')) { - return $class; - } - return ((\get_parent_class($class) ?: \key(\class_implements($class))) ?: 'class') . '@anonymous'; - } - public static function get_resource_id($res) : int - { - if (!\is_resource($res) && null === @\get_resource_type($res)) { - throw new \TypeError(\sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', \get_debug_type($res))); - } - return (int) $res; - } - public static function preg_last_error_msg() : string - { - switch (\preg_last_error()) { - case \PREG_INTERNAL_ERROR: - return 'Internal error'; - case \PREG_BAD_UTF8_ERROR: - return 'Malformed UTF-8 characters, possibly incorrectly encoded'; - case \PREG_BAD_UTF8_OFFSET_ERROR: - return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; - case \PREG_BACKTRACK_LIMIT_ERROR: - return 'Backtrack limit exhausted'; - case \PREG_RECURSION_LIMIT_ERROR: - return 'Recursion limit exhausted'; - case \PREG_JIT_STACKLIMIT_ERROR: - return 'JIT stack limit exhausted'; - case \PREG_NO_ERROR: - return 'No error'; - default: - return 'Unknown error'; - } - } - public static function str_contains(string $haystack, string $needle) : bool - { - return '' === $needle || \false !== \strpos($haystack, $needle); - } - public static function str_starts_with(string $haystack, string $needle) : bool - { - return 0 === \strncmp($haystack, $needle, \strlen($needle)); - } - public static function str_ends_with(string $haystack, string $needle) : bool - { - if ('' === $needle || $needle === $haystack) { - return \true; - } - if ('' === $haystack) { - return \false; - } - $needleLength = \strlen($needle); - return $needleLength <= \strlen($haystack) && 0 === \substr_compare($haystack, $needle, -$needleLength); - } -} diff --git a/dependencies/symfony/polyfill-php80/PhpToken.php b/dependencies/symfony/polyfill-php80/PhpToken.php deleted file mode 100644 index 3f4a5b3..0000000 --- a/dependencies/symfony/polyfill-php80/PhpToken.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Polyfill\Php80; - -/** - * @author Fedonyuk Anton - * - * @internal - */ -class PhpToken implements \Stringable -{ - /** - * @var int - */ - public $id; - /** - * @var string - */ - public $text; - /** - * @var int - */ - public $line; - /** - * @var int - */ - public $pos; - public function __construct(int $id, string $text, int $line = -1, int $position = -1) - { - $this->id = $id; - $this->text = $text; - $this->line = $line; - $this->pos = $position; - } - public function getTokenName() : ?string - { - if ('UNKNOWN' === ($name = \token_name($this->id))) { - $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; - } - return $name; - } - /** - * @param int|string|array $kind - */ - public function is($kind) : bool - { - foreach ((array) $kind as $value) { - if (\in_array($value, [$this->id, $this->text], \true)) { - return \true; - } - } - return \false; - } - public function isIgnorable() : bool - { - return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], \true); - } - public function __toString() : string - { - return (string) $this->text; - } - /** - * @return static[] - */ - public static function tokenize(string $code, int $flags = 0) : array - { - $line = 1; - $position = 0; - $tokens = \token_get_all($code, $flags); - foreach ($tokens as $index => $token) { - if (\is_string($token)) { - $id = \ord($token); - $text = $token; - } else { - [$id, $text, $line] = $token; - } - $tokens[$index] = new static($id, $text, $line, $position); - $position += \strlen($text); - } - return $tokens; - } -} diff --git a/dependencies/symfony/polyfill-php80/Resources/stubs/Attribute.php b/dependencies/symfony/polyfill-php80/Resources/stubs/Attribute.php deleted file mode 100644 index 3ec96a5..0000000 --- a/dependencies/symfony/polyfill-php80/Resources/stubs/Attribute.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -#[\Attribute(\Attribute::TARGET_CLASS)] -final class Attribute -{ - public const TARGET_CLASS = 1; - public const TARGET_FUNCTION = 2; - public const TARGET_METHOD = 4; - public const TARGET_PROPERTY = 8; - public const TARGET_CLASS_CONSTANT = 16; - public const TARGET_PARAMETER = 32; - public const TARGET_ALL = 63; - public const IS_REPEATABLE = 64; - /** @var int */ - public $flags; - public function __construct(int $flags = self::TARGET_ALL) - { - $this->flags = $flags; - } -} -/* - * This file is part of the Symfony package. - * - * (c) Fabien Potencier - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -\class_alias('WP_Ultimo\\Dependencies\\Attribute', 'Attribute', \false); diff --git a/dependencies/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/dependencies/symfony/polyfill-php80/Resources/stubs/PhpToken.php deleted file mode 100644 index b1d1bed..0000000 --- a/dependencies/symfony/polyfill-php80/Resources/stubs/PhpToken.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID < 80000 && \extension_loaded('tokenizer')) { - class PhpToken extends \Symfony\Polyfill\Php80\PhpToken - { - } -} diff --git a/dependencies/symfony/polyfill-php80/Resources/stubs/Stringable.php b/dependencies/symfony/polyfill-php80/Resources/stubs/Stringable.php deleted file mode 100644 index d65c985..0000000 --- a/dependencies/symfony/polyfill-php80/Resources/stubs/Stringable.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID < 80000) { - interface Stringable - { - /** - * @return string - */ - public function __toString(); - } -} diff --git a/dependencies/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/dependencies/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php deleted file mode 100644 index 7f9b147..0000000 --- a/dependencies/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID < 80000) { - class UnhandledMatchError extends \Error - { - } -} diff --git a/dependencies/symfony/polyfill-php80/Resources/stubs/ValueError.php b/dependencies/symfony/polyfill-php80/Resources/stubs/ValueError.php deleted file mode 100644 index f3c72cd..0000000 --- a/dependencies/symfony/polyfill-php80/Resources/stubs/ValueError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID < 80000) { - class ValueError extends \Error - { - } -} diff --git a/dependencies/symfony/polyfill-php80/bootstrap.php b/dependencies/symfony/polyfill-php80/bootstrap.php deleted file mode 100644 index e5f7dbc..0000000 --- a/dependencies/symfony/polyfill-php80/bootstrap.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php80 as p; - -if (\PHP_VERSION_ID >= 80000) { - return; -} - -if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { - define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); -} - -if (!function_exists('fdiv')) { - function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } -} -if (!function_exists('preg_last_error_msg')) { - function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } -} -if (!function_exists('str_contains')) { - function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } -} -if (!function_exists('str_starts_with')) { - function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } -} -if (!function_exists('str_ends_with')) { - function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } -} -if (!function_exists('get_debug_type')) { - function get_debug_type($value): string { return p\Php80::get_debug_type($value); } -} -if (!function_exists('get_resource_id')) { - function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } -} diff --git a/dependencies/symfony/polyfill-php81/Php81.php b/dependencies/symfony/polyfill-php81/Php81.php deleted file mode 100644 index 9c0bda9..0000000 --- a/dependencies/symfony/polyfill-php81/Php81.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Polyfill\Php81; - -/** - * @author Nicolas Grekas - * - * @internal - */ -final class Php81 -{ - public static function array_is_list(array $array) : bool - { - if ([] === $array || $array === \array_values($array)) { - return \true; - } - $nextKey = -1; - foreach ($array as $k => $v) { - if ($k !== ++$nextKey) { - return \false; - } - } - return \true; - } -} diff --git a/dependencies/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php b/dependencies/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php deleted file mode 100644 index 6fbfe25..0000000 --- a/dependencies/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID >= 70400 && \extension_loaded('curl')) { - /** - * @property string $data - */ - class CURLStringFile extends \CURLFile - { - private $data; - public function __construct(string $data, string $postname, string $mime = 'application/octet-stream') - { - $this->data = $data; - parent::__construct('data://application/octet-stream;base64,' . \base64_encode($data), $mime, $postname); - } - public function __set(string $name, $value) : void - { - if ('data' !== $name) { - $this->{$name} = $value; - return; - } - if (\is_object($value) ? !\method_exists($value, '__toString') : !\is_scalar($value)) { - throw new \TypeError('Cannot assign ' . \gettype($value) . ' to property CURLStringFile::$data of type string'); - } - $this->name = 'data://application/octet-stream;base64,' . \base64_encode($value); - } - public function __isset(string $name) : bool - { - return isset($this->{$name}); - } - public function &__get(string $name) - { - return $this->{$name}; - } - } -} diff --git a/dependencies/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php b/dependencies/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php deleted file mode 100644 index 25dbf4f..0000000 --- a/dependencies/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -if (\PHP_VERSION_ID < 80100) { - #[\Attribute(\Attribute::TARGET_METHOD)] - final class ReturnTypeWillChange - { - public function __construct() - { - } - } -} diff --git a/dependencies/symfony/polyfill-php81/bootstrap.php b/dependencies/symfony/polyfill-php81/bootstrap.php deleted file mode 100644 index 9f872e0..0000000 --- a/dependencies/symfony/polyfill-php81/bootstrap.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\Polyfill\Php81 as p; - -if (\PHP_VERSION_ID >= 80100) { - return; -} - -if (defined('MYSQLI_REFRESH_SLAVE') && !defined('MYSQLI_REFRESH_REPLICA')) { - define('MYSQLI_REFRESH_REPLICA', 64); -} - -if (!function_exists('array_is_list')) { - function array_is_list(array $array): bool { return p\Php81::array_is_list($array); } -} - -if (!function_exists('enum_exists')) { - function enum_exists(string $enum, bool $autoload = true): bool { return $autoload && class_exists($enum) && false; } -} diff --git a/dependencies/symfony/process/Exception/ExceptionInterface.php b/dependencies/symfony/process/Exception/ExceptionInterface.php deleted file mode 100644 index 4c686f8..0000000 --- a/dependencies/symfony/process/Exception/ExceptionInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -/** - * Marker Interface for the Process Component. - * - * @author Johannes M. Schmitt - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/dependencies/symfony/process/Exception/InvalidArgumentException.php b/dependencies/symfony/process/Exception/InvalidArgumentException.php deleted file mode 100644 index 0e2042f..0000000 --- a/dependencies/symfony/process/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -/** - * InvalidArgumentException for the Process Component. - * - * @author Romain Neutron - */ -class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/dependencies/symfony/process/Exception/LogicException.php b/dependencies/symfony/process/Exception/LogicException.php deleted file mode 100644 index 1cf00f0..0000000 --- a/dependencies/symfony/process/Exception/LogicException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -/** - * LogicException for the Process Component. - * - * @author Romain Neutron - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/dependencies/symfony/process/Exception/ProcessFailedException.php b/dependencies/symfony/process/Exception/ProcessFailedException.php deleted file mode 100644 index 731fb50..0000000 --- a/dependencies/symfony/process/Exception/ProcessFailedException.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Process; -/** - * Exception for failed processes. - * - * @author Johannes M. Schmitt - */ -class ProcessFailedException extends RuntimeException -{ - private $process; - public function __construct(Process $process) - { - if ($process->isSuccessful()) { - throw new InvalidArgumentException('Expected a failed process, but the given process was successful.'); - } - $error = \sprintf('The command "%s" failed.' . "\n\nExit Code: %s(%s)\n\nWorking directory: %s", $process->getCommandLine(), $process->getExitCode(), $process->getExitCodeText(), $process->getWorkingDirectory()); - if (!$process->isOutputDisabled()) { - $error .= \sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s", $process->getOutput(), $process->getErrorOutput()); - } - parent::__construct($error); - $this->process = $process; - } - public function getProcess() - { - return $this->process; - } -} diff --git a/dependencies/symfony/process/Exception/ProcessSignaledException.php b/dependencies/symfony/process/Exception/ProcessSignaledException.php deleted file mode 100644 index 89d0806..0000000 --- a/dependencies/symfony/process/Exception/ProcessSignaledException.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Process; -/** - * Exception that is thrown when a process has been signaled. - * - * @author Sullivan Senechal - */ -final class ProcessSignaledException extends RuntimeException -{ - private $process; - public function __construct(Process $process) - { - $this->process = $process; - parent::__construct(\sprintf('The process has been signaled with signal "%s".', $process->getTermSignal())); - } - public function getProcess() : Process - { - return $this->process; - } - public function getSignal() : int - { - return $this->getProcess()->getTermSignal(); - } -} diff --git a/dependencies/symfony/process/Exception/ProcessTimedOutException.php b/dependencies/symfony/process/Exception/ProcessTimedOutException.php deleted file mode 100644 index 0a509e5..0000000 --- a/dependencies/symfony/process/Exception/ProcessTimedOutException.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Process; -/** - * Exception that is thrown when a process times out. - * - * @author Johannes M. Schmitt - */ -class ProcessTimedOutException extends RuntimeException -{ - public const TYPE_GENERAL = 1; - public const TYPE_IDLE = 2; - private $process; - private $timeoutType; - public function __construct(Process $process, int $timeoutType) - { - $this->process = $process; - $this->timeoutType = $timeoutType; - parent::__construct(\sprintf('The process "%s" exceeded the timeout of %s seconds.', $process->getCommandLine(), $this->getExceededTimeout())); - } - public function getProcess() - { - return $this->process; - } - public function isGeneralTimeout() - { - return self::TYPE_GENERAL === $this->timeoutType; - } - public function isIdleTimeout() - { - return self::TYPE_IDLE === $this->timeoutType; - } - public function getExceededTimeout() - { - switch ($this->timeoutType) { - case self::TYPE_GENERAL: - return $this->process->getTimeout(); - case self::TYPE_IDLE: - return $this->process->getIdleTimeout(); - default: - throw new \LogicException(\sprintf('Unknown timeout type "%d".', $this->timeoutType)); - } - } -} diff --git a/dependencies/symfony/process/Exception/RuntimeException.php b/dependencies/symfony/process/Exception/RuntimeException.php deleted file mode 100644 index d7937e3..0000000 --- a/dependencies/symfony/process/Exception/RuntimeException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Exception; - -/** - * RuntimeException for the Process Component. - * - * @author Johannes M. Schmitt - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/dependencies/symfony/process/ExecutableFinder.php b/dependencies/symfony/process/ExecutableFinder.php deleted file mode 100644 index 47d4e4b..0000000 --- a/dependencies/symfony/process/ExecutableFinder.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process; - -/** - * Generic executable finder. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class ExecutableFinder -{ - private $suffixes = ['.exe', '.bat', '.cmd', '.com']; - /** - * Replaces default suffixes of executable. - */ - public function setSuffixes(array $suffixes) - { - $this->suffixes = $suffixes; - } - /** - * Adds new possible suffix to check for executable. - */ - public function addSuffix(string $suffix) - { - $this->suffixes[] = $suffix; - } - /** - * Finds an executable by name. - * - * @param string $name The executable name (without the extension) - * @param string|null $default The default to return if no executable is found - * @param array $extraDirs Additional dirs to check into - * - * @return string|null - */ - public function find(string $name, string $default = null, array $extraDirs = []) - { - if (\ini_get('open_basedir')) { - $searchPath = \array_merge(\explode(\PATH_SEPARATOR, \ini_get('open_basedir')), $extraDirs); - $dirs = []; - foreach ($searchPath as $path) { - // Silencing against https://bugs.php.net/69240 - if (@\is_dir($path)) { - $dirs[] = $path; - } else { - if (\basename($path) == $name && @\is_executable($path)) { - return $path; - } - } - } - } else { - $dirs = \array_merge(\explode(\PATH_SEPARATOR, \getenv('PATH') ?: \getenv('Path')), $extraDirs); - } - $suffixes = ['']; - if ('\\' === \DIRECTORY_SEPARATOR) { - $pathExt = \getenv('PATHEXT'); - $suffixes = \array_merge($pathExt ? \explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); - } - foreach ($suffixes as $suffix) { - foreach ($dirs as $dir) { - if (@\is_file($file = $dir . \DIRECTORY_SEPARATOR . $name . $suffix) && ('\\' === \DIRECTORY_SEPARATOR || @\is_executable($file))) { - return $file; - } - } - } - return $default; - } -} diff --git a/dependencies/symfony/process/InputStream.php b/dependencies/symfony/process/InputStream.php deleted file mode 100644 index 794449c..0000000 --- a/dependencies/symfony/process/InputStream.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\RuntimeException; -/** - * Provides a way to continuously write to the input of a Process until the InputStream is closed. - * - * @author Nicolas Grekas - * - * @implements \IteratorAggregate - */ -class InputStream implements \IteratorAggregate -{ - /** @var callable|null */ - private $onEmpty = null; - private $input = []; - private $open = \true; - /** - * Sets a callback that is called when the write buffer becomes empty. - */ - public function onEmpty(callable $onEmpty = null) - { - $this->onEmpty = $onEmpty; - } - /** - * Appends an input to the write buffer. - * - * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, - * stream resource or \Traversable - */ - public function write($input) - { - if (null === $input) { - return; - } - if ($this->isClosed()) { - throw new RuntimeException(\sprintf('"%s" is closed.', static::class)); - } - $this->input[] = ProcessUtils::validateInput(__METHOD__, $input); - } - /** - * Closes the write buffer. - */ - public function close() - { - $this->open = \false; - } - /** - * Tells whether the write buffer is closed or not. - */ - public function isClosed() - { - return !$this->open; - } - /** - * @return \Traversable - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - $this->open = \true; - while ($this->open || $this->input) { - if (!$this->input) { - (yield ''); - continue; - } - $current = \array_shift($this->input); - if ($current instanceof \Iterator) { - yield from $current; - } else { - (yield $current); - } - if (!$this->input && $this->open && null !== ($onEmpty = $this->onEmpty)) { - $this->write($onEmpty($this)); - } - } - } -} diff --git a/dependencies/symfony/process/PhpExecutableFinder.php b/dependencies/symfony/process/PhpExecutableFinder.php deleted file mode 100644 index 38dab29..0000000 --- a/dependencies/symfony/process/PhpExecutableFinder.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process; - -/** - * An executable finder specifically designed for the PHP executable. - * - * @author Fabien Potencier - * @author Johannes M. Schmitt - */ -class PhpExecutableFinder -{ - private $executableFinder; - public function __construct() - { - $this->executableFinder = new ExecutableFinder(); - } - /** - * Finds The PHP executable. - * - * @return string|false - */ - public function find(bool $includeArgs = \true) - { - if ($php = \getenv('PHP_BINARY')) { - if (!\is_executable($php)) { - $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; - if ($php = \strtok(\exec($command . ' ' . \escapeshellarg($php)), \PHP_EOL)) { - if (!\is_executable($php)) { - return \false; - } - } else { - return \false; - } - } - if (@\is_dir($php)) { - return \false; - } - return $php; - } - $args = $this->findArguments(); - $args = $includeArgs && $args ? ' ' . \implode(' ', $args) : ''; - // PHP_BINARY return the current sapi executable - if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cli', 'cli-server', 'phpdbg'], \true)) { - return \PHP_BINARY . $args; - } - if ($php = \getenv('PHP_PATH')) { - if (!@\is_executable($php) || @\is_dir($php)) { - return \false; - } - return $php; - } - if ($php = \getenv('PHP_PEAR_PHP_BIN')) { - if (@\is_executable($php) && !@\is_dir($php)) { - return $php; - } - } - if (@\is_executable($php = \PHP_BINDIR . ('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@\is_dir($php)) { - return $php; - } - $dirs = [\PHP_BINDIR]; - if ('\\' === \DIRECTORY_SEPARATOR) { - $dirs[] = 'C:\\xampp\\php\\'; - } - return $this->executableFinder->find('php', \false, $dirs); - } - /** - * Finds the PHP executable arguments. - * - * @return array - */ - public function findArguments() - { - $arguments = []; - if ('phpdbg' === \PHP_SAPI) { - $arguments[] = '-qrr'; - } - return $arguments; - } -} diff --git a/dependencies/symfony/process/PhpProcess.php b/dependencies/symfony/process/PhpProcess.php deleted file mode 100644 index 7e19b0c..0000000 --- a/dependencies/symfony/process/PhpProcess.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\LogicException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\RuntimeException; -/** - * PhpProcess runs a PHP script in an independent process. - * - * $p = new PhpProcess(''); - * $p->run(); - * print $p->getOutput()."\n"; - * - * @author Fabien Potencier - */ -class PhpProcess extends Process -{ - /** - * @param string $script The PHP script to run (as a string) - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param int $timeout The timeout in seconds - * @param array|null $php Path to the PHP binary to use with any additional arguments - */ - public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) - { - if (null === $php) { - $executableFinder = new PhpExecutableFinder(); - $php = $executableFinder->find(\false); - $php = \false === $php ? null : \array_merge([$php], $executableFinder->findArguments()); - } - if ('phpdbg' === \PHP_SAPI) { - $file = \tempnam(\sys_get_temp_dir(), 'dbg'); - \file_put_contents($file, $script); - \register_shutdown_function('unlink', $file); - $php[] = $file; - $script = null; - } - parent::__construct($php, $cwd, $env, $script, $timeout); - } - /** - * {@inheritdoc} - */ - public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - throw new LogicException(\sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); - } - /** - * {@inheritdoc} - */ - public function start(callable $callback = null, array $env = []) - { - if (null === $this->getCommandLine()) { - throw new RuntimeException('Unable to find the PHP executable.'); - } - parent::start($callback, $env); - } -} diff --git a/dependencies/symfony/process/Pipes/AbstractPipes.php b/dependencies/symfony/process/Pipes/AbstractPipes.php deleted file mode 100644 index a25ef8b..0000000 --- a/dependencies/symfony/process/Pipes/AbstractPipes.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\InvalidArgumentException; -/** - * @author Romain Neutron - * - * @internal - */ -abstract class AbstractPipes implements PipesInterface -{ - public $pipes = []; - private $inputBuffer = ''; - private $input; - private $blocked = \true; - private $lastError; - /** - * @param resource|string|int|float|bool|\Iterator|null $input - */ - public function __construct($input) - { - if (\is_resource($input) || $input instanceof \Iterator) { - $this->input = $input; - } elseif (\is_string($input)) { - $this->inputBuffer = $input; - } else { - $this->inputBuffer = (string) $input; - } - } - /** - * {@inheritdoc} - */ - public function close() - { - foreach ($this->pipes as $pipe) { - if (\is_resource($pipe)) { - \fclose($pipe); - } - } - $this->pipes = []; - } - /** - * Returns true if a system call has been interrupted. - */ - protected function hasSystemCallBeenInterrupted() : bool - { - $lastError = $this->lastError; - $this->lastError = null; - // stream_select returns false when the `select` system call is interrupted by an incoming signal - return null !== $lastError && \false !== \stripos($lastError, 'interrupted system call'); - } - /** - * Unblocks streams. - */ - protected function unblock() - { - if (!$this->blocked) { - return; - } - foreach ($this->pipes as $pipe) { - \stream_set_blocking($pipe, 0); - } - if (\is_resource($this->input)) { - \stream_set_blocking($this->input, 0); - } - $this->blocked = \false; - } - /** - * Writes input to stdin. - * - * @throws InvalidArgumentException When an input iterator yields a non supported value - */ - protected function write() : ?array - { - if (!isset($this->pipes[0])) { - return null; - } - $input = $this->input; - if ($input instanceof \Iterator) { - if (!$input->valid()) { - $input = null; - } elseif (\is_resource($input = $input->current())) { - \stream_set_blocking($input, 0); - } elseif (!isset($this->inputBuffer[0])) { - if (!\is_string($input)) { - if (!\is_scalar($input)) { - throw new InvalidArgumentException(\sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', \get_debug_type($this->input), \get_debug_type($input))); - } - $input = (string) $input; - } - $this->inputBuffer = $input; - $this->input->next(); - $input = null; - } else { - $input = null; - } - } - $r = $e = []; - $w = [$this->pipes[0]]; - // let's have a look if something changed in streams - if (\false === @\stream_select($r, $w, $e, 0, 0)) { - return null; - } - foreach ($w as $stdin) { - if (isset($this->inputBuffer[0])) { - $written = \fwrite($stdin, $this->inputBuffer); - $this->inputBuffer = \substr($this->inputBuffer, $written); - if (isset($this->inputBuffer[0])) { - return [$this->pipes[0]]; - } - } - if ($input) { - while (\true) { - $data = \fread($input, self::CHUNK_SIZE); - if (!isset($data[0])) { - break; - } - $written = \fwrite($stdin, $data); - $data = \substr($data, $written); - if (isset($data[0])) { - $this->inputBuffer = $data; - return [$this->pipes[0]]; - } - } - if (\feof($input)) { - if ($this->input instanceof \Iterator) { - $this->input->next(); - } else { - $this->input = null; - } - } - } - } - // no input to read on resource, buffer is empty - if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) { - $this->input = null; - \fclose($this->pipes[0]); - unset($this->pipes[0]); - } elseif (!$w) { - return [$this->pipes[0]]; - } - return null; - } - /** - * @internal - */ - public function handleError(int $type, string $msg) - { - $this->lastError = $msg; - } -} diff --git a/dependencies/symfony/process/Pipes/PipesInterface.php b/dependencies/symfony/process/Pipes/PipesInterface.php deleted file mode 100644 index fff204a..0000000 --- a/dependencies/symfony/process/Pipes/PipesInterface.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes; - -/** - * PipesInterface manages descriptors and pipes for the use of proc_open. - * - * @author Romain Neutron - * - * @internal - */ -interface PipesInterface -{ - public const CHUNK_SIZE = 16384; - /** - * Returns an array of descriptors for the use of proc_open. - */ - public function getDescriptors() : array; - /** - * Returns an array of filenames indexed by their related stream in case these pipes use temporary files. - * - * @return string[] - */ - public function getFiles() : array; - /** - * Reads data in file handles and pipes. - * - * @param bool $blocking Whether to use blocking calls or not - * @param bool $close Whether to close pipes if they've reached EOF - * - * @return string[] An array of read data indexed by their fd - */ - public function readAndWrite(bool $blocking, bool $close = \false) : array; - /** - * Returns if the current state has open file handles or pipes. - */ - public function areOpen() : bool; - /** - * Returns if pipes are able to read output. - */ - public function haveReadSupport() : bool; - /** - * Closes file handles and pipes. - */ - public function close(); -} diff --git a/dependencies/symfony/process/Pipes/UnixPipes.php b/dependencies/symfony/process/Pipes/UnixPipes.php deleted file mode 100644 index b68f278..0000000 --- a/dependencies/symfony/process/Pipes/UnixPipes.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Process; -/** - * UnixPipes implementation uses unix pipes as handles. - * - * @author Romain Neutron - * - * @internal - */ -class UnixPipes extends AbstractPipes -{ - private $ttyMode; - private $ptyMode; - private $haveReadSupport; - public function __construct(?bool $ttyMode, bool $ptyMode, $input, bool $haveReadSupport) - { - $this->ttyMode = $ttyMode; - $this->ptyMode = $ptyMode; - $this->haveReadSupport = $haveReadSupport; - parent::__construct($input); - } - public function __sleep() : array - { - throw new \BadMethodCallException('Cannot serialize ' . __CLASS__); - } - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); - } - public function __destruct() - { - $this->close(); - } - /** - * {@inheritdoc} - */ - public function getDescriptors() : array - { - if (!$this->haveReadSupport) { - $nullstream = \fopen('/dev/null', 'c'); - return [['pipe', 'r'], $nullstream, $nullstream]; - } - if ($this->ttyMode) { - return [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']]; - } - if ($this->ptyMode && Process::isPtySupported()) { - return [['pty'], ['pty'], ['pty']]; - } - return [ - ['pipe', 'r'], - ['pipe', 'w'], - // stdout - ['pipe', 'w'], - ]; - } - /** - * {@inheritdoc} - */ - public function getFiles() : array - { - return []; - } - /** - * {@inheritdoc} - */ - public function readAndWrite(bool $blocking, bool $close = \false) : array - { - $this->unblock(); - $w = $this->write(); - $read = $e = []; - $r = $this->pipes; - unset($r[0]); - // let's have a look if something changed in streams - \set_error_handler([$this, 'handleError']); - if (($r || $w) && \false === \stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1000000.0 : 0)) { - \restore_error_handler(); - // if a system call has been interrupted, forget about it, let's try again - // otherwise, an error occurred, let's reset pipes - if (!$this->hasSystemCallBeenInterrupted()) { - $this->pipes = []; - } - return $read; - } - \restore_error_handler(); - foreach ($r as $pipe) { - // prior PHP 5.4 the array passed to stream_select is modified and - // lose key association, we have to find back the key - $read[$type = \array_search($pipe, $this->pipes, \true)] = ''; - do { - $data = @\fread($pipe, self::CHUNK_SIZE); - $read[$type] .= $data; - } while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1]))); - if (!isset($read[$type][0])) { - unset($read[$type]); - } - if ($close && \feof($pipe)) { - \fclose($pipe); - unset($this->pipes[$type]); - } - } - return $read; - } - /** - * {@inheritdoc} - */ - public function haveReadSupport() : bool - { - return $this->haveReadSupport; - } - /** - * {@inheritdoc} - */ - public function areOpen() : bool - { - return (bool) $this->pipes; - } -} diff --git a/dependencies/symfony/process/Pipes/WindowsPipes.php b/dependencies/symfony/process/Pipes/WindowsPipes.php deleted file mode 100644 index 4a9051f..0000000 --- a/dependencies/symfony/process/Pipes/WindowsPipes.php +++ /dev/null @@ -1,171 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\RuntimeException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Process; -/** - * WindowsPipes implementation uses temporary files as handles. - * - * @see https://bugs.php.net/51800 - * @see https://bugs.php.net/65650 - * - * @author Romain Neutron - * - * @internal - */ -class WindowsPipes extends AbstractPipes -{ - private $files = []; - private $fileHandles = []; - private $lockHandles = []; - private $readBytes = [Process::STDOUT => 0, Process::STDERR => 0]; - private $haveReadSupport; - public function __construct($input, bool $haveReadSupport) - { - $this->haveReadSupport = $haveReadSupport; - if ($this->haveReadSupport) { - // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big. - // Workaround for this problem is to use temporary files instead of pipes on Windows platform. - // - // @see https://bugs.php.net/51800 - $pipes = [Process::STDOUT => Process::OUT, Process::STDERR => Process::ERR]; - $tmpDir = \sys_get_temp_dir(); - $lastError = 'unknown reason'; - \set_error_handler(function ($type, $msg) use(&$lastError) { - $lastError = $msg; - }); - for ($i = 0;; ++$i) { - foreach ($pipes as $pipe => $name) { - $file = \sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name); - if (!($h = \fopen($file . '.lock', 'w'))) { - if (\file_exists($file . '.lock')) { - continue 2; - } - \restore_error_handler(); - throw new RuntimeException('A temporary file could not be opened to write the process output: ' . $lastError); - } - if (!\flock($h, \LOCK_EX | \LOCK_NB)) { - continue 2; - } - if (isset($this->lockHandles[$pipe])) { - \flock($this->lockHandles[$pipe], \LOCK_UN); - \fclose($this->lockHandles[$pipe]); - } - $this->lockHandles[$pipe] = $h; - if (!($h = \fopen($file, 'w')) || !\fclose($h) || !($h = \fopen($file, 'r'))) { - \flock($this->lockHandles[$pipe], \LOCK_UN); - \fclose($this->lockHandles[$pipe]); - unset($this->lockHandles[$pipe]); - continue 2; - } - $this->fileHandles[$pipe] = $h; - $this->files[$pipe] = $file; - } - break; - } - \restore_error_handler(); - } - parent::__construct($input); - } - public function __sleep() : array - { - throw new \BadMethodCallException('Cannot serialize ' . __CLASS__); - } - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); - } - public function __destruct() - { - $this->close(); - } - /** - * {@inheritdoc} - */ - public function getDescriptors() : array - { - if (!$this->haveReadSupport) { - $nullstream = \fopen('NUL', 'c'); - return [['pipe', 'r'], $nullstream, $nullstream]; - } - // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/51800) - // We're not using file handles as it can produce corrupted output https://bugs.php.net/65650 - // So we redirect output within the commandline and pass the nul device to the process - return [['pipe', 'r'], ['file', 'NUL', 'w'], ['file', 'NUL', 'w']]; - } - /** - * {@inheritdoc} - */ - public function getFiles() : array - { - return $this->files; - } - /** - * {@inheritdoc} - */ - public function readAndWrite(bool $blocking, bool $close = \false) : array - { - $this->unblock(); - $w = $this->write(); - $read = $r = $e = []; - if ($blocking) { - if ($w) { - @\stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1000000.0); - } elseif ($this->fileHandles) { - \usleep(Process::TIMEOUT_PRECISION * 1000000.0); - } - } - foreach ($this->fileHandles as $type => $fileHandle) { - $data = \stream_get_contents($fileHandle, -1, $this->readBytes[$type]); - if (isset($data[0])) { - $this->readBytes[$type] += \strlen($data); - $read[$type] = $data; - } - if ($close) { - \ftruncate($fileHandle, 0); - \fclose($fileHandle); - \flock($this->lockHandles[$type], \LOCK_UN); - \fclose($this->lockHandles[$type]); - unset($this->fileHandles[$type], $this->lockHandles[$type]); - } - } - return $read; - } - /** - * {@inheritdoc} - */ - public function haveReadSupport() : bool - { - return $this->haveReadSupport; - } - /** - * {@inheritdoc} - */ - public function areOpen() : bool - { - return $this->pipes && $this->fileHandles; - } - /** - * {@inheritdoc} - */ - public function close() - { - parent::close(); - foreach ($this->fileHandles as $type => $handle) { - \ftruncate($handle, 0); - \fclose($handle); - \flock($this->lockHandles[$type], \LOCK_UN); - \fclose($this->lockHandles[$type]); - } - $this->fileHandles = $this->lockHandles = []; - } -} diff --git a/dependencies/symfony/process/Process.php b/dependencies/symfony/process/Process.php deleted file mode 100644 index 35a7ef1..0000000 --- a/dependencies/symfony/process/Process.php +++ /dev/null @@ -1,1431 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\LogicException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\ProcessFailedException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\ProcessSignaledException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\ProcessTimedOutException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\RuntimeException; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes\PipesInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes\UnixPipes; -use WP_Ultimo\Dependencies\Symfony\Component\Process\Pipes\WindowsPipes; -/** - * Process is a thin wrapper around proc_* functions to easily - * start independent PHP processes. - * - * @author Fabien Potencier - * @author Romain Neutron - * - * @implements \IteratorAggregate - */ -class Process implements \IteratorAggregate -{ - public const ERR = 'err'; - public const OUT = 'out'; - public const STATUS_READY = 'ready'; - public const STATUS_STARTED = 'started'; - public const STATUS_TERMINATED = 'terminated'; - public const STDIN = 0; - public const STDOUT = 1; - public const STDERR = 2; - // Timeout Precision in seconds. - public const TIMEOUT_PRECISION = 0.2; - public const ITER_NON_BLOCKING = 1; - // By default, iterating over outputs is a blocking call, use this flag to make it non-blocking - public const ITER_KEEP_OUTPUT = 2; - // By default, outputs are cleared while iterating, use this flag to keep them in memory - public const ITER_SKIP_OUT = 4; - // Use this flag to skip STDOUT while iterating - public const ITER_SKIP_ERR = 8; - // Use this flag to skip STDERR while iterating - private $callback; - private $hasCallback = \false; - private $commandline; - private $cwd; - private $env = []; - private $input; - private $starttime; - private $lastOutputTime; - private $timeout; - private $idleTimeout; - private $exitcode; - private $fallbackStatus = []; - private $processInformation; - private $outputDisabled = \false; - private $stdout; - private $stderr; - private $process; - private $status = self::STATUS_READY; - private $incrementalOutputOffset = 0; - private $incrementalErrorOutputOffset = 0; - private $tty = \false; - private $pty; - private $options = ['suppress_errors' => \true, 'bypass_shell' => \true]; - private $useFileHandles = \false; - /** @var PipesInterface */ - private $processPipes; - private $latestSignal; - private static $sigchild; - /** - * Exit codes translation table. - * - * User-defined errors must use exit codes in the 64-113 range. - */ - public static $exitCodes = [ - 0 => 'OK', - 1 => 'General error', - 2 => 'Misuse of shell builtins', - 126 => 'Invoked command cannot execute', - 127 => 'Command not found', - 128 => 'Invalid exit argument', - // signals - 129 => 'Hangup', - 130 => 'Interrupt', - 131 => 'Quit and dump core', - 132 => 'Illegal instruction', - 133 => 'Trace/breakpoint trap', - 134 => 'Process aborted', - 135 => 'Bus error: "access to undefined portion of memory object"', - 136 => 'Floating point exception: "erroneous arithmetic operation"', - 137 => 'Kill (terminate immediately)', - 138 => 'User-defined 1', - 139 => 'Segmentation violation', - 140 => 'User-defined 2', - 141 => 'Write to pipe with no one reading', - 142 => 'Signal raised by alarm', - 143 => 'Termination (request to terminate)', - // 144 - not defined - 145 => 'Child process terminated, stopped (or continued*)', - 146 => 'Continue if stopped', - 147 => 'Stop executing temporarily', - 148 => 'Terminal stop signal', - 149 => 'Background process attempting to read from tty ("in")', - 150 => 'Background process attempting to write to tty ("out")', - 151 => 'Urgent data available on socket', - 152 => 'CPU time limit exceeded', - 153 => 'File size limit exceeded', - 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"', - 155 => 'Profiling timer expired', - // 156 - not defined - 157 => 'Pollable event', - // 158 - not defined - 159 => 'Bad syscall', - ]; - /** - * @param array $command The command to run and its arguments listed as separate entries - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable - * - * @throws LogicException When proc_open is not installed - */ - public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - if (!\function_exists('proc_open')) { - throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.'); - } - $this->commandline = $command; - $this->cwd = $cwd; - // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started - // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected - // @see : https://bugs.php.net/51800 - // @see : https://bugs.php.net/50524 - if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) { - $this->cwd = \getcwd(); - } - if (null !== $env) { - $this->setEnv($env); - } - $this->setInput($input); - $this->setTimeout($timeout); - $this->useFileHandles = '\\' === \DIRECTORY_SEPARATOR; - $this->pty = \false; - } - /** - * Creates a Process instance as a command-line to be run in a shell wrapper. - * - * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.) - * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the - * shell wrapper and not to your commands. - * - * In order to inject dynamic values into command-lines, we strongly recommend using placeholders. - * This will save escaping values, which is not portable nor secure anyway: - * - * $process = Process::fromShellCommandline('my_command "${:MY_VAR}"'); - * $process->run(null, ['MY_VAR' => $theValue]); - * - * @param string $command The command line to pass to the shell of the OS - * @param string|null $cwd The working directory or null to use the working dir of the current PHP process - * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input - * @param int|float|null $timeout The timeout in seconds or null to disable - * - * @return static - * - * @throws LogicException When proc_open is not installed - */ - public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) - { - $process = new static([], $cwd, $env, $input, $timeout); - $process->commandline = $command; - return $process; - } - /** - * @return array - */ - public function __sleep() - { - throw new \BadMethodCallException('Cannot serialize ' . __CLASS__); - } - public function __wakeup() - { - throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); - } - public function __destruct() - { - if ($this->options['create_new_console'] ?? \false) { - $this->processPipes->close(); - } else { - $this->stop(0); - } - } - public function __clone() - { - $this->resetProcessData(); - } - /** - * Runs the process. - * - * The callback receives the type of output (out or err) and - * some bytes from the output in real-time. It allows to have feedback - * from the independent process during execution. - * - * The STDOUT and STDERR are also available after the process is finished - * via the getOutput() and getErrorOutput() methods. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return int The exit status code - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * @throws ProcessTimedOutException When process timed out - * @throws ProcessSignaledException When process stopped after receiving signal - * @throws LogicException In case a callback is provided and output has been disabled - * - * @final - */ - public function run(callable $callback = null, array $env = []) : int - { - $this->start($callback, $env); - return $this->wait(); - } - /** - * Runs the process. - * - * This is identical to run() except that an exception is thrown if the process - * exits with a non-zero exit code. - * - * @return $this - * - * @throws ProcessFailedException if the process didn't terminate successfully - * - * @final - */ - public function mustRun(callable $callback = null, array $env = []) : self - { - if (0 !== $this->run($callback, $env)) { - throw new ProcessFailedException($this); - } - return $this; - } - /** - * Starts the process and returns after writing the input to STDIN. - * - * This method blocks until all STDIN data is sent to the process then it - * returns while the process runs in the background. - * - * The termination of the process can be awaited with wait(). - * - * The callback receives the type of output (out or err) and some bytes from - * the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * @throws LogicException In case a callback is provided and output has been disabled - */ - public function start(callable $callback = null, array $env = []) - { - if ($this->isRunning()) { - throw new RuntimeException('Process is already running.'); - } - $this->resetProcessData(); - $this->starttime = $this->lastOutputTime = \microtime(\true); - $this->callback = $this->buildCallback($callback); - $this->hasCallback = null !== $callback; - $descriptors = $this->getDescriptors(); - if ($this->env) { - $env += '\\' === \DIRECTORY_SEPARATOR ? \array_diff_ukey($this->env, $env, 'strcasecmp') : $this->env; - } - $env += '\\' === \DIRECTORY_SEPARATOR ? \array_diff_ukey($this->getDefaultEnv(), $env, 'strcasecmp') : $this->getDefaultEnv(); - if (\is_array($commandline = $this->commandline)) { - $commandline = \implode(' ', \array_map([$this, 'escapeArgument'], $commandline)); - if ('\\' !== \DIRECTORY_SEPARATOR) { - // exec is mandatory to deal with sending a signal to the process - $commandline = 'exec ' . $commandline; - } - } else { - $commandline = $this->replacePlaceholders($commandline, $env); - } - if ('\\' === \DIRECTORY_SEPARATOR) { - $commandline = $this->prepareWindowsCommandLine($commandline, $env); - } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) { - // last exit code is output on the fourth pipe and caught to work around --enable-sigchild - $descriptors[3] = ['pipe', 'w']; - // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input - $commandline = '{ (' . $commandline . ') <&3 3<&- 3>/dev/null & } 3<&0;'; - $commandline .= 'pid=$!; echo $pid >&3; wait $pid 2>/dev/null; code=$?; echo $code >&3; exit $code'; - // Workaround for the bug, when PTS functionality is enabled. - // @see : https://bugs.php.net/69442 - $ptsWorkaround = \fopen(__FILE__, 'r'); - } - $envPairs = []; - foreach ($env as $k => $v) { - if (\false !== $v && \false === \in_array($k, ['argc', 'argv', 'ARGC', 'ARGV'], \true)) { - $envPairs[] = $k . '=' . $v; - } - } - if (!\is_dir($this->cwd)) { - throw new RuntimeException(\sprintf('The provided cwd "%s" does not exist.', $this->cwd)); - } - $this->process = @\proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options); - if (!\is_resource($this->process)) { - throw new RuntimeException('Unable to launch a new process.'); - } - $this->status = self::STATUS_STARTED; - if (isset($descriptors[3])) { - $this->fallbackStatus['pid'] = (int) \fgets($this->processPipes->pipes[3]); - } - if ($this->tty) { - return; - } - $this->updateStatus(\false); - $this->checkTimeout(); - } - /** - * Restarts the process. - * - * Be warned that the process is cloned before being started. - * - * @param callable|null $callback A PHP callback to run whenever there is some - * output available on STDOUT or STDERR - * - * @return static - * - * @throws RuntimeException When process can't be launched - * @throws RuntimeException When process is already running - * - * @see start() - * - * @final - */ - public function restart(callable $callback = null, array $env = []) : self - { - if ($this->isRunning()) { - throw new RuntimeException('Process is already running.'); - } - $process = clone $this; - $process->start($callback, $env); - return $process; - } - /** - * Waits for the process to terminate. - * - * The callback receives the type of output (out or err) and some bytes - * from the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @param callable|null $callback A valid PHP callback - * - * @return int The exitcode of the process - * - * @throws ProcessTimedOutException When process timed out - * @throws ProcessSignaledException When process stopped after receiving signal - * @throws LogicException When process is not yet started - */ - public function wait(callable $callback = null) - { - $this->requireProcessIsStarted(__FUNCTION__); - $this->updateStatus(\false); - if (null !== $callback) { - if (!$this->processPipes->haveReadSupport()) { - $this->stop(0); - throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".'); - } - $this->callback = $this->buildCallback($callback); - } - do { - $this->checkTimeout(); - $running = $this->isRunning() && ('\\' === \DIRECTORY_SEPARATOR || $this->processPipes->areOpen()); - $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); - } while ($running); - while ($this->isRunning()) { - $this->checkTimeout(); - \usleep(1000); - } - if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) { - throw new ProcessSignaledException($this); - } - return $this->exitcode; - } - /** - * Waits until the callback returns true. - * - * The callback receives the type of output (out or err) and some bytes - * from the output in real-time while writing the standard input to the process. - * It allows to have feedback from the independent process during execution. - * - * @throws RuntimeException When process timed out - * @throws LogicException When process is not yet started - * @throws ProcessTimedOutException In case the timeout was reached - */ - public function waitUntil(callable $callback) : bool - { - $this->requireProcessIsStarted(__FUNCTION__); - $this->updateStatus(\false); - if (!$this->processPipes->haveReadSupport()) { - $this->stop(0); - throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".'); - } - $callback = $this->buildCallback($callback); - $ready = \false; - while (\true) { - $this->checkTimeout(); - $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); - $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); - foreach ($output as $type => $data) { - if (3 !== $type) { - $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready; - } elseif (!isset($this->fallbackStatus['signaled'])) { - $this->fallbackStatus['exitcode'] = (int) $data; - } - } - if ($ready) { - return \true; - } - if (!$running) { - return \false; - } - \usleep(1000); - } - } - /** - * Returns the Pid (process identifier), if applicable. - * - * @return int|null The process id if running, null otherwise - */ - public function getPid() - { - return $this->isRunning() ? $this->processInformation['pid'] : null; - } - /** - * Sends a POSIX signal to the process. - * - * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) - * - * @return $this - * - * @throws LogicException In case the process is not running - * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed - * @throws RuntimeException In case of failure - */ - public function signal(int $signal) - { - $this->doSignal($signal, \true); - return $this; - } - /** - * Disables fetching output and error output from the underlying process. - * - * @return $this - * - * @throws RuntimeException In case the process is already running - * @throws LogicException if an idle timeout is set - */ - public function disableOutput() - { - if ($this->isRunning()) { - throw new RuntimeException('Disabling output while the process is running is not possible.'); - } - if (null !== $this->idleTimeout) { - throw new LogicException('Output cannot be disabled while an idle timeout is set.'); - } - $this->outputDisabled = \true; - return $this; - } - /** - * Enables fetching output and error output from the underlying process. - * - * @return $this - * - * @throws RuntimeException In case the process is already running - */ - public function enableOutput() - { - if ($this->isRunning()) { - throw new RuntimeException('Enabling output while the process is running is not possible.'); - } - $this->outputDisabled = \false; - return $this; - } - /** - * Returns true in case the output is disabled, false otherwise. - * - * @return bool - */ - public function isOutputDisabled() - { - return $this->outputDisabled; - } - /** - * Returns the current output of the process (STDOUT). - * - * @return string - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getOutput() - { - $this->readPipesForOutput(__FUNCTION__); - if (\false === ($ret = \stream_get_contents($this->stdout, -1, 0))) { - return ''; - } - return $ret; - } - /** - * Returns the output incrementally. - * - * In comparison with the getOutput method which always return the whole - * output, this one returns the new output since the last call. - * - * @return string - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getIncrementalOutput() - { - $this->readPipesForOutput(__FUNCTION__); - $latest = \stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); - $this->incrementalOutputOffset = \ftell($this->stdout); - if (\false === $latest) { - return ''; - } - return $latest; - } - /** - * Returns an iterator to the output of the process, with the output type as keys (Process::OUT/ERR). - * - * @param int $flags A bit field of Process::ITER_* flags - * - * @return \Generator - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - #[\ReturnTypeWillChange] - public function getIterator(int $flags = 0) - { - $this->readPipesForOutput(__FUNCTION__, \false); - $clearOutput = !(self::ITER_KEEP_OUTPUT & $flags); - $blocking = !(self::ITER_NON_BLOCKING & $flags); - $yieldOut = !(self::ITER_SKIP_OUT & $flags); - $yieldErr = !(self::ITER_SKIP_ERR & $flags); - while (null !== $this->callback || $yieldOut && !\feof($this->stdout) || $yieldErr && !\feof($this->stderr)) { - if ($yieldOut) { - $out = \stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); - if (isset($out[0])) { - if ($clearOutput) { - $this->clearOutput(); - } else { - $this->incrementalOutputOffset = \ftell($this->stdout); - } - (yield self::OUT => $out); - } - } - if ($yieldErr) { - $err = \stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); - if (isset($err[0])) { - if ($clearOutput) { - $this->clearErrorOutput(); - } else { - $this->incrementalErrorOutputOffset = \ftell($this->stderr); - } - (yield self::ERR => $err); - } - } - if (!$blocking && !isset($out[0]) && !isset($err[0])) { - (yield self::OUT => ''); - } - $this->checkTimeout(); - $this->readPipesForOutput(__FUNCTION__, $blocking); - } - } - /** - * Clears the process output. - * - * @return $this - */ - public function clearOutput() - { - \ftruncate($this->stdout, 0); - \fseek($this->stdout, 0); - $this->incrementalOutputOffset = 0; - return $this; - } - /** - * Returns the current error output of the process (STDERR). - * - * @return string - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getErrorOutput() - { - $this->readPipesForOutput(__FUNCTION__); - if (\false === ($ret = \stream_get_contents($this->stderr, -1, 0))) { - return ''; - } - return $ret; - } - /** - * Returns the errorOutput incrementally. - * - * In comparison with the getErrorOutput method which always return the - * whole error output, this one returns the new error output since the last - * call. - * - * @return string - * - * @throws LogicException in case the output has been disabled - * @throws LogicException In case the process is not started - */ - public function getIncrementalErrorOutput() - { - $this->readPipesForOutput(__FUNCTION__); - $latest = \stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); - $this->incrementalErrorOutputOffset = \ftell($this->stderr); - if (\false === $latest) { - return ''; - } - return $latest; - } - /** - * Clears the process output. - * - * @return $this - */ - public function clearErrorOutput() - { - \ftruncate($this->stderr, 0); - \fseek($this->stderr, 0); - $this->incrementalErrorOutputOffset = 0; - return $this; - } - /** - * Returns the exit code returned by the process. - * - * @return int|null The exit status code, null if the Process is not terminated - */ - public function getExitCode() - { - $this->updateStatus(\false); - return $this->exitcode; - } - /** - * Returns a string representation for the exit code returned by the process. - * - * This method relies on the Unix exit code status standardization - * and might not be relevant for other operating systems. - * - * @return string|null A string representation for the exit status code, null if the Process is not terminated - * - * @see http://tldp.org/LDP/abs/html/exitcodes.html - * @see http://en.wikipedia.org/wiki/Unix_signal - */ - public function getExitCodeText() - { - if (null === ($exitcode = $this->getExitCode())) { - return null; - } - return self::$exitCodes[$exitcode] ?? 'Unknown error'; - } - /** - * Checks if the process ended successfully. - * - * @return bool - */ - public function isSuccessful() - { - return 0 === $this->getExitCode(); - } - /** - * Returns true if the child process has been terminated by an uncaught signal. - * - * It always returns false on Windows. - * - * @return bool - * - * @throws LogicException In case the process is not terminated - */ - public function hasBeenSignaled() - { - $this->requireProcessIsTerminated(__FUNCTION__); - return $this->processInformation['signaled']; - } - /** - * Returns the number of the signal that caused the child process to terminate its execution. - * - * It is only meaningful if hasBeenSignaled() returns true. - * - * @return int - * - * @throws RuntimeException In case --enable-sigchild is activated - * @throws LogicException In case the process is not terminated - */ - public function getTermSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) { - throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal cannot be retrieved.'); - } - return $this->processInformation['termsig']; - } - /** - * Returns true if the child process has been stopped by a signal. - * - * It always returns false on Windows. - * - * @return bool - * - * @throws LogicException In case the process is not terminated - */ - public function hasBeenStopped() - { - $this->requireProcessIsTerminated(__FUNCTION__); - return $this->processInformation['stopped']; - } - /** - * Returns the number of the signal that caused the child process to stop its execution. - * - * It is only meaningful if hasBeenStopped() returns true. - * - * @return int - * - * @throws LogicException In case the process is not terminated - */ - public function getStopSignal() - { - $this->requireProcessIsTerminated(__FUNCTION__); - return $this->processInformation['stopsig']; - } - /** - * Checks if the process is currently running. - * - * @return bool - */ - public function isRunning() - { - if (self::STATUS_STARTED !== $this->status) { - return \false; - } - $this->updateStatus(\false); - return $this->processInformation['running']; - } - /** - * Checks if the process has been started with no regard to the current state. - * - * @return bool - */ - public function isStarted() - { - return self::STATUS_READY != $this->status; - } - /** - * Checks if the process is terminated. - * - * @return bool - */ - public function isTerminated() - { - $this->updateStatus(\false); - return self::STATUS_TERMINATED == $this->status; - } - /** - * Gets the process status. - * - * The status is one of: ready, started, terminated. - * - * @return string - */ - public function getStatus() - { - $this->updateStatus(\false); - return $this->status; - } - /** - * Stops the process. - * - * @param int|float $timeout The timeout in seconds - * @param int|null $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9) - * - * @return int|null The exit-code of the process or null if it's not running - */ - public function stop(float $timeout = 10, int $signal = null) - { - $timeoutMicro = \microtime(\true) + $timeout; - if ($this->isRunning()) { - // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here - $this->doSignal(15, \false); - do { - \usleep(1000); - } while ($this->isRunning() && \microtime(\true) < $timeoutMicro); - if ($this->isRunning()) { - // Avoid exception here: process is supposed to be running, but it might have stopped just - // after this line. In any case, let's silently discard the error, we cannot do anything. - $this->doSignal($signal ?: 9, \false); - } - } - if ($this->isRunning()) { - if (isset($this->fallbackStatus['pid'])) { - unset($this->fallbackStatus['pid']); - return $this->stop(0, $signal); - } - $this->close(); - } - return $this->exitcode; - } - /** - * Adds a line to the STDOUT stream. - * - * @internal - */ - public function addOutput(string $line) - { - $this->lastOutputTime = \microtime(\true); - \fseek($this->stdout, 0, \SEEK_END); - \fwrite($this->stdout, $line); - \fseek($this->stdout, $this->incrementalOutputOffset); - } - /** - * Adds a line to the STDERR stream. - * - * @internal - */ - public function addErrorOutput(string $line) - { - $this->lastOutputTime = \microtime(\true); - \fseek($this->stderr, 0, \SEEK_END); - \fwrite($this->stderr, $line); - \fseek($this->stderr, $this->incrementalErrorOutputOffset); - } - /** - * Gets the last output time in seconds. - */ - public function getLastOutputTime() : ?float - { - return $this->lastOutputTime; - } - /** - * Gets the command line to be executed. - * - * @return string - */ - public function getCommandLine() - { - return \is_array($this->commandline) ? \implode(' ', \array_map([$this, 'escapeArgument'], $this->commandline)) : $this->commandline; - } - /** - * Gets the process timeout in seconds (max. runtime). - * - * @return float|null - */ - public function getTimeout() - { - return $this->timeout; - } - /** - * Gets the process idle timeout in seconds (max. time since last output). - * - * @return float|null - */ - public function getIdleTimeout() - { - return $this->idleTimeout; - } - /** - * Sets the process timeout (max. runtime) in seconds. - * - * To disable the timeout, set this value to null. - * - * @return $this - * - * @throws InvalidArgumentException if the timeout is negative - */ - public function setTimeout(?float $timeout) - { - $this->timeout = $this->validateTimeout($timeout); - return $this; - } - /** - * Sets the process idle timeout (max. time since last output) in seconds. - * - * To disable the timeout, set this value to null. - * - * @return $this - * - * @throws LogicException if the output is disabled - * @throws InvalidArgumentException if the timeout is negative - */ - public function setIdleTimeout(?float $timeout) - { - if (null !== $timeout && $this->outputDisabled) { - throw new LogicException('Idle timeout cannot be set while the output is disabled.'); - } - $this->idleTimeout = $this->validateTimeout($timeout); - return $this; - } - /** - * Enables or disables the TTY mode. - * - * @return $this - * - * @throws RuntimeException In case the TTY mode is not supported - */ - public function setTty(bool $tty) - { - if ('\\' === \DIRECTORY_SEPARATOR && $tty) { - throw new RuntimeException('TTY mode is not supported on Windows platform.'); - } - if ($tty && !self::isTtySupported()) { - throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.'); - } - $this->tty = $tty; - return $this; - } - /** - * Checks if the TTY mode is enabled. - * - * @return bool - */ - public function isTty() - { - return $this->tty; - } - /** - * Sets PTY mode. - * - * @return $this - */ - public function setPty(bool $bool) - { - $this->pty = $bool; - return $this; - } - /** - * Returns PTY state. - * - * @return bool - */ - public function isPty() - { - return $this->pty; - } - /** - * Gets the working directory. - * - * @return string|null - */ - public function getWorkingDirectory() - { - if (null === $this->cwd) { - // getcwd() will return false if any one of the parent directories does not have - // the readable or search mode set, even if the current directory does - return \getcwd() ?: null; - } - return $this->cwd; - } - /** - * Sets the current working directory. - * - * @return $this - */ - public function setWorkingDirectory(string $cwd) - { - $this->cwd = $cwd; - return $this; - } - /** - * Gets the environment variables. - * - * @return array - */ - public function getEnv() - { - return $this->env; - } - /** - * Sets the environment variables. - * - * @param array $env The new environment variables - * - * @return $this - */ - public function setEnv(array $env) - { - $this->env = $env; - return $this; - } - /** - * Gets the Process input. - * - * @return resource|string|\Iterator|null - */ - public function getInput() - { - return $this->input; - } - /** - * Sets the input. - * - * This content will be passed to the underlying process standard input. - * - * @param string|int|float|bool|resource|\Traversable|null $input The content - * - * @return $this - * - * @throws LogicException In case the process is running - */ - public function setInput($input) - { - if ($this->isRunning()) { - throw new LogicException('Input cannot be set while the process is running.'); - } - $this->input = ProcessUtils::validateInput(__METHOD__, $input); - return $this; - } - /** - * Performs a check between the timeout definition and the time the process started. - * - * In case you run a background process (with the start method), you should - * trigger this method regularly to ensure the process timeout - * - * @throws ProcessTimedOutException In case the timeout was reached - */ - public function checkTimeout() - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - if (null !== $this->timeout && $this->timeout < \microtime(\true) - $this->starttime) { - $this->stop(0); - throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL); - } - if (null !== $this->idleTimeout && $this->idleTimeout < \microtime(\true) - $this->lastOutputTime) { - $this->stop(0); - throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE); - } - } - /** - * @throws LogicException in case process is not started - */ - public function getStartTime() : float - { - if (!$this->isStarted()) { - throw new LogicException('Start time is only available after process start.'); - } - return $this->starttime; - } - /** - * Defines options to pass to the underlying proc_open(). - * - * @see https://php.net/proc_open for the options supported by PHP. - * - * Enabling the "create_new_console" option allows a subprocess to continue - * to run after the main process exited, on both Windows and *nix - */ - public function setOptions(array $options) - { - if ($this->isRunning()) { - throw new RuntimeException('Setting options while the process is running is not possible.'); - } - $defaultOptions = $this->options; - $existingOptions = ['blocking_pipes', 'create_process_group', 'create_new_console']; - foreach ($options as $key => $value) { - if (!\in_array($key, $existingOptions)) { - $this->options = $defaultOptions; - throw new LogicException(\sprintf('Invalid option "%s" passed to "%s()". Supported options are "%s".', $key, __METHOD__, \implode('", "', $existingOptions))); - } - $this->options[$key] = $value; - } - } - /** - * Returns whether TTY is supported on the current operating system. - */ - public static function isTtySupported() : bool - { - static $isTtySupported; - if (null === $isTtySupported) { - $isTtySupported = (bool) @\proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); - } - return $isTtySupported; - } - /** - * Returns whether PTY is supported on the current operating system. - * - * @return bool - */ - public static function isPtySupported() - { - static $result; - if (null !== $result) { - return $result; - } - if ('\\' === \DIRECTORY_SEPARATOR) { - return $result = \false; - } - return $result = (bool) @\proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); - } - /** - * Creates the descriptors needed by the proc_open. - */ - private function getDescriptors() : array - { - if ($this->input instanceof \Iterator) { - $this->input->rewind(); - } - if ('\\' === \DIRECTORY_SEPARATOR) { - $this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $this->hasCallback); - } else { - $this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $this->hasCallback); - } - return $this->processPipes->getDescriptors(); - } - /** - * Builds up the callback used by wait(). - * - * The callbacks adds all occurred output to the specific buffer and calls - * the user callback (if present) with the received output. - * - * @param callable|null $callback The user defined PHP callback - * - * @return \Closure - */ - protected function buildCallback(callable $callback = null) - { - if ($this->outputDisabled) { - return function ($type, $data) use($callback) : bool { - return null !== $callback && $callback($type, $data); - }; - } - $out = self::OUT; - return function ($type, $data) use($callback, $out) : bool { - if ($out == $type) { - $this->addOutput($data); - } else { - $this->addErrorOutput($data); - } - return null !== $callback && $callback($type, $data); - }; - } - /** - * Updates the status of the process, reads pipes. - * - * @param bool $blocking Whether to use a blocking read call - */ - protected function updateStatus(bool $blocking) - { - if (self::STATUS_STARTED !== $this->status) { - return; - } - $this->processInformation = \proc_get_status($this->process); - $running = $this->processInformation['running']; - $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running); - if ($this->fallbackStatus && $this->isSigchildEnabled()) { - $this->processInformation = $this->fallbackStatus + $this->processInformation; - } - if (!$running) { - $this->close(); - } - } - /** - * Returns whether PHP has been compiled with the '--enable-sigchild' option or not. - * - * @return bool - */ - protected function isSigchildEnabled() - { - if (null !== self::$sigchild) { - return self::$sigchild; - } - if (!\function_exists('phpinfo')) { - return self::$sigchild = \false; - } - \ob_start(); - \phpinfo(\INFO_GENERAL); - return self::$sigchild = \str_contains(\ob_get_clean(), '--enable-sigchild'); - } - /** - * Reads pipes for the freshest output. - * - * @param string $caller The name of the method that needs fresh outputs - * @param bool $blocking Whether to use blocking calls or not - * - * @throws LogicException in case output has been disabled or process is not started - */ - private function readPipesForOutput(string $caller, bool $blocking = \false) - { - if ($this->outputDisabled) { - throw new LogicException('Output has been disabled.'); - } - $this->requireProcessIsStarted($caller); - $this->updateStatus($blocking); - } - /** - * Validates and returns the filtered timeout. - * - * @throws InvalidArgumentException if the given timeout is a negative number - */ - private function validateTimeout(?float $timeout) : ?float - { - $timeout = (float) $timeout; - if (0.0 === $timeout) { - $timeout = null; - } elseif ($timeout < 0) { - throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); - } - return $timeout; - } - /** - * Reads pipes, executes callback. - * - * @param bool $blocking Whether to use blocking calls or not - * @param bool $close Whether to close file handles or not - */ - private function readPipes(bool $blocking, bool $close) - { - $result = $this->processPipes->readAndWrite($blocking, $close); - $callback = $this->callback; - foreach ($result as $type => $data) { - if (3 !== $type) { - $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data); - } elseif (!isset($this->fallbackStatus['signaled'])) { - $this->fallbackStatus['exitcode'] = (int) $data; - } - } - } - /** - * Closes process resource, closes file handles, sets the exitcode. - * - * @return int The exitcode - */ - private function close() : int - { - $this->processPipes->close(); - if (\is_resource($this->process)) { - \proc_close($this->process); - } - $this->exitcode = $this->processInformation['exitcode']; - $this->status = self::STATUS_TERMINATED; - if (-1 === $this->exitcode) { - if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) { - // if process has been signaled, no exitcode but a valid termsig, apply Unix convention - $this->exitcode = 128 + $this->processInformation['termsig']; - } elseif ($this->isSigchildEnabled()) { - $this->processInformation['signaled'] = \true; - $this->processInformation['termsig'] = -1; - } - } - // Free memory from self-reference callback created by buildCallback - // Doing so in other contexts like __destruct or by garbage collector is ineffective - // Now pipes are closed, so the callback is no longer necessary - $this->callback = null; - return $this->exitcode; - } - /** - * Resets data related to the latest run of the process. - */ - private function resetProcessData() - { - $this->starttime = null; - $this->callback = null; - $this->exitcode = null; - $this->fallbackStatus = []; - $this->processInformation = null; - $this->stdout = \fopen('php://temp/maxmemory:' . 1024 * 1024, 'w+'); - $this->stderr = \fopen('php://temp/maxmemory:' . 1024 * 1024, 'w+'); - $this->process = null; - $this->latestSignal = null; - $this->status = self::STATUS_READY; - $this->incrementalOutputOffset = 0; - $this->incrementalErrorOutputOffset = 0; - } - /** - * Sends a POSIX signal to the process. - * - * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) - * @param bool $throwException Whether to throw exception in case signal failed - * - * @throws LogicException In case the process is not running - * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed - * @throws RuntimeException In case of failure - */ - private function doSignal(int $signal, bool $throwException) : bool - { - if (null === ($pid = $this->getPid())) { - if ($throwException) { - throw new LogicException('Cannot send signal on a non running process.'); - } - return \false; - } - if ('\\' === \DIRECTORY_SEPARATOR) { - \exec(\sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode); - if ($exitCode && $this->isRunning()) { - if ($throwException) { - throw new RuntimeException(\sprintf('Unable to kill the process (%s).', \implode(' ', $output))); - } - return \false; - } - } else { - if (!$this->isSigchildEnabled()) { - $ok = @\proc_terminate($this->process, $signal); - } elseif (\function_exists('posix_kill')) { - $ok = @\posix_kill($pid, $signal); - } elseif ($ok = \proc_open(\sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { - $ok = \false === \fgets($pipes[2]); - } - if (!$ok) { - if ($throwException) { - throw new RuntimeException(\sprintf('Error while sending signal "%s".', $signal)); - } - return \false; - } - } - $this->latestSignal = $signal; - $this->fallbackStatus['signaled'] = \true; - $this->fallbackStatus['exitcode'] = -1; - $this->fallbackStatus['termsig'] = $this->latestSignal; - return \true; - } - private function prepareWindowsCommandLine(string $cmd, array &$env) : string - { - $uid = \uniqid('', \true); - $varCount = 0; - $varCache = []; - $cmd = \preg_replace_callback('/"(?:( - [^"%!^]*+ - (?: - (?: !LF! | "(?:\\^[%!^])?+" ) - [^"%!^]*+ - )++ - ) | [^"]*+ )"/x', function ($m) use(&$env, &$varCache, &$varCount, $uid) { - if (!isset($m[1])) { - return $m[0]; - } - if (isset($varCache[$m[0]])) { - return $varCache[$m[0]]; - } - if (\str_contains($value = $m[1], "\x00")) { - $value = \str_replace("\x00", '?', $value); - } - if (\false === \strpbrk($value, "\"%!\n")) { - return '"' . $value . '"'; - } - $value = \str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value); - $value = '"' . \preg_replace('/(\\\\*)"/', '$1$1\\"', $value) . '"'; - $var = $uid . ++$varCount; - $env[$var] = $value; - return $varCache[$m[0]] = '!' . $var . '!'; - }, $cmd); - $cmd = 'cmd /V:ON /E:ON /D /C (' . \str_replace("\n", ' ', $cmd) . ')'; - foreach ($this->processPipes->getFiles() as $offset => $filename) { - $cmd .= ' ' . $offset . '>"' . $filename . '"'; - } - return $cmd; - } - /** - * Ensures the process is running or terminated, throws a LogicException if the process has a not started. - * - * @throws LogicException if the process has not run - */ - private function requireProcessIsStarted(string $functionName) - { - if (!$this->isStarted()) { - throw new LogicException(\sprintf('Process must be started before calling "%s()".', $functionName)); - } - } - /** - * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated". - * - * @throws LogicException if the process is not yet terminated - */ - private function requireProcessIsTerminated(string $functionName) - { - if (!$this->isTerminated()) { - throw new LogicException(\sprintf('Process must be terminated before calling "%s()".', $functionName)); - } - } - /** - * Escapes a string to be used as a shell argument. - */ - private function escapeArgument(?string $argument) : string - { - if ('' === $argument || null === $argument) { - return '""'; - } - if ('\\' !== \DIRECTORY_SEPARATOR) { - return "'" . \str_replace("'", "'\\''", $argument) . "'"; - } - if (\str_contains($argument, "\x00")) { - $argument = \str_replace("\x00", '?', $argument); - } - if (!\preg_match('/[\\/()%!^"<>&|\\s]/', $argument)) { - return $argument; - } - $argument = \preg_replace('/(\\\\+)$/', '$1$1', $argument); - return '"' . \str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument) . '"'; - } - private function replacePlaceholders(string $commandline, array $env) - { - return \preg_replace_callback('/"\\$\\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\\}"/', function ($matches) use($commandline, $env) { - if (!isset($env[$matches[1]]) || \false === $env[$matches[1]]) { - throw new InvalidArgumentException(\sprintf('Command line is missing a value for parameter "%s": ', $matches[1]) . $commandline); - } - return $this->escapeArgument($env[$matches[1]]); - }, $commandline); - } - private function getDefaultEnv() : array - { - $env = \getenv(); - $env = ('\\' === \DIRECTORY_SEPARATOR ? \array_intersect_ukey($env, $_SERVER, 'strcasecmp') : \array_intersect_key($env, $_SERVER)) ?: $env; - return $_ENV + ('\\' === \DIRECTORY_SEPARATOR ? \array_diff_ukey($env, $_ENV, 'strcasecmp') : $env); - } -} diff --git a/dependencies/symfony/process/ProcessUtils.php b/dependencies/symfony/process/ProcessUtils.php deleted file mode 100644 index c443668..0000000 --- a/dependencies/symfony/process/ProcessUtils.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\Process; - -use WP_Ultimo\Dependencies\Symfony\Component\Process\Exception\InvalidArgumentException; -/** - * ProcessUtils is a bunch of utility methods. - * - * This class contains static methods only and is not meant to be instantiated. - * - * @author Martin Hasoň - */ -class ProcessUtils -{ - /** - * This class should not be instantiated. - */ - private function __construct() - { - } - /** - * Validates and normalizes a Process input. - * - * @param string $caller The name of method call that validates the input - * @param mixed $input The input to validate - * - * @return mixed - * - * @throws InvalidArgumentException In case the input is not valid - */ - public static function validateInput(string $caller, $input) - { - if (null !== $input) { - if (\is_resource($input)) { - return $input; - } - if (\is_string($input)) { - return $input; - } - if (\is_scalar($input)) { - return (string) $input; - } - if ($input instanceof Process) { - return $input->getIterator($input::ITER_SKIP_ERR); - } - if ($input instanceof \Iterator) { - return $input; - } - if ($input instanceof \Traversable) { - return new \IteratorIterator($input); - } - throw new InvalidArgumentException(\sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller)); - } - return $input; - } -} diff --git a/dependencies/symfony/service-contracts/Attribute/Required.php b/dependencies/symfony/service-contracts/Attribute/Required.php deleted file mode 100644 index 2cd4b39..0000000 --- a/dependencies/symfony/service-contracts/Attribute/Required.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service\Attribute; - -/** - * A required dependency. - * - * This attribute indicates that a property holds a required dependency. The annotated property or method should be - * considered during the instantiation process of the containing class. - * - * @author Alexander M. Turek - */ -#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] -final class Required -{ -} diff --git a/dependencies/symfony/service-contracts/Attribute/SubscribedService.php b/dependencies/symfony/service-contracts/Attribute/SubscribedService.php deleted file mode 100644 index 1784b43..0000000 --- a/dependencies/symfony/service-contracts/Attribute/SubscribedService.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service\Attribute; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ServiceSubscriberInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ServiceSubscriberTrait; -/** - * For use as the return value for {@see ServiceSubscriberInterface}. - * - * @example new SubscribedService('http_client', HttpClientInterface::class, false, new Target('githubApi')) - * - * Use with {@see ServiceSubscriberTrait} to mark a method's return type - * as a subscribed service. - * - * @author Kevin Bond - */ -#[\Attribute(\Attribute::TARGET_METHOD)] -final class SubscribedService -{ - /** @var object[] */ - public array $attributes; - /** - * @param string|null $key The key to use for the service - * @param class-string|null $type The service class - * @param bool $nullable Whether the service is optional - * @param object|object[] $attributes One or more dependency injection attributes to use - */ - public function __construct(public ?string $key = null, public ?string $type = null, public bool $nullable = \false, array|object $attributes = []) - { - $this->attributes = \is_array($attributes) ? $attributes : [$attributes]; - } -} diff --git a/dependencies/symfony/service-contracts/ResetInterface.php b/dependencies/symfony/service-contracts/ResetInterface.php deleted file mode 100644 index 19bbd0c..0000000 --- a/dependencies/symfony/service-contracts/ResetInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service; - -/** - * Provides a way to reset an object to its initial state. - * - * When calling the "reset()" method on an object, it should be put back to its - * initial state. This usually means clearing any internal buffers and forwarding - * the call to internal dependencies. All properties of the object should be put - * back to the same state it had when it was first ready to use. - * - * This method could be called, for example, to recycle objects that are used as - * services, so that they can be used to handle several requests in the same - * process loop (note that we advise making your services stateless instead of - * implementing this interface when possible.) - */ -interface ResetInterface -{ - /** - * @return void - */ - public function reset(); -} diff --git a/dependencies/symfony/service-contracts/ServiceLocatorTrait.php b/dependencies/symfony/service-contracts/ServiceLocatorTrait.php deleted file mode 100644 index a301def..0000000 --- a/dependencies/symfony/service-contracts/ServiceLocatorTrait.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service; - -use WP_Ultimo\Dependencies\Psr\Container\ContainerExceptionInterface; -use WP_Ultimo\Dependencies\Psr\Container\NotFoundExceptionInterface; -// Help opcache.preload discover always-needed symbols -\class_exists(ContainerExceptionInterface::class); -\class_exists(NotFoundExceptionInterface::class); -/** - * A trait to help implement ServiceProviderInterface. - * - * @author Robin Chalas - * @author Nicolas Grekas - */ -trait ServiceLocatorTrait -{ - private array $factories; - private array $loading = []; - private array $providedTypes; - /** - * @param callable[] $factories - */ - public function __construct(array $factories) - { - $this->factories = $factories; - } - public function has(string $id) : bool - { - return isset($this->factories[$id]); - } - public function get(string $id) : mixed - { - if (!isset($this->factories[$id])) { - throw $this->createNotFoundException($id); - } - if (isset($this->loading[$id])) { - $ids = \array_values($this->loading); - $ids = \array_slice($this->loading, \array_search($id, $ids)); - $ids[] = $id; - throw $this->createCircularReferenceException($id, $ids); - } - $this->loading[$id] = $id; - try { - return $this->factories[$id]($this); - } finally { - unset($this->loading[$id]); - } - } - public function getProvidedServices() : array - { - if (!isset($this->providedTypes)) { - $this->providedTypes = []; - foreach ($this->factories as $name => $factory) { - if (!\is_callable($factory)) { - $this->providedTypes[$name] = '?'; - } else { - $type = (new \ReflectionFunction($factory))->getReturnType(); - $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '') . ($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; - } - } - } - return $this->providedTypes; - } - private function createNotFoundException(string $id) : NotFoundExceptionInterface - { - if (!($alternatives = \array_keys($this->factories))) { - $message = 'is empty...'; - } else { - $last = \array_pop($alternatives); - if ($alternatives) { - $message = \sprintf('only knows about the "%s" and "%s" services.', \implode('", "', $alternatives), $last); - } else { - $message = \sprintf('only knows about the "%s" service.', $last); - } - } - if ($this->loading) { - $message = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', \end($this->loading), $id, $message); - } else { - $message = \sprintf('Service "%s" not found: the current service locator %s', $id, $message); - } - return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface - { - }; - } - private function createCircularReferenceException(string $id, array $path) : ContainerExceptionInterface - { - return new class(\sprintf('Circular reference detected for service "%s", path: "%s".', $id, \implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface - { - }; - } -} diff --git a/dependencies/symfony/service-contracts/ServiceProviderInterface.php b/dependencies/symfony/service-contracts/ServiceProviderInterface.php deleted file mode 100644 index 7b02c0e..0000000 --- a/dependencies/symfony/service-contracts/ServiceProviderInterface.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service; - -use WP_Ultimo\Dependencies\Psr\Container\ContainerInterface; -/** - * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. - * - * @author Nicolas Grekas - * @author Mateusz Sip - * - * @template-covariant T of mixed - */ -interface ServiceProviderInterface extends ContainerInterface -{ - /** - * @return T - */ - public function get(string $id) : mixed; - public function has(string $id) : bool; - /** - * Returns an associative array of service types keyed by the identifiers provided by the current container. - * - * Examples: - * - * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface - * * ['foo' => '?'] means the container provides service name "foo" of unspecified type - * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null - * - * @return string[] The provided service types, keyed by service names - */ - public function getProvidedServices() : array; -} diff --git a/dependencies/symfony/service-contracts/ServiceSubscriberInterface.php b/dependencies/symfony/service-contracts/ServiceSubscriberInterface.php deleted file mode 100644 index 37dc1d8..0000000 --- a/dependencies/symfony/service-contracts/ServiceSubscriberInterface.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\Attribute\SubscribedService; -/** - * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. - * - * The getSubscribedServices method returns an array of service types required by such instances, - * optionally keyed by the service names used internally. Service types that start with an interrogation - * mark "?" are optional, while the other ones are mandatory service dependencies. - * - * The injected service locators SHOULD NOT allow access to any other services not specified by the method. - * - * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. - * This interface does not dictate any injection method for these service locators, although constructor - * injection is recommended. - * - * @author Nicolas Grekas - */ -interface ServiceSubscriberInterface -{ - /** - * Returns an array of service types (or {@see SubscribedService} objects) required - * by such instances, optionally keyed by the service names used internally. - * - * For mandatory dependencies: - * - * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name - * internally to fetch a service which must implement Psr\Log\LoggerInterface. - * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name - * internally to fetch an iterable of Psr\Log\LoggerInterface instances. - * * ['Psr\Log\LoggerInterface'] is a shortcut for - * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] - * - * otherwise: - * - * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency - * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency - * * ['?Psr\Log\LoggerInterface'] is a shortcut for - * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] - * - * additionally, an array of {@see SubscribedService}'s can be returned: - * - * * [new SubscribedService('logger', Psr\Log\LoggerInterface::class)] - * * [new SubscribedService(type: Psr\Log\LoggerInterface::class, nullable: true)] - * * [new SubscribedService('http_client', HttpClientInterface::class, attributes: new Target('githubApi'))] - * - * @return string[]|SubscribedService[] The required service types, optionally keyed by service names - */ - public static function getSubscribedServices() : array; -} diff --git a/dependencies/symfony/service-contracts/ServiceSubscriberTrait.php b/dependencies/symfony/service-contracts/ServiceSubscriberTrait.php deleted file mode 100644 index 9424f2e..0000000 --- a/dependencies/symfony/service-contracts/ServiceSubscriberTrait.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service; - -use WP_Ultimo\Dependencies\Psr\Container\ContainerInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\Attribute\Required; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\Attribute\SubscribedService; -/** - * Implementation of ServiceSubscriberInterface that determines subscribed services from - * method return types. Service ids are available as "ClassName::methodName". - * - * @author Kevin Bond - */ -trait ServiceSubscriberTrait -{ - /** @var ContainerInterface */ - protected $container; - public static function getSubscribedServices() : array - { - $services = \method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; - foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { - if (self::class !== $method->getDeclaringClass()->name) { - continue; - } - if (!($attribute = $method->getAttributes(SubscribedService::class)[0] ?? null)) { - continue; - } - if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { - throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); - } - if (!($returnType = $method->getReturnType())) { - throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); - } - /* @var SubscribedService $attribute */ - $attribute = $attribute->newInstance(); - $attribute->key ??= self::class . '::' . $method->name; - $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; - $attribute->nullable = $returnType->allowsNull(); - if ($attribute->attributes) { - $services[] = $attribute; - } else { - $services[$attribute->key] = ($attribute->nullable ? '?' : '') . $attribute->type; - } - } - return $services; - } - #[Required] - public function setContainer(ContainerInterface $container) : ?ContainerInterface - { - $ret = null; - if (\method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__)) { - $ret = parent::setContainer($container); - } - $this->container = $container; - return $ret; - } -} diff --git a/dependencies/symfony/service-contracts/Test/ServiceLocatorTest.php b/dependencies/symfony/service-contracts/Test/ServiceLocatorTest.php deleted file mode 100644 index a80d272..0000000 --- a/dependencies/symfony/service-contracts/Test/ServiceLocatorTest.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service\Test; - -\class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); -if (\false) { - /** - * @deprecated since PHPUnit 9.6 - */ - class ServiceLocatorTest - { - } -} diff --git a/dependencies/symfony/service-contracts/Test/ServiceLocatorTestCase.php b/dependencies/symfony/service-contracts/Test/ServiceLocatorTestCase.php deleted file mode 100644 index e125c88..0000000 --- a/dependencies/symfony/service-contracts/Test/ServiceLocatorTestCase.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Service\Test; - -use PHPUnit\Framework\TestCase; -use WP_Ultimo\Dependencies\Psr\Container\ContainerInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Service\ServiceLocatorTrait; -abstract class ServiceLocatorTestCase extends TestCase -{ - protected function getServiceLocator(array $factories) : ContainerInterface - { - return new class($factories) implements ContainerInterface - { - use ServiceLocatorTrait; - }; - } - public function testHas() - { - $locator = $this->getServiceLocator(['foo' => function () { - return 'bar'; - }, 'bar' => function () { - return 'baz'; - }, function () { - return 'dummy'; - }]); - $this->assertTrue($locator->has('foo')); - $this->assertTrue($locator->has('bar')); - $this->assertFalse($locator->has('dummy')); - } - public function testGet() - { - $locator = $this->getServiceLocator(['foo' => function () { - return 'bar'; - }, 'bar' => function () { - return 'baz'; - }]); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('baz', $locator->get('bar')); - } - public function testGetDoesNotMemoize() - { - $i = 0; - $locator = $this->getServiceLocator(['foo' => function () use(&$i) { - ++$i; - return 'bar'; - }]); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame(2, $i); - } - public function testThrowsOnUndefinedInternalService() - { - if (!$this->getExpectedException()) { - $this->expectException(\WP_Ultimo\Dependencies\Psr\Container\NotFoundExceptionInterface::class); - $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); - } - $locator = $this->getServiceLocator(['foo' => function () use(&$locator) { - return $locator->get('bar'); - }]); - $locator->get('foo'); - } - public function testThrowsOnCircularReference() - { - $this->expectException(\WP_Ultimo\Dependencies\Psr\Container\ContainerExceptionInterface::class); - $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); - $locator = $this->getServiceLocator(['foo' => function () use(&$locator) { - return $locator->get('bar'); - }, 'bar' => function () use(&$locator) { - return $locator->get('baz'); - }, 'baz' => function () use(&$locator) { - return $locator->get('bar'); - }]); - $locator->get('foo'); - } -} diff --git a/dependencies/symfony/translation-contracts/LocaleAwareInterface.php b/dependencies/symfony/translation-contracts/LocaleAwareInterface.php deleted file mode 100644 index e3d7f0f..0000000 --- a/dependencies/symfony/translation-contracts/LocaleAwareInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Translation; - -interface LocaleAwareInterface -{ - /** - * Sets the current locale. - * - * @return void - * - * @throws \InvalidArgumentException If the locale contains invalid characters - */ - public function setLocale(string $locale); - /** - * Returns the current locale. - */ - public function getLocale() : string; -} diff --git a/dependencies/symfony/translation-contracts/Test/TranslatorTest.php b/dependencies/symfony/translation-contracts/Test/TranslatorTest.php deleted file mode 100644 index 40349cb..0000000 --- a/dependencies/symfony/translation-contracts/Test/TranslatorTest.php +++ /dev/null @@ -1,306 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Translation\Test; - -use PHPUnit\Framework\TestCase; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorTrait; -/** - * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms - * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms. - * - * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. - * The mozilla code is also interesting to check for. - * - * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199 - * - * The goal to cover all languages is to far fetched so this test case is smaller. - * - * @author Clemens Tolboom clemens@build2be.nl - */ -class TranslatorTest extends TestCase -{ - private $defaultLocale; - protected function setUp() : void - { - $this->defaultLocale = \Locale::getDefault(); - \Locale::setDefault('en'); - } - protected function tearDown() : void - { - \Locale::setDefault($this->defaultLocale); - } - public function getTranslator() : TranslatorInterface - { - return new class implements TranslatorInterface - { - use TranslatorTrait; - }; - } - /** - * @dataProvider getTransTests - */ - public function testTrans($expected, $id, $parameters) - { - $translator = $this->getTranslator(); - $this->assertEquals($expected, $translator->trans($id, $parameters)); - } - /** - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithExplicitLocale($expected, $id, $number) - { - $translator = $this->getTranslator(); - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); - } - /** - * @requires extension intl - * - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithDefaultLocale($expected, $id, $number) - { - $translator = $this->getTranslator(); - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); - } - /** - * @dataProvider getTransChoiceTests - */ - public function testTransChoiceWithEnUsPosix($expected, $id, $number) - { - $translator = $this->getTranslator(); - $translator->setLocale('en_US_POSIX'); - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); - } - public function testGetSetLocale() - { - $translator = $this->getTranslator(); - $this->assertEquals('en', $translator->getLocale()); - } - /** - * @requires extension intl - */ - public function testGetLocaleReturnsDefaultLocaleIfNotSet() - { - $translator = $this->getTranslator(); - \Locale::setDefault('pt_BR'); - $this->assertEquals('pt_BR', $translator->getLocale()); - \Locale::setDefault('en'); - $this->assertEquals('en', $translator->getLocale()); - } - public static function getTransTests() - { - return [['Symfony is great!', 'Symfony is great!', []], ['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']]]; - } - public static function getTransChoiceTests() - { - return [ - ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], - ['There are 0 apples', 'There is 1 apple|There are %count% apples', 0], - ['There is 1 apple', 'There is 1 apple|There are %count% apples', 1], - ['There are 10 apples', 'There is 1 apple|There are %count% apples', 10], - // custom validation messages may be coded with a fixed value - ['There are 2 apples', 'There are 2 apples', 2], - ]; - } - /** - * @dataProvider getInterval - */ - public function testInterval($expected, $number, $interval) - { - $translator = $this->getTranslator(); - $this->assertEquals($expected, $translator->trans($interval . ' foo|[1,Inf[ bar', ['%count%' => $number])); - } - public static function getInterval() - { - return [['foo', 3, '{1,2, 3 ,4}'], ['bar', 10, '{1,2, 3 ,4}'], ['bar', 3, '[1,2]'], ['foo', 1, '[1,2]'], ['foo', 2, '[1,2]'], ['bar', 1, ']1,2['], ['bar', 2, ']1,2['], ['foo', \log(0), '[-Inf,2['], ['foo', -\log(0), '[-2,+Inf]']]; - } - /** - * @dataProvider getChooseTests - */ - public function testChoose($expected, $id, $number, $locale = null) - { - $translator = $this->getTranslator(); - $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number], null, $locale)); - } - public function testReturnMessageIfExactlyOneStandardRuleIsGiven() - { - $translator = $this->getTranslator(); - $this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2])); - } - /** - * @dataProvider getNonMatchingMessages - */ - public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number) - { - $this->expectException(\InvalidArgumentException::class); - $translator = $this->getTranslator(); - $translator->trans($id, ['%count%' => $number]); - } - public static function getNonMatchingMessages() - { - return [['{0} There are no apples|{1} There is one apple', 2], ['{1} There is one apple|]1,Inf] There are %count% apples', 0], ['{1} There is one apple|]2,Inf] There are %count% apples', 2], ['{0} There are no apples|There is one apple', 2]]; - } - public static function getChooseTests() - { - return [ - ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10], - ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], - ['There are 0 apples', 'There is one apple|There are %count% apples', 0], - ['There is one apple', 'There is one apple|There are %count% apples', 1], - ['There are 10 apples', 'There is one apple|There are %count% apples', 10], - ['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0], - ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1], - ['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10], - ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0], - ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1], - ['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10], - ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0], - ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1], - // Indexed only tests which are Gettext PoFile* compatible strings. - ['There are 0 apples', 'There is one apple|There are %count% apples', 0], - ['There is one apple', 'There is one apple|There are %count% apples', 1], - ['There are 2 apples', 'There is one apple|There are %count% apples', 2], - // Tests for float numbers - ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7], - ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1], - ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7], - ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], - ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0], - ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], - // Test texts with new-lines - // with double-quotes and \n in id & double-quotes and actual newlines in text - ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 0], - // with double-quotes and \n in id and single-quotes and actual newlines in text - ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 1], - ["This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 5], - // with double-quotes and id split across lines - ['This is a text with a - new-line in it. Selector = 1.', '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 1], - // with single-quotes and id split across lines - ['This is a text with a - new-line in it. Selector > 1.', '{0}This is a text with a - new-line in it. Selector = 0.|{1}This is a text with a - new-line in it. Selector = 1.|[1,Inf]This is a text with a - new-line in it. Selector > 1.', 5], - // with single-quotes and \n in text - ['This is a text with a\\nnew-line in it. Selector = 0.', '{0}This is a text with a\\nnew-line in it. Selector = 0.|{1}This is a text with a\\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\\nnew-line in it. Selector > 1.', 0], - // with double-quotes and id split across lines - ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1], - // escape pipe - ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0], - // Empty plural set (2 plural forms) from a .PO file - ['', '|', 1], - // Empty plural set (3 plural forms) from a .PO file - ['', '||', 1], - // Floating values - ['1.5 liters', '%count% liter|%count% liters', 1.5], - ['1.5 litre', '%count% litre|%count% litres', 1.5, 'fr'], - // Negative values - ['-1 degree', '%count% degree|%count% degrees', -1], - ['-1 degré', '%count% degré|%count% degrés', -1], - ['-1.5 degrees', '%count% degree|%count% degrees', -1.5], - ['-1.5 degré', '%count% degré|%count% degrés', -1.5, 'fr'], - ['-2 degrees', '%count% degree|%count% degrees', -2], - ['-2 degrés', '%count% degré|%count% degrés', -2], - ]; - } - /** - * @dataProvider failingLangcodes - */ - public function testFailedLangcodes($nplural, $langCodes) - { - $matrix = $this->generateTestData($langCodes); - $this->validateMatrix($nplural, $matrix, \false); - } - /** - * @dataProvider successLangcodes - */ - public function testLangcodes($nplural, $langCodes) - { - $matrix = $this->generateTestData($langCodes); - $this->validateMatrix($nplural, $matrix); - } - /** - * This array should contain all currently known langcodes. - * - * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. - */ - public static function successLangcodes() : array - { - return [['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM', 'en_US_POSIX']], ['3', ['be', 'bs', 'cs', 'hr']], ['4', ['cy', 'mt', 'sl']], ['6', ['ar']]]; - } - /** - * This array should be at least empty within the near future. - * - * This both depends on a complete list trying to add above as understanding - * the plural rules of the current failing languages. - * - * @return array with nplural together with langcodes - */ - public static function failingLangcodes() : array - { - return [['1', ['fa']], ['2', ['jbo']], ['3', ['cbs']], ['4', ['gd', 'kw']], ['5', ['ga']]]; - } - /** - * We validate only on the plural coverage. Thus the real rules is not tested. - * - * @param string $nplural Plural expected - * @param array $matrix Containing langcodes and their plural index values - */ - protected function validateMatrix(string $nplural, array $matrix, bool $expectSuccess = \true) - { - foreach ($matrix as $langCode => $data) { - $indexes = \array_flip($data); - if ($expectSuccess) { - $this->assertCount($nplural, $indexes, "Langcode '{$langCode}' has '{$nplural}' plural forms."); - } else { - $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms."); - } - } - } - protected function generateTestData($langCodes) - { - $translator = new class - { - use TranslatorTrait { - getPluralizationRule as public; - } - }; - $matrix = []; - foreach ($langCodes as $langCode) { - for ($count = 0; $count < 200; ++$count) { - $plural = $translator->getPluralizationRule($count, $langCode); - $matrix[$langCode][$count] = $plural; - } - } - return $matrix; - } -} diff --git a/dependencies/symfony/translation-contracts/TranslatableInterface.php b/dependencies/symfony/translation-contracts/TranslatableInterface.php deleted file mode 100644 index 9bfe6fc..0000000 --- a/dependencies/symfony/translation-contracts/TranslatableInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Translation; - -/** - * @author Nicolas Grekas - */ -interface TranslatableInterface -{ - public function trans(TranslatorInterface $translator, string $locale = null) : string; -} diff --git a/dependencies/symfony/translation-contracts/TranslatorInterface.php b/dependencies/symfony/translation-contracts/TranslatorInterface.php deleted file mode 100644 index 7147bff..0000000 --- a/dependencies/symfony/translation-contracts/TranslatorInterface.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Translation; - -/** - * @author Fabien Potencier - */ -interface TranslatorInterface -{ - /** - * Translates the given message. - * - * When a number is provided as a parameter named "%count%", the message is parsed for plural - * forms and a translation is chosen according to this number using the following rules: - * - * Given a message with different plural translations separated by a - * pipe (|), this method returns the correct portion of the message based - * on the given number, locale and the pluralization rules in the message - * itself. - * - * The message supports two different types of pluralization rules: - * - * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples - * indexed: There is one apple|There are %count% apples - * - * The indexed solution can also contain labels (e.g. one: There is one apple). - * This is purely for making the translations more clear - it does not - * affect the functionality. - * - * The two methods can also be mixed: - * {0} There are no apples|one: There is one apple|more: There are %count% apples - * - * An interval can represent a finite set of numbers: - * {1,2,3,4} - * - * An interval can represent numbers between two numbers: - * [1, +Inf] - * ]-1,2[ - * - * The left delimiter can be [ (inclusive) or ] (exclusive). - * The right delimiter can be [ (exclusive) or ] (inclusive). - * Beside numbers, you can use -Inf and +Inf for the infinite. - * - * @see https://en.wikipedia.org/wiki/ISO_31-11 - * - * @param string $id The message id (may also be an object that can be cast to string) - * @param array $parameters An array of parameters for the message - * @param string|null $domain The domain for the message or null to use the default - * @param string|null $locale The locale or null to use the default - * - * @throws \InvalidArgumentException If the locale contains invalid characters - */ - public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null) : string; - /** - * Returns the default locale. - */ - public function getLocale() : string; -} diff --git a/dependencies/symfony/translation-contracts/TranslatorTrait.php b/dependencies/symfony/translation-contracts/TranslatorTrait.php deleted file mode 100644 index 77cf855..0000000 --- a/dependencies/symfony/translation-contracts/TranslatorTrait.php +++ /dev/null @@ -1,133 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Contracts\Translation; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -/** - * A trait to help implement TranslatorInterface and LocaleAwareInterface. - * - * @author Fabien Potencier - */ -trait TranslatorTrait -{ - private ?string $locale = null; - /** - * @return void - */ - public function setLocale(string $locale) - { - $this->locale = $locale; - } - public function getLocale() : string - { - return $this->locale ?: (\class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); - } - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) : string - { - if (null === $id || '' === $id) { - return ''; - } - if (!isset($parameters['%count%']) || !\is_numeric($parameters['%count%'])) { - return \strtr($id, $parameters); - } - $number = (float) $parameters['%count%']; - $locale = $locale ?: $this->getLocale(); - $parts = []; - if (\preg_match('/^\\|++$/', $id)) { - $parts = \explode('|', $id); - } elseif (\preg_match_all('/(?:\\|\\||[^\\|])++/', $id, $matches)) { - $parts = $matches[0]; - } - $intervalRegexp = <<<'EOF' -/^(?P - ({\s* - (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) - \s*}) - - | - - (?P[\[\]]) - \s* - (?P-Inf|\-?\d+(\.\d+)?) - \s*,\s* - (?P\+?Inf|\-?\d+(\.\d+)?) - \s* - (?P[\[\]]) -)\s*(?P.*?)$/xs -EOF; - $standardRules = []; - foreach ($parts as $part) { - $part = \trim(\str_replace('||', '|', $part)); - // try to match an explicit rule, then fallback to the standard ones - if (\preg_match($intervalRegexp, $part, $matches)) { - if ($matches[2]) { - foreach (\explode(',', $matches[3]) as $n) { - if ($number == $n) { - return \strtr($matches['message'], $parameters); - } - } - } else { - $leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left']; - $rightNumber = \is_numeric($matches['right']) ? (float) $matches['right'] : \INF; - if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)) { - return \strtr($matches['message'], $parameters); - } - } - } elseif (\preg_match('/^\\w+\\:\\s*(.*?)$/', $part, $matches)) { - $standardRules[] = $matches[1]; - } else { - $standardRules[] = $part; - } - } - $position = $this->getPluralizationRule($number, $locale); - if (!isset($standardRules[$position])) { - // when there's exactly one rule given, and that rule is a standard - // rule, use this rule - if (1 === \count($parts) && isset($standardRules[0])) { - return \strtr($standardRules[0], $parameters); - } - $message = \sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); - if (\class_exists(InvalidArgumentException::class)) { - throw new InvalidArgumentException($message); - } - throw new \InvalidArgumentException($message); - } - return \strtr($standardRules[$position], $parameters); - } - /** - * Returns the plural position to use for the given locale and number. - * - * The plural rules are derived from code of the Zend Framework (2010-09-25), - * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd). - * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) - */ - private function getPluralizationRule(float $number, string $locale) : int - { - $number = \abs($number); - return match ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? \substr($locale, 0, \strrpos($locale, '_')) : $locale) { - 'af', 'bn', 'bg', 'ca', 'da', 'de', 'el', 'en', 'en_US_POSIX', 'eo', 'es', 'et', 'eu', 'fa', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'he', 'hu', 'is', 'it', 'ku', 'lb', 'ml', 'mn', 'mr', 'nah', 'nb', 'ne', 'nl', 'nn', 'no', 'oc', 'om', 'or', 'pa', 'pap', 'ps', 'pt', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'zu' => 1 == $number ? 0 : 1, - 'am', 'bh', 'fil', 'fr', 'gun', 'hi', 'hy', 'ln', 'mg', 'nso', 'pt_BR', 'ti', 'wa' => $number < 2 ? 0 : 1, - 'be', 'bs', 'hr', 'ru', 'sh', 'sr', 'uk' => 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2), - 'cs', 'sk' => 1 == $number ? 0 : ($number >= 2 && $number <= 4 ? 1 : 2), - 'ga' => 1 == $number ? 0 : (2 == $number ? 1 : 2), - 'lt' => 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2), - 'sl' => 1 == $number % 100 ? 0 : (2 == $number % 100 ? 1 : (3 == $number % 100 || 4 == $number % 100 ? 2 : 3)), - 'mk' => 1 == $number % 10 ? 0 : 1, - 'mt' => 1 == $number ? 0 : (0 == $number || $number % 100 > 1 && $number % 100 < 11 ? 1 : ($number % 100 > 10 && $number % 100 < 20 ? 2 : 3)), - 'lv' => 0 == $number ? 0 : (1 == $number % 10 && 11 != $number % 100 ? 1 : 2), - 'pl' => 1 == $number ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 12 || $number % 100 > 14) ? 1 : 2), - 'cy' => 1 == $number ? 0 : (2 == $number ? 1 : (8 == $number || 11 == $number ? 2 : 3)), - 'ro' => 1 == $number ? 0 : (0 == $number || $number % 100 > 0 && $number % 100 < 20 ? 1 : 2), - 'ar' => 0 == $number ? 0 : (1 == $number ? 1 : (2 == $number ? 2 : ($number % 100 >= 3 && $number % 100 <= 10 ? 3 : ($number % 100 >= 11 && $number % 100 <= 99 ? 4 : 5)))), - default => 0, - }; - } -} diff --git a/dependencies/symfony/translation/Catalogue/AbstractOperation.php b/dependencies/symfony/translation/Catalogue/AbstractOperation.php deleted file mode 100644 index 7c85f25..0000000 --- a/dependencies/symfony/translation/Catalogue/AbstractOperation.php +++ /dev/null @@ -1,163 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\LogicException; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\MessageCatalogueInterface; -/** - * Base catalogues binary operation class. - * - * A catalogue binary operation performs operation on - * source (the left argument) and target (the right argument) catalogues. - * - * @author Jean-François Simon - */ -abstract class AbstractOperation implements \Symfony\Component\Translation\Catalogue\OperationInterface -{ - public const OBSOLETE_BATCH = 'obsolete'; - public const NEW_BATCH = 'new'; - public const ALL_BATCH = 'all'; - protected $source; - protected $target; - protected $result; - /** - * @var array|null The domains affected by this operation - */ - private $domains; - /** - * This array stores 'all', 'new' and 'obsolete' messages for all valid domains. - * - * The data structure of this array is as follows: - * - * [ - * 'domain 1' => [ - * 'all' => [...], - * 'new' => [...], - * 'obsolete' => [...] - * ], - * 'domain 2' => [ - * 'all' => [...], - * 'new' => [...], - * 'obsolete' => [...] - * ], - * ... - * ] - * - * @var array The array that stores 'all', 'new' and 'obsolete' messages - */ - protected $messages; - /** - * @throws LogicException - */ - public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target) - { - if ($source->getLocale() !== $target->getLocale()) { - throw new LogicException('Operated catalogues must belong to the same locale.'); - } - $this->source = $source; - $this->target = $target; - $this->result = new MessageCatalogue($source->getLocale()); - $this->messages = []; - } - public function getDomains() : array - { - if (null === $this->domains) { - $domains = []; - foreach ([$this->source, $this->target] as $catalogue) { - foreach ($catalogue->getDomains() as $domain) { - $domains[$domain] = $domain; - if ($catalogue->all($domainIcu = $domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX)) { - $domains[$domainIcu] = $domainIcu; - } - } - } - $this->domains = \array_values($domains); - } - return $this->domains; - } - public function getMessages(string $domain) : array - { - if (!\in_array($domain, $this->getDomains())) { - throw new InvalidArgumentException(\sprintf('Invalid domain: "%s".', $domain)); - } - if (!isset($this->messages[$domain][self::ALL_BATCH])) { - $this->processDomain($domain); - } - return $this->messages[$domain][self::ALL_BATCH]; - } - public function getNewMessages(string $domain) : array - { - if (!\in_array($domain, $this->getDomains())) { - throw new InvalidArgumentException(\sprintf('Invalid domain: "%s".', $domain)); - } - if (!isset($this->messages[$domain][self::NEW_BATCH])) { - $this->processDomain($domain); - } - return $this->messages[$domain][self::NEW_BATCH]; - } - public function getObsoleteMessages(string $domain) : array - { - if (!\in_array($domain, $this->getDomains())) { - throw new InvalidArgumentException(\sprintf('Invalid domain: "%s".', $domain)); - } - if (!isset($this->messages[$domain][self::OBSOLETE_BATCH])) { - $this->processDomain($domain); - } - return $this->messages[$domain][self::OBSOLETE_BATCH]; - } - public function getResult() : MessageCatalogueInterface - { - foreach ($this->getDomains() as $domain) { - if (!isset($this->messages[$domain])) { - $this->processDomain($domain); - } - } - return $this->result; - } - /** - * @param self::*_BATCH $batch - */ - public function moveMessagesToIntlDomainsIfPossible(string $batch = self::ALL_BATCH) : void - { - // If MessageFormatter class does not exists, intl domains are not supported. - if (!\class_exists(\MessageFormatter::class)) { - return; - } - foreach ($this->getDomains() as $domain) { - $intlDomain = $domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - $messages = match ($batch) { - self::OBSOLETE_BATCH => $this->getObsoleteMessages($domain), - self::NEW_BATCH => $this->getNewMessages($domain), - self::ALL_BATCH => $this->getMessages($domain), - default => throw new \InvalidArgumentException(\sprintf('$batch argument must be one of ["%s", "%s", "%s"].', self::ALL_BATCH, self::NEW_BATCH, self::OBSOLETE_BATCH)), - }; - if (!$messages || !$this->source->all($intlDomain) && $this->source->all($domain)) { - continue; - } - $result = $this->getResult(); - $allIntlMessages = $result->all($intlDomain); - $currentMessages = \array_diff_key($messages, $result->all($domain)); - $result->replace($currentMessages, $domain); - $result->replace($allIntlMessages + $messages, $intlDomain); - } - } - /** - * Performs operation on source and target catalogues for the given domain and - * stores the results. - * - * @param string $domain The domain which the operation will be performed for - * - * @return void - */ - protected abstract function processDomain(string $domain); -} diff --git a/dependencies/symfony/translation/Catalogue/MergeOperation.php b/dependencies/symfony/translation/Catalogue/MergeOperation.php deleted file mode 100644 index afc78cb..0000000 --- a/dependencies/symfony/translation/Catalogue/MergeOperation.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\MessageCatalogueInterface; -/** - * Merge operation between two catalogues as follows: - * all = source ∪ target = {x: x ∈ source ∨ x ∈ target} - * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} - * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅ - * Basically, the result contains messages from both catalogues. - * - * @author Jean-François Simon - */ -class MergeOperation extends \Symfony\Component\Translation\Catalogue\AbstractOperation -{ - /** - * @return void - */ - protected function processDomain(string $domain) - { - $this->messages[$domain] = ['all' => [], 'new' => [], 'obsolete' => []]; - $intlDomain = $domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - foreach ($this->target->getCatalogueMetadata('', $domain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $domain)) { - $this->result->setCatalogueMetadata($key, $value, $domain); - } - } - foreach ($this->target->getCatalogueMetadata('', $intlDomain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $intlDomain)) { - $this->result->setCatalogueMetadata($key, $value, $intlDomain); - } - } - foreach ($this->source->all($domain) as $id => $message) { - $this->messages[$domain]['all'][$id] = $message; - $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== ($keyMetadata = $this->source->getMetadata($id, $d))) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } - foreach ($this->target->all($domain) as $id => $message) { - if (!$this->source->has($id, $domain)) { - $this->messages[$domain]['all'][$id] = $message; - $this->messages[$domain]['new'][$id] = $message; - $d = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== ($keyMetadata = $this->target->getMetadata($id, $d))) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } - } - } -} diff --git a/dependencies/symfony/translation/Catalogue/OperationInterface.php b/dependencies/symfony/translation/Catalogue/OperationInterface.php deleted file mode 100644 index 16eead8..0000000 --- a/dependencies/symfony/translation/Catalogue/OperationInterface.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\MessageCatalogueInterface; -/** - * Represents an operation on catalogue(s). - * - * An instance of this interface performs an operation on one or more catalogues and - * stores intermediate and final results of the operation. - * - * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and - * the following results are stored: - * - * Messages: also called 'all', are valid messages for the given domain after the operation is performed. - * - * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}). - * - * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}). - * - * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'. - * - * @author Jean-François Simon - */ -interface OperationInterface -{ - /** - * Returns domains affected by operation. - */ - public function getDomains() : array; - /** - * Returns all valid messages ('all') after operation. - */ - public function getMessages(string $domain) : array; - /** - * Returns new messages ('new') after operation. - */ - public function getNewMessages(string $domain) : array; - /** - * Returns obsolete messages ('obsolete') after operation. - */ - public function getObsoleteMessages(string $domain) : array; - /** - * Returns resulting catalogue ('result'). - */ - public function getResult() : MessageCatalogueInterface; -} diff --git a/dependencies/symfony/translation/Catalogue/TargetOperation.php b/dependencies/symfony/translation/Catalogue/TargetOperation.php deleted file mode 100644 index 39bdc15..0000000 --- a/dependencies/symfony/translation/Catalogue/TargetOperation.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Catalogue; - -use Symfony\Component\Translation\MessageCatalogueInterface; -/** - * Target operation between two catalogues: - * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target} - * all = intersection ∪ (target ∖ intersection) = target - * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} - * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target} - * Basically, the result contains messages from the target catalogue. - * - * @author Michael Lee - */ -class TargetOperation extends \Symfony\Component\Translation\Catalogue\AbstractOperation -{ - /** - * @return void - */ - protected function processDomain(string $domain) - { - $this->messages[$domain] = ['all' => [], 'new' => [], 'obsolete' => []]; - $intlDomain = $domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - foreach ($this->target->getCatalogueMetadata('', $domain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $domain)) { - $this->result->setCatalogueMetadata($key, $value, $domain); - } - } - foreach ($this->target->getCatalogueMetadata('', $intlDomain) ?? [] as $key => $value) { - if (null === $this->result->getCatalogueMetadata($key, $intlDomain)) { - $this->result->setCatalogueMetadata($key, $value, $intlDomain); - } - } - // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``, - // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} - // - // For 'new' messages, the code can't be simplified as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));`` - // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback} - // - // For 'obsolete' messages, the code can't be simplified as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))`` - // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} - foreach ($this->source->all($domain) as $id => $message) { - if ($this->target->has($id, $domain)) { - $this->messages[$domain]['all'][$id] = $message; - $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== ($keyMetadata = $this->source->getMetadata($id, $d))) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } else { - $this->messages[$domain]['obsolete'][$id] = $message; - } - } - foreach ($this->target->all($domain) as $id => $message) { - if (!$this->source->has($id, $domain)) { - $this->messages[$domain]['all'][$id] = $message; - $this->messages[$domain]['new'][$id] = $message; - $d = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->result->add([$id => $message], $d); - if (null !== ($keyMetadata = $this->target->getMetadata($id, $d))) { - $this->result->setMetadata($id, $keyMetadata, $d); - } - } - } - } -} diff --git a/dependencies/symfony/translation/CatalogueMetadataAwareInterface.php b/dependencies/symfony/translation/CatalogueMetadataAwareInterface.php deleted file mode 100644 index 70dadc5..0000000 --- a/dependencies/symfony/translation/CatalogueMetadataAwareInterface.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -/** - * This interface is used to get, set, and delete metadata about the Catalogue. - * - * @author Hugo Alliaume - */ -interface CatalogueMetadataAwareInterface -{ - /** - * Gets catalogue metadata for the given domain and key. - * - * Passing an empty domain will return an array with all catalogue metadata indexed by - * domain and then by key. Passing an empty key will return an array with all - * catalogue metadata for the given domain. - * - * @return mixed The value that was set or an array with the domains/keys or null - */ - public function getCatalogueMetadata(string $key = '', string $domain = 'messages') : mixed; - /** - * Adds catalogue metadata to a message domain. - * - * @return void - */ - public function setCatalogueMetadata(string $key, mixed $value, string $domain = 'messages'); - /** - * Deletes catalogue metadata for the given key and domain. - * - * Passing an empty domain will delete all catalogue metadata. Passing an empty key will - * delete all metadata for the given domain. - * - * @return void - */ - public function deleteCatalogueMetadata(string $key = '', string $domain = 'messages'); -} diff --git a/dependencies/symfony/translation/Command/TranslationPullCommand.php b/dependencies/symfony/translation/Command/TranslationPullCommand.php deleted file mode 100644 index da63f5d..0000000 --- a/dependencies/symfony/translation/Command/TranslationPullCommand.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Command; - -use WP_Ultimo\Dependencies\Symfony\Component\Console\Attribute\AsCommand; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Command\Command; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Completion\CompletionInput; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Completion\CompletionSuggestions; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputArgument; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputOption; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Output\OutputInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Catalogue\TargetOperation; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\Provider\TranslationProviderCollection; -use Symfony\Component\Translation\Reader\TranslationReaderInterface; -use Symfony\Component\Translation\Writer\TranslationWriterInterface; -/** - * @author Mathieu Santostefano - */ -#[AsCommand(name: 'translation:pull', description: 'Pull translations from a given provider.')] -final class TranslationPullCommand extends Command -{ - use \Symfony\Component\Translation\Command\TranslationTrait; - private TranslationProviderCollection $providerCollection; - private TranslationWriterInterface $writer; - private TranslationReaderInterface $reader; - private string $defaultLocale; - private array $transPaths; - private array $enabledLocales; - public function __construct(TranslationProviderCollection $providerCollection, TranslationWriterInterface $writer, TranslationReaderInterface $reader, string $defaultLocale, array $transPaths = [], array $enabledLocales = []) - { - $this->providerCollection = $providerCollection; - $this->writer = $writer; - $this->reader = $reader; - $this->defaultLocale = $defaultLocale; - $this->transPaths = $transPaths; - $this->enabledLocales = $enabledLocales; - parent::__construct(); - } - public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void - { - if ($input->mustSuggestArgumentValuesFor('provider')) { - $suggestions->suggestValues($this->providerCollection->keys()); - return; - } - if ($input->mustSuggestOptionValuesFor('domains')) { - $provider = $this->providerCollection->get($input->getArgument('provider')); - if (\method_exists($provider, 'getDomains')) { - $suggestions->suggestValues($provider->getDomains()); - } - return; - } - if ($input->mustSuggestOptionValuesFor('locales')) { - $suggestions->suggestValues($this->enabledLocales); - return; - } - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues(['php', 'xlf', 'xlf12', 'xlf20', 'po', 'mo', 'yml', 'yaml', 'ts', 'csv', 'json', 'ini', 'res']); - } - } - protected function configure() : void - { - $keys = $this->providerCollection->keys(); - $defaultProvider = 1 === \count($keys) ? $keys[0] : null; - $this->setDefinition([new InputArgument('provider', null !== $defaultProvider ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The provider to pull translations from.', $defaultProvider), new InputOption('force', null, InputOption::VALUE_NONE, 'Override existing translations with provider ones (it will delete not synchronized messages).'), new InputOption('intl-icu', null, InputOption::VALUE_NONE, 'Associated to --force option, it will write messages in "%domain%+intl-icu.%locale%.xlf" files.'), new InputOption('domains', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the domains to pull.'), new InputOption('locales', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the locales to pull.'), new InputOption('format', null, InputOption::VALUE_OPTIONAL, 'Override the default output format.', 'xlf12')])->setHelp(<<<'EOF' -The %command.name% command pulls translations from the given provider. Only -new translations are pulled, existing ones are not overwritten. - -You can overwrite existing translations (and remove the missing ones on local side) by using the --force flag: - - php %command.full_name% --force provider - -Full example: - - php %command.full_name% provider --force --domains=messages --domains=validators --locales=en - -This command pulls all translations associated with the messages and validators domains for the en locale. -Local translations for the specified domains and locale are deleted if they're not present on the provider and overwritten if it's the case. -Local translations for others domains and locales are ignored. -EOF -); - } - protected function execute(InputInterface $input, OutputInterface $output) : int - { - $io = new SymfonyStyle($input, $output); - $provider = $this->providerCollection->get($input->getArgument('provider')); - $force = $input->getOption('force'); - $intlIcu = $input->getOption('intl-icu'); - $locales = $input->getOption('locales') ?: $this->enabledLocales; - $domains = $input->getOption('domains'); - $format = $input->getOption('format'); - $xliffVersion = '1.2'; - if ($intlIcu && !$force) { - $io->note('--intl-icu option only has an effect when used with --force. Here, it will be ignored.'); - } - switch ($format) { - case 'xlf20': - $xliffVersion = '2.0'; - // no break - case 'xlf12': - $format = 'xlf'; - } - $writeOptions = ['path' => \end($this->transPaths), 'xliff_version' => $xliffVersion, 'default_locale' => $this->defaultLocale]; - if (!$domains) { - $domains = $provider->getDomains(); - } - $providerTranslations = $provider->read($domains, $locales); - if ($force) { - foreach ($providerTranslations->getCatalogues() as $catalogue) { - $operation = new TargetOperation(new MessageCatalogue($catalogue->getLocale()), $catalogue); - if ($intlIcu) { - $operation->moveMessagesToIntlDomainsIfPossible(); - } - $this->writer->write($operation->getResult(), $format, $writeOptions); - } - $io->success(\sprintf('Local translations has been updated from "%s" (for "%s" locale(s), and "%s" domain(s)).', \parse_url($provider, \PHP_URL_SCHEME), \implode(', ', $locales), \implode(', ', $domains))); - return 0; - } - $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); - // Append pulled translations to local ones. - $localTranslations->addBag($providerTranslations->diff($localTranslations)); - foreach ($localTranslations->getCatalogues() as $catalogue) { - $this->writer->write($catalogue, $format, $writeOptions); - } - $io->success(\sprintf('New translations from "%s" has been written locally (for "%s" locale(s), and "%s" domain(s)).', \parse_url($provider, \PHP_URL_SCHEME), \implode(', ', $locales), \implode(', ', $domains))); - return 0; - } -} diff --git a/dependencies/symfony/translation/Command/TranslationPushCommand.php b/dependencies/symfony/translation/Command/TranslationPushCommand.php deleted file mode 100644 index 5dbb031..0000000 --- a/dependencies/symfony/translation/Command/TranslationPushCommand.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Command; - -use WP_Ultimo\Dependencies\Symfony\Component\Console\Attribute\AsCommand; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Command\Command; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Completion\CompletionInput; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Completion\CompletionSuggestions; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputArgument; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputOption; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Output\OutputInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Provider\FilteringProvider; -use Symfony\Component\Translation\Provider\TranslationProviderCollection; -use Symfony\Component\Translation\Reader\TranslationReaderInterface; -use Symfony\Component\Translation\TranslatorBag; -/** - * @author Mathieu Santostefano - */ -#[AsCommand(name: 'translation:push', description: 'Push translations to a given provider.')] -final class TranslationPushCommand extends Command -{ - use \Symfony\Component\Translation\Command\TranslationTrait; - private TranslationProviderCollection $providers; - private TranslationReaderInterface $reader; - private array $transPaths; - private array $enabledLocales; - public function __construct(TranslationProviderCollection $providers, TranslationReaderInterface $reader, array $transPaths = [], array $enabledLocales = []) - { - $this->providers = $providers; - $this->reader = $reader; - $this->transPaths = $transPaths; - $this->enabledLocales = $enabledLocales; - parent::__construct(); - } - public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void - { - if ($input->mustSuggestArgumentValuesFor('provider')) { - $suggestions->suggestValues($this->providers->keys()); - return; - } - if ($input->mustSuggestOptionValuesFor('domains')) { - $provider = $this->providers->get($input->getArgument('provider')); - if ($provider && \method_exists($provider, 'getDomains')) { - $domains = $provider->getDomains(); - $suggestions->suggestValues($domains); - } - return; - } - if ($input->mustSuggestOptionValuesFor('locales')) { - $suggestions->suggestValues($this->enabledLocales); - } - } - protected function configure() : void - { - $keys = $this->providers->keys(); - $defaultProvider = 1 === \count($keys) ? $keys[0] : null; - $this->setDefinition([new InputArgument('provider', null !== $defaultProvider ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The provider to push translations to.', $defaultProvider), new InputOption('force', null, InputOption::VALUE_NONE, 'Override existing translations with local ones (it will delete not synchronized messages).'), new InputOption('delete-missing', null, InputOption::VALUE_NONE, 'Delete translations available on provider but not locally.'), new InputOption('domains', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the domains to push.'), new InputOption('locales', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the locales to push.', $this->enabledLocales)])->setHelp(<<<'EOF' -The %command.name% command pushes translations to the given provider. Only new -translations are pushed, existing ones are not overwritten. - -You can overwrite existing translations by using the --force flag: - - php %command.full_name% --force provider - -You can delete provider translations which are not present locally by using the --delete-missing flag: - - php %command.full_name% --delete-missing provider - -Full example: - - php %command.full_name% provider --force --delete-missing --domains=messages --domains=validators --locales=en - -This command pushes all translations associated with the messages and validators domains for the en locale. -Provider translations for the specified domains and locale are deleted if they're not present locally and overwritten if it's the case. -Provider translations for others domains and locales are ignored. -EOF -); - } - protected function execute(InputInterface $input, OutputInterface $output) : int - { - $provider = $this->providers->get($input->getArgument('provider')); - if (!$this->enabledLocales) { - throw new InvalidArgumentException(\sprintf('You must define "framework.enabled_locales" or "framework.translator.providers.%s.locales" config key in order to work with translation providers.', \parse_url($provider, \PHP_URL_SCHEME))); - } - $io = new SymfonyStyle($input, $output); - $domains = $input->getOption('domains'); - $locales = $input->getOption('locales'); - $force = $input->getOption('force'); - $deleteMissing = $input->getOption('delete-missing'); - if (!$domains && $provider instanceof FilteringProvider) { - $domains = $provider->getDomains(); - } - // Reading local translations must be done after retrieving the domains from the provider - // in order to manage only translations from configured domains - $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); - if (!$domains) { - $domains = $this->getDomainsFromTranslatorBag($localTranslations); - } - if (!$deleteMissing && $force) { - $provider->write($localTranslations); - $io->success(\sprintf('All local translations has been sent to "%s" (for "%s" locale(s), and "%s" domain(s)).', \parse_url($provider, \PHP_URL_SCHEME), \implode(', ', $locales), \implode(', ', $domains))); - return 0; - } - $providerTranslations = $provider->read($domains, $locales); - if ($deleteMissing) { - $provider->delete($providerTranslations->diff($localTranslations)); - $io->success(\sprintf('Missing translations on "%s" has been deleted (for "%s" locale(s), and "%s" domain(s)).', \parse_url($provider, \PHP_URL_SCHEME), \implode(', ', $locales), \implode(', ', $domains))); - // Read provider translations again, after missing translations deletion, - // to avoid push freshly deleted translations. - $providerTranslations = $provider->read($domains, $locales); - } - $translationsToWrite = $localTranslations->diff($providerTranslations); - if ($force) { - $translationsToWrite->addBag($localTranslations->intersect($providerTranslations)); - } - $provider->write($translationsToWrite); - $io->success(\sprintf('%s local translations has been sent to "%s" (for "%s" locale(s), and "%s" domain(s)).', $force ? 'All' : 'New', \parse_url($provider, \PHP_URL_SCHEME), \implode(', ', $locales), \implode(', ', $domains))); - return 0; - } - private function getDomainsFromTranslatorBag(TranslatorBag $translatorBag) : array - { - $domains = []; - foreach ($translatorBag->getCatalogues() as $catalogue) { - $domains += $catalogue->getDomains(); - } - return \array_unique($domains); - } -} diff --git a/dependencies/symfony/translation/Command/TranslationTrait.php b/dependencies/symfony/translation/Command/TranslationTrait.php deleted file mode 100644 index 13ea13a..0000000 --- a/dependencies/symfony/translation/Command/TranslationTrait.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Command; - -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\MessageCatalogueInterface; -use Symfony\Component\Translation\TranslatorBag; -/** - * @internal - */ -trait TranslationTrait -{ - private function readLocalTranslations(array $locales, array $domains, array $transPaths) : TranslatorBag - { - $bag = new TranslatorBag(); - foreach ($locales as $locale) { - $catalogue = new MessageCatalogue($locale); - foreach ($transPaths as $path) { - $this->reader->read($path, $catalogue); - } - if ($domains) { - foreach ($domains as $domain) { - $bag->addCatalogue($this->filterCatalogue($catalogue, $domain)); - } - } else { - $bag->addCatalogue($catalogue); - } - } - return $bag; - } - private function filterCatalogue(MessageCatalogue $catalogue, string $domain) : MessageCatalogue - { - $filteredCatalogue = new MessageCatalogue($catalogue->getLocale()); - // extract intl-icu messages only - $intlDomain = $domain . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; - if ($intlMessages = $catalogue->all($intlDomain)) { - $filteredCatalogue->add($intlMessages, $intlDomain); - } - // extract all messages and subtract intl-icu messages - if ($messages = \array_diff($catalogue->all($domain), $intlMessages)) { - $filteredCatalogue->add($messages, $domain); - } - foreach ($catalogue->getResources() as $resource) { - $filteredCatalogue->addResource($resource); - } - if ($metadata = $catalogue->getMetadata('', $intlDomain)) { - foreach ($metadata as $k => $v) { - $filteredCatalogue->setMetadata($k, $v, $intlDomain); - } - } - if ($metadata = $catalogue->getMetadata('', $domain)) { - foreach ($metadata as $k => $v) { - $filteredCatalogue->setMetadata($k, $v, $domain); - } - } - return $filteredCatalogue; - } -} diff --git a/dependencies/symfony/translation/Command/XliffLintCommand.php b/dependencies/symfony/translation/Command/XliffLintCommand.php deleted file mode 100644 index 7eb7f20..0000000 --- a/dependencies/symfony/translation/Command/XliffLintCommand.php +++ /dev/null @@ -1,225 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Command; - -use WP_Ultimo\Dependencies\Symfony\Component\Console\Attribute\AsCommand; -use WP_Ultimo\Dependencies\Symfony\Component\Console\CI\GithubActionReporter; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Command\Command; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Completion\CompletionInput; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Completion\CompletionSuggestions; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Exception\RuntimeException; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputArgument; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Input\InputOption; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Output\OutputInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Util\XliffUtils; -/** - * Validates XLIFF files syntax and outputs encountered errors. - * - * @author Grégoire Pineau - * @author Robin Chalas - * @author Javier Eguiluz - */ -#[AsCommand(name: 'lint:xliff', description: 'Lint an XLIFF file and outputs encountered errors')] -class XliffLintCommand extends Command -{ - private string $format; - private bool $displayCorrectFiles; - private ?\Closure $directoryIteratorProvider; - private ?\Closure $isReadableProvider; - private bool $requireStrictFileNames; - public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null, bool $requireStrictFileNames = \true) - { - parent::__construct($name); - $this->directoryIteratorProvider = null === $directoryIteratorProvider ? null : $directoryIteratorProvider(...); - $this->isReadableProvider = null === $isReadableProvider ? null : $isReadableProvider(...); - $this->requireStrictFileNames = $requireStrictFileNames; - } - /** - * @return void - */ - protected function configure() - { - $this->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN')->addOption('format', null, InputOption::VALUE_REQUIRED, \sprintf('The output format ("%s")', \implode('", "', $this->getAvailableFormatOptions())))->setHelp(<<%command.name% command lints an XLIFF file and outputs to STDOUT -the first encountered syntax error. - -You can validates XLIFF contents passed from STDIN: - - cat filename | php %command.full_name% - - -You can also validate the syntax of a file: - - php %command.full_name% filename - -Or of a whole directory: - - php %command.full_name% dirname - php %command.full_name% dirname --format=json - -EOF -); - } - protected function execute(InputInterface $input, OutputInterface $output) : int - { - $io = new SymfonyStyle($input, $output); - $filenames = (array) $input->getArgument('filename'); - $this->format = $input->getOption('format') ?? (GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt'); - $this->displayCorrectFiles = $output->isVerbose(); - if (['-'] === $filenames) { - return $this->display($io, [$this->validate(\file_get_contents('php://stdin'))]); - } - if (!$filenames) { - throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); - } - $filesInfo = []; - foreach ($filenames as $filename) { - if (!$this->isReadable($filename)) { - throw new RuntimeException(\sprintf('File or directory "%s" is not readable.', $filename)); - } - foreach ($this->getFiles($filename) as $file) { - $filesInfo[] = $this->validate(\file_get_contents($file), $file); - } - } - return $this->display($io, $filesInfo); - } - private function validate(string $content, string $file = null) : array - { - $errors = []; - // Avoid: Warning DOMDocument::loadXML(): Empty string supplied as input - if ('' === \trim($content)) { - return ['file' => $file, 'valid' => \true]; - } - $internal = \libxml_use_internal_errors(\true); - $document = new \DOMDocument(); - $document->loadXML($content); - if (null !== ($targetLanguage = $this->getTargetLanguageFromFile($document))) { - $normalizedLocalePattern = \sprintf('(%s|%s)', \preg_quote($targetLanguage, '/'), \preg_quote(\str_replace('-', '_', $targetLanguage), '/')); - // strict file names require translation files to be named '____.locale.xlf' - // otherwise, both '____.locale.xlf' and 'locale.____.xlf' are allowed - // also, the regexp matching must be case-insensitive, as defined for 'target-language' values - // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#target-language - $expectedFilenamePattern = $this->requireStrictFileNames ? \sprintf('/^.*\\.(?i:%s)\\.(?:xlf|xliff)/', $normalizedLocalePattern) : \sprintf('/^(?:.*\\.(?i:%s)|(?i:%s)\\..*)\\.(?:xlf|xliff)/', $normalizedLocalePattern, $normalizedLocalePattern); - if (0 === \preg_match($expectedFilenamePattern, \basename($file))) { - $errors[] = ['line' => -1, 'column' => -1, 'message' => \sprintf('There is a mismatch between the language included in the file name ("%s") and the "%s" value used in the "target-language" attribute of the file.', \basename($file), $targetLanguage)]; - } - } - foreach (XliffUtils::validateSchema($document) as $xmlError) { - $errors[] = ['line' => $xmlError['line'], 'column' => $xmlError['column'], 'message' => $xmlError['message']]; - } - \libxml_clear_errors(); - \libxml_use_internal_errors($internal); - return ['file' => $file, 'valid' => 0 === \count($errors), 'messages' => $errors]; - } - private function display(SymfonyStyle $io, array $files) : int - { - return match ($this->format) { - 'txt' => $this->displayTxt($io, $files), - 'json' => $this->displayJson($io, $files), - 'github' => $this->displayTxt($io, $files, \true), - default => throw new InvalidArgumentException(\sprintf('Supported formats are "%s".', \implode('", "', $this->getAvailableFormatOptions()))), - }; - } - private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = \false) : int - { - $countFiles = \count($filesInfo); - $erroredFiles = 0; - $githubReporter = $errorAsGithubAnnotations ? new GithubActionReporter($io) : null; - foreach ($filesInfo as $info) { - if ($info['valid'] && $this->displayCorrectFiles) { - $io->comment('OK' . ($info['file'] ? \sprintf(' in %s', $info['file']) : '')); - } elseif (!$info['valid']) { - ++$erroredFiles; - $io->text(' ERROR ' . ($info['file'] ? \sprintf(' in %s', $info['file']) : '')); - $io->listing(\array_map(function ($error) use($info, $githubReporter) { - // general document errors have a '-1' line number - $line = -1 === $error['line'] ? null : $error['line']; - $githubReporter?->error($error['message'], $info['file'], $line, null !== $line ? $error['column'] : null); - return null === $line ? $error['message'] : \sprintf('Line %d, Column %d: %s', $line, $error['column'], $error['message']); - }, $info['messages'])); - } - } - if (0 === $erroredFiles) { - $io->success(\sprintf('All %d XLIFF files contain valid syntax.', $countFiles)); - } else { - $io->warning(\sprintf('%d XLIFF files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles)); - } - return \min($erroredFiles, 1); - } - private function displayJson(SymfonyStyle $io, array $filesInfo) : int - { - $errors = 0; - \array_walk($filesInfo, function (&$v) use(&$errors) { - $v['file'] = (string) $v['file']; - if (!$v['valid']) { - ++$errors; - } - }); - $io->writeln(\json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); - return \min($errors, 1); - } - /** - * @return iterable<\SplFileInfo> - */ - private function getFiles(string $fileOrDirectory) : iterable - { - if (\is_file($fileOrDirectory)) { - (yield new \SplFileInfo($fileOrDirectory)); - return; - } - foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) { - if (!\in_array($file->getExtension(), ['xlf', 'xliff'])) { - continue; - } - (yield $file); - } - } - /** - * @return iterable<\SplFileInfo> - */ - private function getDirectoryIterator(string $directory) : iterable - { - $default = fn($directory) => new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), \RecursiveIteratorIterator::LEAVES_ONLY); - if (null !== $this->directoryIteratorProvider) { - return ($this->directoryIteratorProvider)($directory, $default); - } - return $default($directory); - } - private function isReadable(string $fileOrDirectory) : bool - { - $default = fn($fileOrDirectory) => \is_readable($fileOrDirectory); - if (null !== $this->isReadableProvider) { - return ($this->isReadableProvider)($fileOrDirectory, $default); - } - return $default($fileOrDirectory); - } - private function getTargetLanguageFromFile(\DOMDocument $xliffContents) : ?string - { - foreach ($xliffContents->getElementsByTagName('file')[0]->attributes ?? [] as $attribute) { - if ('target-language' === $attribute->nodeName) { - return $attribute->nodeValue; - } - } - return null; - } - public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void - { - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues($this->getAvailableFormatOptions()); - } - } - private function getAvailableFormatOptions() : array - { - return ['txt', 'json', 'github']; - } -} diff --git a/dependencies/symfony/translation/DataCollector/TranslationDataCollector.php b/dependencies/symfony/translation/DataCollector/TranslationDataCollector.php deleted file mode 100644 index 96e6195..0000000 --- a/dependencies/symfony/translation/DataCollector/TranslationDataCollector.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\DataCollector; - -use WP_Ultimo\Dependencies\Symfony\Component\HttpFoundation\Request; -use WP_Ultimo\Dependencies\Symfony\Component\HttpFoundation\Response; -use WP_Ultimo\Dependencies\Symfony\Component\HttpKernel\DataCollector\DataCollector; -use WP_Ultimo\Dependencies\Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; -use Symfony\Component\Translation\DataCollectorTranslator; -use WP_Ultimo\Dependencies\Symfony\Component\VarDumper\Cloner\Data; -/** - * @author Abdellatif Ait boudad - * - * @final - */ -class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface -{ - private DataCollectorTranslator $translator; - public function __construct(DataCollectorTranslator $translator) - { - $this->translator = $translator; - } - public function lateCollect() : void - { - $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages()); - $this->data += $this->computeCount($messages); - $this->data['messages'] = $messages; - $this->data = $this->cloneVar($this->data); - } - public function collect(Request $request, Response $response, \Throwable $exception = null) : void - { - $this->data['locale'] = $this->translator->getLocale(); - $this->data['fallback_locales'] = $this->translator->getFallbackLocales(); - } - public function reset() : void - { - $this->data = []; - } - public function getMessages() : array|Data - { - return $this->data['messages'] ?? []; - } - public function getCountMissings() : int - { - return $this->data[DataCollectorTranslator::MESSAGE_MISSING] ?? 0; - } - public function getCountFallbacks() : int - { - return $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] ?? 0; - } - public function getCountDefines() : int - { - return $this->data[DataCollectorTranslator::MESSAGE_DEFINED] ?? 0; - } - public function getLocale() - { - return !empty($this->data['locale']) ? $this->data['locale'] : null; - } - /** - * @internal - */ - public function getFallbackLocales() - { - return isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0 ? $this->data['fallback_locales'] : []; - } - public function getName() : string - { - return 'translation'; - } - private function sanitizeCollectedMessages(array $messages) : array - { - $result = []; - foreach ($messages as $key => $message) { - $messageId = $message['locale'] . $message['domain'] . $message['id']; - if (!isset($result[$messageId])) { - $message['count'] = 1; - $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : []; - $messages[$key]['translation'] = $this->sanitizeString($message['translation']); - $result[$messageId] = $message; - } else { - if (!empty($message['parameters'])) { - $result[$messageId]['parameters'][] = $message['parameters']; - } - ++$result[$messageId]['count']; - } - unset($messages[$key]); - } - return $result; - } - private function computeCount(array $messages) : array - { - $count = [DataCollectorTranslator::MESSAGE_DEFINED => 0, DataCollectorTranslator::MESSAGE_MISSING => 0, DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0]; - foreach ($messages as $message) { - ++$count[$message['state']]; - } - return $count; - } - private function sanitizeString(string $string, int $length = 80) : string - { - $string = \trim(\preg_replace('/\\s+/', ' ', $string)); - if (\false !== ($encoding = \mb_detect_encoding($string, null, \true))) { - if (\mb_strlen($string, $encoding) > $length) { - return \mb_substr($string, 0, $length - 3, $encoding) . '...'; - } - } elseif (\strlen($string) > $length) { - return \substr($string, 0, $length - 3) . '...'; - } - return $string; - } -} diff --git a/dependencies/symfony/translation/DataCollectorTranslator.php b/dependencies/symfony/translation/DataCollectorTranslator.php deleted file mode 100644 index 5ad4bee..0000000 --- a/dependencies/symfony/translation/DataCollectorTranslator.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\LocaleAwareInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -/** - * @author Abdellatif Ait boudad - */ -class DataCollectorTranslator implements TranslatorInterface, \Symfony\Component\Translation\TranslatorBagInterface, LocaleAwareInterface, WarmableInterface -{ - public const MESSAGE_DEFINED = 0; - public const MESSAGE_MISSING = 1; - public const MESSAGE_EQUALS_FALLBACK = 2; - private TranslatorInterface $translator; - private array $messages = []; - /** - * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator - */ - public function __construct(TranslatorInterface $translator) - { - if (!$translator instanceof \Symfony\Component\Translation\TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { - throw new InvalidArgumentException(\sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_debug_type($translator))); - } - $this->translator = $translator; - } - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) : string - { - $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); - $this->collectMessage($locale, $domain, $id, $trans, $parameters); - return $trans; - } - /** - * @return void - */ - public function setLocale(string $locale) - { - $this->translator->setLocale($locale); - } - public function getLocale() : string - { - return $this->translator->getLocale(); - } - public function getCatalogue(string $locale = null) : \Symfony\Component\Translation\MessageCatalogueInterface - { - return $this->translator->getCatalogue($locale); - } - public function getCatalogues() : array - { - return $this->translator->getCatalogues(); - } - /** - * @return string[] - */ - public function warmUp(string $cacheDir) : array - { - if ($this->translator instanceof WarmableInterface) { - return (array) $this->translator->warmUp($cacheDir); - } - return []; - } - /** - * Gets the fallback locales. - */ - public function getFallbackLocales() : array - { - if ($this->translator instanceof \Symfony\Component\Translation\Translator || \method_exists($this->translator, 'getFallbackLocales')) { - return $this->translator->getFallbackLocales(); - } - return []; - } - /** - * Passes through all unknown calls onto the translator object. - */ - public function __call(string $method, array $args) - { - return $this->translator->{$method}(...$args); - } - public function getCollectedMessages() : array - { - return $this->messages; - } - private function collectMessage(?string $locale, ?string $domain, string $id, string $translation, ?array $parameters = []) : void - { - $domain ??= 'messages'; - $catalogue = $this->translator->getCatalogue($locale); - $locale = $catalogue->getLocale(); - $fallbackLocale = null; - if ($catalogue->defines($id, $domain)) { - $state = self::MESSAGE_DEFINED; - } elseif ($catalogue->has($id, $domain)) { - $state = self::MESSAGE_EQUALS_FALLBACK; - $fallbackCatalogue = $catalogue->getFallbackCatalogue(); - while ($fallbackCatalogue) { - if ($fallbackCatalogue->defines($id, $domain)) { - $fallbackLocale = $fallbackCatalogue->getLocale(); - break; - } - $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); - } - } else { - $state = self::MESSAGE_MISSING; - } - $this->messages[] = ['locale' => $locale, 'fallbackLocale' => $fallbackLocale, 'domain' => $domain, 'id' => $id, 'translation' => $translation, 'parameters' => $parameters, 'state' => $state, 'transChoiceNumber' => isset($parameters['%count%']) && \is_numeric($parameters['%count%']) ? $parameters['%count%'] : null]; - } -} diff --git a/dependencies/symfony/translation/DependencyInjection/TranslationDumperPass.php b/dependencies/symfony/translation/DependencyInjection/TranslationDumperPass.php deleted file mode 100644 index fac5120..0000000 --- a/dependencies/symfony/translation/DependencyInjection/TranslationDumperPass.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -/** - * Adds tagged translation.formatter services to translation writer. - */ -class TranslationDumperPass implements CompilerPassInterface -{ - /** - * @return void - */ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition('translation.writer')) { - return; - } - $definition = $container->getDefinition('translation.writer'); - foreach ($container->findTaggedServiceIds('translation.dumper', \true) as $id => $attributes) { - $definition->addMethodCall('addDumper', [$attributes[0]['alias'], new Reference($id)]); - } - } -} diff --git a/dependencies/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/dependencies/symfony/translation/DependencyInjection/TranslationExtractorPass.php deleted file mode 100644 index b89210c..0000000 --- a/dependencies/symfony/translation/DependencyInjection/TranslationExtractorPass.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Exception\RuntimeException; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -/** - * Adds tagged translation.extractor services to translation extractor. - */ -class TranslationExtractorPass implements CompilerPassInterface -{ - /** - * @return void - */ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition('translation.extractor')) { - return; - } - $definition = $container->getDefinition('translation.extractor'); - foreach ($container->findTaggedServiceIds('translation.extractor', \true) as $id => $attributes) { - if (!isset($attributes[0]['alias'])) { - throw new RuntimeException(\sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id)); - } - $definition->addMethodCall('addExtractor', [$attributes[0]['alias'], new Reference($id)]); - } - } -} diff --git a/dependencies/symfony/translation/DependencyInjection/TranslatorPass.php b/dependencies/symfony/translation/DependencyInjection/TranslatorPass.php deleted file mode 100644 index 5ff99dc..0000000 --- a/dependencies/symfony/translation/DependencyInjection/TranslatorPass.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -class TranslatorPass implements CompilerPassInterface -{ - /** - * @return void - */ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition('translator.default')) { - return; - } - $loaders = []; - $loaderRefs = []; - foreach ($container->findTaggedServiceIds('translation.loader', \true) as $id => $attributes) { - $loaderRefs[$id] = new Reference($id); - $loaders[$id][] = $attributes[0]['alias']; - if (isset($attributes[0]['legacy-alias'])) { - $loaders[$id][] = $attributes[0]['legacy-alias']; - } - } - if ($container->hasDefinition('translation.reader')) { - $definition = $container->getDefinition('translation.reader'); - foreach ($loaders as $id => $formats) { - foreach ($formats as $format) { - $definition->addMethodCall('addLoader', [$format, $loaderRefs[$id]]); - } - } - } - $container->findDefinition('translator.default')->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs))->replaceArgument(3, $loaders); - if ($container->hasDefinition('validator') && $container->hasDefinition('translation.extractor.visitor.constraint')) { - $constraintVisitorDefinition = $container->getDefinition('translation.extractor.visitor.constraint'); - $constraintClassNames = []; - foreach ($container->getDefinitions() as $definition) { - if (!$definition->hasTag('validator.constraint_validator')) { - continue; - } - // Resolve constraint validator FQCN even if defined as %foo.validator.class% parameter - $className = $container->getParameterBag()->resolveValue($definition->getClass()); - // Extraction of the constraint class name from the Constraint Validator FQCN - $constraintClassNames[] = \str_replace('Validator', '', \substr(\strrchr($className, '\\'), 1)); - } - $constraintVisitorDefinition->setArgument(0, $constraintClassNames); - } - if (!$container->hasParameter('twig.default_path')) { - return; - } - $paths = \array_keys($container->getDefinition('twig.template_iterator')->getArgument(1)); - if ($container->hasDefinition('console.command.translation_debug')) { - $definition = $container->getDefinition('console.command.translation_debug'); - $definition->replaceArgument(4, $container->getParameter('twig.default_path')); - if (\count($definition->getArguments()) > 6) { - $definition->replaceArgument(6, $paths); - } - } - if ($container->hasDefinition('console.command.translation_extract')) { - $definition = $container->getDefinition('console.command.translation_extract'); - $definition->replaceArgument(5, $container->getParameter('twig.default_path')); - if (\count($definition->getArguments()) > 7) { - $definition->replaceArgument(7, $paths); - } - } - } -} diff --git a/dependencies/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/dependencies/symfony/translation/DependencyInjection/TranslatorPathsPass.php deleted file mode 100644 index ccf23e4..0000000 --- a/dependencies/symfony/translation/DependencyInjection/TranslatorPathsPass.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\DependencyInjection; - -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ContainerBuilder; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Definition; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\Reference; -use WP_Ultimo\Dependencies\Symfony\Component\DependencyInjection\ServiceLocator; -use WP_Ultimo\Dependencies\Symfony\Component\HttpKernel\Controller\ArgumentResolver\TraceableValueResolver; -/** - * @author Yonel Ceruto - */ -class TranslatorPathsPass extends AbstractRecursivePass -{ - private int $level = 0; - /** - * @var array - */ - private array $paths = []; - /** - * @var array - */ - private array $definitions = []; - /** - * @var array> - */ - private array $controllers = []; - /** - * @return void - */ - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition('translator')) { - return; - } - foreach ($this->findControllerArguments($container) as $controller => $argument) { - $id = \substr($controller, 0, \strpos($controller, ':') ?: \strlen($controller)); - if ($container->hasDefinition($id)) { - [$locatorRef] = $argument->getValues(); - $this->controllers[(string) $locatorRef][$container->getDefinition($id)->getClass()] = \true; - } - } - try { - parent::process($container); - $paths = []; - foreach ($this->paths as $class => $_) { - if (($r = $container->getReflectionClass($class)) && !$r->isInterface()) { - $paths[] = $r->getFileName(); - foreach ($r->getTraits() as $trait) { - $paths[] = $trait->getFileName(); - } - } - } - if ($paths) { - if ($container->hasDefinition('console.command.translation_debug')) { - $definition = $container->getDefinition('console.command.translation_debug'); - $definition->replaceArgument(6, \array_merge($definition->getArgument(6), $paths)); - } - if ($container->hasDefinition('console.command.translation_extract')) { - $definition = $container->getDefinition('console.command.translation_extract'); - $definition->replaceArgument(7, \array_merge($definition->getArgument(7), $paths)); - } - } - } finally { - $this->level = 0; - $this->paths = []; - $this->definitions = []; - } - } - protected function processValue(mixed $value, bool $isRoot = \false) : mixed - { - if ($value instanceof Reference) { - if ('translator' === (string) $value) { - for ($i = $this->level - 1; $i >= 0; --$i) { - $class = $this->definitions[$i]->getClass(); - if (ServiceLocator::class === $class) { - if (!isset($this->controllers[$this->currentId])) { - continue; - } - foreach ($this->controllers[$this->currentId] as $class => $_) { - $this->paths[$class] = \true; - } - } else { - $this->paths[$class] = \true; - } - break; - } - } - return $value; - } - if ($value instanceof Definition) { - $this->definitions[$this->level++] = $value; - $value = parent::processValue($value, $isRoot); - unset($this->definitions[--$this->level]); - return $value; - } - return parent::processValue($value, $isRoot); - } - private function findControllerArguments(ContainerBuilder $container) : array - { - if (!$container->has('argument_resolver.service')) { - return []; - } - $resolverDef = $container->findDefinition('argument_resolver.service'); - if (TraceableValueResolver::class === $resolverDef->getClass()) { - $resolverDef = $container->getDefinition($resolverDef->getArgument(0)); - } - $argument = $resolverDef->getArgument(0); - if ($argument instanceof Reference) { - $argument = $container->getDefinition($argument); - } - return $argument->getArgument(0); - } -} diff --git a/dependencies/symfony/translation/Dumper/CsvFileDumper.php b/dependencies/symfony/translation/Dumper/CsvFileDumper.php deleted file mode 100644 index 7403b86..0000000 --- a/dependencies/symfony/translation/Dumper/CsvFileDumper.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * CsvFileDumper generates a csv formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class CsvFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - private string $delimiter = ';'; - private string $enclosure = '"'; - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $handle = \fopen('php://memory', 'r+'); - foreach ($messages->all($domain) as $source => $target) { - \fputcsv($handle, [$source, $target], $this->delimiter, $this->enclosure); - } - \rewind($handle); - $output = \stream_get_contents($handle); - \fclose($handle); - return $output; - } - /** - * Sets the delimiter and escape character for CSV. - * - * @return void - */ - public function setCsvControl(string $delimiter = ';', string $enclosure = '"') - { - $this->delimiter = $delimiter; - $this->enclosure = $enclosure; - } - protected function getExtension() : string - { - return 'csv'; - } -} diff --git a/dependencies/symfony/translation/Dumper/DumperInterface.php b/dependencies/symfony/translation/Dumper/DumperInterface.php deleted file mode 100644 index 9b87936..0000000 --- a/dependencies/symfony/translation/Dumper/DumperInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * DumperInterface is the interface implemented by all translation dumpers. - * There is no common option. - * - * @author Michel Salib - */ -interface DumperInterface -{ - /** - * Dumps the message catalogue. - * - * @param array $options Options that are used by the dumper - * - * @return void - */ - public function dump(MessageCatalogue $messages, array $options = []); -} diff --git a/dependencies/symfony/translation/Dumper/FileDumper.php b/dependencies/symfony/translation/Dumper/FileDumper.php deleted file mode 100644 index 8f45bea..0000000 --- a/dependencies/symfony/translation/Dumper/FileDumper.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s). - * - * Options: - * - path (mandatory): the directory where the files should be saved - * - * @author Michel Salib - */ -abstract class FileDumper implements \Symfony\Component\Translation\Dumper\DumperInterface -{ - /** - * A template for the relative paths to files. - * - * @var string - */ - protected $relativePathTemplate = '%domain%.%locale%.%extension%'; - /** - * Sets the template for the relative paths to files. - * - * @param string $relativePathTemplate A template for the relative paths to files - * - * @return void - */ - public function setRelativePathTemplate(string $relativePathTemplate) - { - $this->relativePathTemplate = $relativePathTemplate; - } - /** - * @return void - */ - public function dump(MessageCatalogue $messages, array $options = []) - { - if (!\array_key_exists('path', $options)) { - throw new InvalidArgumentException('The file dumper needs a path option.'); - } - // save a file for each domain - foreach ($messages->getDomains() as $domain) { - $fullpath = $options['path'] . '/' . $this->getRelativePath($domain, $messages->getLocale()); - if (!\file_exists($fullpath)) { - $directory = \dirname($fullpath); - if (!\file_exists($directory) && !@\mkdir($directory, 0777, \true)) { - throw new RuntimeException(\sprintf('Unable to create directory "%s".', $directory)); - } - } - $intlDomain = $domain . MessageCatalogue::INTL_DOMAIN_SUFFIX; - $intlMessages = $messages->all($intlDomain); - if ($intlMessages) { - $intlPath = $options['path'] . '/' . $this->getRelativePath($intlDomain, $messages->getLocale()); - \file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options)); - $messages->replace([], $intlDomain); - try { - if ($messages->all($domain)) { - \file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); - } - continue; - } finally { - $messages->replace($intlMessages, $intlDomain); - } - } - \file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); - } - } - /** - * Transforms a domain of a message catalogue to its string representation. - */ - public abstract function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string; - /** - * Gets the file extension of the dumper. - */ - protected abstract function getExtension() : string; - /** - * Gets the relative file path using the template. - */ - private function getRelativePath(string $domain, string $locale) : string - { - return \strtr($this->relativePathTemplate, ['%domain%' => $domain, '%locale%' => $locale, '%extension%' => $this->getExtension()]); - } -} diff --git a/dependencies/symfony/translation/Dumper/IcuResFileDumper.php b/dependencies/symfony/translation/Dumper/IcuResFileDumper.php deleted file mode 100644 index d1d15ae..0000000 --- a/dependencies/symfony/translation/Dumper/IcuResFileDumper.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class IcuResFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - protected $relativePathTemplate = '%domain%/%locale%.%extension%'; - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $data = $indexes = $resources = ''; - foreach ($messages->all($domain) as $source => $target) { - $indexes .= \pack('v', \strlen($data) + 28); - $data .= $source . "\x00"; - } - $data .= $this->writePadding($data); - $keyTop = $this->getPosition($data); - foreach ($messages->all($domain) as $source => $target) { - $resources .= \pack('V', $this->getPosition($data)); - $data .= \pack('V', \strlen($target)) . \mb_convert_encoding($target . "\x00", 'UTF-16LE', 'UTF-8') . $this->writePadding($data); - } - $resOffset = $this->getPosition($data); - $data .= \pack('v', \count($messages->all($domain))) . $indexes . $this->writePadding($data) . $resources; - $bundleTop = $this->getPosition($data); - $root = \pack( - 'V7', - $resOffset + (2 << 28), - // Resource Offset + Resource Type - 6, - // Index length - $keyTop, - // Index keys top - $bundleTop, - // Index resources top - $bundleTop, - // Index bundle top - \count($messages->all($domain)), - // Index max table length - 0 - ); - $header = \pack( - 'vC2v4C12@32', - 32, - // Header size - 0xda, - 0x27, - // Magic number 1 and 2 - 20, - 0, - 0, - 2, - // Rest of the header, ..., Size of a char - 0x52, - 0x65, - 0x73, - 0x42, - // Data format identifier - 1, - 2, - 0, - 0, - // Data version - 1, - 4, - 0, - 0 - ); - return $header . $root . $data; - } - private function writePadding(string $data) : ?string - { - $padding = \strlen($data) % 4; - return $padding ? \str_repeat("\xaa", 4 - $padding) : null; - } - private function getPosition(string $data) : float|int - { - return (\strlen($data) + 28) / 4; - } - protected function getExtension() : string - { - return 'res'; - } -} diff --git a/dependencies/symfony/translation/Dumper/IniFileDumper.php b/dependencies/symfony/translation/Dumper/IniFileDumper.php deleted file mode 100644 index 1f37b87..0000000 --- a/dependencies/symfony/translation/Dumper/IniFileDumper.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * IniFileDumper generates an ini formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class IniFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $output = ''; - foreach ($messages->all($domain) as $source => $target) { - $escapeTarget = \str_replace('"', '\\"', $target); - $output .= $source . '="' . $escapeTarget . "\"\n"; - } - return $output; - } - protected function getExtension() : string - { - return 'ini'; - } -} diff --git a/dependencies/symfony/translation/Dumper/JsonFileDumper.php b/dependencies/symfony/translation/Dumper/JsonFileDumper.php deleted file mode 100644 index 3397190..0000000 --- a/dependencies/symfony/translation/Dumper/JsonFileDumper.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * JsonFileDumper generates an json formatted string representation of a message catalogue. - * - * @author singles - */ -class JsonFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $flags = $options['json_encoding'] ?? \JSON_PRETTY_PRINT; - return \json_encode($messages->all($domain), $flags); - } - protected function getExtension() : string - { - return 'json'; - } -} diff --git a/dependencies/symfony/translation/Dumper/MoFileDumper.php b/dependencies/symfony/translation/Dumper/MoFileDumper.php deleted file mode 100644 index 986414d..0000000 --- a/dependencies/symfony/translation/Dumper/MoFileDumper.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Loader\MoFileLoader; -use Symfony\Component\Translation\MessageCatalogue; -/** - * MoFileDumper generates a gettext formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class MoFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $sources = $targets = $sourceOffsets = $targetOffsets = ''; - $offsets = []; - $size = 0; - foreach ($messages->all($domain) as $source => $target) { - $offsets[] = \array_map('strlen', [$sources, $source, $targets, $target]); - $sources .= "\x00" . $source; - $targets .= "\x00" . $target; - ++$size; - } - $header = ['magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC, 'formatRevision' => 0, 'count' => $size, 'offsetId' => MoFileLoader::MO_HEADER_SIZE, 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + 8 * $size, 'sizeHashes' => 0, 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + 16 * $size]; - $sourcesSize = \strlen($sources); - $sourcesStart = $header['offsetHashes'] + 1; - foreach ($offsets as $offset) { - $sourceOffsets .= $this->writeLong($offset[1]) . $this->writeLong($offset[0] + $sourcesStart); - $targetOffsets .= $this->writeLong($offset[3]) . $this->writeLong($offset[2] + $sourcesStart + $sourcesSize); - } - $output = \implode('', \array_map($this->writeLong(...), $header)) . $sourceOffsets . $targetOffsets . $sources . $targets; - return $output; - } - protected function getExtension() : string - { - return 'mo'; - } - private function writeLong(mixed $str) : string - { - return \pack('V*', $str); - } -} diff --git a/dependencies/symfony/translation/Dumper/PhpFileDumper.php b/dependencies/symfony/translation/Dumper/PhpFileDumper.php deleted file mode 100644 index 691d0d3..0000000 --- a/dependencies/symfony/translation/Dumper/PhpFileDumper.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * PhpFileDumper generates PHP files from a message catalogue. - * - * @author Michel Salib - */ -class PhpFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - return "all($domain), \true) . ";\n"; - } - protected function getExtension() : string - { - return 'php'; - } -} diff --git a/dependencies/symfony/translation/Dumper/PoFileDumper.php b/dependencies/symfony/translation/Dumper/PoFileDumper.php deleted file mode 100644 index 0b08e71..0000000 --- a/dependencies/symfony/translation/Dumper/PoFileDumper.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * PoFileDumper generates a gettext formatted string representation of a message catalogue. - * - * @author Stealth35 - */ -class PoFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $output = 'msgid ""' . "\n"; - $output .= 'msgstr ""' . "\n"; - $output .= '"Content-Type: text/plain; charset=UTF-8\\n"' . "\n"; - $output .= '"Content-Transfer-Encoding: 8bit\\n"' . "\n"; - $output .= '"Language: ' . $messages->getLocale() . '\\n"' . "\n"; - $output .= "\n"; - $newLine = \false; - foreach ($messages->all($domain) as $source => $target) { - if ($newLine) { - $output .= "\n"; - } else { - $newLine = \true; - } - $metadata = $messages->getMetadata($source, $domain); - if (isset($metadata['comments'])) { - $output .= $this->formatComments($metadata['comments']); - } - if (isset($metadata['flags'])) { - $output .= $this->formatComments(\implode(',', (array) $metadata['flags']), ','); - } - if (isset($metadata['sources'])) { - $output .= $this->formatComments(\implode(' ', (array) $metadata['sources']), ':'); - } - $sourceRules = $this->getStandardRules($source); - $targetRules = $this->getStandardRules($target); - if (2 == \count($sourceRules) && [] !== $targetRules) { - $output .= \sprintf('msgid "%s"' . "\n", $this->escape($sourceRules[0])); - $output .= \sprintf('msgid_plural "%s"' . "\n", $this->escape($sourceRules[1])); - foreach ($targetRules as $i => $targetRule) { - $output .= \sprintf('msgstr[%d] "%s"' . "\n", $i, $this->escape($targetRule)); - } - } else { - $output .= \sprintf('msgid "%s"' . "\n", $this->escape($source)); - $output .= \sprintf('msgstr "%s"' . "\n", $this->escape($target)); - } - } - return $output; - } - private function getStandardRules(string $id) : array - { - // Partly copied from TranslatorTrait::trans. - $parts = []; - if (\preg_match('/^\\|++$/', $id)) { - $parts = \explode('|', $id); - } elseif (\preg_match_all('/(?:\\|\\||[^\\|])++/', $id, $matches)) { - $parts = $matches[0]; - } - $intervalRegexp = <<<'EOF' -/^(?P - ({\s* - (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) - \s*}) - - | - - (?P[\[\]]) - \s* - (?P-Inf|\-?\d+(\.\d+)?) - \s*,\s* - (?P\+?Inf|\-?\d+(\.\d+)?) - \s* - (?P[\[\]]) -)\s*(?P.*?)$/xs -EOF; - $standardRules = []; - foreach ($parts as $part) { - $part = \trim(\str_replace('||', '|', $part)); - if (\preg_match($intervalRegexp, $part)) { - // Explicit rule is not a standard rule. - return []; - } else { - $standardRules[] = $part; - } - } - return $standardRules; - } - protected function getExtension() : string - { - return 'po'; - } - private function escape(string $str) : string - { - return \addcslashes($str, "\x00..\x1f\"\\"); - } - private function formatComments(string|array $comments, string $prefix = '') : ?string - { - $output = null; - foreach ((array) $comments as $comment) { - $output .= \sprintf('#%s %s' . "\n", $prefix, $comment); - } - return $output; - } -} diff --git a/dependencies/symfony/translation/Dumper/QtFileDumper.php b/dependencies/symfony/translation/Dumper/QtFileDumper.php deleted file mode 100644 index 61096c0..0000000 --- a/dependencies/symfony/translation/Dumper/QtFileDumper.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * QtFileDumper generates ts files from a message catalogue. - * - * @author Benjamin Eberlei - */ -class QtFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $dom = new \DOMDocument('1.0', 'utf-8'); - $dom->formatOutput = \true; - $ts = $dom->appendChild($dom->createElement('TS')); - $context = $ts->appendChild($dom->createElement('context')); - $context->appendChild($dom->createElement('name', $domain)); - foreach ($messages->all($domain) as $source => $target) { - $message = $context->appendChild($dom->createElement('message')); - $metadata = $messages->getMetadata($source, $domain); - if (isset($metadata['sources'])) { - foreach ((array) $metadata['sources'] as $location) { - $loc = \explode(':', $location, 2); - $location = $message->appendChild($dom->createElement('location')); - $location->setAttribute('filename', $loc[0]); - if (isset($loc[1])) { - $location->setAttribute('line', $loc[1]); - } - } - } - $message->appendChild($dom->createElement('source', $source)); - $message->appendChild($dom->createElement('translation', $target)); - } - return $dom->saveXML(); - } - protected function getExtension() : string - { - return 'ts'; - } -} diff --git a/dependencies/symfony/translation/Dumper/XliffFileDumper.php b/dependencies/symfony/translation/Dumper/XliffFileDumper.php deleted file mode 100644 index 7fac081..0000000 --- a/dependencies/symfony/translation/Dumper/XliffFileDumper.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * XliffFileDumper generates xliff files from a message catalogue. - * - * @author Michel Salib - */ -class XliffFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - public function __construct(private string $extension = 'xlf') - { - } - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - $xliffVersion = '1.2'; - if (\array_key_exists('xliff_version', $options)) { - $xliffVersion = $options['xliff_version']; - } - if (\array_key_exists('default_locale', $options)) { - $defaultLocale = $options['default_locale']; - } else { - $defaultLocale = \Locale::getDefault(); - } - if ('1.2' === $xliffVersion) { - return $this->dumpXliff1($defaultLocale, $messages, $domain, $options); - } - if ('2.0' === $xliffVersion) { - return $this->dumpXliff2($defaultLocale, $messages, $domain); - } - throw new InvalidArgumentException(\sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion)); - } - protected function getExtension() : string - { - return $this->extension; - } - private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?string $domain, array $options = []) : string - { - $toolInfo = ['tool-id' => 'symfony', 'tool-name' => 'Symfony']; - if (\array_key_exists('tool_info', $options)) { - $toolInfo = \array_merge($toolInfo, $options['tool_info']); - } - $dom = new \DOMDocument('1.0', 'utf-8'); - $dom->formatOutput = \true; - $xliff = $dom->appendChild($dom->createElement('xliff')); - $xliff->setAttribute('version', '1.2'); - $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); - $xliffFile = $xliff->appendChild($dom->createElement('file')); - $xliffFile->setAttribute('source-language', \str_replace('_', '-', $defaultLocale)); - $xliffFile->setAttribute('target-language', \str_replace('_', '-', $messages->getLocale())); - $xliffFile->setAttribute('datatype', 'plaintext'); - $xliffFile->setAttribute('original', 'file.ext'); - $xliffHead = $xliffFile->appendChild($dom->createElement('header')); - $xliffTool = $xliffHead->appendChild($dom->createElement('tool')); - foreach ($toolInfo as $id => $value) { - $xliffTool->setAttribute($id, $value); - } - if ($catalogueMetadata = $messages->getCatalogueMetadata('', $domain) ?? []) { - $xliffPropGroup = $xliffHead->appendChild($dom->createElement('prop-group')); - foreach ($catalogueMetadata as $key => $value) { - $xliffProp = $xliffPropGroup->appendChild($dom->createElement('prop')); - $xliffProp->setAttribute('prop-type', $key); - $xliffProp->appendChild($dom->createTextNode($value)); - } - } - $xliffBody = $xliffFile->appendChild($dom->createElement('body')); - foreach ($messages->all($domain) as $source => $target) { - $translation = $dom->createElement('trans-unit'); - $translation->setAttribute('id', \strtr(\substr(\base64_encode(\hash('sha256', $source, \true)), 0, 7), '/+', '._')); - $translation->setAttribute('resname', $source); - $s = $translation->appendChild($dom->createElement('source')); - $s->appendChild($dom->createTextNode($source)); - // Does the target contain characters requiring a CDATA section? - $text = 1 === \preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); - $targetElement = $dom->createElement('target'); - $metadata = $messages->getMetadata($source, $domain); - if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { - foreach ($metadata['target-attributes'] as $name => $value) { - $targetElement->setAttribute($name, $value); - } - } - $t = $translation->appendChild($targetElement); - $t->appendChild($text); - if ($this->hasMetadataArrayInfo('notes', $metadata)) { - foreach ($metadata['notes'] as $note) { - if (!isset($note['content'])) { - continue; - } - $n = $translation->appendChild($dom->createElement('note')); - $n->appendChild($dom->createTextNode($note['content'])); - if (isset($note['priority'])) { - $n->setAttribute('priority', $note['priority']); - } - if (isset($note['from'])) { - $n->setAttribute('from', $note['from']); - } - } - } - $xliffBody->appendChild($translation); - } - return $dom->saveXML(); - } - private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?string $domain) : string - { - $dom = new \DOMDocument('1.0', 'utf-8'); - $dom->formatOutput = \true; - $xliff = $dom->appendChild($dom->createElement('xliff')); - $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0'); - $xliff->setAttribute('version', '2.0'); - $xliff->setAttribute('srcLang', \str_replace('_', '-', $defaultLocale)); - $xliff->setAttribute('trgLang', \str_replace('_', '-', $messages->getLocale())); - $xliffFile = $xliff->appendChild($dom->createElement('file')); - if (\str_ends_with($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX)) { - $xliffFile->setAttribute('id', \substr($domain, 0, -\strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX)) . '.' . $messages->getLocale()); - } else { - $xliffFile->setAttribute('id', $domain . '.' . $messages->getLocale()); - } - if ($catalogueMetadata = $messages->getCatalogueMetadata('', $domain) ?? []) { - $xliff->setAttribute('xmlns:m', 'urn:oasis:names:tc:xliff:metadata:2.0'); - $xliffMetadata = $xliffFile->appendChild($dom->createElement('m:metadata')); - foreach ($catalogueMetadata as $key => $value) { - $xliffMeta = $xliffMetadata->appendChild($dom->createElement('prop')); - $xliffMeta->setAttribute('type', $key); - $xliffMeta->appendChild($dom->createTextNode($value)); - } - } - foreach ($messages->all($domain) as $source => $target) { - $translation = $dom->createElement('unit'); - $translation->setAttribute('id', \strtr(\substr(\base64_encode(\hash('sha256', $source, \true)), 0, 7), '/+', '._')); - if (\strlen($source) <= 80) { - $translation->setAttribute('name', $source); - } - $metadata = $messages->getMetadata($source, $domain); - // Add notes section - if ($this->hasMetadataArrayInfo('notes', $metadata)) { - $notesElement = $dom->createElement('notes'); - foreach ($metadata['notes'] as $note) { - $n = $dom->createElement('note'); - $n->appendChild($dom->createTextNode($note['content'] ?? '')); - unset($note['content']); - foreach ($note as $name => $value) { - $n->setAttribute($name, $value); - } - $notesElement->appendChild($n); - } - $translation->appendChild($notesElement); - } - $segment = $translation->appendChild($dom->createElement('segment')); - $s = $segment->appendChild($dom->createElement('source')); - $s->appendChild($dom->createTextNode($source)); - // Does the target contain characters requiring a CDATA section? - $text = 1 === \preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); - $targetElement = $dom->createElement('target'); - if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { - foreach ($metadata['target-attributes'] as $name => $value) { - $targetElement->setAttribute($name, $value); - } - } - $t = $segment->appendChild($targetElement); - $t->appendChild($text); - $xliffFile->appendChild($translation); - } - return $dom->saveXML(); - } - private function hasMetadataArrayInfo(string $key, array $metadata = null) : bool - { - return \is_iterable($metadata[$key] ?? null); - } -} diff --git a/dependencies/symfony/translation/Dumper/YamlFileDumper.php b/dependencies/symfony/translation/Dumper/YamlFileDumper.php deleted file mode 100644 index cc4425f..0000000 --- a/dependencies/symfony/translation/Dumper/YamlFileDumper.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Dumper; - -use Symfony\Component\Translation\Exception\LogicException; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\Util\ArrayConverter; -use WP_Ultimo\Dependencies\Symfony\Component\Yaml\Yaml; -/** - * YamlFileDumper generates yaml files from a message catalogue. - * - * @author Michel Salib - */ -class YamlFileDumper extends \Symfony\Component\Translation\Dumper\FileDumper -{ - private string $extension; - public function __construct(string $extension = 'yml') - { - $this->extension = $extension; - } - public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []) : string - { - if (!\class_exists(Yaml::class)) { - throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.'); - } - $data = $messages->all($domain); - if (isset($options['as_tree']) && $options['as_tree']) { - $data = ArrayConverter::expandToTree($data); - } - if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) { - return Yaml::dump($data, $inline); - } - return Yaml::dump($data); - } - protected function getExtension() : string - { - return $this->extension; - } -} diff --git a/dependencies/symfony/translation/Exception/ExceptionInterface.php b/dependencies/symfony/translation/Exception/ExceptionInterface.php deleted file mode 100644 index 2a9dfc6..0000000 --- a/dependencies/symfony/translation/Exception/ExceptionInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * Exception interface for all exceptions thrown by the component. - * - * @author Fabien Potencier - */ -interface ExceptionInterface extends \Throwable -{ -} diff --git a/dependencies/symfony/translation/Exception/IncompleteDsnException.php b/dependencies/symfony/translation/Exception/IncompleteDsnException.php deleted file mode 100644 index 0204874..0000000 --- a/dependencies/symfony/translation/Exception/IncompleteDsnException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -class IncompleteDsnException extends \Symfony\Component\Translation\Exception\InvalidArgumentException -{ - public function __construct(string $message, string $dsn = null, \Throwable $previous = null) - { - if ($dsn) { - $message = \sprintf('Invalid "%s" provider DSN: ', $dsn) . $message; - } - parent::__construct($message, 0, $previous); - } -} diff --git a/dependencies/symfony/translation/Exception/InvalidArgumentException.php b/dependencies/symfony/translation/Exception/InvalidArgumentException.php deleted file mode 100644 index 2690464..0000000 --- a/dependencies/symfony/translation/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * Base InvalidArgumentException for the Translation component. - * - * @author Abdellatif Ait boudad - */ -class InvalidArgumentException extends \InvalidArgumentException implements \Symfony\Component\Translation\Exception\ExceptionInterface -{ -} diff --git a/dependencies/symfony/translation/Exception/InvalidResourceException.php b/dependencies/symfony/translation/Exception/InvalidResourceException.php deleted file mode 100644 index 5397c48..0000000 --- a/dependencies/symfony/translation/Exception/InvalidResourceException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * Thrown when a resource cannot be loaded. - * - * @author Fabien Potencier - */ -class InvalidResourceException extends \InvalidArgumentException implements \Symfony\Component\Translation\Exception\ExceptionInterface -{ -} diff --git a/dependencies/symfony/translation/Exception/LogicException.php b/dependencies/symfony/translation/Exception/LogicException.php deleted file mode 100644 index 4466db5..0000000 --- a/dependencies/symfony/translation/Exception/LogicException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * Base LogicException for Translation component. - * - * @author Abdellatif Ait boudad - */ -class LogicException extends \LogicException implements \Symfony\Component\Translation\Exception\ExceptionInterface -{ -} diff --git a/dependencies/symfony/translation/Exception/MissingRequiredOptionException.php b/dependencies/symfony/translation/Exception/MissingRequiredOptionException.php deleted file mode 100644 index 7ccb958..0000000 --- a/dependencies/symfony/translation/Exception/MissingRequiredOptionException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * @author Oskar Stark - */ -class MissingRequiredOptionException extends \Symfony\Component\Translation\Exception\IncompleteDsnException -{ - public function __construct(string $option, string $dsn = null, \Throwable $previous = null) - { - $message = \sprintf('The option "%s" is required but missing.', $option); - parent::__construct($message, $dsn, $previous); - } -} diff --git a/dependencies/symfony/translation/Exception/NotFoundResourceException.php b/dependencies/symfony/translation/Exception/NotFoundResourceException.php deleted file mode 100644 index a357c31..0000000 --- a/dependencies/symfony/translation/Exception/NotFoundResourceException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * Thrown when a resource does not exist. - * - * @author Fabien Potencier - */ -class NotFoundResourceException extends \InvalidArgumentException implements \Symfony\Component\Translation\Exception\ExceptionInterface -{ -} diff --git a/dependencies/symfony/translation/Exception/ProviderException.php b/dependencies/symfony/translation/Exception/ProviderException.php deleted file mode 100644 index 11df20d..0000000 --- a/dependencies/symfony/translation/Exception/ProviderException.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -use WP_Ultimo\Dependencies\Symfony\Contracts\HttpClient\ResponseInterface; -/** - * @author Fabien Potencier - */ -class ProviderException extends \Symfony\Component\Translation\Exception\RuntimeException implements \Symfony\Component\Translation\Exception\ProviderExceptionInterface -{ - private ResponseInterface $response; - private string $debug; - public function __construct(string $message, ResponseInterface $response, int $code = 0, \Exception $previous = null) - { - $this->response = $response; - $this->debug = $response->getInfo('debug') ?? ''; - parent::__construct($message, $code, $previous); - } - public function getResponse() : ResponseInterface - { - return $this->response; - } - public function getDebug() : string - { - return $this->debug; - } -} diff --git a/dependencies/symfony/translation/Exception/ProviderExceptionInterface.php b/dependencies/symfony/translation/Exception/ProviderExceptionInterface.php deleted file mode 100644 index c6f3e5e..0000000 --- a/dependencies/symfony/translation/Exception/ProviderExceptionInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * @author Fabien Potencier - */ -interface ProviderExceptionInterface extends \Symfony\Component\Translation\Exception\ExceptionInterface -{ - /* - * Returns debug info coming from the Symfony\Contracts\HttpClient\ResponseInterface - */ - public function getDebug() : string; -} diff --git a/dependencies/symfony/translation/Exception/RuntimeException.php b/dependencies/symfony/translation/Exception/RuntimeException.php deleted file mode 100644 index dac31ea..0000000 --- a/dependencies/symfony/translation/Exception/RuntimeException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -/** - * Base RuntimeException for the Translation component. - * - * @author Abdellatif Ait boudad - */ -class RuntimeException extends \RuntimeException implements \Symfony\Component\Translation\Exception\ExceptionInterface -{ -} diff --git a/dependencies/symfony/translation/Exception/UnsupportedSchemeException.php b/dependencies/symfony/translation/Exception/UnsupportedSchemeException.php deleted file mode 100644 index ab6e0a3..0000000 --- a/dependencies/symfony/translation/Exception/UnsupportedSchemeException.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Exception; - -use Symfony\Component\Translation\Bridge; -use Symfony\Component\Translation\Provider\Dsn; -class UnsupportedSchemeException extends \Symfony\Component\Translation\Exception\LogicException -{ - private const SCHEME_TO_PACKAGE_MAP = ['crowdin' => ['class' => Bridge\Crowdin\CrowdinProviderFactory::class, 'package' => 'symfony/crowdin-translation-provider'], 'loco' => ['class' => Bridge\Loco\LocoProviderFactory::class, 'package' => 'symfony/loco-translation-provider'], 'lokalise' => ['class' => Bridge\Lokalise\LokaliseProviderFactory::class, 'package' => 'symfony/lokalise-translation-provider']]; - public function __construct(Dsn $dsn, string $name = null, array $supported = []) - { - $provider = $dsn->getScheme(); - if (\false !== ($pos = \strpos($provider, '+'))) { - $provider = \substr($provider, 0, $pos); - } - $package = self::SCHEME_TO_PACKAGE_MAP[$provider] ?? null; - if ($package && !\class_exists($package['class'])) { - parent::__construct(\sprintf('Unable to synchronize translations via "%s" as the provider is not installed. Try running "composer require %s".', $provider, $package['package'])); - return; - } - $message = \sprintf('The "%s" scheme is not supported', $dsn->getScheme()); - if ($name && $supported) { - $message .= \sprintf('; supported schemes for translation provider "%s" are: "%s"', $name, \implode('", "', $supported)); - } - parent::__construct($message . '.'); - } -} diff --git a/dependencies/symfony/translation/Extractor/AbstractFileExtractor.php b/dependencies/symfony/translation/Extractor/AbstractFileExtractor.php deleted file mode 100644 index 49187ae..0000000 --- a/dependencies/symfony/translation/Extractor/AbstractFileExtractor.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -/** - * Base class used by classes that extract translation messages from files. - * - * @author Marcos D. Sánchez - */ -abstract class AbstractFileExtractor -{ - protected function extractFiles(string|iterable $resource) : iterable - { - if (\is_iterable($resource)) { - $files = []; - foreach ($resource as $file) { - if ($this->canBeExtracted($file)) { - $files[] = $this->toSplFileInfo($file); - } - } - } elseif (\is_file($resource)) { - $files = $this->canBeExtracted($resource) ? [$this->toSplFileInfo($resource)] : []; - } else { - $files = $this->extractFromDirectory($resource); - } - return $files; - } - private function toSplFileInfo(string $file) : \SplFileInfo - { - return new \SplFileInfo($file); - } - /** - * @throws InvalidArgumentException - */ - protected function isFile(string $file) : bool - { - if (!\is_file($file)) { - throw new InvalidArgumentException(\sprintf('The "%s" file does not exist.', $file)); - } - return \true; - } - /** - * @return bool - */ - protected abstract function canBeExtracted(string $file); - /** - * @return iterable - */ - protected abstract function extractFromDirectory(string|array $resource); -} diff --git a/dependencies/symfony/translation/Extractor/ChainExtractor.php b/dependencies/symfony/translation/Extractor/ChainExtractor.php deleted file mode 100644 index 75a2eac..0000000 --- a/dependencies/symfony/translation/Extractor/ChainExtractor.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * ChainExtractor extracts translation messages from template files. - * - * @author Michel Salib - */ -class ChainExtractor implements \Symfony\Component\Translation\Extractor\ExtractorInterface -{ - /** - * The extractors. - * - * @var ExtractorInterface[] - */ - private array $extractors = []; - /** - * Adds a loader to the translation extractor. - * - * @return void - */ - public function addExtractor(string $format, \Symfony\Component\Translation\Extractor\ExtractorInterface $extractor) - { - $this->extractors[$format] = $extractor; - } - /** - * @return void - */ - public function setPrefix(string $prefix) - { - foreach ($this->extractors as $extractor) { - $extractor->setPrefix($prefix); - } - } - /** - * @return void - */ - public function extract(string|iterable $directory, MessageCatalogue $catalogue) - { - foreach ($this->extractors as $extractor) { - $extractor->extract($directory, $catalogue); - } - } -} diff --git a/dependencies/symfony/translation/Extractor/ExtractorInterface.php b/dependencies/symfony/translation/Extractor/ExtractorInterface.php deleted file mode 100644 index 4d15eaf..0000000 --- a/dependencies/symfony/translation/Extractor/ExtractorInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * Extracts translation messages from a directory or files to the catalogue. - * New found messages are injected to the catalogue using the prefix. - * - * @author Michel Salib - */ -interface ExtractorInterface -{ - /** - * Extracts translation messages from files, a file or a directory to the catalogue. - * - * @param string|iterable $resource Files, a file or a directory - * - * @return void - */ - public function extract(string|iterable $resource, MessageCatalogue $catalogue); - /** - * Sets the prefix that should be used for new found messages. - * - * @return void - */ - public function setPrefix(string $prefix); -} diff --git a/dependencies/symfony/translation/Extractor/PhpAstExtractor.php b/dependencies/symfony/translation/Extractor/PhpAstExtractor.php deleted file mode 100644 index bd1d46b..0000000 --- a/dependencies/symfony/translation/Extractor/PhpAstExtractor.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor; - -use WP_Ultimo\Dependencies\PhpParser\NodeTraverser; -use WP_Ultimo\Dependencies\PhpParser\NodeVisitor; -use WP_Ultimo\Dependencies\PhpParser\Parser; -use WP_Ultimo\Dependencies\PhpParser\ParserFactory; -use WP_Ultimo\Dependencies\Symfony\Component\Finder\Finder; -use Symfony\Component\Translation\Extractor\Visitor\AbstractVisitor; -use Symfony\Component\Translation\MessageCatalogue; -/** - * PhpAstExtractor extracts translation messages from a PHP AST. - * - * @author Mathieu Santostefano - */ -final class PhpAstExtractor extends \Symfony\Component\Translation\Extractor\AbstractFileExtractor implements \Symfony\Component\Translation\Extractor\ExtractorInterface -{ - private Parser $parser; - public function __construct( - /** - * @param iterable $visitors - */ - private readonly iterable $visitors, - private string $prefix = '' - ) - { - if (!\class_exists(ParserFactory::class)) { - throw new \LogicException(\sprintf('You cannot use "%s" as the "nikic/php-parser" package is not installed. Try running "composer require nikic/php-parser".', static::class)); - } - $this->parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); - } - public function extract(iterable|string $resource, MessageCatalogue $catalogue) : void - { - foreach ($this->extractFiles($resource) as $file) { - $traverser = new NodeTraverser(); - /** @var AbstractVisitor&NodeVisitor $visitor */ - foreach ($this->visitors as $visitor) { - $visitor->initialize($catalogue, $file, $this->prefix); - $traverser->addVisitor($visitor); - } - $nodes = $this->parser->parse(\file_get_contents($file)); - $traverser->traverse($nodes); - } - } - public function setPrefix(string $prefix) : void - { - $this->prefix = $prefix; - } - protected function canBeExtracted(string $file) : bool - { - return 'php' === \pathinfo($file, \PATHINFO_EXTENSION) && $this->isFile($file) && \preg_match('/\\bt\\(|->trans\\(|TranslatableMessage|Symfony\\\\Component\\\\Validator\\\\Constraints/i', \file_get_contents($file)); - } - protected function extractFromDirectory(array|string $resource) : iterable|Finder - { - if (!\class_exists(Finder::class)) { - throw new \LogicException(\sprintf('You cannot use "%s" as the "symfony/finder" package is not installed. Try running "composer require symfony/finder".', static::class)); - } - return (new Finder())->files()->name('*.php')->in($resource); - } -} diff --git a/dependencies/symfony/translation/Extractor/PhpExtractor.php b/dependencies/symfony/translation/Extractor/PhpExtractor.php deleted file mode 100644 index fd50c63..0000000 --- a/dependencies/symfony/translation/Extractor/PhpExtractor.php +++ /dev/null @@ -1,207 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor; - -trigger_deprecation('symfony/translation', '6.2', '"%s" is deprecated, use "%s" instead.', \Symfony\Component\Translation\Extractor\PhpExtractor::class, \Symfony\Component\Translation\Extractor\PhpAstExtractor::class); -use WP_Ultimo\Dependencies\Symfony\Component\Finder\Finder; -use Symfony\Component\Translation\MessageCatalogue; -/** - * PhpExtractor extracts translation messages from a PHP template. - * - * @author Michel Salib - * - * @deprecated since Symfony 6.2, use the PhpAstExtractor instead - */ -class PhpExtractor extends \Symfony\Component\Translation\Extractor\AbstractFileExtractor implements \Symfony\Component\Translation\Extractor\ExtractorInterface -{ - public const MESSAGE_TOKEN = 300; - public const METHOD_ARGUMENTS_TOKEN = 1000; - public const DOMAIN_TOKEN = 1001; - /** - * Prefix for new found message. - */ - private string $prefix = ''; - /** - * The sequence that captures translation messages. - */ - protected $sequences = [['->', 'trans', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['->', 'trans', '(', self::MESSAGE_TOKEN], ['new', 'TranslatableMessage', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['new', 'TranslatableMessage', '(', self::MESSAGE_TOKEN], ['new', '\\', 'Symfony', '\\', 'Component', '\\', 'Translation', '\\', 'TranslatableMessage', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['new', '\\Symfony\\Component\\Translation\\TranslatableMessage', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['new', '\\', 'Symfony', '\\', 'Component', '\\', 'Translation', '\\', 'TranslatableMessage', '(', self::MESSAGE_TOKEN], ['new', '\\Symfony\\Component\\Translation\\TranslatableMessage', '(', self::MESSAGE_TOKEN], ['t', '(', self::MESSAGE_TOKEN, ',', self::METHOD_ARGUMENTS_TOKEN, ',', self::DOMAIN_TOKEN], ['t', '(', self::MESSAGE_TOKEN]]; - /** - * @return void - */ - public function extract(string|iterable $resource, MessageCatalogue $catalog) - { - $files = $this->extractFiles($resource); - foreach ($files as $file) { - $this->parseTokens(\token_get_all(\file_get_contents($file)), $catalog, $file); - \gc_mem_caches(); - } - } - /** - * @return void - */ - public function setPrefix(string $prefix) - { - $this->prefix = $prefix; - } - /** - * Normalizes a token. - */ - protected function normalizeToken(mixed $token) : ?string - { - if (isset($token[1]) && 'b"' !== $token) { - return $token[1]; - } - return $token; - } - /** - * Seeks to a non-whitespace token. - */ - private function seekToNextRelevantToken(\Iterator $tokenIterator) : void - { - for (; $tokenIterator->valid(); $tokenIterator->next()) { - $t = $tokenIterator->current(); - if (\T_WHITESPACE !== $t[0]) { - break; - } - } - } - private function skipMethodArgument(\Iterator $tokenIterator) : void - { - $openBraces = 0; - for (; $tokenIterator->valid(); $tokenIterator->next()) { - $t = $tokenIterator->current(); - if ('[' === $t[0] || '(' === $t[0]) { - ++$openBraces; - } - if (']' === $t[0] || ')' === $t[0]) { - --$openBraces; - } - if (0 === $openBraces && ',' === $t[0] || -1 === $openBraces && ')' === $t[0]) { - break; - } - } - } - /** - * Extracts the message from the iterator while the tokens - * match allowed message tokens. - */ - private function getValue(\Iterator $tokenIterator) : string - { - $message = ''; - $docToken = ''; - $docPart = ''; - for (; $tokenIterator->valid(); $tokenIterator->next()) { - $t = $tokenIterator->current(); - if ('.' === $t) { - // Concatenate with next token - continue; - } - if (!isset($t[1])) { - break; - } - switch ($t[0]) { - case \T_START_HEREDOC: - $docToken = $t[1]; - break; - case \T_ENCAPSED_AND_WHITESPACE: - case \T_CONSTANT_ENCAPSED_STRING: - if ('' === $docToken) { - $message .= \Symfony\Component\Translation\Extractor\PhpStringTokenParser::parse($t[1]); - } else { - $docPart = $t[1]; - } - break; - case \T_END_HEREDOC: - if ($indentation = \strspn($t[1], ' ')) { - $docPartWithLineBreaks = $docPart; - $docPart = ''; - foreach (\preg_split('~(\\r\\n|\\n|\\r)~', $docPartWithLineBreaks, -1, \PREG_SPLIT_DELIM_CAPTURE) as $str) { - if (\in_array($str, ["\r\n", "\n", "\r"], \true)) { - $docPart .= $str; - } else { - $docPart .= \substr($str, $indentation); - } - } - } - $message .= \Symfony\Component\Translation\Extractor\PhpStringTokenParser::parseDocString($docToken, $docPart); - $docToken = ''; - $docPart = ''; - break; - case \T_WHITESPACE: - break; - default: - break 2; - } - } - return $message; - } - /** - * Extracts trans message from PHP tokens. - * - * @return void - */ - protected function parseTokens(array $tokens, MessageCatalogue $catalog, string $filename) - { - $tokenIterator = new \ArrayIterator($tokens); - for ($key = 0; $key < $tokenIterator->count(); ++$key) { - foreach ($this->sequences as $sequence) { - $message = ''; - $domain = 'messages'; - $tokenIterator->seek($key); - foreach ($sequence as $sequenceKey => $item) { - $this->seekToNextRelevantToken($tokenIterator); - if ($this->normalizeToken($tokenIterator->current()) === $item) { - $tokenIterator->next(); - continue; - } elseif (self::MESSAGE_TOKEN === $item) { - $message = $this->getValue($tokenIterator); - if (\count($sequence) === $sequenceKey + 1) { - break; - } - } elseif (self::METHOD_ARGUMENTS_TOKEN === $item) { - $this->skipMethodArgument($tokenIterator); - } elseif (self::DOMAIN_TOKEN === $item) { - $domainToken = $this->getValue($tokenIterator); - if ('' !== $domainToken) { - $domain = $domainToken; - } - break; - } else { - break; - } - } - if ($message) { - $catalog->set($message, $this->prefix . $message, $domain); - $metadata = $catalog->getMetadata($message, $domain) ?? []; - $normalizedFilename = \preg_replace('{[\\\\/]+}', '/', $filename); - $metadata['sources'][] = $normalizedFilename . ':' . $tokens[$key][2]; - $catalog->setMetadata($message, $metadata, $domain); - break; - } - } - } - } - /** - * @throws \InvalidArgumentException - */ - protected function canBeExtracted(string $file) : bool - { - return $this->isFile($file) && 'php' === \pathinfo($file, \PATHINFO_EXTENSION); - } - protected function extractFromDirectory(string|array $directory) : iterable - { - if (!\class_exists(Finder::class)) { - throw new \LogicException(\sprintf('You cannot use "%s" as the "symfony/finder" package is not installed. Try running "composer require symfony/finder".', static::class)); - } - $finder = new Finder(); - return $finder->files()->name('*.php')->in($directory); - } -} diff --git a/dependencies/symfony/translation/Extractor/PhpStringTokenParser.php b/dependencies/symfony/translation/Extractor/PhpStringTokenParser.php deleted file mode 100644 index 03e322b..0000000 --- a/dependencies/symfony/translation/Extractor/PhpStringTokenParser.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor; - -trigger_deprecation('symfony/translation', '6.2', '"%s" is deprecated.', \Symfony\Component\Translation\Extractor\PhpStringTokenParser::class); -/* - * The following is derived from code at http://github.com/nikic/PHP-Parser - * - * Copyright (c) 2011 by Nikita Popov - * - * Some rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * * The names of the contributors may not be used to endorse or - * promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/** - * @deprecated since Symfony 6.2 - */ -class PhpStringTokenParser -{ - protected static $replacements = ['\\' => '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; - /** - * Parses a string token. - * - * @param string $str String token content - */ - public static function parse(string $str) : string - { - $bLength = 0; - if ('b' === $str[0]) { - $bLength = 1; - } - if ('\'' === $str[$bLength]) { - return \str_replace(['\\\\', '\\\''], ['\\', '\''], \substr($str, $bLength + 1, -1)); - } else { - return self::parseEscapeSequences(\substr($str, $bLength + 1, -1), '"'); - } - } - /** - * Parses escape sequences in strings (all string types apart from single quoted). - * - * @param string $str String without quotes - * @param string|null $quote Quote type - */ - public static function parseEscapeSequences(string $str, string $quote = null) : string - { - if (null !== $quote) { - $str = \str_replace('\\' . $quote, $quote, $str); - } - return \preg_replace_callback('~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~', [__CLASS__, 'parseCallback'], $str); - } - private static function parseCallback(array $matches) : string - { - $str = $matches[1]; - if (isset(self::$replacements[$str])) { - return self::$replacements[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { - return \chr(\hexdec($str)); - } else { - return \chr(\octdec($str)); - } - } - /** - * Parses a constant doc string. - * - * @param string $startToken Doc string start token content (<< - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor\Visitor; - -use WP_Ultimo\Dependencies\PhpParser\Node; -use Symfony\Component\Translation\MessageCatalogue; -/** - * @author Mathieu Santostefano - */ -abstract class AbstractVisitor -{ - private MessageCatalogue $catalogue; - private \SplFileInfo $file; - private string $messagePrefix; - public function initialize(MessageCatalogue $catalogue, \SplFileInfo $file, string $messagePrefix) : void - { - $this->catalogue = $catalogue; - $this->file = $file; - $this->messagePrefix = $messagePrefix; - } - protected function addMessageToCatalogue(string $message, ?string $domain, int $line) : void - { - $domain ??= 'messages'; - $this->catalogue->set($message, $this->messagePrefix . $message, $domain); - $metadata = $this->catalogue->getMetadata($message, $domain) ?? []; - $normalizedFilename = \preg_replace('{[\\\\/]+}', '/', $this->file); - $metadata['sources'][] = $normalizedFilename . ':' . $line; - $this->catalogue->setMetadata($message, $metadata, $domain); - } - protected function getStringArguments(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node, int|string $index, bool $indexIsRegex = \false) : array - { - if (\is_string($index)) { - return $this->getStringNamedArguments($node, $index, $indexIsRegex); - } - $args = $node instanceof Node\Expr\CallLike ? $node->getRawArgs() : $node->args; - if (!($arg = $args[$index] ?? null) instanceof Node\Arg) { - return []; - } - return (array) $this->getStringValue($arg->value); - } - protected function hasNodeNamedArguments(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node) : bool - { - $args = $node instanceof Node\Expr\CallLike ? $node->getRawArgs() : $node->args; - foreach ($args as $arg) { - if ($arg instanceof Node\Arg && null !== $arg->name) { - return \true; - } - } - return \false; - } - protected function nodeFirstNamedArgumentIndex(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node) : int - { - $args = $node instanceof Node\Expr\CallLike ? $node->getRawArgs() : $node->args; - foreach ($args as $i => $arg) { - if ($arg instanceof Node\Arg && null !== $arg->name) { - return $i; - } - } - return \PHP_INT_MAX; - } - private function getStringNamedArguments(Node\Expr\CallLike|Node\Attribute $node, string $argumentName = null, bool $isArgumentNamePattern = \false) : array - { - $args = $node instanceof Node\Expr\CallLike ? $node->getArgs() : $node->args; - $argumentValues = []; - foreach ($args as $arg) { - if (!$isArgumentNamePattern && $arg->name?->toString() === $argumentName) { - $argumentValues[] = $this->getStringValue($arg->value); - } elseif ($isArgumentNamePattern && \preg_match($argumentName, $arg->name?->toString() ?? '') > 0) { - $argumentValues[] = $this->getStringValue($arg->value); - } - } - return \array_filter($argumentValues); - } - private function getStringValue(Node $node) : ?string - { - if ($node instanceof Node\Scalar\String_) { - return $node->value; - } - if ($node instanceof Node\Expr\BinaryOp\Concat) { - if (null === ($left = $this->getStringValue($node->left))) { - return null; - } - if (null === ($right = $this->getStringValue($node->right))) { - return null; - } - return $left . $right; - } - if ($node instanceof Node\Expr\Assign && $node->expr instanceof Node\Scalar\String_) { - return $node->expr->value; - } - return null; - } -} diff --git a/dependencies/symfony/translation/Extractor/Visitor/ConstraintVisitor.php b/dependencies/symfony/translation/Extractor/Visitor/ConstraintVisitor.php deleted file mode 100644 index 70275a5..0000000 --- a/dependencies/symfony/translation/Extractor/Visitor/ConstraintVisitor.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor\Visitor; - -use WP_Ultimo\Dependencies\PhpParser\Node; -use WP_Ultimo\Dependencies\PhpParser\NodeVisitor; -/** - * @author Mathieu Santostefano - * - * Code mostly comes from https://github.com/php-translation/extractor/blob/master/src/Visitor/Php/Symfony/Constraint.php - */ -final class ConstraintVisitor extends \Symfony\Component\Translation\Extractor\Visitor\AbstractVisitor implements NodeVisitor -{ - public function __construct(private readonly array $constraintClassNames = []) - { - } - public function beforeTraverse(array $nodes) : ?Node - { - return null; - } - public function enterNode(Node $node) : ?Node - { - if (!$node instanceof Node\Expr\New_ && !$node instanceof Node\Attribute) { - return null; - } - $className = $node instanceof Node\Attribute ? $node->name : $node->class; - if (!$className instanceof Node\Name) { - return null; - } - $parts = $className->parts; - $isConstraintClass = \false; - foreach ($parts as $part) { - if (\in_array($part, $this->constraintClassNames, \true)) { - $isConstraintClass = \true; - break; - } - } - if (!$isConstraintClass) { - return null; - } - $arg = $node->args[0] ?? null; - if (!$arg instanceof Node\Arg) { - return null; - } - if ($this->hasNodeNamedArguments($node)) { - $messages = $this->getStringArguments($node, '/message/i', \true); - } else { - if (!$arg->value instanceof Node\Expr\Array_) { - // There is no way to guess which argument is a message to be translated. - return null; - } - $messages = []; - $options = $arg->value; - /** @var Node\Expr\ArrayItem $item */ - foreach ($options->items as $item) { - if (!$item->key instanceof Node\Scalar\String_) { - continue; - } - if (\false === \stripos($item->key->value ?? '', 'message')) { - continue; - } - if (!$item->value instanceof Node\Scalar\String_) { - continue; - } - $messages[] = $item->value->value; - break; - } - } - foreach ($messages as $message) { - $this->addMessageToCatalogue($message, 'validators', $node->getStartLine()); - } - return null; - } - public function leaveNode(Node $node) : ?Node - { - return null; - } - public function afterTraverse(array $nodes) : ?Node - { - return null; - } -} diff --git a/dependencies/symfony/translation/Extractor/Visitor/TransMethodVisitor.php b/dependencies/symfony/translation/Extractor/Visitor/TransMethodVisitor.php deleted file mode 100644 index 66002b7..0000000 --- a/dependencies/symfony/translation/Extractor/Visitor/TransMethodVisitor.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor\Visitor; - -use WP_Ultimo\Dependencies\PhpParser\Node; -use WP_Ultimo\Dependencies\PhpParser\NodeVisitor; -/** - * @author Mathieu Santostefano - */ -final class TransMethodVisitor extends \Symfony\Component\Translation\Extractor\Visitor\AbstractVisitor implements NodeVisitor -{ - public function beforeTraverse(array $nodes) : ?Node - { - return null; - } - public function enterNode(Node $node) : ?Node - { - if (!$node instanceof Node\Expr\MethodCall && !$node instanceof Node\Expr\FuncCall) { - return null; - } - if (!\is_string($node->name) && !$node->name instanceof Node\Identifier && !$node->name instanceof Node\Name) { - return null; - } - $name = (string) $node->name; - if ('trans' === $name || 't' === $name) { - $firstNamedArgumentIndex = $this->nodeFirstNamedArgumentIndex($node); - if (!($messages = $this->getStringArguments($node, 0 < $firstNamedArgumentIndex ? 0 : 'message'))) { - return null; - } - $domain = $this->getStringArguments($node, 2 < $firstNamedArgumentIndex ? 2 : 'domain')[0] ?? null; - foreach ($messages as $message) { - $this->addMessageToCatalogue($message, $domain, $node->getStartLine()); - } - } - return null; - } - public function leaveNode(Node $node) : ?Node - { - return null; - } - public function afterTraverse(array $nodes) : ?Node - { - return null; - } -} diff --git a/dependencies/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php b/dependencies/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php deleted file mode 100644 index 91d10c3..0000000 --- a/dependencies/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Extractor\Visitor; - -use WP_Ultimo\Dependencies\PhpParser\Node; -use WP_Ultimo\Dependencies\PhpParser\NodeVisitor; -/** - * @author Mathieu Santostefano - */ -final class TranslatableMessageVisitor extends \Symfony\Component\Translation\Extractor\Visitor\AbstractVisitor implements NodeVisitor -{ - public function beforeTraverse(array $nodes) : ?Node - { - return null; - } - public function enterNode(Node $node) : ?Node - { - if (!$node instanceof Node\Expr\New_) { - return null; - } - if (!($className = $node->class) instanceof Node\Name) { - return null; - } - if (!\in_array('TranslatableMessage', $className->parts, \true)) { - return null; - } - $firstNamedArgumentIndex = $this->nodeFirstNamedArgumentIndex($node); - if (!($messages = $this->getStringArguments($node, 0 < $firstNamedArgumentIndex ? 0 : 'message'))) { - return null; - } - $domain = $this->getStringArguments($node, 2 < $firstNamedArgumentIndex ? 2 : 'domain')[0] ?? null; - foreach ($messages as $message) { - $this->addMessageToCatalogue($message, $domain, $node->getStartLine()); - } - return null; - } - public function leaveNode(Node $node) : ?Node - { - return null; - } - public function afterTraverse(array $nodes) : ?Node - { - return null; - } -} diff --git a/dependencies/symfony/translation/Formatter/IntlFormatter.php b/dependencies/symfony/translation/Formatter/IntlFormatter.php deleted file mode 100644 index a437e2e..0000000 --- a/dependencies/symfony/translation/Formatter/IntlFormatter.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Formatter; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\LogicException; -/** - * @author Guilherme Blanco - * @author Abdellatif Ait boudad - */ -class IntlFormatter implements \Symfony\Component\Translation\Formatter\IntlFormatterInterface -{ - private $hasMessageFormatter; - private $cache = []; - public function formatIntl(string $message, string $locale, array $parameters = []) : string - { - // MessageFormatter constructor throws an exception if the message is empty - if ('' === $message) { - return ''; - } - if (!($formatter = $this->cache[$locale][$message] ?? null)) { - if (!($this->hasMessageFormatter ??= \class_exists(\MessageFormatter::class))) { - throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.'); - } - try { - $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message); - } catch (\IntlException $e) { - throw new InvalidArgumentException(\sprintf('Invalid message format (error #%d): ', \intl_get_error_code()) . \intl_get_error_message(), 0, $e); - } - } - foreach ($parameters as $key => $value) { - if (\in_array($key[0] ?? null, ['%', '{'], \true)) { - unset($parameters[$key]); - $parameters[\trim($key, '%{ }')] = $value; - } - } - if (\false === ($message = $formatter->format($parameters))) { - throw new InvalidArgumentException(\sprintf('Unable to format message (error #%s): ', $formatter->getErrorCode()) . $formatter->getErrorMessage()); - } - return $message; - } -} diff --git a/dependencies/symfony/translation/Formatter/IntlFormatterInterface.php b/dependencies/symfony/translation/Formatter/IntlFormatterInterface.php deleted file mode 100644 index 1c9f471..0000000 --- a/dependencies/symfony/translation/Formatter/IntlFormatterInterface.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Formatter; - -/** - * Formats ICU message patterns. - * - * @author Nicolas Grekas - */ -interface IntlFormatterInterface -{ - /** - * Formats a localized message using rules defined by ICU MessageFormat. - * - * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details - */ - public function formatIntl(string $message, string $locale, array $parameters = []) : string; -} diff --git a/dependencies/symfony/translation/Formatter/MessageFormatter.php b/dependencies/symfony/translation/Formatter/MessageFormatter.php deleted file mode 100644 index 51b9f01..0000000 --- a/dependencies/symfony/translation/Formatter/MessageFormatter.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Formatter; - -use Symfony\Component\Translation\IdentityTranslator; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -// Help opcache.preload discover always-needed symbols -\class_exists(\Symfony\Component\Translation\Formatter\IntlFormatter::class); -/** - * @author Abdellatif Ait boudad - */ -class MessageFormatter implements \Symfony\Component\Translation\Formatter\MessageFormatterInterface, \Symfony\Component\Translation\Formatter\IntlFormatterInterface -{ - private TranslatorInterface $translator; - private \Symfony\Component\Translation\Formatter\IntlFormatterInterface $intlFormatter; - /** - * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization - */ - public function __construct(TranslatorInterface $translator = null, \Symfony\Component\Translation\Formatter\IntlFormatterInterface $intlFormatter = null) - { - $this->translator = $translator ?? new IdentityTranslator(); - $this->intlFormatter = $intlFormatter ?? new \Symfony\Component\Translation\Formatter\IntlFormatter(); - } - public function format(string $message, string $locale, array $parameters = []) : string - { - if ($this->translator instanceof TranslatorInterface) { - return $this->translator->trans($message, $parameters, null, $locale); - } - return \strtr($message, $parameters); - } - public function formatIntl(string $message, string $locale, array $parameters = []) : string - { - return $this->intlFormatter->formatIntl($message, $locale, $parameters); - } -} diff --git a/dependencies/symfony/translation/Formatter/MessageFormatterInterface.php b/dependencies/symfony/translation/Formatter/MessageFormatterInterface.php deleted file mode 100644 index 4ebfa9c..0000000 --- a/dependencies/symfony/translation/Formatter/MessageFormatterInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Formatter; - -/** - * @author Guilherme Blanco - * @author Abdellatif Ait boudad - */ -interface MessageFormatterInterface -{ - /** - * Formats a localized message pattern with given arguments. - * - * @param string $message The message (may also be an object that can be cast to string) - * @param string $locale The message locale - * @param array $parameters An array of parameters for the message - */ - public function format(string $message, string $locale, array $parameters = []) : string; -} diff --git a/dependencies/symfony/translation/IdentityTranslator.php b/dependencies/symfony/translation/IdentityTranslator.php deleted file mode 100644 index 2538755..0000000 --- a/dependencies/symfony/translation/IdentityTranslator.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\LocaleAwareInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorTrait; -/** - * IdentityTranslator does not translate anything. - * - * @author Fabien Potencier - */ -class IdentityTranslator implements TranslatorInterface, LocaleAwareInterface -{ - use TranslatorTrait; -} diff --git a/dependencies/symfony/translation/Loader/ArrayLoader.php b/dependencies/symfony/translation/Loader/ArrayLoader.php deleted file mode 100644 index cc848b0..0000000 --- a/dependencies/symfony/translation/Loader/ArrayLoader.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * ArrayLoader loads translations from a PHP array. - * - * @author Fabien Potencier - */ -class ArrayLoader implements \Symfony\Component\Translation\Loader\LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue - { - $resource = $this->flatten($resource); - $catalogue = new MessageCatalogue($locale); - $catalogue->add($resource, $domain); - return $catalogue; - } - /** - * Flattens an nested array of translations. - * - * The scheme used is: - * 'key' => ['key2' => ['key3' => 'value']] - * Becomes: - * 'key.key2.key3' => 'value' - */ - private function flatten(array $messages) : array - { - $result = []; - foreach ($messages as $key => $value) { - if (\is_array($value)) { - foreach ($this->flatten($value) as $k => $v) { - if (null !== $v) { - $result[$key . '.' . $k] = $v; - } - } - } elseif (null !== $value) { - $result[$key] = $value; - } - } - return $result; - } -} diff --git a/dependencies/symfony/translation/Loader/CsvFileLoader.php b/dependencies/symfony/translation/Loader/CsvFileLoader.php deleted file mode 100644 index 784cdf3..0000000 --- a/dependencies/symfony/translation/Loader/CsvFileLoader.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\NotFoundResourceException; -/** - * CsvFileLoader loads translations from CSV files. - * - * @author Saša Stamenković - */ -class CsvFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - private string $delimiter = ';'; - private string $enclosure = '"'; - private string $escape = '\\'; - protected function loadResource(string $resource) : array - { - $messages = []; - try { - $file = new \SplFileObject($resource, 'rb'); - } catch (\RuntimeException $e) { - throw new NotFoundResourceException(\sprintf('Error opening file "%s".', $resource), 0, $e); - } - $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY); - $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape); - foreach ($file as $data) { - if (\false === $data) { - continue; - } - if (!\str_starts_with($data[0], '#') && isset($data[1]) && 2 === \count($data)) { - $messages[$data[0]] = $data[1]; - } - } - return $messages; - } - /** - * Sets the delimiter, enclosure, and escape character for CSV. - * - * @return void - */ - public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = '\\') - { - $this->delimiter = $delimiter; - $this->enclosure = $enclosure; - $this->escape = $escape; - } -} diff --git a/dependencies/symfony/translation/Loader/FileLoader.php b/dependencies/symfony/translation/Loader/FileLoader.php deleted file mode 100644 index f8a4b78..0000000 --- a/dependencies/symfony/translation/Loader/FileLoader.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * @author Abdellatif Ait boudad - */ -abstract class FileLoader extends \Symfony\Component\Translation\Loader\ArrayLoader -{ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue - { - if (!\stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - if (!\file_exists($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - $messages = $this->loadResource($resource); - // empty resource - $messages ??= []; - // not an array - if (!\is_array($messages)) { - throw new InvalidResourceException(\sprintf('Unable to load file "%s".', $resource)); - } - $catalogue = parent::load($messages, $locale, $domain); - if (\class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource)); - } - return $catalogue; - } - /** - * @throws InvalidResourceException if stream content has an invalid format - */ - protected abstract function loadResource(string $resource) : array; -} diff --git a/dependencies/symfony/translation/Loader/IcuDatFileLoader.php b/dependencies/symfony/translation/Loader/IcuDatFileLoader.php deleted file mode 100644 index 5dc8d96..0000000 --- a/dependencies/symfony/translation/Loader/IcuDatFileLoader.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * IcuResFileLoader loads translations from a resource bundle. - * - * @author stealth35 - */ -class IcuDatFileLoader extends \Symfony\Component\Translation\Loader\IcuResFileLoader -{ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue - { - if (!\stream_is_local($resource . '.dat')) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - if (!\file_exists($resource . '.dat')) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - try { - $rb = new \ResourceBundle($locale, $resource); - } catch (\Exception) { - $rb = null; - } - if (!$rb) { - throw new InvalidResourceException(\sprintf('Cannot load resource "%s".', $resource)); - } elseif (\intl_is_failure($rb->getErrorCode())) { - throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); - } - $messages = $this->flatten($rb); - $catalogue = new MessageCatalogue($locale); - $catalogue->add($messages, $domain); - if (\class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource . '.dat')); - } - return $catalogue; - } -} diff --git a/dependencies/symfony/translation/Loader/IcuResFileLoader.php b/dependencies/symfony/translation/Loader/IcuResFileLoader.php deleted file mode 100644 index 37207ea..0000000 --- a/dependencies/symfony/translation/Loader/IcuResFileLoader.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\DirectoryResource; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * IcuResFileLoader loads translations from a resource bundle. - * - * @author stealth35 - */ -class IcuResFileLoader implements \Symfony\Component\Translation\Loader\LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue - { - if (!\stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - if (!\is_dir($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - try { - $rb = new \ResourceBundle($locale, $resource); - } catch (\Exception) { - $rb = null; - } - if (!$rb) { - throw new InvalidResourceException(\sprintf('Cannot load resource "%s".', $resource)); - } elseif (\intl_is_failure($rb->getErrorCode())) { - throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); - } - $messages = $this->flatten($rb); - $catalogue = new MessageCatalogue($locale); - $catalogue->add($messages, $domain); - if (\class_exists(DirectoryResource::class)) { - $catalogue->addResource(new DirectoryResource($resource)); - } - return $catalogue; - } - /** - * Flattens an ResourceBundle. - * - * The scheme used is: - * key { key2 { key3 { "value" } } } - * Becomes: - * 'key.key2.key3' => 'value' - * - * This function takes an array by reference and will modify it - * - * @param \ResourceBundle $rb The ResourceBundle that will be flattened - * @param array $messages Used internally for recursive calls - * @param string|null $path Current path being parsed, used internally for recursive calls - */ - protected function flatten(\ResourceBundle $rb, array &$messages = [], string $path = null) : array - { - foreach ($rb as $key => $value) { - $nodePath = $path ? $path . '.' . $key : $key; - if ($value instanceof \ResourceBundle) { - $this->flatten($value, $messages, $nodePath); - } else { - $messages[$nodePath] = $value; - } - } - return $messages; - } -} diff --git a/dependencies/symfony/translation/Loader/IniFileLoader.php b/dependencies/symfony/translation/Loader/IniFileLoader.php deleted file mode 100644 index 1e4453c..0000000 --- a/dependencies/symfony/translation/Loader/IniFileLoader.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -/** - * IniFileLoader loads translations from an ini file. - * - * @author stealth35 - */ -class IniFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - protected function loadResource(string $resource) : array - { - return \parse_ini_file($resource, \true); - } -} diff --git a/dependencies/symfony/translation/Loader/JsonFileLoader.php b/dependencies/symfony/translation/Loader/JsonFileLoader.php deleted file mode 100644 index 925ad8f..0000000 --- a/dependencies/symfony/translation/Loader/JsonFileLoader.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; -/** - * JsonFileLoader loads translations from an json file. - * - * @author singles - */ -class JsonFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - protected function loadResource(string $resource) : array - { - $messages = []; - if ($data = \file_get_contents($resource)) { - $messages = \json_decode($data, \true); - if (0 < ($errorCode = \json_last_error())) { - throw new InvalidResourceException('Error parsing JSON: ' . $this->getJSONErrorMessage($errorCode)); - } - } - return $messages; - } - /** - * Translates JSON_ERROR_* constant into meaningful message. - */ - private function getJSONErrorMessage(int $errorCode) : string - { - return match ($errorCode) { - \JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', - \JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch', - \JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', - \JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', - \JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', - default => 'Unknown error', - }; - } -} diff --git a/dependencies/symfony/translation/Loader/LoaderInterface.php b/dependencies/symfony/translation/Loader/LoaderInterface.php deleted file mode 100644 index ced5d5a..0000000 --- a/dependencies/symfony/translation/Loader/LoaderInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * LoaderInterface is the interface implemented by all translation loaders. - * - * @author Fabien Potencier - */ -interface LoaderInterface -{ - /** - * Loads a locale. - * - * @throws NotFoundResourceException when the resource cannot be found - * @throws InvalidResourceException when the resource cannot be loaded - */ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue; -} diff --git a/dependencies/symfony/translation/Loader/MoFileLoader.php b/dependencies/symfony/translation/Loader/MoFileLoader.php deleted file mode 100644 index f6e929b..0000000 --- a/dependencies/symfony/translation/Loader/MoFileLoader.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; -/** - * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/) - */ -class MoFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - /** - * Magic used for validating the format of an MO file as well as - * detecting if the machine used to create that file was little endian. - */ - public const MO_LITTLE_ENDIAN_MAGIC = 0x950412de; - /** - * Magic used for validating the format of an MO file as well as - * detecting if the machine used to create that file was big endian. - */ - public const MO_BIG_ENDIAN_MAGIC = 0xde120495; - /** - * The size of the header of an MO file in bytes. - */ - public const MO_HEADER_SIZE = 28; - /** - * Parses machine object (MO) format, independent of the machine's endian it - * was created on. Both 32bit and 64bit systems are supported. - */ - protected function loadResource(string $resource) : array - { - $stream = \fopen($resource, 'r'); - $stat = \fstat($stream); - if ($stat['size'] < self::MO_HEADER_SIZE) { - throw new InvalidResourceException('MO stream content has an invalid format.'); - } - $magic = \unpack('V1', \fread($stream, 4)); - $magic = \hexdec(\substr(\dechex(\current($magic)), -8)); - if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) { - $isBigEndian = \false; - } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) { - $isBigEndian = \true; - } else { - throw new InvalidResourceException('MO stream content has an invalid format.'); - } - // formatRevision - $this->readLong($stream, $isBigEndian); - $count = $this->readLong($stream, $isBigEndian); - $offsetId = $this->readLong($stream, $isBigEndian); - $offsetTranslated = $this->readLong($stream, $isBigEndian); - // sizeHashes - $this->readLong($stream, $isBigEndian); - // offsetHashes - $this->readLong($stream, $isBigEndian); - $messages = []; - for ($i = 0; $i < $count; ++$i) { - $pluralId = null; - $translated = null; - \fseek($stream, $offsetId + $i * 8); - $length = $this->readLong($stream, $isBigEndian); - $offset = $this->readLong($stream, $isBigEndian); - if ($length < 1) { - continue; - } - \fseek($stream, $offset); - $singularId = \fread($stream, $length); - if (\str_contains($singularId, "\x00")) { - [$singularId, $pluralId] = \explode("\x00", $singularId); - } - \fseek($stream, $offsetTranslated + $i * 8); - $length = $this->readLong($stream, $isBigEndian); - $offset = $this->readLong($stream, $isBigEndian); - if ($length < 1) { - continue; - } - \fseek($stream, $offset); - $translated = \fread($stream, $length); - if (\str_contains($translated, "\x00")) { - $translated = \explode("\x00", $translated); - } - $ids = ['singular' => $singularId, 'plural' => $pluralId]; - $item = \compact('ids', 'translated'); - if (!empty($item['ids']['singular'])) { - $id = $item['ids']['singular']; - if (isset($item['ids']['plural'])) { - $id .= '|' . $item['ids']['plural']; - } - $messages[$id] = \stripcslashes(\implode('|', (array) $item['translated'])); - } - } - \fclose($stream); - return \array_filter($messages); - } - /** - * Reads an unsigned long from stream respecting endianness. - * - * @param resource $stream - */ - private function readLong($stream, bool $isBigEndian) : int - { - $result = \unpack($isBigEndian ? 'N1' : 'V1', \fread($stream, 4)); - $result = \current($result); - return (int) \substr($result, -8); - } -} diff --git a/dependencies/symfony/translation/Loader/PhpFileLoader.php b/dependencies/symfony/translation/Loader/PhpFileLoader.php deleted file mode 100644 index 207adcc..0000000 --- a/dependencies/symfony/translation/Loader/PhpFileLoader.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -/** - * PhpFileLoader loads translations from PHP files returning an array of translations. - * - * @author Fabien Potencier - */ -class PhpFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - private static ?array $cache = []; - protected function loadResource(string $resource) : array - { - if ([] === self::$cache && \function_exists('opcache_invalidate') && \filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], \true) || \filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOL))) { - self::$cache = null; - } - if (null === self::$cache) { - return require $resource; - } - return self::$cache[$resource] ??= (require $resource); - } -} diff --git a/dependencies/symfony/translation/Loader/PoFileLoader.php b/dependencies/symfony/translation/Loader/PoFileLoader.php deleted file mode 100644 index bd26580..0000000 --- a/dependencies/symfony/translation/Loader/PoFileLoader.php +++ /dev/null @@ -1,134 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -/** - * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium - * @copyright Copyright (c) 2012, Clemens Tolboom - */ -class PoFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - /** - * Parses portable object (PO) format. - * - * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files - * we should be able to parse files having: - * - * white-space - * # translator-comments - * #. extracted-comments - * #: reference... - * #, flag... - * #| msgid previous-untranslated-string - * msgid untranslated-string - * msgstr translated-string - * - * extra or different lines are: - * - * #| msgctxt previous-context - * #| msgid previous-untranslated-string - * msgctxt context - * - * #| msgid previous-untranslated-string-singular - * #| msgid_plural previous-untranslated-string-plural - * msgid untranslated-string-singular - * msgid_plural untranslated-string-plural - * msgstr[0] translated-string-case-0 - * ... - * msgstr[N] translated-string-case-n - * - * The definition states: - * - white-space and comments are optional. - * - msgid "" that an empty singleline defines a header. - * - * This parser sacrifices some features of the reference implementation the - * differences to that implementation are as follows. - * - No support for comments spanning multiple lines. - * - Translator and extracted comments are treated as being the same type. - * - Message IDs are allowed to have other encodings as just US-ASCII. - * - * Items with an empty id are ignored. - */ - protected function loadResource(string $resource) : array - { - $stream = \fopen($resource, 'r'); - $defaults = ['ids' => [], 'translated' => null]; - $messages = []; - $item = $defaults; - $flags = []; - while ($line = \fgets($stream)) { - $line = \trim($line); - if ('' === $line) { - // Whitespace indicated current item is done - if (!\in_array('fuzzy', $flags)) { - $this->addMessage($messages, $item); - } - $item = $defaults; - $flags = []; - } elseif (\str_starts_with($line, '#,')) { - $flags = \array_map('trim', \explode(',', \substr($line, 2))); - } elseif (\str_starts_with($line, 'msgid "')) { - // We start a new msg so save previous - // TODO: this fails when comments or contexts are added - $this->addMessage($messages, $item); - $item = $defaults; - $item['ids']['singular'] = \substr($line, 7, -1); - } elseif (\str_starts_with($line, 'msgstr "')) { - $item['translated'] = \substr($line, 8, -1); - } elseif ('"' === $line[0]) { - $continues = isset($item['translated']) ? 'translated' : 'ids'; - if (\is_array($item[$continues])) { - \end($item[$continues]); - $item[$continues][\key($item[$continues])] .= \substr($line, 1, -1); - } else { - $item[$continues] .= \substr($line, 1, -1); - } - } elseif (\str_starts_with($line, 'msgid_plural "')) { - $item['ids']['plural'] = \substr($line, 14, -1); - } elseif (\str_starts_with($line, 'msgstr[')) { - $size = \strpos($line, ']'); - $item['translated'][(int) \substr($line, 7, 1)] = \substr($line, $size + 3, -1); - } - } - // save last item - if (!\in_array('fuzzy', $flags)) { - $this->addMessage($messages, $item); - } - \fclose($stream); - return $messages; - } - /** - * Save a translation item to the messages. - * - * A .po file could contain by error missing plural indexes. We need to - * fix these before saving them. - */ - private function addMessage(array &$messages, array $item) : void - { - if (!empty($item['ids']['singular'])) { - $id = \stripcslashes($item['ids']['singular']); - if (isset($item['ids']['plural'])) { - $id .= '|' . \stripcslashes($item['ids']['plural']); - } - $translated = (array) $item['translated']; - // PO are by definition indexed so sort by index. - \ksort($translated); - // Make sure every index is filled. - \end($translated); - $count = \key($translated); - // Fill missing spots with '-'. - $empties = \array_fill(0, $count + 1, '-'); - $translated += $empties; - \ksort($translated); - $messages[$id] = \stripcslashes(\implode('|', $translated)); - } - } -} diff --git a/dependencies/symfony/translation/Loader/QtFileLoader.php b/dependencies/symfony/translation/Loader/QtFileLoader.php deleted file mode 100644 index c2c7d9d..0000000 --- a/dependencies/symfony/translation/Loader/QtFileLoader.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\FileResource; -use WP_Ultimo\Dependencies\Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * QtFileLoader loads translations from QT Translations XML files. - * - * @author Benjamin Eberlei - */ -class QtFileLoader implements \Symfony\Component\Translation\Loader\LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue - { - if (!\class_exists(XmlUtils::class)) { - throw new RuntimeException('Loading translations from the QT format requires the Symfony Config component.'); - } - if (!\stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - if (!\file_exists($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - try { - $dom = XmlUtils::loadFile($resource); - } catch (\InvalidArgumentException $e) { - throw new InvalidResourceException(\sprintf('Unable to load "%s".', $resource), $e->getCode(), $e); - } - $internalErrors = \libxml_use_internal_errors(\true); - \libxml_clear_errors(); - $xpath = new \DOMXPath($dom); - $nodes = $xpath->evaluate('//TS/context/name[text()="' . $domain . '"]'); - $catalogue = new MessageCatalogue($locale); - if (1 == $nodes->length) { - $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message'); - foreach ($translations as $translation) { - $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue; - if (!empty($translationValue)) { - $catalogue->set((string) $translation->getElementsByTagName('source')->item(0)->nodeValue, $translationValue, $domain); - } - } - if (\class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource)); - } - } - \libxml_use_internal_errors($internalErrors); - return $catalogue; - } -} diff --git a/dependencies/symfony/translation/Loader/XliffFileLoader.php b/dependencies/symfony/translation/Loader/XliffFileLoader.php deleted file mode 100644 index e5b111d..0000000 --- a/dependencies/symfony/translation/Loader/XliffFileLoader.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\FileResource; -use WP_Ultimo\Dependencies\Symfony\Component\Config\Util\Exception\InvalidXmlException; -use WP_Ultimo\Dependencies\Symfony\Component\Config\Util\Exception\XmlParsingException; -use WP_Ultimo\Dependencies\Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; -use Symfony\Component\Translation\Util\XliffUtils; -/** - * XliffFileLoader loads translations from XLIFF files. - * - * @author Fabien Potencier - */ -class XliffFileLoader implements \Symfony\Component\Translation\Loader\LoaderInterface -{ - public function load(mixed $resource, string $locale, string $domain = 'messages') : MessageCatalogue - { - if (!\class_exists(XmlUtils::class)) { - throw new RuntimeException('Loading translations from the Xliff format requires the Symfony Config component.'); - } - if (!$this->isXmlString($resource)) { - if (!\stream_is_local($resource)) { - throw new InvalidResourceException(\sprintf('This is not a local file "%s".', $resource)); - } - if (!\file_exists($resource)) { - throw new NotFoundResourceException(\sprintf('File "%s" not found.', $resource)); - } - if (!\is_file($resource)) { - throw new InvalidResourceException(\sprintf('This is neither a file nor an XLIFF string "%s".', $resource)); - } - } - try { - if ($this->isXmlString($resource)) { - $dom = XmlUtils::parse($resource); - } else { - $dom = XmlUtils::loadFile($resource); - } - } catch (\InvalidArgumentException|XmlParsingException|InvalidXmlException $e) { - throw new InvalidResourceException(\sprintf('Unable to load "%s": ', $resource) . $e->getMessage(), $e->getCode(), $e); - } - if ($errors = XliffUtils::validateSchema($dom)) { - throw new InvalidResourceException(\sprintf('Invalid resource provided: "%s"; Errors: ', $resource) . XliffUtils::getErrorsAsString($errors)); - } - $catalogue = new MessageCatalogue($locale); - $this->extract($dom, $catalogue, $domain); - if (\is_file($resource) && \class_exists(FileResource::class)) { - $catalogue->addResource(new FileResource($resource)); - } - return $catalogue; - } - private function extract(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) : void - { - $xliffVersion = XliffUtils::getVersionNumber($dom); - if ('1.2' === $xliffVersion) { - $this->extractXliff1($dom, $catalogue, $domain); - } - if ('2.0' === $xliffVersion) { - $this->extractXliff2($dom, $catalogue, $domain); - } - } - /** - * Extract messages and metadata from DOMDocument into a MessageCatalogue. - */ - private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) : void - { - $xml = \simplexml_import_dom($dom); - $encoding = $dom->encoding ? \strtoupper($dom->encoding) : null; - $namespace = 'urn:oasis:names:tc:xliff:document:1.2'; - $xml->registerXPathNamespace('xliff', $namespace); - foreach ($xml->xpath('//xliff:file') as $file) { - $fileAttributes = $file->attributes(); - $file->registerXPathNamespace('xliff', $namespace); - foreach ($file->xpath('.//xliff:prop') as $prop) { - $catalogue->setCatalogueMetadata($prop->attributes()['prop-type'], (string) $prop, $domain); - } - foreach ($file->xpath('.//xliff:trans-unit') as $translation) { - $attributes = $translation->attributes(); - if (!(isset($attributes['resname']) || isset($translation->source))) { - continue; - } - $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source; - // If the xlf file has another encoding specified, try to convert it because - // simple_xml will always return utf-8 encoded values - $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding); - $catalogue->set((string) $source, $target, $domain); - $metadata = ['source' => (string) $translation->source, 'file' => ['original' => (string) $fileAttributes['original']]]; - if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) { - $metadata['notes'] = $notes; - } - if (isset($translation->target) && $translation->target->attributes()) { - $metadata['target-attributes'] = []; - foreach ($translation->target->attributes() as $key => $value) { - $metadata['target-attributes'][$key] = (string) $value; - } - } - if (isset($attributes['id'])) { - $metadata['id'] = (string) $attributes['id']; - } - $catalogue->setMetadata((string) $source, $metadata, $domain); - } - } - } - private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) : void - { - $xml = \simplexml_import_dom($dom); - $encoding = $dom->encoding ? \strtoupper($dom->encoding) : null; - $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0'); - foreach ($xml->xpath('//xliff:unit') as $unit) { - foreach ($unit->segment as $segment) { - $attributes = $unit->attributes(); - $source = $attributes['name'] ?? $segment->source; - // If the xlf file has another encoding specified, try to convert it because - // simple_xml will always return utf-8 encoded values - $target = $this->utf8ToCharset((string) ($segment->target ?? $segment->source), $encoding); - $catalogue->set((string) $source, $target, $domain); - $metadata = []; - if (isset($segment->target) && $segment->target->attributes()) { - $metadata['target-attributes'] = []; - foreach ($segment->target->attributes() as $key => $value) { - $metadata['target-attributes'][$key] = (string) $value; - } - } - if (isset($unit->notes)) { - $metadata['notes'] = []; - foreach ($unit->notes->note as $noteNode) { - $note = []; - foreach ($noteNode->attributes() as $key => $value) { - $note[$key] = (string) $value; - } - $note['content'] = (string) $noteNode; - $metadata['notes'][] = $note; - } - } - $catalogue->setMetadata((string) $source, $metadata, $domain); - } - } - } - /** - * Convert a UTF8 string to the specified encoding. - */ - private function utf8ToCharset(string $content, string $encoding = null) : string - { - if ('UTF-8' !== $encoding && !empty($encoding)) { - return \mb_convert_encoding($content, $encoding, 'UTF-8'); - } - return $content; - } - private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, string $encoding = null) : array - { - $notes = []; - if (null === $noteElement) { - return $notes; - } - /** @var \SimpleXMLElement $xmlNote */ - foreach ($noteElement as $xmlNote) { - $noteAttributes = $xmlNote->attributes(); - $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)]; - if (isset($noteAttributes['priority'])) { - $note['priority'] = (int) $noteAttributes['priority']; - } - if (isset($noteAttributes['from'])) { - $note['from'] = (string) $noteAttributes['from']; - } - $notes[] = $note; - } - return $notes; - } - private function isXmlString(string $resource) : bool - { - return \str_starts_with($resource, ' - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Loader; - -use Symfony\Component\Translation\Exception\InvalidResourceException; -use Symfony\Component\Translation\Exception\LogicException; -use WP_Ultimo\Dependencies\Symfony\Component\Yaml\Exception\ParseException; -use WP_Ultimo\Dependencies\Symfony\Component\Yaml\Parser as YamlParser; -use WP_Ultimo\Dependencies\Symfony\Component\Yaml\Yaml; -/** - * YamlFileLoader loads translations from Yaml files. - * - * @author Fabien Potencier - */ -class YamlFileLoader extends \Symfony\Component\Translation\Loader\FileLoader -{ - private $yamlParser; - protected function loadResource(string $resource) : array - { - if (null === $this->yamlParser) { - if (!\class_exists(\WP_Ultimo\Dependencies\Symfony\Component\Yaml\Parser::class)) { - throw new LogicException('Loading translations from the YAML format requires the Symfony Yaml component.'); - } - $this->yamlParser = new YamlParser(); - } - try { - $messages = $this->yamlParser->parseFile($resource, Yaml::PARSE_CONSTANT); - } catch (ParseException $e) { - throw new InvalidResourceException(\sprintf('The file "%s" does not contain valid YAML: ', $resource) . $e->getMessage(), 0, $e); - } - if (null !== $messages && !\is_array($messages)) { - throw new InvalidResourceException(\sprintf('Unable to load file "%s".', $resource)); - } - return $messages ?: []; - } -} diff --git a/dependencies/symfony/translation/LocaleSwitcher.php b/dependencies/symfony/translation/LocaleSwitcher.php deleted file mode 100644 index de4ab4c..0000000 --- a/dependencies/symfony/translation/LocaleSwitcher.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Component\Routing\RequestContext; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\LocaleAwareInterface; -/** - * @author Kevin Bond - */ -class LocaleSwitcher implements LocaleAwareInterface -{ - private string $defaultLocale; - /** - * @param LocaleAwareInterface[] $localeAwareServices - */ - public function __construct(private string $locale, private iterable $localeAwareServices, private ?RequestContext $requestContext = null) - { - $this->defaultLocale = $locale; - } - public function setLocale(string $locale) : void - { - if (\class_exists(\Locale::class)) { - \Locale::setDefault($locale); - } - $this->locale = $locale; - $this->requestContext?->setParameter('_locale', $locale); - foreach ($this->localeAwareServices as $service) { - $service->setLocale($locale); - } - } - public function getLocale() : string - { - return $this->locale; - } - /** - * Switch to a new locale, execute a callback, then switch back to the original. - * - * @template T - * - * @param callable():T $callback - * - * @return T - */ - public function runWithLocale(string $locale, callable $callback) : mixed - { - $original = $this->getLocale(); - $this->setLocale($locale); - try { - return $callback(); - } finally { - $this->setLocale($original); - } - } - public function reset() : void - { - $this->setLocale($this->defaultLocale); - } -} diff --git a/dependencies/symfony/translation/LoggingTranslator.php b/dependencies/symfony/translation/LoggingTranslator.php deleted file mode 100644 index 481cdf1..0000000 --- a/dependencies/symfony/translation/LoggingTranslator.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\LocaleAwareInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -/** - * @author Abdellatif Ait boudad - */ -class LoggingTranslator implements TranslatorInterface, \Symfony\Component\Translation\TranslatorBagInterface, LocaleAwareInterface -{ - private TranslatorInterface $translator; - private LoggerInterface $logger; - /** - * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator The translator must implement TranslatorBagInterface - */ - public function __construct(TranslatorInterface $translator, LoggerInterface $logger) - { - if (!$translator instanceof \Symfony\Component\Translation\TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { - throw new InvalidArgumentException(\sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_debug_type($translator))); - } - $this->translator = $translator; - $this->logger = $logger; - } - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) : string - { - $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); - $this->log($id, $domain, $locale); - return $trans; - } - /** - * @return void - */ - public function setLocale(string $locale) - { - $prev = $this->translator->getLocale(); - $this->translator->setLocale($locale); - if ($prev === $locale) { - return; - } - $this->logger->debug(\sprintf('The locale of the translator has changed from "%s" to "%s".', $prev, $locale)); - } - public function getLocale() : string - { - return $this->translator->getLocale(); - } - public function getCatalogue(string $locale = null) : \Symfony\Component\Translation\MessageCatalogueInterface - { - return $this->translator->getCatalogue($locale); - } - public function getCatalogues() : array - { - return $this->translator->getCatalogues(); - } - /** - * Gets the fallback locales. - */ - public function getFallbackLocales() : array - { - if ($this->translator instanceof \Symfony\Component\Translation\Translator || \method_exists($this->translator, 'getFallbackLocales')) { - return $this->translator->getFallbackLocales(); - } - return []; - } - /** - * Passes through all unknown calls onto the translator object. - */ - public function __call(string $method, array $args) - { - return $this->translator->{$method}(...$args); - } - /** - * Logs for missing translations. - */ - private function log(string $id, ?string $domain, ?string $locale) : void - { - $domain ??= 'messages'; - $catalogue = $this->translator->getCatalogue($locale); - if ($catalogue->defines($id, $domain)) { - return; - } - if ($catalogue->has($id, $domain)) { - $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); - } else { - $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); - } - } -} diff --git a/dependencies/symfony/translation/MessageCatalogue.php b/dependencies/symfony/translation/MessageCatalogue.php deleted file mode 100644 index edb33df..0000000 --- a/dependencies/symfony/translation/MessageCatalogue.php +++ /dev/null @@ -1,286 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\ResourceInterface; -use Symfony\Component\Translation\Exception\LogicException; -/** - * @author Fabien Potencier - */ -class MessageCatalogue implements \Symfony\Component\Translation\MessageCatalogueInterface, \Symfony\Component\Translation\MetadataAwareInterface, \Symfony\Component\Translation\CatalogueMetadataAwareInterface -{ - private array $messages = []; - private array $metadata = []; - private array $catalogueMetadata = []; - private array $resources = []; - private string $locale; - private ?\Symfony\Component\Translation\MessageCatalogueInterface $fallbackCatalogue = null; - private ?self $parent = null; - /** - * @param array $messages An array of messages classified by domain - */ - public function __construct(string $locale, array $messages = []) - { - $this->locale = $locale; - $this->messages = $messages; - } - public function getLocale() : string - { - return $this->locale; - } - public function getDomains() : array - { - $domains = []; - foreach ($this->messages as $domain => $messages) { - if (\str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { - $domain = \substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)); - } - $domains[$domain] = $domain; - } - return \array_values($domains); - } - public function all(string $domain = null) : array - { - if (null !== $domain) { - // skip messages merge if intl-icu requested explicitly - if (\str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { - return $this->messages[$domain] ?? []; - } - return ($this->messages[$domain . self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []); - } - $allMessages = []; - foreach ($this->messages as $domain => $messages) { - if (\str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { - $domain = \substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)); - $allMessages[$domain] = $messages + ($allMessages[$domain] ?? []); - } else { - $allMessages[$domain] = ($allMessages[$domain] ?? []) + $messages; - } - } - return $allMessages; - } - /** - * @return void - */ - public function set(string $id, string $translation, string $domain = 'messages') - { - $this->add([$id => $translation], $domain); - } - public function has(string $id, string $domain = 'messages') : bool - { - if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id])) { - return \true; - } - if (null !== $this->fallbackCatalogue) { - return $this->fallbackCatalogue->has($id, $domain); - } - return \false; - } - public function defines(string $id, string $domain = 'messages') : bool - { - return isset($this->messages[$domain][$id]) || isset($this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id]); - } - public function get(string $id, string $domain = 'messages') : string - { - if (isset($this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id])) { - return $this->messages[$domain . self::INTL_DOMAIN_SUFFIX][$id]; - } - if (isset($this->messages[$domain][$id])) { - return $this->messages[$domain][$id]; - } - if (null !== $this->fallbackCatalogue) { - return $this->fallbackCatalogue->get($id, $domain); - } - return $id; - } - /** - * @return void - */ - public function replace(array $messages, string $domain = 'messages') - { - unset($this->messages[$domain], $this->messages[$domain . self::INTL_DOMAIN_SUFFIX]); - $this->add($messages, $domain); - } - /** - * @return void - */ - public function add(array $messages, string $domain = 'messages') - { - $altDomain = \str_ends_with($domain, self::INTL_DOMAIN_SUFFIX) ? \substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)) : $domain . self::INTL_DOMAIN_SUFFIX; - foreach ($messages as $id => $message) { - unset($this->messages[$altDomain][$id]); - $this->messages[$domain][$id] = $message; - } - if ([] === ($this->messages[$altDomain] ?? null)) { - unset($this->messages[$altDomain]); - } - } - /** - * @return void - */ - public function addCatalogue(\Symfony\Component\Translation\MessageCatalogueInterface $catalogue) - { - if ($catalogue->getLocale() !== $this->locale) { - throw new LogicException(\sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s".', $catalogue->getLocale(), $this->locale)); - } - foreach ($catalogue->all() as $domain => $messages) { - if ($intlMessages = $catalogue->all($domain . self::INTL_DOMAIN_SUFFIX)) { - $this->add($intlMessages, $domain . self::INTL_DOMAIN_SUFFIX); - $messages = \array_diff_key($messages, $intlMessages); - } - $this->add($messages, $domain); - } - foreach ($catalogue->getResources() as $resource) { - $this->addResource($resource); - } - if ($catalogue instanceof \Symfony\Component\Translation\MetadataAwareInterface) { - $metadata = $catalogue->getMetadata('', ''); - $this->addMetadata($metadata); - } - if ($catalogue instanceof \Symfony\Component\Translation\CatalogueMetadataAwareInterface) { - $catalogueMetadata = $catalogue->getCatalogueMetadata('', ''); - $this->addCatalogueMetadata($catalogueMetadata); - } - } - /** - * @return void - */ - public function addFallbackCatalogue(\Symfony\Component\Translation\MessageCatalogueInterface $catalogue) - { - // detect circular references - $c = $catalogue; - while ($c = $c->getFallbackCatalogue()) { - if ($c->getLocale() === $this->getLocale()) { - throw new LogicException(\sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); - } - } - $c = $this; - do { - if ($c->getLocale() === $catalogue->getLocale()) { - throw new LogicException(\sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); - } - foreach ($catalogue->getResources() as $resource) { - $c->addResource($resource); - } - } while ($c = $c->parent); - $catalogue->parent = $this; - $this->fallbackCatalogue = $catalogue; - foreach ($catalogue->getResources() as $resource) { - $this->addResource($resource); - } - } - public function getFallbackCatalogue() : ?\Symfony\Component\Translation\MessageCatalogueInterface - { - return $this->fallbackCatalogue; - } - public function getResources() : array - { - return \array_values($this->resources); - } - /** - * @return void - */ - public function addResource(ResourceInterface $resource) - { - $this->resources[$resource->__toString()] = $resource; - } - public function getMetadata(string $key = '', string $domain = 'messages') : mixed - { - if ('' == $domain) { - return $this->metadata; - } - if (isset($this->metadata[$domain])) { - if ('' == $key) { - return $this->metadata[$domain]; - } - if (isset($this->metadata[$domain][$key])) { - return $this->metadata[$domain][$key]; - } - } - return null; - } - /** - * @return void - */ - public function setMetadata(string $key, mixed $value, string $domain = 'messages') - { - $this->metadata[$domain][$key] = $value; - } - /** - * @return void - */ - public function deleteMetadata(string $key = '', string $domain = 'messages') - { - if ('' == $domain) { - $this->metadata = []; - } elseif ('' == $key) { - unset($this->metadata[$domain]); - } else { - unset($this->metadata[$domain][$key]); - } - } - public function getCatalogueMetadata(string $key = '', string $domain = 'messages') : mixed - { - if (!$domain) { - return $this->catalogueMetadata; - } - if (isset($this->catalogueMetadata[$domain])) { - if (!$key) { - return $this->catalogueMetadata[$domain]; - } - if (isset($this->catalogueMetadata[$domain][$key])) { - return $this->catalogueMetadata[$domain][$key]; - } - } - return null; - } - /** - * @return void - */ - public function setCatalogueMetadata(string $key, mixed $value, string $domain = 'messages') - { - $this->catalogueMetadata[$domain][$key] = $value; - } - /** - * @return void - */ - public function deleteCatalogueMetadata(string $key = '', string $domain = 'messages') - { - if (!$domain) { - $this->catalogueMetadata = []; - } elseif (!$key) { - unset($this->catalogueMetadata[$domain]); - } else { - unset($this->catalogueMetadata[$domain][$key]); - } - } - /** - * Adds current values with the new values. - * - * @param array $values Values to add - */ - private function addMetadata(array $values) : void - { - foreach ($values as $domain => $keys) { - foreach ($keys as $key => $value) { - $this->setMetadata($key, $value, $domain); - } - } - } - private function addCatalogueMetadata(array $values) : void - { - foreach ($values as $domain => $keys) { - foreach ($keys as $key => $value) { - $this->setCatalogueMetadata($key, $value, $domain); - } - } - } -} diff --git a/dependencies/symfony/translation/MessageCatalogueInterface.php b/dependencies/symfony/translation/MessageCatalogueInterface.php deleted file mode 100644 index addc973..0000000 --- a/dependencies/symfony/translation/MessageCatalogueInterface.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\Resource\ResourceInterface; -/** - * MessageCatalogueInterface. - * - * @author Fabien Potencier - */ -interface MessageCatalogueInterface -{ - public const INTL_DOMAIN_SUFFIX = '+intl-icu'; - /** - * Gets the catalogue locale. - */ - public function getLocale() : string; - /** - * Gets the domains. - */ - public function getDomains() : array; - /** - * Gets the messages within a given domain. - * - * If $domain is null, it returns all messages. - */ - public function all(string $domain = null) : array; - /** - * Sets a message translation. - * - * @param string $id The message id - * @param string $translation The messages translation - * @param string $domain The domain name - * - * @return void - */ - public function set(string $id, string $translation, string $domain = 'messages'); - /** - * Checks if a message has a translation. - * - * @param string $id The message id - * @param string $domain The domain name - */ - public function has(string $id, string $domain = 'messages') : bool; - /** - * Checks if a message has a translation (it does not take into account the fallback mechanism). - * - * @param string $id The message id - * @param string $domain The domain name - */ - public function defines(string $id, string $domain = 'messages') : bool; - /** - * Gets a message translation. - * - * @param string $id The message id - * @param string $domain The domain name - */ - public function get(string $id, string $domain = 'messages') : string; - /** - * Sets translations for a given domain. - * - * @param array $messages An array of translations - * @param string $domain The domain name - * - * @return void - */ - public function replace(array $messages, string $domain = 'messages'); - /** - * Adds translations for a given domain. - * - * @param array $messages An array of translations - * @param string $domain The domain name - * - * @return void - */ - public function add(array $messages, string $domain = 'messages'); - /** - * Merges translations from the given Catalogue into the current one. - * - * The two catalogues must have the same locale. - * - * @return void - */ - public function addCatalogue(self $catalogue); - /** - * Merges translations from the given Catalogue into the current one - * only when the translation does not exist. - * - * This is used to provide default translations when they do not exist for the current locale. - * - * @return void - */ - public function addFallbackCatalogue(self $catalogue); - /** - * Gets the fallback catalogue. - */ - public function getFallbackCatalogue() : ?self; - /** - * Returns an array of resources loaded to build this collection. - * - * @return ResourceInterface[] - */ - public function getResources() : array; - /** - * Adds a resource for this collection. - * - * @return void - */ - public function addResource(ResourceInterface $resource); -} diff --git a/dependencies/symfony/translation/MetadataAwareInterface.php b/dependencies/symfony/translation/MetadataAwareInterface.php deleted file mode 100644 index 407b461..0000000 --- a/dependencies/symfony/translation/MetadataAwareInterface.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -/** - * This interface is used to get, set, and delete metadata about the translation messages. - * - * @author Fabien Potencier - */ -interface MetadataAwareInterface -{ - /** - * Gets metadata for the given domain and key. - * - * Passing an empty domain will return an array with all metadata indexed by - * domain and then by key. Passing an empty key will return an array with all - * metadata for the given domain. - * - * @return mixed The value that was set or an array with the domains/keys or null - */ - public function getMetadata(string $key = '', string $domain = 'messages') : mixed; - /** - * Adds metadata to a message domain. - * - * @return void - */ - public function setMetadata(string $key, mixed $value, string $domain = 'messages'); - /** - * Deletes metadata for the given key and domain. - * - * Passing an empty domain will delete all metadata. Passing an empty key will - * delete all metadata for the given domain. - * - * @return void - */ - public function deleteMetadata(string $key = '', string $domain = 'messages'); -} diff --git a/dependencies/symfony/translation/Provider/AbstractProviderFactory.php b/dependencies/symfony/translation/Provider/AbstractProviderFactory.php deleted file mode 100644 index 8ebbbf2..0000000 --- a/dependencies/symfony/translation/Provider/AbstractProviderFactory.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\IncompleteDsnException; -abstract class AbstractProviderFactory implements \Symfony\Component\Translation\Provider\ProviderFactoryInterface -{ - public function supports(\Symfony\Component\Translation\Provider\Dsn $dsn) : bool - { - return \in_array($dsn->getScheme(), $this->getSupportedSchemes(), \true); - } - /** - * @return string[] - */ - protected abstract function getSupportedSchemes() : array; - protected function getUser(\Symfony\Component\Translation\Provider\Dsn $dsn) : string - { - return $dsn->getUser() ?? throw new IncompleteDsnException('User is not set.', $dsn->getScheme() . '://' . $dsn->getHost()); - } - protected function getPassword(\Symfony\Component\Translation\Provider\Dsn $dsn) : string - { - return $dsn->getPassword() ?? throw new IncompleteDsnException('Password is not set.', $dsn->getOriginalDsn()); - } -} diff --git a/dependencies/symfony/translation/Provider/Dsn.php b/dependencies/symfony/translation/Provider/Dsn.php deleted file mode 100644 index ac2c363..0000000 --- a/dependencies/symfony/translation/Provider/Dsn.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\MissingRequiredOptionException; -/** - * @author Fabien Potencier - * @author Oskar Stark - */ -final class Dsn -{ - private ?string $scheme; - private ?string $host; - private ?string $user; - private ?string $password; - private ?int $port; - private ?string $path; - private array $options = []; - private string $originalDsn; - public function __construct(#[\SensitiveParameter] string $dsn) - { - $this->originalDsn = $dsn; - if (\false === ($parsedDsn = \parse_url($dsn))) { - throw new InvalidArgumentException('The translation provider DSN is invalid.'); - } - if (!isset($parsedDsn['scheme'])) { - throw new InvalidArgumentException('The translation provider DSN must contain a scheme.'); - } - $this->scheme = $parsedDsn['scheme']; - if (!isset($parsedDsn['host'])) { - throw new InvalidArgumentException('The translation provider DSN must contain a host (use "default" by default).'); - } - $this->host = $parsedDsn['host']; - $this->user = '' !== ($parsedDsn['user'] ?? '') ? \urldecode($parsedDsn['user']) : null; - $this->password = '' !== ($parsedDsn['pass'] ?? '') ? \urldecode($parsedDsn['pass']) : null; - $this->port = $parsedDsn['port'] ?? null; - $this->path = $parsedDsn['path'] ?? null; - \parse_str($parsedDsn['query'] ?? '', $this->options); - } - public function getScheme() : string - { - return $this->scheme; - } - public function getHost() : string - { - return $this->host; - } - public function getUser() : ?string - { - return $this->user; - } - public function getPassword() : ?string - { - return $this->password; - } - public function getPort(int $default = null) : ?int - { - return $this->port ?? $default; - } - public function getOption(string $key, mixed $default = null) : mixed - { - return $this->options[$key] ?? $default; - } - public function getRequiredOption(string $key) : mixed - { - if (!\array_key_exists($key, $this->options) || '' === \trim($this->options[$key])) { - throw new MissingRequiredOptionException($key); - } - return $this->options[$key]; - } - public function getOptions() : array - { - return $this->options; - } - public function getPath() : ?string - { - return $this->path; - } - public function getOriginalDsn() : string - { - return $this->originalDsn; - } -} diff --git a/dependencies/symfony/translation/Provider/FilteringProvider.php b/dependencies/symfony/translation/Provider/FilteringProvider.php deleted file mode 100644 index 73d1303..0000000 --- a/dependencies/symfony/translation/Provider/FilteringProvider.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; -/** - * Filters domains and locales between the Translator config values and those specific to each provider. - * - * @author Mathieu Santostefano - */ -class FilteringProvider implements \Symfony\Component\Translation\Provider\ProviderInterface -{ - private \Symfony\Component\Translation\Provider\ProviderInterface $provider; - private array $locales; - private array $domains; - public function __construct(\Symfony\Component\Translation\Provider\ProviderInterface $provider, array $locales, array $domains = []) - { - $this->provider = $provider; - $this->locales = $locales; - $this->domains = $domains; - } - public function __toString() : string - { - return (string) $this->provider; - } - public function write(TranslatorBagInterface $translatorBag) : void - { - $this->provider->write($translatorBag); - } - public function read(array $domains, array $locales) : TranslatorBag - { - $domains = !$this->domains ? $domains : \array_intersect($this->domains, $domains); - $locales = \array_intersect($this->locales, $locales); - return $this->provider->read($domains, $locales); - } - public function delete(TranslatorBagInterface $translatorBag) : void - { - $this->provider->delete($translatorBag); - } - public function getDomains() : array - { - return $this->domains; - } -} diff --git a/dependencies/symfony/translation/Provider/NullProvider.php b/dependencies/symfony/translation/Provider/NullProvider.php deleted file mode 100644 index 70f9d09..0000000 --- a/dependencies/symfony/translation/Provider/NullProvider.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; -/** - * @author Mathieu Santostefano - */ -class NullProvider implements \Symfony\Component\Translation\Provider\ProviderInterface -{ - public function __toString() : string - { - return 'null'; - } - public function write(TranslatorBagInterface $translatorBag, bool $override = \false) : void - { - } - public function read(array $domains, array $locales) : TranslatorBag - { - return new TranslatorBag(); - } - public function delete(TranslatorBagInterface $translatorBag) : void - { - } -} diff --git a/dependencies/symfony/translation/Provider/NullProviderFactory.php b/dependencies/symfony/translation/Provider/NullProviderFactory.php deleted file mode 100644 index d5affec..0000000 --- a/dependencies/symfony/translation/Provider/NullProviderFactory.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; -/** - * @author Mathieu Santostefano - */ -final class NullProviderFactory extends \Symfony\Component\Translation\Provider\AbstractProviderFactory -{ - public function create(\Symfony\Component\Translation\Provider\Dsn $dsn) : \Symfony\Component\Translation\Provider\ProviderInterface - { - if ('null' === $dsn->getScheme()) { - return new \Symfony\Component\Translation\Provider\NullProvider(); - } - throw new UnsupportedSchemeException($dsn, 'null', $this->getSupportedSchemes()); - } - protected function getSupportedSchemes() : array - { - return ['null']; - } -} diff --git a/dependencies/symfony/translation/Provider/ProviderFactoryInterface.php b/dependencies/symfony/translation/Provider/ProviderFactoryInterface.php deleted file mode 100644 index 0510cbe..0000000 --- a/dependencies/symfony/translation/Provider/ProviderFactoryInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\IncompleteDsnException; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; -interface ProviderFactoryInterface -{ - /** - * @throws UnsupportedSchemeException - * @throws IncompleteDsnException - */ - public function create(\Symfony\Component\Translation\Provider\Dsn $dsn) : \Symfony\Component\Translation\Provider\ProviderInterface; - public function supports(\Symfony\Component\Translation\Provider\Dsn $dsn) : bool; -} diff --git a/dependencies/symfony/translation/Provider/ProviderInterface.php b/dependencies/symfony/translation/Provider/ProviderInterface.php deleted file mode 100644 index ee455c5..0000000 --- a/dependencies/symfony/translation/Provider/ProviderInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; -interface ProviderInterface -{ - public function __toString() : string; - /** - * Translations available in the TranslatorBag only must be created. - * Translations available in both the TranslatorBag and on the provider - * must be overwritten. - * Translations available on the provider only must be kept. - */ - public function write(TranslatorBagInterface $translatorBag) : void; - public function read(array $domains, array $locales) : TranslatorBag; - public function delete(TranslatorBagInterface $translatorBag) : void; -} diff --git a/dependencies/symfony/translation/Provider/TranslationProviderCollection.php b/dependencies/symfony/translation/Provider/TranslationProviderCollection.php deleted file mode 100644 index b3ca5a5..0000000 --- a/dependencies/symfony/translation/Provider/TranslationProviderCollection.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -/** - * @author Mathieu Santostefano - */ -final class TranslationProviderCollection -{ - /** - * @var array - */ - private $providers; - /** - * @param array $providers - */ - public function __construct(iterable $providers) - { - $this->providers = \is_array($providers) ? $providers : \iterator_to_array($providers); - } - public function __toString() : string - { - return '[' . \implode(',', \array_keys($this->providers)) . ']'; - } - public function has(string $name) : bool - { - return isset($this->providers[$name]); - } - public function get(string $name) : \Symfony\Component\Translation\Provider\ProviderInterface - { - if (!$this->has($name)) { - throw new InvalidArgumentException(\sprintf('Provider "%s" not found. Available: "%s".', $name, (string) $this)); - } - return $this->providers[$name]; - } - public function keys() : array - { - return \array_keys($this->providers); - } -} diff --git a/dependencies/symfony/translation/Provider/TranslationProviderCollectionFactory.php b/dependencies/symfony/translation/Provider/TranslationProviderCollectionFactory.php deleted file mode 100644 index fae061b..0000000 --- a/dependencies/symfony/translation/Provider/TranslationProviderCollectionFactory.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Provider; - -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; -/** - * @author Mathieu Santostefano - */ -class TranslationProviderCollectionFactory -{ - private iterable $factories; - private array $enabledLocales; - /** - * @param iterable $factories - */ - public function __construct(iterable $factories, array $enabledLocales) - { - $this->factories = $factories; - $this->enabledLocales = $enabledLocales; - } - public function fromConfig(array $config) : \Symfony\Component\Translation\Provider\TranslationProviderCollection - { - $providers = []; - foreach ($config as $name => $currentConfig) { - $providers[$name] = $this->fromDsnObject(new \Symfony\Component\Translation\Provider\Dsn($currentConfig['dsn']), !$currentConfig['locales'] ? $this->enabledLocales : $currentConfig['locales'], !$currentConfig['domains'] ? [] : $currentConfig['domains']); - } - return new \Symfony\Component\Translation\Provider\TranslationProviderCollection($providers); - } - public function fromDsnObject(\Symfony\Component\Translation\Provider\Dsn $dsn, array $locales, array $domains = []) : \Symfony\Component\Translation\Provider\ProviderInterface - { - foreach ($this->factories as $factory) { - if ($factory->supports($dsn)) { - return new \Symfony\Component\Translation\Provider\FilteringProvider($factory->create($dsn), $locales, $domains); - } - } - throw new UnsupportedSchemeException($dsn); - } -} diff --git a/dependencies/symfony/translation/PseudoLocalizationTranslator.php b/dependencies/symfony/translation/PseudoLocalizationTranslator.php deleted file mode 100644 index 9b6500d..0000000 --- a/dependencies/symfony/translation/PseudoLocalizationTranslator.php +++ /dev/null @@ -1,209 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -/** - * This translator should only be used in a development environment. - */ -final class PseudoLocalizationTranslator implements TranslatorInterface -{ - private const EXPANSION_CHARACTER = '~'; - private TranslatorInterface $translator; - private bool $accents; - private float $expansionFactor; - private bool $brackets; - private bool $parseHTML; - /** - * @var string[] - */ - private array $localizableHTMLAttributes; - /** - * Available options: - * * accents: - * type: boolean - * default: true - * description: replace ASCII characters of the translated string with accented versions or similar characters - * example: if true, "foo" => "ƒöö". - * - * * expansion_factor: - * type: float - * default: 1 - * validation: it must be greater than or equal to 1 - * description: expand the translated string by the given factor with spaces and tildes - * example: if 2, "foo" => "~foo ~" - * - * * brackets: - * type: boolean - * default: true - * description: wrap the translated string with brackets - * example: if true, "foo" => "[foo]" - * - * * parse_html: - * type: boolean - * default: false - * description: parse the translated string as HTML - looking for HTML tags has a performance impact but allows to preserve them from alterations - it also allows to compute the visible translated string length which is useful to correctly expand ot when it contains HTML - * warning: unclosed tags are unsupported, they will be fixed (closed) by the parser - eg, "foo
      bar" => "foo
      bar
      " - * - * * localizable_html_attributes: - * type: string[] - * default: [] - * description: the list of HTML attributes whose values can be altered - it is only useful when the "parse_html" option is set to true - * example: if ["title"], and with the "accents" option set to true, "Profile" => "Þŕöƒîļé" - if "title" was not in the "localizable_html_attributes" list, the title attribute data would be left unchanged. - */ - public function __construct(TranslatorInterface $translator, array $options = []) - { - $this->translator = $translator; - $this->accents = $options['accents'] ?? \true; - if (1.0 > ($this->expansionFactor = $options['expansion_factor'] ?? 1.0)) { - throw new \InvalidArgumentException('The expansion factor must be greater than or equal to 1.'); - } - $this->brackets = $options['brackets'] ?? \true; - $this->parseHTML = $options['parse_html'] ?? \false; - if ($this->parseHTML && !$this->accents && 1.0 === $this->expansionFactor) { - $this->parseHTML = \false; - } - $this->localizableHTMLAttributes = $options['localizable_html_attributes'] ?? []; - } - public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null) : string - { - $trans = ''; - $visibleText = ''; - foreach ($this->getParts($this->translator->trans($id, $parameters, $domain, $locale)) as [$visible, $localizable, $text]) { - if ($visible) { - $visibleText .= $text; - } - if (!$localizable) { - $trans .= $text; - continue; - } - $this->addAccents($trans, $text); - } - $this->expand($trans, $visibleText); - $this->addBrackets($trans); - return $trans; - } - public function getLocale() : string - { - return $this->translator->getLocale(); - } - private function getParts(string $originalTrans) : array - { - if (!$this->parseHTML) { - return [[\true, \true, $originalTrans]]; - } - $html = \mb_encode_numericentity($originalTrans, [0x80, 0xffff, 0, 0xffff], \mb_detect_encoding($originalTrans, null, \true) ?: 'UTF-8'); - $useInternalErrors = \libxml_use_internal_errors(\true); - $dom = new \DOMDocument(); - $dom->loadHTML('' . $html . ''); - \libxml_clear_errors(); - \libxml_use_internal_errors($useInternalErrors); - return $this->parseNode($dom->childNodes->item(1)->childNodes->item(0)->childNodes->item(0)); - } - private function parseNode(\DOMNode $node) : array - { - $parts = []; - foreach ($node->childNodes as $childNode) { - if (!$childNode instanceof \DOMElement) { - $parts[] = [\true, \true, $childNode->nodeValue]; - continue; - } - $parts[] = [\false, \false, '<' . $childNode->tagName]; - /** @var \DOMAttr $attribute */ - foreach ($childNode->attributes as $attribute) { - $parts[] = [\false, \false, ' ' . $attribute->nodeName . '="']; - $localizableAttribute = \in_array($attribute->nodeName, $this->localizableHTMLAttributes, \true); - foreach (\preg_split('/(&(?:amp|quot|#039|lt|gt);+)/', \htmlspecialchars($attribute->nodeValue, \ENT_QUOTES, 'UTF-8'), -1, \PREG_SPLIT_DELIM_CAPTURE) as $i => $match) { - if ('' === $match) { - continue; - } - $parts[] = [\false, $localizableAttribute && 0 === $i % 2, $match]; - } - $parts[] = [\false, \false, '"']; - } - $parts[] = [\false, \false, '>']; - $parts = \array_merge($parts, $this->parseNode($childNode, $parts)); - $parts[] = [\false, \false, 'tagName . '>']; - } - return $parts; - } - private function addAccents(string &$trans, string $text) : void - { - $trans .= $this->accents ? \strtr($text, [' ' => ' ', '!' => '¡', '"' => '″', '#' => '♯', '$' => '€', '%' => '‰', '&' => '⅋', '\'' => '´', '(' => '{', ')' => '}', '*' => '⁎', '+' => '⁺', ',' => '،', '-' => '‐', '.' => '·', '/' => '⁄', '0' => '⓪', '1' => '①', '2' => '②', '3' => '③', '4' => '④', '5' => '⑤', '6' => '⑥', '7' => '⑦', '8' => '⑧', '9' => '⑨', ':' => '∶', ';' => '⁏', '<' => '≤', '=' => '≂', '>' => '≥', '?' => '¿', '@' => '՞', 'A' => 'Å', 'B' => 'Ɓ', 'C' => 'Ç', 'D' => 'Ð', 'E' => 'É', 'F' => 'Ƒ', 'G' => 'Ĝ', 'H' => 'Ĥ', 'I' => 'Î', 'J' => 'Ĵ', 'K' => 'Ķ', 'L' => 'Ļ', 'M' => 'Ṁ', 'N' => 'Ñ', 'O' => 'Ö', 'P' => 'Þ', 'Q' => 'Ǫ', 'R' => 'Ŕ', 'S' => 'Š', 'T' => 'Ţ', 'U' => 'Û', 'V' => 'Ṽ', 'W' => 'Ŵ', 'X' => 'Ẋ', 'Y' => 'Ý', 'Z' => 'Ž', '[' => '⁅', '\\' => '∖', ']' => '⁆', '^' => '˄', '_' => '‿', '`' => '‵', 'a' => 'å', 'b' => 'ƀ', 'c' => 'ç', 'd' => 'ð', 'e' => 'é', 'f' => 'ƒ', 'g' => 'ĝ', 'h' => 'ĥ', 'i' => 'î', 'j' => 'ĵ', 'k' => 'ķ', 'l' => 'ļ', 'm' => 'ɱ', 'n' => 'ñ', 'o' => 'ö', 'p' => 'þ', 'q' => 'ǫ', 'r' => 'ŕ', 's' => 'š', 't' => 'ţ', 'u' => 'û', 'v' => 'ṽ', 'w' => 'ŵ', 'x' => 'ẋ', 'y' => 'ý', 'z' => 'ž', '{' => '(', '|' => '¦', '}' => ')', '~' => '˞']) : $text; - } - private function expand(string &$trans, string $visibleText) : void - { - if (1.0 >= $this->expansionFactor) { - return; - } - $visibleLength = $this->strlen($visibleText); - $missingLength = (int) \ceil($visibleLength * $this->expansionFactor) - $visibleLength; - if ($this->brackets) { - $missingLength -= 2; - } - if (0 >= $missingLength) { - return; - } - $words = []; - $wordsCount = 0; - foreach (\preg_split('/ +/', $visibleText, -1, \PREG_SPLIT_NO_EMPTY) as $word) { - $wordLength = $this->strlen($word); - if ($wordLength >= $missingLength) { - continue; - } - if (!isset($words[$wordLength])) { - $words[$wordLength] = 0; - } - ++$words[$wordLength]; - ++$wordsCount; - } - if (!$words) { - $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' ' . \str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1); - return; - } - \arsort($words, \SORT_NUMERIC); - $longestWordLength = \max(\array_keys($words)); - while (\true) { - $r = \mt_rand(1, $wordsCount); - foreach ($words as $length => $count) { - $r -= $count; - if ($r <= 0) { - break; - } - } - $trans .= ' ' . \str_repeat(self::EXPANSION_CHARACTER, $length); - $missingLength -= $length + 1; - if (0 === $missingLength) { - return; - } - while ($longestWordLength >= $missingLength) { - $wordsCount -= $words[$longestWordLength]; - unset($words[$longestWordLength]); - if (!$words) { - $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' ' . \str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1); - return; - } - $longestWordLength = \max(\array_keys($words)); - } - } - } - private function addBrackets(string &$trans) : void - { - if (!$this->brackets) { - return; - } - $trans = '[' . $trans . ']'; - } - private function strlen(string $s) : int - { - return \false === ($encoding = \mb_detect_encoding($s, null, \true)) ? \strlen($s) : \mb_strlen($s, $encoding); - } -} diff --git a/dependencies/symfony/translation/Reader/TranslationReader.php b/dependencies/symfony/translation/Reader/TranslationReader.php deleted file mode 100644 index 3ab582c..0000000 --- a/dependencies/symfony/translation/Reader/TranslationReader.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Reader; - -use WP_Ultimo\Dependencies\Symfony\Component\Finder\Finder; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\MessageCatalogue; -/** - * TranslationReader reads translation messages from translation files. - * - * @author Michel Salib - */ -class TranslationReader implements \Symfony\Component\Translation\Reader\TranslationReaderInterface -{ - /** - * Loaders used for import. - * - * @var array - */ - private array $loaders = []; - /** - * Adds a loader to the translation extractor. - * - * @param string $format The format of the loader - * - * @return void - */ - public function addLoader(string $format, LoaderInterface $loader) - { - $this->loaders[$format] = $loader; - } - /** - * @return void - */ - public function read(string $directory, MessageCatalogue $catalogue) - { - if (!\is_dir($directory)) { - return; - } - foreach ($this->loaders as $format => $loader) { - // load any existing translation files - $finder = new Finder(); - $extension = $catalogue->getLocale() . '.' . $format; - $files = $finder->files()->name('*.' . $extension)->in($directory); - foreach ($files as $file) { - $domain = \substr($file->getFilename(), 0, -1 * \strlen($extension) - 1); - $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain)); - } - } - } -} diff --git a/dependencies/symfony/translation/Reader/TranslationReaderInterface.php b/dependencies/symfony/translation/Reader/TranslationReaderInterface.php deleted file mode 100644 index 6254990..0000000 --- a/dependencies/symfony/translation/Reader/TranslationReaderInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Reader; - -use Symfony\Component\Translation\MessageCatalogue; -/** - * TranslationReader reads translation messages from translation files. - * - * @author Tobias Nyholm - */ -interface TranslationReaderInterface -{ - /** - * Reads translation messages from a directory to the catalogue. - * - * @return void - */ - public function read(string $directory, MessageCatalogue $catalogue); -} diff --git a/dependencies/symfony/translation/Resources/data/parents.json b/dependencies/symfony/translation/Resources/data/parents.json deleted file mode 100644 index 32a33cd..0000000 --- a/dependencies/symfony/translation/Resources/data/parents.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "az_Cyrl": "root", - "bs_Cyrl": "root", - "en_150": "en_001", - "en_AG": "en_001", - "en_AI": "en_001", - "en_AT": "en_150", - "en_AU": "en_001", - "en_BB": "en_001", - "en_BE": "en_150", - "en_BM": "en_001", - "en_BS": "en_001", - "en_BW": "en_001", - "en_BZ": "en_001", - "en_CC": "en_001", - "en_CH": "en_150", - "en_CK": "en_001", - "en_CM": "en_001", - "en_CX": "en_001", - "en_CY": "en_001", - "en_DE": "en_150", - "en_DG": "en_001", - "en_DK": "en_150", - "en_DM": "en_001", - "en_ER": "en_001", - "en_FI": "en_150", - "en_FJ": "en_001", - "en_FK": "en_001", - "en_FM": "en_001", - "en_GB": "en_001", - "en_GD": "en_001", - "en_GG": "en_001", - "en_GH": "en_001", - "en_GI": "en_001", - "en_GM": "en_001", - "en_GY": "en_001", - "en_HK": "en_001", - "en_IE": "en_001", - "en_IL": "en_001", - "en_IM": "en_001", - "en_IN": "en_001", - "en_IO": "en_001", - "en_JE": "en_001", - "en_JM": "en_001", - "en_KE": "en_001", - "en_KI": "en_001", - "en_KN": "en_001", - "en_KY": "en_001", - "en_LC": "en_001", - "en_LR": "en_001", - "en_LS": "en_001", - "en_MG": "en_001", - "en_MO": "en_001", - "en_MS": "en_001", - "en_MT": "en_001", - "en_MU": "en_001", - "en_MV": "en_001", - "en_MW": "en_001", - "en_MY": "en_001", - "en_NA": "en_001", - "en_NF": "en_001", - "en_NG": "en_001", - "en_NL": "en_150", - "en_NR": "en_001", - "en_NU": "en_001", - "en_NZ": "en_001", - "en_PG": "en_001", - "en_PK": "en_001", - "en_PN": "en_001", - "en_PW": "en_001", - "en_RW": "en_001", - "en_SB": "en_001", - "en_SC": "en_001", - "en_SD": "en_001", - "en_SE": "en_150", - "en_SG": "en_001", - "en_SH": "en_001", - "en_SI": "en_150", - "en_SL": "en_001", - "en_SS": "en_001", - "en_SX": "en_001", - "en_SZ": "en_001", - "en_TC": "en_001", - "en_TK": "en_001", - "en_TO": "en_001", - "en_TT": "en_001", - "en_TV": "en_001", - "en_TZ": "en_001", - "en_UG": "en_001", - "en_VC": "en_001", - "en_VG": "en_001", - "en_VU": "en_001", - "en_WS": "en_001", - "en_ZA": "en_001", - "en_ZM": "en_001", - "en_ZW": "en_001", - "es_AR": "es_419", - "es_BO": "es_419", - "es_BR": "es_419", - "es_BZ": "es_419", - "es_CL": "es_419", - "es_CO": "es_419", - "es_CR": "es_419", - "es_CU": "es_419", - "es_DO": "es_419", - "es_EC": "es_419", - "es_GT": "es_419", - "es_HN": "es_419", - "es_MX": "es_419", - "es_NI": "es_419", - "es_PA": "es_419", - "es_PE": "es_419", - "es_PR": "es_419", - "es_PY": "es_419", - "es_SV": "es_419", - "es_US": "es_419", - "es_UY": "es_419", - "es_VE": "es_419", - "ff_Adlm": "root", - "hi_Latn": "en_IN", - "ks_Deva": "root", - "nb": "no", - "nn": "no", - "pa_Arab": "root", - "pt_AO": "pt_PT", - "pt_CH": "pt_PT", - "pt_CV": "pt_PT", - "pt_GQ": "pt_PT", - "pt_GW": "pt_PT", - "pt_LU": "pt_PT", - "pt_MO": "pt_PT", - "pt_MZ": "pt_PT", - "pt_ST": "pt_PT", - "pt_TL": "pt_PT", - "sd_Deva": "root", - "sr_Latn": "root", - "uz_Arab": "root", - "uz_Cyrl": "root", - "zh_Hant": "root", - "zh_Hant_MO": "zh_Hant_HK" -} diff --git a/dependencies/symfony/translation/Resources/functions.php b/dependencies/symfony/translation/Resources/functions.php deleted file mode 100644 index 433d06b..0000000 --- a/dependencies/symfony/translation/Resources/functions.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -if (!\function_exists(\Symfony\Component\Translation\t::class)) { - /** - * @author Nate Wiebe - */ - function t(string $message, array $parameters = [], string $domain = null) : \Symfony\Component\Translation\TranslatableMessage - { - return new \Symfony\Component\Translation\TranslatableMessage($message, $parameters, $domain); - } -} diff --git a/dependencies/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd b/dependencies/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd deleted file mode 100644 index 1f38de7..0000000 --- a/dependencies/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd +++ /dev/null @@ -1,2261 +0,0 @@ - - - - - - - - - - - - - - Values for the attribute 'context-type'. - - - - - Indicates a database content. - - - - - Indicates the content of an element within an XML document. - - - - - Indicates the name of an element within an XML document. - - - - - Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found. - - - - - Indicates a the number of parameters contained within the <source>. - - - - - Indicates notes pertaining to the parameters in the <source>. - - - - - Indicates the content of a record within a database. - - - - - Indicates the name of a record within a database. - - - - - Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file. - - - - - - - Values for the attribute 'count-type'. - - - - - Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts. - - - - - Indicates the count units are translation units existing already in the same document. - - - - - Indicates a total count. - - - - - - - Values for the attribute 'ctype' when used other elements than <ph> or <x>. - - - - - Indicates a run of bolded text. - - - - - Indicates a run of text in italics. - - - - - Indicates a run of underlined text. - - - - - Indicates a run of hyper-text. - - - - - - - Values for the attribute 'ctype' when used with <ph> or <x>. - - - - - Indicates a inline image. - - - - - Indicates a page break. - - - - - Indicates a line break. - - - - - - - - - - - - Values for the attribute 'datatype'. - - - - - Indicates Active Server Page data. - - - - - Indicates C source file data. - - - - - Indicates Channel Definition Format (CDF) data. - - - - - Indicates ColdFusion data. - - - - - Indicates C++ source file data. - - - - - Indicates C-Sharp data. - - - - - Indicates strings from C, ASM, and driver files data. - - - - - Indicates comma-separated values data. - - - - - Indicates database data. - - - - - Indicates portions of document that follows data and contains metadata. - - - - - Indicates portions of document that precedes data and contains metadata. - - - - - Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import). - - - - - Indicates standard user input screen data. - - - - - Indicates HyperText Markup Language (HTML) data - document instance. - - - - - Indicates content within an HTML document’s <body> element. - - - - - Indicates Windows INI file data. - - - - - Indicates Interleaf data. - - - - - Indicates Java source file data (extension '.java'). - - - - - Indicates Java property resource bundle data. - - - - - Indicates Java list resource bundle data. - - - - - Indicates JavaScript source file data. - - - - - Indicates JScript source file data. - - - - - Indicates information relating to formatting. - - - - - Indicates LISP source file data. - - - - - Indicates information relating to margin formats. - - - - - Indicates a file containing menu. - - - - - Indicates numerically identified string table. - - - - - Indicates Maker Interchange Format (MIF) data. - - - - - Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute. - - - - - Indicates GNU Machine Object data. - - - - - Indicates Message Librarian strings created by Novell's Message Librarian Tool. - - - - - Indicates information to be displayed at the bottom of each page of a document. - - - - - Indicates information to be displayed at the top of each page of a document. - - - - - Indicates a list of property values (e.g., settings within INI files or preferences dialog). - - - - - Indicates Pascal source file data. - - - - - Indicates Hypertext Preprocessor data. - - - - - Indicates plain text file (no formatting other than, possibly, wrapping). - - - - - Indicates GNU Portable Object file. - - - - - Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc. - - - - - Indicates Windows .NET binary resources. - - - - - Indicates Windows .NET Resources. - - - - - Indicates Rich Text Format (RTF) data. - - - - - Indicates Standard Generalized Markup Language (SGML) data - document instance. - - - - - Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD). - - - - - Indicates Scalable Vector Graphic (SVG) data. - - - - - Indicates VisualBasic Script source file. - - - - - Indicates warning message. - - - - - Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file). - - - - - Indicates Extensible HyperText Markup Language (XHTML) data - document instance. - - - - - Indicates Extensible Markup Language (XML) data - document instance. - - - - - Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD). - - - - - Indicates Extensible Stylesheet Language (XSL) data. - - - - - Indicates XUL elements. - - - - - - - Values for the attribute 'mtype'. - - - - - Indicates the marked text is an abbreviation. - - - - - ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept. - - - - - ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective'). - - - - - ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging'). - - - - - ISO-12620: A proper-name term, such as the name of an agency or other proper entity. - - - - - ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another. - - - - - ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language. - - - - - Indicates the marked text is a date and/or time. - - - - - ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign. - - - - - ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form. - - - - - ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula. - - - - - ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record. - - - - - ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy'). - - - - - ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body. - - - - - ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages. - - - - - ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like. - - - - - ISO-12620 2.1.17: A unit to track object. - - - - - Indicates the marked text is a name. - - - - - ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others. - - - - - ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system. - - - - - Indicates the marked text is a phrase. - - - - - ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase. - - - - - Indicates the marked text should not be translated. - - - - - ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet. - - - - - Indicates that the marked text represents a segment. - - - - - ISO-12620 2.1.18.2: A fixed, lexicalized phrase. - - - - - ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs'). - - - - - ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system. - - - - - ISO-12620 2.1.19: A fixed chunk of recurring text. - - - - - ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof. - - - - - ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry. - - - - - ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language. - - - - - Indicates the marked text is a term. - - - - - ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted. - - - - - ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system. - - - - - ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza'). - - - - - ISO-12620 2.1.9: One of the alternate forms of a term. - - - - - - - Values for the attribute 'restype'. - - - - - Indicates a Windows RC AUTO3STATE control. - - - - - Indicates a Windows RC AUTOCHECKBOX control. - - - - - Indicates a Windows RC AUTORADIOBUTTON control. - - - - - Indicates a Windows RC BEDIT control. - - - - - Indicates a bitmap, for example a BITMAP resource in Windows. - - - - - Indicates a button object, for example a BUTTON control Windows. - - - - - Indicates a caption, such as the caption of a dialog box. - - - - - Indicates the cell in a table, for example the content of the <td> element in HTML. - - - - - Indicates check box object, for example a CHECKBOX control in Windows. - - - - - Indicates a menu item with an associated checkbox. - - - - - Indicates a list box, but with a check-box for each item. - - - - - Indicates a color selection dialog. - - - - - Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows. - - - - - Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234). - - - - - Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403). - - - - - Indicates a UI base class element that cannot be represented by any other element. - - - - - Indicates a context menu. - - - - - Indicates a Windows RC CTEXT control. - - - - - Indicates a cursor, for example a CURSOR resource in Windows. - - - - - Indicates a date/time picker. - - - - - Indicates a Windows RC DEFPUSHBUTTON control. - - - - - Indicates a dialog box. - - - - - Indicates a Windows RC DLGINIT resource block. - - - - - Indicates an edit box object, for example an EDIT control in Windows. - - - - - Indicates a filename. - - - - - Indicates a file dialog. - - - - - Indicates a footnote. - - - - - Indicates a font name. - - - - - Indicates a footer. - - - - - Indicates a frame object. - - - - - Indicates a XUL grid element. - - - - - Indicates a groupbox object, for example a GROUPBOX control in Windows. - - - - - Indicates a header item. - - - - - Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML. - - - - - Indicates a Windows RC HEDIT control. - - - - - Indicates a horizontal scrollbar. - - - - - Indicates an icon, for example an ICON resource in Windows. - - - - - Indicates a Windows RC IEDIT control. - - - - - Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF. - - - - - Indicates a label object. - - - - - Indicates a label that is also a HTML link (not necessarily a URL). - - - - - Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML). - - - - - Indicates a listbox object, for example an LISTBOX control in Windows. - - - - - Indicates an list item (an entry in a list). - - - - - Indicates a Windows RC LTEXT control. - - - - - Indicates a menu (a group of menu-items). - - - - - Indicates a toolbar containing one or more tope level menus. - - - - - Indicates a menu item (an entry in a menu). - - - - - Indicates a XUL menuseparator element. - - - - - Indicates a message, for example an entry in a MESSAGETABLE resource in Windows. - - - - - Indicates a calendar control. - - - - - Indicates an edit box beside a spin control. - - - - - Indicates a catch all for rectangular areas. - - - - - Indicates a standalone menu not necessarily associated with a menubar. - - - - - Indicates a pushbox object, for example a PUSHBOX control in Windows. - - - - - Indicates a Windows RC PUSHBUTTON control. - - - - - Indicates a radio button object. - - - - - Indicates a menuitem with associated radio button. - - - - - Indicates raw data resources for an application. - - - - - Indicates a row in a table. - - - - - Indicates a Windows RC RTEXT control. - - - - - Indicates a user navigable container used to show a portion of a document. - - - - - Indicates a generic divider object (e.g. menu group separator). - - - - - Windows accelerators, shortcuts in resource or property files. - - - - - Indicates a UI control to indicate process activity but not progress. - - - - - Indicates a splitter bar. - - - - - Indicates a Windows RC STATE3 control. - - - - - Indicates a window for providing feedback to the users, like 'read-only', etc. - - - - - Indicates a string, for example an entry in a STRINGTABLE resource in Windows. - - - - - Indicates a layers of controls with a tab to select layers. - - - - - Indicates a display and edits regular two-dimensional tables of cells. - - - - - Indicates a XUL textbox element. - - - - - Indicates a UI button that can be toggled to on or off state. - - - - - Indicates an array of controls, usually buttons. - - - - - Indicates a pop up tool tip text. - - - - - Indicates a bar with a pointer indicating a position within a certain range. - - - - - Indicates a control that displays a set of hierarchical data. - - - - - Indicates a URI (URN or URL). - - - - - Indicates a Windows RC USERBUTTON control. - - - - - Indicates a user-defined control like CONTROL control in Windows. - - - - - Indicates the text of a variable. - - - - - Indicates version information about a resource like VERSIONINFO in Windows. - - - - - Indicates a vertical scrollbar. - - - - - Indicates a graphical window. - - - - - - - Values for the attribute 'size-unit'. - - - - - Indicates a size in 8-bit bytes. - - - - - Indicates a size in Unicode characters. - - - - - Indicates a size in columns. Used for HTML text area. - - - - - Indicates a size in centimeters. - - - - - Indicates a size in dialog units, as defined in Windows resources. - - - - - Indicates a size in 'font-size' units (as defined in CSS). - - - - - Indicates a size in 'x-height' units (as defined in CSS). - - - - - Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster' - - - - - Indicates a size in inches. - - - - - Indicates a size in millimeters. - - - - - Indicates a size in percentage. - - - - - Indicates a size in pixels. - - - - - Indicates a size in point. - - - - - Indicates a size in rows. Used for HTML text area. - - - - - - - Values for the attribute 'state'. - - - - - Indicates the terminating state. - - - - - Indicates only non-textual information needs adaptation. - - - - - Indicates both text and non-textual information needs adaptation. - - - - - Indicates only non-textual information needs review. - - - - - Indicates both text and non-textual information needs review. - - - - - Indicates that only the text of the item needs to be reviewed. - - - - - Indicates that the item needs to be translated. - - - - - Indicates that the item is new. For example, translation units that were not in a previous version of the document. - - - - - Indicates that changes are reviewed and approved. - - - - - Indicates that the item has been translated. - - - - - - - Values for the attribute 'state-qualifier'. - - - - - Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously. - - - - - Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.). - - - - - Indicates a match based on matching IDs (in addition to matching text). - - - - - Indicates a translation derived from a glossary. - - - - - Indicates a translation derived from existing translation. - - - - - Indicates a translation derived from machine translation. - - - - - Indicates a translation derived from a translation repository. - - - - - Indicates a translation derived from a translation memory. - - - - - Indicates the translation is suggested by machine translation. - - - - - Indicates that the item has been rejected because of incorrect grammar. - - - - - Indicates that the item has been rejected because it is incorrect. - - - - - Indicates that the item has been rejected because it is too long or too short. - - - - - Indicates that the item has been rejected because of incorrect spelling. - - - - - Indicates the translation is suggested by translation memory. - - - - - - - Values for the attribute 'unit'. - - - - - Refers to words. - - - - - Refers to pages. - - - - - Refers to <trans-unit> elements. - - - - - Refers to <bin-unit> elements. - - - - - Refers to glyphs. - - - - - Refers to <trans-unit> and/or <bin-unit> elements. - - - - - Refers to the occurrences of instances defined by the count-type value. - - - - - Refers to characters. - - - - - Refers to lines. - - - - - Refers to sentences. - - - - - Refers to paragraphs. - - - - - Refers to segments. - - - - - Refers to placeables (inline elements). - - - - - - - Values for the attribute 'priority'. - - - - - Highest priority. - - - - - High priority. - - - - - High priority, but not as important as 2. - - - - - High priority, but not as important as 3. - - - - - Medium priority, but more important than 6. - - - - - Medium priority, but less important than 5. - - - - - Low priority, but more important than 8. - - - - - Low priority, but more important than 9. - - - - - Low priority. - - - - - Lowest priority. - - - - - - - - - This value indicates that all properties can be reformatted. This value must be used alone. - - - - - This value indicates that no properties should be reformatted. This value must be used alone. - - - - - - - - - - - - - This value indicates that all information in the coord attribute can be modified. - - - - - This value indicates that the x information in the coord attribute can be modified. - - - - - This value indicates that the y information in the coord attribute can be modified. - - - - - This value indicates that the cx information in the coord attribute can be modified. - - - - - This value indicates that the cy information in the coord attribute can be modified. - - - - - This value indicates that all the information in the font attribute can be modified. - - - - - This value indicates that the name information in the font attribute can be modified. - - - - - This value indicates that the size information in the font attribute can be modified. - - - - - This value indicates that the weight information in the font attribute can be modified. - - - - - This value indicates that the information in the css-style attribute can be modified. - - - - - This value indicates that the information in the style attribute can be modified. - - - - - This value indicates that the information in the exstyle attribute can be modified. - - - - - - - - - - - - - Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document. - - - - - Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed. - - - - - Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed. - - - - - - - - - Represents a translation proposal from a translation memory or other resource. - - - - - Represents a previous version of the target element. - - - - - Represents a rejected version of the target element. - - - - - Represents a translation to be used for reference purposes only, for example from a related product or a different language. - - - - - Represents a proposed translation that was used for the translation of the trans-unit, possibly modified. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Values for the attribute 'coord'. - - - - - - - - Version values: 1.0 and 1.1 are allowed for backward compatibility. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/symfony/translation/Resources/schemas/xliff-core-2.0.xsd b/dependencies/symfony/translation/Resources/schemas/xliff-core-2.0.xsd deleted file mode 100644 index 963232f..0000000 --- a/dependencies/symfony/translation/Resources/schemas/xliff-core-2.0.xsd +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dependencies/symfony/translation/Resources/schemas/xml.xsd b/dependencies/symfony/translation/Resources/schemas/xml.xsd deleted file mode 100644 index a46162a..0000000 --- a/dependencies/symfony/translation/Resources/schemas/xml.xsd +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - -
      -

      About the XML namespace

      - -
      -

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

      -

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

      - -

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

      -

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

      -
      -
      - -
      -
      - - - - -
      - -

      lang (as an attribute name)

      -

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

      - -
      -
      -

      Notes

      -

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

      -

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

      -

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

      -
      -
      -
      - - - - - - - - - - -
      - - - - - -
      - -

      space (as an attribute name)

      -

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

      - -
      -
      -
      - - - - - - - -
      - - - - -
      - -

      base (as an attribute name)

      -

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

      - -

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

      - -
      -
      -
      -
      - - - - -
      - -

      id (as an attribute name)

      -

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

      - -

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

      -
      -
      -
      - -
      - - - - - - - - - - - -
      - -

      Father (in any context at all)

      - -
      -

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

      -
      -

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

      -
      -
      -
      -
      -
      - - - - -
      -

      About this schema document

      - -
      -

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

      - -

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

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

      - or -

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

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

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

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

      - -
      -
      -
      -
      - - - -
      -

      Versioning policy for this schema document

      - -
      -

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

      -

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

      - -

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

      -

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

      - -
      -
      -
      -
      - -
      diff --git a/dependencies/symfony/translation/Test/ProviderFactoryTestCase.php b/dependencies/symfony/translation/Test/ProviderFactoryTestCase.php deleted file mode 100644 index 4645554..0000000 --- a/dependencies/symfony/translation/Test/ProviderFactoryTestCase.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Test; - -use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\HttpClient\MockHttpClient; -use Symfony\Component\Translation\Dumper\XliffFileDumper; -use Symfony\Component\Translation\Exception\IncompleteDsnException; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\Provider\Dsn; -use Symfony\Component\Translation\Provider\ProviderFactoryInterface; -use Symfony\Component\Translation\TranslatorBagInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\HttpClient\HttpClientInterface; -/** - * A test case to ease testing a translation provider factory. - * - * @author Mathieu Santostefano - * - * @internal - */ -abstract class ProviderFactoryTestCase extends TestCase -{ - protected HttpClientInterface $client; - protected LoggerInterface|MockObject $logger; - protected string $defaultLocale; - protected LoaderInterface|MockObject $loader; - protected XliffFileDumper|MockObject $xliffFileDumper; - protected TranslatorBagInterface|MockObject $translatorBag; - public abstract function createFactory() : ProviderFactoryInterface; - /** - * @return iterable - */ - public static abstract function supportsProvider() : iterable; - /** - * @return iterable - */ - public static abstract function createProvider() : iterable; - /** - * @return iterable - */ - public static function unsupportedSchemeProvider() : iterable - { - return []; - } - /** - * @return iterable - */ - public static function incompleteDsnProvider() : iterable - { - return []; - } - /** - * @dataProvider supportsProvider - */ - public function testSupports(bool $expected, string $dsn) - { - $factory = $this->createFactory(); - $this->assertSame($expected, $factory->supports(new Dsn($dsn))); - } - /** - * @dataProvider createProvider - */ - public function testCreate(string $expected, string $dsn) - { - $factory = $this->createFactory(); - $provider = $factory->create(new Dsn($dsn)); - $this->assertSame($expected, (string) $provider); - } - /** - * @dataProvider unsupportedSchemeProvider - */ - public function testUnsupportedSchemeException(string $dsn, string $message = null) - { - $factory = $this->createFactory(); - $dsn = new Dsn($dsn); - $this->expectException(UnsupportedSchemeException::class); - if (null !== $message) { - $this->expectExceptionMessage($message); - } - $factory->create($dsn); - } - /** - * @dataProvider incompleteDsnProvider - */ - public function testIncompleteDsnException(string $dsn, string $message = null) - { - $factory = $this->createFactory(); - $dsn = new Dsn($dsn); - $this->expectException(IncompleteDsnException::class); - if (null !== $message) { - $this->expectExceptionMessage($message); - } - $factory->create($dsn); - } - protected function getClient() : HttpClientInterface - { - return $this->client ??= new MockHttpClient(); - } - protected function getLogger() : LoggerInterface - { - return $this->logger ??= $this->createMock(LoggerInterface::class); - } - protected function getDefaultLocale() : string - { - return $this->defaultLocale ??= 'en'; - } - protected function getLoader() : LoaderInterface - { - return $this->loader ??= $this->createMock(LoaderInterface::class); - } - protected function getXliffFileDumper() : XliffFileDumper - { - return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); - } - protected function getTranslatorBag() : TranslatorBagInterface - { - return $this->translatorBag ??= $this->createMock(TranslatorBagInterface::class); - } -} diff --git a/dependencies/symfony/translation/Test/ProviderTestCase.php b/dependencies/symfony/translation/Test/ProviderTestCase.php deleted file mode 100644 index 2f40bf5..0000000 --- a/dependencies/symfony/translation/Test/ProviderTestCase.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Test; - -use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; -use WP_Ultimo\Dependencies\Psr\Log\LoggerInterface; -use WP_Ultimo\Dependencies\Symfony\Component\HttpClient\MockHttpClient; -use Symfony\Component\Translation\Dumper\XliffFileDumper; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\Provider\ProviderInterface; -use Symfony\Component\Translation\TranslatorBagInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\HttpClient\HttpClientInterface; -/** - * A test case to ease testing a translation provider. - * - * @author Mathieu Santostefano - * - * @internal - */ -abstract class ProviderTestCase extends TestCase -{ - protected HttpClientInterface $client; - protected LoggerInterface|MockObject $logger; - protected string $defaultLocale; - protected LoaderInterface|MockObject $loader; - protected XliffFileDumper|MockObject $xliffFileDumper; - protected TranslatorBagInterface|MockObject $translatorBag; - public static abstract function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint) : ProviderInterface; - /** - * @return iterable - */ - public static abstract function toStringProvider() : iterable; - /** - * @dataProvider toStringProvider - */ - public function testToString(ProviderInterface $provider, string $expected) - { - $this->assertSame($expected, (string) $provider); - } - protected function getClient() : MockHttpClient - { - return $this->client ??= new MockHttpClient(); - } - protected function getLoader() : LoaderInterface - { - return $this->loader ??= $this->createMock(LoaderInterface::class); - } - protected function getLogger() : LoggerInterface - { - return $this->logger ??= $this->createMock(LoggerInterface::class); - } - protected function getDefaultLocale() : string - { - return $this->defaultLocale ??= 'en'; - } - protected function getXliffFileDumper() : XliffFileDumper - { - return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); - } - protected function getTranslatorBag() : TranslatorBagInterface - { - return $this->translatorBag ??= $this->createMock(TranslatorBagInterface::class); - } -} diff --git a/dependencies/symfony/translation/TranslatableMessage.php b/dependencies/symfony/translation/TranslatableMessage.php deleted file mode 100644 index f81d553..0000000 --- a/dependencies/symfony/translation/TranslatableMessage.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatableInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -/** - * @author Nate Wiebe - */ -class TranslatableMessage implements TranslatableInterface -{ - private string $message; - private array $parameters; - private ?string $domain; - public function __construct(string $message, array $parameters = [], string $domain = null) - { - $this->message = $message; - $this->parameters = $parameters; - $this->domain = $domain; - } - public function __toString() : string - { - return $this->getMessage(); - } - public function getMessage() : string - { - return $this->message; - } - public function getParameters() : array - { - return $this->parameters; - } - public function getDomain() : ?string - { - return $this->domain; - } - public function trans(TranslatorInterface $translator, string $locale = null) : string - { - return $translator->trans($this->getMessage(), \array_map(static fn($parameter) => $parameter instanceof TranslatableInterface ? $parameter->trans($translator, $locale) : $parameter, $this->getParameters()), $this->getDomain(), $locale); - } -} diff --git a/dependencies/symfony/translation/Translator.php b/dependencies/symfony/translation/Translator.php deleted file mode 100644 index c010b9c..0000000 --- a/dependencies/symfony/translation/Translator.php +++ /dev/null @@ -1,384 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use WP_Ultimo\Dependencies\Symfony\Component\Config\ConfigCacheFactory; -use WP_Ultimo\Dependencies\Symfony\Component\Config\ConfigCacheFactoryInterface; -use WP_Ultimo\Dependencies\Symfony\Component\Config\ConfigCacheInterface; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\NotFoundResourceException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\Formatter\IntlFormatterInterface; -use Symfony\Component\Translation\Formatter\MessageFormatter; -use Symfony\Component\Translation\Formatter\MessageFormatterInterface; -use Symfony\Component\Translation\Loader\LoaderInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\LocaleAwareInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatableInterface; -use WP_Ultimo\Dependencies\Symfony\Contracts\Translation\TranslatorInterface; -// Help opcache.preload discover always-needed symbols -\class_exists(\Symfony\Component\Translation\MessageCatalogue::class); -/** - * @author Fabien Potencier - */ -class Translator implements TranslatorInterface, \Symfony\Component\Translation\TranslatorBagInterface, LocaleAwareInterface -{ - /** - * @var MessageCatalogueInterface[] - */ - protected $catalogues = []; - private string $locale; - /** - * @var string[] - */ - private array $fallbackLocales = []; - /** - * @var LoaderInterface[] - */ - private array $loaders = []; - private array $resources = []; - private MessageFormatterInterface $formatter; - private ?string $cacheDir; - private bool $debug; - private array $cacheVary; - private ?ConfigCacheFactoryInterface $configCacheFactory; - private array $parentLocales; - private bool $hasIntlFormatter; - /** - * @throws InvalidArgumentException If a locale contains invalid characters - */ - public function __construct(string $locale, MessageFormatterInterface $formatter = null, string $cacheDir = null, bool $debug = \false, array $cacheVary = []) - { - $this->setLocale($locale); - $this->formatter = $formatter ??= new MessageFormatter(); - $this->cacheDir = $cacheDir; - $this->debug = $debug; - $this->cacheVary = $cacheVary; - $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface; - } - /** - * @return void - */ - public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) - { - $this->configCacheFactory = $configCacheFactory; - } - /** - * Adds a Loader. - * - * @param string $format The name of the loader (@see addResource()) - * - * @return void - */ - public function addLoader(string $format, LoaderInterface $loader) - { - $this->loaders[$format] = $loader; - } - /** - * Adds a Resource. - * - * @param string $format The name of the loader (@see addLoader()) - * @param mixed $resource The resource name - * - * @return void - * - * @throws InvalidArgumentException If the locale contains invalid characters - */ - public function addResource(string $format, mixed $resource, string $locale, string $domain = null) - { - $domain ??= 'messages'; - $this->assertValidLocale($locale); - $locale ?: ($locale = \class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); - $this->resources[$locale][] = [$format, $resource, $domain]; - if (\in_array($locale, $this->fallbackLocales)) { - $this->catalogues = []; - } else { - unset($this->catalogues[$locale]); - } - } - /** - * @return void - */ - public function setLocale(string $locale) - { - $this->assertValidLocale($locale); - $this->locale = $locale; - } - public function getLocale() : string - { - return $this->locale ?: (\class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); - } - /** - * Sets the fallback locales. - * - * @param string[] $locales - * - * @return void - * - * @throws InvalidArgumentException If a locale contains invalid characters - */ - public function setFallbackLocales(array $locales) - { - // needed as the fallback locales are linked to the already loaded catalogues - $this->catalogues = []; - foreach ($locales as $locale) { - $this->assertValidLocale($locale); - } - $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales; - } - /** - * Gets the fallback locales. - * - * @internal - */ - public function getFallbackLocales() : array - { - return $this->fallbackLocales; - } - public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) : string - { - if (null === $id || '' === $id) { - return ''; - } - $domain ??= 'messages'; - $catalogue = $this->getCatalogue($locale); - $locale = $catalogue->getLocale(); - while (!$catalogue->defines($id, $domain)) { - if ($cat = $catalogue->getFallbackCatalogue()) { - $catalogue = $cat; - $locale = $catalogue->getLocale(); - } else { - break; - } - } - $parameters = \array_map(fn($parameter) => $parameter instanceof TranslatableInterface ? $parameter->trans($this, $locale) : $parameter, $parameters); - $len = \strlen(\Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX); - if ($this->hasIntlFormatter && ($catalogue->defines($id, $domain . \Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX) || \strlen($domain) > $len && 0 === \substr_compare($domain, \Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX, -$len, $len))) { - return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters); - } - return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters); - } - public function getCatalogue(string $locale = null) : \Symfony\Component\Translation\MessageCatalogueInterface - { - if (!$locale) { - $locale = $this->getLocale(); - } else { - $this->assertValidLocale($locale); - } - if (!isset($this->catalogues[$locale])) { - $this->loadCatalogue($locale); - } - return $this->catalogues[$locale]; - } - public function getCatalogues() : array - { - return \array_values($this->catalogues); - } - /** - * Gets the loaders. - * - * @return LoaderInterface[] - */ - protected function getLoaders() : array - { - return $this->loaders; - } - /** - * @return void - */ - protected function loadCatalogue(string $locale) - { - if (null === $this->cacheDir) { - $this->initializeCatalogue($locale); - } else { - $this->initializeCacheCatalogue($locale); - } - } - /** - * @return void - */ - protected function initializeCatalogue(string $locale) - { - $this->assertValidLocale($locale); - try { - $this->doLoadCatalogue($locale); - } catch (NotFoundResourceException $e) { - if (!$this->computeFallbackLocales($locale)) { - throw $e; - } - } - $this->loadFallbackCatalogues($locale); - } - private function initializeCacheCatalogue(string $locale) : void - { - if (isset($this->catalogues[$locale])) { - /* Catalogue already initialized. */ - return; - } - $this->assertValidLocale($locale); - $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale), function (ConfigCacheInterface $cache) use($locale) { - $this->dumpCatalogue($locale, $cache); - }); - if (isset($this->catalogues[$locale])) { - /* Catalogue has been initialized as it was written out to cache. */ - return; - } - /* Read catalogue from cache. */ - $this->catalogues[$locale] = (include $cache->getPath()); - } - private function dumpCatalogue(string $locale, ConfigCacheInterface $cache) : void - { - $this->initializeCatalogue($locale); - $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]); - $content = \sprintf(<<getAllMessages($this->catalogues[$locale]), \true), $fallbackContent); - $cache->write($content, $this->catalogues[$locale]->getResources()); - } - private function getFallbackContent(\Symfony\Component\Translation\MessageCatalogue $catalogue) : string - { - $fallbackContent = ''; - $current = ''; - $replacementPattern = '/[^a-z0-9_]/i'; - $fallbackCatalogue = $catalogue->getFallbackCatalogue(); - while ($fallbackCatalogue) { - $fallback = $fallbackCatalogue->getLocale(); - $fallbackSuffix = \ucfirst(\preg_replace($replacementPattern, '_', $fallback)); - $currentSuffix = \ucfirst(\preg_replace($replacementPattern, '_', $current)); - $fallbackContent .= \sprintf(<<<'EOF' -$catalogue%s = new MessageCatalogue('%s', %s); -$catalogue%s->addFallbackCatalogue($catalogue%s); - -EOF -, $fallbackSuffix, $fallback, \var_export($this->getAllMessages($fallbackCatalogue), \true), $currentSuffix, $fallbackSuffix); - $current = $fallbackCatalogue->getLocale(); - $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); - } - return $fallbackContent; - } - private function getCatalogueCachePath(string $locale) : string - { - return $this->cacheDir . '/catalogue.' . $locale . '.' . \strtr(\substr(\base64_encode(\hash('sha256', \serialize($this->cacheVary), \true)), 0, 7), '/', '_') . '.php'; - } - /** - * @internal - */ - protected function doLoadCatalogue(string $locale) : void - { - $this->catalogues[$locale] = new \Symfony\Component\Translation\MessageCatalogue($locale); - if (isset($this->resources[$locale])) { - foreach ($this->resources[$locale] as $resource) { - if (!isset($this->loaders[$resource[0]])) { - if (\is_string($resource[1])) { - throw new RuntimeException(\sprintf('No loader is registered for the "%s" format when loading the "%s" resource.', $resource[0], $resource[1])); - } - throw new RuntimeException(\sprintf('No loader is registered for the "%s" format.', $resource[0])); - } - $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2])); - } - } - } - private function loadFallbackCatalogues(string $locale) : void - { - $current = $this->catalogues[$locale]; - foreach ($this->computeFallbackLocales($locale) as $fallback) { - if (!isset($this->catalogues[$fallback])) { - $this->initializeCatalogue($fallback); - } - $fallbackCatalogue = new \Symfony\Component\Translation\MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback])); - foreach ($this->catalogues[$fallback]->getResources() as $resource) { - $fallbackCatalogue->addResource($resource); - } - $current->addFallbackCatalogue($fallbackCatalogue); - $current = $fallbackCatalogue; - } - } - /** - * @return array - */ - protected function computeFallbackLocales(string $locale) - { - $this->parentLocales ??= \json_decode(\file_get_contents(__DIR__ . '/Resources/data/parents.json'), \true); - $originLocale = $locale; - $locales = []; - while ($locale) { - $parent = $this->parentLocales[$locale] ?? null; - if ($parent) { - $locale = 'root' !== $parent ? $parent : null; - } elseif (\function_exists('locale_parse')) { - $localeSubTags = \locale_parse($locale); - $locale = null; - if (1 < \count($localeSubTags)) { - \array_pop($localeSubTags); - $locale = \locale_compose($localeSubTags) ?: null; - } - } elseif ($i = \strrpos($locale, '_') ?: \strrpos($locale, '-')) { - $locale = \substr($locale, 0, $i); - } else { - $locale = null; - } - if (null !== $locale) { - $locales[] = $locale; - } - } - foreach ($this->fallbackLocales as $fallback) { - if ($fallback === $originLocale) { - continue; - } - $locales[] = $fallback; - } - return \array_unique($locales); - } - /** - * Asserts that the locale is valid, throws an Exception if not. - * - * @return void - * - * @throws InvalidArgumentException If the locale contains invalid characters - */ - protected function assertValidLocale(string $locale) - { - if (!\preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) { - throw new InvalidArgumentException(\sprintf('Invalid "%s" locale.', $locale)); - } - } - /** - * Provides the ConfigCache factory implementation, falling back to a - * default implementation if necessary. - */ - private function getConfigCacheFactory() : ConfigCacheFactoryInterface - { - $this->configCacheFactory ??= new ConfigCacheFactory($this->debug); - return $this->configCacheFactory; - } - private function getAllMessages(\Symfony\Component\Translation\MessageCatalogueInterface $catalogue) : array - { - $allMessages = []; - foreach ($catalogue->all() as $domain => $messages) { - if ($intlMessages = $catalogue->all($domain . \Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX)) { - $allMessages[$domain . \Symfony\Component\Translation\MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages; - $messages = \array_diff_key($messages, $intlMessages); - } - if ($messages) { - $allMessages[$domain] = $messages; - } - } - return $allMessages; - } -} diff --git a/dependencies/symfony/translation/TranslatorBag.php b/dependencies/symfony/translation/TranslatorBag.php deleted file mode 100644 index df2817f..0000000 --- a/dependencies/symfony/translation/TranslatorBag.php +++ /dev/null @@ -1,78 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use Symfony\Component\Translation\Catalogue\AbstractOperation; -use Symfony\Component\Translation\Catalogue\TargetOperation; -final class TranslatorBag implements \Symfony\Component\Translation\TranslatorBagInterface -{ - /** @var MessageCatalogue[] */ - private array $catalogues = []; - public function addCatalogue(\Symfony\Component\Translation\MessageCatalogue $catalogue) : void - { - if (null !== ($existingCatalogue = $this->getCatalogue($catalogue->getLocale()))) { - $catalogue->addCatalogue($existingCatalogue); - } - $this->catalogues[$catalogue->getLocale()] = $catalogue; - } - public function addBag(\Symfony\Component\Translation\TranslatorBagInterface $bag) : void - { - foreach ($bag->getCatalogues() as $catalogue) { - $this->addCatalogue($catalogue); - } - } - public function getCatalogue(string $locale = null) : \Symfony\Component\Translation\MessageCatalogueInterface - { - if (null === $locale || !isset($this->catalogues[$locale])) { - $this->catalogues[$locale] = new \Symfony\Component\Translation\MessageCatalogue($locale); - } - return $this->catalogues[$locale]; - } - public function getCatalogues() : array - { - return \array_values($this->catalogues); - } - public function diff(\Symfony\Component\Translation\TranslatorBagInterface $diffBag) : self - { - $diff = new self(); - foreach ($this->catalogues as $locale => $catalogue) { - if (null === ($diffCatalogue = $diffBag->getCatalogue($locale))) { - $diff->addCatalogue($catalogue); - continue; - } - $operation = new TargetOperation($diffCatalogue, $catalogue); - $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::NEW_BATCH); - $newCatalogue = new \Symfony\Component\Translation\MessageCatalogue($locale); - foreach ($catalogue->getDomains() as $domain) { - $newCatalogue->add($operation->getNewMessages($domain), $domain); - } - $diff->addCatalogue($newCatalogue); - } - return $diff; - } - public function intersect(\Symfony\Component\Translation\TranslatorBagInterface $intersectBag) : self - { - $diff = new self(); - foreach ($this->catalogues as $locale => $catalogue) { - if (null === ($intersectCatalogue = $intersectBag->getCatalogue($locale))) { - continue; - } - $operation = new TargetOperation($catalogue, $intersectCatalogue); - $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::OBSOLETE_BATCH); - $obsoleteCatalogue = new \Symfony\Component\Translation\MessageCatalogue($locale); - foreach ($operation->getDomains() as $domain) { - $obsoleteCatalogue->add(\array_diff($operation->getMessages($domain), $operation->getNewMessages($domain)), $domain); - } - $diff->addCatalogue($obsoleteCatalogue); - } - return $diff; - } -} diff --git a/dependencies/symfony/translation/TranslatorBagInterface.php b/dependencies/symfony/translation/TranslatorBagInterface.php deleted file mode 100644 index 389be1c..0000000 --- a/dependencies/symfony/translation/TranslatorBagInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -/** - * @author Abdellatif Ait boudad - */ -interface TranslatorBagInterface -{ - /** - * Gets the catalogue by locale. - * - * @param string|null $locale The locale or null to use the default - * - * @throws InvalidArgumentException If the locale contains invalid characters - */ - public function getCatalogue(string $locale = null) : \Symfony\Component\Translation\MessageCatalogueInterface; - /** - * Returns all catalogues of the instance. - * - * @return MessageCatalogueInterface[] - */ - public function getCatalogues() : array; -} diff --git a/dependencies/symfony/translation/Util/ArrayConverter.php b/dependencies/symfony/translation/Util/ArrayConverter.php deleted file mode 100644 index d9fcd1a..0000000 --- a/dependencies/symfony/translation/Util/ArrayConverter.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Util; - -/** - * ArrayConverter generates tree like structure from a message catalogue. - * e.g. this - * 'foo.bar1' => 'test1', - * 'foo.bar2' => 'test2' - * converts to follows: - * foo: - * bar1: test1 - * bar2: test2. - * - * @author Gennady Telegin - */ -class ArrayConverter -{ - /** - * Converts linear messages array to tree-like array. - * For example this array('foo.bar' => 'value') will be converted to ['foo' => ['bar' => 'value']]. - * - * @param array $messages Linear messages array - */ - public static function expandToTree(array $messages) : array - { - $tree = []; - foreach ($messages as $id => $value) { - $referenceToElement =& self::getElementByPath($tree, \explode('.', $id)); - $referenceToElement = $value; - unset($referenceToElement); - } - return $tree; - } - private static function &getElementByPath(array &$tree, array $parts) : mixed - { - $elem =& $tree; - $parentOfElem = null; - foreach ($parts as $i => $part) { - if (isset($elem[$part]) && \is_string($elem[$part])) { - /* Process next case: - * 'foo': 'test1', - * 'foo.bar': 'test2' - * - * $tree['foo'] was string before we found array {bar: test2}. - * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2'; - */ - $elem =& $elem[\implode('.', \array_slice($parts, $i))]; - break; - } - $parentOfElem =& $elem; - $elem =& $elem[$part]; - } - if ($elem && \is_array($elem) && $parentOfElem) { - /* Process next case: - * 'foo.bar': 'test1' - * 'foo': 'test2' - * - * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`. - * Cancel treating $tree['foo'] as array and cancel back it expansion, - * e.g. make it $tree['foo.bar'] = 'test1' again. - */ - self::cancelExpand($parentOfElem, $part, $elem); - } - return $elem; - } - private static function cancelExpand(array &$tree, string $prefix, array $node) : void - { - $prefix .= '.'; - foreach ($node as $id => $value) { - if (\is_string($value)) { - $tree[$prefix . $id] = $value; - } else { - self::cancelExpand($tree, $prefix . $id, $value); - } - } - } -} diff --git a/dependencies/symfony/translation/Util/XliffUtils.php b/dependencies/symfony/translation/Util/XliffUtils.php deleted file mode 100644 index 3c77b61..0000000 --- a/dependencies/symfony/translation/Util/XliffUtils.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Util; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\InvalidResourceException; -/** - * Provides some utility methods for XLIFF translation files, such as validating - * their contents according to the XSD schema. - * - * @author Fabien Potencier - */ -class XliffUtils -{ - /** - * Gets xliff file version based on the root "version" attribute. - * - * Defaults to 1.2 for backwards compatibility. - * - * @throws InvalidArgumentException - */ - public static function getVersionNumber(\DOMDocument $dom) : string - { - /** @var \DOMNode $xliff */ - foreach ($dom->getElementsByTagName('xliff') as $xliff) { - $version = $xliff->attributes->getNamedItem('version'); - if ($version) { - return $version->nodeValue; - } - $namespace = $xliff->attributes->getNamedItem('xmlns'); - if ($namespace) { - if (0 !== \substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) { - throw new InvalidArgumentException(\sprintf('Not a valid XLIFF namespace "%s".', $namespace)); - } - return \substr($namespace, 34); - } - } - // Falls back to v1.2 - return '1.2'; - } - /** - * Validates and parses the given file into a DOMDocument. - * - * @throws InvalidResourceException - */ - public static function validateSchema(\DOMDocument $dom) : array - { - $xliffVersion = static::getVersionNumber($dom); - $internalErrors = \libxml_use_internal_errors(\true); - if ($shouldEnable = self::shouldEnableEntityLoader()) { - $disableEntities = \libxml_disable_entity_loader(\false); - } - try { - $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion)); - if (!$isValid) { - return self::getXmlErrors($internalErrors); - } - } finally { - if ($shouldEnable) { - \libxml_disable_entity_loader($disableEntities); - } - } - $dom->normalizeDocument(); - \libxml_clear_errors(); - \libxml_use_internal_errors($internalErrors); - return []; - } - private static function shouldEnableEntityLoader() : bool - { - static $dom, $schema; - if (null === $dom) { - $dom = new \DOMDocument(); - $dom->loadXML(''); - $tmpfile = \tempnam(\sys_get_temp_dir(), 'symfony'); - \register_shutdown_function(static function () use($tmpfile) { - @\unlink($tmpfile); - }); - $schema = ' - - -'; - \file_put_contents($tmpfile, ' - - - -'); - } - return !@$dom->schemaValidateSource($schema); - } - public static function getErrorsAsString(array $xmlErrors) : string - { - $errorsAsString = ''; - foreach ($xmlErrors as $error) { - $errorsAsString .= \sprintf("[%s %s] %s (in %s - line %d, column %d)\n", \LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR', $error['code'], $error['message'], $error['file'], $error['line'], $error['column']); - } - return $errorsAsString; - } - private static function getSchema(string $xliffVersion) : string - { - if ('1.2' === $xliffVersion) { - $schemaSource = \file_get_contents(__DIR__ . '/../Resources/schemas/xliff-core-1.2-transitional.xsd'); - $xmlUri = 'http://www.w3.org/2001/xml.xsd'; - } elseif ('2.0' === $xliffVersion) { - $schemaSource = \file_get_contents(__DIR__ . '/../Resources/schemas/xliff-core-2.0.xsd'); - $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd'; - } else { - throw new InvalidArgumentException(\sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion)); - } - return self::fixXmlLocation($schemaSource, $xmlUri); - } - /** - * Internally changes the URI of a dependent xsd to be loaded locally. - */ - private static function fixXmlLocation(string $schemaSource, string $xmlUri) : string - { - $newPath = \str_replace('\\', '/', __DIR__) . '/../Resources/schemas/xml.xsd'; - $parts = \explode('/', $newPath); - $locationstart = 'file:///'; - if (0 === \stripos($newPath, 'phar://')) { - $tmpfile = \tempnam(\sys_get_temp_dir(), 'symfony'); - if ($tmpfile) { - \copy($newPath, $tmpfile); - $parts = \explode('/', \str_replace('\\', '/', $tmpfile)); - } else { - \array_shift($parts); - $locationstart = 'phar:///'; - } - } - $drive = '\\' === \DIRECTORY_SEPARATOR ? \array_shift($parts) . '/' : ''; - $newPath = $locationstart . $drive . \implode('/', \array_map('rawurlencode', $parts)); - return \str_replace($xmlUri, $newPath, $schemaSource); - } - /** - * Returns the XML errors of the internal XML parser. - */ - private static function getXmlErrors(bool $internalErrors) : array - { - $errors = []; - foreach (\libxml_get_errors() as $error) { - $errors[] = ['level' => \LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', 'code' => $error->code, 'message' => \trim($error->message), 'file' => $error->file ?: 'n/a', 'line' => $error->line, 'column' => $error->column]; - } - \libxml_clear_errors(); - \libxml_use_internal_errors($internalErrors); - return $errors; - } -} diff --git a/dependencies/symfony/translation/Writer/TranslationWriter.php b/dependencies/symfony/translation/Writer/TranslationWriter.php deleted file mode 100644 index 93eb994..0000000 --- a/dependencies/symfony/translation/Writer/TranslationWriter.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Writer; - -use Symfony\Component\Translation\Dumper\DumperInterface; -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\Exception\RuntimeException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * TranslationWriter writes translation messages. - * - * @author Michel Salib - */ -class TranslationWriter implements \Symfony\Component\Translation\Writer\TranslationWriterInterface -{ - /** - * @var array - */ - private array $dumpers = []; - /** - * Adds a dumper to the writer. - * - * @return void - */ - public function addDumper(string $format, DumperInterface $dumper) - { - $this->dumpers[$format] = $dumper; - } - /** - * Obtains the list of supported formats. - */ - public function getFormats() : array - { - return \array_keys($this->dumpers); - } - /** - * Writes translation from the catalogue according to the selected format. - * - * @param string $format The format to use to dump the messages - * @param array $options Options that are passed to the dumper - * - * @return void - * - * @throws InvalidArgumentException - */ - public function write(MessageCatalogue $catalogue, string $format, array $options = []) - { - if (!isset($this->dumpers[$format])) { - throw new InvalidArgumentException(\sprintf('There is no dumper associated with format "%s".', $format)); - } - // get the right dumper - $dumper = $this->dumpers[$format]; - if (isset($options['path']) && !\is_dir($options['path']) && !@\mkdir($options['path'], 0777, \true) && !\is_dir($options['path'])) { - throw new RuntimeException(\sprintf('Translation Writer was not able to create directory "%s".', $options['path'])); - } - // save - $dumper->dump($catalogue, $options); - } -} diff --git a/dependencies/symfony/translation/Writer/TranslationWriterInterface.php b/dependencies/symfony/translation/Writer/TranslationWriterInterface.php deleted file mode 100644 index 023ceff..0000000 --- a/dependencies/symfony/translation/Writer/TranslationWriterInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace Symfony\Component\Translation\Writer; - -use Symfony\Component\Translation\Exception\InvalidArgumentException; -use Symfony\Component\Translation\MessageCatalogue; -/** - * TranslationWriter writes translation messages. - * - * @author Michel Salib - */ -interface TranslationWriterInterface -{ - /** - * Writes translation from the catalogue according to the selected format. - * - * @param string $format The format to use to dump the messages - * @param array $options Options that are passed to the dumper - * - * @return void - * - * @throws InvalidArgumentException - */ - public function write(MessageCatalogue $catalogue, string $format, array $options = []); -} diff --git a/dependencies/symfony/var-exporter/Exception/ClassNotFoundException.php b/dependencies/symfony/var-exporter/Exception/ClassNotFoundException.php deleted file mode 100644 index ad67d86..0000000 --- a/dependencies/symfony/var-exporter/Exception/ClassNotFoundException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception; - -class ClassNotFoundException extends \Exception implements ExceptionInterface -{ - public function __construct(string $class, \Throwable $previous = null) - { - parent::__construct(\sprintf('Class "%s" not found.', $class), 0, $previous); - } -} diff --git a/dependencies/symfony/var-exporter/Exception/ExceptionInterface.php b/dependencies/symfony/var-exporter/Exception/ExceptionInterface.php deleted file mode 100644 index 20ece94..0000000 --- a/dependencies/symfony/var-exporter/Exception/ExceptionInterface.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception; - -interface ExceptionInterface extends \Throwable -{ -} diff --git a/dependencies/symfony/var-exporter/Exception/LogicException.php b/dependencies/symfony/var-exporter/Exception/LogicException.php deleted file mode 100644 index a5e82bb..0000000 --- a/dependencies/symfony/var-exporter/Exception/LogicException.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception; - -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/dependencies/symfony/var-exporter/Exception/NotInstantiableTypeException.php b/dependencies/symfony/var-exporter/Exception/NotInstantiableTypeException.php deleted file mode 100644 index 9c2aefd..0000000 --- a/dependencies/symfony/var-exporter/Exception/NotInstantiableTypeException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception; - -class NotInstantiableTypeException extends \Exception implements ExceptionInterface -{ - public function __construct(string $type, \Throwable $previous = null) - { - parent::__construct(\sprintf('Type "%s" is not instantiable.', $type), 0, $previous); - } -} diff --git a/dependencies/symfony/var-exporter/Hydrator.php b/dependencies/symfony/var-exporter/Hydrator.php deleted file mode 100644 index 431b479..0000000 --- a/dependencies/symfony/var-exporter/Hydrator.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Hydrator as InternalHydrator; -/** - * Utility class to hydrate the properties of an object. - * - * @author Nicolas Grekas - */ -final class Hydrator -{ - /** - * Sets the properties of an object, including private and protected ones. - * - * For example: - * - * // Sets the public or protected $object->propertyName property - * Hydrator::hydrate($object, ['propertyName' => $propertyValue]); - * - * // Sets a private property defined on its parent Bar class: - * Hydrator::hydrate($object, ["\0Bar\0privateBarProperty" => $propertyValue]); - * - * // Alternative way to set the private $object->privateBarProperty property - * Hydrator::hydrate($object, [], [ - * Bar::class => ['privateBarProperty' => $propertyValue], - * ]); - * - * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be hydrated - * by using the special "\0" property name to define their internal value: - * - * // Hydrates an SplObjectStorage where $info1 is attached to $obj1, etc. - * Hydrator::hydrate($object, ["\0" => [$obj1, $info1, $obj2, $info2...]]); - * - * // Hydrates an ArrayObject populated with $inputArray - * Hydrator::hydrate($object, ["\0" => [$inputArray]]); - * - * @template T of object - * - * @param T $instance The object to hydrate - * @param array $properties The properties to set on the instance - * @param array> $scopedProperties The properties to set on the instance, - * keyed by their declaring class - * - * @return T - */ - public static function hydrate(object $instance, array $properties = [], array $scopedProperties = []) : object - { - if ($properties) { - $class = $instance::class; - $propertyScopes = InternalHydrator::$propertyScopes[$class] ??= InternalHydrator::getPropertyScopes($class); - foreach ($properties as $name => &$value) { - [$scope, $name, $readonlyScope] = $propertyScopes[$name] ?? [$class, $name, $class]; - $scopedProperties[$readonlyScope ?? $scope][$name] =& $value; - } - unset($value); - } - foreach ($scopedProperties as $scope => $properties) { - if ($properties) { - (InternalHydrator::$simpleHydrators[$scope] ??= InternalHydrator::getSimpleHydrator($scope))($properties, $instance); - } - } - return $instance; - } -} diff --git a/dependencies/symfony/var-exporter/Instantiator.php b/dependencies/symfony/var-exporter/Instantiator.php deleted file mode 100644 index 4c88c4b..0000000 --- a/dependencies/symfony/var-exporter/Instantiator.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\ExceptionInterface; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Registry; -/** - * A utility class to create objects without calling their constructor. - * - * @author Nicolas Grekas - */ -final class Instantiator -{ - /** - * Creates an object and sets its properties without calling its constructor nor any other methods. - * - * @see Hydrator::hydrate() for examples - * - * @template T of object - * - * @param class-string $class The class of the instance to create - * @param array $properties The properties to set on the instance - * @param array> $scopedProperties The properties to set on the instance, - * keyed by their declaring class - * - * @return T - * - * @throws ExceptionInterface When the instance cannot be created - */ - public static function instantiate(string $class, array $properties = [], array $scopedProperties = []) : object - { - $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class); - if (Registry::$cloneable[$class]) { - $instance = clone Registry::$prototypes[$class]; - } elseif (Registry::$instantiableWithoutConstructor[$class]) { - $instance = $reflector->newInstanceWithoutConstructor(); - } elseif (null === Registry::$prototypes[$class]) { - throw new NotInstantiableTypeException($class); - } elseif ($reflector->implementsInterface('Serializable') && !\method_exists($class, '__unserialize')) { - $instance = \unserialize('C:' . \strlen($class) . ':"' . $class . '":0:{}'); - } else { - $instance = \unserialize('O:' . \strlen($class) . ':"' . $class . '":0:{}'); - } - return $properties || $scopedProperties ? Hydrator::hydrate($instance, $properties, $scopedProperties) : $instance; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/Exporter.php b/dependencies/symfony/var-exporter/Internal/Exporter.php deleted file mode 100644 index 2efd449..0000000 --- a/dependencies/symfony/var-exporter/Internal/Exporter.php +++ /dev/null @@ -1,362 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; -/** - * @author Nicolas Grekas - * - * @internal - */ -class Exporter -{ - /** - * Prepares an array of values for VarExporter. - * - * For performance this method is public and has no type-hints. - * - * @param array &$values - * @param \SplObjectStorage $objectsPool - * @param array &$refsPool - * @param int &$objectsCount - * @param bool &$valuesAreStatic - * - * @return array - * - * @throws NotInstantiableTypeException When a value cannot be serialized - */ - public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic) - { - $refs = $values; - foreach ($values as $k => $value) { - if (\is_resource($value)) { - throw new NotInstantiableTypeException(\get_resource_type($value) . ' resource'); - } - $refs[$k] = $objectsPool; - if ($isRef = !($valueIsStatic = $values[$k] !== $objectsPool)) { - $values[$k] =& $value; - // Break hard references to make $values completely - unset($value); - // independent from the original structure - $refs[$k] = $value = $values[$k]; - if ($value instanceof Reference && 0 > $value->id) { - $valuesAreStatic = \false; - ++$value->count; - continue; - } - $refsPool[] = [&$refs[$k], $value, &$value]; - $refs[$k] = $values[$k] = new Reference(-\count($refsPool), $value); - } - if (\is_array($value)) { - if ($value) { - $value = self::prepare($value, $objectsPool, $refsPool, $objectsCount, $valueIsStatic); - } - goto handle_value; - } elseif (!\is_object($value) || $value instanceof \UnitEnum) { - goto handle_value; - } - $valueIsStatic = \false; - if (isset($objectsPool[$value])) { - ++$objectsCount; - $value = new Reference($objectsPool[$value][0]); - goto handle_value; - } - $class = $value::class; - $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class); - $properties = []; - if ($reflector->hasMethod('__serialize')) { - if (!$reflector->getMethod('__serialize')->isPublic()) { - throw new \Error(\sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class)); - } - if (!\is_array($serializeProperties = $value->__serialize())) { - throw new \TypeError($class . '::__serialize() must return an array'); - } - if ($reflector->hasMethod('__unserialize')) { - $properties = $serializeProperties; - } else { - foreach ($serializeProperties as $n => $v) { - $c = \PHP_VERSION_ID >= 80100 && $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; - $properties[$c][$n] = $v; - } - } - goto prepare_value; - } - $sleep = null; - $proto = Registry::$prototypes[$class]; - if (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) { - // ArrayIterator and ArrayObject need special care because their "flags" - // option changes the behavior of the (array) casting operator. - [$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto); - // populates Registry::$prototypes[$class] with a new instance - Registry::getClassReflector($class, Registry::$instantiableWithoutConstructor[$class], Registry::$cloneable[$class]); - } elseif ($value instanceof \SplObjectStorage && Registry::$cloneable[$class] && null !== $proto) { - // By implementing Serializable, SplObjectStorage breaks - // internal references; let's deal with it on our own. - foreach (clone $value as $v) { - $properties[] = $v; - $properties[] = $value[$v]; - } - $properties = ['SplObjectStorage' => ["\x00" => $properties]]; - $arrayValue = (array) $value; - } elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod) { - ++$objectsCount; - $objectsPool[$value] = [$id = \count($objectsPool), \serialize($value), [], 0]; - $value = new Reference($id); - goto handle_value; - } else { - if (\method_exists($class, '__sleep')) { - if (!\is_array($sleep = $value->__sleep())) { - \trigger_error('serialize(): __sleep should return an array only containing the names of instance-variables to serialize', \E_USER_NOTICE); - $value = null; - goto handle_value; - } - $sleep = \array_flip($sleep); - } - $arrayValue = (array) $value; - } - $proto = (array) $proto; - foreach ($arrayValue as $name => $v) { - $i = 0; - $n = (string) $name; - if ('' === $n || "\x00" !== $n[0]) { - $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; - } elseif ('*' === $n[1]) { - $n = \substr($n, 3); - $c = $reflector->getProperty($n)->class; - if ('Error' === $c) { - $c = 'TypeError'; - } elseif ('Exception' === $c) { - $c = 'ErrorException'; - } - } else { - $i = \strpos($n, "\x00", 2); - $c = \substr($n, 1, $i - 1); - $n = \substr($n, 1 + $i); - } - if (null !== $sleep) { - if (!isset($sleep[$n]) || $i && $c !== $class) { - unset($arrayValue[$name]); - continue; - } - $sleep[$n] = \false; - } - if (!\array_key_exists($name, $proto) || $proto[$name] !== $v || "\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) { - $properties[$c][$n] = $v; - } - } - if ($sleep) { - foreach ($sleep as $n => $v) { - if (\false !== $v) { - \trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE); - } - } - } - if (\method_exists($class, '__unserialize')) { - $properties = $arrayValue; - } - prepare_value: - $objectsPool[$value] = [$id = \count($objectsPool)]; - $properties = self::prepare($properties, $objectsPool, $refsPool, $objectsCount, $valueIsStatic); - ++$objectsCount; - $objectsPool[$value] = [$id, $class, $properties, \method_exists($class, '__unserialize') ? -$objectsCount : (\method_exists($class, '__wakeup') ? $objectsCount : 0)]; - $value = new Reference($id); - handle_value: - if ($isRef) { - unset($value); - // Break the hard reference created above - } elseif (!$valueIsStatic) { - $values[$k] = $value; - } - $valuesAreStatic = $valueIsStatic && $valuesAreStatic; - } - return $values; - } - public static function export($value, $indent = '') - { - switch (\true) { - case \is_int($value) || \is_float($value): - return \var_export($value, \true); - case [] === $value: - return '[]'; - case \false === $value: - return 'false'; - case \true === $value: - return 'true'; - case null === $value: - return 'null'; - case '' === $value: - return "''"; - case $value instanceof \UnitEnum: - return '\\' . \ltrim(\var_export($value, \true), '\\'); - } - if ($value instanceof Reference) { - if (0 <= $value->id) { - return '$o[' . $value->id . ']'; - } - if (!$value->count) { - return self::export($value->value, $indent); - } - $value = -$value->id; - return '&$r[' . $value . ']'; - } - $subIndent = $indent . ' '; - if (\is_string($value)) { - $code = \sprintf("'%s'", \addcslashes($value, "'\\")); - $code = \preg_replace_callback("/((?:[\\0\\r\\n]|‪|‫|‭|‮|⁦|⁧|⁨|‬|⁩)++)(.)/", function ($m) use($subIndent) { - $m[1] = \sprintf('\'."%s".\'', \str_replace(["\x00", "\r", "\n", "‪", "‫", "‭", "‮", "⁦", "⁧", "⁨", "‬", "⁩", '\\n\\'], ['\\0', '\\r', '\\n', '\\u{202A}', '\\u{202B}', '\\u{202D}', '\\u{202E}', '\\u{2066}', '\\u{2067}', '\\u{2068}', '\\u{202C}', '\\u{2069}', '\\n"' . "\n" . $subIndent . '."\\'], $m[1])); - if ("'" === $m[2]) { - return \substr($m[1], 0, -2); - } - if (\str_ends_with($m[1], 'n".\'')) { - return \substr_replace($m[1], "\n" . $subIndent . ".'" . $m[2], -2); - } - return $m[1] . $m[2]; - }, $code, -1, $count); - if ($count && \str_starts_with($code, "''.")) { - $code = \substr($code, 3); - } - return $code; - } - if (\is_array($value)) { - $j = -1; - $code = ''; - foreach ($value as $k => $v) { - $code .= $subIndent; - if (!\is_int($k) || 1 !== $k - $j) { - $code .= self::export($k, $subIndent) . ' => '; - } - if (\is_int($k) && $k > $j) { - $j = $k; - } - $code .= self::export($v, $subIndent) . ",\n"; - } - return "[\n" . $code . $indent . ']'; - } - if ($value instanceof Values) { - $code = $subIndent . "\$r = [],\n"; - foreach ($value->values as $k => $v) { - $code .= $subIndent . '$r[' . $k . '] = ' . self::export($v, $subIndent) . ",\n"; - } - return "[\n" . $code . $indent . ']'; - } - if ($value instanceof Registry) { - return self::exportRegistry($value, $indent, $subIndent); - } - if ($value instanceof Hydrator) { - return self::exportHydrator($value, $indent, $subIndent); - } - throw new \UnexpectedValueException(\sprintf('Cannot export value of type "%s".', \get_debug_type($value))); - } - private static function exportRegistry(Registry $value, string $indent, string $subIndent) : string - { - $code = ''; - $serializables = []; - $seen = []; - $prototypesAccess = 0; - $factoriesAccess = 0; - $r = '\\' . Registry::class; - $j = -1; - foreach ($value->classes as $k => $class) { - if (':' === ($class[1] ?? null)) { - $serializables[$k] = $class; - continue; - } - if (!Registry::$instantiableWithoutConstructor[$class]) { - if (\is_subclass_of($class, 'Serializable') && !\method_exists($class, '__unserialize')) { - $serializables[$k] = 'C:' . \strlen($class) . ':"' . $class . '":0:{}'; - } else { - $serializables[$k] = 'O:' . \strlen($class) . ':"' . $class . '":0:{}'; - } - if (\is_subclass_of($class, 'Throwable')) { - $eol = \is_subclass_of($class, 'Error') ? "\x00Error\x00" : "\x00Exception\x00"; - $serializables[$k] = \substr_replace($serializables[$k], '1:{s:' . (5 + \strlen($eol)) . ':"' . $eol . 'trace";a:0:{}}', -4); - } - continue; - } - $code .= $subIndent . (1 !== $k - $j ? $k . ' => ' : ''); - $j = $k; - $eol = ",\n"; - $c = '[' . self::export($class) . ']'; - if ($seen[$class] ?? \false) { - if (Registry::$cloneable[$class]) { - ++$prototypesAccess; - $code .= 'clone $p' . $c; - } else { - ++$factoriesAccess; - $code .= '$f' . $c . '()'; - } - } else { - $seen[$class] = \true; - if (Registry::$cloneable[$class]) { - $code .= 'clone (' . ($prototypesAccess++ ? '$p' : '($p = &' . $r . '::$prototypes)') . $c . ' ?? ' . $r . '::p'; - } else { - $code .= '(' . ($factoriesAccess++ ? '$f' : '($f = &' . $r . '::$factories)') . $c . ' ?? ' . $r . '::f'; - $eol = '()' . $eol; - } - $code .= '(' . \substr($c, 1, -1) . '))'; - } - $code .= $eol; - } - if (1 === $prototypesAccess) { - $code = \str_replace('($p = &' . $r . '::$prototypes)', $r . '::$prototypes', $code); - } - if (1 === $factoriesAccess) { - $code = \str_replace('($f = &' . $r . '::$factories)', $r . '::$factories', $code); - } - if ('' !== $code) { - $code = "\n" . $code . $indent; - } - if ($serializables) { - $code = $r . '::unserialize([' . $code . '], ' . self::export($serializables, $indent) . ')'; - } else { - $code = '[' . $code . ']'; - } - return '$o = ' . $code; - } - private static function exportHydrator(Hydrator $value, string $indent, string $subIndent) : string - { - $code = ''; - foreach ($value->properties as $class => $properties) { - $code .= $subIndent . ' ' . self::export($class) . ' => ' . self::export($properties, $subIndent . ' ') . ",\n"; - } - $code = [self::export($value->registry, $subIndent), self::export($value->values, $subIndent), '' !== $code ? "[\n" . $code . $subIndent . ']' : '[]', self::export($value->value, $subIndent), self::export($value->wakeups, $subIndent)]; - return '\\' . $value::class . "::hydrate(\n" . $subIndent . \implode(",\n" . $subIndent, $code) . "\n" . $indent . ')'; - } - /** - * @param \ArrayIterator|\ArrayObject $value - * @param \ArrayIterator|\ArrayObject $proto - */ - private static function getArrayObjectProperties($value, $proto) : array - { - $reflector = $value instanceof \ArrayIterator ? 'ArrayIterator' : 'ArrayObject'; - $reflector = Registry::$reflectors[$reflector] ??= Registry::getClassReflector($reflector); - $properties = [$arrayValue = (array) $value, $reflector->getMethod('getFlags')->invoke($value), $value instanceof \ArrayObject ? $reflector->getMethod('getIteratorClass')->invoke($value) : 'ArrayIterator']; - $reflector = $reflector->getMethod('setFlags'); - $reflector->invoke($proto, \ArrayObject::STD_PROP_LIST); - if ($properties[1] & \ArrayObject::STD_PROP_LIST) { - $reflector->invoke($value, 0); - $properties[0] = (array) $value; - } else { - $reflector->invoke($value, \ArrayObject::STD_PROP_LIST); - $arrayValue = (array) $value; - } - $reflector->invoke($value, $properties[1]); - if ([[], 0, 'ArrayIterator'] === $properties) { - $properties = []; - } else { - if ('ArrayIterator' === $properties[2]) { - unset($properties[2]); - } - $properties = [$reflector->class => ["\x00" => $properties]]; - } - return [$arrayValue, $properties]; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/Hydrator.php b/dependencies/symfony/var-exporter/Internal/Hydrator.php deleted file mode 100644 index f929c13..0000000 --- a/dependencies/symfony/var-exporter/Internal/Hydrator.php +++ /dev/null @@ -1,260 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\ClassNotFoundException; -/** - * @author Nicolas Grekas - * - * @internal - */ -class Hydrator -{ - public static $hydrators = []; - public static $simpleHydrators = []; - public static $propertyScopes = []; - public $registry; - public $values; - public $properties; - public $value; - public $wakeups; - public function __construct(?Registry $registry, ?Values $values, array $properties, $value, array $wakeups) - { - $this->registry = $registry; - $this->values = $values; - $this->properties = $properties; - $this->value = $value; - $this->wakeups = $wakeups; - } - public static function hydrate($objects, $values, $properties, $value, $wakeups) - { - foreach ($properties as $class => $vars) { - (self::$hydrators[$class] ??= self::getHydrator($class))($vars, $objects); - } - foreach ($wakeups as $k => $v) { - if (\is_array($v)) { - $objects[-$k]->__unserialize($v); - } else { - $objects[$v]->__wakeup(); - } - } - return $value; - } - public static function getHydrator($class) - { - $baseHydrator = self::$hydrators['stdClass'] ??= static function ($properties, $objects) { - foreach ($properties as $name => $values) { - foreach ($values as $i => $v) { - $objects[$i]->{$name} = $v; - } - } - }; - switch ($class) { - case 'stdClass': - return $baseHydrator; - case 'ErrorException': - return $baseHydrator->bindTo(null, new class extends \ErrorException - { - }); - case 'TypeError': - return $baseHydrator->bindTo(null, new class extends \Error - { - }); - case 'SplObjectStorage': - return static function ($properties, $objects) { - foreach ($properties as $name => $values) { - if ("\x00" === $name) { - foreach ($values as $i => $v) { - for ($j = 0; $j < \count($v); ++$j) { - $objects[$i]->attach($v[$j], $v[++$j]); - } - } - continue; - } - foreach ($values as $i => $v) { - $objects[$i]->{$name} = $v; - } - } - }; - } - if (!\class_exists($class) && !\interface_exists($class, \false) && !\trait_exists($class, \false)) { - throw new ClassNotFoundException($class); - } - $classReflector = new \ReflectionClass($class); - switch ($class) { - case 'ArrayIterator': - case 'ArrayObject': - $constructor = $classReflector->getConstructor()->invokeArgs(...); - return static function ($properties, $objects) use($constructor) { - foreach ($properties as $name => $values) { - if ("\x00" !== $name) { - foreach ($values as $i => $v) { - $objects[$i]->{$name} = $v; - } - } - } - foreach ($properties["\x00"] ?? [] as $i => $v) { - $constructor($objects[$i], $v); - } - }; - } - if (!$classReflector->isInternal()) { - return $baseHydrator->bindTo(null, $class); - } - if ($classReflector->name !== $class) { - return self::$hydrators[$classReflector->name] ??= self::getHydrator($classReflector->name); - } - $propertySetters = []; - foreach ($classReflector->getProperties() as $propertyReflector) { - if (!$propertyReflector->isStatic()) { - $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); - } - } - if (!$propertySetters) { - return $baseHydrator; - } - return static function ($properties, $objects) use($propertySetters) { - foreach ($properties as $name => $values) { - if ($setValue = $propertySetters[$name] ?? null) { - foreach ($values as $i => $v) { - $setValue($objects[$i], $v); - } - continue; - } - foreach ($values as $i => $v) { - $objects[$i]->{$name} = $v; - } - } - }; - } - public static function getSimpleHydrator($class) - { - $baseHydrator = self::$simpleHydrators['stdClass'] ??= (function ($properties, $object) { - $readonly = (array) $this; - foreach ($properties as $name => &$value) { - $object->{$name} = $value; - if (!($readonly[$name] ?? \false)) { - $object->{$name} =& $value; - } - } - })->bindTo(new \stdClass()); - switch ($class) { - case 'stdClass': - return $baseHydrator; - case 'ErrorException': - return $baseHydrator->bindTo(new \stdClass(), new class extends \ErrorException - { - }); - case 'TypeError': - return $baseHydrator->bindTo(new \stdClass(), new class extends \Error - { - }); - case 'SplObjectStorage': - return static function ($properties, $object) { - foreach ($properties as $name => &$value) { - if ("\x00" !== $name) { - $object->{$name} = $value; - $object->{$name} =& $value; - continue; - } - for ($i = 0; $i < \count($value); ++$i) { - $object->attach($value[$i], $value[++$i]); - } - } - }; - } - if (!\class_exists($class) && !\interface_exists($class, \false) && !\trait_exists($class, \false)) { - throw new ClassNotFoundException($class); - } - $classReflector = new \ReflectionClass($class); - switch ($class) { - case 'ArrayIterator': - case 'ArrayObject': - $constructor = $classReflector->getConstructor()->invokeArgs(...); - return static function ($properties, $object) use($constructor) { - foreach ($properties as $name => &$value) { - if ("\x00" === $name) { - $constructor($object, $value); - } else { - $object->{$name} = $value; - $object->{$name} =& $value; - } - } - }; - } - if (!$classReflector->isInternal()) { - $readonly = new \stdClass(); - foreach ($classReflector->getProperties(\ReflectionProperty::IS_READONLY) as $propertyReflector) { - if ($class === $propertyReflector->class) { - $readonly->{$propertyReflector->name} = \true; - } - } - return $baseHydrator->bindTo($readonly, $class); - } - if ($classReflector->name !== $class) { - return self::$simpleHydrators[$classReflector->name] ??= self::getSimpleHydrator($classReflector->name); - } - $propertySetters = []; - foreach ($classReflector->getProperties() as $propertyReflector) { - if (!$propertyReflector->isStatic()) { - $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); - } - } - if (!$propertySetters) { - return $baseHydrator; - } - return static function ($properties, $object) use($propertySetters) { - foreach ($properties as $name => &$value) { - if ($setValue = $propertySetters[$name] ?? null) { - $setValue($object, $value); - } else { - $object->{$name} = $value; - $object->{$name} =& $value; - } - } - }; - } - /** - * @return array - */ - public static function getPropertyScopes($class) - { - $propertyScopes = []; - $r = new \ReflectionClass($class); - foreach ($r->getProperties() as $property) { - $flags = $property->getModifiers(); - if (\ReflectionProperty::IS_STATIC & $flags) { - continue; - } - $name = $property->name; - if (\ReflectionProperty::IS_PRIVATE & $flags) { - $propertyScopes["\x00{$class}\x00{$name}"] = $propertyScopes[$name] = [$class, $name, $flags & \ReflectionProperty::IS_READONLY ? $class : null]; - continue; - } - $propertyScopes[$name] = [$class, $name, $flags & \ReflectionProperty::IS_READONLY ? $property->class : null]; - if (\ReflectionProperty::IS_PROTECTED & $flags) { - $propertyScopes["\x00*\x00{$name}"] = $propertyScopes[$name]; - } - } - while ($r = $r->getParentClass()) { - $class = $r->name; - foreach ($r->getProperties(\ReflectionProperty::IS_PRIVATE) as $property) { - if (!$property->isStatic()) { - $name = $property->name; - $readonlyScope = $property->isReadOnly() ? $class : null; - $propertyScopes["\x00{$class}\x00{$name}"] = [$class, $name, $readonlyScope]; - $propertyScopes[$name] ??= [$class, $name, $readonlyScope]; - } - } - } - return $propertyScopes; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/LazyObjectRegistry.php b/dependencies/symfony/var-exporter/Internal/LazyObjectRegistry.php deleted file mode 100644 index 623ab39..0000000 --- a/dependencies/symfony/var-exporter/Internal/LazyObjectRegistry.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -/** - * Stores the state of lazy objects and caches related reflection information. - * - * As a micro-optimization, this class uses no type declarations. - * - * @internal - */ -class LazyObjectRegistry -{ - /** - * @var array - */ - public static $classReflectors = []; - /** - * @var array> - */ - public static $defaultProperties = []; - /** - * @var array> - */ - public static $classResetters = []; - /** - * @var array - */ - public static $classAccessors = []; - /** - * @var array - */ - public static $parentMethods = []; - public static ?\Closure $noInitializerState = null; - public static function getClassResetters($class) - { - $classProperties = []; - if ((self::$classReflectors[$class] ??= new \ReflectionClass($class))->isInternal()) { - $propertyScopes = []; - } else { - $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); - } - foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) { - $propertyScopes[$k = "\x00{$scope}\x00{$name}"] ?? $propertyScopes[$k = "\x00*\x00{$name}"] ?? ($k = $name); - if ($k === $key && "\x00{$class}\x00lazyObjectState" !== $k) { - $classProperties[$readonlyScope ?? $scope][$name] = $key; - } - } - $resetters = []; - foreach ($classProperties as $scope => $properties) { - $resetters[] = \Closure::bind(static function ($instance, $skippedProperties, $onlyProperties = null) use($properties) { - foreach ($properties as $name => $key) { - if (!\array_key_exists($key, $skippedProperties) && (null === $onlyProperties || \array_key_exists($key, $onlyProperties))) { - unset($instance->{$name}); - } - } - }, null, $scope); - } - $resetters[] = static function ($instance, $skippedProperties, $onlyProperties = null) { - foreach ((array) $instance as $name => $value) { - if ("\x00" !== ($name[0] ?? '') && !\array_key_exists($name, $skippedProperties) && (null === $onlyProperties || \array_key_exists($name, $onlyProperties))) { - unset($instance->{$name}); - } - } - }; - return $resetters; - } - public static function getClassAccessors($class) - { - return \Closure::bind(static fn() => ['get' => static function &($instance, $name, $readonly) { - if (!$readonly) { - return $instance->{$name}; - } - $value = $instance->{$name}; - return $value; - }, 'set' => static function ($instance, $name, $value) { - $instance->{$name} = $value; - }, 'isset' => static fn($instance, $name) => isset($instance->{$name}), 'unset' => static function ($instance, $name) { - unset($instance->{$name}); - }], null, \Closure::class === $class ? null : $class)(); - } - public static function getParentMethods($class) - { - $parent = \get_parent_class($class); - $methods = []; - foreach (['set', 'isset', 'unset', 'clone', 'serialize', 'unserialize', 'sleep', 'wakeup', 'destruct', 'get'] as $method) { - if (!$parent || !\method_exists($parent, '__' . $method)) { - $methods[$method] = \false; - } else { - $m = new \ReflectionMethod($parent, '__' . $method); - $methods[$method] = !$m->isAbstract() && !$m->isPrivate(); - } - } - $methods['get'] = $methods['get'] ? $m->returnsReference() ? 2 : 1 : 0; - return $methods; - } - public static function getScope($propertyScopes, $class, $property, $readonlyScope = null) - { - if (null === $readonlyScope && !isset($propertyScopes[$k = "\x00{$class}\x00{$property}"]) && !isset($propertyScopes[$k = "\x00*\x00{$property}"])) { - return null; - } - $frame = \debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]; - if (\ReflectionProperty::class === ($scope = $frame['class'] ?? \Closure::class)) { - $scope = $frame['object']->class; - } - if (null === $readonlyScope && '*' === $k[1] && ($class === $scope || \is_subclass_of($class, $scope) && !isset($propertyScopes["\x00{$scope}\x00{$property}"]))) { - return null; - } - return $scope; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/LazyObjectState.php b/dependencies/symfony/var-exporter/Internal/LazyObjectState.php deleted file mode 100644 index e499507..0000000 --- a/dependencies/symfony/var-exporter/Internal/LazyObjectState.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Hydrator as PublicHydrator; -/** - * Keeps the state of lazy objects. - * - * As a micro-optimization, this class uses no type declarations. - * - * @internal - */ -class LazyObjectState -{ - public const STATUS_UNINITIALIZED_FULL = 1; - public const STATUS_UNINITIALIZED_PARTIAL = 2; - public const STATUS_INITIALIZED_FULL = 3; - public const STATUS_INITIALIZED_PARTIAL = 4; - /** - * @var array - */ - public readonly array $skippedProperties; - /** - * @var self::STATUS_* - */ - public int $status = 0; - public object $realInstance; - public function __construct(public readonly \Closure|array $initializer, $skippedProperties = []) - { - $this->skippedProperties = $skippedProperties; - $this->status = \is_array($initializer) ? self::STATUS_UNINITIALIZED_PARTIAL : self::STATUS_UNINITIALIZED_FULL; - } - public function initialize($instance, $propertyName, $propertyScope) - { - if (self::STATUS_INITIALIZED_FULL === $this->status) { - return self::STATUS_INITIALIZED_FULL; - } - if (\is_array($this->initializer)) { - $class = $instance::class; - $propertyScope ??= $class; - $propertyScopes = Hydrator::$propertyScopes[$class]; - $propertyScopes[$k = "\x00{$propertyScope}\x00{$propertyName}"] ?? $propertyScopes[$k = "\x00*\x00{$propertyName}"] ?? ($k = $propertyName); - if ($initializer = $this->initializer[$k] ?? null) { - $value = $initializer(...[$instance, $propertyName, $propertyScope, LazyObjectRegistry::$defaultProperties[$class][$k] ?? null]); - $accessor = LazyObjectRegistry::$classAccessors[$propertyScope] ??= LazyObjectRegistry::getClassAccessors($propertyScope); - $accessor['set']($instance, $propertyName, $value); - return $this->status = self::STATUS_INITIALIZED_PARTIAL; - } - $status = self::STATUS_UNINITIALIZED_PARTIAL; - if ($initializer = $this->initializer["\x00"] ?? null) { - if (!\is_array($values = $initializer($instance, LazyObjectRegistry::$defaultProperties[$class]))) { - throw new \TypeError(\sprintf('The lazy-initializer defined for instance of "%s" must return an array, got "%s".', $class, \get_debug_type($values))); - } - $properties = (array) $instance; - foreach ($values as $key => $value) { - if ($k === $key) { - $status = self::STATUS_INITIALIZED_PARTIAL; - } - if (!\array_key_exists($key, $properties) && ([$scope, $name, $readonlyScope] = $propertyScopes[$key] ?? null)) { - $scope = $readonlyScope ?? ('*' !== $scope ? $scope : $class); - $accessor = LazyObjectRegistry::$classAccessors[$scope] ??= LazyObjectRegistry::getClassAccessors($scope); - $accessor['set']($instance, $name, $value); - } - } - } - return $status; - } - $this->status = self::STATUS_INITIALIZED_FULL; - try { - if ($defaultProperties = \array_diff_key(LazyObjectRegistry::$defaultProperties[$instance::class], $this->skippedProperties)) { - PublicHydrator::hydrate($instance, $defaultProperties); - } - ($this->initializer)($instance); - } catch (\Throwable $e) { - $this->status = self::STATUS_UNINITIALIZED_FULL; - $this->reset($instance); - throw $e; - } - return self::STATUS_INITIALIZED_FULL; - } - public function reset($instance) : void - { - $class = $instance::class; - $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); - $skippedProperties = $this->skippedProperties; - $properties = (array) $instance; - $onlyProperties = \is_array($this->initializer) ? $this->initializer : null; - foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) { - $propertyScopes[$k = "\x00{$scope}\x00{$name}"] ?? $propertyScopes[$k = "\x00*\x00{$name}"] ?? ($k = $name); - if ($k === $key && (null !== $readonlyScope || !\array_key_exists($k, $properties))) { - $skippedProperties[$k] = \true; - } - } - foreach (LazyObjectRegistry::$classResetters[$class] as $reset) { - $reset($instance, $skippedProperties, $onlyProperties); - } - $this->status = self::STATUS_INITIALIZED_FULL === $this->status ? self::STATUS_UNINITIALIZED_FULL : self::STATUS_UNINITIALIZED_PARTIAL; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/LazyObjectTrait.php b/dependencies/symfony/var-exporter/Internal/LazyObjectTrait.php deleted file mode 100644 index f99a48e..0000000 --- a/dependencies/symfony/var-exporter/Internal/LazyObjectTrait.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -if (\PHP_VERSION_ID >= 80300) { - /** - * @internal - */ - trait LazyObjectTrait - { - private readonly LazyObjectState $lazyObjectState; - } -} else { - /** - * @internal - */ - trait LazyObjectTrait - { - private LazyObjectState $lazyObjectState; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/Reference.php b/dependencies/symfony/var-exporter/Internal/Reference.php deleted file mode 100644 index 39a5149..0000000 --- a/dependencies/symfony/var-exporter/Internal/Reference.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -/** - * @author Nicolas Grekas - * - * @internal - */ -class Reference -{ - public $id; - public $value; - public $count = 0; - public function __construct(int $id, $value = null) - { - $this->id = $id; - $this->value = $value; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/Registry.php b/dependencies/symfony/var-exporter/Internal/Registry.php deleted file mode 100644 index b2f643d..0000000 --- a/dependencies/symfony/var-exporter/Internal/Registry.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\ClassNotFoundException; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; -/** - * @author Nicolas Grekas - * - * @internal - */ -class Registry -{ - public static $reflectors = []; - public static $prototypes = []; - public static $factories = []; - public static $cloneable = []; - public static $instantiableWithoutConstructor = []; - public $classes = []; - public function __construct(array $classes) - { - $this->classes = $classes; - } - public static function unserialize($objects, $serializables) - { - $unserializeCallback = \ini_set('unserialize_callback_func', __CLASS__ . '::getClassReflector'); - try { - foreach ($serializables as $k => $v) { - $objects[$k] = \unserialize($v); - } - } finally { - \ini_set('unserialize_callback_func', $unserializeCallback); - } - return $objects; - } - public static function p($class) - { - self::getClassReflector($class, \true, \true); - return self::$prototypes[$class]; - } - public static function f($class) - { - $reflector = self::$reflectors[$class] ??= self::getClassReflector($class, \true, \false); - return self::$factories[$class] = [$reflector, 'newInstanceWithoutConstructor'](...); - } - public static function getClassReflector($class, $instantiableWithoutConstructor = \false, $cloneable = null) - { - if (!($isClass = \class_exists($class)) && !\interface_exists($class, \false) && !\trait_exists($class, \false)) { - throw new ClassNotFoundException($class); - } - $reflector = new \ReflectionClass($class); - if ($instantiableWithoutConstructor) { - $proto = $reflector->newInstanceWithoutConstructor(); - } elseif (!$isClass || $reflector->isAbstract()) { - throw new NotInstantiableTypeException($class); - } elseif ($reflector->name !== $class) { - $reflector = self::$reflectors[$name = $reflector->name] ??= self::getClassReflector($name, \false, $cloneable); - self::$cloneable[$class] = self::$cloneable[$name]; - self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name]; - self::$prototypes[$class] = self::$prototypes[$name]; - return $reflector; - } else { - try { - $proto = $reflector->newInstanceWithoutConstructor(); - $instantiableWithoutConstructor = \true; - } catch (\ReflectionException) { - $proto = $reflector->implementsInterface('Serializable') && !\method_exists($class, '__unserialize') ? 'C:' : 'O:'; - if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) { - $proto = null; - } else { - try { - $proto = @\unserialize($proto . \strlen($class) . ':"' . $class . '":0:{}'); - } catch (\Exception $e) { - if (__FILE__ !== $e->getFile()) { - throw $e; - } - throw new NotInstantiableTypeException($class, $e); - } - if (\false === $proto) { - throw new NotInstantiableTypeException($class); - } - } - } - if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !\method_exists($class, '__sleep') && !\method_exists($class, '__serialize')) { - try { - \serialize($proto); - } catch (\Exception $e) { - throw new NotInstantiableTypeException($class, $e); - } - } - } - if (null === $cloneable) { - if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !\method_exists($proto, '__wakeup') && !\method_exists($class, '__unserialize'))) { - throw new NotInstantiableTypeException($class); - } - $cloneable = $reflector->isCloneable() && !$reflector->hasMethod('__clone'); - } - self::$cloneable[$class] = $cloneable; - self::$instantiableWithoutConstructor[$class] = $instantiableWithoutConstructor; - self::$prototypes[$class] = $proto; - if ($proto instanceof \Throwable) { - static $setTrace; - if (null === $setTrace) { - $setTrace = [new \ReflectionProperty(\Error::class, 'trace'), new \ReflectionProperty(\Exception::class, 'trace')]; - $setTrace[0] = $setTrace[0]->setValue(...); - $setTrace[1] = $setTrace[1]->setValue(...); - } - $setTrace[$proto instanceof \Exception]($proto, []); - } - return $reflector; - } -} diff --git a/dependencies/symfony/var-exporter/Internal/Values.php b/dependencies/symfony/var-exporter/Internal/Values.php deleted file mode 100644 index 7a4cf89..0000000 --- a/dependencies/symfony/var-exporter/Internal/Values.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal; - -/** - * @author Nicolas Grekas - * - * @internal - */ -class Values -{ - public $values; - public function __construct(array $values) - { - $this->values = $values; - } -} diff --git a/dependencies/symfony/var-exporter/LazyGhostTrait.php b/dependencies/symfony/var-exporter/LazyGhostTrait.php deleted file mode 100644 index c2d19c1..0000000 --- a/dependencies/symfony/var-exporter/LazyGhostTrait.php +++ /dev/null @@ -1,313 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Hydrator; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectState; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectTrait; -trait LazyGhostTrait -{ - use LazyObjectTrait; - /** - * Creates a lazy-loading ghost instance. - * - * When the initializer is a closure, it should initialize all properties at - * once and is given the instance to initialize as argument. - * - * When the initializer is an array of closures, it should be indexed by - * properties and closures should accept 4 arguments: the instance to - * initialize, the property to initialize, its write-scope, and its default - * value. Each closure should return the value of the corresponding property. - * The special "\0" key can be used to define a closure that returns all - * properties at once when full-initialization is needed; it takes the - * instance and its default properties as arguments. - * - * Properties should be indexed by their array-cast name, see - * https://php.net/manual/language.types.array#language.types.array.casting - * - * @param (\Closure(static):void - * |array - * |array{"\0": \Closure(static, array):array}) $initializer - * @param array|null $skippedProperties An array indexed by the properties to skip, aka the ones - * that the initializer doesn't set when its a closure - * @param static|null $instance - */ - public static function createLazyGhost(\Closure|array $initializer, array $skippedProperties = null, object $instance = null) : static - { - $onlyProperties = null === $skippedProperties && \is_array($initializer) ? $initializer : null; - if (self::class !== ($class = $instance ? $instance::class : static::class)) { - $skippedProperties["\x00" . self::class . "\x00lazyObjectState"] = \true; - } elseif (\defined($class . '::LAZY_OBJECT_PROPERTY_SCOPES')) { - Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES; - } - $instance ??= (Registry::$classReflectors[$class] ??= new \ReflectionClass($class))->newInstanceWithoutConstructor(); - Registry::$defaultProperties[$class] ??= (array) $instance; - $instance->lazyObjectState = new LazyObjectState($initializer, $skippedProperties ??= []); - foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { - $reset($instance, $skippedProperties, $onlyProperties); - } - return $instance; - } - /** - * Returns whether the object is initialized. - * - * @param $partial Whether partially initialized objects should be considered as initialized - */ - public function isLazyObjectInitialized(bool $partial = \false) : bool - { - if (!($state = $this->lazyObjectState ?? null)) { - return \true; - } - if (!\is_array($state->initializer)) { - return LazyObjectState::STATUS_INITIALIZED_FULL === $state->status; - } - $class = $this::class; - $properties = (array) $this; - if ($partial) { - return (bool) \array_intersect_key($state->initializer, $properties); - } - $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); - foreach ($state->initializer as $key => $initializer) { - if (!\array_key_exists($key, $properties) && isset($propertyScopes[$key])) { - return \false; - } - } - return \true; - } - /** - * Forces initialization of a lazy object and returns it. - */ - public function initializeLazyObject() : static - { - if (!($state = $this->lazyObjectState ?? null)) { - return $this; - } - if (!\is_array($state->initializer)) { - if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { - $state->initialize($this, '', null); - } - return $this; - } - $values = isset($state->initializer["\x00"]) ? null : []; - $class = $this::class; - $properties = (array) $this; - $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); - foreach ($state->initializer as $key => $initializer) { - if (\array_key_exists($key, $properties) || !([$scope, $name, $readonlyScope] = $propertyScopes[$key] ?? null)) { - continue; - } - $scope = $readonlyScope ?? ('*' !== $scope ? $scope : $class); - if (null === $values) { - if (!\is_array($values = $state->initializer["\x00"]($this, Registry::$defaultProperties[$class]))) { - throw new \TypeError(\sprintf('The lazy-initializer defined for instance of "%s" must return an array, got "%s".', $class, \get_debug_type($values))); - } - if (\array_key_exists($key, $properties = (array) $this)) { - continue; - } - } - if (\array_key_exists($key, $values)) { - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - $accessor['set']($this, $name, $properties[$key] = $values[$key]); - } else { - $state->initialize($this, $name, $scope); - $properties = (array) $this; - } - } - return $this; - } - /** - * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object - */ - public function resetLazyObject() : bool - { - if (!($state = $this->lazyObjectState ?? null)) { - return \false; - } - if (LazyObjectState::STATUS_UNINITIALIZED_FULL !== $state->status) { - $state->reset($this); - } - return \true; - } - public function &__get($name) : mixed - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); - $state = $this->lazyObjectState ?? null; - if ($state && (null === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"])) && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope)) { - goto get_in_scope; - } - } - if ($parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']) { - if (2 === $parent) { - return parent::__get($name); - } - $value = parent::__get($name); - return $value; - } - if (null === $class) { - $frame = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0]; - \trigger_error(\sprintf('Undefined property: %s::$%s in %s on line %s', $this::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE); - } - get_in_scope: - try { - if (null === $scope) { - if (null === $readonlyScope) { - return $this->{$name}; - } - $value = $this->{$name}; - return $value; - } - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - return $accessor['get']($this, $name, null !== $readonlyScope); - } catch (\Error $e) { - if (\Error::class !== $e::class || !\str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { - throw $e; - } - try { - if (null === $scope) { - $this->{$name} = []; - return $this->{$name}; - } - $accessor['set']($this, $name, []); - return $accessor['get']($this, $name, null !== $readonlyScope); - } catch (\Error) { - throw $e; - } - } - } - public function __set($name, $value) : void - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); - $state = $this->lazyObjectState ?? null; - if ($state && ($readonlyScope === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"]))) { - if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { - $state->initialize($this, $name, $readonlyScope ?? $scope); - } - goto set_in_scope; - } - } - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) { - parent::__set($name, $value); - return; - } - set_in_scope: - if (null === $scope) { - $this->{$name} = $value; - } else { - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - $accessor['set']($this, $name, $value); - } - } - public function __isset($name) : bool - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); - $state = $this->lazyObjectState ?? null; - if ($state && (null === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"])) && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope)) { - goto isset_in_scope; - } - } - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) { - return parent::__isset($name); - } - isset_in_scope: - if (null === $scope) { - return isset($this->{$name}); - } - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - return $accessor['isset']($this, $name); - } - public function __unset($name) : void - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); - $state = $this->lazyObjectState ?? null; - if ($state && ($readonlyScope === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"]))) { - if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { - $state->initialize($this, $name, $readonlyScope ?? $scope); - } - goto unset_in_scope; - } - } - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) { - parent::__unset($name); - return; - } - unset_in_scope: - if (null === $scope) { - unset($this->{$name}); - } else { - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - $accessor['unset']($this, $name); - } - } - public function __clone() : void - { - if ($state = $this->lazyObjectState ?? null) { - $this->lazyObjectState = clone $state; - } - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) { - parent::__clone(); - } - } - public function __serialize() : array - { - $class = self::class; - if ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) { - $properties = parent::__serialize(); - } else { - $this->initializeLazyObject(); - $properties = (array) $this; - } - unset($properties["\x00{$class}\x00lazyObjectState"]); - if (Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) { - return $properties; - } - $scope = \get_parent_class($class); - $data = []; - foreach (parent::__sleep() as $name) { - $value = $properties[$k = $name] ?? $properties[$k = "\x00*\x00{$name}"] ?? $properties[$k = "\x00{$scope}\x00{$name}"] ?? ($k = null); - if (null === $k) { - \trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE); - } else { - $data[$k] = $value; - } - } - return $data; - } - public function __destruct() - { - $state = $this->lazyObjectState ?? null; - if ($state && \in_array($state->status, [LazyObjectState::STATUS_UNINITIALIZED_FULL, LazyObjectState::STATUS_UNINITIALIZED_PARTIAL], \true)) { - return; - } - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) { - parent::__destruct(); - } - } - private function setLazyObjectAsInitialized(bool $initialized) : void - { - $state = $this->lazyObjectState ?? null; - if ($state && !\is_array($state->initializer)) { - $state->status = $initialized ? LazyObjectState::STATUS_INITIALIZED_FULL : LazyObjectState::STATUS_UNINITIALIZED_FULL; - } - } -} diff --git a/dependencies/symfony/var-exporter/LazyObjectInterface.php b/dependencies/symfony/var-exporter/LazyObjectInterface.php deleted file mode 100644 index cc703a5..0000000 --- a/dependencies/symfony/var-exporter/LazyObjectInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -interface LazyObjectInterface -{ - /** - * Returns whether the object is initialized. - * - * @param $partial Whether partially initialized objects should be considered as initialized - */ - public function isLazyObjectInitialized(bool $partial = \false) : bool; - /** - * Forces initialization of a lazy object and returns it. - */ - public function initializeLazyObject() : object; - /** - * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object - */ - public function resetLazyObject() : bool; -} diff --git a/dependencies/symfony/var-exporter/LazyProxyTrait.php b/dependencies/symfony/var-exporter/LazyProxyTrait.php deleted file mode 100644 index 4dbdca3..0000000 --- a/dependencies/symfony/var-exporter/LazyProxyTrait.php +++ /dev/null @@ -1,281 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Hydrator as PublicHydrator; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Hydrator; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectState; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectTrait; -trait LazyProxyTrait -{ - use LazyObjectTrait; - /** - * Creates a lazy-loading virtual proxy. - * - * @param \Closure():object $initializer Returns the proxied object - * @param static|null $instance - */ - public static function createLazyProxy(\Closure $initializer, object $instance = null) : static - { - if (self::class !== ($class = $instance ? $instance::class : static::class)) { - $skippedProperties = ["\x00" . self::class . "\x00lazyObjectState" => \true]; - } elseif (\defined($class . '::LAZY_OBJECT_PROPERTY_SCOPES')) { - Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES; - } - $instance ??= (Registry::$classReflectors[$class] ??= new \ReflectionClass($class))->newInstanceWithoutConstructor(); - $instance->lazyObjectState = new LazyObjectState($initializer); - foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { - $reset($instance, $skippedProperties ??= []); - } - return $instance; - } - /** - * Returns whether the object is initialized. - * - * @param $partial Whether partially initialized objects should be considered as initialized - */ - public function isLazyObjectInitialized(bool $partial = \false) : bool - { - return !isset($this->lazyObjectState) || isset($this->lazyObjectState->realInstance) || Registry::$noInitializerState === $this->lazyObjectState->initializer; - } - /** - * Forces initialization of a lazy object and returns it. - */ - public function initializeLazyObject() : parent - { - if ($state = $this->lazyObjectState ?? null) { - return $state->realInstance ??= ($state->initializer)(); - } - return $this; - } - /** - * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object - */ - public function resetLazyObject() : bool - { - if (!isset($this->lazyObjectState) || Registry::$noInitializerState === $this->lazyObjectState->initializer) { - return \false; - } - unset($this->lazyObjectState->realInstance); - return \true; - } - public function &__get($name) : mixed - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - $instance = $this; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); - if (null === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"])) { - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } - $parent = 2; - goto get_in_scope; - } - } - $parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']; - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } else { - if (2 === $parent) { - return parent::__get($name); - } - $value = parent::__get($name); - return $value; - } - if (!$parent && null === $class && !\array_key_exists($name, (array) $instance)) { - $frame = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0]; - \trigger_error(\sprintf('Undefined property: %s::$%s in %s on line %s', $instance::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE); - } - get_in_scope: - try { - if (null === $scope) { - if (null === $readonlyScope && 1 !== $parent) { - return $instance->{$name}; - } - $value = $instance->{$name}; - return $value; - } - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent); - } catch (\Error $e) { - if (\Error::class !== $e::class || !\str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { - throw $e; - } - try { - if (null === $scope) { - $instance->{$name} = []; - return $instance->{$name}; - } - $accessor['set']($instance, $name, []); - return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent); - } catch (\Error) { - throw $e; - } - } - } - public function __set($name, $value) : void - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - $instance = $this; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); - if ($readonlyScope === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"])) { - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } - goto set_in_scope; - } - } - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) { - parent::__set($name, $value); - return; - } - set_in_scope: - if (null === $scope) { - $instance->{$name} = $value; - } else { - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - $accessor['set']($instance, $name, $value); - } - } - public function __isset($name) : bool - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - $instance = $this; - if ([$class] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); - if (null === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"])) { - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } - goto isset_in_scope; - } - } - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) { - return parent::__isset($name); - } - isset_in_scope: - if (null === $scope) { - return isset($instance->{$name}); - } - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - return $accessor['isset']($instance, $name); - } - public function __unset($name) : void - { - $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); - $scope = null; - $instance = $this; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); - if ($readonlyScope === $scope || isset($propertyScopes["\x00{$scope}\x00{$name}"])) { - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } - goto unset_in_scope; - } - } - if ($state = $this->lazyObjectState ?? null) { - $instance = $state->realInstance ??= ($state->initializer)(); - } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) { - parent::__unset($name); - return; - } - unset_in_scope: - if (null === $scope) { - unset($instance->{$name}); - } else { - $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - $accessor['unset']($instance, $name); - } - } - public function __clone() : void - { - if (!isset($this->lazyObjectState)) { - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) { - parent::__clone(); - } - return; - } - $this->lazyObjectState = clone $this->lazyObjectState; - if (isset($this->lazyObjectState->realInstance)) { - $this->lazyObjectState->realInstance = clone $this->lazyObjectState->realInstance; - } - } - public function __serialize() : array - { - $class = self::class; - $state = $this->lazyObjectState ?? null; - if (!$state && (Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) { - $properties = parent::__serialize(); - } else { - $properties = (array) $this; - if ($state) { - unset($properties["\x00{$class}\x00lazyObjectState"]); - $properties["\x00{$class}\x00lazyObjectReal"] = $state->realInstance ??= ($state->initializer)(); - } - } - if ($state || Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) { - return $properties; - } - $scope = \get_parent_class($class); - $data = []; - foreach (parent::__sleep() as $name) { - $value = $properties[$k = $name] ?? $properties[$k = "\x00*\x00{$name}"] ?? $properties[$k = "\x00{$scope}\x00{$name}"] ?? ($k = null); - if (null === $k) { - \trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE); - } else { - $data[$k] = $value; - } - } - return $data; - } - public function __unserialize(array $data) : void - { - $class = self::class; - if ($instance = $data["\x00{$class}\x00lazyObjectReal"] ?? null) { - unset($data["\x00{$class}\x00lazyObjectReal"]); - foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { - $reset($this, $data); - } - if ($data) { - PublicHydrator::hydrate($this, $data); - } - $this->lazyObjectState = new LazyObjectState(Registry::$noInitializerState ??= static fn() => throw new \LogicException('Lazy proxy has no initializer.')); - $this->lazyObjectState->realInstance = $instance; - } elseif ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['unserialize']) { - parent::__unserialize($data); - } else { - PublicHydrator::hydrate($this, $data); - if (Registry::$parentMethods[$class]['wakeup']) { - parent::__wakeup(); - } - } - } - public function __destruct() - { - if (isset($this->lazyObjectState)) { - return; - } - if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) { - parent::__destruct(); - } - } -} diff --git a/dependencies/symfony/var-exporter/ProxyHelper.php b/dependencies/symfony/var-exporter/ProxyHelper.php deleted file mode 100644 index 922ec18..0000000 --- a/dependencies/symfony/var-exporter/ProxyHelper.php +++ /dev/null @@ -1,316 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\LogicException; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Hydrator; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\LazyObjectRegistry; -/** - * @author Nicolas Grekas - */ -final class ProxyHelper -{ - /** - * Helps generate lazy-loading ghost objects. - * - * @throws LogicException When the class is incompatible with ghost objects - */ - public static function generateLazyGhost(\ReflectionClass $class) : string - { - if (\PHP_VERSION_ID >= 80200 && \PHP_VERSION_ID < 80300 && $class->isReadOnly()) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is readonly.', $class->name)); - } - if ($class->isFinal()) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is final.', $class->name)); - } - if ($class->isInterface() || $class->isAbstract()) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: "%s" is not a concrete class.', $class->name)); - } - if (\stdClass::class !== $class->name && $class->isInternal()) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is internal.', $class->name)); - } - if ($class->hasMethod('__get') && 'mixed' !== (self::exportType($class->getMethod('__get')) ?? 'mixed')) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: return type of method "%s::__get()" should be "mixed".', $class->name)); - } - static $traitMethods; - $traitMethods ??= (new \ReflectionClass(LazyGhostTrait::class))->getMethods(); - foreach ($traitMethods as $method) { - if ($class->hasMethod($method->name) && $class->getMethod($method->name)->isFinal()) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: method "%s::%s()" is final.', $class->name, $method->name)); - } - } - $parent = $class; - while ($parent = $parent->getParentClass()) { - if (\stdClass::class !== $parent->name && $parent->isInternal()) { - throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" extends "%s" which is internal.', $class->name, $parent->name)); - } - } - $propertyScopes = self::exportPropertyScopes($class->name); - return <<name} implements \\Symfony\\Component\\VarExporter\\LazyObjectInterface -{ - use \\Symfony\\Component\\VarExporter\\LazyGhostTrait; - - private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes}; -} - -// Help opcache.preload discover always-needed symbols -class_exists(\\Symfony\\Component\\VarExporter\\Internal\\Hydrator::class); -class_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry::class); -class_exists(\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState::class); - -EOPHP; - } - /** - * Helps generate lazy-loading virtual proxies. - * - * @param \ReflectionClass[] $interfaces - * - * @throws LogicException When the class is incompatible with virtual proxies - */ - public static function generateLazyProxy(?\ReflectionClass $class, array $interfaces = []) : string - { - if (!\class_exists($class?->name ?? \stdClass::class, \false)) { - throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not a class.', $class->name)); - } - if ($class?->isFinal()) { - throw new LogicException(\sprintf('Cannot generate lazy proxy: class "%s" is final.', $class->name)); - } - if (\PHP_VERSION_ID >= 80200 && \PHP_VERSION_ID < 80300 && $class?->isReadOnly()) { - throw new LogicException(\sprintf('Cannot generate lazy proxy: class "%s" is readonly.', $class->name)); - } - $methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []]; - foreach ($interfaces as $interface) { - if (!$interface->isInterface()) { - throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name)); - } - $methodReflectors[] = $interface->getMethods(); - } - $methodReflectors = \array_merge(...$methodReflectors); - $extendsInternalClass = \false; - if ($parent = $class) { - do { - $extendsInternalClass = \stdClass::class !== $parent->name && $parent->isInternal(); - } while (!$extendsInternalClass && ($parent = $parent->getParentClass())); - } - $methodsHaveToBeProxied = $extendsInternalClass; - $methods = []; - foreach ($methodReflectors as $method) { - if ('__get' !== \strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) { - continue; - } - $methodsHaveToBeProxied = \true; - $trait = new \ReflectionMethod(LazyProxyTrait::class, '__get'); - $body = \array_slice(\file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine()); - $body[0] = \str_replace('): mixed', '): ' . $type, $body[0]); - $methods['__get'] = \strtr(\implode('', $body) . ' }', ['Hydrator' => '\\' . Hydrator::class, 'Registry' => '\\' . LazyObjectRegistry::class]); - break; - } - foreach ($methodReflectors as $method) { - if ($method->isStatic() && !$method->isAbstract() || isset($methods[$lcName = \strtolower($method->name)])) { - continue; - } - if ($method->isFinal()) { - if ($extendsInternalClass || $methodsHaveToBeProxied || \method_exists(LazyProxyTrait::class, $method->name)) { - throw new LogicException(\sprintf('Cannot generate lazy proxy: method "%s::%s()" is final.', $class->name, $method->name)); - } - continue; - } - if (\method_exists(LazyProxyTrait::class, $method->name) || $method->isProtected() && !$method->isAbstract()) { - continue; - } - $signature = self::exportSignature($method, \true, $args); - $parentCall = $method->isAbstract() ? "throw new \\BadMethodCallException('Cannot forward abstract method \"{$method->class}::{$method->name}()\".')" : "parent::{$method->name}({$args})"; - if ($method->isStatic()) { - $body = " {$parentCall};"; - } elseif (\str_ends_with($signature, '): never') || \str_ends_with($signature, '): void')) { - $body = <<lazyObjectState)) { - (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args}); - } else { - {$parentCall}; - } -EOPHP; - } else { - if (!$methodsHaveToBeProxied && !$method->isAbstract()) { - // Skip proxying methods that might return $this - foreach (\preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) { - if (\in_array($type = \ltrim($type, '?'), ['static', 'object'], \true)) { - continue 2; - } - foreach ([$class, ...$interfaces] as $r) { - if ($r && \is_a($r->name, $type, \true)) { - continue 3; - } - } - } - } - $body = <<lazyObjectState)) { - return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args}); - } - - return {$parentCall}; -EOPHP; - } - $methods[$lcName] = " {$signature}\n {\n{$body}\n }"; - } - $types = $interfaces = \array_unique(\array_column($interfaces, 'name')); - $interfaces[] = LazyObjectInterface::class; - $interfaces = \implode(', \\', $interfaces); - $parent = $class ? ' extends \\' . $class->name : ''; - \array_unshift($types, $class ? 'parent' : ''); - $type = \ltrim(\implode('&\\', $types), '&'); - if (!$class) { - $trait = new \ReflectionMethod(LazyProxyTrait::class, 'initializeLazyObject'); - $body = \array_slice(\file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine()); - $body[0] = \str_replace('): parent', '): ' . $type, $body[0]); - $methods = ['initializeLazyObject' => \implode('', $body) . ' }'] + $methods; - } - $body = $methods ? "\n" . \implode("\n\n", $methods) . "\n" : ''; - $propertyScopes = $class ? self::exportPropertyScopes($class->name) : '[]'; - return <<getParameters() as $param) { - $parameters[] = ($param->getAttributes(\SensitiveParameter::class) ? '#[\\SensitiveParameter] ' : '') . ($withParameterTypes && $param->hasType() ? self::exportType($param) . ' ' : '') . ($param->isPassedByReference() ? '&' : '') . ($param->isVariadic() ? '...' : '') . '$' . $param->name . ($param->isOptional() && !$param->isVariadic() ? ' = ' . self::exportDefault($param) : ''); - $hasByRef = $hasByRef || $param->isPassedByReference(); - $args .= ($param->isVariadic() ? '...$' : '$') . $param->name . ', '; - } - if (!$param || !$hasByRef) { - $args = '...\\func_get_args()'; - } elseif ($param->isVariadic()) { - $args = \substr($args, 0, -2); - } else { - $args .= \sprintf('...\\array_slice(\\func_get_args(), %d)', \count($parameters)); - } - $signature = 'function ' . ($function->returnsReference() ? '&' : '') . ($function->isClosure() ? '' : $function->name) . '(' . \implode(', ', $parameters) . ')'; - if ($function instanceof \ReflectionMethod) { - $signature = ($function->isPublic() ? 'public ' : ($function->isProtected() ? 'protected ' : 'private ')) . ($function->isStatic() ? 'static ' : '') . $signature; - } - if ($function->hasReturnType()) { - $signature .= ': ' . self::exportType($function); - } - static $getPrototype; - $getPrototype ??= (new \ReflectionMethod(\ReflectionMethod::class, 'getPrototype'))->invoke(...); - while ($function) { - if ($function->hasTentativeReturnType()) { - return '#[\\ReturnTypeWillChange] ' . $signature; - } - try { - $function = $function instanceof \ReflectionMethod && $function->isAbstract() ? \false : $getPrototype($function); - } catch (\ReflectionException) { - break; - } - } - return $signature; - } - public static function exportType(\ReflectionFunctionAbstract|\ReflectionProperty|\ReflectionParameter $owner, bool $noBuiltin = \false, \ReflectionType $type = null) : ?string - { - if (!($type ??= $owner instanceof \ReflectionFunctionAbstract ? $owner->getReturnType() : $owner->getType())) { - return null; - } - $class = null; - $types = []; - if ($type instanceof \ReflectionUnionType) { - $reflectionTypes = $type->getTypes(); - $glue = '|'; - } elseif ($type instanceof \ReflectionIntersectionType) { - $reflectionTypes = $type->getTypes(); - $glue = '&'; - } else { - $reflectionTypes = [$type]; - $glue = null; - } - foreach ($reflectionTypes as $type) { - if ($type instanceof \ReflectionIntersectionType) { - if ('' !== ($name = '(' . self::exportType($owner, $noBuiltin, $type) . ')')) { - $types[] = $name; - } - continue; - } - $name = $type->getName(); - if ($noBuiltin && $type->isBuiltin()) { - continue; - } - if (\in_array($name, ['parent', 'self'], \true) && ($class ??= $owner->getDeclaringClass())) { - $name = 'parent' === $name ? ($class->getParentClass() ?: null)?->name ?? 'parent' : $class->name; - } - $types[] = ($noBuiltin || $type->isBuiltin() || 'static' === $name ? '' : '\\') . $name; - } - if (!$types) { - return ''; - } - if (null === $glue) { - return (!$noBuiltin && $type->allowsNull() && 'mixed' !== $name ? '?' : '') . $types[0]; - } - \sort($types); - return \implode($glue, $types); - } - private static function exportPropertyScopes(string $parent) : string - { - $propertyScopes = Hydrator::$propertyScopes[$parent] ??= Hydrator::getPropertyScopes($parent); - \uksort($propertyScopes, 'strnatcmp'); - $propertyScopes = VarExporter::export($propertyScopes); - $propertyScopes = \str_replace(VarExporter::export($parent), 'parent::class', $propertyScopes); - $propertyScopes = \preg_replace("/(?|(,)\n( ) |\n |,\n (\\]))/", '$1$2', $propertyScopes); - $propertyScopes = \str_replace("\n", "\n ", $propertyScopes); - return $propertyScopes; - } - private static function exportDefault(\ReflectionParameter $param) : string - { - $default = \rtrim(\substr(\explode('$' . $param->name . ' = ', (string) $param, 2)[1] ?? '', 0, -2)); - if (\in_array($default, ['', 'NULL'], \true)) { - return 'null'; - } - if (\str_ends_with($default, "...'") && \preg_match("/^'(?:[^'\\\\]*+(?:\\\\.)*+)*+'\$/", $default)) { - return VarExporter::export($param->getDefaultValue()); - } - $regexp = "/(\"(?:[^\"\\\\]*+(?:\\\\.)*+)*+\"|'(?:[^'\\\\]*+(?:\\\\.)*+)*+')/"; - $parts = \preg_split($regexp, $default, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); - $regexp = '/([\\[\\( ]|^)([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*+(?:\\\\[a-zA-Z0-9_\\x7f-\\xff]++)*+)(?!: )/'; - $callback = \false !== \strpbrk($default, "\\:('") && ($class = $param->getDeclaringClass()) ? fn($m) => $m[1] . match ($m[2]) { - 'new', 'false', 'true', 'null' => $m[2], - 'NULL' => 'null', - 'self' => '\\' . $class->name, - 'namespace\\parent', 'parent' => ($parent = $class->getParentClass()) ? '\\' . $parent->name : 'parent', - default => '\\' . $m[2], - } : fn($m) => $m[1] . match ($m[2]) { - 'new', 'false', 'true', 'null', 'self', 'parent' => $m[2], - 'NULL' => 'null', - default => '\\' . $m[2], - }; - return \implode('', \array_map(fn($part) => match ($part[0]) { - '"' => $part, - // for internal classes only - "'" => \false !== \strpbrk($part, "\\\x00\r\n") ? '"' . \substr(\str_replace(['$', "\x00", "\r", "\n"], ['\\$', '\\0', '\\r', '\\n'], $part), 1, -1) . '"' : $part, - default => \preg_replace_callback($regexp, $callback, $part), - }, $parts)); - } -} diff --git a/dependencies/symfony/var-exporter/VarExporter.php b/dependencies/symfony/var-exporter/VarExporter.php deleted file mode 100644 index 6df5db3..0000000 --- a/dependencies/symfony/var-exporter/VarExporter.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Symfony\Component\VarExporter; - -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Exception\ExceptionInterface; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Exporter; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Hydrator; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Registry; -use WP_Ultimo\Dependencies\Symfony\Component\VarExporter\Internal\Values; -/** - * Exports serializable PHP values to PHP code. - * - * VarExporter allows serializing PHP data structures to plain PHP code (like var_export()) - * while preserving all the semantics associated with serialize() (unlike var_export()). - * - * By leveraging OPcache, the generated PHP code is faster than doing the same with unserialize(). - * - * @author Nicolas Grekas - */ -final class VarExporter -{ - /** - * Exports a serializable PHP value to PHP code. - * - * @param bool &$isStaticValue Set to true after execution if the provided value is static, false otherwise - * @param array &$foundClasses Classes found in the value are added to this list as both keys and values - * - * @throws ExceptionInterface When the provided value cannot be serialized - */ - public static function export(mixed $value, bool &$isStaticValue = null, array &$foundClasses = []) : string - { - $isStaticValue = \true; - if (!\is_object($value) && !(\is_array($value) && $value) && !\is_resource($value) || $value instanceof \UnitEnum) { - return Exporter::export($value); - } - $objectsPool = new \SplObjectStorage(); - $refsPool = []; - $objectsCount = 0; - try { - $value = Exporter::prepare([$value], $objectsPool, $refsPool, $objectsCount, $isStaticValue)[0]; - } finally { - $references = []; - foreach ($refsPool as $i => $v) { - if ($v[0]->count) { - $references[1 + $i] = $v[2]; - } - $v[0] = $v[1]; - } - } - if ($isStaticValue) { - return Exporter::export($value); - } - $classes = []; - $values = []; - $states = []; - foreach ($objectsPool as $i => $v) { - [, $class, $values[], $wakeup] = $objectsPool[$v]; - $foundClasses[$class] = $classes[] = $class; - if (0 < $wakeup) { - $states[$wakeup] = $i; - } elseif (0 > $wakeup) { - $states[-$wakeup] = [$i, \array_pop($values)]; - $values[] = []; - } - } - \ksort($states); - $wakeups = [null]; - foreach ($states as $k => $v) { - if (\is_array($v)) { - $wakeups[-$v[0]] = $v[1]; - } else { - $wakeups[] = $v; - } - } - if (null === $wakeups[0]) { - unset($wakeups[0]); - } - $properties = []; - foreach ($values as $i => $vars) { - foreach ($vars as $class => $values) { - foreach ($values as $name => $v) { - $properties[$class][$name][$i] = $v; - } - } - } - if ($classes || $references) { - $value = new Hydrator(new Registry($classes), $references ? new Values($references) : null, $properties, $value, $wakeups); - } else { - $isStaticValue = \true; - } - return Exporter::export($value); - } -} diff --git a/dependencies/webmozart/assert/src/Assert.php b/dependencies/webmozart/assert/src/Assert.php deleted file mode 100644 index dadf09b..0000000 --- a/dependencies/webmozart/assert/src/Assert.php +++ /dev/null @@ -1,1606 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Webmozart\Assert; - -use ArrayAccess; -use BadMethodCallException; -use Closure; -use Countable; -use DateTime; -use DateTimeImmutable; -use Exception; -use ResourceBundle; -use SimpleXMLElement; -use Throwable; -use Traversable; -/** - * Efficient assertions to validate the input/output of your methods. - * - * @since 1.0 - * - * @author Bernhard Schussek - */ -class Assert -{ - use Mixin; - /** - * @psalm-pure - * @psalm-assert string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function string($value, $message = '') - { - if (!\is_string($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a string. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert non-empty-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function stringNotEmpty($value, $message = '') - { - static::string($value, $message); - static::notEq($value, '', $message); - } - /** - * @psalm-pure - * @psalm-assert int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function integer($value, $message = '') - { - if (!\is_int($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an integer. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function integerish($value, $message = '') - { - if (!\is_numeric($value) || $value != (int) $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an integerish value. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert positive-int $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function positiveInteger($value, $message = '') - { - if (!(\is_int($value) && $value > 0)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a positive integer. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert float $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function float($value, $message = '') - { - if (!\is_float($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a float. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function numeric($value, $message = '') - { - if (!\is_numeric($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a numeric. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert positive-int|0 $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function natural($value, $message = '') - { - if (!\is_int($value) || $value < 0) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert bool $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function boolean($value, $message = '') - { - if (!\is_bool($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a boolean. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert scalar $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function scalar($value, $message = '') - { - if (!\is_scalar($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a scalar. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert object $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function object($value, $message = '') - { - if (!\is_object($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an object. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert resource $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function resource($value, $type = null, $message = '') - { - if (!\is_resource($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource. Got: %s', static::typeToString($value))); - } - if ($type && $type !== \get_resource_type($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type)); - } - } - /** - * @psalm-pure - * @psalm-assert callable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isCallable($value, $message = '') - { - if (!\is_callable($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a callable. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert array $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isArray($value, $message = '') - { - if (!\is_array($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isTraversable($value, $message = '') - { - @\trigger_error(\sprintf('The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__), \E_USER_DEPRECATED); - if (!\is_array($value) && !$value instanceof Traversable) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a traversable. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert array|ArrayAccess $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isArrayAccessible($value, $message = '') - { - if (!\is_array($value) && !$value instanceof ArrayAccess) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array accessible. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert countable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isCountable($value, $message = '') - { - if (!\is_array($value) && !$value instanceof Countable && !$value instanceof ResourceBundle && !$value instanceof SimpleXMLElement) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a countable. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isIterable($value, $message = '') - { - if (!\is_array($value) && !$value instanceof Traversable) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an iterable. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOf($value, $class, $message = '') - { - if (!$value instanceof $class) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class)); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert !ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notInstanceOf($value, $class, $message = '') - { - if ($value instanceof $class) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class)); - } - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOfAny($value, array $classes, $message = '') - { - foreach ($classes as $class) { - if ($value instanceof $class) { - return; - } - } - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array(static::class, 'valueToString'), $classes)))); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAOf($value, $class, $message = '') - { - static::string($class, 'Expected class as a string. Got: %s'); - if (!\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s', static::valueToString($value), $class)); - } - } - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * @psalm-assert !UnexpectedType $value - * @psalm-assert !class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNotA($value, $class, $message = '') - { - static::string($class, 'Expected class as a string. Got: %s'); - if (\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s', static::valueToString($value), $class)); - } - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param object|string $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAnyOf($value, array $classes, $message = '') - { - foreach ($classes as $class) { - static::string($class, 'Expected class as a string. Got: %s'); - if (\is_a($value, $class, \is_string($value))) { - return; - } - } - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s', static::valueToString($value), \implode(', ', $classes))); - } - /** - * @psalm-pure - * @psalm-assert empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isEmpty($value, $message = '') - { - if (!empty($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an empty value. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert !empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEmpty($value, $message = '') - { - if (empty($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-empty value. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function null($value, $message = '') - { - if (null !== $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected null. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert !null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notNull($value, $message = '') - { - if (null === $value) { - static::reportInvalidArgument($message ?: 'Expected a value other than null.'); - } - } - /** - * @psalm-pure - * @psalm-assert true $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function true($value, $message = '') - { - if (\true !== $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be true. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function false($value, $message = '') - { - if (\false !== $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be false. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert !false $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notFalse($value, $message = '') - { - if (\false === $value) { - static::reportInvalidArgument($message ?: 'Expected a value other than false.'); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ip($value, $message = '') - { - if (\false === \filter_var($value, \FILTER_VALIDATE_IP)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IP. Got: %s', static::valueToString($value))); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ipv4($value, $message = '') - { - if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv4. Got: %s', static::valueToString($value))); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function ipv6($value, $message = '') - { - if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv6. Got: %s', static::valueToString($value))); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function email($value, $message = '') - { - if (\false === \filter_var($value, \FILTER_VALIDATE_EMAIL)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be a valid e-mail address. Got: %s', static::valueToString($value))); - } - } - /** - * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. - * - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function uniqueValues(array $values, $message = '') - { - $allValues = \count($values); - $uniqueValues = \count(\array_unique($values)); - if ($allValues !== $uniqueValues) { - $difference = $allValues - $uniqueValues; - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array of unique values, but %s of them %s duplicated', $difference, 1 === $difference ? 'is' : 'are')); - } - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function eq($value, $expect, $message = '') - { - if ($expect != $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); - } - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEq($value, $expect, $message = '') - { - if ($expect == $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a different value than %s.', static::valueToString($expect))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function same($value, $expect, $message = '') - { - if ($expect !== $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notSame($value, $expect, $message = '') - { - if ($expect === $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not identical to %s.', static::valueToString($expect))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function greaterThan($value, $limit, $message = '') - { - if ($value <= $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function greaterThanEq($value, $limit, $message = '') - { - if ($value < $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lessThan($value, $limit, $message = '') - { - if ($value >= $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lessThanEq($value, $limit, $message = '') - { - if ($value > $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); - } - } - /** - * Inclusive range, so Assert::(3, 3, 5) passes. - * - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function range($value, $min, $max, $message = '') - { - if ($value < $min || $value > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), static::valueToString($max))); - } - } - /** - * A more human-readable alias of Assert::inArray(). - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function oneOf($value, array $values, $message = '') - { - static::inArray($value, $values, $message); - } - /** - * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function inArray($value, array $values, $message = '') - { - if (!\in_array($value, $values, \true)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), \implode(', ', \array_map(array(static::class, 'valueToString'), $values)))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function contains($value, $subString, $message = '') - { - if (\false === \strpos($value, $subString)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s. Got: %s', static::valueToString($value), static::valueToString($subString))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notContains($value, $subString, $message = '') - { - if (\false !== \strpos($value, $subString)) { - static::reportInvalidArgument(\sprintf($message ?: '%2$s was not expected to be contained in a value. Got: %s', static::valueToString($value), static::valueToString($subString))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notWhitespaceOnly($value, $message = '') - { - if (\preg_match('/^\\s*$/', $value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWith($value, $prefix, $message = '') - { - if (0 !== \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notStartsWith($value, $prefix, $message = '') - { - if (0 === \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWithLetter($value, $message = '') - { - static::string($value); - $valid = isset($value[0]); - if ($valid) { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = \ctype_alpha($value[0]); - \setlocale(\LC_CTYPE, $locale); - } - if (!$valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function endsWith($value, $suffix, $message = '') - { - if ($suffix !== \substr($value, -\strlen($suffix))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notEndsWith($value, $suffix, $message = '') - { - if ($suffix === \substr($value, -\strlen($suffix))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function regex($value, $pattern, $message = '') - { - if (!\preg_match($pattern, $value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The value %s does not match the expected pattern.', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notRegex($value, $pattern, $message = '') - { - if (\preg_match($pattern, $value, $matches, \PREG_OFFSET_CAPTURE)) { - static::reportInvalidArgument(\sprintf($message ?: 'The value %s matches the pattern %s (at offset %d).', static::valueToString($value), static::valueToString($pattern), $matches[0][1])); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function unicodeLetters($value, $message = '') - { - static::string($value); - if (!\preg_match('/^\\p{L}+$/u', $value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain only Unicode letters. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function alpha($value, $message = '') - { - static::string($value); - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_alpha($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain only letters. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function digits($value, $message = '') - { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_digit($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain digits only. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function alnum($value, $message = '') - { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_alnum($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert lowercase-string $value - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lower($value, $message = '') - { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_lower($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-assert !lowercase-string $value - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function upper($value, $message = '') - { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_upper($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * - * @param string $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function length($value, $length, $message = '') - { - if ($length !== static::strlen($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length)); - } - } - /** - * Inclusive min. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function minLength($value, $min, $message = '') - { - if (static::strlen($value) < $min) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min)); - } - } - /** - * Inclusive max. - * - * @psalm-pure - * - * @param string $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function maxLength($value, $max, $message = '') - { - if (static::strlen($value) > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max)); - } - } - /** - * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function lengthBetween($value, $min, $max, $message = '') - { - $length = static::strlen($value); - if ($length < $min || $length > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, $max)); - } - } - /** - * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function fileExists($value, $message = '') - { - static::string($value); - if (!\file_exists($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The file %s does not exist.', static::valueToString($value))); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function file($value, $message = '') - { - static::fileExists($value, $message); - if (!\is_file($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not a file.', static::valueToString($value))); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function directory($value, $message = '') - { - static::fileExists($value, $message); - if (!\is_dir($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is no directory.', static::valueToString($value))); - } - } - /** - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function readable($value, $message = '') - { - if (!\is_readable($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not readable.', static::valueToString($value))); - } - } - /** - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function writable($value, $message = '') - { - if (!\is_writable($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not writable.', static::valueToString($value))); - } - } - /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function classExists($value, $message = '') - { - if (!\class_exists($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing class name. Got: %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function subclassOf($value, $class, $message = '') - { - if (!\is_subclass_of($value, $class)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class))); - } - } - /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function interfaceExists($value, $message = '') - { - if (!\interface_exists($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing interface name. got %s', static::valueToString($value))); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function implementsInterface($value, $interface, $message = '') - { - if (!\in_array($interface, \class_implements($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface))); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function propertyExists($classOrObject, $property, $message = '') - { - if (!\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to exist.', static::valueToString($property))); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function propertyNotExists($classOrObject, $property, $message = '') - { - if (\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to not exist.', static::valueToString($property))); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function methodExists($classOrObject, $method, $message = '') - { - if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to exist.', static::valueToString($method))); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject - * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function methodNotExists($classOrObject, $method, $message = '') - { - if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to not exist.', static::valueToString($method))); - } - } - /** - * @psalm-pure - * - * @param array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function keyExists($array, $key, $message = '') - { - if (!(isset($array[$key]) || \array_key_exists($key, $array))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to exist.', static::valueToString($key))); - } - } - /** - * @psalm-pure - * - * @param array $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function keyNotExists($array, $key, $message = '') - { - if (isset($array[$key]) || \array_key_exists($key, $array)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to not exist.', static::valueToString($key))); - } - } - /** - * Checks if a value is a valid array key (int or string). - * - * @psalm-pure - * @psalm-assert array-key $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function validArrayKey($value, $message = '') - { - if (!(\is_int($value) || \is_string($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected string or integer. Got: %s', static::typeToString($value))); - } - } - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function count($array, $number, $message = '') - { - static::eq(\count($array), $number, \sprintf($message ?: 'Expected an array to contain %d elements. Got: %d.', $number, \count($array))); - } - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function minCount($array, $min, $message = '') - { - if (\count($array) < $min) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at least %2$d elements. Got: %d', \count($array), $min)); - } - } - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function maxCount($array, $max, $message = '') - { - if (\count($array) > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at most %2$d elements. Got: %d', \count($array), $max)); - } - } - /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. - * - * @param Countable|array $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function countBetween($array, $min, $max, $message = '') - { - $count = \count($array); - if ($count < $min || $count > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, $max)); - } - } - /** - * @psalm-pure - * @psalm-assert list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isList($array, $message = '') - { - if (!\is_array($array)) { - static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); - } - if ($array === \array_values($array)) { - return; - } - $nextKey = -1; - foreach ($array as $k => $v) { - if ($k !== ++$nextKey) { - static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); - } - } - } - /** - * @psalm-pure - * @psalm-assert non-empty-list $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNonEmptyList($array, $message = '') - { - static::isList($array, $message); - static::notEmpty($array, $message); - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isMap($array, $message = '') - { - if (!\is_array($array) || \array_keys($array) !== \array_filter(\array_keys($array), '\\is_string')) { - static::reportInvalidArgument($message ?: 'Expected map - associative array with string keys.'); - } - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * @psalm-assert !empty $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isNonEmptyMap($array, $message = '') - { - static::isMap($array, $message); - static::notEmpty($array, $message); - } - /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function uuid($value, $message = '') - { - $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); - // The nil UUID is special form of UUID that is specified to have all - // 128 bits set to zero. - if ('00000000-0000-0000-0000-000000000000' === $value) { - return; - } - if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Value %s is not a valid UUID.', static::valueToString($value))); - } - } - /** - * @psalm-param class-string $class - * - * @param Closure $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function throws(Closure $expression, $class = 'Exception', $message = '') - { - static::string($class); - $actual = 'none'; - try { - $expression(); - } catch (Exception $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } catch (Throwable $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } - static::reportInvalidArgument($message ?: \sprintf('Expected to throw "%s", got "%s"', $class, $actual)); - } - /** - * @throws BadMethodCallException - */ - public static function __callStatic($name, $arguments) - { - if ('nullOr' === \substr($name, 0, 6)) { - if (null !== $arguments[0]) { - $method = \lcfirst(\substr($name, 6)); - \call_user_func_array(array(static::class, $method), $arguments); - } - return; - } - if ('all' === \substr($name, 0, 3)) { - static::isIterable($arguments[0]); - $method = \lcfirst(\substr($name, 3)); - $args = $arguments; - foreach ($arguments[0] as $entry) { - $args[0] = $entry; - \call_user_func_array(array(static::class, $method), $args); - } - return; - } - throw new BadMethodCallException('No such method: ' . $name); - } - /** - * @param mixed $value - * - * @return string - */ - protected static function valueToString($value) - { - if (null === $value) { - return 'null'; - } - if (\true === $value) { - return 'true'; - } - if (\false === $value) { - return 'false'; - } - if (\is_array($value)) { - return 'array'; - } - if (\is_object($value)) { - if (\method_exists($value, '__toString')) { - return \get_class($value) . ': ' . self::valueToString($value->__toString()); - } - if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { - return \get_class($value) . ': ' . self::valueToString($value->format('c')); - } - return \get_class($value); - } - if (\is_resource($value)) { - return 'resource'; - } - if (\is_string($value)) { - return '"' . $value . '"'; - } - return (string) $value; - } - /** - * @param mixed $value - * - * @return string - */ - protected static function typeToString($value) - { - return \is_object($value) ? \get_class($value) : \gettype($value); - } - protected static function strlen($value) - { - if (!\function_exists('mb_detect_encoding')) { - return \strlen($value); - } - if (\false === ($encoding = \mb_detect_encoding($value))) { - return \strlen($value); - } - return \mb_strlen($value, $encoding); - } - /** - * @param string $message - * - * @throws InvalidArgumentException - * - * @psalm-pure this method is not supposed to perform side-effects - * @psalm-return never - */ - protected static function reportInvalidArgument($message) - { - throw new InvalidArgumentException($message); - } - private function __construct() - { - } -} diff --git a/dependencies/webmozart/assert/src/InvalidArgumentException.php b/dependencies/webmozart/assert/src/InvalidArgumentException.php deleted file mode 100644 index b71c039..0000000 --- a/dependencies/webmozart/assert/src/InvalidArgumentException.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace WP_Ultimo\Dependencies\Webmozart\Assert; - -class InvalidArgumentException extends \InvalidArgumentException -{ -} diff --git a/dependencies/webmozart/assert/src/Mixin.php b/dependencies/webmozart/assert/src/Mixin.php deleted file mode 100644 index 99c75a4..0000000 --- a/dependencies/webmozart/assert/src/Mixin.php +++ /dev/null @@ -1,4630 +0,0 @@ - $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allString($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::string($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrString($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::string($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert non-empty-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrStringNotEmpty($value, $message = '') - { - null === $value || static::stringNotEmpty($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allStringNotEmpty($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::stringNotEmpty($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrStringNotEmpty($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::stringNotEmpty($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert int|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInteger($value, $message = '') - { - null === $value || static::integer($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInteger($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::integer($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrInteger($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::integer($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert numeric|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIntegerish($value, $message = '') - { - null === $value || static::integerish($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIntegerish($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::integerish($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIntegerish($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::integerish($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert positive-int|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPositiveInteger($value, $message = '') - { - null === $value || static::positiveInteger($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPositiveInteger($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::positiveInteger($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrPositiveInteger($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::positiveInteger($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert float|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFloat($value, $message = '') - { - null === $value || static::float($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFloat($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::float($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFloat($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::float($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert numeric|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNumeric($value, $message = '') - { - null === $value || static::numeric($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNumeric($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::numeric($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNumeric($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::numeric($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert positive-int|0|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNatural($value, $message = '') - { - null === $value || static::natural($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNatural($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::natural($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNatural($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::natural($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert bool|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrBoolean($value, $message = '') - { - null === $value || static::boolean($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allBoolean($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::boolean($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrBoolean($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::boolean($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert scalar|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrScalar($value, $message = '') - { - null === $value || static::scalar($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allScalar($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::scalar($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrScalar($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::scalar($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert object|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrObject($value, $message = '') - { - null === $value || static::object($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allObject($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::object($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrObject($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::object($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert resource|null $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrResource($value, $type = null, $message = '') - { - null === $value || static::resource($value, $type, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allResource($value, $type = null, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::resource($entry, $type, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrResource($value, $type = null, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::resource($entry, $type, $message); - } - } - /** - * @psalm-pure - * @psalm-assert callable|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsCallable($value, $message = '') - { - null === $value || static::isCallable($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsCallable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isCallable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsCallable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isCallable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert array|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsArray($value, $message = '') - { - null === $value || static::isArray($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsArray($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isArray($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsArray($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isArray($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable|null $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsTraversable($value, $message = '') - { - null === $value || static::isTraversable($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsTraversable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isTraversable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsTraversable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isTraversable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert array|ArrayAccess|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsArrayAccessible($value, $message = '') - { - null === $value || static::isArrayAccessible($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsArrayAccessible($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isArrayAccessible($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsArrayAccessible($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isArrayAccessible($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert countable|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsCountable($value, $message = '') - { - null === $value || static::isCountable($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsCountable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isCountable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsCountable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isCountable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsIterable($value, $message = '') - { - null === $value || static::isIterable($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsIterable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isIterable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsIterable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isIterable($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|null $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsInstanceOf($value, $class, $message = '') - { - null === $value || static::isInstanceOf($value, $class, $message); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isInstanceOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isInstanceOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotInstanceOf($value, $class, $message = '') - { - null === $value || static::notInstanceOf($value, $class, $message); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notInstanceOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotInstanceOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notInstanceOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsInstanceOfAny($value, $classes, $message = '') - { - null === $value || static::isInstanceOfAny($value, $classes, $message); - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsInstanceOfAny($value, $classes, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isInstanceOfAny($entry, $classes, $message); - } - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsInstanceOfAny($value, $classes, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isInstanceOfAny($entry, $classes, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string|null $value - * - * @param object|string|null $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsAOf($value, $class, $message = '') - { - null === $value || static::isAOf($value, $class, $message); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsAOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isAOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|null> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsAOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isAOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param object|string|null $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNotA($value, $class, $message = '') - { - null === $value || static::isNotA($value, $class, $message); - } - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNotA($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isNotA($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable $value - * @psalm-assert iterable|null> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsNotA($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isNotA($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param object|string|null $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsAnyOf($value, $classes, $message = '') - { - null === $value || static::isAnyOf($value, $classes, $message); - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param iterable $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsAnyOf($value, $classes, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isAnyOf($entry, $classes, $message); - } - } - /** - * @psalm-pure - * @psalm-param array $classes - * - * @param iterable $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsAnyOf($value, $classes, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isAnyOf($entry, $classes, $message); - } - } - /** - * @psalm-pure - * @psalm-assert empty $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsEmpty($value, $message = '') - { - null === $value || static::isEmpty($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsEmpty($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::isEmpty($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsEmpty($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::isEmpty($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotEmpty($value, $message = '') - { - null === $value || static::notEmpty($value, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotEmpty($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notEmpty($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotEmpty($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notEmpty($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNull($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::null($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotNull($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notNull($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert true|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrTrue($value, $message = '') - { - null === $value || static::true($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allTrue($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::true($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrTrue($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::true($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert false|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFalse($value, $message = '') - { - null === $value || static::false($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFalse($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::false($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFalse($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::false($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotFalse($value, $message = '') - { - null === $value || static::notFalse($value, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotFalse($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notFalse($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotFalse($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notFalse($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIp($value, $message = '') - { - null === $value || static::ip($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIp($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::ip($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIp($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::ip($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIpv4($value, $message = '') - { - null === $value || static::ipv4($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIpv4($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::ipv4($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIpv4($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::ipv4($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIpv6($value, $message = '') - { - null === $value || static::ipv6($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIpv6($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::ipv6($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIpv6($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::ipv6($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrEmail($value, $message = '') - { - null === $value || static::email($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allEmail($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::email($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrEmail($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::email($entry, $message); - } - } - /** - * @param array|null $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUniqueValues($values, $message = '') - { - null === $values || static::uniqueValues($values, $message); - } - /** - * @param iterable $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUniqueValues($values, $message = '') - { - static::isIterable($values); - foreach ($values as $entry) { - static::uniqueValues($entry, $message); - } - } - /** - * @param iterable $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUniqueValues($values, $message = '') - { - static::isIterable($values); - foreach ($values as $entry) { - null === $entry || static::uniqueValues($entry, $message); - } - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrEq($value, $expect, $message = '') - { - null === $value || static::eq($value, $expect, $message); - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allEq($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::eq($entry, $expect, $message); - } - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrEq($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::eq($entry, $expect, $message); - } - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotEq($value, $expect, $message = '') - { - null === $value || static::notEq($value, $expect, $message); - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotEq($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notEq($entry, $expect, $message); - } - } - /** - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotEq($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notEq($entry, $expect, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrSame($value, $expect, $message = '') - { - null === $value || static::same($value, $expect, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allSame($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::same($entry, $expect, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrSame($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::same($entry, $expect, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotSame($value, $expect, $message = '') - { - null === $value || static::notSame($value, $expect, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotSame($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notSame($entry, $expect, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotSame($value, $expect, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notSame($entry, $expect, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrGreaterThan($value, $limit, $message = '') - { - null === $value || static::greaterThan($value, $limit, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allGreaterThan($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::greaterThan($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrGreaterThan($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::greaterThan($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrGreaterThanEq($value, $limit, $message = '') - { - null === $value || static::greaterThanEq($value, $limit, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allGreaterThanEq($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::greaterThanEq($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrGreaterThanEq($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::greaterThanEq($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLessThan($value, $limit, $message = '') - { - null === $value || static::lessThan($value, $limit, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLessThan($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::lessThan($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLessThan($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::lessThan($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLessThanEq($value, $limit, $message = '') - { - null === $value || static::lessThanEq($value, $limit, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLessThanEq($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::lessThanEq($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLessThanEq($value, $limit, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::lessThanEq($entry, $limit, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrRange($value, $min, $max, $message = '') - { - null === $value || static::range($value, $min, $max, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allRange($value, $min, $max, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::range($entry, $min, $max, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrRange($value, $min, $max, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::range($entry, $min, $max, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrOneOf($value, $values, $message = '') - { - null === $value || static::oneOf($value, $values, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allOneOf($value, $values, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::oneOf($entry, $values, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrOneOf($value, $values, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::oneOf($entry, $values, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInArray($value, $values, $message = '') - { - null === $value || static::inArray($value, $values, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInArray($value, $values, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::inArray($entry, $values, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrInArray($value, $values, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::inArray($entry, $values, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrContains($value, $subString, $message = '') - { - null === $value || static::contains($value, $subString, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allContains($value, $subString, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::contains($entry, $subString, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrContains($value, $subString, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::contains($entry, $subString, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotContains($value, $subString, $message = '') - { - null === $value || static::notContains($value, $subString, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotContains($value, $subString, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notContains($entry, $subString, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotContains($value, $subString, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notContains($entry, $subString, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotWhitespaceOnly($value, $message = '') - { - null === $value || static::notWhitespaceOnly($value, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotWhitespaceOnly($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notWhitespaceOnly($entry, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotWhitespaceOnly($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notWhitespaceOnly($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrStartsWith($value, $prefix, $message = '') - { - null === $value || static::startsWith($value, $prefix, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::startsWith($entry, $prefix, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::startsWith($entry, $prefix, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotStartsWith($value, $prefix, $message = '') - { - null === $value || static::notStartsWith($value, $prefix, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notStartsWith($entry, $prefix, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotStartsWith($value, $prefix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notStartsWith($entry, $prefix, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrStartsWithLetter($value, $message = '') - { - null === $value || static::startsWithLetter($value, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allStartsWithLetter($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::startsWithLetter($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrStartsWithLetter($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::startsWithLetter($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrEndsWith($value, $suffix, $message = '') - { - null === $value || static::endsWith($value, $suffix, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::endsWith($entry, $suffix, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::endsWith($entry, $suffix, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotEndsWith($value, $suffix, $message = '') - { - null === $value || static::notEndsWith($value, $suffix, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notEndsWith($entry, $suffix, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotEndsWith($value, $suffix, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notEndsWith($entry, $suffix, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrRegex($value, $pattern, $message = '') - { - null === $value || static::regex($value, $pattern, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allRegex($value, $pattern, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::regex($entry, $pattern, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrRegex($value, $pattern, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::regex($entry, $pattern, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrNotRegex($value, $pattern, $message = '') - { - null === $value || static::notRegex($value, $pattern, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNotRegex($value, $pattern, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::notRegex($entry, $pattern, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrNotRegex($value, $pattern, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::notRegex($entry, $pattern, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUnicodeLetters($value, $message = '') - { - null === $value || static::unicodeLetters($value, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUnicodeLetters($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::unicodeLetters($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUnicodeLetters($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::unicodeLetters($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrAlpha($value, $message = '') - { - null === $value || static::alpha($value, $message); - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allAlpha($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::alpha($entry, $message); - } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrAlpha($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::alpha($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrDigits($value, $message = '') - { - null === $value || static::digits($value, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allDigits($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::digits($entry, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrDigits($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::digits($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrAlnum($value, $message = '') - { - null === $value || static::alnum($value, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allAlnum($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::alnum($entry, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrAlnum($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::alnum($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert lowercase-string|null $value - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLower($value, $message = '') - { - null === $value || static::lower($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLower($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::lower($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLower($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::lower($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUpper($value, $message = '') - { - null === $value || static::upper($value, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUpper($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::upper($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUpper($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::upper($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLength($value, $length, $message = '') - { - null === $value || static::length($value, $length, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLength($value, $length, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::length($entry, $length, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLength($value, $length, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::length($entry, $length, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMinLength($value, $min, $message = '') - { - null === $value || static::minLength($value, $min, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMinLength($value, $min, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::minLength($entry, $min, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMinLength($value, $min, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::minLength($entry, $min, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMaxLength($value, $max, $message = '') - { - null === $value || static::maxLength($value, $max, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMaxLength($value, $max, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::maxLength($entry, $max, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMaxLength($value, $max, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::maxLength($entry, $max, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLengthBetween($value, $min, $max, $message = '') - { - null === $value || static::lengthBetween($value, $min, $max, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLengthBetween($value, $min, $max, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::lengthBetween($entry, $min, $max, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrLengthBetween($value, $min, $max, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::lengthBetween($entry, $min, $max, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFileExists($value, $message = '') - { - null === $value || static::fileExists($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFileExists($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::fileExists($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFileExists($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::fileExists($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrFile($value, $message = '') - { - null === $value || static::file($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allFile($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::file($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrFile($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::file($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrDirectory($value, $message = '') - { - null === $value || static::directory($value, $message); - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allDirectory($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::directory($entry, $message); - } - } - /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrDirectory($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::directory($entry, $message); - } - } - /** - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrReadable($value, $message = '') - { - null === $value || static::readable($value, $message); - } - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allReadable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::readable($entry, $message); - } - } - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrReadable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::readable($entry, $message); - } - } - /** - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrWritable($value, $message = '') - { - null === $value || static::writable($value, $message); - } - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allWritable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::writable($entry, $message); - } - } - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrWritable($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::writable($entry, $message); - } - } - /** - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrClassExists($value, $message = '') - { - null === $value || static::classExists($value, $message); - } - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allClassExists($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::classExists($entry, $message); - } - } - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrClassExists($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::classExists($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType|null $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrSubclassOf($value, $class, $message = '') - { - null === $value || static::subclassOf($value, $class, $message); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|ExpectedType> $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allSubclassOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::subclassOf($entry, $class, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|ExpectedType|null> $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrSubclassOf($value, $class, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::subclassOf($entry, $class, $message); - } - } - /** - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInterfaceExists($value, $message = '') - { - null === $value || static::interfaceExists($value, $message); - } - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInterfaceExists($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::interfaceExists($entry, $message); - } - } - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrInterfaceExists($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::interfaceExists($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrImplementsInterface($value, $interface, $message = '') - { - null === $value || static::implementsInterface($value, $interface, $message); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert iterable> $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allImplementsInterface($value, $interface, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::implementsInterface($entry, $interface, $message); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert iterable|null> $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrImplementsInterface($value, $interface, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::implementsInterface($entry, $interface, $message); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPropertyExists($classOrObject, $property, $message = '') - { - null === $classOrObject || static::propertyExists($classOrObject, $property, $message); - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPropertyExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - static::propertyExists($entry, $property, $message); - } - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrPropertyExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - null === $entry || static::propertyExists($entry, $property, $message); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') - { - null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message); - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPropertyNotExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - static::propertyNotExists($entry, $property, $message); - } - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - null === $entry || static::propertyNotExists($entry, $property, $message); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMethodExists($classOrObject, $method, $message = '') - { - null === $classOrObject || static::methodExists($classOrObject, $method, $message); - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMethodExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - static::methodExists($entry, $method, $message); - } - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMethodExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - null === $entry || static::methodExists($entry, $method, $message); - } - } - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMethodNotExists($classOrObject, $method, $message = '') - { - null === $classOrObject || static::methodNotExists($classOrObject, $method, $message); - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMethodNotExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - static::methodNotExists($entry, $method, $message); - } - } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMethodNotExists($classOrObject, $method, $message = '') - { - static::isIterable($classOrObject); - foreach ($classOrObject as $entry) { - null === $entry || static::methodNotExists($entry, $method, $message); - } - } - /** - * @psalm-pure - * - * @param array|null $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrKeyExists($array, $key, $message = '') - { - null === $array || static::keyExists($array, $key, $message); - } - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allKeyExists($array, $key, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::keyExists($entry, $key, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrKeyExists($array, $key, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::keyExists($entry, $key, $message); - } - } - /** - * @psalm-pure - * - * @param array|null $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrKeyNotExists($array, $key, $message = '') - { - null === $array || static::keyNotExists($array, $key, $message); - } - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allKeyNotExists($array, $key, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::keyNotExists($entry, $key, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrKeyNotExists($array, $key, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::keyNotExists($entry, $key, $message); - } - } - /** - * @psalm-pure - * @psalm-assert array-key|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrValidArrayKey($value, $message = '') - { - null === $value || static::validArrayKey($value, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allValidArrayKey($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::validArrayKey($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrValidArrayKey($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::validArrayKey($entry, $message); - } - } - /** - * @param Countable|array|null $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrCount($array, $number, $message = '') - { - null === $array || static::count($array, $number, $message); - } - /** - * @param iterable $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allCount($array, $number, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::count($entry, $number, $message); - } - } - /** - * @param iterable $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrCount($array, $number, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::count($entry, $number, $message); - } - } - /** - * @param Countable|array|null $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMinCount($array, $min, $message = '') - { - null === $array || static::minCount($array, $min, $message); - } - /** - * @param iterable $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMinCount($array, $min, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::minCount($entry, $min, $message); - } - } - /** - * @param iterable $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMinCount($array, $min, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::minCount($entry, $min, $message); - } - } - /** - * @param Countable|array|null $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMaxCount($array, $max, $message = '') - { - null === $array || static::maxCount($array, $max, $message); - } - /** - * @param iterable $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allMaxCount($array, $max, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::maxCount($entry, $max, $message); - } - } - /** - * @param iterable $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrMaxCount($array, $max, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::maxCount($entry, $max, $message); - } - } - /** - * @param Countable|array|null $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrCountBetween($array, $min, $max, $message = '') - { - null === $array || static::countBetween($array, $min, $max, $message); - } - /** - * @param iterable $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allCountBetween($array, $min, $max, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::countBetween($entry, $min, $max, $message); - } - } - /** - * @param iterable $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrCountBetween($array, $min, $max, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::countBetween($entry, $min, $max, $message); - } - } - /** - * @psalm-pure - * @psalm-assert list|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsList($array, $message = '') - { - null === $array || static::isList($array, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsList($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::isList($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsList($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::isList($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert non-empty-list|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNonEmptyList($array, $message = '') - { - null === $array || static::isNonEmptyList($array, $message); - } - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNonEmptyList($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::isNonEmptyList($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsNonEmptyList($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::isNonEmptyList($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array|null $array - * @psalm-assert array|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsMap($array, $message = '') - { - null === $array || static::isMap($array, $message); - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * @psalm-assert iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsMap($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::isMap($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable|null> $array - * @psalm-assert iterable|null> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsMap($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::isMap($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNonEmptyMap($array, $message = '') - { - null === $array || static::isNonEmptyMap($array, $message); - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNonEmptyMap($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - static::isNonEmptyMap($entry, $message); - } - } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable|null> $array - * @psalm-assert iterable|null> $array - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrIsNonEmptyMap($array, $message = '') - { - static::isIterable($array); - foreach ($array as $entry) { - null === $entry || static::isNonEmptyMap($entry, $message); - } - } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUuid($value, $message = '') - { - null === $value || static::uuid($value, $message); - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUuid($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - static::uuid($entry, $message); - } - } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrUuid($value, $message = '') - { - static::isIterable($value); - foreach ($value as $entry) { - null === $entry || static::uuid($entry, $message); - } - } - /** - * @psalm-param class-string $class - * - * @param Closure|null $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrThrows($expression, $class = 'Exception', $message = '') - { - null === $expression || static::throws($expression, $class, $message); - } - /** - * @psalm-param class-string $class - * - * @param iterable $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allThrows($expression, $class = 'Exception', $message = '') - { - static::isIterable($expression); - foreach ($expression as $entry) { - static::throws($entry, $class, $message); - } - } - /** - * @psalm-param class-string $class - * - * @param iterable $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allNullOrThrows($expression, $class = 'Exception', $message = '') - { - static::isIterable($expression); - foreach ($expression as $entry) { - null === $entry || static::throws($entry, $class, $message); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/action-scheduler.php b/dependencies/woocommerce/action-scheduler/action-scheduler.php deleted file mode 100644 index 9aa5934..0000000 --- a/dependencies/woocommerce/action-scheduler/action-scheduler.php +++ /dev/null @@ -1,68 +0,0 @@ -. - * - * @package ActionScheduler - */ - -if ( ! function_exists( 'action_scheduler_register_3_dot_6_dot_4' ) && function_exists( 'add_action' ) ) { // WRCS: DEFINED_VERSION. - - if ( ! class_exists( 'ActionScheduler_Versions', false ) ) { - require_once __DIR__ . '/classes/ActionScheduler_Versions.php'; - add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 ); - } - - add_action( 'plugins_loaded', 'action_scheduler_register_3_dot_6_dot_4', 0, 0 ); // WRCS: DEFINED_VERSION. - - /** - * Registers this version of Action Scheduler. - */ - function action_scheduler_register_3_dot_6_dot_4() { // WRCS: DEFINED_VERSION. - $versions = ActionScheduler_Versions::instance(); - $versions->register( '3.6.4', 'action_scheduler_initialize_3_dot_6_dot_4' ); // WRCS: DEFINED_VERSION. - } - - /** - * Initializes this version of Action Scheduler. - */ - function action_scheduler_initialize_3_dot_6_dot_4() { // WRCS: DEFINED_VERSION. - // A final safety check is required even here, because historic versions of Action Scheduler - // followed a different pattern (in some unusual cases, we could reach this point and the - // ActionScheduler class is already defined—so we need to guard against that). - if ( ! class_exists( 'ActionScheduler', false ) ) { - require_once __DIR__ . '/classes/abstracts/ActionScheduler.php'; - ActionScheduler::init( __FILE__ ); - } - } - - // Support usage in themes - load this version if no plugin has loaded a version yet. - if ( did_action( 'plugins_loaded' ) && ! doing_action( 'plugins_loaded' ) && ! class_exists( 'ActionScheduler', false ) ) { - action_scheduler_initialize_3_dot_6_dot_4(); // WRCS: DEFINED_VERSION. - do_action( 'action_scheduler_pre_theme_init' ); - ActionScheduler_Versions::initialize_latest_version(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionClaim.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionClaim.php deleted file mode 100644 index 8b56816..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionClaim.php +++ /dev/null @@ -1,23 +0,0 @@ -id = $id; - $this->action_ids = $action_ids; - } - - public function get_id() { - return $this->id; - } - - public function get_actions() { - return $this->action_ids; - } -} - \ No newline at end of file diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php deleted file mode 100644 index 2fd46a7..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php +++ /dev/null @@ -1,342 +0,0 @@ -= 6 ? (int) func_get_arg( 5 ) : 10; - - switch ( $status ) { - case ActionScheduler_Store::STATUS_PENDING: - $action_class = 'ActionScheduler_Action'; - break; - case ActionScheduler_Store::STATUS_CANCELED: - $action_class = 'ActionScheduler_CanceledAction'; - if ( ! is_null( $schedule ) && ! is_a( $schedule, 'ActionScheduler_CanceledSchedule' ) && ! is_a( $schedule, 'ActionScheduler_NullSchedule' ) ) { - $schedule = new ActionScheduler_CanceledSchedule( $schedule->get_date() ); - } - break; - default: - $action_class = 'ActionScheduler_FinishedAction'; - break; - } - - $action_class = apply_filters( 'action_scheduler_stored_action_class', $action_class, $status, $hook, $args, $schedule, $group ); - - $action = new $action_class( $hook, $args, $schedule, $group ); - $action->set_priority( $priority ); - - /** - * Allow 3rd party code to change the instantiated action for a given hook, args, schedule and group. - * - * @param ActionScheduler_Action $action The instantiated action. - * @param string $hook The instantiated action's hook. - * @param array $args The instantiated action's args. - * @param ActionScheduler_Schedule $schedule The instantiated action's schedule. - * @param string $group The instantiated action's group. - * @param int $priority The action priority. - */ - return apply_filters( 'action_scheduler_stored_action_instance', $action, $hook, $args, $schedule, $group, $priority ); - } - - /** - * Enqueue an action to run one time, as soon as possible (rather a specific scheduled time). - * - * This method creates a new action using the NullSchedule. In practice, this results in an action scheduled to - * execute "now". Therefore, it will generally run as soon as possible but is not prioritized ahead of other actions - * that are already past-due. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param string $group A group to put the action in. - * - * @return int The ID of the stored action. - */ - public function async( $hook, $args = array(), $group = '' ) { - return $this->async_unique( $hook, $args, $group, false ); - } - - /** - * Same as async, but also supports $unique param. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param string $group A group to put the action in. - * @param bool $unique Whether to ensure the action is unique. - * - * @return int The ID of the stored action. - */ - public function async_unique( $hook, $args = array(), $group = '', $unique = true ) { - $schedule = new ActionScheduler_NullSchedule(); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $unique ? $this->store_unique_action( $action, $unique ) : $this->store( $action ); - } - - /** - * Create single action. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param int $when Unix timestamp when the action will run. - * @param string $group A group to put the action in. - * - * @return int The ID of the stored action. - */ - public function single( $hook, $args = array(), $when = null, $group = '' ) { - return $this->single_unique( $hook, $args, $when, $group, false ); - } - - /** - * Create single action only if there is no pending or running action with same name and params. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param int $when Unix timestamp when the action will run. - * @param string $group A group to put the action in. - * @param bool $unique Whether action scheduled should be unique. - * - * @return int The ID of the stored action. - */ - public function single_unique( $hook, $args = array(), $when = null, $group = '', $unique = true ) { - $date = as_get_datetime_object( $when ); - $schedule = new ActionScheduler_SimpleSchedule( $date ); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $unique ? $this->store_unique_action( $action ) : $this->store( $action ); - } - - /** - * Create the first instance of an action recurring on a given interval. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param int $first Unix timestamp for the first run. - * @param int $interval Seconds between runs. - * @param string $group A group to put the action in. - * - * @return int The ID of the stored action. - */ - public function recurring( $hook, $args = array(), $first = null, $interval = null, $group = '' ) { - return $this->recurring_unique( $hook, $args, $first, $interval, $group, false ); - } - - /** - * Create the first instance of an action recurring on a given interval only if there is no pending or running action with same name and params. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param int $first Unix timestamp for the first run. - * @param int $interval Seconds between runs. - * @param string $group A group to put the action in. - * @param bool $unique Whether action scheduled should be unique. - * - * @return int The ID of the stored action. - */ - public function recurring_unique( $hook, $args = array(), $first = null, $interval = null, $group = '', $unique = true ) { - if ( empty( $interval ) ) { - return $this->single_unique( $hook, $args, $first, $group, $unique ); - } - $date = as_get_datetime_object( $first ); - $schedule = new ActionScheduler_IntervalSchedule( $date, $interval ); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $unique ? $this->store_unique_action( $action ) : $this->store( $action ); - } - - /** - * Create the first instance of an action recurring on a Cron schedule. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param int $base_timestamp The first instance of the action will be scheduled - * to run at a time calculated after this timestamp matching the cron - * expression. This can be used to delay the first instance of the action. - * @param int $schedule A cron definition string. - * @param string $group A group to put the action in. - * - * @return int The ID of the stored action. - */ - public function cron( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '' ) { - return $this->cron_unique( $hook, $args, $base_timestamp, $schedule, $group, false ); - } - - - /** - * Create the first instance of an action recurring on a Cron schedule only if there is no pending or running action with same name and params. - * - * @param string $hook The hook to trigger when this action runs. - * @param array $args Args to pass when the hook is triggered. - * @param int $base_timestamp The first instance of the action will be scheduled - * to run at a time calculated after this timestamp matching the cron - * expression. This can be used to delay the first instance of the action. - * @param int $schedule A cron definition string. - * @param string $group A group to put the action in. - * @param bool $unique Whether action scheduled should be unique. - * - * @return int The ID of the stored action. - **/ - public function cron_unique( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '', $unique = true ) { - if ( empty( $schedule ) ) { - return $this->single_unique( $hook, $args, $base_timestamp, $group, $unique ); - } - $date = as_get_datetime_object( $base_timestamp ); - $cron = CronExpression::factory( $schedule ); - $schedule = new ActionScheduler_CronSchedule( $date, $cron ); - $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); - return $unique ? $this->store_unique_action( $action ) : $this->store( $action ); - } - - /** - * Create a successive instance of a recurring or cron action. - * - * Importantly, the action will be rescheduled to run based on the current date/time. - * That means when the action is scheduled to run in the past, the next scheduled date - * will be pushed forward. For example, if a recurring action set to run every hour - * was scheduled to run 5 seconds ago, it will be next scheduled for 1 hour in the - * future, which is 1 hour and 5 seconds from when it was last scheduled to run. - * - * Alternatively, if the action is scheduled to run in the future, and is run early, - * likely via manual intervention, then its schedule will change based on the time now. - * For example, if a recurring action set to run every day, and is run 12 hours early, - * it will run again in 24 hours, not 36 hours. - * - * This slippage is less of an issue with Cron actions, as the specific run time can - * be set for them to run, e.g. 1am each day. In those cases, and entire period would - * need to be missed before there was any change is scheduled, e.g. in the case of an - * action scheduled for 1am each day, the action would need to run an entire day late. - * - * @param ActionScheduler_Action $action The existing action. - * - * @return string The ID of the stored action - * @throws InvalidArgumentException If $action is not a recurring action. - */ - public function repeat( $action ) { - $schedule = $action->get_schedule(); - $next = $schedule->get_next( as_get_datetime_object() ); - - if ( is_null( $next ) || ! $schedule->is_recurring() ) { - throw new InvalidArgumentException( __( 'Invalid action - must be a recurring action.', 'action-scheduler' ) ); - } - - $schedule_class = get_class( $schedule ); - $new_schedule = new $schedule( $next, $schedule->get_recurrence(), $schedule->get_first_date() ); - $new_action = new ActionScheduler_Action( $action->get_hook(), $action->get_args(), $new_schedule, $action->get_group() ); - $new_action->set_priority( $action->get_priority() ); - return $this->store( $new_action ); - } - - /** - * Creates a scheduled action. - * - * This general purpose method can be used in place of specific methods such as async(), - * async_unique(), single() or single_unique(), etc. - * - * @internal Not intended for public use, should not be overriden by subclasses. - * @throws Exception May be thrown if invalid options are passed. - * - * @param array $options { - * Describes the action we wish to schedule. - * - * @type string $type Must be one of 'async', 'cron', 'recurring', or 'single'. - * @type string $hook The hook to be executed. - * @type array $arguments Arguments to be passed to the callback. - * @type string $group The action group. - * @type bool $unique If the action should be unique. - * @type int $when Timestamp. Indicates when the action, or first instance of the action in the case - * of recurring or cron actions, becomes due. - * @type int|string $pattern Recurrence pattern. This is either an interval in seconds for recurring actions - * or a cron expression for cron actions. - * @type int $priority Lower values means higher priority. Should be in the range 0-255. - * } - * - * @return int - */ - public function create( array $options = array() ) { - $defaults = array( - 'type' => 'single', - 'hook' => '', - 'arguments' => array(), - 'group' => '', - 'unique' => false, - 'when' => time(), - 'pattern' => null, - 'priority' => 10, - ); - - $options = array_merge( $defaults, $options ); - - // Cron/recurring actions without a pattern are treated as single actions (this gives calling code the ability - // to use functions like as_schedule_recurring_action() to schedule recurring as well as single actions). - if ( ( 'cron' === $options['type'] || 'recurring' === $options['type'] ) && empty( $options['pattern'] ) ) { - $options['type'] = 'single'; - } - - switch ( $options['type'] ) { - case 'async': - $schedule = new ActionScheduler_NullSchedule(); - break; - - case 'cron': - $date = as_get_datetime_object( $options['when'] ); - $cron = CronExpression::factory( $options['pattern'] ); - $schedule = new ActionScheduler_CronSchedule( $date, $cron ); - break; - - case 'recurring': - $date = as_get_datetime_object( $options['when'] ); - $schedule = new ActionScheduler_IntervalSchedule( $date, $options['pattern'] ); - break; - - case 'single': - $date = as_get_datetime_object( $options['when'] ); - $schedule = new ActionScheduler_SimpleSchedule( $date ); - break; - - default: - throw new Exception( "Unknown action type '{$options['type']}' specified when trying to create an action for '{$options['hook']}'." ); - } - - $action = new ActionScheduler_Action( $options['hook'], $options['arguments'], $schedule, $options['group'] ); - $action->set_priority( $options['priority'] ); - return $options['unique'] ? $this->store_unique_action( $action ) : $this->store( $action ); - } - - /** - * Save action to database. - * - * @param ActionScheduler_Action $action Action object to save. - * - * @return int The ID of the stored action - */ - protected function store( ActionScheduler_Action $action ) { - $store = ActionScheduler_Store::instance(); - return $store->save_action( $action ); - } - - /** - * Store action if it's unique. - * - * @param ActionScheduler_Action $action Action object to store. - * - * @return int ID of the created action. Will be 0 if action was not created. - */ - protected function store_unique_action( ActionScheduler_Action $action ) { - $store = ActionScheduler_Store::instance(); - return method_exists( $store, 'save_unique_action' ) ? - $store->save_unique_action( $action ) : $store->save_action( $action ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AdminView.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AdminView.php deleted file mode 100644 index b747b0a..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AdminView.php +++ /dev/null @@ -1,252 +0,0 @@ -render(); - } - - /** - * Registers action-scheduler into WooCommerce > System status. - * - * @param array $tabs An associative array of tab key => label. - * @return array $tabs An associative array of tab key => label, including Action Scheduler's tabs - */ - public function register_system_status_tab( array $tabs ) { - $tabs['action-scheduler'] = __( 'Scheduled Actions', 'action-scheduler' ); - - return $tabs; - } - - /** - * Include Action Scheduler's administration under the Tools menu. - * - * A menu under the Tools menu is important for backward compatibility (as that's - * where it started), and also provides more convenient access than the WooCommerce - * System Status page, and for sites where WooCommerce isn't active. - */ - public function register_menu() { - $hook_suffix = add_submenu_page( - 'tools.php', - __( 'Scheduled Actions', 'action-scheduler' ), - __( 'Scheduled Actions', 'action-scheduler' ), - 'manage_options', - 'action-scheduler', - array( $this, 'render_admin_ui' ) - ); - add_action( 'load-' . $hook_suffix , array( $this, 'process_admin_ui' ) ); - } - - /** - * Triggers processing of any pending actions. - */ - public function process_admin_ui() { - $this->get_list_table(); - } - - /** - * Renders the Admin UI - */ - public function render_admin_ui() { - $table = $this->get_list_table(); - $table->display_page(); - } - - /** - * Get the admin UI object and process any requested actions. - * - * @return ActionScheduler_ListTable - */ - protected function get_list_table() { - if ( null === $this->list_table ) { - $this->list_table = new ActionScheduler_ListTable( ActionScheduler::store(), ActionScheduler::logger(), ActionScheduler::runner() ); - $this->list_table->process_actions(); - } - - return $this->list_table; - } - - /** - * Action: admin_notices - * - * Maybe check past-due actions, and print notice. - * - * @uses $this->check_pastdue_actions() - */ - public function maybe_check_pastdue_actions() { - - # Filter to prevent checking actions (ex: inappropriate user). - if ( ! apply_filters( 'action_scheduler_check_pastdue_actions', current_user_can( 'manage_options' ) ) ) { - return; - } - - # Get last check transient. - $last_check = get_transient( 'action_scheduler_last_pastdue_actions_check' ); - - # If transient exists, we're within interval, so bail. - if ( ! empty( $last_check ) ) { - return; - } - - # Perform the check. - $this->check_pastdue_actions(); - } - - /** - * Check past-due actions, and print notice. - * - * @todo update $link_url to "Past-due" filter when released (see issue #510, PR #511) - */ - protected function check_pastdue_actions() { - - # Set thresholds. - $threshold_seconds = ( int ) apply_filters( 'action_scheduler_pastdue_actions_seconds', DAY_IN_SECONDS ); - $threshhold_min = ( int ) apply_filters( 'action_scheduler_pastdue_actions_min', 1 ); - - // Set fallback value for past-due actions count. - $num_pastdue_actions = 0; - - // Allow third-parties to preempt the default check logic. - $check = apply_filters( 'action_scheduler_pastdue_actions_check_pre', null ); - - // If no third-party preempted and there are no past-due actions, return early. - if ( ! is_null( $check ) ) { - return; - } - - # Scheduled actions query arguments. - $query_args = array( - 'date' => as_get_datetime_object( time() - $threshold_seconds ), - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'per_page' => $threshhold_min, - ); - - # If no third-party preempted, run default check. - if ( is_null( $check ) ) { - $store = ActionScheduler_Store::instance(); - $num_pastdue_actions = ( int ) $store->query_actions( $query_args, 'count' ); - - # Check if past-due actions count is greater than or equal to threshold. - $check = ( $num_pastdue_actions >= $threshhold_min ); - $check = ( bool ) apply_filters( 'action_scheduler_pastdue_actions_check', $check, $num_pastdue_actions, $threshold_seconds, $threshhold_min ); - } - - # If check failed, set transient and abort. - if ( ! boolval( $check ) ) { - $interval = apply_filters( 'action_scheduler_pastdue_actions_check_interval', round( $threshold_seconds / 4 ), $threshold_seconds ); - set_transient( 'action_scheduler_last_pastdue_actions_check', time(), $interval ); - - return; - } - - $actions_url = add_query_arg( array( - 'page' => 'action-scheduler', - 'status' => 'past-due', - 'order' => 'asc', - ), admin_url( 'tools.php' ) ); - - # Print notice. - echo '

      '; - printf( - _n( - // translators: 1) is the number of affected actions, 2) is a link to an admin screen. - 'Action Scheduler: %1$d past-due action found; something may be wrong. Read documentation »', - 'Action Scheduler: %1$d past-due actions found; something may be wrong. Read documentation »', - $num_pastdue_actions, - 'action-scheduler' - ), - $num_pastdue_actions, - esc_attr( esc_url( $actions_url ) ) - ); - echo '

      '; - - # Facilitate third-parties to evaluate and print notices. - do_action( 'action_scheduler_pastdue_actions_extra_notices', $query_args ); - } - - /** - * Provide more information about the screen and its data in the help tab. - */ - public function add_help_tabs() { - $screen = get_current_screen(); - - if ( ! $screen || self::$screen_id != $screen->id ) { - return; - } - - $as_version = ActionScheduler_Versions::instance()->latest_version(); - $screen->add_help_tab( - array( - 'id' => 'action_scheduler_about', - 'title' => __( 'About', 'action-scheduler' ), - 'content' => - '

      ' . sprintf( __( 'About Action Scheduler %s', 'action-scheduler' ), $as_version ) . '

      ' . - '

      ' . - __( 'Action Scheduler is a scalable, traceable job queue for background processing large sets of actions. Action Scheduler works by triggering an action hook to run at some time in the future. Scheduled actions can also be scheduled to run on a recurring schedule.', 'action-scheduler' ) . - '

      ', - ) - ); - - $screen->add_help_tab( - array( - 'id' => 'action_scheduler_columns', - 'title' => __( 'Columns', 'action-scheduler' ), - 'content' => - '

      ' . __( 'Scheduled Action Columns', 'action-scheduler' ) . '

      ' . - '
        ' . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Hook', 'action-scheduler' ), __( 'Name of the action hook that will be triggered.', 'action-scheduler' ) ) . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Status', 'action-scheduler' ), __( 'Action statuses are Pending, Complete, Canceled, Failed', 'action-scheduler' ) ) . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Arguments', 'action-scheduler' ), __( 'Optional data array passed to the action hook.', 'action-scheduler' ) ) . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Group', 'action-scheduler' ), __( 'Optional action group.', 'action-scheduler' ) ) . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Recurrence', 'action-scheduler' ), __( 'The action\'s schedule frequency.', 'action-scheduler' ) ) . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Scheduled', 'action-scheduler' ), __( 'The date/time the action is/was scheduled to run.', 'action-scheduler' ) ) . - sprintf( '
      • %1$s: %2$s
      • ', __( 'Log', 'action-scheduler' ), __( 'Activity log for the action.', 'action-scheduler' ) ) . - '
      ', - ) - ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php deleted file mode 100644 index 57706a2..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php +++ /dev/null @@ -1,97 +0,0 @@ -store = $store; - } - - /** - * Handle async requests - * - * Run a queue, and maybe dispatch another async request to run another queue - * if there are still pending actions after completing a queue in this request. - */ - protected function handle() { - do_action( 'action_scheduler_run_queue', 'Async Request' ); // run a queue in the same way as WP Cron, but declare the Async Request context - - $sleep_seconds = $this->get_sleep_seconds(); - - if ( $sleep_seconds ) { - sleep( $sleep_seconds ); - } - - $this->maybe_dispatch(); - } - - /** - * If the async request runner is needed and allowed to run, dispatch a request. - */ - public function maybe_dispatch() { - if ( ! $this->allow() ) { - return; - } - - $this->dispatch(); - ActionScheduler_QueueRunner::instance()->unhook_dispatch_async_request(); - } - - /** - * Only allow async requests when needed. - * - * Also allow 3rd party code to disable running actions via async requests. - */ - protected function allow() { - - if ( ! has_action( 'action_scheduler_run_queue' ) || ActionScheduler::runner()->has_maximum_concurrent_batches() || ! $this->store->has_pending_actions_due() ) { - $allow = false; - } else { - $allow = true; - } - - return apply_filters( 'action_scheduler_allow_async_request_runner', $allow ); - } - - /** - * Chaining async requests can crash MySQL. A brief sleep call in PHP prevents that. - */ - protected function get_sleep_seconds() { - return apply_filters( 'action_scheduler_async_request_sleep_seconds', 5, $this ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Compatibility.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Compatibility.php deleted file mode 100644 index bb28023..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Compatibility.php +++ /dev/null @@ -1,105 +0,0 @@ - $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) { - if ( false !== @ini_set( 'memory_limit', $filtered_limit ) ) { - return $filtered_limit; - } else { - return false; - } - } elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) { - if ( false !== @ini_set( 'memory_limit', $wp_max_limit ) ) { - return $wp_max_limit; - } else { - return false; - } - } - return false; - } - - /** - * Attempts to raise the PHP timeout for time intensive processes. - * - * Only allows raising the existing limit and prevents lowering it. Wrapper for wc_set_time_limit(), when available. - * - * @param int $limit The time limit in seconds. - */ - public static function raise_time_limit( $limit = 0 ) { - $limit = (int) $limit; - $max_execution_time = (int) ini_get( 'max_execution_time' ); - - // If the max execution time is already set to zero (unlimited), there is no reason to make a further change. - if ( 0 === $max_execution_time ) { - return; - } - - // Whichever of $max_execution_time or $limit is higher is the amount by which we raise the time limit. - $raise_by = 0 === $limit || $limit > $max_execution_time ? $limit : $max_execution_time; - - if ( function_exists( 'wc_set_time_limit' ) ) { - wc_set_time_limit( $raise_by ); - } elseif ( function_exists( 'set_time_limit' ) && false === strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) && ! ini_get( 'safe_mode' ) ) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved - @set_time_limit( $raise_by ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DataController.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DataController.php deleted file mode 100644 index eb69847..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DataController.php +++ /dev/null @@ -1,187 +0,0 @@ -=' ); - return $php_support && apply_filters( 'action_scheduler_migration_dependencies_met', true ); - } - - /** - * Get a flag indicating whether the migration is complete. - * - * @return bool Whether the flag has been set marking the migration as complete - */ - public static function is_migration_complete() { - return get_option( self::STATUS_FLAG ) === self::STATUS_COMPLETE; - } - - /** - * Mark the migration as complete. - */ - public static function mark_migration_complete() { - update_option( self::STATUS_FLAG, self::STATUS_COMPLETE ); - } - - /** - * Unmark migration when a plugin is de-activated. Will not work in case of silent activation, for example in an update. - * We do this to mitigate the bug of lost actions which happens if there was an AS 2.x to AS 3.x migration in the past, but that plugin is now - * deactivated and the site was running on AS 2.x again. - */ - public static function mark_migration_incomplete() { - delete_option( self::STATUS_FLAG ); - } - - /** - * Set the action store class name. - * - * @param string $class Classname of the store class. - * - * @return string - */ - public static function set_store_class( $class ) { - return self::DATASTORE_CLASS; - } - - /** - * Set the action logger class name. - * - * @param string $class Classname of the logger class. - * - * @return string - */ - public static function set_logger_class( $class ) { - return self::LOGGER_CLASS; - } - - /** - * Set the sleep time in seconds. - * - * @param integer $sleep_time The number of seconds to pause before resuming operation. - */ - public static function set_sleep_time( $sleep_time ) { - self::$sleep_time = (int) $sleep_time; - } - - /** - * Set the tick count required for freeing memory. - * - * @param integer $free_ticks The number of ticks to free memory on. - */ - public static function set_free_ticks( $free_ticks ) { - self::$free_ticks = (int) $free_ticks; - } - - /** - * Free memory if conditions are met. - * - * @param int $ticks Current tick count. - */ - public static function maybe_free_memory( $ticks ) { - if ( self::$free_ticks && 0 === $ticks % self::$free_ticks ) { - self::free_memory(); - } - } - - /** - * Reduce memory footprint by clearing the database query and object caches. - */ - public static function free_memory() { - if ( 0 < self::$sleep_time ) { - /* translators: %d: amount of time */ - \WP_CLI::warning( sprintf( _n( 'Stopped the insanity for %d second', 'Stopped the insanity for %d seconds', self::$sleep_time, 'action-scheduler' ), self::$sleep_time ) ); - sleep( self::$sleep_time ); - } - - \WP_CLI::warning( __( 'Attempting to reduce used memory...', 'action-scheduler' ) ); - - /** - * @var $wpdb \wpdb - * @var $wp_object_cache \WP_Object_Cache - */ - global $wpdb, $wp_object_cache; - - $wpdb->queries = array(); - - if ( ! is_a( $wp_object_cache, 'WP_Object_Cache' ) ) { - return; - } - - $wp_object_cache->group_ops = array(); - $wp_object_cache->stats = array(); - $wp_object_cache->memcache_debug = array(); - $wp_object_cache->cache = array(); - - if ( is_callable( array( $wp_object_cache, '__remoteset' ) ) ) { - call_user_func( array( $wp_object_cache, '__remoteset' ) ); // important - } - } - - /** - * Connect to table datastores if migration is complete. - * Otherwise, proceed with the migration if the dependencies have been met. - */ - public static function init() { - if ( self::is_migration_complete() ) { - add_filter( 'action_scheduler_store_class', array( 'ActionScheduler_DataController', 'set_store_class' ), 100 ); - add_filter( 'action_scheduler_logger_class', array( 'ActionScheduler_DataController', 'set_logger_class' ), 100 ); - add_action( 'deactivate_plugin', array( 'ActionScheduler_DataController', 'mark_migration_incomplete' ) ); - } elseif ( self::dependencies_met() ) { - Controller::init(); - } - - add_action( 'action_scheduler/progress_tick', array( 'ActionScheduler_DataController', 'maybe_free_memory' ) ); - } - - /** - * Singleton factory. - */ - public static function instance() { - if ( ! isset( self::$instance ) ) { - self::$instance = new static(); - } - - return self::$instance; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php deleted file mode 100644 index b142ca8..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_DateTime.php +++ /dev/null @@ -1,79 +0,0 @@ -format( 'U' ); - } - - /** - * Set the UTC offset. - * - * This represents a fixed offset instead of a timezone setting. - * - * @param $offset - */ - public function setUtcOffset( $offset ) { - $this->utcOffset = intval( $offset ); - } - - /** - * Returns the timezone offset. - * - * @return int - * @link http://php.net/manual/en/datetime.getoffset.php - */ - #[\ReturnTypeWillChange] - public function getOffset() { - return $this->utcOffset ? $this->utcOffset : parent::getOffset(); - } - - /** - * Set the TimeZone associated with the DateTime - * - * @param DateTimeZone $timezone - * - * @return static - * @link http://php.net/manual/en/datetime.settimezone.php - */ - #[\ReturnTypeWillChange] - public function setTimezone( $timezone ) { - $this->utcOffset = 0; - parent::setTimezone( $timezone ); - - return $this; - } - - /** - * Get the timestamp with the WordPress timezone offset added or subtracted. - * - * @since 3.0.0 - * @return int - */ - public function getOffsetTimestamp() { - return $this->getTimestamp() + $this->getOffset(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Exception.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Exception.php deleted file mode 100644 index 08e4fae..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Exception.php +++ /dev/null @@ -1,11 +0,0 @@ -store = $store; - } - - public function attach( ActionScheduler_ActionClaim $claim ) { - $this->claim = $claim; - add_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); - add_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0, 1 ); - add_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0, 0 ); - add_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0, 0 ); - add_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0, 0 ); - } - - public function detach() { - $this->claim = NULL; - $this->untrack_action(); - remove_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); - remove_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0 ); - remove_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0 ); - remove_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0 ); - remove_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0 ); - } - - public function track_current_action( $action_id ) { - $this->action_id = $action_id; - } - - public function untrack_action() { - $this->action_id = 0; - } - - public function handle_unexpected_shutdown() { - if ( $error = error_get_last() ) { - if ( in_array( $error['type'], array( E_ERROR, E_PARSE, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ) ) ) { - if ( !empty($this->action_id) ) { - $this->store->mark_failure( $this->action_id ); - do_action( 'action_scheduler_unexpected_shutdown', $this->action_id, $error ); - } - } - $this->store->release_claim( $this->claim ); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_InvalidActionException.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_InvalidActionException.php deleted file mode 100644 index 40b4559..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_InvalidActionException.php +++ /dev/null @@ -1,47 +0,0 @@ - label). - * - * @var array - */ - protected $columns = array(); - - /** - * Actions (name => label). - * - * @var array - */ - protected $row_actions = array(); - - /** - * The active data stores - * - * @var ActionScheduler_Store - */ - protected $store; - - /** - * A logger to use for getting action logs to display - * - * @var ActionScheduler_Logger - */ - protected $logger; - - /** - * A ActionScheduler_QueueRunner runner instance (or child class) - * - * @var ActionScheduler_QueueRunner - */ - protected $runner; - - /** - * Bulk actions. The key of the array is the method name of the implementation: - * - * bulk_(array $ids, string $sql_in). - * - * See the comments in the parent class for further details - * - * @var array - */ - protected $bulk_actions = array(); - - /** - * Flag variable to render our notifications, if any, once. - * - * @var bool - */ - protected static $did_notification = false; - - /** - * Array of seconds for common time periods, like week or month, alongside an internationalised string representation, i.e. "Day" or "Days" - * - * @var array - */ - private static $time_periods; - - /** - * Sets the current data store object into `store->action` and initialises the object. - * - * @param ActionScheduler_Store $store - * @param ActionScheduler_Logger $logger - * @param ActionScheduler_QueueRunner $runner - */ - public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { - - $this->store = $store; - $this->logger = $logger; - $this->runner = $runner; - - $this->table_header = __( 'Scheduled Actions', 'action-scheduler' ); - - $this->bulk_actions = array( - 'delete' => __( 'Delete', 'action-scheduler' ), - ); - - $this->columns = array( - 'hook' => __( 'Hook', 'action-scheduler' ), - 'status' => __( 'Status', 'action-scheduler' ), - 'args' => __( 'Arguments', 'action-scheduler' ), - 'group' => __( 'Group', 'action-scheduler' ), - 'recurrence' => __( 'Recurrence', 'action-scheduler' ), - 'schedule' => __( 'Scheduled Date', 'action-scheduler' ), - 'log_entries' => __( 'Log', 'action-scheduler' ), - ); - - $this->sort_by = array( - 'schedule', - 'hook', - 'group', - ); - - $this->search_by = array( - 'hook', - 'args', - 'claim_id', - ); - - $request_status = $this->get_request_status(); - - if ( empty( $request_status ) ) { - $this->sort_by[] = 'status'; - } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { - $this->columns += array( 'claim_id' => __( 'Claim ID', 'action-scheduler' ) ); - $this->sort_by[] = 'claim_id'; - } - - $this->row_actions = array( - 'hook' => array( - 'run' => array( - 'name' => __( 'Run', 'action-scheduler' ), - 'desc' => __( 'Process the action now as if it were run as part of a queue', 'action-scheduler' ), - ), - 'cancel' => array( - 'name' => __( 'Cancel', 'action-scheduler' ), - 'desc' => __( 'Cancel the action now to avoid it being run in future', 'action-scheduler' ), - 'class' => 'cancel trash', - ), - ), - ); - - self::$time_periods = array( - array( - 'seconds' => YEAR_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s year', '%s years', 'action-scheduler' ), - ), - array( - 'seconds' => MONTH_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s month', '%s months', 'action-scheduler' ), - ), - array( - 'seconds' => WEEK_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s week', '%s weeks', 'action-scheduler' ), - ), - array( - 'seconds' => DAY_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s day', '%s days', 'action-scheduler' ), - ), - array( - 'seconds' => HOUR_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s hour', '%s hours', 'action-scheduler' ), - ), - array( - 'seconds' => MINUTE_IN_SECONDS, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s minute', '%s minutes', 'action-scheduler' ), - ), - array( - 'seconds' => 1, - /* translators: %s: amount of time */ - 'names' => _n_noop( '%s second', '%s seconds', 'action-scheduler' ), - ), - ); - - parent::__construct( - array( - 'singular' => 'action-scheduler', - 'plural' => 'action-scheduler', - 'ajax' => false, - ) - ); - - add_screen_option( - 'per_page', - array( - 'default' => $this->items_per_page, - ) - ); - - add_filter( 'set_screen_option_' . $this->get_per_page_option_name(), array( $this, 'set_items_per_page_option' ), 10, 3 ); - set_screen_options(); - } - - /** - * Handles setting the items_per_page option for this screen. - * - * @param mixed $status Default false (to skip saving the current option). - * @param string $option Screen option name. - * @param int $value Screen option value. - * @return int - */ - public function set_items_per_page_option( $status, $option, $value ) { - return $value; - } - /** - * Convert an interval of seconds into a two part human friendly string. - * - * The WordPress human_time_diff() function only calculates the time difference to one degree, meaning - * even if an action is 1 day and 11 hours away, it will display "1 day". This function goes one step - * further to display two degrees of accuracy. - * - * Inspired by the Crontrol::interval() function by Edward Dale: https://wordpress.org/plugins/wp-crontrol/ - * - * @param int $interval A interval in seconds. - * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. - * @return string A human friendly string representation of the interval. - */ - private static function human_interval( $interval, $periods_to_include = 2 ) { - - if ( $interval <= 0 ) { - return __( 'Now!', 'action-scheduler' ); - } - - $output = ''; - - for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { - - $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); - - if ( $periods_in_interval > 0 ) { - if ( ! empty( $output ) ) { - $output .= ' '; - } - $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'action-scheduler' ), $periods_in_interval ); - $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; - $periods_included++; - } - } - - return $output; - } - - /** - * Returns the recurrence of an action or 'Non-repeating'. The output is human readable. - * - * @param ActionScheduler_Action $action - * - * @return string - */ - protected function get_recurrence( $action ) { - $schedule = $action->get_schedule(); - if ( $schedule->is_recurring() && method_exists( $schedule, 'get_recurrence' ) ) { - $recurrence = $schedule->get_recurrence(); - - if ( is_numeric( $recurrence ) ) { - /* translators: %s: time interval */ - return sprintf( __( 'Every %s', 'action-scheduler' ), self::human_interval( $recurrence ) ); - } else { - return $recurrence; - } - } - - return __( 'Non-repeating', 'action-scheduler' ); - } - - /** - * Serializes the argument of an action to render it in a human friendly format. - * - * @param array $row The array representation of the current row of the table - * - * @return string - */ - public function column_args( array $row ) { - if ( empty( $row['args'] ) ) { - return apply_filters( 'action_scheduler_list_table_column_args', '', $row ); - } - - $row_html = '
        '; - foreach ( $row['args'] as $key => $value ) { - $row_html .= sprintf( '
      • %s => %s
      • ', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) ); - } - $row_html .= '
      '; - - return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); - } - - /** - * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. - * - * @param array $row Action array. - * @return string - */ - public function column_log_entries( array $row ) { - - $log_entries_html = '
        '; - - $timezone = new DateTimezone( 'UTC' ); - - foreach ( $row['log_entries'] as $log_entry ) { - $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); - } - - $log_entries_html .= '
      '; - - return $log_entries_html; - } - - /** - * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. - * - * @param ActionScheduler_LogEntry $log_entry - * @param DateTimezone $timezone - * @return string - */ - protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { - $date = $log_entry->get_date(); - $date->setTimezone( $timezone ); - return sprintf( '
    2. %s
      %s
    3. ', esc_html( $date->format( 'Y-m-d H:i:s O' ) ), esc_html( $log_entry->get_message() ) ); - } - - /** - * Only display row actions for pending actions. - * - * @param array $row Row to render - * @param string $column_name Current row - * - * @return string - */ - protected function maybe_render_actions( $row, $column_name ) { - if ( 'pending' === strtolower( $row[ 'status_name' ] ) ) { - return parent::maybe_render_actions( $row, $column_name ); - } - - return ''; - } - - /** - * Renders admin notifications - * - * Notifications: - * 1. When the maximum number of tasks are being executed simultaneously. - * 2. Notifications when a task is manually executed. - * 3. Tables are missing. - */ - public function display_admin_notices() { - global $wpdb; - - if ( ( is_a( $this->store, 'ActionScheduler_HybridStore' ) || is_a( $this->store, 'ActionScheduler_DBStore' ) ) && apply_filters( 'action_scheduler_enable_recreate_data_store', true ) ) { - $table_list = array( - 'actionscheduler_actions', - 'actionscheduler_logs', - 'actionscheduler_groups', - 'actionscheduler_claims', - ); - - $found_tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared - foreach ( $table_list as $table_name ) { - if ( ! in_array( $wpdb->prefix . $table_name, $found_tables ) ) { - $this->admin_notices[] = array( - 'class' => 'error', - 'message' => __( 'It appears one or more database tables were missing. Attempting to re-create the missing table(s).' , 'action-scheduler' ), - ); - $this->recreate_tables(); - parent::display_admin_notices(); - - return; - } - } - } - - if ( $this->runner->has_maximum_concurrent_batches() ) { - $claim_count = $this->store->get_claim_count(); - $this->admin_notices[] = array( - 'class' => 'updated', - 'message' => sprintf( - /* translators: %s: amount of claims */ - _n( - 'Maximum simultaneous queues already in progress (%s queue). No additional queues will begin processing until the current queues are complete.', - 'Maximum simultaneous queues already in progress (%s queues). No additional queues will begin processing until the current queues are complete.', - $claim_count, - 'action-scheduler' - ), - $claim_count - ), - ); - } elseif ( $this->store->has_pending_actions_due() ) { - - $async_request_lock_expiration = ActionScheduler::lock()->get_expiration( 'async-request-runner' ); - - // No lock set or lock expired - if ( false === $async_request_lock_expiration || $async_request_lock_expiration < time() ) { - $in_progress_url = add_query_arg( 'status', 'in-progress', remove_query_arg( 'status' ) ); - /* translators: %s: process URL */ - $async_request_message = sprintf( __( 'A new queue has begun processing. View actions in-progress »', 'action-scheduler' ), esc_url( $in_progress_url ) ); - } else { - /* translators: %d: seconds */ - $async_request_message = sprintf( __( 'The next queue will begin processing in approximately %d seconds.', 'action-scheduler' ), $async_request_lock_expiration - time() ); - } - - $this->admin_notices[] = array( - 'class' => 'notice notice-info', - 'message' => $async_request_message, - ); - } - - $notification = get_transient( 'action_scheduler_admin_notice' ); - - if ( is_array( $notification ) ) { - delete_transient( 'action_scheduler_admin_notice' ); - - $action = $this->store->fetch_action( $notification['action_id'] ); - $action_hook_html = '' . $action->get_hook() . ''; - if ( 1 == $notification['success'] ) { - $class = 'updated'; - switch ( $notification['row_action_type'] ) { - case 'run' : - /* translators: %s: action HTML */ - $action_message_html = sprintf( __( 'Successfully executed action: %s', 'action-scheduler' ), $action_hook_html ); - break; - case 'cancel' : - /* translators: %s: action HTML */ - $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'action-scheduler' ), $action_hook_html ); - break; - default : - /* translators: %s: action HTML */ - $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'action-scheduler' ), $action_hook_html ); - break; - } - } else { - $class = 'error'; - /* translators: 1: action HTML 2: action ID 3: error message */ - $action_message_html = sprintf( __( 'Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'action-scheduler' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); - } - - $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); - - $this->admin_notices[] = array( - 'class' => $class, - 'message' => $action_message_html, - ); - } - - parent::display_admin_notices(); - } - - /** - * Prints the scheduled date in a human friendly format. - * - * @param array $row The array representation of the current row of the table - * - * @return string - */ - public function column_schedule( $row ) { - return $this->get_schedule_display_string( $row['schedule'] ); - } - - /** - * Get the scheduled date in a human friendly format. - * - * @param ActionScheduler_Schedule $schedule - * @return string - */ - protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { - - $schedule_display_string = ''; - - if ( is_a( $schedule, 'ActionScheduler_NullSchedule' ) ) { - return __( 'async', 'action-scheduler' ); - } - - if ( ! method_exists( $schedule, 'get_date' ) || ! $schedule->get_date() ) { - return '0000-00-00 00:00:00'; - } - - $next_timestamp = $schedule->get_date()->getTimestamp(); - - $schedule_display_string .= $schedule->get_date()->format( 'Y-m-d H:i:s O' ); - $schedule_display_string .= '
      '; - - if ( gmdate( 'U' ) > $next_timestamp ) { - /* translators: %s: date interval */ - $schedule_display_string .= sprintf( __( ' (%s ago)', 'action-scheduler' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); - } else { - /* translators: %s: date interval */ - $schedule_display_string .= sprintf( __( ' (%s)', 'action-scheduler' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); - } - - return $schedule_display_string; - } - - /** - * Bulk delete - * - * Deletes actions based on their ID. This is the handler for the bulk delete. It assumes the data - * properly validated by the callee and it will delete the actions without any extra validation. - * - * @param array $ids - * @param string $ids_sql Inherited and unused - */ - protected function bulk_delete( array $ids, $ids_sql ) { - foreach ( $ids as $id ) { - try { - $this->store->delete_action( $id ); - } catch ( Exception $e ) { - // A possible reason for an exception would include a scenario where the same action is deleted by a - // concurrent request. - error_log( - sprintf( - /* translators: 1: action ID 2: exception message. */ - __( 'Action Scheduler was unable to delete action %1$d. Reason: %2$s', 'action-scheduler' ), - $id, - $e->getMessage() - ) - ); - } - } - } - - /** - * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their - * parameters are valid. - * - * @param int $action_id - */ - protected function row_action_cancel( $action_id ) { - $this->process_row_action( $action_id, 'cancel' ); - } - - /** - * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their - * parameters are valid. - * - * @param int $action_id - */ - protected function row_action_run( $action_id ) { - $this->process_row_action( $action_id, 'run' ); - } - - /** - * Force the data store schema updates. - */ - protected function recreate_tables() { - if ( is_a( $this->store, 'ActionScheduler_HybridStore' ) ) { - $store = $this->store; - } else { - $store = new ActionScheduler_HybridStore(); - } - add_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10, 2 ); - - $store_schema = new ActionScheduler_StoreSchema(); - $logger_schema = new ActionScheduler_LoggerSchema(); - $store_schema->register_tables( true ); - $logger_schema->register_tables( true ); - - remove_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10 ); - } - /** - * Implements the logic behind processing an action once an action link is clicked on the list table. - * - * @param int $action_id - * @param string $row_action_type The type of action to perform on the action. - */ - protected function process_row_action( $action_id, $row_action_type ) { - try { - switch ( $row_action_type ) { - case 'run' : - $this->runner->process_action( $action_id, 'Admin List Table' ); - break; - case 'cancel' : - $this->store->cancel_action( $action_id ); - break; - } - $success = 1; - $error_message = ''; - } catch ( Exception $e ) { - $success = 0; - $error_message = $e->getMessage(); - } - - set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); - } - - /** - * {@inheritDoc} - */ - public function prepare_items() { - $this->prepare_column_headers(); - - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - - $query = array( - 'per_page' => $per_page, - 'offset' => $this->get_items_offset(), - 'status' => $this->get_request_status(), - 'orderby' => $this->get_request_orderby(), - 'order' => $this->get_request_order(), - 'search' => $this->get_request_search_query(), - ); - - /** - * Change query arguments to query for past-due actions. - * Past-due actions have the 'pending' status and are in the past. - * This is needed because registering 'past-due' as a status is overkill. - */ - if ( 'past-due' === $this->get_request_status() ) { - $query['status'] = ActionScheduler_Store::STATUS_PENDING; - $query['date'] = as_get_datetime_object(); - } - - $this->items = array(); - - $total_items = $this->store->query_actions( $query, 'count' ); - - $status_labels = $this->store->get_status_labels(); - - foreach ( $this->store->query_actions( $query ) as $action_id ) { - try { - $action = $this->store->fetch_action( $action_id ); - } catch ( Exception $e ) { - continue; - } - if ( is_a( $action, 'ActionScheduler_NullAction' ) ) { - continue; - } - $this->items[ $action_id ] = array( - 'ID' => $action_id, - 'hook' => $action->get_hook(), - 'status_name' => $this->store->get_status( $action_id ), - 'status' => $status_labels[ $this->store->get_status( $action_id ) ], - 'args' => $action->get_args(), - 'group' => $action->get_group(), - 'log_entries' => $this->logger->get_logs( $action_id ), - 'claim_id' => $this->store->get_claim_id( $action_id ), - 'recurrence' => $this->get_recurrence( $action ), - 'schedule' => $action->get_schedule(), - ); - } - - $this->set_pagination_args( array( - 'total_items' => $total_items, - 'per_page' => $per_page, - 'total_pages' => ceil( $total_items / $per_page ), - ) ); - } - - /** - * Prints the available statuses so the user can click to filter. - */ - protected function display_filter_by_status() { - $this->status_counts = $this->store->action_counts() + $this->store->extra_action_counts(); - parent::display_filter_by_status(); - } - - /** - * Get the text to display in the search box on the list table. - */ - protected function get_search_box_button_text() { - return __( 'Search hook, args and claim ID', 'action-scheduler' ); - } - - /** - * {@inheritDoc} - */ - protected function get_per_page_option_name() { - return str_replace( '-', '_', $this->screen->id ) . '_per_page'; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_LogEntry.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_LogEntry.php deleted file mode 100644 index 649636d..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_LogEntry.php +++ /dev/null @@ -1,67 +0,0 @@ -comment_type - * to ActionScheduler_LogEntry::__construct(), goodness knows why, and the Follow-up Emails plugin - * hard-codes loading its own version of ActionScheduler_wpCommentLogger with that out-dated method, - * goodness knows why, so we need to guard against that here instead of using a DateTime type declaration - * for the constructor's 3rd param of $date and causing a fatal error with older versions of FUE. - */ - if ( null !== $date && ! is_a( $date, 'DateTime' ) ) { - _doing_it_wrong( __METHOD__, 'The third parameter must be a valid DateTime instance, or null.', '2.0.0' ); - $date = null; - } - - $this->action_id = $action_id; - $this->message = $message; - $this->date = $date ? $date : new Datetime; - } - - /** - * Returns the date when this log entry was created - * - * @return Datetime - */ - public function get_date() { - return $this->date; - } - - public function get_action_id() { - return $this->action_id; - } - - public function get_message() { - return $this->message; - } -} - diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_NullLogEntry.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_NullLogEntry.php deleted file mode 100644 index 6f8f218..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_NullLogEntry.php +++ /dev/null @@ -1,11 +0,0 @@ -maybe_dispatch_async_request() uses a lock to avoid - * calling ActionScheduler_QueueRunner->has_maximum_concurrent_batches() every time the 'shutdown', - * hook is triggered, because that method calls ActionScheduler_QueueRunner->store->get_claim_count() - * to find the current number of claims in the database. - * - * @param string $lock_type A string to identify different lock types. - * @bool True if lock value has changed, false if not or if set failed. - */ - public function set( $lock_type ) { - global $wpdb; - - $lock_key = $this->get_key( $lock_type ); - $existing_lock_value = $this->get_existing_lock( $lock_type ); - $new_lock_value = $this->new_lock_value( $lock_type ); - - // The lock may not exist yet, or may have been deleted. - if ( empty( $existing_lock_value ) ) { - return (bool) $wpdb->insert( - $wpdb->options, - array( - 'option_name' => $lock_key, - 'option_value' => $new_lock_value, - 'autoload' => 'no', - ) - ); - } - - if ( $this->get_expiration_from( $existing_lock_value ) >= time() ) { - return false; - } - - // Otherwise, try to obtain the lock. - return (bool) $wpdb->update( - $wpdb->options, - array( 'option_value' => $new_lock_value ), - array( - 'option_name' => $lock_key, - 'option_value' => $existing_lock_value, - ) - ); - } - - /** - * If a lock is set, return the timestamp it was set to expiry. - * - * @param string $lock_type A string to identify different lock types. - * @return bool|int False if no lock is set, otherwise the timestamp for when the lock is set to expire. - */ - public function get_expiration( $lock_type ) { - return $this->get_expiration_from( $this->get_existing_lock( $lock_type ) ); - } - - /** - * Given the lock string, derives the lock expiration timestamp (or false if it cannot be determined). - * - * @param string $lock_value String containing a timestamp, or pipe-separated combination of unique value and timestamp. - * - * @return false|int - */ - private function get_expiration_from( $lock_value ) { - $lock_string = explode( '|', $lock_value ); - - // Old style lock? - if ( count( $lock_string ) === 1 && is_numeric( $lock_string[0] ) ) { - return (int) $lock_string[0]; - } - - // New style lock? - if ( count( $lock_string ) === 2 && is_numeric( $lock_string[1] ) ) { - return (int) $lock_string[1]; - } - - return false; - } - - /** - * Get the key to use for storing the lock in the transient - * - * @param string $lock_type A string to identify different lock types. - * @return string - */ - protected function get_key( $lock_type ) { - return sprintf( 'action_scheduler_lock_%s', $lock_type ); - } - - /** - * Supplies the existing lock value, or an empty string if not set. - * - * @param string $lock_type A string to identify different lock types. - * - * @return string - */ - private function get_existing_lock( $lock_type ) { - global $wpdb; - - // Now grab the existing lock value, if there is one. - return (string) $wpdb->get_var( - $wpdb->prepare( - "SELECT option_value FROM $wpdb->options WHERE option_name = %s", - $this->get_key( $lock_type ) - ) - ); - } - - /** - * Supplies a lock value consisting of a unique value and the current timestamp, which are separated by a pipe - * character. - * - * Example: (string) "649de012e6b262.09774912|1688068114" - * - * @param string $lock_type A string to identify different lock types. - * - * @return string - */ - private function new_lock_value( $lock_type ) { - return uniqid( '', true ) . '|' . ( time() + $this->get_duration( $lock_type ) ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php deleted file mode 100644 index 6f2a696..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueCleaner.php +++ /dev/null @@ -1,233 +0,0 @@ -store = $store ? $store : ActionScheduler_Store::instance(); - $this->batch_size = $batch_size; - } - - /** - * Default queue cleaner process used by queue runner. - * - * @return array - */ - public function delete_old_actions() { - /** - * Filter the minimum scheduled date age for action deletion. - * - * @param int $retention_period Minimum scheduled age in seconds of the actions to be deleted. - */ - $lifespan = apply_filters( 'action_scheduler_retention_period', $this->month_in_seconds ); - - try { - $cutoff = as_get_datetime_object( $lifespan . ' seconds ago' ); - } catch ( Exception $e ) { - _doing_it_wrong( - __METHOD__, - sprintf( - /* Translators: %s is the exception message. */ - esc_html__( 'It was not possible to determine a valid cut-off time: %s.', 'action-scheduler' ), - esc_html( $e->getMessage() ) - ), - '3.5.5' - ); - - return array(); - } - - - /** - * Filter the statuses when cleaning the queue. - * - * @param string[] $default_statuses_to_purge Action statuses to clean. - */ - $statuses_to_purge = (array) apply_filters( 'action_scheduler_default_cleaner_statuses', $this->default_statuses_to_purge ); - - return $this->clean_actions( $statuses_to_purge, $cutoff, $this->get_batch_size() ); - } - - /** - * Delete selected actions limited by status and date. - * - * @param string[] $statuses_to_purge List of action statuses to purge. Defaults to canceled, complete. - * @param DateTime $cutoff_date Date limit for selecting actions. Defaults to 31 days ago. - * @param int|null $batch_size Maximum number of actions per status to delete. Defaults to 20. - * @param string $context Calling process context. Defaults to `old`. - * @return array Actions deleted. - */ - public function clean_actions( array $statuses_to_purge, DateTime $cutoff_date, $batch_size = null, $context = 'old' ) { - $batch_size = $batch_size !== null ? $batch_size : $this->batch_size; - $cutoff = $cutoff_date !== null ? $cutoff_date : as_get_datetime_object( $this->month_in_seconds . ' seconds ago' ); - $lifespan = time() - $cutoff->getTimestamp(); - if ( empty( $statuses_to_purge ) ) { - $statuses_to_purge = $this->default_statuses_to_purge; - } - - $deleted_actions = []; - foreach ( $statuses_to_purge as $status ) { - $actions_to_delete = $this->store->query_actions( array( - 'status' => $status, - 'modified' => $cutoff, - 'modified_compare' => '<=', - 'per_page' => $batch_size, - 'orderby' => 'none', - ) ); - - $deleted_actions = array_merge( $deleted_actions, $this->delete_actions( $actions_to_delete, $lifespan, $context ) ); - } - - return $deleted_actions; - } - - /** - * @param int[] $actions_to_delete List of action IDs to delete. - * @param int $lifespan Minimum scheduled age in seconds of the actions being deleted. - * @param string $context Context of the delete request. - * @return array Deleted action IDs. - */ - private function delete_actions( array $actions_to_delete, $lifespan = null, $context = 'old' ) { - $deleted_actions = []; - if ( $lifespan === null ) { - $lifespan = $this->month_in_seconds; - } - - foreach ( $actions_to_delete as $action_id ) { - try { - $this->store->delete_action( $action_id ); - $deleted_actions[] = $action_id; - } catch ( Exception $e ) { - /** - * Notify 3rd party code of exceptions when deleting a completed action older than the retention period - * - * This hook provides a way for 3rd party code to log or otherwise handle exceptions relating to their - * actions. - * - * @param int $action_id The scheduled actions ID in the data store - * @param Exception $e The exception thrown when attempting to delete the action from the data store - * @param int $lifespan The retention period, in seconds, for old actions - * @param int $count_of_actions_to_delete The number of old actions being deleted in this batch - * @since 2.0.0 - * - */ - do_action( "action_scheduler_failed_{$context}_action_deletion", $action_id, $e, $lifespan, count( $actions_to_delete ) ); - } - } - return $deleted_actions; - } - - /** - * Unclaim pending actions that have not been run within a given time limit. - * - * When called by ActionScheduler_Abstract_QueueRunner::run_cleanup(), the time limit passed - * as a parameter is 10x the time limit used for queue processing. - * - * @param int $time_limit The number of seconds to allow a queue to run before unclaiming its pending actions. Default 300 (5 minutes). - */ - public function reset_timeouts( $time_limit = 300 ) { - $timeout = apply_filters( 'action_scheduler_timeout_period', $time_limit ); - if ( $timeout < 0 ) { - return; - } - $cutoff = as_get_datetime_object($timeout.' seconds ago'); - $actions_to_reset = $this->store->query_actions( array( - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'modified' => $cutoff, - 'modified_compare' => '<=', - 'claimed' => true, - 'per_page' => $this->get_batch_size(), - 'orderby' => 'none', - ) ); - - foreach ( $actions_to_reset as $action_id ) { - $this->store->unclaim_action( $action_id ); - do_action( 'action_scheduler_reset_action', $action_id ); - } - } - - /** - * Mark actions that have been running for more than a given time limit as failed, based on - * the assumption some uncatachable and unloggable fatal error occurred during processing. - * - * When called by ActionScheduler_Abstract_QueueRunner::run_cleanup(), the time limit passed - * as a parameter is 10x the time limit used for queue processing. - * - * @param int $time_limit The number of seconds to allow an action to run before it is considered to have failed. Default 300 (5 minutes). - */ - public function mark_failures( $time_limit = 300 ) { - $timeout = apply_filters( 'action_scheduler_failure_period', $time_limit ); - if ( $timeout < 0 ) { - return; - } - $cutoff = as_get_datetime_object($timeout.' seconds ago'); - $actions_to_reset = $this->store->query_actions( array( - 'status' => ActionScheduler_Store::STATUS_RUNNING, - 'modified' => $cutoff, - 'modified_compare' => '<=', - 'per_page' => $this->get_batch_size(), - 'orderby' => 'none', - ) ); - - foreach ( $actions_to_reset as $action_id ) { - $this->store->mark_failure( $action_id ); - do_action( 'action_scheduler_failed_action', $action_id, $timeout ); - } - } - - /** - * Do all of the cleaning actions. - * - * @param int $time_limit The number of seconds to use as the timeout and failure period. Default 300 (5 minutes). - * @author Jeremy Pry - */ - public function clean( $time_limit = 300 ) { - $this->delete_old_actions(); - $this->reset_timeouts( $time_limit ); - $this->mark_failures( $time_limit ); - } - - /** - * Get the batch size for cleaning the queue. - * - * @author Jeremy Pry - * @return int - */ - protected function get_batch_size() { - /** - * Filter the batch size when cleaning the queue. - * - * @param int $batch_size The number of actions to clean in one batch. - */ - return absint( apply_filters( 'action_scheduler_cleanup_batch_size', $this->batch_size ) ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php deleted file mode 100644 index 1ec3eab..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_QueueRunner.php +++ /dev/null @@ -1,229 +0,0 @@ -store ); - } - - $this->async_request = $async_request; - } - - /** - * @codeCoverageIgnore - */ - public function init() { - - add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) ); - - // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param - $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK ); - if ( $next_timestamp ) { - wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK ); - } - - $cron_context = array( 'WP Cron' ); - - if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) { - $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE ); - wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context ); - } - - add_action( self::WP_CRON_HOOK, array( self::instance(), 'run' ) ); - $this->hook_dispatch_async_request(); - } - - /** - * Hook check for dispatching an async request. - */ - public function hook_dispatch_async_request() { - add_action( 'shutdown', array( $this, 'maybe_dispatch_async_request' ) ); - } - - /** - * Unhook check for dispatching an async request. - */ - public function unhook_dispatch_async_request() { - remove_action( 'shutdown', array( $this, 'maybe_dispatch_async_request' ) ); - } - - /** - * Check if we should dispatch an async request to process actions. - * - * This method is attached to 'shutdown', so is called frequently. To avoid slowing down - * the site, it mitigates the work performed in each request by: - * 1. checking if it's in the admin context and then - * 2. haven't run on the 'shutdown' hook within the lock time (60 seconds by default) - * 3. haven't exceeded the number of allowed batches. - * - * The order of these checks is important, because they run from a check on a value: - * 1. in memory - is_admin() maps to $GLOBALS or the WP_ADMIN constant - * 2. in memory - transients use autoloaded options by default - * 3. from a database query - has_maximum_concurrent_batches() run the query - * $this->store->get_claim_count() to find the current number of claims in the DB. - * - * If all of these conditions are met, then we request an async runner check whether it - * should dispatch a request to process pending actions. - */ - public function maybe_dispatch_async_request() { - // Only start an async queue at most once every 60 seconds. - if ( - is_admin() - && ! ActionScheduler::lock()->is_locked( 'async-request-runner' ) - && ActionScheduler::lock()->set( 'async-request-runner' ) - ) { - $this->async_request->maybe_dispatch(); - } - } - - /** - * Process actions in the queue. Attached to self::WP_CRON_HOOK i.e. 'action_scheduler_run_queue' - * - * The $context param of this method defaults to 'WP Cron', because prior to Action Scheduler 3.0.0 - * that was the only context in which this method was run, and the self::WP_CRON_HOOK hook had no context - * passed along with it. New code calling this method directly, or by triggering the self::WP_CRON_HOOK, - * should set a context as the first parameter. For an example of this, refer to the code seen in - * @see ActionScheduler_AsyncRequest_QueueRunner::handle() - * - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - * @return int The number of actions processed. - */ - public function run( $context = 'WP Cron' ) { - ActionScheduler_Compatibility::raise_memory_limit(); - ActionScheduler_Compatibility::raise_time_limit( $this->get_time_limit() ); - do_action( 'action_scheduler_before_process_queue' ); - $this->run_cleanup(); - - $this->processed_actions_count = 0; - if ( false === $this->has_maximum_concurrent_batches() ) { - $batch_size = apply_filters( 'action_scheduler_queue_runner_batch_size', 25 ); - do { - $processed_actions_in_batch = $this->do_batch( $batch_size, $context ); - $this->processed_actions_count += $processed_actions_in_batch; - } while ( $processed_actions_in_batch > 0 && ! $this->batch_limits_exceeded( $this->processed_actions_count ) ); // keep going until we run out of actions, time, or memory - } - - do_action( 'action_scheduler_after_process_queue' ); - return $this->processed_actions_count; - } - - /** - * Process a batch of actions pending in the queue. - * - * Actions are processed by claiming a set of pending actions then processing each one until either the batch - * size is completed, or memory or time limits are reached, defined by @see $this->batch_limits_exceeded(). - * - * @param int $size The maximum number of actions to process in the batch. - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - * @return int The number of actions processed. - */ - protected function do_batch( $size = 100, $context = '' ) { - $claim = $this->store->stake_claim($size); - $this->monitor->attach($claim); - $processed_actions = 0; - - foreach ( $claim->get_actions() as $action_id ) { - // bail if we lost the claim - if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $claim->get_id() ) ) ) { - break; - } - $this->process_action( $action_id, $context ); - $processed_actions++; - - if ( $this->batch_limits_exceeded( $processed_actions + $this->processed_actions_count ) ) { - break; - } - } - $this->store->release_claim($claim); - $this->monitor->detach(); - $this->clear_caches(); - return $processed_actions; - } - - /** - * Flush the cache if possible (intended for use after a batch of actions has been processed). - * - * This is useful because running large batches can eat up memory and because invalid data can accrue in the - * runtime cache, which may lead to unexpected results. - */ - protected function clear_caches() { - /* - * Calling wp_cache_flush_runtime() lets us clear the runtime cache without invalidating the external object - * cache, so we will always prefer this method (as compared to calling wp_cache_flush()) when it is available. - * - * However, this function was only introduced in WordPress 6.0. Additionally, the preferred way of detecting if - * it is supported changed in WordPress 6.1 so we use two different methods to decide if we should utilize it. - */ - $flushing_runtime_cache_explicitly_supported = function_exists( 'wp_cache_supports' ) && wp_cache_supports( 'flush_runtime' ); - $flushing_runtime_cache_implicitly_supported = ! function_exists( 'wp_cache_supports' ) && function_exists( 'wp_cache_flush_runtime' ); - - if ( $flushing_runtime_cache_explicitly_supported || $flushing_runtime_cache_implicitly_supported ) { - wp_cache_flush_runtime(); - } elseif ( - ! wp_using_ext_object_cache() - /** - * When an external object cache is in use, and when wp_cache_flush_runtime() is not available, then - * normally the cache will not be flushed after processing a batch of actions (to avoid a performance - * penalty for other processes). - * - * This filter makes it possible to override this behavior and always flush the cache, even if an external - * object cache is in use. - * - * @since 1.0 - * - * @param bool $flush_cache If the cache should be flushed. - */ - || apply_filters( 'action_scheduler_queue_runner_flush_cache', false ) - ) { - wp_cache_flush(); - } - } - - public function add_wp_cron_schedule( $schedules ) { - $schedules['every_minute'] = array( - 'interval' => 60, // in seconds - 'display' => __( 'Every minute', 'action-scheduler' ), - ); - - return $schedules; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Versions.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Versions.php deleted file mode 100644 index 915c2e6..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_Versions.php +++ /dev/null @@ -1,62 +0,0 @@ -versions[$version_string]) ) { - return FALSE; - } - $this->versions[$version_string] = $initialization_callback; - return TRUE; - } - - public function get_versions() { - return $this->versions; - } - - public function latest_version() { - $keys = array_keys($this->versions); - if ( empty($keys) ) { - return false; - } - uasort( $keys, 'version_compare' ); - return end($keys); - } - - public function latest_version_callback() { - $latest = $this->latest_version(); - if ( empty($latest) || !isset($this->versions[$latest]) ) { - return '__return_null'; - } - return $this->versions[$latest]; - } - - /** - * @return ActionScheduler_Versions - * @codeCoverageIgnore - */ - public static function instance() { - if ( empty(self::$instance) ) { - self::$instance = new self(); - } - return self::$instance; - } - - /** - * @codeCoverageIgnore - */ - public static function initialize_latest_version() { - $self = self::instance(); - call_user_func($self->latest_version_callback()); - } -} - \ No newline at end of file diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php deleted file mode 100644 index 1ba552c..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php +++ /dev/null @@ -1,115 +0,0 @@ - Status administration screen - add_action( 'load-tools_page_action-scheduler', array( __CLASS__, 'register_admin_notice' ) ); - add_action( 'load-woocommerce_page_wc-status', array( __CLASS__, 'register_admin_notice' ) ); - } - - /** - * Determines if there are log entries in the wp comments table. - * - * Uses the flag set on migration completion set by @see self::maybe_schedule_cleanup(). - * - * @return boolean Whether there are scheduled action comments in the comments table. - */ - public static function has_logs() { - return 'yes' === get_option( self::$has_logs_option_key ); - } - - /** - * Schedules the WP Post comment table cleanup to run in 6 months if it's not already scheduled. - * Attached to the migration complete hook 'action_scheduler/migration_complete'. - */ - public static function maybe_schedule_cleanup() { - if ( (bool) get_comments( array( 'type' => ActionScheduler_wpCommentLogger::TYPE, 'number' => 1, 'fields' => 'ids' ) ) ) { - update_option( self::$has_logs_option_key, 'yes' ); - - if ( ! as_next_scheduled_action( self::$cleanup_hook ) ) { - as_schedule_single_action( gmdate( 'U' ) + ( 6 * MONTH_IN_SECONDS ), self::$cleanup_hook ); - } - } - } - - /** - * Delete all action comments from the WP Comments table. - */ - public static function delete_all_action_comments() { - global $wpdb; - $wpdb->delete( $wpdb->comments, array( 'comment_type' => ActionScheduler_wpCommentLogger::TYPE, 'comment_agent' => ActionScheduler_wpCommentLogger::AGENT ) ); - delete_option( self::$has_logs_option_key ); - } - - /** - * Registers admin notices about the orphaned action logs. - */ - public static function register_admin_notice() { - add_action( 'admin_notices', array( __CLASS__, 'print_admin_notice' ) ); - } - - /** - * Prints details about the orphaned action logs and includes information on where to learn more. - */ - public static function print_admin_notice() { - $next_cleanup_message = ''; - $next_scheduled_cleanup_hook = as_next_scheduled_action( self::$cleanup_hook ); - - if ( $next_scheduled_cleanup_hook ) { - /* translators: %s: date interval */ - $next_cleanup_message = sprintf( __( 'This data will be deleted in %s.', 'action-scheduler' ), human_time_diff( gmdate( 'U' ), $next_scheduled_cleanup_hook ) ); - } - - $notice = sprintf( - /* translators: 1: next cleanup message 2: github issue URL */ - __( 'Action Scheduler has migrated data to custom tables; however, orphaned log entries exist in the WordPress Comments table. %1$s Learn more »', 'action-scheduler' ), - $next_cleanup_message, - 'https://github.com/woocommerce/action-scheduler/issues/368' - ); - - echo '

      ' . wp_kses_post( $notice ) . '

      '; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_wcSystemStatus.php b/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_wcSystemStatus.php deleted file mode 100644 index bca63e7..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/ActionScheduler_wcSystemStatus.php +++ /dev/null @@ -1,166 +0,0 @@ -store = $store; - } - - /** - * Display action data, including number of actions grouped by status and the oldest & newest action in each status. - * - * Helpful to identify issues, like a clogged queue. - */ - public function render() { - $action_counts = $this->store->action_counts(); - $status_labels = $this->store->get_status_labels(); - $oldest_and_newest = $this->get_oldest_and_newest( array_keys( $status_labels ) ); - - $this->get_template( $status_labels, $action_counts, $oldest_and_newest ); - } - - /** - * Get oldest and newest scheduled dates for a given set of statuses. - * - * @param array $status_keys Set of statuses to find oldest & newest action for. - * @return array - */ - protected function get_oldest_and_newest( $status_keys ) { - - $oldest_and_newest = array(); - - foreach ( $status_keys as $status ) { - $oldest_and_newest[ $status ] = array( - 'oldest' => '–', - 'newest' => '–', - ); - - if ( 'in-progress' === $status ) { - continue; - } - - $oldest_and_newest[ $status ]['oldest'] = $this->get_action_status_date( $status, 'oldest' ); - $oldest_and_newest[ $status ]['newest'] = $this->get_action_status_date( $status, 'newest' ); - } - - return $oldest_and_newest; - } - - /** - * Get oldest or newest scheduled date for a given status. - * - * @param string $status Action status label/name string. - * @param string $date_type Oldest or Newest. - * @return DateTime - */ - protected function get_action_status_date( $status, $date_type = 'oldest' ) { - - $order = 'oldest' === $date_type ? 'ASC' : 'DESC'; - - $action = $this->store->query_actions( - array( - 'claimed' => false, - 'status' => $status, - 'per_page' => 1, - 'order' => $order, - ) - ); - - if ( ! empty( $action ) ) { - $date_object = $this->store->get_date( $action[0] ); - $action_date = $date_object->format( 'Y-m-d H:i:s O' ); - } else { - $action_date = '–'; - } - - return $action_date; - } - - /** - * Get oldest or newest scheduled date for a given status. - * - * @param array $status_labels Set of statuses to find oldest & newest action for. - * @param array $action_counts Number of actions grouped by status. - * @param array $oldest_and_newest Date of the oldest and newest action with each status. - */ - protected function get_template( $status_labels, $action_counts, $oldest_and_newest ) { - $as_version = ActionScheduler_Versions::instance()->latest_version(); - $as_datastore = get_class( ActionScheduler_Store::instance() ); - ?> - - - - - - - - - - - - - - - - - - - - - - - - $count ) { - // WC uses the 3rd column for export, so we need to display more data in that (hidden when viewed as part of the table) and add an empty 2nd column. - printf( - '', - esc_html( $status_labels[ $status ] ), - esc_html( number_format_i18n( $count ) ), - esc_html( $oldest_and_newest[ $status ]['oldest'] ), - esc_html( $oldest_and_newest[ $status ]['newest'] ) - ); - } - ?> - -

       
      %1$s %2$s, Oldest: %3$s, Newest: %4$s%3$s%4$s
      - - ] - * : The maximum number of actions to delete per batch. Defaults to 20. - * - * [--batches=] - * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue all eligible actions are deleted. - * - * [--status=] - * : Only clean actions with the specified status. Defaults to Canceled, Completed. Define multiple statuses as a comma separated string (without spaces), e.g. `--status=complete,failed,canceled` - * - * [--before=] - * : Only delete actions with scheduled date older than this. Defaults to 31 days. e.g `--before='7 days ago'`, `--before='02-Feb-2020 20:20:20'` - * - * [--pause=] - * : The number of seconds to pause between batches. Default no pause. - * - * @param array $args Positional arguments. - * @param array $assoc_args Keyed arguments. - * @throws \WP_CLI\ExitException When an error occurs. - * - * @subcommand clean - */ - public function clean( $args, $assoc_args ) { - // Handle passed arguments. - $batch = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 20 ) ); - $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) ); - $status = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'status', '' ) ); - $status = array_filter( array_map( 'trim', $status ) ); - $before = \WP_CLI\Utils\get_flag_value( $assoc_args, 'before', '' ); - $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', 0 ); - - $batches_completed = 0; - $actions_deleted = 0; - $unlimited = $batches === 0; - try { - $lifespan = as_get_datetime_object( $before ); - } catch ( Exception $e ) { - $lifespan = null; - } - - try { - // Custom queue cleaner instance. - $cleaner = new ActionScheduler_QueueCleaner( null, $batch ); - - // Clean actions for as long as possible. - while ( $unlimited || $batches_completed < $batches ) { - if ( $sleep && $batches_completed > 0 ) { - sleep( $sleep ); - } - - $deleted = count( $cleaner->clean_actions( $status, $lifespan, null,'CLI' ) ); - if ( $deleted <= 0 ) { - break; - } - $actions_deleted += $deleted; - $batches_completed++; - $this->print_success( $deleted ); - } - } catch ( Exception $e ) { - $this->print_error( $e ); - } - - $this->print_total_batches( $batches_completed ); - if ( $batches_completed > 1 ) { - $this->print_success( $actions_deleted ); - } - } - - /** - * Print WP CLI message about how many batches of actions were processed. - * - * @param int $batches_processed - */ - protected function print_total_batches( int $batches_processed ) { - WP_CLI::log( - sprintf( - /* translators: %d refers to the total number of batches processed */ - _n( '%d batch processed.', '%d batches processed.', $batches_processed, 'action-scheduler' ), - $batches_processed - ) - ); - } - - /** - * Convert an exception into a WP CLI error. - * - * @param Exception $e The error object. - * - * @throws \WP_CLI\ExitException - */ - protected function print_error( Exception $e ) { - WP_CLI::error( - sprintf( - /* translators: %s refers to the exception error message */ - __( 'There was an error deleting an action: %s', 'action-scheduler' ), - $e->getMessage() - ) - ); - } - - /** - * Print a success message with the number of completed actions. - * - * @param int $actions_deleted - */ - protected function print_success( int $actions_deleted ) { - WP_CLI::success( - sprintf( - /* translators: %d refers to the total number of actions deleted */ - _n( '%d action deleted.', '%d actions deleted.', $actions_deleted, 'action-scheduler' ), - $actions_deleted - ) - ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php b/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php deleted file mode 100644 index 4681daa..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php +++ /dev/null @@ -1,197 +0,0 @@ -run_cleanup(); - $this->add_hooks(); - - // Check to make sure there aren't too many concurrent processes running. - if ( $this->has_maximum_concurrent_batches() ) { - if ( $force ) { - WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) ); - } else { - WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) ); - } - } - - // Stake a claim and store it. - $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); - $this->monitor->attach( $this->claim ); - $this->actions = $this->claim->get_actions(); - - return count( $this->actions ); - } - - /** - * Add our hooks to the appropriate actions. - * - * @author Jeremy Pry - */ - protected function add_hooks() { - add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); - add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 ); - add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); - } - - /** - * Set up the WP CLI progress bar. - * - * @author Jeremy Pry - */ - protected function setup_progress_bar() { - $count = count( $this->actions ); - $this->progress_bar = new ProgressBar( - /* translators: %d: amount of actions */ - sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), $count ), - $count - ); - } - - /** - * Process actions in the queue. - * - * @author Jeremy Pry - * - * @param string $context Optional runner context. Default 'WP CLI'. - * - * @return int The number of actions processed. - */ - public function run( $context = 'WP CLI' ) { - do_action( 'action_scheduler_before_process_queue' ); - $this->setup_progress_bar(); - foreach ( $this->actions as $action_id ) { - // Error if we lost the claim. - if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { - WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) ); - break; - } - - $this->process_action( $action_id, $context ); - $this->progress_bar->tick(); - } - - $completed = $this->progress_bar->current(); - $this->progress_bar->finish(); - $this->store->release_claim( $this->claim ); - do_action( 'action_scheduler_after_process_queue' ); - - return $completed; - } - - /** - * Handle WP CLI message when the action is starting. - * - * @author Jeremy Pry - * - * @param $action_id - */ - public function before_execute( $action_id ) { - /* translators: %s refers to the action ID */ - WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) ); - } - - /** - * Handle WP CLI message when the action has completed. - * - * @author Jeremy Pry - * - * @param int $action_id - * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility. - */ - public function after_execute( $action_id, $action = null ) { - // backward compatibility - if ( null === $action ) { - $action = $this->store->fetch_action( $action_id ); - } - /* translators: 1: action ID 2: hook name */ - WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'action-scheduler' ), $action_id, $action->get_hook() ) ); - } - - /** - * Handle WP CLI message when the action has failed. - * - * @author Jeremy Pry - * - * @param int $action_id - * @param Exception $exception - * @throws \WP_CLI\ExitException With failure message. - */ - public function action_failed( $action_id, $exception ) { - WP_CLI::error( - /* translators: 1: action ID 2: exception message */ - sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ), - false - ); - } - - /** - * Sleep and help avoid hitting memory limit - * - * @param int $sleep_time Amount of seconds to sleep - * @deprecated 3.0.0 - */ - protected function stop_the_insanity( $sleep_time = 0 ) { - _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' ); - - ActionScheduler_DataController::free_memory(); - } - - /** - * Maybe trigger the stop_the_insanity() method to free up memory. - */ - protected function maybe_stop_the_insanity() { - // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int. - $current_iteration = intval( trim( $this->progress_bar->current() ) ); - if ( 0 === $current_iteration % 50 ) { - $this->stop_the_insanity(); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php b/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php deleted file mode 100644 index 2c68a38..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php +++ /dev/null @@ -1,210 +0,0 @@ -init(); - $obj->register_tables( true ); - - WP_CLI::success( - sprintf( - /* translators: %s refers to the schema name*/ - __( 'Registered schema for %s', 'action-scheduler' ), - $classname - ) - ); - } - } - } - - /** - * Run the Action Scheduler - * - * ## OPTIONS - * - * [--batch-size=] - * : The maximum number of actions to run. Defaults to 100. - * - * [--batches=] - * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue being executed until all actions are complete. - * - * [--cleanup-batch-size=] - * : The maximum number of actions to clean up. Defaults to the value of --batch-size. - * - * [--hooks=] - * : Only run actions with the specified hook. Omitting this option runs actions with any hook. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=hook_one,hook_two,hook_three` - * - * [--group=] - * : Only run actions from the specified group. Omitting this option runs actions from all groups. - * - * [--exclude-groups=] - * : Run actions from all groups except the specified group(s). Define multiple groups as a comma separated string (without spaces), e.g. '--group_a,group_b'. This option is ignored when `--group` is used. - * - * [--free-memory-on=] - * : The number of actions to process between freeing memory. 0 disables freeing memory. Default 50. - * - * [--pause=] - * : The number of seconds to pause when freeing memory. Default no pause. - * - * [--force] - * : Whether to force execution despite the maximum number of concurrent processes being exceeded. - * - * @param array $args Positional arguments. - * @param array $assoc_args Keyed arguments. - * @throws \WP_CLI\ExitException When an error occurs. - * - * @subcommand run - */ - public function run( $args, $assoc_args ) { - // Handle passed arguments. - $batch = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 100 ) ); - $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) ); - $clean = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'cleanup-batch-size', $batch ) ); - $hooks = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) ); - $hooks = array_filter( array_map( 'trim', $hooks ) ); - $group = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' ); - $exclude_groups = \WP_CLI\Utils\get_flag_value( $assoc_args, 'exclude-groups', '' ); - $free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', 50 ); - $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', 0 ); - $force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false ); - - ActionScheduler_DataController::set_free_ticks( $free_on ); - ActionScheduler_DataController::set_sleep_time( $sleep ); - - $batches_completed = 0; - $actions_completed = 0; - $unlimited = $batches === 0; - if ( is_callable( [ ActionScheduler::store(), 'set_claim_filter' ] ) ) { - $exclude_groups = $this->parse_comma_separated_string( $exclude_groups ); - - if ( ! empty( $exclude_groups ) ) { - ActionScheduler::store()->set_claim_filter('exclude-groups', $exclude_groups ); - } - } - - try { - // Custom queue cleaner instance. - $cleaner = new ActionScheduler_QueueCleaner( null, $clean ); - - // Get the queue runner instance - $runner = new ActionScheduler_WPCLI_QueueRunner( null, null, $cleaner ); - - // Determine how many tasks will be run in the first batch. - $total = $runner->setup( $batch, $hooks, $group, $force ); - - // Run actions for as long as possible. - while ( $total > 0 ) { - $this->print_total_actions( $total ); - $actions_completed += $runner->run(); - $batches_completed++; - - // Maybe set up tasks for the next batch. - $total = ( $unlimited || $batches_completed < $batches ) ? $runner->setup( $batch, $hooks, $group, $force ) : 0; - } - } catch ( Exception $e ) { - $this->print_error( $e ); - } - - $this->print_total_batches( $batches_completed ); - $this->print_success( $actions_completed ); - } - - /** - * Converts a string of comma-separated values into an array of those same values. - * - * @param string $string The string of one or more comma separated values. - * - * @return array - */ - private function parse_comma_separated_string( $string ): array { - return array_filter( str_getcsv( $string ) ); - } - - /** - * Print WP CLI message about how many actions are about to be processed. - * - * @author Jeremy Pry - * - * @param int $total - */ - protected function print_total_actions( $total ) { - WP_CLI::log( - sprintf( - /* translators: %d refers to how many scheduled tasks were found to run */ - _n( 'Found %d scheduled task', 'Found %d scheduled tasks', $total, 'action-scheduler' ), - $total - ) - ); - } - - /** - * Print WP CLI message about how many batches of actions were processed. - * - * @author Jeremy Pry - * - * @param int $batches_completed - */ - protected function print_total_batches( $batches_completed ) { - WP_CLI::log( - sprintf( - /* translators: %d refers to the total number of batches executed */ - _n( '%d batch executed.', '%d batches executed.', $batches_completed, 'action-scheduler' ), - $batches_completed - ) - ); - } - - /** - * Convert an exception into a WP CLI error. - * - * @author Jeremy Pry - * - * @param Exception $e The error object. - * - * @throws \WP_CLI\ExitException - */ - protected function print_error( Exception $e ) { - WP_CLI::error( - sprintf( - /* translators: %s refers to the exception error message */ - __( 'There was an error running the action scheduler: %s', 'action-scheduler' ), - $e->getMessage() - ) - ); - } - - /** - * Print a success message with the number of completed actions. - * - * @author Jeremy Pry - * - * @param int $actions_completed - */ - protected function print_success( $actions_completed ) { - WP_CLI::success( - sprintf( - /* translators: %d refers to the total number of tasks completed */ - _n( '%d scheduled task completed.', '%d scheduled tasks completed.', $actions_completed, 'action-scheduler' ), - $actions_completed - ) - ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/Migration_Command.php b/dependencies/woocommerce/action-scheduler/classes/WP_CLI/Migration_Command.php deleted file mode 100644 index 066697e..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/Migration_Command.php +++ /dev/null @@ -1,148 +0,0 @@ - 'Migrates actions to the DB tables store', - 'synopsis' => [ - [ - 'type' => 'assoc', - 'name' => 'batch-size', - 'optional' => true, - 'default' => 100, - 'description' => 'The number of actions to process in each batch', - ], - [ - 'type' => 'assoc', - 'name' => 'free-memory-on', - 'optional' => true, - 'default' => 50, - 'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory', - ], - [ - 'type' => 'assoc', - 'name' => 'pause', - 'optional' => true, - 'default' => 0, - 'description' => 'The number of seconds to pause when freeing memory', - ], - [ - 'type' => 'flag', - 'name' => 'dry-run', - 'optional' => true, - 'description' => 'Reports on the actions that would have been migrated, but does not change any data', - ], - ], - ] ); - } - - /** - * Process the data migration. - * - * @param array $positional_args Required for WP CLI. Not used in migration. - * @param array $assoc_args Optional arguments. - * - * @return void - */ - public function migrate( $positional_args, $assoc_args ) { - $this->init_logging(); - - $config = $this->get_migration_config( $assoc_args ); - $runner = new Runner( $config ); - $runner->init_destination(); - - $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100; - $free_on = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50; - $sleep = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0; - \ActionScheduler_DataController::set_free_ticks( $free_on ); - \ActionScheduler_DataController::set_sleep_time( $sleep ); - - do { - $actions_processed = $runner->run( $batch_size ); - $this->total_processed += $actions_processed; - } while ( $actions_processed > 0 ); - - if ( ! $config->get_dry_run() ) { - // let the scheduler know that there's nothing left to do - $scheduler = new Scheduler(); - $scheduler->mark_complete(); - } - - WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) ); - } - - /** - * Build the config object used to create the Runner - * - * @param array $args Optional arguments. - * - * @return ActionScheduler\Migration\Config - */ - private function get_migration_config( $args ) { - $args = wp_parse_args( $args, [ - 'dry-run' => false, - ] ); - - $config = Controller::instance()->get_migration_config_object(); - $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) ); - - return $config; - } - - /** - * Hook command line logging into migration actions. - */ - private function init_logging() { - add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) { - WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) ); - }, 10, 1 ); - add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) { - WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) ); - }, 10, 1 ); - add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) { - WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) ); - }, 10, 1 ); - add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) { - WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) ); - }, 10, 2 ); - add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) { - WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) ); - }, 10, 2 ); - add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) { - WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) ); - }, 10, 1 ); - add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) { - WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) ); - }, 10, 1 ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ProgressBar.php b/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ProgressBar.php deleted file mode 100644 index c86c74e..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/WP_CLI/ProgressBar.php +++ /dev/null @@ -1,119 +0,0 @@ -total_ticks = 0; - $this->message = $message; - $this->count = $count; - $this->interval = $interval; - } - - /** - * Increment the progress bar ticks. - */ - public function tick() { - if ( null === $this->progress_bar ) { - $this->setup_progress_bar(); - } - - $this->progress_bar->tick(); - $this->total_ticks++; - - do_action( 'action_scheduler/progress_tick', $this->total_ticks ); - } - - /** - * Get the progress bar tick count. - * - * @return int - */ - public function current() { - return $this->progress_bar ? $this->progress_bar->current() : 0; - } - - /** - * Finish the current progress bar. - */ - public function finish() { - if ( null !== $this->progress_bar ) { - $this->progress_bar->finish(); - } - - $this->progress_bar = null; - } - - /** - * Set the message used when creating the progress bar. - * - * @param string $message The message to be used when the next progress bar is created. - */ - public function set_message( $message ) { - $this->message = $message; - } - - /** - * Set the count for a new progress bar. - * - * @param integer $count The total number of ticks expected to complete. - */ - public function set_count( $count ) { - $this->count = $count; - $this->finish(); - } - - /** - * Set up the progress bar. - */ - protected function setup_progress_bar() { - $this->progress_bar = \WP_CLI\Utils\make_progress_bar( - $this->message, - $this->count, - $this->interval - ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler.php deleted file mode 100644 index 0163f70..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler.php +++ /dev/null @@ -1,337 +0,0 @@ -init() (or it's parent method) set this itself, - * once it has initialized, however that would cause problems in cases where a custom data store is in - * use and it has not yet been updated to follow that same logic. - */ - function () { - self::$data_store_initialized = true; - - /** - * Fires when Action Scheduler is ready: it is safe to use the procedural API after this point. - * - * @since 3.5.5 - */ - do_action( 'action_scheduler_init' ); - }, - 1 - ); - } else { - $admin_view->init(); - $store->init(); - $logger->init(); - $runner->init(); - self::$data_store_initialized = true; - - /** - * Fires when Action Scheduler is ready: it is safe to use the procedural API after this point. - * - * @since 3.5.5 - */ - do_action( 'action_scheduler_init' ); - } - - if ( apply_filters( 'action_scheduler_load_deprecated_functions', true ) ) { - require_once( self::plugin_path( 'deprecated/functions.php' ) ); - } - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - WP_CLI::add_command( 'action-scheduler', 'ActionScheduler_WPCLI_Scheduler_command' ); - WP_CLI::add_command( 'action-scheduler', 'ActionScheduler_WPCLI_Clean_Command' ); - if ( ! ActionScheduler_DataController::is_migration_complete() && Controller::instance()->allow_migration() ) { - $command = new Migration_Command(); - $command->register(); - } - } - - /** - * Handle WP comment cleanup after migration. - */ - if ( is_a( $logger, 'ActionScheduler_DBLogger' ) && ActionScheduler_DataController::is_migration_complete() && ActionScheduler_WPCommentCleaner::has_logs() ) { - ActionScheduler_WPCommentCleaner::init(); - } - - add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' ); - } - - /** - * Check whether the AS data store has been initialized. - * - * @param string $function_name The name of the function being called. Optional. Default `null`. - * @return bool - */ - public static function is_initialized( $function_name = null ) { - if ( ! self::$data_store_initialized && ! empty( $function_name ) ) { - $message = sprintf( - /* translators: %s function name. */ - __( '%s() was called before the Action Scheduler data store was initialized', 'action-scheduler' ), - esc_attr( $function_name ) - ); - _doing_it_wrong( $function_name, $message, '3.1.6' ); - } - - return self::$data_store_initialized; - } - - /** - * Determine if the class is one of our abstract classes. - * - * @since 3.0.0 - * - * @param string $class The class name. - * - * @return bool - */ - protected static function is_class_abstract( $class ) { - static $abstracts = array( - 'ActionScheduler' => true, - 'ActionScheduler_Abstract_ListTable' => true, - 'ActionScheduler_Abstract_QueueRunner' => true, - 'ActionScheduler_Abstract_Schedule' => true, - 'ActionScheduler_Abstract_RecurringSchedule' => true, - 'ActionScheduler_Lock' => true, - 'ActionScheduler_Logger' => true, - 'ActionScheduler_Abstract_Schema' => true, - 'ActionScheduler_Store' => true, - 'ActionScheduler_TimezoneHelper' => true, - ); - - return isset( $abstracts[ $class ] ) && $abstracts[ $class ]; - } - - /** - * Determine if the class is one of our migration classes. - * - * @since 3.0.0 - * - * @param string $class The class name. - * - * @return bool - */ - protected static function is_class_migration( $class ) { - static $migration_segments = array( - 'ActionMigrator' => true, - 'BatchFetcher' => true, - 'DBStoreMigrator' => true, - 'DryRun' => true, - 'LogMigrator' => true, - 'Config' => true, - 'Controller' => true, - 'Runner' => true, - 'Scheduler' => true, - ); - - $segments = explode( '_', $class ); - $segment = isset( $segments[ 1 ] ) ? $segments[ 1 ] : $class; - - return isset( $migration_segments[ $segment ] ) && $migration_segments[ $segment ]; - } - - /** - * Determine if the class is one of our WP CLI classes. - * - * @since 3.0.0 - * - * @param string $class The class name. - * - * @return bool - */ - protected static function is_class_cli( $class ) { - static $cli_segments = array( - 'QueueRunner' => true, - 'Command' => true, - 'ProgressBar' => true, - ); - - $segments = explode( '_', $class ); - $segment = isset( $segments[ 1 ] ) ? $segments[ 1 ] : $class; - - return isset( $cli_segments[ $segment ] ) && $cli_segments[ $segment ]; - } - - final public function __clone() { - trigger_error("Singleton. No cloning allowed!", E_USER_ERROR); - } - - final public function __wakeup() { - trigger_error("Singleton. No serialization allowed!", E_USER_ERROR); - } - - final private function __construct() {} - - /** Deprecated **/ - - public static function get_datetime_object( $when = null, $timezone = 'UTC' ) { - _deprecated_function( __METHOD__, '2.0', 'wcs_add_months()' ); - return as_get_datetime_object( $when, $timezone ); - } - - /** - * Issue deprecated warning if an Action Scheduler function is called in the shutdown hook. - * - * @param string $function_name The name of the function being called. - * @deprecated 3.1.6. - */ - public static function check_shutdown_hook( $function_name ) { - _deprecated_function( __FUNCTION__, '3.1.6' ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php deleted file mode 100644 index 8d1465f..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php +++ /dev/null @@ -1,776 +0,0 @@ - value pair. The - * key must much the table column name and the value is the label, which is - * automatically translated. - * - * @var array - */ - protected $columns = array(); - - /** - * Defines the row-actions. It expects an array where the key - * is the column name and the value is an array of actions. - * - * The array of actions are key => value, where key is the method name - * (with the prefix row_action_) and the value is the label - * and title. - * - * @var array - */ - protected $row_actions = array(); - - /** - * The Primary key of our table - * - * @var string - */ - protected $ID = 'ID'; - - /** - * Enables sorting, it expects an array - * of columns (the column names are the values) - * - * @var array - */ - protected $sort_by = array(); - - /** - * The default sort order - * - * @var string - */ - protected $filter_by = array(); - - /** - * The status name => count combinations for this table's items. Used to display status filters. - * - * @var array - */ - protected $status_counts = array(); - - /** - * Notices to display when loading the table. Array of arrays of form array( 'class' => {updated|error}, 'message' => 'This is the notice text display.' ). - * - * @var array - */ - protected $admin_notices = array(); - - /** - * Localised string displayed in the

      element above the able. - * - * @var string - */ - protected $table_header; - - /** - * Enables bulk actions. It must be an array where the key is the action name - * and the value is the label (which is translated automatically). It is important - * to notice that it will check that the method exists (`bulk_$name`) and will throw - * an exception if it does not exists. - * - * This class will automatically check if the current request has a bulk action, will do the - * validations and afterwards will execute the bulk method, with two arguments. The first argument - * is the array with primary keys, the second argument is a string with a list of the primary keys, - * escaped and ready to use (with `IN`). - * - * @var array - */ - protected $bulk_actions = array(); - - /** - * Makes translation easier, it basically just wraps - * `_x` with some default (the package name). - * - * @param string $text The new text to translate. - * @param string $context The context of the text. - * @return string|void The translated text. - * - * @deprecated 3.0.0 Use `_x()` instead. - */ - protected function translate( $text, $context = '' ) { - return $text; - } - - /** - * Reads `$this->bulk_actions` and returns an array that WP_List_Table understands. It - * also validates that the bulk method handler exists. It throws an exception because - * this is a library meant for developers and missing a bulk method is a development-time error. - * - * @return array - * - * @throws RuntimeException Throws RuntimeException when the bulk action does not have a callback method. - */ - protected function get_bulk_actions() { - $actions = array(); - - foreach ( $this->bulk_actions as $action => $label ) { - if ( ! is_callable( array( $this, 'bulk_' . $action ) ) ) { - throw new RuntimeException( "The bulk action $action does not have a callback method" ); - } - - $actions[ $action ] = $label; - } - - return $actions; - } - - /** - * Checks if the current request has a bulk action. If that is the case it will validate and will - * execute the bulk method handler. Regardless if the action is valid or not it will redirect to - * the previous page removing the current arguments that makes this request a bulk action. - */ - protected function process_bulk_action() { - global $wpdb; - // Detect when a bulk action is being triggered. - $action = $this->current_action(); - if ( ! $action ) { - return; - } - - check_admin_referer( 'bulk-' . $this->_args['plural'] ); - - $method = 'bulk_' . $action; - if ( array_key_exists( $action, $this->bulk_actions ) && is_callable( array( $this, $method ) ) && ! empty( $_GET['ID'] ) && is_array( $_GET['ID'] ) ) { - $ids_sql = '(' . implode( ',', array_fill( 0, count( $_GET['ID'] ), '%s' ) ) . ')'; - $id = array_map( 'absint', $_GET['ID'] ); - $this->$method( $id, $wpdb->prepare( $ids_sql, $id ) ); //phpcs:ignore WordPress.DB.PreparedSQL - } - - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - wp_safe_redirect( - remove_query_arg( - array( '_wp_http_referer', '_wpnonce', 'ID', 'action', 'action2' ), - esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) - ) - ); - exit; - } - } - - /** - * Default code for deleting entries. - * validated already by process_bulk_action() - * - * @param array $ids ids of the items to delete. - * @param string $ids_sql the sql for the ids. - * @return void - */ - protected function bulk_delete( array $ids, $ids_sql ) { - $store = ActionScheduler::store(); - foreach ( $ids as $action_id ) { - $store->delete( $action_id ); - } - } - - /** - * Prepares the _column_headers property which is used by WP_Table_List at rendering. - * It merges the columns and the sortable columns. - */ - protected function prepare_column_headers() { - $this->_column_headers = array( - $this->get_columns(), - get_hidden_columns( $this->screen ), - $this->get_sortable_columns(), - ); - } - - /** - * Reads $this->sort_by and returns the columns name in a format that WP_Table_List - * expects - */ - public function get_sortable_columns() { - $sort_by = array(); - foreach ( $this->sort_by as $column ) { - $sort_by[ $column ] = array( $column, true ); - } - return $sort_by; - } - - /** - * Returns the columns names for rendering. It adds a checkbox for selecting everything - * as the first column - */ - public function get_columns() { - $columns = array_merge( - array( 'cb' => '' ), - $this->columns - ); - - return $columns; - } - - /** - * Get prepared LIMIT clause for items query - * - * @global wpdb $wpdb - * - * @return string Prepared LIMIT clause for items query. - */ - protected function get_items_query_limit() { - global $wpdb; - - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - return $wpdb->prepare( 'LIMIT %d', $per_page ); - } - - /** - * Returns the number of items to offset/skip for this current view. - * - * @return int - */ - protected function get_items_offset() { - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - $current_page = $this->get_pagenum(); - if ( 1 < $current_page ) { - $offset = $per_page * ( $current_page - 1 ); - } else { - $offset = 0; - } - - return $offset; - } - - /** - * Get prepared OFFSET clause for items query - * - * @global wpdb $wpdb - * - * @return string Prepared OFFSET clause for items query. - */ - protected function get_items_query_offset() { - global $wpdb; - - return $wpdb->prepare( 'OFFSET %d', $this->get_items_offset() ); - } - - /** - * Prepares the ORDER BY sql statement. It uses `$this->sort_by` to know which - * columns are sortable. This requests validates the orderby $_GET parameter is a valid - * column and sortable. It will also use order (ASC|DESC) using DESC by default. - */ - protected function get_items_query_order() { - if ( empty( $this->sort_by ) ) { - return ''; - } - - $orderby = esc_sql( $this->get_request_orderby() ); - $order = esc_sql( $this->get_request_order() ); - - return "ORDER BY {$orderby} {$order}"; - } - - /** - * Return the sortable column specified for this request to order the results by, if any. - * - * @return string - */ - protected function get_request_orderby() { - - $valid_sortable_columns = array_values( $this->sort_by ); - - if ( ! empty( $_GET['orderby'] ) && in_array( $_GET['orderby'], $valid_sortable_columns, true ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - $orderby = sanitize_text_field( wp_unslash( $_GET['orderby'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended - } else { - $orderby = $valid_sortable_columns[0]; - } - - return $orderby; - } - - /** - * Return the sortable column order specified for this request. - * - * @return string - */ - protected function get_request_order() { - - if ( ! empty( $_GET['order'] ) && 'desc' === strtolower( sanitize_text_field( wp_unslash( $_GET['order'] ) ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - $order = 'DESC'; - } else { - $order = 'ASC'; - } - - return $order; - } - - /** - * Return the status filter for this request, if any. - * - * @return string - */ - protected function get_request_status() { - $status = ( ! empty( $_GET['status'] ) ) ? sanitize_text_field( wp_unslash( $_GET['status'] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $status; - } - - /** - * Return the search filter for this request, if any. - * - * @return string - */ - protected function get_request_search_query() { - $search_query = ( ! empty( $_GET['s'] ) ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $search_query; - } - - /** - * Process and return the columns name. This is meant for using with SQL, this means it - * always includes the primary key. - * - * @return array - */ - protected function get_table_columns() { - $columns = array_keys( $this->columns ); - if ( ! in_array( $this->ID, $columns, true ) ) { - $columns[] = $this->ID; - } - - return $columns; - } - - /** - * Check if the current request is doing a "full text" search. If that is the case - * prepares the SQL to search texts using LIKE. - * - * If the current request does not have any search or if this list table does not support - * that feature it will return an empty string. - * - * @return string - */ - protected function get_items_query_search() { - global $wpdb; - - if ( empty( $_GET['s'] ) || empty( $this->search_by ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return ''; - } - - $search_string = sanitize_text_field( wp_unslash( $_GET['s'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended - - $filter = array(); - foreach ( $this->search_by as $column ) { - $wild = '%'; - $sql_like = $wild . $wpdb->esc_like( $search_string ) . $wild; - $filter[] = $wpdb->prepare( '`' . $column . '` LIKE %s', $sql_like ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.DB.PreparedSQL.NotPrepared - } - return implode( ' OR ', $filter ); - } - - /** - * Prepares the SQL to filter rows by the options defined at `$this->filter_by`. Before trusting - * any data sent by the user it validates that it is a valid option. - */ - protected function get_items_query_filters() { - global $wpdb; - - if ( ! $this->filter_by || empty( $_GET['filter_by'] ) || ! is_array( $_GET['filter_by'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - return ''; - } - - $filter = array(); - - foreach ( $this->filter_by as $column => $options ) { - if ( empty( $_GET['filter_by'][ $column ] ) || empty( $options[ $_GET['filter_by'][ $column ] ] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - continue; - } - - $filter[] = $wpdb->prepare( "`$column` = %s", sanitize_text_field( wp_unslash( $_GET['filter_by'][ $column ] ) ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.DB.PreparedSQL.InterpolatedNotPrepared - } - - return implode( ' AND ', $filter ); - - } - - /** - * Prepares the data to feed WP_Table_List. - * - * This has the core for selecting, sorting and filting data. To keep the code simple - * its logic is split among many methods (get_items_query_*). - * - * Beside populating the items this function will also count all the records that matches - * the filtering criteria and will do fill the pagination variables. - */ - public function prepare_items() { - global $wpdb; - - $this->process_bulk_action(); - - $this->process_row_actions(); - - if ( ! empty( $_REQUEST['_wp_http_referer'] && ! empty( $_SERVER['REQUEST_URI'] ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended - // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter - wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); - exit; - } - - $this->prepare_column_headers(); - - $limit = $this->get_items_query_limit(); - $offset = $this->get_items_query_offset(); - $order = $this->get_items_query_order(); - $where = array_filter( - array( - $this->get_items_query_search(), - $this->get_items_query_filters(), - ) - ); - $columns = '`' . implode( '`, `', $this->get_table_columns() ) . '`'; - - if ( ! empty( $where ) ) { - $where = 'WHERE (' . implode( ') AND (', $where ) . ')'; - } else { - $where = ''; - } - - $sql = "SELECT $columns FROM {$this->table_name} {$where} {$order} {$limit} {$offset}"; - - $this->set_items( $wpdb->get_results( $sql, ARRAY_A ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - $query_count = "SELECT COUNT({$this->ID}) FROM {$this->table_name} {$where}"; - $total_items = $wpdb->get_var( $query_count ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); - $this->set_pagination_args( - array( - 'total_items' => $total_items, - 'per_page' => $per_page, - 'total_pages' => ceil( $total_items / $per_page ), - ) - ); - } - - /** - * Display the table. - * - * @param string $which The name of the table. - */ - public function extra_tablenav( $which ) { - if ( ! $this->filter_by || 'top' !== $which ) { - return; - } - - echo '
      '; - - foreach ( $this->filter_by as $id => $options ) { - $default = ! empty( $_GET['filter_by'][ $id ] ) ? sanitize_text_field( wp_unslash( $_GET['filter_by'][ $id ] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended - if ( empty( $options[ $default ] ) ) { - $default = ''; - } - - echo ''; - } - - submit_button( esc_html__( 'Filter', 'action-scheduler' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); - echo '
      '; - } - - /** - * Set the data for displaying. It will attempt to unserialize (There is a chance that some columns - * are serialized). This can be override in child classes for futher data transformation. - * - * @param array $items Items array. - */ - protected function set_items( array $items ) { - $this->items = array(); - foreach ( $items as $item ) { - $this->items[ $item[ $this->ID ] ] = array_map( 'maybe_unserialize', $item ); - } - } - - /** - * Renders the checkbox for each row, this is the first column and it is named ID regardless - * of how the primary key is named (to keep the code simpler). The bulk actions will do the proper - * name transformation though using `$this->ID`. - * - * @param array $row The row to render. - */ - public function column_cb( $row ) { - return ''; - } - - /** - * Renders the row-actions. - * - * This method renders the action menu, it reads the definition from the $row_actions property, - * and it checks that the row action method exists before rendering it. - * - * @param array $row Row to be rendered. - * @param string $column_name Column name. - * @return string - */ - protected function maybe_render_actions( $row, $column_name ) { - if ( empty( $this->row_actions[ $column_name ] ) ) { - return; - } - - $row_id = $row[ $this->ID ]; - - $actions = '
      '; - $action_count = 0; - foreach ( $this->row_actions[ $column_name ] as $action_key => $action ) { - - $action_count++; - - if ( ! method_exists( $this, 'row_action_' . $action_key ) ) { - continue; - } - - $action_link = ! empty( $action['link'] ) ? $action['link'] : add_query_arg( - array( - 'row_action' => $action_key, - 'row_id' => $row_id, - 'nonce' => wp_create_nonce( $action_key . '::' . $row_id ), - ) - ); - $span_class = ! empty( $action['class'] ) ? $action['class'] : $action_key; - $separator = ( $action_count < count( $this->row_actions[ $column_name ] ) ) ? ' | ' : ''; - - $actions .= sprintf( '', esc_attr( $span_class ) ); - $actions .= sprintf( '%3$s', esc_url( $action_link ), esc_attr( $action['desc'] ), esc_html( $action['name'] ) ); - $actions .= sprintf( '%s', $separator ); - } - $actions .= '
      '; - return $actions; - } - - /** - * Process the bulk actions. - * - * @return void - */ - protected function process_row_actions() { - $parameters = array( 'row_action', 'row_id', 'nonce' ); - foreach ( $parameters as $parameter ) { - if ( empty( $_REQUEST[ $parameter ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return; - } - } - - $action = sanitize_text_field( wp_unslash( $_REQUEST['row_action'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated - $row_id = sanitize_text_field( wp_unslash( $_REQUEST['row_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated - $nonce = sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated - $method = 'row_action_' . $action; // phpcs:ignore WordPress.Security.NonceVerification.Recommended - - if ( wp_verify_nonce( $nonce, $action . '::' . $row_id ) && method_exists( $this, $method ) ) { - $this->$method( sanitize_text_field( wp_unslash( $row_id ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended - } - - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - wp_safe_redirect( - remove_query_arg( - array( 'row_id', 'row_action', 'nonce' ), - esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) - ) - ); - exit; - } - } - - /** - * Default column formatting, it will escape everythig for security. - * - * @param array $item The item array. - * @param string $column_name Column name to display. - * - * @return string - */ - public function column_default( $item, $column_name ) { - $column_html = esc_html( $item[ $column_name ] ); - $column_html .= $this->maybe_render_actions( $item, $column_name ); - return $column_html; - } - - /** - * Display the table heading and search query, if any - */ - protected function display_header() { - echo '

      ' . esc_attr( $this->table_header ) . '

      '; - if ( $this->get_request_search_query() ) { - /* translators: %s: search query */ - echo '' . esc_attr( sprintf( __( 'Search results for "%s"', 'action-scheduler' ), $this->get_request_search_query() ) ) . ''; - } - echo '
      '; - } - - /** - * Display the table heading and search query, if any - */ - protected function display_admin_notices() { - foreach ( $this->admin_notices as $notice ) { - echo '
      '; - echo '

      ' . wp_kses_post( $notice['message'] ) . '

      '; - echo '
      '; - } - } - - /** - * Prints the available statuses so the user can click to filter. - */ - protected function display_filter_by_status() { - - $status_list_items = array(); - $request_status = $this->get_request_status(); - - // Helper to set 'all' filter when not set on status counts passed in. - if ( ! isset( $this->status_counts['all'] ) ) { - $all_count = array_sum( $this->status_counts ); - if ( isset( $this->status_counts['past-due'] ) ) { - $all_count -= $this->status_counts['past-due']; - } - $this->status_counts = array( 'all' => $all_count ) + $this->status_counts; - } - - // Translated status labels. - $status_labels = ActionScheduler_Store::instance()->get_status_labels(); - $status_labels['all'] = _x( 'All', 'status labels', 'action-scheduler' ); - $status_labels['past-due'] = _x( 'Past-due', 'status labels', 'action-scheduler' ); - - foreach ( $this->status_counts as $status_slug => $count ) { - - if ( 0 === $count ) { - continue; - } - - if ( $status_slug === $request_status || ( empty( $request_status ) && 'all' === $status_slug ) ) { - $status_list_item = '
    4. %3$s (%4$d)
    5. '; - } else { - $status_list_item = '
    6. %3$s (%4$d)
    7. '; - } - - $status_name = isset( $status_labels[ $status_slug ] ) ? $status_labels[ $status_slug ] : ucfirst( $status_slug ); - $status_filter_url = ( 'all' === $status_slug ) ? remove_query_arg( 'status' ) : add_query_arg( 'status', $status_slug ); - $status_filter_url = remove_query_arg( array( 'paged', 's' ), $status_filter_url ); - $status_list_items[] = sprintf( $status_list_item, esc_attr( $status_slug ), esc_url( $status_filter_url ), esc_html( $status_name ), absint( $count ) ); - } - - if ( $status_list_items ) { - echo '
        '; - echo implode( " | \n", $status_list_items ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - echo '
      '; - } - } - - /** - * Renders the table list, we override the original class to render the table inside a form - * and to render any needed HTML (like the search box). By doing so the callee of a function can simple - * forget about any extra HTML. - */ - protected function display_table() { - echo '
      '; - foreach ( $_GET as $key => $value ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - if ( '_' === $key[0] || 'paged' === $key || 'ID' === $key ) { - continue; - } - echo ''; - } - if ( ! empty( $this->search_by ) ) { - echo $this->search_box( $this->get_search_box_button_text(), 'plugin' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - } - parent::display(); - echo '
      '; - } - - /** - * Process any pending actions. - */ - public function process_actions() { - $this->process_bulk_action(); - $this->process_row_actions(); - - if ( ! empty( $_REQUEST['_wp_http_referer'] ) && ! empty( $_SERVER['REQUEST_URI'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter - wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); - exit; - } - } - - /** - * Render the list table page, including header, notices, status filters and table. - */ - public function display_page() { - $this->prepare_items(); - - echo '
      '; - $this->display_header(); - $this->display_admin_notices(); - $this->display_filter_by_status(); - $this->display_table(); - echo '
      '; - } - - /** - * Get the text to display in the search box on the list table. - */ - protected function get_search_box_placeholder() { - return esc_html__( 'Search', 'action-scheduler' ); - } - - /** - * Gets the screen per_page option name. - * - * @return string - */ - protected function get_per_page_option_name() { - return $this->package . '_items_per_page'; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php deleted file mode 100644 index 2f95702..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php +++ /dev/null @@ -1,372 +0,0 @@ -created_time = microtime( true ); - - $this->store = $store ? $store : ActionScheduler_Store::instance(); - $this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store ); - $this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store ); - } - - /** - * Process an individual action. - * - * @param int $action_id The action ID to process. - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - */ - public function process_action( $action_id, $context = '' ) { - // Temporarily override the error handler while we process the current action. - set_error_handler( - /** - * Temporary error handler which can catch errors and convert them into exceptions. This faciliates more - * robust error handling across all supported PHP versions. - * - * @throws Exception - * - * @param int $type Error level expressed as an integer. - * @param string $message Error message. - */ - function ( $type, $message ) { - throw new Exception( $message ); - }, - E_USER_ERROR | E_RECOVERABLE_ERROR - ); - - /* - * The nested try/catch structure is required because we potentially need to convert thrown errors into - * exceptions (and an exception thrown from a catch block cannot be caught by a later catch block in the *same* - * structure). - */ - try { - try { - $valid_action = false; - do_action( 'action_scheduler_before_execute', $action_id, $context ); - - if ( ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status( $action_id ) ) { - do_action( 'action_scheduler_execution_ignored', $action_id, $context ); - return; - } - - $valid_action = true; - do_action( 'action_scheduler_begin_execute', $action_id, $context ); - - $action = $this->store->fetch_action( $action_id ); - $this->store->log_execution( $action_id ); - $action->execute(); - do_action( 'action_scheduler_after_execute', $action_id, $action, $context ); - $this->store->mark_complete( $action_id ); - } catch ( Throwable $e ) { - // Throwable is defined when executing under PHP 7.0 and up. We convert it to an exception, for - // compatibility with ActionScheduler_Logger. - throw new Exception( $e->getMessage(), $e->getCode(), $e->getPrevious() ); - } - } catch ( Exception $e ) { - // This catch block exists for compatibility with PHP 5.6. - $this->handle_action_error( $action_id, $e, $context, $valid_action ); - } finally { - restore_error_handler(); - } - - if ( isset( $action ) && is_a( $action, 'ActionScheduler_Action' ) && $action->get_schedule()->is_recurring() ) { - $this->schedule_next_instance( $action, $action_id ); - } - } - - /** - * Marks actions as either having failed execution or failed validation, as appropriate. - * - * @param int $action_id Action ID. - * @param Exception $e Exception instance. - * @param string $context Execution context. - * @param bool $valid_action If the action is valid. - * - * @return void - */ - private function handle_action_error( $action_id, $e, $context, $valid_action ) { - if ( $valid_action ) { - $this->store->mark_failure( $action_id ); - /** - * Runs when action execution fails. - * - * @param int $action_id Action ID. - * @param Exception $e Exception instance. - * @param string $context Execution context. - */ - do_action( 'action_scheduler_failed_execution', $action_id, $e, $context ); - } else { - /** - * Runs when action validation fails. - * - * @param int $action_id Action ID. - * @param Exception $e Exception instance. - * @param string $context Execution context. - */ - do_action( 'action_scheduler_failed_validation', $action_id, $e, $context ); - } - } - - /** - * Schedule the next instance of the action if necessary. - * - * @param ActionScheduler_Action $action - * @param int $action_id - */ - protected function schedule_next_instance( ActionScheduler_Action $action, $action_id ) { - // If a recurring action has been consistently failing, we may wish to stop rescheduling it. - if ( - ActionScheduler_Store::STATUS_FAILED === $this->store->get_status( $action_id ) - && $this->recurring_action_is_consistently_failing( $action, $action_id ) - ) { - ActionScheduler_Logger::instance()->log( - $action_id, - __( 'This action appears to be consistently failing. A new instance will not be scheduled.', 'action-scheduler' ) - ); - - return; - } - - try { - ActionScheduler::factory()->repeat( $action ); - } catch ( Exception $e ) { - do_action( 'action_scheduler_failed_to_schedule_next_instance', $action_id, $e, $action ); - } - } - - /** - * Determine if the specified recurring action has been consistently failing. - * - * @param ActionScheduler_Action $action The recurring action to be rescheduled. - * @param int $action_id The ID of the recurring action. - * - * @return bool - */ - private function recurring_action_is_consistently_failing( ActionScheduler_Action $action, $action_id ) { - /** - * Controls the failure threshold for recurring actions. - * - * Before rescheduling a recurring action, we look at its status. If it failed, we then check if all of the most - * recent actions (upto the threshold set by this filter) sharing the same hook have also failed: if they have, - * that is considered consistent failure and a new instance of the action will not be scheduled. - * - * @param int $failure_threshold Number of actions of the same hook to examine for failure. Defaults to 5. - */ - $consistent_failure_threshold = (int) apply_filters( 'action_scheduler_recurring_action_failure_threshold', 5 ); - - // This query should find the earliest *failing* action (for the hook we are interested in) within our threshold. - $query_args = array( - 'hook' => $action->get_hook(), - 'status' => ActionScheduler_Store::STATUS_FAILED, - 'date' => date_create( 'now', timezone_open( 'UTC' ) )->format( 'Y-m-d H:i:s' ), - 'date_compare' => '<', - 'per_page' => 1, - 'offset' => $consistent_failure_threshold - 1 - ); - - $first_failing_action_id = $this->store->query_actions( $query_args ); - - // If we didn't retrieve an action ID, then there haven't been enough failures for us to worry about. - if ( empty( $first_failing_action_id ) ) { - return false; - } - - // Now let's fetch the first action (having the same hook) of *any status* within the same window. - unset( $query_args['status'] ); - $first_action_id_with_the_same_hook = $this->store->query_actions( $query_args ); - - /** - * If a recurring action is assessed as consistently failing, it will not be rescheduled. This hook provides a - * way to observe and optionally override that assessment. - * - * @param bool $is_consistently_failing If the action is considered to be consistently failing. - * @param ActionScheduler_Action $action The action being assessed. - */ - return (bool) apply_filters( - 'action_scheduler_recurring_action_is_consistently_failing', - $first_action_id_with_the_same_hook === $first_failing_action_id, - $action - ); - } - - /** - * Run the queue cleaner. - * - * @author Jeremy Pry - */ - protected function run_cleanup() { - $this->cleaner->clean( 10 * $this->get_time_limit() ); - } - - /** - * Get the number of concurrent batches a runner allows. - * - * @return int - */ - public function get_allowed_concurrent_batches() { - return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 1 ); - } - - /** - * Check if the number of allowed concurrent batches is met or exceeded. - * - * @return bool - */ - public function has_maximum_concurrent_batches() { - return $this->store->get_claim_count() >= $this->get_allowed_concurrent_batches(); - } - - /** - * Get the maximum number of seconds a batch can run for. - * - * @return int The number of seconds. - */ - protected function get_time_limit() { - - $time_limit = 30; - - // Apply deprecated filter from deprecated get_maximum_execution_time() method - if ( has_filter( 'action_scheduler_maximum_execution_time' ) ) { - _deprecated_function( 'action_scheduler_maximum_execution_time', '2.1.1', 'action_scheduler_queue_runner_time_limit' ); - $time_limit = apply_filters( 'action_scheduler_maximum_execution_time', $time_limit ); - } - - return absint( apply_filters( 'action_scheduler_queue_runner_time_limit', $time_limit ) ); - } - - /** - * Get the number of seconds the process has been running. - * - * @return int The number of seconds. - */ - protected function get_execution_time() { - $execution_time = microtime( true ) - $this->created_time; - - // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time. - if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) { - $resource_usages = getrusage(); - - if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) { - $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 ); - } - } - - return $execution_time; - } - - /** - * Check if the host's max execution time is (likely) to be exceeded if processing more actions. - * - * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action - * @return bool - */ - protected function time_likely_to_be_exceeded( $processed_actions ) { - $execution_time = $this->get_execution_time(); - $max_execution_time = $this->get_time_limit(); - - // Safety against division by zero errors. - if ( 0 === $processed_actions ) { - return $execution_time >= $max_execution_time; - } - - $time_per_action = $execution_time / $processed_actions; - $estimated_time = $execution_time + ( $time_per_action * 3 ); - $likely_to_be_exceeded = $estimated_time > $max_execution_time; - - return apply_filters( 'action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time ); - } - - /** - * Get memory limit - * - * Based on WP_Background_Process::get_memory_limit() - * - * @return int - */ - protected function get_memory_limit() { - if ( function_exists( 'ini_get' ) ) { - $memory_limit = ini_get( 'memory_limit' ); - } else { - $memory_limit = '128M'; // Sensible default, and minimum required by WooCommerce - } - - if ( ! $memory_limit || -1 === $memory_limit || '-1' === $memory_limit ) { - // Unlimited, set to 32GB. - $memory_limit = '32G'; - } - - return ActionScheduler_Compatibility::convert_hr_to_bytes( $memory_limit ); - } - - /** - * Memory exceeded - * - * Ensures the batch process never exceeds 90% of the maximum WordPress memory. - * - * Based on WP_Background_Process::memory_exceeded() - * - * @return bool - */ - protected function memory_exceeded() { - - $memory_limit = $this->get_memory_limit() * 0.90; - $current_memory = memory_get_usage( true ); - $memory_exceeded = $current_memory >= $memory_limit; - - return apply_filters( 'action_scheduler_memory_exceeded', $memory_exceeded, $this ); - } - - /** - * See if the batch limits have been exceeded, which is when memory usage is almost at - * the maximum limit, or the time to process more actions will exceed the max time limit. - * - * Based on WC_Background_Process::batch_limits_exceeded() - * - * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action - * @return bool - */ - protected function batch_limits_exceeded( $processed_actions ) { - return $this->memory_exceeded() || $this->time_likely_to_be_exceeded( $processed_actions ); - } - - /** - * Process actions in the queue. - * - * @author Jeremy Pry - * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' - * Generally, this should be capitalised and not localised as it's a proper noun. - * @return int The number of actions processed. - */ - abstract public function run( $context = '' ); -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php deleted file mode 100644 index 131d475..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php +++ /dev/null @@ -1,102 +0,0 @@ -start - and logic to calculate the next run date after - * that - @see $this->calculate_next(). The $first_date property also keeps a record of when the very - * first instance of this chain of schedules ran. - * - * @var DateTime - */ - private $first_date = NULL; - - /** - * Timestamp equivalent of @see $this->first_date - * - * @var int - */ - protected $first_timestamp = NULL; - - /** - * The recurrance between each time an action is run using this schedule. - * Used to calculate the start date & time. Can be a number of seconds, in the - * case of ActionScheduler_IntervalSchedule, or a cron expression, as in the - * case of ActionScheduler_CronSchedule. Or something else. - * - * @var mixed - */ - protected $recurrence; - - /** - * @param DateTime $date The date & time to run the action. - * @param mixed $recurrence The data used to determine the schedule's recurrance. - * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. - */ - public function __construct( DateTime $date, $recurrence, DateTime $first = null ) { - parent::__construct( $date ); - $this->first_date = empty( $first ) ? $date : $first; - $this->recurrence = $recurrence; - } - - /** - * @return bool - */ - public function is_recurring() { - return true; - } - - /** - * Get the date & time of the first schedule in this recurring series. - * - * @return DateTime|null - */ - public function get_first_date() { - return clone $this->first_date; - } - - /** - * @return string - */ - public function get_recurrence() { - return $this->recurrence; - } - - /** - * For PHP 5.2 compat, since DateTime objects can't be serialized - * @return array - */ - public function __sleep() { - $sleep_params = parent::__sleep(); - $this->first_timestamp = $this->first_date->getTimestamp(); - return array_merge( $sleep_params, array( - 'first_timestamp', - 'recurrence' - ) ); - } - - /** - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. This was addressed in - * Action Scheduler 3.0.0, where properties and property names were aligned for better - * inheritance. To maintain backward compatibility with scheduled serialized and stored - * prior to 3.0, we need to correctly map the old property names. - */ - public function __wakeup() { - parent::__wakeup(); - if ( $this->first_timestamp > 0 ) { - $this->first_date = as_get_datetime_object( $this->first_timestamp ); - } else { - $this->first_date = $this->get_date(); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php deleted file mode 100644 index 2631ef5..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php +++ /dev/null @@ -1,83 +0,0 @@ -scheduled_date - * - * @var int - */ - protected $scheduled_timestamp = NULL; - - /** - * @param DateTime $date The date & time to run the action. - */ - public function __construct( DateTime $date ) { - $this->scheduled_date = $date; - } - - /** - * Check if a schedule should recur. - * - * @return bool - */ - abstract public function is_recurring(); - - /** - * Calculate when the next instance of this schedule would run based on a given date & time. - * - * @param DateTime $after - * @return DateTime - */ - abstract protected function calculate_next( DateTime $after ); - - /** - * Get the next date & time when this schedule should run after a given date & time. - * - * @param DateTime $after - * @return DateTime|null - */ - public function get_next( DateTime $after ) { - $after = clone $after; - if ( $after > $this->scheduled_date ) { - $after = $this->calculate_next( $after ); - return $after; - } - return clone $this->scheduled_date; - } - - /** - * Get the date & time the schedule is set to run. - * - * @return DateTime|null - */ - public function get_date() { - return $this->scheduled_date; - } - - /** - * For PHP 5.2 compat, since DateTime objects can't be serialized - * @return array - */ - public function __sleep() { - $this->scheduled_timestamp = $this->scheduled_date->getTimestamp(); - return array( - 'scheduled_timestamp', - ); - } - - public function __wakeup() { - $this->scheduled_date = as_get_datetime_object( $this->scheduled_timestamp ); - unset( $this->scheduled_timestamp ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php deleted file mode 100644 index 3fd259e..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php +++ /dev/null @@ -1,177 +0,0 @@ -tables as $table ) { - $wpdb->tables[] = $table; - $name = $this->get_full_table_name( $table ); - $wpdb->$table = $name; - } - - // create the tables - if ( $this->schema_update_required() || $force_update ) { - foreach ( $this->tables as $table ) { - /** - * Allow custom processing before updating a table schema. - * - * @param string $table Name of table being updated. - * @param string $db_version Existing version of the table being updated. - */ - do_action( 'action_scheduler_before_schema_update', $table, $this->db_version ); - $this->update_table( $table ); - } - $this->mark_schema_update_complete(); - } - } - - /** - * @param string $table The name of the table - * - * @return string The CREATE TABLE statement, suitable for passing to dbDelta - */ - abstract protected function get_table_definition( $table ); - - /** - * Determine if the database schema is out of date - * by comparing the integer found in $this->schema_version - * with the option set in the WordPress options table - * - * @return bool - */ - private function schema_update_required() { - $option_name = 'schema-' . static::class; - $this->db_version = get_option( $option_name, 0 ); - - // Check for schema option stored by the Action Scheduler Custom Tables plugin in case site has migrated from that plugin with an older schema - if ( 0 === $this->db_version ) { - - $plugin_option_name = 'schema-'; - - switch ( static::class ) { - case 'ActionScheduler_StoreSchema': - $plugin_option_name .= 'Action_Scheduler\Custom_Tables\DB_Store_Table_Maker'; - break; - case 'ActionScheduler_LoggerSchema': - $plugin_option_name .= 'Action_Scheduler\Custom_Tables\DB_Logger_Table_Maker'; - break; - } - - $this->db_version = get_option( $plugin_option_name, 0 ); - - delete_option( $plugin_option_name ); - } - - return version_compare( $this->db_version, $this->schema_version, '<' ); - } - - /** - * Update the option in WordPress to indicate that - * our schema is now up to date - * - * @return void - */ - private function mark_schema_update_complete() { - $option_name = 'schema-' . static::class; - - // work around race conditions and ensure that our option updates - $value_to_save = (string) $this->schema_version . '.0.' . time(); - - update_option( $option_name, $value_to_save ); - } - - /** - * Update the schema for the given table - * - * @param string $table The name of the table to update - * - * @return void - */ - private function update_table( $table ) { - require_once ABSPATH . 'wp-admin/includes/upgrade.php'; - $definition = $this->get_table_definition( $table ); - if ( $definition ) { - $updated = dbDelta( $definition ); - foreach ( $updated as $updated_table => $update_description ) { - if ( strpos( $update_description, 'Created table' ) === 0 ) { - do_action( 'action_scheduler/created_table', $updated_table, $table ); - } - } - } - } - - /** - * @param string $table - * - * @return string The full name of the table, including the - * table prefix for the current blog - */ - protected function get_full_table_name( $table ) { - return $GLOBALS['wpdb']->prefix . $table; - } - - /** - * Confirms that all of the tables registered by this schema class have been created. - * - * @return bool - */ - public function tables_exist() { - global $wpdb; - - $tables_exist = true; - - foreach ( $this->tables as $table_name ) { - $table_name = $wpdb->prefix . $table_name; - $pattern = str_replace( '_', '\\_', $table_name ); - $existing_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $pattern ) ); - - if ( $existing_table !== $table_name ) { - $tables_exist = false; - break; - } - } - - return $tables_exist; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Lock.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Lock.php deleted file mode 100644 index e388a58..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Lock.php +++ /dev/null @@ -1,64 +0,0 @@ -get_expiration( $lock_type ) >= time() ); - } - - /** - * Set a lock. - * - * To prevent race conditions, implementations should avoid setting the lock if the lock is already held. - * - * @param string $lock_type A string to identify different lock types. - * @return bool - */ - abstract public function set( $lock_type ); - - /** - * If a lock is set, return the timestamp it was set to expiry. - * - * @param string $lock_type A string to identify different lock types. - * @return bool|int False if no lock is set, otherwise the timestamp for when the lock is set to expire. - */ - abstract public function get_expiration( $lock_type ); - - /** - * Get the amount of time to set for a given lock. 60 seconds by default. - * - * @param string $lock_type A string to identify different lock types. - * @return int - */ - protected function get_duration( $lock_type ) { - return apply_filters( 'action_scheduler_lock_duration', self::$lock_duration, $lock_type ); - } - - /** - * @return ActionScheduler_Lock - */ - public static function instance() { - if ( empty( self::$locker ) ) { - $class = apply_filters( 'action_scheduler_lock_class', 'ActionScheduler_OptionLock' ); - self::$locker = new $class(); - } - return self::$locker; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php deleted file mode 100644 index c3afd04..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Logger.php +++ /dev/null @@ -1,176 +0,0 @@ -hook_stored_action(); - add_action( 'action_scheduler_canceled_action', array( $this, 'log_canceled_action' ), 10, 1 ); - add_action( 'action_scheduler_begin_execute', array( $this, 'log_started_action' ), 10, 2 ); - add_action( 'action_scheduler_after_execute', array( $this, 'log_completed_action' ), 10, 3 ); - add_action( 'action_scheduler_failed_execution', array( $this, 'log_failed_action' ), 10, 3 ); - add_action( 'action_scheduler_failed_action', array( $this, 'log_timed_out_action' ), 10, 2 ); - add_action( 'action_scheduler_unexpected_shutdown', array( $this, 'log_unexpected_shutdown' ), 10, 2 ); - add_action( 'action_scheduler_reset_action', array( $this, 'log_reset_action' ), 10, 1 ); - add_action( 'action_scheduler_execution_ignored', array( $this, 'log_ignored_action' ), 10, 2 ); - add_action( 'action_scheduler_failed_fetch_action', array( $this, 'log_failed_fetch_action' ), 10, 2 ); - add_action( 'action_scheduler_failed_to_schedule_next_instance', array( $this, 'log_failed_schedule_next_instance' ), 10, 2 ); - add_action( 'action_scheduler_bulk_cancel_actions', array( $this, 'bulk_log_cancel_actions' ), 10, 1 ); - } - - public function hook_stored_action() { - add_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ) ); - } - - public function unhook_stored_action() { - remove_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ) ); - } - - public function log_stored_action( $action_id ) { - $this->log( $action_id, __( 'action created', 'action-scheduler' ) ); - } - - public function log_canceled_action( $action_id ) { - $this->log( $action_id, __( 'action canceled', 'action-scheduler' ) ); - } - - public function log_started_action( $action_id, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: %s: context */ - $message = sprintf( __( 'action started via %s', 'action-scheduler' ), $context ); - } else { - $message = __( 'action started', 'action-scheduler' ); - } - $this->log( $action_id, $message ); - } - - public function log_completed_action( $action_id, $action = NULL, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: %s: context */ - $message = sprintf( __( 'action complete via %s', 'action-scheduler' ), $context ); - } else { - $message = __( 'action complete', 'action-scheduler' ); - } - $this->log( $action_id, $message ); - } - - public function log_failed_action( $action_id, Exception $exception, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: 1: context 2: exception message */ - $message = sprintf( __( 'action failed via %1$s: %2$s', 'action-scheduler' ), $context, $exception->getMessage() ); - } else { - /* translators: %s: exception message */ - $message = sprintf( __( 'action failed: %s', 'action-scheduler' ), $exception->getMessage() ); - } - $this->log( $action_id, $message ); - } - - public function log_timed_out_action( $action_id, $timeout ) { - /* translators: %s: amount of time */ - $this->log( $action_id, sprintf( __( 'action marked as failed after %s seconds. Unknown error occurred. Check server, PHP and database error logs to diagnose cause.', 'action-scheduler' ), $timeout ) ); - } - - public function log_unexpected_shutdown( $action_id, $error ) { - if ( ! empty( $error ) ) { - /* translators: 1: error message 2: filename 3: line */ - $this->log( $action_id, sprintf( __( 'unexpected shutdown: PHP Fatal error %1$s in %2$s on line %3$s', 'action-scheduler' ), $error['message'], $error['file'], $error['line'] ) ); - } - } - - public function log_reset_action( $action_id ) { - $this->log( $action_id, __( 'action reset', 'action-scheduler' ) ); - } - - public function log_ignored_action( $action_id, $context = '' ) { - if ( ! empty( $context ) ) { - /* translators: %s: context */ - $message = sprintf( __( 'action ignored via %s', 'action-scheduler' ), $context ); - } else { - $message = __( 'action ignored', 'action-scheduler' ); - } - $this->log( $action_id, $message ); - } - - /** - * @param string $action_id - * @param Exception|NULL $exception The exception which occured when fetching the action. NULL by default for backward compatibility. - * - * @return ActionScheduler_LogEntry[] - */ - public function log_failed_fetch_action( $action_id, Exception $exception = NULL ) { - - if ( ! is_null( $exception ) ) { - /* translators: %s: exception message */ - $log_message = sprintf( __( 'There was a failure fetching this action: %s', 'action-scheduler' ), $exception->getMessage() ); - } else { - $log_message = __( 'There was a failure fetching this action', 'action-scheduler' ); - } - - $this->log( $action_id, $log_message ); - } - - public function log_failed_schedule_next_instance( $action_id, Exception $exception ) { - /* translators: %s: exception message */ - $this->log( $action_id, sprintf( __( 'There was a failure scheduling the next instance of this action: %s', 'action-scheduler' ), $exception->getMessage() ) ); - } - - /** - * Bulk add cancel action log entries. - * - * Implemented here for backward compatibility. Should be implemented in parent loggers - * for more performant bulk logging. - * - * @param array $action_ids List of action ID. - */ - public function bulk_log_cancel_actions( $action_ids ) { - if ( empty( $action_ids ) ) { - return; - } - - foreach ( $action_ids as $action_id ) { - $this->log_canceled_action( $action_id ); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php deleted file mode 100644 index faaaa9e..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_Store.php +++ /dev/null @@ -1,450 +0,0 @@ - null, - 'status' => self::STATUS_PENDING, - 'group' => '', - ) - ); - - // These params are fixed for this method. - $params['hook'] = $hook; - $params['orderby'] = 'date'; - $params['per_page'] = 1; - - if ( ! empty( $params['status'] ) ) { - if ( self::STATUS_PENDING === $params['status'] ) { - $params['order'] = 'ASC'; // Find the next action that matches. - } else { - $params['order'] = 'DESC'; // Find the most recent action that matches. - } - } - - $results = $this->query_actions( $params ); - - return empty( $results ) ? null : $results[0]; - } - - /** - * Query for action count or list of action IDs. - * - * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. - * - * @param array $query { - * Query filtering options. - * - * @type string $hook The name of the actions. Optional. - * @type string|array $status The status or statuses of the actions. Optional. - * @type array $args The args array of the actions. Optional. - * @type DateTime $date The scheduled date of the action. Used in UTC timezone. Optional. - * @type string $date_compare Operator for selecting by $date param. Accepted values are '!=', '>', '>=', '<', '<=', '='. Defaults to '<='. - * @type DateTime $modified The last modified date of the action. Used in UTC timezone. Optional. - * @type string $modified_compare Operator for comparing $modified param. Accepted values are '!=', '>', '>=', '<', '<=', '='. Defaults to '<='. - * @type string $group The group the action belongs to. Optional. - * @type bool|int $claimed TRUE to find claimed actions, FALSE to find unclaimed actions, an int to find a specific claim ID. Optional. - * @type int $per_page Number of results to return. Defaults to 5. - * @type int $offset The query pagination offset. Defaults to 0. - * @type int $orderby Accepted values are 'hook', 'group', 'modified', 'date' or 'none'. Defaults to 'date'. - * @type string $order Accepted values are 'ASC' or 'DESC'. Defaults to 'ASC'. - * } - * @param string $query_type Whether to select or count the results. Default, select. - * - * @return string|array|null The IDs of actions matching the query. Null on failure. - */ - abstract public function query_actions( $query = array(), $query_type = 'select' ); - - /** - * Run query to get a single action ID. - * - * @since 3.3.0 - * - * @see ActionScheduler_Store::query_actions for $query arg usage but 'per_page' and 'offset' can't be used. - * - * @param array $query Query parameters. - * - * @return int|null - */ - public function query_action( $query ) { - $query['per_page'] = 1; - $query['offset'] = 0; - $results = $this->query_actions( $query ); - - if ( empty( $results ) ) { - return null; - } else { - return (int) $results[0]; - } - } - - /** - * Get a count of all actions in the store, grouped by status - * - * @return array - */ - abstract public function action_counts(); - - /** - * Get additional action counts. - * - * - add past-due actions - * - * @return array - */ - public function extra_action_counts() { - $extra_actions = array(); - - $pastdue_action_counts = ( int ) $this->query_actions( array( - 'status' => self::STATUS_PENDING, - 'date' => as_get_datetime_object(), - ), 'count' ); - - if ( $pastdue_action_counts ) { - $extra_actions['past-due'] = $pastdue_action_counts; - } - - /** - * Allows 3rd party code to add extra action counts (used in filters in the list table). - * - * @since 3.5.0 - * @param $extra_actions array Array with format action_count_identifier => action count. - */ - return apply_filters( 'action_scheduler_extra_action_counts', $extra_actions ); - } - - /** - * @param string $action_id - */ - abstract public function cancel_action( $action_id ); - - /** - * @param string $action_id - */ - abstract public function delete_action( $action_id ); - - /** - * @param string $action_id - * - * @return DateTime The date the action is schedule to run, or the date that it ran. - */ - abstract public function get_date( $action_id ); - - - /** - * @param int $max_actions - * @param DateTime $before_date Claim only actions schedule before the given date. Defaults to now. - * @param array $hooks Claim only actions with a hook or hooks. - * @param string $group Claim only actions in the given group. - * - * @return ActionScheduler_ActionClaim - */ - abstract public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ); - - /** - * @return int - */ - abstract public function get_claim_count(); - - /** - * @param ActionScheduler_ActionClaim $claim - */ - abstract public function release_claim( ActionScheduler_ActionClaim $claim ); - - /** - * @param string $action_id - */ - abstract public function unclaim_action( $action_id ); - - /** - * @param string $action_id - */ - abstract public function mark_failure( $action_id ); - - /** - * @param string $action_id - */ - abstract public function log_execution( $action_id ); - - /** - * @param string $action_id - */ - abstract public function mark_complete( $action_id ); - - /** - * @param string $action_id - * - * @return string - */ - abstract public function get_status( $action_id ); - - /** - * @param string $action_id - * @return mixed - */ - abstract public function get_claim_id( $action_id ); - - /** - * @param string $claim_id - * @return array - */ - abstract public function find_actions_by_claim_id( $claim_id ); - - /** - * @param string $comparison_operator - * @return string - */ - protected function validate_sql_comparator( $comparison_operator ) { - if ( in_array( $comparison_operator, array('!=', '>', '>=', '<', '<=', '=') ) ) { - return $comparison_operator; - } - return '='; - } - - /** - * Get the time MySQL formated date/time string for an action's (next) scheduled date. - * - * @param ActionScheduler_Action $action - * @param DateTime $scheduled_date (optional) - * @return string - */ - protected function get_scheduled_date_string( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { - $next = null === $scheduled_date ? $action->get_schedule()->get_date() : $scheduled_date; - if ( ! $next ) { - $next = date_create(); - } - $next->setTimezone( new DateTimeZone( 'UTC' ) ); - - return $next->format( 'Y-m-d H:i:s' ); - } - - /** - * Get the time MySQL formated date/time string for an action's (next) scheduled date. - * - * @param ActionScheduler_Action $action - * @param DateTime $scheduled_date (optional) - * @return string - */ - protected function get_scheduled_date_string_local( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { - $next = null === $scheduled_date ? $action->get_schedule()->get_date() : $scheduled_date; - if ( ! $next ) { - $next = date_create(); - } - - ActionScheduler_TimezoneHelper::set_local_timezone( $next ); - return $next->format( 'Y-m-d H:i:s' ); - } - - /** - * Validate that we could decode action arguments. - * - * @param mixed $args The decoded arguments. - * @param int $action_id The action ID. - * - * @throws ActionScheduler_InvalidActionException When the decoded arguments are invalid. - */ - protected function validate_args( $args, $action_id ) { - // Ensure we have an array of args. - if ( ! is_array( $args ) ) { - throw ActionScheduler_InvalidActionException::from_decoding_args( $action_id ); - } - - // Validate JSON decoding if possible. - if ( function_exists( 'json_last_error' ) && JSON_ERROR_NONE !== json_last_error() ) { - throw ActionScheduler_InvalidActionException::from_decoding_args( $action_id, $args ); - } - } - - /** - * Validate a ActionScheduler_Schedule object. - * - * @param mixed $schedule The unserialized ActionScheduler_Schedule object. - * @param int $action_id The action ID. - * - * @throws ActionScheduler_InvalidActionException When the schedule is invalid. - */ - protected function validate_schedule( $schedule, $action_id ) { - if ( empty( $schedule ) || ! is_a( $schedule, 'ActionScheduler_Schedule' ) ) { - throw ActionScheduler_InvalidActionException::from_schedule( $action_id, $schedule ); - } - } - - /** - * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4. - * - * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However, - * with custom tables, we use an indexed VARCHAR column instead. - * - * @param ActionScheduler_Action $action Action to be validated. - * @throws InvalidArgumentException When json encoded args is too long. - */ - protected function validate_action( ActionScheduler_Action $action ) { - if ( strlen( json_encode( $action->get_args() ) ) > static::$max_args_length ) { - throw new InvalidArgumentException( sprintf( __( 'ActionScheduler_Action::$args too long. To ensure the args column can be indexed, action args should not be more than %d characters when encoded as JSON.', 'action-scheduler' ), static::$max_args_length ) ); - } - } - - /** - * Cancel pending actions by hook. - * - * @since 3.0.0 - * - * @param string $hook Hook name. - * - * @return void - */ - public function cancel_actions_by_hook( $hook ) { - $action_ids = true; - while ( ! empty( $action_ids ) ) { - $action_ids = $this->query_actions( - array( - 'hook' => $hook, - 'status' => self::STATUS_PENDING, - 'per_page' => 1000, - 'orderby' => 'none', - ) - ); - - $this->bulk_cancel_actions( $action_ids ); - } - } - - /** - * Cancel pending actions by group. - * - * @since 3.0.0 - * - * @param string $group Group slug. - * - * @return void - */ - public function cancel_actions_by_group( $group ) { - $action_ids = true; - while ( ! empty( $action_ids ) ) { - $action_ids = $this->query_actions( - array( - 'group' => $group, - 'status' => self::STATUS_PENDING, - 'per_page' => 1000, - 'orderby' => 'none', - ) - ); - - $this->bulk_cancel_actions( $action_ids ); - } - } - - /** - * Cancel a set of action IDs. - * - * @since 3.0.0 - * - * @param array $action_ids List of action IDs. - * - * @return void - */ - private function bulk_cancel_actions( $action_ids ) { - foreach ( $action_ids as $action_id ) { - $this->cancel_action( $action_id ); - } - - do_action( 'action_scheduler_bulk_cancel_actions', $action_ids ); - } - - /** - * @return array - */ - public function get_status_labels() { - return array( - self::STATUS_COMPLETE => __( 'Complete', 'action-scheduler' ), - self::STATUS_PENDING => __( 'Pending', 'action-scheduler' ), - self::STATUS_RUNNING => __( 'In-progress', 'action-scheduler' ), - self::STATUS_FAILED => __( 'Failed', 'action-scheduler' ), - self::STATUS_CANCELED => __( 'Canceled', 'action-scheduler' ), - ); - } - - /** - * Check if there are any pending scheduled actions due to run. - * - * @param ActionScheduler_Action $action - * @param DateTime $scheduled_date (optional) - * @return string - */ - public function has_pending_actions_due() { - $pending_actions = $this->query_actions( array( - 'date' => as_get_datetime_object(), - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'orderby' => 'none', - ) ); - - return ! empty( $pending_actions ); - } - - /** - * Callable initialization function optionally overridden in derived classes. - */ - public function init() {} - - /** - * Callable function to mark an action as migrated optionally overridden in derived classes. - */ - public function mark_migrated( $action_id ) {} - - /** - * @return ActionScheduler_Store - */ - public static function instance() { - if ( empty( self::$store ) ) { - $class = apply_filters( 'action_scheduler_store_class', self::DEFAULT_CLASS ); - self::$store = new $class(); - } - return self::$store; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php b/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php deleted file mode 100644 index fd01449..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php +++ /dev/null @@ -1,152 +0,0 @@ -format( 'U' ) ); - } - - if ( get_option( 'timezone_string' ) ) { - $date->setTimezone( new DateTimeZone( self::get_local_timezone_string() ) ); - } else { - $date->setUtcOffset( self::get_local_timezone_offset() ); - } - - return $date; - } - - /** - * Helper to retrieve the timezone string for a site until a WP core method exists - * (see https://core.trac.wordpress.org/ticket/24730). - * - * Adapted from wc_timezone_string() and https://secure.php.net/manual/en/function.timezone-name-from-abbr.php#89155. - * - * If no timezone string is set, and its not possible to match the UTC offset set for the site to a timezone - * string, then an empty string will be returned, and the UTC offset should be used to set a DateTime's - * timezone. - * - * @since 2.1.0 - * @return string PHP timezone string for the site or empty if no timezone string is available. - */ - protected static function get_local_timezone_string( $reset = false ) { - // If site timezone string exists, return it. - $timezone = get_option( 'timezone_string' ); - if ( $timezone ) { - return $timezone; - } - - // Get UTC offset, if it isn't set then return UTC. - $utc_offset = intval( get_option( 'gmt_offset', 0 ) ); - if ( 0 === $utc_offset ) { - return 'UTC'; - } - - // Adjust UTC offset from hours to seconds. - $utc_offset *= 3600; - - // Attempt to guess the timezone string from the UTC offset. - $timezone = timezone_name_from_abbr( '', $utc_offset ); - if ( $timezone ) { - return $timezone; - } - - // Last try, guess timezone string manually. - foreach ( timezone_abbreviations_list() as $abbr ) { - foreach ( $abbr as $city ) { - if ( (bool) date( 'I' ) === (bool) $city['dst'] && $city['timezone_id'] && intval( $city['offset'] ) === $utc_offset ) { - return $city['timezone_id']; - } - } - } - - // No timezone string - return ''; - } - - /** - * Get timezone offset in seconds. - * - * @since 2.1.0 - * @return float - */ - protected static function get_local_timezone_offset() { - $timezone = get_option( 'timezone_string' ); - - if ( $timezone ) { - $timezone_object = new DateTimeZone( $timezone ); - return $timezone_object->getOffset( new DateTime( 'now' ) ); - } else { - return floatval( get_option( 'gmt_offset', 0 ) ) * HOUR_IN_SECONDS; - } - } - - /** - * @deprecated 2.1.0 - */ - public static function get_local_timezone( $reset = FALSE ) { - _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' ); - if ( $reset ) { - self::$local_timezone = NULL; - } - if ( !isset(self::$local_timezone) ) { - $tzstring = get_option('timezone_string'); - - if ( empty($tzstring) ) { - $gmt_offset = get_option('gmt_offset'); - if ( $gmt_offset == 0 ) { - $tzstring = 'UTC'; - } else { - $gmt_offset *= HOUR_IN_SECONDS; - $tzstring = timezone_name_from_abbr( '', $gmt_offset, 1 ); - - // If there's no timezone string, try again with no DST. - if ( false === $tzstring ) { - $tzstring = timezone_name_from_abbr( '', $gmt_offset, 0 ); - } - - // Try mapping to the first abbreviation we can find. - if ( false === $tzstring ) { - $is_dst = date( 'I' ); - foreach ( timezone_abbreviations_list() as $abbr ) { - foreach ( $abbr as $city ) { - if ( $city['dst'] == $is_dst && $city['offset'] == $gmt_offset ) { - // If there's no valid timezone ID, keep looking. - if ( null === $city['timezone_id'] ) { - continue; - } - - $tzstring = $city['timezone_id']; - break 2; - } - } - } - } - - // If we still have no valid string, then fall back to UTC. - if ( false === $tzstring ) { - $tzstring = 'UTC'; - } - } - } - - self::$local_timezone = new DateTimeZone($tzstring); - } - return self::$local_timezone; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_Action.php b/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_Action.php deleted file mode 100644 index ddf33d5..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_Action.php +++ /dev/null @@ -1,135 +0,0 @@ -set_hook($hook); - $this->set_schedule($schedule); - $this->set_args($args); - $this->set_group($group); - } - - /** - * Executes the action. - * - * If no callbacks are registered, an exception will be thrown and the action will not be - * fired. This is useful to help detect cases where the code responsible for setting up - * a scheduled action no longer exists. - * - * @throws Exception If no callbacks are registered for this action. - */ - public function execute() { - $hook = $this->get_hook(); - - if ( ! has_action( $hook ) ) { - throw new Exception( - sprintf( - /* translators: 1: action hook. */ - __( 'Scheduled action for %1$s will not be executed as no callbacks are registered.', 'action-scheduler' ), - $hook - ) - ); - } - - do_action_ref_array( $hook, array_values( $this->get_args() ) ); - } - - /** - * @param string $hook - */ - protected function set_hook( $hook ) { - $this->hook = $hook; - } - - public function get_hook() { - return $this->hook; - } - - protected function set_schedule( ActionScheduler_Schedule $schedule ) { - $this->schedule = $schedule; - } - - /** - * @return ActionScheduler_Schedule - */ - public function get_schedule() { - return $this->schedule; - } - - protected function set_args( array $args ) { - $this->args = $args; - } - - public function get_args() { - return $this->args; - } - - /** - * @param string $group - */ - protected function set_group( $group ) { - $this->group = $group; - } - - /** - * @return string - */ - public function get_group() { - return $this->group; - } - - /** - * @return bool If the action has been finished - */ - public function is_finished() { - return FALSE; - } - - /** - * Sets the priority of the action. - * - * @param int $priority Priority level (lower is higher priority). Should be in the range 0-255. - * - * @return void - */ - public function set_priority( $priority ) { - if ( $priority < 0 ) { - $priority = 0; - } elseif ( $priority > 255 ) { - $priority = 255; - } - - $this->priority = (int) $priority; - } - - /** - * Gets the action priority. - * - * @return int - */ - public function get_priority() { - return $this->priority; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php b/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php deleted file mode 100644 index 8bbc5d1..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php +++ /dev/null @@ -1,23 +0,0 @@ -set_schedule( new ActionScheduler_NullSchedule() ); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php b/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php deleted file mode 100644 index b23a56c..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php +++ /dev/null @@ -1,16 +0,0 @@ -set_schedule( new ActionScheduler_NullSchedule() ); - } - - public function execute() { - // don't execute - } -} - \ No newline at end of file diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php deleted file mode 100644 index 37bfd0d..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php +++ /dev/null @@ -1,154 +0,0 @@ -format( 'Y-m-d H:i:s' ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - $date_local = $date->format( 'Y-m-d H:i:s' ); - - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $wpdb->insert( - $wpdb->actionscheduler_logs, - array( - 'action_id' => $action_id, - 'message' => $message, - 'log_date_gmt' => $date_gmt, - 'log_date_local' => $date_local, - ), - array( '%d', '%s', '%s', '%s' ) - ); - - return $wpdb->insert_id; - } - - /** - * Retrieve an action log entry. - * - * @param int $entry_id Log entry ID. - * - * @return ActionScheduler_LogEntry - */ - public function get_entry( $entry_id ) { - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $entry = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE log_id=%d", $entry_id ) ); - - return $this->create_entry_from_db_record( $entry ); - } - - /** - * Create an action log entry from a database record. - * - * @param object $record Log entry database record object. - * - * @return ActionScheduler_LogEntry - */ - private function create_entry_from_db_record( $record ) { - if ( empty( $record ) ) { - return new ActionScheduler_NullLogEntry(); - } - - if ( is_null( $record->log_date_gmt ) ) { - $date = as_get_datetime_object( ActionScheduler_StoreSchema::DEFAULT_DATE ); - } else { - $date = as_get_datetime_object( $record->log_date_gmt ); - } - - return new ActionScheduler_LogEntry( $record->action_id, $record->message, $date ); - } - - /** - * Retrieve the an action's log entries from the database. - * - * @param int $action_id Action ID. - * - * @return ActionScheduler_LogEntry[] - */ - public function get_logs( $action_id ) { - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - - $records = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE action_id=%d", $action_id ) ); - - return array_map( array( $this, 'create_entry_from_db_record' ), $records ); - } - - /** - * Initialize the data store. - * - * @codeCoverageIgnore - */ - public function init() { - $table_maker = new ActionScheduler_LoggerSchema(); - $table_maker->init(); - $table_maker->register_tables(); - - parent::init(); - - add_action( 'action_scheduler_deleted_action', array( $this, 'clear_deleted_action_logs' ), 10, 1 ); - } - - /** - * Delete the action logs for an action. - * - * @param int $action_id Action ID. - */ - public function clear_deleted_action_logs( $action_id ) { - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $wpdb->delete( $wpdb->actionscheduler_logs, array( 'action_id' => $action_id ), array( '%d' ) ); - } - - /** - * Bulk add cancel action log entries. - * - * @param array $action_ids List of action ID. - */ - public function bulk_log_cancel_actions( $action_ids ) { - if ( empty( $action_ids ) ) { - return; - } - - /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort - global $wpdb; - $date = as_get_datetime_object(); - $date_gmt = $date->format( 'Y-m-d H:i:s' ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - $date_local = $date->format( 'Y-m-d H:i:s' ); - $message = __( 'action canceled', 'action-scheduler' ); - $format = '(%d, ' . $wpdb->prepare( '%s, %s, %s', $message, $date_gmt, $date_local ) . ')'; - $sql_query = "INSERT {$wpdb->actionscheduler_logs} (action_id, message, log_date_gmt, log_date_local) VALUES "; - $value_rows = array(); - - foreach ( $action_ids as $action_id ) { - $value_rows[] = $wpdb->prepare( $format, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - $sql_query .= implode( ',', $value_rows ); - - $wpdb->query( $sql_query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php deleted file mode 100644 index 602c3dd..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php +++ /dev/null @@ -1,1180 +0,0 @@ - '', - 'hooks' => '', - 'exclude-groups' => '', - ]; - - /** - * Initialize the data store - * - * @codeCoverageIgnore - */ - public function init() { - $table_maker = new ActionScheduler_StoreSchema(); - $table_maker->init(); - $table_maker->register_tables(); - } - - /** - * Save an action, checks if this is a unique action before actually saving. - * - * @param ActionScheduler_Action $action Action object. - * @param \DateTime $scheduled_date Optional schedule date. Default null. - * - * @return int Action ID. - * @throws RuntimeException Throws exception when saving the action fails. - */ - public function save_unique_action( ActionScheduler_Action $action, \DateTime $scheduled_date = null ) { - return $this->save_action_to_db( $action, $scheduled_date, true ); - } - - /** - * Save an action. Can save duplicate action as well, prefer using `save_unique_action` instead. - * - * @param ActionScheduler_Action $action Action object. - * @param \DateTime $scheduled_date Optional schedule date. Default null. - * - * @return int Action ID. - * @throws RuntimeException Throws exception when saving the action fails. - */ - public function save_action( ActionScheduler_Action $action, \DateTime $scheduled_date = null ) { - return $this->save_action_to_db( $action, $scheduled_date, false ); - } - - /** - * Save an action. - * - * @param ActionScheduler_Action $action Action object. - * @param ?DateTime $date Optional schedule date. Default null. - * @param bool $unique Whether the action should be unique. - * - * @return int Action ID. - * @throws RuntimeException Throws exception when saving the action fails. - */ - private function save_action_to_db( ActionScheduler_Action $action, DateTime $date = null, $unique = false ) { - global $wpdb; - - try { - $this->validate_action( $action ); - - $data = array( - 'hook' => $action->get_hook(), - 'status' => ( $action->is_finished() ? self::STATUS_COMPLETE : self::STATUS_PENDING ), - 'scheduled_date_gmt' => $this->get_scheduled_date_string( $action, $date ), - 'scheduled_date_local' => $this->get_scheduled_date_string_local( $action, $date ), - 'schedule' => serialize( $action->get_schedule() ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize - 'group_id' => current( $this->get_group_ids( $action->get_group() ) ), - 'priority' => $action->get_priority(), - ); - - $args = wp_json_encode( $action->get_args() ); - if ( strlen( $args ) <= static::$max_index_length ) { - $data['args'] = $args; - } else { - $data['args'] = $this->hash_args( $args ); - $data['extended_args'] = $args; - } - - $insert_sql = $this->build_insert_sql( $data, $unique ); - - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- $insert_sql should be already prepared. - $wpdb->query( $insert_sql ); - $action_id = $wpdb->insert_id; - - if ( is_wp_error( $action_id ) ) { - throw new \RuntimeException( $action_id->get_error_message() ); - } elseif ( empty( $action_id ) ) { - if ( $unique ) { - return 0; - } - throw new \RuntimeException( $wpdb->last_error ? $wpdb->last_error : __( 'Database error.', 'action-scheduler' ) ); - } - - do_action( 'action_scheduler_stored_action', $action_id ); - - return $action_id; - } catch ( \Exception $e ) { - /* translators: %s: error message */ - throw new \RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); - } - } - - /** - * Helper function to build insert query. - * - * @param array $data Row data for action. - * @param bool $unique Whether the action should be unique. - * - * @return string Insert query. - */ - private function build_insert_sql( array $data, $unique ) { - global $wpdb; - $columns = array_keys( $data ); - $values = array_values( $data ); - $placeholders = array_map( array( $this, 'get_placeholder_for_column' ), $columns ); - - $table_name = ! empty( $wpdb->actionscheduler_actions ) ? $wpdb->actionscheduler_actions : $wpdb->prefix . 'actionscheduler_actions'; - - $column_sql = '`' . implode( '`, `', $columns ) . '`'; - $placeholder_sql = implode( ', ', $placeholders ); - $where_clause = $this->build_where_clause_for_insert( $data, $table_name, $unique ); - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $column_sql and $where_clause are already prepared. $placeholder_sql is hardcoded. - $insert_query = $wpdb->prepare( - " -INSERT INTO $table_name ( $column_sql ) -SELECT $placeholder_sql FROM DUAL -WHERE ( $where_clause ) IS NULL", - $values - ); - // phpcs:enable - - return $insert_query; - } - - /** - * Helper method to build where clause for action insert statement. - * - * @param array $data Row data for action. - * @param string $table_name Action table name. - * @param bool $unique Where action should be unique. - * - * @return string Where clause to be used with insert. - */ - private function build_where_clause_for_insert( $data, $table_name, $unique ) { - global $wpdb; - - if ( ! $unique ) { - return 'SELECT NULL FROM DUAL'; - } - - $pending_statuses = array( - ActionScheduler_Store::STATUS_PENDING, - ActionScheduler_Store::STATUS_RUNNING, - ); - $pending_status_placeholders = implode( ', ', array_fill( 0, count( $pending_statuses ), '%s' ) ); - - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $pending_status_placeholders is hardcoded. - $where_clause = $wpdb->prepare( - " -SELECT action_id FROM $table_name -WHERE status IN ( $pending_status_placeholders ) -AND hook = %s -AND `group_id` = %d -", - array_merge( - $pending_statuses, - array( - $data['hook'], - $data['group_id'], - ) - ) - ); - // phpcs:enable - - return "$where_clause" . ' LIMIT 1'; - } - - /** - * Helper method to get $wpdb->prepare placeholder for a given column name. - * - * @param string $column_name Name of column in actions table. - * - * @return string Placeholder to use for given column. - */ - private function get_placeholder_for_column( $column_name ) { - $string_columns = array( - 'hook', - 'status', - 'scheduled_date_gmt', - 'scheduled_date_local', - 'args', - 'schedule', - 'last_attempt_gmt', - 'last_attempt_local', - 'extended_args', - ); - - return in_array( $column_name, $string_columns ) ? '%s' : '%d'; - } - - /** - * Generate a hash from json_encoded $args using MD5 as this isn't for security. - * - * @param string $args JSON encoded action args. - * @return string - */ - protected function hash_args( $args ) { - return md5( $args ); - } - - /** - * Get action args query param value from action args. - * - * @param array $args Action args. - * @return string - */ - protected function get_args_for_query( $args ) { - $encoded = wp_json_encode( $args ); - if ( strlen( $encoded ) <= static::$max_index_length ) { - return $encoded; - } - return $this->hash_args( $encoded ); - } - /** - * Get a group's ID based on its name/slug. - * - * @param string|array $slugs The string name of a group, or names for several groups. - * @param bool $create_if_not_exists Whether to create the group if it does not already exist. Default, true - create the group. - * - * @return array The group IDs, if they exist or were successfully created. May be empty. - */ - protected function get_group_ids( $slugs, $create_if_not_exists = true ) { - $slugs = (array) $slugs; - $group_ids = array(); - - if ( empty( $slugs ) ) { - return array(); - } - - /** @var \wpdb $wpdb */ - global $wpdb; - - foreach ( $slugs as $slug ) { - $group_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT group_id FROM {$wpdb->actionscheduler_groups} WHERE slug=%s", $slug ) ); - - if ( empty( $group_id ) && $create_if_not_exists ) { - $group_id = $this->create_group( $slug ); - } - - if ( $group_id ) { - $group_ids[] = $group_id; - } - } - - return $group_ids; - } - - /** - * Create an action group. - * - * @param string $slug Group slug. - * - * @return int Group ID. - */ - protected function create_group( $slug ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $wpdb->insert( $wpdb->actionscheduler_groups, array( 'slug' => $slug ) ); - - return (int) $wpdb->insert_id; - } - - /** - * Retrieve an action. - * - * @param int $action_id Action ID. - * - * @return ActionScheduler_Action - */ - public function fetch_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $data = $wpdb->get_row( - $wpdb->prepare( - "SELECT a.*, g.slug AS `group` FROM {$wpdb->actionscheduler_actions} a LEFT JOIN {$wpdb->actionscheduler_groups} g ON a.group_id=g.group_id WHERE a.action_id=%d", - $action_id - ) - ); - - if ( empty( $data ) ) { - return $this->get_null_action(); - } - - if ( ! empty( $data->extended_args ) ) { - $data->args = $data->extended_args; - unset( $data->extended_args ); - } - - // Convert NULL dates to zero dates. - $date_fields = array( - 'scheduled_date_gmt', - 'scheduled_date_local', - 'last_attempt_gmt', - 'last_attempt_gmt', - ); - foreach ( $date_fields as $date_field ) { - if ( is_null( $data->$date_field ) ) { - $data->$date_field = ActionScheduler_StoreSchema::DEFAULT_DATE; - } - } - - try { - $action = $this->make_action_from_db_record( $data ); - } catch ( ActionScheduler_InvalidActionException $exception ) { - do_action( 'action_scheduler_failed_fetch_action', $action_id, $exception ); - return $this->get_null_action(); - } - - return $action; - } - - /** - * Create a null action. - * - * @return ActionScheduler_NullAction - */ - protected function get_null_action() { - return new ActionScheduler_NullAction(); - } - - /** - * Create an action from a database record. - * - * @param object $data Action database record. - * - * @return ActionScheduler_Action|ActionScheduler_CanceledAction|ActionScheduler_FinishedAction - */ - protected function make_action_from_db_record( $data ) { - - $hook = $data->hook; - $args = json_decode( $data->args, true ); - $schedule = unserialize( $data->schedule ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize - - $this->validate_args( $args, $data->action_id ); - $this->validate_schedule( $schedule, $data->action_id ); - - if ( empty( $schedule ) ) { - $schedule = new ActionScheduler_NullSchedule(); - } - $group = $data->group ? $data->group : ''; - - return ActionScheduler::factory()->get_stored_action( $data->status, $data->hook, $args, $schedule, $group, $data->priority ); - } - - /** - * Returns the SQL statement to query (or count) actions. - * - * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. - * - * @param array $query Filtering options. - * @param string $select_or_count Whether the SQL should select and return the IDs or just the row count. - * - * @return string SQL statement already properly escaped. - * @throws InvalidArgumentException If the query is invalid. - */ - protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { - - if ( ! in_array( $select_or_count, array( 'select', 'count' ), true ) ) { - throw new InvalidArgumentException( __( 'Invalid value for select or count parameter. Cannot query actions.', 'action-scheduler' ) ); - } - - $query = wp_parse_args( $query, array( - 'hook' => '', - 'args' => null, - 'partial_args_matching' => 'off', // can be 'like' or 'json' - 'date' => null, - 'date_compare' => '<=', - 'modified' => null, - 'modified_compare' => '<=', - 'group' => '', - 'status' => '', - 'claimed' => null, - 'per_page' => 5, - 'offset' => 0, - 'orderby' => 'date', - 'order' => 'ASC', - ) ); - - /** @var \wpdb $wpdb */ - global $wpdb; - - $db_server_info = is_callable( array( $wpdb, 'db_server_info' ) ) ? $wpdb->db_server_info() : $wpdb->db_version(); - if ( false !== strpos( $db_server_info, 'MariaDB' ) ) { - $supports_json = version_compare( - PHP_VERSION_ID >= 80016 ? $wpdb->db_version() : preg_replace( '/[^0-9.].*/', '', str_replace( '5.5.5-', '', $db_server_info ) ), - '10.2', - '>=' - ); - } else { - $supports_json = version_compare( $wpdb->db_version(), '5.7', '>=' ); - } - - $sql = ( 'count' === $select_or_count ) ? 'SELECT count(a.action_id)' : 'SELECT a.action_id'; - $sql .= " FROM {$wpdb->actionscheduler_actions} a"; - $sql_params = array(); - - if ( ! empty( $query['group'] ) || 'group' === $query['orderby'] ) { - $sql .= " LEFT JOIN {$wpdb->actionscheduler_groups} g ON g.group_id=a.group_id"; - } - - $sql .= " WHERE 1=1"; - - if ( ! empty( $query['group'] ) ) { - $sql .= " AND g.slug=%s"; - $sql_params[] = $query['group']; - } - - if ( ! empty( $query['hook'] ) ) { - $sql .= " AND a.hook=%s"; - $sql_params[] = $query['hook']; - } - - if ( ! is_null( $query['args'] ) ) { - switch ( $query['partial_args_matching'] ) { - case 'json': - if ( ! $supports_json ) { - throw new \RuntimeException( __( 'JSON partial matching not supported in your environment. Please check your MySQL/MariaDB version.', 'action-scheduler' ) ); - } - $supported_types = array( - 'integer' => '%d', - 'boolean' => '%s', - 'double' => '%f', - 'string' => '%s', - ); - foreach ( $query['args'] as $key => $value ) { - $value_type = gettype( $value ); - if ( 'boolean' === $value_type ) { - $value = $value ? 'true' : 'false'; - } - $placeholder = isset( $supported_types[ $value_type ] ) ? $supported_types[ $value_type ] : false; - if ( ! $placeholder ) { - throw new \RuntimeException( sprintf( - /* translators: %s: provided value type */ - __( 'The value type for the JSON partial matching is not supported. Must be either integer, boolean, double or string. %s type provided.', 'action-scheduler' ), - $value_type - ) ); - } - $sql .= ' AND JSON_EXTRACT(a.args, %s)='.$placeholder; - $sql_params[] = '$.'.$key; - $sql_params[] = $value; - } - break; - case 'like': - foreach ( $query['args'] as $key => $value ) { - $sql .= ' AND a.args LIKE %s'; - $json_partial = $wpdb->esc_like( trim( json_encode( array( $key => $value ) ), '{}' ) ); - $sql_params[] = "%{$json_partial}%"; - } - break; - case 'off': - $sql .= " AND a.args=%s"; - $sql_params[] = $this->get_args_for_query( $query['args'] ); - break; - default: - throw new \RuntimeException( __( 'Unknown partial args matching value.', 'action-scheduler' ) ); - } - } - - if ( $query['status'] ) { - $statuses = (array) $query['status']; - $placeholders = array_fill( 0, count( $statuses ), '%s' ); - $sql .= ' AND a.status IN (' . join( ', ', $placeholders ) . ')'; - $sql_params = array_merge( $sql_params, array_values( $statuses ) ); - } - - if ( $query['date'] instanceof \DateTime ) { - $date = clone $query['date']; - $date->setTimezone( new \DateTimeZone( 'UTC' ) ); - $date_string = $date->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['date_compare'] ); - $sql .= " AND a.scheduled_date_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( $query['modified'] instanceof \DateTime ) { - $modified = clone $query['modified']; - $modified->setTimezone( new \DateTimeZone( 'UTC' ) ); - $date_string = $modified->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['modified_compare'] ); - $sql .= " AND a.last_attempt_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( true === $query['claimed'] ) { - $sql .= ' AND a.claim_id != 0'; - } elseif ( false === $query['claimed'] ) { - $sql .= ' AND a.claim_id = 0'; - } elseif ( ! is_null( $query['claimed'] ) ) { - $sql .= ' AND a.claim_id = %d'; - $sql_params[] = $query['claimed']; - } - - if ( ! empty( $query['search'] ) ) { - $sql .= ' AND (a.hook LIKE %s OR (a.extended_args IS NULL AND a.args LIKE %s) OR a.extended_args LIKE %s'; - for ( $i = 0; $i < 3; $i++ ) { - $sql_params[] = sprintf( '%%%s%%', $query['search'] ); - } - - $search_claim_id = (int) $query['search']; - if ( $search_claim_id ) { - $sql .= ' OR a.claim_id = %d'; - $sql_params[] = $search_claim_id; - } - - $sql .= ')'; - } - - if ( 'select' === $select_or_count ) { - if ( 'ASC' === strtoupper( $query['order'] ) ) { - $order = 'ASC'; - } else { - $order = 'DESC'; - } - switch ( $query['orderby'] ) { - case 'hook': - $sql .= " ORDER BY a.hook $order"; - break; - case 'group': - $sql .= " ORDER BY g.slug $order"; - break; - case 'modified': - $sql .= " ORDER BY a.last_attempt_gmt $order"; - break; - case 'none': - break; - case 'action_id': - $sql .= " ORDER BY a.action_id $order"; - break; - case 'date': - default: - $sql .= " ORDER BY a.scheduled_date_gmt $order"; - break; - } - - if ( $query['per_page'] > 0 ) { - $sql .= ' LIMIT %d, %d'; - $sql_params[] = $query['offset']; - $sql_params[] = $query['per_page']; - } - } - - if ( ! empty( $sql_params ) ) { - $sql = $wpdb->prepare( $sql, $sql_params ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - return $sql; - } - - /** - * Query for action count or list of action IDs. - * - * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. - * - * @see ActionScheduler_Store::query_actions for $query arg usage. - * - * @param array $query Query filtering options. - * @param string $query_type Whether to select or count the results. Defaults to select. - * - * @return string|array|null The IDs of actions matching the query. Null on failure. - */ - public function query_actions( $query = array(), $query_type = 'select' ) { - /** @var wpdb $wpdb */ - global $wpdb; - - $sql = $this->get_query_actions_sql( $query, $query_type ); - - return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoSql, WordPress.DB.DirectDatabaseQuery.NoCaching - } - - /** - * Get a count of all actions in the store, grouped by status. - * - * @return array Set of 'status' => int $count pairs for statuses with 1 or more actions of that status. - */ - public function action_counts() { - global $wpdb; - - $sql = "SELECT a.status, count(a.status) as 'count'"; - $sql .= " FROM {$wpdb->actionscheduler_actions} a"; - $sql .= ' GROUP BY a.status'; - - $actions_count_by_status = array(); - $action_stati_and_labels = $this->get_status_labels(); - - foreach ( $wpdb->get_results( $sql ) as $action_data ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - // Ignore any actions with invalid status. - if ( array_key_exists( $action_data->status, $action_stati_and_labels ) ) { - $actions_count_by_status[ $action_data->status ] = $action_data->count; - } - } - - return $actions_count_by_status; - } - - /** - * Cancel an action. - * - * @param int $action_id Action ID. - * - * @return void - * @throws \InvalidArgumentException If the action update failed. - */ - public function cancel_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $updated = $wpdb->update( - $wpdb->actionscheduler_actions, - array( 'status' => self::STATUS_CANCELED ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - if ( false === $updated ) { - /* translators: %s: action ID */ - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - do_action( 'action_scheduler_canceled_action', $action_id ); - } - - /** - * Cancel pending actions by hook. - * - * @since 3.0.0 - * - * @param string $hook Hook name. - * - * @return void - */ - public function cancel_actions_by_hook( $hook ) { - $this->bulk_cancel_actions( array( 'hook' => $hook ) ); - } - - /** - * Cancel pending actions by group. - * - * @param string $group Group slug. - * - * @return void - */ - public function cancel_actions_by_group( $group ) { - $this->bulk_cancel_actions( array( 'group' => $group ) ); - } - - /** - * Bulk cancel actions. - * - * @since 3.0.0 - * - * @param array $query_args Query parameters. - */ - protected function bulk_cancel_actions( $query_args ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - if ( ! is_array( $query_args ) ) { - return; - } - - // Don't cancel actions that are already canceled. - if ( isset( $query_args['status'] ) && self::STATUS_CANCELED === $query_args['status'] ) { - return; - } - - $action_ids = true; - $query_args = wp_parse_args( - $query_args, - array( - 'per_page' => 1000, - 'status' => self::STATUS_PENDING, - 'orderby' => 'none', - ) - ); - - while ( $action_ids ) { - $action_ids = $this->query_actions( $query_args ); - if ( empty( $action_ids ) ) { - break; - } - - $format = array_fill( 0, count( $action_ids ), '%d' ); - $query_in = '(' . implode( ',', $format ) . ')'; - $parameters = $action_ids; - array_unshift( $parameters, self::STATUS_CANCELED ); - - $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->actionscheduler_actions} SET status = %s WHERE action_id IN {$query_in}", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared - $parameters - ) - ); - - do_action( 'action_scheduler_bulk_cancel_actions', $action_ids ); - } - } - - /** - * Delete an action. - * - * @param int $action_id Action ID. - * @throws \InvalidArgumentException If the action deletion failed. - */ - public function delete_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $deleted = $wpdb->delete( $wpdb->actionscheduler_actions, array( 'action_id' => $action_id ), array( '%d' ) ); - if ( empty( $deleted ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - do_action( 'action_scheduler_deleted_action', $action_id ); - } - - /** - * Get the schedule date for an action. - * - * @param string $action_id Action ID. - * - * @return \DateTime The local date the action is scheduled to run, or the date that it ran. - */ - public function get_date( $action_id ) { - $date = $this->get_date_gmt( $action_id ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - return $date; - } - - /** - * Get the GMT schedule date for an action. - * - * @param int $action_id Action ID. - * - * @throws \InvalidArgumentException If action cannot be identified. - * @return \DateTime The GMT date the action is scheduled to run, or the date that it ran. - */ - protected function get_date_gmt( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $record = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d", $action_id ) ); - if ( empty( $record ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - if ( self::STATUS_PENDING === $record->status ) { - return as_get_datetime_object( $record->scheduled_date_gmt ); - } else { - return as_get_datetime_object( $record->last_attempt_gmt ); - } - } - - /** - * Stake a claim on actions. - * - * @param int $max_actions Maximum number of action to include in claim. - * @param \DateTime $before_date Jobs must be schedule before this date. Defaults to now. - * @param array $hooks Hooks to filter for. - * @param string $group Group to filter for. - * - * @return ActionScheduler_ActionClaim - */ - public function stake_claim( $max_actions = 10, \DateTime $before_date = null, $hooks = array(), $group = '' ) { - $claim_id = $this->generate_claim_id(); - - $this->claim_before_date = $before_date; - $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); - $action_ids = $this->find_actions_by_claim_id( $claim_id ); - $this->claim_before_date = null; - - return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); - } - - /** - * Generate a new action claim. - * - * @return int Claim ID. - */ - protected function generate_claim_id() { - /** @var \wpdb $wpdb */ - global $wpdb; - $now = as_get_datetime_object(); - $wpdb->insert( $wpdb->actionscheduler_claims, array( 'date_created_gmt' => $now->format( 'Y-m-d H:i:s' ) ) ); - - return $wpdb->insert_id; - } - - /** - * Set a claim filter. - * - * @param string $filter_name Claim filter name. - * @param mixed $filter_values Values to filter. - * @return void - */ - public function set_claim_filter( $filter_name, $filter_values ) { - if ( isset( $this->claim_filters[ $filter_name ] ) ) { - $this->claim_filters[ $filter_name ] = $filter_values; - } - } - - /** - * Get the claim filter value. - * - * @param string $filter_name Claim filter name. - * @return mixed - */ - public function get_claim_filter( $filter_name ) { - if ( isset( $this->claim_filters[ $filter_name ] ) ) { - return $this->claim_filters[ $filter_name ]; - } - - return ''; - } - - /** - * Mark actions claimed. - * - * @param string $claim_id Claim Id. - * @param int $limit Number of action to include in claim. - * @param \DateTime $before_date Should use UTC timezone. - * @param array $hooks Hooks to filter for. - * @param string $group Group to filter for. - * - * @return int The number of actions that were claimed. - * @throws \InvalidArgumentException Throws InvalidArgumentException if group doesn't exist. - * @throws \RuntimeException Throws RuntimeException if unable to claim action. - */ - protected function claim_actions( $claim_id, $limit, \DateTime $before_date = null, $hooks = array(), $group = '' ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $now = as_get_datetime_object(); - $date = is_null( $before_date ) ? $now : clone $before_date; - // can't use $wpdb->update() because of the <= condition. - $update = "UPDATE {$wpdb->actionscheduler_actions} SET claim_id=%d, last_attempt_gmt=%s, last_attempt_local=%s"; - $params = array( - $claim_id, - $now->format( 'Y-m-d H:i:s' ), - current_time( 'mysql' ), - ); - - // Set claim filters. - if ( ! empty( $hooks ) ) { - $this->set_claim_filter( 'hooks', $hooks ); - } else { - $hooks = $this->get_claim_filter( 'hooks' ); - } - if ( ! empty( $group ) ) { - $this->set_claim_filter( 'group', $group ); - } else { - $group = $this->get_claim_filter( 'group' ); - } - - $where = 'WHERE claim_id = 0 AND scheduled_date_gmt <= %s AND status=%s'; - $params[] = $date->format( 'Y-m-d H:i:s' ); - $params[] = self::STATUS_PENDING; - - if ( ! empty( $hooks ) ) { - $placeholders = array_fill( 0, count( $hooks ), '%s' ); - $where .= ' AND hook IN (' . join( ', ', $placeholders ) . ')'; - $params = array_merge( $params, array_values( $hooks ) ); - } - - $group_operator = 'IN'; - if ( empty( $group ) ) { - $group = $this->get_claim_filter( 'exclude-groups' ); - $group_operator = 'NOT IN'; - } - - if ( ! empty( $group ) ) { - $group_ids = $this->get_group_ids( $group, false ); - - // throw exception if no matching group(s) found, this matches ActionScheduler_wpPostStore's behaviour. - if ( empty( $group_ids ) ) { - throw new InvalidArgumentException( - sprintf( - /* translators: %s: group name(s) */ - _n( - 'The group "%s" does not exist.', - 'The groups "%s" do not exist.', - is_array( $group ) ? count( $group ) : 1, - 'action-scheduler' - ), - $group - ) - ); - } - - $id_list = implode( ',', array_map( 'intval', $group_ids ) ); - $where .= " AND group_id {$group_operator} ( $id_list )"; - } - - /** - * Sets the order-by clause used in the action claim query. - * - * @since 3.4.0 - * - * @param string $order_by_sql - */ - $order = apply_filters( 'action_scheduler_claim_actions_order_by', 'ORDER BY priority ASC, attempts ASC, scheduled_date_gmt ASC, action_id ASC' ); - $params[] = $limit; - - $sql = $wpdb->prepare( "{$update} {$where} {$order} LIMIT %d", $params ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders - $rows_affected = $wpdb->query( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - if ( false === $rows_affected ) { - $error = empty( $wpdb->last_error ) - ? _x( 'unknown', 'database error', 'action-scheduler' ) - : $wpdb->last_error; - - throw new \RuntimeException( - sprintf( - /* translators: %s database error. */ - __( 'Unable to claim actions. Database error: %s.', 'action-scheduler' ), - $error - ) - ); - } - - return (int) $rows_affected; - } - - /** - * Get the number of active claims. - * - * @return int - */ - public function get_claim_count() { - global $wpdb; - - $sql = "SELECT COUNT(DISTINCT claim_id) FROM {$wpdb->actionscheduler_actions} WHERE claim_id != 0 AND status IN ( %s, %s)"; - $sql = $wpdb->prepare( $sql, array( self::STATUS_PENDING, self::STATUS_RUNNING ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Return an action's claim ID, as stored in the claim_id column. - * - * @param string $action_id Action ID. - * @return mixed - */ - public function get_claim_id( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $sql = "SELECT claim_id FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d"; - $sql = $wpdb->prepare( $sql, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Retrieve the action IDs of action in a claim. - * - * @param int $claim_id Claim ID. - * @return int[] - */ - public function find_actions_by_claim_id( $claim_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $action_ids = array(); - $before_date = isset( $this->claim_before_date ) ? $this->claim_before_date : as_get_datetime_object(); - $cut_off = $before_date->format( 'Y-m-d H:i:s' ); - - $sql = $wpdb->prepare( - "SELECT action_id, scheduled_date_gmt FROM {$wpdb->actionscheduler_actions} WHERE claim_id = %d ORDER BY priority ASC, attempts ASC, scheduled_date_gmt ASC, action_id ASC", - $claim_id - ); - - // Verify that the scheduled date for each action is within the expected bounds (in some unusual - // cases, we cannot depend on MySQL to honor all of the WHERE conditions we specify). - foreach ( $wpdb->get_results( $sql ) as $claimed_action ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - if ( $claimed_action->scheduled_date_gmt <= $cut_off ) { - $action_ids[] = absint( $claimed_action->action_id ); - } - } - - return $action_ids; - } - - /** - * Release actions from a claim and delete the claim. - * - * @param ActionScheduler_ActionClaim $claim Claim object. - */ - public function release_claim( ActionScheduler_ActionClaim $claim ) { - /** @var \wpdb $wpdb */ - global $wpdb; - /** - * Deadlock warning: This function modifies actions to release them from claims that have been processed. Earlier, we used to it in a atomic query, i.e. we would update all actions belonging to a particular claim_id with claim_id = 0. - * While this was functionally correct, it would cause deadlock, since this update query will hold a lock on the claim_id_.. index on the action table. - * This allowed the possibility of a race condition, where the claimer query is also running at the same time, then the claimer query will also try to acquire a lock on the claim_id_.. index, and in this case if claim release query has already progressed to the point of acquiring the lock, but have not updated yet, it would cause a deadlock. - * - * We resolve this by getting all the actions_id that we want to release claim from in a separate query, and then releasing the claim on each of them. This way, our lock is acquired on the action_id index instead of the claim_id index. Note that the lock on claim_id will still be acquired, but it will only when we actually make the update, rather than when we select the actions. - */ - $action_ids = $wpdb->get_col( $wpdb->prepare( "SELECT action_id FROM {$wpdb->actionscheduler_actions} WHERE claim_id = %d", $claim->get_id() ) ); - - $row_updates = 0; - if ( count( $action_ids ) > 0 ) { - $action_id_string = implode( ',', array_map( 'absint', $action_ids ) ); - $row_updates = $wpdb->query( "UPDATE {$wpdb->actionscheduler_actions} SET claim_id = 0 WHERE action_id IN ({$action_id_string})" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - $wpdb->delete( $wpdb->actionscheduler_claims, array( 'claim_id' => $claim->get_id() ), array( '%d' ) ); - - if ( $row_updates < count( $action_ids ) ) { - throw new RuntimeException( - sprintf( - __( 'Unable to release actions from claim id %d.', 'action-scheduler' ), - $claim->get_id() - ) - ); - } - } - - /** - * Remove the claim from an action. - * - * @param int $action_id Action ID. - * - * @return void - */ - public function unclaim_action( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $wpdb->update( - $wpdb->actionscheduler_actions, - array( 'claim_id' => 0 ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - } - - /** - * Mark an action as failed. - * - * @param int $action_id Action ID. - * @throws \InvalidArgumentException Throw an exception if action was not updated. - */ - public function mark_failure( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $updated = $wpdb->update( - $wpdb->actionscheduler_actions, - array( 'status' => self::STATUS_FAILED ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - if ( empty( $updated ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - } - - /** - * Add execution message to action log. - * - * @throws Exception If the action status cannot be updated to self::STATUS_RUNNING ('in-progress'). - * - * @param int $action_id Action ID. - * - * @return void - */ - public function log_execution( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - - $sql = "UPDATE {$wpdb->actionscheduler_actions} SET attempts = attempts+1, status=%s, last_attempt_gmt = %s, last_attempt_local = %s WHERE action_id = %d"; - $sql = $wpdb->prepare( $sql, self::STATUS_RUNNING, current_time( 'mysql', true ), current_time( 'mysql' ), $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - $status_updated = $wpdb->query( $sql ); - - if ( ! $status_updated ) { - throw new Exception( - sprintf( - /* translators: 1: action ID. 2: status slug. */ - __( 'Unable to update the status of action %1$d to %2$s.', 'action-scheduler' ), - $action_id, - self::STATUS_RUNNING - ) - ); - } - } - - /** - * Mark an action as complete. - * - * @param int $action_id Action ID. - * - * @return void - * @throws \InvalidArgumentException Throw an exception if action was not updated. - */ - public function mark_complete( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $updated = $wpdb->update( - $wpdb->actionscheduler_actions, - array( - 'status' => self::STATUS_COMPLETE, - 'last_attempt_gmt' => current_time( 'mysql', true ), - 'last_attempt_local' => current_time( 'mysql' ), - ), - array( 'action_id' => $action_id ), - array( '%s' ), - array( '%d' ) - ); - if ( empty( $updated ) ) { - throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment - } - - /** - * Fires after a scheduled action has been completed. - * - * @since 3.4.2 - * - * @param int $action_id Action ID. - */ - do_action( 'action_scheduler_completed_action', $action_id ); - } - - /** - * Get an action's status. - * - * @param int $action_id Action ID. - * - * @return string - * @throws \InvalidArgumentException Throw an exception if not status was found for action_id. - * @throws \RuntimeException Throw an exception if action status could not be retrieved. - */ - public function get_status( $action_id ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $sql = "SELECT status FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d"; - $sql = $wpdb->prepare( $sql, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - $status = $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - if ( null === $status ) { - throw new \InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) ); - } elseif ( empty( $status ) ) { - throw new \RuntimeException( __( 'Unknown status found for action.', 'action-scheduler' ) ); - } else { - return $status; - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php deleted file mode 100644 index 22d61a6..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php +++ /dev/null @@ -1,426 +0,0 @@ -demarkation_id = (int) get_option( self::DEMARKATION_OPTION, 0 ); - if ( empty( $config ) ) { - $config = Controller::instance()->get_migration_config_object(); - } - $this->primary_store = $config->get_destination_store(); - $this->secondary_store = $config->get_source_store(); - $this->migration_runner = new Runner( $config ); - } - - /** - * Initialize the table data store tables. - * - * @codeCoverageIgnore - */ - public function init() { - add_action( 'action_scheduler/created_table', [ $this, 'set_autoincrement' ], 10, 2 ); - $this->primary_store->init(); - $this->secondary_store->init(); - remove_action( 'action_scheduler/created_table', [ $this, 'set_autoincrement' ], 10 ); - } - - /** - * When the actions table is created, set its autoincrement - * value to be one higher than the posts table to ensure that - * there are no ID collisions. - * - * @param string $table_name - * @param string $table_suffix - * - * @return void - * @codeCoverageIgnore - */ - public function set_autoincrement( $table_name, $table_suffix ) { - if ( ActionScheduler_StoreSchema::ACTIONS_TABLE === $table_suffix ) { - if ( empty( $this->demarkation_id ) ) { - $this->demarkation_id = $this->set_demarkation_id(); - } - /** @var \wpdb $wpdb */ - global $wpdb; - /** - * A default date of '0000-00-00 00:00:00' is invalid in MySQL 5.7 when configured with - * sql_mode including both STRICT_TRANS_TABLES and NO_ZERO_DATE. - */ - $default_date = new DateTime( 'tomorrow' ); - $null_action = new ActionScheduler_NullAction(); - $date_gmt = $this->get_scheduled_date_string( $null_action, $default_date ); - $date_local = $this->get_scheduled_date_string_local( $null_action, $default_date ); - - $row_count = $wpdb->insert( - $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, - [ - 'action_id' => $this->demarkation_id, - 'hook' => '', - 'status' => '', - 'scheduled_date_gmt' => $date_gmt, - 'scheduled_date_local' => $date_local, - 'last_attempt_gmt' => $date_gmt, - 'last_attempt_local' => $date_local, - ] - ); - if ( $row_count > 0 ) { - $wpdb->delete( - $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, - [ 'action_id' => $this->demarkation_id ] - ); - } - } - } - - /** - * Store the demarkation id in WP options. - * - * @param int $id The ID to set as the demarkation point between the two stores - * Leave null to use the next ID from the WP posts table. - * - * @return int The new ID. - * - * @codeCoverageIgnore - */ - private function set_demarkation_id( $id = null ) { - if ( empty( $id ) ) { - /** @var \wpdb $wpdb */ - global $wpdb; - $id = (int) $wpdb->get_var( "SELECT MAX(ID) FROM $wpdb->posts" ); - $id ++; - } - update_option( self::DEMARKATION_OPTION, $id ); - - return $id; - } - - /** - * Find the first matching action from the secondary store. - * If it exists, migrate it to the primary store immediately. - * After it migrates, the secondary store will logically contain - * the next matching action, so return the result thence. - * - * @param string $hook - * @param array $params - * - * @return string - */ - public function find_action( $hook, $params = [] ) { - $found_unmigrated_action = $this->secondary_store->find_action( $hook, $params ); - if ( ! empty( $found_unmigrated_action ) ) { - $this->migrate( [ $found_unmigrated_action ] ); - } - - return $this->primary_store->find_action( $hook, $params ); - } - - /** - * Find actions matching the query in the secondary source first. - * If any are found, migrate them immediately. Then the secondary - * store will contain the canonical results. - * - * @param array $query - * @param string $query_type Whether to select or count the results. Default, select. - * - * @return int[] - */ - public function query_actions( $query = [], $query_type = 'select' ) { - $found_unmigrated_actions = $this->secondary_store->query_actions( $query, 'select' ); - if ( ! empty( $found_unmigrated_actions ) ) { - $this->migrate( $found_unmigrated_actions ); - } - - return $this->primary_store->query_actions( $query, $query_type ); - } - - /** - * Get a count of all actions in the store, grouped by status - * - * @return array Set of 'status' => int $count pairs for statuses with 1 or more actions of that status. - */ - public function action_counts() { - $unmigrated_actions_count = $this->secondary_store->action_counts(); - $migrated_actions_count = $this->primary_store->action_counts(); - $actions_count_by_status = array(); - - foreach ( $this->get_status_labels() as $status_key => $status_label ) { - - $count = 0; - - if ( isset( $unmigrated_actions_count[ $status_key ] ) ) { - $count += $unmigrated_actions_count[ $status_key ]; - } - - if ( isset( $migrated_actions_count[ $status_key ] ) ) { - $count += $migrated_actions_count[ $status_key ]; - } - - $actions_count_by_status[ $status_key ] = $count; - } - - $actions_count_by_status = array_filter( $actions_count_by_status ); - - return $actions_count_by_status; - } - - /** - * If any actions would have been claimed by the secondary store, - * migrate them immediately, then ask the primary store for the - * canonical claim. - * - * @param int $max_actions - * @param DateTime|null $before_date - * - * @return ActionScheduler_ActionClaim - */ - public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { - $claim = $this->secondary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); - - $claimed_actions = $claim->get_actions(); - if ( ! empty( $claimed_actions ) ) { - $this->migrate( $claimed_actions ); - } - - $this->secondary_store->release_claim( $claim ); - - return $this->primary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); - } - - /** - * Migrate a list of actions to the table data store. - * - * @param array $action_ids List of action IDs. - */ - private function migrate( $action_ids ) { - $this->migration_runner->migrate_actions( $action_ids ); - } - - /** - * Save an action to the primary store. - * - * @param ActionScheduler_Action $action Action object to be saved. - * @param DateTime $date Optional. Schedule date. Default null. - * - * @return int The action ID - */ - public function save_action( ActionScheduler_Action $action, DateTime $date = null ) { - return $this->primary_store->save_action( $action, $date ); - } - - /** - * Retrieve an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function fetch_action( $action_id ) { - $store = $this->get_store_from_action_id( $action_id, true ); - if ( $store ) { - return $store->fetch_action( $action_id ); - } else { - return new ActionScheduler_NullAction(); - } - } - - /** - * Cancel an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function cancel_action( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->cancel_action( $action_id ); - } - } - - /** - * Delete an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function delete_action( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->delete_action( $action_id ); - } - } - - /** - * Get the schedule date an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function get_date( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - return $store->get_date( $action_id ); - } else { - return null; - } - } - - /** - * Mark an existing action as failed whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function mark_failure( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->mark_failure( $action_id ); - } - } - - /** - * Log the execution of an existing action whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function log_execution( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->log_execution( $action_id ); - } - } - - /** - * Mark an existing action complete whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function mark_complete( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - $store->mark_complete( $action_id ); - } - } - - /** - * Get an existing action status whether migrated or not. - * - * @param int $action_id Action ID. - */ - public function get_status( $action_id ) { - $store = $this->get_store_from_action_id( $action_id ); - if ( $store ) { - return $store->get_status( $action_id ); - } - return null; - } - - /** - * Return which store an action is stored in. - * - * @param int $action_id ID of the action. - * @param bool $primary_first Optional flag indicating search the primary store first. - * @return ActionScheduler_Store - */ - protected function get_store_from_action_id( $action_id, $primary_first = false ) { - if ( $primary_first ) { - $stores = [ - $this->primary_store, - $this->secondary_store, - ]; - } elseif ( $action_id < $this->demarkation_id ) { - $stores = [ - $this->secondary_store, - $this->primary_store, - ]; - } else { - $stores = [ - $this->primary_store, - ]; - } - - foreach ( $stores as $store ) { - $action = $store->fetch_action( $action_id ); - if ( ! is_a( $action, 'ActionScheduler_NullAction' ) ) { - return $store; - } - } - return null; - } - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * - * All claim-related functions should operate solely - * on the primary store. - * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - /** - * Get the claim count from the table data store. - */ - public function get_claim_count() { - return $this->primary_store->get_claim_count(); - } - - /** - * Retrieve the claim ID for an action from the table data store. - * - * @param int $action_id Action ID. - */ - public function get_claim_id( $action_id ) { - return $this->primary_store->get_claim_id( $action_id ); - } - - /** - * Release a claim in the table data store. - * - * @param ActionScheduler_ActionClaim $claim Claim object. - */ - public function release_claim( ActionScheduler_ActionClaim $claim ) { - $this->primary_store->release_claim( $claim ); - } - - /** - * Release claims on an action in the table data store. - * - * @param int $action_id Action ID. - */ - public function unclaim_action( $action_id ) { - $this->primary_store->unclaim_action( $action_id ); - } - - /** - * Retrieve a list of action IDs by claim. - * - * @param int $claim_id Claim ID. - */ - public function find_actions_by_claim_id( $claim_id ) { - return $this->primary_store->find_actions_by_claim_id( $claim_id ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php deleted file mode 100644 index 7215ddd..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php +++ /dev/null @@ -1,240 +0,0 @@ -create_wp_comment( $action_id, $message, $date ); - return $comment_id; - } - - protected function create_wp_comment( $action_id, $message, DateTime $date ) { - - $comment_date_gmt = $date->format('Y-m-d H:i:s'); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - $comment_data = array( - 'comment_post_ID' => $action_id, - 'comment_date' => $date->format('Y-m-d H:i:s'), - 'comment_date_gmt' => $comment_date_gmt, - 'comment_author' => self::AGENT, - 'comment_content' => $message, - 'comment_agent' => self::AGENT, - 'comment_type' => self::TYPE, - ); - return wp_insert_comment($comment_data); - } - - /** - * @param string $entry_id - * - * @return ActionScheduler_LogEntry - */ - public function get_entry( $entry_id ) { - $comment = $this->get_comment( $entry_id ); - if ( empty($comment) || $comment->comment_type != self::TYPE ) { - return new ActionScheduler_NullLogEntry(); - } - - $date = as_get_datetime_object( $comment->comment_date_gmt ); - ActionScheduler_TimezoneHelper::set_local_timezone( $date ); - return new ActionScheduler_LogEntry( $comment->comment_post_ID, $comment->comment_content, $date ); - } - - /** - * @param string $action_id - * - * @return ActionScheduler_LogEntry[] - */ - public function get_logs( $action_id ) { - $status = 'all'; - if ( get_post_status($action_id) == 'trash' ) { - $status = 'post-trashed'; - } - $comments = get_comments(array( - 'post_id' => $action_id, - 'orderby' => 'comment_date_gmt', - 'order' => 'ASC', - 'type' => self::TYPE, - 'status' => $status, - )); - $logs = array(); - foreach ( $comments as $c ) { - $entry = $this->get_entry( $c ); - if ( !empty($entry) ) { - $logs[] = $entry; - } - } - return $logs; - } - - protected function get_comment( $comment_id ) { - return get_comment( $comment_id ); - } - - - - /** - * @param WP_Comment_Query $query - */ - public function filter_comment_queries( $query ) { - foreach ( array('ID', 'parent', 'post_author', 'post_name', 'post_parent', 'type', 'post_type', 'post_id', 'post_ID') as $key ) { - if ( !empty($query->query_vars[$key]) ) { - return; // don't slow down queries that wouldn't include action_log comments anyway - } - } - $query->query_vars['action_log_filter'] = TRUE; - add_filter( 'comments_clauses', array( $this, 'filter_comment_query_clauses' ), 10, 2 ); - } - - /** - * @param array $clauses - * @param WP_Comment_Query $query - * - * @return array - */ - public function filter_comment_query_clauses( $clauses, $query ) { - if ( !empty($query->query_vars['action_log_filter']) ) { - $clauses['where'] .= $this->get_where_clause(); - } - return $clauses; - } - - /** - * Make sure Action Scheduler logs are excluded from comment feeds, which use WP_Query, not - * the WP_Comment_Query class handled by @see self::filter_comment_queries(). - * - * @param string $where - * @param WP_Query $query - * - * @return string - */ - public function filter_comment_feed( $where, $query ) { - if ( is_comment_feed() ) { - $where .= $this->get_where_clause(); - } - return $where; - } - - /** - * Return a SQL clause to exclude Action Scheduler comments. - * - * @return string - */ - protected function get_where_clause() { - global $wpdb; - return sprintf( " AND {$wpdb->comments}.comment_type != '%s'", self::TYPE ); - } - - /** - * Remove action log entries from wp_count_comments() - * - * @param array $stats - * @param int $post_id - * - * @return object - */ - public function filter_comment_count( $stats, $post_id ) { - global $wpdb; - - if ( 0 === $post_id ) { - $stats = $this->get_comment_count(); - } - - return $stats; - } - - /** - * Retrieve the comment counts from our cache, or the database if the cached version isn't set. - * - * @return object - */ - protected function get_comment_count() { - global $wpdb; - - $stats = get_transient( 'as_comment_count' ); - - if ( ! $stats ) { - $stats = array(); - - $count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} WHERE comment_type NOT IN('order_note','action_log') GROUP BY comment_approved", ARRAY_A ); - - $total = 0; - $stats = array(); - $approved = array( '0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed' ); - - foreach ( (array) $count as $row ) { - // Don't count post-trashed toward totals - if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) { - $total += $row['num_comments']; - } - if ( isset( $approved[ $row['comment_approved'] ] ) ) { - $stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments']; - } - } - - $stats['total_comments'] = $total; - $stats['all'] = $total; - - foreach ( $approved as $key ) { - if ( empty( $stats[ $key ] ) ) { - $stats[ $key ] = 0; - } - } - - $stats = (object) $stats; - set_transient( 'as_comment_count', $stats ); - } - - return $stats; - } - - /** - * Delete comment count cache whenever there is new comment or the status of a comment changes. Cache - * will be regenerated next time ActionScheduler_wpCommentLogger::filter_comment_count() is called. - */ - public function delete_comment_count_cache() { - delete_transient( 'as_comment_count' ); - } - - /** - * @codeCoverageIgnore - */ - public function init() { - add_action( 'action_scheduler_before_process_queue', array( $this, 'disable_comment_counting' ), 10, 0 ); - add_action( 'action_scheduler_after_process_queue', array( $this, 'enable_comment_counting' ), 10, 0 ); - - parent::init(); - - add_action( 'pre_get_comments', array( $this, 'filter_comment_queries' ), 10, 1 ); - add_action( 'wp_count_comments', array( $this, 'filter_comment_count' ), 20, 2 ); // run after WC_Comments::wp_count_comments() to make sure we exclude order notes and action logs - add_action( 'comment_feed_where', array( $this, 'filter_comment_feed' ), 10, 2 ); - - // Delete comments count cache whenever there is a new comment or a comment status changes - add_action( 'wp_insert_comment', array( $this, 'delete_comment_count_cache' ) ); - add_action( 'wp_set_comment_status', array( $this, 'delete_comment_count_cache' ) ); - } - - public function disable_comment_counting() { - wp_defer_comment_counting(true); - } - public function enable_comment_counting() { - wp_defer_comment_counting(false); - } - -} diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php deleted file mode 100644 index 7c6b06d..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php +++ /dev/null @@ -1,1088 +0,0 @@ -validate_action( $action ); - $post_array = $this->create_post_array( $action, $scheduled_date ); - $post_id = $this->save_post_array( $post_array ); - $this->save_post_schedule( $post_id, $action->get_schedule() ); - $this->save_action_group( $post_id, $action->get_group() ); - do_action( 'action_scheduler_stored_action', $post_id ); - return $post_id; - } catch ( Exception $e ) { - /* translators: %s: action error message */ - throw new RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); - } - } - - /** - * Create post array. - * - * @param ActionScheduler_Action $action Scheduled Action. - * @param DateTime $scheduled_date Scheduled Date. - * - * @return array Returns an array of post data. - */ - protected function create_post_array( ActionScheduler_Action $action, DateTime $scheduled_date = null ) { - $post = array( - 'post_type' => self::POST_TYPE, - 'post_title' => $action->get_hook(), - 'post_content' => wp_json_encode( $action->get_args() ), - 'post_status' => ( $action->is_finished() ? 'publish' : 'pending' ), - 'post_date_gmt' => $this->get_scheduled_date_string( $action, $scheduled_date ), - 'post_date' => $this->get_scheduled_date_string_local( $action, $scheduled_date ), - ); - return $post; - } - - /** - * Save post array. - * - * @param array $post_array Post array. - * @return int Returns the post ID. - * @throws RuntimeException Throws an exception if the action could not be saved. - */ - protected function save_post_array( $post_array ) { - add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); - add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); - - $has_kses = false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' ); - - if ( $has_kses ) { - // Prevent KSES from corrupting JSON in post_content. - kses_remove_filters(); - } - - $post_id = wp_insert_post( $post_array ); - - if ( $has_kses ) { - kses_init_filters(); - } - - remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); - remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); - - if ( is_wp_error( $post_id ) || empty( $post_id ) ) { - throw new RuntimeException( __( 'Unable to save action.', 'action-scheduler' ) ); - } - return $post_id; - } - - /** - * Filter insert post data. - * - * @param array $postdata Post data to filter. - * - * @return array - */ - public function filter_insert_post_data( $postdata ) { - if ( self::POST_TYPE === $postdata['post_type'] ) { - $postdata['post_author'] = 0; - if ( 'future' === $postdata['post_status'] ) { - $postdata['post_status'] = 'publish'; - } - } - return $postdata; - } - - /** - * Create a (probably unique) post name for scheduled actions in a more performant manner than wp_unique_post_slug(). - * - * When an action's post status is transitioned to something other than 'draft', 'pending' or 'auto-draft, like 'publish' - * or 'failed' or 'trash', WordPress will find a unique slug (stored in post_name column) using the wp_unique_post_slug() - * function. This is done to ensure URL uniqueness. The approach taken by wp_unique_post_slug() is to iterate over existing - * post_name values that match, and append a number 1 greater than the largest. This makes sense when manually creating a - * post from the Edit Post screen. It becomes a bottleneck when automatically processing thousands of actions, with a - * database containing thousands of related post_name values. - * - * WordPress 5.1 introduces the 'pre_wp_unique_post_slug' filter for plugins to address this issue. - * - * We can short-circuit WordPress's wp_unique_post_slug() approach using the 'pre_wp_unique_post_slug' filter. This - * method is available to be used as a callback on that filter. It provides a more scalable approach to generating a - * post_name/slug that is probably unique. Because Action Scheduler never actually uses the post_name field, or an - * action's slug, being probably unique is good enough. - * - * For more backstory on this issue, see: - * - https://github.com/woocommerce/action-scheduler/issues/44 and - * - https://core.trac.wordpress.org/ticket/21112 - * - * @param string $override_slug Short-circuit return value. - * @param string $slug The desired slug (post_name). - * @param int $post_ID Post ID. - * @param string $post_status The post status. - * @param string $post_type Post type. - * @return string - */ - public function set_unique_post_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ) { - if ( self::POST_TYPE === $post_type ) { - $override_slug = uniqid( self::POST_TYPE . '-', true ) . '-' . wp_generate_password( 32, false ); - } - return $override_slug; - } - - /** - * Save post schedule. - * - * @param int $post_id Post ID of the scheduled action. - * @param string $schedule Schedule to save. - * - * @return void - */ - protected function save_post_schedule( $post_id, $schedule ) { - update_post_meta( $post_id, self::SCHEDULE_META_KEY, $schedule ); - } - - /** - * Save action group. - * - * @param int $post_id Post ID. - * @param string $group Group to save. - * @return void - */ - protected function save_action_group( $post_id, $group ) { - if ( empty( $group ) ) { - wp_set_object_terms( $post_id, array(), self::GROUP_TAXONOMY, false ); - } else { - wp_set_object_terms( $post_id, array( $group ), self::GROUP_TAXONOMY, false ); - } - } - - /** - * Fetch actions. - * - * @param int $action_id Action ID. - * @return object - */ - public function fetch_action( $action_id ) { - $post = $this->get_post( $action_id ); - if ( empty( $post ) || self::POST_TYPE !== $post->post_type ) { - return $this->get_null_action(); - } - - try { - $action = $this->make_action_from_post( $post ); - } catch ( ActionScheduler_InvalidActionException $exception ) { - do_action( 'action_scheduler_failed_fetch_action', $post->ID, $exception ); - return $this->get_null_action(); - } - - return $action; - } - - /** - * Get post. - * - * @param string $action_id - Action ID. - * @return WP_Post|null - */ - protected function get_post( $action_id ) { - if ( empty( $action_id ) ) { - return null; - } - return get_post( $action_id ); - } - - /** - * Get NULL action. - * - * @return ActionScheduler_NullAction - */ - protected function get_null_action() { - return new ActionScheduler_NullAction(); - } - - /** - * Make action from post. - * - * @param WP_Post $post Post object. - * @return WP_Post - */ - protected function make_action_from_post( $post ) { - $hook = $post->post_title; - - $args = json_decode( $post->post_content, true ); - $this->validate_args( $args, $post->ID ); - - $schedule = get_post_meta( $post->ID, self::SCHEDULE_META_KEY, true ); - $this->validate_schedule( $schedule, $post->ID ); - - $group = wp_get_object_terms( $post->ID, self::GROUP_TAXONOMY, array( 'fields' => 'names' ) ); - $group = empty( $group ) ? '' : reset( $group ); - - return ActionScheduler::factory()->get_stored_action( $this->get_action_status_by_post_status( $post->post_status ), $hook, $args, $schedule, $group ); - } - - /** - * Get action status by post status. - * - * @param string $post_status Post status. - * - * @throws InvalidArgumentException Throw InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels(). - * @return string - */ - protected function get_action_status_by_post_status( $post_status ) { - - switch ( $post_status ) { - case 'publish': - $action_status = self::STATUS_COMPLETE; - break; - case 'trash': - $action_status = self::STATUS_CANCELED; - break; - default: - if ( ! array_key_exists( $post_status, $this->get_status_labels() ) ) { - throw new InvalidArgumentException( sprintf( 'Invalid post status: "%s". No matching action status available.', $post_status ) ); - } - $action_status = $post_status; - break; - } - - return $action_status; - } - - /** - * Get post status by action status. - * - * @param string $action_status Action status. - * - * @throws InvalidArgumentException Throws InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels(). - * @return string - */ - protected function get_post_status_by_action_status( $action_status ) { - - switch ( $action_status ) { - case self::STATUS_COMPLETE: - $post_status = 'publish'; - break; - case self::STATUS_CANCELED: - $post_status = 'trash'; - break; - default: - if ( ! array_key_exists( $action_status, $this->get_status_labels() ) ) { - throw new InvalidArgumentException( sprintf( 'Invalid action status: "%s".', $action_status ) ); - } - $post_status = $action_status; - break; - } - - return $post_status; - } - - /** - * Returns the SQL statement to query (or count) actions. - * - * @param array $query - Filtering options. - * @param string $select_or_count - Whether the SQL should select and return the IDs or just the row count. - * - * @throws InvalidArgumentException - Throw InvalidArgumentException if $select_or_count not count or select. - * @return string SQL statement. The returned SQL is already properly escaped. - */ - protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { - - if ( ! in_array( $select_or_count, array( 'select', 'count' ), true ) ) { - throw new InvalidArgumentException( __( 'Invalid schedule. Cannot save action.', 'action-scheduler' ) ); - } - - $query = wp_parse_args( - $query, - array( - 'hook' => '', - 'args' => null, - 'date' => null, - 'date_compare' => '<=', - 'modified' => null, - 'modified_compare' => '<=', - 'group' => '', - 'status' => '', - 'claimed' => null, - 'per_page' => 5, - 'offset' => 0, - 'orderby' => 'date', - 'order' => 'ASC', - 'search' => '', - ) - ); - - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - $sql = ( 'count' === $select_or_count ) ? 'SELECT count(p.ID)' : 'SELECT p.ID '; - $sql .= "FROM {$wpdb->posts} p"; - $sql_params = array(); - if ( empty( $query['group'] ) && 'group' === $query['orderby'] ) { - $sql .= " LEFT JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; - $sql .= " LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; - $sql .= " LEFT JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; - } elseif ( ! empty( $query['group'] ) ) { - $sql .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; - $sql .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; - $sql .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; - $sql .= ' AND t.slug=%s'; - $sql_params[] = $query['group']; - } - $sql .= ' WHERE post_type=%s'; - $sql_params[] = self::POST_TYPE; - if ( $query['hook'] ) { - $sql .= ' AND p.post_title=%s'; - $sql_params[] = $query['hook']; - } - if ( ! is_null( $query['args'] ) ) { - $sql .= ' AND p.post_content=%s'; - $sql_params[] = wp_json_encode( $query['args'] ); - } - - if ( $query['status'] ) { - $post_statuses = array_map( array( $this, 'get_post_status_by_action_status' ), (array) $query['status'] ); - $placeholders = array_fill( 0, count( $post_statuses ), '%s' ); - $sql .= ' AND p.post_status IN (' . join( ', ', $placeholders ) . ')'; - $sql_params = array_merge( $sql_params, array_values( $post_statuses ) ); - } - - if ( $query['date'] instanceof DateTime ) { - $date = clone $query['date']; - $date->setTimezone( new DateTimeZone( 'UTC' ) ); - $date_string = $date->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['date_compare'] ); - $sql .= " AND p.post_date_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( $query['modified'] instanceof DateTime ) { - $modified = clone $query['modified']; - $modified->setTimezone( new DateTimeZone( 'UTC' ) ); - $date_string = $modified->format( 'Y-m-d H:i:s' ); - $comparator = $this->validate_sql_comparator( $query['modified_compare'] ); - $sql .= " AND p.post_modified_gmt $comparator %s"; - $sql_params[] = $date_string; - } - - if ( true === $query['claimed'] ) { - $sql .= " AND p.post_password != ''"; - } elseif ( false === $query['claimed'] ) { - $sql .= " AND p.post_password = ''"; - } elseif ( ! is_null( $query['claimed'] ) ) { - $sql .= ' AND p.post_password = %s'; - $sql_params[] = $query['claimed']; - } - - if ( ! empty( $query['search'] ) ) { - $sql .= ' AND (p.post_title LIKE %s OR p.post_content LIKE %s OR p.post_password LIKE %s)'; - for ( $i = 0; $i < 3; $i++ ) { - $sql_params[] = sprintf( '%%%s%%', $query['search'] ); - } - } - - if ( 'select' === $select_or_count ) { - switch ( $query['orderby'] ) { - case 'hook': - $orderby = 'p.post_title'; - break; - case 'group': - $orderby = 't.name'; - break; - case 'status': - $orderby = 'p.post_status'; - break; - case 'modified': - $orderby = 'p.post_modified'; - break; - case 'claim_id': - $orderby = 'p.post_password'; - break; - case 'schedule': - case 'date': - default: - $orderby = 'p.post_date_gmt'; - break; - } - if ( 'ASC' === strtoupper( $query['order'] ) ) { - $order = 'ASC'; - } else { - $order = 'DESC'; - } - $sql .= " ORDER BY $orderby $order"; - if ( $query['per_page'] > 0 ) { - $sql .= ' LIMIT %d, %d'; - $sql_params[] = $query['offset']; - $sql_params[] = $query['per_page']; - } - } - - return $wpdb->prepare( $sql, $sql_params ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Query for action count or list of action IDs. - * - * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. - * - * @see ActionScheduler_Store::query_actions for $query arg usage. - * - * @param array $query Query filtering options. - * @param string $query_type Whether to select or count the results. Defaults to select. - * - * @return string|array|null The IDs of actions matching the query. Null on failure. - */ - public function query_actions( $query = array(), $query_type = 'select' ) { - /** - * Global $wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - $sql = $this->get_query_actions_sql( $query, $query_type ); - - return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.PreparedSQL.NotPrepared - } - - /** - * Get a count of all actions in the store, grouped by status - * - * @return array - */ - public function action_counts() { - - $action_counts_by_status = array(); - $action_stati_and_labels = $this->get_status_labels(); - $posts_count_by_status = (array) wp_count_posts( self::POST_TYPE, 'readable' ); - - foreach ( $posts_count_by_status as $post_status_name => $count ) { - - try { - $action_status_name = $this->get_action_status_by_post_status( $post_status_name ); - } catch ( Exception $e ) { - // Ignore any post statuses that aren't for actions. - continue; - } - if ( array_key_exists( $action_status_name, $action_stati_and_labels ) ) { - $action_counts_by_status[ $action_status_name ] = $count; - } - } - - return $action_counts_by_status; - } - - /** - * Cancel action. - * - * @param int $action_id Action ID. - * - * @throws InvalidArgumentException If $action_id is not identified. - */ - public function cancel_action( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - do_action( 'action_scheduler_canceled_action', $action_id ); - add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); - wp_trash_post( $action_id ); - remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); - } - - /** - * Delete action. - * - * @param int $action_id Action ID. - * @return void - * @throws InvalidArgumentException If action is not identified. - */ - public function delete_action( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - do_action( 'action_scheduler_deleted_action', $action_id ); - - wp_delete_post( $action_id, true ); - } - - /** - * Get date for claim id. - * - * @param int $action_id Action ID. - * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran. - */ - public function get_date( $action_id ) { - $next = $this->get_date_gmt( $action_id ); - return ActionScheduler_TimezoneHelper::set_local_timezone( $next ); - } - - /** - * Get Date GMT. - * - * @param int $action_id Action ID. - * - * @throws InvalidArgumentException If $action_id is not identified. - * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran. - */ - public function get_date_gmt( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - if ( 'publish' === $post->post_status ) { - return as_get_datetime_object( $post->post_modified_gmt ); - } else { - return as_get_datetime_object( $post->post_date_gmt ); - } - } - - /** - * Stake claim. - * - * @param int $max_actions Maximum number of actions. - * @param DateTime $before_date Jobs must be schedule before this date. Defaults to now. - * @param array $hooks Claim only actions with a hook or hooks. - * @param string $group Claim only actions in the given group. - * - * @return ActionScheduler_ActionClaim - * @throws RuntimeException When there is an error staking a claim. - * @throws InvalidArgumentException When the given group is not valid. - */ - public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { - $this->claim_before_date = $before_date; - $claim_id = $this->generate_claim_id(); - $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); - $action_ids = $this->find_actions_by_claim_id( $claim_id ); - $this->claim_before_date = null; - - return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); - } - - /** - * Get claim count. - * - * @return int - */ - public function get_claim_count() { - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching - return $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(DISTINCT post_password) FROM {$wpdb->posts} WHERE post_password != '' AND post_type = %s AND post_status IN ('in-progress','pending')", - array( self::POST_TYPE ) - ) - ); - } - - /** - * Generate claim id. - * - * @return string - */ - protected function generate_claim_id() { - $claim_id = md5( microtime( true ) . wp_rand( 0, 1000 ) ); - return substr( $claim_id, 0, 20 ); // to fit in db field with 20 char limit. - } - - /** - * Claim actions. - * - * @param string $claim_id Claim ID. - * @param int $limit Limit. - * @param DateTime $before_date Should use UTC timezone. - * @param array $hooks Claim only actions with a hook or hooks. - * @param string $group Claim only actions in the given group. - * - * @return int The number of actions that were claimed. - * @throws RuntimeException When there is a database error. - */ - protected function claim_actions( $claim_id, $limit, DateTime $before_date = null, $hooks = array(), $group = '' ) { - // Set up initial variables. - $date = null === $before_date ? as_get_datetime_object() : clone $before_date; - $limit_ids = ! empty( $group ); - $ids = $limit_ids ? $this->get_actions_by_group( $group, $limit, $date ) : array(); - - // If limiting by IDs and no posts found, then return early since we have nothing to update. - if ( $limit_ids && 0 === count( $ids ) ) { - return 0; - } - - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - /* - * Build up custom query to update the affected posts. Parameters are built as a separate array - * to make it easier to identify where they are in the query. - * - * We can't use $wpdb->update() here because of the "ID IN ..." clause. - */ - $update = "UPDATE {$wpdb->posts} SET post_password = %s, post_modified_gmt = %s, post_modified = %s"; - $params = array( - $claim_id, - current_time( 'mysql', true ), - current_time( 'mysql' ), - ); - - // Build initial WHERE clause. - $where = "WHERE post_type = %s AND post_status = %s AND post_password = ''"; - $params[] = self::POST_TYPE; - $params[] = ActionScheduler_Store::STATUS_PENDING; - - if ( ! empty( $hooks ) ) { - $placeholders = array_fill( 0, count( $hooks ), '%s' ); - $where .= ' AND post_title IN (' . join( ', ', $placeholders ) . ')'; - $params = array_merge( $params, array_values( $hooks ) ); - } - - /* - * Add the IDs to the WHERE clause. IDs not escaped because they came directly from a prior DB query. - * - * If we're not limiting by IDs, then include the post_date_gmt clause. - */ - if ( $limit_ids ) { - $where .= ' AND ID IN (' . join( ',', $ids ) . ')'; - } else { - $where .= ' AND post_date_gmt <= %s'; - $params[] = $date->format( 'Y-m-d H:i:s' ); - } - - // Add the ORDER BY clause and,ms limit. - $order = 'ORDER BY menu_order ASC, post_date_gmt ASC, ID ASC LIMIT %d'; - $params[] = $limit; - - // Run the query and gather results. - $rows_affected = $wpdb->query( $wpdb->prepare( "{$update} {$where} {$order}", $params ) ); // phpcs:ignore // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare - - if ( false === $rows_affected ) { - throw new RuntimeException( __( 'Unable to claim actions. Database error.', 'action-scheduler' ) ); - } - - return (int) $rows_affected; - } - - /** - * Get IDs of actions within a certain group and up to a certain date/time. - * - * @param string $group The group to use in finding actions. - * @param int $limit The number of actions to retrieve. - * @param DateTime $date DateTime object representing cutoff time for actions. Actions retrieved will be - * up to and including this DateTime. - * - * @return array IDs of actions in the appropriate group and before the appropriate time. - * @throws InvalidArgumentException When the group does not exist. - */ - protected function get_actions_by_group( $group, $limit, DateTime $date ) { - // Ensure the group exists before continuing. - if ( ! term_exists( $group, self::GROUP_TAXONOMY ) ) { - /* translators: %s is the group name */ - throw new InvalidArgumentException( sprintf( __( 'The group "%s" does not exist.', 'action-scheduler' ), $group ) ); - } - - // Set up a query for post IDs to use later. - $query = new WP_Query(); - $query_args = array( - 'fields' => 'ids', - 'post_type' => self::POST_TYPE, - 'post_status' => ActionScheduler_Store::STATUS_PENDING, - 'has_password' => false, - 'posts_per_page' => $limit * 3, - 'suppress_filters' => true, - 'no_found_rows' => true, - 'orderby' => array( - 'menu_order' => 'ASC', - 'date' => 'ASC', - 'ID' => 'ASC', - ), - 'date_query' => array( - 'column' => 'post_date_gmt', - 'before' => $date->format( 'Y-m-d H:i' ), - 'inclusive' => true, - ), - 'tax_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery - array( - 'taxonomy' => self::GROUP_TAXONOMY, - 'field' => 'slug', - 'terms' => $group, - 'include_children' => false, - ), - ), - ); - - return $query->query( $query_args ); - } - - /** - * Find actions by claim ID. - * - * @param string $claim_id Claim ID. - * @return array - */ - public function find_actions_by_claim_id( $claim_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - $action_ids = array(); - $before_date = isset( $this->claim_before_date ) ? $this->claim_before_date : as_get_datetime_object(); - $cut_off = $before_date->format( 'Y-m-d H:i:s' ); - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $results = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID, post_date_gmt FROM {$wpdb->posts} WHERE post_type = %s AND post_password = %s", - array( - self::POST_TYPE, - $claim_id, - ) - ) - ); - - // Verify that the scheduled date for each action is within the expected bounds (in some unusual - // cases, we cannot depend on MySQL to honor all of the WHERE conditions we specify). - foreach ( $results as $claimed_action ) { - if ( $claimed_action->post_date_gmt <= $cut_off ) { - $action_ids[] = absint( $claimed_action->ID ); - } - } - - return $action_ids; - } - - /** - * Release claim. - * - * @param ActionScheduler_ActionClaim $claim Claim object to release. - * @return void - * @throws RuntimeException When the claim is not unlocked. - */ - public function release_claim( ActionScheduler_ActionClaim $claim ) { - $action_ids = $this->find_actions_by_claim_id( $claim->get_id() ); - if ( empty( $action_ids ) ) { - return; // nothing to do. - } - $action_id_string = implode( ',', array_map( 'intval', $action_ids ) ); - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $result = $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID IN ($action_id_string) AND post_password = %s", //phpcs:ignore - array( - $claim->get_id(), - ) - ) - ); - if ( false === $result ) { - /* translators: %s: claim ID */ - throw new RuntimeException( sprintf( __( 'Unable to unlock claim %s. Database error.', 'action-scheduler' ), $claim->get_id() ) ); - } - } - - /** - * Unclaim action. - * - * @param string $action_id Action ID. - * @throws RuntimeException When unable to unlock claim on action ID. - */ - public function unclaim_action( $action_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $result = $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID = %d AND post_type = %s", - $action_id, - self::POST_TYPE - ) - ); - if ( false === $result ) { - /* translators: %s: action ID */ - throw new RuntimeException( sprintf( __( 'Unable to unlock claim on action %s. Database error.', 'action-scheduler' ), $action_id ) ); - } - } - - /** - * Mark failure on action. - * - * @param int $action_id Action ID. - * - * @return void - * @throws RuntimeException When unable to mark failure on action ID. - */ - public function mark_failure( $action_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $result = $wpdb->query( - $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_status = %s WHERE ID = %d AND post_type = %s", self::STATUS_FAILED, $action_id, self::POST_TYPE ) - ); - if ( false === $result ) { - /* translators: %s: action ID */ - throw new RuntimeException( sprintf( __( 'Unable to mark failure on action %s. Database error.', 'action-scheduler' ), $action_id ) ); - } - } - - /** - * Return an action's claim ID, as stored in the post password column - * - * @param int $action_id Action ID. - * @return mixed - */ - public function get_claim_id( $action_id ) { - return $this->get_post_column( $action_id, 'post_password' ); - } - - /** - * Return an action's status, as stored in the post status column - * - * @param int $action_id Action ID. - * - * @return mixed - * @throws InvalidArgumentException When the action ID is invalid. - */ - public function get_status( $action_id ) { - $status = $this->get_post_column( $action_id, 'post_status' ); - - if ( null === $status ) { - throw new InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) ); - } - - return $this->get_action_status_by_post_status( $status ); - } - - /** - * Get post column - * - * @param string $action_id Action ID. - * @param string $column_name Column Name. - * - * @return string|null - */ - private function get_post_column( $action_id, $column_name ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - return $wpdb->get_var( - $wpdb->prepare( - "SELECT {$column_name} FROM {$wpdb->posts} WHERE ID=%d AND post_type=%s", // phpcs:ignore - $action_id, - self::POST_TYPE - ) - ); - } - - /** - * Log Execution. - * - * @throws Exception If the action status cannot be updated to self::STATUS_RUNNING ('in-progress'). - * - * @param string $action_id Action ID. - */ - public function log_execution( $action_id ) { - /** - * Global wpdb object. - * - * @var wpdb $wpdb - */ - global $wpdb; - - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $status_updated = $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->posts} SET menu_order = menu_order+1, post_status=%s, post_modified_gmt = %s, post_modified = %s WHERE ID = %d AND post_type = %s", - self::STATUS_RUNNING, - current_time( 'mysql', true ), - current_time( 'mysql' ), - $action_id, - self::POST_TYPE - ) - ); - - if ( ! $status_updated ) { - throw new Exception( - sprintf( - /* translators: 1: action ID. 2: status slug. */ - __( 'Unable to update the status of action %1$d to %2$s.', 'action-scheduler' ), - $action_id, - self::STATUS_RUNNING - ) - ); - } - } - - /** - * Record that an action was completed. - * - * @param string $action_id ID of the completed action. - * - * @throws InvalidArgumentException When the action ID is invalid. - * @throws RuntimeException When there was an error executing the action. - */ - public function mark_complete( $action_id ) { - $post = get_post( $action_id ); - if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { - /* translators: %s is the action ID */ - throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'action-scheduler' ), $action_id ) ); - } - add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); - add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); - $result = wp_update_post( - array( - 'ID' => $action_id, - 'post_status' => 'publish', - ), - true - ); - remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); - remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); - if ( is_wp_error( $result ) ) { - throw new RuntimeException( $result->get_error_message() ); - } - - /** - * Fires after a scheduled action has been completed. - * - * @since 3.4.2 - * - * @param int $action_id Action ID. - */ - do_action( 'action_scheduler_completed_action', $action_id ); - } - - /** - * Mark action as migrated when there is an error deleting the action. - * - * @param int $action_id Action ID. - */ - public function mark_migrated( $action_id ) { - wp_update_post( - array( - 'ID' => $action_id, - 'post_status' => 'migrated', - ) - ); - } - - /** - * Determine whether the post store can be migrated. - * - * @param [type] $setting - Setting value. - * @return bool - */ - public function migration_dependencies_met( $setting ) { - global $wpdb; - - $dependencies_met = get_transient( self::DEPENDENCIES_MET ); - if ( empty( $dependencies_met ) ) { - $maximum_args_length = apply_filters( 'action_scheduler_maximum_args_length', 191 ); - $found_action = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND CHAR_LENGTH(post_content) > %d LIMIT 1", - $maximum_args_length, - self::POST_TYPE - ) - ); - $dependencies_met = $found_action ? 'no' : 'yes'; - set_transient( self::DEPENDENCIES_MET, $dependencies_met, DAY_IN_SECONDS ); - } - - return 'yes' === $dependencies_met ? $setting : false; - } - - /** - * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4. - * - * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However, - * as we prepare to move to custom tables, and can use an indexed VARCHAR column instead, we want to warn - * developers of this impending requirement. - * - * @param ActionScheduler_Action $action Action object. - */ - protected function validate_action( ActionScheduler_Action $action ) { - try { - parent::validate_action( $action ); - } catch ( Exception $e ) { - /* translators: %s is the error message */ - $message = sprintf( __( '%s Support for strings longer than this will be removed in a future version.', 'action-scheduler' ), $e->getMessage() ); - _doing_it_wrong( 'ActionScheduler_Action::$args', esc_html( $message ), '2.1.0' ); - } - } - - /** - * (@codeCoverageIgnore) - */ - public function init() { - add_filter( 'action_scheduler_migration_dependencies_met', array( $this, 'migration_dependencies_met' ) ); - - $post_type_registrar = new ActionScheduler_wpPostStore_PostTypeRegistrar(); - $post_type_registrar->register(); - - $post_status_registrar = new ActionScheduler_wpPostStore_PostStatusRegistrar(); - $post_status_registrar->register(); - - $taxonomy_registrar = new ActionScheduler_wpPostStore_TaxonomyRegistrar(); - $taxonomy_registrar->register(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php deleted file mode 100644 index 246bc34..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php +++ /dev/null @@ -1,58 +0,0 @@ -post_status_args(), $this->post_status_running_labels() ) ); - register_post_status( ActionScheduler_Store::STATUS_FAILED, array_merge( $this->post_status_args(), $this->post_status_failed_labels() ) ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_status_args() { - $args = array( - 'public' => false, - 'exclude_from_search' => false, - 'show_in_admin_all_list' => true, - 'show_in_admin_status_list' => true, - ); - - return apply_filters( 'action_scheduler_post_status_args', $args ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_status_failed_labels() { - $labels = array( - 'label' => _x( 'Failed', 'post', 'action-scheduler' ), - /* translators: %s: count */ - 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)', 'action-scheduler' ), - ); - - return apply_filters( 'action_scheduler_post_status_failed_labels', $labels ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_status_running_labels() { - $labels = array( - 'label' => _x( 'In-Progress', 'post', 'action-scheduler' ), - /* translators: %s: count */ - 'label_count' => _n_noop( 'In-Progress (%s)', 'In-Progress (%s)', 'action-scheduler' ), - ); - - return apply_filters( 'action_scheduler_post_status_running_labels', $labels ); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php deleted file mode 100644 index 8c63bd0..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php +++ /dev/null @@ -1,50 +0,0 @@ -post_type_args() ); - } - - /** - * Build the args array for the post type definition - * - * @return array - */ - protected function post_type_args() { - $args = array( - 'label' => __( 'Scheduled Actions', 'action-scheduler' ), - 'description' => __( 'Scheduled actions are hooks triggered on a cetain date and time.', 'action-scheduler' ), - 'public' => false, - 'map_meta_cap' => true, - 'hierarchical' => false, - 'supports' => array('title', 'editor','comments'), - 'rewrite' => false, - 'query_var' => false, - 'can_export' => true, - 'ep_mask' => EP_NONE, - 'labels' => array( - 'name' => __( 'Scheduled Actions', 'action-scheduler' ), - 'singular_name' => __( 'Scheduled Action', 'action-scheduler' ), - 'menu_name' => _x( 'Scheduled Actions', 'Admin menu name', 'action-scheduler' ), - 'add_new' => __( 'Add', 'action-scheduler' ), - 'add_new_item' => __( 'Add New Scheduled Action', 'action-scheduler' ), - 'edit' => __( 'Edit', 'action-scheduler' ), - 'edit_item' => __( 'Edit Scheduled Action', 'action-scheduler' ), - 'new_item' => __( 'New Scheduled Action', 'action-scheduler' ), - 'view' => __( 'View Action', 'action-scheduler' ), - 'view_item' => __( 'View Action', 'action-scheduler' ), - 'search_items' => __( 'Search Scheduled Actions', 'action-scheduler' ), - 'not_found' => __( 'No actions found', 'action-scheduler' ), - 'not_found_in_trash' => __( 'No actions found in trash', 'action-scheduler' ), - ), - ); - - $args = apply_filters('action_scheduler_post_type_args', $args); - return $args; - } -} - \ No newline at end of file diff --git a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php b/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php deleted file mode 100644 index 367401f..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php +++ /dev/null @@ -1,26 +0,0 @@ -taxonomy_args() ); - } - - protected function taxonomy_args() { - $args = array( - 'label' => __( 'Action Group', 'action-scheduler' ), - 'public' => false, - 'hierarchical' => false, - 'show_admin_column' => true, - 'query_var' => false, - 'rewrite' => false, - ); - - $args = apply_filters( 'action_scheduler_taxonomy_args', $args ); - return $args; - } -} - \ No newline at end of file diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/ActionMigrator.php b/dependencies/woocommerce/action-scheduler/classes/migration/ActionMigrator.php deleted file mode 100644 index c77d083..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/ActionMigrator.php +++ /dev/null @@ -1,109 +0,0 @@ -source = $source_store; - $this->destination = $destination_store; - $this->log_migrator = $log_migrator; - } - - /** - * Migrate an action. - * - * @param int $source_action_id Action ID. - * - * @return int 0|new action ID - */ - public function migrate( $source_action_id ) { - try { - $action = $this->source->fetch_action( $source_action_id ); - $status = $this->source->get_status( $source_action_id ); - } catch ( \Exception $e ) { - $action = null; - $status = ''; - } - - if ( is_null( $action ) || empty( $status ) || ! $action->get_schedule()->get_date() ) { - // null action or empty status means the fetch operation failed or the action didn't exist - // null schedule means it's missing vital data - // delete it and move on - try { - $this->source->delete_action( $source_action_id ); - } catch ( \Exception $e ) { - // nothing to do, it didn't exist in the first place - } - do_action( 'action_scheduler/no_action_to_migrate', $source_action_id, $this->source, $this->destination ); - - return 0; - } - - try { - - // Make sure the last attempt date is set correctly for completed and failed actions - $last_attempt_date = ( $status !== \ActionScheduler_Store::STATUS_PENDING ) ? $this->source->get_date( $source_action_id ) : null; - - $destination_action_id = $this->destination->save_action( $action, null, $last_attempt_date ); - } catch ( \Exception $e ) { - do_action( 'action_scheduler/migrate_action_failed', $source_action_id, $this->source, $this->destination ); - - return 0; // could not save the action in the new store - } - - try { - switch ( $status ) { - case \ActionScheduler_Store::STATUS_FAILED : - $this->destination->mark_failure( $destination_action_id ); - break; - case \ActionScheduler_Store::STATUS_CANCELED : - $this->destination->cancel_action( $destination_action_id ); - break; - } - - $this->log_migrator->migrate( $source_action_id, $destination_action_id ); - $this->source->delete_action( $source_action_id ); - - $test_action = $this->source->fetch_action( $source_action_id ); - if ( ! is_a( $test_action, 'ActionScheduler_NullAction' ) ) { - throw new \RuntimeException( sprintf( __( 'Unable to remove source migrated action %s', 'action-scheduler' ), $source_action_id ) ); - } - do_action( 'action_scheduler/migrated_action', $source_action_id, $destination_action_id, $this->source, $this->destination ); - - return $destination_action_id; - } catch ( \Exception $e ) { - // could not delete from the old store - $this->source->mark_migrated( $source_action_id ); - do_action( 'action_scheduler/migrate_action_incomplete', $source_action_id, $destination_action_id, $this->source, $this->destination ); - do_action( 'action_scheduler/migrated_action', $source_action_id, $destination_action_id, $this->source, $this->destination ); - - return $destination_action_id; - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php b/dependencies/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php deleted file mode 100644 index 41c21da..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php +++ /dev/null @@ -1,47 +0,0 @@ - $this->get_scheduled_date_string( $action, $last_attempt_date ), - 'last_attempt_local' => $this->get_scheduled_date_string_local( $action, $last_attempt_date ), - ]; - - $wpdb->update( $wpdb->actionscheduler_actions, $data, array( 'action_id' => $action_id ), array( '%s', '%s' ), array( '%d' ) ); - } - - return $action_id; - } catch ( \Exception $e ) { - throw new \RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/BatchFetcher.php b/dependencies/woocommerce/action-scheduler/classes/migration/BatchFetcher.php deleted file mode 100644 index 4872801..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/BatchFetcher.php +++ /dev/null @@ -1,86 +0,0 @@ -store = $source_store; - } - - /** - * Retrieve a list of actions. - * - * @param int $count The number of actions to retrieve - * - * @return int[] A list of action IDs - */ - public function fetch( $count = 10 ) { - foreach ( $this->get_query_strategies( $count ) as $query ) { - $action_ids = $this->store->query_actions( $query ); - if ( ! empty( $action_ids ) ) { - return $action_ids; - } - } - - return []; - } - - /** - * Generate a list of prioritized of action search parameters. - * - * @param int $count Number of actions to find. - * - * @return array - */ - private function get_query_strategies( $count ) { - $now = as_get_datetime_object(); - $args = [ - 'date' => $now, - 'per_page' => $count, - 'offset' => 0, - 'orderby' => 'date', - 'order' => 'ASC', - ]; - - $priorities = [ - Store::STATUS_PENDING, - Store::STATUS_FAILED, - Store::STATUS_CANCELED, - Store::STATUS_COMPLETE, - Store::STATUS_RUNNING, - '', // any other unanticipated status - ]; - - foreach ( $priorities as $status ) { - yield wp_parse_args( [ - 'status' => $status, - 'date_compare' => '<=', - ], $args ); - yield wp_parse_args( [ - 'status' => $status, - 'date_compare' => '>=', - ], $args ); - } - } -} \ No newline at end of file diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/Config.php b/dependencies/woocommerce/action-scheduler/classes/migration/Config.php deleted file mode 100644 index 50f41ff..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/Config.php +++ /dev/null @@ -1,168 +0,0 @@ -source_store ) ) { - throw new \RuntimeException( __( 'Source store must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->source_store; - } - - /** - * Set the configured source store. - * - * @param ActionScheduler_Store $store Source store object. - */ - public function set_source_store( Store $store ) { - $this->source_store = $store; - } - - /** - * Get the configured source loger. - * - * @return ActionScheduler_Logger - */ - public function get_source_logger() { - if ( empty( $this->source_logger ) ) { - throw new \RuntimeException( __( 'Source logger must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->source_logger; - } - - /** - * Set the configured source logger. - * - * @param ActionScheduler_Logger $logger - */ - public function set_source_logger( Logger $logger ) { - $this->source_logger = $logger; - } - - /** - * Get the configured destination store. - * - * @return ActionScheduler_Store - */ - public function get_destination_store() { - if ( empty( $this->destination_store ) ) { - throw new \RuntimeException( __( 'Destination store must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->destination_store; - } - - /** - * Set the configured destination store. - * - * @param ActionScheduler_Store $store - */ - public function set_destination_store( Store $store ) { - $this->destination_store = $store; - } - - /** - * Get the configured destination logger. - * - * @return ActionScheduler_Logger - */ - public function get_destination_logger() { - if ( empty( $this->destination_logger ) ) { - throw new \RuntimeException( __( 'Destination logger must be configured before running a migration', 'action-scheduler' ) ); - } - - return $this->destination_logger; - } - - /** - * Set the configured destination logger. - * - * @param ActionScheduler_Logger $logger - */ - public function set_destination_logger( Logger $logger ) { - $this->destination_logger = $logger; - } - - /** - * Get flag indicating whether it's a dry run. - * - * @return bool - */ - public function get_dry_run() { - return $this->dry_run; - } - - /** - * Set flag indicating whether it's a dry run. - * - * @param bool $dry_run - */ - public function set_dry_run( $dry_run ) { - $this->dry_run = (bool) $dry_run; - } - - /** - * Get progress bar object. - * - * @return ActionScheduler\WPCLI\ProgressBar - */ - public function get_progress_bar() { - return $this->progress_bar; - } - - /** - * Set progress bar object. - * - * @param ActionScheduler\WPCLI\ProgressBar $progress_bar - */ - public function set_progress_bar( ProgressBar $progress_bar ) { - $this->progress_bar = $progress_bar; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/Controller.php b/dependencies/woocommerce/action-scheduler/classes/migration/Controller.php deleted file mode 100644 index b2b618d..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/Controller.php +++ /dev/null @@ -1,226 +0,0 @@ -migration_scheduler = $migration_scheduler; - $this->store_classname = ''; - } - - /** - * Set the action store class name. - * - * @param string $class Classname of the store class. - * - * @return string - */ - public function get_store_class( $class ) { - if ( \ActionScheduler_DataController::is_migration_complete() ) { - return \ActionScheduler_DataController::DATASTORE_CLASS; - } elseif ( \ActionScheduler_Store::DEFAULT_CLASS !== $class ) { - $this->store_classname = $class; - return $class; - } else { - return 'ActionScheduler_HybridStore'; - } - } - - /** - * Set the action logger class name. - * - * @param string $class Classname of the logger class. - * - * @return string - */ - public function get_logger_class( $class ) { - \ActionScheduler_Store::instance(); - - if ( $this->has_custom_datastore() ) { - $this->logger_classname = $class; - return $class; - } else { - return \ActionScheduler_DataController::LOGGER_CLASS; - } - } - - /** - * Get flag indicating whether a custom datastore is in use. - * - * @return bool - */ - public function has_custom_datastore() { - return (bool) $this->store_classname; - } - - /** - * Set up the background migration process. - * - * @return void - */ - public function schedule_migration() { - $logging_tables = new ActionScheduler_LoggerSchema(); - $store_tables = new ActionScheduler_StoreSchema(); - - /* - * In some unusual cases, the expected tables may not have been created. In such cases - * we do not schedule a migration as doing so will lead to fatal error conditions. - * - * In such cases the user will likely visit the Tools > Scheduled Actions screen to - * investigate, and will see appropriate messaging (this step also triggers an attempt - * to rebuild any missing tables). - * - * @see https://github.com/woocommerce/action-scheduler/issues/653 - */ - if ( - ActionScheduler_DataController::is_migration_complete() - || $this->migration_scheduler->is_migration_scheduled() - || ! $store_tables->tables_exist() - || ! $logging_tables->tables_exist() - ) { - return; - } - - $this->migration_scheduler->schedule_migration(); - } - - /** - * Get the default migration config object - * - * @return ActionScheduler\Migration\Config - */ - public function get_migration_config_object() { - static $config = null; - - if ( ! $config ) { - $source_store = $this->store_classname ? new $this->store_classname() : new \ActionScheduler_wpPostStore(); - $source_logger = $this->logger_classname ? new $this->logger_classname() : new \ActionScheduler_wpCommentLogger(); - - $config = new Config(); - $config->set_source_store( $source_store ); - $config->set_source_logger( $source_logger ); - $config->set_destination_store( new \ActionScheduler_DBStoreMigrator() ); - $config->set_destination_logger( new \ActionScheduler_DBLogger() ); - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - $config->set_progress_bar( new ProgressBar( '', 0 ) ); - } - } - - return apply_filters( 'action_scheduler/migration_config', $config ); - } - - /** - * Hook dashboard migration notice. - */ - public function hook_admin_notices() { - if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) { - return; - } - add_action( 'admin_notices', array( $this, 'display_migration_notice' ), 10, 0 ); - } - - /** - * Show a dashboard notice that migration is in progress. - */ - public function display_migration_notice() { - printf( '

      %s

      ', esc_html__( 'Action Scheduler migration in progress. The list of scheduled actions may be incomplete.', 'action-scheduler' ) ); - } - - /** - * Add store classes. Hook migration. - */ - private function hook() { - add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 ); - add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 ); - add_action( 'init', array( $this, 'maybe_hook_migration' ) ); - add_action( 'wp_loaded', array( $this, 'schedule_migration' ) ); - - // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen - add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 ); - add_action( 'load-woocommerce_page_wc-status', array( $this, 'hook_admin_notices' ), 10, 0 ); - } - - /** - * Possibly hook the migration scheduler action. - * - * @author Jeremy Pry - */ - public function maybe_hook_migration() { - if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) { - return; - } - - $this->migration_scheduler->hook(); - } - - /** - * Allow datastores to enable migration to AS tables. - */ - public function allow_migration() { - if ( ! \ActionScheduler_DataController::dependencies_met() ) { - return false; - } - - if ( null === $this->migrate_custom_store ) { - $this->migrate_custom_store = apply_filters( 'action_scheduler_migrate_data_store', false ); - } - - return ( ! $this->has_custom_datastore() ) || $this->migrate_custom_store; - } - - /** - * Proceed with the migration if the dependencies have been met. - */ - public static function init() { - if ( \ActionScheduler_DataController::dependencies_met() ) { - self::instance()->hook(); - } - } - - /** - * Singleton factory. - */ - public static function instance() { - if ( ! isset( self::$instance ) ) { - self::$instance = new static( new Scheduler() ); - } - - return self::$instance; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/DryRun_ActionMigrator.php b/dependencies/woocommerce/action-scheduler/classes/migration/DryRun_ActionMigrator.php deleted file mode 100644 index ffc21c2..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/DryRun_ActionMigrator.php +++ /dev/null @@ -1,28 +0,0 @@ -source = $source_logger; - $this->destination = $destination_Logger; - } - - /** - * Migrate an action log. - * - * @param int $source_action_id Source logger object. - * @param int $destination_action_id Destination logger object. - */ - public function migrate( $source_action_id, $destination_action_id ) { - $logs = $this->source->get_logs( $source_action_id ); - foreach ( $logs as $log ) { - if ( $log->get_action_id() == $source_action_id ) { - $this->destination->log( $destination_action_id, $log->get_message(), $log->get_date() ); - } - } - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/Runner.php b/dependencies/woocommerce/action-scheduler/classes/migration/Runner.php deleted file mode 100644 index 2304a79..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/Runner.php +++ /dev/null @@ -1,136 +0,0 @@ -source_store = $config->get_source_store(); - $this->destination_store = $config->get_destination_store(); - $this->source_logger = $config->get_source_logger(); - $this->destination_logger = $config->get_destination_logger(); - - $this->batch_fetcher = new BatchFetcher( $this->source_store ); - if ( $config->get_dry_run() ) { - $this->log_migrator = new DryRun_LogMigrator( $this->source_logger, $this->destination_logger ); - $this->action_migrator = new DryRun_ActionMigrator( $this->source_store, $this->destination_store, $this->log_migrator ); - } else { - $this->log_migrator = new LogMigrator( $this->source_logger, $this->destination_logger ); - $this->action_migrator = new ActionMigrator( $this->source_store, $this->destination_store, $this->log_migrator ); - } - - if ( defined( 'WP_CLI' ) && WP_CLI ) { - $this->progress_bar = $config->get_progress_bar(); - } - } - - /** - * Run migration batch. - * - * @param int $batch_size Optional batch size. Default 10. - * - * @return int Size of batch processed. - */ - public function run( $batch_size = 10 ) { - $batch = $this->batch_fetcher->fetch( $batch_size ); - $batch_size = count( $batch ); - - if ( ! $batch_size ) { - return 0; - } - - if ( $this->progress_bar ) { - /* translators: %d: amount of actions */ - $this->progress_bar->set_message( sprintf( _n( 'Migrating %d action', 'Migrating %d actions', $batch_size, 'action-scheduler' ), $batch_size ) ); - $this->progress_bar->set_count( $batch_size ); - } - - $this->migrate_actions( $batch ); - - return $batch_size; - } - - /** - * Migration a batch of actions. - * - * @param array $action_ids List of action IDs to migrate. - */ - public function migrate_actions( array $action_ids ) { - do_action( 'action_scheduler/migration_batch_starting', $action_ids ); - - \ActionScheduler::logger()->unhook_stored_action(); - $this->destination_logger->unhook_stored_action(); - - foreach ( $action_ids as $source_action_id ) { - $destination_action_id = $this->action_migrator->migrate( $source_action_id ); - if ( $destination_action_id ) { - $this->destination_logger->log( $destination_action_id, sprintf( - /* translators: 1: source action ID 2: source store class 3: destination action ID 4: destination store class */ - __( 'Migrated action with ID %1$d in %2$s to ID %3$d in %4$s', 'action-scheduler' ), - $source_action_id, - get_class( $this->source_store ), - $destination_action_id, - get_class( $this->destination_store ) - ) ); - } - - if ( $this->progress_bar ) { - $this->progress_bar->tick(); - } - } - - if ( $this->progress_bar ) { - $this->progress_bar->finish(); - } - - \ActionScheduler::logger()->hook_stored_action(); - - do_action( 'action_scheduler/migration_batch_complete', $action_ids ); - } - - /** - * Initialize destination store and logger. - */ - public function init_destination() { - $this->destination_store->init(); - $this->destination_logger->init(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/migration/Scheduler.php b/dependencies/woocommerce/action-scheduler/classes/migration/Scheduler.php deleted file mode 100644 index dcbe2db..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/migration/Scheduler.php +++ /dev/null @@ -1,128 +0,0 @@ -get_migration_runner(); - $count = $migration_runner->run( $this->get_batch_size() ); - - if ( $count === 0 ) { - $this->mark_complete(); - } else { - $this->schedule_migration( time() + $this->get_schedule_interval() ); - } - } - - /** - * Mark the migration complete. - */ - public function mark_complete() { - $this->unschedule_migration(); - - \ActionScheduler_DataController::mark_migration_complete(); - do_action( 'action_scheduler/migration_complete' ); - } - - /** - * Get a flag indicating whether the migration is scheduled. - * - * @return bool Whether there is a pending action in the store to handle the migration - */ - public function is_migration_scheduled() { - $next = as_next_scheduled_action( self::HOOK ); - - return ! empty( $next ); - } - - /** - * Schedule the migration. - * - * @param int $when Optional timestamp to run the next migration batch. Defaults to now. - * - * @return string The action ID - */ - public function schedule_migration( $when = 0 ) { - $next = as_next_scheduled_action( self::HOOK ); - - if ( ! empty( $next ) ) { - return $next; - } - - if ( empty( $when ) ) { - $when = time() + MINUTE_IN_SECONDS; - } - - return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP ); - } - - /** - * Remove the scheduled migration action. - */ - public function unschedule_migration() { - as_unschedule_action( self::HOOK, null, self::GROUP ); - } - - /** - * Get migration batch schedule interval. - * - * @return int Seconds between migration runs. Defaults to 0 seconds to allow chaining migration via Async Runners. - */ - private function get_schedule_interval() { - return (int) apply_filters( 'action_scheduler/migration_interval', 0 ); - } - - /** - * Get migration batch size. - * - * @return int Number of actions to migrate in each batch. Defaults to 250. - */ - private function get_batch_size() { - return (int) apply_filters( 'action_scheduler/migration_batch_size', 250 ); - } - - /** - * Get migration runner object. - * - * @return Runner - */ - private function get_migration_runner() { - $config = Controller::instance()->get_migration_config_object(); - - return new Runner( $config ); - } - -} diff --git a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php b/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php deleted file mode 100644 index 840e482..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php +++ /dev/null @@ -1,57 +0,0 @@ -__wakeup() for details. - **/ - private $timestamp = NULL; - - /** - * @param DateTime $after - * - * @return DateTime|null - */ - public function calculate_next( DateTime $after ) { - return null; - } - - /** - * Cancelled actions should never have a next schedule, even if get_next() - * is called with $after < $this->scheduled_date. - * - * @param DateTime $after - * @return DateTime|null - */ - public function get_next( DateTime $after ) { - return null; - } - - /** - * @return bool - */ - public function is_recurring() { - return false; - } - - /** - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To maintain backward - * compatibility with schedules serialized and stored prior to 3.0, we need to correctly - * map the old property names with matching visibility. - */ - public function __wakeup() { - if ( ! is_null( $this->timestamp ) ) { - $this->scheduled_timestamp = $this->timestamp; - unset( $this->timestamp ); - } - parent::__wakeup(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php b/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php deleted file mode 100644 index 7859307..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php +++ /dev/null @@ -1,102 +0,0 @@ -__wakeup() for details. - **/ - private $start_timestamp = NULL; - - /** - * Deprecated property @see $this->__wakeup() for details. - **/ - private $cron = NULL; - - /** - * Wrapper for parent constructor to accept a cron expression string and map it to a CronExpression for this - * objects $recurrence property. - * - * @param DateTime $start The date & time to run the action at or after. If $start aligns with the CronSchedule passed via $recurrence, it will be used. If it does not align, the first matching date after it will be used. - * @param CronExpression|string $recurrence The CronExpression used to calculate the schedule's next instance. - * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. - */ - public function __construct( DateTime $start, $recurrence, DateTime $first = null ) { - if ( ! is_a( $recurrence, 'CronExpression' ) ) { - $recurrence = CronExpression::factory( $recurrence ); - } - - // For backward compatibility, we need to make sure the date is set to the first matching cron date, not whatever date is passed in. Importantly, by passing true as the 3rd param, if $start matches the cron expression, then it will be used. This was previously handled in the now deprecated next() method. - $date = $recurrence->getNextRunDate( $start, 0, true ); - - // parent::__construct() will set this to $date by default, but that may be different to $start now. - $first = empty( $first ) ? $start : $first; - - parent::__construct( $date, $recurrence, $first ); - } - - /** - * Calculate when an instance of this schedule would start based on a given - * date & time using its the CronExpression. - * - * @param DateTime $after - * @return DateTime - */ - protected function calculate_next( DateTime $after ) { - return $this->recurrence->getNextRunDate( $after, 0, false ); - } - - /** - * @return string - */ - public function get_recurrence() { - return strval( $this->recurrence ); - } - - /** - * Serialize cron schedules with data required prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to - * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To guard against the - * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to - * also store the data with the old property names so if it's unserialized in AS < 3.0, - * the schedule doesn't end up with a null recurrence. - * - * @return array - */ - public function __sleep() { - - $sleep_params = parent::__sleep(); - - $this->start_timestamp = $this->scheduled_timestamp; - $this->cron = $this->recurrence; - - return array_merge( $sleep_params, array( - 'start_timestamp', - 'cron' - ) ); - } - - /** - * Unserialize cron schedules serialized/stored prior to AS 3.0.0 - * - * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). - */ - public function __wakeup() { - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { - $this->scheduled_timestamp = $this->start_timestamp; - unset( $this->start_timestamp ); - } - - if ( is_null( $this->recurrence ) && ! is_null( $this->cron ) ) { - $this->recurrence = $this->cron; - unset( $this->cron ); - } - parent::__wakeup(); - } -} - diff --git a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php b/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php deleted file mode 100644 index 11a591e..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php +++ /dev/null @@ -1,81 +0,0 @@ -__wakeup() for details. - **/ - private $start_timestamp = NULL; - - /** - * Deprecated property @see $this->__wakeup() for details. - **/ - private $interval_in_seconds = NULL; - - /** - * Calculate when this schedule should start after a given date & time using - * the number of seconds between recurrences. - * - * @param DateTime $after - * @return DateTime - */ - protected function calculate_next( DateTime $after ) { - $after->modify( '+' . (int) $this->get_recurrence() . ' seconds' ); - return $after; - } - - /** - * @return int - */ - public function interval_in_seconds() { - _deprecated_function( __METHOD__, '3.0.0', '(int)ActionScheduler_Abstract_RecurringSchedule::get_recurrence()' ); - return (int) $this->get_recurrence(); - } - - /** - * Serialize interval schedules with data required prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to - * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To guard against the - * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to - * also store the data with the old property names so if it's unserialized in AS < 3.0, - * the schedule doesn't end up with a null/false/0 recurrence. - * - * @return array - */ - public function __sleep() { - - $sleep_params = parent::__sleep(); - - $this->start_timestamp = $this->scheduled_timestamp; - $this->interval_in_seconds = $this->recurrence; - - return array_merge( $sleep_params, array( - 'start_timestamp', - 'interval_in_seconds' - ) ); - } - - /** - * Unserialize interval schedules serialized/stored prior to AS 3.0.0 - * - * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). - */ - public function __wakeup() { - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { - $this->scheduled_timestamp = $this->start_timestamp; - unset( $this->start_timestamp ); - } - - if ( is_null( $this->recurrence ) && ! is_null( $this->interval_in_seconds ) ) { - $this->recurrence = $this->interval_in_seconds; - unset( $this->interval_in_seconds ); - } - parent::__wakeup(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php b/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php deleted file mode 100644 index 1b1afec..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php +++ /dev/null @@ -1,31 +0,0 @@ -scheduled_date = null; - } - - /** - * This schedule has no scheduled DateTime, so we need to override the parent __sleep() - * @return array - */ - public function __sleep() { - return array(); - } - - public function __wakeup() { - $this->scheduled_date = null; - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_Schedule.php b/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_Schedule.php deleted file mode 100644 index d61a9f7..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schedules/ActionScheduler_Schedule.php +++ /dev/null @@ -1,18 +0,0 @@ -__wakeup() for details. - **/ - private $timestamp = NULL; - - /** - * @param DateTime $after - * - * @return DateTime|null - */ - public function calculate_next( DateTime $after ) { - return null; - } - - /** - * @return bool - */ - public function is_recurring() { - return false; - } - - /** - * Serialize schedule with data required prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To guard against the - * scheduled date for single actions always being seen as "now" if downgrading to - * Action Scheduler < 3.0.0, we need to also store the data with the old property names - * so if it's unserialized in AS < 3.0, the schedule doesn't end up with a null recurrence. - * - * @return array - */ - public function __sleep() { - - $sleep_params = parent::__sleep(); - - $this->timestamp = $this->scheduled_timestamp; - - return array_merge( $sleep_params, array( - 'timestamp', - ) ); - } - - /** - * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 - * - * Prior to Action Scheduler 3.0.0, schedules used different property names to refer - * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp - * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 - * aligned properties and property names for better inheritance. To maintain backward - * compatibility with schedules serialized and stored prior to 3.0, we need to correctly - * map the old property names with matching visibility. - */ - public function __wakeup() { - - if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->timestamp ) ) { - $this->scheduled_timestamp = $this->timestamp; - unset( $this->timestamp ); - } - parent::__wakeup(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php b/dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php deleted file mode 100644 index c52d37c..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php +++ /dev/null @@ -1,90 +0,0 @@ -tables = [ - self::LOG_TABLE, - ]; - } - - /** - * Performs additional setup work required to support this schema. - */ - public function init() { - add_action( 'action_scheduler_before_schema_update', array( $this, 'update_schema_3_0' ), 10, 2 ); - } - - protected function get_table_definition( $table ) { - global $wpdb; - $table_name = $wpdb->$table; - $charset_collate = $wpdb->get_charset_collate(); - switch ( $table ) { - - case self::LOG_TABLE: - - $default_date = ActionScheduler_StoreSchema::DEFAULT_DATE; - return "CREATE TABLE $table_name ( - log_id bigint(20) unsigned NOT NULL auto_increment, - action_id bigint(20) unsigned NOT NULL, - message text NOT NULL, - log_date_gmt datetime NULL default '{$default_date}', - log_date_local datetime NULL default '{$default_date}', - PRIMARY KEY (log_id), - KEY action_id (action_id), - KEY log_date_gmt (log_date_gmt) - ) $charset_collate"; - - default: - return ''; - } - } - - /** - * Update the logs table schema, allowing datetime fields to be NULL. - * - * This is needed because the NOT NULL constraint causes a conflict with some versions of MySQL - * configured with sql_mode=NO_ZERO_DATE, which can for instance lead to tables not being created. - * - * Most other schema updates happen via ActionScheduler_Abstract_Schema::update_table(), however - * that method relies on dbDelta() and this change is not possible when using that function. - * - * @param string $table Name of table being updated. - * @param string $db_version The existing schema version of the table. - */ - public function update_schema_3_0( $table, $db_version ) { - global $wpdb; - - if ( 'actionscheduler_logs' !== $table || version_compare( $db_version, '3', '>=' ) ) { - return; - } - - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - $table_name = $wpdb->prefix . 'actionscheduler_logs'; - $table_list = $wpdb->get_col( "SHOW TABLES LIKE '{$table_name}'" ); - $default_date = ActionScheduler_StoreSchema::DEFAULT_DATE; - - if ( ! empty( $table_list ) ) { - $query = " - ALTER TABLE {$table_name} - MODIFY COLUMN log_date_gmt datetime NULL default '{$default_date}', - MODIFY COLUMN log_date_local datetime NULL default '{$default_date}' - "; - $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - } -} diff --git a/dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php b/dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php deleted file mode 100644 index a894d4e..0000000 --- a/dependencies/woocommerce/action-scheduler/classes/schema/ActionScheduler_StoreSchema.php +++ /dev/null @@ -1,130 +0,0 @@ -tables = [ - self::ACTIONS_TABLE, - self::CLAIMS_TABLE, - self::GROUPS_TABLE, - ]; - } - - /** - * Performs additional setup work required to support this schema. - */ - public function init() { - add_action( 'action_scheduler_before_schema_update', array( $this, 'update_schema_5_0' ), 10, 2 ); - } - - protected function get_table_definition( $table ) { - global $wpdb; - $table_name = $wpdb->$table; - $charset_collate = $wpdb->get_charset_collate(); - $max_index_length = 191; // @see wp_get_db_schema() - $default_date = self::DEFAULT_DATE; - switch ( $table ) { - - case self::ACTIONS_TABLE: - - return "CREATE TABLE {$table_name} ( - action_id bigint(20) unsigned NOT NULL auto_increment, - hook varchar(191) NOT NULL, - status varchar(20) NOT NULL, - scheduled_date_gmt datetime NULL default '{$default_date}', - scheduled_date_local datetime NULL default '{$default_date}', - priority tinyint unsigned NOT NULL default '10', - args varchar($max_index_length), - schedule longtext, - group_id bigint(20) unsigned NOT NULL default '0', - attempts int(11) NOT NULL default '0', - last_attempt_gmt datetime NULL default '{$default_date}', - last_attempt_local datetime NULL default '{$default_date}', - claim_id bigint(20) unsigned NOT NULL default '0', - extended_args varchar(8000) DEFAULT NULL, - PRIMARY KEY (action_id), - KEY hook (hook($max_index_length)), - KEY status (status), - KEY scheduled_date_gmt (scheduled_date_gmt), - KEY args (args($max_index_length)), - KEY group_id (group_id), - KEY last_attempt_gmt (last_attempt_gmt), - KEY `claim_id_status_scheduled_date_gmt` (`claim_id`, `status`, `scheduled_date_gmt`) - ) $charset_collate"; - - case self::CLAIMS_TABLE: - - return "CREATE TABLE {$table_name} ( - claim_id bigint(20) unsigned NOT NULL auto_increment, - date_created_gmt datetime NULL default '{$default_date}', - PRIMARY KEY (claim_id), - KEY date_created_gmt (date_created_gmt) - ) $charset_collate"; - - case self::GROUPS_TABLE: - - return "CREATE TABLE {$table_name} ( - group_id bigint(20) unsigned NOT NULL auto_increment, - slug varchar(255) NOT NULL, - PRIMARY KEY (group_id), - KEY slug (slug($max_index_length)) - ) $charset_collate"; - - default: - return ''; - } - } - - /** - * Update the actions table schema, allowing datetime fields to be NULL. - * - * This is needed because the NOT NULL constraint causes a conflict with some versions of MySQL - * configured with sql_mode=NO_ZERO_DATE, which can for instance lead to tables not being created. - * - * Most other schema updates happen via ActionScheduler_Abstract_Schema::update_table(), however - * that method relies on dbDelta() and this change is not possible when using that function. - * - * @param string $table Name of table being updated. - * @param string $db_version The existing schema version of the table. - */ - public function update_schema_5_0( $table, $db_version ) { - global $wpdb; - - if ( 'actionscheduler_actions' !== $table || version_compare( $db_version, '5', '>=' ) ) { - return; - } - - // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - $table_name = $wpdb->prefix . 'actionscheduler_actions'; - $table_list = $wpdb->get_col( "SHOW TABLES LIKE '{$table_name}'" ); - $default_date = self::DEFAULT_DATE; - - if ( ! empty( $table_list ) ) { - $query = " - ALTER TABLE {$table_name} - MODIFY COLUMN scheduled_date_gmt datetime NULL default '{$default_date}', - MODIFY COLUMN scheduled_date_local datetime NULL default '{$default_date}', - MODIFY COLUMN last_attempt_gmt datetime NULL default '{$default_date}', - MODIFY COLUMN last_attempt_local datetime NULL default '{$default_date}' - "; - $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - } - // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared - } -} diff --git a/dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php b/dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php deleted file mode 100644 index dac17aa..0000000 --- a/dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php +++ /dev/null @@ -1,27 +0,0 @@ -get_date(); - $replacement_method = 'get_date()'; - } else { - $return_value = $this->get_next( $after ); - $replacement_method = 'get_next( $after )'; - } - - _deprecated_function( __METHOD__, '3.0.0', __CLASS__ . '::' . $replacement_method ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - - return $return_value; - } -} diff --git a/dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php b/dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php deleted file mode 100644 index 002dc75..0000000 --- a/dependencies/woocommerce/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php +++ /dev/null @@ -1,49 +0,0 @@ -mark_failure( $action_id ); - } - - /** - * Add base hooks - * - * @since 2.2.6 - */ - protected static function hook() { - _deprecated_function( __METHOD__, '3.0.0' ); - } - - /** - * Remove base hooks - * - * @since 2.2.6 - */ - protected static function unhook() { - _deprecated_function( __METHOD__, '3.0.0' ); - } - - /** - * Get the site's local time. - * - * @deprecated 2.1.0 - * @return DateTimeZone - */ - protected function get_local_timezone() { - _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' ); - return ActionScheduler_TimezoneHelper::get_local_timezone(); - } -} diff --git a/dependencies/woocommerce/action-scheduler/deprecated/functions.php b/dependencies/woocommerce/action-scheduler/deprecated/functions.php deleted file mode 100644 index f782c4b..0000000 --- a/dependencies/woocommerce/action-scheduler/deprecated/functions.php +++ /dev/null @@ -1,126 +0,0 @@ - '' - the name of the action that will be triggered - * 'args' => NULL - the args array that will be passed with the action - * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '=' - * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '=' - * 'group' => '' - the group the action belongs to - * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING - * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID - * 'per_page' => 5 - Number of results to return - * 'offset' => 0 - * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date' - * 'order' => 'ASC' - * @param string $return_format OBJECT, ARRAY_A, or ids - * - * @deprecated 2.1.0 - * - * @return array - */ -function wc_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { - _deprecated_function( __FUNCTION__, '2.1.0', 'as_get_scheduled_actions()' ); - return as_get_scheduled_actions( $args, $return_format ); -} diff --git a/dependencies/woocommerce/action-scheduler/functions.php b/dependencies/woocommerce/action-scheduler/functions.php deleted file mode 100644 index 9770f4f..0000000 --- a/dependencies/woocommerce/action-scheduler/functions.php +++ /dev/null @@ -1,492 +0,0 @@ -create( - array( - 'type' => 'async', - 'hook' => $hook, - 'arguments' => $args, - 'group' => $group, - 'unique' => $unique, - 'priority' => $priority, - ) - ); -} - -/** - * Schedule an action to run one time - * - * @param int $timestamp When the job will run. - * @param string $hook The hook to trigger. - * @param array $args Arguments to pass when the hook triggers. - * @param string $group The group to assign this job to. - * @param bool $unique Whether the action should be unique. - * @param int $priority Lower values take precedence over higher values. Defaults to 10, with acceptable values falling in the range 0-255. - * - * @return int The action ID. - */ -function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - - /** - * Provides an opportunity to short-circuit the default process for enqueuing single - * actions. - * - * Returning a value other than null from the filter will short-circuit the normal - * process. The expectation in such a scenario is that callbacks will return an integer - * representing the scheduled action ID (scheduled using some alternative process) or else - * zero. - * - * @param int|null $pre_option The value to return instead of the option value. - * @param int $timestamp When the action will run. - * @param string $hook Action hook. - * @param array $args Action arguments. - * @param string $group Action group. - * @param int $priorities Action priority. - */ - $pre = apply_filters( 'pre_as_schedule_single_action', null, $timestamp, $hook, $args, $group, $priority ); - if ( null !== $pre ) { - return is_int( $pre ) ? $pre : 0; - } - - return ActionScheduler::factory()->create( - array( - 'type' => 'single', - 'hook' => $hook, - 'arguments' => $args, - 'when' => $timestamp, - 'group' => $group, - 'unique' => $unique, - 'priority' => $priority, - ) - ); -} - -/** - * Schedule a recurring action - * - * @param int $timestamp When the first instance of the job will run. - * @param int $interval_in_seconds How long to wait between runs. - * @param string $hook The hook to trigger. - * @param array $args Arguments to pass when the hook triggers. - * @param string $group The group to assign this job to. - * @param bool $unique Whether the action should be unique. - * @param int $priority Lower values take precedence over higher values. Defaults to 10, with acceptable values falling in the range 0-255. - * - * @return int The action ID. - */ -function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - - $interval = (int) $interval_in_seconds; - - // We expect an integer and allow it to be passed using float and string types, but otherwise - // should reject unexpected values. - if ( ! is_numeric( $interval_in_seconds ) || $interval_in_seconds != $interval ) { - _doing_it_wrong( - __METHOD__, - sprintf( - /* translators: 1: provided value 2: provided type. */ - esc_html__( 'An integer was expected but "%1$s" (%2$s) was received.', 'action-scheduler' ), - esc_html( $interval_in_seconds ), - esc_html( gettype( $interval_in_seconds ) ) - ), - '3.6.0' - ); - - return 0; - } - - /** - * Provides an opportunity to short-circuit the default process for enqueuing recurring - * actions. - * - * Returning a value other than null from the filter will short-circuit the normal - * process. The expectation in such a scenario is that callbacks will return an integer - * representing the scheduled action ID (scheduled using some alternative process) or else - * zero. - * - * @param int|null $pre_option The value to return instead of the option value. - * @param int $timestamp When the action will run. - * @param int $interval_in_seconds How long to wait between runs. - * @param string $hook Action hook. - * @param array $args Action arguments. - * @param string $group Action group. - * @param int $priority Action priority. - */ - $pre = apply_filters( 'pre_as_schedule_recurring_action', null, $timestamp, $interval_in_seconds, $hook, $args, $group, $priority ); - if ( null !== $pre ) { - return is_int( $pre ) ? $pre : 0; - } - - return ActionScheduler::factory()->create( - array( - 'type' => 'recurring', - 'hook' => $hook, - 'arguments' => $args, - 'when' => $timestamp, - 'pattern' => $interval_in_seconds, - 'group' => $group, - 'unique' => $unique, - 'priority' => $priority, - ) - ); -} - -/** - * Schedule an action that recurs on a cron-like schedule. - * - * @param int $timestamp The first instance of the action will be scheduled - * to run at a time calculated after this timestamp matching the cron - * expression. This can be used to delay the first instance of the action. - * @param string $schedule A cron-link schedule string. - * @see http://en.wikipedia.org/wiki/Cron - * * * * * * * - * ┬ ┬ ┬ ┬ ┬ ┬ - * | | | | | | - * | | | | | + year [optional] - * | | | | +----- day of week (0 - 7) (Sunday=0 or 7) - * | | | +---------- month (1 - 12) - * | | +--------------- day of month (1 - 31) - * | +-------------------- hour (0 - 23) - * +------------------------- min (0 - 59) - * @param string $hook The hook to trigger. - * @param array $args Arguments to pass when the hook triggers. - * @param string $group The group to assign this job to. - * @param bool $unique Whether the action should be unique. - * @param int $priority Lower values take precedence over higher values. Defaults to 10, with acceptable values falling in the range 0-255. - * - * @return int The action ID. - */ -function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - - /** - * Provides an opportunity to short-circuit the default process for enqueuing cron - * actions. - * - * Returning a value other than null from the filter will short-circuit the normal - * process. The expectation in such a scenario is that callbacks will return an integer - * representing the scheduled action ID (scheduled using some alternative process) or else - * zero. - * - * @param int|null $pre_option The value to return instead of the option value. - * @param int $timestamp When the action will run. - * @param string $schedule Cron-like schedule string. - * @param string $hook Action hook. - * @param array $args Action arguments. - * @param string $group Action group. - * @param int $priority Action priority. - */ - $pre = apply_filters( 'pre_as_schedule_cron_action', null, $timestamp, $schedule, $hook, $args, $group, $priority ); - if ( null !== $pre ) { - return is_int( $pre ) ? $pre : 0; - } - - return ActionScheduler::factory()->create( - array( - 'type' => 'cron', - 'hook' => $hook, - 'arguments' => $args, - 'when' => $timestamp, - 'pattern' => $schedule, - 'group' => $group, - 'unique' => $unique, - 'priority' => $priority, - ) - ); -} - -/** - * Cancel the next occurrence of a scheduled action. - * - * While only the next instance of a recurring or cron action is unscheduled by this method, that will also prevent - * all future instances of that recurring or cron action from being run. Recurring and cron actions are scheduled in - * a sequence instead of all being scheduled at once. Each successive occurrence of a recurring action is scheduled - * only after the former action is run. If the next instance is never run, because it's unscheduled by this function, - * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled - * by this method also. - * - * @param string $hook The hook that the job will trigger. - * @param array $args Args that would have been passed to the job. - * @param string $group The group the job is assigned to. - * - * @return int|null The scheduled action ID if a scheduled action was found, or null if no matching action found. - */ -function as_unschedule_action( $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return 0; - } - $params = array( - 'hook' => $hook, - 'status' => ActionScheduler_Store::STATUS_PENDING, - 'orderby' => 'date', - 'order' => 'ASC', - 'group' => $group, - ); - if ( is_array( $args ) ) { - $params['args'] = $args; - } - - $action_id = ActionScheduler::store()->query_action( $params ); - - if ( $action_id ) { - try { - ActionScheduler::store()->cancel_action( $action_id ); - } catch ( Exception $exception ) { - ActionScheduler::logger()->log( - $action_id, - sprintf( - /* translators: %s is the name of the hook to be cancelled. */ - __( 'Caught exception while cancelling action: %s', 'action-scheduler' ), - esc_attr( $hook ) - ) - ); - - $action_id = null; - } - } - - return $action_id; -} - -/** - * Cancel all occurrences of a scheduled action. - * - * @param string $hook The hook that the job will trigger. - * @param array $args Args that would have been passed to the job. - * @param string $group The group the job is assigned to. - */ -function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return; - } - if ( empty( $args ) ) { - if ( ! empty( $hook ) && empty( $group ) ) { - ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook ); - return; - } - if ( ! empty( $group ) && empty( $hook ) ) { - ActionScheduler_Store::instance()->cancel_actions_by_group( $group ); - return; - } - } - do { - $unscheduled_action = as_unschedule_action( $hook, $args, $group ); - } while ( ! empty( $unscheduled_action ) ); -} - -/** - * Check if there is an existing action in the queue with a given hook, args and group combination. - * - * An action in the queue could be pending, in-progress or async. If the is pending for a time in - * future, its scheduled date will be returned as a timestamp. If it is currently being run, or an - * async action sitting in the queue waiting to be processed, in which case boolean true will be - * returned. Or there may be no async, in-progress or pending action for this hook, in which case, - * boolean false will be the return value. - * - * @param string $hook Name of the hook to search for. - * @param array $args Arguments of the action to be searched. - * @param string $group Group of the action to be searched. - * - * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action. - */ -function as_next_scheduled_action( $hook, $args = null, $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return false; - } - - $params = array( - 'hook' => $hook, - 'orderby' => 'date', - 'order' => 'ASC', - 'group' => $group, - ); - - if ( is_array( $args ) ) { - $params['args'] = $args; - } - - $params['status'] = ActionScheduler_Store::STATUS_RUNNING; - $action_id = ActionScheduler::store()->query_action( $params ); - if ( $action_id ) { - return true; - } - - $params['status'] = ActionScheduler_Store::STATUS_PENDING; - $action_id = ActionScheduler::store()->query_action( $params ); - if ( null === $action_id ) { - return false; - } - - $action = ActionScheduler::store()->fetch_action( $action_id ); - $scheduled_date = $action->get_schedule()->get_date(); - if ( $scheduled_date ) { - return (int) $scheduled_date->format( 'U' ); - } elseif ( null === $scheduled_date ) { // pending async action with NullSchedule. - return true; - } - - return false; -} - -/** - * Check if there is a scheduled action in the queue but more efficiently than as_next_scheduled_action(). - * - * It's recommended to use this function when you need to know whether a specific action is currently scheduled - * (pending or in-progress). - * - * @since 3.3.0 - * - * @param string $hook The hook of the action. - * @param array $args Args that have been passed to the action. Null will matches any args. - * @param string $group The group the job is assigned to. - * - * @return bool True if a matching action is pending or in-progress, false otherwise. - */ -function as_has_scheduled_action( $hook, $args = null, $group = '' ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return false; - } - - $query_args = array( - 'hook' => $hook, - 'status' => array( ActionScheduler_Store::STATUS_RUNNING, ActionScheduler_Store::STATUS_PENDING ), - 'group' => $group, - 'orderby' => 'none', - ); - - if ( null !== $args ) { - $query_args['args'] = $args; - } - - $action_id = ActionScheduler::store()->query_action( $query_args ); - - return null !== $action_id; -} - -/** - * Find scheduled actions - * - * @param array $args Possible arguments, with their default values. - * 'hook' => '' - the name of the action that will be triggered. - * 'args' => NULL - the args array that will be passed with the action. - * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='. - * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. - * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='. - * 'group' => '' - the group the action belongs to. - * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING. - * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID. - * 'per_page' => 5 - Number of results to return. - * 'offset' => 0. - * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', 'date' or 'none'. - * 'order' => 'ASC'. - * - * @param string $return_format OBJECT, ARRAY_A, or ids. - * - * @return array - */ -function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { - if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { - return array(); - } - $store = ActionScheduler::store(); - foreach ( array( 'date', 'modified' ) as $key ) { - if ( isset( $args[ $key ] ) ) { - $args[ $key ] = as_get_datetime_object( $args[ $key ] ); - } - } - $ids = $store->query_actions( $args ); - - if ( 'ids' === $return_format || 'int' === $return_format ) { - return $ids; - } - - $actions = array(); - foreach ( $ids as $action_id ) { - $actions[ $action_id ] = $store->fetch_action( $action_id ); - } - - if ( ARRAY_A == $return_format ) { - foreach ( $actions as $action_id => $action_object ) { - $actions[ $action_id ] = get_object_vars( $action_object ); - } - } - - return $actions; -} - -/** - * Helper function to create an instance of DateTime based on a given - * string and timezone. By default, will return the current date/time - * in the UTC timezone. - * - * Needed because new DateTime() called without an explicit timezone - * will create a date/time in PHP's timezone, but we need to have - * assurance that a date/time uses the right timezone (which we almost - * always want to be UTC), which means we need to always include the - * timezone when instantiating datetimes rather than leaving it up to - * the PHP default. - * - * @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php. - * @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php. - * - * @return ActionScheduler_DateTime - */ -function as_get_datetime_object( $date_string = null, $timezone = 'UTC' ) { - if ( is_object( $date_string ) && $date_string instanceof DateTime ) { - $date = new ActionScheduler_DateTime( $date_string->format( 'Y-m-d H:i:s' ), new DateTimeZone( $timezone ) ); - } elseif ( is_numeric( $date_string ) ) { - $date = new ActionScheduler_DateTime( '@' . $date_string, new DateTimeZone( $timezone ) ); - } else { - $date = new ActionScheduler_DateTime( null === $date_string ? 'now' : $date_string, new DateTimeZone( $timezone ) ); - } - return $date; -} diff --git a/dependencies/woocommerce/action-scheduler/lib/WP_Async_Request.php b/dependencies/woocommerce/action-scheduler/lib/WP_Async_Request.php deleted file mode 100644 index ff5e29b..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/WP_Async_Request.php +++ /dev/null @@ -1,191 +0,0 @@ -identifier = $this->prefix . '_' . $this->action; - - add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) ); - add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) ); - } - - /** - * Set data used during the request - * - * @param array $data Data. - * - * @return $this - */ - public function data( $data ) { - $this->data = $data; - - return $this; - } - - /** - * Dispatch the async request - * - * @return array|WP_Error - */ - public function dispatch() { - $url = add_query_arg( $this->get_query_args(), $this->get_query_url() ); - $args = $this->get_post_args(); - - return wp_remote_post( esc_url_raw( $url ), $args ); - } - - /** - * Get query args - * - * @return array - */ - protected function get_query_args() { - if ( property_exists( $this, 'query_args' ) ) { - return $this->query_args; - } - - $args = array( - 'action' => $this->identifier, - 'nonce' => wp_create_nonce( $this->identifier ), - ); - - /** - * Filters the post arguments used during an async request. - * - * @param array $url - */ - return apply_filters( $this->identifier . '_query_args', $args ); - } - - /** - * Get query URL - * - * @return string - */ - protected function get_query_url() { - if ( property_exists( $this, 'query_url' ) ) { - return $this->query_url; - } - - $url = admin_url( 'admin-ajax.php' ); - - /** - * Filters the post arguments used during an async request. - * - * @param string $url - */ - return apply_filters( $this->identifier . '_query_url', $url ); - } - - /** - * Get post args - * - * @return array - */ - protected function get_post_args() { - if ( property_exists( $this, 'post_args' ) ) { - return $this->post_args; - } - - $args = array( - 'timeout' => 0.01, - 'blocking' => false, - 'body' => $this->data, - 'cookies' => $_COOKIE, - 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), - ); - - /** - * Filters the post arguments used during an async request. - * - * @param array $args - */ - return apply_filters( $this->identifier . '_post_args', $args ); - } - - /** - * Maybe handle - * - * Check for correct nonce and pass to handler. - */ - public function maybe_handle() { - // Don't lock up other requests while processing - session_write_close(); - - check_ajax_referer( $this->identifier, 'nonce' ); - - $this->handle(); - - wp_die(); - } - - /** - * Handle - * - * Override this method to perform any actions required - * during the async request. - */ - abstract protected function handle(); - - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression.php deleted file mode 100644 index 7f33c37..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression.php +++ /dev/null @@ -1,318 +0,0 @@ - - * @link http://en.wikipedia.org/wiki/Cron - */ -class CronExpression -{ - const MINUTE = 0; - const HOUR = 1; - const DAY = 2; - const MONTH = 3; - const WEEKDAY = 4; - const YEAR = 5; - - /** - * @var array CRON expression parts - */ - private $cronParts; - - /** - * @var CronExpression_FieldFactory CRON field factory - */ - private $fieldFactory; - - /** - * @var array Order in which to test of cron parts - */ - private static $order = array(self::YEAR, self::MONTH, self::DAY, self::WEEKDAY, self::HOUR, self::MINUTE); - - /** - * Factory method to create a new CronExpression. - * - * @param string $expression The CRON expression to create. There are - * several special predefined values which can be used to substitute the - * CRON expression: - * - * @yearly, @annually) - Run once a year, midnight, Jan. 1 - 0 0 1 1 * - * @monthly - Run once a month, midnight, first of month - 0 0 1 * * - * @weekly - Run once a week, midnight on Sun - 0 0 * * 0 - * @daily - Run once a day, midnight - 0 0 * * * - * @hourly - Run once an hour, first minute - 0 * * * * - * -*@param CronExpression_FieldFactory $fieldFactory (optional) Field factory to use - * - * @return CronExpression - */ - public static function factory($expression, CronExpression_FieldFactory $fieldFactory = null) - { - $mappings = array( - '@yearly' => '0 0 1 1 *', - '@annually' => '0 0 1 1 *', - '@monthly' => '0 0 1 * *', - '@weekly' => '0 0 * * 0', - '@daily' => '0 0 * * *', - '@hourly' => '0 * * * *' - ); - - if (isset($mappings[$expression])) { - $expression = $mappings[$expression]; - } - - return new self($expression, $fieldFactory ? $fieldFactory : new CronExpression_FieldFactory()); - } - - /** - * Parse a CRON expression - * - * @param string $expression CRON expression (e.g. '8 * * * *') - * @param CronExpression_FieldFactory $fieldFactory Factory to create cron fields - */ - public function __construct($expression, CronExpression_FieldFactory $fieldFactory) - { - $this->fieldFactory = $fieldFactory; - $this->setExpression($expression); - } - - /** - * Set or change the CRON expression - * - * @param string $value CRON expression (e.g. 8 * * * *) - * - * @return CronExpression - * @throws InvalidArgumentException if not a valid CRON expression - */ - public function setExpression($value) - { - $this->cronParts = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY); - if (count($this->cronParts) < 5) { - throw new InvalidArgumentException( - $value . ' is not a valid CRON expression' - ); - } - - foreach ($this->cronParts as $position => $part) { - $this->setPart($position, $part); - } - - return $this; - } - - /** - * Set part of the CRON expression - * - * @param int $position The position of the CRON expression to set - * @param string $value The value to set - * - * @return CronExpression - * @throws InvalidArgumentException if the value is not valid for the part - */ - public function setPart($position, $value) - { - if (!$this->fieldFactory->getField($position)->validate($value)) { - throw new InvalidArgumentException( - 'Invalid CRON field value ' . $value . ' as position ' . $position - ); - } - - $this->cronParts[$position] = $value; - - return $this; - } - - /** - * Get a next run date relative to the current date or a specific date - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param int $nth (optional) Number of matches to skip before returning a - * matching next run date. 0, the default, will return the current - * date and time if the next run date falls on the current date and - * time. Setting this value to 1 will skip the first match and go to - * the second match. Setting this value to 2 will skip the first 2 - * matches and so on. - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return DateTime - * @throws RuntimeException on too many iterations - */ - public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) - { - return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate); - } - - /** - * Get a previous run date relative to the current date or a specific date - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param int $nth (optional) Number of matches to skip before returning - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return DateTime - * @throws RuntimeException on too many iterations - * @see CronExpression::getNextRunDate - */ - public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) - { - return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate); - } - - /** - * Get multiple run dates starting at the current date or a specific date - * - * @param int $total Set the total number of dates to calculate - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param bool $invert (optional) Set to TRUE to retrieve previous dates - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return array Returns an array of run dates - */ - public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false) - { - $matches = array(); - for ($i = 0; $i < max(0, $total); $i++) { - $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate); - } - - return $matches; - } - - /** - * Get all or part of the CRON expression - * - * @param string $part (optional) Specify the part to retrieve or NULL to - * get the full cron schedule string. - * - * @return string|null Returns the CRON expression, a part of the - * CRON expression, or NULL if the part was specified but not found - */ - public function getExpression($part = null) - { - if (null === $part) { - return implode(' ', $this->cronParts); - } elseif (array_key_exists($part, $this->cronParts)) { - return $this->cronParts[$part]; - } - - return null; - } - - /** - * Helper method to output the full expression. - * - * @return string Full CRON expression - */ - public function __toString() - { - return $this->getExpression(); - } - - /** - * Determine if the cron is due to run based on the current date or a - * specific date. This method assumes that the current number of - * seconds are irrelevant, and should be called once per minute. - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * - * @return bool Returns TRUE if the cron is due to run or FALSE if not - */ - public function isDue($currentTime = 'now') - { - if ('now' === $currentTime) { - $currentDate = date('Y-m-d H:i'); - $currentTime = strtotime($currentDate); - } elseif ($currentTime instanceof DateTime) { - $currentDate = $currentTime->format('Y-m-d H:i'); - $currentTime = strtotime($currentDate); - } else { - $currentTime = new DateTime($currentTime); - $currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0); - $currentDate = $currentTime->format('Y-m-d H:i'); - $currentTime = (int)($currentTime->getTimestamp()); - } - - return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime; - } - - /** - * Get the next or previous run date of the expression relative to a date - * - * @param string|DateTime $currentTime (optional) Relative calculation date - * @param int $nth (optional) Number of matches to skip before returning - * @param bool $invert (optional) Set to TRUE to go backwards in time - * @param bool $allowCurrentDate (optional) Set to TRUE to return the - * current date if it matches the cron expression - * - * @return DateTime - * @throws RuntimeException on too many iterations - */ - protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false) - { - if ($currentTime instanceof DateTime) { - $currentDate = $currentTime; - } else { - $currentDate = new DateTime($currentTime ? $currentTime : 'now'); - $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); - } - - $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); - $nextRun = clone $currentDate; - $nth = (int) $nth; - - // Set a hard limit to bail on an impossible date - for ($i = 0; $i < 1000; $i++) { - - foreach (self::$order as $position) { - $part = $this->getExpression($position); - if (null === $part) { - continue; - } - - $satisfied = false; - // Get the field object used to validate this part - $field = $this->fieldFactory->getField($position); - // Check if this is singular or a list - if (strpos($part, ',') === false) { - $satisfied = $field->isSatisfiedBy($nextRun, $part); - } else { - foreach (array_map('trim', explode(',', $part)) as $listPart) { - if ($field->isSatisfiedBy($nextRun, $listPart)) { - $satisfied = true; - break; - } - } - } - - // If the field is not satisfied, then start over - if (!$satisfied) { - $field->increment($nextRun, $invert); - continue 2; - } - } - - // Skip this match if needed - if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) { - $this->fieldFactory->getField(0)->increment($nextRun, $invert); - continue; - } - - return $nextRun; - } - - // @codeCoverageIgnoreStart - throw new RuntimeException('Impossible CRON expression'); - // @codeCoverageIgnoreEnd - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php deleted file mode 100644 index f8d5c00..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php +++ /dev/null @@ -1,100 +0,0 @@ - - */ -abstract class CronExpression_AbstractField implements CronExpression_FieldInterface -{ - /** - * Check to see if a field is satisfied by a value - * - * @param string $dateValue Date value to check - * @param string $value Value to test - * - * @return bool - */ - public function isSatisfied($dateValue, $value) - { - if ($this->isIncrementsOfRanges($value)) { - return $this->isInIncrementsOfRanges($dateValue, $value); - } elseif ($this->isRange($value)) { - return $this->isInRange($dateValue, $value); - } - - return $value == '*' || $dateValue == $value; - } - - /** - * Check if a value is a range - * - * @param string $value Value to test - * - * @return bool - */ - public function isRange($value) - { - return strpos($value, '-') !== false; - } - - /** - * Check if a value is an increments of ranges - * - * @param string $value Value to test - * - * @return bool - */ - public function isIncrementsOfRanges($value) - { - return strpos($value, '/') !== false; - } - - /** - * Test if a value is within a range - * - * @param string $dateValue Set date value - * @param string $value Value to test - * - * @return bool - */ - public function isInRange($dateValue, $value) - { - $parts = array_map('trim', explode('-', $value, 2)); - - return $dateValue >= $parts[0] && $dateValue <= $parts[1]; - } - - /** - * Test if a value is within an increments of ranges (offset[-to]/step size) - * - * @param string $dateValue Set date value - * @param string $value Value to test - * - * @return bool - */ - public function isInIncrementsOfRanges($dateValue, $value) - { - $parts = array_map('trim', explode('/', $value, 2)); - $stepSize = isset($parts[1]) ? $parts[1] : 0; - if ($parts[0] == '*' || $parts[0] === '0') { - return (int) $dateValue % $stepSize == 0; - } - - $range = explode('-', $parts[0], 2); - $offset = $range[0]; - $to = isset($range[1]) ? $range[1] : $dateValue; - // Ensure that the date value is within the range - if ($dateValue < $offset || $dateValue > $to) { - return false; - } - - for ($i = $offset; $i <= $to; $i+= $stepSize) { - if ($i == $dateValue) { - return true; - } - } - - return false; - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php deleted file mode 100644 index 40c1d6c..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php +++ /dev/null @@ -1,110 +0,0 @@ - - */ -class CronExpression_DayOfMonthField extends CronExpression_AbstractField -{ - /** - * Get the nearest day of the week for a given day in a month - * - * @param int $currentYear Current year - * @param int $currentMonth Current month - * @param int $targetDay Target day of the month - * - * @return DateTime Returns the nearest date - */ - private static function getNearestWeekday($currentYear, $currentMonth, $targetDay) - { - $tday = str_pad($targetDay, 2, '0', STR_PAD_LEFT); - $target = new DateTime("$currentYear-$currentMonth-$tday"); - $currentWeekday = (int) $target->format('N'); - - if ($currentWeekday < 6) { - return $target; - } - - $lastDayOfMonth = $target->format('t'); - - foreach (array(-1, 1, -2, 2) as $i) { - $adjusted = $targetDay + $i; - if ($adjusted > 0 && $adjusted <= $lastDayOfMonth) { - $target->setDate($currentYear, $currentMonth, $adjusted); - if ($target->format('N') < 6 && $target->format('m') == $currentMonth) { - return $target; - } - } - } - } - - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - // ? states that the field value is to be skipped - if ($value == '?') { - return true; - } - - $fieldValue = $date->format('d'); - - // Check to see if this is the last day of the month - if ($value == 'L') { - return $fieldValue == $date->format('t'); - } - - // Check to see if this is the nearest weekday to a particular value - if (strpos($value, 'W')) { - // Parse the target day - $targetDay = substr($value, 0, strpos($value, 'W')); - // Find out if the current day is the nearest day of the week - return $date->format('j') == self::getNearestWeekday( - $date->format('Y'), - $date->format('m'), - $targetDay - )->format('j'); - } - - return $this->isSatisfied($date->format('d'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('previous day'); - $date->setTime(23, 59); - } else { - $date->modify('next day'); - $date->setTime(0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-\?LW0-9A-Za-z]+/', $value); - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php deleted file mode 100644 index e9f68a7..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php +++ /dev/null @@ -1,124 +0,0 @@ - - */ -class CronExpression_DayOfWeekField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - if ($value == '?') { - return true; - } - - // Convert text day of the week values to integers - $value = str_ireplace( - array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'), - range(0, 6), - $value - ); - - $currentYear = $date->format('Y'); - $currentMonth = $date->format('m'); - $lastDayOfMonth = $date->format('t'); - - // Find out if this is the last specific weekday of the month - if (strpos($value, 'L')) { - $weekday = str_replace('7', '0', substr($value, 0, strpos($value, 'L'))); - $tdate = clone $date; - $tdate->setDate($currentYear, $currentMonth, $lastDayOfMonth); - while ($tdate->format('w') != $weekday) { - $tdate->setDate($currentYear, $currentMonth, --$lastDayOfMonth); - } - - return $date->format('j') == $lastDayOfMonth; - } - - // Handle # hash tokens - if (strpos($value, '#')) { - list($weekday, $nth) = explode('#', $value); - // Validate the hash fields - if ($weekday < 1 || $weekday > 5) { - throw new InvalidArgumentException("Weekday must be a value between 1 and 5. {$weekday} given"); - } - if ($nth > 5) { - throw new InvalidArgumentException('There are never more than 5 of a given weekday in a month'); - } - // The current weekday must match the targeted weekday to proceed - if ($date->format('N') != $weekday) { - return false; - } - - $tdate = clone $date; - $tdate->setDate($currentYear, $currentMonth, 1); - $dayCount = 0; - $currentDay = 1; - while ($currentDay < $lastDayOfMonth + 1) { - if ($tdate->format('N') == $weekday) { - if (++$dayCount >= $nth) { - break; - } - } - $tdate->setDate($currentYear, $currentMonth, ++$currentDay); - } - - return $date->format('j') == $currentDay; - } - - // Handle day of the week values - if (strpos($value, '-')) { - $parts = explode('-', $value); - if ($parts[0] == '7') { - $parts[0] = '0'; - } elseif ($parts[1] == '0') { - $parts[1] = '7'; - } - $value = implode('-', $parts); - } - - // Test to see which Sunday to use -- 0 == 7 == Sunday - $format = in_array(7, str_split($value)) ? 'N' : 'w'; - $fieldValue = $date->format($format); - - return $this->isSatisfied($fieldValue, $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('-1 day'); - $date->setTime(23, 59, 0); - } else { - $date->modify('+1 day'); - $date->setTime(0, 0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php deleted file mode 100644 index 556ba1a..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @link http://en.wikipedia.org/wiki/Cron - */ -class CronExpression_FieldFactory -{ - /** - * @var array Cache of instantiated fields - */ - private $fields = array(); - - /** - * Get an instance of a field object for a cron expression position - * - * @param int $position CRON expression position value to retrieve - * - * @return CronExpression_FieldInterface - * @throws InvalidArgumentException if a position is not valid - */ - public function getField($position) - { - if (!isset($this->fields[$position])) { - switch ($position) { - case 0: - $this->fields[$position] = new CronExpression_MinutesField(); - break; - case 1: - $this->fields[$position] = new CronExpression_HoursField(); - break; - case 2: - $this->fields[$position] = new CronExpression_DayOfMonthField(); - break; - case 3: - $this->fields[$position] = new CronExpression_MonthField(); - break; - case 4: - $this->fields[$position] = new CronExpression_DayOfWeekField(); - break; - case 5: - $this->fields[$position] = new CronExpression_YearField(); - break; - default: - throw new InvalidArgumentException( - $position . ' is not a valid position' - ); - } - } - - return $this->fields[$position]; - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php deleted file mode 100644 index 5d5109b..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ -interface CronExpression_FieldInterface -{ - /** - * Check if the respective value of a DateTime field satisfies a CRON exp - * - * @param DateTime $date DateTime object to check - * @param string $value CRON expression to test against - * - * @return bool Returns TRUE if satisfied, FALSE otherwise - */ - public function isSatisfiedBy(DateTime $date, $value); - - /** - * When a CRON expression is not satisfied, this method is used to increment - * or decrement a DateTime object by the unit of the cron field - * - * @param DateTime $date DateTime object to change - * @param bool $invert (optional) Set to TRUE to decrement - * - * @return CronExpression_FieldInterface - */ - public function increment(DateTime $date, $invert = false); - - /** - * Validates a CRON expression for a given field - * - * @param string $value CRON expression value to validate - * - * @return bool Returns TRUE if valid, FALSE otherwise - */ - public function validate($value); -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_HoursField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_HoursField.php deleted file mode 100644 index 088ca73..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_HoursField.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ -class CronExpression_HoursField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - return $this->isSatisfied($date->format('H'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - // Change timezone to UTC temporarily. This will - // allow us to go back or forwards and hour even - // if DST will be changed between the hours. - $timezone = $date->getTimezone(); - $date->setTimezone(new DateTimeZone('UTC')); - if ($invert) { - $date->modify('-1 hour'); - $date->setTime($date->format('H'), 59); - } else { - $date->modify('+1 hour'); - $date->setTime($date->format('H'), 0); - } - $date->setTimezone($timezone); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9]+/', $value); - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php deleted file mode 100644 index 436acf2..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ -class CronExpression_MinutesField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - return $this->isSatisfied($date->format('i'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('-1 minute'); - } else { - $date->modify('+1 minute'); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9]+/', $value); - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MonthField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MonthField.php deleted file mode 100644 index d3deb12..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_MonthField.php +++ /dev/null @@ -1,55 +0,0 @@ - - */ -class CronExpression_MonthField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - // Convert text month values to integers - $value = str_ireplace( - array( - 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', - 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' - ), - range(1, 12), - $value - ); - - return $this->isSatisfied($date->format('m'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - // $date->modify('last day of previous month'); // remove for php 5.2 compat - $date->modify('previous month'); - $date->modify($date->format('Y-m-t')); - $date->setTime(23, 59); - } else { - //$date->modify('first day of next month'); // remove for php 5.2 compat - $date->modify('next month'); - $date->modify($date->format('Y-m-01')); - $date->setTime(0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); - } -} diff --git a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_YearField.php b/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_YearField.php deleted file mode 100644 index f11562e..0000000 --- a/dependencies/woocommerce/action-scheduler/lib/cron-expression/CronExpression_YearField.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ -class CronExpression_YearField extends CronExpression_AbstractField -{ - /** - * {@inheritdoc} - */ - public function isSatisfiedBy(DateTime $date, $value) - { - return $this->isSatisfied($date->format('Y'), $value); - } - - /** - * {@inheritdoc} - */ - public function increment(DateTime $date, $invert = false) - { - if ($invert) { - $date->modify('-1 year'); - $date->setDate($date->format('Y'), 12, 31); - $date->setTime(23, 59, 0); - } else { - $date->modify('+1 year'); - $date->setDate($date->format('Y'), 1, 1); - $date->setTime(0, 0, 0); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function validate($value) - { - return (bool) preg_match('/[\*,\/\-0-9]+/', $value); - } -} diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php deleted file mode 100644 index ac21a55..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4/Factory.php +++ /dev/null @@ -1,6 +0,0 @@ -rootDir = dirname(__FILE__) . '/'; - $nameParts = explode('_', __CLASS__, 3); - $this->prefix = $nameParts[0] . '_' . $nameParts[1] . '_'; - - $this->libraryDir = $this->rootDir . '../..'; - if ( !self::isPhar() ) { - $this->libraryDir = realpath($this->libraryDir); - } - $this->libraryDir = $this->libraryDir . '/'; - - $this->staticMap = array( - 'PucReadmeParser' => 'vendor/PucReadmeParser.php', - 'Parsedown' => 'vendor/Parsedown.php', - 'Puc_v4_Factory' => 'Puc/v4/Factory.php', - ); - - spl_autoload_register(array($this, 'autoload')); - } - - /** - * Determine if this file is running as part of a Phar archive. - * - * @return bool - */ - private static function isPhar() { - //Check if the current file path starts with "phar://". - static $pharProtocol = 'phar://'; - return (substr(__FILE__, 0, strlen($pharProtocol)) === $pharProtocol); - } - - public function autoload($className) { - if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) { - /** @noinspection PhpIncludeInspection */ - include ($this->libraryDir . $this->staticMap[$className]); - return; - } - - if (strpos($className, $this->prefix) === 0) { - $path = substr($className, strlen($this->prefix)); - $path = str_replace('_', '/', $path); - $path = $this->rootDir . $path . '.php'; - - if (file_exists($path)) { - /** @noinspection PhpIncludeInspection */ - include $path; - } - } - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Extension.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Extension.php deleted file mode 100644 index a39dac0..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Extension.php +++ /dev/null @@ -1,190 +0,0 @@ -updateChecker = $updateChecker; - if ( isset($panelClass) ) { - $this->panelClass = $panelClass; - } - - if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($this->panelClass, '\\') === false) ) { - $this->panelClass = __NAMESPACE__ . '\\' . $this->panelClass; - } - - add_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); - add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); - - add_action('wp_ajax_puc_v4_debug_check_now', array($this, 'ajaxCheckNow')); - } - - /** - * Register the PUC Debug Bar panel. - * - * @param array $panels - * @return array - */ - public function addDebugBarPanel($panels) { - if ( $this->updateChecker->userCanInstallUpdates() ) { - $panels[] = new $this->panelClass($this->updateChecker); - } - return $panels; - } - - /** - * Enqueue our Debug Bar scripts and styles. - */ - public function enqueuePanelDependencies() { - wp_enqueue_style( - 'puc-debug-bar-style-v4', - $this->getLibraryUrl("/css/puc-debug-bar.css"), - array('debug-bar'), - '20171124' - ); - - wp_enqueue_script( - 'puc-debug-bar-js-v4', - $this->getLibraryUrl("/js/debug-bar.js"), - array('jquery'), - '20201209' - ); - } - - /** - * Run an update check and output the result. Useful for making sure that - * the update checking process works as expected. - */ - public function ajaxCheckNow() { - if ( $_POST['uid'] !== $this->updateChecker->getUniqueName('uid') ) { - return; - } - $this->preAjaxRequest(); - $update = $this->updateChecker->checkForUpdates(); - if ( $update !== null ) { - echo "An update is available:"; - echo '
      ', htmlentities(print_r($update, true)), '
      '; - } else { - echo 'No updates found.'; - } - - $errors = $this->updateChecker->getLastRequestApiErrors(); - if ( !empty($errors) ) { - printf('

      The update checker encountered %d API error%s.

      ', count($errors), (count($errors) > 1) ? 's' : ''); - - foreach (array_values($errors) as $num => $item) { - $wpError = $item['error']; - /** @var WP_Error $wpError */ - printf('

      %d) %s

      ', $num + 1, esc_html($wpError->get_error_message())); - - echo '
      '; - printf('
      Error code:
      %s
      ', esc_html($wpError->get_error_code())); - - if ( isset($item['url']) ) { - printf('
      Requested URL:
      %s
      ', esc_html($item['url'])); - } - - if ( isset($item['httpResponse']) ) { - if ( is_wp_error($item['httpResponse']) ) { - $httpError = $item['httpResponse']; - /** @var WP_Error $httpError */ - printf( - '
      WordPress HTTP API error:
      %s (%s)
      ', - esc_html($httpError->get_error_message()), - esc_html($httpError->get_error_code()) - ); - } else { - //Status code. - printf( - '
      HTTP status:
      %d %s
      ', - wp_remote_retrieve_response_code($item['httpResponse']), - wp_remote_retrieve_response_message($item['httpResponse']) - ); - - //Headers. - echo '
      Response headers:
      ';
      -							foreach (wp_remote_retrieve_headers($item['httpResponse']) as $name => $value) {
      -								printf("%s: %s\n", esc_html($name), esc_html($value));
      -							}
      -							echo '
      '; - - //Body. - $body = wp_remote_retrieve_body($item['httpResponse']); - if ( $body === '' ) { - $body = '(Empty response.)'; - } else if ( strlen($body) > self::RESPONSE_BODY_LENGTH_LIMIT ) { - $length = strlen($body); - $body = substr($body, 0, self::RESPONSE_BODY_LENGTH_LIMIT) - . sprintf("\n(Long string truncated. Total length: %d bytes.)", $length); - } - - printf('
      Response body:
      %s
      ', esc_html($body)); - } - } - echo '
      '; - } - } - - exit; - } - - /** - * Check access permissions and enable error display (for debugging). - */ - protected function preAjaxRequest() { - if ( !$this->updateChecker->userCanInstallUpdates() ) { - die('Access denied'); - } - check_ajax_referer('puc-ajax'); - - error_reporting(E_ALL); - @ini_set('display_errors', 'On'); - } - - /** - * Remove hooks that were added by this extension. - */ - public function removeHooks() { - remove_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); - remove_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); - remove_action('wp_ajax_puc_v4_debug_check_now', array($this, 'ajaxCheckNow')); - } - - /** - * @param string $filePath - * @return string - */ - private function getLibraryUrl($filePath) { - $absolutePath = realpath(dirname(__FILE__) . '/../../../' . ltrim($filePath, '/')); - - //Where is the library located inside the WordPress directory structure? - $absolutePath = Puc_v4p11_Factory::normalizePath($absolutePath); - - $pluginDir = Puc_v4p11_Factory::normalizePath(WP_PLUGIN_DIR); - $muPluginDir = Puc_v4p11_Factory::normalizePath(WPMU_PLUGIN_DIR); - $themeDir = Puc_v4p11_Factory::normalizePath(get_theme_root()); - - if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { - //It's part of a plugin. - return plugins_url(basename($absolutePath), $absolutePath); - } else if ( strpos($absolutePath, $themeDir) === 0 ) { - //It's part of a theme. - $relativePath = substr($absolutePath, strlen($themeDir) + 1); - $template = substr($relativePath, 0, strpos($relativePath, '/')); - $baseUrl = get_theme_root_uri($template); - - if ( !empty($baseUrl) && $relativePath ) { - return $baseUrl . '/' . $relativePath; - } - } - - return ''; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Panel.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Panel.php deleted file mode 100644 index 666cdf4..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/Panel.php +++ /dev/null @@ -1,165 +0,0 @@ -'; - - public function __construct($updateChecker) { - $this->updateChecker = $updateChecker; - $title = sprintf( - 'PUC (%s)', - esc_attr($this->updateChecker->getUniqueName('uid')), - $this->updateChecker->slug - ); - parent::__construct($title); - } - - public function render() { - printf( - '
      ', - esc_attr($this->updateChecker->getUniqueName('debug-bar-panel')), - esc_attr($this->updateChecker->slug), - esc_attr($this->updateChecker->getUniqueName('uid')), - esc_attr(wp_create_nonce('puc-ajax')) - ); - - $this->displayConfiguration(); - $this->displayStatus(); - $this->displayCurrentUpdate(); - - echo '
      '; - } - - private function displayConfiguration() { - echo '

      Configuration

      '; - echo ''; - $this->displayConfigHeader(); - $this->row('Slug', htmlentities($this->updateChecker->slug)); - $this->row('DB option', htmlentities($this->updateChecker->optionName)); - - $requestInfoButton = $this->getMetadataButton(); - $this->row('Metadata URL', htmlentities($this->updateChecker->metadataUrl) . ' ' . $requestInfoButton . $this->responseBox); - - $scheduler = $this->updateChecker->scheduler; - if ( $scheduler->checkPeriod > 0 ) { - $this->row('Automatic checks', 'Every ' . $scheduler->checkPeriod . ' hours'); - } else { - $this->row('Automatic checks', 'Disabled'); - } - - if ( isset($scheduler->throttleRedundantChecks) ) { - if ( $scheduler->throttleRedundantChecks && ($scheduler->checkPeriod > 0) ) { - $this->row( - 'Throttling', - sprintf( - 'Enabled. If an update is already available, check for updates every %1$d hours instead of every %2$d hours.', - $scheduler->throttledCheckPeriod, - $scheduler->checkPeriod - ) - ); - } else { - $this->row('Throttling', 'Disabled'); - } - } - - $this->updateChecker->onDisplayConfiguration($this); - - echo '
      '; - } - - protected function displayConfigHeader() { - //Do nothing. This should be implemented in subclasses. - } - - protected function getMetadataButton() { - return ''; - } - - private function displayStatus() { - echo '

      Status

      '; - echo ''; - $state = $this->updateChecker->getUpdateState(); - $checkNowButton = ''; - if ( function_exists('get_submit_button') ) { - $checkNowButton = get_submit_button( - 'Check Now', - 'secondary', - 'puc-check-now-button', - false, - array('id' => $this->updateChecker->getUniqueName('check-now-button')) - ); - } - - if ( $state->getLastCheck() > 0 ) { - $this->row('Last check', $this->formatTimeWithDelta($state->getLastCheck()) . ' ' . $checkNowButton . $this->responseBox); - } else { - $this->row('Last check', 'Never'); - } - - $nextCheck = wp_next_scheduled($this->updateChecker->scheduler->getCronHookName()); - $this->row('Next automatic check', $this->formatTimeWithDelta($nextCheck)); - - if ( $state->getCheckedVersion() !== '' ) { - $this->row('Checked version', htmlentities($state->getCheckedVersion())); - $this->row('Cached update', $state->getUpdate()); - } - $this->row('Update checker class', htmlentities(get_class($this->updateChecker))); - echo '
      '; - } - - private function displayCurrentUpdate() { - $update = $this->updateChecker->getUpdate(); - if ( $update !== null ) { - echo '

      An Update Is Available

      '; - echo ''; - $fields = $this->getUpdateFields(); - foreach($fields as $field) { - if ( property_exists($update, $field) ) { - $this->row(ucwords(str_replace('_', ' ', $field)), htmlentities($update->$field)); - } - } - echo '
      '; - } else { - echo '

      No updates currently available

      '; - } - } - - protected function getUpdateFields() { - return array('version', 'download_url', 'slug',); - } - - private function formatTimeWithDelta($unixTime) { - if ( empty($unixTime) ) { - return 'Never'; - } - - $delta = time() - $unixTime; - $result = human_time_diff(time(), $unixTime); - if ( $delta < 0 ) { - $result = 'after ' . $result; - } else { - $result = $result . ' ago'; - } - $result .= ' (' . $this->formatTimestamp($unixTime) . ')'; - return $result; - } - - private function formatTimestamp($unixTime) { - return gmdate('Y-m-d H:i:s', $unixTime + (get_option('gmt_offset') * 3600)); - } - - public function row($name, $value) { - if ( is_object($value) || is_array($value) ) { - $value = '
      ' . htmlentities(print_r($value, true)) . '
      '; - } else if ($value === null) { - $value = 'null'; - } - printf('%1$s %2$s', $name, $value); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginExtension.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginExtension.php deleted file mode 100644 index edc4a2f..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginExtension.php +++ /dev/null @@ -1,33 +0,0 @@ -updateChecker->getUniqueName('uid') ) { - return; - } - $this->preAjaxRequest(); - $info = $this->updateChecker->requestInfo(); - if ( $info !== null ) { - echo 'Successfully retrieved plugin info from the metadata URL:'; - echo '
      ', htmlentities(print_r($info, true)), '
      '; - } else { - echo 'Failed to retrieve plugin info from the metadata URL.'; - } - exit; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginPanel.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginPanel.php deleted file mode 100644 index fa98600..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/PluginPanel.php +++ /dev/null @@ -1,38 +0,0 @@ -row('Plugin file', htmlentities($this->updateChecker->pluginFile)); - parent::displayConfigHeader(); - } - - protected function getMetadataButton() { - $requestInfoButton = ''; - if ( function_exists('get_submit_button') ) { - $requestInfoButton = get_submit_button( - 'Request Info', - 'secondary', - 'puc-request-info-button', - false, - array('id' => $this->updateChecker->getUniqueName('request-info-button')) - ); - } - return $requestInfoButton; - } - - protected function getUpdateFields() { - return array_merge( - parent::getUpdateFields(), - array('homepage', 'upgrade_notice', 'tested',) - ); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/ThemePanel.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/ThemePanel.php deleted file mode 100644 index 77f4558..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/DebugBar/ThemePanel.php +++ /dev/null @@ -1,21 +0,0 @@ -row('Theme directory', htmlentities($this->updateChecker->directoryName)); - parent::displayConfigHeader(); - } - - protected function getUpdateFields() { - return array_merge(parent::getUpdateFields(), array('details_url')); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Factory.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Factory.php deleted file mode 100644 index 3541042..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Factory.php +++ /dev/null @@ -1,365 +0,0 @@ - '', - 'slug' => '', - 'checkPeriod' => 12, - 'optionName' => '', - 'muPluginFile' => '', - ); - $args = array_merge($defaults, array_intersect_key($args, $defaults)); - extract($args, EXTR_SKIP); - - //Check for the service URI - if ( empty($metadataUrl) ) { - $metadataUrl = self::getServiceURI($fullPath); - } - - /** @noinspection PhpUndefinedVariableInspection These variables are created by extract(), above. */ - return self::buildUpdateChecker($metadataUrl, $fullPath, $slug, $checkPeriod, $optionName, $muPluginFile); - } - - /** - * Create a new instance of the update checker. - * - * This method automatically detects if you're using it for a plugin or a theme and chooses - * the appropriate implementation for your update source (JSON file, GitHub, BitBucket, etc). - * - * @see Puc_v4p11_UpdateChecker::__construct - * - * @param string $metadataUrl The URL of the metadata file, a GitHub repository, or another supported update source. - * @param string $fullPath Full path to the main plugin file or to the theme directory. - * @param string $slug Custom slug. Defaults to the name of the main plugin file or the theme directory. - * @param int $checkPeriod How often to check for updates (in hours). - * @param string $optionName Where to store book-keeping info about update checks. - * @param string $muPluginFile The plugin filename relative to the mu-plugins directory. - * @return Puc_v4p11_Plugin_UpdateChecker|Puc_v4p11_Theme_UpdateChecker|Puc_v4p11_Vcs_BaseChecker - */ - public static function buildUpdateChecker($metadataUrl, $fullPath, $slug = '', $checkPeriod = 12, $optionName = '', $muPluginFile = '') { - $fullPath = self::normalizePath($fullPath); - $id = null; - - //Plugin or theme? - $themeDirectory = self::getThemeDirectoryName($fullPath); - if ( self::isPluginFile($fullPath) ) { - $type = 'Plugin'; - $id = $fullPath; - } else if ( $themeDirectory !== null ) { - $type = 'Theme'; - $id = $themeDirectory; - } else { - throw new RuntimeException(sprintf( - 'The update checker cannot determine if "%s" is a plugin or a theme. ' . - 'This is a bug. Please contact the PUC developer.', - htmlentities($fullPath) - )); - } - - //Which hosting service does the URL point to? - $service = self::getVcsService($metadataUrl); - - $apiClass = null; - if ( empty($service) ) { - //The default is to get update information from a remote JSON file. - $checkerClass = $type . '_UpdateChecker'; - } else { - //You can also use a VCS repository like GitHub. - $checkerClass = 'Vcs_' . $type . 'UpdateChecker'; - $apiClass = $service . 'Api'; - } - - $checkerClass = self::getCompatibleClassVersion($checkerClass); - if ( $checkerClass === null ) { - trigger_error( - sprintf( - 'PUC %s does not support updates for %ss %s', - htmlentities(self::$latestCompatibleVersion), - strtolower($type), - $service ? ('hosted on ' . htmlentities($service)) : 'using JSON metadata' - ), - E_USER_ERROR - ); - return null; - } - - //Add the current namespace to the class name(s). - if ( version_compare(PHP_VERSION, '5.3', '>=') ) { - $checkerClass = __NAMESPACE__ . '\\' . $checkerClass; - } - - if ( !isset($apiClass) ) { - //Plain old update checker. - return new $checkerClass($metadataUrl, $id, $slug, $checkPeriod, $optionName, $muPluginFile); - } else { - //VCS checker + an API client. - $apiClass = self::getCompatibleClassVersion($apiClass); - if ( $apiClass === null ) { - trigger_error(sprintf( - 'PUC %s does not support %s', - htmlentities(self::$latestCompatibleVersion), - htmlentities($service) - ), E_USER_ERROR); - return null; - } - - if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($apiClass, '\\') === false) ) { - $apiClass = __NAMESPACE__ . '\\' . $apiClass; - } - - return new $checkerClass( - new $apiClass($metadataUrl), - $id, - $slug, - $checkPeriod, - $optionName, - $muPluginFile - ); - } - } - - /** - * - * Normalize a filesystem path. Introduced in WP 3.9. - * Copying here allows use of the class on earlier versions. - * This version adapted from WP 4.8.2 (unchanged since 4.5.0) - * - * @param string $path Path to normalize. - * @return string Normalized path. - */ - public static function normalizePath($path) { - if ( function_exists('wp_normalize_path') ) { - return wp_normalize_path($path); - } - $path = str_replace('\\', '/', $path); - $path = preg_replace('|(?<=.)/+|', '/', $path); - if ( substr($path, 1, 1) === ':' ) { - $path = ucfirst($path); - } - return $path; - } - - /** - * Check if the path points to a plugin file. - * - * @param string $absolutePath Normalized path. - * @return bool - */ - protected static function isPluginFile($absolutePath) { - //Is the file inside the "plugins" or "mu-plugins" directory? - $pluginDir = self::normalizePath(WP_PLUGIN_DIR); - $muPluginDir = self::normalizePath(WPMU_PLUGIN_DIR); - if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { - return true; - } - - //Is it a file at all? Caution: is_file() can fail if the parent dir. doesn't have the +x permission set. - if ( !is_file($absolutePath) ) { - return false; - } - - //Does it have a valid plugin header? - //This is a last-ditch check for plugins symlinked from outside the WP root. - if ( function_exists('get_file_data') ) { - $headers = get_file_data($absolutePath, array('Name' => 'Plugin Name'), 'plugin'); - return !empty($headers['Name']); - } - - return false; - } - - /** - * Get the name of the theme's directory from a full path to a file inside that directory. - * E.g. "/abc/public_html/wp-content/themes/foo/whatever.php" => "foo". - * - * Note that subdirectories are currently not supported. For example, - * "/xyz/wp-content/themes/my-theme/includes/whatever.php" => NULL. - * - * @param string $absolutePath Normalized path. - * @return string|null Directory name, or NULL if the path doesn't point to a theme. - */ - protected static function getThemeDirectoryName($absolutePath) { - if ( is_file($absolutePath) ) { - $absolutePath = dirname($absolutePath); - } - - if ( file_exists($absolutePath . '/style.css') ) { - return basename($absolutePath); - } - return null; - } - - /** - * Get the service URI from the file header. - * - * @param string $fullPath - * @return string - */ - private static function getServiceURI($fullPath) { - //Look for the URI - if ( is_readable($fullPath) ) { - $seek = array( - 'github' => 'GitHub URI', - 'gitlab' => 'GitLab URI', - 'bucket' => 'BitBucket URI', - ); - $seek = apply_filters('puc_get_source_uri', $seek); - $data = get_file_data($fullPath, $seek); - foreach ($data as $key => $uri) { - if ( $uri ) { - return $uri; - } - } - } - - //URI was not found so throw an error. - throw new RuntimeException( - sprintf('Unable to locate URI in header of "%s"', htmlentities($fullPath)) - ); - } - - /** - * Get the name of the hosting service that the URL points to. - * - * @param string $metadataUrl - * @return string|null - */ - private static function getVcsService($metadataUrl) { - $service = null; - - //Which hosting service does the URL point to? - $host = parse_url($metadataUrl, PHP_URL_HOST); - $path = parse_url($metadataUrl, PHP_URL_PATH); - - //Check if the path looks like "/user-name/repository". - //For GitLab.com it can also be "/user/group1/group2/.../repository". - $repoRegex = '@^/?([^/]+?)/([^/#?&]+?)/?$@'; - if ( $host === 'gitlab.com' ) { - $repoRegex = '@^/?(?:[^/#?&]++/){1,20}(?:[^/#?&]++)/?$@'; - } - if ( preg_match($repoRegex, $path) ) { - $knownServices = array( - 'github.com' => 'GitHub', - 'bitbucket.org' => 'BitBucket', - 'gitlab.com' => 'GitLab', - ); - if ( isset($knownServices[$host]) ) { - $service = $knownServices[$host]; - } - } - - return apply_filters('puc_get_vcs_service', $service, $host, $path, $metadataUrl); - } - - /** - * Get the latest version of the specified class that has the same major version number - * as this factory class. - * - * @param string $class Partial class name. - * @return string|null Full class name. - */ - protected static function getCompatibleClassVersion($class) { - if ( isset(self::$classVersions[$class][self::$latestCompatibleVersion]) ) { - return self::$classVersions[$class][self::$latestCompatibleVersion]; - } - return null; - } - - /** - * Get the specific class name for the latest available version of a class. - * - * @param string $class - * @return null|string - */ - public static function getLatestClassVersion($class) { - if ( !self::$sorted ) { - self::sortVersions(); - } - - if ( isset(self::$classVersions[$class]) ) { - return reset(self::$classVersions[$class]); - } else { - return null; - } - } - - /** - * Sort available class versions in descending order (i.e. newest first). - */ - protected static function sortVersions() { - foreach ( self::$classVersions as $class => $versions ) { - uksort($versions, array(__CLASS__, 'compareVersions')); - self::$classVersions[$class] = $versions; - } - self::$sorted = true; - } - - protected static function compareVersions($a, $b) { - return -version_compare($a, $b); - } - - /** - * Register a version of a class. - * - * @access private This method is only for internal use by the library. - * - * @param string $generalClass Class name without version numbers, e.g. 'PluginUpdateChecker'. - * @param string $versionedClass Actual class name, e.g. 'PluginUpdateChecker_1_2'. - * @param string $version Version number, e.g. '1.2'. - */ - public static function addVersion($generalClass, $versionedClass, $version) { - if ( empty(self::$myMajorVersion) ) { - $nameParts = explode('_', __CLASS__, 3); - self::$myMajorVersion = substr(ltrim($nameParts[1], 'v'), 0, 1); - } - - //Store the greatest version number that matches our major version. - $components = explode('.', $version); - if ( $components[0] === self::$myMajorVersion ) { - - if ( - empty(self::$latestCompatibleVersion) - || version_compare($version, self::$latestCompatibleVersion, '>') - ) { - self::$latestCompatibleVersion = $version; - } - - } - - if ( !isset(self::$classVersions[$generalClass]) ) { - self::$classVersions[$generalClass] = array(); - } - self::$classVersions[$generalClass][$version] = $versionedClass; - self::$sorted = false; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/InstalledPackage.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/InstalledPackage.php deleted file mode 100644 index 920159b..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/InstalledPackage.php +++ /dev/null @@ -1,103 +0,0 @@ -updateChecker = $updateChecker; - } - - /** - * Get the currently installed version of the plugin or theme. - * - * @return string|null Version number. - */ - abstract public function getInstalledVersion(); - - /** - * Get the full path of the plugin or theme directory (without a trailing slash). - * - * @return string - */ - abstract public function getAbsoluteDirectoryPath(); - - /** - * Check whether a regular file exists in the package's directory. - * - * @param string $relativeFileName File name relative to the package directory. - * @return bool - */ - public function fileExists($relativeFileName) { - return is_file( - $this->getAbsoluteDirectoryPath() - . DIRECTORY_SEPARATOR - . ltrim($relativeFileName, '/\\') - ); - } - - /* ------------------------------------------------------------------- - * File header parsing - * ------------------------------------------------------------------- - */ - - /** - * Parse plugin or theme metadata from the header comment. - * - * This is basically a simplified version of the get_file_data() function from /wp-includes/functions.php. - * It's intended as a utility for subclasses that detect updates by parsing files in a VCS. - * - * @param string|null $content File contents. - * @return string[] - */ - public function getFileHeader($content) { - $content = (string)$content; - - //WordPress only looks at the first 8 KiB of the file, so we do the same. - $content = substr($content, 0, 8192); - //Normalize line endings. - $content = str_replace("\r", "\n", $content); - - $headers = $this->getHeaderNames(); - $results = array(); - foreach ($headers as $field => $name) { - $success = preg_match('/^[ \t\/*#@]*' . preg_quote($name, '/') . ':(.*)$/mi', $content, $matches); - - if ( ($success === 1) && $matches[1] ) { - $value = $matches[1]; - if ( function_exists('_cleanup_header_comment') ) { - $value = _cleanup_header_comment($value); - } - $results[$field] = $value; - } else { - $results[$field] = ''; - } - } - - return $results; - } - - /** - * @return array Format: ['HeaderKey' => 'Header Name'] - */ - abstract protected function getHeaderNames(); - - /** - * Get the value of a specific plugin or theme header. - * - * @param string $headerName - * @return string Either the value of the header, or an empty string if the header doesn't exist. - */ - abstract public function getHeaderValue($headerName); - - } -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Metadata.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Metadata.php deleted file mode 100644 index ddba071..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Metadata.php +++ /dev/null @@ -1,132 +0,0 @@ -validateMetadata($apiResponse); - if ( is_wp_error($valid) ){ - do_action('puc_api_error', $valid); - trigger_error($valid->get_error_message(), E_USER_NOTICE); - return false; - } - - foreach(get_object_vars($apiResponse) as $key => $value){ - $target->$key = $value; - } - - return true; - } - - /** - * No validation by default! Subclasses should check that the required fields are present. - * - * @param StdClass $apiResponse - * @return bool|WP_Error - */ - protected function validateMetadata(/** @noinspection PhpUnusedParameterInspection */ $apiResponse) { - return true; - } - - /** - * Create a new instance by copying the necessary fields from another object. - * - * @abstract - * @param StdClass|self $object The source object. - * @return self The new copy. - */ - public static function fromObject(/** @noinspection PhpUnusedParameterInspection */ $object) { - throw new LogicException('The ' . __METHOD__ . ' method must be implemented by subclasses'); - } - - /** - * Create an instance of StdClass that can later be converted back to an - * update or info container. Useful for serialization and caching, as it - * avoids the "incomplete object" problem if the cached value is loaded - * before this class. - * - * @return StdClass - */ - public function toStdClass() { - $object = new stdClass(); - $this->copyFields($this, $object); - return $object; - } - - /** - * Transform the metadata into the format used by WordPress core. - * - * @return object - */ - abstract public function toWpFormat(); - - /** - * Copy known fields from one object to another. - * - * @param StdClass|self $from - * @param StdClass|self $to - */ - protected function copyFields($from, $to) { - $fields = $this->getFieldNames(); - - if ( property_exists($from, 'slug') && !empty($from->slug) ) { - //Let plugins add extra fields without having to create subclasses. - $fields = apply_filters($this->getPrefixedFilter('retain_fields') . '-' . $from->slug, $fields); - } - - foreach ($fields as $field) { - if ( property_exists($from, $field) ) { - $to->$field = $from->$field; - } - } - } - - /** - * @return string[] - */ - protected function getFieldNames() { - return array(); - } - - /** - * @param string $tag - * @return string - */ - protected function getPrefixedFilter($tag) { - return 'puc_' . $tag; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/OAuthSignature.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/OAuthSignature.php deleted file mode 100644 index 726befa..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/OAuthSignature.php +++ /dev/null @@ -1,100 +0,0 @@ -consumerKey = $consumerKey; - $this->consumerSecret = $consumerSecret; - } - - /** - * Sign a URL using OAuth 1.0. - * - * @param string $url The URL to be signed. It may contain query parameters. - * @param string $method HTTP method such as "GET", "POST" and so on. - * @return string The signed URL. - */ - public function sign($url, $method = 'GET') { - $parameters = array(); - - //Parse query parameters. - $query = parse_url($url, PHP_URL_QUERY); - if ( !empty($query) ) { - parse_str($query, $parsedParams); - if ( is_array($parameters) ) { - $parameters = $parsedParams; - } - //Remove the query string from the URL. We'll replace it later. - $url = substr($url, 0, strpos($url, '?')); - } - - $parameters = array_merge( - $parameters, - array( - 'oauth_consumer_key' => $this->consumerKey, - 'oauth_nonce' => $this->nonce(), - 'oauth_signature_method' => 'HMAC-SHA1', - 'oauth_timestamp' => time(), - 'oauth_version' => '1.0', - ) - ); - unset($parameters['oauth_signature']); - - //Parameters must be sorted alphabetically before signing. - ksort($parameters); - - //The most complicated part of the request - generating the signature. - //The string to sign contains the HTTP method, the URL path, and all of - //our query parameters. Everything is URL encoded. Then we concatenate - //them with ampersands into a single string to hash. - $encodedVerb = urlencode($method); - $encodedUrl = urlencode($url); - $encodedParams = urlencode(http_build_query($parameters, '', '&')); - - $stringToSign = $encodedVerb . '&' . $encodedUrl . '&' . $encodedParams; - - //Since we only have one OAuth token (the consumer secret) we only have - //to use it as our HMAC key. However, we still have to append an & to it - //as if we were using it with additional tokens. - $secret = urlencode($this->consumerSecret) . '&'; - - //The signature is a hash of the consumer key and the base string. Note - //that we have to get the raw output from hash_hmac and base64 encode - //the binary data result. - $parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $stringToSign, $secret, true)); - - return ($url . '?' . http_build_query($parameters)); - } - - /** - * Generate a random nonce. - * - * @return string - */ - private function nonce() { - $mt = microtime(); - - $rand = null; - if ( is_callable('random_bytes') ) { - try { - $rand = random_bytes(16); - } catch (Exception $ex) { - //Fall back to mt_rand (below). - } - } - if ( $rand === null ) { - $rand = mt_rand(); - } - - return md5($mt . '_' . $rand); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Info.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Info.php deleted file mode 100644 index f797e0a..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Info.php +++ /dev/null @@ -1,132 +0,0 @@ -sections = (array)$instance->sections; - $instance->icons = (array)$instance->icons; - - return $instance; - } - - /** - * Very, very basic validation. - * - * @param StdClass $apiResponse - * @return bool|WP_Error - */ - protected function validateMetadata($apiResponse) { - if ( - !isset($apiResponse->name, $apiResponse->version) - || empty($apiResponse->name) - || empty($apiResponse->version) - ) { - return new WP_Error( - 'puc-invalid-metadata', - "The plugin metadata file does not contain the required 'name' and/or 'version' keys." - ); - } - return true; - } - - - /** - * Transform plugin info into the format used by the native WordPress.org API - * - * @return object - */ - public function toWpFormat(){ - $info = new stdClass; - - //The custom update API is built so that many fields have the same name and format - //as those returned by the native WordPress.org API. These can be assigned directly. - $sameFormat = array( - 'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice', - 'num_ratings', 'downloaded', 'active_installs', 'homepage', 'last_updated', - 'requires_php', - ); - foreach($sameFormat as $field){ - if ( isset($this->$field) ) { - $info->$field = $this->$field; - } else { - $info->$field = null; - } - } - - //Other fields need to be renamed and/or transformed. - $info->download_link = $this->download_url; - $info->author = $this->getFormattedAuthor(); - $info->sections = array_merge(array('description' => ''), $this->sections); - - if ( !empty($this->banners) ) { - //WP expects an array with two keys: "high" and "low". Both are optional. - //Docs: https://wordpress.org/plugins/about/faq/#banners - $info->banners = is_object($this->banners) ? get_object_vars($this->banners) : $this->banners; - $info->banners = array_intersect_key($info->banners, array('high' => true, 'low' => true)); - } - - return $info; - } - - protected function getFormattedAuthor() { - if ( !empty($this->author_homepage) ){ - /** @noinspection HtmlUnknownTarget */ - return sprintf('%s', $this->author_homepage, $this->author); - } - return $this->author; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Package.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Package.php deleted file mode 100644 index 23d8ee1..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Package.php +++ /dev/null @@ -1,184 +0,0 @@ -pluginAbsolutePath = $pluginAbsolutePath; - $this->pluginFile = plugin_basename($this->pluginAbsolutePath); - - parent::__construct($updateChecker); - - //Clear the version number cache when something - anything - is upgraded or WP clears the update cache. - add_filter('upgrader_post_install', array($this, 'clearCachedVersion')); - add_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion')); - } - - public function getInstalledVersion() { - if ( isset($this->cachedInstalledVersion) ) { - return $this->cachedInstalledVersion; - } - - $pluginHeader = $this->getPluginHeader(); - if ( isset($pluginHeader['Version']) ) { - $this->cachedInstalledVersion = $pluginHeader['Version']; - return $pluginHeader['Version']; - } else { - //This can happen if the filename points to something that is not a plugin. - $this->updateChecker->triggerError( - sprintf( - "Can't to read the Version header for '%s'. The filename is incorrect or is not a plugin.", - $this->updateChecker->pluginFile - ), - E_USER_WARNING - ); - return null; - } - } - - /** - * Clear the cached plugin version. This method can be set up as a filter (hook) and will - * return the filter argument unmodified. - * - * @param mixed $filterArgument - * @return mixed - */ - public function clearCachedVersion($filterArgument = null) { - $this->cachedInstalledVersion = null; - return $filterArgument; - } - - public function getAbsoluteDirectoryPath() { - return dirname($this->pluginAbsolutePath); - } - - /** - * Get the value of a specific plugin or theme header. - * - * @param string $headerName - * @param string $defaultValue - * @return string Either the value of the header, or $defaultValue if the header doesn't exist or is empty. - */ - public function getHeaderValue($headerName, $defaultValue = '') { - $headers = $this->getPluginHeader(); - if ( isset($headers[$headerName]) && ($headers[$headerName] !== '') ) { - return $headers[$headerName]; - } - return $defaultValue; - } - - protected function getHeaderNames() { - return array( - 'Name' => 'Plugin Name', - 'PluginURI' => 'Plugin URI', - 'Version' => 'Version', - 'Description' => 'Description', - 'Author' => 'Author', - 'AuthorURI' => 'Author URI', - 'TextDomain' => 'Text Domain', - 'DomainPath' => 'Domain Path', - 'Network' => 'Network', - - //The newest WordPress version that this plugin requires or has been tested with. - //We support several different formats for compatibility with other libraries. - 'Tested WP' => 'Tested WP', - 'Requires WP' => 'Requires WP', - 'Tested up to' => 'Tested up to', - 'Requires at least' => 'Requires at least', - ); - } - - /** - * Get the translated plugin title. - * - * @return string - */ - public function getPluginTitle() { - $title = ''; - $header = $this->getPluginHeader(); - if ( $header && !empty($header['Name']) && isset($header['TextDomain']) ) { - $title = translate($header['Name'], $header['TextDomain']); - } - return $title; - } - - /** - * Get plugin's metadata from its file header. - * - * @return array - */ - public function getPluginHeader() { - if ( !is_file($this->pluginAbsolutePath) ) { - //This can happen if the plugin filename is wrong. - $this->updateChecker->triggerError( - sprintf( - "Can't to read the plugin header for '%s'. The file does not exist.", - $this->updateChecker->pluginFile - ), - E_USER_WARNING - ); - return array(); - } - - if ( !function_exists('get_plugin_data') ) { - /** @noinspection PhpIncludeInspection */ - require_once(ABSPATH . '/wp-admin/includes/plugin.php'); - } - return get_plugin_data($this->pluginAbsolutePath, false, false); - } - - public function removeHooks() { - remove_filter('upgrader_post_install', array($this, 'clearCachedVersion')); - remove_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion')); - } - - /** - * Check if the plugin file is inside the mu-plugins directory. - * - * @return bool - */ - public function isMuPlugin() { - static $cachedResult = null; - - if ( $cachedResult === null ) { - if ( !defined('WPMU_PLUGIN_DIR') || !is_string(WPMU_PLUGIN_DIR) ) { - $cachedResult = false; - return $cachedResult; - } - - //Convert both paths to the canonical form before comparison. - $muPluginDir = realpath(WPMU_PLUGIN_DIR); - $pluginPath = realpath($this->pluginAbsolutePath); - //If realpath() fails, just normalize the syntax instead. - if (($muPluginDir === false) || ($pluginPath === false)) { - $muPluginDir = Puc_v4p11_Factory::normalizePath(WPMU_PLUGIN_DIR); - $pluginPath = Puc_v4p11_Factory::normalizePath($this->pluginAbsolutePath); - } - - $cachedResult = (strpos($pluginPath, $muPluginDir) === 0); - } - - return $cachedResult; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Ui.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Ui.php deleted file mode 100644 index 8aa4b35..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Ui.php +++ /dev/null @@ -1,278 +0,0 @@ -updateChecker = $updateChecker; - $this->manualCheckErrorTransient = $this->updateChecker->getUniqueName('manual_check_errors'); - - add_action('admin_init', array($this, 'onAdminInit')); - } - - public function onAdminInit() { - if ( $this->updateChecker->userCanInstallUpdates() ) { - $this->handleManualCheck(); - - add_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10, 3); - add_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10, 2); - add_action('all_admin_notices', array($this, 'displayManualCheckResult')); - } - } - - /** - * Add a "View Details" link to the plugin row in the "Plugins" page. By default, - * the new link will appear before the "Visit plugin site" link (if present). - * - * You can change the link text by using the "puc_view_details_link-$slug" filter. - * Returning an empty string from the filter will disable the link. - * - * You can change the position of the link using the - * "puc_view_details_link_position-$slug" filter. - * Returning 'before' or 'after' will place the link immediately before/after - * the "Visit plugin site" link. - * Returning 'append' places the link after any existing links at the time of the hook. - * Returning 'replace' replaces the "Visit plugin site" link. - * Returning anything else disables the link when there is a "Visit plugin site" link. - * - * If there is no "Visit plugin site" link 'append' is always used! - * - * @param array $pluginMeta Array of meta links. - * @param string $pluginFile - * @param array $pluginData Array of plugin header data. - * @return array - */ - public function addViewDetailsLink($pluginMeta, $pluginFile, $pluginData = array()) { - if ( $this->isMyPluginFile($pluginFile) && !isset($pluginData['slug']) ) { - $linkText = apply_filters($this->updateChecker->getUniqueName('view_details_link'), __('View details')); - if ( !empty($linkText) ) { - $viewDetailsLinkPosition = 'append'; - - //Find the "Visit plugin site" link (if present). - $visitPluginSiteLinkIndex = count($pluginMeta) - 1; - if ( $pluginData['PluginURI'] ) { - $escapedPluginUri = esc_url($pluginData['PluginURI']); - foreach ($pluginMeta as $linkIndex => $existingLink) { - if ( strpos($existingLink, $escapedPluginUri) !== false ) { - $visitPluginSiteLinkIndex = $linkIndex; - $viewDetailsLinkPosition = apply_filters( - $this->updateChecker->getUniqueName('view_details_link_position'), - 'before' - ); - break; - } - } - } - - $viewDetailsLink = sprintf('%s', - esc_url(network_admin_url('plugin-install.php?tab=plugin-information&plugin=' . urlencode($this->updateChecker->slug) . - '&TB_iframe=true&width=600&height=550')), - esc_attr(sprintf(__('More information about %s'), $pluginData['Name'])), - esc_attr($pluginData['Name']), - $linkText - ); - switch ($viewDetailsLinkPosition) { - case 'before': - array_splice($pluginMeta, $visitPluginSiteLinkIndex, 0, $viewDetailsLink); - break; - case 'after': - array_splice($pluginMeta, $visitPluginSiteLinkIndex + 1, 0, $viewDetailsLink); - break; - case 'replace': - $pluginMeta[$visitPluginSiteLinkIndex] = $viewDetailsLink; - break; - case 'append': - default: - $pluginMeta[] = $viewDetailsLink; - break; - } - } - } - return $pluginMeta; - } - - /** - * Add a "Check for updates" link to the plugin row in the "Plugins" page. By default, - * the new link will appear after the "Visit plugin site" link if present, otherwise - * after the "View plugin details" link. - * - * You can change the link text by using the "puc_manual_check_link-$slug" filter. - * Returning an empty string from the filter will disable the link. - * - * @param array $pluginMeta Array of meta links. - * @param string $pluginFile - * @return array - */ - public function addCheckForUpdatesLink($pluginMeta, $pluginFile) { - if ( $this->isMyPluginFile($pluginFile) ) { - $linkUrl = wp_nonce_url( - add_query_arg( - array( - 'puc_check_for_updates' => 1, - 'puc_slug' => $this->updateChecker->slug, - ), - self_admin_url('plugins.php') - ), - 'puc_check_for_updates' - ); - - $linkText = apply_filters( - $this->updateChecker->getUniqueName('manual_check_link'), - __('Check for updates', 'plugin-update-checker') - ); - if ( !empty($linkText) ) { - /** @noinspection HtmlUnknownTarget */ - $pluginMeta[] = sprintf('%s', esc_attr($linkUrl), $linkText); - } - } - return $pluginMeta; - } - - protected function isMyPluginFile($pluginFile) { - return ($pluginFile == $this->updateChecker->pluginFile) - || (!empty($this->updateChecker->muPluginFile) && ($pluginFile == $this->updateChecker->muPluginFile)); - } - - /** - * Check for updates when the user clicks the "Check for updates" link. - * - * @see self::addCheckForUpdatesLink() - * - * @return void - */ - public function handleManualCheck() { - $shouldCheck = - isset($_GET['puc_check_for_updates'], $_GET['puc_slug']) - && $_GET['puc_slug'] == $this->updateChecker->slug - && check_admin_referer('puc_check_for_updates'); - - if ( $shouldCheck ) { - $update = $this->updateChecker->checkForUpdates(); - $status = ($update === null) ? 'no_update' : 'update_available'; - $lastRequestApiErrors = $this->updateChecker->getLastRequestApiErrors(); - - if ( ($update === null) && !empty($lastRequestApiErrors) ) { - //Some errors are not critical. For example, if PUC tries to retrieve the readme.txt - //file from GitHub and gets a 404, that's an API error, but it doesn't prevent updates - //from working. Maybe the plugin simply doesn't have a readme. - //Let's only show important errors. - $foundCriticalErrors = false; - $questionableErrorCodes = array( - 'puc-github-http-error', - 'puc-gitlab-http-error', - 'puc-bitbucket-http-error', - ); - - foreach ($lastRequestApiErrors as $item) { - $wpError = $item['error']; - /** @var WP_Error $wpError */ - if ( !in_array($wpError->get_error_code(), $questionableErrorCodes) ) { - $foundCriticalErrors = true; - break; - } - } - - if ( $foundCriticalErrors ) { - $status = 'error'; - set_site_transient($this->manualCheckErrorTransient, $lastRequestApiErrors, 60); - } - } - - wp_redirect(add_query_arg( - array( - 'puc_update_check_result' => $status, - 'puc_slug' => $this->updateChecker->slug, - ), - self_admin_url('plugins.php') - )); - exit; - } - } - - /** - * Display the results of a manual update check. - * - * @see self::handleManualCheck() - * - * You can change the result message by using the "puc_manual_check_message-$slug" filter. - */ - public function displayManualCheckResult() { - if ( isset($_GET['puc_update_check_result'], $_GET['puc_slug']) && ($_GET['puc_slug'] == $this->updateChecker->slug) ) { - $status = strval($_GET['puc_update_check_result']); - $title = $this->updateChecker->getInstalledPackage()->getPluginTitle(); - $noticeClass = 'updated notice-success'; - $details = ''; - - if ( $status == 'no_update' ) { - $message = sprintf(_x('The %s plugin is up to date.', 'the plugin title', 'plugin-update-checker'), $title); - } else if ( $status == 'update_available' ) { - $message = sprintf(_x('A new version of the %s plugin is available.', 'the plugin title', 'plugin-update-checker'), $title); - } else if ( $status === 'error' ) { - $message = sprintf(_x('Could not determine if updates are available for %s.', 'the plugin title', 'plugin-update-checker'), $title); - $noticeClass = 'error notice-error'; - - $details = $this->formatManualCheckErrors(get_site_transient($this->manualCheckErrorTransient)); - delete_site_transient($this->manualCheckErrorTransient); - } else { - $message = sprintf(__('Unknown update checker status "%s"', 'plugin-update-checker'), htmlentities($status)); - $noticeClass = 'error notice-error'; - } - printf( - '

      %s

      %s
      ', - $noticeClass, - apply_filters($this->updateChecker->getUniqueName('manual_check_message'), $message, $status), - $details - ); - } - } - - /** - * Format the list of errors that were thrown during an update check. - * - * @param array $errors - * @return string - */ - protected function formatManualCheckErrors($errors) { - if ( empty($errors) ) { - return ''; - } - $output = ''; - - $showAsList = count($errors) > 1; - if ( $showAsList ) { - $output .= '
        '; - $formatString = '
      1. %1$s %2$s
      2. '; - } else { - $formatString = '

        %1$s %2$s

        '; - } - foreach ($errors as $item) { - $wpError = $item['error']; - /** @var WP_Error $wpError */ - $output .= sprintf( - $formatString, - $wpError->get_error_message(), - $wpError->get_error_code() - ); - } - if ( $showAsList ) { - $output .= '
      '; - } - - return $output; - } - - public function removeHooks() { - remove_action('admin_init', array($this, 'onAdminInit')); - remove_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10); - remove_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10); - remove_action('all_admin_notices', array($this, 'displayManualCheckResult')); - } - } -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Update.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Update.php deleted file mode 100644 index a5ebd4d..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/Update.php +++ /dev/null @@ -1,112 +0,0 @@ -copyFields($object, $update); - return $update; - } - - /** - * @return string[] - */ - protected function getFieldNames() { - return array_merge(parent::getFieldNames(), self::$extraFields); - } - - /** - * Transform the update into the format used by WordPress native plugin API. - * - * @return object - */ - public function toWpFormat() { - $update = parent::toWpFormat(); - - $update->id = $this->id; - $update->url = $this->homepage; - $update->tested = $this->tested; - $update->requires_php = $this->requires_php; - $update->plugin = $this->filename; - - if ( !empty($this->upgrade_notice) ) { - $update->upgrade_notice = $this->upgrade_notice; - } - - if ( !empty($this->icons) && is_array($this->icons) ) { - //This should be an array with up to 4 keys: 'svg', '1x', '2x' and 'default'. - //Docs: https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-icons - $icons = array_intersect_key( - $this->icons, - array('svg' => true, '1x' => true, '2x' => true, 'default' => true) - ); - if ( !empty($icons) ) { - $update->icons = $icons; - - //It appears that the 'default' icon isn't used anywhere in WordPress 4.9, - //but lets set it just in case a future release needs it. - if ( !isset($update->icons['default']) ) { - $update->icons['default'] = current($update->icons); - } - } - } - - return $update; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/UpdateChecker.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/UpdateChecker.php deleted file mode 100644 index b4b39fa..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Plugin/UpdateChecker.php +++ /dev/null @@ -1,414 +0,0 @@ -pluginAbsolutePath = $pluginFile; - $this->pluginFile = plugin_basename($this->pluginAbsolutePath); - $this->muPluginFile = $muPluginFile; - - //If no slug is specified, use the name of the main plugin file as the slug. - //For example, 'my-cool-plugin/cool-plugin.php' becomes 'cool-plugin'. - if ( empty($slug) ){ - $slug = basename($this->pluginFile, '.php'); - } - - //Plugin slugs must be unique. - $slugCheckFilter = 'puc_is_slug_in_use-' . $slug; - $slugUsedBy = apply_filters($slugCheckFilter, false); - if ( $slugUsedBy ) { - $this->triggerError(sprintf( - 'Plugin slug "%s" is already in use by %s. Slugs must be unique.', - htmlentities($slug), - htmlentities($slugUsedBy) - ), E_USER_ERROR); - } - add_filter($slugCheckFilter, array($this, 'getAbsolutePath')); - - parent::__construct($metadataUrl, dirname($this->pluginFile), $slug, $checkPeriod, $optionName); - - //Backwards compatibility: If the plugin is a mu-plugin but no $muPluginFile is specified, assume - //it's the same as $pluginFile given that it's not in a subdirectory (WP only looks in the base dir). - if ( (strpbrk($this->pluginFile, '/\\') === false) && $this->isUnknownMuPlugin() ) { - $this->muPluginFile = $this->pluginFile; - } - - //To prevent a crash during plugin uninstallation, remove updater hooks when the user removes the plugin. - //Details: https://github.com/YahnisElsts/plugin-update-checker/issues/138#issuecomment-335590964 - add_action('uninstall_' . $this->pluginFile, array($this, 'removeHooks')); - - $this->extraUi = new Puc_v4p11_Plugin_Ui($this); - } - - /** - * Create an instance of the scheduler. - * - * @param int $checkPeriod - * @return Puc_v4p11_Scheduler - */ - protected function createScheduler($checkPeriod) { - $scheduler = new Puc_v4p11_Scheduler($this, $checkPeriod, array('load-plugins.php')); - register_deactivation_hook($this->pluginFile, array($scheduler, 'removeUpdaterCron')); - return $scheduler; - } - - /** - * Install the hooks required to run periodic update checks and inject update info - * into WP data structures. - * - * @return void - */ - protected function installHooks(){ - //Override requests for plugin information - add_filter('plugins_api', array($this, 'injectInfo'), 20, 3); - - parent::installHooks(); - } - - /** - * Remove update checker hooks. - * - * The intent is to prevent a fatal error that can happen if the plugin has an uninstall - * hook. During uninstallation, WP includes the main plugin file (which creates a PUC instance), - * the uninstall hook runs, WP deletes the plugin files and then updates some transients. - * If PUC hooks are still around at this time, they could throw an error while trying to - * autoload classes from files that no longer exist. - * - * The "site_transient_{$transient}" filter is the main problem here, but let's also remove - * most other PUC hooks to be safe. - * - * @internal - */ - public function removeHooks() { - parent::removeHooks(); - $this->extraUi->removeHooks(); - $this->package->removeHooks(); - - remove_filter('plugins_api', array($this, 'injectInfo'), 20); - } - - /** - * Retrieve plugin info from the configured API endpoint. - * - * @uses wp_remote_get() - * - * @param array $queryArgs Additional query arguments to append to the request. Optional. - * @return Puc_v4p11_Plugin_Info - */ - public function requestInfo($queryArgs = array()) { - list($pluginInfo, $result) = $this->requestMetadata('Puc_v4p11_Plugin_Info', 'request_info', $queryArgs); - - if ( $pluginInfo !== null ) { - /** @var Puc_v4p11_Plugin_Info $pluginInfo */ - $pluginInfo->filename = $this->pluginFile; - $pluginInfo->slug = $this->slug; - } - - $pluginInfo = apply_filters($this->getUniqueName('request_info_result'), $pluginInfo, $result); - return $pluginInfo; - } - - /** - * Retrieve the latest update (if any) from the configured API endpoint. - * - * @uses PluginUpdateChecker::requestInfo() - * - * @return Puc_v4p11_Update|null An instance of Plugin_Update, or NULL when no updates are available. - */ - public function requestUpdate() { - //For the sake of simplicity, this function just calls requestInfo() - //and transforms the result accordingly. - $pluginInfo = $this->requestInfo(array('checking_for_updates' => '1')); - if ( $pluginInfo === null ){ - return null; - } - $update = Puc_v4p11_Plugin_Update::fromPluginInfo($pluginInfo); - - $update = $this->filterUpdateResult($update); - - return $update; - } - - /** - * Intercept plugins_api() calls that request information about our plugin and - * use the configured API endpoint to satisfy them. - * - * @see plugins_api() - * - * @param mixed $result - * @param string $action - * @param array|object $args - * @return mixed - */ - public function injectInfo($result, $action = null, $args = null){ - $relevant = ($action == 'plugin_information') && isset($args->slug) && ( - ($args->slug == $this->slug) || ($args->slug == dirname($this->pluginFile)) - ); - if ( !$relevant ) { - return $result; - } - - $pluginInfo = $this->requestInfo(); - $this->fixSupportedWordpressVersion($pluginInfo); - - $pluginInfo = apply_filters($this->getUniqueName('pre_inject_info'), $pluginInfo); - if ( $pluginInfo ) { - return $pluginInfo->toWpFormat(); - } - - return $result; - } - - protected function shouldShowUpdates() { - //No update notifications for mu-plugins unless explicitly enabled. The MU plugin file - //is usually different from the main plugin file so the update wouldn't show up properly anyway. - return !$this->isUnknownMuPlugin(); - } - - /** - * @param stdClass|null $updates - * @param stdClass $updateToAdd - * @return stdClass - */ - protected function addUpdateToList($updates, $updateToAdd) { - if ( $this->package->isMuPlugin() ) { - //WP does not support automatic update installation for mu-plugins, but we can - //still display a notice. - $updateToAdd->package = null; - } - return parent::addUpdateToList($updates, $updateToAdd); - } - - /** - * @param stdClass|null $updates - * @return stdClass|null - */ - protected function removeUpdateFromList($updates) { - $updates = parent::removeUpdateFromList($updates); - if ( !empty($this->muPluginFile) && isset($updates, $updates->response) ) { - unset($updates->response[$this->muPluginFile]); - } - return $updates; - } - - /** - * For plugins, the update array is indexed by the plugin filename relative to the "plugins" - * directory. Example: "plugin-name/plugin.php". - * - * @return string - */ - protected function getUpdateListKey() { - if ( $this->package->isMuPlugin() ) { - return $this->muPluginFile; - } - return $this->pluginFile; - } - - protected function getNoUpdateItemFields() { - return array_merge( - parent::getNoUpdateItemFields(), - array( - 'id' => $this->pluginFile, - 'slug' => $this->slug, - 'plugin' => $this->pluginFile, - 'icons' => array(), - 'banners' => array(), - 'banners_rtl' => array(), - 'tested' => '', - 'compatibility' => new stdClass(), - ) - ); - } - - /** - * Alias for isBeingUpgraded(). - * - * @deprecated - * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. - * @return bool - */ - public function isPluginBeingUpgraded($upgrader = null) { - return $this->isBeingUpgraded($upgrader); - } - - /** - * Is there an update being installed for this plugin, right now? - * - * @param WP_Upgrader|null $upgrader - * @return bool - */ - public function isBeingUpgraded($upgrader = null) { - return $this->upgraderStatus->isPluginBeingUpgraded($this->pluginFile, $upgrader); - } - - /** - * Get the details of the currently available update, if any. - * - * If no updates are available, or if the last known update version is below or equal - * to the currently installed version, this method will return NULL. - * - * Uses cached update data. To retrieve update information straight from - * the metadata URL, call requestUpdate() instead. - * - * @return Puc_v4p11_Plugin_Update|null - */ - public function getUpdate() { - $update = parent::getUpdate(); - if ( isset($update) ) { - /** @var Puc_v4p11_Plugin_Update $update */ - $update->filename = $this->pluginFile; - } - return $update; - } - - /** - * Get the translated plugin title. - * - * @deprecated - * @return string - */ - public function getPluginTitle() { - return $this->package->getPluginTitle(); - } - - /** - * Check if the current user has the required permissions to install updates. - * - * @return bool - */ - public function userCanInstallUpdates() { - return current_user_can('update_plugins'); - } - - /** - * Check if the plugin file is inside the mu-plugins directory. - * - * @deprecated - * @return bool - */ - protected function isMuPlugin() { - return $this->package->isMuPlugin(); - } - - /** - * MU plugins are partially supported, but only when we know which file in mu-plugins - * corresponds to this plugin. - * - * @return bool - */ - protected function isUnknownMuPlugin() { - return empty($this->muPluginFile) && $this->package->isMuPlugin(); - } - - /** - * Get absolute path to the main plugin file. - * - * @return string - */ - public function getAbsolutePath() { - return $this->pluginAbsolutePath; - } - - /** - * Register a callback for filtering query arguments. - * - * The callback function should take one argument - an associative array of query arguments. - * It should return a modified array of query arguments. - * - * @uses add_filter() This method is a convenience wrapper for add_filter(). - * - * @param callable $callback - * @return void - */ - public function addQueryArgFilter($callback){ - $this->addFilter('request_info_query_args', $callback); - } - - /** - * Register a callback for filtering arguments passed to wp_remote_get(). - * - * The callback function should take one argument - an associative array of arguments - - * and return a modified array or arguments. See the WP documentation on wp_remote_get() - * for details on what arguments are available and how they work. - * - * @uses add_filter() This method is a convenience wrapper for add_filter(). - * - * @param callable $callback - * @return void - */ - public function addHttpRequestArgFilter($callback) { - $this->addFilter('request_info_options', $callback); - } - - /** - * Register a callback for filtering the plugin info retrieved from the external API. - * - * The callback function should take two arguments. If the plugin info was retrieved - * successfully, the first argument passed will be an instance of PluginInfo. Otherwise, - * it will be NULL. The second argument will be the corresponding return value of - * wp_remote_get (see WP docs for details). - * - * The callback function should return a new or modified instance of PluginInfo or NULL. - * - * @uses add_filter() This method is a convenience wrapper for add_filter(). - * - * @param callable $callback - * @return void - */ - public function addResultFilter($callback) { - $this->addFilter('request_info_result', $callback, 10, 2); - } - - protected function createDebugBarExtension() { - return new Puc_v4p11_DebugBar_PluginExtension($this); - } - - /** - * Create a package instance that represents this plugin or theme. - * - * @return Puc_v4p11_InstalledPackage - */ - protected function createInstalledPackage() { - return new Puc_v4p11_Plugin_Package($this->pluginAbsolutePath, $this); - } - - /** - * @return Puc_v4p11_Plugin_Package - */ - public function getInstalledPackage() { - return $this->package; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Scheduler.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Scheduler.php deleted file mode 100644 index dd3c3c3..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Scheduler.php +++ /dev/null @@ -1,266 +0,0 @@ -updateChecker = $updateChecker; - $this->checkPeriod = $checkPeriod; - - //Set up the periodic update checks - $this->cronHook = $this->updateChecker->getUniqueName('cron_check_updates'); - if ( $this->checkPeriod > 0 ){ - - //Trigger the check via Cron. - //Try to use one of the default schedules if possible as it's less likely to conflict - //with other plugins and their custom schedules. - $defaultSchedules = array( - 1 => 'hourly', - 12 => 'twicedaily', - 24 => 'daily', - ); - if ( array_key_exists($this->checkPeriod, $defaultSchedules) ) { - $scheduleName = $defaultSchedules[$this->checkPeriod]; - } else { - //Use a custom cron schedule. - $scheduleName = 'every' . $this->checkPeriod . 'hours'; - add_filter('cron_schedules', array($this, '_addCustomSchedule')); - } - - if ( !wp_next_scheduled($this->cronHook) && !defined('WP_INSTALLING') ) { - //Randomly offset the schedule to help prevent update server traffic spikes. Without this - //most checks may happen during times of day when people are most likely to install new plugins. - $firstCheckTime = time() - rand(0, max($this->checkPeriod * 3600 - 15 * 60, 1)); - $firstCheckTime = apply_filters( - $this->updateChecker->getUniqueName('first_check_time'), - $firstCheckTime - ); - wp_schedule_event($firstCheckTime, $scheduleName, $this->cronHook); - } - add_action($this->cronHook, array($this, 'maybeCheckForUpdates')); - - //In case Cron is disabled or unreliable, we also manually trigger - //the periodic checks while the user is browsing the Dashboard. - add_action( 'admin_init', array($this, 'maybeCheckForUpdates') ); - - //Like WordPress itself, we check more often on certain pages. - /** @see wp_update_plugins */ - add_action('load-update-core.php', array($this, 'maybeCheckForUpdates')); - //"load-update.php" and "load-plugins.php" or "load-themes.php". - $this->hourlyCheckHooks = array_merge($this->hourlyCheckHooks, $hourlyHooks); - foreach($this->hourlyCheckHooks as $hook) { - add_action($hook, array($this, 'maybeCheckForUpdates')); - } - //This hook fires after a bulk update is complete. - add_action('upgrader_process_complete', array($this, 'upgraderProcessComplete'), 11, 2); - - } else { - //Periodic checks are disabled. - wp_clear_scheduled_hook($this->cronHook); - } - } - - /** - * Runs upon the WP action upgrader_process_complete. - * - * We look at the parameters to decide whether to call maybeCheckForUpdates() or not. - * We also check if the update checker has been removed by the update. - * - * @param WP_Upgrader $upgrader WP_Upgrader instance - * @param array $upgradeInfo extra information about the upgrade - */ - public function upgraderProcessComplete( - /** @noinspection PhpUnusedParameterInspection */ - $upgrader, $upgradeInfo - ) { - //Cancel all further actions if the current version of PUC has been deleted or overwritten - //by a different version during the upgrade. If we try to do anything more in that situation, - //we could trigger a fatal error by trying to autoload a deleted class. - clearstatcache(); - if ( !file_exists(__FILE__) ) { - $this->removeHooks(); - $this->updateChecker->removeHooks(); - return; - } - - //Sanity check and limitation to relevant types. - if ( - !is_array($upgradeInfo) || !isset($upgradeInfo['type'], $upgradeInfo['action']) - || 'update' !== $upgradeInfo['action'] || !in_array($upgradeInfo['type'], array('plugin', 'theme')) - ) { - return; - } - - //Filter out notifications of upgrades that should have no bearing upon whether or not our - //current info is up-to-date. - if ( is_a($this->updateChecker, 'Puc_v4p11_Theme_UpdateChecker') ) { - if ( 'theme' !== $upgradeInfo['type'] || !isset($upgradeInfo['themes']) ) { - return; - } - - //Letting too many things going through for checks is not a real problem, so we compare widely. - if ( !in_array( - strtolower($this->updateChecker->directoryName), - array_map('strtolower', $upgradeInfo['themes']) - ) ) { - return; - } - } - - if ( is_a($this->updateChecker, 'Puc_v4p11_Plugin_UpdateChecker') ) { - if ( 'plugin' !== $upgradeInfo['type'] || !isset($upgradeInfo['plugins']) ) { - return; - } - - //Themes pass in directory names in the information array, but plugins use the relative plugin path. - if ( !in_array( - strtolower($this->updateChecker->directoryName), - array_map('dirname', array_map('strtolower', $upgradeInfo['plugins'])) - ) ) { - return; - } - } - - $this->maybeCheckForUpdates(); - } - - /** - * Check for updates if the configured check interval has already elapsed. - * Will use a shorter check interval on certain admin pages like "Dashboard -> Updates" or when doing cron. - * - * You can override the default behaviour by using the "puc_check_now-$slug" filter. - * The filter callback will be passed three parameters: - * - Current decision. TRUE = check updates now, FALSE = don't check now. - * - Last check time as a Unix timestamp. - * - Configured check period in hours. - * Return TRUE to check for updates immediately, or FALSE to cancel. - * - * This method is declared public because it's a hook callback. Calling it directly is not recommended. - */ - public function maybeCheckForUpdates() { - if ( empty($this->checkPeriod) ){ - return; - } - - $state = $this->updateChecker->getUpdateState(); - $shouldCheck = ($state->timeSinceLastCheck() >= $this->getEffectiveCheckPeriod()); - - //Let plugin authors substitute their own algorithm. - $shouldCheck = apply_filters( - $this->updateChecker->getUniqueName('check_now'), - $shouldCheck, - $state->getLastCheck(), - $this->checkPeriod - ); - - if ( $shouldCheck ) { - $this->updateChecker->checkForUpdates(); - } - } - - /** - * Calculate the actual check period based on the current status and environment. - * - * @return int Check period in seconds. - */ - protected function getEffectiveCheckPeriod() { - $currentFilter = current_filter(); - if ( in_array($currentFilter, array('load-update-core.php', 'upgrader_process_complete')) ) { - //Check more often when the user visits "Dashboard -> Updates" or does a bulk update. - $period = 60; - } else if ( in_array($currentFilter, $this->hourlyCheckHooks) ) { - //Also check more often on /wp-admin/update.php and the "Plugins" or "Themes" page. - $period = 3600; - } else if ( $this->throttleRedundantChecks && ($this->updateChecker->getUpdate() !== null) ) { - //Check less frequently if it's already known that an update is available. - $period = $this->throttledCheckPeriod * 3600; - } else if ( defined('DOING_CRON') && constant('DOING_CRON') ) { - //WordPress cron schedules are not exact, so lets do an update check even - //if slightly less than $checkPeriod hours have elapsed since the last check. - $cronFuzziness = 20 * 60; - $period = $this->checkPeriod * 3600 - $cronFuzziness; - } else { - $period = $this->checkPeriod * 3600; - } - - return $period; - } - - /** - * Add our custom schedule to the array of Cron schedules used by WP. - * - * @param array $schedules - * @return array - */ - public function _addCustomSchedule($schedules) { - if ( $this->checkPeriod && ($this->checkPeriod > 0) ){ - $scheduleName = 'every' . $this->checkPeriod . 'hours'; - $schedules[$scheduleName] = array( - 'interval' => $this->checkPeriod * 3600, - 'display' => sprintf('Every %d hours', $this->checkPeriod), - ); - } - return $schedules; - } - - /** - * Remove the scheduled cron event that the library uses to check for updates. - * - * @return void - */ - public function removeUpdaterCron() { - wp_clear_scheduled_hook($this->cronHook); - } - - /** - * Get the name of the update checker's WP-cron hook. Mostly useful for debugging. - * - * @return string - */ - public function getCronHookName() { - return $this->cronHook; - } - - /** - * Remove most hooks added by the scheduler. - */ - public function removeHooks() { - remove_filter('cron_schedules', array($this, '_addCustomSchedule')); - remove_action('admin_init', array($this, 'maybeCheckForUpdates')); - remove_action('load-update-core.php', array($this, 'maybeCheckForUpdates')); - - if ( $this->cronHook !== null ) { - remove_action($this->cronHook, array($this, 'maybeCheckForUpdates')); - } - if ( !empty($this->hourlyCheckHooks) ) { - foreach ($this->hourlyCheckHooks as $hook) { - remove_action($hook, array($this, 'maybeCheckForUpdates')); - } - } - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/StateStore.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/StateStore.php deleted file mode 100644 index 01abcc9..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/StateStore.php +++ /dev/null @@ -1,207 +0,0 @@ -optionName = $optionName; - } - - /** - * Get time elapsed since the last update check. - * - * If there are no recorded update checks, this method returns a large arbitrary number - * (i.e. time since the Unix epoch). - * - * @return int Elapsed time in seconds. - */ - public function timeSinceLastCheck() { - $this->lazyLoad(); - return time() - $this->lastCheck; - } - - /** - * @return int - */ - public function getLastCheck() { - $this->lazyLoad(); - return $this->lastCheck; - } - - /** - * Set the time of the last update check to the current timestamp. - * - * @return $this - */ - public function setLastCheckToNow() { - $this->lazyLoad(); - $this->lastCheck = time(); - return $this; - } - - /** - * @return null|Puc_v4p11_Update - */ - public function getUpdate() { - $this->lazyLoad(); - return $this->update; - } - - /** - * @param Puc_v4p11_Update|null $update - * @return $this - */ - public function setUpdate(Puc_v4p11_Update $update = null) { - $this->lazyLoad(); - $this->update = $update; - return $this; - } - - /** - * @return string - */ - public function getCheckedVersion() { - $this->lazyLoad(); - return $this->checkedVersion; - } - - /** - * @param string $version - * @return $this - */ - public function setCheckedVersion($version) { - $this->lazyLoad(); - $this->checkedVersion = strval($version); - return $this; - } - - /** - * Get translation updates. - * - * @return array - */ - public function getTranslations() { - $this->lazyLoad(); - if ( isset($this->update, $this->update->translations) ) { - return $this->update->translations; - } - return array(); - } - - /** - * Set translation updates. - * - * @param array $translationUpdates - */ - public function setTranslations($translationUpdates) { - $this->lazyLoad(); - if ( isset($this->update) ) { - $this->update->translations = $translationUpdates; - $this->save(); - } - } - - public function save() { - $state = new stdClass(); - - $state->lastCheck = $this->lastCheck; - $state->checkedVersion = $this->checkedVersion; - - if ( isset($this->update)) { - $state->update = $this->update->toStdClass(); - - $updateClass = get_class($this->update); - $state->updateClass = $updateClass; - $prefix = $this->getLibPrefix(); - if ( Puc_v4p11_Utils::startsWith($updateClass, $prefix) ) { - $state->updateBaseClass = substr($updateClass, strlen($prefix)); - } - } - - update_site_option($this->optionName, $state); - $this->isLoaded = true; - } - - /** - * @return $this - */ - public function lazyLoad() { - if ( !$this->isLoaded ) { - $this->load(); - } - return $this; - } - - protected function load() { - $this->isLoaded = true; - - $state = get_site_option($this->optionName, null); - - if ( !is_object($state) ) { - $this->lastCheck = 0; - $this->checkedVersion = ''; - $this->update = null; - return; - } - - $this->lastCheck = intval(Puc_v4p11_Utils::get($state, 'lastCheck', 0)); - $this->checkedVersion = Puc_v4p11_Utils::get($state, 'checkedVersion', ''); - $this->update = null; - - if ( isset($state->update) ) { - //This mess is due to the fact that the want the update class from this version - //of the library, not the version that saved the update. - - $updateClass = null; - if ( isset($state->updateBaseClass) ) { - $updateClass = $this->getLibPrefix() . $state->updateBaseClass; - } else if ( isset($state->updateClass) && class_exists($state->updateClass) ) { - $updateClass = $state->updateClass; - } - - if ( $updateClass !== null ) { - $this->update = call_user_func(array($updateClass, 'fromObject'), $state->update); - } - } - } - - public function delete() { - delete_site_option($this->optionName); - - $this->lastCheck = 0; - $this->checkedVersion = ''; - $this->update = null; - } - - private function getLibPrefix() { - $parts = explode('_', __CLASS__, 3); - return $parts[0] . '_' . $parts[1] . '_'; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Package.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Package.php deleted file mode 100644 index 3cfbce9..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Package.php +++ /dev/null @@ -1,65 +0,0 @@ -stylesheet = $stylesheet; - $this->theme = wp_get_theme($this->stylesheet); - - parent::__construct($updateChecker); - } - - public function getInstalledVersion() { - return $this->theme->get('Version'); - } - - public function getAbsoluteDirectoryPath() { - if ( method_exists($this->theme, 'get_stylesheet_directory') ) { - return $this->theme->get_stylesheet_directory(); //Available since WP 3.4. - } - return get_theme_root($this->stylesheet) . '/' . $this->stylesheet; - } - - /** - * Get the value of a specific plugin or theme header. - * - * @param string $headerName - * @param string $defaultValue - * @return string Either the value of the header, or $defaultValue if the header doesn't exist or is empty. - */ - public function getHeaderValue($headerName, $defaultValue = '') { - $value = $this->theme->get($headerName); - if ( ($headerName === false) || ($headerName === '') ) { - return $defaultValue; - } - return $value; - } - - protected function getHeaderNames() { - return array( - 'Name' => 'Theme Name', - 'ThemeURI' => 'Theme URI', - 'Description' => 'Description', - 'Author' => 'Author', - 'AuthorURI' => 'Author URI', - 'Version' => 'Version', - 'Template' => 'Template', - 'Status' => 'Status', - 'Tags' => 'Tags', - 'TextDomain' => 'Text Domain', - 'DomainPath' => 'Domain Path', - ); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Update.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Update.php deleted file mode 100644 index 9fc46f8..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/Update.php +++ /dev/null @@ -1,84 +0,0 @@ - $this->slug, - 'new_version' => $this->version, - 'url' => $this->details_url, - ); - - if ( !empty($this->download_url) ) { - $update['package'] = $this->download_url; - } - - return $update; - } - - /** - * Create a new instance of Theme_Update from its JSON-encoded representation. - * - * @param string $json Valid JSON string representing a theme information object. - * @return self New instance of ThemeUpdate, or NULL on error. - */ - public static function fromJson($json) { - $instance = new self(); - if ( !parent::createFromJson($json, $instance) ) { - return null; - } - return $instance; - } - - /** - * Create a new instance by copying the necessary fields from another object. - * - * @param StdClass|Puc_v4p11_Theme_Update $object The source object. - * @return Puc_v4p11_Theme_Update The new copy. - */ - public static function fromObject($object) { - $update = new self(); - $update->copyFields($object, $update); - return $update; - } - - /** - * Basic validation. - * - * @param StdClass $apiResponse - * @return bool|WP_Error - */ - protected function validateMetadata($apiResponse) { - $required = array('version', 'details_url'); - foreach($required as $key) { - if ( !isset($apiResponse->$key) || empty($apiResponse->$key) ) { - return new WP_Error( - 'tuc-invalid-metadata', - sprintf('The theme metadata is missing the required "%s" key.', $key) - ); - } - } - return true; - } - - protected function getFieldNames() { - return array_merge(parent::getFieldNames(), self::$extraFields); - } - - protected function getPrefixedFilter($tag) { - return parent::getPrefixedFilter($tag) . '_theme'; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/UpdateChecker.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/UpdateChecker.php deleted file mode 100644 index 091445e..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Theme/UpdateChecker.php +++ /dev/null @@ -1,152 +0,0 @@ -stylesheet = $stylesheet; - - parent::__construct( - $metadataUrl, - $stylesheet, - $customSlug ? $customSlug : $stylesheet, - $checkPeriod, - $optionName - ); - } - - /** - * For themes, the update array is indexed by theme directory name. - * - * @return string - */ - protected function getUpdateListKey() { - return $this->directoryName; - } - - /** - * Retrieve the latest update (if any) from the configured API endpoint. - * - * @return Puc_v4p11_Update|null An instance of Update, or NULL when no updates are available. - */ - public function requestUpdate() { - list($themeUpdate, $result) = $this->requestMetadata('Puc_v4p11_Theme_Update', 'request_update'); - - if ( $themeUpdate !== null ) { - /** @var Puc_v4p11_Theme_Update $themeUpdate */ - $themeUpdate->slug = $this->slug; - } - - $themeUpdate = $this->filterUpdateResult($themeUpdate, $result); - return $themeUpdate; - } - - protected function getNoUpdateItemFields() { - return array_merge( - parent::getNoUpdateItemFields(), - array( - 'theme' => $this->directoryName, - 'requires' => '', - ) - ); - } - - public function userCanInstallUpdates() { - return current_user_can('update_themes'); - } - - /** - * Create an instance of the scheduler. - * - * @param int $checkPeriod - * @return Puc_v4p11_Scheduler - */ - protected function createScheduler($checkPeriod) { - return new Puc_v4p11_Scheduler($this, $checkPeriod, array('load-themes.php')); - } - - /** - * Is there an update being installed right now for this theme? - * - * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. - * @return bool - */ - public function isBeingUpgraded($upgrader = null) { - return $this->upgraderStatus->isThemeBeingUpgraded($this->stylesheet, $upgrader); - } - - protected function createDebugBarExtension() { - return new Puc_v4p11_DebugBar_Extension($this, 'Puc_v4p11_DebugBar_ThemePanel'); - } - - /** - * Register a callback for filtering query arguments. - * - * The callback function should take one argument - an associative array of query arguments. - * It should return a modified array of query arguments. - * - * @param callable $callback - * @return void - */ - public function addQueryArgFilter($callback){ - $this->addFilter('request_update_query_args', $callback); - } - - /** - * Register a callback for filtering arguments passed to wp_remote_get(). - * - * The callback function should take one argument - an associative array of arguments - - * and return a modified array or arguments. See the WP documentation on wp_remote_get() - * for details on what arguments are available and how they work. - * - * @uses add_filter() This method is a convenience wrapper for add_filter(). - * - * @param callable $callback - * @return void - */ - public function addHttpRequestArgFilter($callback) { - $this->addFilter('request_update_options', $callback); - } - - /** - * Register a callback for filtering theme updates retrieved from the external API. - * - * The callback function should take two arguments. If the theme update was retrieved - * successfully, the first argument passed will be an instance of Theme_Update. Otherwise, - * it will be NULL. The second argument will be the corresponding return value of - * wp_remote_get (see WP docs for details). - * - * The callback function should return a new or modified instance of Theme_Update or NULL. - * - * @uses add_filter() This method is a convenience wrapper for add_filter(). - * - * @param callable $callback - * @return void - */ - public function addResultFilter($callback) { - $this->addFilter('request_update_result', $callback, 10, 2); - } - - /** - * Create a package instance that represents this plugin or theme. - * - * @return Puc_v4p11_InstalledPackage - */ - protected function createInstalledPackage() { - return new Puc_v4p11_Theme_Package($this->stylesheet, $this); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Update.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Update.php deleted file mode 100644 index 82c048a..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Update.php +++ /dev/null @@ -1,34 +0,0 @@ -slug = $this->slug; - $update->new_version = $this->version; - $update->package = $this->download_url; - - return $update; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpdateChecker.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpdateChecker.php deleted file mode 100644 index 56fe8f0..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpdateChecker.php +++ /dev/null @@ -1,997 +0,0 @@ -debugMode = (bool)(constant('WP_DEBUG')); - $this->metadataUrl = $metadataUrl; - $this->directoryName = $directoryName; - $this->slug = !empty($slug) ? $slug : $this->directoryName; - - $this->optionName = $optionName; - if ( empty($this->optionName) ) { - //BC: Initially the library only supported plugin updates and didn't use type prefixes - //in the option name. Lets use the same prefix-less name when possible. - if ( $this->filterSuffix === '' ) { - $this->optionName = 'external_updates-' . $this->slug; - } else { - $this->optionName = $this->getUniqueName('external_updates'); - } - } - - $this->package = $this->createInstalledPackage(); - $this->scheduler = $this->createScheduler($checkPeriod); - $this->upgraderStatus = new Puc_v4p11_UpgraderStatus(); - $this->updateState = new Puc_v4p11_StateStore($this->optionName); - - if ( did_action('init') ) { - $this->loadTextDomain(); - } else { - add_action('init', array($this, 'loadTextDomain')); - } - - $this->installHooks(); - } - - /** - * @internal - */ - public function loadTextDomain() { - //We're not using load_plugin_textdomain() or its siblings because figuring out where - //the library is located (plugin, mu-plugin, theme, custom wp-content paths) is messy. - $domain = 'plugin-update-checker'; - $locale = apply_filters( - 'plugin_locale', - (is_admin() && function_exists('get_user_locale')) ? get_user_locale() : get_locale(), - $domain - ); - - $moFile = $domain . '-' . $locale . '.mo'; - $path = realpath(dirname(__FILE__) . '/../../languages'); - - if ($path && file_exists($path)) { - load_textdomain($domain, $path . '/' . $moFile); - } - } - - protected function installHooks() { - //Insert our update info into the update array maintained by WP. - add_filter('site_transient_' . $this->updateTransient, array($this,'injectUpdate')); - - //Insert translation updates into the update list. - add_filter('site_transient_' . $this->updateTransient, array($this, 'injectTranslationUpdates')); - - //Clear translation updates when WP clears the update cache. - //This needs to be done directly because the library doesn't actually remove obsolete plugin updates, - //it just hides them (see getUpdate()). We can't do that with translations - too much disk I/O. - add_action( - 'delete_site_transient_' . $this->updateTransient, - array($this, 'clearCachedTranslationUpdates') - ); - - //Rename the update directory to be the same as the existing directory. - if ( $this->directoryName !== '.' ) { - add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3); - } - - //Allow HTTP requests to the metadata URL even if it's on a local host. - add_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10, 2); - - //DebugBar integration. - if ( did_action('plugins_loaded') ) { - $this->maybeInitDebugBar(); - } else { - add_action('plugins_loaded', array($this, 'maybeInitDebugBar')); - } - } - - /** - * Remove hooks that were added by this update checker instance. - */ - public function removeHooks() { - remove_filter('site_transient_' . $this->updateTransient, array($this,'injectUpdate')); - remove_filter('site_transient_' . $this->updateTransient, array($this, 'injectTranslationUpdates')); - remove_action( - 'delete_site_transient_' . $this->updateTransient, - array($this, 'clearCachedTranslationUpdates') - ); - - remove_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10); - remove_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10); - remove_action('plugins_loaded', array($this, 'maybeInitDebugBar')); - - remove_action('init', array($this, 'loadTextDomain')); - - if ( $this->scheduler ) { - $this->scheduler->removeHooks(); - } - - if ( $this->debugBarExtension ) { - $this->debugBarExtension->removeHooks(); - } - } - - /** - * Check if the current user has the required permissions to install updates. - * - * @return bool - */ - abstract public function userCanInstallUpdates(); - - /** - * Explicitly allow HTTP requests to the metadata URL. - * - * WordPress has a security feature where the HTTP API will reject all requests that are sent to - * another site hosted on the same server as the current site (IP match), a local host, or a local - * IP, unless the host exactly matches the current site. - * - * This feature is opt-in (at least in WP 4.4). Apparently some people enable it. - * - * That can be a problem when you're developing your plugin and you decide to host the update information - * on the same server as your test site. Update requests will mysteriously fail. - * - * We fix that by adding an exception for the metadata host. - * - * @param bool $allow - * @param string $host - * @return bool - */ - public function allowMetadataHost($allow, $host) { - if ( $this->cachedMetadataHost === 0 ) { - $this->cachedMetadataHost = parse_url($this->metadataUrl, PHP_URL_HOST); - } - - if ( is_string($this->cachedMetadataHost) && (strtolower($host) === strtolower($this->cachedMetadataHost)) ) { - return true; - } - return $allow; - } - - /** - * Create a package instance that represents this plugin or theme. - * - * @return Puc_v4p11_InstalledPackage - */ - abstract protected function createInstalledPackage(); - - /** - * @return Puc_v4p11_InstalledPackage - */ - public function getInstalledPackage() { - return $this->package; - } - - /** - * Create an instance of the scheduler. - * - * This is implemented as a method to make it possible for plugins to subclass the update checker - * and substitute their own scheduler. - * - * @param int $checkPeriod - * @return Puc_v4p11_Scheduler - */ - abstract protected function createScheduler($checkPeriod); - - /** - * Check for updates. The results are stored in the DB option specified in $optionName. - * - * @return Puc_v4p11_Update|null - */ - public function checkForUpdates() { - $installedVersion = $this->getInstalledVersion(); - //Fail silently if we can't find the plugin/theme or read its header. - if ( $installedVersion === null ) { - $this->triggerError( - sprintf('Skipping update check for %s - installed version unknown.', $this->slug), - E_USER_WARNING - ); - return null; - } - - //Start collecting API errors. - $this->lastRequestApiErrors = array(); - add_action('puc_api_error', array($this, 'collectApiErrors'), 10, 4); - - $state = $this->updateState; - $state->setLastCheckToNow() - ->setCheckedVersion($installedVersion) - ->save(); //Save before checking in case something goes wrong - - $state->setUpdate($this->requestUpdate()); - $state->save(); - - //Stop collecting API errors. - remove_action('puc_api_error', array($this, 'collectApiErrors'), 10); - - return $this->getUpdate(); - } - - /** - * Load the update checker state from the DB. - * - * @return Puc_v4p11_StateStore - */ - public function getUpdateState() { - return $this->updateState->lazyLoad(); - } - - /** - * Reset update checker state - i.e. last check time, cached update data and so on. - * - * Call this when your plugin is being uninstalled, or if you want to - * clear the update cache. - */ - public function resetUpdateState() { - $this->updateState->delete(); - } - - /** - * Get the details of the currently available update, if any. - * - * If no updates are available, or if the last known update version is below or equal - * to the currently installed version, this method will return NULL. - * - * Uses cached update data. To retrieve update information straight from - * the metadata URL, call requestUpdate() instead. - * - * @return Puc_v4p11_Update|null - */ - public function getUpdate() { - $update = $this->updateState->getUpdate(); - - //Is there an update available? - if ( isset($update) ) { - //Check if the update is actually newer than the currently installed version. - $installedVersion = $this->getInstalledVersion(); - if ( ($installedVersion !== null) && version_compare($update->version, $installedVersion, '>') ){ - return $update; - } - } - return null; - } - - /** - * Retrieve the latest update (if any) from the configured API endpoint. - * - * Subclasses should run the update through filterUpdateResult before returning it. - * - * @return Puc_v4p11_Update An instance of Update, or NULL when no updates are available. - */ - abstract public function requestUpdate(); - - /** - * Filter the result of a requestUpdate() call. - * - * @param Puc_v4p11_Update|null $update - * @param array|WP_Error|null $httpResult The value returned by wp_remote_get(), if any. - * @return Puc_v4p11_Update - */ - protected function filterUpdateResult($update, $httpResult = null) { - //Let plugins/themes modify the update. - $update = apply_filters($this->getUniqueName('request_update_result'), $update, $httpResult); - - $this->fixSupportedWordpressVersion($update); - - if ( isset($update, $update->translations) ) { - //Keep only those translation updates that apply to this site. - $update->translations = $this->filterApplicableTranslations($update->translations); - } - - return $update; - } - - /** - * The "Tested up to" field in the plugin metadata is supposed to be in the form of "major.minor", - * while WordPress core's list_plugin_updates() expects the $update->tested field to be an exact - * version, e.g. "major.minor.patch", to say it's compatible. In other case it shows - * "Compatibility: Unknown". - * The function mimics how wordpress.org API crafts the "tested" field out of "Tested up to". - * - * @param Puc_v4p11_Metadata|null $update - */ - protected function fixSupportedWordpressVersion(Puc_v4p11_Metadata $update = null) { - if ( !isset($update->tested) || !preg_match('/^\d++\.\d++$/', $update->tested) ) { - return; - } - - $actualWpVersions = array(); - - $wpVersion = $GLOBALS['wp_version']; - - if ( function_exists('get_core_updates') ) { - $coreUpdates = get_core_updates(); - if ( is_array($coreUpdates) ) { - foreach ($coreUpdates as $coreUpdate) { - if ( isset($coreUpdate->current) ) { - $actualWpVersions[] = $coreUpdate->current; - } - } - } - } - - $actualWpVersions[] = $wpVersion; - - $actualWpPatchNumber = null; - foreach ($actualWpVersions as $version) { - if ( preg_match('/^(?P\d++\.\d++)(?:\.(?P\d++))?/', $version, $versionParts) ) { - if ( $versionParts['majorMinor'] === $update->tested ) { - $patch = isset($versionParts['patch']) ? intval($versionParts['patch']) : 0; - if ( $actualWpPatchNumber === null ) { - $actualWpPatchNumber = $patch; - } else { - $actualWpPatchNumber = max($actualWpPatchNumber, $patch); - } - } - } - } - if ( $actualWpPatchNumber === null ) { - $actualWpPatchNumber = 999; - } - - if ( $actualWpPatchNumber > 0 ) { - $update->tested .= '.' . $actualWpPatchNumber; - } - } - - /** - * Get the currently installed version of the plugin or theme. - * - * @return string|null Version number. - */ - public function getInstalledVersion() { - return $this->package->getInstalledVersion(); - } - - /** - * Get the full path of the plugin or theme directory. - * - * @return string - */ - public function getAbsoluteDirectoryPath() { - return $this->package->getAbsoluteDirectoryPath(); - } - - /** - * Trigger a PHP error, but only when $debugMode is enabled. - * - * @param string $message - * @param int $errorType - */ - public function triggerError($message, $errorType) { - if ( $this->isDebugModeEnabled() ) { - trigger_error($message, $errorType); - } - } - - /** - * @return bool - */ - protected function isDebugModeEnabled() { - if ( $this->debugMode === null ) { - $this->debugMode = (bool)(constant('WP_DEBUG')); - } - return $this->debugMode; - } - - /** - * Get the full name of an update checker filter, action or DB entry. - * - * This method adds the "puc_" prefix and the "-$slug" suffix to the filter name. - * For example, "pre_inject_update" becomes "puc_pre_inject_update-plugin-slug". - * - * @param string $baseTag - * @return string - */ - public function getUniqueName($baseTag) { - $name = 'puc_' . $baseTag; - if ( $this->filterSuffix !== '' ) { - $name .= '_' . $this->filterSuffix; - } - return $name . '-' . $this->slug; - } - - /** - * Store API errors that are generated when checking for updates. - * - * @internal - * @param WP_Error $error - * @param array|null $httpResponse - * @param string|null $url - * @param string|null $slug - */ - public function collectApiErrors($error, $httpResponse = null, $url = null, $slug = null) { - if ( isset($slug) && ($slug !== $this->slug) ) { - return; - } - - $this->lastRequestApiErrors[] = array( - 'error' => $error, - 'httpResponse' => $httpResponse, - 'url' => $url, - ); - } - - /** - * @return array - */ - public function getLastRequestApiErrors() { - return $this->lastRequestApiErrors; - } - - /* ------------------------------------------------------------------- - * PUC filters and filter utilities - * ------------------------------------------------------------------- - */ - - /** - * Register a callback for one of the update checker filters. - * - * Identical to add_filter(), except it automatically adds the "puc_" prefix - * and the "-$slug" suffix to the filter name. For example, "request_info_result" - * becomes "puc_request_info_result-your_plugin_slug". - * - * @param string $tag - * @param callable $callback - * @param int $priority - * @param int $acceptedArgs - */ - public function addFilter($tag, $callback, $priority = 10, $acceptedArgs = 1) { - add_filter($this->getUniqueName($tag), $callback, $priority, $acceptedArgs); - } - - /* ------------------------------------------------------------------- - * Inject updates - * ------------------------------------------------------------------- - */ - - /** - * Insert the latest update (if any) into the update list maintained by WP. - * - * @param stdClass $updates Update list. - * @return stdClass Modified update list. - */ - public function injectUpdate($updates) { - //Is there an update to insert? - $update = $this->getUpdate(); - - if ( !$this->shouldShowUpdates() ) { - $update = null; - } - - if ( !empty($update) ) { - //Let plugins filter the update info before it's passed on to WordPress. - $update = apply_filters($this->getUniqueName('pre_inject_update'), $update); - $updates = $this->addUpdateToList($updates, $update->toWpFormat()); - } else { - //Clean up any stale update info. - $updates = $this->removeUpdateFromList($updates); - //Add a placeholder item to the "no_update" list to enable auto-update support. - //If we don't do this, the option to enable automatic updates will only show up - //when an update is available. - $updates = $this->addNoUpdateItem($updates); - } - - return $updates; - } - - /** - * @param stdClass|null $updates - * @param stdClass|array $updateToAdd - * @return stdClass - */ - protected function addUpdateToList($updates, $updateToAdd) { - if ( !is_object($updates) ) { - $updates = new stdClass(); - $updates->response = array(); - } - - $updates->response[$this->getUpdateListKey()] = $updateToAdd; - return $updates; - } - - /** - * @param stdClass|null $updates - * @return stdClass|null - */ - protected function removeUpdateFromList($updates) { - if ( isset($updates, $updates->response) ) { - unset($updates->response[$this->getUpdateListKey()]); - } - return $updates; - } - - /** - * See this post for more information: - * @link https://make.wordpress.org/core/2020/07/30/recommended-usage-of-the-updates-api-to-support-the-auto-updates-ui-for-plugins-and-themes-in-wordpress-5-5/ - * - * @param stdClass|null $updates - * @return stdClass - */ - protected function addNoUpdateItem($updates) { - if ( !is_object($updates) ) { - $updates = new stdClass(); - $updates->response = array(); - $updates->no_update = array(); - } else if ( !isset($updates->no_update) ) { - $updates->no_update = array(); - } - - $updates->no_update[$this->getUpdateListKey()] = (object) $this->getNoUpdateItemFields(); - - return $updates; - } - - /** - * Subclasses should override this method to add fields that are specific to plugins or themes. - * @return array - */ - protected function getNoUpdateItemFields() { - return array( - 'new_version' => $this->getInstalledVersion(), - 'url' => '', - 'package' => '', - 'requires_php' => '', - ); - } - - /** - * Get the key that will be used when adding updates to the update list that's maintained - * by the WordPress core. The list is always an associative array, but the key is different - * for plugins and themes. - * - * @return string - */ - abstract protected function getUpdateListKey(); - - /** - * Should we show available updates? - * - * Usually the answer is "yes", but there are exceptions. For example, WordPress doesn't - * support automatic updates installation for mu-plugins, so PUC usually won't show update - * notifications in that case. See the plugin-specific subclass for details. - * - * Note: This method only applies to updates that are displayed (or not) in the WordPress - * admin. It doesn't affect APIs like requestUpdate and getUpdate. - * - * @return bool - */ - protected function shouldShowUpdates() { - return true; - } - - /* ------------------------------------------------------------------- - * JSON-based update API - * ------------------------------------------------------------------- - */ - - /** - * Retrieve plugin or theme metadata from the JSON document at $this->metadataUrl. - * - * @param string $metaClass Parse the JSON as an instance of this class. It must have a static fromJson method. - * @param string $filterRoot - * @param array $queryArgs Additional query arguments. - * @return array [Puc_v4p11_Metadata|null, array|WP_Error] A metadata instance and the value returned by wp_remote_get(). - */ - protected function requestMetadata($metaClass, $filterRoot, $queryArgs = array()) { - //Query args to append to the URL. Plugins can add their own by using a filter callback (see addQueryArgFilter()). - $queryArgs = array_merge( - array( - 'installed_version' => strval($this->getInstalledVersion()), - 'php' => phpversion(), - 'locale' => get_locale(), - ), - $queryArgs - ); - $queryArgs = apply_filters($this->getUniqueName($filterRoot . '_query_args'), $queryArgs); - - //Various options for the wp_remote_get() call. Plugins can filter these, too. - $options = array( - 'timeout' => 10, //seconds - 'headers' => array( - 'Accept' => 'application/json', - ), - ); - $options = apply_filters($this->getUniqueName($filterRoot . '_options'), $options); - - //The metadata file should be at 'http://your-api.com/url/here/$slug/info.json' - $url = $this->metadataUrl; - if ( !empty($queryArgs) ){ - $url = add_query_arg($queryArgs, $url); - } - - $result = wp_remote_get($url, $options); - - $result = apply_filters($this->getUniqueName('request_metadata_http_result'), $result, $url, $options); - - //Try to parse the response - $status = $this->validateApiResponse($result); - $metadata = null; - if ( !is_wp_error($status) ){ - if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($metaClass, '\\') === false) ) { - $metaClass = __NAMESPACE__ . '\\' . $metaClass; - } - $metadata = call_user_func(array($metaClass, 'fromJson'), $result['body']); - } else { - do_action('puc_api_error', $status, $result, $url, $this->slug); - $this->triggerError( - sprintf('The URL %s does not point to a valid metadata file. ', $url) - . $status->get_error_message(), - E_USER_WARNING - ); - } - - return array($metadata, $result); - } - - /** - * Check if $result is a successful update API response. - * - * @param array|WP_Error $result - * @return true|WP_Error - */ - protected function validateApiResponse($result) { - if ( is_wp_error($result) ) { /** @var WP_Error $result */ - return new WP_Error($result->get_error_code(), 'WP HTTP Error: ' . $result->get_error_message()); - } - - if ( !isset($result['response']['code']) ) { - return new WP_Error( - 'puc_no_response_code', - 'wp_remote_get() returned an unexpected result.' - ); - } - - if ( $result['response']['code'] !== 200 ) { - return new WP_Error( - 'puc_unexpected_response_code', - 'HTTP response code is ' . $result['response']['code'] . ' (expected: 200)' - ); - } - - if ( empty($result['body']) ) { - return new WP_Error('puc_empty_response', 'The metadata file appears to be empty.'); - } - - return true; - } - - /* ------------------------------------------------------------------- - * Language packs / Translation updates - * ------------------------------------------------------------------- - */ - - /** - * Filter a list of translation updates and return a new list that contains only updates - * that apply to the current site. - * - * @param array $translations - * @return array - */ - protected function filterApplicableTranslations($translations) { - $languages = array_flip(array_values(get_available_languages())); - $installedTranslations = $this->getInstalledTranslations(); - - $applicableTranslations = array(); - foreach ($translations as $translation) { - //Does it match one of the available core languages? - $isApplicable = array_key_exists($translation->language, $languages); - //Is it more recent than an already-installed translation? - if ( isset($installedTranslations[$translation->language]) ) { - $updateTimestamp = strtotime($translation->updated); - $installedTimestamp = strtotime($installedTranslations[$translation->language]['PO-Revision-Date']); - $isApplicable = $updateTimestamp > $installedTimestamp; - } - - if ( $isApplicable ) { - $applicableTranslations[] = $translation; - } - } - - return $applicableTranslations; - } - - /** - * Get a list of installed translations for this plugin or theme. - * - * @return array - */ - protected function getInstalledTranslations() { - if ( !function_exists('wp_get_installed_translations') ) { - return array(); - } - $installedTranslations = wp_get_installed_translations($this->translationType . 's'); - if ( isset($installedTranslations[$this->directoryName]) ) { - $installedTranslations = $installedTranslations[$this->directoryName]; - } else { - $installedTranslations = array(); - } - return $installedTranslations; - } - - /** - * Insert translation updates into the list maintained by WordPress. - * - * @param stdClass $updates - * @return stdClass - */ - public function injectTranslationUpdates($updates) { - $translationUpdates = $this->getTranslationUpdates(); - if ( empty($translationUpdates) ) { - return $updates; - } - - //Being defensive. - if ( !is_object($updates) ) { - $updates = new stdClass(); - } - if ( !isset($updates->translations) ) { - $updates->translations = array(); - } - - //In case there's a name collision with a plugin or theme hosted on wordpress.org, - //remove any preexisting updates that match our thing. - $updates->translations = array_values(array_filter( - $updates->translations, - array($this, 'isNotMyTranslation') - )); - - //Add our updates to the list. - foreach($translationUpdates as $update) { - $convertedUpdate = array_merge( - array( - 'type' => $this->translationType, - 'slug' => $this->directoryName, - 'autoupdate' => 0, - //AFAICT, WordPress doesn't actually use the "version" field for anything. - //But lets make sure it's there, just in case. - 'version' => isset($update->version) ? $update->version : ('1.' . strtotime($update->updated)), - ), - (array)$update - ); - - $updates->translations[] = $convertedUpdate; - } - - return $updates; - } - - /** - * Get a list of available translation updates. - * - * This method will return an empty array if there are no updates. - * Uses cached update data. - * - * @return array - */ - public function getTranslationUpdates() { - return $this->updateState->getTranslations(); - } - - /** - * Remove all cached translation updates. - * - * @see wp_clean_update_cache - */ - public function clearCachedTranslationUpdates() { - $this->updateState->setTranslations(array()); - } - - /** - * Filter callback. Keeps only translations that *don't* match this plugin or theme. - * - * @param array $translation - * @return bool - */ - protected function isNotMyTranslation($translation) { - $isMatch = isset($translation['type'], $translation['slug']) - && ($translation['type'] === $this->translationType) - && ($translation['slug'] === $this->directoryName); - - return !$isMatch; - } - - /* ------------------------------------------------------------------- - * Fix directory name when installing updates - * ------------------------------------------------------------------- - */ - - /** - * Rename the update directory to match the existing plugin/theme directory. - * - * When WordPress installs a plugin or theme update, it assumes that the ZIP file will contain - * exactly one directory, and that the directory name will be the same as the directory where - * the plugin or theme is currently installed. - * - * GitHub and other repositories provide ZIP downloads, but they often use directory names like - * "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder. - * - * This is a hook callback. Don't call it from a plugin. - * - * @access protected - * - * @param string $source The directory to copy to /wp-content/plugins or /wp-content/themes. Usually a subdirectory of $remoteSource. - * @param string $remoteSource WordPress has extracted the update to this directory. - * @param WP_Upgrader $upgrader - * @return string|WP_Error - */ - public function fixDirectoryName($source, $remoteSource, $upgrader) { - global $wp_filesystem; - /** @var WP_Filesystem_Base $wp_filesystem */ - - //Basic sanity checks. - if ( !isset($source, $remoteSource, $upgrader, $upgrader->skin, $wp_filesystem) ) { - return $source; - } - - //If WordPress is upgrading anything other than our plugin/theme, leave the directory name unchanged. - if ( !$this->isBeingUpgraded($upgrader) ) { - return $source; - } - - //Rename the source to match the existing directory. - $correctedSource = trailingslashit($remoteSource) . $this->directoryName . '/'; - if ( $source !== $correctedSource ) { - //The update archive should contain a single directory that contains the rest of plugin/theme files. - //Otherwise, WordPress will try to copy the entire working directory ($source == $remoteSource). - //We can't rename $remoteSource because that would break WordPress code that cleans up temporary files - //after update. - if ( $this->isBadDirectoryStructure($remoteSource) ) { - return new WP_Error( - 'puc-incorrect-directory-structure', - sprintf( - 'The directory structure of the update is incorrect. All files should be inside ' . - 'a directory named %s, not at the root of the ZIP archive.', - htmlentities($this->slug) - ) - ); - } - - /** @var WP_Upgrader_Skin $upgrader ->skin */ - $upgrader->skin->feedback(sprintf( - 'Renaming %s to %s…', - '' . basename($source) . '', - '' . $this->directoryName . '' - )); - - if ( $wp_filesystem->move($source, $correctedSource, true) ) { - $upgrader->skin->feedback('Directory successfully renamed.'); - return $correctedSource; - } else { - return new WP_Error( - 'puc-rename-failed', - 'Unable to rename the update to match the existing directory.' - ); - } - } - - return $source; - } - - /** - * Is there an update being installed right now, for this plugin or theme? - * - * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. - * @return bool - */ - abstract public function isBeingUpgraded($upgrader = null); - - /** - * Check for incorrect update directory structure. An update must contain a single directory, - * all other files should be inside that directory. - * - * @param string $remoteSource Directory path. - * @return bool - */ - protected function isBadDirectoryStructure($remoteSource) { - global $wp_filesystem; - /** @var WP_Filesystem_Base $wp_filesystem */ - - $sourceFiles = $wp_filesystem->dirlist($remoteSource); - if ( is_array($sourceFiles) ) { - $sourceFiles = array_keys($sourceFiles); - $firstFilePath = trailingslashit($remoteSource) . $sourceFiles[0]; - return (count($sourceFiles) > 1) || (!$wp_filesystem->is_dir($firstFilePath)); - } - - //Assume it's fine. - return false; - } - - /* ------------------------------------------------------------------- - * DebugBar integration - * ------------------------------------------------------------------- - */ - - /** - * Initialize the update checker Debug Bar plugin/add-on thingy. - */ - public function maybeInitDebugBar() { - if ( class_exists('Debug_Bar', false) && file_exists(dirname(__FILE__) . '/DebugBar') ) { - $this->debugBarExtension = $this->createDebugBarExtension(); - } - } - - protected function createDebugBarExtension() { - return new Puc_v4p11_DebugBar_Extension($this); - } - - /** - * Display additional configuration details in the Debug Bar panel. - * - * @param Puc_v4p11_DebugBar_Panel $panel - */ - public function onDisplayConfiguration($panel) { - //Do nothing. Subclasses can use this to add additional info to the panel. - } - - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpgraderStatus.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpgraderStatus.php deleted file mode 100644 index 8c0006e..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/UpgraderStatus.php +++ /dev/null @@ -1,199 +0,0 @@ -isBeingUpgraded('plugin', $pluginFile, $upgrader); - } - - /** - * Is there an update being installed for a specific theme? - * - * @param string $stylesheet Theme directory name. - * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. - * @return bool - */ - public function isThemeBeingUpgraded($stylesheet, $upgrader = null) { - return $this->isBeingUpgraded('theme', $stylesheet, $upgrader); - } - - /** - * Check if a specific theme or plugin is being upgraded. - * - * @param string $type - * @param string $id - * @param Plugin_Upgrader|WP_Upgrader|null $upgrader - * @return bool - */ - protected function isBeingUpgraded($type, $id, $upgrader = null) { - if ( isset($upgrader) ) { - list($currentType, $currentId) = $this->getThingBeingUpgradedBy($upgrader); - if ( $currentType !== null ) { - $this->currentType = $currentType; - $this->currentId = $currentId; - } - } - return ($this->currentType === $type) && ($this->currentId === $id); - } - - /** - * Figure out which theme or plugin is being upgraded by a WP_Upgrader instance. - * - * Returns an array with two items. The first item is the type of the thing that's being - * upgraded: "plugin" or "theme". The second item is either the plugin basename or - * the theme directory name. If we can't determine what the upgrader is doing, both items - * will be NULL. - * - * Examples: - * ['plugin', 'plugin-dir-name/plugin.php'] - * ['theme', 'theme-dir-name'] - * - * @param Plugin_Upgrader|WP_Upgrader $upgrader - * @return array - */ - private function getThingBeingUpgradedBy($upgrader) { - if ( !isset($upgrader, $upgrader->skin) ) { - return array(null, null); - } - - //Figure out which plugin or theme is being upgraded. - $pluginFile = null; - $themeDirectoryName = null; - - $skin = $upgrader->skin; - if ( isset($skin->theme_info) && ($skin->theme_info instanceof WP_Theme) ) { - $themeDirectoryName = $skin->theme_info->get_stylesheet(); - } elseif ( $skin instanceof Plugin_Upgrader_Skin ) { - if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) { - $pluginFile = $skin->plugin; - } - } elseif ( $skin instanceof Theme_Upgrader_Skin ) { - if ( isset($skin->theme) && is_string($skin->theme) && ($skin->theme !== '') ) { - $themeDirectoryName = $skin->theme; - } - } elseif ( isset($skin->plugin_info) && is_array($skin->plugin_info) ) { - //This case is tricky because Bulk_Plugin_Upgrader_Skin (etc) doesn't actually store the plugin - //filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can - //do is compare those headers to the headers of installed plugins. - $pluginFile = $this->identifyPluginByHeaders($skin->plugin_info); - } - - if ( $pluginFile !== null ) { - return array('plugin', $pluginFile); - } elseif ( $themeDirectoryName !== null ) { - return array('theme', $themeDirectoryName); - } - return array(null, null); - } - - /** - * Identify an installed plugin based on its headers. - * - * @param array $searchHeaders The plugin file header to look for. - * @return string|null Plugin basename ("foo/bar.php"), or NULL if we can't identify the plugin. - */ - private function identifyPluginByHeaders($searchHeaders) { - if ( !function_exists('get_plugins') ){ - /** @noinspection PhpIncludeInspection */ - require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); - } - - $installedPlugins = get_plugins(); - $matches = array(); - foreach($installedPlugins as $pluginBasename => $headers) { - $diff1 = array_diff_assoc($headers, $searchHeaders); - $diff2 = array_diff_assoc($searchHeaders, $headers); - if ( empty($diff1) && empty($diff2) ) { - $matches[] = $pluginBasename; - } - } - - //It's possible (though very unlikely) that there could be two plugins with identical - //headers. In that case, we can't unambiguously identify the plugin that's being upgraded. - if ( count($matches) !== 1 ) { - return null; - } - - return reset($matches); - } - - /** - * @access private - * - * @param mixed $input - * @param array $hookExtra - * @return mixed Returns $input unaltered. - */ - public function setUpgradedThing($input, $hookExtra) { - if ( !empty($hookExtra['plugin']) && is_string($hookExtra['plugin']) ) { - $this->currentId = $hookExtra['plugin']; - $this->currentType = 'plugin'; - } elseif ( !empty($hookExtra['theme']) && is_string($hookExtra['theme']) ) { - $this->currentId = $hookExtra['theme']; - $this->currentType = 'theme'; - } else { - $this->currentType = null; - $this->currentId = null; - } - return $input; - } - - /** - * @access private - * - * @param array $options - * @return array - */ - public function setUpgradedPluginFromOptions($options) { - if ( isset($options['hook_extra']['plugin']) && is_string($options['hook_extra']['plugin']) ) { - $this->currentType = 'plugin'; - $this->currentId = $options['hook_extra']['plugin']; - } else { - $this->currentType = null; - $this->currentId = null; - } - return $options; - } - - /** - * @access private - * - * @param mixed $input - * @return mixed Returns $input unaltered. - */ - public function clearUpgradedThing($input = null) { - $this->currentId = null; - $this->currentType = null; - return $input; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Utils.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Utils.php deleted file mode 100644 index 3004d31..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Utils.php +++ /dev/null @@ -1,69 +0,0 @@ -$node) ) { - $currentValue = $currentValue->$node; - } else { - return $default; - } - } - - return $currentValue; - } - - /** - * Get the first array element that is not empty. - * - * @param array $values - * @param mixed|null $default Returns this value if there are no non-empty elements. - * @return mixed|null - */ - public static function findNotEmpty($values, $default = null) { - if ( empty($values) ) { - return $default; - } - - foreach ($values as $value) { - if ( !empty($value) ) { - return $value; - } - } - - return $default; - } - - /** - * Check if the input string starts with the specified prefix. - * - * @param string $input - * @param string $prefix - * @return bool - */ - public static function startsWith($input, $prefix) { - $length = strlen($prefix); - return (substr($input, 0, $length) === $prefix); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Api.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Api.php deleted file mode 100644 index fc31619..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Api.php +++ /dev/null @@ -1,302 +0,0 @@ -repositoryUrl = $repositoryUrl; - $this->setAuthentication($credentials); - } - - /** - * @return string - */ - public function getRepositoryUrl() { - return $this->repositoryUrl; - } - - /** - * Figure out which reference (i.e tag or branch) contains the latest version. - * - * @param string $configBranch Start looking in this branch. - * @return null|Puc_v4p11_Vcs_Reference - */ - abstract public function chooseReference($configBranch); - - /** - * Get the readme.txt file from the remote repository and parse it - * according to the plugin readme standard. - * - * @param string $ref Tag or branch name. - * @return array Parsed readme. - */ - public function getRemoteReadme($ref = 'master') { - $fileContents = $this->getRemoteFile($this->getLocalReadmeName(), $ref); - if ( empty($fileContents) ) { - return array(); - } - - $parser = new PucReadmeParser(); - return $parser->parse_readme_contents($fileContents); - } - - /** - * Get the case-sensitive name of the local readme.txt file. - * - * In most cases it should just be called "readme.txt", but some plugins call it "README.txt", - * "README.TXT", or even "Readme.txt". Most VCS are case-sensitive so we need to know the correct - * capitalization. - * - * Defaults to "readme.txt" (all lowercase). - * - * @return string - */ - public function getLocalReadmeName() { - static $fileName = null; - if ( $fileName !== null ) { - return $fileName; - } - - $fileName = 'readme.txt'; - if ( isset($this->localDirectory) ) { - $files = scandir($this->localDirectory); - if ( !empty($files) ) { - foreach ($files as $possibleFileName) { - if ( strcasecmp($possibleFileName, 'readme.txt') === 0 ) { - $fileName = $possibleFileName; - break; - } - } - } - } - return $fileName; - } - - /** - * Get a branch. - * - * @param string $branchName - * @return Puc_v4p11_Vcs_Reference|null - */ - abstract public function getBranch($branchName); - - /** - * Get a specific tag. - * - * @param string $tagName - * @return Puc_v4p11_Vcs_Reference|null - */ - abstract public function getTag($tagName); - - /** - * Get the tag that looks like the highest version number. - * (Implementations should skip pre-release versions if possible.) - * - * @return Puc_v4p11_Vcs_Reference|null - */ - abstract public function getLatestTag(); - - /** - * Check if a tag name string looks like a version number. - * - * @param string $name - * @return bool - */ - protected function looksLikeVersion($name) { - //Tag names may be prefixed with "v", e.g. "v1.2.3". - $name = ltrim($name, 'v'); - - //The version string must start with a number. - if ( !is_numeric(substr($name, 0, 1)) ) { - return false; - } - - //The goal is to accept any SemVer-compatible or "PHP-standardized" version number. - return (preg_match('@^(\d{1,5}?)(\.\d{1,10}?){0,4}?($|[abrdp+_\-]|\s)@i', $name) === 1); - } - - /** - * Check if a tag appears to be named like a version number. - * - * @param stdClass $tag - * @return bool - */ - protected function isVersionTag($tag) { - $property = $this->tagNameProperty; - return isset($tag->$property) && $this->looksLikeVersion($tag->$property); - } - - /** - * Sort a list of tags as if they were version numbers. - * Tags that don't look like version number will be removed. - * - * @param stdClass[] $tags Array of tag objects. - * @return stdClass[] Filtered array of tags sorted in descending order. - */ - protected function sortTagsByVersion($tags) { - //Keep only those tags that look like version numbers. - $versionTags = array_filter($tags, array($this, 'isVersionTag')); - //Sort them in descending order. - usort($versionTags, array($this, 'compareTagNames')); - - return $versionTags; - } - - /** - * Compare two tags as if they were version number. - * - * @param stdClass $tag1 Tag object. - * @param stdClass $tag2 Another tag object. - * @return int - */ - protected function compareTagNames($tag1, $tag2) { - $property = $this->tagNameProperty; - if ( !isset($tag1->$property) ) { - return 1; - } - if ( !isset($tag2->$property) ) { - return -1; - } - return -version_compare(ltrim($tag1->$property, 'v'), ltrim($tag2->$property, 'v')); - } - - /** - * Get the contents of a file from a specific branch or tag. - * - * @param string $path File name. - * @param string $ref - * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. - */ - abstract public function getRemoteFile($path, $ref = 'master'); - - /** - * Get the timestamp of the latest commit that changed the specified branch or tag. - * - * @param string $ref Reference name (e.g. branch or tag). - * @return string|null - */ - abstract public function getLatestCommitTime($ref); - - /** - * Get the contents of the changelog file from the repository. - * - * @param string $ref - * @param string $localDirectory Full path to the local plugin or theme directory. - * @return null|string The HTML contents of the changelog. - */ - public function getRemoteChangelog($ref, $localDirectory) { - $filename = $this->findChangelogName($localDirectory); - if ( empty($filename) ) { - return null; - } - - $changelog = $this->getRemoteFile($filename, $ref); - if ( $changelog === null ) { - return null; - } - - /** @noinspection PhpUndefinedClassInspection */ - return Parsedown::instance()->text($changelog); - } - - /** - * Guess the name of the changelog file. - * - * @param string $directory - * @return string|null - */ - protected function findChangelogName($directory = null) { - if ( !isset($directory) ) { - $directory = $this->localDirectory; - } - if ( empty($directory) || !is_dir($directory) || ($directory === '.') ) { - return null; - } - - $possibleNames = array('CHANGES.md', 'CHANGELOG.md', 'changes.md', 'changelog.md'); - $files = scandir($directory); - $foundNames = array_intersect($possibleNames, $files); - - if ( !empty($foundNames) ) { - return reset($foundNames); - } - return null; - } - - /** - * Set authentication credentials. - * - * @param $credentials - */ - public function setAuthentication($credentials) { - $this->credentials = $credentials; - } - - public function isAuthenticationEnabled() { - return !empty($this->credentials); - } - - /** - * @param string $url - * @return string - */ - public function signDownloadUrl($url) { - return $url; - } - - /** - * @param string $filterName - */ - public function setHttpFilterName($filterName) { - $this->httpFilterName = $filterName; - } - - /** - * @param string $directory - */ - public function setLocalDirectory($directory) { - if ( empty($directory) || !is_dir($directory) || ($directory === '.') ) { - $this->localDirectory = null; - } else { - $this->localDirectory = $directory; - } - } - - /** - * @param string $slug - */ - public function setSlug($slug) { - $this->slug = $slug; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/BaseChecker.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/BaseChecker.php deleted file mode 100644 index 8ffbae9..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/BaseChecker.php +++ /dev/null @@ -1,27 +0,0 @@ -[^/]+?)/(?P[^/#?&]+?)/?$@', $path, $matches) ) { - $this->username = $matches['username']; - $this->repository = $matches['repository']; - } else { - throw new InvalidArgumentException('Invalid BitBucket repository URL: "' . $repositoryUrl . '"'); - } - - parent::__construct($repositoryUrl, $credentials); - } - - /** - * Figure out which reference (i.e tag or branch) contains the latest version. - * - * @param string $configBranch Start looking in this branch. - * @return null|Puc_v4p11_Vcs_Reference - */ - public function chooseReference($configBranch) { - $updateSource = null; - - //Check if there's a "Stable tag: 1.2.3" header that points to a valid tag. - $updateSource = $this->getStableTag($configBranch); - - //Look for version-like tags. - if ( !$updateSource && ($configBranch === 'master') ) { - $updateSource = $this->getLatestTag(); - } - //If all else fails, use the specified branch itself. - if ( !$updateSource ) { - $updateSource = $this->getBranch($configBranch); - } - - return $updateSource; - } - - public function getBranch($branchName) { - $branch = $this->api('/refs/branches/' . $branchName); - if ( is_wp_error($branch) || empty($branch) ) { - return null; - } - - return new Puc_v4p11_Vcs_Reference(array( - 'name' => $branch->name, - 'updated' => $branch->target->date, - 'downloadUrl' => $this->getDownloadUrl($branch->name), - )); - } - - /** - * Get a specific tag. - * - * @param string $tagName - * @return Puc_v4p11_Vcs_Reference|null - */ - public function getTag($tagName) { - $tag = $this->api('/refs/tags/' . $tagName); - if ( is_wp_error($tag) || empty($tag) ) { - return null; - } - - return new Puc_v4p11_Vcs_Reference(array( - 'name' => $tag->name, - 'version' => ltrim($tag->name, 'v'), - 'updated' => $tag->target->date, - 'downloadUrl' => $this->getDownloadUrl($tag->name), - )); - } - - /** - * Get the tag that looks like the highest version number. - * - * @return Puc_v4p11_Vcs_Reference|null - */ - public function getLatestTag() { - $tags = $this->api('/refs/tags?sort=-target.date'); - if ( !isset($tags, $tags->values) || !is_array($tags->values) ) { - return null; - } - - //Filter and sort the list of tags. - $versionTags = $this->sortTagsByVersion($tags->values); - - //Return the first result. - if ( !empty($versionTags) ) { - $tag = $versionTags[0]; - return new Puc_v4p11_Vcs_Reference(array( - 'name' => $tag->name, - 'version' => ltrim($tag->name, 'v'), - 'updated' => $tag->target->date, - 'downloadUrl' => $this->getDownloadUrl($tag->name), - )); - } - return null; - } - - /** - * Get the tag/ref specified by the "Stable tag" header in the readme.txt of a given branch. - * - * @param string $branch - * @return null|Puc_v4p11_Vcs_Reference - */ - protected function getStableTag($branch) { - $remoteReadme = $this->getRemoteReadme($branch); - if ( !empty($remoteReadme['stable_tag']) ) { - $tag = $remoteReadme['stable_tag']; - - //You can explicitly opt out of using tags by setting "Stable tag" to - //"trunk" or the name of the current branch. - if ( ($tag === $branch) || ($tag === 'trunk') ) { - return $this->getBranch($branch); - } - - return $this->getTag($tag); - } - - return null; - } - - /** - * @param string $ref - * @return string - */ - protected function getDownloadUrl($ref) { - return sprintf( - 'https://bitbucket.org/%s/%s/get/%s.zip', - $this->username, - $this->repository, - $ref - ); - } - - /** - * Get the contents of a file from a specific branch or tag. - * - * @param string $path File name. - * @param string $ref - * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. - */ - public function getRemoteFile($path, $ref = 'master') { - $response = $this->api('src/' . $ref . '/' . ltrim($path)); - if ( is_wp_error($response) || !is_string($response) ) { - return null; - } - return $response; - } - - /** - * Get the timestamp of the latest commit that changed the specified branch or tag. - * - * @param string $ref Reference name (e.g. branch or tag). - * @return string|null - */ - public function getLatestCommitTime($ref) { - $response = $this->api('commits/' . $ref); - if ( isset($response->values, $response->values[0], $response->values[0]->date) ) { - return $response->values[0]->date; - } - return null; - } - - /** - * Perform a BitBucket API 2.0 request. - * - * @param string $url - * @param string $version - * @return mixed|WP_Error - */ - public function api($url, $version = '2.0') { - $url = ltrim($url, '/'); - $isSrcResource = Puc_v4p11_Utils::startsWith($url, 'src/'); - - $url = implode('/', array( - 'https://api.bitbucket.org', - $version, - 'repositories', - $this->username, - $this->repository, - $url - )); - $baseUrl = $url; - - if ( $this->oauth ) { - $url = $this->oauth->sign($url,'GET'); - } - - $options = array('timeout' => 10); - if ( !empty($this->httpFilterName) ) { - $options = apply_filters($this->httpFilterName, $options); - } - $response = wp_remote_get($url, $options); - if ( is_wp_error($response) ) { - do_action('puc_api_error', $response, null, $url, $this->slug); - return $response; - } - - $code = wp_remote_retrieve_response_code($response); - $body = wp_remote_retrieve_body($response); - if ( $code === 200 ) { - if ( $isSrcResource ) { - //Most responses are JSON-encoded, but src resources just - //return raw file contents. - $document = $body; - } else { - $document = json_decode($body); - } - return $document; - } - - $error = new WP_Error( - 'puc-bitbucket-http-error', - sprintf('BitBucket API error. Base URL: "%s", HTTP status code: %d.', $baseUrl, $code) - ); - do_action('puc_api_error', $error, $response, $url, $this->slug); - - return $error; - } - - /** - * @param array $credentials - */ - public function setAuthentication($credentials) { - parent::setAuthentication($credentials); - - if ( !empty($credentials) && !empty($credentials['consumer_key']) ) { - $this->oauth = new Puc_v4p11_OAuthSignature( - $credentials['consumer_key'], - $credentials['consumer_secret'] - ); - } else { - $this->oauth = null; - } - } - - public function signDownloadUrl($url) { - //Add authentication data to download URLs. Since OAuth signatures incorporate - //timestamps, we have to do this immediately before inserting the update. Otherwise - //authentication could fail due to a stale timestamp. - if ( $this->oauth ) { - $url = $this->oauth->sign($url); - } - return $url; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitHubApi.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitHubApi.php deleted file mode 100644 index 79f3c56..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitHubApi.php +++ /dev/null @@ -1,441 +0,0 @@ -[^/]+?)/(?P[^/#?&]+?)/?$@', $path, $matches) ) { - $this->userName = $matches['username']; - $this->repositoryName = $matches['repository']; - } else { - throw new InvalidArgumentException('Invalid GitHub repository URL: "' . $repositoryUrl . '"'); - } - - parent::__construct($repositoryUrl, $accessToken); - } - - /** - * Get the latest release from GitHub. - * - * @return Puc_v4p11_Vcs_Reference|null - */ - public function getLatestRelease() { - $release = $this->api('/repos/:user/:repo/releases/latest'); - if ( is_wp_error($release) || !is_object($release) || !isset($release->tag_name) ) { - return null; - } - - $reference = new Puc_v4p11_Vcs_Reference(array( - 'name' => $release->tag_name, - 'version' => ltrim($release->tag_name, 'v'), //Remove the "v" prefix from "v1.2.3". - 'downloadUrl' => $release->zipball_url, - 'updated' => $release->created_at, - 'apiResponse' => $release, - )); - - if ( isset($release->assets[0]) ) { - $reference->downloadCount = $release->assets[0]->download_count; - } - - if ( $this->releaseAssetsEnabled && isset($release->assets, $release->assets[0]) ) { - //Use the first release asset that matches the specified regular expression. - $matchingAssets = array_filter($release->assets, array($this, 'matchesAssetFilter')); - if ( !empty($matchingAssets) ) { - if ( $this->isAuthenticationEnabled() ) { - /** - * Keep in mind that we'll need to add an "Accept" header to download this asset. - * - * @see setUpdateDownloadHeaders() - */ - $reference->downloadUrl = $matchingAssets[0]->url; - } else { - //It seems that browser_download_url only works for public repositories. - //Using an access_token doesn't help. Maybe OAuth would work? - $reference->downloadUrl = $matchingAssets[0]->browser_download_url; - } - - $reference->downloadCount = $matchingAssets[0]->download_count; - } - } - - if ( !empty($release->body) ) { - /** @noinspection PhpUndefinedClassInspection */ - $reference->changelog = Parsedown::instance()->text($release->body); - } - - return $reference; - } - - /** - * Get the tag that looks like the highest version number. - * - * @return Puc_v4p11_Vcs_Reference|null - */ - public function getLatestTag() { - $tags = $this->api('/repos/:user/:repo/tags'); - - if ( is_wp_error($tags) || !is_array($tags) ) { - return null; - } - - $versionTags = $this->sortTagsByVersion($tags); - if ( empty($versionTags) ) { - return null; - } - - $tag = $versionTags[0]; - return new Puc_v4p11_Vcs_Reference(array( - 'name' => $tag->name, - 'version' => ltrim($tag->name, 'v'), - 'downloadUrl' => $tag->zipball_url, - 'apiResponse' => $tag, - )); - } - - /** - * Get a branch by name. - * - * @param string $branchName - * @return null|Puc_v4p11_Vcs_Reference - */ - public function getBranch($branchName) { - $branch = $this->api('/repos/:user/:repo/branches/' . $branchName); - if ( is_wp_error($branch) || empty($branch) ) { - return null; - } - - $reference = new Puc_v4p11_Vcs_Reference(array( - 'name' => $branch->name, - 'downloadUrl' => $this->buildArchiveDownloadUrl($branch->name), - 'apiResponse' => $branch, - )); - - if ( isset($branch->commit, $branch->commit->commit, $branch->commit->commit->author->date) ) { - $reference->updated = $branch->commit->commit->author->date; - } - - return $reference; - } - - /** - * Get the latest commit that changed the specified file. - * - * @param string $filename - * @param string $ref Reference name (e.g. branch or tag). - * @return StdClass|null - */ - public function getLatestCommit($filename, $ref = 'master') { - $commits = $this->api( - '/repos/:user/:repo/commits', - array( - 'path' => $filename, - 'sha' => $ref, - ) - ); - if ( !is_wp_error($commits) && isset($commits[0]) ) { - return $commits[0]; - } - return null; - } - - /** - * Get the timestamp of the latest commit that changed the specified branch or tag. - * - * @param string $ref Reference name (e.g. branch or tag). - * @return string|null - */ - public function getLatestCommitTime($ref) { - $commits = $this->api('/repos/:user/:repo/commits', array('sha' => $ref)); - if ( !is_wp_error($commits) && isset($commits[0]) ) { - return $commits[0]->commit->author->date; - } - return null; - } - - /** - * Perform a GitHub API request. - * - * @param string $url - * @param array $queryParams - * @return mixed|WP_Error - */ - protected function api($url, $queryParams = array()) { - $baseUrl = $url; - $url = $this->buildApiUrl($url, $queryParams); - - $options = array('timeout' => 10); - if ( $this->isAuthenticationEnabled() ) { - $options['headers'] = array('Authorization' => $this->getAuthorizationHeader()); - } - - if ( !empty($this->httpFilterName) ) { - $options = apply_filters($this->httpFilterName, $options); - } - $response = wp_remote_get($url, $options); - if ( is_wp_error($response) ) { - do_action('puc_api_error', $response, null, $url, $this->slug); - return $response; - } - - $code = wp_remote_retrieve_response_code($response); - $body = wp_remote_retrieve_body($response); - if ( $code === 200 ) { - $document = json_decode($body); - return $document; - } - - $error = new WP_Error( - 'puc-github-http-error', - sprintf('GitHub API error. Base URL: "%s", HTTP status code: %d.', $baseUrl, $code) - ); - do_action('puc_api_error', $error, $response, $url, $this->slug); - - return $error; - } - - /** - * Build a fully qualified URL for an API request. - * - * @param string $url - * @param array $queryParams - * @return string - */ - protected function buildApiUrl($url, $queryParams) { - $variables = array( - 'user' => $this->userName, - 'repo' => $this->repositoryName, - ); - foreach ($variables as $name => $value) { - $url = str_replace('/:' . $name, '/' . urlencode($value), $url); - } - $url = 'https://api.github.com' . $url; - - if ( !empty($queryParams) ) { - $url = add_query_arg($queryParams, $url); - } - - return $url; - } - - /** - * Get the contents of a file from a specific branch or tag. - * - * @param string $path File name. - * @param string $ref - * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. - */ - public function getRemoteFile($path, $ref = 'master') { - $apiUrl = '/repos/:user/:repo/contents/' . $path; - $response = $this->api($apiUrl, array('ref' => $ref)); - - if ( is_wp_error($response) || !isset($response->content) || ($response->encoding !== 'base64') ) { - return null; - } - return base64_decode($response->content); - } - - /** - * Generate a URL to download a ZIP archive of the specified branch/tag/etc. - * - * @param string $ref - * @return string - */ - public function buildArchiveDownloadUrl($ref = 'master') { - $url = sprintf( - 'https://api.github.com/repos/%1$s/%2$s/zipball/%3$s', - urlencode($this->userName), - urlencode($this->repositoryName), - urlencode($ref) - ); - return $url; - } - - /** - * Get a specific tag. - * - * @param string $tagName - * @return void - */ - public function getTag($tagName) { - //The current GitHub update checker doesn't use getTag, so I didn't bother to implement it. - throw new LogicException('The ' . __METHOD__ . ' method is not implemented and should not be used.'); - } - - public function setAuthentication($credentials) { - parent::setAuthentication($credentials); - $this->accessToken = is_string($credentials) ? $credentials : null; - - //Optimization: Instead of filtering all HTTP requests, let's do it only when - //WordPress is about to download an update. - add_filter('upgrader_pre_download', array($this, 'addHttpRequestFilter'), 10, 1); //WP 3.7+ - } - - /** - * Figure out which reference (i.e tag or branch) contains the latest version. - * - * @param string $configBranch Start looking in this branch. - * @return null|Puc_v4p11_Vcs_Reference - */ - public function chooseReference($configBranch) { - $updateSource = null; - - if ( $configBranch === 'master' ) { - //Use the latest release. - $updateSource = $this->getLatestRelease(); - if ( $updateSource === null ) { - //Failing that, use the tag with the highest version number. - $updateSource = $this->getLatestTag(); - } - } - //Alternatively, just use the branch itself. - if ( empty($updateSource) ) { - $updateSource = $this->getBranch($configBranch); - } - - return $updateSource; - } - - /** - * Enable updating via release assets. - * - * If the latest release contains no usable assets, the update checker - * will fall back to using the automatically generated ZIP archive. - * - * Private repositories will only work with WordPress 3.7 or later. - * - * @param string|null $fileNameRegex Optional. Use only those assets where the file name matches this regex. - */ - public function enableReleaseAssets($fileNameRegex = null) { - $this->releaseAssetsEnabled = true; - $this->assetFilterRegex = $fileNameRegex; - $this->assetApiBaseUrl = sprintf( - '//api.github.com/repos/%1$s/%2$s/releases/assets/', - $this->userName, - $this->repositoryName - ); - } - - /** - * Does this asset match the file name regex? - * - * @param stdClass $releaseAsset - * @return bool - */ - protected function matchesAssetFilter($releaseAsset) { - if ( $this->assetFilterRegex === null ) { - //The default is to accept all assets. - return true; - } - return isset($releaseAsset->name) && preg_match($this->assetFilterRegex, $releaseAsset->name); - } - - /** - * @internal - * @param bool $result - * @return bool - */ - public function addHttpRequestFilter($result) { - if ( !$this->downloadFilterAdded && $this->isAuthenticationEnabled() ) { - add_filter('http_request_args', array($this, 'setUpdateDownloadHeaders'), 10, 2); - add_action('requests-requests.before_redirect', array($this, 'removeAuthHeaderFromRedirects'), 10, 4); - $this->downloadFilterAdded = true; - } - return $result; - } - - /** - * Set the HTTP headers that are necessary to download updates from private repositories. - * - * See GitHub docs: - * @link https://developer.github.com/v3/repos/releases/#get-a-single-release-asset - * @link https://developer.github.com/v3/auth/#basic-authentication - * - * @internal - * @param array $requestArgs - * @param string $url - * @return array - */ - public function setUpdateDownloadHeaders($requestArgs, $url = '') { - //Is WordPress trying to download one of our release assets? - if ( $this->releaseAssetsEnabled && (strpos($url, $this->assetApiBaseUrl) !== false) ) { - $requestArgs['headers']['Accept'] = 'application/octet-stream'; - } - //Use Basic authentication, but only if the download is from our repository. - $repoApiBaseUrl = $this->buildApiUrl('/repos/:user/:repo/', array()); - if ( $this->isAuthenticationEnabled() && (strpos($url, $repoApiBaseUrl)) === 0 ) { - $requestArgs['headers']['Authorization'] = $this->getAuthorizationHeader(); - } - return $requestArgs; - } - - /** - * When following a redirect, the Requests library will automatically forward - * the authorization header to other hosts. We don't want that because it breaks - * AWS downloads and can leak authorization information. - * - * @internal - * @param string $location - * @param array $headers - */ - public function removeAuthHeaderFromRedirects(&$location, &$headers) { - $repoApiBaseUrl = $this->buildApiUrl('/repos/:user/:repo/', array()); - if ( strpos($location, $repoApiBaseUrl) === 0 ) { - return; //This request is going to GitHub, so it's fine. - } - //Remove the header. - if ( isset($headers['Authorization']) ) { - unset($headers['Authorization']); - } - } - - /** - * Generate the value of the "Authorization" header. - * - * @return string - */ - protected function getAuthorizationHeader() { - return 'Basic ' . base64_encode($this->userName . ':' . $this->accessToken); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitLabApi.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitLabApi.php deleted file mode 100644 index 8fd3f45..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/GitLabApi.php +++ /dev/null @@ -1,309 +0,0 @@ -repositoryHost = parse_url($repositoryUrl, PHP_URL_HOST) . $port; - - if ( $this->repositoryHost !== 'gitlab.com' ) { - $this->repositoryProtocol = parse_url($repositoryUrl, PHP_URL_SCHEME); - } - - //Find the repository information - $path = parse_url($repositoryUrl, PHP_URL_PATH); - if ( preg_match('@^/?(?P[^/]+?)/(?P[^/#?&]+?)/?$@', $path, $matches) ) { - $this->userName = $matches['username']; - $this->repositoryName = $matches['repository']; - } elseif ( ($this->repositoryHost === 'gitlab.com') ) { - //This is probably a repository in a subgroup, e.g. "/organization/category/repo". - $parts = explode('/', trim($path, '/')); - if ( count($parts) < 3 ) { - throw new InvalidArgumentException('Invalid GitLab.com repository URL: "' . $repositoryUrl . '"'); - } - $lastPart = array_pop($parts); - $this->userName = implode('/', $parts); - $this->repositoryName = $lastPart; - } else { - //There could be subgroups in the URL: gitlab.domain.com/group/subgroup/subgroup2/repository - if ( $subgroup !== null ) { - $path = str_replace(trailingslashit($subgroup), '', $path); - } - - //This is not a traditional url, it could be gitlab is in a deeper subdirectory. - //Get the path segments. - $segments = explode('/', untrailingslashit(ltrim($path, '/'))); - - //We need at least /user-name/repository-name/ - if ( count($segments) < 2 ) { - throw new InvalidArgumentException('Invalid GitLab repository URL: "' . $repositoryUrl . '"'); - } - - //Get the username and repository name. - $usernameRepo = array_splice($segments, -2, 2); - $this->userName = $usernameRepo[0]; - $this->repositoryName = $usernameRepo[1]; - - //Append the remaining segments to the host if there are segments left. - if ( count($segments) > 0 ) { - $this->repositoryHost = trailingslashit($this->repositoryHost) . implode('/', $segments); - } - - //Add subgroups to username. - if ( $subgroup !== null ) { - $this->userName = $usernameRepo[0] . '/' . untrailingslashit($subgroup); - } - } - - parent::__construct($repositoryUrl, $accessToken); - } - - /** - * Get the latest release from GitLab. - * - * @return Puc_v4p11_Vcs_Reference|null - */ - public function getLatestRelease() { - return $this->getLatestTag(); - } - - /** - * Get the tag that looks like the highest version number. - * - * @return Puc_v4p11_Vcs_Reference|null - */ - public function getLatestTag() { - $tags = $this->api('/:id/repository/tags'); - if ( is_wp_error($tags) || empty($tags) || !is_array($tags) ) { - return null; - } - - $versionTags = $this->sortTagsByVersion($tags); - if ( empty($versionTags) ) { - return null; - } - - $tag = $versionTags[0]; - return new Puc_v4p11_Vcs_Reference(array( - 'name' => $tag->name, - 'version' => ltrim($tag->name, 'v'), - 'downloadUrl' => $this->buildArchiveDownloadUrl($tag->name), - 'apiResponse' => $tag, - )); - } - - /** - * Get a branch by name. - * - * @param string $branchName - * @return null|Puc_v4p11_Vcs_Reference - */ - public function getBranch($branchName) { - $branch = $this->api('/:id/repository/branches/' . $branchName); - if ( is_wp_error($branch) || empty($branch) ) { - return null; - } - - $reference = new Puc_v4p11_Vcs_Reference(array( - 'name' => $branch->name, - 'downloadUrl' => $this->buildArchiveDownloadUrl($branch->name), - 'apiResponse' => $branch, - )); - - if ( isset($branch->commit, $branch->commit->committed_date) ) { - $reference->updated = $branch->commit->committed_date; - } - - return $reference; - } - - /** - * Get the timestamp of the latest commit that changed the specified branch or tag. - * - * @param string $ref Reference name (e.g. branch or tag). - * @return string|null - */ - public function getLatestCommitTime($ref) { - $commits = $this->api('/:id/repository/commits/', array('ref_name' => $ref)); - if ( is_wp_error($commits) || !is_array($commits) || !isset($commits[0]) ) { - return null; - } - - return $commits[0]->committed_date; - } - - /** - * Perform a GitLab API request. - * - * @param string $url - * @param array $queryParams - * @return mixed|WP_Error - */ - protected function api($url, $queryParams = array()) { - $baseUrl = $url; - $url = $this->buildApiUrl($url, $queryParams); - - $options = array('timeout' => 10); - if ( !empty($this->httpFilterName) ) { - $options = apply_filters($this->httpFilterName, $options); - } - - $response = wp_remote_get($url, $options); - if ( is_wp_error($response) ) { - do_action('puc_api_error', $response, null, $url, $this->slug); - return $response; - } - - $code = wp_remote_retrieve_response_code($response); - $body = wp_remote_retrieve_body($response); - if ( $code === 200 ) { - return json_decode($body); - } - - $error = new WP_Error( - 'puc-gitlab-http-error', - sprintf('GitLab API error. URL: "%s", HTTP status code: %d.', $baseUrl, $code) - ); - do_action('puc_api_error', $error, $response, $url, $this->slug); - - return $error; - } - - /** - * Build a fully qualified URL for an API request. - * - * @param string $url - * @param array $queryParams - * @return string - */ - protected function buildApiUrl($url, $queryParams) { - $variables = array( - 'user' => $this->userName, - 'repo' => $this->repositoryName, - 'id' => $this->userName . '/' . $this->repositoryName, - ); - - foreach ($variables as $name => $value) { - $url = str_replace("/:{$name}", '/' . urlencode($value), $url); - } - - $url = substr($url, 1); - $url = sprintf('%1$s://%2$s/api/v4/projects/%3$s', $this->repositoryProtocol, $this->repositoryHost, $url); - - if ( !empty($this->accessToken) ) { - $queryParams['private_token'] = $this->accessToken; - } - - if ( !empty($queryParams) ) { - $url = add_query_arg($queryParams, $url); - } - - return $url; - } - - /** - * Get the contents of a file from a specific branch or tag. - * - * @param string $path File name. - * @param string $ref - * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. - */ - public function getRemoteFile($path, $ref = 'master') { - $response = $this->api('/:id/repository/files/' . $path, array('ref' => $ref)); - if ( is_wp_error($response) || !isset($response->content) || $response->encoding !== 'base64' ) { - return null; - } - - return base64_decode($response->content); - } - - /** - * Generate a URL to download a ZIP archive of the specified branch/tag/etc. - * - * @param string $ref - * @return string - */ - public function buildArchiveDownloadUrl($ref = 'master') { - $url = sprintf( - '%1$s://%2$s/api/v4/projects/%3$s/repository/archive.zip', - $this->repositoryProtocol, - $this->repositoryHost, - urlencode($this->userName . '/' . $this->repositoryName) - ); - $url = add_query_arg('sha', urlencode($ref), $url); - - if ( !empty($this->accessToken) ) { - $url = add_query_arg('private_token', $this->accessToken, $url); - } - - return $url; - } - - /** - * Get a specific tag. - * - * @param string $tagName - * @return void - */ - public function getTag($tagName) { - throw new LogicException('The ' . __METHOD__ . ' method is not implemented and should not be used.'); - } - - /** - * Figure out which reference (i.e tag or branch) contains the latest version. - * - * @param string $configBranch Start looking in this branch. - * @return null|Puc_v4p11_Vcs_Reference - */ - public function chooseReference($configBranch) { - $updateSource = null; - - // GitLab doesn't handle releases the same as GitHub so just use the latest tag - if ( $configBranch === 'master' ) { - $updateSource = $this->getLatestTag(); - } - - if ( empty($updateSource) ) { - $updateSource = $this->getBranch($configBranch); - } - - return $updateSource; - } - - public function setAuthentication($credentials) { - parent::setAuthentication($credentials); - $this->accessToken = is_string($credentials) ? $credentials : null; - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/PluginUpdateChecker.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/PluginUpdateChecker.php deleted file mode 100644 index bc6d94a..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/PluginUpdateChecker.php +++ /dev/null @@ -1,218 +0,0 @@ -api = $api; - $this->api->setHttpFilterName($this->getUniqueName('request_info_options')); - - parent::__construct($api->getRepositoryUrl(), $pluginFile, $slug, $checkPeriod, $optionName, $muPluginFile); - - $this->api->setSlug($this->slug); - } - - public function requestInfo($unusedParameter = null) { - //We have to make several remote API requests to gather all the necessary info - //which can take a while on slow networks. - if ( function_exists('set_time_limit') ) { - @set_time_limit(60); - } - - $api = $this->api; - $api->setLocalDirectory($this->package->getAbsoluteDirectoryPath()); - - $info = new Puc_v4p11_Plugin_Info(); - $info->filename = $this->pluginFile; - $info->slug = $this->slug; - - $this->setInfoFromHeader($this->package->getPluginHeader(), $info); - - //Pick a branch or tag. - $updateSource = $api->chooseReference($this->branch); - if ( $updateSource ) { - $ref = $updateSource->name; - $info->version = $updateSource->version; - $info->last_updated = $updateSource->updated; - $info->download_url = $updateSource->downloadUrl; - - if ( !empty($updateSource->changelog) ) { - $info->sections['changelog'] = $updateSource->changelog; - } - if ( isset($updateSource->downloadCount) ) { - $info->downloaded = $updateSource->downloadCount; - } - } else { - //There's probably a network problem or an authentication error. - do_action( - 'puc_api_error', - new WP_Error( - 'puc-no-update-source', - 'Could not retrieve version information from the repository. ' - . 'This usually means that the update checker either can\'t connect ' - . 'to the repository or it\'s configured incorrectly.' - ), - null, null, $this->slug - ); - return null; - } - - //Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata - //are what the WordPress install will actually see after upgrading, so they take precedence over releases/tags. - $mainPluginFile = basename($this->pluginFile); - $remotePlugin = $api->getRemoteFile($mainPluginFile, $ref); - if ( !empty($remotePlugin) ) { - $remoteHeader = $this->package->getFileHeader($remotePlugin); - $this->setInfoFromHeader($remoteHeader, $info); - } - - //Try parsing readme.txt. If it's formatted according to WordPress.org standards, it will contain - //a lot of useful information like the required/tested WP version, changelog, and so on. - if ( $this->readmeTxtExistsLocally() ) { - $this->setInfoFromRemoteReadme($ref, $info); - } - - //The changelog might be in a separate file. - if ( empty($info->sections['changelog']) ) { - $info->sections['changelog'] = $api->getRemoteChangelog($ref, $this->package->getAbsoluteDirectoryPath()); - if ( empty($info->sections['changelog']) ) { - $info->sections['changelog'] = __('There is no changelog available.', 'plugin-update-checker'); - } - } - - if ( empty($info->last_updated) ) { - //Fetch the latest commit that changed the tag or branch and use it as the "last_updated" date. - $latestCommitTime = $api->getLatestCommitTime($ref); - if ( $latestCommitTime !== null ) { - $info->last_updated = $latestCommitTime; - } - } - - $info = apply_filters($this->getUniqueName('request_info_result'), $info, null); - return $info; - } - - /** - * Check if the currently installed version has a readme.txt file. - * - * @return bool - */ - protected function readmeTxtExistsLocally() { - return $this->package->fileExists($this->api->getLocalReadmeName()); - } - - /** - * Copy plugin metadata from a file header to a Plugin Info object. - * - * @param array $fileHeader - * @param Puc_v4p11_Plugin_Info $pluginInfo - */ - protected function setInfoFromHeader($fileHeader, $pluginInfo) { - $headerToPropertyMap = array( - 'Version' => 'version', - 'Name' => 'name', - 'PluginURI' => 'homepage', - 'Author' => 'author', - 'AuthorName' => 'author', - 'AuthorURI' => 'author_homepage', - - 'Requires WP' => 'requires', - 'Tested WP' => 'tested', - 'Requires at least' => 'requires', - 'Tested up to' => 'tested', - - 'Requires PHP' => 'requires_php', - ); - foreach ($headerToPropertyMap as $headerName => $property) { - if ( isset($fileHeader[$headerName]) && !empty($fileHeader[$headerName]) ) { - $pluginInfo->$property = $fileHeader[$headerName]; - } - } - - if ( !empty($fileHeader['Description']) ) { - $pluginInfo->sections['description'] = $fileHeader['Description']; - } - } - - /** - * Copy plugin metadata from the remote readme.txt file. - * - * @param string $ref GitHub tag or branch where to look for the readme. - * @param Puc_v4p11_Plugin_Info $pluginInfo - */ - protected function setInfoFromRemoteReadme($ref, $pluginInfo) { - $readme = $this->api->getRemoteReadme($ref); - if ( empty($readme) ) { - return; - } - - if ( isset($readme['sections']) ) { - $pluginInfo->sections = array_merge($pluginInfo->sections, $readme['sections']); - } - if ( !empty($readme['tested_up_to']) ) { - $pluginInfo->tested = $readme['tested_up_to']; - } - if ( !empty($readme['requires_at_least']) ) { - $pluginInfo->requires = $readme['requires_at_least']; - } - if ( !empty($readme['requires_php']) ) { - $pluginInfo->requires_php = $readme['requires_php']; - } - - if ( isset($readme['upgrade_notice'], $readme['upgrade_notice'][$pluginInfo->version]) ) { - $pluginInfo->upgrade_notice = $readme['upgrade_notice'][$pluginInfo->version]; - } - } - - public function setBranch($branch) { - $this->branch = $branch; - return $this; - } - - public function setAuthentication($credentials) { - $this->api->setAuthentication($credentials); - return $this; - } - - public function getVcsApi() { - return $this->api; - } - - public function getUpdate() { - $update = parent::getUpdate(); - - if ( isset($update) && !empty($update->download_url) ) { - $update->download_url = $this->api->signDownloadUrl($update->download_url); - } - - return $update; - } - - public function onDisplayConfiguration($panel) { - parent::onDisplayConfiguration($panel); - $panel->row('Branch', $this->branch); - $panel->row('Authentication enabled', $this->api->isAuthenticationEnabled() ? 'Yes' : 'No'); - $panel->row('API client', get_class($this->api)); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Reference.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Reference.php deleted file mode 100644 index 0bf8c69..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/Reference.php +++ /dev/null @@ -1,49 +0,0 @@ -properties = $properties; - } - - /** - * @param string $name - * @return mixed|null - */ - public function __get($name) { - return array_key_exists($name, $this->properties) ? $this->properties[$name] : null; - } - - /** - * @param string $name - * @param mixed $value - */ - public function __set($name, $value) { - $this->properties[$name] = $value; - } - - /** - * @param string $name - * @return bool - */ - public function __isset($name) { - return isset($this->properties[$name]); - } - - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/ThemeUpdateChecker.php b/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/ThemeUpdateChecker.php deleted file mode 100644 index 1850af6..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/Puc/v4p11/Vcs/ThemeUpdateChecker.php +++ /dev/null @@ -1,118 +0,0 @@ -api = $api; - $this->api->setHttpFilterName($this->getUniqueName('request_update_options')); - - parent::__construct($api->getRepositoryUrl(), $stylesheet, $customSlug, $checkPeriod, $optionName); - - $this->api->setSlug($this->slug); - } - - public function requestUpdate() { - $api = $this->api; - $api->setLocalDirectory($this->package->getAbsoluteDirectoryPath()); - - $update = new Puc_v4p11_Theme_Update(); - $update->slug = $this->slug; - - //Figure out which reference (tag or branch) we'll use to get the latest version of the theme. - $updateSource = $api->chooseReference($this->branch); - if ( $updateSource ) { - $ref = $updateSource->name; - $update->download_url = $updateSource->downloadUrl; - } else { - do_action( - 'puc_api_error', - new WP_Error( - 'puc-no-update-source', - 'Could not retrieve version information from the repository. ' - . 'This usually means that the update checker either can\'t connect ' - . 'to the repository or it\'s configured incorrectly.' - ), - null, null, $this->slug - ); - $ref = $this->branch; - } - - //Get headers from the main stylesheet in this branch/tag. Its "Version" header and other metadata - //are what the WordPress install will actually see after upgrading, so they take precedence over releases/tags. - $remoteHeader = $this->package->getFileHeader($api->getRemoteFile('style.css', $ref)); - $update->version = Puc_v4p11_Utils::findNotEmpty(array( - $remoteHeader['Version'], - Puc_v4p11_Utils::get($updateSource, 'version'), - )); - - //The details URL defaults to the Theme URI header or the repository URL. - $update->details_url = Puc_v4p11_Utils::findNotEmpty(array( - $remoteHeader['ThemeURI'], - $this->package->getHeaderValue('ThemeURI'), - $this->metadataUrl, - )); - - if ( empty($update->version) ) { - //It looks like we didn't find a valid update after all. - $update = null; - } - - $update = $this->filterUpdateResult($update); - return $update; - } - - //FIXME: This is duplicated code. Both theme and plugin subclasses that use VCS share these methods. - - public function setBranch($branch) { - $this->branch = $branch; - return $this; - } - - public function setAuthentication($credentials) { - $this->api->setAuthentication($credentials); - return $this; - } - - public function getVcsApi() { - return $this->api; - } - - public function getUpdate() { - $update = parent::getUpdate(); - - if ( isset($update) && !empty($update->download_url) ) { - $update->download_url = $this->api->signDownloadUrl($update->download_url); - } - - return $update; - } - - public function onDisplayConfiguration($panel) { - parent::onDisplayConfiguration($panel); - $panel->row('Branch', $this->branch); - $panel->row('Authentication enabled', $this->api->isAuthenticationEnabled() ? 'Yes' : 'No'); - $panel->row('API client', get_class($this->api)); - } - } - -endif; diff --git a/dependencies/yahnis-elsts/plugin-update-checker/css/puc-debug-bar.css b/dependencies/yahnis-elsts/plugin-update-checker/css/puc-debug-bar.css deleted file mode 100644 index 2cb3f8e..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/css/puc-debug-bar.css +++ /dev/null @@ -1,70 +0,0 @@ -.puc-debug-bar-panel-v4 pre { - margin-top: 0; -} - -/* Style the debug data table to match "widefat" table style used by WordPress. */ -table.puc-debug-data { - width: 100%; - clear: both; - margin: 0; - - border-spacing: 0; - background-color: #f9f9f9; - - border-radius: 3px; - border: 1px solid #dfdfdf; - border-collapse: separate; -} - -table.puc-debug-data * { - word-wrap: break-word; -} - -table.puc-debug-data th { - width: 11em; - padding: 7px 7px 8px; - text-align: left; - - font-family: "Georgia", "Times New Roman", "Bitstream Charter", "Times", serif; - font-weight: 400; - font-size: 14px; - line-height: 1.3em; - text-shadow: rgba(255, 255, 255, 0.804) 0 1px 0; -} - -table.puc-debug-data td, table.puc-debug-data th { - border-width: 1px 0; - border-style: solid; - - border-top-color: #fff; - border-bottom-color: #dfdfdf; - - text-transform: none; -} - -table.puc-debug-data td { - color: #555; - font-size: 12px; - padding: 4px 7px 2px; - vertical-align: top; -} - -.puc-ajax-response { - border: 1px solid #dfdfdf; - border-radius: 3px; - padding: 0.5em; - margin: 5px 0; - background-color: white; -} - -.puc-ajax-nonce { - display: none; -} - -.puc-ajax-response dt { - margin: 0; -} - -.puc-ajax-response dd { - margin: 0 0 1em; -} diff --git a/dependencies/yahnis-elsts/plugin-update-checker/js/debug-bar.js b/dependencies/yahnis-elsts/plugin-update-checker/js/debug-bar.js deleted file mode 100644 index 2452c02..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/js/debug-bar.js +++ /dev/null @@ -1,52 +0,0 @@ -jQuery(function($) { - - function runAjaxAction(button, action) { - button = $(button); - var panel = button.closest('.puc-debug-bar-panel-v4'); - var responseBox = button.closest('td').find('.puc-ajax-response'); - - responseBox.text('Processing...').show(); - $.post( - ajaxurl, - { - action : action, - uid : panel.data('uid'), - _wpnonce: panel.data('nonce') - }, - function(data) { - responseBox.html(data); - }, - 'html' - ); - } - - $('.puc-debug-bar-panel-v4 input[name="puc-check-now-button"]').on('click', function() { - runAjaxAction(this, 'puc_v4_debug_check_now'); - return false; - }); - - $('.puc-debug-bar-panel-v4 input[name="puc-request-info-button"]').on('click', function() { - runAjaxAction(this, 'puc_v4_debug_request_info'); - return false; - }); - - - // Debug Bar uses the panel class name as part of its link and container IDs. This means we can - // end up with multiple identical IDs if more than one plugin uses the update checker library. - // Fix it by replacing the class name with the plugin slug. - var panels = $('#debug-menu-targets').find('.puc-debug-bar-panel-v4'); - panels.each(function() { - var panel = $(this); - var uid = panel.data('uid'); - var target = panel.closest('.debug-menu-target'); - - //Change the panel wrapper ID. - target.attr('id', 'debug-menu-target-puc-' + uid); - - //Change the menu link ID as well and point it at the new target ID. - $('#debug-bar-menu').find('.puc-debug-menu-link-' + uid) - .closest('.debug-menu-link') - .attr('id', 'debug-menu-link-puc-' + uid) - .attr('href', '#' + target.attr('id')); - }); -}); \ No newline at end of file diff --git a/dependencies/yahnis-elsts/plugin-update-checker/load-v4p11.php b/dependencies/yahnis-elsts/plugin-update-checker/load-v4p11.php deleted file mode 100644 index 76916cc..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/load-v4p11.php +++ /dev/null @@ -1,28 +0,0 @@ - 'Puc_v4p11_Plugin_UpdateChecker', - 'Theme_UpdateChecker' => 'Puc_v4p11_Theme_UpdateChecker', - - 'Vcs_PluginUpdateChecker' => 'Puc_v4p11_Vcs_PluginUpdateChecker', - 'Vcs_ThemeUpdateChecker' => 'Puc_v4p11_Vcs_ThemeUpdateChecker', - - 'GitHubApi' => 'Puc_v4p11_Vcs_GitHubApi', - 'BitBucketApi' => 'Puc_v4p11_Vcs_BitBucketApi', - 'GitLabApi' => 'Puc_v4p11_Vcs_GitLabApi', - ) - as $pucGeneralClass => $pucVersionedClass -) { - Puc_v4_Factory::addVersion($pucGeneralClass, $pucVersionedClass, '4.11'); - //Also add it to the minor-version factory in case the major-version factory - //was already defined by another, older version of the update checker. - Puc_v4p11_Factory::addVersion($pucGeneralClass, $pucVersionedClass, '4.11'); -} - diff --git a/dependencies/yahnis-elsts/plugin-update-checker/plugin-update-checker.php b/dependencies/yahnis-elsts/plugin-update-checker/plugin-update-checker.php deleted file mode 100644 index f6ae63f..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/plugin-update-checker.php +++ /dev/null @@ -1,10 +0,0 @@ -=') ) { - require __DIR__ . '/ParsedownModern.php'; - } else { - require __DIR__ . '/ParsedownLegacy.php'; - } -} diff --git a/dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownLegacy.php b/dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownLegacy.php deleted file mode 100644 index bbc2d32..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownLegacy.php +++ /dev/null @@ -1,1535 +0,0 @@ -DefinitionData = array(); - - # standardize line breaks - $text = str_replace(array("\r\n", "\r"), "\n", $text); - - # remove surrounding line breaks - $text = trim($text, "\n"); - - # split text into lines - $lines = explode("\n", $text); - - # iterate through lines to identify blocks - $markup = $this->lines($lines); - - # trim line breaks - $markup = trim($markup, "\n"); - - return $markup; - } - - # - # Setters - # - - function setBreaksEnabled($breaksEnabled) - { - $this->breaksEnabled = $breaksEnabled; - - return $this; - } - - protected $breaksEnabled; - - function setMarkupEscaped($markupEscaped) - { - $this->markupEscaped = $markupEscaped; - - return $this; - } - - protected $markupEscaped; - - function setUrlsLinked($urlsLinked) - { - $this->urlsLinked = $urlsLinked; - - return $this; - } - - protected $urlsLinked = true; - - # - # Lines - # - - protected $BlockTypes = array( - '#' => array('Header'), - '*' => array('Rule', 'List'), - '+' => array('List'), - '-' => array('SetextHeader', 'Table', 'Rule', 'List'), - '0' => array('List'), - '1' => array('List'), - '2' => array('List'), - '3' => array('List'), - '4' => array('List'), - '5' => array('List'), - '6' => array('List'), - '7' => array('List'), - '8' => array('List'), - '9' => array('List'), - ':' => array('Table'), - '<' => array('Comment', 'Markup'), - '=' => array('SetextHeader'), - '>' => array('Quote'), - '[' => array('Reference'), - '_' => array('Rule'), - '`' => array('FencedCode'), - '|' => array('Table'), - '~' => array('FencedCode'), - ); - - # ~ - - protected $DefinitionTypes = array( - '[' => array('Reference'), - ); - - # ~ - - protected $unmarkedBlockTypes = array( - 'Code', - ); - - # - # Blocks - # - - private function lines(array $lines) - { - $CurrentBlock = null; - - foreach ($lines as $line) - { - if (chop($line) === '') - { - if (isset($CurrentBlock)) - { - $CurrentBlock['interrupted'] = true; - } - - continue; - } - - if (strpos($line, "\t") !== false) - { - $parts = explode("\t", $line); - - $line = $parts[0]; - - unset($parts[0]); - - foreach ($parts as $part) - { - $shortage = 4 - mb_strlen($line, 'utf-8') % 4; - - $line .= str_repeat(' ', $shortage); - $line .= $part; - } - } - - $indent = 0; - - while (isset($line[$indent]) and $line[$indent] === ' ') - { - $indent ++; - } - - $text = $indent > 0 ? substr($line, $indent) : $line; - - # ~ - - $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); - - # ~ - - if (isset($CurrentBlock['incomplete'])) - { - $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); - - if (isset($Block)) - { - $CurrentBlock = $Block; - - continue; - } - else - { - if (method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) - { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); - } - - unset($CurrentBlock['incomplete']); - } - } - - # ~ - - $marker = $text[0]; - - # ~ - - $blockTypes = $this->unmarkedBlockTypes; - - if (isset($this->BlockTypes[$marker])) - { - foreach ($this->BlockTypes[$marker] as $blockType) - { - $blockTypes []= $blockType; - } - } - - # - # ~ - - foreach ($blockTypes as $blockType) - { - $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); - - if (isset($Block)) - { - $Block['type'] = $blockType; - - if ( ! isset($Block['identified'])) - { - $Blocks []= $CurrentBlock; - - $Block['identified'] = true; - } - - if (method_exists($this, 'block'.$blockType.'Continue')) - { - $Block['incomplete'] = true; - } - - $CurrentBlock = $Block; - - continue 2; - } - } - - # ~ - - if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) - { - $CurrentBlock['element']['text'] .= "\n".$text; - } - else - { - $Blocks []= $CurrentBlock; - - $CurrentBlock = $this->paragraph($Line); - - $CurrentBlock['identified'] = true; - } - } - - # ~ - - if (isset($CurrentBlock['incomplete']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) - { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); - } - - # ~ - - $Blocks []= $CurrentBlock; - - unset($Blocks[0]); - - # ~ - - $markup = ''; - - foreach ($Blocks as $Block) - { - if (isset($Block['hidden'])) - { - continue; - } - - $markup .= "\n"; - $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); - } - - $markup .= "\n"; - - # ~ - - return $markup; - } - - # - # Code - - protected function blockCode($Line, $Block = null) - { - if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) - { - return; - } - - if ($Line['indent'] >= 4) - { - $text = substr($Line['body'], 4); - - $Block = array( - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => array( - 'name' => 'code', - 'text' => $text, - ), - ), - ); - - return $Block; - } - } - - protected function blockCodeContinue($Line, $Block) - { - if ($Line['indent'] >= 4) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['element']['text']['text'] .= "\n"; - - $text = substr($Line['body'], 4); - - $Block['element']['text']['text'] .= $text; - - return $Block; - } - } - - protected function blockCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Comment - - protected function blockComment($Line) - { - if ($this->markupEscaped) - { - return; - } - - if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') - { - $Block = array( - 'markup' => $Line['body'], - ); - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - } - - protected function blockCommentContinue($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - $Block['markup'] .= "\n" . $Line['body']; - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - - # - # Fenced Code - - protected function blockFencedCode($Line) - { - if (preg_match('/^(['.$Line['text'][0].']{3,})[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) - { - $Element = array( - 'name' => 'code', - 'text' => '', - ); - - if (isset($matches[2])) - { - $class = 'language-'.$matches[2]; - - $Element['attributes'] = array( - 'class' => $class, - ); - } - - $Block = array( - 'char' => $Line['text'][0], - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => $Element, - ), - ); - - return $Block; - } - } - - protected function blockFencedCodeContinue($Line, $Block) - { - if (isset($Block['complete'])) - { - return; - } - - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) - { - $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); - - $Block['complete'] = true; - - return $Block; - } - - $Block['element']['text']['text'] .= "\n".$Line['body'];; - - return $Block; - } - - protected function blockFencedCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Header - - protected function blockHeader($Line) - { - if (isset($Line['text'][1])) - { - $level = 1; - - while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') - { - $level ++; - } - - if ($level > 6) - { - return; - } - - $text = trim($Line['text'], '# '); - - $Block = array( - 'element' => array( - 'name' => 'h' . min(6, $level), - 'text' => $text, - 'handler' => 'line', - ), - ); - - return $Block; - } - } - - # - # List - - protected function blockList($Line) - { - list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); - - if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'indent' => $Line['indent'], - 'pattern' => $pattern, - 'element' => array( - 'name' => $name, - 'handler' => 'elements', - ), - ); - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $matches[2], - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - } - - protected function blockListContinue($Line, array $Block) - { - if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['li']['text'] []= ''; - - unset($Block['interrupted']); - } - - unset($Block['li']); - - $text = isset($matches[1]) ? $matches[1] : ''; - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $text, - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - - if ($Line['text'][0] === '[' and $this->blockReference($Line)) - { - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - return $Block; - } - - if ($Line['indent'] > 0) - { - $Block['li']['text'] []= ''; - - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - unset($Block['interrupted']); - - return $Block; - } - } - - # - # Quote - - protected function blockQuote($Line) - { - if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'element' => array( - 'name' => 'blockquote', - 'handler' => 'lines', - 'text' => (array) $matches[1], - ), - ); - - return $Block; - } - } - - protected function blockQuoteContinue($Line, array $Block) - { - if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text'] []= ''; - - unset($Block['interrupted']); - } - - $Block['element']['text'] []= $matches[1]; - - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $Block['element']['text'] []= $Line['text']; - - return $Block; - } - } - - # - # Rule - - protected function blockRule($Line) - { - if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) - { - $Block = array( - 'element' => array( - 'name' => 'hr' - ), - ); - - return $Block; - } - } - - # - # Setext - - protected function blockSetextHeader($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (chop($Line['text'], $Line['text'][0]) === '') - { - $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; - - return $Block; - } - } - - # - # Markup - - protected function blockMarkup($Line) - { - if ($this->markupEscaped) - { - return; - } - - if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) - { - if (in_array($matches[1], $this->textLevelElements)) - { - return; - } - - $Block = array( - 'name' => $matches[1], - 'depth' => 0, - 'markup' => $Line['text'], - ); - - $length = strlen($matches[0]); - - $remainder = substr($Line['text'], $length); - - if (trim($remainder) === '') - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - $Block['closed'] = true; - - $Block['void'] = true; - } - } - else - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - return; - } - - if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) - { - $Block['closed'] = true; - } - } - - return $Block; - } - } - - protected function blockMarkupContinue($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open - { - $Block['depth'] ++; - } - - if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close - { - if ($Block['depth'] > 0) - { - $Block['depth'] --; - } - else - { - $Block['closed'] = true; - } - - $Block['markup'] .= $matches[1]; - } - - if (isset($Block['interrupted'])) - { - $Block['markup'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['markup'] .= "\n".$Line['body']; - - return $Block; - } - - # - # Reference - - protected function blockReference($Line) - { - if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) - { - $id = strtolower($matches[1]); - - $Data = array( - 'url' => $matches[2], - 'title' => null, - ); - - if (isset($matches[3])) - { - $Data['title'] = $matches[3]; - } - - $this->DefinitionData['Reference'][$id] = $Data; - - $Block = array( - 'hidden' => true, - ); - - return $Block; - } - } - - # - # Table - - protected function blockTable($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') - { - $alignments = array(); - - $divider = $Line['text']; - - $divider = trim($divider); - $divider = trim($divider, '|'); - - $dividerCells = explode('|', $divider); - - foreach ($dividerCells as $dividerCell) - { - $dividerCell = trim($dividerCell); - - if ($dividerCell === '') - { - continue; - } - - $alignment = null; - - if ($dividerCell[0] === ':') - { - $alignment = 'left'; - } - - if (substr($dividerCell, - 1) === ':') - { - $alignment = $alignment === 'left' ? 'center' : 'right'; - } - - $alignments []= $alignment; - } - - # ~ - - $HeaderElements = array(); - - $header = $Block['element']['text']; - - $header = trim($header); - $header = trim($header, '|'); - - $headerCells = explode('|', $header); - - foreach ($headerCells as $index => $headerCell) - { - $headerCell = trim($headerCell); - - $HeaderElement = array( - 'name' => 'th', - 'text' => $headerCell, - 'handler' => 'line', - ); - - if (isset($alignments[$index])) - { - $alignment = $alignments[$index]; - - $HeaderElement['attributes'] = array( - 'style' => 'text-align: '.$alignment.';', - ); - } - - $HeaderElements []= $HeaderElement; - } - - # ~ - - $Block = array( - 'alignments' => $alignments, - 'identified' => true, - 'element' => array( - 'name' => 'table', - 'handler' => 'elements', - ), - ); - - $Block['element']['text'] []= array( - 'name' => 'thead', - 'handler' => 'elements', - ); - - $Block['element']['text'] []= array( - 'name' => 'tbody', - 'handler' => 'elements', - 'text' => array(), - ); - - $Block['element']['text'][0]['text'] []= array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $HeaderElements, - ); - - return $Block; - } - } - - protected function blockTableContinue($Line, array $Block) - { - if (isset($Block['interrupted'])) - { - return; - } - - if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) - { - $Elements = array(); - - $row = $Line['text']; - - $row = trim($row); - $row = trim($row, '|'); - - preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); - - foreach ($matches[0] as $index => $cell) - { - $cell = trim($cell); - - $Element = array( - 'name' => 'td', - 'handler' => 'line', - 'text' => $cell, - ); - - if (isset($Block['alignments'][$index])) - { - $Element['attributes'] = array( - 'style' => 'text-align: '.$Block['alignments'][$index].';', - ); - } - - $Elements []= $Element; - } - - $Element = array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $Elements, - ); - - $Block['element']['text'][1]['text'] []= $Element; - - return $Block; - } - } - - # - # ~ - # - - protected function paragraph($Line) - { - $Block = array( - 'element' => array( - 'name' => 'p', - 'text' => $Line['text'], - 'handler' => 'line', - ), - ); - - return $Block; - } - - # - # Inline Elements - # - - protected $InlineTypes = array( - '"' => array('SpecialCharacter'), - '!' => array('Image'), - '&' => array('SpecialCharacter'), - '*' => array('Emphasis'), - ':' => array('Url'), - '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), - '>' => array('SpecialCharacter'), - '[' => array('Link'), - '_' => array('Emphasis'), - '`' => array('Code'), - '~' => array('Strikethrough'), - '\\' => array('EscapeSequence'), - ); - - # ~ - - protected $inlineMarkerList = '!"*_&[:<>`~\\'; - - # - # ~ - # - - public function line($text) - { - $markup = ''; - - $unexaminedText = $text; - - $markerPosition = 0; - - while ($excerpt = strpbrk($unexaminedText, $this->inlineMarkerList)) - { - $marker = $excerpt[0]; - - $markerPosition += strpos($unexaminedText, $marker); - - $Excerpt = array('text' => $excerpt, 'context' => $text); - - foreach ($this->InlineTypes[$marker] as $inlineType) - { - $Inline = $this->{'inline'.$inlineType}($Excerpt); - - if ( ! isset($Inline)) - { - continue; - } - - if (isset($Inline['position']) and $Inline['position'] > $markerPosition) # position is ahead of marker - { - continue; - } - - if ( ! isset($Inline['position'])) - { - $Inline['position'] = $markerPosition; - } - - $unmarkedText = substr($text, 0, $Inline['position']); - - $markup .= $this->unmarkedText($unmarkedText); - - $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); - - $text = substr($text, $Inline['position'] + $Inline['extent']); - - $unexaminedText = $text; - - $markerPosition = 0; - - continue 2; - } - - $unexaminedText = substr($excerpt, 1); - - $markerPosition ++; - } - - $markup .= $this->unmarkedText($text); - - return $markup; - } - - # - # ~ - # - - protected function inlineCode($Excerpt) - { - $marker = $Excerpt['text'][0]; - - if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), - 'element' => array( - 'name' => 'code', - 'text' => $text, - ), - ); - } - } - - protected function inlineEmailTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) - { - $url = $matches[1]; - - if ( ! isset($matches[2])) - { - $url = 'mailto:' . $url; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $matches[1], - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - protected function inlineEmphasis($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - $marker = $Excerpt['text'][0]; - - if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'strong'; - } - elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'em'; - } - else - { - return; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => $emphasis, - 'handler' => 'line', - 'text' => $matches[1], - ), - ); - } - - protected function inlineEscapeSequence($Excerpt) - { - if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) - { - return array( - 'markup' => $Excerpt['text'][1], - 'extent' => 2, - ); - } - } - - protected function inlineImage($Excerpt) - { - if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') - { - return; - } - - $Excerpt['text']= substr($Excerpt['text'], 1); - - $Link = $this->inlineLink($Excerpt); - - if ($Link === null) - { - return; - } - - $Inline = array( - 'extent' => $Link['extent'] + 1, - 'element' => array( - 'name' => 'img', - 'attributes' => array( - 'src' => $Link['element']['attributes']['href'], - 'alt' => $Link['element']['text'], - ), - ), - ); - - $Inline['element']['attributes'] += $Link['element']['attributes']; - - unset($Inline['element']['attributes']['href']); - - return $Inline; - } - - protected function inlineLink($Excerpt) - { - $Element = array( - 'name' => 'a', - 'handler' => 'line', - 'text' => null, - 'attributes' => array( - 'href' => null, - 'title' => null, - ), - ); - - $extent = 0; - - $remainder = $Excerpt['text']; - - if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) - { - $Element['text'] = $matches[1]; - - $extent += strlen($matches[0]); - - $remainder = substr($remainder, $extent); - } - else - { - return; - } - - if (preg_match('/^[(]((?:[^ (]|[(][^ )]+[)])+)(?:[ ]+("[^"]+"|\'[^\']+\'))?[)]/', $remainder, $matches)) - { - $Element['attributes']['href'] = $matches[1]; - - if (isset($matches[2])) - { - $Element['attributes']['title'] = substr($matches[2], 1, - 1); - } - - $extent += strlen($matches[0]); - } - else - { - if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) - { - $definition = $matches[1] ? $matches[1] : $Element['text']; - $definition = strtolower($definition); - - $extent += strlen($matches[0]); - } - else - { - $definition = strtolower($Element['text']); - } - - if ( ! isset($this->DefinitionData['Reference'][$definition])) - { - return; - } - - $Definition = $this->DefinitionData['Reference'][$definition]; - - $Element['attributes']['href'] = $Definition['url']; - $Element['attributes']['title'] = $Definition['title']; - } - - $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); - - return array( - 'extent' => $extent, - 'element' => $Element, - ); - } - - protected function inlineMarkup($Excerpt) - { - if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) - { - return; - } - - if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - - if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - - if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - } - - protected function inlineSpecialCharacter($Excerpt) - { - if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) - { - return array( - 'markup' => '&', - 'extent' => 1, - ); - } - - $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); - - if (isset($SpecialCharacter[$Excerpt['text'][0]])) - { - return array( - 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', - 'extent' => 1, - ); - } - } - - protected function inlineStrikethrough($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) - { - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'del', - 'text' => $matches[1], - 'handler' => 'line', - ), - ); - } - } - - protected function inlineUrl($Excerpt) - { - if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') - { - return; - } - - if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) - { - $Inline = array( - 'extent' => strlen($matches[0][0]), - 'position' => $matches[0][1], - 'element' => array( - 'name' => 'a', - 'text' => $matches[0][0], - 'attributes' => array( - 'href' => $matches[0][0], - ), - ), - ); - - return $Inline; - } - } - - protected function inlineUrlTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) - { - $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $url, - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - # - # ~ - - protected $unmarkedInlineTypes = array("\n" => 'Break', '://' => 'Url'); - - # ~ - - protected function unmarkedText($text) - { - if ($this->breaksEnabled) - { - $text = preg_replace('/[ ]*\n/', "
      \n", $text); - } - else - { - $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
      \n", $text); - $text = str_replace(" \n", "\n", $text); - } - - return $text; - } - - # - # Handlers - # - - protected function element(array $Element) - { - $markup = '<'.$Element['name']; - - if (isset($Element['attributes'])) - { - foreach ($Element['attributes'] as $name => $value) - { - if ($value === null) - { - continue; - } - - $markup .= ' '.$name.'="'.$value.'"'; - } - } - - if (isset($Element['text'])) - { - $markup .= '>'; - - if (isset($Element['handler'])) - { - $markup .= $this->{$Element['handler']}($Element['text']); - } - else - { - $markup .= $Element['text']; - } - - $markup .= ''; - } - else - { - $markup .= ' />'; - } - - return $markup; - } - - protected function elements(array $Elements) - { - $markup = ''; - - foreach ($Elements as $Element) - { - $markup .= "\n" . $this->element($Element); - } - - $markup .= "\n"; - - return $markup; - } - - # ~ - - protected function li($lines) - { - $markup = $this->lines($lines); - - $trimmedMarkup = trim($markup); - - if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

      ') - { - $markup = $trimmedMarkup; - $markup = substr($markup, 3); - - $position = strpos($markup, "

      "); - - $markup = substr_replace($markup, '', $position, 4); - } - - return $markup; - } - - # - # Deprecated Methods - # - - function parse($text) - { - $markup = $this->text($text); - - return $markup; - } - - # - # Static Methods - # - - static function instance($name = 'default') - { - if (isset(self::$instances[$name])) - { - return self::$instances[$name]; - } - - $instance = new self(); - - self::$instances[$name] = $instance; - - return $instance; - } - - private static $instances = array(); - - # - # Fields - # - - protected $DefinitionData; - - # - # Read-Only - - protected $specialCharacters = array( - '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', - ); - - protected $StrongRegex = array( - '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', - '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', - ); - - protected $EmRegex = array( - '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', - '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', - ); - - protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; - - protected $voidElements = array( - 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', - ); - - protected $textLevelElements = array( - 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', - 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', - 'i', 'rp', 'del', 'code', 'strike', 'marquee', - 'q', 'rt', 'ins', 'font', 'strong', - 's', 'tt', 'sub', 'mark', - 'u', 'xm', 'sup', 'nobr', - 'var', 'ruby', - 'wbr', 'span', - 'time', - ); -} diff --git a/dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownModern.php b/dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownModern.php deleted file mode 100644 index 5d96071..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/vendor/ParsedownModern.php +++ /dev/null @@ -1,1538 +0,0 @@ -DefinitionData = array(); - - # standardize line breaks - $text = str_replace(array("\r\n", "\r"), "\n", $text); - - # remove surrounding line breaks - $text = trim($text, "\n"); - - # split text into lines - $lines = explode("\n", $text); - - # iterate through lines to identify blocks - $markup = $this->lines($lines); - - # trim line breaks - $markup = trim($markup, "\n"); - - return $markup; - } - - # - # Setters - # - - function setBreaksEnabled($breaksEnabled) - { - $this->breaksEnabled = $breaksEnabled; - - return $this; - } - - protected $breaksEnabled; - - function setMarkupEscaped($markupEscaped) - { - $this->markupEscaped = $markupEscaped; - - return $this; - } - - protected $markupEscaped; - - function setUrlsLinked($urlsLinked) - { - $this->urlsLinked = $urlsLinked; - - return $this; - } - - protected $urlsLinked = true; - - # - # Lines - # - - protected $BlockTypes = array( - '#' => array('Header'), - '*' => array('Rule', 'List'), - '+' => array('List'), - '-' => array('SetextHeader', 'Table', 'Rule', 'List'), - '0' => array('List'), - '1' => array('List'), - '2' => array('List'), - '3' => array('List'), - '4' => array('List'), - '5' => array('List'), - '6' => array('List'), - '7' => array('List'), - '8' => array('List'), - '9' => array('List'), - ':' => array('Table'), - '<' => array('Comment', 'Markup'), - '=' => array('SetextHeader'), - '>' => array('Quote'), - '[' => array('Reference'), - '_' => array('Rule'), - '`' => array('FencedCode'), - '|' => array('Table'), - '~' => array('FencedCode'), - ); - - # ~ - - protected $unmarkedBlockTypes = array( - 'Code', - ); - - # - # Blocks - # - - protected function lines(array $lines) - { - $CurrentBlock = null; - - foreach ($lines as $line) - { - if (chop($line) === '') - { - if (isset($CurrentBlock)) - { - $CurrentBlock['interrupted'] = true; - } - - continue; - } - - if (strpos($line, "\t") !== false) - { - $parts = explode("\t", $line); - - $line = $parts[0]; - - unset($parts[0]); - - foreach ($parts as $part) - { - $shortage = 4 - mb_strlen($line, 'utf-8') % 4; - - $line .= str_repeat(' ', $shortage); - $line .= $part; - } - } - - $indent = 0; - - while (isset($line[$indent]) and $line[$indent] === ' ') - { - $indent ++; - } - - $text = $indent > 0 ? substr($line, $indent) : $line; - - # ~ - - $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); - - # ~ - - if (isset($CurrentBlock['continuable'])) - { - $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); - - if (isset($Block)) - { - $CurrentBlock = $Block; - - continue; - } - else - { - if ($this->isBlockCompletable($CurrentBlock['type'])) - { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); - } - } - } - - # ~ - - $marker = $text[0]; - - # ~ - - $blockTypes = $this->unmarkedBlockTypes; - - if (isset($this->BlockTypes[$marker])) - { - foreach ($this->BlockTypes[$marker] as $blockType) - { - $blockTypes []= $blockType; - } - } - - # - # ~ - - foreach ($blockTypes as $blockType) - { - $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); - - if (isset($Block)) - { - $Block['type'] = $blockType; - - if ( ! isset($Block['identified'])) - { - $Blocks []= $CurrentBlock; - - $Block['identified'] = true; - } - - if ($this->isBlockContinuable($blockType)) - { - $Block['continuable'] = true; - } - - $CurrentBlock = $Block; - - continue 2; - } - } - - # ~ - - if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) - { - $CurrentBlock['element']['text'] .= "\n".$text; - } - else - { - $Blocks []= $CurrentBlock; - - $CurrentBlock = $this->paragraph($Line); - - $CurrentBlock['identified'] = true; - } - } - - # ~ - - if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) - { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); - } - - # ~ - - $Blocks []= $CurrentBlock; - - unset($Blocks[0]); - - # ~ - - $markup = ''; - - foreach ($Blocks as $Block) - { - if (isset($Block['hidden'])) - { - continue; - } - - $markup .= "\n"; - $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); - } - - $markup .= "\n"; - - # ~ - - return $markup; - } - - protected function isBlockContinuable($Type) - { - return method_exists($this, 'block'.$Type.'Continue'); - } - - protected function isBlockCompletable($Type) - { - return method_exists($this, 'block'.$Type.'Complete'); - } - - # - # Code - - protected function blockCode($Line, $Block = null) - { - if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) - { - return; - } - - if ($Line['indent'] >= 4) - { - $text = substr($Line['body'], 4); - - $Block = array( - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => array( - 'name' => 'code', - 'text' => $text, - ), - ), - ); - - return $Block; - } - } - - protected function blockCodeContinue($Line, $Block) - { - if ($Line['indent'] >= 4) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['element']['text']['text'] .= "\n"; - - $text = substr($Line['body'], 4); - - $Block['element']['text']['text'] .= $text; - - return $Block; - } - } - - protected function blockCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Comment - - protected function blockComment($Line) - { - if ($this->markupEscaped) - { - return; - } - - if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') - { - $Block = array( - 'markup' => $Line['body'], - ); - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - } - - protected function blockCommentContinue($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - $Block['markup'] .= "\n" . $Line['body']; - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - - # - # Fenced Code - - protected function blockFencedCode($Line) - { - if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) - { - $Element = array( - 'name' => 'code', - 'text' => '', - ); - - if (isset($matches[1])) - { - $class = 'language-'.$matches[1]; - - $Element['attributes'] = array( - 'class' => $class, - ); - } - - $Block = array( - 'char' => $Line['text'][0], - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => $Element, - ), - ); - - return $Block; - } - } - - protected function blockFencedCodeContinue($Line, $Block) - { - if (isset($Block['complete'])) - { - return; - } - - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) - { - $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); - - $Block['complete'] = true; - - return $Block; - } - - $Block['element']['text']['text'] .= "\n".$Line['body'];; - - return $Block; - } - - protected function blockFencedCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Header - - protected function blockHeader($Line) - { - if (isset($Line['text'][1])) - { - $level = 1; - - while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') - { - $level ++; - } - - if ($level > 6) - { - return; - } - - $text = trim($Line['text'], '# '); - - $Block = array( - 'element' => array( - 'name' => 'h' . min(6, $level), - 'text' => $text, - 'handler' => 'line', - ), - ); - - return $Block; - } - } - - # - # List - - protected function blockList($Line) - { - list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); - - if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'indent' => $Line['indent'], - 'pattern' => $pattern, - 'element' => array( - 'name' => $name, - 'handler' => 'elements', - ), - ); - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $matches[2], - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - } - - protected function blockListContinue($Line, array $Block) - { - if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['li']['text'] []= ''; - - unset($Block['interrupted']); - } - - unset($Block['li']); - - $text = isset($matches[1]) ? $matches[1] : ''; - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $text, - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - - if ($Line['text'][0] === '[' and $this->blockReference($Line)) - { - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - return $Block; - } - - if ($Line['indent'] > 0) - { - $Block['li']['text'] []= ''; - - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - unset($Block['interrupted']); - - return $Block; - } - } - - # - # Quote - - protected function blockQuote($Line) - { - if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'element' => array( - 'name' => 'blockquote', - 'handler' => 'lines', - 'text' => (array) $matches[1], - ), - ); - - return $Block; - } - } - - protected function blockQuoteContinue($Line, array $Block) - { - if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text'] []= ''; - - unset($Block['interrupted']); - } - - $Block['element']['text'] []= $matches[1]; - - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $Block['element']['text'] []= $Line['text']; - - return $Block; - } - } - - # - # Rule - - protected function blockRule($Line) - { - if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) - { - $Block = array( - 'element' => array( - 'name' => 'hr' - ), - ); - - return $Block; - } - } - - # - # Setext - - protected function blockSetextHeader($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (chop($Line['text'], $Line['text'][0]) === '') - { - $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; - - return $Block; - } - } - - # - # Markup - - protected function blockMarkup($Line) - { - if ($this->markupEscaped) - { - return; - } - - if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) - { - $element = strtolower($matches[1]); - - if (in_array($element, $this->textLevelElements)) - { - return; - } - - $Block = array( - 'name' => $matches[1], - 'depth' => 0, - 'markup' => $Line['text'], - ); - - $length = strlen($matches[0]); - - $remainder = substr($Line['text'], $length); - - if (trim($remainder) === '') - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - $Block['closed'] = true; - - $Block['void'] = true; - } - } - else - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - return; - } - - if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) - { - $Block['closed'] = true; - } - } - - return $Block; - } - } - - protected function blockMarkupContinue($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open - { - $Block['depth'] ++; - } - - if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close - { - if ($Block['depth'] > 0) - { - $Block['depth'] --; - } - else - { - $Block['closed'] = true; - } - } - - if (isset($Block['interrupted'])) - { - $Block['markup'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['markup'] .= "\n".$Line['body']; - - return $Block; - } - - # - # Reference - - protected function blockReference($Line) - { - if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) - { - $id = strtolower($matches[1]); - - $Data = array( - 'url' => $matches[2], - 'title' => null, - ); - - if (isset($matches[3])) - { - $Data['title'] = $matches[3]; - } - - $this->DefinitionData['Reference'][$id] = $Data; - - $Block = array( - 'hidden' => true, - ); - - return $Block; - } - } - - # - # Table - - protected function blockTable($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') - { - $alignments = array(); - - $divider = $Line['text']; - - $divider = trim($divider); - $divider = trim($divider, '|'); - - $dividerCells = explode('|', $divider); - - foreach ($dividerCells as $dividerCell) - { - $dividerCell = trim($dividerCell); - - if ($dividerCell === '') - { - continue; - } - - $alignment = null; - - if ($dividerCell[0] === ':') - { - $alignment = 'left'; - } - - if (substr($dividerCell, - 1) === ':') - { - $alignment = $alignment === 'left' ? 'center' : 'right'; - } - - $alignments []= $alignment; - } - - # ~ - - $HeaderElements = array(); - - $header = $Block['element']['text']; - - $header = trim($header); - $header = trim($header, '|'); - - $headerCells = explode('|', $header); - - foreach ($headerCells as $index => $headerCell) - { - $headerCell = trim($headerCell); - - $HeaderElement = array( - 'name' => 'th', - 'text' => $headerCell, - 'handler' => 'line', - ); - - if (isset($alignments[$index])) - { - $alignment = $alignments[$index]; - - $HeaderElement['attributes'] = array( - 'style' => 'text-align: '.$alignment.';', - ); - } - - $HeaderElements []= $HeaderElement; - } - - # ~ - - $Block = array( - 'alignments' => $alignments, - 'identified' => true, - 'element' => array( - 'name' => 'table', - 'handler' => 'elements', - ), - ); - - $Block['element']['text'] []= array( - 'name' => 'thead', - 'handler' => 'elements', - ); - - $Block['element']['text'] []= array( - 'name' => 'tbody', - 'handler' => 'elements', - 'text' => array(), - ); - - $Block['element']['text'][0]['text'] []= array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $HeaderElements, - ); - - return $Block; - } - } - - protected function blockTableContinue($Line, array $Block) - { - if (isset($Block['interrupted'])) - { - return; - } - - if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) - { - $Elements = array(); - - $row = $Line['text']; - - $row = trim($row); - $row = trim($row, '|'); - - preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); - - foreach ($matches[0] as $index => $cell) - { - $cell = trim($cell); - - $Element = array( - 'name' => 'td', - 'handler' => 'line', - 'text' => $cell, - ); - - if (isset($Block['alignments'][$index])) - { - $Element['attributes'] = array( - 'style' => 'text-align: '.$Block['alignments'][$index].';', - ); - } - - $Elements []= $Element; - } - - $Element = array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $Elements, - ); - - $Block['element']['text'][1]['text'] []= $Element; - - return $Block; - } - } - - # - # ~ - # - - protected function paragraph($Line) - { - $Block = array( - 'element' => array( - 'name' => 'p', - 'text' => $Line['text'], - 'handler' => 'line', - ), - ); - - return $Block; - } - - # - # Inline Elements - # - - protected $InlineTypes = array( - '"' => array('SpecialCharacter'), - '!' => array('Image'), - '&' => array('SpecialCharacter'), - '*' => array('Emphasis'), - ':' => array('Url'), - '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), - '>' => array('SpecialCharacter'), - '[' => array('Link'), - '_' => array('Emphasis'), - '`' => array('Code'), - '~' => array('Strikethrough'), - '\\' => array('EscapeSequence'), - ); - - # ~ - - protected $inlineMarkerList = '!"*_&[:<>`~\\'; - - # - # ~ - # - - public function line($text) - { - $markup = ''; - - # $excerpt is based on the first occurrence of a marker - - while ($excerpt = strpbrk($text, $this->inlineMarkerList)) - { - $marker = $excerpt[0]; - - $markerPosition = strpos($text, $marker); - - $Excerpt = array('text' => $excerpt, 'context' => $text); - - foreach ($this->InlineTypes[$marker] as $inlineType) - { - $Inline = $this->{'inline'.$inlineType}($Excerpt); - - if ( ! isset($Inline)) - { - continue; - } - - # makes sure that the inline belongs to "our" marker - - if (isset($Inline['position']) and $Inline['position'] > $markerPosition) - { - continue; - } - - # sets a default inline position - - if ( ! isset($Inline['position'])) - { - $Inline['position'] = $markerPosition; - } - - # the text that comes before the inline - $unmarkedText = substr($text, 0, $Inline['position']); - - # compile the unmarked text - $markup .= $this->unmarkedText($unmarkedText); - - # compile the inline - $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); - - # remove the examined text - $text = substr($text, $Inline['position'] + $Inline['extent']); - - continue 2; - } - - # the marker does not belong to an inline - - $unmarkedText = substr($text, 0, $markerPosition + 1); - - $markup .= $this->unmarkedText($unmarkedText); - - $text = substr($text, $markerPosition + 1); - } - - $markup .= $this->unmarkedText($text); - - return $markup; - } - - # - # ~ - # - - protected function inlineCode($Excerpt) - { - $marker = $Excerpt['text'][0]; - - if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), - 'element' => array( - 'name' => 'code', - 'text' => $text, - ), - ); - } - } - - protected function inlineEmailTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) - { - $url = $matches[1]; - - if ( ! isset($matches[2])) - { - $url = 'mailto:' . $url; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $matches[1], - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - protected function inlineEmphasis($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - $marker = $Excerpt['text'][0]; - - if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'strong'; - } - elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'em'; - } - else - { - return; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => $emphasis, - 'handler' => 'line', - 'text' => $matches[1], - ), - ); - } - - protected function inlineEscapeSequence($Excerpt) - { - if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) - { - return array( - 'markup' => $Excerpt['text'][1], - 'extent' => 2, - ); - } - } - - protected function inlineImage($Excerpt) - { - if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') - { - return; - } - - $Excerpt['text']= substr($Excerpt['text'], 1); - - $Link = $this->inlineLink($Excerpt); - - if ($Link === null) - { - return; - } - - $Inline = array( - 'extent' => $Link['extent'] + 1, - 'element' => array( - 'name' => 'img', - 'attributes' => array( - 'src' => $Link['element']['attributes']['href'], - 'alt' => $Link['element']['text'], - ), - ), - ); - - $Inline['element']['attributes'] += $Link['element']['attributes']; - - unset($Inline['element']['attributes']['href']); - - return $Inline; - } - - protected function inlineLink($Excerpt) - { - $Element = array( - 'name' => 'a', - 'handler' => 'line', - 'text' => null, - 'attributes' => array( - 'href' => null, - 'title' => null, - ), - ); - - $extent = 0; - - $remainder = $Excerpt['text']; - - if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) - { - $Element['text'] = $matches[1]; - - $extent += strlen($matches[0]); - - $remainder = substr($remainder, $extent); - } - else - { - return; - } - - if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) - { - $Element['attributes']['href'] = $matches[1]; - - if (isset($matches[2])) - { - $Element['attributes']['title'] = substr($matches[2], 1, - 1); - } - - $extent += strlen($matches[0]); - } - else - { - if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) - { - $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; - $definition = strtolower($definition); - - $extent += strlen($matches[0]); - } - else - { - $definition = strtolower($Element['text']); - } - - if ( ! isset($this->DefinitionData['Reference'][$definition])) - { - return; - } - - $Definition = $this->DefinitionData['Reference'][$definition]; - - $Element['attributes']['href'] = $Definition['url']; - $Element['attributes']['title'] = $Definition['title']; - } - - $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); - - return array( - 'extent' => $extent, - 'element' => $Element, - ); - } - - protected function inlineMarkup($Excerpt) - { - if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) - { - return; - } - - if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - - if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - - if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - } - - protected function inlineSpecialCharacter($Excerpt) - { - if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) - { - return array( - 'markup' => '&', - 'extent' => 1, - ); - } - - $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); - - if (isset($SpecialCharacter[$Excerpt['text'][0]])) - { - return array( - 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', - 'extent' => 1, - ); - } - } - - protected function inlineStrikethrough($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) - { - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'del', - 'text' => $matches[1], - 'handler' => 'line', - ), - ); - } - } - - protected function inlineUrl($Excerpt) - { - if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') - { - return; - } - - if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) - { - $Inline = array( - 'extent' => strlen($matches[0][0]), - 'position' => $matches[0][1], - 'element' => array( - 'name' => 'a', - 'text' => $matches[0][0], - 'attributes' => array( - 'href' => $matches[0][0], - ), - ), - ); - - return $Inline; - } - } - - protected function inlineUrlTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) - { - $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $url, - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - # ~ - - protected function unmarkedText($text) - { - if ($this->breaksEnabled) - { - $text = preg_replace('/[ ]*\n/', "
      \n", $text); - } - else - { - $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
      \n", $text); - $text = str_replace(" \n", "\n", $text); - } - - return $text; - } - - # - # Handlers - # - - protected function element(array $Element) - { - $markup = '<'.$Element['name']; - - if (isset($Element['attributes'])) - { - foreach ($Element['attributes'] as $name => $value) - { - if ($value === null) - { - continue; - } - - $markup .= ' '.$name.'="'.$value.'"'; - } - } - - if (isset($Element['text'])) - { - $markup .= '>'; - - if (isset($Element['handler'])) - { - $markup .= $this->{$Element['handler']}($Element['text']); - } - else - { - $markup .= $Element['text']; - } - - $markup .= ''; - } - else - { - $markup .= ' />'; - } - - return $markup; - } - - protected function elements(array $Elements) - { - $markup = ''; - - foreach ($Elements as $Element) - { - $markup .= "\n" . $this->element($Element); - } - - $markup .= "\n"; - - return $markup; - } - - # ~ - - protected function li($lines) - { - $markup = $this->lines($lines); - - $trimmedMarkup = trim($markup); - - if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

      ') - { - $markup = $trimmedMarkup; - $markup = substr($markup, 3); - - $position = strpos($markup, "

      "); - - $markup = substr_replace($markup, '', $position, 4); - } - - return $markup; - } - - # - # Deprecated Methods - # - - function parse($text) - { - $markup = $this->text($text); - - return $markup; - } - - # - # Static Methods - # - - static function instance($name = 'default') - { - if (isset(self::$instances[$name])) - { - return self::$instances[$name]; - } - - $instance = new static(); - - self::$instances[$name] = $instance; - - return $instance; - } - - private static $instances = array(); - - # - # Fields - # - - protected $DefinitionData; - - # - # Read-Only - - protected $specialCharacters = array( - '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', - ); - - protected $StrongRegex = array( - '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', - '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', - ); - - protected $EmRegex = array( - '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', - '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', - ); - - protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; - - protected $voidElements = array( - 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', - ); - - protected $textLevelElements = array( - 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', - 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', - 'i', 'rp', 'del', 'code', 'strike', 'marquee', - 'q', 'rt', 'ins', 'font', 'strong', - 's', 'tt', 'sub', 'mark', - 'u', 'xm', 'sup', 'nobr', - 'var', 'ruby', - 'wbr', 'span', - 'time', - ); -} \ No newline at end of file diff --git a/dependencies/yahnis-elsts/plugin-update-checker/vendor/PucReadmeParser.php b/dependencies/yahnis-elsts/plugin-update-checker/vendor/PucReadmeParser.php deleted file mode 100644 index 1f5cec9..0000000 --- a/dependencies/yahnis-elsts/plugin-update-checker/vendor/PucReadmeParser.php +++ /dev/null @@ -1,348 +0,0 @@ -parse_readme_contents( $file_contents ); - } - - function parse_readme_contents( $file_contents ) { - $file_contents = str_replace(array("\r\n", "\r"), "\n", $file_contents); - $file_contents = trim($file_contents); - if ( 0 === strpos( $file_contents, "\xEF\xBB\xBF" ) ) - $file_contents = substr( $file_contents, 3 ); - - // Markdown transformations - $file_contents = preg_replace( "|^###([^#]+)#*?\s*?\n|im", '=$1='."\n", $file_contents ); - $file_contents = preg_replace( "|^##([^#]+)#*?\s*?\n|im", '==$1=='."\n", $file_contents ); - $file_contents = preg_replace( "|^#([^#]+)#*?\s*?\n|im", '===$1==='."\n", $file_contents ); - - // === Plugin Name === - // Must be the very first thing. - if ( !preg_match('|^===(.*)===|', $file_contents, $_name) ) - return array(); // require a name - $name = trim($_name[1], '='); - $name = $this->sanitize_text( $name ); - - $file_contents = $this->chop_string( $file_contents, $_name[0] ); - - - // Requires at least: 1.5 - if ( preg_match('|Requires at least:(.*)|i', $file_contents, $_requires_at_least) ) - $requires_at_least = $this->sanitize_text($_requires_at_least[1]); - else - $requires_at_least = NULL; - - - // Tested up to: 2.1 - if ( preg_match('|Tested up to:(.*)|i', $file_contents, $_tested_up_to) ) - $tested_up_to = $this->sanitize_text( $_tested_up_to[1] ); - else - $tested_up_to = NULL; - - // Requires PHP: 5.2.4 - if ( preg_match('|Requires PHP:(.*)|i', $file_contents, $_requires_php) ) { - $requires_php = $this->sanitize_text( $_requires_php[1] ); - } else { - $requires_php = null; - } - - // Stable tag: 10.4-ride-the-fire-eagle-danger-day - if ( preg_match('|Stable tag:(.*)|i', $file_contents, $_stable_tag) ) - $stable_tag = $this->sanitize_text( $_stable_tag[1] ); - else - $stable_tag = NULL; // we assume trunk, but don't set it here to tell the difference between specified trunk and default trunk - - - // Tags: some tag, another tag, we like tags - if ( preg_match('|Tags:(.*)|i', $file_contents, $_tags) ) { - $tags = preg_split('|,[\s]*?|', trim($_tags[1])); - foreach ( array_keys($tags) as $t ) - $tags[$t] = $this->sanitize_text( $tags[$t] ); - } else { - $tags = array(); - } - - - // Contributors: markjaquith, mdawaffe, zefrank - $contributors = array(); - if ( preg_match('|Contributors:(.*)|i', $file_contents, $_contributors) ) { - $temp_contributors = preg_split('|,[\s]*|', trim($_contributors[1])); - foreach ( array_keys($temp_contributors) as $c ) { - $tmp_sanitized = $this->user_sanitize( $temp_contributors[$c] ); - if ( strlen(trim($tmp_sanitized)) > 0 ) - $contributors[$c] = $tmp_sanitized; - unset($tmp_sanitized); - } - } - - - // Donate Link: URL - if ( preg_match('|Donate link:(.*)|i', $file_contents, $_donate_link) ) - $donate_link = esc_url( $_donate_link[1] ); - else - $donate_link = NULL; - - - // togs, conts, etc are optional and order shouldn't matter. So we chop them only after we've grabbed their values. - foreach ( array('tags', 'contributors', 'requires_at_least', 'tested_up_to', 'stable_tag', 'donate_link') as $chop ) { - if ( $$chop ) { - $_chop = '_' . $chop; - $file_contents = $this->chop_string( $file_contents, ${$_chop}[0] ); - } - } - - $file_contents = trim($file_contents); - - - // short-description fu - if ( !preg_match('/(^(.*?))^[\s]*=+?[\s]*.+?[\s]*=+?/ms', $file_contents, $_short_description) ) - $_short_description = array( 1 => &$file_contents, 2 => &$file_contents ); - $short_desc_filtered = $this->sanitize_text( $_short_description[2] ); - $short_desc_length = strlen($short_desc_filtered); - $short_description = substr($short_desc_filtered, 0, 150); - if ( $short_desc_length > strlen($short_description) ) - $truncated = true; - else - $truncated = false; - if ( $_short_description[1] ) - $file_contents = $this->chop_string( $file_contents, $_short_description[1] ); // yes, the [1] is intentional - - // == Section == - // Break into sections - // $_sections[0] will be the title of the first section, $_sections[1] will be the content of the first section - // the array alternates from there: title2, content2, title3, content3... and so forth - $_sections = preg_split('/^[\s]*==[\s]*(.+?)[\s]*==/m', $file_contents, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); - - $sections = array(); - for ( $i=0; $i < count($_sections); $i +=2 ) { - $title = $this->sanitize_text( $_sections[$i] ); - if ( isset($_sections[$i+1]) ) { - $content = preg_replace('/(^[\s]*)=[\s]+(.+?)[\s]+=/m', '$1

      $2

      ', $_sections[$i+1]); - $content = $this->filter_text( $content, true ); - } else { - $content = ''; - } - $sections[str_replace(' ', '_', strtolower($title))] = array('title' => $title, 'content' => $content); - } - - - // Special sections - // This is where we nab our special sections, so we can enforce their order and treat them differently, if needed - // upgrade_notice is not a section, but parse it like it is for now - $final_sections = array(); - foreach ( array('description', 'installation', 'frequently_asked_questions', 'screenshots', 'changelog', 'change_log', 'upgrade_notice') as $special_section ) { - if ( isset($sections[$special_section]) ) { - $final_sections[$special_section] = $sections[$special_section]['content']; - unset($sections[$special_section]); - } - } - if ( isset($final_sections['change_log']) && empty($final_sections['changelog']) ) - $final_sections['changelog'] = $final_sections['change_log']; - - - $final_screenshots = array(); - if ( isset($final_sections['screenshots']) ) { - preg_match_all('|
    8. (.*?)
    9. |s', $final_sections['screenshots'], $screenshots, PREG_SET_ORDER); - if ( $screenshots ) { - foreach ( (array) $screenshots as $ss ) - $final_screenshots[] = $ss[1]; - } - } - - // Parse the upgrade_notice section specially: - // 1.0 => blah, 1.1 => fnord - $upgrade_notice = array(); - if ( isset($final_sections['upgrade_notice']) ) { - $split = preg_split( '#

      (.*?)

      #', $final_sections['upgrade_notice'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); - if ( count($split) >= 2 ) { - for ( $i = 0; $i < count( $split ); $i += 2 ) { - $upgrade_notice[$this->sanitize_text( $split[$i] )] = substr( $this->sanitize_text( $split[$i + 1] ), 0, 300 ); - } - } - unset( $final_sections['upgrade_notice'] ); - } - - // No description? - // No problem... we'll just fall back to the old style of description - // We'll even let you use markup this time! - $excerpt = false; - if ( !isset($final_sections['description']) ) { - $final_sections = array_merge(array('description' => $this->filter_text( $_short_description[2], true )), $final_sections); - $excerpt = true; - } - - - // dump the non-special sections into $remaining_content - // their order will be determined by their original order in the readme.txt - $remaining_content = ''; - foreach ( $sections as $s_name => $s_data ) { - $remaining_content .= "\n

      {$s_data['title']}

      \n{$s_data['content']}"; - } - $remaining_content = trim($remaining_content); - - - // All done! - // $r['tags'] and $r['contributors'] are simple arrays - // $r['sections'] is an array with named elements - $r = array( - 'name' => $name, - 'tags' => $tags, - 'requires_at_least' => $requires_at_least, - 'tested_up_to' => $tested_up_to, - 'requires_php' => $requires_php, - 'stable_tag' => $stable_tag, - 'contributors' => $contributors, - 'donate_link' => $donate_link, - 'short_description' => $short_description, - 'screenshots' => $final_screenshots, - 'is_excerpt' => $excerpt, - 'is_truncated' => $truncated, - 'sections' => $final_sections, - 'remaining_content' => $remaining_content, - 'upgrade_notice' => $upgrade_notice - ); - - return $r; - } - - function chop_string( $string, $chop ) { // chop a "prefix" from a string: Agressive! uses strstr not 0 === strpos - if ( $_string = strstr($string, $chop) ) { - $_string = substr($_string, strlen($chop)); - return trim($_string); - } else { - return trim($string); - } - } - - function user_sanitize( $text, $strict = false ) { // whitelisted chars - if ( function_exists('user_sanitize') ) // bbPress native - return user_sanitize( $text, $strict ); - - if ( $strict ) { - $text = preg_replace('/[^a-z0-9-]/i', '', $text); - $text = preg_replace('|-+|', '-', $text); - } else { - $text = preg_replace('/[^a-z0-9_-]/i', '', $text); - } - return $text; - } - - function sanitize_text( $text ) { // not fancy - $text = strip_tags($text); - $text = esc_html($text); - $text = trim($text); - return $text; - } - - function filter_text( $text, $markdown = false ) { // fancy, Markdown - $text = trim($text); - - $text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE - - if ( $markdown ) { // Parse markdown. - if ( !class_exists('Parsedown', false) ) { - /** @noinspection PhpIncludeInspection */ - require_once(dirname(__FILE__) . '/Parsedown' . (version_compare(PHP_VERSION, '5.3.0', '>=') ? '' : 'Legacy') . '.php'); - } - $instance = Parsedown::instance(); - $text = $instance->text($text); - } - - $allowed = array( - 'a' => array( - 'href' => array(), - 'title' => array(), - 'rel' => array()), - 'blockquote' => array('cite' => array()), - 'br' => array(), - 'p' => array(), - 'code' => array(), - 'pre' => array(), - 'em' => array(), - 'strong' => array(), - 'ul' => array(), - 'ol' => array(), - 'li' => array(), - 'h3' => array(), - 'h4' => array() - ); - - $text = balanceTags($text); - - $text = wp_kses( $text, $allowed ); - $text = trim($text); - return $text; - } - - function code_trick( $text, $markdown ) { // Don't use bbPress native function - it's incompatible with Markdown - // If doing markdown, first take any user formatted code blocks and turn them into backticks so that - // markdown will preserve things like underscores in code blocks - if ( $markdown ) - $text = preg_replace_callback("!(
      |)(.*?)(
      |)!s", array( __CLASS__,'decodeit'), $text); - - $text = str_replace(array("\r\n", "\r"), "\n", $text); - if ( !$markdown ) { - // This gets the "inline" code blocks, but can't be used with Markdown. - $text = preg_replace_callback("|(`)(.*?)`|", array( __CLASS__, 'encodeit'), $text); - // This gets the "block level" code blocks and converts them to PRE CODE - $text = preg_replace_callback("!(^|\n)`(.*?)`!s", array( __CLASS__, 'encodeit'), $text); - } else { - // Markdown can do inline code, we convert bbPress style block level code to Markdown style - $text = preg_replace_callback("!(^|\n)([ \t]*?)`(.*?)`!s", array( __CLASS__, 'indent'), $text); - } - return $text; - } - - function indent( $matches ) { - $text = $matches[3]; - $text = preg_replace('|^|m', $matches[2] . ' ', $text); - return $matches[1] . $text; - } - - function encodeit( $matches ) { - if ( function_exists('encodeit') ) // bbPress native - return encodeit( $matches ); - - $text = trim($matches[2]); - $text = htmlspecialchars($text, ENT_QUOTES); - $text = str_replace(array("\r\n", "\r"), "\n", $text); - $text = preg_replace("|\n\n\n+|", "\n\n", $text); - $text = str_replace('&lt;', '<', $text); - $text = str_replace('&gt;', '>', $text); - $text = "$text"; - if ( "`" != $matches[1] ) - $text = "
      $text
      "; - return $text; - } - - function decodeit( $matches ) { - if ( function_exists('decodeit') ) // bbPress native - return decodeit( $matches ); - - $text = $matches[2]; - $trans_table = array_flip(get_html_translation_table(HTML_ENTITIES)); - $text = strtr($text, $trans_table); - $text = str_replace('
      ', '', $text); - $text = str_replace('&', '&', $text); - $text = str_replace(''', "'", $text); - if ( '
      ' == $matches[1] )
      -			$text = "\n$text\n";
      -		return "`$text`";
      -	}
      -
      -} // end class
      -
      -endif;
      diff --git a/inc/admin-pages/class-checkout-form-edit-admin-page.php b/inc/admin-pages/class-checkout-form-edit-admin-page.php
      index a953243..68fefd7 100644
      --- a/inc/admin-pages/class-checkout-form-edit-admin-page.php
      +++ b/inc/admin-pages/class-checkout-form-edit-admin-page.php
      @@ -1118,7 +1118,7 @@ class Checkout_Form_Edit_Admin_Page extends Edit_Admin_Page {
       	 */
       	public function get_required_list($field_slug, $field_types): array {
       
      -		$fields = \WP_Ultimo\Dependencies\Arrch\Arrch::find($field_types, array(
      +		$fields = \Arrch\Arrch::find($field_types, array(
       			'sort_key' => 'order',
       			'where'    => array(
       				array('default_fields', '~', $field_slug),
      diff --git a/inc/checkout/class-cart.php b/inc/checkout/class-cart.php
      index cdd27fe..9d05a8a 100644
      --- a/inc/checkout/class-cart.php
      +++ b/inc/checkout/class-cart.php
      @@ -11,7 +11,7 @@ namespace WP_Ultimo\Checkout;
       
       use \WP_Ultimo\Checkout\Line_Item;
       use \WP_Ultimo\Database\Memberships\Membership_Status;
      -use \WP_Ultimo\Dependencies\Arrch\Arrch as Array_Search;
      +use \Arrch\Arrch as Array_Search;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/checkout/class-checkout.php b/inc/checkout/class-checkout.php
      index 0b582ab..2b74f4c 100644
      --- a/inc/checkout/class-checkout.php
      +++ b/inc/checkout/class-checkout.php
      @@ -12,7 +12,7 @@ namespace WP_Ultimo\Checkout;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use \WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use \Psr\Log\LogLevel;
       use \WP_Ultimo\Database\Sites\Site_Type;
       use \WP_Ultimo\Database\Payments\Payment_Status;
       use \WP_Ultimo\Database\Memberships\Membership_Status;
      diff --git a/inc/class-ajax.php b/inc/class-ajax.php
      index 3ac802b..4b81971 100644
      --- a/inc/class-ajax.php
      +++ b/inc/class-ajax.php
      @@ -345,7 +345,7 @@ class Ajax {
       
       		} // end foreach;
       
      -		$_settings = \WP_Ultimo\Dependencies\Arrch\Arrch::find($all_fields, array(
      +		$_settings = \Arrch\Arrch::find($all_fields, array(
       			'sort_key' => 'title',
       			'where'    => array(
       				array('setting_id', '~', trim((string) $query['search'], '*')),
      diff --git a/inc/class-async-calls.php b/inc/class-async-calls.php
      index 151e8fa..7e0f094 100644
      --- a/inc/class-async-calls.php
      +++ b/inc/class-async-calls.php
      @@ -9,14 +9,14 @@
       
       namespace WP_Ultimo;
       
      -use \WP_Ultimo\Dependencies\Amp\Iterator;
      -use \WP_Ultimo\Dependencies\Amp\Sync\LocalSemaphore;
      -use \WP_Ultimo\Dependencies\Amp\Sync\ConcurrentIterator;
      -use \WP_Ultimo\Dependencies\Amp\Http\Client\Request;
      -use \WP_Ultimo\Dependencies\Amp\Http\Client\Connection\DefaultConnectionPool;
      -use \WP_Ultimo\Dependencies\Amp\Socket\ClientTlsContext;
      -use \WP_Ultimo\Dependencies\Amp\Socket\ConnectContext;
      -use \WP_Ultimo\Dependencies\Amp\Http\Client\HttpClientBuilder;
      +use \Amp\Iterator;
      +use \Amp\Sync\LocalSemaphore;
      +use \Amp\Sync\ConcurrentIterator;
      +use \Amp\Http\Client\Request;
      +use \Amp\Http\Client\Connection\DefaultConnectionPool;
      +use \Amp\Socket\ClientTlsContext;
      +use \Amp\Socket\ConnectContext;
      +use \Amp\Http\Client\HttpClientBuilder;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      @@ -137,7 +137,7 @@ class Async_Calls {
       	 * Builds and returns the client that will handle the calls.
       	 *
       	 * @since 2.0.7
      -	 * @return \WP_Ultimo\Dependencies\Amp\Http\Client\HttpClient;
      +	 * @return \Amp\Http\Client\HttpClient;
       	 */
       	public static function get_client() {
       
      @@ -173,7 +173,7 @@ class Async_Calls {
       
       		$urls = self::build_url_list($id, $total, $chunk_size, $args);
       
      -		$coroutine = \WP_Ultimo\Dependencies\Amp\call(static function() use ($id, $total, $chunk_size, $parallel_threads, $client, $urls) {
      +		$coroutine = \Amp\call(static function() use ($id, $total, $chunk_size, $parallel_threads, $client, $urls) {
       
       			$results = array();
       
      @@ -211,7 +211,7 @@ class Async_Calls {
       
       		});
       
      -		$responses = \WP_Ultimo\Dependencies\Amp\Promise\wait($coroutine);
      +		$responses = \Amp\Promise\wait($coroutine);
       
       		return $responses;
       
      diff --git a/inc/class-autoloader.php b/inc/class-autoloader.php
      index d23d387..6413746 100644
      --- a/inc/class-autoloader.php
      +++ b/inc/class-autoloader.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo;
       
      -use WP_Ultimo\Dependencies\Pablo_Pacheco\WP_Namespace_Autoloader\WP_Namespace_Autoloader;
      +use Pablo_Pacheco\WP_Namespace_Autoloader\WP_Namespace_Autoloader;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/class-dashboard-widgets.php b/inc/class-dashboard-widgets.php
      index 83a8b3b..14fe4cd 100644
      --- a/inc/class-dashboard-widgets.php
      +++ b/inc/class-dashboard-widgets.php
      @@ -215,7 +215,7 @@ class Dashboard_Widgets {
       			),
       		);
       
      -		$done = \WP_Ultimo\Dependencies\Arrch\Arrch::find($steps, array(
      +		$done = \Arrch\Arrch::find($steps, array(
       			'where' => array(
       				array('done', true),
       			),
      diff --git a/inc/class-logger.php b/inc/class-logger.php
      index 11eaad1..04180c6 100644
      --- a/inc/class-logger.php
      +++ b/inc/class-logger.php
      @@ -14,8 +14,8 @@ namespace WP_Ultimo;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use WP_Ultimo\Dependencies\Psr\Log\AbstractLogger;
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\AbstractLogger;
      +use Psr\Log\LogLevel;
       
       /**
        * WP Multisite WaaS Logger
      diff --git a/inc/class-session-cookie.php b/inc/class-session-cookie.php
      index 4b49818..2bfd66d 100644
      --- a/inc/class-session-cookie.php
      +++ b/inc/class-session-cookie.php
      @@ -12,7 +12,7 @@
       namespace WP_Ultimo;
       
       use \WP_Ultimo\Contracts\Session;
      -use \WP_Ultimo\Dependencies\Delight\Cookie\Cookie;
      +use \Delight\Cookie\Cookie;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/class-sunrise.php b/inc/class-sunrise.php
      index 8860253..c4c0c26 100644
      --- a/inc/class-sunrise.php
      +++ b/inc/class-sunrise.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/database/engine/class-base.php b/inc/database/engine/class-base.php
      index c822c97..095672b 100644
      --- a/inc/database/engine/class-base.php
      +++ b/inc/database/engine/class-base.php
      @@ -17,7 +17,7 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Base extends \WP_Ultimo\Dependencies\BerlinDB\Database\Base {
      +class Base extends \BerlinDB\Database\Base {
       
       	protected $prefix = 'wu';
       
      diff --git a/inc/database/engine/class-column.php b/inc/database/engine/class-column.php
      index a2b6b18..eed9744 100644
      --- a/inc/database/engine/class-column.php
      +++ b/inc/database/engine/class-column.php
      @@ -17,7 +17,7 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Column extends \WP_Ultimo\Dependencies\BerlinDB\Database\Column {
      +class Column extends \BerlinDB\Database\Column {
       
       	protected $prefix = 'wu';
       
      diff --git a/inc/database/engine/class-compare.php b/inc/database/engine/class-compare.php
      index e7d8049..5cc8bc5 100644
      --- a/inc/database/engine/class-compare.php
      +++ b/inc/database/engine/class-compare.php
      @@ -17,4 +17,4 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Compare extends \WP_Ultimo\Dependencies\BerlinDB\Database\Compare {} // end class Compare;
      +class Compare extends \BerlinDB\Database\Compare {} // end class Compare;
      diff --git a/inc/database/engine/class-date.php b/inc/database/engine/class-date.php
      index 790b4be..8d6d2e2 100644
      --- a/inc/database/engine/class-date.php
      +++ b/inc/database/engine/class-date.php
      @@ -17,4 +17,4 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Date extends \WP_Ultimo\Dependencies\BerlinDB\Database\Date {} // end class Date;
      +class Date extends \BerlinDB\Database\Date {} // end class Date;
      diff --git a/inc/database/engine/class-meta.php b/inc/database/engine/class-meta.php
      index 87f85f5..d071080 100644
      --- a/inc/database/engine/class-meta.php
      +++ b/inc/database/engine/class-meta.php
      @@ -17,4 +17,4 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Meta extends \WP_Ultimo\Dependencies\BerlinDB\Database\Meta {} // end class Meta;
      +class Meta extends \BerlinDB\Database\Meta {} // end class Meta;
      diff --git a/inc/database/engine/class-query.php b/inc/database/engine/class-query.php
      index 5a81310..0b116e3 100644
      --- a/inc/database/engine/class-query.php
      +++ b/inc/database/engine/class-query.php
      @@ -17,7 +17,7 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Query extends \WP_Ultimo\Dependencies\BerlinDB\Database\Query {
      +class Query extends \BerlinDB\Database\Query {
       
        	/**
       	 * The prefix for the custom table.
      diff --git a/inc/database/engine/class-row.php b/inc/database/engine/class-row.php
      index 3062bc6..a164e82 100644
      --- a/inc/database/engine/class-row.php
      +++ b/inc/database/engine/class-row.php
      @@ -17,7 +17,7 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Row extends \WP_Ultimo\Dependencies\BerlinDB\Database\Row {
      +class Row extends \BerlinDB\Database\Row {
       
       	protected $prefix = 'wu';
       
      diff --git a/inc/database/engine/class-schema.php b/inc/database/engine/class-schema.php
      index 67f0d8f..ad3d624 100644
      --- a/inc/database/engine/class-schema.php
      +++ b/inc/database/engine/class-schema.php
      @@ -17,7 +17,7 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -class Schema extends \WP_Ultimo\Dependencies\BerlinDB\Database\Schema {
      +class Schema extends \BerlinDB\Database\Schema {
       
       	protected $prefix = 'wu';
       
      diff --git a/inc/database/engine/class-table.php b/inc/database/engine/class-table.php
      index b3e0f3c..a786381 100644
      --- a/inc/database/engine/class-table.php
      +++ b/inc/database/engine/class-table.php
      @@ -17,7 +17,7 @@ defined('ABSPATH') || exit;
        *
        * @since 1.0.0
        */
      -abstract class Table extends \WP_Ultimo\Dependencies\BerlinDB\Database\Table {
      +abstract class Table extends \BerlinDB\Database\Table {
       
       	/**
       	 * Table prefix.
      diff --git a/inc/deprecated/deprecated.php b/inc/deprecated/deprecated.php
      index 3a70efa..b044355 100644
      --- a/inc/deprecated/deprecated.php
      +++ b/inc/deprecated/deprecated.php
      @@ -655,7 +655,7 @@ class WU_Util {
       	 * @deprecated 2.0.0
       	 *
       	 * @param string $hex Hex code of the color.
      -	 * @return \WP_Ultimo\Dependencies\Mexitek\PHPColors\Color
      +	 * @return \Mexitek\PHPColors\Color
       	 */
       	public static function color($hex) {
       
      diff --git a/inc/domain-mapping/class-helper.php b/inc/domain-mapping/class-helper.php
      index 3c5b230..830b7b6 100644
      --- a/inc/domain-mapping/class-helper.php
      +++ b/inc/domain-mapping/class-helper.php
      @@ -9,8 +9,8 @@
       
       namespace WP_Ultimo\Domain_Mapping;
       
      -use WP_Ultimo\Dependencies\Spatie\SslCertificate\SslCertificate;
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Spatie\SslCertificate\SslCertificate;
      +use Psr\Log\LogLevel;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/duplication/data.php b/inc/duplication/data.php
      index 091d8d9..43171d5 100644
      --- a/inc/duplication/data.php
      +++ b/inc/duplication/data.php
      @@ -1,6 +1,6 @@
        array(
                 array('type', $submittable_field_types),
               ),
      diff --git a/inc/helpers/validation-rules/class-city.php b/inc/helpers/validation-rules/class-city.php
      index 6fa0aff..727066f 100644
      --- a/inc/helpers/validation-rules/class-city.php
      +++ b/inc/helpers/validation-rules/class-city.php
      @@ -12,7 +12,7 @@ namespace WP_Ultimo\Helpers\Validation_Rules;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       /**
        * Validates template sites.
      diff --git a/inc/helpers/validation-rules/class-country.php b/inc/helpers/validation-rules/class-country.php
      index bd6e4b7..96c990b 100644
      --- a/inc/helpers/validation-rules/class-country.php
      +++ b/inc/helpers/validation-rules/class-country.php
      @@ -12,7 +12,7 @@ namespace WP_Ultimo\Helpers\Validation_Rules;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       /**
        * Validates template sites.
      diff --git a/inc/helpers/validation-rules/class-domain.php b/inc/helpers/validation-rules/class-domain.php
      index 6b8acf1..e1e1f6a 100644
      --- a/inc/helpers/validation-rules/class-domain.php
      +++ b/inc/helpers/validation-rules/class-domain.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/helpers/validation-rules/class-exists.php b/inc/helpers/validation-rules/class-exists.php
      index d8a5b55..47cc190 100644
      --- a/inc/helpers/validation-rules/class-exists.php
      +++ b/inc/helpers/validation-rules/class-exists.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/helpers/validation-rules/class-price-variations.php b/inc/helpers/validation-rules/class-price-variations.php
      index b7c9014..d3fb5ab 100644
      --- a/inc/helpers/validation-rules/class-price-variations.php
      +++ b/inc/helpers/validation-rules/class-price-variations.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/helpers/validation-rules/class-products.php b/inc/helpers/validation-rules/class-products.php
      index bd2f5da..8b81b1d 100644
      --- a/inc/helpers/validation-rules/class-products.php
      +++ b/inc/helpers/validation-rules/class-products.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/helpers/validation-rules/class-site-template.php b/inc/helpers/validation-rules/class-site-template.php
      index 9c12954..ac4e1a1 100644
      --- a/inc/helpers/validation-rules/class-site-template.php
      +++ b/inc/helpers/validation-rules/class-site-template.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use \WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use \Rakit\Validation\Rule;
       use \WP_Ultimo\Checkout\Checkout;
       use \WP_Ultimo\Database\Sites\Site_Type;
       
      diff --git a/inc/helpers/validation-rules/class-state.php b/inc/helpers/validation-rules/class-state.php
      index 6a8ef48..a966782 100644
      --- a/inc/helpers/validation-rules/class-state.php
      +++ b/inc/helpers/validation-rules/class-state.php
      @@ -12,7 +12,7 @@ namespace WP_Ultimo\Helpers\Validation_Rules;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       /**
        * Validates template sites.
      diff --git a/inc/helpers/validation-rules/class-unique-site.php b/inc/helpers/validation-rules/class-unique-site.php
      index ef73f7a..c2bd7a4 100644
      --- a/inc/helpers/validation-rules/class-unique-site.php
      +++ b/inc/helpers/validation-rules/class-unique-site.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/helpers/validation-rules/class-unique.php b/inc/helpers/validation-rules/class-unique.php
      index e87f677..4e6193a 100644
      --- a/inc/helpers/validation-rules/class-unique.php
      +++ b/inc/helpers/validation-rules/class-unique.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Helpers\Validation_Rules;
       
      -use WP_Ultimo\Dependencies\Rakit\Validation\Rule;
      +use Rakit\Validation\Rule;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/installers/class-migrator.php b/inc/installers/class-migrator.php
      index e5fa804..f1d68fb 100644
      --- a/inc/installers/class-migrator.php
      +++ b/inc/installers/class-migrator.php
      @@ -9,8 +9,8 @@
       
       namespace WP_Ultimo\Installers;
       
      -use \WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      -use \WP_Ultimo\Dependencies\Ifsnop\Mysqldump\Mysqldump as MySQLDump;
      +use \Psr\Log\LogLevel;
      +use \Ifsnop\Mysqldump\Mysqldump as MySQLDump;
       use \WP_Ultimo\UI\Template_Previewer;
       use \WP_Ultimo\Models\Checkout_Form;
       use \WP_Ultimo\Checkout\Legacy_Checkout;
      diff --git a/inc/integrations/host-providers/class-cloudflare-host-provider.php b/inc/integrations/host-providers/class-cloudflare-host-provider.php
      index 57bc82f..6a03456 100644
      --- a/inc/integrations/host-providers/class-cloudflare-host-provider.php
      +++ b/inc/integrations/host-providers/class-cloudflare-host-provider.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Integrations\Host_Providers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider;
       
       // Exit if accessed directly
      diff --git a/inc/integrations/host-providers/class-cloudways-host-provider.php b/inc/integrations/host-providers/class-cloudways-host-provider.php
      index 44d8214..f0fe640 100644
      --- a/inc/integrations/host-providers/class-cloudways-host-provider.php
      +++ b/inc/integrations/host-providers/class-cloudways-host-provider.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Integrations\Host_Providers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use WP_Ultimo\Domain_Mapping\Helper;
       use WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider;
       
      diff --git a/inc/integrations/host-providers/class-cpanel-host-provider.php b/inc/integrations/host-providers/class-cpanel-host-provider.php
      index 8b4a2b0..3a06b88 100644
      --- a/inc/integrations/host-providers/class-cpanel-host-provider.php
      +++ b/inc/integrations/host-providers/class-cpanel-host-provider.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Integrations\Host_Providers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider;
       use WP_Ultimo\Integrations\Host_Providers\CPanel_API\CPanel_API;
       
      diff --git a/inc/integrations/host-providers/class-runcloud-host-provider.php b/inc/integrations/host-providers/class-runcloud-host-provider.php
      index f6ea43c..2ff6f6e 100644
      --- a/inc/integrations/host-providers/class-runcloud-host-provider.php
      +++ b/inc/integrations/host-providers/class-runcloud-host-provider.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Integrations\Host_Providers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider;
       
       // Exit if accessed directly
      diff --git a/inc/integrations/host-providers/class-serverpilot-host-provider.php b/inc/integrations/host-providers/class-serverpilot-host-provider.php
      index 7ebbad8..ead12eb 100644
      --- a/inc/integrations/host-providers/class-serverpilot-host-provider.php
      +++ b/inc/integrations/host-providers/class-serverpilot-host-provider.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Integrations\Host_Providers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider;
       
       // Exit if accessed directly
      diff --git a/inc/integrations/host-providers/class-wpmudev-host-provider.php b/inc/integrations/host-providers/class-wpmudev-host-provider.php
      index 578c4a9..539196e 100644
      --- a/inc/integrations/host-providers/class-wpmudev-host-provider.php
      +++ b/inc/integrations/host-providers/class-wpmudev-host-provider.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Integrations\Host_Providers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider;
       
       // Exit if accessed directly
      diff --git a/inc/invoices/class-invoice.php b/inc/invoices/class-invoice.php
      index 116c7aa..c54eeda 100644
      --- a/inc/invoices/class-invoice.php
      +++ b/inc/invoices/class-invoice.php
      @@ -12,8 +12,8 @@ namespace WP_Ultimo\Invoices;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use \WP_Ultimo\Dependencies\Mpdf\Mpdf;
      -use \WP_Ultimo\Dependencies\Mpdf\Output\Destination;
      +use \Mpdf\Mpdf;
      +use \Mpdf\Output\Destination;
       
       /**
        * Handles the generation of PDF Invoices.
      diff --git a/inc/limitations/class-limit-plugins.php b/inc/limitations/class-limit-plugins.php
      index 1a808dc..113d0cd 100644
      --- a/inc/limitations/class-limit-plugins.php
      +++ b/inc/limitations/class-limit-plugins.php
      @@ -99,7 +99,7 @@ class Limit_Plugins extends Limit {
       
       		} // end if;
       
      -		$results = \WP_Ultimo\Dependencies\Arrch\Arrch::find((array) $this->get_limit(), array(
      +		$results = \Arrch\Arrch::find((array) $this->get_limit(), array(
       			'where' => $search_params,
       		));
       
      diff --git a/inc/managers/class-domain-manager.php b/inc/managers/class-domain-manager.php
      index 5cd3e44..b2a7f21 100644
      --- a/inc/managers/class-domain-manager.php
      +++ b/inc/managers/class-domain-manager.php
      @@ -607,11 +607,11 @@ class Domain_Manager extends Base_Manager {
       
       		foreach ($record_types as $record_type) {
       
      -			$chain = new \WP_Ultimo\Dependencies\RemotelyLiving\PHPDNS\Resolvers\Chain(
      -				new \WP_Ultimo\Dependencies\RemotelyLiving\PHPDNS\Resolvers\CloudFlare(),
      -				new \WP_Ultimo\Dependencies\RemotelyLiving\PHPDNS\Resolvers\GoogleDNS(),
      -				new \WP_Ultimo\Dependencies\RemotelyLiving\PHPDNS\Resolvers\LocalSystem(),
      -				new \WP_Ultimo\Dependencies\RemotelyLiving\PHPDNS\Resolvers\Dig(),
      +			$chain = new \RemotelyLiving\PHPDNS\Resolvers\Chain(
      +				new \RemotelyLiving\PHPDNS\Resolvers\CloudFlare(),
      +				new \RemotelyLiving\PHPDNS\Resolvers\GoogleDNS(),
      +				new \RemotelyLiving\PHPDNS\Resolvers\LocalSystem(),
      +				new \RemotelyLiving\PHPDNS\Resolvers\Dig(),
       			);
       
       			$records = $chain->getRecords($domain, $record_type);
      diff --git a/inc/managers/class-email-manager.php b/inc/managers/class-email-manager.php
      index b78859b..fc8634a 100644
      --- a/inc/managers/class-email-manager.php
      +++ b/inc/managers/class-email-manager.php
      @@ -11,7 +11,7 @@
       
       namespace WP_Ultimo\Managers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use \WP_Ultimo\Managers\Base_Manager;
       use \WP_Ultimo\Models\Email;
       use \WP_Ultimo\Helpers\Sender;
      diff --git a/inc/managers/class-gateway-manager.php b/inc/managers/class-gateway-manager.php
      index 37062e3..03ff24f 100644
      --- a/inc/managers/class-gateway-manager.php
      +++ b/inc/managers/class-gateway-manager.php
      @@ -11,7 +11,7 @@
       
       namespace WP_Ultimo\Managers;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use \WP_Ultimo\Managers\Base_Manager;
       use \WP_Ultimo\Gateways\Ignorable_Exception;
       
      diff --git a/inc/managers/class-limitation-manager.php b/inc/managers/class-limitation-manager.php
      index 5ca73bc..6572b5f 100644
      --- a/inc/managers/class-limitation-manager.php
      +++ b/inc/managers/class-limitation-manager.php
      @@ -14,7 +14,7 @@ namespace WP_Ultimo\Managers;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use \WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use \Psr\Log\LogLevel;
       use \WP_Ultimo\Objects\Limitations;
       use \WP_Ultimo\Database\Sites\Site_Type;
       
      diff --git a/inc/managers/class-membership-manager.php b/inc/managers/class-membership-manager.php
      index 0fcb8a5..5712456 100644
      --- a/inc/managers/class-membership-manager.php
      +++ b/inc/managers/class-membership-manager.php
      @@ -11,7 +11,7 @@
       
       namespace WP_Ultimo\Managers;
       
      -use \WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use \Psr\Log\LogLevel;
       use \WP_Ultimo\Managers\Base_Manager;
       use \WP_Ultimo\Database\Memberships\Membership_Status;
       
      diff --git a/inc/models/class-checkout-form.php b/inc/models/class-checkout-form.php
      index f9bef98..8be1a51 100644
      --- a/inc/models/class-checkout-form.php
      +++ b/inc/models/class-checkout-form.php
      @@ -10,7 +10,7 @@
       namespace WP_Ultimo\Models;
       
       use \WP_Ultimo\Models\Base_Model;
      -use \WP_Ultimo\Dependencies\Arrch\Arrch as Array_Search;
      +use \Arrch\Arrch as Array_Search;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      diff --git a/inc/models/class-site.php b/inc/models/class-site.php
      index 8f9906d..c7128e6 100644
      --- a/inc/models/class-site.php
      +++ b/inc/models/class-site.php
      @@ -9,7 +9,7 @@
       
       namespace WP_Ultimo\Models;
       
      -use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
      +use Psr\Log\LogLevel;
       use \WP_Ultimo\Models\Base_Model;
       use \WP_Ultimo\Objects\Limitations;
       use \WP_Ultimo\Database\Sites\Site_Type;
      diff --git a/inc/sso/auth-functions.php b/inc/sso/auth-functions.php
      index 28f2a39..f2b1fbd 100644
      --- a/inc/sso/auth-functions.php
      +++ b/inc/sso/auth-functions.php
      @@ -16,7 +16,7 @@
        * @subpackage SSO
        */
       
      -use \WP_Ultimo\Dependencies\Delight\Cookie\Cookie;
      +use \Delight\Cookie\Cookie;
       
       // phpcs:disable
       
      diff --git a/inc/sso/class-sso-broker.php b/inc/sso/class-sso-broker.php
      index aa04e90..6fe4237 100644
      --- a/inc/sso/class-sso-broker.php
      +++ b/inc/sso/class-sso-broker.php
      @@ -15,7 +15,7 @@ namespace WP_Ultimo\SSO;
       // Exit if accessed directly
       defined('ABSPATH') || exit;
       
      -use \WP_Ultimo\Dependencies\Jasny\SSO\Broker\Broker;
      +use \Jasny\SSO\Broker\Broker;
       
       /**
        * The SSO Broker implementation.
      diff --git a/inc/sso/class-sso-session-handler.php b/inc/sso/class-sso-session-handler.php
      index 6d1decf..a22e7f7 100644
      --- a/inc/sso/class-sso-session-handler.php
      +++ b/inc/sso/class-sso-session-handler.php
      @@ -14,8 +14,8 @@
       
       namespace WP_Ultimo\SSO;
       
      -use \WP_Ultimo\Dependencies\Jasny\SSO\Server\SessionInterface;
      -use \WP_Ultimo\Dependencies\Jasny\SSO\ServerException;
      +use \Jasny\SSO\Server\SessionInterface;
      +use \Jasny\SSO\ServerException;
       use \WP_Ultimo\SSO\Exception\SSO_Session_Exception;
       
       // Exit if accessed directly
      diff --git a/inc/sso/class-sso.php b/inc/sso/class-sso.php
      index 2b392e0..6518ed4 100644
      --- a/inc/sso/class-sso.php
      +++ b/inc/sso/class-sso.php
      @@ -16,13 +16,13 @@
       namespace WP_Ultimo\SSO;
       
       use \WP_Ultimo\Helpers\Hash;
      -use \WP_Ultimo\Dependencies\Jasny\SSO\Server\Server;
      -use \WP_Ultimo\Dependencies\Jasny\SSO\Server\ServerException;
      -use \WP_Ultimo\Dependencies\Jasny\SSO\Server\BrokerException;
      -use \WP_Ultimo\Dependencies\Jasny\SSO\Broker\NotAttachedException;
      -use \WP_Ultimo\Dependencies\Nyholm\Psr7\Factory\Psr17Factory;
      -use \WP_Ultimo\Dependencies\Symfony\Component\Cache\Adapter\FilesystemAdapter;
      -use \WP_Ultimo\Dependencies\Symfony\Component\Cache\Psr16Cache;
      +use \Jasny\SSO\Server\Server;
      +use \Jasny\SSO\Server\ServerException;
      +use \Jasny\SSO\Server\BrokerException;
      +use \Jasny\SSO\Broker\NotAttachedException;
      +use \Nyholm\Psr7\Factory\Psr17Factory;
      +use \Symfony\Component\Cache\Adapter\FilesystemAdapter;
      +use \Symfony\Component\Cache\Psr16Cache;
       
       // Exit if accessed directly
       defined('ABSPATH') || exit;
      @@ -992,7 +992,7 @@ class SSO {
       	 * Returns a PSR16-compatible cache implementation.
       	 *
       	 * @since 2.0.11
      -	 * @return WP_Ultimo\Dependencies\Psr\SimpleCache\CacheInterface
      +	 * @return Psr\SimpleCache\CacheInterface
       	 */
       	public function cache() {
       
      diff --git a/inc/tax/class-tax.php b/inc/tax/class-tax.php
      index 92aecdc..94028f2 100644
      --- a/inc/tax/class-tax.php
      +++ b/inc/tax/class-tax.php
      @@ -74,7 +74,7 @@ class Tax {
       
       				if (!empty($s)) {
       
      -					$filtered = \WP_Ultimo\Dependencies\Arrch\Arrch::find($results, array(
      +					$filtered = \Arrch\Arrch::find($results, array(
       						'sort_key' => 'name',
       						'where'    => array(
       							array(array('slug', 'name'), '~', $s),
      diff --git a/inc/ui/class-checkout-element.php b/inc/ui/class-checkout-element.php
      index 34e51f6..cb2bc8e 100644
      --- a/inc/ui/class-checkout-element.php
      +++ b/inc/ui/class-checkout-element.php
      @@ -10,7 +10,7 @@
       namespace WP_Ultimo\UI;
       
       use \WP_Ultimo\UI\Base_Element;
      -use \WP_Ultimo\Dependencies\ScssPhp\ScssPhp\Compiler;
      +use \ScssPhp\ScssPhp\Compiler;
       use \WP_Ultimo\Database\Memberships\Membership_Status;
       
       // Exit if accessed directly
      diff --git a/inc/ui/class-template-switching-element.php b/inc/ui/class-template-switching-element.php
      index b9d3ed8..8eb0548 100644
      --- a/inc/ui/class-template-switching-element.php
      +++ b/inc/ui/class-template-switching-element.php
      @@ -46,7 +46,7 @@ class Template_Switching_Element extends Base_Element {
       	 * The membership object.
       	 *
       	 * @since 2.2.0
      -	 * @var \WP_Ultimo\Membership
      +	 * @var \WP_Ultimo\Models\Membership
       	 */
       	protected $membership;
       
      diff --git a/patches/berlindb-core-src-database-column-php.patch b/patches/berlindb-core-src-database-column-php.patch
      new file mode 100644
      index 0000000..e78a555
      --- /dev/null
      +++ b/patches/berlindb-core-src-database-column-php.patch
      @@ -0,0 +1,26 @@
      +--- /dev/null
      ++++ ../src/Database/Column.php
      +@@ -506,10 +506,10 @@
      + 			'binary'        => 'wp_validate_boolean',
      + 			'allow_null'    => 'wp_validate_boolean',
      + 			'default'       => array( $this, 'sanitize_default' ),
      +-			'extra'         => 'wp_kses_data',
      +-			'encoding'      => 'wp_kses_data',
      +-			'collation'     => 'wp_kses_data',
      +-			'comment'       => 'wp_kses_data',
      ++			'extra'         => 'wu_kses_data',
      ++			'encoding'      => 'wu_kses_data',
      ++			'collation'     => 'wu_kses_data',
      ++			'comment'       => 'wu_kses_data',
      + 
      + 			'primary'       => 'wp_validate_boolean',
      + 			'created'       => 'wp_validate_boolean',
      +@@ -675,7 +675,7 @@
      + 
      + 		// String
      + 		} elseif ( is_string( $default ) ) {
      +-			return wp_kses_data( $default );
      ++			return wu_kses_data( $default );
      + 
      + 		// Integer
      + 		} elseif ( $this->is_numeric() ) {
      diff --git a/patches/berlindb-core-src-database-query-php.patch b/patches/berlindb-core-src-database-query-php.patch
      new file mode 100644
      index 0000000..65963c3
      --- /dev/null
      +++ b/patches/berlindb-core-src-database-query-php.patch
      @@ -0,0 +1,11 @@
      +--- /dev/null
      ++++ ../src/Database/Query.php
      +@@ -2169,7 +2169,7 @@
      + 			$caps = $this->get_column_field( array( 'name' => $key ), 'caps' );
      + 
      + 			// Unset if not explicitly allowed
      +-			if ( empty( $caps[ $method ] ) || ! current_user_can( $caps[ $method ] ) ) {
      ++			if ( empty( $caps[ $method ] ) ) {
      + 				if ( is_array( $item ) ) {
      + 					unset( $item[ $key ] );
      + 				} elseif ( is_object( $item ) ) {
      diff --git a/patches/jasny-sso-src-broker-cookies-php.patch b/patches/jasny-sso-src-broker-cookies-php.patch
      new file mode 100644
      index 0000000..0dbb695
      --- /dev/null
      +++ b/patches/jasny-sso-src-broker-cookies-php.patch
      @@ -0,0 +1,32 @@
      +--- /dev/null
      ++++ ../src/Broker/Cookies.php
      +@@ -43,7 +43,8 @@
      +     /**
      +      * @inheritDoc
      +      */
      +-    public function offsetSet($name, $value)
      ++	#[\ReturnTypeWillChange]
      ++	public function offsetSet($name, $value)
      +     {
      +         $success = setcookie($name, $value, time() + $this->ttl, $this->path, $this->domain, $this->secure, true);
      + 
      +@@ -66,7 +67,8 @@
      +     /**
      +      * @inheritDoc
      +      */
      +-    public function offsetGet($name)
      ++	#[\ReturnTypeWillChange]
      ++	public function offsetGet($name)
      +     {
      +         return $_COOKIE[$name] ?? null;
      +     }
      +@@ -74,7 +76,8 @@
      +     /**
      +      * @inheritDoc
      +      */
      +-    public function offsetExists($name)
      ++	#[\ReturnTypeWillChange]
      ++	public function offsetExists($name)
      +     {
      +         return isset($_COOKIE[$name]);
      +     }
      diff --git a/wp-multisite-waas.php b/wp-multisite-waas.php
      index fff4950..a9878ec 100644
      --- a/wp-multisite-waas.php
      +++ b/wp-multisite-waas.php
      @@ -60,6 +60,8 @@ if (!defined('WP_ULTIMO_PLUGIN_FILE')) {
        */
       require_once __DIR__ . '/constants.php';
       
      +require_once __DIR__ . '/vendor/autoload_packages.php';
      +
       require_once __DIR__ . '/autoload.php';
       
       require_once __DIR__ . '/inc/class-autoloader.php';
      

      O1J85T0hWiirRcwTK- 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¿v-JF@= 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%0D030-QWxW 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%0DF#_XM^?;K#X+Psj!*8a8XBr}2<}X! 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 z0ZA2*Q~^m9kW>Ll6_8W`NfnS(0ZA2*Q~^m9kW>Ll6_8W`NfnS(0ZA2*Q~^m9kW>Ll z6_8W`NfnS(0ZA2*Q~^m9kW>Ll6_8W`NfnS(0ZA2*Q~^m9kW>Ll6_8W`NfnS(0ZA2* zQ~^m9kW>Ll6_8W`NfnS(0ZA2*Q~^m9kW>Ll6_8W`NfnS(0ZA2*Q~^m9kW>Ll6_8W` zNfnS(0ZA2*Q~^m9kW>M4s(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`GeqzXu? zfTRjYs(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO z3P`GeqzXu?fTRjYs(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`GeqzXu?fTRjY zs(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`Ge zqzXu?fTRjYs(_>lNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`GeqzXu?fTRjYs(_>l zNUDIO3P`GeqzXu?fTRjYs(_>lNUDIO3P`GuqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@ zkfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f z3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJp zs*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4Mv zqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1# zNve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@ zkfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f z3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJp zs*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4Mv zqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1#Nve>f3Q4MvqzXx@kfaJps*t1# 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�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

    10. 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 z`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=P zqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o* zA^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+} z6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=d zKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM z`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=P zqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o* zA^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=dKOy=PqCX+} z6QVyM`V*o*A^H=dKOy=PqCX+}6QVyM`V*o*A^H=cKN0#9p+6D&6QMs5`V*l)5&9FM zKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5 z`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9 zp+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l) z5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D& z6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FM zKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5 z`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9 zp+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l) z5&9FMKN0#9p+6D&6QMs5`V*l)5&9FMKN0#9p+6D&6QMs5`V*l)5&E;uZ>wx?{3EUG zZEyTz@NHU=*xvZ>z@G;HN9CE@8`rgWuq~xB-T-fc-XqvXqqe0>e)XN8*QK{np>3(q zncD9K-^Z&duO5OKcmy8vi8Vg)_dw67x1~!)*OqKcmyDiYZ%dc_iQYHdmi`#MFS9NE zF}gBvTl!=4`p-7{vyJ|2qd(iyAHV7flWpmbuh|C&pm%Dvr9VdR32sY&j1%x2^sdde z^vCF0!ENb}(R(-B=+8F#vyJ|2qd(gy&$bjs=SX3U-pkvT!WjL_o!h9&Hor=;jkav_ zt0dbf%r?JDvW?Dc7kUP2Zzq*b7Y#015tlOy2cESI}x{VfX z7ycXC-rd_S_}^K#`4yAx!atzxoxbhDKlJEGuQZy4e@y#r^b@ueewH>oVUKTHO69xw zAn4WU?LrYOal|Vs+tMhXQ{lMx?6wOr?F97x-F5-C6ugVKU4Si8Grt#Bpk~|Jt@Eqi zr`wjM8NK7PEj9C*jBkOFW%q4c%I0&t*S1YPz;@x1PxLDHwp7lqE_knZ*|w!}M%Myu zOWBOxY2Ds*MdJ3RcUpJw@g0182Or;&gWuQjfBy30!e65O%iue~cZ05k-%+IaOjpA1 zC{m2Bgx|q=cW~YvoOcK3-NAWxaNZr9cL(R)!FhLZ-W{BGN6hz?U5U3N<{Mp!wNF=9R`B z@j-~Y?ci=ZxZ4iywu8Iv;BGs(+YauwgIn$3Ry*=0U*X?@p8>sgy(4eZr^uU(u4CVk zHyK^Wz9Vlkx{iHE-ehzg`;NTH_=2y1%k1DXJGjgaF0+Hn?BFsxxXcbNvxCd*;4(Y7 z%nmNIgUjsTGCOh^U0*I^bdCB)#qhT9J^I9tqHG_P7OAZfG=3QLdibt<#OVEnU7}-` z{pDTumv@PjUG|rEH{Q-U-gnp~@7*Qi-6hxEC0=$FFJING?*)IAGv7!1{j|NdybJ$# z;r}lD--Z9X;=kY90nOfB*t-jRcVX`?zb&`B;T7gxGREDF`?SsK-3{+h?~*<4^2>9( z{PNr``_#MaQ}2>h?vhpRl2z`KJ?@e{?vg$3!th;bvaTjIHk#qPQd;#;3^)EXNB$}J zGvNOK@;ur5-X%ZWB`4e!+x@PHbIkT#7`_X`cgg5>3y#)ZG1+H+(`~Y~-B((vcByvW zrP_IyOl+4-Y?n-ImrQJzOl+4-Y?n-ImrQIIZtueFT{5vo=Zxe$yW~8(tD-7Rqbss1s?s$6L-|5w@p16upewQ}%BhUbsVY=tRmiL= zWL6b2s|uM_h0Ll#W>q1xs*qV#$gC=4RuyJ;6~&kD*EKK|Rz-6? zxBmci##Nyrt3uvYp(3k7_En)Gt3nP|AqT6-n|!`=unIX?g&eFx4pt!tt5A_ukwf{j zT#;2#q`U2ktcv2@ZC7Mf6!mU_;;WRAf~OaFvRz z3KdxuesiuuE>|hIBCA41SCOi_U80}A<5-Z|_=qdADpX`usK~02<5ddI?kWXmbQN;B z3KdxuDzYld==@$+WL1>cxeYVr)II_;smQ8OkyRnnt5A_uA>XS|kyVkt`FvMoRjA0S zCimVD1SrzibigePiI!mljkyTMX;3LitD+TYwRjA0S zC|C3m=ZY07vMN+$Rrt-h3fW_YimVDbWM$J8Srsa>D#{=9F7n9=`DBHBvVwwDP^~@r z=8J_rR)qF&%sm`)Ps-EOapymKIOZNMxrf5+p)h-B%N`Y3dqm|PQMspxSn6G_$l7CW zvM2t#{dKNp*W1JI_7oBR6#LyCPPd2C?csELINcts+k1rA&eHI?HCl69vzN34jB5RL|tUY{W4QS;{q`*5aR+dE)e4aF)k3}0x>QS;{q`* z5aR+dE)X*#j&Xq)7l?6zSlP?65Hm(GV-({8F(Vb@0x>QS;{q`*5aR+dE)e4aF)k3} z0x`cl8sh>nE)e4aF~2+-;{q`*5aR+dE)e4av1ZnD^~Wv{;{q`*5aR+dE)e4aF)k3} z0x>QS;{q`*5aR+dE)e4aF?@^RTZ{|DxIl~x#JE6=3&glUj0?n?kGLm)2zvG%;{q`* z5aR+dE)e4aF)k3}0x>QS;{q`*5aR+dE)e4aF)k3}0x>QS;{q`*5aR+dE)e4aF)k3} z0x>QS;{q`*5aR+dE)e4aF)k3}0x>QS;{q`*5aR+dE)e4aF)k3}0x>QS;{q`*5aR+d zE)XlD*3-ZRVq74`1!7zv#sy+rASNDT;xWbrVq74`1!7zv#sy+rAjSn^Tp-2;Vq74` z1!7zv#sy+rAjSn^Tp%X8_IQ#|8Frfqh(H9~aoi1@>`)eOzE4h1o}8_R*GoTwtH5+$Spcae;kY zU>_IQ#|8Frfqmva`?$b9F0hXa?BfFaxWGOxu#XGu!@7M~w~q_#;{yA*z&`)eOzE47ud%I_HluITwos;*vAF-ae;kYU>_IQ#|8Frfqh(H9~aoi z1@>`)eOw^H1rl5!!37drAi)I^Tp+;(5?mm`1rl5!!37drAi)I^Tp+;(5?mm`1rl5! z!37drAi)I^Tp(eL62>UO1rkOo!37drAi)I^Tp+;(5?mm`1rl5!!37drAi)I^Tp+;( z5?mm`1rl5!!37drAi)I^Tp+;(5?mm`1rl5!!37drAi)I^Tp+;(5?mm`1rl5!!37dr zAc1cQd`obF1Q$qffdm&waDfCDNN|A!7f5h{gt6xWEA}aDWROpfCq0%mLbRfD0TDl?O!S0WNTW3mo7A2e`liE^vSg9N+>6xWEA} zaDWRO-~tD@zyU6B0P7B5-2pCefD0Vp0tfKq02esG1rBh516<$$7dXHL4sd}3T;Ko~ zIKTxCaDf9{-~bmmzy%I)fdgFN02esG1rBh516<$$7dXHL4sd}K7f5k|6cTTp+~-Qd}U#1yWof z#RXDaAjJjr%XFG?q_{we3#7O}iVLK;K#B{bxIjvDr?^0h3#7O}iVLK;K#B{bxIl^v zq_{we3#7O}iVLK;K#B{bxIl^vq_{we3#7O}iVLK;K#B{bxIl^vq_{we3#7O}iVLK; zK#B{bxIl^vq_{we3#7O}iVLK;K#B{bxIl^vq_{we3#7O}iVLK;K#B{bxIl^vq_{we z3#7O}iVLK;K#B{bxIl^vq_{we3#7QfAue!;3moDChq%BYE^vqo9O43pxWFL_bBMwm zqAiEGz#&n2NK_u;0*AQ3Aue!;3moDChq%BYE^vqo9O43pxWFMUaEJ>W;sS@T?hw`; z;sS@bz#%Sh2u}`ifkRy25EnSa1rBk6LtNkx7dXTP4sn4)T;LEFIK%}Gae+fz;1Cx$ z#03sV07feaVOaDfaL$Z&xS7szmd3>V07feaVO zaDfaL$Z&xS7szmd3>V07feaVOaDfaL$QYxHG0Jd(jFHN4feaVOaDfaL$Z&xS7szmd z3>V07feaVOaDfaL$Z&xS7szmd3>V07feaVOaDfaL$Z&xS7szmd3>V07feaVOaDfaL z$Z&xS7szmd3>V07feaVO;9CaYGF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2 zAj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T z1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2Aj1VR zTp+^*GF%|T1u|S9!v!*2AR`_#;xWSoGF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9 z!v!*2Aj1VRTp%O5Gh86U1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^* zGF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2 zAj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T1u|S9!v!*2Aj1VRTp+^*GF%|T z1u|UV2p2fQ1&(lmBV6DJ7dXNNj&Ok^T;K?WIYMEM(3T@y;E1R^A}Wt?fg@bt2p2fQ z1&(lmBV6DJ7dXNNj&Ok^T;K>7IKl;vaDgLOcLeK>aDgLS;0PBuf+t6~z!5HRgbN(u z0!O&O5iW3q3moABN4UTdE^vek9N_{-xWExEaD)pS;Q~jvz!5HRgbN(u0!O&O5iW3q z3moft-Y*=Z;m3NaZvQjT-+w>WQ+-_M-IimX>an!l?RS8#?KzgJ8(q(Htf&1|q3aWl zrRP54`h;WYx!bN!IF?QtU7vF-oiw^W=U5}+GhLr>tP$}M@7Et|M2uepy;F0{h#XU& zaLl+IYh2t<@7EktpK#3R95Xt{jLtEmb1XH}IZ`v@E5O%*kARPYuE05#wisQXa4c;x zx<27pBWrYh!m%{O==y|XDp!v+;%;;A)F&J>?#CK;zsvOr#~OX3D{ziA`fmFhH^*?` zSRC+~-}I5qt48s`=o+eH@xl1pAXlS4;h6e_W9k!*sZThjKH-@9gk$(~41bQPPdKJN z;h6e_V=+pfC`K7wpKvTj8C{=nEJhh!pKvTj8C{=nEJhh!pKweq=rQ#P$Ksfdi(^LD zCmd6sa7+{*Q=f25eZnyjT~&@TFH|>NlUb!Ev%2A$%qlgR)eYBVR+W3)7hdPgp961z zH$m5AR>?i8>5PRrIZjzE#n; zD*9H%->W!y74NR%+Ex6zDtFfB%ANJ}bvr0{771yp(lUc>PtJGvxaqucNnN@teN=;@JH?LBYS;f<<)MQo_i5f?0GOLP5 z_sun#RcbP;ia{UwpTG}*9|T>KSuMCGv#NOXIj+g9;>*>7Yci|2bG6`_%xb|knN^&+ zT7WJ1b+rIn(tGH@auIl%?CbKGU zHG0pzDnIr4-e<4ko>hFaidRQ;le<5luCssYW!_h^89RR3n;dJx-s>JZ znrcK-jcBS7O*NvaMl{ukrW(;yBbsVNQ;le<5luCssYW!_h^89RR3n;dWVSV;sYW!_ zh^89RR3n;dL{p7usu4{!qNzqS)rh7V(NrUvYD80wXsQuSHKM6TG}VZvj}rwS7xV8I zKF;`lTqB~k#=`hv@LAyrF?FJtTB_~empD;O8E=BlsZPkFPROH96j?rEPe0kPr=Jib zC&b7JF>*qToDd@?#K;LTa-taV`JV(&LH|0$2{qCuiXFE<3w{oCj&Y*cG5XgbPKb*W z;^Kt3I8j{q_y~Lo9D@_k-@HCiTo|7LzYJc0fBOW!PTM)y3E9^P+1Cl#*9qCziK0WV zDmsk*hV_Y}!}xm8b>7Qo+s7LC*)KoVxV9BAh-*D473`bz@HOw#_c9(?L84& zjNA)Z)`|GwBUaZF@xizPzikvBg!&eb(f>1fqU_7~ZqT{z36;+$R6d_j`Fuj<^9hyD zCsaP4Q2Bg9wetzp&L{dNj^E2z=-V`IzW}}nz6Aai_&4Bpj8rwBP}O`wRr3i|%_mef zpHS6&LRIq#Rm~?aDuwC*bxc;Pxlr_9x)>C*bxc;PxjJ zJNFB9xLt?ab+}!J+jY2IXTDH}+jY2Ihud|yU5DFsxLt?ab+}!J+jY2Ihud|yU5DFs zxLv3IzfS#s9d6g*b{%fl%nLFzZr9;<9d6g*b{%fl;dUKv*9+!$ z9d6g*b{%fl;dUKv*Qx5S!|giUuEXs*+^)mzI^3?q?K<49!|giUuEXs*+^)mzy1o~t z&(-(BjOKP--wQLE+jY2Ihud|yU5DFsxLt?ab+}!J+jY2Ihud|yU5DFsxLt?ar(*1~ za0+8j#n?-={U0W$Vyw~gg;V%{Dz5s7XR@batlL)OQ^m!LLjQ96sd#Jjf0&$#x5kfy z{=KzR@z&`7FgX=(js6dlQ}Nd5|L8asZ;k#BlT-25=>IS|6>p9H50g{z*4OES1JM6r zaw^^${U0W$;;qsD>2WIF8vP$8r{b;A|6y_}-WvTMCa2^or{pT94VYiJr#R>zW>AIRJ=8Qi1+$GOiraCM*oM& zDc{OG6_fogo*^!ODn9#F|A)z`X2flw>m*ObZKMCg zlT&e9C~gb+_T?$uK84$-aQjr;_N)F6lT&fq=>IS|6}OH450g`I+vxu=Ic3&-%B=Ym zo}a?=Q+R#~&rkVA^Zg$tr+okMlITg>1{tuH= z@!aVDFgX>^js6dlQ}NvB|1dcf&yD^MlT-2hvhV~PegX}Df-!vp4Sxa+e*z7E0u65{ z7VZ}stn)Nj=V_qZ4OY(@y3XTz)mqd*!yBygG+5_p5FHKHc^b<9eU8_88m#j)Sm$Z5 z&eLF>r@=Z;L;1PS^g2&N`MJ^SJPp=)8p_Xog+J%W9JC`h#80F3wy|MHZm`bNV4bI- zdvrgYV>DRjX`sdp)VP5fH&EjS>pTtCc^a(qG_?M#cWM3E_$c_J;E#hp3H}u5b)E+6 zJPp=)8m#j)Sm$Z5&eIV8eI4tz{u2f?^Bc;9{a&xkG+5_pu+Gz9ou|P%PXm>16ui#U zD16grvd+^GW7TGzr@=Z;gLR$;-$QAz&eLF>r@=Z;gLR$;>pTtCc^WXb0b?7i^E6oJ zX|T@IV4bJII!}Xjo(AhY4c2)Ytn)Nj=V`Fc(_o#a!8%Wab)E+6JPp=)8m#j)Sm$Z5 z&eLF>r@=Z;gLR$;>pTtCc|HYKKLuAm1y?@>S3d<;KLuAm1y`GJwFy_7aJ30nn{c%W zSDSFP30IqNwFy_7aJ30nn{c%WSDSFP30IqNwFy_7aJ30nn{c%WSDSFP30IqNwFy_7 z($f2dCTo&SxY~rPO}N^Gt4+AtgsV-s+Jvi3xY~rPO}N^Gt4+AtgsV-s+Jvi3xY~rP zP0jW6xvWVxS(9wCCfQ_7vI$q4aJ30nn{ZYCj?BBv)h1kR!qp}!tzSSC1DkNQ30IqN zwFy_7aJ30nn{c%WSDSFP30IqNwFy_7aJ30nn{c%WSDSFP30IqNwFy_7aJ30nn{c%W zSDSFP30IqNwFy_7aJ30nn{c%WSDSFP30IqNwFy_7aJ30nn{c%WSDSFP30IqNwFy_7 zaJ30nKMhwu4Oc%6S3eC`KMhwu4Oc%6S3k#@pX1EWapvbZ^K+c}InMkXXST?qTjV4y zvgj6Bbc-yy1;bmgx&^CSWYI0M=oUFii!8cD7TqF?ZjnW|$f8?h(Jiv*7Fl$QEV@M& z-6D%_kwv%2qFZFqEwbnqS#*mmxnx5zYFWEw3pjTTvSi!8cD7TqF?ZjnW|$f8?h(Jiv*7THCM?4m_> z(IUHOkwv%2qFZFqEwbnqS#*mmxpwzb3Vbf;KwbMu*#CuU~y9 z_%5#Y9?<`q)ZXyFCbhMvZ}h(=wY8^j^uH#xwWn`%?%gK$Zj*br$-Ud;-fgknuR8Z` zi|zibPjmgx(Ecpw-$rPQ+eZI3LR;K6`oDYHp#de?R?_#uB zCv3A$*cRJ;#NWbei|xi|K>rd#TWmM_J5z1>g`bT7HK{GXFn$g6x9!?!ejCkiqxo&^ zs_U7H|9Y?ZZ}cxDw8ej;vzIoG(8dwkiU=S7e(;Upo4_}7<`08j18-|bTc57IY@^r1 z+lmh3hdIZ&ihk$7_pTK@-Mga3uliq;+S-*iI&W`lSK4i7?``>oujYSEYAc$2zE`~4 z@(v$y?$_47v(I-X-&TD2Ri3*$bmbjUh7WE~x{jt*Hz zhpeMR*3lvB=#X`E$T~V?9UZcc4p~QstfPaLcE~z9WE~x{jt*Hz2aWBJb#zeL4ocfW zX*(!w2L^UvULWstfNEL(IM;Tkacv(Iyz(>9kPxNSx1MgqeIrwAw%w< z$sMwe4p~QstfNEL(IM;Tkacv(Iy!Kmg93NRIyz(>9kPxNSx1MgqeIrwA?xUnb#%x& zI%FLkvW^Z}M~AGVL)OtD>*$bmbjUh7WE~x{jt*HzhpeMR*3lvB=#X`E$T~V?9UZcc z4p~QstfNEL(IM;Tkacv(Iyz(>9kPxNSx1MgqeIrwA?xUnb#&Rg>27!@w9DR2cf&iO zUG{Fe?A>(9BD&)0T*s}(UDUXX8h6FprH=U9*rpw+WT2mR~BUG{Fe?A>(5e4l?N1?ZB2bjd)vXmS@#?xM+EG`Wi=chTf7n%qT` zyX@U`(c~_g+*LIBv-}OvF6$v(MU&gs9TjzW$&iT-c6Uin=X4dUG{Fe?A>(P zyXmrb(`E0b%ic|wy_+t3H(mB_y6oL_*}Lhochgl2x>t6AF3R6U`Mc6R_r!ZQUB#nc z^-gFPj@ zF3R6U`MW6p8G3%E82MJ=Ofh1-3A)PVOxo@vzX19>#b?rXA9*|YOQ2T;&lEvE?(F4^ z2s%>){e{~8)tWO!kg?7=p9D|AC%^{S1V00Q7W^F80zVJ_KIphOBQDP52yXjVyU!FC z{uKXq&6%RW{TYEzfn#t2o`X~H8Su;C1?XRQIm1)V@RTz=dh<|8~Gy#7r7;v-)Lmmqg7 z$8k@-?IYrq5XU*gan5j@Gv)R^{$B8X;IDzd4&DNP1N=?U``u?a&YAp0*O$K-{rfg& z@)x6j-{wsIV)XCZoXKB|{(YM>`HS%dUrl+w@fF}J!S4ni2EPw{1NZ~r4}w1ez6Ja- z@F&2xg8qG*Gx?O!zi-pSiF!Cu4=3v3L_M6ShZFU1q8?7v!-;x0Q4c5T;Y2;0sD~5v zaH1Yg)FY01I8hHL>fuB^oT!Hr^>CsdPSnGRdN@%JC+guuJ)EeA6ZLSS9!}K5iF!Cu z4=3v3L_M6ShZFU1q8?7vBjS2QT#tzB;Y2;0sD~5vaH1Yg)WeB-I8hHL>fuB^oT!Hr z^>CsdPSnGRdN@%JC+guuJ)EeA6ZLSS9!}K5iF!Cu4=3v3L_M6ShZFU1q8?7v!-;x0 zQ4c5T;Y2;0sD~5vaH1Yg)WeB-I8l$-?BPT`BD9AS^@!6RPShh>dpJ=KC+guuJ)EeA z6ZLSS9!}K5iF!Cu4=3v3L_M6ShZFU1q8?7v!-;x0Q4c5T;Y2;0sD~5vaH1Yg)WeB- zI8hHL>fuB^oT!Hr^>CsdPSnGRdN@%JC+guuJ)EeA6ZLSS9!}K5iF!Cu4=3v3L_M6S zhZFU1q8?7v!-;x0Q4c5T;Y2;0sE-r%aiTs>)W?bX%rg2oQ6DGjD_)v~K2FrfiTaA2 zZ|R7gsE-r%aiTsE)W?bXI8h%b>f=Oxt^D|1cA~ykevH<}zUCc9J5gV8VYCzV6&FT3 zQD1Rkv=jA-i#~DDCocLpQ6DGj<3xR&sIMsSyX-`LMS;;y)K?T3?L>V=fzeLXR}>h% z{@=%m`Z!S^C+g!weVnMTd5zDs6ZLVTK2FrfiTXHEA1CT7YILTe#%L$%D{72(qCQU4 zhwXiM-iP6RxZTHz`Z!S^C+cfW$?vrj^>L!U80)s3s9&%X^~GMJov1Iy`c*qoUwm_$ zr;QW!aiTs>)W?bXI8h%b>f=OxG0N|<6ZLVTK2FpZuXF?_>f=OxoT!fz^>L!UR+)T` zov5!>CZnCGuT>_aov6>;r;ii$aiTs>)W?bXI8h%b>f=OxoT!fz^>Ly;PSnSV`Z!S^ zC+cg(N!QnklhIDp*NT(TPSn?mlhIDp*NT(TPSn?mlhIDp*NT(TPSnSV`Z&=5ml-I6 zmW6@l=0@jl14WJ7{tu~vqULeoW3=B6x^iQ{+s)GL!xX*lnsfpAyGCY%7#SQkSH4xWkaHDNR$nUvLR76 zWF>7#lnsfpAyGCY%7#SQkSH4xWkaHDNR$nUvLR76B+7s)GL!xX*lnsfpAyGCY%7#SQkSH4x zWkaHDNR$nUvLR76B+7s)GL!xX*lnsfpAyGCY%7#SQkSH4xWkaHDNR$nUvLR76B+7J6JmER$m8Fq%!1#5ZiQRUD4vf%&5t-*mI^ZW}w;f3bj4vCd1I8`TZaYE; zM(Dsu8L6(OjMVrV@U@_Kb4KXH2z?l#4_uh@5t$oYwDU^iheCGFu<{An43?B*pNN4}&GHX@49kzxDBt zf$&7S;UoSPwUIJjw;6ph-jOuK$G!VAQr>H1jL?&j^u$M8O)*mT>-GY)$BmQ&8}IY! z_VJN2VIA3g6?oN0sPY<-6_3b@M`Xn#WyLyES+Vhb;IDzd4&DNP1N=?!x49bkh&qi> zrxEHjLY+pa(+G7Mp-v;zX@okBP^S^STNx{A2J>z!{i> ze+GUX{07LAVSi!7{=$g;g^}`b-=nL}MpT`Rs5%=_bvB~vY@{q*uPRG7z7qUy@L}-# zK>sG^NLjk^2f-f!-va&^_!Hn;!Jl=nqT+J!HX z4}3|{q&BYiC0y@Ic+;2gmoeHnW)E&m1~Nto$5O)kg|V*lxX?;CRt93U5{^;AF&a2V z{l-!}A9rp)ChHiZcw@4TF^V^44{j_K@|mtu8%u?Zu2LJ5ON_}S#$*m-GKVpl!%? zALHX=e0+?LkMZ#_K0e0B$N2adA0Ol6V`5}XjEsqqF&;g}qsMsk7_N@t>KLw$;p!N! zJ`Go&hO1A*)u-X=({S}^xcW3)oxs%zT%Ewx30$4P)d^gkz|{#{oxs%zT%Ewx30$4P z)d^gkz|{#{oxs%zT%Ewx30$4P)d^gkz|{#{oxs%zT%Ewx30$4P)d^gkz|{#{oygtp z7bax66Sz8os}s07fvXd^I)SSbxH^HW6Sz8os}s07fvXd^I)SSbxH^$T=~Lk91g=it z>IAM%;OYdfPT=YUu1?_U1g=it>IAM%;OYdfPT=YUu1?_U1g=it>IAM%;OYdfPT=YU zu1?_U1g=it>IAM%;OYdfPT=YUu1?_U1g=it>IAM%;OYdfPT=YUu1?_U1g=it>IAM% z;OYdfPT=YUu1?_U1g=it>IAM%;OYdfPT=YUu1?_UISf2kCV9Vbu1wPCZyTM9jZ2|( z$aDC74iC@a;khzKAAcuU2mMW=bLzy-sS`V=PV8J+oR5DN^tUa}wN7aKJm_x{oofxy zI0Byn$Dk{z&b0<;oPy7Q{%*y&@-d@pJkG^f_tx|Gb1~NVHPHFkIWc$+KhI(2Im|qV znddO`Tv?XRRF-9Y4ftBnnf5ugVdwDbT-lC~d=T_EEY8I!eWJ1#x0|4=(9gv#A9q#Q zx$+jHbCq-DD#j(a0>5qCe3cQtox`_t_;yYu*g2J8=Tw57QwerXCD=KYVCPz+^Lu|2 ze8DK!HogLUCHURo!{GOUZvcM){6X+Xz_)-u2L1%-YOX14nZlMSY?;EADQua-mMLtR z!j>s)nZlMSY?&(a_jSycDQua-mMLtR!j>s)nQB$p=a?;1*fLel@3z@8g)LL97`tt@ zOtoTcG+U;yWx8RuOsOH9!j>s)nZlMSY?;EADQuadZ&TPZg)LLqGKDQu*fNDJQ`js)nJWABIcCcgwoGBmR9d9ECD<~BEmPPsg)LLqGKDQu z<+Q$n*)oMKQ`j3wSUuBnJqJZ9cZ@kL(1W28*c%B9Q3~i%=mSn znRW@6YG31g|7*ZZ>@vDOaK=9141b)7V^8Ub^T3&W(67D&bd}&t>@vO!d=KaxekM;e zI+LHVYBZB4y8V9ef8(0|*MJ$n4m8{FzXr_sb)eaX|21I7uLI3CewS;ys%^%v1I_q# zpxH*u5&vtzj9&+uX%_7E?}7f;fSG2&#*c%Z>C7|>HoE3;#;*g-#C*41@iJqdaVF-w z?V7`xm~Zq7z>L}MjM?st+3rlbondZDc-~Spg)6Cax|7*ZZt5|OT0qClU z8NUuRQ#85#N8nT7m%uUT%DNdlk~2k?+s}ZmSDY!bjILLlZTuPNe+`)N>p(L_ncM## z$NjGXGkzUtrigRfnfy#yf!?dE!1xN#m3T9L9cZRlbNjo%SA*XTy0US`uLI54*_(Q}iT=EctlJwuskcI>w2DKpKH-M&KG{~9n;p5}M`FzA``jFq$*GvygG zE~G9cWg7tNc39j9&+u@#{b{ zDTdGSzXr^t8^#ZVC9d#0T+RO)Fe~_917_Ombo-+q{A90lRyg4NL$J!3H4tX<>p(Nj zzWrX9DP8i_V5W9F-F|{s8{nrv*JsZ7b)cE_%I7@Ek-N108x%8s9cU&UbKCzKFyq&O zW(9c24(W_v2b%HgKr?Bb&xBV6ue8jxXX>$lQBps@`gM+fgR3n#;u_8wzYa9x*MVmI zI?zlC>EkbfuI-#{`drqgpwtm22(J zJux?OR4dooo!jO{j%wwoR*q`rs8)_@<)~JUYUQX_j%wwoR*q`rs8)_@<)~JUYUQX_ zj%wwoR*q`rs8)_@<#K=b;SWKpR*q`rR8ZvnrdduMMXr3nue!=QN40WPE2oYkN40WP zD@V0*Wd(koU*UYKR*q`r$`IWCj~usZ<)~JUYUQX_j%wxnrdf_^<)~JUYURok)CYdk zELXPR_V<9V1%31% zqgpwtm7`iYs+FT!x$-NYZ`I0`Wf@&Znxk4ds+Fs@+*h+|<)~JUYUQX_j%wwoR*q`r zs8)_@<)~JUYUQX_j%wwoR*q`rs8+7ZbAO6eD_0h0d>(uOd=a#2<)~Ip9Y~I9<)~J! zOi!<(S~;qfZ(6l-R4YfdE|i(i3m0h41=;w8vhk&k{DQvmdLjLJTNKhROo{BgbS@F_{z>nE{N_6qWgmAz970Ui0%vW?F(fB zKGU2{pz>C?|?5Gm4_R>H+`WPGi=QUTex6t;X=8+p0Kidf6A|e9|C`i z>wg$D+b_g(qx1X=))_9uI=8*2aKXyYg>rkh?}OhoYPCVAd|scTeBStO@V9+stv2{o zf4Aa7s|`l4rC(^Z!MG1Pb}qEqVDz5Lg;pDkp9DVz{t@^k@M-Xm!9M|KU=IEn$QWt0 z!Pj|?o_OAR!D_>WRvUC&s|`l)MqRMlZ~-$fSZ%mqwc!GmUdmgaDO}21?+ZQ0yp*>t zg`O{5%3F=T+9iH^iJxBLr&T*saNU$PE%$vW62PI`%xUa}f?DJS)HyncHruk3aJ_PH+E=em?v`iRH8pK){(ly<7G2_%mw4qRUU|vt+@+$)=X)jjlGV9O`J?aRj4StO_i2BT_JH;u zaK8QVQvT@o+8;0Fk8VFj`%ARPwC#_V_~Rx1c!@t=;*Xd3<0bxhDSz}8yytZ(e{|bB zUzhSnx1FI~${*eS8f|Cwmx@gtVXf~{vFWzgH!kIm#)o{S{LyXu!FnO}7Vekm{W zr@$F`nO}t=@-msjSII!9w|4b%3sly z)z+1b-ogBe-n%T!rAyxuUZ?H#(z(>hcoTHb=d5(iS?QXydp_r0=4jDee)<D#Y%Xo_tDgnUjXCRPbJoq~(iR^v zPv&UL9BrASEps`wd*bf}%%w2C$38d!z1lXHk{G?(HfObM&T8A7)wa3R!^fWi&7Zl{ z!)X4@d8%_(%;v0^%~>&MNTSbB&|XHI{Q_n?C+Aj_~9agMPKaaj)ObVa{Bcp^tn0cFv02 z92U(L5k9iuRlDJwb-B6R+}HoMk8E1&=GtG@6~sF6N31ix8?-mgS)-e?MmJ}TZq6Fr zoHe>RYjktg=;rJQ&)E^4vm-obM|iHi1AU_Q4vhXTz+8I=Mt>JzuDt`JzY8$e-ht8I z1(?gtjr5<@zq$5*-Orc6zXJaT{Em^e!8vP#bJhmutPRdt8=SK?IA?8e&f4IdwZS=S zgLBpf=d2CRSsR?QHaJ)2pgt&bF#7uf3v^&1-~X1{H^7^qm0_W5*2jMVbT!LD*{qMe z9dw2Bf*rAiqR(yT01NWi1#!0^?iR$|LcZ*CT;aT+!g)c3^MVTJg)&51W<3-aUzdGdlhc|o4MAmSE8+yd2IDB}EHS2!;ecg7EbAL44i1==we zMBhTu=X0#j3q_pUJZ(jsdX82v6mdSz^C4SaC|mZCuY#^{UMS*>j<|&)PHjb;5QSf$ z@Cy`vL51@|vF2A@;k=;2c|nEqf(qw_V$H{0;k;nCZozKdg7{hxUkl=EL3}NUuLbe7 zAifsF*Mj(35MK)_oEM56T~o1RbcOSR3g-nC&I>A>7gRVesBm6T;k=;2c|nEqf(qva z70wIAj<4X@Sr9u5V&^$r>^V699D4g4qxl@8`JB}6e&IQu znJq3AUq0g5;*#0oQt{;@u8~-hZ!d|mC7JdTk6ZG&OJZ%QSo^BZbS?CfIpb0h=l1)# zf`1WrNtNc3D$S)bXCHC?v!qIMsm$4JR{<@FuO;!dB)*o!*HZE2Yq}PCDbMoxeQ*Fe zb665DOX6ioyeye-E)_4n@?Ua}=U+=bG2gG}n@jeumx>*?J>Oh1-&``^T$0l+$!VA5 zv`eznCE4kc>~x8vEpfCZj<&?nmW;@f5m^#nOX6!ud@YHurQ%C>r1&!aw0p=rbjdt) zsd=dTW2aj(4_&gyy(~D^mIcS!lCfSY)_jGCBOe2Q59DbReM@GhOCoM5r}KO5wcuN2Wf(-FNQqF0JjA8~HEBDY+TTdv40SH$UxI9=glE245mRIZ516}zr0MWwIc zs9ed*jE>5cqSEbef!_gLGr3|ncExV&il|%>l`EohMO3bc$`w($B8Oa&L$1gnSLBc@ zB5p;*t%$f45w{}ZR;>K2aJm)yxho=WMZ~R$vK3LbBBoZv)QXr|5lt(_k$dY1S`k4j zB4~wAt?;Q8KDDB%WJT<(h@BO&vm$m@#LkM?SrI!cVrNC{tcaZzv9ls}R>a7P7+Db` zD`I3tjI4-}6*00RMpnegiWph3&a&a+~jXT>_tiglis z;Oa|o^(DCa5?p-=uD%3UUxKS^R(saU`tBFj%KD6+Ppx6^TI^k_?YY$&4_d?0HS?@B zTwOEUTEp12{K)5fHn+x))?%;Q?*+Yfw-$Si-v3=wvAm{YdCf}Bnw6Y2D>-Xca@MTm ztd%jkSDyq=LC?+C%)i#mzt+sZ*2)!q+_TO#^RG4YuQgt_#>>`t*%~ifD@NRt4(Ju0 zwY<#eRh_l6M_AnyK>OEPT4D5>@LF17 z^qTNmT4D5>@LF17^qTNmT4D5>@LGOqe9m`@Vysb&HS@|fb;WDyir3T?uc<3uQ&+rZ zUb$voxn^FuW?s2wUb$voxn^FuW?s2wUb$voxn^FuW?s2wUb$9otUgGo)E_C8(JRtx zlxmGqtx>8qO0~99Z9eFHSa|*ArBL~>Q2DS>yC*{B!$LWx@G;uTht-y23f}?#GWag= z-Qat`U*SyU!#Y#>uu%FVlzR%54-1tK3zeG*{|%@NO>O1FLd}wd%7=x@hlR>6g#RA= z58z!;`LK>F9~LSf7AhYWDjyaq9~R1qgkrDoYoNwaZRNv4sew=&7Rq^r%7=w=UZL_~ zq4MF)2b~WKwf`dgul%YNL--2tb>Ji5qo7uJ^y>G6Zv@{2z8U;sP_-61M|%Onp9Fsj zR6eXD%7=x@hlT$X{25UBu#PZx&WF|hb&h`sR6eXDn)?Wq4-2IU!jFMGbE$!k@SN@4 zYPUF|d{}Mis_kM){2F2!11d#xX`%~b*1^*qW6+a#SJgEO(QCt7LBGiAc2=(79LjCuO za0cqXSJc*juL$+uD?;VNLhi`=FrE32Y_)bv%t0R6I z4|)AlDE}2o!-akt57~c(@?W9H@ge)KQ0t#UIjK-iDtrnYgHm`MIR`!B57|kDTFDe% zfabtMc2c34@Q|HU_%-nBysC9+9Z|k2^iz7sb%UD^Ia3vGfe(SN244fd7UcQZ<8-z7PC0&@uIpy-D~R;BSI27_H$#$NodsaN&1@4};$az5)CJ@CU&k0p9}t82A(5 zTZOOL{0A>TCA<#)9Qcu!&o*E4O8tu9=EJ=DFt0wm=~o}#^s5i^>i0^|&o;kTOf%j9 zZ-PG${xhBby;60*`WWrEgTDyA1N> z;G^K{ja&cA%gxP4=-VUo?GgI+h;rRC9shZ~_YuWHTlkCMJ3#m35oNi4)%|%yS+37< ze;!em>*K$|k$(Zc7yMQ5eZ2a9x9Qa*^y(4qx#+!{?$sme)l-{~@;o2qc|OYXe3a+; zD9`ity!v`xeLb(fo>yPbt8d`dH}L8kc=Zju`UYOT!u?+1ey?!9SGeCR-0v0c_X_uW zMNZn@yrOtN6Z(FyaKBf$-z(hj74G*6_j^TIz0ddkUXiOBeZN=as%mq;SGeCR-0v0c z_X_v>X7%}O^UdnB(L8yx`aIu!v-*60^D2G5N}sRN=d1Mjs``AUSIwWR@aHQ0xvCko zkC;DKbr(k8#Z~%$RsHu7kJnZ8-)R0^RsW6V&sFu`X#QNK=U3_ZReFAvo?nGO*XY|d z`gV=JU88T;=-V~=c8$JWqi@&f+co-jjlNx@Z`bJCHTrgqzFnhl*XY|d`gV=JU88T; z=-V~=c8$JWqi@&f+co-joxWYCZ`bMDb^3OlvA)h&UuUeZGuGGX$#us1I{mrMSYM|< z*BR^UjP-TK`Z{BMUHxfqUT3VYt5<5%tLyaYI=#A1udXxJH|W(3dUbLiQVLh-QD5hob(1Idn69wgd~E9*iiO9v{uAy0O#81DBadx4 zCwy${+qA!9d_c7~!UsXsSgQT7@D_J>i@UqU-QD8uZgF?FxVu~2-7W6!7I$}xySv5R z-QwD6s|b(>z@rdPM=)oprpn_k_fSGVca zZF+T^UKQz8kzN()Rgqp5VQCST7GY@-mKI@Y5tbHVX_0;w>0uF;7U^LTmKN2+r#6eQ zvYNZ*R|tw`UBu=FG9+f$n#QQwR=z?-1wN*~b^I}`pQZPk*g{Y$*6 znhLewN&8*2-%a~Hw9T=Ps6R%n%m|&me?(8rsFj(`kEmDrMD@z}DENA#dbQm8U!~YW zDfV*f^IOU}g~~aFnhgmxe;0Pa9@qy}Eu-TD+Nyz9dr12a!4dcrsLW8WYA!6CfSM7j ztr@X!3Tj@g_A_7(ei{5zP&LeY^^&$`&1$QDM)(!l$|2QO4k`Q#@HswF*_w{1K2WIo zK%t^fsBB!QEKc|msQH@Oe+AwLH6PItW$D6i@#){@%KwGyC>P!O`~w?qKcI|MxCw6g z%m*Hz{dd5>3u z5ot3b?JbW;d&?uz-tvgF8IksuN2JY&w6{DW?JbW;d&?uz-tvgF8Id+4(%$ljv>A~$ zBhudTh_o4z_LfJaz2y;UZ+S%8TON@%BhudTh_o4zHY3vB@`$t%A~$BhqF>+Kfnh%OlceMA};(k@l8Hq|J!58IiV>)1TrIX>WN%+Kfn>5ot3b z?FT#}ZAPU1fJdbLfJdbLfJdawh_oN@h_oN@h_o4zHY3tzMA{E{MB0oq$M~GvQc$cyjBUBYt8}@|2$B$vi3Le?~_Z9Dh#zd{R%q_&mq|6Zpc*PwB{i<{Z_p zs;$Z&p{nkMf61$VMf*PZ*SzbSwEqTNbL3lG;XAbd3-40Z(AJZBChCKpiQAi?RvXlQ zfcD=3|1L-L%@G~{dwLE}%8C502f@G3@mJFRu9qLz@mKr$dP+Y3dq7o}sjcekt-G-6 zF8sO6)40pixT~kJ)T@3Pcj3cb_;AE17e=6O%7_I3W6BWuta+jA}?{Em<4zMc{~etYV_-ld-V_=BMSuSacQZ}|RI?HBGr4QNN0n{P8 znnM*;)rW%USXCX?dGD>*-H}&)(f?q@`UCv~u&=7SZ&pZGP330S6@hB6-a)T&t|Xnt zvW+p22@b-hfFi-pw6XDFz3-DZZ_F5$rpEV-XN);CC4tEQUIg5tf3scrTvUHA0zQ68 z{*hCybXnD|w^7X4mibj+CkUSxb6 zAw9mo7a6z2$Ua))9KY{Z6d(V!pFBYhl3t5`uhI8olC-4B44G5T;lmt0%;CcvKFs06 z96rq9!yG=$;lmt0%;CcvKFs0696rq9!yG=$;lmt0%;CcvKFs0696rq9!yG=$;lmt0 z%;CcvKFs0696rq9!yG=$;lmt0%;CcvKFs0696rq9!>96LC;F-8>20Ow>8J9+E%(I# zQ`PSDZ2eTT)sJ~Z%VW{|6dIq3hM)C{^gR7kHM(V=e5V=rsb;9ppm!_LPgR$WRg2o0 zp`WVfZto}c{zb>0p`U7Qu0}u8PG((sll=ck{aQpV|G!@AGwo-5{Ga6iB)y;cO#2zP zdq4A;_A^fXUP-C%V=MJdY^Ce{O#2z9zJIIil1rRuRfoNjPuBU6&XE}QT|M1eC)m7XVCae z#_CyOvJ<_-EWX2D;*P3#sTR-TI~aQhWA9+>9gWed+I{uBBV*T<-b>txdM|NDqvrJd zy`#SQG2Tnuk-bjuCGN17xFd&s?7hStjjx~Oy~G_k?DSsZjw$9~e$KPgo@b}6YIvk~+VkrF zj?(Xa=Gke_v(uhur#;V3d!Fj%*=f(S)1If&d3M_K_&HD2^X#da&5Nxb$(lCLnl=yTdDgUf{GVqvn`aixYuwcbRvqj(#CBPOoEMK;{dPaf^2yU&xAerFR`)sP-MDcO73aBfenQ@r4X= zi+3GgP~8{oI=+x6YEfPDO4srQCVwGM-0oe+7xLEWHSG)aU$3R!u16PG*%nyY7G#cF zys|B@vMsQ(EwHjJ$RD@cp9NO71^iiHWm{lnTVQ2dU}amN_61h91y;5NR<;GL5-)WI zuWSpl$mx}BLH;4VtFj){2Jxfe>qIWU>E^gn&=esz3S7Y>2fA!40i>r5W^{z(B zEuO`9vGgvM-o?_p_<0vU?`j17NWTlXi=}rpnr`trd{^V>W4{ZytKRAuOYdUoU3z{O zOYdUoT`awerFS*fe!SlW+{M+q8gU@pv_%*U>3bc^R>m-*ObK6aUpUDc%(lljzpm3!;aB}Qb45m{nHmKc#GMr4T*Sz<(%7?CALWQh@3Vnmi0ktIfCi4j?1M3xwl zB}Qb45m{nHmKc#GMr4T*Sz<(%7?CALWQh@3Vnmi0ktIfCi4j?1M3xwlB}Qb45m}K(|vsAu{;T}_;Rr+<$t$UR*_)S~N!9s_}U%-MUIvpZ2;ok-t9TV;G#8Q)dL zca`y7Wqel|-&MwUmGNC=d{-IYRmOLf@m*znR~g?`#&?zRU1fY%8Q)dLca`y7Wqel| z-&MwUmGNC=d{-IYRmOLf@m*znR~g?`#&?zRU8TBJ#&?zRU1fY%8Q=Si?|sJiKI40z z@x8C{U60;peD5>9_Zi>&8sC>{_nr3pyi>T(_}*uH?=!yl8Q=RbywCXFXMFE7zV|i0 zKC{R7KI40z@x9OZ-q*;w-FI>CYh;}s+53#_eMa^^BYR(Cv7>fwQ?=hthpf`a~_>N3FqR4JKRmt6e6Gs!aBAgzP0_r0=J#$ziAG;~Jy0#^|icWVd+d zvxdoQ8Y3Sk$uyZEJ#*J&^~>l3jnr-BryA=AFn=JzZt;wM0Lce1d>}sSYVi*6f%y2? z?_?i{kJDZ~U@!UrJ`cpl?S3cwK(pIv-yVpM)9+*-z~_PZ_}K4cAK>8w$UI>0`aopV z4w(lc<72;veW2Ox^t;ywn%#PJk@2zqA48?ReE^vUBI9c)#_fTY55>pl^gX(V z;-h2n@o|LoyP=1ojlf`b%cbmvUoO$9}~x<-;ST*N`uH-7huPZt-6FOUCz0_R?Q!l-0t>eyJ;( z&Vc7%YSi5Bz4VtFFQ@zYCH?$T{alZJ#a#Z1S^O2V_$y}dSL)A>{_0u$m3s0<>Gy75 zsSiH(9hk4w2mjS~V7}6;uPS}N=qs+FU+LA|?mIAF>DAvvAM3StlwL6&^IDI2t;c#T zxA?Ulvj=#rdErNTt$57qKGs}ti|=ea)?9G<^W4Xp1x~M@k2MQ?>`!$cvpzg#5Ac{( z;xT)G$LgmZDgX5t`S0|*-N*9Z>CX@!)Bnfv-^X4b9;*tcKRJ4=T6}DhkLA2u{Mqhf zIq%FVpHS%&Dt$twPpI?>l|G@;Csg``N}o{a6DoZ|rBA5z36(yf(kE2l|G@; zCse9C1fromAn8w#HIqpDvreV!__I!R>-e*dKkN9jjz8=8vyMOO^lDxGc@te%f1LK` zDO8{GT2G<+l-GI+)u+7HQ>Z?L>Qksb<#nGz^(j=JLiH(BpF;I1RG&iiDO8_A^(j=J zLiH(BpF;I1RG&iiDO8_A^(j=J(*LJWeG1j5P<;y3r%-(g)u&K>3e~4jeG1hL*31po z%njDe4c5#J*31po%njDe4c5#JR+|mh%njDe4c5#J*31po%njDe4KZAgZm?!H&`<_qF%u^STi?R zyEa%eH&`<_STi>uu)$ii(d#vHld3nVdXuU*sd|&DH>rA)syC^6ld3nVdXuU*sd|&D zH>rA)syC^6ld3nVdXuU*sd|&DH>rA)syC^6ld3nVdXuU*sd|&DH>rA)syC^6ld3nV zdXuU*sd|&DH>rA)syC^6ld7L#^)sw~hSkro`WaR~!|G>P{S2$0Vf8bteumZ0u=*KR zKf~&0Sp5vEpJDYgtbT^o&#?L#RzJh)XIT9VtDj-@Gpv4w)z7f{8CE~T>StK}46C1E z^)sw~Ms?4y`WaR~!|G>P{Re+vF8T*mw4;2X8T|)U3u;h zFR0}OwYZPnuyR2~f3iXoLda2jau2E;$QSOrZrGt+3ONZzm z^(<#UIjDSvA+Ipx6+B_zH%vVE77#ui*9yZm;0> z3U069_6lyV;Pwh)uT+tG0^PSG{wMNs&{!IC6`t!B=pmvRy9xobh_h-sqi=oqV>T8XQb_|etEiyaN*N}M) znb#uoPAxX=HKx6W(rYNahSF;&y@t|jD7}W#Ybd>j(rZk6jcKnT_L?5PhS+O}y@uFp zh`ol`YfO6$x7V2V8g8%Y`D?hnhTChny@uOsRixfRPpgG05?#`Uyb&>{4S9nhZ!qMI zn7GAEws_VS&)UMPEuOW-v$lBF7SGz^SzA17n`dn^QrnEwHY2soNNqDx+lsy|swOLGLD`|Q=JZpz%?eMG}p0&fXc6in(wq6?Lu!C zi*~VS7mIeWXcvoi@n@HnWEX#S)z43&yYfe`h(Ejdvx`5w;;dJ}pSKWr3xT(AdkcZL z5O@oLw-9&>fwvIYgTNjH_8_nafjtQ9L0}I8dl1-zz#atlAg~94JqYYUU=IR&5ZHsj z9t8Fvum^!X2<$;%4+47-*n_|x1oj}X2Z22Z>_K1;0(%hHgTNjH{EKysI<@Rm%RaU2 zs}{{As@SKBeX7`JHQ1+$eX7`}ihZisr;2@gzE98h>G?iA->2vM^n9P5@6+>r*35l+ zzE98h)pNZ%J>RG2`}BODK5M_AKEG2B_0C6Q_eSaK%R7yrkNuwdokmazlXn_NAN%_9 zPUGnGI`B@fqI(dkeKmTZbFM4Br#jG?^;y2o>=v($2ds?;dKEv?EAxR~#p%`ffblwD zH9OEN-i{vV71gd+bb2*DpsoYGqVA-_{1E1cFh7L(p$~hhp;+i6b|X_p?a%#m5jn6 zqj1P59OBO*V{yb-9Kr1fVn?isM^HL~(vkZ1CVIrGcm%N{dUd3psGU{u2x3PNJA&8| zV|1j~T8|zxLyvXN9UXgxKW2s=>sdP1vz%Jtdwbj;rPeg19W-OG*D|H{-b&p!Q|gYHQg_Uh`hJB{*D|H9WlHV6d;9FXQg_Uhx?`r)9W$lwm??F~ zOsRJeN{?orYVonIWlGINrS6g`b(c)3yJSjT%apoT)*GjmIJLy7B~C4IYKc=zoLb`4 z5~r3pwZy3P`g!*0f7Vr5)ep0AOV2{ z1QHNPKp+8u1OyTgNI)O~fdm8+5J*5E0f7Vr5)ep0AOV2{1QHNPKp+8u1OyTgNI)O~ zfdm8+5J*5EVFK^Hx3}?L&!7GG|MA{?gO~KlDV6n8SwEHaQ&~Ti^;20tmGx6uKb7@U zSwEHaQ&~Ti^;20tmGx6uKb7@USwEHaQ&~Ti^;20tmGx6uKb7@USwEHaQ&~Ti^;20t zmGx6uKb7?}wkH_d6YBYT?+K0Y8>Oz^N?pB`x_T>h_3k~v`A=xHeXOguQde)KNBe|c z>rw9@WCkHK2$@014C?&a^TT8iCW9~;)N8rjb9WFXgD@F{$skMy;V=k?K{yP;VGs_3 za2SNcARGqOPn``8gK!vB-}EYQ7=*(h90nmUM4yM$=bhe@9G|5Br__JF=T-lm=5tCT z>-6>Hl&Wz0dU8rt>?nObIi)I`zMh;?6;5AIPHANINs30+XYlpplq%A(D)Otc<$tlR6Qbj&C?Nh2quc(UL;_JyNRpj*bNsokGa`x>R*mn*ds>`miLT0K#_ z_ccoG1eMweDzy_-nrB+CwceZIRWht|8J&4YE#9qUSm!c&u8vvfGJ39${oJewul8p3 z+;ydUm=$4tBb0t-Sq-w@v8qKoR;Bx#rO#RVnPt9by<_doiqCDO`gbB^+|}17yX#NKl5Mv{{Hya%6}j~c6%;!Jg+Q}`i-WJ$H}Yw^>4{vk$*>){M=lH zyiLmjk6$8JNs-iJv!0PDR(L=z7i-U8kb!IahQ&=Zdc9T+#KME4rR@Mc1k5 zdd?MH&$*)OIahQ&=Zdc9T+wwZx=uycspvWtUC+6q>r`}|imp@9^}H+kP3+%~Zz`{o zzfu2x6Z?N?zd_4yRo!n?@4E6o$OT#!$u5sy;_=Jm0na*g_Ps}H71FU*A?2U>41H() z$Ugmh8_MsKKO}$TbM~Dle@y;_yiER-{2BRka+-6N$TC?Wt7MI=lMV9!;8p%l^8X_L zZ}RUs+dq&Wlm9~gEBS9EeENPvMgK2n`>iv(<(6E;=gH|?07`wYUzs^>DGOvkj*~y| z*>WF|)SIK;+(lZbI!C=ZD$V_Zv+3WH(6jU}jwpXc>R%brafz&u|49B<9{=A+MlknV zdU%tTTjcL(`5zqXI|VwA9sW)3e{wuW{x9+lxj@gC$W`*W$5FmH^<5RER!*g^VoH5u zT6y3{$~UJzV^{W)F)~i-n^0=k?;(`>mV`1z=4jEsCZd+mobyFm#+5gigEyFiH<*Jr zn1eT%gEyFiH<*Jrn1eT%gEyFiH<*Jrn1eT%gEyFiH<*Jrn1eT%gEyFiH<*Jrn1eT% zgEyFiH<*Jrn1eT%gEyFiH<*Jrn1eT%gEyFiH<*Jrn1eT%gEyFiH<*JrH3whDZfXuX zZ;)O&Z>p|eEB}+!_hoeK)$(RcpVcV!&FW;#&<8l* zg!4@}--Po`aaMoC+4+w=9vX7k&;1?gHSi|{hK{X{d){b{TmEQuWYw8%Fd5nmqyur`&aVcNcd=!U6EI|TYaW|OCzop zt!(Q`{jx!+y^S(+{E4za2IM&T1D{PRo0EFwfR8VdR4oVGLZw>S)E}AP{9E!@1@M=RfkS|H`ZXH`kS81Z9PLc$1b}JnMI~_-b`4r*DrcZ_}<{ndo?q{9oi9a)F-f zJ81grDyi=i>G%ctlGHEB)S_RxDfKNg<$)imS?r9uZ(7-$F)~i-mtJZ~kSEBLdy>zQ zW29HMTUyyvQQo_n4#svcwu7-9jO}1-N9*1{>oGRAgRvcq?O<#NV>=kz!Pt&giGR`~ zZEOc)I~d!+*bc^aFt&rS9gOYt+1QTO6Q@V8)9114^x4=>pGUCMXJb2k9>-3fjqUW= z*bc^aFt&rSojx1e!PripjqPA;2V*-J+riil#&$5agRvcq?O<#NV>^8|w$o>0I~d!+ z*bc^aFt&rS9gOW@YzJdI7~9dR^+~LwRm*8(I~d!+*bc^aFt(GUYK-k*YzJdI7~8?v zj@B-Xh}JHrjqPA;2V*-q8{5g**bc^aFt&rSot%yBXiZZsIUC!-*bc^abS-v^jqT)Y zY$s=9J6iYLa~s>i*p99{@&RKzy6*Vc#&$5agRvcq?O<#NV>=kz!PrjT#&+^Hwu7-9 zt))J;u^o)&gNdkmKYp{CJI>^KZ#t zk$*>ekG;tCeNiLj^Zb^)#b1BN@okRvZ6N)1iPSI5bgXaTDfNzC`I6MP@O1n&`I_|g zdQtqHdMB>bJ8`Ani7WL^T&eFJEA{O;Ws1~$Z5@v(yW)IP>0M}-m7&Wny({K!@h-h9 z=IcuD(!1j97Vpx#tPEYP468c!F1;)Ae%7H=w!U3!;YdY4^#S1W^_ ztCd0LWS8F6%HU(~(z{w2oZh8(wK6!pOYgEWbXgg?tPEXNhAt~ZmzAN*%FtzH=xSx~ zt9X~*)ym-XF1^dj&}C)lYV>_(@6x+k8Jymwcjbd?@h-i~%FtzH=*kVXXl2lO*rj*b zrFUgZOD*1|ceOG&y-V+EWzgB!rFXS5_}IJju2u#oRcmGNF_p4Q@5(N>c$eN~m)_ON z;A5{0T~>y!Rt6t?m)_ON;A8~ln|tV8dRHrh^LMm(weMCWtZO7%HS67(z{w2 zoZh8(Wv0`+^sda*ILb_?cj;Yr>0O!WWAD>qpvHrQTO6Wvo&osMH85HFioFtJDZ8 zWvo);sFblvUCWf(eJQp3Qfl|5)U`~h-Ir3=GNpE3N*Sw^u}T@Ml(9W-W0l%{DP^ou#wum3k`c7AI+n3Y8LO1BN*Sw^u}T@M z)cZ=Mj8)25rHoa|Sfz|r%2=h0RmxbUj8*D=rBcQ!Wvo)~EBktEtWxhQm3m*Pl(9+~ ztCX=yy{}a2eWg;yDrKxv#wv9!Qx<8lu@Q`oU~B|qBN!XO*a*f(FgAj*5sZysYy@K? z7#qRZ2*yS*HiEGcjE!Jy1Y;u@8^PEJ#zrtUg0T^djbLm9VYk@k?{}2CZ=n2$q$hH~ zExK=@q(5@N$Miv?uUFLQJAXy$9;uFX-#}R*b>Be8(9nqcSoaN-x^JM=y;G&$*DH1J zv@a>z`m1Q`uj0Jgmx5{vswt?Zpqhee3aTlnrl6XFY6_|;sHUKr()@kdmx5{vswt?Z zG=JUhic(NbY2Mw`v8kq@nu2Nyswt?ZH1GU)Q%ylN1=SQ(Q&3GoH3iiaR8yK+dOTE9 zP)$KK1=SQ(Q&3GoH3ij_=9D-s#&OJp_+wi7OGjOW}%veY8I+lsAi#>g=!Y6S*T{AnuTf>s#&OJp_+wi7OGjO zW}%veY8I+lsAi#>g=!Y6S*T{AnuTf>s#&OJp_+wi7OGjOW}%veY8I+lsAi#>g=!Y6 zS*T{AnuTf>s#&OJp_+wi7OFX@=AfE`Y7VM7sOF%WgK7?{IjH8KnuBT%syV3Upqhhf z4yrk*=AfE`Y7VM7sOF%WgK7?{IjH8KnuBT%syV3Upqhhf4yrk*=AfE`Y7VM7sOF%W zgK7?{IjH8KnuBT%syV3Upqhhf4yrk*=AfE`Y7VM7sOF%WgK7?{IjH8Lnuls0s(Gm9 zp_+$k9;$h$=AoL0Y96Y2sOF)XhiV?Gd8p>0nuls0s(Gm9p_+$k9;$h$=AoL0Y96Y2 zsOF)XhiV?Gd8p>0nuls0s(Gm9p_+$k9;$h$=AoL0Y96Y2sOF)XhiV?Gd8p>0nuls0 zs(Gm9p_+$k9;$h$=Al}EY5}SRs1~4FfNBA%1*jIFT7YT+ss*SPpjv=x0jdS47NA;y zY5}SRs1~4FfNBA%1*jIFT7YT+ss*SPpjv=x0jdS47NA;yY5}SRs1~4FfNBA%1*jIF zT7YT+ss*SPpjv=x0jdS47NA;yY5}SRs1~4FfNBA%1*jIFT7c@9sQy#mn5a6vlNs~< zZKdw#D|LTc>GzLgdWYrICo)QXBBS&@fibQ1jx_qUb0zpeZ!`7=`Yx7Ff%0%N?x8si<- z81Jygc!xE{JFGF@VU6()Ys~kz^>}?EqtqudN_`@u^gV$wjj~gp$SD7X^ZzTU``c=P zk4D)Q`JTWS@36)+;%d=5taYV6kx}-O`b0*@`b0*l``b$0-&X4Ww(=vAdgXvy^ofj; zs^x%>snqwkb*xWhl=?(Qsr%bX-QQOFp1_z)aOx8orS5Mlb$?sQ2+9igP@l*sb$?r_ z``b$2=Na?;ZKXbuQR@D-Qunu&y1%W|{cWZ0Z!2|wTd7ZEl)AsI)F(2^m!$4*>sX)2 zDD{bqQlH55jp-ehQ=iBv^@)s9pU5b6e_N^h+e&>RqtyLvrS5Ml^@)s9_qUb4CoraW zSn9vtVa@ji7#m=0fUyC_1{fP)Y=E%=#s(N0U~GV~0mcRx8(?gJu>r;g7#m=0fUyC_ z1{fP)Y=E%=#s(N0U~GV~0mcRx8)!Yb*%xR%aoX4bV*`v0FgC#00AmA;4KOyq*Z^Y# zj14e0z}Ns|1B?wYHqg4{SFy1H#s(N0U~GV~0mcRx8(?gJv4K{tPx=Ck4KOyq*Z^Y# zj19DE>C6}#U~GV~0mcRx8(?gJu>r;g7#m=0fUyC_1{fP)Y=E%=#s(N0U~GV~0mcRx z8(?gJu>r;g7#m=0fUyC_1{fP)Y=E%=#s(N0_!Ak`Vq*i04KOyq*Z^Y#j14e0z}Ns| z1B?wYHo({bV*`v0FgC#00AoXp4KX&v*brkwj14h1#MlsHLyQeEHpJKvV?&G$F*d~5 z5Mx7(4KX&v*brkwj14h1#MlsHLyQeEHpJKvV?&G$F*d~55Mx7(4KX&v*brkwj14h1 z#MlsHLyQeEHpJKvV?&G$F*d~55Mx7(4KX&v*brkwj14h1#MlsHLyQeEHpJKvV?&G$ zF*d~55Mx7(4KX&v*brkwj14h1#MlsHLyQeEHpJKvV?&G$F*d~55Mx7(4KX&v*brkw zj14h1#MlsHLyQeEHpJKvV?&G$F*d~55Mx7(4KX&v*brkwj14h1#MlsHLyQeEHpJKv zV?&G$F*d~55Mx7(4KX&v*doRjF}8@YMT{+CY!PFN7+b{HBE}XmwurGsj4fhp5o3!O zTg2ER#uhQQh_OYCEn;jDV~ZGD#MmOn7BRMnu|nf3`I( zW1aqNYZ_yxF?L$U`po`pYg)!S{n^&EjCC#kY-<{0r!jU~#;Qfe>O3;m>Cd*NWo%37 z&$gyztka)uP0LuFO~yK@SH}9-pKVRcSSR($SRebdt!WwSV}G_aEn}VjY-<{0r!jU~ z#=6CyZB5HqCnG3h-9vx2H7#SEzoW(PO{Qh6)1Pfk%UB=#v#n_v>-1+^(=ygQ_h(zv zGS=zOwx(sQ)1Pfk^GU(9jPCd*NWvtVmZB5Hq zr$5`8ma#teK6YBhy2YPul`yu1u_cTxVQdLwOBh?i*b>H;Ft&uTC5$a$Yzbpa7+b>F z62_J=wuG@Ij4feo31dqbTf*29#+ER)gs~-zEn#d4V@nuY!q^hVmN2%2u_cTxVQdLw zOBh?i*b>H;Ft&uTC5$a$Yzbpa7+b>F62_J=wuG@Ij4feo31dqbTf*29#+ER)gs~-z zEn#d4V@nuY!q^hVmN2%2u_cTxVQdLwOBh?i*b>H;Ft&uTC5$a$Yzbpa7+b>F62_J= zwuG@Ij4feoNo%Y|A7e`xTf*29#+ER)gs~-zEn#d4V@nuY!q^hVmN2%2u_cTxVQdLw zOBh?i*b>H;Ft&uTC5$a$Yzbpa7+b>F62_J=wuG@|j4fkq8Dq;BTgKQj#+EU*jIm{m zEn{pMW6Ky@#@I5(mNB-Bv1N=cV{92?%NSe6*fPeJF}94cWsEIjY#C$A7+c2JGRBrM zwv4f5j4fkq8Dq;BTgKQj#+EU*jIm{mEn{pMW6Ky@#@I5(mNB-Bv1N=cV{92?%NSe6 z*fPeJF}94cWsEIjY#C$A7+c2JGRBrMwv4f5j4fkq8Dq;BTgKQj#+EU*jIm{mEn{pM zW6Ky@#@I5(mNB-Bv1N=cV{92?%NSe6*fPeJF}94cWsEIjY#C$A7+c2JGRBrMwv4f5 zj4fkq8Dq;BTgKQj#+EU*jIm{mEn{pMW6Ky@#@I5(mNB-Bv1N=cV{92?D;QhB*b2s0 zFt&oR6^yN5Yz1R07+b;E3dUA2wt}%0jICg71!F51Tfx{0##S)4g0U5htzc{gV=EY2 z!PpAMRxq}Lu@#K1U~C0rD;QhB*b2s0Ft&oR6^yN5Yz1R07+b;E3dUA2wt}%0jICg7 z1!F51Tfx{0##S)4g0U5htzc{gV=EY2!PpAMRxq}Lu@#K1U~C0rD;QhB*b2s0Ft&oR z6^yN5Yz1R07+b;E3dUA2wt}%0jICg71!F51Tfx{0##S)4g0U5htzc{gV=EY2!PpAM zRxq}Lu@#K1U~C0rD;QhB*b2s0Ft&oR6^yN5Yz1R07+b;E3dUA2wt}%0jICg71!F51 zTfx{0##S-5im_FUtzv8yW2+cj#n>vwRx!4Uu~m$%Vr&&-s~B6w*eb?WF}8}aRgA4- zY!zdx7+b~ID#lhZwu-S;jICm96=SOyTgBKa##S-5im_FUtzv8yW2+cj#n>vwRx!4U zu~m$%Vr&&-s~B6w*eb?WF}8}aRgA4-Y!zdx7+b~ID#lhZwu-S;jICm96=SOyTgBKa z##S-5im_FUtzv8yW2+cj#n>vwRx!4Uu~m$%Vr&&-s~B6w*eb?WF}8}aRgA4-Y!zdx z7+b~ID#lhZwu-S;jICm96=SOyTgBKa##S-5im_FUtzv8yW2+cj#n>vwRx!4Uu~m$% zVr&&-s~B6w*eb?WF}8}aRgA4+Yz<>;7+b^G8phTzwuZ4ajICj84P$E;7+b^G z8phTzwuZ4ajICj84P$E;7+b^G8phTzwuZ4ajICj84P$E;7+b^G8phTz zwuZ4ajICj84P$Eljy#9wvMrNjICpA9b@YlTgTWs#?~>mjljy#9wvMrN zjICpA9b@YlTgTWs#?~>mjljy#9wvMrNjICpA9b@YlTgTWs#?~>mjljy#9wt=w?jBQ|S z17jN)+rZcc#x^jvfw2vYZD4EzV;dOTz}N=HHZZnuEU~B_p8yMTb*apTnFt&lQ z4UBDIYy)E(7~8uEU~B_p8yMTb*apTnFt&lQ4UBDIYy)E(7~8uEU~B_p8yMTb*apTnFt&lQ4UBDI zYy)E(7~8uEU~Cg(n;6@~*e1p{F}8`ZO^j_~Y!hRf7~90yCdM`~wu!M#jBR3U6Jwhg+r-!= z#x^mwiLp(LZDMQ_W1AS;#MmarHZit|u}zF^Vr&y*n;6@~*e1p{F}8`ZO^j_~Y!hRf z7~90yCdM`~wu!M#jBR3U6Jwhg+r-!=#x^mwiLp(LZDMQ_W1AS;#MmarHZit|u}zF^ zVr&y*n;6@~*e1p{F}8`ZO^j_~Y!hRf7~90yCdM`~wu!M#jBR3U6Jwhg+r-!=#x^mw ziLp(LZDMQ_W1AS;#MmarHZit|u}zF^Vr&y*n;6@~*e1p{F}8`ZO^j_~Y!hRf7~90y zCdM`~wu!M#jBR3U6Jwhg+r-$9W$b+4$1>KbUz{oZUFDBusq;Tb{ccXj`rVw;-{SsQ z#`>@N-JDXto9p{nemeELIi-F#r~DrIeNw-hQ;U8#r_{fyq15l@l)SD?&~r8VN{#ip zQooy1>UVQW{ccXF-_0rYyE&zPH>cF^=9K!~oKnA=Q|e#aP*R0P%4fU9U-i2=9qV^< zO8st5xkT!Bb2`@V=9K!~oKnA=Q@$dF-Wo6KCgdMe-Woj^^ zMmznD^lO^Y&da2~%Y98V+Uak|UlZ+{%6}j~_Bk~Z-Ttqnzaf83{GI;f=$iN|#eZJu zZ^&O0f2Y5Ha!qs1fBlH0Cz@++@i*kJX|6fxiRPM*{SEnR8Y!p0A%9IH<@7h?uW6*5 z{x0`5jhEBbUDIrG`Wy1sG*W(Df6wZgW{Of)>#t&~zl!Q=-wae|pgIH98K}-cbq1<4 zP@RG53{+>JIs?@isLnuj2C6eqoq_6%*2$NBGfI_t8pgJRm)d#4~Ky^mzn;&ng zGfI_t8pgIH98K}-cbq1<4TEX-zsLnuj2C6eqoq_5MRA-<%1JxO*&OmhrsxwfX zf$9uYXP`O*)fuSHKy?PHGfI_t8MfIQhW<}L$H)eGen^*d~RkI@e&r09VpVj){ z^taqwMqhyGFAbWhZ_kp zN`E_UR#!2nziTur2b}(P+^igM`rC1{a==Nwa=^#_cHFESa8j=v@Ug!gH!BmI{&w7~ zOmOEsSkpYzt#s7~8_w7RKuLraa!pwlKDZu`P^kVXS`P=f_}d3u9Xt+rrou#7 z#7#7#b|j;A>OkmD=lRa*SbpEvPe(()^{Y*FbJm2Oe#7L{&M z=@yl4QR!CPm2Oe#7L{&M=@yl4#a-zZm2Smd=~mp8ZpB^cR@{|tQR!CPm2Smd=@yl4 z#a-!E+?8&{UFjB;Zc*tLm2Smd=~mp8Zc*u0+?8&{UFlZbm2Smd=~mp8ZpB^c7L{(r zUFkNJZd2(tm2Ok%HkEEu={A*aQ|UI9Zd2(tm2Ok%HkEEu={A*aQ|UI9Zd2(tm2Ok% zHkEEu={A*aQ|UI9Zd2(tm2Ok%HkEEu={A*aQ|UI9Zd2(tm2Ok%HkEEu={A*qL#5wP z={HpR4V8XN`?s`zOZ&I9@6f(O`ws0p-?fX(df$%7tSbF&s~wSXc(*1z+q;~{dG)c<^_mNbv?d%7KwaZ8TOlcU;o?1+rde45Aj9p8?~_>o2O1Jduo zcSOdIoaA_l;}1E*6+`oI~U=nIv85t{iaM_FWv<#erQp;8*c?(sos;Ga&u_v|Ux|{D8FW zyHvW11G{p-&$Z{f8hszT#$85#SEGNs?=3aHrN+0^_?8;qs>W8|TReZO8h@?hxOT8_ zRilp+9QSLcyj6{EKf&=JIYbVVNixl2GGvxB=g2%csvf?@^S5~Z7SG?}`CB}Hi|23U zxqCH1PLiI{Z}I%CD)nDIqu;7h_v)9lct-D0=^mBtQRyC)?y1t3eS3`N9;3OZO4rq5 zZ}(KGkM)1?DF-RlL(!_}Epv(+u(>UBx@9ct;iQsN$Vw(0tzkRUA;o z0aYAO#Q{|uP{jdN98kppRUA;o0aYAO#Q{|uP{jdN98kppRUA;o0aYAO#Q{|uP{jdN z98kppRUA;o0aYAO#Q{|uP{jdN98kppRUA^qAyphw#UWK3QpF)v98$$0RUA^qAyphw z#UWK3QpF)v98$$0RUA^qAyphw#UWK3QpF)v98$$0RUA^qAyphw#UWK3QpF)v98$$0 zRUA^q5mg*f#Sv8;QN@v}SnWGf6`v@*6FX8Bx0T+B9jOW*dtMx=3Lkraa>P~ph^zJy zSM4LN+DEFW=E>j=k!kONR@ulcTAlyOr^(EdQ7FqRC-LM z$5eVurN>lyOr^(EdQ7FqRC-LM$5eVurN>lyOr^(EdQ7FqRC-LM$5eVurN>lyOr^(E zdQ7FqRC-LM$5eVurN>ly>`LSBxl*Ne?@H~`mD;7p-*cr(jj2*&s??Y&HKt09sZwLA z)R-zYrb_LumD+PEwdYi7&#BayDmA7`jj2*&s??Y&HKt09sZwLA)R-zYrb_Lul^Ro} z##E^>RccI?8dIglRH-plYD|?HQ>DgK=}LR3w1-N2sI-Sld#JRBN_(iZhe~^>w1-N2 zsI-Sld#JRBN_(iZhe~^>w1-N2sI-Sld#JRBN_(iZhe~^>w1-N2sI-Sld#JRBN_(iZ zhe~^>w1-N2sI-Sld#JRBN_(g@LZuNZjZkTXN+VPnQKjqgh$>xGY7eQ@^-HNeq*8lG zrS_0Y?W~mASt+%%Qfg{K}uE4ixzOnPC`3zJ@$^unYUCcQA}g-I_=dSTKFlU|tg z!lV}_y)fy8NiR%#VbTkeUYPX4q!%W=FzJO!FHCx2(hHN`xS90E&7?POCcSYp>5ZF7 zFSDi>CcQA}g-I_=VlaupBnFchOkyyJ!6XKg7))X?iNPcWlNd~5Fp0q=29p>}Vlaup zBnFchOkyyJ!6XKg7))X?iNPcWlNd~5Fp0q=29p>}VlaupBnFchOkyyJ!6XKg7))X? ziNPcWlNd~5Fp0sW4<>yu>4QlhOyac1X^+z$|E?WYaahG+6^B(ER&iLxVHJl}99D5y z#bFhPRUB4vSjAx#hgBR_aahG+6^B(ER&iLxVHJl}99D5y#bFhPRUB4vSjAx#hgBR_ zaahG+6^B(ER&iLxVHJl}99D5yy$_T3Ve&pq-iJwo_5|$-+7sWk!zux*1gsLUO28@s zs|2hPuu8xx0jmV860l0ZDgmnmtP-$Fz$yW&1gsLUO28@ss|2hPuu8xx0jmV860l0Z zDgmnmtP-$Fz$yW&1gsLUO28@ss|2hPuu8xx0jqwP^uwedCjBt!=luPgzn}B>bN+tL z-_QB`IsX7>7~l*8oMC`73_x`Nssm6Rfa(BL2cS9t)d8puKy?7B15h1+>Ht&+pgI86 z0jLf@bpWaZP#u8k08|H{IsnxHs187N0ICB}9f0ZpR0p6sK-B|OJwVk1R6Rh|15`cm zUDZ$>fa(BL2cS9t)e|r|0h1FjIRTRsVlp2;Atufk>Al#CcawlMN0wyQKWK}J` z?w=47r?2}b#Kh^n+zFVR5EGvvN9IZ0ZBUD^`zOTYrZOP)eo)7HKd99EL8U&SQ~J7p zLQH%-Me5#>j?a*1$#bN>SD^L_q`qCC<4fcfo^_SgvlUG24OM?lR=ma%9EFRjF}9|6Q`LB$`hxV49XLynGDJkpVLeR@njGt zgD@F_$q-D2U@`=gA(#xoWC$ihFd2f$5KM+(G6a($m<+*W2qr@?8G^|WOom`G1d}0{ z48ddwCPOe8g2@m}hF~%TlOdQ4!DI*~LogYF$q-D2#AG!-BqmPp5{JaZ>0RQGm^i&l z9D>OZOom`G1d}0{48vp?Cc`iphRHBYhG8-clVO+)!(Y7$(Co8HUL)Oom}H43lA)48vp?Cc}6#j3>i*GK?p~ zcruJ9!+0_blVO+)!( zUy|9EWcDSYnq>ARp_+th5~@jNUy|9EWcDSQeMx3t5~@k4CYgOnW?z!omt^)OnSDuS zUy|9EWcDSQeMx3tlG&GJ_9dBpNoHS?*_UMYC7FFmW?z!omt^)OnSDuSUy|9EWcDSY znq>ARnSCjkq+pVQNeU(@OiN)}3e!?BNnu(FCMlStV3NYL6sDyxErn?*OiRHe1(Ot} zr7$gpX(>!gVOk2)Qka&)v=pYLFfD~?DNIXYS_;!rn3lqX6egrFA%zJkOh{ou3KLS8 zmcq0YOj4MZ!n8C@(lANGBn^`^Owuq(!z2xpG)&SkNy8)!lQc}yFiFEC4U;rX(lANG zBn^`^Owuq(!z2xpG)&SkNy8)!lQc}yFiFEC4U;rX(lANGBn^`^Owuq(!z2xpG)&Sk zNy8)!lQc}yFv-9q1CtC)GBC-&Bm8p7TCOMeo#Khn&-sC z&-H#UCmK%g_j01)^nNcV8cy%`a?r?$hM(oTf;nj9MB{cm4~;xD^3cdbBM*%{hU76M zk0E&s$zw3?^eR8H33fOvYd` z29q(EjKO3KCSx!egUJ|7#$YlAlQEc#!DI|3V=x(m$rwz=U@``iF_?_OWDF)_FgXpA z(=a&=lhZIcEhh8v(_*r!^u3qUVscaIdoQQO#K-#ngHqoaQ2M>nX_%ab$!VCJhRJC$ z@niH^ywdkxPK$}t_Zd!$iBsPwP_GOahn$ zFbQB1z$Ac40FwYF0Zamz1TYC;62K&YNdS`oCIL(Wm;^8hU=qM2fJq=vR^x#@ahgd0 zlK>_GOahn$FbQB1z$Ac40FwYF0Zamz1TYC;62K&YNeGh=CLv5hn1sxokhv2wcS7b) z$lM8;J0Wu?WbTA831Je#B!o!_laRR+GIv7ePRQH|nL8nKCuHt~%$<Gmz`JKMj7j=H8uk}Tp-|1`p2b|#p&hP-dIoZ$n` z@BwES=M3YVVVpCJbB1xoWt?#tXI#b^mvP2roN*avT*eufamHnwaT#Y^#u=A!#$}vw z8E0I^8JBU!Wt?#tXI#b^mvP2roN*avT*eufamHnwaT#Y^#u=A!#$}vw8E0I^8JBU! zWt?#tXI#b^mvP2roN*avT*eufamHnwahZV01WYDiG69nbm`uQA0wxnMnSjXzOeSD5 z0h0-sOu%FUCKE83fXM_*CSWoFlL?qiz+?g@6EK;8$plO$U@`%d37Aa4WCA7=FqweK z1WYDiG69nbm`uQA0wxnMnSjXzOeSD50h0-sOu%FkCX+CkgvlgKCSfuOlS!CN!ekOA zlQ5Zt$s|lBVKNDmNtjH+WD+KmFqwqOBupk@G6|DOm`uWC5+;){nS{wCOeSG636n{f zOu}RmCX+CkgvlgKCSfuOlS!CN!ekOAlQ5Zt$s|lBVKNDmDVR*bWC|uzFqwkM6ilXI zG6j<nD{usalfuaABu_FPv{E%p_n*_$YC-`rg@D1T}u5`-_29% zyLn1|H&5yPz=vYu=bk?PwK5<>T8iWcq`qOOzfO?)Zk~>P@AN~Md?+S9&sp*ud7ivL zUL-G(`YxXy>2KhCC?@WezLBW(d#*o$$)CXFPhj#VF!@v3|CIJWrTtH7KSTQ&+RxB_ z=DT(no)N>F@iSt0TNzhfXT;FQ369P1j2ODz49~#u3=Gf6E4Pg3+Hpp9`8drZGo(qL zf#exTo)Jku(mSg&kURs)Gos{2y6Q8k+WB8No2x!c|IgC@v-JNg{Xa|p&(i<1^#3gV zKTH45(*LuX7xVG6^#3gVKTH45(*Lvc|1AAKOaIT(|FfDMzt*$d|FiV}Ed4)A|IgC@ zv-JNg{Xa|p&(i<1^#3gVKg+0{qyOjV|2g`9j{cvc|L5rcIr@K&{-2}&=ji`A`hSl8 zpQHch=>IwTe~$j2qyOjV|2g`9j{cvc|L5rcIr@K&{-2}&=ji`A`hSl8pQHch=>IwT ze~$itkN$s;{(q1De~sh${|og00{y>0|1Z%03-td2{l7r}FVO!B^#20=zd-*l z(Ekhc{{sELK>sh${|og00{y>0|1Z%03-td2{l7r}FVO!B^#20=zd-*l(Ekhc|04ar zNdGU=|BLkhBK^Ne|1Z-2i}e2@{l7^6FVg>u^#3CLzexWt(*KL}|04arNdGU=|BLkh zBK^Ne|1Z-2i}e2@{l7^6FVg>u^#3CLzexWt(*KL}{}TPbME@_*|4a1$68*nK|1Z)1 zOZ5K|{l7&2FVX)?^#2n5zeN8p(f>>I{}TPbME@_*|4a1$68*nK|1Z)1OZ5K|{l7&2 zFVX)?^#2n5zeN8p(f>>I|Ht(I$MpZl^#8~7|0lHng!Z4%{uA0S(|(!u%d}tquAO=> zQ}1Q!y-dBAsrNGVUZ&p5)O(qFFH`Sj>b*?8m#OzM^Y{+G1>CGCGj`(M%iSG4~X?SD=CU(^2AwEs2je?$A<(Ec~H{|)WGp#2xL|AO{k z(0+yXE3{vs{mOUk;=dZdBL3@2-(kKY{_{%TVZI{%KK32vE8_2C-(kKY{!ZUvz9Rlk z-(kKY@_vl(FkcaQxA^noD%5{JpwsUHdElP0u>tR|PRBGHzi&nJG-Imo2J=6#@v3&}z@&pam`6)7>)(bQ~wC7`NL^ zlfp8SQpvI`{{jBdvMkH8yyqMVsF(nOa9Bd7T`bvb$Y!%4jW_N^hz3 zmP&7_^p;9*sq~ggZ>jW_N^hz3mP&7_^p;9*sq~ggZ>jW_N^hz3mP&7_^p;9*sq~gg zZ>jW_N^hz3mP&7_^p;9*sq~ggZ>jW_N^h(5wn}fS^tMWGtMs-?Z>#jSN^h(5wn}fS z^tMWGtMs-?Z>#jSN^h(5wn}fS^tMWGtMs-?Z>#jSN^h(5wn}fS^tMWGtMs-?Z>#jS zN^h(5wn}fS^tMWGtMs-?Z>#iKl|HM|XI1*FN}ol?v*>sh9nYfUS#&&$j%U$v$1~jV z40k-k9nWwl=IUeLbtmR3HCIIMn5#Q6S9zTNzhkcMn5#R|;Epu7BMt6IgFDjTj=8#H zuI|KKI-ab5x4H79q?$z5}D*PPtt zpSv+9U-_=PF(;o7&4j!gbCSoIkauHF@~4@Qcg@LNb8^?5+%+e6&B@)ElYC4j>K@AAN19=OW` zcX{A058UN}yF7L`W+Q(q6Y?&P-8CEc%*H*lanEerGaL8J#yvFML(@GDxre5E9CD9C z?s3RHG~GkfJv7}z(>*lZ*lZQ|Uc4-SdCHr_y_9dQPR!sq{IOKBv;>qSAMM*K;a;E-L-EaUAb7(AWnW8v8&)V;^W}>;nx=7M@e- zb1HpKrO&DKIh8)A(&wVme0=N!4UK)Eq1g+bQ|WV2X^vzscrGf{Ys3a!=H~z^EmH=JRggp z#y-%{*asT=w2^1%0gZj2F`nLjp0}Tmit@Mee#i4sQ68t0pO0GdIQ{v2)RKDFNbCds zuGg#O^=f&&T3)Y~HyD3|@i!QMgYo;u?;F2w{J!xw8h@klHyVGV@tX0P@tX0P@i!TN zlkqnhf0OaL@w)N4@w)Lh8-KI$HyeMm@wXU%i}AM@e~a zbraW3TsLvu#B~$bOrEQhARoYf*TcvH4wpH3zXrEQhA zRoYf*TcvH4wpIE_rH@qlNTrWd`bedZRQgDzk5u|drH@qlNTrWd`bedZRQgDzk5u|d zrH@qlNTrWd`bedZRQgDzk5u|drH@qlNTrWd`bedZRQgDzk5u|drH@qlNTrWd`bedZ zRQgDzzoOD#QR%O!^jB2+*!W}PkBvY6r*Sjz*bF>21CPzXV>9sB3_LaikIleiGw|39 zJT?Q5&A?+b@YoDIHUp2%z+*G;*bF>21CPzXV>9sB3_LaikIleiGw|39JT?Q5&A?+b z@YoDIHUp2%z+*G;*bF>21HY=$UsdU^s`OV?`gY@QH~x0xZ#RBw{M7iV@l)f!X8hNT z|C;e%Gu|=YG2SuW$?;eJ*{lEImCuL%BmMtE-*4poM&AGG9QhAM{)3VKVB`ZvK49bn zM*gFb|7het8u_4+4;uNPkv})`=SKeA$cK!4$jFC`{3j#-$;f{)@?j$%Hu7O3|JlfY zHu9g1e8k8{jC{n%e=+i3jQkfPA2sq(BOf*L7e@ZV$X^)wn30be`IwQvH1d~5{?f?D zjeOk5$Blf#$R~_^!pJ9$eA37#jeN?;r;L2c$fu2b+Q_Gke8$LUjC{t(XN`Q;$Y+gw z&dBGCe9p+{jeOq7=Z$>9$QO)!!N?ble9_1kjeN<-myCSL$d`?L*~piT{I!w4HuBd- z{+p5iX5_ya`HGRR82O5k|8C^J8~N`>UNZ8Mk(Z484$p0|%RU=L^WGx9Yf zUo-M`BVRZ2btB&}@(m;3F!DD>{>I4P7`ZZXW#r1p#>mFV#>m#l*2p$Tia)mZZ(jLe z=q(yo#BuyAjqBn#{>4{b4*ey1-}oCH*BrmeaozD-9KV&G(6`YB{pHkG#W&4`K275a zH;&`lw)kV;arVll_=|hL5RduAcqQKsy-lB`ca7h3{2YD$mG{JBUhnt~^ghkk_KSNp z$8UE07SH_FSH2eGC$vF-$76n%{vLfd{eAi#`p5LW^iSyf=!~(m^Evl_gvMG*9RC=N&k&B|_zdCDf0-5S|10YMweP>M|2EI? zh(4xo_dLH&-$DC+Yv!lFZNzNvo9+ES%2&SsKI0$o81u9LB_m%k@)F%pRqwy-IsYL? zUUeh2ct0OstkF7si}4fMpiSDMZF)*O^ulkg=wIaX7ypuef_{pAhJKFz75y^(I{gOy zWL+ z^tF4|VeZMt! zoF2X(zKyx%+xz>UHKN{dW)znYWPtniN&(Xi4U#4HD-=J5XVMDj6H-0|H!(*wpQlCyX z??3$_eL~kXolxVz8VA-mu*QM4y>wu0FCAFpz}j9qu%@%rIIzZnH4dzCV2uN799Y}S z|3ZxeYkTRy8VA<){^{?g18aNfz*=N)YC5pCmkzA$r2}gmSmVGN2i7>SwwDg9?WF^2 zd+EU1UOKS0mkzA$r2}hw>A>1vIA>24ImR);O@nfi(`SabS%DYemn-fwf{fuvSb5){5!CS}`41E2aZ$#dKhe z18W>uE2aZ$#dKh;m=3IQV2uN7#dKh;m=3HJ(}A^OIl|3;z&Z!kIk3)wbq=g^V4VZ&99ZYTItSJ{u+D*X4yE=4yQV%%@6t@alf67MIpMUEI7iLn z>;flyZ;qaR!gVL%y067?o~fRM-%@|aW0JCyz2BqnroT`Bn7)_(3C)x~*~^qZ*-JW3 zxb%cePq_4iOHab3`TTi~db0NskNhb882vc?B>gna?sl^GdHMzVMfxS0NqfTQCwzXw z=O_Gpvj08#)BW$I-%npd{~7(~^k2{)rZ;m=;#@Q}J$%B$Cp>(@!za!~Pn?UM#93%Q z<`I2NGc8Z{f88^@gXa0?$$lo=3E!UVo5MK&%#rNlCp>(z{{bUvkMqxb4SDu*vcI8! zOY_Y0Wd9%XILGF#H^U#rfw+ z_&JaB{PQIIoSNsKC*kMRJpViiKd0vT=SlIK`D}6inOdMl`hE0idPpnuhv+e_($~`0 z(I2NjMf3dg#QEn*aPhTbgYz4l-{Aa)1a3&(2In_8zrpzp&TnvjgYz4l-{AZP=QlXN zv6s$oaDHPio!{8Y|5{@&XQ{E5&Ts6c^Ba5V{08SYIKRR94bE?HeuMKHoZsO52In{S z()o?Obbezmo!{8Y|9)dHo!{6?=QlXNv6s$o?4|P?d+Gd!gl}+ugYz4l-{AZP=QlXN zv7gRw?5Fb^`|13~emcLgpU!XWr}G>8>HG%gH#on+`3=r*aDIdH8=T+Z{08SY_S5+d zDc#`w#(p}#5s4lDBhGJdeuMKHoZsO52In_8zp<}&&TnvjgYz5v>HJ2ddOlk^zrpzp z&Tkac`Hf;azfnx*H;U=}2In`5>HJ19o!^k*4bE?HexsPqZxsDcIlsaA4bE?HeuMKH zoZsO52In_8zrpzp&TnvjgYz4l-?)*^Z`?@dH*Tc!8#mJVjT`Cw#*K7-<3>8aaU-4I zxRK6p+(_p)Zlv=YH`4iy=m=3e=QlXN$@xvrZ*qQ<^P8OCZDW`7O?Gaej;QTb$qG{1)f8 zIKRdDEzWOoev9*4oZsU77U#D(zs312&Tnyki}PEY-{Slh=eIb&#rZAHZ*hK$^IM$X z;`|opw>ZDW`7O?Gaej;QTb$qG{1)f8IKRdDEzWOoev9*4oZsU77U#D(zs312&Tnyk zi}PEY-{Slh=eIb&#rZAHZ*hK$^IM$X;`|opw>ZDW`7O?Gaej;QTb$qG{1)f8IKRdD zEzWOoev9*4oZsU77U#D(zs312&Tnyki}PEY-{Slh=eIb&#rZAHZ*hK$^IM$X;`|op zw>ZDW`7O?Gaej;QTb$qG{1)f8IKRdDEzWOoev9*4oZsU77U#D(zs312&Tnyki}PEY z-{Sl>=eIe(&G~K4Z*zW|^V^)?=KMD2w>iJf`EAZ`bAFri+nnF#{5I#eIls;MZO(6V zew*{#oZsgBHs`lFzs>n=&Tn&moAcY8-{$-_=eIe(&G~K4Z*zW|^V^)?=KMD2w>iJf z`EAZ`bAFri+nnF#{5I#eIls;MZO(6Vew*{#oZsgBHs`lFzs>n=&Tn&moAcY8-{$-_ z=eIe(&G~K4Z*zW|^V^)?=KMD2w>iJf`EAZ`bAFri+nnF#{5I#eIls;MZO(6Vew*{# zoZsgBHs`lFzs>n=&Tn&moAcY8-{$-_=eIe(&G~K4Z*zW|^V^)?=KMD2w>iJf`EAZ` zbAFri+nnF#{5I#eIls;MZO(6Vew*{#oZsgBHs`lFzs>n=&Tn&moAcY8e;Rj-UM`;Q z{X*OeIE|H-)VoIRIew1j)$VDmwB%3Y8?r)kwfWRa%PB5St+brt;xxF(pXQyK)8OKz z&|G;wja8Q%$(83*t1hQ|zv+>`Mf2+Ebnl%sS42zCoNI=sv0{_s-!}e_ zj$cWQ6`R!f_Q}v(Gd#6ob85xr)QZii6`NBlHm68AMan5sPLXmNq~!1Z2+g}Qr$I_; z-kmuOQc`nW@ia(D{TYw^S^BT(&v}ghU99Tlod!p#U-A5Z<2YBsPxrr-$5w$(i~LZ$pO1;Ppwv2jfsXT$ z)`Cv01)W+8I<*#bYAxv0TF@!7PLXwLE$Gx*(5bbcQ>>k0?G$ULSUU~Y;`Ib;sku&m z8my(}D&=XgmYS=Sr@>lku2P-`YpE)Vm7;vj8@i>}Uh|Ir9sPUykEy{?{BCfRnrrE& zv5pka5bH>(Pw1MaV>>A8psa(k4$3;Qo|!*Q$~t;Y2W1_Ubx_tpSqEhulyy+nL0Jc7 z9h7xY)!7TIvJT2R zDC_JcWu3jGtfP-~P}V_N2W1_Ubx_tpStr&-^O=*f4$3+x>%_WfjwfXulyy+nL0Jc7 z9h7xY)!7TIvX1rD4$3+x>+Gi|JJF}| z*^;sj$~q|Ppsa(k4$3;Q;u^2bifadD9h7xY);Bj6uT(vqO6OuF3P$n>!PfSvM$QHDC?rEi?S}t zx+v?Stc$WP%DO1)qO6OuF3P$n>!PfSvM$QHDC?rEi?S}tx+v?StgDxGQPxFS7iC?P zby3zuSr=tplyy}$RzLT!#Z_{_t-|_svOMj2PoBlq{e)mFLi{)#0FZ~nx zKKdeE(@TH%PicIQc|88l==(vQ)P(@)Y*)6de+(=X63(l61! z_B>yqFVU~kJZpU+NY7WE{q%((J!kvdIT9?V#@?>b*wq;NJ@k8NzH94+xQ%n~e`M#qUg8dwSKmCAla~?U6 zkNJ}4f64LRc+AG}-_n=;-ETSmhtyZaCxL|ibZX>7Jab$#=J5$_&?Z$^Tr=iRPicp~ zkk1+Ek>e9OrRs|G$ngbT(hItx@1i^$>5-3&?*R|}Bl^emMfw-?FX<=fr|4(s=jdP2 zFVnBnZ&33P>587jn7UAjZgUq&36XA5Z9`y z@hK>w@%bmA$FxdcOJ7HSocHcTB|C#livq-0x zWBgfqkG`J1f!?PzTBmt6dZvS)>ELHN_?ZrVrh}j9;Ahr$&aCa6S=%|YwsU4}=giv9 znYEoWYddGwcFwHroLSpB)7j5-_A{OR%u3Fgm7FsxIcHXK&aC8|S;;xGl5=Jy=gdmZ znU$O~D>-N0fpF%X24~)5aOOP*XWnCQ<~;^y)^pCR=bTy3IkTQ~rn8^v>}NXrna+Nu zBcEBNIrGkeGix0edf&i%$fdsW@YBg%FJ2x-~8Q|XrAky zS)VzxK67Se<}8SdalQCVFFwi3VY|gCMoLR9svtn~*#pcY4&6yROGu`$~ zw>{Hs&ve@}9rMh3%b6~Drc0jbl4rW)nJ#%|HRjA}%$e1gGpjLYR%6br#++G=IkOsb zW;N!_YRs9{m@}&}XI5j*ZsfhE^Kk69L-WewoMX>9_MBtSqkBGy@pS3ARmXE@q~}&0 z&!bD`c)q*f+^XYw^v68@P0#sT^n$*VuIO*mchTSR40$*9oQKbO_?(B&dH9@%&w2Qq zhtGNVoQKb?Po7(!Jhwi19z8LiE#HT59%rzrAN03AL_bVF;xT!D_MFep`TU&E&-whE z&(Hb%oX^ks{G89vqtnIAaPm1PpL6m#C!cfjIVYcU@;N7;NB@f1j{cSUqxsjPf2IBe z{YjedhCPq|mFoY(`R6=;&hzK{`3{8hI2TRL`>^LII1dVP#LNc;dHnmH^F8#Byyo{C z&vzr7W8pkHQ9d$RIFB>ZJl;6YJG19;cAC$hcV^EKaUMj(V-RtUh;u}oBjOwp=ZH8* z#5p3)5pj-)b3~jY;v5m@h&V^Yxpm8P>z3!%Ezhl6o?Ev(w{CfE-SXVJ<+*jsbL*Dp zK~uiAZ|18Fn(}x@|Bn7W&G#^$qv;$?=V&@d(>a>X(R7Zcb2Oc!=^RbxXgWvJIhxM@ zi6(2C=g}`>#-d+*t=Pj?4_`fe_3+ihR}Wu3eD(0v!&eVqJ$&`>)x%d0Up;*FqDOo? zo1zIyoT;j4$Q9=>|`>fx)0uO7a7`0C-S zhp!&KdeKMnFD73-eWa(4^zhZgR}Wu3eD(0v!&eVqJ$&`>)x%d0Up;*F@YTat4_`fe z_3+ihR}Wu3eD(0v!&eVqJuCk`EB`%w_3+ihR}Wu3eD(0v!&eVqJ$&`>)x%d0Up;*F zbeUe9^*t%}qSwR>=ruij_3+ihR}Wu3eD(C29=>|`>fx)0uO7a7`0C-Shp!&Kdid($ ztB0>1zIyoT;j4$Q9=>|`>fx)0uO7a7`0C-Shp!&Kdid($tB0>1zIyoT;j4$Q9=>|f zt)lAaR;kHX4_`fe_3+ihR}Wu3eD(0v!&eVqJ$&`>)x%d0Up;*F@YTat4_|$J_3_om zS07(}eD(3w$5$U;eSG!t)yG#KUwwS_@zuvyA76cZ_3_omS07(}eD(3w$5$U;eSG!t z)yG#KUwwS_@zuvyA76cZ_3_omS07(}eD(3w$5$U;eSG!t)yG#KUwwS_@zuvyA76cZ z_3_omS07(}eD(3w$5$U;eSG!t)yG#KUwwS_@zuvyA76cZ_3_omS07(}eD(3w$5$U; zeSG!t)yG#KUwwS_@zuvyA76cZ_3_omS07(}eD(3w$5$U;eSG!t)yG#KUwwS_@zuvy zA76cZ_3_omS07(}eD(3w$5$U;eSG!t)yG#KUwwS_@zuvyA76cZ_3_omS07(}eD(3w z$5$U;eSG!t)yG#KUwwS_@zuvyA76cZ_3_omS07(}eD(3w$5$U;eSG!t)yG#KUwwS_ z@zuvyA72A}4e&L<*8pDwd=2n5z}Em@1AGneHNe*ZUjuv%@HN2K0AB-q4e&L<*8pDw zd=2n5z}Em@1AGneHNe*ZUjuv%@HN2K0AB-q4e&L<*8pDwd=2n5z}Em@1AGneHNe*Z zUjuv%@HN2K0AB-q4e&L<*8pDwd=2n5z}Em@1AGneHNe*ZUjuv%@HN2K0AB-q4e&L< z*8pDwd=2n5z}Em@1AGneHNe*ZUjuv%@HN2K0AB-q4e&L<*8pDwd=2n5z}Em@1AGne zHNe*ZUjuv%@HN2K0AB-q4e&L<*8pDwd=2n5z}Em@1AGneHNe*ZUjuv%@HN2K0AB-q z4e&L<*8pDwd=2n5z}Em@1AGneHNe*ZUjuv%@HN2K0AB-q4e&L<*8pDwd=2n5z}Em@ z1AGneHNe*ZUjuv%@HN2K0AE9V4e>R^*AQPrd=2q6#McmCLwpVKHN@8tUqgHi@ioNP z5MM)l4e>R^*AQPrd=2q6#McmCLwpVKHN@8tUqgHi@ioNP5MM)l4e>R^*AQPrd=2q6 z#McmCLwpVKHN@8tUqgHi@ioNP5MM)l4e>R^*AQPrd=2q6#McmCLwpVKHN@8tUqgHi z@ioNP5MM)l4e>R^*AQPrd=2q6#McmCLwpVKHN@8tUqgHi@ioNP5MM)l4e>R^*AQPr zd=2q6#McmCLwpVKHN@8tUqgHi@ioNP5MM)l4e>R^*AQPrd=2q6#McmCLwpVKHN@8t zUqgHi@ioNP5MM)l4e>R^*AQPrd=2q6#McmCLwpVKHN@8tUqgHi@ioNP5MM)l4e>R^ z*AQPrd=2q6#McmCLwpVKHN@8tUqgHi@ioNP5MLuqjW9LB)X4p~QIPe{;s{wIcicw! z8sTe%uMxgR_!{ABgs%~5MyMH~W`vp%YDTCTp=N}d5o$)L8KGu`nh|P7s2QPVgqjg* zMi?1kWQ36sMn)JJVPu4n5k^KB8DV6Ek72rnbNjF2)y$_ObVq>PXWz)jDm6a|4DJo|6|S{bN-m~ z$DBXr{4wW`Ie)CPjCGc=&N9|n#yZPbXBq1(V~mV3GRDXlBV&w=F*3%;7$akhj4?9C z$QUDIjEpfd#>f~WV~mV-ma)z<)>+1=8KY*5nlWm|s2QVXjG8fO#;6&iW{jG#&N4>F z7#(ADjL|Vh#~2-Bbd1q4M#mT(V|0wsF-FH29bt9I>zW2qhpMY zvCcBqS;jic7%5|I7%5|b3|<7kYdF^uQ9&H_!{GDjIS}i#`qfJ zYl5!{z9#sZ;A?`f3BD%yn&4}KuL-^;_?qBrg0Bg_Cit4*Yl5!{z9#sZ;A?`f3BD%y zn&4}KuL-^;_?qBrg0Bg_Cit4*Yl5!{z9#sZ;A?`f3BD%yn&4}KuL-^;_?qBrg0Bg_ zCit4*Yl5!{z9#sZ;A?`f3BD%yn&4}KuL-^;_?qBrg0Bg_Cit4*Yl5!{z9#sZ;A?`f z3BD%yn&4}KuL-^;_?qBrg0Bg_Cit4*Yl5!{z9#sZ;A?`f3BD%yn&4}KuL-^;_?qBr zg0Bg_Cit4*Yl5!{z9#sZ;A?`f3BD%yn&4}KuL-^;_?qBrg0Bg_Cit4*Yl5!{z9#sZ z;A?`f3BD%yn&4}KuL-^;_?qBrg0Bg_Cit4*Yl5!{z9#sZ;A?`f3BD%yn&4}KuL-^; z_?qBrg0Bg_Cit4*Yl^QazNYw^;%kbpDZZxon&NAUuPMH!_?qHtimxfYrudrTYl^Qa zzNYw^;%kbpDZZxon&NAUuPMH!_?qHtimxfYrudrTYl^QazNYw^;%kbpDZZxon&NAU zuPMH!_?qHtimxfYrudrTYl^QazNYw^;%kbpDZZxon&NAUuPMH!_?qHtimxfYrudrT zYl^QazNYw^;%kbpDZZxon&NAUuPMH!_?qHtimxfYrudrTYl^QazNYw^;%kbpDZZxo zn&NAUuPMH!_?qHtimxfYrudrTYl^QazNYw^;%kbpDZZxon&NAUuPMH!_?qHtimxfY zrudrTYl^QazNYw^;%kbpDZZxon&NAUuPMH!_?qHtimxfYrudrTYl^QazNYw^;%kbp zDZZxon&NAUuPMH!_?qHtimxfYrudrTYlg2GzGnEE;cJGk8NO!tn&E4PuNl5(_?qEs zhOZgEX84-nYlg2GzGnEE;cJGk8NO!tn&E4PuNl5(_?qEshOZgEX84-nYlg2GzGnEE z;cJGk8NO!tn&E4PuNl5(_?qEshOZgEX84-nYlg2GzGnEE;cJGk8NO!tn&E4PuNl5( z_?qEshOZgEX84-nYlg2GzGnEE;cJGk8NO!tn&E4PuNl5(_?qEshOZgEX84-nYlg2G zzGnEE;cJGk8NO!tn&E4PuNl5(_?qEshOZgEX84-nYlg2GzGnEE;cJGk8NO!tn&E4P zuNl5(_?qEshOZgEX84-nYlg2GzGnEE;cJGk8NO!tn&E4PuNl5(_?qEshOZgEX84-n zYlg2GzGnEE;cJGk8NO!tn&E4PuNl5(_?qEshOZgEX84-nYmTouzUKIv<7mtZ{xp)yfR#J1n^My~AyYR_!7s1y%V=C=b+C{MTQamR2IA8c=xr-n!kAK3Z`Xx)eP4Lj z_l0+TUwGH|g}q%D_I6#^+jU`Y*M+@Z7xs2taQ+47UvT~f=U;^L0;Uxc4iue_dor|yMMmb(a##dvru zHFpGG#BPQ7Y3x==&CfQx@X2x)`N?v7d%yXEd;8_rJ=oj(?w`L=T=CQ&~ zuK01qk1Kv$@#BggSNyo*#}z-W_;JOLD}G$@Q&~uK01qk1Kv$@#BggSNyo*#}z-W>?2(9Q&~uK01qk1Kv$@#BggSNyo*#}z-W_;JOLD}G$@ zY*JSkqqxyA=W zb64M0oNJ`!uD&a~`mXHiy9zhHCq{Bt-&Hs;HFx!0+0}Oy=OcOiCYrnYuHvlZ^P#z` z?<$;`n!Eb0!kMYLtM4kDnVP%$uHpbr{bl+@hScNOO;sky7~D$Y|ZlZT?JXGxvTHWuD+{aDvxtl-<4f`S9bMX+0}PtSKn2f>BO_enNDi%>br_F zoz&dbcNH|H=B~c0IQNNK;@l@SclBMxxld~D>br__pVZvdcNN5?=B~c0ATBj`^<4#V zsky7~Du_$XU42(UTbr^r$j7M5uD&a~`mQ1Yay)nST}1+GclBM_)pr&7kjJ^J z?<&s4@~640?<&s4Qgc_|Rh)~3#<^HLCeFoDb64M0oQtLAuD+`{7fa1ueOGZVmYTcz zuHsxQ^|ds2^t|FH{R@}&?ja=Hu zrHx$L$fb>3+Q_AiT-wN`ja=HurHx$L$fb>3+U#X6ZRFBME^Xw}MlNmS(nc@k%n6Hgahrmo{=~ zBbPREX(N|5a%m%%Hgahrmo{=~BbPREX(N|5a%m%%Hgahrmo{=~BbPREX(N|5a%m%% zHgahrmo{=~BbPREX(N|5a%m%%Hgahrmo{=~BbPREX(N|5a%m%%Hgahrmo{=~BbPRE zX(N|5a%m%%Hgahrmo{=~BbPREX(N|5a%m%%Hgahrmo{+@5Hl>7Hgahrmo{=~BbPRE zX(N|5a%m%%Hgahrmo{=~BbPREX(N|5a%m%%Hgahrmo{=~BbPREX(N|5a%m%%Hgahr zmo{=~BbPREDZZg0NZiP!ja=HurHx$L$fb>3iqD8@aTROB=bgkxLu7w2@02xwMf>8@aTR zOB=bgiEG5DPA+Za(nc=nT}P^< z=65b#N2=uW=jV-GN2;Xer}|w-s^nkEedO1XA^FJs&ZXqwH+oB8~a52^WiW7m-nsrjjX*O3pYxy$@I@*y=>&aNX3 z@^|w)m#!lXQXkV?MZ1nPNPP#*9p~4P1NoTWHe$Ae`W(rtq-(1g*TH*^n4cg$pCP|< z={k5%&F@^g4$@O|m-%%t9>>9WsI`u3YaQ3tIDpSywY84x;4z**cudXDyuS_}Q}Z+LuY2Z z^E;QWgRIp2&ZX-hEA^1(cP?EAS*iJ*OV>eGYJTU^b&!>s-??-hWToaOe_sb#skvW# zhn*dEcG%frXJ{Fkw_!_F=` zX8!eLXNR2~c6Qj=VP}V(9d>ru*|*x6xchn*dEcG%frXNR2~c6Qj=VP}V( z9d>ru*|*x6xchn*dEcG%frXNR2~c6Qj=VP}V(9d>ru*|(UoEb zu(QL?4m&&S?69-L&JH^}?Ch|!OLlI&I?jh*4vo*u2#wE?4ULWy8lP|(8lMLi8uwK~ z<8x#~-$3JYL*w|DXs{EWZ$jQ+79NExV8w`z(6B->SG&)Xbbezz*8xtCLV?saZ@gJferqMxS zJUU2dd}2rFS805XY#hhhU1)rcY-p_Ag~t7v(D)qL(D)qL(D;PQ(D;PQ8?O!`QsZ-E zL*sK~Ltjk`^cngC^atrbqyL=#3;M(KCjAi_9VebAI!YodY52ZhGx$cDzJ{)EOopU`jRajvo7cy*jrrpD*UhQ{Z}hQ{Z}hQ=pchWfj? z(jLcCI-_&Cpi9aFNl-k}|2pP5dfU*M0 z3Mea}tbnot$_gke#MNT{?uThoRzO(+Wd)QKqSxdMBxMDZ6;M_{Spj7Qloe1`Kv@B0 z1(X#~RzO)H?>gNm zfU*M03Mea}tbnot$_gkepsawh0?G;~E1;}^vI5EqajlnsHz_Nitbnot$_gke>?dUf zloe1`Kv@B01(X#~RzO(+Wd)QKP*y-$0c8c06;M{l`&l;%c|R*ODJ$gttk9&afU*M0 z3Mea}tdQ>`h@U29g?t}DXi`={Spj7Qloe1`Kv@B01(X#~RzO(+Wd)QKP*y-$A+FBi ze}S?>T$knZCuN1WE=x_y3Mea}tbnot$_gkepsawh0?LXgE26B3vLecgC@Z3@h_WKe ziYP0htcbEA%8Do}qO6FrBFc&=E26B3vLecgC@Z3@h_WKeiYP0htcbEA%8Do}qO6Fr zBFc&=E26B3vLecgC@Z3@m}hi1iYP0htcbEA%8Do}qO6FrBFc&=E26B3vLecgC@Z3@ zh_WKeiYP0htcbEA%8Do}qO6FrBFc&=E26B3vLecgC@Z3@h_WKeiYP0htcbEA%8Do} zqO6FrBFc&=E26B3vLecgC@Z3@h_WKeiYP0htcbEA%8Do}qO6FrBFc&=E26B3vLecg zC@Z3@h_WKeiYP0htcbEA%8Do}qO6FrBFc&=E26B3vLecgC@Z3@h_WKeiYP0htcbEA z%8Do}qO6FrBFc&=E26B3vLecgC@Z3@h_WKeiYP0htcbEA%8Do}qO6FrBFc&=E26A~ zvJ%QlC@Z0?gt8LKN+>I#tc0=>%1S6Jp{#_m63R*_E1|4}vJ%QlC@Z0?gt8LKN+>I# ztc0=>%1S6Jp{#_m63R*_E1|4}vJ%QlC@Z0?gt8LKN+>I#tc0=>%1S6Jp{#_m63R*_ zE1|4}vJ%QlC@Z0?gt8LKN+>I#tc0=>%1S6Jp{#_m63R*_E1|4}vJ%QlC@Z0?gt8LK zN+>I#tc0=>%1S6Jp{#_m63R*_E1|4}vJ%QlC@Z0?gt8LKN+>I#tc0=>%1S6Jp{#_m z63R*_E1|4}vJ%QlC@Z0?gt8LKN+>I#tc0=>%1S6Jp{#_m63R*_E1|4}vJ%QlC@Z0? zgt8LKN+>I#tc0=>%1S6Jp{#_m63R*_E1|4}vJ%QlC@Z0?gt8LKN+>I#tc0=>%1S6J zp{#_m63R*_E1|4}vV)*(bK@W=dpY!$O^L+9Eg9pK2j^tI_K`{7VLr-YDJ1mYHj`Mu-AQ;TY z{1&~S@1!gG+w@)Zcj)iZ-=puQzfbd;?jTl6Qr}Degyy;QL9CXf=2`RsiVskHfZ_ub z9|XnuIzK=^=#d|yAEqCnAEh6oAE%$BpQfLspQm4-U!-56e{F`pLSLd^rC&D>c}{yE z2M*-GLF7Qr|NrvSymCB<97ug7HF6;JJ7``x9>{?MIdBlGEAecxx{~_+^fffkbr0mj zfqXcS4+rw$Kt3GEhl9w6{M{d+d9HgP9}eWhfqXcKe25u~d`QhJ$^-duARi7QA9952 zVtpo`!GB*$9K-zdwyvfL}j`9?k_bFVD-%5twP z_sVjwEceQCuPpb#mV4zm_sG|it}e&9M{4F?InF&& zGxy4|N}QUxSB_QU)O3E?nMqmhmE~SJR*7>wbFVD-%5twP_sVjwEceQCuPpbg@xmT8ZWw}?Ddu6#-mV0HnSC)HaxmT8Z zWw}?Ddu6#-mV0HnS9YdUjx(ivg_(QhI8zFTI8!Riy|UaZ$N5tJltbiRS?-nPURmyy zhH$r)KVz*#EB=FWuPpbLX$5~lw z=3Y6@%JOw)?v>?US?-l%Ej`CG_sVf@mYTU&j&rlr%)PSQE6crdthDDy=3Y5g+EX+4 z%CXX(nz>hwmG;!ky>hIyr)KVzW2HScbFUodd-1B|URmyy+w@8uhZ z67NvH9lD-6ly8TTZ~4<)fj^XQhw|-Ez8%W9L&vnChB}mE zhmk+|n1A}af9m+()A$td7|*rz!^oD@Tx~dX9dzhA=+Jf0p&U4j9LS&M%K2gBKx(d> zAIgD4IdCWk4&}h195|E%hjQRh4jjsXL%bj2{Sfbm!E!uju$=l6^e1VqiXXbhImGfI zmJhLfh~+~pAENjW#fQi}bX{|Z)@z93A555J!i& zIK;&vE)H>Vh>Js99OB{-7l*hw#Kj>l4smgai$hl>hptKvU6mZVDmipja_Fk$&{fHy ztCB-kC5Ns`4mtmj^A9=y&=tp_D~>}~9ETiu$bp9(c*uc=99ZGN3I|p=u)={A4y;1LHNao`aL9&z9i z2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHN zao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y z5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL z9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV| z;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNao`aL9&z9i2Oe?Y5eFV|;1LHNabT4Ls~lM6 zz$yn;Ik3usRSv9jV3h-_99ZSRDhF0Mu*!i|4y@6BSmnSf2Ua<-%7Il5ta4zL z1FIZZ<-jTjRynZBfmIHya$uDMs~lM6z$yn;Ik3usRSv9jV3h-_99ZSRDhF0Mu*!i| z4y@6BSmnSf2Ua<-%7Il5ta4zL1FIZZ<-jTjRynZBfmIHya$uDMs~lM6z$yn; zIk3usRSv9jV3h-_99ZSRDhF0Mu*!i|4y@6BSmnSf2Ua<-%7Il5ta4zL1FIZZ z<-jTjRynZBfmIHya$uDMs~lM6z$yn;Ik3usRSv9jV3h-_99T^UKK;J9{(TY}`?*46 zKUe6pH1>1FaePZ#=yR{cyPU&~?+K0lT%o^2V?S3Mzmdj%t~h=ZjeQew9Q(OKV?S4D z?B@!N{am53pDQ%>bA`r!uF%-e6&m|`LSsKyXzcC@js0Aqv7ak6_H%{Cey-4X&v|I< z=L(JeT%oZ8C^S}hLSsKy=zD4Gn~3AsHxU~9xk6(0a#(u8Q z*v}Oj`?*46KUZk%=L(JeT%oa_D>U|Vg~ooa(AZlP8vD6IV~0`b=V|QcisRVN6&m}w zLSsKyXzb?-js0Aqv7ak6uB}40a#(u8Q*v}Oj`?*46KUZk%=L(JeT%oa_D>U|Vg~ooa z(Aduv8vD6IV?S4D?B@!7y}uIsCgM2ubA`r!uF%-e6&m}wLSsKyXzb?-9UG5*PjMXk zxkCNl0a z{wG!=V_H%{)bZT6&#^dAqG>>CHS7_|#3XT0-q3X)_C&zK@n+T14 z6QQwhB2+Dr067x-xkA+y36RGN8vD88IQDae#(u8QcTpaW1jv!tHxU~9xk6(0a#(u8Q*v}Oj`?*46KUZk%=L(JeT%q5f<{|PSM`GVZXzb?-{ieSd z`?=yc_H%{Cey-5i&lMW`xt@MsT%X3PitE$V*v}Oj`?*46KUZk%=L(JeT%oa_D>U|V zg;wcnY3!SbksqhApDT`IKUZk%=L(JeTu;9*aw%1%kxO|T-_jPEY`&Q5a-p#@92)l{ zLStPnG}h%pV_hyZ?ni{i{fN-as263_i`g;bIM(GtV_hyZ-qR9#-(%u_L>$)~$Nh*n zjx~zVHyeo++BlB;5utHEA~e?JLStPnH10=)#{G!USZ@i9b-B=3bqS4ixzJdb3ypQT z&{&rXjdi)uSeFZZH;r|9rBlJh*(N5nCoaPVH10=)@_eq##c|w^2#s~Q&{&rXjdi)uSeFZpb-B=3mkW(`xllFcnNJ)~>5R_l zg2p?4;-~S>pU`;US7^MyF7$WlAJ9Lfe?vEy7E*Bc> za-p#<7aHqwp|LI(8tZbQW+u;z;yCU{gvR}d&{&rXjdi)uSeFZpb-B=3mkW(`xu;*u zb-B<2Ez($*i;-BD3ypQT&{&rXjdi)uSeFZ}(pZ;^xB(EAmW91|? zR!%}=wAUWCTZi_ni4`6&Gu{W$$3{WMKKKZ&$S{Q~_W{SuAUzZg%SKgsKk(67>1 z<$L-`eGSbtc#^C1p_v9xq`{L&gP4;z!%6*7dvBM%X zc36bI-pC{Rm?q;-g7JKYchGoecpRtOpX7B!s5uOl^Elqo8fx}};v7+X@SD$|qF^@1 z|CYvnia7p9J?5YTjT@|6Rt0FXZRfNW_iqLQ7^8^>E1zM!vN1vvLv_gM~9@8p) zEqxvRar#p-g)uUXI6S`mJ^Rbx;#KHg){9j=$FN*E;@M$6xFCYaM^BdrrPF(zz%>1>Ezt-{Bc_%JLvg5CH{B_=mi{tG0YaM?b z#N}~z{B;obUqiFwuXX&jj=$FN*E;@M$6xFCYaM^BdqC{I!n1*74Um{#wUh>-cLOf34%Mb^NuCzt-{BI{sS6U+eg59e=IkuXX&jj=$FN z*E;?>*94wk>-cLOf1P*YVk8+~V|4PyM~Xmi-cLOf34%Mb^NuCzt-{BI{sS6U+eg59e=IkuXX&jj=zrUntaae_-h@1t>dqC{I!n1 zjtq&P>iBCNf34%Mb^NuCzt-{BI{sS6U+eg59e=IkuXX&jj=$FN*E;@M$6xFC>s;%2 zdYx+>p$nQFf34%MCDK~QU+ehmTdqC{I!n1&O32Wuk%h^Xm%0>ekI9a|&O33T+40vp{#wUh>-cLOf34%Mb^NuCzt-_Db^J>m z|1z@f<)<%mB``EQ{-ut8DZwsv{7cz&spDVj_?J5VrH+58<6r9dmytsGJlXLtb^Oan zp*+s+aH->8>iCzDKRJ^9;!?-I)bTHM{7W7GQpdm4@h^4!OCA3*(k6fFV>CPdWu#4N zcKpjoo7C+1mpcAsq)i@Y$G?oUNzIObspDVj_?Nk&`1GZYf2reN>iCzD5AjH8a48Kg zrNN~%xYY44b^J>m|1wt*Uk2mfj^ph3m%;eg zLeuS+I{u}Of2reN>iCyB{-ut8spDVj_?J5VrH+58<6j1|`E1$oFN4-l9sg3tzYHF8 zBs>0P@R*t%|5C@l3?B11JN_lUF41&}rb{$kqUln{ztr(Bb^J>m|5C@l)bTHM{7W7G zQpdm4@h^4!OCA4G$G;3N;x7glsoC)_gNxMc_?N*&YIgj~;373U{$+5HnjQZ#xJb>8 zf2reNX2*Z#hrjdPuWUl2Glu@Z^xwVm`8fXIEB`k1&*{gFe3Hg>O^nC6`ZGWL)E@oc z=ugvsMgMpDf6$+y|0n%f+IZzj{O&K)2l<>&{a?oaZ~FgGuji>h$m6Hu+Ul7fe&#i= zd@S?_XsoBjajc|;MwbbVE)(jNJmZx-^Dm8fJhX8xtR9=y zW3zhvojI$=-hUuhUu}X}b^bHp+GF_tX0b2rZ$>G+UPCgx*`|y@b$fNSs7nL<%AF-h1!8 zcS0gj6JVL%JH&P@(R+tQ=X>72lLc$-eZGCpzOJ)!22WZc9Lo*sdkcTC#iOlYA307l4>WZ zc9Lo*sdkcTC#iOlYA307l4>WZc9Lo*sdkcTC#iOlYA307l4>WZc9Lo*sdkcTC#iOl zYA307l4>WZc9Lo*sdkcTC#iOlYA307l4>WZc9Lo*sdkcTC#iOlYA307l4>WZc9Lo* zsdkcTnpD%InkLmWsisLaO{!^9O_OSxRMVuICe<{lrb#tTs%cV9lWLk&)1;av)ikN5 zNi|KXX;Mv-YMNBjq?#txG^wUZHBG8%QcaU;npD%InkLmWsisLaO{!^9O_OSxRMVuI zCe<{lrb#tTs%cV9lWLk&)1;av)ikN5Ni|KXX;Mv-YMNBLNVSVpyGXT*RJ%yEi&VQv zwTo1{NVSVpyGXT*RJ%yEi&VQvwTo1{NVSVpyGXT*RJ%yEi&VQvwTo1{NVSVpyGXT* zRJ%yEi&VQvwTo1{NVSVpyGXT*RJ%yEi&VQvwTo1{NVSVpyGXT*RJ%yEi&VQvwTo1{ zNVSVpyGXT*RJ%yEi&VQvwTo1{NOdbo^~K>^Nvf*OpsG8xt!(+Zz0}93@>^qBeuAp* zvbK_h)mMLG``=ZSgjJQF8%vd+T1Xv9m1mK%yef4+x%=Hp@>KOe*6_HJo_w#QCsopW zSL#yK<)|xAH&@$BCaP{t-JZGwb!W9t$wXB~A!(?+JTi6P{AP3bWJz9CU2WqS z)K0YrISaCXISZr*$NZb;pTx-oSp_PH}ve&-_JHHNw?bu4u^ z>h9D%cocc1glxGNbzka!>}`MQfz&IhS5dE~l8<;$Bf5{hDUFlGhO8NGsQnCgr~!3} zKW~yXOHr4ju0UNy?M-@3RmLm5rk2;CGHU5HwT6)n-<-W|$r^dZh^*h9x&w7*>KLlL z5o$U{&at6hlI>HB8^DuQbYaV6!acVE$`y|UxQ=g?iPkosqf1Ua^^;2~oMW(8s zQ@^BsMg5xko7z%js%onJjIgLS)unn=pBkxS5TB|JXN|n3LY9*%=MinJSwU(Rv021s zZ6!8~*eqhRh|MB4i`Xn;vxv31i#AapQR%_H5%*wp2sydHZnYUF{VzZ7Cn{|}fEMl{c5}S3D*sP<( zW*sFq>nO2VM~TfMHtQ&{S(*RU-jvv^%vY)^v00h_RaIiMGXJX)DY03^W*sFqi`Xn; zvxvn@4OOv3bPi5t~PB9od5nDuT5wS(Y77<%SY!R_V#1;`-L~IeUMZ^{nTSROTu|>od5nDuT5wS(Y z77<%SY!R_V#1;`-L~IeUMZ^{nTSROTu|>od5nDuT5wS(Y77<%SY!R_V#1;`-L~IeU zMZ^{nTSROTu|>od5nDuT5wS(Y77<%SY!R_V#1;`-L~IeUMZ^{nTSROTu|>od5nDuT z5wS(Y77<%SY!R_V#1;`-L~IeUMZ^{nTSROTu|>od5nDuT5wS(Y77<%SY!R_V#1;`- zL~IeUMZ^{nTSROTu|>od5nDuT5wS(Y77<%QYzeU?#Fh|SLTm}KCB&8xTS9CJu_eTo z5L-fQ39%)_mJnM)YzeU?#Fh|SLTm}KCB&8xTS9CJu_eTo5L-fQ39%)_mJnM)YzeU? z#Fh|SLTm}KCB&8xTS9CJu_eTo5L-fQ39%)_mJnM)YzeU?#Fh|SLTm}KCB&8xTS9CJ zu_eTo5L-fQ39%)_mJnM)YzeU?#Fh|SLTm}KCB&8xTS9CJu_eTo5L-fQ39%)_mJnM) zYzeU?#Fh|SLTm}KCB&8xTS9CJu_eTo5L-fQ39%)_mJnM)YzeU?#Fh|SLTm}KCB&8x zTS9CJu_eTo5L-fQ39%)_mJnM)YzeU?#Fi0TMr;|eWyF>dTSjadv1P=T5nD!V8L?%= zmJwSdTSjadv1P=T5nD!V8L?%=mJwSdTSjadv1P=T5nD!V8L?%=mJwSdTSjadv1P=T5nD!V z8L?%=mJwSdTSjadv1P=T5nD!V8L?%=mJwSdTSjadv1P=T5nD!V8L?%=mJwSdTSjadv1P=T z5nD!V8L?%=mJwSf0X(dRs9BJhWzeZ)tBWr4l~53Y$M)e z8#%vMNL9blo+0N~*2~#>QL1`fXmylBokFXRgWc^sQNkeOX^qDuc^PO@0CncU5vVn)R~NECL@~3h-S*`C3Z|Z|_)B^JJZQ zvd%nNXP&GxPu7_y>&%mN=E*wqWSx1k&OBLXo~$!Z)|n^k%#(HI$vX37oq4j(JXvR+ ztTRv6nJ4SalXd3FI`d?md9uztS!bTCGf&o;C+p0Ub>_)B^JJZQvd%nNXP&GxPu7_y z>&%mN=E?eS^_%57^JJZQvd%nNXP&GxPu7_y>&%mN=E*wqWSx1k&OBLXo~$!Z)|n^k z%#(HI$vX37oq4j(JXvR+tTRv6nJ4SalXd3FI`d?md9uztS!bTCGf&o;C+p0Ub>_)B z^JJZQvd%nNXP&GxPu7_y>&%mN=E*wqWSx1k&OBLXo~$!Z)};+Yv$<-_=BhE9tHx}u8nd}-%;u^wo2$lbt{StsYRu-UF`KK#Y_1x!xoXVjsxh0Z z#%!({v$<-_=BhE9tHx}u8nd}-%;u^wo2$lbt{StsYRu-UF`KK#Y_1x!xoXVjsxh0Z z#%!({vt^`j51%b#e0%sDMl^>J&0$1y7||R?G=~w*VMKEn(HurJhY`(TL~|I?97Z&U z5zS#la~RPaMl^>J&0$1y7||R?G=~w*VMKEn(HurJhY`(TL~|I?97Z&U5zS#la~RPa zMl^>J&0$2nGON5eyjNxwRn@EbdS#5COI5E$?3FR9s$PrOD`Qkuy%w=o#;De-*CO`H z93oZb5LMM{5qo9cP*uGau~+5|Rn=<|dr700G8a(H*_(PT zVy~p9s(LMAucW7{dM#qFq^IgvRP|cKUP(`?q^GKSEn=_qh^p$fh`rJys;bu__DYYa zx)@cx7O_`y{(Sgc$ywFAsOnugbFnm6vb{o<)q9lYlI>jl%$01_HtIb}b0u3<*PyC* z)6A7wS5@_Hnz=ITs;b^iGgoF^Rn@y`=1STRN>%Ssnv1=;GFz(k>fJPRWwun6!gKbMZVE&vWHW z$??dUQdPa1X0DtsRh7EAa;8*O_vCYNJ{RY6aXwdO9{DPI=c2cdRQpJ^PxO91ypL4- zNVSht`$)BqRQpJ^k5v0ewU1Q$W@OhG|s%jpaCwIj!N}a))nSY)l%j(sY^W<8l>dP|o%#(!Gdi5Ibd2&~* zwts{A8{hT2s*<^?>NVc;xGSC~S2x*%T-{_3a&=R66m?bV8q~F@>rvOIZb03Tx)F6_ z>Q3xgy<&DAcg6F#E1t()@jUK|=W$m&kGtY|a#t+JDR;%H%BSH;-IuCfF*{GrvZ@EF zamiU$$95I5S=+!d?Z%lao-ewz9$^?B;c9Qo_ix2d11^C(w*RX?YGN&SlYHT5^O zrCjkQX(bPmQRHsUsONoVpBEy<&Er+!f35%U$t{!v_&Nh}c2I4kC6C zv4b)voFdyOv4e;mMC>492N64n*g?b&$}EwSEtS|o#10~M5V3=Z9YpLPVh0gBDEDIz z%J%9E4$6F@sycUrGM}ib&fuWTC#tIRI4JXps!Hr2&*KIWJBZjp#10~M5V3=Z9YpLP zVh0gBh}c1ymwIJCO6(wF2N64n*g=_>)MF{JgNPkO>>y$X5j%+3LBtNq^SF1156Y}{ zk5nagP-ZPvmDoX5<7_4 zLBtNq^EmbBO6(wF2N63c&*Rh@C3aBeG#QILk5gMJv4e;ml;?43S&1E#=W(hkv4b-2 zsUufn2W8$>y$X4qsIzb`Y_Hh#f@iAYupQ9#uvv_o%8Wv4b*~ zs;a~eB6d(_RJE+c4kC6Cu}#D_5!*y;6R}OiHWAxIY!k6f#5NJzL~IkWO~f`4+eB;= zu}#D_5!*y;6R}OiHWAxIY!k6f#5NJzL~IkWO~f`4+eB;=u}#D_5!*y;6R}OiHWAxI zY!k6f#5NJzL~IkWO~f`4+eB;=u}#D_5!*y;6R}OiHWAxIY!k6f#5NJzL~IkWO~f`4 z+eB;=u}#D_5!*y;6R}OiHWAxIY!k6f#5NJzL~IkWO~f`4+eB;=u}#D_5!*y;6R}Oi zHWAxIY!k6f#5NJzL~IkWO~f`4+eB;=u}#D_5!*y;6R}OiHWAxIY!k6f#5NJzL~IkW zO~f`4+eB;=u}#D_5!*y;3$ZQ4wh-GwYzwh1#I_LILTn4MEyT7E+d^y$u`R^55Zgj* z3$ZQ4wh-GwYzwh1#I_LILTn4MEyT7E+d^y$u`R^55Zgj*3$ZQ4wh-GwYzwh1#I_LI zLTn4MEyT7E+d^y$u`R^55Zgj*3$ZQ4wh-GwYzwh1#I_LILTn4MEyT7E+d^y$u`R^5 z5Zgj*3$ZQ4wh-GwYzwh1#I_LILTn4MEyT7E+d^y$u`R^55Zgj*3$ZQ4wh-GwYzwh1 z#I_LILTn4MEyT7E+d^y$u`R^55Zgj*3$ZQ4wh-GwYzwh1#I_LILTn4MEyT7E+d^y$ zu`R^55Zgj*3$ZQ4wv^Zr%Zb-q{@A))O-JYTdKToNb1Z#d!@=1M5?@3QR>UA zd6g>nv9jiMwwHH)$?|V}*YB!|SXJddR;s*LQL4Q2OKL`KDPmO}MU{7c$+G->UaGuz zPpZ5JN~*l`ORBsRO6rExji~a@FIgjZ1ybccR;s-7OX?V^yz@(z$5Q2;U$QLk{E{l~ z{E{l~{E{l~Rg}6fRqhI8S?&s?$~(WLUP--*D)0P~HRK~=)rjOiR;v8mV8n7FR@R7E z*_((}HK58nzhqh7`6X4}`6X4}`6YD~wKox~D&rNgYFXZ^D3wu*ShdVZMXcJVyz@({ zyz@({yjM}Gyz@({+!aWb`&g;+&M&Fc*sl!<#@BETwxhs&`#u|C&*N7xy zlZZ_sHi_6IVv~qXA~uQGBw~{?$M(wiDzQn#CS{IQdsAYQGRI0qY!b0a#3m7&L~IhV zNyH{)j+O64Y!b0a#3m7&L~IhVNtt8iab=EGRf$a^Hi_6IVv}l)mGw$&Qq8eamDnU= zlZZ_sHi_7znq%dwN^BCbNyH{)j#X=v*d$_;h)p6kiP$7!lZZ_sHi_7z%&|9(NFp|g z*d$_;h)p6kiP$7!lZZ_sHi_6IVv~qXA~uQGBw~|@O(Hgl*d$_;h)t^BN64cqu}Q=x z5t~G8Qs!8-UWrX2Hi_6IVw39k5wc#1O{(8VNL6B!h)p6kiP$7!lZZ{q9Q&?pqr@f= zn?!69u}Q=x5t~G860u3dCS{J5M?q{7u}Q=xWsa5P5t~G8Qs&sVN3^4~U6g(<%kruN zscJ@T$EW%Po?cm&-_c8bnQi1%2ePcJwu@C&-%u5q?Z|9LX1mDzQPz*7%4b!{@~TuN ztsQCYNNY!0JJQ;b){eAxq_vAQwf&w{`8-Kk-j}-HpEX(DpL(D=DlD~Qsa+JwDAbi& zsyrK#suZbD?@?9Fd+O7BRNYd2uXs>(d#b#CK$dq_dlnC>$}<|NhpWexv#%;CsjI3i z%g<(|$}<I|Gu|#|Tr!t4 zuBxeWlQXWWO_fi0mSvCXQ{^`@vPOO*BUQ~y?Q)h?T|sIG=U09H&x^7wzqybqzqydA zu9)icf7E()Haj?*9dhnuS~ zpAjj#AVn9b&-Uq+HL45LXZw6ERdqp%E=ZAEiri9kL5eO&(FG~GAVn9XB*`B~r09Ya z^KFVQNYMo;x*$atr09YaU67&+QY4=u`4q{gNM3z9P)+u!x`0mylB(_jQglIzE=bV@ zDY_s<7pTt#x@m;^Tp(3d7w|bhQdJl5IX_ZW7pTwqkv-D|DY_uVc}a0zQglIzF5uIC zWJ}crDY_s<7o_L{^(jE=QB)VGPXSU@U8z%aL5eO&(FG~GAVn9X=zU0^q^GL1?rQ9dZnr^=;Um6 zayC2Zf=;@ilP>6#bNBg(PR>Oq=c1Ey(aE_`pDA>Od{uRU`b;6&8(qNX1H_sCK&q-PP@e)Md!P$CNxPG@JLv-T`9EqK)dhV1k5ttKopeDbUC>Dv zbkYT#bU`OwpgtW)ZK=9IeMXR4R$b6ZK54ojO-g)H(1SwrAWavf>4G#}kfsaLbU~UfNYe#rx*$y#r0Ie*U67^=(sV(ZE=ZGn zn&i_YpC)T`!wRo8+vU67^=(sV(ZE=bb_>Jx`<8lgUMNLAGZ>Jx`lRo4PO zK}f2)7Vrr|QdJkIPY_a7T?^8jmo(=kO&6r;0zOAbzN)$)O&6r;f;3&AK3_;Zis}OO z`9i9yE=bb_X}Tay7o_QeG+mIU3(|B!nl4Dw1!=k1rbkPM}oQp2bMHlCy zi*unqt>}so>eGr;Rb9X*5lL0o0zQdIs=5|*(FN-Bh19a@0`>Vqs;VwfpD!ePpbNT4 zyNk5D=mPc0LTVe;1$?rQRMiDtbU_zg&_x$?(FI*}K^I-1K6glMsk%UY`jA>yUC>27 z8M+`tN*V5mGIT+PF38XY8M+`t7i8#y3|){Rw+y*u=z*; zhAzm^1sS>^Ll*;hHF8FJE9C- zkl`$6ILqCf-)_2~n=a_43%cooZn~hGv)Rqr?4}F4>4I*$pqnn}=3I1hF1k4v-JFYV zx}cjb=%x$0xfXQO1>IZ=y6J*$x}cjb=%x$0>4I*$pqnn}rVF}ByPLGT>4I*$pqnn} z=8mYFF6gEUy6J*$x}cjb=%x$0>4I*$pqnn}rVF~sr(5NtssC+Yys7CdY1$6j74w&M z&DZ{zzieo(K79VNsV%MVIe*#GeEpR9%eFR5zkmL+BkKp}FMFD)e=~nM)Vhov<}b(A zGf_N$Iianz$nrzWav+N?dgA4de_6)3X!rbOQ`Qe>IZ(&H$Z;%(vb^xHOIVH=*J&&#Sl*fCg=IN0Y$VHz%JQ&b zGg)3tZL`R4EH5t0%PcaFe+J4wZEU&=&9a&yUmJ^Gd!*aV?KWr%H4q0AoSit&DS@wqA#&TMgokg}} zxm%VKiw>Qmb=C5){k6@svR2WiYg4qWHc6YT)wDKkHEk97vznIq*YfIrTVC^T%j^7Y zdEI|4uPWcY;Cok<{j_OYX*+7W$$z($$LWzj6Xj7$Jl6R6OX~3t(x%F~vTRe;Mrzt- z<;wIa*-4XYZL6)a%4!)^SEsH?U5C1^s;jO-U9D}a9d~Qna!OCn#B!_Jm& zayPU&ABw>tXc#~v{iVU-?<>b)D%PFeLnu)UJ@27HYieG>V#xPX2#+f;d+39{uu9La*cFYwT&?fM^M zZxbtO(yvr2s^{mDG?(0Q0V|EPw} z<}}%|K;8$D>s0ccD92l1`Wl*!+O$1H)L3n6Z6}$+#>$>YOWW@y|J_5D#>gM_@3FFG zeOagWsUBI4T1}-rWcc^v$zold+a5_@eTT9=g*<8`GL-NR+7`0!&E#>1_CH$NRE}eN zjzvBCP|jQO?;T~^UFDBDuRFo&D-?>!hXF*@6xuH$Q*CQ#6BWE?GtMj=R*{FUTN~u5!>dYu@Lp?ZNma_a?B{WX{ zsyRYkrvB64|L#atm#N8hlI(B685iN>QI}0M zpAOBY(`291WVHV|hYt1gf<9JrsLEqB-K@q~l|88WH7g@lvp|n_sQjzvZ+)ZsOU*Y6 z`by=Zk{;@yp`<3ragG;#MOi;|iJe9VjhEUc>($Y#Syw6j_tC1o56y7uv5PXB3<>?O zTQ1P2W)O9(L;X9nbwwUu&DBG5ih88KW{iJ-yrE827yQ4v^*@hZ9n*jJ_-ebMaSWZ8 z1#_S3J~hGuDXDpVXvBX#g37BZYt>P!nL-)(&qq~TtD_p47nHrBnQ&-?|31t9Zv-k= zWB--^e?8AbNA&OGQ{6I6j(zAzhO$%FY^7>w7FQ-0%&N+&n*UTk4hd1$KXnCB;wRHd zLtFfJqc6%n7u*c~|Czxy|7Q8$uc!a@tSbu(uGs39OU(uJ|Urtq$3$8ZmQ5ReZ7CgF|vDG#U?3HB;bsi?kQK_RDIu<2J$r`%%Q0M&L$2;`3 z1^ZC*keU-0*!$}{)e)$fv><=g-v6g@R%NT9^4 zuDMv5TI-q8#yzyGsEnIZYb#Iu*S+|6Km7PP3c*$ZF+fX z+xT&%wkbUmveluR@1C}7t!-Rs!l?3;wqkigcH(rkVrprEJVb4BPn$ecv8wj3{-N&Q zx9TbNOc_^b+j;6ih3xpY?X%;1O4XjWadISTO?7h5gtmjGv$?u|Z`*bLqql8Ymc5Rv z$!&3_ttTtHo6>g3{M+Q!7d*iHy=B_uXj0>9>VT)Tl`HC-I^`&*w-v^zvCsd$kwHKv z3!?aIP!rm+B@SV7xgukjEW46XP0JPvZ3p$VO|AA!oLb1V$#ajkJ+>LU^-jBuZ5zGg zUTu4f9y4b2j$`*)U$(4GF3VSY4(S=%PqtVoWMyQMZH$?H~(2Md{1dsy&5?VqG4XZiqxh2(}qYd48Y%E4mEX7spMPGg9l3X!*)tM=B$wkruSu{BBkP zhMGXl3o=2FURj!Wl8iz2QkF5w>@l)!{^QEORKC-s$^Z4mj36!a$dLczF{?G%2LdKe zDHs3k@ntIee|JZ=;I2~5tm?VpD4D@4GS80W`-`%~bK3vVs`{bOGqE;mQl&6*a;+#^ z9kSeKGUaO4#?~g*PSyt2?$)~UGqN3J%3bi&0WGm~LQgE7SmQs}|NB<*uc4>n6S%ni zwU3q@jCzWwS<6|gTH9G$SsP0IFOTvcds9zP)x})h7N}dy!{p*WUCZm6s-yjnZPkTn z!O^OlCUrTIk;#82=!?ozfAz1wk4TPX{!OO3{Hjae*i=RJCy{s9FZY^<$r%3uYR8NU;o#cmUX&j=!X1k&(dto z(Ok`wpG5~+s6|?=CA5XKg|$WGC$x)di)o8%OK3}K!?h9GQrgnmGTO4*a#~UjXL)S} zZAEP*ZDp-p>(EkKrxwvo26 zwuua9Q;B7Bc`CW3oR_WT7H3;+J9)CXgIL)~o@VYMPd0azo88^C-Q@}Mp7Qi>Z*3oK zUu{2af9(M6K#AZE?RxD5?L_Sn?IP`C?Ii6i?R4!*?N;pu-PBIg=4!`l=WE|;-)U#+ zmUfD6YxA^kw5zn+v>&wZwI8+Xv^%wDw5PPY5J=2=u7Iu^%43~`qKI``m*|RdQ$sI`&n<(m)BR&SJYS1SJvD04n3uJ z>S?`8&*k@l|kp1!fZ zi9TB2RNqYBT;D?9Qr}A7THi+BR^LwFUf)5xN4rHt;qwlJZ)pyf(*Z0tV z)qd07*FMnq)c4Z&*7wo()%Vl)*ALJS)W_)u>ErbYdXGL)pQKOLvwBX?>jk~2$^R>< zUe+u6!P{ZM_newco^euRFcew2Q+evE#sew=>1eu8$BexiPo zezJaweyV<&e!6~!ex`nwezty&ey)C=e!hNzexZJmezAUueyM($ez|^yex-huezks$ zeyx6;e!YH!exrVqezSgyeye_)e!G5$ey4tyez$&)ey=`5zfYg3&(iC9L%&~tKz~qw zNPk#=M4zqC(I3?x(;wIWq4(-f=uhfT=}+s==+ElU>Cfvg=r8Io=`ZWA=&$Op>96Z= z=x^$8>2K@r=yUZxyD=jnrbQ*Y_->hJ0A>mTSJ>L2MJ>!0YK>YwSK>tER;(! z>)+_#>fh<#>p$o}>i^V#(tp-}(SOx{(|_0h(EpTQy6A>sn1*H8hGV#fXZS{7ghph< zM#5OgSlC#^7-lSLEM_cjEMY8Z3^zs?OBqWW%NWZV%Na?d%~;-8!C28)$ynKFH#&@z z(P^ZOE+b=f8zYTT#wy0D#%jju#u~<&##+YO#yZBj#(Kv3#sB*V@qQzV{2m@V_Rc8V|!xBX1OpqERx+M#VVTm||3onlaTl#F%CrYD_l{ zGY&V7Fpe~iGLANmF^)BkGmbY-Fitd1GEO#5F-|p3Gfp?oFwQj2GR`*6G0rv4GtM_I zFfKGMGA=eQF)lSOGcGr-Fs?MNGOjkRF|IYPGp;voFm5z%GHy0*F>W<(Gj2ETFzz(& zGVV6+G43^H821@7jaf$BXlQS1E#rRU0pmgAA>(1=5o5M7$9U9u%y``RhtX?1VLWL( zrS)n3+JM&7-q8k)r;TTfXN~8K=ZzPP7mb&UmyK79SB=+<*Nr!fH;uQ9w~cp6)JDn}Hdckr|r_b0KqKa}jfxxv06A zxwyH6xuiMV9APeHE^RJjE^97lCe1c;d2ZfKnH!s%n4`^2&CSfs%`MC=&8^I>&27wW z&F#$X%^l1g&7I7h&0Wkf=C0;gb2oE$a}RS*b1!pmb02eGb3b!`^8oWebDVjQIo_OL z_LvjRN#%*O+dRiS*F4WW-@L%Q(7edJ*u2EN zRJ+)`%)H#ZLc83&(!9#N+PucR*1XQV-n_xQ(Y(pL*}TQP)x6ET-MquR)4WUWF7A zhGkloWm}HrTAt-wffZVj6x-Yr1uqb+~neb)hob+0wUy3d+v&9drN!@A#kzg%#F}l*u^zP^vmUqp zVf9*1SWj9{Sx;NfSkGF|S-Tc22;TAx{;TVGgTT3=aTTi;mUTHjgUTR&JoTK}|u zvVOLHv3|9FvwpY!u>Q0)Tel6{v@P4V9ow}%+qVNdv?DvV6ZS&(!uBHeFndvZF?(@) z342LL*Rt2P*Rj{N*R$8RH?TLfH?lXjH?c?Co7$V%o7-F1TiRRMTie^%+uGaN z+uJ+XJK8(hJKMY1W9(h+vG#8E?)Dz`p7vh$-u6EBzV?3h{`LX(f%Z82AbY$$!S1mq z+LP?bcGk|>dAnd2?UG%#EB3+m6uWBI?5Xx4_B8uYd%As?eYkyueWZPqeYAayeXM<) zeY|~weWHDmeX@OueX4z$eY$;yeWrbueYSm$eXf0;eZGBxeW87keX)IseW`t!eYt&w zeWiVseYJg!eXV_+eZ75yeWQJoeY1UweXD(&eY<^!eW!hweYbs&eXl*kzR#X%&$8=w z!@l2sz<$tv$bQ&<#GY->u^+V`vmdwrVfWfk*iYI|*-zWg*w5O}+0WZA*e}{I*)Q9# z*st2J*{|Dg*l*fz*>BtL*mLbZyWbwL=h=gH({9=C+V9!#+aK5;+8@~;+n?B<+Mn5< z+h5pU+F#jU+uzvV+TYpV+dtSp+W)kFvVXRJv46FHvwye$u>W*4M|TXzbS%eq9LIG$ z$9DoJbRs8q63#--!p-XxHH08%30c3##z=`&Ph6L&hpL*&Wg@T z&dN@^JTFQ)ole^6axzZ0Gg6)Ucetmdrltl_NbtmUljtRv5!)^pZ(HgGm{HgYz0 zHgQHfn>w30n>$-LTRK}gTRYo0+dA7h+dDfrJ32c#J3G5LW1L-`vCeMJ?#>?0p3Yv* z-p)SGzRrHm{>}l;fzCMRAZNTY!Rc`(I+L8qPS(jed8gnMosv^_D$c>q6sPLcoT<(s z&NSyxXS#EkbGUPabEI>WbF_1ebF6cmbG&ncbE0#SbFy=abEtebE9*UbF*`cbE|Wk zbGvhgbEk8cbGLJkbFVYQxzCyD%yQ~Z!@1viz9*9oKa|*LMRqbR#!*6YfIp!tNsOFn3XRF?Vry33o|% zxI4mK%3a!B#$DE3&P}>)?(*&m?uzb8?#gbv+u^3%PB-m#xf!?H9qEp8S8-Q$S94c) z*KpT#*K*f(*KyZ%*K^l*H*hy}H*z<2H*rV1o4T91o4Z@MTe@4hTf5u1+q&Di+q*ls zJGwi$JG;BMW87WcvF>i}?(QD$p6*`m-tIo`zV3eR{_X+pf$li>Aa}ew!R>J;x|7_= zZr07YdAHye-I7~&EAGMW6u0Wu+^Oy%?lkvMce;C+d$@aqd!&1md$fCud#rn$d%Sys zd!l=id$N0qd#Zbyd%Amud!~Dqd$xOyd#-z)d%k;td!c)gd$D_od#QVwd%1gsd!>7o zd$oIwd#!t&d%b&ud!u`kd$W6sd#ih!d%Jswd#8Jsd$)U!d#^jgz0aNL&T{K+!@b{q zzVxG%adxi7n~xUage zxv#r#xNo{|xo^AgxO3e;x8EIb=edJ!(`~u$y6?H~yC1k8x*xe8yPvq9x}Uk9yI;6p zx?j0pyWhCqy5G6qyFa);y8m>4a({MzaesAxbANaLaR2l)PxlPZ^eoTz9MAPU&-Vf^ z^dc|z65c}I!rmg@FmF+BF>i5i32#YnxHrOE%3Io7##`1~&P#f2-tyiG-iqEz-pXFP z*WsnSPA~0sc^R+U8|jVmR`FK#R`XW(*6`N!*7DZ&*74T$*7Mf)Ht;s|Hu5(1Ht|M# zn|hmhn|oV$TY6i0TYKAh+j`r1+j~2BJ9;~LJA1o$W4v9xvEFXp?%p2Wp59*G-rhdm zzTSS`{@wxJf!;XpAaA@k!RzrRdXv1#Ue?Qbd9UCVy^>eVgcd2)oce!_kccpigceQtocdd7wcfEImccXWcce8hkcdK`sce{6o zcc*ukcei(scds|YyU&~H&GPDA!@J*mz;T=lg!(hkoS8e!^eKU)W#7ALcLWFXk`qFX1og5BEp- zOZiLt%lOOs%lS#a&0pSM!C%o|$zR!T_dDe0Yn^`D@A5N#xBR?ql)s9oihrg%4m%q2akH4?KpTEC?@#c1{E7Y~f3lzT zbAH}0_(i|um;H)=us_AG`Za&5e~3TLKh&S@ALbwKAK@SAALSqIALAeEALk$MpWvV9 zpX8tHpW>hDpXQ(LpW&bBpXHzJpW~nFpXZd z^dIsc_8;+Q`*Zw9{m1;r{eSqq{uBO_{!{+b{xklw{&W8G{tNz#{!9ML{ww~g{%ij0 z{u}dpx^Xc{=5Er{`>w1{)hfY{>T0&{-^$D{^$M|{+Iq& z{@4CD{j{`dY5{*V4Y{h$1w{a^fF{onlG{XhIa<@f%2U<77h1$N*BZr}xe5CmZm z1#yrF777*)772z0iw27Yiw8>tO9sP(5y4Wy(!nypvcYmeGH45y4^{|P3|0zO4%&l` zAQf~5>7Xmf1l_^NU{tV5uxhYcuzIjYux7AUuy(Lcux_wkuzs*Xuwk%KuyL?SFgn;Y z*euvQ*do|6*ecjM*e2LE*e=*U*df?4*eTdK*d-Vf>>7*>b_;e7_6YV2_6qh6_6hb4 z_6zn84hRkm#svoj|jptXz*C@c<_&)H+Uj=GI%O@ zI(Q~{Hh3<0K6oK`F?cC>Id~;_HFzy}J$NH{Gk7a_J9sCU8}tSJ!9XxC7z~<0D|k0} zFL*!rAowu&DEK(|B=|J=EciV5BKR`+D)>71Ciph^F8Dt9A^0))XYf<-bMQ;>Yw%m} zd+)67=&RMg>je&7YY{+7YT=ji-wDZi-${uONPV45#dtd z(%~}Uvf*-JGHeT%4_63R3|9(Q4%@?yFco%&>98xzgx%rDa8$TTxN5jsxO%uoxMsLk zxOTWsxNf*!xPG`nxM8?axN*2iI6B-k+$`KY+#=jE+$!8U+$P*M+%DWc+#%dC+$r2S z+$9_n?i!8_cMEq9_Xzh4_X_t8_X+n6_Y3zA4+swo$At%lhup!)wB8 z!|TH9!yCdI!<)jJ!&|~z!`s5!!#lz|!@I(}!+XMe!x`ay;mmMWSPvWF{ow=QgW*Hr z!{H<0>~K!_X!uz8c=(U7H+&*|GJGn0I(#O4HheC8K71j3F?=a}IeaC2HGD06J$xg4 zGkhz2JA5ac8}^0$;XpVq91NRbD||P6FML1zAp9`=DEv75B>Xh|Ec`tDBK$J^D*QV9 zCj2)1F8n_HA^b7?XZTb2bNEa6YxrCEd-zBAXQV}XWJG3UMRw#wZsbLN6hvVZMRAmf z7K#>*7Kw&Mi$;q@i$_aDOGd+^5z$i7($O-}ve9x;GHQ#Kk5-6Qj8=+Pj@qM+C>3=^ z>8LBpMBUNIXjHUHv}&|kw0g8gv}Uwcw05*kv~ILsw0^Wfv|+SSv~jdaG&}XE(X!Kb0c=V5`H+mv^GI}a{I(jC0 zHhM04K6)W~F?uO_IeH~}HF_<2J$fU0GkPm}J9;OY8}&u~(LgjW8jPAzD|$D2FM2=v zAo?)+DEc`1B>FV^Ec!h9BKk7=D*8J5Ci*t|F8V(DA^I`;XY^C_bM#B}YxG<6d-O;2 zXRO6~Y{X`4#dhq(ZtTT=9K>N9#c`a77m62-7m0_(i^hw^i^ogEOUA?F5%E&-((y9! zvhi|pGH#2Pk5`CSj8}?Rj@#poI2Cus>9{M-#NF}8cvQSfylT8!yn4Jwyk@*symq`! zyl%W+ynehvykWdiym7oqJUZSq-Ynic-Xh*I-YVWY-X`8Q-Y(ug-XY#G-YMQW-X$Ir z?;4MdcZ+wA_lWn5_loz9_lft7_lx(B4~P$p$HfQ5Z#fQez^<0IlDIsJH+~|1GJYz4I({a8HhwOCK7Jv7F@7n2IesO6HGVCAJ$@s8Gkz<6 zJANmg8~4Ti@jyH;9*moDD}FbAFMdD%ApS7^DE>J9B>pu1EdD(HBK|V|D*ihDCjK`5 zF8)6LA^tJ`XZ%zAbNoyEYy4aMd;CZIXF`+T1se%7VI}N@lW-GW!cPQ=FcBr)*~D^*WTGvxd}4*fiiwpHD<|3$9f?$; zGm%boB{GTb#K^>`#43qZ6RRawPppwxGqF};?Zi5Xbrb6))=zAZ*f6nCV&lXniP4Eo z6PqPAPi&FcGO<-+>%=yRZ4=uiwomMk*fFtFV&}vzi7|;?6Jry*C3a8jk=Qe_S7PtP zK8bx3`z7{I9FRCLF)ndXVtiskq9-viF)1-Qkxk?h`9vX6Oq3GkL?v->VoIW#s3oQ* z4oOT)9GaM(I4p5^;)ukNiK7xnCyq%Rn>a3UeBy+}iHVaECnruxoSHZ-aeCs6#F>e+ z5@#pQNt~NFFL8e2g2aW1ixL+nE=gRPxGZsb;)=wTiK`MdP!?x45 z%eLFL$F|qD&$i!oz;@7f$adIv#CFtn%y!&%!gkVj%68gz#&*_r&UW5*!FJJh$#&Ux z#dg(p&34^(!*Pi$@bay#rD zHUI!X00LkD0Z;$~aDV_vfC6ZM0a$iAQZ?C6aWeWg@D39 z5uhkg3@8qS0VRNvKq;U!PzERqlmp5G6@ZFBC7?1;1qcVK0@Z*BAQFfIsslBEnm{d} zHc$ts3)BOmf%-rLpdru*Xbdy~ngY#$=0FReCD00J4YUE;0_}kIfF0-n!~n5C91ssA z0Es{nkPM^%sX#{{&10R%dLSLh06KYW^4RQg0Lb*%;IYx;AduzJ&tsp*U?3aF0Xlmu z2f6@Vfn1;)&>iRj^aOeVy*&;AeSp3|KcGJ_02l}i0tS2R^4JXw0fqv@fZ@OhU?eaK z7!8c^*a3_M#sTAj3BW{P5-=H<0!#&_0n>pQz)WBkFdLWy%mwBF^MM7xLSPZF7+3-< z1(pHJffc|?U=^?$SOcsD)&c8*4ZucV6R;WB0&E4g0o#Ecz)oNnup8I|>;?7#`+)<% zLEsQ@7&rnP1&#s7ffK+<;1qBgI0Kvo&H?9v3&2H>&%h<%GH?aB3S0xO12=%1z%Af5 za0j>x+ym|d4}gcjBj7Rc1b7NO1D*pffS154;5G0DcniD(-UA2lAi*il79_paQC(2I`;znqVlHA1nYC1Pg(MJw|{&e7SPzT_>w^uzhF~MG zG1vrb3N{0qgDt?8U@NdS*amD1wgcOPcCZ5&1IB`JU_6)rCW1*|GMECUf*rv$FdfVQ zJAs*C7MKm@fStiEU{^2~>;`rRdw@N`USMyq57-y%2lfXCfCIrn;9zhFI20TP4hKho zBf(MNXmAWT790nT2Pc3N!Aam`a0)mToCZz@XMi)oS>SAN4mcN_2hIl7F-9e2RDEl!A;<1a0|E<+y-t3cYr&=UEpqT54acH2kr+C zfCs@t;9>9xcoaMa9tTf=C&5$TY48kq7CZ-@2QPpZ!Asy}@CtYpyarweZ-6(!Ti|W* z4tN*52i^xCfDge(;A8L!_!N8wJ_lcbFTq#fYw!*D7JLW32S0!x!B604@C*1A{04pp ze}F&1U*K=Z1Ih<^LSB%!#}vp1@`d~$e<%P7go2=8C2bG5^Koy}%P-UnJ6b@B|s(CDiBA`ep3aSp(fNDaupxRI! zs4i3wiiYY#4WNclBd9Ud1ZoO3gPKDvpq3t^p;l09sEx-2kBLxQs2$WEvO^u97$_Es zgW{nCC=p76lA#nR73v73LFrHi)CtOjvY>1z2kH!Ufx1GuP&cSM)C1}X^@4gseW1Qj zKd3)602&Alf(AoFprOz(XgD+i8VQYpMnhwuvCueZJTw8C2u*?}LsOus&@^Z|Gy|Fm z&4Ok_bD+7Plcz!)8QHLOn4SN z8=eEth3CQZ;RWzQcoDo9UIH(Lm%+>774S-U6}%c=1FwbG!Rz4-@J4tOycymCZ-uwP z+u`6Yxp+6nq*!1D}P@!RO%%@J09% zd>Ot1Uxly1*WnxRP52gk8@>bIh3~=l;Ro1VeCyKuCl_XoNvnghO~lKtx1BWJEz!L_>7MKujbQ$&VC33L=G&!blOM zC{he5j)Wm4kdjC#q%=|nDT|at$|Dt!iby4-GExNzN2(&#kO(9ai9)I)HISM}Eu=P5 z2dRtHL!y!TNCTuH(gDuiO3{mGBO33icCYMBQubh$Sh_he=2atovA>=S}1UZTvLyjXSkdw$MyIg6Y_&LbC)i^wJ9 zGI9mEid;jkBR7zn$SveHatFDK+(Ygo50Hn*Bjhpi1bK=)L!KiqkeA3SqK>Vf7%Jy9>z8}&hbQ9sll4L}3YAT$^aL2W32 zf+&Q-D1xFWhT4JD1)*nhw`X^il~IjsDi4fhU%z+nrJARA1#0uL<^yX(IRM3 zv=~|(4MR(yCDBr7X|xPl7A=RCM=PKe(Mo7#vxor+FFr=v5_ndmHZHaZ8L zi_SymqYKc5=puA6x&&Q{E<=~2E6|nbDs(lv23?D;L)W7l(2eLObThgI-HL8Qx1&4I zo#-xfH@XMii|#}BqX*D~=ppnldIUX+9z&0#C(x7VDfBdY20e?OL(iiZ(2M9L^fGz{ zy^3B#ucJ56o9Hd{HhKrWi{3-;qYu!B=p*zo`UHK7K0}|QFVL6hEA%z`27QaZL*Jtx z(2wXR^fUSe{fd4=zoS3UpXe|2H|Bxm!#puB%p3E;d@(=F9}B<&u^=oM3&Cs{fPol< z!5D&}7>3~(fsq)6(HMiV7>DtgfQgud$(Vwvn1<x=cn`eOsIf!H8y zFg64miVeetV#IV=J(g*eYx_wgy{^t;5!18?cSoCTugd1>1^k!?t5Pu$|a0 zY&W(C+l%eP_G1UIgV-VLFm?nxiXFp_V<)ha*eUEZb_P3(ox{#!7qE-iCG0YG1-pt} z!>(gDu$$N|>^61>yNlh!?qd(Ihu94y~EyPAFz+u zC+su!1^bG9!@grbu%Fm3>^JU#=fgd5FWejV!F_Q*+#e6X1Mwg{7!Sd1IDmsVgu^(3 zqd11+IDwNmh0{2Lvp9$IxPXhegv+>stGI^ixPhB^D4riLfEUCI;f3)ccu~9 z2j7eD!}sF{@Pqgv{4jn5KZ+m2kK-rsllUq8G=2s@i=V^K;}`IY_$B-@eg(gZU&F8C zH}ISIE&Miq2fvHo!|&q{@Q3&#{4xFne~LfDpW`p^m-s9EHU0*Fi@(F);~(&k_$T}` z{ssSvf5X4yKk%RUFZ?&*LF6Mm2`|E%@F9E&Kf<2~AOeXXBA5svYy?1n1Vq3DLZAdj z-~>UC1VzvUL$Cx#@Pt5!gha@MLa2mB=!8L-L@1G;C_oe>3K4~gB1BQ57*U)EBT5h@ ziBd#qq6|@%C`XhhDi9TkNHHlh8ZK4iQm#9ZX6ZMG( zL_?wx(U@pLG$oo5&50I7OQIFgnrK6`CE5|~2|Lk&h#_K$I3k`%AQFirBAG}bQi+a4 z8j((95S@rjB8$i-a){1E7osbXOLQZ;6FrEYL@%N@(TC_u^dtHc1BijdAYw2vgcwQ; zBZd^r7Vl**^7)y*J#uF2WiNqvgGBJgiN=zfB6EldJ#4KVqF^8B-%p>L#3y6ip zB4RPIgjh-}BbE~@h?T@DVl}abSWB!U))O0ujl?EmGqHu(N^B#x6FZ2V9(z3Y61#}q z#2#WVv5(kK93T!7hls<(5#lIuj5to5AWjmeh||Ow;w*8FI8R(4E)tiB%fuDpDshdt zPTU}F61Rxk#2w-;agVr9JRlwtkBG;_6XGfHjCfAGAYKx$h}Xm$;w|xxcu#yFJ`$gZ z&%_tvEAfr^PW&K#62FMwqz9Rg^d!AVZ_SbvNs<&vlMKm{9LbXcDUuQ?lM1Pl8mW^8X_BF2ezE{rkSs(NCX0|o$zo)2GK?%i zmLyA&rO7g6S+X2io~%GtBrB1X$tq+xS(U6tMv#$Y6j`0DLDnQ|k+sP>WL>fz8BNwF z8;}jjMr32M3E7lvMm8r~kS)npWNWew*_LcawkPdm2Qr3?CF96=GJ#AalgMN;g-j(o zl4)c*nL&0UGs!G6o6I3QlU>NJWG>l_>`wL|dy>7#-ee!LFWHamPYxgll7q;>zpD}YcNI?`#Arwks z6iyKoNl_F{F%(O2j$3*uk&-BxQYe+uD4jAWlM1EsQw6AkR3WM`RfH-^6{Ct%VN?mK zBvpzkO_ia_Qst=fR0XOcRf(!hRiVPEs#G;9f{LV~sOnS=swP#7s!i3Q>QeQnXsSNd zfNDrJq8d|8sHRjisyWqyYDu-CT2pPPwp2T+J!PjlP%%_26-UKW2~;ALL?u%xR4Ubx zN~6-L45|~ANo7&lR1Vdd>Oys;a;a`qcd7@~lj=qFrutBQseV*{Y5+Bm8bl4IhEPMP zVbpMH1T~TxMUAG$P-Cfa)OczFHIbS`O{S($Q>kgxbZQ1QlbS`%rshy{sd?0VY5}#7 zT0||TmQYKnWz=$N1+|h|MXjdRP;04m)OuHu|+Iz%0&j!;LbW7Ki#1a*=+MV+S3P-m%g)OqRxb&H+nTdPF^@o={JzXVi1*1@)48MZKopP;aSs)O+d!^^y8SeWt!p zU#V}@cj^cAlln#drakC8f-!I)aX*qv+~%4Z0>>i>^)Aq3hE1=xDk=-GFXL zH=-NUP3Wd{GrBq5f^JE-qFd8#=(cn_x;<^DJJ2z7EFDM3(+PAUokSn!wneIY&rE}?Sba%Q3-IMM`_on;Med&I5e|i8tkRC)2riai&>0$J6 zdIUX^9z~C)$IxTxarAh40zHwQL{Fxt&{OGY^mKX#J(HeA&!*?lbLn~Xe0l-BkX}SD zrkBu5>1FhCdIi0bUPZ5_*U)R}b@Y0A1HF;nL~o|I&|B$k^mcj&y_4QW@220|V9`UHKFK1H9V&(LS-bM$%o0)3IbL|>+_&{yee^mY0MeUrXL z-=^=-cj1XtF`UU-xenr2g-_URAcl3Mu1O1WyM1Q8g&|m3q z^mqCP{geJh|7JXxe2gdK#dtG5j4$KI_%i`aAQQv{Ga-zP0T_^h7??pAl))IBAsCXO z7@A=imf;wl5g3t?7@1KRmC+cTF&L8xW%4rxn1W0prZ7{4DasUMiZfwM38o}diYd*M zVahV)nDR^orXo{`smxSi!kMZ}H70_IWTKerObwHapnYbk~zhkX3j8YnRCo}<^pq(xx`#%t}s`bYs_`#26L0S#oT7@ zFn5`I%zfqo^N@MOJZ7FSPnl=TbLIu}l6l3vX5KJwnRm>4<^%JQ`NVu?zA#^zZ_Ib* z2lJEp#r$SH*nF%f>&1GrKCCb6$NIAYY#TC_RCR>ZG&DLS-vh~<#wm#c{ZOAra8?#N= zrff5|IopD5$+lu!vu)V6Y&*6+YiB#KF>EXw$Hub>Y$BV)CbKDQD%+7wW7F9TwiBDl zX0h394%?aS!gghI*=}riwg=mj?Zx(H`>=i4er$hs06UN!#13YMutV8l>~MAjJCYs6 zj%LTOW7%=+cyoyE>(=dg3xdF*_40lSc0#4cu+uuIux z>~eMmyOLeSu4dP;YuR<|dUgZ5k=?{@X1B0g*=_80b_ctY-No)^_pp1}ee8br0DF)< z#2#jkut(Wr>~Z!4dy+lHo@URmXW4V?dG-Q(k-fxTX0NbU*=y`|_6B>Cy~W;U@342- zd+dGo0sD}B#6D)9uus`%>~r=7`;vXdzGmOBZ`pV3d-enSk^RJeX1}ms*>CK3_6Pfu z{l)&~Jh*(EC+Ed^b3U9e=g0YT0bC###07I9oQ(rGkb^jwLpYSfIGiImlA}19V>p)M zIGz(Yk&`%?Q#h5=IGr;%lMChYa|O79Tp_M7SA;9d72}F?VO$BWBv*T>nCXs$ljfNRJ#;u>>JxTah) zt~u9&Yst0ZT61l%w*Aa=C6?cdiH5lk3Ix=K64bxqe)KZU8rs8^jIfhHyiQ@Lr}bZ!PWlbglO=H_s7xp~}tZUMKDTf{BqmT*hCW!!RZ z1-Fu0#jWPnaBI1B+1b31<#hvEPaA&!5+o__BOCzC2%n zugF*8EAv(OaK0*EjgR0X`6#|RUxTm7*WzpQb@;k`JwBSR&o|&3@{Rb$d=tJY-;8h0 zx8Pgyt@ze_8@?^yj&IM~`3`&xAIrz_@q7ZG$S3j1dKc8Q~FXR{Ti}@w|Qhph~oL|AO zl`8E7nejUG_-@tF=H}RYKE&Nt~8^4|3!SCdE@w@pw{9b+^zn?$AALI}5hxsG? zQT`ZzoIk;z@wfRq{9XPYf1iKA zKja_rkNGG3Q~nwMoPWW;gE!T;oc@xKKR zA)nwWcnRKukKil#3I0NW5GVu*!9s{&6954eAORK-0TnO-7YKp09y*`}MqmX_-~~Yt z1xb(vMNkDz&;>&8+CX^6L3Z;b7LK&f~P);Z>R1hi( zm4wPd6(L-xDpV69gh(Mus4mnHY6`W4+Cm+nu24^i7U~NPgoZ*Rp|Q|JXeu-lnhPz2 zmO?9`wa`XrE3^~Z3wEJ{5F^A2aYDS1AS4P&Lb8w|qzWB{G$CEc5IPB&LY9y%(;S+ zqNnI3dW$}yujnWGiviZq(w$#MNZ^J!McS- z5@k^lRZ$al(GX2BRLn0H5DSWh#KK|`v8Y%~EG~wLCB%|qDY3LzMl36q6U&Pg#EN1i zv9egjx_qXpSWS!&BgH7Ox>!T3Db^Bei*>}hVm&chtS>eY8;Xs@#$pq(sn|?xF18R` zimk-fVjHoo*iLM3-Qdzej1jF%TEuuUK}-~r#AGo=OcgtdX=1vVA$AfoMe9ZvF-Pny zb`iUZxnei5yVyhQDfSY3i+#ktVn4CJI6xdI4iX28L&TxtFmbpzLL4cM5=V<;#IfQy zalAM|oG4BbCyP_Wsp2$ox;R6eDb5mSi*v-e;yiJ_xIkPeE)o}uOT?w(GI6=MLR=}X z5?70B#I@o&alN=f+$e4mH;Y@ut>QLuySPK#Dee+?i+jYq;y!V|ctAWT9ug0WN5rGz zG4Z%~LOdy+5>Ja~#Ixc#@w|9JyeM80FN;^itKv2Bx_CppDc%xqi+9Ak;yv-c_&|Ip zJ`x{`PsFFm6pm#WuM8Y-dP{wzzEVG_zcfG^C=HSZOGBig(lBYbG(s9Fjgm%7W2CXtIBC2z zL7FH{k|s-2q^Z(0X}UB+nkmhaW=nIVxzapozO+DEC@qo}OG~7s(lTkev_e`bt&&zt zYoxW(I%&PMLE0#7k~T|Qq^;66X}h#T+9~alc1wGtz0y8uzjQ!4C>@dxOGl)m(lP0{ zbV52Qosv#VXQZ>zIqAG~LAoeik}gYEq^r_3>AG}7x+&d~ZcBHhyV5=BzVtwPC_R!M zOHZVy(lhC~^g?x_Z=|=AUnp`YHXAe#;(mKG{?D zlD%ag*;n?H{pA2TP!5uV12QN>GAtu9Dq}J(6EZ1NGA%PQD|0e03$iFnvMejI zDr>SX8?q^f%K7C2azVL}Tv#q57nO_2#pN)$gj`ZCC6|`V$Ytena(TIeTv4thSC*^D z;c`{Enj9fV%29H4xrSU*t|ix&>&SKGdUCW}Uv3~blpD#72ikLNzRnB9w-lz2g^g`q4F?!xI980DUXsz%VXrR@;G_CJVBl) zPm(9gQ{<`gGJ}4iO56eg7qw+ENxO_rB zDW8&0%V*@X@;Ujud_le_Uy?7&SLCbmHTk-HL%u2Bl5fj*ekebZAIneV zr}8uTx%@(YDZi3m%Wvej@;mvx{6YRGf094TU*xayH~G8#L;flMl7A~6NKebq*PX_DB(&~ zrJ53mrYR_Z8qm3m6FQeSDHG*lWXjg=-!Q>B^GTxp@SR9Y#ml{QLS zrJd4Vu`3;v7$sJTQ{t5bB~eLIl9d!CRq3dtDd|dv(n-lwvXpEkN9n9|QMxL*N;jpu z(nIN~^ip~&eU!dRKc&AiKpChEQU)tSl%dKnWwitWx29KS*fg2Rx4|iwaPkW zy|O{ssBBU;D_fMU$~I-YvP0Ra>{50sdz8J(K4rghKsl%!QVuIel%vWq<+yS}IjNjd zPAg}Wv&uQ;ymCRgs9aJmD_4}O$~EP>aznYP+){2Uca*!zJ>|agKzXPbxcFtvnQQZ1#HR?Dbm)pBZiwSrnvt)x~~tEk~>RkfNL zp+>4vYIU`ST2rm1)>iANb=7)mv|3+npf*$+sg2bpYE!kD+FWg+wp3fGt<^SaTeY3q zUbU+o)EG5ZjZ@>*1T|4jQj^sbHC64Xrm5*_hT2KZRI}7kxoS7HyV^tT zsrFKPt9{hIYCpBVIzSz$4pIlJL)4+_Fm<>(LLI4&Qb(&})UoO~b-X%3ov2PyC#zG` zsp>R!x;jIhsm@Yot8>)3>O6J6xah(OVp+6GIhDSLS3n@Qdg^M)V1n5b-lVl z-KcI-H>+FJt?D*)yShW&sqRvDt9#VF>OOV9dO$s>9#RjhN7SS0G4;55LOrRTQctUA z)U)b2^}KpPy{KMNFRNG7tLioNx_U#ssoqj=t9R79>OJ+o`apfCK2jg6Pt>RCGxfRp zLVc;eQeUfY)VJz8^}YH*{iuFYKdWEVuj)7TyZS@@ss2)bYaUuY%~SKzyfq)qSM$^S zwE!(p3(|tM5Y46m8mK`UtRWhzVH&Ox8mUnltuY#_aT>1)ny5*dtSOqRX_~GXnyH0q z`LzOCL9LKhSSz9x)rx7wwJ@!OR#GdamDb8=Wwmlzd98w0QLCg?)~aaXT2-x@7NJFI zQCfAahE`LnrPbEzXmz!ETC`SQYoImM8flHSCR$Uinburup|#XnX|1(3T3fB1)?Tw~ z9kduNR*Tc(wFE6uOVX0H6fITjsHJJ?T87q1%ha;8Y%NFYtaZ`4YPniBt-IDk>#6n9 zdTV{OzFI%6zcxS{s14EvYeTf5+AwXnHbNVzjnYPIW3;i_IBmQ(L7S*e(k5$Dw5i%O zZMrr?o2kvxW@~e_x!OE!zP3PHs4dbKYfH4H+A?jqwnAH}tbw5{4UZM(KZ+o|o+c58dIz1lu)zji=7s2$P{Ye%%B+A;08c0xO;ozhNgXSB20 zIqkf5LA$73(k^RPw5!@R?YeeDyQ$sMZfke6yV^bNzV<+Ss6EmiYfrSN+B5CB_CkB9 zz0zK5Z?w1CJMF#pLHnqE(mrcnw6EGX?Ys6v`>FlXe(N53KHXFI(!F&b-BiP8o zdO^LAURW=p7uAdD#q}_~gkDlFrI*&r=wQQ=i zy@p;>ucg=4>*#g$dU~{8UvHo{)EnuI^(J~#y_w!zZ=tu;Tj{O!HhNpVo!(xz>mBqM zJyws?3W9VNzc@?^lUvx@2q#xyXv`mH@&;wL+`2g(tGQD z^uBsOy}v#{AE*z~2kS%hq53d=xIRK3sgKe}>tpn>`Z#^OK0%+TPtqsrQ}n6&G<~{0 zL!YV7(r4>)^tt*xeZIaxU#KtA7wb#(rTQ{`xxPYQsjt#k>udD2`Z|5RzCqupZ_+pG zTlB5^HhsIkL*J?I(s%27^u78%eZPJ{Kd2wl59>$tqxv!ZxPC%Esh`qM>u2<{`Z@i) zenG#eU(zq@SM;m;HT}ANL%*rt(r@c`^t<{!{l5M{f2cpwAL~!_r}{Jfx&A_bslU=+ z>u>b8`aAu-{z3n!f6_neU-Yl~H~qW*L;tD&(tjHsMn1#S@G`s&AH&!1GyIJJBhUyk zf{hTvW&j3gKn83e25MjiZV(1(PzG%<25WEzZwQ8HNQP`EhH7YrZWxAXgc|vc0!Bfj zkWttuViYxs8O4n-ql8h?C}os3${1yhaz=Thf>F_^WK=e)7~w`$qnZ(6L>f^>b)$w+ z)2LRvT-KwZ=MQy|KaAXlybz8(WO6 z#x`TSvBTJD>@s#6dyKutK4ZUez&L0eG7cL@jHAXe)*al^Q2+%j$(cZ|EnJ>$Odz<6jpG9DXGjHkvkrgYvyfTX zEMgWlid47+1zYlwlrIrt<5%OTeF?n-n5$?%osD)j5FiS z1T)c0GLy{|Gu7;9rkUwxhS|x?G_%ZXGso;~b}_q}xn?)ByV=9+Y4$REn|;i_W!j! zySc;MY3?$2n|sW?=00=3dB8kq9x@M`N6e$^SpV%yl7rB zFPm4)tL8QHx_QIAY2Gq#n|I8+<~{Si`M`W=J~AJhPt2$0GxNFm!hC7IGGCi-%(vz{ z^S$}O{AhkMKbv37ujV)NyZOWXY5p>QhkAtO3-t{33iS^43H1&23-u2T2n`Gk3Jneo z3AKd+p2VFGNEiJ7s`hUp<<{MDu*heYN!^fhZ><~XlQ8u z&;p?aJ*zbgbX@10n46Ipm*&$kDJC=Bw_{RlYuqut6(^Rv64Z+M4H z>vmdSyA$|@rzfPR#ijV!T`;IxOj4$GQ*V4~T-TtOzj$CZt4Di`b?t94X$ooiQUoe5;i#DA0nv6-?l-Ce{t^`9qgIjiB{rUGdn3YHqJN63H)lh zHA!-7Qq!eLl56N{x@AssLC>1CJd=`xYW?juDETiQT>BqEf>ZuOBv{vCr=?m~AScE6 z*0Ea`l*aj{Ize!qf9s|GL-^Kl4N$5Rc-OJC_fEAE-+He0X|DG5{%I1N_7CA(&(%K7 zHNa{1jCAY%?{v$Eydu*QyyDUl{G#2;r@NJpb}66k1R>FhIce4Hku` z4P7#1x@2hh58L3(e+b`(E*UaippmOpmJwM$|i1Ya@^W9acPs|1U^kNt(%~IavW($lYeyy$@!P^YvP{r z92X2~_E)l?F8|;y{=swq;=V0iI(Bn{z?Oe(Hn7_t)W>lxcb0btO9h{*iRtMnepR#6 zGc3xlgBv!s7Hn2hSHEl*^oh2vG*9!X=BVov<4C-vto)P^-i@if>Z4sJH*-@#*`B0SJ%PG;!w|7o|YPy;2rH~6`h!#Y27>KNIj#I zJkyhW>O1?%aHO8OnSKr(v%91_b+n*YWL9EeTvlRgdU}Q>c5t?Jzpver!`Y~@Gqvt# zx5g?bEvaa+@JOE~P6j!SG`Pt>iupH<$+2Ey>Ky0O!r3aFiL zi;G{b3;H{tV9@j6TrPGT2BD%R?tP6V9spVNG z*)uiSvtBLFddZ$?$-dz(tGByAO&3UVfoK;)3U+^}q5xWk<|>jhf3MY~bI z@JLrvdz=#nMQ5ejtw8PY`a$V`@qlp4SeyeFV9&#B;g)5^Wm;FUJH3|8{vR?RGOu2M z!_ZuF5c!`fwz&V00X6gL1tjHRwwnK`VoUlD84#UUFCaY+vqk@>iY@&=WI)5bdI6bv zn62S|s@SZ-`A4mQCVBM&a`G@+lmAq)<@|>XZuC!73C{Y52x{ykI>e=>cL~b=i#zA2 zc(H137~zJIZW!f)#f!ROF*hvkhGA}4!VOEhVJSB(?S?K}C|FX852 z!p*;gn}3NYA7_m6vuDL*CS_y?xuL^@_;heO?ieQ?V|nvbpIC=;_K9`m2UyO{9o4cN zQ7yokI!c1${s{xXzl7BS`9Ipx0QENf35>(kNEZ$O$Obv$)ob7FtuN}EUI`DMEYAjhf} zob%6A`gC@*_v!4Y<T4P&JQTh}&*l;~DbDDjd86YUI@lOtwCjvaClj zEX#EcXh5C3BA-r3@g`8$h0R}tJ%+r3zo-- z1sw6m+C8PFCZ#zfw7GT!7M2um?UzEF;rS2c46S(-{BKjMJ1alH)jBJugTJ$?19A3X zA#hB(wW6%2mh5TH7fY?``2S@&w6U_0|0wME@{Y?y9eIv&ht{qvO9{uOw|Iox7e}~# zafI6!N0bh<)~BVM!>HUy;YkzSn^` zx966pazab@;6K$Y!o@4nZF7-sn~QYYT%_CPBHcC@=?*zj?vNAZ4mnZokQ3z&IZe3YAil$(E)n}3v>f0UblR8)X-uB<&mhXChfIWXJbZ#QRw z(+WyK@Pi#v06GeW{%uoD@?eKAgt`5ye+PUhdAcJ-oa|*sOIOGP%Ags z$|ca#>JV|52Q<;dG4Ss94c zTSsS1jf-_Lwhhb7TYY*($^;zA!%Zodv#Fb|ae27I@|mM+(HLCO~v69tWuYW zy9vaKE=gG#*6t%M$#MLZVpRxCNw<7-QkI26u~uBo%}z?OTlLc&IaqE+dP1DlU&nu& zxP)?VJHy=D&M^13Gt9m140CTg!`$1>F!#1I%)RXlb8kDtO1OMbSV@-;3M=XIL186b zJ}9iD%Lj#(borpLk}e+t@Mx?!Y`bIL>VT&9x>3{TCl-t2SOLV(?Ra?IK=B>g$Da%THSTE|+>a>oIc6AO-Z z9*0{`#97VqPJx_6V6qH^P?)yKye4MT$> zyd8{uYTGk1?AEER`dLZAj(+ka0NfSw=s^1)#q&O3oMQW10yq)p*Mk#7-Miwvrp`Pz6?i!ct+(kcl^lcNlj2m#b<mmgCtq$uHfdkC(NR@Xc~4 zQ_RN+ys|Bw+(3f3ALnO9@V{dV{GWKi?mnGj=I!X6M4+>=6Lr}{Og!LF zAS<_Hhjc6AS>6J4iu+GSkbB%5AprabclLt*lVLd)*ZG&XC2lcGG0PA#l3aWu+$$y4 zy;35|`ZmgTXzQEh1bz|LLwHs=^ow;tpW5lxYU{l z1Fh#T-Dp76A1po(3#|R8I56ceS|dF(ue}u_-Dq%iD|RN?UHt|p{6hpaN_6}};ba(; z^%oC_$m3%j`?`Axa?Y;ni`8aL=f7j&!FTInu6?iFdDU_pU1}-o3Wt z-6Iz79nKgv;A5oS_in+FD@be}rO)=8*e-P|n4(}v#ltP?xW=ro`D=_%>S-VL*}a(x=5rgu*F zZEOX=*mTb(Dc(_5SoF4LH`A-JRa(tLI(s!rwEHwlj7hYEHSC$O)@Y~2EpoCvTi8AA-Ml+EFF8Pxj z@;j10W02yIKh-IJN4NZG4*Ap5d@`K!XFBB1a>}3Wl0PTKJKiC`Ws;d*j?x&X{MIq0 zkM&V*$#4Cz_+R)ig&4CkhM#adIBV9l^2_sYU3Mit>Q$xuVXPM+PzxXv%PZd z+1|A*7T(EL5?~EvJL_yFH#xu($%O^h`imz2L4zDMEhl4boRWhaxo$kzSv!w#)^`(L zwX>4EQmnuFS-F*vixYgmH5@PrY1Yf?q^BvfB|m0T~dHMr(Kd)bWVy_dQM7E zblRW62ulA4cWIWLl%1L$J;+y^t=Jv}o$xA=C;bebrpj-8n_Qg8e59`k&@-DCa=8b+$<8Q z#eUk7v6e$^n~XQ>49s{x#o}G&rUPFy6dOJ={49gljB|kOFy>;_%-MF zO$N11vYst>DD5?BFBAU&`O2ukASGS4*9AxdMhIaV`^ zb%5$>tP!T|EM0Fv*}9rj32`bk>7e{mndJwVhQ_hZX=teV+e*i7Tz9pVEaYJ8hv+66 z&F-Q{DY$i4hR&4i9Tak=l;i;Q%E;m&&PdGxPAKR?4SP5|| zboL;pQ=wc3m^$l#@mFWj@Sa^E-u*$uGx=PHs8<&2;JdxDXa~5XkJvOif)X_9T8g6E zx)!}a{Pk&!gG&7MY4n58>MwY^d3-mEI&NT-S9L&XbWA%~hs|ugL*(op6GKN$0e6+H zmF9F;`9ulP(IHc$=;*L1!4{qq1%~G^I|8F;7HxFkTFVN=8JTLS&@=L>5~_-Iy*9ai z`RF)XJ<7c;VB`DU7Ey%CAfSLw5C$f20wkQqd+;5057f=Mzx7eJ3miXgVbT`RcL!mm ztiL;mRth+CAEv0rnfo>c>Xg)`gdwddFkKaXN)xcFyt0HiQ~JD&V(D2@5GBnAsE)=e z^6hAp0&al=l_2n-0_q~{kQ^cS0P*LiF-ocb{4{bY?2UX4Coh!o@@2k)7g})8ETIJl zh!$cLHE$uffZ7(8fn85AOxhOcKn~R+I_GSGctt)_W+Si2Ys$Dbq`7jj5ROXV|1g(> z4#bdjlk|U><9`e9D77o%ca+u@@R^1mq(0Lq2dK(5csG_{mDt=WByUAjA)uM(59fKL zr*@tDV&|(u6u0P**vtdL+&qxq%=6KCHqP_OdA9U)9OtF*+i_f%up?D@H#t(3BkGQr zVc)`$v1DCS`9s=YQ`tj&C%;EZ5%%i5_}}Qo=jg@1qZbd+%b)I}m$Un*ZF%J!(eiU( zONm|%DM@sYu50?9t(W?q=|cLRt(W><(74=-rVb)mv~0Xfmbw3LSi%uszmA-@@g5?b zL;sPZ>+cKf`)wZKQ|7#lKkky;|04=x9?hTAhoa2?Btv%9co!XVZvEqX;su%dc@;j3OI} zgSQPxN-n(qnD<}3Xi*)?6*tDVc_%d>AUkv;Ert;Dy=r_ZeD=i zWe|8xFs!_04NM7FT76#(oMma?VEvg#xzBTMpm`46SQR-or={%c>mtskh|{<)4V-Oh zP&C#>r2057tGO@5X|BoxXI4s(70sFy=ng(aIelAn;8{M8tXnQFo7l%G21v49MmT(S zC#Pp0TAKt5BnNfTA6ThE7Yc2d1a}{!&&lL74#q9Zh+7<^nj50I#VNEq=7u(6Xjwqx zFL*P>bE?I9eF$8^l7Sy{M;(h~3W- z4ioHG5w;Vx;;*m}#o>YI7AJz|u12fqF=1iWHIdg?Ksj}1X|REE7pri3-o|6P z%v{$jqD_XwuQ*8U5?L5|5F#{o3n35%>j>&p^B*AkB5MvNH5 zS24x4O11mQ4bn#pH;(@rl-dm6=DvLv8?HS`m(hIY8d%GH4Rlv>5DCW?m{0Dr)XSYK zD)%*^15VtqtQVDOX>pi-TH&hmbQKN#Q0#_M$>08*P40@XSC=Vg>7iK8Te)>@Z=x6S zju0SkYZJZ#u(@j)b@C}{uzr`pxo!3g&TX@2aBiDDgLA(<-i?xVhK&N*ZXS0h*$#(4 z3Pf!k?JY>?+XCuMa1n`l3J`~wb{p(e8>VtOfxd2;Hf)nwW4(%@mD(hTi~S9-WlNcX z2#sZPk$E*1=|(8Jgj$7rtZ+npNpOd=cfY`_hAHsA(5(_jyJrokTcOoKh> zMV(E8T@N{}VdcC+D-*f0u-YxhY<;`n*jmwjf>rtEZh_fqi5hp&LU^u(zLt@_h~n7x z(@RK;B%ACk>LGe~iqq7J)E!wyM1fBu>IAZ2OdxO~DZ9H(?!Z(q=UJH=5EfL&6mi~Z zg44B{paxpXa3QNiV(R6IoVTW|QVM}|ff=RA>l<8YFt5-)=dWRy=UF))=pJ#8xi8PC zff3>|eFGkw+~E*5KEg(Kp)K8?4A0MF=K?GQl>BZI$$@X|Ya8l&hkBmRU-BTARjCjh zNZ39k3EN*&zAlZffkLwSARzRqh^Jk$$a}QD%-m1{U2;vvm$o#gHacdTog3ISRL8>F zlL%*=gh6TNw!vS)8*&gs4ztC94UKFuK`Z6>hNi;KPd;awV74+2Enu^ofv>9nRLAFC zsomgCGJ=c2X^8S5l$ztvfNd&SKA6TR*d0JI+-vE8TimBuihKiERywHtDD9s)nsIus zr{GG(y)sOml~kmS0Z^`h7M34f(R{nw3!aV?MZDH_Jb)&aQr012K)BQIh*JvmVPu%E zp;O-cbs==l3oRSt;vxp)ZlF$fLq5UbD3XZ!5=VF}N()p?q#%R7jgv9tqB)2i5IM2? z&e6!tlYllZRmhuQ38~ZLOwESf{f_;c^AjFb=XYl?0>32R1 zD0Ny#W6Jq2%i)#e@C0|}C|D7#xw8_qw`F2JNmAeDB&jK0H~8zL#Ccml%Sjz8_ZvWt zCU5Zd4O`PCfPB$LDU$|z%jMDrJu6k^6#@(_#`vEQh4cYjXImPM^<_RQ-$iM(>47DLe0j{P3#4l9-Sj1(e+ zxR?`loFnB&glKWc9&Eu|sv4lfs&yo4X*_&uF|?CP=q}KX#@Y;_bL_m4VViHEMeaW_A6iM4SMyfcu=jc;k%&tsAe(WzBR-Gm9V2` z_5n@}U8+It-nCo8^1L;MELihUo4}>P_6C?dehH5?cAlyYuCu{>=67rXEPXscu5Yb+ zRX2OyASlnfT-#g6#ai$cSv8ionXBnH2zlPq_1m3`@J1qhrPJ$Rj2vaB@E%r8Fo%iW zlrg0`o(U&G;u5M`Fc)iRV_opuws?!CX!667UZX$bO!iM9y(LZz)5&{S$u=UEh(`6#CCXO5L3jD?eNGTw!k3t4K3K{SyWWb}40gplkJPH}`C}hB+kU`)2Ht1X527UXs zLEpY@(6?_J4D8zm1N*iC4?PAv^ce8aW57d?0S`R}JoFgw&|| z_T5HkssvWqCD#c@{p?n8aFHA;!=XETVCSH%$foXfJ8rmCK*lzv_xHq z5{e!h2f`Tw7AZ~R|&&j>vWsxk=vBDDfgpOhB8E#SE zE+wFm75>_CH?#UTqx%Tw)fqd&PLRc}rOsDRb8l^zBX_yC>pr*(J6%7;U{686ri;dt1A*1;F<|a@Ktqf zqaHAJjRUT(ag?R2Px-m{s>000^SZp-=SuG+I3J1=)f@0`iPXT2e>Z(kGRqvpPlE6@ z+#EjHSqQpOLU2e_d!&IKy?gdb<(9K~YV*}y`4SrjlBSAowQhtd3PGHWmN!hP1~9SQnaej@Rv;!RWW?!>#(-?gIWicU1LdNcKEj9GMo*q}Xvx>W#_M{poK zf*UIUvLnD$0T3OHuvZ5ov4S9>ID$ok1eD>Tk(QcpYf&wi*diKW;W*xpL?ACx%18ka z7XcRfyVu{f{?0WRbVHJWY)CBoy^E^wD{;_XBW*#(iM%s83L!#fB0- zV7|2mN`J4-EAc?;EmSDIxsDyzP|I$b!CAf_nq~0BSr* zWuW0?)P~l2b|b?+y}8}t3prndBVMq_k^G)S>KtptlT@AKordhpNfL`^F|y1c3!7=; z3dX!*Zw(INBUq*++M@4k7=Muh%UpJm6xwm%0s$@6`q^w3g!fM0=RwIrG4hl}x zsmi!lJO;kH82REFD-fTu0`p+-YaEPzjibX~eaZ?nl1uq*Gr?7`siZE{ z(Bd|e873Skz5wk#hzKsvvjt_z6v5M6G8LdSXs5@Qf;qWV=lDkjepKi9Ukdz7o#wBU zHU-!Gxdh;VlJX-7IDW55E;W7QLn+{c1z46k$fq3SQwWt3C_<&WHpr(ZI>@IL8|2dy z9puxB4f1JasUvO5K|XbZd|I(VJ_Yx3`RVwb+8{>)Lqn+4(ijUurPfdf`Ltq#e2Tl` z8p#Iv^h5{w6tbko)vqvx45@K!kWV2xDrkdzDx#xCrelTYgB{<6d_W^9>6j|%m>TJr zD(RS>DCwBCL{Ide*N{P47){uWOXc~XnGRKfSEdpUjt-(B0$K^w3q6Xi7>6Xi7-`} zNHXe}Or!^(1g`xmOh7|Qvd9fCNfkpJKy?HuHCx|iAj$xRD8oU|3IL)kz)k`5ECB4q z+~44X8gcl4>tuzK^N2dvQ1qq%iKW9Se*l>!moxwC6l2-2w+6zvhoGz3ZfW?j;c*9F z6Hg6<-*nRndNR>$qetlMO))pq$@EJCG+rfsriU>By+SaGJunzArA$ ztdF%SO2j1MCc>#^xDnlDrU~n*N*fY%@}M<&Gr{>GIrJwYmC8@nsM8!TMj#}?_c=zz zEymqwF=7|u9W_($sF`{f1o=$)6fNc_(Oy<_$B_Z*9H$DT>KyMB*r{`zD3F*FS%ge+ znK_X~pJ_%Sv1s7foGGz;b0MKfXa#bJ#xfAJSRh^CD|%(23v(IbW zwFR|eP52Nmmd=WaKz-IT@mA&M4+s}RPsK0vR9vH{8byR^^MIae9MDsZqx4jLN>4SC z2o@S?n=Hj`U>iP$;S=#gFKwrCG(sHh#jPzcrS8O6-9vk?s5lv=Tk+M$NNU~&WOdnk z&K0sy(lfksyNn~=%#fF{UD4nQ9!1*qr(S40;9MRXBYL>F;IW`SEB zi}VPO2rq&c;YC~#Uc|-t7uSRrL5T1o2o+ugArd-V5ncoo;YC1;rV_e<7D*?J21AOG z*doP9Fr*j(MT!v+Qj9oO2h1Z46v0-okY*&VNHcI%Bc^zWHG&thMqS7=aG?=X$FOLJ z)w8`?<9q=$QPDz!@o^Cu+*gv|g9@-y03Q)RZH+D-ix0HldBJogI=+}V_*QU^GX?N{ z6sL*nCI`&02Uk_Tji8Rve#BbOBx;-4Zf08r=W{J32MrQZFNs|!VI%hlP~k>g5pLj8 zxPi}v8}*2ABXLBykvJyYh|h!@iKJ4#M8ag$5{1ZfLJHg!*iFhjf>`6g0T6+knm{-J zfHNcf4A$$dRXIc_VXY+=$1vyxekRGv0JLJ|pm_;^imU`RXC(k*90KU_u5#z8dlDIl zPps%DQ5RMk&2y3(9$#I;Pj&|4yK8i;XvD3q8D2p}6)|Uw6U(N;>?#-snonlwF%mQ% zd~bCzKQ*~5pcR1`sR)^(>RH}e#bqDdqF|w+Au?+<4Q8t%WV%`!%oXv}aBIk+TqGIt z8YW66i!QTRQ96w+2TV~#EnQ&MMaL-06Vg+Q9ja2KV^{@~TeFneEuIRdw<2VID*_W- z5etS?Sm_GpxJJO_Ru_|6Bg(86Pff%S3&Oh``EM1ERUQ)hJ?rMu~Z9`1Izh zqzp>wsqBc@InSD&3X@b_+G^y|WK5GePvjEM>8Y(O5(O9_606z{V zXolZ-vkz392F&ZCP^!LxE7C zXgAeX*$OrR5#GdN0);a2B-2B7X+yD=T}_ahaT{1MhrtR~7ovqh9x$#7Wrh0I*&3Y> z+{s!?t`hWJa%V*ZLK1V46LS@2e!U6HZB#U=ojcxbV$_YXq|Rnq_z+zN_ygg{obWlh6tjOMG%Mv-k z8k_+r1SMO&aIyj8)cndjrFFtP)dlYqx28->e9Ak`1Kz1|z&kaL@=o9m{{m^53!icP#%(H?DiN|8|2@lp&+^~1{P(Qyd)D_o%YV=Qde8FT zvwX8V*gH47gK$~C*&PJT^3CpG@7(MT!e#kpcMvekH@ky?S-x4o>7APe9JnmsEZ_i+ zY#f>e9Kd6RJ-b-Z^Xy^;Tx+LyZsmCA)=ux-%JI&vo!+_S@10xwymRYc@7(&=JGb_E z=hna8xwX$bxBm6)enii+`w?(iuHBCS%yR911YnkH_agwae7he3nC16azS&X+p5^yg zevjpwE#;o)S^s(-%lFuByD^J!w%cyZ0=Dn#c`V;-DFe^)&F&sxw%_dT0cQDTOS$Kn zEoHbY-)t!ZX8C4I88FND*?ynpn<-_4v;WPMGGMmfOeq6q`^}UxV7A{(Dfc`xr3{zt zH&e=h+5cur88FK?TXuliUbA5bnC&$ic0JDyYQbgu?4TB4w$Bb~0cQK`pcY{EYoGa> zjXL0&zuBnkd3F#BF7vm8Sb&+o9mE36{OuqXVD_IK!~)FzGwXAJ*?(qz4lw)Atj_^v z|JgyTo@WQK;IjYhAQoWupQ*b5v;XWM7GSp14q^djdjpmqu)P7x4>*1TmTw2KdY&D` zg3I#lAQoVjZwIjevwS;%1(@a8!7IQl?}FvoL93o;2d&^Te>-RenEBg5E5OX(4q5?b z`|O|>FFo>0kNnajzx2p2J@QMB{L&-8^vEwg z@=K5W(j&k0$S*zeNss)|BY*VBA3gF%kNnUhKlI2CJ@P}3{Lmvm^vDlA@mcN51KiZ+hgH9{Ht5 ze(8~4dgPZL`K3pG>5*T05)%*635z61_T z@wr~}$$xzEAD{fkC;#!ue|+*EpZv!s|MAIxeDWWk{KqH%@yUOD@*ki4$0z^s$$xzE zAD{fkC;#!ue|+*EpZv$?dd(*v^2vvM@*$sm$PeG*1~cyDLqiMnE^<=)$< z;jqvS=jd(WjSKIx@U9B)sPHZdFN|QijB%>XdFO@qq3~`B?_GqemevN_f=ZvjyRHjg zMT=d$%HmU~mT+ElCFh8sr-iNcGR7=OE5RR<@C~_O7;?cdB;gx!!7wD@8*;%gB;gy9 z@D1%|M{h{NH{=3h$OXiZ3y7f^xkfx2z(X!5h9s0j63QV7<&cDONJ2Rzp&XJ>4oN77 zB$PuE${`8mkc4tbLOCR19Fi~&Nf?JDjKkn9Okm!k-!?E>g_Et$e~Yt+&W};iDgota zt5T9t$-gKiUz8(lOOfJ|e_2YfT$cjICI7S>Xa{hUc$>MUe`X1z1&|y z!=7P|=0JRk*gZugPZ8PalRTnQ6j=A0L(y17!Ie;)4;^oHtX@;-iz)QQ6#A|y^u-kV zt||1z6#A|y^u-kVVhVlndBl88xWA^*cTJ%$K2J0}KA)IN;V-80B&HA;QwWSH1jZBs zV=7N#Doq{2F==H?S{aj8#-x=oX=O}W8IxAVb_=c-+buY_EZ=Uy0cQDj z3$7QFR>q{2F==H?S{aj8#-x=oX=O}W8IxAVq?Pf2?H{oHb_)*Wu>E!m4lvtK+8L8} z#-yDwX=hBKGNw=&Q>ct7RK~$Y6_j-&chqg5*)_OcY}er6vIFcI9AI{UU4!dgQ~PpF z?aMW_FW1z*TvPjUP3_AywJ+Cp4G!sT)p>2#-~eB0J+7&Zxu!Pen%bD_i}zN~3w8jt zGcmO@F|{)>wKFlbGcmO@F|{)>wKFlbGcmO@@sJ;2$PX}N`-l7hL$-g&@*`Uv#*t~? z;>ff^ab(h79GP|~j%<|@M<#8?kx83zWbKb5({8}>hqW(a`4P*HSboIvBbGm6`6HG; zV)-MMKVtbKmOo{HWri|GX3dnKHD#xs{-AeAob}Jb!t8BND0ka&tl?<5W*sWy1EXQso_hP%1 z443t_TgiY~Z@ZNYnC088ohkRNv)28q1DpbGDGlc01S4>T?mbV}+!|Oc5dYpT!*Y366 zn4a!+@uHF@?8Z+J&G+`S5>Ard!%BP^V2D=Dg(%Q{|0I(xOslwOthJcNdwp5O{4gek zN1oN+de4f9oyDY;l%aZ6x4)WI#T2Z?%uPhp|Cv{(zRbPde?F;5cliX-_@E<2 z>(zj9e2g0Pw+-)lx@|!Y#Je*(GHe9%`D_CiqM6_U6pg09$uH*M$guRmFGb5%h4DZ&) z1^iK8Fe~8AA$*qSnMXOxGtW`=Plb1zduxKV`Uui${;6osHurWvJ^7s7?Gr@t+OcL+ zyjZMY!(I?Kzda+a{_ek?WYgU}K`^C$%Z8;?f9GG;|8AsoaN<{Jh=Wgl(=m2(uTJeZ z*S^}l^PT)#2hz!dIsdj%15@QPyZ`O-sXaJf{ohE**`zi;Y>o(4+k%*`5C2od{E~ZX z|8Y6hzBpg~_dK}1&%KR5icV-e7XF&Na&BeGBj@U?|B-*B`eWg}%e}R&E9_Ver5xj( zl;v$3&&1%Spd5Wy5HAfZZ}SSMn2=DCN+?Msl%$g3q$UqbTSequX{*R({u*CB%Dvso zqWapiT{Y&pTgV&ThA73*FHw%6h}WeUdB(3x`Q*rQY5LvEc`4#mDKA&^SEZ~Ru5qdC zLTlKFN`Av@y@*$T$MAVgaM?z-AC$>-AEMyqMReSUIv>n)P}qmi2lmFV~J&rAQ7} z|1rt?hat&3zwopO`STp81d`sb{&j`{C&b%$_1jF|032F|032G4hOGmty6} za%t8VrC8P%rMz6tUzH*`Tpg`hFZE+dYn)fHS}DV-x2@Q`5^as2gO-yPZfVrp(loBL zmL_o!-VJv>zH`3%zlscZg%?;?HDH}ru~tjPS}hfuCv9s;4od#(rPWeHtd@#(b!cgT zgHC?eY)|&;)P$58O%h6KBjWcW`+e>``CYRo@u8Ua3&3&qD60hE$)0RG)?1Qw^yu3#l#(sV)nt zE(@tH3#l#(sV)n>Kwc3n6-a$q$iqe<4;zKtObvP1DCA~p$j#J{`m&JvvXJ_+kovNa z`m&JvvXJ_+&<|?z7+|Re)R=|bP7S%88ge@|#AvklV^3 zx0OR~D~H@x4!Nxya$7m%wsOdA<&fLTA-9!7ZYzh}Rt~wX9CBMZL$|1Lv zLvAaF+)fU;og8vIIplV7$nE5i+sWa(D?FwK>WQmS*`|2M_E=sP#rb)$>uQhTzRq91 zEg|jOaEm$Q7IVlg=8#*J%{mvervr_dPIxSUw&r0R?a>(uFklV{4 zx0ge1FNfS-4!OM?a(g-C_HxMW<&fLU;rn+rJji;Zg|_pq);i(ES-v?e^*UCZbv*Z$ zL+&kyJmVDdY*WayO(D-Vg*@97@@!McvrS=mb);Eq=_kn&SGMAlWFbx^S#GfQPb$em zT^zTEv2k<@;kI1&EWj3y$QMv!lEMT;q6xcdog6nJaCuk}IB5^nyX1|{Z#*6+zP1>y zct~LvRl&0y#PyG92F=Y{5AKWi<$S$(xt=d-cl#Bd@Wb)_mid-=o+*iDbt@Z9x~qNO z;bmU&wP7qt?B>e5(6ANRI(W^xrO{-e0dwwg!xD|=K(x0Qkg{hzg89f~+s2&%2t~;f z7Ubh(-A36ZkQD-^CCkR#Sn`=zQ-*N0y30{$LxMIWFIVvd{tW)Cz8q~ePl$+e~)r%-N#C(@s!N;l3WWvDW+Q zc)fc}FqMwxFl==s&te=eL5`!76-d`MI@YW6FCVhy3GBIkPUc53bX!O7k>Sf(x;okJ zZei=I0=tc4m=mt7CdqP{-X0-wR=E}Hz)M(_*ll3_XkNKn@9!~Vk7PrkJx}k~xJ--@ zgUfEZc=OIj!7=FFE#3)+<}spStyB51Fe1H@R|-^1ct&ko31vNDA^@(Mu;q5v46trx z!PVVAxVrlXSGUsO>h2%hOXl;A?iJl@y6@?#P>QQ8y7dQ_J#SlS-nnh1!PTuigtL4T z1^}~s69xdYd=mx$vwS;i2AJjBSu?;aKRk!g!ZD1wY_kbWfx&LV1`}p9#rc$%SEErk zPUNXoMt8Tie5- zlpoAcfAa^WpCG27pD%wHjZSd=ayg#0%n^R!;mz_NEq3)sm;jk=ck9Z}hB%(5+jVk0 zhuyyQ%YPy@j4^P^^j7*k{aMj_bHhg-fn`q9E@|=ord*eym|EUkJ0ED-8D{Lez;q_T-;^NKT0jC z%CqpO@3LwAFiXU!auuu)70MQscUEBYs+0zXEI}!8s~wV(1y|nF4b43cCCkb`h~1s5 zr-sG!3NvPVSCz+v#8cC^gp@Snf-sTx32e3P_5A2%c=;dVbe|VERl2}cWeV;~*`Vy% z3LCJIgPyIh0o$PL*_jl;HYs{`CIzrfik>aD0qg!UT;0cp8(aBy7RBq?VjHeaf?nUN z3T?r|P;m_eRXrO)O;XHbL8)icPzq~)eZ#`M5>xM4LVyDUksFtr8gNQY@61%S`8NcJTT%uDs+S~6?|O7&{e8jFWkTRd%)d9`U4 zQJADf1hrI814A9nH$Ps35h1r|vaRL4o~`BKvTAmP2sh|BVr*>>m|bIQd%)}(TiXL> z*Vx(~FuUerSW~%G2zEt%yA=)uh*Tz=*aGA1VQIb*#)kQJtC(NMmhE28mhEtvwJqBL zv)66e4w$`e%XYwQnl0OL8IVo0WjkOt&6e$e*)&_W17_1MVT?#BE;So%l9mFZ^OUw> zy9Yr6X}fG(*+L#Uutv6!2mHPxO@2&o@e-#dwD`85_j?fC3~?1Vm_f|4@$A7W0+fMAxN1ydFdB9=dJ(swutj7ISW`PmjuP2-c9Pud*-3J^ zoY=O^2W;H6XUlxR#@%|h+y`vjt!K-9z{cHrw%iA7+^uIP$pIU8>)A+6#hzQb+>%USXi;KPzN!78ALWd~}!o~Z=99;JXDrGQ@2x9=q>9&kaOpDJN@C9GC5 ztd64yv(0`%j6Gwb(MYE5lyT zt_;Iv2bnq_Fgbv!^8vFWrp^aEsiC`s*}`BB7E6#Q@Ob97k$g$9;KHbd!J8%4%>`J+ zQ>5EHK+;0s84yiX;pT)m0tg0Spc-d8txml$&4wt-+Qh+#os zxvAsRpm>;+nZHc3Rc)L>trhRa+nO#PMC`7}$_g&DDp>PCc)){0o4eKs3q|!w6`F4G zr+{qf%2Nr#Oxm`VbYRuJIj0N^9g64YAem$<7&=GR=mvQ1GT7ySjUd$^v=#{tkHJcn zLhTK77g(^tPJ*ZxDpIF7*_@zBkdZLjAU0zlN)w$QrYLSLL0qFZTSH)mL?-8wQR*>1 zLblYEJi2m@>7v2n->z5lj&v57jwBIW6V<^}e+D$}#n1))Gu{ICE@Hh6s$G+5T)NVL~fr}~Sw z%e>c#mtzzXG-eA%wMMM#ufh!(d1$SaT@%0h@F*dS3X8lO+p@{C?F!sbzpQPrrqftf z*Z#O3L+-LH@RF?#J;@GA2z$}jvczwCFWWnIDADsM9q|@5VB?FtH4WH^6>m)gHonYT z(}0b)@YXb7c9v~l;PSlDD&Cp~Y_!U=?F+z0t32Dj0L=1j`vNe_x9tnSEZ?>-0JD6G zJRU_Jk0Ospkq5V?b-H5i;F&mR_GCB;AV0|#wrik2kO1q>i+&Sh9A_;U+W{7vaac3k z=zw_u*333K0JCPc(E*q}V;dcw$JIRVTLWg#a5azn)^*u&$Lc|dnXo5Zxo#V3v75s_ z?|e@*Ycd=%g$yAE84Kp+YvgcUH%*;n+Ay!qq&EG`xMm;*b4x@LEPaekR&kU^MI-en zgG8UKa9JW9%i(GmG8BCw$Wm>KDTq;uQ$a8~38hn-uobp50{aP1N&*CYn-I6BHaIQ?28GiOv45!5UE~Llwp=G3&%G z+ydObs-3!sR$b)1NQKo*!4}pq6)wbZjfwv9OSV3O5v2Gfp4x3`PFi@h9vkF}Y(uZR zFX(rx1ZL~5K$<1#cuf#W%dHzAZwUnj-6PC7aTT15vInSU+gerCVQNbYQ0v50{PdK* zJW5|4r7zF!@p+zYufR2Fg7?P(n>2y@pORPdY&j3vZJHZ$cGslLKb?)Ufb2Iq;l~)Ufb2Iq)ps zZu5D#Rel^pTCi0L?vx)3u&KzeOa`4RHxyE=C&J)FLhnZ!_5Bg{*i2mV!gnua!_Cq- zDTawi4D3=lY=an?IgAf6+EIbPOy_F(#2%k zq+f?a4ch7qn-AbV>MO>Ge?Hdg_~%w*->w~@_zCt6?m2)#8!c9^_YxzWej6RUeGa20 zwl?tX;t^o`F1(En*uD#IqXV{a;rCpAtU)hf{u5}YO+4AIa_?w+Ji&@=S=-EaYdx!C zvF$vC$GhopZN~6!I^c_%PE_rLf?j}ULj8h2EMtYh@{YRaQ%2z3ZkS}@=dp7GfbH}7 z;=2+0TVAQkD6Yeyur84Z-leAxr+9= ziuSpR_PL7o?Uo1Pv$wg5_PL7oxr+9=isqeak9Vr!8c*V#YQQ!Nd8ZmM``I?X0UIac zooc|w6M3f^@RhZfYi8c5_I$g|0hgo7ZgT);J8iQYrf!(OZE^!<{r=|{ z?dpZ++m#8p9Bp=v39zlKe7iE?`CQ@o)bsjW;rVt|0^x(BCH9&cB85REi$_gjmB^qj z{etDpG8VTgF8I|32#8(lJzh?kEwhJt65l3A7`^kFE=FWOw2D()=_8(?tYQjd#|~OX znec)Dk6Z}i<<-rvRlK=9flR-J9aMPIB_86%X`OUAgHAG9VO^2jgKqTbdUSodZ`;e{ zwp5AZ&3-w)Yq@%kWGM>0F@!@H3th&xg;WK=`4->$RWDhKg4 zrzm-I7+bF?-isIRfn`-w_okp8#wrU|WOe%Kka+8P$I!MeXO(60Abmir4S=_t&~NQP z4r~({n|Mp{^(~cqZ>ijSOXc2MinDL2+PH+4JI6mF zd?3!th-(Je^zWaC5&^{9rLaR~Fo9(Arr*;XU~(&uVD0IXO!j+$!RTb)PM9I5 zcM{>E6oGXxvmJIw*ydK>j+_Cuxz+cy z26&I%wZYDuAp(2B&YZ!{6T8jMoB?JHe62xHWMGHR5P>zYOPYXL11iD$cH|6rtwFz( z0sFwtoFM}HfEw{WHR640#QR(u_Nfu?QzPD|M!ZjQ-={{r&!u7Cj-PpbEDb;6;F?qb z9#20PJbfJ+;?XY*4+uBoI1J355u^2&$byi3-nz(OBZk3hg&yrK#DUc-!}z(!1-*4e z^jtoQ&>Fg`zRe@MoZq_oymj@#oU$UcS(3b;H!#nqG(xHO?%NejuWwg0y*^iZeLJWI zn4h03y*^iZeXjKST((7}j*XK&FZ#OiN&&Vd7-OvPVw7YLNGy#KluatCIJo4f` zd2t`S7^>Y|%hsoIyHDQSzX(8hoDQx}&fMo}u8-B+d{PeQ(Bo>ZkJa27rw=6kd<)~X zadND`m3U^Z$Q6C^?LPT-pM1MdzTGF^?vro#$+!D0>DNd`?ym8S`3CV z%DyyI)oAOsI$%&`ybTxE;KfD@WXBeKO7fsf8{fgc>K9=#3P_NiDp05kNMs^x&BAIi z;nYwH#ocmiIBhiF>MeQm3_R6%ep=h0}dEYK}E zGN`W>u$T&-fn}&d6^as- zUT@`G4vzW2TyC<=*P5~-M&=qO?Zvv_)j<|OApEehz;SVEi)^V~zOa=K(R+Q6hoBJW z^cm8sHlJA4@YFV{*3=JxFNK2uaZ|?#fit>m=;KB= ze0+#JsKAE9-)_cweY+V8m!yJXUY}xKpJHC0VqTwOUY}xKpNq}Do$d4bTx|B=_ia*H z(N;q)IQ!hv?{mS~=Yq3OC4Qeu{5~W(B>_p&fPMt84Qgi^j*9#~75RNC^7~Ze_o>M5 zPbf8*$xp9O{e7SM`#$yeed_P~)Zh21zwc9j->3e*Z^!Y4w`e^Eb{rqDk?esT#|Qkj zrlUv1+?tUW_?X5PcmuO+fw(5P49v0xVEYyWJC6_82K9QxpvASN@r-w!39={0mHH zXUDiKjvbCq(GHffPyUub4U(Q*$>L)D^5-Nw{tYjVXU9LMI4xNDh$X`+%^Dx0TiA2P zso>qFb`{}xBk;@WB^23$I{78tU_Zf%v!ng6_GxotU`P7_b6lFm3&0$gW*rFdJEmu+ z+mV0Z+2Ve9j5SJ};F)!-?KZpAw(zZ05WkB@vcjaxx;pX2zXF*&Iz^RUAh7p_PT= z5+cTWW$mH(HK6!4p!hYQ_%)#THK6!4p!hYQ_%)#THK6!42%_(G?&G@)#f@-+b-W+X zH~YmXo4+z3iC0*3t_}AW@MqcioA198$U1TunNbbwEs*|DWE)Uq8&G{R;CX}rMYaJ& zwgJ^C1FBO76xs$k$KpL144ZyZQ8ki9c zz@|PLm=O)YCMFKdhz4M`*NkX*12dulm$a5@mjTr-1FBsHRJ#n!hz8o*5N>liu9?YXZCbg*_-6ZvlBtKwcA&*97D>0eMY8UK5bl1ZG7E`B?h{@|l3j%)qXJ zA>4Rfz%_cnHF`is5|EJuWF!F@NkB#tkdXvrBmo&oKt>XfkpyHUf!zwj-kQ<0fGhNX zj3gi<3CKtSGLnFdBp@RR$VdV*l7NgPAR`ILNCGa<11``5yAy^zJ(f={5|E1oT%QMA zp9fr@2V9>AT%QMAp9fr@2V9>AT%QMAp9fr@2V9>Ac0CMxi8lTNyB-GE#(!X@HnGRZ z@6Qu#fn65^-qel(c}hT@5|F0^Lw@}J#~z((`}uG0gq(*rV! zfQ%v_qX@_-0y2t#j3OYT2*@Y`GKzqVBH)f}z#Z9uJF)?HWCQNV2HcSiNb~~|{eVP2 zAkhy<^aB$8fJ8qa(GN)U0}}m!EA@c;t^xO51Ma&9T&V}#cMVAN0}}m!L_Z+W4@mR_ z68(TgKOoT$Nb~~|{eUOc0_xZU>evJ7*aPa=1M1iVo>U8XQZ1m4J>W^TfI9YoC)EP# z*aPa=1M1iVZlea&u?IYt7Es3?P{$r{2Q{z@W?n!h5b!)&!1HJU&!Yu)!ORQHZYf-2 zLV;a018htvpbkEu4nCj`KA;XhpbkFZX|rHt0)If}5b(5FK;{rQ<}fxU7>r5u$1HD5 zqHE@syui#X!Q~{Ujz5Sw$zn2@*qBdXW|zDmX8vY&2{79ivph4q1U$>*;xgdkGT`De z;Nmji;xgdkGT`De;Nmji9zwu9gn*~S0`4UQJS!e>VHt2?8E|14aA6tnta!jhW57jY zz(r%gMPtB4V_^2LaS(#-vpZsd*`Ibt46x~W1G^&zm_(e5#(;~)fQ!Z<=kJj7cgXoW zQJ>>Wva(oZXoR~M{I3JohF~BUJ<9*2SKIC{Ga=Z^Y-iI9T zLyq?$$NP}ueQ0LCydjSz4ig*qLn<`o zM%;-XnF&zfZJdqF1gJNn@H(RKI^y>k@%xPUeMbB~BYvL|zt4!m>xjbZ$g}S;q84Oi zCO}b+$t@#~<$K0AM*O}be%}#=xeC_T7|FPf5Zm5RT|A_;t7QOmmX%%Vw zlFhQIA+5?izy5Ka;bCMg;uBtR#lynlul{RhY3d0 z*qt-7)%07jF#*N$O%Y2NqFvzWMfk4U0Y+ySj7V90sY}H^=!ke)G(I^A*4OCjaIx zV>}61d~@iNG~3$VWg$L(^L_r!_so9JuU&)3zIz3)c}q`xt2eChg>{eO#zkz7@P!@F zadC*mRu(@lUXjBysilblyMMb8Ze`=7Fiif@+x%IN|1Q!vhJNxFxwHCr#4$HK#{ukc&Y{E2RyaXjM;XrhTN*nrPM6c$_*;Zqz!tf2Tk>Dy z#JI!b8k+Oh-lsUgAz9buPwgk@R;^t# z=c{}$OeJITUtFq{^Ze?9aIe;?^AV>->BU)edTUT~8?v@_zUsdiSlu~K=(3%-y8LwK ze6!s5i>sfQ#$c`=T))>c=YzI<;p&MOA9MfdPf2sU5o0kT4Hs|I5pIn`YAt@W2`pD*D+N|> zQ|PZSc8wwQSABRL(qbz0wLob9_l7jutNCxC3nz_-82(h7hb+@rr^ zL>x`=)BGJD+!fiBZ|#7We~%ttVwf~9A8+tL$85dd?x#%*n;d9K+6~M=;4zQ=v?YlP z2&qdkWw=?o^?v%|_vMSd?i@w~(`~}-wM?R3OrzUbI&GP>5rjkeH``=Uf4om%N_2dO_cvzI{T`2g%Uo=(BFKN4 zO;s2?mH@n#t+1u)Au@)B_?1}@ug@AZ#< zfTfBfSRT54@#&8j+sEoBT*`tdm*MD{O1M}e)#;d0E__6cB)5qoqZ;&umIeq%eV3z*;7b}j((n+509Yh1>Vdq!2z z0rP~;gWGS0`5Qe==eb$qvL;S|Xs`g4pDA}!{;vM&(qez!GWqB{a{WU~{Ny}X7AU5L z3rTXC$E@-?Yb$Yzn@;Nn_%7~i$PK(r^&{?M>VUy6x_Yd;Y*#wsh6G&wc$ZY@M}eK@ zfy*Inr+EN#NSk67uyxOcDW0PXQ#`}9A$?(rXTUb3FHG?a*gnsN-Ae{+Q~JUbfPn3D zU6>*euubU;TL%HQL3oj{d{azE7n9x_IpvL$4mUVU4udfx9KPA%WO{T~f^VR>z?uAbIl+89whBdu6BQfM8M{FZpz!#Ir z%gH3g-@KyZ`eyrbbF*zOZk9LE8kdi8p$tG$2GRn!KaBPz4{7hS7#uwMe3!s3*@JxJ z36yB3K;!=kOQbss=|;Hyg^_@JpyjA0=uD_rgR65Fu6{PSI!oZ{XM?M=1g!1Lri6H-!MN=Pt5)TR-5nZUu8^Zdss*Z{aX%y4N?%zXVIjL>^y-_=W@8_ zAjTqD9Kd+^tPJD1`$aOlE2CbmC*5I7& z$TTDqYE|KKG};z9U>%L&yZ)fHO70|?r4mSVV+AC)NDgw;DT^GGtie^X0$0fz+@y;` zr+4K{i74_V;%U~lpFSDcemY!E9b+(n2W`o^sI7uUwhBJWG{V{BQW}AZBmzB4p@b2| zDPf$9Oko692|QdS%y8MKw&M<%Gu(FE0dt1ijyqtLbzt%HvLm8hsZItLwKDi=y-b0G zd{{5r$(xL9Cl4;`WjlF**?qQ?2bh${cH#kFv@wC^MR&@0f+5n&*0fwX8)X;cHg2<* z>P&RfnH_#?gNwFUrp6p$-PCK{Mj+q$cmq_#m9VF+w*C9b$oB8yl3v<=BVdk4+jj)a z@o4*xfRoo)JuGkUcFU#CkMdxS&bu&cmMx`15KCmgew%BU&-667wjddd|N?{qS6_%6e5Vs7V zkwj2Q7c6!h5d&HkM#=3lmLi>*EK!d3ZH|(>aOKqsc$1^`j%ki}HXKWtN?qi-T2Zup zTH7t2jO;xrxCxZ`c)hViT5aQaG8*?9IG^l#uC=@^edmsxTrQ2I_VTv;b*(Jh$(@Ys zxd1#Vt({x|OnP7fb#^e%Xa)~jy#MqV}h;Q9Dwu4oGt=p*opHTk~*U0#oWP41q zJvMSZ8QZB;xb_*wCihRqM$+I~H;?V$(IobbeZ;o73$H^BhkK>%qh@SE%@|xuPt6!$ zBiq!B0amgN!^FDepCn{M3E5C$^+&j-gKK0yv33A9f|-#0yte~i$Vc0QaMsH%W&v;Y zPmImL5VDpFx5q&NrV))`L$LIH_1nL{@HK{!hp)%zfA zft5Dww<)%`Tmc^DDyd7;kLiXTECiJ2GU2Jf2PwOP`AX93&NN9Dr3Rh~e3(=)&y!yE z+ILa8P`nX*SSB73{z{RT{m$$#;i@Q>Y~A>-*V*6%ehGgn@L|OS^Som3`Vi(1)1E2fATbthUr#-3WARWbw<~LjGSS7m zS9(p`kzH2!8r^Y_4&Y%rAfDIu3YX#zzZ}5BbU=J1UBCT!m=54!Iv~E1ZrDET@2>EQ zgZ2UOm2}r#aQ=fYb*6}ew5N)Cp8C4i##*V|s{jvDc7XUwx_{T!jC(#LAt%Ua}^B%Dui}wGNY<5nC#y zlN-}FquBt2&p!mSa5RKM~(z|x(UmfOBVv$OGxe#)v+1FBn`QjMt^5@SeX`ve6q!n zF|9%qB5dsPYi=SKxpyJkBzE`e>b za`~O)%K>~MMt1Pj2R0tmh;jr=dYPzXC)uW3crD)wtdb=6i|82D+D08LuV7XYYXq!e zVOOkko8jJI0iT$m$SOi{oiSS;-=jJE7G_Bir^|BlOwRI(Rt_DSI>Lh<~AI9>FHgyoT6I|OzpBOIcTI_}Q0y;xu`XNvAaxyP`l znWZnGfJ?legn>4E2{GCz&291H;e#!ctOLu<8Rn#GVhx8#4228y*+Rxv9tMpn z3de>h1FEY8ZG>7|1}!dw~%IBdf~F3?T1%%IUyjDt`1GGvx>+v=R*NR9_Hbg;qO%0G*C^ea6ATQ-CPXeq6EzzdP9YYE=bGiSuh^qLTIp{(j`fVQi zU(k53;x=`8y-7FG3=M`bf`^u*!NLKv&7Vt@_i5NSlSpjvL;OK9*=5t(zAmsZt0FTI zO*ku%I0Rtv^7?@u@7ZC0%8}Z=rI4bruHM!e_HAC_yWs%|<-r)$N+Vt$;ACooaD1D< zpeSr_EA1ddzt476;pIXzWbi3ETmJP4zrV51x6=}LuNaCE3Tg*o5JUT$XEim4300BZ5m;n4vkA#9Ifj+s9 zbP%cpXK_<})jv<}V7Cr}7V9ho35h|5)6HL=w1;8BEGB7-fq0<;Rgh!$8O{*y!7#w- z#4iGNwj_WP6A(^ZRni*}bB;N&s(|CMAd-J(j`Dd?K^fP=ZFQ)fxdfPIj1K!gmPdiY z+kVfp{fTRKB5Fo`_!HV*~8(@@Yvh9zH~1q#_?=tUm*9qanM zKnDDm0vY=C0*m%PFR*nBZ5>9h)!0Fn;uQuVL^~n6(teSlQh5TgjDyich-*1gIiMH> zu{gq-!IQdj@EMPkflwIYyQc`04^+1M)3X3{lZO2Hd591l4eR7#*c(B4Z=S#|_o7&f z2l?DG|NdzLC1{#=gMErc?rjtEVw>G!oZe)+y0TGSb>ex3nJg|r1MtLzc|lcj^etEs z(J{Ccy|bk4yf%6BkY!q0g$V-(3(NAAnnOH^BZAIB96>ZF=!oAf4<)_8ZJghN9j+Vf zPs%o3+is6I5SA>l#pIxGutE{zQa1-!s8XSxja{Ucp6qf^7rR{B8;G>9Qhy^4)Sapk zp)v-q9%-oTPu8HNzS$(V5YnJffW=P8z5*SMak})>BBCgJ(eS4C4C6h+_!T^9rt3Jm zH>x*k$kT|>nt;{J@B|c0)U2apd6y4X`|Z&_dE4+tx6QH6E80=V&ZQd67nu(`&2qo!24|tyD?GTT zfEwMApPStZ=9J-zp|?8C@BrC#Uct-J|Md#kx_Jb5Mw>r)2u-?NBAgzeBv)Ac2a#Rg zfPyD@abl~UMyW@d^lPh-9_OO)2$sxi?JyKl!f2$rHWA}-v#sML8#GM3c!(31F|@g^ z5&|^rStSjS4{COY6vXB^)OC9dUf7q76?G~x_BZlTG14Ucx6(EoNnQe7%Bue5Mr;?! zF+4mV2Fc4or)CW8rU?JW3<>5jZqyvtGpt%B`X0ketpygbcPmTq^&n04m*=T;4r@XG zEl^Yb^?6F0?3(nyhW@uwWmH&gzf!6OmQz|AV+^XBQlU)wEKpOvT0l`>^o`c?3GSc- zH5lo#iVy3CQ?t-ZmI5`UsA=%A!S2BI+(&KQXDMUigX=pm^5t(dMN7;k=TX0fg)CW` zc)3C35ZdtVXulXs67@qMt#%!3eNiq&d1}Rcn3r@!Fkf>DDOGS|Gp?R z+Q||aS8Zj54gS+DfcqF)~+IHLl#6D`EzwR&oX!&3!f3>#!D zVJxxRuCc_^v{)-_0&J4HL^N-y2)+YZ)EmrdJQg9KK;gw9n45c3AQ&gzh-`CO;K2+f zX{m#V5f-Sq{;7y;CFdcXA_PmUwLBCC4b`nIj4&th23HQr)NL2B<1F3cY`7aTP@9wj zC-Zbw${Ck#qID^Fggz;?i_8cdo@Ssb0fk`+E@bZ=nY+66!H^I0FShF=IY-}8 zo1Ai;TcEo9ScHmtcdJtv@x#&CB_t$h;bsX0o2MA>8ODExdHW30e})-6!vxPT7tb)m zv#0gxoj*tQur0M)Z6Oh3=d`g*@O8}JlA)VT&^ig>o08TAXT_H{lAb-3MlOgs9`q>1 zfmk35yYY8LvduDD-K^5bM_38mLYa#_*13vxIB6?h0@oh*0)ZMrf+~1TS7&j^}pu*w$S7%p8LU`5VF^)vU&Bi9cc9$pRumvQE)nRM?f1_D@)H02EJ)MG>Efnm$t>!V9RH%p4ukSM|N1oW zh7mQ_|1;G4KSTXv*mF+5U@|9A5n<-vnBZJOn4nyx#5Fp`g^XM5t6(Lvg{{po-tA2{ zH9RYzZ~JVjK;UBU4i8V`(ViU`cTKh>@O^fhZtlC0N0WfalM!*|63Lf>@lZSthI8_` zX1E*aTi5C4=n`|`=$-sr$#pf2y#}5>XTQna(5AyRxe)jV7C_fkisSJTshCnJqAeAAI$`D9p2&6Iu zQW*lc`6@pc0;vpvRE9t*Lm-tQkjfB9WeB7)1X39SsSJTshCnJqAeAAI$`D9p2&6Iu zQW*lN41rXJKq^Dv|I_v*@Nrf3{&()INheF!OwvM2(#}i~LX)OxS`nqRY%OIgr63R{ zOOu;S7G{#teY}1?_yqO0tACREr>ehG{oU%HuKpS7 zpQ--Y>hDqi9QF6Af3Eub)IU%C^Tkiic5Uy$E8z5X6zM^Y9*Rb9OOGlUFX*MWR;0(& zACDwEp({P1zeCkf}sYl7DP9>lEm3-=2@~L;pKTCb; zXbMwblTY1EKJ_^H)am3?zmrd0PyYGplNL~z6oGuw1@cK9$R~{;pOk`p(hKrQHOMFJ zAfFV3e9{r}NlnNnO(CC@g?!Q%@=0aLC#@l$6o-7$9r8(i$R`aVpOlDv(j)RomB=S; zBA*lrK88=Vis1tXrm%`J1P3OtiZKKSrmu>r6%I^Z6{86bOkEYD2@XtL6{86bOj{MB z2@XtJ6;mr5n6fH{6dahaDuxssn64^@6dahWDyCLAFjZBID>yJwxa1%QrU`E}CkG~} zig5)8rl^W>1qUXmig5)8rl*Q=1qUXlig5)8rlyK<1qUXkig5)8rlpE;1qUXjig5)8 zrlg8-Rjoot@s=vcgv3BTNrHS52Kgip@<}A*lT^qj!H`d~A)mxUK1qmt5)%0&C-O;D zCxMYqG9#bFMm|Z7d=eh{BtP;=gyfSH$tOXQPqHMR#7RC$lzb8@`6O5JNwnmX zbjc?HlTR`xpTtZ)Nt%2THu)rP@=4_6lhny4!IMw2C!fSmKJ@_k)CuHMKafvdK|b{c z`P3ogQ=gDe-9kR~4EfYKN5egYjofsUU*$4{W+C(!W|==ceA`~*6F z0v$hrj-NosPoU!`(D4)K_z86U1Uh~K9Y2ANpFqb?pyMad@e}Cy33U7fI(`BjKY@;) zK*vv@<0sJZ6X^KCJAioH1Uh~KEPE$-dk)K91t%ETZeWLj6AheX;A8`*7&z6yP6N9P zoMvFRfzu6~Vc<*yXBjx#z#aqV7}#szTm$rDZJhhloSq>kq0`w486sRSXhC( zWb`aJ&Q;(ZJ+{GtL2lMYIMFpS?_rQRcfl;`2m@fy1s35PHGh?bDiytev1Yx1qKIAq zh+YIUPA`y%^&*&Iy+9Jt3(#3FKoGqE5WNUyNH5?*FW^EiP@L%n2+#`@MtTv<)aV6D z5WPS&=>@WxUVuV+0gv>8Lagkn7sx1j0U&w-?pQBC5WN5py+EO+7f8f3oxnn0+Tn7kHG9jVD=(#dVx(S zu@`~Zi$L`Pbg>tK*^5B+Vjy695wN`oNG}Egrx%DMdl87e2x|0VATWCoh`k7$ULXVM z1w6JF2+^nt%wE78i@gZUUSJ;Arm4LM%w7aeFVF3i z*^7Ym0xsE$!081DWG@2NivgVYqtircCIYh;I4e!|B5-flx07@N|!}7r`RY3toTMvuZGum&VGne32LqrZ?D}A{kgs z7}o8;Fq5oeL?i+0i;#D+Tm_3YVVr?M5dfPa0P4e_!7PiAp+pSo$i6UI%vGuFW6C12 zGLnuA4WkCLH9{w~5=5G%G;{%@MKT`=78MgL)`v0fWxLjju1OLxLyQ~D5=jPDI)-&& zR#81kz}m+UFBGH+OR(4`#u=!g0BE8BC?kUgvr|HbN;0S;YsIKJqL@rrBuXmDNIe-f znB@{WDXAdRQ>8gMiMBGe^|>ZEj#*ke$1#l_LC4cHGGhrPs<}*QLfz36O`-mBe4|rg z4o0*%2(>tfXmJqH;-E&0gLh-h)JDAZy+A;4=Z<~h{j zK;8>2)!--qEwVUCjTQ&>PKyJl#lfObi-UTn#dsdXX>qV9)Z)Oj80K4>l~FAYYP2}W zs1^rKi-Uz)97MD@pw})d(@`xB>P(A+I@4m%oSZ@}4*pv$4)~$hq0NKxJS>1b4+|jA z!vbu!G<^oP)Nc=TA{wg4@mhNGHWp}@fAF;dEE4Ic96UO9iDjD{w?s4_ktCmvS0bLy zQ6j#IlTWnt&hW81fHXZTO1_jgAmt56c>`A7fR+cJ%NvmL@N!})Z@|hM(DDYPJiMix zk11BUyejVb@^Mh?p~(?W_*5Q}@j1_`mWPDG9}+Tu)hd(*?d4HgCq;tkI%+l3pgwfY zlySY5jRf^tJf)QyfEEeUlF#a)#99?4;o9WV3GafnOTc=nPpEjpiYnBrE3VNnwMes4 zotj=M)qvEh8Ms=-I6sPa!;X&O$V3*eNXKIu5?FL84j)*=BtO3)5qRm_5MGUl=YBMH z3GUS697zp{&rH;i@Ej!`U>n4lxh~BYQo0YJY&?Y0a|mVAA(Y-jD4P$V^c_Okq7*y~ zjxR(`8G9Nu-ZW^8Y0$XRps}Pu<41$Wj0TMp4LUaDXsKgEf{qOdIyNNe*pQ%OLxPSC z2|6|;=-7~;v601j*NFiYO#=>2j0Qs%50K z4nV9Oz!uA1GB99Z(7=#^VFUXW^cX)q#!rv&qi-YFzoEzY=`ntKjGrFkr^oo|F@AcC zpC03<$N1?netL|b9^+?|@w3VJ*<}1|GWp>1GW5QL{TntJKbwr7O~%hA<7bocv&s0` zWc+M0el{6Dn~a}L#!s*D(`)?n8b7_pPp|RQYy9*YKfT6Jukq7s{PY?>y~aiji1fN&t~Iiv+=Xp_}OgyY&L#28$X+kpUuY4X5(kG z@zZDg^cg>W#!sK|(`Wqj89#l-PoMGAXZ-XTKYhkepYhXY{PY<=ea26p@w3JF*<$=` zF@CmeY_w01^z(V>I~bS^y>vg31k`%QD_09Bv%%2~+ljDSIki zbu6uoGou?9IW*f9!QCOQsH72eqDs;9Zeyr-1TEV1Zeyr-1T`9Ml42k+1t!@Z>x>@b55PoB&}GoR z>IoSjDA73PEHwZaWn3CGIWlhLF_g|Fs4Ps5Opb8p6406%c5{yojv~85k{dMqXZ;qa z+Nps^A{hishq8t_psSU>@JCze?j6;s* zYJk#MtZOIhg_aai3^2eN=W3rEgD5#2Bjr!9j8Mi}7vYc!nY)~jdWa*brDc>4vT`Y$ zqK-|DiLwEhvJn)moq?_~y8uQ}HJ$0wkuuXYBbrS>i(u$7$Vfp3aKM!@)M&GrGiEbq zkV@(_CTGm<&1{^}vH+|sf?C$b88M4UXJ(P1MXODjAw!~^uuT!B0Ih9M1EqyLhvtO} z7Y@yS%)s6%#d3yr0g=WbOrWmSS0JS3ePE_KCm0ts{324$l%Vn*%a>I5atH_f;$eT?wL^Yd*DOt;|GXVKd`Q8X-qh zB?e6gKM?*ip8{1F8j!&+0kvQnsEHACrZJEbTQ?UJNpUce%WS34)mBO%1jy4p zJkS{Fpc5=ZlyR7ELWU)%Bpl00b6tqT)M{Xmnv}s(kcP1d0=+Clo>7>BW=kOE_1*HP64OO954k%peM|Z;Ta7?vSWxwVq8yB_DR!y3AmorV6>2lXi^e_jv7iz za;OQ`)@b96l2XS+l18)^R!8-XjZp+!FQADkR~R5ePU$Zi$ z8p0fIVL-#x76ybPHFQUK(?tSOSPQ9i=&$1$S{T70Kipf6AD%m0i^U33N$5M58@(6e zNU4ysD~A=OCS;P;RrzEWja8Xv2UNT#6-R2Il>l0C z1YL0)u;O&`r>Y%yq~xX+I!SiX^`n*xDACiVM*v1qJ({+)*0im)2xt)uMF{{^%^0cB z1&h!btI!2oRVvtN$j22-f@RjHyQYO-0xp^u}FeuG)>~-r^+BASwK+rPiVr{xR z6hA=~f437qArn7i6+dB<6s8zyE6+P2w7N{>-J!?{TC}R}G|x$zn^ad@WOBxpmupBU z=WdfTfQt_0+--6OaM7WhK{YvdyM2*qh9+kTC^M)+xN;o{bD|X8^Oz3zJQ%7H@ty}8 zlxe!AW5dD7ge#YQAzdegY0Ng3Iy7obRrA9*l3I)vQO#Hh){f)ZON*E%>n^sZT4LB;*t<|#*j?d%#xyvVV(fZk+7{*jS`|#H z6v4JNgc42jAQ#~@h)kbSw1^3q2F^!78^h3wP=%ccZ3IKDmfm(E#F5^xQ3 zT04iXVkr`E(azcv)fJ?jG#7RfLz9r}q`9s+E0ZLy#XFgkkz#Fg-BvLZL7m1?uFJ|{ zly*>gqw64sQawTKAcERK0=0uQARUi@C=vnXk)bON6|*ra!|X^`GSZF`EL~ZK!LSrz zS29(*lCgFrW9v!_Xji(RF{zzX-sn1qp)pA_E3f#8N^*?`Tp2F4P0~nhvml_!!C5V$ z>G&vPqlEj9fD@B59Az_B1YET1yaUL>-3cJv958JHka`JdPKK6Ft>A%hATzY+1H#sU zE~OoN?&!&j|C256DSttP4~ z4lqKMVZ#Y**l56&>{8pXK>`~#bYDuVaGPL!ugY@kz^#tDfy>a!bn_!oT{9zNSm;jR zy3htSWX6r*Dt6kG88=9Y=A=NAC0hofMkL7rprFEqM(W{lzITHy9sKm z08QF}*4+%PyCtCA&4EY`V-oa`NeLK}o2=EWWO_P*_8l!)ywrF`L5J311gt)zGFeG>Mp^ zh0}MHpvfszG@8j(3mCdCVXbq;xs0KJLq&s$QUwSVjf|OPauy8ABj%leQx%f3s+3x= zYG}b2TC`r1RKsgOhE|WeCLyY8mDDAQ&UD9@yKq60@P@7iOdBaiZ-7Y*an1`a7u?9) z(`wCtFzhb$Mr{fppzUU8=~RHS|I4yuC=Da1{Z3oH8tnwg+rUt|5s!rVVqi*76Xwlm7 z^P}!!l%Yh^RtgK=ZKP12v6!S=L)eY?29^8Ea>+H`b?_kP8}Bx-(Lj%a$&rHxdA*0# zooRKYhr@H*a7r9lIwfI?}6@WRm1diVn+ zJPcMY5yacr4Z`1#cc3l;Rp2P6U_26%@s%W(1TTD|LO97_NXDTz7*xWb5yq4-gLl%F>W~HESJDt(+Q}pc9*D}LL{tI!ToWgz7)nbq zE-5J%5y1VWBz#j->!zEbLzQt;Ig z&WsObuwT|vp&g_t%ndZzac1eNoPMMqZ`VSyk^Ujh2VXRk0GNqJ7)b{_B3Y5RTd6|LF(J~&>%urEd|{J-N{ylP z)?okS9J30*{#gGQmjoZFsc;}+VvN#qb#o}3s{>F5=QQ6Wz$ize|InAzLPls45gLtGfz1o4rK2uag{q$>!h#^6n>T7cR) zWTSyY?NP`Tl4Q6d(gIysSaEtZTo=_~RwkMNaSLMm-WY*#?E z^wK)!O>l+MTr(^e za#9gh)|4tFB*g)VGzcgYc)^&_Tptq+(ORCgbi$QUwg_o5UKpX$#7R%)37;P0_Tk`w zm`ws&UD>*xfXgRB21)a&T*{C(2@1aONWf(hzOXus+J9Lk=wvX+=F0-3(R7p10NyZ( zS~Q)A3NwhUzE6k{nIB_N8zfHm$MVoa)Wd^!CfwuI|Y&LMj$7|5H)AI7|t zNQ0j^qOmW&q$J(tlofoKj$`mzJNEI)JMLFZ6+*y!@tDAq0hM899(p4&P!<8Op_0d9 zu)Yw2rEq4R2L)}9>(KH%0~S{eiu!QGz)7i2~Z{ua4Lzy+g5EMK7#sZT@=<`VH5{k6goPL;(#lImRk}> zJV}Tni6^}3o9d#9G5EqFIN*vP^B5K(A(xMAF$bvlNHMek)u2lY4GZhwKqM;CZrGps8mn#fyntHl9K82noA+ZEzAU$U_dgv1PF5i5+dhtszCAyDV&Ig z>rlU}6LA?39k#L{gzzMmd>VPs4+umD9tuOd+s(ZF0Z zP>BZ07KkW^mO^EM&q$dy0aqKPgBjIyR8B>%cOvD?IS!osYI3OjGzWDaJir{a)V*(;pB?9Z9Fh?{3Mmvm>a+)ZhezA-FOmLb9eCO(P~=H&7puklAu%hI25sVn3eb2OzNDbG!hZraRw z6?0{ZxiZB)k@TA)xR<3Tqtg~w4ROPw1wbS;`GP2erNc%yhQ(X4oMY6{nz z3kjD7L&KJuQs8sm$T?o>pY5Ek&QzN?h)o_1OZ1=xHF~Z#jCE9Pc6?e_ij(XvT7nB= z@hXF8Vmt#K4Z5l%FFvysjm7JLqCtEWMuH-Pa@oZT<6&45RIn#glVcLAASFl+5=^v6 zmW&W20g0w20WlmUuyCRTt|D3li6PwEY)3>A4qAW`VyPL48nXaJjkzcaVecSPA{L|?;^h_ASCL38QX`SHCl-ms!c{|T zRxLnPgr!iFD}-->=(fDvbebQvLkx`Uwl`7r#@GC)-S}eUQh=&w;F*pf-x9Ha-XU>8 z+sD_tR`a9oHV8wzc|d16l}kC^84Xw&dTVPwyobsVEy5~)s)8?prh({T_qu9%YNm64 z-$1uR8y)I#Xp=*|8RX;#+8wDc0a6z^-Q;W}r-z(PR7xdL7#AP@h9#$t6b{aA?q>A-=&;>0xh9L^g+ecD&gSAU8k` zNCe%kl^Y=FOa*$Q3HMr!QnoaD=ZEg_=q((E(s=~+rY%FcrzlYGDQdvV)qC{g;aypV zR-C&lOH{hq#k!yYD?@L$k9WD-?F>b`kydZoGE&_YEVo)2>rGq1QM%l;6*}tYo3<8m z49J~N)EdeJ(4ui@-aSdnA1}$eAYPgmjhn)2D4bGk3Sn=fqi*iU5+;o4BNfx<{QF0P zFk(v@^FO}MI8~>9|7^WOvrPu^(h+!Sgs&QomhhGI!#OlGe1L59EItQUDRt7#A#8P3N~MxiSjG!d zByS@U6B<+8CfMuFlf<=wxT9)V=f&V$gkP!XS8#gtO0)aQ3-~_!2WdVz{7g z5Icize8lj%=*9!jJjQL%y_{3m5}z~a>~ke`ywwy?D&qxS;9;(WZ&ecrx;ufhf+Zjk zvyljtMXBmJ)qc#E-I9i2(Cx@Lq-H6Q!;wp6A=64G=$5J&TQR)Ei9{fCn4?sdf-qBC zdV*Fhu%#ww)dE{ae2K*}610rKmXV-k1TK|@$11H3g6;-xlLU-?4&k|?FbV}ka#@q5 z1dX8594ExASV;&6%&yW zML6Z8fXRrvN0gJGRm+{@$W9|7T_Ylrj%94sQouyQ*!ZV_Nf?;qfzQT57#e_ZL|QIv zLLVAMR_hN5)I?c-a1@v|t|INk3}Ortw06=3kLm(J(|lkPFD5T1UdC1o1*|H@RuBcO zoikC+C19L$$T*ikSX`utN!$x`jhBEG!67R`0#*cvtPOPC=kgG?Ht+?Zic2mIO&Adg zNc}2P;>B`Pgw@B`BtQX^0Nssq>`TB{;gGQ}fv`B1fM_6H$66l7#sFX7D*JM=tL#(2 z7@)hVjsXdTg(1oq;3%g&9CGp-3mKRsYz$DqSY~Vzpnx%e`^u#2Vi(2`>cUgjtSIYYdq0i<0)VzF*Y`^k7KnFw6@Upj>>>{dX#Bk ztCn_ztSZJ<3~v?Lu%-<)D~KY(+})Afz+vug$LQn;aG1N><;IBsmz%NWrhqk*vE`Is#qR2nR^vGBO9kA4Z^oVE}@Q1|nGoBdMSVVOe952xwO%JB`!f>Cj|EqN15#^}=*yz`}H} z$YB(j+As=sKa8SjBaG4_q+*()!YD05qG;ZwD3M8RdC{2ZNC8-cgjoh65m>>65fhOJ zEDXa45s6e-j?fQ8GGN(G8H7h#>xbE~GwApgx^ynCVZw<0jBSghw85b+hcL*>QwMNo z1K(yJno@G9&+Rsq@D>exQ(C^)nk8sob7i`G9d>bqF5iV+L=^r0YaLKqK zS4zQT=Nxtx0(?b%B(-P0le`)BWIY?bI@Kj_c*!nP5nXU}cTNlsi7ls~gk5y0OwrP( z*dqY0!@SwmNi$jPO0iU4u&yqZm+*XtWs9vI7fu?bGL_cNr4icbP>(~K9O`vwvqOE1 z>WL>QhN1AsaDz*_B}^*yq<2h?&pv@GeOQIIr!+~VCOVBmym<6e+_oxQ$>TF_#EP3 z=PWq~$hnl9gXGMSGoOT08pd}wJE!>TyBQ$t4OJ$IL?f&+odO!386`s5rJ15Mlz5gv z61vy9f!!{4yV>2yZV$Vg*zIL^GrN84ZlOW~`doCAej0QN-#Nv%XDdyzBi3)>CO!fbve}S&_;)P9NOeiuS1(1>T}v%oh}XHE7@XKu;S~i zjLe8`4|jK#_s@tXlxMs9HKh=yrW~OjZ5@!W5+|xv>iQ~meU-YtN?l*2uCG$pSE=i( z)b&;B`YLsOmAbx4U0#NlDRqFa` z=X^7E=jh-||I9G9o2pag8Un^@P(z@D;fp!TG}2#E!WTM0X=KVIefph(l7oX(05%^v zegvuU&F85~JqIr>L64R*oTIvtkraTwJksK*oF50jqIBpZU5Vh+!Ps;xk?E3Bl)k@2 zR|X5IoSLZ1xNJ>ZB6A9&a6CQCEs8W6d{s&~s1%Gyqq$83pt?LNIeOW7mPze(kXtQ@XTlx8@RZIZ=o#Rs1E~p6|n`N&j$_Ddz10jVdUm_ zB^yL)f%1lA#r&>f!66g7#v_5$2rhUJ*y!P~`dH@h3z?O}J5yssH^DtM6E z1oJzX1-fy%h2O@^25NXHiLd^4UIG^#!R{ctL?7tf&+Z7jqwJ2cJI-#I-3fLl*_~!r zN~T*Xc z1tB#@R7ure!q1yTJmiT1zd2OFz0wq&bv%r{qGzjnne}P8^}AF0sVed&T;XNZcD* zO(!MfdMBsLbpG36tdN)oqC=U7IhQ8lTy<3PAO>h@v7t);fvLe#IT++xDGujxl;jeX zjp7oO9f@nFd>FtE8&^cff}VAUFxF*!8=TsI2$9;w8p647mF1F?2o5uj>7vnM`unlK zrdU@PUCQDeS@){sOU zh!#_g2DI+xsElc@K_x-|)a>LG^ka&9vWX}&VHjC(%}@>roFEeBBCv8?kfIufmqaQV zjnsl9=wYrk!pBG?1y!TrNFgJdiCG(>B+*g_K^T-WIKgDFfWWLqQ*e$bBa$Ubkv!3A z#!%|m!fK)fP7p1FONDaEKqHw@5>VN;F|XqwKw(3XAh3V}B@HPo6p_7UTR{bDBDpin zrL_>*Qby=3cnpJn9Kw&(%LN#PYf*}_&$SS@QY0cno;jsaA{-it6^L6ZnViOH!#T{Y zoZ=aa!_(C2NSM@1!z?+LQ&hHGK$O5al)y!fP@^L(un;0)Dj^y_5Qe!*&L6FT3y2c9 zgeZZFi1I*ePeJj?nM3{;tfxqBgrZYGDRmQzuD z$69E@?^2>t-bhNOQRWCO()embD1t>0q6ALxwB}hvf`@s5G$zqCkPD6&S2}T?X1F5t zvn|qj5*1P`HHj@Aj-glZFd!~`gUO*;UUxroT=pL1xd13KEoOWWt96@Nx$s zd|Xe<+%E|$Q@ql}M~M1IX2&>LmNuy^fbShSoTW{37lEyRhp~n=oW*J@3}Cez31AD! zlHusB!*up14A31qmnxbAcbScjFSdn&MYx!C5p>7h0(iw$h$D>PD%R1nbWX%&fIb+` zVo4tf;0TAsEQ;btBIv3VIGR6 zfUz=Hfc>%^|L(k<()^N@@#g<|ZkPw}Yv4i5{}+ z7iM_c7+%SV`7+cj7F`pwC0G@Wix?!1Y%UMa;M+E5opp|yUvBAvsBBHapy^KOm>IM^ z$~uC28O5z<4Tpu%Acv^UH|iW^2jXTvB`*Dwn5<$$rT*Q6HI zt4b3*%%&4Oc4M)nK|$;|s5Z@VPqMxYmgpl_n2awivoui;=|P4cmgw&4H6qQroS|BE z>Z`Sz&{<$Zw)ap^eHir9BM_W#m|u^Wu>p>aZiti@Pj=bvsGL+U-yM;Y z+GV_>a#FpVcSKHVm-V$&yS#T)UJba*d`IRY>~g=Bit7?y(>f~ipqKxSC| zP9hyHpa4gVL?Y;Lfs4Qq0*7$`z~#1WH`$cLY~o_bXt*qxlwAbf;&%bMb?Q<@bKu6k zOGG#BT_W6)cM){s-bG+$b66SSHeoZ$WuTkwE)i_Fi@-uK62QHBmnw=c5jt=Dj?)PQ zO2wfO3vre6k^H!&PpNo&czABOO#AIH@j6o@Oqnl@56$`OU5dX5Xk zns^E;$IJkQqYThRWK9NKNFEZ7R)A~BnhLSHu1QbfXa#g_S)-avhz+w7xq@Z2Rx~i0@=qXLKSZ-KUR0~^5;b>n`INDbfj<%e_%GC-o5PFNJKV0PUO%}Ro zgQaXp<-}@l7Ls+MT1eLM93gYjqVUf}J+wmAtVm+!gUL0ixnxnZg^9KAo|9Zt1{bZ} z7D>(4p2S3qt7vOzDo#fu?O&LVDq2V*B~uzt?`pi=P^l$qN^Yo2$Vp1b(zy+{XTUdY)sjfqkE^I0rtc3{?=IS*!%T5fLW3+~*G8TrAnKd9P zJkA_ZZkLj6gQj#vJ{OOX?qG4+cy$adpejpzuiMlkQZC;wb{!Sb9lmGkBDfYUietiR zBZaZmqe>vJ%6LUq8#L^qVX7kL0r4MZ$ z3aDb;%oYw!i0pZ=_=yyu)#IT*+yb1!qlk+PPL2eQJRQQJSw|fWVL5~ovymb~@^lDi zLO3$pG%!1Y+wRq2I%d;9K3p3f8E&qL$No1?lteP%%Zm%LOfLuzEC^35C~{(9hM5H! zaJgSw<$?kxD+>|~E(nh;%rLjG5pxT(%q=KlVHM>C@dp-!tHU@Z6cN*c=+Oln1#=}H zS5UP|&BaX{%}#rV%Xro_ptq4g(Z+SloK1pa*QliowXpYt9D{=D}s;BR~10sgM{E8t(_&-Z?VznJ%1?@8d_ zdw&G}llL_6pYa#-p245*{UsLjVlh7!M=KMtX5huKCBRE#oxsP$HUM|U27m`+L%_qa zOMok}D)3C~I^Z|O-UNJo>~7$DV)p=lIQAvrM`Moye>wJL;IG8K0{m6~GhWR9tp9y4 z?*G95A@GmufTsx{tfuq)UUl*>Nlz1dGXYfY4DR?m0sof>BG`R z;PvVCUOatd`e@+J^d{imbT9Dc^k(3`bRY1R^s&G%NWTF1xb$}59qC;t;k5K_P)<*u z0m_-_8-Z_1-vs=&^gDoWNxuvDw)7pq?@hlK>EDTnH+Fy<`m#lGp7RY%$h-simdq`{@66l={O$~R%e*)9Uf}m-ehK`m%&&oe zlleXHQ<*;jKb?6R_|KU?13y!Df)}gXUU#w=uREpgRN$R;X9Ay9cNXy3b!P+bsXGUF zZ{4}T`|3u4gStu2ubZm77x=!q`+z@EcR%n)>mC69Slw@de^-azse7^x_0~OA_YCk~ z>OC)3AFI!J@%p+fdMdj0Z3yjD|k||FPk3p5O3n!{34b(U|o7 z##Cd27i(;6Tn@aVF$dh**b3a%xEgp(V*$9>^j$C3^u4CPdhw>eHJ{|gnon-t>-o*+ zu6T_XTXF4*fAiui-oN6XUaZAyiF@&uL`woV*^&ZIw|oTn{+5S4zvXi+p96ll1*5p- z^DR#T|Gwq-z)$61VRDz}Ug5=augu*5{MOuCJwJD24tkQiDfdp$Z*9$cvDQNC(VpMh z*>?i`S?^q9f zWC!HX(b<9i?Kr06c;Iav+kj8#I01Nj$9CWy9T;~Vr*)hLyu0HZ;JqEt`Hpit_5q*Q zaUSsb9mBx;JN5&Qbc_R+JIcTl9WMpGtONbhae2opfv@Vg3iwqWu=X9V>v$dT>pR{6 z{Kk$q0$UfuC6i8@|q8 zm+<^`$#p5<^g7ID>+07*s_U}r8h{(uH3B!~A*Fn0{&+8z-49*;D66Q0sON(Y-9d6`QHIQSx9=ZLaNZ@ z#S6^^^jcwYVJYyk!Uo{3LKkp%0T#Qksjvh1#KOtIrxbPrpI&%7@XZBib>Y^+t-$Xp zybHN*E4&-{_QLJJ?RH{kmk+;X2!xjg?m8%aN)zi_ZIF2{l3CSL3yC?7f}9M zfF>9IR$Srv#g<}=7c1t9IpEe}D{xy88dY3bghmxt6<2xj;$g+rpsXpb0p*BdJ18B+ zwV6>v+jACHVxy8Rc8luIN2`6E*^qyErHWq915#J#7Ae;Lk& zbo)2Lo%Qd;b;XqbsnOwqivMW2G&AWxjdyf+$14-%xrz9-cmirLemf3kbjRx)3adx5!)UwRju6E^m`}oOhOYo_C=)>{b4c()eD7_ac|W^HzBA zZ6}?z#ykA9o!i%V`Loa32G=8=W8U%VkE?$Qr9SDLQ`dOCr=NAo8t=HXkKet zyrh@)mUua@+dI`e-85*DR*aOZ~U`lZad9wRz`z{Vspv5K7G3<~4i%Dd$4+ZKs|B zS++A@zPHvpO69ax{dHcCmpS41J!`z(+jpF^#@l5xNw1-q-*ZD+U0E+2`F_s}in_*Qmb#O}%L?q+unyXV8L#xG`fKf7gi zE9@R*_cC^`8tjIZxt87QaDaa%egnHV4-QUD$8TfzeeB-F?tScjg55{h{TjR98Nyyg z{D(P*lmM5nOMVap53EHgX&D8o87)q zl%F_`-R5BB&R};hB1?%2*d1V(l9UpY?9Q+|&+ZlMUd8UU<;mHJ#C7GV!E)jT zc5i0)Hg?~~?p^dWRN}tL+3}gggHx3LGt=aLfwmzNUt#xgc7MX|)9n6(++>2?dOE9^ zY-V=_yQ|o3hg(e++2xzF$sWdA*?keaC$hV%0(O&U(IX?tee7Pu?hw0U)rrCB;-A~L9 zSEiB=@x0j2?ku|)y|CB2+1+yEm~rz-|Y-6?T`g`!05GWOqMY8k0wI=qh%%vb%-dv)FwFyKqqVW$eBf zt`9qN0sI8)bPwjdUXFpqLd+G|lc3ZWv%8Poz3g7d?u*!svwI4=Gwfn6L#{e@-@)!6 zyVLBBvU?1>$FqA5yXUgIjolO2jj>y1_k4CQXZLh=U&`+D*?l3qFJSjLb}wT0WOmPF zx0T&H*xkVHc6NPs6YRn=gLBNba4&(Ighg(GO}#>_#C{z6W$bC+^XvU({wja1f0Weyzxc`0Z*8JN4qyKC?5zoe#VRt4U z?~M1xkBgre-yPoIT=$Tl!j%d6>8p8ejb&aZ zJ_ZtNXI;Dc-B|yiYwEUf*sr^G(OQYgJ}#7o%NpLtDADk6!_$pxo7M=uxuA=z(m%T*NFZ=Marv)vaS$@Bu6>C?V4?a=YZE?W zE48k}J}l`DdrVq&_<_T}wtAV=w|cL{t=4v|9@X%)`j2ZmT$K`ktAC;4KMD`4pOJKH z_Ob7;`N|Q^LOFtZ5;-~!S08&t9KKEcJ0!>2wQDbyve!N)IdPrMeY{R(wC+R=4@u5- zS8Dhw^|i!x*oC1Q);%nKo-_;Le4qNHLm6CAKT*6`DC-|n|NG)U?|}G6Em2>tsA5MQ zrQu`Mf1R}csOuzrGHqgp}$+`C13pgkBUF8T0UNua>nmw{{8X$%Q;C= z#ttJ%s{A$eRlmyL(Xj9wFaNmw?8FMmGpSrmDc93Ql$!AT>0_s#1j=}^OD;ede&uQQ z{aJr@73M3{Gkdbc%)UbW1Ef<(Id_Xl^zy?IM!G8|g?`0l9QLpH-plBI1Y%xxxcb}G zA5$MYQXGGu`rjA-N*I5lUx|GU_IIm4qyCNRe@be;^5^Ok@5uM^cJ&Xaf2;ZrssA|p z{>z_uh1$Yb67R_Qsw+fWuGZeVMtax3=EiF@?={#jq?E7L(f{h4hF8Jgi|e;GkFLg# z!ZmdtuK2fO20a6J0`6Upox$Y&$sfUefboOuKC~V?w#lzB{tEU}{M1&)UnhF%LZpv* z^{I3!n_7lB;dz)5Hm9DSIyrR_BrxE0<{r#_CijKhqq(o;9?yLz_eAa&xnJj=%>6O< zOzzoMuQkz{Y0b7aw=QeVwXVv|wXV(8=lqtZTmG6$wfrO3mRpfKJlCFU%q_`v=l17% zbI0Yj=Ck{95ws$;U8@eKVCvB{755rRr0QFpo8*7N?e^j!AW;dQyFph zl>1BW@2#=cWNTe(L+j$!<*lu)hqbQG&9|=0Ey~4P{@n7nT)O3-xs|z=-0ECMt|_-P zw=p-8+njr0?)kYLxt+PoatB)vL#z6dA4uMrybEo+8?F0rq2J#8@X@i{yp~tZtG8T|C#$$?svIAzBCUnn>^PeB84lgxyL-CpiR5ue4Jf z!Y;AWb~;4&uc(wv+E2&RiF94MG2N8T;m%kLdp17C=nAT%c#aoOZ%wadyq7U{q>msR70n<*u_Swt(eI&*fGJrD{9}GUW#;wkxsQ6 zwkx&|wIquBs5MO|GR7S)J zz1&-rZb6S^)2q{Kyrt>(^g6l+ADhQc+jd+f(VkWrHtY)T)!y~EXMP9ni9d*Y-e2>+ z=RJWt+t1+6bvCvlwkCEYdgr*<$+5F=<+DFFt$id~l_;L4dXy-h@6d}Ky1=0e9fI{| zjZ74AH$)LufQm{E4LCID(2zs8m!vuNJ2c|Zs6&B6n71{@0f%rGN@-<>CLEe{Xv(2! zhc0ob;!xEg%=TLHEF+9ujLqlnt!3IOV>s!MgEeB2|V5%epEe(lh29Qv(8xVxk|o^%NJ8b}*QN96lhdc9PX*60tR%<^`B;@KDgFYwxwUu>tVetC zKN;^Ume{Jr(sYfq#-(j8ejVDpwYV?6xQM%`lnZf^3Tq5lKw7mVidZ)lONAybBT@V> zl$lL$)v#aOSDZpBtXo|A?@_5P{ZAqxA2xO=QvVif#%7F-3%vKiLec#Nwe!VqGe<8@ zA6ER9qE*FjGCDuKs)!XCxI7OCS1`;uS?fd*tA2!#0upG%+A0sLy4BlW{2{eJy_99~ z1BX`?|AW(yqMRQy8icHVq-a&~r;H|0S^{lag7VsnU&FmHP>NrHKLr2F@Jq<`DEsI) z)ZASB8FE54pg*CA_)Df!)NYYftR7{y!6F>Q4$hr80rNHQ``*(q`WdMSvt2iM-{zfK zyo&k+b-j}Pl||f1M|gShzzdL8phF;ZdGIPUnNw06Z6ohYK+{W`+qqnU1FBpfbiU;8?E?x>( z%EWz8j6O<_b$mJtR1djiAg>0Vc}YG)tV`VyUHUHdMLLNQAQHw^i-e2+&M3iSL-i_l zEo68k*3vT=!?(cBKIDA`CyIXJJr2adBR~J9v;yy@W<>W)a?Zvw|j&xsIb}v(Lj~e;zp}6ARaE*JM z>Pk1bK1~$wrxd7liR%1|ix(98ix(G5#lhlmailm}42t8$iQ;5&sz`HOxFRCUfU8Z& zcPUG^T~|Xmvx5Fipyk_mbwl=I8CFiXqgJF7Ml{}TWq(x>CwvfYExw)oWksC+;qu5X ztl)cQonCM86HIL{ew_W)#Ru76Rs0zHD~k`Xzr6TS_N6br>cyQ+y8&D-CT?L{^3Yq% zr7WvF?)K8PXfNVotg}9J999=vPBRA4;Nnl#dDPx$7)ut&O@nfiNuz9O9b|zX6n=1WVzHMjz8tnHQG6|IO``ZF*pEckwF;B!7X<-|#laB=jwYyefe#Bobg|#P=0+yFkiL7Z=PSTF!CluOm zAZe4lN!qeMZ_<`Cax7z)LrS2#6eeAgUN6dRL@Djy6Df+H@@($@oI{^?=n;p`=P@yf zJQeIkN&a5+`KjI>+`As-vOY-?Ve}b?KJCzF9eT*2haLKYLtk|0ON#1>=M?uAFDt&f zcti2F;_bz|i}#|It&l?&obc5So#7}f!Kp#Csjx^fX-^}?qY0*Z3R16M!>I`!5y^*m)PQ{H9@LUb z{fTPC`NS<;D~-E))XF6m|AbVX#i!vOBNRHVlI|*=3wHx@)7eK_Gf8`C?LlqKg8o8A z4UE*<;#>>LSr2VVcNQ8oO&n(>kAaT+utaH`5L#YXQD`aT3M&gV-qN@h=t%ENzZf!} zEW*NKMbcbYQ#b;LzSb4;g+igdu(ohy;dzB(;pjqV;i$qf1>&nY^;GJa)L$?w*5mpD zrzzB&ufZrfj#n}X^FzB!eNEO3uG4)NVz9{LGdEs6k;(-*d9Qp>({RDK-kA9 zAV0h!1=nJSShGTU6WT_jghoIlJ?sHS{h@T6kc!e%tN+MpC?)NBkIlWus4Uqs7-eSEf9)lUYohGuphOO9`|AAfvkf^J9H>-9_LEQ0wfrr z7OJPv!zaS{EEwX5pPPsS;Q{H%=8$gEo&s49vq3l^h0?;S7 zuftXStvF$QpZ6*65v-bj=>5Wb3M-pbOy;Kz+Tuj9%OR|!L{`O(4)r*+$)R3{Hapbk z&=!X<4{3SNcj#D$Uf|Gi4!zK!7ddpiL)#oW!J+LA?QrNsMz~iEx#AvW=86o~aG6(R zuJTfut25Vlb(w23*LjOF|C)J=wd;Pyb~$t!qyM!`uXi#f-K9CRo=0(_aFQ!a z`iI8hn=*Ie7VbRczX9{uMYv+V1-l(Ai$)*G5+kOuFps`|P3FCY%RqY}UoFz=uiYyaZX^p(_)vk)d%qM2_Px+s zI0x>g!s&3)lUxFJu`-t<{vyzDsvY%VWo!1MFbL|FLJ4jkuQzB-aCiZ`U7Tlt=!JgD zSs0>}tRo{pJTDi@K*uUqysKZpep2RDsBIcCFDOh%#dq?*7HLi>Tn%?y;T4?TT>})ZVd^W1TG$7-w{RBR9+t(KjHK)fQ6@?H zV$e2IZO|3H*HL&iXxj=`!9Bik3EUSH#^FA{5WwA9I2&#c=b&?B=v}X~FsJQ#6XJFj zUITYq;Z<;tFYJZ8sjvsG@Gu44yBgdqCkv6e3_QFn^K!BfWFH`#*JfUqc|+zpSco@g zZomw3BW99XZN3*Jj8l7x$0+hM?ma(me&<(Hp}R=4Bq$mnc-ggUltb2in23 z*8**4G~;4t9eNuOMl;%)ExZAEN8xpFCH-|kbebYjH~=K&ei;1R$~4R=uo5^gidIHj z^=7o^WYQt%bsO6}TA#uuV7{U!9Xy}}KMNsGJIH($L!R9z%~D~u)R_wP1Bc`>6m`VRbF4egO!9FF8!SjO|TjH58OQ5nZ_8Sez9`S!Ia3w;CkCRlGO{heIa zf5#E6v{S2TttIu+9GJl`fm6$%Y5vse_n>@}K@2;2Y3O5gZ;x{9hJ0`4ys#O93U7p@ zPh=X#p~gbb6+!nEL2DVMp>fw>7J4n7x8in0)*^Q!jjTn`N-wqMZ^U2vOt`d{k^zT* z^nXP(%;&UkoxL0PGu_!3R8=p!k?tx;y>g+gb?)s zr6fc@={cbpr3-ZE8m#&d^c2oi2rEpD{vpDC!+kv=y@ss ztKO4vzlhyD-~T-BGWh<(*mLpyFL@t=`#Ic!@WI6g;eHn7L)+=eD&%^GW2G&me+#ak zVz9^bWR;hQRUCrlRa(^$&W>%tX=FU{fL$KBN<0p0v;mCGtFTsjALbpd6;GHEm#|&n zNhsfD3P!1;{EjK;b)&=Phaw}tb=*kMLN6*JP=4Pw{e-e|OD&D1O_$zWh+(5E@ zwBc#EpKbUfT)H2v`#6ouC`BXH{%B(}rD$wikRs11)^dt=PO+vo1wCnmTK+;Q8vaZv z8vaz9f}S}-ElVjyBgycyjZF(u6gb5?PSL?Bj#!W)!6`_aA8mx~LM{JTkRr(`;+z7S zgcSee6f~Y*iKiFef?oLmo;Z}J3+r(f<=XrxG=;_s zKbjBnWBKuXIX{t~%unT~^Oxi+`D%V9Kbt?0zcha^KbL=Lem;L${$KJh$zPtoBL6a! zROju$I>*D>{8o(C_u_A*cMtwnc^|{yVcw_lcX%urOM0tuo^8lm6RXCmIPHv)zV5AX zW8NSBANVnDu8r`s4tGmE?;8BId2hnsO7AB8t-_hXcY>ck;O}tU55!4uJP$btekvGe z#7{4Nndthe1^Z%<)EO<<7lVIV%LCx_jFykWJ+0+_=9>7Y`DzmRnlVTAA#?#^XqRBU z7x%yFe@FdqF*Tci4E^*ib}?4SD&)Vx6mpI7I8(?~3OzmIe~Vo@zmmkMLVD(6AMZ(Z zbKSCPp!w-k{ErO}7SgZlLJH2K3EAubUzasz2{8jl^<*&|PlYe#o zHJ}-CaY!A23$U)f9}ik`8dnT1y<`JZTtA8LxT*l%mb*$JfNtLprZBn~d$>B|4s@$plR zISfyqhN+(r8uT=g|DB~of6{4VJ|*#gCi|wBn(TpC_V8Ku@LBfoS@!T*_V8Ku@LBfo z50O1+EPMDYd-9thd-yDS_=m_IG-v_Io>N2i@LBfoTS@ltb1Ws?p(5EM%(92ivgdR) zvgZ_#J*R-|;j`@FJK0klmx>-E*&|GRK=wc^dzTurCz{D#QbuG?7SqrFKL2~9z-Z3D z9`0k_{-*afy|3x^rkk-kne`4d-O}{Vrdyld)pT3ayPNLF-jscN_8r+?fQ4 zE&J*0=kiba2mE(uAI^S0`-ng9-|qiQ!;#syH8f;Dm3?Q!+U(8Qd$OO&el+{BhUSJP z{!GKthUE>phE)wK8xCt&-LM9y!RH#<@nG({hI~V@;i!hA{r5DqG_*CWZ#W|RX!gt5 zuVf!+=xkV){c84WO|$~vkDc%a*th4hO-Epbmd6$9dOXQ@6y}Id?-*G2F09n)d4^ut z?=5&PYX`@wGS)U^Z9v*3o#E|UB&p+DV;BUk!_f7t0zt2AoXWe)BC*r*OY5s1Uc|XVB z=U?m(#LtQM$H(L4_(Xg%eo4F%zdU}$VyvgIx<97rqfHMq-PiQ~rVljT+4RAtyP7`K zba&G|O&@N$x9R?-kLCZ6|6~47O%LXu&i^_8O!n*fzvTa#|6Bgq{NI~Cp8rSwpV`L> zULltKM)vW7-}H$>ypU-6WcHicZ)Lxo{Z96~O<2!DFGyw{q(<`s+4(qD7Ds?aYotcB zW|dbY?!5K!`S`r|JmStfYHo`1|6oLmwoOmRd0%zZ{{Io3|o6 zz4>jPpP;M17+jf)e%5e>cZ{FOe{03J@T~8*z4P+_>7DMM4ym7+|6cw(`S0d`-te;g z_mF2<{4?>-#lI1MJpQZruj9Xo|1SP}ob3NY{EzWx;(v?(6N@AtC;XSM;OnyXpHnUI zU!oS;7p6bi7oGt{o=T_dZ0yft=B8&l8{js>{?U9-d-WZ>5C1|ueHp_ugadGg@JDN> zNw}BcFNQNFSK_JsQ<^ZpH(l6tv6f4A&#uV91O7Z{kPkaim+#4M%J=3s=lk+o^Uu$3 zX~Q0q=kqi2UfZ|Zz71PLho08vz zAJ&5T&G_}7{G)$4vAT5EsS!(MwWXbA1INe`iESR0##>o3NsvA2-UJ>cE3O%8h7L7P*^^P%To zp554qL&bQJW~7~QHJ_%*O~ae+xfn?-#tiieWi>{5TESNylqn?U z$*}iFFP1k#4)c)w3(Fdox3L_~@^+SYupG(qPL`us-o^5-EbnGHmgT)HC$OBz@;;W6 zSl&+(`#-#2@PVQfd|2=~@D~L~xP+uWE$s{8xq)(qc7;HSk%#!Eg;q~FWl4KPcAQ(mow3o<5Xk zJ6Q6u7>_T-o;HV-)11a!#VB2_c>LG+FQi}T62=z;S7Jtrc*0b--S*$j@%K3?zs3~S zsUm&jeg~Hu6C8}X2`iIryui#ktSMq4TuvcJFw+doDd4|X@!!qBHA}@5UCLZJ`H3#B zcQ+?8ZUmnD0gZ|*vob+vPKc8$lER~uZX+?DR>n6pDqNHI`5 z%F(h`VZR6$(p4Ef!PoNWmwY`dioOi^cocmrN_Q#VBjS2-^dr=Ue7WCTinSbYDKFi? z*XE_`_-d4{;cIE>cD~Yh*jv80eWn(=rP9YErxgM$h2lTvE7yqZR*MY2f_@_@)Nl4dB{@ z;ztkF9&Z@EY^@vkdX{mWt&KiAX&dO{|GqlT~N8-L+z zxiN&VXB&9)3U}C1@^9cBDr;k%7_N3s8PD)v=NR+(O07HTV&x6%zGmzGqHK-tnZM8w z`CMtBFG^t=7<=G)j}?}(6@(siwH(`><^X= z*K;Bm`Qh3;(vGjuNEKgE7hv~L(vjQv@5;zvzE(tT<|{wb<_yLc%C$N2maV^muPq|4 z^Yy&Q3cfaryuerLfw;{vj4zV?M@30BGpDj!l{ty8mC@(&=5=1^Rkwzv z?WlA$F{XrWrHOG4uIHH|H_J_tn`fJ?nQvx_QjDAD@!yTjKl8Q9Oz_oya!pagE6rP( zr93WX>t*;Oe$yZI$NX`B6aQJTW@p2mo#QX}SHP;Z@K?gFw(?&D>(++soBtB{?18(@ z#*^3-ZG2nwL6G0r`3b2MYwZ18jyA@6b%(!2!d&LI4nJ*-y-3qph`S}liEy2sPwIIA zr}_s$I_;}D3s&zM=Fxvsk7Ew26Z)LLzY@KE9eRUR==k<_s=7d3sjkC2+a2m&^^kay zQ+H-!hMePZo3kDCn1kjx2=A_JJ-q+2(Gw1u=b$GYG~Yo_IcR}{o_5eeMr>bFd2C`% z-i~9DgPwKJVh26PNcgqO#9ZRIKJTDf2fg5+r4D-0LCYA4@a%FmG52q$Wx3>Pm$dn^ z#Mvcou5f(3;-Hld!br;w4|9(;!kny)Fe?c}{iQ~*#R}@{C0t)%#n3yq*E&Tp+bZ;< zn2)v5P8+%W7oetLMBu4Ho%x+LCu)%zMGM|iZHu@1-PFGLQhS6tR-KIRv=^&u@P+mP z^^_LW42)N+@jdo1Z9KliuGQAz`|Csa@;Vdkd`nkHS8vyFd}Y1BRqI;mqVKDBxc0gZ zVGMT0?R973+v+HK09E*|x~qE@zM@|5-s0ZrK7_BQ-JYm77Fg(4vbq3siTk?s!a>!3Rvw1l2`^iz=P z$To-lDuv95gRXbb2u579O1F@Ie@k2`KEeH9b3fE`Mn}Qn>gXAwRceWAJ;ycQ-_jT) zano$S(g8&Bmt^cgW^oQ=IU=vAJ*Rxd`UN$S zo4ZibyTs-$kvP%&YH40AaW~p}H%gpn@mrc0@gdFjcqn=V&u6nzvN}~%>-`v;i&}3Z z)Os7C)(b?n-bSePHbSkp5o*1SQ0r}kT5lt=LL7&IT5luNdV#3c1JV5lBghMsjs?lj zB-MUf3$@=ysQo}R_uJqdbA;N8%E%*-6_M$X<&mk1X518+4BRYoAEX%>k9^n@84FA^ zN<2D@yoSFjB4k_52-)~XA}vv3DxwRBPd#6D3h;aZaf;~)^S3l}N!MoZq=C7T8RV;p z=grm*MMbZsC9Y0Ah#nN>hHE`1dPOax-!g}J2)i#~p(jzsJ&C3~E~@WGoR6MFEB_x- zy$I}5_?>Zu(b>4k7;8LZylw0>J~j>*Uqx~wgCnm+zK#53dd*xjVOE;0%`446oBhp4 z&Bx3+<`d>T^GWk5^J#OTxyW2>K4&g5pEqmG7tE#Ri{>)(W%CttrTI5=mHDcdNU$kfhb;qC|(;OUK=4^8&SPxzZ9>Hs1+0(;uVPEwGrZF6y{QF=JfnTd7;n8 zdB4cc=NFO3l*7nhw48&m-_9n5zVJKAD+{A|HzdC78;VwPy1I~iRNK)?ruHz2VRp9_ zW^=n~y|qEwaBU3sE}5>)#XR>iZ8g?&Y}IyY`>}6Hoy&(EW=pVRNlRB-w4lAPSIH=h zmuF#@lI5;7u8pp3*rDWz>m(Kj1l+mq#_k06CTZvH?rqqW(yx>}BR-W~ijj)Vmq5xBd=>CNWfI9gIwgNiY*<2L25yOODsLRMP6lTCka^lo-@+ z>|o537)n(K<5h{-#LQa~^Aj_tnL%uki|gGYeaJ1+TVe(>GeBaVz?1%dGP(4}Zpw}g>f3g<(Nlwh@B_gC9%#c5) zUK_CPcACF%5ZMJg%@G%Hhlr@XRMvr%R;0i|PMJk6bht|$bh(4BWF+cDXW$MI^a(`l zky{-^Z4l>Y#L211gAVtwgJwI3##X`y<&Qv4&P2qMOKJbaasA9ePOXTXaJae@GNq^1 zq&x3m`W-jt{>`%-?i@yEwgi$@OzQITE_EqaVXi+*Ek z^?`M6jQK``$LqgtWn1{EjinI{%|+I?v`?2VDP3B+rgUBD2DG|gpxt#F1xB&a3a#&T zXn%(oHO2_E!V`=s#%yCgTH_atwP=ywOSQ>HGNPkhwj!00sz|#?b)+NO=-VP=Bag$O?70!eP9fFa9^S#&F>0E3 zfp>*>qj#70u=fnU-81wGy`A1oAE=Mgr|9$aW%_!3hkj5$1Y{}%sV|FM7;$PL5-Edw0_Jp)4n zV*}Fz3j-?yn*zH7M*?+enQ3NPi?sG>-O~o8jZT}IHa~57+J>~9X@}BI2ZO=J!SZ0+ zVAo*(;K<aK@O7X?R<`B4cC5u8hMO zXEH;XMrK83yUcEx12acuPRX2?xh!*i=8nvRnWwS>StVJ`v#PSXWcAA$ku@o6PF8K! z+N^C^`?F4Dd$YsYO|x5PcgpUaU6VaNdsg=1?A6&@viD}A)^cn5A?oerQS_Uzi#Ri- zD+!mrLcGmTn^j%9N@DgfL#;(h2mMayd@eEcL{yiO#Y*W=>sDP#EsM<pcN=#d3E|D1AF?8U=@kP&iwLvXyDx8_j%#awg zvCtvQmeQe|sW!-(rI?M(yeTn1GIOe)iIfl%DVCTv%uw5AhZFfTGrc6HKQlKmlUj9Q zM4rSh*6$;;ylBua}$SSnHmKT9I8sEApYxifkpV2(^Hz_;xcxEnbS@T#87!WKtzUFgi7A~YF$j+N$c(7bRu|GcQZbT4w$( zG3%LmU1GRCluGrXbTjL`E$MLnluG$i`X1|SlXR$`P+j`I#L)9wUAj|ZI9E%hTrK^S zb@oX*2biI@Hg)e`GIK~`zGmi##2jblTZ#Fe8ET(X;cy9Jcer{c$vSoQjNv85@JI}` z;ME4T;C47hIx|6u$z>)-VhWiFOH3nX=*dcj6Jf@X7^+Lvh9xo7OQ<%QN=$QR&X$-; zX3m$G3z=ytF|C=oNMfp(xmaS_Gjo~5P~WTC=pZqjn7K+~x-fH%#B^ikj}mh|Gu?B z;$q8T+#@mfvCc$^d4QS85;K*V2PKAWnIYLS<5AX`CF#sz<}rz3D`7k(G0(EjB8g#} zU_37|WDTl~r4mEdpxRh2F)NvQMPkT4R2yp~W*syCkeCh3ydg2~Ftb@=$Qo1|?@A0= zgKA^D#Oz{*EJG@v_b~I3#C*ccUWp-VP;Km&n1jrGE-{ChAzP6O`DT z2Qy@aQuogGC(=`5`mxT95_1bPgCu4sGeab%hMB)e%NK? z$ILyF&O~M=NX-4rOp=%>%se15)0lZkVrDWkLt@zeL}p3M{fUs}sgA6dbT%^cro_C>%qEH1 z!pu7ovz?juB<2HVc1R3ap6bZQ60@I~PbKCcGoMS$m&_cJ7`8vybGANL$?{Z3zLA*k zm^m&nY=0srC59|db>vJvW2(fMlKn9~%(x{TA2Yhdu>CQE62tb#%#fHI_LVI$`OM@= z4BH=5vOi`c)+v#63}(nK*)__vm@y@$DKkwZhU`qWdA7tZL<~nA&Nz4t* z^pKcd%=}4W`Y_X5Vs2uFELAF32Qo82V%Tb#lGQTFI#rv)B%R^R+$J$(ovO_{B!;Y0 zwK+;+#xira#7tmjd_5C=ikbWB8FMl-_e;z)W+WSBKElk*dY$M(Vxmt=%(Kial9(mT zJSQ_*{_a%U$0X-mzYwr(wF1C!ZBwak5=A@H)gc@CV}-gO@Ctr zPHI*!wGO9#X77p8`K3>nKFjla%bgj%Ev4_4ZZG|ybXVyorTa18_f_e!((g)tDE%4p zem*13$mZFrn1_hWu= zn(>G|N4NyDgfAH@jMp$%xE`~GTY0{4H{RlXiuZVjjIWGujN``l#u>~Wx-oy4770bN zFpC(DG>RCQON>XFM$V3uN6y2nVk>7}@tR22NcYGMk-m|eF~>Lzvy68{Mq#FLeB?f! zZJch;H!i`9<4c%xT!nXqYa_2mHbmZvY>sS;yw9_c2QUx$Rpcn}v)F8GM(}2_nOSb0hxdyYVwUm}%u`llrt)gD3uY^?H+y2n@x~<%gE7})51Ykc-6q=QUm%zMu>Od?2JcDN<9m;W`#{qEa!as6doAAb zZCCav2k|ZRX{>1tsbSSro8fI=mD&Mk81zyH;`_?c>O^%K_Ptn0=NE8n>zvqLchGtV zz2Tq@4tmo;=p)!Eeak_c9Q3w>HaiG?1>46K2mRAQTT@7f)v@*7b zUHTkF(Vy2}Pz-&I{&$7GHSiYWEHh{<)Stn%F=k)wZ$Zt!J0YZyChCH;!VXrFV^Q^) zs3YC*JxFSo;{U*&J@Wb~t`V@jsDo4!VQXy!+iRmQ9R#~;bFjlUI^rPMV4H(Yw$V2Z zI_98n9Ry2l>z!~AthCL+YTM|PgMM_-X$Sq}pr0L7=b&T?S&D;@?;>Q&wiZ{7FoG?%8UOep3^AWb5WC`Xy0x0u!E*M zXoiE(-rIVQIB1rG9(B-c2R-JXISxXrXorGU(ne1>Xr67WZ7)Y3s0GWwn8)H6pZ!WT>Z@Qnp_ z5`uN@1gkn3)^x3=Xl?QB+fJ+}G+kY>7Gf9H3XXQ~^mO-(@{CtfC)Z(53#$`im}PZ@ zoMBxFIo0X_`G8doIhj`)|6)&ms{k&KSvioitZc{`Ru<$`D}=iFtrY;CZ25t|wtT=7 zEFJPLyyKDfys=dMy(&*NPwwpIZj_yZ9Re-Vef}Qk!a_Jk75xD(QPHD*3Ug^-~s=)_99b z?_P__70(x}pYTg1bgxAvHqN3FyvL#vt@qmsf6cH^X1I4M!wF8Pe_)r^koQ>^LH_kO z?&)&YX%Bh7bs6L&>r#aDjdcm|eO49ZMC)P>yAAM!-w2@x_!(Ar==@||2Rz;C3i+UQ zEtnJ5HNaD>&X8lQt0Dg?-l|zWfoE7ZKu*Pd@(x2-SKdmg!gp{Tl`cwme52S;8HD}T zMku4LVbFWbx|RJ5B|p{>g#NvC3-E*1AdYDu@DytRo&-#Rt@B2>o1TK z?7O)Wc$PJinTB<4EW6wdIo-m&BekPBwRZteu|`3T<2rW_&@3ebU)KEcB#LfIPo=Li z5Z@&Zw`QP@;Vf9_K4wiLAJ#*VGw94%DB|lKU$N4r&;$ye}pv&%qi@2W4ReF}rumlnwz=8dVs16JneUm~&G*e6<_G3Z^FwpD`H{KD{Mg)UeuB1Ib#29S zN4pySx*uKt9YRy=hu>c9%xlXh;ybY=SXaJP-KQSc+*&@qiKf+Zy|A);oHmnJ$*srf zUOTmY+F@QRK`lZHoaoiv)fa2bC*mBhB`);kVQaS_50G#4Hr_gjyPI$QlNoZ`>Y#TW zw9P^9IcU3s-gnRr2YtXu#PBW0@S)?j%R&Eg&~68P(mY6(da+$$C zy6C0X3CARiFW_vyUZj31(mR_{jIi)^8NQxrhVM`9 zuk@n$&J3r0tc+g7*H@zWJ`;bh;CTNaIL2*+9kKFjjBQ|ug0`^0GY4w=3h zQ+;@ru(Rn7-wxo9eIG-9;`;=0zi&U}=f2M&5BUz+y6}Pj;#+0hHUE|Rdn7`lKHWg{ zYAF1X><3S&lFs34zJK}tg&p|z`0&LZ$EEr9`u1{+up}I#=KIX|8C(zekgFWK=KI2j zFaJ0VTJ*u_g9uOciQS4)F;hO})Qo4Z{y1#DSs#r$%ly5TTEf4FvTKpJ`nE^5XA|9zVChe*r)2FogB~#*=|@} z1Gg{O*ZUYn4#gP1DZV%Cr1Zv@`P4=&#+Ue8l)YG^r>VJW3|~EUPL#c;!KNaI6R`imrU}@~U=#RoH-S}z8&Cpmg`)*4 z2`#i6LMwsx!q$Rab+lkzp#`hUTE1X$uq4kW;d87vDXP#@^~>fbsG=GT1}o&)3* zp*;%H_n7V`u*^1srM3}TB^#lYvJu*J8{rAC5p21Q0uDm^WpikoYy=B$BUpSJ!N%JN zHs40D^)^DAXCt(MHi9*`5v;q7&zd$AiV_?U9Dp5!=-gNPIckC(p@IW5 z+6Vi9QG@-VOJDl5hwbs=iKlaT#Xq?EYpEpt_xh&*KjeQD@-aW`tbeY50pv6O=OCZ= zKaY^Gf4To@|I_%|rWU?b|1v*LUG%@?e@XFVw8z)6_4b4;4xOik@L>fpmjEfO;sX-r z`3){*k?`!mE)*$kQSZoaZ~Q2P|FiVEa!%q0ILF!%fK2cGPI0Q?l>su#KX5b!kr zH00L9{)d$`|8)O!=*;lX0G{cesp$Sk{EvW{<(~zeM^Oqslmhlr@y|h7Xef)h2;m9; z6VRXM$4W>4ll~_W*L?p|zza}P9+cEGz>EBglz{(PKkXp#9LmneWf$aoV2f{~R6f(F zDu%IlTgH!Kg)l$xBr?A zS30Hc|8V{n-_Q2O&e+4%G1wh@I-hgAOkJ&Rz-VVz>})&i=VRDEhvQrlJIhAT#hTh^ zajc1ro{c4Jv?vz0(KE4_jTXkrY_uST9Vs}xr(%|k=EqDMJsFGGXkN^)(G#&!8_kX3 zG*9;Xc&w3)=EQKy5Oa^kifuGIR%D|`W3UeFIxB_~N*O&8E3nbbSiX&B#PV!3J(g>u zhhsT5nij*!r0n;hSeA{Z#&8ZUa}UNcY&0c?U6`1AAeL^U$+4h~?vJI}Xi^O4sIuOD zF~5x_#(XxK5W{J2>^eT?wb8vOZx^1(Ij~4lAEK;;dX8kf*jCVq1N1HdeNNOx%m?~c z<9T|`zY?+*e{231sNVR|>n589`HFuPe9-RAWOwK!5_n^H&g0_flp6y_~w=STEvZe`X!D zM0~#<|AYRi{-?`IV(l>lFciJ%UT77@;Z(du*o}WP-l82v_GRO{a{5-T2fipDgSTc2 z)D<}KdlydoKBI*+L#x2PXWg`c*a2<|_KR7jt;ZMT2enhK0Dlu#8T-`Mhck_tha~0^W@bvv7-rDNbz+~$4EmG~gSHkSPnMVg%%I=k=-kT8P>Dfb z6TZ+Zb#(4zW~9XYi5b)aN2f0{eI%wkGuKJXwaj#pm`==GB{6N8xkO?vX9m3xC$2v* z(^_I$GIN2%oX1Rs#58B-Y>8>YOhRI!%vj9O6IUv^6|q~P#N;rOZ8O4tC}kzER83-+ z;R!^4+0#Wi7rnD_*l}zncG5kJ_t%Xvw&{W=Z=yOMEzl12sOH1|gRSwz4bvuT3-K+| zF73E0=!&_jTs<(aHWgo;u6OOh*QS~7rufRVmwTjpy1UlB*1Zeg9|iF>X_aFWTu94H zF%5EAOogmPNxjU);m|b?W%fA}9Y+>#l z;>zBGtPgDi{Z;l4c3(^GPH3;P3$-0DmBH>yE-$hR`qFTDzJbdMc6o_imNjsBhFuo0 z%To@tI0rZ;f8n_Wh; z%Uumz?qiqn>~e1dmnrOWKf6q7;4+Y1Zeo{y4P1t?%Mf-M+`#2_cBx^Pzcg?e#V&WS z%ZLUpz1ZajcInZ;zkIqsj@aI8t!_QxJWoFf4ZzJ5ZOS@6;N5@}S&fPtv#%5>E}}1eOz7 z;%Nedrv(yE4kX%P$Ol+XVTorJ44z-ehgeQy`7ld7x8U&%L(XLR2+LV4VF|#)DnLHQ zat_PKS;B&Vhc!{o$EcFLC zVEEM!O4#O|mxD1$sdLM*CXUCRrQ17J5Mc zMw@KgOEI=^kSd{nqfK`4r5MRtNR`mP(Pmp3BUuZn68bmV@?G|T-hccquZQ-(ze_pY z-J$&-Pxp1u{`cvY@A8IUX*;{W#qs?3Xa+>pk3u$B^BBkTF?^> zbj*Td9)spP=tKwG(#Bt;Fypm&=krq>Pn~`mIZQM4OPR;h2qvYwjJX$B7tbbKFm8^| zi$58k|Eu)ix#zUH)*o<+6j!PX|~awz=+p(z3+0y*f$aQTwu+Y z@X_wTPA(*hz@fbGHlS?-zN7)~%wWcocuR1-?;_g|o@2EG?^^oHQ^0>`=2u?*iTK>{ z*X(%Q@ih+myMxv`=pPPR=b+aewBA8)IB0`|-gFS!D^9sPj`qt&n;i7EgEl+p9S3c3 z&_5lt)j{t%Xq$uHbI^7Nz3-qM4*Gx*oims4orQV+vwfJ+@|}Yc^Y|)#*b&Ot%6AD) zw7S%Hg_4uNYkj2%`Mv`+@0T-azk6yQ-pG_=FWGij7l!i}aKiH_-nDQx<_>Db&V^hW zhZHSQLMWj-$mbxxg90fO|H?r}QYe8r9ba3Ky9u|$rlnB)cnT$g4oY`WD23ubq);Nm zLFh%;Da>+Ej)S}o%1)v9ZU=qjpgj)y*g<5r&`2MGILq{d%m`cpWy3-@$dLrWrtPAe_ay) z*=Fgv{{nSB!S2C?3;2TgPDP7v;CMXvyMF&wtU^mD@OifH`uG`KFY{fW$c4sbiG0Yj z6M3x7b~e!%xFXRA@;tsLj6b;^27ML2^L#CQ=ld@7T@imRz9Ifr{Jr@01Y$xzN9+wu z?-f?Sm+HF;Qp}AD47;fmpky!~z|W?NXY(9{d@k8kJfW4qE%BVHzBay#Auqwxs^V#F z2iYFwrgFKd@pW-ntoYtIYFhjY3~5s6>6ISgZm6nI}NyX_&~MCfSQ|bQTq?LeNc@$e8BB+9S?cCI(1;5p|`5@ z2Hw=SMqM(v&+wt@jv<4GRH*xh48C)SdSuA$x810oytU@e3QdFTqh;Q9^U#4>c2;vjmDlVW8oYhd=@4wZT& zbgD$^Z+e&KMNLSDMfi6dY8~GD;O&JS4)wL`G2S@XJna%M$JWqSeVXu0qm&KDAH4;I z?Y`o=E{0On;fgB^^j1VJ6etl!s#0KI@%F=sEdwXMr2eW8y&hpVV#l3k`SFgz@hkr& z`*1rtE~JUh4@~({6su3)5kr(6EO)cq$MPV{BYg+oF+@4e@)XNDlB$wWB!)mfT1SPH)_d!qi*;bslPfD`}B^%{O(kB7Up;t<1F4)s@U6k4|brUQ<;!vb-sHM zBh^czNjJt3ON2{WEd7W;q2`(8$Va3oYpGzeeYpb}srju1Q_#0?9CTp0u|kJ+i?<7x zlA@CFjNH-Mru)iAw8Zm6F}GfNabFsqB&;f+ zd%2(P7uUyji0kA1?CUmhU9ekRUmPp0YlJ0H|BjJ8rGIVPe+ZD(gsQwu5V5k zF>M|r?sW6vT@~U^51je@1as;a-Gtj0i@(H(f!_67`+pZ@tj?%Vk7~g7p zP@}K-ugwvmzuXn?*?OZ^48~V#BT+BLwjQ`B?W|l))zDiPyE0;oF zxPHifMH*yZtf@Z3zHVbF@EggW;aA8j@l2|!@bygc1B84>@*N5}IRN-MW^jHRnEU8n zv^X*9eXuLIBX)f*`4HpBAiqjZfc&0yo=Ls{{i|6=_*nN_ zkhj(I+Vzaz;CKaol~OLkRA1zjzi6jQ+!5vWSA3^QmLjh%Ba9rwcu2{WzmT)itaQb) z^6?E!%qqcGED5WLh10IAbFB)cnRPzC3TbX#Ze6aNV_k_aYs#%2_`0HnH5lJZTwvX9 zjZiMK=3DcXKUmLL&nj)K<<@fL66+PLL2qmAwstF*My+T}X&1dQdZSW}xK(|={xqHu zdQP(O3**-qzo?=nXDD|=K8E*HYO)0Hi`C?3$`iPo5o&+P(Rd2Z`tP4Tr6&WS2XP{g zEinf>7*^#8W}0H=P{kZ8B=~KRM`5Q`FP zdd4E0ZAc4+OzBDatxw@R+y&Z4{Z@Q!r(o^w98RUGKMrl`b*Xhpep>or{+iZI26^qv zf9pIp!X2g|jcN~;*Rbrw@^Y4cX4!(}6)Z1d*@30d@6320OMwS4{u9dwS@vexmgNmB zMF>KQ7<(}hnfGfUfX{EWfp$$hxr=?)=@$K zm1Zauth82?b@*+>Zwr3g@!N&pUi=Q=cNo88_?<*c(2{CU@-U@0dE|HG*UTSf`PHwa z@FjEv7NH4E;Y(%?Nudc}LUL_QGR8?41Mv(_|NquAXrCC_LFeY<#4L$J1j7Ko8U|h-iC5#6#pJd#faTVhz<0gy;GVZ{b zYy-~HWz2Iu>Wbuk#C{j?+U?9QVx4OlPh$RN#v(l*Fdoi)W5zeK{uhj?2C73ZQW;Y%SG5S^*@V^S824npJ7Zdzr)qy> zJdv@*_+r*SLs)$$`A_J~V}1tv9h*D@=5EHxAg0iJ27NQ@#bhr+o{3 z&tZl|QS$LC!H>qJ3B=zVPs}|OQOy87V7as2Rb9%slI0^T1v5~>!Y{|Aijb#C`ofpc5v~IFVjX7e zG=!L$#Zu@rtJkqZW*tTHYx8ov!u2`wixph?u++N#j{Z;d<=(^lJ(vCg-l}=^AM_uT zxKHzWm4q+Hm!q5=Ux0Uqs2y%yFyu+C3<*_XV?_T$77f zE|cUD_T|xkbZP?4Qln-xh~ZK8@gPZcor*DpO0yFc|C3KT-tmpaEY=j%?kL$9Z9mK5 z^-^8Hm|fLTzr@0|fzE8wQKz!p%aTJ-1>cjIT9$(8BI>%(2)Z3r2(>!u&O^t`9-n zg&Jf=#3E$>dL27t?N^KlS;Q{l5`KSq*Z7tOHURA#Y{2)h+4S5uLH)^9nxpfrgpwHer@rq#;+58UGeLIUvK>S<45gbeXkF- ziqea|8p-A?$4GdtgwK^+WnSnrW7n@u|IgJgwIB8QY$_L8&xhzkz6loK_ zB&jTuViA5how%3r$Opj)eSt;#3IFfw7g>+fI^Ghaj@b68?li?Gq*|h)*Pxmx-BRT@ z_vQExuZ>fct1(ti$+MG39ei%`81Rkg*QiQ)@(AK9KwRkYBu_&QVg72Cac2BNpYheU zq!5HoN>W^nSThwbg+GMTU=VM|B0|XFaL#3UJ?s3)X=n`wV=CBpjB&8?<+xI!pTM)) z2w|!ENk}pGvXOdmT1c&f%tdas!T9R8&yW5u^rlia7T+YzR_9^Aoh5i%uoAm4tXDVT z+oT=pZgn5t8Bh+k(l9%wc4sN$<;=uL;!F$D>BKUdCA%s+8JDwUzsdT(<1V`s|8tUk0O=(3i6q z4Mzt?AH<9)>WA-pr+$!ziW&Ubc$c#p^`r1N+hQ7h*Pk^0U#=;Lu^(3MsCcUYsa?f# zvbqvXi+Wz2!uSNcp2f1989JX{bsZw?I?l`>mK++^x>Cq)lG@)`u3_d5mM?NFLm1Ct z*YjE4&OG~44zer9h#mPToOG5k($U&6?#?=+ST1GeE|#k}oFAFr$IN3a7qdJ{(xs7( zi|^Dmo*3nEmK?7;lQ7HrlA|x@spNFuSH2_Be$ktv{i6fo=kmMB#^7nh+!ViZ{6x#E zqUBZVR#I5WmMjZdUPrQSFXMAqE>~&&XeU?(6)kiSJ^0iL(wNc=zB_6QA;++MUc-!a za+QX)q{(x&>mixJ7@&oIeq4|H;@M41grj=DffOUVmKx1}2}^T4kFB&Stvz<1>7sSV4mAC6UfVF7)-xJA z(M-~&VmF#O+I;LtQ>!i4R^f}84cca$;ImWPgHwDCVPtwjJMB_jUVKH9?FzdZ<0RCk zu5wo;PWEZ*s>bO)UGZg2Z&!cUV4U(Z(lrJr{Y=Jb=(AjNaZc)D*HYIC*J{@~ob$HD zwcWJ~=cOKS9d;daoy3``n%n0N;mo%px8aVto4G68E!}PKRZa(YXLmPuPn-}m&^;8V z1dVc!#YsU^@TJadoCCKICk8EZuf(ZA>)o4ha?lQ(2e;3C5NE<2cb{_C;S`~OCle(jqr@d2}6@SQ*p}B9M625G*s(Zj?;$L zdN$z1p>3X>ICW^h=aA>9=Y;1pP9O4mgE)aG>}`xwh?;uKaS~B$Z(E#3)XCcwCldAc z_Q$D2HQtdpnP|LsGEOI&<(-Q1J?0TbKijvZ9BF4^b;g@qsgfCKS$0FUAeRm=yA_usv?a*$eFjX!! z?HUdrvwMg|!geW$G>f|sdBx$l3R(YK4(CmlqU_|FAbiR43D#srW4}VGBL7*sUS%D| zb{>kFAW7|Q($Oxj53NBCh>(TOE2QJPnf1jzvQ+P8zaq_7F&1eMSY|{@L~R%ROOn0_ zfu$xw7P%xzJ6EsaG~CHDjYE)im=Ph^Qs{^$g{25b6(zz_6QQwGKjV-eBx#q9h>>%{ zbqVtypY0|T`O(}j}@BUPw5;F$HPjOcu~Aa zxi(%BFHyS2jkuxwFtGVPPrj*M`EqgE3qYUQd!ibs7aCXUXzk0 zjW9Ed)pOpjy+^&@;DosIsE44p(W~@J^tN#?_Z9r{Ks+s;9nV3Zf!Hhs@IU+bW43u$`aXlS|-tF#8hm zc9--gGC!vd&z&~7ZZ)j)I%c-8GIr8_1<~!&8h)tJ_Z@kW@Lxgmk^dp)q6U)zTzJO=^d_lPq^3Rl7+?<2z~){%8tc zglX$+Bu&>S)|YdvrVioYzUc1uB|9UunaLi&U8$yF5llZwDODmRnvZojKW$f0i&$!+ zEJi1X!tdxL*4d*hS|enUlR{4Bl!)4r(rgc%RK24666q8=qJFZp!)cP73!U4NLmWAo zV#Gb-UbMxGn{q51qbMV+E1-N}sdDKcmr(j5_nfjo4%;QdWd}@o&RFE9I+5~C>tyE} z%~pxBn8&emZrgd)iPONYYA=c_RcEAHr*Sx3bF>4buZsMvVJz-i& z2a|Y5qApFo47oKq87*s&+ffBAWk;nhn+1ygL;FhuyEoF&v0b0j$r4_e`?a?BB zq)bhGoH(J(<92Z+w~JV*hw)@9NHo)EIews&dB%HUkdx77JdHg~{s-1uYIviM-5Gjn zeX%FXP@Ee+N*k+9#NH^=wb|GoWudkNd!($?)?lBMO*lh*hqhbWhy7BHXveivI7{4( zeN!@B`Pe(fbR}@6cneo6R~2?m?da-)ol|?c`nd+-eDM*k(XMf>N!aaSrfZICzH5=I z7H5sGa;~$Y-A9f#e zpLCz`Xda&@$9Lh7O+X<_cNwT+GQxl0rizB)^CsD#(@ zd$As5`|(XtC2Nvg!Xb-TrqCKhxC%*W5d2U{X9dUJ3-3Qvbs&c?Qkx24H2AJq|Dq~G zld~Z4MC1RS%Rbqk28I|Dq9 zbw(x!0r%ilixtUF@r1Ra`Ew;faj9F9UjYY_iy#{(ix@*g<%RW~TWCfQ|XPckS%$tx2_S=i+(rNWM-4~uf zwEVP=sVlppY61%>LOz`oAyAqtDCO#5)?tY|CH;vc6``3Rn~J(eJcpq6V%I5L(>Nda zTNG72!F+=AM3hbimv1788EC|{3^I{ih`Z*}5qFJQTZF8wVcCvy44SZH(4;cTt=kLP znoFu{vNyY;_lh#w4BVa=wUTr+&T~LYLa;a`8#kz^nO(V9%CR^etk6Fri%o5|#N}NY4XC=B~ zw9<@ib2)7Dab;xU1jZ~+vTa5UhE=Agg{?B?Cs8N#Oz&FArm)I8|1)dc|8KLoo+6Kd zoqU>kDm*PcZ9MHf9Xy>q-8?-#eLVv`Lp{TB*1}lNM9&n@bkA(hJkLVU63;TvO3xb4 zde0`$R?iO4ZqGi?LC+D-anC7Fo!9LRcr(5E-V(3rO?aDoTXr$qHpTsKGq!W zJN`=A{S58{$=L3Ti+WDGOQB!IBaKxY zj_6MdJdoNedn6q7RT)o-fQpKCDM5h>}#p|P}kfj+YI=#QdR5q|AnrU*xjg04!A zfom1{75zvNvOSi_OFjeF^OAo}g`mE|v51^(#r-*{huR>=#2roJaY#9jL)J?7D|%qQ zO6Vausb9_HtQ(_oK~xyAz1*hA!uaGl1Xv9v?3VVxQt;SA)EX;)N~5zDch67Fqd z^g^|cHJ#c>bxfpF=*Ts;JIB>8IhIp9336;wNE)B?=Mln89-kN-3+roKMy_gNgjBh7 zkV_j7d&9Cgi7>fb93G5~IX_h~uA7rgK(ig!jh&3y6=S>#@SNx3>3|O1k?`AI&N5e~{llo3hsw8~|-kXmLtOvx2?j4Xh#1I?)YL}}g!IWhTXw3g}K zZ_zf=h^3QKiMhSLN|oLpZT6W;pvLlaMuHtb^XKo>Tatqm;=kpeG+xR|@TXvvr zOv9VHbM$ikT>WDGQoWsiwca@%jHmN=mCey|w!p6yepUFj$FC!Pzn;~@TpGXC`;076 zvTYKjf*wh0$d+Uclckgww!9Z1sL6ZztDff6cdAR$TS@mIw-<6GTIRdaaC?7yZ=?Sk z#!)Ek3}qc^M~G%z)oGahgl%S7gHeg9-jMtWu0Hgu(F@0XDSa$W3VM^udmKUm&c;*KbnIQFs$tgOqI?EiL!&IjPQGZK7*7x1%Qlkg zLY6h0{yFqLff}Z<2W(7~C7v5~D2*KO^h{^D2+Vp8e-+g^7wyGMOk=omE@3Q0eePr2 z8$L!oT6{4>xmQB^A~eWu(CI<_X@oq<(V0n_u4>j-Rr)e;AE&Sl&!i1Z?gArLx%-k| z05@ZX*VW_1Kgy+5?AOOw@Y5)5f=513Y6o(dBIFKi13J*EZ}dkXF*>5u3fY}C53@{Z zk`+8mBT74MA{^EczLX{OOe*t}WUIQ<$PE&f#&tO{s+)QTb}5KhxGY=-#Udm|t-YaX z@;In)$Ufx689v=Da{k(6R#-ciB))S z(HC~^edXrF2Z^1^UlO|#yOi57WAmvpJn>oLka8zt^29^&jCfX)#!X6pV}-mzYoL=R zzO+_xuc*yQlky7;>Uz=*scA#e4k}oazMXd_=HB z%x=XB$z}Y1S8_Eo%iyvV`tu%?n#xBH?>wa8`J%TG%bwYbJhbeqOvNp*@$w`QT z;#riO3rX?p!t))UWhuO>5cTps2`!vs*E*~a-X-FB*RR$81W9iWQC86P;6I&_N%Kz@{!JrtYxqPLXN_7o8PvIWV!rM%h-)3U9jt(0QHs7f=NRf{JC`qb2 zZr!K*fT;$#^?)8g*-|}nb3M{fk1`dXo`sz9b8W(WgN{ANVO!9)=*4<5-lvwJPNi|3 za_MELO&+HnwFjnpq=|Zjl=zUkW_aIPsb8SC)GtKpH0;bsdD~Lih_V+Yhr1EaQtH0> z$)~5Ec)nX`7C84rPl8wX+U2Y9J-KmD;(16%Dnfb)caVW+!-IRmI)A0V!$hdBw9D^BY^et->wB=Z7o97ld1eFATQ|UleW~{zJG;_~P)!@LS<6lf*Uh?Gn!!460zE0v)7I%+^r&xW0A ztVi{x=#^KZ_P5omVX?aEJ@npqmIv!K`beC&G#;lcO~bd@bM*x{<9I1f7h0{a(>Ll{ z^zHgCeXo8%Kdc|qPwHo|(%n^R4u)@vZl5@@>V5LA!B=&OzT1-*Mk5U!C9W5BM|v z`Ti1|*q!h<_qXu3@>luW`#bu(_`Cai`TO|?`G@&O_(%K4;hc)8ICWwUPLEiGlRTFD zSNYfaH~2UExA}Ma_xShw5BZP!PxwywbP9A0 z^a%70^bZUU)C5Kb#stO(CI_YkW(DR376cXtmIhV?RtMGvHU_o?wg+|v_680F4hN0} zP6p1TX=%Q+P+D$UQJRq!OKX-^k=8P;Ozg((ZD`u?v{7ke(QFJ8fRt!n7r6%hFb+tw~#-wkd6E+K#l{Y5UR+rX5K;o^~p&F6a&hf|21@i(>tYiP4AK3 zJH3DU;PjgGk?CX7$EQzDpO!u=eQx@K^u_5*(^sUgPG6V4F?~z=_Viupd(#i3A5K4( zelq<`NDKKwp-^t9C}f0Up=P0qP|Hx8P`glvQ0Gv$P|r}`(7@2p(D2Zx(Adz#(3H^h z(CpB>(8AD?(6Z3V(3;Tt(5BGV(2mgV(7w>Y(2>yb(5X;ehC3sWk(rU7QIcV1Br=+3 zw8&_cQH2vvI%agq=$_FlqhH3LjA0ogGDc^N%b1igHDhMRoQ(Myi!y36mS?QWSevmS zV{^u~jGY;KGWKU2$~c;FBI9(XlIhJ1W@cxGGaF|{Gn;0XXI5sm&TN}mo!Kd~Yi5tk z-kJR~2WQq~j?5gBIX-i8=CsUNnR7E2WG>EJnz_OvjhS0Aw`cCk+?#nI^Kj;| z%#)dCva~E;Rwyest0>FJie)v+s>o`Y)h4T5R)?(4S>3XFX7$Y)m^CzOc-E+_u~`$d zresaenw>Q-Yhl)stYuj%v({v-&)Sr=HET!K?yP-T2eXc39nU(IRhR9~4rFI$=VzB> zo7su%=GiT>TV+>ex6kgF-6gwwcCYMy*@Lo&Wsk@nojoplQufsBnb~u)=VvdY3xHz$~rofFP!oDI^v@ZbQ|jik#Is>vA^cY{}W4vnywB z&Vii6ImdEN=A6mZa(%g>+}zxvTq8G@+bp*tw`Fdd+;+Jgay#dC%k7!lH+Nv}(A?p< zqjJaQPRyN>J3V)H?!4TExl3}F<*v+Kle<25Q|{K>9l5)6_vIeUJ(7Do_f&3Oo;xp) zmzkHJSCVJuCGwi*wa9CgSC!X3uVY@9yzY6u^7`cs${Ut9B5!owxV%YuQ}br#&B>de zw-@I))%l(ByXN=E@15U2e{gc0>`Q!5^=TFO@l|MIsLH^?WrTHuJSLd(G-=Sbf{KEc1#Jr26?7=*T+pqcXF=bB zfdxYgh8K(~7+Wy0U`oOCg4qT03KkYDDOgspvS3ZY`hrabTMKp+>@L_>aIoM=!SRAq z1$AL}I1tVZ=Z8zeW;hXUj<%pxxGLN}+%eoG+&$bY+%G&RJS;pSJUTosJSjXiJTp8e zJU_fBTpL~wrR6fQ1YTDYQcb>X_gjfGnZ zw-@dz+*^2{@NnU=!jpw(inJnMQK%@lsHn&&iWN00swiq%)TXFiQHP?=Mcs;e7WFL} zSTwX~c+se$u|*S$rW8#tnq4%nXkpQkqGd%Zi`EpaFWOYJwP;7t?xKA~2aApr9WOdn zR9EaS4isk==NFe0o5hLZ=EW_FTNPIow=eEk+@-jCaj)Wj#e<566^|$$T|BOMQt{N{ znZ`bJgQK zKX+24UjF(dW>J)F+SRN-AM%KbH-(y;M)X+mT@I#m-KUT>*ilDSudSo^h_^5nd_V4w zyqSCi;k=E$f~ss~yh)>!pGaa(179tScJNm!-jZq`Cf|bmyGnhWY{uKP3@~3YenhPIhtFHrJS@%!K91SB5V0s6R#;=$n`uk-BX)` zFuT$^5Ott-2e8SwE2l@`UK(c2l>waon<&ldyOjUhryBXXlHNh8C$x*8vx{|(YkvcC zMIF6G{#IKC{_(mGfECWSKk_PzA()p^m7T1=k@II4&3xlKj8)Lwl)N5tBFFW19cCf% zO~x3=gQTzSQ~y_c?*eCI*|v>eo3-D~FsxZK$u5l{Nl20;Ns>~FsYFR7N#&7Lk|aq&k|YU9(yae+9@mI#USD(oxB({`X|=j&H*lNy!MvM(3b@u> z0-HAot=~0w(k-EP(9gS>);nBW?B^2<$cyj_`**#~+l?OANZHb*a){U0UtTcG#Je1ckS?g#F|1`6oo=6K)_McaS} znMM_5?!wWKS0(hqqSYm|<8RX+gX8F(%wvw;V9rCV?vnWsvq;OV&K{X*F{{M>4805| zR%x?c%8{8x{u<7?O%eZKq)yUqlFOemBcy(m{D6Fm*fw8igx7q^bo@qWoH!~9FHY?c6ParV8Md9zqvkGB@? zwve)*2iuw@^qUqVX&HVm+Y5A8makprL(r{A4`8^?OV4BMij!|6XAK@=&efTlyPnqs6?8`~JZx`c)G{itU1l%C? z0O%NL$%l?!&3sZ^w<8r0hmt3kOP;}65czgB>-KeN6jJqt)MJqG0Y8y%F$XBM)=ezS z{YXzI?drN#w11szJEV;3c9J)6g2V|zGk!Ws{iCNy9#G4q4boFdPnA5WK4KV`dBU|J zQ|C)r*w1=(hg*Rr^)u>rNyjlFpQ)?AHP=9L3+*{%o&bL}=Pfs}ZrPkhEu_CTrvP0& z^9$+Xx}^a8O#Ex)ANWVy-7R$~+78tJSmjj#GOZ+y&@PMteIeTQ(ao=5c<^GQXKQIlE!m!myR*)|Oz?eb3}o5Z({?qyyE zeK}@)G}hctz_+{70pMzBi!<~#sk;ysDUUBpTI-?AZ-a4aAKF3Ew+n4Hv7MSA`8HF} zOl3V#oIha$@~6bleDRN$&cq?@ME;SsW;yG|A!(@z@3c*TGe{2=S|4OtE0Vg%ORI$} z*HiT*v7c=dX|IfzMqKTM?63u;W`|fHd?X&}hdc#o4Yo8etTfsSLZL#|n-5N91=%Tjr%R@*^nk>>tWD zZn?;tWkza`Vp?hjCo|iK&mBG0JPsMxF0U~^gMN?SerP1-oy=mXhfBVFA2ONz&pgnc zan+x6{q%8oo1k9drJcOXGsW$x? z&}vy4C0ebfF65s!*UZo$q)iIXD6e=D|MbA?ueJoK$>7npyr)>P8M(G8hiF3&VHQlC4zzCnwu4;B4@ z{Ls-uH#F}+=H;S4fvpVc!wlV8+OGM#BV9D4rS~CU+s|@K-e!b3CbVT?}Co8U3PTD>4$6!l;e{gC-G)FGQAEIodi0e zp|_|hMc)8Nu&$dW`A3ZwojFqvxH|9&#?M0{V@9P>%b5xipQd&CL|_5tQDG0u+F0?A znnn5{>X`*;X+4Xu(o*z<656&G+SZgfDdyA8jEvAFGH6GNWemz!hTb7`iA;$-rmSgQ zEaT{mOstfzH%Xji>>-_zNqYFS|EO+ByXN}K8^oXJBfkQiD0u*FfzU%G&t&)m?MTow z$S19nqC07yX)ee#+AXviE&WF|R{GSSMe||*+T2c^YAyZdbNx7>GwseqiQ5c4)!YQy z`DX;}86y2zH89gpN1oUFsJEOC?fUOgmUaJ6-)S){KC>qbHitu(MeAKz=J36A-#EEjd3$ zcMBOOj&}M5R-OiD&3+ z@-1oT%u-)XGE&MGm(m%%Zk71iOY4bFhVkj@x=9|HhozsJk)I%Rrao+X1WkL?B(oYa z&Q3Re(wO#N&9Rh14?UE$8&~ntPUd8ew>bKQ%-G9&h_PR>u0-o|sq5Bb{O^~rqhBoA znxkD`=^Pn5QeR-zgVuF9j#SG`1RZhmIN`69M%gh@#^D#D8{<@HiO&x?mNJ*}i>Wg^ zdN%V(I@4E0elF>^N*Qr&<$UufXxBzi-sK;Z_bHGc&#@fpd7LnT~?(UTa)ax8ZbNPkK#WE-c%|2V?~{i%}p0i9{bz5Rs&46iG{ zBP9Q1{B|2@m(Sl~oc}^Uq*>3q{#0?Bi=J1e{oTeoZ3FwByV=(ujTO77ThQ+lKWryG zhV*J#|Dz|dZF+(I!SOLi??&|THWISD<~ z{efEox2kc0y94*A@i;4Cta>=`VBldj5oad6s2&fz5}2>%1zrohrd|mw3@lXhbN8e= zs8=yMJxu4O?oLhAbyM^5PR495&IrUg4PV2hZ~Wh?kpDaX4i)$R;r~PBr0z(KROJfZ zFIb`SYgDgMhe~ptf z{>YpPg9CpMUx%LxBj>RpS24`rn|nboF$;h%n90D^=0)IBMsn~9)&&JfJ)C_7SLG%Q zaa);cC1~N@L_7>xmRrV*Ta(P_B+T?3>K@`f;&^DYIPGDk808__j7ykTz0H zu{N!>`e&yIT|jHtF&T znxsy`T?zYr`BTLuRU8{7=as2k@mU7PDT&p`5XuDNv>MW-j%tAQgw0e-thMQgoiIIk z@)BIqNS6}qOIq6dh;B%f93N4KU|UqrB_bcFh=wFMkipsjqLS2%;}!)2zs*2ODW;Ru zb~gVd%-780%AN##FT3ya!S5pF$BQ_jsR`Wc1AiAB=FhnL9q?S@&D2q!BYtIDfq$lwQG)+jtVlmNyr1;nh>sE5CYKN70J2`zla)CepF6NDC`Om0|`OoG*t19QuLJ6*C*xP*_7OhW(J2<21A@uq(2UU+zQs_v?>?^o7ISq_=rE-nWzC zE76w4?+!PY(iqWggFd6&K+y7^uE6{kYYUvJ55}-mZ6HOy?lflK{@-ENfDxqN!$TnmVR|X^a?5iBGj?m0CSWnkW5Z z1XVa+5FaA$=UV{yPZ1AcC8_idg!8Q+bSA+tIWtI?A^ijKH{vhk%X(+2y#!w*^4_?N zf9jFrP;$9ePZR$j(r@~9q0M+f+%P3Lj7S+hmT%uAXOf_zyGJ7C5anBkjDbwpKOp~a z{MN;WL+2A`+oPVh&Tr_i!7V50-g^9;aozd-^|Y3?toI(+ayRTkzm496%7@w)MB6^P3Tm={7W z^JhodvGyVR7_Rc0VyD~LcCKAu7uk31a=X&5vFq(7yUp&jd+Y&Q*DL~>w{fugM2snZugDwjrNW6P4G?fP4&(2z2JM<_quPf zZ>evEZ--!2Tm3uyyZ!t9 zhXN)L3M2yM0{MZ;fr3D-K;1yYK$Af8K&wEzK&L>rK(9c*z`(!|EI+;U#`$h!LMU=r)(tK!tL+Bo^E z5zhT;fn62tgI$8%gMEViu}*wY@TTDH!4W|j6;Q!(!3n`h!Kt87HiIt&Uk<(=TpU~q zdIjzoUmM&I+yZ)ga9402eh=d8@jxhs^XpY86{;Aj7OEMlgF9#&l7KWCDmW4hFtq!dVZ47MNL}QQ@&+)Ij0K z!c)T2!?VM4K`#g|3cnj(9$pE0O?Z8HQ+Qh#EBV8F!Uw`d5nlxLP$WB&j8uqJjTC~e z9jPB_6lof10lIaheWXjId!!HO{*ghEn9N_dxv>SYMX`5d%VR5JYhvqTn_}ByJ7ard2VzC2Cl<@to_@#F z16_`omNg5i1L>uL`Zdx8p0@{O97r`LXA5QGq+1a0p$)?+a|1aGDdSwJK+eaMarT@> z&VG-K^NClc5oMfPmULa>)wJgpx^*!*!vwYSPepRhp-fB4Tu9Cg$~gZxnIAp=X-*mE z)(@mTGSE3B>}S!22=OG!xY%%EzfsG`QCCwJI9o6i!_J-uJ#L-JZ+FrjuYZ2^$hffo z!}!7aN(nXX_qwISVvi2f&*#!DuRWE?Vc2z$G7LLZD#;JO6B#ajD(!Kx+M4{o(T6wk ztFOuFA((N!kQ|00W3!7N=lbV-+m*;v#$7TJtGCbwx_(%me1fj`ri@GXb(HkR*cX)P zLzy#Z^U5P+T&$jR#9No&HZw%^J+8Ps;9RLj+Zs^D85Fe*Y=j@$Gx^6=u~W>^BL=d_q2B7&jJ`)GfG2P~Luf zjJHGi_Dj#(^Jw#6+RPH6M^NTn%D9|=?GZ8qDf4%aJ>OAgl-Q$R7kCu{&8V(GB=mn<5F4op<6%EEti7Mo@pL?oS%b~p*`3GEiuNNpjXj9u2yk14{5Iq zZW34eGdcSpf#+9rl{B{e!W&9|YXIy*wj%zEGEQquX# z+3fs0nKru|?%ui_ehK9t;M;FVyYRXe!IcH)uH{=-kGa~f7dg&mZ(O-D;=VmVo84Pi z9-Ym!=de=mLd5c@7V#@5GFIg$JP)TokN>1Ak9!{mqy3a2A94gSo$_l#)Zh)Om{KPDmB%St#DP^;FV#VV||Ud z>+H#=48x8wJhA6=a$M}Wm}kAJTo~(8W)*D^K1R9xSNg9+|KU0rzhFPE68mwL*^jG9 ziH818km%v>sVez<`+KV@=#BJMRsGla2dEPi_F2m=c#P8caess#H%R!E%ooka??RX* zcqgZNeFU=_|F1(wU?YCF!a&Q!{!YyP;@u(KO@ToIjUCoH0aFepU-@-qgth>5Ezosg zuveM070p4nQa;@dznzrD4ZD8b3#K354}_g>F=bv9?Go!t1UC>@6QAST<)jY~rxJ_E z|At6OJ)ZpC#Djv+bi}s)#J4H=yP(b{{T1(2VTcp$DgBzo z8U8Us<17j(S)|nf()SY=5T_8`R}YbP+VV2epAfqeI}%SLt|UH6bT*G8?Ql5hmx%|7 z4-oTl8d)R%S^jg-Z@vI$l3j=!2`)na`C{~-k3K3l0ON96W&eZk+}NGWBQ!%Sw8Sq) z(lC!FXWD7ZCu*-~YP%ub)SFw7!-oD;czQoYzTzMLd&;6%KeS zGwgDfj3DKWjFD@-GF=n6I$aCeS5i1eW=ph@xGc8w71B==*Ar#jK4TBgwh>xJud$NI zgP83DXFu^1;sTgUt3>$Q@VBZ;_`C2=N=AZhcz^h}@PU#!*UHE@b(Kv|$C;Suz9T>2tdJ!b zXgUh#F|W*2lsCOYBkcMBQuWB&^QQgFclFf5{g}=FdN-!rmdDe|XP4gM1h;0(N(Ozs z2>|C4=gEFF{TBJ(lXEuE>br3Ek2gfP=ae!x$eJAef~=s!8MLs+T*I%{5?2xHlV6_r zH{t;DXA$2ZPA6_8_9o6GenRYH%EOiSL0f$l?!3Zyi;LS;5^uke{{;MVIR68F>+By# zx)$+S;v}N;=iMd*n?EwA|0RqIDf6bm{Ez+&wAIb9AEDS4JzQLWB4eBMy88<4V!(rF z=a7?rQtCu=q7S#A;(QN`9PP!9_g^FKtPdH9mAQzjFc?4L`7@K@C!KzQ_zZC-ag5k4(}%a(j5AZQ2V*J1Hq&5M2=j#o{>$X-I>_0`H-~d@!ZIZndHIz^@_R3b z-!}1bAfs_#E9N%zv&6xYtMv0|AFa9C$Oyj2U7UAZ>aJZP-+sogRubz1ttsb`fo0&_ z>g9;9%(Z{vAZLT4^#bBFpw%0^GO!1$C&-`W<%?~4g_k2Ps-+%|ZYna%JRBomslWe~ zqxb%WBdd4BS04bae#85gF*(l5ft^~{qP&aACrE!vyxaKjb|uy;TmAMCU%d$rS-tiz ze5+pda3mC3PX@>8Ddq%Kk}eV!l!4N8VdxG^DVGY~v^zTI$TFkDKcnQhb2ENJNku-x zEV;A@#bw}Fv#krEl`iv?iyhEH_y6nn3K!q@0Jol#5~yz=E+Eb$E+&3QY(gAGWQj%n zS|49MFXM8!Eh+}Q*2rw)YRY^KyAa98e ztFgX3K)NGq^bbidBu*e!Cp!CC*XT9mj4~0}@V=~P*Nez`gZ1C%q?5GmNz#*LFOjBC zT!=h)WcmdnCSoIgobVBh;Itm3r0BB9GFXMAR4tggFbz@XjWKrvC&)_d^d06N;GJdy zu(zzlOP_@thxJUV1+W*={)oH6((7zK_?=nw9lII-L2XebwWrU&@LeLOjUSn(H zD_2*stfa@9U-8}TwhHhLTM>98=~u02m;sM3#19frKIk7}hr7jhf|-hMCJG|lP2fg* zgxtX0a`2sV8)ZYw8m4S5ZjCZ8K-SB-&tUdc8QckWHhz8PJ+stzmd~9CjyV^Vf_*rL z1}lkhYpec)Hen58x{!U9N(Oo{P830jOJF`tzx@C1C_D0wvcR;!tiYVWe5|xx5?B`a zD6l%PF0e7MHLxSF8>gZj!f8q&oZ?h2m>;Z+)5>b$4xNU$Kc_iPVQLrb6zmr473>!r z7#tG3H8?ytDmXUyQ1G$fl;HH>?BLwsg5aXyySROMWpGV!eQ;B7TW}}t2t5!i3i(2j zP&V%Dtq`gjDh$;Q)ekiaH4U{0wGOopbqRG3^$GP44GP^9x;-=^G&(dcG$Ax8G&M9M z^g`(6(CeYap{1b}p;e)^p$(xeq3xkvp?#r)ILs^%j)lvHQ{jr?YT=sUI^hQ4#^Gk+ zmf<$xj^VE19^t;>0pY>nq2XcSk>N4n@!^T#$>C|?S>ZY1`Qe4(CE;bzn^%X|g*S$` zhIfQ_LsLG4vK5LXBIP3ak;;*RNUccSNW(~zNb^XmNV`aQb1 zk+G47B9BF;M5ae(N9INrL>5KfjVzC>jI4>Qk8Fx;i|mZ-i5!R&MSamoG&`D%R)|)O z7Dj7F>qi?!n?_qiTSwbRyF|N3`$YRk2Ssm+-X0wh9UUDPoe-TAof@4HeIfdC^!4cC z=+fwl=&I=2=!WQ)==SKY=)UN|n2H5ru~^wyDpoO8EmkvDC)Oa=IMyuIGS(*6G1fKK zBi1)IAT~HQG&U?YGBzeQJ~lBnIW{deD>f%KKejNoB(^N}QEYW=U2J1)YivhscWi&` zP~5~r@kG2_JU?DJUJ$Q^`RRu7Ch_L+R`GW6PVsK>Uh#hMf$<^nTjRsyqvEJ*bVEA; zSYK*1T`24HwUN3^-zl`(MSPa{oK1nVg);MqmlIDW)};;8L`IL38c6phzYp;=VpZaK z8U75&oK1Q)F-K|?Xy4+8fwZRu=|_nl5C;*jqU3d?D-y3Ervd3P#G%Ad#D2s}i9Zl` z2&$ir_~8}OlgU4e_B_OX^;GgVakW~6^cuYaU#-zAfob9n{RwPnLwb=Q#@_@Z(vo0* zfY5owro@n-+UM*fryMyy3P*iTjwLpyi~C8_PW310+e=ZsPx>rDHH^5D9OqUA_f}Tx zs2}+DY2pZ}r*$2^O%Q7uv~@TSSA4sd`!L#(K8bPC+4KbeGt#Ze|B&?gLYpkocaZ-h z=}x47BRy1TRb(#&E-}zDUkw$}BW% zz^|vj1@5+^fUV7E!0omj=^KHKB?S?~5|(RhM_`m8y52MZ%^g(gTe|CZa{MWIKrNW^SUUAA&g<^sy^BA>L@{PrwtAQ?W`zZ4s z`7W+{Fzkx*SJMAG^;XC;S1aDTs_S$8{dbfZD(y5@U5bAkeNu*&_&g}IIf*ip$?w2+ z{ZG2<{E#5um7p4W2kcpC<^Y>>gkT+WNMl*Esb;W@thZh9wj=%7fuVDuc4gD$aE1b| zOU(D%3`y5u9%RrZ-{6dDkkF5qyMD|R;t){@3xCMJ! z0~PJz85Qa`hJt)`AY*46xV6Fzg5+RZ2>OtWFzE@*dm+;u^kh2%Sd~8SYoTev&i+8w zcxnahoX@qcjp&x+e?~rQDxB^hu{WAAe28f@leW28HZ#FruRn#1`!>XHf1z6~Dew4$Bo49W4tY$w z^4`b1fNzVKxBt$R?M`{t>S{ab$H>p8omcW(S4Nu4xk`Er@fo7yydtzJ^1N;1c{_vj zRN??9!*-`E=?TQGjxUJ3B(6Aqh_w4^7U|){tBD1~`ot+j=eI?qGj5UYMXcbF@xFE6 zHj=lvb6Z@ee{f%t(9T7=uJ)2sjo6r&B(@Ypk6q;XR{cRbmv{!TA<_AvnSmCqz9**v zu_v*-pn8aOZPH6fS0SE5bgpOd?PlUH_l`ic>-zY|GJVNkoQm<=%%FCNuI&knrNZWx@`gWV_xk?nNE}`Vn4K+N#X5ADPN|k zk=p5Y>8-10&0OH?Vh={0B(HYWD}aMpj%rCQiW^phKZg0!=^m~=>`QkKF+aODuD?DA z$+^tKuD%^l-JmL4aJJ^?Wjj~I#RTd8;#<^U!e1Vcqeu10|rL3u4HXHb~O+d09`4cJmJ87p045Htn<&vK!u_HLSCz;k`a>Kcm^_eO(ZWLRif>v9ciEFLJDaf`mbc3ip0X^*)?)_@2 z;_*}Cr>e5avB~FEPOi$es$Q-?H=s^WJ&~G%eN1Pe=eZx|kU}KF!2g&J#L3z)7$4A; zVK6?RF+PC#K!y20h50~*{fY|nfl9Z7!F(m=1C{OtgLP?`CsTR|%&joPVMf7>g?R`D zt3Htrm7WeW8)h!d0+>ZG@4_sHSqZZSWJRghB5gBRqqw@8mh_;i|QBBUQ6J%M-)@hPH{ zxu5i<9?l~k`Z2^Y#v;g>lGRP+DpPAS;biyEiHMx>h) z9bJd?0OBozYC35r--q-f;!Q*+-;cEW%Gp-ndE15baF5KGQd&*t2}`|X&lK8wh#4T z6$tpTJ|R#aZeI8A>|HR;OiR-S=h<{MJxpISzzjA+%`h|4j4|WQM1%gRnPujf`DUS6 zf>V$_LJhgjY&2WV4zt_rH;1gTA)Bz}Y(DD90$a=0wGC|(+uXLY?QAF8&GxeWkOo8S zt#)|v3ibbdeL7kJtWXDXjXHk&!wiDC3FdZ~5ip}+#=%U0nFKQxhAY?c`#Q{Gn58f) zU{=Abh1meJ1!gGY=AydfA$_$p+=g|iK0~(vJ)QjPNzWtQ zoAi~W>yo~VbW75&lD>!ZKGIhTt*;YWO(Q*r^cKpzLYd~|zexV$`eNj?C&+(>GJlZ1 znDld`uhh-pw-ZTcd-wxLJME={(AYyG;c_ygNuNTQpGn_L+R5A~wEcwqugG`WT3^!Z z$Y)qgZ_)+A&(sQ^svV$v2w(k4`UKMZNiU*?vyXIvhu^@w2>Fk62Yh=r`9G-JKwm-n zH`K8>yT!Z&9Hq|y{v`D^c6cpyOuKl4(XA)FXE(^e5>!KTb*goZqnqVw2MFK zfAt4QSAGZ(Ec98|`6DgncoPH>U_+cPHQN z)!a;4YDf4Sdw{TFgY+u$=Sn*YZAJXU(FV{Gc9-{5iLN#I3&(@8wrlVg9<<_1Wa_BR)Z#t}rryS?}JNNAh(K81eT2n87eZ zVTQqsgc$=f9%dqpglZa$sH+&RCHP$iBe_e)1=gWW+C^Qir9wX@oh2!W(;@}^ zxFtcS&y_O)aQ~@r97d7Gc%YDO>%V{hRq5`l;+h{)gV-U=tPvy>dS!;^hgoc<&-IPFKi z+D^QKUo9X$LUb29^J%qkRs|A^Vm%f%ZcP2Xe zD!O<;P!A!!ne;K@;aD+ntdRcOq42tUtQa^J-xE5VPAMt18`{w^Q_bt=WBT)0Zm|T3 z?(mmX@c6--fBu)#|3Yp&R@&*)N^|vpDNbBo`p3EVSn>Jq=47wDH_nemyZVYX33Nv( zUsmp4SD&*q?I61PDu-_)x*H@RLuX?7s3jLZssy}X-xIqoj?_msUp#B2m zj>Gg1nDrZ>f5PhKkl4pexVPzJl2W&+BNxiv^411PpbW`4Z=ge`Pk9Z_Fm#5U~Y2 z>b9Bh&35wxMmlzypUf`vGe$gq!3x#AW}o?0#y-rSrpTmi#Nt#Rn{CV3q|LP{n`bN7 z<838d)t-oz5U0mm$1jSv&DxW-KkK)w16jYT(~vsS%3;g_{f?vUQNVBxk~ju~F$e5+ zQ5s_oI4e#;>s2@_PT{OLIgw1E@2zx8m^LsSVbCJ$9x!N2^#B-*JLsV>7+v3CuE>k6>2Atb^GIvlV6s%x;+dFo%%c3`__Ha|LO( zTSvi$2%}C{AyN~<%6Z`+9MI%p8)$?V=-x{F=rlqEJb`!;u@Uij;&D=X)48N;6DxaY zBjtqmJZP-X7kiwGCzD2;f#V}OP7Bg0e&yWqlXEt)vLJ49kgue-tK}vZa1Ic+6Q!=w z=~k2>;#Ls(%Axx7G5JAU_nf4>H`dT%oY zcsj8^(T$LwL7H=c`npoS8%4*CIQgm_u`Tf>;w40`S|xXVRw#s{E@OkLai4Xs}@9Z80j&x0txFC z1b@}bMV|EU#P^6V5g#GW; zoJ%P_8ATjT-zwrz`h@YIzNVdSl^9b&ZRWUG4f#sv8X3uWjy4?PYKiN~`JFbn)VZB+ zoez2E3)Yv2y9|X|$x*ZE;y0XHEHMxg#EKKa&xxBU^Cj^^avY8$hi<6@3^mv5sC^7+ zNbb%+t`M6Yr=7^-R$ic5N933tcEkuj;z1{~lbjZm+$$?TGXD9Ieqao{RP&-9YhHzI z=Q51j7<)m|%Ski$BBYXncL*P=WQ4wvG6y{}?pr6nntbL!X!|064do9At?nj0^oVaS z^4R|{=~^CpoLeXITjw`tr?bB&<$aVt&LeZAKV4Y(E!NM8-<+SF|G%U?t;nB8d*%y` zHC{5#<;G--7|$Vcej!m2iSV%A_;j%2$4JIL57B zCH)EQ%%h!|6$8RS+KEqoBW|E=canCt{Ym*8a-44;#Z0q?oo@r5;ke`zq@UEMf-{}; z^W;03E_x~W50O8Q*i}$RG4g@3L!2Qe*Q!@YKTEvBgS~k=v9te0@_!{hNt{V{r+_xl zOTFWs&!L}FA1AuK30>)ZjC3@h{@GA{1)b>(jB@XR?z#`pSsWW}g7Y1d>TG=)w4$c^ z0^EewOka$di}Q2`jOVw&N{p`Re2$;Cq+WUf=2os&7g9TIt*7d#s*QdT8cZOMG&@c8#i>lw)m8R6`@HIB=h!(|Q9s|#R|BX6 zUmO1={)-xzz>z-cy2SB`duNQBi>SHzUg{mR$>TIK0XRXirN?nw- zF>AAGoAq7RHq{~P$E+XKC0V~@{h~T$?akV&I%gfsI;gr}CB)MhNACeOXavk?m~k)@ zU?#y#g_!~K0?f-Wufr^cSqifPW);j@7--2@k)!l>m|ZaYU=B)02L@Ur_MIpLEg9=_ zl!2CPs=+|plkGQHd#MbxWCM-Qw1k09X`m$|rIdlcu#!%h0Wi>#%}^L<$z~+X7?|-e z6Jekwqh(NL7R($NXvtb6OS?)fkajcIZqB*`Io+g2OKYysaH}=k+avMFx3|&;x0d5b`SUaOi@O&H zjg=m~LC47ND(w*bBUp}{X2iPmPd(E7D$O}DtSS+E9N$OUhkPJ20uGB{{~sDUb-FU& zo<`()&vck{HKKFN(RHN`O`lBuc|^_=rYn->{8-WFLKpo|ifL!(HI#9*!;8rA@*Ris zepmw|{`aDLdz^>w>~S()+HuaHx#aWy9|roH0QvrfV2li z-w=Nz$A#TtSonxN#M@D@FH^zgjeyYTb?ySn+1eE_cFST9` zzE6LJ5DdhcHJnmFtR$%7rWQE&r#Awx0>`TTz~bFm29<|aH&g!p^k&HPr;NMxO|5y*0zIJ$)JOgfE^8-i`3*qa{D`9Pxj)zfo2imxB+gqK-ct8=_q< z=A6T~ZDl{3e%MHkc-9;by0Yxf&wTqRWqJ_n6VD^ICZ0=luH=wzNvun3j@CfyZln`L zkw=*G&d6(zP-_f^ypNTHhB547;SyP|iE_WGBo=o4=dqv@=~3`OlKITlysjGek*cf znYViniv`@S0#{uLsHJ>Z$FauVq>SB)kas{dp$$HKq)HFagTX`ltB1jigc$=fUQg7M z^)x*T`(fwnh5zBGltRwIk@7H=VbI>9+$ii=RnXs*K}j?yiKZ0{ii|<+gH`v+puNQk zePz(z8nm|t?X4LOgZ36XC6z%bHE3_qD^TdADKi^pF3bWL)Fn`4+f>iX2YPavlU>f!W6>PhN*8G*`~Gy_6jK59;ORScNnAwv`j>l z9xA87o41LV5u<{-8}VFno+AB;puL2g4@yzj=i4CB(bdv>U_&2rI;N4Lxc^G*JT8qH zeX}KvH7dB#McloM{8Nau-&{$)^TP{rlahHtY%ouXo#rgQeV%w7@qR)56X{z>&m-+* z3`W&-daC5H^o^)rNkY8d6fS){SbWeH0hq? zS540a=YEmY^KdS`HlCQYH&Ete!3^K|)A^b980TB(2ls6y%1Xhn#RxeVg7n;Iy>Wso3h=D*V0=M;|(;v!gzK}ouCfCW8$B+4Xd%*WTV=u{<8NS?u@|M zxLUo084R2qNqj_Qfu6!P>2a*d#QDqO2drZeNk>nFMx)hz&_Pj2oQt;=H9Sw&q<*ThIe z1Kn6R(=D-Mup@fIJ#=5GbFoKYm>!9BTu0QjdYS%6uh#4IM!glMx9ryY^&w+$UvvT| zPvqn7-U3t0)I}e-iD`~q4ed-P+@IJB=cEiYLvRwsa5Kt`HP``SrkLqwwwY@dm__DY zvm9&e*I<@q6J}O+VjksyDY8Dyo@8U*qylD33T^Gu+RnDOU2J#ThwEN%vbSU9>u5X9 zPOy{Eqn=@3urJ%!?P9ysuCS}@TD!q+vD@t~yU!lI zO4i>{mus6g*CW>c&O2~s@)pp0rDtN_Cw-i}H8aiCzySt%LGMJ59(zl05m*Y4tb5PR}1-Ni08&~~0j@=VgsZ@h^p<16R4>hcz2ID)59vbUhGUMV`;Fpmem zc7A(>wDZZ`q@8VyL*!?XbT$trO*_r?LYu1uaSf!%aF?ICU1-~d7$ko_aVT+|p!1u# zoSgT`xsCV$@fjj*#(mu)Ka6;R2PvO<>wH3=V-Kddeuf}UcoDh|X~sF$atq&u>ujNo zb9WzU<^=N&Xsn}03sNc5f&|!tR7TsePgSqJAFV^r!c<{OjbIybSK$e0BSs+>!l7KO zyXt^btuHC8QdqUHM&U`Q`4w6P?^zh$K2Y)PBRbt5dKc!_7v)LFA zGO>zi)0D4lFk9s)^oIVkzx4j}7PNjU4UG`Ekhn9wF1<6o6#wIm`-9XvJbYiwEB-C! zqTT;D{{H{?6++E;aKSj557BP_lfR>V^-n&*>yocL?jQZDOiD4XOTL1y#AhzONF6mT zyr~Rng!ZrDk=%frTlj~!On)aMZZWrbY-S$$hcV*y;nBl$G;YaP|0Fg_eCYh?e7F<7 zEb$}q?0#>Wiffr1zu$$E;ga0Fh4CSAvNOGs@lfKr*asfsMc&a4aZA2}?Iq7b+EH3& zO1>`+V@bG5{8#+u@Za=Y^aNCTsUUvQ!xE1CU;G>{&;N|N17k)fqLwJYV{mgsb&SXq z;_+c5sRlH~ns@^0Bs@WA$F)=l=cS#3nz0U^h&ol(1*aY!pQ?{1ig}OIKsUe>gFbmW z?nY~fCxH>EGoUp#!u&@zMp7EXhO_WwV@#=uD#LX?GH!M+TpWYPs{1e|=f}#Rhhf_U zJR$W6_80in6L@@B(ft%`n~EnJy8@mD=RG{oj__b7EFP^sz+Xi zAv_V>iC2W%;ovAx&QXnEUd{&$=zt1gJ`GnXV74;?jAPY~59^MyfMs+UV2;iKme=KR zdTOrD#j5W-od-NlA15oo_3hSF;C|(H|H=PmuEgs zG9TwMAE%g)^O%oQ%*Xi{b3G54pamX_^=22qg;scc=to_M{L~sx0AsQjArG~|6T&*Q zw&1kG6IK_ae;UC^QwMx?2_B<5;fbg&cw*>zU5c{Q6=S~%)eTP;Ms+Vo?(dFA%Fn$B zg_N8emXjQolN^?lT$YoRdIoco(xaRWo9E&QqW?G__P?s$07vF5jaq~o&*N$do^16l zo@|z@vKS3tif^TKmBp&MWuT>umBkFFtQnA!mV@!~6|h0dTMl+q$bLpCbvYPCmT_b$ zdpQ_UUj=$K9;4RaF&JTA3tWfCV2$2-;08PfedCQlDSK%F$cY8 zImKAYWDa)WYy-UmPXM#5dk{LAXANRRen0R4o)GqQ9K_o{@r1E*GOfZg;SCI8UrYpd zB!q!c9RO#arM~sb@V||gMyXkH!z*?gmYmFS;2dgTLzEWR_xazC>f*zy?AzV^-hBZsBepEk-P)Plf%lai(KcSxhM{1c|{iJ>p zwA3}ZtZT}$t|_ah>*=uVS^X?*o`D%$SNr5(oEB$hvkuC^$pW)MOHGu6(OaCO&H5+@ zXLHU4E%i|jZrFMqGK=&g`15V7D=4d%V2oF@hRVSip6^0Z>Z!7*9}9C8_~K>Y!B?$A46 z+fKa`e5u!RSg+-wcr`7{Tid*Yl3=b zB=%>FQukmE?OxPA_o=a1t2+)hO+Y;~Q9X(|p~q1dO;%50Zs;l0L{Fne`8(>44^U5h zj5^^{w8NjH9{v*T?$;>on^CgAL;LzW+SMYos0J-*04-<)EoT-=VGc@ME?UUrP_`=R zDkwcCqNLP7**F>H;8cCOtm8!S7 zj-po`g$1qe59nk-Jff+IekhvY_r<~)4m43bGX&)gez!UrD0-^X9WxS{|Gt(t&OTtV z6z!02!P)90oQ)z$Y6ia%KkYB}2X)(}&|F1Z-AN5n{#z%ytUUaJt`*x-Y^VIXKiHR% zkpGN zqOAm|tpus9gs82AsjWn)t>7dRJbr2`A?PZycT=>L7`2tS>Wn8roh6GpOEz_uGSpe3 z)LF_!y6vO)Pc^%mMupo-j3(&=DF+HZ_zo>K#0WdPL8Zdho$zBL+!&)?ZZdy!$KCDmX5n-Sr%lLuFx*I?Q)mrD zkBC!`h*N_|P0Ne1W?x}miw*&P+=+!sq8(^EX)d77UcHc#C^Q5%Z58)ga zf2MtwmN{ELj+@7`*(PVRHO|&g;RO0@Jyl~ijO}fZEo~4tR=$81&$YC!jg{6lm}y0q zYG|FA_H#Mb-1yjvVjT@ulZ5puth6$jR&sZ2VdHXJ&jR@W=R1a7EVL z>GmUV$; zU0_)kSk?vpOz*?>J6w-L>H=?%!_@+Z_c;E*ISFCb2m#gz0oDis9Mfb`mZbNAz6W|A zVfH@4tQRc%8kW5b%l?IBy%1)-5N5p)&h#uQYw1(C-h}H%xE_S-JGlOW>nXTCg6kbP z{a-Zy1nYuq)&<$D3$j@k_^9C<-B!1Sp6|4JsS(1|=W(()G3*mMq>hMXw0fx{ z64d0wtQRa+LrgETuX? z-Pn4{wq@D2nDg5Y*AM6ekUyjkVG*O~y%zV~Hc;VXmh(&FmnzHBZduwbOS@%hw=C_J zrQNc$Tb6SlOK+H^H_Xx-X6X&H^oCh_!z{gFmfi?UZzTR){5kmK`S|m|m*QyW;`8G3 zR5bod{1xD<@mGOw#NPmZ9RFA);-ADn0e%|)6!=;EGvMd(&w*dWzW{z2{}T8O_M0W* z+v7g~cf`?0U>)I${~Z4r;qufJ@n7S=;_dJ8-+_O||IE}KmUV|^-C+|si5x8Y%uVD1 zrPi>lHEg0vq6+8}6DIJHtYHFSrr@C?qgcor-4 zW0Kl z{cBLp*P(oGK)K$8^1Kyo`gXMCd(ejON89};_Ca8OqqNg#rL$2A%c1n8Q0gk6v{gna ztELOk;?_b-TL&#{eYC6%(W0J((sK?<&4nl@Jy9BNKud{MQrbwgkdL6x`Z!v|C(#m4 zMGH6^E#DmE``6LZEkz5r94*^NXwg>V28gxj2W~{mwL@-#z|GAOlZ{;40j*MJ2I zFMA?CUX6TsEpp-YXk~6h>v9WPm3xpMA4EQU1o`iA~BRLt{tz9H?oey<*N(ecH6(?B~MO*OSy0XYvN4- zY&BTdCE*@|eBwt7b<{tEReB9eT^}N&hc9IxV5L_}hs4Uv`1?xGco08J(+k0cVVnWs z+qlU?FWh2HLO#ND0#4BPv3{~xnSj&e5xy4Sv@|V2Utpk_o8Fk~_u;mJ{=mVQRX;rR z2J1MSW-p_Tnyqt)Y2fpWI)+)wT)S-8F3W979T9G6mvM_E9+OEG8FdUIZMuOYBaMEx z#pbB#gcT|FdV4)uWLe*thftk>&@@3PTEh3e;p@TXR;E%D#&rs#2?h`UkgJfcxQ}I> z(zwYNr>ulGgt6)t=al~h`;fBXL*XJ)PD)WKpHjzB3L_bM7i}Jo5*)&F#9t;4yS|(B z0x{#l94!4>=4<@#?MvakNHN7lR{Bva3DTG1JIN1x&;O9#kZ}ED2~ipQgna@zccz`G z0@(L}6)(v)$u>BguwAm93MShp+hf^W$0TAu*)`b}boXR;I!<`0P|WRRy?%BfuRT z0jxin0U7a=v9s(fxOZU^+J5q)Ew0E>%ehg zyFPh6d~yT!hWHploxCx5Bi_1j-jcipdb?r z*f0(>rS@KqPCMT7;7p8kb zx@75+%Lkfn1ensAZiMKDrW=N-YnZN@ZWyK|2KX47S+KP&?CbzvUk015h7H%@%Ny{; zE%1x6s}bQoh@(G;xsQMHm+p`Hc4vAtVsb7hnPVNzQ5Tj{_c7ifol8>Qm0y`PT_{|Z z?HNEfiZX+#;!3!rlC%byd2sx0;aHihX_dSqDPaP2O}*2>Js-q zTZWySt!3(F@><4UcuOB4B~J9e=%1sE|0VxR%KBgSzYKbzf1wKc7x~{(8u!kxRzCk{ z{?C-fq$Ae52XX@WDj28`z)JH##Xx0X+W>BA40H{kwh8nI^uThn34uo-Gchm`Z)XH% zV#|KD6lQu;=cmqBzEr=|AZ1fGq)_LiUQWTq)cn+|zy+z-z*(Gn8}!oDQb?{(eT}a+ zrZ!_$dBwa+%H|d16)1mR^}OmTkXM*j2)agI4bV07YJxr~?2 zJwvE7A)M!*r{WB!#@SBu5w<1%cW__kQvcso%)iRN3L*D|*}umBIph!dq0a_j9ni%> zjR0n`1GNIRu<5FH;1uAgfm4C?1NBuX&>+wN*eGx|(8W&Y0Or{O-2&Z!mj}A5L?))5 z3_JyyIf0j8^DBY*%I5CL-GlhTaJmYo0;vEnl8OM6sicag@>BW1iYd(eq^hPc&y%W? zs-r@wx+%<N-oav;IPV?cng{g($EJ|Uf0;#naoF%CxkbF1w zF3_diveYur%TvpND^e?fAEhw5l3JBo1wXGztpTn}tpn~z?Zh#XyHdM>hf;@-epvJg zw0Y3X@`8C`U@Q-#TY2U3$|+x7DlerXc@^?1fUd+mQ8}-&isx0$tBN^BqwN4kE7Tq)@nW-g907w0e+mt#8RG8b23+Ehj^o~WuY|5juEEnxnw&HQ@` z^KV1OOC!X~YwAqq+_M?}bC7d4t7gozt&nF=hPGs|pGDe@TGUd4Qck^pEa6-Mh0?4| zThw5pr9`1Cp=Go`*dL$`?XtU2XYIDTp#l76e?wb*&>jTmkUfNY`%n9)^7+C(>}|lQ z&={-n<@$2ju8DmHJCMZv`sninPz#s*xf-RoRX`o$#>u61(r~pt{o$kye#8#h4Z<$~WIbBXamOe0U90fN*uJjDW z9zWlUD?L}FJc9F#hfPLF8 zL4Eai`vK~x5A7Bev0JhGsjA&(w_|^U!44#pQp}?+gI^P{`5*ovHDsn!o-OHL@Sn@; zE?0k_NpDFrHzO)@qw)@tOv~@_T_$zK8NL%88+l6dNU_tj72nC9&`0}ob8qtA`J-4) za<|tux=f!!@)&j&yC-47w^9;0_v*DXQwBwcq^?JoC0BFa&-D}}40uY)9CPju$hp#% zNR8}AS_MH#8cGVw6Q+@z2|WW`sgpxM$sbX0+{{R!@>=Xb1 diff --git a/dependencies/mpdf/mpdf/ttfonts/FreeSerifBold.ttf b/dependencies/mpdf/mpdf/ttfonts/FreeSerifBold.ttf deleted file mode 100644 index 49112d3a92c96f744c4107a278584bfbbb15f215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1310828 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�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

      nOcD| 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 `%Y2y6j{Jo2b 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�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 #SO#zU@B(^`byB=*C=d)*}>=l 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 $`hfMN$Cenp-=UPH)(; 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%0D%yG+Um6@(fBnX;%(m6X&5q_Znd1K^Oi z0eQ|EbX~;AgD52pvYJZ*e{uuheURV`^Kg+7mjse>TqeSX8|I$5Qq0c%L9~doSIs?h zsW=>(JA+}Z(P7c^8O=R{!f62Xb4|3x^Ff1}PaO_*M4gqCwdbqg(XKxqhsdO+R3yry zM(^_>Gw=I`x$j*m_T7Nz4_`X>%tq14A1(ra_K#w>_y}f08*no@C?)~&P}V+bh}U6c z+Ur>n6u5*!4ZxZSfPn>4B|qK(c?M{MiiL+@lseEfKMXx(p)o=JuPD(3;sSEK38EOO zGnTT&k8+uSTs3oip6DWmFM$zp@rPYB_;bTk<}ak zh5)>o1QrGlCPMcssLMj%tdR@mH~KUrhfB!W-BfI@)P-$!SR<$!+tZ2O30^)~GMD_o z+AKynC5O0)Y>frpN<@T_GEdB=l)&$vXo^_c3PWT`E6q?6n;u9=@M!;UD2$*XZtDcW zB}zRb=QV=HvQT*jReTiw7h~`j)FbH*NB(-`Qd>t?D25${Ek|i(UDg!Vnw0llcFq54 zkgA`FIz5pH($v_`cTZ}pZ9Z3ftZhlcp9nTI>pYDvN8^e$SUUg60*E0twFh7tgnmKc)Q2}%JV#L67@QJeR zDTMgc*xzGh^(rcoMV2fo5N3wh6b8R`)8C#R`h4x8m_%rB5r}XqfQBg%9n56fEPSt;UNG-S?&kr|1N#6EEtScLtEavO+;s{Pj{!~xWRu@xf2+sqBY%yeOc#fkVyjeQuauxxMM=%N{oZ?z zv%i1z`0;0sAHTn<_{j0&;#WR){P@=%eDHXcJ^FzUeEs-wz$}1&tvUB+;UD0iTI6N` zfrP5w&vOo7);F9k+A_3tfO#O^vvxFVk{aYVEpq8W`zVy)_OAQJe5qUx zZR9x-!U42VLKb3KL9rSC*02E}&K#ozw~=D$_Bv9a$J90c`^)3(gwsXq$)H=7epFw@ofPl0&0VF)0S~ zJQ~I0AK1PJuT%OR%I>uZD{tAr3|h8DG+h3E(ayXr5tqp@bIr^i8Y`w2uLixsh{i=R zHsn7NbOA_Qv;wA)0!Zt8L60?$jML!hii3|q?TxZcg_0U2sw;q^ZVJlMwv(I%AQc=# zu!Ld~64^+~hLfnKsSH}BmDieMk(rF=-hE2jUPZ z2!0L8?Uvtouzkr5%oS?4CsflC$fY4SvyGux)k07SdcsG(QDQr7(#q@1vF4df(|voD zwiQPWX!+(%!+Y9I)N)<4_d=$2Pxe?>q4BG_ty>0%Htp{~_(WUkR{MNY>+ZmdcGSVA^>F~^(bzp-H+yAU4qB3 z(+-L0$?_^|1jkN?lZ~ytYQVE&W&f4C;$`!2-f0ze&h}7YY<$;HMREuU-tFusm93>baFbEyZ55gwNRdVnLm@&B?4mI3l>z-^%M7=9MxWXIlo@fm= z_N-gi*S~Itwe)rdo1(oviGbZ6Xw7#H#T>DznagHouD~P^$)?NB!WQU9cI|ed+)R5z zK#l=~OiQTRw`P_XRsU&6Yx@*A!p!8Fc50 zbu;2AV_0V~8H2{jp=d5@GP+WUmTsHR(mFCUS)HzTi|+{u>5zB_@~s8=!Q8!!=aSq? z)?gWK;}5BonLuM;ckxpHRC|v`v1KY4nBH=JWZk9W9sZu~=2g2d2fA^u)1?p-!-E4O zi4OO`;mwy}$mtn~*}WS1H6d6}%N|e;jG)x02Y0t(&JQ;N-Ha8(DT0@U(h1`TQotZn z^E7$Tqh|61x*Mi!-X7yTAFY#TbpG?xD-JHtjVA(`NG59lHo%ram&0S-T3CMmifOjj zy1RGT`5nuqRyjh_h`7w#x}s}n|MI@wR%#pN=l)qdjrrJv{Eq!>Kq&8^k(DLr^2`oe zlQWxuwJ6N&1x(rymU+pH^&HAjH6T5l%!IyM&J#w2kSCZnDzjA%&`Sg_;BXaJZC5*= zD<8;aghp6K*-HFE0QOo@FqL*eMq9(@MtRLHqRE;Sc;=EdyD)oT0!w4|K=xZAAFYu? zk!-SO%w{TWz^}KOxt|OW6xfSO&6YD|PcuEi1AkfR08TXmJYrU#%kRZ}E3H9I!IN#~ zp^h<*_|R{zq69HUGo;mQKsB!kylSyT+grOXAxRq;*7` z(^$(lm}gz~^-Z2eqwV6p+(f0@5Z6QhTbea1v?GD6x+icND!sB)te6gr^ zXoDlP%cxWt~&o>noF>2 z2vv<(I3^%B3HYvG#(wKJl}2&7HnB!YDj6Of$FO5wlsZ;oImM`! z$VqEc#MwqMBvc|KP5TC=g!IGOfSjC?fQkskWf*6x0tfig2q0E{z-jI&8Z1w$1#_@# zkcX55;TdW$IPJWff`U#cRDp)9X7Y?jIQTmPwy+baDD49>M{Noq_=yKa0s5B)SV@^9 zaY%8J?t%{wP963}b@|Zbpf=%fh(TX-3iW6#;*NoaRI)i1&{|Q@R@;y(nEP9z6Lx2# z))sLE)q1PZGPlNwT(0(IEalsMwZzqqRFkM@V<=b5`POS}FL;9$NEAG0qoU!J-HQzRG(RG& zgQD?tN$EVpArAl#2jcPEY$qaM`NpcQm1PEa$F_#ymIDV`h8wme*6!J}wp09y&e4A4 zGmjr>cj!E}mdE$*`E;v`<`VJD*VrCB+f2{a5l_;~&lXZhPo>;hM)8?=whGU-66X{s zA4Em#Fi$WdG$JZBm1D!|YS_}cX3w5A?VB2QUVM@Ggs#cn`sqD;A8&EEb-^#*aN`%` zXX3#g$oN|Lxj5b*D*}H|bGo9CEh1zlRB$7W8uAC8lO@?3kh!_8&mInEW)9yW&ZfSz z?XlTMo~-B2E!>aLA^80oPLt+jfU-dMlgQ}Al(qX2yNGahaQKcp4$s8I*%RfbKl0hf zcYKJ`1g#|fMTy!dvW-;2zKi@>$Wyo_>fUiEIzmv`^ZVbBhO6M&t-`62n1F%{-1(<| ze;b{Ld9MNX3)JXQmK5>7NeJ&}qLOr4Mn?)df@;hAC|M)Ydk!8raBx48p+8amB-{Mv zw!~yh8*hljks(C~&lX3NcuABEX}FPxNfE2`-UA2DKmYvtjo6lXy8ndt3)(Ek9&`e# zJARIzg(PcMvNFe?|NIPc$hWY~)lXJGLGuHRnEwq~+7|sLiw9+`ui^*K)P91;)P8ei z{W*#^|Aw9tk#76r-o1a^i{{}W)HwM$^S_ba{2OMaE-@?pX8uP+9{Sz6*Mx6i{;Cm6 zSIedcwkZZm6J@QV{G=Ya=`n4~v5e8d^sLF)A$MAD*1Fq4AEQyF zcY{8efVx4}-($$xc{sC4DrAlF9t$MO+NvN2KLFD!@_HN^Ot^ zzz>1z$3YdS@v|;3k2EdX&9j0kL9sZ+HcKf$f#)#F(mszoWuPtqAZVeNvV<+C1#($V z-qX-eY%Xo$ATkGQf*V9UcF)~EAl#tSTXiv;Ke}}2QpPTi0*mh@(n*uIJ z5LiO*r-GdKegC^!kJ#wWwiMPRH|#O$zm z=+Ywln_)$=$yjc%)U4n>=VBkH6_Dgvaf)wU^*{j`YShU$o^p`ebAmp|*rU!M6mUJP z|1g!d%Y?(;gw26ebSl7FNRrcrZg0QtY;yM4+!@4I7vMv=k;+LEl&N&2!V{N_ zSQpk9qhKQ7<(eZBAcJemj9v19N^OxbRK&UJs+GS#ZEotqy08A4Jx243`ZD(=yC*FYbIq2Hw=PO6K7OpuLjs3Z1%(M3mUCea&CiNf zR6=(LcaHD8anICr+K_HdCUQ=vx_>ftRBdf<>xg9s+Z~~W=`i5h3l}G%PvdG2j zL4dbGa1&(_MFNarSavWgDBO_zPcr{1#z?zr(fRRWGYy>);=VL>{;55VNR3@Fh8F@u5rb#R#&eGA!XP5?RRgA`uxrH*>n8+ zb1yb@nZqMXzSsD4ENWnnUA#Ql(#(B0^}W{)n^2E%w@~&H$LNy#l}HiNH?LC^I9+Mu zT(}lehpI*;8zz7Zaz3kRw821vjuNCV4EGxO2pV!8Uvl$l!;2M32n!;tUXA$)o!Q|H zCn(RNlyBs72fo}ciu@AH?tl*GF)N6}%FCx7dV&*+=Z95RtGLkuX7u@a!5&WmdNT6E>B1=-k)90tGE(tX>=stwdBe=-RADiZ{3=@^k2@OUb1$nf7_K# zld?(e2t=DY`e-eY?@*q13WQrEfvf{9l55r}nSxy$Tc68WKxF`>^0N6Q&tW(yOoF_j zfPStt$odEJeM$nri)WR(4lYrN<`UtXfHWygC`Ch~U7$@L`D{pH4NHsZ0Lqvnu&|Q+ z2xw!Q!)8ZtDul>vj%wYR_}15HQezg5C+Pym&&fE`SjuqrJwMZjbiwQs%o%waLR?%1v%x=GptuW$H18gin*L2dIUiajVcxd zJv6#A6`z$K`Y1^pa|YR9-7*Ebc?N+ao6u9)LPz#q5;ReOnEFkV$U*9b25xhJ zi9e|@sC>a#hPE*%jwLm;4xvP`F{DvivCSC}E8Wsgv8dowJhH(a0(%07t}h}dqCAOx z#TU)EHxo+q$NC3)^*={dic2R_*_K2n8<-hhvhl9BB^-OIV_{$86kF%5gcSIF5w#i!R&^bf2aT{E+^e>LmgoX8fkArzQY zv2cHf_iYD6jKwm86DtZ60nf&PsnIUITDLbHZ%ei@1|hEFp|>BE#XL|8(ZLOLy2s>5 z-clSR6Qq$rwX%vzZv(&+yjmrdPOjy_F|bt_hO(X)jnSi03?s}xC$H^8BhqXtDPWhT zzzCVnnoLXiV z0_3@-7yx-OlCx&badmbvH+{?8ZdzG*?zuwY{`=K$OFZVwTyaH)bydInt6#B?zZ0nz z@d7U}Obfyjax8nP8KVb&^5)NQ2(MK!brepagkhv?y@ zkh1aw&YB37u?Vp6CQhzWgCUbCH@WGTO{7Ucy%#|xt4vH3E}^*{lxfyW%o0rFqzMIs zQ^X1c#F{{futL#`wPb0cqAo!rI7AeXAEYOsRs>3}EK)4vNb^`M(!807?4I+wS|cfS z$6vn{7#>--WvnnRb+FFp+fwwScO(mKai-1O(!P0Oa_>k%A5DtkccARTKHMyH!h1d` z6y=Hpr4^v;Qle}clnu1y)1YiXai-#q@tA(1iHI?`)pZBRH)Q|MbV~v zSa7m$a^0XK-WITZxTQPa8cU`8Z%b~rZN-7K?NB4qT^cojuTtz-W6+MS8yVZC3uZQM z8AxWA_NQ}0Z0sFIVDUaD@B65cL3x*N-uD3{Mf<)$Q}?agJK{DgN*-}kuOcO4$|6ea zEjzj@1fmIA_?MhYs9^wQu5IpGtoVwuw!0HL8LyWU;<)2bH6ri4$Nzy9)@`k zf?ujj28hIi(U*#7(9Sf0SsI7BHmt`KF^PfZXlrNxQohy$ByuZYsVln8Cv{>+wtJYS zuGLa9AmWU~0=^@W_+3v)iE~{=o|kHV%y*`Do}!|C<@)tEuiLV0y1#Gv?XhGs8cQeJ zTDrPdcco)*OL+F9m44r*{^`kq&A!lz+}M~u6_2Glqlx5?yINcF-L35zcH|w$WPvaE zk$K-Oj0;Z-1g9n0l_#U1ESDi4PK=XD2Dbc~`a{8}iwEMJmR9$SkwyvX7V7@ddy~yrxQ%9P5B+I{*d~w^`T+ zUHDYTJ2sV4_!N@|itIry1dg2q#7#?%0-}Uc01N0z6%sLG?I{wed59EZu_?9yfd-;P z_*hx&kx^N{0PlH6p_%=swK?Ilw#G;9@+On+nPltQ>bG0^*R^-w|F#2hL>ubb)_-%M z>u=+GQa1LbukXF^nI8n9gY0Qx@dw{&5M-P8pTV05%O7>q@rf(O8vy z6t&g{Fe;RdR~hYkZk4kDfB_~>7^1N2zD*ab3$BI$VJ7grIto(4-W!rVF4V0xn*8uU z%X!NuwzEwvG2Yfzm~=!%*1yOk^}40CC9|w;bkl|reM5srm(1nb5`*DxPbw){M&8>0 zKA}?Ue~+9;kxEtIeIWY@YKZyeqeXT&=zy>hcgv0g5Cdu;+=R%OqP#}XgF+q2tc=`7 zVmBZQc^Kep(985gjZ)GF)5w}Cx=HVVvDhAK;WM{nX~$U;h|~h>LRnANO>#JvB@JME zU^KRrn=GD1#uwS*00u`O?Lx8orzEUAP zA?N{pp}~%1s5=PQK*@HB7NogkkQJiZDj`dVjbg}Er080$VtjOeq6dk0f()`9W;t5hbBa*vx|)TgN*GNjmLt`sjW38 zevjGNs8UYaFA3!PB7s~kIJ$N1a92_jXIJ&6J8}cbR(5lpd4E*vG23ky+cJkHSL{#Q zb}t{@+_GupO?G?7ynh)n@5Do8|1#&{&J+~^gnyYbSpV7cs&f~aa&&^aT z_BHM_Pp-o1<5gLXfB(?P&i~x^t}hT;v+&y46=!s z=#MZ(MB#E@0&x5Nrz?m_`jgzaPA(hR>%d)K z2hF6rB1N5aQkwQ487Z^E{HmxE?4K?0#266hM#%}hresYoU^h0Wl2{0xwN>yl?Uc)> zp0pncEquPga*Pb6A}q&wJo>bB!!VR^lN@`LjHAeIn zhW0=+F~I=1#7TwTV)xZ}KR6#}`->%O=ez&};BJ!kupP2rPK=`2)Y4RIp@Zow74<;hrsK)xczg~azhO4Wz#waeTSK20CgQ}T+fkqk0 z8CctlvQAN87Ks;R!6KcOWi>2MA~xi5)J#A~YmRsH$Tj`4dDUdZ#} zze3(a))9Fm5MWqr$W}y|Um)m4WMmc+xfxVXb$CmN3|B;Iy8Z%qg6csXlI#eY`TLS3M7raMW3Qj6UY ziJ<(3=!Nn$S-%ilNE079`sb0By?icKH zOUvJTw!Gxc_sj!9Eh@#Y-NY_h$F6yNddKxYx;RsPjDp!|+&?K@CN=^SAuW*ph*-?) z(R^l_1%MeqS@dL?G9bL2CIOYhC^k?W7)(kq8z~Xqg}^VBvK!4{hX&ie^3&pr)mz#I ztH;?zjjJ~)W=4I+f8DZ%J5;q1uG%4os(2;(_vAd2zhDxyx5?Fd%SR{t7u<|jMlKHnr=D`r4L56$(GK$*nIC-RsE0K<`31fFXq<;`KlI z$=p$P!8c#}@i*&ZaFcYsn8xqrwSq|n-uOS=;s)H}CU*D7Ui#5Th?fW-lz;+=-)kW? zT7*>sLSM^Dje+n*jhr5E6zG5@#VEzda+*xb6e?{t(KyW8UwG~3k_Kg+;X@WmMnGQj zmSc%f%TaDPQvU;Nfby5Wto~#F}5RB4LKvIu6z)!MRjEe z1B=q~$_`!!8Q2GRkFBK8Id-eeT>B(e~Eou++BV3 z4JLf!8M#j0qVMK4%)p{pGO_B*(uTQa@!i#}Yf*uP{q4EuwDmcrkS+m+oCKbrVF+bi zb++^^u~>bq`WV}QbsHAeNjHk;VfG}1T4FwLyF6boh#Bm+d|D`w{x2_AY!zVK2A0Fh ziskwdmAJBdZ5s*{@2q~T`b@9uV)49n18m)^XV$5`A66QrS2%x|;m@%_I!2xzM z@f(*`i-!e@F(lrFb%?ehc}#~8IF;&5S*4`SLxol@vg$5Ep}-Q)I+S(=rc@}x-m801 zI9EM;pRRg^Xxje!a6|hqYq@bkn-msr$KGf}J$u?6<+@>I)w~;t9k7zi7I0V z@72qzS1&u1P*0^%J^?TvGm(o|84@7})OJ^FaG|^%`-a`h9=wrhs{egs^}Xy07rp#l zyuJGU>I)CC$n78f^GBJR>vfCTx9R_X`$!%s&NmL&kHDJvU$pH0o2g|tSMOw(U0l6` zT}~}~uKHrVW!xW6Yh<4^EKYISbrI$~MM;q)IZv?pROgZ&CiRkt#OtEY3@Z%?LKJb@ zmAOzZkLqh7{1+7;dbB!N{dk4lG}>3a;RJiQkG)TvdgAggZoA=gxn=)0^+{Sk_2;gt zKNmB%mbM9t6F@9DzphpBDH$NKqYf>s`aMMjLY#TNcQhV~C zC)U2{P{<-RzA@drxzPjbLS5{SjBGZD}b!)v{BEo0p(LA`wigqF68cFrE z$pFa%URQ`=gj_@?YVBe=v`c|@aTpKEk0)YDeA-5_Li5>No<+$k*TI_ z8J9|0%B*O_<6sz6;82M}nkY;~<|3jEw!A#5^idh2kUcNPym)#_pc(OdjNkR3KDR`382`Q0{ zr%OQ~vIb?$R*mHhPkxLdPW+@!uX20L+<;?6sAC1;-3}i^w@ODk`WF5>|zr zHskvGP?{08!5KRs3t_56*(*+Ov2X6x(a}-%EVKUo=~Hw6 zJ(?HAm0KP`((AxvGR6R3rY{){Y(AjO40QTRzX9NO7cSRW6Ee{yy8p_^}J zd#m3)(0L$qAafwJKXV{>AbsFVdpq}q_GkA6_ow#<_jm4RyA!EwVsfv+vT;?oD;xgw z=f3FrVC`S|f!aT=`v}eA&&2m3tcPkwB6r7*Nir{)6Dx-0hD_9IOjpfCzA3Lb zsC!wXe3?D`^4_H{HC;*b193LO52Qi%3dY5QQRx*BUrl2H@sl&HH3slHzQ zOky?L&|N*BtsCyIJ{DxJIN}bMx}ibuTp4zTgWhl`9QsFkwC$TK(%5$iv0^d31mGS* zUx7NFCwq;PkSC)Kr!p1=wjtn)*>7Ffd(x4_l4T8DVpFR$_j#t=xVk!b8M~o+R(diHM*9)ZN?yb=ip#|PSu1rzM5`)_@ZIv8flXU<=Kp`-IdgR8>2z(qq3k7OR7 z+KikNqRsySZN3itWh-cd7-HY)k_*}q;)Fq%sFG#^_(nX6F&g3z#8}BgMIHmj%FKLWC1Z#-^m30S;V zjoQ6zw10)OsnPEBxB6pC;}eP-e{kSnqO-R*9o={E1$Lfj)H|Hsh}G9(@K`NNhb;zE ze}2edO?VxxUZnFd1uE0`q&j;%p^)6KX5ljEh{Mo0hPaezk>zc{LXZZoTCZw#*Lj$F zNsH2%NUtvIDKQ67Q$VJaE5nC*)1lwT2Nmd=M7gxY4r>dx8}Xk*yZUp(u}rr`Yj-)l zW@jdz7)bXWnH-u@-LhixsA|$1X6r(osnAeYz^+upk{y9yDiuME_qCb)odIp|z1^8r z{#Hcv%VTmJI=>%r#@l$?5nBw4by*eV8Ukg1MR_1t6wcma)HJJ(CIRGF;60?!ZHggA z*dh`e$~rR`Ia1=xWt$7BF9^A@lszFgj(~APX$)gTj;PP&xZ2}8 z6mD`p-PEpkn}U6Ay~Ut%?)7N(-mT6?ug10{XmT0j29v{j#O-x^_XTQwUx{^kKB}WY zPs$;IpEJ{P&P9FCA>6g>;+0EWCR(b4snQVj)s@3i)$$y%{G0oM6ll34zj9k9Px-RJsos<^b-gRi{BqGn^4Cta!)+sFs;{l9cJ%%r-$?5J+NV| z7RbLG!0N}2Tyi4x(ww5Q!wh>xDMURo6R?wv|Hrb#Y!L29x!z<~fK?GYSdRP?bXLp_ zu6*LLje`RlwoG04)k5G<*W4|v8d+97EMD8SKU}a*y2RBtUvc4kHfUej=<%0bD4Lzq!05I~1Rh~{K9>4VfchIbN=PP%+ZzUd$_(?cfnl5QA$ z1euB^^T}jqVPH@Wu!+Ka`=ns?1QXdl9$M38o^5GQQPK{!j0L$E2w+GR4@xSl_yrXVRotWv04u22FeO`^A7ahb z8^@4etn`!7WiXUV7D?pC2l83b_)$>MnD@=zxJRLz6H~04^@ITv`sD7S}CD<5$ zcH6mcNvot|nB8H%_giV9A%p{1Qc6ru9=~CwkVFe6nAI=YO-S8GoC<{yh3tpJgME?z z)*vL(>Fg}D=_Qx6Ik5W3zpSjj_-~fj*nxX??Z5wmiDnB*O@b~1p!bj{nvi)WUMB*y z1~$~%Ijl4l&>{8YX`rle9^k9aly#)%h!p7ukP0X^@)RhlWapF|xK6gzQUiHj6>2Rd z%D@tXPcXzH1PZMNN@Ivg=022f4q3&axvD5ufARP)Kbxt3{{b9!0}<>PyUAQFQ5&0i zjLBDMOqp4@#H6yW;%%>wwb8B7_rKL zty413GG&8Id?Oh?pzT=@Nh2vlJrGa0!l%Jlptun;qX-Pojfc68+$ldlae|#VaZY&g z#X{l57oWQ6ru8RIREuo&iMb#C&{rMyyzs&xyKWHu$e_*NVSh(IoZ_F^*?K>uCAEGy zh231|YlO~^4(Lgxqe@}UT5nLO9=RY3*$&hjnaC8z0qivD4P>=iZ;X5@IVf<8`k^*) zCOh8)T3Te8|EFG{2T#4VAA{9ngK|G)ekZCKjjMg~f6fhltK+4@{gG^gs+PO+We09!MsEs>42lQ$ZzbOUzoW)#_ z`mqL6<_FpHv|S7Am@-rq73S=sTMiVcN4)Yt7lM1G zYmFHW+hu^;rL1xw?+^^cfxrg@FwqArxH`B!qF2-yb6A^^fyg7Qp@DRNBssXMr!d`@ zI#m7R;cM~)fgNkfvj;RQI}59)3+WZw>POI{U&r%6v(6U;{FBgj0W|(4R$l}7K5E5+ zp5&G|G)*!5WVU%W4&VvDB4V>eyWrSmVuDBd3AhS0@J` z6QWoR9Bo+6!fYhZgO>wGx*-2U&;T%77N8MGGyyb3Bu8~s30Fo<;0f^a5kLalv1#oE z>-TI;(A(~9HeKJq)J&mQtMBihTvzB7m(1+hM%QX@n{ZCI=sWece-&+SLfmb=?J#ko z?dDqB+j!fX7PlSYI&#}R5gJGnwH@fVW_ae20r-}-1LrA+cmuTfZ94GTdItjO12g^W zdVFq`^gs0@5_TrEO?HP$T6@7icL#Hs^8C;r%;jeBS7PoI^)ZZ>Cq)r6Vt)58NmxfX z1@Q*y8x3mmPor=$pB6Rew4BLOR&q&*_Iuhh1h6xCh1FcvQF933$jD4Vgq3(h^$7d+ zT=m|2MX|u%Up-Rz!{BMOiS}Rc0kkP5{)O+!qOj@QUU6u+$hV4Kf@X#8w&7t03i*R zCot`5AT>;~sx_zrQZC!8XJNhiL3N}$VuWq;S6x@O)50KpwsvQ;$4+3Zyj4pWyE$ zx-0|-Q-oP9SrZag$pCIcCi%`ZLB?nR)eoVK|EY1HHvjbQAp1J|X87*Hfx_@$VgDoS z*H`)37pmjItEx?6a?{*3;uHP-b1TGKcg+15%O35mwGDksN@qlgw>Nn1Pl|}N5%xHE zHC(Au0Q(}?wuPovm_)vcT1IO_IWn3|a$gAkuB1j?gOV0eoUm)mYAi0f5`_eqnTl3# z@X$vrEwYJ22LZS(Fm8D+iUN*ah$@uR15PRZg1z+M^rMGv4L$pv;GL6KJg~eXoMY@< z<;veAM_W(rc7(ps^in8DsM1;l^qxD2CfL!os zB?)9G84;TW#vp@83_J-UtA&ul$5_g_s-y2pR}xbA{017G`E;K~c=1JiCjs>NmP zv8}(_dSk;YuQc4WrEuxP4_|tB=)2E`?#9ulUun2;D=uN21))oN73;KtVmlc8ZlnXu z2Qg7>i2^N)!bLJtjX&y6#u<{csDcgW7$t4zkj#oWCvH+dwfzuy-PvkU{<> zp|9`bVFm2PydV7D=tnpDLF-vu z^gJtBOVAS&o`@&$4%tu$h&t3rLb?_J<`~Etwd4*(@!Wj;EAnH-{qp-__@ z$8QhJo%L=1&Wh#BSKx7r#zhaUqBbsN#uZeCXMIZa%=TNT3;@s9WGURfO_cj(rlcT+s?xim0M88g-Th{Cy8N`L225t8e zmuIZo)II9*EiW{fawGmdR|3Qkt2WoQv-WS#?qsr%>pE}e&hzMR&z@xJZZbGa!fId! z&Olz5vC;cw+_jR>kmZ#`XxBz1Vv@wcvS2ME2R40zm5g>Fp!(xeO{7thu7f}NkF_VN zXA|RzMzK6MUH_x`G9rALtzzFZsf=6s{P7Fd3qKG;rX=h)bFBj=qxHzSzX-o?9l#pe zdu}E0!%u+ABv3)9Y$I96I*(}RsUaGIc6F$ABa1n{sJU=Q&IEF3$$CT5IF+)NN-gu8|}c3sC%uMe>65jaD; zBFv*uc-XQ@d$QemlIgrXs9lgW8IxV*NXBngF`b&7{T84aBwuj+#AsTt&n!7Hj{evB z1YR-1e#ZWMig-omxmA#L9>r>jAnuz>{jSC46f!u3c;~qEAF9P|VMip;Q@eP zH3@7jG~cN*o1CWb{s93Iy-?!GZpY|4)J2Q){Hh%SXOH?X@aw`U}y*Y!L; zIP%fCi}Y<%+m9_YuA`JV4{+L)(0?iy7@p*%Y-G=cdmo*;2@Raq$iI zRJGrvg0F(kYtJc#bG7rA^YbJ8d`%YQwz#80=e*oTG9F|^Q%tz#yL7gVSO@Nt057{k zLTZHZew+}|h98SQ_6+D_2S4FRQDlPCLcFkK${HTMsv-T`$bG30_7D(+OjD|&LL!_J z7AKClXN1C0Vn7{%JfvnJQjzl5HQ{8_t&q1JGsyOS-M617}qDf z!h3261Rhi=(v#7jA*rxIZPP;=GdaP{VV;G#j)FVE%vC&S7~CKS&Lw5aD(;j~k!ps_ zGt3a^KotH-mm7iJNJwwPW|#qan4}AXS8_n;Kzu=2r^oDp#tNQqfeH(h7V@yhlw9@- zLiVyl?1E4o4f$E7TU_=FSV?zj=WafDf%X~J@LkP@^~!JGe%p7%qjL`{pZx8U;&qQ5 zx#$D2o4)Y$(b#QYd*;^5N+rw)E zPzpw}roqkvz2c;(QUh+4vq_7bLIM9S4~R#AB|K0twS4U_v$KDhJ<#{Sft_R3&#{9z z*dZn>uT?6qwM}e4@IW7XZ}tAM9S1l+skc96zF)XVxH+4J6&F3>bEAIklV%0G;@mGf zMmk2G|5C>YxA#7B?&q9;T!&C3{tG_;&PXC?K|X=63nn_Rkmq0RJocFH3hw#y_4}uU zAn>E!_qNYYK|Vb7&)1~c1)5urh^K|yu|v_ba8KzhuBC*K_$T2PL1?9Ne=r_zwx1(1 zsBS$ktLIJUa&aSB-z=iI65ufE0ua?#Qcyq^#iz;H0VO5(6_V9lGQ)1pWRrQJ`hf(y zfZNM2sD1zzgb%O_(6-w1O}E+i{?k0FUyGSFm!r+Gf2obZ{CVq<%b$3g^KoldxaZvO zYgbT%2E6DI_0~8zRwQ8rU=IYduT56~hSZHJveSX)FBW4I8hOZ0W)-|;8O#|7 zj)gQLUNBt!ELm8t62+_FRA>U^UsLtSFd17uJ6zyrKg*g5!?44wt<6O&sHC(W{P0PZ z5_1?;@&^${%~5F!$1S9aS>BqwB*NxJ!R^!=XcZVaYK?{|LmJAZkhIm4)miaXNCXeD z51sv%luwAcx$h*zub%x%X3_Jo&(faZ6V@dGrO2NM^1^H)NOwR!ATJC!J|XHNk^c;0 z>WRTEJdayH@jxbxji3FOaduhttH>GoS|X7UubVq2dT73`g`cZk{8#YirP90Ex5>tA zU5X}9Wwju#^|HJ0MC#kI+D@y0B#2om@>M>ObGQan$m&zE* zQnInAJf%Rk_um=`Mfnf+eDy+(qO6n}@LPUO^!%;Fga%wj$}EZmaWLg11GF#x(_H$xuCAFsde zs|udiA7OWYlW17GFP?R=_$BsNJPY>r`Dguqti1<-WL1?v{O+sV)s=J3p<{Jbb*j#3 z0zEmzkb{CK$$%g%gMqDAT?B#E5kzrCU0ogBm0(0MtP09sl&=1M z=e}3n)g!L{zwcw$saLmNSG{}gx#ynvJHp~O)xW0kOB(J)8akQ|!J$My%*0!i-|U|k zw1GeUN%>(ilb8JF`SNdK4C^LdDsIF6zDe9R55HN1-mv)D`<8wNx*(PyzQ+BU7K-UL zlXqKJBu0XF6Fx-Ag3W8;2wW7};<X|wG3p{diiPMtn^h#eZLJJOjR4nD1w|siN3* z$h}W6c3Z7F#nz~z?|4R zc4#q>tUi)O@Js=0X)&^b9V@Aji4Ko6xjCNOp@*&H3B0z=jWsb1kWHIhZodqKw>S-CZ&NlN z)~zo?O*Aq(2bNFgsZZs=t1quRy!-GK`(9<%^_yS%?7qX7?s~aCm)Re^y!VRBZr`x+ z)$-m;5AS=48P~6U1#`h38k+y6_(kyvXy;O$?JrlM<)(p$zJRW$poP&cd+MzOkm-=~YU`zIcJ zaN@yVuDoXL=gwx|s&&lV`k@W%KWhi?xo6^zJ0@rikskw{`*HDA=-egl>4JN&qT*R@ z9K4Xk#FF?bj!k6#*Ht_@O00ppLYj;Cc=z1zyTyyz#UIRNRYp$N5zy~(@xO4^T#p#g z=Z?{DhUb4QeqHToxBp%HuP&Cs zEqHEK!+F&VYoUbG5fUDpwrCwtRAf=EBb^6Sq)wlxl$b?20gu2p9-GKgNBThh$ota^ zFR))NJw0D|p>{5vpnP6ooI!5!BV4Dyk6j9xivmWH*?jx~Yg)YVJm{q~+Aw}6#_zi* z**HFbP;?{jfbx9qtCbhOXZ}oiT)a=XXl`G__?JW<_T>CrQ5t;-&mdb$cSsZ85Fz)O&aH`;lqH&$JxA`B%ai*}t+bhxsjh z20Q!LfA2H=!aG8ao^9dpaQ-1ai5MHS&u@!&9wS;6=HEoD{VwoEjGZsubxh`sH&`6H zqC+@)L4QNkLK3wUvmm9>3dp!-Ui{mPluRhqJe9=2qZV?3S=j=wik@~9`DV!~p_+!}HWp<$0#jmGmZobT)|sBkI|sqIFF?3~kC$7VCioPVP>HH)lR`x0|w zpOAm_bUfq#-~Q3DZ0(oX^(Xj8`QCnmU5DQbkdK3BCaK|zg~z-iYMUtT1OPEqc6bqY zs#v-I+=>>1Km#RHAV`5iS}28djzY!6Gn7n(@((IP-hiG;9U*#C)YsPcch(lDJeIG_TLR>~MTDOZjkuMTh&*h+kWK98eERe7KhTDPJv&Ij|GNCGm%9iE{BZ!+Ida_`trLAGs6EFNmHIkRO=5f8>176OIppcq4u-3Wt*lndV^L>;y%@OwfJ#|MvX7fXw|p{5WqKU=reqS zRl|DL$Iji`W<>X*xgm{4Olhr}siy3XGg?NMX|!`cRI7HVA!C&Ff{pQU;Z5<+OZ7<&i0U>z@?RH%mJ{oh-tY~ZTGhBn+0;%ZTOs8HQ1e>_>JY~?<_ ztq68WJF)zs4Oq-nN!m(1R~%T~6`SGQ(wVZIqibcgmS@QGbpx~jtp;KNiC7$-e=JOb z`Y|ED9P2cqMrJlfi?IUkpw@vvkBH%JASF>Owi_RW*odf_HjD1Ip?w2ghRnde!8VUd zs}b#{+I1$osMe`fy+?Lt4D``Zt4C$Bo7g2LW*^v>4?1g8&R~Auz=kt`|MiSBT-+me zWrimwoW^Fos@XX)Ih*<2{MzZPx!z^2Viz9M{=DN|o}bRNAIBS#_-yRTtfbdeI zzq#Qvm31DTr@Fn1c`eEnvJW9uSh*udXr3g${;&4qKeOll$&IyS|2*`+?4O6;W&b>M z!v5iFr|ciph6Hj|;EU1P1xgJYs8ZruaS44#%A|ab<|wmWkV+KsB7Xn>!tMVrc>4d2 zcfq2>1GU#wdeuhoz#}Sa?a{?`#%D2MyZBr7EaDNL65=B6KL#$K|L~bd*ed>%eG#8M zAb8n3@A{d=^;z*RqKC_>`gd7epHZ2`&@nonO3>%OChq6weLqFft2(uC0BQ(~YhbJJ z`hPk7Q_1E)T(rSwt0?sFJgT76i(i{NSG=uj?%VC+ZFBb%bP9h?{AY^fiNchDm&pv#m>3!5N#HJQ(E{<&HN`3 zOSlJfMJ}V9OSS;afLdRTO{~?9ApiO@s`X?+es#EZg!Rwe&gY^0J?1g1Qi&x_)B4!; zu36zU@e@ndpy4y|6Z0QkTvtTo>vSj2BYBb+Yew66#b^oM>~T~vpCqgiHgF$ld1J2H z-aE1!^1E1_;l!$T_K&Sxk9tvQGs5^?h4LyW4n=7--XQ5_l6osjQ+N|BP-hln~vm1_(Vzo{FTD9Klg>_w^RuV0^i#FEQTzT{HYD;l&auq(Q z&TtF8nkfuS01>z#Z3OB@x=^0sZ5WaKBdx_ixKLheC5%?6Uea<5xC`awRw@O8$}Npx z0M70a4kU_XBdHeyS`G-9gEGU6=wnDfm6v}CePI1@dZ;{<9o*T$vldQ~B_3g37b*K0 zu_tGnU2Yr{TD1NQWKYjl6^!Z&~uTM|E-qlt6 z)bupliPzk!RqWecU2{+Q^3&q-X@A$;{rNom_4IVjh1U!5dJ|qnyw>vh53E{s0qQ$N zzb~K9e_?tuU;D=Nllj^y)2ux|_p@nszi)c(+`Nz7Fg^FPJZqn>osxfYy7rCy@23TGt2J``KN!73}j2hcW5z^?MBPmcm&KhiFwV6U%^Y zAx9%97VupAZvy1;FN+8TsL(V~-+@qo?$}d9KmN@aeV{2Dc#uFNu{=J3B%c*j8XfPb z_yms!==279NB^O-B98~)xeS1Hal{rLZlv~X?b%D%jrFIjz5I(`)NYn#`R(E_FdvOz z1eb7sE%IR(JsboP3sFPS0604&Eky&=aQi`JNNG~GltzXB*)-xWYLC<&VO!XieC@w$ z|IN}f&p*#@dH(s@?QGK{kJLW*X*MI^BV<;&|{Ib8b%en==nxtCsg=`Q@og1C6; z?z<@u1NQpDz5Gso7rz7FGltJ@{hRN(^e@$9o@2JhMvuW?`!7YhaQym-*5OfctVKC^d!xfUvY)< zB$QL;P)&+yR1{&ofWTtn3#Ghp=m&%fmadmvF@*IJDJ4u^uP{?huDSGLrB9x=`|%@dE|uw0|1Aq52NQhP1Z2VF#Qsr8gJ1z5Pu`U@6cXU1X_kG()N>QI zA1ZCRP3{)0yu4p)<=%5~YGln7m#-NaS#$XnYew>=u|2!TN~N*gd&XGsmW%JWWY0tXoqO)p$!N1VM!pNOHz`kj{=4yYa0S(ByNfx_7;(==NgT-LHNM6PuPW3x#aPy{e%e8`8s zOtCM*sJhCdgS-$2K0W?v{Qq~x$A|ZZLVMSR*Q^P%3om=&GW`Enznb5^y|k^re;ch4 zgWNlV9fh1Q;EhiCE)P3;b>Zr(@>hK_UtoK8-@R+s-MjB1kpns`-p})BQ6AH@Km}66 z>Y21UDr{@!iCusDgbm-{)M+;5(&l8!y!cD`*4ALF-;ZJflH(6Sm;ErEfjDPuDV3`B zJAV2FYd3z7{l{(eOpEszg!kcGk)z`P8B)?Xpt>pXaL3P|Yp0b_mnj~uMm$_c^w%DH z>NkP?$WpqeCXCHxNp zebs@|s6`4MmjbAPM71;^$Ou)zgmcoYGKoA;LMii->P?`RAf+hN!yby8f4M)M?l;GtkDL3_>HWVj$HY4w z`aoax)6>1L^apefdh<%}^rx%zhVxc-{z~x=m}^ORR_V*o0{>DM0=Lz?Jj)hqwOz*k zD^b>%DTFQ6&p)cNW=jwa?%-n1wwI7bhIS$3DoyiGd1JZm<5G(}-29IR z?tViT`PLt@K#UVSoY(lCHY@;lQY8QcUGXO9d%Qtd zbA*Bbhq_EA>gx-F6!|-+r?~VzhzFyONSTO%h&?vC_kZH%JG7i|+7HRE=GfdfMIGo_ zbHvScLVn%UdqbU$H}sks-_daGEfAV$%$|`6Om(RbsM1@yT}lJ^#tQx-N+ zH!tv`G6{%SYf@h$Gw64XG+hMnm6mDsIwf>YBRF%D z`*mp?uXzG@PomYVgggm53Lm6lbWf9-fJY@rVXBA_s2@v3Yo~g^au!aGSjHqfIe3H* z^n*tgjy;m){NGMh53XfQ1-GlQwE}?j>R7L7wjtk^>D)Rxx$cy~f!s;!+-(4p_IP@C z)6l15nXZsOnP&e+7w&8eo9Y=~F?iS7y}M3YxicT%wBO)Mk7f1SCTV2fL^jpmpJ^GT z*HSt&4(%p8|B(1$(9#G*q!M8P+rg$%H}W`B#F;3vuXZ-uQ((kSTxuiyQcIOI1LO>+ zNVc51N3ncTak3yN`qv=Jtr&=87xv);3n&Se0w@Ctg8ZRKsuk3c`tqP+GvzP>J{k3t zmR9OoB_oQ&v!o9=8i}D0uv6?I@CN&0Zwhi*qe9QqaPz};;*1dOT=}lZ{_|RD5O? zcJJ!_Y`MlBEk?tGO?#JJy7dE|-KU86o;G#Zx6e9}>RI0W`!=87>nZGLTREP}gigQZ zy{#V4U0+$!kKYjwgje+0BQKQ=-; zw9hUjC=6q<0oc3jvR6~Bo!vZ+lDCz!AQkmqoz3@+EvLWp+N1&e85%6jh7(z8&#{y- z8+R;lveHOppzZGATb|yz0sO51+XEpgjUKm)Zxv~(fhvK-J`Kl=Jhx5AHDlZc% zSh}!0RxDFDUZcE^AnI|YR&+!tdx45%;}H^n2N>Gw2JzE286B2qHgiZFH*aCCARY9z z0dI%cRj#|%G>8JW*0{MacJjt$lk2`i!k~9|=(!_?R<|`_Z1u%5?6Y<8seA98Pv3Uq zvrpe9Q*NYV&Bd48wx#?pd->MqGLz_Zhsw`oW-EMx!_-}^l?YQHQnVo@4gLB;@^0kdPv)LOr%j{e03S0A|$Jn`-zAvCga_5j1&{tBW7?+txy7w3 zRkc}#vLs-EdX7V9ib&g@-cozIe(JN(Y5gQ+r_#miukOv(c^NW816se#X)OY~F9oUE zFMM7Aq&QS5H3x^Qn2GYlge@IN0F3I@)cwy@l%gOwh3wF{&Um~Uk_nCo9c3%EgW&BP zpS{{8f6&FdS4nnIm-^Esh;n+EU*&cj>0&DhjEud)d@xptF(ohBD3*Kek_#p)Kr8^o zEJ%77_Z6n`(JfJ%q$L^bw^xmJZ-zuL9OD_CCgxZmYOF31GP=g4@bsY=1R#5jv~IoW zD)zCO=CKtWGIhU3G>=cYOSR()eSft)^gWk~Me2-v{CJ%8ol}wzua!G9u{|tWC+trz z8tF(Cw$$IsvU&c`$nUumejXd>yj#v~tOht2S9GB90(vBH=v2ogH;`k|8kEd}91klgqX-EnLN%o&~KfguhkIGFd3sSM3pD?Ga7J<0RkU#YYX0E z7bYD$bp2BoAGnGA;D$4<_ozIEU7 zO^3v5s6M>*ePES_gT1}6SZ_~oa;^3Au#@QA`5#pj`pu;9Q=y`#Q#nz9%59KUZf!i3 zM^ohj#j=KEOMM)ul;m%nqI6RNT&bvd0)q<08uhl+fUGB_hjbh4;7Vs7o$;Lo+|bua zmwgob!oCJFvlN75d;o&MDrJpm42bWGWa*v=!p)T|Kf$v}+#az?Be=l_B)et!vp$ei zvOvegJ_ovv6a@STH6V)Eq@i)rnF44?fi#RZ@SHS0gb#hRu{p+*vWaop0RM{8QHb3V zE+Tk+gF{PSa%-C6{k)b!$LzgfZ0ML}`6(M(Y|-T#PFw%jNY;W8vprmj(MM)4GiXhl zJ6ntzHZ!p8>OS>vytD0cdOCo zNIe!y!2v1jO`j8k;J>`^VRTL-e(RDYC_`JOT-7JPL7c*}fbI)e$e28wMQ0=VN{4tA zzhdPA*@SOVzlZh1c9E4+d!%msuq|3m?cu1kZu#8r(EIy3 zND7*IQ*~j;FHF51Jtl{~I5H~RJp62i9PEPbL^5z(I4W!ERPasOQxWyuC?@VeVvZNG zFjm5ZP#Vgc`%cKswq!vkYw2_-<0L7Mfu2^WghM%|$iV{ISS(mcFqvezn1WoK1W`zr z0w0pn1f0`0yA&D*WU=}??HGPNjriGUYCP#a5V_M z3}-~pnX5-++pPJXm#aOa?Ymd4J88RokYAxlyc;_+ZCy-P7iz5~Qg+tv9bB_>|EA9R zX4HqgW(Gf#%W5Xw(1x~3p z7urw4A>)Pq4#jj2a(O5DzDP!qIwE_2R6NwHNQSPmhA?BxdCf| z!gbPRVLSDM(%Zqb+pUxmUERl*rn-y2%x>Bj0|MhY@^bC7N{4WB0DpG@dIL&puud0a zz>lGLBYk`0#1+j)5l z7^~e|yOLfzJ33nyc;;2`4D}&?RH#IVRig442s@3M*GL{vAthheH667oLXB(yicc+y z+IaPptr=De={jib1jSASGoW`7)MU6`B|kJ3KX(cGk?2@S@cedi6ap!p3_R#I^}fXr zTtrSYL{I^*SyEMi4+6!-25Nc;#@)Wkn{}D5?6vuM_OGBD;ewqb_r)t4ijo@+ zFAHfMa_4|*5E?9Y6Fd>T06=!YNLB~3U7HM~xHVDEG8{4}_>)waGAY77C}VINkY47d zQg3w636g0*>|!ImOp#<6q_J{ms;yTiXaDof!$LH{Li+)8>?18L+^-jcZMur4l}?E* zG^N^YsYewb9_B+nC|PfZ9seqPD<3$<{VZ&n`$vuNw&#S)(feCDz$6cFVyNf=1}SZh zR-9DW7||1bDt??NSX_8f>R<+Nks^_mTc5O7xE_GUUVhpQQpSbJ;;iT(9aV9h08ftU zK$h;21>ujAzEQ+Cn(7PAknbtW{hD&l?zp!ch`C}%rS zVgsr{5KSdVe0gJ$FpWTg$`pu0hdnu&yg1x@yQXlsZIvF4BTL6p* zaKH$h_=Nv)w&(To`wHc=t<@d!Um*4LY^!uGh<^?=)XVVdg21Zuj!cp6AA?i6vUSe^ zx;}dcmg7uCf=R`bA+^r6N&VaK(Fir?TvaNcZJQk!+OZ1@Bzs!N_nqizZ4_sX)@kFo zY{ik6tEanX;S>)83&IRMY1y%T;%DSt1h+fQn)*rYR1R7;rd-qqYLC+S+>>P4Zn{YH z#@tP6wb7mEVR;%TCIRP57x6;O1smj%{qeY{GkIe9hBNzt`ccbv)vsy`V}GP`+MkM> znxk~(?(A8=Jm0r&bAP9s-usgAW@DJHtjX4?;m%WIp2Fn%?w&A(dARTVH{z$kUoDWq zeZuFI3PwY*YUF~r5+Q*SmW6VxP_=g%BjBt&I1ep35T^6C@_|0+>=;O4Gxn3JE_Go0 zb@1Xb$=_NiNLnm-G7r(C<%#xMpuCo&g^Gpe%37#2g7YMIqY02j(B~x!dCly=Ym&MN zH$VkkJ3(sgA^{~MvMX_j1%bP;e$c`e0zIUl%aRz$##rTaLj3f-d-bqt5DsfHo_*to z&(Lf58;$O)dulh%tXa0}!1mRfH?dV`T_GCkLf9Z)c+MH;vBmf7?6uo=96WgX{;hjR z|3O{L4Cv^9-|U4f^@zAjyt# za-K>ttUOFEfY?)m^>(X}$1&YsD8pHWGqpSds|}6>RH8t40cwIot383&_B8f&m}&~f z42EXEswJ808N|%X7CL#*Ymw|Wcne!>6-yfEr6tJ^jHy`^m{MJy)H8@To?wWo4#{E& z6O|VAa<_&KE*(V+oU&ft-6#7EXpc9BTpFc=IQ7A+ufOJoYcBs#?VaL)d9Zz~GrQ8= z-r68>SULlbp)PB^Dd ziBqRE4Dta-0a`?LLN;P2{z1HYcBMlP8@Ua8LylZi*!u6ptXE@I^b?@BmMURZ+A5u+ z%ZT0E;LVX-h$kYF1Fck$x|cyBwB<+fA#@b(*Eu1k{cbUC?yZzHdNjnTyLuYW$9D^Q z*M1vIknPzLul<}BkF8y@SYI>sURRft*U@S%zN2B+>Mk-di|gGK1?QjD8kUdC&p)Y5 zT<+w6VpYjt{VFEXYQjZDpRL$KQL5CUQ6AIPwq{IVdFV4-1ME0a19UoNqlhbdt);S4 zcI~uM>>DxyRuJrdbZqq}k{plTY~wxP8ZB|OBP7T%sy=e`+7}KLomSK(RLW^nSN1fI zXv}(1AGv&Rn?3M+z^yhsxzloUYYE)lpzS#r6RqK0wQFx;)`5Uq3$J1_cR}sGUF?ch z;%y$o0z==yX^|2rV|!Mp#E73U(~6B~f^6!%DP{xrA_+SW?oAiaC6^Dh6eTCgVt5Xd z4Fs9BsO;#DiSvec8NiDY>JGbKpY?s>U=zz;yOcpB0d1FXNLPd~A|xah8caz5x1r3t=+vR9O%V;_8=N7-rl~vdt|703`iiz*I~Uphb1rEBl}}zK_EM27X(2$i{7fBAre#+2P|!W(63$D z{_P9Gv7K-K_AYt*Q!36sN>KSr?vsuS_0q)xxS@5GAPKhZzC7DOibiYAfR7&^eiFd-y_`*Qkngr zjd&vAjwnQe;V&ol#N5Fhk?>MN#S`1>RB51(n%Atq4cSMX)7xS1?v*2@QjG6VIclns zPieUO2(L`BR8a0w&E`ZxEz9Cwzw8!B9+$$9Yh>?-lQ=&0@PDCg0$j@#y$#oxeF`|| zfW`*+xttoNbA(w2dSVW8AD&%LjBn0NLWffzWn|*pb1Ae>i$9~byPo&kRj>FWcQZ%J zj80qoKX+-hr*-Pt%njE&(96{`x`s*3O&W(oYjM?VePNeI>uuX(>dVjpndviK;IcP; zi{)$I0$%{bMEok|Z9%nin9!)zbj-n2;6>(Cbq@Cq_v4rwVW`PD)#hr?QX+WtSWme>d}Zl?0uiO@txOHyXrnES}=-! z*Wx5Q$mV$ic^41DX6P2~R?a9tT)O@kNlbFKq2ZU5!)l-$84WkeE#%*)v^Gc(^8K25 zY9A?^yt@=&rQ2opm2Cwcphexan-?Rykx4|Yr=$WpvP)?~PjK5L4UQYw24p+HHgE$s zw7o!*LVsRY z&AS_a?vqQA-n9JMKy?hz@gRF z{x!FebnKORD_gJAI%?Ika>E@{$z5;M_o{jocyFz+P53XNG6lMn2a3`v%)VHttePSY zT(trm*ju1F*OS3vN|s*^1rP`$VqhKdUJw_6XQQk?fCy!PNQbY8Eg(ID5z7h4-tCPU ze_KJn99XZtP|0njU&?iY^>$!X&h%Renr?;JuSTw4aCCgtM$$2Jb}5X=tRS5{3Z5H= zs%|5=0A`mqZUueUL52fhy4-FZMTDmEcPnuO+7@>sQNXAXXH%B6J^-n za7bFmS%gRZmwJWK5ya*E8+Wi(S?=@ysRPBW-CQDHaCcH{;ZEV<)jG4dW5MV9f%?_y zb#55@dneDnkyYF;+?sLNVsy1^c;-Apmc*H@eiXbzb$qLUk+qK%>-qiQi!tJzjo_V@ zE@F_D4)D$@lAP1B3(6Ei>}49tChnc)(5}-y@KDe8u2tZn9x%yrfiBD1qO=@xVW1$b zhQBbL;-AOCO?!!(c$d5Vx$@-k>N=T0*6~1sGz|a9Fi#$+Zk0dSYL#|@M^fONc%hQo zMURz2mXUNCM%PV(FP2ZQBEC2oU|DL_*h-$VHEgfynk`y#A4*%%0})47d6!MEw zWQ-?e20+$9lmu(8&u)Y!>Z6v%u@otkJHUAs?{afj0Cn{F-y zoUQBv)Nq_~@7AYpL!Hd}tJZ(=s*N{ayS4Qc>2c6Ot_}JY=+GrRrex;@TN|?T0%1yF zN4$dsu@lHl2vq;0q&(6(((n?dbHw!NR_w)Gnl5t$)RLA(D!euoFPEoO?^22JDwr6+ z+jsz*`^+trbu3wl_o3H;mEk^gf&VQ$@6L{NWzy%g$X!$dDLvhGIp416wl5A^GmW=c zSzq4-e7G^o#XGuVuF_frTzF=kt$%{QiW8UA-q}*mr#r|-t~q%74d-51d+x$|E**={ zURs+!B_Bg-9a8RCE5(At!cq1W@gBs2zYDq^?UKh{ey$m4>kgL<7I?)rPU7Vo?S3Y1fY$#tyNM@cVw;F!nIMZ#C}wNyFIr z;+Ob+KW!L0DmL@6pEZnK$lQFsKW`X2DrWh8uQiN4%%=Dl)ic-UR)6MSE{?JL6xsuW zW8uD|@FUT>{iPhOwgxAN*l)jNPXEE$PGc-?)(dgwy5CC1bbpu|F=1IfbKQiT}o*=4;B|3W6P& zdoWGu+XYVsIl6#nBe$}Y;#;&^CXILGNiNsK-r+FS7v=roF1yg0Zsg{sSG zf*>!qaWP(Qf!u}^vm=ihfN4?(1$eXY&v)2KMs;u*Rlr3IV#(e?V|L0n31iGo`B~lq z1&C4HNeFA}QCvRmiZx-@z)iYLOzNs5C=F0>kLCeT0^$LVxAKnF7j;(``c3G>)o7*;vXI3RZt z-WJL{B^TM;@aRD8;3b`?#OXonCO%zx%5s`C%0BVA=2W}a=-)S_-h=-FUBAhNPd%00 z*?wNaFIv4$@fYo5?Z;buDvL!O%>HNl7@b}4K8Xi#cJ&FLRrsRs1ipxq4yYt5Ckqw8 zDdVw>ug|syT!h+iKDg03VT8 zh{v=d$DtlcZfvbsJGjQplkD9&12&V}53)vhv2X-+b4bG{ls`b+prQe>cgcjjM{;|n z;RfV2NDR(j$%KNAuDnet4USRQFDJD&uO~cG-D{C@At_ISGFywT{gltxv3XOWIWe$* zf@eGavJ^NF_dL4iG^hD0_T}~xWi;B-)7}2A-i%-MIHfx}G_g^(`eM}`YfdsdcefLH z&{LtG$FHzfUAhcstWvHKvS6-O(|V)|eRjc7(eIHH@gAx=~9sCZTeM}?r!G`qNStb|y{cSk~Gks*gl_o{RY$ z{*Wu4If}7;|krTkW(L2+kAdoZai5lf7I8L^cHj;gVO^<0^(EC{4>xl zC$X0k!XderDAI&quS7}gC6MN1FI1vDp)?9bn+tdw1UzJWB!*pT<7n?Ta#xf177UInxq!gl0DvL%R6Ds=5Egv7oCi(T&x zMna~pl^J(3KdkOiYi-_EpH-~`UevR-7n^cz3FB(trW;)W)&X2gtQ-UpPwh zV(8;NBYp)ks#|zM-hF`mu4ec)lLE-9tmLroV7ga3_S#?sZHR-z5oxW%V-}BqSA6+r{&G^B$vnhFr+rWV zA=lG=5mGRrq)4&~5$XHJ{VO9D6O;#;pXR|&eH68z?4@$3Sk1}&6hS?%tR4U`oAgfv zg@jy{DO?4$t8iS(f~z!zN|wjUvgEic@ant*H3`IqL~1*t@m0UfLZowLA?3+~9zZ|| z`ILyFbz;C*DqB(b$$JPpWTuhH0Ne~}wO1z}u@9*Ugyjn2MbNEbf!UhEThi(qJ+9D; zdVgxuNa&sj`nG_b&P3?LB;Mi+JAc*dvir2+ImAk0ZO0`}bCaH#EymJ7;MsIc1W#Gi zMvMCCC;eW=EEan;Ffg9L#sHd9F_IF2jxH57$K_V@ z7LC*&{Wvv#UIXeOuyzT1?B(J_tXb=KisssS_F0)vEaF~gdouPJ%iMkcK>|gV z!z4SdW6uJ|={-V4Lvye~!_ioY&ouz2tbipD*2S2f!@m&V35UI+t|5H=s9}hRIRHnF z1Oh5ZCD8~z*HM`z!+PT3(GyyOXV#V^6B-|tEqL~nCqdvQ-1o&FpB?*ds_Gb8_hb` ztvbI!DDArME89!C(M zqH7kpZ%UKt!I?;Tng}uW6{(#dGzy?;!IcNzw2=g3Z>jfPeelRrH?G|_U={6NjeYJ7 zZ*Hb{a=>-N?#s=({b!YL`os@!S%hb**6`Q&9veL{=x@NRL ztGM`~=OSDmoOmsmHt<^H^dR0=G=XqAuTN+}Xrp2Xa0nKi4NWnL9zH}sX7$D(Kq|40 z8tCoVdp4F(K?RkqKl#ur2B5L?!%?A_*x~Z(&CTg~!Ti_cz^_LVv5~L*;^nXQN49Qg z>kn=8NBtAx{d3QW>Dt+=^D4-v+!}T#NvfKTz3tFMd*)u;b}$=thT)sD%>N0v`FB|@ zLJGL~z{tm#2{{1QiVs*V?mqFTc*il4Wg3i~$zFu^G$#9lD`8@24H(*v3px%-iaDVw zk%fqAZCQ)rphnQNFn^23FS{kwHFIH7FnBwFcF*0R@Xcr12bKTfXz!hPS5-& zbp~;f0`f=YE6kVwbDcX>Xk88>)3!n|{hM;e2i^R=ijh_<5=xzAzPk5?C08O0m9Z9&#$9MvYdf zlp}BfD6-IMA2+)~(O4@bPvUTGSSg&RC$5(R7L}Y|<8lIqVML|OIVCS%(sr3sud{7G z*RIpsueUjDRlifaZ+jpV`+CA-+q})EQeWsnwq`g>CmDy^s z)c*R_^(|_PMPs&^I)C&^GMO~tB1|QSTpSyG%c_u0B}L#dFY9bogUO5(a591%K}uUQY0N3Sl>}6c zp&2sQ!pOeyK#Rx}kbLfO&=tp@;tZW*T3{cNTzedv%#pnvN(89X;Z%u@6hYF{kme&1Ad4|RHnPUZSNgf)Wg((qM&i#{>5A*+6kF$~3?$}}~+D2{TRd1->>I2CN5!n(0s13GI%xrT#E zh^YSxJbDC4xCJDFjtb7e7Qjgq{s7sJMDZI8) zk`+)3VpwyH$L5vMAlQN{1&~;DP`N#FkckvaGUL>qZW3iKI1JbqvjZWMB|W%nXw`d% z(oLIJW#EA@``jHZ8#XYt(VHCjh{4?!+R1htV&BS)jmKM8tt>`Ty{iTzGe_Jpv)g`X z)s_1-{)zVGGh_YX7lOTg@ekDgpt*%)8PVV^u@!rqvS7|tqERTMlnXgfTw4jNu%XAo z6^EHOE0>EMdtFsiD|TAQ5nVn<=h ztWoQids+buP_gvo1KaJ1g|XRTe2{h9+m}KEb@aGuwdAt#xN&Un%xM?wSiRX;dr=H` z)LFT#Z4BIVT2;3k;Hx!5txiG>`9$E**A54?xgO%nbPXr@%Z<)ZtiZ$u59l)II`xDcsbyaM30qx zfZ>kL*wq@3!~EUtGo#$TNsHr<;Thp#_~Nk+==#{`{p2AU$%`>BcLsa82MQZD41gfn zz5zfGcY{KJN8$G)%2EUY-T^r70H&4(y~<5sThRnE36humD>g7JAX(rB{ag1ZI`V=X zb(1HoX0N&pW>-8O&$YVJiI&mzhgUB(f5y%lFC?m3v?8~~LNt0W}XDg6G5RcBEJ`&Hj+{~My_uX&Z@plr^+D%$v{ZG zk!sDh8or~C1>Mn*r7OJ6KDzbX-cq7-YW=9YN#|)ceEH(Zb7G0ied57bFybltYUf$Q zuCUeN)|8Hhm!Fhx8|*l={p3E2!<2UVY9IQ^$ivIpGVg(Gw$8uJUW0s!;DkC&@#4aG zqJ#+%0*a?XxQ|OoYzw44(6-P3Do?|wt3jEhobVv~^l7>%?$^Ll@>5gK8zr8NUPhbE1w)1;AU*s1a?O!}dTU{L!(U0+|Db2xm(L`z`9hM-Pk z(QB{W*goy__|Ik!w7RTOXYCDhhdq*hU;aQilfQJW!({NAY=6F|<-A|MdXE1FA`(m(D17GsMiMVryTp**W>+Gsg!vB$@{|ow8BgQDn)LE4y~? zJ2t+0!jj!OCR*K{&bZI6Jvefv!@l{f&Fw*_$=ECgdopj&)Rr48EgSbPH-Z-K`9HCJ zSnm){qYmN7A}vxNffg%XX~I8BY>j82f)FXJK2j<}DPr=F3W6536yz4P;{%xta5j@0 zFeQ_Lj3rJ6ACUpbojk!K25psyVUP3rroTrFumuQ#nQP-cpj3j0q0pi~9!m!d#+BEu z%r6^hDTGtzh*@0!^|8|M(8Vi;n*9A4cF+aIa^;KorG`Y3Beot_IYLbkW|S;M2|<+QOb~N^9@hbmQN_rEh(_%6 zik*9O>~8D=xU!&j!v-mvOOg-1P!!E_7oQTc!J5J{#>C=1HraE){#c0mW6ngJ}XEx&@;e>&wLw-owhzpNMyRrU|`}(uyh~=R~Fzt+bZSFXG z)|pGxo+cXG0wJ~urWnyu1TDXzdIWMa3@s06KTbTQ6hlk8CS>UGcU3>9W+mn%CW=vm z_L#M5Rpe?sM>?+{#mH7MaU~t?mt+r19pVA5BAIm1WgP~T3EXDtO_U=382e}e|ALfr zJ2*{~j(5#Y}*bhNm?Xj3SEnBG}mcnc);-1AtBBM8z{J z>UV${89ahX?{fGM-42UQL!_<6`t5GB*Yuh19lMw9X+~rz5v!fA(rSwdrx)~Qx!Sjx zy@sR{CM4na+6NkUz}E;_B(*}%K^G^KH~?9q8Z!w_a4Sk1p#N0dwCsW#D8+meqYj!< z76F}zolEXH0L;Nq;(OMPZHZcHI-uaBmSTu(U?EyDH365BpKMHRnA=T?s3voQZ&G-w zJLxD!`_%eKLQ${9eXU2PZ+r6dcb{`}jh_J&B@l?40i zu^f^E7aWvXa9~$f<6couh68qSoI47rogB9zG{>blL^={Z;=GZlWJG*X2p|uFloBht z$j$0SN0J1!(I$m?d4HVT^#Wz_Axn+wH&T#IiY38GfX-p0ivToJrbrv%z4i97PYs`W z>Qz^rzG}1E;Wuebqp9AY`IqBPpQ*(@Ykps0II?=?x>HZTZZvE6cDnP)!I4tQ;A?bu=9t+qQk|lnsMJW81flZQVF_^?0CFytBAxU1un^ za&pBf?VC1xM+^4;v6FV?_MSTulx5wI*rn{>;j4qK#H9!=FE%QY3uv)v(s8u|pbyo! zN$@E7EI~}#$~#IT(9S2#t)$AkPI?rRra)+Y(m)1>lY~ziO6S6)6^G~lI%!!#VZqt< zXuh?5Pn*NrIyBrm(v#?%ST`}$-@dgy#-2@Y?)6&TEveSA%)p9hSIE}cwy7|&nq$&O z=dTu9u+B-saHnEgxrR(e6RJ09qecLKh=1uA!Ofdtsgz^KB)jkJvh&!i!|nvsf5JK& zPsAK;6}*k!6ul{-g&kO`U<@z9WA>QC8BcKh|4z2#9dErN*$_;q2zolJvA{g1yxz0| zcvC6JG7lk;5a(yo$ppLpFP4C|$!zhvfz|C$vlX=uXI~hy#4KiwKjz9gZMD}{iHE|X zM&-15{F=CL?t}V4y@;+eI$a{xrdF-yJno+VG+Mj-J9r#*hX$-}*;16$a_J$jE`vK8 z+)1pz2T%R(;%5ni-w54wHj#{j0Qh&207BL3Kp~9W_@Loh zp0%2^R)DM-;N*wpQJ*m^P{Y@aM$g zHZ97=(2`NbvgWASTUo~Lvock{Vpn-=HF%-a4F8ELl`0ouDp<0z-f=JA+gAW*9eW#b zZ{C@xYy*B~D5-_`GEg=NwliFRC>W%SiZIu{xRWGBK}R7)iWrr6CuoJM<&{JYCMEMnIpuKDr z{oCF89;AY_zDKmkTFSFm$*;ANqP2uymM`SJ{5Jaq);B9)o|Ih!otvMae4ddspC|cu zT5{zqTpmy+G0!Lu6GjnHtz-$cSIE*lasCpr8s>?dwTg?wsv!%#trDV;h7h88LNP~$ zDKu`5N}$YBhR0GS2mfAuo^EBL)C@8q&lK8se>|S)_!(4jC#vu>?LSKXsg3>BQsM!}8D^L27mO0wfg+OU6=SS9`5o|FME~ zl%6wnR$t)n?Fv6Drqjk+f1PuQcU$M*7QPIc*nojjF@qk8>SyO}T0MAB&vA0}uz@Q! zsv8w-^kYDfp~OheZ-oUGOZTjfM`x0Wv@@U>C?$o70+gn}Wy0IYd3+E#KC6UERNgC; zs)43ZR>cNE5oYu_;oS0FLf#f3N4|qRRqgwDUibW8 zm<0MH(6dj@s|Xi)oS5=;>^u_76Oj_oxxgv#_$SD|783NtIDG}lp1>0~xllBPCpIC{ zy=12%QHwhBxVc@77WT4*jL?39wy4AZv@dP*2P_WX$0`OiCGiA3k;-O;w!zT-&xCz( zf8^tU_}818Ec%G_@0`Z(7hhLJVWA-7m~_ah-Xu6c-B7OT=b;GdP%RrGA{;e@N~pI1 zn*+f9verj+*>F-Qb_wFXE`BDeZVg3E34biEz2OW)D(oGJ24n2@#0s}D+T?cP#3z@HQ3GZ-iSY$;Nd(SbZP2f1X& z9F#5u`-*xoP8^p8Wj-C`&e_2cd^XtVM;YYqRv09xmRYDc&R{RKQ8tdyM$zXf%yAIF zGjMDRQgIxUO^!@(9i_gRLoBQ(QG#5ex?Eq_-!`)bUIcZfex7k&SBFhuN7xq*TO*^r z9WI?(5d!KKdq<)-80t;8x{|tu11_+6r>@^q^tZS?O&u#&rOmno35mewh4XGmJK^v3 zx?I6xY^bR=uZR$Cvx|M$ALE3*JVNwJ6e}9iaggKIWg5{yfd%jf_xJ-$c>K83k8Ofv zwEl4-X8#}v){n9xoD=Xm;R<^Od45s|l1K5wL_w_-9fU%PTo8mM+z%qbN`aqo1k?%* z0?(TE7IkCL*dG&u>9!t9lT-v0rCw1i1oW#@uklng>$w*uO%7>U`NQ$Js?8bfXot?( z;dLewX=+=UX%`(jXS37havMFJ8NXE{%94)G&DPRTvVANX9m^)1bbLC33&-aVRUu>0 z^T*f^B4R+rjD6^0x&zRBy{gv`$+d~|{~#Jz9+O{v=X>|A02|EBtB z;$yeeKDKbM$iAGPgD*0|1wf_>$vLkmm*Uc9>^;F0Ay% zlE9wxKvwk7+F4=K z%(|>bGs^#EXvajZ8a4?&$X!`}F!X{i=Z{xi+)(A%@2)%^*vC!KFpdfGDi>{)tfz`B%8ZA10;8EM|1=9r$Sw_^9=dIfr$ibYz>g``QDW)@->$-0jq=>~>E;oAk};x^Mb7-3TfCDx?*} zIyLH`$I+DBw|S?}f!t_Xp%K<)v zL)CD6Ge-_{@+6?9W7&eR-pD}7+bU@nlEsk_2IP7i?2?&JU5nHt+RK#OplDaHTK?CG zzi=V6X??JnjF(qG8VFBc=Gx(GavPgecDDuTVqGn#FE=K(FDrHL*~9KNsttBG;-8<@ zBre;hZdHp2=WEnncSJ3^O(vapa$wYEGV@qp0{X8cK4{gdPT}vJ@Yj5Uy@>Z0p;$=X z&sF$ZW5WA|ikIY}saT1T8v}&k7nHwMcelm~_<-s!D|R1=LpxHlDn9Pi^xB`vsTV+rn_-A02K$B@kw!>XE@{vXP|15C22O#7Z&IdtWmbLdpnRoz{k)8x>T z12Zr)Ok$XzAUTaol&~Q3fGCK7ii!#A))dRiZvYI7ySnQlj{L6Tx~{9JxW*M&ruu)s zb8dC_41>Er&%@NMdv90OJ?A^$`NI3XUleQ)ikTvfC@O_dPZBR8Zu84`z)3|V>hf*J zZ@--Mdjov+{v;F5dQ(VxBZjLphdiy9)FsO zxC~mQcA7F74+$<4JZsy21@;+LFO4*ZKc|7;qzFs`$)9FiBsigZ=`o>@X|j|^98Y9H zL;?9Q#UA9w8P+QtB%I2m>3n)&UK%Dq2VPOa* z!op!#7@$K?W5WCaTm*JBX%eJyfLbO}EFav9hNOo^hU5uI#k@O*)uV=i)pjF;wX+3( zYuhRzU+?yjvjltxx9usF4X+WdlFNYo%kgD|YByyo*sh||1txo^m`puOgEN^-6$w3e_# zD5u1Krvo~x5hdwIqYFZ9({aMjP@<^Lpr_bjfB^$8(MRdHDNrbi-}P z7(29hYZ|yy%x53NM+F@&j%IZsQ-jR{Ne?an)L=oeVY1;J86XR0KNcemBsUGX=Z2Cg zT5jV&K&oDyTlQtkOS1__lzo)6N!^-{`iA4a?6>6uV7W5k&`+iW9aS=kAFOKjJSqdYhM=D;yt_DKH-=NbNGM?T%a?E!ajhxmE5&W0yV#@M zA&)oWvV8ILTQ93vp#8r15G9$MuH=&#Uy56;kx#-W)&ZY3DqSy8EG}9lY;1jiV2Jh6 zs#3ulK$GiZoP!W-z=T93)RCk|?j!-2jBNnfvK)`r<)9$J4v@yvA!bL#ZhokLYWtWY zC0In|gP>}y54jW1s72LLdzjJgP~JF@b;wljSF)>)b*-+ZovgL{9ecL!=kc+OEWkD6}Yn-p0y+A)W~TJ-8EuSpq1N zLCFzCBRHQE4V6a}L!<~OL@hsrCdOb18ENk!?SUGs`n|k<@+X&8r{J@BLi>(hu|jW7 z_CdTg`gNBaK7Y#<poD0Es4PY9k>V)sk_t^m;}x>@>0CF411w@F{gf0F4B8V`f1YC@G)^$% zV8&J4v`w}%9;M*xQp1xFc(Mt3aAv`W-b57CMV3Y`hU6<{3sqrk9S6xlfAQQo37zn|We+a5`I z!x677q&+P3ra9+JL~Nm5>;}e%`#d04>7z*_ zVioG|N~%-By+a&pH8hFoqYzJyrVovx&`}eNnL|`Dg;wuaSm*+8>{PoDayS_P?t~}f zKtdF}>gIdFwbd&Hdnoz?n2{zwfcEr{)~?;OW_!kEvL{E1o35>W=+@$7E@;u(QY-qh z13@#{+n($CR-|lb@4dA5whyt{^&hN|gN5!)pnTL0JI(4@7Af!eCUWcRKMr;AIb zQY_~wc~ikmZ|i}7oVs9lZ_nzDBSl?W^9{%|a{BT;Sabc-odOw6gB8MNgANi@n4x6R zP>$03D7)hTX~4h(ut5UcL?0{GD*jSd29@@A89^D>1gr8}ogtp}+i@erMreTxs$!{H6 zyUJm3mNP?J^M}vNmfiXbgBhnGJzLmvSnnxk&pZ5Y14m{BBP7Tw?eRF;Az&#;QipcvV!axN!AcX0vvZ>zaz*8c!z-c zKw^fRW+wt*;s~LIVe(zDSv#neuwuskTphx$wAv7yf;$66ubAt8~rZw%` zv>SC%NdY{zc{_DZrS3?@ppGY@Cy4stE>`u4I_+#jU%DkCTUBNUTV0ahexzC{i`uZ zR@YNzd#rbOYR!5|BPE5m+6j4VmdD0duA!4arLG&UXW*W|Zc^;z6WTF}lXr>S5W1GPZu(NOY-aXn5YrvkcKQ6*mmla6<}72}MK51G^qa z9imhA!pK8CASR0n1fHL4hZV%Qi(%J@mQI|CfCgQztxE&|n+w@%iR8*~m)Y#9ty?j< zVR$I%C*QI!94>e?d-C2PtF?C~e_-0sl}|ozumDh(9t>?wq&j7DKAX%>3`|t@mO*59 zda7~Tq}AX|XA8#cY;OhwOEJr@uy4c8%}Cq0y``34$|Z#=c)(Tx1SYT7KnOxD+zDW` zsM{rN=`pg^DOLyQSVNYKkT^*RVW)0b0y-{!swX3KrA-4($-~pAm*gb?KIY1VHtoCo z+`ZS?s+%4-pouL%XL%OSZgYb9ido@?oP}xlh&Ajp@ih3=syxVbkmj=cy|l&pjibu#o?0 z=boW(5s^dkStX^(rNMKASeG|FoXQ{v{b7I574+Gi&YRzFh&er7LmRqmChgIc2IJk^ zc(Q~XsgHay;&wQ_-VZ!w40}!bU_9bx3C(Jq6)9Bq>HQ1m!gZItNY z4AuI|lClx9wxOg<((`R0pbYgD1+Iv=2$CEtlcX-UAh_s;?T>O_91&EeztZ&a89EdMY}ETT%Rsa36L&LJH!O8fG3@r=U*5MVp%B(&9Fkqdtr6OqqckpsSXWL{S*E z!;W%>Tc4{D936)&pjERn$!Sqbuoa$kdt-@y(!0urjTrDDBy8)GPVnWz%V=jA=W|YQ zQ5WJF?L;HOTB=VQWj=rVxE&;gMVogHlDU8YD!UT-Daui0dn=&=_PJtjCbBja$z{5_ z@h@$4tB<9+YjLwxR~{}8Pjs<$0qkskXN}`8{LZ1Dj)gyb?iF1WJAKlgNY0vzDu1lT+W84f}Sqa z(nuLZ+ZIX5LOp@GSm~rX6~13CUxA|%-Go-O{WObY*e%5Nc-n#6cnkRl3im;eQ#)D_ zoLD@0Ug{-JbN2w0wU*{?{S0PqJ+c%zO~IFX4s@Ha5FOX%&EsxpBo+ksBU9O6R&W3p(#Vzi;!yj%o)E-E#z5l2^-ng>;FdYrUr zeH$EdY@=9k3$bb9N?4D%+*xU^6mxmm)%d=Z>#^{rR!-v!R)S*|OL=#RjtCSsfX_f* z`zvsG1cyf)9Jk$xLl79e8)tn`(e*9Fl!3<}W}mu+PviRCIKP%R?OC&TKb?mebnp_q z4mj%<4J)N12*@P!l@Zc|ola$Z30IGhk0&KvES?#sbv!{5Fue`?_tn?nX!jBP`9WuW zKV;#oA#_CWLww1foo(^hjHH z&J514n6<~p@_<##*)ziS^H&ThA4l9j&NW5rSqeQP8+M5*Z-tSGRAR6vX!0FC4peV1I&D{)gqhv0d^|;^W^>!>@DN-G|<0 zy`u&KLwa?4NFPp@^m@(PEO74E$x)1_9(c4TL>*gWk_I(Zg???W65~3=vzL?;E7L%( zE7ff$QQ!blDWNzO%?O6lz}Z_2Sc(lB=fbcRX((;*Qt&V3YeD!+8NVv3Z?TjW1JKqD zb2o;Hyp0p(p`}DPRXJ zIKX546hAz38^n6RVxZXRX`x59r+a83cYu%Zq#9yeey#{H7S$bb&Bc8ydTdtRD!bE? zn2$(aA>RaDIehBh)B(Tgs2YL1w&NxWL8cO;Y}LGat*!{0+1LImWRK2=ET7|bwRRGxj@xQb-AjPAif1?QOt;9LU~P`5(Xv`S;+)BaeaZkGt%#v3y@O zaZ0mpa%hTbqe*M5I2MguFoXK&zrR5j26Gt*%z*L1qI4m-teBC~;+6j{L=|}E z9CS}W=|ihRi{@)S_^EvVoshqnu|ymW!@9klSw~23_jGTGB!<~-9;3_BVbyoM%M)9c zw3rfB(^U~?%n4Q?S^DJMe{(WrF1z#qZ5TiK78#BszJcRO4;6nEMA9&ZQZ(TOR0o8yS^mdJQX zJS;)n8>qhL*>cKSAp}dfG1|sdzm*!XrYEPn>)e>E2YtC_!EZ>-?_oBaHr=L+lx(OBeL{QfA;|CyhEZO+e5 zMhfcv-Ruf{{^R)k*XMHVrAR9Bul)XL_Px13^565u+#o*ZV)b)I@j0*a&-w4U0sQvA zRX-<=v3VV1Y1g#oV)*^^OfmK$JSUCg++2X241W@_D;jq*KI4ycUMtOM*~$2M;xk%L zw0}Dc{!cDEQ|oE=5Pl=(Nh`Nbutf7Z zD+Zqd-$~>08h@Tw@SOh=uSPzmJ|}$!$-r;$oc|L2mHM0^{#$U~_k%giSL9p42l)LN zod0i#!ja07BbL!9>3?0@(KJ#L+e=@FZ{-T!MQg{ zUVOi3eUE)V`keaw|A^0cgO5w1^$!bU+jqLj7DvUb;rQS^BL*@B1wOKA-dmIKDq18KfoPW25*aI_VHbN#dM_ z=w6GjG!pWqsS{tR<1K%6_$>`R@297yZ#VI8cY_p(et?ht^2Hf>>&y&(z~AuiSHFk8 zpKajZkNpq7D=k}5IFxW0+*ImwGe1{h_ps-1?pFKSxlhYSdZu6aa?fZ}AxwO8nWR@Z{&i~l}d5=3^tcr&2+#qkRM1bR)HtMR`v zpbiE1!3QO(Pzx$@9r=G?Cn7gIm zZ+RFPM!TJO*dKa^=F=rT$HwG$I&!E4k?=H}f)3~1($nlG@=~1NN9W}aZ@5#;=Uf)3 z8l=H}$aS8&?~HSe`E&g5*|*idH*hIF!9Ul>e!`{}oxf&o59alpxdW^VxS|d)Wr;?l zXnLdt_};*ml7VkmHr~WRK%g2H?gdyN@Pw75Z3^(fQ3S8xf1+d_OqUzJmDS8_$qjogawD70VK9kpWFm zmrg21`dr$grzChe?azf_Ow5nYPvLpKdx~xGdxNb*;yL)3NvH4}&xz+~KN~;y?EJI! zBT=4_ZKx@l5Os(Y5~l@cr^q-mZrYRNYLR}j^3k?}Ko5QyuPjnbD5zJo8VVq0QJ@Zp z6B-ATo9nA4HJO(F(A{?*VsEtM^?MJkVy(!1e}CW1u{E;ex39g5lEJLq|S|`Q(xz&KE;{Due zx_9mg={)vp_EYGgyVBCZ^6Fvatg$NCzvS)WtRu;r5G`VF&EKe#9*!VFpeyUH$qZY0|? znU#H7yVj_2+AG;q>ew=WEanTu6Y^u5uk*W{Wm6!xys~1ezGTU}QVI9Ysh-lB%<`?L zzLE&|qEWvu$>(i}e2esy=4OXM!`N{#2k-#C#@4eJ9D4UV`8{jEi~Ix&(YWFc;u<~3 zxp)fF^J*u#G;om#+T?;b2onBkisPdJNHSCvI~ehGc8MGa+5&(PiJxr7L~;^!1c(7Q za}KE=Vx8lG#2k{C4Hs|e!ucXlPe}^+)#h`b6}7h-M_qnKvG%@R?|4Q!A#1E1q+21c z>JjNzB?kB_0BndZo{)^3jSTQn)R!wR;ANF=%6ul&=^{14B_VpVk6?|L%ta0 ze$A{yLPZK>dWBmpl771|i?}9VcPL!!1J-V8YLtj4zBJFns z=Lu9t_%JMzr2*+Rwci#nse%kgg98oEZEHYpPt+#}k`^%z@nQ($kg>edWReQspci>Hhv{U~DCEq@L!V7Mr`&4TIk??UHIoh=qIOX4VmpUxH2qu_ss4kc z?l;nN?-x=Bz)$2EB?qa?L+TIG#O>%aH6?vcBryBNZmNg(3+guf^%E|j^5Dl zy-x#m2Y`A#A?74j461V?^_RhWfzoQ~Pf)j@-35of^dn@=`w|#VHuVn9FA1JRz+;*| zF1L!w3NAvQgJ|aNh8WvQ4IA&`V8hh#u%Vs;4Or0K&M6aAXVO42*G6z7m?t(NFgaK0ItL!uG}kPx zE!mg#$9&9Tu^y^yyW*Vv>z9u7j_nTweO`UYysvZlp_yH~XKt-bZaeoyn>%%QcH+=L z_sT-Cf6F=FOQrU#9o|;!Uxl$q16RKmvAJI9a{{+n_g34TcDiArbI7Agz|Thjst$I~ z0Z`3$T4UIcyM+97m71O62mw0eCz^V098o#A9&OYd)Mf_A8a_OoT@Z;LUPpjzamMwe zNn;Nu31~$!g92MU1%uH1i*izUn|D5`cY9);U33TVSrXr+#aQU=jGI+NvJ9!B4O;|W zCYg%f;6u0HFq9gd9he&F@5$|r$c_$_2yF?DY|i%_>*`8%Rh&fS&HmQCY_M}ClZ^Ew z^S9{ahpeu({n=W0D%cgv4K2CN4BM)6?sse__=RnnOa4LH&EqlBG{(>lj!(Vj624|_ z2$nqy`?V^4SH-aPR#lqQhN-7aytTXlK<&K}uQYQSOBAK_;2vuR{B&5)h>k`nfZR|J zX2&`e#-^UDNIkN6i-}ILdc9DQ!HUXHhT1R^+Z+Y@(M#9M_irzuxgx|}#&N`GNYd!! zRl1$M__S&#{Y4ddLk{=KA>_|tNE*nh;y_-2a9nvZXvr!fetyB}4EP(>ilVI#m?E(u zA+wKp@Wz<9g>$LOY|Y*;Wk!B6k+5f1_V3-BoMOev^uB$Uy(>Q2`q^0g=>vzpA70Z3 zf?#9!T32QLsy_3!BB!F)Bx=R=`s3FvtHng`1KO|6_~(@Dfvx<{q7EONsZG0{R8_;; zOZ^~3SEw|`5Na=5Y3B7dYVQZo7R6B$)n<&d>T&>~i<7R8<8M`lES~Zf3|W-g0~Nau zV~eWfJVLH%(ED>$mzvzwK0yxwi@O{qKd)5gyy8j*VHz9xV;zE&*imU@IBY#b2@qsZP!-VZ zG);sM1s2G6-rPlh66S!?12k(7ci?(p5)fA+@=ncBp(arJO&~)F$rEbsGS!0-au3%> zoefhb@{h<(f+fyZ$&d5qE|Rkm;_yRB=|oX80?$1IL!=x`oNO?|W63CScGG}ziW&+Z zb3$uAgo~-U5f+C$8^G&=5+*fE37wm#R_cBOLb#IvLW6howxb7cyky43`-Hk)j=i`KuZ^}Ft6j`T$5%&Mj3jCr~`ZpDXA9J%?%V>_;M{C;hghTCeh`w-#P z6gopbXV7EJwEn|$<)y|w)xPbsJ(teRUKZLF_VnszER(LndCYBqzM;A&MgFow&;En! zmK1uUZpYrWQu+*HXOu}t6ua(cZ^lbYj1w zl*Rmgs;0*W$kY1Z)wB0~qPq3M+US~aIF!(61NJ2sUcG(nJ%P|oW81Ghu*4qFY7(JH zXwB%ApMC7U*{jwS`oDSK#+x_yj1@zL6xh$0LvL|@=H{!PJ2p9a?76FN{*2S2cQBLP zmnwvcW1s)T`=9Tpb--)RUPIm#=!7cXu79!xzjUKoZhl(B)~qV z_2}(xpCeqn`09OkZrph1zRNBzh8^It(|fcXm!8vk-rDm<#&+JlWa|}Nx6nWDMh}rR zEDoTyh|EIC!?~b?cGH61l41sOG!Awg^211Hpw>&Zz)&*_b_fD20!&J&B&YusvMMB{ zHxF&<#7+etzWwY(-c39q0KM~_i25+tWH;GbT+j@i&fsXz`TLg592`ztGXtxqQ?1vA zB17(QhyS-W&)0Ws^{3>e0cSYy7jR^_RSsOw{K}YwntZQM&dvw zp^?paHY*~V+f{EIMN?dKngO9QEhVJ`LW7doBCf=W^lY&-JsVJ3VbOS}qe8(91#Fo^&h3>Fj7wc!=p+};peMQ8PB+X9{^UG_#B7chFPMV+c z7zEij-(=4@@^TMY%yC|e$H()-8q!>jIJ+6qUEtPM(2A*5n=5&qT^U}6_$~R7RQ+EM z&0CqSAZQgU%`W2#Y#T}!_#wR^N8%X-CaTIbbXm62nC8~ZG}afZui?DkGY|oAz0YvA z&6(v`IL=DL!g)n3EAS3B{EUO})gaC%i(QEqVHJ#V?`Mp-8;2^i)DSTTo2%02f2Ele z+~I36>N>0~cvc)U1N1Nz-f=Gmj-s8+A{*aU=0!+{aHFt%4B!oK9}$T&{1<9ZcZLLt zB1pfN1X50NA@ikMTgWIH%xixv!=v=}XSKg{1+8nRIz1g{$YzJ;h2;H# zeNmW7{!}uIt_pG>eeYzi!~3o?#Pz*iM{6x_dnYHjs3Nv0$#+0rEnw7sNotJIe4#re zYPtDw6CC6SX(+A<3>}g2gWg54LU>E!Z8O5Jw;N}5gJ-d79wWAX0v2aV&8*t|2SnRQ zUE5(3*@=8{$_~Q8cEJWOcd5|!GmW_b`y@I~DQMA&N$25%X)?3M`GSDLRB8kU0CbJq zj*IZymg5`)mYCQex`~XC3K2RnVP=$&*K1@mrOVP`#u7!n9Ac}6%C^%?Fg{~nqP{8iRgkaX%?yCx%AkAro`wHSq zIBW=@lJkJEU)1u8tlLFhzfk5tzHJdZJ7?~-5}7&nd~jf*4I13CG)9{kQQCe%d(Y?F zw`h4u)|ZYux?-D`5Aoq#V!n3!?&H_)JO8?A{=Q{x11H#dtv6}p?7DFA((|q+Zu#r? zU80Wa@p;sQOc8OdM*b*9Y(TnAuw^M)H@aIVx%O#l^e!)Wuqur{XrD%rjM##}{{TPP zAtm}SN*!>&N+Et&(qh0sL6Si+JXB3D0s+K9G!>3R98rpt;V?{Y_7*A>o4VpR=tD_G_O{Uw$pixS2=-cGV43>={W2-qrg1_<}uRg^o*!Jl8ouAD2x z+{M-#y~d^A$bv+_^_9h)C)lRzJ+FsiAQ5z*nnNQMn>)~T{^ed*5zBwz9rwNb)^>1D zvffkA4-prOjCkjN$yYmG)q0SS&`r7=a4H7z7)qS8o_K)Lx)HCEB_ zN^xloLYthu%Z;Ai&5`x}DU9F<$r*|{mV)aE!nLl_7+p%kHi}BM`szw!=_tKhI)!&D zDQ~j`b zsCRe?Ma1YaN4fyaMkCIqHrG`lVk2ecdZ=>;LwJ?c!9W{&KEd*w>aIMrYa6-k8AHqPIMOw=;nB% z8AR{ni<>>J-?-2da;!Acx#x5ZLhAqtWQ{}(U7zFfZUateOzqKyx*OiCtEm^VjT|>| znKvcB4zXF$9ucI201ZJyVwXeLFp|8%cyvN5R>%=YM1EjNe$Tw0~i9R}Ztd{J}`#uH>g&p4KP7 zlIR$H*OcMSceXy((ZMpS*}B%da~_8;_TCS>4Hk9mH19`z21$L`_K49C!d^ks8&sSM zZDGq5`yo46^%yfZjE@zy9J&XEr^sp z#8~=9=!U)l+%Q7LoKqu%xBe@F2o!fJ z1}!|TZr2GGi5hWAQpTv<&YQw=Fp)o?HH4x#5BoRCgNT!eUe7BU5va*0!7RTJn!(Au zkZiI>z_nANU zIbGM*p?;SyBqO2|$&46n8!~Zbv$14qgMsWm4c{w`&>dEA9#*C6)wr*%sy2g064rqS zMzIWSl^N0>X`xPXm1d_m+>P)gGKs`APBpj)PsY(e54$8b54HO<@mRoaS6e?*(`Uc{ z5#T{pGL*XHV?(lNGl-B=G`y<=^5iv%jUw;hUWrp3=NBrW{g1#Q$awyu-+qn8_Sp4WL zFG@MYUYQj8W2Vw9xH~#AR=TQE;8ru|fI#a6FgZ}`aStb~^-$yxQN<{itK4;&Ksx>kovQU;6scMkj!*yfl3k%!N%iFo4d}&utOjU|bt|$*) z`_{eY*tbY|{sy^c9uFzXZ_1B~ei_7nO4KloJn3@PmcpDDcs#T~CO%lBxR$59D71VW zlEhQ{CL~d?>?9szm5}gnn7CsG#3ocG7Oq5zyEs?~Bn2IuTqw&{0yGxb*yB#cjLH+x z-!5#&8VW9PtR>YLpiv6;F`u8?SA#X|WqA$z1n)9`yQP+06><1N=vJvS=w$=@vHic2 zVMna>Up1@Ia_3F$rt`9;_4#mi${n>>EgG}lsezFFaFxdl1*WkWtmY7#q&W0kQTDU% z0M&f0h(jZ>^9oPWHT#4Rz;5g-lgjCXpM!s)SI!s}j&lBs147{-8jyN!(Qt(OFhbn` z>7OQ=<8-O z8Lv_Uos;up!gk(O=nNxnsn=MIvQB5z8)Y_K33*uSC$kw5-s}iG%*SP${AKK~UDAVs z*Nyi&C4x7#VR|DEQ9wylyBWCE4(}YQ1R;>qS_BdI4fDY#Awv`HF-9-Ny}}fk;fRrt zOX$WP%PVoF+}MQS?>CIR?14Ixa_k6o7E*Gk^97ANj7G)Fi%kXc38v1x{VjaMq-Y`p zl{A0hg%09!kVUTAJc;%4G-{N8&i;A4uZmqBq=0px4p6t;w2Hrg)5|CTE22J>mGMw$2N-m; z8crg-%{i-icjg>6dE$pCIqP9`u%YdXFsMAdLo!2snt7-PBZw&WppYA$mgIp4ycdBW zS#xpFI<@vT2$3;pUq1WV>@s`MSSq6)gyy5f%e_9My!xwt>`64;c1Q2Mt@5{NGVo z4Zf%YN+ZSvvNlL=h&qlq8D;wWg1KLQ@E)xTV1Vsje*xWrxBLeQC8z|;HiP4;Y{+}i zr)7IeDUBTJzV z04x!wK?KO9QRIR9A{mGkh@;{YqDjZiJ|UXE3aKa`7fo11y?ijs80B8xwX(Ml!iaHo zVrV!+B`13!6(xwmr<_E=0TEp!l-yn_qKpWI9Ce>l2~pWqp9|f?P7}X{FoKXW1g_dK zU~msr1cU$)2F?9K_=J_z;kgNY0Shatx&ELdX6x`&(Z2v){rPkI~}Ng6CK_P;J1G`q$A2aC{4yS(H@CRNZ7FbHA_ zWJDy0VIhc&vnVp?bS{X2lTEEd8phZKII=Q8_M=wRH|C(&a@>d~N}NWCtBq0@Za`KW ztSh!&7trmYd#f9lyx$Exk!&~dv;U}^?VQx^RRyiq`o(DC^rp`28*TYYVymP^^Iw0v z#?GYI7;341FTVl3)-C-XVPgrRSRFcC3*pfkd^Bts$P;1GPz=eBn+b85Q-@D=!MWy4 z0B8yWEDFh%O1esz2ogtbGDOH0N54qyqKJr|5e{7(3x(-HdA*zvHfVpvjDkMU+`!Jj zYZgM+1vn!bgHfUs%XL01I^fh$A})WHrr2!>lnY$0?(rCPX6pli!p91MVD9nv+`tA^ zv11psem^f+!>xNOt|+^>^>_293?zW9I@?rCG)Z8-qkaEoK zjS|wL;2VI50_**I`H#pko6$`@iM{%`n#(Ff?dd=vRBZxs4gx~}%BZ_|l*-ev9f!cO zfc$coFibSqa$%zY45`>~h)$(s&Bc*Mrp?w!5TFQplL8&q@a4)B(Myr4qxDKvR3}35 z6ybd^b`?(ej~E;*+4(~avLrZ@punBGpQ0V;x5R6VCuBD4jm5m4Nc7|CYjwv*4xePX zlP_H`blIBm{ll@?@V>F}{i88il7t}GzF2qg6xO7to6K=yGCc(*Kl{nxJU?Q+^r;mCO(I8PH-yW*YReVTZ zU|rH$%VJ2-b&D)Gb)Y~`&a=KGOj$U`$o8SpK*JJ*wK`naxatm!3_cv4qTD_aWLPvZ z)T33+_zGSW5nuN&3>e$04o2tx4}9pk58gj^cxG(p(V5|McdF-ESRDlA#`6!}ef$1{ zw|wEyg9kS5f6tCF^#aKZ;SavWG3VE443MRHnet!MmMKkH$Q1htWQwkH+47?f2~o=c zDuTW){}N-^kFEx*!A5&N>L)Hk6ykR2{nAHZyL>_Vx?E8EU4Yl~EX$p}kJI%>#FOn_yw|D~r0W8HY;Z6@fq5K`>E!_)wn;ot{;CwQh@19z=84FJtzXK=N4J*oRPS=#V zZy+&p!!38+d;ddp?eX`ae7PFCVDA%6di&K&=@#IbBgZbj>fImz44t!G3ko2+)4%Q9 zr=P)lNqNs*_`KL~{RZcg>EPwp-tj)VYuVFS|HXITOENy?eA2UKgYu=X;zE71tI_$; zXGkrK00M!OE7%E|y$?L{(Z}iP{h$ouv7<#xpaxkdo^x6V1`*Gv=9v_`rx(QDgbMKw z8WvW?;zN&*0^djn>U9e@q!$kPVxkXPyu$bgoOu$xlM!|mwYEC`iQ=tc{(LXn z>@ReRIJ9QvNMhCK(rorl^}g-=)!|%LTAM28 z5_$GV^~B$)uh&^!E*RR&OSx2zZn)u$_rr;NDVt06F-8K>qIB zZ!{~gFHK26h}1pRCiZ+Mttq!&mgehpB=e~YTXWJkG&iG)&W@_UIO-Tm zh)GRKE2PaVFV$V8rX(B9jtux|K@Dg@rM6aYwfQKvK2&NXaubNUBiDf5h?z0iQmDRZ z1Y(19vVxPLNI#vNDm4nd%jx6{PIh)LrIVXV_1UVj874i_ftxmy3$$qi?DEZ<=y3BY zvbwgQRmsU_xiT_^=Gc|yM1cQ-{=qRKM5xp!98`1yoUq!I5YYf~E@hn4R#bo#`0`I| zz%xJ}SDWh{(lj(SvWe?A(6_9g#TRZ^Plp>e!F~g*gVNcEl&HGWRw2hK0hJdBr3$F} z0p3>ph)68c-HZ1S22D9#9w=AKe)ZL$zA}E+TQ;b#8ueB8Hs{?yArnF~J&+!Fu~OMz zsXUL!*6=szzc)Y1UtWw&PQ)i$b6=J8%b#*gNNs*zSqR_{2m4etn1?W3OUv zEtuIsi3%gNZR8AEzYv)y@Y-hKvNCL90i;MMcHBYGQqd@k`Ktzh+K^Az@@OsYH&p$| zrq$AUrd{`;+1U@R+wkD*?1PSLCa12Qnz(jy>beQd&9~in%k8({a%1rDu_H&09X<-V z{;B+#xu0le90tGP6i`4UqjMG6JokdegLB5Y44s3$F3F!^EzJz}cehjrD;hc$u{uCc zR{SU|Id1zB4MB~y-u2#9m(AEOz3!%WYHD|mueWU6h`+bVX6XrV@}$sXpq>OZAbO)A zGNBcl6%pTPfeLTfz2KM>b@n`;i=KRbVhg4?Fh_ppN$(F%0?P43A@8udJ2V<&G%%$% z>$)PAK5MX8)mjkBwTC@cug>W6Se;Q@#H7`wd^VFQP>5N>c0dYv%u2pex^bQCzmw*ce|MewOVFcEQ%!*k=kf{kKY!kCt6qRA%E$_9uoEM!EY02L%M zF1T>@o=T&GgNi$-xCSO7Wv|djp%Le)t2hA*ffyuMz35D@%-{whF9Q~ydihk4P|0Az z!{BIf6;s0y@*XE zhAQq3i@~8ccevT1p+tPhG#|YBkw4@Qw_{d09;2$I-8SzUgT-Q4?X|npwbu5b6c1s^ z|8mcFHw{~y?a&p;3y)i|AIdZEiHD_!q(+v;7sMcngbL(_pPV|3XblE79XE|4tPsQ{ zUijii#Fvp-2L`k}cg6^TO{gv`{~~wv&;_}nBbeQkjs~|V!0%|8M5S7ANeK8w5ra{T zsE(Ys9&`vn+gBxsfPtjcfaX{jOEM2ImKe%KBMAW%BT0kC#}PPUT&K`7&UozzOqGJ! zVAi4GW5}|BK)xNd`gA0$My#UV$g1bd8GCw-i;taM8}4kq-Wx#VihcjWTL%ql+)Au7 zD5gYNHMv0Csjt-}B za2dtzJafO(9*2K_jK!r!6f2HgdJ$qr%?-Bo7+S~1N;ael&^7v8Qfo8S=1!r_c2ydO zaE9n`8=6B{S4b#h1KxQqEwP>8N2>3{U+DsTQOnErV7qc(~<$KXON_4ySix}w>lA+=I-?g z{ph9xbZWv`KR8_9Nfc?AI1*iC)eK%l`60a!Vu*Sdq#CU5$pKQTY2j+*@(b|w0nVRI ze~GFs6c1y1Rkwsta8$J^V4<9N)EUFV*I}aU7kB_D|4Sp)`H+mSd1ZX#9)@iOO?!9|e-#3%PEHau*94Wfj zb;Ys~xg6UtvfH3F&D^s(<$ig_=KKCo%I(fheXD%Vj!U-o+bbg*r}H?qe4C1`SYYUoQ3tzI1o`Qwlq^W1BiG4>DAK9-RhyC}>Hlk;B0(l(O} zt*SP+aP_RL+z8!Gv`*xrBTY^qQh+%s4I7WL*_@CUYErL;+8Y%dD`N;9k5Ld^8Ur6? zGrnUNDt5@aL{LRBp+f?8z^2$yS$#hdFH?sMtX8rXHJJ8u5nZv6{Gc~a!@@(#U<~Z4 zpX*SzLw*t!WgV10uzTyalc=sETM-3*+t<;%?VIr~Q&A4!gDegNStL(z7YR-T0V*ZF zgSLVlfY>xOOV2%jFI|Wmabap2!ZYSPVTqJ@VTz5S^Hjv<6T2^1)aCSm3N=p;jPh#c zMX~_Q5r>gMLgs}*6r_;M#bhW@E^`aneiAsYQbFeQMBkXn*Pl6BDPEYeSY)#{xHh_c zZ#H}bj~_+@{Z?Bw7LNLz4rCXszDy`vo9YPo5_cT$DDzwP5A54LzT0W5g+_WTk!&!y zD_gnxHnV$tG}di7){ZB>V?5V276iMM-7>JkE*okWyCNO-=Y8*K-|(K)Wg7KMA=ioY=abx`Vx`BG)4TE zN-u1nUY@z^rEq_`m*$F-U-qg6L%2a2ptI5#ZW!P=f`MU7CfopILg7OwcHFZ7JSHAJ zl`NjH$Hoc)kCg#LK$HZ+kVHWhMQEWOa3R|V%HlGt&0tgw_T_uW zpQRND3u@_LhF0y@#y9)M5A8T2&K|wDJDBcP-w2z4@Z7&atbA7bkvOrVmzDr* zLTju*WAEnYn!da`_U7m^55~T)3ihy9>T5CfpuhvGK01@M3xudMnVsjc2)a#qEX2kX zPzS#KOS^K|w`u_W@rV#YUUcNp8pRhuoC=Ya1Qi~gZyn_kvvbS9%wuQhqQW1HFw zU_-LYWi+|Gi%&R=hU58|mZyJOZwh2hWbhqn@+n#`$}eJ#Oi5cBtCtVz*T^3k<!>ZG)R zMMUj|vK;GALY2yL8vZd9-!XRp%6T&A#j0HXs*;^p0Yv}k2rjVTUy5D@Q<(28T018tuv#_guJXZEB+R!->S; zmSI;wFZb&M&f%?tD>q+obluVSpTFnc@n>oY4RXb(kNQ(-)2BbZxwrM}@q;_K zJvsvj-*d=j{(T#}A@)09Hv+U?+*nY+KDoJzKol&f;;w_KKs8$>P6jVQaW&JrjsS)< zO?)nZZ}?9V69&Qp+en)Tv~P`&lC^J!`qKXhi6K~fq>IndFY{c9+{kO?^$4d$PFDoK9pm>*z|~J+odDE zc);NwYvQryyAw7dZ*{2SpcIk_AW>+M*&q?fq%DFyQPUwU)oG%Ew23Cv zgJ>KziwEopFsCz~hjy#^=NWkH^oeuD+-STN7$|Pu#vaSlH04{b&Q6T^9fA18M`(^b za{;bPb~3Zn=%YDW0?U97niakUG?0*h#fMxcud3;Sdo_Y-tFNs#hs6zJYmmLEG~H1{ z1)}f94Q}2!+>I%2IuiUWsE%0u+){nuq%sA|V2YdCQ{2?%yT||*5A3)T>8Sxw&U9dp z0Gn4Dq-<$w4I-rp&WufF1%_r5fSj9F&|q&`2N_zyJ^U4GaKk3S@db`Jhs=(jMjZ1=3P9 z?p2=ZBNv_^jtf?W8n;_G6VqVBk^gDq{`~ZXj=&cG`1sDz;5!1L>l}V>b$i#qjiz9^ z(=ZzK+|c*A;aW>WraeP*NUQf%cLxsr!*QL>ksupd&y9tq7Gg7ORGwWAd*O*aFaS+FMd=U~mf9yqG#LS)qiMA!!cM-eyRc zharyL3aK_f1qnxB&yR5Y6|Z6$aqv2o)i}F)lBRYwN^u*L+<2H=f~j5YAh@Zr0aLpL zuOXlSPjq!xDL|%-AQYqMVfLdJ1focZG@aal`9&%kg#rm2n0R?1;%acLff=+omBI#0 z_!vdLXGvKuOg7Ca&8*;$=Y0^xMDt)wyZU><5x_*B25#kcB-^`kv(GT;kM>*{TpkFm zcBF19Z%Fin9frgzDrDZ@`g9=}EPSsJXro_U!JzBn@3;)z`AzX?x+m(h`($4r zAF~fpwH9-=HSQUp*w=$GyCa`ixsJy&9j%vS(z*T8|CJgpTE-}YL71}P;z&UkkV%{h zQDKap|v48`G)6KGK0|JxN!#jgejzLGZ8{(U^)h8XCrG#)f)HYA?V%;w2 zGE&Zj(dkij8MUW5k?AZGzmwucSQHy75C7Vn^#V9I)P^=f(J3zEA(~+GDR9Cgr;}o+ zWfw9OXH$V*HF_p`1*=JO-qNR?s~&=;cTR0OxTM49 zlaC42-(o}f6)vkY;qcg&4vo*ovWAOxEL*=<>sXF;WF$sptfPME2coZI(<8>38`&s- z23Dk@CE1_SQqBNob`Ls!VStlfKEPF>K$9G2oCG|P78?)){^Bmn z+l+P!qCKH*P0#g5bWUsFt>Zl(m(aWqvR#s%l^Pk6?JOTa0^Sk5XFXVLi#2Ea42Y{J z-8yY^Zgx8}dhAr)WcPw0Qf$d2&nh@n#hIyFGF?F47wU&PSMh9Gfu@w()geTqIGDUZ zY#ael0ALDE+q|7bVW!G7gYBkx1hd3x+qi&roINDOcbqfDcXpz5e|&KSC~{xlkvrOQ z`^3c7Oz_O8Pau1As~AV(UAP`{+ehO_nKHFxfRc}7(tuQEJ({X4=p=yv4MkaV%mSy%mMm%kgwtf<_K=R7}vQ5;&Sl$jNp1%j4*UIG?Et#5hg@ zk+Gnl7e{J9z4`d*7Sedmw;~W&h|Qe8%u}vq+Q!ly@t(JfzfjiQKp4Sla;+67DO(W4o#ub>Y+8??A+f=8>!Ih*6riAcxZ~D?Iu%j@1R>R9 z(d!+8r62Z_H%9k*VHGuEoYNwPN;#f=Gecp4Z>z3%Do*$TDE{h%*7bPpq(&7hIS-un zjDsL)k0bt%D0QtS+{%15LiHR(a$?}nrTc}aMJ^TLzK0U zzDAU5#Ap&X6a>J21UHm;#WEGl)?wh02e$$rwt~;!3Z&$et8glM1Uhl!G0X`1re1^) zj;pa|9l8h&D=UyEL2oZfIdBnf*>VJ@b{^vLTi@=iuNYQ>wAC#^hbbr0bTHzG^6Yx|66oa63A zu0hy2?;4oAy}}sqP zT3XowJvL18cODLQz-WiHzYYz@VE%7hu@2_{Qk+-~^M5aG2UOtGaPaCN2Q6qFXK1C; z1EO6*x((=)=4Rm{Y$nbfY4ciK+ssRX#16rgTLLNChL>*-r1Hq`$U<_;`1CSo#Vtbv zG_t(DC`(GS>`?aLhCz4>`|#@B4EdQvlPNTZSH^bWHS1D_&x1S-?tuhVA!6%x-~hSa zjn4XJ_=}V?s4sQmI&N}NJHjditjJJ(eVVakjbK<@rnCQjdUX621+&BNdxKI7w;M|1zy|`~~H@~kkH^&&hH!r#7el35|VaQEO zkKlXgyH3B>`}Wt^fw#XVJ$%Ns*ZKG5B-gLC?JM)&m2=qrJz!{wKePDz?f&kwoa;Kv zxz4kkE6$$-7Z!Vv##sI=dqR`o-?4D+GiN#X>9d^s)LG6wK7VeE6<7}6ajUaamJtV< z$Asb;1ME)rIX>3c%>9}D0QYF6f0TZ>&`SdM#Nx7vSWp#NTbqZxC@pKs?gKa)r9c&&R@zfJrAF|69*u|ix{_WvsUnOd4ZC%@2mk}3C zzfNw61}`SZ37tvn?mA(lf90k|i`)y*Rg2yea1QbORD|nJJ9XYXpriToXV_~$n0Zh} zgOeMV)pox#&+Uy^>sPW*x(T*x2IGidYdqOx!sA3i5`0XxeF^<0L>y~gKi~y^Z+77P z2WNiJGT!v%{)=y2z3kD~uyDZv^n0e2KMGW7iF$H*$$CLVSCpIy;B+HSW|~Ck!=}OR z&4bj_z!B9A-bzxUv|%&ULl>0LyiZ0zEA*qJkONW~Iv0I}4!a1UE8tv6icEF3@Ky~@ zUI40uD71$bqNwZ-aMwUh&(WCZ#fe%rb9itPOopYzjLC4g-?4cd`bs8%v>se4E#K+`Fan)5CCA@ z)FC-3_{0N%E{?JU=ez!-;>G6e<+i>TlPXwx0>H@B8E^Wk2jC5`DgQzMb^!oL8G5$Q zxn%Wu*W7zidf@+2_8oAJUDf&TzNg-M?;1%nnxYwLG@4$w%6s!C(kZ2t8yW;6GppxIjo^5~^4Ff9JlZ8Er8T|9;+)uAZLW zz4zSH&v$y0uDq>hZhzk@*3%ij?%?^?=MwR(Z~f@x0?w#icz|h8Yvl({88KtA0WcZzrNOn;S~jKYGu#$KTv1Pc3l)r{Wnhp z(M8H=mF8v+gWD-JzSWz1AEzxRa;J{Kp3Di)DeFO;#tGj8Uz-laE0$D^?sNHpYc^V* zDEW2Jl;Sl17y`X=477#3;25{QW5^3WF&zVQujRN`A_o*wWPY|HTB`fZ52+GRyp-?& zExUFIQzHa~Ot{Eoy%T@^JX;oEfI+Ng2Li;D-~p#)1};tXT0k;2mK(XUXSsfO4+|i% z`Sob=k>nXV9ICZ(dW?^~()i6AbEu}*yKIfSn5l7t5<71B&i>xsc%3N~OKa{zV~fT= zwPMCZXI9j0en^}{j``b#nuR1CIdnKgf*Z9g#QkOXFvyuD*y#ufz-i&VQBcxKU)2>U(>Iw^DTw;U1!{mlg%VaXASe2J#}i zxi_X8W*PT)dC_YL3AzSHRUkVu=I0o;0#bDaPCW$U({d96CaTjx!3*x$>VkTA!s-eq zF>68ATH(q8q5u}AD)Cew0Cu7(5ICzO1qqp#w}j%Qye(FZHQ?30+zg{sYMepcWBZQ! z4sWqUCweYiXj$si%~W}Ye7;i%)*vjRZAHmP$}J>R^#@?{J^AlqHl47b?vdO7tOD_e$Tqx3bV=V zlH9TV-9zlRlUriN>CF7*3G?>zcCFrP4&An9x7+aMTUKEWs1D<6>eIr~}5x%64j%Kno% zQ_p^dJ=2(JJ!^iN-F89a-|?uhJuJvwny>blq~W?ShDL%t1^7KRN4%bC8ek z=hwr6V{gH@E_;N(Pl7HlL@l*0dxb&8E!5lxon7RZWSa!8Z~!P1J|Cs(0mv>+4~R=e zk;s?o;X(@PId%LClPen@o??NN1N0z4lpXM`a*m>~;s96MPKPUPM~rF%FRi#sVWz;0 zN#cjvph|l}vDE3PrQh=WrF8~wDf?vub0Z|lUop3!QL%5o zE|`Ut!X{x4XF;mzmM6CKra}0?CIv>oM(`4^5I~G|vr4B<@YFt1@{|SKS@|yUXAD>CZfH(Hn!yNW0(iu=)ApD|#IHsqGuO zN{0@Oj~_bZW$taqZusJR9{T*c(Pf-n_DkYP5~tIz!B*)LMp1JMESw%pvzkSvEEp5L zroI>)@rGKDSQR=QM$I43sIns6hE?Zz&j3<3+~i`dPLY&_M4{x3Dg1%bfg~Cvuge8U z9)MR;y9{7C%WLp=idv^3Uv@QkSuN5tOB4#U$`~S+Xq+KuIg*}r76tjhn(qQl@>Q(- zIT}=GGRH}wT0!py9Jed@HGf*a`Ki# zNADdOC{@OvSD~G+$+w_#{j}EHZ=orI2Nr?z3|tcKw-DgBNE2l(tH@Mppg`XmmE}e~ zV5H&so$#}M_8+9WJsB;7&TaMESFOl+!WQUr;UgnZHLmA1Zd6g+8 zuTMOa`rI*nrX-2K9Nz8m^By?f^0CF?P5l9DJJEeX<1%|)XkXS4U$`pP-O;^|*%s7} zIE_Dz?c9*}^=6~(wAVnEO(-9XJ1sv0x1_ZRqMPx@K!>Z~^ZL3f8zl>POo>*zM!aBV=eXeZNw)i2`;&ZZ3m322hFq zbchvF@SDL#^AP>EH;G~>XOHVps6o}8tcuuliln%Kv=^NG2;pJ}V_b?uZs?^nfMy|E zperNx!9_MDyyePTsU%&Si3fgUKhXG{3N8*Y{dRYvtMR@oUl1R3i;1yQ-~8DUm^h%F zo9wdwpw}(BZ)^OALTCRi_JPjK!kqAT0)YC#;Q$_9o8gYpnK77@B$QQ&%*(r4fS7}) zOXn4TSvn*9NYc3n!gytyFcuVH3>i$t1oFrf5f7n%*M>(XXmG&!IJ5YADpP;8>;>_- zu}Dg(h@OLr_5lzXG^fZ|Lis+YjGa8HE4<0?^W0*#Y79=FZTooN*k2Z>8#aA~+3ofS z0zG1=*myeP%jVV~|CZ#ZLLVY(;5(^H3SrMGT}1o}g?JQX>RN_u6qV}%Ey2#L1X68? z;>_DMFUh7X60Va|C7N_)EzI45~LL7Ep=)Oo9Q1szNbR+RqlQe1Sa) zs=4ZsPwYO8a6Yy15>U?SzJTay{0Dmn5l`cXT|a9lpT>F2u8>b-wxY^Qg?`2$E!R@t zQm)m_fr3Uj*BC+MSpkSsWMwT&)P!yl1SH$pE;sA(HKhpjTl80pD=X8338O_wP%+#U zSvuV&OHq(SvXnZ5K$flr-$GjV+Hqo5YkR@0s0L>`uNWm+k zJ_$LCl?f_Hs>YQDhp#11ef|;zg-Ta;D(K@lttxF*+5{><=FcTkH%+qjA%(=e+s-@K zMrD6&iPU$jcrBs2xPHYFkqw4^qfptJCB^N8+>)zV>2_{gl*s?xOX3t>Okzh!XdvlY zbCHP^wh94Qg<0 zl8_P);aU@QHZD$~rt#y4ifE!q#x)Pc4_5@UKZBip9|nd0E1LehTwY^S=v^!(@*$_M zXfea$HJEfpao(xNE(-Bf7|>Z)kOLi6LsNDe*Ps=BJsbwMUJk>K@$?wR9IU z;EN*1rMnq+g&CdcfGo^=p?G1|>QK?ag9Ft>0Zq{46pV=+_&^@5{!UW4{|-=b+)+(| z4-nkLd3cMuDR^e+6@WG1&XXm0w18JftRMlyd2f8pMfoG0wwC{?MU zbsu3$y5PH^f>8?+{pD1YUj??>vO_?<+E%SDl`l{g6R!z}HbQnD%lMNizb}zw$Dep$ z+gtiv$Nr{o)4JYUFL{5(Z}b|I#^clXeSzIZmn3}t)Wo}UOzph=S#@Fl_0Wys z#9+u{9L!&`ees|t;_C}K^AmUbT5E#CO8w#m@n7IKpAsGvYNJ>IsyiR!%&XRs8>T!p zs#u|(Q%YZqn$gdDPBCFr59wh?+9W~>R*($JjwdMuESFIRWpUt};-1Z{S{VXMS^Hltm`uYuC!_-F};e=>|&!pMPmZG1vH}?cF+GDp^o1Ni%n56s8yRuMg+G{J$V{VN=7MZQ)hMkU z@6EKdW)Kg6dQ_K;mwNWG0s%6#KwH7U_(3ymTctUC_#VGE`Za&JI5!Y|SG=73L8s0t z-s>NHdC0r4;0oHr%N$<6`1YY6Ugxoy49sTN`i6SL&t#LpGpClYn$Lc$!(+7DjqV(K z%TTN%*iLVg!chegi10I%65N{I1)WRjGE`+HH5I=mNF|K2>J-5MQPYp=5QOSd-;XN3 zvE2Hj+K;+vl9*H%D<`3KfT!@zs+ctz1h*4Q4kc2j(+es23Z1Dm#vV~f=8~RW`?s}| z&4$FT&6XDBC`86dOuSton5#1z_O#PXbVqolrJZWz7O8z*Av9W>Wg0rJ^sBCdh6a=r zwMe{=*2Y3KWaegQ71&&-lg%JNM4_Sq`1|bssg!_*wIQUQZbD~4&WLOtz#3_llwzV3 zr!wm$DnVF@uh$Z#=yR1^8?_KiCQ50ellcw1?&xjNieI;Dd^4w)C2DExJ&joQ%(BZy zmI)@VWyMREiRPz7GHpC+74axSkvf}Z%EY5UGlL4}5+qpc#d@KyvkV?JQIZSbQDY#Y z)kH+J5TGM@l$x`(QPNNm00|RNM%w6U5Mw=kIB4@kRehkUnm!4GX+$0*=dT9-qW=qp zDF>`YWo_K-ucNfhr!%y_n%a(@gSC;a#&fyZpTM_fh;Q+3R>@Mmtk7H{jYTZh&fr@> zi~`>p!-Ag9w`K{et~w4UTZ?b0&0{#`iL|Omp$tzHRkFh}+=-GYhZ7YR8tJ$oUYQH^rV<{n*`~1s`%nF%l3>?;l5;CDTl^$z zd@p3z=^ZA&DQpO{$52~brgb3RwE#LY!*6|s;+JV_u?L_XJg}Zh;@t(R7~+yHi2NYl zwX>~p-iZJ+A*WW2G9Wrwv+%H>1;wOX!9=ADD&Kr$P6C<91%;EJz$J8wvNOj;7~r9Z zr7?lG>)3)KFrV)5xQ1N|8#^dLKt(!PianVQiH-nJD!+}hfd9np*vn4gU5ej8?!-=# z1EH0A!sD7DW&4n;<@J!ypo(7Eq)I2jUw|&|I!Qhk0x3=uYZ-adKFQWEcf;_ZV91z5Ag-`pJ8F_XGA!r;DfcAuzE@AfC2NW zBZwelp>9(56Fro}Tmf`J3c(TQ;*I`XJXyj;wa?u0oep!|551p}RRMZ+QTB+1r!cD8 zhq85EaL2Y?)gEeX;ei8uOW8MiM%CT>WKZMHrA>W3o?k+*kXOW?z}~SSJF8c?T*2y+ z^{{Tzh&G4dogH(OO?U1S3wib`inpL_L-}846;<(Qor-g6P6CPs&jGcWLMYJmh~H^ z4vppPsiB4W4G(^PVEe7>I`8?!-{0HG=dIvu!#@Ds{yKHuXq&5)mLLjWPbH(&*U}io zBBbEy68xlI0V@)e3#2Cl&Ya6YWa~;|>IlViqs9n+9U^;YDW3yo5y2|T4kSp`C6m?T zg>gd*0Eh}K0DLqQq4R2!0Aix#!^|YCJ4_oT`Q(d6O!!{&Lb*J{w2h`|ZFzXQ@wcXH zYS$XOx^y@0-g~_!4Uo8@UCC1+F_H(I0Y3r5yD2UBXD`~ zW*8&^|9Ro0oB~Mz`oo8*s?J7e%-kjEUc4z!9wcg(5Q)3odyW&LlyOpswmf zp*%JNnmL<1GJlC&$g;<(Xm+1XBB%cS>@iL@JMQi7xpzB7T{pd{yXU@h&`R;F=&M3K zYv*PcC<427c6RL&%@Ec+MBu#TxvMhq8#+a<=7Mj-eJ3~0d5=R*bz!4 zTH)<&k>gju#m?RUM==+SCYg58Bom)Rclym+Yw$r>ts>>5& zkntvDPQFdyjw*a3rLc8FJp-yCfB{HPQ_RwOx+B^RDeox}#0g}3-6_!k0ekQ~<|G#y z09cd-H`HYnViEH0#54gdwhHn{js!TEkZeZVb;_mGQa>Lj7KpdVCOA;H6BAbs4*(e? zoE#E^OD+u{*p*94k0f*{`)bPn*nuNBU|TKe(er0xxy8lwSmVW!@P-YMVP@#vx}_*? zXuK-DeQ}NLwow02E+oBf$jjSUYm-x^A$Ivt47py}wWPl_bL@wp2MeOZh{99WByVP& zC3kI3=>pK9K%tTFH=!ucaw;-Y+tlpw&rIQ=mN0mCGZ~mrCpPSQS6)he7$IwzH17EqNJRD`+(y0%wOb^Y?4X5WGME~jOjcfK_yDQNhy67U7D!R0!v zNG#cj7&!@4sD5#Ha|Ah#tfLbcCvaJGzJQSO6bT`UxDUAPQc8zZ@z}KBu`rh4*a4#< zM@OF~r#Af%C$BuOxV|rL?wnnj9a!v(nXd?BO8rAgdpLaU;rhB`j^ItZx)1Mi#pAXF zJOB14SnLV5c<+b1rnWA2?!0w2)-}CtW3F;wW+)LbO6kzt`4!2<(t!c9KW59a)cfy# z=a-)0XD!&wiBqTxu!0}oryw)%5_Vn~1JfSav5F@HC(jPYMm1lO%_N)9%Pt4m1T7M> ziAr1z$oQ5C1OUN1Cnp#uw2xYnXVWFA4!D;HhGHU#4mdP;_N)zS)`1gN^H5drh-?P! z)NCn&UqH!#hqRIkAv;4*0qfd{A?=Ddp^fIjVo zK7AQ#1p>mD;(c%R%JL(5l&Vu<452Tp0d8c{GRfKCr!9saN7F&NCnNSy27Si>HLW^k zBp7bA_ul+OVe9IylQ+9F@eh3J(i?Vdjfxj${DI<*(f1BlLkK@Jt$5L{wfnFyjB;++ zYWB}US~#p=Y1KS*+yQ8UW*1dI&a_OBCXQlFB2RdVwxk2mfs<5{&C3vV@Ykc`3Q?sE zkx_tJ;TeIe01SqdtELk;9%1`46PM==Ca~skyyg(0gsIBYEW zL%E=TT0c6vxLN1vO-0zFLC4NbBRBP;=}{=^^;<*vx6MU+is3W(`GD~Lvyj2sW4!1Z zYM|-#0a@261^W~ZUQfgg8L+J$z-MC4d9W=wW~tFA>}(<5OFXNs*=QCvo2Lh)*Vb~h z17lHYst9;6K*e$HPNn=>&tJja+u**+r9P&Z=X&D#U}T)ZU+A`~3_jYau=h2qCA7%( z7CN*Ww`{!TUiKl*VtPOO0@O->9kcEO8Ss|s_`a<*oR4bK#@x2&>3{~ zo;LmA47%b_s-UZSUvEy;7KpZDe~z}e-k{PJ*Bf4gwn%R{gSH4oOr{e}?YRK{+bK ze(P?9x-^Kv!kL6F?tqkKRd@yUNa}={hFB{KN@Oc$Np3zrvX<(C#^m;Jqcw%|L&%{a z=Lx;lFDOPyKS_Tz5Di02(&topLEQ>Sb7G_M^878Y-*xZ?YtM=sH%ixEziu|(<2Nm4 zA_=y#FMrAYBX_;`hTP68_O3B`yx;op^|vR7hU1%$Lz;0pl4alGa%7)S(-0>~BAXBs z?5-=o#k@Ja99HEA<`Kg@P$oke?lcdoXa`0Yp9l9I0J=k+N0{ajQ09?2V;-8Nd8nvI zESngdzx;|_=ihA(mR4Q5Lb~DR9jgY1MtdTO^?muf4qxzww_KB0y?5(E+2D!%^9Nsl zSJ#ZwCv8@V_dI$MXX91WXboSzgEpmGlPc+l z9tYSSK>p#ARV^Z@9u=r2`n2{8TQcQ0c1}D)X5d{pLxzc)Iv3t>^xnIU9J~dO47xKlhuQaWb`r2#QOYapab8e#f%F<5 z9u6IGC2~B%AwY?k$wJkFe)qnYWF7omHM50e6bCm4x}}A?*DU}7;T`tORBYtM1SEKt zYj!7G%e<$p3!D~OHU~`eI+NZcJd=Z2QeaSec2F-^wGKv>3&8OSm zqxTdadu*%S?Qm~gq0J1&p@6ZA(xZXKKO{aP`jTOdBNP$$mb)TBZ-CQN96joKxDS1Z zdXjKYR2j1|kYz345CKA5;NC?6u$T2%Z-7u+V#FdU#Omrghp>oU1n>`VLFIms9*`}- z@LJv35b&USAR@eBB0TIAP%mX0Tnto}*yViO8Hgo&%bXBG5Qo9)7`^YB&|BX|L zjl*Cfj7&QR>N}q%dI7(|o`Viom&v%U{{CX`qcK<>9vD~Vz@%izt8_z#< z{WaS>onj(W45Yr~pYETYw8lnr*NVp--mYlqV;L3*db&HxqkGB+Z@Y2-<|_@NC)Anq z41^lHdlyHyPN!GSbz#}ShtzcgAG%Fk5a0R*8Vfe>WA8^zi{0`fdx~x1V}!l5MSKu7 z`TgP{@j*U@*o*Lc@naaSKzA#p~in_(*2oRgF z0lX4_`BW&F;VBrNN-3yQA+tbwcqU|C*im{{$I!0LzKc61%NGXXVR22+> z*ZAa6R_lvYV3^&X8aP!JKQq*cSyE5aVfJ&Jl>|kZ93(f9Q9&J`CD{jc0_7?` zrPz+LDo{+v*#O*~z-32xoIu#!m=}UfH4AU6U_p$6bAS*9BLF3ZLMA||$^ybKb*-~Ic7aEX?13fwbT02Sh_M5$m|+k6U=vPb$H$EEl!_b+|Zxgu=?kj zpvK-g_U(iI)T!shP=;)nWquYB7I^iTUtwe}9D4sUBLgosoRsz0A#~+2@N{7VG;7X& zIRG9xlKkMjGL^+Gv#USDs?NoxP8~Z3lUn9cVLW5aM{Dg=SQGFRCBjfr*)4pm^psd< zJihvr$p7K6uS-wK>&oqCJmYJypK~yuQ>V_sda#ZW#C)z5-w7LgR_S+3`Q9}jaUP1# zQ8Q6k+0K)M#U=$%_r~1^5)v^LgWHQhM$Kdlc`FtMFL$dWf>=_|M&qHwJvJu&3 zP%!X&aI1=Vo-nTggvOvlb)Al5QRzfH4?3C(9PzVeu_D$k3?!49tkleQtT?} zAiMn&+9m_{KnWd|HbdaUN1a_`xyCs zfWx5ywZIyp{}t#BH=6yF2XPnO{Z?c0P@KK~l8?j}Hzxj$pA`a}_&nrG68Iy$gKXWU z=*@tgj9{nX;jf4JNKH##BLI^4ok(+*QRu>|=w|4LK0~HGovdkrO8@;lmggty3t9~r zUzHVQ3$C$nBqrhw6sz}g&B2S>M=(z+PemOd1xJifb7*_uh*7L}h3ipJor*MWR&_Myc9EH4=%5;J>T?b6_T98*`2fdg_l**-ecRw8uht(21PS4Q^A%H0;jY@55 zy9Np+EZPJZKjCERoaiblkD7C}w}eC-fNbYgwbM~6^IDg2Q@auCUmpdvf66vIc6 zj)0b5=D2c(m-Q=>AAE_r87CC-Lh6^o-MsHf%Csy^B$vLs=WsSiG9{AzZZ>eXT)BRD z5D3Wyk}ZuF!ak%pAWZRlE@H4wi04ZKprH}rYf4Qa^*&T8Uuzye8pc5_BPueNRFwc) zf;uL5!;PVhqy(HIEuA7{098)b`;?9deHCKuW%F+jE&0&OstkU=bW15#HWL`Gkg0eZry zWWG}kMzsBu@g-Ex9(U*R)#b(?Zlp&=uNS?^HnPqaQp ztr_suX~8-8A}u6ae{WP7J=2J_-H#xY&i? z+ELuHwU-%&BVo*KES-zZoV%Mi+X{HXkv^7D(GbS?Eib=E0f9eO><zFgggW?5&Za7UNVS6f1am~Y+7DZh{ZHB z(%<}EEw3T`$+Pz7sdVt`{N3}<+Ib)1auzsARY+jxsQwwKkK zzvJH(m!9u9e&fe{%)9iv7hvp*e9Yg#efYXuhp~6@v8ZxCbb=nl?|P&=1RE;po)(~s z%NDSjFqiRR5=a1cNyBAP0GM$W$x`TDTU}kO6$VML6;S3|oh!&A_{!V}jm%AvzX=6& zy(iJWi(p&^!Npb;YrPyPwzr5c04X*B-fU1lLv9thLWK;qlHfzFek)`$CCD>K6?Ad{ zhRKO=dXjQY1ldA1YLFUfQbJDJ1(+c8U@rIP6i&tSk18JO`vDt)H|tVDzonwTjEp)y z$gPJl=-JTMk>d^10@@jMR!kOsZ2KK-`hulw=s_WL%k<)7u0F^5gRefO{W`LhYR z=9BDW_{~0j{-@t>{~qL)AgmW}5f7rT^sMj*Y$KjSh#D%{59f-bP#r@k8?XAoDCW3H z>~_9%LUJ3B+nRx?mmye4Ap`pzd7%{JaVvd1CXs}Nj#FqXg`Qt8$t&x9|D zTY6N`F-q=7pc^s_R8o@&Py;wpz-f!%uftV0^p+~rRuODnF%*}=09>5;eH<-=Fx+e! zZd5Lz1d;jX9#n}5modxYLox53-lTa(jCD(y?#LKkMKeRGlw;fYt}9b}ru(O^JNnqO zI)|xua>_oj{*KMjN#p97WdE#L?2TKDE`vB@mYCM$inCKNEX7BMh zG%NbT`wV+YF3_6p6t4w3!8HQF17ZL2mb@0MBa$`;VLPYk=m}{AU^xr{vWNXxOuvan zsh=@bV^Kb49?O{LT8}JY8EH8S6sOk1R+HnDS2BpDa})HG3GJULrC5TB4&#No?yB}a z&m>XuDqwU|2^uX5x@YP1bcj$#55J%&W%`dkwtw-VH(^l%k*dch!* zDXvX9odi(&FwW^)#S1y6A8P2J*WQG9@_;Zdd|9X^AU&(@Qa!0SCUUTQgVd6o^o5mY4K85z#sMRx+>B5R976e>@3m8R9I9}GE}a`)g0)fQT1FZ}nlm#sCrPS#mS)f7tQTe$XxF?IE?Jb-GlNwIJ>}`p#JMB-E&4x#cQyMXtf3D9T zo!=hLKbH^At&oh7o{i1ceqD+&vk#roM? zGF4vLo5&^r5vbHD&>Chyv31pB5Gd7wuS-s3e~3z6l!g#}C0UCFL})r&AQ00N-F9ko z4V)}8PF!H@NEDGy!ZpO*2fc6~5L2Hf?@3MK$lVe(c7UfH9t0F=P__gRK-$tt+OkME z>SO}mTlk&P#{>!SRS&rj06jpFjeg2NRqQd+$Z4$@KkwWd*uIL&Yt|y+vd+{KT)A3u z`+C9WR_RKt`w?ijpBZ=Ah#8fcA#8V&11-Snp!`3%G zkqSaPp7%w34-dW>jj{L|N{BN6D`hivOQm{u*`9!Q+{afDk(xMk1tf~=i5jV|lB`+4 z;Vk1h5eyJ9Jhj>MnS=`&dKx=u-+(sOz*AfM#3aAV5TZ(=ziaA|@v=q?bU#<{ zrPkTXrbyQh@_v<3tk7J1(FLBN^ZM6&?9Pa@qw)Q&sn1CPTfmVP-v&-#l4cXA%}>(a z#QT{c>tQXHk?cK-eUwUxPP-3h1m9dJNs)*j93DJG60mnARQ#@GOv#v%1t8tjL(1-n zW}6=!bU@Cuaf2(canwdy=fcKS3UW83F)Dq>ODcAT+=;?OuJ%Sxq6CI0ygJvOGu1}q z#Ep>20>4>xB`-9nPJ;P!mydy}qntc2NX=8J>;N){%3wLc%0eBybrj`@5aBY?)uyLBPrV14+fi{cCn} z>8MHNB@vNZV*Zlwy-e(>c;`<#qiwsnCzPKG&zp=xMr|_jH4L$BLtj;(ENCrJZHfP7v(jv>ZQyjhPk`0moTu$^nmx;!b+*3O138z!6@H9qMJSZ+Z@HkRvqD<^O(gxRQ3EKL)yGIifjaP@FiG=iniFNFm z#A$e)dac(npPk**-`G7IM=`PlH^gY-rMZEtv1C}YG}i2G;%9~P*hZnYo48j7y&vSQ zSU7suDm-3KtA^yaO^^cn&{`I6Td+Kvc;oX;kbbrGn`j}{FW@C*OV(Ezf(!6YQ9oM1 z=*Z z_S=k=Uo6%(@1-Byyb(XRcQd`*i(?@l#09+suaXB(Bg&WUun|rKV?zX31_Z7X@k~G2 zk5#{`=JHSlN7Y9Lq`VjIpqgY_K_i=;@+x$WMfvn@+zL0@wAJbQbR^Z&TN>HEgT4*t zwm=}x)Zi};KnxyYzbDQVG8io-4cC>hB4fL@~Cw80+b)Bu#p=#va-h>+8Na zpWiX+S#;a=R)>9PJl$8An}u>+UNe}OuS^Gw7A^GOBS%Wfh}AWn-donNkLt{}LYfT? zjrXQz&G%g25$y|3qiN*Gyvy>Qxi#5zv^Slb?i!gXPYkZ*~n^v7D zR@WA)oh5l22u4>VT<%?TGJ(A~g1(VBmLt=&$s?#srf!fZLzYY1kqw;(HNdqw&-3Z$ z*W*(dJcLw?`Yqy~WF_oza`=utyo8JL4v`{Pb8zP&g@QOjUf)SO(C&!bahPY%Z8GgW7mGvD~kPFOIsQ@ z#C!FQY-kB+j1bD!MZB@qW9(?-O=%y0pY2*b_G&sT+8R$Pm$O|SAOUx!)4LY#C0;`N z|0H~en}t6q{@j{r#Rl5{1omHFoT2?sI0)Y7KAhxPwEQCbN^OF> z%+a$rHp(~$lBuphY#ASrh@>v-5B+bt0D+@M$+~Taj1t0lb#*>^TgCYYIGGt3wBl@(@8I$=nQCN!v>5D2KRXyUz?Mstz5?9$ z#_AUEyZCP(`b&F!@NkPS4}&j1D6AJ=R4tTX9H(*=XpTB0tD`wr-LGuidTboWIH;D< zVnC^M8szw@863!&b@ufr4`3yE1`Ill%>x8g|4F%mmF}m|=XC!d_Nb!tYMojHXU-@a zmEl%Q20K{mu}vlT!-EA{$+McLX|32|2(HHvk$)pf8Fxoux|{E_FT+W zeDJ|P%T!NYlVFChCw%6)Y;n{F)w8FmW8e0%uu$WGVgAGf@zX8fr&J1SN{@)wk*YF~jwFey_6a<{)wU2{_2h%H>Rk+yKnB6emY z@5fu+S>$_LnW7IW;E=Splyl#uY-?AMKInpRS}XE&fnp!7>2gp;h%Dk7k#{eoevT+u zs+qWTW1>VYYR@&b5u3Scq*`&J%bRQxv3X&nO~8ENF#m$WeER|RIfe_-1)$UUcrZP+ zX6;Ve>=N=#s=H{b&)(@Xc<*VhmA{HRi+8=$#$6#r#h4}LO@Rq_4vh1P`^ojMacr-D zTMj_ps)SSpDp)H)eu{B|{9HZuayokIJL>3WxuP{Vz5FED_ zbw3|K(*mfyh{uw?<9AZlFL|r7aHUdmGH-Pan}i2QJZ$)?U2&UJ+L^3qT-Jp6&7r*k zqs?xN+Z_mU7=rL#Q;Z@me471&KkI&Bly%`*p(5Z}%|bu>vA7dYdba?_XT8E3!~kM| z?6B@BnBGaN-~eq>h8p5Wu9Niw&w{PFc)Ms9fFnqpqgcHzIfNpl%{aHY#v#kO6*xkmw-)OOFv>I(P z5GpMgO`@tUQi3vT^n{{TsuHojN;LDg7j-VGqZ6C>LcqI;U z&cLb{P(!Nvwt(Qr!czP0`bLK^fTff8k(c0asBTlbiy|OHe3=IhaDYdO@`X66jQH+( zBl0#J*%R({+Pzpfq!HHx!NGZgu9OSN9*{%8D}&}NcTSN;d~hHCPXE9VkxnJmr@=xY zr5`JWUg&tQMBE5!m#X+^`3Zqb&wJ)^t0~uKC@?C|pwDd@eR`5mB-rZA?JN}Oh`6(E zQPdhF!$rsMv)`r3cJ_ER;=t&@u#1^A9)sal-{`TG0gs+(VljKq;N+W61O8NGEBAN)L9%^c9gSeTAm2^qZ1xt z8FU8!R?1Nw0=1FRjvh)h!x@?(&%fg{RCCDaOb2;I1-{6A=qZXz!MGlBB05zKx~dvJ zRTsr6_=Lka<@6EM^yq2R?q(>mP{^q@>++yFluPlBU!0ebI)}>!^gb0@b&6|Z;@yI*MnBUO?<6TH>mrLOr<2xRKmVfR|%eUBmgv)my=S{ zXpyFdY48f&B(HX*v#U%WQ=iuASv(>QqPL)UbAaHJq{lh%z-xSwQ0pcWNK$sz zQK(1NogFMx;m}7XUgUJG#O4NzluipvwVvZ(p&WHzAP0Pb=o*crFi|vcOW`Oxz-w!k z4lbvn_y|=hbgX@Js<|fs`5|09}A6kfjBJ7|TwvCk%0YB$=>v&z$;q zyVK_B4jE!z(U~lS>>9RbOJhDg5V2`kc>gA5O05~)vr_8|O>pR$W~S1>y<*kS22 z-}fe8a(t+J)d3JS)loFX|H9nk)Jx4m9KctoqsJdQyfK1Ibwb17M;tM+hhsvKf(QHaqJnt;!85Zby5se*GHfs{q zT+56LX$j*et1|!`=82pq?BfGKF6a*MBC0HhM5#MDL7%WYeV}eIV^W~~1)^oV;@Jt~ z>V{?kWQyotwHpuxnjy+OfO}EaQoP-+ux)`O=GD4=Lqy?|&YHgqT|dChT-BL2Zsw0^ zy{P}C6~Tf~pe3odX%%@0_KtOeSJ+R2wL*)wS|5R;FdX%05I<+k?$vpmHlNn3JM}aK zrB17rV(C~mzM5H_K|8}z8Vb&YxLsp&n!`FPj4r>n@p0#tkck}(M@5a+?DB<@uGDBp zF_@lXo^pqlWdivg-_fao%n0ZqCOjwl*dGNwa>c0m2C&-+E=2`6gFBp2Xd6vB!5HkM zZSdrBNeiYTaGj0Ho(MD->L#E~QE!?o|6%rr==m9Y?z!1nu17|}N8RGnj;!`*N^pqU zyJ>5oU$(|`+M^B1g5jUEjc2uouM_B7-RJu37`~xg(fVGv`4;w~IFHf&Ci=!@>hFY` zX+ECPo)?o&8^4>6r?rQLK;wPNC-{9-ezD(++v)Buy3cX-KB)a=ofyw)4>vF2&wDwa z2Xq7WQ*kR@|0-R7g?c^YE&H}|pZ}rpE7ftHj-%e^dVZg)_pxCk?X_p@3g=)L>IHB+E!YM;#E7CXqjQpTF<}v7^5mH3wZYk6F4wo`dWdZB&_WhrP&8f$O3BNyqJ@I4hUl4cDp4e#ZZ&dfB zfN_JeC%4h~&FVNMNI+Mk>&-NNi#i@?`~iE&_jb!0Fn*glPQ?S?SFXQ=uD@L!w_^M` zj1$dHbDDYsrx7n`}UzPjt@w?P<<*f4O!I@k>!5qUEexe3T^W7|DbVBn^-qxUVQxLG|uM*zSYtE6MIEk zfKOA!`Q%>6Spw{ADK@iQv6-Dj{>)0_?6Nwean$FPKmr==K)0bVdl)7Y5^xZh=gANK zMebl+IS+aSC2CZ~hNlWPzkI2t!+eby!K!UZDBi4`P z2UX))?F?%*R;x~bXqUF6$(?Br4Tv43Vj2b!qDJw9x6fw`67*fDKnrn)gH)h-Yb1Sm zc6F?94x`7LADmB5=H2co|NNyZ$C7@1=HLpbMQ)4755Cd-ZSz|!AWb;3*)PBReOUW7 zbuaOUrD#0xH1<-L{qp~OpYP>D@f{|~)yzTEhw@FG6X28af9S$w-S z&SsTy@M&H4^UAoe(DFg^A~*Cv)fndz%BNe$Su#yZnARj7*;Tz4C#h?uYjQ1moyA@I6s{tAm~+Cp@a$Q5~NZ z?^DM=aK`f;!~OX8)#t_g09wW^-S6FazC$mX&U(J(@%HCCU%UhN1D8^t?{aZ7es?GP zN%PANT~~(R_rLL+gW{vO@6IPZxbGLR4)l93Vf;K?kMSz5&i=D9&Y$ai@&D2Dv+IQa z#Ql5P?*F%rEZvv(gB=$h$99vkHWoJmw!>7zZn(Rv$b@+aGOxX_;;7a-+*z@?=>{~udU}_y8jOJ zp}Xy@`)BFCc>W#2-wW5!^Ea>J_s`OOai1OIXknm^EBD8pm&e1dAr%S#6o=)}Ym&TR*E8}NB|6XBBPyJ!j*Uw&%ybG(XqyspHGf zzcemXnzQUU+mC(4!N7i;^&WI_T+HEfNJaYmobRv0=K$4O`uxoI-^1tbw$GQ}3r!>2 z#c*zQ$UVjPm)-{yI^*xf^YD3O`Ez<7=;QC{oZpE&f1Pd+3(PpZen0m>|aJYg+oB>*PJcp@ivuPMF*n2E3%kjcf(N~+C(<1L%xMXOUx zdfl`BV||+w`!DcyS~Q04pldb|u-?74@c~OBpA2|>`ndyaa(GKRyULgbGO2j*nn%Rz zHX5f4Qs;c)>f?d_P{6r0l?vnvTMWU>Y<_N9+nd`kI~<8^OienxNkAq`(>wbo1=jp6 z7U^oNPaK*gFW{u~LT*h)PO5F_t6GQb!UCZD67Hdzi3f*Fl;{Cpf~+OaSCB$NHN6A2 zGM~FwnLONvFp0~_r3rE;c7#>3S^xVx!aT_~~-&uM3`v7Lw`doYfpRYRCdy?P4v3Muuap*^SNT)9<^WbuQwr%_w zWgNfvC$?Rj#r?2DxIfm4Jtn^2k=8ba4b9CCT@aQa|6N?iE(G8H4!#Ng)ci+w4=|xU zzyPfw2eMlh==^yJRi)09%z6TZh0lQ0S-?OLwuKgyneoDfpF;@%To2?-nI}j#Ge# zfY+yoPS(x*IMofxsS5F=$Pk@<3Nf0gXhF+!bF4V}csQh9qYHHZK#syQt?-o}%^P^n zKT?*<@EB@0m+hl)C+U%hh-4_lY3zo8Uy@2wGYeKJx|(MI@|x4kr>msTvk_wYWUYvk?gW zo1=;tDR~4gZa^%X0kngO5Qis!J|+S?lRL&J_Cd4qBJTjv5;%O6*=P=@=bU=IPBPkb z=1IFTr^}?gAv1P!8O-IM|vBXqa@YN7%)n4KB-0e=kV<{d4SM z)M*xg)c6i{zJ9=kW4@juwQ?MWO)f`Kn}VVro<#{8Ki_irP#+`{7UZlBKF^5D`I~6S7BZXM9ezvb+MQQ*YjlZ)bkt)X zTL}0v$<7|DW}U53hDgoNg=^V0zSgo;G?^ohK*&+w()*_;wnGdE`EiP zU9?Z-N8803q>KwSG)ny`^Z^34(&CTS!O$~-IFqRG1Cb|uiB!xCOB`L{O&}->$Re5I zstwLMvI3zHfU|rty^{AH9LinpWA&@t(2W2NpPAq~~bB*YRVavqAbI zo<|+8vH#)Yp2l(T|4sZkuVDWq{74+YF2}()DZ2?#01r9BQMD@qSHu63S}5d3rd>1fPzRd<+{UIOQ&we7jD4w9_HTmfd&0h((;rI8GjnAL+ zJbd4b35&wf#;d}AG(QO3l@O#2d6m6X+m1M+;bh&VK(4uXwG)N^kHPbf@RA%rG!S(w zW}Af$0VGCu1!FWCqTCjvfy+09ihwS0KYqOzPzb)E{yg^5Qhu31& z8EjDYMPZ)Z%R=J)h~Wf)Oh|DI2lAfK^Z|W4Olnm&Ky<{DRKto#sfk=X5jj%UDM4ab z9h4A97!R@&xr4F^5b-FsL*8gjv>0$qq2YlO5fGf0`x60yQNa<_mj;K97_$*{Eb9Zb z*he1ECrdXn_6eP3{PN6|lbNyDx}-H*VkX+h`NnrysQGVL*+W>zdA{b*0>oz}_}qe6 zSA4P)6)OLTYtJ6vP2-9lE=^;fcQ(PPK!MQP)bSrnvwZv}vWHcDjqIQ`pjVx4GylCa z-*@8k%h|u<^G%)fjOTnWrt$ff<H>r{6_vWm@gR7elQlfnp+s zzV73_B3U)gF)lm~p&!JBB5I)Y5$ue?4tO_8%&0~{SiFrMMBP#mCpY-GEX;xLi=QxS z4pj!{_dKxrwwuC zKi~YR^gjN}rsgdFOxrYy-xkluXHB-h313jD!+t^6i|^&vx7|n7V0=3ZH2>xF`?QTO z-B0};<+=Fx#1;H|?f2tnnWdUI%k9r4E{~u4e*AMW!oSycKlU@44;wo3e#$ssuQNaA z&&TJxRlNAD`_a1XU_%0V6WjKIubVP{&gbLz+kp%+`W~K7Kv$dQdiGw_9k|imW=7Zp zl)rmWhyH2d8RlnkMBOHZ>dy+*ub1i%E18l=HhZ}sfBe%(HoH?9$rP(s6>9G21C(8P zE%KGU!*6-kay?Td3{spwNKNRZ^IfRFyv0YrO zKID*(W9-Ia{j+?mcKoxHBys%pkP4r5$RB3iwYdu(!QJbRDoTuLW`Ta|QHT6Rh>0zA ze1hhpbT=TpC%;HvP7)y37acP7N0)dRssleUR;+)OU-$%b6{}z6X}9$+^C$ZZ1L#_} ze8(%$hkiXGKlBT5hZkS|9dU=_&S}e`W9MCU?X7pd`K=HC>{U{_KkIt@vb}GA;Q0o< z`LOfEk)3b+B)xppHRD3~e1otNfT-KCwC@!@CVU*`Ne#>U1RR(@W&+g41YP?@=VyUr z*2euCzWz(F@Gd{g)qobOf|9&|p9`cf-uv?hhGGdrS?l${4X|8o$sQIw+Q zg@0rO<12T570>=XNXv(R2EqBw=ke$-JEyIZ&hh5AKJ@5^KUx3Bul|C*dZ(*yGQRPV z&(rIx(0t|Xzy42pd94c#rIM*!XYcVFZ@T@Cdp`SxFMjFEuh1vQoHJJZ%qqyjjp%T{ z6VtjCllh(S2j=2GU47N{B%p9D%*q9HhT9D36kKF#Kbrzo<#2ILc33*6j8lZ(4op`? zrKTQ>t3Dt5?R!ZizE}jy@{8{?Pv*Ci?Y#h8#DK@TE#N z)u*Ej8q$;SB>thwq=Z5v5t74?_xKvVg3QPYk|2E&2GO`lCp7zQXt`>RY0>-484L_+ zD@@BQ4u=JQDy*zAIRgP0rR8AEXgAw!{nB6{=nR|uT^45dIhaN36$7cD=uOal9H!`N z-p3IHNSg-tL5ou5J^}R7I_o|zcR1{Jg~J~(d(4La&)IvxNpe-^;uX59I(Jod&N)rT z>7MSMoM(0?ZJgcJt~RfBS6WFZA|$OMh+u&cmM}^101-t}_sk$+gpDv59@xe<_^rX% zfbql6vcV4%j4^2T|D9XC38csSKYnPZyQZeQ?!D)pd%}0VV+WIyU$)np6^oFvCAF9b zXtyYur+MObgJ3aQ(79AZWvm%D+CBELcW^cvGuQje3UA;&cHCvMx?in?g6RhwYoTSCiV zQT%=krG+U`tWM{Pe-0X;<8z!=n%dv;Ij4d&;B+Vw_u34C&*se7)cKPmX;lcA!&*F= zD+f$DTUxRC5TZ3oCW~EG*qwGq#+H`{_Kb$zN`Bz*qF@tjX{X&M7;F!WkLHxCO8n;I zm8+FlWUOexxfOwaeL{FY{Dimi&+3+OB z#`I$+MR|X#&gXSZAw25F0Q(Kov#sE#KljmpKZ}YDi=(qm>1=tfyUYBG&hF>%X5F}L zi>tUUv43UuuZjL$!|V9N@rP3q+DagNgun}GWQVwCj9a$t+AYbZO7DOCZ(Qk22Klas zu;+^)%Rv0;X@{1{R_avh)!DCh4i0sXfiA2&bqMNDo$s}CNz?#zvN+jStU-93aq>coKoW3-BG+RcC`=Oms` zZ#hyD*uM>Ib6lsLPL70Ero1qtmiD*_TI-`*5d~rYP@g4oix_y!#VEG%M-x0DY!Np> zyB+rC-igRgt7tY$@8bWHM~5`CJLyRq-6+eoS{19;XG_0AR0Y9d@Vo8&`!rw7>_oBr z#C7z~HKjSPb3Xd^?-=~cmU>`rf3Xk}6{!@P?!EevPaUw8(~fDrV^52qdTG zZ|KbGQ^6FO(qU|XVRi|`@RjRh%t#$Sg;;Xy&FxGZfo3t7%#`!J#4_tll&=K6mb+c3|Y$5Sk zQJ)T!_FsMQF#V!4qpii&Vf{q%dK5$z5Ws<2&gO{VfCU464gdim2vFby0$WHQ`nYH~ z9)KbPwb2Mq0s_D_g~#Z;ptlsCpkvEmb^r4%2E&k}25_(~6ISej7ltddTXU{H1tnzi zbvGq5{gJRaSJbMqPx18i-SBskv6OiEK%rPazGK{M?z8@IaAagF{`>jd{>|@HRS$sJ zHml}$mRrr0sm+77)VAT$;z3>tjR%t2&X!>FmlAK`U4NA=L>qzVWS?>K-IEXBB6PpK z5b{N?ZLUnN%pYGp6gn08;LG+u`@)9@2b+iRA6%%-?+G?|xbKB6f!Y{}>RwpfT4r?) zFeLyfLL5L%5)1OAi3HJK|v zGxO`8dH$r3;@&CjM~o^;T*_U}icT9;giX&3X%#LERYWo3<9vJb%fkK^o+T!v&hP!d z`8ytew+Yil|3fwo8@`icf9v}7@5IEgKOj0c8+{Y`M56En_eJr3cyQ~facd^p-!kPb?9@i}VswzW zkR}B{>AMacWC&FWY>g)l*}vZ3I(%SY^J5ikg~?>iYhGH;iGkE{a%bsxt&-kG$o>3HD&;1E|#=rfam&O7g*#9JXdl$!|fBrsP`4)Zt`CsDu z{+!!^`#yTb=fPX$J|`mPX#BfBy7YNBfe$N zT)(vA81$LU+xI(w7efARP{$b=*L!0d6hDgi3dIx;h_*8 z*6~n#*xeWLH!L6M!klfe&(-sR5y-^e|NMcT4b;Dna76qEaNj2{zW*ryIEzIX5cj?K z{g@yLad7@XY|j#h|Af-eUrNrQuB4Xei?3N&z+;V`qx-n{rY`^jyu_N z=RB_e5B>T@+zi9}Aofc*AmDwt6xfuJ>nEIlHwOy>s1hLlpzy(mXrnSrmVq!r$FMe{ zv2z<<-8QYk0PvzO4dc!aP<}5=lqR2lNGa52y~usq~dct<%CilYGt5&ZY$vStoZ@H-$+`qRH_x_}>Y~ z|F0)EvZbJv_$_1LACsrc8Rx;N7ah#@a%rhChar(3U~+vP`(qXH_^(1TzjpEZAzr`! zd3L=g-)z0kV?VAQqq{H4H?F@L_g}bvLB88qWQMCU;`oHFqxbLP55qD*eUh0hV)Tok zR2xU>4Z^grC^J%RNMT%kAm>egCLU4I~t&xe(4Y@{y%-)ayM8x9{{Zi!s=;rU$Q^VPj^`O0j?AvlrjL zOV5qv>AXQ!iCt${EbiyH?=x&n^!{y#;NRv`UFPtYZZXUqFBOw^dtlhb3l8(rlI0r()nhN!ssqK9 zshO!&latnuJq!O7o<+}%v1j2w&en75`Frrx-(ke~xf^>OW2_21>X03#Te6O$2=T}0xs8~@jo}_j~#@0-+}U zhpudXIF(Bm;^9zoE}64geYOwUAk+z{FmrVAs8CCI3HP{JY=f4fvere)B!_A<4{Mpj9mh zpU&%D5juee8N{71W6`ma7m=+}DUL&*x*Tl-*@NkE0XPG>SaZaP`I_(oaoW@rxRlA; z;ByoLq#he26xn8j?GS7gAyM?q+_AmV9<~-UBcjb$9Ix!3?oWTf|4nOQIAOiBZ`;{K z@mimzy=}f7O{7s~mr4l>N^N>5z8Z=3#);>~xG{p>{QNGnMSynt&G)@=zMJi-kDPzm zg}=LaUGo2k{T*gs7!;ntd;uMW&$;5getz)(Dm()pqDYz|LQ)vRWaaBsO}0%MohXY%p4 zo$g;8+uY?`&GAddzEJdZ^Nwr6*Ch{5-B)DcJEoLdHY71 zW`#XA0MCcqJ0To1YohC00~J3 z)Z4NKx=@%NUGCYU`cPuq2_osB7hZOAz_zVhv_v0SV;mJ!!&9Xy3yPXEFcF2#JZ>Xw zG2-V!17V8lxA=KmFzHpYsxP?v<-UU_Tf2AgXI^&tcRsip+%&%-9@{&7@}u=`_ubADVf(FzO1J(yIDCN)*PvxB2E_X7Mn^Q(n_dym>0)^Wn%qmFNo*v@E0axP z*!kJW@?y3=YqSh3PV73q&0<`Bnr+{y4is=lJ z3*iLhg!z8DoCpynPp>==&&Q7lgD!tUL&%VwwBx6^`YYOQJ-PfU?x*W?_Y3-UhI_pR zbr_QI&vbc&e{+j&mkC+2%dV(rpgN9KcOHJrbNb)w^$h&a=sHLK%!Rnd5+W^k%9j~ z9Pb;ttejVcy=+bX0&7B;TSfQ))?|n~%dPd3?kYofdGLbR0noY;VQJP`#t3gxpL=jx zfgPZmN2&xIupofgXfTDg)?h%>25Ro9Lrgad7|6PXb5Jw7Zi7Ii1x$HA+|RC&;N_rA z*W4%*z-$}!sId{zL_I7386ZnAhm)V5tS;;*8_XuBtO$xhHCja@pPE}~ zhm-xWgwNy;N3$76)YKn<%USiBJh}0!eng>OcP+wgkjlbLcm&#x*WUWq*X2Uj`8=6b*n}`VpNe8l4+_2$UfR};5V8JN5CMVdJf;`Nc zBvYCe$VV!zR!9fxgNPb%P*c*gXT-K1*GeWF%(7w%iG9)9_z_uLE>@nNy8W4aw(g3@ z94W(O- zw3!}->}EEP7oI{-u!w(Fj$yJE0s(r8C6*Ym8I6B9S?>>Kv;M{{fB7}7QG0khaD8M4 z0pIm?_!5%wFPZ!-;{7`8y#g_D=ymuFy;r7)ZLL%ZpUZdp7`ucXjQ|w^(V~I7dLy7i z3;cERg*%izYyRXtdiE@=&`lBRFAT)T>9_s@Z`XZZzpE&$`~2YuCB=AjK&(_K3#NAl zr8egZb-?O?M3&LtT?kX)$V5pAb~NG`43`VhLK>U`0={gn#Wy1TQMbt!LM5Ta94pjK zR@G_}!}g43=WX-uQiM0Rc*DU%S{QxgP>E8Y8Kp8RJ3*_oSD7t+CyyKsHiv4rW)c8UZzLz@dZ<&bc4nHPr79!~*Kl_+A(i z=B8%01r5F=d$#}JpXYu7XhRV|inRc3ay#?qK$4(0!b@P$3W%`KqFt~%6T||d;=#HF z?A>*Aqa&CE1d7E|z@S61AQEhr1;jHWsfQ#W99Lur4PfG(_y2xUF0}2=y5h78;aR&k zcVaajPK2G#z!^uWl8(zByK0vlv#0Av>x&M>z2vYYgVC6CDeSSi%n{XX6QI7B{IObw zA3^^93Kwvu;QgEVA0e-hB1RjwOX0u~HI0D=k)}?$V?WSsCW_)0|+j`oa-92p~yr>>q_%@yJ0$$}nVLB-$eS{83KR>kEU~4FjhEQ}UC5 zol$}R5b(8)op%=bns>M=PWXm=cis8A>yjRyR@%!y3*7As@0dHV@H^VxYaWpT($c|G zXHIXq!*ET!Fy4x=G4^nJKc@5fZ$F3g^on{5o?ZVYU57`}n*&xyfx3w(u<^RJ7VHI0 zV5a%?rY3&fdj(Q;L=T~K!*IDb%o^tgj+_OK8R%N3@lc!(=Uxuk9S=OO_CWSaTeqkd zXUh}Hwxj56Z8W7lwdl%>d!9eN6vS^xe-Hs!lUe?AuP1$IAx zE?al^IzUnr4j%*T(}RM22K|JBXbFLng(-r^{{8#9A`q2M{JE~2{zb?196{&5KnABq*Kr<6m+_}3nxqy0@|k+ zlyv%0q2M*9vm~Sf6~drqp)0$Xc?)?%9l}=mLSTh< z>cx75%j*~T0BQ|(A;^|rSU$Yf8QCAXq7or=p4#kSt(+&b#^d_v#Ru#1F=z*-`{?mnvLIR}ijbn&mGkc-kO^iCQ*LHB>LFL|7}b zl9eJc{9P(a08kA)VmMyb5-d1OKs8p^Cczl&7HTZEfck`BG_BVs6mevC6DWi4T8Ubf zX6i+16WYH~kpTVHt5)C*zge4*FAP5Ed-Sqmghzbu)2kF-q$(lu>xBqQJk=*)s>pvO zTr=T@jfk^C!_oWuzZA zpxfgiV`)~t$jmq%BC~D|gc2l9X;l6p6bY+=k^~nR1E`28qkHO18R$w+4^y_qt{w>BiVx>SE?QVIf}~>1erx2ENBpn zo(4>3yJei3C<)UYJf__)RGd<*4I3XYGojrQ-XggDLvdlgq(ux;F8P6*W{$LC=H1o- zYi9S%zYHv%F`M!`Yef^^$Z3hpgiDpHp{2d9NTZ&<{x-w$scg08-Dygf{OUx1wO2E7 z5zB2v^jo)|XiV?{_i}&q0#M5r@`bl>e;L^^5ldn|`zK^u_D!ew@SfJh&g0MV-4tuSe~cNVPYr9f=hs zp!R?&5d?@I!uUj%Xcs6aZU+r+$F6i#f>u?TL5y^5K)Snl7dG>43t6)WGG81Y*hdZ3C2i=8fpVYnF_RkTv{9uTnel_Sdo{=Q$`@+q5=u10+UkExmZ`lHu1Gm5}3 zRQ7*;MX=g@rEq2V%)Yaq6@VG44`VLaoC;6l1gHY@qo2n%z`c034T=>7zbfo_xnqDBL4#uUX?VAYn?bx+jD5UpiI0^!$Ep9Jhag@b1P)#IChUH-9o1uZDj%xp%d&NBRonY85HdZ=nXX z%2k9Toa9->EA&X>zUiSpn+Qk4 zUd%dNv1%mUhzhD`16`UO0NH3bxVNnZ{F*Be^lk1yW3s1&qcbNor#&aTVuSgiS!325 zb%q1Zd^?=Zj70`#H|s$cV5I5bU(wy0J0b4e0Qy?L5uCU&^2x~ZTniC^hf$vD%!#b# z5(Yn-8!PC(il)A>KdH|#GyGvs_B=wgNJR8j0&BDGo2k&JM4TwR(H;l{>~{C&nj2{! zdKnNL0XQWA*v|Zf$8Pt$@E7!2Sfzhy^NN=}R|+zC-Ag}PH(^lX&sC}W6Azo@MIMuy z3(G(jtj80~;6Ni%*u!vbJ6W|OBVUY;X3k_P!_17|HX1SEYPfRpOAYGb%`d#uFnt(| z{VzVa%~$ffHvjC)U&a`Pi(@Pzs`OoMZIWhx3(fu@2xkYkkYX9EL5w0b8X<@dHlmDY zc+IJW2=DIWYFnsTDX65g8G4Df)OjH8dp(Ll;m>!LtDPCpfn(vo0geoF*H7rs`kJ3r z2K%W!Tn@&DpS~G^#Fa<8sk$0u^6*_U3E!!xg{ku>SMU^s7I9@wK{QjhcvyKfrN9h>^Qm!Vdr@q0JlR!`Y?eoUI0?(WvSN$ z3yix2Tg8OSRJ#dO88e)luHQ1Zf+^tl%^XId_PZsMOREmMZJyhmR*!FKG8*)K(BU%s zJq^X?{?&_5wJ_`y?2%os0gxLlvb<7oerrgRsR^0U9X`0f&r2`uHZ>8QaHA5IcW!>| zC1(H9{z!AP+&OM-h~|Eh=Dr_u-_KfC^n)t1Yc8<4k2N+d`rOOW1kJss7AC>3?rUsl z`n(f!^BhqVcAJ>@ChI%1VPIXh*9@%b4D~u#vm4l%ZpLm<>qHll#O#Lb>L4Ah zUuYQ@$2-tf0odBjUtx|;Q(ITsB>Ls1@3$-&|L#?3pTl=J;IIb{Y#+VJXS4Yp@!9|PORP}jt55x5 zHh^^y{MpZjuugAzi&IcSU!#{!L5t;IVnMJUc&>DQ75sq_Fm{|^)ud)R|KQ!g^`+jE z9I?@J9JJQ@B!{^qAbP>iD3H;mtgHB+UyHEwF+$zlh_E9=*l!~e&IM>_n_Wzj4bLKA z1Op>?7h#zJq?N(q)oVc59GF1&0OU3VxVu!Xe%bX_^MTP_xy)X#clGF0_L_X|tkL4} zClrh78}avNH7$46V8w+HU$3^^6ZMyG{m8N>;u;e*8*sHgUu>v&ZN*k;-tow=8g}C{ z;I^R@h7NsQI{$stP)5*~a~5pdOq4?Bx;ZG+Hu?~<(=ta5+Cq%sHH0>S>yx3Lcno6_ zz(_NN5nH^^uS=FGbnC3*PtgEY!o*38javd1XsyZ|!zx<3GGWS5u-SoNbGJ(5{C3mW z3{BCL3b7&xD0o|`NT22)MuGpwj_5S!`N1}aW)yAR zIZLhDxh%S^F-V4sl`*Wjhyj9g!Ma|bbb$wgTA3RB&oe9rM@WSrX-OP1Xe&;j!7D@o z#uT+}#;_3~rRV{|?-j&_q_19-0*qG8SWdt5iB{U9X`Z`MTA6?Hw#OzN7bHR-TQQci zNd>pu7uy4z3Zi(_=jjLhe_;$oYX0I_84vwRK8`use zh=33Kz(l=rI1@ExKo+%YqJ0p?aMDORcgc_`yf)<^0$T09|TzS;MlSJijjdiM?q1FXgC z8Fl7{5-8^!1sYT4{6Aua<3Q;B9^2bl6z*k77-50o*%OS9mmvPZNCMKE#*l#kvf(a2 zq4qdG`o1&Np7~ri4T8xabR^^bOB3aGTJJ)Oo~a!tP!zB+yeR&zb_v+$K@MxpCNX~E zvL3TcQ=|xl3qh4d{wbWypfnc-jn$-F6;Krv!eykcIYfsb=q>&$O8r&KZ+_^pSI@q_ zuAn=bG7|cfx%37#pcx-rG=IvM^?S@V!yn}$#Ty=d{J}>K4M+0!#cKL1ymc0>)xY8P z_XUc)oylqjd%h2I(&p}?Iq3-KScd_}*dC1)F)kH{${>*_bc1eGM6j6%q5~3D-O#~N z!|txJydd?MLr)KC?~txx!Y0#1^o)6FLZrb})lC!s3QA{cYS&OC10W`0?{jdV5Y+(^ zmV(oI#=N)ikOh(t?By%AJ2WMHr9R8R(9VZEm4SS4`;=&u?NmZ$@s^^KJN<5-`_$34 zSyrWlX0BA6xsl^z`_|*UMG}CPI6my3S{{hT72cStX>JSK*4yu`&GUstb_RT3n1$@u z;W;6~MM-Q(#hR7TwOGMHOTCJV0CUD!qnS8$sw^UMtGm+V1Eb=RBAWfwPps=pLAMp- z7-^2VgIH>uc;xC5DgZA?qp>PF5ab~JAyBLai=H4F7rDiMYO>`GsU|l%P+zxS*J7y= zW!JVjQ}*gHv9BWA{3*%nlz@;=;3Z?(P|nf?TfNB?1UDgdh3%d z>hRG*=Pc-cSP|6e)Cv&^S?QJ#HcNK~mkce;1R8dPfMM-QXxPEv&!{TF8ee(jL5DM- z=S3Cpo2ve+!qjqfY&bo6Rx)`*X@}Kswa}86_6Sz1xp($m((z66vblImWb~%3Uyfly z?3&+VNfwstfvM%jZF_D?C(%{;G9~}0E)5~m1lt>_^Q+*4ejEtbCpp%m2*H3(q|u#( zVnF+_60^`sI1%~I3K4jB$I!H7te-|dHiW4eW9K2Y2t>)+8aG9g$SqL-JKb`mn>aw}p?uK~Ki=R#(N7iCr#k5v8{ffuZ!2dZItOX1qX zv0Qlifdi6mY$StQZ#q=pJ!BANd%ke&5!!1wPqXGl^S|7>)toKV6V96#i^f9OoP7D- z{MIcEvtPSlYlM@Er*Uj<`piJ*f+M4p)! z=&U?4c*P0H+eC}OB3V!j$xHe<2^#>9+1o=lJm+@QkMo@!)lTVLcM$mz>a?>qSfb?~ zY~o=-pO3{Y;W5`IOZ|A*5&$sRGlNQZ63@F0!m*9X(zdO*dy@4>oSebk%CTSABveT=nq);qg5$Q&&t@5zUzegLo!k~6L!`|p{ z;b6|;j8tm_O&=StK{lJ+7W-BIXzj_!moSz^2VQiID#c z5CQ(PftTJ@x5#Lhw0!uTmEmRlypTMd#|3QKde`=_p+=(RhG=2tkP{^kG7PJNrqEHn78fXawERC>^w9)W5zRm^0l>1~J zF5?7%nM3Amm8W10S#15ff430qvfPq zWxec;bxc<6qR-qW2_n}YrVO?eIZ77|y!NG#y2`=;{>&Oqyi%O3FN9)La!8)RH zm6x=R^cWkgqsyZzm^nz*WfOZ@WT|H!t?s^|7j$!4@5xqF71L<;T$;ugwT^1lhw{BG zh?exeEw@_lePc`ejfv#ndTF*_%sM*EJ-#Z+BkP4 zU7~0l8pB%=@1<^kR0sqNySCZ`r_nE?_UCs5XJnVByo@?g%=T4lMdr*iU96`uJtT_v+-+Xd1(Jbs# zlf{H@Js-^6)Iw{uaAw=^cJkFJesK?EtOl(`)!gVdYrx=Hh?}z$_{0pg)nDyok=`Sn z#G#jtW%du46G+#PZ%zkQSmD3DlJ#h6^jdoav9^1R zP%)y{s2EH_HdpG$mT<)R|Frw-@zv6nitF~rCN2cr1gFt%b}Ck0TCU|Pxog>aPGX-7 zVhjyL+gP$SbFLeJKFE;2!;ziHGOYn*M%IB|r7}7^F*13i5q+=^2pmL;01#*v{_I(~ z0RJK64%3%rzftF2rqXH=qkIGW9@vYh1mLJ4i?zjC<`-FpT_mc zQHmCCfpq3ZA)VA(StC$^3B_sMS!5$RlO%}f_T{-03WW$t9^V!3!EW&z%c^g7UJ8fr zd~YiQv1XUtzA}?-l^*|sG=Dt6aPbrvpS(@qz zmpO+;r#HstRdZ^*Nz!P5ZgkmjqymdJf8=9)b61C~};K)QR{!c5* zZx7UK(PJ)g%Agr4lGw6ZWnuXgq5z4tyZ z8RsRZpzOY@*dM;8_VzsSb58Y4%p?%Y{GPJXkt75o!*m9P!EGy=*_^pa&zu zyTH%^j&DEo$VS>uB|;qs0_`k=pN8nKb7_PYk)ULrhy9#xYO?Gmh4I(y%$>8#m;lH_ zH;bB1WKW$R;hpCeQPx3vG0fk_zgGAJvLxFm zj@-3F0b1FET3H&F;-r&yJTpUV}ZU>i6JOE z(9*y2^}=1kqo}b?a0CaG?VJa(bd7M`0N~TudsWuG?;y{R6clI-s1#tunLPZq*^yfo z%aO=!`?CYvi-|b@`hpfay3*V_?+&|Nhuf+Ce&`C!_xW}4Dq$CN1-K_*1e+BR9r`t$bq2%FomcBpqX?yabRX=$23eK0-yt- zfM@WcLE75;DT^<}MFha8!5G}Jt?`4OJK2v;^FskGN`?>ECa|nL2@8X)mAM$shUZIZzNmf@hAXXP8tS83*d^biq7-l$Q zWfyf=5-W27rZW=-2!K`yyG}|OlN7IRwSCeX^Dgw6dc2eg4*2?%vg8yt|Mvq?r{8xt z^kc=r@3Wm4-j-T|!JX6!ktKU^m;M}w4d23Zq>!~Czuyk1ZM51o!G(>I&jr{$$r=n3 z)DdvqDCBzG>hXq|)??ie$B}4a$tJ3B!gJ~JH-Vu0(Rc1%{@6XQD_er8XeBaWi-x~* z?bsvN-ICgVcCJ75`yP`rG1r(}nUtN5fD)CB&DTtCpN>~5aas#7OFhJY6VJ7q>!{#? zX6-LwwfD*%x(RIe1dA$cm{|WvR_KtROj%^8Yr>R)_`^rFkX+Y-mYAfn(fq@~;FPX< zYlK)H>Ad2-J|pT(*(B;{@j9ci{*3gnR<<_s>Epuv)}hUT&Bw<2>M8g3`)W?d(UA~e z@>q7w$bNKri2UrcwL)}%P#mnfw*}Hk57j!*KH%(pzu*8zT9Qs+tgZ!*kCIMm;Hldy zD(&Y<7)AtN?u1B>!L}xW2*GY~vj~fuAQ6-?lt~V#3$cX`rvPaeO5QV97CU2{;E`8e z;UAWkSMOd{V|==hGG#K0JMKABwwvF|f5;G*NB2$a4VX1&M6)WJ-!M*@$|trg1)PI; zc9Hfl{}wTYJ)8ut0l948IYHz`9R#tBI_+vFbq@L3jl7>TBl8={rx0<+qpwAnTN;UD zL=mN9qY)tx-=)|_1Se;=zX^8;HHlod&XDRDL@$M#W0nJs%U^rn5-(U_$CV`Uc`9C~)Y*}=V@M353;@8fc`{9>|+f$C(-hAKA7tmF^aQzp*_==l%S#J0_ z@6$h9__FXG?0fKm$aGeRSs!+``BBYdVP@D`kWp#{As0*)fap>KBoW33(G`k}X#r6| zmhPn4a)>xuAOSEoQb~T@5g9yDtA%N?CjzL1Vk%os5P0~ zVCeIU4N%}K!QQ;T-n~~ADh3g~%<3v{{(5qQW@O+Ye^ax3~ zN%$AZg5k$L-5Z72+c7&6gn?tTdZ-)%KhZHbr4x)4AZ#A3SQ-Wl*7f#mrTEU&q#SaOf z(T$_TPJWZR+Y?IPCw;}lPnuFT)y5y16=jF15*`VMyvg}w^J--w7T78kY24U<+>OFr z{JoqN7C?$S#k7ai*zns~e3h#sa~TDlB19909@B}ym4tK~9>G>3`E>d@JGQG+q1LZd zHIB%vuEjOzk9E<^>LR)}iuO3May=_nA5n|ZQS@HRy&Z{>wuDloR*7Ykg)c?xl~kf! z`Bbo2OGdK;yikjVi{)UfdUhz9sMX@h*4c_bUQNdm{k^q3|Ey307mg2B0dzW*yOR~e z%I$TrcQB!Hz%(ZU8GwngIOwv~b&~?uMG78QGM6Ub9msc_&_XTJ8s9m$qrb_^RsO!w zS%cGdWXmIb(ATWjYx$ht$4CBf(ybZ|j%t*igY1*fipL>S0kET-igcSsX z7X=$J+1rRDQe2QyrRc7X7@l=O#yz_)*vyjd*`IOeTy7m?j8C!IMB_AH9hM zNg>l;q^AkiXBfy?VaAPDiO)x^-L|U1QNp*@2Wd0wifzs+;b>yi@x@H{cKkaPw|i7 z2nR2r8F(rj>Ot0UJjf6^F@&mhB}Q>j+M=ms8nenQA6PviIdg`O8kCbayz5Wiy!o#u zy*XoS%4J<1-g)co<13H7?neF*sUf)|`*)mt@Pwyk4!Y#2+Q>}2cKEn1!(S0%!kbY) zTf-Uh47Zkn;n$TbsD}cyt844W9;Qnh305dTW^Pk|g~JBm5kE;bPMY+&ZWwVl)XEb5 zK|?R2$Y4WnRP@&kgvRk3iM?Bsm|BpK^F;ww$4>X@&B74Q+OV^G*l`pFxCjBeZhr;4 zLE}o)76+&?!WW^ayM(9_sxWBn$jt!`A3*>VL_*z@m)|Cj2eU@ozcDWQpyT95OHMJ1 zVkKR6@<-f(zGT`0~G?y`eX<`gn5`&Sj&c%@9 zM?rG8W&n&8b$Db{4p%$na~p&DOd*MYSmj1ep9M+-50)`b&;&HpbwjK#&E}w4gAC`& zB)Kj^)KJURsF|Ew3^xTXfGksd7rK9tT3|K26gYB+vn$2jhhuevS$4vi2*^=`5ECu@ zO|ALj!Qghg`?ZnIfbpF0_pupd3E#waDdV|SnbD*)3VsHt(LFFSSKfbRopG{`! z`B=7oI|3p;R|NAA;*RoP;WwZc)?R+D8H{J>BWedX~#;H_}&dzfiE`4kSm$Vjpy|P$~FBd~ZklHe%Hx`aR^3Y&j%l@>eWOZ&?gV;t;kB8x&MZ4nI;++02sH1=Dhb+1ADK~S zs-1)9Hp(ioaIc>zAH+!>(^m!&DG(fYrs^B>`UO-0a1ctAHsjvz_1Li|4q{#UkVELk zXzxZqZ>&CJ3-wRz*t`D#_HSpNND)A=)0MW;I-VwtmLk58PG+dHPg_%BCm^AnQ!0oA zIuh16fOiK}@|#vCP$)hoPHkN{c$hwFRwbs9k>26U6d|bqm^}`Y?&=XfitKV0PGKT~ z(8{=pptZ1wVL_o6zkvxkxX_eNTllqqimLfA9vd2faLSJ zxBiXW5*;lJH2U~I5Y5);&YWzHDglRPF&na#taY$(r^&W`Ti2hcrJ6ojv?SG_T{Bt4 zvw|RmBSy*Ra9M3eyFV-qUp+j0T|zX=V}^%9gDQeB6U;(b8bBUx=3?^Dz5 z+tWk7KXYs~2}Vm3U&+1`?3lcS>eve5P3d@qao797BT7bnn{*rRf~jX?XS<8pZp^*C zG1NCW2<3$8QHzYS>(?vmMfxdq9W2J4l0wD@SCRF8-Ab^czm7c0s5P$Lv= z6vMG0cHaH2AY!~Gc+X+%O(K4F22d&^>VW_>YSTjk8}1%eQUu%d9K(nC6q;=qw&?!K zc2Cy`4>U^8>86Tc&S=vh+z4RnjwK}e(v!mOC6H-zfPYge&>k9oTP2qXhLZRClc_-K zOTPTr=v{eFAe9REqRC34Im+fRFZ?}X6(KNB02SI_?G7WA);~;^WB&jS7AO+b0|NNF zt_F=jNjTUT_|6P0PrW`O%<3b;NJG;0=eooFn8k@n>`RCGNsHnN$EXagK)Exu-S+Z7as zj-<;4xn`M^%{6}6KW&T^`NtfJV|X&4gnv@q);5`=Ma!VqW4f57Oo zTWxd6{!+hVG$Of8-j6tJg3D7o9BGWLSow%)HnmMJdc6AlUcp!1XH zos1K_YYM|AjAGJkQBsmN*luf4LQGFaS(zbXCP9GMkgb61fqStVM}ESDVxF})GsEM^ z))I489E}ih6T-lVmk`&&f7PFx)wvd8ih*`z!te`5m0|dWuqMY6#I(|hF`kvKgPd#| zV;tZyu@vtYpgyA%@0Zv#3(bbhlS55T3Q7;bQKUBqp!tlV>V-FMG8}*IJ1cKV+?KM) zew)i;F_aOH`}`Zu@NU=1m+#$tV?cZEkCjyNc5_?}f_g(P+k*iQAK3gU)i<+wIUoeU zVq%5NbIclthM;3F$3a=}4X+S*_6euW_5JvS;&vY2d@ATN^Sj{2f8mSo5Bw}OgfPzI zKK?4X7kd&bc>GyzCq>cGQw{JVDypdAD9SPfT$UY0yBIQM2J^Wa^Ev|z=!V7(jZ8t@ zz&t}14@elY>PBE_W?@O+HPn*DC&`qyCM`y?gn6K|m{eIi3q6nPx`;((szaj;E2d1w zERoOVL(I)9%&FVd<#H$>Xp&-8UDn_+s{}ZyX08K0Y~qpgc=ai(WDHLn9qwBku4aRN zi^7M3K10glxOMYv%xemv83~`UB<+7_*%Gx0UP&>U#foH9Y)5QkN#25Rn{jtbs0PCU zld6VXF?*OdIQ+6n67#LT&+)_VLc-$N{0CE-CLD7472&7+Q<#1DOI)>!8m2Xl`AZxN zCLk&YznW6WAR)x?XlZn#xFYZ;cYbDsH~!JP-}=PZglTTq-Tb{bO)E~X<^8Yf5BdgY z26Y`SPV%Qv@sBQd@W+Y>WaI`R#6?yOQDj9fXzYnDrYZgKM>Y=ZK^rahj#UGu$Rxrs z4u)fM4no?}IwdSrkzy`+5>n>M^_&z0W<_M)^i(%ZJmshw?P0!w)CXGY=#|s}m5C$9 z{PL0e$G5!w#w~4&16^9>BNIhiC@DHzdtIi0Xt1O2X~S`w`d)5ud-p&M*^M zw{mThY?H;4W8ppsJo}AXx;1I``&}MUQPL^%uy<&A^qPU2 zT-F`w?X`vWS@(>Ah)MDo6f3t z`a>1p&f(0b%$h-a56R2;;#hpWfQi3 zOUe`TcvZ>iT`qD<^9J5Hiq5`CK=Ts?9v30HX7sfj+|M_ub79FN#m? zChBAdbHFI9iS&A?TO;qDn8Q$1f`v9y^n{HyWL*x z#98AM^l0xuKTz%-js)29yE~x3sTT_A2UJTDGcRFZx^WcJfLW&-%Ht;*pL>ToV=ACz zs5E6nw6O3wb=~1?Q2`;jsz5Td+7#@Bsn4c^iG5C=m3{I zVp~k8+EGz_UvgnfA!raDzr_?c7@UV@qY2R$-Zq#|*>7IG-yR4aY%Ezkd|3{<=Bj0P zmY3TJPdnJ>aTqkGQv<_blK(*c>an6MTJQgiNo=DlSzjWmOf4-bHqYF2O&PZMwdh!? zJdkMEa8hiKyZm9NU@n>!6s-9D2?x$q1Lk+sU`DrF((4V>)K7Drh3ZC|A)wb52y!^N z0BkZVil05#9r8ZEHamo?+$@YYy@0*FfOg0}Lo68>(&vaF9~gYdH*Rc;IQv>K@ z@JwnKRjD`{KoNFX?gDTCIw+ZmW-#YI{VJchbz8}QC{#^MC2xrT>l+W7BG4nPmUZ)P zL(1UvI%O*_SK20vd&}@};ydlaf!#Na*o(mvv3?_O5&{KbE&chk(SCQ|f|l|RMvsJF zc=-C|wmCXC@99dC9b3>=YnmJ_wUV#23ZcZ#=C%apMG1sunTG>RvS&Bkf>`KQRI!tJ z&<`$wkC90tI?x10*f*v7O5CaF>Y$q#Sdxmlq=#l8E0j;x#5&Flj2s;%T=-z zY!Q3V6VZy_EtVSGv!05kBD zxf2~n`@Pu*7BADJ9 zJd)uTVlIRH4@W=o=dZk``mO5N$*mvDZ+6QmtT&n*9#1RnkP0WR*gN(OjgJvwEPx61)+QK`z?ER=cRwj8TuR8V(siS03t52Foz>B(EtV zrvj4O?V|!R(&sx21>_M0D9WCv@5TaSFG+3oOSbA*=~OSDkz!WP7?sl^ zSQmq@NhuGv7Y91+L5cCyJNX9tkakLVUR}?n>Tbni)70UcmQV#Ci@x!euNb|*=~SP?Q%5-992(YHj*5Uy6xu^a89g9L;H<| zEhE!Tr{d1Iazdp&n@G*H3+2d|D`OI*0e8tAw0y*DktLT9D28$%J%yVk3Hl!=}0rSZ2^ z30TT?tqSowY2i$^H9U%C>sFC;?Iu9| z4a=RUTA5axmL%7^pzm6`s$UmQS2XWFgxz1Zr+%;kbd%>jR?Q77T{|NkH20asoB!(I zc$crM3$FM>*1XmHy0vDc=5RTs>-k82pLNck;>+&(jfwb?_2PFIJWsbTy7 z(w3e)^p)o=<^iX>_Hym?JBM>sNqXYn($hvu-5Ka(bLSBs6@Cf)SO&Al@lYmsKBNfn zBS!!-5oNUaKlT2=SdHVLtD`&cN0KPXR@o7ecdUno)uxr-l8svb#c}n4q&;17&!)qi2u%E7r0kM~ z)0+qETOPZrErMQN5Ci{X^qJTD&Fu4<;#0yYk7#HT*Ib@O|Z zoBuh+3mUSjnj^27P}-RN*Rvks)aFjd)DJhmi{6MXzXx0^rc{6J;3$94#L4jYW{i)E z_XFM+LbuN<{Jy>1^=SUvIaKY=EkK1GgGaDZUpsV+r0~!dNZ~Q1dj#4JL7Y8}jR`yF zhPiN>au54hR1{GRzH>vhbMjpG0Ib@R2S~x4ybgbOKw<8}6t3=|(nxLxN^!b3LRTF) z37vux$Q^2T%L=4*itIG5d+Z1lQ>@V>#k5Q9oE+*-oW_Yi8l5_D9f>!$Pt_(-K4A9- z!>LTMT5AvEGIRp2TG1E5^LvNqv+h{+_J$JWx9h+09`uE8?YVcU5ynL=xt9O%F)H1^@lqvcQ z+ye6ET|1JUK8Akx;e=xu@Fem_AOR*b!ip-XHG7iI9juvwK|j5{B_IOuJ5pUX!b>av7fT&WQ?)*m#ZxxN0 zpJ~(t??eRcM#@%nw-bg089MK|t`)%>6)}HwRtnImZNgE#y}n++&hdJH6ks< zRvadIT-M{Xm=>n|QmqE_o6+`@sGH<^D?_#vj$ZNKW=_rQ%Ns2QtE38{k-X($lYcJT zilJXgz&7-Tu^s7Z9zjVhtXb8~VsaYYmKAq${{Q3cJ-{5ft~1ffRVWmIszS~=G`azF z1KsG{(`kBgp5c%~4u>2LXPASSC6N?G(o~?RY(+&*UMXRXO(HJl9iHGbm3$@OFz zX{v=2p^(S>(@$h~VAiwG4E_Es8zo8o4!>Ak^L%YIC`Qv?QI0WvjEX-JHB5G0gRH;J za!(+zWgXW@I-%eLHde>)ihFa`AA@`m@KJ7_I?q(dcfXr{-|?+~I!5VtsTXhhd+RSa zM*2s+wHKhpn~C^(a1`~K%|&Akq{n!Ane@1i*Dx@cd(K!~TaPCg`EipU&@=Z5n+_ZU zF-AY%VO`p@)@CRg=2T^=qXC9g@N z5jn!@Fm4?h&&|?&B56KWk$x%K6>krouB0;aGxb1aA?8bXjs((Pfq(DsEH)l0h2klr zUY^=IQJIb>ylOaYr5d1SE*(1>&uhZ}6FF9?%#U@;<6-sS5g)Fi5%7K}yy6e4W?NC; z{h|BDVufb6`JGcZm~_*4o4Iv|k}Z|j{GPG3RKkaup*YVxqADIk=gU8G)P2SQi_Rcz zFeKRPr(0zCF^>h2#9+631}wA&UH3I4T1#+u>lhi$h-XqR|IVPr92vfMu0`V)gKg&+ z)^_!J_^`)JfB`7~)IY{7(XmtbBl|G?&2+N_6KD;aAi|>M3DDO#H)8pZA}dz(F|P>#?y;TAKm?i8FY$cMxXh7+%_K^{t(U=}1`sG1@AAcCCJRatFQAvYqGz zeu4=m4$>p=-a9o0NnsflclEGZ(-n8fG9?C@SV7kqVGXyZse-n4V)KDm!4OVk8 zeaz!8nYwqu43<~piHIj0im%2BJF?z*b#^N4j}=!ti8*innvF(%u2GrM47=7cQiszO zVP`qHM=?SX#YhIj6jr{IllLHfql;AZy7`O2#m(76%u@v>Q;-LdoVi8Hs|ao59-zV*W&{WK}z zXD#Q#>*(xzxrz=*MSscF(M|K%Q%}>wcUrx}v%LrGO>5uI*W(4}w%t(bRnU_67OdV~ zRE2pCT6^y1*U_h2!2M0!NGg1RP})#nY771URed?vcOvD6cS=>1ZLC&x$wNuV3bS;V zUsO7*gopj~zfSY{*>+;@8xPqb@7@h$XXC!r?AX1B(_s-w2awh3V2`;FPJ}zL+~`Bc z6E-LoWgn)U-=Zyy|F7FL!jYNSuC+t5KU&TSf+l~cky|}Zl?X``dHP?h;nUIDo%?CC zxO!NYHAO=1AvvYWY9)kmw=9NuX-&8d0GunpSJPWZdH|3->IYIq}hBQfg^wcRaE*b!B55 z0@P$p))k+$|H1t`i^VFcM_d0^2*x31(8?K6rx6Hy*|;8a~K6xSv39@$M_Vqe?>RWb0vd2u1Y;;qTJ9EB0KcdqRA`2qgkO>67hR z=TJ$v^|A4=GM+4L{kMsc%2F|=sWA@^0IB9Re5U3Tc}Wiih^3PJhOqEWQG{HR=$QrN zS$3<36d7_bcYm(CwDli5lVJ|$vA%!I#UgijQ6^(SUs<$bYyrT&1z zOSuto<(wJ}ltYt|6)*p_`#xMay48P4kG$^ltq*zqHp#WTuSpTIDDi9$K?^3%|xciv008)_14|kpozU!?(#-3V>XG)DZe6IG>2mlCneGG%qzmM27`r;(^S9=8}Ao9vphF4emNG76_TL@ddHvSkRSsTR z&W|?$=xPcZo?=&OuKAQkCShl?_R{pUv14>99=7eU*$REFwl9zj`_7*Ae8f{fbg*^d zeS6v`m-3BhWMQrG$?zM))h=LGaen{Uc+#gS2otB z%xjYT>1M`LKSj2N_DEFxzVLQn;?Hsfc}I@}+S2-oDO$t?03JZy4J78^GAKOeH5l%4 z0vZTxjZ?)@OgMN0@jg0s0j%ju3E&1WW(Ji@EErk>rtlVZpOmTU3-l`46sGh@j?+${ z999%olZ1?=!5X1%K5P=gohHJK(yc15nRYZ5N@aB1b3CD?lZW|d7m)I&v=bd?5v>7>`)DI9&Oiz`w|o1{-eKAScc2Kh&vedV2b^OcICq-F zgc0PBoe0^vy=M%9k)Q}sH+wSuViE6;BjluN$bGHe)oj1?PSRUv5hR{I2)B(R;90|6sn9T{zR=GS%}J9#Us zm=rCijKn1kAXixkiSvU3J{AO0U-mHcM}2G?|3MG1<=A3USgBI4PM5X$!`J}~gmk8x zF`&(e6=$geQh*RRl%W&MDiSiH%k$IMdJCCq-kh`!HGce_tHn?>7}Z8%;{nMCRV^R| z`QoJIS<1Y{vl06MKY{4c?ySw9nm!*_Zb6fEtX(CW_<5+flampFI?72HWq>#ukomg-hYRp+cAz}#bF6QW(h~50<78wPTh0<4Ng9aGH$A}` z(MX{2q_38V;n&HAp#wBN5yp_L7M@Iv-}8+tzLDNaUpF59tS?yq&GGS5A3N|#bt`pp)fY?@ zSii9AqunL^HoB!arf9B(M+-W9c{+)!>_o0&#9=+(?2MYmg!=voDe)MjrYr zKGV4!A^+_ydIVB{?H(^gPBh=n>lRp_fC;(%QEdA=P#d+JYwm&isOaNzBB+65s>}m; z>x~Rua^Iua_;0pBYzlf8YIum)PUbGWwq`k#cjMjygW5L~X8P)=dNJj;hAEts%Tzrn& zby;D9yitP5;!O#lDNI^bNUtfS&hqTa6by?Sz~d{)%c5Tv|9x^4X9z~^tu*es{>aw? z6PfGBtMTrHwx&tZ;^C>zaY0eMD7f?cD}~)&uObyx)GMV(t(islqv=Vgw)InsS5b76 zcwzs(m3@aXQCUv;qDUO8p4Mc1@29S^BCQEe(+cxu6%gO39|Z{crYo+0QQs5JMs%>( z)N-;1JsOH3W?Qwm}{008MU(2~_d#@J~Arm|^>zOcJU+Z`)ac&=UJmcsGnvvcB{{?w&bcl6NdVlF2C1@wglgXGh`2%7`XB{QKm8 z4cEm|0GE`fQ0q>|W=5XOy-w#Jmc0*G#wztreWMluvRS~!gYV*j?_x>c5pLoh0EhVF z+}pTkxDRk2<37WEMTm0!W7OaG1#}bLf%CQZ&W>{<9)Ffl1-+-~#C_9;;MhKZ+8^)- z54a6Sj)9LLIeUlcd>D^_Kez=>z-{;E8siu#%X$^jz9K>R_}cs zaaxFL$wi%PtgY3=YE><5cV2&>no+b;&;3?tR*HK8W>v z=esed;~nm+_qF>UdOIpQJn6puc)Rzc={$;T;e+k%_D=K}wGkQ( zo^U_%M9b;nOP2{Mb7;1=$9leX;PA22pZy|j>M^@lCsbPRw%OjNZRf^2u>)3VBwx2%ErvVj;(}QlzTS?gRDmsq z%4F~GT_}C?#fexVD>T-$(K+cJQPTo?#7JxLNGK66SZXcg4d~_cvHz=d<43M|wieuAxy?Jzf^3C4`4F1P`D{ zzpnVr%<6_9udRVzUg%_f2p0&F4F(u1RKm5s#XZZQHEM!R%sf<8*s>Ci`R2`vhNZ z$T!!bJTLG;e+sC-FGt!_V;))DnO-Wb~$-r4+0GNkZNSfi;czu-UY z*XLNA@)hAH{2Sm)fo~6RUI_ys3C|6jZ;&Qbr5G#7_FxDa499WA`$52XCobV+;{cj; zA>CyLq@xi?Zbpw{L#)cNu^ImF6H}5Zgp{od`BP`t>iUf6_oew3pg7Svf7Hq?luI@* zdVq!)UegbGG^)arA--rIA<%GcgFXoecv{tb1@noR!sYQdg}=r(|MVlXAxW^+SVUOM zSEa8+C(>F_5YnTBwIv_s>%t%K^PCscoY5P{=3k(dLZeP(z^r`itN8+X&+QULO~S98 z+`4idX%KN`LDql;6gGVzJ(j;T@LddmL2pM2z|8UE%&Dv#EJ zus^!inOew zFjU4U)BC!hgK82b%?BG$pPG$B0OH3fhW4?kLz{J{ZotOGaqey=0NqhW{ghUb>=^d1x<;_ zo>1_6dJ3bXeF)+OUqCIS{Ks>}LR^kEySboGS3sRa_jRlI-}sKp-3=x-3@95e9fHhN z92VVnZ`B;s*dq2;8z_Cn@?Z=(gtX_t&Q=4+E z5+YNIu2xuPR98eayY_Zko1>k{9rVV$-Jc*5VUh)l63FkmBoc;>Bbgw3SSb#jHCVq0 znwu%CAVbSiFRqC2ulS^fshEXPRWhv1tUslVN{OT{jcnA+Xv`avvSL$gy=l_F@X)@L zx#ZLKncn>39ZPfOTq?J_9J{}$jEO?xe*`eH+8>FCg0G~e<(!>J$K$-rdj(TS#8OfN zNP&n~4%o$PIja`+Xm~0|b0<>VKJmXmriW?Xhz?`X8F&=#ezbrJtawY9kv%H+UYx#5 z?cN@f$a+j_u0f$<`r=@L9fZzNDA2+*^rkU20?B|$2yjE9-A2=QiJB$ic0UkAfq@Rm zO*K5)AV~`LfRm#c;zxiiNl4U36vf20p?*P_i*R#Ue*oK<@VHWQ zKN_!fi#P&-WTz%|#)gI4WTzps9w@rtIbmtK(*@e*@s>>so%;ue%e)gB7d34QQ zxms%HXBy78*9+-UbX(c}GM_Z=Jvy@&Ly?F-Oi1!w;aRg9{}lW~;t%_jYa4|m_j%!2 zWIkJ%I!!!6&;u;^%O6vopJrkVIF}#`xqfQ0qF7QwYMhRI)~4|JGLj}9B>>o_UW;iM zGvE7l>7bnhkOAc>Hdr-{KeNrS>pIB{aAi40Z z>1IMpjm9Iotr)^zcs%GSvH}NB9jiuy5e%F_ACDBxEsvi{x;%Q^Uj8xuD#!^vU?3O) z$ckK7BH}_31UYgOuqcsWot(&kzhVeygexgTYlyrA<{BY^N>0+B`O61RA26ilThH#k z=IR?dBgN@>RP}h%^L7M=QEmm&Aihf={s+WtBpeolXsaVkxaec&#^EUpUP-`eb zR$!!!VXhuJxnJx@@BoAdG&2AdoI%Y6TBCUZC$YO%cw$Nh`|c$Kn*fo8>33@+Vd<;4PYzdrP24aTi489!IgI*B2olt}tlj(-oogmSHrEqNw zf^Jx#j=~B<^po!S&(guWyQ1@wH0@gqlD1KBkTQC2RDvSv-R zY0zwUI2Z}4`*M^nbyYqJqP(7$tqdI{NWd$Uq#`I0r4z{px^7!jNL3c*Qu{yk@J-XF zuJy#CXFs;FbT}Vv)k0%4r9UiACXA8!#ZfT;zs?g51Xre)CX-D-S^ZkLjb&r@D=vJP z|1|uF$7xUYGz^q<)x6p6o2*;TM7pkDX6WTII;t^60~ERBT98k{hSGCC{5m1EdK!RQ zjTgZC@uObl1sNdvO|udRj&7FeUl68lHXB-SR75{d1HIGFX=a%ou>S)pi~L3e1(eMg z?&m6nAozbe2V9#UK^Q^WiYP-^j+HFIdn2!F%a(EO?YnZCQm<*2d?uC1rb82b&9@qq zlpAEY9(oM3BBukXgzdfWoT#GcDBSmqJ=WkcMovhVnH)Zh*(6ae#A=*jR^ueyi;xad zjS~!NxIX4JPczlZNLgOtM<-4ln~)O=O0WRrv}p<-)*~Y+zwXg}M%4BjDxd;P&M*Bn z|Bw7K2g@usf!Kt4M)-e3ukQi0U#-}+Ly=%?e0<;7@$23-+)o~`$b~@F5J#^9)j(xd z$>u59o+QI4(~gj6#4|KShLlKCP@-|0$WZ&iCKg8C^|1q~j>qpu;k@w3)C}66Iq#iN|>sXbn8< zMV_*FFfpLsq!>fRNSyHr5QXF3mkS86 zpIH}zqhl)vRxs{mba8RCIj%_T8XgpHd+E=>k%3t>26&eg?sGT}IJme5gGd<2>s%(r z;Ap!L+mcLP0o^v(UF7NR7%%*;Qr$m#ryW^|NaH`f1x2sp{2C^1Nyjy5Q8IXgn&;`B z-zNMC*pXrsUtt~_?vPWsJAq&db08WWSi{?mvx#gX(nbloYYSB$M>Jql11?Vwa~1LT z-K|ci=u)MvrpkGk$I7$uu_YxsH-6OS|LLdS9Ek_Y(QqVb)V+!Fl;4Yz zDanbyL+tW@42=XMrFQ8&6x&1dM$CpG3P=+eS_rHsPDdZ35cZ)S#0a%xbPXCV3hE2D z95plM4uNQ!bZ2O_RSf2a-14-~0qPEigly<@rC3hzY@N_^Xcpf3E@gD(4Aw%FmupIPTaNeezrhm{9{m{LJgK`z4G^>-Ib#?r?zuRmvg%h^3q6h5q)HRk zb`Wu0-U-ODO6e6OfD_hp@HUN9odpgqu04em%yXhA5Q%Zjzm>_mB?ZJe13)42udcrf z0VB!5@HEVSh0ELJKciWvcdVT}qQu@G$-Vcy5}IA&&+I&sSSjZH>q}#;IX)N)*uF-4 zZo2ZmNGMLTF;W3LEopVXqDa16YW&e~zFyMfX{N&`#ovYwS5VDFj$qqY!6^$&JiL~^ zpYa=F)GiBpDU#(JKcOdNHOvS?X#cn>L7`0v=M0^WLjqzNb3vv#BZ$Y+Bc@-{gR>(C zwmyFN)P08}$&xojHN-EL-*Wt_Po8`5o#6d2&?@@6%!FjCo+lMu6d#D!3bn%a+Uybk z;-&9_c^`On#ID2}3vW}!{*EwC(+Da)n>iKO>*0Oyg!{-`90+V(2C}R40vopL1b`W) zX_vCgZ0h&~D4B{mZSKD093P_H=Ox*jDzI7I6!sww%n?Ng_5$sJFgsnSVKmAXknWz@ z5w>vH$?D{i_^s>pNAEoP>>bgt$RDoR{MJ|J7r$On7knepQwH)rLCm>b9T^Q+z#EK@ z@L+1bW?in^$t79Ba4xXnxVGj?;yuvH7UipP@1vdm7unT6%Yeidk|JD0^R@TS|wIcx|8ngJqRA+oX6+eE}7h0ZhEoCSHuRR(Y z9W&&bshNw^h8M|Os^6SSWZhoimpt%zZpG<2#&T3_ei#x{aB(6yM#-y-K-<8JL7QJC zR&4@D5y=cIi8FC$$YVpm!%J&N4=AbEKc)bG^0cfk}dCa`DsfZ-Y3GT5LX)Na$bcV}1JXy+4I1!XGdkMxJpRw5Z zSu`lKS|-9S^8DbfQsIYwPDh!Kixp?OD^80eQZa4$FFagNKadW_kg3xn-Y2Uk9+m$% z{XDW)l~%2I{o*&q%4TZ3h3S+YJs28`g1;)2Qv88q{wyZ$&{;SlJj6|c|Ls1m4}TW3 zNKvRoLO;v$idk@0Zu+wp73#>+gBcFoPARq@`zc1>o5JQLzC{Wi0eqZ+?HM*l5SxORTC|oPXNeiwb@aK>Xf(a$Fa~T;&=KwRTZtO3NXY0*^->}o`UoXGq?y*Q9 zS)IJ@Cp#uf%Xv>+(xRcv@-F-9zzm~KHWC`FtoHMyu#C&rmH9!wGOl}3wHq2fgzdop$+)g~LwFY_j5eU~P zehr!24!pjXJ_9f203Ktq4ikubupEXI*5n-jf zt%#%2!rG+)F9}(F(}rDR11S|`w7@v4VIf>fOq)L z`mR0YbiwwYnGNa~@hYj9F(UwtB4G@(uoNHNS4{+(GOs8pPZNE)*YQFE{2h{obnj_> ztXrLq3&&O^!O+TrAk_tfm%WOrO95}XHIgVt{Jbz0$xiu#J{h@u{;dhl!xs&!J(}T*B!!jV-7CN zf{oO2-%qyyrwWcBj%#+{!FKu(6l-mEyn*-2?kiq|>{xf=D1Tn`#gmx|IV89-3X5<* zECuPV^b#Mfg0YQmQjC@fnn}0I|4y-B&w!4?+bqXYXFa>`{LlAHCbI(AFKVaPw*D$y z9jQ$F!$wpWmLooYg!hR1H9MM-l&>z2T|cQtM<>@ZCq4EJ$#RR?3y-+#rSG8U5dJE- z7xT)CH0D6WS?*)>T0Z1NC}v^EpBkfpMpp=R96B zmUai)!6;DCo7Rhr1C)}=-RS(sBLLZ84T13N@)vX89SIn^V4LN`q4Obmes?Xt<3K8$ z99@0=$MdOOhxX+sk51p?3mcwtvpL@Ko0V=bR@td|twOjoJ3OB~!hY^Uh==DnHYEY~ zgE1f_GImI&+uIN@mQP0mv+YRWtK*y+HG~;mAiF%|$J8_aecPBd0OQ*fR9G*O`9 zCzgt4W2opW;y)Y;H*48YVO0qgkJpk{X5R9pdM)wR&n^UKPZf(RPZaF9I(>Yk&@w7% zu+Z&F>+{*_e7&8{-5ZuQ-{BMSaMrL#rY+Pa;-(TKcb%B;xzTfLc!gGtxjnly>^dYh$V0Vb>khK@d0 z0W6AW*&UhTC)nt8pt0%>`LARZ!Pf^;-S z(m4hi*U*yY$T0W=ailfF%EVm@zATYy&`72-oLFoOfKOC8F}l09~UF(%4kgBm+Ln~O)J0k)pBY%02(^G z+09%PT(>^5e>(fRVq6wuIY|%&KPE&s67ken6!W=!hcfmw+PYgtVo{OeQQ+>)pe~M& zxjvOg{0rcN7P;SKJdG6Ob1Vp8J!z)uNv08fx?fCpY?|Ugm|(Y%YTyLHv8UN01xj>Z6$~OFZ$Lx#2_B7??mv_dGyO zjn)*g_0WvpHpEX9^}Phe(wn|QiF)#Tvn-2`j!%?8S~Pi-oEMAQ9GOX~+ zja(xcD)7OiNZ}XxcXe?D9e@qQ#r^clbaw=gF~1JV>=sBJ+ca}8AfQ)3fvlQUAN)3~ z4TibEW`JiEM-&M1F_;nqkQf`j2n*Qvk6^|;|WFCViz!_569Mw zbSZb%b9*RQN13%)p)7&Q!ZGFJ?*?7 zLd8ZMUD3V07SzZr)|OXESsJ#pL^Z}K%Nd26=Zv@Txy}Mh-Cc6=i5okE20(;Bq%+v1 z%;SgWMG}LPLa8;JfwY-b3@dfDC>pNPoSBF?jlp20LL_>$m5K-nnHUXqNxXJPy?W!! zbg}gQT-2KTlyqcgN9e2uyKnIXJW?cC-yhT(Z`z3cx}Zz<-=A()BiUL4v!I=&m}fg`dg$D6zo(gidsdxC`!;WDUB zXYjFvW(S6+8I}|Faw3Q;|$w;OsN7816 z(^7>jQHUb;iRqU`RUH>Tfwu^>sYV!&u$y(N3J;i#^hn~UU9*!`Xx<}vb-EC+r?5JO|jV35rg zrAWX^o%a z5yd(qF#V&n1he!HG6l$EP;{GRCES50loWlV=*)6FEQK{Fx;op$R0ek^H<>YQwn)A1DX)64L7%B<5wkkFfP*I*uV zy(kajIyqZ2<~OvN9VW4tZcoVQn9jX;_Kf@9Gp6$t7UpT-E}v$F21m!< zA*|(&HEfBa$BE{xHw`TH8T{U3VQ}~EV`4QKC;f;_vYWXDFKAiu>nH zJK&F%G@oe&+HECd$f_RGli7kd=reRlG6Pb=EAyaS^IA;__DBs&Xf`nOaZ|_{^M)^@ zDpJt&=g_rss#%sx$xJqzL4Uzwt~pOPB^uQCfTut-amYhJMJ6$@iP%~wBZ=kfw9~A+g6v9_ zvS=N2j~1zM2aR0+@L?goGV@8V|5Neh*&FW5ry{{`B(s6tyt125RUo zOtF;GZ<*dLc}FkNgqIuTu{VYUNyeyP!Cj3UC zs0LFJ6VfsD*Iy8Rj$FP2T`6EvmCLXW0^N?Ygl6U!lLP4mDE z1BJHFg$|oth{-MQJKm1F#fm%eTGQ3D+6rESSBXkaZ^w{1`T(J2dn4_^9#?`Z7^Jp` z)U7~K(jJrgDSA8GgN7@?Oq-_U07fA-)FYobb0Mk2`l-~1w%3QH(ZbmX(Z@92QpOU8(3z&?_lyq0^8`x|tMm7x2_Ido?e@C=wQ1rRi7^9Uo{X@IvXMv@+s-QyZ$ z2WE$7Wv=K+rnHC*>4G>#Fil8aLmWLQo5kmKa=TqArMy z0;%cl?Fx;&+`qr!^(i|8d{+!*H>_A9Ao#KYzy)+~)?AvuW~Nj45)PQK-6*$JHU7GQ zA(^o;D{UI+Q{`37eo$3CMz%R0QNt#?&vEg4*vdP=Bzy?7QTj6Zouv*1juw<;vAr3S zISmTd8H_RIM8Hld%L#IO*4$TM4QAa(vu1BUy%A(jS;W4KB&G@GPr#MhJ>)Ubv^!9l z2KMJE*#t6is2ZYqf;0W#eZM8UiKH$PNz*SlminWf?}bgjzmf_;NZ4c{%Pm zt2^!U2V5`{Kd>%6VOgblBuW|VZa-;kl1Pienw=e)r{YX6W;?sl(Ls@hI=PEnmNmv` zEK|=JG?yF>S|ZdeWQt}hQx%p@`kCr{loELq^HQ#brA!(3CUrt0M?fib@vV{I)ap~A zk@4JIcuh_1s4Z%N>+eI1_p%y(T-Uml(K-H|*G!#J#rW3K%}lKBIlBHqaWvZqAAdt7 zv~b`NNmp$(D$LH-`9cHP0_`bD7pTmSc8B>9O=%^kH91qLXHtqSJRF9sk$|mfn0$exSb4nqM4wvb!Nh0=rB$ z50n3qFfRNmI1lk%XcW-N$ivP7H;C_I1Q6t^LA_BKSDQQ^X`ETCtFimekKTH8R-OEa zaBrnvOiM=i!pPKwmT2v#vlw{{{_SY;@B{aG40ATA1+T=(F5NPT+ei&?a z_=AB$jf=fd8`T+VhGxup8chHJCc_C(rB1_g27wcY&&XWLDVE?tWYYafE+YPxp#FzM zyb(Dci5d>CX@Wn5;Urys-kS~JJR4ryt^5K0`@kxJ*I#W7u}OV43l_~7sLpa0c!7Cf zx>1>RMEL0dv|Ji7NFW<12<0dVRX0p2!F>fUhL{=iv>H2(&B6K{$XIEa|9(Dh2ko(p zVOGGvEhg0MnC4v^F?ND{gHQ|tidJs#7DncIY3G?NaAy;?FrJ| z7PDrB5U`dxk_oWvz9A)9{!+E601;5NX;Y3TDJ2O^2xTk9Fs853A9Y=NGK5iha)=mF ze_%4A9GlYB>~T#nvY8`GAD52iub+RN#BT)jcqHYGbiW2VnuVjX95{ZnG*aK485j6# z5{VJnyY5~amlXajcsOg^8Ma=o$Kr@G4p%^m)6A9W+i5yPZNSBO8a5HQ=v0wa#au$C z8o+gWvLG?TMYAk4rp(w@-xFY1=(OEWvNtK)MVC+F!FPQa{m2@%lC9gt@RX$a z$5?N-%zpz|3kx3nK8`vH;wUSz{Xz5esEZGdrffQzj13782*6;Zhy(%=39JWu>1ebc zlCw^ja(O;BS$P_cH1-B=0!byQde$%hTM(G<+ z?QgM(ISP8T@E@TR2?Ik=QV+@&i19s`LWDpX{Y^C1i{RH?&}t)7L>Mc&^As3B?WV>{ zqSZ3;yjRQx1&=3(F*8i|Dee#PcPx0sK+!|R<&F~rfGW_YA8bT)7-I_Y7ci30#-GHP zdpy!`n?qQ&5AUHwiz!F+*N1%ffm8dAHGJw^9Dt+xXd6UVUTyDo_1>?wwgp_2z%!jj~((xi?Mx z;wk=1Ob-gU=bb>&fc2~IkJP9!mPYw0h-Pu;c*yrQsJ!Yd;qI19X9{-?QQ#5LUKH^R z6FSE69W!g7^X(t*)hdzpf~w%m{x26}TzcpfKem^#|v5pW7(k&qkep@)VIxrg`5T^#sK z);HpVe#4LRyH2m)?eSMk%J#CO*H6`XUBs@&q02m@XpwR)iaHHfitI~DKD4-eQ1ppM z##=|kkH%xMIO5c6&MdW7c1%R@jP#gt)_;J$>of3KTD0fTeNlHiR}gH{sEc%KnC~Q9 zsf*Y1*I~BJDu8*c_?-Z-%K3*{Cx%Y4&Wf;u4cLcTab(}D6N+zzYL1*YgFSnc(XqJ;9&{A%irNG1J z-liH%hbk`8^^0Y8`h&Tl&?u+y2g3c3nT?!X2fN?~ z;7X9L9$f26ZMD^x^Alv_W?|#Z*a$WMgTLeCP;y|0^@B7H)q0|N<%nk2i_>=XS_pFe z>a!%sS<5+yJhF502;MwFg50)HO9F~3>}a~AP)Ni6f0XQ{orT+BCoD!qqKDGL!R87Y z<8uFB%Q+JFomk!$^CIm(MZ$LD^T8FSk%CwFmxw%+`%lYE;uQOn&G~njt(gE4>1trz z5Ql7M_1RII&;$eyV!Rp$p&2hb_98^{sT0Gllihf9}7r=9%cMo z!)pvc57149j+~gg?y%1>bC}~GuNy*e=f!R}2&%mB z@NgZi%d%S0x38t)N{#utxTY@%1Nhfts1Z{C=+Lu<1ih}0?KO$Bku3~x?eMWLEr+XW zfFkl=Fg{-SGFy}{SAL=kU-GSDT~^$65n}B7v#`#u@fX5GBt85iH2#wsY!Nv1?DjS| zgLT_dQ-EV5Nek$X6HG8Uu=~Dr9Y3=`LX0kqEzwshKi0RTS1!`xUhHd8m~7MLg|-F~H9? zNDkK&GgbZDy+3%wvK_Sbwl8oR37Dbvex=-n7>|oIiaLlfFhK*`;LcYn zL=SYNQEUX{Vx(9A-F!?vD83WY$ou>coJC#a3hAl??o}fn;?|6azs2M36Ukm%UoMXnjp~;xwD7_Yj1~4bSKPmO*$zp-uejf?n?t}Z(a6509ip>p znz@{OzUIv|D<20+^`3Riyzp%Ary}&-OEwNbbX+<0%3fBL?e7L30yqeVHf~6V;eI#y zSt?(|m$xckt{RzUnSK9yaQoUX?N{xU`*ldi1DwS6AGy3=hhI$>PT&58nm60T#=yn@ zxWc}E)u*xj`qB^huY+sDkJ=Tc#sj{C&TimY`e}wwNmJJYRR0x!3O7hFAlGmZ4Tsy2 zB$AI@Bn5iqAE(B10GLUR3V=ypW+K5xYozUwC$qQm z3CLm9@T_e8Wk6{sPMk{{flQ6J3WvA-`ycQNxPC8un=1+RJ4m?KkEyXp%K$|>`dZ6^ z+u$i)C2B~wX}t{phWH>cGLrHMbU2`W?D7rKLcQkQ6l;2x7SNY&mVYN|Db2Cr&4k9r zYcIPQ+z;K$MDjK61s%oM(?_@-T8{yip|yxJru{gP9$)Ttfcj$D*-c1`QVn;2q>9iPgxy`QwR>Tc=3M!B4>&zNma&hvmUj3pw z5KbA)SE&6|-}?5Yn|UT|DdY9yTJe^tsi=*~Wo?ht&fUVB#!7G<>+$LvGK+`E$Ead& z+{53DUhqZA0Jd9$Nq0Ra+oW5Qgf~Qn#?x_%$SJF6r5wVQmZ&Ly8*GgUVUAda6K9M9 zGl&(j33(k&l1JwhkwJ5(R3OidpaBbmffU4&L#0O)aR5qnOVm@Zsdy>F5dD6y6wAag z(;oC|o|ZUXjq;+`GkJ4RGK;r|ZMoSvsuyqROvmg-tJZOE|GH!@=}!j1XNLL9?L%|G zCmp#hm}k6TIp>CHH);_D3+$Z_KWosCVR;F0xt~y-9M|J@+JMe?9#mEtzPy7 zldqwlY)OBfdJeDu3;(>WyKK9M)YZ7BSKB)ElC68?!6?4g&U&T86p92TQpmzh6Vu^f zvpLe%rFQ;S{;07Eja(t|U$zgf_}%Ll#`%xp?5vZ0$f9-0)yF)W29z&DA76cp(!PTI z9v-qUJ5Wb~-lUD@$wLFHmo{1yQw=GesN#R^*SedZbKrjDHSXxWIEU$$R<_Q*#y$P- z!V3CpN(?#ScG8qPgB0uG20{crjAMa-uD%Tz=%I{B-5g+ka>w6Nz7ZXO^^ovh?Ep%1^7U}zpH*E)LfK2Z6O_1KNFdW zkL;MeI%>{Xz9#>$u8W$Sk9Qa5M$~u-jS}VjzQ_5FUEhc0V(abUUk~&dO$2)b*DoR) zKA2~Avp-)X3p5XV%97-a77-?A*3GA(EDw-FFAIz0mgSMpr`|S~0htje&cY($u4DSItq^m4R+=G&fS7*$);JWHqQEMrBnm!bO75V#uzDn@8S@iG?x4 zO`?hcG}hlJ0a>aa3u%}Zm;zgm0FRdMEMxAQAlBNGCu$-__$iWbTEd9z$h`V!Y(A7W zCq`nXR@8(V22O&kR1l0-+Y=~H_{#O_vZg)aYvfEtT#tK+umk=iddjNMp9cC6`glG{ z^}T+8Q4It<5Kow-=HhPqd169X&f^^2H1c6M_AD_8D174LAnS@QYdSh4<#Anlf|}|; zFgl{^5MZzL?JQ>bVZX5UPGls~e9^7e3?~UuZEl+8C{hjxGZyd&O2ZrRH%EPKJvZ-d zDxcRQO;w+fQ)#b9uPT)+2s?9HBHb_N z=RbjY(NW6b06D9;$l2{AYYeI7i$lCrKf++y5o+R!u=M*tac_(A(GhA&0bmw!ugKaF zIf^+A(6Uf*hnU1bgF_YRN^uf!3g|f197+El&A-VWTdPF7=0jsrX5OCiHM^4qp_cM4 zW}|@-2|dM_X~+46&+rZS0yg-SYVeNd;1N8_^>8*~!tJ_y{I8pXWfv!~WDcg>d~qEf z0FKj^xtVGO{1_|MKxT^C%!M`~DAFA#fw#f#y^Rsr#ZKFtduzLKYv7r;opJOman91R ztLE#-oB&wf^C1IT#XD@=7vQLMxJfdewJerTDbsDTX1fU8F-%|-W1I0(1jQ9p8d+hH z%G-pto{DtxRB@rA7e4DAU+54+K=K)|wt#QNn+YeEO(ER~r30btdlqt5BE2QfsXOkb z*_U~Ba_j$GjF&XtvhRs|)L>GNw!NQ7wj!38{E6pRJ+>T=&Z)|-=%Q}Lw5;}+o-xC= zT1y3d$F+oBRgD`}_L->K#ZBEIk|m!;My#HP%FJCymhooHI}8 zUWl=6Iq0N=iKX7x8MZx88l&1hwQEB<1VpJ&KPnSdfQM^C6ici_mAypGVGtyJ`j673 z;z&djBmfh&Ku{B{L{jI zRW1&Xkdk(f=VMu=Mjj6Aku8(QA=ePKq+)#;*Fs7Jn!c)Z(fcEX^w`S-&|M*JMHS#p|)vU?iWm_m>l0PyMu-mV^-ct%fFx$Jz`f4B)OXTb0H1*o?0!HX4tgm!qH$LUr zyPrN)w3a=xnh&)n=hoSz?5e$4Z;ewo8jcdeaLhyX*(`IkoC3|&X){;!JG4JK7yF>iDZu^2sGhs1;*=uUJyewZ%q2 zN()L`6RRZ&?OPJgXfx5S2F1M#jml^?H7}=xuqE)|LsshE1$!eHPs`!FE3)1yO@%K)vTJNlKmY`I zs5kNgo@^$PanOH(4Xj!j0fMeZ|Mv0tWeB?3Y#*Ppz{34}JdvzaYa=d_uF1dZIfK)2 z0L3^Kxl=?*m{BqD1ZM*PW7zghr3w}oHKY8cqB+ohYI@my73(|1MU?zz(Q4XF*!5g|ZkS%;uNBg+IdgfV`=o4!3{~GQgV$ zDdq}o7E)y#F~bxtnvl7Uqu@9KEK4U?mfI7;PV2dg1JkvtbUvG?>OLo@3iZw;lodvn zG77-K1Dh40G_+3L`4BZO8STR8(xk3zSP+^XMnY$-ZD1ZKx|6NgtszerRjJVo$iu(( zR6GI08}stTWW=^Yc1X3O{$d*L0zPOe^boj7qhd;n-KD225DpxOc#iubhMr>A_&C4GZE+eHAu`;4 zjsOJ1T$Vz)te!y^YeBcd0PEuicw}O1g?XY_U^N1PT<-v}_X1Q%aTd`K00hSD2#gB` z0Fg<@Q$q0)mX6F0zv=T=5KLLQ_X}Y;WX4oqG;VCI{D~HvYW;Dm^g(UPTo_XmH8ooZ zh_!HQ7$4mRkLN1nux@16>SEaX90RR!F3}B>Z2?;WJOk*DEx9LQi7_+{+;fr04V@Bs zdjN2QjxvN08T7n3>v|>DuLBAq*X?6L17RQlXeIb2p_7?)WU(@Nd9aVShSvT16nt2o zKfNUSy^%k)qQ13=uroQA8uh71%bvt_9(isd>5UjDsbmw^bmww*S0qpeVF2R7o4CKn ztwexKI>-GRt~Upsd>fb7cD0HemV>wFYO0a=)?FTevt_ac^tIq{hL)S(BT9mv+{4 zPU9K;-IJh<^F~i&51Q@=(X8MOo#;gwU;UuW*kGLVki^jy;1OHXJ7^9~?<^xrFwsDL zi1jR;wl)pLop32r#KF?JlG0x?ZNv6n4fDT~W;Y^1L zL||`7ZfIPJhH#3bQK>T|2tlcrf^Szp=;NfvL&>rz9Ea01y$!FzbsF%mN-Xf8tgGmBYsOpPCyDqJamc_3gWmpz`03VN(ujA9vu`~l%P{y}D|cfp5yn0uVx z&Gnby7xZhl+zX__;4wFTytCz8{~(^eQQ;oO0e|NkY5DJb1D1apg#Z>$^1UZoy?ZYX z?six8ZqvB~3x1wG>z}`ae&PJX_=WQ(jZGWOxO#z6QZpO$-VB&M`x`U#aAO%Cn=ze7 zaAr#F!8}W?3=h)Yyh)JHL4|#<^CWcS?t5{1?7knX4|e~fSL5e-yLZcMZ^L@t2*;L! zCvPG}m_fw!*qg~ie8h4RYxoKNYC!=uheEF2B!#H`JZp;XRV-v|IOnk?xRsUBd*~x~ zTFc&iqdmV|Jb&BW_diPC_(r=wxkj6@H*F1OPF{KX485ALoef+AY8lXrDth3m@L!;1 zU~^_I#fT;_6M#s_;M*X3gAdVoF)(~JMWPX+ZOlATN^by}4!09ZMP5)A$_Foqv^7eZ zkYS8hLBAcsW#}qiQ;XC2=#-*D{SJq8!!-C-xAqDDtXD01F_t8lxG_B%)+IBdCH(=5 z*9~A=6;HA3}Z*|8poyK2k$H&mnmKu+*TN@rVaP;eWO*g}`IpLASYP)#&Z(Sp=&tJS>aNh$xqD{1XL@qZ(#%LB&5XhzjU*HZ5|)qv%Oo4y z7!bkO0zW@PovISpVDNy=HNMvYY`-x-{~WO2Ge))_*ErmFWl+!i*4|a!J)>Z5dVf5@ zbmgkE_g;JL6~6T?73LtU%Sgh3rdkufS@HzaV$xz!+)~SLxEm>V9IV3dDD8Jf$|Io& z2u77*5X3uWi_N9lWT{af3Az`9g}H2M$~6)T49DY1mn1qfquaxF-BXXOs`q?SjOM45 zay^j-)wjH@;&6mpiO^z&$D;gV@%q2P!Z;>$d=z&=C>+e(9Y{6GXjn+I=XOdy7m#nv z0cX~SvQ9}r)<+oUw<%djGdL+CgDPf(Xox%)e!@6xB#?6Ur*1_rd?npbEr04Anwc3ID_fnR9pl4s*T^yEx7EcG>WVUyEdy05ING^s0eCAg)sS;R zMnfmY4u+^0HxoPPs78i1CDY*7DiCx#7j&WoBQjHB075yakE}Y@BCUyYfE&VOH!)oW zGmjkyfn!N$#*x>gWt%eLD_V?Pe$=OwL)wqIiignBbgLK%Idie8@u3Sb8)^&jAN)=6 z$HgtuuY=D8Xb(7VVdigkaxBXS<^|?{7s)sPUCYchkfHb4yNLVC6ksHo4i>}9^_kDZ zMmvHj1?9iYcmu#6tuTWqslW?mpN5z%AiH3f#ORIWDHhh z&x2D)rrY#nFq?5ByIHW<;i)N3NlQu|pABzB*IZs_xFUT+ct5I%&I%XB2=Q8jtET5< zdd?h!Lp0_kMK#7KRxefCjceu<@TSmN%UH7Wylm^d&RAEHwcY_;*hO&*Do8eu;vKtq zw0IXQGeq?FMe{E1A1wa%zdg_W1GJ&Jc-1@=f2n=^YWKvc z?}l^G!CT-Nv`@l0IDYER6DKcRTz3v`e9WAKDTGG4`D|?lD$86v54oDB+Td<{X~#Lz zVn@leHLWN==m>T!CpO6#wQbVFETZo;U{>J}9S74M%qCK1@WevADh0X-(I>6gq_7i_ zh(W=jT7aUO^v)!jprFShgp`g^MF|C6i@s(AcVck++IpO2{_?py_e&{gK+R?A^^@x?69b zBVXqs9#4Cy+B?VZ-8~4ym^R4d`>~;Spmx1iUmD*+g@WxPhB<=VMf(|W4-DfrXLR=L zdpE?xj30n>WR3xwINiRC1NIi&KJ9%WeE!b+9-)rj?S~BW;u*Zr1|`-}NJT)V!eH#| z8u4O_-Z5o#h8fczg2$$g*gp#jB7+<;N+?(F^)VrR=TOoNA$l+EmL~oLd zUP&WigEE9vLHvLzgP)5-5jZ^(!Ub)!43az6q%)SDY!MY1PF}Em5U3O%4?v(Hlys(g z$T7e{4BHTd6;zDgbj#r5b7;Qd^jy<}cJkq+( ztwZ*NJ?QpOzWKnfQq9d8IB1sjOXTL==@}PJHi32YUCD0S*UwPc{kyen%&e>q0y#0+zG z24$B#?meyxv(Sj+I`P)`P~b@Xk#OWZc+^h`q5RM+P)aC)x*jsoN+4_Wno%@%MN7kO zSRR=qsR^K?A!X4#hUp?l)CO8x&wkNSsa-8-zj7YLrOZ{a!3kNE};e4ygz)6;||Uu#ng_ zTx<^6ZE`e{YUyWOddjk0o^rcW;=cwHnb}-QvTMFtDB@42hl073tfAdYHj?nKxbNAN%Q)4B=6kCC>#Y%{X zJhm&iydeyi0zjb*c&RR5!?(N)RtShi35eW|=ZAw`psx_e3X`{M;m zJyE#=T@>Swkh)lN& zMmMGpvo=EsMq!t`v1&d?Rr6*kjdxRJGE0p@TQO0+xjq|W9N4Iz2L%H&6UDFl&U+2V zhg=KxgMrEMciEjk9&C+^AC5m4in!+_WnK(LKN)nWN+9R4T|BPaTo;dn_6jMp-DC4= zTy{{ngUP}hgzrhaVBc1RdnwLG9NN?!rvzjhyT^Da5I!pNy^f3*%|@Eb0Z~kp`c|)-+=pcTgYq=nK@V>}@Yt@eUq_~Z!fS@0Bg{4pGYG-9@Sc^G^!=)QVFt5P<0eiV8r z1+lTQUkF5f5lIE2fmG5WyRu$94kvI=%GmU%jEV4trD2RdKBfYN5KabDaWEly zw4~Rn8L^DTBU{pTf8^1mKc6u$BYaLi4jpwLGR|?*1EAjLDPlqeasXq;&HM$lc);`| zSb{3XH3BcQ>pA&kp+_`q(Tza!tnloLhyzlb#3r!^eb9rC+~nWiTHA z(0Ix9Bz3sx;jBWnR7V*n*Gy?3sR0fk3g%lcTzwBW*265ApF%J{dG!n5Q@{EF{vWGr7=^Pm)!02RpE0!e>jp%rPpoq8y}NxjtbTqw)Z$=7-3_kY*Z6zNDO^Zqy-=R zorJs-C+OzCTuhpcuV@a@cE@3>dhCc@Id;fuf2S%UXh*pom`R54(3@FSy>-#9Wn=Gz3nF} zbt6pJ#~NXKnZ+Dw2(k=xqiYq0$7s(~yj|7p4dU+L$b*U~X*k}4b+%7Pao`kZ>Jle9 z9fN*0xp?w}g{_HjDz+MR1sCkjNOatL*sBCIeS9L4R8pi5a#FTc2uA&TtT~4>7|A6y zgmp*b@j!G7Qz-qt(Gb(p3Q$&4gu7*eGOlJ)<>d zT{pZvlnq9hmPMalE1M$B44oe9CeQ256e64JbM=SgPOk=2@iiwbm>Ta-nY#tIDiDq) zUU%Zi&b%c44OoSfkg5@MX$6?htgvI)l!`cU`#eX1KCzEZ&;fAuYS((h{NUAwNsbu9 z(J-U*A$lV^c>CN&5k5hnyoNYpg8_#RiY#5p5q&aI@XE}}MA$t-2MyW@P=JWhP!QEo z1m|vs>ax91Lt^6;sy^badDo8n? zgqbOZC^v4|24nlF4~YoDN20wpBO>LvATt45mz#emdNevsaKy$&Rl7bDj^o_*+Oo2T z>Kjm1rYM?4b}ClI_;gy&C$Z;>37a#A=5r|s(1hAQ!TkYSQnt9zE!2X}CTMTsQY;?r zj5myPoz5sGPas*}0|e)|&_abZcA_~6d4h`SW9$*!;> zg@5|>uiSwb9NjV1>8n_}Rl51YKYjcwchj@&jNYBd#OQ?@-E{D-O)(z4MA_fZtIk+v ztU6KapCV&oSB;HL&?6SyDNvjcgu5vaQX%zWRuJql6DV&obwJKcFGQKhy!=>bDta?Z zNtJEsXO8} zH&v`qRW8Dy=wRd9gP=>b4?g+~>#v(cnC(nM2if6DpbM57NWK zSYt3??c*Y_r`F!5n=5#3CwKz+b6Zdm%i1VY{N)Jb1g#zv2iudxuXCfw9PW$EpI-ep zE;1E}O#Z4lTYjm%_39V?G4WNAo>$t!n5Dh*s#(cf&3qL0#BQ_?tLWWAB@cl?Vx+re zcB`*q&Th4WWvaV%r$CbR<*%G)^0tj0c9-cdy>*q|YN3zsp^ta)c$1*v%@j;ro)(rI z`O55;t*bkC@7cCIkT=|lOEw{2nBBU%d(+cQ`l?MxU!4dj%?T(Ib7dbyY@XyW4!5Nv zbI`Ayl&h0U&UB;WCXpm6ZzhumO85f6h|$#nU*q<6v%?dN0tlk0qjC_W(mmPkU0i{9 zLKQElOvl_Lkvvn^0>b(x+2lmteK8Ip2fSHU#rLDo6|e?HcDdrN8K=*i+CJ<8GQ{SB zS(M)-wGism3<>p+=r}+Etj>zTi1@o!uidVo1(-G}QS0SIG-)XVU0bnerv{Ro-0nwC#qu}C({egAGGEqg$M ztFr%f<7k+t>!Xt6`d=ez*#ZLSKTx#FoW=Q{u6Fdu6s5NFJa#2l!0T7*r1K;_X|M}* z@?@VcGAypb6-dOCX$Y}Z)e;=aQm}}}S&Y+5+9Mq%uR?GfkA`aVgvLw2lmIY@s zoO-9-`A%okAGL}@==|q)zCldHoy*(hc&w?6$ZFgdq@J)wKmsz!>B#82MiVyI&Sb(Z z)*N%GR1lryXsL=rJkA(NwOE@RYy%Ghbh08FB-#fJF+mZ9Dp zAMzYa5fTWN6dGYAs~{sZOW+?wGP;Yil0~oQ(9aOouGig4LxA7xPJ^dHo43CwYcFdCe{%b>d?3by$2ec%_k`vYsN9- zah8LP6D=v^j7k|AeIY~K1`W5O++ahboB$&ue8xv^h|VF9gXXfBaq6hkE~9S+T7c24 zjldUj;3%Mg9Y}Ua*5VYR#coxNu1)tx>0MO_UpUD=fFmO#50$Cg9Bh(-_`UXIA|wG% z32U$+k77JOOLN$G#SFSJ*A-3AMtrF#N#{ZlvzB|soVl|}1yj3XWO9DKFRyO}9Q+|+ z7$``b!HCTAC<6t!a6W(n+YFL+!!ZHBXX9WXtbLx(S6*+sDbN6a=QLTa@SgZRpw@_3 z2#|chIXhk!?(XF5t)1VV<*2dsjr0Kx`EW?B)?MUQ#xSS=c79s01V>ENx60$C}< zm25sqvkFpbElON&02P{6Fc5R*Vc;Fu!NP-IkW4>ON)xypA&kDz(k%qH*jo2Ew|4P5@}3`-_o8u&_0k^ySmu-048fKdyN+>Bb}Pwi$S~~@I(0&j!$FjOAc+j+5CW=&sauo}Y!0LSZOjr^JX*?*xEzL- z48~G%OA?)^QH#YTr@{|y8h25ghOK=7J;vUK zjv2(E4+88X82rg1uoATJIp2#e=$e41?#i*XAu4@j+s#f|Y#Ccp+Dv$V{`y zVba@+*BgsFFjjOSBUH~2ApxkU@uc^KKs*VI7tKQzgo{yf`H-F`m!TrGk z57HNy70d`BSos8@2^*TiT3Aj43Uc#giQ{ogNRz>{h~6ra#ez15m?$1iN+d=#8=^^x zU_2#xHH4ES^ipzJtU9JwLpB55@gkb{8%cz5y}7g&m3=7mbK#qi54UI`Os^$lH;^ZZ z`O(A0QH>^WPr@kh3RvWUSke`zswt8yjBol#f7ZFY6~%MFPM#I+5`IzWxCq9f(;tSS z93w#5@cA(pIs+jH-fLZ=yS-L_IqoLt5P>g9HJsCl_o*KiH}Ao6oI~KI4U+#mjTb7d z>ESJlG|feCFF!lCV?SGt;W4}eseI6yXq!O^h$AQQ$$ql2R^gYxy>QZErZ}D zUGpj7`?zM(agPg~Bt@`f-mR0>GCyCuX@&XOP8w#M4)dxPU$rSWi7}Nxr@WDt9k|Ne#MzW&d6thf zzP>{vHa%8AP}uE>L~Y3PvMdW5cp`-WFWY+&k2RdqTsb>p)kbm)wkZqp(md3}Y2;dV z0jY;>O5153JayI=$Mj+q4{sb;N7;e3o3A2z+WDg|W%R6y<*xPjpyARO2*pW8yeW_Vj-zwQOHAO1BQTy{m zYLQ_vsGJZQkR*cLY?v;OlT3J^?2PFMbwJ0Yq2VVL-5^SCl`Y;hDZr%SK(t(sT0Az$ zc_vcwsF`FWi(D--w&Fh{@9j;gZpRqXR53rBQ$*T%&|LK*CG3`w`BTuHB5rZntgPPwDZOb5HjB_EWK|d%SJG7gU{D-?>tKLe8?~l9LMbi zn2aaSoTrc6VlYRT+dCVl3D;zU$sM!cd|97pzU8>XgRF$wpKB;9Oree_i*H03S_k?8 zVYVs{vmv$(02Wv+$#w;(K@@0W{1q9DvVLnhH#J>Myc5gf)}OQ zgj_N6lz)r@C@L@$%FIItwzFjOnNfs*O&dx9u~k?qzr;gk0ELqL=A*6}kB$PZfa zPMF0u!^9$l^MaymeP9;3Mm6%*Qz%X*dsrwlJdX?qh*3S-pkz!JG2d4af>iP)-nW(m zKwdxM*d!Ny6ZnHrU9T2#Oq6ecdA%~!Xhke?1N4Pl8gU`?gh_D;(T|eQ7OOp}&mC^5 zwnaeKS=eiU0$1R1qKq%stWQRxy`SiR{+syxXE%QyWanc0-~IeI{{o-Kn&I~^v)|XK z3Yrz|5uG{;D?wHuf+LG?8WwgPZHsP-m~vbd0(GWs{c<#1(&b2`MOXC`bY1klUlKkK z<_|C<5N9oMJ5ay|Xm2<-Akd|Db0E+qP$E18>QKEwp!-&Qxex1!G77|~AmIc#ATTso z>!|`C`UgK47t7g9S=P~ZtSIe?M#Vz5UM)tG$>^nLaS6;{2?)P+{W(_W1}1&fFIK3s z`(gZ;2Li}y8K^ruWx6+fNY*BsM~#4=F{#IH$D(la!-KNQuB2)*_9C2;8tVVD#lC3J zg#jOXf3{XzuGO;sR1$UViSwnIQgN>MNIVos#DgK!3RC=)uIn16F@jk0BSHsk6DZf_ zR|YJD!HHvFFS%&WP|=1AbdKwNFfmh*3sO%xQkgrz*eVp{qWU)Tulvkc&u5oOkD z0tM^91jFA27g*O93RB}NTs;b~DZ<|D)8o~(R~ycgV87G6D!4=?O_yZ-#?e&({I=rQ zblRq0F;1#+tqA8>Z5xI*M0`B0_0O&e}2M{bEX#mI< zB*}zT!0fQt5*h{*eGaD1+>OcFF^3IRC6sy8=oE(;A8WwdO*9vlF+m86m|oZh<`k9R zqA`@Yj4G{eYj$p`FYYv5Ok~E1Q?XIkZWf_jjo4NAl(vX8_todL3lud;l}J*RzEQ&F zkR-%^3Rv9%LD1%JoaAzUZc)($M&g0+_3zP>uaraLdGHC_uYYv2j)Z#Kq$7d)C8dTN zstba)A^ozwT>igFkwBNR&tGFbLt3nhEBJXtg!ssN0ltnt&Toj{Mb}Bck+iz1)UY|g zzmdt>V821u@C%EeUFDlg(!%BPU~Je;zlk3vJ>e4`fu10q=mPu^U;x|Jx|zm4p`vf- z1wg&B+-jh`pT*wqdK>`?+0!64F9wmoV!Z}y!#QE;BCe3#i}|M2kR&y;>AsN}9xiX1 z+f8$i3#9$+6F$rISQfdUNvcU71|xX{@`|uMFykbz;2?n?UgrU0^d_0Yh1SXWj!_c}vZtW+xN+wnEWLThXw#r1gUioHPQ2K1q z+ZqLFfx^Si>}U-AKuD+#IxkduSx#OSVbp*T)LF9r87M$b@&TjUnFCvrSDFEw&<^0s zaLWR`5IHjVVEdU#0%>Q7B$kw!9elo&)%POS$1HcorOUHaD0xS<1nVG)jsvBRPl1uA-95l709ihN?_VxP2%b6xGzD z&w-hsHaI)u!k7WuY5H6ZfGb{5kn`-}!e$a%UC95VcNGGtfqh_#u7 zZbP7ZnpqB~%Of$O%QFlPd?fYX&> zV_Gm?-4aeO{%}mHidpre>D1)N@FeEKp*p3IQ%p^S@-9!z;r1w(N~xKE7_Hd-2f z8U<~GXk{5;Z2@scQ^!D=D1gBi1M>z+^si(5$dscPk~9NhTw^-yeIZ6+d_v{N06y61S6{vlBoOgq9h zriX$Wc{IU_W{M>`TmZ5YI<^(VkAj4}7@OnQk(5bUaS z%7S|kHXs?IK%RU1wXAt&4e~XEDrd$A=RYDqnyk}Vdlnx-Q^W$6F`;7_6}RAJFh6u8 zu!DzNFjKI!Oqmi6$oFg0W(YQH}wUxaNE}xt{Xj!UCJak} zoveMUM$>1I`%9c=$oH`$6Q%^vM2I}Foq#qI-?X1e+`VhMrg)Cq!8v4g{A}>og35&x zP76&(U*`WSWS~MQY7KPJ;Fu$}9oB7)wPp@h%_u+%Ih;{w>gl~^rXcSrmiSDOSbG^E zrB?^KQ}9w;4+S@%^d<}=@hsR18B}4F^%uztHB+>}j%l+1|GXn>6dVTFT*ELNJj>Rz zdE==e+6bs(&%jb8S>QsDZSq#Zi0l#WfJLj|okKL(>!_Ry_`jy=YA8EiPAN`TWWo(c zVn`eg+K^;}`7~=yMDNHqWLwx6Gm<{EBZ_W?_nu4UW6oeyb(PtCID`)P{2SoV=nPYo zX{2t((B(VEu)Q%HU1;pb=ZMwM2&@1Xws;zcnNGB8%-&8C&DV|B~VwW-|LQ|iL6DvUsLSsGVn#n zVHlPP!zZGT8gzHh=@J}d|3w&J0=YGuU1UdN#juPJL_Pq3Y;ovdziK&f2s9g0stv7W zW%N0b8ggQ%Jsb~MuH+HdVJ-P_pZ`yK^ngg-M-FBEl)! zJ=qq(!PLP;(S2pV29j~G>+@rWy(`m4I z+qh1u{6qqT{`YBq9YG{{LT+CWMyAz<%fRodZV;@aQ^mB^g2*c-j%=~V#TIT2Xm2o* z!_EfTa)QsB1M`+gKh=$SBQ-1#+nf!~3v35v;{y6WKbR;sbwqnb)8utxni^q4^E+*r zCBNNg@mCUoxNOrNvl;0Ycpp?xaGTQtDy4MG>HuJ8w`Sw>a{Y1e?a}q6*}U*2WttT% zO#OMmS;-8UO{+#fjfr4C1#m(XHH+-0=*yEk5#ppdzy7P@UYyiX;^hHBIRYqNSPuf7 zu>#||0Vi?4BnZ(*{xV||3i2jraZHB{YXZ6(@{A%MfbWr*Vz3Dc*Y*_*qJo5@gR&9j zRK**Lr-vpRGfqomR~DW3hEmZ`(4u;yNtdTs2pUR=wcexa6AUo}8|c5MA4UPXoHO&* z#0?hYGa#_u#`ddl{kuY1`XNs6gs{mw!|o*Sj5g`OJ2UF(bUG~i@v-aI@$b9Bd!!%g z#ptd#2)Y{GMcWVSL(hMkeV+yoYEvu=U)7IgfnXes(fCs3jJk|}-#&NlD*N&u{sa9$ z|NHShx+l5^-}irACH@{kIErii0j^aO9PkWbXQ8?go#r~CVk0Cas<7}g9l>IyNB!$J z*f06ub{U)gVJ!SV>3#RC{mETxe|i`GVy*?@dHlxQzdIi-Ts6MndGTlP5q`bm^SItp z^pI#3nwXKj?D?hZ-xa^Z#&H0*G!BWOem*LGgYlhXuNh1``Y=BrX%}4r?ymsMa|`-2!gmPF9fFGE@mmjepK_(`{$1o87Spid8iO zw{wPg^=iGberWGPwSD|rZ<(1J-L1>VL5wuVZI5Nnw~YE0veZ%3f>=_Im$3lW&Z-PI zJUGZl+gIz;U{a(IM11B&4lSSm^!L6+5OQ~WkKW#U)jT`;Qv1wRp}S}AnX`oH7T51F z1o!e*Y)G7wbA~yyh}$7X**u9b6>(63wzxsjnF((vNCjB%20+pXJPO(u!nGGfU1i?F zjzy@uB6*1Ck)-a~(fVuN)zf;!4wv;ho89f@qkNRP&}b$x9y*@ z2FB7c%bX*9;5P9sI=)JGIK`UFbzU4Aj)84)r4%mDc#Zo-P05Xy;=$2OEnKLs{YC$+ z&mX>QwK#%*?sI{4*}8MW2e_8|TP2(K(m>{Z56qfLc(o05iZ~_~gw6`doKmOuTjUDZ zYn>!LGga*!Vb7S}8Td&@^g;Xc!Z;p6L@E%q6b_@~)%NPOUX#mMy}1e*>vMWHb>el~ zWbG2ecb3baTI*`rA-tEnQ>5uNE>|aRmaBQay>Qh$0J+)^xtd?te}K!?;2x7JC=`Y+ z0gk@{`^y}HG2I1kaRed&xML?EGd3l_p8(O$0t^NB3}skH@UH9-M>FmPn$e0b%JJsX zszx7MfeW*hj&xw|hzwFA!Ur6STs&HgZx0)Pa+4Cs|F;Os89zur6o=1hU8xrnnbC5p zmbGSv{Igt+)_(ur6B6koPRDuiU@>)cbi5VKT1&Z|(?{O6_U*nr=s$v7kj-&g z{D5=;{>l`pz`l>3F61xbXpKN15OXWl%?v77V1XETVy;Sj&-4o^$c9w=j z?K+kVAyn(NwxdRTfp=g<6Sa<&fz_=jlxPEo34^2KiXsMGqZ}Ag?Hx}TVfY%E53t?a z{#p-?H+|Gw>xfDE5s?BR2*=`h6hR*r$Tg9FK+3MwtOHka<}*^S0sxMbW-Xg<O|3W9K5ASb1p#b ztT)Wu&?}Q($9t~5*PfG~IdSxz^0$47SRfdVcOU)4&p)#Nfhz|NA@>`KdW4~f4)A*#H7JgBFJ6@|(wdcA4?c)rpY&UjnGVN#^Tz}Tf+Y~4!M`pB-U57>m z0wumZCQs&um+O{UlqQ8UL-N}v3atZP!0U9UlnF*NkXuO@MW65w;5W%uWUG{+mHM5v z&+HNpi+*+^znvD0Et)74VYhxq`hRdv-NJj(_f*bIjcRaIJR_P&Je(xCzM4tBd?ET) zy5uD*!gpPV4B{o2Q50Ee$7&2UO3idYYXRa9Dh{(k4Pb^5WAKMG+S3>gG3DWIiyi+2 z`~6Rgr__(kpFTbR5%tvKo8SCbz6awiuiJVd|KnPI#yykMp3PmeJlLGOvFDVp2j z^}EDT`AH~FAFN>z`=jr&=0>YsZuP?D2X~bb458^nsd(<9p`~Z%Qvk@ z=Uxua9aeDC0U2EX^J?;pbVzQ+4s{wn{T zn?DEd52d!!Gt%D!4;@4HG>6D@1&jc7)JDuArnU{%%Wg#a4hzT8oAE5VVO|6i?|op& zdPI1$coY#&N=`_s-HlvO9l^@31*IIg+wZ;69T{(cw!4Nxitgw{bAevj&!)D!w7d$` z6$&q_-7PCS578^<`71|G+;RuKa(lIV^yIA<=#@wKE0^xQ|51A7;cEA;%U8fjHGsu* z6WJng7SsWy8&BsE|AJIH5rlk8wH-o_2Ufw^i_Gl1{b70+sLCnC9G=>9?jbxTQyUeY zz4+XLJJ|OF;Z1;nx^j7Zf8qHnW`;x-Tf`CNPD} z_qw3?^W$@?^m<=Vf`y5BpcdB!1qA(*C=gl~lyH2gu|%&!P!8bI_r9v2Y!;A#V30tx z`U3HK_ru~7V&uj}Kg*W-+N<4ctZjc?`)kVAldmQJi#4l)||*DJ-F{$yxCQ zAW=wfprWe6=@Ns@EkR}w=tANg@Pzhiy;tK#@OTaNq&?IU1?X5hhvp{NdZ)RQ zbDGlXjeAgEIsDH~^32;|)O?@3Y6{Vp+EtWwqbbXHl@)B$ z-!FV+?>`T-D()3}*gmOucbp9SDoS^iZocr9>3@C?d-()C?BGqCYPscm=S^&#It2R`l z{v-$hlM82+T*SFzE}y}J=Aomf>A`dj4+^6>sBIkMg>_SXlB^RdM_hp8-nUN{oq7xvmE-6poWQH{W-euVe=e9cwdwz^aw-F|v3HVUiGY0b>e=Dp9oVY?ySwXL~4 zTTV7B@rAf8Sj_~URNr?;Znd>CoIA99>apn9?#jn5JuIK!@v!ve*4Un|9s~(ZzXAvioE5+hMQ5wTC@hy|T9c{7>TfQn4yL z`NQov|M5C(FvJ2SJ7R%5!M*xN42zzD-Z1?rcJs3i3J_ce2u`^EMyoszk|j4m`Gt@#>ACMcTNo~@Z)xO?~<13d~} zA}I$!B@QrP%23d1%AptATWaQhSixR^$~wu?4szmxAk$N0!wbvXp@$#@KwH8K2i}v? za;u;X@OIJ#_Re9Wy`8c4mA3SK^nu6L_s}RJLopn}%N0uoVuZ$It1lc>ZMY#e1CI_s z^GS+;iVrOxx_!s|p=>amN#%}%-p!jR`NCU@#Vz5;g4gS}9?zvR;b8XA{EpiXuH|c9w>gfv>|M>9F7#5HkBQ7)1 zy0~ZSQP-~B?zJujT4h)?&r4^~SC#UHTZrL@=*xLqML6Ac=6-kTbF>h3(5-Zp`W%!7 z%uO^trDpNGGL|{vi`RM++?JnMr1wuuV*w@@&ejYeiiu=4O6;f=iVN!`)tK`=fv_6w z$gV(P&)e$oy}agZ9$MCN{3<|NSnht6OJ2f7gjwghhHRw0X$(Alp)Xr z<6b`Ft;m#sxD=WXI_|0@mbq(&3{8;0+G$fWjTS zM${+|ZnO;OuMpjQcOpFDnA`aseq(P=&VG1S|Hw>bVpl0rnfTt8MC7~6k7W7Hr?$?F z?EA>hANW7MLw?q`7A$$iuhLCl_kU2_CpUrZO2E!R`V!2S5JprV`L6ZJy&w=&Bu_X5 z4@N@OM={Esp_VdWbTz9JeiR1c4B7eTbzXx?)=7B=pY0qj0cMP+i;abJi*{HNl)N9SEYv_Njmj}w^3_0k)TAt zQTMSjpd|n{8PPLJ$5{BKL*W7hj_U%*1W_IrMR^KME#T7({10bSs1#_4@fZGTI9M>yfmlf!ea5-1Zwev2tKVBNiGW{6W%MU1 zIxS(BGR_1I6i@94m8lbn8Nc|D7SJ#T{A;$@zg7UZ{lNq@49NGc|8s2QT_fzjcd>yj z!Wi84FU^0odw*O1?dESAzpbA${?#~V{H^hw<^?{^W8T}n|KjbB>rv@9*tl+oP6o+? zehoST7t3KZrUaj-qqAxfopNJAwmX4hH--4kLvm7(X!DSq*rc=`7?N$%khsviVq6&8 z`jDoX>=f+0P`hV(03dY-#!T;I|Eh7SoNQL$DXIgNWoWMZCS9R9JoIm94!thtlp zTF2unQPh>MTSp3GEVYiEr2x_MqjKXSc9$Gr7g=9Qu-6Qh5~k_;QWo)+Y>jBffOx~W zX-5wcD3Llvk|e%jF>}pUJx~wiu%?5tYjyF&#)>`%d6<3|jehO>&ph*Li)t2Lda3ZS z=3xBNlMq*$gXG#xsv$MRh*G4!e_;2r54WVHxuTHOlc0d zT4I1JbP)p6AZpw@Q5V@{Q6Cx8fK1x2nQ@rIAo7B7OnsrK;je`usRwlqRR)?2#&M*$ zG}vM?ao2_!Q-sc$URfWXIE@R?$2xITZBABDWE0sdN_C1#c~VQM2Um99c4=4h^iVod z*e=bTP>t-h-4nY`yy@7=m8E)WI2*18W6u|ABSChCtbhsaS;UU>z`~#(A0Q}LqfVZ+ zAj*^J0e)8SbJFM>tX#>#sFo^ZewafT-4LstF|7s2CiEsMUQ9bhE4VJF9)mP$5PrLL zBJw3XKd27~6qJS!&^3Z##xDu#f-F`ufr?U7qAX7sX*;*#5604&0;9`tP=PEf6XMPs ztb~4h#r`B91Ph~-=140U& zrCNVpq_y7?cTa3TVHp)i(r=pIfhhu%(vO}uFC#|~N3?PkQOSFSH;JP{XBWj3F7X_` z4|#)bcy!xQiV>pvgBp0g5fh^BLPHVi@CmaKL7;X4!vE%Kd(XArolJ4J@8m6y9_5c7 z)y=yhDreZE?gMA;hVgZRzl6d_P>=Ms^Yp`ZPLe%T>v3{uVw^>!rlT{)S)C|l`V}=` z${{oKEtv2_cVdg|nr=U8v@cG#@AiIv=h6M=E}g#oMsmJeCouC1@VTf|wYd$34wc-P zE-F5Wp|;oVOHkE~V5*mpns4qob0lez7m5Bi*X zs<>pgI2EVIrUsMf?P16x<+a~^%dX`u*~qq5V_SW$l6%Gl5v?C+#$0|Q;T+1O3lZUZ zPRRxXo{{lPDms595e5ld$E*Fk%XlPTd?2p|pog9L;mMuenIk#Bs97}WvE|X#wMUm~ zquT?8@%ZTUWH~?K8(qvcKCKwZ@x<`t+YYQ+7SZuj zumRpEE+e~7vd5t!odw9AIfT9u#1TM3c7LsdrX*kyXAgTJ*UAEfaJ=3Nalr)nve<6~ z`f#{;^mWfLKYA6mrio7v@Ki~(X|Un-vP~4u0lF6 zhcl_GS917FhJOZ}S5(r|w^ts4IPN_Maa@^hKWMaX2VsHt^UDWzoj!l;5<=Y5X6-P9 zZ+Z^Gx5Y5W7a)!qq>xQfz%wZFL4tb4!m7>hwy3XoX~j-q|kgCp{93|IKGQDa&13f>pV@pzJ#Zr#7Tacg!6u& z2}ncs!g~*%_|S%m?0(?#{g9CNGhyuRrU&LO^+j`X5r@gp=v$yWP1Oa#9%7Pg3OHoM z_Agc2=dbl1V`9}g{}_I1>HIx}W?K6nZp1o?;sxP%CK=A#SUp+?Q*7n_c_pZAyAs~B2?>=zl zK}2HbU--`!_R=Ty?k7I^aWHQFJpJw9??ydX~P^kfm_{cmI1SPt>as7btyi^$vKSkizFA+&zL za)geTxX16vmZOmv9WM&f4&$Dd?;W;!!^eT#^+?o?TjWyA_pG`c%7cY(aUz(?GyLwT0lf!NHGLJ zwOv{Jm^7>f36tK}57G?IsSL9FKPG%!g17oG>4ztvAD$%r@D$e%AFXwsc$oCV6K{cj zxJdfpZs>>IxYOBj=qHJ0k(23~t@IXfzjAcV4=S z_VGT$+MU% zZ45V>^OX5%-)$_}?NKFPSlW5u!n^31cY8ZyEtsa$?e`d+eMg_APYIM}dYyw@rh~kH zj{kq4A<%*DM)e^7$DyJ`$9?t^9rrf7II%sKY((z=U!WGOY2QfGv!N8E!cAsDz-_av z{l=BT2&@8c?0nPr4Hh>BG^XBUac#8Beqil`tE=Lr-Maykc|II| zo?_Zg@tf>-HLCAGl@@3pfcNg-Ane;y`bq-Egcacl{;drD(9DPr?EF7g#S2pY@L|H; zIK`jAcZrC}JtaOa|KU~oe(-pTR_P~!6#%jvC^4B*04TZ4V)>H$4d2M-9UoYo9$op! z?c-y&hC(MsgNNw%eZbHEo#aQ{_dG=@d2th={{(@d|G@l!@SuS}J0<1FhWX6*{+=5v zXj!dYHI>*)Z3{rR7Dd%)|BLJQ*yc9iyr41zU@8io`N*f1b3QOa3{a9<@SXaYCvdK? zTAi6l$75;DB7U(NSo@S{2@fZOg+kEdLO7LO>-87Kl;lH1>{r>f2B7K#>{=m{=tO8LA#oYBz8AMe>=Fpq4y{j_5uwv6y}Of zyx|cWZUVz4oStFytZrX`aZBVd0a2)}*PMWQZISp+H%-Zx^l@kKr#DZDFIyN*$7{K8 zB!{}>FOK_P{=3Z+RCp#dl#FJw5s#B53+sxxIxKxdm=d+um@5zqcS>xoN|-C;2Km|( z2caO;X!cOUeADc~tZg@GCaajzDzGMyijK|`&Of-^JW$BTz;LBsLwKTbRgocyhTqf#q5~P}~Q%QV>^q+(sB6`UJzKft< zofL^5tK(+{O~mO#oW4aoQ)F#zid2Y*!Z_B)k-5lIL>4{YUqR})AqZP(1y@nJe9g>a zv8cH`y34-U&g$(3-5fNyNorz@yR|E zBu?oBaM_JfE(GpESM&NA>GvYFb!}(C1Xo0+nQ^99Ca30!Vi*8`t}wS1AST*z2p7FV zU*j3JCs_D~{z{@|P6o~#zVSH*LTg$4F^uY2Duly(ik$(s6;cPzaLN5s} z8+q~9fjzoKL_Zqn=2z;wSMK3yNXazY!_(Nq?Zv9O8_(=!3I5$Hc;*14gksJIn3NnN zDY^AW+2`cZ9)@^?YvxIa&Q_A49T1r_H;RlKDzv@t#_hk4ZGZf=VE^Oh3-iD9y+0*4 z6^ejfE3?0|?C(7LyO;h#LG0TkMp#$~5ZFOy(Ku$hy%+wfbD%0_=lAX#h!fq4OAhwZ zaQUWJUSD%;Wy})L*H9lMREN=TbQ!lzuSrUzy~F4&uI$`>jD+kYRLcQ!F`10vSQBqL z)?P!TZqV~68JTSLRX-QASAI%7rH{J;Yrp@aie5153XLb@ec^*3jwRD$StuuTwy8|` zf6)6;WN~QtR9_g~E(wA;oCxP~VZ#Bz6ovWg-xscfd)y(QVpj%Sq2AM6R4$ARF|)ud z*MKXaB2RkG&TK6lE@ZbjD9xf#>AHl5Fi1pbC9TvdwL*xW3D=`Lc0^ZK*3 z#sBFy>(~EHv0r*Z&LZ1HTTujTceV0~~8^ zI#5fYVVX@}M`cEwGN32PT7a||Ot>1O z$AU4$W6oKXdKZ_Fj&79@Xh6PK`{?NW+%2>7j;$jjTSwk*v*+`6TRv}f=5lT||Mi7q z3k#Kz`Oj68snO8|#ii!+sw}=Q5^mDgfv7+wMqusg)y(5x{Wt(0;->Fy_P-U(Y*=#s3;h0ijVcp{ zzD)FS>GYlWzOT|XX0XUn;aj+;Am7Qp!Bl8^RZj927C_lX$Yf;jAU(3eHeM#z3Y9c5 z`qEqX?Ai0JFFyGs)0-RLmEE{5_yZynR#tsXUxqPa@8T=y^YqIbpHqM*f5kPRD1#Oi z*T6p3L@FMi{LK5m^~J{@|L^(TCO-YGo5z0h@4}fuCJdsr{<|&Y(ecTb;{6{MH(mFS zJl>bS1%D)S{o9!HUxh#NK5au%3;4G1W^Kz9f+gKbLVLpcx`=8F^m`WNJ1SlW3QAK9xG zQ;Ng*uw4DZ;{X2AGc34i(YwfF;2c?;`7Z(XOjhsaveZWie>aYd4&Jr#NO%F%rP*Ab zpA#a!BAcW8>_`Y9f7mvt0je3XL(@y%wu;>vBFZ6^@GUGnQ1H7oa5Y#WGo^ z_^sA}r{EsLUK-4u6`lJ!7TTe}?2!-4?gPce81EkS!xzQmD2tHnMc@ex;nwlr8&j8J(UUy>KO#&&Q~$Tog8bGsl0i zC-<)(hAk5CgP-J@g?X{~a{i_K%kVXjr%}k0E_{vET^~Z_GhI9C`GF|IWB@e7s;=E2 zN9N&sKjWS9gLjG`E1lbDNoP;>7)|>=s3Qq$EpnZR(JUu(q zXr#s`rqEsYYwFDK$fOqVzs>(8+iYQI7H;<2{J6Fv<~1l>#kKj7$L&~2)*U#Da4N{8 zP~kUYZqbqjO?jyoiyPMh1wsY-aHLH)dGRuiKz<_hiCoxJ@Ype;#uReG&lN9BAH01w zQyXhub{2kYwsCNEYFFu0(0w%S!d!1$2jqsXqCeN0?~7P*x*CNmQNUiHz&8C>@%;3W z+h#NM{&%yvhb|OeM%8t*C_x07LLjo&HhXiic4+*1=@4%(tKNaKsQ^^qil3iCAS@bmGGT@sh%JY6l z9bof%)_yby(1PSO>VS+A7V3aZS;Gi_g!1Hoqhe+NbOj)p+P%1N7j>xAC=GRt^a&I& z_PIRqh~W&1R5_}%bsHvlL4dV~R)C5mP_S0(SBXR8zo=Riac^C>kAvijq&ph#?(#`LT^%LNd2;jj&ZnldS6`)ZhXA%CD!RFr2IcLy=YF;Yx4-Py?m3&X(7^`1qFHL5}y)wQ32aHFrzy{O33O~l=E9?UidZ6 z+%h}8cl_uBj&a~L)B3iDENe$FNB#AqYtEp44#?fq=Bozn6RtYWuG-WHD5kJx>+HJw zXe6xQE{w^AvLc4#QaRu0vm{B;FdDjXw|>ON|60$@y|Ch#Dw9Urz$7z9bw%M(#PGGroDo z5I=y7pw0+0*41YAz(2;6jjoILsBYFV5nB!;6OTy)gos3)_>6rdGVL&83B*@RbBC^| zApgca3M`m)FjM#JmBh+Ha=CMcnFe<^8cLWRYM5jgrk|1a%HuSbaqu;4+No@V&^)qk zd4!$LEugapNbtFy6C2=ZC)o-$VA0VX4O@wB`@%NdXrS>c&92?<4J&Rtx1?7r zO!VGu_=mz18fLob6h#G)!>}{u%&Stl*04+B-u;&0iJC)XQ~yUpGsViTrYBPz_vfPv ziFiI-^d{^vr`PK+QYgj_Sp(7=T}e*SrUz0Bkp{t zd3ZF@%r+CmucP$W=I!W1x)1#L_o7GqmxWG%RwvfCxgKFq^?sRXYW4U9D*Nmt7>Qeg zINRW}UWP=Usr6>LM5732KbEAuQl~|QZQd!eZGgs|ZGqOx&DRQ)fbdOdtscc%?I%aq zre*IUj72E-ISOUGUeP zQlUDni}IlZmhyPZDgK(r@3RIKi&p_*mwkM8;u~1YWaFSN{c*Y)NoAHskl6639!Dgj zxK+TalX=x)wIyO`T?T?kyZFl^Tc?w?R6VAh)1whR>P%Z>qsfVwk711!AVZi}^3&6BJqM-YA) zpZO`&-h5UVMRnR|QH{py)1SceSK0H#!thz)6nphkbiRwfAg*9=n|^OI$9q`N)_+e_ zngwxX?XQqaYQF#A|I68%0LWEUdE@WC+V@v`z1sJstGlYZmag8nB%M7W36KR60)}7+ z5o8+$lvP|2MMo6S5ybgKTlXLqLe^?UVM^@cHhLEWs3fPe}3vF%S`r z!Ya)a;TfEXA9{)VHg*mJPX_|Kl)AFvPmqNGV*xEgka>ax`9~4RmTCwfpu+FQbv^YT z3aa*ia#HL6q-O}=J4O8O9^q+xX8`B49^VQp1>XuA8MYcpY5H=Q%G9NR9$xjj6Qly+ zv&sbdV5LR{1lY(_X$u~}sSw*Nt8uWMDu@A1$u;@Yn)VI_HEkZ%G&nn{vsq`+KSdG$<4MJ9y7tJP!q$y$lI`@rpz!aA|0iIVwSZ`FC3ZVQh!G@! z$vVjojS(zjxs1gy_#j)2S-5QWCqa~+G7?tT9;i)H#$`r={ z2*ta1yaYXj7}82A0_Uc8BYH$s3CS5LNXm?pQ&n9-mA~lDY~PI=Q>@q1X1hwv{yW&{ zR*A8Vr|Ftoz09y}tEQ9gF-&fAi1Ox{btCm{{o=Rt)0M{dMkJXZkW(2DG#X1qV(i!Z z59HTwN}1j=d}b{@yD6!^d3bj%+Q?5NOxIj+c45m#Xqcs??x(vig05df2V|pr8-KjC zG`aLQOK)HLI$mpb|7mG8$;s}2EnTtn)1|xc+Hm)WOPD*hw6s)ODlXl%^q}O-w_g6? zQLwYXxse>!Z*ZVK{_qTZco4>8$^@oN3)YdnG_0j9! z;`05Qux3f-29}-^-Xs12xFM&3R|cutp(6#r484Amj*u(UB}4BB`p7yCFU_#gsysWo z;sBlz6rN%vPcb>FWC)GUtlk^k5h}~zSwyP;g=a%QwTA^Bf8ssHs4({#=jZ23xyF?G zUpUgj^ZEIwtTRFX2%yUQlD?79OgLC~Ij3dsL|{JP8@0QVVt*jiiq81G<1Xt=1*#W& z@+@r=-mAkjFnHq(kPw8p=#>eQsTU3_4-V6wbi4+w6Nqx~CbfHR!BiluvzjuFP3a&Q z6&rwT34RD^SOK=&h{n#ev*DJh5D1>!nYzE;PrgBpg+^phi4kY-nU96MlhYA-u(#FF zSSCYz&17!!jya^T&i0kBI7DyNKkTy4guN}7eKzQwu-WH>o)L$X)aS##RMcUgD^A#L zGjd?eX^9tT-)8nION+NcALrEG8VWjdUA(9d31BR)iaF#k@B5=_6pqkVXaz1CUlo!g zo7a}+Y@?!YdcrcdDJ*l0+CTfdx+(ye)xV35L)(hKYerfN!D6JGDNG6gB(xO-nI*Jp zyxg=+_pjX?VXuzQ1jF*CS$-FUkcc?B_%Y;``Y?F~-FSp1>89IYt+w^(6I4YL;93+N zvS);HPZk+LW1+Jl_(SJyQORf&Cqrj!+2_;h2_$h)_>g!r&Jw87mfip|P=T_(+|Wb7 z6d_+|Uyf*Pg!o5*16K|m_JpD+5Z)9YInEL7R1=))RvW{UwvyFl_XiyXo69bXH#cHB zf1w@~drQRsTKah(N0OUjDyV*o2dVwcCIumr`7!Edy?+Ay{1 z(#RP8Z{RI~dUS4nF4`1}PV4I~@`OU3i(Y4S(w#hF+IvgfiDH@51O;e5$dQY>NC&(2PG}qR^%*fD44J~kh74FB91OoNtDG(|EjqL zLD7@mkVX|hB^`i`5hIj3unk9nrn2A+YK13&GC^dga$`Qk0QZNz!7G_9k$SqXuxXo= zv4;9D)-|2pBLn_0JKf{iIr{qRSau9fiWoHjv{!s8JNWik5QyVUkPu6M1A7RZ_5t8L z!#^ZEM>Jzmj|ax-1k^_n#MBWpMUDaSFoG8~bF?8P1C%VNOa!r&A|9eo3$l>ZBtFCA zqF%zzLVGQSU<+@s!DEzJR;zY9Nsj!VMDbZCND(3-7)Ia_SziH@1F%;Z05nG1 zMzB&8wm|d?*vovc1)fPMv{HT+*YRF;Trjl{i8%_lrb7V>8@??Qm!t%XcAp-Y4CO)* zr`H8^!fj`IEbQ_?PJfxL`zdRsoObEsHmBPs#i4d#(=WYasm{L2o&Z0O2L^L_;=6zSAH^67@ldC`4#^&3oQJO;k?IK*bw`yAo`@E8oAqTpMejFPH6d zG4RCBI%!@mVe`@9|}i$tOocGC`* z(=r>3TK)cXFy~IPE4?oNwj&3L*X>LHEgr>vo)iA4#`ct8x?bnGFNFclK3Y}WB>O*n9=};H`I>(IXs*L-y=~l2?+kxFd6B#|MZ31`EAeOw&!u% z({$UbD8b(U(r5S^HmPkts?0c!x2KQd;woTZBy{o>Yeyw6owQz|;fFh?k`CYLYAH=g4Q zZ|@6dvKwvD@q&Ebly2E_zHHe4fbf^ ztSie0p7aMKk3;j%Pn+Q_26Q@ZWLY#)Lqs`O?C`%=$e^xQ)si_C!^1Nu5^SS?y=td2o*Zud?l&Zg+4J6|pCycGb&)j~XZ+Oe*VmTL# z163U9HifB0uZ`Hx@FZ;-wl zd%Sl4-;=h}I=CX-`OQq3(Nv1mFr*$?z_7@gnDSXTH0d;8+@2}r@l;%*4fAUZXz29roGt{C zbGd-zTAL_-G12!@q8Tk)f=PR#(At1W#cqqs>U5ZriHVPA2SdJe)Aq)`S{hazTi$Di za!M)MDWYk7rvObs4Ba9_TbSh;bxnFkxO1w_{fD3=?7Fl7=Pj6Kz0RlW)T=n5y0lQMPdLl%R$bBCpY7;5pb?p1tUX)BxDCub zepZ>&#PPqq@b{b}bKuA{#Ic*ivFGTrRc2^g@QxMlnCYF-qbPz!y+{rhI!ixMHIh4d zZviqcJYe-?N7eEWDkij=Eil>8deVD|c$eQ|A0>BUdBnHDEdes2lcQ}tMzzafGJ@(D z^Fx)dfEgZHw(v9quTf!Trqix<4=9@Y#4_NfDX}$-;WrQjB*lCBRm_t8=WlHx^G_!^ zPv6B{_GHdcoyhp2Ry$j_frX2!k|v2oPYdic=$d_R$f%~_y3b!vmZ8~Z1CW&HOAMOk z>jBAJEQ2$3I;+do?6X*P;stglK6UsK&1Q@W2Sg{EMKlsPQ*h7$x{$$PWH_Kg2FL{D z6idMPMnOp&wz2@&5YB)$>KO+E7HQtoP_-T5)<0_TI!;P@3Qhu|fFppcJ2^Q78Jy>E zviS;Rat*wiC!fGb@h3&%^PdstgqX*;4~xzjNl_EO5-;L2NnpWKk*_KatBkZ9my|sL z$!}(Y!SdjuRlBV0Q)7*X7 zzaSHhTrwV7Fjh(N4S+^EcOcqVB^n7tqcnP`PSQw~RiFnq383bC;!D#g9QTaMP>0#a z24_YGBH4h;nY857!OY{=2I!=Cl~0NwXHd6MAr8a%JXCogvq&7~CJq$bl-P3f;YsaGjYdFI)HhdaTh!^8 z8rSu6iuMDRoJUY;Dpxx-s`S%Erur{0=RKru6=w-_MVK_6=QD;=70@-)SV>oM%L)Dc zudrVbwWYzo%7J6Ek&T7;DJu!7x064k|{4OTVPXVnv_ zsb`AXnE~fSm?$*kit3b`ZUi1;43q0&o~KtboX$jHp3acN=k(Coz;?&;U`HIvO`*o2|fqX&&P zgXy59YcgQ+&Aib#H*tm8uotmj^?RPj_fXz~`m!*0htDg*+#N)F@imn1LA49T6lkQ& zsb50u{rvf-e$QsiO)`wJfy+;R)x6O(NAv?i$K~QK#A(o@C8D~>L4Tb`X`p=(?m$^6 zdN+t}1`$z$83XE&31yeQ+y@sPH?0}Cd^Rf&v#+k+JlQwv-4j6AR6U!^gqyGriDFh1 zr6E5PIuS#1z@t=uix3HDN>Lf|9=%+ynaFMjuiRfVnY$_Y} z51J;;>fgUo*vkG7GAGNkllj{9YFRBmbJ_w0W02&bQ$c`wYczT#<8gzia3k=eJ`Xtu zR4{Z{dC@!IX6wBeJy|Q_AFk0J~HrA}>vE;-aX4!a_r;^&@9zM8nw2&XQ1!Blm zA#U?w^bg+--k($RZ}1HO|7}~~8c$5=Von1oX>OfEp4=mtTM1-EO?OMxE zKp~oVqzQB!7ZOhEr}IPhYG7*3{9LjSwAf4@M?9DL;>3i*H$OfyAM{3@9_M(ZhJ>NY zDP`&Z;3Z`|LykM z+05H1A$@WkHp~p7@3Z3jV9+wY4n}pGG-(^bTm)T_!=rCEs1=^Q@8u&4sKlS5yo!O& z7ZGa<0aAjiX%&#rNP_p)5c)7*!wWC4nQoV_!N(2=KL#xfgnN&()59p$adAjZqsyh} zJO|rBODb+U)8YHnif}LOv;O1sy^nyT$s}&vD0>^*iN9w8hh~IJF)l zbwZ$VF~Og307M5(5TbkEz`F>}6K*O}nDh)OSF+(LAWv9iY4-z0v*ZbLw1Xhex?=XR z+w&j_*c={TFbd_5yGF_=*vgZ1)m#+Sd4WJ|nds&<8{aNZ+V76PqvH4Pm>4Y$_Zr?O2W2T=OBdnMWa1<8$BQF0ik+EC{u`rOPP>lcE|Ek zJ|bSE%Y~!Gd_0=b{i*wbu)hEhGjraL!S4vZds#!gLA)Eh_IlwG;Z5wQ(23D)5~~Z_ z&e(kpf#w@wD>iD%9HM#`Lwa0>U~OF)hrSx;Kn>#W2*_eZ#cQZY%0WC+@pB0@7YX>qE7ae+LTV?e zN~%x&XdgzntBBX(0PlE-S}90#6xJkNq2ka zsPe`u5aJl$u<;Dwv5&T=sQOAdGLJvJW3+t;7%l7YXN4{Jvm!4Jz8IDt@*ZcMOP@w- z96p8dBRdIXX~r=$GBvY$e#_ni2M-|8NqoMj3%T}=n*;5Fp>=Xw=n}6aW%?ViZ`T^sbp8@3F#~Ayg_{+QHvc~)i^EW z9gu0($_9Bfm+G@w#BxRothNOGQE_$YV*NSq$0T9zI%6adDA>#%--L|G->DJyj$k$w zzQZ2Ew33~vRHCiVR2{m(e7F)yRMMf*tuqx@Y~CF64Y(v?rCxU2@5U6#;Rf)tI_3}+vQmWmKwVjfkMD;RePgv< zIo4iNQ%Z<)Z>Z6XH%xDBZ>uRWys)#jAg5{w!pzha2WHb;P+JJcFwm7|S3`agV(%6V zu~47vp;`%YR@>**lzsT^eO2XBFm4Tw(qg$azKXEAl`KV_@|%tjXNKJiiPH~XOuQ5G zD4|2(95>bB=*&KXfD@EKM6x@sSc*Q}a4WTo@$Zyp!7zG=fZ*DzkXaeO;4nR0=ULda zZRgo|2+65Vj0FSaIhG;yc&PJL!9!%#fxRfk>ICRF*k_8T**Lo(rb^7F<(?=LMRt2H zD?wnonTEj*;5{tXP;si&;!dIxl96E z){rX5io;Yc)eL2sf(cejD_Ccr`rG00_ua65-Hj~2Z(rz&D@d0x;BLmmtHd`6n;8=z zJ;`ZT`XMyYklw&Q4XNFNtizO|XW>RFQ}|~}YR}S3c05LprdU_j;?V|tD=^^;#};#H z|5r}MeM3Dw>T)`f8gXhQ4iSxF_)$ngh+P^%39-8d&oKCn9C*azH{lr+D6Cx$3}4HE zNs=X!Dat5KI1RulSJoi2+OfN+kV)A@6NW|L!3#=1WlZ9uN&wEh5~+fpWYqhNDh&X- z5fG>y5E1k%vxN9M!9^sMw;}PerYEvEQ*l0etw&%P&Pm+sQy+3Z;xCflrt(=pylUK; z*5$>zv22U$MlE@BUO(!N81u0aeZSu0XG6BEJln>st&FuQ#HvMN(CREb9kTk#tp$f$~*xmnW*PZPDXx{;{z4^hm@|Nk#F& za9CeWN0Wm%hamPE7N3-=;XlFCfB)boBo|oUz%HMH8-{aXj>WpyMx*Td82%j`9App>&!6~2v$?#k%KvIzSnU6gb(5k5)(^i96!(L|%(b zCzk`Xdu=&tf6xXOt%Le@YKVMLZQQl4^QB~pIwCi@UJR=PyYSoI%@vcA<|F&bv1B9e~JGU z`U^y-x)5a+T^V^iD{38jp#rV)2Jr#Kh>E2SGgDv&j6uJT3h&-x_C_mM#XBy#XrH*| z#FzH*6;Uj)_cv+!0fxpS_@Mnon8*Atw%LlmMhn^-?fn(nle(@;v92(r(=`4HM{uTL zc%VMe^=Td+ncCcU$A3zlqXpIeoBV;3B(Nji9*Mb{m>R3FL8lzkg z)bxpdgQU0U4$SPu0wU&WYdEuZ8#eK;`T<+s6PF!xSLnMR+Q+vya@OS7mgPawO5dkDxA?J zLzSpHBIc!qU^+2f%yLqqY(7(tdAODNpQ22v(LqISF_X6$Yf4337kJs2kt~w=&|CjY= zv3x{fDA#kNFruT#&MC9E!L=IES42=pqR|`0kJ94EqiD7Z3isK(PUCk`6;x^>Y5KizpbkBNGPy-?T} zAXXspSuKM^Ch(K?I;;pUZU@CX5XGdzHdv$_q63DEnJ0)yz#s^N03ii0@Qj-^4hq5; zDDVQq#)V98$7H663^@~&6ieqD!@(NLb}5_|_{hlSEpOPmwbeI0b>{RmyI@Oebkn9w zH@z^qXJTTYLX*h7LJ8}<6YhHmwfpDrydZL?E|^wu%4Dw5Wuyo?E}kWHVTL9{5gxTM zpnRX!h+-9zrY=C)Yo@OvcyP;M|H2OItsTA^B%m5(QEe7@D~PkW$*Do1IWN5p{(XJT z+M!5oesv>KXx927#l~=+9W-pJ4{y{r8v4zR+Gazu`!pKe^AiTcc%d|AguMcq3cu&H zMp_4zk}9nUFOI*Ce}@Is#VzVoN~1Cd5n^sKQu<|?wu0h@j(Nafw4jd;*Oih!1pm_K=P>|y6Agm@Y8)6S1RnNVI zHQtFFP)v9u&1L6NYRsp_&}>*nZpu(24YDs~paZy5B|2D{@3V+~-hq9>0nqlD$7K!! z!-1w;o-TAesGjJU?M^~B4e+#AN6?d*%$dk@tnIJS{5a&<+WHzf^okj+c?(8gG)}5X zLEzBypw8lO2O}{Jg~o59s+J%^ZuGxqi~p|~Y!#Y8yi@po+JEN!{F(mr(9rTDKmPkh zEalrCTfI8A-It10tEW7x;eE)UGuchTlK5kw=bXoLXUGTAcsv_sd21bEm@11}XIvG? zCZrg8j}QoVs&P^p<03e525MMJA~Q-r@nPGBxeXZQ(l)`CLQ6hkN=5{L+{3k?pWF~X zF`BSc7#JuP_Y_LyOd_5wm)QI4b~a_Vzte6UG1@_N9ja;;*kfXt%a1tfW07X)jV*Fg zM~Jn)=u(%BMk0~wAhg9}>I7AbMew1H!4jtf3G)x)K)4qY<~`nFL>{@7<3C1j?Zw!q zPg;zqJBE1y9~YIiI4r`gBq{)+f~+1t{8<`Ei;dBKC|MMA(-xbwGx+W5tF<6|tT0e6 z_4SoY^lzy=Q24GVmK!LP&MdK;u~k%kJW4yZf96LfdIp(!Cc8#>QTz?8R+rG^*(6l8 zQ##K;*BEv(tV@;tSQpi5kVS@jO@V9GUiX63bw6%!6L~U!;Klj{-oCwFOLWq68oQ>z zHawo&zgBPatWAN&-~&*1Nkj&W@=SWf$5lG%dDceH(<{hiA-SWGz$z^=HL}Ez(UoWd z6j26sXk@rD%I;toi((;EDH9A>Sb`aMj~>F3H<{w6ZeiCMY2(@&zK=CTkn7sbwFEd2 zRaC@_2;}qbL}a(n2Z?b!fXcwvQQH80t6ri68^yd(35@BgikZG&#P<_S3K=A#o3kXO zF+U_IE`B&?76$rD_kAdy?JtThyS@938&#eI{SnQ(PYi%6KH(~UGt~Rg))U83v_|DP zq}afXUX@yQDrcO*d;zc%07hVzB2(UuvDs;o`u^u+C9_m%nw3bgc3m&&P>7q{nC&OUZy_d3{JR9kib-VohjJZ(_$EUIwFYZ2&yf8YH2K_5p_8bR>?h9_ zbM}Vo04K^Um(){rU>){eJy$P?O83it+hFD2T}bSWneoENhvUfxyz!EYf3q3>Wli-(by_G3Lo)ERUPSdkKjbxscm8jg%-j8;oR zCFHAZXI+sT4@HU3t0m2LJ?;=i`E?@?NYthT!3i<%ej9v6=eUS-biu>isp0NKkniO1HW(vCrwBkGKx0$2fl*r2^Vj&aJlMV=^&mqk z5WS`}c)<=C9=sz9=6dg3kdL5q0%`^lCw@1b(CadTZ0NI(JaSL>o8=<=M0R2}Hy%nq zdKUXlI%<&H-S2!=W=SUPx^6C>InhlciG@BStoeGZIWK%t<2!h0sPv%BtgP0aWVlz9 zNy0&rGocPQAfN?~#qx^ifm!IaiNz$TI+Y_Lk!JJubPqmIUOTTKR$R9FeS&42{ zJH~6msVy2c;FQ8fVxCU7h|^7SJSRATf|9|hq8flJNIE*x3J%3FQsGieJybV61G}=l zM=mWzizgl&NoE`3tnA%?RUxe3y4n^FTh?yRBzEn7QZ|MQDuX_DV3jxetJ%}LpWC_m z<)m6CO>|ky>GFRtnUAhvR6Rg6A!F;PY2sVwjtyigy#y$Bzr+|Ehb z0CA3jodEulN*Y_O6X2!r0rV<$5&`;!1ct?-Op>sfKop=qXmlZ8Spb#tJW0c;{PKB6GehmDQ!@d12?rlHS*A}4T!7Ui}n5-|xRr;W|N_F$W zM65kPrT>c_^%4Wv1dvi1Pjs@Jt+Jf0IByVJEm*QLGMZM-2Gn+miKQqOC7wWewj#q- z>bQgg-FU0Jtp{(!hydA9#foZr#e>d(wu|0?jb1x>(V12V%8NcH85eD+E{h@6ph^XH z{qltmmy@%r&)PdXxTjXh&9I##@xc#m`RJpMiVOV0k4{HNKJn3o9aEY7p^}W0gE2XL zZ8ZJxop(IZyH78JZ_2`*8oFP;uEC#m47nm{7DQeGkan(W#}nZ`iiQi zcAjYgN)Kq2AllF!Ih8qx8g&X&AO(Ry1q6!rK6~}0Oso6(1`1u+wnqM?e1n}{&!vaE zpJ`>-{4aA+BUD->$9|EEQ6?sq|K9iVG0;UH&vm1@hzS&m=D59&JH_4r+IUf&qaws< zW7;7Q5JSUJt0~c5rVGuyv@IL2?6SeirkH`iDI$>F25%bC7pP`UD4w$JBZXnMuT{*C zcJCRoc7a@*1Il1pk?qPj3-6UgMJ#rn7d<-_tiXoJLYSWv>loqh`fFEDdZeo4*>O}A+A zHf*Z;QiZy@e%xX$%Y9o!_NC*+Nw$9^b>z^7*Y!nX{V8w8>hzQdd)4)n>#vwUO-E^#1P6J|@cyqj%yzm%php z6qyzzkz{?QdF;nQO4(_9znY&V&?$MBCFwHU6cl~Qn2@GvCY&M+3t07ZUK;KaI?_78 zf5Lfr$QTarI1P*>Qam=hs(7Z%f2MiVYr=NL>cyNK2A-&k#Y!i>+Dc^VZ0~F~oiN*j zQp%lmWW}G$rm$uX$-2}?x5(9ux@O&-SaVi*zuJ$Zumny<4VZRJ@f4jH>W?vcP_<7X z75GF|)jS`>7W6ckaz;-9Ob3tVI?$0ob~+kgDXKx+jBp7Xp%USEt&`=x4~bq5w3sEQ z-3v1c(Lsu~3Oe|rbgsILj?00}vJ$CBke5A0JcytAQ{+#@$>+vW>DGyFfBR3ZRD7(v zIFb_2J@I$q_HN%ufn;QCfc=E-UAM@7#F=)!nS^98MEi&aOV5j60S#ip?Lx;#x>jxZ zrQ8#GLk(sSM4fj>0wBtdDatG35Ht+I>E?A=9T#U(7ov=v5Rd7GsKN{(A-LfTq_C?W zvoj)>oyf(w`euYZP5vAs=N!hcoe%m|qJEHt0euxw1jad7-Fk+tAPUTl<}caaeCuC^ zV$tqwZtUlA$K{v|^Fqi#m;NVoDb*{k zBhO56gJ03S!-M2tS_H{4W0Q<|1bnFWO~;?{N<~6rTn>^`*`h)*a#DL_!zW3E1bKX% zic0hBowq;wX!kphK6clxv(Ng>S!an0-}%U$-+uJYyS|L(Pm{K4<6HuAsx5o;YjU+6<@vX`KFqU33;l zs1Tu-BPgmT?+OMi0y=S({%D?}+XR~pr@;-cEacyU$>tTvfu*W-Lcmr;+6e}5W2&a! zCIwPFykUTCj(9X2+dPI|7BuOOq9rHO@gw4ezj^lD#2Z6p?3zR zx-U6*_nBw!*?Hz!XB)4!hcdfjqy9qryj$-2$H(sa;DK~ryy?>)z3c9K?zjs zoy))?Aq#j(10Y`NLl}C(e}MbJls_%#0#WL4%WvBrnTR#)a$?cRQcxR7#r zpE_sHa3x!fuMZs@*>^=c{olu?8iiUSS$^HzITwL%80;TGyas&Z7cN#a8jD)(v_uAL z+m3Qx$`^wU)+r4upb%p5CZQlLZW4kx&PP{Z4hiElm z)m(r4hU<^Ca2?rjizc;`HCgQlPB+;(DbC%n1UO^_I{OeuCatLF(5ckM+KF<_8HGxu zjZj3>uc`|_?|AUjMy%Y$v%)~&lLV}U0Ye5|k}BH#K*Gc!s=9I6rc*VBluF~`YgQgR zZz4CpdH0!x@t+RHyWLCHSF*7t+b+IaOpSIs2lrlhF&k@0+R9H?S?k zDFbxINnIJCJ}Yar!yIASp@tkn7~Ig9)KNp?6NJ@ez%69c8#B~<5aGxJg{JtGLdx@t z2=a>296K$pYX;wStuHw&-YXm8)e{ehJ4+#~K-8r?!`%*BU-yM1J^z01(o4F32A`A> zb)`r+bIDQgb)Cj!Bfg;sNPLkSLka2`=t;j%$z!@}X z;lu?lhCm^?R6XmMb^`TAw$(J#Hf!WL;sl%0v#!@v`NPQE+-YCPX2RXigvEyc{QO8h zQ~5)#Klu4ag7FC36V*lhu5+b|KWG*YhKwRziN@}WyZ@!XiLFEO&Dhh)>6+_ z{L+y3Yw@Y>Cnu8+CWhEnIU!pe>`fOJ(lwl^DcODOA6f~xp2kG$18h@+j?yVv0dM!K zFU}+aoLlKE;pU-U_Ff?OVNMC3fDnY;0-5heU`~tKKr(SqY!zl_Gq{+Lug#>&DW?^L zO-wyLs75uTL<|^m2>Mf4k($D}OTfbjm`F1aVyu^^3u!fSL`X^Ck_jDXkHuY6Pk`^xd*3sP_K&{ zg@k^mpDb3PAEp#YK|l=W8sXfi)PQAsq@X^%rEuCMfA*vb2oyWAYLS{aqv+$-=xY4PxQ`UlN5I}W|| z!0MT;c3_TqOqlOR_K zfTM>{H5uU`Omf^epmgoXj1{*YJhCI*OonU!BB!S|d?3}ZmgO@Xv$@#Y4j#ERl6f%W z)rU@eJsA>%W^;bj@!M$n%U{y=%07)V@Wc0)hm}mOBe6?kvC>ri~?P z)G4U;w0103LSjX*C$1;+ZpCQ?3p@c~s^7q^hPVHskxZBUu6c|@0uKRsjlB&%WKp>3FYGqp{G--JhEId6 zwSlLPROEEQfEXdq9|ev9kd$mTx*2BN3?6@W(98}AfoX2J1vn@*{00@VC*wr;i}C=- zT;ZJhaD==IGRX@g)MgF}$D?*wb>GN&gY^pO(7QQ#hK}KIXy?v&qx)PMFbO7qer90$ zv~*O?i0d2$gEw2cs=xclP>h8_dZ_lz{r%HZ`QS)@G@T?K)S*7R#(s`-DWV#4f-tsC zG;A2`w$LYf)qMal2E!6B2_?uC*(U@x-MBYCD&dgG@xyAEm6P^d$o=~D{AYod=411bd1GX(y z@wsRkp9{H_EaKM6C_>m2WU!)S60l5Mvi6!mK{JRJbix$)^&IcPXh5`L)JwBr;N}7M z0z^!vg47vq+_<-XA69V+%+_fSyg(^Gn7r+oSqY7bumXD74qc5es-t^JJba85ZAo6QDz&=#9 zbzh0XAPSiR3D!;cAeH~KoY_3{Y9b`U|6omGqHA}-=g5`k=GefQe98H8k797m$L`k(8E(xKcgg+u2B!yw0 z3zFMUsd1R`q+V1rQFS1Ox%we>`=meoLfY#~?U@-EnCoYccW>gGGW!!OpMa|QWhI&F z@249hE5Y!G|<9Yv#i6Z>&8qziSMkB{_6(n;|| zWoCfylH?%@ZN&t5wnXu7n)gArJ6gKoo4|IDlI@NP2()=?S@kT>)!|*9a7GAR)3SLK zhVl?NWu-bPo~uexJ5;ttSr6Gz z(IPBo0ilz+5`b8U))qVg0WlIa&%@eN{|~|eb8Huf)QdDUMk^j_V)0``^l)q#i$|Al z370v1c?KBM*92z6W!+;8)kwcV3A(ly$bbK<9pkG6n_{mxd z{-s3WhSTzeq)Z~qM@D_&7gK>i>T9jDt7E~!YbGrQ7h_SCx% zz5dM=_|lpw9K%UyrZBXFpEIc%Cj9f1 zzk%ujxNq{q;CTOz3obf6HIz+Ox-VpX{uB!)heORX*yC%;`5Rt;@hx)ZmRer)hm24k zuh4M}v|PWPeDG`Pp3~TK2zw3!M+mx52g#}=v1inbosz7v;A|WS5u|yIAfo4F5F>hy z&>(@}p5H+1q>Gg5e_}f1uq}d;0Edo z-yQbZF>~xZK*Iw7i%VWNO^x<*$3QV7Tf;3HJ%!9qLJi}vR&Iz?O7C#lWx-6qEN3H? z?(b9nK=Lb@>0G9gVe8_tk-}H1F^CKa?6J}h*Cqz|J! z9!hb4bRARVn?hH-P6Jf~io^LV!8B4t8}>eFaG&ql1(PoeE=JfEg&0)cg7)8DNk*cN z%T#!uR9u$zJRn%5V5&fNu$gMI+9pbf2ueyTKZD(C^2K>596e7u9I98v754XVh0!xc zr@S)eUD4sD{zG(wSuzLY!j5P@)0k*v&RktO-DpDqGI=On8k(OU+RdH{_}+hMN)F}% ziPU&u)futqCvVEe!o_56raZj^^zbeHj%^aJ1Rq}@ATb3lCT|W!)rQ`#k=5L{6-#VKYN(D>8e$zx#uDq+y$^j|{QZkIZk6I||PPg^aWp?in@^o%#|Z?m2KQ-!Iup2U~sM803nJr+z&?QqQIqZ{V_ln59@ z-OuJz{Vc)_w+|;}7Bry>lk^+-^FOe+xPWPxG&v7uONU7@ia4sJWLPL=n=s6AxfoO7 zg`~b9VLB3ld7N8^LO334<&o~?I3oLxV8HS5@S9BdQgh@Fl9;h+2bM6m+D^5 zirzI18x*ssgIM_P7Z5vfp#Fx|76jcN#@YsGZ9J3as#AW!Yzya5U|84U9Eydb+*aUi zl3^GmbS=T1`@FV0g9qOd`k>F_ zeL7!tgjO4!QVe#4Ex9;)Rx09jyKvw2o@n=CHr)LVyRsI<`VB$nHHn$~y+dBIAFQF= zCA0@r+OuC^4^4_?b9>mcY!ADA+#aq}J4V|O5xlCJku)`WxT>^hHx)8-1t9K$&V=7l zK(_-{?_xpjlnlerg(*+AV-58Y+IA?m#Nw{9ln_0i>JOj)L37}xfmGjVwfoF=o5Sk1 z%igT(I+w@$hiZdW19jQ%XRv`x$+!N(VS)peu1=pH@M9Y~oyF{RCgh6uTR{h&Gmm4d zD%T`n6aO3bRl|&}b|30?&|GZn!=)6AgOIdRwc||yWV+td$VpUDpsjN&Yt$2TAopBXtcar#%c+&tlr%c}<=^k*2(lsI#L7pNxbJw|eAKXDiJO5D z8>62(OjniTlt6mGYzfIRdWip!M1nVy<5?AQ!cM8xW>l-4tLwzZ?+4?e@28_afBs8} z(kM%Z_gO>TPky6ck|cvKYWCdt#$v#0*GrOd@I3ar6W?h?US@hQo^I(?>~WKL3-;KD zJN1G#X_ivTeAug%@0G%W{m`s+wVK&4X*8f~)y^MN38iN=z&TQN8I5~W z3y)iviNNc=$d(2)wiEC0$W*?N*O_W9dKb*YJ{rrGd>^>7`^$3Jezh%8VdA+LdVSA)to#9@+Z(?k-Vq8ss=H_N=mj~oj)(C<}dKX}BNjZ0HFMn%umagyiwXEY`XSZ5tS zk5~K2d-#jnW0%^Fqe>mOCyv{bsK;?#s`T@r$$OsvI=@4M{KX;uvqnEV__^Zp42`x2 zae3^H_~1~je)96*g+z75OB(t#a1T66x&-P5+^A(WW~sGbP^zdRM5$ID76FfDD%7&j z_P7BzPm&gC#2~L|Up@oOs!?x`iwy(w1aI>f$}C-=Yj%A8tW~*$G}SfqMbta>Qo=88 zxUw&7n47n(?u&X>`%H<7S#El8%TlgVv1GnSGKc!uL&XrC(nrL!Z6IoKKP&2@Gx}c{ z68^AHx9V^{C8eQO_?caSGph1$akuFP)jzgo%<%s*~YdeBbjwQ6(Oxk9v+OMsRTkXJ#;FaAsNh zsS_5UqxgV$hW2GV)CR|cua$ucWENuT5w}uCMJk5pkYhD4s+9Bix1UOodVymSN+)Mx ztl;~VG_N6%Ni=7-Br4(7lqFUEQ#tIo+7=yRFDL!FEpJW8hPhgKSc=*mo=t8u3npB; zXHs?)5I|)F2S|7YoCeT2X{*F+u4kFW6b?oV&lyUjyBm;M{{)%UKo2q0B9~c|awngx z$}`i*u!E0ay%aQZHmmL0F~tMDfg<`9QfycwVEs31R02jMaJw=90`?z8DsCYfA-0dv z&ki21;B9Dy2jcw$k!VciYj(;r5*NHrc@gt@3xr)QD0wP~^whw`Hez%glHolG32LDd zGVO%#27x(cB=KKJQ*k6!llMTaJ?zouW!7xSHRQ4E-86dcbXB$=IyaD$eRi9{EJlY! zi^IUILpj^f#c#d-W3PyJq|^Fu>9*~tY~Fp&hRAt`O%|^+?1~%rLH?j}L()b1zBKjW zOFk(q_4sxPd|MYD5jvP+fS`7LF~TX>u{vl@7(z5{cU>tXCDxB76nGki8X1W>mA|RB zp;7G(p_u&k3ma6T#xa57DBAswxBGx%{|_%n^fKgfdjNwK29E=w(tu|RZfU?v&4UXb zZy$(Wrl0hBKfSIK9@HBoZ#>aApve(vVLM)Od+5b-|MJW9wraw z`^lD&%e{rt;`nCP6hZ)Ild#S|EIrSDjddo;KY%Ta!hlYYS4IS>kpLNWSf)vBsqmET z$1wisS@M7Ritm5^-_@g+rFOV?$h2ZP+*`5wh~E>xiUz%0bG6d^hrL9GQBStBUqg~y z5DGWXZp?;#-WV>8>qdLLiqnAL=-#rcxP7P)ibuUVuUH&r-|q{Mz~(*=m&*@hPfg(# zjlYq{(D>VIWRt?MfpET2DrrH!oCES3D5SDWSPtNk+MEHP?-)!O{<+?KTH zH4<&&KkI%!!}(Dkh|fNGJc81C9J(n0VO!8RHJ$s$g_TVnNhhLJUDIPAENt})d%bNa z`cZo-Ri>4Y--3&%v4L7ScPhtPCCm>~g5cNyIM!+l1UVU&A8`^W67>n3Y*70%b*{RE z;9%yw>imjttgBmj9j~_bXIuM>3q5A;-Ma3Yyxoh^EVlGK9FIfTN1yPt+KZ-GJrG(^ zzU+?04pfpF)ntLARegam15|}qh8Lpo^U)Xj)pJis7|EgdP=)6``q0tyU*%)c3~f(E z!N6p^=2S`z4B9C|&Mn^omxSx82|AjwlT4%`-ct0lgU2h_B{eF{*z^WW#quSRrBs^p zjQWGkIOq)zy;D5(EzR|SE>S7f6L&2yLm}WwPT~=WX5Gtlhd85z>yUCK+x6YIyC<)- zr1Fmxa)Ar=cH@QzTI@8i4cG%@tiX?ed@HhJC%z}9yIT|RSaf)$x`kct&IU{=z0~!x z-;h7C^!(CG;!~h?TKK#gFI^0&tm3bcgKD&Z@T%D0{cS*C>{;TEy|7g!F;sB$s3KX8 zw_Tv(lP?^imoegmrt>%kj$;xP%{vjm+2sXBKRbB5f{5skpRo#dhf9h?(@Z=`LkvFo zYcKb1As=U{Mw57`X(i!!n8_<{hTMO&8jHTq^UF&u$^0YbWb|(w`OMuzxJay@4ET?{kML6)%^CqnSFSE z+b)ums&91$&M=1R5Om?WNJ~lTDLQx|3|XznPe-tBR4d8a^+)Y{9L^Qii<%ZL1s;6C zp&qGMYWt2VW*7jOqYEZ8w@T?JfQd3IPL3wkn9N>Z&o*VJJX1wQ3MMJ~in!@Sr5=CP z8U;x>%(RQoNfFPGM=#kto@(0t)mNZCu5`!xUOjl^g3--+^V+m${{`&T^vrbL{PnU+ zcA8WR^uBRSGc-t>*Nsd^Up34VU4-$a_5AFLh-bcDJG&v!0CLYyLjy2sPB@0De`OfQ zH;iE(2ocfoArq?%L&9McN4w(wg2UjCCY&6#%nYDdnG9|}m7FC~D0BhxvHJnD5R!A4 zzr6BRYD|T>q|%*B%%~^Ow%?5AoskeXjl+ zW~-kIjgMGIYHLR`r$0M)<%aT_iHo*ZW>luQ>HI67nJOAbSvl2jn_NGTa1}~Zj_B;> zbKm#T*|p%3Z>-z8v&SRbz#}DCi=S4zj;JaCqa@*Z!|;Vf1-QK)(_=uOat%{+lmZ?V zB+XXjQ_ZR>yJ$npCjaS$OH_6VNffnmaC_0PV0Un9kbc68afIYPu0kHL)5EfQy}=ub zK(#`A?j}+RptcRe<0u>%A$J|U>`Ah=5o*Z zU(<_wo!Qg}ubv&T2P(fKy<-;*2CLC!^y*$c|8VzLvvL1dt_cO%iMJQoD}{t8vDJp} zS8cKjcAzQP&mO9{jTVzpkKzQV)eX{r7(R3fg36GUsKI=m{YktNej?4VBtHhzcBo2K zYotJn72!Qa>q?g5u5bx476!>Ba^unOjS6wag^DZ0WvE)%hli-f)cOM`L_=K^1BgFU zVhP#6>}b1yid7-VlSe*^NTHj8xBc5uBedWP$N8)9~dlflzC4)MF2nf{CBz1p!jEy=41_GPL>7ZOD!-zD5et(5#Oj11%Vfo zdq!ipdti`WsDPq3fgp+)cnf%o2XYH7@y-2iz`nQMZ4bnCVN3VvTE+T4|M^?;o<8xG zPl#b}U!m(9a0Wag4qMVE3ZgWyMSq97r-P9FC$OhFVmVYnL~c}snn`&Vvuci@GO9Q5 zuLyfuyBbr{i|43U!zaOzQVNCR?JShzmfw7g@3Shk>$otmN~}jQ)XxgdXs4fGhy`o| z4+$29Z!e&&l>&g;FBkXaR(oCgF|wo9ek1=A(&Ge?cndy6C0GQ z!|w10@-?e1n?o>1y@=XRSSzpnCXrn!BF&>jc)e|eMm&0n_*$w*Z_;Unsp_Oh-cxNf z0jHXrV|~jbz9pS|)DLV-r(;Lz+Vjr2y4*CO{oCz}`5kt>m7TX`s=Th8le}z$xHUv- z*kEyF`}(^-zvRf?b)$D4jk^LaC~MK=vV^T!L-%uojk!!^V|BfO8Tj4YgtKbntU|(e z@_*2d7bHhli%*lI3ogV!I?{7T|K*j>s;6UA{WC-lJg{~t%tG{F%a1t2k)38VX$=~@ z!A0vUflc2|hPvl5%jgl`4eAck95aGgQMRS zGfM^|Vj~8O$~AN^WM{9*QCLbJN_6+LOZsF#7>D2IrJqAa-3r?C+@MVH5@^6M7gHUx z4cL3USDY0a#5s9Yd=cmLa)UXVhU!)azEMh0a{z4zXCcKY_NZQ5P+ zUO*KP2vLLt2u$yoVw#O{!8W!Nn`CBo1OXQWIC0`QE{Ty#iXA84#KZ;>JH#gWGWtE| zy))7ZC%@0ve~e~kmt^nzo_@~r9A(OH7<|;~jNt(-3$L}?IR`wFRA;w&pZl`Yfz7){ zsmWIDJ%s;P5jzF=CW|fd*cTk2d8bkZWNWEogEO>uR-BU)9|Ci7`h3$A#F|o2$%)^E z@L&L0bYM%vx4pe2s)Wi2o7BiafD)%(e(i?0_laMF-&Lhn;z#<19YW_mwd}CFVUL{b z)kUu_4}bFQCVpE}&ls1JnFM~CVy|g>ZQ^x>l%@Kym#~Td8!NuUehC+uDQv5DCz5uD z)0OJR3mv(Gnfl*<*iqJ4H=XLBj6{va#-~ofNGz}@^a5{>RNFr-X0*eLI$Qco&Lh$2 zJi7Rkq3GA_PUqkH1goLXp@%J!1d>1Cbtwz(L#8t;EUE17LeC$^O&a`6ZS%K(eLyu1 z-rlqSh4bGH`Eo z0jh!3q>5~)!t*`BYBXpzDKr9T!~do2d$zjR6E~YI)wY8Fsc@M>ZPvMTZi(z8`uCsH z8B>9<?I(Z3xsl{xh<*&au{RkDFW}?#VzJ>AG4Cdn8X z#a$Q+E=veVv@rHe=&|#srPe#6)E*Y6;>c7aOfRArX2r4%S|M9^!bf1_m7#_31mqPk z%iVDfG~DAD6&%bnNT@R1=`f+MbgNWr0d2gtR`n+x6YDFz)h+joP3km~VFfSSCJT9M z`wBsKe(!KfVbpo#>Zx?fwSCvvV0rP=mk#tw6j)H-emSP&hrOX&A4r5#ho2;!7ckTC zE;zBi1iz2~6RMaSf#-*&M?;uw5RsEux{azH0usKSB(j7?9Or<>3&Axs<~M2Vvf)P_ zv&<hj~`jvvl)3THSEv>LuBwm96FC z#6^$Kr+3_I#C7lL3&n%E^<}?she@TEwQt%mHC0~x`2MI#%D>wO;LiK^&+gytP4;X$ zb|gqW3(k+{`UBi;5S;Z*J;|Da$yx{b+~lk@8^D2Mr!%b8km8vzgHFJIhw05`fRTO# zKzPB1U;!tB_P#o91GRj!CuhQHtw3x4F3s%X#&z=HXfL}^a3eaVfY1UC=F zcgC~~WQvmIe=!CSyHM!uUE2fsz*=P%7F8v*1VlVj$p3e>>&7h(U1_OQ=-YAssLwCY z8f>Y>1=(b9T%*wWCJVW}BSCj==im|bH7=`fXm$T^W$x3Lc>C+wILlZ=N(8P#T?CvS}gWBwsmBG2~ zAD)h79=Xb^E@gs4e^6bQaVspw_{FZn+EV|*@Z96OqrvfmMrqQXDg++Z#iMDj-eli5 zN%gA3XAArnh0h}g`wI@r+F{UX%4k6Y7HWxuAW8r@2~^h5fKG(w`^7QU?$&M$ezEK< zgJC!Jm`w>W2_d7ye~xK?B9*h6xGm`2d6^o~0`G3`ZsdjE43LD?H3+p7$WdLVsi zSvMFSH3+O?#^q=%MA>gc0njg1MKmE1^vfcnh8J?PtTKg(wGBmdMYm*5tF?ieBDfs` z2(YA9fnD6)@VZ*G�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%0D2{%1i_H;!KY(<_@W(8ktU& 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

    5$dW!XBOHR| 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 z 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 S`@nMZ%* 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